[
  {
    "path": ".editorconfig",
    "content": "[*]\ncharset = utf-8\nend_of_line = lf\nindent_size = 4\nindent_style = space\ninsert_final_newline = false\nmax_line_length = 120\ntab_width = 4\nij_continuation_indent_size = 8\nij_formatter_off_tag = @formatter:off\nij_formatter_on_tag = @formatter:on\nij_formatter_tags_enabled = true\nij_smart_tabs = false\nij_visual_guides = none\nij_wrap_on_typing = false\n\n[*.java]\nij_java_align_consecutive_assignments = false\nij_java_align_consecutive_variable_declarations = false\nij_java_align_group_field_declarations = false\nij_java_align_multiline_annotation_parameters = false\nij_java_align_multiline_array_initializer_expression = false\nij_java_align_multiline_assignment = false\nij_java_align_multiline_binary_operation = false\nij_java_align_multiline_chained_methods = false\nij_java_align_multiline_extends_list = false\nij_java_align_multiline_for = true\nij_java_align_multiline_method_parentheses = false\nij_java_align_multiline_parameters = true\nij_java_align_multiline_parameters_in_calls = false\nij_java_align_multiline_parenthesized_expression = false\nij_java_align_multiline_records = true\nij_java_align_multiline_resources = true\nij_java_align_multiline_ternary_operation = false\nij_java_align_multiline_text_blocks = false\nij_java_align_multiline_throws_list = false\nij_java_align_subsequent_simple_methods = false\nij_java_align_throws_keyword = false\nij_java_annotation_parameter_wrap = off\nij_java_array_initializer_new_line_after_left_brace = false\nij_java_array_initializer_right_brace_on_new_line = false\nij_java_array_initializer_wrap = off\nij_java_assert_statement_colon_on_next_line = false\nij_java_assert_statement_wrap = off\nij_java_assignment_wrap = off\nij_java_binary_operation_sign_on_next_line = false\nij_java_binary_operation_wrap = off\nij_java_blank_lines_after_anonymous_class_header = 0\nij_java_blank_lines_after_class_header = 0\nij_java_blank_lines_after_imports = 1\nij_java_blank_lines_after_package = 1\nij_java_blank_lines_around_class = 1\nij_java_blank_lines_around_field = 0\nij_java_blank_lines_around_field_in_interface = 0\nij_java_blank_lines_around_initializer = 1\nij_java_blank_lines_around_method = 1\nij_java_blank_lines_around_method_in_interface = 1\nij_java_blank_lines_before_class_end = 0\nij_java_blank_lines_before_imports = 1\nij_java_blank_lines_before_method_body = 0\nij_java_blank_lines_before_package = 0\nij_java_block_brace_style = end_of_line\nij_java_block_comment_at_first_column = true\nij_java_builder_methods = none\nij_java_call_parameters_new_line_after_left_paren = false\nij_java_call_parameters_right_paren_on_new_line = false\nij_java_call_parameters_wrap = off\nij_java_case_statement_on_separate_line = true\nij_java_catch_on_new_line = false\nij_java_class_annotation_wrap = split_into_lines\nij_java_class_brace_style = end_of_line\nij_java_class_count_to_use_import_on_demand = 5\nij_java_class_names_in_javadoc = 1\nij_java_do_not_indent_top_level_class_members = false\nij_java_do_not_wrap_after_single_annotation = false\nij_java_do_while_brace_force = never\nij_java_doc_add_blank_line_after_description = true\nij_java_doc_add_blank_line_after_param_comments = false\nij_java_doc_add_blank_line_after_return = false\nij_java_doc_add_p_tag_on_empty_lines = true\nij_java_doc_align_exception_comments = true\nij_java_doc_align_param_comments = true\nij_java_doc_do_not_wrap_if_one_line = false\nij_java_doc_enable_formatting = true\nij_java_doc_enable_leading_asterisks = true\nij_java_doc_indent_on_continuation = false\nij_java_doc_keep_empty_lines = true\nij_java_doc_keep_empty_parameter_tag = true\nij_java_doc_keep_empty_return_tag = true\nij_java_doc_keep_empty_throws_tag = true\nij_java_doc_keep_invalid_tags = true\nij_java_doc_param_description_on_new_line = false\nij_java_doc_preserve_line_breaks = false\nij_java_doc_use_throws_not_exception_tag = true\nij_java_else_on_new_line = false\nij_java_entity_dd_suffix = EJB\nij_java_entity_eb_suffix = Bean\nij_java_entity_hi_suffix = Home\nij_java_entity_lhi_prefix = Local\nij_java_entity_lhi_suffix = Home\nij_java_entity_li_prefix = Local\nij_java_entity_pk_class = java.lang.String\nij_java_entity_vo_suffix = VO\nij_java_enum_constants_wrap = off\nij_java_extends_keyword_wrap = off\nij_java_extends_list_wrap = off\nij_java_field_annotation_wrap = split_into_lines\nij_java_finally_on_new_line = false\nij_java_for_brace_force = never\nij_java_for_statement_new_line_after_left_paren = false\nij_java_for_statement_right_paren_on_new_line = false\nij_java_for_statement_wrap = off\nij_java_generate_final_locals = false\nij_java_generate_final_parameters = false\nij_java_if_brace_force = never\nij_java_imports_layout = *, |, javax.**, java.**, |, $*\nij_java_indent_case_from_switch = true\nij_java_insert_inner_class_imports = false\nij_java_insert_override_annotation = true\nij_java_keep_blank_lines_before_right_brace = 2\nij_java_keep_blank_lines_between_package_declaration_and_header = 2\nij_java_keep_blank_lines_in_code = 2\nij_java_keep_blank_lines_in_declarations = 2\nij_java_keep_builder_methods_indents = false\nij_java_keep_control_statement_in_one_line = true\nij_java_keep_first_column_comment = true\nij_java_keep_indents_on_empty_lines = false\nij_java_keep_line_breaks = true\nij_java_keep_multiple_expressions_in_one_line = false\nij_java_keep_simple_blocks_in_one_line = false\nij_java_keep_simple_classes_in_one_line = false\nij_java_keep_simple_lambdas_in_one_line = false\nij_java_keep_simple_methods_in_one_line = false\nij_java_label_indent_absolute = false\nij_java_label_indent_size = 0\nij_java_lambda_brace_style = end_of_line\nij_java_layout_static_imports_separately = true\nij_java_line_comment_add_space = false\nij_java_line_comment_at_first_column = true\nij_java_message_dd_suffix = EJB\nij_java_message_eb_suffix = Bean\nij_java_method_annotation_wrap = split_into_lines\nij_java_method_brace_style = end_of_line\nij_java_method_call_chain_wrap = off\nij_java_method_parameters_new_line_after_left_paren = false\nij_java_method_parameters_right_paren_on_new_line = false\nij_java_method_parameters_wrap = off\nij_java_modifier_list_wrap = false\nij_java_names_count_to_use_import_on_demand = 3\nij_java_new_line_after_lparen_in_record_header = false\nij_java_packages_to_use_import_on_demand = java.awt.*, javax.swing.*\nij_java_parameter_annotation_wrap = off\nij_java_parentheses_expression_new_line_after_left_paren = false\nij_java_parentheses_expression_right_paren_on_new_line = false\nij_java_place_assignment_sign_on_next_line = false\nij_java_prefer_longer_names = true\nij_java_prefer_parameters_wrap = false\nij_java_record_components_wrap = normal\nij_java_repeat_synchronized = true\nij_java_replace_instanceof_and_cast = false\nij_java_replace_null_check = true\nij_java_replace_sum_lambda_with_method_ref = true\nij_java_resource_list_new_line_after_left_paren = false\nij_java_resource_list_right_paren_on_new_line = false\nij_java_resource_list_wrap = off\nij_java_rparen_on_new_line_in_record_header = false\nij_java_session_dd_suffix = EJB\nij_java_session_eb_suffix = Bean\nij_java_session_hi_suffix = Home\nij_java_session_lhi_prefix = Local\nij_java_session_lhi_suffix = Home\nij_java_session_li_prefix = Local\nij_java_session_si_suffix = Service\nij_java_space_after_closing_angle_bracket_in_type_argument = false\nij_java_space_after_colon = true\nij_java_space_after_comma = true\nij_java_space_after_comma_in_type_arguments = true\nij_java_space_after_for_semicolon = true\nij_java_space_after_quest = true\nij_java_space_after_type_cast = true\nij_java_space_before_annotation_array_initializer_left_brace = false\nij_java_space_before_annotation_parameter_list = false\nij_java_space_before_array_initializer_left_brace = false\nij_java_space_before_catch_keyword = true\nij_java_space_before_catch_left_brace = true\nij_java_space_before_catch_parentheses = true\nij_java_space_before_class_left_brace = true\nij_java_space_before_colon = true\nij_java_space_before_colon_in_foreach = true\nij_java_space_before_comma = false\nij_java_space_before_do_left_brace = true\nij_java_space_before_else_keyword = true\nij_java_space_before_else_left_brace = true\nij_java_space_before_finally_keyword = true\nij_java_space_before_finally_left_brace = true\nij_java_space_before_for_left_brace = true\nij_java_space_before_for_parentheses = true\nij_java_space_before_for_semicolon = false\nij_java_space_before_if_left_brace = true\nij_java_space_before_if_parentheses = true\nij_java_space_before_method_call_parentheses = false\nij_java_space_before_method_left_brace = true\nij_java_space_before_method_parentheses = false\nij_java_space_before_opening_angle_bracket_in_type_parameter = false\nij_java_space_before_quest = true\nij_java_space_before_switch_left_brace = true\nij_java_space_before_switch_parentheses = true\nij_java_space_before_synchronized_left_brace = true\nij_java_space_before_synchronized_parentheses = true\nij_java_space_before_try_left_brace = true\nij_java_space_before_try_parentheses = true\nij_java_space_before_type_parameter_list = false\nij_java_space_before_while_keyword = true\nij_java_space_before_while_left_brace = true\nij_java_space_before_while_parentheses = true\nij_java_space_inside_one_line_enum_braces = false\nij_java_space_within_empty_array_initializer_braces = false\nij_java_space_within_empty_method_call_parentheses = false\nij_java_space_within_empty_method_parentheses = false\nij_java_spaces_around_additive_operators = true\nij_java_spaces_around_assignment_operators = true\nij_java_spaces_around_bitwise_operators = true\nij_java_spaces_around_equality_operators = true\nij_java_spaces_around_lambda_arrow = true\nij_java_spaces_around_logical_operators = true\nij_java_spaces_around_method_ref_dbl_colon = false\nij_java_spaces_around_multiplicative_operators = true\nij_java_spaces_around_relational_operators = true\nij_java_spaces_around_shift_operators = true\nij_java_spaces_around_type_bounds_in_type_parameters = true\nij_java_spaces_around_unary_operator = false\nij_java_spaces_within_angle_brackets = false\nij_java_spaces_within_annotation_parentheses = false\nij_java_spaces_within_array_initializer_braces = false\nij_java_spaces_within_braces = false\nij_java_spaces_within_brackets = false\nij_java_spaces_within_cast_parentheses = false\nij_java_spaces_within_catch_parentheses = false\nij_java_spaces_within_for_parentheses = false\nij_java_spaces_within_if_parentheses = false\nij_java_spaces_within_method_call_parentheses = false\nij_java_spaces_within_method_parentheses = false\nij_java_spaces_within_parentheses = false\nij_java_spaces_within_record_header = false\nij_java_spaces_within_switch_parentheses = false\nij_java_spaces_within_synchronized_parentheses = false\nij_java_spaces_within_try_parentheses = false\nij_java_spaces_within_while_parentheses = false\nij_java_special_else_if_treatment = true\nij_java_subclass_name_suffix = Impl\nij_java_ternary_operation_signs_on_next_line = false\nij_java_ternary_operation_wrap = off\nij_java_test_name_suffix = Test\nij_java_throws_keyword_wrap = off\nij_java_throws_list_wrap = off\nij_java_use_external_annotations = false\nij_java_use_fq_class_names = false\nij_java_use_relative_indents = false\nij_java_use_single_class_imports = true\nij_java_variable_annotation_wrap = off\nij_java_visibility = public\nij_java_while_brace_force = never\nij_java_while_on_new_line = false\nij_java_wrap_comments = false\nij_java_wrap_first_method_in_call_chain = false\nij_java_wrap_long_lines = false\n\n\n[.editorconfig]\nij_editorconfig_align_group_field_declarations = false\nij_editorconfig_space_after_colon = false\nij_editorconfig_space_after_comma = true\nij_editorconfig_space_before_colon = false\nij_editorconfig_space_before_comma = false\nij_editorconfig_spaces_around_assignment_operators = true\n\n[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.pom,*.qrc,*.rng,*.tld,*.wadl,*.wsdd,*.wsdl,*.xjb,*.xml,*.xsd,*.xsl,*.xslt,*.xul}]\nij_xml_align_attributes = true\nij_xml_align_text = false\nij_xml_attribute_wrap = normal\nij_xml_block_comment_at_first_column = true\nij_xml_keep_blank_lines = 2\nij_xml_keep_indents_on_empty_lines = false\nij_xml_keep_line_breaks = true\nij_xml_keep_line_breaks_in_text = true\nij_xml_keep_whitespaces = false\nij_xml_keep_whitespaces_around_cdata = preserve\nij_xml_keep_whitespaces_inside_cdata = false\nij_xml_line_comment_at_first_column = true\nij_xml_space_after_tag_name = false\nij_xml_space_around_equals_in_attribute = false\nij_xml_space_inside_empty_tag = false\nij_xml_text_wrap = normal\nij_xml_use_custom_settings = false\n\n[{*.bash,*.sh,*.zsh}]\nindent_size = 2\ntab_width = 2\nij_shell_binary_ops_start_line = false\nij_shell_keep_column_alignment_padding = false\nij_shell_minify_program = false\nij_shell_redirect_followed_by_space = false\nij_shell_switch_cases_indented = false\nij_shell_use_unix_line_separator = true\n\n[{*.kt,*.kts}]\nij_kotlin_align_in_columns_case_branch = false\nij_kotlin_align_multiline_binary_operation = false\nij_kotlin_align_multiline_extends_list = false\nij_kotlin_align_multiline_method_parentheses = false\nij_kotlin_align_multiline_parameters = true\nij_kotlin_align_multiline_parameters_in_calls = false\nij_kotlin_allow_trailing_comma = true\nij_kotlin_allow_trailing_comma_on_call_site = false\nij_kotlin_assignment_wrap = normal\nij_kotlin_blank_lines_after_class_header = 0\nij_kotlin_blank_lines_around_block_when_branches = 0\nij_kotlin_blank_lines_before_declaration_with_comment_or_annotation_on_separate_line = 1\nij_kotlin_block_comment_at_first_column = true\nij_kotlin_call_parameters_new_line_after_left_paren = true\nij_kotlin_call_parameters_right_paren_on_new_line = true\nij_kotlin_call_parameters_wrap = on_every_item\nij_kotlin_catch_on_new_line = false\nij_kotlin_class_annotation_wrap = split_into_lines\nij_kotlin_code_style_defaults = KOTLIN_OFFICIAL\nij_kotlin_continuation_indent_for_chained_calls = false\nij_kotlin_continuation_indent_for_expression_bodies = false\nij_kotlin_continuation_indent_in_argument_lists = false\nij_kotlin_continuation_indent_in_elvis = false\nij_kotlin_continuation_indent_in_if_conditions = false\nij_kotlin_continuation_indent_in_parameter_lists = false\nij_kotlin_continuation_indent_in_supertype_lists = false\nij_kotlin_else_on_new_line = false\nij_kotlin_enum_constants_wrap = off\nij_kotlin_extends_list_wrap = normal\nij_kotlin_field_annotation_wrap = split_into_lines\nij_kotlin_finally_on_new_line = false\nij_kotlin_if_rparen_on_new_line = true\nij_kotlin_import_nested_classes = false\nij_kotlin_imports_layout = *, java.**, javax.**, kotlin.**, ^\nij_kotlin_insert_whitespaces_in_simple_one_line_method = true\nij_kotlin_keep_blank_lines_before_right_brace = 2\nij_kotlin_keep_blank_lines_in_code = 2\nij_kotlin_keep_blank_lines_in_declarations = 2\nij_kotlin_keep_first_column_comment = true\nij_kotlin_keep_indents_on_empty_lines = false\nij_kotlin_keep_line_breaks = true\nij_kotlin_lbrace_on_next_line = false\nij_kotlin_line_comment_add_space = false\nij_kotlin_line_comment_at_first_column = true\nij_kotlin_method_annotation_wrap = split_into_lines\nij_kotlin_method_call_chain_wrap = normal\nij_kotlin_method_parameters_new_line_after_left_paren = true\nij_kotlin_method_parameters_right_paren_on_new_line = true\nij_kotlin_method_parameters_wrap = on_every_item\nij_kotlin_name_count_to_use_star_import = 5\nij_kotlin_name_count_to_use_star_import_for_members = 3\nij_kotlin_packages_to_use_import_on_demand = java.util.*, kotlinx.android.synthetic.**, io.ktor.**\nij_kotlin_parameter_annotation_wrap = off\nij_kotlin_space_after_comma = true\nij_kotlin_space_after_extend_colon = true\nij_kotlin_space_after_type_colon = true\nij_kotlin_space_before_catch_parentheses = true\nij_kotlin_space_before_comma = false\nij_kotlin_space_before_extend_colon = true\nij_kotlin_space_before_for_parentheses = true\nij_kotlin_space_before_if_parentheses = true\nij_kotlin_space_before_lambda_arrow = true\nij_kotlin_space_before_type_colon = false\nij_kotlin_space_before_when_parentheses = true\nij_kotlin_space_before_while_parentheses = true\nij_kotlin_spaces_around_additive_operators = true\nij_kotlin_spaces_around_assignment_operators = true\nij_kotlin_spaces_around_equality_operators = true\nij_kotlin_spaces_around_function_type_arrow = true\nij_kotlin_spaces_around_logical_operators = true\nij_kotlin_spaces_around_multiplicative_operators = true\nij_kotlin_spaces_around_range = false\nij_kotlin_spaces_around_relational_operators = true\nij_kotlin_spaces_around_unary_operator = false\nij_kotlin_spaces_around_when_arrow = true\nij_kotlin_variable_annotation_wrap = off\nij_kotlin_while_on_new_line = false\nij_kotlin_wrap_elvis_expressions = 1\nij_kotlin_wrap_expression_body_functions = 1\nij_kotlin_wrap_first_method_in_call_chain = false\n\n[{*.cjs,*.js}]\nij_continuation_indent_size = 4\nij_javascript_align_imports = false\nij_javascript_align_multiline_array_initializer_expression = false\nij_javascript_align_multiline_binary_operation = false\nij_javascript_align_multiline_chained_methods = false\nij_javascript_align_multiline_extends_list = false\nij_javascript_align_multiline_for = true\nij_javascript_align_multiline_parameters = true\nij_javascript_align_multiline_parameters_in_calls = false\nij_javascript_align_multiline_ternary_operation = false\nij_javascript_align_object_properties = 0\nij_javascript_align_union_types = false\nij_javascript_align_var_statements = 0\nij_javascript_array_initializer_new_line_after_left_brace = false\nij_javascript_array_initializer_right_brace_on_new_line = false\nij_javascript_array_initializer_wrap = off\nij_javascript_assignment_wrap = off\nij_javascript_binary_operation_sign_on_next_line = false\nij_javascript_binary_operation_wrap = off\nij_javascript_blacklist_imports = rxjs/Rx, node_modules/**, **/node_modules/**, @angular/material, @angular/material/typings/**\nij_javascript_blank_lines_after_imports = 1\nij_javascript_blank_lines_around_class = 1\nij_javascript_blank_lines_around_field = 0\nij_javascript_blank_lines_around_function = 1\nij_javascript_blank_lines_around_method = 1\nij_javascript_block_brace_style = end_of_line\nij_javascript_call_parameters_new_line_after_left_paren = false\nij_javascript_call_parameters_right_paren_on_new_line = false\nij_javascript_call_parameters_wrap = off\nij_javascript_catch_on_new_line = false\nij_javascript_chained_call_dot_on_new_line = true\nij_javascript_class_brace_style = end_of_line\nij_javascript_comma_on_new_line = false\nij_javascript_do_while_brace_force = never\nij_javascript_else_on_new_line = false\nij_javascript_enforce_trailing_comma = keep\nij_javascript_extends_keyword_wrap = off\nij_javascript_extends_list_wrap = off\nij_javascript_field_prefix = _\nij_javascript_file_name_style = relaxed\nij_javascript_finally_on_new_line = false\nij_javascript_for_brace_force = never\nij_javascript_for_statement_new_line_after_left_paren = false\nij_javascript_for_statement_right_paren_on_new_line = false\nij_javascript_for_statement_wrap = off\nij_javascript_force_quote_style = false\nij_javascript_force_semicolon_style = false\nij_javascript_function_expression_brace_style = end_of_line\nij_javascript_if_brace_force = never\nij_javascript_import_merge_members = global\nij_javascript_import_prefer_absolute_path = global\nij_javascript_import_sort_members = true\nij_javascript_import_sort_module_name = false\nij_javascript_import_use_node_resolution = true\nij_javascript_imports_wrap = on_every_item\nij_javascript_indent_case_from_switch = true\nij_javascript_indent_chained_calls = true\nij_javascript_indent_package_children = 0\nij_javascript_jsx_attribute_value = braces\nij_javascript_keep_blank_lines_in_code = 2\nij_javascript_keep_first_column_comment = true\nij_javascript_keep_indents_on_empty_lines = false\nij_javascript_keep_line_breaks = true\nij_javascript_keep_simple_blocks_in_one_line = false\nij_javascript_keep_simple_methods_in_one_line = false\nij_javascript_line_comment_add_space = true\nij_javascript_line_comment_at_first_column = false\nij_javascript_method_brace_style = end_of_line\nij_javascript_method_call_chain_wrap = off\nij_javascript_method_parameters_new_line_after_left_paren = false\nij_javascript_method_parameters_right_paren_on_new_line = false\nij_javascript_method_parameters_wrap = off\nij_javascript_object_literal_wrap = on_every_item\nij_javascript_parentheses_expression_new_line_after_left_paren = false\nij_javascript_parentheses_expression_right_paren_on_new_line = false\nij_javascript_place_assignment_sign_on_next_line = false\nij_javascript_prefer_as_type_cast = false\nij_javascript_prefer_explicit_types_function_expression_returns = false\nij_javascript_prefer_explicit_types_function_returns = false\nij_javascript_prefer_explicit_types_vars_fields = false\nij_javascript_prefer_parameters_wrap = false\nij_javascript_reformat_c_style_comments = false\nij_javascript_space_after_colon = true\nij_javascript_space_after_comma = true\nij_javascript_space_after_dots_in_rest_parameter = false\nij_javascript_space_after_generator_mult = true\nij_javascript_space_after_property_colon = true\nij_javascript_space_after_quest = true\nij_javascript_space_after_type_colon = true\nij_javascript_space_after_unary_not = false\nij_javascript_space_before_async_arrow_lparen = true\nij_javascript_space_before_catch_keyword = true\nij_javascript_space_before_catch_left_brace = true\nij_javascript_space_before_catch_parentheses = true\nij_javascript_space_before_class_lbrace = true\nij_javascript_space_before_class_left_brace = true\nij_javascript_space_before_colon = true\nij_javascript_space_before_comma = false\nij_javascript_space_before_do_left_brace = true\nij_javascript_space_before_else_keyword = true\nij_javascript_space_before_else_left_brace = true\nij_javascript_space_before_finally_keyword = true\nij_javascript_space_before_finally_left_brace = true\nij_javascript_space_before_for_left_brace = true\nij_javascript_space_before_for_parentheses = true\nij_javascript_space_before_for_semicolon = false\nij_javascript_space_before_function_left_parenth = true\nij_javascript_space_before_generator_mult = false\nij_javascript_space_before_if_left_brace = true\nij_javascript_space_before_if_parentheses = true\nij_javascript_space_before_method_call_parentheses = false\nij_javascript_space_before_method_left_brace = true\nij_javascript_space_before_method_parentheses = false\nij_javascript_space_before_property_colon = false\nij_javascript_space_before_quest = true\nij_javascript_space_before_switch_left_brace = true\nij_javascript_space_before_switch_parentheses = true\nij_javascript_space_before_try_left_brace = true\nij_javascript_space_before_type_colon = false\nij_javascript_space_before_unary_not = false\nij_javascript_space_before_while_keyword = true\nij_javascript_space_before_while_left_brace = true\nij_javascript_space_before_while_parentheses = true\nij_javascript_spaces_around_additive_operators = true\nij_javascript_spaces_around_arrow_function_operator = true\nij_javascript_spaces_around_assignment_operators = true\nij_javascript_spaces_around_bitwise_operators = true\nij_javascript_spaces_around_equality_operators = true\nij_javascript_spaces_around_logical_operators = true\nij_javascript_spaces_around_multiplicative_operators = true\nij_javascript_spaces_around_relational_operators = true\nij_javascript_spaces_around_shift_operators = true\nij_javascript_spaces_around_unary_operator = false\nij_javascript_spaces_within_array_initializer_brackets = false\nij_javascript_spaces_within_brackets = false\nij_javascript_spaces_within_catch_parentheses = false\nij_javascript_spaces_within_for_parentheses = false\nij_javascript_spaces_within_if_parentheses = false\nij_javascript_spaces_within_imports = false\nij_javascript_spaces_within_interpolation_expressions = false\nij_javascript_spaces_within_method_call_parentheses = false\nij_javascript_spaces_within_method_parentheses = false\nij_javascript_spaces_within_object_literal_braces = false\nij_javascript_spaces_within_object_type_braces = true\nij_javascript_spaces_within_parentheses = false\nij_javascript_spaces_within_switch_parentheses = false\nij_javascript_spaces_within_type_assertion = false\nij_javascript_spaces_within_union_types = true\nij_javascript_spaces_within_while_parentheses = false\nij_javascript_special_else_if_treatment = true\nij_javascript_ternary_operation_signs_on_next_line = false\nij_javascript_ternary_operation_wrap = off\nij_javascript_union_types_wrap = on_every_item\nij_javascript_use_chained_calls_group_indents = false\nij_javascript_use_double_quotes = true\nij_javascript_use_path_mapping = always\nij_javascript_use_public_modifier = false\nij_javascript_use_semicolon_after_statement = true\nij_javascript_var_declaration_wrap = normal\nij_javascript_while_brace_force = never\nij_javascript_while_on_new_line = false\nij_javascript_wrap_comments = false\n\n[{*.ft,*.vm,*.vsl}]\nij_vtl_keep_indents_on_empty_lines = false\n\n[{*.gant,*.gradle,*.groovy,*.gson,*.gy}]\nij_groovy_align_group_field_declarations = false\nij_groovy_align_multiline_array_initializer_expression = false\nij_groovy_align_multiline_assignment = false\nij_groovy_align_multiline_binary_operation = false\nij_groovy_align_multiline_chained_methods = false\nij_groovy_align_multiline_extends_list = false\nij_groovy_align_multiline_for = true\nij_groovy_align_multiline_list_or_map = true\nij_groovy_align_multiline_method_parentheses = false\nij_groovy_align_multiline_parameters = true\nij_groovy_align_multiline_parameters_in_calls = false\nij_groovy_align_multiline_resources = true\nij_groovy_align_multiline_ternary_operation = false\nij_groovy_align_multiline_throws_list = false\nij_groovy_align_named_args_in_map = true\nij_groovy_align_throws_keyword = false\nij_groovy_array_initializer_new_line_after_left_brace = false\nij_groovy_array_initializer_right_brace_on_new_line = false\nij_groovy_array_initializer_wrap = off\nij_groovy_assert_statement_wrap = off\nij_groovy_assignment_wrap = off\nij_groovy_binary_operation_wrap = off\nij_groovy_blank_lines_after_class_header = 0\nij_groovy_blank_lines_after_imports = 1\nij_groovy_blank_lines_after_package = 1\nij_groovy_blank_lines_around_class = 1\nij_groovy_blank_lines_around_field = 0\nij_groovy_blank_lines_around_field_in_interface = 0\nij_groovy_blank_lines_around_method = 1\nij_groovy_blank_lines_around_method_in_interface = 1\nij_groovy_blank_lines_before_imports = 1\nij_groovy_blank_lines_before_method_body = 0\nij_groovy_blank_lines_before_package = 0\nij_groovy_block_brace_style = end_of_line\nij_groovy_block_comment_at_first_column = true\nij_groovy_call_parameters_new_line_after_left_paren = false\nij_groovy_call_parameters_right_paren_on_new_line = false\nij_groovy_call_parameters_wrap = off\nij_groovy_catch_on_new_line = false\nij_groovy_class_annotation_wrap = split_into_lines\nij_groovy_class_brace_style = end_of_line\nij_groovy_class_count_to_use_import_on_demand = 5\nij_groovy_do_while_brace_force = never\nij_groovy_else_on_new_line = false\nij_groovy_enum_constants_wrap = off\nij_groovy_extends_keyword_wrap = off\nij_groovy_extends_list_wrap = off\nij_groovy_field_annotation_wrap = split_into_lines\nij_groovy_finally_on_new_line = false\nij_groovy_for_brace_force = never\nij_groovy_for_statement_new_line_after_left_paren = false\nij_groovy_for_statement_right_paren_on_new_line = false\nij_groovy_for_statement_wrap = off\nij_groovy_if_brace_force = never\nij_groovy_import_annotation_wrap = 2\nij_groovy_imports_layout = *, |, javax.**, java.**, |, $*\nij_groovy_indent_case_from_switch = true\nij_groovy_indent_label_blocks = true\nij_groovy_insert_inner_class_imports = false\nij_groovy_keep_blank_lines_before_right_brace = 2\nij_groovy_keep_blank_lines_in_code = 2\nij_groovy_keep_blank_lines_in_declarations = 2\nij_groovy_keep_control_statement_in_one_line = true\nij_groovy_keep_first_column_comment = true\nij_groovy_keep_indents_on_empty_lines = false\nij_groovy_keep_line_breaks = true\nij_groovy_keep_multiple_expressions_in_one_line = false\nij_groovy_keep_simple_blocks_in_one_line = false\nij_groovy_keep_simple_classes_in_one_line = true\nij_groovy_keep_simple_lambdas_in_one_line = true\nij_groovy_keep_simple_methods_in_one_line = true\nij_groovy_label_indent_absolute = false\nij_groovy_label_indent_size = 0\nij_groovy_lambda_brace_style = end_of_line\nij_groovy_layout_static_imports_separately = true\nij_groovy_line_comment_add_space = false\nij_groovy_line_comment_at_first_column = true\nij_groovy_method_annotation_wrap = split_into_lines\nij_groovy_method_brace_style = end_of_line\nij_groovy_method_call_chain_wrap = off\nij_groovy_method_parameters_new_line_after_left_paren = false\nij_groovy_method_parameters_right_paren_on_new_line = false\nij_groovy_method_parameters_wrap = off\nij_groovy_modifier_list_wrap = false\nij_groovy_names_count_to_use_import_on_demand = 3\nij_groovy_parameter_annotation_wrap = off\nij_groovy_parentheses_expression_new_line_after_left_paren = false\nij_groovy_parentheses_expression_right_paren_on_new_line = false\nij_groovy_prefer_parameters_wrap = false\nij_groovy_resource_list_new_line_after_left_paren = false\nij_groovy_resource_list_right_paren_on_new_line = false\nij_groovy_resource_list_wrap = off\nij_groovy_space_after_assert_separator = true\nij_groovy_space_after_colon = true\nij_groovy_space_after_comma = true\nij_groovy_space_after_comma_in_type_arguments = true\nij_groovy_space_after_for_semicolon = true\nij_groovy_space_after_quest = true\nij_groovy_space_after_type_cast = true\nij_groovy_space_before_annotation_parameter_list = false\nij_groovy_space_before_array_initializer_left_brace = false\nij_groovy_space_before_assert_separator = false\nij_groovy_space_before_catch_keyword = true\nij_groovy_space_before_catch_left_brace = true\nij_groovy_space_before_catch_parentheses = true\nij_groovy_space_before_class_left_brace = true\nij_groovy_space_before_closure_left_brace = true\nij_groovy_space_before_colon = true\nij_groovy_space_before_comma = false\nij_groovy_space_before_do_left_brace = true\nij_groovy_space_before_else_keyword = true\nij_groovy_space_before_else_left_brace = true\nij_groovy_space_before_finally_keyword = true\nij_groovy_space_before_finally_left_brace = true\nij_groovy_space_before_for_left_brace = true\nij_groovy_space_before_for_parentheses = true\nij_groovy_space_before_for_semicolon = false\nij_groovy_space_before_if_left_brace = true\nij_groovy_space_before_if_parentheses = true\nij_groovy_space_before_method_call_parentheses = false\nij_groovy_space_before_method_left_brace = true\nij_groovy_space_before_method_parentheses = false\nij_groovy_space_before_quest = true\nij_groovy_space_before_switch_left_brace = true\nij_groovy_space_before_switch_parentheses = true\nij_groovy_space_before_synchronized_left_brace = true\nij_groovy_space_before_synchronized_parentheses = true\nij_groovy_space_before_try_left_brace = true\nij_groovy_space_before_try_parentheses = true\nij_groovy_space_before_while_keyword = true\nij_groovy_space_before_while_left_brace = true\nij_groovy_space_before_while_parentheses = true\nij_groovy_space_in_named_argument = true\nij_groovy_space_in_named_argument_before_colon = false\nij_groovy_space_within_empty_array_initializer_braces = false\nij_groovy_space_within_empty_method_call_parentheses = false\nij_groovy_spaces_around_additive_operators = true\nij_groovy_spaces_around_assignment_operators = true\nij_groovy_spaces_around_bitwise_operators = true\nij_groovy_spaces_around_equality_operators = true\nij_groovy_spaces_around_lambda_arrow = true\nij_groovy_spaces_around_logical_operators = true\nij_groovy_spaces_around_multiplicative_operators = true\nij_groovy_spaces_around_regex_operators = true\nij_groovy_spaces_around_relational_operators = true\nij_groovy_spaces_around_shift_operators = true\nij_groovy_spaces_within_annotation_parentheses = false\nij_groovy_spaces_within_array_initializer_braces = false\nij_groovy_spaces_within_braces = true\nij_groovy_spaces_within_brackets = false\nij_groovy_spaces_within_cast_parentheses = false\nij_groovy_spaces_within_catch_parentheses = false\nij_groovy_spaces_within_for_parentheses = false\nij_groovy_spaces_within_gstring_injection_braces = false\nij_groovy_spaces_within_if_parentheses = false\nij_groovy_spaces_within_list_or_map = false\nij_groovy_spaces_within_method_call_parentheses = false\nij_groovy_spaces_within_method_parentheses = false\nij_groovy_spaces_within_parentheses = false\nij_groovy_spaces_within_switch_parentheses = false\nij_groovy_spaces_within_synchronized_parentheses = false\nij_groovy_spaces_within_try_parentheses = false\nij_groovy_spaces_within_tuple_expression = false\nij_groovy_spaces_within_while_parentheses = false\nij_groovy_special_else_if_treatment = true\nij_groovy_ternary_operation_wrap = off\nij_groovy_throws_keyword_wrap = off\nij_groovy_throws_list_wrap = off\nij_groovy_use_flying_geese_braces = false\nij_groovy_use_fq_class_names = false\nij_groovy_use_fq_class_names_in_javadoc = true\nij_groovy_use_relative_indents = false\nij_groovy_use_single_class_imports = true\nij_groovy_variable_annotation_wrap = off\nij_groovy_while_brace_force = never\nij_groovy_while_on_new_line = false\nij_groovy_wrap_long_lines = false\n\n[{*.har,*.jsb2,*.jsb3,*.json,.babelrc,.eslintrc,.stylelintrc,bowerrc,jest.config}]\nindent_size = 2\nij_json_keep_blank_lines_in_code = 0\nij_json_keep_indents_on_empty_lines = false\nij_json_keep_line_breaks = true\nij_json_space_after_colon = true\nij_json_space_after_comma = true\nij_json_space_before_colon = true\nij_json_space_before_comma = false\nij_json_spaces_within_braces = false\nij_json_spaces_within_brackets = false\nij_json_wrap_long_lines = false\n\n[{*.htm,*.html,*.sht,*.shtm,*.shtml}]\nij_html_add_new_line_before_tags = body, div, p, form, h1, h2, h3\nij_html_align_attributes = true\nij_html_align_text = false\nij_html_attribute_wrap = normal\nij_html_block_comment_at_first_column = true\nij_html_do_not_align_children_of_min_lines = 0\nij_html_do_not_break_if_inline_tags = title, h1, h2, h3, h4, h5, h6, p\nij_html_do_not_indent_children_of_tags = html, body, thead, tbody, tfoot\nij_html_enforce_quotes = false\nij_html_inline_tags = a, abbr, acronym, b, basefont, bdo, big, br, cite, cite, code, dfn, em, font, i, img, input, kbd, label, q, s, samp, select, small, span, strike, strong, sub, sup, textarea, tt, u, var\nij_html_keep_blank_lines = 2\nij_html_keep_indents_on_empty_lines = false\nij_html_keep_line_breaks = true\nij_html_keep_line_breaks_in_text = true\nij_html_keep_whitespaces = false\nij_html_keep_whitespaces_inside = span, pre, textarea\nij_html_line_comment_at_first_column = true\nij_html_new_line_after_last_attribute = never\nij_html_new_line_before_first_attribute = never\nij_html_quote_style = double\nij_html_remove_new_line_before_tags = br\nij_html_space_after_tag_name = false\nij_html_space_around_equality_in_attribute = false\nij_html_space_inside_empty_tag = false\nij_html_text_wrap = normal\n\n[{*.markdown,*.md,*.mkd}]\nij_markdown_wrap_text_if_long = false\nij_markdown_wrap_text_inside_blockquotes = false\n\n[{*.properties,spring.handlers,spring.schemas}]\nij_properties_align_group_field_declarations = false\nij_properties_keep_blank_lines = false\nij_properties_key_value_delimiter = equals\nij_properties_spaces_around_key_value_delimiter = false\n\n[{*.yaml,*.yml}]\nindent_size = 2\nij_yaml_align_values_properties = do_not_align\nij_yaml_autoinsert_sequence_marker = true\nij_yaml_block_mapping_on_new_line = false\nij_yaml_indent_sequence_value = true\nij_yaml_keep_indents_on_empty_lines = false\nij_yaml_keep_line_breaks = true\nij_yaml_sequence_on_new_line = false\nij_yaml_space_before_colon = false\nij_yaml_spaces_within_braces = true\nij_yaml_spaces_within_brackets = true\n"
  },
  {
    "path": ".gitattributes",
    "content": "* text=auto\n* eol=lf\n*.png binary\n*.jar binary\n*.jpg binary\n*.jpeg binary\n*.webp binary\n*.bin binary\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug.yml",
    "content": "name: Bug 报告\ndescription: 提交一个 bug\nlabels:\n  - \"z:question\"\n\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        感谢你来到这里\n\n        在反馈前, 请确认你已经做了下面这些事情\n        - 阅读过 [「提问的智慧」](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md)\n        - 阅读过 [「如何有效地报告 Bug」](https://www.chiark.greenend.org.uk/~sgtatham/bugs-cn.html)\n        - 对照过 [Releases](https://github.com/mamoe/mirai/releases)，相关问题未在近期更新中解决\n        - 搜索了已有的 [issues](https://github.com/mamoe/mirai/issues?q=is%3Aissue) 列表中有没相关的信息\n        - 阅读了 [Mirai 的相关文档](https://github.com/mamoe/mirai/tree/dev/docs)\n\n  - type: textarea\n    id: issue-description\n    attributes:\n      label: 问题描述\n      description: 在此详细描述你遇到的问题\n    validations:\n      required: true\n\n  - type: textarea\n    id: reproduce\n    attributes:\n      label: 复现\n      description: 在这里简略说明如何让这个问题再次发生\n      placeholder: |\n        在这里简略说明如何让这个问题再次发生\n        可使用 1.  2.  3.  的列表格式，或其他任意恰当的格式\n        如果你不确定如何复现, 请尽量描述发生当时的情景\n        \n        建议提供相关代码\n    validations:\n      required: true\n\n  - type: input\n    id: version-mirai-core\n    attributes:\n      label: mirai-core 版本\n      description: \"填写你正在使用的版本号，如 `2.8.2`\"\n      placeholder: 2.8.2\n    validations:\n      required: true\n\n  - type: dropdown\n    id: bot-protocol\n    attributes:\n      label: bot-protocol\n      options:\n        - ANDROID_PHONE\n        - ANDROID_PAD\n        - ANDROID_WATCH\n        - IPAD\n        - MACOS\n    validations:\n      required: true\n\n  - type: textarea\n    id: version-others\n    attributes:\n      label: 其他组件版本\n      description: |\n        如果你正在通过 mirai-console 或其他间接使用 mirai-core 的中间件（如 mirai-native、mirai-api-http 或者其他第三方 SDK）, 请同样提供版本号\n        如果你正在使用 mirai-console, 请在此处粘贴 `/status` 命令的结果\n      placeholder: |\n        mirai-api-http: `2.3.3`\n\n  - type: textarea\n    id: journal-system\n    attributes:\n      label: 系统日志\n      description: |\n        请提供全面的相关日志. 请不要截图.\n        如果日志过大, 可以在 `补充信息` 上传文件.\n        如果你遇到的问题是 \"消息收不到\", \"收消息报错\" 等与协议有关的问题, 请一定提交日志. 若不提交日志, 你的问题可能会被直接关闭.\n      render: 'text'\n    validations:\n      required: false\n\n  - type: textarea\n    id: journal-network\n    attributes:\n      label: 网络日志\n      description: |\n        如果网络日志 (Net xxx) 不包含在系统日志中, 请额外提供网络日志. 若已经包含, 请忽略.\n        请提供全面的网络日志. 请不要截图.\n        若使用 Mirai Console 一般网络日志位于 bots/<****>/logs 里\n        如果日志过大, 可以在 `补充信息` 上传文件.\n      render: text\n    validations:\n      required: false\n\n  - type: textarea\n    id: additional\n    attributes:\n      label: 补充信息\n      description: 如有必要，你可以在下文继续添加其他信息\n\n  - type: markdown\n    attributes:\n      value: |\n        ----\n\n        在发出 issue 前, 请确认\n\n        - 全部信息已经填写完毕, 特别是 「其他组件版本」\n        - 报告中没有令人反感的语言\n        - 「复现」的描述是否足够详细准确\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: true\n\ncontact_links:\n  - name: Mirai Forum\n    url: https://mirai.mamoe.net\n    about: 论坛\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature.md",
    "content": "---\nname: 特性申请\nabout: 申请 mirai 添加新的特性\ntitle: ''\nlabels: 't:feature'\nassignees: ''\n\n---\n\n<!-- \n  感谢你来到这里,\n  在反馈前, 请确认你已经做了下面这些事情\n  - 对照 releases，相关特性未实现\n  - 搜索了已有的 issues 列表中有没相关的信息\n  - 阅读了 Mirai 的相关文档\n-->\n\n<!--\n请在下一行开始描述你需要的功能和它的实际用途举例. 请注意, 如果没有实际用途, 你的建议可能不会被采纳.\n-->\n\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: Build\n\n\non:\n  push:\n    paths-ignore:\n      - 'docs/**'\n      - 'mirai-console/docs/**'\n      - '**/*.md'\n  pull_request:\n    paths-ignore:\n      - 'docs/**'\n      - 'mirai-console/docs/**'\n      - '**/*.md'\n\njobs:\n  build:\n    name: \"Build (${{ matrix.os }})\"\n    runs-on: ${{ matrix.os }}\n    strategy:\n      fail-fast: false\n      matrix:\n        os: # You must use macos-12. Only macos-12 get 14GB memory while others have only 7GB.\n          #          - windows-2022\n          - macos-12\n    env:\n      gradleArgs: --scan\n      isMac: ${{ startsWith(matrix.os, 'macos') }}\n      isWindows: ${{ startsWith(matrix.os, 'windows') }}\n      isUbuntu: ${{ startsWith(matrix.os, 'ubuntu') }}\n      isUnix: ${{ startsWith(matrix.os, 'macos') || startsWith(matrix.os, 'ubuntu') }}\n    steps:\n      - uses: actions/checkout@v3\n        with:\n          submodules: 'recursive'\n\n      - uses: actions/setup-java@v3\n        with:\n          distribution: 'temurin'\n          java-version: '17'\n\n      - name: Setup Gradle\n        uses: gradle/gradle-build-action@v2\n\n      - if: ${{ env.isUnix == 'true' }}\n        run: chmod -R 777 *\n\n      - if: ${{ env.isWindows == 'true' }}\n        name: Setup Memory Environment on Windows\n        run: >\n          wmic pagefileset where name=\"D:\\\\pagefile.sys\" set InitialSize=1024,MaximumSize=18432 &\n          net stop mongodb\n        shell: cmd\n        continue-on-error: true\n\n      - name: Clean and download dependencies\n        run: ./gradlew clean ${{ env.gradleArgs }}\n\n      - run: >\n          ./gradlew updateSnapshotVersion ${{ env.gradleArgs }}\n        if: github.event.pusher && vars.RUN_MIRAI_SNAPSHOTS == 'true'\n        env:\n          MIRAI_IS_SNAPSHOTS_PUBLISHING: true\n          SNAPSHOTS_PUBLISHING_USER: ${{ secrets.SNAPSHOTS_PUBLISHING_USER }}\n          SNAPSHOTS_PUBLISHING_KEY: ${{ secrets.SNAPSHOTS_PUBLISHING_KEY }}\n          SNAPSHOTS_PUBLISHING_URL: ${{ secrets.SNAPSHOTS_PUBLISHING_URL }}\n          MIRAI_BUILD_INDEX_AUTH_USERNAME: ${{ secrets.MIRAI_BUILD_INDEX_AUTH_USERNAME }}\n          MIRAI_BUILD_INDEX_AUTH_PASSWORD: ${{ secrets.MIRAI_BUILD_INDEX_AUTH_PASSWORD }}\n\n      - name: \"Assemble\"\n        run: ./gradlew assemble ${{ env.gradleArgs }}\n\n      - name: Publish Local Artifacts\n        if: ${{ env.enableLocalPublishingTest == 'true' }}\n        run: ./gradlew :mirai-deps-test:publishMiraiArtifactsToMavenLocal ${{ env.gradleArgs }} \"-Dmirai.build.project.version=2.99.0-deps-test\"\n\n      - name: \"Check\"\n        run: ./gradlew check ${{ env.gradleArgs }}\n\n      # Snapshots\n\n      - if: ${{ env.isMac == 'true' }}\n        name: Ensure KDoc valid\n        run: ./gradlew dokkaHtmlMultiModule ${{ env.gradleArgs }}\n\n      - name: Release RAM\n        run: node ci-release-helper/scripts/kill-java.js\n\n      - name: Publish Snapshots\n        if: ${{ github.event.pusher && env.isMac == 'true' && vars.RUN_MIRAI_SNAPSHOTS == 'true' }}\n        run: ./gradlew publishAllPublicationsToMiraiRepoRepository ${{ env.gradleArgs }}\n        env:\n          MIRAI_IS_SNAPSHOTS_PUBLISHING: true\n          SNAPSHOTS_PUBLISHING_USER: ${{ secrets.SNAPSHOTS_PUBLISHING_USER }}\n          SNAPSHOTS_PUBLISHING_KEY: ${{ secrets.SNAPSHOTS_PUBLISHING_KEY }}\n          SNAPSHOTS_PUBLISHING_URL: ${{ secrets.SNAPSHOTS_PUBLISHING_URL }}\n\n      # Upload\n\n      - name: Publish MavenLocal\n        run: ./gradlew publishToMavenLocal ${{ env.gradleArgs }}\n\n      - name: Upload MavenLocal\n        uses: actions/upload-artifact@v3\n        with:\n          name: maven-cache\n          path: ~/.m2"
  },
  {
    "path": ".github/workflows/check-publishing.yml",
    "content": "# 当修改构建脚本 (包括修改依赖版本) 时检查配置是否能正常发版\n# 发版检查非常慢, 因此不在 build.yml 做\n\nname: Check Publishing\n\n\non:\n  push:\n    paths:\n      - '**/**.gradle.kts'\n      - '**/gradle.properties'\n      - 'buildSrc/**'\n  pull_request:\n    paths:\n      - '**/**.gradle.kts'\n      - '**/gradle.properties'\n      - 'buildSrc/**'\n\njobs:\n\n  check-publishing:\n    name: \"Check Publishing (${{ matrix.os }})\"\n    runs-on: ${{ matrix.os }}\n    strategy:\n      fail-fast: false\n      matrix:\n        os:\n          #          - windows-2022 # OOM\n          - ubuntu-20.04\n          - macos-12\n        include:\n          #          - os: windows-2022\n          #            targetName: mingwX64\n          #            parallelCompilation: false\n          - os: ubuntu-20.04\n            targetName: linuxX64\n            parallelCompilation: false\n          - os: macos-12\n            targetName: macosX64\n            parallelCompilation: true # macOS machine has 14G\n    env:\n      # FIXME there must be two or more targets, or we'll get error on `@OptionalExpectation`\n      # > Declaration annotated with '@OptionalExpectation' can only be used in common module sources\n      gradleArgs: --scan\n      isMac: ${{ startsWith(matrix.os, 'macos') }}\n      isWindows: ${{ startsWith(matrix.os, 'windows') }}\n      isUbuntu: ${{ startsWith(matrix.os, 'ubuntu') }}\n      isUnix: ${{ startsWith(matrix.os, 'macos') || startsWith(matrix.os, 'ubuntu') }}\n      VCPKG_DEFAULT_BINARY_CACHE: ${{ startsWith(matrix.os, 'windows') && 'C:\\vcpkg\\binary_cache' || '/usr/local/share/vcpkg/binary_cache' }}\n    steps:\n      - uses: actions/checkout@v3\n        with:\n          submodules: 'recursive'\n\n      - uses: actions/setup-java@v3\n        with:\n          distribution: 'adopt-openj9'\n          java-version: '17'\n\n      - name: Setup Gradle\n        uses: gradle/gradle-build-action@v2\n\n      - name: Cache konan\n        uses: pat-s/always-upload-cache@v3.0.11\n        with:\n          path: ~/.konan\n          key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }}\n          restore-keys: |\n            ${{ runner.os }}-gradle-\n\n      - name: Prepare to cache vcpkg\n        if: ${{ env.isWindows == 'true' }}\n        run: mkdir -p ${{ env.VCPKG_DEFAULT_BINARY_CACHE }}\n\n      - name: Cache vcpkg\n        if: ${{ env.isWindows == 'true' }}\n        uses: pat-s/always-upload-cache@v3.0.11\n        with:\n          path: ${{ env.VCPKG_DEFAULT_BINARY_CACHE }}\n          key: ${{ runner.os }}-vcpkg-binary-cache-${{ github.job }}\n          restore-keys: |\n            ${{ runner.os }}-vcpkg-binary-cache-\n\n      - if: ${{ env.isUnix == 'true' }}\n        run: chmod -R 777 *\n\n      # Prepare environment for linking on Ubuntu\n      - if: ${{ env.isUbuntu == 'true' }}\n        name: Install OpenSSL on Ubuntu\n        run: sudo apt install libssl-dev -y\n\n      # Prepare environment for linking on Windows\n      - if: ${{ env.isWindows == 'true' }}\n        name: Setup Memory Environment on Windows\n        run: >\n          wmic pagefileset where name=\"D:\\\\pagefile.sys\" set InitialSize=1024,MaximumSize=9216 &\n          net stop mongodb\n        shell: cmd\n        continue-on-error: true\n\n      - if: ${{ env.isWindows == 'true' }}\n        name: Install OpenSSL & cURL on Windows\n        run: |\n          echo \"set(VCPKG_BUILD_TYPE release)\" | Out-File -FilePath \"$env:VCPKG_INSTALLATION_ROOT\\triplets\\x64-windows.cmake\" -Encoding utf8 -Append\n          vcpkg install openssl:x64-windows curl[core,ssl]:x64-windows\n          New-Item -Path $env:VCPKG_INSTALLATION_ROOT\\installed\\x64-windows\\lib\\crypto.lib -ItemType SymbolicLink -Value $env:VCPKG_INSTALLATION_ROOT\\installed\\x64-windows\\lib\\libcrypto.lib\n          New-Item -Path $env:VCPKG_INSTALLATION_ROOT\\installed\\x64-windows\\lib\\ssl.lib -ItemType SymbolicLink -Value $env:VCPKG_INSTALLATION_ROOT\\installed\\x64-windows\\lib\\libssl.lib\n          New-Item -Path $env:VCPKG_INSTALLATION_ROOT\\installed\\x64-windows\\lib\\curl.lib -ItemType SymbolicLink -Value $env:VCPKG_INSTALLATION_ROOT\\installed\\x64-windows\\lib\\libcurl.lib\n          echo \"$env:VCPKG_INSTALLATION_ROOT\\installed\\x64-windows\\bin\" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append\n\n      - name: Clean and download dependencies\n        run: ./gradlew clean ${{ env.gradleArgs }}\n\n      - name: Prepare deps test build\n        run: ./gradlew :mirai-deps-test:updateProjectVersionForLocalDepsTest ${{ env.gradleArgs }} \"-Porg.gradle.parallel=${{ matrix.parallelCompilation }}\"\n\n      - name: Build and Publish Local Artifacts\n        run: ./gradlew :mirai-deps-test:publishMiraiArtifactsToMavenLocal ${{ env.gradleArgs }} \"-Porg.gradle.parallel=${{ matrix.parallelCompilation }}\"\n\n      - name: Check Publication\n        run: ./gradlew :mirai-deps-test:check ${{ env.gradleArgs }} \"-Dmirai.deps.test.must.run=true\" \"-Porg.gradle.parallel=${{ matrix.parallelCompilation }}\"\n"
  },
  {
    "path": ".github/workflows/doc.yml",
    "content": "name: mirai-doc Publish\n\non:\n  push:\n    tags:\n      - 'v*' # 正式版本\n\n\njobs:\n  mirai-docs:\n    runs-on: macos-12 # 14G memory\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v3\n\n      - name: Setup JDK 11\n        uses: actions/setup-java@v3\n        with:\n          distribution: 'adopt'\n          java-version: '11'\n\n      - name: chmod -R 777 *\n        run: chmod -R 777 *\n\n      - name: Prepare environment\n        run: ./gradlew :mirai-dokka:prepare\n\n      - name: Dokka\n        run: ./gradlew dokkaHtmlMultiModule\n\n      - name: Update version number\n        run: ./gradlew :mirai-dokka:update-vers\n\n      - name: Deploy\n        run: ./gradlew :mirai-dokka:deployPages\n        env:\n          gh_token: ${{ secrets.MAMOE_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Release Publish\n\non:\n  push:\n    tags:\n      - 'v*' # 正式版本\n    paths-ignore:\n      - 'docs/**'\n      - 'mirai-console/docs/**'\n      - '**/*.md'\n\n\njobs:\n  initialize-sonatype-stage:\n    name: \"Initialize sonatype staging repository\"\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n        with:\n          submodules: 'recursive'\n\n      - uses: actions/setup-java@v3\n        with:\n          distribution: 'temurin'\n          java-version: '17'\n\n      - name: Setup Gradle\n        uses: gradle/gradle-build-action@v2\n\n      - run: chmod -R 777 *\n\n      - name: Create publishing staging repository\n        run: ./gradlew runcihelper --args create-stage-repo --scan \"-Pcihelper.cert.username=${{ secrets.SONATYPE_USER }}\" \"-Pcihelper.cert.password=${{ secrets.SONATYPE_KEY }}\" \"-Pcihelper.cert.profileid=${{ secrets.SONATYPE_PROFILEID }}\"\n\n      - name: Cache staging repository id\n        uses: actions/upload-artifact@v3\n        with:\n          name: publish-stage-id\n          path: ci-release-helper/repoid\n\n  publish-others:\n    name: \"Others (${{ matrix.os }})\"\n    runs-on: ${{ matrix.os }}\n    needs: [ initialize-sonatype-stage ]\n    strategy:\n      fail-fast: false\n      matrix:\n        os:\n          - macos-12\n    env:\n      # All targets MUST be enabled. See #2270.\n      gradleArgs: --scan \"-Dmirai.target=other\" \"-Pkotlin.compiler.execution.strategy=in-process\"\n      isMac: ${{ startsWith(matrix.os, 'macos') }}\n      isWindows: ${{ startsWith(matrix.os, 'windows') }}\n      isUbuntu: ${{ startsWith(matrix.os, 'ubuntu') }}\n      isUnix: ${{ startsWith(matrix.os, 'macos') || startsWith(matrix.os, 'ubuntu') }}\n    steps:\n      - uses: actions/checkout@v3\n        with:\n          submodules: 'recursive'\n\n      - uses: actions/setup-java@v3\n        with:\n          distribution: 'temurin'\n          java-version: '17'\n\n      - name: Keys setup\n        shell: bash\n        run: |\n          mkdir build-gpg-sign\n          echo \"$GPG_PRIVATE\" > build-gpg-sign/keys.gpg\n          echo \"$GPG_PUBLIC_\" > build-gpg-sign/keys.gpg.pub\n        env:\n          GPG_PRIVATE: ${{ secrets.GPG_PRIVATE_KEY }}\n          GPG_PUBLIC_: ${{ secrets.GPG_PUBLIC_KEY }}\n\n      - name: Setup Android SDK Ubuntu\n        if: ${{ env.isUbuntu == 'true' }}\n        run: 'touch local.properties && echo sdk.dir=/usr/local/lib/android/sdk >> local.properties'\n\n      - name: Setup Android SDK macOS\n        if: ${{ env.isMac == 'true' }}\n        run: 'touch local.properties && echo sdk.dir=/Users/runner/Library/Android/sdk >> local.properties'\n\n      - name: Setup Android SDK Windows\n        if: ${{ env.isWindows == 'true' }}\n        run: 'echo sdk.dir=C:\\Android\\android-sdk >> local.properties'\n\n      - name: Setup Gradle\n        uses: gradle/gradle-build-action@v2\n\n      - name: Cache konan\n        uses: pat-s/always-upload-cache@v3.0.11\n        with:\n          path: ~/.konan\n          key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }}\n          restore-keys: |\n            ${{ runner.os }}-gradle-\n\n      - if: ${{ env.isUnix == 'true' }}\n        run: chmod -R 777 *\n\n      # Prepare environment for linking for macOS\n\n      - name: Clean and download dependencies\n        run: ./gradlew clean ${{ env.gradleArgs }}\n\n      - name: \"Assemble\"\n        run: ./gradlew assemble ${{ env.gradleArgs }}\n\n      - name: Publish Local Artifacts\n        if: ${{ env.enableLocalPublishingTest == 'true' }}\n        run: ./gradlew :mirai-deps-test:publishMiraiArtifactsToMavenLocal ${{ env.gradleArgs }} \"-Dmirai.build.project.version=2.99.0-deps-test\"\n\n      - name: \"Check\"\n        run: ./gradlew check ${{ env.gradleArgs }}\n\n      - if: ${{ env.isMac == 'true' }}\n        name: Ensure KDoc valid\n        run: ./gradlew dokkaHtmlMultiModule ${{ env.gradleArgs }}\n\n      - name: Initialize Publishing Caching Repository\n        run: ./gradlew runcihelper --args sync-maven-metadata  ${{ env.gradleArgs }}\n\n      - name: Publish\n        if: ${{ env.isMac == 'true' }}\n        run: ./gradlew publishAllPublicationsToMiraiStageRepoRepository ${{ env.gradleArgs }}\n\n      - name: Restore staging repository id\n        uses: actions/download-artifact@v3\n        with:\n          name: publish-stage-id\n          path: ci-release-helper/repoid\n\n      - name: Release RAM\n        run: node ci-release-helper/scripts/kill-java.js\n\n      - name: Publish to maven central\n        run: ./gradlew runcihelper --args publish-to-maven-central --scan \"-Pcihelper.cert.username=${{ secrets.SONATYPE_USER }}\" \"-Pcihelper.cert.password=${{ secrets.SONATYPE_KEY }}\"\n\n      - name: Publish Gradle plugin\n        run: ./gradlew\n          :mirai-console-gradle:publishPlugins ${{ env.gradleArgs }}\n          -Dgradle.publish.key=${{ secrets.GRADLE_PUBLISH_KEY }} -Pgradle.publish.key=${{ secrets.GRADLE_PUBLISH_KEY }}\n          -Dgradle.publish.secret=${{ secrets.GRADLE_PUBLISH_SECRET }} -Pgradle.publish.secret=${{ secrets.GRADLE_PUBLISH_SECRET }}\n        continue-on-error: true\n\n#\n#  close-repository:\n#    runs-on: macos-12\n#    needs:\n#      - publish-others\n#      - publish-core-native\n#    steps:\n#      - uses: actions/checkout@v3\n#        with:\n#          submodules: 'recursive'\n#\n#      - uses: actions/setup-java@v3\n#        with:\n#          distribution: 'adopt-openj9'\n#          java-version: '17'\n#\n#      - name: Setup Gradle\n#        uses: gradle/gradle-build-action@v2\n#\n#      - name: Close repository\n#        run: ./gradlew :ci-release-helper:closeRepository --scan"
  },
  {
    "path": ".gitignore",
    "content": "# Compiled class file\n*.class\n\n# Log file\n*.log\n\n# BlueJ files\n*.ctxt\n\n# Mobile Tools for Java (J2ME)\n.mtj.tmp/\n\n# Package Files #\n*.war\n*.nar\n*.ear\n*.zip\n*.tar.gz\n*.rar\n\n# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml\nhs_err_pid*\n\ntarget/\nbuild/\n\n.idea/\n*.iml\nmirai.iml\n/.idea/\n.idea/*\n/.idea/*\n\n/test\n\n\n.gradle/\n\n\nlocal.properties\n\n# Maven publishing credits\nkeys.properties\n/plugins/\n\ntoken.txt\nbintray.user.txt\nbintray.key.txt\n\n# For gpg sign\n/build-gpg-sign\n# Name for IDEA direction sorting\nbuild-secret-keys/\n\n**/local.*"
  },
  {
    "path": ".run/Check Binary Compatibility.run.xml",
    "content": "<!--\n  ~ Copyright 2019-2021 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"Check Binary Compatibility\" type=\"GradleRunConfiguration\" factoryName=\"Gradle\" folderName=\"API Compatibility\">\n    <ExternalSystemSettings>\n      <option name=\"executionName\" />\n      <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n      <option name=\"externalSystemIdString\" value=\"GRADLE\" />\n      <option name=\"scriptParameters\" value=\"\" />\n      <option name=\"taskDescriptions\">\n        <list />\n      </option>\n      <option name=\"taskNames\">\n        <list>\n          <option value=\"apiCheckAll\" />\n        </list>\n      </option>\n      <option name=\"vmOptions\" />\n    </ExternalSystemSettings>\n    <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>\n    <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>\n    <DebugAllEnabled>false</DebugAllEnabled>\n    <method v=\"2\" />\n  </configuration>\n</component>"
  },
  {
    "path": ".run/Compile everything.run.xml",
    "content": "<!--\n  ~ Copyright 2019-2022 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<component name=\"ProjectRunConfigurationManager\">\n    <configuration default=\"false\" name=\"Compile everything\" type=\"GradleRunConfiguration\" factoryName=\"Gradle\"\n                   folderName=\"Build\">\n        <ExternalSystemSettings>\n            <option name=\"executionName\"/>\n            <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\"/>\n            <option name=\"externalSystemIdString\" value=\"GRADLE\"/>\n            <option name=\"scriptParameters\" value=\"\"/>\n            <option name=\"taskDescriptions\">\n                <list/>\n            </option>\n            <option name=\"taskNames\">\n                <list>\n                    <option value=\"assemble\"/>\n                </list>\n            </option>\n            <option name=\"vmOptions\"/>\n        </ExternalSystemSettings>\n        <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>\n        <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>\n        <DebugAllEnabled>false</DebugAllEnabled>\n        <method v=\"2\"/>\n    </configuration>\n</component>"
  },
  {
    "path": ".run/Compile mirai-console.run.xml",
    "content": "<!--\n  ~ Copyright 2019-2022 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<component name=\"ProjectRunConfigurationManager\">\n    <configuration default=\"false\" name=\"Compile mirai-console\" type=\"GradleRunConfiguration\" factoryName=\"Gradle\"\n                   folderName=\"Build\">\n        <ExternalSystemSettings>\n            <option name=\"executionName\"/>\n            <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\"/>\n            <option name=\"externalSystemIdString\" value=\"GRADLE\"/>\n            <option name=\"scriptParameters\" value=\"\"/>\n            <option name=\"taskDescriptions\">\n                <list/>\n            </option>\n            <option name=\"taskNames\">\n                <list>\n                    <option value=\":mirai-console:assemble\"/>\n                </list>\n            </option>\n            <option name=\"vmOptions\"/>\n        </ExternalSystemSettings>\n        <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>\n        <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>\n        <DebugAllEnabled>false</DebugAllEnabled>\n        <method v=\"2\"/>\n    </configuration>\n</component>"
  },
  {
    "path": ".run/Compile mirai-core for JVM.run.xml",
    "content": "<!--\n  ~ Copyright 2019-2022 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<component name=\"ProjectRunConfigurationManager\">\n    <configuration default=\"false\" name=\"Compile mirai-core for JVM\" type=\"GradleRunConfiguration\" factoryName=\"Gradle\"\n                   folderName=\"Build mirai-core\">\n        <ExternalSystemSettings>\n            <option name=\"executionName\"/>\n            <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\"/>\n            <option name=\"externalSystemIdString\" value=\"GRADLE\"/>\n            <option name=\"scriptParameters\" value=\"\"/>\n            <option name=\"taskDescriptions\">\n                <list/>\n            </option>\n            <option name=\"taskNames\">\n                <list>\n                    <option value=\":mirai-core-utils:compileKotlinJvm\"/>\n                    <option value=\":mirai-core-utils:compileKotlinAndroid\"/>\n                    <option value=\":mirai-core-api:compileKotlinJvm\"/>\n                    <option value=\":mirai-core-api:compileKotlinAndroid\"/>\n                    <option value=\":mirai-core:compileKotlinJvm\"/>\n                    <option value=\":mirai-core:compileKotlinAndroid\"/>\n                </list>\n            </option>\n            <option name=\"vmOptions\"/>\n        </ExternalSystemSettings>\n        <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>\n        <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>\n        <DebugAllEnabled>false</DebugAllEnabled>\n        <method v=\"2\"/>\n    </configuration>\n</component>"
  },
  {
    "path": ".run/Dump API Changes for mirai-console-frontend-base.run.xml",
    "content": "<!--\n  ~ Copyright 2019-2022 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<component name=\"ProjectRunConfigurationManager\">\n    <configuration default=\"false\" name=\"Dump API Changes for mirai-console-frontend-base\" type=\"GradleRunConfiguration\"\n                   factoryName=\"Gradle\" folderName=\"API Compatibility\">\n        <ExternalSystemSettings>\n            <option name=\"executionName\"/>\n            <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\"/>\n            <option name=\"externalSystemIdString\" value=\"GRADLE\"/>\n            <option name=\"scriptParameters\" value=\"\"/>\n            <option name=\"taskDescriptions\">\n                <list/>\n            </option>\n            <option name=\"taskNames\">\n                <list>\n                    <option value=\":mirai-console-frontend-base:apiDumpAll\"/>\n                </list>\n            </option>\n            <option name=\"vmOptions\"/>\n        </ExternalSystemSettings>\n        <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>\n        <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>\n        <DebugAllEnabled>false</DebugAllEnabled>\n        <method v=\"2\"/>\n    </configuration>\n</component>"
  },
  {
    "path": ".run/Dump API Changes for mirai-console.run.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"Dump API Changes for mirai-console\" type=\"GradleRunConfiguration\" factoryName=\"Gradle\" folderName=\"API Compatibility\">\n    <ExternalSystemSettings>\n      <option name=\"executionName\" />\n      <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n      <option name=\"externalSystemIdString\" value=\"GRADLE\" />\n      <option name=\"scriptParameters\" value=\"\" />\n      <option name=\"taskDescriptions\">\n        <list />\n      </option>\n      <option name=\"taskNames\">\n        <list>\n          <option value=\":mirai-console:apiDumpAll\" />\n        </list>\n      </option>\n      <option name=\"vmOptions\" />\n    </ExternalSystemSettings>\n    <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>\n    <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>\n    <DebugAllEnabled>false</DebugAllEnabled>\n    <method v=\"2\" />\n  </configuration>\n</component>"
  },
  {
    "path": ".run/Dump API Changes for mirai-core-api.run.xml",
    "content": "<!--\n  ~ Copyright 2019-2021 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"Dump API Changes for mirai-core-api\" type=\"GradleRunConfiguration\" factoryName=\"Gradle\" folderName=\"API Compatibility\">\n    <ExternalSystemSettings>\n      <option name=\"executionName\" />\n      <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n      <option name=\"externalSystemIdString\" value=\"GRADLE\" />\n      <option name=\"scriptParameters\" value=\"\" />\n      <option name=\"taskDescriptions\">\n        <list />\n      </option>\n      <option name=\"taskNames\">\n        <list>\n          <option value=\":mirai-core-api:apiDumpAll\" />\n        </list>\n      </option>\n      <option name=\"vmOptions\" />\n    </ExternalSystemSettings>\n    <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>\n    <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>\n    <DebugAllEnabled>false</DebugAllEnabled>\n    <method v=\"2\" />\n  </configuration>\n</component>"
  },
  {
    "path": ".run/Publish deps test artifacts.run.xml",
    "content": "<!--\n  ~ Copyright 2019-2023 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<component name=\"ProjectRunConfigurationManager\">\n    <configuration default=\"false\" name=\"Publish deps test artifacts\" type=\"GradleRunConfiguration\" factoryName=\"Gradle\"\n                   folderName=\"Publishing Tests\">\n        <ExternalSystemSettings>\n            <option name=\"env\">\n                <map>\n                    <entry key=\"mirai.build.project.version\" value=\"2.99.0-deps-test\"/>\n                </map>\n            </option>\n            <option name=\"executionName\"/>\n            <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\"/>\n            <option name=\"externalSystemIdString\" value=\"GRADLE\"/>\n            <option name=\"scriptParameters\" value=\"--stacktrace\"/>\n            <option name=\"taskDescriptions\">\n                <list/>\n            </option>\n            <option name=\"taskNames\">\n                <list>\n                    <option value=\":mirai-deps-test:publishMiraiArtifactsToMavenLocal\"/>\n                </list>\n            </option>\n            <option name=\"vmOptions\"/>\n        </ExternalSystemSettings>\n        <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>\n        <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>\n        <DebugAllEnabled>false</DebugAllEnabled>\n        <ForceTestExec>false</ForceTestExec>\n        <method v=\"2\"/>\n    </configuration>\n</component>"
  },
  {
    "path": ".run/Publish local artifacts.run.xml",
    "content": "<!--\n  ~ Copyright 2019-2023 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"Publish local artifacts\" type=\"GradleRunConfiguration\" factoryName=\"Gradle\" folderName=\"Build\">\n    <ExternalSystemSettings>\n      <option name=\"env\">\n        <map>\n          <entry key=\"mirai.build.project.version\" value=\"2.99.0-local\" />\n        </map>\n      </option>\n      <option name=\"executionName\" />\n      <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n      <option name=\"externalSystemIdString\" value=\"GRADLE\" />\n      <option name=\"scriptParameters\" value=\"--stacktrace\"/>\n      <option name=\"taskDescriptions\">\n        <list />\n      </option>\n      <option name=\"taskNames\">\n        <list>\n          <option value=\"publishToMavenLocal\" />\n        </list>\n      </option>\n      <option name=\"vmOptions\" />\n    </ExternalSystemSettings>\n    <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>\n    <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>\n    <DebugAllEnabled>false</DebugAllEnabled>\n      <ForceTestExec>false</ForceTestExec>\n    <method v=\"2\" />\n  </configuration>\n</component>"
  },
  {
    "path": ".run/Run IDE.run.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"Run IDE\" type=\"GradleRunConfiguration\" factoryName=\"Gradle\" folderName=\"Build\">\n    <ExternalSystemSettings>\n      <option name=\"executionName\" />\n      <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n      <option name=\"externalSystemIdString\" value=\"GRADLE\" />\n      <option name=\"scriptParameters\" value=\"\" />\n      <option name=\"taskDescriptions\">\n        <list />\n      </option>\n      <option name=\"taskNames\">\n        <list>\n          <option value=\"runIde\" />\n        </list>\n      </option>\n      <option name=\"vmOptions\" />\n    </ExternalSystemSettings>\n    <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>\n    <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>\n    <DebugAllEnabled>false</DebugAllEnabled>\n    <method v=\"2\" />\n  </configuration>\n</component>"
  },
  {
    "path": ".run/Run core tests.run.xml",
    "content": "<!--\n  ~ Copyright 2019-2022 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<component name=\"ProjectRunConfigurationManager\">\n    <configuration default=\"false\" name=\"Run core tests\" type=\"GradleRunConfiguration\" factoryName=\"Gradle\">\n        <ExternalSystemSettings>\n            <option name=\"env\">\n                <map>\n                    <entry key=\"kotlinx.coroutines.debug\" value=\"on\"/>\n                </map>\n            </option>\n            <option name=\"executionName\"/>\n            <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\"/>\n            <option name=\"externalSystemIdString\" value=\"GRADLE\"/>\n            <option name=\"scriptParameters\" value=\"\"/>\n            <option name=\"taskDescriptions\">\n                <list/>\n            </option>\n            <option name=\"taskNames\">\n                <list>\n                    <option value=\":mirai-core:check\"/>\n                </list>\n            </option>\n            <option name=\"vmOptions\"/>\n        </ExternalSystemSettings>\n        <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>\n        <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>\n        <DebugAllEnabled>false</DebugAllEnabled>\n        <method v=\"2\"/>\n    </configuration>\n</component>"
  },
  {
    "path": ".run/RunMessageDecodingRecorderKt.run.xml",
    "content": "<!--\n  ~ Copyright 2019-2022 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<component name=\"ProjectRunConfigurationManager\">\n    <configuration default=\"false\" name=\"RunMessageDecodingRecorderKt\" type=\"JetRunConfigurationType\"\n                   nameIsGenerated=\"true\">\n        <option name=\"MAIN_CLASS_NAME\" value=\"net.mamoe.mirai.internal.bootstrap.RunMessageDecodingRecorderKt\"/>\n        <module name=\"mirai.mirai-core.jvmTest\"/>\n        <shortenClasspath name=\"NONE\"/>\n        <option name=\"VM_PARAMETERS\"\n                value=\"-Dmirai.debug.network.state.observer.logging=true -Dmirai.debug.network.show.all.components=true -Dkotlinx.coroutines.debug=on -Dmirai.debug.network.show.packet.details=true\"/>\n        <option name=\"WORKING_DIRECTORY\" value=\"$PROJECT_DIR$/test/run\"/>\n        <method v=\"2\">\n            <option name=\"Make\" enabled=\"true\"/>\n        </method>\n    </configuration>\n</component>"
  },
  {
    "path": ".run/RunRecorderKt.run.xml",
    "content": "<!--\n  ~ Copyright 2019-2022 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<component name=\"ProjectRunConfigurationManager\">\n    <configuration default=\"false\" name=\"RunNoticeRecorderKt\" type=\"JetRunConfigurationType\">\n        <option name=\"MAIN_CLASS_NAME\" value=\"net.mamoe.mirai.internal.bootstrap.RunNoticeRecorderKt\"/>\n        <module name=\"mirai.mirai-core.jvmTest\"/>\n        <shortenClasspath name=\"NONE\"/>\n        <option name=\"VM_PARAMETERS\"\n                value=\"-Dmirai.debug.network.show.all.components=true -Dkotlinx.coroutines.debug=on -Dmirai.debug.network.show.packet.details=true -Dmirai.network.notice.unconsumed.logging=true -Dmirai.network.packet.logger=true\"/>\n        <option name=\"WORKING_DIRECTORY\" value=\"$PROJECT_DIR$/test/run\"/>\n        <method v=\"2\">\n            <option name=\"Make\" enabled=\"true\"/>\n        </method>\n    </configuration>\n</component>"
  },
  {
    "path": ".run/Test everything.run.xml",
    "content": "<!--\n  ~ Copyright 2019-2022 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<component name=\"ProjectRunConfigurationManager\">\n    <configuration default=\"false\" name=\"Test everything\" type=\"GradleRunConfiguration\" factoryName=\"Gradle\"\n                   folderName=\"Build\">\n        <ExternalSystemSettings>\n            <option name=\"executionName\"/>\n            <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\"/>\n            <option name=\"externalSystemIdString\" value=\"GRADLE\"/>\n            <option name=\"scriptParameters\" value=\"\"/>\n            <option name=\"taskDescriptions\">\n                <list/>\n            </option>\n            <option name=\"taskNames\">\n                <list>\n                    <option value=\"check\"/>\n                </list>\n            </option>\n            <option name=\"vmOptions\"/>\n        </ExternalSystemSettings>\n        <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>\n        <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>\n        <DebugAllEnabled>false</DebugAllEnabled>\n        <method v=\"2\"/>\n    </configuration>\n</component>"
  },
  {
    "path": ".run/Test mirai-console.run.xml",
    "content": "<!--\n  ~ Copyright 2019-2022 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<component name=\"ProjectRunConfigurationManager\">\n    <configuration default=\"false\" name=\"Test mirai-console\" type=\"GradleRunConfiguration\" factoryName=\"Gradle\"\n                   folderName=\"Build\">\n        <ExternalSystemSettings>\n            <option name=\"executionName\"/>\n            <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\"/>\n            <option name=\"externalSystemIdString\" value=\"GRADLE\"/>\n            <option name=\"scriptParameters\" value=\"\"/>\n            <option name=\"taskDescriptions\">\n                <list/>\n            </option>\n            <option name=\"taskNames\">\n                <list>\n                    <option value=\":mirai-console:check\"/>\n                </list>\n            </option>\n            <option name=\"vmOptions\"/>\n        </ExternalSystemSettings>\n        <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>\n        <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>\n        <DebugAllEnabled>false</DebugAllEnabled>\n        <method v=\"2\">\n            <option name=\"RunConfigurationTask\" enabled=\"true\" run_configuration_name=\"Compile mirai-console\"\n                    run_configuration_type=\"GradleRunConfiguration\"/>\n        </method>\n    </configuration>\n</component>"
  },
  {
    "path": ".run/Test mirai-core for JVM.run.xml",
    "content": "<!--\n  ~ Copyright 2019-2022 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<component name=\"ProjectRunConfigurationManager\">\n    <configuration default=\"false\" name=\"Test mirai-core for JVM\" type=\"GradleRunConfiguration\" factoryName=\"Gradle\"\n                   folderName=\"Build mirai-core\">\n        <ExternalSystemSettings>\n            <option name=\"executionName\"/>\n            <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\"/>\n            <option name=\"externalSystemIdString\" value=\"GRADLE\"/>\n            <option name=\"scriptParameters\" value=\"\"/>\n            <option name=\"taskDescriptions\">\n                <list/>\n            </option>\n            <option name=\"taskNames\">\n                <list>\n                    <option value=\":mirai-core-utils:jvmTest\"/>\n                    <option value=\":mirai-core-utils:androidTest\"/>\n                    <option value=\":mirai-core-api:jvmTest\"/>\n                    <option value=\":mirai-core-api:androidTest\"/>\n                    <option value=\":mirai-core:jvmTest\"/>\n                    <option value=\":mirai-core:androidTest\"/>\n                </list>\n            </option>\n            <option name=\"vmOptions\"/>\n        </ExternalSystemSettings>\n        <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>\n        <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>\n        <DebugAllEnabled>false</DebugAllEnabled>\n        <method v=\"2\">\n            <option name=\"RunConfigurationTask\" enabled=\"true\" run_configuration_name=\"Compile mirai-core-api for JVM\"\n                    run_configuration_type=\"GradleRunConfiguration\"/>\n        </method>\n    </configuration>\n</component>"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# CONTRIBUTING\n\n-----------------------------\n\n欢迎你来到这里, 请移步 [`docs/contributing`](docs/contributing)\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  Developers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\n  A secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate.  Many developers of free software are heartened and\nencouraged by the resulting cooperation.  However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\n  The GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community.  It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server.  Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\n  An older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals.  This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Remote Network Interaction; Use with the GNU General Public License.\n\n  Notwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software.  This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time.  Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source.  For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code.  There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<https://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "README-eng.md",
    "content": "# Mirai\n\nMirai is a high-performance multi-platform library, as well as a framework, providing protocol support for Tencent QQ.\n\nMirai is designed to handle all sorts of messaging works that can be automatically done by bots **in a perfect way**.\n\n> Tencent QQ: A modern messaging software used by all Chinese netizens.\n\n## Start\n**Development document**： [docs](docs)\n\n### Use as a framework\n\nMirai is able to run as a plugin-supported framework.  \nThe community, (with `mirai-console`) that allows developers to share their plugins, and for users to install plugins quickly, is building in progress.\n\n- JVM languages like `Java` or `Kotlin`： Make Jar plugin\n  for [mirai-console](/mirai-console) directly and share with other\n  developers through the plugin center.\n- `Kotlin Script`： [mirai-kts](https://github.com/iTXTech/mirai-kts)\n  supports plugins using Kotlin Scripts (`kts`)（**OpenJDK 8+ only，except\n  Android**）\n- Native languages like `C`, `C++`： [mirai-native](https://github.com/iTXTech/mirai-native) supports plugins from CoolQ **(`Windows JREx86` only / with `Wine`)**\n- `JavaScript`： [mirai-js](https://github.com/iTXTech/mirai-js) supports plugins using `JavaScript` and inter-operate with **mirai** on JVM directly.\n- Any language：Use HTTP API from [mirai-api-http](https://github.com/mamoe/mirai-api-http)\n\n**Though only Jar plugins are supported officially, language bridges that are maintained by the community can connect with your knowledge.**:\n\n- `Python`: [python-mirai](https://github.com/NatriumLab/python-mirai) A Bot framework based on `mirai-api-http`.\n- `JavaScript`(`Node.js`): [node-mirai](https://github.com/RedBeanN/node-mirai) The Node.js SDK for mirai.\n- `Go`: [gomirai](https://github.com/Logiase/gomirai) The GoLang SDK for mirai.\n- `Mozilla Rhino`: [mirai-rhinojs-sdk](https://github.com/StageGuard/mirai-rhinojs-sdk) The Mozilla Rhino (JavaScript) SDK for mirai.\n- `Lua`: [lua-mirai](https://github.com/only52607/lua-mirai) The Lua SDK for mirai-core, supporting Java extensions that act as a bridge between Java and native Lua.\n- `C++`: [miraiCP](https://github.com/Nambers/MiraiCP) A C++ SDK using the `JNI` technique to connect the Mirai.\n- `C++`: [mirai-cpp](https://github.com/cyanray/mirai-cpp) A simple C++ SDK using `mirai-api-http` for ALL platforms.\n- `C++`: [miraipp](https://github.com/Chlorie/miraipp-template) A sophisticated, modern mapping for `mirai-http-api` to C++, providing development documents.\n- `Rust`: [mirai-rs](https://github.com/HoshinoTented/mirai-rs) The Rust mapping for `mirai-http-api`.\n- `TypeScript`: [mirai-ts](https://github.com/YunYouJun/mirai-ts) TypeScript SDK comes with a declaration file, has good code hints, and can also be used as a JavaScript SDK.\n\n### Use as a library\nYou can install mirai as a library into your project.\n\n#### Import with Gradle\n\nMirai is only published on `jcenter`, therefore please ensure you have the `jcenter()` repository added in your `build.gradle`.\n\n```kotlin\nrepositories{\n  jcenter()\n}\n```\n\nThen add dependency to `dependencies` block, following:  \nIf your project is a multiplatform project, you need to add dependencies for each platform respectively.  \nIf your project is not a multiplatform project, add the platform-specific dependency only.\n\nReplace `VERSION` with the newest version, say [![Download](https://api.bintray.com/packages/him188moe/mirai/mirai-core/images/download.svg)](https://bintray.com/him188moe/mirai/mirai-core/)\n\n**jvm**\n```kotlin\nimplementation(\"net.mamoe:mirai-core:VERSION\")\n```\n**common**\n```kotlin\nimplementation(\"net.mamoe:mirai-core-common:VERSION\")\n```\n**android**\n```kotlin\nimplementation(\"net.mamoe:mirai-core-android:VERSION\")\n```\n\n#### Import with Maven\n\n```xml\n<repositories>\n    <repository>\n        <id>jcenter</id>\n        <url>https://jcenter.bintray.com/</url>\n    </repository>\n</repositories>\n```\n\n```xml\n<dependencies>\n    <dependency>\n        <groupId>net.mamoe</groupId>\n        <artifactId>mirai-core-qqandroid</artifactId>\n        <version>0.23.0</version> <!-- Replace to the newest -->\n    </dependency>\n</dependencies>\n```\n\n## Contribution\n**All kinds of contributions are welcomed.**  \nIf you hold an interest in helping us implementing Mirai on JS, iOS or Native platforms, please email us `support@mamoe.net`.  \nIf you meet any problem or have any questions, feel free to file an issue. Our goal is to make Mirai easy to use.\n\n## Acknowledgements\n\nThanks to [JetBrains](https://www.jetbrains.com/?from=mirai) for allocating free open-source licences for IDEs such as [IntelliJ IDEA](https://www.jetbrains.com/idea/?from=mirai).  \n[<img src=\".github/jetbrains-variant-3.png\" width=\"200\"/>](https://www.jetbrains.com/?from=mirai)\n\n## License\n\n    Copyright (C) 2019-2021 Mamoe Technologies and mirai contributors\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "README.md",
    "content": "<div align=\"center\">\n   <img width=\"160\" src=\"docs/mirai.png\" alt=\"logo\"></br>\n\n   <img width=\"95\" src=\"docs/mirai.svg\" alt=\"title\">\n\n----\n\n[![Gitter](https://badges.gitter.im/mamoe/mirai.svg)](https://gitter.im/mamoe/mirai?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)\n[![MiraiForum](https://img.shields.io/badge/post-on%20MiraiForum-yellow)](https://mirai.mamoe.net)\n\nmirai 是一个在全平台下运行，提供 QQ Android 协议支持的高效率机器人库\n\n这个项目的名字来源于\n     <p><a href = \"http://www.kyotoanimation.co.jp/\">京都动画</a>作品<a href = \"https://zh.moegirl.org.cn/zh-hans/%E5%A2%83%E7%95%8C%E7%9A%84%E5%BD%BC%E6%96%B9\">《境界的彼方》</a>的<a href = \"https://zh.moegirl.org.cn/zh-hans/%E6%A0%97%E5%B1%B1%E6%9C%AA%E6%9D%A5\">栗山未来(Kuriyama <b>mirai</b>)</a></p>\n     <p><a href = \"https://www.crypton.co.jp/\">CRYPTON</a>以<a href = \"https://www.crypton.co.jp/miku_eng\">初音未来</a>为代表的创作与活动<a href = \"https://magicalmirai.com/2019/index_en.html\">(Magical <b>mirai</b>)</a></p>\n图标以及形象由画师<a href = \"https://github.com/DazeCake\">DazeCake</a>绘制\n</div>\n\n\n## mirai\n\n**[English](README-eng.md)**  \n\n## 声明\n\n### 一切开发旨在学习，请勿用于非法用途\n\n- mirai 是完全免费且开放源代码的软件，仅供学习和娱乐用途使用\n- mirai 不会通过任何方式强制收取费用，或对使用者提出物质条件\n- mirai 由整个开源社区维护，并不是属于某个个体的作品，所有贡献者都享有其作品的著作权。\n\n### 许可证\n\n    Copyright (C) 2019-2023 Mamoe Technologies and contributors.\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n`mirai` 采用 `AGPLv3` 协议开源。为了整个社区的良性发展，我们**强烈建议**您做到以下几点：\n\n- **间接接触（包括但不限于使用 `Http API` 或 跨进程技术）到 `mirai` 的软件使用 `AGPLv3` 开源**\n- **不鼓励，不支持一切商业使用**\n\n鉴于项目的特殊性，开发团队可能在任何时间**停止更新**或**删除项目**。\n\n### 衍生软件需声明引用\n\n- 若引用 mirai 发布的软件包而不修改 mirai，则衍生项目需在描述或应用内的任意部位提及使用 mirai。\n- 若修改 mirai 源代码再发布，**或参考 mirai 内部实现发布另一个项目**，则衍生项目必须在**文章首部**或 'mirai' 相关内容**首次出现**的位置**明确声明**来源于本仓库 (`https://github.com/mamoe/mirai`)。不得扭曲或隐藏免费且开源的事实。\n\n## 协议支持\n\n<details>\n  <summary>支持的协议列表</summary>\n\n**消息相关**\n\n- 文字\n- 原生表情\n- 商城表情\n- 戳一戳\n- 图片 （自定义表情）\n- XML，JSON 等富文本消息\n- 长消息（5000 字符 + 50 图片）\n- 引用回复\n- 合并转发\n- 撤回\n- 提及群员\n- 提及全体成员\n- 语音\n- 闪照\n- 撤回群员消息\n- 自定义消息\n- 音乐分享\n- 短视频\n\n**群相关**\n- 群列表\n- 成员列表\n- 群员权限\n- 禁言\n- 全体禁言\n- 群公告管理\n- 群设置（自动审批、入群公告、成员邀请、匿名聊天）\n- 处理入群申请\n- 移除群员\n- 群文件\n\n**好友相关**\n- 好友列表\n- 处理新好友申请\n- 删除好友\n\n**其他客户端**\n- 同步其他客户端的消息\n- 向其他客户端发送消息\n\n</details>\n\n#### 不会支持的协议\n- 金钱相关，如点赞、收付款\n- 敏感操作，如主动添加好友、主动加入群、主动邀请好友加群\n- 安全相关，获取账号登录凭证(token，cookie等)\n\n**一切开发旨在学习，请勿用于非法用途**\n\n## 快速使用\n\n- **用户手册**: [UserManual](docs/UserManual.md)\n\n  > 如果你希望快速部署一个 Mirai QQ 机器人，安装插件、并投入使用，请看这里\n- 论坛: [Mirai Forum](https://mirai.mamoe.net/)\n\n  > Mirai 只有**唯一一个**官方论坛 Mirai Forum\n- 在线讨论: [Gitter](https://gitter.im/mamoe/mirai?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)\n\n## 开发相关\n\n- 开发文档: [在 GitHub 阅读](docs/README.md)\n  或 [在 docs.mirai.mamoe.net 阅读](https://docs.mirai.mamoe.net/)\n- 参与贡献: [CONTRIBUTING](docs/contributing/README.md)\n- 更新日志: [release](https://github.com/mamoe/mirai/releases)\n- 开发计划: [milestones](https://github.com/mamoe/mirai/milestones)\n\n- mirai 开发组和官方系列项目: [project-mirai](https://github.com/project-mirai)\n- mirai 社区相关项目 (\n  旧): [awesome-mirai](https://github.com/project-mirai/awsome-mirai/blob/master/README.md)\n\n\n## 赞助\n- 本着与更多 mirai 开发者、用户、支持者共建更好的学习环境为目的，mirai 自 2021 年 3 月 1 日发起官方社区的建设。社区建设可能涉及：[学习论坛](https://mirai.mamoe.net)、[插件中心（在建）](https://github.com/project-mirai/mirai-plugin-center)等。由于社区的运维需要经费，mirai 项目开启 sponsor 功能。\n- 请注意，赞助是全自愿的。赞助者不会获得特权，不赞助也可以使用全部的功能。为资金管理方便，赞助后不设退款、折现等选项。最终解释权归社区运营团队所有。\n- 全部赞助金额、流向、票据单号等将<a href=\"https://github.com/project-mirai/mirai-sponsor/tree/main\">透明化公示</a>，欢迎任何人随时查看及提出建议。\n\n\n## 鸣谢\n\n> [IntelliJ IDEA](https://zh.wikipedia.org/zh-hans/IntelliJ_IDEA) 是一个在各个方面都最大程度地提高开发人员的生产力的 IDE，适用于 JVM 平台语言。\n\n特别感谢 [JetBrains](https://www.jetbrains.com/?from=mirai) 为开源项目提供免费的 [IntelliJ IDEA](https://www.jetbrains.com/idea/?from=mirai) 等 IDE 的授权  \n[<img src=\".github/jetbrains-variant-3.png\" width=\"200\"/>](https://www.jetbrains.com/?from=mirai)\n"
  },
  {
    "path": "build.gradle.kts",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"UnstableApiUsage\", \"UNUSED_VARIABLE\", \"NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS\")\n\nimport org.jetbrains.dokka.base.DokkaBase\nimport org.jetbrains.dokka.base.DokkaBaseConfiguration\nimport shadow.configureMppShadow\nimport java.time.LocalDateTime\n\nbuildscript {\n    repositories {\n        if (System.getProperty(\"use.maven.local\") == \"true\") {\n            mavenLocal()\n        }\n\n        mavenCentral()\n        gradlePluginPortal()\n        google()\n    }\n\n    dependencies {\n        classpath(\"com.android.tools.build:gradle:${Versions.androidGradlePlugin}\")\n        classpath(\"org.jetbrains.kotlinx:atomicfu-gradle-plugin:${Versions.atomicFU}\")\n        classpath(\"org.jetbrains.dokka:dokka-base:${Versions.dokka}\")\n    }\n}\n\nplugins {\n    kotlin(\"jvm\") apply false // version Versions.kotlinCompiler\n    kotlin(\"plugin.serialization\") version Versions.kotlinCompiler apply false\n    id(\"com.google.osdetector\")\n    id(\"org.jetbrains.dokka\") version Versions.dokka\n    id(\"me.him188.kotlin-jvm-blocking-bridge\") version Versions.blockingBridge\n    id(\"me.him188.kotlin-dynamic-delegation\") version Versions.dynamicDelegation apply false\n    id(\"me.him188.maven-central-publish\") version Versions.mavenCentralPublish apply false\n    id(\"com.gradle.plugin-publish\") version \"1.1.0\" apply false\n    id(\"org.jetbrains.kotlinx.binary-compatibility-validator\") version Versions.binaryValidator apply false\n    id(\"com.android.library\") apply false\n    id(\"de.mannodermaus.android-junit5\") version \"1.8.2.1\" apply false\n}\n\nosDetector = osdetector\nBuildSrcRootProjectHolder.value = rootProject\nBuildSrcRootProjectHolder.lastUpdateTime = System.currentTimeMillis()\n\nanalyzes.CompiledCodeVerify.run { registerAllVerifyTasks() }\n\nallprojects {\n    group = \"net.mamoe\"\n    version = Versions.project\n\n    repositories {\n        if (System.getProperty(\"use.maven.local\") == \"true\") {\n            mavenLocal()\n        }\n\n        mavenCentral()\n        gradlePluginPortal()\n        google()\n    }\n\n    preConfigureJvmTarget()\n    afterEvaluate {\n        configureJvmTarget()\n        configureMppShadow()\n        configureEncoding()\n        configureKotlinTestSettings()\n        configureKotlinOptIns()\n\n        if (isKotlinJvmProject) {\n            configureFlattenSourceSets()\n        }\n        configureJarManifest()\n        substituteDependenciesUsingExpectedVersion()\n    }\n}\n\nsubprojects {\n    afterEvaluate {\n        if (project.path == \":mirai-core-api\") configureDokka()\n        if (project.path == \":mirai-console\") configureDokka()\n    }\n}\nrootProject.configureDokka()\n\ntasks.register(\"cleanExceptIntellij\") {\n    group = \"build\"\n    allprojects.forEach { proj ->\n        if (proj.name != \"mirai-console-intellij\") {\n\n            // Type mismatch\n            // proj.tasks.findByName(\"clean\")?.let(::dependsOn)\n\n            proj.tasks.findByName(\"clean\")?.let { dependsOn(it) }\n        }\n    }\n}\n\nextensions.findByName(\"buildScan\")?.withGroovyBuilder {\n    setProperty(\"termsOfServiceUrl\", \"https://gradle.com/terms-of-service\")\n    setProperty(\"termsOfServiceAgree\", \"yes\")\n}\n\nfun Project.configureDokka() {\n    val isRoot = this@configureDokka == rootProject\n    if (!isRoot) {\n        apply(plugin = \"org.jetbrains.dokka\")\n    }\n\n    tasks.withType<org.jetbrains.dokka.gradle.AbstractDokkaTask>().configureEach {\n        pluginConfiguration<DokkaBase, DokkaBaseConfiguration> {\n            this.footerMessage = \"\"\"Copyright 2019-${\n                LocalDateTime.now().year\n            } <a href=\"https://github.com/mamoe\">Mamoe Technologies</a> and contributors.\n            Source code:\n            <a href=\"https://github.com/mamoe/mirai\">GitHub</a>\n            \"\"\".trimIndent()\n\n            this.customAssets = listOf(\n                rootProject.projectDir.resolve(\"mirai-dokka/frontend/ext.js\"),\n            )\n        }\n    }\n\n    tasks.withType<org.jetbrains.dokka.gradle.DokkaTask>().configureEach {\n        dokkaSourceSets.configureEach {\n            perPackageOption {\n                matchingRegex.set(\"net\\\\.mamoe\\\\.mirai\\\\.*\")\n                skipDeprecated.set(true)\n            }\n\n            for (suppressedPackage in arrayOf(\n                \"\"\"net.mamoe.mirai.internal\"\"\",\n                \"\"\"net.mamoe.mirai.internal.message\"\"\",\n                \"\"\"net.mamoe.mirai.internal.network\"\"\",\n                \"\"\"net.mamoe.mirai.console.internal\"\"\",\n                \"\"\"net.mamoe.mirai.console.compiler.common\"\"\"\n            )) {\n                perPackageOption {\n                    matchingRegex.set(suppressedPackage.replace(\".\", \"\\\\.\"))\n                    suppress.set(true)\n                }\n            }\n        }\n    }\n\n    if (isRoot) {\n        tasks.named<org.jetbrains.dokka.gradle.AbstractDokkaTask>(\"dokkaHtmlMultiModule\").configure {\n            outputDirectory.set(\n                rootProject.projectDir.resolve(\"mirai-dokka/pages/snapshot\")\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "buildSrc/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nplugins {\n    `kotlin-dsl`\n}\n\nrepositories {\n    mavenLocal()\n    google()\n    mavenCentral()\n    gradlePluginPortal()\n}\n\nkotlin {\n    sourceSets.all {\n        languageSettings.optIn(\"kotlin.Experimental\")\n        languageSettings.optIn(\"kotlin.RequiresOptIn\")\n        languageSettings.optIn(\"kotlin.ExperimentalStdlibApi\")\n    }\n}\n\n\nprivate val versionsText = project.projectDir.resolve(\"src/main/kotlin/Versions.kt\").readText()\nfun version(name: String): String {\n\n    return versionsText.lineSequence()\n        .map { it.trim() }\n        .single { it.startsWith(\"const val $name \") }\n        .substringAfter('\"', \"\")\n        .substringBefore('\"', \"\")\n        .also {\n            check(it.isNotBlank())\n            logger.debug(\"$name=$it\")\n        }\n}\n\ndependencies {\n    val asmVersion = version(\"asm\")\n    fun asm(module: String) = \"org.ow2.asm:asm-$module:$asmVersion\"\n\n    fun kotlinx(id: String, version: String) = \"org.jetbrains.kotlinx:kotlinx-$id:$version\"\n    fun ktor(id: String, version: String) = \"io.ktor:ktor-$id:$version\"\n\n    // compileOnly(kotlin(\"gradle-plugin-api\", \"1.3.72\")) // Gradle's Kotlin is 1.3.72\n\n    // api(\"com.github.jengelman.gradle.plugins\", \"shadow\", version(\"shadow\"))\n    api(\"com.github.johnrengelman\", \"shadow\", version(\"shadow\"))\n\n    api(\"org.jetbrains.kotlin\", \"kotlin-gradle-plugin\", version(\"kotlinCompiler\")) {\n        exclude(\"org.jetbrains.kotlin\", \"kotlin-stdlib\")\n        exclude(\"org.jetbrains.kotlin\", \"kotlin-stdlib-common\")\n        exclude(\"org.jetbrains.kotlin\", \"kotlin-reflect\")\n    }\n//    api(\"org.jetbrains.kotlin\", \"kotlin-compiler-embeddable\", version(\"kotlinCompiler\"))\n//    api(ktor(\"client-okhttp\", \"1.4.3\"))\n    api(\"com.android.tools.build\", \"gradle\", version(\"androidGradlePlugin\"))\n    api(asm(\"tree\"))\n    api(asm(\"util\"))\n    api(asm(\"commons\"))\n    api(\"org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2\") {\n        exclude(\"org.jetbrains.kotlin\", \"kotlin-stdlib\")\n        exclude(\"org.jetbrains.kotlin\", \"kotlin-reflect\")\n        exclude(\"org.jetbrains.kotlin\", \"kotlin-stdlib-common\")\n    }\n\n    // https://mvnrepository.com/artifact/com.android.library/com.android.library.gradle.plugin\n    api(\"com.android.library:com.android.library.gradle.plugin:${version(\"androidGradlePlugin\")}\")\n    api(\"com.google.code.gson:gson:2.10.1\")\n\n    api(\"gradle.plugin.com.google.gradle:osdetector-gradle-plugin:1.7.0\")\n\n    api(gradleApi())\n}"
  },
  {
    "path": "buildSrc/settings.gradle.kts",
    "content": "/*\n * Copyright 2019-2020 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/Android.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"UNUSED_VARIABLE\")\n\nimport com.android.build.api.dsl.LibraryExtension\nimport org.gradle.api.JavaVersion\nimport org.gradle.api.Project\nimport org.gradle.api.tasks.testing.Test\nimport org.gradle.kotlin.dsl.*\nimport org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension\nimport org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType\nimport java.util.*\n\nconst val PROP_MIRAI_ENABLE_ANDROID_INSTRUMENTED_TESTS = \"mirai.enable.android.instrumented.tests\"\n\n/**\n * Use [usingAndroidInstrumentedTests] instead.\n */\nval ENABLE_ANDROID_INSTRUMENTED_TESTS by projectLazy {\n    val name = PROP_MIRAI_ENABLE_ANDROID_INSTRUMENTED_TESTS\n    (System.getProperty(name)\n        ?: System.getenv(name)\n        ?: rootProject.getLocalProperty(name)\n        ?: \"true\").toBooleanStrict()\n}\n\nval Project.usingAndroidInstrumentedTests\n    get() = ENABLE_ANDROID_INSTRUMENTED_TESTS && isAndroidSdkAvailable\n\nfun Project.configureAndroidTarget(androidNamespace: String) {\n    if (ENABLE_ANDROID_INSTRUMENTED_TESTS && !isAndroidSdkAvailable) {\n        if (!ProjectAndroidSdkAvailability.tryFixAndroidSdk(this)) {\n            printAndroidNotInstalled()\n        }\n    }\n\n    extensions.getByType(KotlinMultiplatformExtension::class.java).apply {\n        if (project.usingAndroidInstrumentedTests) {\n            configureAndroidTargetWithSdk(androidNamespace)\n        } else {\n            configureAndroidTargetWithJvm()\n        }\n    }\n}\n\nprivate fun Project.configureAndroidTargetWithJvm() {\n    extensions.getByType(KotlinMultiplatformExtension::class.java).apply {\n        jvm(\"android\") {\n            attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.androidJvm)\n\n            if (IDEA_ACTIVE) {\n                attributes.attribute(MIRAI_PLATFORM_ATTRIBUTE, \"android\") // workaround for IDE bug\n            }\n        }\n\n        val jvmBaseMain by sourceSets.getting\n        val jvmBaseTest by sourceSets.getting\n\n        sourceSets.getByName(\"androidTest\").configureJvmTest(\"configureAndroidTargetWithJvm\")\n        sourceSets.getByName(\"androidTest\").kotlin.srcDir(projectDir.resolve(\"src/androidUnitTest/kotlin\"))\n        sourceSets.getByName(\"androidTest\").dependsOn(jvmBaseTest)\n\n        sourceSets.getByName(\"androidMain\").apply {\n            dependencies {\n                compileOnly(`android-runtime`)\n            }\n            dependsOn(jvmBaseMain)\n        }\n\n        tasks.all {\n            if (this.name == \"androidTest\") {\n                this as Test\n                this.environment(PROP_MIRAI_ANDROID_SDK_KIND, \"jdk\")\n            }\n        }\n    }\n}\n\nprivate const val PROP_MIRAI_ANDROID_SDK_KIND = \"mirai.android.sdk.kind\"\n\n@Suppress(\"UnstableApiUsage\")\nprivate fun Project.configureAndroidTargetWithSdk(androidNamespace: String) {\n    apply(plugin = \"com.android.library\")\n    apply(plugin = \"de.mannodermaus.android-junit5\")\n    extensions.getByType(LibraryExtension::class).apply {\n        namespace = androidNamespace\n    }\n    extensions.getByType(KotlinMultiplatformExtension::class.java).apply {\n        android {\n            publishLibraryVariants(\"release\", \"debug\")\n        }\n\n        val jvmBaseMain = sourceSets.maybeCreate(\"jvmBaseMain\")\n        val jvmBaseTest = sourceSets.maybeCreate(\"jvmBaseTest\")\n\n        val androidMain by sourceSets.getting\n        androidMain.dependsOn(jvmBaseMain)\n\n        // don't use androidTest, deprecated by Kotlin\n\n        // this can cause problems on sync\n//                for (s in arrayOf(\"androidDebug\", \"androidRelease\")) {\n//                    sourceSets.all { if (name in s) dependsOn(androidMain) }\n//                }\n\n//                 we should have added a \"androidBaseTest\" (or \"androidTest\") for \"androidUnitTest\" and \"androidInstrumentedTest\",\n//                 but this currently cause bugs in IntelliJ (2023.2)\n//                val androidBaseTest = sourceSets.maybeCreate(\"androidBaseTest\").apply {\n//                    dependsOn(jvmBaseTest)\n//                }\n        val androidUnitTest by sourceSets.getting {\n            dependsOn(jvmBaseTest)\n        }\n//                for (s in arrayOf(\"androidUnitTestDebug\", \"androidUnitTestRelease\")) {\n//                    sourceSets.all { if (name in s) dependsOn(androidUnitTest) }\n//                }\n        val androidInstrumentedTest by sourceSets.getting {\n            dependsOn(jvmBaseTest)\n        }\n//                for (s in arrayOf(\"androidInstrumentedTestDebug\")) {\n//                    sourceSets.all { if (name in s) dependsOn(androidInstrumentedTest) }\n//                }\n\n//                afterEvaluate {\n////                    > androidDebug dependsOn commonMain\n////                    androidInstrumentedTest dependsOn jvmBaseTest\n////                    androidInstrumentedTestDebug dependsOn\n////                    androidMain dependsOn commonMain, jvmBaseMain\n////                    androidRelease dependsOn commonMain\n////                    androidUnitTest dependsOn commonTest, jvmBaseTest\n////                    androidUnitTestDebug dependsOn commonTest\n////                    androidUnitTestRelease dependsOn commonTest\n//                    error(this@apply.sourceSets.joinToString(\"\\n\") {\n//                        it.name + \" dependsOn \" + it.dependsOn.joinToString { it.name }\n//                    })\n//                }\n\n        configure(\n            listOf(\n                sourceSets.getByName(\"androidInstrumentedTest\"),\n                sourceSets.getByName(\"androidUnitTest\"),\n            )\n        ) {\n            dependencies { implementation(kotlin(\"test-annotations-common\"))?.because(\"configureAndroidTargetWithSdk\") }\n        }\n\n        tasks.all {\n            if (this.name == \"testDebugUnitTest\" || this.name == \"testReleaseUnitTest\") {\n                this as Test\n                this.environment(PROP_MIRAI_ANDROID_SDK_KIND, \"adk\")\n            }\n        }\n    }\n\n    // trick for compiler bug\n    this.sourceSets.apply {\n        removeIf { it.name == \"androidAndroidTestRelease\" }\n        removeIf { it.name == \"androidTestFixtures\" }\n        removeIf { it.name == \"androidTestFixturesDebug\" }\n        removeIf { it.name == \"androidTestFixturesRelease\" }\n    }\n\n    extensions.getByType(LibraryExtension::class.java).apply {\n        compileSdk = 33\n        sourceSets[\"main\"].manifest.srcFile(\"src/androidMain/AndroidManifest.xml\")\n        defaultConfig {\n            minSdk = rootProject.extra[\"mirai.android.target.api.level\"]!!.toString().toInt()\n            targetSdk = 33\n        }\n        compileOptions {\n            sourceCompatibility = JavaVersion.VERSION_1_8\n            targetCompatibility = JavaVersion.VERSION_1_8\n        }\n        buildTypes.getByName(\"release\") {\n            isMinifyEnabled = false\n            isShrinkResources = false\n            proguardFiles(\n                getDefaultProguardFile(\"proguard-android-optimize.txt\"),\n            )\n        }\n    }\n\n    extensions.getByType(LibraryExtension::class.java).apply {\n        defaultConfig {\n            // 1) Make sure to use the AndroidJUnitRunner, or a subclass of it. This requires a dependency on androidx.test:runner, too!\n            testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n            // 2) Connect JUnit 5 to the runner\n            testInstrumentationRunnerArguments[\"runnerBuilder\"] = \"de.mannodermaus.junit5.AndroidJUnit5Builder\"\n        }\n    }\n\n//        val sourceSets = arrayOf(\"androidInstrumentedTest\", \"androidUnitTest\")\n//            .map { kotlin.sourceSets.getByName(it) }\n\n//        for (sourceSet in sourceSets) {\n//            sourceSet.dependencies {\n//                implementation(\"androidx.test:runner:1.5.2\")\n//                implementation(\"org.junit.jupiter:junit-jupiter-api:5.9.2\")\n//                runtimeOnly(\"org.junit.jupiter:junit-jupiter-engine:5.8.2\")\n//\n//                implementation(\"de.mannodermaus.junit5:android-test-core:1.3.0\")\n//                implementation(\"de.mannodermaus.junit5:android-test-runner:1.3.0\")\n//            }\n//        }\n\n    dependencies {\n        // 4) Jupiter API & Test Runner, if you don't have it already\n        \"androidTestImplementation\"(\"androidx.test:runner:1.5.2\")\n        \"androidTestImplementation\"(\"org.junit.jupiter:junit-jupiter-api:${Versions.junit}\")\n        \"androidTestRuntimeOnly\"(\"org.junit.jupiter:junit-jupiter-engine:${Versions.junit}\")\n\n        // 5) The instrumentation test companion libraries\n        \"androidTestImplementation\"(\"de.mannodermaus.junit5:android-test-core:1.3.0\")\n        \"androidTestRuntimeOnly\"(\"de.mannodermaus.junit5:android-test-runner:1.3.0\")\n    }\n}\n\nprivate fun Project.printAndroidNotInstalled() {\n    logger.warn(\n        \"\"\"\n            你设置了启用 Android Instrumented Test, 但是未配置 Android SDK. $name 的 Android 目标将会使用桌面 JVM 编译和测试. \n            Android Instrumented Test 将不会进行. 这不会影响 Android 以外的平台的编译和测试. \n            \n            如果你要给 mirai PR 并且你修改了 Android 部分, 建议解决此警告. \n            如果你没有修改 Android 部分, 则可以忽略, 或者在项目根目录 local.properties (如果不存在就创建一个) 添加 `$PROP_MIRAI_ENABLE_ANDROID_INSTRUMENTED_TESTS=false`.\n            \n            在安装 Android SDK 后, 请在项目根目录 local.properties 中添加 `sdk.dir=/path/to/Android/sdk` 指向本机 Android SDK 安装路径.\n            \n            若要关闭 Android Instrumented Test, 在项目根目录 local.properties 添加 `$PROP_MIRAI_ENABLE_ANDROID_INSTRUMENTED_TESTS=false`.\n            -------\n            \"\"\".trimIndent()\n    )\n//    logger.warn(\n//        \"\"\"Android SDK might not be installed. Android target of $name will not be compiled. It does no influence on the compilation of other platforms.\n//            \"\"\".trimIndent()\n//    )\n}\n\n\nprivate object ProjectAndroidSdkAvailability {\n    val map: MutableMap<String, Boolean> by projectLazy { mutableMapOf() }\n\n    @Synchronized\n    operator fun get(project: Project): Boolean {\n        if (map[project.path] != null) return map[project.path]!!\n\n        val projectAvailable = project.runCatching {\n            val keyProps = Properties().apply {\n                file(\"local.properties\").takeIf { it.exists() }?.inputStream()?.use { load(it) }\n            }\n            keyProps.getProperty(\"sdk.dir\", \"\").isNotEmpty()\n        }.getOrElse { false }\n\n\n        fun impl(): Boolean {\n            if (project === project.rootProject) return projectAvailable\n            return projectAvailable || get(project.rootProject)\n        }\n        map[project.path] = impl()\n        return map[project.path]!!\n    }\n\n    fun tryFixAndroidSdk(project: Project): Boolean {\n        val androidHome = System.getenv(\"ANDROID_HOME\") ?: kotlin.run {\n            project.logger.info(\"tryFixAndroidSdk: environment `ANDROID_HOME` does not exist\")\n            return false\n        }\n\n        val escaped = androidHome\n            .replace(\"\"\":\"\"\", \"\"\"\\:\"\"\")\n            .replace(\"\"\"\\\"\"\", \"\"\"\\\\\"\"\")\n            .trim()\n\n        project.rootDir.resolve(\"local.properties\")\n            .apply { if (!exists()) createNewFile() }\n            .appendText(\"sdk.dir=$escaped\")\n\n        project.logger.info(\"tryFixAndroidSdk: fixed sdk.dir in local.properties: $escaped\")\n\n        map.clear()\n        return get(project)\n    }\n}\n\nprivate val Project.isAndroidSdkAvailable: Boolean get() = ProjectAndroidSdkAvailability[this]\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/BinaryCompatibilityConfigurator.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nimport org.gradle.api.Project\nimport org.gradle.configurationcache.extensions.useToRun\nimport java.io.File\n\n/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nobject BinaryCompatibilityConfigurator {\n    fun Project.configureBinaryValidators(targetNames: Set<String>) {\n        targetNames.forEach { configureBinaryValidator(it) }\n    }\n\n\n    fun Project.configureBinaryValidator(targetName: String?) {\n        val validationDir = projectDir.resolve(\"compatibility-validation\")\n\n        val dir = validationDir.resolve(targetName ?: \"jvm\")\n        dir.mkdirs()\n        createValidator(this, dir, targetName)\n        val apiDumpAll = tasks.maybeCreate(\"apiDumpAll\").apply {\n            group = \"mirai\"\n        }\n        val apiCheckAll = tasks.maybeCreate(\"apiCheckAll\").apply {\n            group = \"mirai\"\n        }\n\n        project.afterEvaluate {\n            val validatorProject = findProject(getValidatorDir(dir))\n            validatorProject?.afterEvaluate {\n                tasks.getByName(\"apiDump\").let { apiDumpAll.dependsOn(it) }\n            }\n\n            validatorProject?.afterEvaluate {\n                tasks.getByName(\"apiCheck\").let { apiCheckAll.dependsOn(it) }\n            }\n\n        }\n    }\n\n    // Also change: settings.gradle.kts:116\n    private fun Project.getValidatorDir(dir: File) = \":validator\" + project.path + \"-validator:${dir.name}\"\n\n    private fun File.writeTextIfNeeded(text: String) {\n        if (!this.exists()) return this.writeText(text)\n        if (this.readText() == text) return\n        return this.writeText(text)\n    }\n\n    /**\n     * @param targetName `null` for JVM projects.\n     */\n    fun createValidator(project: Project, dir: File, targetName: String?) {\n        dir.resolve(\"build.gradle.kts\").writeTextIfNeeded(\n            applyTemplate(\n                project.path,\n                listOfNotNull(\n                    if (targetName == null) \"classes/kotlin/main\" else \"classes/kotlin/$targetName/main\",\n                    if (targetName?.contains(\"android\") == true && project.usingAndroidInstrumentedTests) \"tmp/kotlin-classes/debug\" else \"\"\n                )\n            )\n        )\n        dir.resolve(\".gitignore\").writeTextIfNeeded(\n            this::class.java.classLoader\n                .getResourceAsStream(\"binary-compatibility-validator-ignore.txt\")!!.readBytes().decodeToString()\n        )\n\n        project.afterEvaluate {\n            findProject(getValidatorDir(dir))\n                ?.afterEvaluate {\n                    if (targetName == null) {\n                        tasks.findByName(\"apiBuild\")?.dependsOn(\n                            *listOfNotNull(\n                                project.tasks.getByName(\"jar\"),\n                                project.tasks.findByName(\"compileDebugKotlinAndroid\")\n                            ).toTypedArray()\n                        )\n                    } else {\n                        tasks.findByName(\"apiBuild\")?.dependsOn(\n                            if (targetName.contains(\"android\") && ENABLE_ANDROID_INSTRUMENTED_TESTS) {\n                                project.tasks.getByName(\"bundleDebugAar\")\n                            } else {\n                                project.tasks.getByName(\"${targetName}Jar\")\n                            }\n                        )\n                    }\n                }\n        }\n    }\n\n    fun applyTemplate(projectPath: String, buildDirs: List<String>): String {\n        return this::class.java.classLoader\n            .getResourceAsStream(\"binary-compatibility-validator-build.txt\")!!\n            .useToRun { readBytes() }\n            .decodeToString()\n            .replace(\"$\\$PROJECT_PATH$$\", projectPath)\n            .replace(\"$\\$BUILD_DIR$$\", buildDirs.joinToString(\"\\n\"))\n            .replace(\"$\\$PLUGIN_VERSION$$\", Versions.binaryValidator)\n    }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/DependencyDumper.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nimport org.gradle.api.Project\nimport org.gradle.api.Task\nimport org.gradle.api.artifacts.ResolvedDependency\nimport org.gradle.api.tasks.TaskProvider\nimport java.io.File\nimport java.util.zip.ZipFile\n\nobject DependencyDumper {\n    fun registerDumpTask(project: Project, confName: String, out: File): TaskProvider<Task> {\n        return regDmpTask(project, confName) { deps ->\n            deps.forEach { println(\"  `- $it\") }\n            out.writeText(deps.joinToString(\"\\n\", postfix = \"\\n\"))\n        }\n    }\n\n    fun registerDumpTaskKtSrc(project: Project, confName: String, out: File, className: String): TaskProvider<Task> {\n        val pkgName = className.substringBeforeLast(\".\")\n        val kname = className.substringAfterLast(\".\")\n        return regDmpTask(project, confName) { deps ->\n            out.printWriter().use { pr ->\n                pr.println(\"package $pkgName\")\n                pr.println()\n                pr.println(\"internal object $kname {\")\n                pr.println(\"    val dependencies: List<String> = listOf(\")\n                deps.forEach { dependency ->\n                    pr.append(\"      \\\"\").append(dependency).println(\"\\\",\")\n                }\n                pr.println(\"    )\")\n                pr.println(\"}\")\n            }\n        }\n    }\n\n    private fun regDmpTask(project: Project, confName: String, action: (List<String>) -> Unit): TaskProvider<Task> {\n        val dependenciesDump = project.tasks.maybeCreate(\"dependenciesDump\")\n        dependenciesDump.group = \"mirai\"\n        return project.tasks.register(\"dependenciesDump_${confName.capitalize()}\") {\n            group = \"mirai\"\n            doLast {\n                val dependencies = HashSet<String>()\n                fun emit(dep: ResolvedDependency) {\n                    if (dependencies.add(dep.moduleGroup + \":\" + dep.moduleName)) {\n                        dep.children.forEach { emit(it) }\n                    }\n                }\n                project.configurations.getByName(confName).resolvedConfiguration.firstLevelModuleDependencies.forEach { dependency ->\n                    emit(dependency)\n                }\n                val stdep = dependencies.toMutableList()\n                stdep.sort()\n                action(stdep)\n            }\n        }.also { dependenciesDump.dependsOn(it) }\n    }\n\n    fun registerDumpClassGraph(project: Project, confName: String, out: String): TaskProvider<Task> {\n        val dependenciesDump = project.tasks.maybeCreate(\"dependenciesDump\")\n        dependenciesDump.group = \"mirai\"\n        return project.tasks.register(\"dependenciesDumpGraph_${confName.capitalize()}\") {\n            group = \"mirai\"\n            val outFile = temporaryDir.resolve(out)\n            outputs.file(outFile)\n            val conf = project.configurations.getByName(confName)\n\n            doLast {\n                outFile.parentFile.mkdirs()\n\n                val classes = HashSet<String>()\n                conf.resolvedConfiguration.files.forEach { file ->\n                    if (file.isFile) {\n                        ZipFile(file).use { zipFile ->\n                            zipFile.entries().asSequence()\n                                .filter { it.name.endsWith(\".class\") }\n                                .filterNot { it.name.startsWith(\"META-INF\") }\n                                .map { it.name.substringBeforeLast('.').replace('/', '.') }\n                                .map { it.removePrefix(\".\") }\n                                .forEach { classes.add(it) }\n                        }\n                    } else if (file.isDirectory) {\n                        file.walk()\n                            .filter { it.isFile }\n                            .filter { it.name.endsWith(\".class\") }\n                            .map { it.relativeTo(file).path.substringBeforeLast('.') }\n                            .map { it.replace('\\\\', '.').replace('/', '.') }\n                            .map { it.removePrefix(\".\") }\n                            .forEach { classes.add(it) }\n                    }\n                }\n                outFile.bufferedWriter().use { writer ->\n                    classes.sorted().forEach { writer.append(it).append('\\n') }\n                }\n            }\n        }.also { dependenciesDump.dependsOn(it) }\n    }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/HmppConfigure.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nimport com.google.gradle.osdetector.OsDetector\nimport org.gradle.api.Project\nimport org.gradle.api.attributes.Attribute\nimport org.gradle.kotlin.dsl.getting\nimport org.gradle.kotlin.dsl.provideDelegate\nimport org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension\nimport org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType\n\nval MIRAI_PLATFORM_ATTRIBUTE: Attribute<String> = Attribute.of(\n    \"net.mamoe.mirai.platform\", String::class.java\n)\n\n/**\n * Flags a target as an HMPP intermediate target\n */\nval MIRAI_PLATFORM_INTERMEDIATE: Attribute<Boolean> = Attribute.of(\n    \"net.mamoe.mirai.platform.intermediate\", Boolean::class.javaObjectType\n)\n\nval IDEA_ACTIVE = System.getProperty(\"idea.active\") == \"true\" && System.getProperty(\"publication.test\") != \"true\"\n\nval OS_NAME = System.getProperty(\"os.name\").lowercase()\n\nlateinit var osDetector: OsDetector\n\n\n// aarch = arm\nval OsDetector.isAarch\n    get() = osDetector.arch.run {\n        contains(\"aarch\", ignoreCase = true) || contains(\"arm\", ignoreCase = true)\n    }\n\n@Suppress(\"ClassName\")\nsealed class HostKind(\n    val targetName: String\n) {\n    object LINUX : HostKind(\"linuxX64\")\n    object WINDOWS : HostKind(\"mingwX64\")\n\n    abstract class MACOS(targetName: String) : HostKind(targetName)\n\n    object MACOS_X64 : MACOS(\"macosX64\")\n    object MACOS_ARM64 : MACOS(\"macosArm64\")\n}\n\nval HOST_KIND by lazy {\n    when {\n        OS_NAME.contains(\"windows\", true) -> HostKind.WINDOWS\n        OS_NAME.contains(\"mac\", true) -> {\n            if (osDetector.isAarch) {\n                HostKind.MACOS_ARM64\n            } else {\n                HostKind.MACOS_X64\n            }\n        }\n\n        else -> HostKind.LINUX\n    }\n}\n\n/// eg. \"!a;!b\" means to enable all targets but a or b\n/// eg. \"a;b;!other\" means to disable all targets but a or b\nval ENABLED_TARGETS by projectLazy {\n\n    val targets = getMiraiTargetFromGradle() // enable all by default\n\n    targets.split(';').toSet()\n}\n\nfun getMiraiTargetFromGradle() =\n    System.getProperty(\"mirai.target\")\n        ?: System.getenv(\"mirai.target\")\n        ?: rootProject.getLocalProperty(\"projects.mirai-core.targets\")\n        ?: \"others\"\n\nfun isTargetEnabled(name: String): Boolean {\n    return when {\n        name in ENABLED_TARGETS -> true // explicitly enabled\n        \"!$name\" in ENABLED_TARGETS -> false // explicitly disabled\n        \"~$name\" in ENABLED_TARGETS -> false // explicitly disabled\n\n        \"!other\" in ENABLED_TARGETS -> false // others disabled\n        \"~other\" in ENABLED_TARGETS -> false // others disabled\n        \"!others\" in ENABLED_TARGETS -> false // others disabled\n        \"~others\" in ENABLED_TARGETS -> false // others disabled\n        else -> true\n    }\n}\n\nfun Set<String>.filterTargets() =\n    this.filter { isTargetEnabled(it) }.toSet()\n\nconst val JVM_TOOLCHAIN_VERSION = 8\n\nval JVM_TOOLCHAIN_ENABLED by projectLazy {\n    rootProject.getLocalProperty(\"mirai.enable.jvmtoolchain.special\", true)\n}\n\n/**\n * ## Android Test 结构\n *\n * 如果[启用 Android Instrumented Test][ENABLE_ANDROID_INSTRUMENTED_TESTS], 将会配置使用 Android SDK 配置真 Android target,\n * `androidMain` 将能访问 Android SDK, 也能获得针对 Android 的 IDE 错误检查.\n */\nfun Project.configureJvmTargetsHierarchical(androidNamespace: String) {\n    extensions.getByType(KotlinMultiplatformExtension::class.java).apply {\n        if (JVM_TOOLCHAIN_ENABLED) {\n            jvmToolchain(JVM_TOOLCHAIN_VERSION)\n        }\n\n        val commonMain by sourceSets.getting\n        val commonTest by sourceSets.getting\n\n        if (IDEA_ACTIVE) {\n            jvm(\"jvmBase\") { // dummy target for resolution, not published\n                compilations.all {\n                    // magic to help IDEA\n                    this.compileTaskProvider.configure {\n                        enabled = false\n                    }\n                }\n                attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.common) // magic\n\n                // avoid resolution when other modules dependsOn this project\n                attributes.attribute(MIRAI_PLATFORM_ATTRIBUTE, \"jvmBase\")\n                attributes.attribute(MIRAI_PLATFORM_INTERMEDIATE, true) // no shadow\n            }\n        } else {\n            // if not in IDEA, no need to create intermediate targets.\n        }\n\n        val jvmBaseMain by lazy {\n            sourceSets.maybeCreate(\"jvmBaseMain\").apply {\n                dependsOn(commonMain)\n            }\n        }\n        val jvmBaseTest by lazy {\n            sourceSets.maybeCreate(\"jvmBaseTest\").apply {\n                dependsOn(commonTest)\n            }\n        }\n\n        if (isTargetEnabled(\"android\")) {\n            configureAndroidTarget(androidNamespace)\n        }\n\n        if (isTargetEnabled(\"jvm\")) {\n            jvm(\"jvm\")\n            val jvmMain by sourceSets.getting\n            val jvmTest by sourceSets.getting\n            jvmMain.dependsOn(jvmBaseMain)\n            jvmTest.dependsOn(jvmBaseTest)\n        }\n    }\n}\n\nfun String.titlecase(): String {\n    if (this.isEmpty()) return this\n    val c = get(0)\n    return replaceFirst(c, Character.toTitleCase(c))\n}"
  },
  {
    "path": "buildSrc/src/main/kotlin/JvmDependencies.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n\n@file:Suppress(\"NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS\")\n\nimport org.gradle.api.artifacts.ExternalModuleDependency\nimport org.gradle.api.artifacts.dsl.DependencyHandler\nimport org.gradle.kotlin.dsl.accessors.runtime.addDependencyTo\n\n@Suppress(\"unused\")\nfun DependencyHandler.compileAndTestRuntime(any: Any) {\n    add(\"compileOnly\", any)\n    add(\"testImplementation\", any)\n}\n\nfun DependencyHandler.smartApi(\n    dependencyNotation: String\n): ExternalModuleDependency {\n    return smart(\"api\", dependencyNotation)\n}\n\nfun DependencyHandler.smartImplementation(\n    dependencyNotation: String\n): ExternalModuleDependency {\n    return smart(\"implementation\", dependencyNotation)\n}\n\nprivate fun DependencyHandler.smart(\n    configuration: String,\n    dependencyNotation: String\n): ExternalModuleDependency {\n    return addDependencyTo(\n        this, configuration, dependencyNotation\n    ) {\n        fun exclude(group: String, module: String) {\n            exclude(\n                mapOf(\n                    \"group\" to group,\n                    \"module\" to module\n                )\n            )\n        }\n        exclude(\"org.jetbrains.kotlin\", \"kotlin-stdlib-jdk8\")\n        exclude(\"org.jetbrains.kotlin\", \"kotlin-stdlib\")\n        exclude(\"org.jetbrains.kotlin\", \"kotlin-stdlib-common\")\n        exclude(\"org.jetbrains.kotlinx\", \"kotlinx-coroutines-core-common\")\n        exclude(\"org.jetbrains.kotlinx\", \"kotlinx-coroutines-core\")\n        exclude(\"org.jetbrains.kotlinx\", \"kotlinx-serialization-common\")\n        exclude(\"org.jetbrains.kotlinx\", \"kotlinx-serialization-core\")\n    }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/JvmPublishing.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\n    \"NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS\",\n    \"RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS\"\n)\n\nimport com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar\nimport keys.SecretKeys\nimport org.gradle.api.Project\nimport org.gradle.api.publish.maven.MavenPublication\nimport org.gradle.api.tasks.bundling.Jar\nimport org.gradle.kotlin.dsl.get\nimport org.gradle.kotlin.dsl.getByName\nimport org.gradle.kotlin.dsl.register\nimport java.io.File\n\nfun Project.configureRemoteRepos() {\n    tasks.register(\"ensureMavenCentralAvailable\") {\n        doLast {\n            val keys = SecretKeys.getCache(project)\n            if (!keys.loadKey(\"sonatype\").isValid) {\n                error(\"Maven Central isn't available.\")\n            }\n        }\n    }\n\n    publishing {\n        // sonatype\n        val keys = SecretKeys.getCache(project)\n        repositories {\n            maven {\n                name = \"MiraiStageRepo\"\n                val stageRepoLoc = getLocalProperty(\"publishing.stage-repo\")?.let(::File)\n                    ?.takeIf { it.exists() }\n                    ?: rootProject.file(\"ci-release-helper/stage-repo\")\n\n                url = stageRepoLoc.also { it.mkdirs() }.toURI()\n            }\n\n            if (System.getenv(\"MIRAI_IS_SNAPSHOTS_PUBLISHING\")?.toBoolean() == true) {\n                maven {\n                    name = \"MiraiRepo\"\n                    setUrl(System.getenv(\"SNAPSHOTS_PUBLISHING_URL\"))\n\n                    credentials {\n                        username = System.getenv(\"SNAPSHOTS_PUBLISHING_USER\")\n                        password = System.getenv(\"SNAPSHOTS_PUBLISHING_KEY\")\n                    }\n                }\n            }\n\n            val sonatype = keys.loadKey(\"sonatype\")\n            if (sonatype.isValid) {\n                maven {\n                    name = \"MavenCentral\"\n                    // Maven Central\n                    setUrl(\"https://oss.sonatype.org/service/local/staging/deploy/maven2\")\n\n                    credentials {\n                        username = sonatype.user\n                        password = sonatype.password\n                    }\n                }\n            } else {\n                logger.info(\"Sonatype is not available, Maven Central repository is not configured\")\n            }\n        }\n    }\n}\n\n@Suppress(\"NOTHING_TO_INLINE\")\ninline fun Project.configurePublishing(\n    artifactId: String,\n    vcs: String = \"https://github.com/mamoe/mirai\",\n    addProjectComponents: Boolean = true,\n    skipPublicationSetup: Boolean = false,\n    addShadowJar: Boolean = true\n) {\n    configureRemoteRepos()\n\n    if (skipPublicationSetup) return\n\n    val shadowJar = if (!addProjectComponents || !addShadowJar) null else tasks.register<ShadowJar>(\"shadowJar\") {\n        archiveClassifier.set(\"all\")\n        manifest.inheritFrom(tasks.getByName<Jar>(\"jar\").manifest)\n        from(project.sourceSets[\"main\"].output)\n        configurations =\n            listOfNotNull(project.configurations.findByName(\"runtimeClasspath\") ?: project.configurations[\"runtime\"])\n\n        exclude(\"META-INF/INDEX.LIST\", \"META-INF/*.SF\", \"META-INF/*.DSA\", \"META-INF/*.RSA\", \"module-info.class\")\n    }\n\n    val sourcesJar = if (!addProjectComponents) null else tasks.register<Jar>(\"sourcesJar\") {\n        archiveClassifier.set(\"sources\")\n        from(sourceSets[\"main\"].allSource)\n    }\n    val stubJavadoc = if (!addProjectComponents) null else tasks.register<Jar>(\"javadocJar\") {\n        @Suppress(\"NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS\")\n        archiveClassifier.set(\"javadoc\")\n    }\n\n    publishing {\n        publications {\n            register(\"mavenJava\", MavenPublication::class) {\n                if (addProjectComponents) from(components[\"java\"])\n\n                groupId = rootProject.group.toString()\n                setArtifactId(artifactId)\n                version = project.version.toString()\n\n                setupPom(\n                    project = project,\n                    vcs = vcs\n                )\n\n                sourcesJar?.let { artifact(it) }\n                stubJavadoc?.get()?.let { artifact(it) }\n                shadowJar?.get()?.let { artifact(it) }\n            }\n        }\n    }\n}"
  },
  {
    "path": "buildSrc/src/main/kotlin/KotlinMetadataPatcher.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nimport com.google.gson.Gson\nimport com.google.gson.GsonBuilder\nimport com.google.gson.JsonElement\nimport com.google.gson.JsonPrimitive\nimport org.gradle.api.GradleException\nimport org.gradle.api.Project\nimport org.gradle.api.Task\nimport org.gradle.api.publish.maven.MavenPublication\nimport org.gradle.api.publish.tasks.GenerateModuleMetadata\nimport shadow.relocationFilters\nimport java.io.File\nimport java.io.InputStream\nimport java.io.OutputStream\nimport java.security.MessageDigest\n\nfun Project.configurePatchKotlinModuleMetadataTask(\n    relocatedPublicationName: String,\n    relocateDependencies: Task,\n    originalPublicationName: String\n) {\n    // We will modify Kotlin metadata, so do generate metadata before relocation\n    val generateMetadataTask =\n        tasks.getByName(\"generateMetadataFileFor${originalPublicationName.titlecase()}Publication\") as GenerateModuleMetadata\n\n    publications.getByName(relocatedPublicationName) {\n        this as MavenPublication\n        this.artifact(generateMetadataTask.outputFile) {\n            classifier = null\n            extension = \"module\"\n        }\n    }\n\n    generateMetadataTask.dependsOn(relocateDependencies)\n    val patchMetadataTask =\n        tasks.create(\"patchMetadataFileFor${relocatedPublicationName.capitalize()}RelocatedPublication\") {\n            group = \"mirai\"\n            generateMetadataTask.finalizedBy(this)\n            dependsOn(generateMetadataTask)\n            dependsOn(relocateDependencies)\n\n            // remove dependencies in Kotlin module metadata\n            doLast {\n                // mirai-core-jvm-2.13.0.module\n                val file = generateMetadataTask.outputFile.asFile.get()\n                val metadata = Gson().fromJson(\n                    file.readText(),\n                    JsonElement::class.java\n                ).asJsonObject\n\n                val metadataVersion = metadata[\"formatVersion\"]?.asString\n                check(metadataVersion == \"1.1\") {\n                    \"Unsupported Kotlin metadata version. version=$metadataVersion, file=${file.absolutePath}\"\n                }\n                for (variant in metadata[\"variants\"]!!.asJsonArray) {\n                    patchKotlinMetadataVariant(variant, relocateDependencies.outputs.files.singleFile)\n                }\n\n\n                file.writeText(GsonBuilder().setPrettyPrinting().create().toJson(metadata))\n            }\n        }\n\n    // Set \"publishKotlinMultiplatformPublicationTo*\" and \"publish${targetName.capitalize()}PublicationTo*\" dependsOn patchMetadataTask\n    if (project.kotlinMpp != null) {\n        tasks.filter { it.name.startsWith(\"publishKotlinMultiplatformPublicationTo\") }.let { publishTasks ->\n            if (publishTasks.isEmpty()) {\n                throw GradleException(\"[Shadow Relocation] Cannot find publishKotlinMultiplatformPublicationTo for project '${project.path}'.\")\n            }\n            publishTasks.forEach { it.dependsOn(patchMetadataTask) }\n        }\n\n        tasks.filter { it.name.startsWith(\"publish${relocatedPublicationName.capitalize()}PublicationTo\") }\n            .let { publishTasks ->\n                if (publishTasks.isEmpty()) {\n                    throw GradleException(\"[Shadow Relocation] Cannot find publish${relocatedPublicationName.capitalize()}PublicationTo for project '${project.path}'.\")\n                }\n                publishTasks.forEach { it.dependsOn(patchMetadataTask) }\n            }\n    }\n}\n\nprivate fun Project.patchKotlinMetadataVariant(variant: JsonElement, relocatedJar: File) {\n    val dependencies = variant.asJsonObject[\"dependencies\"]!!.asJsonArray\n    dependencies.removeAll { dependency ->\n        val dep = dependency.asJsonObject\n\n        val groupId = dep[\"group\"]!!.asString\n        val artifactId = dep[\"module\"]!!.asString\n        relocationFilters.any { filter ->\n            filter.matchesDependency(\n                groupId = groupId,\n                artifactId = artifactId\n            )\n        }.also {\n            println(\"[Shadow Relocation] Filtering out $groupId:$artifactId from Kotlin module\")\n        }\n    }\n\n\n    /*\n    \"files\": [\n    {\n      \"name\": \"mirai-core-jvm-2.99.0-local.jar\",\n      \"url\": \"mirai-core-jvm-2.99.0-local.jar\",\n      \"size\": 14742378,\n      \"sha512\": \"7ab4afc88384a58687467ba13c6aefeda20fa53fd7759dc2bc78b2d46a6285f94ba6ccae426d192e7745f773401b3cb42a853e5445dc23bdcb1b5295e78ff71c\",\n      \"sha256\": \"772f593bfb85a80794693d4d9dfe2f77c222cfe9ca7e0d571abaa320e7aa82d3\",\n      \"sha1\": \"cb7937269d29b574725d6f28668847fd672de7cf\",\n      \"md5\": \"3fca635ba5e55b7dd56c552e4ca01f7e\"\n    }\n  ]\n     */\n\n    val files = variant.asJsonObject[\"files\"].asJsonArray\n    val filesList = files.toList()\n    files.removeAll { true }\n    for (publishedFile0 in filesList) {\n        val publishedFile = publishedFile0.asJsonObject\n\n        val name = publishedFile[\"name\"].asJsonPrimitive.asString\n        if (name.endsWith(\".jar\")) {\n            logPublishing { \"Patching Kotlin Metadata: file $name\" }\n            for (algorithm in ALGORITHMS) {\n                publishedFile.add(algorithm, JsonPrimitive(relocatedJar.digest(algorithm)))\n            }\n            publishedFile.add(\"size\", JsonPrimitive(relocatedJar.length()))\n        } else {\n            error(\"Unexpected file '$name' while patching Kotlin metadata\")\n        }\n\n        files.add(publishedFile)\n    }\n}\n\nprivate val ALGORITHMS = listOf(\"md5\", \"sha1\", \"sha256\", \"sha512\")\n\nfun File.digest(algorithm: String): String {\n    val arr = inputStream().buffered().use { it.digest(algorithm) }\n    return arr.toUHexString(\"\").lowercase()\n}\n\nfun InputStream.digest(algorithm: String): ByteArray {\n    val digest = MessageDigest.getInstance(algorithm)\n    digest.reset()\n    use { input ->\n        object : OutputStream() {\n            override fun write(b: Int) {\n                digest.update(b.toByte())\n            }\n\n            override fun write(b: ByteArray, off: Int, len: Int) {\n                digest.update(b, off, len)\n            }\n        }.use { output ->\n            input.copyTo(output)\n        }\n    }\n    return digest.digest()\n}\n\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/LocalProperties.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nimport org.gradle.api.Project\nimport java.util.*\n\n/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nobject BuildSrcRootProjectHolder {\n    lateinit var value: Project\n    var lastUpdateTime: Long = 0\n}\n\nval rootProject: Project get() = BuildSrcRootProjectHolder.value\n\nfun <T> projectLazy(action: () -> T): Lazy<T> {\n    val projLazy = object : Lazy<T> {\n        private lateinit var delegate: Lazy<T>\n        private var holdTime: Long = -1\n\n        override val value: T\n            get() {\n                if (holdTime != BuildSrcRootProjectHolder.lastUpdateTime) {\n                    synchronized(this) {\n                        if (holdTime != BuildSrcRootProjectHolder.lastUpdateTime) {\n                            delegate = lazy(action)\n                            holdTime = BuildSrcRootProjectHolder.lastUpdateTime\n                        }\n                    }\n                }\n                return delegate.value\n            }\n\n        override fun isInitialized(): Boolean {\n            if (!::delegate.isInitialized) return false\n\n            if (holdTime == BuildSrcRootProjectHolder.lastUpdateTime) {\n                return delegate.isInitialized()\n            }\n            return false\n        }\n    }\n    return projLazy\n}\n\n\nprivate lateinit var localProperties: Properties\nprivate var localPropertiesEdition: Long = 0\n\nprivate fun Project.loadLocalPropertiesIfNecessary() {\n    val theFile = rootProject.projectDir.resolve(\"local.properties\")\n\n    fun isNecessary(): Boolean {\n        if (!::localProperties.isInitialized) return true\n\n        if (theFile.exists()) {\n            if (localPropertiesEdition != theFile.lastModified()) {\n                return true\n            }\n        } else {\n            if (localPropertiesEdition != 0L) { // deleted\n                return true\n            }\n        }\n\n        return false\n    }\n\n    if (!isNecessary()) return\n\n    localProperties = Properties().apply {\n        localPropertiesEdition = if (theFile.exists()) {\n            theFile.bufferedReader().use { load(it) }\n            theFile.lastModified()\n        } else {\n            0\n        }\n    }\n}\n\nfun Project.getLocalProperty(name: String): String? {\n    loadLocalPropertiesIfNecessary()\n    return localProperties.getProperty(name)\n}\n\nfun Project.getLocalProperty(name: String, default: String): String {\n    return getLocalProperty(name) ?: default\n}\n\nfun Project.getLocalProperty(name: String, default: Int): Int {\n    return getLocalProperty(name)?.toInt() ?: default\n}\n\nfun Project.getLocalProperty(name: String, default: Boolean): Boolean {\n    return getLocalProperty(name)?.toBoolean() ?: default\n}\n\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/Mpp.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nimport org.gradle.api.NamedDomainObjectCollection\nimport org.gradle.api.NamedDomainObjectProvider\nimport org.gradle.api.Project\nimport org.gradle.api.artifacts.DependencySubstitutions\nimport org.gradle.api.artifacts.ResolutionStrategy\nimport org.gradle.api.artifacts.component.ComponentSelector\nimport org.gradle.api.plugins.ExtensionAware\nimport org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension\nimport org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension\n\nval <T> NamedDomainObjectCollection<T>.androidMain: NamedDomainObjectProvider<T>\n    get() = named(\"androidMain\")\n\nval <T> NamedDomainObjectCollection<T>.jvmMain: NamedDomainObjectProvider<T>\n    get() = named(\"jvmMain\")\n\nval <T> NamedDomainObjectCollection<T>.androidTest: NamedDomainObjectProvider<T>\n    get() = named(\"androidTest\")\n\nval <T> NamedDomainObjectCollection<T>.jvmTest: NamedDomainObjectProvider<T>\n    get() = named(\"jvmTest\")\n\nval <T> NamedDomainObjectCollection<T>.commonMain: NamedDomainObjectProvider<T>\n    get() = named(\"commonMain\")\n\n\ninline fun forMppModules(action: (suffix: String) -> Unit) {\n    arrayOf(\n        \"\",\n        \"-common\",\n        \"-metadata\",\n        \"-jvm\",\n        \"-jdk7\",\n        \"-jdk8\"\n    ).forEach(action)\n}\n\nfun Project.substituteDependenciesUsingExpectedVersion() {\n    configurations.all {\n        resolutionStrategy.substituteDependencies {\n            forMppModules { suffix ->\n                module(\"org.jetbrains.kotlin:kotlin-stdlib$suffix\") using module(\"org.jetbrains.kotlin:kotlin-stdlib$suffix:${Versions.kotlinStdlib}\")\n                module(\"org.jetbrains.kotlin:kotlin-reflect$suffix\") using module(\"org.jetbrains.kotlin:kotlin-reflect$suffix:${Versions.kotlinStdlib}\")\n                module(\"org.jetbrains.kotlinx:kotlinx-coroutines-core$suffix\") using\n                        module(kotlinx(\"coroutines-core$suffix\", Versions.coroutines))\n                module(\"org.jetbrains.kotlinx:kotlinx-coroutines-debug$suffix\") using\n                        module(kotlinx(\"coroutines-debug$suffix\", Versions.coroutines))\n            }\n        }\n    }\n}\n\nclass ResolutionStrategyDsl(\n    private val origin: DependencySubstitutions\n) : DependencySubstitutions by origin {\n    infix fun ComponentSelector.using(notation: ComponentSelector): DependencySubstitutions.Substitution {\n        return substitute(this).using(notation)\n    }\n}\n\nfun ResolutionStrategy.substituteDependencies(action: ResolutionStrategyDsl.() -> Unit) {\n    dependencySubstitution {\n        action(ResolutionStrategyDsl(this))\n    }\n}\n\n\nval Project.kotlinMpp\n    get() = runCatching {\n        (this as ExtensionAware).extensions.getByName(\"kotlin\") as? KotlinMultiplatformExtension\n    }.getOrNull()\n\n\nval Project.kotlinJvm\n    get() = runCatching {\n        (this as ExtensionAware).extensions.getByName(\"kotlin\") as? KotlinJvmProjectExtension\n    }.getOrNull()\n\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/MppPublishing.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\nimport org.gradle.api.Project\nimport org.gradle.api.XmlProvider\nimport org.gradle.api.publish.maven.MavenArtifact\nimport org.gradle.api.publish.maven.MavenPublication\nimport org.gradle.api.tasks.TaskProvider\nimport org.gradle.jvm.tasks.Jar\nimport org.gradle.kotlin.dsl.get\nimport org.gradle.kotlin.dsl.register\nimport shadow.RelocationConfig\nimport shadow.relocationFilters\n\ninline fun Project.logPublishing(message: () -> String) {\n    logger.debug(\"[Publishing] Configuring {}\", message())\n}\n\nfun Project.configureMppPublishing() {\n    configureRemoteRepos()\n\n    // mirai does some magic on MPP targets\n    afterEvaluate {\n//        tasks.findByName(\"compileKotlinCommon\")?.enabled = false\n//        tasks.findByName(\"compileTestKotlinCommon\")?.enabled = false\n\n//        tasks.findByName(\"compileCommonMainKotlinMetadata\")?.enabled = false\n//        tasks.findByName(\"compileKotlinMetadata\")?.enabled = false\n\n        // TODO: 2021/1/30 如果添加 JVM 到 root module, 这个 task 会失败因 root module artifacts 有变化\n        //  tasks.findByName(\"generateMetadataFileForKotlinMultiplatformPublication\")?.enabled = false // FIXME: 2021/1/21\n    }\n\n    val stubJavadoc = tasks.register(\"javadocJar\", Jar::class) {\n        @Suppress(\"NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS\")\n        archiveClassifier.set(\"javadoc\")\n    }\n\n    afterEvaluate {\n        publishing {\n            logPublishing { \"Publications: ${publications.joinToString { it.name }}\" }\n\n            val (nonJvmPublications, jvmPublications) = publications.filterIsInstance<MavenPublication>()\n                .partition { publication ->\n                    tasks.findByName(RelocationConfig.taskNameForRelocateDependencies(publication.name)) == null\n                }\n\n            for (publication in nonJvmPublications) {\n                configureMultiplatformPublication(publication, stubJavadoc, publication.name)\n            }\n            for (publication in jvmPublications) {\n//                publications.remove(publication)\n//                val newPublication =\n//                    publications.register(publication.name + \"Shadowed\", MavenPublication::class.java) {\n//                        val target = kotlinTargets.orEmpty().single { it.targetName == publication.name }\n//                        from(target.components.single())\n//                        this.groupId = publication.groupId\n//                        this.artifactId = publication.artifactId\n//                        this.version = publication.version\n//                        artifacts {\n//                            publication.artifacts\n//                                .filter { !(it.classifier.isNullOrEmpty() && it.extension == \"jar\") } // not .jar\n//                                .forEach { artifact(it) } // copy Kotlin metadata artifacts\n//                        }\n//                        artifacts.removeAll { it.classifier.isNullOrEmpty() && it.extension == \"jar\" }\n//                        // add relocated jar\n//                        tasks.findByName(\"relocate${publication.name.titlecase()}Dependencies\")?.let { relocation ->\n//                            artifact(relocation) {\n//                                classifier = \"\"\n//                                extension = \"jar\"\n//                            }\n//                        }\n//                    }\n                configureMultiplatformPublication(publication, stubJavadoc, publication.name)\n                publication.apply {\n                    artifacts.filter { it.classifier.isNullOrEmpty() && it.extension == \"jar\" }.forEach {\n                        it.builtBy(tasks.findByName(RelocationConfig.taskNameForRelocateDependencies(publication.name)))\n                    }\n                }\n            }\n        }\n    }\n}\n\nprivate fun Project.configureMultiplatformPublication(\n    publication: MavenPublication,\n    stubJavadoc: TaskProvider<Jar>,\n    moduleName: String,\n) {\n    // Maven Central always require javadoc.jar\n    publication.artifact(stubJavadoc)\n    publication.setupPom(project)\n\n    logPublishing { publication.name + \": moduleName = $moduleName\" }\n    when (moduleName) {\n        \"kotlinMultiplatform\" -> {\n            publication.artifactId = project.name\n\n            // publishPlatformArtifactsInRootModule(publications.getByName(\"jvm\") as MavenPublication)\n\n            // TODO: 2021/1/30 现在添加 JVM 到 root module 会导致 Gradle 依赖无法解决\n            // https://github.com/mamoe/mirai/issues/932\n        }\n\n        \"metadata\" -> { // TODO: 2021/1/21 seems no use. none `type` is \"metadata\"\n            publication.artifactId = \"${project.name}-metadata\"\n        }\n\n        \"jvm\" -> {\n            publication.artifactId = \"${project.name}-$moduleName\"\n\n            useRelocatedPublication(publication, moduleName)\n        }\n\n        else -> {\n            // \"jvm\", \"native\", \"js\", \"common\"\n            publication.artifactId = \"${project.name}-$moduleName\"\n        }\n    }\n}\n\n/**\n * Creates a new publication and disables [publication].\n */\nprivate fun Project.useRelocatedPublication(\n    publication: MavenPublication,\n    moduleName: String\n) {\n    val relocatedPublicationName = RelocationConfig.relocatedPublicationName(publication.name)\n    registerRelocatedPublication(relocatedPublicationName, publication, moduleName)\n\n    logPublishing { \"Registered relocated publication `$relocatedPublicationName` for module $moduleName, for project ${project.path}\" }\n\n    // Add task dependencies\n    addTaskDependenciesForRelocatedPublication(moduleName, relocatedPublicationName)\n\n    val relocateDependencies = tasks.getByName(RelocationConfig.taskNameForRelocateDependencies(moduleName))\n\n    configurePatchKotlinModuleMetadataTask(relocatedPublicationName, relocateDependencies, publication.name)\n}\n\nprivate fun Project.registerRelocatedPublication(\n    relocatedPublicationName: String,\n    publication: MavenPublication,\n    moduleName: String\n) {\n    // copy POM XML, since POM contains transitive dependencies\n\n    var patched = false\n\n    lateinit var oldXmlProvider: XmlProvider\n    publication.pom.withXml { oldXmlProvider = this }\n\n    publications.register(relocatedPublicationName, MavenPublication::class.java) {\n        this.artifactId = publication.artifactId\n        this.groupId = publication.groupId\n        this.version = publication.version\n        this.artifacts.addAll(publication.artifacts.filterNot { it.classifier == null && it.extension == \"jar\" })\n\n        project.tasks.findByName(RelocationConfig.taskNameForRelocateDependencies(moduleName))\n            ?.let { relocateDependencies ->\n                this.artifact(relocateDependencies) {\n                    this.classifier = null\n                    this.extension = \"jar\"\n                }\n            }\n\n        pom.withXml {\n            val newXml = this\n            for (newChild in newXml.asNode().childrenNodes()) {\n                newXml.asNode().remove(newChild)\n            }\n            // Note: `withXml` is lazy, it is evaluated only when `generatePomFileFor...`\n            for (oldChild in oldXmlProvider.asNode().childrenNodes()) {\n                newXml.asNode().append(oldChild)\n            }\n            removeDependenciesInMavenPom(this)\n            patched = true\n        }\n    }\n\n    tasks.matching { it.name.startsWith(\"publish${relocatedPublicationName.titlecase()}PublicationTo\") }.all {\n        dependsOn(\"generatePomFileFor${relocatedPublicationName.titlecase()}Publication\")\n    }\n\n\n    tasks.matching { it.name == \"generatePomFileFor${relocatedPublicationName.titlecase()}Publication\" }.all {\n        dependsOn(tasks.getByName(\"generatePomFileFor${publication.name.titlecase()}Publication\"))\n        doLast {\n            check(patched) { \"POM is not patched\" }\n        }\n    }\n}\n\nprivate fun Project.addTaskDependenciesForRelocatedPublication(moduleName: String, relocatedPublicationName: String) {\n    val originalTaskNamePrefix = \"publish${moduleName.titlecase()}PublicationTo\"\n    val relocatedTaskName = \"publish${relocatedPublicationName.titlecase()}PublicationTo\"\n    tasks.configureEach {\n        if (!name.startsWith(originalTaskNamePrefix)) return@configureEach\n        val originalTask = this\n\n        this.enabled = false\n        this.description = \"${this.description} ([mirai] disabled in favor of $relocatedTaskName)\"\n\n        val relocatedTasks = project.tasks.filter { it.name.startsWith(relocatedTaskName) }.toTypedArray()\n        check(relocatedTasks.isNotEmpty()) { \"relocatedTasks is empty\" }\n        relocatedTasks.forEach { publishRelocatedPublication ->\n            publishRelocatedPublication.dependsOn(*this.dependsOn.toTypedArray())\n            logger.info(\n                \"[Publishing] $publishRelocatedPublication now dependsOn tasks: \" +\n                        this.dependsOn.joinToString()\n            )\n        }\n\n        project.tasks.filter { it.dependsOn.contains(originalTask) }\n            .forEach { it.dependsOn(*relocatedTasks) }\n    }\n}\n\n// Remove relocated dependencies in Maven pom\nprivate fun Project.removeDependenciesInMavenPom(xmlProvider: XmlProvider) {\n    xmlProvider.run {\n        val node = asNode().getSingleChild(\"dependencies\")\n        val dependencies = node.childrenNodes()\n        logger.info(\"[Shadow Relocation] deps: {}\", dependencies)\n        logger.info(\n            \"[Shadow Relocation] All filter notations: {}\",\n            relocationFilters.flatMap { it.notations.notations() }.joinToString(\"\\n\")\n        )\n\n        dependencies.forEach { dep ->\n            val groupId = dep.getSingleChild(\"groupId\").value().toString().removeSurrounding(\"[\", \"]\")\n            val artifactId = dep.getSingleChild(\"artifactId\").value().toString().removeSurrounding(\"[\", \"]\")\n            logger.info(\"[Shadow Relocation] Checking $groupId:$artifactId\")\n\n            if (\n                relocationFilters.any { filter ->\n                    filter.matchesDependency(groupId = groupId, artifactId = artifactId)\n                }\n            ) {\n                logger.info(\"[Shadow Relocation] Filtering out '$groupId:$artifactId' from pom for project '${project.path}'\")\n                check(node.remove(dep)) { \"Failed to remove dependency node\" }\n            }\n        }\n\n    }\n}\n\nval publishPlatformArtifactsInRootModule: Project.(MavenPublication) -> Unit = { platformPublication ->\n    lateinit var platformPomBuilder: XmlProvider\n    platformPublication.pom.withXml { platformPomBuilder = this }\n\n    publications.getByName(\"kotlinMultiplatform\").let { it as MavenPublication }.run {\n        this.artifacts.removeIf {\n            it.classifier == null && it.extension == \"jar\"\n            // mirai-core\\build\\libs\\mirai-core-2.0.0.jar, classifier=null, ext=jar\n        }\n\n        logPublishing {\n            \"Existing artifacts in kotlinMultiplatform: \" +\n                    this.artifacts.joinToString(\"\\n\", prefix = \"\\n\") { it.smartToString() }\n        }\n\n        platformPublication.artifacts.forEach {\n            logPublishing { \"Adding artifact to kotlinMultiplatform: ${it.smartToString()}\" }\n            artifact(it)\n        }\n\n\n        // replace pom\n        pom.withXml {\n            val pomStringBuilder = asString()\n            pomStringBuilder.setLength(0)\n            platformPomBuilder.toString().lines().forEach { line ->\n                if (!line.contains(\"<!--\")) { // Remove the Gradle module metadata marker as it will be added anew\n                    pomStringBuilder.append(line.replace(platformPublication.artifactId, artifactId))\n                    pomStringBuilder.append(\"\\n\")\n                }\n            }\n        }\n    }\n\n    // TODO: 2021/1/30 root module 问题可能要在这里解决\n    tasks.matching { it.name == \"generatePomFileForKotlinMultiplatformPublication\" }.configureEach {\n        dependsOn(tasks[\"generatePomFileFor${platformPublication.name.capitalize()}Publication\"])\n    }\n}\n\nfun MavenArtifact.smartToString(): String {\n    return \"${file.path}, classifier=${classifier}, ext=${extension}\"\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/ProjectConfigure.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nimport org.gradle.api.JavaVersion\nimport org.gradle.api.NamedDomainObjectCollection\nimport org.gradle.api.NamedDomainObjectList\nimport org.gradle.api.Project\nimport org.gradle.api.plugins.JavaPluginExtension\nimport org.gradle.api.tasks.bundling.Jar\nimport org.gradle.api.tasks.compile.JavaCompile\nimport org.gradle.api.tasks.testing.Test\nimport org.gradle.kotlin.dsl.*\nimport org.jetbrains.kotlin.gradle.dsl.*\nimport org.jetbrains.kotlin.gradle.plugin.KotlinCompilation\nimport org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType\nimport org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet\nimport org.jetbrains.kotlin.gradle.plugin.KotlinTarget\nimport org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget\nimport org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile\n\nprivate fun Project.jvmVersion(): JavaVersion {\n    return if (project.path.endsWith(\"mirai-console-intellij\")) {\n        JavaVersion.VERSION_17\n    } else {\n        JavaVersion.VERSION_1_8\n    }\n}\n\nfun Project.optInForAllSourceSets(qualifiedClassname: String) {\n    kotlinSourceSets!!.all {\n        languageSettings {\n            optIn(qualifiedClassname)\n        }\n    }\n}\n\nfun Project.optInForTestSourceSets(qualifiedClassname: String) {\n    kotlinSourceSets!!.matching { it.name.contains(\"test\", ignoreCase = true) }.all {\n        languageSettings {\n            optIn(qualifiedClassname)\n        }\n    }\n}\n\nfun Project.enableLanguageFeatureForAllSourceSets(qualifiedClassname: String) {\n    kotlinSourceSets!!.all {\n        languageSettings {\n            this.enableLanguageFeature(qualifiedClassname)\n        }\n    }\n}\n\nfun Project.enableLanguageFeatureForTestSourceSets(name: String) {\n    allTestSourceSets {\n        languageSettings {\n            this.enableLanguageFeature(name)\n        }\n    }\n}\n\nfun Project.allTestSourceSets(action: KotlinSourceSet.() -> Unit) {\n    kotlinSourceSets!!.all {\n        if (this.name.contains(\"test\", ignoreCase = true)) {\n            action()\n        }\n    }\n}\n\nfun Project.preConfigureJvmTarget() {\n    val defaultVer = jvmVersion()\n\n    tasks.withType(KotlinJvmCompile::class.java) {\n        kotlinOptions.jvmTarget = defaultVer.toString()\n        kotlinOptions.freeCompilerArgs += \"-Xjvm-default=all\"\n\n        // Support for parallel compilation: https://youtrack.jetbrains.com/issue/KT-46085\n        // Using /2 processors: jvm and android targets are compiled at the same time, sharing the processors.\n        // Also reserved 2 processors for Gradle multi-tasking\n        // On Apple M1 Max parallelism reduces compilation time by 1/3.\n//        kotlinOptions.freeCompilerArgs += \"-Xbackend-threads=\" + (Runtime.getRuntime().availableProcessors() / 2 - 1).coerceAtLeast(1)\n    }\n\n    tasks.withType(JavaCompile::class.java) {\n        sourceCompatibility = defaultVer.toString()\n        targetCompatibility = defaultVer.toString()\n    }\n}\n\nfun Project.configureJvmTarget() {\n    val defaultVer = jvmVersion()\n\n    extensions.findByType(JavaPluginExtension::class.java)?.run {\n        sourceCompatibility = defaultVer\n        targetCompatibility = defaultVer\n    }\n\n    allKotlinTargets().all {\n        if (this !is KotlinJvmTarget) return@all\n        this.testRuns[\"test\"].executionTask.configure { useJUnitPlatform() }\n    }\n}\n\nfun Project.configureEncoding() {\n    tasks.withType(JavaCompile::class.java) {\n        options.encoding = \"UTF8\"\n    }\n}\n\nfun Project.configureKotlinTestSettings() {\n    tasks.withType(Test::class) {\n        useJUnitPlatform()\n    }\n    val b = \"Auto-set for project '${project.path}'. (configureKotlinTestSettings)\"\n    when {\n        isKotlinJvmProject -> {\n            dependencies {\n                \"testImplementation\"(kotlin(\"test-junit5\"))?.because(b)\n\n                \"testApi\"(`junit-jupiter-api`)?.because(b)\n                \"testRuntimeOnly\"(`junit-jupiter-engine`)?.because(b)\n            }\n        }\n\n        isKotlinMpp -> {\n            kotlinSourceSets?.all {\n                val sourceSet = this\n\n                val target = allKotlinTargets()\n                    .find { it.name == sourceSet.name.substringBeforeLast(\"Main\").substringBeforeLast(\"Test\") }\n\n                if (sourceSet.name.contains(\"test\", ignoreCase = true)) {\n                    if (isJvmFinalTarget(target)) {\n                        // For android, this should be done differently. See Android.kt\n                        sourceSet.configureJvmTest(b)\n                    } else {\n                        if (sourceSet.name == \"commonTest\") {\n                            sourceSet.dependencies {\n                                implementation(kotlin(\"test\"))?.because(b)\n                                implementation(kotlin(\"test-annotations-common\"))?.because(b)\n                            }\n                        } else {\n                            // can be an Android sourceSet\n                            // Do not even add \"kotlin-test\" for Android sourceSets. IDEA can't resolve them on sync\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nprivate fun isJvmFinalTarget(target: KotlinTarget?) =\n    target?.platformType == KotlinPlatformType.jvm &&\n            target.attributes.getAttribute(MIRAI_PLATFORM_INTERMEDIATE) != true // jvmBase is intermediate\n\nfun KotlinSourceSet.configureJvmTest(because: String) {\n    dependencies {\n        implementation(kotlin(\"test-junit5\"))?.because(because)\n\n        implementation(`junit-jupiter-api`)?.because(because)\n        runtimeOnly(`junit-jupiter-engine`)?.because(because)\n    }\n}\n\nprivate fun isJvmLikePlatform(target: KotlinTarget?) =\n    target?.platformType == KotlinPlatformType.jvm || target?.platformType == KotlinPlatformType.androidJvm\n\nval testExperimentalAnnotations = arrayOf(\n    \"kotlin.ExperimentalUnsignedTypes\",\n    \"kotlin.time.ExperimentalTime\",\n    \"io.ktor.util.KtorExperimentalAPI\",\n    \"kotlin.io.path.ExperimentalPathApi\",\n    \"kotlinx.coroutines.ExperimentalCoroutinesApi\",\n    \"kotlinx.serialization.ExperimentalSerializationApi\",\n\n    \"net.mamoe.mirai.utils.TestOnly\",\n    \"net.mamoe.mirai.utils.MiraiInternalApi\",\n    \"net.mamoe.mirai.utils.MiraiExperimentalApi\",\n)\n\nval experimentalAnnotations = arrayOf(\n    \"kotlin.contracts.ExperimentalContracts\",\n    \"kotlin.experimental.ExperimentalTypeInference\",\n)\n\nval testLanguageFeatures = listOf(\n    \"ContextReceivers\"\n)\n\nfun Project.configureKotlinOptIns() {\n    val sourceSets = kotlinSourceSets ?: return\n    sourceSets.all {\n        configureKotlinOptIns()\n    }\n\n    for (name in testLanguageFeatures) {\n        enableLanguageFeatureForTestSourceSets(name)\n    }\n\n    allTestSourceSets {\n        languageSettings.languageVersion = Versions.kotlinLanguageVersionForTests\n    }\n}\n\nfun KotlinSourceSet.configureKotlinOptIns() {\n    languageSettings.progressiveMode = true\n    experimentalAnnotations.forEach { a ->\n        languageSettings.optIn(a)\n    }\n    if (name.contains(\"test\", ignoreCase = true)) {\n        testExperimentalAnnotations.forEach { a ->\n            languageSettings.optIn(a)\n        }\n    }\n}\n\nfun Project.configureFlattenSourceSets() {\n    val flatten = extra.runCatching { get(\"flatten.sourceset\") }.getOrNull()?.toString()?.toBoolean() ?: true\n    if (!flatten) return\n    sourceSets {\n        findByName(\"main\")?.apply {\n            resources.setSrcDirs(listOf(projectDir.resolve(\"resources\")))\n            java.setSrcDirs(listOf(projectDir.resolve(\"src\")))\n        }\n        findByName(\"test\")?.apply {\n            resources.setSrcDirs(listOf(projectDir.resolve(\"testResources\")))\n            java.setSrcDirs(listOf(projectDir.resolve(\"test\")))\n        }\n    }\n}\n\nfun Project.configureJarManifest() {\n    this.tasks.withType<Jar> {\n        manifest {\n            attributes(\n                \"Implementation-Vendor\" to \"Mamoe Technologies\",\n                \"Implementation-Title\" to this@configureJarManifest.name.toString(),\n                \"Implementation-Version\" to this@configureJarManifest.version.toString()\n            )\n        }\n    }\n}\n\ninline fun <reified T> Any?.safeAs(): T? {\n    return this as? T\n}\n\nval Project.kotlinSourceSets get() = extensions.findByName(\"kotlin\").safeAs<KotlinProjectExtension>()?.sourceSets\n\nfun Project.allKotlinTargets(): NamedDomainObjectCollection<KotlinTarget> {\n    return extensions.findByName(\"kotlin\")?.safeAs<KotlinSingleTargetExtension<*>>()\n        ?.target?.let { namedDomainObjectListOf(it) }\n        ?: extensions.findByName(\"kotlin\")?.safeAs<KotlinMultiplatformExtension>()?.targets\n        ?: namedDomainObjectListOf()\n}\n\nprivate inline fun <reified T> Project.namedDomainObjectListOf(vararg values: T): NamedDomainObjectList<T> {\n    return objects.namedDomainObjectList(T::class.java).apply { addAll(values) }\n}\n\nval Project.isKotlinJvmProject: Boolean get() = extensions.findByName(\"kotlin\") is KotlinJvmProjectExtension\nval Project.isKotlinMpp: Boolean get() = extensions.findByName(\"kotlin\") is KotlinMultiplatformExtension\n\nfun Project.allKotlinCompilations(action: (KotlinCompilation<KotlinCommonOptions>) -> Unit) {\n    allKotlinTargets().all {\n        compilations.all(action)\n    }\n}"
  },
  {
    "path": "buildSrc/src/main/kotlin/PublishingHelpers.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:Suppress(\n    \"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"NOTHING_TO_INLINE\", \"RemoveRedundantBackticks\",\n    \"NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS\"\n)\n\nimport org.gradle.api.Project\nimport org.gradle.api.Task\nimport org.gradle.api.publish.PublicationContainer\nimport org.gradle.api.publish.maven.MavenPublication\nimport org.gradle.api.tasks.TaskContainer\nimport org.gradle.kotlin.dsl.ExistingDomainObjectDelegate\nimport org.gradle.kotlin.dsl.RegisteringDomainObjectDelegateProviderWithTypeAndAction\nimport kotlin.contracts.ExperimentalContracts\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.reflect.KProperty\n\n/*\n * Copyright 2019-2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AFFERO GENERAL PUBLIC LICENSE version 3 license that can be found via the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@PublishedApi\ninternal operator fun <U : Task> RegisteringDomainObjectDelegateProviderWithTypeAndAction<out TaskContainer, U>.provideDelegate(\n    receiver: Any?,\n    property: KProperty<*>\n) = ExistingDomainObjectDelegate.of(\n    delegateProvider.register(property.name, type.java, action)\n)\n\n@PublishedApi\ninternal val Project.`sourceSets`: org.gradle.api.tasks.SourceSetContainer\n    get() =\n        (this as org.gradle.api.plugins.ExtensionAware).extensions.getByName(\"sourceSets\") as org.gradle.api.tasks.SourceSetContainer\n\n@PublishedApi\ninternal operator fun <T> ExistingDomainObjectDelegate<out T>.getValue(receiver: Any?, property: KProperty<*>): T =\n    delegate\n\n/**\n * Configures the [publishing][org.gradle.api.publish.PublishingExtension] extension.\n */\n@OptIn(ExperimentalContracts::class)\n@PublishedApi\ninternal fun Project.`publishing`(configure: org.gradle.api.publish.PublishingExtension.() -> Unit): Unit {\n    contract {\n        callsInPlace(configure, InvocationKind.EXACTLY_ONCE)\n    }\n    (this as org.gradle.api.plugins.ExtensionAware).extensions.configure(\"publishing\", configure)\n}\n\n\nval Project.publications: PublicationContainer\n    get() {\n        val ret: PublicationContainer\n        publishing {\n            ret = publications\n        }\n        return ret\n    }\n\nfun MavenPublication.setupPom(\n    project: Project,\n    vcs: String = \"https://github.com/mamoe/mirai\"\n) {\n    pom {\n        scm {\n            url.set(vcs)\n            connection.set(\"scm:$vcs.git\")\n            developerConnection.set(\"scm:${vcs.replace(\"https:\", \"git:\")}.git\")\n        }\n\n        licenses {\n            license {\n                name.set(\"GNU AGPLv3\")\n                url.set(\"https://github.com/mamoe/mirai/blob/master/LICENSE\")\n            }\n        }\n\n        developers {\n            developer {\n                id.set(\"mamoe\")\n                name.set(\"Mamoe Technologies\")\n                email.set(\"support@mamoe.net\")\n            }\n        }\n\n    }\n\n    pom.withXml {\n        val root = asNode()\n        root.appendNode(\"description\", project.description)\n        root.appendNode(\"name\", project.name)\n        root.appendNode(\"url\", vcs)\n    }\n}\n\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/Stdlib.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nfun String.capitalize(): String = this.replaceFirstChar { it.uppercaseChar() }"
  },
  {
    "path": "buildSrc/src/main/kotlin/TestDependencies.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nimport org.gradle.api.Project\nimport org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet\n\n/**\n * 配置 test 依赖 mirai-core:jvmTest, 可访问 `AbstractTest` 等\n * \n * 用法:\n * \n * *build.gradle.kts*\n * ```\n * kotlin.sourceSets.test {\n *     dependsOnCoreJvmTest(project)\n * }\n * ```\n */\nfun KotlinSourceSet.dependsOnCoreJvmTest(project: Project) {\n    project.evaluationDependsOn(\":mirai-core\")\n    dependencies {\n        implementation(\n            project(\":mirai-core\").dependencyProject.kotlinMpp!!.targets\n                .single { it.name == \"jvm\" }\n                .compilations.getByName(\"test\")\n                .output.allOutputs\n        )\n        implementation(\n            project(\":mirai-core\").dependencyProject.kotlinMpp!!.targets\n                .single { it.name == \"jvmBase\" }\n                .compilations.getByName(\"test\")\n                .output.allOutputs\n        )\n    }\n}"
  },
  {
    "path": "buildSrc/src/main/kotlin/UpdateSnapshotPage.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\nimport com.google.gson.JsonObject\nimport org.gradle.api.Project\nimport java.net.URI\nimport java.net.http.HttpClient\nimport java.net.http.HttpRequest\nimport java.net.http.HttpResponse\n\nobject UpdateSnapshotPage {\n    fun safeToStr(any: Any?): String = any.toString()\n\n    fun run(project: Project, sha: String) {\n        val token = System.getenv(\"GH_TOKEN\") ?: error(\"GH_TOKEN not found\")\n\n        val ver = safeToStr(project.version)\n        val http = HttpClient.newHttpClient()\n        val document = project.rootProject.projectDir.resolve(\"docs/UsingSnapshots.md\").let { file ->\n            kotlin.runCatching { file.readText() }.getOrElse { \"\" }\n        }\n        val content = JsonObject().also { data ->\n            data.addProperty(\"name\", \"Snapshot Build Output\")\n            data.addProperty(\"head_sha\", sha.trim())\n            data.addProperty(\"conclusion\", \"success\")\n            data.add(\"output\", JsonObject().also { output ->\n                output.addProperty(\"title\", \"Snapshot build ($ver)\")\n                output.addProperty(\"summary\", \"snapshot version: `$ver`\\n\\n------\\n\\n\\n$document\")\n            })\n        }.toString()\n        http.send(\n            HttpRequest.newBuilder(URI.create(\"https://api.github.com/repos/mamoe/mirai/check-runs\"))\n                .POST(HttpRequest.BodyPublishers.ofString(content))\n                .header(\"Authorization\", \"token $token\")\n                .header(\"Accept\", \"application/vnd.github.v3+json\")\n                .build(),\n            HttpResponse.BodyHandlers.ofByteArrayConsumer { rsp ->\n                if (rsp.isPresent) {\n                    System.out.write(rsp.get())\n                } else {\n                    println()\n                    println()\n                }\n            }\n        )\n\n        (http.executor().orElse(null) as? java.util.concurrent.ExecutorService)?.shutdown()\n    }\n}"
  },
  {
    "path": "buildSrc/src/main/kotlin/Versions.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\n    \"ObjectPropertyName\", \"ObjectPropertyName\", \"unused\", \"MemberVisibilityCanBePrivate\", \"RemoveRedundantBackticks\"\n)\n\nimport org.gradle.api.artifacts.ExternalModuleDependency\nimport org.gradle.api.artifacts.ModuleDependency\nimport org.gradle.api.attributes.Attribute\nimport org.gradle.kotlin.dsl.exclude\nimport org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler\n\n// DO NOT CHANGE FILENAME OR RELATIVE PATH TO ROOT PROJECT.\n// mirai-deps-test DEPENDS ON THE PATH.\n\nobject Versions {\n    val project = System.getenv(\"mirai.build.project.version\")?.takeIf { it.isNotBlank() }\n        ?: System.getProperty(\"mirai.build.project.version\")?.takeIf { it.isNotBlank() }\n        ?: /*PROJECT_VERSION_START*/\"2.17.0\"/*PROJECT_VERSION_END*/\n    // DO NOT ADD SPACE BETWEEN!\n\n    val core get() = project\n    val console get() = project\n    val consoleIntellij get() = \"232-$project-182-1\" // idea-mirai-kotlin-patch\n    val consoleTerminal get() = project\n\n    const val kotlinCompiler = \"1.8.10\"\n    const val kotlinStdlib = kotlinCompiler\n    const val kotlinLanguageVersionForTests = \"1.9\" // be curious!\n\n    const val dokka = \"1.8.10\"\n\n    const val kotlinCompilerForIdeaPlugin = \"1.8.20\" // 232 bundles 1.8.20\n\n    const val coroutines = \"1.6.4\"\n    const val atomicFU = \"0.20.0\"\n    const val serialization = \"1.5.0\"\n\n    /**\n     * 注意, 不要轻易升级 ktor 版本. 阅读 [RelocationNotes], 尤其是间接依赖部分.\n     */\n    const val ktor = \"2.1.0\"\n    const val okhttp = \"4.9.3\" // 需要跟 Ktor 依赖的相同, 用于 shadow 后携带到 runtime\n    const val okio = \"3.2.0\" // 需要跟 OkHttp 依赖的相同, 用于 shadow 后携带到 runtime\n\n    const val binaryValidator = \"0.4.0\"\n\n    const val blockingBridge = \"3.0.0-180.1\"\n    const val dynamicDelegation = \"0.4.0-180.1\"\n    const val mavenCentralPublish = \"1.0.0\"\n\n    const val androidGradlePlugin = \"7.3.1\"\n    const val android = \"4.1.1.4\"\n    const val androidxAnnotation = \"1.6.0\"\n\n    const val shadow = \"8.1.0\"\n\n    const val logback = \"1.3.4\"\n    const val slf4j = \"2.0.3\"\n    const val log4j = \"2.19.0\"\n    const val asm = \"9.4\"\n    const val difflib = \"1.3.0\"\n    const val netty = \"4.1.94.Final\"\n    const val bouncycastle = \"1.70\"\n    const val mavenArtifactResolver = \"1.7.3\"\n    const val mavenResolverProvider = \"3.8.4\"\n\n    const val junit = \"5.7.2\"\n\n    const val yamlkt = \"0.12.0\"\n    const val intellijGradlePlugin = \"1.15.0\"\n\n    // https://github.com/google/jimfs\n    // Java In Memory File System\n    const val jimfs = \"1.2\"\n\n    const val jline = \"3.21.0\"\n    const val jansi = \"2.4.0\"\n\n\n    // don't update easily unless you want your disk space -= 1000 MB\n    // (700 MB for IDEA, 150 MB for sources, 150 MB for JBR)\n    const val intellij = \"2023.2\"\n}\n\n@Suppress(\"unused\")\nfun kotlinx(id: String, version: String) = \"org.jetbrains.kotlinx:kotlinx-$id:$version\"\n\n@Suppress(\"unused\")\nfun ktor(id: String, version: String = Versions.ktor) = \"io.ktor:ktor-$id:$version\"\n\nval `kotlinx-coroutines-core` = kotlinx(\"coroutines-core\", Versions.coroutines)\nval `kotlinx-coroutines-test` = kotlinx(\"coroutines-test\", Versions.coroutines)\nval `kotlinx-coroutines-jdk8` = kotlinx(\"coroutines-jdk8\", Versions.coroutines)\nval `kotlinx-coroutines-swing` = kotlinx(\"coroutines-swing\", Versions.coroutines)\nval `kotlinx-coroutines-debug` = kotlinx(\"coroutines-debug\", Versions.coroutines)\nval `kotlinx-serialization-core` = kotlinx(\"serialization-core\", Versions.serialization)\nval `kotlinx-serialization-json` = kotlinx(\"serialization-json\", Versions.serialization)\nval `kotlinx-serialization-protobuf` = kotlinx(\"serialization-protobuf\", Versions.serialization)\nconst val `kotlinx-atomicfu` = \"org.jetbrains.kotlinx:atomicfu:${Versions.atomicFU}\"\n\nconst val `kotlin-jvm-blocking-bridge` = \"me.him188:kotlin-jvm-blocking-bridge-runtime:${Versions.blockingBridge}\"\nconst val `kotlin-dynamic-delegation` = \"me.him188:kotlin-dynamic-delegation:${Versions.dynamicDelegation}\"\n\n/**\n * @see relocateImplementation\n */\nclass RelocatedDependency(\n    /**\n     * Dependency notation, e.g. `io.ktor:ktor-io:2.1.0`\n     */\n    val notation: String,\n    /**\n     * Kotlin packages. e.g. `io.ktor`\n     */\n    vararg val packages: String,\n    /**\n     * Exclude them, so no transitive dependencies exposed to Maven and Kotlin JVM consumers\n     */\n    val notationsToExcludeInPom: RelocatableDependency = MultiplatformDependency.jvm(\n        notation.substringBefore(\":\"),\n        notation.substringAfter(\":\").substringBeforeLast(\":\")\n    ),\n    /**\n     * Additional exclusions apart from everything from `org.jetbrains.kotlin` and `org.jetbrains.kotlinx`.\n     */\n    val exclusionAction: ExternalModuleDependency.() -> Unit = {},\n)\n\nfun KotlinDependencyHandler.implementationKotlinxIo(module: String) {\n    implementation(module) {\n        /*\n                    |    +--- org.jetbrains.kotlinx:kotlinx-io-jvm:0.1.16\n                    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.60 -> 1.5.30 (*)\n                    |    |    +--- org.jetbrains.kotlinx:atomicfu:0.14.1\n                    |    |    +--- org.jetbrains.kotlinx:atomicfu-common:0.14.1\n                    |    |    \\--- org.jetbrains.kotlinx:kotlinx-io:0.1.16\n                    |    |         \\--- org.jetbrains.kotlinx:atomicfu-common:0.14.1\n                     */\n        exclude(\"org.jetbrains.kotlinx\", \"kotlinx-coroutines-core-common\")\n        exclude(\"org.jetbrains.kotlinx\", \"atomicfu\")\n        exclude(\"org.jetbrains.kotlinx\", \"atomicfu-common\")\n    }\n}\n\n\nclass DependencyNotation(\n    val groupId: String,\n    val artifactId: String,\n) {\n    fun toMap(): Map<String, String> {\n        return mapOf(\"group\" to groupId, \"module\" to artifactId)\n    }\n\n    override fun toString(): String {\n        return \"$groupId:$artifactId\"\n    }\n}\n\nsealed interface RelocatableDependency {\n    fun notations(): Sequence<DependencyNotation>\n}\n\nclass SinglePlatformDependency(\n    val groupId: String,\n    val artifactId: String\n) : RelocatableDependency {\n    override fun notations(): Sequence<DependencyNotation> {\n        return sequenceOf(DependencyNotation(groupId, artifactId))\n    }\n}\n\nclass CompositeDependency(\n    private val dependencies: List<RelocatableDependency>\n) : RelocatableDependency {\n    constructor(vararg dependencies: RelocatableDependency) : this(dependencies.toList())\n\n    override fun notations(): Sequence<DependencyNotation> = dependencies.asSequence().flatMap { it.notations() }\n}\n\nclass MultiplatformDependency private constructor(\n    private val groupId: String,\n    private val baseArtifactId: String,\n    vararg val targets: String,\n) : RelocatableDependency {\n    override fun notations(): Sequence<DependencyNotation> {\n        return sequenceOf(DependencyNotation(groupId, baseArtifactId))\n            .plus(targets.asSequence().map { DependencyNotation(groupId, \"$baseArtifactId-$it\") })\n    }\n\n    companion object {\n        fun jvm(groupId: String, baseArtifactId: String): MultiplatformDependency {\n            return MultiplatformDependency(groupId, baseArtifactId, \"common\", \"metadata\", \"jvm\", \"jdk8\", \"jdk7\")\n        }\n    }\n}\n\nfun ModuleDependency.exclude(multiplatformDependency: MultiplatformDependency) {\n    multiplatformDependency.notations().forEach {\n        exclude(it.toMap())\n    }\n}\n\nobject ExcludeProperties {\n    val `everything from kotlin` = exclude(groupId = \"org.jetbrains.kotlin\", null)\n    val `everything from kotlinx` = exclude(groupId = \"org.jetbrains.kotlinx\", null)\n    val `kotlin-stdlib` = multiplatformJvm(groupId = \"org.jetbrains.kotlin\", \"kotlin-stdlib\")\n    val `kotlinx-coroutines` = multiplatformJvm(groupId = \"org.jetbrains.kotlinx\", \"kotlinx-coroutines\")\n    val `ktor-io` = multiplatformJvm(groupId = \"io.ktor\", \"ktor-io\")\n    val `everything from slf4j` = exclude(groupId = \"org.slf4j\", null)\n    val `slf4j-api` = exclude(groupId = \"org.slf4j\", \"slf4j-api\")\n\n    /**\n     * @see org.gradle.kotlin.dsl.exclude\n     */\n    @OptIn(ExperimentalStdlibApi::class)\n    private fun exclude(\n        groupId: String?, artifactId: String?\n    ): Map<String, String> = buildMap {\n        groupId?.let { put(\"group\", groupId) }\n        artifactId?.let { put(\"module\", artifactId) }\n    }\n\n    private fun multiplatformJvm(\n        groupId: String, baseArtifactId: String\n    ): MultiplatformDependency = MultiplatformDependency.jvm(groupId, baseArtifactId)\n}\n\nval `ktor-io` = ktor(\"io\", Versions.ktor)\nval `ktor-io_relocated` = RelocatedDependency(\n    `ktor-io`, \"io.ktor.utils.io\",\n    notationsToExcludeInPom = MultiplatformDependency.jvm(\"io.ktor\", \"ktor-io\")\n) {\n    exclude(ExcludeProperties.`everything from slf4j`)\n    exclude(ExcludeProperties.`slf4j-api`)\n}\n\nval `ktor-http` = ktor(\"http\", Versions.ktor)\nval `ktor-events` = ktor(\"events\", Versions.ktor)\nval `ktor-serialization` = ktor(\"serialization\", Versions.ktor)\nval `ktor-websocket-serialization` = ktor(\"websocket-serialization\", Versions.ktor)\n\nval `ktor-client-core` = ktor(\"client-core\", Versions.ktor)\nval `ktor-client-core_relocated` = RelocatedDependency(\n    `ktor-client-core`, \"io.ktor\",\n    notationsToExcludeInPom = CompositeDependency(\n        MultiplatformDependency.jvm(\"io.ktor\", \"ktor-io\"),\n        MultiplatformDependency.jvm(\"io.ktor\", \"ktor-client-core\"),\n        MultiplatformDependency.jvm(\"io.ktor\", \"ktor-client-okhttp\"),\n        MultiplatformDependency.jvm(\"io.ktor\", \"ktor-http\"),\n        MultiplatformDependency.jvm(\"io.ktor\", \"ktor-utils\"),\n    )\n) {\n    exclude(ExcludeProperties.`ktor-io`)\n    exclude(ExcludeProperties.`everything from slf4j`)\n}\n\nval `ktor-client-cio` = ktor(\"client-cio\", Versions.ktor)\nval `ktor-client-mock` = ktor(\"client-mock\", Versions.ktor)\nval `ktor-client-curl` = ktor(\"client-curl\", Versions.ktor)\nval `ktor-client-darwin` = ktor(\"client-darwin\", Versions.ktor)\nval `ktor-client-okhttp` = ktor(\"client-okhttp\", Versions.ktor)\nval `ktor-client-okhttp_relocated` =\n    RelocatedDependency(\n        ktor(\"client-okhttp\", Versions.ktor), \"io.ktor\", \"okhttp\", \"okio\",\n        notationsToExcludeInPom = CompositeDependency(\n            MultiplatformDependency.jvm(\"io.ktor\", \"ktor-io\"),\n            MultiplatformDependency.jvm(\"io.ktor\", \"ktor-client-core\"),\n            MultiplatformDependency.jvm(\"io.ktor\", \"ktor-client-okhttp\"),\n            MultiplatformDependency.jvm(\"io.ktor\", \"ktor-http\"),\n            MultiplatformDependency.jvm(\"io.ktor\", \"ktor-serialization\"),\n            MultiplatformDependency.jvm(\"io.ktor\", \"ktor-utils\"),\n            MultiplatformDependency.jvm(\"io.ktor\", \"ktor-websockets\"),\n            MultiplatformDependency.jvm(\"io.ktor\", \"ktor-websockets-serialization\"),\n            MultiplatformDependency.jvm(\"com.squareup.okhttp3\", \"okhttp3\"),\n            MultiplatformDependency.jvm(\"com.squareup.okio\", \"okio\"),\n        )\n    ) {\n        exclude(ExcludeProperties.`ktor-io`)\n        exclude(ExcludeProperties.`everything from slf4j`)\n    }\n\nconst val `okhttp3` = \"com.squareup.okhttp3:okhttp:${Versions.okhttp}\"\nconst val `okio` = \"com.squareup.okio:okio-jvm:${Versions.okio}\"\n\nval `ktor-client-android` = ktor(\"client-android\", Versions.ktor)\nval `ktor-client-logging` = ktor(\"client-logging\", Versions.ktor)\nval `ktor-network` = ktor(\"network-jvm\", Versions.ktor)\nval `ktor-client-serialization` = ktor(\"client-serialization\", Versions.ktor)\n\nval `ktor-server-core` = ktor(\"server-core\", Versions.ktor)\nval `ktor-server-netty` = ktor(\"server-netty\", Versions.ktor)\nconst val `java-in-memory-file-system` = \"com.google.jimfs:jimfs:\" + Versions.jimfs\n\nconst val `logback-classic` = \"ch.qos.logback:logback-classic:\" + Versions.logback\n\nconst val `slf4j-api` = \"org.slf4j:slf4j-api:\" + Versions.slf4j\nconst val `slf4j-simple` = \"org.slf4j:slf4j-simple:\" + Versions.slf4j\n\nconst val `log4j-api` = \"org.apache.logging.log4j:log4j-api:\" + Versions.log4j\nconst val `log4j-core` = \"org.apache.logging.log4j:log4j-core:\" + Versions.log4j\nconst val `log4j-slf4j2-impl` = \"org.apache.logging.log4j:log4j-slf4j2-impl:\" + Versions.log4j\nconst val `log4j-to-slf4j` = \"org.apache.logging.log4j:log4j-to-slf4j:\" + Versions.log4j\n\nval ATTRIBUTE_MIRAI_TARGET_PLATFORM: Attribute<String> = Attribute.of(\"mirai.target.platform\", String::class.java)\n\n\nconst val `kotlin-compiler` = \"org.jetbrains.kotlin:kotlin-compiler:${Versions.kotlinCompiler}\"\nconst val `kotlin-compiler_forIdea` = \"org.jetbrains.kotlin:kotlin-compiler:${Versions.kotlinCompilerForIdeaPlugin}\"\n\nconst val `kotlin-stdlib` = \"org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlinStdlib}\"\nconst val `kotlin-stdlib-jdk8` = \"org.jetbrains.kotlin:kotlin-stdlib-jdk8:${Versions.kotlinStdlib}\"\nconst val `kotlin-reflect` = \"org.jetbrains.kotlin:kotlin-reflect:${Versions.kotlinStdlib}\"\nconst val `kotlin-test` = \"org.jetbrains.kotlin:kotlin-test:${Versions.kotlinStdlib}\"\nconst val `kotlin-test-junit5` = \"org.jetbrains.kotlin:kotlin-test-junit5:${Versions.kotlinStdlib}\"\nconst val `junit-jupiter-api` = \"org.junit.jupiter:junit-jupiter-api:${Versions.junit}\"\nconst val `junit-jupiter-params` = \"org.junit.jupiter:junit-jupiter-params:${Versions.junit}\"\nconst val `junit-jupiter-engine` = \"org.junit.jupiter:junit-jupiter-engine:${Versions.junit}\"\n\n//const val `mirai-core-api` = \"net.mamoe:mirai-core-api:${Versions.core}\"\n//const val `mirai-core` = \"net.mamoe:mirai-core:${Versions.core}\"\n//const val `mirai-core-utils` = \"net.mamoe:mirai-core-utils:${Versions.core}\"\n\nconst val `yamlkt` = \"net.mamoe.yamlkt:yamlkt:${Versions.yamlkt}\"\n\nconst val `jetbrains-annotations` = \"org.jetbrains:annotations:19.0.0\"\n\n\nconst val `caller-finder` = \"io.github.karlatemp:caller:1.1.1\"\n\nconst val `androidx-annotation` = \"androidx.annotation:annotation:${Versions.androidxAnnotation}\"\nconst val `android-runtime` = \"com.google.android:android:${Versions.android}\"\nconst val `netty-all` = \"io.netty:netty-all:${Versions.netty}\"\nconst val `netty-handler` = \"io.netty:netty-handler:${Versions.netty}\"\nconst val `netty-common` = \"io.netty:netty-common:${Versions.netty}\"\nconst val `netty-transport` = \"io.netty:netty-transport:${Versions.netty}\"\nconst val `netty-buffer` = \"io.netty:netty-buffer:${Versions.netty}\"\nconst val `bouncycastle` = \"org.bouncycastle:bcprov-jdk15on:${Versions.bouncycastle}\"\n\nconst val `kt-bignum` = \"com.ionspin.kotlin:bignum:0.3.7\"\nval `kt-bignum_relocated` = RelocatedDependency(`kt-bignum`, \"com.ionspin.kotlin.bignum\")\n\nconst val `maven-resolver-api` = \"org.apache.maven.resolver:maven-resolver-api:${Versions.mavenArtifactResolver}\"\nconst val `maven-resolver-impl` = \"org.apache.maven.resolver:maven-resolver-impl:${Versions.mavenArtifactResolver}\"\nconst val `maven-resolver-connector-basic` =\n    \"org.apache.maven.resolver:maven-resolver-connector-basic:${Versions.mavenArtifactResolver}\"\nconst val `maven-resolver-transport-http` =\n    \"org.apache.maven.resolver:maven-resolver-transport-http:${Versions.mavenArtifactResolver}\"\nconst val `maven-resolver-provider` = \"org.apache.maven:maven-resolver-provider:${Versions.mavenResolverProvider}\"\n\n\nconst val jline = \"org.jline:jline:${Versions.jline}\"\nconst val jansi = \"org.fusesource.jansi:jansi:${Versions.jansi}\"\n\n\nconst val DEPS_TEST_VERSION = \"2.99.0-deps-test\"\n\n/**\n * This does not work for this build! Changes apply only in future builds.\n */\nfun setProjectVersionForFutureBuilds(newVersion: String) {\n    rootProject.file(\"buildSrc/src/main/kotlin/Versions.kt\").run {\n        var text = readText()\n        val template = { version: Any? -> \"/*PROJECT_VERSION_START*/\\\"${version}\\\"/*PROJECT_VERSION_END*/\" }\n        check(text.indexOf(template(Versions.project)) != -1) { \"Cannot find ${template(Versions.project)}\" }\n        text = text.replace(template(Versions.project), template(newVersion))\n        writeText(text)\n    }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/analyzes/AndroidApiLevelCheck.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:Suppress(\"MemberVisibilityCanBePrivate\")\n\npackage analyzes\n\nimport groovy.util.Node\nimport org.gradle.api.Project\nimport org.objectweb.asm.Type\nimport org.objectweb.asm.tree.ClassNode\nimport org.objectweb.asm.tree.FieldInsnNode\nimport org.objectweb.asm.tree.MethodInsnNode\nimport java.io.File\n\nobject AndroidApiLevelCheck {\n    data class ClassInfo(\n        val name: String,\n        val since: Int,\n        val superTypes: List<SuperInfo>,\n        val fieldInfos: Map<String, MemberInfo>,\n        val methodInfos: Map<String, MemberInfo>\n    ) {\n        data class SuperInfo(\n            val name: String,\n            val since: Int?,\n            val removed: Int?\n        )\n\n        data class MemberInfo(\n            val name: String,\n            val since: Int?\n        )\n    }\n\n    class Analyzer(\n        val classesInfos: Map<String, ClassInfo>\n    ) {\n        var path: String? = null\n        var context: String? = null\n        var file: File? = null\n        var apilevel = 0\n        var reported = false\n        inline fun withPath(path: String, block: Analyzer.() -> Unit) {\n            this.path = path\n            block(this)\n            this.path = null\n        }\n\n        inline fun withContext(context: String, block: Analyzer.() -> Unit) {\n            this.context = context\n            block(this)\n            this.context = null\n        }\n\n        fun report(prefix: String, message: String) {\n            reported = true\n            file?.let { file ->\n                println(\"> $file\")\n                this.file = null\n            }\n            context?.let { context ->\n                println(\"    > $context\")\n                this.context = null\n            }\n            path?.let { path ->\n                println(\"      > $path\")\n                this.path = null\n            }\n            if (prefix.isBlank()) {\n                message\n            } else {\n                \"$prefix: $message\"\n            }.split('\\n').forEach { println(\"          $it\") }\n        }\n\n        fun needCheck(type: String): Boolean {\n            if (type.startsWith(\"android/\")) return true\n            if (type.startsWith(\"androidx/\")) return true\n            if (type.startsWith(\"java/\")) return true\n            if (type.startsWith(\"javax/\")) return true\n            return classesInfos.containsKey(type)\n        }\n\n        fun checkClass(prefix: String, name: String) {\n            if (!needCheck(name)) return\n            val info = classesInfos[name]\n            if (info == null) {\n                report(prefix, \"$name not found in api-version.xml\")\n                return\n            }\n            if (info.since > apilevel) {\n                report(prefix, \"$name since api level ${info.since}\")\n            }\n        }\n\n        fun checkFieldAccess(prefix: String, owner: String, name: String) {\n            if (!needCheck(owner)) return\n\n            val info = classesInfos[owner] ?: return\n            val field = info.fieldInfos[name]\n            if (field == null) {\n                report(prefix, \"No field $owner.$name\")\n                return\n            }\n            if ((field.since ?: 0) > apilevel) {\n                report(prefix, \"$owner.$name since api level ${field.since}\")\n            }\n        }\n\n        fun checkMethodAccess(prefix: String, owner: String, name: String) {\n            if (!needCheck(owner)) return\n\n            fun findMethod(type: String): ClassInfo.MemberInfo? {\n                val cinfo = classesInfos[type] ?: return null\n                return cinfo.methodInfos[name] ?: kotlin.run {\n                    cinfo.superTypes.forEach { stype ->\n                        if (stype.removed != null) {\n                            if (apilevel >= stype.removed) return@forEach\n                        }\n                        if (stype.since != null) {\n                            if (apilevel < stype.since) return@forEach\n                        }\n                        findMethod(stype.name)?.let { return it }\n                    }\n                    null\n                }\n            }\n\n            val method = findMethod(owner)\n            if (method == null) {\n                report(prefix, \"No method $owner.$name\")\n                return\n            }\n            if ((method.since ?: 0) > apilevel) {\n                report(prefix, \"$owner.$name since api level ${method.since}\")\n            }\n        }\n\n        private val Type.top: Type\n            get() = when (sort) {\n                Type.ARRAY -> elementType\n                else -> this\n            }\n\n\n        fun analyze(classNode: ClassNode, file: File) {\n            this.file = file\n            withContext(\"Check class\") {\n                withPath(\"class checking\") {\n                    checkClass(\"Couldn't extend ${classNode.superName}\", classNode.superName)\n                    classNode.interfaces?.forEach { checkClass(\"Couldn't implements $it\", it) }\n                }\n            }\n            classNode.fields?.forEach { field ->\n                withContext(\"Field ${field.name}: ${field.desc}\") {\n                    val type = Type.getType(field.desc).top.internalName\n                    checkClass(\"Couldn't access $type\", type)\n                }\n            }\n            classNode.methods?.forEach { method ->\n                withContext(\"Method ${method.name}${method.desc}\") {\n                    withPath(\"Checking method desc\") {\n                        val returnType = Type.getReturnType(method.desc).top.internalName\n                        checkClass(\"Couldn't access $returnType\", returnType)\n                        Type.getArgumentTypes(method.desc).map { it.top.internalName }.forEach {\n                            checkClass(\"Couldn't access $it\", it)\n                        }\n                    }\n                    method.instructions?.forEach { insn ->\n                        when (insn) {\n                            is FieldInsnNode -> {\n                                withPath(\"Access field ${insn.owner}.${insn.name}: ${insn.desc}\") {\n                                    val type = Type.getType(insn.desc)\n                                    val prefix = \"Couldn't access ${insn.owner}.${insn.name}: ${insn.desc}\"\n                                    checkClass(prefix, type.internalName)\n                                    checkFieldAccess(prefix, insn.owner, insn.name)\n                                }\n                            }\n                            is MethodInsnNode -> {\n                                withPath(\"Invoke method ${insn.owner}.${insn.name}${insn.desc}\") {\n                                    checkClass(\"Couldn't access ${insn.owner}\", insn.owner)\n                                    val returnType = Type.getReturnType(insn.desc).top.internalName\n                                    checkClass(\"Couldn't access $returnType\", returnType)\n                                    Type.getArgumentTypes(insn.desc).map { it.top.internalName }.forEach {\n                                        checkClass(\"Couldn't access $it\", it)\n                                    }\n                                    checkMethodAccess(\n                                        \"Couldn't access ${insn.owner}.${insn.name}${insn.desc}\",\n                                        insn.owner,\n                                        insn.name + insn.desc\n                                    )\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    @Suppress(\"UNCHECKED_CAST\")\n    fun check(classes: File, level: Int, project: Project) {\n        val apiVersionsFile =\n            project.rootProject.projectDir.resolve(\"buildSrc/src/main/resources/androidutil/api-versions.xml\")\n        val classesInfos = mutableMapOf<String, ClassInfo>()\n        @Suppress(\"DEPRECATION\")\n        groovy.util.XmlParser().parse(apiVersionsFile).children().forEach { classNode ->\n            classNode as Node\n            if (classNode.name() == \"class\") {\n                val fieldInfos = mutableMapOf<String, ClassInfo.MemberInfo>()\n                val methodInfos = mutableMapOf<String, ClassInfo.MemberInfo>()\n                val cinfo = ClassInfo(\n                    classNode.attribute(\"name\").toString(),\n                    classNode.attribute(\"since\").toString().toInt(),\n                    (classNode.children() as List<Node>).filter {\n                        it.name() == \"implements\" || it.name() == \"extends\"\n                    }.map {\n                        ClassInfo.SuperInfo(\n                            it.attribute(\"name\").toString(),\n                            it.attribute(\"since\")?.toString()?.toInt(),\n                            it.attribute(\"removed\")?.toString()?.toInt()\n                        )\n                    },\n                    fieldInfos, methodInfos\n                )\n                classesInfos[cinfo.name] = cinfo\n                classNode.children().forEach { memberNode ->\n                    memberNode as Node\n                    when (memberNode.name()) {\n                        \"method\" -> {\n                            val method = ClassInfo.MemberInfo(\n                                memberNode.attribute(\"name\").toString(),\n                                memberNode.attribute(\"since\")?.toString()?.toInt()\n                            )\n                            methodInfos[method.name] = method\n                        }\n                        \"field\" -> {\n                            val field = ClassInfo.MemberInfo(\n                                memberNode.attribute(\"name\").toString(),\n                                memberNode.attribute(\"since\")?.toString()?.toInt()\n                            )\n                            fieldInfos[field.name] = field\n                        }\n                    }\n                }\n            }\n        }\n        val analyzer = Analyzer(classesInfos)\n        analyzer.apilevel = level\n\n        classes.walk()\n            .filter { it.isFile && it.extension == \"class\" }\n            .map { file ->\n                kotlin.runCatching {\n                    AsmUtil.run { file.readClass() }\n                }.getOrNull() to file\n            }\n            .filter { it.first != null }\n            .map {\n                @Suppress(\"UNCHECKED_CAST\")\n                it as Pair<ClassNode, File>\n            }\n            .forEach { (classNode, file) ->\n                analyzer.analyze(classNode, file)\n            }\n\n        if (analyzer.reported) {\n            error(\"Verify failed\")\n        }\n    }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/analyzes/AsmUtil.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage analyzes\n\nimport org.objectweb.asm.ClassReader\nimport org.objectweb.asm.Opcodes\nimport org.objectweb.asm.tree.ClassNode\nimport org.objectweb.asm.tree.FieldNode\nimport org.objectweb.asm.tree.MethodNode\nimport java.io.File\nimport java.io.InputStream\n\ntypealias AsmClasses = Map<String, ClassNode>\ntypealias AsmClassesM = MutableMap<String, ClassNode>\n\nobject AsmUtil {\n    fun ClassNode.getMethod(name: String, desc: String, isStatic: Boolean): MethodNode? {\n        return methods?.firstOrNull {\n            it.name == name && it.desc == desc && ((it.access and Opcodes.ACC_STATIC) != 0) == isStatic\n        }\n    }\n\n    fun ClassNode.getField(name: String, desc: String, isStatic: Boolean): FieldNode? {\n        return fields?.firstOrNull {\n            it.name == name && it.desc == desc && ((it.access and Opcodes.ACC_STATIC) != 0) == isStatic\n        }\n    }\n\n    fun File.readClass(): ClassNode = inputStream().use { it.readClass() }\n\n    fun InputStream.readClass(): ClassNode {\n        val cnode = ClassNode()\n        ClassReader(this).accept(cnode, 0)\n        return cnode\n    }\n\n    private fun AsmClassesM.patchJvmClass(owner: String) {\n        if (owner.startsWith(\"java/\") || owner.startsWith(\"javax/\")) {\n            if (!this.containsKey(owner)) {\n                ClassLoader.getSystemClassLoader().getResourceAsStream(\"$owner.class\")?.use {\n                    val c = it.readClass()\n                    this[c.name] = c\n                }\n            }\n        }\n    }\n\n    fun AsmClassesM.hasField(\n        owner: String,\n        name: String,\n        desc: String,\n        opcode: Int\n    ): Boolean {\n        patchJvmClass(owner)\n        val c = this[owner] ?: return false\n        val isStatic = opcode == Opcodes.GETSTATIC || opcode == Opcodes.PUTSTATIC\n        if (c.getField(name, desc, isStatic) != null) {\n            return true\n        }\n        if (isStatic) return false\n        return hasField(c.superName ?: \"\", name, desc, opcode)\n    }\n\n    fun AsmClassesM.hasMethod(\n        owner: String,\n        name: String,\n        desc: String,\n        opcode: Int\n    ): Boolean {\n        patchJvmClass(owner)\n        when (opcode) {\n            Opcodes.INVOKESTATIC -> {\n                val c = this[owner] ?: return false\n                return c.getMethod(name, desc, true) != null\n            }\n            Opcodes.INVOKEINTERFACE,\n            Opcodes.INVOKESPECIAL,\n            Opcodes.INVOKEVIRTUAL -> {\n                fun loopFind(current: String): Boolean {\n                    patchJvmClass(current)\n                    val c = this[current] ?: return false\n                    if (c.getMethod(name, desc, false) != null) return true\n                    c.superName?.let {\n                        if (loopFind(it)) {\n                            return true\n                        }\n                    }\n                    c.interfaces?.forEach {\n                        if (loopFind(it)) return true\n                    }\n                    return false\n                }\n                return loopFind(owner)\n            }\n        }\n        return false\n    }\n}"
  },
  {
    "path": "buildSrc/src/main/kotlin/analyzes/CompiledCodeVerify.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage analyzes\n\nimport org.gradle.api.Project\nimport java.io.File\n\ntypealias VerifyAction = (classes: Sequence<File>, libraries: Sequence<File>) -> Unit\n\ndata class ProjectInfo(val isMpp: Boolean, val name: String)\n\nfun JvmProjectInfo(name: String) = ProjectInfo(false, name)\nfun MppProjectInfo(name: String) = ProjectInfo(true, name)\n\n@Suppress(\"MemberVisibilityCanBePrivate\")\nobject CompiledCodeVerify {\n\n    private const val RUN_ALL_VERITY_TASK_NAME = \"runAllVerify\"\n    private const val VERIFICATION_GROUP_NAME = \"verification\"\n\n    private val projectInfos = listOf(\n        MppProjectInfo(\"mirai-core-api\"), MppProjectInfo(\"mirai-core-utils\"),\n        JvmProjectInfo(\"mirai-console\"), JvmProjectInfo(\"mirai-console-terminal\")\n    ).associateBy { it.name }\n\n    private val ProjectInfo.compileTasks: Array<String>\n        get() = if (isMpp) {\n            arrayOf(\":$name:jvmMainClasses\", \":$name:androidMainClasses\")\n        } else arrayOf(\":$name:classes\")\n\n    private fun getCompiledClassesPath(project: Project, info: ProjectInfo): Sequence<Sequence<File>> =\n        if (info.isMpp) {\n            sequenceOf(\"kotlin/jvm/main\", \"kotlin/android/main\")\n        } else {\n            sequenceOf(\"kotlin/main\")\n        }.map { sequenceOf(project.buildDir.resolve(\"classes\").resolve(it)) }\n\n    private fun getLibraries(project: Project, info: ProjectInfo): Sequence<Sequence<File>?> =\n        if (info.isMpp) {\n            sequenceOf(\"jvmCompileClasspath\", \"androidCompileClasspath\")\n        } else {\n            sequenceOf(\"compileClasspath\")\n        }.map {\n            project.configurations.findByName(it)?.files?.asSequence()\n        }\n\n    fun Project.registerVerifyTask(taskName: String, action: VerifyAction) {\n\n        val projectInfo = projectInfos[this.name] ?: error(\"Project info of $name not found\")\n\n        tasks.register(taskName) {\n            group = VERIFICATION_GROUP_NAME\n            projectInfo.compileTasks.forEach {\n                tasks.findByPath(it)?.also { compileTask ->\n                    mustRunAfter(compileTask)\n                }\n            }\n\n            doFirst {\n                getCompiledClassesPath(project, projectInfo).zip(getLibraries(project, projectInfo))\n                    .forEach { (compiledClasses, libraries) ->\n                        if (libraries != null) {\n                            action(compiledClasses, libraries)\n                        }\n                    }\n            }\n        }\n\n        tasks.named(\"check\").configure { dependsOn(taskName) }\n        rootProject.tasks.getByName(RUN_ALL_VERITY_TASK_NAME).dependsOn(\":$name:$taskName\")\n    }\n\n    private fun Project.registerVerifyTasks() { // for feature extends\n        // https://github.com/mamoe/mirai/pull/1080#issuecomment-801197312\n        if (name != \"mirai-console\") {\n            registerVerifyTask(\"verify_NoNoSuchMethodError\", NoSuchMethodAnalyzer::check)\n        }\n    }\n\n    fun Project/*RootProject*/.registerAllVerifyTasks() {\n        tasks.register(RUN_ALL_VERITY_TASK_NAME) {\n            group = VERIFICATION_GROUP_NAME\n        }\n        projectInfos.keys.forEach { projectName ->\n            findProject(projectName)?.let { subProject ->\n                subProject.afterEvaluate { subProject.registerVerifyTasks() }\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "buildSrc/src/main/kotlin/analyzes/NoSuchMethodAnalyzer.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage analyzes\n\nimport analyzes.AsmUtil.hasField\nimport analyzes.AsmUtil.hasMethod\nimport org.objectweb.asm.tree.FieldInsnNode\nimport org.objectweb.asm.tree.MethodInsnNode\nimport org.objectweb.asm.tree.MethodNode\nimport java.io.File\nimport java.util.zip.ZipFile\n\n@Suppress(\"UNCHECKED_CAST\")\nobject NoSuchMethodAnalyzer {\n    private fun analyzeMethod(\n        analyzer: AndroidApiLevelCheck.Analyzer,\n        method: MethodNode,\n        asmClasses: AsmClassesM\n    ) {\n        analyzer.withContext(\"Analyze ${method.name}${method.desc}\") {\n            method.instructions?.forEach { insn ->\n                when (insn) {\n                    is MethodInsnNode -> {\n                        if (insn.owner.startsWith(\"net/mamoe/mirai/\")) {\n                            if (!asmClasses.hasMethod(insn.owner, insn.name, insn.desc, insn.opcode)) {\n                                report(\n                                    \"No such method\",\n                                    \"${insn.owner}.${insn.name}${insn.desc}, opcode=${insn.opcode}\"\n                                )\n                            }\n                        }\n                    }\n                    is FieldInsnNode -> {\n                        if (insn.owner.startsWith(\"net/mamoe/mirai/\")) {\n                            if (!asmClasses.hasField(insn.owner, insn.name, insn.desc, insn.opcode)) {\n                                report(\n                                    \"No such field\",\n                                    \"${insn.owner}.${insn.name}: ${insn.desc}, opcode=${insn.opcode}\"\n                                )\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    fun check(classes: Sequence<File>, libs: Sequence<File>) = AsmUtil.run {\n        val analyzer = AndroidApiLevelCheck.Analyzer(emptyMap())\n        val asmClasses: AsmClassesM = mutableMapOf()\n        libs.forEach { lib ->\n            if (lib.name.endsWith(\".jar\")) {\n                ZipFile(lib).use { zip ->\n                    zip.entries().iterator().forEach l@{ entry ->\n                        if (entry.isDirectory) return@l\n                        if (!entry.name.endsWith(\".class\")) return@l\n                        zip.getInputStream(entry).use { it.readClass() }.let {\n                            asmClasses[it.name] = it\n                        }\n                    }\n                }\n            } else if (lib.isDirectory) {\n                lib.walk().filter { it.isFile && it.extension == \"class\" }.forEach { f ->\n                    f.readClass().let { asmClasses[it.name] = it }\n                }\n            }\n        }\n        classes.map { it.walk() }.flatten().filter { it.isFile }\n            .filter { it.extension == \"class\" }\n            .map { it.readClass() to it }\n            .onEach { (c, _) ->\n                asmClasses[c.name] = c\n            }.toList().forEach { (classNode, file) ->\n                analyzer.file = file\n                classNode.methods?.forEach { method ->\n                    analyzeMethod(analyzer, method, asmClasses)\n                }\n            }\n        if (analyzer.reported) {\n            error(\"Verify failed\")\n        }\n    }\n}"
  },
  {
    "path": "buildSrc/src/main/kotlin/explicit-api.gradle.kts",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nimport org.jetbrains.kotlin.gradle.dsl.KotlinCompile\n\n/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nprivate val EXPLICIT_API = \"-Xexplicit-api=strict\"\n\n// Workaround for explicit API in androidMain\n// https://youtrack.jetbrains.com/issue/KT-37652/Support-explicit-mode-for-Android-projects\n// https://youtrack.jetbrains.com/issue/KT-37652/Support-explicit-mode-for-Android-projects#focus=Comments-27-4501224.0-0\n\nproject.tasks\n    .matching { it is KotlinCompile<*> && !it.name.contains(\"test\", ignoreCase = true) }\n    .configureEach {\n        if (!project.hasProperty(\"kotlin.optOutExplicitApi\")) {\n            val kotlinCompile = this as KotlinCompile<*>\n            if (EXPLICIT_API !in kotlinCompile.kotlinOptions.freeCompilerArgs) {\n                kotlinCompile.kotlinOptions.freeCompilerArgs += EXPLICIT_API\n            }\n        }\n    }\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/keys/SecretKeys.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage keys\n\nimport org.gradle.api.Project\nimport java.io.BufferedReader\n\nopen class SecretKeys(\n    val type: String,\n    val user: String,\n    val password: String\n) {\n    class Invalid(\n        type: String,\n        override val isDisabled: Boolean = false\n    ) : SecretKeys(type, \"\", \"\") {\n        override val isValid: Boolean get() = false\n        override fun requireNotInvalid(): Nothing {\n            error(\n                \"\"\"\n                Key $type not found.\n                Please lease specify by creating a file $type.key in projectDir/build-secret-keys\n                or by providing JVM parameter '$type.user', `$type.password`\n            \"\"\".trimIndent()\n            )\n        }\n    }\n\n    companion object {\n        val keyCaches = mutableMapOf<Project, ProjectKeysCache>()\n\n        @JvmStatic\n        fun getCache(project: Project): ProjectKeysCache =\n            keyCaches.computeIfAbsent(project, SecretKeys::ProjectKeysCache)\n    }\n\n    class ProjectKeysCache(val project: Project) {\n        val keys = mutableMapOf<String, SecretKeys>()\n        fun loadKey(type: String) = keys.computeIfAbsent(type, this::loadKey0)\n\n        private fun loadKey0(type: String): SecretKeys {\n\n            project.parent?.let { parent ->\n                getCache(parent).loadKey(type).takeIf {\n                    it.isValid || it.isDisabled\n                }?.let { return it }\n            }\n\n            val secretKeys = project.projectDir.resolve(\"build-secret-keys\")\n\n            kotlin.run {\n                val secretKeyFile = secretKeys.resolve(\"$type.disable\").takeIf { it.isFile }\n                    ?: secretKeys.resolve(\"$type.disable.txt\")\n                if (secretKeyFile.isFile) return Invalid(type, true) // Disabled\n            }\n\n            // Load from secretKeys/$type.key\n            kotlin.run {\n                val secretKeyFile = secretKeys.resolve(\"$type.key\").takeIf { it.isFile }\n                    ?: secretKeys.resolve(\"$type.key.txt\")\n                if (secretKeyFile.isFile) {\n                    secretKeyFile.bufferedReader().use {\n                        fun BufferedReader.readLineNonEmpty(): String {\n                            while (true) {\n                                val nextLine = readLine() ?: return \"\"\n                                if (nextLine.isNotBlank()) {\n                                    return nextLine.trim()\n                                }\n                            }\n                        }\n                        return SecretKeys(type, it.readLineNonEmpty(), it.readLineNonEmpty())\n                    }\n                }\n            }\n            // Load from project/%type.key, user\n            kotlin.run {\n                val userFile = project.projectDir.resolve(\"$type.user.txt\")\n                val keyFile = project.projectDir.resolve(\"$type.key.txt\")\n                if (userFile.isFile && keyFile.isFile) {\n                    return SecretKeys(type, userFile.readText().trim(), keyFile.readText().trim())\n                }\n            }\n\n\n            // Load from property $type.user, $type.password\n\n            fun findProperty(type: String): String? {\n                val p = project.findProperty(type)\n                    ?: System.getProperty(type)\n                    ?: System.getenv(type)\n\n                return p?.toString()\n            }\n\n            val tUser = findProperty(\"$type.user\")\n                ?: findProperty(\"${type}_user\")\n\n            val tPassword = findProperty(\"$type.password\")\n                ?: findProperty(\"$type.passwd\")\n                ?: findProperty(\"$type.key\")\n                ?: findProperty(\"${type}_password\")\n                ?: findProperty(\"${type}_passwd\")\n                ?: findProperty(\"${type}_key\")\n\n            if (tUser != null && tPassword != null) {\n                return SecretKeys(type, tUser, tPassword)\n            }\n\n            return Invalid(type)\n        }\n    }\n\n    open val isValid: Boolean get() = true\n    open val isDisabled: Boolean get() = false\n    open fun requireNotInvalid(): SecretKeys = this\n}"
  },
  {
    "path": "buildSrc/src/main/kotlin/shadow/Relocation.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage shadow\n\nimport ExcludeProperties\nimport RelocatableDependency\nimport RelocatedDependency\nimport org.gradle.api.Action\nimport org.gradle.api.DomainObjectCollection\nimport org.gradle.api.Project\nimport org.gradle.api.artifacts.Configuration\nimport org.gradle.api.artifacts.Dependency\nimport org.gradle.api.artifacts.ExternalModuleDependency\nimport org.gradle.api.artifacts.dsl.DependencyHandler\nimport org.gradle.kotlin.dsl.accessors.runtime.addDependencyTo\nimport org.gradle.kotlin.dsl.extra\nimport org.gradle.kotlin.dsl.invoke\nimport org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler\n\n/**\n * # 非常重要的提示 — 有关 relocation — 在看完全部本文前, 不要进行任何操作\n *\n * Mirai 会 relocate 一些内部使用的依赖库, 来允许调用方 (依赖 mirai 的模块).\n * 例如, mirai 使用 2.0, 但调用方可以使用 Ktor 1.0 而不会有 classpath 冲突.\n *\n * 这是通过 relocation 完成的. 在 mirai 项目构建中, Relocation 是指将一个模块的一些 class 的包名替换为另一个包名的过程.\n * 继续使用 Ktor 示例, `io.ktor.utils.io.core.ByteReadPacket` 将会被 relocate 为\n * `net.mamoe.mirai.internal.deps.io.ktor.utils.io.core.ByteReadPacket`, 即放到内部包内.\n *\n * ## 哪些模块被 relocate 了?\n *\n * 在 2.13.0 mirai 只 relocate `io.ktor`, `okhttp3`, `okio` 下的所有类.\n *\n * ## 如何配置 relocation?\n *\n * Relocation 的范围是通过 [Configuration] 指定的.\n *\n * 在通常的 `dependencies` 配置中, 使用 [relocateCompileOnly] 和 [relocateImplementation]\n * 可分别创建 `compileOnly` 或 `implementation` 的依赖, 并为其配置 relocation.\n *\n * ## 不能 relocate 参与 mirai 公开 API/ABI 的库\n *\n * 有些库的部分定义参与组成 mirai 的公开 API/ABI. 例如 kotlin-stdlib 提供 `String` 等类型, kotlinx-coroutines 提供 `CoroutineScope`等.\n * mirai 已经发布了使用这些类型的 API, 为了保证 ABI 兼容, 不能 relocate 它们 (你就需要在 [Configuration] `exclude`).\n * 要知道哪些 API 参与了 ABI, 执行 `./gradlew :mirai-core:dependencies` (把 `mirai-core` 换成你想了解的模块), 查看 `runtimeDependencies` 之类的.\n *\n * ## 考虑是否在运行时包含你的依赖 — 选择 [relocateCompileOnly] 和 [relocateImplementation]\n *\n * 根据 [Configuration] 配置不同, 被 relocate 的模块的间接依赖可能会或不会被处理.\n * 例如\n *\n * 所以 `io.ktor:ktor-client-okhttp` 依赖的 okhttp 不会被 relocate!\n * 因此你必须手动检查目标依赖的全部间接依赖并添加 relocation 配置. 不要轻易升级经过了 relocation 的依赖, 因为有可能他们的新版本会使用新的依赖!\n * 这个过程无法自动化, 因为你 relocate 的模块可能会依赖 kotlin-stlib 等你不会想要 relocation 的依赖. 为什么你不会想 relocate kotlin-stlib? 继续阅读\n *\n * relocate 依赖之后, 你的程序在运行时必须要有 relocate 之后的类, 比如 `net.mamoe.mirai.internal.deps.io.ktor.utils.io.core.ByteReadPacket`.\n *\n * [relocateCompileOnly] 会为你添加通常的 `compileOnly`, 然后配置 relocate, 但不会在打包 JAR 时包含被 relocate 的库. 而 [relocateImplementation] 则会包含.\n *\n * 在独立模块下很简单, 你只要一直使用 [relocateImplementation] 就行了.\n *\n * 但在有依赖关系的模块, 比如 mirai-core-api 依赖 mirai-core-utils, 而它们都需要使用 ktor-io, 就需要让_最早_依赖 ktor-io 的 mirai-core-utils 模块在运行时包含 ([relocateImplementation]), 而 mirai-core-api 不包含 ([relocateCompileOnly]).\n * 运行时 mirai-core-api 就会使用来自 mirai-core-utils 的 `net.mamoe.mirai.internal.deps.io.ktor.utils.io.core.ByteReadPacket`.\n *\n * 如果你都使用 [relocateImplementation], 就会导致在 Android 平台发生 'Duplicated Class' 问题. 如果你都使用 [relocateCompileOnly] 则会在 clinit 阶段遇到 [NoClassDefFoundError]\n *\n * ## relocation 发生的时机晚于编译 (Jar)\n *\n * mirai-core-utils relocate 了 ktor-io, 然后 mirai-core 在 `build.gradle.kts` 使用了 `implementation(project(\":mirai-core-utils\"))`.\n * 在 mirai-core 编译时, 编译器仍然会使用 relocate 之前的 `io.ktor`. 为了在 mirai-core 将对 `io.ktor` 的调用转为对 `net.mamoe.mirai.internal.deps.io.ktor` 的调用, 需要配置 relocation.\n * 所以此时就不能让 mirai-core 也打包 relocation 后的 ktor 而在运行时携带, 否则因为用户依赖 mirai-core 时 Maven 会同时下载 mirai-core-utils, 用户 classpath 就会有两份被 relocate 的 Ktor, 导致冲突.\n *\n * 所以你需要为所有依赖了 mirai-core-utils 的模块都分别配置 [relocateCompileOnly].\n *\n * ## relocation 仅在发布 (e.g. `publishToMavenLocal`) 时自动使用\n *\n * 其他任何时候, 比如在 mirai-console 编译时, mirai-console 依赖的是未 relocate 的 JAR. 使用 `jar` 任务打包的也是未 relocate 的.\n *\n * 若需要 relocated 的 JAR, 使用 `relocateJvmDependencies`. 其中 `Jvm` 可换为其他启动了 relocate 的 Kotlin target 名.\n * 可在 IDEA Gradle 视图中找到 mirai 文件夹, 查看可用的 task 列表.\n *\n * ### \"在运行时包含\" 是如何实现的?\n *\n * 被 relocate 的类会被直接当做是当前模块的类打包进 JAR.\n * 比如 ktor-io 的所有代码就会被变换包名后全部打包进 \"mirai-core-utils.jar\",\n * 而不是在 maven POM 中定义而以后从 Maven Central 等远程仓库下载.\n *\n * ----\n *\n * 如果你已经懂了以上内容, 你就可以修改 relocation 相关了. 修改之后一定在 mirai-deps-test 模块中添加测试.\n */\nobject RelocationNotes\n\n/**\n * 添加一个通常的 [compileOnly][KotlinDependencyHandler.compileOnly] 依赖, 并按 [relocatedDependency] 定义的配置 relocate.\n *\n * 在发布版本时, 全部对 [RelocatedDependency.packages] 中的 API 的调用**都不会**被 relocate 到 [RelocationConfig.RELOCATION_ROOT_PACKAGE].\n * 运行时 (runtime) **不会**包含被 relocate 的依赖及其所有间接依赖.\n *\n * @see RelocationNotes\n */\nfun KotlinDependencyHandler.relocateCompileOnly(\n    relocatedDependency: RelocatedDependency,\n): ExternalModuleDependency {\n    val dependency = compileOnly(relocatedDependency.notation) {\n        relocatedDependency.exclusionAction(this)\n    }\n    project.relocationFilters.add(\n        RelocationFilter(\n            relocatedDependency.notationsToExcludeInPom,\n            relocatedDependency.packages.toList(),\n            includeInRuntime = false,\n        )\n    )\n    // Don't add to runtime\n    return dependency\n}\n\n/**\n * 添加一个通常的 [compileOnly][KotlinDependencyHandler.compileOnly] 依赖, 并按 [relocatedDependency] 定义的配置 relocate.\n *\n * 在发布版本时, 全部对 [RelocatedDependency.packages] 中的 API 的调用**都不会**被 relocate 到 [RelocationConfig.RELOCATION_ROOT_PACKAGE].\n * 运行时 (runtime) **不会**包含被 relocate 的依赖及其所有间接依赖.\n *\n * @see RelocationNotes\n */\nfun DependencyHandler.relocateCompileOnly(\n    project: Project,\n    relocatedDependency: RelocatedDependency,\n): Dependency {\n    val dependency =\n        addDependencyTo(this, \"compileOnly\", relocatedDependency.notation, Action<ExternalModuleDependency> {\n            relocatedDependency.exclusionAction(this)\n        })\n    project.relocationFilters.add(\n        RelocationFilter(\n            relocatedDependency.notationsToExcludeInPom,\n            relocatedDependency.packages.toList(),\n            includeInRuntime = false,\n        )\n    )\n    // Don't add to runtime\n    return dependency\n}\n\n/**\n * 添加一个通常的 [implementation][KotlinDependencyHandler.implementation] 依赖, 并按 [relocatedDependency] 定义的配置 relocate.\n *\n * 在发布版本时, 全部对 [RelocatedDependency.packages] 中的 API 的调用**都会**被 relocate 到 [RelocationConfig.RELOCATION_ROOT_PACKAGE].\n * 运行时 (runtime) 将**会**包含被 relocate 的依赖及其所有间接依赖.\n *\n * @see RelocationNotes\n */\nfun KotlinDependencyHandler.relocateImplementation(\n    relocatedDependency: RelocatedDependency,\n    action: ExternalModuleDependency.() -> Unit = {}\n): ExternalModuleDependency {\n    val dependency = implementation(relocatedDependency.notation) {\n        relocatedDependency.exclusionAction(this)\n    }\n    project.relocationFilters.add(\n        RelocationFilter(\n            relocatedDependency.notationsToExcludeInPom, relocatedDependency.packages.toList(), includeInRuntime = true,\n        )\n    )\n    val configurationName = RelocationConfig.SHADOW_RELOCATION_CONFIGURATION_NAME\n    project.configurations.maybeCreate(configurationName)\n    addDependencyTo(\n        project.dependencies,\n        configurationName,\n        relocatedDependency.notation,\n        Action<ExternalModuleDependency> {\n            relocatedDependency.exclusionAction(this)\n            intrinsicExclusions()\n            action()\n        }\n    )\n    return dependency\n}\n\n/**\n * 添加一个通常的 [implementation][KotlinDependencyHandler.implementation] 依赖, 并按 [relocatedDependency] 定义的配置 relocate.\n *\n * 在发布版本时, 全部对 [RelocatedDependency.packages] 中的 API 的调用都会被 relocate 到 [RelocationConfig.RELOCATION_ROOT_PACKAGE].\n * 运行时 (runtime) 将会包含被 relocate 的依赖及其所有间接依赖.\n *\n * @see RelocationNotes\n */\nfun DependencyHandler.relocateImplementation(\n    project: Project,\n    relocatedDependency: RelocatedDependency,\n    action: Action<ExternalModuleDependency> = Action {}\n): ExternalModuleDependency {\n    val dependency =\n        addDependencyTo(this, \"implementation\", relocatedDependency.notation, Action<ExternalModuleDependency> {\n            relocatedDependency.exclusionAction(this)\n        })\n    project.relocationFilters.add(\n        RelocationFilter(\n            relocatedDependency.notationsToExcludeInPom, relocatedDependency.packages.toList(), includeInRuntime = true,\n        )\n    )\n    val configurationName = RelocationConfig.SHADOW_RELOCATION_CONFIGURATION_NAME\n    project.configurations.maybeCreate(configurationName)\n    addDependencyTo(\n        project.dependencies,\n        configurationName,\n        relocatedDependency.notation,\n        Action<ExternalModuleDependency> {\n            relocatedDependency.exclusionAction(this)\n            intrinsicExclusions()\n            action(this)\n        }\n    )\n    return dependency\n}\n\nprivate val ExternalModuleDependency.groupNotNull: String get() = group.toString()\n\nprivate fun ExternalModuleDependency.intrinsicExclusions() {\n    exclude(ExcludeProperties.`everything from kotlin`)\n    exclude(ExcludeProperties.`everything from kotlinx`)\n}\n\n\ndata class RelocationFilter(\n    val notations: RelocatableDependency,\n    val packages: List<String>,\n//    val filesFilter: String = groupId.replace(\".\", \"/\"),\n    /**\n     * Pack relocated dependency into the fat jar. If set to `false`, dependencies will be removed.\n     * This is to avoid duplicated classes. See #2291.\n     */ // #2291\n    val includeInRuntime: Boolean,\n) {\n\n    fun matchesDependency(groupId: String?, artifactId: String?): Boolean {\n        return notations.notations().any {\n            it.groupId == groupId && it.artifactId == artifactId\n        }\n    }\n}\n\nval Project.relocationFilters: DomainObjectCollection<RelocationFilter>\n    get() {\n        if (project.extra.has(\"relocationFilters\")) {\n            @Suppress(\"UNCHECKED_CAST\")\n            return project.extra.get(\"relocationFilters\") as DomainObjectCollection<RelocationFilter>\n\n        } else {\n            val container = project.objects.domainObjectSet(RelocationFilter::class.java)\n            project.extra.set(\"relocationFilters\", container)\n            return container\n        }\n    }\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/shadow/RelocationConfig.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage shadow\n\nimport titlecase\n\nobject RelocationConfig {\n    const val RELOCATION_ROOT_PACKAGE = \"net.mamoe.mirai.internal.deps\"\n\n    const val SHADOW_RELOCATION_CONFIGURATION_NAME = \"shadowRelocation\"\n\n    fun taskNameForRelocateDependencies(\n        targetName: String\n    ) = \"relocate${targetName.titlecase()}Dependencies\"\n\n    fun relocatedPublicationName(originalPublicationName: String): String = originalPublicationName + \"Relocated\"\n}"
  },
  {
    "path": "buildSrc/src/main/kotlin/shadow/Shadow.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage shadow\n\nimport MIRAI_PLATFORM_INTERMEDIATE\nimport capitalize\nimport com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar\nimport kotlinJvm\nimport kotlinMpp\nimport org.gradle.api.Project\nimport org.gradle.api.artifacts.Configuration\nimport org.gradle.api.tasks.bundling.Jar\nimport org.gradle.kotlin.dsl.DependencyHandlerScope\nimport org.gradle.kotlin.dsl.create\nimport org.gradle.kotlin.dsl.get\nimport org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension\nimport org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType\nimport org.jetbrains.kotlin.gradle.plugin.KotlinTarget\nimport sourceSets\n\n/**\n * @see RelocationNotes\n */\nfun Project.configureMppShadow() {\n    val kotlin = kotlinMpp ?: return\n\n    configure(kotlin.targets.filter {\n        it.platformType == KotlinPlatformType.jvm\n                && (it.attributes.getAttribute(MIRAI_PLATFORM_INTERMEDIATE) != true)\n    }) {\n        configureRelocationForMppTarget(project)\n\n        registerRegularShadowTask(this, mapTaskNameForMultipleTargets = true)\n    }\n}\n\n/**\n * Relocate some dependencies for `.jar`\n * @see RelocationNotes\n */\nprivate fun KotlinTarget.configureRelocationForMppTarget(project: Project) = project.run {\n    val configuration = project.configurations.findByName(RelocationConfig.SHADOW_RELOCATION_CONFIGURATION_NAME)\n\n    // e.g. relocateJvmDependencies\n    // do not change task name. see `configureShadowDependenciesForPublishing`\n    val relocateDependenciesName = RelocationConfig.taskNameForRelocateDependencies(targetName)\n    tasks.create(relocateDependenciesName, ShadowJar::class) {\n        group = \"mirai\"\n        description = \"Relocate dependencies to internal package\"\n        destinationDirectory.set(buildDir.resolve(\"libs\")) // build/libs\n        archiveBaseName.set(\"${project.name}-${targetName.lowercase()}-relocated\") // e.g. \"mirai-core-api-jvm\"\n\n        dependsOn(compilations[\"main\"].compileTaskProvider) // e.g. compileKotlinJvm\n\n        from(compilations[\"main\"].output) // Add the compilation result of mirai sourcecode, not including dependencies\n        configuration?.let {\n            from(it) // Include runtime dependencies\n        }\n\n        // Relocate packages\n        afterEvaluate {\n            val relocationFilters = project.relocationFilters\n            relocationFilters.forEach { relocation ->\n                relocation.packages.forEach { aPackage ->\n                    relocate(aPackage, \"${RelocationConfig.RELOCATION_ROOT_PACKAGE}.$aPackage\")\n                }\n            }\n        }\n    }\n}\n\n/**\n * 添加 `implementation` 和 `shadow`\n */\nfun DependencyHandlerScope.shadowImplementation(dependencyNotation: Any) {\n    \"implementation\"(dependencyNotation)\n    \"shadow\"(dependencyNotation)\n}\n\nfun Project.registerRegularShadowTaskForJvmProject(\n    configurations: List<Configuration> = listOfNotNull(\n        project.configurations.findByName(\"runtimeClasspath\"),\n        project.configurations.findByName(\"${kotlinJvm!!.target.name}RuntimeClasspath\"),\n        project.configurations.findByName(\"runtime\")\n    )\n): ShadowJar {\n    return project.registerRegularShadowTask(kotlinJvm!!.target, mapTaskNameForMultipleTargets = false, configurations)\n}\n\nfun Project.registerRegularShadowTask(\n    target: KotlinTarget,\n    mapTaskNameForMultipleTargets: Boolean,\n    configurations: List<Configuration> = listOfNotNull(\n        project.configurations.findByName(\"runtimeClasspath\"),\n        project.configurations.findByName(\"${target.targetName}RuntimeClasspath\"),\n        project.configurations.findByName(\"runtime\")\n    ),\n): ShadowJar {\n    return tasks.create(\n        if (mapTaskNameForMultipleTargets) \"shadow${target.targetName.capitalize()}Jar\" else \"shadowJar\",\n        ShadowJar::class\n    ) {\n        group = \"mirai\"\n        archiveClassifier.set(\"all\")\n\n        (tasks.findByName(\"jar\") as? Jar)?.let {\n            manifest.inheritFrom(it.manifest)\n        }\n\n        val compilation = target.compilations[\"main\"]\n        dependsOn(compilation.compileTaskProvider)\n        from(compilation.output)\n\n//        components.findByName(\"java\")?.let { from(it) }\n        project.sourceSets.findByName(\"main\")?.output?.let { from(it) } // for JVM projects\n        this.configurations = configurations\n\n        // Relocate packages\n        afterEvaluate {\n            val relocationFilters = project.relocationFilters\n            relocationFilters.forEach { relocation ->\n                relocation.packages.forEach { aPackage ->\n                    relocate(aPackage, \"${RelocationConfig.RELOCATION_ROOT_PACKAGE}.$aPackage\")\n                }\n            }\n        }\n\n        exclude { file ->\n            file.name.endsWith(\".sf\", ignoreCase = true)\n        }\n        exclude(\"META-INF/INDEX.LIST\", \"META-INF/*.SF\", \"META-INF/*.DSA\", \"META-INF/*.RSA\", \"module-info.class\")\n    }\n}\n\nfun Project.configureRelocatedShadowJarForJvmProject(kotlin: KotlinJvmProjectExtension): ShadowJar {\n    return registerRegularShadowTask(kotlin.target, mapTaskNameForMultipleTargets = false)\n}\n\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/utils.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nimport groovy.util.Node\nimport groovy.util.NodeList\nimport java.io.InputStream\nimport java.io.OutputStream\nimport java.security.MessageDigest\n\n/*\n * Copyright 2019-2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AFFERO GENERAL PUBLIC LICENSE version 3 license that can be found via the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n@OptIn(ExperimentalUnsignedTypes::class)\nfun ByteArray.toUHexString(\n    separator: String = \" \",\n    offset: Int = 0,\n    length: Int = this.size - offset\n): String {\n    if (length == 0) {\n        return \"\"\n    }\n    val lastIndex = offset + length\n    return buildString(length * 2) {\n        this@toUHexString.forEachIndexed { index, it ->\n            if (index in offset until lastIndex) {\n                var ret = it.toUByte().toString(16).uppercase()\n                if (ret.length == 1) ret = \"0$ret\"\n                append(ret)\n                if (index < lastIndex - 1) append(separator)\n            }\n        }\n    }\n}\n\n\nfun InputStream.md5(): ByteArray {\n    val digest = MessageDigest.getInstance(\"md5\")\n    digest.reset()\n    use { input ->\n        object : OutputStream() {\n            override fun write(b: Int) {\n                digest.update(b.toByte())\n            }\n\n            override fun write(b: ByteArray, off: Int, len: Int) {\n                digest.update(b, off, len)\n            }\n        }.use { output ->\n            input.copyTo(output)\n        }\n    }\n    return digest.digest()\n}\n\n\n\n\nfun Node.getSingleChild(name: String): Node {\n    return (this.get(name) as NodeList).single() as Node\n}\n\nfun Node.childrenNodes(): List<Node> {\n    return this.children().filterIsInstance<Node>()\n}"
  },
  {
    "path": "buildSrc/src/main/resources/androidutil/api-versions.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<api version=\"2\">\n\t<class name=\"android/Manifest\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/Manifest$permission\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"ACCEPT_HANDOVER\" since=\"28\"/>\n\t\t<field name=\"ACCESS_BACKGROUND_LOCATION\" since=\"29\"/>\n\t\t<field name=\"ACCESS_CHECKIN_PROPERTIES\"/>\n\t\t<field name=\"ACCESS_COARSE_LOCATION\"/>\n\t\t<field name=\"ACCESS_FINE_LOCATION\"/>\n\t\t<field name=\"ACCESS_LOCATION_EXTRA_COMMANDS\"/>\n\t\t<field name=\"ACCESS_MEDIA_LOCATION\" since=\"29\"/>\n\t\t<field name=\"ACCESS_MOCK_LOCATION\" removed=\"23\"/>\n\t\t<field name=\"ACCESS_NETWORK_STATE\"/>\n\t\t<field name=\"ACCESS_NOTIFICATION_POLICY\" since=\"23\"/>\n\t\t<field name=\"ACCESS_SURFACE_FLINGER\" removed=\"23\"/>\n\t\t<field name=\"ACCESS_WIFI_STATE\"/>\n\t\t<field name=\"ACCOUNT_MANAGER\" since=\"5\"/>\n\t\t<field name=\"ACTIVITY_RECOGNITION\" since=\"29\"/>\n\t\t<field name=\"ADD_SYSTEM_SERVICE\" removed=\"4\"/>\n\t\t<field name=\"ADD_VOICEMAIL\" since=\"14\"/>\n\t\t<field name=\"ANSWER_PHONE_CALLS\" since=\"26\"/>\n\t\t<field name=\"AUTHENTICATE_ACCOUNTS\" since=\"5\" removed=\"23\"/>\n\t\t<field name=\"BATTERY_STATS\"/>\n\t\t<field name=\"BIND_ACCESSIBILITY_SERVICE\" since=\"16\"/>\n\t\t<field name=\"BIND_APPWIDGET\" since=\"3\"/>\n\t\t<field name=\"BIND_AUTOFILL_SERVICE\" since=\"26\"/>\n\t\t<field name=\"BIND_CALL_REDIRECTION_SERVICE\" since=\"29\"/>\n\t\t<field name=\"BIND_CARRIER_MESSAGING_CLIENT_SERVICE\" since=\"29\"/>\n\t\t<field name=\"BIND_CARRIER_MESSAGING_SERVICE\" since=\"22\" deprecated=\"23\"/>\n\t\t<field name=\"BIND_CARRIER_SERVICES\" since=\"23\"/>\n\t\t<field name=\"BIND_CHOOSER_TARGET_SERVICE\" since=\"23\"/>\n\t\t<field name=\"BIND_CONDITION_PROVIDER_SERVICE\" since=\"24\"/>\n\t\t<field name=\"BIND_DEVICE_ADMIN\" since=\"8\"/>\n\t\t<field name=\"BIND_DREAM_SERVICE\" since=\"21\"/>\n\t\t<field name=\"BIND_INCALL_SERVICE\" since=\"23\"/>\n\t\t<field name=\"BIND_INPUT_METHOD\" since=\"3\"/>\n\t\t<field name=\"BIND_MIDI_DEVICE_SERVICE\" since=\"23\"/>\n\t\t<field name=\"BIND_NFC_SERVICE\" since=\"19\"/>\n\t\t<field name=\"BIND_NOTIFICATION_LISTENER_SERVICE\" since=\"18\"/>\n\t\t<field name=\"BIND_PRINT_SERVICE\" since=\"19\"/>\n\t\t<field name=\"BIND_QUICK_SETTINGS_TILE\" since=\"24\"/>\n\t\t<field name=\"BIND_REMOTEVIEWS\" since=\"11\"/>\n\t\t<field name=\"BIND_SCREENING_SERVICE\" since=\"24\"/>\n\t\t<field name=\"BIND_TELECOM_CONNECTION_SERVICE\" since=\"23\"/>\n\t\t<field name=\"BIND_TEXT_SERVICE\" since=\"14\"/>\n\t\t<field name=\"BIND_TV_INPUT\" since=\"21\"/>\n\t\t<field name=\"BIND_VISUAL_VOICEMAIL_SERVICE\" since=\"26\"/>\n\t\t<field name=\"BIND_VOICE_INTERACTION\" since=\"21\"/>\n\t\t<field name=\"BIND_VPN_SERVICE\" since=\"14\"/>\n\t\t<field name=\"BIND_VR_LISTENER_SERVICE\" since=\"24\"/>\n\t\t<field name=\"BIND_WALLPAPER\" since=\"8\"/>\n\t\t<field name=\"BLUETOOTH\"/>\n\t\t<field name=\"BLUETOOTH_ADMIN\"/>\n\t\t<field name=\"BLUETOOTH_PRIVILEGED\" since=\"19\"/>\n\t\t<field name=\"BODY_SENSORS\" since=\"20\"/>\n\t\t<field name=\"BRICK\" removed=\"23\"/>\n\t\t<field name=\"BROADCAST_PACKAGE_REMOVED\"/>\n\t\t<field name=\"BROADCAST_SMS\" since=\"2\"/>\n\t\t<field name=\"BROADCAST_STICKY\"/>\n\t\t<field name=\"BROADCAST_WAP_PUSH\" since=\"2\"/>\n\t\t<field name=\"CALL_COMPANION_APP\" since=\"29\"/>\n\t\t<field name=\"CALL_PHONE\"/>\n\t\t<field name=\"CALL_PRIVILEGED\"/>\n\t\t<field name=\"CAMERA\"/>\n\t\t<field name=\"CAPTURE_AUDIO_OUTPUT\" since=\"19\"/>\n\t\t<field name=\"CAPTURE_SECURE_VIDEO_OUTPUT\" since=\"19\" removed=\"29\"/>\n\t\t<field name=\"CAPTURE_VIDEO_OUTPUT\" since=\"19\" removed=\"29\"/>\n\t\t<field name=\"CHANGE_COMPONENT_ENABLED_STATE\"/>\n\t\t<field name=\"CHANGE_CONFIGURATION\"/>\n\t\t<field name=\"CHANGE_NETWORK_STATE\"/>\n\t\t<field name=\"CHANGE_WIFI_MULTICAST_STATE\" since=\"4\"/>\n\t\t<field name=\"CHANGE_WIFI_STATE\"/>\n\t\t<field name=\"CLEAR_APP_CACHE\"/>\n\t\t<field name=\"CLEAR_APP_USER_DATA\" removed=\"23\"/>\n\t\t<field name=\"CONTROL_LOCATION_UPDATES\"/>\n\t\t<field name=\"DELETE_CACHE_FILES\"/>\n\t\t<field name=\"DELETE_PACKAGES\"/>\n\t\t<field name=\"DEVICE_POWER\" removed=\"23\"/>\n\t\t<field name=\"DIAGNOSTIC\"/>\n\t\t<field name=\"DISABLE_KEYGUARD\"/>\n\t\t<field name=\"DUMP\"/>\n\t\t<field name=\"EXPAND_STATUS_BAR\"/>\n\t\t<field name=\"FACTORY_TEST\"/>\n\t\t<field name=\"FLASHLIGHT\" removed=\"24\"/>\n\t\t<field name=\"FORCE_BACK\" removed=\"23\"/>\n\t\t<field name=\"FOREGROUND_SERVICE\" since=\"28\"/>\n\t\t<field name=\"FOTA_UPDATE\" removed=\"4\"/>\n\t\t<field name=\"GET_ACCOUNTS\"/>\n\t\t<field name=\"GET_ACCOUNTS_PRIVILEGED\" since=\"23\"/>\n\t\t<field name=\"GET_PACKAGE_SIZE\"/>\n\t\t<field name=\"GET_TASKS\" deprecated=\"21\"/>\n\t\t<field name=\"GET_TOP_ACTIVITY_INFO\" since=\"18\" removed=\"23\"/>\n\t\t<field name=\"GLOBAL_SEARCH\" since=\"4\"/>\n\t\t<field name=\"HARDWARE_TEST\" removed=\"23\"/>\n\t\t<field name=\"INJECT_EVENTS\" removed=\"23\"/>\n\t\t<field name=\"INSTALL_LOCATION_PROVIDER\" since=\"4\"/>\n\t\t<field name=\"INSTALL_PACKAGES\"/>\n\t\t<field name=\"INSTALL_SHORTCUT\" since=\"19\"/>\n\t\t<field name=\"INSTANT_APP_FOREGROUND_SERVICE\" since=\"26\"/>\n\t\t<field name=\"INTERNAL_SYSTEM_WINDOW\" removed=\"23\"/>\n\t\t<field name=\"INTERNET\"/>\n\t\t<field name=\"KILL_BACKGROUND_PROCESSES\" since=\"8\"/>\n\t\t<field name=\"LOCATION_HARDWARE\" since=\"18\"/>\n\t\t<field name=\"MANAGE_ACCOUNTS\" since=\"5\" removed=\"23\"/>\n\t\t<field name=\"MANAGE_APP_TOKENS\" removed=\"23\"/>\n\t\t<field name=\"MANAGE_DOCUMENTS\" since=\"19\"/>\n\t\t<field name=\"MANAGE_OWN_CALLS\" since=\"26\"/>\n\t\t<field name=\"MASTER_CLEAR\"/>\n\t\t<field name=\"MEDIA_CONTENT_CONTROL\" since=\"19\"/>\n\t\t<field name=\"MODIFY_AUDIO_SETTINGS\"/>\n\t\t<field name=\"MODIFY_PHONE_STATE\"/>\n\t\t<field name=\"MOUNT_FORMAT_FILESYSTEMS\" since=\"3\"/>\n\t\t<field name=\"MOUNT_UNMOUNT_FILESYSTEMS\"/>\n\t\t<field name=\"NFC\" since=\"9\"/>\n\t\t<field name=\"NFC_PREFERRED_PAYMENT_INFO\" since=\"30\"/>\n\t\t<field name=\"NFC_TRANSACTION_EVENT\" since=\"28\"/>\n\t\t<field name=\"PACKAGE_USAGE_STATS\" since=\"23\"/>\n\t\t<field name=\"PERSISTENT_ACTIVITY\" deprecated=\"15\"/>\n\t\t<field name=\"PROCESS_OUTGOING_CALLS\" deprecated=\"29\"/>\n\t\t<field name=\"READ_CALENDAR\"/>\n\t\t<field name=\"READ_CALL_LOG\" since=\"16\"/>\n\t\t<field name=\"READ_CONTACTS\"/>\n\t\t<field name=\"READ_EXTERNAL_STORAGE\" since=\"16\"/>\n\t\t<field name=\"READ_FRAME_BUFFER\" removed=\"29\"/>\n\t\t<field name=\"READ_HISTORY_BOOKMARKS\" since=\"4\" removed=\"23\"/>\n\t\t<field name=\"READ_INPUT_STATE\" deprecated=\"16\"/>\n\t\t<field name=\"READ_LOGS\"/>\n\t\t<field name=\"READ_OWNER_DATA\" removed=\"9\"/>\n\t\t<field name=\"READ_PHONE_NUMBERS\" since=\"26\"/>\n\t\t<field name=\"READ_PHONE_STATE\"/>\n\t\t<field name=\"READ_PRECISE_PHONE_STATE\" since=\"30\"/>\n\t\t<field name=\"READ_PROFILE\" since=\"14\" removed=\"23\"/>\n\t\t<field name=\"READ_SMS\"/>\n\t\t<field name=\"READ_SOCIAL_STREAM\" since=\"15\" deprecated=\"21\" removed=\"23\"/>\n\t\t<field name=\"READ_SYNC_SETTINGS\"/>\n\t\t<field name=\"READ_SYNC_STATS\"/>\n\t\t<field name=\"READ_USER_DICTIONARY\" since=\"16\" removed=\"23\"/>\n\t\t<field name=\"READ_VOICEMAIL\" since=\"21\"/>\n\t\t<field name=\"REBOOT\"/>\n\t\t<field name=\"RECEIVE_BOOT_COMPLETED\"/>\n\t\t<field name=\"RECEIVE_MMS\"/>\n\t\t<field name=\"RECEIVE_SMS\"/>\n\t\t<field name=\"RECEIVE_WAP_PUSH\"/>\n\t\t<field name=\"RECORD_AUDIO\"/>\n\t\t<field name=\"REORDER_TASKS\"/>\n\t\t<field name=\"REQUEST_COMPANION_RUN_IN_BACKGROUND\" since=\"26\"/>\n\t\t<field name=\"REQUEST_COMPANION_USE_DATA_IN_BACKGROUND\" since=\"26\"/>\n\t\t<field name=\"REQUEST_DELETE_PACKAGES\" since=\"26\"/>\n\t\t<field name=\"REQUEST_IGNORE_BATTERY_OPTIMIZATIONS\" since=\"23\"/>\n\t\t<field name=\"REQUEST_INSTALL_PACKAGES\" since=\"23\"/>\n\t\t<field name=\"REQUEST_PASSWORD_COMPLEXITY\" since=\"29\"/>\n\t\t<field name=\"RESTART_PACKAGES\" deprecated=\"15\"/>\n\t\t<field name=\"SEND_RESPOND_VIA_MESSAGE\" since=\"18\"/>\n\t\t<field name=\"SEND_SMS\"/>\n\t\t<field name=\"SET_ACTIVITY_WATCHER\" removed=\"23\"/>\n\t\t<field name=\"SET_ALARM\" since=\"9\"/>\n\t\t<field name=\"SET_ALWAYS_FINISH\"/>\n\t\t<field name=\"SET_ANIMATION_SCALE\"/>\n\t\t<field name=\"SET_DEBUG_APP\"/>\n\t\t<field name=\"SET_ORIENTATION\" removed=\"23\"/>\n\t\t<field name=\"SET_POINTER_SPEED\" since=\"13\" removed=\"23\"/>\n\t\t<field name=\"SET_PREFERRED_APPLICATIONS\" deprecated=\"15\"/>\n\t\t<field name=\"SET_PROCESS_FOREGROUND\" removed=\"4\"/>\n\t\t<field name=\"SET_PROCESS_LIMIT\"/>\n\t\t<field name=\"SET_TIME\" since=\"8\"/>\n\t\t<field name=\"SET_TIME_ZONE\"/>\n\t\t<field name=\"SET_WALLPAPER\"/>\n\t\t<field name=\"SET_WALLPAPER_HINTS\"/>\n\t\t<field name=\"SIGNAL_PERSISTENT_PROCESSES\"/>\n\t\t<field name=\"SMS_FINANCIAL_TRANSACTIONS\" since=\"29\"/>\n\t\t<field name=\"START_VIEW_PERMISSION_USAGE\" since=\"29\"/>\n\t\t<field name=\"STATUS_BAR\"/>\n\t\t<field name=\"SUBSCRIBED_FEEDS_READ\" removed=\"23\"/>\n\t\t<field name=\"SUBSCRIBED_FEEDS_WRITE\" removed=\"23\"/>\n\t\t<field name=\"SYSTEM_ALERT_WINDOW\"/>\n\t\t<field name=\"TRANSMIT_IR\" since=\"19\"/>\n\t\t<field name=\"UNINSTALL_SHORTCUT\" since=\"19\"/>\n\t\t<field name=\"UPDATE_DEVICE_STATS\" since=\"3\"/>\n\t\t<field name=\"USE_BIOMETRIC\" since=\"28\"/>\n\t\t<field name=\"USE_CREDENTIALS\" since=\"5\" removed=\"23\"/>\n\t\t<field name=\"USE_FINGERPRINT\" since=\"23\" deprecated=\"28\"/>\n\t\t<field name=\"USE_FULL_SCREEN_INTENT\" since=\"29\"/>\n\t\t<field name=\"USE_SIP\" since=\"9\"/>\n\t\t<field name=\"VIBRATE\"/>\n\t\t<field name=\"WAKE_LOCK\"/>\n\t\t<field name=\"WRITE_APN_SETTINGS\"/>\n\t\t<field name=\"WRITE_CALENDAR\"/>\n\t\t<field name=\"WRITE_CALL_LOG\" since=\"16\"/>\n\t\t<field name=\"WRITE_CONTACTS\"/>\n\t\t<field name=\"WRITE_EXTERNAL_STORAGE\" since=\"4\"/>\n\t\t<field name=\"WRITE_GSERVICES\"/>\n\t\t<field name=\"WRITE_HISTORY_BOOKMARKS\" since=\"4\" removed=\"23\"/>\n\t\t<field name=\"WRITE_OWNER_DATA\" removed=\"9\"/>\n\t\t<field name=\"WRITE_PROFILE\" since=\"14\" removed=\"23\"/>\n\t\t<field name=\"WRITE_SECURE_SETTINGS\" since=\"3\"/>\n\t\t<field name=\"WRITE_SETTINGS\"/>\n\t\t<field name=\"WRITE_SMS\" removed=\"23\"/>\n\t\t<field name=\"WRITE_SOCIAL_STREAM\" since=\"15\" deprecated=\"21\" removed=\"23\"/>\n\t\t<field name=\"WRITE_SYNC_SETTINGS\"/>\n\t\t<field name=\"WRITE_USER_DICTIONARY\" since=\"16\" removed=\"23\"/>\n\t\t<field name=\"WRITE_VOICEMAIL\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/Manifest$permission_group\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"ACCESSIBILITY_FEATURES\" since=\"18\" removed=\"23\"/>\n\t\t<field name=\"ACCOUNTS\" removed=\"23\"/>\n\t\t<field name=\"ACTIVITY_RECOGNITION\" since=\"29\"/>\n\t\t<field name=\"AFFECTS_BATTERY\" since=\"17\" removed=\"23\"/>\n\t\t<field name=\"APP_INFO\" since=\"17\" removed=\"23\"/>\n\t\t<field name=\"AUDIO_SETTINGS\" since=\"17\" removed=\"23\"/>\n\t\t<field name=\"BLUETOOTH_NETWORK\" since=\"17\" removed=\"23\"/>\n\t\t<field name=\"BOOKMARKS\" since=\"17\" removed=\"23\"/>\n\t\t<field name=\"CALENDAR\" since=\"17\"/>\n\t\t<field name=\"CALL_LOG\" since=\"28\"/>\n\t\t<field name=\"CAMERA\" since=\"17\"/>\n\t\t<field name=\"CONTACTS\" since=\"23\"/>\n\t\t<field name=\"COST_MONEY\" removed=\"23\"/>\n\t\t<field name=\"DEVELOPMENT_TOOLS\" removed=\"23\"/>\n\t\t<field name=\"DEVICE_ALARMS\" since=\"17\" removed=\"23\"/>\n\t\t<field name=\"DISPLAY\" since=\"17\" removed=\"23\"/>\n\t\t<field name=\"HARDWARE_CONTROLS\" removed=\"23\"/>\n\t\t<field name=\"LOCATION\"/>\n\t\t<field name=\"MESSAGES\" removed=\"23\"/>\n\t\t<field name=\"MICROPHONE\" since=\"17\"/>\n\t\t<field name=\"NETWORK\" removed=\"23\"/>\n\t\t<field name=\"PERSONAL_INFO\" removed=\"23\"/>\n\t\t<field name=\"PHONE\" since=\"23\"/>\n\t\t<field name=\"PHONE_CALLS\" removed=\"23\"/>\n\t\t<field name=\"SCREENLOCK\" since=\"17\" removed=\"23\"/>\n\t\t<field name=\"SENSORS\" since=\"23\"/>\n\t\t<field name=\"SMS\" since=\"23\"/>\n\t\t<field name=\"SOCIAL_INFO\" since=\"17\" removed=\"23\"/>\n\t\t<field name=\"STATUS_BAR\" since=\"17\" removed=\"23\"/>\n\t\t<field name=\"STORAGE\" since=\"4\"/>\n\t\t<field name=\"SYNC_SETTINGS\" since=\"17\" removed=\"23\"/>\n\t\t<field name=\"SYSTEM_CLOCK\" since=\"17\" removed=\"23\"/>\n\t\t<field name=\"SYSTEM_TOOLS\" removed=\"23\"/>\n\t\t<field name=\"USER_DICTIONARY\" since=\"17\" removed=\"23\"/>\n\t\t<field name=\"VOICEMAIL\" since=\"17\" removed=\"23\"/>\n\t\t<field name=\"WALLPAPER\" since=\"17\" removed=\"23\"/>\n\t\t<field name=\"WRITE_USER_DICTIONARY\" since=\"17\" removed=\"23\"/>\n\t</class>\n\t<class name=\"android/R\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/R$anim\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"accelerate_decelerate_interpolator\"/>\n\t\t<field name=\"accelerate_interpolator\"/>\n\t\t<field name=\"anticipate_interpolator\" since=\"4\"/>\n\t\t<field name=\"anticipate_overshoot_interpolator\" since=\"4\"/>\n\t\t<field name=\"bounce_interpolator\" since=\"4\"/>\n\t\t<field name=\"cycle_interpolator\" since=\"8\"/>\n\t\t<field name=\"decelerate_interpolator\"/>\n\t\t<field name=\"fade_in\"/>\n\t\t<field name=\"fade_out\"/>\n\t\t<field name=\"linear_interpolator\" since=\"4\"/>\n\t\t<field name=\"overshoot_interpolator\" since=\"4\"/>\n\t\t<field name=\"slide_in_left\"/>\n\t\t<field name=\"slide_out_right\"/>\n\t</class>\n\t<class name=\"android/R$animator\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"fade_in\"/>\n\t\t<field name=\"fade_out\"/>\n\t</class>\n\t<class name=\"android/R$array\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"emailAddressTypes\"/>\n\t\t<field name=\"imProtocols\"/>\n\t\t<field name=\"organizationTypes\"/>\n\t\t<field name=\"phoneTypes\"/>\n\t\t<field name=\"postalAddressTypes\"/>\n\t</class>\n\t<class name=\"android/R$attr\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"absListViewStyle\"/>\n\t\t<field name=\"accessibilityEventTypes\" since=\"14\"/>\n\t\t<field name=\"accessibilityFeedbackType\" since=\"14\"/>\n\t\t<field name=\"accessibilityFlags\" since=\"14\"/>\n\t\t<field name=\"accessibilityHeading\" since=\"28\"/>\n\t\t<field name=\"accessibilityLiveRegion\" since=\"19\"/>\n\t\t<field name=\"accessibilityPaneTitle\" since=\"28\"/>\n\t\t<field name=\"accessibilityTraversalAfter\" since=\"22\"/>\n\t\t<field name=\"accessibilityTraversalBefore\" since=\"22\"/>\n\t\t<field name=\"accountPreferences\" since=\"5\"/>\n\t\t<field name=\"accountType\" since=\"5\"/>\n\t\t<field name=\"action\"/>\n\t\t<field name=\"actionBarDivider\" since=\"14\"/>\n\t\t<field name=\"actionBarItemBackground\" since=\"14\"/>\n\t\t<field name=\"actionBarPopupTheme\" since=\"21\"/>\n\t\t<field name=\"actionBarSize\" since=\"11\"/>\n\t\t<field name=\"actionBarSplitStyle\" since=\"14\"/>\n\t\t<field name=\"actionBarStyle\" since=\"11\"/>\n\t\t<field name=\"actionBarTabBarStyle\" since=\"11\"/>\n\t\t<field name=\"actionBarTabStyle\" since=\"11\"/>\n\t\t<field name=\"actionBarTabTextStyle\" since=\"11\"/>\n\t\t<field name=\"actionBarTheme\" since=\"21\"/>\n\t\t<field name=\"actionBarWidgetTheme\" since=\"14\"/>\n\t\t<field name=\"actionButtonStyle\" since=\"11\"/>\n\t\t<field name=\"actionDropDownStyle\" since=\"11\"/>\n\t\t<field name=\"actionLayout\" since=\"11\"/>\n\t\t<field name=\"actionMenuTextAppearance\" since=\"11\"/>\n\t\t<field name=\"actionMenuTextColor\" since=\"11\"/>\n\t\t<field name=\"actionModeBackground\" since=\"11\"/>\n\t\t<field name=\"actionModeCloseButtonStyle\" since=\"11\"/>\n\t\t<field name=\"actionModeCloseDrawable\" since=\"11\"/>\n\t\t<field name=\"actionModeCopyDrawable\" since=\"11\"/>\n\t\t<field name=\"actionModeCutDrawable\" since=\"11\"/>\n\t\t<field name=\"actionModeFindDrawable\" since=\"21\"/>\n\t\t<field name=\"actionModePasteDrawable\" since=\"11\"/>\n\t\t<field name=\"actionModeSelectAllDrawable\" since=\"14\"/>\n\t\t<field name=\"actionModeShareDrawable\" since=\"21\"/>\n\t\t<field name=\"actionModeSplitBackground\" since=\"14\"/>\n\t\t<field name=\"actionModeStyle\" since=\"14\"/>\n\t\t<field name=\"actionModeWebSearchDrawable\" since=\"21\"/>\n\t\t<field name=\"actionOverflowButtonStyle\" since=\"11\"/>\n\t\t<field name=\"actionOverflowMenuStyle\" since=\"21\"/>\n\t\t<field name=\"actionProviderClass\" since=\"14\"/>\n\t\t<field name=\"actionViewClass\" since=\"11\"/>\n\t\t<field name=\"activatedBackgroundIndicator\" since=\"11\"/>\n\t\t<field name=\"activityCloseEnterAnimation\"/>\n\t\t<field name=\"activityCloseExitAnimation\"/>\n\t\t<field name=\"activityOpenEnterAnimation\"/>\n\t\t<field name=\"activityOpenExitAnimation\"/>\n\t\t<field name=\"addPrintersActivity\" since=\"19\"/>\n\t\t<field name=\"addStatesFromChildren\"/>\n\t\t<field name=\"adjustViewBounds\"/>\n\t\t<field name=\"advancedPrintOptionsActivity\" since=\"19\"/>\n\t\t<field name=\"alertDialogIcon\" since=\"11\"/>\n\t\t<field name=\"alertDialogStyle\"/>\n\t\t<field name=\"alertDialogTheme\" since=\"11\"/>\n\t\t<field name=\"alignmentMode\" since=\"14\"/>\n\t\t<field name=\"allContactsName\" since=\"11\"/>\n\t\t<field name=\"allowAudioPlaybackCapture\" since=\"29\"/>\n\t\t<field name=\"allowBackup\" since=\"4\"/>\n\t\t<field name=\"allowClearUserData\"/>\n\t\t<field name=\"allowEmbedded\" since=\"20\"/>\n\t\t<field name=\"allowParallelSyncs\" since=\"11\"/>\n\t\t<field name=\"allowSingleTap\" since=\"3\"/>\n\t\t<field name=\"allowTaskReparenting\"/>\n\t\t<field name=\"allowUndo\" since=\"23\"/>\n\t\t<field name=\"alpha\" since=\"11\"/>\n\t\t<field name=\"alphabeticModifiers\" since=\"26\"/>\n\t\t<field name=\"alphabeticShortcut\"/>\n\t\t<field name=\"alwaysDrawnWithCache\"/>\n\t\t<field name=\"alwaysRetainTaskState\"/>\n\t\t<field name=\"amPmBackgroundColor\" since=\"21\" deprecated=\"23\"/>\n\t\t<field name=\"amPmTextColor\" since=\"21\" deprecated=\"23\"/>\n\t\t<field name=\"ambientShadowAlpha\" since=\"21\"/>\n\t\t<field name=\"angle\"/>\n\t\t<field name=\"animateFirstView\" since=\"11\"/>\n\t\t<field name=\"animateLayoutChanges\" since=\"11\"/>\n\t\t<field name=\"animateOnClick\" since=\"3\"/>\n\t\t<field name=\"animation\"/>\n\t\t<field name=\"animationCache\"/>\n\t\t<field name=\"animationDuration\"/>\n\t\t<field name=\"animationOrder\"/>\n\t\t<field name=\"animationResolution\" since=\"11\" deprecated=\"16\"/>\n\t\t<field name=\"antialias\"/>\n\t\t<field name=\"anyDensity\" since=\"4\"/>\n\t\t<field name=\"apduServiceBanner\" since=\"19\"/>\n\t\t<field name=\"apiKey\"/>\n\t\t<field name=\"appCategory\" since=\"26\"/>\n\t\t<field name=\"appComponentFactory\" since=\"28\"/>\n\t\t<field name=\"author\" since=\"7\"/>\n\t\t<field name=\"authorities\"/>\n\t\t<field name=\"autoAdvanceViewId\" since=\"11\"/>\n\t\t<field name=\"autoCompleteTextViewStyle\"/>\n\t\t<field name=\"autoLink\"/>\n\t\t<field name=\"autoMirrored\" since=\"19\"/>\n\t\t<field name=\"autoRemoveFromRecents\" since=\"21\"/>\n\t\t<field name=\"autoSizeMaxTextSize\" since=\"26\"/>\n\t\t<field name=\"autoSizeMinTextSize\" since=\"26\"/>\n\t\t<field name=\"autoSizePresetSizes\" since=\"26\"/>\n\t\t<field name=\"autoSizeStepGranularity\" since=\"26\"/>\n\t\t<field name=\"autoSizeTextType\" since=\"26\"/>\n\t\t<field name=\"autoStart\" since=\"7\"/>\n\t\t<field name=\"autoText\" deprecated=\"15\"/>\n\t\t<field name=\"autoUrlDetect\" since=\"4\"/>\n\t\t<field name=\"autoVerify\" since=\"23\"/>\n\t\t<field name=\"autofillHints\" since=\"26\"/>\n\t\t<field name=\"autofilledHighlight\" since=\"26\"/>\n\t\t<field name=\"background\"/>\n\t\t<field name=\"backgroundDimAmount\"/>\n\t\t<field name=\"backgroundDimEnabled\" since=\"3\"/>\n\t\t<field name=\"backgroundSplit\" since=\"14\"/>\n\t\t<field name=\"backgroundStacked\" since=\"14\"/>\n\t\t<field name=\"backgroundTint\" since=\"21\"/>\n\t\t<field name=\"backgroundTintMode\" since=\"21\"/>\n\t\t<field name=\"backupAgent\" since=\"4\"/>\n\t\t<field name=\"backupInForeground\" since=\"24\"/>\n\t\t<field name=\"banner\" since=\"21\"/>\n\t\t<field name=\"baseline\" since=\"11\"/>\n\t\t<field name=\"baselineAlignBottom\"/>\n\t\t<field name=\"baselineAligned\"/>\n\t\t<field name=\"baselineAlignedChildIndex\"/>\n\t\t<field name=\"bitmap\" since=\"24\"/>\n\t\t<field name=\"borderlessButtonStyle\" since=\"11\"/>\n\t\t<field name=\"bottom\"/>\n\t\t<field name=\"bottomBright\"/>\n\t\t<field name=\"bottomDark\"/>\n\t\t<field name=\"bottomLeftRadius\"/>\n\t\t<field name=\"bottomMedium\"/>\n\t\t<field name=\"bottomOffset\" since=\"3\"/>\n\t\t<field name=\"bottomRightRadius\"/>\n\t\t<field name=\"breadCrumbShortTitle\" since=\"11\"/>\n\t\t<field name=\"breadCrumbTitle\" since=\"11\"/>\n\t\t<field name=\"breakStrategy\" since=\"23\"/>\n\t\t<field name=\"bufferType\"/>\n\t\t<field name=\"button\"/>\n\t\t<field name=\"buttonBarButtonStyle\" since=\"11\"/>\n\t\t<field name=\"buttonBarNegativeButtonStyle\" since=\"21\"/>\n\t\t<field name=\"buttonBarNeutralButtonStyle\" since=\"21\"/>\n\t\t<field name=\"buttonBarPositiveButtonStyle\" since=\"21\"/>\n\t\t<field name=\"buttonBarStyle\" since=\"11\"/>\n\t\t<field name=\"buttonCornerRadius\" since=\"28\"/>\n\t\t<field name=\"buttonGravity\" since=\"24\"/>\n\t\t<field name=\"buttonStyle\"/>\n\t\t<field name=\"buttonStyleInset\"/>\n\t\t<field name=\"buttonStyleSmall\"/>\n\t\t<field name=\"buttonStyleToggle\"/>\n\t\t<field name=\"buttonTint\" since=\"21\"/>\n\t\t<field name=\"buttonTintMode\" since=\"21\"/>\n\t\t<field name=\"cacheColorHint\"/>\n\t\t<field name=\"calendarTextColor\" since=\"21\"/>\n\t\t<field name=\"calendarViewShown\" since=\"11\"/>\n\t\t<field name=\"calendarViewStyle\" since=\"11\"/>\n\t\t<field name=\"canControlMagnification\" since=\"24\"/>\n\t\t<field name=\"canPerformGestures\" since=\"24\"/>\n\t\t<field name=\"canRecord\" since=\"24\"/>\n\t\t<field name=\"canRequestEnhancedWebAccessibility\" since=\"18\" deprecated=\"26\"/>\n\t\t<field name=\"canRequestFilterKeyEvents\" since=\"18\"/>\n\t\t<field name=\"canRequestFingerprintGestures\" since=\"26\"/>\n\t\t<field name=\"canRequestTouchExplorationMode\" since=\"18\"/>\n\t\t<field name=\"canRetrieveWindowContent\" since=\"14\"/>\n\t\t<field name=\"candidatesTextStyleSpans\" since=\"3\"/>\n\t\t<field name=\"cantSaveState\" since=\"28\"/>\n\t\t<field name=\"capitalize\" deprecated=\"15\"/>\n\t\t<field name=\"category\" since=\"19\"/>\n\t\t<field name=\"centerBright\"/>\n\t\t<field name=\"centerColor\"/>\n\t\t<field name=\"centerDark\"/>\n\t\t<field name=\"centerMedium\"/>\n\t\t<field name=\"centerX\"/>\n\t\t<field name=\"centerY\"/>\n\t\t<field name=\"certDigest\" since=\"26\"/>\n\t\t<field name=\"checkBoxPreferenceStyle\"/>\n\t\t<field name=\"checkMark\"/>\n\t\t<field name=\"checkMarkTint\" since=\"21\"/>\n\t\t<field name=\"checkMarkTintMode\" since=\"21\"/>\n\t\t<field name=\"checkable\"/>\n\t\t<field name=\"checkableBehavior\"/>\n\t\t<field name=\"checkboxStyle\"/>\n\t\t<field name=\"checked\"/>\n\t\t<field name=\"checkedButton\"/>\n\t\t<field name=\"checkedTextViewStyle\" since=\"17\"/>\n\t\t<field name=\"childDivider\"/>\n\t\t<field name=\"childIndicator\"/>\n\t\t<field name=\"childIndicatorEnd\" since=\"18\"/>\n\t\t<field name=\"childIndicatorLeft\"/>\n\t\t<field name=\"childIndicatorRight\"/>\n\t\t<field name=\"childIndicatorStart\" since=\"18\"/>\n\t\t<field name=\"choiceMode\"/>\n\t\t<field name=\"classLoader\" since=\"27\"/>\n\t\t<field name=\"clearTaskOnLaunch\"/>\n\t\t<field name=\"clickable\"/>\n\t\t<field name=\"clipChildren\"/>\n\t\t<field name=\"clipOrientation\"/>\n\t\t<field name=\"clipToPadding\"/>\n\t\t<field name=\"closeIcon\" since=\"21\"/>\n\t\t<field name=\"codes\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"collapseColumns\"/>\n\t\t<field name=\"collapseContentDescription\" since=\"22\"/>\n\t\t<field name=\"collapseIcon\" since=\"24\"/>\n\t\t<field name=\"color\"/>\n\t\t<field name=\"colorAccent\" since=\"21\"/>\n\t\t<field name=\"colorActivatedHighlight\" since=\"14\"/>\n\t\t<field name=\"colorBackground\"/>\n\t\t<field name=\"colorBackgroundCacheHint\" since=\"5\"/>\n\t\t<field name=\"colorBackgroundFloating\" since=\"23\"/>\n\t\t<field name=\"colorButtonNormal\" since=\"21\"/>\n\t\t<field name=\"colorControlActivated\" since=\"21\"/>\n\t\t<field name=\"colorControlHighlight\" since=\"21\"/>\n\t\t<field name=\"colorControlNormal\" since=\"21\"/>\n\t\t<field name=\"colorEdgeEffect\" since=\"21\"/>\n\t\t<field name=\"colorError\" since=\"26\"/>\n\t\t<field name=\"colorFocusedHighlight\" since=\"14\"/>\n\t\t<field name=\"colorForeground\"/>\n\t\t<field name=\"colorForegroundInverse\"/>\n\t\t<field name=\"colorLongPressedHighlight\" since=\"14\"/>\n\t\t<field name=\"colorMode\" since=\"26\"/>\n\t\t<field name=\"colorMultiSelectHighlight\" since=\"14\"/>\n\t\t<field name=\"colorPressedHighlight\" since=\"14\"/>\n\t\t<field name=\"colorPrimary\" since=\"21\"/>\n\t\t<field name=\"colorPrimaryDark\" since=\"21\"/>\n\t\t<field name=\"colorSecondary\" since=\"25\"/>\n\t\t<field name=\"columnCount\" since=\"14\"/>\n\t\t<field name=\"columnDelay\"/>\n\t\t<field name=\"columnOrderPreserved\" since=\"14\"/>\n\t\t<field name=\"columnWidth\"/>\n\t\t<field name=\"commitIcon\" since=\"21\"/>\n\t\t<field name=\"compatibleWidthLimitDp\" since=\"13\"/>\n\t\t<field name=\"completionHint\"/>\n\t\t<field name=\"completionHintView\"/>\n\t\t<field name=\"completionThreshold\"/>\n\t\t<field name=\"configChanges\"/>\n\t\t<field name=\"configure\" since=\"3\"/>\n\t\t<field name=\"constantSize\"/>\n\t\t<field name=\"content\" since=\"3\"/>\n\t\t<field name=\"contentAgeHint\" since=\"21\"/>\n\t\t<field name=\"contentAuthority\" since=\"5\"/>\n\t\t<field name=\"contentDescription\" since=\"4\"/>\n\t\t<field name=\"contentInsetEnd\" since=\"21\"/>\n\t\t<field name=\"contentInsetEndWithActions\" since=\"24\"/>\n\t\t<field name=\"contentInsetLeft\" since=\"21\"/>\n\t\t<field name=\"contentInsetRight\" since=\"21\"/>\n\t\t<field name=\"contentInsetStart\" since=\"21\"/>\n\t\t<field name=\"contentInsetStartWithNavigation\" since=\"24\"/>\n\t\t<field name=\"contextClickable\" since=\"23\"/>\n\t\t<field name=\"contextDescription\" since=\"25\"/>\n\t\t<field name=\"contextPopupMenuStyle\" since=\"24\"/>\n\t\t<field name=\"contextUri\" since=\"25\"/>\n\t\t<field name=\"controlX1\" since=\"21\"/>\n\t\t<field name=\"controlX2\" since=\"21\"/>\n\t\t<field name=\"controlY1\" since=\"21\"/>\n\t\t<field name=\"controlY2\" since=\"21\"/>\n\t\t<field name=\"countDown\" since=\"24\"/>\n\t\t<field name=\"country\" since=\"21\"/>\n\t\t<field name=\"cropToPadding\"/>\n\t\t<field name=\"cursorVisible\"/>\n\t\t<field name=\"customNavigationLayout\" since=\"11\"/>\n\t\t<field name=\"customTokens\" since=\"11\"/>\n\t\t<field name=\"cycles\"/>\n\t\t<field name=\"dashGap\"/>\n\t\t<field name=\"dashWidth\"/>\n\t\t<field name=\"data\"/>\n\t\t<field name=\"datePickerDialogTheme\" since=\"21\"/>\n\t\t<field name=\"datePickerMode\" since=\"21\"/>\n\t\t<field name=\"datePickerStyle\" since=\"11\"/>\n\t\t<field name=\"dateTextAppearance\" since=\"11\"/>\n\t\t<field name=\"dayOfWeekBackground\" since=\"21\" deprecated=\"23\"/>\n\t\t<field name=\"dayOfWeekTextAppearance\" since=\"21\" deprecated=\"23\"/>\n\t\t<field name=\"debuggable\"/>\n\t\t<field name=\"defaultFocusHighlightEnabled\" since=\"26\"/>\n\t\t<field name=\"defaultHeight\" since=\"24\"/>\n\t\t<field name=\"defaultToDeviceProtectedStorage\" since=\"24\"/>\n\t\t<field name=\"defaultValue\"/>\n\t\t<field name=\"defaultWidth\" since=\"24\"/>\n\t\t<field name=\"delay\"/>\n\t\t<field name=\"dependency\"/>\n\t\t<field name=\"descendantFocusability\"/>\n\t\t<field name=\"description\"/>\n\t\t<field name=\"detachWallpaper\" since=\"5\"/>\n\t\t<field name=\"detailColumn\" since=\"5\"/>\n\t\t<field name=\"detailSocialSummary\" since=\"5\"/>\n\t\t<field name=\"detailsElementBackground\" since=\"11\"/>\n\t\t<field name=\"dial\"/>\n\t\t<field name=\"dialogCornerRadius\" since=\"28\"/>\n\t\t<field name=\"dialogIcon\"/>\n\t\t<field name=\"dialogLayout\"/>\n\t\t<field name=\"dialogMessage\"/>\n\t\t<field name=\"dialogPreferenceStyle\"/>\n\t\t<field name=\"dialogPreferredPadding\" since=\"22\"/>\n\t\t<field name=\"dialogTheme\" since=\"11\"/>\n\t\t<field name=\"dialogTitle\"/>\n\t\t<field name=\"digits\"/>\n\t\t<field name=\"directBootAware\" since=\"24\"/>\n\t\t<field name=\"direction\"/>\n\t\t<field name=\"directionDescriptions\" since=\"14\" deprecated=\"23\"/>\n\t\t<field name=\"directionPriority\"/>\n\t\t<field name=\"disableDependentsState\"/>\n\t\t<field name=\"disabledAlpha\"/>\n\t\t<field name=\"displayOptions\" since=\"11\"/>\n\t\t<field name=\"dither\"/>\n\t\t<field name=\"divider\"/>\n\t\t<field name=\"dividerHeight\"/>\n\t\t<field name=\"dividerHorizontal\" since=\"11\"/>\n\t\t<field name=\"dividerPadding\" since=\"11\"/>\n\t\t<field name=\"dividerVertical\" since=\"11\"/>\n\t\t<field name=\"documentLaunchMode\" since=\"21\"/>\n\t\t<field name=\"drawSelectorOnTop\"/>\n\t\t<field name=\"drawable\"/>\n\t\t<field name=\"drawableBottom\"/>\n\t\t<field name=\"drawableEnd\" since=\"14\"/>\n\t\t<field name=\"drawableLeft\"/>\n\t\t<field name=\"drawablePadding\"/>\n\t\t<field name=\"drawableRight\"/>\n\t\t<field name=\"drawableStart\" since=\"14\"/>\n\t\t<field name=\"drawableTint\" since=\"23\"/>\n\t\t<field name=\"drawableTintMode\" since=\"23\"/>\n\t\t<field name=\"drawableTop\"/>\n\t\t<field name=\"drawingCacheQuality\"/>\n\t\t<field name=\"dropDownAnchor\" since=\"3\"/>\n\t\t<field name=\"dropDownHeight\" since=\"4\"/>\n\t\t<field name=\"dropDownHintAppearance\"/>\n\t\t<field name=\"dropDownHorizontalOffset\" since=\"5\"/>\n\t\t<field name=\"dropDownItemStyle\"/>\n\t\t<field name=\"dropDownListViewStyle\"/>\n\t\t<field name=\"dropDownSelector\"/>\n\t\t<field name=\"dropDownSpinnerStyle\" since=\"11\"/>\n\t\t<field name=\"dropDownVerticalOffset\" since=\"5\"/>\n\t\t<field name=\"dropDownWidth\" since=\"3\"/>\n\t\t<field name=\"duplicateParentState\"/>\n\t\t<field name=\"duration\"/>\n\t\t<field name=\"editTextBackground\" since=\"11\"/>\n\t\t<field name=\"editTextColor\" since=\"11\"/>\n\t\t<field name=\"editTextPreferenceStyle\"/>\n\t\t<field name=\"editTextStyle\"/>\n\t\t<field name=\"editable\" deprecated=\"15\"/>\n\t\t<field name=\"editorExtras\" since=\"3\"/>\n\t\t<field name=\"elegantTextHeight\" since=\"21\"/>\n\t\t<field name=\"elevation\" since=\"21\"/>\n\t\t<field name=\"ellipsize\"/>\n\t\t<field name=\"ems\"/>\n\t\t<field name=\"enableVrMode\" since=\"24\"/>\n\t\t<field name=\"enabled\" deprecated=\"15\"/>\n\t\t<field name=\"end\" since=\"23\"/>\n\t\t<field name=\"endColor\"/>\n\t\t<field name=\"endX\" since=\"24\"/>\n\t\t<field name=\"endY\" since=\"24\"/>\n\t\t<field name=\"endYear\" deprecated=\"16\"/>\n\t\t<field name=\"enforceNavigationBarContrast\" since=\"29\"/>\n\t\t<field name=\"enforceStatusBarContrast\" since=\"29\"/>\n\t\t<field name=\"enterFadeDuration\" since=\"11\"/>\n\t\t<field name=\"entries\"/>\n\t\t<field name=\"entryValues\"/>\n\t\t<field name=\"eventsInterceptionEnabled\" since=\"4\"/>\n\t\t<field name=\"excludeClass\" since=\"21\"/>\n\t\t<field name=\"excludeFromRecents\"/>\n\t\t<field name=\"excludeId\" since=\"21\"/>\n\t\t<field name=\"excludeName\" since=\"21\"/>\n\t\t<field name=\"exitFadeDuration\" since=\"11\"/>\n\t\t<field name=\"expandableListPreferredChildIndicatorLeft\"/>\n\t\t<field name=\"expandableListPreferredChildIndicatorRight\"/>\n\t\t<field name=\"expandableListPreferredChildPaddingLeft\"/>\n\t\t<field name=\"expandableListPreferredItemIndicatorLeft\"/>\n\t\t<field name=\"expandableListPreferredItemIndicatorRight\"/>\n\t\t<field name=\"expandableListPreferredItemPaddingLeft\"/>\n\t\t<field name=\"expandableListViewStyle\"/>\n\t\t<field name=\"expandableListViewWhiteStyle\" since=\"8\"/>\n\t\t<field name=\"exported\"/>\n\t\t<field name=\"externalService\" since=\"24\"/>\n\t\t<field name=\"extraTension\" since=\"4\"/>\n\t\t<field name=\"extractNativeLibs\" since=\"23\"/>\n\t\t<field name=\"factor\"/>\n\t\t<field name=\"fadeDuration\" since=\"4\"/>\n\t\t<field name=\"fadeEnabled\" since=\"4\"/>\n\t\t<field name=\"fadeOffset\" since=\"4\"/>\n\t\t<field name=\"fadeScrollbars\" since=\"5\"/>\n\t\t<field name=\"fadingEdge\" deprecated=\"15\"/>\n\t\t<field name=\"fadingEdgeLength\"/>\n\t\t<field name=\"fadingMode\" since=\"19\"/>\n\t\t<field name=\"fallbackLineSpacing\" since=\"28\"/>\n\t\t<field name=\"fastScrollAlwaysVisible\" since=\"11\"/>\n\t\t<field name=\"fastScrollEnabled\" since=\"3\"/>\n\t\t<field name=\"fastScrollOverlayPosition\" since=\"11\"/>\n\t\t<field name=\"fastScrollPreviewBackgroundLeft\" since=\"11\"/>\n\t\t<field name=\"fastScrollPreviewBackgroundRight\" since=\"11\"/>\n\t\t<field name=\"fastScrollStyle\" since=\"21\"/>\n\t\t<field name=\"fastScrollTextColor\" since=\"11\"/>\n\t\t<field name=\"fastScrollThumbDrawable\" since=\"11\"/>\n\t\t<field name=\"fastScrollTrackDrawable\" since=\"11\"/>\n\t\t<field name=\"fillAfter\"/>\n\t\t<field name=\"fillAlpha\" since=\"21\"/>\n\t\t<field name=\"fillBefore\"/>\n\t\t<field name=\"fillColor\" since=\"21\"/>\n\t\t<field name=\"fillEnabled\" since=\"3\"/>\n\t\t<field name=\"fillType\" since=\"24\"/>\n\t\t<field name=\"fillViewport\"/>\n\t\t<field name=\"filter\"/>\n\t\t<field name=\"filterTouchesWhenObscured\" since=\"9\"/>\n\t\t<field name=\"fingerprintAuthDrawable\" since=\"23\"/>\n\t\t<field name=\"finishOnCloseSystemDialogs\" since=\"5\"/>\n\t\t<field name=\"finishOnTaskLaunch\"/>\n\t\t<field name=\"firstBaselineToTopHeight\" since=\"28\"/>\n\t\t<field name=\"firstDayOfWeek\" since=\"11\"/>\n\t\t<field name=\"fitsSystemWindows\"/>\n\t\t<field name=\"flipInterval\"/>\n\t\t<field name=\"focusable\"/>\n\t\t<field name=\"focusableInTouchMode\"/>\n\t\t<field name=\"focusedByDefault\" since=\"26\"/>\n\t\t<field name=\"focusedMonthDateColor\" since=\"11\" deprecated=\"23\"/>\n\t\t<field name=\"font\" since=\"26\"/>\n\t\t<field name=\"fontFamily\" since=\"16\"/>\n\t\t<field name=\"fontFeatureSettings\" since=\"21\"/>\n\t\t<field name=\"fontProviderAuthority\" since=\"26\"/>\n\t\t<field name=\"fontProviderCerts\" since=\"26\"/>\n\t\t<field name=\"fontProviderPackage\" since=\"26\"/>\n\t\t<field name=\"fontProviderQuery\" since=\"26\"/>\n\t\t<field name=\"fontStyle\" since=\"26\"/>\n\t\t<field name=\"fontVariationSettings\" since=\"28\"/>\n\t\t<field name=\"fontWeight\" since=\"26\"/>\n\t\t<field name=\"footerDividersEnabled\" since=\"3\"/>\n\t\t<field name=\"forceDarkAllowed\" since=\"29\"/>\n\t\t<field name=\"forceHasOverlappingRendering\" since=\"24\"/>\n\t\t<field name=\"forceUriPermissions\" since=\"29\"/>\n\t\t<field name=\"foreground\"/>\n\t\t<field name=\"foregroundGravity\"/>\n\t\t<field name=\"foregroundServiceType\" since=\"29\"/>\n\t\t<field name=\"foregroundTint\" since=\"21\"/>\n\t\t<field name=\"foregroundTintMode\" since=\"21\"/>\n\t\t<field name=\"format\"/>\n\t\t<field name=\"format12Hour\" since=\"17\"/>\n\t\t<field name=\"format24Hour\" since=\"17\"/>\n\t\t<field name=\"fraction\" since=\"23\"/>\n\t\t<field name=\"fragment\" since=\"11\"/>\n\t\t<field name=\"fragmentAllowEnterTransitionOverlap\" since=\"21\"/>\n\t\t<field name=\"fragmentAllowReturnTransitionOverlap\" since=\"21\"/>\n\t\t<field name=\"fragmentCloseEnterAnimation\" since=\"11\"/>\n\t\t<field name=\"fragmentCloseExitAnimation\" since=\"11\"/>\n\t\t<field name=\"fragmentEnterTransition\" since=\"21\"/>\n\t\t<field name=\"fragmentExitTransition\" since=\"21\"/>\n\t\t<field name=\"fragmentFadeEnterAnimation\" since=\"11\"/>\n\t\t<field name=\"fragmentFadeExitAnimation\" since=\"11\"/>\n\t\t<field name=\"fragmentOpenEnterAnimation\" since=\"11\"/>\n\t\t<field name=\"fragmentOpenExitAnimation\" since=\"11\"/>\n\t\t<field name=\"fragmentReenterTransition\" since=\"21\"/>\n\t\t<field name=\"fragmentReturnTransition\" since=\"21\"/>\n\t\t<field name=\"fragmentSharedElementEnterTransition\" since=\"21\"/>\n\t\t<field name=\"fragmentSharedElementReturnTransition\" since=\"21\"/>\n\t\t<field name=\"freezesText\"/>\n\t\t<field name=\"fromAlpha\"/>\n\t\t<field name=\"fromDegrees\"/>\n\t\t<field name=\"fromId\" since=\"21\"/>\n\t\t<field name=\"fromScene\" since=\"19\"/>\n\t\t<field name=\"fromXDelta\"/>\n\t\t<field name=\"fromXScale\"/>\n\t\t<field name=\"fromYDelta\"/>\n\t\t<field name=\"fromYScale\"/>\n\t\t<field name=\"fullBackupContent\" since=\"23\"/>\n\t\t<field name=\"fullBackupOnly\" since=\"21\"/>\n\t\t<field name=\"fullBright\"/>\n\t\t<field name=\"fullDark\"/>\n\t\t<field name=\"functionalTest\"/>\n\t\t<field name=\"galleryItemBackground\"/>\n\t\t<field name=\"galleryStyle\"/>\n\t\t<field name=\"gestureColor\" since=\"4\"/>\n\t\t<field name=\"gestureStrokeAngleThreshold\" since=\"4\"/>\n\t\t<field name=\"gestureStrokeLengthThreshold\" since=\"4\"/>\n\t\t<field name=\"gestureStrokeSquarenessThreshold\" since=\"4\"/>\n\t\t<field name=\"gestureStrokeType\" since=\"4\"/>\n\t\t<field name=\"gestureStrokeWidth\" since=\"4\"/>\n\t\t<field name=\"glEsVersion\" since=\"4\"/>\n\t\t<field name=\"goIcon\" since=\"21\"/>\n\t\t<field name=\"gradientRadius\"/>\n\t\t<field name=\"grantUriPermissions\"/>\n\t\t<field name=\"gravity\"/>\n\t\t<field name=\"gridViewStyle\"/>\n\t\t<field name=\"groupIndicator\"/>\n\t\t<field name=\"hand_hour\"/>\n\t\t<field name=\"hand_minute\"/>\n\t\t<field name=\"handle\" since=\"3\"/>\n\t\t<field name=\"handleProfiling\"/>\n\t\t<field name=\"hapticFeedbackEnabled\" since=\"3\"/>\n\t\t<field name=\"hardwareAccelerated\" since=\"11\"/>\n\t\t<field name=\"hasCode\"/>\n\t\t<field name=\"hasFragileUserData\" since=\"29\"/>\n\t\t<field name=\"headerAmPmTextAppearance\" since=\"21\" deprecated=\"23\"/>\n\t\t<field name=\"headerBackground\"/>\n\t\t<field name=\"headerDayOfMonthTextAppearance\" since=\"21\" deprecated=\"23\"/>\n\t\t<field name=\"headerDividersEnabled\" since=\"3\"/>\n\t\t<field name=\"headerMonthTextAppearance\" since=\"21\" deprecated=\"23\"/>\n\t\t<field name=\"headerTimeTextAppearance\" since=\"21\" deprecated=\"23\"/>\n\t\t<field name=\"headerYearTextAppearance\" since=\"21\" deprecated=\"23\"/>\n\t\t<field name=\"height\"/>\n\t\t<field name=\"hideOnContentScroll\" since=\"21\"/>\n\t\t<field name=\"hint\"/>\n\t\t<field name=\"homeAsUpIndicator\" since=\"11\"/>\n\t\t<field name=\"homeLayout\" since=\"11\"/>\n\t\t<field name=\"horizontalDivider\"/>\n\t\t<field name=\"horizontalGap\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"horizontalScrollViewStyle\" since=\"11\"/>\n\t\t<field name=\"horizontalSpacing\"/>\n\t\t<field name=\"host\"/>\n\t\t<field name=\"hotSpotX\" since=\"24\"/>\n\t\t<field name=\"hotSpotY\" since=\"24\"/>\n\t\t<field name=\"hyphenationFrequency\" since=\"23\"/>\n\t\t<field name=\"icon\"/>\n\t\t<field name=\"iconPreview\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"iconSpaceReserved\" since=\"26\"/>\n\t\t<field name=\"iconTint\" since=\"26\"/>\n\t\t<field name=\"iconTintMode\" since=\"26\"/>\n\t\t<field name=\"iconifiedByDefault\" since=\"11\"/>\n\t\t<field name=\"id\"/>\n\t\t<field name=\"identifier\" since=\"29\"/>\n\t\t<field name=\"ignoreGravity\"/>\n\t\t<field name=\"imageButtonStyle\"/>\n\t\t<field name=\"imageWellStyle\"/>\n\t\t<field name=\"imeActionId\" since=\"3\"/>\n\t\t<field name=\"imeActionLabel\" since=\"3\"/>\n\t\t<field name=\"imeExtractEnterAnimation\" since=\"3\"/>\n\t\t<field name=\"imeExtractExitAnimation\" since=\"3\"/>\n\t\t<field name=\"imeFullscreenBackground\" since=\"3\"/>\n\t\t<field name=\"imeOptions\" since=\"3\"/>\n\t\t<field name=\"imeSubtypeExtraValue\" since=\"11\"/>\n\t\t<field name=\"imeSubtypeLocale\" since=\"11\"/>\n\t\t<field name=\"imeSubtypeMode\" since=\"11\"/>\n\t\t<field name=\"immersive\" since=\"11\"/>\n\t\t<field name=\"importantForAccessibility\" since=\"16\"/>\n\t\t<field name=\"importantForAutofill\" since=\"26\"/>\n\t\t<field name=\"inAnimation\"/>\n\t\t<field name=\"includeFontPadding\"/>\n\t\t<field name=\"includeInGlobalSearch\" since=\"4\"/>\n\t\t<field name=\"indeterminate\"/>\n\t\t<field name=\"indeterminateBehavior\"/>\n\t\t<field name=\"indeterminateDrawable\"/>\n\t\t<field name=\"indeterminateDuration\"/>\n\t\t<field name=\"indeterminateOnly\"/>\n\t\t<field name=\"indeterminateProgressStyle\" since=\"11\"/>\n\t\t<field name=\"indeterminateTint\" since=\"21\"/>\n\t\t<field name=\"indeterminateTintMode\" since=\"21\"/>\n\t\t<field name=\"indicatorEnd\" since=\"18\"/>\n\t\t<field name=\"indicatorLeft\"/>\n\t\t<field name=\"indicatorRight\"/>\n\t\t<field name=\"indicatorStart\" since=\"18\"/>\n\t\t<field name=\"inflatedId\"/>\n\t\t<field name=\"inheritShowWhenLocked\" since=\"29\"/>\n\t\t<field name=\"initOrder\"/>\n\t\t<field name=\"initialKeyguardLayout\" since=\"17\"/>\n\t\t<field name=\"initialLayout\" since=\"3\"/>\n\t\t<field name=\"innerRadius\" since=\"3\"/>\n\t\t<field name=\"innerRadiusRatio\"/>\n\t\t<field name=\"inputMethod\" deprecated=\"15\"/>\n\t\t<field name=\"inputType\" since=\"3\"/>\n\t\t<field name=\"inset\" since=\"21\"/>\n\t\t<field name=\"insetBottom\"/>\n\t\t<field name=\"insetLeft\"/>\n\t\t<field name=\"insetRight\"/>\n\t\t<field name=\"insetTop\"/>\n\t\t<field name=\"installLocation\" since=\"8\"/>\n\t\t<field name=\"interactiveUiTimeout\" since=\"29\"/>\n\t\t<field name=\"interpolator\"/>\n\t\t<field name=\"isAlwaysSyncable\" since=\"11\"/>\n\t\t<field name=\"isAsciiCapable\" since=\"19\"/>\n\t\t<field name=\"isAuxiliary\" since=\"14\"/>\n\t\t<field name=\"isDefault\" since=\"3\"/>\n\t\t<field name=\"isFeatureSplit\" since=\"26\"/>\n\t\t<field name=\"isGame\" since=\"21\"/>\n\t\t<field name=\"isIndicator\"/>\n\t\t<field name=\"isLightTheme\" since=\"29\"/>\n\t\t<field name=\"isModifier\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"isRepeatable\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"isScrollContainer\" since=\"3\"/>\n\t\t<field name=\"isSplitRequired\" since=\"29\"/>\n\t\t<field name=\"isStatic\" since=\"26\"/>\n\t\t<field name=\"isSticky\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"isolatedProcess\" since=\"16\"/>\n\t\t<field name=\"isolatedSplits\" since=\"26\"/>\n\t\t<field name=\"itemBackground\"/>\n\t\t<field name=\"itemIconDisabledAlpha\"/>\n\t\t<field name=\"itemPadding\" since=\"11\"/>\n\t\t<field name=\"itemTextAppearance\"/>\n\t\t<field name=\"justificationMode\" since=\"26\"/>\n\t\t<field name=\"keepScreenOn\"/>\n\t\t<field name=\"key\"/>\n\t\t<field name=\"keyBackground\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"keyEdgeFlags\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"keyHeight\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"keyIcon\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"keyLabel\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"keyOutputText\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"keyPreviewHeight\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"keyPreviewLayout\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"keyPreviewOffset\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"keySet\" since=\"19\"/>\n\t\t<field name=\"keyTextColor\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"keyTextSize\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"keyWidth\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"keyboardLayout\" since=\"16\"/>\n\t\t<field name=\"keyboardMode\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"keyboardNavigationCluster\" since=\"26\"/>\n\t\t<field name=\"keycode\"/>\n\t\t<field name=\"killAfterRestore\" since=\"5\"/>\n\t\t<field name=\"label\"/>\n\t\t<field name=\"labelFor\" since=\"17\"/>\n\t\t<field name=\"labelTextSize\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"languageTag\" since=\"24\"/>\n\t\t<field name=\"largeHeap\" since=\"11\"/>\n\t\t<field name=\"largeScreens\" since=\"4\"/>\n\t\t<field name=\"largestWidthLimitDp\" since=\"13\"/>\n\t\t<field name=\"lastBaselineToBottomHeight\" since=\"28\"/>\n\t\t<field name=\"launchMode\"/>\n\t\t<field name=\"launchTaskBehindSourceAnimation\" since=\"21\"/>\n\t\t<field name=\"launchTaskBehindTargetAnimation\" since=\"21\"/>\n\t\t<field name=\"layerType\" since=\"11\"/>\n\t\t<field name=\"layout\"/>\n\t\t<field name=\"layoutAnimation\"/>\n\t\t<field name=\"layoutDirection\" since=\"17\"/>\n\t\t<field name=\"layoutMode\" since=\"18\"/>\n\t\t<field name=\"layout_above\"/>\n\t\t<field name=\"layout_alignBaseline\"/>\n\t\t<field name=\"layout_alignBottom\"/>\n\t\t<field name=\"layout_alignEnd\" since=\"17\"/>\n\t\t<field name=\"layout_alignLeft\"/>\n\t\t<field name=\"layout_alignParentBottom\"/>\n\t\t<field name=\"layout_alignParentEnd\" since=\"17\"/>\n\t\t<field name=\"layout_alignParentLeft\"/>\n\t\t<field name=\"layout_alignParentRight\"/>\n\t\t<field name=\"layout_alignParentStart\" since=\"17\"/>\n\t\t<field name=\"layout_alignParentTop\"/>\n\t\t<field name=\"layout_alignRight\"/>\n\t\t<field name=\"layout_alignStart\" since=\"17\"/>\n\t\t<field name=\"layout_alignTop\"/>\n\t\t<field name=\"layout_alignWithParentIfMissing\"/>\n\t\t<field name=\"layout_below\"/>\n\t\t<field name=\"layout_centerHorizontal\"/>\n\t\t<field name=\"layout_centerInParent\"/>\n\t\t<field name=\"layout_centerVertical\"/>\n\t\t<field name=\"layout_column\"/>\n\t\t<field name=\"layout_columnSpan\" since=\"14\"/>\n\t\t<field name=\"layout_columnWeight\" since=\"21\"/>\n\t\t<field name=\"layout_gravity\"/>\n\t\t<field name=\"layout_height\"/>\n\t\t<field name=\"layout_margin\"/>\n\t\t<field name=\"layout_marginBottom\"/>\n\t\t<field name=\"layout_marginEnd\" since=\"17\"/>\n\t\t<field name=\"layout_marginHorizontal\" since=\"26\"/>\n\t\t<field name=\"layout_marginLeft\"/>\n\t\t<field name=\"layout_marginRight\"/>\n\t\t<field name=\"layout_marginStart\" since=\"17\"/>\n\t\t<field name=\"layout_marginTop\"/>\n\t\t<field name=\"layout_marginVertical\" since=\"26\"/>\n\t\t<field name=\"layout_row\" since=\"14\"/>\n\t\t<field name=\"layout_rowSpan\" since=\"14\"/>\n\t\t<field name=\"layout_rowWeight\" since=\"21\"/>\n\t\t<field name=\"layout_scale\"/>\n\t\t<field name=\"layout_span\"/>\n\t\t<field name=\"layout_toEndOf\" since=\"17\"/>\n\t\t<field name=\"layout_toLeftOf\"/>\n\t\t<field name=\"layout_toRightOf\"/>\n\t\t<field name=\"layout_toStartOf\" since=\"17\"/>\n\t\t<field name=\"layout_weight\"/>\n\t\t<field name=\"layout_width\"/>\n\t\t<field name=\"layout_x\"/>\n\t\t<field name=\"layout_y\"/>\n\t\t<field name=\"left\"/>\n\t\t<field name=\"letterSpacing\" since=\"21\"/>\n\t\t<field name=\"level\" since=\"24\"/>\n\t\t<field name=\"lineHeight\" since=\"28\"/>\n\t\t<field name=\"lineSpacingExtra\"/>\n\t\t<field name=\"lineSpacingMultiplier\"/>\n\t\t<field name=\"lines\"/>\n\t\t<field name=\"linksClickable\"/>\n\t\t<field name=\"listChoiceBackgroundIndicator\" since=\"11\"/>\n\t\t<field name=\"listChoiceIndicatorMultiple\"/>\n\t\t<field name=\"listChoiceIndicatorSingle\"/>\n\t\t<field name=\"listDivider\"/>\n\t\t<field name=\"listDividerAlertDialog\" since=\"11\"/>\n\t\t<field name=\"listMenuViewStyle\" since=\"24\"/>\n\t\t<field name=\"listPopupWindowStyle\" since=\"11\"/>\n\t\t<field name=\"listPreferredItemHeight\"/>\n\t\t<field name=\"listPreferredItemHeightLarge\" since=\"14\"/>\n\t\t<field name=\"listPreferredItemHeightSmall\" since=\"14\"/>\n\t\t<field name=\"listPreferredItemPaddingEnd\" since=\"17\"/>\n\t\t<field name=\"listPreferredItemPaddingLeft\" since=\"14\"/>\n\t\t<field name=\"listPreferredItemPaddingRight\" since=\"14\"/>\n\t\t<field name=\"listPreferredItemPaddingStart\" since=\"17\"/>\n\t\t<field name=\"listSelector\"/>\n\t\t<field name=\"listSeparatorTextViewStyle\"/>\n\t\t<field name=\"listViewStyle\"/>\n\t\t<field name=\"listViewWhiteStyle\"/>\n\t\t<field name=\"lockTaskMode\" since=\"23\"/>\n\t\t<field name=\"logo\" since=\"11\"/>\n\t\t<field name=\"logoDescription\" since=\"23\"/>\n\t\t<field name=\"longClickable\"/>\n\t\t<field name=\"loopViews\" since=\"11\"/>\n\t\t<field name=\"manageSpaceActivity\"/>\n\t\t<field name=\"mapViewStyle\"/>\n\t\t<field name=\"marqueeRepeatLimit\" since=\"2\"/>\n\t\t<field name=\"matchOrder\" since=\"21\"/>\n\t\t<field name=\"max\"/>\n\t\t<field name=\"maxAspectRatio\" since=\"26\"/>\n\t\t<field name=\"maxButtonHeight\" since=\"24\"/>\n\t\t<field name=\"maxDate\" since=\"11\"/>\n\t\t<field name=\"maxEms\"/>\n\t\t<field name=\"maxHeight\"/>\n\t\t<field name=\"maxItemsPerRow\"/>\n\t\t<field name=\"maxLength\"/>\n\t\t<field name=\"maxLevel\"/>\n\t\t<field name=\"maxLines\"/>\n\t\t<field name=\"maxLongVersionCode\" since=\"28\"/>\n\t\t<field name=\"maxRecents\" since=\"21\"/>\n\t\t<field name=\"maxRows\"/>\n\t\t<field name=\"maxSdkVersion\" since=\"4\"/>\n\t\t<field name=\"maxWidth\"/>\n\t\t<field name=\"maximumAngle\" since=\"21\"/>\n\t\t<field name=\"measureAllChildren\"/>\n\t\t<field name=\"measureWithLargestChild\" since=\"11\"/>\n\t\t<field name=\"mediaRouteButtonStyle\" since=\"16\"/>\n\t\t<field name=\"mediaRouteTypes\" since=\"16\"/>\n\t\t<field name=\"menuCategory\"/>\n\t\t<field name=\"mimeType\"/>\n\t\t<field name=\"min\" since=\"26\"/>\n\t\t<field name=\"minAspectRatio\" since=\"29\"/>\n\t\t<field name=\"minDate\" since=\"11\"/>\n\t\t<field name=\"minEms\"/>\n\t\t<field name=\"minHeight\"/>\n\t\t<field name=\"minLevel\"/>\n\t\t<field name=\"minLines\"/>\n\t\t<field name=\"minResizeHeight\" since=\"14\"/>\n\t\t<field name=\"minResizeWidth\" since=\"14\"/>\n\t\t<field name=\"minSdkVersion\"/>\n\t\t<field name=\"minWidth\"/>\n\t\t<field name=\"minimumHorizontalAngle\" since=\"21\"/>\n\t\t<field name=\"minimumVerticalAngle\" since=\"21\"/>\n\t\t<field name=\"mipMap\" since=\"18\"/>\n\t\t<field name=\"mirrorForRtl\" since=\"18\"/>\n\t\t<field name=\"mode\"/>\n\t\t<field name=\"moreIcon\"/>\n\t\t<field name=\"multiArch\" since=\"21\"/>\n\t\t<field name=\"multiprocess\"/>\n\t\t<field name=\"name\"/>\n\t\t<field name=\"navigationBarColor\" since=\"21\"/>\n\t\t<field name=\"navigationBarDividerColor\" since=\"27\"/>\n\t\t<field name=\"navigationContentDescription\" since=\"21\"/>\n\t\t<field name=\"navigationIcon\" since=\"21\"/>\n\t\t<field name=\"navigationMode\" since=\"11\"/>\n\t\t<field name=\"negativeButtonText\"/>\n\t\t<field name=\"nestedScrollingEnabled\" since=\"21\"/>\n\t\t<field name=\"networkSecurityConfig\" since=\"24\"/>\n\t\t<field name=\"nextClusterForward\" since=\"26\"/>\n\t\t<field name=\"nextFocusDown\"/>\n\t\t<field name=\"nextFocusForward\" since=\"11\"/>\n\t\t<field name=\"nextFocusLeft\"/>\n\t\t<field name=\"nextFocusRight\"/>\n\t\t<field name=\"nextFocusUp\"/>\n\t\t<field name=\"noHistory\" since=\"3\"/>\n\t\t<field name=\"nonInteractiveUiTimeout\" since=\"29\"/>\n\t\t<field name=\"normalScreens\" since=\"4\"/>\n\t\t<field name=\"notificationTimeout\" since=\"14\"/>\n\t\t<field name=\"numColumns\"/>\n\t\t<field name=\"numStars\"/>\n\t\t<field name=\"numberPickerStyle\" since=\"24\"/>\n\t\t<field name=\"numbersBackgroundColor\" since=\"21\"/>\n\t\t<field name=\"numbersInnerTextColor\" since=\"23\"/>\n\t\t<field name=\"numbersSelectorColor\" since=\"21\"/>\n\t\t<field name=\"numbersTextColor\" since=\"21\"/>\n\t\t<field name=\"numeric\" deprecated=\"15\"/>\n\t\t<field name=\"numericModifiers\" since=\"26\"/>\n\t\t<field name=\"numericShortcut\"/>\n\t\t<field name=\"offset\" since=\"24\"/>\n\t\t<field name=\"onClick\" since=\"4\"/>\n\t\t<field name=\"oneshot\"/>\n\t\t<field name=\"opacity\" since=\"11\"/>\n\t\t<field name=\"opticalInsetBottom\" since=\"29\"/>\n\t\t<field name=\"opticalInsetLeft\" since=\"29\"/>\n\t\t<field name=\"opticalInsetRight\" since=\"29\"/>\n\t\t<field name=\"opticalInsetTop\" since=\"29\"/>\n\t\t<field name=\"order\"/>\n\t\t<field name=\"orderInCategory\"/>\n\t\t<field name=\"ordering\" since=\"11\"/>\n\t\t<field name=\"orderingFromXml\"/>\n\t\t<field name=\"orientation\"/>\n\t\t<field name=\"outAnimation\"/>\n\t\t<field name=\"outlineAmbientShadowColor\" since=\"28\"/>\n\t\t<field name=\"outlineProvider\" since=\"21\"/>\n\t\t<field name=\"outlineSpotShadowColor\" since=\"28\"/>\n\t\t<field name=\"overScrollFooter\" since=\"9\"/>\n\t\t<field name=\"overScrollHeader\" since=\"9\"/>\n\t\t<field name=\"overScrollMode\" since=\"9\"/>\n\t\t<field name=\"overlapAnchor\" since=\"21\"/>\n\t\t<field name=\"overridesImplicitlyEnabledSubtype\" since=\"14\"/>\n\t\t<field name=\"packageNames\" since=\"14\"/>\n\t\t<field name=\"packageType\" since=\"29\"/>\n\t\t<field name=\"padding\"/>\n\t\t<field name=\"paddingBottom\"/>\n\t\t<field name=\"paddingEnd\" since=\"17\"/>\n\t\t<field name=\"paddingHorizontal\" since=\"26\"/>\n\t\t<field name=\"paddingLeft\"/>\n\t\t<field name=\"paddingMode\" since=\"21\"/>\n\t\t<field name=\"paddingRight\"/>\n\t\t<field name=\"paddingStart\" since=\"17\"/>\n\t\t<field name=\"paddingTop\"/>\n\t\t<field name=\"paddingVertical\" since=\"26\"/>\n\t\t<field name=\"panelBackground\"/>\n\t\t<field name=\"panelColorBackground\"/>\n\t\t<field name=\"panelColorForeground\"/>\n\t\t<field name=\"panelFullBackground\"/>\n\t\t<field name=\"panelTextAppearance\"/>\n\t\t<field name=\"parentActivityName\" since=\"16\"/>\n\t\t<field name=\"password\" deprecated=\"15\"/>\n\t\t<field name=\"path\"/>\n\t\t<field name=\"pathData\" since=\"21\"/>\n\t\t<field name=\"pathPattern\"/>\n\t\t<field name=\"pathPrefix\"/>\n\t\t<field name=\"patternPathData\" since=\"21\"/>\n\t\t<field name=\"permission\"/>\n\t\t<field name=\"permissionFlags\" since=\"17\"/>\n\t\t<field name=\"permissionGroup\"/>\n\t\t<field name=\"permissionGroupFlags\" since=\"17\"/>\n\t\t<field name=\"persistableMode\" since=\"21\"/>\n\t\t<field name=\"persistent\"/>\n\t\t<field name=\"persistentDrawingCache\"/>\n\t\t<field name=\"persistentWhenFeatureAvailable\" since=\"26\"/>\n\t\t<field name=\"phoneNumber\" deprecated=\"15\"/>\n\t\t<field name=\"pivotX\"/>\n\t\t<field name=\"pivotY\"/>\n\t\t<field name=\"pointerIcon\" since=\"24\"/>\n\t\t<field name=\"popupAnimationStyle\" since=\"9\"/>\n\t\t<field name=\"popupBackground\"/>\n\t\t<field name=\"popupCharacters\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"popupElevation\" since=\"21\"/>\n\t\t<field name=\"popupEnterTransition\" since=\"24\"/>\n\t\t<field name=\"popupExitTransition\" since=\"24\"/>\n\t\t<field name=\"popupKeyboard\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"popupLayout\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"popupMenuStyle\" since=\"11\"/>\n\t\t<field name=\"popupTheme\" since=\"21\"/>\n\t\t<field name=\"popupWindowStyle\"/>\n\t\t<field name=\"port\"/>\n\t\t<field name=\"positiveButtonText\"/>\n\t\t<field name=\"preferenceCategoryStyle\"/>\n\t\t<field name=\"preferenceFragmentStyle\" since=\"24\"/>\n\t\t<field name=\"preferenceInformationStyle\"/>\n\t\t<field name=\"preferenceLayoutChild\"/>\n\t\t<field name=\"preferenceScreenStyle\"/>\n\t\t<field name=\"preferenceStyle\"/>\n\t\t<field name=\"presentationTheme\" since=\"17\"/>\n\t\t<field name=\"previewImage\" since=\"11\"/>\n\t\t<field name=\"primaryContentAlpha\" since=\"26\"/>\n\t\t<field name=\"priority\"/>\n\t\t<field name=\"privateImeOptions\" since=\"3\"/>\n\t\t<field name=\"process\"/>\n\t\t<field name=\"progress\"/>\n\t\t<field name=\"progressBackgroundTint\" since=\"21\"/>\n\t\t<field name=\"progressBackgroundTintMode\" since=\"21\"/>\n\t\t<field name=\"progressBarPadding\" since=\"11\"/>\n\t\t<field name=\"progressBarStyle\"/>\n\t\t<field name=\"progressBarStyleHorizontal\"/>\n\t\t<field name=\"progressBarStyleInverse\" since=\"4\"/>\n\t\t<field name=\"progressBarStyleLarge\"/>\n\t\t<field name=\"progressBarStyleLargeInverse\" since=\"4\"/>\n\t\t<field name=\"progressBarStyleSmall\"/>\n\t\t<field name=\"progressBarStyleSmallInverse\" since=\"4\"/>\n\t\t<field name=\"progressBarStyleSmallTitle\"/>\n\t\t<field name=\"progressDrawable\"/>\n\t\t<field name=\"progressTint\" since=\"21\"/>\n\t\t<field name=\"progressTintMode\" since=\"21\"/>\n\t\t<field name=\"prompt\"/>\n\t\t<field name=\"propertyName\" since=\"11\"/>\n\t\t<field name=\"propertyXName\" since=\"21\"/>\n\t\t<field name=\"propertyYName\" since=\"21\"/>\n\t\t<field name=\"protectionLevel\"/>\n\t\t<field name=\"publicKey\" since=\"14\"/>\n\t\t<field name=\"queryActionMsg\"/>\n\t\t<field name=\"queryAfterZeroResults\" since=\"4\"/>\n\t\t<field name=\"queryBackground\" since=\"21\"/>\n\t\t<field name=\"queryHint\" since=\"11\"/>\n\t\t<field name=\"quickContactBadgeStyleSmallWindowLarge\" since=\"6\"/>\n\t\t<field name=\"quickContactBadgeStyleSmallWindowMedium\" since=\"6\"/>\n\t\t<field name=\"quickContactBadgeStyleSmallWindowSmall\" since=\"6\"/>\n\t\t<field name=\"quickContactBadgeStyleWindowLarge\" since=\"6\"/>\n\t\t<field name=\"quickContactBadgeStyleWindowMedium\" since=\"6\"/>\n\t\t<field name=\"quickContactBadgeStyleWindowSmall\" since=\"6\"/>\n\t\t<field name=\"radioButtonStyle\"/>\n\t\t<field name=\"radius\"/>\n\t\t<field name=\"rating\"/>\n\t\t<field name=\"ratingBarStyle\"/>\n\t\t<field name=\"ratingBarStyleIndicator\"/>\n\t\t<field name=\"ratingBarStyleSmall\"/>\n\t\t<field name=\"readPermission\"/>\n\t\t<field name=\"recognitionService\" since=\"21\"/>\n\t\t<field name=\"recreateOnConfigChanges\" since=\"26\"/>\n\t\t<field name=\"recycleEnabled\" since=\"26\"/>\n\t\t<field name=\"relinquishTaskIdentity\" since=\"21\"/>\n\t\t<field name=\"reparent\" since=\"21\"/>\n\t\t<field name=\"reparentWithOverlay\" since=\"21\"/>\n\t\t<field name=\"repeatCount\"/>\n\t\t<field name=\"repeatMode\"/>\n\t\t<field name=\"reqFiveWayNav\" since=\"3\"/>\n\t\t<field name=\"reqHardKeyboard\" since=\"3\"/>\n\t\t<field name=\"reqKeyboardType\" since=\"3\"/>\n\t\t<field name=\"reqNavigation\" since=\"3\"/>\n\t\t<field name=\"reqTouchScreen\" since=\"3\"/>\n\t\t<field name=\"requestLegacyExternalStorage\" since=\"29\"/>\n\t\t<field name=\"requireDeviceUnlock\" since=\"19\"/>\n\t\t<field name=\"required\" since=\"5\"/>\n\t\t<field name=\"requiredAccountType\" since=\"18\"/>\n\t\t<field name=\"requiredFeature\" since=\"26\"/>\n\t\t<field name=\"requiredForAllUsers\" since=\"18\"/>\n\t\t<field name=\"requiredNotFeature\" since=\"26\"/>\n\t\t<field name=\"requiresFadingEdge\" since=\"14\"/>\n\t\t<field name=\"requiresSmallestWidthDp\" since=\"13\"/>\n\t\t<field name=\"resizeClip\" since=\"22\"/>\n\t\t<field name=\"resizeMode\" since=\"12\"/>\n\t\t<field name=\"resizeable\" since=\"4\"/>\n\t\t<field name=\"resizeableActivity\" since=\"24\"/>\n\t\t<field name=\"resource\"/>\n\t\t<field name=\"restoreAnyVersion\" since=\"8\"/>\n\t\t<field name=\"restoreNeedsApplication\" since=\"5\" deprecated=\"15\"/>\n\t\t<field name=\"restrictedAccountType\" since=\"18\"/>\n\t\t<field name=\"restrictionType\" since=\"21\"/>\n\t\t<field name=\"resumeWhilePausing\" since=\"21\"/>\n\t\t<field name=\"reversible\" since=\"21\"/>\n\t\t<field name=\"revisionCode\" since=\"22\"/>\n\t\t<field name=\"right\"/>\n\t\t<field name=\"ringtonePreferenceStyle\"/>\n\t\t<field name=\"ringtoneType\"/>\n\t\t<field name=\"rotation\" since=\"11\"/>\n\t\t<field name=\"rotationAnimation\" since=\"26\"/>\n\t\t<field name=\"rotationX\" since=\"11\"/>\n\t\t<field name=\"rotationY\" since=\"11\"/>\n\t\t<field name=\"roundIcon\" since=\"25\"/>\n\t\t<field name=\"rowCount\" since=\"14\"/>\n\t\t<field name=\"rowDelay\"/>\n\t\t<field name=\"rowEdgeFlags\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"rowHeight\"/>\n\t\t<field name=\"rowOrderPreserved\" since=\"14\"/>\n\t\t<field name=\"saveEnabled\"/>\n\t\t<field name=\"scaleGravity\"/>\n\t\t<field name=\"scaleHeight\"/>\n\t\t<field name=\"scaleType\"/>\n\t\t<field name=\"scaleWidth\"/>\n\t\t<field name=\"scaleX\" since=\"11\"/>\n\t\t<field name=\"scaleY\" since=\"11\"/>\n\t\t<field name=\"scheme\"/>\n\t\t<field name=\"screenDensity\" since=\"9\"/>\n\t\t<field name=\"screenOrientation\"/>\n\t\t<field name=\"screenReaderFocusable\" since=\"28\"/>\n\t\t<field name=\"screenSize\" since=\"9\"/>\n\t\t<field name=\"scrollHorizontally\"/>\n\t\t<field name=\"scrollIndicators\" since=\"23\"/>\n\t\t<field name=\"scrollViewStyle\"/>\n\t\t<field name=\"scrollX\"/>\n\t\t<field name=\"scrollY\"/>\n\t\t<field name=\"scrollbarAlwaysDrawHorizontalTrack\"/>\n\t\t<field name=\"scrollbarAlwaysDrawVerticalTrack\"/>\n\t\t<field name=\"scrollbarDefaultDelayBeforeFade\" since=\"5\"/>\n\t\t<field name=\"scrollbarFadeDuration\" since=\"5\"/>\n\t\t<field name=\"scrollbarSize\"/>\n\t\t<field name=\"scrollbarStyle\"/>\n\t\t<field name=\"scrollbarThumbHorizontal\"/>\n\t\t<field name=\"scrollbarThumbVertical\"/>\n\t\t<field name=\"scrollbarTrackHorizontal\"/>\n\t\t<field name=\"scrollbarTrackVertical\"/>\n\t\t<field name=\"scrollbars\"/>\n\t\t<field name=\"scrollingCache\"/>\n\t\t<field name=\"searchButtonText\" deprecated=\"15\"/>\n\t\t<field name=\"searchHintIcon\" since=\"22\"/>\n\t\t<field name=\"searchIcon\" since=\"21\"/>\n\t\t<field name=\"searchMode\"/>\n\t\t<field name=\"searchSettingsDescription\" since=\"4\"/>\n\t\t<field name=\"searchSuggestAuthority\"/>\n\t\t<field name=\"searchSuggestIntentAction\"/>\n\t\t<field name=\"searchSuggestIntentData\"/>\n\t\t<field name=\"searchSuggestPath\"/>\n\t\t<field name=\"searchSuggestSelection\"/>\n\t\t<field name=\"searchSuggestThreshold\" since=\"4\"/>\n\t\t<field name=\"searchViewStyle\" since=\"21\"/>\n\t\t<field name=\"secondaryContentAlpha\" since=\"26\"/>\n\t\t<field name=\"secondaryProgress\"/>\n\t\t<field name=\"secondaryProgressTint\" since=\"21\"/>\n\t\t<field name=\"secondaryProgressTintMode\" since=\"21\"/>\n\t\t<field name=\"secureElementName\" since=\"29\"/>\n\t\t<field name=\"seekBarStyle\"/>\n\t\t<field name=\"segmentedButtonStyle\" since=\"11\"/>\n\t\t<field name=\"selectAllOnFocus\"/>\n\t\t<field name=\"selectable\"/>\n\t\t<field name=\"selectableItemBackground\" since=\"11\"/>\n\t\t<field name=\"selectableItemBackgroundBorderless\" since=\"21\"/>\n\t\t<field name=\"selectedDateVerticalBar\" since=\"11\" deprecated=\"23\"/>\n\t\t<field name=\"selectedWeekBackgroundColor\" since=\"11\" deprecated=\"23\"/>\n\t\t<field name=\"selectionDividerHeight\" since=\"29\"/>\n\t\t<field name=\"sessionService\" since=\"21\"/>\n\t\t<field name=\"settingsActivity\" since=\"3\"/>\n\t\t<field name=\"settingsSliceUri\" since=\"29\"/>\n\t\t<field name=\"setupActivity\" since=\"21\"/>\n\t\t<field name=\"shadowColor\"/>\n\t\t<field name=\"shadowDx\"/>\n\t\t<field name=\"shadowDy\"/>\n\t\t<field name=\"shadowRadius\"/>\n\t\t<field name=\"shape\"/>\n\t\t<field name=\"shareInterpolator\"/>\n\t\t<field name=\"sharedUserId\" deprecated=\"29\"/>\n\t\t<field name=\"sharedUserLabel\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"shell\" since=\"29\"/>\n\t\t<field name=\"shortcutDisabledMessage\" since=\"25\"/>\n\t\t<field name=\"shortcutId\" since=\"25\"/>\n\t\t<field name=\"shortcutLongLabel\" since=\"25\"/>\n\t\t<field name=\"shortcutShortLabel\" since=\"25\"/>\n\t\t<field name=\"shouldDisableView\"/>\n\t\t<field name=\"showAsAction\" since=\"11\"/>\n\t\t<field name=\"showDefault\"/>\n\t\t<field name=\"showDividers\" since=\"11\"/>\n\t\t<field name=\"showForAllUsers\" since=\"23\"/>\n\t\t<field name=\"showMetadataInPreview\" since=\"25\"/>\n\t\t<field name=\"showOnLockScreen\" since=\"17\" deprecated=\"23\"/>\n\t\t<field name=\"showSilent\"/>\n\t\t<field name=\"showText\" since=\"21\"/>\n\t\t<field name=\"showWeekNumber\" since=\"11\" deprecated=\"23\"/>\n\t\t<field name=\"showWhenLocked\" since=\"27\"/>\n\t\t<field name=\"shownWeekCount\" since=\"11\" deprecated=\"23\"/>\n\t\t<field name=\"shrinkColumns\"/>\n\t\t<field name=\"singleLine\" deprecated=\"15\"/>\n\t\t<field name=\"singleLineTitle\" since=\"26\"/>\n\t\t<field name=\"singleUser\" since=\"17\"/>\n\t\t<field name=\"slideEdge\" since=\"21\"/>\n\t\t<field name=\"smallIcon\" since=\"5\"/>\n\t\t<field name=\"smallScreens\" since=\"4\"/>\n\t\t<field name=\"smoothScrollbar\" since=\"3\"/>\n\t\t<field name=\"soundEffectsEnabled\"/>\n\t\t<field name=\"spacing\"/>\n\t\t<field name=\"spinnerDropDownItemStyle\"/>\n\t\t<field name=\"spinnerItemStyle\"/>\n\t\t<field name=\"spinnerMode\" since=\"11\"/>\n\t\t<field name=\"spinnerStyle\"/>\n\t\t<field name=\"spinnersShown\" since=\"11\"/>\n\t\t<field name=\"splitMotionEvents\" since=\"11\"/>\n\t\t<field name=\"splitName\" since=\"26\"/>\n\t\t<field name=\"splitTrack\" since=\"21\"/>\n\t\t<field name=\"spotShadowAlpha\" since=\"21\"/>\n\t\t<field name=\"src\"/>\n\t\t<field name=\"ssp\" since=\"19\"/>\n\t\t<field name=\"sspPattern\" since=\"19\"/>\n\t\t<field name=\"sspPrefix\" since=\"19\"/>\n\t\t<field name=\"stackFromBottom\"/>\n\t\t<field name=\"stackViewStyle\" since=\"21\"/>\n\t\t<field name=\"starStyle\"/>\n\t\t<field name=\"start\" since=\"23\"/>\n\t\t<field name=\"startColor\"/>\n\t\t<field name=\"startDelay\" since=\"19\"/>\n\t\t<field name=\"startOffset\"/>\n\t\t<field name=\"startX\" since=\"24\"/>\n\t\t<field name=\"startY\" since=\"24\"/>\n\t\t<field name=\"startYear\" deprecated=\"16\"/>\n\t\t<field name=\"stateListAnimator\" since=\"21\"/>\n\t\t<field name=\"stateNotNeeded\"/>\n\t\t<field name=\"state_above_anchor\"/>\n\t\t<field name=\"state_accelerated\" since=\"11\"/>\n\t\t<field name=\"state_activated\" since=\"11\"/>\n\t\t<field name=\"state_active\"/>\n\t\t<field name=\"state_checkable\"/>\n\t\t<field name=\"state_checked\"/>\n\t\t<field name=\"state_drag_can_accept\" since=\"14\"/>\n\t\t<field name=\"state_drag_hovered\" since=\"14\"/>\n\t\t<field name=\"state_empty\"/>\n\t\t<field name=\"state_enabled\"/>\n\t\t<field name=\"state_expanded\"/>\n\t\t<field name=\"state_first\"/>\n\t\t<field name=\"state_focused\"/>\n\t\t<field name=\"state_hovered\" since=\"14\"/>\n\t\t<field name=\"state_last\"/>\n\t\t<field name=\"state_long_pressable\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"state_middle\"/>\n\t\t<field name=\"state_multiline\" since=\"11\"/>\n\t\t<field name=\"state_pressed\"/>\n\t\t<field name=\"state_selected\"/>\n\t\t<field name=\"state_single\"/>\n\t\t<field name=\"state_window_focused\"/>\n\t\t<field name=\"staticWallpaperPreview\" since=\"11\"/>\n\t\t<field name=\"statusBarColor\" since=\"21\"/>\n\t\t<field name=\"stepSize\"/>\n\t\t<field name=\"stopWithTask\" since=\"14\"/>\n\t\t<field name=\"streamType\"/>\n\t\t<field name=\"stretchColumns\"/>\n\t\t<field name=\"stretchMode\"/>\n\t\t<field name=\"strokeAlpha\" since=\"21\"/>\n\t\t<field name=\"strokeColor\" since=\"21\"/>\n\t\t<field name=\"strokeLineCap\" since=\"21\"/>\n\t\t<field name=\"strokeLineJoin\" since=\"21\"/>\n\t\t<field name=\"strokeMiterLimit\" since=\"21\"/>\n\t\t<field name=\"strokeWidth\" since=\"21\"/>\n\t\t<field name=\"subMenuArrow\" since=\"24\"/>\n\t\t<field name=\"submitBackground\" since=\"21\"/>\n\t\t<field name=\"subtitle\" since=\"11\"/>\n\t\t<field name=\"subtitleTextAppearance\" since=\"21\"/>\n\t\t<field name=\"subtitleTextColor\" since=\"23\"/>\n\t\t<field name=\"subtitleTextStyle\" since=\"11\"/>\n\t\t<field name=\"subtypeExtraValue\" since=\"14\"/>\n\t\t<field name=\"subtypeId\" since=\"17\"/>\n\t\t<field name=\"subtypeLocale\" since=\"14\"/>\n\t\t<field name=\"suggestActionMsg\"/>\n\t\t<field name=\"suggestActionMsgColumn\"/>\n\t\t<field name=\"suggestionRowLayout\" since=\"21\"/>\n\t\t<field name=\"summary\"/>\n\t\t<field name=\"summaryColumn\" since=\"5\"/>\n\t\t<field name=\"summaryOff\"/>\n\t\t<field name=\"summaryOn\"/>\n\t\t<field name=\"supportsAssist\" since=\"23\"/>\n\t\t<field name=\"supportsLaunchVoiceAssistFromKeyguard\" since=\"23\"/>\n\t\t<field name=\"supportsLocalInteraction\" since=\"24\"/>\n\t\t<field name=\"supportsMultipleDisplays\" since=\"29\"/>\n\t\t<field name=\"supportsPictureInPicture\" since=\"24\"/>\n\t\t<field name=\"supportsRtl\" since=\"17\"/>\n\t\t<field name=\"supportsSwitchingToNextInputMethod\" since=\"19\"/>\n\t\t<field name=\"supportsUploading\" since=\"5\"/>\n\t\t<field name=\"switchMinWidth\" since=\"14\"/>\n\t\t<field name=\"switchPadding\" since=\"14\"/>\n\t\t<field name=\"switchPreferenceStyle\" since=\"14\"/>\n\t\t<field name=\"switchStyle\" since=\"21\"/>\n\t\t<field name=\"switchTextAppearance\" since=\"14\"/>\n\t\t<field name=\"switchTextOff\" since=\"14\"/>\n\t\t<field name=\"switchTextOn\" since=\"14\"/>\n\t\t<field name=\"syncable\"/>\n\t\t<field name=\"tabStripEnabled\" since=\"8\"/>\n\t\t<field name=\"tabStripLeft\" since=\"8\"/>\n\t\t<field name=\"tabStripRight\" since=\"8\"/>\n\t\t<field name=\"tabWidgetStyle\"/>\n\t\t<field name=\"tag\"/>\n\t\t<field name=\"targetActivity\"/>\n\t\t<field name=\"targetClass\"/>\n\t\t<field name=\"targetDescriptions\" since=\"14\" deprecated=\"23\"/>\n\t\t<field name=\"targetId\" since=\"19\"/>\n\t\t<field name=\"targetName\" since=\"21\"/>\n\t\t<field name=\"targetPackage\"/>\n\t\t<field name=\"targetProcesses\" since=\"26\"/>\n\t\t<field name=\"targetSandboxVersion\" since=\"26\" deprecated=\"29\"/>\n\t\t<field name=\"targetSdkVersion\" since=\"4\"/>\n\t\t<field name=\"taskAffinity\"/>\n\t\t<field name=\"taskCloseEnterAnimation\"/>\n\t\t<field name=\"taskCloseExitAnimation\"/>\n\t\t<field name=\"taskOpenEnterAnimation\"/>\n\t\t<field name=\"taskOpenExitAnimation\"/>\n\t\t<field name=\"taskToBackEnterAnimation\"/>\n\t\t<field name=\"taskToBackExitAnimation\"/>\n\t\t<field name=\"taskToFrontEnterAnimation\"/>\n\t\t<field name=\"taskToFrontExitAnimation\"/>\n\t\t<field name=\"tension\" since=\"4\"/>\n\t\t<field name=\"testOnly\" since=\"4\"/>\n\t\t<field name=\"text\"/>\n\t\t<field name=\"textAlignment\" since=\"17\"/>\n\t\t<field name=\"textAllCaps\" since=\"14\"/>\n\t\t<field name=\"textAppearance\"/>\n\t\t<field name=\"textAppearanceButton\"/>\n\t\t<field name=\"textAppearanceInverse\"/>\n\t\t<field name=\"textAppearanceLarge\"/>\n\t\t<field name=\"textAppearanceLargeInverse\"/>\n\t\t<field name=\"textAppearanceLargePopupMenu\" since=\"11\"/>\n\t\t<field name=\"textAppearanceListItem\" since=\"14\"/>\n\t\t<field name=\"textAppearanceListItemSecondary\" since=\"21\"/>\n\t\t<field name=\"textAppearanceListItemSmall\" since=\"14\"/>\n\t\t<field name=\"textAppearanceMedium\"/>\n\t\t<field name=\"textAppearanceMediumInverse\"/>\n\t\t<field name=\"textAppearancePopupMenuHeader\" since=\"24\"/>\n\t\t<field name=\"textAppearanceSearchResultSubtitle\" since=\"5\"/>\n\t\t<field name=\"textAppearanceSearchResultTitle\" since=\"5\"/>\n\t\t<field name=\"textAppearanceSmall\"/>\n\t\t<field name=\"textAppearanceSmallInverse\"/>\n\t\t<field name=\"textAppearanceSmallPopupMenu\" since=\"11\"/>\n\t\t<field name=\"textCheckMark\"/>\n\t\t<field name=\"textCheckMarkInverse\"/>\n\t\t<field name=\"textColor\"/>\n\t\t<field name=\"textColorAlertDialogListItem\" since=\"11\"/>\n\t\t<field name=\"textColorHighlight\"/>\n\t\t<field name=\"textColorHighlightInverse\" since=\"11\"/>\n\t\t<field name=\"textColorHint\"/>\n\t\t<field name=\"textColorHintInverse\"/>\n\t\t<field name=\"textColorLink\"/>\n\t\t<field name=\"textColorLinkInverse\" since=\"11\"/>\n\t\t<field name=\"textColorPrimary\"/>\n\t\t<field name=\"textColorPrimaryDisableOnly\"/>\n\t\t<field name=\"textColorPrimaryInverse\"/>\n\t\t<field name=\"textColorPrimaryInverseDisableOnly\" since=\"4\"/>\n\t\t<field name=\"textColorPrimaryInverseNoDisable\"/>\n\t\t<field name=\"textColorPrimaryNoDisable\"/>\n\t\t<field name=\"textColorSecondary\"/>\n\t\t<field name=\"textColorSecondaryInverse\"/>\n\t\t<field name=\"textColorSecondaryInverseNoDisable\"/>\n\t\t<field name=\"textColorSecondaryNoDisable\"/>\n\t\t<field name=\"textColorTertiary\"/>\n\t\t<field name=\"textColorTertiaryInverse\"/>\n\t\t<field name=\"textCursorDrawable\" since=\"12\"/>\n\t\t<field name=\"textDirection\" since=\"17\"/>\n\t\t<field name=\"textEditNoPasteWindowLayout\" since=\"11\"/>\n\t\t<field name=\"textEditPasteWindowLayout\" since=\"11\"/>\n\t\t<field name=\"textEditSideNoPasteWindowLayout\" since=\"11\"/>\n\t\t<field name=\"textEditSidePasteWindowLayout\" since=\"11\"/>\n\t\t<field name=\"textEditSuggestionItemLayout\" since=\"14\"/>\n\t\t<field name=\"textFilterEnabled\"/>\n\t\t<field name=\"textFontWeight\" since=\"28\"/>\n\t\t<field name=\"textIsSelectable\" since=\"11\"/>\n\t\t<field name=\"textLocale\" since=\"29\"/>\n\t\t<field name=\"textOff\"/>\n\t\t<field name=\"textOn\"/>\n\t\t<field name=\"textScaleX\"/>\n\t\t<field name=\"textSelectHandle\" since=\"9\"/>\n\t\t<field name=\"textSelectHandleLeft\" since=\"9\"/>\n\t\t<field name=\"textSelectHandleRight\" since=\"9\"/>\n\t\t<field name=\"textSelectHandleWindowStyle\" since=\"9\"/>\n\t\t<field name=\"textSize\"/>\n\t\t<field name=\"textStyle\"/>\n\t\t<field name=\"textSuggestionsWindowStyle\" since=\"14\"/>\n\t\t<field name=\"textViewStyle\"/>\n\t\t<field name=\"theme\"/>\n\t\t<field name=\"thickness\" since=\"3\"/>\n\t\t<field name=\"thicknessRatio\"/>\n\t\t<field name=\"thumb\"/>\n\t\t<field name=\"thumbOffset\"/>\n\t\t<field name=\"thumbPosition\" since=\"23\"/>\n\t\t<field name=\"thumbTextPadding\" since=\"14\"/>\n\t\t<field name=\"thumbTint\" since=\"21\"/>\n\t\t<field name=\"thumbTintMode\" since=\"21\"/>\n\t\t<field name=\"thumbnail\" since=\"5\"/>\n\t\t<field name=\"tickMark\" since=\"24\"/>\n\t\t<field name=\"tickMarkTint\" since=\"24\"/>\n\t\t<field name=\"tickMarkTintMode\" since=\"24\"/>\n\t\t<field name=\"tileMode\"/>\n\t\t<field name=\"tileModeX\" since=\"21\"/>\n\t\t<field name=\"tileModeY\" since=\"21\"/>\n\t\t<field name=\"timePickerDialogTheme\" since=\"21\"/>\n\t\t<field name=\"timePickerMode\" since=\"21\"/>\n\t\t<field name=\"timePickerStyle\" since=\"21\"/>\n\t\t<field name=\"timeZone\" since=\"17\"/>\n\t\t<field name=\"tint\"/>\n\t\t<field name=\"tintMode\" since=\"21\"/>\n\t\t<field name=\"title\"/>\n\t\t<field name=\"titleCondensed\"/>\n\t\t<field name=\"titleMargin\" since=\"24\"/>\n\t\t<field name=\"titleMarginBottom\" since=\"24\"/>\n\t\t<field name=\"titleMarginEnd\" since=\"24\"/>\n\t\t<field name=\"titleMarginStart\" since=\"24\"/>\n\t\t<field name=\"titleMarginTop\" since=\"24\"/>\n\t\t<field name=\"titleTextAppearance\" since=\"21\"/>\n\t\t<field name=\"titleTextColor\" since=\"23\"/>\n\t\t<field name=\"titleTextStyle\" since=\"11\"/>\n\t\t<field name=\"toAlpha\"/>\n\t\t<field name=\"toDegrees\"/>\n\t\t<field name=\"toId\" since=\"21\"/>\n\t\t<field name=\"toScene\" since=\"19\"/>\n\t\t<field name=\"toXDelta\"/>\n\t\t<field name=\"toXScale\"/>\n\t\t<field name=\"toYDelta\"/>\n\t\t<field name=\"toYScale\"/>\n\t\t<field name=\"toolbarStyle\" since=\"21\"/>\n\t\t<field name=\"tooltipText\" since=\"26\"/>\n\t\t<field name=\"top\"/>\n\t\t<field name=\"topBright\"/>\n\t\t<field name=\"topDark\"/>\n\t\t<field name=\"topLeftRadius\"/>\n\t\t<field name=\"topOffset\" since=\"3\"/>\n\t\t<field name=\"topRightRadius\"/>\n\t\t<field name=\"touchscreenBlocksFocus\" since=\"21\"/>\n\t\t<field name=\"track\" since=\"14\"/>\n\t\t<field name=\"trackTint\" since=\"23\"/>\n\t\t<field name=\"trackTintMode\" since=\"23\"/>\n\t\t<field name=\"transcriptMode\"/>\n\t\t<field name=\"transformPivotX\" since=\"11\"/>\n\t\t<field name=\"transformPivotY\" since=\"11\"/>\n\t\t<field name=\"transition\" since=\"19\"/>\n\t\t<field name=\"transitionGroup\" since=\"21\"/>\n\t\t<field name=\"transitionName\" since=\"21\"/>\n\t\t<field name=\"transitionOrdering\" since=\"19\"/>\n\t\t<field name=\"transitionVisibilityMode\" since=\"21\"/>\n\t\t<field name=\"translateX\" since=\"21\"/>\n\t\t<field name=\"translateY\" since=\"21\"/>\n\t\t<field name=\"translationX\" since=\"11\"/>\n\t\t<field name=\"translationY\" since=\"11\"/>\n\t\t<field name=\"translationZ\" since=\"21\"/>\n\t\t<field name=\"trimPathEnd\" since=\"21\"/>\n\t\t<field name=\"trimPathOffset\" since=\"21\"/>\n\t\t<field name=\"trimPathStart\" since=\"21\"/>\n\t\t<field name=\"ttcIndex\" since=\"28\"/>\n\t\t<field name=\"tunerCount\" since=\"24\"/>\n\t\t<field name=\"turnScreenOn\" since=\"27\"/>\n\t\t<field name=\"type\"/>\n\t\t<field name=\"typeface\"/>\n\t\t<field name=\"uiOptions\" since=\"14\"/>\n\t\t<field name=\"uncertainGestureColor\" since=\"4\"/>\n\t\t<field name=\"unfocusedMonthDateColor\" since=\"11\" deprecated=\"23\"/>\n\t\t<field name=\"unselectedAlpha\"/>\n\t\t<field name=\"updatePeriodMillis\" since=\"3\"/>\n\t\t<field name=\"use32bitAbi\" since=\"24\"/>\n\t\t<field name=\"useAppZygote\" since=\"29\"/>\n\t\t<field name=\"useDefaultMargins\" since=\"14\"/>\n\t\t<field name=\"useEmbeddedDex\" since=\"29\"/>\n\t\t<field name=\"useIntrinsicSizeAsMinimum\" since=\"11\"/>\n\t\t<field name=\"useLevel\"/>\n\t\t<field name=\"userVisible\" since=\"5\"/>\n\t\t<field name=\"usesCleartextTraffic\" since=\"23\"/>\n\t\t<field name=\"value\"/>\n\t\t<field name=\"valueFrom\" since=\"11\"/>\n\t\t<field name=\"valueTo\" since=\"11\"/>\n\t\t<field name=\"valueType\" since=\"11\"/>\n\t\t<field name=\"variablePadding\"/>\n\t\t<field name=\"vendor\" since=\"19\"/>\n\t\t<field name=\"version\" since=\"24\"/>\n\t\t<field name=\"versionCode\"/>\n\t\t<field name=\"versionCodeMajor\" since=\"28\"/>\n\t\t<field name=\"versionMajor\" since=\"28\"/>\n\t\t<field name=\"versionName\"/>\n\t\t<field name=\"verticalCorrection\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"verticalDivider\"/>\n\t\t<field name=\"verticalGap\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"verticalScrollbarPosition\" since=\"11\"/>\n\t\t<field name=\"verticalSpacing\"/>\n\t\t<field name=\"viewportHeight\" since=\"21\"/>\n\t\t<field name=\"viewportWidth\" since=\"21\"/>\n\t\t<field name=\"visibility\"/>\n\t\t<field name=\"visible\"/>\n\t\t<field name=\"visibleToInstantApps\" since=\"26\"/>\n\t\t<field name=\"vmSafeMode\" since=\"8\"/>\n\t\t<field name=\"voiceIcon\" since=\"21\"/>\n\t\t<field name=\"voiceLanguage\" since=\"3\"/>\n\t\t<field name=\"voiceLanguageModel\" since=\"3\"/>\n\t\t<field name=\"voiceMaxResults\" since=\"3\"/>\n\t\t<field name=\"voicePromptText\" since=\"3\"/>\n\t\t<field name=\"voiceSearchMode\" since=\"3\"/>\n\t\t<field name=\"wallpaperCloseEnterAnimation\" since=\"5\"/>\n\t\t<field name=\"wallpaperCloseExitAnimation\" since=\"5\"/>\n\t\t<field name=\"wallpaperIntraCloseEnterAnimation\" since=\"5\"/>\n\t\t<field name=\"wallpaperIntraCloseExitAnimation\" since=\"5\"/>\n\t\t<field name=\"wallpaperIntraOpenEnterAnimation\" since=\"5\"/>\n\t\t<field name=\"wallpaperIntraOpenExitAnimation\" since=\"5\"/>\n\t\t<field name=\"wallpaperOpenEnterAnimation\" since=\"5\"/>\n\t\t<field name=\"wallpaperOpenExitAnimation\" since=\"5\"/>\n\t\t<field name=\"webTextViewStyle\" since=\"8\"/>\n\t\t<field name=\"webViewStyle\"/>\n\t\t<field name=\"weekDayTextAppearance\" since=\"11\"/>\n\t\t<field name=\"weekNumberColor\" since=\"11\" deprecated=\"23\"/>\n\t\t<field name=\"weekSeparatorLineColor\" since=\"11\" deprecated=\"23\"/>\n\t\t<field name=\"weightSum\"/>\n\t\t<field name=\"widgetCategory\" since=\"17\"/>\n\t\t<field name=\"widgetFeatures\" since=\"28\"/>\n\t\t<field name=\"widgetLayout\"/>\n\t\t<field name=\"width\"/>\n\t\t<field name=\"windowActionBar\" since=\"11\"/>\n\t\t<field name=\"windowActionBarOverlay\" since=\"11\"/>\n\t\t<field name=\"windowActionModeOverlay\" since=\"11\"/>\n\t\t<field name=\"windowActivityTransitions\" since=\"21\"/>\n\t\t<field name=\"windowAllowEnterTransitionOverlap\" since=\"21\"/>\n\t\t<field name=\"windowAllowReturnTransitionOverlap\" since=\"21\"/>\n\t\t<field name=\"windowAnimationStyle\"/>\n\t\t<field name=\"windowBackground\"/>\n\t\t<field name=\"windowBackgroundFallback\" since=\"24\"/>\n\t\t<field name=\"windowClipToOutline\" since=\"21\"/>\n\t\t<field name=\"windowCloseOnTouchOutside\" since=\"11\"/>\n\t\t<field name=\"windowContentOverlay\"/>\n\t\t<field name=\"windowContentTransitionManager\" since=\"21\"/>\n\t\t<field name=\"windowContentTransitions\" since=\"21\"/>\n\t\t<field name=\"windowDisablePreview\" since=\"3\"/>\n\t\t<field name=\"windowDrawsSystemBarBackgrounds\" since=\"21\"/>\n\t\t<field name=\"windowElevation\" since=\"21\"/>\n\t\t<field name=\"windowEnableSplitTouch\" since=\"11\"/>\n\t\t<field name=\"windowEnterAnimation\"/>\n\t\t<field name=\"windowEnterTransition\" since=\"21\"/>\n\t\t<field name=\"windowExitAnimation\"/>\n\t\t<field name=\"windowExitTransition\" since=\"21\"/>\n\t\t<field name=\"windowFrame\"/>\n\t\t<field name=\"windowFullscreen\"/>\n\t\t<field name=\"windowHideAnimation\"/>\n\t\t<field name=\"windowIsFloating\"/>\n\t\t<field name=\"windowIsTranslucent\"/>\n\t\t<field name=\"windowLayoutInDisplayCutoutMode\" since=\"27\"/>\n\t\t<field name=\"windowLightNavigationBar\" since=\"27\"/>\n\t\t<field name=\"windowLightStatusBar\" since=\"23\"/>\n\t\t<field name=\"windowMinWidthMajor\" since=\"11\"/>\n\t\t<field name=\"windowMinWidthMinor\" since=\"11\"/>\n\t\t<field name=\"windowNoDisplay\" since=\"3\"/>\n\t\t<field name=\"windowNoTitle\"/>\n\t\t<field name=\"windowOverscan\" since=\"18\"/>\n\t\t<field name=\"windowReenterTransition\" since=\"21\"/>\n\t\t<field name=\"windowReturnTransition\" since=\"21\"/>\n\t\t<field name=\"windowSharedElementEnterTransition\" since=\"21\"/>\n\t\t<field name=\"windowSharedElementExitTransition\" since=\"21\"/>\n\t\t<field name=\"windowSharedElementReenterTransition\" since=\"21\"/>\n\t\t<field name=\"windowSharedElementReturnTransition\" since=\"21\"/>\n\t\t<field name=\"windowSharedElementsUseOverlay\" since=\"21\"/>\n\t\t<field name=\"windowShowAnimation\"/>\n\t\t<field name=\"windowShowWallpaper\" since=\"5\"/>\n\t\t<field name=\"windowSoftInputMode\" since=\"3\"/>\n\t\t<field name=\"windowSplashscreenContent\" since=\"26\"/>\n\t\t<field name=\"windowSwipeToDismiss\" since=\"20\"/>\n\t\t<field name=\"windowTitleBackgroundStyle\"/>\n\t\t<field name=\"windowTitleSize\"/>\n\t\t<field name=\"windowTitleStyle\"/>\n\t\t<field name=\"windowTransitionBackgroundFadeDuration\" since=\"21\"/>\n\t\t<field name=\"windowTranslucentNavigation\" since=\"19\"/>\n\t\t<field name=\"windowTranslucentStatus\" since=\"19\"/>\n\t\t<field name=\"writePermission\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"xlargeScreens\" since=\"9\"/>\n\t\t<field name=\"y\"/>\n\t\t<field name=\"yearListItemTextAppearance\" since=\"21\" deprecated=\"23\"/>\n\t\t<field name=\"yearListSelectorColor\" since=\"21\" deprecated=\"23\"/>\n\t\t<field name=\"yesNoPreferenceStyle\"/>\n\t\t<field name=\"zAdjustment\"/>\n\t\t<field name=\"zygotePreloadName\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/R$bool\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/R$color\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"background_dark\"/>\n\t\t<field name=\"background_light\"/>\n\t\t<field name=\"black\"/>\n\t\t<field name=\"darker_gray\"/>\n\t\t<field name=\"holo_blue_bright\" since=\"14\"/>\n\t\t<field name=\"holo_blue_dark\" since=\"14\"/>\n\t\t<field name=\"holo_blue_light\" since=\"14\"/>\n\t\t<field name=\"holo_green_dark\" since=\"14\"/>\n\t\t<field name=\"holo_green_light\" since=\"14\"/>\n\t\t<field name=\"holo_orange_dark\" since=\"14\"/>\n\t\t<field name=\"holo_orange_light\" since=\"14\"/>\n\t\t<field name=\"holo_purple\" since=\"14\"/>\n\t\t<field name=\"holo_red_dark\" since=\"14\"/>\n\t\t<field name=\"holo_red_light\" since=\"14\"/>\n\t\t<field name=\"primary_text_dark\" deprecated=\"28\"/>\n\t\t<field name=\"primary_text_dark_nodisable\" deprecated=\"28\"/>\n\t\t<field name=\"primary_text_light\" deprecated=\"28\"/>\n\t\t<field name=\"primary_text_light_nodisable\" deprecated=\"28\"/>\n\t\t<field name=\"secondary_text_dark\" deprecated=\"28\"/>\n\t\t<field name=\"secondary_text_dark_nodisable\" deprecated=\"28\"/>\n\t\t<field name=\"secondary_text_light\" deprecated=\"28\"/>\n\t\t<field name=\"secondary_text_light_nodisable\" deprecated=\"28\"/>\n\t\t<field name=\"tab_indicator_text\"/>\n\t\t<field name=\"tertiary_text_dark\" deprecated=\"28\"/>\n\t\t<field name=\"tertiary_text_light\" deprecated=\"28\"/>\n\t\t<field name=\"transparent\"/>\n\t\t<field name=\"white\"/>\n\t\t<field name=\"widget_edittext_dark\"/>\n\t</class>\n\t<class name=\"android/R$dimen\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"app_icon_size\"/>\n\t\t<field name=\"dialog_min_width_major\" since=\"11\"/>\n\t\t<field name=\"dialog_min_width_minor\" since=\"11\"/>\n\t\t<field name=\"notification_large_icon_height\" since=\"11\"/>\n\t\t<field name=\"notification_large_icon_width\" since=\"11\"/>\n\t\t<field name=\"thumbnail_height\"/>\n\t\t<field name=\"thumbnail_width\"/>\n\t</class>\n\t<class name=\"android/R$drawable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"alert_dark_frame\"/>\n\t\t<field name=\"alert_light_frame\"/>\n\t\t<field name=\"arrow_down_float\"/>\n\t\t<field name=\"arrow_up_float\"/>\n\t\t<field name=\"bottom_bar\"/>\n\t\t<field name=\"btn_default\"/>\n\t\t<field name=\"btn_default_small\"/>\n\t\t<field name=\"btn_dialog\"/>\n\t\t<field name=\"btn_dropdown\"/>\n\t\t<field name=\"btn_minus\"/>\n\t\t<field name=\"btn_plus\"/>\n\t\t<field name=\"btn_radio\"/>\n\t\t<field name=\"btn_star\"/>\n\t\t<field name=\"btn_star_big_off\"/>\n\t\t<field name=\"btn_star_big_on\"/>\n\t\t<field name=\"button_onoff_indicator_off\"/>\n\t\t<field name=\"button_onoff_indicator_on\"/>\n\t\t<field name=\"checkbox_off_background\"/>\n\t\t<field name=\"checkbox_on_background\"/>\n\t\t<field name=\"dark_header\" since=\"3\"/>\n\t\t<field name=\"dialog_frame\"/>\n\t\t<field name=\"dialog_holo_dark_frame\" since=\"11\"/>\n\t\t<field name=\"dialog_holo_light_frame\" since=\"11\"/>\n\t\t<field name=\"divider_horizontal_bright\"/>\n\t\t<field name=\"divider_horizontal_dark\"/>\n\t\t<field name=\"divider_horizontal_dim_dark\"/>\n\t\t<field name=\"divider_horizontal_textfield\"/>\n\t\t<field name=\"edit_text\"/>\n\t\t<field name=\"editbox_background\"/>\n\t\t<field name=\"editbox_background_normal\"/>\n\t\t<field name=\"editbox_dropdown_dark_frame\"/>\n\t\t<field name=\"editbox_dropdown_light_frame\"/>\n\t\t<field name=\"gallery_thumb\"/>\n\t\t<field name=\"ic_btn_speak_now\" since=\"3\"/>\n\t\t<field name=\"ic_delete\"/>\n\t\t<field name=\"ic_dialog_alert\"/>\n\t\t<field name=\"ic_dialog_dialer\"/>\n\t\t<field name=\"ic_dialog_email\"/>\n\t\t<field name=\"ic_dialog_info\"/>\n\t\t<field name=\"ic_dialog_map\"/>\n\t\t<field name=\"ic_input_add\"/>\n\t\t<field name=\"ic_input_delete\"/>\n\t\t<field name=\"ic_input_get\"/>\n\t\t<field name=\"ic_lock_idle_alarm\"/>\n\t\t<field name=\"ic_lock_idle_charging\"/>\n\t\t<field name=\"ic_lock_idle_lock\"/>\n\t\t<field name=\"ic_lock_idle_low_battery\"/>\n\t\t<field name=\"ic_lock_lock\"/>\n\t\t<field name=\"ic_lock_power_off\"/>\n\t\t<field name=\"ic_lock_silent_mode\"/>\n\t\t<field name=\"ic_lock_silent_mode_off\"/>\n\t\t<field name=\"ic_media_ff\"/>\n\t\t<field name=\"ic_media_next\"/>\n\t\t<field name=\"ic_media_pause\"/>\n\t\t<field name=\"ic_media_play\"/>\n\t\t<field name=\"ic_media_previous\"/>\n\t\t<field name=\"ic_media_rew\"/>\n\t\t<field name=\"ic_menu_add\"/>\n\t\t<field name=\"ic_menu_agenda\"/>\n\t\t<field name=\"ic_menu_always_landscape_portrait\"/>\n\t\t<field name=\"ic_menu_call\"/>\n\t\t<field name=\"ic_menu_camera\"/>\n\t\t<field name=\"ic_menu_close_clear_cancel\"/>\n\t\t<field name=\"ic_menu_compass\"/>\n\t\t<field name=\"ic_menu_crop\"/>\n\t\t<field name=\"ic_menu_day\"/>\n\t\t<field name=\"ic_menu_delete\"/>\n\t\t<field name=\"ic_menu_directions\"/>\n\t\t<field name=\"ic_menu_edit\"/>\n\t\t<field name=\"ic_menu_gallery\"/>\n\t\t<field name=\"ic_menu_help\"/>\n\t\t<field name=\"ic_menu_info_details\"/>\n\t\t<field name=\"ic_menu_manage\"/>\n\t\t<field name=\"ic_menu_mapmode\"/>\n\t\t<field name=\"ic_menu_month\"/>\n\t\t<field name=\"ic_menu_more\"/>\n\t\t<field name=\"ic_menu_my_calendar\"/>\n\t\t<field name=\"ic_menu_mylocation\"/>\n\t\t<field name=\"ic_menu_myplaces\"/>\n\t\t<field name=\"ic_menu_preferences\"/>\n\t\t<field name=\"ic_menu_recent_history\"/>\n\t\t<field name=\"ic_menu_report_image\"/>\n\t\t<field name=\"ic_menu_revert\"/>\n\t\t<field name=\"ic_menu_rotate\"/>\n\t\t<field name=\"ic_menu_save\"/>\n\t\t<field name=\"ic_menu_search\"/>\n\t\t<field name=\"ic_menu_send\"/>\n\t\t<field name=\"ic_menu_set_as\"/>\n\t\t<field name=\"ic_menu_share\"/>\n\t\t<field name=\"ic_menu_slideshow\"/>\n\t\t<field name=\"ic_menu_sort_alphabetically\"/>\n\t\t<field name=\"ic_menu_sort_by_size\"/>\n\t\t<field name=\"ic_menu_today\"/>\n\t\t<field name=\"ic_menu_upload\"/>\n\t\t<field name=\"ic_menu_upload_you_tube\"/>\n\t\t<field name=\"ic_menu_view\"/>\n\t\t<field name=\"ic_menu_week\"/>\n\t\t<field name=\"ic_menu_zoom\"/>\n\t\t<field name=\"ic_notification_clear_all\"/>\n\t\t<field name=\"ic_notification_overlay\"/>\n\t\t<field name=\"ic_partial_secure\"/>\n\t\t<field name=\"ic_popup_disk_full\"/>\n\t\t<field name=\"ic_popup_reminder\"/>\n\t\t<field name=\"ic_popup_sync\"/>\n\t\t<field name=\"ic_search_category_default\"/>\n\t\t<field name=\"ic_secure\"/>\n\t\t<field name=\"list_selector_background\"/>\n\t\t<field name=\"menu_frame\"/>\n\t\t<field name=\"menu_full_frame\"/>\n\t\t<field name=\"menuitem_background\"/>\n\t\t<field name=\"picture_frame\"/>\n\t\t<field name=\"presence_audio_away\" since=\"9\"/>\n\t\t<field name=\"presence_audio_busy\" since=\"9\"/>\n\t\t<field name=\"presence_audio_online\" since=\"9\"/>\n\t\t<field name=\"presence_away\"/>\n\t\t<field name=\"presence_busy\"/>\n\t\t<field name=\"presence_invisible\"/>\n\t\t<field name=\"presence_offline\"/>\n\t\t<field name=\"presence_online\"/>\n\t\t<field name=\"presence_video_away\" since=\"9\"/>\n\t\t<field name=\"presence_video_busy\" since=\"9\"/>\n\t\t<field name=\"presence_video_online\" since=\"9\"/>\n\t\t<field name=\"progress_horizontal\"/>\n\t\t<field name=\"progress_indeterminate_horizontal\"/>\n\t\t<field name=\"radiobutton_off_background\"/>\n\t\t<field name=\"radiobutton_on_background\"/>\n\t\t<field name=\"screen_background_dark\"/>\n\t\t<field name=\"screen_background_dark_transparent\" since=\"5\"/>\n\t\t<field name=\"screen_background_light\"/>\n\t\t<field name=\"screen_background_light_transparent\" since=\"5\"/>\n\t\t<field name=\"spinner_background\"/>\n\t\t<field name=\"spinner_dropdown_background\"/>\n\t\t<field name=\"star_big_off\"/>\n\t\t<field name=\"star_big_on\"/>\n\t\t<field name=\"star_off\"/>\n\t\t<field name=\"star_on\"/>\n\t\t<field name=\"stat_notify_call_mute\"/>\n\t\t<field name=\"stat_notify_chat\"/>\n\t\t<field name=\"stat_notify_error\"/>\n\t\t<field name=\"stat_notify_missed_call\"/>\n\t\t<field name=\"stat_notify_more\"/>\n\t\t<field name=\"stat_notify_sdcard\"/>\n\t\t<field name=\"stat_notify_sdcard_prepare\" since=\"5\"/>\n\t\t<field name=\"stat_notify_sdcard_usb\"/>\n\t\t<field name=\"stat_notify_sync\"/>\n\t\t<field name=\"stat_notify_sync_noanim\"/>\n\t\t<field name=\"stat_notify_voicemail\"/>\n\t\t<field name=\"stat_sys_data_bluetooth\"/>\n\t\t<field name=\"stat_sys_download\"/>\n\t\t<field name=\"stat_sys_download_done\"/>\n\t\t<field name=\"stat_sys_headset\"/>\n\t\t<field name=\"stat_sys_phone_call\" deprecated=\"15\"/>\n\t\t<field name=\"stat_sys_phone_call_forward\" deprecated=\"15\"/>\n\t\t<field name=\"stat_sys_phone_call_on_hold\" deprecated=\"15\"/>\n\t\t<field name=\"stat_sys_speakerphone\"/>\n\t\t<field name=\"stat_sys_upload\"/>\n\t\t<field name=\"stat_sys_upload_done\"/>\n\t\t<field name=\"stat_sys_vp_phone_call\" since=\"4\" deprecated=\"15\"/>\n\t\t<field name=\"stat_sys_vp_phone_call_on_hold\" since=\"4\" deprecated=\"15\"/>\n\t\t<field name=\"stat_sys_warning\"/>\n\t\t<field name=\"status_bar_item_app_background\"/>\n\t\t<field name=\"status_bar_item_background\"/>\n\t\t<field name=\"sym_action_call\"/>\n\t\t<field name=\"sym_action_chat\"/>\n\t\t<field name=\"sym_action_email\"/>\n\t\t<field name=\"sym_call_incoming\"/>\n\t\t<field name=\"sym_call_missed\"/>\n\t\t<field name=\"sym_call_outgoing\"/>\n\t\t<field name=\"sym_contact_card\"/>\n\t\t<field name=\"sym_def_app_icon\"/>\n\t\t<field name=\"title_bar\"/>\n\t\t<field name=\"title_bar_tall\" since=\"3\"/>\n\t\t<field name=\"toast_frame\"/>\n\t\t<field name=\"zoom_plate\"/>\n\t</class>\n\t<class name=\"android/R$fraction\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/R$id\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"accessibilityActionContextClick\" since=\"23\"/>\n\t\t<field name=\"accessibilityActionHideTooltip\" since=\"28\"/>\n\t\t<field name=\"accessibilityActionMoveWindow\" since=\"26\"/>\n\t\t<field name=\"accessibilityActionPageDown\" since=\"29\"/>\n\t\t<field name=\"accessibilityActionPageLeft\" since=\"29\"/>\n\t\t<field name=\"accessibilityActionPageRight\" since=\"29\"/>\n\t\t<field name=\"accessibilityActionPageUp\" since=\"29\"/>\n\t\t<field name=\"accessibilityActionScrollDown\" since=\"23\"/>\n\t\t<field name=\"accessibilityActionScrollLeft\" since=\"23\"/>\n\t\t<field name=\"accessibilityActionScrollRight\" since=\"23\"/>\n\t\t<field name=\"accessibilityActionScrollToPosition\" since=\"23\"/>\n\t\t<field name=\"accessibilityActionScrollUp\" since=\"23\"/>\n\t\t<field name=\"accessibilityActionSetProgress\" since=\"24\"/>\n\t\t<field name=\"accessibilityActionShowOnScreen\" since=\"23\"/>\n\t\t<field name=\"accessibilityActionShowTooltip\" since=\"28\"/>\n\t\t<field name=\"addToDictionary\" since=\"3\"/>\n\t\t<field name=\"autofill\" since=\"26\"/>\n\t\t<field name=\"background\"/>\n\t\t<field name=\"button1\"/>\n\t\t<field name=\"button2\"/>\n\t\t<field name=\"button3\"/>\n\t\t<field name=\"candidatesArea\" since=\"3\"/>\n\t\t<field name=\"checkbox\"/>\n\t\t<field name=\"closeButton\" since=\"3\"/>\n\t\t<field name=\"content\"/>\n\t\t<field name=\"copy\" since=\"3\"/>\n\t\t<field name=\"copyUrl\" since=\"3\"/>\n\t\t<field name=\"custom\" since=\"8\"/>\n\t\t<field name=\"cut\" since=\"3\"/>\n\t\t<field name=\"edit\"/>\n\t\t<field name=\"empty\"/>\n\t\t<field name=\"extractArea\" since=\"3\"/>\n\t\t<field name=\"hint\"/>\n\t\t<field name=\"home\" since=\"11\"/>\n\t\t<field name=\"icon\"/>\n\t\t<field name=\"icon1\"/>\n\t\t<field name=\"icon2\"/>\n\t\t<field name=\"icon_frame\" since=\"24\"/>\n\t\t<field name=\"input\"/>\n\t\t<field name=\"inputArea\" since=\"3\"/>\n\t\t<field name=\"inputExtractEditText\" since=\"3\"/>\n\t\t<field name=\"keyboardView\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"list\"/>\n\t\t<field name=\"list_container\" since=\"24\"/>\n\t\t<field name=\"mask\" since=\"21\"/>\n\t\t<field name=\"message\"/>\n\t\t<field name=\"navigationBarBackground\" since=\"21\"/>\n\t\t<field name=\"paste\" since=\"3\"/>\n\t\t<field name=\"pasteAsPlainText\" since=\"23\"/>\n\t\t<field name=\"primary\"/>\n\t\t<field name=\"progress\"/>\n\t\t<field name=\"redo\" since=\"23\"/>\n\t\t<field name=\"replaceText\" since=\"23\"/>\n\t\t<field name=\"secondaryProgress\"/>\n\t\t<field name=\"selectAll\" since=\"3\"/>\n\t\t<field name=\"selectTextMode\" since=\"11\"/>\n\t\t<field name=\"selectedIcon\"/>\n\t\t<field name=\"shareText\" since=\"23\"/>\n\t\t<field name=\"startSelectingText\" since=\"3\"/>\n\t\t<field name=\"statusBarBackground\" since=\"21\"/>\n\t\t<field name=\"stopSelectingText\" since=\"3\"/>\n\t\t<field name=\"summary\"/>\n\t\t<field name=\"switchInputMethod\" since=\"3\"/>\n\t\t<field name=\"switch_widget\" since=\"24\"/>\n\t\t<field name=\"tabcontent\"/>\n\t\t<field name=\"tabhost\"/>\n\t\t<field name=\"tabs\"/>\n\t\t<field name=\"text1\"/>\n\t\t<field name=\"text2\"/>\n\t\t<field name=\"textAssist\" since=\"26\"/>\n\t\t<field name=\"title\"/>\n\t\t<field name=\"toggle\"/>\n\t\t<field name=\"undo\" since=\"23\"/>\n\t\t<field name=\"widget_frame\"/>\n\t</class>\n\t<class name=\"android/R$integer\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"config_longAnimTime\"/>\n\t\t<field name=\"config_mediumAnimTime\"/>\n\t\t<field name=\"config_shortAnimTime\"/>\n\t\t<field name=\"status_bar_notification_info_maxnum\" since=\"14\"/>\n\t</class>\n\t<class name=\"android/R$interpolator\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"accelerate_cubic\"/>\n\t\t<field name=\"accelerate_decelerate\"/>\n\t\t<field name=\"accelerate_quad\"/>\n\t\t<field name=\"accelerate_quint\"/>\n\t\t<field name=\"anticipate\"/>\n\t\t<field name=\"anticipate_overshoot\"/>\n\t\t<field name=\"bounce\"/>\n\t\t<field name=\"cycle\"/>\n\t\t<field name=\"decelerate_cubic\"/>\n\t\t<field name=\"decelerate_quad\"/>\n\t\t<field name=\"decelerate_quint\"/>\n\t\t<field name=\"fast_out_extra_slow_in\" since=\"28\"/>\n\t\t<field name=\"fast_out_linear_in\" since=\"21\"/>\n\t\t<field name=\"fast_out_slow_in\" since=\"21\"/>\n\t\t<field name=\"linear\"/>\n\t\t<field name=\"linear_out_slow_in\" since=\"21\"/>\n\t\t<field name=\"overshoot\"/>\n\t</class>\n\t<class name=\"android/R$layout\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"activity_list_item\"/>\n\t\t<field name=\"browser_link_context_header\"/>\n\t\t<field name=\"expandable_list_content\"/>\n\t\t<field name=\"list_content\" since=\"11\"/>\n\t\t<field name=\"preference_category\"/>\n\t\t<field name=\"select_dialog_item\"/>\n\t\t<field name=\"select_dialog_multichoice\"/>\n\t\t<field name=\"select_dialog_singlechoice\"/>\n\t\t<field name=\"simple_dropdown_item_1line\"/>\n\t\t<field name=\"simple_expandable_list_item_1\"/>\n\t\t<field name=\"simple_expandable_list_item_2\"/>\n\t\t<field name=\"simple_gallery_item\"/>\n\t\t<field name=\"simple_list_item_1\"/>\n\t\t<field name=\"simple_list_item_2\"/>\n\t\t<field name=\"simple_list_item_activated_1\" since=\"11\"/>\n\t\t<field name=\"simple_list_item_activated_2\" since=\"11\"/>\n\t\t<field name=\"simple_list_item_checked\"/>\n\t\t<field name=\"simple_list_item_multiple_choice\"/>\n\t\t<field name=\"simple_list_item_single_choice\"/>\n\t\t<field name=\"simple_selectable_list_item\" since=\"11\"/>\n\t\t<field name=\"simple_spinner_dropdown_item\"/>\n\t\t<field name=\"simple_spinner_item\"/>\n\t\t<field name=\"test_list_item\"/>\n\t\t<field name=\"two_line_list_item\"/>\n\t</class>\n\t<class name=\"android/R$menu\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/R$mipmap\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"sym_def_app_icon\"/>\n\t</class>\n\t<class name=\"android/R$plurals\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/R$raw\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/R$string\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"VideoView_error_button\"/>\n\t\t<field name=\"VideoView_error_text_invalid_progressive_playback\" since=\"3\"/>\n\t\t<field name=\"VideoView_error_text_unknown\"/>\n\t\t<field name=\"VideoView_error_title\"/>\n\t\t<field name=\"autofill\" since=\"27\"/>\n\t\t<field name=\"cancel\"/>\n\t\t<field name=\"copy\"/>\n\t\t<field name=\"copyUrl\"/>\n\t\t<field name=\"cut\"/>\n\t\t<field name=\"defaultMsisdnAlphaTag\"/>\n\t\t<field name=\"defaultVoiceMailAlphaTag\"/>\n\t\t<field name=\"dialog_alert_title\" since=\"3\"/>\n\t\t<field name=\"emptyPhoneNumber\"/>\n\t\t<field name=\"fingerprint_icon_content_description\" since=\"23\"/>\n\t\t<field name=\"httpErrorBadUrl\"/>\n\t\t<field name=\"httpErrorUnsupportedScheme\"/>\n\t\t<field name=\"no\" deprecated=\"30\"/>\n\t\t<field name=\"ok\"/>\n\t\t<field name=\"paste\"/>\n\t\t<field name=\"paste_as_plain_text\" since=\"26\"/>\n\t\t<field name=\"search_go\"/>\n\t\t<field name=\"selectAll\"/>\n\t\t<field name=\"selectTextMode\" since=\"11\"/>\n\t\t<field name=\"status_bar_notification_info_overflow\" since=\"14\"/>\n\t\t<field name=\"unknownName\"/>\n\t\t<field name=\"untitled\"/>\n\t\t<field name=\"yes\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/R$style\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"Animation\"/>\n\t\t<field name=\"Animation_Activity\"/>\n\t\t<field name=\"Animation_Dialog\"/>\n\t\t<field name=\"Animation_InputMethod\" since=\"5\"/>\n\t\t<field name=\"Animation_Toast\"/>\n\t\t<field name=\"Animation_Translucent\"/>\n\t\t<field name=\"DeviceDefault_ButtonBar\" since=\"14\"/>\n\t\t<field name=\"DeviceDefault_ButtonBar_AlertDialog\" since=\"14\"/>\n\t\t<field name=\"DeviceDefault_Light_ButtonBar\" since=\"14\"/>\n\t\t<field name=\"DeviceDefault_Light_ButtonBar_AlertDialog\" since=\"14\"/>\n\t\t<field name=\"DeviceDefault_Light_SegmentedButton\" since=\"14\"/>\n\t\t<field name=\"DeviceDefault_SegmentedButton\" since=\"14\"/>\n\t\t<field name=\"Holo_ButtonBar\" since=\"11\"/>\n\t\t<field name=\"Holo_ButtonBar_AlertDialog\" since=\"11\"/>\n\t\t<field name=\"Holo_Light_ButtonBar\" since=\"11\"/>\n\t\t<field name=\"Holo_Light_ButtonBar_AlertDialog\" since=\"11\"/>\n\t\t<field name=\"Holo_Light_SegmentedButton\" since=\"11\"/>\n\t\t<field name=\"Holo_SegmentedButton\" since=\"11\"/>\n\t\t<field name=\"MediaButton\"/>\n\t\t<field name=\"MediaButton_Ffwd\"/>\n\t\t<field name=\"MediaButton_Next\"/>\n\t\t<field name=\"MediaButton_Pause\"/>\n\t\t<field name=\"MediaButton_Play\"/>\n\t\t<field name=\"MediaButton_Previous\"/>\n\t\t<field name=\"MediaButton_Rew\"/>\n\t\t<field name=\"TextAppearance\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_DialogWindowTitle\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Inverse\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Large\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Large_Inverse\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Medium\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Medium_Inverse\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_SearchResult_Subtitle\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_SearchResult_Title\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Small\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Small_Inverse\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget_ActionBar_Menu\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget_ActionBar_Subtitle\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget_ActionBar_Subtitle_Inverse\" since=\"14\" deprecated=\"21\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget_ActionBar_Title\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget_ActionBar_Title_Inverse\" since=\"14\" deprecated=\"21\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget_ActionMode_Subtitle\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget_ActionMode_Subtitle_Inverse\" since=\"14\" deprecated=\"21\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget_ActionMode_Title\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget_ActionMode_Title_Inverse\" since=\"14\" deprecated=\"21\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget_Button\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget_DropDownHint\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget_DropDownItem\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget_EditText\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget_IconMenu_Item\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget_PopupMenu\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget_PopupMenu_Large\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget_PopupMenu_Small\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget_TabWidget\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget_TextView\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget_TextView_PopupMenu\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_Widget_TextView_SpinnerItem\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DeviceDefault_WindowTitle\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_DialogWindowTitle\"/>\n\t\t<field name=\"TextAppearance_Holo\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_DialogWindowTitle\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Inverse\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Large\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Large_Inverse\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Medium\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Medium_Inverse\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_SearchResult_Subtitle\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_SearchResult_Title\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Small\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Small_Inverse\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget_ActionBar_Menu\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget_ActionBar_Subtitle\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget_ActionBar_Subtitle_Inverse\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget_ActionBar_Title\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget_ActionBar_Title_Inverse\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget_ActionMode_Subtitle\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget_ActionMode_Subtitle_Inverse\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget_ActionMode_Title\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget_ActionMode_Title_Inverse\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget_Button\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget_DropDownHint\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget_DropDownItem\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget_EditText\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget_IconMenu_Item\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget_PopupMenu\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget_PopupMenu_Large\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget_PopupMenu_Small\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget_TabWidget\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget_TextView\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget_TextView_PopupMenu\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_Widget_TextView_SpinnerItem\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Holo_WindowTitle\" since=\"13\"/>\n\t\t<field name=\"TextAppearance_Inverse\"/>\n\t\t<field name=\"TextAppearance_Large\"/>\n\t\t<field name=\"TextAppearance_Large_Inverse\"/>\n\t\t<field name=\"TextAppearance_Material\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Body1\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Body2\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Button\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Caption\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_DialogWindowTitle\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Display1\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Display2\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Display3\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Display4\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Headline\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Inverse\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Large\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Large_Inverse\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Medium\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Medium_Inverse\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Menu\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Notification\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Notification_Emphasis\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Notification_Info\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Notification_Line2\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Notification_Time\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Notification_Title\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_SearchResult_Subtitle\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_SearchResult_Title\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Small\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Small_Inverse\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Subhead\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Title\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_ActionBar_Menu\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_ActionBar_Subtitle\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_ActionBar_Subtitle_Inverse\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_ActionBar_Title\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_ActionBar_Title_Inverse\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_ActionMode_Subtitle\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_ActionMode_Subtitle_Inverse\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_ActionMode_Title\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_ActionMode_Title_Inverse\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_Button\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_Button_Borderless_Colored\" since=\"24\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_Button_Colored\" since=\"24\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_Button_Inverse\" since=\"23\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_DropDownHint\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_DropDownItem\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_EditText\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_IconMenu_Item\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_PopupMenu\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_PopupMenu_Large\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_PopupMenu_Small\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_TabWidget\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_TextView\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_TextView_PopupMenu\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_TextView_SpinnerItem\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_Toolbar_Subtitle\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_Widget_Toolbar_Title\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Material_WindowTitle\" since=\"21\"/>\n\t\t<field name=\"TextAppearance_Medium\"/>\n\t\t<field name=\"TextAppearance_Medium_Inverse\"/>\n\t\t<field name=\"TextAppearance_Small\"/>\n\t\t<field name=\"TextAppearance_Small_Inverse\"/>\n\t\t<field name=\"TextAppearance_StatusBar_EventContent\" since=\"9\"/>\n\t\t<field name=\"TextAppearance_StatusBar_EventContent_Title\" since=\"9\"/>\n\t\t<field name=\"TextAppearance_StatusBar_Icon\" since=\"9\"/>\n\t\t<field name=\"TextAppearance_StatusBar_Title\" since=\"9\"/>\n\t\t<field name=\"TextAppearance_SuggestionHighlight\" since=\"14\"/>\n\t\t<field name=\"TextAppearance_Theme\"/>\n\t\t<field name=\"TextAppearance_Theme_Dialog\"/>\n\t\t<field name=\"TextAppearance_Widget\"/>\n\t\t<field name=\"TextAppearance_Widget_Button\"/>\n\t\t<field name=\"TextAppearance_Widget_DropDownHint\"/>\n\t\t<field name=\"TextAppearance_Widget_DropDownItem\"/>\n\t\t<field name=\"TextAppearance_Widget_EditText\"/>\n\t\t<field name=\"TextAppearance_Widget_IconMenu_Item\"/>\n\t\t<field name=\"TextAppearance_Widget_PopupMenu_Large\" since=\"11\"/>\n\t\t<field name=\"TextAppearance_Widget_PopupMenu_Small\" since=\"11\"/>\n\t\t<field name=\"TextAppearance_Widget_TabWidget\"/>\n\t\t<field name=\"TextAppearance_Widget_TextView\"/>\n\t\t<field name=\"TextAppearance_Widget_TextView_PopupMenu\"/>\n\t\t<field name=\"TextAppearance_Widget_TextView_SpinnerItem\"/>\n\t\t<field name=\"TextAppearance_WindowTitle\"/>\n\t\t<field name=\"Theme\"/>\n\t\t<field name=\"ThemeOverlay\" since=\"21\"/>\n\t\t<field name=\"ThemeOverlay_DeviceDefault_Accent_DayNight\" since=\"29\"/>\n\t\t<field name=\"ThemeOverlay_Material\" since=\"21\"/>\n\t\t<field name=\"ThemeOverlay_Material_ActionBar\" since=\"21\"/>\n\t\t<field name=\"ThemeOverlay_Material_Dark\" since=\"21\"/>\n\t\t<field name=\"ThemeOverlay_Material_Dark_ActionBar\" since=\"21\"/>\n\t\t<field name=\"ThemeOverlay_Material_Dialog\" since=\"23\"/>\n\t\t<field name=\"ThemeOverlay_Material_Dialog_Alert\" since=\"23\"/>\n\t\t<field name=\"ThemeOverlay_Material_Light\" since=\"21\"/>\n\t\t<field name=\"Theme_Black\"/>\n\t\t<field name=\"Theme_Black_NoTitleBar\"/>\n\t\t<field name=\"Theme_Black_NoTitleBar_Fullscreen\"/>\n\t\t<field name=\"Theme_DeviceDefault\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_DayNight\" since=\"29\"/>\n\t\t<field name=\"Theme_DeviceDefault_Dialog\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_DialogWhenLarge\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_DialogWhenLarge_NoActionBar\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_Dialog_Alert\" since=\"22\"/>\n\t\t<field name=\"Theme_DeviceDefault_Dialog_MinWidth\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_Dialog_NoActionBar\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_Dialog_NoActionBar_MinWidth\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_InputMethod\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_Light\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_Light_DarkActionBar\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_Light_Dialog\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_Light_DialogWhenLarge\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_Light_DialogWhenLarge_NoActionBar\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_Light_Dialog_Alert\" since=\"22\"/>\n\t\t<field name=\"Theme_DeviceDefault_Light_Dialog_MinWidth\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_Light_Dialog_NoActionBar\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_Light_Dialog_NoActionBar_MinWidth\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_Light_NoActionBar\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_Light_NoActionBar_Fullscreen\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_Light_NoActionBar_Overscan\" since=\"18\"/>\n\t\t<field name=\"Theme_DeviceDefault_Light_NoActionBar_TranslucentDecor\" since=\"19\"/>\n\t\t<field name=\"Theme_DeviceDefault_Light_Panel\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_NoActionBar\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_NoActionBar_Fullscreen\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_NoActionBar_Overscan\" since=\"18\"/>\n\t\t<field name=\"Theme_DeviceDefault_NoActionBar_TranslucentDecor\" since=\"19\"/>\n\t\t<field name=\"Theme_DeviceDefault_Panel\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_Settings\" since=\"21\"/>\n\t\t<field name=\"Theme_DeviceDefault_Wallpaper\" since=\"14\"/>\n\t\t<field name=\"Theme_DeviceDefault_Wallpaper_NoTitleBar\" since=\"14\"/>\n\t\t<field name=\"Theme_Dialog\"/>\n\t\t<field name=\"Theme_Holo\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_Dialog\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_DialogWhenLarge\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_DialogWhenLarge_NoActionBar\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_Dialog_MinWidth\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_Dialog_NoActionBar\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_Dialog_NoActionBar_MinWidth\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_InputMethod\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_Light\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_Light_DarkActionBar\" since=\"14\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_Light_Dialog\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_Light_DialogWhenLarge\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_Light_DialogWhenLarge_NoActionBar\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_Light_Dialog_MinWidth\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_Light_Dialog_NoActionBar\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_Light_Dialog_NoActionBar_MinWidth\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_Light_NoActionBar\" since=\"13\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_Light_NoActionBar_Fullscreen\" since=\"13\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_Light_NoActionBar_Overscan\" since=\"18\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_Light_NoActionBar_TranslucentDecor\" since=\"19\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_Light_Panel\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_NoActionBar\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_NoActionBar_Fullscreen\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_NoActionBar_Overscan\" since=\"18\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_NoActionBar_TranslucentDecor\" since=\"19\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_Panel\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_Wallpaper\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_Holo_Wallpaper_NoTitleBar\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"Theme_InputMethod\" since=\"3\"/>\n\t\t<field name=\"Theme_Light\"/>\n\t\t<field name=\"Theme_Light_NoTitleBar\"/>\n\t\t<field name=\"Theme_Light_NoTitleBar_Fullscreen\"/>\n\t\t<field name=\"Theme_Light_Panel\" since=\"3\"/>\n\t\t<field name=\"Theme_Light_WallpaperSettings\" since=\"5\"/>\n\t\t<field name=\"Theme_Material\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Dialog\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_DialogWhenLarge\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_DialogWhenLarge_NoActionBar\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Dialog_Alert\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Dialog_MinWidth\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Dialog_NoActionBar\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Dialog_NoActionBar_MinWidth\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Dialog_Presentation\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_InputMethod\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Light\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Light_DarkActionBar\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Light_Dialog\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Light_DialogWhenLarge\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Light_DialogWhenLarge_DarkActionBar\" since=\"24\"/>\n\t\t<field name=\"Theme_Material_Light_DialogWhenLarge_NoActionBar\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Light_Dialog_Alert\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Light_Dialog_MinWidth\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Light_Dialog_NoActionBar\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Light_Dialog_NoActionBar_MinWidth\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Light_Dialog_Presentation\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Light_LightStatusBar\" since=\"23\"/>\n\t\t<field name=\"Theme_Material_Light_NoActionBar\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Light_NoActionBar_Fullscreen\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Light_NoActionBar_Overscan\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Light_NoActionBar_TranslucentDecor\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Light_Panel\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Light_Voice\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_NoActionBar\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_NoActionBar_Fullscreen\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_NoActionBar_Overscan\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_NoActionBar_TranslucentDecor\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Panel\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Settings\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Voice\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Wallpaper\" since=\"21\"/>\n\t\t<field name=\"Theme_Material_Wallpaper_NoTitleBar\" since=\"21\"/>\n\t\t<field name=\"Theme_NoDisplay\" since=\"3\"/>\n\t\t<field name=\"Theme_NoTitleBar\"/>\n\t\t<field name=\"Theme_NoTitleBar_Fullscreen\"/>\n\t\t<field name=\"Theme_NoTitleBar_OverlayActionModes\" since=\"11\"/>\n\t\t<field name=\"Theme_Panel\" since=\"3\"/>\n\t\t<field name=\"Theme_Translucent\"/>\n\t\t<field name=\"Theme_Translucent_NoTitleBar\"/>\n\t\t<field name=\"Theme_Translucent_NoTitleBar_Fullscreen\"/>\n\t\t<field name=\"Theme_Wallpaper\" since=\"5\"/>\n\t\t<field name=\"Theme_WallpaperSettings\" since=\"5\"/>\n\t\t<field name=\"Theme_Wallpaper_NoTitleBar\" since=\"5\"/>\n\t\t<field name=\"Theme_Wallpaper_NoTitleBar_Fullscreen\" since=\"5\"/>\n\t\t<field name=\"Theme_WithActionBar\" since=\"11\"/>\n\t\t<field name=\"Widget\"/>\n\t\t<field name=\"Widget_AbsListView\"/>\n\t\t<field name=\"Widget_ActionBar\" since=\"11\"/>\n\t\t<field name=\"Widget_ActionBar_TabBar\" since=\"13\"/>\n\t\t<field name=\"Widget_ActionBar_TabText\" since=\"13\"/>\n\t\t<field name=\"Widget_ActionBar_TabView\" since=\"13\"/>\n\t\t<field name=\"Widget_ActionButton\" since=\"11\"/>\n\t\t<field name=\"Widget_ActionButton_CloseMode\" since=\"11\"/>\n\t\t<field name=\"Widget_ActionButton_Overflow\" since=\"11\"/>\n\t\t<field name=\"Widget_AutoCompleteTextView\"/>\n\t\t<field name=\"Widget_Button\"/>\n\t\t<field name=\"Widget_Button_Inset\"/>\n\t\t<field name=\"Widget_Button_Small\"/>\n\t\t<field name=\"Widget_Button_Toggle\"/>\n\t\t<field name=\"Widget_CalendarView\" since=\"11\"/>\n\t\t<field name=\"Widget_CompoundButton\"/>\n\t\t<field name=\"Widget_CompoundButton_CheckBox\"/>\n\t\t<field name=\"Widget_CompoundButton_RadioButton\"/>\n\t\t<field name=\"Widget_CompoundButton_Star\"/>\n\t\t<field name=\"Widget_DatePicker\" since=\"11\"/>\n\t\t<field name=\"Widget_DeviceDefault\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_ActionBar\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_ActionBar_Solid\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_ActionBar_TabBar\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_ActionBar_TabText\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_ActionBar_TabView\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_ActionButton\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_ActionButton_CloseMode\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_ActionButton_Overflow\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_ActionButton_TextButton\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_ActionMode\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_AutoCompleteTextView\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Button\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Button_Borderless\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Button_Borderless_Colored\" since=\"28\"/>\n\t\t<field name=\"Widget_DeviceDefault_Button_Borderless_Small\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Button_Colored\" since=\"28\"/>\n\t\t<field name=\"Widget_DeviceDefault_Button_Inset\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Button_Small\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Button_Toggle\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_CalendarView\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_CheckedTextView\" since=\"17\"/>\n\t\t<field name=\"Widget_DeviceDefault_CompoundButton_CheckBox\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_CompoundButton_RadioButton\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_CompoundButton_Star\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_DatePicker\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_DropDownItem\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_DropDownItem_Spinner\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_EditText\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_ExpandableListView\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_FastScroll\" since=\"21\"/>\n\t\t<field name=\"Widget_DeviceDefault_GridView\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_HorizontalScrollView\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_ImageButton\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ActionBar\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ActionBar_Solid\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ActionBar_Solid_Inverse\" since=\"14\" deprecated=\"21\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ActionBar_TabBar\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ActionBar_TabBar_Inverse\" since=\"14\" deprecated=\"21\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ActionBar_TabText\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ActionBar_TabText_Inverse\" since=\"14\" deprecated=\"21\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ActionBar_TabView\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ActionBar_TabView_Inverse\" since=\"14\" deprecated=\"21\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ActionButton\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ActionButton_CloseMode\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ActionButton_Overflow\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ActionMode\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ActionMode_Inverse\" since=\"14\" deprecated=\"21\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_AutoCompleteTextView\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_Button\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_Button_Borderless_Small\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_Button_Inset\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_Button_Small\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_Button_Toggle\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_CalendarView\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_CheckedTextView\" since=\"17\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_CompoundButton_CheckBox\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_CompoundButton_RadioButton\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_CompoundButton_Star\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_DropDownItem\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_DropDownItem_Spinner\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_EditText\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ExpandableListView\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_FastScroll\" since=\"21\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_GridView\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_HorizontalScrollView\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ImageButton\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ListPopupWindow\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ListView\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ListView_DropDown\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_MediaRouteButton\" since=\"16\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_PopupMenu\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_PopupWindow\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ProgressBar\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ProgressBar_Horizontal\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ProgressBar_Inverse\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ProgressBar_Large\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ProgressBar_Large_Inverse\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ProgressBar_Small\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ProgressBar_Small_Inverse\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ProgressBar_Small_Title\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_RatingBar\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_RatingBar_Indicator\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_RatingBar_Small\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_ScrollView\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_SeekBar\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_Spinner\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_StackView\" since=\"21\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_Tab\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_TabWidget\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_TextView\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_TextView_SpinnerItem\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_WebTextView\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Light_WebView\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_ListPopupWindow\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_ListView\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_ListView_DropDown\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_MediaRouteButton\" since=\"16\"/>\n\t\t<field name=\"Widget_DeviceDefault_PopupMenu\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_PopupWindow\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_ProgressBar\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_ProgressBar_Horizontal\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_ProgressBar_Large\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_ProgressBar_Small\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_ProgressBar_Small_Title\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_RatingBar\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_RatingBar_Indicator\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_RatingBar_Small\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_ScrollView\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_SeekBar\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_Spinner\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_StackView\" since=\"21\"/>\n\t\t<field name=\"Widget_DeviceDefault_Tab\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_TabWidget\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_TextView\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_TextView_SpinnerItem\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_WebTextView\" since=\"14\"/>\n\t\t<field name=\"Widget_DeviceDefault_WebView\" since=\"14\"/>\n\t\t<field name=\"Widget_DropDownItem\"/>\n\t\t<field name=\"Widget_DropDownItem_Spinner\"/>\n\t\t<field name=\"Widget_EditText\"/>\n\t\t<field name=\"Widget_ExpandableListView\"/>\n\t\t<field name=\"Widget_FastScroll\" since=\"21\"/>\n\t\t<field name=\"Widget_FragmentBreadCrumbs\" since=\"11\"/>\n\t\t<field name=\"Widget_Gallery\"/>\n\t\t<field name=\"Widget_GridView\"/>\n\t\t<field name=\"Widget_Holo\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_ActionBar\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_ActionBar_Solid\" since=\"14\"/>\n\t\t<field name=\"Widget_Holo_ActionBar_TabBar\" since=\"13\"/>\n\t\t<field name=\"Widget_Holo_ActionBar_TabText\" since=\"13\"/>\n\t\t<field name=\"Widget_Holo_ActionBar_TabView\" since=\"13\"/>\n\t\t<field name=\"Widget_Holo_ActionButton\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_ActionButton_CloseMode\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_ActionButton_Overflow\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_ActionButton_TextButton\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_ActionMode\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_AutoCompleteTextView\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Button\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Button_Borderless\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Button_Borderless_Small\" since=\"14\"/>\n\t\t<field name=\"Widget_Holo_Button_Inset\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Button_Small\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Button_Toggle\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_CalendarView\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_CheckedTextView\" since=\"17\"/>\n\t\t<field name=\"Widget_Holo_CompoundButton_CheckBox\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_CompoundButton_RadioButton\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_CompoundButton_Star\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_DatePicker\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_DropDownItem\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_DropDownItem_Spinner\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_EditText\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_ExpandableListView\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_GridView\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_HorizontalScrollView\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_ImageButton\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_ActionBar\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_ActionBar_Solid\" since=\"14\"/>\n\t\t<field name=\"Widget_Holo_Light_ActionBar_Solid_Inverse\" since=\"14\"/>\n\t\t<field name=\"Widget_Holo_Light_ActionBar_TabBar\" since=\"13\"/>\n\t\t<field name=\"Widget_Holo_Light_ActionBar_TabBar_Inverse\" since=\"14\"/>\n\t\t<field name=\"Widget_Holo_Light_ActionBar_TabText\" since=\"13\"/>\n\t\t<field name=\"Widget_Holo_Light_ActionBar_TabText_Inverse\" since=\"14\"/>\n\t\t<field name=\"Widget_Holo_Light_ActionBar_TabView\" since=\"13\"/>\n\t\t<field name=\"Widget_Holo_Light_ActionBar_TabView_Inverse\" since=\"14\"/>\n\t\t<field name=\"Widget_Holo_Light_ActionButton\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_ActionButton_CloseMode\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_ActionButton_Overflow\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_ActionMode\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_ActionMode_Inverse\" since=\"14\"/>\n\t\t<field name=\"Widget_Holo_Light_AutoCompleteTextView\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_Button\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_Button_Borderless_Small\" since=\"14\"/>\n\t\t<field name=\"Widget_Holo_Light_Button_Inset\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_Button_Small\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_Button_Toggle\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_CalendarView\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_CheckedTextView\" since=\"17\"/>\n\t\t<field name=\"Widget_Holo_Light_CompoundButton_CheckBox\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_CompoundButton_RadioButton\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_CompoundButton_Star\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_DropDownItem\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_DropDownItem_Spinner\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_EditText\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_ExpandableListView\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_GridView\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_HorizontalScrollView\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_ImageButton\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_ListPopupWindow\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_ListView\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_ListView_DropDown\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_MediaRouteButton\" since=\"16\"/>\n\t\t<field name=\"Widget_Holo_Light_PopupMenu\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_PopupWindow\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_ProgressBar\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_ProgressBar_Horizontal\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_ProgressBar_Inverse\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_ProgressBar_Large\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_ProgressBar_Large_Inverse\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_ProgressBar_Small\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_ProgressBar_Small_Inverse\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_ProgressBar_Small_Title\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_RatingBar\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_RatingBar_Indicator\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_RatingBar_Small\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_ScrollView\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_SeekBar\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_Spinner\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_Tab\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_TabWidget\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_TextView\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_TextView_SpinnerItem\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_WebTextView\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Light_WebView\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_ListPopupWindow\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_ListView\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_ListView_DropDown\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_MediaRouteButton\" since=\"16\"/>\n\t\t<field name=\"Widget_Holo_PopupMenu\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_PopupWindow\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_ProgressBar\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_ProgressBar_Horizontal\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_ProgressBar_Large\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_ProgressBar_Small\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_ProgressBar_Small_Title\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_RatingBar\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_RatingBar_Indicator\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_RatingBar_Small\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_ScrollView\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_SeekBar\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Spinner\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_Tab\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_TabWidget\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_TextView\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_TextView_SpinnerItem\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_WebTextView\" since=\"11\"/>\n\t\t<field name=\"Widget_Holo_WebView\" since=\"11\"/>\n\t\t<field name=\"Widget_ImageButton\"/>\n\t\t<field name=\"Widget_ImageWell\"/>\n\t\t<field name=\"Widget_KeyboardView\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"Widget_ListPopupWindow\" since=\"11\"/>\n\t\t<field name=\"Widget_ListView\"/>\n\t\t<field name=\"Widget_ListView_DropDown\"/>\n\t\t<field name=\"Widget_ListView_Menu\"/>\n\t\t<field name=\"Widget_ListView_White\"/>\n\t\t<field name=\"Widget_Material\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ActionBar\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ActionBar_Solid\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ActionBar_TabBar\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ActionBar_TabText\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ActionBar_TabView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ActionButton\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ActionButton_CloseMode\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ActionButton_Overflow\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ActionMode\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_AutoCompleteTextView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Button\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ButtonBar\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ButtonBar_AlertDialog\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Button_Borderless\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Button_Borderless_Colored\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Button_Borderless_Small\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Button_Colored\" since=\"23\"/>\n\t\t<field name=\"Widget_Material_Button_Inset\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Button_Small\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Button_Toggle\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_CalendarView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_CheckedTextView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_CompoundButton_CheckBox\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_CompoundButton_RadioButton\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_CompoundButton_Star\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_CompoundButton_Switch\" since=\"24\"/>\n\t\t<field name=\"Widget_Material_DatePicker\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_DropDownItem\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_DropDownItem_Spinner\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_EditText\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ExpandableListView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_FastScroll\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_GridView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_HorizontalScrollView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ImageButton\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ActionBar\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ActionBar_Solid\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ActionBar_TabBar\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ActionBar_TabText\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ActionBar_TabView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ActionButton\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ActionButton_CloseMode\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ActionButton_Overflow\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ActionMode\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_AutoCompleteTextView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_Button\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ButtonBar\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ButtonBar_AlertDialog\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_Button_Borderless\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_Button_Borderless_Colored\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_Button_Borderless_Small\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_Button_Inset\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_Button_Small\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_Button_Toggle\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_CalendarView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_CheckedTextView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_CompoundButton_CheckBox\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_CompoundButton_RadioButton\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_CompoundButton_Star\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_CompoundButton_Switch\" since=\"24\"/>\n\t\t<field name=\"Widget_Material_Light_DatePicker\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_DropDownItem\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_DropDownItem_Spinner\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_EditText\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ExpandableListView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_FastScroll\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_GridView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_HorizontalScrollView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ImageButton\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ListPopupWindow\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ListView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ListView_DropDown\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_MediaRouteButton\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_NumberPicker\" since=\"24\"/>\n\t\t<field name=\"Widget_Material_Light_PopupMenu\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_PopupMenu_Overflow\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_PopupWindow\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ProgressBar\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ProgressBar_Horizontal\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ProgressBar_Inverse\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ProgressBar_Large\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ProgressBar_Large_Inverse\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ProgressBar_Small\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ProgressBar_Small_Inverse\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ProgressBar_Small_Title\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_RatingBar\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_RatingBar_Indicator\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_RatingBar_Small\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_ScrollView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_SearchView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_SeekBar\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_SegmentedButton\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_Spinner\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_Spinner_Underlined\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_StackView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_Tab\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_TabWidget\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_TextView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_TextView_SpinnerItem\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_TimePicker\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_WebTextView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Light_WebView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ListPopupWindow\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ListView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ListView_DropDown\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_MediaRouteButton\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_NumberPicker\" since=\"24\"/>\n\t\t<field name=\"Widget_Material_PopupMenu\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_PopupMenu_Overflow\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_PopupWindow\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ProgressBar\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ProgressBar_Horizontal\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ProgressBar_Large\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ProgressBar_Small\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ProgressBar_Small_Title\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_RatingBar\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_RatingBar_Indicator\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_RatingBar_Small\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_ScrollView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_SearchView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_SeekBar\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_SeekBar_Discrete\" since=\"24\"/>\n\t\t<field name=\"Widget_Material_SegmentedButton\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Spinner\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Spinner_Underlined\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_StackView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Tab\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_TabWidget\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_TextView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_TextView_SpinnerItem\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_TimePicker\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Toolbar\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_Toolbar_Button_Navigation\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_WebTextView\" since=\"21\"/>\n\t\t<field name=\"Widget_Material_WebView\" since=\"21\"/>\n\t\t<field name=\"Widget_PopupMenu\" since=\"11\"/>\n\t\t<field name=\"Widget_PopupWindow\"/>\n\t\t<field name=\"Widget_ProgressBar\"/>\n\t\t<field name=\"Widget_ProgressBar_Horizontal\"/>\n\t\t<field name=\"Widget_ProgressBar_Inverse\" since=\"4\"/>\n\t\t<field name=\"Widget_ProgressBar_Large\"/>\n\t\t<field name=\"Widget_ProgressBar_Large_Inverse\" since=\"4\"/>\n\t\t<field name=\"Widget_ProgressBar_Small\"/>\n\t\t<field name=\"Widget_ProgressBar_Small_Inverse\" since=\"4\"/>\n\t\t<field name=\"Widget_RatingBar\"/>\n\t\t<field name=\"Widget_ScrollView\"/>\n\t\t<field name=\"Widget_SeekBar\"/>\n\t\t<field name=\"Widget_Spinner\"/>\n\t\t<field name=\"Widget_Spinner_DropDown\" since=\"11\"/>\n\t\t<field name=\"Widget_StackView\" since=\"21\"/>\n\t\t<field name=\"Widget_TabWidget\"/>\n\t\t<field name=\"Widget_TextView\"/>\n\t\t<field name=\"Widget_TextView_PopupMenu\"/>\n\t\t<field name=\"Widget_TextView_SpinnerItem\"/>\n\t\t<field name=\"Widget_Toolbar\" since=\"21\"/>\n\t\t<field name=\"Widget_Toolbar_Button_Navigation\" since=\"21\"/>\n\t\t<field name=\"Widget_WebView\"/>\n\t</class>\n\t<class name=\"android/R$transition\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"explode\"/>\n\t\t<field name=\"fade\"/>\n\t\t<field name=\"move\"/>\n\t\t<field name=\"no_transition\"/>\n\t\t<field name=\"slide_bottom\"/>\n\t\t<field name=\"slide_left\"/>\n\t\t<field name=\"slide_right\"/>\n\t\t<field name=\"slide_top\"/>\n\t</class>\n\t<class name=\"android/R$xml\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/accessibilityservice/AccessibilityButtonController\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"isAccessibilityButtonAvailable()Z\"/>\n\t\t<method name=\"registerAccessibilityButtonCallback(Landroid/accessibilityservice/AccessibilityButtonController$AccessibilityButtonCallback;)V\"/>\n\t\t<method name=\"registerAccessibilityButtonCallback(Landroid/accessibilityservice/AccessibilityButtonController$AccessibilityButtonCallback;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"unregisterAccessibilityButtonCallback(Landroid/accessibilityservice/AccessibilityButtonController$AccessibilityButtonCallback;)V\"/>\n\t</class>\n\t<class name=\"android/accessibilityservice/AccessibilityButtonController$AccessibilityButtonCallback\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onAvailabilityChanged(Landroid/accessibilityservice/AccessibilityButtonController;Z)V\"/>\n\t\t<method name=\"onClicked(Landroid/accessibilityservice/AccessibilityButtonController;)V\"/>\n\t</class>\n\t<class name=\"android/accessibilityservice/AccessibilityService\" since=\"4\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"disableSelf()V\" since=\"24\"/>\n\t\t<method name=\"dispatchGesture(Landroid/accessibilityservice/GestureDescription;Landroid/accessibilityservice/AccessibilityService$GestureResultCallback;Landroid/os/Handler;)Z\" since=\"24\"/>\n\t\t<method name=\"findFocus(I)Landroid/view/accessibility/AccessibilityNodeInfo;\" since=\"21\"/>\n\t\t<method name=\"getAccessibilityButtonController()Landroid/accessibilityservice/AccessibilityButtonController;\" since=\"26\"/>\n\t\t<method name=\"getFingerprintGestureController()Landroid/accessibilityservice/FingerprintGestureController;\" since=\"26\"/>\n\t\t<method name=\"getMagnificationController()Landroid/accessibilityservice/AccessibilityService$MagnificationController;\" since=\"24\"/>\n\t\t<method name=\"getRootInActiveWindow()Landroid/view/accessibility/AccessibilityNodeInfo;\" since=\"16\"/>\n\t\t<method name=\"getServiceInfo()Landroid/accessibilityservice/AccessibilityServiceInfo;\" since=\"16\"/>\n\t\t<method name=\"getSoftKeyboardController()Landroid/accessibilityservice/AccessibilityService$SoftKeyboardController;\" since=\"24\"/>\n\t\t<method name=\"getWindows()Ljava/util/List;\" since=\"21\"/>\n\t\t<method name=\"onAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V\"/>\n\t\t<method name=\"onGesture(I)Z\" since=\"16\"/>\n\t\t<method name=\"onInterrupt()V\"/>\n\t\t<method name=\"onKeyEvent(Landroid/view/KeyEvent;)Z\" since=\"18\"/>\n\t\t<method name=\"onServiceConnected()V\"/>\n\t\t<method name=\"performGlobalAction(I)Z\" since=\"16\"/>\n\t\t<method name=\"setServiceInfo(Landroid/accessibilityservice/AccessibilityServiceInfo;)V\"/>\n\t\t<field name=\"GESTURE_SWIPE_DOWN\" since=\"16\"/>\n\t\t<field name=\"GESTURE_SWIPE_DOWN_AND_LEFT\" since=\"16\"/>\n\t\t<field name=\"GESTURE_SWIPE_DOWN_AND_RIGHT\" since=\"16\"/>\n\t\t<field name=\"GESTURE_SWIPE_DOWN_AND_UP\" since=\"16\"/>\n\t\t<field name=\"GESTURE_SWIPE_LEFT\" since=\"16\"/>\n\t\t<field name=\"GESTURE_SWIPE_LEFT_AND_DOWN\" since=\"16\"/>\n\t\t<field name=\"GESTURE_SWIPE_LEFT_AND_RIGHT\" since=\"16\"/>\n\t\t<field name=\"GESTURE_SWIPE_LEFT_AND_UP\" since=\"16\"/>\n\t\t<field name=\"GESTURE_SWIPE_RIGHT\" since=\"16\"/>\n\t\t<field name=\"GESTURE_SWIPE_RIGHT_AND_DOWN\" since=\"16\"/>\n\t\t<field name=\"GESTURE_SWIPE_RIGHT_AND_LEFT\" since=\"16\"/>\n\t\t<field name=\"GESTURE_SWIPE_RIGHT_AND_UP\" since=\"16\"/>\n\t\t<field name=\"GESTURE_SWIPE_UP\" since=\"16\"/>\n\t\t<field name=\"GESTURE_SWIPE_UP_AND_DOWN\" since=\"16\"/>\n\t\t<field name=\"GESTURE_SWIPE_UP_AND_LEFT\" since=\"16\"/>\n\t\t<field name=\"GESTURE_SWIPE_UP_AND_RIGHT\" since=\"16\"/>\n\t\t<field name=\"GLOBAL_ACTION_BACK\" since=\"16\"/>\n\t\t<field name=\"GLOBAL_ACTION_HOME\" since=\"16\"/>\n\t\t<field name=\"GLOBAL_ACTION_LOCK_SCREEN\" since=\"28\"/>\n\t\t<field name=\"GLOBAL_ACTION_NOTIFICATIONS\" since=\"16\"/>\n\t\t<field name=\"GLOBAL_ACTION_POWER_DIALOG\" since=\"21\"/>\n\t\t<field name=\"GLOBAL_ACTION_QUICK_SETTINGS\" since=\"17\"/>\n\t\t<field name=\"GLOBAL_ACTION_RECENTS\" since=\"16\"/>\n\t\t<field name=\"GLOBAL_ACTION_TAKE_SCREENSHOT\" since=\"28\"/>\n\t\t<field name=\"GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN\" since=\"24\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t\t<field name=\"SERVICE_META_DATA\" since=\"14\"/>\n\t\t<field name=\"SHOW_MODE_AUTO\" since=\"24\"/>\n\t\t<field name=\"SHOW_MODE_HIDDEN\" since=\"24\"/>\n\t\t<field name=\"SHOW_MODE_IGNORE_HARD_KEYBOARD\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/accessibilityservice/AccessibilityService$GestureResultCallback\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCancelled(Landroid/accessibilityservice/GestureDescription;)V\"/>\n\t\t<method name=\"onCompleted(Landroid/accessibilityservice/GestureDescription;)V\"/>\n\t</class>\n\t<class name=\"android/accessibilityservice/AccessibilityService$MagnificationController\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addListener(Landroid/accessibilityservice/AccessibilityService$MagnificationController$OnMagnificationChangedListener;)V\"/>\n\t\t<method name=\"addListener(Landroid/accessibilityservice/AccessibilityService$MagnificationController$OnMagnificationChangedListener;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"getCenterX()F\"/>\n\t\t<method name=\"getCenterY()F\"/>\n\t\t<method name=\"getMagnificationRegion()Landroid/graphics/Region;\"/>\n\t\t<method name=\"getScale()F\"/>\n\t\t<method name=\"removeListener(Landroid/accessibilityservice/AccessibilityService$MagnificationController$OnMagnificationChangedListener;)Z\"/>\n\t\t<method name=\"reset(Z)Z\"/>\n\t\t<method name=\"setCenter(FFZ)Z\"/>\n\t\t<method name=\"setScale(FZ)Z\"/>\n\t</class>\n\t<class name=\"android/accessibilityservice/AccessibilityService$MagnificationController$OnMagnificationChangedListener\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onMagnificationChanged(Landroid/accessibilityservice/AccessibilityService$MagnificationController;Landroid/graphics/Region;FFF)V\"/>\n\t</class>\n\t<class name=\"android/accessibilityservice/AccessibilityService$SoftKeyboardController\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addOnShowModeChangedListener(Landroid/accessibilityservice/AccessibilityService$SoftKeyboardController$OnShowModeChangedListener;)V\"/>\n\t\t<method name=\"addOnShowModeChangedListener(Landroid/accessibilityservice/AccessibilityService$SoftKeyboardController$OnShowModeChangedListener;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"getShowMode()I\"/>\n\t\t<method name=\"removeOnShowModeChangedListener(Landroid/accessibilityservice/AccessibilityService$SoftKeyboardController$OnShowModeChangedListener;)Z\"/>\n\t\t<method name=\"setShowMode(I)Z\"/>\n\t</class>\n\t<class name=\"android/accessibilityservice/AccessibilityService$SoftKeyboardController$OnShowModeChangedListener\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onShowModeChanged(Landroid/accessibilityservice/AccessibilityService$SoftKeyboardController;I)V\"/>\n\t</class>\n\t<class name=\"android/accessibilityservice/AccessibilityServiceInfo\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"capabilityToString(I)Ljava/lang/String;\" since=\"18\"/>\n\t\t<method name=\"feedbackTypeToString(I)Ljava/lang/String;\" since=\"14\"/>\n\t\t<method name=\"flagToString(I)Ljava/lang/String;\" since=\"14\"/>\n\t\t<method name=\"getCanRetrieveWindowContent()Z\" since=\"14\" deprecated=\"18\"/>\n\t\t<method name=\"getCapabilities()I\" since=\"18\"/>\n\t\t<method name=\"getDescription()Ljava/lang/String;\" since=\"14\" deprecated=\"16\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\" since=\"14\"/>\n\t\t<method name=\"getInteractiveUiTimeoutMillis()I\" since=\"29\"/>\n\t\t<method name=\"getNonInteractiveUiTimeoutMillis()I\" since=\"29\"/>\n\t\t<method name=\"getResolveInfo()Landroid/content/pm/ResolveInfo;\" since=\"14\"/>\n\t\t<method name=\"getSettingsActivityName()Ljava/lang/String;\" since=\"14\"/>\n\t\t<method name=\"loadDescription(Landroid/content/pm/PackageManager;)Ljava/lang/String;\" since=\"16\"/>\n\t\t<method name=\"loadSummary(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;\" since=\"26\"/>\n\t\t<method name=\"setInteractiveUiTimeoutMillis(I)V\" since=\"29\"/>\n\t\t<method name=\"setNonInteractiveUiTimeoutMillis(I)V\" since=\"29\"/>\n\t\t<field name=\"CAPABILITY_CAN_CONTROL_MAGNIFICATION\" since=\"24\"/>\n\t\t<field name=\"CAPABILITY_CAN_PERFORM_GESTURES\" since=\"24\"/>\n\t\t<field name=\"CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY\" since=\"18\" deprecated=\"26\"/>\n\t\t<field name=\"CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS\" since=\"18\"/>\n\t\t<field name=\"CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES\" since=\"26\"/>\n\t\t<field name=\"CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION\" since=\"18\"/>\n\t\t<field name=\"CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT\" since=\"18\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t\t<field name=\"FEEDBACK_ALL_MASK\" since=\"14\"/>\n\t\t<field name=\"FEEDBACK_AUDIBLE\"/>\n\t\t<field name=\"FEEDBACK_BRAILLE\" since=\"17\"/>\n\t\t<field name=\"FEEDBACK_GENERIC\"/>\n\t\t<field name=\"FEEDBACK_HAPTIC\"/>\n\t\t<field name=\"FEEDBACK_SPOKEN\"/>\n\t\t<field name=\"FEEDBACK_VISUAL\"/>\n\t\t<field name=\"FLAG_ENABLE_ACCESSIBILITY_VOLUME\" since=\"26\"/>\n\t\t<field name=\"FLAG_INCLUDE_NOT_IMPORTANT_VIEWS\" since=\"16\"/>\n\t\t<field name=\"FLAG_REPORT_VIEW_IDS\" since=\"18\"/>\n\t\t<field name=\"FLAG_REQUEST_ACCESSIBILITY_BUTTON\" since=\"26\"/>\n\t\t<field name=\"FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY\" since=\"18\" deprecated=\"26\"/>\n\t\t<field name=\"FLAG_REQUEST_FILTER_KEY_EVENTS\" since=\"18\"/>\n\t\t<field name=\"FLAG_REQUEST_FINGERPRINT_GESTURES\" since=\"26\"/>\n\t\t<field name=\"FLAG_REQUEST_SHORTCUT_WARNING_DIALOG_SPOKEN_FEEDBACK\" since=\"29\"/>\n\t\t<field name=\"FLAG_REQUEST_TOUCH_EXPLORATION_MODE\" since=\"16\"/>\n\t\t<field name=\"FLAG_RETRIEVE_INTERACTIVE_WINDOWS\" since=\"21\"/>\n\t\t<field name=\"eventTypes\"/>\n\t\t<field name=\"feedbackType\"/>\n\t\t<field name=\"flags\"/>\n\t\t<field name=\"notificationTimeout\"/>\n\t\t<field name=\"packageNames\"/>\n\t</class>\n\t<class name=\"android/accessibilityservice/FingerprintGestureController\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"isGestureDetectionAvailable()Z\"/>\n\t\t<method name=\"registerFingerprintGestureCallback(Landroid/accessibilityservice/FingerprintGestureController$FingerprintGestureCallback;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"unregisterFingerprintGestureCallback(Landroid/accessibilityservice/FingerprintGestureController$FingerprintGestureCallback;)V\"/>\n\t\t<field name=\"FINGERPRINT_GESTURE_SWIPE_DOWN\"/>\n\t\t<field name=\"FINGERPRINT_GESTURE_SWIPE_LEFT\"/>\n\t\t<field name=\"FINGERPRINT_GESTURE_SWIPE_RIGHT\"/>\n\t\t<field name=\"FINGERPRINT_GESTURE_SWIPE_UP\"/>\n\t</class>\n\t<class name=\"android/accessibilityservice/FingerprintGestureController$FingerprintGestureCallback\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onGestureDetected(I)V\"/>\n\t\t<method name=\"onGestureDetectionAvailabilityChanged(Z)V\"/>\n\t</class>\n\t<class name=\"android/accessibilityservice/GestureDescription\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getMaxGestureDuration()J\"/>\n\t\t<method name=\"getMaxStrokeCount()I\"/>\n\t\t<method name=\"getStroke(I)Landroid/accessibilityservice/GestureDescription$StrokeDescription;\"/>\n\t\t<method name=\"getStrokeCount()I\"/>\n\t</class>\n\t<class name=\"android/accessibilityservice/GestureDescription$Builder\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addStroke(Landroid/accessibilityservice/GestureDescription$StrokeDescription;)Landroid/accessibilityservice/GestureDescription$Builder;\"/>\n\t\t<method name=\"build()Landroid/accessibilityservice/GestureDescription;\"/>\n\t</class>\n\t<class name=\"android/accessibilityservice/GestureDescription$StrokeDescription\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Path;JJ)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Path;JJZ)V\" since=\"26\"/>\n\t\t<method name=\"continueStroke(Landroid/graphics/Path;JJZ)Landroid/accessibilityservice/GestureDescription$StrokeDescription;\" since=\"26\"/>\n\t\t<method name=\"getDuration()J\"/>\n\t\t<method name=\"getPath()Landroid/graphics/Path;\"/>\n\t\t<method name=\"getStartTime()J\"/>\n\t\t<method name=\"willContinue()Z\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/accounts/AbstractAccountAuthenticator\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"addAccount(Landroid/accounts/AccountAuthenticatorResponse;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;\"/>\n\t\t<method name=\"addAccountFromCredentials(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;Landroid/os/Bundle;)Landroid/os/Bundle;\" since=\"18\"/>\n\t\t<method name=\"confirmCredentials(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;Landroid/os/Bundle;)Landroid/os/Bundle;\"/>\n\t\t<method name=\"editProperties(Landroid/accounts/AccountAuthenticatorResponse;Ljava/lang/String;)Landroid/os/Bundle;\"/>\n\t\t<method name=\"finishSession(Landroid/accounts/AccountAuthenticatorResponse;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;\" since=\"26\"/>\n\t\t<method name=\"getAccountCredentialsForCloning(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;)Landroid/os/Bundle;\" since=\"18\"/>\n\t\t<method name=\"getAccountRemovalAllowed(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;)Landroid/os/Bundle;\"/>\n\t\t<method name=\"getAuthToken(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;\"/>\n\t\t<method name=\"getAuthTokenLabel(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getIBinder()Landroid/os/IBinder;\"/>\n\t\t<method name=\"hasFeatures(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;[Ljava/lang/String;)Landroid/os/Bundle;\"/>\n\t\t<method name=\"isCredentialsUpdateSuggested(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;Ljava/lang/String;)Landroid/os/Bundle;\" since=\"26\"/>\n\t\t<method name=\"startAddAccountSession(Landroid/accounts/AccountAuthenticatorResponse;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;\" since=\"26\"/>\n\t\t<method name=\"startUpdateCredentialsSession(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;\" since=\"26\"/>\n\t\t<method name=\"updateCredentials(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;\"/>\n\t\t<field name=\"KEY_CUSTOM_TOKEN_EXPIRY\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/accounts/Account\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"name\"/>\n\t\t<field name=\"type\"/>\n\t</class>\n\t<class name=\"android/accounts/AccountAuthenticatorActivity\" since=\"5\" deprecated=\"30\">\n\t\t<extends name=\"android/app/Activity\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"setAccountAuthenticatorResult(Landroid/os/Bundle;)V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/accounts/AccountAuthenticatorResponse\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"onError(ILjava/lang/String;)V\"/>\n\t\t<method name=\"onRequestContinued()V\"/>\n\t\t<method name=\"onResult(Landroid/os/Bundle;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/accounts/AccountManager\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addAccount(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;\"/>\n\t\t<method name=\"addAccountExplicitly(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)Z\"/>\n\t\t<method name=\"addAccountExplicitly(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;Ljava/util/Map;)Z\" since=\"26\"/>\n\t\t<method name=\"addOnAccountsUpdatedListener(Landroid/accounts/OnAccountsUpdateListener;Landroid/os/Handler;Z)V\"/>\n\t\t<method name=\"addOnAccountsUpdatedListener(Landroid/accounts/OnAccountsUpdateListener;Landroid/os/Handler;Z[Ljava/lang/String;)V\" since=\"26\"/>\n\t\t<method name=\"blockingGetAuthToken(Landroid/accounts/Account;Ljava/lang/String;Z)Ljava/lang/String;\"/>\n\t\t<method name=\"clearPassword(Landroid/accounts/Account;)V\"/>\n\t\t<method name=\"confirmCredentials(Landroid/accounts/Account;Landroid/os/Bundle;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;\"/>\n\t\t<method name=\"editProperties(Ljava/lang/String;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;\"/>\n\t\t<method name=\"finishSession(Landroid/os/Bundle;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;\" since=\"26\"/>\n\t\t<method name=\"get(Landroid/content/Context;)Landroid/accounts/AccountManager;\"/>\n\t\t<method name=\"getAccountVisibility(Landroid/accounts/Account;Ljava/lang/String;)I\" since=\"26\"/>\n\t\t<method name=\"getAccounts()[Landroid/accounts/Account;\"/>\n\t\t<method name=\"getAccountsAndVisibilityForPackage(Ljava/lang/String;Ljava/lang/String;)Ljava/util/Map;\" since=\"26\"/>\n\t\t<method name=\"getAccountsByType(Ljava/lang/String;)[Landroid/accounts/Account;\"/>\n\t\t<method name=\"getAccountsByTypeAndFeatures(Ljava/lang/String;[Ljava/lang/String;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;\"/>\n\t\t<method name=\"getAccountsByTypeForPackage(Ljava/lang/String;Ljava/lang/String;)[Landroid/accounts/Account;\" since=\"18\"/>\n\t\t<method name=\"getAuthToken(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;\"/>\n\t\t<method name=\"getAuthToken(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;ZLandroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;\" since=\"14\"/>\n\t\t<method name=\"getAuthToken(Landroid/accounts/Account;Ljava/lang/String;ZLandroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;\" deprecated=\"15\"/>\n\t\t<method name=\"getAuthTokenByFeatures(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/app/Activity;Landroid/os/Bundle;Landroid/os/Bundle;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;\"/>\n\t\t<method name=\"getAuthenticatorTypes()[Landroid/accounts/AuthenticatorDescription;\"/>\n\t\t<method name=\"getPackagesAndVisibilityForAccount(Landroid/accounts/Account;)Ljava/util/Map;\" since=\"26\"/>\n\t\t<method name=\"getPassword(Landroid/accounts/Account;)Ljava/lang/String;\"/>\n\t\t<method name=\"getPreviousName(Landroid/accounts/Account;)Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"getUserData(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"hasFeatures(Landroid/accounts/Account;[Ljava/lang/String;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;\" since=\"8\"/>\n\t\t<method name=\"invalidateAuthToken(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"isCredentialsUpdateSuggested(Landroid/accounts/Account;Ljava/lang/String;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;\" since=\"26\"/>\n\t\t<method name=\"newChooseAccountIntent(Landroid/accounts/Account;Ljava/util/ArrayList;[Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/Intent;\" since=\"14\" deprecated=\"23\"/>\n\t\t<method name=\"newChooseAccountIntent(Landroid/accounts/Account;Ljava/util/List;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/Intent;\" since=\"23\"/>\n\t\t<method name=\"notifyAccountAuthenticated(Landroid/accounts/Account;)Z\" since=\"23\"/>\n\t\t<method name=\"peekAuthToken(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"removeAccount(Landroid/accounts/Account;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;\" deprecated=\"22\"/>\n\t\t<method name=\"removeAccount(Landroid/accounts/Account;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;\" since=\"22\"/>\n\t\t<method name=\"removeAccountExplicitly(Landroid/accounts/Account;)Z\" since=\"22\"/>\n\t\t<method name=\"removeOnAccountsUpdatedListener(Landroid/accounts/OnAccountsUpdateListener;)V\"/>\n\t\t<method name=\"renameAccount(Landroid/accounts/Account;Ljava/lang/String;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;\" since=\"21\"/>\n\t\t<method name=\"setAccountVisibility(Landroid/accounts/Account;Ljava/lang/String;I)Z\" since=\"26\"/>\n\t\t<method name=\"setAuthToken(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setPassword(Landroid/accounts/Account;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setUserData(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"startAddAccountSession(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;\" since=\"26\"/>\n\t\t<method name=\"startUpdateCredentialsSession(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;\" since=\"26\"/>\n\t\t<method name=\"updateCredentials(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;\"/>\n\t\t<field name=\"ACTION_ACCOUNT_REMOVED\" since=\"26\"/>\n\t\t<field name=\"ACTION_AUTHENTICATOR_INTENT\"/>\n\t\t<field name=\"AUTHENTICATOR_ATTRIBUTES_NAME\"/>\n\t\t<field name=\"AUTHENTICATOR_META_DATA_NAME\"/>\n\t\t<field name=\"ERROR_CODE_BAD_ARGUMENTS\"/>\n\t\t<field name=\"ERROR_CODE_BAD_AUTHENTICATION\" since=\"18\"/>\n\t\t<field name=\"ERROR_CODE_BAD_REQUEST\"/>\n\t\t<field name=\"ERROR_CODE_CANCELED\"/>\n\t\t<field name=\"ERROR_CODE_INVALID_RESPONSE\"/>\n\t\t<field name=\"ERROR_CODE_NETWORK_ERROR\"/>\n\t\t<field name=\"ERROR_CODE_REMOTE_EXCEPTION\"/>\n\t\t<field name=\"ERROR_CODE_UNSUPPORTED_OPERATION\"/>\n\t\t<field name=\"KEY_ACCOUNTS\"/>\n\t\t<field name=\"KEY_ACCOUNT_AUTHENTICATOR_RESPONSE\"/>\n\t\t<field name=\"KEY_ACCOUNT_MANAGER_RESPONSE\"/>\n\t\t<field name=\"KEY_ACCOUNT_NAME\"/>\n\t\t<field name=\"KEY_ACCOUNT_SESSION_BUNDLE\" since=\"26\"/>\n\t\t<field name=\"KEY_ACCOUNT_STATUS_TOKEN\" since=\"26\"/>\n\t\t<field name=\"KEY_ACCOUNT_TYPE\"/>\n\t\t<field name=\"KEY_ANDROID_PACKAGE_NAME\" since=\"14\"/>\n\t\t<field name=\"KEY_AUTHENTICATOR_TYPES\"/>\n\t\t<field name=\"KEY_AUTHTOKEN\"/>\n\t\t<field name=\"KEY_AUTH_FAILED_MESSAGE\"/>\n\t\t<field name=\"KEY_AUTH_TOKEN_LABEL\"/>\n\t\t<field name=\"KEY_BOOLEAN_RESULT\"/>\n\t\t<field name=\"KEY_CALLER_PID\" since=\"11\"/>\n\t\t<field name=\"KEY_CALLER_UID\" since=\"11\"/>\n\t\t<field name=\"KEY_ERROR_CODE\"/>\n\t\t<field name=\"KEY_ERROR_MESSAGE\"/>\n\t\t<field name=\"KEY_INTENT\"/>\n\t\t<field name=\"KEY_LAST_AUTHENTICATED_TIME\" since=\"23\"/>\n\t\t<field name=\"KEY_PASSWORD\"/>\n\t\t<field name=\"KEY_USERDATA\"/>\n\t\t<field name=\"LOGIN_ACCOUNTS_CHANGED_ACTION\" deprecated=\"26\"/>\n\t\t<field name=\"PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE\" since=\"26\"/>\n\t\t<field name=\"PACKAGE_NAME_KEY_LEGACY_VISIBLE\" since=\"26\"/>\n\t\t<field name=\"VISIBILITY_NOT_VISIBLE\" since=\"26\"/>\n\t\t<field name=\"VISIBILITY_UNDEFINED\" since=\"26\"/>\n\t\t<field name=\"VISIBILITY_USER_MANAGED_NOT_VISIBLE\" since=\"26\"/>\n\t\t<field name=\"VISIBILITY_USER_MANAGED_VISIBLE\" since=\"26\"/>\n\t\t<field name=\"VISIBILITY_VISIBLE\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/accounts/AccountManagerCallback\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"run(Landroid/accounts/AccountManagerFuture;)V\"/>\n\t</class>\n\t<class name=\"android/accounts/AccountManagerFuture\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"cancel(Z)Z\"/>\n\t\t<method name=\"getResult()Ljava/lang/Object;\"/>\n\t\t<method name=\"getResult(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;\"/>\n\t\t<method name=\"isCancelled()Z\"/>\n\t\t<method name=\"isDone()Z\"/>\n\t</class>\n\t<class name=\"android/accounts/AccountsException\" since=\"5\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/accounts/AuthenticatorDescription\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;IIII)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;IIIIZ)V\" since=\"11\"/>\n\t\t<method name=\"newKey(Ljava/lang/String;)Landroid/accounts/AuthenticatorDescription;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"accountPreferencesId\"/>\n\t\t<field name=\"customTokens\" since=\"11\"/>\n\t\t<field name=\"iconId\"/>\n\t\t<field name=\"labelId\"/>\n\t\t<field name=\"packageName\"/>\n\t\t<field name=\"smallIconId\"/>\n\t\t<field name=\"type\"/>\n\t</class>\n\t<class name=\"android/accounts/AuthenticatorException\" since=\"5\">\n\t\t<extends name=\"android/accounts/AccountsException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/accounts/NetworkErrorException\" since=\"5\">\n\t\t<extends name=\"android/accounts/AccountsException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/accounts/OnAccountsUpdateListener\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onAccountsUpdated([Landroid/accounts/Account;)V\"/>\n\t</class>\n\t<class name=\"android/accounts/OperationCanceledException\" since=\"5\">\n\t\t<extends name=\"android/accounts/AccountsException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/animation/Animator\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addListener(Landroid/animation/Animator$AnimatorListener;)V\"/>\n\t\t<method name=\"addPauseListener(Landroid/animation/Animator$AnimatorPauseListener;)V\" since=\"19\"/>\n\t\t<method name=\"cancel()V\"/>\n\t\t<method name=\"clone()Landroid/animation/Animator;\"/>\n\t\t<method name=\"end()V\"/>\n\t\t<method name=\"getDuration()J\"/>\n\t\t<method name=\"getInterpolator()Landroid/animation/TimeInterpolator;\" since=\"18\"/>\n\t\t<method name=\"getListeners()Ljava/util/ArrayList;\"/>\n\t\t<method name=\"getStartDelay()J\"/>\n\t\t<method name=\"getTotalDuration()J\" since=\"24\"/>\n\t\t<method name=\"isPaused()Z\" since=\"19\"/>\n\t\t<method name=\"isRunning()Z\"/>\n\t\t<method name=\"isStarted()Z\" since=\"14\"/>\n\t\t<method name=\"pause()V\" since=\"19\"/>\n\t\t<method name=\"removeAllListeners()V\"/>\n\t\t<method name=\"removeListener(Landroid/animation/Animator$AnimatorListener;)V\"/>\n\t\t<method name=\"removePauseListener(Landroid/animation/Animator$AnimatorPauseListener;)V\" since=\"19\"/>\n\t\t<method name=\"resume()V\" since=\"19\"/>\n\t\t<method name=\"setDuration(J)Landroid/animation/Animator;\"/>\n\t\t<method name=\"setInterpolator(Landroid/animation/TimeInterpolator;)V\"/>\n\t\t<method name=\"setStartDelay(J)V\"/>\n\t\t<method name=\"setTarget(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"setupEndValues()V\"/>\n\t\t<method name=\"setupStartValues()V\"/>\n\t\t<method name=\"start()V\"/>\n\t\t<field name=\"DURATION_INFINITE\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/animation/Animator$AnimatorListener\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onAnimationCancel(Landroid/animation/Animator;)V\"/>\n\t\t<method name=\"onAnimationEnd(Landroid/animation/Animator;)V\"/>\n\t\t<method name=\"onAnimationEnd(Landroid/animation/Animator;Z)V\" since=\"26\"/>\n\t\t<method name=\"onAnimationRepeat(Landroid/animation/Animator;)V\"/>\n\t\t<method name=\"onAnimationStart(Landroid/animation/Animator;)V\"/>\n\t\t<method name=\"onAnimationStart(Landroid/animation/Animator;Z)V\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/animation/Animator$AnimatorPauseListener\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onAnimationPause(Landroid/animation/Animator;)V\"/>\n\t\t<method name=\"onAnimationResume(Landroid/animation/Animator;)V\"/>\n\t</class>\n\t<class name=\"android/animation/AnimatorInflater\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"loadAnimator(Landroid/content/Context;I)Landroid/animation/Animator;\"/>\n\t\t<method name=\"loadStateListAnimator(Landroid/content/Context;I)Landroid/animation/StateListAnimator;\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/animation/AnimatorListenerAdapter\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/animation/Animator$AnimatorListener\"/>\n\t\t<implements name=\"android/animation/Animator$AnimatorPauseListener\" since=\"19\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/animation/AnimatorSet\" since=\"11\">\n\t\t<extends name=\"android/animation/Animator\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"clone()Landroid/animation/AnimatorSet;\"/>\n\t\t<method name=\"getChildAnimations()Ljava/util/ArrayList;\"/>\n\t\t<method name=\"getCurrentPlayTime()J\" since=\"26\"/>\n\t\t<method name=\"play(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder;\"/>\n\t\t<method name=\"playSequentially(Ljava/util/List;)V\"/>\n\t\t<method name=\"playSequentially([Landroid/animation/Animator;)V\"/>\n\t\t<method name=\"playTogether(Ljava/util/Collection;)V\"/>\n\t\t<method name=\"playTogether([Landroid/animation/Animator;)V\"/>\n\t\t<method name=\"reverse()V\" since=\"26\"/>\n\t\t<method name=\"setCurrentPlayTime(J)V\" since=\"26\"/>\n\t\t<method name=\"setDuration(J)Landroid/animation/AnimatorSet;\"/>\n\t</class>\n\t<class name=\"android/animation/AnimatorSet$Builder\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"after(J)Landroid/animation/AnimatorSet$Builder;\"/>\n\t\t<method name=\"after(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder;\"/>\n\t\t<method name=\"before(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder;\"/>\n\t\t<method name=\"with(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder;\"/>\n\t</class>\n\t<class name=\"android/animation/ArgbEvaluator\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/animation/TypeEvaluator\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/animation/BidirectionalTypeConverter\" since=\"21\">\n\t\t<extends name=\"android/animation/TypeConverter\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Class;Ljava/lang/Class;)V\"/>\n\t\t<method name=\"convertBack(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"invert()Landroid/animation/BidirectionalTypeConverter;\"/>\n\t</class>\n\t<class name=\"android/animation/FloatArrayEvaluator\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/animation/TypeEvaluator\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>([F)V\"/>\n\t\t<method name=\"evaluate(F[F[F)[F\"/>\n\t</class>\n\t<class name=\"android/animation/FloatEvaluator\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/animation/TypeEvaluator\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"evaluate(FLjava/lang/Number;Ljava/lang/Number;)Ljava/lang/Float;\" since=\"14\"/>\n\t</class>\n\t<class name=\"android/animation/IntArrayEvaluator\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/animation/TypeEvaluator\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>([I)V\"/>\n\t\t<method name=\"evaluate(F[I[I)[I\"/>\n\t</class>\n\t<class name=\"android/animation/IntEvaluator\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/animation/TypeEvaluator\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"evaluate(FLjava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer;\" since=\"14\"/>\n\t</class>\n\t<class name=\"android/animation/Keyframe\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"clone()Landroid/animation/Keyframe;\"/>\n\t\t<method name=\"getFraction()F\"/>\n\t\t<method name=\"getInterpolator()Landroid/animation/TimeInterpolator;\"/>\n\t\t<method name=\"getType()Ljava/lang/Class;\"/>\n\t\t<method name=\"getValue()Ljava/lang/Object;\"/>\n\t\t<method name=\"hasValue()Z\"/>\n\t\t<method name=\"ofFloat(F)Landroid/animation/Keyframe;\"/>\n\t\t<method name=\"ofFloat(FF)Landroid/animation/Keyframe;\"/>\n\t\t<method name=\"ofInt(F)Landroid/animation/Keyframe;\"/>\n\t\t<method name=\"ofInt(FI)Landroid/animation/Keyframe;\"/>\n\t\t<method name=\"ofObject(F)Landroid/animation/Keyframe;\"/>\n\t\t<method name=\"ofObject(FLjava/lang/Object;)Landroid/animation/Keyframe;\"/>\n\t\t<method name=\"setFraction(F)V\"/>\n\t\t<method name=\"setInterpolator(Landroid/animation/TimeInterpolator;)V\"/>\n\t\t<method name=\"setValue(Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"android/animation/LayoutTransition\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addChild(Landroid/view/ViewGroup;Landroid/view/View;)V\"/>\n\t\t<method name=\"addTransitionListener(Landroid/animation/LayoutTransition$TransitionListener;)V\"/>\n\t\t<method name=\"disableTransitionType(I)V\" since=\"16\"/>\n\t\t<method name=\"enableTransitionType(I)V\" since=\"16\"/>\n\t\t<method name=\"getAnimator(I)Landroid/animation/Animator;\"/>\n\t\t<method name=\"getDuration(I)J\"/>\n\t\t<method name=\"getInterpolator(I)Landroid/animation/TimeInterpolator;\"/>\n\t\t<method name=\"getStagger(I)J\"/>\n\t\t<method name=\"getStartDelay(I)J\"/>\n\t\t<method name=\"getTransitionListeners()Ljava/util/List;\"/>\n\t\t<method name=\"hideChild(Landroid/view/ViewGroup;Landroid/view/View;)V\" deprecated=\"16\"/>\n\t\t<method name=\"hideChild(Landroid/view/ViewGroup;Landroid/view/View;I)V\" since=\"16\"/>\n\t\t<method name=\"isChangingLayout()Z\"/>\n\t\t<method name=\"isRunning()Z\"/>\n\t\t<method name=\"isTransitionTypeEnabled(I)Z\" since=\"16\"/>\n\t\t<method name=\"removeChild(Landroid/view/ViewGroup;Landroid/view/View;)V\"/>\n\t\t<method name=\"removeTransitionListener(Landroid/animation/LayoutTransition$TransitionListener;)V\"/>\n\t\t<method name=\"setAnimateParentHierarchy(Z)V\" since=\"14\"/>\n\t\t<method name=\"setAnimator(ILandroid/animation/Animator;)V\"/>\n\t\t<method name=\"setDuration(IJ)V\"/>\n\t\t<method name=\"setDuration(J)V\"/>\n\t\t<method name=\"setInterpolator(ILandroid/animation/TimeInterpolator;)V\"/>\n\t\t<method name=\"setStagger(IJ)V\"/>\n\t\t<method name=\"setStartDelay(IJ)V\"/>\n\t\t<method name=\"showChild(Landroid/view/ViewGroup;Landroid/view/View;)V\" deprecated=\"16\"/>\n\t\t<method name=\"showChild(Landroid/view/ViewGroup;Landroid/view/View;I)V\" since=\"16\"/>\n\t\t<field name=\"APPEARING\"/>\n\t\t<field name=\"CHANGE_APPEARING\"/>\n\t\t<field name=\"CHANGE_DISAPPEARING\"/>\n\t\t<field name=\"CHANGING\" since=\"16\"/>\n\t\t<field name=\"DISAPPEARING\"/>\n\t</class>\n\t<class name=\"android/animation/LayoutTransition$TransitionListener\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"endTransition(Landroid/animation/LayoutTransition;Landroid/view/ViewGroup;Landroid/view/View;I)V\"/>\n\t\t<method name=\"startTransition(Landroid/animation/LayoutTransition;Landroid/view/ViewGroup;Landroid/view/View;I)V\"/>\n\t</class>\n\t<class name=\"android/animation/ObjectAnimator\" since=\"11\">\n\t\t<extends name=\"android/animation/ValueAnimator\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"clone()Landroid/animation/ObjectAnimator;\"/>\n\t\t<method name=\"getPropertyName()Ljava/lang/String;\"/>\n\t\t<method name=\"getTarget()Ljava/lang/Object;\"/>\n\t\t<method name=\"ofArgb(Ljava/lang/Object;Landroid/util/Property;[I)Landroid/animation/ObjectAnimator;\" since=\"21\"/>\n\t\t<method name=\"ofArgb(Ljava/lang/Object;Ljava/lang/String;[I)Landroid/animation/ObjectAnimator;\" since=\"21\"/>\n\t\t<method name=\"ofFloat(Ljava/lang/Object;Landroid/util/Property;Landroid/util/Property;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;\" since=\"21\"/>\n\t\t<method name=\"ofFloat(Ljava/lang/Object;Landroid/util/Property;[F)Landroid/animation/ObjectAnimator;\" since=\"14\"/>\n\t\t<method name=\"ofFloat(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;\" since=\"21\"/>\n\t\t<method name=\"ofFloat(Ljava/lang/Object;Ljava/lang/String;[F)Landroid/animation/ObjectAnimator;\"/>\n\t\t<method name=\"ofInt(Ljava/lang/Object;Landroid/util/Property;Landroid/util/Property;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;\" since=\"21\"/>\n\t\t<method name=\"ofInt(Ljava/lang/Object;Landroid/util/Property;[I)Landroid/animation/ObjectAnimator;\" since=\"14\"/>\n\t\t<method name=\"ofInt(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;\" since=\"21\"/>\n\t\t<method name=\"ofInt(Ljava/lang/Object;Ljava/lang/String;[I)Landroid/animation/ObjectAnimator;\"/>\n\t\t<method name=\"ofMultiFloat(Ljava/lang/Object;Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/ObjectAnimator;\" since=\"21\"/>\n\t\t<method name=\"ofMultiFloat(Ljava/lang/Object;Ljava/lang/String;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;\" since=\"21\"/>\n\t\t<method name=\"ofMultiFloat(Ljava/lang/Object;Ljava/lang/String;[[F)Landroid/animation/ObjectAnimator;\" since=\"21\"/>\n\t\t<method name=\"ofMultiInt(Ljava/lang/Object;Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/ObjectAnimator;\" since=\"21\"/>\n\t\t<method name=\"ofMultiInt(Ljava/lang/Object;Ljava/lang/String;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;\" since=\"21\"/>\n\t\t<method name=\"ofMultiInt(Ljava/lang/Object;Ljava/lang/String;[[I)Landroid/animation/ObjectAnimator;\" since=\"21\"/>\n\t\t<method name=\"ofObject(Ljava/lang/Object;Landroid/util/Property;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/ObjectAnimator;\" since=\"21\"/>\n\t\t<method name=\"ofObject(Ljava/lang/Object;Landroid/util/Property;Landroid/animation/TypeConverter;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;\" since=\"21\"/>\n\t\t<method name=\"ofObject(Ljava/lang/Object;Landroid/util/Property;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/ObjectAnimator;\" since=\"14\"/>\n\t\t<method name=\"ofObject(Ljava/lang/Object;Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;\" since=\"21\"/>\n\t\t<method name=\"ofObject(Ljava/lang/Object;Ljava/lang/String;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/ObjectAnimator;\"/>\n\t\t<method name=\"ofPropertyValuesHolder(Ljava/lang/Object;[Landroid/animation/PropertyValuesHolder;)Landroid/animation/ObjectAnimator;\"/>\n\t\t<method name=\"setAutoCancel(Z)V\" since=\"18\"/>\n\t\t<method name=\"setDuration(J)Landroid/animation/ObjectAnimator;\"/>\n\t\t<method name=\"setProperty(Landroid/util/Property;)V\" since=\"14\"/>\n\t\t<method name=\"setPropertyName(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/animation/PointFEvaluator\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/animation/TypeEvaluator\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/PointF;)V\"/>\n\t\t<method name=\"evaluate(FLandroid/graphics/PointF;Landroid/graphics/PointF;)Landroid/graphics/PointF;\"/>\n\t</class>\n\t<class name=\"android/animation/PropertyValuesHolder\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"clone()Landroid/animation/PropertyValuesHolder;\"/>\n\t\t<method name=\"getPropertyName()Ljava/lang/String;\"/>\n\t\t<method name=\"ofFloat(Landroid/util/Property;[F)Landroid/animation/PropertyValuesHolder;\" since=\"14\"/>\n\t\t<method name=\"ofFloat(Ljava/lang/String;[F)Landroid/animation/PropertyValuesHolder;\"/>\n\t\t<method name=\"ofInt(Landroid/util/Property;[I)Landroid/animation/PropertyValuesHolder;\" since=\"14\"/>\n\t\t<method name=\"ofInt(Ljava/lang/String;[I)Landroid/animation/PropertyValuesHolder;\"/>\n\t\t<method name=\"ofKeyframe(Landroid/util/Property;[Landroid/animation/Keyframe;)Landroid/animation/PropertyValuesHolder;\" since=\"14\"/>\n\t\t<method name=\"ofKeyframe(Ljava/lang/String;[Landroid/animation/Keyframe;)Landroid/animation/PropertyValuesHolder;\"/>\n\t\t<method name=\"ofMultiFloat(Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Landroid/animation/Keyframe;)Landroid/animation/PropertyValuesHolder;\" since=\"21\"/>\n\t\t<method name=\"ofMultiFloat(Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/PropertyValuesHolder;\" since=\"21\"/>\n\t\t<method name=\"ofMultiFloat(Ljava/lang/String;Landroid/graphics/Path;)Landroid/animation/PropertyValuesHolder;\" since=\"21\"/>\n\t\t<method name=\"ofMultiFloat(Ljava/lang/String;[[F)Landroid/animation/PropertyValuesHolder;\" since=\"21\"/>\n\t\t<method name=\"ofMultiInt(Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Landroid/animation/Keyframe;)Landroid/animation/PropertyValuesHolder;\" since=\"21\"/>\n\t\t<method name=\"ofMultiInt(Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/PropertyValuesHolder;\" since=\"21\"/>\n\t\t<method name=\"ofMultiInt(Ljava/lang/String;Landroid/graphics/Path;)Landroid/animation/PropertyValuesHolder;\" since=\"21\"/>\n\t\t<method name=\"ofMultiInt(Ljava/lang/String;[[I)Landroid/animation/PropertyValuesHolder;\" since=\"21\"/>\n\t\t<method name=\"ofObject(Landroid/util/Property;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/PropertyValuesHolder;\" since=\"21\"/>\n\t\t<method name=\"ofObject(Landroid/util/Property;Landroid/animation/TypeConverter;Landroid/graphics/Path;)Landroid/animation/PropertyValuesHolder;\" since=\"21\"/>\n\t\t<method name=\"ofObject(Landroid/util/Property;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/PropertyValuesHolder;\" since=\"14\"/>\n\t\t<method name=\"ofObject(Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/graphics/Path;)Landroid/animation/PropertyValuesHolder;\" since=\"21\"/>\n\t\t<method name=\"ofObject(Ljava/lang/String;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/PropertyValuesHolder;\"/>\n\t\t<method name=\"setConverter(Landroid/animation/TypeConverter;)V\" since=\"21\"/>\n\t\t<method name=\"setEvaluator(Landroid/animation/TypeEvaluator;)V\"/>\n\t\t<method name=\"setFloatValues([F)V\"/>\n\t\t<method name=\"setIntValues([I)V\"/>\n\t\t<method name=\"setKeyframes([Landroid/animation/Keyframe;)V\"/>\n\t\t<method name=\"setObjectValues([Ljava/lang/Object;)V\"/>\n\t\t<method name=\"setProperty(Landroid/util/Property;)V\" since=\"14\"/>\n\t\t<method name=\"setPropertyName(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/animation/RectEvaluator\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/animation/TypeEvaluator\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Rect;)V\" since=\"21\"/>\n\t\t<method name=\"evaluate(FLandroid/graphics/Rect;Landroid/graphics/Rect;)Landroid/graphics/Rect;\"/>\n\t</class>\n\t<class name=\"android/animation/StateListAnimator\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\" since=\"22\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addState([ILandroid/animation/Animator;)V\"/>\n\t\t<method name=\"clone()Landroid/animation/StateListAnimator;\" since=\"22\"/>\n\t\t<method name=\"jumpToCurrentState()V\"/>\n\t</class>\n\t<class name=\"android/animation/TimeAnimator\" since=\"16\">\n\t\t<extends name=\"android/animation/ValueAnimator\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"setTimeListener(Landroid/animation/TimeAnimator$TimeListener;)V\"/>\n\t</class>\n\t<class name=\"android/animation/TimeAnimator$TimeListener\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onTimeUpdate(Landroid/animation/TimeAnimator;JJ)V\"/>\n\t</class>\n\t<class name=\"android/animation/TimeInterpolator\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getInterpolation(F)F\"/>\n\t</class>\n\t<class name=\"android/animation/TypeConverter\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Class;Ljava/lang/Class;)V\"/>\n\t\t<method name=\"convert(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"android/animation/TypeEvaluator\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"evaluate(FLjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"android/animation/ValueAnimator\" since=\"11\">\n\t\t<extends name=\"android/animation/Animator\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addUpdateListener(Landroid/animation/ValueAnimator$AnimatorUpdateListener;)V\"/>\n\t\t<method name=\"areAnimatorsEnabled()Z\" since=\"26\"/>\n\t\t<method name=\"clone()Landroid/animation/ValueAnimator;\"/>\n\t\t<method name=\"getAnimatedFraction()F\" since=\"12\"/>\n\t\t<method name=\"getAnimatedValue()Ljava/lang/Object;\"/>\n\t\t<method name=\"getAnimatedValue(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getCurrentPlayTime()J\"/>\n\t\t<method name=\"getFrameDelay()J\"/>\n\t\t<method name=\"getInterpolator()Landroid/animation/TimeInterpolator;\"/>\n\t\t<method name=\"getRepeatCount()I\"/>\n\t\t<method name=\"getRepeatMode()I\"/>\n\t\t<method name=\"getValues()[Landroid/animation/PropertyValuesHolder;\"/>\n\t\t<method name=\"ofArgb([I)Landroid/animation/ValueAnimator;\" since=\"21\"/>\n\t\t<method name=\"ofFloat([F)Landroid/animation/ValueAnimator;\"/>\n\t\t<method name=\"ofInt([I)Landroid/animation/ValueAnimator;\"/>\n\t\t<method name=\"ofObject(Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/ValueAnimator;\"/>\n\t\t<method name=\"ofPropertyValuesHolder([Landroid/animation/PropertyValuesHolder;)Landroid/animation/ValueAnimator;\"/>\n\t\t<method name=\"removeAllUpdateListeners()V\"/>\n\t\t<method name=\"removeUpdateListener(Landroid/animation/ValueAnimator$AnimatorUpdateListener;)V\"/>\n\t\t<method name=\"reverse()V\"/>\n\t\t<method name=\"setCurrentFraction(F)V\" since=\"22\"/>\n\t\t<method name=\"setCurrentPlayTime(J)V\"/>\n\t\t<method name=\"setDuration(J)Landroid/animation/ValueAnimator;\"/>\n\t\t<method name=\"setEvaluator(Landroid/animation/TypeEvaluator;)V\"/>\n\t\t<method name=\"setFloatValues([F)V\"/>\n\t\t<method name=\"setFrameDelay(J)V\"/>\n\t\t<method name=\"setIntValues([I)V\"/>\n\t\t<method name=\"setObjectValues([Ljava/lang/Object;)V\"/>\n\t\t<method name=\"setRepeatCount(I)V\"/>\n\t\t<method name=\"setRepeatMode(I)V\"/>\n\t\t<method name=\"setValues([Landroid/animation/PropertyValuesHolder;)V\"/>\n\t\t<field name=\"INFINITE\"/>\n\t\t<field name=\"RESTART\"/>\n\t\t<field name=\"REVERSE\"/>\n\t</class>\n\t<class name=\"android/animation/ValueAnimator$AnimatorUpdateListener\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onAnimationUpdate(Landroid/animation/ValueAnimator;)V\"/>\n\t</class>\n\t<class name=\"android/annotation/SuppressLint\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t\t<method name=\"value()[Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/annotation/TargetApi\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t\t<method name=\"value()I\"/>\n\t</class>\n\t<class name=\"android/app/ActionBar\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addOnMenuVisibilityListener(Landroid/app/ActionBar$OnMenuVisibilityListener;)V\"/>\n\t\t<method name=\"addTab(Landroid/app/ActionBar$Tab;)V\" deprecated=\"21\"/>\n\t\t<method name=\"addTab(Landroid/app/ActionBar$Tab;I)V\" deprecated=\"21\"/>\n\t\t<method name=\"addTab(Landroid/app/ActionBar$Tab;IZ)V\" deprecated=\"21\"/>\n\t\t<method name=\"addTab(Landroid/app/ActionBar$Tab;Z)V\" deprecated=\"21\"/>\n\t\t<method name=\"getCustomView()Landroid/view/View;\"/>\n\t\t<method name=\"getDisplayOptions()I\"/>\n\t\t<method name=\"getElevation()F\" since=\"21\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getHideOffset()I\" since=\"21\"/>\n\t\t<method name=\"getNavigationItemCount()I\" deprecated=\"21\"/>\n\t\t<method name=\"getNavigationMode()I\" deprecated=\"21\"/>\n\t\t<method name=\"getSelectedNavigationIndex()I\" deprecated=\"21\"/>\n\t\t<method name=\"getSelectedTab()Landroid/app/ActionBar$Tab;\" deprecated=\"21\"/>\n\t\t<method name=\"getSubtitle()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTabAt(I)Landroid/app/ActionBar$Tab;\" deprecated=\"21\"/>\n\t\t<method name=\"getTabCount()I\" deprecated=\"21\"/>\n\t\t<method name=\"getThemedContext()Landroid/content/Context;\" since=\"14\"/>\n\t\t<method name=\"getTitle()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"hide()V\"/>\n\t\t<method name=\"isHideOnContentScrollEnabled()Z\" since=\"21\"/>\n\t\t<method name=\"isShowing()Z\"/>\n\t\t<method name=\"newTab()Landroid/app/ActionBar$Tab;\" deprecated=\"21\"/>\n\t\t<method name=\"removeAllTabs()V\" deprecated=\"21\"/>\n\t\t<method name=\"removeOnMenuVisibilityListener(Landroid/app/ActionBar$OnMenuVisibilityListener;)V\"/>\n\t\t<method name=\"removeTab(Landroid/app/ActionBar$Tab;)V\" deprecated=\"21\"/>\n\t\t<method name=\"removeTabAt(I)V\" deprecated=\"21\"/>\n\t\t<method name=\"selectTab(Landroid/app/ActionBar$Tab;)V\" deprecated=\"21\"/>\n\t\t<method name=\"setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setCustomView(I)V\"/>\n\t\t<method name=\"setCustomView(Landroid/view/View;)V\"/>\n\t\t<method name=\"setCustomView(Landroid/view/View;Landroid/app/ActionBar$LayoutParams;)V\"/>\n\t\t<method name=\"setDisplayHomeAsUpEnabled(Z)V\"/>\n\t\t<method name=\"setDisplayOptions(I)V\"/>\n\t\t<method name=\"setDisplayOptions(II)V\"/>\n\t\t<method name=\"setDisplayShowCustomEnabled(Z)V\"/>\n\t\t<method name=\"setDisplayShowHomeEnabled(Z)V\"/>\n\t\t<method name=\"setDisplayShowTitleEnabled(Z)V\"/>\n\t\t<method name=\"setDisplayUseLogoEnabled(Z)V\"/>\n\t\t<method name=\"setElevation(F)V\" since=\"21\"/>\n\t\t<method name=\"setHideOffset(I)V\" since=\"21\"/>\n\t\t<method name=\"setHideOnContentScrollEnabled(Z)V\" since=\"21\"/>\n\t\t<method name=\"setHomeActionContentDescription(I)V\" since=\"18\"/>\n\t\t<method name=\"setHomeActionContentDescription(Ljava/lang/CharSequence;)V\" since=\"18\"/>\n\t\t<method name=\"setHomeAsUpIndicator(I)V\" since=\"18\"/>\n\t\t<method name=\"setHomeAsUpIndicator(Landroid/graphics/drawable/Drawable;)V\" since=\"18\"/>\n\t\t<method name=\"setHomeButtonEnabled(Z)V\" since=\"14\"/>\n\t\t<method name=\"setIcon(I)V\" since=\"14\"/>\n\t\t<method name=\"setIcon(Landroid/graphics/drawable/Drawable;)V\" since=\"14\"/>\n\t\t<method name=\"setListNavigationCallbacks(Landroid/widget/SpinnerAdapter;Landroid/app/ActionBar$OnNavigationListener;)V\" deprecated=\"21\"/>\n\t\t<method name=\"setLogo(I)V\" since=\"14\"/>\n\t\t<method name=\"setLogo(Landroid/graphics/drawable/Drawable;)V\" since=\"14\"/>\n\t\t<method name=\"setNavigationMode(I)V\" deprecated=\"21\"/>\n\t\t<method name=\"setSelectedNavigationItem(I)V\" deprecated=\"21\"/>\n\t\t<method name=\"setSplitBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V\" since=\"14\"/>\n\t\t<method name=\"setStackedBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V\" since=\"14\"/>\n\t\t<method name=\"setSubtitle(I)V\"/>\n\t\t<method name=\"setSubtitle(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setTitle(I)V\"/>\n\t\t<method name=\"setTitle(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"show()V\"/>\n\t\t<field name=\"DISPLAY_HOME_AS_UP\"/>\n\t\t<field name=\"DISPLAY_SHOW_CUSTOM\"/>\n\t\t<field name=\"DISPLAY_SHOW_HOME\"/>\n\t\t<field name=\"DISPLAY_SHOW_TITLE\"/>\n\t\t<field name=\"DISPLAY_USE_LOGO\"/>\n\t\t<field name=\"NAVIGATION_MODE_LIST\" deprecated=\"21\"/>\n\t\t<field name=\"NAVIGATION_MODE_STANDARD\" deprecated=\"21\"/>\n\t\t<field name=\"NAVIGATION_MODE_TABS\" deprecated=\"21\"/>\n\t</class>\n\t<class name=\"android/app/ActionBar$LayoutParams\" since=\"11\">\n\t\t<extends name=\"android/view/ViewGroup$MarginLayoutParams\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/ActionBar$LayoutParams;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<field name=\"gravity\"/>\n\t</class>\n\t<class name=\"android/app/ActionBar$OnMenuVisibilityListener\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onMenuVisibilityChanged(Z)V\"/>\n\t</class>\n\t<class name=\"android/app/ActionBar$OnNavigationListener\" since=\"11\" deprecated=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onNavigationItemSelected(IJ)Z\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/ActionBar$Tab\" since=\"11\" deprecated=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"getContentDescription()Ljava/lang/CharSequence;\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"getCustomView()Landroid/view/View;\" deprecated=\"29\"/>\n\t\t<method name=\"getIcon()Landroid/graphics/drawable/Drawable;\" deprecated=\"29\"/>\n\t\t<method name=\"getPosition()I\" deprecated=\"29\"/>\n\t\t<method name=\"getTag()Ljava/lang/Object;\" deprecated=\"29\"/>\n\t\t<method name=\"getText()Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"select()V\" deprecated=\"29\"/>\n\t\t<method name=\"setContentDescription(I)Landroid/app/ActionBar$Tab;\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"setContentDescription(Ljava/lang/CharSequence;)Landroid/app/ActionBar$Tab;\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"setCustomView(I)Landroid/app/ActionBar$Tab;\" deprecated=\"29\"/>\n\t\t<method name=\"setCustomView(Landroid/view/View;)Landroid/app/ActionBar$Tab;\" deprecated=\"29\"/>\n\t\t<method name=\"setIcon(I)Landroid/app/ActionBar$Tab;\" deprecated=\"29\"/>\n\t\t<method name=\"setIcon(Landroid/graphics/drawable/Drawable;)Landroid/app/ActionBar$Tab;\" deprecated=\"29\"/>\n\t\t<method name=\"setTabListener(Landroid/app/ActionBar$TabListener;)Landroid/app/ActionBar$Tab;\" deprecated=\"29\"/>\n\t\t<method name=\"setTag(Ljava/lang/Object;)Landroid/app/ActionBar$Tab;\" deprecated=\"29\"/>\n\t\t<method name=\"setText(I)Landroid/app/ActionBar$Tab;\" deprecated=\"29\"/>\n\t\t<method name=\"setText(Ljava/lang/CharSequence;)Landroid/app/ActionBar$Tab;\" deprecated=\"29\"/>\n\t\t<field name=\"INVALID_POSITION\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/ActionBar$TabListener\" since=\"11\" deprecated=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onTabReselected(Landroid/app/ActionBar$Tab;Landroid/app/FragmentTransaction;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onTabSelected(Landroid/app/ActionBar$Tab;Landroid/app/FragmentTransaction;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onTabUnselected(Landroid/app/ActionBar$Tab;Landroid/app/FragmentTransaction;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/Activity\" since=\"1\">\n\t\t<extends name=\"android/view/ContextThemeWrapper\"/>\n\t\t<implements name=\"android/content/ComponentCallbacks\" removed=\"14\"/>\n\t\t<implements name=\"android/content/ComponentCallbacks2\" since=\"14\"/>\n\t\t<implements name=\"android/view/KeyEvent$Callback\"/>\n\t\t<implements name=\"android/view/LayoutInflater$Factory\" removed=\"11\"/>\n\t\t<implements name=\"android/view/LayoutInflater$Factory2\" since=\"11\"/>\n\t\t<implements name=\"android/view/View$OnCreateContextMenuListener\"/>\n\t\t<implements name=\"android/view/Window$Callback\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"closeContextMenu()V\" since=\"3\"/>\n\t\t<method name=\"closeOptionsMenu()V\"/>\n\t\t<method name=\"createPendingResult(ILandroid/content/Intent;I)Landroid/app/PendingIntent;\"/>\n\t\t<method name=\"dismissDialog(I)V\" deprecated=\"15\"/>\n\t\t<method name=\"dismissKeyboardShortcutsHelper()V\" since=\"24\"/>\n\t\t<method name=\"dump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V\" since=\"11\"/>\n\t\t<method name=\"enterPictureInPictureMode()V\" since=\"24\" deprecated=\"26\"/>\n\t\t<method name=\"enterPictureInPictureMode(Landroid/app/PictureInPictureParams;)Z\" since=\"26\"/>\n\t\t<method name=\"findViewById(I)Landroid/view/View;\"/>\n\t\t<method name=\"finish()V\"/>\n\t\t<method name=\"finishActivity(I)V\"/>\n\t\t<method name=\"finishActivityFromChild(Landroid/app/Activity;I)V\"/>\n\t\t<method name=\"finishAffinity()V\" since=\"16\"/>\n\t\t<method name=\"finishAfterTransition()V\" since=\"21\"/>\n\t\t<method name=\"finishAndRemoveTask()V\" since=\"21\"/>\n\t\t<method name=\"finishFromChild(Landroid/app/Activity;)V\"/>\n\t\t<method name=\"getActionBar()Landroid/app/ActionBar;\" since=\"11\"/>\n\t\t<method name=\"getApplication()Landroid/app/Application;\"/>\n\t\t<method name=\"getCallingActivity()Landroid/content/ComponentName;\"/>\n\t\t<method name=\"getCallingPackage()Ljava/lang/String;\"/>\n\t\t<method name=\"getChangingConfigurations()I\"/>\n\t\t<method name=\"getComponentName()Landroid/content/ComponentName;\"/>\n\t\t<method name=\"getContentScene()Landroid/transition/Scene;\" since=\"21\"/>\n\t\t<method name=\"getContentTransitionManager()Landroid/transition/TransitionManager;\" since=\"21\"/>\n\t\t<method name=\"getCurrentFocus()Landroid/view/View;\"/>\n\t\t<method name=\"getFragmentManager()Landroid/app/FragmentManager;\" since=\"11\" deprecated=\"28\"/>\n\t\t<method name=\"getInstanceCount()J\" removed=\"11\"/>\n\t\t<method name=\"getIntent()Landroid/content/Intent;\"/>\n\t\t<method name=\"getLastNonConfigurationInstance()Ljava/lang/Object;\" deprecated=\"15\"/>\n\t\t<method name=\"getLayoutInflater()Landroid/view/LayoutInflater;\"/>\n\t\t<method name=\"getLoaderManager()Landroid/app/LoaderManager;\" since=\"11\" deprecated=\"28\"/>\n\t\t<method name=\"getLocalClassName()Ljava/lang/String;\"/>\n\t\t<method name=\"getMaxNumPictureInPictureActions()I\" since=\"26\"/>\n\t\t<method name=\"getMediaController()Landroid/media/session/MediaController;\" since=\"21\"/>\n\t\t<method name=\"getMenuInflater()Landroid/view/MenuInflater;\"/>\n\t\t<method name=\"getParent()Landroid/app/Activity;\"/>\n\t\t<method name=\"getParentActivityIntent()Landroid/content/Intent;\" since=\"16\"/>\n\t\t<method name=\"getPreferences(I)Landroid/content/SharedPreferences;\"/>\n\t\t<method name=\"getReferrer()Landroid/net/Uri;\" since=\"22\"/>\n\t\t<method name=\"getRequestedOrientation()I\"/>\n\t\t<method name=\"getSearchEvent()Landroid/view/SearchEvent;\" since=\"23\"/>\n\t\t<method name=\"getTaskId()I\"/>\n\t\t<method name=\"getTitle()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTitleColor()I\"/>\n\t\t<method name=\"getVoiceInteractor()Landroid/app/VoiceInteractor;\" since=\"23\"/>\n\t\t<method name=\"getVolumeControlStream()I\"/>\n\t\t<method name=\"getWindow()Landroid/view/Window;\"/>\n\t\t<method name=\"getWindowManager()Landroid/view/WindowManager;\"/>\n\t\t<method name=\"hasWindowFocus()Z\" since=\"3\"/>\n\t\t<method name=\"invalidateOptionsMenu()V\" since=\"11\"/>\n\t\t<method name=\"isActivityTransitionRunning()Z\" since=\"26\"/>\n\t\t<method name=\"isChangingConfigurations()Z\" since=\"11\"/>\n\t\t<method name=\"isChild()Z\"/>\n\t\t<method name=\"isDestroyed()Z\" since=\"17\"/>\n\t\t<method name=\"isFinishing()Z\"/>\n\t\t<method name=\"isImmersive()Z\" since=\"18\"/>\n\t\t<method name=\"isInMultiWindowMode()Z\" since=\"24\"/>\n\t\t<method name=\"isInPictureInPictureMode()Z\" since=\"24\"/>\n\t\t<method name=\"isLocalVoiceInteractionSupported()Z\" since=\"24\"/>\n\t\t<method name=\"isTaskRoot()Z\"/>\n\t\t<method name=\"isVoiceInteraction()Z\" since=\"23\"/>\n\t\t<method name=\"isVoiceInteractionRoot()Z\" since=\"23\"/>\n\t\t<method name=\"managedQuery(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;\" deprecated=\"15\"/>\n\t\t<method name=\"moveTaskToBack(Z)Z\"/>\n\t\t<method name=\"navigateUpTo(Landroid/content/Intent;)Z\" since=\"16\"/>\n\t\t<method name=\"navigateUpToFromChild(Landroid/app/Activity;Landroid/content/Intent;)Z\" since=\"16\"/>\n\t\t<method name=\"onActivityReenter(ILandroid/content/Intent;)V\" since=\"21\"/>\n\t\t<method name=\"onActivityResult(IILandroid/content/Intent;)V\"/>\n\t\t<method name=\"onAttachFragment(Landroid/app/Fragment;)V\" since=\"11\" deprecated=\"28\"/>\n\t\t<method name=\"onBackPressed()V\" since=\"5\"/>\n\t\t<method name=\"onChildTitleChanged(Landroid/app/Activity;Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"onContextItemSelected(Landroid/view/MenuItem;)Z\"/>\n\t\t<method name=\"onContextMenuClosed(Landroid/view/Menu;)V\"/>\n\t\t<method name=\"onCreate(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onCreate(Landroid/os/Bundle;Landroid/os/PersistableBundle;)V\" since=\"21\"/>\n\t\t<method name=\"onCreateDescription()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"onCreateDialog(I)Landroid/app/Dialog;\" deprecated=\"15\"/>\n\t\t<method name=\"onCreateDialog(ILandroid/os/Bundle;)Landroid/app/Dialog;\" since=\"8\" deprecated=\"15\"/>\n\t\t<method name=\"onCreateNavigateUpTaskStack(Landroid/app/TaskStackBuilder;)V\" since=\"16\"/>\n\t\t<method name=\"onCreateOptionsMenu(Landroid/view/Menu;)Z\"/>\n\t\t<method name=\"onCreateThumbnail(Landroid/graphics/Bitmap;Landroid/graphics/Canvas;)Z\" deprecated=\"28\"/>\n\t\t<method name=\"onDestroy()V\"/>\n\t\t<method name=\"onEnterAnimationComplete()V\" since=\"21\"/>\n\t\t<method name=\"onGenericMotionEvent(Landroid/view/MotionEvent;)Z\" since=\"12\"/>\n\t\t<method name=\"onGetDirectActions(Landroid/os/CancellationSignal;Ljava/util/function/Consumer;)V\" since=\"29\"/>\n\t\t<method name=\"onKeyShortcut(ILandroid/view/KeyEvent;)Z\" since=\"11\"/>\n\t\t<method name=\"onLocalVoiceInteractionStarted()V\" since=\"24\"/>\n\t\t<method name=\"onLocalVoiceInteractionStopped()V\" since=\"24\"/>\n\t\t<method name=\"onMultiWindowModeChanged(Z)V\" since=\"24\" deprecated=\"26\"/>\n\t\t<method name=\"onMultiWindowModeChanged(ZLandroid/content/res/Configuration;)V\" since=\"26\"/>\n\t\t<method name=\"onNavigateUp()Z\" since=\"16\"/>\n\t\t<method name=\"onNavigateUpFromChild(Landroid/app/Activity;)Z\" since=\"16\"/>\n\t\t<method name=\"onNewIntent(Landroid/content/Intent;)V\"/>\n\t\t<method name=\"onOptionsItemSelected(Landroid/view/MenuItem;)Z\"/>\n\t\t<method name=\"onOptionsMenuClosed(Landroid/view/Menu;)V\"/>\n\t\t<method name=\"onPause()V\"/>\n\t\t<method name=\"onPerformDirectAction(Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;Ljava/util/function/Consumer;)V\" since=\"29\"/>\n\t\t<method name=\"onPictureInPictureModeChanged(Z)V\" since=\"24\" deprecated=\"26\"/>\n\t\t<method name=\"onPictureInPictureModeChanged(ZLandroid/content/res/Configuration;)V\" since=\"26\"/>\n\t\t<method name=\"onPostCreate(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onPostCreate(Landroid/os/Bundle;Landroid/os/PersistableBundle;)V\" since=\"21\"/>\n\t\t<method name=\"onPostResume()V\"/>\n\t\t<method name=\"onPrepareDialog(ILandroid/app/Dialog;)V\" deprecated=\"15\"/>\n\t\t<method name=\"onPrepareDialog(ILandroid/app/Dialog;Landroid/os/Bundle;)V\" since=\"8\" deprecated=\"15\"/>\n\t\t<method name=\"onPrepareNavigateUpTaskStack(Landroid/app/TaskStackBuilder;)V\" since=\"16\"/>\n\t\t<method name=\"onPrepareOptionsMenu(Landroid/view/Menu;)Z\"/>\n\t\t<method name=\"onProvideAssistContent(Landroid/app/assist/AssistContent;)V\" since=\"23\"/>\n\t\t<method name=\"onProvideAssistData(Landroid/os/Bundle;)V\" since=\"18\"/>\n\t\t<method name=\"onProvideReferrer()Landroid/net/Uri;\" since=\"23\"/>\n\t\t<method name=\"onRequestPermissionsResult(I[Ljava/lang/String;[I)V\" since=\"23\"/>\n\t\t<method name=\"onRestart()V\"/>\n\t\t<method name=\"onRestoreInstanceState(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onRestoreInstanceState(Landroid/os/Bundle;Landroid/os/PersistableBundle;)V\" since=\"21\"/>\n\t\t<method name=\"onResume()V\"/>\n\t\t<method name=\"onRetainNonConfigurationInstance()Ljava/lang/Object;\" deprecated=\"15\"/>\n\t\t<method name=\"onSaveInstanceState(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onSaveInstanceState(Landroid/os/Bundle;Landroid/os/PersistableBundle;)V\" since=\"21\"/>\n\t\t<method name=\"onStart()V\"/>\n\t\t<method name=\"onStateNotSaved()V\" since=\"23\" deprecated=\"29\"/>\n\t\t<method name=\"onStop()V\"/>\n\t\t<method name=\"onTitleChanged(Ljava/lang/CharSequence;I)V\"/>\n\t\t<method name=\"onTopResumedActivityChanged(Z)V\" since=\"29\"/>\n\t\t<method name=\"onTouchEvent(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"onTrackballEvent(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"onUserInteraction()V\" since=\"3\"/>\n\t\t<method name=\"onUserLeaveHint()V\" since=\"3\"/>\n\t\t<method name=\"onVisibleBehindCanceled()V\" since=\"21\" deprecated=\"26\"/>\n\t\t<method name=\"openContextMenu(Landroid/view/View;)V\"/>\n\t\t<method name=\"openOptionsMenu()V\"/>\n\t\t<method name=\"overridePendingTransition(II)V\" since=\"5\"/>\n\t\t<method name=\"postponeEnterTransition()V\" since=\"21\"/>\n\t\t<method name=\"recreate()V\" since=\"11\"/>\n\t\t<method name=\"registerActivityLifecycleCallbacks(Landroid/app/Application$ActivityLifecycleCallbacks;)V\" since=\"29\"/>\n\t\t<method name=\"registerForContextMenu(Landroid/view/View;)V\"/>\n\t\t<method name=\"releaseInstance()Z\" since=\"21\"/>\n\t\t<method name=\"removeDialog(I)V\" deprecated=\"15\"/>\n\t\t<method name=\"reportFullyDrawn()V\" since=\"19\"/>\n\t\t<method name=\"requestDragAndDropPermissions(Landroid/view/DragEvent;)Landroid/view/DragAndDropPermissions;\" since=\"24\"/>\n\t\t<method name=\"requestPermissions([Ljava/lang/String;I)V\" since=\"23\"/>\n\t\t<method name=\"requestShowKeyboardShortcuts()V\" since=\"24\"/>\n\t\t<method name=\"requestVisibleBehind(Z)Z\" since=\"21\" deprecated=\"26\"/>\n\t\t<method name=\"requestWindowFeature(I)Z\"/>\n\t\t<method name=\"requireViewById(I)Landroid/view/View;\" since=\"28\"/>\n\t\t<method name=\"runOnUiThread(Ljava/lang/Runnable;)V\"/>\n\t\t<method name=\"setActionBar(Landroid/widget/Toolbar;)V\" since=\"21\"/>\n\t\t<method name=\"setContentTransitionManager(Landroid/transition/TransitionManager;)V\" since=\"21\"/>\n\t\t<method name=\"setContentView(I)V\"/>\n\t\t<method name=\"setContentView(Landroid/view/View;)V\"/>\n\t\t<method name=\"setContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"setDefaultKeyMode(I)V\"/>\n\t\t<method name=\"setEnterSharedElementCallback(Landroid/app/SharedElementCallback;)V\" since=\"21\"/>\n\t\t<method name=\"setExitSharedElementCallback(Landroid/app/SharedElementCallback;)V\" since=\"21\"/>\n\t\t<method name=\"setFeatureDrawable(ILandroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setFeatureDrawableAlpha(II)V\"/>\n\t\t<method name=\"setFeatureDrawableResource(II)V\"/>\n\t\t<method name=\"setFeatureDrawableUri(ILandroid/net/Uri;)V\"/>\n\t\t<method name=\"setFinishOnTouchOutside(Z)V\" since=\"11\"/>\n\t\t<method name=\"setImmersive(Z)V\" since=\"18\"/>\n\t\t<method name=\"setInheritShowWhenLocked(Z)V\" since=\"29\"/>\n\t\t<method name=\"setIntent(Landroid/content/Intent;)V\"/>\n\t\t<method name=\"setMediaController(Landroid/media/session/MediaController;)V\" since=\"21\"/>\n\t\t<method name=\"setPersistent(Z)V\" removed=\"11\"/>\n\t\t<method name=\"setPictureInPictureParams(Landroid/app/PictureInPictureParams;)V\" since=\"26\"/>\n\t\t<method name=\"setProgress(I)V\" deprecated=\"24\"/>\n\t\t<method name=\"setProgressBarIndeterminate(Z)V\" deprecated=\"24\"/>\n\t\t<method name=\"setProgressBarIndeterminateVisibility(Z)V\" deprecated=\"24\"/>\n\t\t<method name=\"setProgressBarVisibility(Z)V\" deprecated=\"24\"/>\n\t\t<method name=\"setRequestedOrientation(I)V\"/>\n\t\t<method name=\"setResult(I)V\"/>\n\t\t<method name=\"setResult(ILandroid/content/Intent;)V\"/>\n\t\t<method name=\"setSecondaryProgress(I)V\" deprecated=\"24\"/>\n\t\t<method name=\"setShowWhenLocked(Z)V\" since=\"27\"/>\n\t\t<method name=\"setTaskDescription(Landroid/app/ActivityManager$TaskDescription;)V\" since=\"21\"/>\n\t\t<method name=\"setTitle(I)V\"/>\n\t\t<method name=\"setTitle(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setTitleColor(I)V\" deprecated=\"21\"/>\n\t\t<method name=\"setTurnScreenOn(Z)V\" since=\"27\"/>\n\t\t<method name=\"setVisible(Z)V\" since=\"3\"/>\n\t\t<method name=\"setVolumeControlStream(I)V\"/>\n\t\t<method name=\"setVrModeEnabled(ZLandroid/content/ComponentName;)V\" since=\"24\"/>\n\t\t<method name=\"shouldShowRequestPermissionRationale(Ljava/lang/String;)Z\" since=\"23\"/>\n\t\t<method name=\"shouldUpRecreateTask(Landroid/content/Intent;)Z\" since=\"16\"/>\n\t\t<method name=\"showAssist(Landroid/os/Bundle;)Z\" since=\"23\"/>\n\t\t<method name=\"showDialog(I)V\" deprecated=\"15\"/>\n\t\t<method name=\"showDialog(ILandroid/os/Bundle;)Z\" since=\"8\" deprecated=\"15\"/>\n\t\t<method name=\"showLockTaskEscapeMessage()V\" since=\"23\"/>\n\t\t<method name=\"startActionMode(Landroid/view/ActionMode$Callback;)Landroid/view/ActionMode;\" since=\"11\"/>\n\t\t<method name=\"startActionMode(Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;\" since=\"23\"/>\n\t\t<method name=\"startActivityForResult(Landroid/content/Intent;I)V\"/>\n\t\t<method name=\"startActivityForResult(Landroid/content/Intent;ILandroid/os/Bundle;)V\" since=\"16\"/>\n\t\t<method name=\"startActivityFromChild(Landroid/app/Activity;Landroid/content/Intent;I)V\"/>\n\t\t<method name=\"startActivityFromChild(Landroid/app/Activity;Landroid/content/Intent;ILandroid/os/Bundle;)V\" since=\"16\"/>\n\t\t<method name=\"startActivityFromFragment(Landroid/app/Fragment;Landroid/content/Intent;I)V\" since=\"11\" deprecated=\"28\"/>\n\t\t<method name=\"startActivityFromFragment(Landroid/app/Fragment;Landroid/content/Intent;ILandroid/os/Bundle;)V\" since=\"16\" deprecated=\"28\"/>\n\t\t<method name=\"startActivityIfNeeded(Landroid/content/Intent;I)Z\"/>\n\t\t<method name=\"startActivityIfNeeded(Landroid/content/Intent;ILandroid/os/Bundle;)Z\" since=\"16\"/>\n\t\t<method name=\"startIntentSenderForResult(Landroid/content/IntentSender;ILandroid/content/Intent;III)V\" since=\"5\"/>\n\t\t<method name=\"startIntentSenderForResult(Landroid/content/IntentSender;ILandroid/content/Intent;IIILandroid/os/Bundle;)V\" since=\"16\"/>\n\t\t<method name=\"startIntentSenderFromChild(Landroid/app/Activity;Landroid/content/IntentSender;ILandroid/content/Intent;III)V\" since=\"5\"/>\n\t\t<method name=\"startIntentSenderFromChild(Landroid/app/Activity;Landroid/content/IntentSender;ILandroid/content/Intent;IIILandroid/os/Bundle;)V\" since=\"16\"/>\n\t\t<method name=\"startLocalVoiceInteraction(Landroid/os/Bundle;)V\" since=\"24\"/>\n\t\t<method name=\"startLockTask()V\" since=\"21\"/>\n\t\t<method name=\"startManagingCursor(Landroid/database/Cursor;)V\" deprecated=\"15\"/>\n\t\t<method name=\"startNextMatchingActivity(Landroid/content/Intent;)Z\"/>\n\t\t<method name=\"startNextMatchingActivity(Landroid/content/Intent;Landroid/os/Bundle;)Z\" since=\"16\"/>\n\t\t<method name=\"startPostponedEnterTransition()V\" since=\"21\"/>\n\t\t<method name=\"startSearch(Ljava/lang/String;ZLandroid/os/Bundle;Z)V\"/>\n\t\t<method name=\"stopLocalVoiceInteraction()V\" since=\"24\"/>\n\t\t<method name=\"stopLockTask()V\" since=\"21\"/>\n\t\t<method name=\"stopManagingCursor(Landroid/database/Cursor;)V\" deprecated=\"15\"/>\n\t\t<method name=\"takeKeyEvents(Z)V\"/>\n\t\t<method name=\"triggerSearch(Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"5\"/>\n\t\t<method name=\"unregisterActivityLifecycleCallbacks(Landroid/app/Application$ActivityLifecycleCallbacks;)V\" since=\"29\"/>\n\t\t<method name=\"unregisterForContextMenu(Landroid/view/View;)V\"/>\n\t\t<field name=\"DEFAULT_KEYS_DIALER\"/>\n\t\t<field name=\"DEFAULT_KEYS_DISABLE\"/>\n\t\t<field name=\"DEFAULT_KEYS_SEARCH_GLOBAL\"/>\n\t\t<field name=\"DEFAULT_KEYS_SEARCH_LOCAL\"/>\n\t\t<field name=\"DEFAULT_KEYS_SHORTCUT\"/>\n\t\t<field name=\"FOCUSED_STATE_SET\"/>\n\t\t<field name=\"RESULT_CANCELED\"/>\n\t\t<field name=\"RESULT_FIRST_USER\"/>\n\t\t<field name=\"RESULT_OK\"/>\n\t</class>\n\t<class name=\"android/app/ActivityGroup\" since=\"1\" deprecated=\"13\">\n\t\t<extends name=\"android/app/Activity\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"getCurrentActivity()Landroid/app/Activity;\" deprecated=\"29\"/>\n\t\t<method name=\"getLocalActivityManager()Landroid/app/LocalActivityManager;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/ActivityManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addAppTask(Landroid/app/Activity;Landroid/content/Intent;Landroid/app/ActivityManager$TaskDescription;Landroid/graphics/Bitmap;)I\" since=\"21\"/>\n\t\t<method name=\"clearApplicationUserData()Z\" since=\"19\"/>\n\t\t<method name=\"clearWatchHeapLimit()V\" since=\"23\"/>\n\t\t<method name=\"dumpPackageState(Ljava/io/FileDescriptor;Ljava/lang/String;)V\" since=\"19\"/>\n\t\t<method name=\"getAppTaskThumbnailSize()Landroid/util/Size;\" since=\"21\"/>\n\t\t<method name=\"getAppTasks()Ljava/util/List;\" since=\"21\"/>\n\t\t<method name=\"getDeviceConfigurationInfo()Landroid/content/pm/ConfigurationInfo;\" since=\"3\"/>\n\t\t<method name=\"getLargeMemoryClass()I\" since=\"11\"/>\n\t\t<method name=\"getLauncherLargeIconDensity()I\" since=\"11\"/>\n\t\t<method name=\"getLauncherLargeIconSize()I\" since=\"11\"/>\n\t\t<method name=\"getLockTaskModeState()I\" since=\"23\"/>\n\t\t<method name=\"getMemoryClass()I\" since=\"5\"/>\n\t\t<method name=\"getMemoryInfo(Landroid/app/ActivityManager$MemoryInfo;)V\"/>\n\t\t<method name=\"getMyMemoryState(Landroid/app/ActivityManager$RunningAppProcessInfo;)V\" since=\"16\"/>\n\t\t<method name=\"getProcessMemoryInfo([I)[Landroid/os/Debug$MemoryInfo;\" since=\"5\"/>\n\t\t<method name=\"getProcessesInErrorState()Ljava/util/List;\"/>\n\t\t<method name=\"getRecentTasks(II)Ljava/util/List;\" deprecated=\"21\"/>\n\t\t<method name=\"getRunningAppProcesses()Ljava/util/List;\" since=\"3\"/>\n\t\t<method name=\"getRunningServiceControlPanel(Landroid/content/ComponentName;)Landroid/app/PendingIntent;\" since=\"5\"/>\n\t\t<method name=\"getRunningServices(I)Ljava/util/List;\" deprecated=\"26\"/>\n\t\t<method name=\"getRunningTasks(I)Ljava/util/List;\" deprecated=\"21\"/>\n\t\t<method name=\"isActivityStartAllowedOnDisplay(Landroid/content/Context;ILandroid/content/Intent;)Z\" since=\"29\"/>\n\t\t<method name=\"isBackgroundRestricted()Z\" since=\"28\"/>\n\t\t<method name=\"isInLockTaskMode()Z\" since=\"21\" deprecated=\"23\"/>\n\t\t<method name=\"isLowRamDevice()Z\" since=\"19\"/>\n\t\t<method name=\"isRunningInTestHarness()Z\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"isRunningInUserTestHarness()Z\" since=\"29\"/>\n\t\t<method name=\"isUserAMonkey()Z\" since=\"8\"/>\n\t\t<method name=\"killBackgroundProcesses(Ljava/lang/String;)V\" since=\"8\"/>\n\t\t<method name=\"moveTaskToFront(II)V\" since=\"11\"/>\n\t\t<method name=\"moveTaskToFront(IILandroid/os/Bundle;)V\" since=\"16\"/>\n\t\t<method name=\"restartPackage(Ljava/lang/String;)V\" since=\"3\" deprecated=\"15\"/>\n\t\t<method name=\"setVrThread(I)V\" since=\"25\"/>\n\t\t<method name=\"setWatchHeapLimit(J)V\" since=\"23\"/>\n\t\t<field name=\"ACTION_REPORT_HEAP_LIMIT\" since=\"23\"/>\n\t\t<field name=\"LOCK_TASK_MODE_LOCKED\" since=\"23\"/>\n\t\t<field name=\"LOCK_TASK_MODE_NONE\" since=\"23\"/>\n\t\t<field name=\"LOCK_TASK_MODE_PINNED\" since=\"23\"/>\n\t\t<field name=\"META_HOME_ALTERNATE\" since=\"19\"/>\n\t\t<field name=\"MOVE_TASK_NO_USER_ACTION\" since=\"12\"/>\n\t\t<field name=\"MOVE_TASK_WITH_HOME\" since=\"11\"/>\n\t\t<field name=\"RECENT_IGNORE_UNAVAILABLE\" since=\"11\"/>\n\t\t<field name=\"RECENT_WITH_EXCLUDED\"/>\n\t</class>\n\t<class name=\"android/app/ActivityManager$AppTask\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"finishAndRemoveTask()V\"/>\n\t\t<method name=\"getTaskInfo()Landroid/app/ActivityManager$RecentTaskInfo;\"/>\n\t\t<method name=\"moveToFront()V\"/>\n\t\t<method name=\"setExcludeFromRecents(Z)V\"/>\n\t\t<method name=\"startActivity(Landroid/content/Context;Landroid/content/Intent;Landroid/os/Bundle;)V\"/>\n\t</class>\n\t<class name=\"android/app/ActivityManager$MemoryInfo\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"readFromParcel(Landroid/os/Parcel;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"availMem\"/>\n\t\t<field name=\"lowMemory\"/>\n\t\t<field name=\"threshold\"/>\n\t\t<field name=\"totalMem\" since=\"16\"/>\n\t</class>\n\t<class name=\"android/app/ActivityManager$ProcessErrorStateInfo\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"readFromParcel(Landroid/os/Parcel;)V\"/>\n\t\t<field name=\"CRASHED\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"NOT_RESPONDING\"/>\n\t\t<field name=\"NO_ERROR\"/>\n\t\t<field name=\"condition\"/>\n\t\t<field name=\"crashData\"/>\n\t\t<field name=\"longMsg\"/>\n\t\t<field name=\"pid\"/>\n\t\t<field name=\"processName\"/>\n\t\t<field name=\"shortMsg\"/>\n\t\t<field name=\"stackTrace\" since=\"8\"/>\n\t\t<field name=\"tag\"/>\n\t\t<field name=\"uid\"/>\n\t</class>\n\t<class name=\"android/app/ActivityManager$RecentTaskInfo\" since=\"1\">\n\t\t<extends name=\"android/app/TaskInfo\" since=\"29\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"29\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"readFromParcel(Landroid/os/Parcel;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"affiliatedTaskId\" since=\"21\" deprecated=\"29\"/>\n\t\t<field name=\"baseActivity\" since=\"23\" removed=\"29\"/>\n\t\t<field name=\"baseIntent\" removed=\"29\"/>\n\t\t<field name=\"description\" since=\"11\" deprecated=\"29\"/>\n\t\t<field name=\"id\" deprecated=\"29\"/>\n\t\t<field name=\"numActivities\" since=\"23\" removed=\"29\"/>\n\t\t<field name=\"origActivity\" removed=\"29\"/>\n\t\t<field name=\"persistentId\" since=\"12\" deprecated=\"29\"/>\n\t\t<field name=\"taskDescription\" since=\"21\" removed=\"29\"/>\n\t\t<field name=\"topActivity\" since=\"23\" removed=\"29\"/>\n\t</class>\n\t<class name=\"android/app/ActivityManager$RunningAppProcessInfo\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I[Ljava/lang/String;)V\"/>\n\t\t<method name=\"readFromParcel(Landroid/os/Parcel;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"IMPORTANCE_BACKGROUND\" deprecated=\"26\"/>\n\t\t<field name=\"IMPORTANCE_CACHED\" since=\"26\"/>\n\t\t<field name=\"IMPORTANCE_CANT_SAVE_STATE\" since=\"28\"/>\n\t\t<field name=\"IMPORTANCE_EMPTY\" deprecated=\"26\"/>\n\t\t<field name=\"IMPORTANCE_FOREGROUND\"/>\n\t\t<field name=\"IMPORTANCE_FOREGROUND_SERVICE\" since=\"23\"/>\n\t\t<field name=\"IMPORTANCE_GONE\" since=\"21\"/>\n\t\t<field name=\"IMPORTANCE_PERCEPTIBLE\" since=\"9\"/>\n\t\t<field name=\"IMPORTANCE_PERCEPTIBLE_PRE_26\" since=\"26\"/>\n\t\t<field name=\"IMPORTANCE_SERVICE\"/>\n\t\t<field name=\"IMPORTANCE_TOP_SLEEPING\" since=\"23\"/>\n\t\t<field name=\"IMPORTANCE_TOP_SLEEPING_PRE_28\" since=\"28\" deprecated=\"28\"/>\n\t\t<field name=\"IMPORTANCE_VISIBLE\"/>\n\t\t<field name=\"REASON_PROVIDER_IN_USE\" since=\"5\"/>\n\t\t<field name=\"REASON_SERVICE_IN_USE\" since=\"5\"/>\n\t\t<field name=\"REASON_UNKNOWN\" since=\"5\"/>\n\t\t<field name=\"importance\"/>\n\t\t<field name=\"importanceReasonCode\" since=\"5\"/>\n\t\t<field name=\"importanceReasonComponent\" since=\"5\"/>\n\t\t<field name=\"importanceReasonPid\" since=\"5\"/>\n\t\t<field name=\"lastTrimLevel\" since=\"16\"/>\n\t\t<field name=\"lru\"/>\n\t\t<field name=\"pid\"/>\n\t\t<field name=\"pkgList\"/>\n\t\t<field name=\"processName\"/>\n\t\t<field name=\"uid\" since=\"5\"/>\n\t</class>\n\t<class name=\"android/app/ActivityManager$RunningServiceInfo\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"readFromParcel(Landroid/os/Parcel;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FLAG_FOREGROUND\" since=\"5\"/>\n\t\t<field name=\"FLAG_PERSISTENT_PROCESS\" since=\"5\"/>\n\t\t<field name=\"FLAG_STARTED\" since=\"5\"/>\n\t\t<field name=\"FLAG_SYSTEM_PROCESS\" since=\"5\"/>\n\t\t<field name=\"activeSince\"/>\n\t\t<field name=\"clientCount\"/>\n\t\t<field name=\"clientLabel\" since=\"5\"/>\n\t\t<field name=\"clientPackage\" since=\"5\"/>\n\t\t<field name=\"crashCount\"/>\n\t\t<field name=\"flags\" since=\"5\"/>\n\t\t<field name=\"foreground\"/>\n\t\t<field name=\"lastActivityTime\"/>\n\t\t<field name=\"pid\"/>\n\t\t<field name=\"process\"/>\n\t\t<field name=\"restarting\"/>\n\t\t<field name=\"service\"/>\n\t\t<field name=\"started\"/>\n\t\t<field name=\"uid\" since=\"5\"/>\n\t</class>\n\t<class name=\"android/app/ActivityManager$RunningTaskInfo\" since=\"1\">\n\t\t<extends name=\"android/app/TaskInfo\" since=\"29\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"29\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"readFromParcel(Landroid/os/Parcel;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"baseActivity\" removed=\"29\"/>\n\t\t<field name=\"description\" deprecated=\"29\"/>\n\t\t<field name=\"id\" deprecated=\"29\"/>\n\t\t<field name=\"numActivities\" removed=\"29\"/>\n\t\t<field name=\"numRunning\" deprecated=\"29\"/>\n\t\t<field name=\"thumbnail\" deprecated=\"29\"/>\n\t\t<field name=\"topActivity\" removed=\"29\"/>\n\t</class>\n\t<class name=\"android/app/ActivityManager$TaskDescription\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/ActivityManager$TaskDescription;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\" since=\"28\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;II)V\" since=\"28\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Landroid/graphics/Bitmap;)V\" deprecated=\"28\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Landroid/graphics/Bitmap;I)V\" deprecated=\"28\"/>\n\t\t<method name=\"getIcon()Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"getLabel()Ljava/lang/String;\"/>\n\t\t<method name=\"getPrimaryColor()I\"/>\n\t\t<method name=\"readFromParcel(Landroid/os/Parcel;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/ActivityOptions\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getLaunchBounds()Landroid/graphics/Rect;\" since=\"24\"/>\n\t\t<method name=\"getLaunchDisplayId()I\" since=\"26\"/>\n\t\t<method name=\"getLockTaskMode()Z\" since=\"28\"/>\n\t\t<method name=\"makeBasic()Landroid/app/ActivityOptions;\" since=\"23\"/>\n\t\t<method name=\"makeClipRevealAnimation(Landroid/view/View;IIII)Landroid/app/ActivityOptions;\" since=\"23\"/>\n\t\t<method name=\"makeCustomAnimation(Landroid/content/Context;II)Landroid/app/ActivityOptions;\"/>\n\t\t<method name=\"makeScaleUpAnimation(Landroid/view/View;IIII)Landroid/app/ActivityOptions;\"/>\n\t\t<method name=\"makeSceneTransitionAnimation(Landroid/app/Activity;Landroid/view/View;Ljava/lang/String;)Landroid/app/ActivityOptions;\" since=\"21\"/>\n\t\t<method name=\"makeSceneTransitionAnimation(Landroid/app/Activity;[Landroid/util/Pair;)Landroid/app/ActivityOptions;\" since=\"21\"/>\n\t\t<method name=\"makeTaskLaunchBehind()Landroid/app/ActivityOptions;\" since=\"21\"/>\n\t\t<method name=\"makeThumbnailScaleUpAnimation(Landroid/view/View;Landroid/graphics/Bitmap;II)Landroid/app/ActivityOptions;\"/>\n\t\t<method name=\"requestUsageTimeReport(Landroid/app/PendingIntent;)V\" since=\"23\"/>\n\t\t<method name=\"setAppVerificationBundle(Landroid/os/Bundle;)Landroid/app/ActivityOptions;\" since=\"26\"/>\n\t\t<method name=\"setLaunchBounds(Landroid/graphics/Rect;)Landroid/app/ActivityOptions;\" since=\"24\"/>\n\t\t<method name=\"setLaunchDisplayId(I)Landroid/app/ActivityOptions;\" since=\"26\"/>\n\t\t<method name=\"setLockTaskEnabled(Z)Landroid/app/ActivityOptions;\" since=\"28\"/>\n\t\t<method name=\"toBundle()Landroid/os/Bundle;\"/>\n\t\t<method name=\"update(Landroid/app/ActivityOptions;)V\"/>\n\t\t<field name=\"EXTRA_USAGE_TIME_REPORT\" since=\"23\"/>\n\t\t<field name=\"EXTRA_USAGE_TIME_REPORT_PACKAGES\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/app/AlarmManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"cancel(Landroid/app/AlarmManager$OnAlarmListener;)V\" since=\"24\"/>\n\t\t<method name=\"cancel(Landroid/app/PendingIntent;)V\"/>\n\t\t<method name=\"getNextAlarmClock()Landroid/app/AlarmManager$AlarmClockInfo;\" since=\"21\"/>\n\t\t<method name=\"set(IJLandroid/app/PendingIntent;)V\"/>\n\t\t<method name=\"set(IJLjava/lang/String;Landroid/app/AlarmManager$OnAlarmListener;Landroid/os/Handler;)V\" since=\"24\"/>\n\t\t<method name=\"setAlarmClock(Landroid/app/AlarmManager$AlarmClockInfo;Landroid/app/PendingIntent;)V\" since=\"21\"/>\n\t\t<method name=\"setAndAllowWhileIdle(IJLandroid/app/PendingIntent;)V\" since=\"23\"/>\n\t\t<method name=\"setExact(IJLandroid/app/PendingIntent;)V\" since=\"19\"/>\n\t\t<method name=\"setExact(IJLjava/lang/String;Landroid/app/AlarmManager$OnAlarmListener;Landroid/os/Handler;)V\" since=\"24\"/>\n\t\t<method name=\"setExactAndAllowWhileIdle(IJLandroid/app/PendingIntent;)V\" since=\"23\"/>\n\t\t<method name=\"setInexactRepeating(IJJLandroid/app/PendingIntent;)V\" since=\"3\"/>\n\t\t<method name=\"setRepeating(IJJLandroid/app/PendingIntent;)V\"/>\n\t\t<method name=\"setTime(J)V\" since=\"8\"/>\n\t\t<method name=\"setTimeZone(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setWindow(IJJLandroid/app/PendingIntent;)V\" since=\"19\"/>\n\t\t<method name=\"setWindow(IJJLjava/lang/String;Landroid/app/AlarmManager$OnAlarmListener;Landroid/os/Handler;)V\" since=\"24\"/>\n\t\t<field name=\"ACTION_NEXT_ALARM_CLOCK_CHANGED\" since=\"21\"/>\n\t\t<field name=\"ELAPSED_REALTIME\"/>\n\t\t<field name=\"ELAPSED_REALTIME_WAKEUP\"/>\n\t\t<field name=\"INTERVAL_DAY\" since=\"3\"/>\n\t\t<field name=\"INTERVAL_FIFTEEN_MINUTES\" since=\"3\"/>\n\t\t<field name=\"INTERVAL_HALF_DAY\" since=\"3\"/>\n\t\t<field name=\"INTERVAL_HALF_HOUR\" since=\"3\"/>\n\t\t<field name=\"INTERVAL_HOUR\" since=\"3\"/>\n\t\t<field name=\"RTC\"/>\n\t\t<field name=\"RTC_WAKEUP\"/>\n\t</class>\n\t<class name=\"android/app/AlarmManager$AlarmClockInfo\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(JLandroid/app/PendingIntent;)V\"/>\n\t\t<method name=\"getShowIntent()Landroid/app/PendingIntent;\"/>\n\t\t<method name=\"getTriggerTime()J\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/AlarmManager$OnAlarmListener\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onAlarm()V\"/>\n\t</class>\n\t<class name=\"android/app/AlertDialog\" since=\"1\">\n\t\t<extends name=\"android/app/Dialog\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;ZLandroid/content/DialogInterface$OnCancelListener;)V\"/>\n\t\t<method name=\"getButton(I)Landroid/widget/Button;\" since=\"3\"/>\n\t\t<method name=\"getListView()Landroid/widget/ListView;\" since=\"3\"/>\n\t\t<method name=\"setButton(ILjava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)V\" since=\"3\"/>\n\t\t<method name=\"setButton(ILjava/lang/CharSequence;Landroid/os/Message;)V\" since=\"3\"/>\n\t\t<method name=\"setButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)V\" deprecated=\"15\"/>\n\t\t<method name=\"setButton(Ljava/lang/CharSequence;Landroid/os/Message;)V\" deprecated=\"15\"/>\n\t\t<method name=\"setButton2(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)V\" deprecated=\"15\"/>\n\t\t<method name=\"setButton2(Ljava/lang/CharSequence;Landroid/os/Message;)V\" deprecated=\"15\"/>\n\t\t<method name=\"setButton3(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)V\" deprecated=\"15\"/>\n\t\t<method name=\"setButton3(Ljava/lang/CharSequence;Landroid/os/Message;)V\" deprecated=\"15\"/>\n\t\t<method name=\"setCustomTitle(Landroid/view/View;)V\"/>\n\t\t<method name=\"setIcon(I)V\"/>\n\t\t<method name=\"setIcon(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setIconAttribute(I)V\" since=\"11\"/>\n\t\t<method name=\"setInverseBackgroundForced(Z)V\"/>\n\t\t<method name=\"setMessage(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setView(Landroid/view/View;)V\"/>\n\t\t<method name=\"setView(Landroid/view/View;IIII)V\" since=\"3\"/>\n\t\t<field name=\"THEME_DEVICE_DEFAULT_DARK\" since=\"14\" deprecated=\"23\"/>\n\t\t<field name=\"THEME_DEVICE_DEFAULT_LIGHT\" since=\"14\" deprecated=\"23\"/>\n\t\t<field name=\"THEME_HOLO_DARK\" since=\"11\" deprecated=\"23\"/>\n\t\t<field name=\"THEME_HOLO_LIGHT\" since=\"11\" deprecated=\"23\"/>\n\t\t<field name=\"THEME_TRADITIONAL\" since=\"11\" deprecated=\"23\"/>\n\t</class>\n\t<class name=\"android/app/AlertDialog$Builder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;I)V\" since=\"11\"/>\n\t\t<method name=\"create()Landroid/app/AlertDialog;\"/>\n\t\t<method name=\"getContext()Landroid/content/Context;\" since=\"11\"/>\n\t\t<method name=\"setAdapter(Landroid/widget/ListAdapter;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setCancelable(Z)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setCursor(Landroid/database/Cursor;Landroid/content/DialogInterface$OnClickListener;Ljava/lang/String;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setCustomTitle(Landroid/view/View;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setIcon(I)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setIcon(Landroid/graphics/drawable/Drawable;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setIconAttribute(I)Landroid/app/AlertDialog$Builder;\" since=\"11\"/>\n\t\t<method name=\"setInverseBackgroundForced(Z)Landroid/app/AlertDialog$Builder;\" deprecated=\"23\"/>\n\t\t<method name=\"setItems(ILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setItems([Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setMessage(I)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setMessage(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setMultiChoiceItems(I[ZLandroid/content/DialogInterface$OnMultiChoiceClickListener;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setMultiChoiceItems(Landroid/database/Cursor;Ljava/lang/String;Ljava/lang/String;Landroid/content/DialogInterface$OnMultiChoiceClickListener;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setMultiChoiceItems([Ljava/lang/CharSequence;[ZLandroid/content/DialogInterface$OnMultiChoiceClickListener;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setNegativeButton(ILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setNegativeButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setNeutralButton(ILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setNeutralButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setOnCancelListener(Landroid/content/DialogInterface$OnCancelListener;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setOnDismissListener(Landroid/content/DialogInterface$OnDismissListener;)Landroid/app/AlertDialog$Builder;\" since=\"17\"/>\n\t\t<method name=\"setOnItemSelectedListener(Landroid/widget/AdapterView$OnItemSelectedListener;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setOnKeyListener(Landroid/content/DialogInterface$OnKeyListener;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setPositiveButton(ILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setPositiveButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setSingleChoiceItems(IILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setSingleChoiceItems(Landroid/database/Cursor;ILjava/lang/String;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setSingleChoiceItems(Landroid/widget/ListAdapter;ILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setSingleChoiceItems([Ljava/lang/CharSequence;ILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setTitle(I)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setTitle(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"setView(I)Landroid/app/AlertDialog$Builder;\" since=\"21\"/>\n\t\t<method name=\"setView(Landroid/view/View;)Landroid/app/AlertDialog$Builder;\"/>\n\t\t<method name=\"show()Landroid/app/AlertDialog;\"/>\n\t</class>\n\t<class name=\"android/app/AliasActivity\" since=\"1\" deprecated=\"30\">\n\t\t<extends name=\"android/app/Activity\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/app/AppComponentFactory\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"instantiateActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity;\"/>\n\t\t<method name=\"instantiateApplication(Ljava/lang/ClassLoader;Ljava/lang/String;)Landroid/app/Application;\"/>\n\t\t<method name=\"instantiateClassLoader(Ljava/lang/ClassLoader;Landroid/content/pm/ApplicationInfo;)Ljava/lang/ClassLoader;\" since=\"29\"/>\n\t\t<method name=\"instantiateProvider(Ljava/lang/ClassLoader;Ljava/lang/String;)Landroid/content/ContentProvider;\"/>\n\t\t<method name=\"instantiateReceiver(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/content/BroadcastReceiver;\"/>\n\t\t<method name=\"instantiateService(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Service;\"/>\n\t</class>\n\t<class name=\"android/app/AppOpsManager\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"checkOp(Ljava/lang/String;ILjava/lang/String;)I\" deprecated=\"29\"/>\n\t\t<method name=\"checkOpNoThrow(Ljava/lang/String;ILjava/lang/String;)I\" deprecated=\"29\"/>\n\t\t<method name=\"checkPackage(ILjava/lang/String;)V\"/>\n\t\t<method name=\"finishOp(Ljava/lang/String;ILjava/lang/String;)V\"/>\n\t\t<method name=\"noteOp(Ljava/lang/String;ILjava/lang/String;)I\"/>\n\t\t<method name=\"noteOpNoThrow(Ljava/lang/String;ILjava/lang/String;)I\"/>\n\t\t<method name=\"noteProxyOp(Ljava/lang/String;Ljava/lang/String;)I\" since=\"23\"/>\n\t\t<method name=\"noteProxyOpNoThrow(Ljava/lang/String;Ljava/lang/String;)I\" since=\"23\"/>\n\t\t<method name=\"noteProxyOpNoThrow(Ljava/lang/String;Ljava/lang/String;I)I\" since=\"29\"/>\n\t\t<method name=\"permissionToOp(Ljava/lang/String;)Ljava/lang/String;\" since=\"23\"/>\n\t\t<method name=\"startOp(Ljava/lang/String;ILjava/lang/String;)I\"/>\n\t\t<method name=\"startOpNoThrow(Ljava/lang/String;ILjava/lang/String;)I\"/>\n\t\t<method name=\"startWatchingMode(Ljava/lang/String;Ljava/lang/String;ILandroid/app/AppOpsManager$OnOpChangedListener;)V\" since=\"29\"/>\n\t\t<method name=\"startWatchingMode(Ljava/lang/String;Ljava/lang/String;Landroid/app/AppOpsManager$OnOpChangedListener;)V\"/>\n\t\t<method name=\"stopWatchingMode(Landroid/app/AppOpsManager$OnOpChangedListener;)V\"/>\n\t\t<method name=\"unsafeCheckOp(Ljava/lang/String;ILjava/lang/String;)I\" since=\"29\"/>\n\t\t<method name=\"unsafeCheckOpNoThrow(Ljava/lang/String;ILjava/lang/String;)I\" since=\"29\"/>\n\t\t<method name=\"unsafeCheckOpRaw(Ljava/lang/String;ILjava/lang/String;)I\" since=\"29\"/>\n\t\t<method name=\"unsafeCheckOpRawNoThrow(Ljava/lang/String;ILjava/lang/String;)I\" since=\"29\"/>\n\t\t<field name=\"MODE_ALLOWED\"/>\n\t\t<field name=\"MODE_DEFAULT\" since=\"21\"/>\n\t\t<field name=\"MODE_ERRORED\"/>\n\t\t<field name=\"MODE_FOREGROUND\" since=\"29\"/>\n\t\t<field name=\"MODE_IGNORED\"/>\n\t\t<field name=\"OPSTR_ADD_VOICEMAIL\" since=\"23\"/>\n\t\t<field name=\"OPSTR_ANSWER_PHONE_CALLS\" since=\"26\"/>\n\t\t<field name=\"OPSTR_BODY_SENSORS\" since=\"23\"/>\n\t\t<field name=\"OPSTR_CALL_PHONE\" since=\"23\"/>\n\t\t<field name=\"OPSTR_CAMERA\" since=\"23\"/>\n\t\t<field name=\"OPSTR_COARSE_LOCATION\"/>\n\t\t<field name=\"OPSTR_FINE_LOCATION\"/>\n\t\t<field name=\"OPSTR_GET_USAGE_STATS\" since=\"21\"/>\n\t\t<field name=\"OPSTR_MOCK_LOCATION\" since=\"23\"/>\n\t\t<field name=\"OPSTR_MONITOR_HIGH_POWER_LOCATION\"/>\n\t\t<field name=\"OPSTR_MONITOR_LOCATION\"/>\n\t\t<field name=\"OPSTR_PICTURE_IN_PICTURE\" since=\"26\"/>\n\t\t<field name=\"OPSTR_PROCESS_OUTGOING_CALLS\" since=\"26\"/>\n\t\t<field name=\"OPSTR_READ_CALENDAR\" since=\"23\"/>\n\t\t<field name=\"OPSTR_READ_CALL_LOG\" since=\"23\"/>\n\t\t<field name=\"OPSTR_READ_CELL_BROADCASTS\" since=\"23\"/>\n\t\t<field name=\"OPSTR_READ_CONTACTS\" since=\"23\"/>\n\t\t<field name=\"OPSTR_READ_EXTERNAL_STORAGE\" since=\"23\"/>\n\t\t<field name=\"OPSTR_READ_PHONE_NUMBERS\" since=\"26\"/>\n\t\t<field name=\"OPSTR_READ_PHONE_STATE\" since=\"23\"/>\n\t\t<field name=\"OPSTR_READ_SMS\" since=\"23\"/>\n\t\t<field name=\"OPSTR_RECEIVE_MMS\" since=\"23\"/>\n\t\t<field name=\"OPSTR_RECEIVE_SMS\" since=\"23\"/>\n\t\t<field name=\"OPSTR_RECEIVE_WAP_PUSH\" since=\"23\"/>\n\t\t<field name=\"OPSTR_RECORD_AUDIO\" since=\"23\"/>\n\t\t<field name=\"OPSTR_SEND_SMS\" since=\"23\"/>\n\t\t<field name=\"OPSTR_SYSTEM_ALERT_WINDOW\" since=\"23\"/>\n\t\t<field name=\"OPSTR_USE_FINGERPRINT\" since=\"23\"/>\n\t\t<field name=\"OPSTR_USE_SIP\" since=\"23\"/>\n\t\t<field name=\"OPSTR_WRITE_CALENDAR\" since=\"23\"/>\n\t\t<field name=\"OPSTR_WRITE_CALL_LOG\" since=\"23\"/>\n\t\t<field name=\"OPSTR_WRITE_CONTACTS\" since=\"23\"/>\n\t\t<field name=\"OPSTR_WRITE_EXTERNAL_STORAGE\" since=\"23\"/>\n\t\t<field name=\"OPSTR_WRITE_SETTINGS\" since=\"23\"/>\n\t\t<field name=\"WATCH_FOREGROUND_CHANGES\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/app/AppOpsManager$OnOpChangedListener\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onOpChanged(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/app/Application\" since=\"1\">\n\t\t<extends name=\"android/content/ContextWrapper\"/>\n\t\t<implements name=\"android/content/ComponentCallbacks\" removed=\"14\"/>\n\t\t<implements name=\"android/content/ComponentCallbacks2\" since=\"14\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getProcessName()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"onCreate()V\"/>\n\t\t<method name=\"onTerminate()V\"/>\n\t\t<method name=\"registerActivityLifecycleCallbacks(Landroid/app/Application$ActivityLifecycleCallbacks;)V\" since=\"14\"/>\n\t\t<method name=\"registerOnProvideAssistDataListener(Landroid/app/Application$OnProvideAssistDataListener;)V\" since=\"18\"/>\n\t\t<method name=\"unregisterActivityLifecycleCallbacks(Landroid/app/Application$ActivityLifecycleCallbacks;)V\" since=\"14\"/>\n\t\t<method name=\"unregisterOnProvideAssistDataListener(Landroid/app/Application$OnProvideAssistDataListener;)V\" since=\"18\"/>\n\t</class>\n\t<class name=\"android/app/Application$ActivityLifecycleCallbacks\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onActivityDestroyed(Landroid/app/Activity;)V\"/>\n\t\t<method name=\"onActivityPaused(Landroid/app/Activity;)V\"/>\n\t\t<method name=\"onActivityPostCreated(Landroid/app/Activity;Landroid/os/Bundle;)V\" since=\"29\"/>\n\t\t<method name=\"onActivityPostDestroyed(Landroid/app/Activity;)V\" since=\"29\"/>\n\t\t<method name=\"onActivityPostPaused(Landroid/app/Activity;)V\" since=\"29\"/>\n\t\t<method name=\"onActivityPostResumed(Landroid/app/Activity;)V\" since=\"29\"/>\n\t\t<method name=\"onActivityPostSaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V\" since=\"29\"/>\n\t\t<method name=\"onActivityPostStarted(Landroid/app/Activity;)V\" since=\"29\"/>\n\t\t<method name=\"onActivityPostStopped(Landroid/app/Activity;)V\" since=\"29\"/>\n\t\t<method name=\"onActivityPreCreated(Landroid/app/Activity;Landroid/os/Bundle;)V\" since=\"29\"/>\n\t\t<method name=\"onActivityPreDestroyed(Landroid/app/Activity;)V\" since=\"29\"/>\n\t\t<method name=\"onActivityPrePaused(Landroid/app/Activity;)V\" since=\"29\"/>\n\t\t<method name=\"onActivityPreResumed(Landroid/app/Activity;)V\" since=\"29\"/>\n\t\t<method name=\"onActivityPreSaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V\" since=\"29\"/>\n\t\t<method name=\"onActivityPreStarted(Landroid/app/Activity;)V\" since=\"29\"/>\n\t\t<method name=\"onActivityPreStopped(Landroid/app/Activity;)V\" since=\"29\"/>\n\t\t<method name=\"onActivityResumed(Landroid/app/Activity;)V\"/>\n\t\t<method name=\"onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onActivityStarted(Landroid/app/Activity;)V\"/>\n\t\t<method name=\"onActivityStopped(Landroid/app/Activity;)V\"/>\n\t</class>\n\t<class name=\"android/app/Application$OnProvideAssistDataListener\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onProvideAssistData(Landroid/app/Activity;Landroid/os/Bundle;)V\"/>\n\t</class>\n\t<class name=\"android/app/ApplicationErrorReport\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"dump(Landroid/util/Printer;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getErrorReportReceiver(Landroid/content/Context;Ljava/lang/String;I)Landroid/content/ComponentName;\"/>\n\t\t<method name=\"readFromParcel(Landroid/os/Parcel;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"TYPE_ANR\"/>\n\t\t<field name=\"TYPE_BATTERY\"/>\n\t\t<field name=\"TYPE_CRASH\"/>\n\t\t<field name=\"TYPE_NONE\"/>\n\t\t<field name=\"TYPE_RUNNING_SERVICE\"/>\n\t\t<field name=\"anrInfo\"/>\n\t\t<field name=\"batteryInfo\"/>\n\t\t<field name=\"crashInfo\"/>\n\t\t<field name=\"installerPackageName\"/>\n\t\t<field name=\"packageName\"/>\n\t\t<field name=\"processName\"/>\n\t\t<field name=\"runningServiceInfo\"/>\n\t\t<field name=\"systemApp\"/>\n\t\t<field name=\"time\"/>\n\t\t<field name=\"type\"/>\n\t</class>\n\t<class name=\"android/app/ApplicationErrorReport$AnrInfo\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"dump(Landroid/util/Printer;Ljava/lang/String;)V\"/>\n\t\t<method name=\"writeToParcel(Landroid/os/Parcel;I)V\"/>\n\t\t<field name=\"activity\"/>\n\t\t<field name=\"cause\"/>\n\t\t<field name=\"info\"/>\n\t</class>\n\t<class name=\"android/app/ApplicationErrorReport$BatteryInfo\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"dump(Landroid/util/Printer;Ljava/lang/String;)V\"/>\n\t\t<method name=\"writeToParcel(Landroid/os/Parcel;I)V\"/>\n\t\t<field name=\"checkinDetails\"/>\n\t\t<field name=\"durationMicros\"/>\n\t\t<field name=\"usageDetails\"/>\n\t\t<field name=\"usagePercent\"/>\n\t</class>\n\t<class name=\"android/app/ApplicationErrorReport$CrashInfo\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"dump(Landroid/util/Printer;Ljava/lang/String;)V\"/>\n\t\t<method name=\"writeToParcel(Landroid/os/Parcel;I)V\"/>\n\t\t<field name=\"exceptionClassName\"/>\n\t\t<field name=\"exceptionMessage\"/>\n\t\t<field name=\"stackTrace\"/>\n\t\t<field name=\"throwClassName\"/>\n\t\t<field name=\"throwFileName\"/>\n\t\t<field name=\"throwLineNumber\"/>\n\t\t<field name=\"throwMethodName\"/>\n\t</class>\n\t<class name=\"android/app/ApplicationErrorReport$RunningServiceInfo\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"dump(Landroid/util/Printer;Ljava/lang/String;)V\"/>\n\t\t<method name=\"writeToParcel(Landroid/os/Parcel;I)V\"/>\n\t\t<field name=\"durationMillis\"/>\n\t\t<field name=\"serviceDetails\"/>\n\t</class>\n\t<class name=\"android/app/AuthenticationRequiredException\" since=\"26\">\n\t\t<extends name=\"java/lang/SecurityException\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;Landroid/app/PendingIntent;)V\"/>\n\t\t<method name=\"getUserAction()Landroid/app/PendingIntent;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/AutomaticZenRule\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Landroid/content/ComponentName;Landroid/content/ComponentName;Landroid/net/Uri;Landroid/service/notification/ZenPolicy;IZ)V\" since=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Landroid/content/ComponentName;Landroid/net/Uri;IZ)V\" deprecated=\"29\"/>\n\t\t<method name=\"getConditionId()Landroid/net/Uri;\"/>\n\t\t<method name=\"getConfigurationActivity()Landroid/content/ComponentName;\" since=\"29\"/>\n\t\t<method name=\"getCreationTime()J\"/>\n\t\t<method name=\"getInterruptionFilter()I\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getOwner()Landroid/content/ComponentName;\"/>\n\t\t<method name=\"getZenPolicy()Landroid/service/notification/ZenPolicy;\" since=\"29\"/>\n\t\t<method name=\"isEnabled()Z\"/>\n\t\t<method name=\"setConditionId(Landroid/net/Uri;)V\"/>\n\t\t<method name=\"setConfigurationActivity(Landroid/content/ComponentName;)V\" since=\"29\"/>\n\t\t<method name=\"setEnabled(Z)V\"/>\n\t\t<method name=\"setInterruptionFilter(I)V\"/>\n\t\t<method name=\"setName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setZenPolicy(Landroid/service/notification/ZenPolicy;)V\" since=\"29\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/DatePickerDialog\" since=\"1\">\n\t\t<extends name=\"android/app/AlertDialog\"/>\n\t\t<implements name=\"android/content/DialogInterface$OnClickListener\"/>\n\t\t<implements name=\"android/widget/DatePicker$OnDateChangedListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;I)V\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;ILandroid/app/DatePickerDialog$OnDateSetListener;III)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/app/DatePickerDialog$OnDateSetListener;III)V\"/>\n\t\t<method name=\"getDatePicker()Landroid/widget/DatePicker;\" since=\"11\"/>\n\t\t<method name=\"setOnDateSetListener(Landroid/app/DatePickerDialog$OnDateSetListener;)V\" since=\"24\"/>\n\t\t<method name=\"updateDate(III)V\"/>\n\t</class>\n\t<class name=\"android/app/DatePickerDialog$OnDateSetListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDateSet(Landroid/widget/DatePicker;III)V\"/>\n\t</class>\n\t<class name=\"android/app/Dialog\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/content/DialogInterface\"/>\n\t\t<implements name=\"android/view/KeyEvent$Callback\"/>\n\t\t<implements name=\"android/view/View$OnCreateContextMenuListener\"/>\n\t\t<implements name=\"android/view/Window$Callback\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;ZLandroid/content/DialogInterface$OnCancelListener;)V\"/>\n\t\t<method name=\"addContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"closeOptionsMenu()V\"/>\n\t\t<method name=\"create()V\" since=\"21\"/>\n\t\t<method name=\"findViewById(I)Landroid/view/View;\"/>\n\t\t<method name=\"getActionBar()Landroid/app/ActionBar;\" since=\"11\"/>\n\t\t<method name=\"getContext()Landroid/content/Context;\"/>\n\t\t<method name=\"getCurrentFocus()Landroid/view/View;\"/>\n\t\t<method name=\"getLayoutInflater()Landroid/view/LayoutInflater;\"/>\n\t\t<method name=\"getOwnerActivity()Landroid/app/Activity;\"/>\n\t\t<method name=\"getSearchEvent()Landroid/view/SearchEvent;\" since=\"23\"/>\n\t\t<method name=\"getVolumeControlStream()I\"/>\n\t\t<method name=\"getWindow()Landroid/view/Window;\"/>\n\t\t<method name=\"hide()V\"/>\n\t\t<method name=\"invalidateOptionsMenu()V\" since=\"11\"/>\n\t\t<method name=\"isShowing()Z\"/>\n\t\t<method name=\"onBackPressed()V\" since=\"5\"/>\n\t\t<method name=\"onContextItemSelected(Landroid/view/MenuItem;)Z\"/>\n\t\t<method name=\"onContextMenuClosed(Landroid/view/Menu;)V\"/>\n\t\t<method name=\"onCreate(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onCreateOptionsMenu(Landroid/view/Menu;)Z\"/>\n\t\t<method name=\"onGenericMotionEvent(Landroid/view/MotionEvent;)Z\" since=\"12\"/>\n\t\t<method name=\"onKeyShortcut(ILandroid/view/KeyEvent;)Z\" since=\"11\"/>\n\t\t<method name=\"onOptionsItemSelected(Landroid/view/MenuItem;)Z\"/>\n\t\t<method name=\"onOptionsMenuClosed(Landroid/view/Menu;)V\"/>\n\t\t<method name=\"onPrepareOptionsMenu(Landroid/view/Menu;)Z\"/>\n\t\t<method name=\"onRestoreInstanceState(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onSaveInstanceState()Landroid/os/Bundle;\"/>\n\t\t<method name=\"onStart()V\"/>\n\t\t<method name=\"onStop()V\"/>\n\t\t<method name=\"onTouchEvent(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"onTrackballEvent(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"openContextMenu(Landroid/view/View;)V\"/>\n\t\t<method name=\"openOptionsMenu()V\"/>\n\t\t<method name=\"registerForContextMenu(Landroid/view/View;)V\"/>\n\t\t<method name=\"requestWindowFeature(I)Z\"/>\n\t\t<method name=\"requireViewById(I)Landroid/view/View;\" since=\"28\"/>\n\t\t<method name=\"setCancelMessage(Landroid/os/Message;)V\"/>\n\t\t<method name=\"setCancelable(Z)V\"/>\n\t\t<method name=\"setCanceledOnTouchOutside(Z)V\"/>\n\t\t<method name=\"setContentView(I)V\"/>\n\t\t<method name=\"setContentView(Landroid/view/View;)V\"/>\n\t\t<method name=\"setContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"setDismissMessage(Landroid/os/Message;)V\"/>\n\t\t<method name=\"setFeatureDrawable(ILandroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setFeatureDrawableAlpha(II)V\"/>\n\t\t<method name=\"setFeatureDrawableResource(II)V\"/>\n\t\t<method name=\"setFeatureDrawableUri(ILandroid/net/Uri;)V\"/>\n\t\t<method name=\"setOnCancelListener(Landroid/content/DialogInterface$OnCancelListener;)V\"/>\n\t\t<method name=\"setOnDismissListener(Landroid/content/DialogInterface$OnDismissListener;)V\"/>\n\t\t<method name=\"setOnKeyListener(Landroid/content/DialogInterface$OnKeyListener;)V\"/>\n\t\t<method name=\"setOnShowListener(Landroid/content/DialogInterface$OnShowListener;)V\" since=\"8\"/>\n\t\t<method name=\"setOwnerActivity(Landroid/app/Activity;)V\"/>\n\t\t<method name=\"setTitle(I)V\"/>\n\t\t<method name=\"setTitle(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setVolumeControlStream(I)V\"/>\n\t\t<method name=\"show()V\"/>\n\t\t<method name=\"takeKeyEvents(Z)V\"/>\n\t\t<method name=\"unregisterForContextMenu(Landroid/view/View;)V\"/>\n\t</class>\n\t<class name=\"android/app/DialogFragment\" since=\"11\" deprecated=\"28\">\n\t\t<extends name=\"android/app/Fragment\"/>\n\t\t<implements name=\"android/content/DialogInterface$OnCancelListener\"/>\n\t\t<implements name=\"android/content/DialogInterface$OnDismissListener\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"dismiss()V\" deprecated=\"29\"/>\n\t\t<method name=\"dismissAllowingStateLoss()V\" since=\"12\" deprecated=\"29\"/>\n\t\t<method name=\"getDialog()Landroid/app/Dialog;\" deprecated=\"29\"/>\n\t\t<method name=\"getShowsDialog()Z\" deprecated=\"29\"/>\n\t\t<method name=\"getTheme()I\" deprecated=\"29\"/>\n\t\t<method name=\"isCancelable()Z\" deprecated=\"29\"/>\n\t\t<method name=\"onCreateDialog(Landroid/os/Bundle;)Landroid/app/Dialog;\" deprecated=\"29\"/>\n\t\t<method name=\"setCancelable(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setShowsDialog(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setStyle(II)V\" deprecated=\"29\"/>\n\t\t<method name=\"show(Landroid/app/FragmentManager;Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"show(Landroid/app/FragmentTransaction;Ljava/lang/String;)I\" deprecated=\"29\"/>\n\t\t<field name=\"STYLE_NORMAL\" deprecated=\"29\"/>\n\t\t<field name=\"STYLE_NO_FRAME\" deprecated=\"29\"/>\n\t\t<field name=\"STYLE_NO_INPUT\" deprecated=\"29\"/>\n\t\t<field name=\"STYLE_NO_TITLE\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/DirectAction\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\"/>\n\t\t<method name=\"getLocusId()Landroid/content/LocusId;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/DirectAction$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"build()Landroid/app/DirectAction;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/app/DirectAction$Builder;\"/>\n\t\t<method name=\"setLocusId(Landroid/content/LocusId;)Landroid/app/DirectAction$Builder;\"/>\n\t</class>\n\t<class name=\"android/app/DownloadManager\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addCompletedDownload(Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;JZ)J\" since=\"12\" deprecated=\"29\"/>\n\t\t<method name=\"addCompletedDownload(Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;JZLandroid/net/Uri;Landroid/net/Uri;)J\" since=\"24\" deprecated=\"29\"/>\n\t\t<method name=\"enqueue(Landroid/app/DownloadManager$Request;)J\"/>\n\t\t<method name=\"getMaxBytesOverMobile(Landroid/content/Context;)Ljava/lang/Long;\" since=\"11\"/>\n\t\t<method name=\"getMimeTypeForDownloadedFile(J)Ljava/lang/String;\" since=\"11\"/>\n\t\t<method name=\"getRecommendedMaxBytesOverMobile(Landroid/content/Context;)Ljava/lang/Long;\" since=\"11\"/>\n\t\t<method name=\"getUriForDownloadedFile(J)Landroid/net/Uri;\" since=\"11\"/>\n\t\t<method name=\"openDownloadedFile(J)Landroid/os/ParcelFileDescriptor;\"/>\n\t\t<method name=\"query(Landroid/app/DownloadManager$Query;)Landroid/database/Cursor;\"/>\n\t\t<method name=\"remove([J)I\"/>\n\t\t<field name=\"ACTION_DOWNLOAD_COMPLETE\"/>\n\t\t<field name=\"ACTION_NOTIFICATION_CLICKED\"/>\n\t\t<field name=\"ACTION_VIEW_DOWNLOADS\"/>\n\t\t<field name=\"COLUMN_BYTES_DOWNLOADED_SO_FAR\"/>\n\t\t<field name=\"COLUMN_DESCRIPTION\"/>\n\t\t<field name=\"COLUMN_ID\"/>\n\t\t<field name=\"COLUMN_LAST_MODIFIED_TIMESTAMP\"/>\n\t\t<field name=\"COLUMN_LOCAL_FILENAME\" since=\"11\" deprecated=\"24\"/>\n\t\t<field name=\"COLUMN_LOCAL_URI\"/>\n\t\t<field name=\"COLUMN_MEDIAPROVIDER_URI\"/>\n\t\t<field name=\"COLUMN_MEDIA_TYPE\"/>\n\t\t<field name=\"COLUMN_REASON\"/>\n\t\t<field name=\"COLUMN_STATUS\"/>\n\t\t<field name=\"COLUMN_TITLE\"/>\n\t\t<field name=\"COLUMN_TOTAL_SIZE_BYTES\"/>\n\t\t<field name=\"COLUMN_URI\"/>\n\t\t<field name=\"ERROR_CANNOT_RESUME\"/>\n\t\t<field name=\"ERROR_DEVICE_NOT_FOUND\"/>\n\t\t<field name=\"ERROR_FILE_ALREADY_EXISTS\"/>\n\t\t<field name=\"ERROR_FILE_ERROR\"/>\n\t\t<field name=\"ERROR_HTTP_DATA_ERROR\"/>\n\t\t<field name=\"ERROR_INSUFFICIENT_SPACE\"/>\n\t\t<field name=\"ERROR_TOO_MANY_REDIRECTS\"/>\n\t\t<field name=\"ERROR_UNHANDLED_HTTP_CODE\"/>\n\t\t<field name=\"ERROR_UNKNOWN\"/>\n\t\t<field name=\"EXTRA_DOWNLOAD_ID\"/>\n\t\t<field name=\"EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS\" since=\"11\"/>\n\t\t<field name=\"INTENT_EXTRAS_SORT_BY_SIZE\" since=\"12\"/>\n\t\t<field name=\"PAUSED_QUEUED_FOR_WIFI\"/>\n\t\t<field name=\"PAUSED_UNKNOWN\"/>\n\t\t<field name=\"PAUSED_WAITING_FOR_NETWORK\"/>\n\t\t<field name=\"PAUSED_WAITING_TO_RETRY\"/>\n\t\t<field name=\"STATUS_FAILED\"/>\n\t\t<field name=\"STATUS_PAUSED\"/>\n\t\t<field name=\"STATUS_PENDING\"/>\n\t\t<field name=\"STATUS_RUNNING\"/>\n\t\t<field name=\"STATUS_SUCCESSFUL\"/>\n\t</class>\n\t<class name=\"android/app/DownloadManager$Query\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"setFilterById([J)Landroid/app/DownloadManager$Query;\"/>\n\t\t<method name=\"setFilterByStatus(I)Landroid/app/DownloadManager$Query;\"/>\n\t</class>\n\t<class name=\"android/app/DownloadManager$Request\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/Uri;)V\"/>\n\t\t<method name=\"addRequestHeader(Ljava/lang/String;Ljava/lang/String;)Landroid/app/DownloadManager$Request;\"/>\n\t\t<method name=\"allowScanningByMediaScanner()V\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"setAllowedNetworkTypes(I)Landroid/app/DownloadManager$Request;\"/>\n\t\t<method name=\"setAllowedOverMetered(Z)Landroid/app/DownloadManager$Request;\" since=\"16\"/>\n\t\t<method name=\"setAllowedOverRoaming(Z)Landroid/app/DownloadManager$Request;\"/>\n\t\t<method name=\"setDescription(Ljava/lang/CharSequence;)Landroid/app/DownloadManager$Request;\"/>\n\t\t<method name=\"setDestinationInExternalFilesDir(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)Landroid/app/DownloadManager$Request;\"/>\n\t\t<method name=\"setDestinationInExternalPublicDir(Ljava/lang/String;Ljava/lang/String;)Landroid/app/DownloadManager$Request;\"/>\n\t\t<method name=\"setDestinationUri(Landroid/net/Uri;)Landroid/app/DownloadManager$Request;\"/>\n\t\t<method name=\"setMimeType(Ljava/lang/String;)Landroid/app/DownloadManager$Request;\"/>\n\t\t<method name=\"setNotificationVisibility(I)Landroid/app/DownloadManager$Request;\" since=\"11\"/>\n\t\t<method name=\"setRequiresCharging(Z)Landroid/app/DownloadManager$Request;\" since=\"24\"/>\n\t\t<method name=\"setRequiresDeviceIdle(Z)Landroid/app/DownloadManager$Request;\" since=\"24\"/>\n\t\t<method name=\"setShowRunningNotification(Z)Landroid/app/DownloadManager$Request;\" deprecated=\"15\"/>\n\t\t<method name=\"setTitle(Ljava/lang/CharSequence;)Landroid/app/DownloadManager$Request;\"/>\n\t\t<method name=\"setVisibleInDownloadsUi(Z)Landroid/app/DownloadManager$Request;\" deprecated=\"29\"/>\n\t\t<field name=\"NETWORK_MOBILE\"/>\n\t\t<field name=\"NETWORK_WIFI\"/>\n\t\t<field name=\"VISIBILITY_HIDDEN\" since=\"11\"/>\n\t\t<field name=\"VISIBILITY_VISIBLE\" since=\"11\"/>\n\t\t<field name=\"VISIBILITY_VISIBLE_NOTIFY_COMPLETED\" since=\"11\"/>\n\t\t<field name=\"VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION\" since=\"12\"/>\n\t</class>\n\t<class name=\"android/app/ExpandableListActivity\" since=\"1\" deprecated=\"30\">\n\t\t<extends name=\"android/app/Activity\"/>\n\t\t<implements name=\"android/widget/ExpandableListView$OnChildClickListener\"/>\n\t\t<implements name=\"android/widget/ExpandableListView$OnGroupCollapseListener\"/>\n\t\t<implements name=\"android/widget/ExpandableListView$OnGroupExpandListener\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"getExpandableListAdapter()Landroid/widget/ExpandableListAdapter;\" deprecated=\"30\"/>\n\t\t<method name=\"getExpandableListView()Landroid/widget/ExpandableListView;\" deprecated=\"30\"/>\n\t\t<method name=\"getSelectedId()J\" deprecated=\"30\"/>\n\t\t<method name=\"getSelectedPosition()J\" deprecated=\"30\"/>\n\t\t<method name=\"setListAdapter(Landroid/widget/ExpandableListAdapter;)V\" deprecated=\"30\"/>\n\t\t<method name=\"setSelectedChild(IIZ)Z\" deprecated=\"30\"/>\n\t\t<method name=\"setSelectedGroup(I)V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/app/Fragment\" since=\"11\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/content/ComponentCallbacks\" removed=\"14\"/>\n\t\t<implements name=\"android/content/ComponentCallbacks2\" since=\"14\"/>\n\t\t<implements name=\"android/view/View$OnCreateContextMenuListener\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"dump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"getActivity()Landroid/app/Activity;\" deprecated=\"29\"/>\n\t\t<method name=\"getAllowEnterTransitionOverlap()Z\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"getAllowReturnTransitionOverlap()Z\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"getArguments()Landroid/os/Bundle;\" deprecated=\"29\"/>\n\t\t<method name=\"getChildFragmentManager()Landroid/app/FragmentManager;\" since=\"17\" deprecated=\"29\"/>\n\t\t<method name=\"getContext()Landroid/content/Context;\" since=\"23\" deprecated=\"29\"/>\n\t\t<method name=\"getEnterTransition()Landroid/transition/Transition;\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"getExitTransition()Landroid/transition/Transition;\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"getFragmentManager()Landroid/app/FragmentManager;\" deprecated=\"29\"/>\n\t\t<method name=\"getHost()Ljava/lang/Object;\" since=\"23\" deprecated=\"29\"/>\n\t\t<method name=\"getId()I\" deprecated=\"29\"/>\n\t\t<method name=\"getLayoutInflater()Landroid/view/LayoutInflater;\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"getLoaderManager()Landroid/app/LoaderManager;\" deprecated=\"28\"/>\n\t\t<method name=\"getParentFragment()Landroid/app/Fragment;\" since=\"17\" deprecated=\"29\"/>\n\t\t<method name=\"getReenterTransition()Landroid/transition/Transition;\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"getResources()Landroid/content/res/Resources;\" deprecated=\"29\"/>\n\t\t<method name=\"getRetainInstance()Z\" deprecated=\"29\"/>\n\t\t<method name=\"getReturnTransition()Landroid/transition/Transition;\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"getSharedElementEnterTransition()Landroid/transition/Transition;\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"getSharedElementReturnTransition()Landroid/transition/Transition;\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"getString(I)Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getString(I[Ljava/lang/Object;)Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getTag()Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getTargetFragment()Landroid/app/Fragment;\" deprecated=\"29\"/>\n\t\t<method name=\"getTargetRequestCode()I\" deprecated=\"29\"/>\n\t\t<method name=\"getText(I)Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"getUserVisibleHint()Z\" since=\"15\" deprecated=\"29\"/>\n\t\t<method name=\"getView()Landroid/view/View;\" deprecated=\"29\"/>\n\t\t<method name=\"instantiate(Landroid/content/Context;Ljava/lang/String;)Landroid/app/Fragment;\" deprecated=\"29\"/>\n\t\t<method name=\"instantiate(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;)Landroid/app/Fragment;\" deprecated=\"29\"/>\n\t\t<method name=\"isAdded()Z\" deprecated=\"29\"/>\n\t\t<method name=\"isDetached()Z\" since=\"13\" deprecated=\"29\"/>\n\t\t<method name=\"isHidden()Z\" deprecated=\"29\"/>\n\t\t<method name=\"isInLayout()Z\" deprecated=\"29\"/>\n\t\t<method name=\"isRemoving()Z\" deprecated=\"29\"/>\n\t\t<method name=\"isResumed()Z\" deprecated=\"29\"/>\n\t\t<method name=\"isStateSaved()Z\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"isVisible()Z\" deprecated=\"29\"/>\n\t\t<method name=\"onActivityCreated(Landroid/os/Bundle;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onActivityResult(IILandroid/content/Intent;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onAttach(Landroid/app/Activity;)V\" deprecated=\"23\"/>\n\t\t<method name=\"onAttach(Landroid/content/Context;)V\" since=\"23\" deprecated=\"29\"/>\n\t\t<method name=\"onAttachFragment(Landroid/app/Fragment;)V\" since=\"24\" deprecated=\"29\"/>\n\t\t<method name=\"onContextItemSelected(Landroid/view/MenuItem;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"onCreate(Landroid/os/Bundle;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onCreateAnimator(IZI)Landroid/animation/Animator;\" deprecated=\"29\"/>\n\t\t<method name=\"onCreateOptionsMenu(Landroid/view/Menu;Landroid/view/MenuInflater;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onCreateView(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View;\" deprecated=\"29\"/>\n\t\t<method name=\"onDestroy()V\" deprecated=\"29\"/>\n\t\t<method name=\"onDestroyOptionsMenu()V\" deprecated=\"29\"/>\n\t\t<method name=\"onDestroyView()V\" deprecated=\"29\"/>\n\t\t<method name=\"onDetach()V\" deprecated=\"29\"/>\n\t\t<method name=\"onGetLayoutInflater(Landroid/os/Bundle;)Landroid/view/LayoutInflater;\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"onHiddenChanged(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"onInflate(Landroid/app/Activity;Landroid/util/AttributeSet;Landroid/os/Bundle;)V\" since=\"12\" deprecated=\"23\"/>\n\t\t<method name=\"onInflate(Landroid/content/Context;Landroid/util/AttributeSet;Landroid/os/Bundle;)V\" since=\"23\" deprecated=\"29\"/>\n\t\t<method name=\"onInflate(Landroid/util/AttributeSet;Landroid/os/Bundle;)V\" deprecated=\"15\"/>\n\t\t<method name=\"onMultiWindowModeChanged(Z)V\" since=\"24\" deprecated=\"26\"/>\n\t\t<method name=\"onMultiWindowModeChanged(ZLandroid/content/res/Configuration;)V\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"onOptionsItemSelected(Landroid/view/MenuItem;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"onOptionsMenuClosed(Landroid/view/Menu;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onPause()V\" deprecated=\"29\"/>\n\t\t<method name=\"onPictureInPictureModeChanged(Z)V\" since=\"24\" deprecated=\"26\"/>\n\t\t<method name=\"onPictureInPictureModeChanged(ZLandroid/content/res/Configuration;)V\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"onPrepareOptionsMenu(Landroid/view/Menu;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onRequestPermissionsResult(I[Ljava/lang/String;[I)V\" since=\"23\" deprecated=\"29\"/>\n\t\t<method name=\"onResume()V\" deprecated=\"29\"/>\n\t\t<method name=\"onSaveInstanceState(Landroid/os/Bundle;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onStart()V\" deprecated=\"29\"/>\n\t\t<method name=\"onStop()V\" deprecated=\"29\"/>\n\t\t<method name=\"onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V\" since=\"13\" deprecated=\"29\"/>\n\t\t<method name=\"onViewStateRestored(Landroid/os/Bundle;)V\" since=\"17\" deprecated=\"29\"/>\n\t\t<method name=\"postponeEnterTransition()V\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"registerForContextMenu(Landroid/view/View;)V\" deprecated=\"29\"/>\n\t\t<method name=\"requestPermissions([Ljava/lang/String;I)V\" since=\"23\" deprecated=\"29\"/>\n\t\t<method name=\"setAllowEnterTransitionOverlap(Z)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"setAllowReturnTransitionOverlap(Z)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"setArguments(Landroid/os/Bundle;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setEnterSharedElementCallback(Landroid/app/SharedElementCallback;)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"setEnterTransition(Landroid/transition/Transition;)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"setExitSharedElementCallback(Landroid/app/SharedElementCallback;)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"setExitTransition(Landroid/transition/Transition;)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"setHasOptionsMenu(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setInitialSavedState(Landroid/app/Fragment$SavedState;)V\" since=\"13\" deprecated=\"29\"/>\n\t\t<method name=\"setMenuVisibility(Z)V\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"setReenterTransition(Landroid/transition/Transition;)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"setRetainInstance(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setReturnTransition(Landroid/transition/Transition;)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"setSharedElementEnterTransition(Landroid/transition/Transition;)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"setSharedElementReturnTransition(Landroid/transition/Transition;)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"setTargetFragment(Landroid/app/Fragment;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setUserVisibleHint(Z)V\" since=\"15\" deprecated=\"29\"/>\n\t\t<method name=\"shouldShowRequestPermissionRationale(Ljava/lang/String;)Z\" since=\"23\" deprecated=\"29\"/>\n\t\t<method name=\"startActivity(Landroid/content/Intent;)V\" deprecated=\"29\"/>\n\t\t<method name=\"startActivity(Landroid/content/Intent;Landroid/os/Bundle;)V\" since=\"16\" deprecated=\"29\"/>\n\t\t<method name=\"startActivityForResult(Landroid/content/Intent;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"startActivityForResult(Landroid/content/Intent;ILandroid/os/Bundle;)V\" since=\"16\" deprecated=\"29\"/>\n\t\t<method name=\"startIntentSenderForResult(Landroid/content/IntentSender;ILandroid/content/Intent;IIILandroid/os/Bundle;)V\" since=\"24\" deprecated=\"29\"/>\n\t\t<method name=\"startPostponedEnterTransition()V\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"unregisterForContextMenu(Landroid/view/View;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/Fragment$InstantiationException\" since=\"11\" deprecated=\"28\">\n\t\t<extends name=\"android/util/AndroidRuntimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Exception;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/Fragment$SavedState\" since=\"13\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/FragmentBreadCrumbs\" since=\"11\" deprecated=\"21\">\n\t\t<extends name=\"android/view/ViewGroup\"/>\n\t\t<implements name=\"android/app/FragmentManager$OnBackStackChangedListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setActivity(Landroid/app/Activity;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setMaxVisible(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setOnBreadCrumbClickListener(Landroid/app/FragmentBreadCrumbs$OnBreadCrumbClickListener;)V\" since=\"12\" deprecated=\"29\"/>\n\t\t<method name=\"setParentTitle(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/view/View$OnClickListener;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setTitle(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/FragmentBreadCrumbs$OnBreadCrumbClickListener\" since=\"12\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onBreadCrumbClick(Landroid/app/FragmentManager$BackStackEntry;I)Z\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/FragmentContainer\" since=\"23\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"onFindViewById(I)Landroid/view/View;\" deprecated=\"29\"/>\n\t\t<method name=\"onHasView()Z\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/FragmentController\" since=\"23\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"attachHost(Landroid/app/Fragment;)V\" deprecated=\"29\"/>\n\t\t<method name=\"createController(Landroid/app/FragmentHostCallback;)Landroid/app/FragmentController;\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchActivityCreated()V\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchConfigurationChanged(Landroid/content/res/Configuration;)V\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchContextItemSelected(Landroid/view/MenuItem;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchCreate()V\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchCreateOptionsMenu(Landroid/view/Menu;Landroid/view/MenuInflater;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchDestroy()V\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchDestroyView()V\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchLowMemory()V\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchMultiWindowModeChanged(Z)V\" since=\"24\" deprecated=\"26\"/>\n\t\t<method name=\"dispatchMultiWindowModeChanged(ZLandroid/content/res/Configuration;)V\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchOptionsItemSelected(Landroid/view/MenuItem;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchOptionsMenuClosed(Landroid/view/Menu;)V\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchPause()V\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchPictureInPictureModeChanged(Z)V\" since=\"24\" deprecated=\"26\"/>\n\t\t<method name=\"dispatchPictureInPictureModeChanged(ZLandroid/content/res/Configuration;)V\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchPrepareOptionsMenu(Landroid/view/Menu;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchResume()V\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchStart()V\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchStop()V\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchTrimMemory(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"doLoaderDestroy()V\" deprecated=\"29\"/>\n\t\t<method name=\"doLoaderStart()V\" deprecated=\"29\"/>\n\t\t<method name=\"doLoaderStop(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"dumpLoaders(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"execPendingActions()Z\" deprecated=\"29\"/>\n\t\t<method name=\"findFragmentByWho(Ljava/lang/String;)Landroid/app/Fragment;\" deprecated=\"29\"/>\n\t\t<method name=\"getFragmentManager()Landroid/app/FragmentManager;\" deprecated=\"29\"/>\n\t\t<method name=\"getLoaderManager()Landroid/app/LoaderManager;\" deprecated=\"29\"/>\n\t\t<method name=\"noteStateNotSaved()V\" deprecated=\"29\"/>\n\t\t<method name=\"onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;\" deprecated=\"29\"/>\n\t\t<method name=\"reportLoaderStart()V\" deprecated=\"29\"/>\n\t\t<method name=\"restoreAllState(Landroid/os/Parcelable;Landroid/app/FragmentManagerNonConfig;)V\" since=\"24\" deprecated=\"29\"/>\n\t\t<method name=\"restoreAllState(Landroid/os/Parcelable;Ljava/util/List;)V\" deprecated=\"24\"/>\n\t\t<method name=\"restoreLoaderNonConfig(Landroid/util/ArrayMap;)V\" deprecated=\"29\"/>\n\t\t<method name=\"retainLoaderNonConfig()Landroid/util/ArrayMap;\" deprecated=\"29\"/>\n\t\t<method name=\"retainNestedNonConfig()Landroid/app/FragmentManagerNonConfig;\" since=\"24\" deprecated=\"29\"/>\n\t\t<method name=\"retainNonConfig()Ljava/util/List;\" deprecated=\"24\"/>\n\t\t<method name=\"saveAllState()Landroid/os/Parcelable;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/FragmentHostCallback\" since=\"23\" deprecated=\"28\">\n\t\t<extends name=\"android/app/FragmentContainer\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/os/Handler;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"onAttachFragment(Landroid/app/Fragment;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onDump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onGetHost()Ljava/lang/Object;\" deprecated=\"29\"/>\n\t\t<method name=\"onGetLayoutInflater()Landroid/view/LayoutInflater;\" deprecated=\"29\"/>\n\t\t<method name=\"onGetWindowAnimations()I\" deprecated=\"29\"/>\n\t\t<method name=\"onHasWindowAnimations()Z\" deprecated=\"29\"/>\n\t\t<method name=\"onInvalidateOptionsMenu()V\" deprecated=\"29\"/>\n\t\t<method name=\"onRequestPermissionsFromFragment(Landroid/app/Fragment;[Ljava/lang/String;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"onShouldSaveFragmentState(Landroid/app/Fragment;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"onStartActivityFromFragment(Landroid/app/Fragment;Landroid/content/Intent;ILandroid/os/Bundle;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onStartIntentSenderFromFragment(Landroid/app/Fragment;Landroid/content/IntentSender;ILandroid/content/Intent;IIILandroid/os/Bundle;)V\" since=\"24\" deprecated=\"29\"/>\n\t\t<method name=\"onUseFragmentManagerInflaterFactory()Z\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/FragmentManager\" since=\"11\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"addOnBackStackChangedListener(Landroid/app/FragmentManager$OnBackStackChangedListener;)V\" deprecated=\"29\"/>\n\t\t<method name=\"beginTransaction()Landroid/app/FragmentTransaction;\" deprecated=\"29\"/>\n\t\t<method name=\"dump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"enableDebugLogging(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"executePendingTransactions()Z\" deprecated=\"29\"/>\n\t\t<method name=\"findFragmentById(I)Landroid/app/Fragment;\" deprecated=\"29\"/>\n\t\t<method name=\"findFragmentByTag(Ljava/lang/String;)Landroid/app/Fragment;\" deprecated=\"29\"/>\n\t\t<method name=\"getBackStackEntryAt(I)Landroid/app/FragmentManager$BackStackEntry;\" deprecated=\"29\"/>\n\t\t<method name=\"getBackStackEntryCount()I\" deprecated=\"29\"/>\n\t\t<method name=\"getFragment(Landroid/os/Bundle;Ljava/lang/String;)Landroid/app/Fragment;\" deprecated=\"29\"/>\n\t\t<method name=\"getFragments()Ljava/util/List;\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"getPrimaryNavigationFragment()Landroid/app/Fragment;\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"invalidateOptionsMenu()V\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"isDestroyed()Z\" since=\"17\" deprecated=\"29\"/>\n\t\t<method name=\"isStateSaved()Z\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"popBackStack()V\" deprecated=\"29\"/>\n\t\t<method name=\"popBackStack(II)V\" deprecated=\"29\"/>\n\t\t<method name=\"popBackStack(Ljava/lang/String;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"popBackStackImmediate()Z\" deprecated=\"29\"/>\n\t\t<method name=\"popBackStackImmediate(II)Z\" deprecated=\"29\"/>\n\t\t<method name=\"popBackStackImmediate(Ljava/lang/String;I)Z\" deprecated=\"29\"/>\n\t\t<method name=\"putFragment(Landroid/os/Bundle;Ljava/lang/String;Landroid/app/Fragment;)V\" deprecated=\"29\"/>\n\t\t<method name=\"registerFragmentLifecycleCallbacks(Landroid/app/FragmentManager$FragmentLifecycleCallbacks;Z)V\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"removeOnBackStackChangedListener(Landroid/app/FragmentManager$OnBackStackChangedListener;)V\" deprecated=\"29\"/>\n\t\t<method name=\"saveFragmentInstanceState(Landroid/app/Fragment;)Landroid/app/Fragment$SavedState;\" since=\"13\" deprecated=\"29\"/>\n\t\t<method name=\"unregisterFragmentLifecycleCallbacks(Landroid/app/FragmentManager$FragmentLifecycleCallbacks;)V\" since=\"26\" deprecated=\"29\"/>\n\t\t<field name=\"POP_BACK_STACK_INCLUSIVE\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/FragmentManager$BackStackEntry\" since=\"11\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getBreadCrumbShortTitle()Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"getBreadCrumbShortTitleRes()I\" deprecated=\"29\"/>\n\t\t<method name=\"getBreadCrumbTitle()Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"getBreadCrumbTitleRes()I\" deprecated=\"29\"/>\n\t\t<method name=\"getId()I\" deprecated=\"29\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\" since=\"14\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/FragmentManager$FragmentLifecycleCallbacks\" since=\"26\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"onFragmentActivityCreated(Landroid/app/FragmentManager;Landroid/app/Fragment;Landroid/os/Bundle;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onFragmentAttached(Landroid/app/FragmentManager;Landroid/app/Fragment;Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onFragmentCreated(Landroid/app/FragmentManager;Landroid/app/Fragment;Landroid/os/Bundle;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onFragmentDestroyed(Landroid/app/FragmentManager;Landroid/app/Fragment;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onFragmentDetached(Landroid/app/FragmentManager;Landroid/app/Fragment;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onFragmentPaused(Landroid/app/FragmentManager;Landroid/app/Fragment;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onFragmentPreAttached(Landroid/app/FragmentManager;Landroid/app/Fragment;Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onFragmentPreCreated(Landroid/app/FragmentManager;Landroid/app/Fragment;Landroid/os/Bundle;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onFragmentResumed(Landroid/app/FragmentManager;Landroid/app/Fragment;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onFragmentSaveInstanceState(Landroid/app/FragmentManager;Landroid/app/Fragment;Landroid/os/Bundle;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onFragmentStarted(Landroid/app/FragmentManager;Landroid/app/Fragment;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onFragmentStopped(Landroid/app/FragmentManager;Landroid/app/Fragment;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onFragmentViewCreated(Landroid/app/FragmentManager;Landroid/app/Fragment;Landroid/view/View;Landroid/os/Bundle;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onFragmentViewDestroyed(Landroid/app/FragmentManager;Landroid/app/Fragment;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/FragmentManager$OnBackStackChangedListener\" since=\"11\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onBackStackChanged()V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/FragmentManagerNonConfig\" since=\"24\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/app/FragmentTransaction\" since=\"11\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"add(ILandroid/app/Fragment;)Landroid/app/FragmentTransaction;\" deprecated=\"29\"/>\n\t\t<method name=\"add(ILandroid/app/Fragment;Ljava/lang/String;)Landroid/app/FragmentTransaction;\" deprecated=\"29\"/>\n\t\t<method name=\"add(Landroid/app/Fragment;Ljava/lang/String;)Landroid/app/FragmentTransaction;\" deprecated=\"29\"/>\n\t\t<method name=\"addSharedElement(Landroid/view/View;Ljava/lang/String;)Landroid/app/FragmentTransaction;\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"addToBackStack(Ljava/lang/String;)Landroid/app/FragmentTransaction;\" deprecated=\"29\"/>\n\t\t<method name=\"attach(Landroid/app/Fragment;)Landroid/app/FragmentTransaction;\" since=\"13\" deprecated=\"29\"/>\n\t\t<method name=\"commit()I\" deprecated=\"29\"/>\n\t\t<method name=\"commitAllowingStateLoss()I\" deprecated=\"29\"/>\n\t\t<method name=\"commitNow()V\" since=\"24\" deprecated=\"29\"/>\n\t\t<method name=\"commitNowAllowingStateLoss()V\" since=\"24\" deprecated=\"29\"/>\n\t\t<method name=\"detach(Landroid/app/Fragment;)Landroid/app/FragmentTransaction;\" since=\"13\" deprecated=\"29\"/>\n\t\t<method name=\"disallowAddToBackStack()Landroid/app/FragmentTransaction;\" deprecated=\"29\"/>\n\t\t<method name=\"hide(Landroid/app/Fragment;)Landroid/app/FragmentTransaction;\" deprecated=\"29\"/>\n\t\t<method name=\"isAddToBackStackAllowed()Z\" deprecated=\"29\"/>\n\t\t<method name=\"isEmpty()Z\" deprecated=\"29\"/>\n\t\t<method name=\"remove(Landroid/app/Fragment;)Landroid/app/FragmentTransaction;\" deprecated=\"29\"/>\n\t\t<method name=\"replace(ILandroid/app/Fragment;)Landroid/app/FragmentTransaction;\" deprecated=\"29\"/>\n\t\t<method name=\"replace(ILandroid/app/Fragment;Ljava/lang/String;)Landroid/app/FragmentTransaction;\" deprecated=\"29\"/>\n\t\t<method name=\"runOnCommit(Ljava/lang/Runnable;)Landroid/app/FragmentTransaction;\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"setBreadCrumbShortTitle(I)Landroid/app/FragmentTransaction;\" deprecated=\"29\"/>\n\t\t<method name=\"setBreadCrumbShortTitle(Ljava/lang/CharSequence;)Landroid/app/FragmentTransaction;\" deprecated=\"29\"/>\n\t\t<method name=\"setBreadCrumbTitle(I)Landroid/app/FragmentTransaction;\" deprecated=\"29\"/>\n\t\t<method name=\"setBreadCrumbTitle(Ljava/lang/CharSequence;)Landroid/app/FragmentTransaction;\" deprecated=\"29\"/>\n\t\t<method name=\"setCustomAnimations(II)Landroid/app/FragmentTransaction;\" deprecated=\"29\"/>\n\t\t<method name=\"setCustomAnimations(IIII)Landroid/app/FragmentTransaction;\" since=\"13\" deprecated=\"29\"/>\n\t\t<method name=\"setPrimaryNavigationFragment(Landroid/app/Fragment;)Landroid/app/FragmentTransaction;\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"setReorderingAllowed(Z)Landroid/app/FragmentTransaction;\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"setTransition(I)Landroid/app/FragmentTransaction;\" deprecated=\"29\"/>\n\t\t<method name=\"setTransitionStyle(I)Landroid/app/FragmentTransaction;\" deprecated=\"29\"/>\n\t\t<method name=\"show(Landroid/app/Fragment;)Landroid/app/FragmentTransaction;\" deprecated=\"29\"/>\n\t\t<field name=\"TRANSIT_ENTER_MASK\" deprecated=\"29\"/>\n\t\t<field name=\"TRANSIT_EXIT_MASK\" deprecated=\"29\"/>\n\t\t<field name=\"TRANSIT_FRAGMENT_CLOSE\" deprecated=\"29\"/>\n\t\t<field name=\"TRANSIT_FRAGMENT_FADE\" deprecated=\"29\"/>\n\t\t<field name=\"TRANSIT_FRAGMENT_OPEN\" deprecated=\"29\"/>\n\t\t<field name=\"TRANSIT_NONE\" deprecated=\"29\"/>\n\t\t<field name=\"TRANSIT_UNSET\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/Instrumentation\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"acquireLooperManager(Landroid/os/Looper;)Landroid/os/TestLooperManager;\" since=\"26\"/>\n\t\t<method name=\"addMonitor(Landroid/app/Instrumentation$ActivityMonitor;)V\"/>\n\t\t<method name=\"addMonitor(Landroid/content/IntentFilter;Landroid/app/Instrumentation$ActivityResult;Z)Landroid/app/Instrumentation$ActivityMonitor;\"/>\n\t\t<method name=\"addMonitor(Ljava/lang/String;Landroid/app/Instrumentation$ActivityResult;Z)Landroid/app/Instrumentation$ActivityMonitor;\"/>\n\t\t<method name=\"addResults(Landroid/os/Bundle;)V\" since=\"26\"/>\n\t\t<method name=\"callActivityOnCreate(Landroid/app/Activity;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"callActivityOnCreate(Landroid/app/Activity;Landroid/os/Bundle;Landroid/os/PersistableBundle;)V\" since=\"21\"/>\n\t\t<method name=\"callActivityOnDestroy(Landroid/app/Activity;)V\"/>\n\t\t<method name=\"callActivityOnNewIntent(Landroid/app/Activity;Landroid/content/Intent;)V\"/>\n\t\t<method name=\"callActivityOnPause(Landroid/app/Activity;)V\"/>\n\t\t<method name=\"callActivityOnPostCreate(Landroid/app/Activity;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"callActivityOnPostCreate(Landroid/app/Activity;Landroid/os/Bundle;Landroid/os/PersistableBundle;)V\" since=\"21\"/>\n\t\t<method name=\"callActivityOnRestart(Landroid/app/Activity;)V\"/>\n\t\t<method name=\"callActivityOnRestoreInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"callActivityOnRestoreInstanceState(Landroid/app/Activity;Landroid/os/Bundle;Landroid/os/PersistableBundle;)V\" since=\"21\"/>\n\t\t<method name=\"callActivityOnResume(Landroid/app/Activity;)V\"/>\n\t\t<method name=\"callActivityOnSaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"callActivityOnSaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;Landroid/os/PersistableBundle;)V\" since=\"21\"/>\n\t\t<method name=\"callActivityOnStart(Landroid/app/Activity;)V\"/>\n\t\t<method name=\"callActivityOnStop(Landroid/app/Activity;)V\"/>\n\t\t<method name=\"callActivityOnUserLeaving(Landroid/app/Activity;)V\" since=\"3\"/>\n\t\t<method name=\"callApplicationOnCreate(Landroid/app/Application;)V\"/>\n\t\t<method name=\"checkMonitorHit(Landroid/app/Instrumentation$ActivityMonitor;I)Z\"/>\n\t\t<method name=\"endPerformanceSnapshot()V\"/>\n\t\t<method name=\"finish(ILandroid/os/Bundle;)V\"/>\n\t\t<method name=\"getAllocCounts()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getBinderCounts()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getComponentName()Landroid/content/ComponentName;\"/>\n\t\t<method name=\"getContext()Landroid/content/Context;\"/>\n\t\t<method name=\"getProcessName()Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getTargetContext()Landroid/content/Context;\"/>\n\t\t<method name=\"getUiAutomation()Landroid/app/UiAutomation;\" since=\"18\"/>\n\t\t<method name=\"getUiAutomation(I)Landroid/app/UiAutomation;\" since=\"24\"/>\n\t\t<method name=\"invokeContextMenuAction(Landroid/app/Activity;II)Z\"/>\n\t\t<method name=\"invokeMenuActionSync(Landroid/app/Activity;II)Z\"/>\n\t\t<method name=\"isProfiling()Z\"/>\n\t\t<method name=\"newActivity(Ljava/lang/Class;Landroid/content/Context;Landroid/os/IBinder;Landroid/app/Application;Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Ljava/lang/CharSequence;Landroid/app/Activity;Ljava/lang/String;Ljava/lang/Object;)Landroid/app/Activity;\"/>\n\t\t<method name=\"newActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity;\"/>\n\t\t<method name=\"newApplication(Ljava/lang/Class;Landroid/content/Context;)Landroid/app/Application;\"/>\n\t\t<method name=\"newApplication(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Context;)Landroid/app/Application;\"/>\n\t\t<method name=\"onCreate(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onDestroy()V\"/>\n\t\t<method name=\"onException(Ljava/lang/Object;Ljava/lang/Throwable;)Z\"/>\n\t\t<method name=\"onStart()V\"/>\n\t\t<method name=\"removeMonitor(Landroid/app/Instrumentation$ActivityMonitor;)V\"/>\n\t\t<method name=\"runOnMainSync(Ljava/lang/Runnable;)V\"/>\n\t\t<method name=\"sendCharacterSync(I)V\"/>\n\t\t<method name=\"sendKeyDownUpSync(I)V\"/>\n\t\t<method name=\"sendKeySync(Landroid/view/KeyEvent;)V\"/>\n\t\t<method name=\"sendPointerSync(Landroid/view/MotionEvent;)V\"/>\n\t\t<method name=\"sendStatus(ILandroid/os/Bundle;)V\"/>\n\t\t<method name=\"sendStringSync(Ljava/lang/String;)V\"/>\n\t\t<method name=\"sendTrackballEventSync(Landroid/view/MotionEvent;)V\"/>\n\t\t<method name=\"setAutomaticPerformanceSnapshots()V\"/>\n\t\t<method name=\"setInTouchMode(Z)V\"/>\n\t\t<method name=\"start()V\"/>\n\t\t<method name=\"startActivitySync(Landroid/content/Intent;)Landroid/app/Activity;\"/>\n\t\t<method name=\"startActivitySync(Landroid/content/Intent;Landroid/os/Bundle;)Landroid/app/Activity;\" since=\"28\"/>\n\t\t<method name=\"startAllocCounting()V\" deprecated=\"23\"/>\n\t\t<method name=\"startPerformanceSnapshot()V\"/>\n\t\t<method name=\"startProfiling()V\"/>\n\t\t<method name=\"stopAllocCounting()V\" deprecated=\"23\"/>\n\t\t<method name=\"stopProfiling()V\"/>\n\t\t<method name=\"waitForIdle(Ljava/lang/Runnable;)V\"/>\n\t\t<method name=\"waitForIdleSync()V\"/>\n\t\t<method name=\"waitForMonitor(Landroid/app/Instrumentation$ActivityMonitor;)Landroid/app/Activity;\"/>\n\t\t<method name=\"waitForMonitorWithTimeout(Landroid/app/Instrumentation$ActivityMonitor;J)Landroid/app/Activity;\"/>\n\t\t<field name=\"REPORT_KEY_IDENTIFIER\"/>\n\t\t<field name=\"REPORT_KEY_STREAMRESULT\"/>\n\t</class>\n\t<class name=\"android/app/Instrumentation$ActivityMonitor\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" since=\"26\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/IntentFilter;Landroid/app/Instrumentation$ActivityResult;Z)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Landroid/app/Instrumentation$ActivityResult;Z)V\"/>\n\t\t<method name=\"getFilter()Landroid/content/IntentFilter;\"/>\n\t\t<method name=\"getHits()I\"/>\n\t\t<method name=\"getLastActivity()Landroid/app/Activity;\"/>\n\t\t<method name=\"getResult()Landroid/app/Instrumentation$ActivityResult;\"/>\n\t\t<method name=\"isBlocking()Z\"/>\n\t\t<method name=\"onStartActivity(Landroid/content/Intent;)Landroid/app/Instrumentation$ActivityResult;\" since=\"26\"/>\n\t\t<method name=\"waitForActivity()Landroid/app/Activity;\"/>\n\t\t<method name=\"waitForActivityWithTimeout(J)Landroid/app/Activity;\"/>\n\t</class>\n\t<class name=\"android/app/Instrumentation$ActivityResult\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(ILandroid/content/Intent;)V\"/>\n\t\t<method name=\"getResultCode()I\"/>\n\t\t<method name=\"getResultData()Landroid/content/Intent;\"/>\n\t</class>\n\t<class name=\"android/app/IntentService\" since=\"3\" deprecated=\"30\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" deprecated=\"30\"/>\n\t\t<method name=\"onHandleIntent(Landroid/content/Intent;)V\" deprecated=\"30\"/>\n\t\t<method name=\"setIntentRedelivery(Z)V\" since=\"5\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/app/KeyguardManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createConfirmDeviceCredentialIntent(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Landroid/content/Intent;\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"exitKeyguardSecurely(Landroid/app/KeyguardManager$OnKeyguardExitResult;)V\" deprecated=\"15\"/>\n\t\t<method name=\"inKeyguardRestrictedInputMode()Z\" deprecated=\"28\"/>\n\t\t<method name=\"isDeviceLocked()Z\" since=\"22\"/>\n\t\t<method name=\"isDeviceSecure()Z\" since=\"23\"/>\n\t\t<method name=\"isKeyguardLocked()Z\" since=\"16\"/>\n\t\t<method name=\"isKeyguardSecure()Z\" since=\"16\"/>\n\t\t<method name=\"newKeyguardLock(Ljava/lang/String;)Landroid/app/KeyguardManager$KeyguardLock;\" deprecated=\"15\"/>\n\t\t<method name=\"requestDismissKeyguard(Landroid/app/Activity;Landroid/app/KeyguardManager$KeyguardDismissCallback;)V\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/app/KeyguardManager$KeyguardDismissCallback\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onDismissCancelled()V\"/>\n\t\t<method name=\"onDismissError()V\"/>\n\t\t<method name=\"onDismissSucceeded()V\"/>\n\t</class>\n\t<class name=\"android/app/KeyguardManager$KeyguardLock\" since=\"1\" deprecated=\"15\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"disableKeyguard()V\" deprecated=\"29\"/>\n\t\t<method name=\"reenableKeyguard()V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/KeyguardManager$OnKeyguardExitResult\" since=\"1\" deprecated=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onKeyguardExitResult(Z)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/LauncherActivity\" since=\"1\" deprecated=\"30\">\n\t\t<extends name=\"android/app/ListActivity\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"getTargetIntent()Landroid/content/Intent;\" deprecated=\"30\"/>\n\t\t<method name=\"intentForPosition(I)Landroid/content/Intent;\" since=\"3\" deprecated=\"30\"/>\n\t\t<method name=\"itemForPosition(I)Landroid/app/LauncherActivity$ListItem;\" since=\"4\" deprecated=\"30\"/>\n\t\t<method name=\"makeListItems()Ljava/util/List;\" since=\"3\" deprecated=\"30\"/>\n\t\t<method name=\"onQueryPackageManager(Landroid/content/Intent;)Ljava/util/List;\" since=\"5\" deprecated=\"30\"/>\n\t\t<method name=\"onSetContentView()V\" since=\"5\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/app/LauncherActivity$IconResizer\" since=\"3\" deprecated=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/LauncherActivity;)V\" deprecated=\"30\"/>\n\t\t<method name=\"createIconThumbnail(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable;\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/app/LauncherActivity$ListItem\" since=\"3\" deprecated=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<field name=\"className\" deprecated=\"30\"/>\n\t\t<field name=\"extras\" deprecated=\"30\"/>\n\t\t<field name=\"icon\" deprecated=\"30\"/>\n\t\t<field name=\"label\" deprecated=\"30\"/>\n\t\t<field name=\"packageName\" deprecated=\"30\"/>\n\t\t<field name=\"resolveInfo\" since=\"4\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/app/ListActivity\" since=\"1\" deprecated=\"30\">\n\t\t<extends name=\"android/app/Activity\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"getListAdapter()Landroid/widget/ListAdapter;\" deprecated=\"30\"/>\n\t\t<method name=\"getListView()Landroid/widget/ListView;\" deprecated=\"30\"/>\n\t\t<method name=\"getSelectedItemId()J\" deprecated=\"30\"/>\n\t\t<method name=\"getSelectedItemPosition()I\" deprecated=\"30\"/>\n\t\t<method name=\"onListItemClick(Landroid/widget/ListView;Landroid/view/View;IJ)V\" deprecated=\"30\"/>\n\t\t<method name=\"setListAdapter(Landroid/widget/ListAdapter;)V\" deprecated=\"30\"/>\n\t\t<method name=\"setSelection(I)V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/app/ListFragment\" since=\"11\" deprecated=\"28\">\n\t\t<extends name=\"android/app/Fragment\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"getListAdapter()Landroid/widget/ListAdapter;\" deprecated=\"29\"/>\n\t\t<method name=\"getListView()Landroid/widget/ListView;\" deprecated=\"29\"/>\n\t\t<method name=\"getSelectedItemId()J\" deprecated=\"29\"/>\n\t\t<method name=\"getSelectedItemPosition()I\" deprecated=\"29\"/>\n\t\t<method name=\"onListItemClick(Landroid/widget/ListView;Landroid/view/View;IJ)V\" deprecated=\"29\"/>\n\t\t<method name=\"setEmptyText(Ljava/lang/CharSequence;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setListAdapter(Landroid/widget/ListAdapter;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setListShown(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setListShownNoAnimation(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setSelection(I)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/LoaderManager\" since=\"11\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"destroyLoader(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"dump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"enableDebugLogging(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"getLoader(I)Landroid/content/Loader;\" deprecated=\"29\"/>\n\t\t<method name=\"initLoader(ILandroid/os/Bundle;Landroid/app/LoaderManager$LoaderCallbacks;)Landroid/content/Loader;\" deprecated=\"29\"/>\n\t\t<method name=\"restartLoader(ILandroid/os/Bundle;Landroid/app/LoaderManager$LoaderCallbacks;)Landroid/content/Loader;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/LoaderManager$LoaderCallbacks\" since=\"11\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onCreateLoader(ILandroid/os/Bundle;)Landroid/content/Loader;\" deprecated=\"29\"/>\n\t\t<method name=\"onLoadFinished(Landroid/content/Loader;Ljava/lang/Object;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onLoaderReset(Landroid/content/Loader;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/LocalActivityManager\" since=\"1\" deprecated=\"13\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/Activity;Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"destroyActivity(Ljava/lang/String;Z)Landroid/view/Window;\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchCreate(Landroid/os/Bundle;)V\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchDestroy(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchPause(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchResume()V\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchStop()V\" deprecated=\"29\"/>\n\t\t<method name=\"getActivity(Ljava/lang/String;)Landroid/app/Activity;\" deprecated=\"29\"/>\n\t\t<method name=\"getCurrentActivity()Landroid/app/Activity;\" deprecated=\"29\"/>\n\t\t<method name=\"getCurrentId()Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"removeAllActivities()V\" deprecated=\"29\"/>\n\t\t<method name=\"saveInstanceState()Landroid/os/Bundle;\" deprecated=\"29\"/>\n\t\t<method name=\"startActivity(Ljava/lang/String;Landroid/content/Intent;)Landroid/view/Window;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/MediaRouteActionProvider\" since=\"16\">\n\t\t<extends name=\"android/view/ActionProvider\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"setExtendedSettingsClickListener(Landroid/view/View$OnClickListener;)V\"/>\n\t\t<method name=\"setRouteTypes(I)V\"/>\n\t</class>\n\t<class name=\"android/app/MediaRouteButton\" since=\"16\">\n\t\t<extends name=\"android/view/View\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"getRouteTypes()I\"/>\n\t\t<method name=\"setExtendedSettingsClickListener(Landroid/view/View$OnClickListener;)V\"/>\n\t\t<method name=\"setRouteTypes(I)V\"/>\n\t\t<method name=\"showDialog()V\"/>\n\t</class>\n\t<class name=\"android/app/NativeActivity\" since=\"9\">\n\t\t<extends name=\"android/app/Activity\"/>\n\t\t<implements name=\"android/view/InputQueue$Callback\"/>\n\t\t<implements name=\"android/view/SurfaceHolder$Callback2\"/>\n\t\t<implements name=\"android/view/ViewTreeObserver$OnGlobalLayoutListener\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"META_DATA_FUNC_NAME\"/>\n\t\t<field name=\"META_DATA_LIB_NAME\"/>\n\t</class>\n\t<class name=\"android/app/Notification\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/CharSequence;J)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"clone()Landroid/app/Notification;\" since=\"9\"/>\n\t\t<method name=\"getAllowSystemGeneratedContextualActions()Z\" since=\"29\"/>\n\t\t<method name=\"getBadgeIconType()I\" since=\"26\"/>\n\t\t<method name=\"getBubbleMetadata()Landroid/app/Notification$BubbleMetadata;\" since=\"29\"/>\n\t\t<method name=\"getChannelId()Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getGroup()Ljava/lang/String;\" since=\"20\"/>\n\t\t<method name=\"getGroupAlertBehavior()I\" since=\"26\"/>\n\t\t<method name=\"getLargeIcon()Landroid/graphics/drawable/Icon;\" since=\"23\"/>\n\t\t<method name=\"getLocusId()Landroid/content/LocusId;\" since=\"29\"/>\n\t\t<method name=\"getSettingsText()Ljava/lang/CharSequence;\" since=\"26\"/>\n\t\t<method name=\"getShortcutId()Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getSmallIcon()Landroid/graphics/drawable/Icon;\" since=\"23\"/>\n\t\t<method name=\"getSortKey()Ljava/lang/String;\" since=\"20\"/>\n\t\t<method name=\"getTimeoutAfter()J\" since=\"26\"/>\n\t\t<method name=\"setLatestEventInfo(Landroid/content/Context;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/app/PendingIntent;)V\" deprecated=\"15\" removed=\"23\"/>\n\t\t<field name=\"AUDIO_ATTRIBUTES_DEFAULT\" since=\"21\"/>\n\t\t<field name=\"BADGE_ICON_LARGE\" since=\"26\"/>\n\t\t<field name=\"BADGE_ICON_NONE\" since=\"26\"/>\n\t\t<field name=\"BADGE_ICON_SMALL\" since=\"26\"/>\n\t\t<field name=\"CATEGORY_ALARM\" since=\"21\"/>\n\t\t<field name=\"CATEGORY_CALL\" since=\"21\"/>\n\t\t<field name=\"CATEGORY_EMAIL\" since=\"21\"/>\n\t\t<field name=\"CATEGORY_ERROR\" since=\"21\"/>\n\t\t<field name=\"CATEGORY_EVENT\" since=\"21\"/>\n\t\t<field name=\"CATEGORY_MESSAGE\" since=\"21\"/>\n\t\t<field name=\"CATEGORY_NAVIGATION\" since=\"28\"/>\n\t\t<field name=\"CATEGORY_PROGRESS\" since=\"21\"/>\n\t\t<field name=\"CATEGORY_PROMO\" since=\"21\"/>\n\t\t<field name=\"CATEGORY_RECOMMENDATION\" since=\"21\"/>\n\t\t<field name=\"CATEGORY_REMINDER\" since=\"23\"/>\n\t\t<field name=\"CATEGORY_SERVICE\" since=\"21\"/>\n\t\t<field name=\"CATEGORY_SOCIAL\" since=\"21\"/>\n\t\t<field name=\"CATEGORY_STATUS\" since=\"21\"/>\n\t\t<field name=\"CATEGORY_SYSTEM\" since=\"21\"/>\n\t\t<field name=\"CATEGORY_TRANSPORT\" since=\"21\"/>\n\t\t<field name=\"COLOR_DEFAULT\" since=\"21\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"DEFAULT_ALL\"/>\n\t\t<field name=\"DEFAULT_LIGHTS\"/>\n\t\t<field name=\"DEFAULT_SOUND\"/>\n\t\t<field name=\"DEFAULT_VIBRATE\"/>\n\t\t<field name=\"EXTRA_AUDIO_CONTENTS_URI\" since=\"26\"/>\n\t\t<field name=\"EXTRA_BACKGROUND_IMAGE_URI\" since=\"21\"/>\n\t\t<field name=\"EXTRA_BIG_TEXT\" since=\"21\"/>\n\t\t<field name=\"EXTRA_CHANNEL_GROUP_ID\" since=\"28\"/>\n\t\t<field name=\"EXTRA_CHANNEL_ID\" since=\"26\"/>\n\t\t<field name=\"EXTRA_CHRONOMETER_COUNT_DOWN\" since=\"24\"/>\n\t\t<field name=\"EXTRA_COLORIZED\" since=\"26\"/>\n\t\t<field name=\"EXTRA_COMPACT_ACTIONS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_CONVERSATION_TITLE\" since=\"24\"/>\n\t\t<field name=\"EXTRA_HISTORIC_MESSAGES\" since=\"26\"/>\n\t\t<field name=\"EXTRA_INFO_TEXT\" since=\"19\"/>\n\t\t<field name=\"EXTRA_IS_GROUP_CONVERSATION\" since=\"28\"/>\n\t\t<field name=\"EXTRA_LARGE_ICON\" since=\"19\" deprecated=\"26\"/>\n\t\t<field name=\"EXTRA_LARGE_ICON_BIG\" since=\"19\"/>\n\t\t<field name=\"EXTRA_MEDIA_SESSION\" since=\"21\"/>\n\t\t<field name=\"EXTRA_MESSAGES\" since=\"24\"/>\n\t\t<field name=\"EXTRA_MESSAGING_PERSON\" since=\"28\"/>\n\t\t<field name=\"EXTRA_NOTIFICATION_ID\" since=\"26\"/>\n\t\t<field name=\"EXTRA_NOTIFICATION_TAG\" since=\"26\"/>\n\t\t<field name=\"EXTRA_PEOPLE\" since=\"19\" deprecated=\"28\"/>\n\t\t<field name=\"EXTRA_PEOPLE_LIST\" since=\"28\"/>\n\t\t<field name=\"EXTRA_PICTURE\" since=\"19\"/>\n\t\t<field name=\"EXTRA_PROGRESS\" since=\"19\"/>\n\t\t<field name=\"EXTRA_PROGRESS_INDETERMINATE\" since=\"19\"/>\n\t\t<field name=\"EXTRA_PROGRESS_MAX\" since=\"19\"/>\n\t\t<field name=\"EXTRA_REMOTE_INPUT_DRAFT\" since=\"28\"/>\n\t\t<field name=\"EXTRA_REMOTE_INPUT_HISTORY\" since=\"24\"/>\n\t\t<field name=\"EXTRA_SELF_DISPLAY_NAME\" since=\"24\" deprecated=\"28\"/>\n\t\t<field name=\"EXTRA_SHOW_CHRONOMETER\" since=\"19\"/>\n\t\t<field name=\"EXTRA_SHOW_WHEN\" since=\"19\"/>\n\t\t<field name=\"EXTRA_SMALL_ICON\" since=\"19\" deprecated=\"26\"/>\n\t\t<field name=\"EXTRA_SUB_TEXT\" since=\"19\"/>\n\t\t<field name=\"EXTRA_SUMMARY_TEXT\" since=\"19\"/>\n\t\t<field name=\"EXTRA_TEMPLATE\" since=\"21\"/>\n\t\t<field name=\"EXTRA_TEXT\" since=\"19\"/>\n\t\t<field name=\"EXTRA_TEXT_LINES\" since=\"19\"/>\n\t\t<field name=\"EXTRA_TITLE\" since=\"19\"/>\n\t\t<field name=\"EXTRA_TITLE_BIG\" since=\"19\"/>\n\t\t<field name=\"FLAG_AUTO_CANCEL\"/>\n\t\t<field name=\"FLAG_BUBBLE\" since=\"29\"/>\n\t\t<field name=\"FLAG_FOREGROUND_SERVICE\" since=\"5\"/>\n\t\t<field name=\"FLAG_GROUP_SUMMARY\" since=\"20\"/>\n\t\t<field name=\"FLAG_HIGH_PRIORITY\" since=\"11\" deprecated=\"16\"/>\n\t\t<field name=\"FLAG_INSISTENT\"/>\n\t\t<field name=\"FLAG_LOCAL_ONLY\" since=\"20\"/>\n\t\t<field name=\"FLAG_NO_CLEAR\"/>\n\t\t<field name=\"FLAG_ONGOING_EVENT\"/>\n\t\t<field name=\"FLAG_ONLY_ALERT_ONCE\"/>\n\t\t<field name=\"FLAG_SHOW_LIGHTS\" deprecated=\"26\"/>\n\t\t<field name=\"GROUP_ALERT_ALL\" since=\"26\"/>\n\t\t<field name=\"GROUP_ALERT_CHILDREN\" since=\"26\"/>\n\t\t<field name=\"GROUP_ALERT_SUMMARY\" since=\"26\"/>\n\t\t<field name=\"INTENT_CATEGORY_NOTIFICATION_PREFERENCES\" since=\"21\"/>\n\t\t<field name=\"PRIORITY_DEFAULT\" since=\"16\" deprecated=\"26\"/>\n\t\t<field name=\"PRIORITY_HIGH\" since=\"16\" deprecated=\"26\"/>\n\t\t<field name=\"PRIORITY_LOW\" since=\"16\" deprecated=\"26\"/>\n\t\t<field name=\"PRIORITY_MAX\" since=\"16\" deprecated=\"26\"/>\n\t\t<field name=\"PRIORITY_MIN\" since=\"16\" deprecated=\"26\"/>\n\t\t<field name=\"STREAM_DEFAULT\" deprecated=\"21\"/>\n\t\t<field name=\"VISIBILITY_PRIVATE\" since=\"21\"/>\n\t\t<field name=\"VISIBILITY_PUBLIC\" since=\"21\"/>\n\t\t<field name=\"VISIBILITY_SECRET\" since=\"21\"/>\n\t\t<field name=\"actions\" since=\"19\"/>\n\t\t<field name=\"audioAttributes\" since=\"21\" deprecated=\"26\"/>\n\t\t<field name=\"audioStreamType\" deprecated=\"21\"/>\n\t\t<field name=\"bigContentView\" since=\"16\" deprecated=\"24\"/>\n\t\t<field name=\"category\" since=\"21\"/>\n\t\t<field name=\"color\" since=\"21\"/>\n\t\t<field name=\"contentIntent\"/>\n\t\t<field name=\"contentView\" deprecated=\"24\"/>\n\t\t<field name=\"defaults\" deprecated=\"26\"/>\n\t\t<field name=\"deleteIntent\"/>\n\t\t<field name=\"extras\" since=\"19\"/>\n\t\t<field name=\"flags\"/>\n\t\t<field name=\"fullScreenIntent\" since=\"9\"/>\n\t\t<field name=\"headsUpContentView\" since=\"21\" deprecated=\"24\"/>\n\t\t<field name=\"icon\" deprecated=\"23\"/>\n\t\t<field name=\"iconLevel\"/>\n\t\t<field name=\"largeIcon\" since=\"11\" deprecated=\"23\"/>\n\t\t<field name=\"ledARGB\" deprecated=\"26\"/>\n\t\t<field name=\"ledOffMS\" deprecated=\"26\"/>\n\t\t<field name=\"ledOnMS\" deprecated=\"26\"/>\n\t\t<field name=\"number\" deprecated=\"24\"/>\n\t\t<field name=\"priority\" since=\"16\" deprecated=\"26\"/>\n\t\t<field name=\"publicVersion\" since=\"21\"/>\n\t\t<field name=\"sound\" deprecated=\"26\"/>\n\t\t<field name=\"tickerText\"/>\n\t\t<field name=\"tickerView\" since=\"11\" deprecated=\"21\"/>\n\t\t<field name=\"vibrate\" deprecated=\"26\"/>\n\t\t<field name=\"visibility\" since=\"21\"/>\n\t\t<field name=\"when\"/>\n\t</class>\n\t<class name=\"android/app/Notification$Action\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/CharSequence;Landroid/app/PendingIntent;)V\" deprecated=\"23\"/>\n\t\t<method name=\"clone()Landroid/app/Notification$Action;\"/>\n\t\t<method name=\"getAllowGeneratedReplies()Z\" since=\"24\"/>\n\t\t<method name=\"getDataOnlyRemoteInputs()[Landroid/app/RemoteInput;\" since=\"26\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\" since=\"20\"/>\n\t\t<method name=\"getIcon()Landroid/graphics/drawable/Icon;\" since=\"23\"/>\n\t\t<method name=\"getRemoteInputs()[Landroid/app/RemoteInput;\" since=\"20\"/>\n\t\t<method name=\"getSemanticAction()I\" since=\"28\"/>\n\t\t<method name=\"isContextual()Z\" since=\"29\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"SEMANTIC_ACTION_ARCHIVE\" since=\"28\"/>\n\t\t<field name=\"SEMANTIC_ACTION_CALL\" since=\"28\"/>\n\t\t<field name=\"SEMANTIC_ACTION_DELETE\" since=\"28\"/>\n\t\t<field name=\"SEMANTIC_ACTION_MARK_AS_READ\" since=\"28\"/>\n\t\t<field name=\"SEMANTIC_ACTION_MARK_AS_UNREAD\" since=\"28\"/>\n\t\t<field name=\"SEMANTIC_ACTION_MUTE\" since=\"28\"/>\n\t\t<field name=\"SEMANTIC_ACTION_NONE\" since=\"28\"/>\n\t\t<field name=\"SEMANTIC_ACTION_REPLY\" since=\"28\"/>\n\t\t<field name=\"SEMANTIC_ACTION_THUMBS_DOWN\" since=\"28\"/>\n\t\t<field name=\"SEMANTIC_ACTION_THUMBS_UP\" since=\"28\"/>\n\t\t<field name=\"SEMANTIC_ACTION_UNMUTE\" since=\"28\"/>\n\t\t<field name=\"actionIntent\"/>\n\t\t<field name=\"icon\" deprecated=\"23\"/>\n\t\t<field name=\"title\"/>\n\t</class>\n\t<class name=\"android/app/Notification$Action$Builder\" since=\"20\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/CharSequence;Landroid/app/PendingIntent;)V\" deprecated=\"23\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/Notification$Action;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/drawable/Icon;Ljava/lang/CharSequence;Landroid/app/PendingIntent;)V\" since=\"23\"/>\n\t\t<method name=\"addExtras(Landroid/os/Bundle;)Landroid/app/Notification$Action$Builder;\"/>\n\t\t<method name=\"addRemoteInput(Landroid/app/RemoteInput;)Landroid/app/Notification$Action$Builder;\"/>\n\t\t<method name=\"build()Landroid/app/Notification$Action;\"/>\n\t\t<method name=\"extend(Landroid/app/Notification$Action$Extender;)Landroid/app/Notification$Action$Builder;\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"setAllowGeneratedReplies(Z)Landroid/app/Notification$Action$Builder;\" since=\"24\"/>\n\t\t<method name=\"setContextual(Z)Landroid/app/Notification$Action$Builder;\" since=\"29\"/>\n\t\t<method name=\"setSemanticAction(I)Landroid/app/Notification$Action$Builder;\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/app/Notification$Action$Extender\" since=\"20\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"extend(Landroid/app/Notification$Action$Builder;)Landroid/app/Notification$Action$Builder;\"/>\n\t</class>\n\t<class name=\"android/app/Notification$Action$WearableExtender\" since=\"20\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/app/Notification$Action$Extender\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/Notification$Action;)V\"/>\n\t\t<method name=\"clone()Landroid/app/Notification$Action$WearableExtender;\"/>\n\t\t<method name=\"getCancelLabel()Ljava/lang/CharSequence;\" since=\"22\" deprecated=\"28\"/>\n\t\t<method name=\"getConfirmLabel()Ljava/lang/CharSequence;\" since=\"22\" deprecated=\"28\"/>\n\t\t<method name=\"getHintDisplayActionInline()Z\" since=\"25\"/>\n\t\t<method name=\"getHintLaunchesActivity()Z\" since=\"24\"/>\n\t\t<method name=\"getInProgressLabel()Ljava/lang/CharSequence;\" since=\"22\" deprecated=\"28\"/>\n\t\t<method name=\"isAvailableOffline()Z\"/>\n\t\t<method name=\"setAvailableOffline(Z)Landroid/app/Notification$Action$WearableExtender;\"/>\n\t\t<method name=\"setCancelLabel(Ljava/lang/CharSequence;)Landroid/app/Notification$Action$WearableExtender;\" since=\"22\" deprecated=\"28\"/>\n\t\t<method name=\"setConfirmLabel(Ljava/lang/CharSequence;)Landroid/app/Notification$Action$WearableExtender;\" since=\"22\" deprecated=\"28\"/>\n\t\t<method name=\"setHintDisplayActionInline(Z)Landroid/app/Notification$Action$WearableExtender;\" since=\"25\"/>\n\t\t<method name=\"setHintLaunchesActivity(Z)Landroid/app/Notification$Action$WearableExtender;\" since=\"24\"/>\n\t\t<method name=\"setInProgressLabel(Ljava/lang/CharSequence;)Landroid/app/Notification$Action$WearableExtender;\" since=\"22\" deprecated=\"28\"/>\n\t</class>\n\t<class name=\"android/app/Notification$BigPictureStyle\" since=\"16\">\n\t\t<extends name=\"android/app/Notification$Style\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/Notification$Builder;)V\" deprecated=\"24\"/>\n\t\t<method name=\"bigLargeIcon(Landroid/graphics/Bitmap;)Landroid/app/Notification$BigPictureStyle;\"/>\n\t\t<method name=\"bigLargeIcon(Landroid/graphics/drawable/Icon;)Landroid/app/Notification$BigPictureStyle;\" since=\"23\"/>\n\t\t<method name=\"bigPicture(Landroid/graphics/Bitmap;)Landroid/app/Notification$BigPictureStyle;\"/>\n\t\t<method name=\"setBigContentTitle(Ljava/lang/CharSequence;)Landroid/app/Notification$BigPictureStyle;\"/>\n\t\t<method name=\"setSummaryText(Ljava/lang/CharSequence;)Landroid/app/Notification$BigPictureStyle;\"/>\n\t</class>\n\t<class name=\"android/app/Notification$BigTextStyle\" since=\"16\">\n\t\t<extends name=\"android/app/Notification$Style\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/Notification$Builder;)V\" deprecated=\"24\"/>\n\t\t<method name=\"bigText(Ljava/lang/CharSequence;)Landroid/app/Notification$BigTextStyle;\"/>\n\t\t<method name=\"setBigContentTitle(Ljava/lang/CharSequence;)Landroid/app/Notification$BigTextStyle;\"/>\n\t\t<method name=\"setSummaryText(Ljava/lang/CharSequence;)Landroid/app/Notification$BigTextStyle;\"/>\n\t</class>\n\t<class name=\"android/app/Notification$BubbleMetadata\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getAutoExpandBubble()Z\"/>\n\t\t<method name=\"getDeleteIntent()Landroid/app/PendingIntent;\"/>\n\t\t<method name=\"getDesiredHeight()I\"/>\n\t\t<method name=\"getDesiredHeightResId()I\"/>\n\t\t<method name=\"getIcon()Landroid/graphics/drawable/Icon;\"/>\n\t\t<method name=\"getIntent()Landroid/app/PendingIntent;\"/>\n\t\t<method name=\"isNotificationSuppressed()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/Notification$BubbleMetadata$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/app/Notification$BubbleMetadata;\"/>\n\t\t<method name=\"setAutoExpandBubble(Z)Landroid/app/Notification$BubbleMetadata$Builder;\"/>\n\t\t<method name=\"setDeleteIntent(Landroid/app/PendingIntent;)Landroid/app/Notification$BubbleMetadata$Builder;\"/>\n\t\t<method name=\"setDesiredHeight(I)Landroid/app/Notification$BubbleMetadata$Builder;\"/>\n\t\t<method name=\"setDesiredHeightResId(I)Landroid/app/Notification$BubbleMetadata$Builder;\"/>\n\t\t<method name=\"setIcon(Landroid/graphics/drawable/Icon;)Landroid/app/Notification$BubbleMetadata$Builder;\"/>\n\t\t<method name=\"setIntent(Landroid/app/PendingIntent;)Landroid/app/Notification$BubbleMetadata$Builder;\"/>\n\t\t<method name=\"setSuppressNotification(Z)Landroid/app/Notification$BubbleMetadata$Builder;\"/>\n\t</class>\n\t<class name=\"android/app/Notification$Builder\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"26\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/lang/String;)V\" since=\"26\"/>\n\t\t<method name=\"addAction(ILjava/lang/CharSequence;Landroid/app/PendingIntent;)Landroid/app/Notification$Builder;\" since=\"16\" deprecated=\"23\"/>\n\t\t<method name=\"addAction(Landroid/app/Notification$Action;)Landroid/app/Notification$Builder;\" since=\"20\"/>\n\t\t<method name=\"addExtras(Landroid/os/Bundle;)Landroid/app/Notification$Builder;\" since=\"20\"/>\n\t\t<method name=\"addPerson(Landroid/app/Person;)Landroid/app/Notification$Builder;\" since=\"28\"/>\n\t\t<method name=\"addPerson(Ljava/lang/String;)Landroid/app/Notification$Builder;\" since=\"21\" deprecated=\"28\"/>\n\t\t<method name=\"build()Landroid/app/Notification;\" since=\"16\"/>\n\t\t<method name=\"createBigContentView()Landroid/widget/RemoteViews;\" since=\"24\"/>\n\t\t<method name=\"createContentView()Landroid/widget/RemoteViews;\" since=\"24\"/>\n\t\t<method name=\"createHeadsUpContentView()Landroid/widget/RemoteViews;\" since=\"24\"/>\n\t\t<method name=\"extend(Landroid/app/Notification$Extender;)Landroid/app/Notification$Builder;\" since=\"20\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\" since=\"20\"/>\n\t\t<method name=\"getNotification()Landroid/app/Notification;\" deprecated=\"16\"/>\n\t\t<method name=\"getStyle()Landroid/app/Notification$Style;\" since=\"28\"/>\n\t\t<method name=\"recoverBuilder(Landroid/content/Context;Landroid/app/Notification;)Landroid/app/Notification$Builder;\" since=\"24\"/>\n\t\t<method name=\"setActions([Landroid/app/Notification$Action;)Landroid/app/Notification$Builder;\" since=\"24\"/>\n\t\t<method name=\"setAllowSystemGeneratedContextualActions(Z)Landroid/app/Notification$Builder;\" since=\"29\"/>\n\t\t<method name=\"setAutoCancel(Z)Landroid/app/Notification$Builder;\"/>\n\t\t<method name=\"setBadgeIconType(I)Landroid/app/Notification$Builder;\" since=\"26\"/>\n\t\t<method name=\"setBubbleMetadata(Landroid/app/Notification$BubbleMetadata;)Landroid/app/Notification$Builder;\" since=\"29\"/>\n\t\t<method name=\"setCategory(Ljava/lang/String;)Landroid/app/Notification$Builder;\" since=\"21\"/>\n\t\t<method name=\"setChannelId(Ljava/lang/String;)Landroid/app/Notification$Builder;\" since=\"26\"/>\n\t\t<method name=\"setChronometerCountDown(Z)Landroid/app/Notification$Builder;\" since=\"24\"/>\n\t\t<method name=\"setColor(I)Landroid/app/Notification$Builder;\" since=\"21\"/>\n\t\t<method name=\"setColorized(Z)Landroid/app/Notification$Builder;\" since=\"26\"/>\n\t\t<method name=\"setContent(Landroid/widget/RemoteViews;)Landroid/app/Notification$Builder;\" deprecated=\"24\"/>\n\t\t<method name=\"setContentInfo(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;\" deprecated=\"24\"/>\n\t\t<method name=\"setContentIntent(Landroid/app/PendingIntent;)Landroid/app/Notification$Builder;\"/>\n\t\t<method name=\"setContentText(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;\"/>\n\t\t<method name=\"setContentTitle(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;\"/>\n\t\t<method name=\"setCustomBigContentView(Landroid/widget/RemoteViews;)Landroid/app/Notification$Builder;\" since=\"24\"/>\n\t\t<method name=\"setCustomContentView(Landroid/widget/RemoteViews;)Landroid/app/Notification$Builder;\" since=\"24\"/>\n\t\t<method name=\"setCustomHeadsUpContentView(Landroid/widget/RemoteViews;)Landroid/app/Notification$Builder;\" since=\"24\"/>\n\t\t<method name=\"setDefaults(I)Landroid/app/Notification$Builder;\" deprecated=\"26\"/>\n\t\t<method name=\"setDeleteIntent(Landroid/app/PendingIntent;)Landroid/app/Notification$Builder;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/app/Notification$Builder;\" since=\"19\"/>\n\t\t<method name=\"setFlag(IZ)Landroid/app/Notification$Builder;\" since=\"30\"/>\n\t\t<method name=\"setFullScreenIntent(Landroid/app/PendingIntent;Z)Landroid/app/Notification$Builder;\"/>\n\t\t<method name=\"setGroup(Ljava/lang/String;)Landroid/app/Notification$Builder;\" since=\"20\"/>\n\t\t<method name=\"setGroupAlertBehavior(I)Landroid/app/Notification$Builder;\" since=\"26\"/>\n\t\t<method name=\"setGroupSummary(Z)Landroid/app/Notification$Builder;\" since=\"20\"/>\n\t\t<method name=\"setLargeIcon(Landroid/graphics/Bitmap;)Landroid/app/Notification$Builder;\"/>\n\t\t<method name=\"setLargeIcon(Landroid/graphics/drawable/Icon;)Landroid/app/Notification$Builder;\" since=\"23\"/>\n\t\t<method name=\"setLights(III)Landroid/app/Notification$Builder;\" deprecated=\"26\"/>\n\t\t<method name=\"setLocalOnly(Z)Landroid/app/Notification$Builder;\" since=\"20\"/>\n\t\t<method name=\"setLocusId(Landroid/content/LocusId;)Landroid/app/Notification$Builder;\" since=\"29\"/>\n\t\t<method name=\"setNumber(I)Landroid/app/Notification$Builder;\" deprecated=\"24\"/>\n\t\t<method name=\"setOngoing(Z)Landroid/app/Notification$Builder;\"/>\n\t\t<method name=\"setOnlyAlertOnce(Z)Landroid/app/Notification$Builder;\"/>\n\t\t<method name=\"setPriority(I)Landroid/app/Notification$Builder;\" since=\"16\" deprecated=\"26\"/>\n\t\t<method name=\"setProgress(IIZ)Landroid/app/Notification$Builder;\" since=\"14\"/>\n\t\t<method name=\"setPublicVersion(Landroid/app/Notification;)Landroid/app/Notification$Builder;\" since=\"21\"/>\n\t\t<method name=\"setRemoteInputHistory([Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;\" since=\"24\"/>\n\t\t<method name=\"setSettingsText(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;\" since=\"26\"/>\n\t\t<method name=\"setShortcutId(Ljava/lang/String;)Landroid/app/Notification$Builder;\" since=\"26\"/>\n\t\t<method name=\"setShowWhen(Z)Landroid/app/Notification$Builder;\" since=\"17\"/>\n\t\t<method name=\"setSmallIcon(I)Landroid/app/Notification$Builder;\"/>\n\t\t<method name=\"setSmallIcon(II)Landroid/app/Notification$Builder;\"/>\n\t\t<method name=\"setSmallIcon(Landroid/graphics/drawable/Icon;)Landroid/app/Notification$Builder;\" since=\"23\"/>\n\t\t<method name=\"setSortKey(Ljava/lang/String;)Landroid/app/Notification$Builder;\" since=\"20\"/>\n\t\t<method name=\"setSound(Landroid/net/Uri;)Landroid/app/Notification$Builder;\" deprecated=\"26\"/>\n\t\t<method name=\"setSound(Landroid/net/Uri;I)Landroid/app/Notification$Builder;\" deprecated=\"21\"/>\n\t\t<method name=\"setSound(Landroid/net/Uri;Landroid/media/AudioAttributes;)Landroid/app/Notification$Builder;\" since=\"21\" deprecated=\"26\"/>\n\t\t<method name=\"setStyle(Landroid/app/Notification$Style;)Landroid/app/Notification$Builder;\" since=\"16\"/>\n\t\t<method name=\"setSubText(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;\" since=\"16\"/>\n\t\t<method name=\"setTicker(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;\"/>\n\t\t<method name=\"setTicker(Ljava/lang/CharSequence;Landroid/widget/RemoteViews;)Landroid/app/Notification$Builder;\" deprecated=\"21\"/>\n\t\t<method name=\"setTimeoutAfter(J)Landroid/app/Notification$Builder;\" since=\"26\"/>\n\t\t<method name=\"setUsesChronometer(Z)Landroid/app/Notification$Builder;\" since=\"16\"/>\n\t\t<method name=\"setVibrate([J)Landroid/app/Notification$Builder;\" deprecated=\"26\"/>\n\t\t<method name=\"setVisibility(I)Landroid/app/Notification$Builder;\" since=\"21\"/>\n\t\t<method name=\"setWhen(J)Landroid/app/Notification$Builder;\"/>\n\t</class>\n\t<class name=\"android/app/Notification$CarExtender\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/app/Notification$Extender\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/Notification;)V\"/>\n\t\t<method name=\"getColor()I\"/>\n\t\t<method name=\"getLargeIcon()Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"getUnreadConversation()Landroid/app/Notification$CarExtender$UnreadConversation;\"/>\n\t\t<method name=\"setColor(I)Landroid/app/Notification$CarExtender;\"/>\n\t\t<method name=\"setLargeIcon(Landroid/graphics/Bitmap;)Landroid/app/Notification$CarExtender;\"/>\n\t\t<method name=\"setUnreadConversation(Landroid/app/Notification$CarExtender$UnreadConversation;)Landroid/app/Notification$CarExtender;\"/>\n\t</class>\n\t<class name=\"android/app/Notification$CarExtender$Builder\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"addMessage(Ljava/lang/String;)Landroid/app/Notification$CarExtender$Builder;\"/>\n\t\t<method name=\"build()Landroid/app/Notification$CarExtender$UnreadConversation;\"/>\n\t\t<method name=\"setLatestTimestamp(J)Landroid/app/Notification$CarExtender$Builder;\"/>\n\t\t<method name=\"setReadPendingIntent(Landroid/app/PendingIntent;)Landroid/app/Notification$CarExtender$Builder;\"/>\n\t\t<method name=\"setReplyAction(Landroid/app/PendingIntent;Landroid/app/RemoteInput;)Landroid/app/Notification$CarExtender$Builder;\"/>\n\t</class>\n\t<class name=\"android/app/Notification$CarExtender$UnreadConversation\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getLatestTimestamp()J\"/>\n\t\t<method name=\"getMessages()[Ljava/lang/String;\"/>\n\t\t<method name=\"getParticipant()Ljava/lang/String;\"/>\n\t\t<method name=\"getParticipants()[Ljava/lang/String;\"/>\n\t\t<method name=\"getReadPendingIntent()Landroid/app/PendingIntent;\"/>\n\t\t<method name=\"getRemoteInput()Landroid/app/RemoteInput;\"/>\n\t\t<method name=\"getReplyPendingIntent()Landroid/app/PendingIntent;\"/>\n\t</class>\n\t<class name=\"android/app/Notification$DecoratedCustomViewStyle\" since=\"24\">\n\t\t<extends name=\"android/app/Notification$Style\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/app/Notification$DecoratedMediaCustomViewStyle\" since=\"24\">\n\t\t<extends name=\"android/app/Notification$MediaStyle\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/app/Notification$Extender\" since=\"20\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"extend(Landroid/app/Notification$Builder;)Landroid/app/Notification$Builder;\"/>\n\t</class>\n\t<class name=\"android/app/Notification$InboxStyle\" since=\"16\">\n\t\t<extends name=\"android/app/Notification$Style\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/Notification$Builder;)V\" deprecated=\"24\"/>\n\t\t<method name=\"addLine(Ljava/lang/CharSequence;)Landroid/app/Notification$InboxStyle;\"/>\n\t\t<method name=\"setBigContentTitle(Ljava/lang/CharSequence;)Landroid/app/Notification$InboxStyle;\"/>\n\t\t<method name=\"setSummaryText(Ljava/lang/CharSequence;)Landroid/app/Notification$InboxStyle;\"/>\n\t</class>\n\t<class name=\"android/app/Notification$MediaStyle\" since=\"21\">\n\t\t<extends name=\"android/app/Notification$Style\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/Notification$Builder;)V\" deprecated=\"24\"/>\n\t\t<method name=\"setMediaSession(Landroid/media/session/MediaSession$Token;)Landroid/app/Notification$MediaStyle;\"/>\n\t\t<method name=\"setShowActionsInCompactView([I)Landroid/app/Notification$MediaStyle;\"/>\n\t</class>\n\t<class name=\"android/app/Notification$MessagingStyle\" since=\"24\">\n\t\t<extends name=\"android/app/Notification$Style\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/Person;)V\" since=\"28\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;)V\" deprecated=\"28\"/>\n\t\t<method name=\"addHistoricMessage(Landroid/app/Notification$MessagingStyle$Message;)Landroid/app/Notification$MessagingStyle;\" since=\"26\"/>\n\t\t<method name=\"addMessage(Landroid/app/Notification$MessagingStyle$Message;)Landroid/app/Notification$MessagingStyle;\"/>\n\t\t<method name=\"addMessage(Ljava/lang/CharSequence;JLandroid/app/Person;)Landroid/app/Notification$MessagingStyle;\" since=\"28\"/>\n\t\t<method name=\"addMessage(Ljava/lang/CharSequence;JLjava/lang/CharSequence;)Landroid/app/Notification$MessagingStyle;\" deprecated=\"28\"/>\n\t\t<method name=\"getConversationTitle()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getHistoricMessages()Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"getMessages()Ljava/util/List;\"/>\n\t\t<method name=\"getUser()Landroid/app/Person;\" since=\"28\"/>\n\t\t<method name=\"getUserDisplayName()Ljava/lang/CharSequence;\" deprecated=\"28\"/>\n\t\t<method name=\"isGroupConversation()Z\" since=\"28\"/>\n\t\t<method name=\"setConversationTitle(Ljava/lang/CharSequence;)Landroid/app/Notification$MessagingStyle;\"/>\n\t\t<method name=\"setGroupConversation(Z)Landroid/app/Notification$MessagingStyle;\" since=\"28\"/>\n\t\t<field name=\"MAXIMUM_RETAINED_MESSAGES\"/>\n\t</class>\n\t<class name=\"android/app/Notification$MessagingStyle$Message\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;JLandroid/app/Person;)V\" since=\"28\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;JLjava/lang/CharSequence;)V\" deprecated=\"28\"/>\n\t\t<method name=\"getDataMimeType()Ljava/lang/String;\"/>\n\t\t<method name=\"getDataUri()Landroid/net/Uri;\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\" since=\"26\"/>\n\t\t<method name=\"getSender()Ljava/lang/CharSequence;\" deprecated=\"28\"/>\n\t\t<method name=\"getSenderPerson()Landroid/app/Person;\" since=\"28\"/>\n\t\t<method name=\"getText()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTimestamp()J\"/>\n\t\t<method name=\"setData(Ljava/lang/String;Landroid/net/Uri;)Landroid/app/Notification$MessagingStyle$Message;\"/>\n\t</class>\n\t<class name=\"android/app/Notification$Style\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/app/Notification;\"/>\n\t\t<method name=\"checkBuilder()V\"/>\n\t\t<method name=\"getStandardView(I)Landroid/widget/RemoteViews;\"/>\n\t\t<method name=\"internalSetBigContentTitle(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"internalSetSummaryText(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setBuilder(Landroid/app/Notification$Builder;)V\"/>\n\t\t<field name=\"mBuilder\"/>\n\t</class>\n\t<class name=\"android/app/Notification$WearableExtender\" since=\"20\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/app/Notification$Extender\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/Notification;)V\"/>\n\t\t<method name=\"addAction(Landroid/app/Notification$Action;)Landroid/app/Notification$WearableExtender;\"/>\n\t\t<method name=\"addActions(Ljava/util/List;)Landroid/app/Notification$WearableExtender;\"/>\n\t\t<method name=\"addPage(Landroid/app/Notification;)Landroid/app/Notification$WearableExtender;\" deprecated=\"29\"/>\n\t\t<method name=\"addPages(Ljava/util/List;)Landroid/app/Notification$WearableExtender;\" deprecated=\"29\"/>\n\t\t<method name=\"clearActions()Landroid/app/Notification$WearableExtender;\"/>\n\t\t<method name=\"clearPages()Landroid/app/Notification$WearableExtender;\" deprecated=\"29\"/>\n\t\t<method name=\"clone()Landroid/app/Notification$WearableExtender;\"/>\n\t\t<method name=\"getActions()Ljava/util/List;\"/>\n\t\t<method name=\"getBackground()Landroid/graphics/Bitmap;\" deprecated=\"29\"/>\n\t\t<method name=\"getBridgeTag()Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getContentAction()I\"/>\n\t\t<method name=\"getContentIcon()I\" deprecated=\"28\"/>\n\t\t<method name=\"getContentIconGravity()I\" deprecated=\"28\"/>\n\t\t<method name=\"getContentIntentAvailableOffline()Z\"/>\n\t\t<method name=\"getCustomContentHeight()I\" deprecated=\"28\"/>\n\t\t<method name=\"getCustomSizePreset()I\" deprecated=\"28\"/>\n\t\t<method name=\"getDismissalId()Ljava/lang/String;\" since=\"24\"/>\n\t\t<method name=\"getDisplayIntent()Landroid/app/PendingIntent;\" deprecated=\"29\"/>\n\t\t<method name=\"getGravity()I\" deprecated=\"28\"/>\n\t\t<method name=\"getHintAmbientBigPicture()Z\" since=\"24\" deprecated=\"29\"/>\n\t\t<method name=\"getHintAvoidBackgroundClipping()Z\" since=\"22\" deprecated=\"28\"/>\n\t\t<method name=\"getHintContentIntentLaunchesActivity()Z\" since=\"24\"/>\n\t\t<method name=\"getHintHideIcon()Z\" deprecated=\"28\"/>\n\t\t<method name=\"getHintScreenTimeout()I\" since=\"22\" deprecated=\"28\"/>\n\t\t<method name=\"getHintShowBackgroundOnly()Z\" deprecated=\"28\"/>\n\t\t<method name=\"getPages()Ljava/util/List;\" deprecated=\"29\"/>\n\t\t<method name=\"getStartScrollBottom()Z\"/>\n\t\t<method name=\"setBackground(Landroid/graphics/Bitmap;)Landroid/app/Notification$WearableExtender;\" deprecated=\"29\"/>\n\t\t<method name=\"setBridgeTag(Ljava/lang/String;)Landroid/app/Notification$WearableExtender;\" since=\"26\"/>\n\t\t<method name=\"setContentAction(I)Landroid/app/Notification$WearableExtender;\"/>\n\t\t<method name=\"setContentIcon(I)Landroid/app/Notification$WearableExtender;\" deprecated=\"28\"/>\n\t\t<method name=\"setContentIconGravity(I)Landroid/app/Notification$WearableExtender;\" deprecated=\"28\"/>\n\t\t<method name=\"setContentIntentAvailableOffline(Z)Landroid/app/Notification$WearableExtender;\"/>\n\t\t<method name=\"setCustomContentHeight(I)Landroid/app/Notification$WearableExtender;\" deprecated=\"28\"/>\n\t\t<method name=\"setCustomSizePreset(I)Landroid/app/Notification$WearableExtender;\" deprecated=\"28\"/>\n\t\t<method name=\"setDismissalId(Ljava/lang/String;)Landroid/app/Notification$WearableExtender;\" since=\"24\"/>\n\t\t<method name=\"setDisplayIntent(Landroid/app/PendingIntent;)Landroid/app/Notification$WearableExtender;\" deprecated=\"29\"/>\n\t\t<method name=\"setGravity(I)Landroid/app/Notification$WearableExtender;\" deprecated=\"28\"/>\n\t\t<method name=\"setHintAmbientBigPicture(Z)Landroid/app/Notification$WearableExtender;\" since=\"24\" deprecated=\"29\"/>\n\t\t<method name=\"setHintAvoidBackgroundClipping(Z)Landroid/app/Notification$WearableExtender;\" since=\"22\" deprecated=\"28\"/>\n\t\t<method name=\"setHintContentIntentLaunchesActivity(Z)Landroid/app/Notification$WearableExtender;\" since=\"24\"/>\n\t\t<method name=\"setHintHideIcon(Z)Landroid/app/Notification$WearableExtender;\" deprecated=\"28\"/>\n\t\t<method name=\"setHintScreenTimeout(I)Landroid/app/Notification$WearableExtender;\" since=\"22\" deprecated=\"28\"/>\n\t\t<method name=\"setHintShowBackgroundOnly(Z)Landroid/app/Notification$WearableExtender;\" deprecated=\"28\"/>\n\t\t<method name=\"setStartScrollBottom(Z)Landroid/app/Notification$WearableExtender;\"/>\n\t\t<field name=\"SCREEN_TIMEOUT_LONG\" since=\"22\" deprecated=\"29\"/>\n\t\t<field name=\"SCREEN_TIMEOUT_SHORT\" since=\"22\" deprecated=\"29\"/>\n\t\t<field name=\"SIZE_DEFAULT\" deprecated=\"29\"/>\n\t\t<field name=\"SIZE_FULL_SCREEN\" deprecated=\"29\"/>\n\t\t<field name=\"SIZE_LARGE\" deprecated=\"29\"/>\n\t\t<field name=\"SIZE_MEDIUM\" deprecated=\"29\"/>\n\t\t<field name=\"SIZE_SMALL\" deprecated=\"29\"/>\n\t\t<field name=\"SIZE_XSMALL\" deprecated=\"29\"/>\n\t\t<field name=\"UNSET_ACTION_INDEX\"/>\n\t</class>\n\t<class name=\"android/app/NotificationChannel\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/CharSequence;I)V\"/>\n\t\t<method name=\"canBubble()Z\" since=\"29\"/>\n\t\t<method name=\"canBypassDnd()Z\"/>\n\t\t<method name=\"canShowBadge()Z\"/>\n\t\t<method name=\"enableLights(Z)V\"/>\n\t\t<method name=\"enableVibration(Z)V\"/>\n\t\t<method name=\"getAudioAttributes()Landroid/media/AudioAttributes;\"/>\n\t\t<method name=\"getDescription()Ljava/lang/String;\"/>\n\t\t<method name=\"getGroup()Ljava/lang/String;\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\"/>\n\t\t<method name=\"getImportance()I\"/>\n\t\t<method name=\"getLightColor()I\"/>\n\t\t<method name=\"getLockscreenVisibility()I\"/>\n\t\t<method name=\"getName()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getSound()Landroid/net/Uri;\"/>\n\t\t<method name=\"getVibrationPattern()[J\"/>\n\t\t<method name=\"hasUserSetImportance()Z\" since=\"29\"/>\n\t\t<method name=\"setAllowBubbles(Z)V\" since=\"29\"/>\n\t\t<method name=\"setBypassDnd(Z)V\"/>\n\t\t<method name=\"setDescription(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setGroup(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setImportance(I)V\"/>\n\t\t<method name=\"setLightColor(I)V\"/>\n\t\t<method name=\"setLockscreenVisibility(I)V\"/>\n\t\t<method name=\"setName(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setShowBadge(Z)V\"/>\n\t\t<method name=\"setSound(Landroid/net/Uri;Landroid/media/AudioAttributes;)V\"/>\n\t\t<method name=\"setVibrationPattern([J)V\"/>\n\t\t<method name=\"shouldShowLights()Z\"/>\n\t\t<method name=\"shouldVibrate()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"DEFAULT_CHANNEL_ID\"/>\n\t</class>\n\t<class name=\"android/app/NotificationChannelGroup\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"clone()Landroid/app/NotificationChannelGroup;\"/>\n\t\t<method name=\"getChannels()Ljava/util/List;\"/>\n\t\t<method name=\"getDescription()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\"/>\n\t\t<method name=\"getName()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"isBlocked()Z\" since=\"28\"/>\n\t\t<method name=\"setDescription(Ljava/lang/String;)V\" since=\"28\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/NotificationManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addAutomaticZenRule(Landroid/app/AutomaticZenRule;)Ljava/lang/String;\" since=\"24\"/>\n\t\t<method name=\"areBubblesAllowed()Z\" since=\"29\"/>\n\t\t<method name=\"areNotificationsEnabled()Z\" since=\"24\"/>\n\t\t<method name=\"areNotificationsPaused()Z\" since=\"29\"/>\n\t\t<method name=\"canNotifyAsPackage(Ljava/lang/String;)Z\" since=\"29\"/>\n\t\t<method name=\"cancel(I)V\"/>\n\t\t<method name=\"cancel(Ljava/lang/String;I)V\" since=\"5\"/>\n\t\t<method name=\"cancelAll()V\"/>\n\t\t<method name=\"createNotificationChannel(Landroid/app/NotificationChannel;)V\" since=\"26\"/>\n\t\t<method name=\"createNotificationChannelGroup(Landroid/app/NotificationChannelGroup;)V\" since=\"26\"/>\n\t\t<method name=\"createNotificationChannelGroups(Ljava/util/List;)V\" since=\"26\"/>\n\t\t<method name=\"createNotificationChannels(Ljava/util/List;)V\" since=\"26\"/>\n\t\t<method name=\"deleteNotificationChannel(Ljava/lang/String;)V\" since=\"26\"/>\n\t\t<method name=\"deleteNotificationChannelGroup(Ljava/lang/String;)V\" since=\"26\"/>\n\t\t<method name=\"getActiveNotifications()[Landroid/service/notification/StatusBarNotification;\" since=\"23\"/>\n\t\t<method name=\"getAutomaticZenRule(Ljava/lang/String;)Landroid/app/AutomaticZenRule;\" since=\"24\"/>\n\t\t<method name=\"getAutomaticZenRules()Ljava/util/Map;\" since=\"24\"/>\n\t\t<method name=\"getCurrentInterruptionFilter()I\" since=\"23\"/>\n\t\t<method name=\"getImportance()I\" since=\"24\"/>\n\t\t<method name=\"getNotificationChannel(Ljava/lang/String;)Landroid/app/NotificationChannel;\" since=\"26\"/>\n\t\t<method name=\"getNotificationChannelGroup(Ljava/lang/String;)Landroid/app/NotificationChannelGroup;\" since=\"28\"/>\n\t\t<method name=\"getNotificationChannelGroups()Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"getNotificationChannels()Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"getNotificationDelegate()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getNotificationPolicy()Landroid/app/NotificationManager$Policy;\" since=\"23\"/>\n\t\t<method name=\"isNotificationListenerAccessGranted(Landroid/content/ComponentName;)Z\" since=\"27\"/>\n\t\t<method name=\"isNotificationPolicyAccessGranted()Z\" since=\"23\"/>\n\t\t<method name=\"notify(ILandroid/app/Notification;)V\"/>\n\t\t<method name=\"notify(Ljava/lang/String;ILandroid/app/Notification;)V\" since=\"5\"/>\n\t\t<method name=\"notifyAsPackage(Ljava/lang/String;Ljava/lang/String;ILandroid/app/Notification;)V\" since=\"29\"/>\n\t\t<method name=\"removeAutomaticZenRule(Ljava/lang/String;)Z\" since=\"24\"/>\n\t\t<method name=\"setAutomaticZenRuleState(Ljava/lang/String;Landroid/service/notification/Condition;)V\" since=\"29\"/>\n\t\t<method name=\"setInterruptionFilter(I)V\" since=\"23\"/>\n\t\t<method name=\"setNotificationDelegate(Ljava/lang/String;)V\" since=\"29\"/>\n\t\t<method name=\"setNotificationPolicy(Landroid/app/NotificationManager$Policy;)V\" since=\"23\"/>\n\t\t<method name=\"shouldHideSilentStatusBarIcons()Z\" since=\"29\"/>\n\t\t<method name=\"updateAutomaticZenRule(Ljava/lang/String;Landroid/app/AutomaticZenRule;)Z\" since=\"24\"/>\n\t\t<field name=\"ACTION_APP_BLOCK_STATE_CHANGED\" since=\"28\"/>\n\t\t<field name=\"ACTION_AUTOMATIC_ZEN_RULE\" since=\"29\"/>\n\t\t<field name=\"ACTION_INTERRUPTION_FILTER_CHANGED\" since=\"23\"/>\n\t\t<field name=\"ACTION_NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED\" since=\"28\"/>\n\t\t<field name=\"ACTION_NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED\" since=\"28\"/>\n\t\t<field name=\"ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED\" since=\"23\"/>\n\t\t<field name=\"ACTION_NOTIFICATION_POLICY_CHANGED\" since=\"23\"/>\n\t\t<field name=\"EXTRA_AUTOMATIC_RULE_ID\" since=\"29\"/>\n\t\t<field name=\"EXTRA_BLOCKED_STATE\" since=\"28\"/>\n\t\t<field name=\"EXTRA_NOTIFICATION_CHANNEL_GROUP_ID\" since=\"28\"/>\n\t\t<field name=\"EXTRA_NOTIFICATION_CHANNEL_ID\" since=\"28\"/>\n\t\t<field name=\"IMPORTANCE_DEFAULT\" since=\"24\"/>\n\t\t<field name=\"IMPORTANCE_HIGH\" since=\"24\"/>\n\t\t<field name=\"IMPORTANCE_LOW\" since=\"24\"/>\n\t\t<field name=\"IMPORTANCE_MAX\" since=\"24\"/>\n\t\t<field name=\"IMPORTANCE_MIN\" since=\"24\"/>\n\t\t<field name=\"IMPORTANCE_NONE\" since=\"24\"/>\n\t\t<field name=\"IMPORTANCE_UNSPECIFIED\" since=\"24\"/>\n\t\t<field name=\"INTERRUPTION_FILTER_ALARMS\" since=\"23\"/>\n\t\t<field name=\"INTERRUPTION_FILTER_ALL\" since=\"23\"/>\n\t\t<field name=\"INTERRUPTION_FILTER_NONE\" since=\"23\"/>\n\t\t<field name=\"INTERRUPTION_FILTER_PRIORITY\" since=\"23\"/>\n\t\t<field name=\"INTERRUPTION_FILTER_UNKNOWN\" since=\"23\"/>\n\t\t<field name=\"META_DATA_AUTOMATIC_RULE_TYPE\" since=\"29\"/>\n\t\t<field name=\"META_DATA_RULE_INSTANCE_LIMIT\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/app/NotificationManager$Policy\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"&lt;init>(IIII)V\" since=\"24\"/>\n\t\t<method name=\"priorityCategoriesToString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"prioritySendersToString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"suppressedEffectsToString(I)Ljava/lang/String;\" since=\"24\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"PRIORITY_CATEGORY_ALARMS\" since=\"28\"/>\n\t\t<field name=\"PRIORITY_CATEGORY_CALLS\"/>\n\t\t<field name=\"PRIORITY_CATEGORY_EVENTS\"/>\n\t\t<field name=\"PRIORITY_CATEGORY_MEDIA\" since=\"28\"/>\n\t\t<field name=\"PRIORITY_CATEGORY_MESSAGES\"/>\n\t\t<field name=\"PRIORITY_CATEGORY_REMINDERS\"/>\n\t\t<field name=\"PRIORITY_CATEGORY_REPEAT_CALLERS\"/>\n\t\t<field name=\"PRIORITY_CATEGORY_SYSTEM\" since=\"28\"/>\n\t\t<field name=\"PRIORITY_SENDERS_ANY\"/>\n\t\t<field name=\"PRIORITY_SENDERS_CONTACTS\"/>\n\t\t<field name=\"PRIORITY_SENDERS_STARRED\"/>\n\t\t<field name=\"SUPPRESSED_EFFECT_AMBIENT\" since=\"28\"/>\n\t\t<field name=\"SUPPRESSED_EFFECT_BADGE\" since=\"28\"/>\n\t\t<field name=\"SUPPRESSED_EFFECT_FULL_SCREEN_INTENT\" since=\"28\"/>\n\t\t<field name=\"SUPPRESSED_EFFECT_LIGHTS\" since=\"28\"/>\n\t\t<field name=\"SUPPRESSED_EFFECT_NOTIFICATION_LIST\" since=\"28\"/>\n\t\t<field name=\"SUPPRESSED_EFFECT_PEEK\" since=\"28\"/>\n\t\t<field name=\"SUPPRESSED_EFFECT_SCREEN_OFF\" since=\"24\" deprecated=\"28\"/>\n\t\t<field name=\"SUPPRESSED_EFFECT_SCREEN_ON\" since=\"24\" deprecated=\"28\"/>\n\t\t<field name=\"SUPPRESSED_EFFECT_STATUS_BAR\" since=\"28\"/>\n\t\t<field name=\"priorityCallSenders\"/>\n\t\t<field name=\"priorityCategories\"/>\n\t\t<field name=\"priorityMessageSenders\"/>\n\t\t<field name=\"suppressedVisualEffects\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/app/PendingIntent\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"cancel()V\"/>\n\t\t<method name=\"getActivities(Landroid/content/Context;I[Landroid/content/Intent;I)Landroid/app/PendingIntent;\" since=\"11\"/>\n\t\t<method name=\"getActivities(Landroid/content/Context;I[Landroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/PendingIntent;\" since=\"16\"/>\n\t\t<method name=\"getActivity(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;\"/>\n\t\t<method name=\"getActivity(Landroid/content/Context;ILandroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/PendingIntent;\" since=\"16\"/>\n\t\t<method name=\"getBroadcast(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;\"/>\n\t\t<method name=\"getCreatorPackage()Ljava/lang/String;\" since=\"17\"/>\n\t\t<method name=\"getCreatorUid()I\" since=\"17\"/>\n\t\t<method name=\"getCreatorUserHandle()Landroid/os/UserHandle;\" since=\"17\"/>\n\t\t<method name=\"getForegroundService(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;\" since=\"26\"/>\n\t\t<method name=\"getIntentSender()Landroid/content/IntentSender;\" since=\"4\"/>\n\t\t<method name=\"getService(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;\"/>\n\t\t<method name=\"getTargetPackage()Ljava/lang/String;\" deprecated=\"17\"/>\n\t\t<method name=\"readPendingIntentOrNullFromParcel(Landroid/os/Parcel;)Landroid/app/PendingIntent;\"/>\n\t\t<method name=\"send()V\"/>\n\t\t<method name=\"send(I)V\"/>\n\t\t<method name=\"send(ILandroid/app/PendingIntent$OnFinished;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"send(Landroid/content/Context;ILandroid/content/Intent;)V\"/>\n\t\t<method name=\"send(Landroid/content/Context;ILandroid/content/Intent;Landroid/app/PendingIntent$OnFinished;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"send(Landroid/content/Context;ILandroid/content/Intent;Landroid/app/PendingIntent$OnFinished;Landroid/os/Handler;Ljava/lang/String;)V\" since=\"14\"/>\n\t\t<method name=\"send(Landroid/content/Context;ILandroid/content/Intent;Landroid/app/PendingIntent$OnFinished;Landroid/os/Handler;Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"23\"/>\n\t\t<method name=\"writePendingIntentOrNullToParcel(Landroid/app/PendingIntent;Landroid/os/Parcel;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FLAG_CANCEL_CURRENT\"/>\n\t\t<field name=\"FLAG_IMMUTABLE\" since=\"23\"/>\n\t\t<field name=\"FLAG_NO_CREATE\"/>\n\t\t<field name=\"FLAG_ONE_SHOT\"/>\n\t\t<field name=\"FLAG_UPDATE_CURRENT\" since=\"3\"/>\n\t</class>\n\t<class name=\"android/app/PendingIntent$CanceledException\" since=\"1\">\n\t\t<extends name=\"android/util/AndroidException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Exception;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/app/PendingIntent$OnFinished\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onSendFinished(Landroid/app/PendingIntent;Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;)V\"/>\n\t</class>\n\t<class name=\"android/app/Person\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getIcon()Landroid/graphics/drawable/Icon;\"/>\n\t\t<method name=\"getKey()Ljava/lang/String;\"/>\n\t\t<method name=\"getName()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getUri()Ljava/lang/String;\"/>\n\t\t<method name=\"isBot()Z\"/>\n\t\t<method name=\"isImportant()Z\"/>\n\t\t<method name=\"toBuilder()Landroid/app/Person$Builder;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/Person$Builder\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/app/Person;\"/>\n\t\t<method name=\"setBot(Z)Landroid/app/Person$Builder;\"/>\n\t\t<method name=\"setIcon(Landroid/graphics/drawable/Icon;)Landroid/app/Person$Builder;\"/>\n\t\t<method name=\"setImportant(Z)Landroid/app/Person$Builder;\"/>\n\t\t<method name=\"setKey(Ljava/lang/String;)Landroid/app/Person$Builder;\"/>\n\t\t<method name=\"setName(Ljava/lang/CharSequence;)Landroid/app/Person$Builder;\"/>\n\t\t<method name=\"setUri(Ljava/lang/String;)Landroid/app/Person$Builder;\"/>\n\t</class>\n\t<class name=\"android/app/PictureInPictureParams\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/PictureInPictureParams$Builder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/app/PictureInPictureParams;\"/>\n\t\t<method name=\"setActions(Ljava/util/List;)Landroid/app/PictureInPictureParams$Builder;\"/>\n\t\t<method name=\"setAspectRatio(Landroid/util/Rational;)Landroid/app/PictureInPictureParams$Builder;\"/>\n\t\t<method name=\"setSourceRectHint(Landroid/graphics/Rect;)Landroid/app/PictureInPictureParams$Builder;\"/>\n\t</class>\n\t<class name=\"android/app/Presentation\" since=\"17\">\n\t\t<extends name=\"android/app/Dialog\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/view/Display;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/view/Display;I)V\"/>\n\t\t<method name=\"getDisplay()Landroid/view/Display;\"/>\n\t\t<method name=\"getResources()Landroid/content/res/Resources;\"/>\n\t\t<method name=\"onDisplayChanged()V\"/>\n\t\t<method name=\"onDisplayRemoved()V\"/>\n\t</class>\n\t<class name=\"android/app/ProgressDialog\" since=\"1\" deprecated=\"26\">\n\t\t<extends name=\"android/app/AlertDialog\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"getMax()I\" deprecated=\"29\"/>\n\t\t<method name=\"getProgress()I\" deprecated=\"29\"/>\n\t\t<method name=\"getSecondaryProgress()I\" deprecated=\"29\"/>\n\t\t<method name=\"incrementProgressBy(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"incrementSecondaryProgressBy(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"isIndeterminate()Z\" deprecated=\"29\"/>\n\t\t<method name=\"setIndeterminate(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setIndeterminateDrawable(Landroid/graphics/drawable/Drawable;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setMax(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setProgress(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setProgressDrawable(Landroid/graphics/drawable/Drawable;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setProgressNumberFormat(Ljava/lang/String;)V\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"setProgressPercentFormat(Ljava/text/NumberFormat;)V\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"setProgressStyle(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setSecondaryProgress(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"show(Landroid/content/Context;Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Landroid/app/ProgressDialog;\" deprecated=\"29\"/>\n\t\t<method name=\"show(Landroid/content/Context;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)Landroid/app/ProgressDialog;\" deprecated=\"29\"/>\n\t\t<method name=\"show(Landroid/content/Context;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZZ)Landroid/app/ProgressDialog;\" deprecated=\"29\"/>\n\t\t<method name=\"show(Landroid/content/Context;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZZLandroid/content/DialogInterface$OnCancelListener;)Landroid/app/ProgressDialog;\" deprecated=\"29\"/>\n\t\t<field name=\"STYLE_HORIZONTAL\" deprecated=\"29\"/>\n\t\t<field name=\"STYLE_SPINNER\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/RecoverableSecurityException\" since=\"29\">\n\t\t<extends name=\"java/lang/SecurityException\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;Ljava/lang/CharSequence;Landroid/app/RemoteAction;)V\"/>\n\t\t<method name=\"getUserAction()Landroid/app/RemoteAction;\"/>\n\t\t<method name=\"getUserMessage()Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/RemoteAction\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/drawable/Icon;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/app/PendingIntent;)V\"/>\n\t\t<method name=\"clone()Landroid/app/RemoteAction;\"/>\n\t\t<method name=\"dump(Ljava/lang/String;Ljava/io/PrintWriter;)V\"/>\n\t\t<method name=\"getActionIntent()Landroid/app/PendingIntent;\"/>\n\t\t<method name=\"getContentDescription()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getIcon()Landroid/graphics/drawable/Icon;\"/>\n\t\t<method name=\"getTitle()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"isEnabled()Z\"/>\n\t\t<method name=\"setEnabled(Z)V\"/>\n\t\t<method name=\"setShouldShowIcon(Z)V\" since=\"28\"/>\n\t\t<method name=\"shouldShowIcon()Z\" since=\"28\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/RemoteInput\" since=\"20\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"addDataResultToIntent(Landroid/app/RemoteInput;Landroid/content/Intent;Ljava/util/Map;)V\" since=\"26\"/>\n\t\t<method name=\"addResultsToIntent([Landroid/app/RemoteInput;Landroid/content/Intent;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"getAllowFreeFormInput()Z\"/>\n\t\t<method name=\"getAllowedDataTypes()Ljava/util/Set;\" since=\"26\"/>\n\t\t<method name=\"getChoices()[Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getDataResultsFromIntent(Landroid/content/Intent;Ljava/lang/String;)Ljava/util/Map;\" since=\"26\"/>\n\t\t<method name=\"getEditChoicesBeforeSending()I\" since=\"29\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getLabel()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getResultKey()Ljava/lang/String;\"/>\n\t\t<method name=\"getResultsFromIntent(Landroid/content/Intent;)Landroid/os/Bundle;\"/>\n\t\t<method name=\"getResultsSource(Landroid/content/Intent;)I\" since=\"28\"/>\n\t\t<method name=\"isDataOnly()Z\" since=\"26\"/>\n\t\t<method name=\"setResultsSource(Landroid/content/Intent;I)V\" since=\"28\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"EDIT_CHOICES_BEFORE_SENDING_AUTO\" since=\"29\"/>\n\t\t<field name=\"EDIT_CHOICES_BEFORE_SENDING_DISABLED\" since=\"29\"/>\n\t\t<field name=\"EDIT_CHOICES_BEFORE_SENDING_ENABLED\" since=\"29\"/>\n\t\t<field name=\"EXTRA_RESULTS_DATA\"/>\n\t\t<field name=\"RESULTS_CLIP_LABEL\"/>\n\t\t<field name=\"SOURCE_CHOICE\" since=\"28\"/>\n\t\t<field name=\"SOURCE_FREE_FORM_INPUT\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/app/RemoteInput$Builder\" since=\"20\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"addExtras(Landroid/os/Bundle;)Landroid/app/RemoteInput$Builder;\"/>\n\t\t<method name=\"build()Landroid/app/RemoteInput;\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"setAllowDataType(Ljava/lang/String;Z)Landroid/app/RemoteInput$Builder;\" since=\"26\"/>\n\t\t<method name=\"setAllowFreeFormInput(Z)Landroid/app/RemoteInput$Builder;\"/>\n\t\t<method name=\"setChoices([Ljava/lang/CharSequence;)Landroid/app/RemoteInput$Builder;\"/>\n\t\t<method name=\"setEditChoicesBeforeSending(I)Landroid/app/RemoteInput$Builder;\" since=\"29\"/>\n\t\t<method name=\"setLabel(Ljava/lang/CharSequence;)Landroid/app/RemoteInput$Builder;\"/>\n\t</class>\n\t<class name=\"android/app/SearchManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/content/DialogInterface$OnCancelListener\"/>\n\t\t<implements name=\"android/content/DialogInterface$OnDismissListener\"/>\n\t\t<method name=\"getGlobalSearchActivity()Landroid/content/ComponentName;\" since=\"16\"/>\n\t\t<method name=\"getSearchableInfo(Landroid/content/ComponentName;)Landroid/app/SearchableInfo;\" since=\"8\"/>\n\t\t<method name=\"getSearchablesInGlobalSearch()Ljava/util/List;\" since=\"8\"/>\n\t\t<method name=\"setOnCancelListener(Landroid/app/SearchManager$OnCancelListener;)V\"/>\n\t\t<method name=\"setOnDismissListener(Landroid/app/SearchManager$OnDismissListener;)V\"/>\n\t\t<method name=\"startSearch(Ljava/lang/String;ZLandroid/content/ComponentName;Landroid/os/Bundle;Z)V\"/>\n\t\t<method name=\"stopSearch()V\"/>\n\t\t<method name=\"triggerSearch(Ljava/lang/String;Landroid/content/ComponentName;Landroid/os/Bundle;)V\" since=\"5\"/>\n\t\t<field name=\"ACTION_KEY\"/>\n\t\t<field name=\"ACTION_MSG\"/>\n\t\t<field name=\"APP_DATA\"/>\n\t\t<field name=\"CURSOR_EXTRA_KEY_IN_PROGRESS\" since=\"8\"/>\n\t\t<field name=\"EXTRA_DATA_KEY\" since=\"4\"/>\n\t\t<field name=\"EXTRA_NEW_SEARCH\" since=\"12\"/>\n\t\t<field name=\"EXTRA_SELECT_QUERY\" since=\"8\"/>\n\t\t<field name=\"EXTRA_WEB_SEARCH_PENDINGINTENT\" since=\"14\"/>\n\t\t<field name=\"FLAG_QUERY_REFINEMENT\" since=\"11\"/>\n\t\t<field name=\"INTENT_ACTION_GLOBAL_SEARCH\" since=\"8\"/>\n\t\t<field name=\"INTENT_ACTION_SEARCHABLES_CHANGED\" since=\"4\"/>\n\t\t<field name=\"INTENT_ACTION_SEARCH_SETTINGS\" since=\"8\"/>\n\t\t<field name=\"INTENT_ACTION_SEARCH_SETTINGS_CHANGED\" since=\"4\"/>\n\t\t<field name=\"INTENT_ACTION_WEB_SEARCH_SETTINGS\" since=\"4\"/>\n\t\t<field name=\"INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED\" since=\"16\"/>\n\t\t<field name=\"MENU_KEY\"/>\n\t\t<field name=\"MENU_KEYCODE\"/>\n\t\t<field name=\"QUERY\"/>\n\t\t<field name=\"SHORTCUT_MIME_TYPE\" since=\"4\"/>\n\t\t<field name=\"SUGGEST_COLUMN_AUDIO_CHANNEL_CONFIG\" since=\"21\"/>\n\t\t<field name=\"SUGGEST_COLUMN_CONTENT_TYPE\" since=\"21\"/>\n\t\t<field name=\"SUGGEST_COLUMN_DURATION\" since=\"21\"/>\n\t\t<field name=\"SUGGEST_COLUMN_FLAGS\" since=\"11\"/>\n\t\t<field name=\"SUGGEST_COLUMN_FORMAT\"/>\n\t\t<field name=\"SUGGEST_COLUMN_ICON_1\"/>\n\t\t<field name=\"SUGGEST_COLUMN_ICON_2\"/>\n\t\t<field name=\"SUGGEST_COLUMN_INTENT_ACTION\"/>\n\t\t<field name=\"SUGGEST_COLUMN_INTENT_DATA\"/>\n\t\t<field name=\"SUGGEST_COLUMN_INTENT_DATA_ID\"/>\n\t\t<field name=\"SUGGEST_COLUMN_INTENT_EXTRA_DATA\" since=\"4\"/>\n\t\t<field name=\"SUGGEST_COLUMN_IS_LIVE\" since=\"21\"/>\n\t\t<field name=\"SUGGEST_COLUMN_LAST_ACCESS_HINT\" since=\"14\"/>\n\t\t<field name=\"SUGGEST_COLUMN_PRODUCTION_YEAR\" since=\"21\"/>\n\t\t<field name=\"SUGGEST_COLUMN_PURCHASE_PRICE\" since=\"21\"/>\n\t\t<field name=\"SUGGEST_COLUMN_QUERY\"/>\n\t\t<field name=\"SUGGEST_COLUMN_RATING_SCORE\" since=\"21\"/>\n\t\t<field name=\"SUGGEST_COLUMN_RATING_STYLE\" since=\"21\"/>\n\t\t<field name=\"SUGGEST_COLUMN_RENTAL_PRICE\" since=\"21\"/>\n\t\t<field name=\"SUGGEST_COLUMN_RESULT_CARD_IMAGE\" since=\"21\"/>\n\t\t<field name=\"SUGGEST_COLUMN_SHORTCUT_ID\" since=\"4\"/>\n\t\t<field name=\"SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING\" since=\"4\"/>\n\t\t<field name=\"SUGGEST_COLUMN_TEXT_1\"/>\n\t\t<field name=\"SUGGEST_COLUMN_TEXT_2\"/>\n\t\t<field name=\"SUGGEST_COLUMN_TEXT_2_URL\" since=\"8\"/>\n\t\t<field name=\"SUGGEST_COLUMN_VIDEO_HEIGHT\" since=\"21\"/>\n\t\t<field name=\"SUGGEST_COLUMN_VIDEO_WIDTH\" since=\"21\"/>\n\t\t<field name=\"SUGGEST_MIME_TYPE\"/>\n\t\t<field name=\"SUGGEST_NEVER_MAKE_SHORTCUT\" since=\"4\"/>\n\t\t<field name=\"SUGGEST_PARAMETER_LIMIT\" since=\"5\"/>\n\t\t<field name=\"SUGGEST_URI_PATH_QUERY\"/>\n\t\t<field name=\"SUGGEST_URI_PATH_SHORTCUT\" since=\"4\"/>\n\t\t<field name=\"USER_QUERY\" since=\"4\"/>\n\t</class>\n\t<class name=\"android/app/SearchManager$OnCancelListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onCancel()V\"/>\n\t</class>\n\t<class name=\"android/app/SearchManager$OnDismissListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDismiss()V\"/>\n\t</class>\n\t<class name=\"android/app/SearchableInfo\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"autoUrlDetect()Z\"/>\n\t\t<method name=\"getHintId()I\"/>\n\t\t<method name=\"getImeOptions()I\"/>\n\t\t<method name=\"getInputType()I\"/>\n\t\t<method name=\"getSearchActivity()Landroid/content/ComponentName;\"/>\n\t\t<method name=\"getSettingsDescriptionId()I\"/>\n\t\t<method name=\"getSuggestAuthority()Ljava/lang/String;\"/>\n\t\t<method name=\"getSuggestIntentAction()Ljava/lang/String;\"/>\n\t\t<method name=\"getSuggestIntentData()Ljava/lang/String;\"/>\n\t\t<method name=\"getSuggestPackage()Ljava/lang/String;\"/>\n\t\t<method name=\"getSuggestPath()Ljava/lang/String;\"/>\n\t\t<method name=\"getSuggestSelection()Ljava/lang/String;\"/>\n\t\t<method name=\"getSuggestThreshold()I\"/>\n\t\t<method name=\"getVoiceLanguageId()I\"/>\n\t\t<method name=\"getVoiceLanguageModeId()I\"/>\n\t\t<method name=\"getVoiceMaxResults()I\"/>\n\t\t<method name=\"getVoicePromptTextId()I\"/>\n\t\t<method name=\"getVoiceSearchEnabled()Z\"/>\n\t\t<method name=\"getVoiceSearchLaunchRecognizer()Z\"/>\n\t\t<method name=\"getVoiceSearchLaunchWebSearch()Z\"/>\n\t\t<method name=\"queryAfterZeroResults()Z\"/>\n\t\t<method name=\"shouldIncludeInGlobalSearch()Z\"/>\n\t\t<method name=\"shouldRewriteQueryFromData()Z\"/>\n\t\t<method name=\"shouldRewriteQueryFromText()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/Service\" since=\"1\">\n\t\t<extends name=\"android/content/ContextWrapper\"/>\n\t\t<implements name=\"android/content/ComponentCallbacks\" removed=\"14\"/>\n\t\t<implements name=\"android/content/ComponentCallbacks2\" since=\"14\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V\"/>\n\t\t<method name=\"getApplication()Landroid/app/Application;\"/>\n\t\t<method name=\"getForegroundServiceType()I\" since=\"29\"/>\n\t\t<method name=\"onBind(Landroid/content/Intent;)Landroid/os/IBinder;\"/>\n\t\t<method name=\"onCreate()V\"/>\n\t\t<method name=\"onDestroy()V\"/>\n\t\t<method name=\"onRebind(Landroid/content/Intent;)V\"/>\n\t\t<method name=\"onStart(Landroid/content/Intent;I)V\" deprecated=\"15\"/>\n\t\t<method name=\"onStartCommand(Landroid/content/Intent;II)I\" since=\"5\"/>\n\t\t<method name=\"onTaskRemoved(Landroid/content/Intent;)V\" since=\"14\"/>\n\t\t<method name=\"onUnbind(Landroid/content/Intent;)Z\"/>\n\t\t<method name=\"setForeground(Z)V\" removed=\"11\"/>\n\t\t<method name=\"startForeground(ILandroid/app/Notification;)V\" since=\"5\"/>\n\t\t<method name=\"startForeground(ILandroid/app/Notification;I)V\" since=\"29\"/>\n\t\t<method name=\"stopForeground(I)V\" since=\"24\"/>\n\t\t<method name=\"stopForeground(Z)V\" since=\"5\"/>\n\t\t<method name=\"stopSelf()V\"/>\n\t\t<method name=\"stopSelf(I)V\"/>\n\t\t<method name=\"stopSelfResult(I)Z\"/>\n\t\t<field name=\"START_CONTINUATION_MASK\" since=\"5\"/>\n\t\t<field name=\"START_FLAG_REDELIVERY\" since=\"5\"/>\n\t\t<field name=\"START_FLAG_RETRY\" since=\"5\"/>\n\t\t<field name=\"START_NOT_STICKY\" since=\"5\"/>\n\t\t<field name=\"START_REDELIVER_INTENT\" since=\"5\"/>\n\t\t<field name=\"START_STICKY\" since=\"5\"/>\n\t\t<field name=\"START_STICKY_COMPATIBILITY\" since=\"5\"/>\n\t\t<field name=\"STOP_FOREGROUND_DETACH\" since=\"24\"/>\n\t\t<field name=\"STOP_FOREGROUND_REMOVE\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/app/SharedElementCallback\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCaptureSharedElementSnapshot(Landroid/view/View;Landroid/graphics/Matrix;Landroid/graphics/RectF;)Landroid/os/Parcelable;\"/>\n\t\t<method name=\"onCreateSnapshotView(Landroid/content/Context;Landroid/os/Parcelable;)Landroid/view/View;\"/>\n\t\t<method name=\"onMapSharedElements(Ljava/util/List;Ljava/util/Map;)V\"/>\n\t\t<method name=\"onRejectSharedElements(Ljava/util/List;)V\"/>\n\t\t<method name=\"onSharedElementEnd(Ljava/util/List;Ljava/util/List;Ljava/util/List;)V\"/>\n\t\t<method name=\"onSharedElementStart(Ljava/util/List;Ljava/util/List;Ljava/util/List;)V\"/>\n\t\t<method name=\"onSharedElementsArrived(Ljava/util/List;Ljava/util/List;Landroid/app/SharedElementCallback$OnSharedElementsReadyListener;)V\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/app/SharedElementCallback$OnSharedElementsReadyListener\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onSharedElementsReady()V\"/>\n\t</class>\n\t<class name=\"android/app/StatusBarManager\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/app/TabActivity\" since=\"1\" deprecated=\"13\">\n\t\t<extends name=\"android/app/ActivityGroup\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"getTabHost()Landroid/widget/TabHost;\" deprecated=\"29\"/>\n\t\t<method name=\"getTabWidget()Landroid/widget/TabWidget;\" deprecated=\"29\"/>\n\t\t<method name=\"setDefaultTab(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setDefaultTab(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/app/TaskInfo\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"baseActivity\"/>\n\t\t<field name=\"baseIntent\"/>\n\t\t<field name=\"isRunning\"/>\n\t\t<field name=\"numActivities\"/>\n\t\t<field name=\"origActivity\"/>\n\t\t<field name=\"taskDescription\"/>\n\t\t<field name=\"taskId\"/>\n\t\t<field name=\"topActivity\"/>\n\t</class>\n\t<class name=\"android/app/TaskStackBuilder\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addNextIntent(Landroid/content/Intent;)Landroid/app/TaskStackBuilder;\"/>\n\t\t<method name=\"addNextIntentWithParentStack(Landroid/content/Intent;)Landroid/app/TaskStackBuilder;\"/>\n\t\t<method name=\"addParentStack(Landroid/app/Activity;)Landroid/app/TaskStackBuilder;\"/>\n\t\t<method name=\"addParentStack(Landroid/content/ComponentName;)Landroid/app/TaskStackBuilder;\"/>\n\t\t<method name=\"addParentStack(Ljava/lang/Class;)Landroid/app/TaskStackBuilder;\"/>\n\t\t<method name=\"create(Landroid/content/Context;)Landroid/app/TaskStackBuilder;\"/>\n\t\t<method name=\"editIntentAt(I)Landroid/content/Intent;\"/>\n\t\t<method name=\"getIntentCount()I\"/>\n\t\t<method name=\"getIntents()[Landroid/content/Intent;\"/>\n\t\t<method name=\"getPendingIntent(II)Landroid/app/PendingIntent;\"/>\n\t\t<method name=\"getPendingIntent(IILandroid/os/Bundle;)Landroid/app/PendingIntent;\"/>\n\t\t<method name=\"startActivities()V\"/>\n\t\t<method name=\"startActivities(Landroid/os/Bundle;)V\"/>\n\t</class>\n\t<class name=\"android/app/TimePickerDialog\" since=\"1\">\n\t\t<extends name=\"android/app/AlertDialog\"/>\n\t\t<implements name=\"android/content/DialogInterface$OnClickListener\"/>\n\t\t<implements name=\"android/widget/TimePicker$OnTimeChangedListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;ILandroid/app/TimePickerDialog$OnTimeSetListener;IIZ)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/app/TimePickerDialog$OnTimeSetListener;IIZ)V\"/>\n\t\t<method name=\"updateTime(II)V\"/>\n\t</class>\n\t<class name=\"android/app/TimePickerDialog$OnTimeSetListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onTimeSet(Landroid/widget/TimePicker;II)V\"/>\n\t</class>\n\t<class name=\"android/app/UiAutomation\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"adoptShellPermissionIdentity()V\" since=\"29\"/>\n\t\t<method name=\"adoptShellPermissionIdentity([Ljava/lang/String;)V\" since=\"29\"/>\n\t\t<method name=\"clearWindowAnimationFrameStats()V\" since=\"21\"/>\n\t\t<method name=\"clearWindowContentFrameStats(I)Z\" since=\"21\"/>\n\t\t<method name=\"dropShellPermissionIdentity()V\" since=\"29\"/>\n\t\t<method name=\"executeAndWaitForEvent(Ljava/lang/Runnable;Landroid/app/UiAutomation$AccessibilityEventFilter;J)Landroid/view/accessibility/AccessibilityEvent;\"/>\n\t\t<method name=\"executeShellCommand(Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;\" since=\"21\"/>\n\t\t<method name=\"findFocus(I)Landroid/view/accessibility/AccessibilityNodeInfo;\" since=\"21\"/>\n\t\t<method name=\"getRootInActiveWindow()Landroid/view/accessibility/AccessibilityNodeInfo;\"/>\n\t\t<method name=\"getServiceInfo()Landroid/accessibilityservice/AccessibilityServiceInfo;\"/>\n\t\t<method name=\"getWindowAnimationFrameStats()Landroid/view/WindowAnimationFrameStats;\" since=\"21\"/>\n\t\t<method name=\"getWindowContentFrameStats(I)Landroid/view/WindowContentFrameStats;\" since=\"21\"/>\n\t\t<method name=\"getWindows()Ljava/util/List;\" since=\"21\"/>\n\t\t<method name=\"grantRuntimePermission(Ljava/lang/String;Ljava/lang/String;)V\" since=\"28\"/>\n\t\t<method name=\"grantRuntimePermissionAsUser(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)V\" since=\"28\"/>\n\t\t<method name=\"injectInputEvent(Landroid/view/InputEvent;Z)Z\"/>\n\t\t<method name=\"performGlobalAction(I)Z\"/>\n\t\t<method name=\"revokeRuntimePermission(Ljava/lang/String;Ljava/lang/String;)V\" since=\"28\"/>\n\t\t<method name=\"revokeRuntimePermissionAsUser(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)V\" since=\"28\"/>\n\t\t<method name=\"setOnAccessibilityEventListener(Landroid/app/UiAutomation$OnAccessibilityEventListener;)V\"/>\n\t\t<method name=\"setRotation(I)Z\"/>\n\t\t<method name=\"setRunAsMonkey(Z)V\"/>\n\t\t<method name=\"setServiceInfo(Landroid/accessibilityservice/AccessibilityServiceInfo;)V\"/>\n\t\t<method name=\"takeScreenshot()Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"waitForIdle(JJ)V\"/>\n\t\t<field name=\"FLAG_DONT_SUPPRESS_ACCESSIBILITY_SERVICES\" since=\"24\"/>\n\t\t<field name=\"ROTATION_FREEZE_0\"/>\n\t\t<field name=\"ROTATION_FREEZE_180\"/>\n\t\t<field name=\"ROTATION_FREEZE_270\"/>\n\t\t<field name=\"ROTATION_FREEZE_90\"/>\n\t\t<field name=\"ROTATION_FREEZE_CURRENT\"/>\n\t\t<field name=\"ROTATION_UNFREEZE\"/>\n\t</class>\n\t<class name=\"android/app/UiAutomation$AccessibilityEventFilter\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"accept(Landroid/view/accessibility/AccessibilityEvent;)Z\"/>\n\t</class>\n\t<class name=\"android/app/UiAutomation$OnAccessibilityEventListener\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V\"/>\n\t</class>\n\t<class name=\"android/app/UiModeManager\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"disableCarMode(I)V\"/>\n\t\t<method name=\"enableCarMode(I)V\"/>\n\t\t<method name=\"getCurrentModeType()I\"/>\n\t\t<method name=\"getNightMode()I\"/>\n\t\t<method name=\"setNightMode(I)V\"/>\n\t\t<field name=\"ACTION_ENTER_CAR_MODE\"/>\n\t\t<field name=\"ACTION_ENTER_DESK_MODE\"/>\n\t\t<field name=\"ACTION_EXIT_CAR_MODE\"/>\n\t\t<field name=\"ACTION_EXIT_DESK_MODE\"/>\n\t\t<field name=\"DISABLE_CAR_MODE_GO_HOME\"/>\n\t\t<field name=\"ENABLE_CAR_MODE_ALLOW_SLEEP\" since=\"21\"/>\n\t\t<field name=\"ENABLE_CAR_MODE_GO_CAR_HOME\"/>\n\t\t<field name=\"MODE_NIGHT_AUTO\"/>\n\t\t<field name=\"MODE_NIGHT_NO\"/>\n\t\t<field name=\"MODE_NIGHT_YES\"/>\n\t</class>\n\t<class name=\"android/app/VoiceInteractor\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getActiveRequest(Ljava/lang/String;)Landroid/app/VoiceInteractor$Request;\"/>\n\t\t<method name=\"getActiveRequests()[Landroid/app/VoiceInteractor$Request;\"/>\n\t\t<method name=\"isDestroyed()Z\" since=\"29\"/>\n\t\t<method name=\"notifyDirectActionsChanged()V\" since=\"29\"/>\n\t\t<method name=\"registerOnDestroyedCallback(Ljava/util/concurrent/Executor;Ljava/lang/Runnable;)Z\" since=\"29\"/>\n\t\t<method name=\"submitRequest(Landroid/app/VoiceInteractor$Request;)Z\"/>\n\t\t<method name=\"submitRequest(Landroid/app/VoiceInteractor$Request;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"supportsCommands([Ljava/lang/String;)[Z\"/>\n\t\t<method name=\"unregisterOnDestroyedCallback(Ljava/lang/Runnable;)Z\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/app/VoiceInteractor$AbortVoiceRequest\" since=\"23\">\n\t\t<extends name=\"android/app/VoiceInteractor$Request\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/VoiceInteractor$Prompt;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onAbortResult(Landroid/os/Bundle;)V\"/>\n\t</class>\n\t<class name=\"android/app/VoiceInteractor$CommandRequest\" since=\"23\">\n\t\t<extends name=\"android/app/VoiceInteractor$Request\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onCommandResult(ZLandroid/os/Bundle;)V\"/>\n\t</class>\n\t<class name=\"android/app/VoiceInteractor$CompleteVoiceRequest\" since=\"23\">\n\t\t<extends name=\"android/app/VoiceInteractor$Request\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/VoiceInteractor$Prompt;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onCompleteResult(Landroid/os/Bundle;)V\"/>\n\t</class>\n\t<class name=\"android/app/VoiceInteractor$ConfirmationRequest\" since=\"23\">\n\t\t<extends name=\"android/app/VoiceInteractor$Request\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/VoiceInteractor$Prompt;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onConfirmationResult(ZLandroid/os/Bundle;)V\"/>\n\t</class>\n\t<class name=\"android/app/VoiceInteractor$PickOptionRequest\" since=\"23\">\n\t\t<extends name=\"android/app/VoiceInteractor$Request\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/VoiceInteractor$Prompt;[Landroid/app/VoiceInteractor$PickOptionRequest$Option;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onPickOptionResult(Z[Landroid/app/VoiceInteractor$PickOptionRequest$Option;Landroid/os/Bundle;)V\"/>\n\t</class>\n\t<class name=\"android/app/VoiceInteractor$PickOptionRequest$Option\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;I)V\"/>\n\t\t<method name=\"addSynonym(Ljava/lang/CharSequence;)Landroid/app/VoiceInteractor$PickOptionRequest$Option;\"/>\n\t\t<method name=\"countSynonyms()I\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getIndex()I\"/>\n\t\t<method name=\"getLabel()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getSynonymAt(I)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/VoiceInteractor$Prompt\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"&lt;init>([Ljava/lang/CharSequence;Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"countVoicePrompts()I\"/>\n\t\t<method name=\"getVisualPrompt()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getVoicePromptAt(I)Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/VoiceInteractor$Request\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"cancel()V\"/>\n\t\t<method name=\"getActivity()Landroid/app/Activity;\"/>\n\t\t<method name=\"getContext()Landroid/content/Context;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"onAttached(Landroid/app/Activity;)V\"/>\n\t\t<method name=\"onCancel()V\"/>\n\t\t<method name=\"onDetached()V\"/>\n\t</class>\n\t<class name=\"android/app/WallpaperColors\" since=\"27\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Color;Landroid/graphics/Color;Landroid/graphics/Color;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"fromBitmap(Landroid/graphics/Bitmap;)Landroid/app/WallpaperColors;\"/>\n\t\t<method name=\"fromDrawable(Landroid/graphics/drawable/Drawable;)Landroid/app/WallpaperColors;\"/>\n\t\t<method name=\"getPrimaryColor()Landroid/graphics/Color;\"/>\n\t\t<method name=\"getSecondaryColor()Landroid/graphics/Color;\"/>\n\t\t<method name=\"getTertiaryColor()Landroid/graphics/Color;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/WallpaperInfo\" since=\"7\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/content/pm/ResolveInfo;)V\"/>\n\t\t<method name=\"dump(Landroid/util/Printer;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getComponent()Landroid/content/ComponentName;\"/>\n\t\t<method name=\"getPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getServiceInfo()Landroid/content/pm/ServiceInfo;\"/>\n\t\t<method name=\"getServiceName()Ljava/lang/String;\"/>\n\t\t<method name=\"getSettingsActivity()Ljava/lang/String;\"/>\n\t\t<method name=\"getSettingsSliceUri()Landroid/net/Uri;\" since=\"29\"/>\n\t\t<method name=\"getShowMetadataInPreview()Z\" since=\"25\"/>\n\t\t<method name=\"loadAuthor(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"loadContextDescription(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;\" since=\"25\"/>\n\t\t<method name=\"loadContextUri(Landroid/content/pm/PackageManager;)Landroid/net/Uri;\" since=\"25\"/>\n\t\t<method name=\"loadDescription(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"loadThumbnail(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"supportsMultipleDisplays()Z\" since=\"29\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/WallpaperManager\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addOnColorsChangedListener(Landroid/app/WallpaperManager$OnColorsChangedListener;Landroid/os/Handler;)V\" since=\"27\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"clear(I)V\" since=\"24\"/>\n\t\t<method name=\"clearWallpaper()V\" since=\"28\"/>\n\t\t<method name=\"clearWallpaperOffsets(Landroid/os/IBinder;)V\"/>\n\t\t<method name=\"forgetLoadedWallpaper()V\" since=\"14\"/>\n\t\t<method name=\"getBuiltInDrawable()Landroid/graphics/drawable/Drawable;\" since=\"19\"/>\n\t\t<method name=\"getBuiltInDrawable(I)Landroid/graphics/drawable/Drawable;\" since=\"24\"/>\n\t\t<method name=\"getBuiltInDrawable(IIZFF)Landroid/graphics/drawable/Drawable;\" since=\"19\"/>\n\t\t<method name=\"getBuiltInDrawable(IIZFFI)Landroid/graphics/drawable/Drawable;\" since=\"24\"/>\n\t\t<method name=\"getCropAndSetWallpaperIntent(Landroid/net/Uri;)Landroid/content/Intent;\" since=\"19\"/>\n\t\t<method name=\"getDesiredMinimumHeight()I\"/>\n\t\t<method name=\"getDesiredMinimumWidth()I\"/>\n\t\t<method name=\"getDrawable()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getFastDrawable()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getInstance(Landroid/content/Context;)Landroid/app/WallpaperManager;\"/>\n\t\t<method name=\"getWallpaperColors(I)Landroid/app/WallpaperColors;\" since=\"27\"/>\n\t\t<method name=\"getWallpaperFile(I)Landroid/os/ParcelFileDescriptor;\" since=\"24\"/>\n\t\t<method name=\"getWallpaperId(I)I\" since=\"24\"/>\n\t\t<method name=\"getWallpaperInfo()Landroid/app/WallpaperInfo;\" since=\"7\"/>\n\t\t<method name=\"hasResourceWallpaper(I)Z\" since=\"17\"/>\n\t\t<method name=\"isSetWallpaperAllowed()Z\" since=\"24\"/>\n\t\t<method name=\"isWallpaperSupported()Z\" since=\"23\"/>\n\t\t<method name=\"peekDrawable()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"peekFastDrawable()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"removeOnColorsChangedListener(Landroid/app/WallpaperManager$OnColorsChangedListener;)V\" since=\"27\"/>\n\t\t<method name=\"sendWallpaperCommand(Landroid/os/IBinder;Ljava/lang/String;IIILandroid/os/Bundle;)V\" since=\"7\"/>\n\t\t<method name=\"setBitmap(Landroid/graphics/Bitmap;)V\"/>\n\t\t<method name=\"setBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;Z)I\" since=\"24\"/>\n\t\t<method name=\"setBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;ZI)I\" since=\"24\"/>\n\t\t<method name=\"setDisplayPadding(Landroid/graphics/Rect;)V\" since=\"28\"/>\n\t\t<method name=\"setResource(I)V\"/>\n\t\t<method name=\"setResource(II)I\" since=\"24\"/>\n\t\t<method name=\"setStream(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"setStream(Ljava/io/InputStream;Landroid/graphics/Rect;Z)I\" since=\"24\"/>\n\t\t<method name=\"setStream(Ljava/io/InputStream;Landroid/graphics/Rect;ZI)I\" since=\"24\"/>\n\t\t<method name=\"setWallpaperOffsetSteps(FF)V\" since=\"7\"/>\n\t\t<method name=\"setWallpaperOffsets(Landroid/os/IBinder;FF)V\"/>\n\t\t<method name=\"suggestDesiredDimensions(II)V\"/>\n\t\t<field name=\"ACTION_CHANGE_LIVE_WALLPAPER\" since=\"16\"/>\n\t\t<field name=\"ACTION_CROP_AND_SET_WALLPAPER\" since=\"19\"/>\n\t\t<field name=\"ACTION_LIVE_WALLPAPER_CHOOSER\" since=\"7\"/>\n\t\t<field name=\"COMMAND_DROP\" since=\"7\"/>\n\t\t<field name=\"COMMAND_SECONDARY_TAP\" since=\"11\"/>\n\t\t<field name=\"COMMAND_TAP\" since=\"7\"/>\n\t\t<field name=\"EXTRA_LIVE_WALLPAPER_COMPONENT\" since=\"16\"/>\n\t\t<field name=\"FLAG_LOCK\" since=\"24\"/>\n\t\t<field name=\"FLAG_SYSTEM\" since=\"24\"/>\n\t\t<field name=\"WALLPAPER_PREVIEW_META_DATA\" since=\"11\"/>\n\t</class>\n\t<class name=\"android/app/WallpaperManager$OnColorsChangedListener\" since=\"27\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onColorsChanged(Landroid/app/WallpaperColors;I)V\"/>\n\t</class>\n\t<class name=\"android/app/ZygotePreload\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"doPreload(Landroid/content/pm/ApplicationInfo;)V\"/>\n\t</class>\n\t<class name=\"android/app/admin/ConnectEvent\" since=\"26\">\n\t\t<extends name=\"android/app/admin/NetworkEvent\"/>\n\t\t<method name=\"getInetAddress()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getPort()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/admin/DelegatedAdminReceiver\" since=\"29\">\n\t\t<extends name=\"android/content/BroadcastReceiver\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onChoosePrivateKeyAlias(Landroid/content/Context;Landroid/content/Intent;ILandroid/net/Uri;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"onNetworkLogsAvailable(Landroid/content/Context;Landroid/content/Intent;JI)V\"/>\n\t</class>\n\t<class name=\"android/app/admin/DeviceAdminInfo\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/content/pm/ResolveInfo;)V\"/>\n\t\t<method name=\"dump(Landroid/util/Printer;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getActivityInfo()Landroid/content/pm/ActivityInfo;\"/>\n\t\t<method name=\"getComponent()Landroid/content/ComponentName;\"/>\n\t\t<method name=\"getPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getReceiverName()Ljava/lang/String;\"/>\n\t\t<method name=\"getTagForPolicy(I)Ljava/lang/String;\"/>\n\t\t<method name=\"isVisible()Z\"/>\n\t\t<method name=\"loadDescription(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"supportsTransferOwnership()Z\" since=\"28\"/>\n\t\t<method name=\"usesPolicy(I)Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"USES_ENCRYPTED_STORAGE\" since=\"11\"/>\n\t\t<field name=\"USES_POLICY_DISABLE_CAMERA\" since=\"14\"/>\n\t\t<field name=\"USES_POLICY_DISABLE_KEYGUARD_FEATURES\" since=\"17\"/>\n\t\t<field name=\"USES_POLICY_EXPIRE_PASSWORD\" since=\"11\"/>\n\t\t<field name=\"USES_POLICY_FORCE_LOCK\"/>\n\t\t<field name=\"USES_POLICY_LIMIT_PASSWORD\"/>\n\t\t<field name=\"USES_POLICY_RESET_PASSWORD\"/>\n\t\t<field name=\"USES_POLICY_WATCH_LOGIN\"/>\n\t\t<field name=\"USES_POLICY_WIPE_DATA\"/>\n\t</class>\n\t<class name=\"android/app/admin/DeviceAdminReceiver\" since=\"8\">\n\t\t<extends name=\"android/content/BroadcastReceiver\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getManager(Landroid/content/Context;)Landroid/app/admin/DevicePolicyManager;\"/>\n\t\t<method name=\"getWho(Landroid/content/Context;)Landroid/content/ComponentName;\"/>\n\t\t<method name=\"onBugreportFailed(Landroid/content/Context;Landroid/content/Intent;I)V\" since=\"24\"/>\n\t\t<method name=\"onBugreportShared(Landroid/content/Context;Landroid/content/Intent;Ljava/lang/String;)V\" since=\"24\"/>\n\t\t<method name=\"onBugreportSharingDeclined(Landroid/content/Context;Landroid/content/Intent;)V\" since=\"24\"/>\n\t\t<method name=\"onChoosePrivateKeyAlias(Landroid/content/Context;Landroid/content/Intent;ILandroid/net/Uri;Ljava/lang/String;)Ljava/lang/String;\" since=\"23\"/>\n\t\t<method name=\"onDisableRequested(Landroid/content/Context;Landroid/content/Intent;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"onDisabled(Landroid/content/Context;Landroid/content/Intent;)V\"/>\n\t\t<method name=\"onEnabled(Landroid/content/Context;Landroid/content/Intent;)V\"/>\n\t\t<method name=\"onLockTaskModeEntering(Landroid/content/Context;Landroid/content/Intent;Ljava/lang/String;)V\" since=\"21\"/>\n\t\t<method name=\"onLockTaskModeExiting(Landroid/content/Context;Landroid/content/Intent;)V\" since=\"21\"/>\n\t\t<method name=\"onNetworkLogsAvailable(Landroid/content/Context;Landroid/content/Intent;JI)V\" since=\"26\"/>\n\t\t<method name=\"onPasswordChanged(Landroid/content/Context;Landroid/content/Intent;)V\" deprecated=\"26\"/>\n\t\t<method name=\"onPasswordChanged(Landroid/content/Context;Landroid/content/Intent;Landroid/os/UserHandle;)V\" since=\"26\"/>\n\t\t<method name=\"onPasswordExpiring(Landroid/content/Context;Landroid/content/Intent;)V\" since=\"11\" deprecated=\"26\"/>\n\t\t<method name=\"onPasswordExpiring(Landroid/content/Context;Landroid/content/Intent;Landroid/os/UserHandle;)V\" since=\"26\"/>\n\t\t<method name=\"onPasswordFailed(Landroid/content/Context;Landroid/content/Intent;)V\" deprecated=\"26\"/>\n\t\t<method name=\"onPasswordFailed(Landroid/content/Context;Landroid/content/Intent;Landroid/os/UserHandle;)V\" since=\"26\"/>\n\t\t<method name=\"onPasswordSucceeded(Landroid/content/Context;Landroid/content/Intent;)V\" deprecated=\"26\"/>\n\t\t<method name=\"onPasswordSucceeded(Landroid/content/Context;Landroid/content/Intent;Landroid/os/UserHandle;)V\" since=\"26\"/>\n\t\t<method name=\"onProfileProvisioningComplete(Landroid/content/Context;Landroid/content/Intent;)V\" since=\"21\"/>\n\t\t<method name=\"onReadyForUserInitialization(Landroid/content/Context;Landroid/content/Intent;)V\" since=\"23\" deprecated=\"24\"/>\n\t\t<method name=\"onSecurityLogsAvailable(Landroid/content/Context;Landroid/content/Intent;)V\" since=\"24\"/>\n\t\t<method name=\"onSystemUpdatePending(Landroid/content/Context;Landroid/content/Intent;J)V\" since=\"23\"/>\n\t\t<method name=\"onTransferAffiliatedProfileOwnershipComplete(Landroid/content/Context;Landroid/os/UserHandle;)V\" since=\"28\"/>\n\t\t<method name=\"onTransferOwnershipComplete(Landroid/content/Context;Landroid/os/PersistableBundle;)V\" since=\"28\"/>\n\t\t<method name=\"onUserAdded(Landroid/content/Context;Landroid/content/Intent;Landroid/os/UserHandle;)V\" since=\"26\"/>\n\t\t<method name=\"onUserRemoved(Landroid/content/Context;Landroid/content/Intent;Landroid/os/UserHandle;)V\" since=\"26\"/>\n\t\t<method name=\"onUserStarted(Landroid/content/Context;Landroid/content/Intent;Landroid/os/UserHandle;)V\" since=\"28\"/>\n\t\t<method name=\"onUserStopped(Landroid/content/Context;Landroid/content/Intent;Landroid/os/UserHandle;)V\" since=\"28\"/>\n\t\t<method name=\"onUserSwitched(Landroid/content/Context;Landroid/content/Intent;Landroid/os/UserHandle;)V\" since=\"28\"/>\n\t\t<field name=\"ACTION_CHOOSE_PRIVATE_KEY_ALIAS\" since=\"29\"/>\n\t\t<field name=\"ACTION_DEVICE_ADMIN_DISABLED\"/>\n\t\t<field name=\"ACTION_DEVICE_ADMIN_DISABLE_REQUESTED\"/>\n\t\t<field name=\"ACTION_DEVICE_ADMIN_ENABLED\"/>\n\t\t<field name=\"ACTION_LOCK_TASK_ENTERING\" since=\"21\"/>\n\t\t<field name=\"ACTION_LOCK_TASK_EXITING\" since=\"21\"/>\n\t\t<field name=\"ACTION_NETWORK_LOGS_AVAILABLE\" since=\"29\"/>\n\t\t<field name=\"ACTION_PASSWORD_CHANGED\"/>\n\t\t<field name=\"ACTION_PASSWORD_EXPIRING\" since=\"11\"/>\n\t\t<field name=\"ACTION_PASSWORD_FAILED\"/>\n\t\t<field name=\"ACTION_PASSWORD_SUCCEEDED\"/>\n\t\t<field name=\"ACTION_PROFILE_PROVISIONING_COMPLETE\" since=\"21\"/>\n\t\t<field name=\"BUGREPORT_FAILURE_FAILED_COMPLETING\" since=\"24\"/>\n\t\t<field name=\"BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE\" since=\"24\"/>\n\t\t<field name=\"DEVICE_ADMIN_META_DATA\"/>\n\t\t<field name=\"EXTRA_DISABLE_WARNING\"/>\n\t\t<field name=\"EXTRA_LOCK_TASK_PACKAGE\" since=\"21\"/>\n\t\t<field name=\"EXTRA_TRANSFER_OWNERSHIP_ADMIN_EXTRAS_BUNDLE\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/app/admin/DeviceAdminService\" since=\"26\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/app/admin/DevicePolicyManager\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addCrossProfileIntentFilter(Landroid/content/ComponentName;Landroid/content/IntentFilter;I)V\" since=\"21\"/>\n\t\t<method name=\"addCrossProfileWidgetProvider(Landroid/content/ComponentName;Ljava/lang/String;)Z\" since=\"21\"/>\n\t\t<method name=\"addOverrideApn(Landroid/content/ComponentName;Landroid/telephony/data/ApnSetting;)I\" since=\"28\"/>\n\t\t<method name=\"addPersistentPreferredActivity(Landroid/content/ComponentName;Landroid/content/IntentFilter;Landroid/content/ComponentName;)V\" since=\"21\"/>\n\t\t<method name=\"addUserRestriction(Landroid/content/ComponentName;Ljava/lang/String;)V\" since=\"21\"/>\n\t\t<method name=\"bindDeviceAdminServiceAsUser(Landroid/content/ComponentName;Landroid/content/Intent;Landroid/content/ServiceConnection;ILandroid/os/UserHandle;)Z\" since=\"26\"/>\n\t\t<method name=\"clearApplicationUserData(Landroid/content/ComponentName;Ljava/lang/String;Ljava/util/concurrent/Executor;Landroid/app/admin/DevicePolicyManager$OnClearApplicationUserDataListener;)V\" since=\"28\"/>\n\t\t<method name=\"clearCrossProfileIntentFilters(Landroid/content/ComponentName;)V\" since=\"21\"/>\n\t\t<method name=\"clearDeviceOwnerApp(Ljava/lang/String;)V\" since=\"21\" deprecated=\"26\"/>\n\t\t<method name=\"clearPackagePersistentPreferredActivities(Landroid/content/ComponentName;Ljava/lang/String;)V\" since=\"21\"/>\n\t\t<method name=\"clearProfileOwner(Landroid/content/ComponentName;)V\" since=\"24\" deprecated=\"26\"/>\n\t\t<method name=\"clearResetPasswordToken(Landroid/content/ComponentName;)Z\" since=\"26\"/>\n\t\t<method name=\"clearUserRestriction(Landroid/content/ComponentName;Ljava/lang/String;)V\" since=\"21\"/>\n\t\t<method name=\"createAdminSupportIntent(Ljava/lang/String;)Landroid/content/Intent;\" since=\"26\"/>\n\t\t<method name=\"createAndInitializeUser(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;Landroid/content/ComponentName;Landroid/os/Bundle;)Landroid/os/UserHandle;\" since=\"21\" deprecated=\"23\" removed=\"24\"/>\n\t\t<method name=\"createAndManageUser(Landroid/content/ComponentName;Ljava/lang/String;Landroid/content/ComponentName;Landroid/os/PersistableBundle;I)Landroid/os/UserHandle;\" since=\"24\"/>\n\t\t<method name=\"createUser(Landroid/content/ComponentName;Ljava/lang/String;)Landroid/os/UserHandle;\" since=\"21\" deprecated=\"23\" removed=\"24\"/>\n\t\t<method name=\"enableSystemApp(Landroid/content/ComponentName;Landroid/content/Intent;)I\" since=\"21\"/>\n\t\t<method name=\"enableSystemApp(Landroid/content/ComponentName;Ljava/lang/String;)V\" since=\"21\"/>\n\t\t<method name=\"generateKeyPair(Landroid/content/ComponentName;Ljava/lang/String;Landroid/security/keystore/KeyGenParameterSpec;I)Landroid/security/AttestedKeyPair;\" since=\"28\"/>\n\t\t<method name=\"getAccountTypesWithManagementDisabled()[Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"getActiveAdmins()Ljava/util/List;\"/>\n\t\t<method name=\"getAffiliationIds(Landroid/content/ComponentName;)Ljava/util/Set;\" since=\"26\"/>\n\t\t<method name=\"getAlwaysOnVpnLockdownWhitelist(Landroid/content/ComponentName;)Ljava/util/Set;\" since=\"29\"/>\n\t\t<method name=\"getAlwaysOnVpnPackage(Landroid/content/ComponentName;)Ljava/lang/String;\" since=\"24\"/>\n\t\t<method name=\"getApplicationRestrictions(Landroid/content/ComponentName;Ljava/lang/String;)Landroid/os/Bundle;\" since=\"21\"/>\n\t\t<method name=\"getApplicationRestrictionsManagingPackage(Landroid/content/ComponentName;)Ljava/lang/String;\" since=\"24\" deprecated=\"26\"/>\n\t\t<method name=\"getAutoTimeRequired()Z\" since=\"21\"/>\n\t\t<method name=\"getBindDeviceAdminTargetUsers(Landroid/content/ComponentName;)Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"getBluetoothContactSharingDisabled(Landroid/content/ComponentName;)Z\" since=\"23\"/>\n\t\t<method name=\"getCameraDisabled(Landroid/content/ComponentName;)Z\" since=\"14\"/>\n\t\t<method name=\"getCertInstallerPackage(Landroid/content/ComponentName;)Ljava/lang/String;\" since=\"23\" deprecated=\"26\"/>\n\t\t<method name=\"getCrossProfileCalendarPackages(Landroid/content/ComponentName;)Ljava/util/Set;\" since=\"29\"/>\n\t\t<method name=\"getCrossProfileCallerIdDisabled(Landroid/content/ComponentName;)Z\" since=\"21\"/>\n\t\t<method name=\"getCrossProfileContactsSearchDisabled(Landroid/content/ComponentName;)Z\" since=\"24\"/>\n\t\t<method name=\"getCrossProfileWidgetProviders(Landroid/content/ComponentName;)Ljava/util/List;\" since=\"21\"/>\n\t\t<method name=\"getCurrentFailedPasswordAttempts()I\"/>\n\t\t<method name=\"getDelegatePackages(Landroid/content/ComponentName;Ljava/lang/String;)Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"getDelegatedScopes(Landroid/content/ComponentName;Ljava/lang/String;)Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"getDeviceOwnerLockScreenInfo()Ljava/lang/CharSequence;\" since=\"24\"/>\n\t\t<method name=\"getEndUserSessionMessage(Landroid/content/ComponentName;)Ljava/lang/CharSequence;\" since=\"28\"/>\n\t\t<method name=\"getGlobalPrivateDnsHost(Landroid/content/ComponentName;)Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getGlobalPrivateDnsMode(Landroid/content/ComponentName;)I\" since=\"29\"/>\n\t\t<method name=\"getInstalledCaCerts(Landroid/content/ComponentName;)Ljava/util/List;\" since=\"21\"/>\n\t\t<method name=\"getKeepUninstalledPackages(Landroid/content/ComponentName;)Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"getKeyguardDisabledFeatures(Landroid/content/ComponentName;)I\" since=\"17\"/>\n\t\t<method name=\"getLockTaskFeatures(Landroid/content/ComponentName;)I\" since=\"28\"/>\n\t\t<method name=\"getLockTaskPackages(Landroid/content/ComponentName;)[Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getLongSupportMessage(Landroid/content/ComponentName;)Ljava/lang/CharSequence;\" since=\"24\"/>\n\t\t<method name=\"getMaximumFailedPasswordsForWipe(Landroid/content/ComponentName;)I\"/>\n\t\t<method name=\"getMaximumTimeToLock(Landroid/content/ComponentName;)J\"/>\n\t\t<method name=\"getMeteredDataDisabledPackages(Landroid/content/ComponentName;)Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"getOrganizationColor(Landroid/content/ComponentName;)I\" since=\"24\"/>\n\t\t<method name=\"getOrganizationName(Landroid/content/ComponentName;)Ljava/lang/CharSequence;\" since=\"24\"/>\n\t\t<method name=\"getOverrideApns(Landroid/content/ComponentName;)Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"getParentProfileInstance(Landroid/content/ComponentName;)Landroid/app/admin/DevicePolicyManager;\" since=\"24\"/>\n\t\t<method name=\"getPasswordComplexity()I\" since=\"29\"/>\n\t\t<method name=\"getPasswordExpiration(Landroid/content/ComponentName;)J\" since=\"11\"/>\n\t\t<method name=\"getPasswordExpirationTimeout(Landroid/content/ComponentName;)J\" since=\"11\"/>\n\t\t<method name=\"getPasswordHistoryLength(Landroid/content/ComponentName;)I\" since=\"11\"/>\n\t\t<method name=\"getPasswordMaximumLength(I)I\"/>\n\t\t<method name=\"getPasswordMinimumLength(Landroid/content/ComponentName;)I\"/>\n\t\t<method name=\"getPasswordMinimumLetters(Landroid/content/ComponentName;)I\" since=\"11\"/>\n\t\t<method name=\"getPasswordMinimumLowerCase(Landroid/content/ComponentName;)I\" since=\"11\"/>\n\t\t<method name=\"getPasswordMinimumNonLetter(Landroid/content/ComponentName;)I\" since=\"11\"/>\n\t\t<method name=\"getPasswordMinimumNumeric(Landroid/content/ComponentName;)I\" since=\"11\"/>\n\t\t<method name=\"getPasswordMinimumSymbols(Landroid/content/ComponentName;)I\" since=\"11\"/>\n\t\t<method name=\"getPasswordMinimumUpperCase(Landroid/content/ComponentName;)I\" since=\"11\"/>\n\t\t<method name=\"getPasswordQuality(Landroid/content/ComponentName;)I\"/>\n\t\t<method name=\"getPendingSystemUpdate(Landroid/content/ComponentName;)Landroid/app/admin/SystemUpdateInfo;\" since=\"26\"/>\n\t\t<method name=\"getPermissionGrantState(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;)I\" since=\"23\"/>\n\t\t<method name=\"getPermissionPolicy(Landroid/content/ComponentName;)I\" since=\"23\"/>\n\t\t<method name=\"getPermittedAccessibilityServices(Landroid/content/ComponentName;)Ljava/util/List;\" since=\"21\"/>\n\t\t<method name=\"getPermittedCrossProfileNotificationListeners(Landroid/content/ComponentName;)Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"getPermittedInputMethods(Landroid/content/ComponentName;)Ljava/util/List;\" since=\"21\"/>\n\t\t<method name=\"getRequiredStrongAuthTimeout(Landroid/content/ComponentName;)J\" since=\"26\"/>\n\t\t<method name=\"getScreenCaptureDisabled(Landroid/content/ComponentName;)Z\" since=\"21\"/>\n\t\t<method name=\"getSecondaryUsers(Landroid/content/ComponentName;)Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"getShortSupportMessage(Landroid/content/ComponentName;)Ljava/lang/CharSequence;\" since=\"24\"/>\n\t\t<method name=\"getStartUserSessionMessage(Landroid/content/ComponentName;)Ljava/lang/CharSequence;\" since=\"28\"/>\n\t\t<method name=\"getStorageEncryption(Landroid/content/ComponentName;)Z\" since=\"11\"/>\n\t\t<method name=\"getStorageEncryptionStatus()I\" since=\"11\"/>\n\t\t<method name=\"getSystemUpdatePolicy()Landroid/app/admin/SystemUpdatePolicy;\" since=\"23\"/>\n\t\t<method name=\"getTransferOwnershipBundle()Landroid/os/PersistableBundle;\" since=\"28\"/>\n\t\t<method name=\"getTrustAgentConfiguration(Landroid/content/ComponentName;Landroid/content/ComponentName;)Ljava/util/List;\" since=\"23\"/>\n\t\t<method name=\"getUserRestrictions(Landroid/content/ComponentName;)Landroid/os/Bundle;\" since=\"24\"/>\n\t\t<method name=\"getWifiMacAddress(Landroid/content/ComponentName;)Ljava/lang/String;\" since=\"24\"/>\n\t\t<method name=\"hasCaCertInstalled(Landroid/content/ComponentName;[B)Z\" since=\"21\"/>\n\t\t<method name=\"hasGrantedPolicy(Landroid/content/ComponentName;I)Z\" since=\"11\"/>\n\t\t<method name=\"installCaCert(Landroid/content/ComponentName;[B)Z\" since=\"21\"/>\n\t\t<method name=\"installExistingPackage(Landroid/content/ComponentName;Ljava/lang/String;)Z\" since=\"28\"/>\n\t\t<method name=\"installKeyPair(Landroid/content/ComponentName;Ljava/security/PrivateKey;Ljava/security/cert/Certificate;Ljava/lang/String;)Z\" since=\"21\"/>\n\t\t<method name=\"installKeyPair(Landroid/content/ComponentName;Ljava/security/PrivateKey;[Ljava/security/cert/Certificate;Ljava/lang/String;I)Z\" since=\"28\"/>\n\t\t<method name=\"installKeyPair(Landroid/content/ComponentName;Ljava/security/PrivateKey;[Ljava/security/cert/Certificate;Ljava/lang/String;Z)Z\" since=\"24\"/>\n\t\t<method name=\"installSystemUpdate(Landroid/content/ComponentName;Landroid/net/Uri;Ljava/util/concurrent/Executor;Landroid/app/admin/DevicePolicyManager$InstallSystemUpdateCallback;)V\" since=\"29\"/>\n\t\t<method name=\"isActivePasswordSufficient()Z\"/>\n\t\t<method name=\"isAdminActive(Landroid/content/ComponentName;)Z\"/>\n\t\t<method name=\"isAffiliatedUser()Z\" since=\"28\"/>\n\t\t<method name=\"isAlwaysOnVpnLockdownEnabled(Landroid/content/ComponentName;)Z\" since=\"29\"/>\n\t\t<method name=\"isApplicationHidden(Landroid/content/ComponentName;Ljava/lang/String;)Z\" since=\"21\"/>\n\t\t<method name=\"isBackupServiceEnabled(Landroid/content/ComponentName;)Z\" since=\"26\"/>\n\t\t<method name=\"isCallerApplicationRestrictionsManagingPackage()Z\" since=\"24\" deprecated=\"26\"/>\n\t\t<method name=\"isDeviceIdAttestationSupported()Z\" since=\"28\"/>\n\t\t<method name=\"isDeviceOwnerApp(Ljava/lang/String;)Z\" since=\"18\"/>\n\t\t<method name=\"isEphemeralUser(Landroid/content/ComponentName;)Z\" since=\"28\"/>\n\t\t<method name=\"isLockTaskPermitted(Ljava/lang/String;)Z\" since=\"21\"/>\n\t\t<method name=\"isLogoutEnabled()Z\" since=\"28\"/>\n\t\t<method name=\"isManagedProfile(Landroid/content/ComponentName;)Z\" since=\"24\"/>\n\t\t<method name=\"isMasterVolumeMuted(Landroid/content/ComponentName;)Z\" since=\"21\"/>\n\t\t<method name=\"isNetworkLoggingEnabled(Landroid/content/ComponentName;)Z\" since=\"26\"/>\n\t\t<method name=\"isOverrideApnEnabled(Landroid/content/ComponentName;)Z\" since=\"28\"/>\n\t\t<method name=\"isPackageSuspended(Landroid/content/ComponentName;Ljava/lang/String;)Z\" since=\"24\"/>\n\t\t<method name=\"isProfileOwnerApp(Ljava/lang/String;)Z\" since=\"21\"/>\n\t\t<method name=\"isProvisioningAllowed(Ljava/lang/String;)Z\" since=\"24\"/>\n\t\t<method name=\"isResetPasswordTokenActive(Landroid/content/ComponentName;)Z\" since=\"26\"/>\n\t\t<method name=\"isSecurityLoggingEnabled(Landroid/content/ComponentName;)Z\" since=\"24\"/>\n\t\t<method name=\"isUninstallBlocked(Landroid/content/ComponentName;Ljava/lang/String;)Z\" since=\"21\"/>\n\t\t<method name=\"isUsingUnifiedPassword(Landroid/content/ComponentName;)Z\" since=\"28\"/>\n\t\t<method name=\"lockNow()V\"/>\n\t\t<method name=\"lockNow(I)V\" since=\"26\"/>\n\t\t<method name=\"logoutUser(Landroid/content/ComponentName;)I\" since=\"28\"/>\n\t\t<method name=\"reboot(Landroid/content/ComponentName;)V\" since=\"24\"/>\n\t\t<method name=\"removeActiveAdmin(Landroid/content/ComponentName;)V\"/>\n\t\t<method name=\"removeCrossProfileWidgetProvider(Landroid/content/ComponentName;Ljava/lang/String;)Z\" since=\"21\"/>\n\t\t<method name=\"removeKeyPair(Landroid/content/ComponentName;Ljava/lang/String;)Z\" since=\"24\"/>\n\t\t<method name=\"removeOverrideApn(Landroid/content/ComponentName;I)Z\" since=\"28\"/>\n\t\t<method name=\"removeUser(Landroid/content/ComponentName;Landroid/os/UserHandle;)Z\" since=\"21\"/>\n\t\t<method name=\"requestBugreport(Landroid/content/ComponentName;)Z\" since=\"24\"/>\n\t\t<method name=\"resetPassword(Ljava/lang/String;I)Z\"/>\n\t\t<method name=\"resetPasswordWithToken(Landroid/content/ComponentName;Ljava/lang/String;[BI)Z\" since=\"26\"/>\n\t\t<method name=\"retrieveNetworkLogs(Landroid/content/ComponentName;J)Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"retrievePreRebootSecurityLogs(Landroid/content/ComponentName;)Ljava/util/List;\" since=\"24\"/>\n\t\t<method name=\"retrieveSecurityLogs(Landroid/content/ComponentName;)Ljava/util/List;\" since=\"24\"/>\n\t\t<method name=\"setAccountManagementDisabled(Landroid/content/ComponentName;Ljava/lang/String;Z)V\" since=\"21\"/>\n\t\t<method name=\"setAffiliationIds(Landroid/content/ComponentName;Ljava/util/Set;)V\" since=\"26\"/>\n\t\t<method name=\"setAlwaysOnVpnPackage(Landroid/content/ComponentName;Ljava/lang/String;Z)V\" since=\"24\"/>\n\t\t<method name=\"setAlwaysOnVpnPackage(Landroid/content/ComponentName;Ljava/lang/String;ZLjava/util/Set;)V\" since=\"29\"/>\n\t\t<method name=\"setApplicationHidden(Landroid/content/ComponentName;Ljava/lang/String;Z)Z\" since=\"21\"/>\n\t\t<method name=\"setApplicationRestrictions(Landroid/content/ComponentName;Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"21\"/>\n\t\t<method name=\"setApplicationRestrictionsManagingPackage(Landroid/content/ComponentName;Ljava/lang/String;)V\" since=\"24\" deprecated=\"26\"/>\n\t\t<method name=\"setAutoTimeRequired(Landroid/content/ComponentName;Z)V\" since=\"21\"/>\n\t\t<method name=\"setBackupServiceEnabled(Landroid/content/ComponentName;Z)V\" since=\"26\"/>\n\t\t<method name=\"setBluetoothContactSharingDisabled(Landroid/content/ComponentName;Z)V\" since=\"23\"/>\n\t\t<method name=\"setCameraDisabled(Landroid/content/ComponentName;Z)V\" since=\"14\"/>\n\t\t<method name=\"setCertInstallerPackage(Landroid/content/ComponentName;Ljava/lang/String;)V\" since=\"23\" deprecated=\"26\"/>\n\t\t<method name=\"setCrossProfileCalendarPackages(Landroid/content/ComponentName;Ljava/util/Set;)V\" since=\"29\"/>\n\t\t<method name=\"setCrossProfileCallerIdDisabled(Landroid/content/ComponentName;Z)V\" since=\"21\"/>\n\t\t<method name=\"setCrossProfileContactsSearchDisabled(Landroid/content/ComponentName;Z)V\" since=\"24\"/>\n\t\t<method name=\"setDefaultSmsApplication(Landroid/content/ComponentName;Ljava/lang/String;)V\" since=\"29\"/>\n\t\t<method name=\"setDelegatedScopes(Landroid/content/ComponentName;Ljava/lang/String;Ljava/util/List;)V\" since=\"26\"/>\n\t\t<method name=\"setDeviceOwnerLockScreenInfo(Landroid/content/ComponentName;Ljava/lang/CharSequence;)V\" since=\"24\"/>\n\t\t<method name=\"setEndUserSessionMessage(Landroid/content/ComponentName;Ljava/lang/CharSequence;)V\" since=\"28\"/>\n\t\t<method name=\"setGlobalPrivateDnsModeOpportunistic(Landroid/content/ComponentName;)I\" since=\"29\"/>\n\t\t<method name=\"setGlobalPrivateDnsModeSpecifiedHost(Landroid/content/ComponentName;Ljava/lang/String;)I\" since=\"29\"/>\n\t\t<method name=\"setGlobalSetting(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;)V\" since=\"21\"/>\n\t\t<method name=\"setKeepUninstalledPackages(Landroid/content/ComponentName;Ljava/util/List;)V\" since=\"28\"/>\n\t\t<method name=\"setKeyPairCertificate(Landroid/content/ComponentName;Ljava/lang/String;Ljava/util/List;Z)Z\" since=\"28\"/>\n\t\t<method name=\"setKeyguardDisabled(Landroid/content/ComponentName;Z)Z\" since=\"23\"/>\n\t\t<method name=\"setKeyguardDisabledFeatures(Landroid/content/ComponentName;I)V\" since=\"17\"/>\n\t\t<method name=\"setLockTaskFeatures(Landroid/content/ComponentName;I)V\" since=\"28\"/>\n\t\t<method name=\"setLockTaskPackages(Landroid/content/ComponentName;[Ljava/lang/String;)V\" since=\"21\"/>\n\t\t<method name=\"setLogoutEnabled(Landroid/content/ComponentName;Z)V\" since=\"28\"/>\n\t\t<method name=\"setLongSupportMessage(Landroid/content/ComponentName;Ljava/lang/CharSequence;)V\" since=\"24\"/>\n\t\t<method name=\"setMasterVolumeMuted(Landroid/content/ComponentName;Z)V\" since=\"21\"/>\n\t\t<method name=\"setMaximumFailedPasswordsForWipe(Landroid/content/ComponentName;I)V\"/>\n\t\t<method name=\"setMaximumTimeToLock(Landroid/content/ComponentName;J)V\"/>\n\t\t<method name=\"setMeteredDataDisabledPackages(Landroid/content/ComponentName;Ljava/util/List;)Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"setNetworkLoggingEnabled(Landroid/content/ComponentName;Z)V\" since=\"26\"/>\n\t\t<method name=\"setOrganizationColor(Landroid/content/ComponentName;I)V\" since=\"24\"/>\n\t\t<method name=\"setOrganizationName(Landroid/content/ComponentName;Ljava/lang/CharSequence;)V\" since=\"24\"/>\n\t\t<method name=\"setOverrideApnsEnabled(Landroid/content/ComponentName;Z)V\" since=\"28\"/>\n\t\t<method name=\"setPackagesSuspended(Landroid/content/ComponentName;[Ljava/lang/String;Z)[Ljava/lang/String;\" since=\"24\"/>\n\t\t<method name=\"setPasswordExpirationTimeout(Landroid/content/ComponentName;J)V\" since=\"11\"/>\n\t\t<method name=\"setPasswordHistoryLength(Landroid/content/ComponentName;I)V\" since=\"11\"/>\n\t\t<method name=\"setPasswordMinimumLength(Landroid/content/ComponentName;I)V\"/>\n\t\t<method name=\"setPasswordMinimumLetters(Landroid/content/ComponentName;I)V\" since=\"11\"/>\n\t\t<method name=\"setPasswordMinimumLowerCase(Landroid/content/ComponentName;I)V\" since=\"11\"/>\n\t\t<method name=\"setPasswordMinimumNonLetter(Landroid/content/ComponentName;I)V\" since=\"11\"/>\n\t\t<method name=\"setPasswordMinimumNumeric(Landroid/content/ComponentName;I)V\" since=\"11\"/>\n\t\t<method name=\"setPasswordMinimumSymbols(Landroid/content/ComponentName;I)V\" since=\"11\"/>\n\t\t<method name=\"setPasswordMinimumUpperCase(Landroid/content/ComponentName;I)V\" since=\"11\"/>\n\t\t<method name=\"setPasswordQuality(Landroid/content/ComponentName;I)V\"/>\n\t\t<method name=\"setPermissionGrantState(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;I)Z\" since=\"23\"/>\n\t\t<method name=\"setPermissionPolicy(Landroid/content/ComponentName;I)V\" since=\"23\"/>\n\t\t<method name=\"setPermittedAccessibilityServices(Landroid/content/ComponentName;Ljava/util/List;)Z\" since=\"21\"/>\n\t\t<method name=\"setPermittedCrossProfileNotificationListeners(Landroid/content/ComponentName;Ljava/util/List;)Z\" since=\"26\"/>\n\t\t<method name=\"setPermittedInputMethods(Landroid/content/ComponentName;Ljava/util/List;)Z\" since=\"21\"/>\n\t\t<method name=\"setProfileEnabled(Landroid/content/ComponentName;)V\" since=\"21\"/>\n\t\t<method name=\"setProfileName(Landroid/content/ComponentName;Ljava/lang/String;)V\" since=\"21\"/>\n\t\t<method name=\"setRecommendedGlobalProxy(Landroid/content/ComponentName;Landroid/net/ProxyInfo;)V\" since=\"21\"/>\n\t\t<method name=\"setRequiredStrongAuthTimeout(Landroid/content/ComponentName;J)V\" since=\"26\"/>\n\t\t<method name=\"setResetPasswordToken(Landroid/content/ComponentName;[B)Z\" since=\"26\"/>\n\t\t<method name=\"setRestrictionsProvider(Landroid/content/ComponentName;Landroid/content/ComponentName;)V\" since=\"21\"/>\n\t\t<method name=\"setScreenCaptureDisabled(Landroid/content/ComponentName;Z)V\" since=\"21\"/>\n\t\t<method name=\"setSecureSetting(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;)V\" since=\"21\"/>\n\t\t<method name=\"setSecurityLoggingEnabled(Landroid/content/ComponentName;Z)V\" since=\"24\"/>\n\t\t<method name=\"setShortSupportMessage(Landroid/content/ComponentName;Ljava/lang/CharSequence;)V\" since=\"24\"/>\n\t\t<method name=\"setStartUserSessionMessage(Landroid/content/ComponentName;Ljava/lang/CharSequence;)V\" since=\"28\"/>\n\t\t<method name=\"setStatusBarDisabled(Landroid/content/ComponentName;Z)Z\" since=\"23\"/>\n\t\t<method name=\"setStorageEncryption(Landroid/content/ComponentName;Z)I\" since=\"11\"/>\n\t\t<method name=\"setSystemSetting(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;)V\" since=\"28\"/>\n\t\t<method name=\"setSystemUpdatePolicy(Landroid/content/ComponentName;Landroid/app/admin/SystemUpdatePolicy;)V\" since=\"23\"/>\n\t\t<method name=\"setTime(Landroid/content/ComponentName;J)Z\" since=\"28\"/>\n\t\t<method name=\"setTimeZone(Landroid/content/ComponentName;Ljava/lang/String;)Z\" since=\"28\"/>\n\t\t<method name=\"setTrustAgentConfiguration(Landroid/content/ComponentName;Landroid/content/ComponentName;Landroid/os/PersistableBundle;)V\" since=\"23\"/>\n\t\t<method name=\"setUninstallBlocked(Landroid/content/ComponentName;Ljava/lang/String;Z)V\" since=\"21\"/>\n\t\t<method name=\"setUserIcon(Landroid/content/ComponentName;Landroid/graphics/Bitmap;)V\" since=\"23\"/>\n\t\t<method name=\"startUserInBackground(Landroid/content/ComponentName;Landroid/os/UserHandle;)I\" since=\"28\"/>\n\t\t<method name=\"stopUser(Landroid/content/ComponentName;Landroid/os/UserHandle;)I\" since=\"28\"/>\n\t\t<method name=\"switchUser(Landroid/content/ComponentName;Landroid/os/UserHandle;)Z\" since=\"21\"/>\n\t\t<method name=\"transferOwnership(Landroid/content/ComponentName;Landroid/content/ComponentName;Landroid/os/PersistableBundle;)V\" since=\"28\"/>\n\t\t<method name=\"uninstallAllUserCaCerts(Landroid/content/ComponentName;)V\" since=\"21\"/>\n\t\t<method name=\"uninstallCaCert(Landroid/content/ComponentName;[B)V\" since=\"21\"/>\n\t\t<method name=\"updateOverrideApn(Landroid/content/ComponentName;ILandroid/telephony/data/ApnSetting;)Z\" since=\"28\"/>\n\t\t<method name=\"wipeData(I)V\"/>\n\t\t<method name=\"wipeData(ILjava/lang/CharSequence;)V\" since=\"28\"/>\n\t\t<field name=\"ACTION_ADD_DEVICE_ADMIN\"/>\n\t\t<field name=\"ACTION_ADMIN_POLICY_COMPLIANCE\" since=\"29\"/>\n\t\t<field name=\"ACTION_APPLICATION_DELEGATION_SCOPES_CHANGED\" since=\"26\"/>\n\t\t<field name=\"ACTION_DEVICE_ADMIN_SERVICE\" since=\"26\"/>\n\t\t<field name=\"ACTION_DEVICE_OWNER_CHANGED\" since=\"23\"/>\n\t\t<field name=\"ACTION_GET_PROVISIONING_MODE\" since=\"29\"/>\n\t\t<field name=\"ACTION_MANAGED_PROFILE_PROVISIONED\" since=\"23\"/>\n\t\t<field name=\"ACTION_PROFILE_OWNER_CHANGED\" since=\"28\"/>\n\t\t<field name=\"ACTION_PROVISIONING_SUCCESSFUL\" since=\"26\"/>\n\t\t<field name=\"ACTION_PROVISION_MANAGED_DEVICE\" since=\"23\"/>\n\t\t<field name=\"ACTION_PROVISION_MANAGED_PROFILE\" since=\"21\"/>\n\t\t<field name=\"ACTION_SET_NEW_PARENT_PROFILE_PASSWORD\" since=\"24\"/>\n\t\t<field name=\"ACTION_SET_NEW_PASSWORD\"/>\n\t\t<field name=\"ACTION_START_ENCRYPTION\" since=\"11\"/>\n\t\t<field name=\"ACTION_SYSTEM_UPDATE_POLICY_CHANGED\" since=\"23\"/>\n\t\t<field name=\"DELEGATION_APP_RESTRICTIONS\" since=\"26\"/>\n\t\t<field name=\"DELEGATION_BLOCK_UNINSTALL\" since=\"26\"/>\n\t\t<field name=\"DELEGATION_CERT_INSTALL\" since=\"26\"/>\n\t\t<field name=\"DELEGATION_CERT_SELECTION\" since=\"29\"/>\n\t\t<field name=\"DELEGATION_ENABLE_SYSTEM_APP\" since=\"26\"/>\n\t\t<field name=\"DELEGATION_INSTALL_EXISTING_PACKAGE\" since=\"28\"/>\n\t\t<field name=\"DELEGATION_KEEP_UNINSTALLED_PACKAGES\" since=\"28\"/>\n\t\t<field name=\"DELEGATION_NETWORK_LOGGING\" since=\"29\"/>\n\t\t<field name=\"DELEGATION_PACKAGE_ACCESS\" since=\"26\"/>\n\t\t<field name=\"DELEGATION_PERMISSION_GRANT\" since=\"26\"/>\n\t\t<field name=\"ENCRYPTION_STATUS_ACTIVATING\" since=\"11\"/>\n\t\t<field name=\"ENCRYPTION_STATUS_ACTIVE\" since=\"11\"/>\n\t\t<field name=\"ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY\" since=\"23\"/>\n\t\t<field name=\"ENCRYPTION_STATUS_ACTIVE_PER_USER\" since=\"24\"/>\n\t\t<field name=\"ENCRYPTION_STATUS_INACTIVE\" since=\"11\"/>\n\t\t<field name=\"ENCRYPTION_STATUS_UNSUPPORTED\" since=\"11\"/>\n\t\t<field name=\"EXTRA_ADD_EXPLANATION\"/>\n\t\t<field name=\"EXTRA_DELEGATION_SCOPES\" since=\"26\"/>\n\t\t<field name=\"EXTRA_DEVICE_ADMIN\"/>\n\t\t<field name=\"EXTRA_PASSWORD_COMPLEXITY\" since=\"29\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE\" since=\"22\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE\" since=\"21\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME\" since=\"23\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE\" since=\"23\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM\" since=\"21\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER\" since=\"21\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION\" since=\"21\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME\" since=\"21\" deprecated=\"23\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM\" since=\"23\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_DISCLAIMERS\" since=\"26\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_DISCLAIMER_CONTENT\" since=\"26\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_DISCLAIMER_HEADER\" since=\"26\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_EMAIL_ADDRESS\" since=\"21\" deprecated=\"26\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_IMEI\" since=\"29\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION\" since=\"26\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED\" since=\"22\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_LOCALE\" since=\"21\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_LOCAL_TIME\" since=\"21\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_LOGO_URI\" since=\"24\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_MAIN_COLOR\" since=\"24\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_MODE\" since=\"29\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_SERIAL_NUMBER\" since=\"29\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_SKIP_EDUCATION_SCREENS\" since=\"29\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_SKIP_ENCRYPTION\" since=\"23\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_SKIP_USER_CONSENT\" since=\"26\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_TIME_ZONE\" since=\"21\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_WIFI_ANONYMOUS_IDENTITY\" since=\"29\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_WIFI_CA_CERTIFICATE\" since=\"29\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_WIFI_DOMAIN\" since=\"29\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_WIFI_EAP_METHOD\" since=\"29\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_WIFI_HIDDEN\" since=\"21\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_WIFI_IDENTITY\" since=\"29\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_WIFI_PAC_URL\" since=\"21\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_WIFI_PASSWORD\" since=\"21\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_WIFI_PHASE2_AUTH\" since=\"29\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_WIFI_PROXY_BYPASS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_WIFI_PROXY_HOST\" since=\"21\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_WIFI_PROXY_PORT\" since=\"21\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_WIFI_SECURITY_TYPE\" since=\"21\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_WIFI_SSID\" since=\"21\"/>\n\t\t<field name=\"EXTRA_PROVISIONING_WIFI_USER_CERTIFICATE\" since=\"29\"/>\n\t\t<field name=\"FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY\" since=\"26\"/>\n\t\t<field name=\"FLAG_MANAGED_CAN_ACCESS_PARENT\" since=\"21\"/>\n\t\t<field name=\"FLAG_PARENT_CAN_ACCESS_MANAGED\" since=\"21\"/>\n\t\t<field name=\"ID_TYPE_BASE_INFO\" since=\"28\"/>\n\t\t<field name=\"ID_TYPE_IMEI\" since=\"28\"/>\n\t\t<field name=\"ID_TYPE_MEID\" since=\"28\"/>\n\t\t<field name=\"ID_TYPE_SERIAL\" since=\"28\"/>\n\t\t<field name=\"INSTALLKEY_REQUEST_CREDENTIALS_ACCESS\" since=\"28\"/>\n\t\t<field name=\"INSTALLKEY_SET_USER_SELECTABLE\" since=\"28\"/>\n\t\t<field name=\"KEYGUARD_DISABLE_BIOMETRICS\" since=\"28\"/>\n\t\t<field name=\"KEYGUARD_DISABLE_FACE\" since=\"28\"/>\n\t\t<field name=\"KEYGUARD_DISABLE_FEATURES_ALL\" since=\"17\"/>\n\t\t<field name=\"KEYGUARD_DISABLE_FEATURES_NONE\" since=\"17\"/>\n\t\t<field name=\"KEYGUARD_DISABLE_FINGERPRINT\" since=\"21\"/>\n\t\t<field name=\"KEYGUARD_DISABLE_IRIS\" since=\"28\"/>\n\t\t<field name=\"KEYGUARD_DISABLE_REMOTE_INPUT\" since=\"24\"/>\n\t\t<field name=\"KEYGUARD_DISABLE_SECURE_CAMERA\" since=\"17\"/>\n\t\t<field name=\"KEYGUARD_DISABLE_SECURE_NOTIFICATIONS\" since=\"21\"/>\n\t\t<field name=\"KEYGUARD_DISABLE_TRUST_AGENTS\" since=\"21\"/>\n\t\t<field name=\"KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS\" since=\"21\"/>\n\t\t<field name=\"KEYGUARD_DISABLE_WIDGETS_ALL\" since=\"17\"/>\n\t\t<field name=\"LEAVE_ALL_SYSTEM_APPS_ENABLED\" since=\"28\"/>\n\t\t<field name=\"LOCK_TASK_FEATURE_GLOBAL_ACTIONS\" since=\"28\"/>\n\t\t<field name=\"LOCK_TASK_FEATURE_HOME\" since=\"28\"/>\n\t\t<field name=\"LOCK_TASK_FEATURE_KEYGUARD\" since=\"28\"/>\n\t\t<field name=\"LOCK_TASK_FEATURE_NONE\" since=\"28\"/>\n\t\t<field name=\"LOCK_TASK_FEATURE_NOTIFICATIONS\" since=\"28\"/>\n\t\t<field name=\"LOCK_TASK_FEATURE_OVERVIEW\" since=\"28\"/>\n\t\t<field name=\"LOCK_TASK_FEATURE_SYSTEM_INFO\" since=\"28\"/>\n\t\t<field name=\"MAKE_USER_EPHEMERAL\" since=\"28\"/>\n\t\t<field name=\"MIME_TYPE_PROVISIONING_NFC\" since=\"21\"/>\n\t\t<field name=\"PASSWORD_COMPLEXITY_HIGH\" since=\"29\"/>\n\t\t<field name=\"PASSWORD_COMPLEXITY_LOW\" since=\"29\"/>\n\t\t<field name=\"PASSWORD_COMPLEXITY_MEDIUM\" since=\"29\"/>\n\t\t<field name=\"PASSWORD_COMPLEXITY_NONE\" since=\"29\"/>\n\t\t<field name=\"PASSWORD_QUALITY_ALPHABETIC\"/>\n\t\t<field name=\"PASSWORD_QUALITY_ALPHANUMERIC\"/>\n\t\t<field name=\"PASSWORD_QUALITY_BIOMETRIC_WEAK\" since=\"14\"/>\n\t\t<field name=\"PASSWORD_QUALITY_COMPLEX\" since=\"11\"/>\n\t\t<field name=\"PASSWORD_QUALITY_NUMERIC\"/>\n\t\t<field name=\"PASSWORD_QUALITY_NUMERIC_COMPLEX\" since=\"21\"/>\n\t\t<field name=\"PASSWORD_QUALITY_SOMETHING\"/>\n\t\t<field name=\"PASSWORD_QUALITY_UNSPECIFIED\"/>\n\t\t<field name=\"PERMISSION_GRANT_STATE_DEFAULT\" since=\"23\"/>\n\t\t<field name=\"PERMISSION_GRANT_STATE_DENIED\" since=\"23\"/>\n\t\t<field name=\"PERMISSION_GRANT_STATE_GRANTED\" since=\"23\"/>\n\t\t<field name=\"PERMISSION_POLICY_AUTO_DENY\" since=\"23\"/>\n\t\t<field name=\"PERMISSION_POLICY_AUTO_GRANT\" since=\"23\"/>\n\t\t<field name=\"PERMISSION_POLICY_PROMPT\" since=\"23\"/>\n\t\t<field name=\"POLICY_DISABLE_CAMERA\" since=\"26\"/>\n\t\t<field name=\"POLICY_DISABLE_SCREEN_CAPTURE\" since=\"26\"/>\n\t\t<field name=\"PRIVATE_DNS_MODE_OFF\" since=\"29\"/>\n\t\t<field name=\"PRIVATE_DNS_MODE_OPPORTUNISTIC\" since=\"29\"/>\n\t\t<field name=\"PRIVATE_DNS_MODE_PROVIDER_HOSTNAME\" since=\"29\"/>\n\t\t<field name=\"PRIVATE_DNS_MODE_UNKNOWN\" since=\"29\"/>\n\t\t<field name=\"PRIVATE_DNS_SET_ERROR_FAILURE_SETTING\" since=\"29\"/>\n\t\t<field name=\"PRIVATE_DNS_SET_ERROR_HOST_NOT_SERVING\" since=\"29\"/>\n\t\t<field name=\"PRIVATE_DNS_SET_NO_ERROR\" since=\"29\"/>\n\t\t<field name=\"PROVISIONING_MODE_FULLY_MANAGED_DEVICE\" since=\"29\"/>\n\t\t<field name=\"PROVISIONING_MODE_MANAGED_PROFILE\" since=\"29\"/>\n\t\t<field name=\"RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT\" since=\"23\"/>\n\t\t<field name=\"RESET_PASSWORD_REQUIRE_ENTRY\"/>\n\t\t<field name=\"SKIP_SETUP_WIZARD\" since=\"24\"/>\n\t\t<field name=\"WIPE_EUICC\" since=\"28\"/>\n\t\t<field name=\"WIPE_EXTERNAL_STORAGE\" since=\"9\"/>\n\t\t<field name=\"WIPE_RESET_PROTECTION_DATA\" since=\"22\"/>\n\t\t<field name=\"WIPE_SILENTLY\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/app/admin/DevicePolicyManager$InstallSystemUpdateCallback\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onInstallUpdateError(ILjava/lang/String;)V\"/>\n\t\t<field name=\"UPDATE_ERROR_BATTERY_LOW\"/>\n\t\t<field name=\"UPDATE_ERROR_FILE_NOT_FOUND\"/>\n\t\t<field name=\"UPDATE_ERROR_INCORRECT_OS_VERSION\"/>\n\t\t<field name=\"UPDATE_ERROR_UNKNOWN\"/>\n\t\t<field name=\"UPDATE_ERROR_UPDATE_FILE_INVALID\"/>\n\t</class>\n\t<class name=\"android/app/admin/DevicePolicyManager$OnClearApplicationUserDataListener\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onApplicationUserDataCleared(Ljava/lang/String;Z)V\"/>\n\t</class>\n\t<class name=\"android/app/admin/DnsEvent\" since=\"26\">\n\t\t<extends name=\"android/app/admin/NetworkEvent\"/>\n\t\t<method name=\"getHostname()Ljava/lang/String;\"/>\n\t\t<method name=\"getInetAddresses()Ljava/util/List;\"/>\n\t\t<method name=\"getTotalResolvedAddressCount()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/admin/FreezePeriod\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/time/MonthDay;Ljava/time/MonthDay;)V\"/>\n\t\t<method name=\"getEnd()Ljava/time/MonthDay;\"/>\n\t\t<method name=\"getStart()Ljava/time/MonthDay;\"/>\n\t</class>\n\t<class name=\"android/app/admin/NetworkEvent\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getId()J\" since=\"28\"/>\n\t\t<method name=\"getPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getTimestamp()J\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/admin/SecurityLog\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"LEVEL_ERROR\" since=\"28\"/>\n\t\t<field name=\"LEVEL_INFO\" since=\"28\"/>\n\t\t<field name=\"LEVEL_WARNING\" since=\"28\"/>\n\t\t<field name=\"TAG_ADB_SHELL_CMD\"/>\n\t\t<field name=\"TAG_ADB_SHELL_INTERACTIVE\"/>\n\t\t<field name=\"TAG_APP_PROCESS_START\"/>\n\t\t<field name=\"TAG_CERT_AUTHORITY_INSTALLED\" since=\"28\"/>\n\t\t<field name=\"TAG_CERT_AUTHORITY_REMOVED\" since=\"28\"/>\n\t\t<field name=\"TAG_CERT_VALIDATION_FAILURE\" since=\"28\"/>\n\t\t<field name=\"TAG_CRYPTO_SELF_TEST_COMPLETED\" since=\"28\"/>\n\t\t<field name=\"TAG_KEYGUARD_DISABLED_FEATURES_SET\" since=\"28\"/>\n\t\t<field name=\"TAG_KEYGUARD_DISMISSED\"/>\n\t\t<field name=\"TAG_KEYGUARD_DISMISS_AUTH_ATTEMPT\"/>\n\t\t<field name=\"TAG_KEYGUARD_SECURED\"/>\n\t\t<field name=\"TAG_KEY_DESTRUCTION\" since=\"28\"/>\n\t\t<field name=\"TAG_KEY_GENERATED\" since=\"28\"/>\n\t\t<field name=\"TAG_KEY_IMPORT\" since=\"28\"/>\n\t\t<field name=\"TAG_KEY_INTEGRITY_VIOLATION\" since=\"28\"/>\n\t\t<field name=\"TAG_LOGGING_STARTED\" since=\"28\"/>\n\t\t<field name=\"TAG_LOGGING_STOPPED\" since=\"28\"/>\n\t\t<field name=\"TAG_LOG_BUFFER_SIZE_CRITICAL\" since=\"28\"/>\n\t\t<field name=\"TAG_MAX_PASSWORD_ATTEMPTS_SET\" since=\"28\"/>\n\t\t<field name=\"TAG_MAX_SCREEN_LOCK_TIMEOUT_SET\" since=\"28\"/>\n\t\t<field name=\"TAG_MEDIA_MOUNT\" since=\"28\"/>\n\t\t<field name=\"TAG_MEDIA_UNMOUNT\" since=\"28\"/>\n\t\t<field name=\"TAG_OS_SHUTDOWN\" since=\"28\"/>\n\t\t<field name=\"TAG_OS_STARTUP\" since=\"28\"/>\n\t\t<field name=\"TAG_PASSWORD_COMPLEXITY_SET\" since=\"28\"/>\n\t\t<field name=\"TAG_PASSWORD_EXPIRATION_SET\" since=\"28\"/>\n\t\t<field name=\"TAG_PASSWORD_HISTORY_LENGTH_SET\" since=\"28\"/>\n\t\t<field name=\"TAG_REMOTE_LOCK\" since=\"28\"/>\n\t\t<field name=\"TAG_SYNC_RECV_FILE\"/>\n\t\t<field name=\"TAG_SYNC_SEND_FILE\"/>\n\t\t<field name=\"TAG_USER_RESTRICTION_ADDED\" since=\"28\"/>\n\t\t<field name=\"TAG_USER_RESTRICTION_REMOVED\" since=\"28\"/>\n\t\t<field name=\"TAG_WIPE_FAILURE\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/app/admin/SecurityLog$SecurityEvent\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getData()Ljava/lang/Object;\"/>\n\t\t<method name=\"getId()J\" since=\"28\"/>\n\t\t<method name=\"getLogLevel()I\" since=\"28\"/>\n\t\t<method name=\"getTag()I\"/>\n\t\t<method name=\"getTimeNanos()J\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/admin/SystemUpdateInfo\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getReceivedTime()J\"/>\n\t\t<method name=\"getSecurityPatchState()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"SECURITY_PATCH_STATE_FALSE\"/>\n\t\t<field name=\"SECURITY_PATCH_STATE_TRUE\"/>\n\t\t<field name=\"SECURITY_PATCH_STATE_UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/app/admin/SystemUpdatePolicy\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"createAutomaticInstallPolicy()Landroid/app/admin/SystemUpdatePolicy;\"/>\n\t\t<method name=\"createPostponeInstallPolicy()Landroid/app/admin/SystemUpdatePolicy;\"/>\n\t\t<method name=\"createWindowedInstallPolicy(II)Landroid/app/admin/SystemUpdatePolicy;\"/>\n\t\t<method name=\"getFreezePeriods()Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"getInstallWindowEnd()I\"/>\n\t\t<method name=\"getInstallWindowStart()I\"/>\n\t\t<method name=\"getPolicyType()I\"/>\n\t\t<method name=\"setFreezePeriods(Ljava/util/List;)Landroid/app/admin/SystemUpdatePolicy;\" since=\"28\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"TYPE_INSTALL_AUTOMATIC\"/>\n\t\t<field name=\"TYPE_INSTALL_WINDOWED\"/>\n\t\t<field name=\"TYPE_POSTPONE\"/>\n\t</class>\n\t<class name=\"android/app/admin/SystemUpdatePolicy$ValidationFailedException\" since=\"28\">\n\t\t<extends name=\"java/lang/IllegalArgumentException\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getErrorCode()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"ERROR_COMBINED_FREEZE_PERIOD_TOO_CLOSE\"/>\n\t\t<field name=\"ERROR_COMBINED_FREEZE_PERIOD_TOO_LONG\"/>\n\t\t<field name=\"ERROR_DUPLICATE_OR_OVERLAP\"/>\n\t\t<field name=\"ERROR_NEW_FREEZE_PERIOD_TOO_CLOSE\"/>\n\t\t<field name=\"ERROR_NEW_FREEZE_PERIOD_TOO_LONG\"/>\n\t\t<field name=\"ERROR_UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/app/assist/AssistContent\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getClipData()Landroid/content/ClipData;\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getIntent()Landroid/content/Intent;\"/>\n\t\t<method name=\"getStructuredData()Ljava/lang/String;\"/>\n\t\t<method name=\"getWebUri()Landroid/net/Uri;\"/>\n\t\t<method name=\"isAppProvidedIntent()Z\"/>\n\t\t<method name=\"isAppProvidedWebUri()Z\" since=\"24\"/>\n\t\t<method name=\"setClipData(Landroid/content/ClipData;)V\"/>\n\t\t<method name=\"setIntent(Landroid/content/Intent;)V\"/>\n\t\t<method name=\"setStructuredData(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setWebUri(Landroid/net/Uri;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/assist/AssistStructure\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getAcquisitionEndTime()J\" since=\"26\"/>\n\t\t<method name=\"getAcquisitionStartTime()J\" since=\"26\"/>\n\t\t<method name=\"getActivityComponent()Landroid/content/ComponentName;\"/>\n\t\t<method name=\"getWindowNodeAt(I)Landroid/app/assist/AssistStructure$WindowNode;\"/>\n\t\t<method name=\"getWindowNodeCount()I\"/>\n\t\t<method name=\"isHomeActivity()Z\" since=\"26\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/assist/AssistStructure$ViewNode\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAlpha()F\"/>\n\t\t<method name=\"getAutofillHints()[Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getAutofillId()Landroid/view/autofill/AutofillId;\" since=\"26\"/>\n\t\t<method name=\"getAutofillOptions()[Ljava/lang/CharSequence;\" since=\"26\"/>\n\t\t<method name=\"getAutofillType()I\" since=\"26\"/>\n\t\t<method name=\"getAutofillValue()Landroid/view/autofill/AutofillValue;\" since=\"26\"/>\n\t\t<method name=\"getChildAt(I)Landroid/app/assist/AssistStructure$ViewNode;\"/>\n\t\t<method name=\"getChildCount()I\"/>\n\t\t<method name=\"getClassName()Ljava/lang/String;\"/>\n\t\t<method name=\"getContentDescription()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getElevation()F\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getHint()Ljava/lang/String;\"/>\n\t\t<method name=\"getHtmlInfo()Landroid/view/ViewStructure$HtmlInfo;\" since=\"26\"/>\n\t\t<method name=\"getId()I\"/>\n\t\t<method name=\"getIdEntry()Ljava/lang/String;\"/>\n\t\t<method name=\"getIdPackage()Ljava/lang/String;\"/>\n\t\t<method name=\"getIdType()Ljava/lang/String;\"/>\n\t\t<method name=\"getImportantForAutofill()I\" since=\"28\"/>\n\t\t<method name=\"getInputType()I\" since=\"26\"/>\n\t\t<method name=\"getLeft()I\"/>\n\t\t<method name=\"getLocaleList()Landroid/os/LocaleList;\" since=\"26\"/>\n\t\t<method name=\"getMaxTextEms()I\" since=\"28\"/>\n\t\t<method name=\"getMaxTextLength()I\" since=\"28\"/>\n\t\t<method name=\"getMinTextEms()I\" since=\"28\"/>\n\t\t<method name=\"getScrollX()I\"/>\n\t\t<method name=\"getScrollY()I\"/>\n\t\t<method name=\"getText()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTextBackgroundColor()I\"/>\n\t\t<method name=\"getTextColor()I\"/>\n\t\t<method name=\"getTextIdEntry()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getTextLineBaselines()[I\"/>\n\t\t<method name=\"getTextLineCharOffsets()[I\"/>\n\t\t<method name=\"getTextSelectionEnd()I\"/>\n\t\t<method name=\"getTextSelectionStart()I\"/>\n\t\t<method name=\"getTextSize()F\"/>\n\t\t<method name=\"getTextStyle()I\"/>\n\t\t<method name=\"getTop()I\"/>\n\t\t<method name=\"getTransformation()Landroid/graphics/Matrix;\"/>\n\t\t<method name=\"getVisibility()I\"/>\n\t\t<method name=\"getWebDomain()Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getWebScheme()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t\t<method name=\"isAccessibilityFocused()Z\"/>\n\t\t<method name=\"isActivated()Z\"/>\n\t\t<method name=\"isAssistBlocked()Z\"/>\n\t\t<method name=\"isCheckable()Z\"/>\n\t\t<method name=\"isChecked()Z\"/>\n\t\t<method name=\"isClickable()Z\"/>\n\t\t<method name=\"isContextClickable()Z\"/>\n\t\t<method name=\"isEnabled()Z\"/>\n\t\t<method name=\"isFocusable()Z\"/>\n\t\t<method name=\"isFocused()Z\"/>\n\t\t<method name=\"isLongClickable()Z\"/>\n\t\t<method name=\"isOpaque()Z\" since=\"26\"/>\n\t\t<method name=\"isSelected()Z\"/>\n\t\t<field name=\"TEXT_COLOR_UNDEFINED\"/>\n\t\t<field name=\"TEXT_STYLE_BOLD\"/>\n\t\t<field name=\"TEXT_STYLE_ITALIC\"/>\n\t\t<field name=\"TEXT_STYLE_STRIKE_THRU\"/>\n\t\t<field name=\"TEXT_STYLE_UNDERLINE\"/>\n\t</class>\n\t<class name=\"android/app/assist/AssistStructure$WindowNode\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getDisplayId()I\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getLeft()I\"/>\n\t\t<method name=\"getRootViewNode()Landroid/app/assist/AssistStructure$ViewNode;\"/>\n\t\t<method name=\"getTitle()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTop()I\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t</class>\n\t<class name=\"android/app/backup/BackupAgent\" since=\"8\">\n\t\t<extends name=\"android/content/ContextWrapper\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"fullBackupFile(Ljava/io/File;Landroid/app/backup/FullBackupDataOutput;)V\" since=\"14\"/>\n\t\t<method name=\"onBackup(Landroid/os/ParcelFileDescriptor;Landroid/app/backup/BackupDataOutput;Landroid/os/ParcelFileDescriptor;)V\"/>\n\t\t<method name=\"onCreate()V\"/>\n\t\t<method name=\"onDestroy()V\"/>\n\t\t<method name=\"onFullBackup(Landroid/app/backup/FullBackupDataOutput;)V\" since=\"14\"/>\n\t\t<method name=\"onQuotaExceeded(JJ)V\" since=\"24\"/>\n\t\t<method name=\"onRestore(Landroid/app/backup/BackupDataInput;ILandroid/os/ParcelFileDescriptor;)V\"/>\n\t\t<method name=\"onRestore(Landroid/app/backup/BackupDataInput;JLandroid/os/ParcelFileDescriptor;)V\" since=\"28\"/>\n\t\t<method name=\"onRestoreFile(Landroid/os/ParcelFileDescriptor;JLjava/io/File;IJJ)V\" since=\"14\"/>\n\t\t<method name=\"onRestoreFinished()V\" since=\"21\"/>\n\t\t<field name=\"FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED\" since=\"28\"/>\n\t\t<field name=\"FLAG_DEVICE_TO_DEVICE_TRANSFER\" since=\"28\"/>\n\t\t<field name=\"TYPE_DIRECTORY\" since=\"14\"/>\n\t\t<field name=\"TYPE_FILE\" since=\"14\"/>\n\t</class>\n\t<class name=\"android/app/backup/BackupAgentHelper\" since=\"8\">\n\t\t<extends name=\"android/app/backup/BackupAgent\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addHelper(Ljava/lang/String;Landroid/app/backup/BackupHelper;)V\"/>\n\t</class>\n\t<class name=\"android/app/backup/BackupDataInput\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getDataSize()I\"/>\n\t\t<method name=\"getKey()Ljava/lang/String;\"/>\n\t\t<method name=\"readEntityData([BII)I\"/>\n\t\t<method name=\"readNextHeader()Z\"/>\n\t\t<method name=\"skipEntityData()V\"/>\n\t</class>\n\t<class name=\"android/app/backup/BackupDataInputStream\" since=\"8\">\n\t\t<extends name=\"java/io/InputStream\"/>\n\t\t<method name=\"getKey()Ljava/lang/String;\"/>\n\t\t<method name=\"size()I\"/>\n\t</class>\n\t<class name=\"android/app/backup/BackupDataOutput\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getQuota()J\" since=\"26\"/>\n\t\t<method name=\"getTransportFlags()I\" since=\"28\"/>\n\t\t<method name=\"writeEntityData([BI)I\"/>\n\t\t<method name=\"writeEntityHeader(Ljava/lang/String;I)I\"/>\n\t</class>\n\t<class name=\"android/app/backup/BackupHelper\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"performBackup(Landroid/os/ParcelFileDescriptor;Landroid/app/backup/BackupDataOutput;Landroid/os/ParcelFileDescriptor;)V\"/>\n\t\t<method name=\"restoreEntity(Landroid/app/backup/BackupDataInputStream;)V\"/>\n\t\t<method name=\"writeNewStateDescription(Landroid/os/ParcelFileDescriptor;)V\"/>\n\t</class>\n\t<class name=\"android/app/backup/BackupManager\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"dataChanged()V\"/>\n\t\t<method name=\"dataChanged(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getUserForAncestralSerialNumber(J)Landroid/os/UserHandle;\" since=\"29\"/>\n\t\t<method name=\"requestRestore(Landroid/app/backup/RestoreObserver;)I\" deprecated=\"28\"/>\n\t</class>\n\t<class name=\"android/app/backup/FileBackupHelper\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/app/backup/BackupHelper\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;[Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/app/backup/FullBackupDataOutput\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getQuota()J\" since=\"26\"/>\n\t\t<method name=\"getTransportFlags()I\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/app/backup/RestoreObserver\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onUpdate(ILjava/lang/String;)V\"/>\n\t\t<method name=\"restoreFinished(I)V\"/>\n\t\t<method name=\"restoreStarting(I)V\"/>\n\t</class>\n\t<class name=\"android/app/backup/SharedPreferencesBackupHelper\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/app/backup/BackupHelper\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;[Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/app/job/JobInfo\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getBackoffPolicy()I\"/>\n\t\t<method name=\"getClipData()Landroid/content/ClipData;\" since=\"26\"/>\n\t\t<method name=\"getClipGrantFlags()I\" since=\"26\"/>\n\t\t<method name=\"getEstimatedNetworkDownloadBytes()J\" since=\"28\"/>\n\t\t<method name=\"getEstimatedNetworkUploadBytes()J\" since=\"28\"/>\n\t\t<method name=\"getExtras()Landroid/os/PersistableBundle;\"/>\n\t\t<method name=\"getFlexMillis()J\" since=\"24\"/>\n\t\t<method name=\"getId()I\"/>\n\t\t<method name=\"getInitialBackoffMillis()J\"/>\n\t\t<method name=\"getIntervalMillis()J\"/>\n\t\t<method name=\"getMaxExecutionDelayMillis()J\"/>\n\t\t<method name=\"getMinFlexMillis()J\" since=\"24\"/>\n\t\t<method name=\"getMinLatencyMillis()J\"/>\n\t\t<method name=\"getMinPeriodMillis()J\" since=\"24\"/>\n\t\t<method name=\"getNetworkType()I\" deprecated=\"28\"/>\n\t\t<method name=\"getRequiredNetwork()Landroid/net/NetworkRequest;\" since=\"28\"/>\n\t\t<method name=\"getService()Landroid/content/ComponentName;\"/>\n\t\t<method name=\"getTransientExtras()Landroid/os/Bundle;\" since=\"26\"/>\n\t\t<method name=\"getTriggerContentMaxDelay()J\" since=\"24\"/>\n\t\t<method name=\"getTriggerContentUpdateDelay()J\" since=\"24\"/>\n\t\t<method name=\"getTriggerContentUris()[Landroid/app/job/JobInfo$TriggerContentUri;\" since=\"24\"/>\n\t\t<method name=\"isImportantWhileForeground()Z\" since=\"28\"/>\n\t\t<method name=\"isPeriodic()Z\"/>\n\t\t<method name=\"isPersisted()Z\"/>\n\t\t<method name=\"isPrefetch()Z\" since=\"28\"/>\n\t\t<method name=\"isRequireBatteryNotLow()Z\" since=\"26\"/>\n\t\t<method name=\"isRequireCharging()Z\"/>\n\t\t<method name=\"isRequireDeviceIdle()Z\"/>\n\t\t<method name=\"isRequireStorageNotLow()Z\" since=\"26\"/>\n\t\t<field name=\"BACKOFF_POLICY_EXPONENTIAL\"/>\n\t\t<field name=\"BACKOFF_POLICY_LINEAR\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"DEFAULT_INITIAL_BACKOFF_MILLIS\"/>\n\t\t<field name=\"MAX_BACKOFF_DELAY_MILLIS\"/>\n\t\t<field name=\"NETWORK_BYTES_UNKNOWN\" since=\"28\"/>\n\t\t<field name=\"NETWORK_TYPE_ANY\"/>\n\t\t<field name=\"NETWORK_TYPE_CELLULAR\" since=\"28\"/>\n\t\t<field name=\"NETWORK_TYPE_METERED\" since=\"26\" deprecated=\"28\"/>\n\t\t<field name=\"NETWORK_TYPE_NONE\"/>\n\t\t<field name=\"NETWORK_TYPE_NOT_ROAMING\" since=\"24\"/>\n\t\t<field name=\"NETWORK_TYPE_UNMETERED\"/>\n\t</class>\n\t<class name=\"android/app/job/JobInfo$Builder\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(ILandroid/content/ComponentName;)V\"/>\n\t\t<method name=\"addTriggerContentUri(Landroid/app/job/JobInfo$TriggerContentUri;)Landroid/app/job/JobInfo$Builder;\" since=\"24\"/>\n\t\t<method name=\"build()Landroid/app/job/JobInfo;\"/>\n\t\t<method name=\"setBackoffCriteria(JI)Landroid/app/job/JobInfo$Builder;\"/>\n\t\t<method name=\"setClipData(Landroid/content/ClipData;I)Landroid/app/job/JobInfo$Builder;\" since=\"26\"/>\n\t\t<method name=\"setEstimatedNetworkBytes(JJ)Landroid/app/job/JobInfo$Builder;\" since=\"28\"/>\n\t\t<method name=\"setExtras(Landroid/os/PersistableBundle;)Landroid/app/job/JobInfo$Builder;\"/>\n\t\t<method name=\"setImportantWhileForeground(Z)Landroid/app/job/JobInfo$Builder;\" since=\"28\"/>\n\t\t<method name=\"setMinimumLatency(J)Landroid/app/job/JobInfo$Builder;\"/>\n\t\t<method name=\"setOverrideDeadline(J)Landroid/app/job/JobInfo$Builder;\"/>\n\t\t<method name=\"setPeriodic(J)Landroid/app/job/JobInfo$Builder;\"/>\n\t\t<method name=\"setPeriodic(JJ)Landroid/app/job/JobInfo$Builder;\" since=\"24\"/>\n\t\t<method name=\"setPersisted(Z)Landroid/app/job/JobInfo$Builder;\"/>\n\t\t<method name=\"setPrefetch(Z)Landroid/app/job/JobInfo$Builder;\" since=\"28\"/>\n\t\t<method name=\"setRequiredNetwork(Landroid/net/NetworkRequest;)Landroid/app/job/JobInfo$Builder;\" since=\"28\"/>\n\t\t<method name=\"setRequiredNetworkType(I)Landroid/app/job/JobInfo$Builder;\"/>\n\t\t<method name=\"setRequiresBatteryNotLow(Z)Landroid/app/job/JobInfo$Builder;\" since=\"26\"/>\n\t\t<method name=\"setRequiresCharging(Z)Landroid/app/job/JobInfo$Builder;\"/>\n\t\t<method name=\"setRequiresDeviceIdle(Z)Landroid/app/job/JobInfo$Builder;\"/>\n\t\t<method name=\"setRequiresStorageNotLow(Z)Landroid/app/job/JobInfo$Builder;\" since=\"26\"/>\n\t\t<method name=\"setTransientExtras(Landroid/os/Bundle;)Landroid/app/job/JobInfo$Builder;\" since=\"26\"/>\n\t\t<method name=\"setTriggerContentMaxDelay(J)Landroid/app/job/JobInfo$Builder;\" since=\"24\"/>\n\t\t<method name=\"setTriggerContentUpdateDelay(J)Landroid/app/job/JobInfo$Builder;\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/app/job/JobInfo$TriggerContentUri\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/Uri;I)V\"/>\n\t\t<method name=\"getFlags()I\"/>\n\t\t<method name=\"getUri()Landroid/net/Uri;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FLAG_NOTIFY_FOR_DESCENDANTS\"/>\n\t</class>\n\t<class name=\"android/app/job/JobParameters\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"completeWork(Landroid/app/job/JobWorkItem;)V\" since=\"26\"/>\n\t\t<method name=\"dequeueWork()Landroid/app/job/JobWorkItem;\" since=\"26\"/>\n\t\t<method name=\"getClipData()Landroid/content/ClipData;\" since=\"26\"/>\n\t\t<method name=\"getClipGrantFlags()I\" since=\"26\"/>\n\t\t<method name=\"getExtras()Landroid/os/PersistableBundle;\"/>\n\t\t<method name=\"getJobId()I\"/>\n\t\t<method name=\"getNetwork()Landroid/net/Network;\" since=\"28\"/>\n\t\t<method name=\"getTransientExtras()Landroid/os/Bundle;\" since=\"26\"/>\n\t\t<method name=\"getTriggeredContentAuthorities()[Ljava/lang/String;\" since=\"24\"/>\n\t\t<method name=\"getTriggeredContentUris()[Landroid/net/Uri;\" since=\"24\"/>\n\t\t<method name=\"isOverrideDeadlineExpired()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/job/JobScheduler\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"cancel(I)V\"/>\n\t\t<method name=\"cancelAll()V\"/>\n\t\t<method name=\"enqueue(Landroid/app/job/JobInfo;Landroid/app/job/JobWorkItem;)I\" since=\"26\"/>\n\t\t<method name=\"getAllPendingJobs()Ljava/util/List;\"/>\n\t\t<method name=\"getPendingJob(I)Landroid/app/job/JobInfo;\" since=\"24\"/>\n\t\t<method name=\"schedule(Landroid/app/job/JobInfo;)I\"/>\n\t\t<field name=\"RESULT_FAILURE\"/>\n\t\t<field name=\"RESULT_SUCCESS\"/>\n\t</class>\n\t<class name=\"android/app/job/JobService\" since=\"21\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"jobFinished(Landroid/app/job/JobParameters;Z)V\"/>\n\t\t<method name=\"onStartJob(Landroid/app/job/JobParameters;)Z\"/>\n\t\t<method name=\"onStopJob(Landroid/app/job/JobParameters;)Z\"/>\n\t\t<field name=\"PERMISSION_BIND\"/>\n\t</class>\n\t<class name=\"android/app/job/JobServiceEngine\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/Service;)V\"/>\n\t\t<method name=\"getBinder()Landroid/os/IBinder;\"/>\n\t\t<method name=\"jobFinished(Landroid/app/job/JobParameters;Z)V\"/>\n\t\t<method name=\"onStartJob(Landroid/app/job/JobParameters;)Z\"/>\n\t\t<method name=\"onStopJob(Landroid/app/job/JobParameters;)Z\"/>\n\t</class>\n\t<class name=\"android/app/job/JobWorkItem\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Intent;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Intent;JJ)V\" since=\"28\"/>\n\t\t<method name=\"getDeliveryCount()I\"/>\n\t\t<method name=\"getEstimatedNetworkDownloadBytes()J\" since=\"28\"/>\n\t\t<method name=\"getEstimatedNetworkUploadBytes()J\" since=\"28\"/>\n\t\t<method name=\"getIntent()Landroid/content/Intent;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/role/RoleManager\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createRequestRoleIntent(Ljava/lang/String;)Landroid/content/Intent;\"/>\n\t\t<method name=\"isRoleAvailable(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isRoleHeld(Ljava/lang/String;)Z\"/>\n\t\t<field name=\"ROLE_ASSISTANT\"/>\n\t\t<field name=\"ROLE_BROWSER\"/>\n\t\t<field name=\"ROLE_CALL_REDIRECTION\"/>\n\t\t<field name=\"ROLE_CALL_SCREENING\"/>\n\t\t<field name=\"ROLE_DIALER\"/>\n\t\t<field name=\"ROLE_EMERGENCY\"/>\n\t\t<field name=\"ROLE_HOME\"/>\n\t\t<field name=\"ROLE_SMS\"/>\n\t</class>\n\t<class name=\"android/app/slice/Slice\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"getHints()Ljava/util/List;\"/>\n\t\t<method name=\"getItems()Ljava/util/List;\"/>\n\t\t<method name=\"getSpec()Landroid/app/slice/SliceSpec;\"/>\n\t\t<method name=\"getUri()Landroid/net/Uri;\"/>\n\t\t<method name=\"isCallerNeeded()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"EXTRA_RANGE_VALUE\"/>\n\t\t<field name=\"EXTRA_TOGGLE_STATE\"/>\n\t\t<field name=\"HINT_ACTIONS\"/>\n\t\t<field name=\"HINT_ERROR\"/>\n\t\t<field name=\"HINT_HORIZONTAL\"/>\n\t\t<field name=\"HINT_KEYWORDS\"/>\n\t\t<field name=\"HINT_LARGE\"/>\n\t\t<field name=\"HINT_LAST_UPDATED\"/>\n\t\t<field name=\"HINT_LIST\"/>\n\t\t<field name=\"HINT_LIST_ITEM\"/>\n\t\t<field name=\"HINT_NO_TINT\"/>\n\t\t<field name=\"HINT_PARTIAL\"/>\n\t\t<field name=\"HINT_PERMISSION_REQUEST\"/>\n\t\t<field name=\"HINT_SEE_MORE\"/>\n\t\t<field name=\"HINT_SELECTED\"/>\n\t\t<field name=\"HINT_SHORTCUT\"/>\n\t\t<field name=\"HINT_SUMMARY\"/>\n\t\t<field name=\"HINT_TITLE\"/>\n\t\t<field name=\"HINT_TTL\"/>\n\t\t<field name=\"SUBTYPE_COLOR\"/>\n\t\t<field name=\"SUBTYPE_CONTENT_DESCRIPTION\"/>\n\t\t<field name=\"SUBTYPE_LAYOUT_DIRECTION\"/>\n\t\t<field name=\"SUBTYPE_MAX\"/>\n\t\t<field name=\"SUBTYPE_MESSAGE\"/>\n\t\t<field name=\"SUBTYPE_MILLIS\"/>\n\t\t<field name=\"SUBTYPE_PRIORITY\"/>\n\t\t<field name=\"SUBTYPE_RANGE\"/>\n\t\t<field name=\"SUBTYPE_SOURCE\"/>\n\t\t<field name=\"SUBTYPE_TOGGLE\"/>\n\t\t<field name=\"SUBTYPE_VALUE\"/>\n\t</class>\n\t<class name=\"android/app/slice/Slice$Builder\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/slice/Slice$Builder;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/Uri;Landroid/app/slice/SliceSpec;)V\"/>\n\t\t<method name=\"addAction(Landroid/app/PendingIntent;Landroid/app/slice/Slice;Ljava/lang/String;)Landroid/app/slice/Slice$Builder;\"/>\n\t\t<method name=\"addBundle(Landroid/os/Bundle;Ljava/lang/String;Ljava/util/List;)Landroid/app/slice/Slice$Builder;\"/>\n\t\t<method name=\"addHints(Ljava/util/List;)Landroid/app/slice/Slice$Builder;\"/>\n\t\t<method name=\"addIcon(Landroid/graphics/drawable/Icon;Ljava/lang/String;Ljava/util/List;)Landroid/app/slice/Slice$Builder;\"/>\n\t\t<method name=\"addInt(ILjava/lang/String;Ljava/util/List;)Landroid/app/slice/Slice$Builder;\"/>\n\t\t<method name=\"addLong(JLjava/lang/String;Ljava/util/List;)Landroid/app/slice/Slice$Builder;\"/>\n\t\t<method name=\"addRemoteInput(Landroid/app/RemoteInput;Ljava/lang/String;Ljava/util/List;)Landroid/app/slice/Slice$Builder;\"/>\n\t\t<method name=\"addSubSlice(Landroid/app/slice/Slice;Ljava/lang/String;)Landroid/app/slice/Slice$Builder;\"/>\n\t\t<method name=\"addText(Ljava/lang/CharSequence;Ljava/lang/String;Ljava/util/List;)Landroid/app/slice/Slice$Builder;\"/>\n\t\t<method name=\"build()Landroid/app/slice/Slice;\"/>\n\t\t<method name=\"setCallerNeeded(Z)Landroid/app/slice/Slice$Builder;\"/>\n\t</class>\n\t<class name=\"android/app/slice/SliceItem\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getAction()Landroid/app/PendingIntent;\"/>\n\t\t<method name=\"getBundle()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getFormat()Ljava/lang/String;\"/>\n\t\t<method name=\"getHints()Ljava/util/List;\"/>\n\t\t<method name=\"getIcon()Landroid/graphics/drawable/Icon;\"/>\n\t\t<method name=\"getInt()I\"/>\n\t\t<method name=\"getLong()J\"/>\n\t\t<method name=\"getRemoteInput()Landroid/app/RemoteInput;\"/>\n\t\t<method name=\"getSlice()Landroid/app/slice/Slice;\"/>\n\t\t<method name=\"getSubType()Ljava/lang/String;\"/>\n\t\t<method name=\"getText()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"hasHint(Ljava/lang/String;)Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FORMAT_ACTION\"/>\n\t\t<field name=\"FORMAT_BUNDLE\"/>\n\t\t<field name=\"FORMAT_IMAGE\"/>\n\t\t<field name=\"FORMAT_INT\"/>\n\t\t<field name=\"FORMAT_LONG\"/>\n\t\t<field name=\"FORMAT_REMOTE_INPUT\"/>\n\t\t<field name=\"FORMAT_SLICE\"/>\n\t\t<field name=\"FORMAT_TEXT\"/>\n\t</class>\n\t<class name=\"android/app/slice/SliceManager\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"bindSlice(Landroid/content/Intent;Ljava/util/Set;)Landroid/app/slice/Slice;\"/>\n\t\t<method name=\"bindSlice(Landroid/net/Uri;Ljava/util/Set;)Landroid/app/slice/Slice;\"/>\n\t\t<method name=\"checkSlicePermission(Landroid/net/Uri;II)I\"/>\n\t\t<method name=\"getPinnedSlices()Ljava/util/List;\"/>\n\t\t<method name=\"getPinnedSpecs(Landroid/net/Uri;)Ljava/util/Set;\"/>\n\t\t<method name=\"getSliceDescendants(Landroid/net/Uri;)Ljava/util/Collection;\"/>\n\t\t<method name=\"grantSlicePermission(Ljava/lang/String;Landroid/net/Uri;)V\"/>\n\t\t<method name=\"mapIntentToUri(Landroid/content/Intent;)Landroid/net/Uri;\"/>\n\t\t<method name=\"pinSlice(Landroid/net/Uri;Ljava/util/Set;)V\"/>\n\t\t<method name=\"revokeSlicePermission(Ljava/lang/String;Landroid/net/Uri;)V\"/>\n\t\t<method name=\"unpinSlice(Landroid/net/Uri;)V\"/>\n\t\t<field name=\"CATEGORY_SLICE\"/>\n\t\t<field name=\"SLICE_METADATA_KEY\"/>\n\t</class>\n\t<class name=\"android/app/slice/SliceMetrics\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/net/Uri;)V\"/>\n\t\t<method name=\"logHidden()V\"/>\n\t\t<method name=\"logTouch(ILandroid/net/Uri;)V\"/>\n\t\t<method name=\"logVisible()V\"/>\n\t</class>\n\t<class name=\"android/app/slice/SliceProvider\" since=\"28\">\n\t\t<extends name=\"android/content/ContentProvider\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>([Ljava/lang/String;)V\"/>\n\t\t<method name=\"onBindSlice(Landroid/net/Uri;Ljava/util/Set;)Landroid/app/slice/Slice;\"/>\n\t\t<method name=\"onCreatePermissionRequest(Landroid/net/Uri;)Landroid/app/PendingIntent;\"/>\n\t\t<method name=\"onGetSliceDescendants(Landroid/net/Uri;)Ljava/util/Collection;\"/>\n\t\t<method name=\"onMapIntentToUri(Landroid/content/Intent;)Landroid/net/Uri;\"/>\n\t\t<method name=\"onSlicePinned(Landroid/net/Uri;)V\"/>\n\t\t<method name=\"onSliceUnpinned(Landroid/net/Uri;)V\"/>\n\t\t<field name=\"SLICE_TYPE\"/>\n\t</class>\n\t<class name=\"android/app/slice/SliceSpec\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"canRender(Landroid/app/slice/SliceSpec;)Z\"/>\n\t\t<method name=\"getRevision()I\"/>\n\t\t<method name=\"getType()Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/usage/ConfigurationStats\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/usage/ConfigurationStats;)V\"/>\n\t\t<method name=\"getActivationCount()I\"/>\n\t\t<method name=\"getConfiguration()Landroid/content/res/Configuration;\"/>\n\t\t<method name=\"getFirstTimeStamp()J\"/>\n\t\t<method name=\"getLastTimeActive()J\"/>\n\t\t<method name=\"getLastTimeStamp()J\"/>\n\t\t<method name=\"getTotalTimeActive()J\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/usage/EventStats\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/usage/EventStats;)V\"/>\n\t\t<method name=\"add(Landroid/app/usage/EventStats;)V\"/>\n\t\t<method name=\"getCount()I\"/>\n\t\t<method name=\"getEventType()I\"/>\n\t\t<method name=\"getFirstTimeStamp()J\"/>\n\t\t<method name=\"getLastEventTime()J\"/>\n\t\t<method name=\"getLastTimeStamp()J\"/>\n\t\t<method name=\"getTotalTime()J\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/usage/ExternalStorageStats\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getAppBytes()J\"/>\n\t\t<method name=\"getAudioBytes()J\"/>\n\t\t<method name=\"getImageBytes()J\"/>\n\t\t<method name=\"getTotalBytes()J\"/>\n\t\t<method name=\"getVideoBytes()J\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/usage/NetworkStats\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"getNextBucket(Landroid/app/usage/NetworkStats$Bucket;)Z\"/>\n\t\t<method name=\"hasNextBucket()Z\"/>\n\t</class>\n\t<class name=\"android/app/usage/NetworkStats$Bucket\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getDefaultNetworkStatus()I\" since=\"28\"/>\n\t\t<method name=\"getEndTimeStamp()J\"/>\n\t\t<method name=\"getMetered()I\" since=\"26\"/>\n\t\t<method name=\"getRoaming()I\" since=\"24\"/>\n\t\t<method name=\"getRxBytes()J\"/>\n\t\t<method name=\"getRxPackets()J\"/>\n\t\t<method name=\"getStartTimeStamp()J\"/>\n\t\t<method name=\"getState()I\"/>\n\t\t<method name=\"getTag()I\" since=\"24\"/>\n\t\t<method name=\"getTxBytes()J\"/>\n\t\t<method name=\"getTxPackets()J\"/>\n\t\t<method name=\"getUid()I\"/>\n\t\t<field name=\"DEFAULT_NETWORK_ALL\" since=\"28\"/>\n\t\t<field name=\"DEFAULT_NETWORK_NO\" since=\"28\"/>\n\t\t<field name=\"DEFAULT_NETWORK_YES\" since=\"28\"/>\n\t\t<field name=\"METERED_ALL\" since=\"26\"/>\n\t\t<field name=\"METERED_NO\" since=\"26\"/>\n\t\t<field name=\"METERED_YES\" since=\"26\"/>\n\t\t<field name=\"ROAMING_ALL\" since=\"24\"/>\n\t\t<field name=\"ROAMING_NO\" since=\"24\"/>\n\t\t<field name=\"ROAMING_YES\" since=\"24\"/>\n\t\t<field name=\"STATE_ALL\"/>\n\t\t<field name=\"STATE_DEFAULT\"/>\n\t\t<field name=\"STATE_FOREGROUND\"/>\n\t\t<field name=\"TAG_NONE\" since=\"24\"/>\n\t\t<field name=\"UID_ALL\"/>\n\t\t<field name=\"UID_REMOVED\"/>\n\t\t<field name=\"UID_TETHERING\"/>\n\t</class>\n\t<class name=\"android/app/usage/NetworkStatsManager\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"queryDetails(ILjava/lang/String;JJ)Landroid/app/usage/NetworkStats;\"/>\n\t\t<method name=\"queryDetailsForUid(ILjava/lang/String;JJI)Landroid/app/usage/NetworkStats;\"/>\n\t\t<method name=\"queryDetailsForUidTag(ILjava/lang/String;JJII)Landroid/app/usage/NetworkStats;\" since=\"24\"/>\n\t\t<method name=\"queryDetailsForUidTagState(ILjava/lang/String;JJIII)Landroid/app/usage/NetworkStats;\" since=\"28\"/>\n\t\t<method name=\"querySummary(ILjava/lang/String;JJ)Landroid/app/usage/NetworkStats;\"/>\n\t\t<method name=\"querySummaryForDevice(ILjava/lang/String;JJ)Landroid/app/usage/NetworkStats$Bucket;\"/>\n\t\t<method name=\"querySummaryForUser(ILjava/lang/String;JJ)Landroid/app/usage/NetworkStats$Bucket;\"/>\n\t\t<method name=\"registerUsageCallback(ILjava/lang/String;JLandroid/app/usage/NetworkStatsManager$UsageCallback;)V\" since=\"24\"/>\n\t\t<method name=\"registerUsageCallback(ILjava/lang/String;JLandroid/app/usage/NetworkStatsManager$UsageCallback;Landroid/os/Handler;)V\" since=\"24\"/>\n\t\t<method name=\"unregisterUsageCallback(Landroid/app/usage/NetworkStatsManager$UsageCallback;)V\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/app/usage/NetworkStatsManager$UsageCallback\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onThresholdReached(ILjava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/app/usage/StorageStats\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getAppBytes()J\"/>\n\t\t<method name=\"getCacheBytes()J\"/>\n\t\t<method name=\"getDataBytes()J\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/usage/StorageStatsManager\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getFreeBytes(Ljava/util/UUID;)J\"/>\n\t\t<method name=\"getTotalBytes(Ljava/util/UUID;)J\"/>\n\t\t<method name=\"queryExternalStatsForUser(Ljava/util/UUID;Landroid/os/UserHandle;)Landroid/app/usage/ExternalStorageStats;\"/>\n\t\t<method name=\"queryStatsForPackage(Ljava/util/UUID;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/app/usage/StorageStats;\"/>\n\t\t<method name=\"queryStatsForUid(Ljava/util/UUID;I)Landroid/app/usage/StorageStats;\"/>\n\t\t<method name=\"queryStatsForUser(Ljava/util/UUID;Landroid/os/UserHandle;)Landroid/app/usage/StorageStats;\"/>\n\t</class>\n\t<class name=\"android/app/usage/UsageEvents\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getNextEvent(Landroid/app/usage/UsageEvents$Event;)Z\"/>\n\t\t<method name=\"hasNextEvent()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/usage/UsageEvents$Event\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getAppStandbyBucket()I\" since=\"28\"/>\n\t\t<method name=\"getClassName()Ljava/lang/String;\"/>\n\t\t<method name=\"getConfiguration()Landroid/content/res/Configuration;\"/>\n\t\t<method name=\"getEventType()I\"/>\n\t\t<method name=\"getPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getShortcutId()Ljava/lang/String;\" since=\"25\"/>\n\t\t<method name=\"getTimeStamp()J\"/>\n\t\t<field name=\"ACTIVITY_PAUSED\" since=\"29\"/>\n\t\t<field name=\"ACTIVITY_RESUMED\" since=\"29\"/>\n\t\t<field name=\"ACTIVITY_STOPPED\" since=\"29\"/>\n\t\t<field name=\"CONFIGURATION_CHANGE\"/>\n\t\t<field name=\"DEVICE_SHUTDOWN\" since=\"29\"/>\n\t\t<field name=\"DEVICE_STARTUP\" since=\"29\"/>\n\t\t<field name=\"FOREGROUND_SERVICE_START\" since=\"29\"/>\n\t\t<field name=\"FOREGROUND_SERVICE_STOP\" since=\"29\"/>\n\t\t<field name=\"KEYGUARD_HIDDEN\" since=\"28\"/>\n\t\t<field name=\"KEYGUARD_SHOWN\" since=\"28\"/>\n\t\t<field name=\"MOVE_TO_BACKGROUND\" deprecated=\"29\"/>\n\t\t<field name=\"MOVE_TO_FOREGROUND\" deprecated=\"29\"/>\n\t\t<field name=\"NONE\"/>\n\t\t<field name=\"SCREEN_INTERACTIVE\" since=\"28\"/>\n\t\t<field name=\"SCREEN_NON_INTERACTIVE\" since=\"28\"/>\n\t\t<field name=\"SHORTCUT_INVOCATION\" since=\"25\"/>\n\t\t<field name=\"STANDBY_BUCKET_CHANGED\" since=\"28\"/>\n\t\t<field name=\"USER_INTERACTION\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/app/usage/UsageStats\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/usage/UsageStats;)V\"/>\n\t\t<method name=\"add(Landroid/app/usage/UsageStats;)V\"/>\n\t\t<method name=\"getFirstTimeStamp()J\"/>\n\t\t<method name=\"getLastTimeForegroundServiceUsed()J\" since=\"29\"/>\n\t\t<method name=\"getLastTimeStamp()J\"/>\n\t\t<method name=\"getLastTimeUsed()J\"/>\n\t\t<method name=\"getLastTimeVisible()J\" since=\"29\"/>\n\t\t<method name=\"getPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getTotalTimeForegroundServiceUsed()J\" since=\"29\"/>\n\t\t<method name=\"getTotalTimeInForeground()J\"/>\n\t\t<method name=\"getTotalTimeVisible()J\" since=\"29\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/app/usage/UsageStatsManager\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAppStandbyBucket()I\" since=\"28\"/>\n\t\t<method name=\"isAppInactive(Ljava/lang/String;)Z\" since=\"23\"/>\n\t\t<method name=\"queryAndAggregateUsageStats(JJ)Ljava/util/Map;\"/>\n\t\t<method name=\"queryConfigurations(IJJ)Ljava/util/List;\"/>\n\t\t<method name=\"queryEventStats(IJJ)Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"queryEvents(JJ)Landroid/app/usage/UsageEvents;\"/>\n\t\t<method name=\"queryEventsForSelf(JJ)Landroid/app/usage/UsageEvents;\" since=\"28\"/>\n\t\t<method name=\"queryUsageStats(IJJ)Ljava/util/List;\"/>\n\t\t<field name=\"INTERVAL_BEST\"/>\n\t\t<field name=\"INTERVAL_DAILY\"/>\n\t\t<field name=\"INTERVAL_MONTHLY\"/>\n\t\t<field name=\"INTERVAL_WEEKLY\"/>\n\t\t<field name=\"INTERVAL_YEARLY\"/>\n\t\t<field name=\"STANDBY_BUCKET_ACTIVE\" since=\"28\"/>\n\t\t<field name=\"STANDBY_BUCKET_FREQUENT\" since=\"28\"/>\n\t\t<field name=\"STANDBY_BUCKET_RARE\" since=\"28\"/>\n\t\t<field name=\"STANDBY_BUCKET_WORKING_SET\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/appwidget/AppWidgetHost\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"allocateAppWidgetId()I\"/>\n\t\t<method name=\"clearViews()V\" since=\"11\"/>\n\t\t<method name=\"createView(Landroid/content/Context;ILandroid/appwidget/AppWidgetProviderInfo;)Landroid/appwidget/AppWidgetHostView;\"/>\n\t\t<method name=\"deleteAllHosts()V\"/>\n\t\t<method name=\"deleteAppWidgetId(I)V\"/>\n\t\t<method name=\"deleteHost()V\"/>\n\t\t<method name=\"getAppWidgetIds()[I\" since=\"26\"/>\n\t\t<method name=\"onCreateView(Landroid/content/Context;ILandroid/appwidget/AppWidgetProviderInfo;)Landroid/appwidget/AppWidgetHostView;\"/>\n\t\t<method name=\"onProviderChanged(ILandroid/appwidget/AppWidgetProviderInfo;)V\"/>\n\t\t<method name=\"onProvidersChanged()V\" since=\"17\"/>\n\t\t<method name=\"startAppWidgetConfigureActivityForResult(Landroid/app/Activity;IIILandroid/os/Bundle;)V\" since=\"21\"/>\n\t\t<method name=\"startListening()V\"/>\n\t\t<method name=\"stopListening()V\"/>\n\t</class>\n\t<class name=\"android/appwidget/AppWidgetHostView\" since=\"3\">\n\t\t<extends name=\"android/widget/FrameLayout\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;II)V\"/>\n\t\t<method name=\"getAppWidgetId()I\"/>\n\t\t<method name=\"getAppWidgetInfo()Landroid/appwidget/AppWidgetProviderInfo;\"/>\n\t\t<method name=\"getDefaultPaddingForWidget(Landroid/content/Context;Landroid/content/ComponentName;Landroid/graphics/Rect;)Landroid/graphics/Rect;\" since=\"15\"/>\n\t\t<method name=\"getDefaultView()Landroid/view/View;\"/>\n\t\t<method name=\"getErrorView()Landroid/view/View;\"/>\n\t\t<method name=\"prepareView(Landroid/view/View;)V\"/>\n\t\t<method name=\"setAppWidget(ILandroid/appwidget/AppWidgetProviderInfo;)V\"/>\n\t\t<method name=\"setExecutor(Ljava/util/concurrent/Executor;)V\" since=\"26\"/>\n\t\t<method name=\"setOnLightBackground(Z)V\" since=\"29\"/>\n\t\t<method name=\"updateAppWidget(Landroid/widget/RemoteViews;)V\"/>\n\t\t<method name=\"updateAppWidgetOptions(Landroid/os/Bundle;)V\" since=\"16\"/>\n\t\t<method name=\"updateAppWidgetSize(Landroid/os/Bundle;IIII)V\" since=\"16\"/>\n\t</class>\n\t<class name=\"android/appwidget/AppWidgetManager\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"bindAppWidgetId(ILandroid/content/ComponentName;)V\" removed=\"16\"/>\n\t\t<method name=\"bindAppWidgetIdIfAllowed(ILandroid/content/ComponentName;)Z\" since=\"16\"/>\n\t\t<method name=\"bindAppWidgetIdIfAllowed(ILandroid/content/ComponentName;Landroid/os/Bundle;)Z\" since=\"17\"/>\n\t\t<method name=\"bindAppWidgetIdIfAllowed(ILandroid/os/UserHandle;Landroid/content/ComponentName;Landroid/os/Bundle;)Z\" since=\"21\"/>\n\t\t<method name=\"getAppWidgetIds(Landroid/content/ComponentName;)[I\"/>\n\t\t<method name=\"getAppWidgetInfo(I)Landroid/appwidget/AppWidgetProviderInfo;\"/>\n\t\t<method name=\"getAppWidgetOptions(I)Landroid/os/Bundle;\" since=\"16\"/>\n\t\t<method name=\"getInstalledProviders()Ljava/util/List;\"/>\n\t\t<method name=\"getInstalledProvidersForPackage(Ljava/lang/String;Landroid/os/UserHandle;)Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"getInstalledProvidersForProfile(Landroid/os/UserHandle;)Ljava/util/List;\" since=\"21\"/>\n\t\t<method name=\"getInstance(Landroid/content/Context;)Landroid/appwidget/AppWidgetManager;\"/>\n\t\t<method name=\"isRequestPinAppWidgetSupported()Z\" since=\"26\"/>\n\t\t<method name=\"notifyAppWidgetViewDataChanged(II)V\" since=\"11\"/>\n\t\t<method name=\"notifyAppWidgetViewDataChanged([II)V\" since=\"11\"/>\n\t\t<method name=\"partiallyUpdateAppWidget(ILandroid/widget/RemoteViews;)V\" since=\"11\"/>\n\t\t<method name=\"partiallyUpdateAppWidget([ILandroid/widget/RemoteViews;)V\" since=\"11\"/>\n\t\t<method name=\"requestPinAppWidget(Landroid/content/ComponentName;Landroid/os/Bundle;Landroid/app/PendingIntent;)Z\" since=\"26\"/>\n\t\t<method name=\"updateAppWidget(ILandroid/widget/RemoteViews;)V\"/>\n\t\t<method name=\"updateAppWidget(Landroid/content/ComponentName;Landroid/widget/RemoteViews;)V\"/>\n\t\t<method name=\"updateAppWidget([ILandroid/widget/RemoteViews;)V\"/>\n\t\t<method name=\"updateAppWidgetOptions(ILandroid/os/Bundle;)V\" since=\"16\"/>\n\t\t<method name=\"updateAppWidgetProviderInfo(Landroid/content/ComponentName;Ljava/lang/String;)V\" since=\"28\"/>\n\t\t<field name=\"ACTION_APPWIDGET_BIND\" since=\"16\"/>\n\t\t<field name=\"ACTION_APPWIDGET_CONFIGURE\"/>\n\t\t<field name=\"ACTION_APPWIDGET_DELETED\"/>\n\t\t<field name=\"ACTION_APPWIDGET_DISABLED\"/>\n\t\t<field name=\"ACTION_APPWIDGET_ENABLED\"/>\n\t\t<field name=\"ACTION_APPWIDGET_HOST_RESTORED\" since=\"21\"/>\n\t\t<field name=\"ACTION_APPWIDGET_OPTIONS_CHANGED\" since=\"16\"/>\n\t\t<field name=\"ACTION_APPWIDGET_PICK\"/>\n\t\t<field name=\"ACTION_APPWIDGET_RESTORED\" since=\"21\"/>\n\t\t<field name=\"ACTION_APPWIDGET_UPDATE\"/>\n\t\t<field name=\"EXTRA_APPWIDGET_ID\"/>\n\t\t<field name=\"EXTRA_APPWIDGET_IDS\"/>\n\t\t<field name=\"EXTRA_APPWIDGET_OLD_IDS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_APPWIDGET_OPTIONS\" since=\"16\"/>\n\t\t<field name=\"EXTRA_APPWIDGET_PREVIEW\" since=\"26\"/>\n\t\t<field name=\"EXTRA_APPWIDGET_PROVIDER\" since=\"16\"/>\n\t\t<field name=\"EXTRA_APPWIDGET_PROVIDER_PROFILE\" since=\"21\"/>\n\t\t<field name=\"EXTRA_CUSTOM_EXTRAS\"/>\n\t\t<field name=\"EXTRA_CUSTOM_INFO\"/>\n\t\t<field name=\"EXTRA_HOST_ID\" since=\"21\"/>\n\t\t<field name=\"INVALID_APPWIDGET_ID\"/>\n\t\t<field name=\"META_DATA_APPWIDGET_PROVIDER\"/>\n\t\t<field name=\"OPTION_APPWIDGET_HOST_CATEGORY\" since=\"17\"/>\n\t\t<field name=\"OPTION_APPWIDGET_MAX_HEIGHT\" since=\"16\"/>\n\t\t<field name=\"OPTION_APPWIDGET_MAX_WIDTH\" since=\"16\"/>\n\t\t<field name=\"OPTION_APPWIDGET_MIN_HEIGHT\" since=\"16\"/>\n\t\t<field name=\"OPTION_APPWIDGET_MIN_WIDTH\" since=\"16\"/>\n\t</class>\n\t<class name=\"android/appwidget/AppWidgetProvider\" since=\"3\">\n\t\t<extends name=\"android/content/BroadcastReceiver\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onAppWidgetOptionsChanged(Landroid/content/Context;Landroid/appwidget/AppWidgetManager;ILandroid/os/Bundle;)V\" since=\"16\"/>\n\t\t<method name=\"onDeleted(Landroid/content/Context;[I)V\"/>\n\t\t<method name=\"onDisabled(Landroid/content/Context;)V\"/>\n\t\t<method name=\"onEnabled(Landroid/content/Context;)V\"/>\n\t\t<method name=\"onRestored(Landroid/content/Context;[I[I)V\" since=\"21\"/>\n\t\t<method name=\"onUpdate(Landroid/content/Context;Landroid/appwidget/AppWidgetManager;[I)V\"/>\n\t</class>\n\t<class name=\"android/appwidget/AppWidgetProviderInfo\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"clone()Landroid/appwidget/AppWidgetProviderInfo;\" since=\"17\"/>\n\t\t<method name=\"getProfile()Landroid/os/UserHandle;\" since=\"21\"/>\n\t\t<method name=\"loadIcon(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable;\" since=\"21\"/>\n\t\t<method name=\"loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"loadPreviewImage(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable;\" since=\"21\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"RESIZE_BOTH\" since=\"12\"/>\n\t\t<field name=\"RESIZE_HORIZONTAL\" since=\"12\"/>\n\t\t<field name=\"RESIZE_NONE\" since=\"12\"/>\n\t\t<field name=\"RESIZE_VERTICAL\" since=\"12\"/>\n\t\t<field name=\"WIDGET_CATEGORY_HOME_SCREEN\" since=\"17\"/>\n\t\t<field name=\"WIDGET_CATEGORY_KEYGUARD\" since=\"17\"/>\n\t\t<field name=\"WIDGET_CATEGORY_SEARCHBOX\" since=\"21\"/>\n\t\t<field name=\"WIDGET_FEATURE_HIDE_FROM_PICKER\" since=\"28\"/>\n\t\t<field name=\"WIDGET_FEATURE_RECONFIGURABLE\" since=\"28\"/>\n\t\t<field name=\"autoAdvanceViewId\" since=\"11\"/>\n\t\t<field name=\"configure\"/>\n\t\t<field name=\"icon\"/>\n\t\t<field name=\"initialKeyguardLayout\" since=\"17\"/>\n\t\t<field name=\"initialLayout\"/>\n\t\t<field name=\"label\" deprecated=\"21\"/>\n\t\t<field name=\"minHeight\"/>\n\t\t<field name=\"minResizeHeight\" since=\"14\"/>\n\t\t<field name=\"minResizeWidth\" since=\"14\"/>\n\t\t<field name=\"minWidth\"/>\n\t\t<field name=\"previewImage\" since=\"11\"/>\n\t\t<field name=\"provider\"/>\n\t\t<field name=\"resizeMode\" since=\"12\"/>\n\t\t<field name=\"updatePeriodMillis\"/>\n\t\t<field name=\"widgetCategory\" since=\"17\"/>\n\t\t<field name=\"widgetFeatures\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothA2dp\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/bluetooth/BluetoothProfile\"/>\n\t\t<method name=\"isA2dpPlaying(Landroid/bluetooth/BluetoothDevice;)Z\"/>\n\t\t<field name=\"ACTION_CONNECTION_STATE_CHANGED\"/>\n\t\t<field name=\"ACTION_PLAYING_STATE_CHANGED\"/>\n\t\t<field name=\"STATE_NOT_PLAYING\"/>\n\t\t<field name=\"STATE_PLAYING\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothAdapter\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"cancelDiscovery()Z\"/>\n\t\t<method name=\"checkBluetoothAddress(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"closeProfileProxy(ILandroid/bluetooth/BluetoothProfile;)V\" since=\"11\"/>\n\t\t<method name=\"disable()Z\"/>\n\t\t<method name=\"enable()Z\"/>\n\t\t<method name=\"getAddress()Ljava/lang/String;\"/>\n\t\t<method name=\"getBluetoothLeAdvertiser()Landroid/bluetooth/le/BluetoothLeAdvertiser;\" since=\"21\"/>\n\t\t<method name=\"getBluetoothLeScanner()Landroid/bluetooth/le/BluetoothLeScanner;\" since=\"21\"/>\n\t\t<method name=\"getBondedDevices()Ljava/util/Set;\"/>\n\t\t<method name=\"getDefaultAdapter()Landroid/bluetooth/BluetoothAdapter;\"/>\n\t\t<method name=\"getLeMaximumAdvertisingDataLength()I\" since=\"26\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getProfileConnectionState(I)I\" since=\"14\"/>\n\t\t<method name=\"getProfileProxy(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;I)Z\" since=\"11\"/>\n\t\t<method name=\"getRemoteDevice(Ljava/lang/String;)Landroid/bluetooth/BluetoothDevice;\"/>\n\t\t<method name=\"getRemoteDevice([B)Landroid/bluetooth/BluetoothDevice;\" since=\"16\"/>\n\t\t<method name=\"getScanMode()I\"/>\n\t\t<method name=\"getState()I\"/>\n\t\t<method name=\"isDiscovering()Z\"/>\n\t\t<method name=\"isEnabled()Z\"/>\n\t\t<method name=\"isLe2MPhySupported()Z\" since=\"26\"/>\n\t\t<method name=\"isLeCodedPhySupported()Z\" since=\"26\"/>\n\t\t<method name=\"isLeExtendedAdvertisingSupported()Z\" since=\"26\"/>\n\t\t<method name=\"isLePeriodicAdvertisingSupported()Z\" since=\"26\"/>\n\t\t<method name=\"isMultipleAdvertisementSupported()Z\" since=\"21\"/>\n\t\t<method name=\"isOffloadedFilteringSupported()Z\" since=\"21\"/>\n\t\t<method name=\"isOffloadedScanBatchingSupported()Z\" since=\"21\"/>\n\t\t<method name=\"listenUsingInsecureL2capChannel()Landroid/bluetooth/BluetoothServerSocket;\" since=\"29\"/>\n\t\t<method name=\"listenUsingInsecureRfcommWithServiceRecord(Ljava/lang/String;Ljava/util/UUID;)Landroid/bluetooth/BluetoothServerSocket;\" since=\"10\"/>\n\t\t<method name=\"listenUsingL2capChannel()Landroid/bluetooth/BluetoothServerSocket;\" since=\"29\"/>\n\t\t<method name=\"listenUsingRfcommWithServiceRecord(Ljava/lang/String;Ljava/util/UUID;)Landroid/bluetooth/BluetoothServerSocket;\"/>\n\t\t<method name=\"setName(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"startDiscovery()Z\"/>\n\t\t<method name=\"startLeScan(Landroid/bluetooth/BluetoothAdapter$LeScanCallback;)Z\" since=\"18\" deprecated=\"21\"/>\n\t\t<method name=\"startLeScan([Ljava/util/UUID;Landroid/bluetooth/BluetoothAdapter$LeScanCallback;)Z\" since=\"18\" deprecated=\"21\"/>\n\t\t<method name=\"stopLeScan(Landroid/bluetooth/BluetoothAdapter$LeScanCallback;)V\" since=\"18\" deprecated=\"21\"/>\n\t\t<field name=\"ACTION_CONNECTION_STATE_CHANGED\" since=\"11\"/>\n\t\t<field name=\"ACTION_DISCOVERY_FINISHED\"/>\n\t\t<field name=\"ACTION_DISCOVERY_STARTED\"/>\n\t\t<field name=\"ACTION_LOCAL_NAME_CHANGED\"/>\n\t\t<field name=\"ACTION_REQUEST_DISCOVERABLE\"/>\n\t\t<field name=\"ACTION_REQUEST_ENABLE\"/>\n\t\t<field name=\"ACTION_SCAN_MODE_CHANGED\"/>\n\t\t<field name=\"ACTION_STATE_CHANGED\"/>\n\t\t<field name=\"ERROR\"/>\n\t\t<field name=\"EXTRA_CONNECTION_STATE\" since=\"11\"/>\n\t\t<field name=\"EXTRA_DISCOVERABLE_DURATION\"/>\n\t\t<field name=\"EXTRA_LOCAL_NAME\"/>\n\t\t<field name=\"EXTRA_PREVIOUS_CONNECTION_STATE\" since=\"11\"/>\n\t\t<field name=\"EXTRA_PREVIOUS_SCAN_MODE\"/>\n\t\t<field name=\"EXTRA_PREVIOUS_STATE\"/>\n\t\t<field name=\"EXTRA_SCAN_MODE\"/>\n\t\t<field name=\"EXTRA_STATE\"/>\n\t\t<field name=\"SCAN_MODE_CONNECTABLE\"/>\n\t\t<field name=\"SCAN_MODE_CONNECTABLE_DISCOVERABLE\"/>\n\t\t<field name=\"SCAN_MODE_NONE\"/>\n\t\t<field name=\"STATE_CONNECTED\" since=\"11\"/>\n\t\t<field name=\"STATE_CONNECTING\" since=\"11\"/>\n\t\t<field name=\"STATE_DISCONNECTED\" since=\"11\"/>\n\t\t<field name=\"STATE_DISCONNECTING\" since=\"11\"/>\n\t\t<field name=\"STATE_OFF\"/>\n\t\t<field name=\"STATE_ON\"/>\n\t\t<field name=\"STATE_TURNING_OFF\"/>\n\t\t<field name=\"STATE_TURNING_ON\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothAdapter$LeScanCallback\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onLeScan(Landroid/bluetooth/BluetoothDevice;I[B)V\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothAssignedNumbers\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"AAMP_OF_AMERICA\" since=\"19\"/>\n\t\t<field name=\"ACCEL_SEMICONDUCTOR\"/>\n\t\t<field name=\"ACE_SENSOR\" since=\"19\"/>\n\t\t<field name=\"ADIDAS\" since=\"19\"/>\n\t\t<field name=\"ADVANCED_PANMOBIL_SYSTEMS\" since=\"19\"/>\n\t\t<field name=\"AIROHA_TECHNOLOGY\" since=\"19\"/>\n\t\t<field name=\"ALCATEL\"/>\n\t\t<field name=\"ALPWISE\" since=\"19\"/>\n\t\t<field name=\"AMICCOM_ELECTRONICS\" since=\"19\"/>\n\t\t<field name=\"APLIX\" since=\"19\"/>\n\t\t<field name=\"APPLE\"/>\n\t\t<field name=\"APT_LICENSING\"/>\n\t\t<field name=\"ARCHOS\" since=\"19\"/>\n\t\t<field name=\"ARP_DEVICES\" since=\"19\"/>\n\t\t<field name=\"ATHEROS_COMMUNICATIONS\"/>\n\t\t<field name=\"ATMEL\"/>\n\t\t<field name=\"AUSTCO_COMMUNICATION_SYSTEMS\" since=\"19\"/>\n\t\t<field name=\"AUTONET_MOBILE\" since=\"19\"/>\n\t\t<field name=\"AVAGO\"/>\n\t\t<field name=\"AVM_BERLIN\"/>\n\t\t<field name=\"A_AND_D_ENGINEERING\" since=\"19\"/>\n\t\t<field name=\"A_AND_R_CAMBRIDGE\" since=\"19\"/>\n\t\t<field name=\"BANDSPEED\"/>\n\t\t<field name=\"BAND_XI_INTERNATIONAL\" since=\"19\"/>\n\t\t<field name=\"BDE_TECHNOLOGY\" since=\"19\"/>\n\t\t<field name=\"BEATS_ELECTRONICS\" since=\"19\"/>\n\t\t<field name=\"BEAUTIFUL_ENTERPRISE\" since=\"19\"/>\n\t\t<field name=\"BEKEY\" since=\"19\"/>\n\t\t<field name=\"BELKIN_INTERNATIONAL\"/>\n\t\t<field name=\"BINAURIC\" since=\"19\"/>\n\t\t<field name=\"BIOSENTRONICS\" since=\"19\"/>\n\t\t<field name=\"BLUEGIGA\"/>\n\t\t<field name=\"BLUERADIOS\" since=\"19\"/>\n\t\t<field name=\"BLUETOOTH_SIG\"/>\n\t\t<field name=\"BLUETREK_TECHNOLOGIES\" since=\"19\"/>\n\t\t<field name=\"BOSE\" since=\"19\"/>\n\t\t<field name=\"BRIARTEK\" since=\"19\"/>\n\t\t<field name=\"BROADCOM\"/>\n\t\t<field name=\"CAEN_RFID\" since=\"19\"/>\n\t\t<field name=\"CAMBRIDGE_SILICON_RADIO\"/>\n\t\t<field name=\"CATC\"/>\n\t\t<field name=\"CINETIX\" since=\"19\"/>\n\t\t<field name=\"CLARINOX_TECHNOLOGIES\" since=\"19\"/>\n\t\t<field name=\"COLORFY\" since=\"19\"/>\n\t\t<field name=\"COMMIL\"/>\n\t\t<field name=\"CONEXANT_SYSTEMS\"/>\n\t\t<field name=\"CONNECTBLUE\" since=\"19\"/>\n\t\t<field name=\"CONTINENTAL_AUTOMOTIVE\"/>\n\t\t<field name=\"CONWISE_TECHNOLOGY\"/>\n\t\t<field name=\"CREATIVE_TECHNOLOGY\" since=\"19\"/>\n\t\t<field name=\"C_TECHNOLOGIES\"/>\n\t\t<field name=\"DANLERS\" since=\"19\"/>\n\t\t<field name=\"DELORME_PUBLISHING_COMPANY\" since=\"19\"/>\n\t\t<field name=\"DEXCOM\" since=\"19\"/>\n\t\t<field name=\"DIALOG_SEMICONDUCTOR\" since=\"19\"/>\n\t\t<field name=\"DIGIANSWER\"/>\n\t\t<field name=\"ECLIPSE\"/>\n\t\t<field name=\"ECOTEST\" since=\"19\"/>\n\t\t<field name=\"ELGATO_SYSTEMS\" since=\"19\"/>\n\t\t<field name=\"EM_MICROELECTRONIC_MARIN\"/>\n\t\t<field name=\"EQUINOX_AG\" since=\"19\"/>\n\t\t<field name=\"ERICSSON_TECHNOLOGY\"/>\n\t\t<field name=\"EVLUMA\" since=\"19\"/>\n\t\t<field name=\"FREE2MOVE\"/>\n\t\t<field name=\"FUNAI_ELECTRIC\" since=\"19\"/>\n\t\t<field name=\"GARMIN_INTERNATIONAL\" since=\"19\"/>\n\t\t<field name=\"GCT_SEMICONDUCTOR\"/>\n\t\t<field name=\"GELO\" since=\"19\"/>\n\t\t<field name=\"GENEQ\" since=\"19\"/>\n\t\t<field name=\"GENERAL_MOTORS\" since=\"19\"/>\n\t\t<field name=\"GENNUM\"/>\n\t\t<field name=\"GEOFORCE\" since=\"19\"/>\n\t\t<field name=\"GIBSON_GUITARS\" since=\"19\"/>\n\t\t<field name=\"GN_NETCOM\" since=\"19\"/>\n\t\t<field name=\"GN_RESOUND\" since=\"19\"/>\n\t\t<field name=\"GOOGLE\" since=\"19\"/>\n\t\t<field name=\"GREEN_THROTTLE_GAMES\" since=\"19\"/>\n\t\t<field name=\"GROUP_SENSE\" since=\"19\"/>\n\t\t<field name=\"HANLYNN_TECHNOLOGIES\" since=\"19\"/>\n\t\t<field name=\"HARMAN_INTERNATIONAL\"/>\n\t\t<field name=\"HEWLETT_PACKARD\" since=\"19\"/>\n\t\t<field name=\"HITACHI\"/>\n\t\t<field name=\"HOSIDEN\" since=\"19\"/>\n\t\t<field name=\"IBM\"/>\n\t\t<field name=\"INFINEON_TECHNOLOGIES\"/>\n\t\t<field name=\"INGENIEUR_SYSTEMGRUPPE_ZAHN\" since=\"19\"/>\n\t\t<field name=\"INTEGRATED_SILICON_SOLUTION\"/>\n\t\t<field name=\"INTEGRATED_SYSTEM_SOLUTION\"/>\n\t\t<field name=\"INTEL\"/>\n\t\t<field name=\"INVENTEL\"/>\n\t\t<field name=\"IPEXTREME\"/>\n\t\t<field name=\"I_TECH_DYNAMIC_GLOBAL_DISTRIBUTION\" since=\"19\"/>\n\t\t<field name=\"JAWBONE\" since=\"19\"/>\n\t\t<field name=\"JIANGSU_TOPPOWER_AUTOMOTIVE_ELECTRONICS\" since=\"19\"/>\n\t\t<field name=\"JOHNSON_CONTROLS\" since=\"19\"/>\n\t\t<field name=\"J_AND_M\"/>\n\t\t<field name=\"KAWANTECH\" since=\"19\"/>\n\t\t<field name=\"KC_TECHNOLOGY\"/>\n\t\t<field name=\"KENSINGTON_COMPUTER_PRODUCTS_GROUP\" since=\"19\"/>\n\t\t<field name=\"LAIRD_TECHNOLOGIES\" since=\"19\"/>\n\t\t<field name=\"LESSWIRE\" since=\"19\"/>\n\t\t<field name=\"LG_ELECTRONICS\" since=\"19\"/>\n\t\t<field name=\"LINAK\" since=\"19\"/>\n\t\t<field name=\"LUCENT\"/>\n\t\t<field name=\"LUDUS_HELSINKI\" since=\"19\"/>\n\t\t<field name=\"MACRONIX\"/>\n\t\t<field name=\"MAGNETI_MARELLI\" since=\"19\"/>\n\t\t<field name=\"MANSELLA\"/>\n\t\t<field name=\"MARVELL\"/>\n\t\t<field name=\"MATSUSHITA_ELECTRIC\"/>\n\t\t<field name=\"MC10\" since=\"19\"/>\n\t\t<field name=\"MEDIATEK\"/>\n\t\t<field name=\"MESO_INTERNATIONAL\" since=\"19\"/>\n\t\t<field name=\"META_WATCH\" since=\"19\"/>\n\t\t<field name=\"MEWTEL_TECHNOLOGY\"/>\n\t\t<field name=\"MICOMMAND\" since=\"19\"/>\n\t\t<field name=\"MICROCHIP_TECHNOLOGY\" since=\"19\"/>\n\t\t<field name=\"MICROSOFT\"/>\n\t\t<field name=\"MINDTREE\" since=\"19\"/>\n\t\t<field name=\"MISFIT_WEARABLES\" since=\"19\"/>\n\t\t<field name=\"MITEL_SEMICONDUCTOR\"/>\n\t\t<field name=\"MITSUBISHI_ELECTRIC\"/>\n\t\t<field name=\"MOBILIAN_CORPORATION\"/>\n\t\t<field name=\"MONSTER\" since=\"19\"/>\n\t\t<field name=\"MOTOROLA\"/>\n\t\t<field name=\"MSTAR_SEMICONDUCTOR\" since=\"19\"/>\n\t\t<field name=\"MUZIK\" since=\"19\"/>\n\t\t<field name=\"NEC\"/>\n\t\t<field name=\"NEC_LIGHTING\" since=\"19\"/>\n\t\t<field name=\"NEWLOGIC\"/>\n\t\t<field name=\"NIKE\" since=\"19\"/>\n\t\t<field name=\"NINE_SOLUTIONS\" since=\"19\"/>\n\t\t<field name=\"NOKIA_MOBILE_PHONES\"/>\n\t\t<field name=\"NORDIC_SEMICONDUCTOR\"/>\n\t\t<field name=\"NORWOOD_SYSTEMS\"/>\n\t\t<field name=\"ODM_TECHNOLOGY\" since=\"19\"/>\n\t\t<field name=\"OMEGAWAVE\" since=\"19\"/>\n\t\t<field name=\"ONSET_COMPUTER\" since=\"19\"/>\n\t\t<field name=\"OPEN_INTERFACE\"/>\n\t\t<field name=\"OTL_DYNAMICS\" since=\"19\"/>\n\t\t<field name=\"PANDA_OCEAN\" since=\"19\"/>\n\t\t<field name=\"PARROT\"/>\n\t\t<field name=\"PARTHUS_TECHNOLOGIES\"/>\n\t\t<field name=\"PASSIF_SEMICONDUCTOR\" since=\"19\"/>\n\t\t<field name=\"PETER_SYSTEMTECHNIK\" since=\"19\"/>\n\t\t<field name=\"PHILIPS_SEMICONDUCTORS\"/>\n\t\t<field name=\"PLANTRONICS\"/>\n\t\t<field name=\"POLAR_ELECTRO\" since=\"19\"/>\n\t\t<field name=\"POLAR_ELECTRO_EUROPE\" since=\"19\"/>\n\t\t<field name=\"PROCTER_AND_GAMBLE\" since=\"19\"/>\n\t\t<field name=\"QUALCOMM\"/>\n\t\t<field name=\"QUALCOMM_CONNECTED_EXPERIENCES\" since=\"19\"/>\n\t\t<field name=\"QUALCOMM_INNOVATION_CENTER\" since=\"19\"/>\n\t\t<field name=\"QUALCOMM_LABS\" since=\"19\"/>\n\t\t<field name=\"QUALCOMM_TECHNOLOGIES\" since=\"19\"/>\n\t\t<field name=\"QUINTIC\" since=\"19\"/>\n\t\t<field name=\"QUUPPA\" since=\"19\"/>\n\t\t<field name=\"RALINK_TECHNOLOGY\"/>\n\t\t<field name=\"RDA_MICROELECTRONICS\" since=\"19\"/>\n\t\t<field name=\"REALTEK_SEMICONDUCTOR\"/>\n\t\t<field name=\"RED_M\"/>\n\t\t<field name=\"RENESAS_TECHNOLOGY\"/>\n\t\t<field name=\"RESEARCH_IN_MOTION\"/>\n\t\t<field name=\"RF_MICRO_DEVICES\"/>\n\t\t<field name=\"RIVIERAWAVES\"/>\n\t\t<field name=\"ROHDE_AND_SCHWARZ\"/>\n\t\t<field name=\"RTX_TELECOM\"/>\n\t\t<field name=\"SAMSUNG_ELECTRONICS\" since=\"19\"/>\n\t\t<field name=\"SARIS_CYCLING_GROUP\" since=\"19\"/>\n\t\t<field name=\"SEERS_TECHNOLOGY\" since=\"19\"/>\n\t\t<field name=\"SEIKO_EPSON\"/>\n\t\t<field name=\"SELFLY\" since=\"19\"/>\n\t\t<field name=\"SEMILINK\" since=\"19\"/>\n\t\t<field name=\"SENNHEISER_COMMUNICATIONS\" since=\"19\"/>\n\t\t<field name=\"SHANGHAI_SUPER_SMART_ELECTRONICS\" since=\"19\"/>\n\t\t<field name=\"SHENZHEN_EXCELSECU_DATA_TECHNOLOGY\" since=\"19\"/>\n\t\t<field name=\"SIGNIA_TECHNOLOGIES\"/>\n\t\t<field name=\"SILICON_WAVE\"/>\n\t\t<field name=\"SIRF_TECHNOLOGY\"/>\n\t\t<field name=\"SOCKET_MOBILE\"/>\n\t\t<field name=\"SONY_ERICSSON\"/>\n\t\t<field name=\"SOUND_ID\" since=\"19\"/>\n\t\t<field name=\"SPORTS_TRACKING_TECHNOLOGIES\" since=\"19\"/>\n\t\t<field name=\"SR_MEDIZINELEKTRONIK\" since=\"19\"/>\n\t\t<field name=\"STACCATO_COMMUNICATIONS\"/>\n\t\t<field name=\"STALMART_TECHNOLOGY\" since=\"19\"/>\n\t\t<field name=\"STARKEY_LABORATORIES\" since=\"19\"/>\n\t\t<field name=\"STOLLMAN_E_PLUS_V\" since=\"19\"/>\n\t\t<field name=\"STONESTREET_ONE\"/>\n\t\t<field name=\"ST_MICROELECTRONICS\"/>\n\t\t<field name=\"SUMMIT_DATA_COMMUNICATIONS\" since=\"19\"/>\n\t\t<field name=\"SUUNTO\" since=\"19\"/>\n\t\t<field name=\"SWIRL_NETWORKS\" since=\"19\"/>\n\t\t<field name=\"SYMBOL_TECHNOLOGIES\"/>\n\t\t<field name=\"SYNOPSYS\"/>\n\t\t<field name=\"SYSTEMS_AND_CHIPS\"/>\n\t\t<field name=\"S_POWER_ELECTRONICS\" since=\"19\"/>\n\t\t<field name=\"TAIXINGBANG_TECHNOLOGY\" since=\"19\"/>\n\t\t<field name=\"TENOVIS\"/>\n\t\t<field name=\"TERAX\"/>\n\t\t<field name=\"TEXAS_INSTRUMENTS\"/>\n\t\t<field name=\"THINKOPTICS\" since=\"19\"/>\n\t\t<field name=\"THREECOM\"/>\n\t\t<field name=\"THREE_DIJOY\"/>\n\t\t<field name=\"THREE_DSP\"/>\n\t\t<field name=\"TIMEKEEPING_SYSTEMS\" since=\"19\"/>\n\t\t<field name=\"TIMEX_GROUP_USA\" since=\"19\"/>\n\t\t<field name=\"TOPCORN_POSITIONING_SYSTEMS\" since=\"19\"/>\n\t\t<field name=\"TOSHIBA\"/>\n\t\t<field name=\"TRANSILICA\"/>\n\t\t<field name=\"TRELAB\" since=\"19\"/>\n\t\t<field name=\"TTPCOM\"/>\n\t\t<field name=\"TXTR\" since=\"19\"/>\n\t\t<field name=\"TZERO_TECHNOLOGIES\"/>\n\t\t<field name=\"UNIVERSAL_ELECTRONICS\" since=\"19\"/>\n\t\t<field name=\"VERTU\" since=\"19\"/>\n\t\t<field name=\"VISTEON\" since=\"19\"/>\n\t\t<field name=\"VIZIO\"/>\n\t\t<field name=\"VOYETRA_TURTLE_BEACH\" since=\"19\"/>\n\t\t<field name=\"WAVEPLUS_TECHNOLOGY\"/>\n\t\t<field name=\"WICENTRIC\"/>\n\t\t<field name=\"WIDCOMM\"/>\n\t\t<field name=\"WUXI_VIMICRO\" since=\"19\"/>\n\t\t<field name=\"ZEEVO\"/>\n\t\t<field name=\"ZER01_TV\" since=\"19\"/>\n\t\t<field name=\"ZOMM\" since=\"19\"/>\n\t\t<field name=\"ZSCAN_SOFTWARE\" since=\"19\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothClass\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getDeviceClass()I\"/>\n\t\t<method name=\"getMajorDeviceClass()I\"/>\n\t\t<method name=\"hasService(I)Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothClass$Device\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"AUDIO_VIDEO_CAMCORDER\"/>\n\t\t<field name=\"AUDIO_VIDEO_CAR_AUDIO\"/>\n\t\t<field name=\"AUDIO_VIDEO_HANDSFREE\"/>\n\t\t<field name=\"AUDIO_VIDEO_HEADPHONES\"/>\n\t\t<field name=\"AUDIO_VIDEO_HIFI_AUDIO\"/>\n\t\t<field name=\"AUDIO_VIDEO_LOUDSPEAKER\"/>\n\t\t<field name=\"AUDIO_VIDEO_MICROPHONE\"/>\n\t\t<field name=\"AUDIO_VIDEO_PORTABLE_AUDIO\"/>\n\t\t<field name=\"AUDIO_VIDEO_SET_TOP_BOX\"/>\n\t\t<field name=\"AUDIO_VIDEO_UNCATEGORIZED\"/>\n\t\t<field name=\"AUDIO_VIDEO_VCR\"/>\n\t\t<field name=\"AUDIO_VIDEO_VIDEO_CAMERA\"/>\n\t\t<field name=\"AUDIO_VIDEO_VIDEO_CONFERENCING\"/>\n\t\t<field name=\"AUDIO_VIDEO_VIDEO_DISPLAY_AND_LOUDSPEAKER\"/>\n\t\t<field name=\"AUDIO_VIDEO_VIDEO_GAMING_TOY\"/>\n\t\t<field name=\"AUDIO_VIDEO_VIDEO_MONITOR\"/>\n\t\t<field name=\"AUDIO_VIDEO_WEARABLE_HEADSET\"/>\n\t\t<field name=\"COMPUTER_DESKTOP\"/>\n\t\t<field name=\"COMPUTER_HANDHELD_PC_PDA\"/>\n\t\t<field name=\"COMPUTER_LAPTOP\"/>\n\t\t<field name=\"COMPUTER_PALM_SIZE_PC_PDA\"/>\n\t\t<field name=\"COMPUTER_SERVER\"/>\n\t\t<field name=\"COMPUTER_UNCATEGORIZED\"/>\n\t\t<field name=\"COMPUTER_WEARABLE\"/>\n\t\t<field name=\"HEALTH_BLOOD_PRESSURE\"/>\n\t\t<field name=\"HEALTH_DATA_DISPLAY\"/>\n\t\t<field name=\"HEALTH_GLUCOSE\"/>\n\t\t<field name=\"HEALTH_PULSE_OXIMETER\"/>\n\t\t<field name=\"HEALTH_PULSE_RATE\"/>\n\t\t<field name=\"HEALTH_THERMOMETER\"/>\n\t\t<field name=\"HEALTH_UNCATEGORIZED\"/>\n\t\t<field name=\"HEALTH_WEIGHING\"/>\n\t\t<field name=\"PHONE_CELLULAR\"/>\n\t\t<field name=\"PHONE_CORDLESS\"/>\n\t\t<field name=\"PHONE_ISDN\"/>\n\t\t<field name=\"PHONE_MODEM_OR_GATEWAY\"/>\n\t\t<field name=\"PHONE_SMART\"/>\n\t\t<field name=\"PHONE_UNCATEGORIZED\"/>\n\t\t<field name=\"TOY_CONTROLLER\"/>\n\t\t<field name=\"TOY_DOLL_ACTION_FIGURE\"/>\n\t\t<field name=\"TOY_GAME\"/>\n\t\t<field name=\"TOY_ROBOT\"/>\n\t\t<field name=\"TOY_UNCATEGORIZED\"/>\n\t\t<field name=\"TOY_VEHICLE\"/>\n\t\t<field name=\"WEARABLE_GLASSES\"/>\n\t\t<field name=\"WEARABLE_HELMET\"/>\n\t\t<field name=\"WEARABLE_JACKET\"/>\n\t\t<field name=\"WEARABLE_PAGER\"/>\n\t\t<field name=\"WEARABLE_UNCATEGORIZED\"/>\n\t\t<field name=\"WEARABLE_WRIST_WATCH\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothClass$Device$Major\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"AUDIO_VIDEO\"/>\n\t\t<field name=\"COMPUTER\"/>\n\t\t<field name=\"HEALTH\"/>\n\t\t<field name=\"IMAGING\"/>\n\t\t<field name=\"MISC\"/>\n\t\t<field name=\"NETWORKING\"/>\n\t\t<field name=\"PERIPHERAL\"/>\n\t\t<field name=\"PHONE\"/>\n\t\t<field name=\"TOY\"/>\n\t\t<field name=\"UNCATEGORIZED\"/>\n\t\t<field name=\"WEARABLE\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothClass$Service\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"AUDIO\"/>\n\t\t<field name=\"CAPTURE\"/>\n\t\t<field name=\"INFORMATION\"/>\n\t\t<field name=\"LIMITED_DISCOVERABILITY\"/>\n\t\t<field name=\"NETWORKING\"/>\n\t\t<field name=\"OBJECT_TRANSFER\"/>\n\t\t<field name=\"POSITIONING\"/>\n\t\t<field name=\"RENDER\"/>\n\t\t<field name=\"TELEPHONY\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothDevice\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"connectGatt(Landroid/content/Context;ZLandroid/bluetooth/BluetoothGattCallback;)Landroid/bluetooth/BluetoothGatt;\" since=\"18\"/>\n\t\t<method name=\"connectGatt(Landroid/content/Context;ZLandroid/bluetooth/BluetoothGattCallback;I)Landroid/bluetooth/BluetoothGatt;\" since=\"23\"/>\n\t\t<method name=\"connectGatt(Landroid/content/Context;ZLandroid/bluetooth/BluetoothGattCallback;II)Landroid/bluetooth/BluetoothGatt;\" since=\"26\"/>\n\t\t<method name=\"connectGatt(Landroid/content/Context;ZLandroid/bluetooth/BluetoothGattCallback;IILandroid/os/Handler;)Landroid/bluetooth/BluetoothGatt;\" since=\"26\"/>\n\t\t<method name=\"createBond()Z\" since=\"19\"/>\n\t\t<method name=\"createInsecureL2capChannel(I)Landroid/bluetooth/BluetoothSocket;\" since=\"29\"/>\n\t\t<method name=\"createInsecureRfcommSocketToServiceRecord(Ljava/util/UUID;)Landroid/bluetooth/BluetoothSocket;\" since=\"10\"/>\n\t\t<method name=\"createL2capChannel(I)Landroid/bluetooth/BluetoothSocket;\" since=\"29\"/>\n\t\t<method name=\"createRfcommSocketToServiceRecord(Ljava/util/UUID;)Landroid/bluetooth/BluetoothSocket;\"/>\n\t\t<method name=\"fetchUuidsWithSdp()Z\" since=\"15\"/>\n\t\t<method name=\"getAddress()Ljava/lang/String;\"/>\n\t\t<method name=\"getAlias()Ljava/lang/String;\" since=\"30\"/>\n\t\t<method name=\"getBluetoothClass()Landroid/bluetooth/BluetoothClass;\"/>\n\t\t<method name=\"getBondState()I\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getType()I\" since=\"18\"/>\n\t\t<method name=\"getUuids()[Landroid/os/ParcelUuid;\" since=\"15\"/>\n\t\t<method name=\"setPairingConfirmation(Z)Z\" since=\"19\"/>\n\t\t<method name=\"setPin([B)Z\" since=\"19\"/>\n\t\t<field name=\"ACTION_ACL_CONNECTED\"/>\n\t\t<field name=\"ACTION_ACL_DISCONNECTED\"/>\n\t\t<field name=\"ACTION_ACL_DISCONNECT_REQUESTED\"/>\n\t\t<field name=\"ACTION_ALIAS_CHANGED\" since=\"30\"/>\n\t\t<field name=\"ACTION_BOND_STATE_CHANGED\"/>\n\t\t<field name=\"ACTION_CLASS_CHANGED\"/>\n\t\t<field name=\"ACTION_FOUND\"/>\n\t\t<field name=\"ACTION_NAME_CHANGED\"/>\n\t\t<field name=\"ACTION_PAIRING_REQUEST\" since=\"19\"/>\n\t\t<field name=\"ACTION_UUID\" since=\"15\"/>\n\t\t<field name=\"BOND_BONDED\"/>\n\t\t<field name=\"BOND_BONDING\"/>\n\t\t<field name=\"BOND_NONE\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"DEVICE_TYPE_CLASSIC\" since=\"18\"/>\n\t\t<field name=\"DEVICE_TYPE_DUAL\" since=\"18\"/>\n\t\t<field name=\"DEVICE_TYPE_LE\" since=\"18\"/>\n\t\t<field name=\"DEVICE_TYPE_UNKNOWN\" since=\"18\"/>\n\t\t<field name=\"ERROR\"/>\n\t\t<field name=\"EXTRA_BOND_STATE\"/>\n\t\t<field name=\"EXTRA_CLASS\"/>\n\t\t<field name=\"EXTRA_DEVICE\"/>\n\t\t<field name=\"EXTRA_NAME\"/>\n\t\t<field name=\"EXTRA_PAIRING_KEY\" since=\"19\"/>\n\t\t<field name=\"EXTRA_PAIRING_VARIANT\" since=\"19\"/>\n\t\t<field name=\"EXTRA_PREVIOUS_BOND_STATE\"/>\n\t\t<field name=\"EXTRA_RSSI\"/>\n\t\t<field name=\"EXTRA_UUID\" since=\"15\"/>\n\t\t<field name=\"PAIRING_VARIANT_PASSKEY_CONFIRMATION\" since=\"19\"/>\n\t\t<field name=\"PAIRING_VARIANT_PIN\" since=\"19\"/>\n\t\t<field name=\"PHY_LE_1M\" since=\"26\"/>\n\t\t<field name=\"PHY_LE_1M_MASK\" since=\"26\"/>\n\t\t<field name=\"PHY_LE_2M\" since=\"26\"/>\n\t\t<field name=\"PHY_LE_2M_MASK\" since=\"26\"/>\n\t\t<field name=\"PHY_LE_CODED\" since=\"26\"/>\n\t\t<field name=\"PHY_LE_CODED_MASK\" since=\"26\"/>\n\t\t<field name=\"PHY_OPTION_NO_PREFERRED\" since=\"26\"/>\n\t\t<field name=\"PHY_OPTION_S2\" since=\"26\"/>\n\t\t<field name=\"PHY_OPTION_S8\" since=\"26\"/>\n\t\t<field name=\"TRANSPORT_AUTO\" since=\"23\"/>\n\t\t<field name=\"TRANSPORT_BREDR\" since=\"23\"/>\n\t\t<field name=\"TRANSPORT_LE\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothGatt\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/bluetooth/BluetoothProfile\"/>\n\t\t<method name=\"abortReliableWrite()V\" since=\"19\"/>\n\t\t<method name=\"abortReliableWrite(Landroid/bluetooth/BluetoothDevice;)V\" deprecated=\"19\"/>\n\t\t<method name=\"beginReliableWrite()Z\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"connect()Z\"/>\n\t\t<method name=\"disconnect()V\"/>\n\t\t<method name=\"discoverServices()Z\"/>\n\t\t<method name=\"executeReliableWrite()Z\"/>\n\t\t<method name=\"getDevice()Landroid/bluetooth/BluetoothDevice;\"/>\n\t\t<method name=\"getService(Ljava/util/UUID;)Landroid/bluetooth/BluetoothGattService;\"/>\n\t\t<method name=\"getServices()Ljava/util/List;\"/>\n\t\t<method name=\"readCharacteristic(Landroid/bluetooth/BluetoothGattCharacteristic;)Z\"/>\n\t\t<method name=\"readDescriptor(Landroid/bluetooth/BluetoothGattDescriptor;)Z\"/>\n\t\t<method name=\"readPhy()V\" since=\"26\"/>\n\t\t<method name=\"readRemoteRssi()Z\"/>\n\t\t<method name=\"requestConnectionPriority(I)Z\" since=\"21\"/>\n\t\t<method name=\"requestMtu(I)Z\" since=\"21\"/>\n\t\t<method name=\"setCharacteristicNotification(Landroid/bluetooth/BluetoothGattCharacteristic;Z)Z\"/>\n\t\t<method name=\"setPreferredPhy(III)V\" since=\"26\"/>\n\t\t<method name=\"writeCharacteristic(Landroid/bluetooth/BluetoothGattCharacteristic;)Z\"/>\n\t\t<method name=\"writeDescriptor(Landroid/bluetooth/BluetoothGattDescriptor;)Z\"/>\n\t\t<field name=\"CONNECTION_PRIORITY_BALANCED\" since=\"21\"/>\n\t\t<field name=\"CONNECTION_PRIORITY_HIGH\" since=\"21\"/>\n\t\t<field name=\"CONNECTION_PRIORITY_LOW_POWER\" since=\"21\"/>\n\t\t<field name=\"GATT_CONNECTION_CONGESTED\" since=\"21\"/>\n\t\t<field name=\"GATT_FAILURE\"/>\n\t\t<field name=\"GATT_INSUFFICIENT_AUTHENTICATION\"/>\n\t\t<field name=\"GATT_INSUFFICIENT_ENCRYPTION\"/>\n\t\t<field name=\"GATT_INVALID_ATTRIBUTE_LENGTH\"/>\n\t\t<field name=\"GATT_INVALID_OFFSET\"/>\n\t\t<field name=\"GATT_READ_NOT_PERMITTED\"/>\n\t\t<field name=\"GATT_REQUEST_NOT_SUPPORTED\"/>\n\t\t<field name=\"GATT_SUCCESS\"/>\n\t\t<field name=\"GATT_WRITE_NOT_PERMITTED\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothGattCallback\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCharacteristicChanged(Landroid/bluetooth/BluetoothGatt;Landroid/bluetooth/BluetoothGattCharacteristic;)V\"/>\n\t\t<method name=\"onCharacteristicRead(Landroid/bluetooth/BluetoothGatt;Landroid/bluetooth/BluetoothGattCharacteristic;I)V\"/>\n\t\t<method name=\"onCharacteristicWrite(Landroid/bluetooth/BluetoothGatt;Landroid/bluetooth/BluetoothGattCharacteristic;I)V\"/>\n\t\t<method name=\"onConnectionStateChange(Landroid/bluetooth/BluetoothGatt;II)V\"/>\n\t\t<method name=\"onDescriptorRead(Landroid/bluetooth/BluetoothGatt;Landroid/bluetooth/BluetoothGattDescriptor;I)V\"/>\n\t\t<method name=\"onDescriptorWrite(Landroid/bluetooth/BluetoothGatt;Landroid/bluetooth/BluetoothGattDescriptor;I)V\"/>\n\t\t<method name=\"onMtuChanged(Landroid/bluetooth/BluetoothGatt;II)V\" since=\"21\"/>\n\t\t<method name=\"onPhyRead(Landroid/bluetooth/BluetoothGatt;III)V\" since=\"26\"/>\n\t\t<method name=\"onPhyUpdate(Landroid/bluetooth/BluetoothGatt;III)V\" since=\"26\"/>\n\t\t<method name=\"onReadRemoteRssi(Landroid/bluetooth/BluetoothGatt;II)V\"/>\n\t\t<method name=\"onReliableWriteCompleted(Landroid/bluetooth/BluetoothGatt;I)V\"/>\n\t\t<method name=\"onServicesDiscovered(Landroid/bluetooth/BluetoothGatt;I)V\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothGattCharacteristic\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/UUID;II)V\"/>\n\t\t<method name=\"addDescriptor(Landroid/bluetooth/BluetoothGattDescriptor;)Z\"/>\n\t\t<method name=\"getDescriptor(Ljava/util/UUID;)Landroid/bluetooth/BluetoothGattDescriptor;\"/>\n\t\t<method name=\"getDescriptors()Ljava/util/List;\"/>\n\t\t<method name=\"getFloatValue(II)Ljava/lang/Float;\"/>\n\t\t<method name=\"getInstanceId()I\"/>\n\t\t<method name=\"getIntValue(II)Ljava/lang/Integer;\"/>\n\t\t<method name=\"getPermissions()I\"/>\n\t\t<method name=\"getProperties()I\"/>\n\t\t<method name=\"getService()Landroid/bluetooth/BluetoothGattService;\"/>\n\t\t<method name=\"getStringValue(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getUuid()Ljava/util/UUID;\"/>\n\t\t<method name=\"getValue()[B\"/>\n\t\t<method name=\"getWriteType()I\"/>\n\t\t<method name=\"setValue(III)Z\"/>\n\t\t<method name=\"setValue(IIII)Z\"/>\n\t\t<method name=\"setValue(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"setValue([B)Z\"/>\n\t\t<method name=\"setWriteType(I)V\"/>\n\t\t<field name=\"CREATOR\" since=\"24\"/>\n\t\t<field name=\"FORMAT_FLOAT\"/>\n\t\t<field name=\"FORMAT_SFLOAT\"/>\n\t\t<field name=\"FORMAT_SINT16\"/>\n\t\t<field name=\"FORMAT_SINT32\"/>\n\t\t<field name=\"FORMAT_SINT8\"/>\n\t\t<field name=\"FORMAT_UINT16\"/>\n\t\t<field name=\"FORMAT_UINT32\"/>\n\t\t<field name=\"FORMAT_UINT8\"/>\n\t\t<field name=\"PERMISSION_READ\"/>\n\t\t<field name=\"PERMISSION_READ_ENCRYPTED\"/>\n\t\t<field name=\"PERMISSION_READ_ENCRYPTED_MITM\"/>\n\t\t<field name=\"PERMISSION_WRITE\"/>\n\t\t<field name=\"PERMISSION_WRITE_ENCRYPTED\"/>\n\t\t<field name=\"PERMISSION_WRITE_ENCRYPTED_MITM\"/>\n\t\t<field name=\"PERMISSION_WRITE_SIGNED\"/>\n\t\t<field name=\"PERMISSION_WRITE_SIGNED_MITM\"/>\n\t\t<field name=\"PROPERTY_BROADCAST\"/>\n\t\t<field name=\"PROPERTY_EXTENDED_PROPS\"/>\n\t\t<field name=\"PROPERTY_INDICATE\"/>\n\t\t<field name=\"PROPERTY_NOTIFY\"/>\n\t\t<field name=\"PROPERTY_READ\"/>\n\t\t<field name=\"PROPERTY_SIGNED_WRITE\"/>\n\t\t<field name=\"PROPERTY_WRITE\"/>\n\t\t<field name=\"PROPERTY_WRITE_NO_RESPONSE\"/>\n\t\t<field name=\"WRITE_TYPE_DEFAULT\"/>\n\t\t<field name=\"WRITE_TYPE_NO_RESPONSE\"/>\n\t\t<field name=\"WRITE_TYPE_SIGNED\"/>\n\t\t<field name=\"mDescriptors\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothGattDescriptor\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/UUID;I)V\"/>\n\t\t<method name=\"getCharacteristic()Landroid/bluetooth/BluetoothGattCharacteristic;\"/>\n\t\t<method name=\"getPermissions()I\"/>\n\t\t<method name=\"getUuid()Ljava/util/UUID;\"/>\n\t\t<method name=\"getValue()[B\"/>\n\t\t<method name=\"setValue([B)Z\"/>\n\t\t<field name=\"CREATOR\" since=\"24\"/>\n\t\t<field name=\"DISABLE_NOTIFICATION_VALUE\"/>\n\t\t<field name=\"ENABLE_INDICATION_VALUE\"/>\n\t\t<field name=\"ENABLE_NOTIFICATION_VALUE\"/>\n\t\t<field name=\"PERMISSION_READ\"/>\n\t\t<field name=\"PERMISSION_READ_ENCRYPTED\"/>\n\t\t<field name=\"PERMISSION_READ_ENCRYPTED_MITM\"/>\n\t\t<field name=\"PERMISSION_WRITE\"/>\n\t\t<field name=\"PERMISSION_WRITE_ENCRYPTED\"/>\n\t\t<field name=\"PERMISSION_WRITE_ENCRYPTED_MITM\"/>\n\t\t<field name=\"PERMISSION_WRITE_SIGNED\"/>\n\t\t<field name=\"PERMISSION_WRITE_SIGNED_MITM\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothGattServer\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/bluetooth/BluetoothProfile\"/>\n\t\t<method name=\"addService(Landroid/bluetooth/BluetoothGattService;)Z\"/>\n\t\t<method name=\"cancelConnection(Landroid/bluetooth/BluetoothDevice;)V\"/>\n\t\t<method name=\"clearServices()V\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"connect(Landroid/bluetooth/BluetoothDevice;Z)Z\"/>\n\t\t<method name=\"getService(Ljava/util/UUID;)Landroid/bluetooth/BluetoothGattService;\"/>\n\t\t<method name=\"getServices()Ljava/util/List;\"/>\n\t\t<method name=\"notifyCharacteristicChanged(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothGattCharacteristic;Z)Z\"/>\n\t\t<method name=\"readPhy(Landroid/bluetooth/BluetoothDevice;)V\" since=\"26\"/>\n\t\t<method name=\"removeService(Landroid/bluetooth/BluetoothGattService;)Z\"/>\n\t\t<method name=\"sendResponse(Landroid/bluetooth/BluetoothDevice;III[B)Z\"/>\n\t\t<method name=\"setPreferredPhy(Landroid/bluetooth/BluetoothDevice;III)V\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothGattServerCallback\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCharacteristicReadRequest(Landroid/bluetooth/BluetoothDevice;IILandroid/bluetooth/BluetoothGattCharacteristic;)V\"/>\n\t\t<method name=\"onCharacteristicWriteRequest(Landroid/bluetooth/BluetoothDevice;ILandroid/bluetooth/BluetoothGattCharacteristic;ZZI[B)V\"/>\n\t\t<method name=\"onConnectionStateChange(Landroid/bluetooth/BluetoothDevice;II)V\"/>\n\t\t<method name=\"onDescriptorReadRequest(Landroid/bluetooth/BluetoothDevice;IILandroid/bluetooth/BluetoothGattDescriptor;)V\"/>\n\t\t<method name=\"onDescriptorWriteRequest(Landroid/bluetooth/BluetoothDevice;ILandroid/bluetooth/BluetoothGattDescriptor;ZZI[B)V\"/>\n\t\t<method name=\"onExecuteWrite(Landroid/bluetooth/BluetoothDevice;IZ)V\"/>\n\t\t<method name=\"onMtuChanged(Landroid/bluetooth/BluetoothDevice;I)V\" since=\"22\"/>\n\t\t<method name=\"onNotificationSent(Landroid/bluetooth/BluetoothDevice;I)V\" since=\"21\"/>\n\t\t<method name=\"onPhyRead(Landroid/bluetooth/BluetoothDevice;III)V\" since=\"26\"/>\n\t\t<method name=\"onPhyUpdate(Landroid/bluetooth/BluetoothDevice;III)V\" since=\"26\"/>\n\t\t<method name=\"onServiceAdded(ILandroid/bluetooth/BluetoothGattService;)V\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothGattService\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/UUID;I)V\"/>\n\t\t<method name=\"addCharacteristic(Landroid/bluetooth/BluetoothGattCharacteristic;)Z\"/>\n\t\t<method name=\"addService(Landroid/bluetooth/BluetoothGattService;)Z\"/>\n\t\t<method name=\"getCharacteristic(Ljava/util/UUID;)Landroid/bluetooth/BluetoothGattCharacteristic;\"/>\n\t\t<method name=\"getCharacteristics()Ljava/util/List;\"/>\n\t\t<method name=\"getIncludedServices()Ljava/util/List;\"/>\n\t\t<method name=\"getInstanceId()I\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<method name=\"getUuid()Ljava/util/UUID;\"/>\n\t\t<field name=\"CREATOR\" since=\"24\"/>\n\t\t<field name=\"SERVICE_TYPE_PRIMARY\"/>\n\t\t<field name=\"SERVICE_TYPE_SECONDARY\"/>\n\t\t<field name=\"mCharacteristics\"/>\n\t\t<field name=\"mIncludedServices\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothHeadset\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/bluetooth/BluetoothProfile\"/>\n\t\t<method name=\"isAudioConnected(Landroid/bluetooth/BluetoothDevice;)Z\"/>\n\t\t<method name=\"sendVendorSpecificResultCode(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;Ljava/lang/String;)Z\" since=\"19\"/>\n\t\t<method name=\"startVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z\"/>\n\t\t<method name=\"stopVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z\"/>\n\t\t<field name=\"ACTION_AUDIO_STATE_CHANGED\"/>\n\t\t<field name=\"ACTION_CONNECTION_STATE_CHANGED\"/>\n\t\t<field name=\"ACTION_VENDOR_SPECIFIC_HEADSET_EVENT\"/>\n\t\t<field name=\"AT_CMD_TYPE_ACTION\"/>\n\t\t<field name=\"AT_CMD_TYPE_BASIC\"/>\n\t\t<field name=\"AT_CMD_TYPE_READ\"/>\n\t\t<field name=\"AT_CMD_TYPE_SET\"/>\n\t\t<field name=\"AT_CMD_TYPE_TEST\"/>\n\t\t<field name=\"EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_ARGS\"/>\n\t\t<field name=\"EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD\"/>\n\t\t<field name=\"EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD_TYPE\"/>\n\t\t<field name=\"STATE_AUDIO_CONNECTED\"/>\n\t\t<field name=\"STATE_AUDIO_CONNECTING\"/>\n\t\t<field name=\"STATE_AUDIO_DISCONNECTED\"/>\n\t\t<field name=\"VENDOR_RESULT_CODE_COMMAND_ANDROID\" since=\"19\"/>\n\t\t<field name=\"VENDOR_SPECIFIC_HEADSET_EVENT_COMPANY_ID_CATEGORY\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothHealth\" since=\"14\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/bluetooth/BluetoothProfile\"/>\n\t\t<method name=\"connectChannelToSource(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"disconnectChannel(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;I)Z\" deprecated=\"29\"/>\n\t\t<method name=\"getMainChannelFd(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;)Landroid/os/ParcelFileDescriptor;\" deprecated=\"29\"/>\n\t\t<method name=\"registerSinkAppConfiguration(Ljava/lang/String;ILandroid/bluetooth/BluetoothHealthCallback;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"unregisterAppConfiguration(Landroid/bluetooth/BluetoothHealthAppConfiguration;)Z\" deprecated=\"29\"/>\n\t\t<field name=\"APP_CONFIG_REGISTRATION_FAILURE\" deprecated=\"29\"/>\n\t\t<field name=\"APP_CONFIG_REGISTRATION_SUCCESS\" deprecated=\"29\"/>\n\t\t<field name=\"APP_CONFIG_UNREGISTRATION_FAILURE\" deprecated=\"29\"/>\n\t\t<field name=\"APP_CONFIG_UNREGISTRATION_SUCCESS\" deprecated=\"29\"/>\n\t\t<field name=\"CHANNEL_TYPE_RELIABLE\" deprecated=\"29\"/>\n\t\t<field name=\"CHANNEL_TYPE_STREAMING\" deprecated=\"29\"/>\n\t\t<field name=\"SINK_ROLE\" deprecated=\"29\"/>\n\t\t<field name=\"SOURCE_ROLE\" deprecated=\"29\"/>\n\t\t<field name=\"STATE_CHANNEL_CONNECTED\" deprecated=\"29\"/>\n\t\t<field name=\"STATE_CHANNEL_CONNECTING\" deprecated=\"29\"/>\n\t\t<field name=\"STATE_CHANNEL_DISCONNECTED\" deprecated=\"29\"/>\n\t\t<field name=\"STATE_CHANNEL_DISCONNECTING\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothHealthAppConfiguration\" since=\"14\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getDataType()I\" deprecated=\"29\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getRole()I\" deprecated=\"29\"/>\n\t\t<field name=\"CREATOR\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothHealthCallback\" since=\"14\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"onHealthAppConfigurationStatusChange(Landroid/bluetooth/BluetoothHealthAppConfiguration;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"onHealthChannelStateChange(Landroid/bluetooth/BluetoothHealthAppConfiguration;Landroid/bluetooth/BluetoothDevice;IILandroid/os/ParcelFileDescriptor;I)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothHearingAid\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/bluetooth/BluetoothProfile\"/>\n\t\t<field name=\"ACTION_CONNECTION_STATE_CHANGED\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothHidDevice\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/bluetooth/BluetoothProfile\"/>\n\t\t<method name=\"connect(Landroid/bluetooth/BluetoothDevice;)Z\"/>\n\t\t<method name=\"disconnect(Landroid/bluetooth/BluetoothDevice;)Z\"/>\n\t\t<method name=\"registerApp(Landroid/bluetooth/BluetoothHidDeviceAppSdpSettings;Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;Ljava/util/concurrent/Executor;Landroid/bluetooth/BluetoothHidDevice$Callback;)Z\"/>\n\t\t<method name=\"replyReport(Landroid/bluetooth/BluetoothDevice;BB[B)Z\"/>\n\t\t<method name=\"reportError(Landroid/bluetooth/BluetoothDevice;B)Z\"/>\n\t\t<method name=\"sendReport(Landroid/bluetooth/BluetoothDevice;I[B)Z\"/>\n\t\t<method name=\"unregisterApp()Z\"/>\n\t\t<field name=\"ACTION_CONNECTION_STATE_CHANGED\"/>\n\t\t<field name=\"ERROR_RSP_INVALID_PARAM\"/>\n\t\t<field name=\"ERROR_RSP_INVALID_RPT_ID\"/>\n\t\t<field name=\"ERROR_RSP_NOT_READY\"/>\n\t\t<field name=\"ERROR_RSP_SUCCESS\"/>\n\t\t<field name=\"ERROR_RSP_UNKNOWN\"/>\n\t\t<field name=\"ERROR_RSP_UNSUPPORTED_REQ\"/>\n\t\t<field name=\"PROTOCOL_BOOT_MODE\"/>\n\t\t<field name=\"PROTOCOL_REPORT_MODE\"/>\n\t\t<field name=\"REPORT_TYPE_FEATURE\"/>\n\t\t<field name=\"REPORT_TYPE_INPUT\"/>\n\t\t<field name=\"REPORT_TYPE_OUTPUT\"/>\n\t\t<field name=\"SUBCLASS1_COMBO\"/>\n\t\t<field name=\"SUBCLASS1_KEYBOARD\"/>\n\t\t<field name=\"SUBCLASS1_MOUSE\"/>\n\t\t<field name=\"SUBCLASS1_NONE\"/>\n\t\t<field name=\"SUBCLASS2_CARD_READER\"/>\n\t\t<field name=\"SUBCLASS2_DIGITIZER_TABLET\"/>\n\t\t<field name=\"SUBCLASS2_GAMEPAD\"/>\n\t\t<field name=\"SUBCLASS2_JOYSTICK\"/>\n\t\t<field name=\"SUBCLASS2_REMOTE_CONTROL\"/>\n\t\t<field name=\"SUBCLASS2_SENSING_DEVICE\"/>\n\t\t<field name=\"SUBCLASS2_UNCATEGORIZED\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothHidDevice$Callback\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onAppStatusChanged(Landroid/bluetooth/BluetoothDevice;Z)V\"/>\n\t\t<method name=\"onConnectionStateChanged(Landroid/bluetooth/BluetoothDevice;I)V\"/>\n\t\t<method name=\"onGetReport(Landroid/bluetooth/BluetoothDevice;BBI)V\"/>\n\t\t<method name=\"onInterruptData(Landroid/bluetooth/BluetoothDevice;B[B)V\"/>\n\t\t<method name=\"onSetProtocol(Landroid/bluetooth/BluetoothDevice;B)V\"/>\n\t\t<method name=\"onSetReport(Landroid/bluetooth/BluetoothDevice;BB[B)V\"/>\n\t\t<method name=\"onVirtualCableUnplug(Landroid/bluetooth/BluetoothDevice;)V\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothHidDeviceAppQosSettings\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(IIIIII)V\"/>\n\t\t<method name=\"getDelayVariation()I\"/>\n\t\t<method name=\"getLatency()I\"/>\n\t\t<method name=\"getPeakBandwidth()I\"/>\n\t\t<method name=\"getServiceType()I\"/>\n\t\t<method name=\"getTokenBucketSize()I\"/>\n\t\t<method name=\"getTokenRate()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"MAX\"/>\n\t\t<field name=\"SERVICE_BEST_EFFORT\"/>\n\t\t<field name=\"SERVICE_GUARANTEED\"/>\n\t\t<field name=\"SERVICE_NO_TRAFFIC\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothHidDeviceAppSdpSettings\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;B[B)V\"/>\n\t\t<method name=\"getDescription()Ljava/lang/String;\"/>\n\t\t<method name=\"getDescriptors()[B\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getProvider()Ljava/lang/String;\"/>\n\t\t<method name=\"getSubclass()B\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothManager\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAdapter()Landroid/bluetooth/BluetoothAdapter;\"/>\n\t\t<method name=\"getConnectedDevices(I)Ljava/util/List;\"/>\n\t\t<method name=\"getConnectionState(Landroid/bluetooth/BluetoothDevice;I)I\"/>\n\t\t<method name=\"getDevicesMatchingConnectionStates(I[I)Ljava/util/List;\"/>\n\t\t<method name=\"openGattServer(Landroid/content/Context;Landroid/bluetooth/BluetoothGattServerCallback;)Landroid/bluetooth/BluetoothGattServer;\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothProfile\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getConnectedDevices()Ljava/util/List;\"/>\n\t\t<method name=\"getConnectionState(Landroid/bluetooth/BluetoothDevice;)I\"/>\n\t\t<method name=\"getDevicesMatchingConnectionStates([I)Ljava/util/List;\"/>\n\t\t<field name=\"A2DP\"/>\n\t\t<field name=\"EXTRA_PREVIOUS_STATE\"/>\n\t\t<field name=\"EXTRA_STATE\"/>\n\t\t<field name=\"GATT\" since=\"18\"/>\n\t\t<field name=\"GATT_SERVER\" since=\"18\"/>\n\t\t<field name=\"HEADSET\"/>\n\t\t<field name=\"HEALTH\" since=\"14\" deprecated=\"29\"/>\n\t\t<field name=\"HEARING_AID\" since=\"29\"/>\n\t\t<field name=\"HID_DEVICE\" since=\"28\"/>\n\t\t<field name=\"SAP\" since=\"23\"/>\n\t\t<field name=\"STATE_CONNECTED\"/>\n\t\t<field name=\"STATE_CONNECTING\"/>\n\t\t<field name=\"STATE_DISCONNECTED\"/>\n\t\t<field name=\"STATE_DISCONNECTING\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothProfile$ServiceListener\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onServiceConnected(ILandroid/bluetooth/BluetoothProfile;)V\"/>\n\t\t<method name=\"onServiceDisconnected(I)V\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothServerSocket\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<method name=\"accept()Landroid/bluetooth/BluetoothSocket;\"/>\n\t\t<method name=\"accept(I)Landroid/bluetooth/BluetoothSocket;\"/>\n\t\t<method name=\"getPsm()I\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/bluetooth/BluetoothSocket\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<method name=\"connect()V\"/>\n\t\t<method name=\"getConnectionType()I\" since=\"23\"/>\n\t\t<method name=\"getInputStream()Ljava/io/InputStream;\"/>\n\t\t<method name=\"getMaxReceivePacketSize()I\" since=\"23\"/>\n\t\t<method name=\"getMaxTransmitPacketSize()I\" since=\"23\"/>\n\t\t<method name=\"getOutputStream()Ljava/io/OutputStream;\"/>\n\t\t<method name=\"getRemoteDevice()Landroid/bluetooth/BluetoothDevice;\"/>\n\t\t<method name=\"isConnected()Z\" since=\"14\"/>\n\t\t<field name=\"TYPE_L2CAP\" since=\"23\"/>\n\t\t<field name=\"TYPE_RFCOMM\" since=\"23\"/>\n\t\t<field name=\"TYPE_SCO\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/bluetooth/le/AdvertiseCallback\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onStartFailure(I)V\"/>\n\t\t<method name=\"onStartSuccess(Landroid/bluetooth/le/AdvertiseSettings;)V\"/>\n\t\t<field name=\"ADVERTISE_FAILED_ALREADY_STARTED\"/>\n\t\t<field name=\"ADVERTISE_FAILED_DATA_TOO_LARGE\"/>\n\t\t<field name=\"ADVERTISE_FAILED_FEATURE_UNSUPPORTED\"/>\n\t\t<field name=\"ADVERTISE_FAILED_INTERNAL_ERROR\"/>\n\t\t<field name=\"ADVERTISE_FAILED_TOO_MANY_ADVERTISERS\"/>\n\t</class>\n\t<class name=\"android/bluetooth/le/AdvertiseData\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getIncludeDeviceName()Z\"/>\n\t\t<method name=\"getIncludeTxPowerLevel()Z\"/>\n\t\t<method name=\"getManufacturerSpecificData()Landroid/util/SparseArray;\"/>\n\t\t<method name=\"getServiceData()Ljava/util/Map;\"/>\n\t\t<method name=\"getServiceUuids()Ljava/util/List;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/bluetooth/le/AdvertiseData$Builder\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addManufacturerData(I[B)Landroid/bluetooth/le/AdvertiseData$Builder;\"/>\n\t\t<method name=\"addServiceData(Landroid/os/ParcelUuid;[B)Landroid/bluetooth/le/AdvertiseData$Builder;\"/>\n\t\t<method name=\"addServiceUuid(Landroid/os/ParcelUuid;)Landroid/bluetooth/le/AdvertiseData$Builder;\"/>\n\t\t<method name=\"build()Landroid/bluetooth/le/AdvertiseData;\"/>\n\t\t<method name=\"setIncludeDeviceName(Z)Landroid/bluetooth/le/AdvertiseData$Builder;\"/>\n\t\t<method name=\"setIncludeTxPowerLevel(Z)Landroid/bluetooth/le/AdvertiseData$Builder;\"/>\n\t</class>\n\t<class name=\"android/bluetooth/le/AdvertiseSettings\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getMode()I\"/>\n\t\t<method name=\"getTimeout()I\"/>\n\t\t<method name=\"getTxPowerLevel()I\"/>\n\t\t<method name=\"isConnectable()Z\"/>\n\t\t<field name=\"ADVERTISE_MODE_BALANCED\"/>\n\t\t<field name=\"ADVERTISE_MODE_LOW_LATENCY\"/>\n\t\t<field name=\"ADVERTISE_MODE_LOW_POWER\"/>\n\t\t<field name=\"ADVERTISE_TX_POWER_HIGH\"/>\n\t\t<field name=\"ADVERTISE_TX_POWER_LOW\"/>\n\t\t<field name=\"ADVERTISE_TX_POWER_MEDIUM\"/>\n\t\t<field name=\"ADVERTISE_TX_POWER_ULTRA_LOW\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/bluetooth/le/AdvertiseSettings$Builder\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/bluetooth/le/AdvertiseSettings;\"/>\n\t\t<method name=\"setAdvertiseMode(I)Landroid/bluetooth/le/AdvertiseSettings$Builder;\"/>\n\t\t<method name=\"setConnectable(Z)Landroid/bluetooth/le/AdvertiseSettings$Builder;\"/>\n\t\t<method name=\"setTimeout(I)Landroid/bluetooth/le/AdvertiseSettings$Builder;\"/>\n\t\t<method name=\"setTxPowerLevel(I)Landroid/bluetooth/le/AdvertiseSettings$Builder;\"/>\n\t</class>\n\t<class name=\"android/bluetooth/le/AdvertisingSet\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"enableAdvertising(ZII)V\"/>\n\t\t<method name=\"setAdvertisingData(Landroid/bluetooth/le/AdvertiseData;)V\"/>\n\t\t<method name=\"setAdvertisingParameters(Landroid/bluetooth/le/AdvertisingSetParameters;)V\"/>\n\t\t<method name=\"setPeriodicAdvertisingData(Landroid/bluetooth/le/AdvertiseData;)V\"/>\n\t\t<method name=\"setPeriodicAdvertisingEnabled(Z)V\"/>\n\t\t<method name=\"setPeriodicAdvertisingParameters(Landroid/bluetooth/le/PeriodicAdvertisingParameters;)V\"/>\n\t\t<method name=\"setScanResponseData(Landroid/bluetooth/le/AdvertiseData;)V\"/>\n\t</class>\n\t<class name=\"android/bluetooth/le/AdvertisingSetCallback\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onAdvertisingDataSet(Landroid/bluetooth/le/AdvertisingSet;I)V\"/>\n\t\t<method name=\"onAdvertisingEnabled(Landroid/bluetooth/le/AdvertisingSet;ZI)V\"/>\n\t\t<method name=\"onAdvertisingParametersUpdated(Landroid/bluetooth/le/AdvertisingSet;II)V\"/>\n\t\t<method name=\"onAdvertisingSetStarted(Landroid/bluetooth/le/AdvertisingSet;II)V\"/>\n\t\t<method name=\"onAdvertisingSetStopped(Landroid/bluetooth/le/AdvertisingSet;)V\"/>\n\t\t<method name=\"onPeriodicAdvertisingDataSet(Landroid/bluetooth/le/AdvertisingSet;I)V\"/>\n\t\t<method name=\"onPeriodicAdvertisingEnabled(Landroid/bluetooth/le/AdvertisingSet;ZI)V\"/>\n\t\t<method name=\"onPeriodicAdvertisingParametersUpdated(Landroid/bluetooth/le/AdvertisingSet;I)V\"/>\n\t\t<method name=\"onScanResponseDataSet(Landroid/bluetooth/le/AdvertisingSet;I)V\"/>\n\t\t<field name=\"ADVERTISE_FAILED_ALREADY_STARTED\"/>\n\t\t<field name=\"ADVERTISE_FAILED_DATA_TOO_LARGE\"/>\n\t\t<field name=\"ADVERTISE_FAILED_FEATURE_UNSUPPORTED\"/>\n\t\t<field name=\"ADVERTISE_FAILED_INTERNAL_ERROR\"/>\n\t\t<field name=\"ADVERTISE_FAILED_TOO_MANY_ADVERTISERS\"/>\n\t\t<field name=\"ADVERTISE_SUCCESS\"/>\n\t</class>\n\t<class name=\"android/bluetooth/le/AdvertisingSetParameters\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getInterval()I\"/>\n\t\t<method name=\"getPrimaryPhy()I\"/>\n\t\t<method name=\"getSecondaryPhy()I\"/>\n\t\t<method name=\"getTxPowerLevel()I\"/>\n\t\t<method name=\"includeTxPower()Z\"/>\n\t\t<method name=\"isAnonymous()Z\"/>\n\t\t<method name=\"isConnectable()Z\"/>\n\t\t<method name=\"isLegacy()Z\"/>\n\t\t<method name=\"isScannable()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"INTERVAL_HIGH\"/>\n\t\t<field name=\"INTERVAL_LOW\"/>\n\t\t<field name=\"INTERVAL_MAX\"/>\n\t\t<field name=\"INTERVAL_MEDIUM\"/>\n\t\t<field name=\"INTERVAL_MIN\"/>\n\t\t<field name=\"TX_POWER_HIGH\"/>\n\t\t<field name=\"TX_POWER_LOW\"/>\n\t\t<field name=\"TX_POWER_MAX\"/>\n\t\t<field name=\"TX_POWER_MEDIUM\"/>\n\t\t<field name=\"TX_POWER_MIN\"/>\n\t\t<field name=\"TX_POWER_ULTRA_LOW\"/>\n\t</class>\n\t<class name=\"android/bluetooth/le/AdvertisingSetParameters$Builder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/bluetooth/le/AdvertisingSetParameters;\"/>\n\t\t<method name=\"setAnonymous(Z)Landroid/bluetooth/le/AdvertisingSetParameters$Builder;\"/>\n\t\t<method name=\"setConnectable(Z)Landroid/bluetooth/le/AdvertisingSetParameters$Builder;\"/>\n\t\t<method name=\"setIncludeTxPower(Z)Landroid/bluetooth/le/AdvertisingSetParameters$Builder;\"/>\n\t\t<method name=\"setInterval(I)Landroid/bluetooth/le/AdvertisingSetParameters$Builder;\"/>\n\t\t<method name=\"setLegacyMode(Z)Landroid/bluetooth/le/AdvertisingSetParameters$Builder;\"/>\n\t\t<method name=\"setPrimaryPhy(I)Landroid/bluetooth/le/AdvertisingSetParameters$Builder;\"/>\n\t\t<method name=\"setScannable(Z)Landroid/bluetooth/le/AdvertisingSetParameters$Builder;\"/>\n\t\t<method name=\"setSecondaryPhy(I)Landroid/bluetooth/le/AdvertisingSetParameters$Builder;\"/>\n\t\t<method name=\"setTxPowerLevel(I)Landroid/bluetooth/le/AdvertisingSetParameters$Builder;\"/>\n\t</class>\n\t<class name=\"android/bluetooth/le/BluetoothLeAdvertiser\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"startAdvertising(Landroid/bluetooth/le/AdvertiseSettings;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseCallback;)V\"/>\n\t\t<method name=\"startAdvertising(Landroid/bluetooth/le/AdvertiseSettings;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseCallback;)V\"/>\n\t\t<method name=\"startAdvertisingSet(Landroid/bluetooth/le/AdvertisingSetParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/PeriodicAdvertisingParameters;Landroid/bluetooth/le/AdvertiseData;IILandroid/bluetooth/le/AdvertisingSetCallback;)V\" since=\"26\"/>\n\t\t<method name=\"startAdvertisingSet(Landroid/bluetooth/le/AdvertisingSetParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/PeriodicAdvertisingParameters;Landroid/bluetooth/le/AdvertiseData;IILandroid/bluetooth/le/AdvertisingSetCallback;Landroid/os/Handler;)V\" since=\"26\"/>\n\t\t<method name=\"startAdvertisingSet(Landroid/bluetooth/le/AdvertisingSetParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/PeriodicAdvertisingParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertisingSetCallback;)V\" since=\"26\"/>\n\t\t<method name=\"startAdvertisingSet(Landroid/bluetooth/le/AdvertisingSetParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/PeriodicAdvertisingParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertisingSetCallback;Landroid/os/Handler;)V\" since=\"26\"/>\n\t\t<method name=\"stopAdvertising(Landroid/bluetooth/le/AdvertiseCallback;)V\"/>\n\t\t<method name=\"stopAdvertisingSet(Landroid/bluetooth/le/AdvertisingSetCallback;)V\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/bluetooth/le/BluetoothLeScanner\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"flushPendingScanResults(Landroid/bluetooth/le/ScanCallback;)V\"/>\n\t\t<method name=\"startScan(Landroid/bluetooth/le/ScanCallback;)V\"/>\n\t\t<method name=\"startScan(Ljava/util/List;Landroid/bluetooth/le/ScanSettings;Landroid/app/PendingIntent;)I\" since=\"26\"/>\n\t\t<method name=\"startScan(Ljava/util/List;Landroid/bluetooth/le/ScanSettings;Landroid/bluetooth/le/ScanCallback;)V\"/>\n\t\t<method name=\"stopScan(Landroid/app/PendingIntent;)V\" since=\"26\"/>\n\t\t<method name=\"stopScan(Landroid/bluetooth/le/ScanCallback;)V\"/>\n\t\t<field name=\"EXTRA_CALLBACK_TYPE\" since=\"26\"/>\n\t\t<field name=\"EXTRA_ERROR_CODE\" since=\"26\"/>\n\t\t<field name=\"EXTRA_LIST_SCAN_RESULT\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/bluetooth/le/PeriodicAdvertisingParameters\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getIncludeTxPower()Z\"/>\n\t\t<method name=\"getInterval()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/bluetooth/le/PeriodicAdvertisingParameters$Builder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/bluetooth/le/PeriodicAdvertisingParameters;\"/>\n\t\t<method name=\"setIncludeTxPower(Z)Landroid/bluetooth/le/PeriodicAdvertisingParameters$Builder;\"/>\n\t\t<method name=\"setInterval(I)Landroid/bluetooth/le/PeriodicAdvertisingParameters$Builder;\"/>\n\t</class>\n\t<class name=\"android/bluetooth/le/ScanCallback\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onBatchScanResults(Ljava/util/List;)V\"/>\n\t\t<method name=\"onScanFailed(I)V\"/>\n\t\t<method name=\"onScanResult(ILandroid/bluetooth/le/ScanResult;)V\"/>\n\t\t<field name=\"SCAN_FAILED_ALREADY_STARTED\"/>\n\t\t<field name=\"SCAN_FAILED_APPLICATION_REGISTRATION_FAILED\"/>\n\t\t<field name=\"SCAN_FAILED_FEATURE_UNSUPPORTED\"/>\n\t\t<field name=\"SCAN_FAILED_INTERNAL_ERROR\"/>\n\t</class>\n\t<class name=\"android/bluetooth/le/ScanFilter\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getDeviceAddress()Ljava/lang/String;\"/>\n\t\t<method name=\"getDeviceName()Ljava/lang/String;\"/>\n\t\t<method name=\"getManufacturerData()[B\"/>\n\t\t<method name=\"getManufacturerDataMask()[B\"/>\n\t\t<method name=\"getManufacturerId()I\"/>\n\t\t<method name=\"getServiceData()[B\"/>\n\t\t<method name=\"getServiceDataMask()[B\"/>\n\t\t<method name=\"getServiceDataUuid()Landroid/os/ParcelUuid;\"/>\n\t\t<method name=\"getServiceSolicitationUuid()Landroid/os/ParcelUuid;\" since=\"29\"/>\n\t\t<method name=\"getServiceSolicitationUuidMask()Landroid/os/ParcelUuid;\" since=\"29\"/>\n\t\t<method name=\"getServiceUuid()Landroid/os/ParcelUuid;\"/>\n\t\t<method name=\"getServiceUuidMask()Landroid/os/ParcelUuid;\"/>\n\t\t<method name=\"matches(Landroid/bluetooth/le/ScanResult;)Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/bluetooth/le/ScanFilter$Builder\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/bluetooth/le/ScanFilter;\"/>\n\t\t<method name=\"setDeviceAddress(Ljava/lang/String;)Landroid/bluetooth/le/ScanFilter$Builder;\"/>\n\t\t<method name=\"setDeviceName(Ljava/lang/String;)Landroid/bluetooth/le/ScanFilter$Builder;\"/>\n\t\t<method name=\"setManufacturerData(I[B)Landroid/bluetooth/le/ScanFilter$Builder;\"/>\n\t\t<method name=\"setManufacturerData(I[B[B)Landroid/bluetooth/le/ScanFilter$Builder;\"/>\n\t\t<method name=\"setServiceData(Landroid/os/ParcelUuid;[B)Landroid/bluetooth/le/ScanFilter$Builder;\"/>\n\t\t<method name=\"setServiceData(Landroid/os/ParcelUuid;[B[B)Landroid/bluetooth/le/ScanFilter$Builder;\"/>\n\t\t<method name=\"setServiceSolicitationUuid(Landroid/os/ParcelUuid;)Landroid/bluetooth/le/ScanFilter$Builder;\" since=\"29\"/>\n\t\t<method name=\"setServiceSolicitationUuid(Landroid/os/ParcelUuid;Landroid/os/ParcelUuid;)Landroid/bluetooth/le/ScanFilter$Builder;\" since=\"29\"/>\n\t\t<method name=\"setServiceUuid(Landroid/os/ParcelUuid;)Landroid/bluetooth/le/ScanFilter$Builder;\"/>\n\t\t<method name=\"setServiceUuid(Landroid/os/ParcelUuid;Landroid/os/ParcelUuid;)Landroid/bluetooth/le/ScanFilter$Builder;\"/>\n\t</class>\n\t<class name=\"android/bluetooth/le/ScanRecord\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAdvertiseFlags()I\"/>\n\t\t<method name=\"getBytes()[B\"/>\n\t\t<method name=\"getDeviceName()Ljava/lang/String;\"/>\n\t\t<method name=\"getManufacturerSpecificData()Landroid/util/SparseArray;\"/>\n\t\t<method name=\"getManufacturerSpecificData(I)[B\"/>\n\t\t<method name=\"getServiceData()Ljava/util/Map;\"/>\n\t\t<method name=\"getServiceData(Landroid/os/ParcelUuid;)[B\"/>\n\t\t<method name=\"getServiceSolicitationUuids()Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"getServiceUuids()Ljava/util/List;\"/>\n\t\t<method name=\"getTxPowerLevel()I\"/>\n\t</class>\n\t<class name=\"android/bluetooth/le/ScanResult\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/bluetooth/BluetoothDevice;IIIIIIILandroid/bluetooth/le/ScanRecord;J)V\" since=\"26\"/>\n\t\t<method name=\"&lt;init>(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/le/ScanRecord;IJ)V\" deprecated=\"26\"/>\n\t\t<method name=\"getAdvertisingSid()I\" since=\"26\"/>\n\t\t<method name=\"getDataStatus()I\" since=\"26\"/>\n\t\t<method name=\"getDevice()Landroid/bluetooth/BluetoothDevice;\"/>\n\t\t<method name=\"getPeriodicAdvertisingInterval()I\" since=\"26\"/>\n\t\t<method name=\"getPrimaryPhy()I\" since=\"26\"/>\n\t\t<method name=\"getRssi()I\"/>\n\t\t<method name=\"getScanRecord()Landroid/bluetooth/le/ScanRecord;\"/>\n\t\t<method name=\"getSecondaryPhy()I\" since=\"26\"/>\n\t\t<method name=\"getTimestampNanos()J\"/>\n\t\t<method name=\"getTxPower()I\" since=\"26\"/>\n\t\t<method name=\"isConnectable()Z\" since=\"26\"/>\n\t\t<method name=\"isLegacy()Z\" since=\"26\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"DATA_COMPLETE\" since=\"26\"/>\n\t\t<field name=\"DATA_TRUNCATED\" since=\"26\"/>\n\t\t<field name=\"PERIODIC_INTERVAL_NOT_PRESENT\" since=\"26\"/>\n\t\t<field name=\"PHY_UNUSED\" since=\"26\"/>\n\t\t<field name=\"SID_NOT_PRESENT\" since=\"26\"/>\n\t\t<field name=\"TX_POWER_NOT_PRESENT\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/bluetooth/le/ScanSettings\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getCallbackType()I\"/>\n\t\t<method name=\"getLegacy()Z\" since=\"26\"/>\n\t\t<method name=\"getPhy()I\" since=\"26\"/>\n\t\t<method name=\"getReportDelayMillis()J\"/>\n\t\t<method name=\"getScanMode()I\"/>\n\t\t<method name=\"getScanResultType()I\"/>\n\t\t<field name=\"CALLBACK_TYPE_ALL_MATCHES\"/>\n\t\t<field name=\"CALLBACK_TYPE_FIRST_MATCH\" since=\"23\"/>\n\t\t<field name=\"CALLBACK_TYPE_MATCH_LOST\" since=\"23\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"MATCH_MODE_AGGRESSIVE\" since=\"23\"/>\n\t\t<field name=\"MATCH_MODE_STICKY\" since=\"23\"/>\n\t\t<field name=\"MATCH_NUM_FEW_ADVERTISEMENT\" since=\"23\"/>\n\t\t<field name=\"MATCH_NUM_MAX_ADVERTISEMENT\" since=\"23\"/>\n\t\t<field name=\"MATCH_NUM_ONE_ADVERTISEMENT\" since=\"23\"/>\n\t\t<field name=\"PHY_LE_ALL_SUPPORTED\" since=\"26\"/>\n\t\t<field name=\"SCAN_MODE_BALANCED\"/>\n\t\t<field name=\"SCAN_MODE_LOW_LATENCY\"/>\n\t\t<field name=\"SCAN_MODE_LOW_POWER\"/>\n\t\t<field name=\"SCAN_MODE_OPPORTUNISTIC\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/bluetooth/le/ScanSettings$Builder\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/bluetooth/le/ScanSettings;\"/>\n\t\t<method name=\"setCallbackType(I)Landroid/bluetooth/le/ScanSettings$Builder;\" since=\"23\"/>\n\t\t<method name=\"setLegacy(Z)Landroid/bluetooth/le/ScanSettings$Builder;\" since=\"26\"/>\n\t\t<method name=\"setMatchMode(I)Landroid/bluetooth/le/ScanSettings$Builder;\" since=\"23\"/>\n\t\t<method name=\"setNumOfMatches(I)Landroid/bluetooth/le/ScanSettings$Builder;\" since=\"23\"/>\n\t\t<method name=\"setPhy(I)Landroid/bluetooth/le/ScanSettings$Builder;\" since=\"26\"/>\n\t\t<method name=\"setReportDelay(J)Landroid/bluetooth/le/ScanSettings$Builder;\"/>\n\t\t<method name=\"setScanMode(I)Landroid/bluetooth/le/ScanSettings$Builder;\"/>\n\t</class>\n\t<class name=\"android/companion/AssociationRequest\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/companion/AssociationRequest$Builder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addDeviceFilter(Landroid/companion/DeviceFilter;)Landroid/companion/AssociationRequest$Builder;\"/>\n\t\t<method name=\"build()Landroid/companion/AssociationRequest;\"/>\n\t\t<method name=\"checkNotUsed()V\" since=\"28\" removed=\"29\"/>\n\t\t<method name=\"markUsed()V\" since=\"28\" removed=\"29\"/>\n\t\t<method name=\"setSingleDevice(Z)Landroid/companion/AssociationRequest$Builder;\"/>\n\t</class>\n\t<class name=\"android/companion/BluetoothDeviceFilter\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/companion/DeviceFilter\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/companion/BluetoothDeviceFilter$Builder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addServiceUuid(Landroid/os/ParcelUuid;Landroid/os/ParcelUuid;)Landroid/companion/BluetoothDeviceFilter$Builder;\"/>\n\t\t<method name=\"build()Landroid/companion/BluetoothDeviceFilter;\"/>\n\t\t<method name=\"checkNotUsed()V\" since=\"28\" removed=\"29\"/>\n\t\t<method name=\"markUsed()V\" since=\"28\" removed=\"29\"/>\n\t\t<method name=\"setAddress(Ljava/lang/String;)Landroid/companion/BluetoothDeviceFilter$Builder;\"/>\n\t\t<method name=\"setNamePattern(Ljava/util/regex/Pattern;)Landroid/companion/BluetoothDeviceFilter$Builder;\"/>\n\t</class>\n\t<class name=\"android/companion/BluetoothLeDeviceFilter\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/companion/DeviceFilter\"/>\n\t\t<method name=\"getRenamePrefixLengthLimit()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/companion/BluetoothLeDeviceFilter$Builder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/companion/BluetoothLeDeviceFilter;\"/>\n\t\t<method name=\"checkNotUsed()V\" since=\"28\" removed=\"29\"/>\n\t\t<method name=\"markUsed()V\" since=\"28\" removed=\"29\"/>\n\t\t<method name=\"setNamePattern(Ljava/util/regex/Pattern;)Landroid/companion/BluetoothLeDeviceFilter$Builder;\"/>\n\t\t<method name=\"setRawDataFilter([B[B)Landroid/companion/BluetoothLeDeviceFilter$Builder;\"/>\n\t\t<method name=\"setRenameFromBytes(Ljava/lang/String;Ljava/lang/String;IILjava/nio/ByteOrder;)Landroid/companion/BluetoothLeDeviceFilter$Builder;\"/>\n\t\t<method name=\"setRenameFromName(Ljava/lang/String;Ljava/lang/String;II)Landroid/companion/BluetoothLeDeviceFilter$Builder;\"/>\n\t\t<method name=\"setScanFilter(Landroid/bluetooth/le/ScanFilter;)Landroid/companion/BluetoothLeDeviceFilter$Builder;\"/>\n\t</class>\n\t<class name=\"android/companion/CompanionDeviceManager\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"associate(Landroid/companion/AssociationRequest;Landroid/companion/CompanionDeviceManager$Callback;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"disassociate(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getAssociations()Ljava/util/List;\"/>\n\t\t<method name=\"hasNotificationAccess(Landroid/content/ComponentName;)Z\"/>\n\t\t<method name=\"requestNotificationAccess(Landroid/content/ComponentName;)V\"/>\n\t\t<field name=\"EXTRA_DEVICE\"/>\n\t</class>\n\t<class name=\"android/companion/CompanionDeviceManager$Callback\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onDeviceFound(Landroid/content/IntentSender;)V\"/>\n\t\t<method name=\"onFailure(Ljava/lang/CharSequence;)V\"/>\n\t</class>\n\t<class name=\"android/companion/DeviceFilter\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t</class>\n\t<class name=\"android/companion/WifiDeviceFilter\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/companion/DeviceFilter\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/companion/WifiDeviceFilter$Builder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/companion/WifiDeviceFilter;\"/>\n\t\t<method name=\"checkNotUsed()V\" since=\"28\" removed=\"29\"/>\n\t\t<method name=\"markUsed()V\" since=\"28\" removed=\"29\"/>\n\t\t<method name=\"setNamePattern(Ljava/util/regex/Pattern;)Landroid/companion/WifiDeviceFilter$Builder;\"/>\n\t</class>\n\t<class name=\"android/content/AbstractThreadedSyncAdapter\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Z)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;ZZ)V\" since=\"11\"/>\n\t\t<method name=\"getContext()Landroid/content/Context;\"/>\n\t\t<method name=\"getSyncAdapterBinder()Landroid/os/IBinder;\"/>\n\t\t<method name=\"onPerformSync(Landroid/accounts/Account;Landroid/os/Bundle;Ljava/lang/String;Landroid/content/ContentProviderClient;Landroid/content/SyncResult;)V\"/>\n\t\t<method name=\"onSecurityException(Landroid/accounts/Account;Landroid/os/Bundle;Ljava/lang/String;Landroid/content/SyncResult;)V\" since=\"23\"/>\n\t\t<method name=\"onSyncCanceled()V\" since=\"8\"/>\n\t\t<method name=\"onSyncCanceled(Ljava/lang/Thread;)V\" since=\"11\"/>\n\t\t<method name=\"onUnsyncableAccount()Z\" since=\"28\"/>\n\t\t<field name=\"LOG_SYNC_DETAILS\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/content/ActivityNotFoundException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/content/AsyncQueryHandler\" since=\"1\">\n\t\t<extends name=\"android/os/Handler\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/ContentResolver;)V\"/>\n\t\t<method name=\"cancelOperation(I)V\"/>\n\t\t<method name=\"createHandler(Landroid/os/Looper;)Landroid/os/Handler;\"/>\n\t\t<method name=\"onDeleteComplete(ILjava/lang/Object;I)V\"/>\n\t\t<method name=\"onInsertComplete(ILjava/lang/Object;Landroid/net/Uri;)V\"/>\n\t\t<method name=\"onQueryComplete(ILjava/lang/Object;Landroid/database/Cursor;)V\"/>\n\t\t<method name=\"onUpdateComplete(ILjava/lang/Object;I)V\"/>\n\t\t<method name=\"startDelete(ILjava/lang/Object;Landroid/net/Uri;Ljava/lang/String;[Ljava/lang/String;)V\"/>\n\t\t<method name=\"startInsert(ILjava/lang/Object;Landroid/net/Uri;Landroid/content/ContentValues;)V\"/>\n\t\t<method name=\"startQuery(ILjava/lang/Object;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"startUpdate(ILjava/lang/Object;Landroid/net/Uri;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/content/AsyncQueryHandler$WorkerArgs\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"cookie\"/>\n\t\t<field name=\"handler\"/>\n\t\t<field name=\"orderBy\"/>\n\t\t<field name=\"projection\"/>\n\t\t<field name=\"result\"/>\n\t\t<field name=\"selection\"/>\n\t\t<field name=\"selectionArgs\"/>\n\t\t<field name=\"uri\"/>\n\t\t<field name=\"values\"/>\n\t</class>\n\t<class name=\"android/content/AsyncQueryHandler$WorkerHandler\" since=\"1\">\n\t\t<extends name=\"android/os/Handler\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/AsyncQueryHandler;Landroid/os/Looper;)V\"/>\n\t</class>\n\t<class name=\"android/content/AsyncTaskLoader\" since=\"11\" deprecated=\"28\">\n\t\t<extends name=\"android/content/Loader\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"cancelLoad()Z\" removed=\"16\"/>\n\t\t<method name=\"cancelLoadInBackground()V\" since=\"16\" deprecated=\"29\"/>\n\t\t<method name=\"isLoadInBackgroundCanceled()Z\" since=\"16\" deprecated=\"29\"/>\n\t\t<method name=\"loadInBackground()Ljava/lang/Object;\" deprecated=\"29\"/>\n\t\t<method name=\"onCanceled(Ljava/lang/Object;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onLoadInBackground()Ljava/lang/Object;\" deprecated=\"29\"/>\n\t\t<method name=\"setUpdateThrottle(J)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/content/BroadcastReceiver\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"abortBroadcast()V\"/>\n\t\t<method name=\"clearAbortBroadcast()V\"/>\n\t\t<method name=\"getAbortBroadcast()Z\"/>\n\t\t<method name=\"getDebugUnregister()Z\"/>\n\t\t<method name=\"getResultCode()I\"/>\n\t\t<method name=\"getResultData()Ljava/lang/String;\"/>\n\t\t<method name=\"getResultExtras(Z)Landroid/os/Bundle;\"/>\n\t\t<method name=\"goAsync()Landroid/content/BroadcastReceiver$PendingResult;\" since=\"11\"/>\n\t\t<method name=\"isInitialStickyBroadcast()Z\" since=\"5\"/>\n\t\t<method name=\"isOrderedBroadcast()Z\" since=\"5\"/>\n\t\t<method name=\"onReceive(Landroid/content/Context;Landroid/content/Intent;)V\"/>\n\t\t<method name=\"peekService(Landroid/content/Context;Landroid/content/Intent;)Landroid/os/IBinder;\" since=\"3\"/>\n\t\t<method name=\"setDebugUnregister(Z)V\"/>\n\t\t<method name=\"setOrderedHint(Z)V\"/>\n\t\t<method name=\"setResult(ILjava/lang/String;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"setResultCode(I)V\"/>\n\t\t<method name=\"setResultData(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setResultExtras(Landroid/os/Bundle;)V\"/>\n\t</class>\n\t<class name=\"android/content/BroadcastReceiver$PendingResult\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"abortBroadcast()V\"/>\n\t\t<method name=\"clearAbortBroadcast()V\"/>\n\t\t<method name=\"finish()V\"/>\n\t\t<method name=\"getAbortBroadcast()Z\"/>\n\t\t<method name=\"getResultCode()I\"/>\n\t\t<method name=\"getResultData()Ljava/lang/String;\"/>\n\t\t<method name=\"getResultExtras(Z)Landroid/os/Bundle;\"/>\n\t\t<method name=\"setResult(ILjava/lang/String;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"setResultCode(I)V\"/>\n\t\t<method name=\"setResultData(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setResultExtras(Landroid/os/Bundle;)V\"/>\n\t</class>\n\t<class name=\"android/content/ClipData\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/ClipData;)V\" since=\"16\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/ClipDescription;Landroid/content/ClipData$Item;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;[Ljava/lang/String;Landroid/content/ClipData$Item;)V\"/>\n\t\t<method name=\"addItem(Landroid/content/ClipData$Item;)V\"/>\n\t\t<method name=\"addItem(Landroid/content/ContentResolver;Landroid/content/ClipData$Item;)V\" since=\"26\"/>\n\t\t<method name=\"getDescription()Landroid/content/ClipDescription;\"/>\n\t\t<method name=\"getItemAt(I)Landroid/content/ClipData$Item;\"/>\n\t\t<method name=\"getItemCount()I\"/>\n\t\t<method name=\"newHtmlText(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/String;)Landroid/content/ClipData;\" since=\"16\"/>\n\t\t<method name=\"newIntent(Ljava/lang/CharSequence;Landroid/content/Intent;)Landroid/content/ClipData;\"/>\n\t\t<method name=\"newPlainText(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Landroid/content/ClipData;\"/>\n\t\t<method name=\"newRawUri(Ljava/lang/CharSequence;Landroid/net/Uri;)Landroid/content/ClipData;\"/>\n\t\t<method name=\"newUri(Landroid/content/ContentResolver;Ljava/lang/CharSequence;Landroid/net/Uri;)Landroid/content/ClipData;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/content/ClipData$Item\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Intent;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/Uri;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;Landroid/content/Intent;Landroid/net/Uri;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;Ljava/lang/String;)V\" since=\"16\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;Ljava/lang/String;Landroid/content/Intent;Landroid/net/Uri;)V\" since=\"16\"/>\n\t\t<method name=\"coerceToHtmlText(Landroid/content/Context;)Ljava/lang/String;\" since=\"16\"/>\n\t\t<method name=\"coerceToStyledText(Landroid/content/Context;)Ljava/lang/CharSequence;\" since=\"16\"/>\n\t\t<method name=\"coerceToText(Landroid/content/Context;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getHtmlText()Ljava/lang/String;\" since=\"16\"/>\n\t\t<method name=\"getIntent()Landroid/content/Intent;\"/>\n\t\t<method name=\"getText()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getUri()Landroid/net/Uri;\"/>\n\t</class>\n\t<class name=\"android/content/ClipDescription\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/ClipDescription;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;[Ljava/lang/String;)V\"/>\n\t\t<method name=\"compareMimeTypes(Ljava/lang/String;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"filterMimeTypes(Ljava/lang/String;)[Ljava/lang/String;\"/>\n\t\t<method name=\"getExtras()Landroid/os/PersistableBundle;\" since=\"24\"/>\n\t\t<method name=\"getLabel()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getMimeType(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getMimeTypeCount()I\"/>\n\t\t<method name=\"getTimestamp()J\" since=\"26\"/>\n\t\t<method name=\"hasMimeType(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"setExtras(Landroid/os/PersistableBundle;)V\" since=\"24\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"MIMETYPE_TEXT_HTML\" since=\"16\"/>\n\t\t<field name=\"MIMETYPE_TEXT_INTENT\"/>\n\t\t<field name=\"MIMETYPE_TEXT_PLAIN\"/>\n\t\t<field name=\"MIMETYPE_TEXT_URILIST\"/>\n\t</class>\n\t<class name=\"android/content/ClipboardManager\" since=\"11\">\n\t\t<extends name=\"android/text/ClipboardManager\"/>\n\t\t<method name=\"addPrimaryClipChangedListener(Landroid/content/ClipboardManager$OnPrimaryClipChangedListener;)V\"/>\n\t\t<method name=\"clearPrimaryClip()V\" since=\"28\"/>\n\t\t<method name=\"getPrimaryClip()Landroid/content/ClipData;\"/>\n\t\t<method name=\"getPrimaryClipDescription()Landroid/content/ClipDescription;\"/>\n\t\t<method name=\"hasPrimaryClip()Z\"/>\n\t\t<method name=\"removePrimaryClipChangedListener(Landroid/content/ClipboardManager$OnPrimaryClipChangedListener;)V\"/>\n\t\t<method name=\"setPrimaryClip(Landroid/content/ClipData;)V\"/>\n\t</class>\n\t<class name=\"android/content/ClipboardManager$OnPrimaryClipChangedListener\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onPrimaryClipChanged()V\"/>\n\t</class>\n\t<class name=\"android/content/ComponentCallbacks\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onConfigurationChanged(Landroid/content/res/Configuration;)V\"/>\n\t\t<method name=\"onLowMemory()V\"/>\n\t</class>\n\t<class name=\"android/content/ComponentCallbacks2\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/content/ComponentCallbacks\"/>\n\t\t<method name=\"onTrimMemory(I)V\"/>\n\t\t<field name=\"TRIM_MEMORY_BACKGROUND\"/>\n\t\t<field name=\"TRIM_MEMORY_COMPLETE\"/>\n\t\t<field name=\"TRIM_MEMORY_MODERATE\"/>\n\t\t<field name=\"TRIM_MEMORY_RUNNING_CRITICAL\" since=\"16\"/>\n\t\t<field name=\"TRIM_MEMORY_RUNNING_LOW\" since=\"16\"/>\n\t\t<field name=\"TRIM_MEMORY_RUNNING_MODERATE\" since=\"16\"/>\n\t\t<field name=\"TRIM_MEMORY_UI_HIDDEN\"/>\n\t</class>\n\t<class name=\"android/content/ComponentName\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"java/lang/Cloneable\" since=\"8\"/>\n\t\t<implements name=\"java/lang/Comparable\" since=\"4\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/lang/Class;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"clone()Landroid/content/ComponentName;\" since=\"8\"/>\n\t\t<method name=\"compareTo(Landroid/content/ComponentName;)I\" since=\"4\"/>\n\t\t<method name=\"createRelative(Landroid/content/Context;Ljava/lang/String;)Landroid/content/ComponentName;\" since=\"23\"/>\n\t\t<method name=\"createRelative(Ljava/lang/String;Ljava/lang/String;)Landroid/content/ComponentName;\" since=\"23\"/>\n\t\t<method name=\"flattenToShortString()Ljava/lang/String;\"/>\n\t\t<method name=\"flattenToString()Ljava/lang/String;\"/>\n\t\t<method name=\"getClassName()Ljava/lang/String;\"/>\n\t\t<method name=\"getPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getShortClassName()Ljava/lang/String;\"/>\n\t\t<method name=\"readFromParcel(Landroid/os/Parcel;)Landroid/content/ComponentName;\"/>\n\t\t<method name=\"toShortString()Ljava/lang/String;\"/>\n\t\t<method name=\"unflattenFromString(Ljava/lang/String;)Landroid/content/ComponentName;\"/>\n\t\t<method name=\"writeToParcel(Landroid/content/ComponentName;Landroid/os/Parcel;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/content/ContentProvider\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/content/ComponentCallbacks\" removed=\"14\"/>\n\t\t<implements name=\"android/content/ComponentCallbacks2\" since=\"14\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"applyBatch(Ljava/lang/String;Ljava/util/ArrayList;)[Landroid/content/ContentProviderResult;\" since=\"29\"/>\n\t\t<method name=\"applyBatch(Ljava/util/ArrayList;)[Landroid/content/ContentProviderResult;\" since=\"5\"/>\n\t\t<method name=\"attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V\"/>\n\t\t<method name=\"bulkInsert(Landroid/net/Uri;[Landroid/content/ContentValues;)I\"/>\n\t\t<method name=\"call(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;\" since=\"11\"/>\n\t\t<method name=\"call(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;\" since=\"29\"/>\n\t\t<method name=\"canonicalize(Landroid/net/Uri;)Landroid/net/Uri;\" since=\"19\"/>\n\t\t<method name=\"clearCallingIdentity()Landroid/content/ContentProvider$CallingIdentity;\" since=\"29\"/>\n\t\t<method name=\"delete(Landroid/net/Uri;Ljava/lang/String;[Ljava/lang/String;)I\"/>\n\t\t<method name=\"dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V\" since=\"18\"/>\n\t\t<method name=\"getCallingPackage()Ljava/lang/String;\" since=\"19\"/>\n\t\t<method name=\"getContext()Landroid/content/Context;\"/>\n\t\t<method name=\"getPathPermissions()[Landroid/content/pm/PathPermission;\" since=\"4\"/>\n\t\t<method name=\"getReadPermission()Ljava/lang/String;\"/>\n\t\t<method name=\"getStreamTypes(Landroid/net/Uri;Ljava/lang/String;)[Ljava/lang/String;\" since=\"11\"/>\n\t\t<method name=\"getType(Landroid/net/Uri;)Ljava/lang/String;\"/>\n\t\t<method name=\"getWritePermission()Ljava/lang/String;\"/>\n\t\t<method name=\"insert(Landroid/net/Uri;Landroid/content/ContentValues;)Landroid/net/Uri;\"/>\n\t\t<method name=\"isTemporary()Z\"/>\n\t\t<method name=\"onCreate()Z\"/>\n\t\t<method name=\"openAssetFile(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;\" since=\"3\"/>\n\t\t<method name=\"openAssetFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;\" since=\"19\"/>\n\t\t<method name=\"openFile(Landroid/net/Uri;Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;\"/>\n\t\t<method name=\"openFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/os/ParcelFileDescriptor;\" since=\"19\"/>\n\t\t<method name=\"openFileHelper(Landroid/net/Uri;Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;\"/>\n\t\t<method name=\"openPipeHelper(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Ljava/lang/Object;Landroid/content/ContentProvider$PipeDataWriter;)Landroid/os/ParcelFileDescriptor;\" since=\"11\"/>\n\t\t<method name=\"openTypedAssetFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/res/AssetFileDescriptor;\" since=\"11\"/>\n\t\t<method name=\"openTypedAssetFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;\" since=\"19\"/>\n\t\t<method name=\"query(Landroid/net/Uri;[Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/database/Cursor;\" since=\"26\"/>\n\t\t<method name=\"query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;\"/>\n\t\t<method name=\"query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;\" since=\"16\"/>\n\t\t<method name=\"refresh(Landroid/net/Uri;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Z\" since=\"26\"/>\n\t\t<method name=\"restoreCallingIdentity(Landroid/content/ContentProvider$CallingIdentity;)V\" since=\"29\"/>\n\t\t<method name=\"setPathPermissions([Landroid/content/pm/PathPermission;)V\" since=\"4\"/>\n\t\t<method name=\"setReadPermission(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setWritePermission(Ljava/lang/String;)V\"/>\n\t\t<method name=\"shutdown()V\" since=\"11\"/>\n\t\t<method name=\"uncanonicalize(Landroid/net/Uri;)Landroid/net/Uri;\" since=\"19\"/>\n\t\t<method name=\"update(Landroid/net/Uri;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I\"/>\n\t</class>\n\t<class name=\"android/content/ContentProvider$CallingIdentity\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/content/ContentProvider$PipeDataWriter\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"writeDataToPipe(Landroid/os/ParcelFileDescriptor;Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"android/content/ContentProviderClient\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\" since=\"24\"/>\n\t\t<method name=\"applyBatch(Ljava/lang/String;Ljava/util/ArrayList;)[Landroid/content/ContentProviderResult;\" since=\"29\"/>\n\t\t<method name=\"applyBatch(Ljava/util/ArrayList;)[Landroid/content/ContentProviderResult;\"/>\n\t\t<method name=\"bulkInsert(Landroid/net/Uri;[Landroid/content/ContentValues;)I\"/>\n\t\t<method name=\"call(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;\" since=\"17\"/>\n\t\t<method name=\"call(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;\" since=\"29\"/>\n\t\t<method name=\"canonicalize(Landroid/net/Uri;)Landroid/net/Uri;\" since=\"19\"/>\n\t\t<method name=\"delete(Landroid/net/Uri;Ljava/lang/String;[Ljava/lang/String;)I\"/>\n\t\t<method name=\"getLocalContentProvider()Landroid/content/ContentProvider;\"/>\n\t\t<method name=\"getStreamTypes(Landroid/net/Uri;Ljava/lang/String;)[Ljava/lang/String;\" since=\"11\"/>\n\t\t<method name=\"getType(Landroid/net/Uri;)Ljava/lang/String;\"/>\n\t\t<method name=\"insert(Landroid/net/Uri;Landroid/content/ContentValues;)Landroid/net/Uri;\"/>\n\t\t<method name=\"openAssetFile(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;\"/>\n\t\t<method name=\"openAssetFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;\" since=\"19\"/>\n\t\t<method name=\"openFile(Landroid/net/Uri;Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;\"/>\n\t\t<method name=\"openFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/os/ParcelFileDescriptor;\" since=\"19\"/>\n\t\t<method name=\"openTypedAssetFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;\" since=\"29\"/>\n\t\t<method name=\"openTypedAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/res/AssetFileDescriptor;\" since=\"11\"/>\n\t\t<method name=\"openTypedAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;\" since=\"19\"/>\n\t\t<method name=\"query(Landroid/net/Uri;[Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/database/Cursor;\" since=\"26\"/>\n\t\t<method name=\"query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;\"/>\n\t\t<method name=\"query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;\" since=\"16\"/>\n\t\t<method name=\"refresh(Landroid/net/Uri;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Z\" since=\"26\"/>\n\t\t<method name=\"release()Z\" deprecated=\"24\"/>\n\t\t<method name=\"uncanonicalize(Landroid/net/Uri;)Landroid/net/Uri;\" since=\"19\"/>\n\t\t<method name=\"update(Landroid/net/Uri;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I\"/>\n\t</class>\n\t<class name=\"android/content/ContentProviderOperation\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"apply(Landroid/content/ContentProvider;[Landroid/content/ContentProviderResult;I)Landroid/content/ContentProviderResult;\"/>\n\t\t<method name=\"getUri()Landroid/net/Uri;\"/>\n\t\t<method name=\"isAssertQuery()Z\" since=\"23\"/>\n\t\t<method name=\"isDelete()Z\" since=\"23\"/>\n\t\t<method name=\"isInsert()Z\" since=\"23\"/>\n\t\t<method name=\"isReadOperation()Z\"/>\n\t\t<method name=\"isUpdate()Z\" since=\"23\"/>\n\t\t<method name=\"isWriteOperation()Z\"/>\n\t\t<method name=\"isYieldAllowed()Z\"/>\n\t\t<method name=\"newAssertQuery(Landroid/net/Uri;)Landroid/content/ContentProviderOperation$Builder;\"/>\n\t\t<method name=\"newDelete(Landroid/net/Uri;)Landroid/content/ContentProviderOperation$Builder;\"/>\n\t\t<method name=\"newInsert(Landroid/net/Uri;)Landroid/content/ContentProviderOperation$Builder;\"/>\n\t\t<method name=\"newUpdate(Landroid/net/Uri;)Landroid/content/ContentProviderOperation$Builder;\"/>\n\t\t<method name=\"resolveSelectionArgsBackReferences([Landroid/content/ContentProviderResult;I)[Ljava/lang/String;\"/>\n\t\t<method name=\"resolveValueBackReferences([Landroid/content/ContentProviderResult;I)Landroid/content/ContentValues;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/content/ContentProviderOperation$Builder\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"build()Landroid/content/ContentProviderOperation;\"/>\n\t\t<method name=\"withExpectedCount(I)Landroid/content/ContentProviderOperation$Builder;\"/>\n\t\t<method name=\"withSelection(Ljava/lang/String;[Ljava/lang/String;)Landroid/content/ContentProviderOperation$Builder;\"/>\n\t\t<method name=\"withSelectionBackReference(II)Landroid/content/ContentProviderOperation$Builder;\"/>\n\t\t<method name=\"withValue(Ljava/lang/String;Ljava/lang/Object;)Landroid/content/ContentProviderOperation$Builder;\"/>\n\t\t<method name=\"withValueBackReference(Ljava/lang/String;I)Landroid/content/ContentProviderOperation$Builder;\"/>\n\t\t<method name=\"withValueBackReferences(Landroid/content/ContentValues;)Landroid/content/ContentProviderOperation$Builder;\"/>\n\t\t<method name=\"withValues(Landroid/content/ContentValues;)Landroid/content/ContentProviderOperation$Builder;\"/>\n\t\t<method name=\"withYieldAllowed(Z)Landroid/content/ContentProviderOperation$Builder;\"/>\n\t</class>\n\t<class name=\"android/content/ContentProviderResult\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/Uri;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"count\"/>\n\t\t<field name=\"uri\"/>\n\t</class>\n\t<class name=\"android/content/ContentQueryMap\" since=\"1\">\n\t\t<extends name=\"java/util/Observable\"/>\n\t\t<method name=\"&lt;init>(Landroid/database/Cursor;Ljava/lang/String;ZLandroid/os/Handler;)V\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"getRows()Ljava/util/Map;\"/>\n\t\t<method name=\"getValues(Ljava/lang/String;)Landroid/content/ContentValues;\"/>\n\t\t<method name=\"requery()V\"/>\n\t\t<method name=\"setKeepUpdated(Z)V\"/>\n\t</class>\n\t<class name=\"android/content/ContentResolver\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"acquireContentProviderClient(Landroid/net/Uri;)Landroid/content/ContentProviderClient;\" since=\"5\"/>\n\t\t<method name=\"acquireContentProviderClient(Ljava/lang/String;)Landroid/content/ContentProviderClient;\" since=\"5\"/>\n\t\t<method name=\"acquireUnstableContentProviderClient(Landroid/net/Uri;)Landroid/content/ContentProviderClient;\" since=\"16\"/>\n\t\t<method name=\"acquireUnstableContentProviderClient(Ljava/lang/String;)Landroid/content/ContentProviderClient;\" since=\"16\"/>\n\t\t<method name=\"addPeriodicSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;J)V\" since=\"8\"/>\n\t\t<method name=\"addStatusChangeListener(ILandroid/content/SyncStatusObserver;)Ljava/lang/Object;\" since=\"5\"/>\n\t\t<method name=\"applyBatch(Ljava/lang/String;Ljava/util/ArrayList;)[Landroid/content/ContentProviderResult;\" since=\"5\"/>\n\t\t<method name=\"bulkInsert(Landroid/net/Uri;[Landroid/content/ContentValues;)I\"/>\n\t\t<method name=\"call(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;\" since=\"11\"/>\n\t\t<method name=\"call(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;\" since=\"29\"/>\n\t\t<method name=\"cancelSync(Landroid/accounts/Account;Ljava/lang/String;)V\" since=\"5\"/>\n\t\t<method name=\"cancelSync(Landroid/content/SyncRequest;)V\" since=\"21\"/>\n\t\t<method name=\"cancelSync(Landroid/net/Uri;)V\" deprecated=\"15\"/>\n\t\t<method name=\"canonicalize(Landroid/net/Uri;)Landroid/net/Uri;\" since=\"19\"/>\n\t\t<method name=\"delete(Landroid/net/Uri;Ljava/lang/String;[Ljava/lang/String;)I\"/>\n\t\t<method name=\"getCurrentSync()Landroid/content/SyncInfo;\" since=\"8\" deprecated=\"15\"/>\n\t\t<method name=\"getCurrentSyncs()Ljava/util/List;\" since=\"11\"/>\n\t\t<method name=\"getIsSyncable(Landroid/accounts/Account;Ljava/lang/String;)I\" since=\"5\"/>\n\t\t<method name=\"getMasterSyncAutomatically()Z\" since=\"5\"/>\n\t\t<method name=\"getOutgoingPersistedUriPermissions()Ljava/util/List;\" since=\"19\"/>\n\t\t<method name=\"getPeriodicSyncs(Landroid/accounts/Account;Ljava/lang/String;)Ljava/util/List;\" since=\"8\"/>\n\t\t<method name=\"getPersistedUriPermissions()Ljava/util/List;\" since=\"19\"/>\n\t\t<method name=\"getStreamTypes(Landroid/net/Uri;Ljava/lang/String;)[Ljava/lang/String;\" since=\"11\"/>\n\t\t<method name=\"getSyncAdapterTypes()[Landroid/content/SyncAdapterType;\" since=\"5\"/>\n\t\t<method name=\"getSyncAutomatically(Landroid/accounts/Account;Ljava/lang/String;)Z\" since=\"5\"/>\n\t\t<method name=\"getType(Landroid/net/Uri;)Ljava/lang/String;\"/>\n\t\t<method name=\"getTypeInfo(Ljava/lang/String;)Landroid/content/ContentResolver$MimeTypeInfo;\" since=\"29\"/>\n\t\t<method name=\"insert(Landroid/net/Uri;Landroid/content/ContentValues;)Landroid/net/Uri;\"/>\n\t\t<method name=\"isSyncActive(Landroid/accounts/Account;Ljava/lang/String;)Z\" since=\"5\"/>\n\t\t<method name=\"isSyncPending(Landroid/accounts/Account;Ljava/lang/String;)Z\" since=\"5\"/>\n\t\t<method name=\"loadThumbnail(Landroid/net/Uri;Landroid/util/Size;Landroid/os/CancellationSignal;)Landroid/graphics/Bitmap;\" since=\"29\"/>\n\t\t<method name=\"notifyChange(Landroid/net/Uri;Landroid/database/ContentObserver;)V\"/>\n\t\t<method name=\"notifyChange(Landroid/net/Uri;Landroid/database/ContentObserver;I)V\" since=\"24\"/>\n\t\t<method name=\"notifyChange(Landroid/net/Uri;Landroid/database/ContentObserver;Z)V\"/>\n\t\t<method name=\"openAssetFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;\" since=\"29\"/>\n\t\t<method name=\"openAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;\" since=\"3\"/>\n\t\t<method name=\"openAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;\" since=\"19\"/>\n\t\t<method name=\"openFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/os/ParcelFileDescriptor;\" since=\"29\"/>\n\t\t<method name=\"openFileDescriptor(Landroid/net/Uri;Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;\"/>\n\t\t<method name=\"openFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/os/ParcelFileDescriptor;\" since=\"19\"/>\n\t\t<method name=\"openInputStream(Landroid/net/Uri;)Ljava/io/InputStream;\"/>\n\t\t<method name=\"openOutputStream(Landroid/net/Uri;)Ljava/io/OutputStream;\"/>\n\t\t<method name=\"openOutputStream(Landroid/net/Uri;Ljava/lang/String;)Ljava/io/OutputStream;\" since=\"3\"/>\n\t\t<method name=\"openTypedAssetFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;\" since=\"29\"/>\n\t\t<method name=\"openTypedAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/res/AssetFileDescriptor;\" since=\"11\"/>\n\t\t<method name=\"openTypedAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;\" since=\"19\"/>\n\t\t<method name=\"query(Landroid/net/Uri;[Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/database/Cursor;\" since=\"26\"/>\n\t\t<method name=\"query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;\"/>\n\t\t<method name=\"query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;\" since=\"16\"/>\n\t\t<method name=\"refresh(Landroid/net/Uri;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Z\" since=\"26\"/>\n\t\t<method name=\"registerContentObserver(Landroid/net/Uri;ZLandroid/database/ContentObserver;)V\"/>\n\t\t<method name=\"releasePersistableUriPermission(Landroid/net/Uri;I)V\" since=\"19\"/>\n\t\t<method name=\"removePeriodicSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"8\"/>\n\t\t<method name=\"removeStatusChangeListener(Ljava/lang/Object;)V\" since=\"5\"/>\n\t\t<method name=\"requestSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"5\"/>\n\t\t<method name=\"requestSync(Landroid/content/SyncRequest;)V\" since=\"19\"/>\n\t\t<method name=\"setIsSyncable(Landroid/accounts/Account;Ljava/lang/String;I)V\" since=\"5\"/>\n\t\t<method name=\"setMasterSyncAutomatically(Z)V\" since=\"5\"/>\n\t\t<method name=\"setSyncAutomatically(Landroid/accounts/Account;Ljava/lang/String;Z)V\" since=\"5\"/>\n\t\t<method name=\"startSync(Landroid/net/Uri;Landroid/os/Bundle;)V\" deprecated=\"15\"/>\n\t\t<method name=\"takePersistableUriPermission(Landroid/net/Uri;I)V\" since=\"19\"/>\n\t\t<method name=\"uncanonicalize(Landroid/net/Uri;)Landroid/net/Uri;\" since=\"19\"/>\n\t\t<method name=\"unregisterContentObserver(Landroid/database/ContentObserver;)V\"/>\n\t\t<method name=\"update(Landroid/net/Uri;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I\"/>\n\t\t<method name=\"validateSyncExtrasBundle(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"wrap(Landroid/content/ContentProvider;)Landroid/content/ContentResolver;\" since=\"29\"/>\n\t\t<method name=\"wrap(Landroid/content/ContentProviderClient;)Landroid/content/ContentResolver;\" since=\"29\"/>\n\t\t<field name=\"ANY_CURSOR_ITEM_TYPE\" since=\"21\"/>\n\t\t<field name=\"CURSOR_DIR_BASE_TYPE\"/>\n\t\t<field name=\"CURSOR_ITEM_BASE_TYPE\"/>\n\t\t<field name=\"EXTRA_HONORED_ARGS\" since=\"26\"/>\n\t\t<field name=\"EXTRA_REFRESH_SUPPORTED\" since=\"26\"/>\n\t\t<field name=\"EXTRA_SIZE\" since=\"21\"/>\n\t\t<field name=\"EXTRA_TOTAL_COUNT\" since=\"26\"/>\n\t\t<field name=\"NOTIFY_SKIP_NOTIFY_FOR_DESCENDANTS\" since=\"24\"/>\n\t\t<field name=\"NOTIFY_SYNC_TO_NETWORK\" since=\"24\"/>\n\t\t<field name=\"QUERY_ARG_LIMIT\" since=\"26\"/>\n\t\t<field name=\"QUERY_ARG_OFFSET\" since=\"26\"/>\n\t\t<field name=\"QUERY_ARG_SORT_COLLATION\" since=\"26\"/>\n\t\t<field name=\"QUERY_ARG_SORT_COLUMNS\" since=\"26\"/>\n\t\t<field name=\"QUERY_ARG_SORT_DIRECTION\" since=\"26\"/>\n\t\t<field name=\"QUERY_ARG_SQL_SELECTION\" since=\"26\"/>\n\t\t<field name=\"QUERY_ARG_SQL_SELECTION_ARGS\" since=\"26\"/>\n\t\t<field name=\"QUERY_ARG_SQL_SORT_ORDER\" since=\"26\"/>\n\t\t<field name=\"QUERY_SORT_DIRECTION_ASCENDING\" since=\"26\"/>\n\t\t<field name=\"QUERY_SORT_DIRECTION_DESCENDING\" since=\"26\"/>\n\t\t<field name=\"SCHEME_ANDROID_RESOURCE\"/>\n\t\t<field name=\"SCHEME_CONTENT\"/>\n\t\t<field name=\"SCHEME_FILE\"/>\n\t\t<field name=\"SYNC_EXTRAS_ACCOUNT\" deprecated=\"15\"/>\n\t\t<field name=\"SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS\"/>\n\t\t<field name=\"SYNC_EXTRAS_DO_NOT_RETRY\" since=\"8\"/>\n\t\t<field name=\"SYNC_EXTRAS_EXPEDITED\"/>\n\t\t<field name=\"SYNC_EXTRAS_FORCE\" deprecated=\"15\"/>\n\t\t<field name=\"SYNC_EXTRAS_IGNORE_BACKOFF\" since=\"8\"/>\n\t\t<field name=\"SYNC_EXTRAS_IGNORE_SETTINGS\" since=\"8\"/>\n\t\t<field name=\"SYNC_EXTRAS_INITIALIZE\" since=\"5\"/>\n\t\t<field name=\"SYNC_EXTRAS_MANUAL\" since=\"5\"/>\n\t\t<field name=\"SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS\"/>\n\t\t<field name=\"SYNC_EXTRAS_REQUIRE_CHARGING\" since=\"24\"/>\n\t\t<field name=\"SYNC_EXTRAS_UPLOAD\"/>\n\t\t<field name=\"SYNC_OBSERVER_TYPE_ACTIVE\" since=\"8\"/>\n\t\t<field name=\"SYNC_OBSERVER_TYPE_PENDING\" since=\"8\"/>\n\t\t<field name=\"SYNC_OBSERVER_TYPE_SETTINGS\" since=\"8\"/>\n\t</class>\n\t<class name=\"android/content/ContentResolver$MimeTypeInfo\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getContentDescription()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getIcon()Landroid/graphics/drawable/Icon;\"/>\n\t\t<method name=\"getLabel()Ljava/lang/CharSequence;\"/>\n\t</class>\n\t<class name=\"android/content/ContentUris\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"appendId(Landroid/net/Uri$Builder;J)Landroid/net/Uri$Builder;\"/>\n\t\t<method name=\"parseId(Landroid/net/Uri;)J\"/>\n\t\t<method name=\"removeId(Landroid/net/Uri;)Landroid/net/Uri;\" since=\"29\"/>\n\t\t<method name=\"withAppendedId(Landroid/net/Uri;J)Landroid/net/Uri;\"/>\n\t</class>\n\t<class name=\"android/content/ContentValues\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/ContentValues;)V\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"containsKey(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"get(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getAsBoolean(Ljava/lang/String;)Ljava/lang/Boolean;\"/>\n\t\t<method name=\"getAsByte(Ljava/lang/String;)Ljava/lang/Byte;\"/>\n\t\t<method name=\"getAsByteArray(Ljava/lang/String;)[B\"/>\n\t\t<method name=\"getAsDouble(Ljava/lang/String;)Ljava/lang/Double;\"/>\n\t\t<method name=\"getAsFloat(Ljava/lang/String;)Ljava/lang/Float;\"/>\n\t\t<method name=\"getAsInteger(Ljava/lang/String;)Ljava/lang/Integer;\"/>\n\t\t<method name=\"getAsLong(Ljava/lang/String;)Ljava/lang/Long;\"/>\n\t\t<method name=\"getAsShort(Ljava/lang/String;)Ljava/lang/Short;\"/>\n\t\t<method name=\"getAsString(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"keySet()Ljava/util/Set;\" since=\"11\"/>\n\t\t<method name=\"put(Ljava/lang/String;Ljava/lang/Boolean;)V\"/>\n\t\t<method name=\"put(Ljava/lang/String;Ljava/lang/Byte;)V\"/>\n\t\t<method name=\"put(Ljava/lang/String;Ljava/lang/Double;)V\"/>\n\t\t<method name=\"put(Ljava/lang/String;Ljava/lang/Float;)V\"/>\n\t\t<method name=\"put(Ljava/lang/String;Ljava/lang/Integer;)V\"/>\n\t\t<method name=\"put(Ljava/lang/String;Ljava/lang/Long;)V\"/>\n\t\t<method name=\"put(Ljava/lang/String;Ljava/lang/Short;)V\"/>\n\t\t<method name=\"put(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"put(Ljava/lang/String;[B)V\"/>\n\t\t<method name=\"putAll(Landroid/content/ContentValues;)V\"/>\n\t\t<method name=\"putNull(Ljava/lang/String;)V\"/>\n\t\t<method name=\"remove(Ljava/lang/String;)V\"/>\n\t\t<method name=\"size()I\"/>\n\t\t<method name=\"valueSet()Ljava/util/Set;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"TAG\"/>\n\t</class>\n\t<class name=\"android/content/Context\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"bindIsolatedService(Landroid/content/Intent;ILjava/lang/String;Ljava/util/concurrent/Executor;Landroid/content/ServiceConnection;)Z\" since=\"29\"/>\n\t\t<method name=\"bindService(Landroid/content/Intent;ILjava/util/concurrent/Executor;Landroid/content/ServiceConnection;)Z\" since=\"29\"/>\n\t\t<method name=\"bindService(Landroid/content/Intent;Landroid/content/ServiceConnection;I)Z\"/>\n\t\t<method name=\"checkCallingOrSelfPermission(Ljava/lang/String;)I\"/>\n\t\t<method name=\"checkCallingOrSelfUriPermission(Landroid/net/Uri;I)I\"/>\n\t\t<method name=\"checkCallingPermission(Ljava/lang/String;)I\"/>\n\t\t<method name=\"checkCallingUriPermission(Landroid/net/Uri;I)I\"/>\n\t\t<method name=\"checkPermission(Ljava/lang/String;II)I\"/>\n\t\t<method name=\"checkSelfPermission(Ljava/lang/String;)I\" since=\"23\"/>\n\t\t<method name=\"checkUriPermission(Landroid/net/Uri;III)I\"/>\n\t\t<method name=\"checkUriPermission(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;III)I\"/>\n\t\t<method name=\"clearWallpaper()V\" deprecated=\"15\"/>\n\t\t<method name=\"createConfigurationContext(Landroid/content/res/Configuration;)Landroid/content/Context;\" since=\"17\"/>\n\t\t<method name=\"createContextForSplit(Ljava/lang/String;)Landroid/content/Context;\" since=\"26\"/>\n\t\t<method name=\"createDeviceProtectedStorageContext()Landroid/content/Context;\" since=\"24\"/>\n\t\t<method name=\"createDisplayContext(Landroid/view/Display;)Landroid/content/Context;\" since=\"17\"/>\n\t\t<method name=\"createPackageContext(Ljava/lang/String;I)Landroid/content/Context;\"/>\n\t\t<method name=\"databaseList()[Ljava/lang/String;\"/>\n\t\t<method name=\"deleteDatabase(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"deleteFile(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"deleteSharedPreferences(Ljava/lang/String;)Z\" since=\"24\"/>\n\t\t<method name=\"enforceCallingOrSelfPermission(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"enforceCallingOrSelfUriPermission(Landroid/net/Uri;ILjava/lang/String;)V\"/>\n\t\t<method name=\"enforceCallingPermission(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"enforceCallingUriPermission(Landroid/net/Uri;ILjava/lang/String;)V\"/>\n\t\t<method name=\"enforcePermission(Ljava/lang/String;IILjava/lang/String;)V\"/>\n\t\t<method name=\"enforceUriPermission(Landroid/net/Uri;IIILjava/lang/String;)V\"/>\n\t\t<method name=\"enforceUriPermission(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;)V\"/>\n\t\t<method name=\"fileList()[Ljava/lang/String;\"/>\n\t\t<method name=\"getApplicationContext()Landroid/content/Context;\"/>\n\t\t<method name=\"getApplicationInfo()Landroid/content/pm/ApplicationInfo;\" since=\"4\"/>\n\t\t<method name=\"getAssets()Landroid/content/res/AssetManager;\"/>\n\t\t<method name=\"getCacheDir()Ljava/io/File;\"/>\n\t\t<method name=\"getClassLoader()Ljava/lang/ClassLoader;\"/>\n\t\t<method name=\"getCodeCacheDir()Ljava/io/File;\" since=\"21\"/>\n\t\t<method name=\"getColor(I)I\" since=\"23\"/>\n\t\t<method name=\"getColorStateList(I)Landroid/content/res/ColorStateList;\" since=\"23\"/>\n\t\t<method name=\"getContentResolver()Landroid/content/ContentResolver;\"/>\n\t\t<method name=\"getDataDir()Ljava/io/File;\" since=\"24\"/>\n\t\t<method name=\"getDatabasePath(Ljava/lang/String;)Ljava/io/File;\"/>\n\t\t<method name=\"getDir(Ljava/lang/String;I)Ljava/io/File;\"/>\n\t\t<method name=\"getDrawable(I)Landroid/graphics/drawable/Drawable;\" since=\"21\"/>\n\t\t<method name=\"getExternalCacheDir()Ljava/io/File;\" since=\"8\"/>\n\t\t<method name=\"getExternalCacheDirs()[Ljava/io/File;\" since=\"19\"/>\n\t\t<method name=\"getExternalFilesDir(Ljava/lang/String;)Ljava/io/File;\" since=\"8\"/>\n\t\t<method name=\"getExternalFilesDirs(Ljava/lang/String;)[Ljava/io/File;\" since=\"19\"/>\n\t\t<method name=\"getExternalMediaDirs()[Ljava/io/File;\" since=\"21\"/>\n\t\t<method name=\"getFileStreamPath(Ljava/lang/String;)Ljava/io/File;\"/>\n\t\t<method name=\"getFilesDir()Ljava/io/File;\"/>\n\t\t<method name=\"getMainExecutor()Ljava/util/concurrent/Executor;\" since=\"28\"/>\n\t\t<method name=\"getMainLooper()Landroid/os/Looper;\"/>\n\t\t<method name=\"getNoBackupFilesDir()Ljava/io/File;\" since=\"21\"/>\n\t\t<method name=\"getObbDir()Ljava/io/File;\" since=\"11\"/>\n\t\t<method name=\"getObbDirs()[Ljava/io/File;\" since=\"19\"/>\n\t\t<method name=\"getOpPackageName()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getPackageCodePath()Ljava/lang/String;\" since=\"8\"/>\n\t\t<method name=\"getPackageManager()Landroid/content/pm/PackageManager;\"/>\n\t\t<method name=\"getPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getPackageResourcePath()Ljava/lang/String;\" since=\"8\"/>\n\t\t<method name=\"getResources()Landroid/content/res/Resources;\"/>\n\t\t<method name=\"getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;\"/>\n\t\t<method name=\"getString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getString(I[Ljava/lang/Object;)Ljava/lang/String;\"/>\n\t\t<method name=\"getSystemService(Ljava/lang/Class;)Ljava/lang/Object;\" since=\"23\"/>\n\t\t<method name=\"getSystemService(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getSystemServiceName(Ljava/lang/Class;)Ljava/lang/String;\" since=\"23\"/>\n\t\t<method name=\"getText(I)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTheme()Landroid/content/res/Resources$Theme;\"/>\n\t\t<method name=\"getWallpaper()Landroid/graphics/drawable/Drawable;\" deprecated=\"15\"/>\n\t\t<method name=\"getWallpaperDesiredMinimumHeight()I\" deprecated=\"15\"/>\n\t\t<method name=\"getWallpaperDesiredMinimumWidth()I\" deprecated=\"15\"/>\n\t\t<method name=\"grantUriPermission(Ljava/lang/String;Landroid/net/Uri;I)V\"/>\n\t\t<method name=\"isDeviceProtectedStorage()Z\" since=\"24\"/>\n\t\t<method name=\"isRestricted()Z\" since=\"4\"/>\n\t\t<method name=\"moveDatabaseFrom(Landroid/content/Context;Ljava/lang/String;)Z\" since=\"24\"/>\n\t\t<method name=\"moveSharedPreferencesFrom(Landroid/content/Context;Ljava/lang/String;)Z\" since=\"24\"/>\n\t\t<method name=\"obtainStyledAttributes(I[I)Landroid/content/res/TypedArray;\"/>\n\t\t<method name=\"obtainStyledAttributes(Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray;\"/>\n\t\t<method name=\"obtainStyledAttributes(Landroid/util/AttributeSet;[III)Landroid/content/res/TypedArray;\"/>\n\t\t<method name=\"obtainStyledAttributes([I)Landroid/content/res/TypedArray;\"/>\n\t\t<method name=\"openFileInput(Ljava/lang/String;)Ljava/io/FileInputStream;\"/>\n\t\t<method name=\"openFileOutput(Ljava/lang/String;I)Ljava/io/FileOutputStream;\"/>\n\t\t<method name=\"openOrCreateDatabase(Ljava/lang/String;ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase;\"/>\n\t\t<method name=\"openOrCreateDatabase(Ljava/lang/String;ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;Landroid/database/DatabaseErrorHandler;)Landroid/database/sqlite/SQLiteDatabase;\" since=\"11\"/>\n\t\t<method name=\"peekWallpaper()Landroid/graphics/drawable/Drawable;\" deprecated=\"15\"/>\n\t\t<method name=\"registerComponentCallbacks(Landroid/content/ComponentCallbacks;)V\" since=\"14\"/>\n\t\t<method name=\"registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;\"/>\n\t\t<method name=\"registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;I)Landroid/content/Intent;\" since=\"26\"/>\n\t\t<method name=\"registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent;\"/>\n\t\t<method name=\"registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;I)Landroid/content/Intent;\" since=\"26\"/>\n\t\t<method name=\"removeStickyBroadcast(Landroid/content/Intent;)V\" deprecated=\"21\"/>\n\t\t<method name=\"removeStickyBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V\" since=\"17\" deprecated=\"21\"/>\n\t\t<method name=\"revokeUriPermission(Landroid/net/Uri;I)V\"/>\n\t\t<method name=\"revokeUriPermission(Ljava/lang/String;Landroid/net/Uri;I)V\" since=\"26\"/>\n\t\t<method name=\"sendBroadcast(Landroid/content/Intent;)V\"/>\n\t\t<method name=\"sendBroadcast(Landroid/content/Intent;Ljava/lang/String;)V\"/>\n\t\t<method name=\"sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V\" since=\"17\"/>\n\t\t<method name=\"sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;)V\" since=\"17\"/>\n\t\t<method name=\"sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;)V\"/>\n\t\t<method name=\"sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V\" since=\"30\"/>\n\t\t<method name=\"sendOrderedBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V\" since=\"17\"/>\n\t\t<method name=\"sendStickyBroadcast(Landroid/content/Intent;)V\" deprecated=\"21\"/>\n\t\t<method name=\"sendStickyBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V\" since=\"17\" deprecated=\"21\"/>\n\t\t<method name=\"sendStickyOrderedBroadcast(Landroid/content/Intent;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V\" since=\"5\" deprecated=\"21\"/>\n\t\t<method name=\"sendStickyOrderedBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V\" since=\"17\" deprecated=\"21\"/>\n\t\t<method name=\"setTheme(I)V\"/>\n\t\t<method name=\"setWallpaper(Landroid/graphics/Bitmap;)V\" deprecated=\"15\"/>\n\t\t<method name=\"setWallpaper(Ljava/io/InputStream;)V\" deprecated=\"15\"/>\n\t\t<method name=\"startActivities([Landroid/content/Intent;)V\" since=\"11\"/>\n\t\t<method name=\"startActivities([Landroid/content/Intent;Landroid/os/Bundle;)V\" since=\"16\"/>\n\t\t<method name=\"startActivity(Landroid/content/Intent;)V\"/>\n\t\t<method name=\"startActivity(Landroid/content/Intent;Landroid/os/Bundle;)V\" since=\"16\"/>\n\t\t<method name=\"startForegroundService(Landroid/content/Intent;)Landroid/content/ComponentName;\" since=\"26\"/>\n\t\t<method name=\"startInstrumentation(Landroid/content/ComponentName;Ljava/lang/String;Landroid/os/Bundle;)Z\"/>\n\t\t<method name=\"startIntentSender(Landroid/content/IntentSender;Landroid/content/Intent;III)V\" since=\"5\"/>\n\t\t<method name=\"startIntentSender(Landroid/content/IntentSender;Landroid/content/Intent;IIILandroid/os/Bundle;)V\" since=\"16\"/>\n\t\t<method name=\"startService(Landroid/content/Intent;)Landroid/content/ComponentName;\"/>\n\t\t<method name=\"stopService(Landroid/content/Intent;)Z\"/>\n\t\t<method name=\"unbindService(Landroid/content/ServiceConnection;)V\"/>\n\t\t<method name=\"unregisterComponentCallbacks(Landroid/content/ComponentCallbacks;)V\" since=\"14\"/>\n\t\t<method name=\"unregisterReceiver(Landroid/content/BroadcastReceiver;)V\"/>\n\t\t<method name=\"updateServiceGroup(Landroid/content/ServiceConnection;II)V\" since=\"29\"/>\n\t\t<field name=\"ACCESSIBILITY_SERVICE\" since=\"4\"/>\n\t\t<field name=\"ACCOUNT_SERVICE\" since=\"5\"/>\n\t\t<field name=\"ACTIVITY_SERVICE\"/>\n\t\t<field name=\"ALARM_SERVICE\"/>\n\t\t<field name=\"APPWIDGET_SERVICE\" since=\"21\"/>\n\t\t<field name=\"APP_OPS_SERVICE\" since=\"19\"/>\n\t\t<field name=\"AUDIO_SERVICE\"/>\n\t\t<field name=\"BATTERY_SERVICE\" since=\"21\"/>\n\t\t<field name=\"BIND_ABOVE_CLIENT\" since=\"14\"/>\n\t\t<field name=\"BIND_ADJUST_WITH_ACTIVITY\" since=\"14\"/>\n\t\t<field name=\"BIND_ALLOW_OOM_MANAGEMENT\" since=\"14\"/>\n\t\t<field name=\"BIND_AUTO_CREATE\"/>\n\t\t<field name=\"BIND_DEBUG_UNBIND\"/>\n\t\t<field name=\"BIND_EXTERNAL_SERVICE\" since=\"24\"/>\n\t\t<field name=\"BIND_IMPORTANT\" since=\"14\"/>\n\t\t<field name=\"BIND_INCLUDE_CAPABILITIES\" since=\"29\"/>\n\t\t<field name=\"BIND_NOT_FOREGROUND\" since=\"8\"/>\n\t\t<field name=\"BIND_NOT_PERCEPTIBLE\" since=\"29\"/>\n\t\t<field name=\"BIND_WAIVE_PRIORITY\" since=\"14\"/>\n\t\t<field name=\"BIOMETRIC_SERVICE\" since=\"29\"/>\n\t\t<field name=\"BLUETOOTH_SERVICE\" since=\"18\"/>\n\t\t<field name=\"CAMERA_SERVICE\" since=\"21\"/>\n\t\t<field name=\"CAPTIONING_SERVICE\" since=\"19\"/>\n\t\t<field name=\"CARRIER_CONFIG_SERVICE\" since=\"23\"/>\n\t\t<field name=\"CLIPBOARD_SERVICE\"/>\n\t\t<field name=\"COMPANION_DEVICE_SERVICE\" since=\"26\"/>\n\t\t<field name=\"CONNECTIVITY_DIAGNOSTICS_SERVICE\" since=\"30\"/>\n\t\t<field name=\"CONNECTIVITY_SERVICE\"/>\n\t\t<field name=\"CONSUMER_IR_SERVICE\" since=\"19\"/>\n\t\t<field name=\"CONTEXT_IGNORE_SECURITY\"/>\n\t\t<field name=\"CONTEXT_INCLUDE_CODE\"/>\n\t\t<field name=\"CONTEXT_RESTRICTED\" since=\"4\"/>\n\t\t<field name=\"CROSS_PROFILE_APPS_SERVICE\" since=\"28\"/>\n\t\t<field name=\"DEVICE_POLICY_SERVICE\" since=\"8\"/>\n\t\t<field name=\"DISPLAY_SERVICE\" since=\"17\"/>\n\t\t<field name=\"DOWNLOAD_SERVICE\" since=\"9\"/>\n\t\t<field name=\"DROPBOX_SERVICE\" since=\"8\"/>\n\t\t<field name=\"EUICC_SERVICE\" since=\"28\"/>\n\t\t<field name=\"FINGERPRINT_SERVICE\" since=\"23\"/>\n\t\t<field name=\"HARDWARE_PROPERTIES_SERVICE\" since=\"24\"/>\n\t\t<field name=\"INPUT_METHOD_SERVICE\" since=\"3\"/>\n\t\t<field name=\"INPUT_SERVICE\" since=\"16\"/>\n\t\t<field name=\"IPSEC_SERVICE\" since=\"28\"/>\n\t\t<field name=\"JOB_SCHEDULER_SERVICE\" since=\"21\"/>\n\t\t<field name=\"KEYGUARD_SERVICE\"/>\n\t\t<field name=\"LAUNCHER_APPS_SERVICE\" since=\"21\"/>\n\t\t<field name=\"LAYOUT_INFLATER_SERVICE\"/>\n\t\t<field name=\"LOCATION_SERVICE\"/>\n\t\t<field name=\"MEDIA_PROJECTION_SERVICE\" since=\"21\"/>\n\t\t<field name=\"MEDIA_ROUTER_SERVICE\" since=\"16\"/>\n\t\t<field name=\"MEDIA_SESSION_SERVICE\" since=\"21\"/>\n\t\t<field name=\"MIDI_SERVICE\" since=\"23\"/>\n\t\t<field name=\"MODE_APPEND\"/>\n\t\t<field name=\"MODE_ENABLE_WRITE_AHEAD_LOGGING\" since=\"16\"/>\n\t\t<field name=\"MODE_MULTI_PROCESS\" since=\"11\" deprecated=\"23\"/>\n\t\t<field name=\"MODE_NO_LOCALIZED_COLLATORS\" since=\"24\"/>\n\t\t<field name=\"MODE_PRIVATE\"/>\n\t\t<field name=\"MODE_WORLD_READABLE\" deprecated=\"17\"/>\n\t\t<field name=\"MODE_WORLD_WRITEABLE\" deprecated=\"17\"/>\n\t\t<field name=\"NETWORK_STATS_SERVICE\" since=\"23\"/>\n\t\t<field name=\"NFC_SERVICE\" since=\"10\"/>\n\t\t<field name=\"NOTIFICATION_SERVICE\"/>\n\t\t<field name=\"NSD_SERVICE\" since=\"16\"/>\n\t\t<field name=\"POWER_SERVICE\"/>\n\t\t<field name=\"PRINT_SERVICE\" since=\"19\"/>\n\t\t<field name=\"RECEIVER_VISIBLE_TO_INSTANT_APPS\" since=\"26\"/>\n\t\t<field name=\"RESTRICTIONS_SERVICE\" since=\"21\"/>\n\t\t<field name=\"ROLE_SERVICE\" since=\"29\"/>\n\t\t<field name=\"SEARCH_SERVICE\"/>\n\t\t<field name=\"SENSOR_SERVICE\"/>\n\t\t<field name=\"SHORTCUT_SERVICE\" since=\"25\"/>\n\t\t<field name=\"STORAGE_SERVICE\" since=\"9\"/>\n\t\t<field name=\"STORAGE_STATS_SERVICE\" since=\"26\"/>\n\t\t<field name=\"SYSTEM_HEALTH_SERVICE\" since=\"24\"/>\n\t\t<field name=\"TELECOM_SERVICE\" since=\"21\"/>\n\t\t<field name=\"TELEPHONY_IMS_SERVICE\" since=\"30\"/>\n\t\t<field name=\"TELEPHONY_SERVICE\"/>\n\t\t<field name=\"TELEPHONY_SUBSCRIPTION_SERVICE\" since=\"22\"/>\n\t\t<field name=\"TEXT_CLASSIFICATION_SERVICE\" since=\"26\"/>\n\t\t<field name=\"TEXT_SERVICES_MANAGER_SERVICE\" since=\"14\"/>\n\t\t<field name=\"TV_INPUT_SERVICE\" since=\"21\"/>\n\t\t<field name=\"UI_MODE_SERVICE\" since=\"8\"/>\n\t\t<field name=\"USAGE_STATS_SERVICE\" since=\"22\"/>\n\t\t<field name=\"USB_SERVICE\" since=\"12\"/>\n\t\t<field name=\"USER_SERVICE\" since=\"17\"/>\n\t\t<field name=\"VIBRATOR_SERVICE\"/>\n\t\t<field name=\"VPN_MANAGEMENT_SERVICE\" since=\"30\"/>\n\t\t<field name=\"WALLPAPER_SERVICE\"/>\n\t\t<field name=\"WIFI_AWARE_SERVICE\" since=\"26\"/>\n\t\t<field name=\"WIFI_P2P_SERVICE\" since=\"14\"/>\n\t\t<field name=\"WIFI_RTT_RANGING_SERVICE\" since=\"28\"/>\n\t\t<field name=\"WIFI_SERVICE\"/>\n\t\t<field name=\"WINDOW_SERVICE\"/>\n\t</class>\n\t<class name=\"android/content/ContextWrapper\" since=\"1\">\n\t\t<extends name=\"android/content/Context\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"attachBaseContext(Landroid/content/Context;)V\"/>\n\t\t<method name=\"getBaseContext()Landroid/content/Context;\"/>\n\t\t<method name=\"getPackageCodePath()Ljava/lang/String;\"/>\n\t\t<method name=\"getPackageResourcePath()Ljava/lang/String;\"/>\n\t\t<method name=\"sendOrderedBroadcast(Landroid/content/Intent;ILjava/lang/String;Ljava/lang/String;Landroid/content/BroadcastReceiver;Landroid/os/Handler;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/Bundle;)V\" since=\"30\"/>\n\t</class>\n\t<class name=\"android/content/CursorLoader\" since=\"11\" deprecated=\"28\">\n\t\t<extends name=\"android/content/AsyncTaskLoader\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"deliverResult(Landroid/database/Cursor;)V\" deprecated=\"29\"/>\n\t\t<method name=\"getProjection()[Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getSelection()Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getSelectionArgs()[Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getSortOrder()Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getUri()Landroid/net/Uri;\" deprecated=\"29\"/>\n\t\t<method name=\"loadInBackground()Landroid/database/Cursor;\" deprecated=\"29\"/>\n\t\t<method name=\"onCanceled(Landroid/database/Cursor;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setProjection([Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setSelection(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setSelectionArgs([Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setSortOrder(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setUri(Landroid/net/Uri;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/content/DialogInterface\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"cancel()V\"/>\n\t\t<method name=\"dismiss()V\"/>\n\t\t<field name=\"BUTTON1\" deprecated=\"15\"/>\n\t\t<field name=\"BUTTON2\" deprecated=\"15\"/>\n\t\t<field name=\"BUTTON3\" deprecated=\"15\"/>\n\t\t<field name=\"BUTTON_NEGATIVE\" since=\"3\"/>\n\t\t<field name=\"BUTTON_NEUTRAL\" since=\"3\"/>\n\t\t<field name=\"BUTTON_POSITIVE\" since=\"3\"/>\n\t</class>\n\t<class name=\"android/content/DialogInterface$OnCancelListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onCancel(Landroid/content/DialogInterface;)V\"/>\n\t</class>\n\t<class name=\"android/content/DialogInterface$OnClickListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onClick(Landroid/content/DialogInterface;I)V\"/>\n\t</class>\n\t<class name=\"android/content/DialogInterface$OnDismissListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDismiss(Landroid/content/DialogInterface;)V\"/>\n\t</class>\n\t<class name=\"android/content/DialogInterface$OnKeyListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onKey(Landroid/content/DialogInterface;ILandroid/view/KeyEvent;)Z\"/>\n\t</class>\n\t<class name=\"android/content/DialogInterface$OnMultiChoiceClickListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onClick(Landroid/content/DialogInterface;IZ)V\"/>\n\t</class>\n\t<class name=\"android/content/DialogInterface$OnShowListener\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onShow(Landroid/content/DialogInterface;)V\"/>\n\t</class>\n\t<class name=\"android/content/Entity\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/ContentValues;)V\"/>\n\t\t<method name=\"addSubValue(Landroid/net/Uri;Landroid/content/ContentValues;)V\"/>\n\t\t<method name=\"getEntityValues()Landroid/content/ContentValues;\"/>\n\t\t<method name=\"getSubValues()Ljava/util/ArrayList;\"/>\n\t</class>\n\t<class name=\"android/content/Entity$NamedContentValues\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/Uri;Landroid/content/ContentValues;)V\"/>\n\t\t<field name=\"uri\"/>\n\t\t<field name=\"values\"/>\n\t</class>\n\t<class name=\"android/content/EntityIterator\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Iterator\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"reset()V\"/>\n\t</class>\n\t<class name=\"android/content/Intent\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"java/lang/Cloneable\" since=\"8\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/lang/Class;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Intent;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Landroid/net/Uri;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Landroid/net/Uri;Landroid/content/Context;Ljava/lang/Class;)V\"/>\n\t\t<method name=\"addCategory(Ljava/lang/String;)Landroid/content/Intent;\"/>\n\t\t<method name=\"addFlags(I)Landroid/content/Intent;\"/>\n\t\t<method name=\"cloneFilter()Landroid/content/Intent;\"/>\n\t\t<method name=\"createChooser(Landroid/content/Intent;Ljava/lang/CharSequence;)Landroid/content/Intent;\"/>\n\t\t<method name=\"createChooser(Landroid/content/Intent;Ljava/lang/CharSequence;Landroid/content/IntentSender;)Landroid/content/Intent;\" since=\"22\"/>\n\t\t<method name=\"fillIn(Landroid/content/Intent;I)I\"/>\n\t\t<method name=\"filterEquals(Landroid/content/Intent;)Z\"/>\n\t\t<method name=\"filterHashCode()I\"/>\n\t\t<method name=\"getAction()Ljava/lang/String;\"/>\n\t\t<method name=\"getBooleanArrayExtra(Ljava/lang/String;)[Z\"/>\n\t\t<method name=\"getBooleanExtra(Ljava/lang/String;Z)Z\"/>\n\t\t<method name=\"getBundleExtra(Ljava/lang/String;)Landroid/os/Bundle;\"/>\n\t\t<method name=\"getByteArrayExtra(Ljava/lang/String;)[B\"/>\n\t\t<method name=\"getByteExtra(Ljava/lang/String;B)B\"/>\n\t\t<method name=\"getCategories()Ljava/util/Set;\"/>\n\t\t<method name=\"getCharArrayExtra(Ljava/lang/String;)[C\"/>\n\t\t<method name=\"getCharExtra(Ljava/lang/String;C)C\"/>\n\t\t<method name=\"getCharSequenceArrayExtra(Ljava/lang/String;)[Ljava/lang/CharSequence;\" since=\"8\"/>\n\t\t<method name=\"getCharSequenceArrayListExtra(Ljava/lang/String;)Ljava/util/ArrayList;\" since=\"8\"/>\n\t\t<method name=\"getCharSequenceExtra(Ljava/lang/String;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getClipData()Landroid/content/ClipData;\" since=\"16\"/>\n\t\t<method name=\"getComponent()Landroid/content/ComponentName;\"/>\n\t\t<method name=\"getData()Landroid/net/Uri;\"/>\n\t\t<method name=\"getDataString()Ljava/lang/String;\"/>\n\t\t<method name=\"getDoubleArrayExtra(Ljava/lang/String;)[D\"/>\n\t\t<method name=\"getDoubleExtra(Ljava/lang/String;D)D\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getFlags()I\"/>\n\t\t<method name=\"getFloatArrayExtra(Ljava/lang/String;)[F\"/>\n\t\t<method name=\"getFloatExtra(Ljava/lang/String;F)F\"/>\n\t\t<method name=\"getIdentifier()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getIntArrayExtra(Ljava/lang/String;)[I\"/>\n\t\t<method name=\"getIntExtra(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"getIntegerArrayListExtra(Ljava/lang/String;)Ljava/util/ArrayList;\"/>\n\t\t<method name=\"getIntent(Ljava/lang/String;)Landroid/content/Intent;\" deprecated=\"15\"/>\n\t\t<method name=\"getIntentOld(Ljava/lang/String;)Landroid/content/Intent;\"/>\n\t\t<method name=\"getLongArrayExtra(Ljava/lang/String;)[J\"/>\n\t\t<method name=\"getLongExtra(Ljava/lang/String;J)J\"/>\n\t\t<method name=\"getPackage()Ljava/lang/String;\" since=\"4\"/>\n\t\t<method name=\"getParcelableArrayExtra(Ljava/lang/String;)[Landroid/os/Parcelable;\"/>\n\t\t<method name=\"getParcelableArrayListExtra(Ljava/lang/String;)Ljava/util/ArrayList;\"/>\n\t\t<method name=\"getParcelableExtra(Ljava/lang/String;)Landroid/os/Parcelable;\"/>\n\t\t<method name=\"getScheme()Ljava/lang/String;\"/>\n\t\t<method name=\"getSelector()Landroid/content/Intent;\" since=\"15\"/>\n\t\t<method name=\"getSerializableExtra(Ljava/lang/String;)Ljava/io/Serializable;\"/>\n\t\t<method name=\"getShortArrayExtra(Ljava/lang/String;)[S\"/>\n\t\t<method name=\"getShortExtra(Ljava/lang/String;S)S\"/>\n\t\t<method name=\"getSourceBounds()Landroid/graphics/Rect;\" since=\"7\"/>\n\t\t<method name=\"getStringArrayExtra(Ljava/lang/String;)[Ljava/lang/String;\"/>\n\t\t<method name=\"getStringArrayListExtra(Ljava/lang/String;)Ljava/util/ArrayList;\"/>\n\t\t<method name=\"getStringExtra(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getType()Ljava/lang/String;\"/>\n\t\t<method name=\"hasCategory(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"hasExtra(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"hasFileDescriptors()Z\"/>\n\t\t<method name=\"makeMainActivity(Landroid/content/ComponentName;)Landroid/content/Intent;\" since=\"11\"/>\n\t\t<method name=\"makeMainSelectorActivity(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;\" since=\"15\"/>\n\t\t<method name=\"makeRestartActivityTask(Landroid/content/ComponentName;)Landroid/content/Intent;\" since=\"11\"/>\n\t\t<method name=\"normalizeMimeType(Ljava/lang/String;)Ljava/lang/String;\" since=\"16\"/>\n\t\t<method name=\"parseIntent(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;)Landroid/content/Intent;\"/>\n\t\t<method name=\"parseUri(Ljava/lang/String;I)Landroid/content/Intent;\" since=\"4\"/>\n\t\t<method name=\"putCharSequenceArrayListExtra(Ljava/lang/String;Ljava/util/ArrayList;)Landroid/content/Intent;\" since=\"8\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;B)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;C)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;D)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;F)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;I)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;J)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;Landroid/os/Parcelable;)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;Ljava/io/Serializable;)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;Ljava/lang/CharSequence;)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;S)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;Z)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;[B)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;[C)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;[D)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;[F)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;[I)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;[J)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;[Landroid/os/Parcelable;)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;[Ljava/lang/CharSequence;)Landroid/content/Intent;\" since=\"8\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;[Ljava/lang/String;)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;[S)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtra(Ljava/lang/String;[Z)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtras(Landroid/content/Intent;)Landroid/content/Intent;\"/>\n\t\t<method name=\"putExtras(Landroid/os/Bundle;)Landroid/content/Intent;\"/>\n\t\t<method name=\"putIntegerArrayListExtra(Ljava/lang/String;Ljava/util/ArrayList;)Landroid/content/Intent;\"/>\n\t\t<method name=\"putParcelableArrayListExtra(Ljava/lang/String;Ljava/util/ArrayList;)Landroid/content/Intent;\"/>\n\t\t<method name=\"putStringArrayListExtra(Ljava/lang/String;Ljava/util/ArrayList;)Landroid/content/Intent;\"/>\n\t\t<method name=\"readFromParcel(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"removeCategory(Ljava/lang/String;)V\"/>\n\t\t<method name=\"removeExtra(Ljava/lang/String;)V\"/>\n\t\t<method name=\"removeFlags(I)V\" since=\"26\"/>\n\t\t<method name=\"replaceExtras(Landroid/content/Intent;)Landroid/content/Intent;\" since=\"3\"/>\n\t\t<method name=\"replaceExtras(Landroid/os/Bundle;)Landroid/content/Intent;\" since=\"3\"/>\n\t\t<method name=\"resolveActivity(Landroid/content/pm/PackageManager;)Landroid/content/ComponentName;\"/>\n\t\t<method name=\"resolveActivityInfo(Landroid/content/pm/PackageManager;I)Landroid/content/pm/ActivityInfo;\"/>\n\t\t<method name=\"resolveType(Landroid/content/ContentResolver;)Ljava/lang/String;\"/>\n\t\t<method name=\"resolveType(Landroid/content/Context;)Ljava/lang/String;\"/>\n\t\t<method name=\"resolveTypeIfNeeded(Landroid/content/ContentResolver;)Ljava/lang/String;\"/>\n\t\t<method name=\"setAction(Ljava/lang/String;)Landroid/content/Intent;\"/>\n\t\t<method name=\"setClass(Landroid/content/Context;Ljava/lang/Class;)Landroid/content/Intent;\"/>\n\t\t<method name=\"setClassName(Landroid/content/Context;Ljava/lang/String;)Landroid/content/Intent;\"/>\n\t\t<method name=\"setClassName(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;\"/>\n\t\t<method name=\"setClipData(Landroid/content/ClipData;)V\" since=\"16\"/>\n\t\t<method name=\"setComponent(Landroid/content/ComponentName;)Landroid/content/Intent;\"/>\n\t\t<method name=\"setData(Landroid/net/Uri;)Landroid/content/Intent;\"/>\n\t\t<method name=\"setDataAndNormalize(Landroid/net/Uri;)Landroid/content/Intent;\" since=\"16\"/>\n\t\t<method name=\"setDataAndType(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/Intent;\"/>\n\t\t<method name=\"setDataAndTypeAndNormalize(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/Intent;\" since=\"16\"/>\n\t\t<method name=\"setExtrasClassLoader(Ljava/lang/ClassLoader;)V\"/>\n\t\t<method name=\"setFlags(I)Landroid/content/Intent;\"/>\n\t\t<method name=\"setIdentifier(Ljava/lang/String;)Landroid/content/Intent;\" since=\"29\"/>\n\t\t<method name=\"setPackage(Ljava/lang/String;)Landroid/content/Intent;\" since=\"4\"/>\n\t\t<method name=\"setSelector(Landroid/content/Intent;)V\" since=\"15\"/>\n\t\t<method name=\"setSourceBounds(Landroid/graphics/Rect;)V\" since=\"7\"/>\n\t\t<method name=\"setType(Ljava/lang/String;)Landroid/content/Intent;\"/>\n\t\t<method name=\"setTypeAndNormalize(Ljava/lang/String;)Landroid/content/Intent;\" since=\"16\"/>\n\t\t<method name=\"toURI()Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"toUri(I)Ljava/lang/String;\" since=\"4\"/>\n\t\t<field name=\"ACTION_AIRPLANE_MODE_CHANGED\"/>\n\t\t<field name=\"ACTION_ALL_APPS\"/>\n\t\t<field name=\"ACTION_ANSWER\"/>\n\t\t<field name=\"ACTION_APPLICATION_PREFERENCES\" since=\"24\"/>\n\t\t<field name=\"ACTION_APPLICATION_RESTRICTIONS_CHANGED\" since=\"21\"/>\n\t\t<field name=\"ACTION_APP_ERROR\" since=\"14\"/>\n\t\t<field name=\"ACTION_ASSIST\" since=\"16\"/>\n\t\t<field name=\"ACTION_ATTACH_DATA\"/>\n\t\t<field name=\"ACTION_BATTERY_CHANGED\"/>\n\t\t<field name=\"ACTION_BATTERY_LOW\"/>\n\t\t<field name=\"ACTION_BATTERY_OKAY\" since=\"4\"/>\n\t\t<field name=\"ACTION_BOOT_COMPLETED\"/>\n\t\t<field name=\"ACTION_BUG_REPORT\"/>\n\t\t<field name=\"ACTION_CALL\"/>\n\t\t<field name=\"ACTION_CALL_BUTTON\"/>\n\t\t<field name=\"ACTION_CAMERA_BUTTON\"/>\n\t\t<field name=\"ACTION_CARRIER_SETUP\" since=\"26\"/>\n\t\t<field name=\"ACTION_CHOOSER\"/>\n\t\t<field name=\"ACTION_CLOSE_SYSTEM_DIALOGS\"/>\n\t\t<field name=\"ACTION_CONFIGURATION_CHANGED\"/>\n\t\t<field name=\"ACTION_CREATE_DOCUMENT\" since=\"19\"/>\n\t\t<field name=\"ACTION_CREATE_SHORTCUT\"/>\n\t\t<field name=\"ACTION_DATE_CHANGED\"/>\n\t\t<field name=\"ACTION_DEFAULT\"/>\n\t\t<field name=\"ACTION_DEFINE\" since=\"29\"/>\n\t\t<field name=\"ACTION_DELETE\"/>\n\t\t<field name=\"ACTION_DEVICE_STORAGE_LOW\" deprecated=\"26\"/>\n\t\t<field name=\"ACTION_DEVICE_STORAGE_OK\" deprecated=\"26\"/>\n\t\t<field name=\"ACTION_DIAL\"/>\n\t\t<field name=\"ACTION_DOCK_EVENT\" since=\"5\"/>\n\t\t<field name=\"ACTION_DREAMING_STARTED\" since=\"17\"/>\n\t\t<field name=\"ACTION_DREAMING_STOPPED\" since=\"17\"/>\n\t\t<field name=\"ACTION_EDIT\"/>\n\t\t<field name=\"ACTION_EXTERNAL_APPLICATIONS_AVAILABLE\" since=\"8\"/>\n\t\t<field name=\"ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE\" since=\"8\"/>\n\t\t<field name=\"ACTION_FACTORY_TEST\"/>\n\t\t<field name=\"ACTION_GET_CONTENT\"/>\n\t\t<field name=\"ACTION_GET_RESTRICTION_ENTRIES\" since=\"18\"/>\n\t\t<field name=\"ACTION_GTALK_SERVICE_CONNECTED\"/>\n\t\t<field name=\"ACTION_GTALK_SERVICE_DISCONNECTED\"/>\n\t\t<field name=\"ACTION_HEADSET_PLUG\"/>\n\t\t<field name=\"ACTION_INPUT_METHOD_CHANGED\" since=\"3\"/>\n\t\t<field name=\"ACTION_INSERT\"/>\n\t\t<field name=\"ACTION_INSERT_OR_EDIT\"/>\n\t\t<field name=\"ACTION_INSTALL_FAILURE\" since=\"27\"/>\n\t\t<field name=\"ACTION_INSTALL_PACKAGE\" since=\"14\" deprecated=\"29\"/>\n\t\t<field name=\"ACTION_LOCALE_CHANGED\" since=\"7\"/>\n\t\t<field name=\"ACTION_LOCKED_BOOT_COMPLETED\" since=\"24\"/>\n\t\t<field name=\"ACTION_MAIN\"/>\n\t\t<field name=\"ACTION_MANAGED_PROFILE_ADDED\" since=\"21\"/>\n\t\t<field name=\"ACTION_MANAGED_PROFILE_AVAILABLE\" since=\"24\"/>\n\t\t<field name=\"ACTION_MANAGED_PROFILE_REMOVED\" since=\"21\"/>\n\t\t<field name=\"ACTION_MANAGED_PROFILE_UNAVAILABLE\" since=\"24\"/>\n\t\t<field name=\"ACTION_MANAGED_PROFILE_UNLOCKED\" since=\"24\"/>\n\t\t<field name=\"ACTION_MANAGE_NETWORK_USAGE\" since=\"14\"/>\n\t\t<field name=\"ACTION_MANAGE_PACKAGE_STORAGE\"/>\n\t\t<field name=\"ACTION_MEDIA_BAD_REMOVAL\"/>\n\t\t<field name=\"ACTION_MEDIA_BUTTON\"/>\n\t\t<field name=\"ACTION_MEDIA_CHECKING\" since=\"3\"/>\n\t\t<field name=\"ACTION_MEDIA_EJECT\"/>\n\t\t<field name=\"ACTION_MEDIA_MOUNTED\"/>\n\t\t<field name=\"ACTION_MEDIA_NOFS\" since=\"3\"/>\n\t\t<field name=\"ACTION_MEDIA_REMOVED\"/>\n\t\t<field name=\"ACTION_MEDIA_SCANNER_FINISHED\"/>\n\t\t<field name=\"ACTION_MEDIA_SCANNER_SCAN_FILE\" deprecated=\"29\"/>\n\t\t<field name=\"ACTION_MEDIA_SCANNER_STARTED\"/>\n\t\t<field name=\"ACTION_MEDIA_SHARED\"/>\n\t\t<field name=\"ACTION_MEDIA_UNMOUNTABLE\"/>\n\t\t<field name=\"ACTION_MEDIA_UNMOUNTED\"/>\n\t\t<field name=\"ACTION_MY_PACKAGE_REPLACED\" since=\"12\"/>\n\t\t<field name=\"ACTION_MY_PACKAGE_SUSPENDED\" since=\"28\"/>\n\t\t<field name=\"ACTION_MY_PACKAGE_UNSUSPENDED\" since=\"28\"/>\n\t\t<field name=\"ACTION_NEW_OUTGOING_CALL\" deprecated=\"29\"/>\n\t\t<field name=\"ACTION_OPEN_DOCUMENT\" since=\"19\"/>\n\t\t<field name=\"ACTION_OPEN_DOCUMENT_TREE\" since=\"21\"/>\n\t\t<field name=\"ACTION_PACKAGES_SUSPENDED\" since=\"24\"/>\n\t\t<field name=\"ACTION_PACKAGES_UNSUSPENDED\" since=\"24\"/>\n\t\t<field name=\"ACTION_PACKAGE_ADDED\"/>\n\t\t<field name=\"ACTION_PACKAGE_CHANGED\"/>\n\t\t<field name=\"ACTION_PACKAGE_DATA_CLEARED\" since=\"3\"/>\n\t\t<field name=\"ACTION_PACKAGE_FIRST_LAUNCH\" since=\"12\"/>\n\t\t<field name=\"ACTION_PACKAGE_FULLY_REMOVED\" since=\"14\"/>\n\t\t<field name=\"ACTION_PACKAGE_INSTALL\" deprecated=\"15\"/>\n\t\t<field name=\"ACTION_PACKAGE_NEEDS_VERIFICATION\" since=\"14\"/>\n\t\t<field name=\"ACTION_PACKAGE_REMOVED\"/>\n\t\t<field name=\"ACTION_PACKAGE_REPLACED\" since=\"3\"/>\n\t\t<field name=\"ACTION_PACKAGE_RESTARTED\"/>\n\t\t<field name=\"ACTION_PACKAGE_VERIFIED\" since=\"17\"/>\n\t\t<field name=\"ACTION_PASTE\" since=\"11\"/>\n\t\t<field name=\"ACTION_PICK\"/>\n\t\t<field name=\"ACTION_PICK_ACTIVITY\"/>\n\t\t<field name=\"ACTION_POWER_CONNECTED\" since=\"4\"/>\n\t\t<field name=\"ACTION_POWER_DISCONNECTED\" since=\"4\"/>\n\t\t<field name=\"ACTION_POWER_USAGE_SUMMARY\" since=\"4\"/>\n\t\t<field name=\"ACTION_PROCESS_TEXT\" since=\"23\"/>\n\t\t<field name=\"ACTION_PROVIDER_CHANGED\"/>\n\t\t<field name=\"ACTION_QUICK_CLOCK\" since=\"17\"/>\n\t\t<field name=\"ACTION_QUICK_VIEW\" since=\"24\"/>\n\t\t<field name=\"ACTION_REBOOT\"/>\n\t\t<field name=\"ACTION_RUN\"/>\n\t\t<field name=\"ACTION_SCREEN_OFF\"/>\n\t\t<field name=\"ACTION_SCREEN_ON\"/>\n\t\t<field name=\"ACTION_SEARCH\"/>\n\t\t<field name=\"ACTION_SEARCH_LONG_PRESS\" since=\"3\"/>\n\t\t<field name=\"ACTION_SEND\"/>\n\t\t<field name=\"ACTION_SENDTO\"/>\n\t\t<field name=\"ACTION_SEND_MULTIPLE\" since=\"4\"/>\n\t\t<field name=\"ACTION_SET_WALLPAPER\"/>\n\t\t<field name=\"ACTION_SHOW_APP_INFO\" since=\"24\"/>\n\t\t<field name=\"ACTION_SHUTDOWN\" since=\"4\"/>\n\t\t<field name=\"ACTION_SYNC\"/>\n\t\t<field name=\"ACTION_SYSTEM_TUTORIAL\" since=\"3\"/>\n\t\t<field name=\"ACTION_TIMEZONE_CHANGED\"/>\n\t\t<field name=\"ACTION_TIME_CHANGED\"/>\n\t\t<field name=\"ACTION_TIME_TICK\"/>\n\t\t<field name=\"ACTION_TRANSLATE\" since=\"29\"/>\n\t\t<field name=\"ACTION_UID_REMOVED\"/>\n\t\t<field name=\"ACTION_UMS_CONNECTED\" deprecated=\"15\"/>\n\t\t<field name=\"ACTION_UMS_DISCONNECTED\" deprecated=\"15\"/>\n\t\t<field name=\"ACTION_UNINSTALL_PACKAGE\" since=\"14\" deprecated=\"29\"/>\n\t\t<field name=\"ACTION_USER_BACKGROUND\" since=\"17\"/>\n\t\t<field name=\"ACTION_USER_FOREGROUND\" since=\"17\"/>\n\t\t<field name=\"ACTION_USER_INITIALIZE\" since=\"17\"/>\n\t\t<field name=\"ACTION_USER_PRESENT\" since=\"3\"/>\n\t\t<field name=\"ACTION_USER_UNLOCKED\" since=\"24\"/>\n\t\t<field name=\"ACTION_VIEW\"/>\n\t\t<field name=\"ACTION_VIEW_LOCUS\" since=\"29\"/>\n\t\t<field name=\"ACTION_VIEW_PERMISSION_USAGE\" since=\"29\"/>\n\t\t<field name=\"ACTION_VOICE_COMMAND\"/>\n\t\t<field name=\"ACTION_WALLPAPER_CHANGED\" deprecated=\"16\"/>\n\t\t<field name=\"ACTION_WEB_SEARCH\"/>\n\t\t<field name=\"CATEGORY_ALTERNATIVE\"/>\n\t\t<field name=\"CATEGORY_APP_BROWSER\" since=\"15\"/>\n\t\t<field name=\"CATEGORY_APP_CALCULATOR\" since=\"15\"/>\n\t\t<field name=\"CATEGORY_APP_CALENDAR\" since=\"15\"/>\n\t\t<field name=\"CATEGORY_APP_CONTACTS\" since=\"15\"/>\n\t\t<field name=\"CATEGORY_APP_EMAIL\" since=\"15\"/>\n\t\t<field name=\"CATEGORY_APP_FILES\" since=\"29\"/>\n\t\t<field name=\"CATEGORY_APP_GALLERY\" since=\"15\"/>\n\t\t<field name=\"CATEGORY_APP_MAPS\" since=\"15\"/>\n\t\t<field name=\"CATEGORY_APP_MARKET\" since=\"11\"/>\n\t\t<field name=\"CATEGORY_APP_MESSAGING\" since=\"15\"/>\n\t\t<field name=\"CATEGORY_APP_MUSIC\" since=\"15\"/>\n\t\t<field name=\"CATEGORY_BROWSABLE\"/>\n\t\t<field name=\"CATEGORY_CAR_DOCK\" since=\"5\"/>\n\t\t<field name=\"CATEGORY_CAR_MODE\" since=\"8\"/>\n\t\t<field name=\"CATEGORY_DEFAULT\"/>\n\t\t<field name=\"CATEGORY_DESK_DOCK\" since=\"5\"/>\n\t\t<field name=\"CATEGORY_DEVELOPMENT_PREFERENCE\"/>\n\t\t<field name=\"CATEGORY_EMBED\"/>\n\t\t<field name=\"CATEGORY_FRAMEWORK_INSTRUMENTATION_TEST\"/>\n\t\t<field name=\"CATEGORY_GADGET\" removed=\"3\"/>\n\t\t<field name=\"CATEGORY_HE_DESK_DOCK\" since=\"11\"/>\n\t\t<field name=\"CATEGORY_HOME\"/>\n\t\t<field name=\"CATEGORY_INFO\" since=\"3\"/>\n\t\t<field name=\"CATEGORY_LAUNCHER\"/>\n\t\t<field name=\"CATEGORY_LEANBACK_LAUNCHER\" since=\"21\"/>\n\t\t<field name=\"CATEGORY_LE_DESK_DOCK\" since=\"11\"/>\n\t\t<field name=\"CATEGORY_MONKEY\"/>\n\t\t<field name=\"CATEGORY_OPENABLE\"/>\n\t\t<field name=\"CATEGORY_PREFERENCE\"/>\n\t\t<field name=\"CATEGORY_SAMPLE_CODE\"/>\n\t\t<field name=\"CATEGORY_SECONDARY_HOME\" since=\"29\"/>\n\t\t<field name=\"CATEGORY_SELECTED_ALTERNATIVE\"/>\n\t\t<field name=\"CATEGORY_TAB\"/>\n\t\t<field name=\"CATEGORY_TEST\"/>\n\t\t<field name=\"CATEGORY_TYPED_OPENABLE\" since=\"26\"/>\n\t\t<field name=\"CATEGORY_UNIT_TEST\"/>\n\t\t<field name=\"CATEGORY_VOICE\" since=\"23\"/>\n\t\t<field name=\"CATEGORY_VR_HOME\" since=\"26\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"EXTRA_ALARM_COUNT\"/>\n\t\t<field name=\"EXTRA_ALLOW_MULTIPLE\" since=\"18\"/>\n\t\t<field name=\"EXTRA_ALLOW_REPLACE\" since=\"14\" deprecated=\"16\"/>\n\t\t<field name=\"EXTRA_ALTERNATE_INTENTS\" since=\"23\"/>\n\t\t<field name=\"EXTRA_ASSIST_CONTEXT\" since=\"18\"/>\n\t\t<field name=\"EXTRA_ASSIST_INPUT_DEVICE_ID\" since=\"23\"/>\n\t\t<field name=\"EXTRA_ASSIST_INPUT_HINT_KEYBOARD\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ASSIST_PACKAGE\" since=\"18\"/>\n\t\t<field name=\"EXTRA_ASSIST_UID\" since=\"23\"/>\n\t\t<field name=\"EXTRA_AUTO_LAUNCH_SINGLE_CHOICE\" since=\"29\"/>\n\t\t<field name=\"EXTRA_BCC\"/>\n\t\t<field name=\"EXTRA_BUG_REPORT\" since=\"14\"/>\n\t\t<field name=\"EXTRA_CC\"/>\n\t\t<field name=\"EXTRA_CHANGED_COMPONENT_NAME\" since=\"5\" deprecated=\"15\"/>\n\t\t<field name=\"EXTRA_CHANGED_COMPONENT_NAME_LIST\" since=\"7\"/>\n\t\t<field name=\"EXTRA_CHANGED_PACKAGE_LIST\" since=\"8\"/>\n\t\t<field name=\"EXTRA_CHANGED_UID_LIST\" since=\"8\"/>\n\t\t<field name=\"EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER\" since=\"23\"/>\n\t\t<field name=\"EXTRA_CHOOSER_TARGETS\" since=\"24\"/>\n\t\t<field name=\"EXTRA_CHOSEN_COMPONENT\" since=\"22\"/>\n\t\t<field name=\"EXTRA_CHOSEN_COMPONENT_INTENT_SENDER\" since=\"22\"/>\n\t\t<field name=\"EXTRA_COMPONENT_NAME\" since=\"26\"/>\n\t\t<field name=\"EXTRA_CONTENT_ANNOTATIONS\" since=\"26\"/>\n\t\t<field name=\"EXTRA_CONTENT_QUERY\" since=\"29\"/>\n\t\t<field name=\"EXTRA_DATA_REMOVED\" since=\"3\"/>\n\t\t<field name=\"EXTRA_DOCK_STATE\" since=\"5\"/>\n\t\t<field name=\"EXTRA_DOCK_STATE_CAR\" since=\"5\"/>\n\t\t<field name=\"EXTRA_DOCK_STATE_DESK\" since=\"5\"/>\n\t\t<field name=\"EXTRA_DOCK_STATE_HE_DESK\" since=\"11\"/>\n\t\t<field name=\"EXTRA_DOCK_STATE_LE_DESK\" since=\"11\"/>\n\t\t<field name=\"EXTRA_DOCK_STATE_UNDOCKED\" since=\"5\"/>\n\t\t<field name=\"EXTRA_DONT_KILL_APP\"/>\n\t\t<field name=\"EXTRA_DURATION_MILLIS\" since=\"29\"/>\n\t\t<field name=\"EXTRA_EMAIL\"/>\n\t\t<field name=\"EXTRA_EXCLUDE_COMPONENTS\" since=\"24\"/>\n\t\t<field name=\"EXTRA_FROM_STORAGE\" since=\"26\"/>\n\t\t<field name=\"EXTRA_HTML_TEXT\" since=\"16\"/>\n\t\t<field name=\"EXTRA_INDEX\" since=\"24\"/>\n\t\t<field name=\"EXTRA_INITIAL_INTENTS\" since=\"5\"/>\n\t\t<field name=\"EXTRA_INSTALLER_PACKAGE_NAME\" since=\"14\"/>\n\t\t<field name=\"EXTRA_INTENT\"/>\n\t\t<field name=\"EXTRA_KEY_EVENT\"/>\n\t\t<field name=\"EXTRA_LOCAL_ONLY\" since=\"11\"/>\n\t\t<field name=\"EXTRA_LOCUS_ID\" since=\"29\"/>\n\t\t<field name=\"EXTRA_MIME_TYPES\" since=\"19\"/>\n\t\t<field name=\"EXTRA_NOT_UNKNOWN_SOURCE\" since=\"14\"/>\n\t\t<field name=\"EXTRA_ORIGINATING_URI\" since=\"17\"/>\n\t\t<field name=\"EXTRA_PACKAGE_NAME\" since=\"24\"/>\n\t\t<field name=\"EXTRA_PHONE_NUMBER\"/>\n\t\t<field name=\"EXTRA_PROCESS_TEXT\" since=\"23\"/>\n\t\t<field name=\"EXTRA_PROCESS_TEXT_READONLY\" since=\"23\"/>\n\t\t<field name=\"EXTRA_QUICK_VIEW_FEATURES\" since=\"26\"/>\n\t\t<field name=\"EXTRA_QUIET_MODE\" since=\"24\"/>\n\t\t<field name=\"EXTRA_REFERRER\" since=\"17\"/>\n\t\t<field name=\"EXTRA_REFERRER_NAME\" since=\"22\"/>\n\t\t<field name=\"EXTRA_REMOTE_INTENT_TOKEN\" since=\"5\"/>\n\t\t<field name=\"EXTRA_REPLACEMENT_EXTRAS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_REPLACING\" since=\"3\"/>\n\t\t<field name=\"EXTRA_RESTRICTIONS_BUNDLE\" since=\"18\"/>\n\t\t<field name=\"EXTRA_RESTRICTIONS_INTENT\" since=\"18\"/>\n\t\t<field name=\"EXTRA_RESTRICTIONS_LIST\" since=\"18\"/>\n\t\t<field name=\"EXTRA_RESULT_RECEIVER\" since=\"23\"/>\n\t\t<field name=\"EXTRA_RETURN_RESULT\" since=\"14\"/>\n\t\t<field name=\"EXTRA_SHORTCUT_ICON\" deprecated=\"26\"/>\n\t\t<field name=\"EXTRA_SHORTCUT_ICON_RESOURCE\" deprecated=\"26\"/>\n\t\t<field name=\"EXTRA_SHORTCUT_ID\" since=\"29\"/>\n\t\t<field name=\"EXTRA_SHORTCUT_INTENT\" deprecated=\"26\"/>\n\t\t<field name=\"EXTRA_SHORTCUT_NAME\" deprecated=\"26\"/>\n\t\t<field name=\"EXTRA_SHUTDOWN_USERSPACE_ONLY\" since=\"19\"/>\n\t\t<field name=\"EXTRA_SPLIT_NAME\" since=\"27\"/>\n\t\t<field name=\"EXTRA_STREAM\"/>\n\t\t<field name=\"EXTRA_SUBJECT\"/>\n\t\t<field name=\"EXTRA_SUSPENDED_PACKAGE_EXTRAS\" since=\"28\"/>\n\t\t<field name=\"EXTRA_TEMPLATE\"/>\n\t\t<field name=\"EXTRA_TEXT\"/>\n\t\t<field name=\"EXTRA_TITLE\"/>\n\t\t<field name=\"EXTRA_UID\"/>\n\t\t<field name=\"EXTRA_USER\" since=\"21\"/>\n\t\t<field name=\"FILL_IN_ACTION\"/>\n\t\t<field name=\"FILL_IN_CATEGORIES\"/>\n\t\t<field name=\"FILL_IN_CLIP_DATA\" since=\"16\"/>\n\t\t<field name=\"FILL_IN_COMPONENT\"/>\n\t\t<field name=\"FILL_IN_DATA\"/>\n\t\t<field name=\"FILL_IN_IDENTIFIER\" since=\"29\"/>\n\t\t<field name=\"FILL_IN_PACKAGE\" since=\"4\"/>\n\t\t<field name=\"FILL_IN_SELECTOR\" since=\"15\"/>\n\t\t<field name=\"FILL_IN_SOURCE_BOUNDS\" since=\"7\"/>\n\t\t<field name=\"FLAG_ACTIVITY_BROUGHT_TO_FRONT\"/>\n\t\t<field name=\"FLAG_ACTIVITY_CLEAR_TASK\" since=\"11\"/>\n\t\t<field name=\"FLAG_ACTIVITY_CLEAR_TOP\"/>\n\t\t<field name=\"FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET\" since=\"3\" deprecated=\"21\"/>\n\t\t<field name=\"FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS\"/>\n\t\t<field name=\"FLAG_ACTIVITY_FORWARD_RESULT\"/>\n\t\t<field name=\"FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY\"/>\n\t\t<field name=\"FLAG_ACTIVITY_LAUNCH_ADJACENT\" since=\"24\"/>\n\t\t<field name=\"FLAG_ACTIVITY_MATCH_EXTERNAL\" since=\"28\"/>\n\t\t<field name=\"FLAG_ACTIVITY_MULTIPLE_TASK\"/>\n\t\t<field name=\"FLAG_ACTIVITY_NEW_DOCUMENT\" since=\"21\"/>\n\t\t<field name=\"FLAG_ACTIVITY_NEW_TASK\"/>\n\t\t<field name=\"FLAG_ACTIVITY_NO_ANIMATION\" since=\"5\"/>\n\t\t<field name=\"FLAG_ACTIVITY_NO_HISTORY\"/>\n\t\t<field name=\"FLAG_ACTIVITY_NO_USER_ACTION\" since=\"3\"/>\n\t\t<field name=\"FLAG_ACTIVITY_PREVIOUS_IS_TOP\"/>\n\t\t<field name=\"FLAG_ACTIVITY_REORDER_TO_FRONT\" since=\"3\"/>\n\t\t<field name=\"FLAG_ACTIVITY_RESET_TASK_IF_NEEDED\"/>\n\t\t<field name=\"FLAG_ACTIVITY_RETAIN_IN_RECENTS\" since=\"21\"/>\n\t\t<field name=\"FLAG_ACTIVITY_SINGLE_TOP\"/>\n\t\t<field name=\"FLAG_ACTIVITY_TASK_ON_HOME\" since=\"11\"/>\n\t\t<field name=\"FLAG_DEBUG_LOG_RESOLUTION\"/>\n\t\t<field name=\"FLAG_DIRECT_BOOT_AUTO\" since=\"29\"/>\n\t\t<field name=\"FLAG_EXCLUDE_STOPPED_PACKAGES\" since=\"12\"/>\n\t\t<field name=\"FLAG_FROM_BACKGROUND\"/>\n\t\t<field name=\"FLAG_GRANT_PERSISTABLE_URI_PERMISSION\" since=\"19\"/>\n\t\t<field name=\"FLAG_GRANT_PREFIX_URI_PERMISSION\" since=\"21\"/>\n\t\t<field name=\"FLAG_GRANT_READ_URI_PERMISSION\"/>\n\t\t<field name=\"FLAG_GRANT_WRITE_URI_PERMISSION\"/>\n\t\t<field name=\"FLAG_INCLUDE_STOPPED_PACKAGES\" since=\"12\"/>\n\t\t<field name=\"FLAG_RECEIVER_FOREGROUND\" since=\"16\"/>\n\t\t<field name=\"FLAG_RECEIVER_NO_ABORT\" since=\"19\"/>\n\t\t<field name=\"FLAG_RECEIVER_REGISTERED_ONLY\"/>\n\t\t<field name=\"FLAG_RECEIVER_REPLACE_PENDING\" since=\"8\"/>\n\t\t<field name=\"FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS\" since=\"26\"/>\n\t\t<field name=\"METADATA_DOCK_HOME\" since=\"5\"/>\n\t\t<field name=\"URI_ALLOW_UNSAFE\" since=\"22\"/>\n\t\t<field name=\"URI_ANDROID_APP_SCHEME\" since=\"22\"/>\n\t\t<field name=\"URI_INTENT_SCHEME\" since=\"4\"/>\n\t</class>\n\t<class name=\"android/content/Intent$FilterComparison\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Intent;)V\"/>\n\t\t<method name=\"getIntent()Landroid/content/Intent;\"/>\n\t</class>\n\t<class name=\"android/content/Intent$ShortcutIconResource\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"fromContext(Landroid/content/Context;I)Landroid/content/Intent$ShortcutIconResource;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"packageName\"/>\n\t\t<field name=\"resourceName\"/>\n\t</class>\n\t<class name=\"android/content/IntentFilter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/IntentFilter;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"actionsIterator()Ljava/util/Iterator;\"/>\n\t\t<method name=\"addAction(Ljava/lang/String;)V\"/>\n\t\t<method name=\"addCategory(Ljava/lang/String;)V\"/>\n\t\t<method name=\"addDataAuthority(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"addDataPath(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"addDataScheme(Ljava/lang/String;)V\"/>\n\t\t<method name=\"addDataSchemeSpecificPart(Ljava/lang/String;I)V\" since=\"19\"/>\n\t\t<method name=\"addDataType(Ljava/lang/String;)V\"/>\n\t\t<method name=\"authoritiesIterator()Ljava/util/Iterator;\"/>\n\t\t<method name=\"categoriesIterator()Ljava/util/Iterator;\"/>\n\t\t<method name=\"countActions()I\"/>\n\t\t<method name=\"countCategories()I\"/>\n\t\t<method name=\"countDataAuthorities()I\"/>\n\t\t<method name=\"countDataPaths()I\"/>\n\t\t<method name=\"countDataSchemeSpecificParts()I\" since=\"19\"/>\n\t\t<method name=\"countDataSchemes()I\"/>\n\t\t<method name=\"countDataTypes()I\"/>\n\t\t<method name=\"create(Ljava/lang/String;Ljava/lang/String;)Landroid/content/IntentFilter;\"/>\n\t\t<method name=\"dump(Landroid/util/Printer;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getAction(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getCategory(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getDataAuthority(I)Landroid/content/IntentFilter$AuthorityEntry;\"/>\n\t\t<method name=\"getDataPath(I)Landroid/os/PatternMatcher;\"/>\n\t\t<method name=\"getDataScheme(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getDataSchemeSpecificPart(I)Landroid/os/PatternMatcher;\" since=\"19\"/>\n\t\t<method name=\"getDataType(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getPriority()I\"/>\n\t\t<method name=\"hasAction(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"hasCategory(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"hasDataAuthority(Landroid/net/Uri;)Z\"/>\n\t\t<method name=\"hasDataPath(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"hasDataScheme(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"hasDataSchemeSpecificPart(Ljava/lang/String;)Z\" since=\"19\"/>\n\t\t<method name=\"hasDataType(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"match(Landroid/content/ContentResolver;Landroid/content/Intent;ZLjava/lang/String;)I\"/>\n\t\t<method name=\"match(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;Ljava/util/Set;Ljava/lang/String;)I\"/>\n\t\t<method name=\"matchAction(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"matchCategories(Ljava/util/Set;)Ljava/lang/String;\"/>\n\t\t<method name=\"matchData(Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;)I\"/>\n\t\t<method name=\"matchDataAuthority(Landroid/net/Uri;)I\"/>\n\t\t<method name=\"pathsIterator()Ljava/util/Iterator;\"/>\n\t\t<method name=\"readFromXml(Lorg/xmlpull/v1/XmlPullParser;)V\"/>\n\t\t<method name=\"schemeSpecificPartsIterator()Ljava/util/Iterator;\" since=\"19\"/>\n\t\t<method name=\"schemesIterator()Ljava/util/Iterator;\"/>\n\t\t<method name=\"setPriority(I)V\"/>\n\t\t<method name=\"typesIterator()Ljava/util/Iterator;\"/>\n\t\t<method name=\"writeToXml(Lorg/xmlpull/v1/XmlSerializer;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"MATCH_ADJUSTMENT_MASK\"/>\n\t\t<field name=\"MATCH_ADJUSTMENT_NORMAL\"/>\n\t\t<field name=\"MATCH_CATEGORY_EMPTY\"/>\n\t\t<field name=\"MATCH_CATEGORY_HOST\"/>\n\t\t<field name=\"MATCH_CATEGORY_MASK\"/>\n\t\t<field name=\"MATCH_CATEGORY_PATH\"/>\n\t\t<field name=\"MATCH_CATEGORY_PORT\"/>\n\t\t<field name=\"MATCH_CATEGORY_SCHEME\"/>\n\t\t<field name=\"MATCH_CATEGORY_SCHEME_SPECIFIC_PART\" since=\"19\"/>\n\t\t<field name=\"MATCH_CATEGORY_TYPE\"/>\n\t\t<field name=\"NO_MATCH_ACTION\"/>\n\t\t<field name=\"NO_MATCH_CATEGORY\"/>\n\t\t<field name=\"NO_MATCH_DATA\"/>\n\t\t<field name=\"NO_MATCH_TYPE\"/>\n\t\t<field name=\"SYSTEM_HIGH_PRIORITY\"/>\n\t\t<field name=\"SYSTEM_LOW_PRIORITY\"/>\n\t</class>\n\t<class name=\"android/content/IntentFilter$AuthorityEntry\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getHost()Ljava/lang/String;\"/>\n\t\t<method name=\"getPort()I\"/>\n\t\t<method name=\"match(Landroid/net/Uri;)I\"/>\n\t</class>\n\t<class name=\"android/content/IntentFilter$MalformedMimeTypeException\" since=\"1\">\n\t\t<extends name=\"android/util/AndroidException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/content/IntentSender\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getCreatorPackage()Ljava/lang/String;\" since=\"17\"/>\n\t\t<method name=\"getCreatorUid()I\" since=\"17\"/>\n\t\t<method name=\"getCreatorUserHandle()Landroid/os/UserHandle;\" since=\"17\"/>\n\t\t<method name=\"getTargetPackage()Ljava/lang/String;\" since=\"9\" deprecated=\"17\"/>\n\t\t<method name=\"readIntentSenderOrNullFromParcel(Landroid/os/Parcel;)Landroid/content/IntentSender;\"/>\n\t\t<method name=\"sendIntent(Landroid/content/Context;ILandroid/content/Intent;Landroid/content/IntentSender$OnFinished;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"sendIntent(Landroid/content/Context;ILandroid/content/Intent;Landroid/content/IntentSender$OnFinished;Landroid/os/Handler;Ljava/lang/String;)V\" since=\"14\"/>\n\t\t<method name=\"writeIntentSenderOrNullToParcel(Landroid/content/IntentSender;Landroid/os/Parcel;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/content/IntentSender$OnFinished\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onSendFinished(Landroid/content/IntentSender;Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;)V\"/>\n\t</class>\n\t<class name=\"android/content/IntentSender$SendIntentException\" since=\"4\">\n\t\t<extends name=\"android/util/AndroidException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Exception;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/content/Loader\" since=\"11\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"abandon()V\" deprecated=\"29\"/>\n\t\t<method name=\"cancelLoad()Z\" since=\"16\" deprecated=\"29\"/>\n\t\t<method name=\"commitContentChanged()V\" since=\"18\" deprecated=\"29\"/>\n\t\t<method name=\"dataToString(Ljava/lang/Object;)Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"deliverCancellation()V\" since=\"16\" deprecated=\"29\"/>\n\t\t<method name=\"deliverResult(Ljava/lang/Object;)V\" deprecated=\"29\"/>\n\t\t<method name=\"dump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"forceLoad()V\" deprecated=\"29\"/>\n\t\t<method name=\"getContext()Landroid/content/Context;\" deprecated=\"29\"/>\n\t\t<method name=\"getId()I\" deprecated=\"29\"/>\n\t\t<method name=\"isAbandoned()Z\" deprecated=\"29\"/>\n\t\t<method name=\"isReset()Z\" deprecated=\"29\"/>\n\t\t<method name=\"isStarted()Z\" deprecated=\"29\"/>\n\t\t<method name=\"onAbandon()V\" deprecated=\"29\"/>\n\t\t<method name=\"onCancelLoad()Z\" since=\"16\" deprecated=\"29\"/>\n\t\t<method name=\"onContentChanged()V\" deprecated=\"29\"/>\n\t\t<method name=\"onForceLoad()V\" deprecated=\"29\"/>\n\t\t<method name=\"onReset()V\" deprecated=\"29\"/>\n\t\t<method name=\"onStartLoading()V\" deprecated=\"29\"/>\n\t\t<method name=\"onStopLoading()V\" deprecated=\"29\"/>\n\t\t<method name=\"registerListener(ILandroid/content/Loader$OnLoadCompleteListener;)V\" deprecated=\"29\"/>\n\t\t<method name=\"registerOnLoadCanceledListener(Landroid/content/Loader$OnLoadCanceledListener;)V\" since=\"16\" deprecated=\"29\"/>\n\t\t<method name=\"reset()V\" deprecated=\"29\"/>\n\t\t<method name=\"rollbackContentChanged()V\" since=\"18\" deprecated=\"29\"/>\n\t\t<method name=\"startLoading()V\" deprecated=\"29\"/>\n\t\t<method name=\"stopLoading()V\" deprecated=\"29\"/>\n\t\t<method name=\"takeContentChanged()Z\" deprecated=\"29\"/>\n\t\t<method name=\"unregisterListener(Landroid/content/Loader$OnLoadCompleteListener;)V\" deprecated=\"29\"/>\n\t\t<method name=\"unregisterOnLoadCanceledListener(Landroid/content/Loader$OnLoadCanceledListener;)V\" since=\"16\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/content/Loader$ForceLoadContentObserver\" since=\"11\" deprecated=\"28\">\n\t\t<extends name=\"android/database/ContentObserver\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Loader;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/content/Loader$OnLoadCanceledListener\" since=\"16\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onLoadCanceled(Landroid/content/Loader;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/content/Loader$OnLoadCompleteListener\" since=\"11\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onLoadComplete(Landroid/content/Loader;Ljava/lang/Object;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/content/LocusId\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/content/MutableContextWrapper\" since=\"1\">\n\t\t<extends name=\"android/content/ContextWrapper\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"setBaseContext(Landroid/content/Context;)V\"/>\n\t</class>\n\t<class name=\"android/content/OperationApplicationException\" since=\"5\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"getNumSuccessfulYieldPoints()I\"/>\n\t</class>\n\t<class name=\"android/content/PeriodicSync\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;J)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"account\"/>\n\t\t<field name=\"authority\"/>\n\t\t<field name=\"extras\"/>\n\t\t<field name=\"period\"/>\n\t</class>\n\t<class name=\"android/content/QuickViewConstants\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"FEATURE_DELETE\" since=\"28\"/>\n\t\t<field name=\"FEATURE_DOWNLOAD\"/>\n\t\t<field name=\"FEATURE_EDIT\"/>\n\t\t<field name=\"FEATURE_PRINT\"/>\n\t\t<field name=\"FEATURE_SEND\"/>\n\t\t<field name=\"FEATURE_VIEW\"/>\n\t</class>\n\t<class name=\"android/content/ReceiverCallNotAllowedException\" since=\"1\">\n\t\t<extends name=\"android/util/AndroidRuntimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/content/RestrictionEntry\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/String;)V\" since=\"21\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\" since=\"21\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;[Ljava/lang/String;)V\"/>\n\t\t<method name=\"createBundleArrayEntry(Ljava/lang/String;[Landroid/content/RestrictionEntry;)Landroid/content/RestrictionEntry;\" since=\"23\"/>\n\t\t<method name=\"createBundleEntry(Ljava/lang/String;[Landroid/content/RestrictionEntry;)Landroid/content/RestrictionEntry;\" since=\"23\"/>\n\t\t<method name=\"getAllSelectedStrings()[Ljava/lang/String;\"/>\n\t\t<method name=\"getChoiceEntries()[Ljava/lang/String;\"/>\n\t\t<method name=\"getChoiceValues()[Ljava/lang/String;\"/>\n\t\t<method name=\"getDescription()Ljava/lang/String;\"/>\n\t\t<method name=\"getIntValue()I\" since=\"21\"/>\n\t\t<method name=\"getKey()Ljava/lang/String;\"/>\n\t\t<method name=\"getRestrictions()[Landroid/content/RestrictionEntry;\" since=\"23\"/>\n\t\t<method name=\"getSelectedState()Z\"/>\n\t\t<method name=\"getSelectedString()Ljava/lang/String;\"/>\n\t\t<method name=\"getTitle()Ljava/lang/String;\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<method name=\"setAllSelectedStrings([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setChoiceEntries(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"setChoiceEntries([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setChoiceValues(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"setChoiceValues([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setDescription(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setIntValue(I)V\" since=\"21\"/>\n\t\t<method name=\"setRestrictions([Landroid/content/RestrictionEntry;)V\" since=\"23\"/>\n\t\t<method name=\"setSelectedState(Z)V\"/>\n\t\t<method name=\"setSelectedString(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setTitle(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setType(I)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"TYPE_BOOLEAN\"/>\n\t\t<field name=\"TYPE_BUNDLE\" since=\"23\"/>\n\t\t<field name=\"TYPE_BUNDLE_ARRAY\" since=\"23\"/>\n\t\t<field name=\"TYPE_CHOICE\"/>\n\t\t<field name=\"TYPE_INTEGER\" since=\"21\"/>\n\t\t<field name=\"TYPE_MULTI_SELECT\"/>\n\t\t<field name=\"TYPE_NULL\"/>\n\t\t<field name=\"TYPE_STRING\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/content/RestrictionsManager\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"convertRestrictionsToBundle(Ljava/util/List;)Landroid/os/Bundle;\" since=\"23\"/>\n\t\t<method name=\"createLocalApprovalIntent()Landroid/content/Intent;\"/>\n\t\t<method name=\"getApplicationRestrictions()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getManifestRestrictions(Ljava/lang/String;)Ljava/util/List;\"/>\n\t\t<method name=\"hasRestrictionsProvider()Z\"/>\n\t\t<method name=\"notifyPermissionResponse(Ljava/lang/String;Landroid/os/PersistableBundle;)V\"/>\n\t\t<method name=\"requestPermission(Ljava/lang/String;Ljava/lang/String;Landroid/os/PersistableBundle;)V\"/>\n\t\t<field name=\"ACTION_PERMISSION_RESPONSE_RECEIVED\"/>\n\t\t<field name=\"ACTION_REQUEST_LOCAL_APPROVAL\"/>\n\t\t<field name=\"ACTION_REQUEST_PERMISSION\"/>\n\t\t<field name=\"EXTRA_PACKAGE_NAME\"/>\n\t\t<field name=\"EXTRA_REQUEST_BUNDLE\"/>\n\t\t<field name=\"EXTRA_REQUEST_ID\"/>\n\t\t<field name=\"EXTRA_REQUEST_TYPE\"/>\n\t\t<field name=\"EXTRA_RESPONSE_BUNDLE\"/>\n\t\t<field name=\"META_DATA_APP_RESTRICTIONS\"/>\n\t\t<field name=\"REQUEST_KEY_APPROVE_LABEL\"/>\n\t\t<field name=\"REQUEST_KEY_DATA\"/>\n\t\t<field name=\"REQUEST_KEY_DENY_LABEL\"/>\n\t\t<field name=\"REQUEST_KEY_ICON\"/>\n\t\t<field name=\"REQUEST_KEY_ID\"/>\n\t\t<field name=\"REQUEST_KEY_MESSAGE\"/>\n\t\t<field name=\"REQUEST_KEY_NEW_REQUEST\"/>\n\t\t<field name=\"REQUEST_KEY_TITLE\"/>\n\t\t<field name=\"REQUEST_TYPE_APPROVAL\"/>\n\t\t<field name=\"RESPONSE_KEY_ERROR_CODE\"/>\n\t\t<field name=\"RESPONSE_KEY_MESSAGE\"/>\n\t\t<field name=\"RESPONSE_KEY_RESPONSE_TIMESTAMP\"/>\n\t\t<field name=\"RESPONSE_KEY_RESULT\"/>\n\t\t<field name=\"RESULT_APPROVED\"/>\n\t\t<field name=\"RESULT_DENIED\"/>\n\t\t<field name=\"RESULT_ERROR\"/>\n\t\t<field name=\"RESULT_ERROR_BAD_REQUEST\"/>\n\t\t<field name=\"RESULT_ERROR_INTERNAL\"/>\n\t\t<field name=\"RESULT_ERROR_NETWORK\"/>\n\t\t<field name=\"RESULT_NO_RESPONSE\"/>\n\t\t<field name=\"RESULT_UNKNOWN_REQUEST\"/>\n\t</class>\n\t<class name=\"android/content/SearchRecentSuggestionsProvider\" since=\"1\">\n\t\t<extends name=\"android/content/ContentProvider\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"setupSuggestions(Ljava/lang/String;I)V\"/>\n\t\t<field name=\"DATABASE_MODE_2LINES\"/>\n\t\t<field name=\"DATABASE_MODE_QUERIES\"/>\n\t</class>\n\t<class name=\"android/content/ServiceConnection\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onBindingDied(Landroid/content/ComponentName;)V\" since=\"26\"/>\n\t\t<method name=\"onNullBinding(Landroid/content/ComponentName;)V\" since=\"28\"/>\n\t\t<method name=\"onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V\"/>\n\t\t<method name=\"onServiceDisconnected(Landroid/content/ComponentName;)V\"/>\n\t</class>\n\t<class name=\"android/content/SharedPreferences\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"contains(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"edit()Landroid/content/SharedPreferences$Editor;\"/>\n\t\t<method name=\"getAll()Ljava/util/Map;\"/>\n\t\t<method name=\"getBoolean(Ljava/lang/String;Z)Z\"/>\n\t\t<method name=\"getFloat(Ljava/lang/String;F)F\"/>\n\t\t<method name=\"getInt(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"getLong(Ljava/lang/String;J)J\"/>\n\t\t<method name=\"getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getStringSet(Ljava/lang/String;Ljava/util/Set;)Ljava/util/Set;\" since=\"11\"/>\n\t\t<method name=\"registerOnSharedPreferenceChangeListener(Landroid/content/SharedPreferences$OnSharedPreferenceChangeListener;)V\"/>\n\t\t<method name=\"unregisterOnSharedPreferenceChangeListener(Landroid/content/SharedPreferences$OnSharedPreferenceChangeListener;)V\"/>\n\t</class>\n\t<class name=\"android/content/SharedPreferences$Editor\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"apply()V\" since=\"9\"/>\n\t\t<method name=\"clear()Landroid/content/SharedPreferences$Editor;\"/>\n\t\t<method name=\"commit()Z\"/>\n\t\t<method name=\"putBoolean(Ljava/lang/String;Z)Landroid/content/SharedPreferences$Editor;\"/>\n\t\t<method name=\"putFloat(Ljava/lang/String;F)Landroid/content/SharedPreferences$Editor;\"/>\n\t\t<method name=\"putInt(Ljava/lang/String;I)Landroid/content/SharedPreferences$Editor;\"/>\n\t\t<method name=\"putLong(Ljava/lang/String;J)Landroid/content/SharedPreferences$Editor;\"/>\n\t\t<method name=\"putString(Ljava/lang/String;Ljava/lang/String;)Landroid/content/SharedPreferences$Editor;\"/>\n\t\t<method name=\"putStringSet(Ljava/lang/String;Ljava/util/Set;)Landroid/content/SharedPreferences$Editor;\" since=\"11\"/>\n\t\t<method name=\"remove(Ljava/lang/String;)Landroid/content/SharedPreferences$Editor;\"/>\n\t</class>\n\t<class name=\"android/content/SharedPreferences$OnSharedPreferenceChangeListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onSharedPreferenceChanged(Landroid/content/SharedPreferences;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/content/SyncAdapterType\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ZZ)V\"/>\n\t\t<method name=\"allowParallelSyncs()Z\" since=\"11\"/>\n\t\t<method name=\"getSettingsActivity()Ljava/lang/String;\" since=\"14\"/>\n\t\t<method name=\"isAlwaysSyncable()Z\" since=\"11\"/>\n\t\t<method name=\"isUserVisible()Z\"/>\n\t\t<method name=\"newKey(Ljava/lang/String;Ljava/lang/String;)Landroid/content/SyncAdapterType;\"/>\n\t\t<method name=\"supportsUploading()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"accountType\"/>\n\t\t<field name=\"authority\"/>\n\t\t<field name=\"isKey\"/>\n\t</class>\n\t<class name=\"android/content/SyncContext\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getSyncContextBinder()Landroid/os/IBinder;\"/>\n\t\t<method name=\"onFinished(Landroid/content/SyncResult;)V\"/>\n\t</class>\n\t<class name=\"android/content/SyncInfo\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\" since=\"11\"/>\n\t\t<field name=\"account\"/>\n\t\t<field name=\"authority\"/>\n\t\t<field name=\"startTime\"/>\n\t</class>\n\t<class name=\"android/content/SyncRequest\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/content/SyncRequest$Builder\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/content/SyncRequest;\"/>\n\t\t<method name=\"setDisallowMetered(Z)Landroid/content/SyncRequest$Builder;\"/>\n\t\t<method name=\"setExpedited(Z)Landroid/content/SyncRequest$Builder;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/content/SyncRequest$Builder;\"/>\n\t\t<method name=\"setIgnoreBackoff(Z)Landroid/content/SyncRequest$Builder;\"/>\n\t\t<method name=\"setIgnoreSettings(Z)Landroid/content/SyncRequest$Builder;\"/>\n\t\t<method name=\"setManual(Z)Landroid/content/SyncRequest$Builder;\"/>\n\t\t<method name=\"setNoRetry(Z)Landroid/content/SyncRequest$Builder;\"/>\n\t\t<method name=\"setRequiresCharging(Z)Landroid/content/SyncRequest$Builder;\" since=\"24\"/>\n\t\t<method name=\"setSyncAdapter(Landroid/accounts/Account;Ljava/lang/String;)Landroid/content/SyncRequest$Builder;\"/>\n\t\t<method name=\"syncOnce()Landroid/content/SyncRequest$Builder;\"/>\n\t\t<method name=\"syncPeriodic(JJ)Landroid/content/SyncRequest$Builder;\"/>\n\t</class>\n\t<class name=\"android/content/SyncResult\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"hasError()Z\"/>\n\t\t<method name=\"hasHardError()Z\"/>\n\t\t<method name=\"hasSoftError()Z\"/>\n\t\t<method name=\"madeSomeProgress()Z\"/>\n\t\t<method name=\"toDebugString()Ljava/lang/String;\"/>\n\t\t<field name=\"ALREADY_IN_PROGRESS\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"databaseError\"/>\n\t\t<field name=\"delayUntil\" since=\"8\"/>\n\t\t<field name=\"fullSyncRequested\"/>\n\t\t<field name=\"moreRecordsToGet\"/>\n\t\t<field name=\"partialSyncUnavailable\"/>\n\t\t<field name=\"stats\"/>\n\t\t<field name=\"syncAlreadyInProgress\"/>\n\t\t<field name=\"tooManyDeletions\"/>\n\t\t<field name=\"tooManyRetries\"/>\n\t</class>\n\t<class name=\"android/content/SyncStats\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"numAuthExceptions\"/>\n\t\t<field name=\"numConflictDetectedExceptions\"/>\n\t\t<field name=\"numDeletes\"/>\n\t\t<field name=\"numEntries\"/>\n\t\t<field name=\"numInserts\"/>\n\t\t<field name=\"numIoExceptions\"/>\n\t\t<field name=\"numParseExceptions\"/>\n\t\t<field name=\"numSkippedEntries\"/>\n\t\t<field name=\"numUpdates\"/>\n\t</class>\n\t<class name=\"android/content/SyncStatusObserver\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onStatusChanged(I)V\"/>\n\t</class>\n\t<class name=\"android/content/UriMatcher\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"addURI(Ljava/lang/String;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"match(Landroid/net/Uri;)I\"/>\n\t\t<field name=\"NO_MATCH\"/>\n\t</class>\n\t<class name=\"android/content/UriPermission\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getPersistedTime()J\"/>\n\t\t<method name=\"getUri()Landroid/net/Uri;\"/>\n\t\t<method name=\"isReadPermission()Z\"/>\n\t\t<method name=\"isWritePermission()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"INVALID_TIME\"/>\n\t</class>\n\t<class name=\"android/content/pm/ActivityInfo\" since=\"1\">\n\t\t<extends name=\"android/content/pm/ComponentInfo\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/pm/ActivityInfo;)V\"/>\n\t\t<method name=\"dump(Landroid/util/Printer;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getThemeResource()I\"/>\n\t\t<field name=\"COLOR_MODE_DEFAULT\" since=\"26\"/>\n\t\t<field name=\"COLOR_MODE_HDR\" since=\"26\"/>\n\t\t<field name=\"COLOR_MODE_WIDE_COLOR_GAMUT\" since=\"26\"/>\n\t\t<field name=\"CONFIG_COLOR_MODE\" since=\"26\"/>\n\t\t<field name=\"CONFIG_DENSITY\" since=\"17\"/>\n\t\t<field name=\"CONFIG_FONT_SCALE\"/>\n\t\t<field name=\"CONFIG_KEYBOARD\"/>\n\t\t<field name=\"CONFIG_KEYBOARD_HIDDEN\"/>\n\t\t<field name=\"CONFIG_LAYOUT_DIRECTION\" since=\"17\"/>\n\t\t<field name=\"CONFIG_LOCALE\"/>\n\t\t<field name=\"CONFIG_MCC\"/>\n\t\t<field name=\"CONFIG_MNC\"/>\n\t\t<field name=\"CONFIG_NAVIGATION\"/>\n\t\t<field name=\"CONFIG_ORIENTATION\"/>\n\t\t<field name=\"CONFIG_SCREEN_LAYOUT\" since=\"4\"/>\n\t\t<field name=\"CONFIG_SCREEN_SIZE\" since=\"13\"/>\n\t\t<field name=\"CONFIG_SMALLEST_SCREEN_SIZE\" since=\"13\"/>\n\t\t<field name=\"CONFIG_TOUCHSCREEN\"/>\n\t\t<field name=\"CONFIG_UI_MODE\" since=\"8\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"DOCUMENT_LAUNCH_ALWAYS\" since=\"21\"/>\n\t\t<field name=\"DOCUMENT_LAUNCH_INTO_EXISTING\" since=\"21\"/>\n\t\t<field name=\"DOCUMENT_LAUNCH_NEVER\" since=\"21\"/>\n\t\t<field name=\"DOCUMENT_LAUNCH_NONE\" since=\"21\"/>\n\t\t<field name=\"FLAG_ALLOW_TASK_REPARENTING\"/>\n\t\t<field name=\"FLAG_ALWAYS_RETAIN_TASK_STATE\"/>\n\t\t<field name=\"FLAG_AUTO_REMOVE_FROM_RECENTS\" since=\"21\"/>\n\t\t<field name=\"FLAG_CLEAR_TASK_ON_LAUNCH\"/>\n\t\t<field name=\"FLAG_ENABLE_VR_MODE\" since=\"24\"/>\n\t\t<field name=\"FLAG_EXCLUDE_FROM_RECENTS\"/>\n\t\t<field name=\"FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS\" since=\"5\"/>\n\t\t<field name=\"FLAG_FINISH_ON_TASK_LAUNCH\"/>\n\t\t<field name=\"FLAG_HARDWARE_ACCELERATED\" since=\"11\"/>\n\t\t<field name=\"FLAG_IMMERSIVE\" since=\"18\"/>\n\t\t<field name=\"FLAG_MULTIPROCESS\"/>\n\t\t<field name=\"FLAG_NO_HISTORY\" since=\"3\"/>\n\t\t<field name=\"FLAG_RELINQUISH_TASK_IDENTITY\" since=\"21\"/>\n\t\t<field name=\"FLAG_RESUME_WHILE_PAUSING\" since=\"21\"/>\n\t\t<field name=\"FLAG_SINGLE_USER\" since=\"17\"/>\n\t\t<field name=\"FLAG_STATE_NOT_NEEDED\"/>\n\t\t<field name=\"LAUNCH_MULTIPLE\"/>\n\t\t<field name=\"LAUNCH_SINGLE_INSTANCE\"/>\n\t\t<field name=\"LAUNCH_SINGLE_TASK\"/>\n\t\t<field name=\"LAUNCH_SINGLE_TOP\"/>\n\t\t<field name=\"PERSIST_ACROSS_REBOOTS\" since=\"21\"/>\n\t\t<field name=\"PERSIST_NEVER\" since=\"21\"/>\n\t\t<field name=\"PERSIST_ROOT_ONLY\" since=\"21\"/>\n\t\t<field name=\"SCREEN_ORIENTATION_BEHIND\"/>\n\t\t<field name=\"SCREEN_ORIENTATION_FULL_SENSOR\" since=\"9\"/>\n\t\t<field name=\"SCREEN_ORIENTATION_FULL_USER\" since=\"18\"/>\n\t\t<field name=\"SCREEN_ORIENTATION_LANDSCAPE\"/>\n\t\t<field name=\"SCREEN_ORIENTATION_LOCKED\" since=\"18\"/>\n\t\t<field name=\"SCREEN_ORIENTATION_NOSENSOR\"/>\n\t\t<field name=\"SCREEN_ORIENTATION_PORTRAIT\"/>\n\t\t<field name=\"SCREEN_ORIENTATION_REVERSE_LANDSCAPE\" since=\"9\"/>\n\t\t<field name=\"SCREEN_ORIENTATION_REVERSE_PORTRAIT\" since=\"9\"/>\n\t\t<field name=\"SCREEN_ORIENTATION_SENSOR\"/>\n\t\t<field name=\"SCREEN_ORIENTATION_SENSOR_LANDSCAPE\" since=\"9\"/>\n\t\t<field name=\"SCREEN_ORIENTATION_SENSOR_PORTRAIT\" since=\"9\"/>\n\t\t<field name=\"SCREEN_ORIENTATION_UNSPECIFIED\"/>\n\t\t<field name=\"SCREEN_ORIENTATION_USER\"/>\n\t\t<field name=\"SCREEN_ORIENTATION_USER_LANDSCAPE\" since=\"18\"/>\n\t\t<field name=\"SCREEN_ORIENTATION_USER_PORTRAIT\" since=\"18\"/>\n\t\t<field name=\"UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW\" since=\"14\"/>\n\t\t<field name=\"colorMode\" since=\"26\"/>\n\t\t<field name=\"configChanges\"/>\n\t\t<field name=\"documentLaunchMode\" since=\"21\"/>\n\t\t<field name=\"flags\"/>\n\t\t<field name=\"launchMode\"/>\n\t\t<field name=\"maxRecents\" since=\"21\"/>\n\t\t<field name=\"parentActivityName\" since=\"16\"/>\n\t\t<field name=\"permission\"/>\n\t\t<field name=\"persistableMode\" since=\"21\"/>\n\t\t<field name=\"screenOrientation\"/>\n\t\t<field name=\"softInputMode\" since=\"3\"/>\n\t\t<field name=\"targetActivity\"/>\n\t\t<field name=\"taskAffinity\"/>\n\t\t<field name=\"theme\"/>\n\t\t<field name=\"uiOptions\" since=\"14\"/>\n\t\t<field name=\"windowLayout\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/content/pm/ActivityInfo$WindowLayout\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(IFIFIII)V\"/>\n\t\t<field name=\"gravity\"/>\n\t\t<field name=\"height\"/>\n\t\t<field name=\"heightFraction\"/>\n\t\t<field name=\"minHeight\"/>\n\t\t<field name=\"minWidth\"/>\n\t\t<field name=\"width\"/>\n\t\t<field name=\"widthFraction\"/>\n\t</class>\n\t<class name=\"android/content/pm/ApplicationInfo\" since=\"1\">\n\t\t<extends name=\"android/content/pm/PackageItemInfo\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/pm/ApplicationInfo;)V\"/>\n\t\t<method name=\"dump(Landroid/util/Printer;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getCategoryTitle(Landroid/content/Context;I)Ljava/lang/CharSequence;\" since=\"26\"/>\n\t\t<method name=\"isProfileableByShell()Z\" since=\"29\"/>\n\t\t<method name=\"isResourceOverlay()Z\" since=\"29\"/>\n\t\t<method name=\"isVirtualPreload()Z\" since=\"27\"/>\n\t\t<method name=\"loadDescription(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CATEGORY_AUDIO\" since=\"26\"/>\n\t\t<field name=\"CATEGORY_GAME\" since=\"26\"/>\n\t\t<field name=\"CATEGORY_IMAGE\" since=\"26\"/>\n\t\t<field name=\"CATEGORY_MAPS\" since=\"26\"/>\n\t\t<field name=\"CATEGORY_NEWS\" since=\"26\"/>\n\t\t<field name=\"CATEGORY_PRODUCTIVITY\" since=\"26\"/>\n\t\t<field name=\"CATEGORY_SOCIAL\" since=\"26\"/>\n\t\t<field name=\"CATEGORY_UNDEFINED\" since=\"26\"/>\n\t\t<field name=\"CATEGORY_VIDEO\" since=\"26\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FLAG_ALLOW_BACKUP\" since=\"8\"/>\n\t\t<field name=\"FLAG_ALLOW_CLEAR_USER_DATA\"/>\n\t\t<field name=\"FLAG_ALLOW_TASK_REPARENTING\"/>\n\t\t<field name=\"FLAG_DEBUGGABLE\"/>\n\t\t<field name=\"FLAG_EXTERNAL_STORAGE\" since=\"8\"/>\n\t\t<field name=\"FLAG_EXTRACT_NATIVE_LIBS\" since=\"23\"/>\n\t\t<field name=\"FLAG_FACTORY_TEST\"/>\n\t\t<field name=\"FLAG_FULL_BACKUP_ONLY\" since=\"21\"/>\n\t\t<field name=\"FLAG_HARDWARE_ACCELERATED\" since=\"23\"/>\n\t\t<field name=\"FLAG_HAS_CODE\"/>\n\t\t<field name=\"FLAG_INSTALLED\" since=\"17\"/>\n\t\t<field name=\"FLAG_IS_DATA_ONLY\" since=\"17\"/>\n\t\t<field name=\"FLAG_IS_GAME\" since=\"21\" deprecated=\"26\"/>\n\t\t<field name=\"FLAG_KILL_AFTER_RESTORE\" since=\"8\"/>\n\t\t<field name=\"FLAG_LARGE_HEAP\" since=\"11\"/>\n\t\t<field name=\"FLAG_MULTIARCH\" since=\"21\"/>\n\t\t<field name=\"FLAG_PERSISTENT\"/>\n\t\t<field name=\"FLAG_RESIZEABLE_FOR_SCREENS\" since=\"4\"/>\n\t\t<field name=\"FLAG_RESTORE_ANY_VERSION\" since=\"8\"/>\n\t\t<field name=\"FLAG_STOPPED\" since=\"12\"/>\n\t\t<field name=\"FLAG_SUPPORTS_LARGE_SCREENS\" since=\"4\"/>\n\t\t<field name=\"FLAG_SUPPORTS_NORMAL_SCREENS\" since=\"4\"/>\n\t\t<field name=\"FLAG_SUPPORTS_RTL\" since=\"17\"/>\n\t\t<field name=\"FLAG_SUPPORTS_SCREEN_DENSITIES\" since=\"4\"/>\n\t\t<field name=\"FLAG_SUPPORTS_SMALL_SCREENS\" since=\"4\"/>\n\t\t<field name=\"FLAG_SUPPORTS_XLARGE_SCREENS\" since=\"11\"/>\n\t\t<field name=\"FLAG_SUSPENDED\" since=\"24\"/>\n\t\t<field name=\"FLAG_SYSTEM\"/>\n\t\t<field name=\"FLAG_TEST_ONLY\" since=\"4\"/>\n\t\t<field name=\"FLAG_UPDATED_SYSTEM_APP\" since=\"4\"/>\n\t\t<field name=\"FLAG_USES_CLEARTEXT_TRAFFIC\" since=\"23\"/>\n\t\t<field name=\"FLAG_VM_SAFE_MODE\" since=\"8\"/>\n\t\t<field name=\"appComponentFactory\" since=\"28\"/>\n\t\t<field name=\"backupAgentName\" since=\"8\"/>\n\t\t<field name=\"category\" since=\"26\"/>\n\t\t<field name=\"className\"/>\n\t\t<field name=\"compatibleWidthLimitDp\" since=\"13\"/>\n\t\t<field name=\"dataDir\"/>\n\t\t<field name=\"descriptionRes\"/>\n\t\t<field name=\"deviceProtectedDataDir\" since=\"24\"/>\n\t\t<field name=\"enabled\"/>\n\t\t<field name=\"flags\"/>\n\t\t<field name=\"largestWidthLimitDp\" since=\"13\"/>\n\t\t<field name=\"manageSpaceActivityName\"/>\n\t\t<field name=\"minSdkVersion\" since=\"24\"/>\n\t\t<field name=\"nativeLibraryDir\" since=\"9\"/>\n\t\t<field name=\"permission\"/>\n\t\t<field name=\"processName\"/>\n\t\t<field name=\"publicSourceDir\"/>\n\t\t<field name=\"requiresSmallestWidthDp\" since=\"13\"/>\n\t\t<field name=\"sharedLibraryFiles\"/>\n\t\t<field name=\"sourceDir\"/>\n\t\t<field name=\"splitNames\" since=\"26\"/>\n\t\t<field name=\"splitPublicSourceDirs\" since=\"21\"/>\n\t\t<field name=\"splitSourceDirs\" since=\"21\"/>\n\t\t<field name=\"storageUuid\" since=\"26\"/>\n\t\t<field name=\"targetSdkVersion\" since=\"4\"/>\n\t\t<field name=\"taskAffinity\"/>\n\t\t<field name=\"theme\"/>\n\t\t<field name=\"uiOptions\" since=\"14\"/>\n\t\t<field name=\"uid\"/>\n\t</class>\n\t<class name=\"android/content/pm/ApplicationInfo$DisplayNameComparator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Comparator\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/pm/PackageManager;)V\"/>\n\t\t<method name=\"compare(Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;)I\"/>\n\t</class>\n\t<class name=\"android/content/pm/ChangedPackages\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(ILjava/util/List;)V\"/>\n\t\t<method name=\"getPackageNames()Ljava/util/List;\"/>\n\t\t<method name=\"getSequenceNumber()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/content/pm/ComponentInfo\" since=\"1\">\n\t\t<extends name=\"android/content/pm/PackageItemInfo\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/pm/ComponentInfo;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"getBannerResource()I\" since=\"20\"/>\n\t\t<method name=\"getIconResource()I\"/>\n\t\t<method name=\"getLogoResource()I\" since=\"19\"/>\n\t\t<method name=\"isEnabled()Z\" since=\"11\"/>\n\t\t<field name=\"applicationInfo\"/>\n\t\t<field name=\"descriptionRes\" since=\"8\"/>\n\t\t<field name=\"directBootAware\" since=\"24\"/>\n\t\t<field name=\"enabled\"/>\n\t\t<field name=\"exported\"/>\n\t\t<field name=\"processName\"/>\n\t\t<field name=\"splitName\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/content/pm/ConfigurationInfo\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/pm/ConfigurationInfo;)V\"/>\n\t\t<method name=\"getGlEsVersion()Ljava/lang/String;\" since=\"4\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"GL_ES_VERSION_UNDEFINED\" since=\"4\"/>\n\t\t<field name=\"INPUT_FEATURE_FIVE_WAY_NAV\"/>\n\t\t<field name=\"INPUT_FEATURE_HARD_KEYBOARD\"/>\n\t\t<field name=\"reqGlEsVersion\" since=\"4\"/>\n\t\t<field name=\"reqInputFeatures\"/>\n\t\t<field name=\"reqKeyboardType\"/>\n\t\t<field name=\"reqNavigation\"/>\n\t\t<field name=\"reqTouchScreen\"/>\n\t</class>\n\t<class name=\"android/content/pm/CrossProfileApps\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getProfileSwitchingIconDrawable(Landroid/os/UserHandle;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getProfileSwitchingLabel(Landroid/os/UserHandle;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTargetUserProfiles()Ljava/util/List;\"/>\n\t\t<method name=\"startMainActivity(Landroid/content/ComponentName;Landroid/os/UserHandle;)V\"/>\n\t</class>\n\t<class name=\"android/content/pm/FeatureGroupInfo\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/pm/FeatureGroupInfo;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"features\"/>\n\t</class>\n\t<class name=\"android/content/pm/FeatureInfo\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/pm/FeatureInfo;)V\"/>\n\t\t<method name=\"getGlEsVersion()Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FLAG_REQUIRED\"/>\n\t\t<field name=\"GL_ES_VERSION_UNDEFINED\"/>\n\t\t<field name=\"flags\"/>\n\t\t<field name=\"name\"/>\n\t\t<field name=\"reqGlEsVersion\"/>\n\t\t<field name=\"version\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/content/pm/IPackageInstallObserver\" since=\"1\" removed=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/IInterface\"/>\n\t\t<method name=\"packageInstalled(Ljava/lang/String;I)V\"/>\n\t</class>\n\t<class name=\"android/content/pm/IPackageInstallObserver$Stub\" since=\"1\" removed=\"4\">\n\t\t<extends name=\"android/os/Binder\"/>\n\t\t<implements name=\"android/content/pm/IPackageInstallObserver\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageInstallObserver;\"/>\n\t</class>\n\t<class name=\"android/content/pm/InstrumentationInfo\" since=\"1\">\n\t\t<extends name=\"android/content/pm/PackageItemInfo\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/pm/InstrumentationInfo;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"dataDir\"/>\n\t\t<field name=\"functionalTest\"/>\n\t\t<field name=\"handleProfiling\"/>\n\t\t<field name=\"publicSourceDir\"/>\n\t\t<field name=\"sourceDir\"/>\n\t\t<field name=\"splitNames\" since=\"26\"/>\n\t\t<field name=\"splitPublicSourceDirs\" since=\"21\"/>\n\t\t<field name=\"splitSourceDirs\" since=\"21\"/>\n\t\t<field name=\"targetPackage\"/>\n\t\t<field name=\"targetProcesses\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/content/pm/LabeledIntent\" since=\"5\">\n\t\t<extends name=\"android/content/Intent\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Intent;Ljava/lang/String;II)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Intent;Ljava/lang/String;Ljava/lang/CharSequence;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;II)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/CharSequence;I)V\"/>\n\t\t<method name=\"getIconResource()I\"/>\n\t\t<method name=\"getLabelResource()I\"/>\n\t\t<method name=\"getNonLocalizedLabel()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getSourcePackage()Ljava/lang/String;\"/>\n\t\t<method name=\"loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/content/pm/LauncherActivityInfo\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getApplicationInfo()Landroid/content/pm/ApplicationInfo;\"/>\n\t\t<method name=\"getBadgedIcon(I)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getComponentName()Landroid/content/ComponentName;\"/>\n\t\t<method name=\"getFirstInstallTime()J\"/>\n\t\t<method name=\"getIcon(I)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getLabel()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getUser()Landroid/os/UserHandle;\"/>\n\t</class>\n\t<class name=\"android/content/pm/LauncherApps\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getActivityList(Ljava/lang/String;Landroid/os/UserHandle;)Ljava/util/List;\"/>\n\t\t<method name=\"getAllPackageInstallerSessions()Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"getApplicationInfo(Ljava/lang/String;ILandroid/os/UserHandle;)Landroid/content/pm/ApplicationInfo;\" since=\"26\"/>\n\t\t<method name=\"getPinItemRequest(Landroid/content/Intent;)Landroid/content/pm/LauncherApps$PinItemRequest;\" since=\"26\"/>\n\t\t<method name=\"getProfiles()Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"getShortcutBadgedIconDrawable(Landroid/content/pm/ShortcutInfo;I)Landroid/graphics/drawable/Drawable;\" since=\"25\"/>\n\t\t<method name=\"getShortcutConfigActivityIntent(Landroid/content/pm/LauncherActivityInfo;)Landroid/content/IntentSender;\" since=\"26\"/>\n\t\t<method name=\"getShortcutConfigActivityList(Ljava/lang/String;Landroid/os/UserHandle;)Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"getShortcutIconDrawable(Landroid/content/pm/ShortcutInfo;I)Landroid/graphics/drawable/Drawable;\" since=\"25\"/>\n\t\t<method name=\"getShortcuts(Landroid/content/pm/LauncherApps$ShortcutQuery;Landroid/os/UserHandle;)Ljava/util/List;\" since=\"25\"/>\n\t\t<method name=\"getSuspendedPackageLauncherExtras(Ljava/lang/String;Landroid/os/UserHandle;)Landroid/os/Bundle;\" since=\"28\"/>\n\t\t<method name=\"hasShortcutHostPermission()Z\" since=\"25\"/>\n\t\t<method name=\"isActivityEnabled(Landroid/content/ComponentName;Landroid/os/UserHandle;)Z\"/>\n\t\t<method name=\"isPackageEnabled(Ljava/lang/String;Landroid/os/UserHandle;)Z\"/>\n\t\t<method name=\"pinShortcuts(Ljava/lang/String;Ljava/util/List;Landroid/os/UserHandle;)V\" since=\"25\"/>\n\t\t<method name=\"registerCallback(Landroid/content/pm/LauncherApps$Callback;)V\"/>\n\t\t<method name=\"registerCallback(Landroid/content/pm/LauncherApps$Callback;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"registerPackageInstallerSessionCallback(Ljava/util/concurrent/Executor;Landroid/content/pm/PackageInstaller$SessionCallback;)V\" since=\"29\"/>\n\t\t<method name=\"resolveActivity(Landroid/content/Intent;Landroid/os/UserHandle;)Landroid/content/pm/LauncherActivityInfo;\"/>\n\t\t<method name=\"shouldHideFromSuggestions(Ljava/lang/String;Landroid/os/UserHandle;)Z\" since=\"29\"/>\n\t\t<method name=\"startAppDetailsActivity(Landroid/content/ComponentName;Landroid/os/UserHandle;Landroid/graphics/Rect;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"startMainActivity(Landroid/content/ComponentName;Landroid/os/UserHandle;Landroid/graphics/Rect;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"startPackageInstallerSessionDetailsActivity(Landroid/content/pm/PackageInstaller$SessionInfo;Landroid/graphics/Rect;Landroid/os/Bundle;)V\" since=\"29\"/>\n\t\t<method name=\"startShortcut(Landroid/content/pm/ShortcutInfo;Landroid/graphics/Rect;Landroid/os/Bundle;)V\" since=\"25\"/>\n\t\t<method name=\"startShortcut(Ljava/lang/String;Ljava/lang/String;Landroid/graphics/Rect;Landroid/os/Bundle;Landroid/os/UserHandle;)V\" since=\"25\"/>\n\t\t<method name=\"unregisterCallback(Landroid/content/pm/LauncherApps$Callback;)V\"/>\n\t\t<method name=\"unregisterPackageInstallerSessionCallback(Landroid/content/pm/PackageInstaller$SessionCallback;)V\" since=\"29\"/>\n\t\t<field name=\"ACTION_CONFIRM_PIN_APPWIDGET\" since=\"26\"/>\n\t\t<field name=\"ACTION_CONFIRM_PIN_SHORTCUT\" since=\"26\"/>\n\t\t<field name=\"EXTRA_PIN_ITEM_REQUEST\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/content/pm/LauncherApps$Callback\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onPackageAdded(Ljava/lang/String;Landroid/os/UserHandle;)V\"/>\n\t\t<method name=\"onPackageChanged(Ljava/lang/String;Landroid/os/UserHandle;)V\"/>\n\t\t<method name=\"onPackageRemoved(Ljava/lang/String;Landroid/os/UserHandle;)V\"/>\n\t\t<method name=\"onPackagesAvailable([Ljava/lang/String;Landroid/os/UserHandle;Z)V\"/>\n\t\t<method name=\"onPackagesSuspended([Ljava/lang/String;Landroid/os/UserHandle;)V\" since=\"24\"/>\n\t\t<method name=\"onPackagesSuspended([Ljava/lang/String;Landroid/os/UserHandle;Landroid/os/Bundle;)V\" since=\"28\"/>\n\t\t<method name=\"onPackagesUnavailable([Ljava/lang/String;Landroid/os/UserHandle;Z)V\"/>\n\t\t<method name=\"onPackagesUnsuspended([Ljava/lang/String;Landroid/os/UserHandle;)V\" since=\"24\"/>\n\t\t<method name=\"onShortcutsChanged(Ljava/lang/String;Ljava/util/List;Landroid/os/UserHandle;)V\" since=\"25\"/>\n\t</class>\n\t<class name=\"android/content/pm/LauncherApps$PinItemRequest\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"accept()Z\"/>\n\t\t<method name=\"accept(Landroid/os/Bundle;)Z\"/>\n\t\t<method name=\"getAppWidgetProviderInfo(Landroid/content/Context;)Landroid/appwidget/AppWidgetProviderInfo;\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getRequestType()I\"/>\n\t\t<method name=\"getShortcutInfo()Landroid/content/pm/ShortcutInfo;\"/>\n\t\t<method name=\"isValid()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"REQUEST_TYPE_APPWIDGET\"/>\n\t\t<field name=\"REQUEST_TYPE_SHORTCUT\"/>\n\t</class>\n\t<class name=\"android/content/pm/LauncherApps$ShortcutQuery\" since=\"25\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"setActivity(Landroid/content/ComponentName;)Landroid/content/pm/LauncherApps$ShortcutQuery;\"/>\n\t\t<method name=\"setChangedSince(J)Landroid/content/pm/LauncherApps$ShortcutQuery;\"/>\n\t\t<method name=\"setPackage(Ljava/lang/String;)Landroid/content/pm/LauncherApps$ShortcutQuery;\"/>\n\t\t<method name=\"setQueryFlags(I)Landroid/content/pm/LauncherApps$ShortcutQuery;\"/>\n\t\t<method name=\"setShortcutIds(Ljava/util/List;)Landroid/content/pm/LauncherApps$ShortcutQuery;\"/>\n\t\t<field name=\"FLAG_GET_KEY_FIELDS_ONLY\"/>\n\t\t<field name=\"FLAG_MATCH_DYNAMIC\"/>\n\t\t<field name=\"FLAG_MATCH_MANIFEST\"/>\n\t\t<field name=\"FLAG_MATCH_PINNED\"/>\n\t\t<field name=\"FLAG_MATCH_PINNED_BY_ANY_LAUNCHER\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/content/pm/ModuleInfo\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getName()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"isHidden()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/content/pm/PackageInfo\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getLongVersionCode()J\" since=\"28\"/>\n\t\t<method name=\"setLongVersionCode(J)V\" since=\"28\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"INSTALL_LOCATION_AUTO\" since=\"21\"/>\n\t\t<field name=\"INSTALL_LOCATION_INTERNAL_ONLY\" since=\"21\"/>\n\t\t<field name=\"INSTALL_LOCATION_PREFER_EXTERNAL\" since=\"21\"/>\n\t\t<field name=\"REQUESTED_PERMISSION_GRANTED\" since=\"16\"/>\n\t\t<field name=\"REQUESTED_PERMISSION_REQUIRED\" since=\"16\" removed=\"23\"/>\n\t\t<field name=\"activities\"/>\n\t\t<field name=\"applicationInfo\"/>\n\t\t<field name=\"baseRevisionCode\" since=\"22\"/>\n\t\t<field name=\"configPreferences\" since=\"3\"/>\n\t\t<field name=\"featureGroups\" since=\"21\"/>\n\t\t<field name=\"firstInstallTime\" since=\"9\"/>\n\t\t<field name=\"gids\"/>\n\t\t<field name=\"installLocation\" since=\"21\"/>\n\t\t<field name=\"instrumentation\"/>\n\t\t<field name=\"isApex\" since=\"29\"/>\n\t\t<field name=\"lastUpdateTime\" since=\"9\"/>\n\t\t<field name=\"packageName\"/>\n\t\t<field name=\"permissions\"/>\n\t\t<field name=\"providers\"/>\n\t\t<field name=\"receivers\"/>\n\t\t<field name=\"reqFeatures\" since=\"5\"/>\n\t\t<field name=\"requestedPermissions\"/>\n\t\t<field name=\"requestedPermissionsFlags\" since=\"16\"/>\n\t\t<field name=\"services\"/>\n\t\t<field name=\"sharedUserId\" since=\"3\"/>\n\t\t<field name=\"sharedUserLabel\" since=\"3\"/>\n\t\t<field name=\"signatures\" deprecated=\"28\"/>\n\t\t<field name=\"signingInfo\" since=\"28\"/>\n\t\t<field name=\"splitNames\" since=\"21\"/>\n\t\t<field name=\"splitRevisionCodes\" since=\"22\"/>\n\t\t<field name=\"versionCode\" deprecated=\"28\"/>\n\t\t<field name=\"versionName\"/>\n\t</class>\n\t<class name=\"android/content/pm/PackageInstaller\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"abandonSession(I)V\"/>\n\t\t<method name=\"createSession(Landroid/content/pm/PackageInstaller$SessionParams;)I\"/>\n\t\t<method name=\"getActiveStagedSession()Landroid/content/pm/PackageInstaller$SessionInfo;\" since=\"29\" deprecated=\"30\"/>\n\t\t<method name=\"getActiveStagedSessions()Ljava/util/List;\" since=\"30\"/>\n\t\t<method name=\"getAllSessions()Ljava/util/List;\"/>\n\t\t<method name=\"getMySessions()Ljava/util/List;\"/>\n\t\t<method name=\"getSessionInfo(I)Landroid/content/pm/PackageInstaller$SessionInfo;\"/>\n\t\t<method name=\"getStagedSessions()Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"installExistingPackage(Ljava/lang/String;ILandroid/content/IntentSender;)V\" since=\"29\"/>\n\t\t<method name=\"openSession(I)Landroid/content/pm/PackageInstaller$Session;\"/>\n\t\t<method name=\"registerSessionCallback(Landroid/content/pm/PackageInstaller$SessionCallback;)V\"/>\n\t\t<method name=\"registerSessionCallback(Landroid/content/pm/PackageInstaller$SessionCallback;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"uninstall(Landroid/content/pm/VersionedPackage;Landroid/content/IntentSender;)V\" since=\"26\"/>\n\t\t<method name=\"uninstall(Ljava/lang/String;Landroid/content/IntentSender;)V\"/>\n\t\t<method name=\"unregisterSessionCallback(Landroid/content/pm/PackageInstaller$SessionCallback;)V\"/>\n\t\t<method name=\"updateSessionAppIcon(ILandroid/graphics/Bitmap;)V\"/>\n\t\t<method name=\"updateSessionAppLabel(ILjava/lang/CharSequence;)V\"/>\n\t\t<field name=\"ACTION_SESSION_COMMITTED\" since=\"26\"/>\n\t\t<field name=\"ACTION_SESSION_DETAILS\"/>\n\t\t<field name=\"ACTION_SESSION_UPDATED\" since=\"29\"/>\n\t\t<field name=\"EXTRA_OTHER_PACKAGE_NAME\"/>\n\t\t<field name=\"EXTRA_PACKAGE_NAME\"/>\n\t\t<field name=\"EXTRA_SESSION\" since=\"26\"/>\n\t\t<field name=\"EXTRA_SESSION_ID\"/>\n\t\t<field name=\"EXTRA_STATUS\"/>\n\t\t<field name=\"EXTRA_STATUS_MESSAGE\"/>\n\t\t<field name=\"EXTRA_STORAGE_PATH\"/>\n\t\t<field name=\"STATUS_FAILURE\"/>\n\t\t<field name=\"STATUS_FAILURE_ABORTED\"/>\n\t\t<field name=\"STATUS_FAILURE_BLOCKED\"/>\n\t\t<field name=\"STATUS_FAILURE_CONFLICT\"/>\n\t\t<field name=\"STATUS_FAILURE_INCOMPATIBLE\"/>\n\t\t<field name=\"STATUS_FAILURE_INVALID\"/>\n\t\t<field name=\"STATUS_FAILURE_STORAGE\"/>\n\t\t<field name=\"STATUS_PENDING_USER_ACTION\"/>\n\t\t<field name=\"STATUS_SUCCESS\"/>\n\t</class>\n\t<class name=\"android/content/pm/PackageInstaller$Session\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<method name=\"abandon()V\"/>\n\t\t<method name=\"addChildSessionId(I)V\" since=\"29\"/>\n\t\t<method name=\"commit(Landroid/content/IntentSender;)V\"/>\n\t\t<method name=\"fsync(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"getChildSessionIds()[I\" since=\"29\"/>\n\t\t<method name=\"getNames()[Ljava/lang/String;\"/>\n\t\t<method name=\"getParentSessionId()I\" since=\"29\"/>\n\t\t<method name=\"isMultiPackage()Z\" since=\"29\"/>\n\t\t<method name=\"isStaged()Z\" since=\"29\"/>\n\t\t<method name=\"openRead(Ljava/lang/String;)Ljava/io/InputStream;\"/>\n\t\t<method name=\"openWrite(Ljava/lang/String;JJ)Ljava/io/OutputStream;\"/>\n\t\t<method name=\"removeChildSessionId(I)V\" since=\"29\"/>\n\t\t<method name=\"removeSplit(Ljava/lang/String;)V\" since=\"24\"/>\n\t\t<method name=\"setStagingProgress(F)V\"/>\n\t\t<method name=\"transfer(Ljava/lang/String;)V\" since=\"27\"/>\n\t</class>\n\t<class name=\"android/content/pm/PackageInstaller$SessionCallback\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onActiveChanged(IZ)V\"/>\n\t\t<method name=\"onBadgingChanged(I)V\"/>\n\t\t<method name=\"onCreated(I)V\"/>\n\t\t<method name=\"onFinished(IZ)V\"/>\n\t\t<method name=\"onProgressChanged(IF)V\"/>\n\t</class>\n\t<class name=\"android/content/pm/PackageInstaller$SessionInfo\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"createDetailsIntent()Landroid/content/Intent;\"/>\n\t\t<method name=\"getAppIcon()Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"getAppLabel()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getAppPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getChildSessionIds()[I\" since=\"29\"/>\n\t\t<method name=\"getInstallLocation()I\" since=\"27\"/>\n\t\t<method name=\"getInstallReason()I\" since=\"26\"/>\n\t\t<method name=\"getInstallerPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getMode()I\" since=\"27\"/>\n\t\t<method name=\"getOriginatingUid()I\" since=\"27\"/>\n\t\t<method name=\"getOriginatingUri()Landroid/net/Uri;\" since=\"27\"/>\n\t\t<method name=\"getParentSessionId()I\" since=\"29\"/>\n\t\t<method name=\"getProgress()F\"/>\n\t\t<method name=\"getReferrerUri()Landroid/net/Uri;\" since=\"27\"/>\n\t\t<method name=\"getSessionId()I\"/>\n\t\t<method name=\"getSize()J\" since=\"27\"/>\n\t\t<method name=\"getStagedSessionErrorCode()I\" since=\"29\"/>\n\t\t<method name=\"getStagedSessionErrorMessage()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getUpdatedMillis()J\" since=\"29\"/>\n\t\t<method name=\"getUser()Landroid/os/UserHandle;\" since=\"29\"/>\n\t\t<method name=\"hasParentSessionId()Z\" since=\"30\"/>\n\t\t<method name=\"isActive()Z\"/>\n\t\t<method name=\"isCommitted()Z\" since=\"29\"/>\n\t\t<method name=\"isMultiPackage()Z\" since=\"29\"/>\n\t\t<method name=\"isSealed()Z\" since=\"26\"/>\n\t\t<method name=\"isStaged()Z\" since=\"29\"/>\n\t\t<method name=\"isStagedSessionActive()Z\" since=\"30\"/>\n\t\t<method name=\"isStagedSessionApplied()Z\" since=\"29\"/>\n\t\t<method name=\"isStagedSessionFailed()Z\" since=\"29\"/>\n\t\t<method name=\"isStagedSessionReady()Z\" since=\"29\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"INVALID_ID\" since=\"29\"/>\n\t\t<field name=\"STAGED_SESSION_ACTIVATION_FAILED\" since=\"29\"/>\n\t\t<field name=\"STAGED_SESSION_NO_ERROR\" since=\"29\"/>\n\t\t<field name=\"STAGED_SESSION_UNKNOWN\" since=\"29\"/>\n\t\t<field name=\"STAGED_SESSION_VERIFICATION_FAILED\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/content/pm/PackageInstaller$SessionParams\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"setAppIcon(Landroid/graphics/Bitmap;)V\"/>\n\t\t<method name=\"setAppLabel(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setAppPackageName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setInstallLocation(I)V\"/>\n\t\t<method name=\"setInstallReason(I)V\" since=\"26\"/>\n\t\t<method name=\"setMultiPackage()V\" since=\"29\"/>\n\t\t<method name=\"setOriginatingUid(I)V\" since=\"24\"/>\n\t\t<method name=\"setOriginatingUri(Landroid/net/Uri;)V\"/>\n\t\t<method name=\"setReferrerUri(Landroid/net/Uri;)V\"/>\n\t\t<method name=\"setSize(J)V\"/>\n\t\t<method name=\"setWhitelistedRestrictedPermissions(Ljava/util/Set;)V\" since=\"29\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"MODE_FULL_INSTALL\"/>\n\t\t<field name=\"MODE_INHERIT_EXISTING\"/>\n\t\t<field name=\"RESTRICTED_PERMISSIONS_ALL\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/content/pm/PackageItemInfo\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/pm/PackageItemInfo;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"dumpBack(Landroid/util/Printer;Ljava/lang/String;)V\"/>\n\t\t<method name=\"dumpFront(Landroid/util/Printer;Ljava/lang/String;)V\"/>\n\t\t<method name=\"loadBanner(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;\" since=\"20\"/>\n\t\t<method name=\"loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"loadLogo(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;\" since=\"9\"/>\n\t\t<method name=\"loadUnbadgedIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;\" since=\"22\"/>\n\t\t<method name=\"loadXmlMetaData(Landroid/content/pm/PackageManager;Ljava/lang/String;)Landroid/content/res/XmlResourceParser;\"/>\n\t\t<method name=\"writeToParcel(Landroid/os/Parcel;I)V\"/>\n\t\t<field name=\"banner\" since=\"20\"/>\n\t\t<field name=\"icon\"/>\n\t\t<field name=\"labelRes\"/>\n\t\t<field name=\"logo\" since=\"9\"/>\n\t\t<field name=\"metaData\"/>\n\t\t<field name=\"name\"/>\n\t\t<field name=\"nonLocalizedLabel\"/>\n\t\t<field name=\"packageName\"/>\n\t</class>\n\t<class name=\"android/content/pm/PackageItemInfo$DisplayNameComparator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Comparator\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/pm/PackageManager;)V\"/>\n\t\t<method name=\"compare(Landroid/content/pm/PackageItemInfo;Landroid/content/pm/PackageItemInfo;)I\"/>\n\t</class>\n\t<class name=\"android/content/pm/PackageManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"addPackageToPreferred(Ljava/lang/String;)V\" deprecated=\"15\"/>\n\t\t<method name=\"addPermission(Landroid/content/pm/PermissionInfo;)Z\"/>\n\t\t<method name=\"addPermissionAsync(Landroid/content/pm/PermissionInfo;)Z\" since=\"8\"/>\n\t\t<method name=\"addPreferredActivity(Landroid/content/IntentFilter;I[Landroid/content/ComponentName;Landroid/content/ComponentName;)V\" deprecated=\"15\"/>\n\t\t<method name=\"addWhitelistedRestrictedPermission(Ljava/lang/String;Ljava/lang/String;I)Z\" since=\"29\"/>\n\t\t<method name=\"canRequestPackageInstalls()Z\" since=\"26\"/>\n\t\t<method name=\"canonicalToCurrentPackageNames([Ljava/lang/String;)[Ljava/lang/String;\" since=\"8\"/>\n\t\t<method name=\"checkPermission(Ljava/lang/String;Ljava/lang/String;)I\"/>\n\t\t<method name=\"checkSignatures(II)I\" since=\"5\"/>\n\t\t<method name=\"checkSignatures(Ljava/lang/String;Ljava/lang/String;)I\"/>\n\t\t<method name=\"clearInstantAppCookie()V\" since=\"26\"/>\n\t\t<method name=\"clearPackagePreferredActivities(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"currentToCanonicalPackageNames([Ljava/lang/String;)[Ljava/lang/String;\" since=\"8\"/>\n\t\t<method name=\"extendVerificationTimeout(IIJ)V\" since=\"17\"/>\n\t\t<method name=\"getActivityBanner(Landroid/content/ComponentName;)Landroid/graphics/drawable/Drawable;\" since=\"20\"/>\n\t\t<method name=\"getActivityBanner(Landroid/content/Intent;)Landroid/graphics/drawable/Drawable;\" since=\"20\"/>\n\t\t<method name=\"getActivityIcon(Landroid/content/ComponentName;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getActivityIcon(Landroid/content/Intent;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getActivityInfo(Landroid/content/ComponentName;I)Landroid/content/pm/ActivityInfo;\"/>\n\t\t<method name=\"getActivityLogo(Landroid/content/ComponentName;)Landroid/graphics/drawable/Drawable;\" since=\"9\"/>\n\t\t<method name=\"getActivityLogo(Landroid/content/Intent;)Landroid/graphics/drawable/Drawable;\" since=\"9\"/>\n\t\t<method name=\"getAllPermissionGroups(I)Ljava/util/List;\"/>\n\t\t<method name=\"getApplicationBanner(Landroid/content/pm/ApplicationInfo;)Landroid/graphics/drawable/Drawable;\" since=\"20\"/>\n\t\t<method name=\"getApplicationBanner(Ljava/lang/String;)Landroid/graphics/drawable/Drawable;\" since=\"20\"/>\n\t\t<method name=\"getApplicationEnabledSetting(Ljava/lang/String;)I\"/>\n\t\t<method name=\"getApplicationIcon(Landroid/content/pm/ApplicationInfo;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getApplicationIcon(Ljava/lang/String;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getApplicationInfo(Ljava/lang/String;I)Landroid/content/pm/ApplicationInfo;\"/>\n\t\t<method name=\"getApplicationLabel(Landroid/content/pm/ApplicationInfo;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getApplicationLogo(Landroid/content/pm/ApplicationInfo;)Landroid/graphics/drawable/Drawable;\" since=\"9\"/>\n\t\t<method name=\"getApplicationLogo(Ljava/lang/String;)Landroid/graphics/drawable/Drawable;\" since=\"9\"/>\n\t\t<method name=\"getChangedPackages(I)Landroid/content/pm/ChangedPackages;\" since=\"26\"/>\n\t\t<method name=\"getComponentEnabledSetting(Landroid/content/ComponentName;)I\"/>\n\t\t<method name=\"getDefaultActivityIcon()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getDrawable(Ljava/lang/String;ILandroid/content/pm/ApplicationInfo;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getInstalledApplications(I)Ljava/util/List;\"/>\n\t\t<method name=\"getInstalledModules(I)Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"getInstalledPackages(I)Ljava/util/List;\"/>\n\t\t<method name=\"getInstallerPackageName(Ljava/lang/String;)Ljava/lang/String;\" since=\"5\"/>\n\t\t<method name=\"getInstantAppCookie()[B\" since=\"26\"/>\n\t\t<method name=\"getInstantAppCookieMaxBytes()I\" since=\"26\"/>\n\t\t<method name=\"getInstrumentationInfo(Landroid/content/ComponentName;I)Landroid/content/pm/InstrumentationInfo;\"/>\n\t\t<method name=\"getLaunchIntentForPackage(Ljava/lang/String;)Landroid/content/Intent;\" since=\"3\"/>\n\t\t<method name=\"getLeanbackLaunchIntentForPackage(Ljava/lang/String;)Landroid/content/Intent;\" since=\"21\"/>\n\t\t<method name=\"getModuleInfo(Ljava/lang/String;I)Landroid/content/pm/ModuleInfo;\" since=\"29\"/>\n\t\t<method name=\"getNameForUid(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getPackageArchiveInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;\"/>\n\t\t<method name=\"getPackageGids(Ljava/lang/String;)[I\"/>\n\t\t<method name=\"getPackageGids(Ljava/lang/String;I)[I\" since=\"24\"/>\n\t\t<method name=\"getPackageInfo(Landroid/content/pm/VersionedPackage;I)Landroid/content/pm/PackageInfo;\" since=\"26\"/>\n\t\t<method name=\"getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;\"/>\n\t\t<method name=\"getPackageInstaller()Landroid/content/pm/PackageInstaller;\" since=\"21\"/>\n\t\t<method name=\"getPackageUid(Ljava/lang/String;I)I\" since=\"24\"/>\n\t\t<method name=\"getPackagesForUid(I)[Ljava/lang/String;\"/>\n\t\t<method name=\"getPackagesHoldingPermissions([Ljava/lang/String;I)Ljava/util/List;\" since=\"18\"/>\n\t\t<method name=\"getPermissionGroupInfo(Ljava/lang/String;I)Landroid/content/pm/PermissionGroupInfo;\"/>\n\t\t<method name=\"getPermissionInfo(Ljava/lang/String;I)Landroid/content/pm/PermissionInfo;\"/>\n\t\t<method name=\"getPreferredActivities(Ljava/util/List;Ljava/util/List;Ljava/lang/String;)I\" deprecated=\"29\"/>\n\t\t<method name=\"getPreferredPackages(I)Ljava/util/List;\" deprecated=\"29\"/>\n\t\t<method name=\"getProviderInfo(Landroid/content/ComponentName;I)Landroid/content/pm/ProviderInfo;\" since=\"9\"/>\n\t\t<method name=\"getReceiverInfo(Landroid/content/ComponentName;I)Landroid/content/pm/ActivityInfo;\"/>\n\t\t<method name=\"getResourcesForActivity(Landroid/content/ComponentName;)Landroid/content/res/Resources;\"/>\n\t\t<method name=\"getResourcesForApplication(Landroid/content/pm/ApplicationInfo;)Landroid/content/res/Resources;\"/>\n\t\t<method name=\"getResourcesForApplication(Ljava/lang/String;)Landroid/content/res/Resources;\"/>\n\t\t<method name=\"getServiceInfo(Landroid/content/ComponentName;I)Landroid/content/pm/ServiceInfo;\"/>\n\t\t<method name=\"getSharedLibraries(I)Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"getSuspendedPackageAppExtras()Landroid/os/Bundle;\" since=\"28\"/>\n\t\t<method name=\"getSyntheticAppDetailsActivityEnabled(Ljava/lang/String;)Z\" since=\"29\"/>\n\t\t<method name=\"getSystemAvailableFeatures()[Landroid/content/pm/FeatureInfo;\" since=\"5\"/>\n\t\t<method name=\"getSystemSharedLibraryNames()[Ljava/lang/String;\" since=\"3\"/>\n\t\t<method name=\"getText(Ljava/lang/String;ILandroid/content/pm/ApplicationInfo;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getUserBadgedDrawableForDensity(Landroid/graphics/drawable/Drawable;Landroid/os/UserHandle;Landroid/graphics/Rect;I)Landroid/graphics/drawable/Drawable;\" since=\"21\"/>\n\t\t<method name=\"getUserBadgedIcon(Landroid/graphics/drawable/Drawable;Landroid/os/UserHandle;)Landroid/graphics/drawable/Drawable;\" since=\"21\"/>\n\t\t<method name=\"getUserBadgedLabel(Ljava/lang/CharSequence;Landroid/os/UserHandle;)Ljava/lang/CharSequence;\" since=\"21\"/>\n\t\t<method name=\"getWhitelistedRestrictedPermissions(Ljava/lang/String;I)Ljava/util/Set;\" since=\"29\"/>\n\t\t<method name=\"getXml(Ljava/lang/String;ILandroid/content/pm/ApplicationInfo;)Landroid/content/res/XmlResourceParser;\"/>\n\t\t<method name=\"hasSigningCertificate(I[BI)Z\" since=\"28\"/>\n\t\t<method name=\"hasSigningCertificate(Ljava/lang/String;[BI)Z\" since=\"28\"/>\n\t\t<method name=\"hasSystemFeature(Ljava/lang/String;)Z\" since=\"5\"/>\n\t\t<method name=\"hasSystemFeature(Ljava/lang/String;I)Z\" since=\"24\"/>\n\t\t<method name=\"installPackage(Landroid/net/Uri;)V\" removed=\"4\"/>\n\t\t<method name=\"installPackage(Landroid/net/Uri;Landroid/content/pm/IPackageInstallObserver;I)V\" removed=\"4\"/>\n\t\t<method name=\"isDeviceUpgrading()Z\" since=\"29\"/>\n\t\t<method name=\"isInstantApp()Z\" since=\"26\"/>\n\t\t<method name=\"isInstantApp(Ljava/lang/String;)Z\" since=\"26\"/>\n\t\t<method name=\"isPackageSuspended()Z\" since=\"28\"/>\n\t\t<method name=\"isPackageSuspended(Ljava/lang/String;)Z\" since=\"29\"/>\n\t\t<method name=\"isPermissionRevokedByPolicy(Ljava/lang/String;Ljava/lang/String;)Z\" since=\"23\"/>\n\t\t<method name=\"isSafeMode()Z\" since=\"3\"/>\n\t\t<method name=\"queryBroadcastReceivers(Landroid/content/Intent;I)Ljava/util/List;\"/>\n\t\t<method name=\"queryContentProviders(Ljava/lang/String;II)Ljava/util/List;\"/>\n\t\t<method name=\"queryInstrumentation(Ljava/lang/String;I)Ljava/util/List;\"/>\n\t\t<method name=\"queryIntentActivities(Landroid/content/Intent;I)Ljava/util/List;\"/>\n\t\t<method name=\"queryIntentActivityOptions(Landroid/content/ComponentName;[Landroid/content/Intent;Landroid/content/Intent;I)Ljava/util/List;\"/>\n\t\t<method name=\"queryIntentContentProviders(Landroid/content/Intent;I)Ljava/util/List;\" since=\"19\"/>\n\t\t<method name=\"queryIntentServices(Landroid/content/Intent;I)Ljava/util/List;\"/>\n\t\t<method name=\"queryPermissionsByGroup(Ljava/lang/String;I)Ljava/util/List;\"/>\n\t\t<method name=\"removePackageFromPreferred(Ljava/lang/String;)V\" deprecated=\"15\"/>\n\t\t<method name=\"removePermission(Ljava/lang/String;)V\"/>\n\t\t<method name=\"removeWhitelistedRestrictedPermission(Ljava/lang/String;Ljava/lang/String;I)Z\" since=\"29\"/>\n\t\t<method name=\"resolveActivity(Landroid/content/Intent;I)Landroid/content/pm/ResolveInfo;\"/>\n\t\t<method name=\"resolveContentProvider(Ljava/lang/String;I)Landroid/content/pm/ProviderInfo;\"/>\n\t\t<method name=\"resolveService(Landroid/content/Intent;I)Landroid/content/pm/ResolveInfo;\"/>\n\t\t<method name=\"setApplicationCategoryHint(Ljava/lang/String;I)V\" since=\"26\"/>\n\t\t<method name=\"setApplicationEnabledSetting(Ljava/lang/String;II)V\"/>\n\t\t<method name=\"setComponentEnabledSetting(Landroid/content/ComponentName;II)V\"/>\n\t\t<method name=\"setInstallerPackageName(Ljava/lang/String;Ljava/lang/String;)V\" since=\"11\"/>\n\t\t<method name=\"updateInstantAppCookie([B)V\" since=\"26\"/>\n\t\t<method name=\"verifyPendingInstall(II)V\" since=\"14\"/>\n\t\t<field name=\"CERT_INPUT_RAW_X509\" since=\"28\"/>\n\t\t<field name=\"CERT_INPUT_SHA256\" since=\"28\"/>\n\t\t<field name=\"COMPONENT_ENABLED_STATE_DEFAULT\"/>\n\t\t<field name=\"COMPONENT_ENABLED_STATE_DISABLED\"/>\n\t\t<field name=\"COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED\" since=\"18\"/>\n\t\t<field name=\"COMPONENT_ENABLED_STATE_DISABLED_USER\" since=\"14\"/>\n\t\t<field name=\"COMPONENT_ENABLED_STATE_ENABLED\"/>\n\t\t<field name=\"DONT_KILL_APP\"/>\n\t\t<field name=\"EXTRA_VERIFICATION_ID\" since=\"14\"/>\n\t\t<field name=\"EXTRA_VERIFICATION_RESULT\" since=\"17\"/>\n\t\t<field name=\"FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS\" since=\"26\"/>\n\t\t<field name=\"FEATURE_APP_WIDGETS\" since=\"18\"/>\n\t\t<field name=\"FEATURE_AUDIO_LOW_LATENCY\" since=\"9\"/>\n\t\t<field name=\"FEATURE_AUDIO_OUTPUT\" since=\"21\"/>\n\t\t<field name=\"FEATURE_AUDIO_PRO\" since=\"23\"/>\n\t\t<field name=\"FEATURE_AUTOFILL\" since=\"26\"/>\n\t\t<field name=\"FEATURE_AUTOMOTIVE\" since=\"23\"/>\n\t\t<field name=\"FEATURE_BACKUP\" since=\"20\"/>\n\t\t<field name=\"FEATURE_BLUETOOTH\" since=\"8\"/>\n\t\t<field name=\"FEATURE_BLUETOOTH_LE\" since=\"18\"/>\n\t\t<field name=\"FEATURE_CAMERA\" since=\"7\"/>\n\t\t<field name=\"FEATURE_CAMERA_ANY\" since=\"17\"/>\n\t\t<field name=\"FEATURE_CAMERA_AR\" since=\"28\"/>\n\t\t<field name=\"FEATURE_CAMERA_AUTOFOCUS\" since=\"7\"/>\n\t\t<field name=\"FEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSING\" since=\"21\"/>\n\t\t<field name=\"FEATURE_CAMERA_CAPABILITY_MANUAL_SENSOR\" since=\"21\"/>\n\t\t<field name=\"FEATURE_CAMERA_CAPABILITY_RAW\" since=\"21\"/>\n\t\t<field name=\"FEATURE_CAMERA_EXTERNAL\" since=\"20\"/>\n\t\t<field name=\"FEATURE_CAMERA_FLASH\" since=\"7\"/>\n\t\t<field name=\"FEATURE_CAMERA_FRONT\" since=\"9\"/>\n\t\t<field name=\"FEATURE_CAMERA_LEVEL_FULL\" since=\"21\"/>\n\t\t<field name=\"FEATURE_CANT_SAVE_STATE\" since=\"28\"/>\n\t\t<field name=\"FEATURE_COMPANION_DEVICE_SETUP\" since=\"26\"/>\n\t\t<field name=\"FEATURE_CONNECTION_SERVICE\" since=\"21\"/>\n\t\t<field name=\"FEATURE_CONSUMER_IR\" since=\"19\"/>\n\t\t<field name=\"FEATURE_DEVICE_ADMIN\" since=\"19\"/>\n\t\t<field name=\"FEATURE_EMBEDDED\" since=\"26\"/>\n\t\t<field name=\"FEATURE_ETHERNET\" since=\"24\"/>\n\t\t<field name=\"FEATURE_FACE\" since=\"29\"/>\n\t\t<field name=\"FEATURE_FAKETOUCH\" since=\"11\"/>\n\t\t<field name=\"FEATURE_FAKETOUCH_MULTITOUCH_DISTINCT\" since=\"13\"/>\n\t\t<field name=\"FEATURE_FAKETOUCH_MULTITOUCH_JAZZHAND\" since=\"13\"/>\n\t\t<field name=\"FEATURE_FINGERPRINT\" since=\"23\"/>\n\t\t<field name=\"FEATURE_FREEFORM_WINDOW_MANAGEMENT\" since=\"24\"/>\n\t\t<field name=\"FEATURE_GAMEPAD\" since=\"21\"/>\n\t\t<field name=\"FEATURE_HIFI_SENSORS\" since=\"23\"/>\n\t\t<field name=\"FEATURE_HOME_SCREEN\" since=\"18\"/>\n\t\t<field name=\"FEATURE_INPUT_METHODS\" since=\"18\"/>\n\t\t<field name=\"FEATURE_IPSEC_TUNNELS\" since=\"29\"/>\n\t\t<field name=\"FEATURE_IRIS\" since=\"29\"/>\n\t\t<field name=\"FEATURE_LEANBACK\" since=\"21\"/>\n\t\t<field name=\"FEATURE_LEANBACK_ONLY\" since=\"26\"/>\n\t\t<field name=\"FEATURE_LIVE_TV\" since=\"21\"/>\n\t\t<field name=\"FEATURE_LIVE_WALLPAPER\" since=\"7\"/>\n\t\t<field name=\"FEATURE_LOCATION\" since=\"8\"/>\n\t\t<field name=\"FEATURE_LOCATION_GPS\" since=\"8\"/>\n\t\t<field name=\"FEATURE_LOCATION_NETWORK\" since=\"8\"/>\n\t\t<field name=\"FEATURE_MANAGED_USERS\" since=\"21\"/>\n\t\t<field name=\"FEATURE_MICROPHONE\" since=\"8\"/>\n\t\t<field name=\"FEATURE_MIDI\" since=\"23\"/>\n\t\t<field name=\"FEATURE_NFC\" since=\"9\"/>\n\t\t<field name=\"FEATURE_NFC_BEAM\" since=\"29\"/>\n\t\t<field name=\"FEATURE_NFC_HOST_CARD_EMULATION\" since=\"19\"/>\n\t\t<field name=\"FEATURE_NFC_HOST_CARD_EMULATION_NFCF\" since=\"24\"/>\n\t\t<field name=\"FEATURE_NFC_OFF_HOST_CARD_EMULATION_ESE\" since=\"29\"/>\n\t\t<field name=\"FEATURE_NFC_OFF_HOST_CARD_EMULATION_UICC\" since=\"29\"/>\n\t\t<field name=\"FEATURE_OPENGLES_EXTENSION_PACK\" since=\"21\"/>\n\t\t<field name=\"FEATURE_PC\" since=\"27\"/>\n\t\t<field name=\"FEATURE_PICTURE_IN_PICTURE\" since=\"24\"/>\n\t\t<field name=\"FEATURE_PRINTING\" since=\"20\"/>\n\t\t<field name=\"FEATURE_RAM_LOW\" since=\"27\"/>\n\t\t<field name=\"FEATURE_RAM_NORMAL\" since=\"27\"/>\n\t\t<field name=\"FEATURE_SCREEN_LANDSCAPE\" since=\"13\"/>\n\t\t<field name=\"FEATURE_SCREEN_PORTRAIT\" since=\"13\"/>\n\t\t<field name=\"FEATURE_SECURELY_REMOVES_USERS\" since=\"21\"/>\n\t\t<field name=\"FEATURE_SECURE_LOCK_SCREEN\" since=\"29\"/>\n\t\t<field name=\"FEATURE_SENSOR_ACCELEROMETER\" since=\"8\"/>\n\t\t<field name=\"FEATURE_SENSOR_AMBIENT_TEMPERATURE\" since=\"21\"/>\n\t\t<field name=\"FEATURE_SENSOR_BAROMETER\" since=\"9\"/>\n\t\t<field name=\"FEATURE_SENSOR_COMPASS\" since=\"8\"/>\n\t\t<field name=\"FEATURE_SENSOR_GYROSCOPE\" since=\"9\"/>\n\t\t<field name=\"FEATURE_SENSOR_HEART_RATE\" since=\"20\"/>\n\t\t<field name=\"FEATURE_SENSOR_HEART_RATE_ECG\" since=\"21\"/>\n\t\t<field name=\"FEATURE_SENSOR_LIGHT\" since=\"7\"/>\n\t\t<field name=\"FEATURE_SENSOR_PROXIMITY\" since=\"7\"/>\n\t\t<field name=\"FEATURE_SENSOR_RELATIVE_HUMIDITY\" since=\"21\"/>\n\t\t<field name=\"FEATURE_SENSOR_STEP_COUNTER\" since=\"19\"/>\n\t\t<field name=\"FEATURE_SENSOR_STEP_DETECTOR\" since=\"19\"/>\n\t\t<field name=\"FEATURE_SE_OMAPI_ESE\" since=\"30\"/>\n\t\t<field name=\"FEATURE_SE_OMAPI_SD\" since=\"30\"/>\n\t\t<field name=\"FEATURE_SE_OMAPI_UICC\" since=\"30\"/>\n\t\t<field name=\"FEATURE_SIP\" since=\"9\"/>\n\t\t<field name=\"FEATURE_SIP_VOIP\" since=\"9\"/>\n\t\t<field name=\"FEATURE_STRONGBOX_KEYSTORE\" since=\"28\"/>\n\t\t<field name=\"FEATURE_TELEPHONY\" since=\"7\"/>\n\t\t<field name=\"FEATURE_TELEPHONY_CDMA\" since=\"7\"/>\n\t\t<field name=\"FEATURE_TELEPHONY_EUICC\" since=\"28\"/>\n\t\t<field name=\"FEATURE_TELEPHONY_GSM\" since=\"7\"/>\n\t\t<field name=\"FEATURE_TELEPHONY_IMS\" since=\"29\"/>\n\t\t<field name=\"FEATURE_TELEPHONY_MBMS\" since=\"28\"/>\n\t\t<field name=\"FEATURE_TELEVISION\" since=\"16\" deprecated=\"21\"/>\n\t\t<field name=\"FEATURE_TOUCHSCREEN\" since=\"8\"/>\n\t\t<field name=\"FEATURE_TOUCHSCREEN_MULTITOUCH\" since=\"7\"/>\n\t\t<field name=\"FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT\" since=\"8\"/>\n\t\t<field name=\"FEATURE_TOUCHSCREEN_MULTITOUCH_JAZZHAND\" since=\"9\"/>\n\t\t<field name=\"FEATURE_USB_ACCESSORY\" since=\"12\"/>\n\t\t<field name=\"FEATURE_USB_HOST\" since=\"12\"/>\n\t\t<field name=\"FEATURE_VERIFIED_BOOT\" since=\"21\"/>\n\t\t<field name=\"FEATURE_VR_HEADTRACKING\" since=\"26\"/>\n\t\t<field name=\"FEATURE_VR_MODE\" since=\"24\" deprecated=\"28\"/>\n\t\t<field name=\"FEATURE_VR_MODE_HIGH_PERFORMANCE\" since=\"24\"/>\n\t\t<field name=\"FEATURE_VULKAN_DEQP_LEVEL\" since=\"30\"/>\n\t\t<field name=\"FEATURE_VULKAN_HARDWARE_COMPUTE\" since=\"26\"/>\n\t\t<field name=\"FEATURE_VULKAN_HARDWARE_LEVEL\" since=\"24\"/>\n\t\t<field name=\"FEATURE_VULKAN_HARDWARE_VERSION\" since=\"24\"/>\n\t\t<field name=\"FEATURE_WATCH\" since=\"20\"/>\n\t\t<field name=\"FEATURE_WEBVIEW\" since=\"20\"/>\n\t\t<field name=\"FEATURE_WIFI\" since=\"8\"/>\n\t\t<field name=\"FEATURE_WIFI_AWARE\" since=\"26\"/>\n\t\t<field name=\"FEATURE_WIFI_DIRECT\" since=\"14\"/>\n\t\t<field name=\"FEATURE_WIFI_PASSPOINT\" since=\"27\"/>\n\t\t<field name=\"FEATURE_WIFI_RTT\" since=\"28\"/>\n\t\t<field name=\"FLAG_PERMISSION_WHITELIST_INSTALLER\" since=\"29\"/>\n\t\t<field name=\"FLAG_PERMISSION_WHITELIST_SYSTEM\" since=\"29\"/>\n\t\t<field name=\"FLAG_PERMISSION_WHITELIST_UPGRADE\" since=\"29\"/>\n\t\t<field name=\"FORWARD_LOCK_PACKAGE\" removed=\"4\"/>\n\t\t<field name=\"GET_ACTIVITIES\"/>\n\t\t<field name=\"GET_CONFIGURATIONS\" since=\"3\"/>\n\t\t<field name=\"GET_DISABLED_COMPONENTS\" deprecated=\"24\"/>\n\t\t<field name=\"GET_DISABLED_UNTIL_USED_COMPONENTS\" since=\"18\" deprecated=\"24\"/>\n\t\t<field name=\"GET_GIDS\"/>\n\t\t<field name=\"GET_INSTRUMENTATION\"/>\n\t\t<field name=\"GET_INTENT_FILTERS\"/>\n\t\t<field name=\"GET_META_DATA\"/>\n\t\t<field name=\"GET_PERMISSIONS\"/>\n\t\t<field name=\"GET_PROVIDERS\"/>\n\t\t<field name=\"GET_RECEIVERS\"/>\n\t\t<field name=\"GET_RESOLVED_FILTER\"/>\n\t\t<field name=\"GET_SERVICES\"/>\n\t\t<field name=\"GET_SHARED_LIBRARY_FILES\"/>\n\t\t<field name=\"GET_SIGNATURES\" deprecated=\"28\"/>\n\t\t<field name=\"GET_SIGNING_CERTIFICATES\" since=\"28\"/>\n\t\t<field name=\"GET_UNINSTALLED_PACKAGES\" since=\"3\" deprecated=\"24\"/>\n\t\t<field name=\"GET_URI_PERMISSION_PATTERNS\"/>\n\t\t<field name=\"INSTALL_FAILED_ALREADY_EXISTS\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_FAILED_CONFLICTING_PROVIDER\" since=\"3\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_FAILED_DEXOPT\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_FAILED_DUPLICATE_PACKAGE\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_FAILED_INSUFFICIENT_STORAGE\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_FAILED_INVALID_APK\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_FAILED_INVALID_URI\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_FAILED_MISSING_SHARED_LIBRARY\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_FAILED_NO_SHARED_USER\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_FAILED_OLDER_SDK\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_FAILED_REPLACE_COULDNT_DELETE\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_FAILED_SHARED_USER_INCOMPATIBLE\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_FAILED_UPDATE_INCOMPATIBLE\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_PARSE_FAILED_BAD_MANIFEST\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_PARSE_FAILED_MANIFEST_EMPTY\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_PARSE_FAILED_MANIFEST_MALFORMED\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_PARSE_FAILED_NOT_APK\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_PARSE_FAILED_NO_CERTIFICATES\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION\" removed=\"4\"/>\n\t\t<field name=\"INSTALL_REASON_DEVICE_RESTORE\" since=\"26\"/>\n\t\t<field name=\"INSTALL_REASON_DEVICE_SETUP\" since=\"26\"/>\n\t\t<field name=\"INSTALL_REASON_POLICY\" since=\"26\"/>\n\t\t<field name=\"INSTALL_REASON_UNKNOWN\" since=\"26\"/>\n\t\t<field name=\"INSTALL_REASON_USER\" since=\"26\"/>\n\t\t<field name=\"INSTALL_SUCCEEDED\" removed=\"4\"/>\n\t\t<field name=\"MATCH_ALL\" since=\"23\"/>\n\t\t<field name=\"MATCH_APEX\" since=\"29\"/>\n\t\t<field name=\"MATCH_DEFAULT_ONLY\"/>\n\t\t<field name=\"MATCH_DIRECT_BOOT_AUTO\" since=\"29\"/>\n\t\t<field name=\"MATCH_DIRECT_BOOT_AWARE\" since=\"24\"/>\n\t\t<field name=\"MATCH_DIRECT_BOOT_UNAWARE\" since=\"24\"/>\n\t\t<field name=\"MATCH_DISABLED_COMPONENTS\" since=\"24\"/>\n\t\t<field name=\"MATCH_DISABLED_UNTIL_USED_COMPONENTS\" since=\"24\"/>\n\t\t<field name=\"MATCH_SYSTEM_ONLY\" since=\"24\"/>\n\t\t<field name=\"MATCH_UNINSTALLED_PACKAGES\" since=\"24\"/>\n\t\t<field name=\"MAXIMUM_VERIFICATION_TIMEOUT\" since=\"17\"/>\n\t\t<field name=\"PERMISSION_DENIED\"/>\n\t\t<field name=\"PERMISSION_GRANTED\"/>\n\t\t<field name=\"PKG_INSTALL_COMPLETE\" removed=\"8\"/>\n\t\t<field name=\"PKG_INSTALL_INCOMPLETE\" removed=\"8\"/>\n\t\t<field name=\"REPLACE_EXISTING_PACKAGE\" removed=\"4\"/>\n\t\t<field name=\"SIGNATURE_FIRST_NOT_SIGNED\"/>\n\t\t<field name=\"SIGNATURE_MATCH\"/>\n\t\t<field name=\"SIGNATURE_NEITHER_SIGNED\"/>\n\t\t<field name=\"SIGNATURE_NO_MATCH\"/>\n\t\t<field name=\"SIGNATURE_SECOND_NOT_SIGNED\"/>\n\t\t<field name=\"SIGNATURE_UNKNOWN_PACKAGE\"/>\n\t\t<field name=\"VERIFICATION_ALLOW\" since=\"14\"/>\n\t\t<field name=\"VERIFICATION_REJECT\" since=\"14\"/>\n\t\t<field name=\"VERSION_CODE_HIGHEST\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/content/pm/PackageManager$NameNotFoundException\" since=\"1\">\n\t\t<extends name=\"android/util/AndroidException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/content/pm/PackageStats\" since=\"1\" deprecated=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/pm/PackageStats;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<field name=\"CREATOR\" deprecated=\"29\"/>\n\t\t<field name=\"cacheSize\" deprecated=\"29\"/>\n\t\t<field name=\"codeSize\" deprecated=\"29\"/>\n\t\t<field name=\"dataSize\" deprecated=\"29\"/>\n\t\t<field name=\"externalCacheSize\" since=\"11\" deprecated=\"29\"/>\n\t\t<field name=\"externalCodeSize\" since=\"14\" deprecated=\"29\"/>\n\t\t<field name=\"externalDataSize\" since=\"11\" deprecated=\"29\"/>\n\t\t<field name=\"externalMediaSize\" since=\"11\" deprecated=\"29\"/>\n\t\t<field name=\"externalObbSize\" since=\"11\" deprecated=\"29\"/>\n\t\t<field name=\"packageName\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/content/pm/PathPermission\" since=\"4\">\n\t\t<extends name=\"android/os/PatternMatcher\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getReadPermission()Ljava/lang/String;\"/>\n\t\t<method name=\"getWritePermission()Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/content/pm/PermissionGroupInfo\" since=\"1\">\n\t\t<extends name=\"android/content/pm/PackageItemInfo\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/pm/PermissionGroupInfo;)V\" deprecated=\"29\"/>\n\t\t<method name=\"loadDescription(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FLAG_PERSONAL_INFO\" since=\"17\"/>\n\t\t<field name=\"descriptionRes\"/>\n\t\t<field name=\"flags\" since=\"17\"/>\n\t\t<field name=\"nonLocalizedDescription\"/>\n\t\t<field name=\"priority\" since=\"17\"/>\n\t</class>\n\t<class name=\"android/content/pm/PermissionInfo\" since=\"1\">\n\t\t<extends name=\"android/content/pm/PackageItemInfo\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/pm/PermissionInfo;)V\" deprecated=\"29\"/>\n\t\t<method name=\"getProtection()I\" since=\"28\"/>\n\t\t<method name=\"getProtectionFlags()I\" since=\"28\"/>\n\t\t<method name=\"loadDescription(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FLAG_COSTS_MONEY\" since=\"17\"/>\n\t\t<field name=\"FLAG_HARD_RESTRICTED\" since=\"29\"/>\n\t\t<field name=\"FLAG_IMMUTABLY_RESTRICTED\" since=\"29\"/>\n\t\t<field name=\"FLAG_INSTALLED\" since=\"23\"/>\n\t\t<field name=\"FLAG_SOFT_RESTRICTED\" since=\"29\"/>\n\t\t<field name=\"PROTECTION_DANGEROUS\"/>\n\t\t<field name=\"PROTECTION_FLAG_APPOP\" since=\"21\"/>\n\t\t<field name=\"PROTECTION_FLAG_DEVELOPMENT\" since=\"16\"/>\n\t\t<field name=\"PROTECTION_FLAG_INSTALLER\" since=\"23\"/>\n\t\t<field name=\"PROTECTION_FLAG_INSTANT\" since=\"27\"/>\n\t\t<field name=\"PROTECTION_FLAG_PRE23\" since=\"23\"/>\n\t\t<field name=\"PROTECTION_FLAG_PREINSTALLED\" since=\"23\"/>\n\t\t<field name=\"PROTECTION_FLAG_PRIVILEGED\" since=\"23\"/>\n\t\t<field name=\"PROTECTION_FLAG_RUNTIME_ONLY\" since=\"26\"/>\n\t\t<field name=\"PROTECTION_FLAG_SETUP\" since=\"24\"/>\n\t\t<field name=\"PROTECTION_FLAG_SYSTEM\" since=\"16\" deprecated=\"23\"/>\n\t\t<field name=\"PROTECTION_FLAG_VERIFIER\" since=\"23\"/>\n\t\t<field name=\"PROTECTION_MASK_BASE\" since=\"16\" deprecated=\"28\"/>\n\t\t<field name=\"PROTECTION_MASK_FLAGS\" since=\"16\" deprecated=\"28\"/>\n\t\t<field name=\"PROTECTION_NORMAL\"/>\n\t\t<field name=\"PROTECTION_SIGNATURE\"/>\n\t\t<field name=\"PROTECTION_SIGNATURE_OR_SYSTEM\" deprecated=\"23\"/>\n\t\t<field name=\"descriptionRes\"/>\n\t\t<field name=\"flags\" since=\"17\"/>\n\t\t<field name=\"group\"/>\n\t\t<field name=\"nonLocalizedDescription\"/>\n\t\t<field name=\"protectionLevel\" deprecated=\"28\"/>\n\t</class>\n\t<class name=\"android/content/pm/ProviderInfo\" since=\"1\">\n\t\t<extends name=\"android/content/pm/ComponentInfo\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/pm/ProviderInfo;)V\"/>\n\t\t<method name=\"dump(Landroid/util/Printer;Ljava/lang/String;)V\" since=\"19\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FLAG_SINGLE_USER\" since=\"17\"/>\n\t\t<field name=\"authority\"/>\n\t\t<field name=\"flags\" since=\"17\"/>\n\t\t<field name=\"forceUriPermissions\" since=\"29\"/>\n\t\t<field name=\"grantUriPermissions\"/>\n\t\t<field name=\"initOrder\"/>\n\t\t<field name=\"isSyncable\" deprecated=\"15\"/>\n\t\t<field name=\"multiprocess\"/>\n\t\t<field name=\"pathPermissions\" since=\"4\"/>\n\t\t<field name=\"readPermission\"/>\n\t\t<field name=\"uriPermissionPatterns\"/>\n\t\t<field name=\"writePermission\"/>\n\t</class>\n\t<class name=\"android/content/pm/ResolveInfo\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/pm/ResolveInfo;)V\" since=\"17\"/>\n\t\t<method name=\"dump(Landroid/util/Printer;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getIconResource()I\"/>\n\t\t<method name=\"loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"activityInfo\"/>\n\t\t<field name=\"filter\"/>\n\t\t<field name=\"icon\"/>\n\t\t<field name=\"isDefault\"/>\n\t\t<field name=\"isInstantAppAvailable\" since=\"26\"/>\n\t\t<field name=\"labelRes\"/>\n\t\t<field name=\"match\"/>\n\t\t<field name=\"nonLocalizedLabel\"/>\n\t\t<field name=\"preferredOrder\"/>\n\t\t<field name=\"priority\"/>\n\t\t<field name=\"providerInfo\" since=\"19\"/>\n\t\t<field name=\"resolvePackageName\" since=\"5\"/>\n\t\t<field name=\"serviceInfo\"/>\n\t\t<field name=\"specificIndex\"/>\n\t</class>\n\t<class name=\"android/content/pm/ResolveInfo$DisplayNameComparator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Comparator\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/pm/PackageManager;)V\"/>\n\t\t<method name=\"compare(Landroid/content/pm/ResolveInfo;Landroid/content/pm/ResolveInfo;)I\"/>\n\t</class>\n\t<class name=\"android/content/pm/ServiceInfo\" since=\"1\">\n\t\t<extends name=\"android/content/pm/ComponentInfo\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/pm/ServiceInfo;)V\"/>\n\t\t<method name=\"dump(Landroid/util/Printer;Ljava/lang/String;)V\" since=\"5\"/>\n\t\t<method name=\"getForegroundServiceType()I\" since=\"29\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FLAG_EXTERNAL_SERVICE\" since=\"24\"/>\n\t\t<field name=\"FLAG_ISOLATED_PROCESS\" since=\"16\"/>\n\t\t<field name=\"FLAG_SINGLE_USER\" since=\"17\"/>\n\t\t<field name=\"FLAG_STOP_WITH_TASK\" since=\"14\"/>\n\t\t<field name=\"FLAG_USE_APP_ZYGOTE\" since=\"29\"/>\n\t\t<field name=\"FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE\" since=\"29\"/>\n\t\t<field name=\"FOREGROUND_SERVICE_TYPE_DATA_SYNC\" since=\"29\"/>\n\t\t<field name=\"FOREGROUND_SERVICE_TYPE_LOCATION\" since=\"29\"/>\n\t\t<field name=\"FOREGROUND_SERVICE_TYPE_MANIFEST\" since=\"29\"/>\n\t\t<field name=\"FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK\" since=\"29\"/>\n\t\t<field name=\"FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION\" since=\"29\"/>\n\t\t<field name=\"FOREGROUND_SERVICE_TYPE_NONE\" since=\"29\"/>\n\t\t<field name=\"FOREGROUND_SERVICE_TYPE_PHONE_CALL\" since=\"29\"/>\n\t\t<field name=\"flags\" since=\"14\"/>\n\t\t<field name=\"permission\"/>\n\t</class>\n\t<class name=\"android/content/pm/SharedLibraryInfo\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getDeclaringPackage()Landroid/content/pm/VersionedPackage;\"/>\n\t\t<method name=\"getDependentPackages()Ljava/util/List;\"/>\n\t\t<method name=\"getLongVersion()J\" since=\"28\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<method name=\"getVersion()I\" deprecated=\"28\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"TYPE_BUILTIN\"/>\n\t\t<field name=\"TYPE_DYNAMIC\"/>\n\t\t<field name=\"TYPE_STATIC\"/>\n\t\t<field name=\"VERSION_UNDEFINED\"/>\n\t</class>\n\t<class name=\"android/content/pm/ShortcutInfo\" since=\"25\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getActivity()Landroid/content/ComponentName;\"/>\n\t\t<method name=\"getCategories()Ljava/util/Set;\"/>\n\t\t<method name=\"getDisabledMessage()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getDisabledReason()I\" since=\"28\"/>\n\t\t<method name=\"getExtras()Landroid/os/PersistableBundle;\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\"/>\n\t\t<method name=\"getIntent()Landroid/content/Intent;\"/>\n\t\t<method name=\"getIntents()[Landroid/content/Intent;\"/>\n\t\t<method name=\"getLastChangedTimestamp()J\"/>\n\t\t<method name=\"getLocusId()Landroid/content/LocusId;\" since=\"29\"/>\n\t\t<method name=\"getLongLabel()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getPackage()Ljava/lang/String;\"/>\n\t\t<method name=\"getRank()I\"/>\n\t\t<method name=\"getShortLabel()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getUserHandle()Landroid/os/UserHandle;\"/>\n\t\t<method name=\"hasKeyFieldsOnly()Z\"/>\n\t\t<method name=\"isDeclaredInManifest()Z\"/>\n\t\t<method name=\"isDynamic()Z\"/>\n\t\t<method name=\"isEnabled()Z\"/>\n\t\t<method name=\"isImmutable()Z\"/>\n\t\t<method name=\"isPinned()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"DISABLED_REASON_APP_CHANGED\" since=\"28\"/>\n\t\t<field name=\"DISABLED_REASON_BACKUP_NOT_SUPPORTED\" since=\"28\"/>\n\t\t<field name=\"DISABLED_REASON_BY_APP\" since=\"28\"/>\n\t\t<field name=\"DISABLED_REASON_NOT_DISABLED\" since=\"28\"/>\n\t\t<field name=\"DISABLED_REASON_OTHER_RESTORE_ISSUE\" since=\"28\"/>\n\t\t<field name=\"DISABLED_REASON_SIGNATURE_MISMATCH\" since=\"28\"/>\n\t\t<field name=\"DISABLED_REASON_UNKNOWN\" since=\"28\"/>\n\t\t<field name=\"DISABLED_REASON_VERSION_LOWER\" since=\"28\"/>\n\t\t<field name=\"SHORTCUT_CATEGORY_CONVERSATION\"/>\n\t</class>\n\t<class name=\"android/content/pm/ShortcutInfo$Builder\" since=\"25\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/lang/String;)V\"/>\n\t\t<method name=\"build()Landroid/content/pm/ShortcutInfo;\"/>\n\t\t<method name=\"setActivity(Landroid/content/ComponentName;)Landroid/content/pm/ShortcutInfo$Builder;\"/>\n\t\t<method name=\"setCategories(Ljava/util/Set;)Landroid/content/pm/ShortcutInfo$Builder;\"/>\n\t\t<method name=\"setDisabledMessage(Ljava/lang/CharSequence;)Landroid/content/pm/ShortcutInfo$Builder;\"/>\n\t\t<method name=\"setExtras(Landroid/os/PersistableBundle;)Landroid/content/pm/ShortcutInfo$Builder;\"/>\n\t\t<method name=\"setIcon(Landroid/graphics/drawable/Icon;)Landroid/content/pm/ShortcutInfo$Builder;\"/>\n\t\t<method name=\"setIntent(Landroid/content/Intent;)Landroid/content/pm/ShortcutInfo$Builder;\"/>\n\t\t<method name=\"setIntents([Landroid/content/Intent;)Landroid/content/pm/ShortcutInfo$Builder;\"/>\n\t\t<method name=\"setLocusId(Landroid/content/LocusId;)Landroid/content/pm/ShortcutInfo$Builder;\" since=\"29\"/>\n\t\t<method name=\"setLongLabel(Ljava/lang/CharSequence;)Landroid/content/pm/ShortcutInfo$Builder;\"/>\n\t\t<method name=\"setLongLived(Z)Landroid/content/pm/ShortcutInfo$Builder;\" since=\"29\"/>\n\t\t<method name=\"setPerson(Landroid/app/Person;)Landroid/content/pm/ShortcutInfo$Builder;\" since=\"29\"/>\n\t\t<method name=\"setPersons([Landroid/app/Person;)Landroid/content/pm/ShortcutInfo$Builder;\" since=\"29\"/>\n\t\t<method name=\"setRank(I)Landroid/content/pm/ShortcutInfo$Builder;\"/>\n\t\t<method name=\"setShortLabel(Ljava/lang/CharSequence;)Landroid/content/pm/ShortcutInfo$Builder;\"/>\n\t</class>\n\t<class name=\"android/content/pm/ShortcutManager\" since=\"25\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addDynamicShortcuts(Ljava/util/List;)Z\"/>\n\t\t<method name=\"createShortcutResultIntent(Landroid/content/pm/ShortcutInfo;)Landroid/content/Intent;\" since=\"26\"/>\n\t\t<method name=\"disableShortcuts(Ljava/util/List;)V\"/>\n\t\t<method name=\"disableShortcuts(Ljava/util/List;Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"enableShortcuts(Ljava/util/List;)V\"/>\n\t\t<method name=\"getDynamicShortcuts()Ljava/util/List;\"/>\n\t\t<method name=\"getIconMaxHeight()I\"/>\n\t\t<method name=\"getIconMaxWidth()I\"/>\n\t\t<method name=\"getManifestShortcuts()Ljava/util/List;\"/>\n\t\t<method name=\"getMaxShortcutCountPerActivity()I\"/>\n\t\t<method name=\"getPinnedShortcuts()Ljava/util/List;\"/>\n\t\t<method name=\"isRateLimitingActive()Z\"/>\n\t\t<method name=\"isRequestPinShortcutSupported()Z\" since=\"26\"/>\n\t\t<method name=\"removeAllDynamicShortcuts()V\"/>\n\t\t<method name=\"removeDynamicShortcuts(Ljava/util/List;)V\"/>\n\t\t<method name=\"reportShortcutUsed(Ljava/lang/String;)V\"/>\n\t\t<method name=\"requestPinShortcut(Landroid/content/pm/ShortcutInfo;Landroid/content/IntentSender;)Z\" since=\"26\"/>\n\t\t<method name=\"setDynamicShortcuts(Ljava/util/List;)Z\"/>\n\t\t<method name=\"updateShortcuts(Ljava/util/List;)Z\"/>\n\t</class>\n\t<class name=\"android/content/pm/Signature\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>([B)V\"/>\n\t\t<method name=\"toByteArray()[B\"/>\n\t\t<method name=\"toChars()[C\"/>\n\t\t<method name=\"toChars([C[I)[C\"/>\n\t\t<method name=\"toCharsString()Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/content/pm/SigningInfo\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/pm/SigningInfo;)V\"/>\n\t\t<method name=\"getApkContentsSigners()[Landroid/content/pm/Signature;\"/>\n\t\t<method name=\"getSigningCertificateHistory()[Landroid/content/pm/Signature;\"/>\n\t\t<method name=\"hasMultipleSigners()Z\"/>\n\t\t<method name=\"hasPastSigningCertificates()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/content/pm/VersionedPackage\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;J)V\" since=\"28\"/>\n\t\t<method name=\"getLongVersionCode()J\" since=\"28\"/>\n\t\t<method name=\"getPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getVersionCode()I\" deprecated=\"28\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/content/res/AssetFileDescriptor\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\" since=\"3\"/>\n\t\t<implements name=\"java/io/Closeable\" since=\"19\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/ParcelFileDescriptor;JJ)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/ParcelFileDescriptor;JJLandroid/os/Bundle;)V\" since=\"19\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"createInputStream()Ljava/io/FileInputStream;\" since=\"3\"/>\n\t\t<method name=\"createOutputStream()Ljava/io/FileOutputStream;\" since=\"3\"/>\n\t\t<method name=\"getDeclaredLength()J\" since=\"3\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\" since=\"19\"/>\n\t\t<method name=\"getFileDescriptor()Ljava/io/FileDescriptor;\"/>\n\t\t<method name=\"getLength()J\"/>\n\t\t<method name=\"getParcelFileDescriptor()Landroid/os/ParcelFileDescriptor;\"/>\n\t\t<method name=\"getStartOffset()J\"/>\n\t\t<field name=\"CREATOR\" since=\"3\"/>\n\t\t<field name=\"UNKNOWN_LENGTH\" since=\"3\"/>\n\t</class>\n\t<class name=\"android/content/res/AssetFileDescriptor$AutoCloseInputStream\" since=\"3\">\n\t\t<extends name=\"android/os/ParcelFileDescriptor$AutoCloseInputStream\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/res/AssetFileDescriptor;)V\"/>\n\t</class>\n\t<class name=\"android/content/res/AssetFileDescriptor$AutoCloseOutputStream\" since=\"3\">\n\t\t<extends name=\"android/os/ParcelFileDescriptor$AutoCloseOutputStream\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/res/AssetFileDescriptor;)V\"/>\n\t</class>\n\t<class name=\"android/content/res/AssetManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\" since=\"21\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"getLocales()[Ljava/lang/String;\"/>\n\t\t<method name=\"list(Ljava/lang/String;)[Ljava/lang/String;\"/>\n\t\t<method name=\"open(Ljava/lang/String;)Ljava/io/InputStream;\"/>\n\t\t<method name=\"open(Ljava/lang/String;I)Ljava/io/InputStream;\"/>\n\t\t<method name=\"openFd(Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;\"/>\n\t\t<method name=\"openNonAssetFd(ILjava/lang/String;)Landroid/content/res/AssetFileDescriptor;\"/>\n\t\t<method name=\"openNonAssetFd(Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;\"/>\n\t\t<method name=\"openXmlResourceParser(ILjava/lang/String;)Landroid/content/res/XmlResourceParser;\"/>\n\t\t<method name=\"openXmlResourceParser(Ljava/lang/String;)Landroid/content/res/XmlResourceParser;\"/>\n\t\t<field name=\"ACCESS_BUFFER\"/>\n\t\t<field name=\"ACCESS_RANDOM\"/>\n\t\t<field name=\"ACCESS_STREAMING\"/>\n\t\t<field name=\"ACCESS_UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/content/res/AssetManager$AssetInputStream\" since=\"1\">\n\t\t<extends name=\"java/io/InputStream\"/>\n\t\t<method name=\"getAssetInt()I\" removed=\"21\"/>\n\t</class>\n\t<class name=\"android/content/res/ColorStateList\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>([[I[I)V\"/>\n\t\t<method name=\"createFromXml(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;)Landroid/content/res/ColorStateList;\" deprecated=\"23\"/>\n\t\t<method name=\"createFromXml(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList;\" since=\"23\"/>\n\t\t<method name=\"getChangingConfigurations()I\" since=\"23\"/>\n\t\t<method name=\"getColorForState([II)I\"/>\n\t\t<method name=\"getDefaultColor()I\"/>\n\t\t<method name=\"isOpaque()Z\" since=\"21\"/>\n\t\t<method name=\"isStateful()Z\"/>\n\t\t<method name=\"valueOf(I)Landroid/content/res/ColorStateList;\"/>\n\t\t<method name=\"withAlpha(I)Landroid/content/res/ColorStateList;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/content/res/Configuration\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/res/Configuration;)V\"/>\n\t\t<method name=\"compareTo(Landroid/content/res/Configuration;)I\"/>\n\t\t<method name=\"diff(Landroid/content/res/Configuration;)I\"/>\n\t\t<method name=\"equals(Landroid/content/res/Configuration;)Z\"/>\n\t\t<method name=\"getLayoutDirection()I\" since=\"17\"/>\n\t\t<method name=\"getLocales()Landroid/os/LocaleList;\" since=\"24\"/>\n\t\t<method name=\"isLayoutSizeAtLeast(I)Z\" since=\"11\"/>\n\t\t<method name=\"isScreenHdr()Z\" since=\"26\"/>\n\t\t<method name=\"isScreenRound()Z\" since=\"23\"/>\n\t\t<method name=\"isScreenWideColorGamut()Z\" since=\"26\"/>\n\t\t<method name=\"needNewResources(II)Z\"/>\n\t\t<method name=\"readFromParcel(Landroid/os/Parcel;)V\" since=\"8\"/>\n\t\t<method name=\"setLayoutDirection(Ljava/util/Locale;)V\" since=\"17\"/>\n\t\t<method name=\"setLocale(Ljava/util/Locale;)V\" since=\"17\"/>\n\t\t<method name=\"setLocales(Landroid/os/LocaleList;)V\" since=\"24\"/>\n\t\t<method name=\"setTo(Landroid/content/res/Configuration;)V\" since=\"8\"/>\n\t\t<method name=\"setToDefaults()V\"/>\n\t\t<method name=\"updateFrom(Landroid/content/res/Configuration;)I\"/>\n\t\t<field name=\"COLOR_MODE_HDR_MASK\" since=\"26\"/>\n\t\t<field name=\"COLOR_MODE_HDR_NO\" since=\"26\"/>\n\t\t<field name=\"COLOR_MODE_HDR_SHIFT\" since=\"26\"/>\n\t\t<field name=\"COLOR_MODE_HDR_UNDEFINED\" since=\"26\"/>\n\t\t<field name=\"COLOR_MODE_HDR_YES\" since=\"26\"/>\n\t\t<field name=\"COLOR_MODE_UNDEFINED\" since=\"26\"/>\n\t\t<field name=\"COLOR_MODE_WIDE_COLOR_GAMUT_MASK\" since=\"26\"/>\n\t\t<field name=\"COLOR_MODE_WIDE_COLOR_GAMUT_NO\" since=\"26\"/>\n\t\t<field name=\"COLOR_MODE_WIDE_COLOR_GAMUT_UNDEFINED\" since=\"26\"/>\n\t\t<field name=\"COLOR_MODE_WIDE_COLOR_GAMUT_YES\" since=\"26\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"DENSITY_DPI_UNDEFINED\" since=\"17\"/>\n\t\t<field name=\"HARDKEYBOARDHIDDEN_NO\" since=\"3\"/>\n\t\t<field name=\"HARDKEYBOARDHIDDEN_UNDEFINED\" since=\"3\"/>\n\t\t<field name=\"HARDKEYBOARDHIDDEN_YES\" since=\"3\"/>\n\t\t<field name=\"KEYBOARDHIDDEN_NO\"/>\n\t\t<field name=\"KEYBOARDHIDDEN_UNDEFINED\"/>\n\t\t<field name=\"KEYBOARDHIDDEN_YES\"/>\n\t\t<field name=\"KEYBOARD_12KEY\"/>\n\t\t<field name=\"KEYBOARD_NOKEYS\"/>\n\t\t<field name=\"KEYBOARD_QWERTY\"/>\n\t\t<field name=\"KEYBOARD_UNDEFINED\"/>\n\t\t<field name=\"MNC_ZERO\" since=\"19\"/>\n\t\t<field name=\"NAVIGATIONHIDDEN_NO\" since=\"5\"/>\n\t\t<field name=\"NAVIGATIONHIDDEN_UNDEFINED\" since=\"5\"/>\n\t\t<field name=\"NAVIGATIONHIDDEN_YES\" since=\"5\"/>\n\t\t<field name=\"NAVIGATION_DPAD\"/>\n\t\t<field name=\"NAVIGATION_NONAV\"/>\n\t\t<field name=\"NAVIGATION_TRACKBALL\"/>\n\t\t<field name=\"NAVIGATION_UNDEFINED\"/>\n\t\t<field name=\"NAVIGATION_WHEEL\"/>\n\t\t<field name=\"ORIENTATION_LANDSCAPE\"/>\n\t\t<field name=\"ORIENTATION_PORTRAIT\"/>\n\t\t<field name=\"ORIENTATION_SQUARE\" deprecated=\"16\"/>\n\t\t<field name=\"ORIENTATION_UNDEFINED\"/>\n\t\t<field name=\"SCREENLAYOUT_LAYOUTDIR_LTR\" since=\"17\"/>\n\t\t<field name=\"SCREENLAYOUT_LAYOUTDIR_MASK\" since=\"17\"/>\n\t\t<field name=\"SCREENLAYOUT_LAYOUTDIR_RTL\" since=\"17\"/>\n\t\t<field name=\"SCREENLAYOUT_LAYOUTDIR_SHIFT\" since=\"17\"/>\n\t\t<field name=\"SCREENLAYOUT_LAYOUTDIR_UNDEFINED\" since=\"17\"/>\n\t\t<field name=\"SCREENLAYOUT_LONG_MASK\" since=\"4\"/>\n\t\t<field name=\"SCREENLAYOUT_LONG_NO\" since=\"4\"/>\n\t\t<field name=\"SCREENLAYOUT_LONG_UNDEFINED\" since=\"4\"/>\n\t\t<field name=\"SCREENLAYOUT_LONG_YES\" since=\"4\"/>\n\t\t<field name=\"SCREENLAYOUT_ROUND_MASK\" since=\"23\"/>\n\t\t<field name=\"SCREENLAYOUT_ROUND_NO\" since=\"23\"/>\n\t\t<field name=\"SCREENLAYOUT_ROUND_UNDEFINED\" since=\"23\"/>\n\t\t<field name=\"SCREENLAYOUT_ROUND_YES\" since=\"23\"/>\n\t\t<field name=\"SCREENLAYOUT_SIZE_LARGE\" since=\"4\"/>\n\t\t<field name=\"SCREENLAYOUT_SIZE_MASK\" since=\"4\"/>\n\t\t<field name=\"SCREENLAYOUT_SIZE_NORMAL\" since=\"4\"/>\n\t\t<field name=\"SCREENLAYOUT_SIZE_SMALL\" since=\"4\"/>\n\t\t<field name=\"SCREENLAYOUT_SIZE_UNDEFINED\" since=\"4\"/>\n\t\t<field name=\"SCREENLAYOUT_SIZE_XLARGE\" since=\"9\"/>\n\t\t<field name=\"SCREENLAYOUT_UNDEFINED\" since=\"17\"/>\n\t\t<field name=\"SCREEN_HEIGHT_DP_UNDEFINED\" since=\"13\"/>\n\t\t<field name=\"SCREEN_WIDTH_DP_UNDEFINED\" since=\"13\"/>\n\t\t<field name=\"SMALLEST_SCREEN_WIDTH_DP_UNDEFINED\" since=\"13\"/>\n\t\t<field name=\"TOUCHSCREEN_FINGER\"/>\n\t\t<field name=\"TOUCHSCREEN_NOTOUCH\"/>\n\t\t<field name=\"TOUCHSCREEN_STYLUS\" deprecated=\"16\"/>\n\t\t<field name=\"TOUCHSCREEN_UNDEFINED\"/>\n\t\t<field name=\"UI_MODE_NIGHT_MASK\" since=\"8\"/>\n\t\t<field name=\"UI_MODE_NIGHT_NO\" since=\"8\"/>\n\t\t<field name=\"UI_MODE_NIGHT_UNDEFINED\" since=\"8\"/>\n\t\t<field name=\"UI_MODE_NIGHT_YES\" since=\"8\"/>\n\t\t<field name=\"UI_MODE_TYPE_APPLIANCE\" since=\"16\"/>\n\t\t<field name=\"UI_MODE_TYPE_CAR\" since=\"8\"/>\n\t\t<field name=\"UI_MODE_TYPE_DESK\" since=\"8\"/>\n\t\t<field name=\"UI_MODE_TYPE_MASK\" since=\"8\"/>\n\t\t<field name=\"UI_MODE_TYPE_NORMAL\" since=\"8\"/>\n\t\t<field name=\"UI_MODE_TYPE_TELEVISION\" since=\"13\"/>\n\t\t<field name=\"UI_MODE_TYPE_UNDEFINED\" since=\"8\"/>\n\t\t<field name=\"UI_MODE_TYPE_VR_HEADSET\" since=\"26\"/>\n\t\t<field name=\"UI_MODE_TYPE_WATCH\" since=\"20\"/>\n\t\t<field name=\"colorMode\" since=\"26\"/>\n\t\t<field name=\"densityDpi\" since=\"17\"/>\n\t\t<field name=\"fontScale\"/>\n\t\t<field name=\"hardKeyboardHidden\" since=\"3\"/>\n\t\t<field name=\"keyboard\"/>\n\t\t<field name=\"keyboardHidden\"/>\n\t\t<field name=\"locale\" deprecated=\"24\"/>\n\t\t<field name=\"mcc\"/>\n\t\t<field name=\"mnc\"/>\n\t\t<field name=\"navigation\"/>\n\t\t<field name=\"navigationHidden\" since=\"5\"/>\n\t\t<field name=\"orientation\"/>\n\t\t<field name=\"screenHeightDp\" since=\"13\"/>\n\t\t<field name=\"screenLayout\" since=\"4\"/>\n\t\t<field name=\"screenWidthDp\" since=\"13\"/>\n\t\t<field name=\"smallestScreenWidthDp\" since=\"13\"/>\n\t\t<field name=\"touchscreen\"/>\n\t\t<field name=\"uiMode\" since=\"8\"/>\n\t</class>\n\t<class name=\"android/content/res/ObbInfo\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"OBB_OVERLAY\"/>\n\t\t<field name=\"filename\"/>\n\t\t<field name=\"flags\"/>\n\t\t<field name=\"packageName\"/>\n\t\t<field name=\"version\"/>\n\t</class>\n\t<class name=\"android/content/res/ObbScanner\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getObbInfo(Ljava/lang/String;)Landroid/content/res/ObbInfo;\"/>\n\t</class>\n\t<class name=\"android/content/res/Resources\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/res/AssetManager;Landroid/util/DisplayMetrics;Landroid/content/res/Configuration;)V\" deprecated=\"25\"/>\n\t\t<method name=\"finishPreloading()V\"/>\n\t\t<method name=\"flushLayoutCache()V\"/>\n\t\t<method name=\"getAnimation(I)Landroid/content/res/XmlResourceParser;\"/>\n\t\t<method name=\"getAssets()Landroid/content/res/AssetManager;\"/>\n\t\t<method name=\"getAttributeSetSourceResId(Landroid/util/AttributeSet;)I\" since=\"29\"/>\n\t\t<method name=\"getBoolean(I)Z\" since=\"3\"/>\n\t\t<method name=\"getColor(I)I\" deprecated=\"23\"/>\n\t\t<method name=\"getColor(ILandroid/content/res/Resources$Theme;)I\" since=\"23\"/>\n\t\t<method name=\"getColorStateList(I)Landroid/content/res/ColorStateList;\" deprecated=\"23\"/>\n\t\t<method name=\"getColorStateList(ILandroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList;\" since=\"23\"/>\n\t\t<method name=\"getConfiguration()Landroid/content/res/Configuration;\"/>\n\t\t<method name=\"getDimension(I)F\"/>\n\t\t<method name=\"getDimensionPixelOffset(I)I\"/>\n\t\t<method name=\"getDimensionPixelSize(I)I\"/>\n\t\t<method name=\"getDisplayMetrics()Landroid/util/DisplayMetrics;\"/>\n\t\t<method name=\"getDrawable(I)Landroid/graphics/drawable/Drawable;\" deprecated=\"22\"/>\n\t\t<method name=\"getDrawable(ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;\" since=\"21\"/>\n\t\t<method name=\"getDrawableForDensity(II)Landroid/graphics/drawable/Drawable;\" since=\"15\" deprecated=\"22\"/>\n\t\t<method name=\"getDrawableForDensity(IILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;\" since=\"21\"/>\n\t\t<method name=\"getFloat(I)F\" since=\"29\"/>\n\t\t<method name=\"getFont(I)Landroid/graphics/Typeface;\" since=\"26\"/>\n\t\t<method name=\"getFraction(III)F\" since=\"3\"/>\n\t\t<method name=\"getIdentifier(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I\"/>\n\t\t<method name=\"getIntArray(I)[I\"/>\n\t\t<method name=\"getInteger(I)I\"/>\n\t\t<method name=\"getLayout(I)Landroid/content/res/XmlResourceParser;\"/>\n\t\t<method name=\"getMovie(I)Landroid/graphics/Movie;\" deprecated=\"29\"/>\n\t\t<method name=\"getQuantityString(II)Ljava/lang/String;\"/>\n\t\t<method name=\"getQuantityString(II[Ljava/lang/Object;)Ljava/lang/String;\"/>\n\t\t<method name=\"getQuantityText(II)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getResourceEntryName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getResourceName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getResourcePackageName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getResourceTypeName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getString(I[Ljava/lang/Object;)Ljava/lang/String;\"/>\n\t\t<method name=\"getStringArray(I)[Ljava/lang/String;\"/>\n\t\t<method name=\"getSystem()Landroid/content/res/Resources;\"/>\n\t\t<method name=\"getText(I)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getText(ILjava/lang/CharSequence;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTextArray(I)[Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getValue(ILandroid/util/TypedValue;Z)V\"/>\n\t\t<method name=\"getValue(Ljava/lang/String;Landroid/util/TypedValue;Z)V\"/>\n\t\t<method name=\"getValueForDensity(IILandroid/util/TypedValue;Z)V\" since=\"15\"/>\n\t\t<method name=\"getXml(I)Landroid/content/res/XmlResourceParser;\"/>\n\t\t<method name=\"newTheme()Landroid/content/res/Resources$Theme;\"/>\n\t\t<method name=\"obtainAttributes(Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray;\"/>\n\t\t<method name=\"obtainTypedArray(I)Landroid/content/res/TypedArray;\"/>\n\t\t<method name=\"openRawResource(I)Ljava/io/InputStream;\"/>\n\t\t<method name=\"openRawResource(ILandroid/util/TypedValue;)Ljava/io/InputStream;\" since=\"3\"/>\n\t\t<method name=\"openRawResourceFd(I)Landroid/content/res/AssetFileDescriptor;\"/>\n\t\t<method name=\"parseBundleExtra(Ljava/lang/String;Landroid/util/AttributeSet;Landroid/os/Bundle;)V\" since=\"3\"/>\n\t\t<method name=\"parseBundleExtras(Landroid/content/res/XmlResourceParser;Landroid/os/Bundle;)V\" since=\"3\"/>\n\t\t<method name=\"updateConfiguration(Landroid/content/res/Configuration;Landroid/util/DisplayMetrics;)V\" deprecated=\"25\"/>\n\t\t<field name=\"ID_NULL\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/content/res/Resources$NotFoundException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Exception;)V\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/content/res/Resources$Theme\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"applyStyle(IZ)V\"/>\n\t\t<method name=\"dump(ILjava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getAttributeResolutionStack(III)[I\" since=\"29\"/>\n\t\t<method name=\"getChangingConfigurations()I\" since=\"23\"/>\n\t\t<method name=\"getDrawable(I)Landroid/graphics/drawable/Drawable;\" since=\"21\"/>\n\t\t<method name=\"getExplicitStyle(Landroid/util/AttributeSet;)I\" since=\"29\"/>\n\t\t<method name=\"getResources()Landroid/content/res/Resources;\" since=\"21\"/>\n\t\t<method name=\"obtainStyledAttributes(I[I)Landroid/content/res/TypedArray;\"/>\n\t\t<method name=\"obtainStyledAttributes(Landroid/util/AttributeSet;[III)Landroid/content/res/TypedArray;\"/>\n\t\t<method name=\"obtainStyledAttributes([I)Landroid/content/res/TypedArray;\"/>\n\t\t<method name=\"rebase()V\" since=\"29\"/>\n\t\t<method name=\"resolveAttribute(ILandroid/util/TypedValue;Z)Z\"/>\n\t\t<method name=\"setTo(Landroid/content/res/Resources$Theme;)V\"/>\n\t</class>\n\t<class name=\"android/content/res/TypedArray\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getBoolean(IZ)Z\"/>\n\t\t<method name=\"getChangingConfigurations()I\" since=\"21\"/>\n\t\t<method name=\"getColor(II)I\"/>\n\t\t<method name=\"getColorStateList(I)Landroid/content/res/ColorStateList;\"/>\n\t\t<method name=\"getDimension(IF)F\"/>\n\t\t<method name=\"getDimensionPixelOffset(II)I\"/>\n\t\t<method name=\"getDimensionPixelSize(II)I\"/>\n\t\t<method name=\"getDrawable(I)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getFloat(IF)F\"/>\n\t\t<method name=\"getFont(I)Landroid/graphics/Typeface;\" since=\"26\"/>\n\t\t<method name=\"getFraction(IIIF)F\"/>\n\t\t<method name=\"getIndex(I)I\"/>\n\t\t<method name=\"getIndexCount()I\"/>\n\t\t<method name=\"getInt(II)I\"/>\n\t\t<method name=\"getInteger(II)I\"/>\n\t\t<method name=\"getLayoutDimension(II)I\" since=\"3\"/>\n\t\t<method name=\"getLayoutDimension(ILjava/lang/String;)I\"/>\n\t\t<method name=\"getNonResourceString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getPositionDescription()Ljava/lang/String;\"/>\n\t\t<method name=\"getResourceId(II)I\"/>\n\t\t<method name=\"getResources()Landroid/content/res/Resources;\"/>\n\t\t<method name=\"getSourceResourceId(II)I\" since=\"29\"/>\n\t\t<method name=\"getString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getText(I)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTextArray(I)[Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getType(I)I\" since=\"21\"/>\n\t\t<method name=\"getValue(ILandroid/util/TypedValue;)Z\"/>\n\t\t<method name=\"hasValue(I)Z\"/>\n\t\t<method name=\"hasValueOrEmpty(I)Z\" since=\"22\"/>\n\t\t<method name=\"length()I\"/>\n\t\t<method name=\"peekValue(I)Landroid/util/TypedValue;\"/>\n\t\t<method name=\"recycle()V\"/>\n\t</class>\n\t<class name=\"android/content/res/XmlResourceParser\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/util/AttributeSet\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\" since=\"19\"/>\n\t\t<implements name=\"org/xmlpull/v1/XmlPullParser\"/>\n\t\t<method name=\"close()V\"/>\n\t</class>\n\t<class name=\"android/database/AbstractCursor\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/database/CrossProcessCursor\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"checkPosition()V\"/>\n\t\t<method name=\"getNotificationUri()Landroid/net/Uri;\" since=\"11\"/>\n\t\t<method name=\"getUpdatedField(I)Ljava/lang/Object;\" deprecated=\"15\"/>\n\t\t<method name=\"isFieldUpdated(I)Z\" deprecated=\"15\"/>\n\t\t<method name=\"onChange(Z)V\"/>\n\t\t<field name=\"mClosed\" deprecated=\"23\"/>\n\t\t<field name=\"mContentResolver\" deprecated=\"23\"/>\n\t\t<field name=\"mCurrentRowID\" deprecated=\"16\" removed=\"23\"/>\n\t\t<field name=\"mPos\" deprecated=\"23\"/>\n\t\t<field name=\"mRowIdColumnIndex\" deprecated=\"16\" removed=\"23\"/>\n\t\t<field name=\"mUpdatedRows\" deprecated=\"15\" removed=\"23\"/>\n\t</class>\n\t<class name=\"android/database/AbstractCursor$SelfContentObserver\" since=\"1\">\n\t\t<extends name=\"android/database/ContentObserver\"/>\n\t\t<method name=\"&lt;init>(Landroid/database/AbstractCursor;)V\"/>\n\t</class>\n\t<class name=\"android/database/AbstractWindowedCursor\" since=\"1\">\n\t\t<extends name=\"android/database/AbstractCursor\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"hasWindow()Z\"/>\n\t\t<method name=\"isBlob(I)Z\" deprecated=\"15\"/>\n\t\t<method name=\"isFloat(I)Z\" since=\"5\" deprecated=\"15\"/>\n\t\t<method name=\"isLong(I)Z\" since=\"5\" deprecated=\"15\"/>\n\t\t<method name=\"isString(I)Z\" since=\"5\" deprecated=\"15\"/>\n\t\t<method name=\"setWindow(Landroid/database/CursorWindow;)V\"/>\n\t\t<field name=\"mWindow\"/>\n\t</class>\n\t<class name=\"android/database/CharArrayBuffer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>([C)V\"/>\n\t\t<field name=\"data\"/>\n\t\t<field name=\"sizeCopied\"/>\n\t</class>\n\t<class name=\"android/database/ContentObservable\" since=\"1\">\n\t\t<extends name=\"android/database/Observable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"dispatchChange(Z)V\" deprecated=\"16\"/>\n\t\t<method name=\"dispatchChange(ZLandroid/net/Uri;)V\" since=\"16\"/>\n\t\t<method name=\"notifyChange(Z)V\" deprecated=\"16\"/>\n\t\t<method name=\"registerObserver(Landroid/database/ContentObserver;)V\"/>\n\t</class>\n\t<class name=\"android/database/ContentObserver\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Handler;)V\"/>\n\t\t<method name=\"deliverSelfNotifications()Z\"/>\n\t\t<method name=\"dispatchChange(Z)V\" deprecated=\"16\"/>\n\t\t<method name=\"dispatchChange(ZLandroid/net/Uri;)V\" since=\"16\"/>\n\t\t<method name=\"onChange(Z)V\"/>\n\t\t<method name=\"onChange(ZLandroid/net/Uri;)V\" since=\"16\"/>\n\t</class>\n\t<class name=\"android/database/CrossProcessCursor\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/database/Cursor\"/>\n\t\t<method name=\"fillWindow(ILandroid/database/CursorWindow;)V\"/>\n\t\t<method name=\"getWindow()Landroid/database/CursorWindow;\"/>\n\t\t<method name=\"onMove(II)Z\"/>\n\t</class>\n\t<class name=\"android/database/CrossProcessCursorWrapper\" since=\"15\">\n\t\t<extends name=\"android/database/CursorWrapper\"/>\n\t\t<implements name=\"android/database/CrossProcessCursor\"/>\n\t\t<method name=\"&lt;init>(Landroid/database/Cursor;)V\"/>\n\t</class>\n\t<class name=\"android/database/Cursor\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\" since=\"16\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"copyStringToBuffer(ILandroid/database/CharArrayBuffer;)V\"/>\n\t\t<method name=\"deactivate()V\" deprecated=\"16\"/>\n\t\t<method name=\"getBlob(I)[B\"/>\n\t\t<method name=\"getColumnCount()I\"/>\n\t\t<method name=\"getColumnIndex(Ljava/lang/String;)I\"/>\n\t\t<method name=\"getColumnIndexOrThrow(Ljava/lang/String;)I\"/>\n\t\t<method name=\"getColumnName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getColumnNames()[Ljava/lang/String;\"/>\n\t\t<method name=\"getCount()I\"/>\n\t\t<method name=\"getDouble(I)D\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getFloat(I)F\"/>\n\t\t<method name=\"getInt(I)I\"/>\n\t\t<method name=\"getLong(I)J\"/>\n\t\t<method name=\"getNotificationUri()Landroid/net/Uri;\" since=\"19\"/>\n\t\t<method name=\"getNotificationUris()Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"getPosition()I\"/>\n\t\t<method name=\"getShort(I)S\"/>\n\t\t<method name=\"getString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getType(I)I\" since=\"11\"/>\n\t\t<method name=\"getWantsAllOnMoveCalls()Z\"/>\n\t\t<method name=\"isAfterLast()Z\"/>\n\t\t<method name=\"isBeforeFirst()Z\"/>\n\t\t<method name=\"isClosed()Z\"/>\n\t\t<method name=\"isFirst()Z\"/>\n\t\t<method name=\"isLast()Z\"/>\n\t\t<method name=\"isNull(I)Z\"/>\n\t\t<method name=\"move(I)Z\"/>\n\t\t<method name=\"moveToFirst()Z\"/>\n\t\t<method name=\"moveToLast()Z\"/>\n\t\t<method name=\"moveToNext()Z\"/>\n\t\t<method name=\"moveToPosition(I)Z\"/>\n\t\t<method name=\"moveToPrevious()Z\"/>\n\t\t<method name=\"registerContentObserver(Landroid/database/ContentObserver;)V\"/>\n\t\t<method name=\"registerDataSetObserver(Landroid/database/DataSetObserver;)V\"/>\n\t\t<method name=\"requery()Z\" deprecated=\"15\"/>\n\t\t<method name=\"respond(Landroid/os/Bundle;)Landroid/os/Bundle;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)V\" since=\"23\"/>\n\t\t<method name=\"setNotificationUri(Landroid/content/ContentResolver;Landroid/net/Uri;)V\"/>\n\t\t<method name=\"setNotificationUris(Landroid/content/ContentResolver;Ljava/util/List;)V\" since=\"29\"/>\n\t\t<method name=\"unregisterContentObserver(Landroid/database/ContentObserver;)V\"/>\n\t\t<method name=\"unregisterDataSetObserver(Landroid/database/DataSetObserver;)V\"/>\n\t\t<field name=\"FIELD_TYPE_BLOB\" since=\"11\"/>\n\t\t<field name=\"FIELD_TYPE_FLOAT\" since=\"11\"/>\n\t\t<field name=\"FIELD_TYPE_INTEGER\" since=\"11\"/>\n\t\t<field name=\"FIELD_TYPE_NULL\" since=\"11\"/>\n\t\t<field name=\"FIELD_TYPE_STRING\" since=\"11\"/>\n\t</class>\n\t<class name=\"android/database/CursorIndexOutOfBoundsException\" since=\"1\">\n\t\t<extends name=\"java/lang/IndexOutOfBoundsException\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/database/CursorJoiner\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Iterable\"/>\n\t\t<implements name=\"java/util/Iterator\"/>\n\t\t<method name=\"&lt;init>(Landroid/database/Cursor;[Ljava/lang/String;Landroid/database/Cursor;[Ljava/lang/String;)V\"/>\n\t\t<method name=\"next()Landroid/database/CursorJoiner$Result;\"/>\n\t</class>\n\t<class name=\"android/database/CursorJoiner$Result\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/database/CursorJoiner$Result;\"/>\n\t\t<method name=\"values()[Landroid/database/CursorJoiner$Result;\"/>\n\t\t<field name=\"BOTH\"/>\n\t\t<field name=\"LEFT\"/>\n\t\t<field name=\"RIGHT\"/>\n\t</class>\n\t<class name=\"android/database/CursorWindow\" since=\"1\">\n\t\t<extends name=\"android/database/sqlite/SQLiteClosable\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" since=\"15\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;J)V\" since=\"28\"/>\n\t\t<method name=\"&lt;init>(Z)V\" deprecated=\"15\"/>\n\t\t<method name=\"allocRow()Z\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"close()V\" removed=\"16\"/>\n\t\t<method name=\"copyStringToBuffer(IILandroid/database/CharArrayBuffer;)V\"/>\n\t\t<method name=\"freeLastRow()V\"/>\n\t\t<method name=\"getBlob(II)[B\"/>\n\t\t<method name=\"getDouble(II)D\"/>\n\t\t<method name=\"getFloat(II)F\"/>\n\t\t<method name=\"getInt(II)I\"/>\n\t\t<method name=\"getLong(II)J\"/>\n\t\t<method name=\"getNumRows()I\"/>\n\t\t<method name=\"getShort(II)S\"/>\n\t\t<method name=\"getStartPosition()I\"/>\n\t\t<method name=\"getString(II)Ljava/lang/String;\"/>\n\t\t<method name=\"getType(II)I\" since=\"11\"/>\n\t\t<method name=\"isBlob(II)Z\" deprecated=\"15\"/>\n\t\t<method name=\"isFloat(II)Z\" since=\"5\" deprecated=\"15\"/>\n\t\t<method name=\"isLong(II)Z\" since=\"5\" deprecated=\"15\"/>\n\t\t<method name=\"isNull(II)Z\" deprecated=\"15\"/>\n\t\t<method name=\"isString(II)Z\" since=\"5\" deprecated=\"15\"/>\n\t\t<method name=\"newFromParcel(Landroid/os/Parcel;)Landroid/database/CursorWindow;\"/>\n\t\t<method name=\"putBlob([BII)Z\"/>\n\t\t<method name=\"putDouble(DII)Z\"/>\n\t\t<method name=\"putLong(JII)Z\"/>\n\t\t<method name=\"putNull(II)Z\"/>\n\t\t<method name=\"putString(Ljava/lang/String;II)Z\"/>\n\t\t<method name=\"setNumColumns(I)Z\"/>\n\t\t<method name=\"setStartPosition(I)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/database/CursorWrapper\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/database/Cursor\"/>\n\t\t<method name=\"&lt;init>(Landroid/database/Cursor;)V\"/>\n\t\t<method name=\"getWrappedCursor()Landroid/database/Cursor;\" since=\"11\"/>\n\t</class>\n\t<class name=\"android/database/DataSetObservable\" since=\"1\">\n\t\t<extends name=\"android/database/Observable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"notifyChanged()V\"/>\n\t\t<method name=\"notifyInvalidated()V\"/>\n\t</class>\n\t<class name=\"android/database/DataSetObserver\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onChanged()V\"/>\n\t\t<method name=\"onInvalidated()V\"/>\n\t</class>\n\t<class name=\"android/database/DatabaseErrorHandler\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onCorruption(Landroid/database/sqlite/SQLiteDatabase;)V\"/>\n\t</class>\n\t<class name=\"android/database/DatabaseUtils\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"appendEscapedSQLString(Ljava/lang/StringBuilder;Ljava/lang/String;)V\"/>\n\t\t<method name=\"appendSelectionArgs([Ljava/lang/String;[Ljava/lang/String;)[Ljava/lang/String;\" since=\"11\"/>\n\t\t<method name=\"appendValueToSql(Ljava/lang/StringBuilder;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"bindObjectToProgram(Landroid/database/sqlite/SQLiteProgram;ILjava/lang/Object;)V\"/>\n\t\t<method name=\"blobFileDescriptorForQuery(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;\" since=\"11\"/>\n\t\t<method name=\"blobFileDescriptorForQuery(Landroid/database/sqlite/SQLiteStatement;[Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;\" since=\"11\"/>\n\t\t<method name=\"concatenateWhere(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\" since=\"11\"/>\n\t\t<method name=\"createDbFromSqlStatements(Landroid/content/Context;Ljava/lang/String;ILjava/lang/String;)V\"/>\n\t\t<method name=\"cursorDoubleToContentValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;)V\"/>\n\t\t<method name=\"cursorDoubleToContentValuesIfPresent(Landroid/database/Cursor;Landroid/content/ContentValues;Ljava/lang/String;)V\" since=\"8\"/>\n\t\t<method name=\"cursorDoubleToCursorValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;)V\"/>\n\t\t<method name=\"cursorFloatToContentValuesIfPresent(Landroid/database/Cursor;Landroid/content/ContentValues;Ljava/lang/String;)V\" since=\"8\"/>\n\t\t<method name=\"cursorIntToContentValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;)V\"/>\n\t\t<method name=\"cursorIntToContentValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;)V\"/>\n\t\t<method name=\"cursorIntToContentValuesIfPresent(Landroid/database/Cursor;Landroid/content/ContentValues;Ljava/lang/String;)V\" since=\"8\"/>\n\t\t<method name=\"cursorLongToContentValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;)V\"/>\n\t\t<method name=\"cursorLongToContentValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;)V\"/>\n\t\t<method name=\"cursorLongToContentValuesIfPresent(Landroid/database/Cursor;Landroid/content/ContentValues;Ljava/lang/String;)V\" since=\"8\"/>\n\t\t<method name=\"cursorRowToContentValues(Landroid/database/Cursor;Landroid/content/ContentValues;)V\"/>\n\t\t<method name=\"cursorShortToContentValuesIfPresent(Landroid/database/Cursor;Landroid/content/ContentValues;Ljava/lang/String;)V\" since=\"8\"/>\n\t\t<method name=\"cursorStringToContentValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;)V\"/>\n\t\t<method name=\"cursorStringToContentValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;)V\"/>\n\t\t<method name=\"cursorStringToContentValuesIfPresent(Landroid/database/Cursor;Landroid/content/ContentValues;Ljava/lang/String;)V\" since=\"8\"/>\n\t\t<method name=\"cursorStringToInsertHelper(Landroid/database/Cursor;Ljava/lang/String;Landroid/database/DatabaseUtils$InsertHelper;I)V\"/>\n\t\t<method name=\"dumpCurrentRow(Landroid/database/Cursor;)V\"/>\n\t\t<method name=\"dumpCurrentRow(Landroid/database/Cursor;Ljava/io/PrintStream;)V\"/>\n\t\t<method name=\"dumpCurrentRow(Landroid/database/Cursor;Ljava/lang/StringBuilder;)V\"/>\n\t\t<method name=\"dumpCurrentRowToString(Landroid/database/Cursor;)Ljava/lang/String;\"/>\n\t\t<method name=\"dumpCursor(Landroid/database/Cursor;)V\"/>\n\t\t<method name=\"dumpCursor(Landroid/database/Cursor;Ljava/io/PrintStream;)V\"/>\n\t\t<method name=\"dumpCursor(Landroid/database/Cursor;Ljava/lang/StringBuilder;)V\"/>\n\t\t<method name=\"dumpCursorToString(Landroid/database/Cursor;)Ljava/lang/String;\"/>\n\t\t<method name=\"getCollationKey(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getHexCollationKey(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getSqlStatementType(Ljava/lang/String;)I\" since=\"11\"/>\n\t\t<method name=\"longForQuery(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/String;)J\"/>\n\t\t<method name=\"longForQuery(Landroid/database/sqlite/SQLiteStatement;[Ljava/lang/String;)J\"/>\n\t\t<method name=\"queryNumEntries(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;)J\"/>\n\t\t<method name=\"queryNumEntries(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;Ljava/lang/String;)J\" since=\"11\"/>\n\t\t<method name=\"queryNumEntries(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)J\" since=\"11\"/>\n\t\t<method name=\"readExceptionFromParcel(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"readExceptionWithFileNotFoundExceptionFromParcel(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"readExceptionWithOperationApplicationExceptionFromParcel(Landroid/os/Parcel;)V\" since=\"5\"/>\n\t\t<method name=\"sqlEscapeString(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"stringForQuery(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"stringForQuery(Landroid/database/sqlite/SQLiteStatement;[Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"writeExceptionToParcel(Landroid/os/Parcel;Ljava/lang/Exception;)V\"/>\n\t\t<field name=\"STATEMENT_ABORT\" since=\"11\"/>\n\t\t<field name=\"STATEMENT_ATTACH\" since=\"11\"/>\n\t\t<field name=\"STATEMENT_BEGIN\" since=\"11\"/>\n\t\t<field name=\"STATEMENT_COMMIT\" since=\"11\"/>\n\t\t<field name=\"STATEMENT_DDL\" since=\"11\"/>\n\t\t<field name=\"STATEMENT_OTHER\" since=\"11\"/>\n\t\t<field name=\"STATEMENT_PRAGMA\" since=\"11\"/>\n\t\t<field name=\"STATEMENT_SELECT\" since=\"11\"/>\n\t\t<field name=\"STATEMENT_UNPREPARED\" since=\"11\"/>\n\t\t<field name=\"STATEMENT_UPDATE\" since=\"11\"/>\n\t</class>\n\t<class name=\"android/database/DatabaseUtils$InsertHelper\" since=\"1\" deprecated=\"17\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"bind(ID)V\" deprecated=\"29\"/>\n\t\t<method name=\"bind(IF)V\" deprecated=\"29\"/>\n\t\t<method name=\"bind(II)V\" deprecated=\"29\"/>\n\t\t<method name=\"bind(IJ)V\" deprecated=\"29\"/>\n\t\t<method name=\"bind(ILjava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"bind(IZ)V\" deprecated=\"29\"/>\n\t\t<method name=\"bind(I[B)V\" deprecated=\"29\"/>\n\t\t<method name=\"bindNull(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"close()V\" deprecated=\"29\"/>\n\t\t<method name=\"execute()J\" deprecated=\"29\"/>\n\t\t<method name=\"getColumnIndex(Ljava/lang/String;)I\" deprecated=\"29\"/>\n\t\t<method name=\"insert(Landroid/content/ContentValues;)J\" deprecated=\"29\"/>\n\t\t<method name=\"prepareForInsert()V\" deprecated=\"29\"/>\n\t\t<method name=\"prepareForReplace()V\" deprecated=\"29\"/>\n\t\t<method name=\"replace(Landroid/content/ContentValues;)J\" deprecated=\"29\"/>\n\t\t<field name=\"TABLE_INFO_PRAGMA_DEFAULT_INDEX\" removed=\"17\"/>\n\t</class>\n\t<class name=\"android/database/DefaultDatabaseErrorHandler\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/database/DatabaseErrorHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/database/MatrixCursor\" since=\"1\">\n\t\t<extends name=\"android/database/AbstractCursor\"/>\n\t\t<method name=\"&lt;init>([Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>([Ljava/lang/String;I)V\"/>\n\t\t<method name=\"addRow(Ljava/lang/Iterable;)V\"/>\n\t\t<method name=\"addRow([Ljava/lang/Object;)V\"/>\n\t\t<method name=\"newRow()Landroid/database/MatrixCursor$RowBuilder;\"/>\n\t</class>\n\t<class name=\"android/database/MatrixCursor$RowBuilder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"add(Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;\"/>\n\t\t<method name=\"add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;\" since=\"19\"/>\n\t</class>\n\t<class name=\"android/database/MergeCursor\" since=\"1\">\n\t\t<extends name=\"android/database/AbstractCursor\"/>\n\t\t<method name=\"&lt;init>([Landroid/database/Cursor;)V\"/>\n\t</class>\n\t<class name=\"android/database/Observable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"registerObserver(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"unregisterAll()V\"/>\n\t\t<method name=\"unregisterObserver(Ljava/lang/Object;)V\"/>\n\t\t<field name=\"mObservers\"/>\n\t</class>\n\t<class name=\"android/database/SQLException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\" since=\"16\"/>\n\t</class>\n\t<class name=\"android/database/StaleDataException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteAbortException\" since=\"1\">\n\t\t<extends name=\"android/database/sqlite/SQLiteException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteAccessPermException\" since=\"11\">\n\t\t<extends name=\"android/database/sqlite/SQLiteException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteBindOrColumnIndexOutOfRangeException\" since=\"11\">\n\t\t<extends name=\"android/database/sqlite/SQLiteException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteBlobTooBigException\" since=\"11\">\n\t\t<extends name=\"android/database/sqlite/SQLiteException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteCantOpenDatabaseException\" since=\"11\">\n\t\t<extends name=\"android/database/sqlite/SQLiteException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteClosable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\" since=\"16\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"acquireReference()V\"/>\n\t\t<method name=\"onAllReferencesReleased()V\"/>\n\t\t<method name=\"onAllReferencesReleasedFromContainer()V\" deprecated=\"16\"/>\n\t\t<method name=\"releaseReference()V\"/>\n\t\t<method name=\"releaseReferenceFromContainer()V\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteConstraintException\" since=\"1\">\n\t\t<extends name=\"android/database/sqlite/SQLiteException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteCursor\" since=\"1\">\n\t\t<extends name=\"android/database/AbstractWindowedCursor\"/>\n\t\t<method name=\"&lt;init>(Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)V\" since=\"11\"/>\n\t\t<method name=\"&lt;init>(Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)V\" deprecated=\"15\"/>\n\t\t<method name=\"getDatabase()Landroid/database/sqlite/SQLiteDatabase;\"/>\n\t\t<method name=\"setFillWindowForwardOnly(Z)V\" since=\"28\"/>\n\t\t<method name=\"setSelectionArguments([Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteCursorDriver\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"cursorClosed()V\"/>\n\t\t<method name=\"cursorDeactivated()V\"/>\n\t\t<method name=\"cursorRequeried(Landroid/database/Cursor;)V\"/>\n\t\t<method name=\"query(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;[Ljava/lang/String;)Landroid/database/Cursor;\"/>\n\t\t<method name=\"setBindArguments([Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteDatabase\" since=\"1\">\n\t\t<extends name=\"android/database/sqlite/SQLiteClosable\"/>\n\t\t<method name=\"beginTransaction()V\"/>\n\t\t<method name=\"beginTransactionNonExclusive()V\" since=\"11\"/>\n\t\t<method name=\"beginTransactionWithListener(Landroid/database/sqlite/SQLiteTransactionListener;)V\" since=\"5\"/>\n\t\t<method name=\"beginTransactionWithListenerNonExclusive(Landroid/database/sqlite/SQLiteTransactionListener;)V\" since=\"11\"/>\n\t\t<method name=\"close()V\" removed=\"16\"/>\n\t\t<method name=\"compileStatement(Ljava/lang/String;)Landroid/database/sqlite/SQLiteStatement;\"/>\n\t\t<method name=\"create(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase;\"/>\n\t\t<method name=\"createInMemory(Landroid/database/sqlite/SQLiteDatabase$OpenParams;)Landroid/database/sqlite/SQLiteDatabase;\" since=\"27\"/>\n\t\t<method name=\"delete(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)I\"/>\n\t\t<method name=\"deleteDatabase(Ljava/io/File;)Z\" since=\"16\"/>\n\t\t<method name=\"disableWriteAheadLogging()V\" since=\"16\"/>\n\t\t<method name=\"enableWriteAheadLogging()Z\" since=\"11\"/>\n\t\t<method name=\"endTransaction()V\"/>\n\t\t<method name=\"execSQL(Ljava/lang/String;)V\"/>\n\t\t<method name=\"execSQL(Ljava/lang/String;[Ljava/lang/Object;)V\"/>\n\t\t<method name=\"findEditTable(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getAttachedDbs()Ljava/util/List;\" since=\"11\"/>\n\t\t<method name=\"getMaximumSize()J\"/>\n\t\t<method name=\"getPageSize()J\"/>\n\t\t<method name=\"getPath()Ljava/lang/String;\"/>\n\t\t<method name=\"getSyncedTables()Ljava/util/Map;\" deprecated=\"15\"/>\n\t\t<method name=\"getVersion()I\"/>\n\t\t<method name=\"inTransaction()Z\"/>\n\t\t<method name=\"insert(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J\"/>\n\t\t<method name=\"insertOrThrow(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J\"/>\n\t\t<method name=\"insertWithOnConflict(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;I)J\" since=\"8\"/>\n\t\t<method name=\"isDatabaseIntegrityOk()Z\" since=\"11\"/>\n\t\t<method name=\"isDbLockedByCurrentThread()Z\"/>\n\t\t<method name=\"isDbLockedByOtherThreads()Z\" deprecated=\"16\"/>\n\t\t<method name=\"isOpen()Z\"/>\n\t\t<method name=\"isReadOnly()Z\"/>\n\t\t<method name=\"isWriteAheadLoggingEnabled()Z\" since=\"16\"/>\n\t\t<method name=\"markTableSyncable(Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"15\"/>\n\t\t<method name=\"markTableSyncable(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"15\"/>\n\t\t<method name=\"needUpgrade(I)Z\"/>\n\t\t<method name=\"openDatabase(Ljava/io/File;Landroid/database/sqlite/SQLiteDatabase$OpenParams;)Landroid/database/sqlite/SQLiteDatabase;\" since=\"27\"/>\n\t\t<method name=\"openDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;I)Landroid/database/sqlite/SQLiteDatabase;\"/>\n\t\t<method name=\"openDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;ILandroid/database/DatabaseErrorHandler;)Landroid/database/sqlite/SQLiteDatabase;\" since=\"11\"/>\n\t\t<method name=\"openOrCreateDatabase(Ljava/io/File;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase;\"/>\n\t\t<method name=\"openOrCreateDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase;\"/>\n\t\t<method name=\"openOrCreateDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;Landroid/database/DatabaseErrorHandler;)Landroid/database/sqlite/SQLiteDatabase;\" since=\"11\"/>\n\t\t<method name=\"query(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;\"/>\n\t\t<method name=\"query(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;\"/>\n\t\t<method name=\"query(ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;\"/>\n\t\t<method name=\"query(ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;\" since=\"16\"/>\n\t\t<method name=\"queryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;\"/>\n\t\t<method name=\"queryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;\" since=\"16\"/>\n\t\t<method name=\"rawQuery(Ljava/lang/String;[Ljava/lang/String;)Landroid/database/Cursor;\"/>\n\t\t<method name=\"rawQuery(Ljava/lang/String;[Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;\" since=\"16\"/>\n\t\t<method name=\"rawQueryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;\"/>\n\t\t<method name=\"rawQueryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;\" since=\"16\"/>\n\t\t<method name=\"releaseMemory()I\"/>\n\t\t<method name=\"replace(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J\"/>\n\t\t<method name=\"replaceOrThrow(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J\"/>\n\t\t<method name=\"setForeignKeyConstraintsEnabled(Z)V\" since=\"16\"/>\n\t\t<method name=\"setLocale(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"setLockingEnabled(Z)V\" deprecated=\"16\"/>\n\t\t<method name=\"setMaxSqlCacheSize(I)V\" since=\"11\"/>\n\t\t<method name=\"setMaximumSize(J)J\"/>\n\t\t<method name=\"setPageSize(J)V\"/>\n\t\t<method name=\"setTransactionSuccessful()V\"/>\n\t\t<method name=\"setVersion(I)V\"/>\n\t\t<method name=\"update(Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I\"/>\n\t\t<method name=\"updateWithOnConflict(Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;I)I\" since=\"8\"/>\n\t\t<method name=\"validateSql(Ljava/lang/String;Landroid/os/CancellationSignal;)V\" since=\"24\"/>\n\t\t<method name=\"yieldIfContended()Z\" deprecated=\"15\"/>\n\t\t<method name=\"yieldIfContendedSafely()Z\" since=\"3\"/>\n\t\t<method name=\"yieldIfContendedSafely(J)Z\" since=\"5\"/>\n\t\t<field name=\"CONFLICT_ABORT\" since=\"8\"/>\n\t\t<field name=\"CONFLICT_FAIL\" since=\"8\"/>\n\t\t<field name=\"CONFLICT_IGNORE\" since=\"8\"/>\n\t\t<field name=\"CONFLICT_NONE\" since=\"8\"/>\n\t\t<field name=\"CONFLICT_REPLACE\" since=\"8\"/>\n\t\t<field name=\"CONFLICT_ROLLBACK\" since=\"8\"/>\n\t\t<field name=\"CREATE_IF_NECESSARY\"/>\n\t\t<field name=\"ENABLE_WRITE_AHEAD_LOGGING\" since=\"16\"/>\n\t\t<field name=\"MAX_SQL_CACHE_SIZE\" since=\"11\"/>\n\t\t<field name=\"NO_LOCALIZED_COLLATORS\"/>\n\t\t<field name=\"OPEN_READONLY\"/>\n\t\t<field name=\"OPEN_READWRITE\"/>\n\t\t<field name=\"SQLITE_MAX_LIKE_PATTERN_LENGTH\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteDatabase$CursorFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"newCursor(Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)Landroid/database/Cursor;\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteDatabase$OpenParams\" since=\"27\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getCursorFactory()Landroid/database/sqlite/SQLiteDatabase$CursorFactory;\"/>\n\t\t<method name=\"getErrorHandler()Landroid/database/DatabaseErrorHandler;\"/>\n\t\t<method name=\"getIdleConnectionTimeout()J\"/>\n\t\t<method name=\"getJournalMode()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getLookasideSlotCount()I\"/>\n\t\t<method name=\"getLookasideSlotSize()I\"/>\n\t\t<method name=\"getOpenFlags()I\"/>\n\t\t<method name=\"getSynchronousMode()Ljava/lang/String;\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteDatabase$OpenParams$Builder\" since=\"27\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/database/sqlite/SQLiteDatabase$OpenParams;)V\"/>\n\t\t<method name=\"addOpenFlags(I)Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;\"/>\n\t\t<method name=\"build()Landroid/database/sqlite/SQLiteDatabase$OpenParams;\"/>\n\t\t<method name=\"removeOpenFlags(I)Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;\"/>\n\t\t<method name=\"setCursorFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;\"/>\n\t\t<method name=\"setErrorHandler(Landroid/database/DatabaseErrorHandler;)Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;\"/>\n\t\t<method name=\"setIdleConnectionTimeout(J)Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;\" deprecated=\"29\"/>\n\t\t<method name=\"setJournalMode(Ljava/lang/String;)Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;\" since=\"28\"/>\n\t\t<method name=\"setLookasideConfig(II)Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;\"/>\n\t\t<method name=\"setOpenFlags(I)Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;\"/>\n\t\t<method name=\"setSynchronousMode(Ljava/lang/String;)Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteDatabaseCorruptException\" since=\"1\">\n\t\t<extends name=\"android/database/sqlite/SQLiteException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteDatabaseLockedException\" since=\"11\">\n\t\t<extends name=\"android/database/sqlite/SQLiteException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteDatatypeMismatchException\" since=\"11\">\n\t\t<extends name=\"android/database/sqlite/SQLiteException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteDiskIOException\" since=\"1\">\n\t\t<extends name=\"android/database/sqlite/SQLiteException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteDoneException\" since=\"1\">\n\t\t<extends name=\"android/database/sqlite/SQLiteException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteException\" since=\"1\">\n\t\t<extends name=\"android/database/SQLException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\" since=\"16\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteFullException\" since=\"1\">\n\t\t<extends name=\"android/database/sqlite/SQLiteException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteMisuseException\" since=\"1\">\n\t\t<extends name=\"android/database/sqlite/SQLiteException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteOpenHelper\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\" since=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/lang/String;ILandroid/database/sqlite/SQLiteDatabase$OpenParams;)V\" since=\"28\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;ILandroid/database/DatabaseErrorHandler;)V\" since=\"11\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"getDatabaseName()Ljava/lang/String;\" since=\"14\"/>\n\t\t<method name=\"getReadableDatabase()Landroid/database/sqlite/SQLiteDatabase;\"/>\n\t\t<method name=\"getWritableDatabase()Landroid/database/sqlite/SQLiteDatabase;\"/>\n\t\t<method name=\"onConfigure(Landroid/database/sqlite/SQLiteDatabase;)V\" since=\"16\"/>\n\t\t<method name=\"onCreate(Landroid/database/sqlite/SQLiteDatabase;)V\"/>\n\t\t<method name=\"onDowngrade(Landroid/database/sqlite/SQLiteDatabase;II)V\" since=\"11\"/>\n\t\t<method name=\"onOpen(Landroid/database/sqlite/SQLiteDatabase;)V\"/>\n\t\t<method name=\"onUpgrade(Landroid/database/sqlite/SQLiteDatabase;II)V\"/>\n\t\t<method name=\"setIdleConnectionTimeout(J)V\" since=\"27\" deprecated=\"29\"/>\n\t\t<method name=\"setLookasideConfig(II)V\" since=\"27\"/>\n\t\t<method name=\"setOpenParams(Landroid/database/sqlite/SQLiteDatabase$OpenParams;)V\" since=\"28\"/>\n\t\t<method name=\"setWriteAheadLoggingEnabled(Z)V\" since=\"16\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteOutOfMemoryException\" since=\"11\">\n\t\t<extends name=\"android/database/sqlite/SQLiteException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteProgram\" since=\"1\">\n\t\t<extends name=\"android/database/sqlite/SQLiteClosable\"/>\n\t\t<method name=\"bindAllArgsAsStrings([Ljava/lang/String;)V\" since=\"11\"/>\n\t\t<method name=\"bindBlob(I[B)V\"/>\n\t\t<method name=\"bindDouble(ID)V\"/>\n\t\t<method name=\"bindLong(IJ)V\"/>\n\t\t<method name=\"bindNull(I)V\"/>\n\t\t<method name=\"bindString(ILjava/lang/String;)V\"/>\n\t\t<method name=\"clearBindings()V\"/>\n\t\t<method name=\"close()V\" removed=\"16\"/>\n\t\t<method name=\"compile(Ljava/lang/String;Z)V\" deprecated=\"15\" removed=\"16\"/>\n\t\t<method name=\"getUniqueId()I\" deprecated=\"15\"/>\n\t\t<method name=\"native_bind_blob(I[B)V\" removed=\"16\"/>\n\t\t<method name=\"native_bind_double(ID)V\" removed=\"16\"/>\n\t\t<method name=\"native_bind_long(IJ)V\" removed=\"16\"/>\n\t\t<method name=\"native_bind_null(I)V\" removed=\"16\"/>\n\t\t<method name=\"native_bind_string(ILjava/lang/String;)V\" removed=\"16\"/>\n\t\t<method name=\"native_compile(Ljava/lang/String;)V\" deprecated=\"15\" removed=\"16\"/>\n\t\t<method name=\"native_finalize()V\" deprecated=\"15\" removed=\"16\"/>\n\t\t<field name=\"mDatabase\" deprecated=\"15\" removed=\"16\"/>\n\t\t<field name=\"nHandle\" deprecated=\"15\" removed=\"16\"/>\n\t\t<field name=\"nStatement\" deprecated=\"15\" removed=\"16\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteQuery\" since=\"1\">\n\t\t<extends name=\"android/database/sqlite/SQLiteProgram\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteQueryBuilder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"appendColumns(Ljava/lang/StringBuilder;[Ljava/lang/String;)V\"/>\n\t\t<method name=\"appendWhere(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"appendWhereEscapeString(Ljava/lang/String;)V\"/>\n\t\t<method name=\"appendWhereStandalone(Ljava/lang/CharSequence;)V\" since=\"29\"/>\n\t\t<method name=\"buildQuery([Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\" since=\"11\"/>\n\t\t<method name=\"buildQuery([Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"buildQueryString(ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"buildUnionQuery([Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"buildUnionSubQuery(Ljava/lang/String;[Ljava/lang/String;Ljava/util/Set;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\" since=\"11\"/>\n\t\t<method name=\"buildUnionSubQuery(Ljava/lang/String;[Ljava/lang/String;Ljava/util/Set;ILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"delete(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/String;)I\" since=\"29\"/>\n\t\t<method name=\"getCursorFactory()Landroid/database/sqlite/SQLiteDatabase$CursorFactory;\" since=\"29\"/>\n\t\t<method name=\"getProjectionMap()Ljava/util/Map;\" since=\"29\"/>\n\t\t<method name=\"getTables()Ljava/lang/String;\"/>\n\t\t<method name=\"isDistinct()Z\" since=\"29\"/>\n\t\t<method name=\"isStrict()Z\" since=\"29\"/>\n\t\t<method name=\"query(Landroid/database/sqlite/SQLiteDatabase;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;\"/>\n\t\t<method name=\"query(Landroid/database/sqlite/SQLiteDatabase;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;\"/>\n\t\t<method name=\"query(Landroid/database/sqlite/SQLiteDatabase;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;\" since=\"16\"/>\n\t\t<method name=\"setCursorFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;)V\"/>\n\t\t<method name=\"setDistinct(Z)V\"/>\n\t\t<method name=\"setProjectionMap(Ljava/util/Map;)V\"/>\n\t\t<method name=\"setStrict(Z)V\" since=\"14\"/>\n\t\t<method name=\"setTables(Ljava/lang/String;)V\"/>\n\t\t<method name=\"update(Landroid/database/sqlite/SQLiteDatabase;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteReadOnlyDatabaseException\" since=\"11\">\n\t\t<extends name=\"android/database/sqlite/SQLiteException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteStatement\" since=\"1\">\n\t\t<extends name=\"android/database/sqlite/SQLiteProgram\"/>\n\t\t<method name=\"execute()V\"/>\n\t\t<method name=\"executeInsert()J\"/>\n\t\t<method name=\"executeUpdateDelete()I\" since=\"11\"/>\n\t\t<method name=\"simpleQueryForBlobFileDescriptor()Landroid/os/ParcelFileDescriptor;\" since=\"11\"/>\n\t\t<method name=\"simpleQueryForLong()J\"/>\n\t\t<method name=\"simpleQueryForString()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteTableLockedException\" since=\"11\">\n\t\t<extends name=\"android/database/sqlite/SQLiteException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/database/sqlite/SQLiteTransactionListener\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onBegin()V\"/>\n\t\t<method name=\"onCommit()V\"/>\n\t\t<method name=\"onRollback()V\"/>\n\t</class>\n\t<class name=\"android/drm/DrmConvertedStatus\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I[BI)V\"/>\n\t\t<field name=\"STATUS_ERROR\"/>\n\t\t<field name=\"STATUS_INPUTDATA_ERROR\"/>\n\t\t<field name=\"STATUS_OK\"/>\n\t\t<field name=\"convertedData\"/>\n\t\t<field name=\"offset\"/>\n\t\t<field name=\"statusCode\"/>\n\t</class>\n\t<class name=\"android/drm/DrmErrorEvent\" since=\"11\">\n\t\t<extends name=\"android/drm/DrmEvent\"/>\n\t\t<method name=\"&lt;init>(IILjava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(IILjava/lang/String;Ljava/util/HashMap;)V\" since=\"12\"/>\n\t\t<field name=\"TYPE_ACQUIRE_DRM_INFO_FAILED\" since=\"12\"/>\n\t\t<field name=\"TYPE_NOT_SUPPORTED\"/>\n\t\t<field name=\"TYPE_NO_INTERNET_CONNECTION\"/>\n\t\t<field name=\"TYPE_OUT_OF_MEMORY\"/>\n\t\t<field name=\"TYPE_PROCESS_DRM_INFO_FAILED\"/>\n\t\t<field name=\"TYPE_REMOVE_ALL_RIGHTS_FAILED\"/>\n\t\t<field name=\"TYPE_RIGHTS_NOT_INSTALLED\"/>\n\t\t<field name=\"TYPE_RIGHTS_RENEWAL_NOT_ALLOWED\"/>\n\t</class>\n\t<class name=\"android/drm/DrmEvent\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(IILjava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(IILjava/lang/String;Ljava/util/HashMap;)V\" since=\"12\"/>\n\t\t<method name=\"getAttribute(Ljava/lang/String;)Ljava/lang/Object;\" since=\"12\"/>\n\t\t<method name=\"getMessage()Ljava/lang/String;\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<method name=\"getUniqueId()I\"/>\n\t\t<field name=\"DRM_INFO_OBJECT\" since=\"12\"/>\n\t\t<field name=\"DRM_INFO_STATUS_OBJECT\"/>\n\t\t<field name=\"TYPE_ALL_RIGHTS_REMOVED\"/>\n\t\t<field name=\"TYPE_DRM_INFO_PROCESSED\"/>\n\t</class>\n\t<class name=\"android/drm/DrmInfo\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(I[BLjava/lang/String;)V\"/>\n\t\t<method name=\"get(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getData()[B\"/>\n\t\t<method name=\"getInfoType()I\"/>\n\t\t<method name=\"getMimeType()Ljava/lang/String;\"/>\n\t\t<method name=\"iterator()Ljava/util/Iterator;\"/>\n\t\t<method name=\"keyIterator()Ljava/util/Iterator;\"/>\n\t\t<method name=\"put(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"android/drm/DrmInfoEvent\" since=\"11\">\n\t\t<extends name=\"android/drm/DrmEvent\"/>\n\t\t<method name=\"&lt;init>(IILjava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(IILjava/lang/String;Ljava/util/HashMap;)V\" since=\"12\"/>\n\t\t<field name=\"TYPE_ACCOUNT_ALREADY_REGISTERED\"/>\n\t\t<field name=\"TYPE_ALREADY_REGISTERED_BY_ANOTHER_ACCOUNT\"/>\n\t\t<field name=\"TYPE_REMOVE_RIGHTS\"/>\n\t\t<field name=\"TYPE_RIGHTS_INSTALLED\"/>\n\t\t<field name=\"TYPE_RIGHTS_REMOVED\" since=\"12\"/>\n\t\t<field name=\"TYPE_WAIT_FOR_RIGHTS\"/>\n\t</class>\n\t<class name=\"android/drm/DrmInfoRequest\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/String;)V\"/>\n\t\t<method name=\"get(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getInfoType()I\"/>\n\t\t<method name=\"getMimeType()Ljava/lang/String;\"/>\n\t\t<method name=\"iterator()Ljava/util/Iterator;\"/>\n\t\t<method name=\"keyIterator()Ljava/util/Iterator;\"/>\n\t\t<method name=\"put(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<field name=\"ACCOUNT_ID\"/>\n\t\t<field name=\"SUBSCRIPTION_ID\"/>\n\t\t<field name=\"TYPE_REGISTRATION_INFO\"/>\n\t\t<field name=\"TYPE_RIGHTS_ACQUISITION_INFO\"/>\n\t\t<field name=\"TYPE_RIGHTS_ACQUISITION_PROGRESS_INFO\"/>\n\t\t<field name=\"TYPE_UNREGISTRATION_INFO\"/>\n\t</class>\n\t<class name=\"android/drm/DrmInfoStatus\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(IILandroid/drm/ProcessedData;Ljava/lang/String;)V\"/>\n\t\t<field name=\"STATUS_ERROR\"/>\n\t\t<field name=\"STATUS_OK\"/>\n\t\t<field name=\"data\"/>\n\t\t<field name=\"infoType\"/>\n\t\t<field name=\"mimeType\"/>\n\t\t<field name=\"statusCode\"/>\n\t</class>\n\t<class name=\"android/drm/DrmManagerClient\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"acquireDrmInfo(Landroid/drm/DrmInfoRequest;)Landroid/drm/DrmInfo;\"/>\n\t\t<method name=\"acquireRights(Landroid/drm/DrmInfoRequest;)I\"/>\n\t\t<method name=\"canHandle(Landroid/net/Uri;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"canHandle(Ljava/lang/String;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"checkRightsStatus(Landroid/net/Uri;)I\"/>\n\t\t<method name=\"checkRightsStatus(Landroid/net/Uri;I)I\"/>\n\t\t<method name=\"checkRightsStatus(Ljava/lang/String;)I\"/>\n\t\t<method name=\"checkRightsStatus(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"closeConvertSession(I)Landroid/drm/DrmConvertedStatus;\"/>\n\t\t<method name=\"convertData(I[B)Landroid/drm/DrmConvertedStatus;\"/>\n\t\t<method name=\"getAvailableDrmEngines()[Ljava/lang/String;\"/>\n\t\t<method name=\"getConstraints(Landroid/net/Uri;I)Landroid/content/ContentValues;\"/>\n\t\t<method name=\"getConstraints(Ljava/lang/String;I)Landroid/content/ContentValues;\"/>\n\t\t<method name=\"getDrmObjectType(Landroid/net/Uri;Ljava/lang/String;)I\"/>\n\t\t<method name=\"getDrmObjectType(Ljava/lang/String;Ljava/lang/String;)I\"/>\n\t\t<method name=\"getMetadata(Landroid/net/Uri;)Landroid/content/ContentValues;\"/>\n\t\t<method name=\"getMetadata(Ljava/lang/String;)Landroid/content/ContentValues;\"/>\n\t\t<method name=\"getOriginalMimeType(Landroid/net/Uri;)Ljava/lang/String;\"/>\n\t\t<method name=\"getOriginalMimeType(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"openConvertSession(Ljava/lang/String;)I\"/>\n\t\t<method name=\"processDrmInfo(Landroid/drm/DrmInfo;)I\"/>\n\t\t<method name=\"release()V\" since=\"16\" deprecated=\"24\"/>\n\t\t<method name=\"removeAllRights()I\"/>\n\t\t<method name=\"removeRights(Landroid/net/Uri;)I\"/>\n\t\t<method name=\"removeRights(Ljava/lang/String;)I\"/>\n\t\t<method name=\"saveRights(Landroid/drm/DrmRights;Ljava/lang/String;Ljava/lang/String;)I\"/>\n\t\t<method name=\"setOnErrorListener(Landroid/drm/DrmManagerClient$OnErrorListener;)V\"/>\n\t\t<method name=\"setOnEventListener(Landroid/drm/DrmManagerClient$OnEventListener;)V\"/>\n\t\t<method name=\"setOnInfoListener(Landroid/drm/DrmManagerClient$OnInfoListener;)V\"/>\n\t\t<field name=\"ERROR_NONE\"/>\n\t\t<field name=\"ERROR_UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/drm/DrmManagerClient$OnErrorListener\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onError(Landroid/drm/DrmManagerClient;Landroid/drm/DrmErrorEvent;)V\"/>\n\t</class>\n\t<class name=\"android/drm/DrmManagerClient$OnEventListener\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onEvent(Landroid/drm/DrmManagerClient;Landroid/drm/DrmEvent;)V\" since=\"12\"/>\n\t\t<method name=\"onEvent(Landroid/drm/DrmManagerClient;Landroid/drm/DrmEvent;Ljava/util/HashMap;)V\" removed=\"12\"/>\n\t</class>\n\t<class name=\"android/drm/DrmManagerClient$OnInfoListener\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onInfo(Landroid/drm/DrmManagerClient;Landroid/drm/DrmInfoEvent;)V\"/>\n\t</class>\n\t<class name=\"android/drm/DrmRights\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/drm/ProcessedData;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getAccountId()Ljava/lang/String;\"/>\n\t\t<method name=\"getData()[B\"/>\n\t\t<method name=\"getMimeType()Ljava/lang/String;\"/>\n\t\t<method name=\"getSubscriptionId()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/drm/DrmStore\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/drm/DrmStore$Action\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"16\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t\t<field name=\"DISPLAY\"/>\n\t\t<field name=\"EXECUTE\"/>\n\t\t<field name=\"OUTPUT\"/>\n\t\t<field name=\"PLAY\"/>\n\t\t<field name=\"PREVIEW\"/>\n\t\t<field name=\"RINGTONE\"/>\n\t\t<field name=\"TRANSFER\"/>\n\t</class>\n\t<class name=\"android/drm/DrmStore$ConstraintsColumns\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"EXTENDED_METADATA\"/>\n\t\t<field name=\"LICENSE_AVAILABLE_TIME\"/>\n\t\t<field name=\"LICENSE_EXPIRY_TIME\"/>\n\t\t<field name=\"LICENSE_START_TIME\"/>\n\t\t<field name=\"MAX_REPEAT_COUNT\"/>\n\t\t<field name=\"REMAINING_REPEAT_COUNT\"/>\n\t</class>\n\t<class name=\"android/drm/DrmStore$DrmObjectType\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"16\"/>\n\t\t<field name=\"CONTENT\"/>\n\t\t<field name=\"RIGHTS_OBJECT\"/>\n\t\t<field name=\"TRIGGER_OBJECT\"/>\n\t\t<field name=\"UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/drm/DrmStore$Playback\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"16\"/>\n\t\t<field name=\"PAUSE\"/>\n\t\t<field name=\"RESUME\"/>\n\t\t<field name=\"START\"/>\n\t\t<field name=\"STOP\"/>\n\t</class>\n\t<class name=\"android/drm/DrmStore$RightsStatus\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"16\"/>\n\t\t<field name=\"RIGHTS_EXPIRED\"/>\n\t\t<field name=\"RIGHTS_INVALID\"/>\n\t\t<field name=\"RIGHTS_NOT_ACQUIRED\"/>\n\t\t<field name=\"RIGHTS_VALID\"/>\n\t</class>\n\t<class name=\"android/drm/DrmSupportInfo\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addFileSuffix(Ljava/lang/String;)V\"/>\n\t\t<method name=\"addMimeType(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getDescriprition()Ljava/lang/String;\" deprecated=\"16\"/>\n\t\t<method name=\"getDescription()Ljava/lang/String;\" since=\"16\"/>\n\t\t<method name=\"getFileSuffixIterator()Ljava/util/Iterator;\"/>\n\t\t<method name=\"getMimeTypeIterator()Ljava/util/Iterator;\"/>\n\t\t<method name=\"setDescription(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/drm/DrmUtils\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getExtendedMetadataParser([B)Landroid/drm/DrmUtils$ExtendedMetadataParser;\"/>\n\t</class>\n\t<class name=\"android/drm/DrmUtils$ExtendedMetadataParser\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"get(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"iterator()Ljava/util/Iterator;\"/>\n\t\t<method name=\"keyIterator()Ljava/util/Iterator;\"/>\n\t</class>\n\t<class name=\"android/drm/ProcessedData\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAccountId()Ljava/lang/String;\"/>\n\t\t<method name=\"getData()[B\"/>\n\t\t<method name=\"getSubscriptionId()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/gesture/Gesture\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addStroke(Landroid/gesture/GestureStroke;)V\"/>\n\t\t<method name=\"getBoundingBox()Landroid/graphics/RectF;\"/>\n\t\t<method name=\"getID()J\"/>\n\t\t<method name=\"getLength()F\"/>\n\t\t<method name=\"getStrokes()Ljava/util/ArrayList;\"/>\n\t\t<method name=\"getStrokesCount()I\"/>\n\t\t<method name=\"toBitmap(IIII)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"toBitmap(IIIII)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"toPath()Landroid/graphics/Path;\"/>\n\t\t<method name=\"toPath(IIII)Landroid/graphics/Path;\"/>\n\t\t<method name=\"toPath(Landroid/graphics/Path;)Landroid/graphics/Path;\"/>\n\t\t<method name=\"toPath(Landroid/graphics/Path;IIII)Landroid/graphics/Path;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/gesture/GestureLibraries\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"fromFile(Ljava/io/File;)Landroid/gesture/GestureLibrary;\"/>\n\t\t<method name=\"fromFile(Ljava/lang/String;)Landroid/gesture/GestureLibrary;\"/>\n\t\t<method name=\"fromPrivateFile(Landroid/content/Context;Ljava/lang/String;)Landroid/gesture/GestureLibrary;\"/>\n\t\t<method name=\"fromRawResource(Landroid/content/Context;I)Landroid/gesture/GestureLibrary;\"/>\n\t</class>\n\t<class name=\"android/gesture/GestureLibrary\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addGesture(Ljava/lang/String;Landroid/gesture/Gesture;)V\"/>\n\t\t<method name=\"getGestureEntries()Ljava/util/Set;\"/>\n\t\t<method name=\"getGestures(Ljava/lang/String;)Ljava/util/ArrayList;\"/>\n\t\t<method name=\"getOrientationStyle()I\"/>\n\t\t<method name=\"getSequenceType()I\"/>\n\t\t<method name=\"isReadOnly()Z\"/>\n\t\t<method name=\"load()Z\"/>\n\t\t<method name=\"recognize(Landroid/gesture/Gesture;)Ljava/util/ArrayList;\"/>\n\t\t<method name=\"removeEntry(Ljava/lang/String;)V\"/>\n\t\t<method name=\"removeGesture(Ljava/lang/String;Landroid/gesture/Gesture;)V\"/>\n\t\t<method name=\"save()Z\"/>\n\t\t<method name=\"setOrientationStyle(I)V\"/>\n\t\t<method name=\"setSequenceType(I)V\"/>\n\t\t<field name=\"mStore\"/>\n\t</class>\n\t<class name=\"android/gesture/GestureOverlayView\" since=\"4\">\n\t\t<extends name=\"android/widget/FrameLayout\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"addOnGestureListener(Landroid/gesture/GestureOverlayView$OnGestureListener;)V\"/>\n\t\t<method name=\"addOnGesturePerformedListener(Landroid/gesture/GestureOverlayView$OnGesturePerformedListener;)V\"/>\n\t\t<method name=\"addOnGesturingListener(Landroid/gesture/GestureOverlayView$OnGesturingListener;)V\"/>\n\t\t<method name=\"cancelClearAnimation()V\"/>\n\t\t<method name=\"cancelGesture()V\"/>\n\t\t<method name=\"clear(Z)V\"/>\n\t\t<method name=\"getCurrentStroke()Ljava/util/ArrayList;\"/>\n\t\t<method name=\"getFadeOffset()J\"/>\n\t\t<method name=\"getGesture()Landroid/gesture/Gesture;\"/>\n\t\t<method name=\"getGestureColor()I\"/>\n\t\t<method name=\"getGesturePath()Landroid/graphics/Path;\"/>\n\t\t<method name=\"getGesturePath(Landroid/graphics/Path;)Landroid/graphics/Path;\"/>\n\t\t<method name=\"getGestureStrokeAngleThreshold()F\"/>\n\t\t<method name=\"getGestureStrokeLengthThreshold()F\"/>\n\t\t<method name=\"getGestureStrokeSquarenessTreshold()F\"/>\n\t\t<method name=\"getGestureStrokeType()I\"/>\n\t\t<method name=\"getGestureStrokeWidth()F\"/>\n\t\t<method name=\"getOrientation()I\"/>\n\t\t<method name=\"getUncertainGestureColor()I\"/>\n\t\t<method name=\"isEventsInterceptionEnabled()Z\"/>\n\t\t<method name=\"isFadeEnabled()Z\"/>\n\t\t<method name=\"isGestureVisible()Z\"/>\n\t\t<method name=\"isGesturing()Z\"/>\n\t\t<method name=\"removeAllOnGestureListeners()V\"/>\n\t\t<method name=\"removeAllOnGesturePerformedListeners()V\"/>\n\t\t<method name=\"removeAllOnGesturingListeners()V\"/>\n\t\t<method name=\"removeOnGestureListener(Landroid/gesture/GestureOverlayView$OnGestureListener;)V\"/>\n\t\t<method name=\"removeOnGesturePerformedListener(Landroid/gesture/GestureOverlayView$OnGesturePerformedListener;)V\"/>\n\t\t<method name=\"removeOnGesturingListener(Landroid/gesture/GestureOverlayView$OnGesturingListener;)V\"/>\n\t\t<method name=\"setEventsInterceptionEnabled(Z)V\"/>\n\t\t<method name=\"setFadeEnabled(Z)V\"/>\n\t\t<method name=\"setFadeOffset(J)V\"/>\n\t\t<method name=\"setGesture(Landroid/gesture/Gesture;)V\"/>\n\t\t<method name=\"setGestureColor(I)V\"/>\n\t\t<method name=\"setGestureStrokeAngleThreshold(F)V\"/>\n\t\t<method name=\"setGestureStrokeLengthThreshold(F)V\"/>\n\t\t<method name=\"setGestureStrokeSquarenessTreshold(F)V\"/>\n\t\t<method name=\"setGestureStrokeType(I)V\"/>\n\t\t<method name=\"setGestureStrokeWidth(F)V\"/>\n\t\t<method name=\"setGestureVisible(Z)V\"/>\n\t\t<method name=\"setOrientation(I)V\"/>\n\t\t<method name=\"setUncertainGestureColor(I)V\"/>\n\t\t<field name=\"GESTURE_STROKE_TYPE_MULTIPLE\"/>\n\t\t<field name=\"GESTURE_STROKE_TYPE_SINGLE\"/>\n\t\t<field name=\"ORIENTATION_HORIZONTAL\"/>\n\t\t<field name=\"ORIENTATION_VERTICAL\"/>\n\t</class>\n\t<class name=\"android/gesture/GestureOverlayView$OnGestureListener\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onGesture(Landroid/gesture/GestureOverlayView;Landroid/view/MotionEvent;)V\"/>\n\t\t<method name=\"onGestureCancelled(Landroid/gesture/GestureOverlayView;Landroid/view/MotionEvent;)V\"/>\n\t\t<method name=\"onGestureEnded(Landroid/gesture/GestureOverlayView;Landroid/view/MotionEvent;)V\"/>\n\t\t<method name=\"onGestureStarted(Landroid/gesture/GestureOverlayView;Landroid/view/MotionEvent;)V\"/>\n\t</class>\n\t<class name=\"android/gesture/GestureOverlayView$OnGesturePerformedListener\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onGesturePerformed(Landroid/gesture/GestureOverlayView;Landroid/gesture/Gesture;)V\"/>\n\t</class>\n\t<class name=\"android/gesture/GestureOverlayView$OnGesturingListener\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onGesturingEnded(Landroid/gesture/GestureOverlayView;)V\"/>\n\t\t<method name=\"onGesturingStarted(Landroid/gesture/GestureOverlayView;)V\"/>\n\t</class>\n\t<class name=\"android/gesture/GesturePoint\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(FFJ)V\"/>\n\t\t<field name=\"timestamp\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t</class>\n\t<class name=\"android/gesture/GestureStore\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addGesture(Ljava/lang/String;Landroid/gesture/Gesture;)V\"/>\n\t\t<method name=\"getGestureEntries()Ljava/util/Set;\"/>\n\t\t<method name=\"getGestures(Ljava/lang/String;)Ljava/util/ArrayList;\"/>\n\t\t<method name=\"getOrientationStyle()I\"/>\n\t\t<method name=\"getSequenceType()I\"/>\n\t\t<method name=\"hasChanged()Z\"/>\n\t\t<method name=\"load(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"load(Ljava/io/InputStream;Z)V\"/>\n\t\t<method name=\"recognize(Landroid/gesture/Gesture;)Ljava/util/ArrayList;\"/>\n\t\t<method name=\"removeEntry(Ljava/lang/String;)V\"/>\n\t\t<method name=\"removeGesture(Ljava/lang/String;Landroid/gesture/Gesture;)V\"/>\n\t\t<method name=\"save(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"save(Ljava/io/OutputStream;Z)V\"/>\n\t\t<method name=\"setOrientationStyle(I)V\"/>\n\t\t<method name=\"setSequenceType(I)V\"/>\n\t\t<field name=\"ORIENTATION_INVARIANT\"/>\n\t\t<field name=\"ORIENTATION_SENSITIVE\"/>\n\t\t<field name=\"SEQUENCE_INVARIANT\"/>\n\t\t<field name=\"SEQUENCE_SENSITIVE\"/>\n\t</class>\n\t<class name=\"android/gesture/GestureStroke\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/ArrayList;)V\"/>\n\t\t<method name=\"clearPath()V\"/>\n\t\t<method name=\"computeOrientedBoundingBox()Landroid/gesture/OrientedBoundingBox;\"/>\n\t\t<method name=\"getPath()Landroid/graphics/Path;\"/>\n\t\t<method name=\"toPath(FFI)Landroid/graphics/Path;\"/>\n\t\t<field name=\"boundingBox\"/>\n\t\t<field name=\"length\"/>\n\t\t<field name=\"points\"/>\n\t</class>\n\t<class name=\"android/gesture/GestureUtils\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"computeOrientedBoundingBox(Ljava/util/ArrayList;)Landroid/gesture/OrientedBoundingBox;\"/>\n\t\t<method name=\"computeOrientedBoundingBox([F)Landroid/gesture/OrientedBoundingBox;\"/>\n\t\t<method name=\"spatialSampling(Landroid/gesture/Gesture;I)[F\"/>\n\t\t<method name=\"spatialSampling(Landroid/gesture/Gesture;IZ)[F\"/>\n\t\t<method name=\"temporalSampling(Landroid/gesture/GestureStroke;I)[F\"/>\n\t</class>\n\t<class name=\"android/gesture/OrientedBoundingBox\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"centerX\"/>\n\t\t<field name=\"centerY\"/>\n\t\t<field name=\"height\"/>\n\t\t<field name=\"orientation\"/>\n\t\t<field name=\"squareness\"/>\n\t\t<field name=\"width\"/>\n\t</class>\n\t<class name=\"android/gesture/Prediction\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"name\"/>\n\t\t<field name=\"score\"/>\n\t</class>\n\t<class name=\"android/graphics/AvoidXfermode\" since=\"1\" deprecated=\"16\" removed=\"24\">\n\t\t<extends name=\"android/graphics/Xfermode\"/>\n\t\t<method name=\"&lt;init>(IILandroid/graphics/AvoidXfermode$Mode;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/AvoidXfermode$Mode\" since=\"1\" removed=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/AvoidXfermode$Mode;\"/>\n\t\t<method name=\"values()[Landroid/graphics/AvoidXfermode$Mode;\"/>\n\t\t<field name=\"AVOID\"/>\n\t\t<field name=\"TARGET\"/>\n\t</class>\n\t<class name=\"android/graphics/Bitmap\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"compress(Landroid/graphics/Bitmap$CompressFormat;ILjava/io/OutputStream;)Z\"/>\n\t\t<method name=\"copy(Landroid/graphics/Bitmap$Config;Z)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"copyPixelsFromBuffer(Ljava/nio/Buffer;)V\" since=\"3\"/>\n\t\t<method name=\"copyPixelsToBuffer(Ljava/nio/Buffer;)V\"/>\n\t\t<method name=\"createBitmap(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"createBitmap(IILandroid/graphics/Bitmap$Config;Z)Landroid/graphics/Bitmap;\" since=\"26\"/>\n\t\t<method name=\"createBitmap(IILandroid/graphics/Bitmap$Config;ZLandroid/graphics/ColorSpace;)Landroid/graphics/Bitmap;\" since=\"26\"/>\n\t\t<method name=\"createBitmap(Landroid/graphics/Bitmap;)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"createBitmap(Landroid/graphics/Bitmap;IIII)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"createBitmap(Landroid/graphics/Bitmap;IIIILandroid/graphics/Matrix;Z)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"createBitmap(Landroid/graphics/Picture;)Landroid/graphics/Bitmap;\" since=\"28\"/>\n\t\t<method name=\"createBitmap(Landroid/graphics/Picture;IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;\" since=\"28\"/>\n\t\t<method name=\"createBitmap(Landroid/util/DisplayMetrics;IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;\" since=\"17\"/>\n\t\t<method name=\"createBitmap(Landroid/util/DisplayMetrics;IILandroid/graphics/Bitmap$Config;Z)Landroid/graphics/Bitmap;\" since=\"26\"/>\n\t\t<method name=\"createBitmap(Landroid/util/DisplayMetrics;IILandroid/graphics/Bitmap$Config;ZLandroid/graphics/ColorSpace;)Landroid/graphics/Bitmap;\" since=\"26\"/>\n\t\t<method name=\"createBitmap(Landroid/util/DisplayMetrics;[IIIIILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;\" since=\"17\"/>\n\t\t<method name=\"createBitmap(Landroid/util/DisplayMetrics;[IIILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;\" since=\"17\"/>\n\t\t<method name=\"createBitmap([IIIIILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"createBitmap([IIILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"createScaledBitmap(Landroid/graphics/Bitmap;IIZ)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"eraseColor(I)V\"/>\n\t\t<method name=\"eraseColor(J)V\" since=\"29\"/>\n\t\t<method name=\"extractAlpha()Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"extractAlpha(Landroid/graphics/Paint;[I)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"getAllocationByteCount()I\" since=\"19\"/>\n\t\t<method name=\"getByteCount()I\" since=\"12\"/>\n\t\t<method name=\"getColor(II)Landroid/graphics/Color;\" since=\"29\"/>\n\t\t<method name=\"getColorSpace()Landroid/graphics/ColorSpace;\" since=\"26\"/>\n\t\t<method name=\"getConfig()Landroid/graphics/Bitmap$Config;\"/>\n\t\t<method name=\"getDensity()I\" since=\"4\"/>\n\t\t<method name=\"getGenerationId()I\" since=\"12\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getNinePatchChunk()[B\"/>\n\t\t<method name=\"getPixel(II)I\"/>\n\t\t<method name=\"getPixels([IIIIIII)V\"/>\n\t\t<method name=\"getRowBytes()I\"/>\n\t\t<method name=\"getScaledHeight(I)I\" since=\"4\"/>\n\t\t<method name=\"getScaledHeight(Landroid/graphics/Canvas;)I\" since=\"4\"/>\n\t\t<method name=\"getScaledHeight(Landroid/util/DisplayMetrics;)I\" since=\"4\"/>\n\t\t<method name=\"getScaledWidth(I)I\" since=\"4\"/>\n\t\t<method name=\"getScaledWidth(Landroid/graphics/Canvas;)I\" since=\"4\"/>\n\t\t<method name=\"getScaledWidth(Landroid/util/DisplayMetrics;)I\" since=\"4\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t\t<method name=\"hasAlpha()Z\"/>\n\t\t<method name=\"hasMipMap()Z\" since=\"17\"/>\n\t\t<method name=\"isMutable()Z\"/>\n\t\t<method name=\"isPremultiplied()Z\" since=\"17\"/>\n\t\t<method name=\"isRecycled()Z\"/>\n\t\t<method name=\"prepareToDraw()V\" since=\"4\"/>\n\t\t<method name=\"reconfigure(IILandroid/graphics/Bitmap$Config;)V\" since=\"19\"/>\n\t\t<method name=\"recycle()V\"/>\n\t\t<method name=\"sameAs(Landroid/graphics/Bitmap;)Z\" since=\"12\"/>\n\t\t<method name=\"setColorSpace(Landroid/graphics/ColorSpace;)V\" since=\"29\"/>\n\t\t<method name=\"setConfig(Landroid/graphics/Bitmap$Config;)V\" since=\"19\"/>\n\t\t<method name=\"setDensity(I)V\" since=\"4\"/>\n\t\t<method name=\"setHasAlpha(Z)V\" since=\"12\"/>\n\t\t<method name=\"setHasMipMap(Z)V\" since=\"17\"/>\n\t\t<method name=\"setHeight(I)V\" since=\"19\"/>\n\t\t<method name=\"setPixel(III)V\"/>\n\t\t<method name=\"setPixels([IIIIIII)V\"/>\n\t\t<method name=\"setPremultiplied(Z)V\" since=\"19\"/>\n\t\t<method name=\"setWidth(I)V\" since=\"19\"/>\n\t\t<method name=\"wrapHardwareBuffer(Landroid/hardware/HardwareBuffer;Landroid/graphics/ColorSpace;)Landroid/graphics/Bitmap;\" since=\"29\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"DENSITY_NONE\" since=\"4\"/>\n\t</class>\n\t<class name=\"android/graphics/Bitmap$CompressFormat\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/Bitmap$CompressFormat;\"/>\n\t\t<method name=\"values()[Landroid/graphics/Bitmap$CompressFormat;\"/>\n\t\t<field name=\"JPEG\"/>\n\t\t<field name=\"PNG\"/>\n\t\t<field name=\"WEBP\" since=\"14\"/>\n\t</class>\n\t<class name=\"android/graphics/Bitmap$Config\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/Bitmap$Config;\"/>\n\t\t<method name=\"values()[Landroid/graphics/Bitmap$Config;\"/>\n\t\t<field name=\"ALPHA_8\"/>\n\t\t<field name=\"ARGB_4444\" deprecated=\"29\"/>\n\t\t<field name=\"ARGB_8888\"/>\n\t\t<field name=\"HARDWARE\" since=\"26\"/>\n\t\t<field name=\"RGBA_F16\" since=\"26\"/>\n\t\t<field name=\"RGB_565\"/>\n\t</class>\n\t<class name=\"android/graphics/BitmapFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"decodeByteArray([BII)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"decodeByteArray([BIILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"decodeFile(Ljava/lang/String;)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"decodeFile(Ljava/lang/String;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"decodeFileDescriptor(Ljava/io/FileDescriptor;)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"decodeFileDescriptor(Ljava/io/FileDescriptor;Landroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"decodeResource(Landroid/content/res/Resources;I)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"decodeResource(Landroid/content/res/Resources;ILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"decodeResourceStream(Landroid/content/res/Resources;Landroid/util/TypedValue;Ljava/io/InputStream;Landroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;\" since=\"4\"/>\n\t\t<method name=\"decodeStream(Ljava/io/InputStream;)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"decodeStream(Ljava/io/InputStream;Landroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;\"/>\n\t</class>\n\t<class name=\"android/graphics/BitmapFactory$Options\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"requestCancelDecode()V\" deprecated=\"24\"/>\n\t\t<field name=\"inBitmap\" since=\"11\"/>\n\t\t<field name=\"inDensity\" since=\"4\"/>\n\t\t<field name=\"inDither\" deprecated=\"24\"/>\n\t\t<field name=\"inInputShareable\" since=\"4\" deprecated=\"21\"/>\n\t\t<field name=\"inJustDecodeBounds\"/>\n\t\t<field name=\"inMutable\" since=\"11\"/>\n\t\t<field name=\"inPreferQualityOverSpeed\" since=\"10\" deprecated=\"24\"/>\n\t\t<field name=\"inPreferredColorSpace\" since=\"26\"/>\n\t\t<field name=\"inPreferredConfig\"/>\n\t\t<field name=\"inPremultiplied\" since=\"19\"/>\n\t\t<field name=\"inPurgeable\" since=\"4\" deprecated=\"21\"/>\n\t\t<field name=\"inSampleSize\"/>\n\t\t<field name=\"inScaled\" since=\"4\"/>\n\t\t<field name=\"inScreenDensity\" since=\"4\"/>\n\t\t<field name=\"inTargetDensity\" since=\"4\"/>\n\t\t<field name=\"inTempStorage\"/>\n\t\t<field name=\"mCancel\" deprecated=\"24\"/>\n\t\t<field name=\"outColorSpace\" since=\"26\"/>\n\t\t<field name=\"outConfig\" since=\"26\"/>\n\t\t<field name=\"outHeight\"/>\n\t\t<field name=\"outMimeType\"/>\n\t\t<field name=\"outWidth\"/>\n\t</class>\n\t<class name=\"android/graphics/BitmapRegionDecoder\" since=\"10\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"decodeRegion(Landroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t\t<method name=\"isRecycled()Z\"/>\n\t\t<method name=\"newInstance(Ljava/io/FileDescriptor;Z)Landroid/graphics/BitmapRegionDecoder;\"/>\n\t\t<method name=\"newInstance(Ljava/io/InputStream;Z)Landroid/graphics/BitmapRegionDecoder;\"/>\n\t\t<method name=\"newInstance(Ljava/lang/String;Z)Landroid/graphics/BitmapRegionDecoder;\"/>\n\t\t<method name=\"newInstance([BIIZ)Landroid/graphics/BitmapRegionDecoder;\"/>\n\t\t<method name=\"recycle()V\"/>\n\t</class>\n\t<class name=\"android/graphics/BitmapShader\" since=\"1\">\n\t\t<extends name=\"android/graphics/Shader\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Bitmap;Landroid/graphics/Shader$TileMode;Landroid/graphics/Shader$TileMode;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/BlendMode\" since=\"29\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/BlendMode;\"/>\n\t\t<method name=\"values()[Landroid/graphics/BlendMode;\"/>\n\t\t<field name=\"CLEAR\"/>\n\t\t<field name=\"COLOR\"/>\n\t\t<field name=\"COLOR_BURN\"/>\n\t\t<field name=\"COLOR_DODGE\"/>\n\t\t<field name=\"DARKEN\"/>\n\t\t<field name=\"DIFFERENCE\"/>\n\t\t<field name=\"DST\"/>\n\t\t<field name=\"DST_ATOP\"/>\n\t\t<field name=\"DST_IN\"/>\n\t\t<field name=\"DST_OUT\"/>\n\t\t<field name=\"DST_OVER\"/>\n\t\t<field name=\"EXCLUSION\"/>\n\t\t<field name=\"HARD_LIGHT\"/>\n\t\t<field name=\"HUE\"/>\n\t\t<field name=\"LIGHTEN\"/>\n\t\t<field name=\"LUMINOSITY\"/>\n\t\t<field name=\"MODULATE\"/>\n\t\t<field name=\"MULTIPLY\"/>\n\t\t<field name=\"OVERLAY\"/>\n\t\t<field name=\"PLUS\"/>\n\t\t<field name=\"SATURATION\"/>\n\t\t<field name=\"SCREEN\"/>\n\t\t<field name=\"SOFT_LIGHT\"/>\n\t\t<field name=\"SRC\"/>\n\t\t<field name=\"SRC_ATOP\"/>\n\t\t<field name=\"SRC_IN\"/>\n\t\t<field name=\"SRC_OUT\"/>\n\t\t<field name=\"SRC_OVER\"/>\n\t\t<field name=\"XOR\"/>\n\t</class>\n\t<class name=\"android/graphics/BlendModeColorFilter\" since=\"29\">\n\t\t<extends name=\"android/graphics/ColorFilter\"/>\n\t\t<method name=\"&lt;init>(ILandroid/graphics/BlendMode;)V\"/>\n\t\t<method name=\"getColor()I\"/>\n\t\t<method name=\"getMode()Landroid/graphics/BlendMode;\"/>\n\t</class>\n\t<class name=\"android/graphics/BlurMaskFilter\" since=\"1\">\n\t\t<extends name=\"android/graphics/MaskFilter\"/>\n\t\t<method name=\"&lt;init>(FLandroid/graphics/BlurMaskFilter$Blur;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/BlurMaskFilter$Blur\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/BlurMaskFilter$Blur;\"/>\n\t\t<method name=\"values()[Landroid/graphics/BlurMaskFilter$Blur;\"/>\n\t\t<field name=\"INNER\"/>\n\t\t<field name=\"NORMAL\"/>\n\t\t<field name=\"OUTER\"/>\n\t\t<field name=\"SOLID\"/>\n\t</class>\n\t<class name=\"android/graphics/Camera\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"applyToCanvas(Landroid/graphics/Canvas;)V\"/>\n\t\t<method name=\"dotWithNormal(FFF)F\"/>\n\t\t<method name=\"getLocationX()F\" since=\"16\"/>\n\t\t<method name=\"getLocationY()F\" since=\"16\"/>\n\t\t<method name=\"getLocationZ()F\" since=\"16\"/>\n\t\t<method name=\"getMatrix(Landroid/graphics/Matrix;)V\"/>\n\t\t<method name=\"restore()V\"/>\n\t\t<method name=\"rotate(FFF)V\" since=\"12\"/>\n\t\t<method name=\"rotateX(F)V\"/>\n\t\t<method name=\"rotateY(F)V\"/>\n\t\t<method name=\"rotateZ(F)V\"/>\n\t\t<method name=\"save()V\"/>\n\t\t<method name=\"setLocation(FFF)V\" since=\"12\"/>\n\t\t<method name=\"translate(FFF)V\"/>\n\t</class>\n\t<class name=\"android/graphics/Canvas\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Bitmap;)V\"/>\n\t\t<method name=\"&lt;init>(Ljavax/microedition/khronos/opengles/GL;)V\" removed=\"11\"/>\n\t\t<method name=\"clipOutPath(Landroid/graphics/Path;)Z\" since=\"26\"/>\n\t\t<method name=\"clipOutRect(FFFF)Z\" since=\"26\"/>\n\t\t<method name=\"clipOutRect(IIII)Z\" since=\"26\"/>\n\t\t<method name=\"clipOutRect(Landroid/graphics/Rect;)Z\" since=\"26\"/>\n\t\t<method name=\"clipOutRect(Landroid/graphics/RectF;)Z\" since=\"26\"/>\n\t\t<method name=\"clipPath(Landroid/graphics/Path;)Z\"/>\n\t\t<method name=\"clipPath(Landroid/graphics/Path;Landroid/graphics/Region$Op;)Z\" deprecated=\"26\"/>\n\t\t<method name=\"clipRect(FFFF)Z\"/>\n\t\t<method name=\"clipRect(FFFFLandroid/graphics/Region$Op;)Z\" deprecated=\"26\"/>\n\t\t<method name=\"clipRect(IIII)Z\"/>\n\t\t<method name=\"clipRect(Landroid/graphics/Rect;)Z\"/>\n\t\t<method name=\"clipRect(Landroid/graphics/Rect;Landroid/graphics/Region$Op;)Z\" deprecated=\"26\"/>\n\t\t<method name=\"clipRect(Landroid/graphics/RectF;)Z\"/>\n\t\t<method name=\"clipRect(Landroid/graphics/RectF;Landroid/graphics/Region$Op;)Z\" deprecated=\"26\"/>\n\t\t<method name=\"clipRegion(Landroid/graphics/Region;)Z\" deprecated=\"21\" removed=\"26\"/>\n\t\t<method name=\"clipRegion(Landroid/graphics/Region;Landroid/graphics/Region$Op;)Z\" deprecated=\"21\" removed=\"26\"/>\n\t\t<method name=\"concat(Landroid/graphics/Matrix;)V\"/>\n\t\t<method name=\"disableZ()V\" since=\"29\"/>\n\t\t<method name=\"drawARGB(IIII)V\"/>\n\t\t<method name=\"drawArc(FFFFFFZLandroid/graphics/Paint;)V\" since=\"21\"/>\n\t\t<method name=\"drawArc(Landroid/graphics/RectF;FFZLandroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawBitmap(Landroid/graphics/Bitmap;FFLandroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Matrix;Landroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;Landroid/graphics/RectF;Landroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawBitmap([IIIFFIIZLandroid/graphics/Paint;)V\" since=\"3\" deprecated=\"21\"/>\n\t\t<method name=\"drawBitmap([IIIIIIIZLandroid/graphics/Paint;)V\" deprecated=\"21\"/>\n\t\t<method name=\"drawBitmapMesh(Landroid/graphics/Bitmap;II[FI[IILandroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawCircle(FFFLandroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawColor(I)V\"/>\n\t\t<method name=\"drawColor(ILandroid/graphics/BlendMode;)V\" since=\"29\"/>\n\t\t<method name=\"drawColor(ILandroid/graphics/PorterDuff$Mode;)V\"/>\n\t\t<method name=\"drawColor(J)V\" since=\"29\"/>\n\t\t<method name=\"drawColor(JLandroid/graphics/BlendMode;)V\" since=\"29\"/>\n\t\t<method name=\"drawDoubleRoundRect(Landroid/graphics/RectF;FFLandroid/graphics/RectF;FFLandroid/graphics/Paint;)V\" since=\"29\"/>\n\t\t<method name=\"drawDoubleRoundRect(Landroid/graphics/RectF;[FLandroid/graphics/RectF;[FLandroid/graphics/Paint;)V\" since=\"29\"/>\n\t\t<method name=\"drawLine(FFFFLandroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawLines([FIILandroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawLines([FLandroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawOval(FFFFLandroid/graphics/Paint;)V\" since=\"21\"/>\n\t\t<method name=\"drawOval(Landroid/graphics/RectF;Landroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawPaint(Landroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawPath(Landroid/graphics/Path;Landroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawPicture(Landroid/graphics/Picture;)V\"/>\n\t\t<method name=\"drawPicture(Landroid/graphics/Picture;Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"drawPicture(Landroid/graphics/Picture;Landroid/graphics/RectF;)V\"/>\n\t\t<method name=\"drawPoint(FFLandroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawPoints([FIILandroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawPoints([FLandroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawPosText(Ljava/lang/String;[FLandroid/graphics/Paint;)V\" deprecated=\"16\"/>\n\t\t<method name=\"drawPosText([CII[FLandroid/graphics/Paint;)V\" deprecated=\"16\"/>\n\t\t<method name=\"drawRGB(III)V\"/>\n\t\t<method name=\"drawRect(FFFFLandroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawRect(Landroid/graphics/Rect;Landroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawRect(Landroid/graphics/RectF;Landroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawRenderNode(Landroid/graphics/RenderNode;)V\" since=\"29\"/>\n\t\t<method name=\"drawRoundRect(FFFFFFLandroid/graphics/Paint;)V\" since=\"21\"/>\n\t\t<method name=\"drawRoundRect(Landroid/graphics/RectF;FFLandroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawText(Ljava/lang/CharSequence;IIFFLandroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawText(Ljava/lang/String;FFLandroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawText(Ljava/lang/String;IIFFLandroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawText([CIIFFLandroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawTextOnPath(Ljava/lang/String;Landroid/graphics/Path;FFLandroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawTextOnPath([CIILandroid/graphics/Path;FFLandroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawTextRun(Landroid/graphics/text/MeasuredText;IIIIFFZLandroid/graphics/Paint;)V\" since=\"29\"/>\n\t\t<method name=\"drawTextRun(Ljava/lang/CharSequence;IIIIFFZLandroid/graphics/Paint;)V\" since=\"23\"/>\n\t\t<method name=\"drawTextRun([CIIIIFFZLandroid/graphics/Paint;)V\" since=\"23\"/>\n\t\t<method name=\"drawVertices(Landroid/graphics/Canvas$VertexMode;I[FI[FI[II[SIILandroid/graphics/Paint;)V\"/>\n\t\t<method name=\"enableZ()V\" since=\"29\"/>\n\t\t<method name=\"freeGlCaches()V\" removed=\"11\"/>\n\t\t<method name=\"getClipBounds()Landroid/graphics/Rect;\"/>\n\t\t<method name=\"getClipBounds(Landroid/graphics/Rect;)Z\"/>\n\t\t<method name=\"getDensity()I\" since=\"4\"/>\n\t\t<method name=\"getDrawFilter()Landroid/graphics/DrawFilter;\"/>\n\t\t<method name=\"getGL()Ljavax/microedition/khronos/opengles/GL;\" removed=\"11\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getMatrix()Landroid/graphics/Matrix;\" deprecated=\"16\"/>\n\t\t<method name=\"getMatrix(Landroid/graphics/Matrix;)V\" deprecated=\"16\"/>\n\t\t<method name=\"getMaximumBitmapHeight()I\" since=\"14\"/>\n\t\t<method name=\"getMaximumBitmapWidth()I\" since=\"14\"/>\n\t\t<method name=\"getSaveCount()I\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t\t<method name=\"isHardwareAccelerated()Z\" since=\"11\"/>\n\t\t<method name=\"isOpaque()Z\"/>\n\t\t<method name=\"quickReject(FFFFLandroid/graphics/Canvas$EdgeType;)Z\"/>\n\t\t<method name=\"quickReject(Landroid/graphics/Path;Landroid/graphics/Canvas$EdgeType;)Z\"/>\n\t\t<method name=\"quickReject(Landroid/graphics/RectF;Landroid/graphics/Canvas$EdgeType;)Z\"/>\n\t\t<method name=\"restore()V\"/>\n\t\t<method name=\"restoreToCount(I)V\"/>\n\t\t<method name=\"rotate(F)V\"/>\n\t\t<method name=\"rotate(FFF)V\"/>\n\t\t<method name=\"save()I\"/>\n\t\t<method name=\"save(I)I\" deprecated=\"26\" removed=\"28\"/>\n\t\t<method name=\"saveLayer(FFFFLandroid/graphics/Paint;)I\" since=\"21\"/>\n\t\t<method name=\"saveLayer(FFFFLandroid/graphics/Paint;I)I\" deprecated=\"26\"/>\n\t\t<method name=\"saveLayer(Landroid/graphics/RectF;Landroid/graphics/Paint;)I\" since=\"21\"/>\n\t\t<method name=\"saveLayer(Landroid/graphics/RectF;Landroid/graphics/Paint;I)I\" deprecated=\"26\"/>\n\t\t<method name=\"saveLayerAlpha(FFFFI)I\" since=\"21\"/>\n\t\t<method name=\"saveLayerAlpha(FFFFII)I\" deprecated=\"26\"/>\n\t\t<method name=\"saveLayerAlpha(Landroid/graphics/RectF;I)I\" since=\"21\"/>\n\t\t<method name=\"saveLayerAlpha(Landroid/graphics/RectF;II)I\" deprecated=\"26\"/>\n\t\t<method name=\"scale(FF)V\"/>\n\t\t<method name=\"scale(FFFF)V\"/>\n\t\t<method name=\"setBitmap(Landroid/graphics/Bitmap;)V\"/>\n\t\t<method name=\"setDensity(I)V\" since=\"4\"/>\n\t\t<method name=\"setDrawFilter(Landroid/graphics/DrawFilter;)V\"/>\n\t\t<method name=\"setMatrix(Landroid/graphics/Matrix;)V\"/>\n\t\t<method name=\"setViewport(II)V\" removed=\"11\"/>\n\t\t<method name=\"skew(FF)V\"/>\n\t\t<method name=\"translate(FF)V\"/>\n\t\t<field name=\"ALL_SAVE_FLAG\"/>\n\t\t<field name=\"CLIP_SAVE_FLAG\" deprecated=\"26\" removed=\"28\"/>\n\t\t<field name=\"CLIP_TO_LAYER_SAVE_FLAG\" deprecated=\"26\" removed=\"28\"/>\n\t\t<field name=\"FULL_COLOR_LAYER_SAVE_FLAG\" deprecated=\"26\" removed=\"28\"/>\n\t\t<field name=\"HAS_ALPHA_LAYER_SAVE_FLAG\" deprecated=\"26\" removed=\"28\"/>\n\t\t<field name=\"MATRIX_SAVE_FLAG\" deprecated=\"26\" removed=\"28\"/>\n\t</class>\n\t<class name=\"android/graphics/Canvas$EdgeType\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/Canvas$EdgeType;\"/>\n\t\t<method name=\"values()[Landroid/graphics/Canvas$EdgeType;\"/>\n\t\t<field name=\"AA\"/>\n\t\t<field name=\"BW\"/>\n\t</class>\n\t<class name=\"android/graphics/Canvas$VertexMode\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/Canvas$VertexMode;\"/>\n\t\t<method name=\"values()[Landroid/graphics/Canvas$VertexMode;\"/>\n\t\t<field name=\"TRIANGLES\"/>\n\t\t<field name=\"TRIANGLE_FAN\"/>\n\t\t<field name=\"TRIANGLE_STRIP\"/>\n\t</class>\n\t<class name=\"android/graphics/Color\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"HSVToColor(I[F)I\"/>\n\t\t<method name=\"HSVToColor([F)I\"/>\n\t\t<method name=\"RGBToHSV(III[F)V\"/>\n\t\t<method name=\"alpha()F\" since=\"26\"/>\n\t\t<method name=\"alpha(I)I\"/>\n\t\t<method name=\"alpha(J)F\" since=\"26\"/>\n\t\t<method name=\"argb(FFFF)I\" since=\"26\"/>\n\t\t<method name=\"argb(IIII)I\"/>\n\t\t<method name=\"blue()F\" since=\"26\"/>\n\t\t<method name=\"blue(I)I\"/>\n\t\t<method name=\"blue(J)F\" since=\"26\"/>\n\t\t<method name=\"colorSpace(J)Landroid/graphics/ColorSpace;\" since=\"26\"/>\n\t\t<method name=\"colorToHSV(I[F)V\"/>\n\t\t<method name=\"convert(FFFFLandroid/graphics/ColorSpace$Connector;)J\" since=\"26\"/>\n\t\t<method name=\"convert(FFFFLandroid/graphics/ColorSpace;Landroid/graphics/ColorSpace;)J\" since=\"26\"/>\n\t\t<method name=\"convert(ILandroid/graphics/ColorSpace;)J\" since=\"26\"/>\n\t\t<method name=\"convert(JLandroid/graphics/ColorSpace$Connector;)J\" since=\"26\"/>\n\t\t<method name=\"convert(JLandroid/graphics/ColorSpace;)J\" since=\"26\"/>\n\t\t<method name=\"convert(Landroid/graphics/ColorSpace;)Landroid/graphics/Color;\" since=\"26\"/>\n\t\t<method name=\"getColorSpace()Landroid/graphics/ColorSpace;\" since=\"26\"/>\n\t\t<method name=\"getComponent(I)F\" since=\"26\"/>\n\t\t<method name=\"getComponentCount()I\" since=\"26\"/>\n\t\t<method name=\"getComponents()[F\" since=\"26\"/>\n\t\t<method name=\"getComponents([F)[F\" since=\"26\"/>\n\t\t<method name=\"getModel()Landroid/graphics/ColorSpace$Model;\" since=\"26\"/>\n\t\t<method name=\"green()F\" since=\"26\"/>\n\t\t<method name=\"green(I)I\"/>\n\t\t<method name=\"green(J)F\" since=\"26\"/>\n\t\t<method name=\"isInColorSpace(JLandroid/graphics/ColorSpace;)Z\" since=\"26\"/>\n\t\t<method name=\"isSrgb()Z\" since=\"26\"/>\n\t\t<method name=\"isSrgb(J)Z\" since=\"26\"/>\n\t\t<method name=\"isWideGamut()Z\" since=\"26\"/>\n\t\t<method name=\"isWideGamut(J)Z\" since=\"26\"/>\n\t\t<method name=\"luminance()F\" since=\"26\"/>\n\t\t<method name=\"luminance(I)F\" since=\"24\"/>\n\t\t<method name=\"luminance(J)F\" since=\"26\"/>\n\t\t<method name=\"pack()J\" since=\"26\"/>\n\t\t<method name=\"pack(FFF)J\" since=\"26\"/>\n\t\t<method name=\"pack(FFFF)J\" since=\"26\"/>\n\t\t<method name=\"pack(FFFFLandroid/graphics/ColorSpace;)J\" since=\"26\"/>\n\t\t<method name=\"pack(I)J\" since=\"26\"/>\n\t\t<method name=\"parseColor(Ljava/lang/String;)I\"/>\n\t\t<method name=\"red()F\" since=\"26\"/>\n\t\t<method name=\"red(I)I\"/>\n\t\t<method name=\"red(J)F\" since=\"26\"/>\n\t\t<method name=\"rgb(FFF)I\" since=\"26\"/>\n\t\t<method name=\"rgb(III)I\"/>\n\t\t<method name=\"toArgb()I\" since=\"26\"/>\n\t\t<method name=\"toArgb(J)I\" since=\"26\"/>\n\t\t<method name=\"valueOf(FFF)Landroid/graphics/Color;\" since=\"26\"/>\n\t\t<method name=\"valueOf(FFFF)Landroid/graphics/Color;\" since=\"26\"/>\n\t\t<method name=\"valueOf(FFFFLandroid/graphics/ColorSpace;)Landroid/graphics/Color;\" since=\"26\"/>\n\t\t<method name=\"valueOf(I)Landroid/graphics/Color;\" since=\"26\"/>\n\t\t<method name=\"valueOf(J)Landroid/graphics/Color;\" since=\"26\"/>\n\t\t<method name=\"valueOf([FLandroid/graphics/ColorSpace;)Landroid/graphics/Color;\" since=\"26\"/>\n\t\t<field name=\"BLACK\"/>\n\t\t<field name=\"BLUE\"/>\n\t\t<field name=\"CYAN\"/>\n\t\t<field name=\"DKGRAY\"/>\n\t\t<field name=\"GRAY\"/>\n\t\t<field name=\"GREEN\"/>\n\t\t<field name=\"LTGRAY\"/>\n\t\t<field name=\"MAGENTA\"/>\n\t\t<field name=\"RED\"/>\n\t\t<field name=\"TRANSPARENT\"/>\n\t\t<field name=\"WHITE\"/>\n\t\t<field name=\"YELLOW\"/>\n\t</class>\n\t<class name=\"android/graphics/ColorFilter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"26\"/>\n\t</class>\n\t<class name=\"android/graphics/ColorMatrix\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/ColorMatrix;)V\"/>\n\t\t<method name=\"&lt;init>([F)V\"/>\n\t\t<method name=\"getArray()[F\"/>\n\t\t<method name=\"postConcat(Landroid/graphics/ColorMatrix;)V\"/>\n\t\t<method name=\"preConcat(Landroid/graphics/ColorMatrix;)V\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"set(Landroid/graphics/ColorMatrix;)V\"/>\n\t\t<method name=\"set([F)V\"/>\n\t\t<method name=\"setConcat(Landroid/graphics/ColorMatrix;Landroid/graphics/ColorMatrix;)V\"/>\n\t\t<method name=\"setRGB2YUV()V\"/>\n\t\t<method name=\"setRotate(IF)V\"/>\n\t\t<method name=\"setSaturation(F)V\"/>\n\t\t<method name=\"setScale(FFFF)V\"/>\n\t\t<method name=\"setYUV2RGB()V\"/>\n\t</class>\n\t<class name=\"android/graphics/ColorMatrixColorFilter\" since=\"1\">\n\t\t<extends name=\"android/graphics/ColorFilter\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/ColorMatrix;)V\"/>\n\t\t<method name=\"&lt;init>([F)V\"/>\n\t\t<method name=\"getColorMatrix(Landroid/graphics/ColorMatrix;)V\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/graphics/ColorSpace\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"adapt(Landroid/graphics/ColorSpace;[F)Landroid/graphics/ColorSpace;\"/>\n\t\t<method name=\"adapt(Landroid/graphics/ColorSpace;[FLandroid/graphics/ColorSpace$Adaptation;)Landroid/graphics/ColorSpace;\"/>\n\t\t<method name=\"connect(Landroid/graphics/ColorSpace;)Landroid/graphics/ColorSpace$Connector;\"/>\n\t\t<method name=\"connect(Landroid/graphics/ColorSpace;Landroid/graphics/ColorSpace$RenderIntent;)Landroid/graphics/ColorSpace$Connector;\"/>\n\t\t<method name=\"connect(Landroid/graphics/ColorSpace;Landroid/graphics/ColorSpace;)Landroid/graphics/ColorSpace$Connector;\"/>\n\t\t<method name=\"connect(Landroid/graphics/ColorSpace;Landroid/graphics/ColorSpace;Landroid/graphics/ColorSpace$RenderIntent;)Landroid/graphics/ColorSpace$Connector;\"/>\n\t\t<method name=\"fromXyz(FFF)[F\"/>\n\t\t<method name=\"fromXyz([F)[F\"/>\n\t\t<method name=\"get(Landroid/graphics/ColorSpace$Named;)Landroid/graphics/ColorSpace;\"/>\n\t\t<method name=\"getComponentCount()I\"/>\n\t\t<method name=\"getId()I\"/>\n\t\t<method name=\"getMaxValue(I)F\"/>\n\t\t<method name=\"getMinValue(I)F\"/>\n\t\t<method name=\"getModel()Landroid/graphics/ColorSpace$Model;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"isSrgb()Z\"/>\n\t\t<method name=\"isWideGamut()Z\"/>\n\t\t<method name=\"match([FLandroid/graphics/ColorSpace$Rgb$TransferParameters;)Landroid/graphics/ColorSpace;\"/>\n\t\t<method name=\"toXyz(FFF)[F\"/>\n\t\t<method name=\"toXyz([F)[F\"/>\n\t\t<field name=\"ILLUMINANT_A\"/>\n\t\t<field name=\"ILLUMINANT_B\"/>\n\t\t<field name=\"ILLUMINANT_C\"/>\n\t\t<field name=\"ILLUMINANT_D50\"/>\n\t\t<field name=\"ILLUMINANT_D55\"/>\n\t\t<field name=\"ILLUMINANT_D60\"/>\n\t\t<field name=\"ILLUMINANT_D65\"/>\n\t\t<field name=\"ILLUMINANT_D75\"/>\n\t\t<field name=\"ILLUMINANT_E\"/>\n\t\t<field name=\"MAX_ID\"/>\n\t\t<field name=\"MIN_ID\"/>\n\t</class>\n\t<class name=\"android/graphics/ColorSpace$Adaptation\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/ColorSpace$Adaptation;\"/>\n\t\t<method name=\"values()[Landroid/graphics/ColorSpace$Adaptation;\"/>\n\t\t<field name=\"BRADFORD\"/>\n\t\t<field name=\"CIECAT02\"/>\n\t\t<field name=\"VON_KRIES\"/>\n\t</class>\n\t<class name=\"android/graphics/ColorSpace$Connector\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getDestination()Landroid/graphics/ColorSpace;\"/>\n\t\t<method name=\"getRenderIntent()Landroid/graphics/ColorSpace$RenderIntent;\"/>\n\t\t<method name=\"getSource()Landroid/graphics/ColorSpace;\"/>\n\t\t<method name=\"transform(FFF)[F\"/>\n\t\t<method name=\"transform([F)[F\"/>\n\t</class>\n\t<class name=\"android/graphics/ColorSpace$Model\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"getComponentCount()I\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/ColorSpace$Model;\"/>\n\t\t<method name=\"values()[Landroid/graphics/ColorSpace$Model;\"/>\n\t\t<field name=\"CMYK\"/>\n\t\t<field name=\"LAB\"/>\n\t\t<field name=\"RGB\"/>\n\t\t<field name=\"XYZ\"/>\n\t</class>\n\t<class name=\"android/graphics/ColorSpace$Named\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/ColorSpace$Named;\"/>\n\t\t<method name=\"values()[Landroid/graphics/ColorSpace$Named;\"/>\n\t\t<field name=\"ACES\"/>\n\t\t<field name=\"ACESCG\"/>\n\t\t<field name=\"ADOBE_RGB\"/>\n\t\t<field name=\"BT2020\"/>\n\t\t<field name=\"BT709\"/>\n\t\t<field name=\"CIE_LAB\"/>\n\t\t<field name=\"CIE_XYZ\"/>\n\t\t<field name=\"DCI_P3\"/>\n\t\t<field name=\"DISPLAY_P3\"/>\n\t\t<field name=\"EXTENDED_SRGB\"/>\n\t\t<field name=\"LINEAR_EXTENDED_SRGB\"/>\n\t\t<field name=\"LINEAR_SRGB\"/>\n\t\t<field name=\"NTSC_1953\"/>\n\t\t<field name=\"PRO_PHOTO_RGB\"/>\n\t\t<field name=\"SMPTE_C\"/>\n\t\t<field name=\"SRGB\"/>\n\t</class>\n\t<class name=\"android/graphics/ColorSpace$RenderIntent\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/ColorSpace$RenderIntent;\"/>\n\t\t<method name=\"values()[Landroid/graphics/ColorSpace$RenderIntent;\"/>\n\t\t<field name=\"ABSOLUTE\"/>\n\t\t<field name=\"PERCEPTUAL\"/>\n\t\t<field name=\"RELATIVE\"/>\n\t\t<field name=\"SATURATION\"/>\n\t</class>\n\t<class name=\"android/graphics/ColorSpace$Rgb\" since=\"26\">\n\t\t<extends name=\"android/graphics/ColorSpace\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;[FD)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;[FLandroid/graphics/ColorSpace$Rgb$TransferParameters;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;[FLjava/util/function/DoubleUnaryOperator;Ljava/util/function/DoubleUnaryOperator;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;[F[FD)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;[F[FLandroid/graphics/ColorSpace$Rgb$TransferParameters;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;[F[FLjava/util/function/DoubleUnaryOperator;Ljava/util/function/DoubleUnaryOperator;FF)V\"/>\n\t\t<method name=\"fromLinear(FFF)[F\"/>\n\t\t<method name=\"fromLinear([F)[F\"/>\n\t\t<method name=\"getEotf()Ljava/util/function/DoubleUnaryOperator;\"/>\n\t\t<method name=\"getInverseTransform()[F\"/>\n\t\t<method name=\"getInverseTransform([F)[F\"/>\n\t\t<method name=\"getOetf()Ljava/util/function/DoubleUnaryOperator;\"/>\n\t\t<method name=\"getPrimaries()[F\"/>\n\t\t<method name=\"getPrimaries([F)[F\"/>\n\t\t<method name=\"getTransferParameters()Landroid/graphics/ColorSpace$Rgb$TransferParameters;\"/>\n\t\t<method name=\"getTransform()[F\"/>\n\t\t<method name=\"getTransform([F)[F\"/>\n\t\t<method name=\"getWhitePoint()[F\"/>\n\t\t<method name=\"getWhitePoint([F)[F\"/>\n\t\t<method name=\"toLinear(FFF)[F\"/>\n\t\t<method name=\"toLinear([F)[F\"/>\n\t</class>\n\t<class name=\"android/graphics/ColorSpace$Rgb$TransferParameters\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(DDDDD)V\"/>\n\t\t<method name=\"&lt;init>(DDDDDDD)V\"/>\n\t\t<field name=\"a\"/>\n\t\t<field name=\"b\"/>\n\t\t<field name=\"c\"/>\n\t\t<field name=\"d\"/>\n\t\t<field name=\"e\"/>\n\t\t<field name=\"f\"/>\n\t\t<field name=\"g\"/>\n\t</class>\n\t<class name=\"android/graphics/ComposePathEffect\" since=\"1\">\n\t\t<extends name=\"android/graphics/PathEffect\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/PathEffect;Landroid/graphics/PathEffect;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/ComposeShader\" since=\"1\">\n\t\t<extends name=\"android/graphics/Shader\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Shader;Landroid/graphics/Shader;Landroid/graphics/BlendMode;)V\" since=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Shader;Landroid/graphics/Shader;Landroid/graphics/PorterDuff$Mode;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Shader;Landroid/graphics/Shader;Landroid/graphics/Xfermode;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/graphics/CornerPathEffect\" since=\"1\">\n\t\t<extends name=\"android/graphics/PathEffect\"/>\n\t\t<method name=\"&lt;init>(F)V\"/>\n\t</class>\n\t<class name=\"android/graphics/DashPathEffect\" since=\"1\">\n\t\t<extends name=\"android/graphics/PathEffect\"/>\n\t\t<method name=\"&lt;init>([FF)V\"/>\n\t</class>\n\t<class name=\"android/graphics/DiscretePathEffect\" since=\"1\">\n\t\t<extends name=\"android/graphics/PathEffect\"/>\n\t\t<method name=\"&lt;init>(FF)V\"/>\n\t</class>\n\t<class name=\"android/graphics/DrawFilter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/graphics/EmbossMaskFilter\" since=\"1\">\n\t\t<extends name=\"android/graphics/MaskFilter\"/>\n\t\t<method name=\"&lt;init>([FFFF)V\" deprecated=\"28\"/>\n\t</class>\n\t<class name=\"android/graphics/HardwareRenderer\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"clearContent()V\"/>\n\t\t<method name=\"createRenderRequest()Landroid/graphics/HardwareRenderer$FrameRenderRequest;\"/>\n\t\t<method name=\"destroy()V\"/>\n\t\t<method name=\"isOpaque()Z\"/>\n\t\t<method name=\"notifyFramePending()V\"/>\n\t\t<method name=\"setContentRoot(Landroid/graphics/RenderNode;)V\"/>\n\t\t<method name=\"setLightSourceAlpha(FF)V\"/>\n\t\t<method name=\"setLightSourceGeometry(FFFF)V\"/>\n\t\t<method name=\"setName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setOpaque(Z)V\"/>\n\t\t<method name=\"setSurface(Landroid/view/Surface;)V\"/>\n\t\t<method name=\"start()V\"/>\n\t\t<method name=\"stop()V\"/>\n\t\t<field name=\"SYNC_CONTEXT_IS_STOPPED\"/>\n\t\t<field name=\"SYNC_FRAME_DROPPED\"/>\n\t\t<field name=\"SYNC_LOST_SURFACE_REWARD_IF_FOUND\"/>\n\t\t<field name=\"SYNC_OK\"/>\n\t\t<field name=\"SYNC_REDRAW_REQUESTED\"/>\n\t</class>\n\t<class name=\"android/graphics/HardwareRenderer$FrameRenderRequest\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"setFrameCommitCallback(Ljava/util/concurrent/Executor;Ljava/lang/Runnable;)Landroid/graphics/HardwareRenderer$FrameRenderRequest;\"/>\n\t\t<method name=\"setVsyncTime(J)Landroid/graphics/HardwareRenderer$FrameRenderRequest;\"/>\n\t\t<method name=\"setWaitForPresent(Z)Landroid/graphics/HardwareRenderer$FrameRenderRequest;\"/>\n\t\t<method name=\"syncAndDraw()I\"/>\n\t</class>\n\t<class name=\"android/graphics/ImageDecoder\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"createSource(Landroid/content/ContentResolver;Landroid/net/Uri;)Landroid/graphics/ImageDecoder$Source;\"/>\n\t\t<method name=\"createSource(Landroid/content/res/AssetManager;Ljava/lang/String;)Landroid/graphics/ImageDecoder$Source;\"/>\n\t\t<method name=\"createSource(Landroid/content/res/Resources;I)Landroid/graphics/ImageDecoder$Source;\"/>\n\t\t<method name=\"createSource(Ljava/io/File;)Landroid/graphics/ImageDecoder$Source;\"/>\n\t\t<method name=\"createSource(Ljava/nio/ByteBuffer;)Landroid/graphics/ImageDecoder$Source;\"/>\n\t\t<method name=\"createSource(Ljava/util/concurrent/Callable;)Landroid/graphics/ImageDecoder$Source;\" since=\"29\"/>\n\t\t<method name=\"decodeBitmap(Landroid/graphics/ImageDecoder$Source;)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"decodeBitmap(Landroid/graphics/ImageDecoder$Source;Landroid/graphics/ImageDecoder$OnHeaderDecodedListener;)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"decodeDrawable(Landroid/graphics/ImageDecoder$Source;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"decodeDrawable(Landroid/graphics/ImageDecoder$Source;Landroid/graphics/ImageDecoder$OnHeaderDecodedListener;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getAllocator()I\"/>\n\t\t<method name=\"getCrop()Landroid/graphics/Rect;\"/>\n\t\t<method name=\"getMemorySizePolicy()I\"/>\n\t\t<method name=\"getOnPartialImageListener()Landroid/graphics/ImageDecoder$OnPartialImageListener;\"/>\n\t\t<method name=\"getPostProcessor()Landroid/graphics/PostProcessor;\"/>\n\t\t<method name=\"isDecodeAsAlphaMaskEnabled()Z\"/>\n\t\t<method name=\"isMimeTypeSupported(Ljava/lang/String;)Z\" since=\"29\"/>\n\t\t<method name=\"isMutableRequired()Z\"/>\n\t\t<method name=\"isUnpremultipliedRequired()Z\"/>\n\t\t<method name=\"setAllocator(I)V\"/>\n\t\t<method name=\"setCrop(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"setDecodeAsAlphaMaskEnabled(Z)V\"/>\n\t\t<method name=\"setMemorySizePolicy(I)V\"/>\n\t\t<method name=\"setMutableRequired(Z)V\"/>\n\t\t<method name=\"setOnPartialImageListener(Landroid/graphics/ImageDecoder$OnPartialImageListener;)V\"/>\n\t\t<method name=\"setPostProcessor(Landroid/graphics/PostProcessor;)V\"/>\n\t\t<method name=\"setTargetColorSpace(Landroid/graphics/ColorSpace;)V\"/>\n\t\t<method name=\"setTargetSampleSize(I)V\"/>\n\t\t<method name=\"setTargetSize(II)V\"/>\n\t\t<method name=\"setUnpremultipliedRequired(Z)V\"/>\n\t\t<field name=\"ALLOCATOR_DEFAULT\"/>\n\t\t<field name=\"ALLOCATOR_HARDWARE\"/>\n\t\t<field name=\"ALLOCATOR_SHARED_MEMORY\"/>\n\t\t<field name=\"ALLOCATOR_SOFTWARE\"/>\n\t\t<field name=\"MEMORY_POLICY_DEFAULT\"/>\n\t\t<field name=\"MEMORY_POLICY_LOW_RAM\"/>\n\t</class>\n\t<class name=\"android/graphics/ImageDecoder$DecodeException\" since=\"28\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"getError()I\"/>\n\t\t<method name=\"getSource()Landroid/graphics/ImageDecoder$Source;\"/>\n\t\t<field name=\"SOURCE_EXCEPTION\"/>\n\t\t<field name=\"SOURCE_INCOMPLETE\"/>\n\t\t<field name=\"SOURCE_MALFORMED_DATA\"/>\n\t</class>\n\t<class name=\"android/graphics/ImageDecoder$ImageInfo\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getColorSpace()Landroid/graphics/ColorSpace;\"/>\n\t\t<method name=\"getMimeType()Ljava/lang/String;\"/>\n\t\t<method name=\"getSize()Landroid/util/Size;\"/>\n\t\t<method name=\"isAnimated()Z\"/>\n\t</class>\n\t<class name=\"android/graphics/ImageDecoder$OnHeaderDecodedListener\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onHeaderDecoded(Landroid/graphics/ImageDecoder;Landroid/graphics/ImageDecoder$ImageInfo;Landroid/graphics/ImageDecoder$Source;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/ImageDecoder$OnPartialImageListener\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onPartialImage(Landroid/graphics/ImageDecoder$DecodeException;)Z\"/>\n\t</class>\n\t<class name=\"android/graphics/ImageDecoder$Source\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/graphics/ImageFormat\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getBitsPerPixel(I)I\"/>\n\t\t<field name=\"DEPTH16\" since=\"23\"/>\n\t\t<field name=\"DEPTH_JPEG\" since=\"29\"/>\n\t\t<field name=\"DEPTH_POINT_CLOUD\" since=\"23\"/>\n\t\t<field name=\"FLEX_RGBA_8888\" since=\"23\"/>\n\t\t<field name=\"FLEX_RGB_888\" since=\"23\"/>\n\t\t<field name=\"HEIC\" since=\"29\"/>\n\t\t<field name=\"JPEG\"/>\n\t\t<field name=\"NV16\"/>\n\t\t<field name=\"NV21\"/>\n\t\t<field name=\"PRIVATE\" since=\"23\"/>\n\t\t<field name=\"RAW10\" since=\"21\"/>\n\t\t<field name=\"RAW12\" since=\"23\"/>\n\t\t<field name=\"RAW_PRIVATE\" since=\"24\"/>\n\t\t<field name=\"RAW_SENSOR\" since=\"21\"/>\n\t\t<field name=\"RGB_565\"/>\n\t\t<field name=\"UNKNOWN\"/>\n\t\t<field name=\"Y8\" since=\"29\"/>\n\t\t<field name=\"YUV_420_888\" since=\"19\"/>\n\t\t<field name=\"YUV_422_888\" since=\"23\"/>\n\t\t<field name=\"YUV_444_888\" since=\"23\"/>\n\t\t<field name=\"YUY2\"/>\n\t\t<field name=\"YV12\" since=\"9\"/>\n\t</class>\n\t<class name=\"android/graphics/Insets\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"add(Landroid/graphics/Insets;Landroid/graphics/Insets;)Landroid/graphics/Insets;\"/>\n\t\t<method name=\"max(Landroid/graphics/Insets;Landroid/graphics/Insets;)Landroid/graphics/Insets;\"/>\n\t\t<method name=\"min(Landroid/graphics/Insets;Landroid/graphics/Insets;)Landroid/graphics/Insets;\"/>\n\t\t<method name=\"of(IIII)Landroid/graphics/Insets;\"/>\n\t\t<method name=\"of(Landroid/graphics/Rect;)Landroid/graphics/Insets;\"/>\n\t\t<method name=\"subtract(Landroid/graphics/Insets;Landroid/graphics/Insets;)Landroid/graphics/Insets;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"NONE\"/>\n\t\t<field name=\"bottom\"/>\n\t\t<field name=\"left\"/>\n\t\t<field name=\"right\"/>\n\t\t<field name=\"top\"/>\n\t</class>\n\t<class name=\"android/graphics/Interpolator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"getKeyFrameCount()I\"/>\n\t\t<method name=\"getValueCount()I\"/>\n\t\t<method name=\"reset(I)V\"/>\n\t\t<method name=\"reset(II)V\"/>\n\t\t<method name=\"setKeyFrame(II[F)V\"/>\n\t\t<method name=\"setKeyFrame(II[F[F)V\"/>\n\t\t<method name=\"setRepeatMirror(FZ)V\"/>\n\t\t<method name=\"timeToValues(I[F)Landroid/graphics/Interpolator$Result;\"/>\n\t\t<method name=\"timeToValues([F)Landroid/graphics/Interpolator$Result;\"/>\n\t</class>\n\t<class name=\"android/graphics/Interpolator$Result\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/Interpolator$Result;\"/>\n\t\t<method name=\"values()[Landroid/graphics/Interpolator$Result;\"/>\n\t\t<field name=\"FREEZE_END\"/>\n\t\t<field name=\"FREEZE_START\"/>\n\t\t<field name=\"NORMAL\"/>\n\t</class>\n\t<class name=\"android/graphics/LayerRasterizer\" since=\"1\" deprecated=\"21\" removed=\"26\">\n\t\t<extends name=\"android/graphics/Rasterizer\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addLayer(Landroid/graphics/Paint;)V\"/>\n\t\t<method name=\"addLayer(Landroid/graphics/Paint;FF)V\"/>\n\t</class>\n\t<class name=\"android/graphics/LightingColorFilter\" since=\"1\">\n\t\t<extends name=\"android/graphics/ColorFilter\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"getColorAdd()I\" since=\"26\"/>\n\t\t<method name=\"getColorMultiply()I\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/graphics/LinearGradient\" since=\"1\">\n\t\t<extends name=\"android/graphics/Shader\"/>\n\t\t<method name=\"&lt;init>(FFFFIILandroid/graphics/Shader$TileMode;)V\"/>\n\t\t<method name=\"&lt;init>(FFFFJJLandroid/graphics/Shader$TileMode;)V\" since=\"29\"/>\n\t\t<method name=\"&lt;init>(FFFF[I[FLandroid/graphics/Shader$TileMode;)V\"/>\n\t\t<method name=\"&lt;init>(FFFF[J[FLandroid/graphics/Shader$TileMode;)V\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/graphics/MaskFilter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/graphics/Matrix\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Matrix;)V\"/>\n\t\t<method name=\"getValues([F)V\"/>\n\t\t<method name=\"invert(Landroid/graphics/Matrix;)Z\"/>\n\t\t<method name=\"isAffine()Z\" since=\"21\"/>\n\t\t<method name=\"isIdentity()Z\"/>\n\t\t<method name=\"mapPoints([F)V\"/>\n\t\t<method name=\"mapPoints([FI[FII)V\"/>\n\t\t<method name=\"mapPoints([F[F)V\"/>\n\t\t<method name=\"mapRadius(F)F\"/>\n\t\t<method name=\"mapRect(Landroid/graphics/RectF;)Z\"/>\n\t\t<method name=\"mapRect(Landroid/graphics/RectF;Landroid/graphics/RectF;)Z\"/>\n\t\t<method name=\"mapVectors([F)V\"/>\n\t\t<method name=\"mapVectors([FI[FII)V\"/>\n\t\t<method name=\"mapVectors([F[F)V\"/>\n\t\t<method name=\"postConcat(Landroid/graphics/Matrix;)Z\"/>\n\t\t<method name=\"postRotate(F)Z\"/>\n\t\t<method name=\"postRotate(FFF)Z\"/>\n\t\t<method name=\"postScale(FF)Z\"/>\n\t\t<method name=\"postScale(FFFF)Z\"/>\n\t\t<method name=\"postSkew(FF)Z\"/>\n\t\t<method name=\"postSkew(FFFF)Z\"/>\n\t\t<method name=\"postTranslate(FF)Z\"/>\n\t\t<method name=\"preConcat(Landroid/graphics/Matrix;)Z\"/>\n\t\t<method name=\"preRotate(F)Z\"/>\n\t\t<method name=\"preRotate(FFF)Z\"/>\n\t\t<method name=\"preScale(FF)Z\"/>\n\t\t<method name=\"preScale(FFFF)Z\"/>\n\t\t<method name=\"preSkew(FF)Z\"/>\n\t\t<method name=\"preSkew(FFFF)Z\"/>\n\t\t<method name=\"preTranslate(FF)Z\"/>\n\t\t<method name=\"rectStaysRect()Z\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"set(Landroid/graphics/Matrix;)V\"/>\n\t\t<method name=\"setConcat(Landroid/graphics/Matrix;Landroid/graphics/Matrix;)Z\"/>\n\t\t<method name=\"setPolyToPoly([FI[FII)Z\"/>\n\t\t<method name=\"setRectToRect(Landroid/graphics/RectF;Landroid/graphics/RectF;Landroid/graphics/Matrix$ScaleToFit;)Z\"/>\n\t\t<method name=\"setRotate(F)V\"/>\n\t\t<method name=\"setRotate(FFF)V\"/>\n\t\t<method name=\"setScale(FF)V\"/>\n\t\t<method name=\"setScale(FFFF)V\"/>\n\t\t<method name=\"setSinCos(FF)V\"/>\n\t\t<method name=\"setSinCos(FFFF)V\"/>\n\t\t<method name=\"setSkew(FF)V\"/>\n\t\t<method name=\"setSkew(FFFF)V\"/>\n\t\t<method name=\"setTranslate(FF)V\"/>\n\t\t<method name=\"setValues([F)V\"/>\n\t\t<method name=\"toShortString()Ljava/lang/String;\"/>\n\t\t<field name=\"MPERSP_0\"/>\n\t\t<field name=\"MPERSP_1\"/>\n\t\t<field name=\"MPERSP_2\"/>\n\t\t<field name=\"MSCALE_X\"/>\n\t\t<field name=\"MSCALE_Y\"/>\n\t\t<field name=\"MSKEW_X\"/>\n\t\t<field name=\"MSKEW_Y\"/>\n\t\t<field name=\"MTRANS_X\"/>\n\t\t<field name=\"MTRANS_Y\"/>\n\t</class>\n\t<class name=\"android/graphics/Matrix$ScaleToFit\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/Matrix$ScaleToFit;\"/>\n\t\t<method name=\"values()[Landroid/graphics/Matrix$ScaleToFit;\"/>\n\t\t<field name=\"CENTER\"/>\n\t\t<field name=\"END\"/>\n\t\t<field name=\"FILL\"/>\n\t\t<field name=\"START\"/>\n\t</class>\n\t<class name=\"android/graphics/Movie\" since=\"1\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"decodeByteArray([BII)Landroid/graphics/Movie;\" deprecated=\"29\"/>\n\t\t<method name=\"decodeFile(Ljava/lang/String;)Landroid/graphics/Movie;\" deprecated=\"29\"/>\n\t\t<method name=\"decodeStream(Ljava/io/InputStream;)Landroid/graphics/Movie;\" deprecated=\"29\"/>\n\t\t<method name=\"draw(Landroid/graphics/Canvas;FF)V\" deprecated=\"29\"/>\n\t\t<method name=\"draw(Landroid/graphics/Canvas;FFLandroid/graphics/Paint;)V\" deprecated=\"29\"/>\n\t\t<method name=\"duration()I\" deprecated=\"29\"/>\n\t\t<method name=\"height()I\" deprecated=\"29\"/>\n\t\t<method name=\"isOpaque()Z\" deprecated=\"29\"/>\n\t\t<method name=\"setTime(I)Z\" deprecated=\"29\"/>\n\t\t<method name=\"width()I\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/graphics/NinePatch\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Bitmap;[B)V\" since=\"19\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Bitmap;[BLjava/lang/String;)V\"/>\n\t\t<method name=\"draw(Landroid/graphics/Canvas;Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"draw(Landroid/graphics/Canvas;Landroid/graphics/Rect;Landroid/graphics/Paint;)V\"/>\n\t\t<method name=\"draw(Landroid/graphics/Canvas;Landroid/graphics/RectF;)V\"/>\n\t\t<method name=\"getBitmap()Landroid/graphics/Bitmap;\" since=\"19\"/>\n\t\t<method name=\"getDensity()I\" since=\"4\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\" since=\"19\"/>\n\t\t<method name=\"getPaint()Landroid/graphics/Paint;\" since=\"19\"/>\n\t\t<method name=\"getTransparentRegion(Landroid/graphics/Rect;)Landroid/graphics/Region;\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t\t<method name=\"hasAlpha()Z\"/>\n\t\t<method name=\"isNinePatchChunk([B)Z\"/>\n\t\t<method name=\"setPaint(Landroid/graphics/Paint;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/Outline\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Outline;)V\"/>\n\t\t<method name=\"canClip()Z\"/>\n\t\t<method name=\"getAlpha()F\"/>\n\t\t<method name=\"getRadius()F\" since=\"24\"/>\n\t\t<method name=\"getRect(Landroid/graphics/Rect;)Z\" since=\"24\"/>\n\t\t<method name=\"isEmpty()Z\"/>\n\t\t<method name=\"offset(II)V\" since=\"22\"/>\n\t\t<method name=\"set(Landroid/graphics/Outline;)V\"/>\n\t\t<method name=\"setAlpha(F)V\"/>\n\t\t<method name=\"setConvexPath(Landroid/graphics/Path;)V\"/>\n\t\t<method name=\"setEmpty()V\"/>\n\t\t<method name=\"setOval(IIII)V\"/>\n\t\t<method name=\"setOval(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"setRect(IIII)V\"/>\n\t\t<method name=\"setRect(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"setRoundRect(IIIIF)V\"/>\n\t\t<method name=\"setRoundRect(Landroid/graphics/Rect;F)V\"/>\n\t</class>\n\t<class name=\"android/graphics/Paint\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Paint;)V\"/>\n\t\t<method name=\"ascent()F\"/>\n\t\t<method name=\"breakText(Ljava/lang/CharSequence;IIZF[F)I\"/>\n\t\t<method name=\"breakText(Ljava/lang/String;ZF[F)I\"/>\n\t\t<method name=\"breakText([CIIF[F)I\"/>\n\t\t<method name=\"clearShadowLayer()V\"/>\n\t\t<method name=\"descent()F\"/>\n\t\t<method name=\"equalsForTextMeasurement(Landroid/graphics/Paint;)Z\" since=\"28\"/>\n\t\t<method name=\"getAlpha()I\"/>\n\t\t<method name=\"getBlendMode()Landroid/graphics/BlendMode;\" since=\"29\"/>\n\t\t<method name=\"getColor()I\"/>\n\t\t<method name=\"getColorFilter()Landroid/graphics/ColorFilter;\"/>\n\t\t<method name=\"getColorLong()J\" since=\"29\"/>\n\t\t<method name=\"getEndHyphenEdit()I\" since=\"29\"/>\n\t\t<method name=\"getFillPath(Landroid/graphics/Path;Landroid/graphics/Path;)Z\"/>\n\t\t<method name=\"getFlags()I\"/>\n\t\t<method name=\"getFontFeatureSettings()Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"getFontMetrics()Landroid/graphics/Paint$FontMetrics;\"/>\n\t\t<method name=\"getFontMetrics(Landroid/graphics/Paint$FontMetrics;)F\"/>\n\t\t<method name=\"getFontMetricsInt()Landroid/graphics/Paint$FontMetricsInt;\"/>\n\t\t<method name=\"getFontMetricsInt(Landroid/graphics/Paint$FontMetricsInt;)I\"/>\n\t\t<method name=\"getFontSpacing()F\"/>\n\t\t<method name=\"getFontVariationSettings()Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getHinting()I\" since=\"14\"/>\n\t\t<method name=\"getLetterSpacing()F\" since=\"21\"/>\n\t\t<method name=\"getMaskFilter()Landroid/graphics/MaskFilter;\"/>\n\t\t<method name=\"getOffsetForAdvance(Ljava/lang/CharSequence;IIIIZF)I\" since=\"23\"/>\n\t\t<method name=\"getOffsetForAdvance([CIIIIZF)I\" since=\"23\"/>\n\t\t<method name=\"getPathEffect()Landroid/graphics/PathEffect;\"/>\n\t\t<method name=\"getRasterizer()Landroid/graphics/Rasterizer;\" deprecated=\"21\" removed=\"26\"/>\n\t\t<method name=\"getRunAdvance(Ljava/lang/CharSequence;IIIIZI)F\" since=\"23\"/>\n\t\t<method name=\"getRunAdvance([CIIIIZI)F\" since=\"23\"/>\n\t\t<method name=\"getShader()Landroid/graphics/Shader;\"/>\n\t\t<method name=\"getShadowLayerColor()I\" since=\"29\"/>\n\t\t<method name=\"getShadowLayerColorLong()J\" since=\"29\"/>\n\t\t<method name=\"getShadowLayerDx()F\" since=\"29\"/>\n\t\t<method name=\"getShadowLayerDy()F\" since=\"29\"/>\n\t\t<method name=\"getShadowLayerRadius()F\" since=\"29\"/>\n\t\t<method name=\"getStartHyphenEdit()I\" since=\"29\"/>\n\t\t<method name=\"getStrikeThruPosition()F\" since=\"29\"/>\n\t\t<method name=\"getStrikeThruThickness()F\" since=\"29\"/>\n\t\t<method name=\"getStrokeCap()Landroid/graphics/Paint$Cap;\"/>\n\t\t<method name=\"getStrokeJoin()Landroid/graphics/Paint$Join;\"/>\n\t\t<method name=\"getStrokeMiter()F\"/>\n\t\t<method name=\"getStrokeWidth()F\"/>\n\t\t<method name=\"getStyle()Landroid/graphics/Paint$Style;\"/>\n\t\t<method name=\"getTextAlign()Landroid/graphics/Paint$Align;\"/>\n\t\t<method name=\"getTextBounds(Ljava/lang/CharSequence;IILandroid/graphics/Rect;)V\" since=\"29\"/>\n\t\t<method name=\"getTextBounds(Ljava/lang/String;IILandroid/graphics/Rect;)V\"/>\n\t\t<method name=\"getTextBounds([CIILandroid/graphics/Rect;)V\"/>\n\t\t<method name=\"getTextLocale()Ljava/util/Locale;\" since=\"17\"/>\n\t\t<method name=\"getTextLocales()Landroid/os/LocaleList;\" since=\"24\"/>\n\t\t<method name=\"getTextPath(Ljava/lang/String;IIFFLandroid/graphics/Path;)V\"/>\n\t\t<method name=\"getTextPath([CIIFFLandroid/graphics/Path;)V\"/>\n\t\t<method name=\"getTextRunAdvances([CIIIIZ[FI)F\" since=\"29\"/>\n\t\t<method name=\"getTextRunCursor(Ljava/lang/CharSequence;IIZII)I\" since=\"29\"/>\n\t\t<method name=\"getTextRunCursor([CIIZII)I\" since=\"29\"/>\n\t\t<method name=\"getTextScaleX()F\"/>\n\t\t<method name=\"getTextSize()F\"/>\n\t\t<method name=\"getTextSkewX()F\"/>\n\t\t<method name=\"getTextWidths(Ljava/lang/CharSequence;II[F)I\"/>\n\t\t<method name=\"getTextWidths(Ljava/lang/String;II[F)I\"/>\n\t\t<method name=\"getTextWidths(Ljava/lang/String;[F)I\"/>\n\t\t<method name=\"getTextWidths([CII[F)I\"/>\n\t\t<method name=\"getTypeface()Landroid/graphics/Typeface;\"/>\n\t\t<method name=\"getUnderlinePosition()F\" since=\"29\"/>\n\t\t<method name=\"getUnderlineThickness()F\" since=\"29\"/>\n\t\t<method name=\"getWordSpacing()F\" since=\"29\"/>\n\t\t<method name=\"getXfermode()Landroid/graphics/Xfermode;\"/>\n\t\t<method name=\"hasGlyph(Ljava/lang/String;)Z\" since=\"23\"/>\n\t\t<method name=\"isAntiAlias()Z\"/>\n\t\t<method name=\"isDither()Z\"/>\n\t\t<method name=\"isElegantTextHeight()Z\" since=\"21\"/>\n\t\t<method name=\"isFakeBoldText()Z\"/>\n\t\t<method name=\"isFilterBitmap()Z\"/>\n\t\t<method name=\"isLinearText()Z\" deprecated=\"16\"/>\n\t\t<method name=\"isStrikeThruText()Z\"/>\n\t\t<method name=\"isSubpixelText()Z\"/>\n\t\t<method name=\"isUnderlineText()Z\"/>\n\t\t<method name=\"measureText(Ljava/lang/CharSequence;II)F\"/>\n\t\t<method name=\"measureText(Ljava/lang/String;)F\"/>\n\t\t<method name=\"measureText(Ljava/lang/String;II)F\"/>\n\t\t<method name=\"measureText([CII)F\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"set(Landroid/graphics/Paint;)V\"/>\n\t\t<method name=\"setARGB(IIII)V\"/>\n\t\t<method name=\"setAlpha(I)V\"/>\n\t\t<method name=\"setAntiAlias(Z)V\"/>\n\t\t<method name=\"setBlendMode(Landroid/graphics/BlendMode;)V\" since=\"29\"/>\n\t\t<method name=\"setColor(I)V\"/>\n\t\t<method name=\"setColor(J)V\" since=\"29\"/>\n\t\t<method name=\"setColorFilter(Landroid/graphics/ColorFilter;)Landroid/graphics/ColorFilter;\"/>\n\t\t<method name=\"setDither(Z)V\"/>\n\t\t<method name=\"setElegantTextHeight(Z)V\" since=\"21\"/>\n\t\t<method name=\"setEndHyphenEdit(I)V\" since=\"29\"/>\n\t\t<method name=\"setFakeBoldText(Z)V\"/>\n\t\t<method name=\"setFilterBitmap(Z)V\"/>\n\t\t<method name=\"setFlags(I)V\"/>\n\t\t<method name=\"setFontFeatureSettings(Ljava/lang/String;)V\" since=\"21\"/>\n\t\t<method name=\"setFontVariationSettings(Ljava/lang/String;)Z\" since=\"26\"/>\n\t\t<method name=\"setHinting(I)V\" since=\"14\"/>\n\t\t<method name=\"setLetterSpacing(F)V\" since=\"21\"/>\n\t\t<method name=\"setLinearText(Z)V\" deprecated=\"16\"/>\n\t\t<method name=\"setMaskFilter(Landroid/graphics/MaskFilter;)Landroid/graphics/MaskFilter;\"/>\n\t\t<method name=\"setPathEffect(Landroid/graphics/PathEffect;)Landroid/graphics/PathEffect;\"/>\n\t\t<method name=\"setRasterizer(Landroid/graphics/Rasterizer;)Landroid/graphics/Rasterizer;\" deprecated=\"21\" removed=\"26\"/>\n\t\t<method name=\"setShader(Landroid/graphics/Shader;)Landroid/graphics/Shader;\"/>\n\t\t<method name=\"setShadowLayer(FFFI)V\"/>\n\t\t<method name=\"setShadowLayer(FFFJ)V\" since=\"29\"/>\n\t\t<method name=\"setStartHyphenEdit(I)V\" since=\"29\"/>\n\t\t<method name=\"setStrikeThruText(Z)V\"/>\n\t\t<method name=\"setStrokeCap(Landroid/graphics/Paint$Cap;)V\"/>\n\t\t<method name=\"setStrokeJoin(Landroid/graphics/Paint$Join;)V\"/>\n\t\t<method name=\"setStrokeMiter(F)V\"/>\n\t\t<method name=\"setStrokeWidth(F)V\"/>\n\t\t<method name=\"setStyle(Landroid/graphics/Paint$Style;)V\"/>\n\t\t<method name=\"setSubpixelText(Z)V\"/>\n\t\t<method name=\"setTextAlign(Landroid/graphics/Paint$Align;)V\"/>\n\t\t<method name=\"setTextLocale(Ljava/util/Locale;)V\" since=\"17\"/>\n\t\t<method name=\"setTextLocales(Landroid/os/LocaleList;)V\" since=\"24\"/>\n\t\t<method name=\"setTextScaleX(F)V\"/>\n\t\t<method name=\"setTextSize(F)V\"/>\n\t\t<method name=\"setTextSkewX(F)V\"/>\n\t\t<method name=\"setTypeface(Landroid/graphics/Typeface;)Landroid/graphics/Typeface;\"/>\n\t\t<method name=\"setUnderlineText(Z)V\"/>\n\t\t<method name=\"setWordSpacing(F)V\" since=\"29\"/>\n\t\t<method name=\"setXfermode(Landroid/graphics/Xfermode;)Landroid/graphics/Xfermode;\"/>\n\t\t<field name=\"ANTI_ALIAS_FLAG\"/>\n\t\t<field name=\"CURSOR_AFTER\" since=\"29\"/>\n\t\t<field name=\"CURSOR_AT\" since=\"29\"/>\n\t\t<field name=\"CURSOR_AT_OR_AFTER\" since=\"29\"/>\n\t\t<field name=\"CURSOR_AT_OR_BEFORE\" since=\"29\"/>\n\t\t<field name=\"CURSOR_BEFORE\" since=\"29\"/>\n\t\t<field name=\"DEV_KERN_TEXT_FLAG\"/>\n\t\t<field name=\"DITHER_FLAG\"/>\n\t\t<field name=\"EMBEDDED_BITMAP_TEXT_FLAG\" since=\"19\"/>\n\t\t<field name=\"END_HYPHEN_EDIT_INSERT_ARMENIAN_HYPHEN\" since=\"29\"/>\n\t\t<field name=\"END_HYPHEN_EDIT_INSERT_HYPHEN\" since=\"29\"/>\n\t\t<field name=\"END_HYPHEN_EDIT_INSERT_MAQAF\" since=\"29\"/>\n\t\t<field name=\"END_HYPHEN_EDIT_INSERT_UCAS_HYPHEN\" since=\"29\"/>\n\t\t<field name=\"END_HYPHEN_EDIT_INSERT_ZWJ_AND_HYPHEN\" since=\"29\"/>\n\t\t<field name=\"END_HYPHEN_EDIT_NO_EDIT\" since=\"29\"/>\n\t\t<field name=\"END_HYPHEN_EDIT_REPLACE_WITH_HYPHEN\" since=\"29\"/>\n\t\t<field name=\"FAKE_BOLD_TEXT_FLAG\"/>\n\t\t<field name=\"FILTER_BITMAP_FLAG\"/>\n\t\t<field name=\"HINTING_OFF\" since=\"14\"/>\n\t\t<field name=\"HINTING_ON\" since=\"14\"/>\n\t\t<field name=\"LINEAR_TEXT_FLAG\"/>\n\t\t<field name=\"START_HYPHEN_EDIT_INSERT_HYPHEN\" since=\"29\"/>\n\t\t<field name=\"START_HYPHEN_EDIT_INSERT_ZWJ\" since=\"29\"/>\n\t\t<field name=\"START_HYPHEN_EDIT_NO_EDIT\" since=\"29\"/>\n\t\t<field name=\"STRIKE_THRU_TEXT_FLAG\"/>\n\t\t<field name=\"SUBPIXEL_TEXT_FLAG\"/>\n\t\t<field name=\"UNDERLINE_TEXT_FLAG\"/>\n\t</class>\n\t<class name=\"android/graphics/Paint$Align\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/Paint$Align;\"/>\n\t\t<method name=\"values()[Landroid/graphics/Paint$Align;\"/>\n\t\t<field name=\"CENTER\"/>\n\t\t<field name=\"LEFT\"/>\n\t\t<field name=\"RIGHT\"/>\n\t</class>\n\t<class name=\"android/graphics/Paint$Cap\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/Paint$Cap;\"/>\n\t\t<method name=\"values()[Landroid/graphics/Paint$Cap;\"/>\n\t\t<field name=\"BUTT\"/>\n\t\t<field name=\"ROUND\"/>\n\t\t<field name=\"SQUARE\"/>\n\t</class>\n\t<class name=\"android/graphics/Paint$FontMetrics\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"ascent\"/>\n\t\t<field name=\"bottom\"/>\n\t\t<field name=\"descent\"/>\n\t\t<field name=\"leading\"/>\n\t\t<field name=\"top\"/>\n\t</class>\n\t<class name=\"android/graphics/Paint$FontMetricsInt\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"ascent\"/>\n\t\t<field name=\"bottom\"/>\n\t\t<field name=\"descent\"/>\n\t\t<field name=\"leading\"/>\n\t\t<field name=\"top\"/>\n\t</class>\n\t<class name=\"android/graphics/Paint$Join\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/Paint$Join;\"/>\n\t\t<method name=\"values()[Landroid/graphics/Paint$Join;\"/>\n\t\t<field name=\"BEVEL\"/>\n\t\t<field name=\"MITER\"/>\n\t\t<field name=\"ROUND\"/>\n\t</class>\n\t<class name=\"android/graphics/Paint$Style\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/Paint$Style;\"/>\n\t\t<method name=\"values()[Landroid/graphics/Paint$Style;\"/>\n\t\t<field name=\"FILL\"/>\n\t\t<field name=\"FILL_AND_STROKE\"/>\n\t\t<field name=\"STROKE\"/>\n\t</class>\n\t<class name=\"android/graphics/PaintFlagsDrawFilter\" since=\"1\">\n\t\t<extends name=\"android/graphics/DrawFilter\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t</class>\n\t<class name=\"android/graphics/Path\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Path;)V\"/>\n\t\t<method name=\"addArc(FFFFFF)V\" since=\"21\"/>\n\t\t<method name=\"addArc(Landroid/graphics/RectF;FF)V\"/>\n\t\t<method name=\"addCircle(FFFLandroid/graphics/Path$Direction;)V\"/>\n\t\t<method name=\"addOval(FFFFLandroid/graphics/Path$Direction;)V\" since=\"21\"/>\n\t\t<method name=\"addOval(Landroid/graphics/RectF;Landroid/graphics/Path$Direction;)V\"/>\n\t\t<method name=\"addPath(Landroid/graphics/Path;)V\"/>\n\t\t<method name=\"addPath(Landroid/graphics/Path;FF)V\"/>\n\t\t<method name=\"addPath(Landroid/graphics/Path;Landroid/graphics/Matrix;)V\"/>\n\t\t<method name=\"addRect(FFFFLandroid/graphics/Path$Direction;)V\"/>\n\t\t<method name=\"addRect(Landroid/graphics/RectF;Landroid/graphics/Path$Direction;)V\"/>\n\t\t<method name=\"addRoundRect(FFFFFFLandroid/graphics/Path$Direction;)V\" since=\"21\"/>\n\t\t<method name=\"addRoundRect(FFFF[FLandroid/graphics/Path$Direction;)V\" since=\"21\"/>\n\t\t<method name=\"addRoundRect(Landroid/graphics/RectF;FFLandroid/graphics/Path$Direction;)V\"/>\n\t\t<method name=\"addRoundRect(Landroid/graphics/RectF;[FLandroid/graphics/Path$Direction;)V\"/>\n\t\t<method name=\"approximate(F)[F\" since=\"26\"/>\n\t\t<method name=\"arcTo(FFFFFFZ)V\" since=\"21\"/>\n\t\t<method name=\"arcTo(Landroid/graphics/RectF;FF)V\"/>\n\t\t<method name=\"arcTo(Landroid/graphics/RectF;FFZ)V\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"computeBounds(Landroid/graphics/RectF;Z)V\"/>\n\t\t<method name=\"cubicTo(FFFFFF)V\"/>\n\t\t<method name=\"getFillType()Landroid/graphics/Path$FillType;\"/>\n\t\t<method name=\"incReserve(I)V\"/>\n\t\t<method name=\"isConvex()Z\" since=\"21\"/>\n\t\t<method name=\"isEmpty()Z\"/>\n\t\t<method name=\"isInverseFillType()Z\"/>\n\t\t<method name=\"isRect(Landroid/graphics/RectF;)Z\"/>\n\t\t<method name=\"lineTo(FF)V\"/>\n\t\t<method name=\"moveTo(FF)V\"/>\n\t\t<method name=\"offset(FF)V\"/>\n\t\t<method name=\"offset(FFLandroid/graphics/Path;)V\"/>\n\t\t<method name=\"op(Landroid/graphics/Path;Landroid/graphics/Path$Op;)Z\" since=\"19\"/>\n\t\t<method name=\"op(Landroid/graphics/Path;Landroid/graphics/Path;Landroid/graphics/Path$Op;)Z\" since=\"19\"/>\n\t\t<method name=\"quadTo(FFFF)V\"/>\n\t\t<method name=\"rCubicTo(FFFFFF)V\"/>\n\t\t<method name=\"rLineTo(FF)V\"/>\n\t\t<method name=\"rMoveTo(FF)V\"/>\n\t\t<method name=\"rQuadTo(FFFF)V\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"rewind()V\"/>\n\t\t<method name=\"set(Landroid/graphics/Path;)V\"/>\n\t\t<method name=\"setFillType(Landroid/graphics/Path$FillType;)V\"/>\n\t\t<method name=\"setLastPoint(FF)V\"/>\n\t\t<method name=\"toggleInverseFillType()V\"/>\n\t\t<method name=\"transform(Landroid/graphics/Matrix;)V\"/>\n\t\t<method name=\"transform(Landroid/graphics/Matrix;Landroid/graphics/Path;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/Path$Direction\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/Path$Direction;\"/>\n\t\t<method name=\"values()[Landroid/graphics/Path$Direction;\"/>\n\t\t<field name=\"CCW\"/>\n\t\t<field name=\"CW\"/>\n\t</class>\n\t<class name=\"android/graphics/Path$FillType\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/Path$FillType;\"/>\n\t\t<method name=\"values()[Landroid/graphics/Path$FillType;\"/>\n\t\t<field name=\"EVEN_ODD\"/>\n\t\t<field name=\"INVERSE_EVEN_ODD\"/>\n\t\t<field name=\"INVERSE_WINDING\"/>\n\t\t<field name=\"WINDING\"/>\n\t</class>\n\t<class name=\"android/graphics/Path$Op\" since=\"19\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/Path$Op;\"/>\n\t\t<method name=\"values()[Landroid/graphics/Path$Op;\"/>\n\t\t<field name=\"DIFFERENCE\"/>\n\t\t<field name=\"INTERSECT\"/>\n\t\t<field name=\"REVERSE_DIFFERENCE\"/>\n\t\t<field name=\"UNION\"/>\n\t\t<field name=\"XOR\"/>\n\t</class>\n\t<class name=\"android/graphics/PathDashPathEffect\" since=\"1\">\n\t\t<extends name=\"android/graphics/PathEffect\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Path;FFLandroid/graphics/PathDashPathEffect$Style;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/PathDashPathEffect$Style\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/PathDashPathEffect$Style;\"/>\n\t\t<method name=\"values()[Landroid/graphics/PathDashPathEffect$Style;\"/>\n\t\t<field name=\"MORPH\"/>\n\t\t<field name=\"ROTATE\"/>\n\t\t<field name=\"TRANSLATE\"/>\n\t</class>\n\t<class name=\"android/graphics/PathEffect\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/graphics/PathMeasure\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Path;Z)V\"/>\n\t\t<method name=\"getLength()F\"/>\n\t\t<method name=\"getMatrix(FLandroid/graphics/Matrix;I)Z\"/>\n\t\t<method name=\"getPosTan(F[F[F)Z\"/>\n\t\t<method name=\"getSegment(FFLandroid/graphics/Path;Z)Z\"/>\n\t\t<method name=\"isClosed()Z\"/>\n\t\t<method name=\"nextContour()Z\"/>\n\t\t<method name=\"setPath(Landroid/graphics/Path;Z)V\"/>\n\t\t<field name=\"POSITION_MATRIX_FLAG\"/>\n\t\t<field name=\"TANGENT_MATRIX_FLAG\"/>\n\t</class>\n\t<class name=\"android/graphics/Picture\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Picture;)V\"/>\n\t\t<method name=\"beginRecording(II)Landroid/graphics/Canvas;\"/>\n\t\t<method name=\"createFromStream(Ljava/io/InputStream;)Landroid/graphics/Picture;\" deprecated=\"18\" removed=\"29\"/>\n\t\t<method name=\"draw(Landroid/graphics/Canvas;)V\"/>\n\t\t<method name=\"endRecording()V\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t\t<method name=\"requiresHardwareAcceleration()Z\" since=\"28\"/>\n\t\t<method name=\"writeToStream(Ljava/io/OutputStream;)V\" deprecated=\"18\" removed=\"29\"/>\n\t</class>\n\t<class name=\"android/graphics/PixelFormat\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"formatHasAlpha(I)Z\"/>\n\t\t<method name=\"getPixelFormatInfo(ILandroid/graphics/PixelFormat;)V\"/>\n\t\t<field name=\"A_8\" deprecated=\"19\"/>\n\t\t<field name=\"JPEG\" deprecated=\"15\"/>\n\t\t<field name=\"LA_88\" deprecated=\"16\"/>\n\t\t<field name=\"L_8\" deprecated=\"19\"/>\n\t\t<field name=\"OPAQUE\"/>\n\t\t<field name=\"RGBA_1010102\" since=\"26\"/>\n\t\t<field name=\"RGBA_4444\" deprecated=\"16\"/>\n\t\t<field name=\"RGBA_5551\" deprecated=\"16\"/>\n\t\t<field name=\"RGBA_8888\"/>\n\t\t<field name=\"RGBA_F16\" since=\"26\"/>\n\t\t<field name=\"RGBX_8888\"/>\n\t\t<field name=\"RGB_332\" deprecated=\"16\"/>\n\t\t<field name=\"RGB_565\"/>\n\t\t<field name=\"RGB_888\"/>\n\t\t<field name=\"TRANSLUCENT\"/>\n\t\t<field name=\"TRANSPARENT\"/>\n\t\t<field name=\"UNKNOWN\"/>\n\t\t<field name=\"YCbCr_420_SP\" deprecated=\"15\"/>\n\t\t<field name=\"YCbCr_422_I\" since=\"5\" deprecated=\"15\"/>\n\t\t<field name=\"YCbCr_422_SP\" deprecated=\"15\"/>\n\t\t<field name=\"bitsPerPixel\"/>\n\t\t<field name=\"bytesPerPixel\"/>\n\t</class>\n\t<class name=\"android/graphics/PixelXorXfermode\" since=\"1\" deprecated=\"16\" removed=\"24\">\n\t\t<extends name=\"android/graphics/Xfermode\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t</class>\n\t<class name=\"android/graphics/Point\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\" since=\"13\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Point;)V\"/>\n\t\t<method name=\"equals(II)Z\"/>\n\t\t<method name=\"negate()V\"/>\n\t\t<method name=\"offset(II)V\"/>\n\t\t<method name=\"readFromParcel(Landroid/os/Parcel;)V\" since=\"13\"/>\n\t\t<method name=\"set(II)V\"/>\n\t\t<field name=\"CREATOR\" since=\"13\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t</class>\n\t<class name=\"android/graphics/PointF\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\" since=\"13\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(FF)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Point;)V\"/>\n\t\t<method name=\"equals(FF)Z\"/>\n\t\t<method name=\"length()F\"/>\n\t\t<method name=\"length(FF)F\"/>\n\t\t<method name=\"negate()V\"/>\n\t\t<method name=\"offset(FF)V\"/>\n\t\t<method name=\"readFromParcel(Landroid/os/Parcel;)V\" since=\"13\"/>\n\t\t<method name=\"set(FF)V\"/>\n\t\t<method name=\"set(Landroid/graphics/PointF;)V\"/>\n\t\t<field name=\"CREATOR\" since=\"13\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t</class>\n\t<class name=\"android/graphics/PorterDuff\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/graphics/PorterDuff$Mode\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/PorterDuff$Mode;\"/>\n\t\t<method name=\"values()[Landroid/graphics/PorterDuff$Mode;\"/>\n\t\t<field name=\"ADD\" since=\"11\"/>\n\t\t<field name=\"CLEAR\"/>\n\t\t<field name=\"DARKEN\"/>\n\t\t<field name=\"DST\"/>\n\t\t<field name=\"DST_ATOP\"/>\n\t\t<field name=\"DST_IN\"/>\n\t\t<field name=\"DST_OUT\"/>\n\t\t<field name=\"DST_OVER\"/>\n\t\t<field name=\"LIGHTEN\"/>\n\t\t<field name=\"MULTIPLY\"/>\n\t\t<field name=\"OVERLAY\" since=\"11\"/>\n\t\t<field name=\"SCREEN\"/>\n\t\t<field name=\"SRC\"/>\n\t\t<field name=\"SRC_ATOP\"/>\n\t\t<field name=\"SRC_IN\"/>\n\t\t<field name=\"SRC_OUT\"/>\n\t\t<field name=\"SRC_OVER\"/>\n\t\t<field name=\"XOR\"/>\n\t</class>\n\t<class name=\"android/graphics/PorterDuffColorFilter\" since=\"1\">\n\t\t<extends name=\"android/graphics/ColorFilter\"/>\n\t\t<method name=\"&lt;init>(ILandroid/graphics/PorterDuff$Mode;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/PorterDuffXfermode\" since=\"1\">\n\t\t<extends name=\"android/graphics/Xfermode\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/PorterDuff$Mode;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/PostProcessor\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onPostProcess(Landroid/graphics/Canvas;)I\"/>\n\t</class>\n\t<class name=\"android/graphics/RadialGradient\" since=\"1\">\n\t\t<extends name=\"android/graphics/Shader\"/>\n\t\t<method name=\"&lt;init>(FFFIILandroid/graphics/Shader$TileMode;)V\"/>\n\t\t<method name=\"&lt;init>(FFFJJLandroid/graphics/Shader$TileMode;)V\" since=\"29\"/>\n\t\t<method name=\"&lt;init>(FFF[I[FLandroid/graphics/Shader$TileMode;)V\"/>\n\t\t<method name=\"&lt;init>(FFF[J[FLandroid/graphics/Shader$TileMode;)V\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/graphics/Rasterizer\" since=\"1\" deprecated=\"21\" removed=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/graphics/RecordingCanvas\" since=\"29\">\n\t\t<extends name=\"android/graphics/Canvas\"/>\n\t\t<method name=\"drawPatch(Landroid/graphics/NinePatch;Landroid/graphics/Rect;Landroid/graphics/Paint;)V\"/>\n\t\t<method name=\"drawPatch(Landroid/graphics/NinePatch;Landroid/graphics/RectF;Landroid/graphics/Paint;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/Rect\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(IIII)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"centerX()I\"/>\n\t\t<method name=\"centerY()I\"/>\n\t\t<method name=\"contains(II)Z\"/>\n\t\t<method name=\"contains(IIII)Z\"/>\n\t\t<method name=\"contains(Landroid/graphics/Rect;)Z\"/>\n\t\t<method name=\"exactCenterX()F\"/>\n\t\t<method name=\"exactCenterY()F\"/>\n\t\t<method name=\"flattenToString()Ljava/lang/String;\" since=\"7\"/>\n\t\t<method name=\"height()I\"/>\n\t\t<method name=\"inset(II)V\"/>\n\t\t<method name=\"intersect(IIII)Z\"/>\n\t\t<method name=\"intersect(Landroid/graphics/Rect;)Z\"/>\n\t\t<method name=\"intersects(IIII)Z\"/>\n\t\t<method name=\"intersects(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z\"/>\n\t\t<method name=\"isEmpty()Z\"/>\n\t\t<method name=\"offset(II)V\"/>\n\t\t<method name=\"offsetTo(II)V\"/>\n\t\t<method name=\"readFromParcel(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"set(IIII)V\"/>\n\t\t<method name=\"set(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"setEmpty()V\"/>\n\t\t<method name=\"setIntersect(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z\"/>\n\t\t<method name=\"sort()V\"/>\n\t\t<method name=\"toShortString()Ljava/lang/String;\" since=\"3\"/>\n\t\t<method name=\"unflattenFromString(Ljava/lang/String;)Landroid/graphics/Rect;\" since=\"7\"/>\n\t\t<method name=\"union(II)V\"/>\n\t\t<method name=\"union(IIII)V\"/>\n\t\t<method name=\"union(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"width()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"bottom\"/>\n\t\t<field name=\"left\"/>\n\t\t<field name=\"right\"/>\n\t\t<field name=\"top\"/>\n\t</class>\n\t<class name=\"android/graphics/RectF\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\" since=\"3\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(FFFF)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/RectF;)V\"/>\n\t\t<method name=\"centerX()F\"/>\n\t\t<method name=\"centerY()F\"/>\n\t\t<method name=\"contains(FF)Z\"/>\n\t\t<method name=\"contains(FFFF)Z\"/>\n\t\t<method name=\"contains(Landroid/graphics/RectF;)Z\"/>\n\t\t<method name=\"height()F\"/>\n\t\t<method name=\"inset(FF)V\"/>\n\t\t<method name=\"intersect(FFFF)Z\"/>\n\t\t<method name=\"intersect(Landroid/graphics/RectF;)Z\"/>\n\t\t<method name=\"intersects(FFFF)Z\"/>\n\t\t<method name=\"intersects(Landroid/graphics/RectF;Landroid/graphics/RectF;)Z\"/>\n\t\t<method name=\"isEmpty()Z\"/>\n\t\t<method name=\"offset(FF)V\"/>\n\t\t<method name=\"offsetTo(FF)V\"/>\n\t\t<method name=\"readFromParcel(Landroid/os/Parcel;)V\" since=\"3\"/>\n\t\t<method name=\"round(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"roundOut(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"set(FFFF)V\"/>\n\t\t<method name=\"set(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"set(Landroid/graphics/RectF;)V\"/>\n\t\t<method name=\"setEmpty()V\"/>\n\t\t<method name=\"setIntersect(Landroid/graphics/RectF;Landroid/graphics/RectF;)Z\"/>\n\t\t<method name=\"sort()V\"/>\n\t\t<method name=\"toShortString()Ljava/lang/String;\" since=\"14\"/>\n\t\t<method name=\"union(FF)V\"/>\n\t\t<method name=\"union(FFFF)V\"/>\n\t\t<method name=\"union(Landroid/graphics/RectF;)V\"/>\n\t\t<method name=\"width()F\"/>\n\t\t<field name=\"CREATOR\" since=\"3\"/>\n\t\t<field name=\"bottom\"/>\n\t\t<field name=\"left\"/>\n\t\t<field name=\"right\"/>\n\t\t<field name=\"top\"/>\n\t</class>\n\t<class name=\"android/graphics/Region\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(IIII)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Region;)V\"/>\n\t\t<method name=\"contains(II)Z\"/>\n\t\t<method name=\"getBoundaryPath()Landroid/graphics/Path;\"/>\n\t\t<method name=\"getBoundaryPath(Landroid/graphics/Path;)Z\"/>\n\t\t<method name=\"getBounds()Landroid/graphics/Rect;\"/>\n\t\t<method name=\"getBounds(Landroid/graphics/Rect;)Z\"/>\n\t\t<method name=\"isComplex()Z\"/>\n\t\t<method name=\"isEmpty()Z\"/>\n\t\t<method name=\"isRect()Z\"/>\n\t\t<method name=\"op(IIIILandroid/graphics/Region$Op;)Z\"/>\n\t\t<method name=\"op(Landroid/graphics/Rect;Landroid/graphics/Region$Op;)Z\"/>\n\t\t<method name=\"op(Landroid/graphics/Rect;Landroid/graphics/Region;Landroid/graphics/Region$Op;)Z\"/>\n\t\t<method name=\"op(Landroid/graphics/Region;Landroid/graphics/Region$Op;)Z\"/>\n\t\t<method name=\"op(Landroid/graphics/Region;Landroid/graphics/Region;Landroid/graphics/Region$Op;)Z\"/>\n\t\t<method name=\"quickContains(IIII)Z\"/>\n\t\t<method name=\"quickContains(Landroid/graphics/Rect;)Z\"/>\n\t\t<method name=\"quickReject(IIII)Z\"/>\n\t\t<method name=\"quickReject(Landroid/graphics/Rect;)Z\"/>\n\t\t<method name=\"quickReject(Landroid/graphics/Region;)Z\"/>\n\t\t<method name=\"set(IIII)Z\"/>\n\t\t<method name=\"set(Landroid/graphics/Rect;)Z\"/>\n\t\t<method name=\"set(Landroid/graphics/Region;)Z\"/>\n\t\t<method name=\"setEmpty()V\"/>\n\t\t<method name=\"setPath(Landroid/graphics/Path;Landroid/graphics/Region;)Z\"/>\n\t\t<method name=\"translate(II)V\"/>\n\t\t<method name=\"translate(IILandroid/graphics/Region;)V\"/>\n\t\t<method name=\"union(Landroid/graphics/Rect;)Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/graphics/Region$Op\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/Region$Op;\"/>\n\t\t<method name=\"values()[Landroid/graphics/Region$Op;\"/>\n\t\t<field name=\"DIFFERENCE\"/>\n\t\t<field name=\"INTERSECT\"/>\n\t\t<field name=\"REPLACE\"/>\n\t\t<field name=\"REVERSE_DIFFERENCE\"/>\n\t\t<field name=\"UNION\"/>\n\t\t<field name=\"XOR\"/>\n\t</class>\n\t<class name=\"android/graphics/RegionIterator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Region;)V\"/>\n\t\t<method name=\"next(Landroid/graphics/Rect;)Z\"/>\n\t</class>\n\t<class name=\"android/graphics/RenderNode\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"beginRecording()Landroid/graphics/RecordingCanvas;\"/>\n\t\t<method name=\"beginRecording(II)Landroid/graphics/RecordingCanvas;\"/>\n\t\t<method name=\"computeApproximateMemoryUsage()J\"/>\n\t\t<method name=\"discardDisplayList()V\"/>\n\t\t<method name=\"endRecording()V\"/>\n\t\t<method name=\"getAlpha()F\"/>\n\t\t<method name=\"getAmbientShadowColor()I\"/>\n\t\t<method name=\"getBottom()I\"/>\n\t\t<method name=\"getCameraDistance()F\"/>\n\t\t<method name=\"getClipToBounds()Z\"/>\n\t\t<method name=\"getClipToOutline()Z\"/>\n\t\t<method name=\"getElevation()F\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getInverseMatrix(Landroid/graphics/Matrix;)V\"/>\n\t\t<method name=\"getLeft()I\"/>\n\t\t<method name=\"getMatrix(Landroid/graphics/Matrix;)V\"/>\n\t\t<method name=\"getPivotX()F\"/>\n\t\t<method name=\"getPivotY()F\"/>\n\t\t<method name=\"getRight()I\"/>\n\t\t<method name=\"getRotationX()F\"/>\n\t\t<method name=\"getRotationY()F\"/>\n\t\t<method name=\"getRotationZ()F\"/>\n\t\t<method name=\"getScaleX()F\"/>\n\t\t<method name=\"getScaleY()F\"/>\n\t\t<method name=\"getSpotShadowColor()I\"/>\n\t\t<method name=\"getTop()I\"/>\n\t\t<method name=\"getTranslationX()F\"/>\n\t\t<method name=\"getTranslationY()F\"/>\n\t\t<method name=\"getTranslationZ()F\"/>\n\t\t<method name=\"getUniqueId()J\"/>\n\t\t<method name=\"getUseCompositingLayer()Z\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t\t<method name=\"hasDisplayList()Z\"/>\n\t\t<method name=\"hasIdentityMatrix()Z\"/>\n\t\t<method name=\"hasOverlappingRendering()Z\"/>\n\t\t<method name=\"hasShadow()Z\"/>\n\t\t<method name=\"isForceDarkAllowed()Z\"/>\n\t\t<method name=\"isPivotExplicitlySet()Z\"/>\n\t\t<method name=\"offsetLeftAndRight(I)Z\"/>\n\t\t<method name=\"offsetTopAndBottom(I)Z\"/>\n\t\t<method name=\"resetPivot()Z\"/>\n\t\t<method name=\"setAlpha(F)Z\"/>\n\t\t<method name=\"setAmbientShadowColor(I)Z\"/>\n\t\t<method name=\"setCameraDistance(F)Z\"/>\n\t\t<method name=\"setClipRect(Landroid/graphics/Rect;)Z\"/>\n\t\t<method name=\"setClipToBounds(Z)Z\"/>\n\t\t<method name=\"setClipToOutline(Z)Z\"/>\n\t\t<method name=\"setElevation(F)Z\"/>\n\t\t<method name=\"setForceDarkAllowed(Z)Z\"/>\n\t\t<method name=\"setHasOverlappingRendering(Z)Z\"/>\n\t\t<method name=\"setOutline(Landroid/graphics/Outline;)Z\"/>\n\t\t<method name=\"setPivotX(F)Z\"/>\n\t\t<method name=\"setPivotY(F)Z\"/>\n\t\t<method name=\"setPosition(IIII)Z\"/>\n\t\t<method name=\"setPosition(Landroid/graphics/Rect;)Z\"/>\n\t\t<method name=\"setProjectBackwards(Z)Z\"/>\n\t\t<method name=\"setProjectionReceiver(Z)Z\"/>\n\t\t<method name=\"setRotationX(F)Z\"/>\n\t\t<method name=\"setRotationY(F)Z\"/>\n\t\t<method name=\"setRotationZ(F)Z\"/>\n\t\t<method name=\"setScaleX(F)Z\"/>\n\t\t<method name=\"setScaleY(F)Z\"/>\n\t\t<method name=\"setSpotShadowColor(I)Z\"/>\n\t\t<method name=\"setTranslationX(F)Z\"/>\n\t\t<method name=\"setTranslationY(F)Z\"/>\n\t\t<method name=\"setTranslationZ(F)Z\"/>\n\t\t<method name=\"setUseCompositingLayer(ZLandroid/graphics/Paint;)Z\"/>\n\t</class>\n\t<class name=\"android/graphics/Shader\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"26\"/>\n\t\t<method name=\"getLocalMatrix(Landroid/graphics/Matrix;)Z\"/>\n\t\t<method name=\"setLocalMatrix(Landroid/graphics/Matrix;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/Shader$TileMode\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/Shader$TileMode;\"/>\n\t\t<method name=\"values()[Landroid/graphics/Shader$TileMode;\"/>\n\t\t<field name=\"CLAMP\"/>\n\t\t<field name=\"MIRROR\"/>\n\t\t<field name=\"REPEAT\"/>\n\t</class>\n\t<class name=\"android/graphics/SumPathEffect\" since=\"1\">\n\t\t<extends name=\"android/graphics/PathEffect\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/PathEffect;Landroid/graphics/PathEffect;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/SurfaceTexture\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(IZ)V\" since=\"19\"/>\n\t\t<method name=\"&lt;init>(Z)V\" since=\"26\"/>\n\t\t<method name=\"attachToGLContext(I)V\" since=\"16\"/>\n\t\t<method name=\"detachFromGLContext()V\" since=\"16\"/>\n\t\t<method name=\"getTimestamp()J\" since=\"14\"/>\n\t\t<method name=\"getTransformMatrix([F)V\"/>\n\t\t<method name=\"isReleased()Z\" since=\"26\"/>\n\t\t<method name=\"release()V\" since=\"14\"/>\n\t\t<method name=\"releaseTexImage()V\" since=\"19\"/>\n\t\t<method name=\"setDefaultBufferSize(II)V\" since=\"15\"/>\n\t\t<method name=\"setOnFrameAvailableListener(Landroid/graphics/SurfaceTexture$OnFrameAvailableListener;)V\"/>\n\t\t<method name=\"setOnFrameAvailableListener(Landroid/graphics/SurfaceTexture$OnFrameAvailableListener;Landroid/os/Handler;)V\" since=\"21\"/>\n\t\t<method name=\"updateTexImage()V\"/>\n\t</class>\n\t<class name=\"android/graphics/SurfaceTexture$OnFrameAvailableListener\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onFrameAvailable(Landroid/graphics/SurfaceTexture;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/SurfaceTexture$OutOfResourcesException\" since=\"11\" deprecated=\"19\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/graphics/SweepGradient\" since=\"1\">\n\t\t<extends name=\"android/graphics/Shader\"/>\n\t\t<method name=\"&lt;init>(FFII)V\"/>\n\t\t<method name=\"&lt;init>(FFJJ)V\" since=\"29\"/>\n\t\t<method name=\"&lt;init>(FF[I[F)V\"/>\n\t\t<method name=\"&lt;init>(FF[J[F)V\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/graphics/Typeface\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"create(Landroid/graphics/Typeface;I)Landroid/graphics/Typeface;\"/>\n\t\t<method name=\"create(Landroid/graphics/Typeface;IZ)Landroid/graphics/Typeface;\" since=\"28\"/>\n\t\t<method name=\"create(Ljava/lang/String;I)Landroid/graphics/Typeface;\"/>\n\t\t<method name=\"createFromAsset(Landroid/content/res/AssetManager;Ljava/lang/String;)Landroid/graphics/Typeface;\"/>\n\t\t<method name=\"createFromFile(Ljava/io/File;)Landroid/graphics/Typeface;\" since=\"4\"/>\n\t\t<method name=\"createFromFile(Ljava/lang/String;)Landroid/graphics/Typeface;\" since=\"4\"/>\n\t\t<method name=\"defaultFromStyle(I)Landroid/graphics/Typeface;\"/>\n\t\t<method name=\"getStyle()I\"/>\n\t\t<method name=\"getWeight()I\" since=\"28\"/>\n\t\t<method name=\"isBold()Z\"/>\n\t\t<method name=\"isItalic()Z\"/>\n\t\t<field name=\"BOLD\"/>\n\t\t<field name=\"BOLD_ITALIC\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t\t<field name=\"DEFAULT_BOLD\"/>\n\t\t<field name=\"ITALIC\"/>\n\t\t<field name=\"MONOSPACE\"/>\n\t\t<field name=\"NORMAL\"/>\n\t\t<field name=\"SANS_SERIF\"/>\n\t\t<field name=\"SERIF\"/>\n\t</class>\n\t<class name=\"android/graphics/Typeface$Builder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/res/AssetManager;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/FileDescriptor;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"build()Landroid/graphics/Typeface;\"/>\n\t\t<method name=\"setFallback(Ljava/lang/String;)Landroid/graphics/Typeface$Builder;\"/>\n\t\t<method name=\"setFontVariationSettings(Ljava/lang/String;)Landroid/graphics/Typeface$Builder;\"/>\n\t\t<method name=\"setFontVariationSettings([Landroid/graphics/fonts/FontVariationAxis;)Landroid/graphics/Typeface$Builder;\"/>\n\t\t<method name=\"setItalic(Z)Landroid/graphics/Typeface$Builder;\"/>\n\t\t<method name=\"setTtcIndex(I)Landroid/graphics/Typeface$Builder;\"/>\n\t\t<method name=\"setWeight(I)Landroid/graphics/Typeface$Builder;\"/>\n\t</class>\n\t<class name=\"android/graphics/Typeface$CustomFallbackBuilder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/fonts/FontFamily;)V\"/>\n\t\t<method name=\"addCustomFallback(Landroid/graphics/fonts/FontFamily;)Landroid/graphics/Typeface$CustomFallbackBuilder;\"/>\n\t\t<method name=\"build()Landroid/graphics/Typeface;\"/>\n\t\t<method name=\"getMaxCustomFallbackCount()I\"/>\n\t\t<method name=\"setStyle(Landroid/graphics/fonts/FontStyle;)Landroid/graphics/Typeface$CustomFallbackBuilder;\"/>\n\t\t<method name=\"setSystemFallback(Ljava/lang/String;)Landroid/graphics/Typeface$CustomFallbackBuilder;\"/>\n\t</class>\n\t<class name=\"android/graphics/Xfermode\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/graphics/YuvImage\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>([BIII[I)V\"/>\n\t\t<method name=\"compressToJpeg(Landroid/graphics/Rect;ILjava/io/OutputStream;)Z\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getStrides()[I\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t\t<method name=\"getYuvData()[B\"/>\n\t\t<method name=\"getYuvFormat()I\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/AdaptiveIconDrawable\" since=\"26\">\n\t\t<extends name=\"android/graphics/drawable/Drawable\"/>\n\t\t<implements name=\"android/graphics/drawable/Drawable$Callback\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"getBackground()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getExtraInsetFraction()F\"/>\n\t\t<method name=\"getForeground()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getIconMask()Landroid/graphics/Path;\"/>\n\t\t<method name=\"setOpacity(I)V\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/Animatable\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"isRunning()Z\"/>\n\t\t<method name=\"start()V\"/>\n\t\t<method name=\"stop()V\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/Animatable2\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/graphics/drawable/Animatable\"/>\n\t\t<method name=\"clearAnimationCallbacks()V\"/>\n\t\t<method name=\"registerAnimationCallback(Landroid/graphics/drawable/Animatable2$AnimationCallback;)V\"/>\n\t\t<method name=\"unregisterAnimationCallback(Landroid/graphics/drawable/Animatable2$AnimationCallback;)Z\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/Animatable2$AnimationCallback\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onAnimationEnd(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"onAnimationStart(Landroid/graphics/drawable/Drawable;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/AnimatedImageDrawable\" since=\"28\">\n\t\t<extends name=\"android/graphics/drawable/Drawable\"/>\n\t\t<implements name=\"android/graphics/drawable/Animatable2\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getRepeatCount()I\"/>\n\t\t<method name=\"setRepeatCount(I)V\"/>\n\t\t<field name=\"REPEAT_INFINITE\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/AnimatedStateListDrawable\" since=\"21\">\n\t\t<extends name=\"android/graphics/drawable/StateListDrawable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addState([ILandroid/graphics/drawable/Drawable;I)V\"/>\n\t\t<method name=\"addTransition(IILandroid/graphics/drawable/Drawable;Z)V\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/AnimatedVectorDrawable\" since=\"21\">\n\t\t<extends name=\"android/graphics/drawable/Drawable\"/>\n\t\t<implements name=\"android/graphics/drawable/Animatable\" removed=\"23\"/>\n\t\t<implements name=\"android/graphics/drawable/Animatable2\" since=\"23\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"reset()V\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/AnimationDrawable\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/DrawableContainer\"/>\n\t\t<implements name=\"android/graphics/drawable/Animatable\" since=\"4\"/>\n\t\t<implements name=\"java/lang/Runnable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addFrame(Landroid/graphics/drawable/Drawable;I)V\"/>\n\t\t<method name=\"getDuration(I)I\"/>\n\t\t<method name=\"getFrame(I)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getNumberOfFrames()I\"/>\n\t\t<method name=\"isOneShot()Z\"/>\n\t\t<method name=\"isRunning()Z\"/>\n\t\t<method name=\"setOneShot(Z)V\"/>\n\t\t<method name=\"start()V\"/>\n\t\t<method name=\"stop()V\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/BitmapDrawable\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/Drawable\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/res/Resources;)V\" since=\"4\" deprecated=\"18\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/res/Resources;Landroid/graphics/Bitmap;)V\" since=\"4\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/res/Resources;Ljava/io/InputStream;)V\" since=\"5\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/res/Resources;Ljava/lang/String;)V\" since=\"5\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Bitmap;)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" deprecated=\"15\"/>\n\t\t<method name=\"getBitmap()Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"getGravity()I\"/>\n\t\t<method name=\"getPaint()Landroid/graphics/Paint;\"/>\n\t\t<method name=\"getTileModeX()Landroid/graphics/Shader$TileMode;\"/>\n\t\t<method name=\"getTileModeY()Landroid/graphics/Shader$TileMode;\"/>\n\t\t<method name=\"hasAntiAlias()Z\" since=\"18\"/>\n\t\t<method name=\"hasMipMap()Z\" since=\"18\"/>\n\t\t<method name=\"setAntiAlias(Z)V\"/>\n\t\t<method name=\"setGravity(I)V\"/>\n\t\t<method name=\"setMipMap(Z)V\" since=\"18\"/>\n\t\t<method name=\"setTargetDensity(I)V\" since=\"4\"/>\n\t\t<method name=\"setTargetDensity(Landroid/graphics/Canvas;)V\" since=\"4\"/>\n\t\t<method name=\"setTargetDensity(Landroid/util/DisplayMetrics;)V\" since=\"4\"/>\n\t\t<method name=\"setTileModeX(Landroid/graphics/Shader$TileMode;)V\"/>\n\t\t<method name=\"setTileModeXY(Landroid/graphics/Shader$TileMode;Landroid/graphics/Shader$TileMode;)V\"/>\n\t\t<method name=\"setTileModeY(Landroid/graphics/Shader$TileMode;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/ClipDrawable\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/Drawable\" removed=\"23\"/>\n\t\t<extends name=\"android/graphics/drawable/DrawableWrapper\" since=\"23\"/>\n\t\t<implements name=\"android/graphics/drawable/Drawable$Callback\" removed=\"23\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/drawable/Drawable;II)V\"/>\n\t\t<field name=\"HORIZONTAL\"/>\n\t\t<field name=\"VERTICAL\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/ColorDrawable\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/Drawable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"getAlpha()I\"/>\n\t\t<method name=\"getColor()I\" since=\"11\"/>\n\t\t<method name=\"setColor(I)V\" since=\"11\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/ColorStateListDrawable\" since=\"29\">\n\t\t<extends name=\"android/graphics/drawable/Drawable\"/>\n\t\t<implements name=\"android/graphics/drawable/Drawable$Callback\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/res/ColorStateList;)V\"/>\n\t\t<method name=\"clearAlpha()V\"/>\n\t\t<method name=\"getColorStateList()Landroid/content/res/ColorStateList;\"/>\n\t\t<method name=\"hasFocusStateSpecified()Z\"/>\n\t\t<method name=\"setColorStateList(Landroid/content/res/ColorStateList;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/Drawable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"applyTheme(Landroid/content/res/Resources$Theme;)V\" since=\"21\"/>\n\t\t<method name=\"canApplyTheme()Z\" since=\"21\"/>\n\t\t<method name=\"clearColorFilter()V\"/>\n\t\t<method name=\"copyBounds()Landroid/graphics/Rect;\"/>\n\t\t<method name=\"copyBounds(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"createFromPath(Ljava/lang/String;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"createFromResourceStream(Landroid/content/res/Resources;Landroid/util/TypedValue;Ljava/io/InputStream;Ljava/lang/String;)Landroid/graphics/drawable/Drawable;\" since=\"4\"/>\n\t\t<method name=\"createFromResourceStream(Landroid/content/res/Resources;Landroid/util/TypedValue;Ljava/io/InputStream;Ljava/lang/String;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/drawable/Drawable;\" since=\"5\" deprecated=\"28\"/>\n\t\t<method name=\"createFromStream(Ljava/io/InputStream;Ljava/lang/String;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"createFromXml(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"createFromXml(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;\" since=\"21\"/>\n\t\t<method name=\"createFromXmlInner(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"createFromXmlInner(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;\" since=\"21\"/>\n\t\t<method name=\"draw(Landroid/graphics/Canvas;)V\"/>\n\t\t<method name=\"getAlpha()I\" since=\"19\"/>\n\t\t<method name=\"getBounds()Landroid/graphics/Rect;\"/>\n\t\t<method name=\"getCallback()Landroid/graphics/drawable/Drawable$Callback;\" since=\"11\"/>\n\t\t<method name=\"getChangingConfigurations()I\"/>\n\t\t<method name=\"getColorFilter()Landroid/graphics/ColorFilter;\" since=\"21\"/>\n\t\t<method name=\"getConstantState()Landroid/graphics/drawable/Drawable$ConstantState;\"/>\n\t\t<method name=\"getCurrent()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getDirtyBounds()Landroid/graphics/Rect;\" since=\"21\"/>\n\t\t<method name=\"getHotspotBounds(Landroid/graphics/Rect;)V\" since=\"23\"/>\n\t\t<method name=\"getIntrinsicHeight()I\"/>\n\t\t<method name=\"getIntrinsicWidth()I\"/>\n\t\t<method name=\"getLayoutDirection()I\" since=\"23\"/>\n\t\t<method name=\"getLevel()I\"/>\n\t\t<method name=\"getMinimumHeight()I\"/>\n\t\t<method name=\"getMinimumWidth()I\"/>\n\t\t<method name=\"getOpacity()I\" deprecated=\"29\"/>\n\t\t<method name=\"getOpticalInsets()Landroid/graphics/Insets;\" since=\"29\"/>\n\t\t<method name=\"getOutline(Landroid/graphics/Outline;)V\" since=\"21\"/>\n\t\t<method name=\"getPadding(Landroid/graphics/Rect;)Z\"/>\n\t\t<method name=\"getState()[I\"/>\n\t\t<method name=\"getTransparentRegion()Landroid/graphics/Region;\"/>\n\t\t<method name=\"inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V\" since=\"21\"/>\n\t\t<method name=\"invalidateSelf()V\"/>\n\t\t<method name=\"isAutoMirrored()Z\" since=\"19\"/>\n\t\t<method name=\"isFilterBitmap()Z\" since=\"23\"/>\n\t\t<method name=\"isProjected()Z\" since=\"29\"/>\n\t\t<method name=\"isStateful()Z\"/>\n\t\t<method name=\"isVisible()Z\"/>\n\t\t<method name=\"jumpToCurrentState()V\" since=\"11\"/>\n\t\t<method name=\"mutate()Landroid/graphics/drawable/Drawable;\" since=\"3\"/>\n\t\t<method name=\"onBoundsChange(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"onLayoutDirectionChanged(I)Z\" since=\"23\"/>\n\t\t<method name=\"onLevelChange(I)Z\"/>\n\t\t<method name=\"onStateChange([I)Z\"/>\n\t\t<method name=\"resolveOpacity(II)I\"/>\n\t\t<method name=\"scheduleSelf(Ljava/lang/Runnable;J)V\"/>\n\t\t<method name=\"setAlpha(I)V\"/>\n\t\t<method name=\"setAutoMirrored(Z)V\" since=\"19\"/>\n\t\t<method name=\"setBounds(IIII)V\"/>\n\t\t<method name=\"setBounds(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"setCallback(Landroid/graphics/drawable/Drawable$Callback;)V\"/>\n\t\t<method name=\"setChangingConfigurations(I)V\"/>\n\t\t<method name=\"setColorFilter(ILandroid/graphics/PorterDuff$Mode;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setColorFilter(Landroid/graphics/ColorFilter;)V\"/>\n\t\t<method name=\"setDither(Z)V\" deprecated=\"23\"/>\n\t\t<method name=\"setFilterBitmap(Z)V\"/>\n\t\t<method name=\"setHotspot(FF)V\" since=\"21\"/>\n\t\t<method name=\"setHotspotBounds(IIII)V\" since=\"21\"/>\n\t\t<method name=\"setLayoutDirection(I)Z\" since=\"23\"/>\n\t\t<method name=\"setLevel(I)Z\"/>\n\t\t<method name=\"setState([I)Z\"/>\n\t\t<method name=\"setTint(I)V\" since=\"21\"/>\n\t\t<method name=\"setTintBlendMode(Landroid/graphics/BlendMode;)V\" since=\"29\"/>\n\t\t<method name=\"setTintList(Landroid/content/res/ColorStateList;)V\" since=\"21\"/>\n\t\t<method name=\"setTintMode(Landroid/graphics/PorterDuff$Mode;)V\" since=\"21\"/>\n\t\t<method name=\"setVisible(ZZ)Z\"/>\n\t\t<method name=\"unscheduleSelf(Ljava/lang/Runnable;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/Drawable$Callback\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"invalidateDrawable(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"scheduleDrawable(Landroid/graphics/drawable/Drawable;Ljava/lang/Runnable;J)V\"/>\n\t\t<method name=\"unscheduleDrawable(Landroid/graphics/drawable/Drawable;Ljava/lang/Runnable;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/Drawable$ConstantState\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"canApplyTheme()Z\" since=\"21\"/>\n\t\t<method name=\"getChangingConfigurations()I\"/>\n\t\t<method name=\"newDrawable()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;\" since=\"5\"/>\n\t\t<method name=\"newDrawable(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/DrawableContainer\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/Drawable\"/>\n\t\t<implements name=\"android/graphics/drawable/Drawable$Callback\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"selectDrawable(I)Z\"/>\n\t\t<method name=\"setConstantState(Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;)V\"/>\n\t\t<method name=\"setEnterFadeDuration(I)V\" since=\"11\"/>\n\t\t<method name=\"setExitFadeDuration(I)V\" since=\"11\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/DrawableContainer$DrawableContainerState\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/Drawable$ConstantState\"/>\n\t\t<method name=\"addChild(Landroid/graphics/drawable/Drawable;)I\"/>\n\t\t<method name=\"canConstantState()Z\"/>\n\t\t<method name=\"computeConstantSize()V\" since=\"11\"/>\n\t\t<method name=\"getChild(I)Landroid/graphics/drawable/Drawable;\" since=\"19\"/>\n\t\t<method name=\"getChildCount()I\"/>\n\t\t<method name=\"getChildren()[Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getConstantHeight()I\"/>\n\t\t<method name=\"getConstantMinimumHeight()I\"/>\n\t\t<method name=\"getConstantMinimumWidth()I\"/>\n\t\t<method name=\"getConstantPadding()Landroid/graphics/Rect;\"/>\n\t\t<method name=\"getConstantWidth()I\"/>\n\t\t<method name=\"getEnterFadeDuration()I\" since=\"11\"/>\n\t\t<method name=\"getExitFadeDuration()I\" since=\"11\"/>\n\t\t<method name=\"getOpacity()I\"/>\n\t\t<method name=\"growArray(II)V\"/>\n\t\t<method name=\"isConstantSize()Z\"/>\n\t\t<method name=\"isStateful()Z\"/>\n\t\t<method name=\"setConstantSize(Z)V\"/>\n\t\t<method name=\"setEnterFadeDuration(I)V\" since=\"11\"/>\n\t\t<method name=\"setExitFadeDuration(I)V\" since=\"11\"/>\n\t\t<method name=\"setVariablePadding(Z)V\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/DrawableWrapper\" since=\"23\">\n\t\t<extends name=\"android/graphics/drawable/Drawable\"/>\n\t\t<implements name=\"android/graphics/drawable/Drawable$Callback\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"getDrawable()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"setDrawable(Landroid/graphics/drawable/Drawable;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/GradientDrawable\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/Drawable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/drawable/GradientDrawable$Orientation;[I)V\"/>\n\t\t<method name=\"getColor()Landroid/content/res/ColorStateList;\" since=\"24\"/>\n\t\t<method name=\"getColors()[I\" since=\"24\"/>\n\t\t<method name=\"getCornerRadii()[F\" since=\"24\"/>\n\t\t<method name=\"getCornerRadius()F\" since=\"24\"/>\n\t\t<method name=\"getGradientCenterX()F\" since=\"24\"/>\n\t\t<method name=\"getGradientCenterY()F\" since=\"24\"/>\n\t\t<method name=\"getGradientRadius()F\" since=\"21\"/>\n\t\t<method name=\"getGradientType()I\" since=\"24\"/>\n\t\t<method name=\"getInnerRadius()I\" since=\"29\"/>\n\t\t<method name=\"getInnerRadiusRatio()F\" since=\"29\"/>\n\t\t<method name=\"getOrientation()Landroid/graphics/drawable/GradientDrawable$Orientation;\" since=\"16\"/>\n\t\t<method name=\"getShape()I\" since=\"24\"/>\n\t\t<method name=\"getThickness()I\" since=\"29\"/>\n\t\t<method name=\"getThicknessRatio()F\" since=\"29\"/>\n\t\t<method name=\"getUseLevel()Z\" since=\"24\"/>\n\t\t<method name=\"setColor(I)V\"/>\n\t\t<method name=\"setColor(Landroid/content/res/ColorStateList;)V\" since=\"21\"/>\n\t\t<method name=\"setColors([I)V\" since=\"16\"/>\n\t\t<method name=\"setColors([I[F)V\" since=\"29\"/>\n\t\t<method name=\"setCornerRadii([F)V\"/>\n\t\t<method name=\"setCornerRadius(F)V\"/>\n\t\t<method name=\"setGradientCenter(FF)V\"/>\n\t\t<method name=\"setGradientRadius(F)V\"/>\n\t\t<method name=\"setGradientType(I)V\"/>\n\t\t<method name=\"setInnerRadius(I)V\" since=\"29\"/>\n\t\t<method name=\"setInnerRadiusRatio(F)V\" since=\"29\"/>\n\t\t<method name=\"setOrientation(Landroid/graphics/drawable/GradientDrawable$Orientation;)V\" since=\"16\"/>\n\t\t<method name=\"setPadding(IIII)V\" since=\"29\"/>\n\t\t<method name=\"setShape(I)V\"/>\n\t\t<method name=\"setSize(II)V\"/>\n\t\t<method name=\"setStroke(II)V\"/>\n\t\t<method name=\"setStroke(IIFF)V\"/>\n\t\t<method name=\"setStroke(ILandroid/content/res/ColorStateList;)V\" since=\"21\"/>\n\t\t<method name=\"setStroke(ILandroid/content/res/ColorStateList;FF)V\" since=\"21\"/>\n\t\t<method name=\"setThickness(I)V\" since=\"29\"/>\n\t\t<method name=\"setThicknessRatio(F)V\" since=\"29\"/>\n\t\t<method name=\"setUseLevel(Z)V\"/>\n\t\t<field name=\"LINE\"/>\n\t\t<field name=\"LINEAR_GRADIENT\"/>\n\t\t<field name=\"OVAL\"/>\n\t\t<field name=\"RADIAL_GRADIENT\"/>\n\t\t<field name=\"RECTANGLE\"/>\n\t\t<field name=\"RING\"/>\n\t\t<field name=\"SWEEP_GRADIENT\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/GradientDrawable$Orientation\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/graphics/drawable/GradientDrawable$Orientation;\"/>\n\t\t<method name=\"values()[Landroid/graphics/drawable/GradientDrawable$Orientation;\"/>\n\t\t<field name=\"BL_TR\"/>\n\t\t<field name=\"BOTTOM_TOP\"/>\n\t\t<field name=\"BR_TL\"/>\n\t\t<field name=\"LEFT_RIGHT\"/>\n\t\t<field name=\"RIGHT_LEFT\"/>\n\t\t<field name=\"TL_BR\"/>\n\t\t<field name=\"TOP_BOTTOM\"/>\n\t\t<field name=\"TR_BL\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/Icon\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"createWithAdaptiveBitmap(Landroid/graphics/Bitmap;)Landroid/graphics/drawable/Icon;\" since=\"26\"/>\n\t\t<method name=\"createWithBitmap(Landroid/graphics/Bitmap;)Landroid/graphics/drawable/Icon;\"/>\n\t\t<method name=\"createWithContentUri(Landroid/net/Uri;)Landroid/graphics/drawable/Icon;\"/>\n\t\t<method name=\"createWithContentUri(Ljava/lang/String;)Landroid/graphics/drawable/Icon;\"/>\n\t\t<method name=\"createWithData([BII)Landroid/graphics/drawable/Icon;\"/>\n\t\t<method name=\"createWithFilePath(Ljava/lang/String;)Landroid/graphics/drawable/Icon;\"/>\n\t\t<method name=\"createWithResource(Landroid/content/Context;I)Landroid/graphics/drawable/Icon;\"/>\n\t\t<method name=\"createWithResource(Ljava/lang/String;I)Landroid/graphics/drawable/Icon;\"/>\n\t\t<method name=\"getResId()I\" since=\"28\"/>\n\t\t<method name=\"getResPackage()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getType()I\" since=\"28\"/>\n\t\t<method name=\"getUri()Landroid/net/Uri;\" since=\"28\"/>\n\t\t<method name=\"loadDrawable(Landroid/content/Context;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"loadDrawableAsync(Landroid/content/Context;Landroid/graphics/drawable/Icon$OnDrawableLoadedListener;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"loadDrawableAsync(Landroid/content/Context;Landroid/os/Message;)V\"/>\n\t\t<method name=\"setTint(I)Landroid/graphics/drawable/Icon;\"/>\n\t\t<method name=\"setTintBlendMode(Landroid/graphics/BlendMode;)Landroid/graphics/drawable/Icon;\" since=\"29\"/>\n\t\t<method name=\"setTintList(Landroid/content/res/ColorStateList;)Landroid/graphics/drawable/Icon;\"/>\n\t\t<method name=\"setTintMode(Landroid/graphics/PorterDuff$Mode;)Landroid/graphics/drawable/Icon;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"TYPE_ADAPTIVE_BITMAP\" since=\"28\"/>\n\t\t<field name=\"TYPE_BITMAP\" since=\"28\"/>\n\t\t<field name=\"TYPE_DATA\" since=\"28\"/>\n\t\t<field name=\"TYPE_RESOURCE\" since=\"28\"/>\n\t\t<field name=\"TYPE_URI\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/Icon$OnDrawableLoadedListener\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDrawableLoaded(Landroid/graphics/drawable/Drawable;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/InsetDrawable\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/Drawable\" removed=\"23\"/>\n\t\t<extends name=\"android/graphics/drawable/DrawableWrapper\" since=\"23\"/>\n\t\t<implements name=\"android/graphics/drawable/Drawable$Callback\" removed=\"23\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/drawable/Drawable;F)V\" since=\"26\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/drawable/Drawable;FFFF)V\" since=\"26\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/drawable/Drawable;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/drawable/Drawable;IIII)V\"/>\n\t\t<method name=\"getDrawable()Landroid/graphics/drawable/Drawable;\" since=\"19\" removed=\"23\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/LayerDrawable\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/Drawable\"/>\n\t\t<implements name=\"android/graphics/drawable/Drawable$Callback\"/>\n\t\t<method name=\"&lt;init>([Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"addLayer(Landroid/graphics/drawable/Drawable;)I\" since=\"23\"/>\n\t\t<method name=\"findDrawableByLayerId(I)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"findIndexByLayerId(I)I\" since=\"23\"/>\n\t\t<method name=\"getBottomPadding()I\" since=\"23\"/>\n\t\t<method name=\"getDrawable(I)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getEndPadding()I\" since=\"23\"/>\n\t\t<method name=\"getId(I)I\"/>\n\t\t<method name=\"getLayerGravity(I)I\" since=\"23\"/>\n\t\t<method name=\"getLayerHeight(I)I\" since=\"23\"/>\n\t\t<method name=\"getLayerInsetBottom(I)I\" since=\"23\"/>\n\t\t<method name=\"getLayerInsetEnd(I)I\" since=\"23\"/>\n\t\t<method name=\"getLayerInsetLeft(I)I\" since=\"23\"/>\n\t\t<method name=\"getLayerInsetRight(I)I\" since=\"23\"/>\n\t\t<method name=\"getLayerInsetStart(I)I\" since=\"23\"/>\n\t\t<method name=\"getLayerInsetTop(I)I\" since=\"23\"/>\n\t\t<method name=\"getLayerWidth(I)I\" since=\"23\"/>\n\t\t<method name=\"getLeftPadding()I\" since=\"23\"/>\n\t\t<method name=\"getNumberOfLayers()I\"/>\n\t\t<method name=\"getPaddingMode()I\" since=\"21\"/>\n\t\t<method name=\"getRightPadding()I\" since=\"23\"/>\n\t\t<method name=\"getStartPadding()I\" since=\"23\"/>\n\t\t<method name=\"getTopPadding()I\" since=\"23\"/>\n\t\t<method name=\"setDrawable(ILandroid/graphics/drawable/Drawable;)V\" since=\"23\"/>\n\t\t<method name=\"setDrawableByLayerId(ILandroid/graphics/drawable/Drawable;)Z\"/>\n\t\t<method name=\"setId(II)V\"/>\n\t\t<method name=\"setLayerGravity(II)V\" since=\"23\"/>\n\t\t<method name=\"setLayerHeight(II)V\" since=\"23\"/>\n\t\t<method name=\"setLayerInset(IIIII)V\"/>\n\t\t<method name=\"setLayerInsetBottom(II)V\" since=\"23\"/>\n\t\t<method name=\"setLayerInsetEnd(II)V\" since=\"23\"/>\n\t\t<method name=\"setLayerInsetLeft(II)V\" since=\"23\"/>\n\t\t<method name=\"setLayerInsetRelative(IIIII)V\" since=\"23\"/>\n\t\t<method name=\"setLayerInsetRight(II)V\" since=\"23\"/>\n\t\t<method name=\"setLayerInsetStart(II)V\" since=\"23\"/>\n\t\t<method name=\"setLayerInsetTop(II)V\" since=\"23\"/>\n\t\t<method name=\"setLayerSize(III)V\" since=\"23\"/>\n\t\t<method name=\"setLayerWidth(II)V\" since=\"23\"/>\n\t\t<method name=\"setOpacity(I)V\" since=\"11\"/>\n\t\t<method name=\"setPadding(IIII)V\" since=\"23\"/>\n\t\t<method name=\"setPaddingMode(I)V\" since=\"21\"/>\n\t\t<method name=\"setPaddingRelative(IIII)V\" since=\"23\"/>\n\t\t<field name=\"INSET_UNDEFINED\" since=\"24\"/>\n\t\t<field name=\"PADDING_MODE_NEST\" since=\"21\"/>\n\t\t<field name=\"PADDING_MODE_STACK\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/LevelListDrawable\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/DrawableContainer\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addLevel(IILandroid/graphics/drawable/Drawable;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/NinePatchDrawable\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/Drawable\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/res/Resources;Landroid/graphics/Bitmap;[BLandroid/graphics/Rect;Ljava/lang/String;)V\" since=\"4\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/res/Resources;Landroid/graphics/NinePatch;)V\" since=\"4\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Bitmap;[BLandroid/graphics/Rect;Ljava/lang/String;)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/NinePatch;)V\" deprecated=\"15\"/>\n\t\t<method name=\"getPaint()Landroid/graphics/Paint;\"/>\n\t\t<method name=\"setTargetDensity(I)V\" since=\"4\"/>\n\t\t<method name=\"setTargetDensity(Landroid/graphics/Canvas;)V\" since=\"4\"/>\n\t\t<method name=\"setTargetDensity(Landroid/util/DisplayMetrics;)V\" since=\"4\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/PaintDrawable\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/ShapeDrawable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"setCornerRadii([F)V\"/>\n\t\t<method name=\"setCornerRadius(F)V\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/PictureDrawable\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/Drawable\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Picture;)V\"/>\n\t\t<method name=\"getPicture()Landroid/graphics/Picture;\"/>\n\t\t<method name=\"setPicture(Landroid/graphics/Picture;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/RippleDrawable\" since=\"21\">\n\t\t<extends name=\"android/graphics/drawable/LayerDrawable\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/res/ColorStateList;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"getRadius()I\" since=\"23\"/>\n\t\t<method name=\"setColor(Landroid/content/res/ColorStateList;)V\"/>\n\t\t<method name=\"setRadius(I)V\" since=\"23\"/>\n\t\t<field name=\"RADIUS_AUTO\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/RotateDrawable\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/Drawable\" removed=\"23\"/>\n\t\t<extends name=\"android/graphics/drawable/DrawableWrapper\" since=\"23\"/>\n\t\t<implements name=\"android/graphics/drawable/Drawable$Callback\" removed=\"23\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getDrawable()Landroid/graphics/drawable/Drawable;\" since=\"3\" removed=\"23\"/>\n\t\t<method name=\"getFromDegrees()F\" since=\"21\"/>\n\t\t<method name=\"getPivotX()F\" since=\"21\"/>\n\t\t<method name=\"getPivotY()F\" since=\"21\"/>\n\t\t<method name=\"getToDegrees()F\" since=\"21\"/>\n\t\t<method name=\"isPivotXRelative()Z\" since=\"21\"/>\n\t\t<method name=\"isPivotYRelative()Z\" since=\"21\"/>\n\t\t<method name=\"setDrawable(Landroid/graphics/drawable/Drawable;)V\" since=\"21\" removed=\"23\"/>\n\t\t<method name=\"setFromDegrees(F)V\" since=\"21\"/>\n\t\t<method name=\"setPivotX(F)V\" since=\"21\"/>\n\t\t<method name=\"setPivotXRelative(Z)V\" since=\"21\"/>\n\t\t<method name=\"setPivotY(F)V\" since=\"21\"/>\n\t\t<method name=\"setPivotYRelative(Z)V\" since=\"21\"/>\n\t\t<method name=\"setToDegrees(F)V\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/ScaleDrawable\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/Drawable\" removed=\"23\"/>\n\t\t<extends name=\"android/graphics/drawable/DrawableWrapper\" since=\"23\"/>\n\t\t<implements name=\"android/graphics/drawable/Drawable$Callback\" removed=\"23\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/drawable/Drawable;IFF)V\"/>\n\t\t<method name=\"getDrawable()Landroid/graphics/drawable/Drawable;\" since=\"3\" removed=\"23\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/ShapeDrawable\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/Drawable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/drawable/shapes/Shape;)V\"/>\n\t\t<method name=\"getPaint()Landroid/graphics/Paint;\"/>\n\t\t<method name=\"getShaderFactory()Landroid/graphics/drawable/ShapeDrawable$ShaderFactory;\"/>\n\t\t<method name=\"getShape()Landroid/graphics/drawable/shapes/Shape;\"/>\n\t\t<method name=\"inflateTag(Ljava/lang/String;Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;)Z\"/>\n\t\t<method name=\"onDraw(Landroid/graphics/drawable/shapes/Shape;Landroid/graphics/Canvas;Landroid/graphics/Paint;)V\"/>\n\t\t<method name=\"setIntrinsicHeight(I)V\"/>\n\t\t<method name=\"setIntrinsicWidth(I)V\"/>\n\t\t<method name=\"setPadding(IIII)V\"/>\n\t\t<method name=\"setPadding(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"setShaderFactory(Landroid/graphics/drawable/ShapeDrawable$ShaderFactory;)V\"/>\n\t\t<method name=\"setShape(Landroid/graphics/drawable/shapes/Shape;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/ShapeDrawable$ShaderFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"resize(II)Landroid/graphics/Shader;\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/StateListDrawable\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/DrawableContainer\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addState([ILandroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"findStateDrawableIndex([I)I\" since=\"29\"/>\n\t\t<method name=\"getStateCount()I\" since=\"29\"/>\n\t\t<method name=\"getStateDrawable(I)Landroid/graphics/drawable/Drawable;\" since=\"29\"/>\n\t\t<method name=\"getStateSet(I)[I\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/TransitionDrawable\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/LayerDrawable\"/>\n\t\t<method name=\"&lt;init>([Landroid/graphics/drawable/Drawable;)V\" since=\"3\"/>\n\t\t<method name=\"isCrossFadeEnabled()Z\"/>\n\t\t<method name=\"resetTransition()V\"/>\n\t\t<method name=\"reverseTransition(I)V\"/>\n\t\t<method name=\"setCrossFadeEnabled(Z)V\"/>\n\t\t<method name=\"startTransition(I)V\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/VectorDrawable\" since=\"21\">\n\t\t<extends name=\"android/graphics/drawable/Drawable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/shapes/ArcShape\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/shapes/RectShape\"/>\n\t\t<method name=\"&lt;init>(FF)V\"/>\n\t\t<method name=\"clone()Landroid/graphics/drawable/shapes/ArcShape;\" since=\"26\"/>\n\t\t<method name=\"getStartAngle()F\" since=\"26\"/>\n\t\t<method name=\"getSweepAngle()F\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/shapes/OvalShape\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/shapes/RectShape\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"clone()Landroid/graphics/drawable/shapes/OvalShape;\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/shapes/PathShape\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/shapes/Shape\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Path;FF)V\"/>\n\t\t<method name=\"clone()Landroid/graphics/drawable/shapes/PathShape;\" since=\"3\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/shapes/RectShape\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/shapes/Shape\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"clone()Landroid/graphics/drawable/shapes/RectShape;\" since=\"3\"/>\n\t\t<method name=\"rect()Landroid/graphics/RectF;\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/shapes/RoundRectShape\" since=\"1\">\n\t\t<extends name=\"android/graphics/drawable/shapes/RectShape\"/>\n\t\t<method name=\"&lt;init>([FLandroid/graphics/RectF;[F)V\"/>\n\t\t<method name=\"clone()Landroid/graphics/drawable/shapes/RoundRectShape;\" since=\"3\"/>\n\t</class>\n\t<class name=\"android/graphics/drawable/shapes/Shape\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\" since=\"3\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"clone()Landroid/graphics/drawable/shapes/Shape;\" since=\"3\"/>\n\t\t<method name=\"draw(Landroid/graphics/Canvas;Landroid/graphics/Paint;)V\"/>\n\t\t<method name=\"getHeight()F\"/>\n\t\t<method name=\"getOutline(Landroid/graphics/Outline;)V\" since=\"21\"/>\n\t\t<method name=\"getWidth()F\"/>\n\t\t<method name=\"hasAlpha()Z\"/>\n\t\t<method name=\"onResize(FF)V\"/>\n\t\t<method name=\"resize(FF)V\"/>\n\t</class>\n\t<class name=\"android/graphics/fonts/Font\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAxes()[Landroid/graphics/fonts/FontVariationAxis;\"/>\n\t\t<method name=\"getBuffer()Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"getFile()Ljava/io/File;\"/>\n\t\t<method name=\"getLocaleList()Landroid/os/LocaleList;\"/>\n\t\t<method name=\"getStyle()Landroid/graphics/fonts/FontStyle;\"/>\n\t\t<method name=\"getTtcIndex()I\"/>\n\t</class>\n\t<class name=\"android/graphics/fonts/Font$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/res/AssetManager;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/res/Resources;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/ParcelFileDescriptor;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/ParcelFileDescriptor;JJ)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/nio/ByteBuffer;)V\"/>\n\t\t<method name=\"build()Landroid/graphics/fonts/Font;\"/>\n\t\t<method name=\"setFontVariationSettings(Ljava/lang/String;)Landroid/graphics/fonts/Font$Builder;\"/>\n\t\t<method name=\"setFontVariationSettings([Landroid/graphics/fonts/FontVariationAxis;)Landroid/graphics/fonts/Font$Builder;\"/>\n\t\t<method name=\"setSlant(I)Landroid/graphics/fonts/Font$Builder;\"/>\n\t\t<method name=\"setTtcIndex(I)Landroid/graphics/fonts/Font$Builder;\"/>\n\t\t<method name=\"setWeight(I)Landroid/graphics/fonts/Font$Builder;\"/>\n\t</class>\n\t<class name=\"android/graphics/fonts/FontFamily\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getFont(I)Landroid/graphics/fonts/Font;\"/>\n\t\t<method name=\"getSize()I\"/>\n\t</class>\n\t<class name=\"android/graphics/fonts/FontFamily$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/fonts/Font;)V\"/>\n\t\t<method name=\"addFont(Landroid/graphics/fonts/Font;)Landroid/graphics/fonts/FontFamily$Builder;\"/>\n\t\t<method name=\"build()Landroid/graphics/fonts/FontFamily;\"/>\n\t</class>\n\t<class name=\"android/graphics/fonts/FontStyle\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"getSlant()I\"/>\n\t\t<method name=\"getWeight()I\"/>\n\t\t<field name=\"FONT_SLANT_ITALIC\"/>\n\t\t<field name=\"FONT_SLANT_UPRIGHT\"/>\n\t\t<field name=\"FONT_WEIGHT_BLACK\"/>\n\t\t<field name=\"FONT_WEIGHT_BOLD\"/>\n\t\t<field name=\"FONT_WEIGHT_EXTRA_BOLD\"/>\n\t\t<field name=\"FONT_WEIGHT_EXTRA_LIGHT\"/>\n\t\t<field name=\"FONT_WEIGHT_LIGHT\"/>\n\t\t<field name=\"FONT_WEIGHT_MAX\"/>\n\t\t<field name=\"FONT_WEIGHT_MEDIUM\"/>\n\t\t<field name=\"FONT_WEIGHT_MIN\"/>\n\t\t<field name=\"FONT_WEIGHT_NORMAL\"/>\n\t\t<field name=\"FONT_WEIGHT_SEMI_BOLD\"/>\n\t\t<field name=\"FONT_WEIGHT_THIN\"/>\n\t</class>\n\t<class name=\"android/graphics/fonts/FontVariationAxis\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;F)V\"/>\n\t\t<method name=\"fromFontVariationSettings(Ljava/lang/String;)[Landroid/graphics/fonts/FontVariationAxis;\"/>\n\t\t<method name=\"getStyleValue()F\"/>\n\t\t<method name=\"getTag()Ljava/lang/String;\"/>\n\t\t<method name=\"toFontVariationSettings([Landroid/graphics/fonts/FontVariationAxis;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/graphics/fonts/SystemFonts\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAvailableFonts()Ljava/util/Set;\"/>\n\t</class>\n\t<class name=\"android/graphics/pdf/PdfDocument\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"finishPage(Landroid/graphics/pdf/PdfDocument$Page;)V\"/>\n\t\t<method name=\"getPages()Ljava/util/List;\"/>\n\t\t<method name=\"startPage(Landroid/graphics/pdf/PdfDocument$PageInfo;)Landroid/graphics/pdf/PdfDocument$Page;\"/>\n\t\t<method name=\"writeTo(Ljava/io/OutputStream;)V\"/>\n\t</class>\n\t<class name=\"android/graphics/pdf/PdfDocument$Page\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getCanvas()Landroid/graphics/Canvas;\"/>\n\t\t<method name=\"getInfo()Landroid/graphics/pdf/PdfDocument$PageInfo;\"/>\n\t</class>\n\t<class name=\"android/graphics/pdf/PdfDocument$PageInfo\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getContentRect()Landroid/graphics/Rect;\"/>\n\t\t<method name=\"getPageHeight()I\"/>\n\t\t<method name=\"getPageNumber()I\"/>\n\t\t<method name=\"getPageWidth()I\"/>\n\t</class>\n\t<class name=\"android/graphics/pdf/PdfDocument$PageInfo$Builder\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"create()Landroid/graphics/pdf/PdfDocument$PageInfo;\"/>\n\t\t<method name=\"setContentRect(Landroid/graphics/Rect;)Landroid/graphics/pdf/PdfDocument$PageInfo$Builder;\"/>\n\t</class>\n\t<class name=\"android/graphics/pdf/PdfRenderer\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/ParcelFileDescriptor;)V\"/>\n\t\t<method name=\"getPageCount()I\"/>\n\t\t<method name=\"openPage(I)Landroid/graphics/pdf/PdfRenderer$Page;\"/>\n\t\t<method name=\"shouldScaleForPrinting()Z\"/>\n\t</class>\n\t<class name=\"android/graphics/pdf/PdfRenderer$Page\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getIndex()I\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t\t<method name=\"render(Landroid/graphics/Bitmap;Landroid/graphics/Rect;Landroid/graphics/Matrix;I)V\"/>\n\t\t<field name=\"RENDER_MODE_FOR_DISPLAY\"/>\n\t\t<field name=\"RENDER_MODE_FOR_PRINT\"/>\n\t</class>\n\t<class name=\"android/graphics/text/LineBreaker\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"computeLineBreaks(Landroid/graphics/text/MeasuredText;Landroid/graphics/text/LineBreaker$ParagraphConstraints;I)Landroid/graphics/text/LineBreaker$Result;\"/>\n\t\t<field name=\"BREAK_STRATEGY_BALANCED\"/>\n\t\t<field name=\"BREAK_STRATEGY_HIGH_QUALITY\"/>\n\t\t<field name=\"BREAK_STRATEGY_SIMPLE\"/>\n\t\t<field name=\"HYPHENATION_FREQUENCY_FULL\"/>\n\t\t<field name=\"HYPHENATION_FREQUENCY_NONE\"/>\n\t\t<field name=\"HYPHENATION_FREQUENCY_NORMAL\"/>\n\t\t<field name=\"JUSTIFICATION_MODE_INTER_WORD\"/>\n\t\t<field name=\"JUSTIFICATION_MODE_NONE\"/>\n\t</class>\n\t<class name=\"android/graphics/text/LineBreaker$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/graphics/text/LineBreaker;\"/>\n\t\t<method name=\"setBreakStrategy(I)Landroid/graphics/text/LineBreaker$Builder;\"/>\n\t\t<method name=\"setHyphenationFrequency(I)Landroid/graphics/text/LineBreaker$Builder;\"/>\n\t\t<method name=\"setIndents([I)Landroid/graphics/text/LineBreaker$Builder;\"/>\n\t\t<method name=\"setJustificationMode(I)Landroid/graphics/text/LineBreaker$Builder;\"/>\n\t</class>\n\t<class name=\"android/graphics/text/LineBreaker$ParagraphConstraints\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getDefaultTabStop()F\"/>\n\t\t<method name=\"getFirstWidth()F\"/>\n\t\t<method name=\"getFirstWidthLineCount()I\"/>\n\t\t<method name=\"getTabStops()[F\"/>\n\t\t<method name=\"getWidth()F\"/>\n\t\t<method name=\"setIndent(FI)V\"/>\n\t\t<method name=\"setTabStops([FF)V\"/>\n\t\t<method name=\"setWidth(F)V\"/>\n\t</class>\n\t<class name=\"android/graphics/text/LineBreaker$Result\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getEndLineHyphenEdit(I)I\"/>\n\t\t<method name=\"getLineAscent(I)F\"/>\n\t\t<method name=\"getLineBreakOffset(I)I\"/>\n\t\t<method name=\"getLineCount()I\"/>\n\t\t<method name=\"getLineDescent(I)F\"/>\n\t\t<method name=\"getLineWidth(I)F\"/>\n\t\t<method name=\"getStartLineHyphenEdit(I)I\"/>\n\t\t<method name=\"hasLineTab(I)Z\"/>\n\t</class>\n\t<class name=\"android/graphics/text/MeasuredText\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getBounds(IILandroid/graphics/Rect;)V\"/>\n\t\t<method name=\"getCharWidthAt(I)F\"/>\n\t\t<method name=\"getWidth(II)F\"/>\n\t</class>\n\t<class name=\"android/graphics/text/MeasuredText$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/text/MeasuredText;)V\"/>\n\t\t<method name=\"&lt;init>([C)V\"/>\n\t\t<method name=\"appendReplacementRun(Landroid/graphics/Paint;IF)Landroid/graphics/text/MeasuredText$Builder;\"/>\n\t\t<method name=\"appendStyleRun(Landroid/graphics/Paint;IZ)Landroid/graphics/text/MeasuredText$Builder;\"/>\n\t\t<method name=\"build()Landroid/graphics/text/MeasuredText;\"/>\n\t\t<method name=\"setComputeHyphenation(Z)Landroid/graphics/text/MeasuredText$Builder;\"/>\n\t\t<method name=\"setComputeLayout(Z)Landroid/graphics/text/MeasuredText$Builder;\"/>\n\t</class>\n\t<class name=\"android/hardware/Camera\" since=\"1\" deprecated=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addCallbackBuffer([B)V\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"autoFocus(Landroid/hardware/Camera$AutoFocusCallback;)V\" deprecated=\"29\"/>\n\t\t<method name=\"cancelAutoFocus()V\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"enableShutterSound(Z)Z\" since=\"17\" deprecated=\"29\"/>\n\t\t<method name=\"getCameraInfo(ILandroid/hardware/Camera$CameraInfo;)V\" since=\"9\" deprecated=\"29\"/>\n\t\t<method name=\"getNumberOfCameras()I\" since=\"9\" deprecated=\"29\"/>\n\t\t<method name=\"getParameters()Landroid/hardware/Camera$Parameters;\" deprecated=\"29\"/>\n\t\t<method name=\"lock()V\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"open()Landroid/hardware/Camera;\" deprecated=\"29\"/>\n\t\t<method name=\"open(I)Landroid/hardware/Camera;\" since=\"9\" deprecated=\"29\"/>\n\t\t<method name=\"reconnect()V\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"release()V\" deprecated=\"29\"/>\n\t\t<method name=\"setAutoFocusMoveCallback(Landroid/hardware/Camera$AutoFocusMoveCallback;)V\" since=\"16\" deprecated=\"29\"/>\n\t\t<method name=\"setDisplayOrientation(I)V\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"setErrorCallback(Landroid/hardware/Camera$ErrorCallback;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setFaceDetectionListener(Landroid/hardware/Camera$FaceDetectionListener;)V\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"setOneShotPreviewCallback(Landroid/hardware/Camera$PreviewCallback;)V\" since=\"3\" deprecated=\"29\"/>\n\t\t<method name=\"setParameters(Landroid/hardware/Camera$Parameters;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setPreviewCallback(Landroid/hardware/Camera$PreviewCallback;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setPreviewCallbackWithBuffer(Landroid/hardware/Camera$PreviewCallback;)V\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"setPreviewDisplay(Landroid/view/SurfaceHolder;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setPreviewTexture(Landroid/graphics/SurfaceTexture;)V\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"setZoomChangeListener(Landroid/hardware/Camera$OnZoomChangeListener;)V\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"startFaceDetection()V\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"startPreview()V\" deprecated=\"29\"/>\n\t\t<method name=\"startSmoothZoom(I)V\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"stopFaceDetection()V\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"stopPreview()V\" deprecated=\"29\"/>\n\t\t<method name=\"stopSmoothZoom()V\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"takePicture(Landroid/hardware/Camera$ShutterCallback;Landroid/hardware/Camera$PictureCallback;Landroid/hardware/Camera$PictureCallback;)V\" deprecated=\"29\"/>\n\t\t<method name=\"takePicture(Landroid/hardware/Camera$ShutterCallback;Landroid/hardware/Camera$PictureCallback;Landroid/hardware/Camera$PictureCallback;Landroid/hardware/Camera$PictureCallback;)V\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"unlock()V\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"ACTION_NEW_PICTURE\" since=\"14\" deprecated=\"24\"/>\n\t\t<field name=\"ACTION_NEW_VIDEO\" since=\"14\" deprecated=\"24\"/>\n\t\t<field name=\"CAMERA_ERROR_EVICTED\" since=\"23\" deprecated=\"29\"/>\n\t\t<field name=\"CAMERA_ERROR_SERVER_DIED\" deprecated=\"29\"/>\n\t\t<field name=\"CAMERA_ERROR_UNKNOWN\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/hardware/Camera$Area\" since=\"14\" deprecated=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Rect;I)V\" deprecated=\"29\"/>\n\t\t<field name=\"rect\" deprecated=\"29\"/>\n\t\t<field name=\"weight\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/hardware/Camera$AutoFocusCallback\" since=\"1\" deprecated=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onAutoFocus(ZLandroid/hardware/Camera;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/hardware/Camera$AutoFocusMoveCallback\" since=\"16\" deprecated=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onAutoFocusMoving(ZLandroid/hardware/Camera;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/hardware/Camera$CameraInfo\" since=\"9\" deprecated=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<field name=\"CAMERA_FACING_BACK\" deprecated=\"29\"/>\n\t\t<field name=\"CAMERA_FACING_FRONT\" deprecated=\"29\"/>\n\t\t<field name=\"canDisableShutterSound\" since=\"17\" deprecated=\"29\"/>\n\t\t<field name=\"facing\" deprecated=\"29\"/>\n\t\t<field name=\"orientation\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/hardware/Camera$ErrorCallback\" since=\"1\" deprecated=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onError(ILandroid/hardware/Camera;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/hardware/Camera$Face\" since=\"14\" deprecated=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<field name=\"id\" deprecated=\"29\"/>\n\t\t<field name=\"leftEye\" deprecated=\"29\"/>\n\t\t<field name=\"mouth\" deprecated=\"29\"/>\n\t\t<field name=\"rect\" deprecated=\"29\"/>\n\t\t<field name=\"rightEye\" deprecated=\"29\"/>\n\t\t<field name=\"score\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/hardware/Camera$FaceDetectionListener\" since=\"14\" deprecated=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onFaceDetection([Landroid/hardware/Camera$Face;Landroid/hardware/Camera;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/hardware/Camera$OnZoomChangeListener\" since=\"8\" deprecated=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onZoomChange(IZLandroid/hardware/Camera;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/hardware/Camera$Parameters\" since=\"1\" deprecated=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"flatten()Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"get(Ljava/lang/String;)Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getAntibanding()Ljava/lang/String;\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getAutoExposureLock()Z\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"getAutoWhiteBalanceLock()Z\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"getColorEffect()Ljava/lang/String;\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getExposureCompensation()I\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"getExposureCompensationStep()F\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"getFlashMode()Ljava/lang/String;\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getFocalLength()F\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"getFocusAreas()Ljava/util/List;\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"getFocusDistances([F)V\" since=\"9\" deprecated=\"29\"/>\n\t\t<method name=\"getFocusMode()Ljava/lang/String;\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getHorizontalViewAngle()F\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"getInt(Ljava/lang/String;)I\" deprecated=\"29\"/>\n\t\t<method name=\"getJpegQuality()I\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getJpegThumbnailQuality()I\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getJpegThumbnailSize()Landroid/hardware/Camera$Size;\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getMaxExposureCompensation()I\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"getMaxNumDetectedFaces()I\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"getMaxNumFocusAreas()I\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"getMaxNumMeteringAreas()I\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"getMaxZoom()I\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"getMeteringAreas()Ljava/util/List;\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"getMinExposureCompensation()I\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"getPictureFormat()I\" deprecated=\"29\"/>\n\t\t<method name=\"getPictureSize()Landroid/hardware/Camera$Size;\" deprecated=\"29\"/>\n\t\t<method name=\"getPreferredPreviewSizeForVideo()Landroid/hardware/Camera$Size;\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"getPreviewFormat()I\" deprecated=\"29\"/>\n\t\t<method name=\"getPreviewFpsRange([I)V\" since=\"9\" deprecated=\"29\"/>\n\t\t<method name=\"getPreviewFrameRate()I\" deprecated=\"15\"/>\n\t\t<method name=\"getPreviewSize()Landroid/hardware/Camera$Size;\" deprecated=\"29\"/>\n\t\t<method name=\"getSceneMode()Ljava/lang/String;\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getSupportedAntibanding()Ljava/util/List;\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getSupportedColorEffects()Ljava/util/List;\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getSupportedFlashModes()Ljava/util/List;\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getSupportedFocusModes()Ljava/util/List;\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getSupportedJpegThumbnailSizes()Ljava/util/List;\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"getSupportedPictureFormats()Ljava/util/List;\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getSupportedPictureSizes()Ljava/util/List;\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getSupportedPreviewFormats()Ljava/util/List;\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getSupportedPreviewFpsRange()Ljava/util/List;\" since=\"9\" deprecated=\"29\"/>\n\t\t<method name=\"getSupportedPreviewFrameRates()Ljava/util/List;\" since=\"5\" deprecated=\"15\"/>\n\t\t<method name=\"getSupportedPreviewSizes()Ljava/util/List;\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getSupportedSceneModes()Ljava/util/List;\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getSupportedVideoSizes()Ljava/util/List;\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"getSupportedWhiteBalance()Ljava/util/List;\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getVerticalViewAngle()F\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"getVideoStabilization()Z\" since=\"15\" deprecated=\"29\"/>\n\t\t<method name=\"getWhiteBalance()Ljava/lang/String;\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getZoom()I\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"getZoomRatios()Ljava/util/List;\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"isAutoExposureLockSupported()Z\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"isAutoWhiteBalanceLockSupported()Z\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"isSmoothZoomSupported()Z\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"isVideoSnapshotSupported()Z\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"isVideoStabilizationSupported()Z\" since=\"15\" deprecated=\"29\"/>\n\t\t<method name=\"isZoomSupported()Z\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"remove(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"removeGpsData()V\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"set(Ljava/lang/String;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"set(Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setAntibanding(Ljava/lang/String;)V\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"setAutoExposureLock(Z)V\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"setAutoWhiteBalanceLock(Z)V\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"setColorEffect(Ljava/lang/String;)V\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"setExposureCompensation(I)V\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"setFlashMode(Ljava/lang/String;)V\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"setFocusAreas(Ljava/util/List;)V\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"setFocusMode(Ljava/lang/String;)V\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"setGpsAltitude(D)V\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"setGpsLatitude(D)V\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"setGpsLongitude(D)V\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"setGpsProcessingMethod(Ljava/lang/String;)V\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"setGpsTimestamp(J)V\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"setJpegQuality(I)V\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"setJpegThumbnailQuality(I)V\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"setJpegThumbnailSize(II)V\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"setMeteringAreas(Ljava/util/List;)V\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"setPictureFormat(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setPictureSize(II)V\" deprecated=\"29\"/>\n\t\t<method name=\"setPreviewFormat(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setPreviewFpsRange(II)V\" since=\"9\" deprecated=\"29\"/>\n\t\t<method name=\"setPreviewFrameRate(I)V\" deprecated=\"15\"/>\n\t\t<method name=\"setPreviewSize(II)V\" deprecated=\"29\"/>\n\t\t<method name=\"setRecordingHint(Z)V\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"setRotation(I)V\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"setSceneMode(Ljava/lang/String;)V\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"setVideoStabilization(Z)V\" since=\"15\" deprecated=\"29\"/>\n\t\t<method name=\"setWhiteBalance(Ljava/lang/String;)V\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"setZoom(I)V\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"unflatten(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<field name=\"ANTIBANDING_50HZ\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"ANTIBANDING_60HZ\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"ANTIBANDING_AUTO\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"ANTIBANDING_OFF\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"EFFECT_AQUA\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"EFFECT_BLACKBOARD\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"EFFECT_MONO\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"EFFECT_NEGATIVE\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"EFFECT_NONE\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"EFFECT_POSTERIZE\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"EFFECT_SEPIA\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"EFFECT_SOLARIZE\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"EFFECT_WHITEBOARD\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"FLASH_MODE_AUTO\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"FLASH_MODE_OFF\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"FLASH_MODE_ON\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"FLASH_MODE_RED_EYE\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"FLASH_MODE_TORCH\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"FOCUS_DISTANCE_FAR_INDEX\" since=\"9\" deprecated=\"29\"/>\n\t\t<field name=\"FOCUS_DISTANCE_NEAR_INDEX\" since=\"9\" deprecated=\"29\"/>\n\t\t<field name=\"FOCUS_DISTANCE_OPTIMAL_INDEX\" since=\"9\" deprecated=\"29\"/>\n\t\t<field name=\"FOCUS_MODE_AUTO\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"FOCUS_MODE_CONTINUOUS_PICTURE\" since=\"14\" deprecated=\"29\"/>\n\t\t<field name=\"FOCUS_MODE_CONTINUOUS_VIDEO\" since=\"9\" deprecated=\"29\"/>\n\t\t<field name=\"FOCUS_MODE_EDOF\" since=\"8\" deprecated=\"29\"/>\n\t\t<field name=\"FOCUS_MODE_FIXED\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"FOCUS_MODE_INFINITY\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"FOCUS_MODE_MACRO\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"PREVIEW_FPS_MAX_INDEX\" since=\"9\" deprecated=\"29\"/>\n\t\t<field name=\"PREVIEW_FPS_MIN_INDEX\" since=\"9\" deprecated=\"29\"/>\n\t\t<field name=\"SCENE_MODE_ACTION\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"SCENE_MODE_AUTO\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"SCENE_MODE_BARCODE\" since=\"8\" deprecated=\"29\"/>\n\t\t<field name=\"SCENE_MODE_BEACH\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"SCENE_MODE_CANDLELIGHT\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"SCENE_MODE_FIREWORKS\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"SCENE_MODE_HDR\" since=\"17\" deprecated=\"29\"/>\n\t\t<field name=\"SCENE_MODE_LANDSCAPE\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"SCENE_MODE_NIGHT\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"SCENE_MODE_NIGHT_PORTRAIT\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"SCENE_MODE_PARTY\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"SCENE_MODE_PORTRAIT\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"SCENE_MODE_SNOW\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"SCENE_MODE_SPORTS\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"SCENE_MODE_STEADYPHOTO\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"SCENE_MODE_SUNSET\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"SCENE_MODE_THEATRE\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"WHITE_BALANCE_AUTO\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"WHITE_BALANCE_CLOUDY_DAYLIGHT\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"WHITE_BALANCE_DAYLIGHT\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"WHITE_BALANCE_FLUORESCENT\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"WHITE_BALANCE_INCANDESCENT\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"WHITE_BALANCE_SHADE\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"WHITE_BALANCE_TWILIGHT\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"WHITE_BALANCE_WARM_FLUORESCENT\" since=\"5\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/hardware/Camera$PictureCallback\" since=\"1\" deprecated=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onPictureTaken([BLandroid/hardware/Camera;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/hardware/Camera$PreviewCallback\" since=\"1\" deprecated=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onPreviewFrame([BLandroid/hardware/Camera;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/hardware/Camera$ShutterCallback\" since=\"1\" deprecated=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onShutter()V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/hardware/Camera$Size\" since=\"1\" deprecated=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/hardware/Camera;II)V\" deprecated=\"29\"/>\n\t\t<field name=\"height\" deprecated=\"29\"/>\n\t\t<field name=\"width\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/hardware/ConsumerIrManager\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getCarrierFrequencies()[Landroid/hardware/ConsumerIrManager$CarrierFrequencyRange;\"/>\n\t\t<method name=\"hasIrEmitter()Z\"/>\n\t\t<method name=\"transmit(I[I)V\"/>\n\t</class>\n\t<class name=\"android/hardware/ConsumerIrManager$CarrierFrequencyRange\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/hardware/ConsumerIrManager;II)V\"/>\n\t\t<method name=\"getMaxFrequency()I\"/>\n\t\t<method name=\"getMinFrequency()I\"/>\n\t</class>\n\t<class name=\"android/hardware/GeomagneticField\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(FFFJ)V\"/>\n\t\t<method name=\"getDeclination()F\"/>\n\t\t<method name=\"getFieldStrength()F\"/>\n\t\t<method name=\"getHorizontalStrength()F\"/>\n\t\t<method name=\"getInclination()F\"/>\n\t\t<method name=\"getX()F\"/>\n\t\t<method name=\"getY()F\"/>\n\t\t<method name=\"getZ()F\"/>\n\t</class>\n\t<class name=\"android/hardware/HardwareBuffer\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"create(IIIIJ)Landroid/hardware/HardwareBuffer;\"/>\n\t\t<method name=\"getFormat()I\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getLayers()I\"/>\n\t\t<method name=\"getUsage()J\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t\t<method name=\"isClosed()Z\"/>\n\t\t<method name=\"isSupported(IIIIJ)Z\" since=\"29\"/>\n\t\t<field name=\"BLOB\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"DS_24UI8\" since=\"28\"/>\n\t\t<field name=\"DS_FP32UI8\" since=\"28\"/>\n\t\t<field name=\"D_16\" since=\"28\"/>\n\t\t<field name=\"D_24\" since=\"28\"/>\n\t\t<field name=\"D_FP32\" since=\"28\"/>\n\t\t<field name=\"RGBA_1010102\"/>\n\t\t<field name=\"RGBA_8888\"/>\n\t\t<field name=\"RGBA_FP16\"/>\n\t\t<field name=\"RGBX_8888\"/>\n\t\t<field name=\"RGB_565\"/>\n\t\t<field name=\"RGB_888\"/>\n\t\t<field name=\"S_UI8\" since=\"28\"/>\n\t\t<field name=\"USAGE_CPU_READ_OFTEN\"/>\n\t\t<field name=\"USAGE_CPU_READ_RARELY\"/>\n\t\t<field name=\"USAGE_CPU_WRITE_OFTEN\"/>\n\t\t<field name=\"USAGE_CPU_WRITE_RARELY\"/>\n\t\t<field name=\"USAGE_GPU_COLOR_OUTPUT\"/>\n\t\t<field name=\"USAGE_GPU_CUBE_MAP\" since=\"28\"/>\n\t\t<field name=\"USAGE_GPU_DATA_BUFFER\"/>\n\t\t<field name=\"USAGE_GPU_MIPMAP_COMPLETE\" since=\"28\"/>\n\t\t<field name=\"USAGE_GPU_SAMPLED_IMAGE\"/>\n\t\t<field name=\"USAGE_PROTECTED_CONTENT\"/>\n\t\t<field name=\"USAGE_SENSOR_DIRECT_DATA\"/>\n\t\t<field name=\"USAGE_VIDEO_ENCODE\"/>\n\t</class>\n\t<class name=\"android/hardware/Sensor\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getFifoMaxEventCount()I\" since=\"19\"/>\n\t\t<method name=\"getFifoReservedEventCount()I\" since=\"19\"/>\n\t\t<method name=\"getHighestDirectReportRateLevel()I\" since=\"26\"/>\n\t\t<method name=\"getId()I\" since=\"24\"/>\n\t\t<method name=\"getMaxDelay()I\" since=\"21\"/>\n\t\t<method name=\"getMaximumRange()F\"/>\n\t\t<method name=\"getMinDelay()I\" since=\"9\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getPower()F\"/>\n\t\t<method name=\"getReportingMode()I\" since=\"21\"/>\n\t\t<method name=\"getResolution()F\"/>\n\t\t<method name=\"getStringType()Ljava/lang/String;\" since=\"20\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<method name=\"getVendor()Ljava/lang/String;\"/>\n\t\t<method name=\"getVersion()I\"/>\n\t\t<method name=\"isAdditionalInfoSupported()Z\" since=\"24\"/>\n\t\t<method name=\"isDirectChannelTypeSupported(I)Z\" since=\"26\"/>\n\t\t<method name=\"isDynamicSensor()Z\" since=\"24\"/>\n\t\t<method name=\"isWakeUpSensor()Z\" since=\"21\"/>\n\t\t<field name=\"REPORTING_MODE_CONTINUOUS\" since=\"21\"/>\n\t\t<field name=\"REPORTING_MODE_ONE_SHOT\" since=\"21\"/>\n\t\t<field name=\"REPORTING_MODE_ON_CHANGE\" since=\"21\"/>\n\t\t<field name=\"REPORTING_MODE_SPECIAL_TRIGGER\" since=\"21\"/>\n\t\t<field name=\"STRING_TYPE_ACCELEROMETER\" since=\"20\"/>\n\t\t<field name=\"STRING_TYPE_ACCELEROMETER_UNCALIBRATED\" since=\"26\"/>\n\t\t<field name=\"STRING_TYPE_AMBIENT_TEMPERATURE\" since=\"20\"/>\n\t\t<field name=\"STRING_TYPE_GAME_ROTATION_VECTOR\" since=\"20\"/>\n\t\t<field name=\"STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR\" since=\"20\"/>\n\t\t<field name=\"STRING_TYPE_GRAVITY\" since=\"20\"/>\n\t\t<field name=\"STRING_TYPE_GYROSCOPE\" since=\"20\"/>\n\t\t<field name=\"STRING_TYPE_GYROSCOPE_UNCALIBRATED\" since=\"20\"/>\n\t\t<field name=\"STRING_TYPE_HEART_BEAT\" since=\"24\"/>\n\t\t<field name=\"STRING_TYPE_HEART_RATE\" since=\"20\"/>\n\t\t<field name=\"STRING_TYPE_LIGHT\" since=\"20\"/>\n\t\t<field name=\"STRING_TYPE_LINEAR_ACCELERATION\" since=\"20\"/>\n\t\t<field name=\"STRING_TYPE_LOW_LATENCY_OFFBODY_DETECT\" since=\"26\"/>\n\t\t<field name=\"STRING_TYPE_MAGNETIC_FIELD\" since=\"20\"/>\n\t\t<field name=\"STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED\" since=\"20\"/>\n\t\t<field name=\"STRING_TYPE_MOTION_DETECT\" since=\"24\"/>\n\t\t<field name=\"STRING_TYPE_ORIENTATION\" since=\"20\" deprecated=\"20\"/>\n\t\t<field name=\"STRING_TYPE_POSE_6DOF\" since=\"24\"/>\n\t\t<field name=\"STRING_TYPE_PRESSURE\" since=\"20\"/>\n\t\t<field name=\"STRING_TYPE_PROXIMITY\" since=\"20\"/>\n\t\t<field name=\"STRING_TYPE_RELATIVE_HUMIDITY\" since=\"20\"/>\n\t\t<field name=\"STRING_TYPE_ROTATION_VECTOR\" since=\"20\"/>\n\t\t<field name=\"STRING_TYPE_SIGNIFICANT_MOTION\" since=\"20\"/>\n\t\t<field name=\"STRING_TYPE_STATIONARY_DETECT\" since=\"24\"/>\n\t\t<field name=\"STRING_TYPE_STEP_COUNTER\" since=\"20\"/>\n\t\t<field name=\"STRING_TYPE_STEP_DETECTOR\" since=\"20\"/>\n\t\t<field name=\"STRING_TYPE_TEMPERATURE\" since=\"20\" deprecated=\"20\"/>\n\t\t<field name=\"TYPE_ACCELEROMETER\"/>\n\t\t<field name=\"TYPE_ACCELEROMETER_UNCALIBRATED\" since=\"26\"/>\n\t\t<field name=\"TYPE_ALL\"/>\n\t\t<field name=\"TYPE_AMBIENT_TEMPERATURE\" since=\"14\"/>\n\t\t<field name=\"TYPE_DEVICE_PRIVATE_BASE\" since=\"24\"/>\n\t\t<field name=\"TYPE_GAME_ROTATION_VECTOR\" since=\"18\"/>\n\t\t<field name=\"TYPE_GEOMAGNETIC_ROTATION_VECTOR\" since=\"19\"/>\n\t\t<field name=\"TYPE_GRAVITY\" since=\"9\"/>\n\t\t<field name=\"TYPE_GYROSCOPE\"/>\n\t\t<field name=\"TYPE_GYROSCOPE_UNCALIBRATED\" since=\"18\"/>\n\t\t<field name=\"TYPE_HEART_BEAT\" since=\"24\"/>\n\t\t<field name=\"TYPE_HEART_RATE\" since=\"20\"/>\n\t\t<field name=\"TYPE_LIGHT\"/>\n\t\t<field name=\"TYPE_LINEAR_ACCELERATION\" since=\"9\"/>\n\t\t<field name=\"TYPE_LOW_LATENCY_OFFBODY_DETECT\" since=\"26\"/>\n\t\t<field name=\"TYPE_MAGNETIC_FIELD\"/>\n\t\t<field name=\"TYPE_MAGNETIC_FIELD_UNCALIBRATED\" since=\"18\"/>\n\t\t<field name=\"TYPE_MOTION_DETECT\" since=\"24\"/>\n\t\t<field name=\"TYPE_ORIENTATION\" deprecated=\"15\"/>\n\t\t<field name=\"TYPE_POSE_6DOF\" since=\"24\"/>\n\t\t<field name=\"TYPE_PRESSURE\"/>\n\t\t<field name=\"TYPE_PROXIMITY\"/>\n\t\t<field name=\"TYPE_RELATIVE_HUMIDITY\" since=\"14\"/>\n\t\t<field name=\"TYPE_ROTATION_VECTOR\" since=\"9\"/>\n\t\t<field name=\"TYPE_SIGNIFICANT_MOTION\" since=\"18\"/>\n\t\t<field name=\"TYPE_STATIONARY_DETECT\" since=\"24\"/>\n\t\t<field name=\"TYPE_STEP_COUNTER\" since=\"19\"/>\n\t\t<field name=\"TYPE_STEP_DETECTOR\" since=\"19\"/>\n\t\t<field name=\"TYPE_TEMPERATURE\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/hardware/SensorAdditionalInfo\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"TYPE_FRAME_BEGIN\"/>\n\t\t<field name=\"TYPE_FRAME_END\"/>\n\t\t<field name=\"TYPE_INTERNAL_TEMPERATURE\"/>\n\t\t<field name=\"TYPE_SAMPLING\"/>\n\t\t<field name=\"TYPE_SENSOR_PLACEMENT\"/>\n\t\t<field name=\"TYPE_UNTRACKED_DELAY\"/>\n\t\t<field name=\"TYPE_VEC3_CALIBRATION\"/>\n\t\t<field name=\"floatValues\"/>\n\t\t<field name=\"intValues\"/>\n\t\t<field name=\"sensor\"/>\n\t\t<field name=\"serial\"/>\n\t\t<field name=\"type\"/>\n\t</class>\n\t<class name=\"android/hardware/SensorDirectChannel\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/channels/Channel\"/>\n\t\t<method name=\"configure(Landroid/hardware/Sensor;I)I\"/>\n\t\t<field name=\"RATE_FAST\"/>\n\t\t<field name=\"RATE_NORMAL\"/>\n\t\t<field name=\"RATE_STOP\"/>\n\t\t<field name=\"RATE_VERY_FAST\"/>\n\t\t<field name=\"TYPE_HARDWARE_BUFFER\"/>\n\t\t<field name=\"TYPE_MEMORY_FILE\"/>\n\t</class>\n\t<class name=\"android/hardware/SensorEvent\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"accuracy\"/>\n\t\t<field name=\"sensor\"/>\n\t\t<field name=\"timestamp\"/>\n\t\t<field name=\"values\"/>\n\t</class>\n\t<class name=\"android/hardware/SensorEventCallback\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/hardware/SensorEventListener2\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onSensorAdditionalInfo(Landroid/hardware/SensorAdditionalInfo;)V\"/>\n\t</class>\n\t<class name=\"android/hardware/SensorEventListener\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onAccuracyChanged(Landroid/hardware/Sensor;I)V\"/>\n\t\t<method name=\"onSensorChanged(Landroid/hardware/SensorEvent;)V\"/>\n\t</class>\n\t<class name=\"android/hardware/SensorEventListener2\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/hardware/SensorEventListener\"/>\n\t\t<method name=\"onFlushCompleted(Landroid/hardware/Sensor;)V\"/>\n\t</class>\n\t<class name=\"android/hardware/SensorListener\" since=\"1\" deprecated=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onAccuracyChanged(II)V\" deprecated=\"29\"/>\n\t\t<method name=\"onSensorChanged(I[F)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/hardware/SensorManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"cancelTriggerSensor(Landroid/hardware/TriggerEventListener;Landroid/hardware/Sensor;)Z\" since=\"18\"/>\n\t\t<method name=\"createDirectChannel(Landroid/hardware/HardwareBuffer;)Landroid/hardware/SensorDirectChannel;\" since=\"26\"/>\n\t\t<method name=\"createDirectChannel(Landroid/os/MemoryFile;)Landroid/hardware/SensorDirectChannel;\" since=\"26\"/>\n\t\t<method name=\"flush(Landroid/hardware/SensorEventListener;)Z\" since=\"19\"/>\n\t\t<method name=\"getAltitude(FF)F\" since=\"9\"/>\n\t\t<method name=\"getAngleChange([F[F[F)V\" since=\"9\"/>\n\t\t<method name=\"getDefaultSensor(I)Landroid/hardware/Sensor;\" since=\"3\"/>\n\t\t<method name=\"getDefaultSensor(IZ)Landroid/hardware/Sensor;\" since=\"21\"/>\n\t\t<method name=\"getDynamicSensorList(I)Ljava/util/List;\" since=\"24\"/>\n\t\t<method name=\"getInclination([F)F\" since=\"3\"/>\n\t\t<method name=\"getOrientation([F[F)[F\" since=\"3\"/>\n\t\t<method name=\"getQuaternionFromVector([F[F)V\" since=\"9\"/>\n\t\t<method name=\"getRotationMatrix([F[F[F[F)Z\" since=\"3\"/>\n\t\t<method name=\"getRotationMatrixFromVector([F[F)V\" since=\"9\"/>\n\t\t<method name=\"getSensorList(I)Ljava/util/List;\" since=\"3\"/>\n\t\t<method name=\"getSensors()I\" deprecated=\"15\"/>\n\t\t<method name=\"isDynamicSensorDiscoverySupported()Z\" since=\"24\"/>\n\t\t<method name=\"registerDynamicSensorCallback(Landroid/hardware/SensorManager$DynamicSensorCallback;)V\" since=\"24\"/>\n\t\t<method name=\"registerDynamicSensorCallback(Landroid/hardware/SensorManager$DynamicSensorCallback;Landroid/os/Handler;)V\" since=\"24\"/>\n\t\t<method name=\"registerListener(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;I)Z\" since=\"3\"/>\n\t\t<method name=\"registerListener(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;II)Z\" since=\"19\"/>\n\t\t<method name=\"registerListener(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;IILandroid/os/Handler;)Z\" since=\"19\"/>\n\t\t<method name=\"registerListener(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;ILandroid/os/Handler;)Z\" since=\"3\"/>\n\t\t<method name=\"registerListener(Landroid/hardware/SensorListener;I)Z\" deprecated=\"15\"/>\n\t\t<method name=\"registerListener(Landroid/hardware/SensorListener;II)Z\" deprecated=\"15\"/>\n\t\t<method name=\"remapCoordinateSystem([FII[F)Z\" since=\"3\"/>\n\t\t<method name=\"requestTriggerSensor(Landroid/hardware/TriggerEventListener;Landroid/hardware/Sensor;)Z\" since=\"18\"/>\n\t\t<method name=\"unregisterDynamicSensorCallback(Landroid/hardware/SensorManager$DynamicSensorCallback;)V\" since=\"24\"/>\n\t\t<method name=\"unregisterListener(Landroid/hardware/SensorEventListener;)V\" since=\"3\"/>\n\t\t<method name=\"unregisterListener(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;)V\" since=\"3\"/>\n\t\t<method name=\"unregisterListener(Landroid/hardware/SensorListener;)V\" deprecated=\"15\"/>\n\t\t<method name=\"unregisterListener(Landroid/hardware/SensorListener;I)V\" deprecated=\"15\"/>\n\t\t<field name=\"AXIS_MINUS_X\" since=\"3\"/>\n\t\t<field name=\"AXIS_MINUS_Y\" since=\"3\"/>\n\t\t<field name=\"AXIS_MINUS_Z\" since=\"3\"/>\n\t\t<field name=\"AXIS_X\" since=\"3\"/>\n\t\t<field name=\"AXIS_Y\" since=\"3\"/>\n\t\t<field name=\"AXIS_Z\" since=\"3\"/>\n\t\t<field name=\"DATA_X\" deprecated=\"15\"/>\n\t\t<field name=\"DATA_Y\" deprecated=\"15\"/>\n\t\t<field name=\"DATA_Z\" deprecated=\"15\"/>\n\t\t<field name=\"GRAVITY_DEATH_STAR_I\"/>\n\t\t<field name=\"GRAVITY_EARTH\"/>\n\t\t<field name=\"GRAVITY_JUPITER\"/>\n\t\t<field name=\"GRAVITY_MARS\"/>\n\t\t<field name=\"GRAVITY_MERCURY\"/>\n\t\t<field name=\"GRAVITY_MOON\"/>\n\t\t<field name=\"GRAVITY_NEPTUNE\"/>\n\t\t<field name=\"GRAVITY_PLUTO\"/>\n\t\t<field name=\"GRAVITY_SATURN\"/>\n\t\t<field name=\"GRAVITY_SUN\"/>\n\t\t<field name=\"GRAVITY_THE_ISLAND\"/>\n\t\t<field name=\"GRAVITY_URANUS\"/>\n\t\t<field name=\"GRAVITY_VENUS\"/>\n\t\t<field name=\"LIGHT_CLOUDY\"/>\n\t\t<field name=\"LIGHT_FULLMOON\"/>\n\t\t<field name=\"LIGHT_NO_MOON\"/>\n\t\t<field name=\"LIGHT_OVERCAST\"/>\n\t\t<field name=\"LIGHT_SHADE\"/>\n\t\t<field name=\"LIGHT_SUNLIGHT\"/>\n\t\t<field name=\"LIGHT_SUNLIGHT_MAX\"/>\n\t\t<field name=\"LIGHT_SUNRISE\"/>\n\t\t<field name=\"MAGNETIC_FIELD_EARTH_MAX\"/>\n\t\t<field name=\"MAGNETIC_FIELD_EARTH_MIN\"/>\n\t\t<field name=\"PRESSURE_STANDARD_ATMOSPHERE\" since=\"9\"/>\n\t\t<field name=\"RAW_DATA_INDEX\" deprecated=\"15\"/>\n\t\t<field name=\"RAW_DATA_X\" deprecated=\"15\"/>\n\t\t<field name=\"RAW_DATA_Y\" deprecated=\"15\"/>\n\t\t<field name=\"RAW_DATA_Z\" deprecated=\"15\"/>\n\t\t<field name=\"SENSOR_ACCELEROMETER\" deprecated=\"15\"/>\n\t\t<field name=\"SENSOR_ALL\" deprecated=\"15\"/>\n\t\t<field name=\"SENSOR_DELAY_FASTEST\"/>\n\t\t<field name=\"SENSOR_DELAY_GAME\"/>\n\t\t<field name=\"SENSOR_DELAY_NORMAL\"/>\n\t\t<field name=\"SENSOR_DELAY_UI\"/>\n\t\t<field name=\"SENSOR_LIGHT\" deprecated=\"15\"/>\n\t\t<field name=\"SENSOR_MAGNETIC_FIELD\" deprecated=\"15\"/>\n\t\t<field name=\"SENSOR_MAX\" deprecated=\"15\"/>\n\t\t<field name=\"SENSOR_MIN\" deprecated=\"15\"/>\n\t\t<field name=\"SENSOR_ORIENTATION\" deprecated=\"15\"/>\n\t\t<field name=\"SENSOR_ORIENTATION_RAW\" deprecated=\"15\"/>\n\t\t<field name=\"SENSOR_PROXIMITY\" deprecated=\"15\"/>\n\t\t<field name=\"SENSOR_STATUS_ACCURACY_HIGH\"/>\n\t\t<field name=\"SENSOR_STATUS_ACCURACY_LOW\"/>\n\t\t<field name=\"SENSOR_STATUS_ACCURACY_MEDIUM\"/>\n\t\t<field name=\"SENSOR_STATUS_NO_CONTACT\" since=\"20\"/>\n\t\t<field name=\"SENSOR_STATUS_UNRELIABLE\"/>\n\t\t<field name=\"SENSOR_TEMPERATURE\" deprecated=\"15\"/>\n\t\t<field name=\"SENSOR_TRICORDER\" deprecated=\"15\"/>\n\t\t<field name=\"STANDARD_GRAVITY\"/>\n\t</class>\n\t<class name=\"android/hardware/SensorManager$DynamicSensorCallback\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onDynamicSensorConnected(Landroid/hardware/Sensor;)V\"/>\n\t\t<method name=\"onDynamicSensorDisconnected(Landroid/hardware/Sensor;)V\"/>\n\t</class>\n\t<class name=\"android/hardware/TriggerEvent\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"sensor\"/>\n\t\t<field name=\"timestamp\"/>\n\t\t<field name=\"values\"/>\n\t</class>\n\t<class name=\"android/hardware/TriggerEventListener\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onTrigger(Landroid/hardware/TriggerEvent;)V\"/>\n\t</class>\n\t<class name=\"android/hardware/biometrics/BiometricManager\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"canAuthenticate()I\"/>\n\t\t<field name=\"BIOMETRIC_ERROR_HW_UNAVAILABLE\"/>\n\t\t<field name=\"BIOMETRIC_ERROR_NONE_ENROLLED\"/>\n\t\t<field name=\"BIOMETRIC_ERROR_NO_HARDWARE\"/>\n\t\t<field name=\"BIOMETRIC_SUCCESS\"/>\n\t</class>\n\t<class name=\"android/hardware/biometrics/BiometricPrompt\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"authenticate(Landroid/hardware/biometrics/BiometricPrompt$CryptoObject;Landroid/os/CancellationSignal;Ljava/util/concurrent/Executor;Landroid/hardware/biometrics/BiometricPrompt$AuthenticationCallback;)V\"/>\n\t\t<method name=\"authenticate(Landroid/os/CancellationSignal;Ljava/util/concurrent/Executor;Landroid/hardware/biometrics/BiometricPrompt$AuthenticationCallback;)V\"/>\n\t\t<field name=\"BIOMETRIC_ACQUIRED_GOOD\"/>\n\t\t<field name=\"BIOMETRIC_ACQUIRED_IMAGER_DIRTY\"/>\n\t\t<field name=\"BIOMETRIC_ACQUIRED_INSUFFICIENT\"/>\n\t\t<field name=\"BIOMETRIC_ACQUIRED_PARTIAL\"/>\n\t\t<field name=\"BIOMETRIC_ACQUIRED_TOO_FAST\"/>\n\t\t<field name=\"BIOMETRIC_ACQUIRED_TOO_SLOW\"/>\n\t\t<field name=\"BIOMETRIC_ERROR_CANCELED\"/>\n\t\t<field name=\"BIOMETRIC_ERROR_HW_NOT_PRESENT\"/>\n\t\t<field name=\"BIOMETRIC_ERROR_HW_UNAVAILABLE\"/>\n\t\t<field name=\"BIOMETRIC_ERROR_LOCKOUT\"/>\n\t\t<field name=\"BIOMETRIC_ERROR_LOCKOUT_PERMANENT\"/>\n\t\t<field name=\"BIOMETRIC_ERROR_NO_BIOMETRICS\"/>\n\t\t<field name=\"BIOMETRIC_ERROR_NO_DEVICE_CREDENTIAL\" since=\"29\"/>\n\t\t<field name=\"BIOMETRIC_ERROR_NO_SPACE\"/>\n\t\t<field name=\"BIOMETRIC_ERROR_TIMEOUT\"/>\n\t\t<field name=\"BIOMETRIC_ERROR_UNABLE_TO_PROCESS\"/>\n\t\t<field name=\"BIOMETRIC_ERROR_USER_CANCELED\"/>\n\t\t<field name=\"BIOMETRIC_ERROR_VENDOR\"/>\n\t</class>\n\t<class name=\"android/hardware/biometrics/BiometricPrompt$AuthenticationCallback\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onAuthenticationError(ILjava/lang/CharSequence;)V\"/>\n\t\t<method name=\"onAuthenticationFailed()V\"/>\n\t\t<method name=\"onAuthenticationHelp(ILjava/lang/CharSequence;)V\"/>\n\t\t<method name=\"onAuthenticationSucceeded(Landroid/hardware/biometrics/BiometricPrompt$AuthenticationResult;)V\"/>\n\t</class>\n\t<class name=\"android/hardware/biometrics/BiometricPrompt$AuthenticationResult\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getCryptoObject()Landroid/hardware/biometrics/BiometricPrompt$CryptoObject;\"/>\n\t</class>\n\t<class name=\"android/hardware/biometrics/BiometricPrompt$Builder\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"build()Landroid/hardware/biometrics/BiometricPrompt;\"/>\n\t\t<method name=\"setConfirmationRequired(Z)Landroid/hardware/biometrics/BiometricPrompt$Builder;\" since=\"29\"/>\n\t\t<method name=\"setDescription(Ljava/lang/CharSequence;)Landroid/hardware/biometrics/BiometricPrompt$Builder;\"/>\n\t\t<method name=\"setDeviceCredentialAllowed(Z)Landroid/hardware/biometrics/BiometricPrompt$Builder;\" since=\"29\"/>\n\t\t<method name=\"setNegativeButton(Ljava/lang/CharSequence;Ljava/util/concurrent/Executor;Landroid/content/DialogInterface$OnClickListener;)Landroid/hardware/biometrics/BiometricPrompt$Builder;\"/>\n\t\t<method name=\"setSubtitle(Ljava/lang/CharSequence;)Landroid/hardware/biometrics/BiometricPrompt$Builder;\"/>\n\t\t<method name=\"setTitle(Ljava/lang/CharSequence;)Landroid/hardware/biometrics/BiometricPrompt$Builder;\"/>\n\t</class>\n\t<class name=\"android/hardware/biometrics/BiometricPrompt$CryptoObject\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/security/identity/IdentityCredential;)V\" since=\"30\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/Signature;)V\"/>\n\t\t<method name=\"&lt;init>(Ljavax/crypto/Cipher;)V\"/>\n\t\t<method name=\"&lt;init>(Ljavax/crypto/Mac;)V\"/>\n\t\t<method name=\"getCipher()Ljavax/crypto/Cipher;\"/>\n\t\t<method name=\"getIdentityCredential()Landroid/security/identity/IdentityCredential;\" since=\"30\"/>\n\t\t<method name=\"getMac()Ljavax/crypto/Mac;\"/>\n\t\t<method name=\"getSignature()Ljava/security/Signature;\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/CameraAccessException\" since=\"21\">\n\t\t<extends name=\"android/util/AndroidException\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/Throwable;)V\"/>\n\t\t<method name=\"getReason()I\"/>\n\t\t<field name=\"CAMERA_DISABLED\"/>\n\t\t<field name=\"CAMERA_DISCONNECTED\"/>\n\t\t<field name=\"CAMERA_ERROR\"/>\n\t\t<field name=\"CAMERA_IN_USE\" since=\"23\"/>\n\t\t<field name=\"MAX_CAMERAS_IN_USE\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/CameraCaptureSession\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"abortCaptures()V\"/>\n\t\t<method name=\"capture(Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/CameraCaptureSession$CaptureCallback;Landroid/os/Handler;)I\"/>\n\t\t<method name=\"captureBurst(Ljava/util/List;Landroid/hardware/camera2/CameraCaptureSession$CaptureCallback;Landroid/os/Handler;)I\"/>\n\t\t<method name=\"captureBurstRequests(Ljava/util/List;Ljava/util/concurrent/Executor;Landroid/hardware/camera2/CameraCaptureSession$CaptureCallback;)I\" since=\"28\"/>\n\t\t<method name=\"captureSingleRequest(Landroid/hardware/camera2/CaptureRequest;Ljava/util/concurrent/Executor;Landroid/hardware/camera2/CameraCaptureSession$CaptureCallback;)I\" since=\"28\"/>\n\t\t<method name=\"finalizeOutputConfigurations(Ljava/util/List;)V\" since=\"26\"/>\n\t\t<method name=\"getDevice()Landroid/hardware/camera2/CameraDevice;\"/>\n\t\t<method name=\"getInputSurface()Landroid/view/Surface;\" since=\"23\"/>\n\t\t<method name=\"isReprocessable()Z\" since=\"23\"/>\n\t\t<method name=\"prepare(Landroid/view/Surface;)V\" since=\"23\"/>\n\t\t<method name=\"setRepeatingBurst(Ljava/util/List;Landroid/hardware/camera2/CameraCaptureSession$CaptureCallback;Landroid/os/Handler;)I\"/>\n\t\t<method name=\"setRepeatingBurstRequests(Ljava/util/List;Ljava/util/concurrent/Executor;Landroid/hardware/camera2/CameraCaptureSession$CaptureCallback;)I\" since=\"28\"/>\n\t\t<method name=\"setRepeatingRequest(Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/CameraCaptureSession$CaptureCallback;Landroid/os/Handler;)I\"/>\n\t\t<method name=\"setSingleRepeatingRequest(Landroid/hardware/camera2/CaptureRequest;Ljava/util/concurrent/Executor;Landroid/hardware/camera2/CameraCaptureSession$CaptureCallback;)I\" since=\"28\"/>\n\t\t<method name=\"stopRepeating()V\"/>\n\t\t<method name=\"updateOutputConfiguration(Landroid/hardware/camera2/params/OutputConfiguration;)V\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/CameraCaptureSession$CaptureCallback\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCaptureBufferLost(Landroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/view/Surface;J)V\" since=\"24\"/>\n\t\t<method name=\"onCaptureCompleted(Landroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/TotalCaptureResult;)V\"/>\n\t\t<method name=\"onCaptureFailed(Landroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/CaptureFailure;)V\"/>\n\t\t<method name=\"onCaptureProgressed(Landroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/CaptureResult;)V\"/>\n\t\t<method name=\"onCaptureSequenceAborted(Landroid/hardware/camera2/CameraCaptureSession;I)V\"/>\n\t\t<method name=\"onCaptureSequenceCompleted(Landroid/hardware/camera2/CameraCaptureSession;IJ)V\"/>\n\t\t<method name=\"onCaptureStarted(Landroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;JJ)V\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/CameraCaptureSession$StateCallback\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onActive(Landroid/hardware/camera2/CameraCaptureSession;)V\"/>\n\t\t<method name=\"onCaptureQueueEmpty(Landroid/hardware/camera2/CameraCaptureSession;)V\" since=\"26\"/>\n\t\t<method name=\"onClosed(Landroid/hardware/camera2/CameraCaptureSession;)V\"/>\n\t\t<method name=\"onConfigureFailed(Landroid/hardware/camera2/CameraCaptureSession;)V\"/>\n\t\t<method name=\"onConfigured(Landroid/hardware/camera2/CameraCaptureSession;)V\"/>\n\t\t<method name=\"onReady(Landroid/hardware/camera2/CameraCaptureSession;)V\"/>\n\t\t<method name=\"onSurfacePrepared(Landroid/hardware/camera2/CameraCaptureSession;Landroid/view/Surface;)V\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/CameraCharacteristics\" since=\"21\">\n\t\t<extends name=\"android/hardware/camera2/CameraMetadata\"/>\n\t\t<method name=\"get(Landroid/hardware/camera2/CameraCharacteristics$Key;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getAvailableCaptureRequestKeys()Ljava/util/List;\"/>\n\t\t<method name=\"getAvailableCaptureResultKeys()Ljava/util/List;\"/>\n\t\t<method name=\"getAvailablePhysicalCameraRequestKeys()Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"getAvailableSessionKeys()Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"getKeysNeedingPermission()Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"getPhysicalCameraIds()Ljava/util/Set;\" since=\"28\"/>\n\t\t<method name=\"getRecommendedStreamConfigurationMap(I)Landroid/hardware/camera2/params/RecommendedStreamConfigurationMap;\" since=\"29\"/>\n\t\t<field name=\"COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES\"/>\n\t\t<field name=\"CONTROL_AE_AVAILABLE_ANTIBANDING_MODES\"/>\n\t\t<field name=\"CONTROL_AE_AVAILABLE_MODES\"/>\n\t\t<field name=\"CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES\"/>\n\t\t<field name=\"CONTROL_AE_COMPENSATION_RANGE\"/>\n\t\t<field name=\"CONTROL_AE_COMPENSATION_STEP\"/>\n\t\t<field name=\"CONTROL_AE_LOCK_AVAILABLE\" since=\"23\"/>\n\t\t<field name=\"CONTROL_AF_AVAILABLE_MODES\"/>\n\t\t<field name=\"CONTROL_AVAILABLE_EFFECTS\"/>\n\t\t<field name=\"CONTROL_AVAILABLE_MODES\" since=\"23\"/>\n\t\t<field name=\"CONTROL_AVAILABLE_SCENE_MODES\"/>\n\t\t<field name=\"CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES\"/>\n\t\t<field name=\"CONTROL_AWB_AVAILABLE_MODES\"/>\n\t\t<field name=\"CONTROL_AWB_LOCK_AVAILABLE\" since=\"23\"/>\n\t\t<field name=\"CONTROL_MAX_REGIONS_AE\"/>\n\t\t<field name=\"CONTROL_MAX_REGIONS_AF\"/>\n\t\t<field name=\"CONTROL_MAX_REGIONS_AWB\"/>\n\t\t<field name=\"CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE\" since=\"24\"/>\n\t\t<field name=\"DEPTH_DEPTH_IS_EXCLUSIVE\" since=\"23\"/>\n\t\t<field name=\"DISTORTION_CORRECTION_AVAILABLE_MODES\" since=\"28\"/>\n\t\t<field name=\"EDGE_AVAILABLE_EDGE_MODES\"/>\n\t\t<field name=\"FLASH_INFO_AVAILABLE\"/>\n\t\t<field name=\"HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES\"/>\n\t\t<field name=\"INFO_SUPPORTED_HARDWARE_LEVEL\"/>\n\t\t<field name=\"INFO_VERSION\" since=\"28\"/>\n\t\t<field name=\"JPEG_AVAILABLE_THUMBNAIL_SIZES\"/>\n\t\t<field name=\"LENS_DISTORTION\" since=\"28\"/>\n\t\t<field name=\"LENS_FACING\"/>\n\t\t<field name=\"LENS_INFO_AVAILABLE_APERTURES\"/>\n\t\t<field name=\"LENS_INFO_AVAILABLE_FILTER_DENSITIES\"/>\n\t\t<field name=\"LENS_INFO_AVAILABLE_FOCAL_LENGTHS\"/>\n\t\t<field name=\"LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION\"/>\n\t\t<field name=\"LENS_INFO_FOCUS_DISTANCE_CALIBRATION\"/>\n\t\t<field name=\"LENS_INFO_HYPERFOCAL_DISTANCE\"/>\n\t\t<field name=\"LENS_INFO_MINIMUM_FOCUS_DISTANCE\"/>\n\t\t<field name=\"LENS_INTRINSIC_CALIBRATION\" since=\"23\"/>\n\t\t<field name=\"LENS_POSE_REFERENCE\" since=\"28\"/>\n\t\t<field name=\"LENS_POSE_ROTATION\" since=\"23\"/>\n\t\t<field name=\"LENS_POSE_TRANSLATION\" since=\"23\"/>\n\t\t<field name=\"LENS_RADIAL_DISTORTION\" since=\"23\" deprecated=\"28\"/>\n\t\t<field name=\"LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE\" since=\"28\"/>\n\t\t<field name=\"NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES\"/>\n\t\t<field name=\"REPROCESS_MAX_CAPTURE_STALL\" since=\"23\"/>\n\t\t<field name=\"REQUEST_AVAILABLE_CAPABILITIES\"/>\n\t\t<field name=\"REQUEST_MAX_NUM_INPUT_STREAMS\" since=\"23\"/>\n\t\t<field name=\"REQUEST_MAX_NUM_OUTPUT_PROC\"/>\n\t\t<field name=\"REQUEST_MAX_NUM_OUTPUT_PROC_STALLING\"/>\n\t\t<field name=\"REQUEST_MAX_NUM_OUTPUT_RAW\"/>\n\t\t<field name=\"REQUEST_PARTIAL_RESULT_COUNT\"/>\n\t\t<field name=\"REQUEST_PIPELINE_MAX_DEPTH\"/>\n\t\t<field name=\"SCALER_AVAILABLE_MAX_DIGITAL_ZOOM\"/>\n\t\t<field name=\"SCALER_CROPPING_TYPE\"/>\n\t\t<field name=\"SCALER_MANDATORY_STREAM_COMBINATIONS\" since=\"29\"/>\n\t\t<field name=\"SCALER_STREAM_CONFIGURATION_MAP\"/>\n\t\t<field name=\"SENSOR_AVAILABLE_TEST_PATTERN_MODES\"/>\n\t\t<field name=\"SENSOR_BLACK_LEVEL_PATTERN\"/>\n\t\t<field name=\"SENSOR_CALIBRATION_TRANSFORM1\"/>\n\t\t<field name=\"SENSOR_CALIBRATION_TRANSFORM2\"/>\n\t\t<field name=\"SENSOR_COLOR_TRANSFORM1\"/>\n\t\t<field name=\"SENSOR_COLOR_TRANSFORM2\"/>\n\t\t<field name=\"SENSOR_FORWARD_MATRIX1\"/>\n\t\t<field name=\"SENSOR_FORWARD_MATRIX2\"/>\n\t\t<field name=\"SENSOR_INFO_ACTIVE_ARRAY_SIZE\"/>\n\t\t<field name=\"SENSOR_INFO_COLOR_FILTER_ARRANGEMENT\"/>\n\t\t<field name=\"SENSOR_INFO_EXPOSURE_TIME_RANGE\"/>\n\t\t<field name=\"SENSOR_INFO_LENS_SHADING_APPLIED\" since=\"23\"/>\n\t\t<field name=\"SENSOR_INFO_MAX_FRAME_DURATION\"/>\n\t\t<field name=\"SENSOR_INFO_PHYSICAL_SIZE\"/>\n\t\t<field name=\"SENSOR_INFO_PIXEL_ARRAY_SIZE\"/>\n\t\t<field name=\"SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE\" since=\"23\"/>\n\t\t<field name=\"SENSOR_INFO_SENSITIVITY_RANGE\"/>\n\t\t<field name=\"SENSOR_INFO_TIMESTAMP_SOURCE\"/>\n\t\t<field name=\"SENSOR_INFO_WHITE_LEVEL\"/>\n\t\t<field name=\"SENSOR_MAX_ANALOG_SENSITIVITY\"/>\n\t\t<field name=\"SENSOR_OPTICAL_BLACK_REGIONS\" since=\"24\"/>\n\t\t<field name=\"SENSOR_ORIENTATION\"/>\n\t\t<field name=\"SENSOR_REFERENCE_ILLUMINANT1\"/>\n\t\t<field name=\"SENSOR_REFERENCE_ILLUMINANT2\"/>\n\t\t<field name=\"SHADING_AVAILABLE_MODES\" since=\"23\"/>\n\t\t<field name=\"STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES\"/>\n\t\t<field name=\"STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES\"/>\n\t\t<field name=\"STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES\" since=\"23\"/>\n\t\t<field name=\"STATISTICS_INFO_AVAILABLE_OIS_DATA_MODES\" since=\"28\"/>\n\t\t<field name=\"STATISTICS_INFO_MAX_FACE_COUNT\"/>\n\t\t<field name=\"SYNC_MAX_LATENCY\"/>\n\t\t<field name=\"TONEMAP_AVAILABLE_TONE_MAP_MODES\"/>\n\t\t<field name=\"TONEMAP_MAX_CURVE_POINTS\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/CameraCharacteristics$Key\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Class;)V\" since=\"29\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/CameraConstrainedHighSpeedCaptureSession\" since=\"23\">\n\t\t<extends name=\"android/hardware/camera2/CameraCaptureSession\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"createHighSpeedRequestList(Landroid/hardware/camera2/CaptureRequest;)Ljava/util/List;\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/CameraDevice\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"createCaptureRequest(I)Landroid/hardware/camera2/CaptureRequest$Builder;\"/>\n\t\t<method name=\"createCaptureRequest(ILjava/util/Set;)Landroid/hardware/camera2/CaptureRequest$Builder;\" since=\"28\"/>\n\t\t<method name=\"createCaptureSession(Landroid/hardware/camera2/params/SessionConfiguration;)V\" since=\"28\"/>\n\t\t<method name=\"createCaptureSession(Ljava/util/List;Landroid/hardware/camera2/CameraCaptureSession$StateCallback;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"createCaptureSessionByOutputConfigurations(Ljava/util/List;Landroid/hardware/camera2/CameraCaptureSession$StateCallback;Landroid/os/Handler;)V\" since=\"24\"/>\n\t\t<method name=\"createConstrainedHighSpeedCaptureSession(Ljava/util/List;Landroid/hardware/camera2/CameraCaptureSession$StateCallback;Landroid/os/Handler;)V\" since=\"23\"/>\n\t\t<method name=\"createReprocessCaptureRequest(Landroid/hardware/camera2/TotalCaptureResult;)Landroid/hardware/camera2/CaptureRequest$Builder;\" since=\"23\"/>\n\t\t<method name=\"createReprocessableCaptureSession(Landroid/hardware/camera2/params/InputConfiguration;Ljava/util/List;Landroid/hardware/camera2/CameraCaptureSession$StateCallback;Landroid/os/Handler;)V\" since=\"23\"/>\n\t\t<method name=\"createReprocessableCaptureSessionByConfigurations(Landroid/hardware/camera2/params/InputConfiguration;Ljava/util/List;Landroid/hardware/camera2/CameraCaptureSession$StateCallback;Landroid/os/Handler;)V\" since=\"24\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\"/>\n\t\t<method name=\"isSessionConfigurationSupported(Landroid/hardware/camera2/params/SessionConfiguration;)Z\" since=\"29\"/>\n\t\t<field name=\"TEMPLATE_MANUAL\"/>\n\t\t<field name=\"TEMPLATE_PREVIEW\"/>\n\t\t<field name=\"TEMPLATE_RECORD\"/>\n\t\t<field name=\"TEMPLATE_STILL_CAPTURE\"/>\n\t\t<field name=\"TEMPLATE_VIDEO_SNAPSHOT\"/>\n\t\t<field name=\"TEMPLATE_ZERO_SHUTTER_LAG\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/CameraDevice$StateCallback\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onClosed(Landroid/hardware/camera2/CameraDevice;)V\"/>\n\t\t<method name=\"onDisconnected(Landroid/hardware/camera2/CameraDevice;)V\"/>\n\t\t<method name=\"onError(Landroid/hardware/camera2/CameraDevice;I)V\"/>\n\t\t<method name=\"onOpened(Landroid/hardware/camera2/CameraDevice;)V\"/>\n\t\t<field name=\"ERROR_CAMERA_DEVICE\"/>\n\t\t<field name=\"ERROR_CAMERA_DISABLED\"/>\n\t\t<field name=\"ERROR_CAMERA_IN_USE\"/>\n\t\t<field name=\"ERROR_CAMERA_SERVICE\"/>\n\t\t<field name=\"ERROR_MAX_CAMERAS_IN_USE\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/CameraManager\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getCameraCharacteristics(Ljava/lang/String;)Landroid/hardware/camera2/CameraCharacteristics;\"/>\n\t\t<method name=\"getCameraIdList()[Ljava/lang/String;\"/>\n\t\t<method name=\"openCamera(Ljava/lang/String;Landroid/hardware/camera2/CameraDevice$StateCallback;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"openCamera(Ljava/lang/String;Ljava/util/concurrent/Executor;Landroid/hardware/camera2/CameraDevice$StateCallback;)V\" since=\"28\"/>\n\t\t<method name=\"registerAvailabilityCallback(Landroid/hardware/camera2/CameraManager$AvailabilityCallback;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"registerAvailabilityCallback(Ljava/util/concurrent/Executor;Landroid/hardware/camera2/CameraManager$AvailabilityCallback;)V\" since=\"28\"/>\n\t\t<method name=\"registerTorchCallback(Landroid/hardware/camera2/CameraManager$TorchCallback;Landroid/os/Handler;)V\" since=\"23\"/>\n\t\t<method name=\"registerTorchCallback(Ljava/util/concurrent/Executor;Landroid/hardware/camera2/CameraManager$TorchCallback;)V\" since=\"28\"/>\n\t\t<method name=\"setTorchMode(Ljava/lang/String;Z)V\" since=\"23\"/>\n\t\t<method name=\"unregisterAvailabilityCallback(Landroid/hardware/camera2/CameraManager$AvailabilityCallback;)V\"/>\n\t\t<method name=\"unregisterTorchCallback(Landroid/hardware/camera2/CameraManager$TorchCallback;)V\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/CameraManager$AvailabilityCallback\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCameraAccessPrioritiesChanged()V\" since=\"29\"/>\n\t\t<method name=\"onCameraAvailable(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onCameraUnavailable(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/CameraManager$TorchCallback\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onTorchModeChanged(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"onTorchModeUnavailable(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/CameraMetadata\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getKeys()Ljava/util/List;\"/>\n\t\t<field name=\"COLOR_CORRECTION_ABERRATION_MODE_FAST\"/>\n\t\t<field name=\"COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY\"/>\n\t\t<field name=\"COLOR_CORRECTION_ABERRATION_MODE_OFF\"/>\n\t\t<field name=\"COLOR_CORRECTION_MODE_FAST\"/>\n\t\t<field name=\"COLOR_CORRECTION_MODE_HIGH_QUALITY\"/>\n\t\t<field name=\"COLOR_CORRECTION_MODE_TRANSFORM_MATRIX\"/>\n\t\t<field name=\"CONTROL_AE_ANTIBANDING_MODE_50HZ\"/>\n\t\t<field name=\"CONTROL_AE_ANTIBANDING_MODE_60HZ\"/>\n\t\t<field name=\"CONTROL_AE_ANTIBANDING_MODE_AUTO\"/>\n\t\t<field name=\"CONTROL_AE_ANTIBANDING_MODE_OFF\"/>\n\t\t<field name=\"CONTROL_AE_MODE_OFF\"/>\n\t\t<field name=\"CONTROL_AE_MODE_ON\"/>\n\t\t<field name=\"CONTROL_AE_MODE_ON_ALWAYS_FLASH\"/>\n\t\t<field name=\"CONTROL_AE_MODE_ON_AUTO_FLASH\"/>\n\t\t<field name=\"CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE\"/>\n\t\t<field name=\"CONTROL_AE_MODE_ON_EXTERNAL_FLASH\" since=\"28\"/>\n\t\t<field name=\"CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL\" since=\"23\"/>\n\t\t<field name=\"CONTROL_AE_PRECAPTURE_TRIGGER_IDLE\"/>\n\t\t<field name=\"CONTROL_AE_PRECAPTURE_TRIGGER_START\"/>\n\t\t<field name=\"CONTROL_AE_STATE_CONVERGED\"/>\n\t\t<field name=\"CONTROL_AE_STATE_FLASH_REQUIRED\"/>\n\t\t<field name=\"CONTROL_AE_STATE_INACTIVE\"/>\n\t\t<field name=\"CONTROL_AE_STATE_LOCKED\"/>\n\t\t<field name=\"CONTROL_AE_STATE_PRECAPTURE\"/>\n\t\t<field name=\"CONTROL_AE_STATE_SEARCHING\"/>\n\t\t<field name=\"CONTROL_AF_MODE_AUTO\"/>\n\t\t<field name=\"CONTROL_AF_MODE_CONTINUOUS_PICTURE\"/>\n\t\t<field name=\"CONTROL_AF_MODE_CONTINUOUS_VIDEO\"/>\n\t\t<field name=\"CONTROL_AF_MODE_EDOF\"/>\n\t\t<field name=\"CONTROL_AF_MODE_MACRO\"/>\n\t\t<field name=\"CONTROL_AF_MODE_OFF\"/>\n\t\t<field name=\"CONTROL_AF_SCENE_CHANGE_DETECTED\" since=\"28\"/>\n\t\t<field name=\"CONTROL_AF_SCENE_CHANGE_NOT_DETECTED\" since=\"28\"/>\n\t\t<field name=\"CONTROL_AF_STATE_ACTIVE_SCAN\"/>\n\t\t<field name=\"CONTROL_AF_STATE_FOCUSED_LOCKED\"/>\n\t\t<field name=\"CONTROL_AF_STATE_INACTIVE\"/>\n\t\t<field name=\"CONTROL_AF_STATE_NOT_FOCUSED_LOCKED\"/>\n\t\t<field name=\"CONTROL_AF_STATE_PASSIVE_FOCUSED\"/>\n\t\t<field name=\"CONTROL_AF_STATE_PASSIVE_SCAN\"/>\n\t\t<field name=\"CONTROL_AF_STATE_PASSIVE_UNFOCUSED\"/>\n\t\t<field name=\"CONTROL_AF_TRIGGER_CANCEL\"/>\n\t\t<field name=\"CONTROL_AF_TRIGGER_IDLE\"/>\n\t\t<field name=\"CONTROL_AF_TRIGGER_START\"/>\n\t\t<field name=\"CONTROL_AWB_MODE_AUTO\"/>\n\t\t<field name=\"CONTROL_AWB_MODE_CLOUDY_DAYLIGHT\"/>\n\t\t<field name=\"CONTROL_AWB_MODE_DAYLIGHT\"/>\n\t\t<field name=\"CONTROL_AWB_MODE_FLUORESCENT\"/>\n\t\t<field name=\"CONTROL_AWB_MODE_INCANDESCENT\"/>\n\t\t<field name=\"CONTROL_AWB_MODE_OFF\"/>\n\t\t<field name=\"CONTROL_AWB_MODE_SHADE\"/>\n\t\t<field name=\"CONTROL_AWB_MODE_TWILIGHT\"/>\n\t\t<field name=\"CONTROL_AWB_MODE_WARM_FLUORESCENT\"/>\n\t\t<field name=\"CONTROL_AWB_STATE_CONVERGED\"/>\n\t\t<field name=\"CONTROL_AWB_STATE_INACTIVE\"/>\n\t\t<field name=\"CONTROL_AWB_STATE_LOCKED\"/>\n\t\t<field name=\"CONTROL_AWB_STATE_SEARCHING\"/>\n\t\t<field name=\"CONTROL_CAPTURE_INTENT_CUSTOM\"/>\n\t\t<field name=\"CONTROL_CAPTURE_INTENT_MANUAL\"/>\n\t\t<field name=\"CONTROL_CAPTURE_INTENT_MOTION_TRACKING\" since=\"28\"/>\n\t\t<field name=\"CONTROL_CAPTURE_INTENT_PREVIEW\"/>\n\t\t<field name=\"CONTROL_CAPTURE_INTENT_STILL_CAPTURE\"/>\n\t\t<field name=\"CONTROL_CAPTURE_INTENT_VIDEO_RECORD\"/>\n\t\t<field name=\"CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT\"/>\n\t\t<field name=\"CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG\"/>\n\t\t<field name=\"CONTROL_EFFECT_MODE_AQUA\"/>\n\t\t<field name=\"CONTROL_EFFECT_MODE_BLACKBOARD\"/>\n\t\t<field name=\"CONTROL_EFFECT_MODE_MONO\"/>\n\t\t<field name=\"CONTROL_EFFECT_MODE_NEGATIVE\"/>\n\t\t<field name=\"CONTROL_EFFECT_MODE_OFF\"/>\n\t\t<field name=\"CONTROL_EFFECT_MODE_POSTERIZE\"/>\n\t\t<field name=\"CONTROL_EFFECT_MODE_SEPIA\"/>\n\t\t<field name=\"CONTROL_EFFECT_MODE_SOLARIZE\"/>\n\t\t<field name=\"CONTROL_EFFECT_MODE_WHITEBOARD\"/>\n\t\t<field name=\"CONTROL_MODE_AUTO\"/>\n\t\t<field name=\"CONTROL_MODE_OFF\"/>\n\t\t<field name=\"CONTROL_MODE_OFF_KEEP_STATE\"/>\n\t\t<field name=\"CONTROL_MODE_USE_SCENE_MODE\"/>\n\t\t<field name=\"CONTROL_SCENE_MODE_ACTION\"/>\n\t\t<field name=\"CONTROL_SCENE_MODE_BARCODE\"/>\n\t\t<field name=\"CONTROL_SCENE_MODE_BEACH\"/>\n\t\t<field name=\"CONTROL_SCENE_MODE_CANDLELIGHT\"/>\n\t\t<field name=\"CONTROL_SCENE_MODE_DISABLED\"/>\n\t\t<field name=\"CONTROL_SCENE_MODE_FACE_PRIORITY\"/>\n\t\t<field name=\"CONTROL_SCENE_MODE_FIREWORKS\"/>\n\t\t<field name=\"CONTROL_SCENE_MODE_HDR\" since=\"22\"/>\n\t\t<field name=\"CONTROL_SCENE_MODE_HIGH_SPEED_VIDEO\" deprecated=\"23\"/>\n\t\t<field name=\"CONTROL_SCENE_MODE_LANDSCAPE\"/>\n\t\t<field name=\"CONTROL_SCENE_MODE_NIGHT\"/>\n\t\t<field name=\"CONTROL_SCENE_MODE_NIGHT_PORTRAIT\"/>\n\t\t<field name=\"CONTROL_SCENE_MODE_PARTY\"/>\n\t\t<field name=\"CONTROL_SCENE_MODE_PORTRAIT\"/>\n\t\t<field name=\"CONTROL_SCENE_MODE_SNOW\"/>\n\t\t<field name=\"CONTROL_SCENE_MODE_SPORTS\"/>\n\t\t<field name=\"CONTROL_SCENE_MODE_STEADYPHOTO\"/>\n\t\t<field name=\"CONTROL_SCENE_MODE_SUNSET\"/>\n\t\t<field name=\"CONTROL_SCENE_MODE_THEATRE\"/>\n\t\t<field name=\"CONTROL_VIDEO_STABILIZATION_MODE_OFF\"/>\n\t\t<field name=\"CONTROL_VIDEO_STABILIZATION_MODE_ON\"/>\n\t\t<field name=\"DISTORTION_CORRECTION_MODE_FAST\" since=\"28\"/>\n\t\t<field name=\"DISTORTION_CORRECTION_MODE_HIGH_QUALITY\" since=\"28\"/>\n\t\t<field name=\"DISTORTION_CORRECTION_MODE_OFF\" since=\"28\"/>\n\t\t<field name=\"EDGE_MODE_FAST\"/>\n\t\t<field name=\"EDGE_MODE_HIGH_QUALITY\"/>\n\t\t<field name=\"EDGE_MODE_OFF\"/>\n\t\t<field name=\"EDGE_MODE_ZERO_SHUTTER_LAG\" since=\"23\"/>\n\t\t<field name=\"FLASH_MODE_OFF\"/>\n\t\t<field name=\"FLASH_MODE_SINGLE\"/>\n\t\t<field name=\"FLASH_MODE_TORCH\"/>\n\t\t<field name=\"FLASH_STATE_CHARGING\"/>\n\t\t<field name=\"FLASH_STATE_FIRED\"/>\n\t\t<field name=\"FLASH_STATE_PARTIAL\"/>\n\t\t<field name=\"FLASH_STATE_READY\"/>\n\t\t<field name=\"FLASH_STATE_UNAVAILABLE\"/>\n\t\t<field name=\"HOT_PIXEL_MODE_FAST\"/>\n\t\t<field name=\"HOT_PIXEL_MODE_HIGH_QUALITY\"/>\n\t\t<field name=\"HOT_PIXEL_MODE_OFF\"/>\n\t\t<field name=\"INFO_SUPPORTED_HARDWARE_LEVEL_3\" since=\"24\"/>\n\t\t<field name=\"INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL\" since=\"28\"/>\n\t\t<field name=\"INFO_SUPPORTED_HARDWARE_LEVEL_FULL\"/>\n\t\t<field name=\"INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY\"/>\n\t\t<field name=\"INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED\"/>\n\t\t<field name=\"LENS_FACING_BACK\"/>\n\t\t<field name=\"LENS_FACING_EXTERNAL\" since=\"23\"/>\n\t\t<field name=\"LENS_FACING_FRONT\"/>\n\t\t<field name=\"LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE\"/>\n\t\t<field name=\"LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED\"/>\n\t\t<field name=\"LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED\"/>\n\t\t<field name=\"LENS_OPTICAL_STABILIZATION_MODE_OFF\"/>\n\t\t<field name=\"LENS_OPTICAL_STABILIZATION_MODE_ON\"/>\n\t\t<field name=\"LENS_POSE_REFERENCE_GYROSCOPE\" since=\"28\"/>\n\t\t<field name=\"LENS_POSE_REFERENCE_PRIMARY_CAMERA\" since=\"28\"/>\n\t\t<field name=\"LENS_STATE_MOVING\"/>\n\t\t<field name=\"LENS_STATE_STATIONARY\"/>\n\t\t<field name=\"LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE\" since=\"28\"/>\n\t\t<field name=\"LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED\" since=\"28\"/>\n\t\t<field name=\"NOISE_REDUCTION_MODE_FAST\"/>\n\t\t<field name=\"NOISE_REDUCTION_MODE_HIGH_QUALITY\"/>\n\t\t<field name=\"NOISE_REDUCTION_MODE_MINIMAL\" since=\"23\"/>\n\t\t<field name=\"NOISE_REDUCTION_MODE_OFF\"/>\n\t\t<field name=\"NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG\" since=\"23\"/>\n\t\t<field name=\"REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE\"/>\n\t\t<field name=\"REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE\" since=\"22\"/>\n\t\t<field name=\"REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO\" since=\"23\"/>\n\t\t<field name=\"REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT\" since=\"23\"/>\n\t\t<field name=\"REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA\" since=\"28\"/>\n\t\t<field name=\"REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING\"/>\n\t\t<field name=\"REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR\"/>\n\t\t<field name=\"REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME\" since=\"28\"/>\n\t\t<field name=\"REQUEST_AVAILABLE_CAPABILITIES_MOTION_TRACKING\" since=\"28\"/>\n\t\t<field name=\"REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING\" since=\"23\"/>\n\t\t<field name=\"REQUEST_AVAILABLE_CAPABILITIES_RAW\"/>\n\t\t<field name=\"REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS\" since=\"22\"/>\n\t\t<field name=\"REQUEST_AVAILABLE_CAPABILITIES_SECURE_IMAGE_DATA\" since=\"29\"/>\n\t\t<field name=\"REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING\" since=\"23\"/>\n\t\t<field name=\"SCALER_CROPPING_TYPE_CENTER_ONLY\"/>\n\t\t<field name=\"SCALER_CROPPING_TYPE_FREEFORM\"/>\n\t\t<field name=\"SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_BGGR\"/>\n\t\t<field name=\"SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GBRG\"/>\n\t\t<field name=\"SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GRBG\"/>\n\t\t<field name=\"SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_MONO\" since=\"29\"/>\n\t\t<field name=\"SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_NIR\" since=\"29\"/>\n\t\t<field name=\"SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGB\"/>\n\t\t<field name=\"SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGGB\"/>\n\t\t<field name=\"SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME\"/>\n\t\t<field name=\"SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN\"/>\n\t\t<field name=\"SENSOR_REFERENCE_ILLUMINANT1_CLOUDY_WEATHER\"/>\n\t\t<field name=\"SENSOR_REFERENCE_ILLUMINANT1_COOL_WHITE_FLUORESCENT\"/>\n\t\t<field name=\"SENSOR_REFERENCE_ILLUMINANT1_D50\"/>\n\t\t<field name=\"SENSOR_REFERENCE_ILLUMINANT1_D55\"/>\n\t\t<field name=\"SENSOR_REFERENCE_ILLUMINANT1_D65\"/>\n\t\t<field name=\"SENSOR_REFERENCE_ILLUMINANT1_D75\"/>\n\t\t<field name=\"SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT\"/>\n\t\t<field name=\"SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT_FLUORESCENT\"/>\n\t\t<field name=\"SENSOR_REFERENCE_ILLUMINANT1_DAY_WHITE_FLUORESCENT\"/>\n\t\t<field name=\"SENSOR_REFERENCE_ILLUMINANT1_FINE_WEATHER\"/>\n\t\t<field name=\"SENSOR_REFERENCE_ILLUMINANT1_FLASH\"/>\n\t\t<field name=\"SENSOR_REFERENCE_ILLUMINANT1_FLUORESCENT\"/>\n\t\t<field name=\"SENSOR_REFERENCE_ILLUMINANT1_ISO_STUDIO_TUNGSTEN\"/>\n\t\t<field name=\"SENSOR_REFERENCE_ILLUMINANT1_SHADE\"/>\n\t\t<field name=\"SENSOR_REFERENCE_ILLUMINANT1_STANDARD_A\"/>\n\t\t<field name=\"SENSOR_REFERENCE_ILLUMINANT1_STANDARD_B\"/>\n\t\t<field name=\"SENSOR_REFERENCE_ILLUMINANT1_STANDARD_C\"/>\n\t\t<field name=\"SENSOR_REFERENCE_ILLUMINANT1_TUNGSTEN\"/>\n\t\t<field name=\"SENSOR_REFERENCE_ILLUMINANT1_WHITE_FLUORESCENT\"/>\n\t\t<field name=\"SENSOR_TEST_PATTERN_MODE_COLOR_BARS\"/>\n\t\t<field name=\"SENSOR_TEST_PATTERN_MODE_COLOR_BARS_FADE_TO_GRAY\"/>\n\t\t<field name=\"SENSOR_TEST_PATTERN_MODE_CUSTOM1\"/>\n\t\t<field name=\"SENSOR_TEST_PATTERN_MODE_OFF\"/>\n\t\t<field name=\"SENSOR_TEST_PATTERN_MODE_PN9\"/>\n\t\t<field name=\"SENSOR_TEST_PATTERN_MODE_SOLID_COLOR\"/>\n\t\t<field name=\"SHADING_MODE_FAST\"/>\n\t\t<field name=\"SHADING_MODE_HIGH_QUALITY\"/>\n\t\t<field name=\"SHADING_MODE_OFF\"/>\n\t\t<field name=\"STATISTICS_FACE_DETECT_MODE_FULL\"/>\n\t\t<field name=\"STATISTICS_FACE_DETECT_MODE_OFF\"/>\n\t\t<field name=\"STATISTICS_FACE_DETECT_MODE_SIMPLE\"/>\n\t\t<field name=\"STATISTICS_LENS_SHADING_MAP_MODE_OFF\"/>\n\t\t<field name=\"STATISTICS_LENS_SHADING_MAP_MODE_ON\"/>\n\t\t<field name=\"STATISTICS_OIS_DATA_MODE_OFF\" since=\"28\"/>\n\t\t<field name=\"STATISTICS_OIS_DATA_MODE_ON\" since=\"28\"/>\n\t\t<field name=\"STATISTICS_SCENE_FLICKER_50HZ\"/>\n\t\t<field name=\"STATISTICS_SCENE_FLICKER_60HZ\"/>\n\t\t<field name=\"STATISTICS_SCENE_FLICKER_NONE\"/>\n\t\t<field name=\"SYNC_MAX_LATENCY_PER_FRAME_CONTROL\"/>\n\t\t<field name=\"SYNC_MAX_LATENCY_UNKNOWN\"/>\n\t\t<field name=\"TONEMAP_MODE_CONTRAST_CURVE\"/>\n\t\t<field name=\"TONEMAP_MODE_FAST\"/>\n\t\t<field name=\"TONEMAP_MODE_GAMMA_VALUE\" since=\"23\"/>\n\t\t<field name=\"TONEMAP_MODE_HIGH_QUALITY\"/>\n\t\t<field name=\"TONEMAP_MODE_PRESET_CURVE\" since=\"23\"/>\n\t\t<field name=\"TONEMAP_PRESET_CURVE_REC709\" since=\"23\"/>\n\t\t<field name=\"TONEMAP_PRESET_CURVE_SRGB\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/CaptureFailure\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getFrameNumber()J\"/>\n\t\t<method name=\"getPhysicalCameraId()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getReason()I\"/>\n\t\t<method name=\"getRequest()Landroid/hardware/camera2/CaptureRequest;\"/>\n\t\t<method name=\"getSequenceId()I\"/>\n\t\t<method name=\"wasImageCaptured()Z\"/>\n\t\t<field name=\"REASON_ERROR\"/>\n\t\t<field name=\"REASON_FLUSHED\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/CaptureRequest\" since=\"21\">\n\t\t<extends name=\"android/hardware/camera2/CameraMetadata\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"get(Landroid/hardware/camera2/CaptureRequest$Key;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getTag()Ljava/lang/Object;\"/>\n\t\t<method name=\"isReprocess()Z\" since=\"23\"/>\n\t\t<field name=\"BLACK_LEVEL_LOCK\"/>\n\t\t<field name=\"COLOR_CORRECTION_ABERRATION_MODE\"/>\n\t\t<field name=\"COLOR_CORRECTION_GAINS\"/>\n\t\t<field name=\"COLOR_CORRECTION_MODE\"/>\n\t\t<field name=\"COLOR_CORRECTION_TRANSFORM\"/>\n\t\t<field name=\"CONTROL_AE_ANTIBANDING_MODE\"/>\n\t\t<field name=\"CONTROL_AE_EXPOSURE_COMPENSATION\"/>\n\t\t<field name=\"CONTROL_AE_LOCK\"/>\n\t\t<field name=\"CONTROL_AE_MODE\"/>\n\t\t<field name=\"CONTROL_AE_PRECAPTURE_TRIGGER\"/>\n\t\t<field name=\"CONTROL_AE_REGIONS\"/>\n\t\t<field name=\"CONTROL_AE_TARGET_FPS_RANGE\"/>\n\t\t<field name=\"CONTROL_AF_MODE\"/>\n\t\t<field name=\"CONTROL_AF_REGIONS\"/>\n\t\t<field name=\"CONTROL_AF_TRIGGER\"/>\n\t\t<field name=\"CONTROL_AWB_LOCK\"/>\n\t\t<field name=\"CONTROL_AWB_MODE\"/>\n\t\t<field name=\"CONTROL_AWB_REGIONS\"/>\n\t\t<field name=\"CONTROL_CAPTURE_INTENT\"/>\n\t\t<field name=\"CONTROL_EFFECT_MODE\"/>\n\t\t<field name=\"CONTROL_ENABLE_ZSL\" since=\"26\"/>\n\t\t<field name=\"CONTROL_MODE\"/>\n\t\t<field name=\"CONTROL_POST_RAW_SENSITIVITY_BOOST\" since=\"24\"/>\n\t\t<field name=\"CONTROL_SCENE_MODE\"/>\n\t\t<field name=\"CONTROL_VIDEO_STABILIZATION_MODE\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"DISTORTION_CORRECTION_MODE\" since=\"28\"/>\n\t\t<field name=\"EDGE_MODE\"/>\n\t\t<field name=\"FLASH_MODE\"/>\n\t\t<field name=\"HOT_PIXEL_MODE\"/>\n\t\t<field name=\"JPEG_GPS_LOCATION\"/>\n\t\t<field name=\"JPEG_ORIENTATION\"/>\n\t\t<field name=\"JPEG_QUALITY\"/>\n\t\t<field name=\"JPEG_THUMBNAIL_QUALITY\"/>\n\t\t<field name=\"JPEG_THUMBNAIL_SIZE\"/>\n\t\t<field name=\"LENS_APERTURE\"/>\n\t\t<field name=\"LENS_FILTER_DENSITY\"/>\n\t\t<field name=\"LENS_FOCAL_LENGTH\"/>\n\t\t<field name=\"LENS_FOCUS_DISTANCE\"/>\n\t\t<field name=\"LENS_OPTICAL_STABILIZATION_MODE\"/>\n\t\t<field name=\"NOISE_REDUCTION_MODE\"/>\n\t\t<field name=\"REPROCESS_EFFECTIVE_EXPOSURE_FACTOR\" since=\"23\"/>\n\t\t<field name=\"SCALER_CROP_REGION\"/>\n\t\t<field name=\"SENSOR_EXPOSURE_TIME\"/>\n\t\t<field name=\"SENSOR_FRAME_DURATION\"/>\n\t\t<field name=\"SENSOR_SENSITIVITY\"/>\n\t\t<field name=\"SENSOR_TEST_PATTERN_DATA\"/>\n\t\t<field name=\"SENSOR_TEST_PATTERN_MODE\"/>\n\t\t<field name=\"SHADING_MODE\"/>\n\t\t<field name=\"STATISTICS_FACE_DETECT_MODE\"/>\n\t\t<field name=\"STATISTICS_HOT_PIXEL_MAP_MODE\"/>\n\t\t<field name=\"STATISTICS_LENS_SHADING_MAP_MODE\"/>\n\t\t<field name=\"STATISTICS_OIS_DATA_MODE\" since=\"28\"/>\n\t\t<field name=\"TONEMAP_CURVE\"/>\n\t\t<field name=\"TONEMAP_GAMMA\" since=\"23\"/>\n\t\t<field name=\"TONEMAP_MODE\"/>\n\t\t<field name=\"TONEMAP_PRESET_CURVE\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/CaptureRequest$Builder\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addTarget(Landroid/view/Surface;)V\"/>\n\t\t<method name=\"build()Landroid/hardware/camera2/CaptureRequest;\"/>\n\t\t<method name=\"get(Landroid/hardware/camera2/CaptureRequest$Key;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getPhysicalCameraKey(Landroid/hardware/camera2/CaptureRequest$Key;Ljava/lang/String;)Ljava/lang/Object;\" since=\"28\"/>\n\t\t<method name=\"removeTarget(Landroid/view/Surface;)V\"/>\n\t\t<method name=\"set(Landroid/hardware/camera2/CaptureRequest$Key;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"setPhysicalCameraKey(Landroid/hardware/camera2/CaptureRequest$Key;Ljava/lang/Object;Ljava/lang/String;)Landroid/hardware/camera2/CaptureRequest$Builder;\" since=\"28\"/>\n\t\t<method name=\"setTag(Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/CaptureRequest$Key\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Class;)V\" since=\"29\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/CaptureResult\" since=\"21\">\n\t\t<extends name=\"android/hardware/camera2/CameraMetadata\"/>\n\t\t<method name=\"get(Landroid/hardware/camera2/CaptureResult$Key;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getFrameNumber()J\"/>\n\t\t<method name=\"getRequest()Landroid/hardware/camera2/CaptureRequest;\"/>\n\t\t<method name=\"getSequenceId()I\"/>\n\t\t<field name=\"BLACK_LEVEL_LOCK\"/>\n\t\t<field name=\"COLOR_CORRECTION_ABERRATION_MODE\"/>\n\t\t<field name=\"COLOR_CORRECTION_GAINS\"/>\n\t\t<field name=\"COLOR_CORRECTION_MODE\"/>\n\t\t<field name=\"COLOR_CORRECTION_TRANSFORM\"/>\n\t\t<field name=\"CONTROL_AE_ANTIBANDING_MODE\"/>\n\t\t<field name=\"CONTROL_AE_EXPOSURE_COMPENSATION\"/>\n\t\t<field name=\"CONTROL_AE_LOCK\"/>\n\t\t<field name=\"CONTROL_AE_MODE\"/>\n\t\t<field name=\"CONTROL_AE_PRECAPTURE_TRIGGER\"/>\n\t\t<field name=\"CONTROL_AE_REGIONS\"/>\n\t\t<field name=\"CONTROL_AE_STATE\"/>\n\t\t<field name=\"CONTROL_AE_TARGET_FPS_RANGE\"/>\n\t\t<field name=\"CONTROL_AF_MODE\"/>\n\t\t<field name=\"CONTROL_AF_REGIONS\"/>\n\t\t<field name=\"CONTROL_AF_SCENE_CHANGE\" since=\"28\"/>\n\t\t<field name=\"CONTROL_AF_STATE\"/>\n\t\t<field name=\"CONTROL_AF_TRIGGER\"/>\n\t\t<field name=\"CONTROL_AWB_LOCK\"/>\n\t\t<field name=\"CONTROL_AWB_MODE\"/>\n\t\t<field name=\"CONTROL_AWB_REGIONS\"/>\n\t\t<field name=\"CONTROL_AWB_STATE\"/>\n\t\t<field name=\"CONTROL_CAPTURE_INTENT\"/>\n\t\t<field name=\"CONTROL_EFFECT_MODE\"/>\n\t\t<field name=\"CONTROL_ENABLE_ZSL\" since=\"26\"/>\n\t\t<field name=\"CONTROL_MODE\"/>\n\t\t<field name=\"CONTROL_POST_RAW_SENSITIVITY_BOOST\" since=\"24\"/>\n\t\t<field name=\"CONTROL_SCENE_MODE\"/>\n\t\t<field name=\"CONTROL_VIDEO_STABILIZATION_MODE\"/>\n\t\t<field name=\"DISTORTION_CORRECTION_MODE\" since=\"28\"/>\n\t\t<field name=\"EDGE_MODE\"/>\n\t\t<field name=\"FLASH_MODE\"/>\n\t\t<field name=\"FLASH_STATE\"/>\n\t\t<field name=\"HOT_PIXEL_MODE\"/>\n\t\t<field name=\"JPEG_GPS_LOCATION\"/>\n\t\t<field name=\"JPEG_ORIENTATION\"/>\n\t\t<field name=\"JPEG_QUALITY\"/>\n\t\t<field name=\"JPEG_THUMBNAIL_QUALITY\"/>\n\t\t<field name=\"JPEG_THUMBNAIL_SIZE\"/>\n\t\t<field name=\"LENS_APERTURE\"/>\n\t\t<field name=\"LENS_DISTORTION\" since=\"28\"/>\n\t\t<field name=\"LENS_FILTER_DENSITY\"/>\n\t\t<field name=\"LENS_FOCAL_LENGTH\"/>\n\t\t<field name=\"LENS_FOCUS_DISTANCE\"/>\n\t\t<field name=\"LENS_FOCUS_RANGE\"/>\n\t\t<field name=\"LENS_INTRINSIC_CALIBRATION\" since=\"23\"/>\n\t\t<field name=\"LENS_OPTICAL_STABILIZATION_MODE\"/>\n\t\t<field name=\"LENS_POSE_ROTATION\" since=\"23\"/>\n\t\t<field name=\"LENS_POSE_TRANSLATION\" since=\"23\"/>\n\t\t<field name=\"LENS_RADIAL_DISTORTION\" since=\"23\" deprecated=\"28\"/>\n\t\t<field name=\"LENS_STATE\"/>\n\t\t<field name=\"LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID\" since=\"29\"/>\n\t\t<field name=\"NOISE_REDUCTION_MODE\"/>\n\t\t<field name=\"REPROCESS_EFFECTIVE_EXPOSURE_FACTOR\" since=\"23\"/>\n\t\t<field name=\"REQUEST_PIPELINE_DEPTH\"/>\n\t\t<field name=\"SCALER_CROP_REGION\"/>\n\t\t<field name=\"SENSOR_DYNAMIC_BLACK_LEVEL\" since=\"24\"/>\n\t\t<field name=\"SENSOR_DYNAMIC_WHITE_LEVEL\" since=\"24\"/>\n\t\t<field name=\"SENSOR_EXPOSURE_TIME\"/>\n\t\t<field name=\"SENSOR_FRAME_DURATION\"/>\n\t\t<field name=\"SENSOR_GREEN_SPLIT\"/>\n\t\t<field name=\"SENSOR_NEUTRAL_COLOR_POINT\"/>\n\t\t<field name=\"SENSOR_NOISE_PROFILE\"/>\n\t\t<field name=\"SENSOR_ROLLING_SHUTTER_SKEW\"/>\n\t\t<field name=\"SENSOR_SENSITIVITY\"/>\n\t\t<field name=\"SENSOR_TEST_PATTERN_DATA\"/>\n\t\t<field name=\"SENSOR_TEST_PATTERN_MODE\"/>\n\t\t<field name=\"SENSOR_TIMESTAMP\"/>\n\t\t<field name=\"SHADING_MODE\"/>\n\t\t<field name=\"STATISTICS_FACES\"/>\n\t\t<field name=\"STATISTICS_FACE_DETECT_MODE\"/>\n\t\t<field name=\"STATISTICS_HOT_PIXEL_MAP\"/>\n\t\t<field name=\"STATISTICS_HOT_PIXEL_MAP_MODE\"/>\n\t\t<field name=\"STATISTICS_LENS_SHADING_CORRECTION_MAP\"/>\n\t\t<field name=\"STATISTICS_LENS_SHADING_MAP_MODE\"/>\n\t\t<field name=\"STATISTICS_OIS_DATA_MODE\" since=\"28\"/>\n\t\t<field name=\"STATISTICS_OIS_SAMPLES\" since=\"28\"/>\n\t\t<field name=\"STATISTICS_SCENE_FLICKER\"/>\n\t\t<field name=\"TONEMAP_CURVE\"/>\n\t\t<field name=\"TONEMAP_GAMMA\" since=\"23\"/>\n\t\t<field name=\"TONEMAP_MODE\"/>\n\t\t<field name=\"TONEMAP_PRESET_CURVE\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/CaptureResult$Key\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Class;)V\" since=\"29\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/DngCreator\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"&lt;init>(Landroid/hardware/camera2/CameraCharacteristics;Landroid/hardware/camera2/CaptureResult;)V\"/>\n\t\t<method name=\"setDescription(Ljava/lang/String;)Landroid/hardware/camera2/DngCreator;\"/>\n\t\t<method name=\"setLocation(Landroid/location/Location;)Landroid/hardware/camera2/DngCreator;\"/>\n\t\t<method name=\"setOrientation(I)Landroid/hardware/camera2/DngCreator;\"/>\n\t\t<method name=\"setThumbnail(Landroid/graphics/Bitmap;)Landroid/hardware/camera2/DngCreator;\"/>\n\t\t<method name=\"setThumbnail(Landroid/media/Image;)Landroid/hardware/camera2/DngCreator;\"/>\n\t\t<method name=\"writeByteBuffer(Ljava/io/OutputStream;Landroid/util/Size;Ljava/nio/ByteBuffer;J)V\"/>\n\t\t<method name=\"writeImage(Ljava/io/OutputStream;Landroid/media/Image;)V\"/>\n\t\t<method name=\"writeInputStream(Ljava/io/OutputStream;Landroid/util/Size;Ljava/io/InputStream;J)V\"/>\n\t\t<field name=\"MAX_THUMBNAIL_DIMENSION\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/TotalCaptureResult\" since=\"21\">\n\t\t<extends name=\"android/hardware/camera2/CaptureResult\"/>\n\t\t<method name=\"getPartialResults()Ljava/util/List;\"/>\n\t\t<method name=\"getPhysicalCameraResults()Ljava/util/Map;\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/params/BlackLevelPattern\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"copyTo([II)V\"/>\n\t\t<method name=\"getOffsetForIndex(II)I\"/>\n\t\t<field name=\"COUNT\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/params/ColorSpaceTransform\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>([I)V\"/>\n\t\t<method name=\"&lt;init>([Landroid/util/Rational;)V\"/>\n\t\t<method name=\"copyElements([II)V\"/>\n\t\t<method name=\"copyElements([Landroid/util/Rational;I)V\"/>\n\t\t<method name=\"getElement(II)Landroid/util/Rational;\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/params/Face\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getBounds()Landroid/graphics/Rect;\"/>\n\t\t<method name=\"getId()I\"/>\n\t\t<method name=\"getLeftEyePosition()Landroid/graphics/Point;\"/>\n\t\t<method name=\"getMouthPosition()Landroid/graphics/Point;\"/>\n\t\t<method name=\"getRightEyePosition()Landroid/graphics/Point;\"/>\n\t\t<method name=\"getScore()I\"/>\n\t\t<field name=\"ID_UNSUPPORTED\"/>\n\t\t<field name=\"SCORE_MAX\"/>\n\t\t<field name=\"SCORE_MIN\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/params/InputConfiguration\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"getFormat()I\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/params/LensShadingMap\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"copyGainFactors([FI)V\"/>\n\t\t<method name=\"getColumnCount()I\"/>\n\t\t<method name=\"getGainFactor(III)F\"/>\n\t\t<method name=\"getGainFactorCount()I\"/>\n\t\t<method name=\"getGainFactorVector(II)Landroid/hardware/camera2/params/RggbChannelVector;\"/>\n\t\t<method name=\"getRowCount()I\"/>\n\t\t<field name=\"MINIMUM_GAIN_FACTOR\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/params/MandatoryStreamCombination\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getDescription()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getStreamsInformation()Ljava/util/List;\"/>\n\t\t<method name=\"isReprocessable()Z\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/params/MandatoryStreamCombination$MandatoryStreamInformation\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAvailableSizes()Ljava/util/List;\"/>\n\t\t<method name=\"getFormat()I\"/>\n\t\t<method name=\"isInput()Z\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/params/MeteringRectangle\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(IIIII)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Point;Landroid/util/Size;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Rect;I)V\"/>\n\t\t<method name=\"equals(Landroid/hardware/camera2/params/MeteringRectangle;)Z\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getMeteringWeight()I\"/>\n\t\t<method name=\"getRect()Landroid/graphics/Rect;\"/>\n\t\t<method name=\"getSize()Landroid/util/Size;\"/>\n\t\t<method name=\"getUpperLeftPoint()Landroid/graphics/Point;\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t\t<method name=\"getX()I\"/>\n\t\t<method name=\"getY()I\"/>\n\t\t<field name=\"METERING_WEIGHT_DONT_CARE\"/>\n\t\t<field name=\"METERING_WEIGHT_MAX\"/>\n\t\t<field name=\"METERING_WEIGHT_MIN\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/params/OisSample\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(JFF)V\"/>\n\t\t<method name=\"getTimestamp()J\"/>\n\t\t<method name=\"getXshift()F\"/>\n\t\t<method name=\"getYshift()F\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/params/OutputConfiguration\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(ILandroid/view/Surface;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/util/Size;Ljava/lang/Class;)V\" since=\"26\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/Surface;)V\"/>\n\t\t<method name=\"addSurface(Landroid/view/Surface;)V\" since=\"26\"/>\n\t\t<method name=\"enableSurfaceSharing()V\" since=\"26\"/>\n\t\t<method name=\"getMaxSharedSurfaceCount()I\" since=\"28\"/>\n\t\t<method name=\"getSurface()Landroid/view/Surface;\"/>\n\t\t<method name=\"getSurfaceGroupId()I\"/>\n\t\t<method name=\"getSurfaces()Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"removeSurface(Landroid/view/Surface;)V\" since=\"28\"/>\n\t\t<method name=\"setPhysicalCameraId(Ljava/lang/String;)V\" since=\"28\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"SURFACE_GROUP_ID_NONE\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/params/RecommendedStreamConfigurationMap\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getHighResolutionOutputSizes(I)Ljava/util/Set;\"/>\n\t\t<method name=\"getHighSpeedVideoFpsRanges()Ljava/util/Set;\"/>\n\t\t<method name=\"getHighSpeedVideoFpsRangesFor(Landroid/util/Size;)Ljava/util/Set;\"/>\n\t\t<method name=\"getHighSpeedVideoSizes()Ljava/util/Set;\"/>\n\t\t<method name=\"getHighSpeedVideoSizesFor(Landroid/util/Range;)Ljava/util/Set;\"/>\n\t\t<method name=\"getInputFormats()Ljava/util/Set;\"/>\n\t\t<method name=\"getInputSizes(I)Ljava/util/Set;\"/>\n\t\t<method name=\"getOutputFormats()Ljava/util/Set;\"/>\n\t\t<method name=\"getOutputMinFrameDuration(ILandroid/util/Size;)J\"/>\n\t\t<method name=\"getOutputMinFrameDuration(Ljava/lang/Class;Landroid/util/Size;)J\"/>\n\t\t<method name=\"getOutputSizes(I)Ljava/util/Set;\"/>\n\t\t<method name=\"getOutputSizes(Ljava/lang/Class;)Ljava/util/Set;\"/>\n\t\t<method name=\"getOutputStallDuration(ILandroid/util/Size;)J\"/>\n\t\t<method name=\"getOutputStallDuration(Ljava/lang/Class;Landroid/util/Size;)J\"/>\n\t\t<method name=\"getRecommendedUseCase()I\"/>\n\t\t<method name=\"getValidOutputFormatsForInput(I)Ljava/util/Set;\"/>\n\t\t<method name=\"isOutputSupportedFor(I)Z\"/>\n\t\t<method name=\"isOutputSupportedFor(Landroid/view/Surface;)Z\"/>\n\t\t<field name=\"USECASE_LOW_LATENCY_SNAPSHOT\"/>\n\t\t<field name=\"USECASE_PREVIEW\"/>\n\t\t<field name=\"USECASE_RAW\"/>\n\t\t<field name=\"USECASE_RECORD\"/>\n\t\t<field name=\"USECASE_SNAPSHOT\"/>\n\t\t<field name=\"USECASE_VIDEO_SNAPSHOT\"/>\n\t\t<field name=\"USECASE_ZSL\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/params/RggbChannelVector\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(FFFF)V\"/>\n\t\t<method name=\"copyTo([FI)V\"/>\n\t\t<method name=\"getBlue()F\"/>\n\t\t<method name=\"getComponent(I)F\"/>\n\t\t<method name=\"getGreenEven()F\"/>\n\t\t<method name=\"getGreenOdd()F\"/>\n\t\t<method name=\"getRed()F\"/>\n\t\t<field name=\"BLUE\"/>\n\t\t<field name=\"COUNT\"/>\n\t\t<field name=\"GREEN_EVEN\"/>\n\t\t<field name=\"GREEN_ODD\"/>\n\t\t<field name=\"RED\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/params/SessionConfiguration\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\" since=\"29\"/>\n\t\t<method name=\"&lt;init>(ILjava/util/List;Ljava/util/concurrent/Executor;Landroid/hardware/camera2/CameraCaptureSession$StateCallback;)V\"/>\n\t\t<method name=\"getExecutor()Ljava/util/concurrent/Executor;\"/>\n\t\t<method name=\"getInputConfiguration()Landroid/hardware/camera2/params/InputConfiguration;\"/>\n\t\t<method name=\"getOutputConfigurations()Ljava/util/List;\"/>\n\t\t<method name=\"getSessionParameters()Landroid/hardware/camera2/CaptureRequest;\"/>\n\t\t<method name=\"getSessionType()I\"/>\n\t\t<method name=\"getStateCallback()Landroid/hardware/camera2/CameraCaptureSession$StateCallback;\"/>\n\t\t<method name=\"setInputConfiguration(Landroid/hardware/camera2/params/InputConfiguration;)V\"/>\n\t\t<method name=\"setSessionParameters(Landroid/hardware/camera2/CaptureRequest;)V\"/>\n\t\t<field name=\"CREATOR\" since=\"29\"/>\n\t\t<field name=\"SESSION_HIGH_SPEED\"/>\n\t\t<field name=\"SESSION_REGULAR\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/params/StreamConfigurationMap\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getHighResolutionOutputSizes(I)[Landroid/util/Size;\" since=\"23\"/>\n\t\t<method name=\"getHighSpeedVideoFpsRanges()[Landroid/util/Range;\"/>\n\t\t<method name=\"getHighSpeedVideoFpsRangesFor(Landroid/util/Size;)[Landroid/util/Range;\"/>\n\t\t<method name=\"getHighSpeedVideoSizes()[Landroid/util/Size;\"/>\n\t\t<method name=\"getHighSpeedVideoSizesFor(Landroid/util/Range;)[Landroid/util/Size;\"/>\n\t\t<method name=\"getInputFormats()[I\" since=\"23\"/>\n\t\t<method name=\"getInputSizes(I)[Landroid/util/Size;\" since=\"23\"/>\n\t\t<method name=\"getOutputFormats()[I\"/>\n\t\t<method name=\"getOutputMinFrameDuration(ILandroid/util/Size;)J\"/>\n\t\t<method name=\"getOutputMinFrameDuration(Ljava/lang/Class;Landroid/util/Size;)J\"/>\n\t\t<method name=\"getOutputSizes(I)[Landroid/util/Size;\"/>\n\t\t<method name=\"getOutputSizes(Ljava/lang/Class;)[Landroid/util/Size;\"/>\n\t\t<method name=\"getOutputStallDuration(ILandroid/util/Size;)J\"/>\n\t\t<method name=\"getOutputStallDuration(Ljava/lang/Class;Landroid/util/Size;)J\"/>\n\t\t<method name=\"getValidOutputFormatsForInput(I)[I\" since=\"23\"/>\n\t\t<method name=\"isOutputSupportedFor(I)Z\"/>\n\t\t<method name=\"isOutputSupportedFor(Landroid/view/Surface;)Z\"/>\n\t\t<method name=\"isOutputSupportedFor(Ljava/lang/Class;)Z\"/>\n\t</class>\n\t<class name=\"android/hardware/camera2/params/TonemapCurve\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>([F[F[F)V\"/>\n\t\t<method name=\"copyColorCurve(I[FI)V\"/>\n\t\t<method name=\"getPoint(II)Landroid/graphics/PointF;\"/>\n\t\t<method name=\"getPointCount(I)I\"/>\n\t\t<field name=\"CHANNEL_BLUE\"/>\n\t\t<field name=\"CHANNEL_GREEN\"/>\n\t\t<field name=\"CHANNEL_RED\"/>\n\t\t<field name=\"LEVEL_BLACK\"/>\n\t\t<field name=\"LEVEL_WHITE\"/>\n\t\t<field name=\"POINT_SIZE\"/>\n\t</class>\n\t<class name=\"android/hardware/display/DisplayManager\" since=\"17\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createVirtualDisplay(Ljava/lang/String;IIILandroid/view/Surface;I)Landroid/hardware/display/VirtualDisplay;\" since=\"19\"/>\n\t\t<method name=\"createVirtualDisplay(Ljava/lang/String;IIILandroid/view/Surface;ILandroid/hardware/display/VirtualDisplay$Callback;Landroid/os/Handler;)Landroid/hardware/display/VirtualDisplay;\" since=\"21\"/>\n\t\t<method name=\"getDisplay(I)Landroid/view/Display;\"/>\n\t\t<method name=\"getDisplays()[Landroid/view/Display;\"/>\n\t\t<method name=\"getDisplays(Ljava/lang/String;)[Landroid/view/Display;\"/>\n\t\t<method name=\"registerDisplayListener(Landroid/hardware/display/DisplayManager$DisplayListener;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"unregisterDisplayListener(Landroid/hardware/display/DisplayManager$DisplayListener;)V\"/>\n\t\t<field name=\"DISPLAY_CATEGORY_PRESENTATION\"/>\n\t\t<field name=\"VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR\" since=\"21\"/>\n\t\t<field name=\"VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY\" since=\"20\"/>\n\t\t<field name=\"VIRTUAL_DISPLAY_FLAG_PRESENTATION\" since=\"19\"/>\n\t\t<field name=\"VIRTUAL_DISPLAY_FLAG_PUBLIC\" since=\"19\"/>\n\t\t<field name=\"VIRTUAL_DISPLAY_FLAG_SECURE\" since=\"19\"/>\n\t</class>\n\t<class name=\"android/hardware/display/DisplayManager$DisplayListener\" since=\"17\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDisplayAdded(I)V\"/>\n\t\t<method name=\"onDisplayChanged(I)V\"/>\n\t\t<method name=\"onDisplayRemoved(I)V\"/>\n\t</class>\n\t<class name=\"android/hardware/display/VirtualDisplay\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getDisplay()Landroid/view/Display;\"/>\n\t\t<method name=\"getSurface()Landroid/view/Surface;\" since=\"20\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"resize(III)V\" since=\"21\"/>\n\t\t<method name=\"setSurface(Landroid/view/Surface;)V\" since=\"20\"/>\n\t</class>\n\t<class name=\"android/hardware/display/VirtualDisplay$Callback\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onPaused()V\"/>\n\t\t<method name=\"onResumed()V\"/>\n\t\t<method name=\"onStopped()V\"/>\n\t</class>\n\t<class name=\"android/hardware/fingerprint/FingerprintManager\" since=\"23\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"authenticate(Landroid/hardware/fingerprint/FingerprintManager$CryptoObject;Landroid/os/CancellationSignal;ILandroid/hardware/fingerprint/FingerprintManager$AuthenticationCallback;Landroid/os/Handler;)V\" deprecated=\"28\"/>\n\t\t<method name=\"hasEnrolledFingerprints()Z\" deprecated=\"28\"/>\n\t\t<method name=\"isHardwareDetected()Z\" deprecated=\"28\"/>\n\t\t<field name=\"FINGERPRINT_ACQUIRED_GOOD\"/>\n\t\t<field name=\"FINGERPRINT_ACQUIRED_IMAGER_DIRTY\"/>\n\t\t<field name=\"FINGERPRINT_ACQUIRED_INSUFFICIENT\"/>\n\t\t<field name=\"FINGERPRINT_ACQUIRED_PARTIAL\"/>\n\t\t<field name=\"FINGERPRINT_ACQUIRED_TOO_FAST\"/>\n\t\t<field name=\"FINGERPRINT_ACQUIRED_TOO_SLOW\"/>\n\t\t<field name=\"FINGERPRINT_ERROR_CANCELED\"/>\n\t\t<field name=\"FINGERPRINT_ERROR_HW_NOT_PRESENT\" since=\"28\"/>\n\t\t<field name=\"FINGERPRINT_ERROR_HW_UNAVAILABLE\"/>\n\t\t<field name=\"FINGERPRINT_ERROR_LOCKOUT\"/>\n\t\t<field name=\"FINGERPRINT_ERROR_LOCKOUT_PERMANENT\" since=\"27\"/>\n\t\t<field name=\"FINGERPRINT_ERROR_NO_FINGERPRINTS\" since=\"28\"/>\n\t\t<field name=\"FINGERPRINT_ERROR_NO_SPACE\"/>\n\t\t<field name=\"FINGERPRINT_ERROR_TIMEOUT\"/>\n\t\t<field name=\"FINGERPRINT_ERROR_UNABLE_TO_PROCESS\"/>\n\t\t<field name=\"FINGERPRINT_ERROR_USER_CANCELED\" since=\"27\"/>\n\t\t<field name=\"FINGERPRINT_ERROR_VENDOR\" since=\"27\"/>\n\t</class>\n\t<class name=\"android/hardware/fingerprint/FingerprintManager$AuthenticationCallback\" since=\"23\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"onAuthenticationError(ILjava/lang/CharSequence;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onAuthenticationFailed()V\" deprecated=\"29\"/>\n\t\t<method name=\"onAuthenticationHelp(ILjava/lang/CharSequence;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onAuthenticationSucceeded(Landroid/hardware/fingerprint/FingerprintManager$AuthenticationResult;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/hardware/fingerprint/FingerprintManager$AuthenticationResult\" since=\"23\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getCryptoObject()Landroid/hardware/fingerprint/FingerprintManager$CryptoObject;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/hardware/fingerprint/FingerprintManager$CryptoObject\" since=\"23\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/Signature;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljavax/crypto/Cipher;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljavax/crypto/Mac;)V\" deprecated=\"29\"/>\n\t\t<method name=\"getCipher()Ljavax/crypto/Cipher;\" deprecated=\"29\"/>\n\t\t<method name=\"getMac()Ljavax/crypto/Mac;\" deprecated=\"29\"/>\n\t\t<method name=\"getSignature()Ljava/security/Signature;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/hardware/input/InputManager\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getInputDevice(I)Landroid/view/InputDevice;\"/>\n\t\t<method name=\"getInputDeviceIds()[I\"/>\n\t\t<method name=\"registerInputDeviceListener(Landroid/hardware/input/InputManager$InputDeviceListener;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"unregisterInputDeviceListener(Landroid/hardware/input/InputManager$InputDeviceListener;)V\"/>\n\t\t<field name=\"ACTION_QUERY_KEYBOARD_LAYOUTS\"/>\n\t\t<field name=\"META_DATA_KEYBOARD_LAYOUTS\"/>\n\t</class>\n\t<class name=\"android/hardware/input/InputManager$InputDeviceListener\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onInputDeviceAdded(I)V\"/>\n\t\t<method name=\"onInputDeviceChanged(I)V\"/>\n\t\t<method name=\"onInputDeviceRemoved(I)V\"/>\n\t</class>\n\t<class name=\"android/hardware/location/GeofenceHardware\" since=\"18\" removed=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addGeofence(IILandroid/hardware/location/GeofenceHardwareRequest;Landroid/hardware/location/GeofenceHardwareCallback;)Z\"/>\n\t\t<method name=\"getMonitoringTypes()[I\"/>\n\t\t<method name=\"getStatusOfMonitoringType(I)I\"/>\n\t\t<method name=\"pauseGeofence(II)Z\"/>\n\t\t<method name=\"registerForMonitorStateChangeCallback(ILandroid/hardware/location/GeofenceHardwareMonitorCallback;)Z\"/>\n\t\t<method name=\"removeGeofence(II)Z\"/>\n\t\t<method name=\"resumeGeofence(III)Z\"/>\n\t\t<method name=\"unregisterForMonitorStateChangeCallback(ILandroid/hardware/location/GeofenceHardwareMonitorCallback;)Z\"/>\n\t\t<field name=\"GEOFENCE_ENTERED\"/>\n\t\t<field name=\"GEOFENCE_ERROR_ID_EXISTS\"/>\n\t\t<field name=\"GEOFENCE_ERROR_ID_UNKNOWN\"/>\n\t\t<field name=\"GEOFENCE_ERROR_INVALID_TRANSITION\"/>\n\t\t<field name=\"GEOFENCE_ERROR_TOO_MANY_GEOFENCES\"/>\n\t\t<field name=\"GEOFENCE_EXITED\"/>\n\t\t<field name=\"GEOFENCE_FAILURE\"/>\n\t\t<field name=\"GEOFENCE_SUCCESS\"/>\n\t\t<field name=\"GEOFENCE_UNCERTAIN\"/>\n\t\t<field name=\"MONITORING_TYPE_GPS_HARDWARE\"/>\n\t\t<field name=\"MONITOR_CURRENTLY_AVAILABLE\"/>\n\t\t<field name=\"MONITOR_CURRENTLY_UNAVAILABLE\"/>\n\t\t<field name=\"MONITOR_UNSUPPORTED\"/>\n\t</class>\n\t<class name=\"android/hardware/location/GeofenceHardwareCallback\" since=\"18\" removed=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onGeofenceAdd(II)V\"/>\n\t\t<method name=\"onGeofencePause(II)V\"/>\n\t\t<method name=\"onGeofenceRemove(II)V\"/>\n\t\t<method name=\"onGeofenceResume(II)V\"/>\n\t\t<method name=\"onGeofenceTransition(IILandroid/location/Location;JI)V\"/>\n\t</class>\n\t<class name=\"android/hardware/location/GeofenceHardwareMonitorCallback\" since=\"18\" removed=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onMonitoringSystemChange(IZLandroid/location/Location;)V\"/>\n\t</class>\n\t<class name=\"android/hardware/location/GeofenceHardwareRequest\" since=\"18\" removed=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"createCircularGeofence(DDD)Landroid/hardware/location/GeofenceHardwareRequest;\"/>\n\t\t<method name=\"getLastTransition()I\"/>\n\t\t<method name=\"getLatitude()D\"/>\n\t\t<method name=\"getLongitude()D\"/>\n\t\t<method name=\"getMonitorTransitions()I\"/>\n\t\t<method name=\"getNotificationResponsiveness()I\"/>\n\t\t<method name=\"getRadius()D\"/>\n\t\t<method name=\"getUnknownTimer()I\"/>\n\t\t<method name=\"setLastTransition(I)V\"/>\n\t\t<method name=\"setMonitorTransitions(I)V\"/>\n\t\t<method name=\"setNotificationResponsiveness(I)V\"/>\n\t\t<method name=\"setUnknownTimer(I)V\"/>\n\t</class>\n\t<class name=\"android/hardware/usb/UsbAccessory\" since=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getDescription()Ljava/lang/String;\"/>\n\t\t<method name=\"getManufacturer()Ljava/lang/String;\"/>\n\t\t<method name=\"getModel()Ljava/lang/String;\"/>\n\t\t<method name=\"getSerial()Ljava/lang/String;\"/>\n\t\t<method name=\"getUri()Ljava/lang/String;\"/>\n\t\t<method name=\"getVersion()Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/hardware/usb/UsbConfiguration\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getId()I\"/>\n\t\t<method name=\"getInterface(I)Landroid/hardware/usb/UsbInterface;\"/>\n\t\t<method name=\"getInterfaceCount()I\"/>\n\t\t<method name=\"getMaxPower()I\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"isRemoteWakeup()Z\"/>\n\t\t<method name=\"isSelfPowered()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/hardware/usb/UsbConstants\" since=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"USB_CLASS_APP_SPEC\"/>\n\t\t<field name=\"USB_CLASS_AUDIO\"/>\n\t\t<field name=\"USB_CLASS_CDC_DATA\"/>\n\t\t<field name=\"USB_CLASS_COMM\"/>\n\t\t<field name=\"USB_CLASS_CONTENT_SEC\"/>\n\t\t<field name=\"USB_CLASS_CSCID\"/>\n\t\t<field name=\"USB_CLASS_HID\"/>\n\t\t<field name=\"USB_CLASS_HUB\"/>\n\t\t<field name=\"USB_CLASS_MASS_STORAGE\"/>\n\t\t<field name=\"USB_CLASS_MISC\"/>\n\t\t<field name=\"USB_CLASS_PER_INTERFACE\"/>\n\t\t<field name=\"USB_CLASS_PHYSICA\"/>\n\t\t<field name=\"USB_CLASS_PRINTER\"/>\n\t\t<field name=\"USB_CLASS_STILL_IMAGE\"/>\n\t\t<field name=\"USB_CLASS_VENDOR_SPEC\"/>\n\t\t<field name=\"USB_CLASS_VIDEO\"/>\n\t\t<field name=\"USB_CLASS_WIRELESS_CONTROLLER\"/>\n\t\t<field name=\"USB_DIR_IN\"/>\n\t\t<field name=\"USB_DIR_OUT\"/>\n\t\t<field name=\"USB_ENDPOINT_DIR_MASK\"/>\n\t\t<field name=\"USB_ENDPOINT_NUMBER_MASK\"/>\n\t\t<field name=\"USB_ENDPOINT_XFERTYPE_MASK\"/>\n\t\t<field name=\"USB_ENDPOINT_XFER_BULK\"/>\n\t\t<field name=\"USB_ENDPOINT_XFER_CONTROL\"/>\n\t\t<field name=\"USB_ENDPOINT_XFER_INT\"/>\n\t\t<field name=\"USB_ENDPOINT_XFER_ISOC\"/>\n\t\t<field name=\"USB_INTERFACE_SUBCLASS_BOOT\"/>\n\t\t<field name=\"USB_SUBCLASS_VENDOR_SPEC\"/>\n\t\t<field name=\"USB_TYPE_CLASS\"/>\n\t\t<field name=\"USB_TYPE_MASK\"/>\n\t\t<field name=\"USB_TYPE_RESERVED\"/>\n\t\t<field name=\"USB_TYPE_STANDARD\"/>\n\t\t<field name=\"USB_TYPE_VENDOR\"/>\n\t</class>\n\t<class name=\"android/hardware/usb/UsbDevice\" since=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getConfiguration(I)Landroid/hardware/usb/UsbConfiguration;\" since=\"21\"/>\n\t\t<method name=\"getConfigurationCount()I\" since=\"21\"/>\n\t\t<method name=\"getDeviceClass()I\"/>\n\t\t<method name=\"getDeviceId()I\"/>\n\t\t<method name=\"getDeviceId(Ljava/lang/String;)I\"/>\n\t\t<method name=\"getDeviceName()Ljava/lang/String;\"/>\n\t\t<method name=\"getDeviceName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getDeviceProtocol()I\"/>\n\t\t<method name=\"getDeviceSubclass()I\"/>\n\t\t<method name=\"getInterface(I)Landroid/hardware/usb/UsbInterface;\"/>\n\t\t<method name=\"getInterfaceCount()I\"/>\n\t\t<method name=\"getManufacturerName()Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"getProductId()I\"/>\n\t\t<method name=\"getProductName()Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"getSerialNumber()Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"getVendorId()I\"/>\n\t\t<method name=\"getVersion()Ljava/lang/String;\" since=\"23\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/hardware/usb/UsbDeviceConnection\" since=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"bulkTransfer(Landroid/hardware/usb/UsbEndpoint;[BII)I\"/>\n\t\t<method name=\"bulkTransfer(Landroid/hardware/usb/UsbEndpoint;[BIII)I\" since=\"18\"/>\n\t\t<method name=\"claimInterface(Landroid/hardware/usb/UsbInterface;Z)Z\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"controlTransfer(IIII[BII)I\"/>\n\t\t<method name=\"controlTransfer(IIII[BIII)I\" since=\"18\"/>\n\t\t<method name=\"getFileDescriptor()I\"/>\n\t\t<method name=\"getRawDescriptors()[B\" since=\"13\"/>\n\t\t<method name=\"getSerial()Ljava/lang/String;\"/>\n\t\t<method name=\"releaseInterface(Landroid/hardware/usb/UsbInterface;)Z\"/>\n\t\t<method name=\"requestWait()Landroid/hardware/usb/UsbRequest;\"/>\n\t\t<method name=\"requestWait(J)Landroid/hardware/usb/UsbRequest;\" since=\"26\"/>\n\t\t<method name=\"setConfiguration(Landroid/hardware/usb/UsbConfiguration;)Z\" since=\"21\"/>\n\t\t<method name=\"setInterface(Landroid/hardware/usb/UsbInterface;)Z\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/hardware/usb/UsbEndpoint\" since=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getAddress()I\"/>\n\t\t<method name=\"getAttributes()I\"/>\n\t\t<method name=\"getDirection()I\"/>\n\t\t<method name=\"getEndpointNumber()I\"/>\n\t\t<method name=\"getInterval()I\"/>\n\t\t<method name=\"getMaxPacketSize()I\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/hardware/usb/UsbInterface\" since=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getAlternateSetting()I\" since=\"21\"/>\n\t\t<method name=\"getEndpoint(I)Landroid/hardware/usb/UsbEndpoint;\"/>\n\t\t<method name=\"getEndpointCount()I\"/>\n\t\t<method name=\"getId()I\"/>\n\t\t<method name=\"getInterfaceClass()I\"/>\n\t\t<method name=\"getInterfaceProtocol()I\"/>\n\t\t<method name=\"getInterfaceSubclass()I\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\" since=\"21\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/hardware/usb/UsbManager\" since=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAccessoryList()[Landroid/hardware/usb/UsbAccessory;\"/>\n\t\t<method name=\"getDeviceList()Ljava/util/HashMap;\"/>\n\t\t<method name=\"hasPermission(Landroid/hardware/usb/UsbAccessory;)Z\"/>\n\t\t<method name=\"hasPermission(Landroid/hardware/usb/UsbDevice;)Z\"/>\n\t\t<method name=\"openAccessory(Landroid/hardware/usb/UsbAccessory;)Landroid/os/ParcelFileDescriptor;\"/>\n\t\t<method name=\"openDevice(Landroid/hardware/usb/UsbDevice;)Landroid/hardware/usb/UsbDeviceConnection;\"/>\n\t\t<method name=\"requestPermission(Landroid/hardware/usb/UsbAccessory;Landroid/app/PendingIntent;)V\"/>\n\t\t<method name=\"requestPermission(Landroid/hardware/usb/UsbDevice;Landroid/app/PendingIntent;)V\"/>\n\t\t<field name=\"ACTION_USB_ACCESSORY_ATTACHED\"/>\n\t\t<field name=\"ACTION_USB_ACCESSORY_DETACHED\"/>\n\t\t<field name=\"ACTION_USB_DEVICE_ATTACHED\"/>\n\t\t<field name=\"ACTION_USB_DEVICE_DETACHED\"/>\n\t\t<field name=\"EXTRA_ACCESSORY\"/>\n\t\t<field name=\"EXTRA_DEVICE\"/>\n\t\t<field name=\"EXTRA_PERMISSION_GRANTED\"/>\n\t</class>\n\t<class name=\"android/hardware/usb/UsbRequest\" since=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"cancel()Z\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"getClientData()Ljava/lang/Object;\"/>\n\t\t<method name=\"getEndpoint()Landroid/hardware/usb/UsbEndpoint;\"/>\n\t\t<method name=\"initialize(Landroid/hardware/usb/UsbDeviceConnection;Landroid/hardware/usb/UsbEndpoint;)Z\"/>\n\t\t<method name=\"queue(Ljava/nio/ByteBuffer;)Z\" since=\"26\"/>\n\t\t<method name=\"queue(Ljava/nio/ByteBuffer;I)Z\" deprecated=\"26\"/>\n\t\t<method name=\"setClientData(Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UCharacter\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/icu/lang/UCharacterEnums$ECharacterCategory\"/>\n\t\t<implements name=\"android/icu/lang/UCharacterEnums$ECharacterDirection\"/>\n\t\t<method name=\"charCount(I)I\"/>\n\t\t<method name=\"codePointAt(Ljava/lang/CharSequence;I)I\"/>\n\t\t<method name=\"codePointAt([CI)I\"/>\n\t\t<method name=\"codePointAt([CII)I\"/>\n\t\t<method name=\"codePointBefore(Ljava/lang/CharSequence;I)I\"/>\n\t\t<method name=\"codePointBefore([CI)I\"/>\n\t\t<method name=\"codePointBefore([CII)I\"/>\n\t\t<method name=\"codePointCount(Ljava/lang/CharSequence;II)I\"/>\n\t\t<method name=\"codePointCount([CII)I\"/>\n\t\t<method name=\"digit(I)I\"/>\n\t\t<method name=\"digit(II)I\"/>\n\t\t<method name=\"foldCase(II)I\"/>\n\t\t<method name=\"foldCase(IZ)I\"/>\n\t\t<method name=\"foldCase(Ljava/lang/String;I)Ljava/lang/String;\"/>\n\t\t<method name=\"foldCase(Ljava/lang/String;Z)Ljava/lang/String;\"/>\n\t\t<method name=\"forDigit(II)C\"/>\n\t\t<method name=\"getAge(I)Landroid/icu/util/VersionInfo;\"/>\n\t\t<method name=\"getBidiPairedBracket(I)I\"/>\n\t\t<method name=\"getCharFromExtendedName(Ljava/lang/String;)I\"/>\n\t\t<method name=\"getCharFromName(Ljava/lang/String;)I\"/>\n\t\t<method name=\"getCharFromNameAlias(Ljava/lang/String;)I\"/>\n\t\t<method name=\"getCodePoint(C)I\"/>\n\t\t<method name=\"getCodePoint(CC)I\"/>\n\t\t<method name=\"getCombiningClass(I)I\"/>\n\t\t<method name=\"getDirection(I)I\"/>\n\t\t<method name=\"getDirectionality(I)B\"/>\n\t\t<method name=\"getExtendedName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getExtendedNameIterator()Landroid/icu/util/ValueIterator;\"/>\n\t\t<method name=\"getHanNumericValue(I)I\"/>\n\t\t<method name=\"getIntPropertyMaxValue(I)I\"/>\n\t\t<method name=\"getIntPropertyMinValue(I)I\"/>\n\t\t<method name=\"getIntPropertyValue(II)I\"/>\n\t\t<method name=\"getMirror(I)I\"/>\n\t\t<method name=\"getName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getNameAlias(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getNameIterator()Landroid/icu/util/ValueIterator;\"/>\n\t\t<method name=\"getNumericValue(I)I\"/>\n\t\t<method name=\"getPropertyEnum(Ljava/lang/CharSequence;)I\"/>\n\t\t<method name=\"getPropertyName(II)Ljava/lang/String;\"/>\n\t\t<method name=\"getPropertyValueEnum(ILjava/lang/CharSequence;)I\"/>\n\t\t<method name=\"getPropertyValueName(III)Ljava/lang/String;\"/>\n\t\t<method name=\"getType(I)I\"/>\n\t\t<method name=\"getTypeIterator()Landroid/icu/util/RangeValueIterator;\"/>\n\t\t<method name=\"getUnicodeNumericValue(I)D\"/>\n\t\t<method name=\"getUnicodeVersion()Landroid/icu/util/VersionInfo;\"/>\n\t\t<method name=\"hasBinaryProperty(II)Z\"/>\n\t\t<method name=\"isBMP(I)Z\"/>\n\t\t<method name=\"isBaseForm(I)Z\"/>\n\t\t<method name=\"isDefined(I)Z\"/>\n\t\t<method name=\"isDigit(I)Z\"/>\n\t\t<method name=\"isHighSurrogate(C)Z\"/>\n\t\t<method name=\"isISOControl(I)Z\"/>\n\t\t<method name=\"isIdentifierIgnorable(I)Z\"/>\n\t\t<method name=\"isJavaIdentifierPart(I)Z\"/>\n\t\t<method name=\"isJavaIdentifierStart(I)Z\"/>\n\t\t<method name=\"isLegal(I)Z\"/>\n\t\t<method name=\"isLegal(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isLetter(I)Z\"/>\n\t\t<method name=\"isLetterOrDigit(I)Z\"/>\n\t\t<method name=\"isLowSurrogate(C)Z\"/>\n\t\t<method name=\"isLowerCase(I)Z\"/>\n\t\t<method name=\"isMirrored(I)Z\"/>\n\t\t<method name=\"isPrintable(I)Z\"/>\n\t\t<method name=\"isSpaceChar(I)Z\"/>\n\t\t<method name=\"isSupplementary(I)Z\"/>\n\t\t<method name=\"isSupplementaryCodePoint(I)Z\"/>\n\t\t<method name=\"isSurrogatePair(CC)Z\"/>\n\t\t<method name=\"isTitleCase(I)Z\"/>\n\t\t<method name=\"isUAlphabetic(I)Z\"/>\n\t\t<method name=\"isULowercase(I)Z\"/>\n\t\t<method name=\"isUUppercase(I)Z\"/>\n\t\t<method name=\"isUWhiteSpace(I)Z\"/>\n\t\t<method name=\"isUnicodeIdentifierPart(I)Z\"/>\n\t\t<method name=\"isUnicodeIdentifierStart(I)Z\"/>\n\t\t<method name=\"isUpperCase(I)Z\"/>\n\t\t<method name=\"isValidCodePoint(I)Z\"/>\n\t\t<method name=\"isWhitespace(I)Z\"/>\n\t\t<method name=\"offsetByCodePoints(Ljava/lang/CharSequence;II)I\"/>\n\t\t<method name=\"offsetByCodePoints([CIIII)I\"/>\n\t\t<method name=\"toChars(I)[C\"/>\n\t\t<method name=\"toChars(I[CI)I\"/>\n\t\t<method name=\"toCodePoint(CC)I\"/>\n\t\t<method name=\"toLowerCase(I)I\"/>\n\t\t<method name=\"toLowerCase(Landroid/icu/util/ULocale;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"toLowerCase(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"toLowerCase(Ljava/util/Locale;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"toString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"toTitleCase(I)I\"/>\n\t\t<method name=\"toTitleCase(Landroid/icu/util/ULocale;Ljava/lang/String;Landroid/icu/text/BreakIterator;)Ljava/lang/String;\"/>\n\t\t<method name=\"toTitleCase(Landroid/icu/util/ULocale;Ljava/lang/String;Landroid/icu/text/BreakIterator;I)Ljava/lang/String;\"/>\n\t\t<method name=\"toTitleCase(Ljava/lang/String;Landroid/icu/text/BreakIterator;)Ljava/lang/String;\"/>\n\t\t<method name=\"toTitleCase(Ljava/util/Locale;Ljava/lang/String;Landroid/icu/text/BreakIterator;)Ljava/lang/String;\"/>\n\t\t<method name=\"toTitleCase(Ljava/util/Locale;Ljava/lang/String;Landroid/icu/text/BreakIterator;I)Ljava/lang/String;\"/>\n\t\t<method name=\"toUpperCase(I)I\"/>\n\t\t<method name=\"toUpperCase(Landroid/icu/util/ULocale;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"toUpperCase(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"toUpperCase(Ljava/util/Locale;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<field name=\"FOLD_CASE_DEFAULT\"/>\n\t\t<field name=\"FOLD_CASE_EXCLUDE_SPECIAL_I\"/>\n\t\t<field name=\"MAX_CODE_POINT\"/>\n\t\t<field name=\"MAX_HIGH_SURROGATE\"/>\n\t\t<field name=\"MAX_LOW_SURROGATE\"/>\n\t\t<field name=\"MAX_RADIX\"/>\n\t\t<field name=\"MAX_SURROGATE\"/>\n\t\t<field name=\"MAX_VALUE\"/>\n\t\t<field name=\"MIN_CODE_POINT\"/>\n\t\t<field name=\"MIN_HIGH_SURROGATE\"/>\n\t\t<field name=\"MIN_LOW_SURROGATE\"/>\n\t\t<field name=\"MIN_RADIX\"/>\n\t\t<field name=\"MIN_SUPPLEMENTARY_CODE_POINT\"/>\n\t\t<field name=\"MIN_SURROGATE\"/>\n\t\t<field name=\"MIN_VALUE\"/>\n\t\t<field name=\"NO_NUMERIC_VALUE\"/>\n\t\t<field name=\"REPLACEMENT_CHAR\"/>\n\t\t<field name=\"SUPPLEMENTARY_MIN_VALUE\"/>\n\t\t<field name=\"TITLECASE_NO_BREAK_ADJUSTMENT\"/>\n\t\t<field name=\"TITLECASE_NO_LOWERCASE\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UCharacter$BidiPairedBracketType\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CLOSE\"/>\n\t\t<field name=\"NONE\"/>\n\t\t<field name=\"OPEN\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UCharacter$DecompositionType\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CANONICAL\"/>\n\t\t<field name=\"CIRCLE\"/>\n\t\t<field name=\"COMPAT\"/>\n\t\t<field name=\"FINAL\"/>\n\t\t<field name=\"FONT\"/>\n\t\t<field name=\"FRACTION\"/>\n\t\t<field name=\"INITIAL\"/>\n\t\t<field name=\"ISOLATED\"/>\n\t\t<field name=\"MEDIAL\"/>\n\t\t<field name=\"NARROW\"/>\n\t\t<field name=\"NOBREAK\"/>\n\t\t<field name=\"NONE\"/>\n\t\t<field name=\"SMALL\"/>\n\t\t<field name=\"SQUARE\"/>\n\t\t<field name=\"SUB\"/>\n\t\t<field name=\"SUPER\"/>\n\t\t<field name=\"VERTICAL\"/>\n\t\t<field name=\"WIDE\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UCharacter$EastAsianWidth\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"AMBIGUOUS\"/>\n\t\t<field name=\"FULLWIDTH\"/>\n\t\t<field name=\"HALFWIDTH\"/>\n\t\t<field name=\"NARROW\"/>\n\t\t<field name=\"NEUTRAL\"/>\n\t\t<field name=\"WIDE\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UCharacter$GraphemeClusterBreak\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CONTROL\"/>\n\t\t<field name=\"CR\"/>\n\t\t<field name=\"EXTEND\"/>\n\t\t<field name=\"E_BASE\" since=\"26\"/>\n\t\t<field name=\"E_BASE_GAZ\" since=\"26\"/>\n\t\t<field name=\"E_MODIFIER\" since=\"26\"/>\n\t\t<field name=\"GLUE_AFTER_ZWJ\" since=\"26\"/>\n\t\t<field name=\"L\"/>\n\t\t<field name=\"LF\"/>\n\t\t<field name=\"LV\"/>\n\t\t<field name=\"LVT\"/>\n\t\t<field name=\"OTHER\"/>\n\t\t<field name=\"PREPEND\"/>\n\t\t<field name=\"REGIONAL_INDICATOR\"/>\n\t\t<field name=\"SPACING_MARK\"/>\n\t\t<field name=\"T\"/>\n\t\t<field name=\"V\"/>\n\t\t<field name=\"ZWJ\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UCharacter$HangulSyllableType\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"LEADING_JAMO\"/>\n\t\t<field name=\"LVT_SYLLABLE\"/>\n\t\t<field name=\"LV_SYLLABLE\"/>\n\t\t<field name=\"NOT_APPLICABLE\"/>\n\t\t<field name=\"TRAILING_JAMO\"/>\n\t\t<field name=\"VOWEL_JAMO\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UCharacter$IndicPositionalCategory\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"BOTTOM\"/>\n\t\t<field name=\"BOTTOM_AND_LEFT\"/>\n\t\t<field name=\"BOTTOM_AND_RIGHT\"/>\n\t\t<field name=\"LEFT\"/>\n\t\t<field name=\"LEFT_AND_RIGHT\"/>\n\t\t<field name=\"NA\"/>\n\t\t<field name=\"OVERSTRUCK\"/>\n\t\t<field name=\"RIGHT\"/>\n\t\t<field name=\"TOP\"/>\n\t\t<field name=\"TOP_AND_BOTTOM\"/>\n\t\t<field name=\"TOP_AND_BOTTOM_AND_LEFT\" since=\"30\"/>\n\t\t<field name=\"TOP_AND_BOTTOM_AND_RIGHT\"/>\n\t\t<field name=\"TOP_AND_LEFT\"/>\n\t\t<field name=\"TOP_AND_LEFT_AND_RIGHT\"/>\n\t\t<field name=\"TOP_AND_RIGHT\"/>\n\t\t<field name=\"VISUAL_ORDER_LEFT\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UCharacter$IndicSyllabicCategory\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"AVAGRAHA\"/>\n\t\t<field name=\"BINDU\"/>\n\t\t<field name=\"BRAHMI_JOINING_NUMBER\"/>\n\t\t<field name=\"CANTILLATION_MARK\"/>\n\t\t<field name=\"CONSONANT\"/>\n\t\t<field name=\"CONSONANT_DEAD\"/>\n\t\t<field name=\"CONSONANT_FINAL\"/>\n\t\t<field name=\"CONSONANT_HEAD_LETTER\"/>\n\t\t<field name=\"CONSONANT_INITIAL_POSTFIXED\"/>\n\t\t<field name=\"CONSONANT_KILLER\"/>\n\t\t<field name=\"CONSONANT_MEDIAL\"/>\n\t\t<field name=\"CONSONANT_PLACEHOLDER\"/>\n\t\t<field name=\"CONSONANT_PRECEDING_REPHA\"/>\n\t\t<field name=\"CONSONANT_PREFIXED\"/>\n\t\t<field name=\"CONSONANT_SUBJOINED\"/>\n\t\t<field name=\"CONSONANT_SUCCEEDING_REPHA\"/>\n\t\t<field name=\"CONSONANT_WITH_STACKER\"/>\n\t\t<field name=\"GEMINATION_MARK\"/>\n\t\t<field name=\"INVISIBLE_STACKER\"/>\n\t\t<field name=\"JOINER\"/>\n\t\t<field name=\"MODIFYING_LETTER\"/>\n\t\t<field name=\"NON_JOINER\"/>\n\t\t<field name=\"NUKTA\"/>\n\t\t<field name=\"NUMBER\"/>\n\t\t<field name=\"NUMBER_JOINER\"/>\n\t\t<field name=\"OTHER\"/>\n\t\t<field name=\"PURE_KILLER\"/>\n\t\t<field name=\"REGISTER_SHIFTER\"/>\n\t\t<field name=\"SYLLABLE_MODIFIER\"/>\n\t\t<field name=\"TONE_LETTER\"/>\n\t\t<field name=\"TONE_MARK\"/>\n\t\t<field name=\"VIRAMA\"/>\n\t\t<field name=\"VISARGA\"/>\n\t\t<field name=\"VOWEL\"/>\n\t\t<field name=\"VOWEL_DEPENDENT\"/>\n\t\t<field name=\"VOWEL_INDEPENDENT\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UCharacter$JoiningGroup\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"AFRICAN_FEH\" since=\"26\"/>\n\t\t<field name=\"AFRICAN_NOON\" since=\"26\"/>\n\t\t<field name=\"AFRICAN_QAF\" since=\"26\"/>\n\t\t<field name=\"AIN\"/>\n\t\t<field name=\"ALAPH\"/>\n\t\t<field name=\"ALEF\"/>\n\t\t<field name=\"BEH\"/>\n\t\t<field name=\"BETH\"/>\n\t\t<field name=\"BURUSHASKI_YEH_BARREE\"/>\n\t\t<field name=\"DAL\"/>\n\t\t<field name=\"DALATH_RISH\"/>\n\t\t<field name=\"E\"/>\n\t\t<field name=\"FARSI_YEH\"/>\n\t\t<field name=\"FE\"/>\n\t\t<field name=\"FEH\"/>\n\t\t<field name=\"FINAL_SEMKATH\"/>\n\t\t<field name=\"GAF\"/>\n\t\t<field name=\"GAMAL\"/>\n\t\t<field name=\"HAH\"/>\n\t\t<field name=\"HAMZA_ON_HEH_GOAL\"/>\n\t\t<field name=\"HANIFI_ROHINGYA_KINNA_YA\" since=\"29\"/>\n\t\t<field name=\"HANIFI_ROHINGYA_PA\" since=\"29\"/>\n\t\t<field name=\"HE\"/>\n\t\t<field name=\"HEH\"/>\n\t\t<field name=\"HEH_GOAL\"/>\n\t\t<field name=\"HETH\"/>\n\t\t<field name=\"KAF\"/>\n\t\t<field name=\"KAPH\"/>\n\t\t<field name=\"KHAPH\"/>\n\t\t<field name=\"KNOTTED_HEH\"/>\n\t\t<field name=\"LAM\"/>\n\t\t<field name=\"LAMADH\"/>\n\t\t<field name=\"MALAYALAM_BHA\" since=\"28\"/>\n\t\t<field name=\"MALAYALAM_JA\" since=\"28\"/>\n\t\t<field name=\"MALAYALAM_LLA\" since=\"28\"/>\n\t\t<field name=\"MALAYALAM_LLLA\" since=\"28\"/>\n\t\t<field name=\"MALAYALAM_NGA\" since=\"28\"/>\n\t\t<field name=\"MALAYALAM_NNA\" since=\"28\"/>\n\t\t<field name=\"MALAYALAM_NNNA\" since=\"28\"/>\n\t\t<field name=\"MALAYALAM_NYA\" since=\"28\"/>\n\t\t<field name=\"MALAYALAM_RA\" since=\"28\"/>\n\t\t<field name=\"MALAYALAM_SSA\" since=\"28\"/>\n\t\t<field name=\"MALAYALAM_TTA\" since=\"28\"/>\n\t\t<field name=\"MANICHAEAN_ALEPH\"/>\n\t\t<field name=\"MANICHAEAN_AYIN\"/>\n\t\t<field name=\"MANICHAEAN_BETH\"/>\n\t\t<field name=\"MANICHAEAN_DALETH\"/>\n\t\t<field name=\"MANICHAEAN_DHAMEDH\"/>\n\t\t<field name=\"MANICHAEAN_FIVE\"/>\n\t\t<field name=\"MANICHAEAN_GIMEL\"/>\n\t\t<field name=\"MANICHAEAN_HETH\"/>\n\t\t<field name=\"MANICHAEAN_HUNDRED\"/>\n\t\t<field name=\"MANICHAEAN_KAPH\"/>\n\t\t<field name=\"MANICHAEAN_LAMEDH\"/>\n\t\t<field name=\"MANICHAEAN_MEM\"/>\n\t\t<field name=\"MANICHAEAN_NUN\"/>\n\t\t<field name=\"MANICHAEAN_ONE\"/>\n\t\t<field name=\"MANICHAEAN_PE\"/>\n\t\t<field name=\"MANICHAEAN_QOPH\"/>\n\t\t<field name=\"MANICHAEAN_RESH\"/>\n\t\t<field name=\"MANICHAEAN_SADHE\"/>\n\t\t<field name=\"MANICHAEAN_SAMEKH\"/>\n\t\t<field name=\"MANICHAEAN_TAW\"/>\n\t\t<field name=\"MANICHAEAN_TEN\"/>\n\t\t<field name=\"MANICHAEAN_TETH\"/>\n\t\t<field name=\"MANICHAEAN_THAMEDH\"/>\n\t\t<field name=\"MANICHAEAN_TWENTY\"/>\n\t\t<field name=\"MANICHAEAN_WAW\"/>\n\t\t<field name=\"MANICHAEAN_YODH\"/>\n\t\t<field name=\"MANICHAEAN_ZAYIN\"/>\n\t\t<field name=\"MEEM\"/>\n\t\t<field name=\"MIM\"/>\n\t\t<field name=\"NOON\"/>\n\t\t<field name=\"NO_JOINING_GROUP\"/>\n\t\t<field name=\"NUN\"/>\n\t\t<field name=\"NYA\"/>\n\t\t<field name=\"PE\"/>\n\t\t<field name=\"QAF\"/>\n\t\t<field name=\"QAPH\"/>\n\t\t<field name=\"REH\"/>\n\t\t<field name=\"REVERSED_PE\"/>\n\t\t<field name=\"ROHINGYA_YEH\"/>\n\t\t<field name=\"SAD\"/>\n\t\t<field name=\"SADHE\"/>\n\t\t<field name=\"SEEN\"/>\n\t\t<field name=\"SEMKATH\"/>\n\t\t<field name=\"SHIN\"/>\n\t\t<field name=\"STRAIGHT_WAW\"/>\n\t\t<field name=\"SWASH_KAF\"/>\n\t\t<field name=\"SYRIAC_WAW\"/>\n\t\t<field name=\"TAH\"/>\n\t\t<field name=\"TAW\"/>\n\t\t<field name=\"TEH_MARBUTA\"/>\n\t\t<field name=\"TEH_MARBUTA_GOAL\"/>\n\t\t<field name=\"TETH\"/>\n\t\t<field name=\"WAW\"/>\n\t\t<field name=\"YEH\"/>\n\t\t<field name=\"YEH_BARREE\"/>\n\t\t<field name=\"YEH_WITH_TAIL\"/>\n\t\t<field name=\"YUDH\"/>\n\t\t<field name=\"YUDH_HE\"/>\n\t\t<field name=\"ZAIN\"/>\n\t\t<field name=\"ZHAIN\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UCharacter$JoiningType\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"DUAL_JOINING\"/>\n\t\t<field name=\"JOIN_CAUSING\"/>\n\t\t<field name=\"LEFT_JOINING\"/>\n\t\t<field name=\"NON_JOINING\"/>\n\t\t<field name=\"RIGHT_JOINING\"/>\n\t\t<field name=\"TRANSPARENT\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UCharacter$LineBreak\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ALPHABETIC\"/>\n\t\t<field name=\"AMBIGUOUS\"/>\n\t\t<field name=\"BREAK_AFTER\"/>\n\t\t<field name=\"BREAK_BEFORE\"/>\n\t\t<field name=\"BREAK_BOTH\"/>\n\t\t<field name=\"BREAK_SYMBOLS\"/>\n\t\t<field name=\"CARRIAGE_RETURN\"/>\n\t\t<field name=\"CLOSE_PARENTHESIS\"/>\n\t\t<field name=\"CLOSE_PUNCTUATION\"/>\n\t\t<field name=\"COMBINING_MARK\"/>\n\t\t<field name=\"COMPLEX_CONTEXT\"/>\n\t\t<field name=\"CONDITIONAL_JAPANESE_STARTER\"/>\n\t\t<field name=\"CONTINGENT_BREAK\"/>\n\t\t<field name=\"EXCLAMATION\"/>\n\t\t<field name=\"E_BASE\" since=\"26\"/>\n\t\t<field name=\"E_MODIFIER\" since=\"26\"/>\n\t\t<field name=\"GLUE\"/>\n\t\t<field name=\"H2\"/>\n\t\t<field name=\"H3\"/>\n\t\t<field name=\"HEBREW_LETTER\"/>\n\t\t<field name=\"HYPHEN\"/>\n\t\t<field name=\"IDEOGRAPHIC\"/>\n\t\t<field name=\"INFIX_NUMERIC\"/>\n\t\t<field name=\"INSEPARABLE\"/>\n\t\t<field name=\"INSEPERABLE\"/>\n\t\t<field name=\"JL\"/>\n\t\t<field name=\"JT\"/>\n\t\t<field name=\"JV\"/>\n\t\t<field name=\"LINE_FEED\"/>\n\t\t<field name=\"MANDATORY_BREAK\"/>\n\t\t<field name=\"NEXT_LINE\"/>\n\t\t<field name=\"NONSTARTER\"/>\n\t\t<field name=\"NUMERIC\"/>\n\t\t<field name=\"OPEN_PUNCTUATION\"/>\n\t\t<field name=\"POSTFIX_NUMERIC\"/>\n\t\t<field name=\"PREFIX_NUMERIC\"/>\n\t\t<field name=\"QUOTATION\"/>\n\t\t<field name=\"REGIONAL_INDICATOR\"/>\n\t\t<field name=\"SPACE\"/>\n\t\t<field name=\"SURROGATE\"/>\n\t\t<field name=\"UNKNOWN\"/>\n\t\t<field name=\"WORD_JOINER\"/>\n\t\t<field name=\"ZWJ\" since=\"26\"/>\n\t\t<field name=\"ZWSPACE\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UCharacter$NumericType\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"DECIMAL\"/>\n\t\t<field name=\"DIGIT\"/>\n\t\t<field name=\"NONE\"/>\n\t\t<field name=\"NUMERIC\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UCharacter$SentenceBreak\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ATERM\"/>\n\t\t<field name=\"CLOSE\"/>\n\t\t<field name=\"CR\"/>\n\t\t<field name=\"EXTEND\"/>\n\t\t<field name=\"FORMAT\"/>\n\t\t<field name=\"LF\"/>\n\t\t<field name=\"LOWER\"/>\n\t\t<field name=\"NUMERIC\"/>\n\t\t<field name=\"OLETTER\"/>\n\t\t<field name=\"OTHER\"/>\n\t\t<field name=\"SCONTINUE\"/>\n\t\t<field name=\"SEP\"/>\n\t\t<field name=\"SP\"/>\n\t\t<field name=\"STERM\"/>\n\t\t<field name=\"UPPER\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UCharacter$UnicodeBlock\" since=\"24\">\n\t\t<extends name=\"java/lang/Character$Subset\"/>\n\t\t<method name=\"forName(Ljava/lang/String;)Landroid/icu/lang/UCharacter$UnicodeBlock;\"/>\n\t\t<method name=\"getID()I\"/>\n\t\t<method name=\"getInstance(I)Landroid/icu/lang/UCharacter$UnicodeBlock;\"/>\n\t\t<method name=\"of(I)Landroid/icu/lang/UCharacter$UnicodeBlock;\"/>\n\t\t<field name=\"ADLAM\" since=\"26\"/>\n\t\t<field name=\"ADLAM_ID\" since=\"26\"/>\n\t\t<field name=\"AEGEAN_NUMBERS\"/>\n\t\t<field name=\"AEGEAN_NUMBERS_ID\"/>\n\t\t<field name=\"AHOM\"/>\n\t\t<field name=\"AHOM_ID\"/>\n\t\t<field name=\"ALCHEMICAL_SYMBOLS\"/>\n\t\t<field name=\"ALCHEMICAL_SYMBOLS_ID\"/>\n\t\t<field name=\"ALPHABETIC_PRESENTATION_FORMS\"/>\n\t\t<field name=\"ALPHABETIC_PRESENTATION_FORMS_ID\"/>\n\t\t<field name=\"ANATOLIAN_HIEROGLYPHS\"/>\n\t\t<field name=\"ANATOLIAN_HIEROGLYPHS_ID\"/>\n\t\t<field name=\"ANCIENT_GREEK_MUSICAL_NOTATION\"/>\n\t\t<field name=\"ANCIENT_GREEK_MUSICAL_NOTATION_ID\"/>\n\t\t<field name=\"ANCIENT_GREEK_NUMBERS\"/>\n\t\t<field name=\"ANCIENT_GREEK_NUMBERS_ID\"/>\n\t\t<field name=\"ANCIENT_SYMBOLS\"/>\n\t\t<field name=\"ANCIENT_SYMBOLS_ID\"/>\n\t\t<field name=\"ARABIC\"/>\n\t\t<field name=\"ARABIC_EXTENDED_A\"/>\n\t\t<field name=\"ARABIC_EXTENDED_A_ID\"/>\n\t\t<field name=\"ARABIC_ID\"/>\n\t\t<field name=\"ARABIC_MATHEMATICAL_ALPHABETIC_SYMBOLS\"/>\n\t\t<field name=\"ARABIC_MATHEMATICAL_ALPHABETIC_SYMBOLS_ID\"/>\n\t\t<field name=\"ARABIC_PRESENTATION_FORMS_A\"/>\n\t\t<field name=\"ARABIC_PRESENTATION_FORMS_A_ID\"/>\n\t\t<field name=\"ARABIC_PRESENTATION_FORMS_B\"/>\n\t\t<field name=\"ARABIC_PRESENTATION_FORMS_B_ID\"/>\n\t\t<field name=\"ARABIC_SUPPLEMENT\"/>\n\t\t<field name=\"ARABIC_SUPPLEMENT_ID\"/>\n\t\t<field name=\"ARMENIAN\"/>\n\t\t<field name=\"ARMENIAN_ID\"/>\n\t\t<field name=\"ARROWS\"/>\n\t\t<field name=\"ARROWS_ID\"/>\n\t\t<field name=\"AVESTAN\"/>\n\t\t<field name=\"AVESTAN_ID\"/>\n\t\t<field name=\"BALINESE\"/>\n\t\t<field name=\"BALINESE_ID\"/>\n\t\t<field name=\"BAMUM\"/>\n\t\t<field name=\"BAMUM_ID\"/>\n\t\t<field name=\"BAMUM_SUPPLEMENT\"/>\n\t\t<field name=\"BAMUM_SUPPLEMENT_ID\"/>\n\t\t<field name=\"BASIC_LATIN\"/>\n\t\t<field name=\"BASIC_LATIN_ID\"/>\n\t\t<field name=\"BASSA_VAH\"/>\n\t\t<field name=\"BASSA_VAH_ID\"/>\n\t\t<field name=\"BATAK\"/>\n\t\t<field name=\"BATAK_ID\"/>\n\t\t<field name=\"BENGALI\"/>\n\t\t<field name=\"BENGALI_ID\"/>\n\t\t<field name=\"BHAIKSUKI\" since=\"26\"/>\n\t\t<field name=\"BHAIKSUKI_ID\" since=\"26\"/>\n\t\t<field name=\"BLOCK_ELEMENTS\"/>\n\t\t<field name=\"BLOCK_ELEMENTS_ID\"/>\n\t\t<field name=\"BOPOMOFO\"/>\n\t\t<field name=\"BOPOMOFO_EXTENDED\"/>\n\t\t<field name=\"BOPOMOFO_EXTENDED_ID\"/>\n\t\t<field name=\"BOPOMOFO_ID\"/>\n\t\t<field name=\"BOX_DRAWING\"/>\n\t\t<field name=\"BOX_DRAWING_ID\"/>\n\t\t<field name=\"BRAHMI\"/>\n\t\t<field name=\"BRAHMI_ID\"/>\n\t\t<field name=\"BRAILLE_PATTERNS\"/>\n\t\t<field name=\"BRAILLE_PATTERNS_ID\"/>\n\t\t<field name=\"BUGINESE\"/>\n\t\t<field name=\"BUGINESE_ID\"/>\n\t\t<field name=\"BUHID\"/>\n\t\t<field name=\"BUHID_ID\"/>\n\t\t<field name=\"BYZANTINE_MUSICAL_SYMBOLS\"/>\n\t\t<field name=\"BYZANTINE_MUSICAL_SYMBOLS_ID\"/>\n\t\t<field name=\"CARIAN\"/>\n\t\t<field name=\"CARIAN_ID\"/>\n\t\t<field name=\"CAUCASIAN_ALBANIAN\"/>\n\t\t<field name=\"CAUCASIAN_ALBANIAN_ID\"/>\n\t\t<field name=\"CHAKMA\"/>\n\t\t<field name=\"CHAKMA_ID\"/>\n\t\t<field name=\"CHAM\"/>\n\t\t<field name=\"CHAM_ID\"/>\n\t\t<field name=\"CHEROKEE\"/>\n\t\t<field name=\"CHEROKEE_ID\"/>\n\t\t<field name=\"CHEROKEE_SUPPLEMENT\"/>\n\t\t<field name=\"CHEROKEE_SUPPLEMENT_ID\"/>\n\t\t<field name=\"CHESS_SYMBOLS\" since=\"29\"/>\n\t\t<field name=\"CHESS_SYMBOLS_ID\" since=\"29\"/>\n\t\t<field name=\"CHORASMIAN\" since=\"30\"/>\n\t\t<field name=\"CHORASMIAN_ID\" since=\"30\"/>\n\t\t<field name=\"CJK_COMPATIBILITY\"/>\n\t\t<field name=\"CJK_COMPATIBILITY_FORMS\"/>\n\t\t<field name=\"CJK_COMPATIBILITY_FORMS_ID\"/>\n\t\t<field name=\"CJK_COMPATIBILITY_ID\"/>\n\t\t<field name=\"CJK_COMPATIBILITY_IDEOGRAPHS\"/>\n\t\t<field name=\"CJK_COMPATIBILITY_IDEOGRAPHS_ID\"/>\n\t\t<field name=\"CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT\"/>\n\t\t<field name=\"CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT_ID\"/>\n\t\t<field name=\"CJK_RADICALS_SUPPLEMENT\"/>\n\t\t<field name=\"CJK_RADICALS_SUPPLEMENT_ID\"/>\n\t\t<field name=\"CJK_STROKES\"/>\n\t\t<field name=\"CJK_STROKES_ID\"/>\n\t\t<field name=\"CJK_SYMBOLS_AND_PUNCTUATION\"/>\n\t\t<field name=\"CJK_SYMBOLS_AND_PUNCTUATION_ID\"/>\n\t\t<field name=\"CJK_UNIFIED_IDEOGRAPHS\"/>\n\t\t<field name=\"CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A\"/>\n\t\t<field name=\"CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A_ID\"/>\n\t\t<field name=\"CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B\"/>\n\t\t<field name=\"CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B_ID\"/>\n\t\t<field name=\"CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C\"/>\n\t\t<field name=\"CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C_ID\"/>\n\t\t<field name=\"CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D\"/>\n\t\t<field name=\"CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D_ID\"/>\n\t\t<field name=\"CJK_UNIFIED_IDEOGRAPHS_EXTENSION_E\"/>\n\t\t<field name=\"CJK_UNIFIED_IDEOGRAPHS_EXTENSION_E_ID\"/>\n\t\t<field name=\"CJK_UNIFIED_IDEOGRAPHS_EXTENSION_F\" since=\"28\"/>\n\t\t<field name=\"CJK_UNIFIED_IDEOGRAPHS_EXTENSION_F_ID\" since=\"28\"/>\n\t\t<field name=\"CJK_UNIFIED_IDEOGRAPHS_EXTENSION_G\" since=\"30\"/>\n\t\t<field name=\"CJK_UNIFIED_IDEOGRAPHS_EXTENSION_G_ID\" since=\"30\"/>\n\t\t<field name=\"CJK_UNIFIED_IDEOGRAPHS_ID\"/>\n\t\t<field name=\"COMBINING_DIACRITICAL_MARKS\"/>\n\t\t<field name=\"COMBINING_DIACRITICAL_MARKS_EXTENDED\"/>\n\t\t<field name=\"COMBINING_DIACRITICAL_MARKS_EXTENDED_ID\"/>\n\t\t<field name=\"COMBINING_DIACRITICAL_MARKS_ID\"/>\n\t\t<field name=\"COMBINING_DIACRITICAL_MARKS_SUPPLEMENT\"/>\n\t\t<field name=\"COMBINING_DIACRITICAL_MARKS_SUPPLEMENT_ID\"/>\n\t\t<field name=\"COMBINING_HALF_MARKS\"/>\n\t\t<field name=\"COMBINING_HALF_MARKS_ID\"/>\n\t\t<field name=\"COMBINING_MARKS_FOR_SYMBOLS\"/>\n\t\t<field name=\"COMBINING_MARKS_FOR_SYMBOLS_ID\"/>\n\t\t<field name=\"COMMON_INDIC_NUMBER_FORMS\"/>\n\t\t<field name=\"COMMON_INDIC_NUMBER_FORMS_ID\"/>\n\t\t<field name=\"CONTROL_PICTURES\"/>\n\t\t<field name=\"CONTROL_PICTURES_ID\"/>\n\t\t<field name=\"COPTIC\"/>\n\t\t<field name=\"COPTIC_EPACT_NUMBERS\"/>\n\t\t<field name=\"COPTIC_EPACT_NUMBERS_ID\"/>\n\t\t<field name=\"COPTIC_ID\"/>\n\t\t<field name=\"COUNTING_ROD_NUMERALS\"/>\n\t\t<field name=\"COUNTING_ROD_NUMERALS_ID\"/>\n\t\t<field name=\"CUNEIFORM\"/>\n\t\t<field name=\"CUNEIFORM_ID\"/>\n\t\t<field name=\"CUNEIFORM_NUMBERS_AND_PUNCTUATION\"/>\n\t\t<field name=\"CUNEIFORM_NUMBERS_AND_PUNCTUATION_ID\"/>\n\t\t<field name=\"CURRENCY_SYMBOLS\"/>\n\t\t<field name=\"CURRENCY_SYMBOLS_ID\"/>\n\t\t<field name=\"CYPRIOT_SYLLABARY\"/>\n\t\t<field name=\"CYPRIOT_SYLLABARY_ID\"/>\n\t\t<field name=\"CYRILLIC\"/>\n\t\t<field name=\"CYRILLIC_EXTENDED_A\"/>\n\t\t<field name=\"CYRILLIC_EXTENDED_A_ID\"/>\n\t\t<field name=\"CYRILLIC_EXTENDED_B\"/>\n\t\t<field name=\"CYRILLIC_EXTENDED_B_ID\"/>\n\t\t<field name=\"CYRILLIC_EXTENDED_C\" since=\"26\"/>\n\t\t<field name=\"CYRILLIC_EXTENDED_C_ID\" since=\"26\"/>\n\t\t<field name=\"CYRILLIC_ID\"/>\n\t\t<field name=\"CYRILLIC_SUPPLEMENT\"/>\n\t\t<field name=\"CYRILLIC_SUPPLEMENTARY\"/>\n\t\t<field name=\"CYRILLIC_SUPPLEMENTARY_ID\"/>\n\t\t<field name=\"CYRILLIC_SUPPLEMENT_ID\"/>\n\t\t<field name=\"DESERET\"/>\n\t\t<field name=\"DESERET_ID\"/>\n\t\t<field name=\"DEVANAGARI\"/>\n\t\t<field name=\"DEVANAGARI_EXTENDED\"/>\n\t\t<field name=\"DEVANAGARI_EXTENDED_ID\"/>\n\t\t<field name=\"DEVANAGARI_ID\"/>\n\t\t<field name=\"DINGBATS\"/>\n\t\t<field name=\"DINGBATS_ID\"/>\n\t\t<field name=\"DIVES_AKURU\" since=\"30\"/>\n\t\t<field name=\"DIVES_AKURU_ID\" since=\"30\"/>\n\t\t<field name=\"DOGRA\" since=\"29\"/>\n\t\t<field name=\"DOGRA_ID\" since=\"29\"/>\n\t\t<field name=\"DOMINO_TILES\"/>\n\t\t<field name=\"DOMINO_TILES_ID\"/>\n\t\t<field name=\"DUPLOYAN\"/>\n\t\t<field name=\"DUPLOYAN_ID\"/>\n\t\t<field name=\"EARLY_DYNASTIC_CUNEIFORM\"/>\n\t\t<field name=\"EARLY_DYNASTIC_CUNEIFORM_ID\"/>\n\t\t<field name=\"EGYPTIAN_HIEROGLYPHS\"/>\n\t\t<field name=\"EGYPTIAN_HIEROGLYPHS_ID\"/>\n\t\t<field name=\"EGYPTIAN_HIEROGLYPH_FORMAT_CONTROLS\" since=\"30\"/>\n\t\t<field name=\"EGYPTIAN_HIEROGLYPH_FORMAT_CONTROLS_ID\" since=\"30\"/>\n\t\t<field name=\"ELBASAN\"/>\n\t\t<field name=\"ELBASAN_ID\"/>\n\t\t<field name=\"ELYMAIC\" since=\"30\"/>\n\t\t<field name=\"ELYMAIC_ID\" since=\"30\"/>\n\t\t<field name=\"EMOTICONS\"/>\n\t\t<field name=\"EMOTICONS_ID\"/>\n\t\t<field name=\"ENCLOSED_ALPHANUMERICS\"/>\n\t\t<field name=\"ENCLOSED_ALPHANUMERICS_ID\"/>\n\t\t<field name=\"ENCLOSED_ALPHANUMERIC_SUPPLEMENT\"/>\n\t\t<field name=\"ENCLOSED_ALPHANUMERIC_SUPPLEMENT_ID\"/>\n\t\t<field name=\"ENCLOSED_CJK_LETTERS_AND_MONTHS\"/>\n\t\t<field name=\"ENCLOSED_CJK_LETTERS_AND_MONTHS_ID\"/>\n\t\t<field name=\"ENCLOSED_IDEOGRAPHIC_SUPPLEMENT\"/>\n\t\t<field name=\"ENCLOSED_IDEOGRAPHIC_SUPPLEMENT_ID\"/>\n\t\t<field name=\"ETHIOPIC\"/>\n\t\t<field name=\"ETHIOPIC_EXTENDED\"/>\n\t\t<field name=\"ETHIOPIC_EXTENDED_A\"/>\n\t\t<field name=\"ETHIOPIC_EXTENDED_A_ID\"/>\n\t\t<field name=\"ETHIOPIC_EXTENDED_ID\"/>\n\t\t<field name=\"ETHIOPIC_ID\"/>\n\t\t<field name=\"ETHIOPIC_SUPPLEMENT\"/>\n\t\t<field name=\"ETHIOPIC_SUPPLEMENT_ID\"/>\n\t\t<field name=\"GENERAL_PUNCTUATION\"/>\n\t\t<field name=\"GENERAL_PUNCTUATION_ID\"/>\n\t\t<field name=\"GEOMETRIC_SHAPES\"/>\n\t\t<field name=\"GEOMETRIC_SHAPES_EXTENDED\"/>\n\t\t<field name=\"GEOMETRIC_SHAPES_EXTENDED_ID\"/>\n\t\t<field name=\"GEOMETRIC_SHAPES_ID\"/>\n\t\t<field name=\"GEORGIAN\"/>\n\t\t<field name=\"GEORGIAN_EXTENDED\" since=\"29\"/>\n\t\t<field name=\"GEORGIAN_EXTENDED_ID\" since=\"29\"/>\n\t\t<field name=\"GEORGIAN_ID\"/>\n\t\t<field name=\"GEORGIAN_SUPPLEMENT\"/>\n\t\t<field name=\"GEORGIAN_SUPPLEMENT_ID\"/>\n\t\t<field name=\"GLAGOLITIC\"/>\n\t\t<field name=\"GLAGOLITIC_ID\"/>\n\t\t<field name=\"GLAGOLITIC_SUPPLEMENT\" since=\"26\"/>\n\t\t<field name=\"GLAGOLITIC_SUPPLEMENT_ID\" since=\"26\"/>\n\t\t<field name=\"GOTHIC\"/>\n\t\t<field name=\"GOTHIC_ID\"/>\n\t\t<field name=\"GRANTHA\"/>\n\t\t<field name=\"GRANTHA_ID\"/>\n\t\t<field name=\"GREEK\"/>\n\t\t<field name=\"GREEK_EXTENDED\"/>\n\t\t<field name=\"GREEK_EXTENDED_ID\"/>\n\t\t<field name=\"GREEK_ID\"/>\n\t\t<field name=\"GUJARATI\"/>\n\t\t<field name=\"GUJARATI_ID\"/>\n\t\t<field name=\"GUNJALA_GONDI\" since=\"29\"/>\n\t\t<field name=\"GUNJALA_GONDI_ID\" since=\"29\"/>\n\t\t<field name=\"GURMUKHI\"/>\n\t\t<field name=\"GURMUKHI_ID\"/>\n\t\t<field name=\"HALFWIDTH_AND_FULLWIDTH_FORMS\"/>\n\t\t<field name=\"HALFWIDTH_AND_FULLWIDTH_FORMS_ID\"/>\n\t\t<field name=\"HANGUL_COMPATIBILITY_JAMO\"/>\n\t\t<field name=\"HANGUL_COMPATIBILITY_JAMO_ID\"/>\n\t\t<field name=\"HANGUL_JAMO\"/>\n\t\t<field name=\"HANGUL_JAMO_EXTENDED_A\"/>\n\t\t<field name=\"HANGUL_JAMO_EXTENDED_A_ID\"/>\n\t\t<field name=\"HANGUL_JAMO_EXTENDED_B\"/>\n\t\t<field name=\"HANGUL_JAMO_EXTENDED_B_ID\"/>\n\t\t<field name=\"HANGUL_JAMO_ID\"/>\n\t\t<field name=\"HANGUL_SYLLABLES\"/>\n\t\t<field name=\"HANGUL_SYLLABLES_ID\"/>\n\t\t<field name=\"HANIFI_ROHINGYA\" since=\"29\"/>\n\t\t<field name=\"HANIFI_ROHINGYA_ID\" since=\"29\"/>\n\t\t<field name=\"HANUNOO\"/>\n\t\t<field name=\"HANUNOO_ID\"/>\n\t\t<field name=\"HATRAN\"/>\n\t\t<field name=\"HATRAN_ID\"/>\n\t\t<field name=\"HEBREW\"/>\n\t\t<field name=\"HEBREW_ID\"/>\n\t\t<field name=\"HIGH_PRIVATE_USE_SURROGATES\"/>\n\t\t<field name=\"HIGH_PRIVATE_USE_SURROGATES_ID\"/>\n\t\t<field name=\"HIGH_SURROGATES\"/>\n\t\t<field name=\"HIGH_SURROGATES_ID\"/>\n\t\t<field name=\"HIRAGANA\"/>\n\t\t<field name=\"HIRAGANA_ID\"/>\n\t\t<field name=\"IDEOGRAPHIC_DESCRIPTION_CHARACTERS\"/>\n\t\t<field name=\"IDEOGRAPHIC_DESCRIPTION_CHARACTERS_ID\"/>\n\t\t<field name=\"IDEOGRAPHIC_SYMBOLS_AND_PUNCTUATION\" since=\"26\"/>\n\t\t<field name=\"IDEOGRAPHIC_SYMBOLS_AND_PUNCTUATION_ID\" since=\"26\"/>\n\t\t<field name=\"IMPERIAL_ARAMAIC\"/>\n\t\t<field name=\"IMPERIAL_ARAMAIC_ID\"/>\n\t\t<field name=\"INDIC_SIYAQ_NUMBERS\" since=\"29\"/>\n\t\t<field name=\"INDIC_SIYAQ_NUMBERS_ID\" since=\"29\"/>\n\t\t<field name=\"INSCRIPTIONAL_PAHLAVI\"/>\n\t\t<field name=\"INSCRIPTIONAL_PAHLAVI_ID\"/>\n\t\t<field name=\"INSCRIPTIONAL_PARTHIAN\"/>\n\t\t<field name=\"INSCRIPTIONAL_PARTHIAN_ID\"/>\n\t\t<field name=\"INVALID_CODE\"/>\n\t\t<field name=\"INVALID_CODE_ID\"/>\n\t\t<field name=\"IPA_EXTENSIONS\"/>\n\t\t<field name=\"IPA_EXTENSIONS_ID\"/>\n\t\t<field name=\"JAVANESE\"/>\n\t\t<field name=\"JAVANESE_ID\"/>\n\t\t<field name=\"KAITHI\"/>\n\t\t<field name=\"KAITHI_ID\"/>\n\t\t<field name=\"KANA_EXTENDED_A\" since=\"28\"/>\n\t\t<field name=\"KANA_EXTENDED_A_ID\" since=\"28\"/>\n\t\t<field name=\"KANA_SUPPLEMENT\"/>\n\t\t<field name=\"KANA_SUPPLEMENT_ID\"/>\n\t\t<field name=\"KANBUN\"/>\n\t\t<field name=\"KANBUN_ID\"/>\n\t\t<field name=\"KANGXI_RADICALS\"/>\n\t\t<field name=\"KANGXI_RADICALS_ID\"/>\n\t\t<field name=\"KANNADA\"/>\n\t\t<field name=\"KANNADA_ID\"/>\n\t\t<field name=\"KATAKANA\"/>\n\t\t<field name=\"KATAKANA_ID\"/>\n\t\t<field name=\"KATAKANA_PHONETIC_EXTENSIONS\"/>\n\t\t<field name=\"KATAKANA_PHONETIC_EXTENSIONS_ID\"/>\n\t\t<field name=\"KAYAH_LI\"/>\n\t\t<field name=\"KAYAH_LI_ID\"/>\n\t\t<field name=\"KHAROSHTHI\"/>\n\t\t<field name=\"KHAROSHTHI_ID\"/>\n\t\t<field name=\"KHITAN_SMALL_SCRIPT\" since=\"30\"/>\n\t\t<field name=\"KHITAN_SMALL_SCRIPT_ID\" since=\"30\"/>\n\t\t<field name=\"KHMER\"/>\n\t\t<field name=\"KHMER_ID\"/>\n\t\t<field name=\"KHMER_SYMBOLS\"/>\n\t\t<field name=\"KHMER_SYMBOLS_ID\"/>\n\t\t<field name=\"KHOJKI\"/>\n\t\t<field name=\"KHOJKI_ID\"/>\n\t\t<field name=\"KHUDAWADI\"/>\n\t\t<field name=\"KHUDAWADI_ID\"/>\n\t\t<field name=\"LAO\"/>\n\t\t<field name=\"LAO_ID\"/>\n\t\t<field name=\"LATIN_1_SUPPLEMENT\"/>\n\t\t<field name=\"LATIN_1_SUPPLEMENT_ID\"/>\n\t\t<field name=\"LATIN_EXTENDED_A\"/>\n\t\t<field name=\"LATIN_EXTENDED_ADDITIONAL\"/>\n\t\t<field name=\"LATIN_EXTENDED_ADDITIONAL_ID\"/>\n\t\t<field name=\"LATIN_EXTENDED_A_ID\"/>\n\t\t<field name=\"LATIN_EXTENDED_B\"/>\n\t\t<field name=\"LATIN_EXTENDED_B_ID\"/>\n\t\t<field name=\"LATIN_EXTENDED_C\"/>\n\t\t<field name=\"LATIN_EXTENDED_C_ID\"/>\n\t\t<field name=\"LATIN_EXTENDED_D\"/>\n\t\t<field name=\"LATIN_EXTENDED_D_ID\"/>\n\t\t<field name=\"LATIN_EXTENDED_E\"/>\n\t\t<field name=\"LATIN_EXTENDED_E_ID\"/>\n\t\t<field name=\"LEPCHA\"/>\n\t\t<field name=\"LEPCHA_ID\"/>\n\t\t<field name=\"LETTERLIKE_SYMBOLS\"/>\n\t\t<field name=\"LETTERLIKE_SYMBOLS_ID\"/>\n\t\t<field name=\"LIMBU\"/>\n\t\t<field name=\"LIMBU_ID\"/>\n\t\t<field name=\"LINEAR_A\"/>\n\t\t<field name=\"LINEAR_A_ID\"/>\n\t\t<field name=\"LINEAR_B_IDEOGRAMS\"/>\n\t\t<field name=\"LINEAR_B_IDEOGRAMS_ID\"/>\n\t\t<field name=\"LINEAR_B_SYLLABARY\"/>\n\t\t<field name=\"LINEAR_B_SYLLABARY_ID\"/>\n\t\t<field name=\"LISU\"/>\n\t\t<field name=\"LISU_ID\"/>\n\t\t<field name=\"LISU_SUPPLEMENT\" since=\"30\"/>\n\t\t<field name=\"LISU_SUPPLEMENT_ID\" since=\"30\"/>\n\t\t<field name=\"LOW_SURROGATES\"/>\n\t\t<field name=\"LOW_SURROGATES_ID\"/>\n\t\t<field name=\"LYCIAN\"/>\n\t\t<field name=\"LYCIAN_ID\"/>\n\t\t<field name=\"LYDIAN\"/>\n\t\t<field name=\"LYDIAN_ID\"/>\n\t\t<field name=\"MAHAJANI\"/>\n\t\t<field name=\"MAHAJANI_ID\"/>\n\t\t<field name=\"MAHJONG_TILES\"/>\n\t\t<field name=\"MAHJONG_TILES_ID\"/>\n\t\t<field name=\"MAKASAR\" since=\"29\"/>\n\t\t<field name=\"MAKASAR_ID\" since=\"29\"/>\n\t\t<field name=\"MALAYALAM\"/>\n\t\t<field name=\"MALAYALAM_ID\"/>\n\t\t<field name=\"MANDAIC\"/>\n\t\t<field name=\"MANDAIC_ID\"/>\n\t\t<field name=\"MANICHAEAN\"/>\n\t\t<field name=\"MANICHAEAN_ID\"/>\n\t\t<field name=\"MARCHEN\" since=\"26\"/>\n\t\t<field name=\"MARCHEN_ID\" since=\"26\"/>\n\t\t<field name=\"MASARAM_GONDI\" since=\"28\"/>\n\t\t<field name=\"MASARAM_GONDI_ID\" since=\"28\"/>\n\t\t<field name=\"MATHEMATICAL_ALPHANUMERIC_SYMBOLS\"/>\n\t\t<field name=\"MATHEMATICAL_ALPHANUMERIC_SYMBOLS_ID\"/>\n\t\t<field name=\"MATHEMATICAL_OPERATORS\"/>\n\t\t<field name=\"MATHEMATICAL_OPERATORS_ID\"/>\n\t\t<field name=\"MAYAN_NUMERALS\" since=\"29\"/>\n\t\t<field name=\"MAYAN_NUMERALS_ID\" since=\"29\"/>\n\t\t<field name=\"MEDEFAIDRIN\" since=\"29\"/>\n\t\t<field name=\"MEDEFAIDRIN_ID\" since=\"29\"/>\n\t\t<field name=\"MEETEI_MAYEK\"/>\n\t\t<field name=\"MEETEI_MAYEK_EXTENSIONS\"/>\n\t\t<field name=\"MEETEI_MAYEK_EXTENSIONS_ID\"/>\n\t\t<field name=\"MEETEI_MAYEK_ID\"/>\n\t\t<field name=\"MENDE_KIKAKUI\"/>\n\t\t<field name=\"MENDE_KIKAKUI_ID\"/>\n\t\t<field name=\"MEROITIC_CURSIVE\"/>\n\t\t<field name=\"MEROITIC_CURSIVE_ID\"/>\n\t\t<field name=\"MEROITIC_HIEROGLYPHS\"/>\n\t\t<field name=\"MEROITIC_HIEROGLYPHS_ID\"/>\n\t\t<field name=\"MIAO\"/>\n\t\t<field name=\"MIAO_ID\"/>\n\t\t<field name=\"MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A\"/>\n\t\t<field name=\"MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A_ID\"/>\n\t\t<field name=\"MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B\"/>\n\t\t<field name=\"MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B_ID\"/>\n\t\t<field name=\"MISCELLANEOUS_SYMBOLS\"/>\n\t\t<field name=\"MISCELLANEOUS_SYMBOLS_AND_ARROWS\"/>\n\t\t<field name=\"MISCELLANEOUS_SYMBOLS_AND_ARROWS_ID\"/>\n\t\t<field name=\"MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS\"/>\n\t\t<field name=\"MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS_ID\"/>\n\t\t<field name=\"MISCELLANEOUS_SYMBOLS_ID\"/>\n\t\t<field name=\"MISCELLANEOUS_TECHNICAL\"/>\n\t\t<field name=\"MISCELLANEOUS_TECHNICAL_ID\"/>\n\t\t<field name=\"MODI\"/>\n\t\t<field name=\"MODIFIER_TONE_LETTERS\"/>\n\t\t<field name=\"MODIFIER_TONE_LETTERS_ID\"/>\n\t\t<field name=\"MODI_ID\"/>\n\t\t<field name=\"MONGOLIAN\"/>\n\t\t<field name=\"MONGOLIAN_ID\"/>\n\t\t<field name=\"MONGOLIAN_SUPPLEMENT\" since=\"26\"/>\n\t\t<field name=\"MONGOLIAN_SUPPLEMENT_ID\" since=\"26\"/>\n\t\t<field name=\"MRO\"/>\n\t\t<field name=\"MRO_ID\"/>\n\t\t<field name=\"MULTANI\"/>\n\t\t<field name=\"MULTANI_ID\"/>\n\t\t<field name=\"MUSICAL_SYMBOLS\"/>\n\t\t<field name=\"MUSICAL_SYMBOLS_ID\"/>\n\t\t<field name=\"MYANMAR\"/>\n\t\t<field name=\"MYANMAR_EXTENDED_A\"/>\n\t\t<field name=\"MYANMAR_EXTENDED_A_ID\"/>\n\t\t<field name=\"MYANMAR_EXTENDED_B\"/>\n\t\t<field name=\"MYANMAR_EXTENDED_B_ID\"/>\n\t\t<field name=\"MYANMAR_ID\"/>\n\t\t<field name=\"NABATAEAN\"/>\n\t\t<field name=\"NABATAEAN_ID\"/>\n\t\t<field name=\"NANDINAGARI\" since=\"30\"/>\n\t\t<field name=\"NANDINAGARI_ID\" since=\"30\"/>\n\t\t<field name=\"NEWA\" since=\"26\"/>\n\t\t<field name=\"NEWA_ID\" since=\"26\"/>\n\t\t<field name=\"NEW_TAI_LUE\"/>\n\t\t<field name=\"NEW_TAI_LUE_ID\"/>\n\t\t<field name=\"NKO\"/>\n\t\t<field name=\"NKO_ID\"/>\n\t\t<field name=\"NO_BLOCK\"/>\n\t\t<field name=\"NUMBER_FORMS\"/>\n\t\t<field name=\"NUMBER_FORMS_ID\"/>\n\t\t<field name=\"NUSHU\" since=\"28\"/>\n\t\t<field name=\"NUSHU_ID\" since=\"28\"/>\n\t\t<field name=\"NYIAKENG_PUACHUE_HMONG\" since=\"30\"/>\n\t\t<field name=\"NYIAKENG_PUACHUE_HMONG_ID\" since=\"30\"/>\n\t\t<field name=\"OGHAM\"/>\n\t\t<field name=\"OGHAM_ID\"/>\n\t\t<field name=\"OLD_HUNGARIAN\"/>\n\t\t<field name=\"OLD_HUNGARIAN_ID\"/>\n\t\t<field name=\"OLD_ITALIC\"/>\n\t\t<field name=\"OLD_ITALIC_ID\"/>\n\t\t<field name=\"OLD_NORTH_ARABIAN\"/>\n\t\t<field name=\"OLD_NORTH_ARABIAN_ID\"/>\n\t\t<field name=\"OLD_PERMIC\"/>\n\t\t<field name=\"OLD_PERMIC_ID\"/>\n\t\t<field name=\"OLD_PERSIAN\"/>\n\t\t<field name=\"OLD_PERSIAN_ID\"/>\n\t\t<field name=\"OLD_SOGDIAN\" since=\"29\"/>\n\t\t<field name=\"OLD_SOGDIAN_ID\" since=\"29\"/>\n\t\t<field name=\"OLD_SOUTH_ARABIAN\"/>\n\t\t<field name=\"OLD_SOUTH_ARABIAN_ID\"/>\n\t\t<field name=\"OLD_TURKIC\"/>\n\t\t<field name=\"OLD_TURKIC_ID\"/>\n\t\t<field name=\"OL_CHIKI\"/>\n\t\t<field name=\"OL_CHIKI_ID\"/>\n\t\t<field name=\"OPTICAL_CHARACTER_RECOGNITION\"/>\n\t\t<field name=\"OPTICAL_CHARACTER_RECOGNITION_ID\"/>\n\t\t<field name=\"ORIYA\"/>\n\t\t<field name=\"ORIYA_ID\"/>\n\t\t<field name=\"ORNAMENTAL_DINGBATS\"/>\n\t\t<field name=\"ORNAMENTAL_DINGBATS_ID\"/>\n\t\t<field name=\"OSAGE\" since=\"26\"/>\n\t\t<field name=\"OSAGE_ID\" since=\"26\"/>\n\t\t<field name=\"OSMANYA\"/>\n\t\t<field name=\"OSMANYA_ID\"/>\n\t\t<field name=\"OTTOMAN_SIYAQ_NUMBERS\" since=\"30\"/>\n\t\t<field name=\"OTTOMAN_SIYAQ_NUMBERS_ID\" since=\"30\"/>\n\t\t<field name=\"PAHAWH_HMONG\"/>\n\t\t<field name=\"PAHAWH_HMONG_ID\"/>\n\t\t<field name=\"PALMYRENE\"/>\n\t\t<field name=\"PALMYRENE_ID\"/>\n\t\t<field name=\"PAU_CIN_HAU\"/>\n\t\t<field name=\"PAU_CIN_HAU_ID\"/>\n\t\t<field name=\"PHAGS_PA\"/>\n\t\t<field name=\"PHAGS_PA_ID\"/>\n\t\t<field name=\"PHAISTOS_DISC\"/>\n\t\t<field name=\"PHAISTOS_DISC_ID\"/>\n\t\t<field name=\"PHOENICIAN\"/>\n\t\t<field name=\"PHOENICIAN_ID\"/>\n\t\t<field name=\"PHONETIC_EXTENSIONS\"/>\n\t\t<field name=\"PHONETIC_EXTENSIONS_ID\"/>\n\t\t<field name=\"PHONETIC_EXTENSIONS_SUPPLEMENT\"/>\n\t\t<field name=\"PHONETIC_EXTENSIONS_SUPPLEMENT_ID\"/>\n\t\t<field name=\"PLAYING_CARDS\"/>\n\t\t<field name=\"PLAYING_CARDS_ID\"/>\n\t\t<field name=\"PRIVATE_USE\"/>\n\t\t<field name=\"PRIVATE_USE_AREA\"/>\n\t\t<field name=\"PRIVATE_USE_AREA_ID\"/>\n\t\t<field name=\"PRIVATE_USE_ID\"/>\n\t\t<field name=\"PSALTER_PAHLAVI\"/>\n\t\t<field name=\"PSALTER_PAHLAVI_ID\"/>\n\t\t<field name=\"REJANG\"/>\n\t\t<field name=\"REJANG_ID\"/>\n\t\t<field name=\"RUMI_NUMERAL_SYMBOLS\"/>\n\t\t<field name=\"RUMI_NUMERAL_SYMBOLS_ID\"/>\n\t\t<field name=\"RUNIC\"/>\n\t\t<field name=\"RUNIC_ID\"/>\n\t\t<field name=\"SAMARITAN\"/>\n\t\t<field name=\"SAMARITAN_ID\"/>\n\t\t<field name=\"SAURASHTRA\"/>\n\t\t<field name=\"SAURASHTRA_ID\"/>\n\t\t<field name=\"SHARADA\"/>\n\t\t<field name=\"SHARADA_ID\"/>\n\t\t<field name=\"SHAVIAN\"/>\n\t\t<field name=\"SHAVIAN_ID\"/>\n\t\t<field name=\"SHORTHAND_FORMAT_CONTROLS\"/>\n\t\t<field name=\"SHORTHAND_FORMAT_CONTROLS_ID\"/>\n\t\t<field name=\"SIDDHAM\"/>\n\t\t<field name=\"SIDDHAM_ID\"/>\n\t\t<field name=\"SINHALA\"/>\n\t\t<field name=\"SINHALA_ARCHAIC_NUMBERS\"/>\n\t\t<field name=\"SINHALA_ARCHAIC_NUMBERS_ID\"/>\n\t\t<field name=\"SINHALA_ID\"/>\n\t\t<field name=\"SMALL_FORM_VARIANTS\"/>\n\t\t<field name=\"SMALL_FORM_VARIANTS_ID\"/>\n\t\t<field name=\"SMALL_KANA_EXTENSION\" since=\"30\"/>\n\t\t<field name=\"SMALL_KANA_EXTENSION_ID\" since=\"30\"/>\n\t\t<field name=\"SOGDIAN\" since=\"29\"/>\n\t\t<field name=\"SOGDIAN_ID\" since=\"29\"/>\n\t\t<field name=\"SORA_SOMPENG\"/>\n\t\t<field name=\"SORA_SOMPENG_ID\"/>\n\t\t<field name=\"SOYOMBO\" since=\"28\"/>\n\t\t<field name=\"SOYOMBO_ID\" since=\"28\"/>\n\t\t<field name=\"SPACING_MODIFIER_LETTERS\"/>\n\t\t<field name=\"SPACING_MODIFIER_LETTERS_ID\"/>\n\t\t<field name=\"SPECIALS\"/>\n\t\t<field name=\"SPECIALS_ID\"/>\n\t\t<field name=\"SUNDANESE\"/>\n\t\t<field name=\"SUNDANESE_ID\"/>\n\t\t<field name=\"SUNDANESE_SUPPLEMENT\"/>\n\t\t<field name=\"SUNDANESE_SUPPLEMENT_ID\"/>\n\t\t<field name=\"SUPERSCRIPTS_AND_SUBSCRIPTS\"/>\n\t\t<field name=\"SUPERSCRIPTS_AND_SUBSCRIPTS_ID\"/>\n\t\t<field name=\"SUPPLEMENTAL_ARROWS_A\"/>\n\t\t<field name=\"SUPPLEMENTAL_ARROWS_A_ID\"/>\n\t\t<field name=\"SUPPLEMENTAL_ARROWS_B\"/>\n\t\t<field name=\"SUPPLEMENTAL_ARROWS_B_ID\"/>\n\t\t<field name=\"SUPPLEMENTAL_ARROWS_C\"/>\n\t\t<field name=\"SUPPLEMENTAL_ARROWS_C_ID\"/>\n\t\t<field name=\"SUPPLEMENTAL_MATHEMATICAL_OPERATORS\"/>\n\t\t<field name=\"SUPPLEMENTAL_MATHEMATICAL_OPERATORS_ID\"/>\n\t\t<field name=\"SUPPLEMENTAL_PUNCTUATION\"/>\n\t\t<field name=\"SUPPLEMENTAL_PUNCTUATION_ID\"/>\n\t\t<field name=\"SUPPLEMENTAL_SYMBOLS_AND_PICTOGRAPHS\"/>\n\t\t<field name=\"SUPPLEMENTAL_SYMBOLS_AND_PICTOGRAPHS_ID\"/>\n\t\t<field name=\"SUPPLEMENTARY_PRIVATE_USE_AREA_A\"/>\n\t\t<field name=\"SUPPLEMENTARY_PRIVATE_USE_AREA_A_ID\"/>\n\t\t<field name=\"SUPPLEMENTARY_PRIVATE_USE_AREA_B\"/>\n\t\t<field name=\"SUPPLEMENTARY_PRIVATE_USE_AREA_B_ID\"/>\n\t\t<field name=\"SUTTON_SIGNWRITING\"/>\n\t\t<field name=\"SUTTON_SIGNWRITING_ID\"/>\n\t\t<field name=\"SYLOTI_NAGRI\"/>\n\t\t<field name=\"SYLOTI_NAGRI_ID\"/>\n\t\t<field name=\"SYMBOLS_AND_PICTOGRAPHS_EXTENDED_A\" since=\"30\"/>\n\t\t<field name=\"SYMBOLS_AND_PICTOGRAPHS_EXTENDED_A_ID\" since=\"30\"/>\n\t\t<field name=\"SYMBOLS_FOR_LEGACY_COMPUTING\" since=\"30\"/>\n\t\t<field name=\"SYMBOLS_FOR_LEGACY_COMPUTING_ID\" since=\"30\"/>\n\t\t<field name=\"SYRIAC\"/>\n\t\t<field name=\"SYRIAC_ID\"/>\n\t\t<field name=\"SYRIAC_SUPPLEMENT\" since=\"28\"/>\n\t\t<field name=\"SYRIAC_SUPPLEMENT_ID\" since=\"28\"/>\n\t\t<field name=\"TAGALOG\"/>\n\t\t<field name=\"TAGALOG_ID\"/>\n\t\t<field name=\"TAGBANWA\"/>\n\t\t<field name=\"TAGBANWA_ID\"/>\n\t\t<field name=\"TAGS\"/>\n\t\t<field name=\"TAGS_ID\"/>\n\t\t<field name=\"TAI_LE\"/>\n\t\t<field name=\"TAI_LE_ID\"/>\n\t\t<field name=\"TAI_THAM\"/>\n\t\t<field name=\"TAI_THAM_ID\"/>\n\t\t<field name=\"TAI_VIET\"/>\n\t\t<field name=\"TAI_VIET_ID\"/>\n\t\t<field name=\"TAI_XUAN_JING_SYMBOLS\"/>\n\t\t<field name=\"TAI_XUAN_JING_SYMBOLS_ID\"/>\n\t\t<field name=\"TAKRI\"/>\n\t\t<field name=\"TAKRI_ID\"/>\n\t\t<field name=\"TAMIL\"/>\n\t\t<field name=\"TAMIL_ID\"/>\n\t\t<field name=\"TAMIL_SUPPLEMENT\" since=\"30\"/>\n\t\t<field name=\"TAMIL_SUPPLEMENT_ID\" since=\"30\"/>\n\t\t<field name=\"TANGUT\" since=\"26\"/>\n\t\t<field name=\"TANGUT_COMPONENTS\" since=\"26\"/>\n\t\t<field name=\"TANGUT_COMPONENTS_ID\" since=\"26\"/>\n\t\t<field name=\"TANGUT_ID\" since=\"26\"/>\n\t\t<field name=\"TANGUT_SUPPLEMENT\" since=\"30\"/>\n\t\t<field name=\"TANGUT_SUPPLEMENT_ID\" since=\"30\"/>\n\t\t<field name=\"TELUGU\"/>\n\t\t<field name=\"TELUGU_ID\"/>\n\t\t<field name=\"THAANA\"/>\n\t\t<field name=\"THAANA_ID\"/>\n\t\t<field name=\"THAI\"/>\n\t\t<field name=\"THAI_ID\"/>\n\t\t<field name=\"TIBETAN\"/>\n\t\t<field name=\"TIBETAN_ID\"/>\n\t\t<field name=\"TIFINAGH\"/>\n\t\t<field name=\"TIFINAGH_ID\"/>\n\t\t<field name=\"TIRHUTA\"/>\n\t\t<field name=\"TIRHUTA_ID\"/>\n\t\t<field name=\"TRANSPORT_AND_MAP_SYMBOLS\"/>\n\t\t<field name=\"TRANSPORT_AND_MAP_SYMBOLS_ID\"/>\n\t\t<field name=\"UGARITIC\"/>\n\t\t<field name=\"UGARITIC_ID\"/>\n\t\t<field name=\"UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS\"/>\n\t\t<field name=\"UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED\"/>\n\t\t<field name=\"UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED_ID\"/>\n\t\t<field name=\"UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_ID\"/>\n\t\t<field name=\"VAI\"/>\n\t\t<field name=\"VAI_ID\"/>\n\t\t<field name=\"VARIATION_SELECTORS\"/>\n\t\t<field name=\"VARIATION_SELECTORS_ID\"/>\n\t\t<field name=\"VARIATION_SELECTORS_SUPPLEMENT\"/>\n\t\t<field name=\"VARIATION_SELECTORS_SUPPLEMENT_ID\"/>\n\t\t<field name=\"VEDIC_EXTENSIONS\"/>\n\t\t<field name=\"VEDIC_EXTENSIONS_ID\"/>\n\t\t<field name=\"VERTICAL_FORMS\"/>\n\t\t<field name=\"VERTICAL_FORMS_ID\"/>\n\t\t<field name=\"WANCHO\" since=\"30\"/>\n\t\t<field name=\"WANCHO_ID\" since=\"30\"/>\n\t\t<field name=\"WARANG_CITI\"/>\n\t\t<field name=\"WARANG_CITI_ID\"/>\n\t\t<field name=\"YEZIDI\" since=\"30\"/>\n\t\t<field name=\"YEZIDI_ID\" since=\"30\"/>\n\t\t<field name=\"YIJING_HEXAGRAM_SYMBOLS\"/>\n\t\t<field name=\"YIJING_HEXAGRAM_SYMBOLS_ID\"/>\n\t\t<field name=\"YI_RADICALS\"/>\n\t\t<field name=\"YI_RADICALS_ID\"/>\n\t\t<field name=\"YI_SYLLABLES\"/>\n\t\t<field name=\"YI_SYLLABLES_ID\"/>\n\t\t<field name=\"ZANABAZAR_SQUARE\" since=\"28\"/>\n\t\t<field name=\"ZANABAZAR_SQUARE_ID\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UCharacter$VerticalOrientation\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ROTATED\"/>\n\t\t<field name=\"TRANSFORMED_ROTATED\"/>\n\t\t<field name=\"TRANSFORMED_UPRIGHT\"/>\n\t\t<field name=\"UPRIGHT\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UCharacter$WordBreak\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ALETTER\"/>\n\t\t<field name=\"CR\"/>\n\t\t<field name=\"DOUBLE_QUOTE\"/>\n\t\t<field name=\"EXTEND\"/>\n\t\t<field name=\"EXTENDNUMLET\"/>\n\t\t<field name=\"E_BASE\" since=\"26\"/>\n\t\t<field name=\"E_BASE_GAZ\" since=\"26\"/>\n\t\t<field name=\"E_MODIFIER\" since=\"26\"/>\n\t\t<field name=\"FORMAT\"/>\n\t\t<field name=\"GLUE_AFTER_ZWJ\" since=\"26\"/>\n\t\t<field name=\"HEBREW_LETTER\"/>\n\t\t<field name=\"KATAKANA\"/>\n\t\t<field name=\"LF\"/>\n\t\t<field name=\"MIDLETTER\"/>\n\t\t<field name=\"MIDNUM\"/>\n\t\t<field name=\"MIDNUMLET\"/>\n\t\t<field name=\"NEWLINE\"/>\n\t\t<field name=\"NUMERIC\"/>\n\t\t<field name=\"OTHER\"/>\n\t\t<field name=\"REGIONAL_INDICATOR\"/>\n\t\t<field name=\"SINGLE_QUOTE\"/>\n\t\t<field name=\"WSEGSPACE\" since=\"29\"/>\n\t\t<field name=\"ZWJ\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UCharacterCategory\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/icu/lang/UCharacterEnums$ECharacterCategory\"/>\n\t\t<method name=\"toString(I)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UCharacterDirection\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/icu/lang/UCharacterEnums$ECharacterDirection\"/>\n\t\t<method name=\"toString(I)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UCharacterEnums\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UCharacterEnums$ECharacterCategory\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"COMBINING_SPACING_MARK\"/>\n\t\t<field name=\"CONNECTOR_PUNCTUATION\"/>\n\t\t<field name=\"CONTROL\"/>\n\t\t<field name=\"CURRENCY_SYMBOL\"/>\n\t\t<field name=\"DASH_PUNCTUATION\"/>\n\t\t<field name=\"DECIMAL_DIGIT_NUMBER\"/>\n\t\t<field name=\"ENCLOSING_MARK\"/>\n\t\t<field name=\"END_PUNCTUATION\"/>\n\t\t<field name=\"FINAL_PUNCTUATION\"/>\n\t\t<field name=\"FINAL_QUOTE_PUNCTUATION\"/>\n\t\t<field name=\"FORMAT\"/>\n\t\t<field name=\"GENERAL_OTHER_TYPES\"/>\n\t\t<field name=\"INITIAL_PUNCTUATION\"/>\n\t\t<field name=\"INITIAL_QUOTE_PUNCTUATION\"/>\n\t\t<field name=\"LETTER_NUMBER\"/>\n\t\t<field name=\"LINE_SEPARATOR\"/>\n\t\t<field name=\"LOWERCASE_LETTER\"/>\n\t\t<field name=\"MATH_SYMBOL\"/>\n\t\t<field name=\"MODIFIER_LETTER\"/>\n\t\t<field name=\"MODIFIER_SYMBOL\"/>\n\t\t<field name=\"NON_SPACING_MARK\"/>\n\t\t<field name=\"OTHER_LETTER\"/>\n\t\t<field name=\"OTHER_NUMBER\"/>\n\t\t<field name=\"OTHER_PUNCTUATION\"/>\n\t\t<field name=\"OTHER_SYMBOL\"/>\n\t\t<field name=\"PARAGRAPH_SEPARATOR\"/>\n\t\t<field name=\"PRIVATE_USE\"/>\n\t\t<field name=\"SPACE_SEPARATOR\"/>\n\t\t<field name=\"START_PUNCTUATION\"/>\n\t\t<field name=\"SURROGATE\"/>\n\t\t<field name=\"TITLECASE_LETTER\"/>\n\t\t<field name=\"UNASSIGNED\"/>\n\t\t<field name=\"UPPERCASE_LETTER\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UCharacterEnums$ECharacterDirection\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ARABIC_NUMBER\"/>\n\t\t<field name=\"BLOCK_SEPARATOR\"/>\n\t\t<field name=\"BOUNDARY_NEUTRAL\"/>\n\t\t<field name=\"COMMON_NUMBER_SEPARATOR\"/>\n\t\t<field name=\"DIRECTIONALITY_ARABIC_NUMBER\"/>\n\t\t<field name=\"DIRECTIONALITY_BOUNDARY_NEUTRAL\"/>\n\t\t<field name=\"DIRECTIONALITY_COMMON_NUMBER_SEPARATOR\"/>\n\t\t<field name=\"DIRECTIONALITY_EUROPEAN_NUMBER\"/>\n\t\t<field name=\"DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR\"/>\n\t\t<field name=\"DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR\"/>\n\t\t<field name=\"DIRECTIONALITY_LEFT_TO_RIGHT\"/>\n\t\t<field name=\"DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING\"/>\n\t\t<field name=\"DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE\"/>\n\t\t<field name=\"DIRECTIONALITY_NONSPACING_MARK\"/>\n\t\t<field name=\"DIRECTIONALITY_OTHER_NEUTRALS\"/>\n\t\t<field name=\"DIRECTIONALITY_PARAGRAPH_SEPARATOR\"/>\n\t\t<field name=\"DIRECTIONALITY_POP_DIRECTIONAL_FORMAT\"/>\n\t\t<field name=\"DIRECTIONALITY_RIGHT_TO_LEFT\"/>\n\t\t<field name=\"DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC\"/>\n\t\t<field name=\"DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING\"/>\n\t\t<field name=\"DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE\"/>\n\t\t<field name=\"DIRECTIONALITY_SEGMENT_SEPARATOR\"/>\n\t\t<field name=\"DIRECTIONALITY_UNDEFINED\"/>\n\t\t<field name=\"DIRECTIONALITY_WHITESPACE\"/>\n\t\t<field name=\"DIR_NON_SPACING_MARK\"/>\n\t\t<field name=\"EUROPEAN_NUMBER\"/>\n\t\t<field name=\"EUROPEAN_NUMBER_SEPARATOR\"/>\n\t\t<field name=\"EUROPEAN_NUMBER_TERMINATOR\"/>\n\t\t<field name=\"FIRST_STRONG_ISOLATE\"/>\n\t\t<field name=\"LEFT_TO_RIGHT\"/>\n\t\t<field name=\"LEFT_TO_RIGHT_EMBEDDING\"/>\n\t\t<field name=\"LEFT_TO_RIGHT_ISOLATE\"/>\n\t\t<field name=\"LEFT_TO_RIGHT_OVERRIDE\"/>\n\t\t<field name=\"OTHER_NEUTRAL\"/>\n\t\t<field name=\"POP_DIRECTIONAL_FORMAT\"/>\n\t\t<field name=\"POP_DIRECTIONAL_ISOLATE\"/>\n\t\t<field name=\"RIGHT_TO_LEFT\"/>\n\t\t<field name=\"RIGHT_TO_LEFT_ARABIC\"/>\n\t\t<field name=\"RIGHT_TO_LEFT_EMBEDDING\"/>\n\t\t<field name=\"RIGHT_TO_LEFT_ISOLATE\"/>\n\t\t<field name=\"RIGHT_TO_LEFT_OVERRIDE\"/>\n\t\t<field name=\"SEGMENT_SEPARATOR\"/>\n\t\t<field name=\"WHITE_SPACE_NEUTRAL\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UProperty\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"AGE\"/>\n\t\t<field name=\"ALPHABETIC\"/>\n\t\t<field name=\"ASCII_HEX_DIGIT\"/>\n\t\t<field name=\"BIDI_CLASS\"/>\n\t\t<field name=\"BIDI_CONTROL\"/>\n\t\t<field name=\"BIDI_MIRRORED\"/>\n\t\t<field name=\"BIDI_MIRRORING_GLYPH\"/>\n\t\t<field name=\"BIDI_PAIRED_BRACKET\"/>\n\t\t<field name=\"BIDI_PAIRED_BRACKET_TYPE\"/>\n\t\t<field name=\"BINARY_START\"/>\n\t\t<field name=\"BLOCK\"/>\n\t\t<field name=\"CANONICAL_COMBINING_CLASS\"/>\n\t\t<field name=\"CASED\"/>\n\t\t<field name=\"CASE_FOLDING\"/>\n\t\t<field name=\"CASE_IGNORABLE\"/>\n\t\t<field name=\"CASE_SENSITIVE\"/>\n\t\t<field name=\"CHANGES_WHEN_CASEFOLDED\"/>\n\t\t<field name=\"CHANGES_WHEN_CASEMAPPED\"/>\n\t\t<field name=\"CHANGES_WHEN_LOWERCASED\"/>\n\t\t<field name=\"CHANGES_WHEN_NFKC_CASEFOLDED\"/>\n\t\t<field name=\"CHANGES_WHEN_TITLECASED\"/>\n\t\t<field name=\"CHANGES_WHEN_UPPERCASED\"/>\n\t\t<field name=\"DASH\"/>\n\t\t<field name=\"DECOMPOSITION_TYPE\"/>\n\t\t<field name=\"DEFAULT_IGNORABLE_CODE_POINT\"/>\n\t\t<field name=\"DEPRECATED\"/>\n\t\t<field name=\"DIACRITIC\"/>\n\t\t<field name=\"DOUBLE_START\"/>\n\t\t<field name=\"EAST_ASIAN_WIDTH\"/>\n\t\t<field name=\"EMOJI\" since=\"28\"/>\n\t\t<field name=\"EMOJI_COMPONENT\" since=\"28\"/>\n\t\t<field name=\"EMOJI_MODIFIER\" since=\"28\"/>\n\t\t<field name=\"EMOJI_MODIFIER_BASE\" since=\"28\"/>\n\t\t<field name=\"EMOJI_PRESENTATION\" since=\"28\"/>\n\t\t<field name=\"EXTENDED_PICTOGRAPHIC\" since=\"29\"/>\n\t\t<field name=\"EXTENDER\"/>\n\t\t<field name=\"FULL_COMPOSITION_EXCLUSION\"/>\n\t\t<field name=\"GENERAL_CATEGORY\"/>\n\t\t<field name=\"GENERAL_CATEGORY_MASK\"/>\n\t\t<field name=\"GRAPHEME_BASE\"/>\n\t\t<field name=\"GRAPHEME_CLUSTER_BREAK\"/>\n\t\t<field name=\"GRAPHEME_EXTEND\"/>\n\t\t<field name=\"GRAPHEME_LINK\"/>\n\t\t<field name=\"HANGUL_SYLLABLE_TYPE\"/>\n\t\t<field name=\"HEX_DIGIT\"/>\n\t\t<field name=\"HYPHEN\"/>\n\t\t<field name=\"IDEOGRAPHIC\"/>\n\t\t<field name=\"IDS_BINARY_OPERATOR\"/>\n\t\t<field name=\"IDS_TRINARY_OPERATOR\"/>\n\t\t<field name=\"ID_CONTINUE\"/>\n\t\t<field name=\"ID_START\"/>\n\t\t<field name=\"INDIC_POSITIONAL_CATEGORY\" since=\"29\"/>\n\t\t<field name=\"INDIC_SYLLABIC_CATEGORY\" since=\"29\"/>\n\t\t<field name=\"INT_START\"/>\n\t\t<field name=\"JOINING_GROUP\"/>\n\t\t<field name=\"JOINING_TYPE\"/>\n\t\t<field name=\"JOIN_CONTROL\"/>\n\t\t<field name=\"LEAD_CANONICAL_COMBINING_CLASS\"/>\n\t\t<field name=\"LINE_BREAK\"/>\n\t\t<field name=\"LOGICAL_ORDER_EXCEPTION\"/>\n\t\t<field name=\"LOWERCASE\"/>\n\t\t<field name=\"LOWERCASE_MAPPING\"/>\n\t\t<field name=\"MASK_START\"/>\n\t\t<field name=\"MATH\"/>\n\t\t<field name=\"NAME\"/>\n\t\t<field name=\"NFC_INERT\"/>\n\t\t<field name=\"NFC_QUICK_CHECK\"/>\n\t\t<field name=\"NFD_INERT\"/>\n\t\t<field name=\"NFD_QUICK_CHECK\"/>\n\t\t<field name=\"NFKC_INERT\"/>\n\t\t<field name=\"NFKC_QUICK_CHECK\"/>\n\t\t<field name=\"NFKD_INERT\"/>\n\t\t<field name=\"NFKD_QUICK_CHECK\"/>\n\t\t<field name=\"NONCHARACTER_CODE_POINT\"/>\n\t\t<field name=\"NUMERIC_TYPE\"/>\n\t\t<field name=\"NUMERIC_VALUE\"/>\n\t\t<field name=\"OTHER_PROPERTY_START\"/>\n\t\t<field name=\"PATTERN_SYNTAX\"/>\n\t\t<field name=\"PATTERN_WHITE_SPACE\"/>\n\t\t<field name=\"POSIX_ALNUM\"/>\n\t\t<field name=\"POSIX_BLANK\"/>\n\t\t<field name=\"POSIX_GRAPH\"/>\n\t\t<field name=\"POSIX_PRINT\"/>\n\t\t<field name=\"POSIX_XDIGIT\"/>\n\t\t<field name=\"PREPENDED_CONCATENATION_MARK\" since=\"28\"/>\n\t\t<field name=\"QUOTATION_MARK\"/>\n\t\t<field name=\"RADICAL\"/>\n\t\t<field name=\"REGIONAL_INDICATOR\" since=\"28\"/>\n\t\t<field name=\"SCRIPT\"/>\n\t\t<field name=\"SCRIPT_EXTENSIONS\"/>\n\t\t<field name=\"SEGMENT_STARTER\"/>\n\t\t<field name=\"SENTENCE_BREAK\"/>\n\t\t<field name=\"SIMPLE_CASE_FOLDING\"/>\n\t\t<field name=\"SIMPLE_LOWERCASE_MAPPING\"/>\n\t\t<field name=\"SIMPLE_TITLECASE_MAPPING\"/>\n\t\t<field name=\"SIMPLE_UPPERCASE_MAPPING\"/>\n\t\t<field name=\"SOFT_DOTTED\"/>\n\t\t<field name=\"STRING_START\"/>\n\t\t<field name=\"S_TERM\"/>\n\t\t<field name=\"TERMINAL_PUNCTUATION\"/>\n\t\t<field name=\"TITLECASE_MAPPING\"/>\n\t\t<field name=\"TRAIL_CANONICAL_COMBINING_CLASS\"/>\n\t\t<field name=\"UNIFIED_IDEOGRAPH\"/>\n\t\t<field name=\"UPPERCASE\"/>\n\t\t<field name=\"UPPERCASE_MAPPING\"/>\n\t\t<field name=\"VARIATION_SELECTOR\"/>\n\t\t<field name=\"VERTICAL_ORIENTATION\" since=\"29\"/>\n\t\t<field name=\"WHITE_SPACE\"/>\n\t\t<field name=\"WORD_BREAK\"/>\n\t\t<field name=\"XID_CONTINUE\"/>\n\t\t<field name=\"XID_START\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UProperty$NameChoice\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"LONG\"/>\n\t\t<field name=\"SHORT\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UScript\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"breaksBetweenLetters(I)Z\"/>\n\t\t<method name=\"getCode(Landroid/icu/util/ULocale;)[I\"/>\n\t\t<method name=\"getCode(Ljava/lang/String;)[I\"/>\n\t\t<method name=\"getCode(Ljava/util/Locale;)[I\"/>\n\t\t<method name=\"getCodeFromName(Ljava/lang/String;)I\"/>\n\t\t<method name=\"getName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getSampleString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getScript(I)I\"/>\n\t\t<method name=\"getScriptExtensions(ILjava/util/BitSet;)I\"/>\n\t\t<method name=\"getShortName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getUsage(I)Landroid/icu/lang/UScript$ScriptUsage;\"/>\n\t\t<method name=\"hasScript(II)Z\"/>\n\t\t<method name=\"isCased(I)Z\"/>\n\t\t<method name=\"isRightToLeft(I)Z\"/>\n\t\t<field name=\"ADLAM\" since=\"26\"/>\n\t\t<field name=\"AFAKA\"/>\n\t\t<field name=\"AHOM\"/>\n\t\t<field name=\"ANATOLIAN_HIEROGLYPHS\"/>\n\t\t<field name=\"ARABIC\"/>\n\t\t<field name=\"ARMENIAN\"/>\n\t\t<field name=\"AVESTAN\"/>\n\t\t<field name=\"BALINESE\"/>\n\t\t<field name=\"BAMUM\"/>\n\t\t<field name=\"BASSA_VAH\"/>\n\t\t<field name=\"BATAK\"/>\n\t\t<field name=\"BENGALI\"/>\n\t\t<field name=\"BHAIKSUKI\" since=\"26\"/>\n\t\t<field name=\"BLISSYMBOLS\"/>\n\t\t<field name=\"BOOK_PAHLAVI\"/>\n\t\t<field name=\"BOPOMOFO\"/>\n\t\t<field name=\"BRAHMI\"/>\n\t\t<field name=\"BRAILLE\"/>\n\t\t<field name=\"BUGINESE\"/>\n\t\t<field name=\"BUHID\"/>\n\t\t<field name=\"CANADIAN_ABORIGINAL\"/>\n\t\t<field name=\"CARIAN\"/>\n\t\t<field name=\"CAUCASIAN_ALBANIAN\"/>\n\t\t<field name=\"CHAKMA\"/>\n\t\t<field name=\"CHAM\"/>\n\t\t<field name=\"CHEROKEE\"/>\n\t\t<field name=\"CHORASMIAN\" since=\"30\"/>\n\t\t<field name=\"CIRTH\"/>\n\t\t<field name=\"COMMON\"/>\n\t\t<field name=\"COPTIC\"/>\n\t\t<field name=\"CUNEIFORM\"/>\n\t\t<field name=\"CYPRIOT\"/>\n\t\t<field name=\"CYRILLIC\"/>\n\t\t<field name=\"DEMOTIC_EGYPTIAN\"/>\n\t\t<field name=\"DESERET\"/>\n\t\t<field name=\"DEVANAGARI\"/>\n\t\t<field name=\"DIVES_AKURU\" since=\"30\"/>\n\t\t<field name=\"DOGRA\" since=\"29\"/>\n\t\t<field name=\"DUPLOYAN\"/>\n\t\t<field name=\"EASTERN_SYRIAC\"/>\n\t\t<field name=\"EGYPTIAN_HIEROGLYPHS\"/>\n\t\t<field name=\"ELBASAN\"/>\n\t\t<field name=\"ELYMAIC\" since=\"30\"/>\n\t\t<field name=\"ESTRANGELO_SYRIAC\"/>\n\t\t<field name=\"ETHIOPIC\"/>\n\t\t<field name=\"GEORGIAN\"/>\n\t\t<field name=\"GLAGOLITIC\"/>\n\t\t<field name=\"GOTHIC\"/>\n\t\t<field name=\"GRANTHA\"/>\n\t\t<field name=\"GREEK\"/>\n\t\t<field name=\"GUJARATI\"/>\n\t\t<field name=\"GUNJALA_GONDI\" since=\"29\"/>\n\t\t<field name=\"GURMUKHI\"/>\n\t\t<field name=\"HAN\"/>\n\t\t<field name=\"HANGUL\"/>\n\t\t<field name=\"HANIFI_ROHINGYA\" since=\"29\"/>\n\t\t<field name=\"HANUNOO\"/>\n\t\t<field name=\"HAN_WITH_BOPOMOFO\" since=\"26\"/>\n\t\t<field name=\"HARAPPAN_INDUS\"/>\n\t\t<field name=\"HATRAN\"/>\n\t\t<field name=\"HEBREW\"/>\n\t\t<field name=\"HIERATIC_EGYPTIAN\"/>\n\t\t<field name=\"HIRAGANA\"/>\n\t\t<field name=\"IMPERIAL_ARAMAIC\"/>\n\t\t<field name=\"INHERITED\"/>\n\t\t<field name=\"INSCRIPTIONAL_PAHLAVI\"/>\n\t\t<field name=\"INSCRIPTIONAL_PARTHIAN\"/>\n\t\t<field name=\"INVALID_CODE\"/>\n\t\t<field name=\"JAMO\" since=\"26\"/>\n\t\t<field name=\"JAPANESE\"/>\n\t\t<field name=\"JAVANESE\"/>\n\t\t<field name=\"JURCHEN\"/>\n\t\t<field name=\"KAITHI\"/>\n\t\t<field name=\"KANNADA\"/>\n\t\t<field name=\"KATAKANA\"/>\n\t\t<field name=\"KATAKANA_OR_HIRAGANA\"/>\n\t\t<field name=\"KAYAH_LI\"/>\n\t\t<field name=\"KHAROSHTHI\"/>\n\t\t<field name=\"KHITAN_SMALL_SCRIPT\" since=\"30\"/>\n\t\t<field name=\"KHMER\"/>\n\t\t<field name=\"KHOJKI\"/>\n\t\t<field name=\"KHUDAWADI\"/>\n\t\t<field name=\"KHUTSURI\"/>\n\t\t<field name=\"KOREAN\"/>\n\t\t<field name=\"KPELLE\"/>\n\t\t<field name=\"LANNA\"/>\n\t\t<field name=\"LAO\"/>\n\t\t<field name=\"LATIN\"/>\n\t\t<field name=\"LATIN_FRAKTUR\"/>\n\t\t<field name=\"LATIN_GAELIC\"/>\n\t\t<field name=\"LEPCHA\"/>\n\t\t<field name=\"LIMBU\"/>\n\t\t<field name=\"LINEAR_A\"/>\n\t\t<field name=\"LINEAR_B\"/>\n\t\t<field name=\"LISU\"/>\n\t\t<field name=\"LOMA\"/>\n\t\t<field name=\"LYCIAN\"/>\n\t\t<field name=\"LYDIAN\"/>\n\t\t<field name=\"MAHAJANI\"/>\n\t\t<field name=\"MAKASAR\" since=\"29\"/>\n\t\t<field name=\"MALAYALAM\"/>\n\t\t<field name=\"MANDAEAN\"/>\n\t\t<field name=\"MANDAIC\"/>\n\t\t<field name=\"MANICHAEAN\"/>\n\t\t<field name=\"MARCHEN\" since=\"26\"/>\n\t\t<field name=\"MASARAM_GONDI\" since=\"28\"/>\n\t\t<field name=\"MATHEMATICAL_NOTATION\"/>\n\t\t<field name=\"MAYAN_HIEROGLYPHS\"/>\n\t\t<field name=\"MEDEFAIDRIN\" since=\"29\"/>\n\t\t<field name=\"MEITEI_MAYEK\"/>\n\t\t<field name=\"MENDE\"/>\n\t\t<field name=\"MEROITIC\"/>\n\t\t<field name=\"MEROITIC_CURSIVE\"/>\n\t\t<field name=\"MEROITIC_HIEROGLYPHS\"/>\n\t\t<field name=\"MIAO\"/>\n\t\t<field name=\"MODI\"/>\n\t\t<field name=\"MONGOLIAN\"/>\n\t\t<field name=\"MOON\"/>\n\t\t<field name=\"MRO\"/>\n\t\t<field name=\"MULTANI\"/>\n\t\t<field name=\"MYANMAR\"/>\n\t\t<field name=\"NABATAEAN\"/>\n\t\t<field name=\"NAKHI_GEBA\"/>\n\t\t<field name=\"NANDINAGARI\" since=\"30\"/>\n\t\t<field name=\"NEWA\" since=\"26\"/>\n\t\t<field name=\"NEW_TAI_LUE\"/>\n\t\t<field name=\"NKO\"/>\n\t\t<field name=\"NUSHU\"/>\n\t\t<field name=\"NYIAKENG_PUACHUE_HMONG\" since=\"30\"/>\n\t\t<field name=\"OGHAM\"/>\n\t\t<field name=\"OLD_CHURCH_SLAVONIC_CYRILLIC\"/>\n\t\t<field name=\"OLD_HUNGARIAN\"/>\n\t\t<field name=\"OLD_ITALIC\"/>\n\t\t<field name=\"OLD_NORTH_ARABIAN\"/>\n\t\t<field name=\"OLD_PERMIC\"/>\n\t\t<field name=\"OLD_PERSIAN\"/>\n\t\t<field name=\"OLD_SOGDIAN\" since=\"29\"/>\n\t\t<field name=\"OLD_SOUTH_ARABIAN\"/>\n\t\t<field name=\"OL_CHIKI\"/>\n\t\t<field name=\"ORIYA\"/>\n\t\t<field name=\"ORKHON\"/>\n\t\t<field name=\"OSAGE\" since=\"26\"/>\n\t\t<field name=\"OSMANYA\"/>\n\t\t<field name=\"PAHAWH_HMONG\"/>\n\t\t<field name=\"PALMYRENE\"/>\n\t\t<field name=\"PAU_CIN_HAU\"/>\n\t\t<field name=\"PHAGS_PA\"/>\n\t\t<field name=\"PHOENICIAN\"/>\n\t\t<field name=\"PHONETIC_POLLARD\"/>\n\t\t<field name=\"PSALTER_PAHLAVI\"/>\n\t\t<field name=\"REJANG\"/>\n\t\t<field name=\"RONGORONGO\"/>\n\t\t<field name=\"RUNIC\"/>\n\t\t<field name=\"SAMARITAN\"/>\n\t\t<field name=\"SARATI\"/>\n\t\t<field name=\"SAURASHTRA\"/>\n\t\t<field name=\"SHARADA\"/>\n\t\t<field name=\"SHAVIAN\"/>\n\t\t<field name=\"SIDDHAM\"/>\n\t\t<field name=\"SIGN_WRITING\"/>\n\t\t<field name=\"SIMPLIFIED_HAN\"/>\n\t\t<field name=\"SINDHI\"/>\n\t\t<field name=\"SINHALA\"/>\n\t\t<field name=\"SOGDIAN\" since=\"29\"/>\n\t\t<field name=\"SORA_SOMPENG\"/>\n\t\t<field name=\"SOYOMBO\" since=\"28\"/>\n\t\t<field name=\"SUNDANESE\"/>\n\t\t<field name=\"SYLOTI_NAGRI\"/>\n\t\t<field name=\"SYMBOLS\"/>\n\t\t<field name=\"SYMBOLS_EMOJI\" since=\"26\"/>\n\t\t<field name=\"SYRIAC\"/>\n\t\t<field name=\"TAGALOG\"/>\n\t\t<field name=\"TAGBANWA\"/>\n\t\t<field name=\"TAI_LE\"/>\n\t\t<field name=\"TAI_VIET\"/>\n\t\t<field name=\"TAKRI\"/>\n\t\t<field name=\"TAMIL\"/>\n\t\t<field name=\"TANGUT\"/>\n\t\t<field name=\"TELUGU\"/>\n\t\t<field name=\"TENGWAR\"/>\n\t\t<field name=\"THAANA\"/>\n\t\t<field name=\"THAI\"/>\n\t\t<field name=\"TIBETAN\"/>\n\t\t<field name=\"TIFINAGH\"/>\n\t\t<field name=\"TIRHUTA\"/>\n\t\t<field name=\"TRADITIONAL_HAN\"/>\n\t\t<field name=\"UCAS\"/>\n\t\t<field name=\"UGARITIC\"/>\n\t\t<field name=\"UNKNOWN\"/>\n\t\t<field name=\"UNWRITTEN_LANGUAGES\"/>\n\t\t<field name=\"VAI\"/>\n\t\t<field name=\"VISIBLE_SPEECH\"/>\n\t\t<field name=\"WANCHO\" since=\"30\"/>\n\t\t<field name=\"WARANG_CITI\"/>\n\t\t<field name=\"WESTERN_SYRIAC\"/>\n\t\t<field name=\"WOLEAI\"/>\n\t\t<field name=\"YEZIDI\" since=\"30\"/>\n\t\t<field name=\"YI\"/>\n\t\t<field name=\"ZANABAZAR_SQUARE\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/icu/lang/UScript$ScriptUsage\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/lang/UScript$ScriptUsage;\"/>\n\t\t<method name=\"values()[Landroid/icu/lang/UScript$ScriptUsage;\"/>\n\t\t<field name=\"ASPIRATIONAL\"/>\n\t\t<field name=\"EXCLUDED\"/>\n\t\t<field name=\"LIMITED_USE\"/>\n\t\t<field name=\"NOT_ENCODED\"/>\n\t\t<field name=\"RECOMMENDED\"/>\n\t\t<field name=\"UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/icu/math/BigDecimal\" since=\"24\">\n\t\t<extends name=\"java/lang/Number\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(D)V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(J)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigDecimal;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigInteger;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigInteger;I)V\"/>\n\t\t<method name=\"&lt;init>([C)V\"/>\n\t\t<method name=\"&lt;init>([CII)V\"/>\n\t\t<method name=\"abs()Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"abs(Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"add(Landroid/icu/math/BigDecimal;)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"add(Landroid/icu/math/BigDecimal;Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"byteValueExact()B\"/>\n\t\t<method name=\"compareTo(Landroid/icu/math/BigDecimal;)I\"/>\n\t\t<method name=\"compareTo(Landroid/icu/math/BigDecimal;Landroid/icu/math/MathContext;)I\"/>\n\t\t<method name=\"divide(Landroid/icu/math/BigDecimal;)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"divide(Landroid/icu/math/BigDecimal;I)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"divide(Landroid/icu/math/BigDecimal;II)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"divide(Landroid/icu/math/BigDecimal;Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"divideInteger(Landroid/icu/math/BigDecimal;)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"divideInteger(Landroid/icu/math/BigDecimal;Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"format(II)Ljava/lang/String;\"/>\n\t\t<method name=\"format(IIIIII)Ljava/lang/String;\"/>\n\t\t<method name=\"intValueExact()I\"/>\n\t\t<method name=\"longValueExact()J\"/>\n\t\t<method name=\"max(Landroid/icu/math/BigDecimal;)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"max(Landroid/icu/math/BigDecimal;Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"min(Landroid/icu/math/BigDecimal;)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"min(Landroid/icu/math/BigDecimal;Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"movePointLeft(I)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"movePointRight(I)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"multiply(Landroid/icu/math/BigDecimal;)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"multiply(Landroid/icu/math/BigDecimal;Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"negate()Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"negate(Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"plus()Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"plus(Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"pow(Landroid/icu/math/BigDecimal;)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"pow(Landroid/icu/math/BigDecimal;Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"remainder(Landroid/icu/math/BigDecimal;)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"remainder(Landroid/icu/math/BigDecimal;Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"scale()I\"/>\n\t\t<method name=\"setScale(I)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"setScale(II)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"shortValueExact()S\"/>\n\t\t<method name=\"signum()I\"/>\n\t\t<method name=\"subtract(Landroid/icu/math/BigDecimal;)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"subtract(Landroid/icu/math/BigDecimal;Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"toBigDecimal()Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"toBigInteger()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"toBigIntegerExact()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"toCharArray()[C\"/>\n\t\t<method name=\"unscaledValue()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"valueOf(D)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"valueOf(J)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"valueOf(JI)Landroid/icu/math/BigDecimal;\"/>\n\t\t<field name=\"ONE\"/>\n\t\t<field name=\"ROUND_CEILING\"/>\n\t\t<field name=\"ROUND_DOWN\"/>\n\t\t<field name=\"ROUND_FLOOR\"/>\n\t\t<field name=\"ROUND_HALF_DOWN\"/>\n\t\t<field name=\"ROUND_HALF_EVEN\"/>\n\t\t<field name=\"ROUND_HALF_UP\"/>\n\t\t<field name=\"ROUND_UNNECESSARY\"/>\n\t\t<field name=\"ROUND_UP\"/>\n\t\t<field name=\"TEN\"/>\n\t\t<field name=\"ZERO\"/>\n\t</class>\n\t<class name=\"android/icu/math/MathContext\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(IIZ)V\"/>\n\t\t<method name=\"&lt;init>(IIZI)V\"/>\n\t\t<method name=\"getDigits()I\"/>\n\t\t<method name=\"getForm()I\"/>\n\t\t<method name=\"getLostDigits()Z\"/>\n\t\t<method name=\"getRoundingMode()I\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t\t<field name=\"ENGINEERING\"/>\n\t\t<field name=\"PLAIN\"/>\n\t\t<field name=\"ROUND_CEILING\"/>\n\t\t<field name=\"ROUND_DOWN\"/>\n\t\t<field name=\"ROUND_FLOOR\"/>\n\t\t<field name=\"ROUND_HALF_DOWN\"/>\n\t\t<field name=\"ROUND_HALF_EVEN\"/>\n\t\t<field name=\"ROUND_HALF_UP\"/>\n\t\t<field name=\"ROUND_UNNECESSARY\"/>\n\t\t<field name=\"ROUND_UP\"/>\n\t\t<field name=\"SCIENTIFIC\"/>\n\t</class>\n\t<class name=\"android/icu/number/CompactNotation\" since=\"30\">\n\t\t<extends name=\"android/icu/number/Notation\"/>\n\t</class>\n\t<class name=\"android/icu/number/CurrencyPrecision\" since=\"30\">\n\t\t<extends name=\"android/icu/number/Precision\"/>\n\t\t<method name=\"withCurrency(Landroid/icu/util/Currency;)Landroid/icu/number/Precision;\"/>\n\t</class>\n\t<class name=\"android/icu/number/FormattedNumber\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/CharSequence\"/>\n\t\t<method name=\"toBigDecimal()Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"toCharacterIterator()Ljava/text/AttributedCharacterIterator;\"/>\n\t</class>\n\t<class name=\"android/icu/number/FormattedNumberRange\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/CharSequence\"/>\n\t\t<method name=\"getFirstBigDecimal()Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"getIdentityResult()Landroid/icu/number/NumberRangeFormatter$RangeIdentityResult;\"/>\n\t\t<method name=\"getSecondBigDecimal()Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"toCharacterIterator()Ljava/text/AttributedCharacterIterator;\"/>\n\t</class>\n\t<class name=\"android/icu/number/FractionPrecision\" since=\"30\">\n\t\t<extends name=\"android/icu/number/Precision\"/>\n\t\t<method name=\"withMaxDigits(I)Landroid/icu/number/Precision;\"/>\n\t\t<method name=\"withMinDigits(I)Landroid/icu/number/Precision;\"/>\n\t</class>\n\t<class name=\"android/icu/number/IntegerWidth\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"truncateAt(I)Landroid/icu/number/IntegerWidth;\"/>\n\t\t<method name=\"zeroFillTo(I)Landroid/icu/number/IntegerWidth;\"/>\n\t</class>\n\t<class name=\"android/icu/number/LocalizedNumberFormatter\" since=\"30\">\n\t\t<extends name=\"android/icu/number/NumberFormatterSettings\"/>\n\t\t<method name=\"format(D)Landroid/icu/number/FormattedNumber;\"/>\n\t\t<method name=\"format(J)Landroid/icu/number/FormattedNumber;\"/>\n\t\t<method name=\"format(Landroid/icu/util/Measure;)Landroid/icu/number/FormattedNumber;\"/>\n\t\t<method name=\"format(Ljava/lang/Number;)Landroid/icu/number/FormattedNumber;\"/>\n\t\t<method name=\"toFormat()Ljava/text/Format;\"/>\n\t</class>\n\t<class name=\"android/icu/number/LocalizedNumberRangeFormatter\" since=\"30\">\n\t\t<extends name=\"android/icu/number/NumberRangeFormatterSettings\"/>\n\t\t<method name=\"formatRange(DD)Landroid/icu/number/FormattedNumberRange;\"/>\n\t\t<method name=\"formatRange(II)Landroid/icu/number/FormattedNumberRange;\"/>\n\t\t<method name=\"formatRange(Ljava/lang/Number;Ljava/lang/Number;)Landroid/icu/number/FormattedNumberRange;\"/>\n\t</class>\n\t<class name=\"android/icu/number/Notation\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"compactLong()Landroid/icu/number/CompactNotation;\"/>\n\t\t<method name=\"compactShort()Landroid/icu/number/CompactNotation;\"/>\n\t\t<method name=\"engineering()Landroid/icu/number/ScientificNotation;\"/>\n\t\t<method name=\"scientific()Landroid/icu/number/ScientificNotation;\"/>\n\t\t<method name=\"simple()Landroid/icu/number/SimpleNotation;\"/>\n\t</class>\n\t<class name=\"android/icu/number/NumberFormatter\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"with()Landroid/icu/number/UnlocalizedNumberFormatter;\"/>\n\t\t<method name=\"withLocale(Landroid/icu/util/ULocale;)Landroid/icu/number/LocalizedNumberFormatter;\"/>\n\t\t<method name=\"withLocale(Ljava/util/Locale;)Landroid/icu/number/LocalizedNumberFormatter;\"/>\n\t</class>\n\t<class name=\"android/icu/number/NumberFormatter$DecimalSeparatorDisplay\" since=\"30\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/number/NumberFormatter$DecimalSeparatorDisplay;\"/>\n\t\t<method name=\"values()[Landroid/icu/number/NumberFormatter$DecimalSeparatorDisplay;\"/>\n\t\t<field name=\"ALWAYS\"/>\n\t\t<field name=\"AUTO\"/>\n\t</class>\n\t<class name=\"android/icu/number/NumberFormatter$GroupingStrategy\" since=\"30\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/number/NumberFormatter$GroupingStrategy;\"/>\n\t\t<method name=\"values()[Landroid/icu/number/NumberFormatter$GroupingStrategy;\"/>\n\t\t<field name=\"AUTO\"/>\n\t\t<field name=\"MIN2\"/>\n\t\t<field name=\"OFF\"/>\n\t\t<field name=\"ON_ALIGNED\"/>\n\t\t<field name=\"THOUSANDS\"/>\n\t</class>\n\t<class name=\"android/icu/number/NumberFormatter$SignDisplay\" since=\"30\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/number/NumberFormatter$SignDisplay;\"/>\n\t\t<method name=\"values()[Landroid/icu/number/NumberFormatter$SignDisplay;\"/>\n\t\t<field name=\"ACCOUNTING\"/>\n\t\t<field name=\"ACCOUNTING_ALWAYS\"/>\n\t\t<field name=\"ACCOUNTING_EXCEPT_ZERO\"/>\n\t\t<field name=\"ALWAYS\"/>\n\t\t<field name=\"AUTO\"/>\n\t\t<field name=\"EXCEPT_ZERO\"/>\n\t\t<field name=\"NEVER\"/>\n\t</class>\n\t<class name=\"android/icu/number/NumberFormatter$UnitWidth\" since=\"30\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/number/NumberFormatter$UnitWidth;\"/>\n\t\t<method name=\"values()[Landroid/icu/number/NumberFormatter$UnitWidth;\"/>\n\t\t<field name=\"FULL_NAME\"/>\n\t\t<field name=\"HIDDEN\"/>\n\t\t<field name=\"ISO_CODE\"/>\n\t\t<field name=\"NARROW\"/>\n\t\t<field name=\"SHORT\"/>\n\t</class>\n\t<class name=\"android/icu/number/NumberFormatterSettings\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"decimal(Landroid/icu/number/NumberFormatter$DecimalSeparatorDisplay;)Landroid/icu/number/NumberFormatterSettings;\"/>\n\t\t<method name=\"grouping(Landroid/icu/number/NumberFormatter$GroupingStrategy;)Landroid/icu/number/NumberFormatterSettings;\"/>\n\t\t<method name=\"integerWidth(Landroid/icu/number/IntegerWidth;)Landroid/icu/number/NumberFormatterSettings;\"/>\n\t\t<method name=\"notation(Landroid/icu/number/Notation;)Landroid/icu/number/NumberFormatterSettings;\"/>\n\t\t<method name=\"perUnit(Landroid/icu/util/MeasureUnit;)Landroid/icu/number/NumberFormatterSettings;\"/>\n\t\t<method name=\"precision(Landroid/icu/number/Precision;)Landroid/icu/number/NumberFormatterSettings;\"/>\n\t\t<method name=\"roundingMode(Ljava/math/RoundingMode;)Landroid/icu/number/NumberFormatterSettings;\"/>\n\t\t<method name=\"scale(Landroid/icu/number/Scale;)Landroid/icu/number/NumberFormatterSettings;\"/>\n\t\t<method name=\"sign(Landroid/icu/number/NumberFormatter$SignDisplay;)Landroid/icu/number/NumberFormatterSettings;\"/>\n\t\t<method name=\"symbols(Landroid/icu/text/DecimalFormatSymbols;)Landroid/icu/number/NumberFormatterSettings;\"/>\n\t\t<method name=\"symbols(Landroid/icu/text/NumberingSystem;)Landroid/icu/number/NumberFormatterSettings;\"/>\n\t\t<method name=\"unit(Landroid/icu/util/MeasureUnit;)Landroid/icu/number/NumberFormatterSettings;\"/>\n\t\t<method name=\"unitWidth(Landroid/icu/number/NumberFormatter$UnitWidth;)Landroid/icu/number/NumberFormatterSettings;\"/>\n\t</class>\n\t<class name=\"android/icu/number/NumberRangeFormatter\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"with()Landroid/icu/number/UnlocalizedNumberRangeFormatter;\"/>\n\t\t<method name=\"withLocale(Landroid/icu/util/ULocale;)Landroid/icu/number/LocalizedNumberRangeFormatter;\"/>\n\t\t<method name=\"withLocale(Ljava/util/Locale;)Landroid/icu/number/LocalizedNumberRangeFormatter;\"/>\n\t</class>\n\t<class name=\"android/icu/number/NumberRangeFormatter$RangeCollapse\" since=\"30\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/number/NumberRangeFormatter$RangeCollapse;\"/>\n\t\t<method name=\"values()[Landroid/icu/number/NumberRangeFormatter$RangeCollapse;\"/>\n\t\t<field name=\"ALL\"/>\n\t\t<field name=\"AUTO\"/>\n\t\t<field name=\"NONE\"/>\n\t\t<field name=\"UNIT\"/>\n\t</class>\n\t<class name=\"android/icu/number/NumberRangeFormatter$RangeIdentityFallback\" since=\"30\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/number/NumberRangeFormatter$RangeIdentityFallback;\"/>\n\t\t<method name=\"values()[Landroid/icu/number/NumberRangeFormatter$RangeIdentityFallback;\"/>\n\t\t<field name=\"APPROXIMATELY\"/>\n\t\t<field name=\"APPROXIMATELY_OR_SINGLE_VALUE\"/>\n\t\t<field name=\"RANGE\"/>\n\t\t<field name=\"SINGLE_VALUE\"/>\n\t</class>\n\t<class name=\"android/icu/number/NumberRangeFormatter$RangeIdentityResult\" since=\"30\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/number/NumberRangeFormatter$RangeIdentityResult;\"/>\n\t\t<method name=\"values()[Landroid/icu/number/NumberRangeFormatter$RangeIdentityResult;\"/>\n\t\t<field name=\"EQUAL_AFTER_ROUNDING\"/>\n\t\t<field name=\"EQUAL_BEFORE_ROUNDING\"/>\n\t\t<field name=\"NOT_EQUAL\"/>\n\t</class>\n\t<class name=\"android/icu/number/NumberRangeFormatterSettings\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"collapse(Landroid/icu/number/NumberRangeFormatter$RangeCollapse;)Landroid/icu/number/NumberRangeFormatterSettings;\"/>\n\t\t<method name=\"identityFallback(Landroid/icu/number/NumberRangeFormatter$RangeIdentityFallback;)Landroid/icu/number/NumberRangeFormatterSettings;\"/>\n\t\t<method name=\"numberFormatterBoth(Landroid/icu/number/UnlocalizedNumberFormatter;)Landroid/icu/number/NumberRangeFormatterSettings;\"/>\n\t\t<method name=\"numberFormatterFirst(Landroid/icu/number/UnlocalizedNumberFormatter;)Landroid/icu/number/NumberRangeFormatterSettings;\"/>\n\t\t<method name=\"numberFormatterSecond(Landroid/icu/number/UnlocalizedNumberFormatter;)Landroid/icu/number/NumberRangeFormatterSettings;\"/>\n\t</class>\n\t<class name=\"android/icu/number/Precision\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"currency(Landroid/icu/util/Currency$CurrencyUsage;)Landroid/icu/number/CurrencyPrecision;\"/>\n\t\t<method name=\"fixedFraction(I)Landroid/icu/number/FractionPrecision;\"/>\n\t\t<method name=\"fixedSignificantDigits(I)Landroid/icu/number/Precision;\"/>\n\t\t<method name=\"increment(Ljava/math/BigDecimal;)Landroid/icu/number/Precision;\"/>\n\t\t<method name=\"integer()Landroid/icu/number/FractionPrecision;\"/>\n\t\t<method name=\"maxFraction(I)Landroid/icu/number/FractionPrecision;\"/>\n\t\t<method name=\"maxSignificantDigits(I)Landroid/icu/number/Precision;\"/>\n\t\t<method name=\"minFraction(I)Landroid/icu/number/FractionPrecision;\"/>\n\t\t<method name=\"minMaxFraction(II)Landroid/icu/number/FractionPrecision;\"/>\n\t\t<method name=\"minMaxSignificantDigits(II)Landroid/icu/number/Precision;\"/>\n\t\t<method name=\"minSignificantDigits(I)Landroid/icu/number/Precision;\"/>\n\t\t<method name=\"unlimited()Landroid/icu/number/Precision;\"/>\n\t</class>\n\t<class name=\"android/icu/number/Scale\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"byBigDecimal(Ljava/math/BigDecimal;)Landroid/icu/number/Scale;\"/>\n\t\t<method name=\"byDouble(D)Landroid/icu/number/Scale;\"/>\n\t\t<method name=\"byDoubleAndPowerOfTen(DI)Landroid/icu/number/Scale;\"/>\n\t\t<method name=\"none()Landroid/icu/number/Scale;\"/>\n\t\t<method name=\"powerOfTen(I)Landroid/icu/number/Scale;\"/>\n\t</class>\n\t<class name=\"android/icu/number/ScientificNotation\" since=\"30\">\n\t\t<extends name=\"android/icu/number/Notation\"/>\n\t\t<method name=\"withExponentSignDisplay(Landroid/icu/number/NumberFormatter$SignDisplay;)Landroid/icu/number/ScientificNotation;\"/>\n\t\t<method name=\"withMinExponentDigits(I)Landroid/icu/number/ScientificNotation;\"/>\n\t</class>\n\t<class name=\"android/icu/number/SimpleNotation\" since=\"30\">\n\t\t<extends name=\"android/icu/number/Notation\"/>\n\t</class>\n\t<class name=\"android/icu/number/UnlocalizedNumberFormatter\" since=\"30\">\n\t\t<extends name=\"android/icu/number/NumberFormatterSettings\"/>\n\t\t<method name=\"locale(Landroid/icu/util/ULocale;)Landroid/icu/number/LocalizedNumberFormatter;\"/>\n\t\t<method name=\"locale(Ljava/util/Locale;)Landroid/icu/number/LocalizedNumberFormatter;\"/>\n\t</class>\n\t<class name=\"android/icu/number/UnlocalizedNumberRangeFormatter\" since=\"30\">\n\t\t<extends name=\"android/icu/number/NumberRangeFormatterSettings\"/>\n\t\t<method name=\"locale(Landroid/icu/util/ULocale;)Landroid/icu/number/LocalizedNumberRangeFormatter;\"/>\n\t\t<method name=\"locale(Ljava/util/Locale;)Landroid/icu/number/LocalizedNumberRangeFormatter;\"/>\n\t</class>\n\t<class name=\"android/icu/text/AlphabeticIndex\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Iterable\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/text/RuleBasedCollator;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"addLabels(Landroid/icu/text/UnicodeSet;)Landroid/icu/text/AlphabeticIndex;\"/>\n\t\t<method name=\"addLabels([Landroid/icu/util/ULocale;)Landroid/icu/text/AlphabeticIndex;\"/>\n\t\t<method name=\"addLabels([Ljava/util/Locale;)Landroid/icu/text/AlphabeticIndex;\"/>\n\t\t<method name=\"addRecord(Ljava/lang/CharSequence;Ljava/lang/Object;)Landroid/icu/text/AlphabeticIndex;\"/>\n\t\t<method name=\"buildImmutableIndex()Landroid/icu/text/AlphabeticIndex$ImmutableIndex;\"/>\n\t\t<method name=\"clearRecords()Landroid/icu/text/AlphabeticIndex;\"/>\n\t\t<method name=\"getBucketCount()I\"/>\n\t\t<method name=\"getBucketIndex(Ljava/lang/CharSequence;)I\"/>\n\t\t<method name=\"getBucketLabels()Ljava/util/List;\"/>\n\t\t<method name=\"getCollator()Landroid/icu/text/RuleBasedCollator;\"/>\n\t\t<method name=\"getInflowLabel()Ljava/lang/String;\"/>\n\t\t<method name=\"getMaxLabelCount()I\"/>\n\t\t<method name=\"getOverflowLabel()Ljava/lang/String;\"/>\n\t\t<method name=\"getRecordCount()I\"/>\n\t\t<method name=\"getUnderflowLabel()Ljava/lang/String;\"/>\n\t\t<method name=\"setInflowLabel(Ljava/lang/String;)Landroid/icu/text/AlphabeticIndex;\"/>\n\t\t<method name=\"setMaxLabelCount(I)Landroid/icu/text/AlphabeticIndex;\"/>\n\t\t<method name=\"setOverflowLabel(Ljava/lang/String;)Landroid/icu/text/AlphabeticIndex;\"/>\n\t\t<method name=\"setUnderflowLabel(Ljava/lang/String;)Landroid/icu/text/AlphabeticIndex;\"/>\n\t</class>\n\t<class name=\"android/icu/text/AlphabeticIndex$Bucket\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Iterable\"/>\n\t\t<method name=\"getLabel()Ljava/lang/String;\"/>\n\t\t<method name=\"getLabelType()Landroid/icu/text/AlphabeticIndex$Bucket$LabelType;\"/>\n\t\t<method name=\"size()I\"/>\n\t</class>\n\t<class name=\"android/icu/text/AlphabeticIndex$Bucket$LabelType\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/AlphabeticIndex$Bucket$LabelType;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/AlphabeticIndex$Bucket$LabelType;\"/>\n\t\t<field name=\"INFLOW\"/>\n\t\t<field name=\"NORMAL\"/>\n\t\t<field name=\"OVERFLOW\"/>\n\t\t<field name=\"UNDERFLOW\"/>\n\t</class>\n\t<class name=\"android/icu/text/AlphabeticIndex$ImmutableIndex\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Iterable\"/>\n\t\t<method name=\"getBucket(I)Landroid/icu/text/AlphabeticIndex$Bucket;\"/>\n\t\t<method name=\"getBucketCount()I\"/>\n\t\t<method name=\"getBucketIndex(Ljava/lang/CharSequence;)I\"/>\n\t</class>\n\t<class name=\"android/icu/text/AlphabeticIndex$Record\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getData()Ljava/lang/Object;\"/>\n\t\t<method name=\"getName()Ljava/lang/CharSequence;\"/>\n\t</class>\n\t<class name=\"android/icu/text/Bidi\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/text/AttributedCharacterIterator;)V\"/>\n\t\t<method name=\"&lt;init>([CI[BIII)V\"/>\n\t\t<method name=\"baseIsLeftToRight()Z\"/>\n\t\t<method name=\"countParagraphs()I\"/>\n\t\t<method name=\"countRuns()I\"/>\n\t\t<method name=\"createLineBidi(II)Landroid/icu/text/Bidi;\"/>\n\t\t<method name=\"getBaseDirection(Ljava/lang/CharSequence;)B\"/>\n\t\t<method name=\"getBaseLevel()I\"/>\n\t\t<method name=\"getCustomClassifier()Landroid/icu/text/BidiClassifier;\"/>\n\t\t<method name=\"getCustomizedClass(I)I\"/>\n\t\t<method name=\"getDirection()B\"/>\n\t\t<method name=\"getLength()I\"/>\n\t\t<method name=\"getLevelAt(I)B\"/>\n\t\t<method name=\"getLevels()[B\"/>\n\t\t<method name=\"getLogicalIndex(I)I\"/>\n\t\t<method name=\"getLogicalMap()[I\"/>\n\t\t<method name=\"getLogicalRun(I)Landroid/icu/text/BidiRun;\"/>\n\t\t<method name=\"getParaLevel()B\"/>\n\t\t<method name=\"getParagraph(I)Landroid/icu/text/BidiRun;\"/>\n\t\t<method name=\"getParagraphByIndex(I)Landroid/icu/text/BidiRun;\"/>\n\t\t<method name=\"getParagraphIndex(I)I\"/>\n\t\t<method name=\"getProcessedLength()I\"/>\n\t\t<method name=\"getReorderingMode()I\"/>\n\t\t<method name=\"getReorderingOptions()I\"/>\n\t\t<method name=\"getResultLength()I\"/>\n\t\t<method name=\"getRunCount()I\"/>\n\t\t<method name=\"getRunLevel(I)I\"/>\n\t\t<method name=\"getRunLimit(I)I\"/>\n\t\t<method name=\"getRunStart(I)I\"/>\n\t\t<method name=\"getText()[C\"/>\n\t\t<method name=\"getTextAsString()Ljava/lang/String;\"/>\n\t\t<method name=\"getVisualIndex(I)I\"/>\n\t\t<method name=\"getVisualMap()[I\"/>\n\t\t<method name=\"getVisualRun(I)Landroid/icu/text/BidiRun;\"/>\n\t\t<method name=\"invertMap([I)[I\"/>\n\t\t<method name=\"isInverse()Z\"/>\n\t\t<method name=\"isLeftToRight()Z\"/>\n\t\t<method name=\"isMixed()Z\"/>\n\t\t<method name=\"isOrderParagraphsLTR()Z\"/>\n\t\t<method name=\"isRightToLeft()Z\"/>\n\t\t<method name=\"orderParagraphsLTR(Z)V\"/>\n\t\t<method name=\"reorderLogical([B)[I\"/>\n\t\t<method name=\"reorderVisual([B)[I\"/>\n\t\t<method name=\"reorderVisually([BI[Ljava/lang/Object;II)V\"/>\n\t\t<method name=\"requiresBidi([CII)Z\"/>\n\t\t<method name=\"setContext(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setCustomClassifier(Landroid/icu/text/BidiClassifier;)V\"/>\n\t\t<method name=\"setInverse(Z)V\"/>\n\t\t<method name=\"setLine(II)Landroid/icu/text/Bidi;\"/>\n\t\t<method name=\"setPara(Ljava/lang/String;B[B)V\"/>\n\t\t<method name=\"setPara(Ljava/text/AttributedCharacterIterator;)V\"/>\n\t\t<method name=\"setPara([CB[B)V\"/>\n\t\t<method name=\"setReorderingMode(I)V\"/>\n\t\t<method name=\"setReorderingOptions(I)V\"/>\n\t\t<method name=\"writeReordered(I)Ljava/lang/String;\"/>\n\t\t<method name=\"writeReverse(Ljava/lang/String;I)Ljava/lang/String;\"/>\n\t\t<field name=\"DIRECTION_DEFAULT_LEFT_TO_RIGHT\"/>\n\t\t<field name=\"DIRECTION_DEFAULT_RIGHT_TO_LEFT\"/>\n\t\t<field name=\"DIRECTION_LEFT_TO_RIGHT\"/>\n\t\t<field name=\"DIRECTION_RIGHT_TO_LEFT\"/>\n\t\t<field name=\"DO_MIRRORING\"/>\n\t\t<field name=\"INSERT_LRM_FOR_NUMERIC\"/>\n\t\t<field name=\"KEEP_BASE_COMBINING\"/>\n\t\t<field name=\"LEVEL_DEFAULT_LTR\"/>\n\t\t<field name=\"LEVEL_DEFAULT_RTL\"/>\n\t\t<field name=\"LEVEL_OVERRIDE\"/>\n\t\t<field name=\"LTR\"/>\n\t\t<field name=\"MAP_NOWHERE\"/>\n\t\t<field name=\"MAX_EXPLICIT_LEVEL\"/>\n\t\t<field name=\"MIXED\"/>\n\t\t<field name=\"NEUTRAL\"/>\n\t\t<field name=\"OPTION_DEFAULT\"/>\n\t\t<field name=\"OPTION_INSERT_MARKS\"/>\n\t\t<field name=\"OPTION_REMOVE_CONTROLS\"/>\n\t\t<field name=\"OPTION_STREAMING\"/>\n\t\t<field name=\"OUTPUT_REVERSE\"/>\n\t\t<field name=\"REMOVE_BIDI_CONTROLS\"/>\n\t\t<field name=\"REORDER_DEFAULT\"/>\n\t\t<field name=\"REORDER_GROUP_NUMBERS_WITH_R\"/>\n\t\t<field name=\"REORDER_INVERSE_FOR_NUMBERS_SPECIAL\"/>\n\t\t<field name=\"REORDER_INVERSE_LIKE_DIRECT\"/>\n\t\t<field name=\"REORDER_INVERSE_NUMBERS_AS_L\"/>\n\t\t<field name=\"REORDER_NUMBERS_SPECIAL\"/>\n\t\t<field name=\"REORDER_RUNS_ONLY\"/>\n\t\t<field name=\"RTL\"/>\n\t</class>\n\t<class name=\"android/icu/text/BidiClassifier\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"classify(I)I\"/>\n\t\t<method name=\"getContext()Ljava/lang/Object;\"/>\n\t\t<method name=\"setContext(Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"android/icu/text/BidiRun\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getDirection()B\"/>\n\t\t<method name=\"getEmbeddingLevel()B\"/>\n\t\t<method name=\"getLength()I\"/>\n\t\t<method name=\"getLimit()I\"/>\n\t\t<method name=\"getStart()I\"/>\n\t\t<method name=\"isEvenRun()Z\"/>\n\t\t<method name=\"isOddRun()Z\"/>\n\t</class>\n\t<class name=\"android/icu/text/BreakIterator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"current()I\"/>\n\t\t<method name=\"first()I\"/>\n\t\t<method name=\"following(I)I\"/>\n\t\t<method name=\"getAvailableLocales()[Ljava/util/Locale;\"/>\n\t\t<method name=\"getCharacterInstance()Landroid/icu/text/BreakIterator;\"/>\n\t\t<method name=\"getCharacterInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/BreakIterator;\"/>\n\t\t<method name=\"getCharacterInstance(Ljava/util/Locale;)Landroid/icu/text/BreakIterator;\"/>\n\t\t<method name=\"getLineInstance()Landroid/icu/text/BreakIterator;\"/>\n\t\t<method name=\"getLineInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/BreakIterator;\"/>\n\t\t<method name=\"getLineInstance(Ljava/util/Locale;)Landroid/icu/text/BreakIterator;\"/>\n\t\t<method name=\"getRuleStatus()I\"/>\n\t\t<method name=\"getRuleStatusVec([I)I\"/>\n\t\t<method name=\"getSentenceInstance()Landroid/icu/text/BreakIterator;\"/>\n\t\t<method name=\"getSentenceInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/BreakIterator;\"/>\n\t\t<method name=\"getSentenceInstance(Ljava/util/Locale;)Landroid/icu/text/BreakIterator;\"/>\n\t\t<method name=\"getText()Ljava/text/CharacterIterator;\"/>\n\t\t<method name=\"getTitleInstance()Landroid/icu/text/BreakIterator;\" deprecated=\"29\"/>\n\t\t<method name=\"getTitleInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/BreakIterator;\" deprecated=\"29\"/>\n\t\t<method name=\"getTitleInstance(Ljava/util/Locale;)Landroid/icu/text/BreakIterator;\" deprecated=\"29\"/>\n\t\t<method name=\"getWordInstance()Landroid/icu/text/BreakIterator;\"/>\n\t\t<method name=\"getWordInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/BreakIterator;\"/>\n\t\t<method name=\"getWordInstance(Ljava/util/Locale;)Landroid/icu/text/BreakIterator;\"/>\n\t\t<method name=\"isBoundary(I)Z\"/>\n\t\t<method name=\"last()I\"/>\n\t\t<method name=\"next()I\"/>\n\t\t<method name=\"next(I)I\"/>\n\t\t<method name=\"preceding(I)I\"/>\n\t\t<method name=\"previous()I\"/>\n\t\t<method name=\"setText(Ljava/lang/CharSequence;)V\" since=\"29\"/>\n\t\t<method name=\"setText(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setText(Ljava/text/CharacterIterator;)V\"/>\n\t\t<field name=\"DONE\"/>\n\t\t<field name=\"KIND_CHARACTER\"/>\n\t\t<field name=\"KIND_LINE\"/>\n\t\t<field name=\"KIND_SENTENCE\"/>\n\t\t<field name=\"KIND_TITLE\" deprecated=\"29\"/>\n\t\t<field name=\"KIND_WORD\"/>\n\t\t<field name=\"WORD_IDEO\"/>\n\t\t<field name=\"WORD_IDEO_LIMIT\"/>\n\t\t<field name=\"WORD_KANA\"/>\n\t\t<field name=\"WORD_KANA_LIMIT\"/>\n\t\t<field name=\"WORD_LETTER\"/>\n\t\t<field name=\"WORD_LETTER_LIMIT\"/>\n\t\t<field name=\"WORD_NONE\"/>\n\t\t<field name=\"WORD_NONE_LIMIT\"/>\n\t\t<field name=\"WORD_NUMBER\"/>\n\t\t<field name=\"WORD_NUMBER_LIMIT\"/>\n\t</class>\n\t<class name=\"android/icu/text/CaseMap\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"fold()Landroid/icu/text/CaseMap$Fold;\"/>\n\t\t<method name=\"omitUnchangedText()Landroid/icu/text/CaseMap;\"/>\n\t\t<method name=\"toLower()Landroid/icu/text/CaseMap$Lower;\"/>\n\t\t<method name=\"toTitle()Landroid/icu/text/CaseMap$Title;\"/>\n\t\t<method name=\"toUpper()Landroid/icu/text/CaseMap$Upper;\"/>\n\t</class>\n\t<class name=\"android/icu/text/CaseMap$Fold\" since=\"29\">\n\t\t<extends name=\"android/icu/text/CaseMap\"/>\n\t\t<method name=\"apply(Ljava/lang/CharSequence;)Ljava/lang/String;\"/>\n\t\t<method name=\"apply(Ljava/lang/CharSequence;Ljava/lang/Appendable;Landroid/icu/text/Edits;)Ljava/lang/Appendable;\"/>\n\t\t<method name=\"omitUnchangedText()Landroid/icu/text/CaseMap$Fold;\"/>\n\t\t<method name=\"turkic()Landroid/icu/text/CaseMap$Fold;\"/>\n\t</class>\n\t<class name=\"android/icu/text/CaseMap$Lower\" since=\"29\">\n\t\t<extends name=\"android/icu/text/CaseMap\"/>\n\t\t<method name=\"apply(Ljava/util/Locale;Ljava/lang/CharSequence;)Ljava/lang/String;\"/>\n\t\t<method name=\"apply(Ljava/util/Locale;Ljava/lang/CharSequence;Ljava/lang/Appendable;Landroid/icu/text/Edits;)Ljava/lang/Appendable;\"/>\n\t\t<method name=\"omitUnchangedText()Landroid/icu/text/CaseMap$Lower;\"/>\n\t</class>\n\t<class name=\"android/icu/text/CaseMap$Title\" since=\"29\">\n\t\t<extends name=\"android/icu/text/CaseMap\"/>\n\t\t<method name=\"adjustToCased()Landroid/icu/text/CaseMap$Title;\"/>\n\t\t<method name=\"apply(Ljava/util/Locale;Landroid/icu/text/BreakIterator;Ljava/lang/CharSequence;)Ljava/lang/String;\"/>\n\t\t<method name=\"apply(Ljava/util/Locale;Landroid/icu/text/BreakIterator;Ljava/lang/CharSequence;Ljava/lang/Appendable;Landroid/icu/text/Edits;)Ljava/lang/Appendable;\"/>\n\t\t<method name=\"noBreakAdjustment()Landroid/icu/text/CaseMap$Title;\"/>\n\t\t<method name=\"noLowercase()Landroid/icu/text/CaseMap$Title;\"/>\n\t\t<method name=\"omitUnchangedText()Landroid/icu/text/CaseMap$Title;\"/>\n\t\t<method name=\"sentences()Landroid/icu/text/CaseMap$Title;\"/>\n\t\t<method name=\"wholeString()Landroid/icu/text/CaseMap$Title;\"/>\n\t</class>\n\t<class name=\"android/icu/text/CaseMap$Upper\" since=\"29\">\n\t\t<extends name=\"android/icu/text/CaseMap\"/>\n\t\t<method name=\"apply(Ljava/util/Locale;Ljava/lang/CharSequence;)Ljava/lang/String;\"/>\n\t\t<method name=\"apply(Ljava/util/Locale;Ljava/lang/CharSequence;Ljava/lang/Appendable;Landroid/icu/text/Edits;)Ljava/lang/Appendable;\"/>\n\t\t<method name=\"omitUnchangedText()Landroid/icu/text/CaseMap$Upper;\"/>\n\t</class>\n\t<class name=\"android/icu/text/CollationElementIterator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getMaxExpansion(I)I\"/>\n\t\t<method name=\"getOffset()I\"/>\n\t\t<method name=\"next()I\"/>\n\t\t<method name=\"previous()I\"/>\n\t\t<method name=\"primaryOrder(I)I\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"secondaryOrder(I)I\"/>\n\t\t<method name=\"setOffset(I)V\"/>\n\t\t<method name=\"setText(Landroid/icu/text/UCharacterIterator;)V\"/>\n\t\t<method name=\"setText(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setText(Ljava/text/CharacterIterator;)V\"/>\n\t\t<method name=\"tertiaryOrder(I)I\"/>\n\t\t<field name=\"IGNORABLE\"/>\n\t\t<field name=\"NULLORDER\"/>\n\t</class>\n\t<class name=\"android/icu/text/CollationKey\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;[B)V\"/>\n\t\t<method name=\"compareTo(Landroid/icu/text/CollationKey;)I\"/>\n\t\t<method name=\"equals(Landroid/icu/text/CollationKey;)Z\"/>\n\t\t<method name=\"getBound(II)Landroid/icu/text/CollationKey;\"/>\n\t\t<method name=\"getSourceString()Ljava/lang/String;\"/>\n\t\t<method name=\"merge(Landroid/icu/text/CollationKey;)Landroid/icu/text/CollationKey;\"/>\n\t\t<method name=\"toByteArray()[B\"/>\n\t</class>\n\t<class name=\"android/icu/text/CollationKey$BoundMode\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"LOWER\"/>\n\t\t<field name=\"UPPER\"/>\n\t\t<field name=\"UPPER_LONG\"/>\n\t</class>\n\t<class name=\"android/icu/text/Collator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/icu/util/Freezable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"java/util/Comparator\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"cloneAsThawed()Landroid/icu/text/Collator;\"/>\n\t\t<method name=\"compare(Ljava/lang/String;Ljava/lang/String;)I\"/>\n\t\t<method name=\"equals(Ljava/lang/String;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"freeze()Landroid/icu/text/Collator;\"/>\n\t\t<method name=\"getAvailableLocales()[Ljava/util/Locale;\"/>\n\t\t<method name=\"getAvailableULocales()[Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"getCollationKey(Ljava/lang/String;)Landroid/icu/text/CollationKey;\"/>\n\t\t<method name=\"getDecomposition()I\"/>\n\t\t<method name=\"getDisplayName(Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName(Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName(Ljava/util/Locale;Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getEquivalentReorderCodes(I)[I\"/>\n\t\t<method name=\"getFunctionalEquivalent(Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"getFunctionalEquivalent(Ljava/lang/String;Landroid/icu/util/ULocale;[Z)Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"getInstance()Landroid/icu/text/Collator;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/Collator;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Landroid/icu/text/Collator;\"/>\n\t\t<method name=\"getKeywordValues(Ljava/lang/String;)[Ljava/lang/String;\"/>\n\t\t<method name=\"getKeywordValuesForLocale(Ljava/lang/String;Landroid/icu/util/ULocale;Z)[Ljava/lang/String;\"/>\n\t\t<method name=\"getKeywords()[Ljava/lang/String;\"/>\n\t\t<method name=\"getMaxVariable()I\"/>\n\t\t<method name=\"getReorderCodes()[I\"/>\n\t\t<method name=\"getStrength()I\"/>\n\t\t<method name=\"getTailoredSet()Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"getUCAVersion()Landroid/icu/util/VersionInfo;\"/>\n\t\t<method name=\"getVariableTop()I\"/>\n\t\t<method name=\"getVersion()Landroid/icu/util/VersionInfo;\"/>\n\t\t<method name=\"setDecomposition(I)V\"/>\n\t\t<method name=\"setMaxVariable(I)Landroid/icu/text/Collator;\"/>\n\t\t<method name=\"setReorderCodes([I)V\"/>\n\t\t<method name=\"setStrength(I)V\"/>\n\t\t<field name=\"CANONICAL_DECOMPOSITION\"/>\n\t\t<field name=\"FULL_DECOMPOSITION\"/>\n\t\t<field name=\"IDENTICAL\"/>\n\t\t<field name=\"NO_DECOMPOSITION\"/>\n\t\t<field name=\"PRIMARY\"/>\n\t\t<field name=\"QUATERNARY\"/>\n\t\t<field name=\"SECONDARY\"/>\n\t\t<field name=\"TERTIARY\"/>\n\t</class>\n\t<class name=\"android/icu/text/Collator$ReorderCodes\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CURRENCY\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t\t<field name=\"DIGIT\"/>\n\t\t<field name=\"FIRST\"/>\n\t\t<field name=\"NONE\"/>\n\t\t<field name=\"OTHERS\"/>\n\t\t<field name=\"PUNCTUATION\"/>\n\t\t<field name=\"SPACE\"/>\n\t\t<field name=\"SYMBOL\"/>\n\t</class>\n\t<class name=\"android/icu/text/CompactDecimalFormat\" since=\"24\">\n\t\t<extends name=\"android/icu/text/DecimalFormat\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;Landroid/icu/text/CompactDecimalFormat$CompactStyle;)Landroid/icu/text/CompactDecimalFormat;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;Landroid/icu/text/CompactDecimalFormat$CompactStyle;)Landroid/icu/text/CompactDecimalFormat;\"/>\n\t</class>\n\t<class name=\"android/icu/text/CompactDecimalFormat$CompactStyle\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/CompactDecimalFormat$CompactStyle;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/CompactDecimalFormat$CompactStyle;\"/>\n\t\t<field name=\"LONG\"/>\n\t\t<field name=\"SHORT\"/>\n\t</class>\n\t<class name=\"android/icu/text/CurrencyPluralInfo\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"getCurrencyPluralPattern(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance()Landroid/icu/text/CurrencyPluralInfo;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/CurrencyPluralInfo;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Landroid/icu/text/CurrencyPluralInfo;\"/>\n\t\t<method name=\"getLocale()Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"getPluralRules()Landroid/icu/text/PluralRules;\"/>\n\t\t<method name=\"setCurrencyPluralPattern(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setLocale(Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"setPluralRules(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/icu/text/DateFormat\" since=\"24\">\n\t\t<extends name=\"android/icu/text/UFormat\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"format(Landroid/icu/util/Calendar;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"format(Ljava/util/Date;)Ljava/lang/String;\"/>\n\t\t<method name=\"format(Ljava/util/Date;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"getAvailableLocales()[Ljava/util/Locale;\"/>\n\t\t<method name=\"getBooleanAttribute(Landroid/icu/text/DateFormat$BooleanAttribute;)Z\"/>\n\t\t<method name=\"getCalendar()Landroid/icu/util/Calendar;\"/>\n\t\t<method name=\"getContext(Landroid/icu/text/DisplayContext$Type;)Landroid/icu/text/DisplayContext;\"/>\n\t\t<method name=\"getDateInstance()Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getDateInstance(I)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getDateInstance(ILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getDateInstance(ILjava/util/Locale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getDateInstance(Landroid/icu/util/Calendar;I)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getDateInstance(Landroid/icu/util/Calendar;ILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getDateInstance(Landroid/icu/util/Calendar;ILjava/util/Locale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getDateTimeInstance()Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getDateTimeInstance(II)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getDateTimeInstance(IILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getDateTimeInstance(IILjava/util/Locale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getDateTimeInstance(Landroid/icu/util/Calendar;II)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getDateTimeInstance(Landroid/icu/util/Calendar;IILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getDateTimeInstance(Landroid/icu/util/Calendar;IILjava/util/Locale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getInstance()Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/Calendar;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/Calendar;Ljava/util/Locale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getInstanceForSkeleton(Landroid/icu/util/Calendar;Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getInstanceForSkeleton(Landroid/icu/util/Calendar;Ljava/lang/String;Ljava/util/Locale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getInstanceForSkeleton(Ljava/lang/String;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getInstanceForSkeleton(Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getInstanceForSkeleton(Ljava/lang/String;Ljava/util/Locale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getNumberFormat()Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getPatternInstance(Landroid/icu/util/Calendar;Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getPatternInstance(Landroid/icu/util/Calendar;Ljava/lang/String;Ljava/util/Locale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getPatternInstance(Ljava/lang/String;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getPatternInstance(Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getPatternInstance(Ljava/lang/String;Ljava/util/Locale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getTimeInstance()Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getTimeInstance(I)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getTimeInstance(ILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getTimeInstance(ILjava/util/Locale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getTimeInstance(Landroid/icu/util/Calendar;I)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getTimeInstance(Landroid/icu/util/Calendar;ILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getTimeInstance(Landroid/icu/util/Calendar;ILjava/util/Locale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getTimeZone()Landroid/icu/util/TimeZone;\"/>\n\t\t<method name=\"isCalendarLenient()Z\"/>\n\t\t<method name=\"isLenient()Z\"/>\n\t\t<method name=\"parse(Ljava/lang/String;)Ljava/util/Date;\"/>\n\t\t<method name=\"parse(Ljava/lang/String;Landroid/icu/util/Calendar;Ljava/text/ParsePosition;)V\"/>\n\t\t<method name=\"parse(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/util/Date;\"/>\n\t\t<method name=\"setBooleanAttribute(Landroid/icu/text/DateFormat$BooleanAttribute;Z)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"setCalendar(Landroid/icu/util/Calendar;)V\"/>\n\t\t<method name=\"setCalendarLenient(Z)V\"/>\n\t\t<method name=\"setContext(Landroid/icu/text/DisplayContext;)V\"/>\n\t\t<method name=\"setLenient(Z)V\"/>\n\t\t<method name=\"setNumberFormat(Landroid/icu/text/NumberFormat;)V\"/>\n\t\t<method name=\"setTimeZone(Landroid/icu/util/TimeZone;)V\"/>\n\t\t<field name=\"ABBR_GENERIC_TZ\"/>\n\t\t<field name=\"ABBR_MONTH\"/>\n\t\t<field name=\"ABBR_MONTH_DAY\"/>\n\t\t<field name=\"ABBR_MONTH_WEEKDAY_DAY\"/>\n\t\t<field name=\"ABBR_QUARTER\"/>\n\t\t<field name=\"ABBR_SPECIFIC_TZ\"/>\n\t\t<field name=\"ABBR_UTC_TZ\"/>\n\t\t<field name=\"ABBR_WEEKDAY\"/>\n\t\t<field name=\"AM_PM_FIELD\"/>\n\t\t<field name=\"AM_PM_MIDNIGHT_NOON_FIELD\" since=\"28\"/>\n\t\t<field name=\"DATE_FIELD\"/>\n\t\t<field name=\"DAY\"/>\n\t\t<field name=\"DAY_OF_WEEK_FIELD\"/>\n\t\t<field name=\"DAY_OF_WEEK_IN_MONTH_FIELD\"/>\n\t\t<field name=\"DAY_OF_YEAR_FIELD\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t\t<field name=\"DOW_LOCAL_FIELD\"/>\n\t\t<field name=\"ERA_FIELD\"/>\n\t\t<field name=\"EXTENDED_YEAR_FIELD\"/>\n\t\t<field name=\"FLEXIBLE_DAY_PERIOD_FIELD\" since=\"28\"/>\n\t\t<field name=\"FRACTIONAL_SECOND_FIELD\"/>\n\t\t<field name=\"FULL\"/>\n\t\t<field name=\"GENERIC_TZ\"/>\n\t\t<field name=\"HOUR\"/>\n\t\t<field name=\"HOUR0_FIELD\"/>\n\t\t<field name=\"HOUR1_FIELD\"/>\n\t\t<field name=\"HOUR24\"/>\n\t\t<field name=\"HOUR24_MINUTE\"/>\n\t\t<field name=\"HOUR24_MINUTE_SECOND\"/>\n\t\t<field name=\"HOUR_MINUTE\"/>\n\t\t<field name=\"HOUR_MINUTE_SECOND\"/>\n\t\t<field name=\"HOUR_OF_DAY0_FIELD\"/>\n\t\t<field name=\"HOUR_OF_DAY1_FIELD\"/>\n\t\t<field name=\"JULIAN_DAY_FIELD\"/>\n\t\t<field name=\"LOCATION_TZ\"/>\n\t\t<field name=\"LONG\"/>\n\t\t<field name=\"MEDIUM\"/>\n\t\t<field name=\"MILLISECONDS_IN_DAY_FIELD\"/>\n\t\t<field name=\"MILLISECOND_FIELD\"/>\n\t\t<field name=\"MINUTE\"/>\n\t\t<field name=\"MINUTE_FIELD\"/>\n\t\t<field name=\"MINUTE_SECOND\"/>\n\t\t<field name=\"MONTH\"/>\n\t\t<field name=\"MONTH_DAY\"/>\n\t\t<field name=\"MONTH_FIELD\"/>\n\t\t<field name=\"MONTH_WEEKDAY_DAY\"/>\n\t\t<field name=\"NONE\"/>\n\t\t<field name=\"NUM_MONTH\"/>\n\t\t<field name=\"NUM_MONTH_DAY\"/>\n\t\t<field name=\"NUM_MONTH_WEEKDAY_DAY\"/>\n\t\t<field name=\"QUARTER\"/>\n\t\t<field name=\"QUARTER_FIELD\"/>\n\t\t<field name=\"RELATIVE\"/>\n\t\t<field name=\"RELATIVE_DEFAULT\"/>\n\t\t<field name=\"RELATIVE_FULL\"/>\n\t\t<field name=\"RELATIVE_LONG\"/>\n\t\t<field name=\"RELATIVE_MEDIUM\"/>\n\t\t<field name=\"RELATIVE_SHORT\"/>\n\t\t<field name=\"SECOND\"/>\n\t\t<field name=\"SECOND_FIELD\"/>\n\t\t<field name=\"SHORT\"/>\n\t\t<field name=\"SPECIFIC_TZ\"/>\n\t\t<field name=\"STANDALONE_DAY_FIELD\"/>\n\t\t<field name=\"STANDALONE_MONTH_FIELD\"/>\n\t\t<field name=\"STANDALONE_QUARTER_FIELD\"/>\n\t\t<field name=\"TIMEZONE_FIELD\"/>\n\t\t<field name=\"TIMEZONE_GENERIC_FIELD\"/>\n\t\t<field name=\"TIMEZONE_ISO_FIELD\"/>\n\t\t<field name=\"TIMEZONE_ISO_LOCAL_FIELD\"/>\n\t\t<field name=\"TIMEZONE_LOCALIZED_GMT_OFFSET_FIELD\"/>\n\t\t<field name=\"TIMEZONE_RFC_FIELD\"/>\n\t\t<field name=\"TIMEZONE_SPECIAL_FIELD\"/>\n\t\t<field name=\"WEEKDAY\"/>\n\t\t<field name=\"WEEK_OF_MONTH_FIELD\"/>\n\t\t<field name=\"WEEK_OF_YEAR_FIELD\"/>\n\t\t<field name=\"YEAR\"/>\n\t\t<field name=\"YEAR_ABBR_MONTH\"/>\n\t\t<field name=\"YEAR_ABBR_MONTH_DAY\"/>\n\t\t<field name=\"YEAR_ABBR_MONTH_WEEKDAY_DAY\"/>\n\t\t<field name=\"YEAR_ABBR_QUARTER\"/>\n\t\t<field name=\"YEAR_FIELD\"/>\n\t\t<field name=\"YEAR_MONTH\"/>\n\t\t<field name=\"YEAR_MONTH_DAY\"/>\n\t\t<field name=\"YEAR_MONTH_WEEKDAY_DAY\"/>\n\t\t<field name=\"YEAR_NAME_FIELD\"/>\n\t\t<field name=\"YEAR_NUM_MONTH\"/>\n\t\t<field name=\"YEAR_NUM_MONTH_DAY\"/>\n\t\t<field name=\"YEAR_NUM_MONTH_WEEKDAY_DAY\"/>\n\t\t<field name=\"YEAR_QUARTER\"/>\n\t\t<field name=\"YEAR_WOY_FIELD\"/>\n\t\t<field name=\"calendar\"/>\n\t\t<field name=\"numberFormat\"/>\n\t</class>\n\t<class name=\"android/icu/text/DateFormat$BooleanAttribute\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/DateFormat$BooleanAttribute;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/DateFormat$BooleanAttribute;\"/>\n\t\t<field name=\"PARSE_ALLOW_NUMERIC\"/>\n\t\t<field name=\"PARSE_ALLOW_WHITESPACE\"/>\n\t\t<field name=\"PARSE_MULTIPLE_PATTERNS_FOR_MATCH\" since=\"26\"/>\n\t\t<field name=\"PARSE_PARTIAL_LITERAL_MATCH\" since=\"26\"/>\n\t\t<field name=\"PARSE_PARTIAL_MATCH\" since=\"28\" removed=\"29\"/>\n\t</class>\n\t<class name=\"android/icu/text/DateFormat$Field\" since=\"24\">\n\t\t<extends name=\"java/text/Format$Field\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"getCalendarField()I\"/>\n\t\t<method name=\"ofCalendarField(I)Landroid/icu/text/DateFormat$Field;\"/>\n\t\t<field name=\"AM_PM\"/>\n\t\t<field name=\"AM_PM_MIDNIGHT_NOON\" since=\"28\"/>\n\t\t<field name=\"DAY_OF_MONTH\"/>\n\t\t<field name=\"DAY_OF_WEEK\"/>\n\t\t<field name=\"DAY_OF_WEEK_IN_MONTH\"/>\n\t\t<field name=\"DAY_OF_YEAR\"/>\n\t\t<field name=\"DOW_LOCAL\"/>\n\t\t<field name=\"ERA\"/>\n\t\t<field name=\"EXTENDED_YEAR\"/>\n\t\t<field name=\"FLEXIBLE_DAY_PERIOD\" since=\"28\"/>\n\t\t<field name=\"HOUR0\"/>\n\t\t<field name=\"HOUR1\"/>\n\t\t<field name=\"HOUR_OF_DAY0\"/>\n\t\t<field name=\"HOUR_OF_DAY1\"/>\n\t\t<field name=\"JULIAN_DAY\"/>\n\t\t<field name=\"MILLISECOND\"/>\n\t\t<field name=\"MILLISECONDS_IN_DAY\"/>\n\t\t<field name=\"MINUTE\"/>\n\t\t<field name=\"MONTH\"/>\n\t\t<field name=\"QUARTER\"/>\n\t\t<field name=\"SECOND\"/>\n\t\t<field name=\"TIME_ZONE\"/>\n\t\t<field name=\"WEEK_OF_MONTH\"/>\n\t\t<field name=\"WEEK_OF_YEAR\"/>\n\t\t<field name=\"YEAR\"/>\n\t\t<field name=\"YEAR_WOY\"/>\n\t</class>\n\t<class name=\"android/icu/text/DateFormatSymbols\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/Calendar;Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/Calendar;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Class;Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Class;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/ResourceBundle;Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/ResourceBundle;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"getAmPmStrings()[Ljava/lang/String;\"/>\n\t\t<method name=\"getAvailableLocales()[Ljava/util/Locale;\"/>\n\t\t<method name=\"getEraNames()[Ljava/lang/String;\"/>\n\t\t<method name=\"getEras()[Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance()Landroid/icu/text/DateFormatSymbols;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/DateFormatSymbols;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Landroid/icu/text/DateFormatSymbols;\"/>\n\t\t<method name=\"getLocalPatternChars()Ljava/lang/String;\"/>\n\t\t<method name=\"getMonths()[Ljava/lang/String;\"/>\n\t\t<method name=\"getMonths(II)[Ljava/lang/String;\"/>\n\t\t<method name=\"getQuarters(II)[Ljava/lang/String;\"/>\n\t\t<method name=\"getShortMonths()[Ljava/lang/String;\"/>\n\t\t<method name=\"getShortWeekdays()[Ljava/lang/String;\"/>\n\t\t<method name=\"getWeekdays()[Ljava/lang/String;\"/>\n\t\t<method name=\"getWeekdays(II)[Ljava/lang/String;\"/>\n\t\t<method name=\"getYearNames(II)[Ljava/lang/String;\"/>\n\t\t<method name=\"getZodiacNames(II)[Ljava/lang/String;\"/>\n\t\t<method name=\"getZoneStrings()[[Ljava/lang/String;\"/>\n\t\t<method name=\"initializeData(Landroid/icu/util/ULocale;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setAmPmStrings([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setEraNames([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setEras([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setLocalPatternChars(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setMonths([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setMonths([Ljava/lang/String;II)V\"/>\n\t\t<method name=\"setQuarters([Ljava/lang/String;II)V\"/>\n\t\t<method name=\"setShortMonths([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setShortWeekdays([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setWeekdays([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setWeekdays([Ljava/lang/String;II)V\"/>\n\t\t<method name=\"setYearNames([Ljava/lang/String;II)V\"/>\n\t\t<method name=\"setZodiacNames([Ljava/lang/String;II)V\"/>\n\t\t<method name=\"setZoneStrings([[Ljava/lang/String;)V\"/>\n\t\t<field name=\"ABBREVIATED\"/>\n\t\t<field name=\"FORMAT\"/>\n\t\t<field name=\"NARROW\"/>\n\t\t<field name=\"SHORT\"/>\n\t\t<field name=\"STANDALONE\"/>\n\t\t<field name=\"WIDE\"/>\n\t</class>\n\t<class name=\"android/icu/text/DateIntervalFormat\" since=\"24\">\n\t\t<extends name=\"android/icu/text/UFormat\"/>\n\t\t<method name=\"format(Landroid/icu/util/Calendar;Landroid/icu/util/Calendar;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"format(Landroid/icu/util/DateInterval;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"getDateFormat()Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getDateIntervalInfo()Landroid/icu/text/DateIntervalInfo;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Landroid/icu/text/DateIntervalFormat;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Landroid/icu/text/DateIntervalInfo;)Landroid/icu/text/DateIntervalFormat;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/DateIntervalFormat;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Landroid/icu/util/ULocale;Landroid/icu/text/DateIntervalInfo;)Landroid/icu/text/DateIntervalFormat;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/util/Locale;)Landroid/icu/text/DateIntervalFormat;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/util/Locale;Landroid/icu/text/DateIntervalInfo;)Landroid/icu/text/DateIntervalFormat;\"/>\n\t\t<method name=\"getTimeZone()Landroid/icu/util/TimeZone;\"/>\n\t\t<method name=\"setDateIntervalInfo(Landroid/icu/text/DateIntervalInfo;)V\"/>\n\t\t<method name=\"setTimeZone(Landroid/icu/util/TimeZone;)V\"/>\n\t</class>\n\t<class name=\"android/icu/text/DateIntervalInfo\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/icu/util/Freezable\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"cloneAsThawed()Landroid/icu/text/DateIntervalInfo;\"/>\n\t\t<method name=\"freeze()Landroid/icu/text/DateIntervalInfo;\"/>\n\t\t<method name=\"getDefaultOrder()Z\"/>\n\t\t<method name=\"getFallbackIntervalPattern()Ljava/lang/String;\"/>\n\t\t<method name=\"getIntervalPattern(Ljava/lang/String;I)Landroid/icu/text/DateIntervalInfo$PatternInfo;\"/>\n\t\t<method name=\"setFallbackIntervalPattern(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setIntervalPattern(Ljava/lang/String;ILjava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/icu/text/DateIntervalInfo$PatternInfo\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"firstDateInPtnIsLaterDate()Z\"/>\n\t\t<method name=\"getFirstPart()Ljava/lang/String;\"/>\n\t\t<method name=\"getSecondPart()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/icu/text/DateTimePatternGenerator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/icu/util/Freezable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addPattern(Ljava/lang/String;ZLandroid/icu/text/DateTimePatternGenerator$PatternInfo;)Landroid/icu/text/DateTimePatternGenerator;\"/>\n\t\t<method name=\"cloneAsThawed()Landroid/icu/text/DateTimePatternGenerator;\"/>\n\t\t<method name=\"freeze()Landroid/icu/text/DateTimePatternGenerator;\"/>\n\t\t<method name=\"getAppendItemFormat(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getAppendItemName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getBaseSkeleton(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getBaseSkeletons(Ljava/util/Set;)Ljava/util/Set;\"/>\n\t\t<method name=\"getBestPattern(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getBestPattern(Ljava/lang/String;I)Ljava/lang/String;\"/>\n\t\t<method name=\"getDateTimeFormat()Ljava/lang/String;\"/>\n\t\t<method name=\"getDecimal()Ljava/lang/String;\"/>\n\t\t<method name=\"getEmptyInstance()Landroid/icu/text/DateTimePatternGenerator;\"/>\n\t\t<method name=\"getFieldDisplayName(ILandroid/icu/text/DateTimePatternGenerator$DisplayWidth;)Ljava/lang/String;\" since=\"30\"/>\n\t\t<method name=\"getInstance()Landroid/icu/text/DateTimePatternGenerator;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/DateTimePatternGenerator;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Landroid/icu/text/DateTimePatternGenerator;\"/>\n\t\t<method name=\"getSkeleton(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getSkeletons(Ljava/util/Map;)Ljava/util/Map;\"/>\n\t\t<method name=\"replaceFieldTypes(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"replaceFieldTypes(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;\"/>\n\t\t<method name=\"setAppendItemFormat(ILjava/lang/String;)V\"/>\n\t\t<method name=\"setAppendItemName(ILjava/lang/String;)V\"/>\n\t\t<method name=\"setDateTimeFormat(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setDecimal(Ljava/lang/String;)V\"/>\n\t\t<field name=\"DAY\"/>\n\t\t<field name=\"DAYPERIOD\"/>\n\t\t<field name=\"DAY_OF_WEEK_IN_MONTH\"/>\n\t\t<field name=\"DAY_OF_YEAR\"/>\n\t\t<field name=\"ERA\"/>\n\t\t<field name=\"FRACTIONAL_SECOND\"/>\n\t\t<field name=\"HOUR\"/>\n\t\t<field name=\"MATCH_ALL_FIELDS_LENGTH\"/>\n\t\t<field name=\"MATCH_HOUR_FIELD_LENGTH\"/>\n\t\t<field name=\"MATCH_NO_OPTIONS\"/>\n\t\t<field name=\"MINUTE\"/>\n\t\t<field name=\"MONTH\"/>\n\t\t<field name=\"QUARTER\"/>\n\t\t<field name=\"SECOND\"/>\n\t\t<field name=\"WEEKDAY\"/>\n\t\t<field name=\"WEEK_OF_MONTH\"/>\n\t\t<field name=\"WEEK_OF_YEAR\"/>\n\t\t<field name=\"YEAR\"/>\n\t\t<field name=\"ZONE\"/>\n\t</class>\n\t<class name=\"android/icu/text/DateTimePatternGenerator$DisplayWidth\" since=\"30\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/DateTimePatternGenerator$DisplayWidth;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/DateTimePatternGenerator$DisplayWidth;\"/>\n\t\t<field name=\"ABBREVIATED\"/>\n\t\t<field name=\"NARROW\"/>\n\t\t<field name=\"WIDE\"/>\n\t</class>\n\t<class name=\"android/icu/text/DateTimePatternGenerator$PatternInfo\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"BASE_CONFLICT\"/>\n\t\t<field name=\"CONFLICT\"/>\n\t\t<field name=\"OK\"/>\n\t\t<field name=\"conflictingPattern\"/>\n\t\t<field name=\"status\"/>\n\t</class>\n\t<class name=\"android/icu/text/DecimalFormat\" since=\"24\">\n\t\t<extends name=\"android/icu/text/NumberFormat\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Landroid/icu/text/DecimalFormatSymbols;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/text/CurrencyPluralInfo;I)V\"/>\n\t\t<method name=\"applyLocalizedPattern(Ljava/lang/String;)V\"/>\n\t\t<method name=\"applyPattern(Ljava/lang/String;)V\"/>\n\t\t<method name=\"areSignificantDigitsUsed()Z\"/>\n\t\t<method name=\"getCurrencyPluralInfo()Landroid/icu/text/CurrencyPluralInfo;\"/>\n\t\t<method name=\"getCurrencyUsage()Landroid/icu/util/Currency$CurrencyUsage;\"/>\n\t\t<method name=\"getDecimalFormatSymbols()Landroid/icu/text/DecimalFormatSymbols;\"/>\n\t\t<method name=\"getFormatWidth()I\"/>\n\t\t<method name=\"getGroupingSize()I\"/>\n\t\t<method name=\"getMathContext()Ljava/math/MathContext;\"/>\n\t\t<method name=\"getMathContextICU()Landroid/icu/math/MathContext;\"/>\n\t\t<method name=\"getMaximumSignificantDigits()I\"/>\n\t\t<method name=\"getMinimumExponentDigits()B\"/>\n\t\t<method name=\"getMinimumSignificantDigits()I\"/>\n\t\t<method name=\"getMultiplier()I\"/>\n\t\t<method name=\"getNegativePrefix()Ljava/lang/String;\"/>\n\t\t<method name=\"getNegativeSuffix()Ljava/lang/String;\"/>\n\t\t<method name=\"getPadCharacter()C\"/>\n\t\t<method name=\"getPadPosition()I\"/>\n\t\t<method name=\"getParseMaxDigits()I\" deprecated=\"28\"/>\n\t\t<method name=\"getPositivePrefix()Ljava/lang/String;\"/>\n\t\t<method name=\"getPositiveSuffix()Ljava/lang/String;\"/>\n\t\t<method name=\"getRoundingIncrement()Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"getSecondaryGroupingSize()I\"/>\n\t\t<method name=\"isDecimalPatternMatchRequired()Z\"/>\n\t\t<method name=\"isDecimalSeparatorAlwaysShown()Z\"/>\n\t\t<method name=\"isExponentSignAlwaysShown()Z\"/>\n\t\t<method name=\"isParseBigDecimal()Z\"/>\n\t\t<method name=\"isScientificNotation()Z\"/>\n\t\t<method name=\"setCurrencyPluralInfo(Landroid/icu/text/CurrencyPluralInfo;)V\"/>\n\t\t<method name=\"setCurrencyUsage(Landroid/icu/util/Currency$CurrencyUsage;)V\"/>\n\t\t<method name=\"setDecimalFormatSymbols(Landroid/icu/text/DecimalFormatSymbols;)V\"/>\n\t\t<method name=\"setDecimalPatternMatchRequired(Z)V\"/>\n\t\t<method name=\"setDecimalSeparatorAlwaysShown(Z)V\"/>\n\t\t<method name=\"setExponentSignAlwaysShown(Z)V\"/>\n\t\t<method name=\"setFormatWidth(I)V\"/>\n\t\t<method name=\"setGroupingSize(I)V\"/>\n\t\t<method name=\"setMathContext(Ljava/math/MathContext;)V\"/>\n\t\t<method name=\"setMathContextICU(Landroid/icu/math/MathContext;)V\"/>\n\t\t<method name=\"setMaximumSignificantDigits(I)V\"/>\n\t\t<method name=\"setMinimumExponentDigits(B)V\"/>\n\t\t<method name=\"setMinimumSignificantDigits(I)V\"/>\n\t\t<method name=\"setMultiplier(I)V\"/>\n\t\t<method name=\"setNegativePrefix(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setNegativeSuffix(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setPadCharacter(C)V\"/>\n\t\t<method name=\"setPadPosition(I)V\"/>\n\t\t<method name=\"setParseBigDecimal(Z)V\"/>\n\t\t<method name=\"setParseMaxDigits(I)V\" deprecated=\"28\"/>\n\t\t<method name=\"setPositivePrefix(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setPositiveSuffix(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setRoundingIncrement(D)V\"/>\n\t\t<method name=\"setRoundingIncrement(Landroid/icu/math/BigDecimal;)V\"/>\n\t\t<method name=\"setRoundingIncrement(Ljava/math/BigDecimal;)V\"/>\n\t\t<method name=\"setScientificNotation(Z)V\"/>\n\t\t<method name=\"setSecondaryGroupingSize(I)V\"/>\n\t\t<method name=\"setSignificantDigitsUsed(Z)V\"/>\n\t\t<method name=\"toLocalizedPattern()Ljava/lang/String;\"/>\n\t\t<method name=\"toPattern()Ljava/lang/String;\"/>\n\t\t<field name=\"PAD_AFTER_PREFIX\"/>\n\t\t<field name=\"PAD_AFTER_SUFFIX\"/>\n\t\t<field name=\"PAD_BEFORE_PREFIX\"/>\n\t\t<field name=\"PAD_BEFORE_SUFFIX\"/>\n\t</class>\n\t<class name=\"android/icu/text/DecimalFormatSymbols\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"forNumberingSystem(Landroid/icu/util/ULocale;Landroid/icu/text/NumberingSystem;)Landroid/icu/text/DecimalFormatSymbols;\" since=\"29\"/>\n\t\t<method name=\"forNumberingSystem(Ljava/util/Locale;Landroid/icu/text/NumberingSystem;)Landroid/icu/text/DecimalFormatSymbols;\" since=\"29\"/>\n\t\t<method name=\"getAvailableLocales()[Ljava/util/Locale;\"/>\n\t\t<method name=\"getCurrency()Landroid/icu/util/Currency;\"/>\n\t\t<method name=\"getCurrencySymbol()Ljava/lang/String;\"/>\n\t\t<method name=\"getDecimalSeparator()C\"/>\n\t\t<method name=\"getDecimalSeparatorString()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getDigit()C\"/>\n\t\t<method name=\"getDigitStrings()[Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getDigits()[C\"/>\n\t\t<method name=\"getExponentMultiplicationSign()Ljava/lang/String;\"/>\n\t\t<method name=\"getExponentSeparator()Ljava/lang/String;\"/>\n\t\t<method name=\"getGroupingSeparator()C\"/>\n\t\t<method name=\"getGroupingSeparatorString()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getInfinity()Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance()Landroid/icu/text/DecimalFormatSymbols;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/DecimalFormatSymbols;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Landroid/icu/text/DecimalFormatSymbols;\"/>\n\t\t<method name=\"getInternationalCurrencySymbol()Ljava/lang/String;\"/>\n\t\t<method name=\"getLocale()Ljava/util/Locale;\"/>\n\t\t<method name=\"getMinusSign()C\"/>\n\t\t<method name=\"getMinusSignString()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getMonetaryDecimalSeparator()C\"/>\n\t\t<method name=\"getMonetaryDecimalSeparatorString()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getMonetaryGroupingSeparator()C\"/>\n\t\t<method name=\"getMonetaryGroupingSeparatorString()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getNaN()Ljava/lang/String;\"/>\n\t\t<method name=\"getPadEscape()C\"/>\n\t\t<method name=\"getPatternForCurrencySpacing(IZ)Ljava/lang/String;\"/>\n\t\t<method name=\"getPatternSeparator()C\"/>\n\t\t<method name=\"getPerMill()C\"/>\n\t\t<method name=\"getPerMillString()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getPercent()C\"/>\n\t\t<method name=\"getPercentString()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getPlusSign()C\"/>\n\t\t<method name=\"getPlusSignString()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getSignificantDigit()C\"/>\n\t\t<method name=\"getULocale()Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"getZeroDigit()C\"/>\n\t\t<method name=\"setCurrency(Landroid/icu/util/Currency;)V\"/>\n\t\t<method name=\"setCurrencySymbol(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setDecimalSeparator(C)V\"/>\n\t\t<method name=\"setDecimalSeparatorString(Ljava/lang/String;)V\" since=\"28\"/>\n\t\t<method name=\"setDigit(C)V\"/>\n\t\t<method name=\"setDigitStrings([Ljava/lang/String;)V\" since=\"28\"/>\n\t\t<method name=\"setExponentMultiplicationSign(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setExponentSeparator(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setGroupingSeparator(C)V\"/>\n\t\t<method name=\"setGroupingSeparatorString(Ljava/lang/String;)V\" since=\"28\"/>\n\t\t<method name=\"setInfinity(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setInternationalCurrencySymbol(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setMinusSign(C)V\"/>\n\t\t<method name=\"setMinusSignString(Ljava/lang/String;)V\" since=\"28\"/>\n\t\t<method name=\"setMonetaryDecimalSeparator(C)V\"/>\n\t\t<method name=\"setMonetaryDecimalSeparatorString(Ljava/lang/String;)V\" since=\"28\"/>\n\t\t<method name=\"setMonetaryGroupingSeparator(C)V\"/>\n\t\t<method name=\"setMonetaryGroupingSeparatorString(Ljava/lang/String;)V\" since=\"28\"/>\n\t\t<method name=\"setNaN(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setPadEscape(C)V\"/>\n\t\t<method name=\"setPatternForCurrencySpacing(IZLjava/lang/String;)V\"/>\n\t\t<method name=\"setPatternSeparator(C)V\"/>\n\t\t<method name=\"setPerMill(C)V\"/>\n\t\t<method name=\"setPerMillString(Ljava/lang/String;)V\" since=\"28\"/>\n\t\t<method name=\"setPercent(C)V\"/>\n\t\t<method name=\"setPercentString(Ljava/lang/String;)V\" since=\"28\"/>\n\t\t<method name=\"setPlusSign(C)V\"/>\n\t\t<method name=\"setPlusSignString(Ljava/lang/String;)V\" since=\"28\"/>\n\t\t<method name=\"setSignificantDigit(C)V\"/>\n\t\t<method name=\"setZeroDigit(C)V\"/>\n\t\t<field name=\"CURRENCY_SPC_CURRENCY_MATCH\"/>\n\t\t<field name=\"CURRENCY_SPC_INSERT\"/>\n\t\t<field name=\"CURRENCY_SPC_SURROUNDING_MATCH\"/>\n\t</class>\n\t<class name=\"android/icu/text/DisplayContext\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"type()Landroid/icu/text/DisplayContext$Type;\"/>\n\t\t<method name=\"value()I\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/DisplayContext;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/DisplayContext;\"/>\n\t\t<field name=\"CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE\"/>\n\t\t<field name=\"CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE\"/>\n\t\t<field name=\"CAPITALIZATION_FOR_STANDALONE\"/>\n\t\t<field name=\"CAPITALIZATION_FOR_UI_LIST_OR_MENU\"/>\n\t\t<field name=\"CAPITALIZATION_NONE\"/>\n\t\t<field name=\"DIALECT_NAMES\"/>\n\t\t<field name=\"LENGTH_FULL\"/>\n\t\t<field name=\"LENGTH_SHORT\"/>\n\t\t<field name=\"NO_SUBSTITUTE\" since=\"28\"/>\n\t\t<field name=\"STANDARD_NAMES\"/>\n\t\t<field name=\"SUBSTITUTE\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/icu/text/DisplayContext$Type\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/DisplayContext$Type;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/DisplayContext$Type;\"/>\n\t\t<field name=\"CAPITALIZATION\"/>\n\t\t<field name=\"DIALECT_HANDLING\"/>\n\t\t<field name=\"DISPLAY_LENGTH\"/>\n\t\t<field name=\"SUBSTITUTE_HANDLING\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/icu/text/Edits\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addReplace(II)V\"/>\n\t\t<method name=\"addUnchanged(I)V\"/>\n\t\t<method name=\"getCoarseChangesIterator()Landroid/icu/text/Edits$Iterator;\"/>\n\t\t<method name=\"getCoarseIterator()Landroid/icu/text/Edits$Iterator;\"/>\n\t\t<method name=\"getFineChangesIterator()Landroid/icu/text/Edits$Iterator;\"/>\n\t\t<method name=\"getFineIterator()Landroid/icu/text/Edits$Iterator;\"/>\n\t\t<method name=\"hasChanges()Z\"/>\n\t\t<method name=\"lengthDelta()I\"/>\n\t\t<method name=\"mergeAndAppend(Landroid/icu/text/Edits;Landroid/icu/text/Edits;)Landroid/icu/text/Edits;\"/>\n\t\t<method name=\"numberOfChanges()I\"/>\n\t\t<method name=\"reset()V\"/>\n\t</class>\n\t<class name=\"android/icu/text/Edits$Iterator\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"destinationIndex()I\"/>\n\t\t<method name=\"destinationIndexFromSourceIndex(I)I\"/>\n\t\t<method name=\"findDestinationIndex(I)Z\"/>\n\t\t<method name=\"findSourceIndex(I)Z\"/>\n\t\t<method name=\"hasChange()Z\"/>\n\t\t<method name=\"newLength()I\"/>\n\t\t<method name=\"next()Z\"/>\n\t\t<method name=\"oldLength()I\"/>\n\t\t<method name=\"replacementIndex()I\"/>\n\t\t<method name=\"sourceIndex()I\"/>\n\t\t<method name=\"sourceIndexFromDestinationIndex(I)I\"/>\n\t</class>\n\t<class name=\"android/icu/text/IDNA\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getUTS46Instance(I)Landroid/icu/text/IDNA;\"/>\n\t\t<method name=\"labelToASCII(Ljava/lang/CharSequence;Ljava/lang/StringBuilder;Landroid/icu/text/IDNA$Info;)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"labelToUnicode(Ljava/lang/CharSequence;Ljava/lang/StringBuilder;Landroid/icu/text/IDNA$Info;)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"nameToASCII(Ljava/lang/CharSequence;Ljava/lang/StringBuilder;Landroid/icu/text/IDNA$Info;)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"nameToUnicode(Ljava/lang/CharSequence;Ljava/lang/StringBuilder;Landroid/icu/text/IDNA$Info;)Ljava/lang/StringBuilder;\"/>\n\t\t<field name=\"CHECK_BIDI\"/>\n\t\t<field name=\"CHECK_CONTEXTJ\"/>\n\t\t<field name=\"CHECK_CONTEXTO\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t\t<field name=\"NONTRANSITIONAL_TO_ASCII\"/>\n\t\t<field name=\"NONTRANSITIONAL_TO_UNICODE\"/>\n\t\t<field name=\"USE_STD3_RULES\"/>\n\t</class>\n\t<class name=\"android/icu/text/IDNA$Error\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/IDNA$Error;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/IDNA$Error;\"/>\n\t\t<field name=\"BIDI\"/>\n\t\t<field name=\"CONTEXTJ\"/>\n\t\t<field name=\"CONTEXTO_DIGITS\"/>\n\t\t<field name=\"CONTEXTO_PUNCTUATION\"/>\n\t\t<field name=\"DISALLOWED\"/>\n\t\t<field name=\"DOMAIN_NAME_TOO_LONG\"/>\n\t\t<field name=\"EMPTY_LABEL\"/>\n\t\t<field name=\"HYPHEN_3_4\"/>\n\t\t<field name=\"INVALID_ACE_LABEL\"/>\n\t\t<field name=\"LABEL_HAS_DOT\"/>\n\t\t<field name=\"LABEL_TOO_LONG\"/>\n\t\t<field name=\"LEADING_COMBINING_MARK\"/>\n\t\t<field name=\"LEADING_HYPHEN\"/>\n\t\t<field name=\"PUNYCODE\"/>\n\t\t<field name=\"TRAILING_HYPHEN\"/>\n\t</class>\n\t<class name=\"android/icu/text/IDNA$Info\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getErrors()Ljava/util/Set;\"/>\n\t\t<method name=\"hasErrors()Z\"/>\n\t\t<method name=\"isTransitionalDifferent()Z\"/>\n\t</class>\n\t<class name=\"android/icu/text/ListFormatter\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"format(Ljava/util/Collection;)Ljava/lang/String;\"/>\n\t\t<method name=\"format([Ljava/lang/Object;)Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance()Landroid/icu/text/ListFormatter;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/ListFormatter;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Landroid/icu/text/ListFormatter;\"/>\n\t\t<method name=\"getPatternForNumItems(I)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/icu/text/LocaleDisplayNames\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getContext(Landroid/icu/text/DisplayContext$Type;)Landroid/icu/text/DisplayContext;\"/>\n\t\t<method name=\"getDialectHandling()Landroid/icu/text/LocaleDisplayNames$DialectHandling;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/LocaleDisplayNames;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;Landroid/icu/text/LocaleDisplayNames$DialectHandling;)Landroid/icu/text/LocaleDisplayNames;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;[Landroid/icu/text/DisplayContext;)Landroid/icu/text/LocaleDisplayNames;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Landroid/icu/text/LocaleDisplayNames;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;[Landroid/icu/text/DisplayContext;)Landroid/icu/text/LocaleDisplayNames;\"/>\n\t\t<method name=\"getLocale()Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"getUiList(Ljava/util/Set;ZLjava/util/Comparator;)Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"getUiListCompareWholeItems(Ljava/util/Set;Ljava/util/Comparator;)Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"keyDisplayName(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"keyValueDisplayName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"languageDisplayName(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"localeDisplayName(Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"localeDisplayName(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"localeDisplayName(Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"regionDisplayName(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"scriptDisplayName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"scriptDisplayName(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"variantDisplayName(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/icu/text/LocaleDisplayNames$DialectHandling\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/LocaleDisplayNames$DialectHandling;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/LocaleDisplayNames$DialectHandling;\"/>\n\t\t<field name=\"DIALECT_NAMES\"/>\n\t\t<field name=\"STANDARD_NAMES\"/>\n\t</class>\n\t<class name=\"android/icu/text/LocaleDisplayNames$UiListItem\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getComparator(Ljava/util/Comparator;Z)Ljava/util/Comparator;\"/>\n\t\t<field name=\"minimized\"/>\n\t\t<field name=\"modified\"/>\n\t\t<field name=\"nameInDisplayLocale\"/>\n\t\t<field name=\"nameInSelf\"/>\n\t</class>\n\t<class name=\"android/icu/text/MeasureFormat\" since=\"24\">\n\t\t<extends name=\"android/icu/text/UFormat\"/>\n\t\t<method name=\"formatMeasurePerUnit(Landroid/icu/util/Measure;Landroid/icu/util/MeasureUnit;Ljava/lang/StringBuilder;Ljava/text/FieldPosition;)Ljava/lang/StringBuilder;\" since=\"26\"/>\n\t\t<method name=\"formatMeasures(Ljava/lang/StringBuilder;Ljava/text/FieldPosition;[Landroid/icu/util/Measure;)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"formatMeasures([Landroid/icu/util/Measure;)Ljava/lang/String;\"/>\n\t\t<method name=\"getCurrencyFormat()Landroid/icu/text/MeasureFormat;\"/>\n\t\t<method name=\"getCurrencyFormat(Landroid/icu/util/ULocale;)Landroid/icu/text/MeasureFormat;\"/>\n\t\t<method name=\"getCurrencyFormat(Ljava/util/Locale;)Landroid/icu/text/MeasureFormat;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;Landroid/icu/text/MeasureFormat$FormatWidth;)Landroid/icu/text/MeasureFormat;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;Landroid/icu/text/MeasureFormat$FormatWidth;Landroid/icu/text/NumberFormat;)Landroid/icu/text/MeasureFormat;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;Landroid/icu/text/MeasureFormat$FormatWidth;)Landroid/icu/text/MeasureFormat;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;Landroid/icu/text/MeasureFormat$FormatWidth;Landroid/icu/text/NumberFormat;)Landroid/icu/text/MeasureFormat;\"/>\n\t\t<method name=\"getLocale()Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"getNumberFormat()Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getUnitDisplayName(Landroid/icu/util/MeasureUnit;)Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getWidth()Landroid/icu/text/MeasureFormat$FormatWidth;\"/>\n\t\t<method name=\"parseObject(Ljava/lang/String;Ljava/text/ParsePosition;)Landroid/icu/util/Measure;\" removed=\"30\"/>\n\t</class>\n\t<class name=\"android/icu/text/MeasureFormat$FormatWidth\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/MeasureFormat$FormatWidth;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/MeasureFormat$FormatWidth;\"/>\n\t\t<field name=\"NARROW\"/>\n\t\t<field name=\"NUMERIC\"/>\n\t\t<field name=\"SHORT\"/>\n\t\t<field name=\"WIDE\"/>\n\t</class>\n\t<class name=\"android/icu/text/MessageFormat\" since=\"24\">\n\t\t<extends name=\"android/icu/text/UFormat\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"applyPattern(Ljava/lang/String;)V\"/>\n\t\t<method name=\"applyPattern(Ljava/lang/String;Landroid/icu/text/MessagePattern$ApostropheMode;)V\"/>\n\t\t<method name=\"autoQuoteApostrophe(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"format(Ljava/lang/String;Ljava/util/Map;)Ljava/lang/String;\"/>\n\t\t<method name=\"format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;\"/>\n\t\t<method name=\"format(Ljava/util/Map;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"format([Ljava/lang/Object;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"getApostropheMode()Landroid/icu/text/MessagePattern$ApostropheMode;\"/>\n\t\t<method name=\"getArgumentNames()Ljava/util/Set;\"/>\n\t\t<method name=\"getFormatByArgumentName(Ljava/lang/String;)Ljava/text/Format;\"/>\n\t\t<method name=\"getFormats()[Ljava/text/Format;\"/>\n\t\t<method name=\"getFormatsByArgumentIndex()[Ljava/text/Format;\"/>\n\t\t<method name=\"getLocale()Ljava/util/Locale;\"/>\n\t\t<method name=\"getULocale()Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"parse(Ljava/lang/String;)[Ljava/lang/Object;\"/>\n\t\t<method name=\"parse(Ljava/lang/String;Ljava/text/ParsePosition;)[Ljava/lang/Object;\"/>\n\t\t<method name=\"parseToMap(Ljava/lang/String;)Ljava/util/Map;\"/>\n\t\t<method name=\"parseToMap(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/util/Map;\"/>\n\t\t<method name=\"setFormat(ILjava/text/Format;)V\"/>\n\t\t<method name=\"setFormatByArgumentIndex(ILjava/text/Format;)V\"/>\n\t\t<method name=\"setFormatByArgumentName(Ljava/lang/String;Ljava/text/Format;)V\"/>\n\t\t<method name=\"setFormats([Ljava/text/Format;)V\"/>\n\t\t<method name=\"setFormatsByArgumentIndex([Ljava/text/Format;)V\"/>\n\t\t<method name=\"setFormatsByArgumentName(Ljava/util/Map;)V\"/>\n\t\t<method name=\"setLocale(Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"setLocale(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"toPattern()Ljava/lang/String;\"/>\n\t\t<method name=\"usesNamedArguments()Z\"/>\n\t</class>\n\t<class name=\"android/icu/text/MessageFormat$Field\" since=\"24\">\n\t\t<extends name=\"java/text/Format$Field\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<field name=\"ARGUMENT\"/>\n\t</class>\n\t<class name=\"android/icu/text/MessagePattern\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/icu/util/Freezable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/text/MessagePattern$ApostropheMode;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"autoQuoteApostropheDeep()Ljava/lang/String;\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"clearPatternAndSetApostropheMode(Landroid/icu/text/MessagePattern$ApostropheMode;)V\"/>\n\t\t<method name=\"cloneAsThawed()Landroid/icu/text/MessagePattern;\"/>\n\t\t<method name=\"countParts()I\"/>\n\t\t<method name=\"freeze()Landroid/icu/text/MessagePattern;\"/>\n\t\t<method name=\"getApostropheMode()Landroid/icu/text/MessagePattern$ApostropheMode;\"/>\n\t\t<method name=\"getLimitPartIndex(I)I\"/>\n\t\t<method name=\"getNumericValue(Landroid/icu/text/MessagePattern$Part;)D\"/>\n\t\t<method name=\"getPart(I)Landroid/icu/text/MessagePattern$Part;\"/>\n\t\t<method name=\"getPartType(I)Landroid/icu/text/MessagePattern$Part$Type;\"/>\n\t\t<method name=\"getPatternIndex(I)I\"/>\n\t\t<method name=\"getPatternString()Ljava/lang/String;\"/>\n\t\t<method name=\"getPluralOffset(I)D\"/>\n\t\t<method name=\"getSubstring(Landroid/icu/text/MessagePattern$Part;)Ljava/lang/String;\"/>\n\t\t<method name=\"hasNamedArguments()Z\"/>\n\t\t<method name=\"hasNumberedArguments()Z\"/>\n\t\t<method name=\"parse(Ljava/lang/String;)Landroid/icu/text/MessagePattern;\"/>\n\t\t<method name=\"parseChoiceStyle(Ljava/lang/String;)Landroid/icu/text/MessagePattern;\"/>\n\t\t<method name=\"parsePluralStyle(Ljava/lang/String;)Landroid/icu/text/MessagePattern;\"/>\n\t\t<method name=\"parseSelectStyle(Ljava/lang/String;)Landroid/icu/text/MessagePattern;\"/>\n\t\t<method name=\"partSubstringMatches(Landroid/icu/text/MessagePattern$Part;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"validateArgumentName(Ljava/lang/String;)I\"/>\n\t\t<field name=\"ARG_NAME_NOT_NUMBER\"/>\n\t\t<field name=\"ARG_NAME_NOT_VALID\"/>\n\t\t<field name=\"NO_NUMERIC_VALUE\"/>\n\t</class>\n\t<class name=\"android/icu/text/MessagePattern$ApostropheMode\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/MessagePattern$ApostropheMode;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/MessagePattern$ApostropheMode;\"/>\n\t\t<field name=\"DOUBLE_OPTIONAL\"/>\n\t\t<field name=\"DOUBLE_REQUIRED\"/>\n\t</class>\n\t<class name=\"android/icu/text/MessagePattern$ArgType\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"hasPluralStyle()Z\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/MessagePattern$ArgType;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/MessagePattern$ArgType;\"/>\n\t\t<field name=\"CHOICE\"/>\n\t\t<field name=\"NONE\"/>\n\t\t<field name=\"PLURAL\"/>\n\t\t<field name=\"SELECT\"/>\n\t\t<field name=\"SELECTORDINAL\"/>\n\t\t<field name=\"SIMPLE\"/>\n\t</class>\n\t<class name=\"android/icu/text/MessagePattern$Part\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getArgType()Landroid/icu/text/MessagePattern$ArgType;\"/>\n\t\t<method name=\"getIndex()I\"/>\n\t\t<method name=\"getLength()I\"/>\n\t\t<method name=\"getLimit()I\"/>\n\t\t<method name=\"getType()Landroid/icu/text/MessagePattern$Part$Type;\"/>\n\t\t<method name=\"getValue()I\"/>\n\t</class>\n\t<class name=\"android/icu/text/MessagePattern$Part$Type\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"hasNumericValue()Z\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/MessagePattern$Part$Type;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/MessagePattern$Part$Type;\"/>\n\t\t<field name=\"ARG_DOUBLE\"/>\n\t\t<field name=\"ARG_INT\"/>\n\t\t<field name=\"ARG_LIMIT\"/>\n\t\t<field name=\"ARG_NAME\"/>\n\t\t<field name=\"ARG_NUMBER\"/>\n\t\t<field name=\"ARG_SELECTOR\"/>\n\t\t<field name=\"ARG_START\"/>\n\t\t<field name=\"ARG_STYLE\"/>\n\t\t<field name=\"ARG_TYPE\"/>\n\t\t<field name=\"INSERT_CHAR\"/>\n\t\t<field name=\"MSG_LIMIT\"/>\n\t\t<field name=\"MSG_START\"/>\n\t\t<field name=\"REPLACE_NUMBER\"/>\n\t\t<field name=\"SKIP_SYNTAX\"/>\n\t</class>\n\t<class name=\"android/icu/text/Normalizer\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"compare(III)I\"/>\n\t\t<method name=\"compare(ILjava/lang/String;I)I\"/>\n\t\t<method name=\"compare(Ljava/lang/String;Ljava/lang/String;I)I\"/>\n\t\t<method name=\"compare([CII[CIII)I\"/>\n\t\t<method name=\"compare([C[CI)I\"/>\n\t\t<field name=\"COMPARE_CODE_POINT_ORDER\"/>\n\t\t<field name=\"COMPARE_IGNORE_CASE\"/>\n\t\t<field name=\"FOLD_CASE_DEFAULT\"/>\n\t\t<field name=\"FOLD_CASE_EXCLUDE_SPECIAL_I\"/>\n\t\t<field name=\"INPUT_IS_FCD\"/>\n\t\t<field name=\"MAYBE\"/>\n\t\t<field name=\"NO\"/>\n\t\t<field name=\"YES\"/>\n\t</class>\n\t<class name=\"android/icu/text/Normalizer$QuickCheckResult\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/icu/text/Normalizer2\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"append(Ljava/lang/StringBuilder;Ljava/lang/CharSequence;)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"composePair(II)I\"/>\n\t\t<method name=\"getCombiningClass(I)I\"/>\n\t\t<method name=\"getDecomposition(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance(Ljava/io/InputStream;Ljava/lang/String;Landroid/icu/text/Normalizer2$Mode;)Landroid/icu/text/Normalizer2;\"/>\n\t\t<method name=\"getNFCInstance()Landroid/icu/text/Normalizer2;\"/>\n\t\t<method name=\"getNFDInstance()Landroid/icu/text/Normalizer2;\"/>\n\t\t<method name=\"getNFKCCasefoldInstance()Landroid/icu/text/Normalizer2;\"/>\n\t\t<method name=\"getNFKCInstance()Landroid/icu/text/Normalizer2;\"/>\n\t\t<method name=\"getNFKDInstance()Landroid/icu/text/Normalizer2;\"/>\n\t\t<method name=\"getRawDecomposition(I)Ljava/lang/String;\"/>\n\t\t<method name=\"hasBoundaryAfter(I)Z\"/>\n\t\t<method name=\"hasBoundaryBefore(I)Z\"/>\n\t\t<method name=\"isInert(I)Z\"/>\n\t\t<method name=\"isNormalized(Ljava/lang/CharSequence;)Z\"/>\n\t\t<method name=\"normalize(Ljava/lang/CharSequence;)Ljava/lang/String;\"/>\n\t\t<method name=\"normalize(Ljava/lang/CharSequence;Ljava/lang/Appendable;)Ljava/lang/Appendable;\"/>\n\t\t<method name=\"normalize(Ljava/lang/CharSequence;Ljava/lang/StringBuilder;)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"normalizeSecondAndAppend(Ljava/lang/StringBuilder;Ljava/lang/CharSequence;)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"quickCheck(Ljava/lang/CharSequence;)Landroid/icu/text/Normalizer$QuickCheckResult;\"/>\n\t\t<method name=\"spanQuickCheckYes(Ljava/lang/CharSequence;)I\"/>\n\t</class>\n\t<class name=\"android/icu/text/Normalizer2$Mode\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/Normalizer2$Mode;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/Normalizer2$Mode;\"/>\n\t\t<field name=\"COMPOSE\"/>\n\t\t<field name=\"COMPOSE_CONTIGUOUS\"/>\n\t\t<field name=\"DECOMPOSE\"/>\n\t\t<field name=\"FCD\"/>\n\t</class>\n\t<class name=\"android/icu/text/NumberFormat\" since=\"24\">\n\t\t<extends name=\"android/icu/text/UFormat\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"format(D)Ljava/lang/String;\"/>\n\t\t<method name=\"format(DLjava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"format(J)Ljava/lang/String;\"/>\n\t\t<method name=\"format(JLjava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"format(Landroid/icu/math/BigDecimal;)Ljava/lang/String;\"/>\n\t\t<method name=\"format(Landroid/icu/math/BigDecimal;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"format(Landroid/icu/util/CurrencyAmount;)Ljava/lang/String;\"/>\n\t\t<method name=\"format(Landroid/icu/util/CurrencyAmount;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"format(Ljava/math/BigDecimal;)Ljava/lang/String;\"/>\n\t\t<method name=\"format(Ljava/math/BigDecimal;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"format(Ljava/math/BigInteger;)Ljava/lang/String;\"/>\n\t\t<method name=\"format(Ljava/math/BigInteger;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"getAvailableLocales()[Ljava/util/Locale;\"/>\n\t\t<method name=\"getContext(Landroid/icu/text/DisplayContext$Type;)Landroid/icu/text/DisplayContext;\"/>\n\t\t<method name=\"getCurrency()Landroid/icu/util/Currency;\"/>\n\t\t<method name=\"getCurrencyInstance()Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getCurrencyInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getCurrencyInstance(Ljava/util/Locale;)Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getInstance()Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getInstance(I)Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;I)Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;I)Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getIntegerInstance()Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getIntegerInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getIntegerInstance(Ljava/util/Locale;)Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getMaximumFractionDigits()I\"/>\n\t\t<method name=\"getMaximumIntegerDigits()I\"/>\n\t\t<method name=\"getMinimumFractionDigits()I\"/>\n\t\t<method name=\"getMinimumIntegerDigits()I\"/>\n\t\t<method name=\"getNumberInstance()Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getNumberInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getNumberInstance(Ljava/util/Locale;)Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getPattern(Landroid/icu/util/ULocale;I)Ljava/lang/String;\"/>\n\t\t<method name=\"getPercentInstance()Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getPercentInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getPercentInstance(Ljava/util/Locale;)Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getRoundingMode()I\"/>\n\t\t<method name=\"getScientificInstance()Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getScientificInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getScientificInstance(Ljava/util/Locale;)Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"isGroupingUsed()Z\"/>\n\t\t<method name=\"isParseIntegerOnly()Z\"/>\n\t\t<method name=\"isParseStrict()Z\"/>\n\t\t<method name=\"parse(Ljava/lang/String;)Ljava/lang/Number;\"/>\n\t\t<method name=\"parse(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/lang/Number;\"/>\n\t\t<method name=\"parseCurrency(Ljava/lang/CharSequence;Ljava/text/ParsePosition;)Landroid/icu/util/CurrencyAmount;\"/>\n\t\t<method name=\"setContext(Landroid/icu/text/DisplayContext;)V\"/>\n\t\t<method name=\"setCurrency(Landroid/icu/util/Currency;)V\"/>\n\t\t<method name=\"setGroupingUsed(Z)V\"/>\n\t\t<method name=\"setMaximumFractionDigits(I)V\"/>\n\t\t<method name=\"setMaximumIntegerDigits(I)V\"/>\n\t\t<method name=\"setMinimumFractionDigits(I)V\"/>\n\t\t<method name=\"setMinimumIntegerDigits(I)V\"/>\n\t\t<method name=\"setParseIntegerOnly(Z)V\"/>\n\t\t<method name=\"setParseStrict(Z)V\"/>\n\t\t<method name=\"setRoundingMode(I)V\"/>\n\t\t<field name=\"ACCOUNTINGCURRENCYSTYLE\"/>\n\t\t<field name=\"CASHCURRENCYSTYLE\"/>\n\t\t<field name=\"CURRENCYSTYLE\"/>\n\t\t<field name=\"FRACTION_FIELD\"/>\n\t\t<field name=\"INTEGERSTYLE\"/>\n\t\t<field name=\"INTEGER_FIELD\"/>\n\t\t<field name=\"ISOCURRENCYSTYLE\"/>\n\t\t<field name=\"NUMBERSTYLE\"/>\n\t\t<field name=\"PERCENTSTYLE\"/>\n\t\t<field name=\"PLURALCURRENCYSTYLE\"/>\n\t\t<field name=\"SCIENTIFICSTYLE\"/>\n\t\t<field name=\"STANDARDCURRENCYSTYLE\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/icu/text/NumberFormat$Field\" since=\"24\">\n\t\t<extends name=\"java/text/Format$Field\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<field name=\"CURRENCY\"/>\n\t\t<field name=\"DECIMAL_SEPARATOR\"/>\n\t\t<field name=\"EXPONENT\"/>\n\t\t<field name=\"EXPONENT_SIGN\"/>\n\t\t<field name=\"EXPONENT_SYMBOL\"/>\n\t\t<field name=\"FRACTION\"/>\n\t\t<field name=\"GROUPING_SEPARATOR\"/>\n\t\t<field name=\"INTEGER\"/>\n\t\t<field name=\"PERCENT\"/>\n\t\t<field name=\"PERMILLE\"/>\n\t\t<field name=\"SIGN\"/>\n\t</class>\n\t<class name=\"android/icu/text/NumberingSystem\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getAvailableNames()[Ljava/lang/String;\"/>\n\t\t<method name=\"getDescription()Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance()Landroid/icu/text/NumberingSystem;\"/>\n\t\t<method name=\"getInstance(IZLjava/lang/String;)Landroid/icu/text/NumberingSystem;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/NumberingSystem;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Landroid/icu/text/NumberingSystem;\"/>\n\t\t<method name=\"getInstanceByName(Ljava/lang/String;)Landroid/icu/text/NumberingSystem;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getRadix()I\"/>\n\t\t<method name=\"isAlgorithmic()Z\"/>\n\t\t<method name=\"isValidDigitString(Ljava/lang/String;)Z\"/>\n\t\t<field name=\"LATIN\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/icu/text/PluralFormat\" since=\"24\">\n\t\t<extends name=\"android/icu/text/UFormat\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/text/PluralRules;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/text/PluralRules;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;Landroid/icu/text/PluralRules$PluralType;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;Landroid/icu/text/PluralRules$PluralType;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;Landroid/icu/text/PluralRules;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;Landroid/icu/text/PluralRules;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;Landroid/icu/text/PluralRules$PluralType;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;Landroid/icu/text/PluralRules;)V\"/>\n\t\t<method name=\"applyPattern(Ljava/lang/String;)V\"/>\n\t\t<method name=\"equals(Landroid/icu/text/PluralFormat;)Z\"/>\n\t\t<method name=\"format(D)Ljava/lang/String;\"/>\n\t\t<method name=\"parse(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/lang/Number;\"/>\n\t\t<method name=\"setNumberFormat(Landroid/icu/text/NumberFormat;)V\"/>\n\t\t<method name=\"toPattern()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/icu/text/PluralRules\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"createRules(Ljava/lang/String;)Landroid/icu/text/PluralRules;\"/>\n\t\t<method name=\"equals(Landroid/icu/text/PluralRules;)Z\"/>\n\t\t<method name=\"forLocale(Landroid/icu/util/ULocale;)Landroid/icu/text/PluralRules;\"/>\n\t\t<method name=\"forLocale(Landroid/icu/util/ULocale;Landroid/icu/text/PluralRules$PluralType;)Landroid/icu/text/PluralRules;\"/>\n\t\t<method name=\"forLocale(Ljava/util/Locale;)Landroid/icu/text/PluralRules;\"/>\n\t\t<method name=\"forLocale(Ljava/util/Locale;Landroid/icu/text/PluralRules$PluralType;)Landroid/icu/text/PluralRules;\"/>\n\t\t<method name=\"getAllKeywordValues(Ljava/lang/String;)Ljava/util/Collection;\"/>\n\t\t<method name=\"getKeywords()Ljava/util/Set;\"/>\n\t\t<method name=\"getSamples(Ljava/lang/String;)Ljava/util/Collection;\"/>\n\t\t<method name=\"getUniqueKeywordValue(Ljava/lang/String;)D\"/>\n\t\t<method name=\"parseDescription(Ljava/lang/String;)Landroid/icu/text/PluralRules;\"/>\n\t\t<method name=\"select(D)Ljava/lang/String;\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t\t<field name=\"KEYWORD_FEW\"/>\n\t\t<field name=\"KEYWORD_MANY\"/>\n\t\t<field name=\"KEYWORD_ONE\"/>\n\t\t<field name=\"KEYWORD_OTHER\"/>\n\t\t<field name=\"KEYWORD_TWO\"/>\n\t\t<field name=\"KEYWORD_ZERO\"/>\n\t\t<field name=\"NO_UNIQUE_VALUE\"/>\n\t</class>\n\t<class name=\"android/icu/text/PluralRules$PluralType\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/PluralRules$PluralType;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/PluralRules$PluralType;\"/>\n\t\t<field name=\"CARDINAL\"/>\n\t\t<field name=\"ORDINAL\"/>\n\t</class>\n\t<class name=\"android/icu/text/RelativeDateTimeFormatter\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"combineDateAndTime(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"format(DLandroid/icu/text/RelativeDateTimeFormatter$Direction;Landroid/icu/text/RelativeDateTimeFormatter$RelativeUnit;)Ljava/lang/String;\"/>\n\t\t<method name=\"format(DLandroid/icu/text/RelativeDateTimeFormatter$RelativeDateTimeUnit;)Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"format(Landroid/icu/text/RelativeDateTimeFormatter$Direction;Landroid/icu/text/RelativeDateTimeFormatter$AbsoluteUnit;)Ljava/lang/String;\"/>\n\t\t<method name=\"formatNumeric(DLandroid/icu/text/RelativeDateTimeFormatter$RelativeDateTimeUnit;)Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getCapitalizationContext()Landroid/icu/text/DisplayContext;\"/>\n\t\t<method name=\"getFormatStyle()Landroid/icu/text/RelativeDateTimeFormatter$Style;\"/>\n\t\t<method name=\"getInstance()Landroid/icu/text/RelativeDateTimeFormatter;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/RelativeDateTimeFormatter;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;Landroid/icu/text/NumberFormat;)Landroid/icu/text/RelativeDateTimeFormatter;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;Landroid/icu/text/NumberFormat;Landroid/icu/text/RelativeDateTimeFormatter$Style;Landroid/icu/text/DisplayContext;)Landroid/icu/text/RelativeDateTimeFormatter;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Landroid/icu/text/RelativeDateTimeFormatter;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;Landroid/icu/text/NumberFormat;)Landroid/icu/text/RelativeDateTimeFormatter;\"/>\n\t\t<method name=\"getNumberFormat()Landroid/icu/text/NumberFormat;\"/>\n\t</class>\n\t<class name=\"android/icu/text/RelativeDateTimeFormatter$AbsoluteUnit\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/RelativeDateTimeFormatter$AbsoluteUnit;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/RelativeDateTimeFormatter$AbsoluteUnit;\"/>\n\t\t<field name=\"DAY\"/>\n\t\t<field name=\"FRIDAY\"/>\n\t\t<field name=\"MONDAY\"/>\n\t\t<field name=\"MONTH\"/>\n\t\t<field name=\"NOW\"/>\n\t\t<field name=\"QUARTER\" since=\"28\" removed=\"29\"/>\n\t\t<field name=\"SATURDAY\"/>\n\t\t<field name=\"SUNDAY\"/>\n\t\t<field name=\"THURSDAY\"/>\n\t\t<field name=\"TUESDAY\"/>\n\t\t<field name=\"WEDNESDAY\"/>\n\t\t<field name=\"WEEK\"/>\n\t\t<field name=\"YEAR\"/>\n\t</class>\n\t<class name=\"android/icu/text/RelativeDateTimeFormatter$Direction\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/RelativeDateTimeFormatter$Direction;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/RelativeDateTimeFormatter$Direction;\"/>\n\t\t<field name=\"LAST\"/>\n\t\t<field name=\"LAST_2\"/>\n\t\t<field name=\"NEXT\"/>\n\t\t<field name=\"NEXT_2\"/>\n\t\t<field name=\"PLAIN\"/>\n\t\t<field name=\"THIS\"/>\n\t</class>\n\t<class name=\"android/icu/text/RelativeDateTimeFormatter$RelativeDateTimeUnit\" since=\"28\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/RelativeDateTimeFormatter$RelativeDateTimeUnit;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/RelativeDateTimeFormatter$RelativeDateTimeUnit;\"/>\n\t\t<field name=\"DAY\"/>\n\t\t<field name=\"FRIDAY\"/>\n\t\t<field name=\"HOUR\"/>\n\t\t<field name=\"MINUTE\"/>\n\t\t<field name=\"MONDAY\"/>\n\t\t<field name=\"MONTH\"/>\n\t\t<field name=\"QUARTER\"/>\n\t\t<field name=\"SATURDAY\"/>\n\t\t<field name=\"SECOND\"/>\n\t\t<field name=\"SUNDAY\"/>\n\t\t<field name=\"THURSDAY\"/>\n\t\t<field name=\"TUESDAY\"/>\n\t\t<field name=\"WEDNESDAY\"/>\n\t\t<field name=\"WEEK\"/>\n\t\t<field name=\"YEAR\"/>\n\t</class>\n\t<class name=\"android/icu/text/RelativeDateTimeFormatter$RelativeUnit\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/RelativeDateTimeFormatter$RelativeUnit;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/RelativeDateTimeFormatter$RelativeUnit;\"/>\n\t\t<field name=\"DAYS\"/>\n\t\t<field name=\"HOURS\"/>\n\t\t<field name=\"MINUTES\"/>\n\t\t<field name=\"MONTHS\"/>\n\t\t<field name=\"QUARTERS\" since=\"28\" removed=\"29\"/>\n\t\t<field name=\"SECONDS\"/>\n\t\t<field name=\"WEEKS\"/>\n\t\t<field name=\"YEARS\"/>\n\t</class>\n\t<class name=\"android/icu/text/RelativeDateTimeFormatter$Style\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/RelativeDateTimeFormatter$Style;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/RelativeDateTimeFormatter$Style;\"/>\n\t\t<field name=\"LONG\"/>\n\t\t<field name=\"NARROW\"/>\n\t\t<field name=\"SHORT\"/>\n\t</class>\n\t<class name=\"android/icu/text/Replaceable\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"char32At(I)I\"/>\n\t\t<method name=\"charAt(I)C\"/>\n\t\t<method name=\"copy(III)V\"/>\n\t\t<method name=\"getChars(II[CI)V\"/>\n\t\t<method name=\"hasMetaData()Z\"/>\n\t\t<method name=\"length()I\"/>\n\t\t<method name=\"replace(IILjava/lang/String;)V\"/>\n\t\t<method name=\"replace(II[CII)V\"/>\n\t</class>\n\t<class name=\"android/icu/text/RuleBasedCollator\" since=\"24\">\n\t\t<extends name=\"android/icu/text/Collator\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"cloneAsThawed()Landroid/icu/text/RuleBasedCollator;\"/>\n\t\t<method name=\"getCollationElementIterator(Landroid/icu/text/UCharacterIterator;)Landroid/icu/text/CollationElementIterator;\"/>\n\t\t<method name=\"getCollationElementIterator(Ljava/lang/String;)Landroid/icu/text/CollationElementIterator;\"/>\n\t\t<method name=\"getCollationElementIterator(Ljava/text/CharacterIterator;)Landroid/icu/text/CollationElementIterator;\"/>\n\t\t<method name=\"getContractionsAndExpansions(Landroid/icu/text/UnicodeSet;Landroid/icu/text/UnicodeSet;Z)V\"/>\n\t\t<method name=\"getNumericCollation()Z\"/>\n\t\t<method name=\"getRules()Ljava/lang/String;\"/>\n\t\t<method name=\"getRules(Z)Ljava/lang/String;\"/>\n\t\t<method name=\"isAlternateHandlingShifted()Z\"/>\n\t\t<method name=\"isCaseLevel()Z\"/>\n\t\t<method name=\"isFrenchCollation()Z\"/>\n\t\t<method name=\"isLowerCaseFirst()Z\"/>\n\t\t<method name=\"isUpperCaseFirst()Z\"/>\n\t\t<method name=\"setAlternateHandlingDefault()V\"/>\n\t\t<method name=\"setAlternateHandlingShifted(Z)V\"/>\n\t\t<method name=\"setCaseFirstDefault()V\"/>\n\t\t<method name=\"setCaseLevel(Z)V\"/>\n\t\t<method name=\"setCaseLevelDefault()V\"/>\n\t\t<method name=\"setDecompositionDefault()V\"/>\n\t\t<method name=\"setFrenchCollation(Z)V\"/>\n\t\t<method name=\"setFrenchCollationDefault()V\"/>\n\t\t<method name=\"setLowerCaseFirst(Z)V\"/>\n\t\t<method name=\"setMaxVariable(I)Landroid/icu/text/RuleBasedCollator;\"/>\n\t\t<method name=\"setNumericCollation(Z)V\"/>\n\t\t<method name=\"setNumericCollationDefault()V\"/>\n\t\t<method name=\"setStrengthDefault()V\"/>\n\t\t<method name=\"setUpperCaseFirst(Z)V\"/>\n\t</class>\n\t<class name=\"android/icu/text/ScientificNumberFormatter\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"format(Ljava/lang/Object;)Ljava/lang/String;\"/>\n\t\t<method name=\"getMarkupInstance(Landroid/icu/text/DecimalFormat;Ljava/lang/String;Ljava/lang/String;)Landroid/icu/text/ScientificNumberFormatter;\"/>\n\t\t<method name=\"getMarkupInstance(Landroid/icu/util/ULocale;Ljava/lang/String;Ljava/lang/String;)Landroid/icu/text/ScientificNumberFormatter;\"/>\n\t\t<method name=\"getSuperscriptInstance(Landroid/icu/text/DecimalFormat;)Landroid/icu/text/ScientificNumberFormatter;\"/>\n\t\t<method name=\"getSuperscriptInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/ScientificNumberFormatter;\"/>\n\t</class>\n\t<class name=\"android/icu/text/SearchIterator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/text/CharacterIterator;Landroid/icu/text/BreakIterator;)V\"/>\n\t\t<method name=\"first()I\"/>\n\t\t<method name=\"following(I)I\"/>\n\t\t<method name=\"getBreakIterator()Landroid/icu/text/BreakIterator;\"/>\n\t\t<method name=\"getElementComparisonType()Landroid/icu/text/SearchIterator$ElementComparisonType;\"/>\n\t\t<method name=\"getIndex()I\"/>\n\t\t<method name=\"getMatchLength()I\"/>\n\t\t<method name=\"getMatchStart()I\"/>\n\t\t<method name=\"getMatchedText()Ljava/lang/String;\"/>\n\t\t<method name=\"getTarget()Ljava/text/CharacterIterator;\"/>\n\t\t<method name=\"handleNext(I)I\"/>\n\t\t<method name=\"handlePrevious(I)I\"/>\n\t\t<method name=\"isOverlapping()Z\"/>\n\t\t<method name=\"last()I\"/>\n\t\t<method name=\"next()I\"/>\n\t\t<method name=\"preceding(I)I\"/>\n\t\t<method name=\"previous()I\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"setBreakIterator(Landroid/icu/text/BreakIterator;)V\"/>\n\t\t<method name=\"setElementComparisonType(Landroid/icu/text/SearchIterator$ElementComparisonType;)V\"/>\n\t\t<method name=\"setIndex(I)V\"/>\n\t\t<method name=\"setMatchLength(I)V\"/>\n\t\t<method name=\"setOverlapping(Z)V\"/>\n\t\t<method name=\"setTarget(Ljava/text/CharacterIterator;)V\"/>\n\t\t<field name=\"DONE\"/>\n\t\t<field name=\"breakIterator\"/>\n\t\t<field name=\"matchLength\"/>\n\t\t<field name=\"targetText\"/>\n\t</class>\n\t<class name=\"android/icu/text/SearchIterator$ElementComparisonType\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/SearchIterator$ElementComparisonType;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/SearchIterator$ElementComparisonType;\"/>\n\t\t<field name=\"ANY_BASE_WEIGHT_IS_WILDCARD\"/>\n\t\t<field name=\"PATTERN_BASE_WEIGHT_IS_WILDCARD\"/>\n\t\t<field name=\"STANDARD_ELEMENT_COMPARISON\"/>\n\t</class>\n\t<class name=\"android/icu/text/SelectFormat\" since=\"24\">\n\t\t<extends name=\"java/text/Format\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"applyPattern(Ljava/lang/String;)V\"/>\n\t\t<method name=\"format(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"toPattern()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/icu/text/SimpleDateFormat\" since=\"24\">\n\t\t<extends name=\"android/icu/text/DateFormat\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Landroid/icu/text/DateFormatSymbols;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"applyLocalizedPattern(Ljava/lang/String;)V\"/>\n\t\t<method name=\"applyPattern(Ljava/lang/String;)V\"/>\n\t\t<method name=\"get2DigitYearStart()Ljava/util/Date;\"/>\n\t\t<method name=\"getDateFormatSymbols()Landroid/icu/text/DateFormatSymbols;\"/>\n\t\t<method name=\"getNumberFormat(C)Landroid/icu/text/NumberFormat;\"/>\n\t\t<method name=\"getSymbols()Landroid/icu/text/DateFormatSymbols;\"/>\n\t\t<method name=\"getTimeZoneFormat()Landroid/icu/text/TimeZoneFormat;\"/>\n\t\t<method name=\"matchQuarterString(Ljava/lang/String;II[Ljava/lang/String;Landroid/icu/util/Calendar;)I\"/>\n\t\t<method name=\"matchString(Ljava/lang/String;II[Ljava/lang/String;Landroid/icu/util/Calendar;)I\"/>\n\t\t<method name=\"patternCharToDateFormatField(C)Landroid/icu/text/DateFormat$Field;\"/>\n\t\t<method name=\"set2DigitYearStart(Ljava/util/Date;)V\"/>\n\t\t<method name=\"setDateFormatSymbols(Landroid/icu/text/DateFormatSymbols;)V\"/>\n\t\t<method name=\"setNumberFormat(Ljava/lang/String;Landroid/icu/text/NumberFormat;)V\"/>\n\t\t<method name=\"setTimeZoneFormat(Landroid/icu/text/TimeZoneFormat;)V\"/>\n\t\t<method name=\"subFormat(CIILjava/text/FieldPosition;Landroid/icu/text/DateFormatSymbols;Landroid/icu/util/Calendar;)Ljava/lang/String;\"/>\n\t\t<method name=\"subParse(Ljava/lang/String;ICIZZ[ZLandroid/icu/util/Calendar;)I\"/>\n\t\t<method name=\"toLocalizedPattern()Ljava/lang/String;\"/>\n\t\t<method name=\"toPattern()Ljava/lang/String;\"/>\n\t\t<method name=\"zeroPaddingNumber(JII)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/icu/text/StringPrepParseException\" since=\"24\">\n\t\t<extends name=\"java/text/ParseException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;ILjava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;ILjava/lang/String;II)V\"/>\n\t\t<method name=\"getError()I\"/>\n\t\t<field name=\"ACE_PREFIX_ERROR\"/>\n\t\t<field name=\"BUFFER_OVERFLOW_ERROR\"/>\n\t\t<field name=\"CHECK_BIDI_ERROR\"/>\n\t\t<field name=\"DOMAIN_NAME_TOO_LONG_ERROR\"/>\n\t\t<field name=\"ILLEGAL_CHAR_FOUND\"/>\n\t\t<field name=\"INVALID_CHAR_FOUND\"/>\n\t\t<field name=\"LABEL_TOO_LONG_ERROR\"/>\n\t\t<field name=\"PROHIBITED_ERROR\"/>\n\t\t<field name=\"STD3_ASCII_RULES_ERROR\"/>\n\t\t<field name=\"UNASSIGNED_ERROR\"/>\n\t\t<field name=\"VERIFICATION_ERROR\"/>\n\t\t<field name=\"ZERO_LENGTH_LABEL\"/>\n\t</class>\n\t<class name=\"android/icu/text/StringSearch\" since=\"24\">\n\t\t<extends name=\"android/icu/text/SearchIterator\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/text/CharacterIterator;Landroid/icu/text/RuleBasedCollator;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/text/CharacterIterator;Landroid/icu/text/RuleBasedCollator;Landroid/icu/text/BreakIterator;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/text/CharacterIterator;Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/text/CharacterIterator;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"getCollator()Landroid/icu/text/RuleBasedCollator;\"/>\n\t\t<method name=\"getPattern()Ljava/lang/String;\"/>\n\t\t<method name=\"isCanonical()Z\"/>\n\t\t<method name=\"setCanonical(Z)V\"/>\n\t\t<method name=\"setCollator(Landroid/icu/text/RuleBasedCollator;)V\"/>\n\t\t<method name=\"setPattern(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/icu/text/SymbolTable\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"lookup(Ljava/lang/String;)[C\"/>\n\t\t<method name=\"lookupMatcher(I)Landroid/icu/text/UnicodeMatcher;\"/>\n\t\t<method name=\"parseReference(Ljava/lang/String;Ljava/text/ParsePosition;I)Ljava/lang/String;\"/>\n\t\t<field name=\"SYMBOL_REF\"/>\n\t</class>\n\t<class name=\"android/icu/text/TimeZoneFormat\" since=\"24\">\n\t\t<extends name=\"android/icu/text/UFormat\"/>\n\t\t<implements name=\"android/icu/util/Freezable\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"cloneAsThawed()Landroid/icu/text/TimeZoneFormat;\"/>\n\t\t<method name=\"format(Landroid/icu/text/TimeZoneFormat$Style;Landroid/icu/util/TimeZone;J)Ljava/lang/String;\"/>\n\t\t<method name=\"format(Landroid/icu/text/TimeZoneFormat$Style;Landroid/icu/util/TimeZone;JLandroid/icu/util/Output;)Ljava/lang/String;\"/>\n\t\t<method name=\"formatOffsetISO8601Basic(IZZZ)Ljava/lang/String;\"/>\n\t\t<method name=\"formatOffsetISO8601Extended(IZZZ)Ljava/lang/String;\"/>\n\t\t<method name=\"formatOffsetLocalizedGMT(I)Ljava/lang/String;\"/>\n\t\t<method name=\"formatOffsetShortLocalizedGMT(I)Ljava/lang/String;\"/>\n\t\t<method name=\"freeze()Landroid/icu/text/TimeZoneFormat;\"/>\n\t\t<method name=\"getDefaultParseOptions()Ljava/util/EnumSet;\"/>\n\t\t<method name=\"getGMTOffsetDigits()Ljava/lang/String;\"/>\n\t\t<method name=\"getGMTOffsetPattern(Landroid/icu/text/TimeZoneFormat$GMTOffsetPatternType;)Ljava/lang/String;\"/>\n\t\t<method name=\"getGMTPattern()Ljava/lang/String;\"/>\n\t\t<method name=\"getGMTZeroFormat()Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/TimeZoneFormat;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Landroid/icu/text/TimeZoneFormat;\"/>\n\t\t<method name=\"getTimeZoneNames()Landroid/icu/text/TimeZoneNames;\"/>\n\t\t<method name=\"parse(Landroid/icu/text/TimeZoneFormat$Style;Ljava/lang/String;Ljava/text/ParsePosition;Landroid/icu/util/Output;)Landroid/icu/util/TimeZone;\"/>\n\t\t<method name=\"parse(Landroid/icu/text/TimeZoneFormat$Style;Ljava/lang/String;Ljava/text/ParsePosition;Ljava/util/EnumSet;Landroid/icu/util/Output;)Landroid/icu/util/TimeZone;\"/>\n\t\t<method name=\"parse(Ljava/lang/String;)Landroid/icu/util/TimeZone;\"/>\n\t\t<method name=\"parse(Ljava/lang/String;Ljava/text/ParsePosition;)Landroid/icu/util/TimeZone;\"/>\n\t\t<method name=\"parseOffsetISO8601(Ljava/lang/String;Ljava/text/ParsePosition;)I\"/>\n\t\t<method name=\"parseOffsetLocalizedGMT(Ljava/lang/String;Ljava/text/ParsePosition;)I\"/>\n\t\t<method name=\"parseOffsetShortLocalizedGMT(Ljava/lang/String;Ljava/text/ParsePosition;)I\"/>\n\t\t<method name=\"setDefaultParseOptions(Ljava/util/EnumSet;)Landroid/icu/text/TimeZoneFormat;\"/>\n\t\t<method name=\"setGMTOffsetDigits(Ljava/lang/String;)Landroid/icu/text/TimeZoneFormat;\"/>\n\t\t<method name=\"setGMTOffsetPattern(Landroid/icu/text/TimeZoneFormat$GMTOffsetPatternType;Ljava/lang/String;)Landroid/icu/text/TimeZoneFormat;\"/>\n\t\t<method name=\"setGMTPattern(Ljava/lang/String;)Landroid/icu/text/TimeZoneFormat;\"/>\n\t\t<method name=\"setGMTZeroFormat(Ljava/lang/String;)Landroid/icu/text/TimeZoneFormat;\"/>\n\t\t<method name=\"setTimeZoneNames(Landroid/icu/text/TimeZoneNames;)Landroid/icu/text/TimeZoneFormat;\"/>\n\t</class>\n\t<class name=\"android/icu/text/TimeZoneFormat$GMTOffsetPatternType\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/TimeZoneFormat$GMTOffsetPatternType;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/TimeZoneFormat$GMTOffsetPatternType;\"/>\n\t\t<field name=\"NEGATIVE_H\"/>\n\t\t<field name=\"NEGATIVE_HM\"/>\n\t\t<field name=\"NEGATIVE_HMS\"/>\n\t\t<field name=\"POSITIVE_H\"/>\n\t\t<field name=\"POSITIVE_HM\"/>\n\t\t<field name=\"POSITIVE_HMS\"/>\n\t</class>\n\t<class name=\"android/icu/text/TimeZoneFormat$ParseOption\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/TimeZoneFormat$ParseOption;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/TimeZoneFormat$ParseOption;\"/>\n\t\t<field name=\"ALL_STYLES\"/>\n\t\t<field name=\"TZ_DATABASE_ABBREVIATIONS\"/>\n\t</class>\n\t<class name=\"android/icu/text/TimeZoneFormat$Style\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/TimeZoneFormat$Style;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/TimeZoneFormat$Style;\"/>\n\t\t<field name=\"EXEMPLAR_LOCATION\"/>\n\t\t<field name=\"GENERIC_LOCATION\"/>\n\t\t<field name=\"GENERIC_LONG\"/>\n\t\t<field name=\"GENERIC_SHORT\"/>\n\t\t<field name=\"ISO_BASIC_FIXED\"/>\n\t\t<field name=\"ISO_BASIC_FULL\"/>\n\t\t<field name=\"ISO_BASIC_LOCAL_FIXED\"/>\n\t\t<field name=\"ISO_BASIC_LOCAL_FULL\"/>\n\t\t<field name=\"ISO_BASIC_LOCAL_SHORT\"/>\n\t\t<field name=\"ISO_BASIC_SHORT\"/>\n\t\t<field name=\"ISO_EXTENDED_FIXED\"/>\n\t\t<field name=\"ISO_EXTENDED_FULL\"/>\n\t\t<field name=\"ISO_EXTENDED_LOCAL_FIXED\"/>\n\t\t<field name=\"ISO_EXTENDED_LOCAL_FULL\"/>\n\t\t<field name=\"LOCALIZED_GMT\"/>\n\t\t<field name=\"LOCALIZED_GMT_SHORT\"/>\n\t\t<field name=\"SPECIFIC_LONG\"/>\n\t\t<field name=\"SPECIFIC_SHORT\"/>\n\t\t<field name=\"ZONE_ID\"/>\n\t\t<field name=\"ZONE_ID_SHORT\"/>\n\t</class>\n\t<class name=\"android/icu/text/TimeZoneFormat$TimeType\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/TimeZoneFormat$TimeType;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/TimeZoneFormat$TimeType;\"/>\n\t\t<field name=\"DAYLIGHT\"/>\n\t\t<field name=\"STANDARD\"/>\n\t\t<field name=\"UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/icu/text/TimeZoneNames\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"getAvailableMetaZoneIDs()Ljava/util/Set;\"/>\n\t\t<method name=\"getAvailableMetaZoneIDs(Ljava/lang/String;)Ljava/util/Set;\"/>\n\t\t<method name=\"getDisplayName(Ljava/lang/String;Landroid/icu/text/TimeZoneNames$NameType;J)Ljava/lang/String;\"/>\n\t\t<method name=\"getExemplarLocationName(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/TimeZoneNames;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Landroid/icu/text/TimeZoneNames;\"/>\n\t\t<method name=\"getMetaZoneDisplayName(Ljava/lang/String;Landroid/icu/text/TimeZoneNames$NameType;)Ljava/lang/String;\"/>\n\t\t<method name=\"getMetaZoneID(Ljava/lang/String;J)Ljava/lang/String;\"/>\n\t\t<method name=\"getReferenceZoneID(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getTZDBInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/TimeZoneNames;\"/>\n\t\t<method name=\"getTimeZoneDisplayName(Ljava/lang/String;Landroid/icu/text/TimeZoneNames$NameType;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/icu/text/TimeZoneNames$NameType\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/TimeZoneNames$NameType;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/TimeZoneNames$NameType;\"/>\n\t\t<field name=\"EXEMPLAR_LOCATION\"/>\n\t\t<field name=\"LONG_DAYLIGHT\"/>\n\t\t<field name=\"LONG_GENERIC\"/>\n\t\t<field name=\"LONG_STANDARD\"/>\n\t\t<field name=\"SHORT_DAYLIGHT\"/>\n\t\t<field name=\"SHORT_GENERIC\"/>\n\t\t<field name=\"SHORT_STANDARD\"/>\n\t</class>\n\t<class name=\"android/icu/text/Transliterator\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createFromRules(Ljava/lang/String;Ljava/lang/String;I)Landroid/icu/text/Transliterator;\"/>\n\t\t<method name=\"filteredTransliterate(Landroid/icu/text/Replaceable;Landroid/icu/text/Transliterator$Position;Z)V\"/>\n\t\t<method name=\"finishTransliteration(Landroid/icu/text/Replaceable;Landroid/icu/text/Transliterator$Position;)V\"/>\n\t\t<method name=\"getAvailableIDs()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"getAvailableSources()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"getAvailableTargets(Ljava/lang/String;)Ljava/util/Enumeration;\"/>\n\t\t<method name=\"getAvailableVariants(Ljava/lang/String;Ljava/lang/String;)Ljava/util/Enumeration;\"/>\n\t\t<method name=\"getDisplayName(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName(Ljava/lang/String;Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getElements()[Landroid/icu/text/Transliterator;\"/>\n\t\t<method name=\"getFilter()Landroid/icu/text/UnicodeFilter;\"/>\n\t\t<method name=\"getID()Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Landroid/icu/text/Transliterator;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;I)Landroid/icu/text/Transliterator;\"/>\n\t\t<method name=\"getInverse()Landroid/icu/text/Transliterator;\"/>\n\t\t<method name=\"getMaximumContextLength()I\"/>\n\t\t<method name=\"getSourceSet()Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"getTargetSet()Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"setFilter(Landroid/icu/text/UnicodeFilter;)V\"/>\n\t\t<method name=\"toRules(Z)Ljava/lang/String;\"/>\n\t\t<method name=\"transliterate(Landroid/icu/text/Replaceable;)V\"/>\n\t\t<method name=\"transliterate(Landroid/icu/text/Replaceable;II)I\"/>\n\t\t<method name=\"transliterate(Landroid/icu/text/Replaceable;Landroid/icu/text/Transliterator$Position;)V\"/>\n\t\t<method name=\"transliterate(Landroid/icu/text/Replaceable;Landroid/icu/text/Transliterator$Position;I)V\"/>\n\t\t<method name=\"transliterate(Landroid/icu/text/Replaceable;Landroid/icu/text/Transliterator$Position;Ljava/lang/String;)V\"/>\n\t\t<method name=\"transliterate(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<field name=\"FORWARD\"/>\n\t\t<field name=\"REVERSE\"/>\n\t</class>\n\t<class name=\"android/icu/text/Transliterator$Position\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"&lt;init>(IIII)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/text/Transliterator$Position;)V\"/>\n\t\t<method name=\"set(Landroid/icu/text/Transliterator$Position;)V\"/>\n\t\t<method name=\"validate(I)V\"/>\n\t\t<field name=\"contextLimit\"/>\n\t\t<field name=\"contextStart\"/>\n\t\t<field name=\"limit\"/>\n\t\t<field name=\"start\"/>\n\t</class>\n\t<class name=\"android/icu/text/UCharacterIterator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"current()I\"/>\n\t\t<method name=\"currentCodePoint()I\"/>\n\t\t<method name=\"getCharacterIterator()Ljava/text/CharacterIterator;\"/>\n\t\t<method name=\"getIndex()I\"/>\n\t\t<method name=\"getInstance(Landroid/icu/text/Replaceable;)Landroid/icu/text/UCharacterIterator;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Landroid/icu/text/UCharacterIterator;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/StringBuffer;)Landroid/icu/text/UCharacterIterator;\"/>\n\t\t<method name=\"getInstance(Ljava/text/CharacterIterator;)Landroid/icu/text/UCharacterIterator;\"/>\n\t\t<method name=\"getInstance([C)Landroid/icu/text/UCharacterIterator;\"/>\n\t\t<method name=\"getInstance([CII)Landroid/icu/text/UCharacterIterator;\"/>\n\t\t<method name=\"getLength()I\"/>\n\t\t<method name=\"getText()Ljava/lang/String;\"/>\n\t\t<method name=\"getText([C)I\"/>\n\t\t<method name=\"getText([CI)I\"/>\n\t\t<method name=\"moveCodePointIndex(I)I\"/>\n\t\t<method name=\"moveIndex(I)I\"/>\n\t\t<method name=\"next()I\"/>\n\t\t<method name=\"nextCodePoint()I\"/>\n\t\t<method name=\"previous()I\"/>\n\t\t<method name=\"previousCodePoint()I\"/>\n\t\t<method name=\"setIndex(I)V\"/>\n\t\t<method name=\"setToLimit()V\"/>\n\t\t<method name=\"setToStart()V\"/>\n\t\t<field name=\"DONE\"/>\n\t</class>\n\t<class name=\"android/icu/text/UFormat\" since=\"24\">\n\t\t<extends name=\"java/text/Format\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/icu/text/UnicodeFilter\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/icu/text/UnicodeMatcher\"/>\n\t\t<method name=\"contains(I)Z\"/>\n\t</class>\n\t<class name=\"android/icu/text/UnicodeMatcher\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addMatchSetTo(Landroid/icu/text/UnicodeSet;)V\"/>\n\t\t<method name=\"matches(Landroid/icu/text/Replaceable;[IIZ)I\"/>\n\t\t<method name=\"matchesIndexValue(I)Z\"/>\n\t\t<method name=\"toPattern(Z)Ljava/lang/String;\"/>\n\t\t<field name=\"ETHER\"/>\n\t\t<field name=\"U_MATCH\"/>\n\t\t<field name=\"U_MISMATCH\"/>\n\t\t<field name=\"U_PARTIAL_MATCH\"/>\n\t</class>\n\t<class name=\"android/icu/text/UnicodeSet\" since=\"24\">\n\t\t<extends name=\"android/icu/text/UnicodeFilter\"/>\n\t\t<implements name=\"android/icu/util/Freezable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<implements name=\"java/lang/Iterable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/text/UnicodeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/text/ParsePosition;Landroid/icu/text/SymbolTable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/text/ParsePosition;Landroid/icu/text/SymbolTable;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"&lt;init>([I)V\"/>\n\t\t<method name=\"_generatePattern(Ljava/lang/StringBuffer;Z)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"_generatePattern(Ljava/lang/StringBuffer;ZZ)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"add(I)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"add(II)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"add(Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"add(Ljava/lang/Iterable;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"addAll(II)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"addAll(Landroid/icu/text/UnicodeSet;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"addAll(Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"addAll(Ljava/lang/Iterable;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"addAll([Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"addAllTo(Ljava/util/Collection;)Ljava/util/Collection;\"/>\n\t\t<method name=\"applyIntPropertyValue(II)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"applyPattern(Ljava/lang/String;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"applyPattern(Ljava/lang/String;I)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"applyPattern(Ljava/lang/String;Z)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"applyPropertyAlias(Ljava/lang/String;Ljava/lang/String;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"applyPropertyAlias(Ljava/lang/String;Ljava/lang/String;Landroid/icu/text/SymbolTable;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"charAt(I)I\"/>\n\t\t<method name=\"clear()Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"cloneAsThawed()Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"closeOver(I)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"compact()Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"compareTo(Landroid/icu/text/UnicodeSet;)I\"/>\n\t\t<method name=\"compareTo(Landroid/icu/text/UnicodeSet;Landroid/icu/text/UnicodeSet$ComparisonStyle;)I\"/>\n\t\t<method name=\"compareTo(Ljava/lang/Iterable;)I\"/>\n\t\t<method name=\"complement()Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"complement(I)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"complement(II)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"complement(Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"complementAll(Landroid/icu/text/UnicodeSet;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"complementAll(Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"contains(II)Z\"/>\n\t\t<method name=\"contains(Ljava/lang/CharSequence;)Z\"/>\n\t\t<method name=\"containsAll(Landroid/icu/text/UnicodeSet;)Z\"/>\n\t\t<method name=\"containsAll(Ljava/lang/Iterable;)Z\"/>\n\t\t<method name=\"containsAll(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"containsNone(II)Z\"/>\n\t\t<method name=\"containsNone(Landroid/icu/text/UnicodeSet;)Z\"/>\n\t\t<method name=\"containsNone(Ljava/lang/CharSequence;)Z\"/>\n\t\t<method name=\"containsNone(Ljava/lang/Iterable;)Z\"/>\n\t\t<method name=\"containsSome(II)Z\"/>\n\t\t<method name=\"containsSome(Landroid/icu/text/UnicodeSet;)Z\"/>\n\t\t<method name=\"containsSome(Ljava/lang/CharSequence;)Z\"/>\n\t\t<method name=\"containsSome(Ljava/lang/Iterable;)Z\"/>\n\t\t<method name=\"freeze()Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"from(Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"fromAll(Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"getRangeCount()I\"/>\n\t\t<method name=\"getRangeEnd(I)I\"/>\n\t\t<method name=\"getRangeStart(I)I\"/>\n\t\t<method name=\"indexOf(I)I\"/>\n\t\t<method name=\"isEmpty()Z\"/>\n\t\t<method name=\"ranges()Ljava/lang/Iterable;\"/>\n\t\t<method name=\"remove(I)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"remove(II)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"remove(Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"removeAll(Landroid/icu/text/UnicodeSet;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"removeAll(Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"removeAll(Ljava/lang/Iterable;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"removeAllStrings()Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"retain(I)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"retain(II)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"retain(Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"retainAll(Landroid/icu/text/UnicodeSet;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"retainAll(Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"retainAll(Ljava/lang/Iterable;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"set(II)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"set(Landroid/icu/text/UnicodeSet;)Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"size()I\"/>\n\t\t<method name=\"span(Ljava/lang/CharSequence;ILandroid/icu/text/UnicodeSet$SpanCondition;)I\"/>\n\t\t<method name=\"span(Ljava/lang/CharSequence;Landroid/icu/text/UnicodeSet$SpanCondition;)I\"/>\n\t\t<method name=\"spanBack(Ljava/lang/CharSequence;ILandroid/icu/text/UnicodeSet$SpanCondition;)I\"/>\n\t\t<method name=\"spanBack(Ljava/lang/CharSequence;Landroid/icu/text/UnicodeSet$SpanCondition;)I\"/>\n\t\t<method name=\"strings()Ljava/util/Collection;\"/>\n\t\t<field name=\"ADD_CASE_MAPPINGS\"/>\n\t\t<field name=\"ALL_CODE_POINTS\"/>\n\t\t<field name=\"CASE\"/>\n\t\t<field name=\"CASE_INSENSITIVE\"/>\n\t\t<field name=\"EMPTY\"/>\n\t\t<field name=\"IGNORE_SPACE\"/>\n\t\t<field name=\"MAX_VALUE\"/>\n\t\t<field name=\"MIN_VALUE\"/>\n\t</class>\n\t<class name=\"android/icu/text/UnicodeSet$ComparisonStyle\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/UnicodeSet$ComparisonStyle;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/UnicodeSet$ComparisonStyle;\"/>\n\t\t<field name=\"LEXICOGRAPHIC\"/>\n\t\t<field name=\"LONGER_FIRST\"/>\n\t\t<field name=\"SHORTER_FIRST\"/>\n\t</class>\n\t<class name=\"android/icu/text/UnicodeSet$EntryRange\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"codepoint\"/>\n\t\t<field name=\"codepointEnd\"/>\n\t</class>\n\t<class name=\"android/icu/text/UnicodeSet$SpanCondition\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/UnicodeSet$SpanCondition;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/UnicodeSet$SpanCondition;\"/>\n\t\t<field name=\"CONDITION_COUNT\"/>\n\t\t<field name=\"CONTAINED\"/>\n\t\t<field name=\"NOT_CONTAINED\"/>\n\t\t<field name=\"SIMPLE\"/>\n\t</class>\n\t<class name=\"android/icu/text/UnicodeSetIterator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/text/UnicodeSet;)V\"/>\n\t\t<method name=\"getString()Ljava/lang/String;\"/>\n\t\t<method name=\"next()Z\"/>\n\t\t<method name=\"nextRange()Z\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"reset(Landroid/icu/text/UnicodeSet;)V\"/>\n\t\t<field name=\"IS_STRING\"/>\n\t\t<field name=\"codepoint\"/>\n\t\t<field name=\"codepointEnd\"/>\n\t\t<field name=\"string\"/>\n\t</class>\n\t<class name=\"android/icu/text/UnicodeSetSpanner\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/text/UnicodeSet;)V\"/>\n\t\t<method name=\"countIn(Ljava/lang/CharSequence;)I\"/>\n\t\t<method name=\"countIn(Ljava/lang/CharSequence;Landroid/icu/text/UnicodeSetSpanner$CountMethod;)I\"/>\n\t\t<method name=\"countIn(Ljava/lang/CharSequence;Landroid/icu/text/UnicodeSetSpanner$CountMethod;Landroid/icu/text/UnicodeSet$SpanCondition;)I\"/>\n\t\t<method name=\"deleteFrom(Ljava/lang/CharSequence;)Ljava/lang/String;\"/>\n\t\t<method name=\"deleteFrom(Ljava/lang/CharSequence;Landroid/icu/text/UnicodeSet$SpanCondition;)Ljava/lang/String;\"/>\n\t\t<method name=\"getUnicodeSet()Landroid/icu/text/UnicodeSet;\"/>\n\t\t<method name=\"replaceFrom(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String;\"/>\n\t\t<method name=\"replaceFrom(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/icu/text/UnicodeSetSpanner$CountMethod;)Ljava/lang/String;\"/>\n\t\t<method name=\"replaceFrom(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/icu/text/UnicodeSetSpanner$CountMethod;Landroid/icu/text/UnicodeSet$SpanCondition;)Ljava/lang/String;\"/>\n\t\t<method name=\"trim(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"trim(Ljava/lang/CharSequence;Landroid/icu/text/UnicodeSetSpanner$TrimOption;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"trim(Ljava/lang/CharSequence;Landroid/icu/text/UnicodeSetSpanner$TrimOption;Landroid/icu/text/UnicodeSet$SpanCondition;)Ljava/lang/CharSequence;\"/>\n\t</class>\n\t<class name=\"android/icu/text/UnicodeSetSpanner$CountMethod\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/UnicodeSetSpanner$CountMethod;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/UnicodeSetSpanner$CountMethod;\"/>\n\t\t<field name=\"MIN_ELEMENTS\"/>\n\t\t<field name=\"WHOLE_SPAN\"/>\n\t</class>\n\t<class name=\"android/icu/text/UnicodeSetSpanner$TrimOption\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/text/UnicodeSetSpanner$TrimOption;\"/>\n\t\t<method name=\"values()[Landroid/icu/text/UnicodeSetSpanner$TrimOption;\"/>\n\t\t<field name=\"BOTH\"/>\n\t\t<field name=\"LEADING\"/>\n\t\t<field name=\"TRAILING\"/>\n\t</class>\n\t<class name=\"android/icu/util/BuddhistCalendar\" since=\"24\">\n\t\t<extends name=\"android/icu/util/GregorianCalendar\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"&lt;init>(IIIIII)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Date;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<field name=\"BE\"/>\n\t</class>\n\t<class name=\"android/icu/util/Calendar\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"add(II)V\"/>\n\t\t<method name=\"after(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"before(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"clear(I)V\"/>\n\t\t<method name=\"compareTo(Landroid/icu/util/Calendar;)I\"/>\n\t\t<method name=\"complete()V\"/>\n\t\t<method name=\"computeFields()V\"/>\n\t\t<method name=\"computeGregorianFields(I)V\"/>\n\t\t<method name=\"computeGregorianMonthStart(II)I\"/>\n\t\t<method name=\"computeJulianDay()I\"/>\n\t\t<method name=\"computeMillisInDay()I\" deprecated=\"26\"/>\n\t\t<method name=\"computeTime()V\"/>\n\t\t<method name=\"computeZoneOffset(JI)I\" deprecated=\"26\"/>\n\t\t<method name=\"fieldDifference(Ljava/util/Date;I)I\"/>\n\t\t<method name=\"fieldName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"floorDivide(II)I\"/>\n\t\t<method name=\"floorDivide(II[I)I\"/>\n\t\t<method name=\"floorDivide(JI[I)I\"/>\n\t\t<method name=\"floorDivide(JJ)J\"/>\n\t\t<method name=\"get(I)I\"/>\n\t\t<method name=\"getActualMaximum(I)I\"/>\n\t\t<method name=\"getActualMinimum(I)I\"/>\n\t\t<method name=\"getAvailableLocales()[Ljava/util/Locale;\"/>\n\t\t<method name=\"getDateTimeFormat(IILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getDateTimeFormat(IILjava/util/Locale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"getDisplayName(Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName(Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getFieldCount()I\"/>\n\t\t<method name=\"getFieldResolutionTable()[[[I\"/>\n\t\t<method name=\"getFirstDayOfWeek()I\"/>\n\t\t<method name=\"getGreatestMinimum(I)I\"/>\n\t\t<method name=\"getGregorianDayOfMonth()I\"/>\n\t\t<method name=\"getGregorianDayOfYear()I\"/>\n\t\t<method name=\"getGregorianMonth()I\"/>\n\t\t<method name=\"getGregorianYear()I\"/>\n\t\t<method name=\"getInstance()Landroid/icu/util/Calendar;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/TimeZone;)Landroid/icu/util/Calendar;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)Landroid/icu/util/Calendar;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/TimeZone;Ljava/util/Locale;)Landroid/icu/util/Calendar;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;)Landroid/icu/util/Calendar;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Landroid/icu/util/Calendar;\"/>\n\t\t<method name=\"getKeywordValuesForLocale(Ljava/lang/String;Landroid/icu/util/ULocale;Z)[Ljava/lang/String;\"/>\n\t\t<method name=\"getLeastMaximum(I)I\"/>\n\t\t<method name=\"getLimit(II)I\"/>\n\t\t<method name=\"getMaximum(I)I\"/>\n\t\t<method name=\"getMinimalDaysInFirstWeek()I\"/>\n\t\t<method name=\"getMinimum(I)I\"/>\n\t\t<method name=\"getRepeatedWallTimeOption()I\"/>\n\t\t<method name=\"getSkippedWallTimeOption()I\"/>\n\t\t<method name=\"getStamp(I)I\"/>\n\t\t<method name=\"getTime()Ljava/util/Date;\"/>\n\t\t<method name=\"getTimeInMillis()J\"/>\n\t\t<method name=\"getTimeZone()Landroid/icu/util/TimeZone;\"/>\n\t\t<method name=\"getType()Ljava/lang/String;\"/>\n\t\t<method name=\"getWeekData()Landroid/icu/util/Calendar$WeekData;\"/>\n\t\t<method name=\"getWeekDataForRegion(Ljava/lang/String;)Landroid/icu/util/Calendar$WeekData;\"/>\n\t\t<method name=\"gregorianMonthLength(II)I\"/>\n\t\t<method name=\"gregorianPreviousMonthLength(II)I\"/>\n\t\t<method name=\"handleComputeFields(I)V\"/>\n\t\t<method name=\"handleComputeJulianDay(I)I\"/>\n\t\t<method name=\"handleComputeMonthStart(IIZ)I\"/>\n\t\t<method name=\"handleCreateFields()[I\"/>\n\t\t<method name=\"handleGetDateFormat(Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"handleGetDateFormat(Ljava/lang/String;Ljava/lang/String;Ljava/util/Locale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"handleGetDateFormat(Ljava/lang/String;Ljava/util/Locale;)Landroid/icu/text/DateFormat;\"/>\n\t\t<method name=\"handleGetExtendedYear()I\"/>\n\t\t<method name=\"handleGetLimit(II)I\"/>\n\t\t<method name=\"handleGetMonthLength(II)I\"/>\n\t\t<method name=\"handleGetYearLength(I)I\"/>\n\t\t<method name=\"internalGet(I)I\"/>\n\t\t<method name=\"internalGet(II)I\"/>\n\t\t<method name=\"internalGetTimeInMillis()J\"/>\n\t\t<method name=\"internalSet(II)V\"/>\n\t\t<method name=\"isEquivalentTo(Landroid/icu/util/Calendar;)Z\"/>\n\t\t<method name=\"isGregorianLeapYear(I)Z\"/>\n\t\t<method name=\"isLenient()Z\"/>\n\t\t<method name=\"isSet(I)Z\"/>\n\t\t<method name=\"isWeekend()Z\"/>\n\t\t<method name=\"isWeekend(Ljava/util/Date;)Z\"/>\n\t\t<method name=\"julianDayToDayOfWeek(I)I\"/>\n\t\t<method name=\"julianDayToMillis(I)J\"/>\n\t\t<method name=\"millisToJulianDay(J)I\"/>\n\t\t<method name=\"newerField(II)I\"/>\n\t\t<method name=\"newestStamp(III)I\"/>\n\t\t<method name=\"pinField(I)V\"/>\n\t\t<method name=\"prepareGetActual(IZ)V\"/>\n\t\t<method name=\"resolveFields([[[I)I\"/>\n\t\t<method name=\"roll(II)V\"/>\n\t\t<method name=\"roll(IZ)V\"/>\n\t\t<method name=\"set(II)V\"/>\n\t\t<method name=\"set(III)V\"/>\n\t\t<method name=\"set(IIIII)V\"/>\n\t\t<method name=\"set(IIIIII)V\"/>\n\t\t<method name=\"setFirstDayOfWeek(I)V\"/>\n\t\t<method name=\"setLenient(Z)V\"/>\n\t\t<method name=\"setMinimalDaysInFirstWeek(I)V\"/>\n\t\t<method name=\"setRepeatedWallTimeOption(I)V\"/>\n\t\t<method name=\"setSkippedWallTimeOption(I)V\"/>\n\t\t<method name=\"setTime(Ljava/util/Date;)V\"/>\n\t\t<method name=\"setTimeInMillis(J)V\"/>\n\t\t<method name=\"setTimeZone(Landroid/icu/util/TimeZone;)V\"/>\n\t\t<method name=\"setWeekData(Landroid/icu/util/Calendar$WeekData;)Landroid/icu/util/Calendar;\"/>\n\t\t<method name=\"validateField(I)V\"/>\n\t\t<method name=\"validateField(III)V\"/>\n\t\t<method name=\"validateFields()V\"/>\n\t\t<method name=\"weekNumber(II)I\"/>\n\t\t<method name=\"weekNumber(III)I\"/>\n\t\t<field name=\"AM\"/>\n\t\t<field name=\"AM_PM\"/>\n\t\t<field name=\"APRIL\"/>\n\t\t<field name=\"AUGUST\"/>\n\t\t<field name=\"BASE_FIELD_COUNT\" deprecated=\"26\"/>\n\t\t<field name=\"DATE\"/>\n\t\t<field name=\"DAY_OF_MONTH\"/>\n\t\t<field name=\"DAY_OF_WEEK\"/>\n\t\t<field name=\"DAY_OF_WEEK_IN_MONTH\"/>\n\t\t<field name=\"DAY_OF_YEAR\"/>\n\t\t<field name=\"DECEMBER\"/>\n\t\t<field name=\"DOW_LOCAL\"/>\n\t\t<field name=\"DST_OFFSET\"/>\n\t\t<field name=\"EPOCH_JULIAN_DAY\"/>\n\t\t<field name=\"ERA\"/>\n\t\t<field name=\"EXTENDED_YEAR\"/>\n\t\t<field name=\"FEBRUARY\"/>\n\t\t<field name=\"FRIDAY\"/>\n\t\t<field name=\"GREATEST_MINIMUM\"/>\n\t\t<field name=\"HOUR\"/>\n\t\t<field name=\"HOUR_OF_DAY\"/>\n\t\t<field name=\"INTERNALLY_SET\"/>\n\t\t<field name=\"IS_LEAP_MONTH\"/>\n\t\t<field name=\"JANUARY\"/>\n\t\t<field name=\"JAN_1_1_JULIAN_DAY\"/>\n\t\t<field name=\"JULIAN_DAY\"/>\n\t\t<field name=\"JULY\"/>\n\t\t<field name=\"JUNE\"/>\n\t\t<field name=\"LEAST_MAXIMUM\"/>\n\t\t<field name=\"MARCH\"/>\n\t\t<field name=\"MAXIMUM\"/>\n\t\t<field name=\"MAX_DATE\"/>\n\t\t<field name=\"MAX_FIELD_COUNT\" deprecated=\"26\"/>\n\t\t<field name=\"MAX_JULIAN\"/>\n\t\t<field name=\"MAX_MILLIS\"/>\n\t\t<field name=\"MAY\"/>\n\t\t<field name=\"MILLISECOND\"/>\n\t\t<field name=\"MILLISECONDS_IN_DAY\"/>\n\t\t<field name=\"MINIMUM\"/>\n\t\t<field name=\"MINIMUM_USER_STAMP\"/>\n\t\t<field name=\"MINUTE\"/>\n\t\t<field name=\"MIN_DATE\"/>\n\t\t<field name=\"MIN_JULIAN\"/>\n\t\t<field name=\"MIN_MILLIS\"/>\n\t\t<field name=\"MONDAY\"/>\n\t\t<field name=\"MONTH\"/>\n\t\t<field name=\"NOVEMBER\"/>\n\t\t<field name=\"OCTOBER\"/>\n\t\t<field name=\"ONE_DAY\"/>\n\t\t<field name=\"ONE_HOUR\"/>\n\t\t<field name=\"ONE_MINUTE\"/>\n\t\t<field name=\"ONE_SECOND\"/>\n\t\t<field name=\"ONE_WEEK\"/>\n\t\t<field name=\"PM\"/>\n\t\t<field name=\"RESOLVE_REMAP\"/>\n\t\t<field name=\"SATURDAY\"/>\n\t\t<field name=\"SECOND\"/>\n\t\t<field name=\"SEPTEMBER\"/>\n\t\t<field name=\"SUNDAY\"/>\n\t\t<field name=\"THURSDAY\"/>\n\t\t<field name=\"TUESDAY\"/>\n\t\t<field name=\"UNDECIMBER\"/>\n\t\t<field name=\"UNSET\"/>\n\t\t<field name=\"WALLTIME_FIRST\"/>\n\t\t<field name=\"WALLTIME_LAST\"/>\n\t\t<field name=\"WALLTIME_NEXT_VALID\"/>\n\t\t<field name=\"WEDNESDAY\"/>\n\t\t<field name=\"WEEK_OF_MONTH\"/>\n\t\t<field name=\"WEEK_OF_YEAR\"/>\n\t\t<field name=\"YEAR\"/>\n\t\t<field name=\"YEAR_WOY\"/>\n\t\t<field name=\"ZONE_OFFSET\"/>\n\t</class>\n\t<class name=\"android/icu/util/Calendar$WeekData\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(IIIIII)V\"/>\n\t\t<field name=\"firstDayOfWeek\"/>\n\t\t<field name=\"minimalDaysInFirstWeek\"/>\n\t\t<field name=\"weekendCease\"/>\n\t\t<field name=\"weekendCeaseMillis\"/>\n\t\t<field name=\"weekendOnset\"/>\n\t\t<field name=\"weekendOnsetMillis\"/>\n\t</class>\n\t<class name=\"android/icu/util/ChineseCalendar\" since=\"24\">\n\t\t<extends name=\"android/icu/util/Calendar\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(IIII)V\"/>\n\t\t<method name=\"&lt;init>(IIIII)V\"/>\n\t\t<method name=\"&lt;init>(IIIIIII)V\"/>\n\t\t<method name=\"&lt;init>(IIIIIIII)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Date;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"handleGetDateFormat(Ljava/lang/String;Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;\"/>\n\t</class>\n\t<class name=\"android/icu/util/CopticCalendar\" since=\"24\">\n\t\t<extends name=\"android/icu/util/Calendar\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"&lt;init>(IIIIII)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Date;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<field name=\"AMSHIR\"/>\n\t\t<field name=\"BABA\"/>\n\t\t<field name=\"BARAMHAT\"/>\n\t\t<field name=\"BARAMOUDA\"/>\n\t\t<field name=\"BASHANS\"/>\n\t\t<field name=\"EPEP\"/>\n\t\t<field name=\"HATOR\"/>\n\t\t<field name=\"KIAHK\"/>\n\t\t<field name=\"MESRA\"/>\n\t\t<field name=\"NASIE\"/>\n\t\t<field name=\"PAONA\"/>\n\t\t<field name=\"TOBA\"/>\n\t\t<field name=\"TOUT\"/>\n\t</class>\n\t<class name=\"android/icu/util/Currency\" since=\"24\">\n\t\t<extends name=\"android/icu/util/MeasureUnit\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"fromJavaCurrency(Ljava/util/Currency;)Landroid/icu/util/Currency;\" since=\"29\"/>\n\t\t<method name=\"getAvailableCurrencies()Ljava/util/Set;\"/>\n\t\t<method name=\"getAvailableCurrencyCodes(Landroid/icu/util/ULocale;Ljava/util/Date;)[Ljava/lang/String;\"/>\n\t\t<method name=\"getAvailableCurrencyCodes(Ljava/util/Locale;Ljava/util/Date;)[Ljava/lang/String;\"/>\n\t\t<method name=\"getAvailableLocales()[Ljava/util/Locale;\"/>\n\t\t<method name=\"getAvailableULocales()[Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"getCurrencyCode()Ljava/lang/String;\"/>\n\t\t<method name=\"getDefaultFractionDigits()I\"/>\n\t\t<method name=\"getDefaultFractionDigits(Landroid/icu/util/Currency$CurrencyUsage;)I\"/>\n\t\t<method name=\"getDisplayName()Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName(Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;)Landroid/icu/util/Currency;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Landroid/icu/util/Currency;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Landroid/icu/util/Currency;\"/>\n\t\t<method name=\"getKeywordValuesForLocale(Ljava/lang/String;Landroid/icu/util/ULocale;Z)[Ljava/lang/String;\"/>\n\t\t<method name=\"getName(Landroid/icu/util/ULocale;ILjava/lang/String;[Z)Ljava/lang/String;\"/>\n\t\t<method name=\"getName(Landroid/icu/util/ULocale;I[Z)Ljava/lang/String;\"/>\n\t\t<method name=\"getName(Ljava/util/Locale;ILjava/lang/String;[Z)Ljava/lang/String;\"/>\n\t\t<method name=\"getName(Ljava/util/Locale;I[Z)Ljava/lang/String;\"/>\n\t\t<method name=\"getNumericCode()I\"/>\n\t\t<method name=\"getRoundingIncrement()D\"/>\n\t\t<method name=\"getRoundingIncrement(Landroid/icu/util/Currency$CurrencyUsage;)D\"/>\n\t\t<method name=\"getSymbol()Ljava/lang/String;\"/>\n\t\t<method name=\"getSymbol(Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getSymbol(Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"isAvailable(Ljava/lang/String;Ljava/util/Date;Ljava/util/Date;)Z\"/>\n\t\t<method name=\"toJavaCurrency()Ljava/util/Currency;\" since=\"29\"/>\n\t\t<field name=\"LONG_NAME\"/>\n\t\t<field name=\"NARROW_SYMBOL_NAME\" since=\"30\"/>\n\t\t<field name=\"PLURAL_LONG_NAME\"/>\n\t\t<field name=\"SYMBOL_NAME\"/>\n\t</class>\n\t<class name=\"android/icu/util/Currency$CurrencyUsage\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/util/Currency$CurrencyUsage;\"/>\n\t\t<method name=\"values()[Landroid/icu/util/Currency$CurrencyUsage;\"/>\n\t\t<field name=\"CASH\"/>\n\t\t<field name=\"STANDARD\"/>\n\t</class>\n\t<class name=\"android/icu/util/CurrencyAmount\" since=\"24\">\n\t\t<extends name=\"android/icu/util/Measure\"/>\n\t\t<method name=\"&lt;init>(DLandroid/icu/util/Currency;)V\"/>\n\t\t<method name=\"&lt;init>(DLjava/util/Currency;)V\" since=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Number;Landroid/icu/util/Currency;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Number;Ljava/util/Currency;)V\" since=\"29\"/>\n\t\t<method name=\"getCurrency()Landroid/icu/util/Currency;\"/>\n\t</class>\n\t<class name=\"android/icu/util/DateInterval\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(JJ)V\"/>\n\t\t<method name=\"getFromDate()J\"/>\n\t\t<method name=\"getToDate()J\"/>\n\t</class>\n\t<class name=\"android/icu/util/EthiopicCalendar\" since=\"26\">\n\t\t<extends name=\"android/icu/util/Calendar\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"&lt;init>(IIIIII)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Date;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"isAmeteAlemEra()Z\"/>\n\t\t<method name=\"setAmeteAlemEra(Z)V\"/>\n\t\t<field name=\"GENBOT\"/>\n\t\t<field name=\"HAMLE\"/>\n\t\t<field name=\"HEDAR\"/>\n\t\t<field name=\"MEGABIT\"/>\n\t\t<field name=\"MESKEREM\"/>\n\t\t<field name=\"MIAZIA\"/>\n\t\t<field name=\"NEHASSE\"/>\n\t\t<field name=\"PAGUMEN\"/>\n\t\t<field name=\"SENE\"/>\n\t\t<field name=\"TAHSAS\"/>\n\t\t<field name=\"TEKEMT\"/>\n\t\t<field name=\"TER\"/>\n\t\t<field name=\"YEKATIT\"/>\n\t</class>\n\t<class name=\"android/icu/util/Freezable\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"cloneAsThawed()Ljava/lang/Object;\"/>\n\t\t<method name=\"freeze()Ljava/lang/Object;\"/>\n\t\t<method name=\"isFrozen()Z\"/>\n\t</class>\n\t<class name=\"android/icu/util/GregorianCalendar\" since=\"24\">\n\t\t<extends name=\"android/icu/util/Calendar\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"&lt;init>(IIIII)V\"/>\n\t\t<method name=\"&lt;init>(IIIIII)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"getGregorianChange()Ljava/util/Date;\"/>\n\t\t<method name=\"isLeapYear(I)Z\"/>\n\t\t<method name=\"setGregorianChange(Ljava/util/Date;)V\"/>\n\t\t<field name=\"AD\"/>\n\t\t<field name=\"BC\"/>\n\t\t<field name=\"invertGregorian\"/>\n\t\t<field name=\"isGregorian\"/>\n\t</class>\n\t<class name=\"android/icu/util/HebrewCalendar\" since=\"24\">\n\t\t<extends name=\"android/icu/util/Calendar\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"&lt;init>(IIIIII)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Date;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<field name=\"ADAR\"/>\n\t\t<field name=\"ADAR_1\"/>\n\t\t<field name=\"AV\"/>\n\t\t<field name=\"ELUL\"/>\n\t\t<field name=\"HESHVAN\"/>\n\t\t<field name=\"IYAR\"/>\n\t\t<field name=\"KISLEV\"/>\n\t\t<field name=\"NISAN\"/>\n\t\t<field name=\"SHEVAT\"/>\n\t\t<field name=\"SIVAN\"/>\n\t\t<field name=\"TAMUZ\"/>\n\t\t<field name=\"TEVET\"/>\n\t\t<field name=\"TISHRI\"/>\n\t</class>\n\t<class name=\"android/icu/util/ICUUncheckedIOException\" since=\"24\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/icu/util/IllformedLocaleException\" since=\"28\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"getErrorIndex()I\"/>\n\t</class>\n\t<class name=\"android/icu/util/IndianCalendar\" since=\"24\">\n\t\t<extends name=\"android/icu/util/Calendar\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"&lt;init>(IIIIII)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Date;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<field name=\"AGRAHAYANA\"/>\n\t\t<field name=\"ASADHA\"/>\n\t\t<field name=\"ASVINA\"/>\n\t\t<field name=\"BHADRA\"/>\n\t\t<field name=\"CHAITRA\"/>\n\t\t<field name=\"IE\"/>\n\t\t<field name=\"JYAISTHA\"/>\n\t\t<field name=\"KARTIKA\"/>\n\t\t<field name=\"MAGHA\"/>\n\t\t<field name=\"PAUSA\"/>\n\t\t<field name=\"PHALGUNA\"/>\n\t\t<field name=\"SRAVANA\"/>\n\t\t<field name=\"VAISAKHA\"/>\n\t</class>\n\t<class name=\"android/icu/util/IslamicCalendar\" since=\"24\">\n\t\t<extends name=\"android/icu/util/Calendar\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"&lt;init>(IIIIII)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Date;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"getCalculationType()Landroid/icu/util/IslamicCalendar$CalculationType;\"/>\n\t\t<method name=\"setCalculationType(Landroid/icu/util/IslamicCalendar$CalculationType;)V\"/>\n\t\t<field name=\"DHU_AL_HIJJAH\"/>\n\t\t<field name=\"DHU_AL_QIDAH\"/>\n\t\t<field name=\"JUMADA_1\"/>\n\t\t<field name=\"JUMADA_2\"/>\n\t\t<field name=\"MUHARRAM\"/>\n\t\t<field name=\"RABI_1\"/>\n\t\t<field name=\"RABI_2\"/>\n\t\t<field name=\"RAJAB\"/>\n\t\t<field name=\"RAMADAN\"/>\n\t\t<field name=\"SAFAR\"/>\n\t\t<field name=\"SHABAN\"/>\n\t\t<field name=\"SHAWWAL\"/>\n\t</class>\n\t<class name=\"android/icu/util/IslamicCalendar$CalculationType\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/util/IslamicCalendar$CalculationType;\"/>\n\t\t<method name=\"values()[Landroid/icu/util/IslamicCalendar$CalculationType;\"/>\n\t\t<field name=\"ISLAMIC\"/>\n\t\t<field name=\"ISLAMIC_CIVIL\"/>\n\t\t<field name=\"ISLAMIC_TBLA\"/>\n\t\t<field name=\"ISLAMIC_UMALQURA\"/>\n\t</class>\n\t<class name=\"android/icu/util/JapaneseCalendar\" since=\"24\">\n\t\t<extends name=\"android/icu/util/GregorianCalendar\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"&lt;init>(IIII)V\"/>\n\t\t<method name=\"&lt;init>(IIIIII)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Date;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<field name=\"CURRENT_ERA\" deprecated=\"29\" removed=\"30\"/>\n\t\t<field name=\"HEISEI\"/>\n\t\t<field name=\"MEIJI\"/>\n\t\t<field name=\"REIWA\" since=\"30\"/>\n\t\t<field name=\"SHOWA\"/>\n\t\t<field name=\"TAISHO\"/>\n\t</class>\n\t<class name=\"android/icu/util/LocaleData\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getCLDRVersion()Landroid/icu/util/VersionInfo;\"/>\n\t\t<method name=\"getDelimiter(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance()Landroid/icu/util/LocaleData;\"/>\n\t\t<method name=\"getInstance(Landroid/icu/util/ULocale;)Landroid/icu/util/LocaleData;\"/>\n\t\t<method name=\"getMeasurementSystem(Landroid/icu/util/ULocale;)Landroid/icu/util/LocaleData$MeasurementSystem;\"/>\n\t\t<method name=\"getNoSubstitute()Z\"/>\n\t\t<method name=\"getPaperSize(Landroid/icu/util/ULocale;)Landroid/icu/util/LocaleData$PaperSize;\"/>\n\t\t<method name=\"setNoSubstitute(Z)V\"/>\n\t\t<field name=\"ALT_QUOTATION_END\"/>\n\t\t<field name=\"ALT_QUOTATION_START\"/>\n\t\t<field name=\"QUOTATION_END\"/>\n\t\t<field name=\"QUOTATION_START\"/>\n\t</class>\n\t<class name=\"android/icu/util/LocaleData$MeasurementSystem\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"SI\"/>\n\t\t<field name=\"UK\"/>\n\t\t<field name=\"US\"/>\n\t</class>\n\t<class name=\"android/icu/util/LocaleData$PaperSize\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t</class>\n\t<class name=\"android/icu/util/Measure\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Number;Landroid/icu/util/MeasureUnit;)V\"/>\n\t\t<method name=\"getNumber()Ljava/lang/Number;\"/>\n\t\t<method name=\"getUnit()Landroid/icu/util/MeasureUnit;\"/>\n\t</class>\n\t<class name=\"android/icu/util/MeasureUnit\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"getAvailable()Ljava/util/Set;\"/>\n\t\t<method name=\"getAvailable(Ljava/lang/String;)Ljava/util/Set;\"/>\n\t\t<method name=\"getAvailableTypes()Ljava/util/Set;\"/>\n\t\t<method name=\"getSubtype()Ljava/lang/String;\"/>\n\t\t<method name=\"getType()Ljava/lang/String;\"/>\n\t\t<field name=\"ACRE\"/>\n\t\t<field name=\"ACRE_FOOT\"/>\n\t\t<field name=\"AMPERE\"/>\n\t\t<field name=\"ARC_MINUTE\"/>\n\t\t<field name=\"ARC_SECOND\"/>\n\t\t<field name=\"ASTRONOMICAL_UNIT\"/>\n\t\t<field name=\"ATMOSPHERE\" since=\"30\"/>\n\t\t<field name=\"BIT\"/>\n\t\t<field name=\"BUSHEL\"/>\n\t\t<field name=\"BYTE\"/>\n\t\t<field name=\"CALORIE\"/>\n\t\t<field name=\"CARAT\"/>\n\t\t<field name=\"CELSIUS\"/>\n\t\t<field name=\"CENTILITER\"/>\n\t\t<field name=\"CENTIMETER\"/>\n\t\t<field name=\"CENTURY\" since=\"26\"/>\n\t\t<field name=\"CUBIC_CENTIMETER\"/>\n\t\t<field name=\"CUBIC_FOOT\"/>\n\t\t<field name=\"CUBIC_INCH\"/>\n\t\t<field name=\"CUBIC_KILOMETER\"/>\n\t\t<field name=\"CUBIC_METER\"/>\n\t\t<field name=\"CUBIC_MILE\"/>\n\t\t<field name=\"CUBIC_YARD\"/>\n\t\t<field name=\"CUP\"/>\n\t\t<field name=\"CUP_METRIC\" since=\"26\"/>\n\t\t<field name=\"DAY\"/>\n\t\t<field name=\"DECILITER\"/>\n\t\t<field name=\"DECIMETER\"/>\n\t\t<field name=\"DEGREE\"/>\n\t\t<field name=\"FAHRENHEIT\"/>\n\t\t<field name=\"FATHOM\"/>\n\t\t<field name=\"FLUID_OUNCE\"/>\n\t\t<field name=\"FOODCALORIE\"/>\n\t\t<field name=\"FOOT\"/>\n\t\t<field name=\"FURLONG\"/>\n\t\t<field name=\"GALLON\"/>\n\t\t<field name=\"GALLON_IMPERIAL\" since=\"28\"/>\n\t\t<field name=\"GENERIC_TEMPERATURE\" since=\"26\"/>\n\t\t<field name=\"GIGABIT\"/>\n\t\t<field name=\"GIGABYTE\"/>\n\t\t<field name=\"GIGAHERTZ\"/>\n\t\t<field name=\"GIGAWATT\"/>\n\t\t<field name=\"GRAM\"/>\n\t\t<field name=\"G_FORCE\"/>\n\t\t<field name=\"HECTARE\"/>\n\t\t<field name=\"HECTOLITER\"/>\n\t\t<field name=\"HECTOPASCAL\"/>\n\t\t<field name=\"HERTZ\"/>\n\t\t<field name=\"HORSEPOWER\"/>\n\t\t<field name=\"HOUR\"/>\n\t\t<field name=\"INCH\"/>\n\t\t<field name=\"INCH_HG\"/>\n\t\t<field name=\"JOULE\"/>\n\t\t<field name=\"KARAT\"/>\n\t\t<field name=\"KELVIN\"/>\n\t\t<field name=\"KILOBIT\"/>\n\t\t<field name=\"KILOBYTE\"/>\n\t\t<field name=\"KILOCALORIE\"/>\n\t\t<field name=\"KILOGRAM\"/>\n\t\t<field name=\"KILOHERTZ\"/>\n\t\t<field name=\"KILOJOULE\"/>\n\t\t<field name=\"KILOMETER\"/>\n\t\t<field name=\"KILOMETER_PER_HOUR\"/>\n\t\t<field name=\"KILOWATT\"/>\n\t\t<field name=\"KILOWATT_HOUR\"/>\n\t\t<field name=\"KNOT\" since=\"26\"/>\n\t\t<field name=\"LIGHT_YEAR\"/>\n\t\t<field name=\"LITER\"/>\n\t\t<field name=\"LITER_PER_100KILOMETERS\" since=\"26\"/>\n\t\t<field name=\"LITER_PER_KILOMETER\"/>\n\t\t<field name=\"LUX\"/>\n\t\t<field name=\"MEGABIT\"/>\n\t\t<field name=\"MEGABYTE\"/>\n\t\t<field name=\"MEGAHERTZ\"/>\n\t\t<field name=\"MEGALITER\"/>\n\t\t<field name=\"MEGAWATT\"/>\n\t\t<field name=\"METER\"/>\n\t\t<field name=\"METER_PER_SECOND\"/>\n\t\t<field name=\"METER_PER_SECOND_SQUARED\"/>\n\t\t<field name=\"METRIC_TON\"/>\n\t\t<field name=\"MICROGRAM\"/>\n\t\t<field name=\"MICROMETER\"/>\n\t\t<field name=\"MICROSECOND\"/>\n\t\t<field name=\"MILE\"/>\n\t\t<field name=\"MILE_PER_GALLON\"/>\n\t\t<field name=\"MILE_PER_GALLON_IMPERIAL\" since=\"28\"/>\n\t\t<field name=\"MILE_PER_HOUR\"/>\n\t\t<field name=\"MILE_SCANDINAVIAN\" since=\"26\"/>\n\t\t<field name=\"MILLIAMPERE\"/>\n\t\t<field name=\"MILLIBAR\"/>\n\t\t<field name=\"MILLIGRAM\"/>\n\t\t<field name=\"MILLIGRAM_PER_DECILITER\" since=\"28\"/>\n\t\t<field name=\"MILLILITER\"/>\n\t\t<field name=\"MILLIMETER\"/>\n\t\t<field name=\"MILLIMETER_OF_MERCURY\"/>\n\t\t<field name=\"MILLIMOLE_PER_LITER\" since=\"28\"/>\n\t\t<field name=\"MILLISECOND\"/>\n\t\t<field name=\"MILLIWATT\"/>\n\t\t<field name=\"MINUTE\"/>\n\t\t<field name=\"MONTH\"/>\n\t\t<field name=\"NANOMETER\"/>\n\t\t<field name=\"NANOSECOND\"/>\n\t\t<field name=\"NAUTICAL_MILE\"/>\n\t\t<field name=\"OHM\"/>\n\t\t<field name=\"OUNCE\"/>\n\t\t<field name=\"OUNCE_TROY\"/>\n\t\t<field name=\"PARSEC\"/>\n\t\t<field name=\"PART_PER_MILLION\" since=\"28\"/>\n\t\t<field name=\"PERCENT\" since=\"30\"/>\n\t\t<field name=\"PERMILLE\" since=\"30\"/>\n\t\t<field name=\"PETABYTE\" since=\"30\"/>\n\t\t<field name=\"PICOMETER\"/>\n\t\t<field name=\"PINT\"/>\n\t\t<field name=\"PINT_METRIC\" since=\"26\"/>\n\t\t<field name=\"POINT\" since=\"29\"/>\n\t\t<field name=\"POUND\"/>\n\t\t<field name=\"POUND_PER_SQUARE_INCH\"/>\n\t\t<field name=\"QUART\"/>\n\t\t<field name=\"RADIAN\"/>\n\t\t<field name=\"REVOLUTION_ANGLE\" since=\"26\"/>\n\t\t<field name=\"SECOND\"/>\n\t\t<field name=\"SQUARE_CENTIMETER\"/>\n\t\t<field name=\"SQUARE_FOOT\"/>\n\t\t<field name=\"SQUARE_INCH\"/>\n\t\t<field name=\"SQUARE_KILOMETER\"/>\n\t\t<field name=\"SQUARE_METER\"/>\n\t\t<field name=\"SQUARE_MILE\"/>\n\t\t<field name=\"SQUARE_YARD\"/>\n\t\t<field name=\"STONE\"/>\n\t\t<field name=\"TABLESPOON\"/>\n\t\t<field name=\"TEASPOON\"/>\n\t\t<field name=\"TERABIT\"/>\n\t\t<field name=\"TERABYTE\"/>\n\t\t<field name=\"TON\"/>\n\t\t<field name=\"VOLT\"/>\n\t\t<field name=\"WATT\"/>\n\t\t<field name=\"WEEK\"/>\n\t\t<field name=\"YARD\"/>\n\t\t<field name=\"YEAR\"/>\n\t</class>\n\t<class name=\"android/icu/util/Output\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;)V\"/>\n\t\t<field name=\"value\"/>\n\t</class>\n\t<class name=\"android/icu/util/RangeValueIterator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"next(Landroid/icu/util/RangeValueIterator$Element;)Z\"/>\n\t\t<method name=\"reset()V\"/>\n\t</class>\n\t<class name=\"android/icu/util/RangeValueIterator$Element\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"limit\"/>\n\t\t<field name=\"start\"/>\n\t\t<field name=\"value\"/>\n\t</class>\n\t<class name=\"android/icu/util/TaiwanCalendar\" since=\"24\">\n\t\t<extends name=\"android/icu/util/GregorianCalendar\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"&lt;init>(IIIIII)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/util/ULocale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Date;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<field name=\"BEFORE_MINGUO\"/>\n\t\t<field name=\"MINGUO\"/>\n\t</class>\n\t<class name=\"android/icu/util/TimeUnit\" since=\"24\">\n\t\t<extends name=\"android/icu/util/MeasureUnit\"/>\n\t\t<method name=\"values()[Landroid/icu/util/TimeUnit;\"/>\n\t</class>\n\t<class name=\"android/icu/util/TimeZone\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/icu/util/Freezable\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"cloneAsThawed()Landroid/icu/util/TimeZone;\"/>\n\t\t<method name=\"countEquivalentIDs(Ljava/lang/String;)I\"/>\n\t\t<method name=\"freeze()Landroid/icu/util/TimeZone;\"/>\n\t\t<method name=\"getAvailableIDs()[Ljava/lang/String;\"/>\n\t\t<method name=\"getAvailableIDs(I)[Ljava/lang/String;\"/>\n\t\t<method name=\"getAvailableIDs(Landroid/icu/util/TimeZone$SystemTimeZoneType;Ljava/lang/String;Ljava/lang/Integer;)Ljava/util/Set;\"/>\n\t\t<method name=\"getAvailableIDs(Ljava/lang/String;)[Ljava/lang/String;\"/>\n\t\t<method name=\"getCanonicalID(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getCanonicalID(Ljava/lang/String;[Z)Ljava/lang/String;\"/>\n\t\t<method name=\"getDSTSavings()I\"/>\n\t\t<method name=\"getDefault()Landroid/icu/util/TimeZone;\"/>\n\t\t<method name=\"getDisplayName()Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName(Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName(Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName(ZI)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName(ZILandroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName(ZILjava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getEquivalentID(Ljava/lang/String;I)Ljava/lang/String;\"/>\n\t\t<method name=\"getFrozenTimeZone(Ljava/lang/String;)Landroid/icu/util/TimeZone;\"/>\n\t\t<method name=\"getID()Ljava/lang/String;\"/>\n\t\t<method name=\"getIDForWindowsID(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getOffset(IIIIII)I\"/>\n\t\t<method name=\"getOffset(J)I\"/>\n\t\t<method name=\"getOffset(JZ[I)V\"/>\n\t\t<method name=\"getRawOffset()I\"/>\n\t\t<method name=\"getRegion(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getTZDataVersion()Ljava/lang/String;\"/>\n\t\t<method name=\"getTimeZone(Ljava/lang/String;)Landroid/icu/util/TimeZone;\"/>\n\t\t<method name=\"getTimeZone(Ljava/lang/String;I)Landroid/icu/util/TimeZone;\"/>\n\t\t<method name=\"getWindowsID(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"hasSameRules(Landroid/icu/util/TimeZone;)Z\"/>\n\t\t<method name=\"inDaylightTime(Ljava/util/Date;)Z\"/>\n\t\t<method name=\"observesDaylightTime()Z\"/>\n\t\t<method name=\"setID(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setRawOffset(I)V\"/>\n\t\t<method name=\"useDaylightTime()Z\"/>\n\t\t<field name=\"GENERIC_LOCATION\"/>\n\t\t<field name=\"GMT_ZONE\"/>\n\t\t<field name=\"LONG\"/>\n\t\t<field name=\"LONG_GENERIC\"/>\n\t\t<field name=\"LONG_GMT\"/>\n\t\t<field name=\"SHORT\"/>\n\t\t<field name=\"SHORT_COMMONLY_USED\"/>\n\t\t<field name=\"SHORT_GENERIC\"/>\n\t\t<field name=\"SHORT_GMT\"/>\n\t\t<field name=\"TIMEZONE_ICU\" since=\"26\"/>\n\t\t<field name=\"TIMEZONE_JDK\" since=\"26\"/>\n\t\t<field name=\"UNKNOWN_ZONE\"/>\n\t\t<field name=\"UNKNOWN_ZONE_ID\"/>\n\t</class>\n\t<class name=\"android/icu/util/TimeZone$SystemTimeZoneType\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/util/TimeZone$SystemTimeZoneType;\"/>\n\t\t<method name=\"values()[Landroid/icu/util/TimeZone$SystemTimeZoneType;\"/>\n\t\t<field name=\"ANY\" since=\"28\"/>\n\t\t<field name=\"CANONICAL\" since=\"28\"/>\n\t\t<field name=\"CANONICAL_LOCATION\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/icu/util/ULocale\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"acceptLanguage(Ljava/lang/String;[Landroid/icu/util/ULocale;[Z)Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"acceptLanguage(Ljava/lang/String;[Z)Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"acceptLanguage([Landroid/icu/util/ULocale;[Landroid/icu/util/ULocale;[Z)Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"acceptLanguage([Landroid/icu/util/ULocale;[Z)Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"addLikelySubtags(Landroid/icu/util/ULocale;)Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"canonicalize(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"compareTo(Landroid/icu/util/ULocale;)I\"/>\n\t\t<method name=\"createCanonical(Ljava/lang/String;)Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"forLanguageTag(Ljava/lang/String;)Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"forLocale(Ljava/util/Locale;)Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"getAvailableLocales()[Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"getBaseName()Ljava/lang/String;\"/>\n\t\t<method name=\"getBaseName(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getCharacterOrientation()Ljava/lang/String;\"/>\n\t\t<method name=\"getCountry()Ljava/lang/String;\"/>\n\t\t<method name=\"getCountry(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDefault()Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"getDefault(Landroid/icu/util/ULocale$Category;)Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"getDisplayCountry()Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayCountry(Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayCountry(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayCountry(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayKeyword(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayKeyword(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayKeyword(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayKeywordValue(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayKeywordValue(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayKeywordValue(Ljava/lang/String;Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayKeywordValue(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayLanguage()Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayLanguage(Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayLanguage(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayLanguage(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayLanguageWithDialect()Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayLanguageWithDialect(Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayLanguageWithDialect(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayLanguageWithDialect(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName()Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName(Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayNameWithDialect()Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayNameWithDialect(Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayNameWithDialect(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayNameWithDialect(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayScript()Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayScript(Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayScript(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayScript(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayVariant()Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayVariant(Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayVariant(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayVariant(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getExtension(C)Ljava/lang/String;\"/>\n\t\t<method name=\"getExtensionKeys()Ljava/util/Set;\"/>\n\t\t<method name=\"getFallback()Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"getFallback(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getISO3Country()Ljava/lang/String;\"/>\n\t\t<method name=\"getISO3Country(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getISO3Language()Ljava/lang/String;\"/>\n\t\t<method name=\"getISO3Language(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getISOCountries()[Ljava/lang/String;\"/>\n\t\t<method name=\"getISOLanguages()[Ljava/lang/String;\"/>\n\t\t<method name=\"getKeywordValue(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getKeywordValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getKeywords()Ljava/util/Iterator;\"/>\n\t\t<method name=\"getKeywords(Ljava/lang/String;)Ljava/util/Iterator;\"/>\n\t\t<method name=\"getLanguage()Ljava/lang/String;\"/>\n\t\t<method name=\"getLanguage(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getLineOrientation()Ljava/lang/String;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getName(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getScript()Ljava/lang/String;\"/>\n\t\t<method name=\"getScript(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getUnicodeLocaleAttributes()Ljava/util/Set;\"/>\n\t\t<method name=\"getUnicodeLocaleKeys()Ljava/util/Set;\"/>\n\t\t<method name=\"getUnicodeLocaleType(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getVariant()Ljava/lang/String;\"/>\n\t\t<method name=\"getVariant(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"isRightToLeft()Z\"/>\n\t\t<method name=\"minimizeSubtags(Landroid/icu/util/ULocale;)Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"setKeywordValue(Ljava/lang/String;Ljava/lang/String;)Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"setKeywordValue(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"toLanguageTag()Ljava/lang/String;\"/>\n\t\t<method name=\"toLegacyKey(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"toLegacyType(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"toLocale()Ljava/util/Locale;\"/>\n\t\t<method name=\"toUnicodeLocaleKey(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"toUnicodeLocaleType(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<field name=\"CANADA\"/>\n\t\t<field name=\"CANADA_FRENCH\"/>\n\t\t<field name=\"CHINA\"/>\n\t\t<field name=\"CHINESE\"/>\n\t\t<field name=\"ENGLISH\"/>\n\t\t<field name=\"FRANCE\"/>\n\t\t<field name=\"FRENCH\"/>\n\t\t<field name=\"GERMAN\"/>\n\t\t<field name=\"GERMANY\"/>\n\t\t<field name=\"ITALIAN\"/>\n\t\t<field name=\"ITALY\"/>\n\t\t<field name=\"JAPAN\"/>\n\t\t<field name=\"JAPANESE\"/>\n\t\t<field name=\"KOREA\"/>\n\t\t<field name=\"KOREAN\"/>\n\t\t<field name=\"PRC\"/>\n\t\t<field name=\"PRIVATE_USE_EXTENSION\"/>\n\t\t<field name=\"ROOT\"/>\n\t\t<field name=\"SIMPLIFIED_CHINESE\"/>\n\t\t<field name=\"TAIWAN\"/>\n\t\t<field name=\"TRADITIONAL_CHINESE\"/>\n\t\t<field name=\"UK\"/>\n\t\t<field name=\"UNICODE_LOCALE_EXTENSION\"/>\n\t\t<field name=\"US\"/>\n\t</class>\n\t<class name=\"android/icu/util/ULocale$Builder\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addUnicodeLocaleAttribute(Ljava/lang/String;)Landroid/icu/util/ULocale$Builder;\"/>\n\t\t<method name=\"build()Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"clear()Landroid/icu/util/ULocale$Builder;\"/>\n\t\t<method name=\"clearExtensions()Landroid/icu/util/ULocale$Builder;\"/>\n\t\t<method name=\"removeUnicodeLocaleAttribute(Ljava/lang/String;)Landroid/icu/util/ULocale$Builder;\"/>\n\t\t<method name=\"setExtension(CLjava/lang/String;)Landroid/icu/util/ULocale$Builder;\"/>\n\t\t<method name=\"setLanguage(Ljava/lang/String;)Landroid/icu/util/ULocale$Builder;\"/>\n\t\t<method name=\"setLanguageTag(Ljava/lang/String;)Landroid/icu/util/ULocale$Builder;\"/>\n\t\t<method name=\"setLocale(Landroid/icu/util/ULocale;)Landroid/icu/util/ULocale$Builder;\"/>\n\t\t<method name=\"setRegion(Ljava/lang/String;)Landroid/icu/util/ULocale$Builder;\"/>\n\t\t<method name=\"setScript(Ljava/lang/String;)Landroid/icu/util/ULocale$Builder;\"/>\n\t\t<method name=\"setUnicodeLocaleKeyword(Ljava/lang/String;Ljava/lang/String;)Landroid/icu/util/ULocale$Builder;\"/>\n\t\t<method name=\"setVariant(Ljava/lang/String;)Landroid/icu/util/ULocale$Builder;\"/>\n\t</class>\n\t<class name=\"android/icu/util/ULocale$Category\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/icu/util/ULocale$Category;\"/>\n\t\t<method name=\"values()[Landroid/icu/util/ULocale$Category;\"/>\n\t\t<field name=\"DISPLAY\"/>\n\t\t<field name=\"FORMAT\"/>\n\t</class>\n\t<class name=\"android/icu/util/UniversalTimeScale\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"bigDecimalFrom(DI)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"bigDecimalFrom(JI)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"bigDecimalFrom(Landroid/icu/math/BigDecimal;I)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"from(JI)J\"/>\n\t\t<method name=\"getTimeScaleValue(II)J\"/>\n\t\t<method name=\"toBigDecimal(JI)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"toBigDecimal(Landroid/icu/math/BigDecimal;I)Landroid/icu/math/BigDecimal;\"/>\n\t\t<method name=\"toLong(JI)J\"/>\n\t\t<field name=\"DB2_TIME\"/>\n\t\t<field name=\"DOTNET_DATE_TIME\"/>\n\t\t<field name=\"EPOCH_OFFSET_PLUS_1_VALUE\"/>\n\t\t<field name=\"EPOCH_OFFSET_VALUE\"/>\n\t\t<field name=\"EXCEL_TIME\"/>\n\t\t<field name=\"FROM_MAX_VALUE\"/>\n\t\t<field name=\"FROM_MIN_VALUE\"/>\n\t\t<field name=\"ICU4C_TIME\"/>\n\t\t<field name=\"JAVA_TIME\"/>\n\t\t<field name=\"MAC_OLD_TIME\"/>\n\t\t<field name=\"MAC_TIME\"/>\n\t\t<field name=\"MAX_SCALE\" deprecated=\"28\"/>\n\t\t<field name=\"TO_MAX_VALUE\"/>\n\t\t<field name=\"TO_MIN_VALUE\"/>\n\t\t<field name=\"UNITS_VALUE\"/>\n\t\t<field name=\"UNIX_MICROSECONDS_TIME\"/>\n\t\t<field name=\"UNIX_TIME\"/>\n\t\t<field name=\"WINDOWS_FILE_TIME\"/>\n\t</class>\n\t<class name=\"android/icu/util/ValueIterator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"next(Landroid/icu/util/ValueIterator$Element;)Z\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"setRange(II)V\"/>\n\t</class>\n\t<class name=\"android/icu/util/ValueIterator$Element\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"integer\"/>\n\t\t<field name=\"value\"/>\n\t</class>\n\t<class name=\"android/icu/util/VersionInfo\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"compareTo(Landroid/icu/util/VersionInfo;)I\"/>\n\t\t<method name=\"getInstance(I)Landroid/icu/util/VersionInfo;\"/>\n\t\t<method name=\"getInstance(II)Landroid/icu/util/VersionInfo;\"/>\n\t\t<method name=\"getInstance(III)Landroid/icu/util/VersionInfo;\"/>\n\t\t<method name=\"getInstance(IIII)Landroid/icu/util/VersionInfo;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Landroid/icu/util/VersionInfo;\"/>\n\t\t<method name=\"getMajor()I\"/>\n\t\t<method name=\"getMicro()I\"/>\n\t\t<method name=\"getMilli()I\"/>\n\t\t<method name=\"getMinor()I\"/>\n\t\t<field name=\"ICU_VERSION\"/>\n\t\t<field name=\"UCOL_BUILDER_VERSION\"/>\n\t\t<field name=\"UCOL_RUNTIME_VERSION\"/>\n\t\t<field name=\"UNICODE_10_0\" since=\"28\"/>\n\t\t<field name=\"UNICODE_11_0\" since=\"29\"/>\n\t\t<field name=\"UNICODE_12_0\" since=\"30\"/>\n\t\t<field name=\"UNICODE_12_1\" since=\"30\"/>\n\t\t<field name=\"UNICODE_13_0\" since=\"30\"/>\n\t\t<field name=\"UNICODE_1_0\"/>\n\t\t<field name=\"UNICODE_1_0_1\"/>\n\t\t<field name=\"UNICODE_1_1_0\"/>\n\t\t<field name=\"UNICODE_1_1_5\"/>\n\t\t<field name=\"UNICODE_2_0\"/>\n\t\t<field name=\"UNICODE_2_1_2\"/>\n\t\t<field name=\"UNICODE_2_1_5\"/>\n\t\t<field name=\"UNICODE_2_1_8\"/>\n\t\t<field name=\"UNICODE_2_1_9\"/>\n\t\t<field name=\"UNICODE_3_0\"/>\n\t\t<field name=\"UNICODE_3_0_1\"/>\n\t\t<field name=\"UNICODE_3_1_0\"/>\n\t\t<field name=\"UNICODE_3_1_1\"/>\n\t\t<field name=\"UNICODE_3_2\"/>\n\t\t<field name=\"UNICODE_4_0\"/>\n\t\t<field name=\"UNICODE_4_0_1\"/>\n\t\t<field name=\"UNICODE_4_1\"/>\n\t\t<field name=\"UNICODE_5_0\"/>\n\t\t<field name=\"UNICODE_5_1\"/>\n\t\t<field name=\"UNICODE_5_2\"/>\n\t\t<field name=\"UNICODE_6_0\"/>\n\t\t<field name=\"UNICODE_6_1\"/>\n\t\t<field name=\"UNICODE_6_2\"/>\n\t\t<field name=\"UNICODE_6_3\"/>\n\t\t<field name=\"UNICODE_7_0\"/>\n\t\t<field name=\"UNICODE_8_0\"/>\n\t\t<field name=\"UNICODE_9_0\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/inputmethodservice/AbstractInputMethodService\" since=\"3\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<implements name=\"android/view/KeyEvent$Callback\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getKeyDispatcherState()Landroid/view/KeyEvent$DispatcherState;\" since=\"5\"/>\n\t\t<method name=\"onCreateInputMethodInterface()Landroid/inputmethodservice/AbstractInputMethodService$AbstractInputMethodImpl;\"/>\n\t\t<method name=\"onCreateInputMethodSessionInterface()Landroid/inputmethodservice/AbstractInputMethodService$AbstractInputMethodSessionImpl;\"/>\n\t\t<method name=\"onGenericMotionEvent(Landroid/view/MotionEvent;)Z\" since=\"17\"/>\n\t\t<method name=\"onTrackballEvent(Landroid/view/MotionEvent;)Z\"/>\n\t</class>\n\t<class name=\"android/inputmethodservice/AbstractInputMethodService$AbstractInputMethodImpl\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/view/inputmethod/InputMethod\"/>\n\t\t<method name=\"&lt;init>(Landroid/inputmethodservice/AbstractInputMethodService;)V\"/>\n\t</class>\n\t<class name=\"android/inputmethodservice/AbstractInputMethodService$AbstractInputMethodSessionImpl\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/view/inputmethod/InputMethodSession\"/>\n\t\t<method name=\"&lt;init>(Landroid/inputmethodservice/AbstractInputMethodService;)V\"/>\n\t\t<method name=\"isEnabled()Z\"/>\n\t\t<method name=\"isRevoked()Z\"/>\n\t\t<method name=\"revokeSelf()V\"/>\n\t\t<method name=\"setEnabled(Z)V\"/>\n\t</class>\n\t<class name=\"android/inputmethodservice/ExtractEditText\" since=\"3\">\n\t\t<extends name=\"android/widget/EditText\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"finishInternalChanges()V\"/>\n\t\t<method name=\"hasVerticalScrollBar()Z\"/>\n\t\t<method name=\"startInternalChanges()V\"/>\n\t</class>\n\t<class name=\"android/inputmethodservice/InputMethodService\" since=\"3\">\n\t\t<extends name=\"android/inputmethodservice/AbstractInputMethodService\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"enableHardwareAcceleration()Z\" since=\"17\" deprecated=\"21\"/>\n\t\t<method name=\"getBackDisposition()I\" since=\"11\"/>\n\t\t<method name=\"getCandidatesHiddenVisibility()I\"/>\n\t\t<method name=\"getCurrentInputBinding()Landroid/view/inputmethod/InputBinding;\"/>\n\t\t<method name=\"getCurrentInputConnection()Landroid/view/inputmethod/InputConnection;\"/>\n\t\t<method name=\"getCurrentInputEditorInfo()Landroid/view/inputmethod/EditorInfo;\"/>\n\t\t<method name=\"getCurrentInputStarted()Z\"/>\n\t\t<method name=\"getInputMethodWindowRecommendedHeight()I\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"getLayoutInflater()Landroid/view/LayoutInflater;\"/>\n\t\t<method name=\"getMaxWidth()I\"/>\n\t\t<method name=\"getTextForImeAction(I)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getWindow()Landroid/app/Dialog;\"/>\n\t\t<method name=\"hideStatusIcon()V\"/>\n\t\t<method name=\"hideWindow()V\"/>\n\t\t<method name=\"isExtractViewShown()Z\"/>\n\t\t<method name=\"isFullscreenMode()Z\"/>\n\t\t<method name=\"isInputViewShown()Z\"/>\n\t\t<method name=\"isShowInputRequested()Z\"/>\n\t\t<method name=\"onAppPrivateCommand(Ljava/lang/String;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onBindInput()V\"/>\n\t\t<method name=\"onComputeInsets(Landroid/inputmethodservice/InputMethodService$Insets;)V\"/>\n\t\t<method name=\"onConfigureWindow(Landroid/view/Window;ZZ)V\"/>\n\t\t<method name=\"onCreateCandidatesView()Landroid/view/View;\"/>\n\t\t<method name=\"onCreateExtractTextView()Landroid/view/View;\"/>\n\t\t<method name=\"onCreateInputView()Landroid/view/View;\"/>\n\t\t<method name=\"onCurrentInputMethodSubtypeChanged(Landroid/view/inputmethod/InputMethodSubtype;)V\" since=\"11\"/>\n\t\t<method name=\"onDisplayCompletions([Landroid/view/inputmethod/CompletionInfo;)V\"/>\n\t\t<method name=\"onEvaluateFullscreenMode()Z\"/>\n\t\t<method name=\"onEvaluateInputViewShown()Z\"/>\n\t\t<method name=\"onExtractTextContextMenuItem(I)Z\"/>\n\t\t<method name=\"onExtractedCursorMovement(II)V\"/>\n\t\t<method name=\"onExtractedSelectionChanged(II)V\"/>\n\t\t<method name=\"onExtractedTextClicked()V\"/>\n\t\t<method name=\"onExtractingInputChanged(Landroid/view/inputmethod/EditorInfo;)V\"/>\n\t\t<method name=\"onFinishCandidatesView(Z)V\"/>\n\t\t<method name=\"onFinishInput()V\"/>\n\t\t<method name=\"onFinishInputView(Z)V\"/>\n\t\t<method name=\"onInitializeInterface()V\"/>\n\t\t<method name=\"onShowInputRequested(IZ)Z\"/>\n\t\t<method name=\"onStartCandidatesView(Landroid/view/inputmethod/EditorInfo;Z)V\"/>\n\t\t<method name=\"onStartInput(Landroid/view/inputmethod/EditorInfo;Z)V\"/>\n\t\t<method name=\"onStartInputView(Landroid/view/inputmethod/EditorInfo;Z)V\"/>\n\t\t<method name=\"onUnbindInput()V\"/>\n\t\t<method name=\"onUpdateCursor(Landroid/graphics/Rect;)V\" deprecated=\"21\"/>\n\t\t<method name=\"onUpdateCursorAnchorInfo(Landroid/view/inputmethod/CursorAnchorInfo;)V\" since=\"21\"/>\n\t\t<method name=\"onUpdateExtractedText(ILandroid/view/inputmethod/ExtractedText;)V\"/>\n\t\t<method name=\"onUpdateExtractingViews(Landroid/view/inputmethod/EditorInfo;)V\"/>\n\t\t<method name=\"onUpdateExtractingVisibility(Landroid/view/inputmethod/EditorInfo;)V\"/>\n\t\t<method name=\"onUpdateSelection(IIIIII)V\"/>\n\t\t<method name=\"onViewClicked(Z)V\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"onWindowHidden()V\"/>\n\t\t<method name=\"onWindowShown()V\"/>\n\t\t<method name=\"requestHideSelf(I)V\"/>\n\t\t<method name=\"requestShowSelf(I)V\" since=\"28\"/>\n\t\t<method name=\"sendDefaultEditorAction(Z)Z\"/>\n\t\t<method name=\"sendDownUpKeyEvents(I)V\"/>\n\t\t<method name=\"sendKeyChar(C)V\"/>\n\t\t<method name=\"setBackDisposition(I)V\" since=\"11\"/>\n\t\t<method name=\"setCandidatesView(Landroid/view/View;)V\"/>\n\t\t<method name=\"setCandidatesViewShown(Z)V\"/>\n\t\t<method name=\"setExtractView(Landroid/view/View;)V\"/>\n\t\t<method name=\"setExtractViewShown(Z)V\"/>\n\t\t<method name=\"setInputView(Landroid/view/View;)V\"/>\n\t\t<method name=\"shouldOfferSwitchingToNextInputMethod()Z\" since=\"28\"/>\n\t\t<method name=\"showStatusIcon(I)V\"/>\n\t\t<method name=\"showWindow(Z)V\"/>\n\t\t<method name=\"switchInputMethod(Ljava/lang/String;)V\"/>\n\t\t<method name=\"switchInputMethod(Ljava/lang/String;Landroid/view/inputmethod/InputMethodSubtype;)V\" since=\"28\"/>\n\t\t<method name=\"switchToNextInputMethod(Z)Z\" since=\"28\"/>\n\t\t<method name=\"switchToPreviousInputMethod()Z\" since=\"28\"/>\n\t\t<method name=\"updateFullscreenMode()V\"/>\n\t\t<method name=\"updateInputViewShown()V\"/>\n\t\t<field name=\"BACK_DISPOSITION_ADJUST_NOTHING\" since=\"28\"/>\n\t\t<field name=\"BACK_DISPOSITION_DEFAULT\" since=\"11\"/>\n\t\t<field name=\"BACK_DISPOSITION_WILL_DISMISS\" since=\"11\" deprecated=\"28\"/>\n\t\t<field name=\"BACK_DISPOSITION_WILL_NOT_DISMISS\" since=\"11\" deprecated=\"28\"/>\n\t</class>\n\t<class name=\"android/inputmethodservice/InputMethodService$InputMethodImpl\" since=\"3\">\n\t\t<extends name=\"android/inputmethodservice/AbstractInputMethodService$AbstractInputMethodImpl\"/>\n\t\t<method name=\"&lt;init>(Landroid/inputmethodservice/InputMethodService;)V\"/>\n\t</class>\n\t<class name=\"android/inputmethodservice/InputMethodService$InputMethodSessionImpl\" since=\"3\">\n\t\t<extends name=\"android/inputmethodservice/AbstractInputMethodService$AbstractInputMethodSessionImpl\"/>\n\t\t<method name=\"&lt;init>(Landroid/inputmethodservice/InputMethodService;)V\"/>\n\t</class>\n\t<class name=\"android/inputmethodservice/InputMethodService$Insets\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"TOUCHABLE_INSETS_CONTENT\"/>\n\t\t<field name=\"TOUCHABLE_INSETS_FRAME\"/>\n\t\t<field name=\"TOUCHABLE_INSETS_REGION\" since=\"11\"/>\n\t\t<field name=\"TOUCHABLE_INSETS_VISIBLE\"/>\n\t\t<field name=\"contentTopInsets\"/>\n\t\t<field name=\"touchableInsets\"/>\n\t\t<field name=\"touchableRegion\" since=\"11\"/>\n\t\t<field name=\"visibleTopInsets\"/>\n\t</class>\n\t<class name=\"android/inputmethodservice/Keyboard\" since=\"3\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;II)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;IIII)V\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;ILjava/lang/CharSequence;II)V\" deprecated=\"29\"/>\n\t\t<method name=\"createKeyFromXml(Landroid/content/res/Resources;Landroid/inputmethodservice/Keyboard$Row;IILandroid/content/res/XmlResourceParser;)Landroid/inputmethodservice/Keyboard$Key;\" deprecated=\"29\"/>\n\t\t<method name=\"createRowFromXml(Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;)Landroid/inputmethodservice/Keyboard$Row;\" deprecated=\"29\"/>\n\t\t<method name=\"getHeight()I\" deprecated=\"29\"/>\n\t\t<method name=\"getHorizontalGap()I\" deprecated=\"29\"/>\n\t\t<method name=\"getKeyHeight()I\" deprecated=\"29\"/>\n\t\t<method name=\"getKeyWidth()I\" deprecated=\"29\"/>\n\t\t<method name=\"getKeys()Ljava/util/List;\" deprecated=\"29\"/>\n\t\t<method name=\"getMinWidth()I\" deprecated=\"29\"/>\n\t\t<method name=\"getModifierKeys()Ljava/util/List;\" deprecated=\"29\"/>\n\t\t<method name=\"getNearestKeys(II)[I\" deprecated=\"29\"/>\n\t\t<method name=\"getShiftKeyIndex()I\" deprecated=\"29\"/>\n\t\t<method name=\"getVerticalGap()I\" deprecated=\"29\"/>\n\t\t<method name=\"isShifted()Z\" deprecated=\"29\"/>\n\t\t<method name=\"setHorizontalGap(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setKeyHeight(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setKeyWidth(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setShifted(Z)Z\" deprecated=\"29\"/>\n\t\t<method name=\"setVerticalGap(I)V\" deprecated=\"29\"/>\n\t\t<field name=\"EDGE_BOTTOM\" deprecated=\"29\"/>\n\t\t<field name=\"EDGE_LEFT\" deprecated=\"29\"/>\n\t\t<field name=\"EDGE_RIGHT\" deprecated=\"29\"/>\n\t\t<field name=\"EDGE_TOP\" deprecated=\"29\"/>\n\t\t<field name=\"KEYCODE_ALT\" deprecated=\"29\"/>\n\t\t<field name=\"KEYCODE_CANCEL\" deprecated=\"29\"/>\n\t\t<field name=\"KEYCODE_DELETE\" deprecated=\"29\"/>\n\t\t<field name=\"KEYCODE_DONE\" deprecated=\"29\"/>\n\t\t<field name=\"KEYCODE_MODE_CHANGE\" deprecated=\"29\"/>\n\t\t<field name=\"KEYCODE_SHIFT\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/inputmethodservice/Keyboard$Key\" since=\"3\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/res/Resources;Landroid/inputmethodservice/Keyboard$Row;IILandroid/content/res/XmlResourceParser;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/inputmethodservice/Keyboard$Row;)V\" deprecated=\"29\"/>\n\t\t<method name=\"getCurrentDrawableState()[I\" deprecated=\"29\"/>\n\t\t<method name=\"isInside(II)Z\" deprecated=\"29\"/>\n\t\t<method name=\"onPressed()V\" deprecated=\"29\"/>\n\t\t<method name=\"onReleased(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"squaredDistanceFrom(II)I\" deprecated=\"29\"/>\n\t\t<field name=\"codes\" deprecated=\"29\"/>\n\t\t<field name=\"edgeFlags\" deprecated=\"29\"/>\n\t\t<field name=\"gap\" deprecated=\"29\"/>\n\t\t<field name=\"height\" deprecated=\"29\"/>\n\t\t<field name=\"icon\" deprecated=\"29\"/>\n\t\t<field name=\"iconPreview\" deprecated=\"29\"/>\n\t\t<field name=\"label\" deprecated=\"29\"/>\n\t\t<field name=\"modifier\" deprecated=\"29\"/>\n\t\t<field name=\"on\" deprecated=\"29\"/>\n\t\t<field name=\"popupCharacters\" deprecated=\"29\"/>\n\t\t<field name=\"popupResId\" deprecated=\"29\"/>\n\t\t<field name=\"pressed\" deprecated=\"29\"/>\n\t\t<field name=\"repeatable\" deprecated=\"29\"/>\n\t\t<field name=\"sticky\" deprecated=\"29\"/>\n\t\t<field name=\"text\" deprecated=\"29\"/>\n\t\t<field name=\"width\" deprecated=\"29\"/>\n\t\t<field name=\"x\" deprecated=\"29\"/>\n\t\t<field name=\"y\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/inputmethodservice/Keyboard$Row\" since=\"3\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/res/Resources;Landroid/inputmethodservice/Keyboard;Landroid/content/res/XmlResourceParser;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/inputmethodservice/Keyboard;)V\" deprecated=\"29\"/>\n\t\t<field name=\"defaultHeight\" deprecated=\"29\"/>\n\t\t<field name=\"defaultHorizontalGap\" deprecated=\"29\"/>\n\t\t<field name=\"defaultWidth\" deprecated=\"29\"/>\n\t\t<field name=\"mode\" deprecated=\"29\"/>\n\t\t<field name=\"rowEdgeFlags\" deprecated=\"29\"/>\n\t\t<field name=\"verticalGap\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/inputmethodservice/KeyboardView\" since=\"3\" deprecated=\"29\">\n\t\t<extends name=\"android/view/View\"/>\n\t\t<implements name=\"android/view/View$OnClickListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"closing()V\" deprecated=\"29\"/>\n\t\t<method name=\"getKeyboard()Landroid/inputmethodservice/Keyboard;\" deprecated=\"29\"/>\n\t\t<method name=\"getOnKeyboardActionListener()Landroid/inputmethodservice/KeyboardView$OnKeyboardActionListener;\" deprecated=\"29\"/>\n\t\t<method name=\"handleBack()Z\" deprecated=\"29\"/>\n\t\t<method name=\"invalidateAllKeys()V\" since=\"4\" deprecated=\"29\"/>\n\t\t<method name=\"invalidateKey(I)V\" since=\"4\" deprecated=\"29\"/>\n\t\t<method name=\"isPreviewEnabled()Z\" deprecated=\"29\"/>\n\t\t<method name=\"isProximityCorrectionEnabled()Z\" deprecated=\"29\"/>\n\t\t<method name=\"isShifted()Z\" deprecated=\"29\"/>\n\t\t<method name=\"onLongPress(Landroid/inputmethodservice/Keyboard$Key;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"setKeyboard(Landroid/inputmethodservice/Keyboard;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setOnKeyboardActionListener(Landroid/inputmethodservice/KeyboardView$OnKeyboardActionListener;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setPopupOffset(II)V\" deprecated=\"29\"/>\n\t\t<method name=\"setPopupParent(Landroid/view/View;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setPreviewEnabled(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setProximityCorrectionEnabled(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setShifted(Z)Z\" deprecated=\"29\"/>\n\t\t<method name=\"setVerticalCorrection(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"swipeDown()V\" deprecated=\"29\"/>\n\t\t<method name=\"swipeLeft()V\" deprecated=\"29\"/>\n\t\t<method name=\"swipeRight()V\" deprecated=\"29\"/>\n\t\t<method name=\"swipeUp()V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/inputmethodservice/KeyboardView$OnKeyboardActionListener\" since=\"3\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onKey(I[I)V\" deprecated=\"29\"/>\n\t\t<method name=\"onPress(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"onRelease(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"onText(Ljava/lang/CharSequence;)V\" deprecated=\"29\"/>\n\t\t<method name=\"swipeDown()V\" deprecated=\"29\"/>\n\t\t<method name=\"swipeLeft()V\" deprecated=\"29\"/>\n\t\t<method name=\"swipeRight()V\" deprecated=\"29\"/>\n\t\t<method name=\"swipeUp()V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/location/Address\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"clearLatitude()V\"/>\n\t\t<method name=\"clearLongitude()V\"/>\n\t\t<method name=\"getAddressLine(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getAdminArea()Ljava/lang/String;\"/>\n\t\t<method name=\"getCountryCode()Ljava/lang/String;\"/>\n\t\t<method name=\"getCountryName()Ljava/lang/String;\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getFeatureName()Ljava/lang/String;\"/>\n\t\t<method name=\"getLatitude()D\"/>\n\t\t<method name=\"getLocale()Ljava/util/Locale;\"/>\n\t\t<method name=\"getLocality()Ljava/lang/String;\"/>\n\t\t<method name=\"getLongitude()D\"/>\n\t\t<method name=\"getMaxAddressLineIndex()I\"/>\n\t\t<method name=\"getPhone()Ljava/lang/String;\"/>\n\t\t<method name=\"getPostalCode()Ljava/lang/String;\"/>\n\t\t<method name=\"getPremises()Ljava/lang/String;\" since=\"4\"/>\n\t\t<method name=\"getSubAdminArea()Ljava/lang/String;\"/>\n\t\t<method name=\"getSubLocality()Ljava/lang/String;\" since=\"4\"/>\n\t\t<method name=\"getSubThoroughfare()Ljava/lang/String;\" since=\"4\"/>\n\t\t<method name=\"getThoroughfare()Ljava/lang/String;\"/>\n\t\t<method name=\"getUrl()Ljava/lang/String;\"/>\n\t\t<method name=\"hasLatitude()Z\"/>\n\t\t<method name=\"hasLongitude()Z\"/>\n\t\t<method name=\"setAddressLine(ILjava/lang/String;)V\"/>\n\t\t<method name=\"setAdminArea(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setCountryCode(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setCountryName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"setFeatureName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setLatitude(D)V\"/>\n\t\t<method name=\"setLocality(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setLongitude(D)V\"/>\n\t\t<method name=\"setPhone(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setPostalCode(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setPremises(Ljava/lang/String;)V\" since=\"4\"/>\n\t\t<method name=\"setSubAdminArea(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setSubLocality(Ljava/lang/String;)V\" since=\"4\"/>\n\t\t<method name=\"setSubThoroughfare(Ljava/lang/String;)V\" since=\"4\"/>\n\t\t<method name=\"setThoroughfare(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setUrl(Ljava/lang/String;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/location/Criteria\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/location/Criteria;)V\"/>\n\t\t<method name=\"getAccuracy()I\"/>\n\t\t<method name=\"getBearingAccuracy()I\" since=\"9\"/>\n\t\t<method name=\"getHorizontalAccuracy()I\" since=\"9\"/>\n\t\t<method name=\"getPowerRequirement()I\"/>\n\t\t<method name=\"getSpeedAccuracy()I\" since=\"9\"/>\n\t\t<method name=\"getVerticalAccuracy()I\" since=\"9\"/>\n\t\t<method name=\"isAltitudeRequired()Z\"/>\n\t\t<method name=\"isBearingRequired()Z\"/>\n\t\t<method name=\"isCostAllowed()Z\"/>\n\t\t<method name=\"isSpeedRequired()Z\"/>\n\t\t<method name=\"setAccuracy(I)V\"/>\n\t\t<method name=\"setAltitudeRequired(Z)V\"/>\n\t\t<method name=\"setBearingAccuracy(I)V\" since=\"9\"/>\n\t\t<method name=\"setBearingRequired(Z)V\"/>\n\t\t<method name=\"setCostAllowed(Z)V\"/>\n\t\t<method name=\"setHorizontalAccuracy(I)V\" since=\"9\"/>\n\t\t<method name=\"setPowerRequirement(I)V\"/>\n\t\t<method name=\"setSpeedAccuracy(I)V\" since=\"9\"/>\n\t\t<method name=\"setSpeedRequired(Z)V\"/>\n\t\t<method name=\"setVerticalAccuracy(I)V\" since=\"9\"/>\n\t\t<field name=\"ACCURACY_COARSE\"/>\n\t\t<field name=\"ACCURACY_FINE\"/>\n\t\t<field name=\"ACCURACY_HIGH\" since=\"9\"/>\n\t\t<field name=\"ACCURACY_LOW\" since=\"9\"/>\n\t\t<field name=\"ACCURACY_MEDIUM\" since=\"9\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"NO_REQUIREMENT\"/>\n\t\t<field name=\"POWER_HIGH\"/>\n\t\t<field name=\"POWER_LOW\"/>\n\t\t<field name=\"POWER_MEDIUM\"/>\n\t</class>\n\t<class name=\"android/location/Geocoder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"getFromLocation(DDI)Ljava/util/List;\"/>\n\t\t<method name=\"getFromLocationName(Ljava/lang/String;I)Ljava/util/List;\"/>\n\t\t<method name=\"getFromLocationName(Ljava/lang/String;IDDDD)Ljava/util/List;\"/>\n\t\t<method name=\"isPresent()Z\" since=\"9\"/>\n\t</class>\n\t<class name=\"android/location/GnssClock\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getBiasNanos()D\"/>\n\t\t<method name=\"getBiasUncertaintyNanos()D\"/>\n\t\t<method name=\"getDriftNanosPerSecond()D\"/>\n\t\t<method name=\"getDriftUncertaintyNanosPerSecond()D\"/>\n\t\t<method name=\"getElapsedRealtimeNanos()J\" since=\"29\"/>\n\t\t<method name=\"getElapsedRealtimeUncertaintyNanos()D\" since=\"29\"/>\n\t\t<method name=\"getFullBiasNanos()J\"/>\n\t\t<method name=\"getHardwareClockDiscontinuityCount()I\"/>\n\t\t<method name=\"getLeapSecond()I\"/>\n\t\t<method name=\"getTimeNanos()J\"/>\n\t\t<method name=\"getTimeUncertaintyNanos()D\"/>\n\t\t<method name=\"hasBiasNanos()Z\"/>\n\t\t<method name=\"hasBiasUncertaintyNanos()Z\"/>\n\t\t<method name=\"hasDriftNanosPerSecond()Z\"/>\n\t\t<method name=\"hasDriftUncertaintyNanosPerSecond()Z\"/>\n\t\t<method name=\"hasElapsedRealtimeNanos()Z\" since=\"29\"/>\n\t\t<method name=\"hasElapsedRealtimeUncertaintyNanos()Z\" since=\"29\"/>\n\t\t<method name=\"hasFullBiasNanos()Z\"/>\n\t\t<method name=\"hasLeapSecond()Z\"/>\n\t\t<method name=\"hasTimeUncertaintyNanos()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/location/GnssMeasurement\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getAccumulatedDeltaRangeMeters()D\"/>\n\t\t<method name=\"getAccumulatedDeltaRangeState()I\"/>\n\t\t<method name=\"getAccumulatedDeltaRangeUncertaintyMeters()D\"/>\n\t\t<method name=\"getAutomaticGainControlLevelDb()D\" since=\"26\"/>\n\t\t<method name=\"getCarrierCycles()J\" deprecated=\"28\"/>\n\t\t<method name=\"getCarrierFrequencyHz()F\"/>\n\t\t<method name=\"getCarrierPhase()D\" deprecated=\"28\"/>\n\t\t<method name=\"getCarrierPhaseUncertainty()D\" deprecated=\"28\"/>\n\t\t<method name=\"getCn0DbHz()D\"/>\n\t\t<method name=\"getCodeType()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getConstellationType()I\"/>\n\t\t<method name=\"getMultipathIndicator()I\"/>\n\t\t<method name=\"getPseudorangeRateMetersPerSecond()D\"/>\n\t\t<method name=\"getPseudorangeRateUncertaintyMetersPerSecond()D\"/>\n\t\t<method name=\"getReceivedSvTimeNanos()J\"/>\n\t\t<method name=\"getReceivedSvTimeUncertaintyNanos()J\"/>\n\t\t<method name=\"getSnrInDb()D\"/>\n\t\t<method name=\"getState()I\"/>\n\t\t<method name=\"getSvid()I\"/>\n\t\t<method name=\"getTimeOffsetNanos()D\"/>\n\t\t<method name=\"hasAutomaticGainControlLevelDb()Z\" since=\"26\"/>\n\t\t<method name=\"hasCarrierCycles()Z\" deprecated=\"28\"/>\n\t\t<method name=\"hasCarrierFrequencyHz()Z\"/>\n\t\t<method name=\"hasCarrierPhase()Z\" deprecated=\"28\"/>\n\t\t<method name=\"hasCarrierPhaseUncertainty()Z\" deprecated=\"28\"/>\n\t\t<method name=\"hasCodeType()Z\" since=\"29\"/>\n\t\t<method name=\"hasSnrInDb()Z\"/>\n\t\t<field name=\"ADR_STATE_CYCLE_SLIP\"/>\n\t\t<field name=\"ADR_STATE_HALF_CYCLE_REPORTED\" since=\"28\"/>\n\t\t<field name=\"ADR_STATE_HALF_CYCLE_RESOLVED\" since=\"28\"/>\n\t\t<field name=\"ADR_STATE_RESET\"/>\n\t\t<field name=\"ADR_STATE_UNKNOWN\"/>\n\t\t<field name=\"ADR_STATE_VALID\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"MULTIPATH_INDICATOR_DETECTED\"/>\n\t\t<field name=\"MULTIPATH_INDICATOR_NOT_DETECTED\"/>\n\t\t<field name=\"MULTIPATH_INDICATOR_UNKNOWN\"/>\n\t\t<field name=\"STATE_2ND_CODE_LOCK\" since=\"29\"/>\n\t\t<field name=\"STATE_BDS_D2_BIT_SYNC\"/>\n\t\t<field name=\"STATE_BDS_D2_SUBFRAME_SYNC\"/>\n\t\t<field name=\"STATE_BIT_SYNC\"/>\n\t\t<field name=\"STATE_CODE_LOCK\"/>\n\t\t<field name=\"STATE_GAL_E1BC_CODE_LOCK\"/>\n\t\t<field name=\"STATE_GAL_E1B_PAGE_SYNC\"/>\n\t\t<field name=\"STATE_GAL_E1C_2ND_CODE_LOCK\"/>\n\t\t<field name=\"STATE_GLO_STRING_SYNC\"/>\n\t\t<field name=\"STATE_GLO_TOD_DECODED\"/>\n\t\t<field name=\"STATE_GLO_TOD_KNOWN\" since=\"26\"/>\n\t\t<field name=\"STATE_MSEC_AMBIGUOUS\"/>\n\t\t<field name=\"STATE_SBAS_SYNC\"/>\n\t\t<field name=\"STATE_SUBFRAME_SYNC\"/>\n\t\t<field name=\"STATE_SYMBOL_SYNC\"/>\n\t\t<field name=\"STATE_TOW_DECODED\"/>\n\t\t<field name=\"STATE_TOW_KNOWN\" since=\"26\"/>\n\t\t<field name=\"STATE_UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/location/GnssMeasurementsEvent\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getClock()Landroid/location/GnssClock;\"/>\n\t\t<method name=\"getMeasurements()Ljava/util/Collection;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/location/GnssMeasurementsEvent$Callback\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onGnssMeasurementsReceived(Landroid/location/GnssMeasurementsEvent;)V\"/>\n\t\t<method name=\"onStatusChanged(I)V\"/>\n\t\t<field name=\"STATUS_LOCATION_DISABLED\"/>\n\t\t<field name=\"STATUS_NOT_ALLOWED\" since=\"28\"/>\n\t\t<field name=\"STATUS_NOT_SUPPORTED\"/>\n\t\t<field name=\"STATUS_READY\"/>\n\t</class>\n\t<class name=\"android/location/GnssNavigationMessage\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getData()[B\"/>\n\t\t<method name=\"getMessageId()I\"/>\n\t\t<method name=\"getStatus()I\"/>\n\t\t<method name=\"getSubmessageId()I\"/>\n\t\t<method name=\"getSvid()I\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"STATUS_PARITY_PASSED\"/>\n\t\t<field name=\"STATUS_PARITY_REBUILT\"/>\n\t\t<field name=\"STATUS_UNKNOWN\"/>\n\t\t<field name=\"TYPE_BDS_D1\"/>\n\t\t<field name=\"TYPE_BDS_D2\"/>\n\t\t<field name=\"TYPE_GAL_F\"/>\n\t\t<field name=\"TYPE_GAL_I\"/>\n\t\t<field name=\"TYPE_GLO_L1CA\"/>\n\t\t<field name=\"TYPE_GPS_CNAV2\"/>\n\t\t<field name=\"TYPE_GPS_L1CA\"/>\n\t\t<field name=\"TYPE_GPS_L2CNAV\"/>\n\t\t<field name=\"TYPE_GPS_L5CNAV\"/>\n\t\t<field name=\"TYPE_UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/location/GnssNavigationMessage$Callback\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onGnssNavigationMessageReceived(Landroid/location/GnssNavigationMessage;)V\"/>\n\t\t<method name=\"onStatusChanged(I)V\"/>\n\t\t<field name=\"STATUS_LOCATION_DISABLED\"/>\n\t\t<field name=\"STATUS_NOT_SUPPORTED\"/>\n\t\t<field name=\"STATUS_READY\"/>\n\t</class>\n\t<class name=\"android/location/GnssStatus\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAzimuthDegrees(I)F\"/>\n\t\t<method name=\"getCarrierFrequencyHz(I)F\" since=\"26\"/>\n\t\t<method name=\"getCn0DbHz(I)F\"/>\n\t\t<method name=\"getConstellationType(I)I\"/>\n\t\t<method name=\"getElevationDegrees(I)F\"/>\n\t\t<method name=\"getSatelliteCount()I\"/>\n\t\t<method name=\"getSvid(I)I\"/>\n\t\t<method name=\"hasAlmanacData(I)Z\"/>\n\t\t<method name=\"hasCarrierFrequencyHz(I)Z\" since=\"26\"/>\n\t\t<method name=\"hasEphemerisData(I)Z\"/>\n\t\t<method name=\"usedInFix(I)Z\"/>\n\t\t<field name=\"CONSTELLATION_BEIDOU\"/>\n\t\t<field name=\"CONSTELLATION_GALILEO\"/>\n\t\t<field name=\"CONSTELLATION_GLONASS\"/>\n\t\t<field name=\"CONSTELLATION_GPS\"/>\n\t\t<field name=\"CONSTELLATION_IRNSS\" since=\"29\"/>\n\t\t<field name=\"CONSTELLATION_QZSS\"/>\n\t\t<field name=\"CONSTELLATION_SBAS\"/>\n\t\t<field name=\"CONSTELLATION_UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/location/GnssStatus$Callback\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onFirstFix(I)V\"/>\n\t\t<method name=\"onSatelliteStatusChanged(Landroid/location/GnssStatus;)V\"/>\n\t\t<method name=\"onStarted()V\"/>\n\t\t<method name=\"onStopped()V\"/>\n\t</class>\n\t<class name=\"android/location/GpsSatellite\" since=\"3\" deprecated=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAzimuth()F\" deprecated=\"29\"/>\n\t\t<method name=\"getElevation()F\" deprecated=\"29\"/>\n\t\t<method name=\"getPrn()I\" deprecated=\"29\"/>\n\t\t<method name=\"getSnr()F\" deprecated=\"29\"/>\n\t\t<method name=\"hasAlmanac()Z\" deprecated=\"29\"/>\n\t\t<method name=\"hasEphemeris()Z\" deprecated=\"29\"/>\n\t\t<method name=\"usedInFix()Z\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/location/GpsStatus\" since=\"3\" deprecated=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getMaxSatellites()I\" deprecated=\"29\"/>\n\t\t<method name=\"getSatellites()Ljava/lang/Iterable;\" deprecated=\"29\"/>\n\t\t<method name=\"getTimeToFirstFix()I\" deprecated=\"29\"/>\n\t\t<field name=\"GPS_EVENT_FIRST_FIX\" deprecated=\"29\"/>\n\t\t<field name=\"GPS_EVENT_SATELLITE_STATUS\" deprecated=\"29\"/>\n\t\t<field name=\"GPS_EVENT_STARTED\" deprecated=\"29\"/>\n\t\t<field name=\"GPS_EVENT_STOPPED\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/location/GpsStatus$Listener\" since=\"3\" deprecated=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onGpsStatusChanged(I)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/location/GpsStatus$NmeaListener\" since=\"5\" deprecated=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onNmeaReceived(JLjava/lang/String;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/location/Location\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/location/Location;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"bearingTo(Landroid/location/Location;)F\"/>\n\t\t<method name=\"convert(DI)Ljava/lang/String;\"/>\n\t\t<method name=\"convert(Ljava/lang/String;)D\"/>\n\t\t<method name=\"distanceBetween(DDDD[F)V\"/>\n\t\t<method name=\"distanceTo(Landroid/location/Location;)F\"/>\n\t\t<method name=\"dump(Landroid/util/Printer;Ljava/lang/String;)V\" since=\"3\"/>\n\t\t<method name=\"getAccuracy()F\"/>\n\t\t<method name=\"getAltitude()D\"/>\n\t\t<method name=\"getBearing()F\"/>\n\t\t<method name=\"getBearingAccuracyDegrees()F\" since=\"26\"/>\n\t\t<method name=\"getElapsedRealtimeNanos()J\" since=\"17\"/>\n\t\t<method name=\"getElapsedRealtimeUncertaintyNanos()D\" since=\"29\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getLatitude()D\"/>\n\t\t<method name=\"getLongitude()D\"/>\n\t\t<method name=\"getProvider()Ljava/lang/String;\"/>\n\t\t<method name=\"getSpeed()F\"/>\n\t\t<method name=\"getSpeedAccuracyMetersPerSecond()F\" since=\"26\"/>\n\t\t<method name=\"getTime()J\"/>\n\t\t<method name=\"getVerticalAccuracyMeters()F\" since=\"26\"/>\n\t\t<method name=\"hasAccuracy()Z\"/>\n\t\t<method name=\"hasAltitude()Z\"/>\n\t\t<method name=\"hasBearing()Z\"/>\n\t\t<method name=\"hasBearingAccuracy()Z\" since=\"26\"/>\n\t\t<method name=\"hasElapsedRealtimeUncertaintyNanos()Z\" since=\"29\"/>\n\t\t<method name=\"hasSpeed()Z\"/>\n\t\t<method name=\"hasSpeedAccuracy()Z\" since=\"26\"/>\n\t\t<method name=\"hasVerticalAccuracy()Z\" since=\"26\"/>\n\t\t<method name=\"isFromMockProvider()Z\" since=\"18\"/>\n\t\t<method name=\"removeAccuracy()V\" deprecated=\"26\"/>\n\t\t<method name=\"removeAltitude()V\" deprecated=\"26\"/>\n\t\t<method name=\"removeBearing()V\" deprecated=\"26\"/>\n\t\t<method name=\"removeSpeed()V\" deprecated=\"26\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"set(Landroid/location/Location;)V\"/>\n\t\t<method name=\"setAccuracy(F)V\"/>\n\t\t<method name=\"setAltitude(D)V\"/>\n\t\t<method name=\"setBearing(F)V\"/>\n\t\t<method name=\"setBearingAccuracyDegrees(F)V\" since=\"26\"/>\n\t\t<method name=\"setElapsedRealtimeNanos(J)V\" since=\"17\"/>\n\t\t<method name=\"setElapsedRealtimeUncertaintyNanos(D)V\" since=\"29\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"setLatitude(D)V\"/>\n\t\t<method name=\"setLongitude(D)V\"/>\n\t\t<method name=\"setProvider(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setSpeed(F)V\"/>\n\t\t<method name=\"setSpeedAccuracyMetersPerSecond(F)V\" since=\"26\"/>\n\t\t<method name=\"setTime(J)V\"/>\n\t\t<method name=\"setVerticalAccuracyMeters(F)V\" since=\"26\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FORMAT_DEGREES\"/>\n\t\t<field name=\"FORMAT_MINUTES\"/>\n\t\t<field name=\"FORMAT_SECONDS\"/>\n\t</class>\n\t<class name=\"android/location/LocationListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onLocationChanged(Landroid/location/Location;)V\"/>\n\t\t<method name=\"onProviderDisabled(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onProviderEnabled(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onStatusChanged(Ljava/lang/String;ILandroid/os/Bundle;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/location/LocationManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addGpsStatusListener(Landroid/location/GpsStatus$Listener;)Z\" since=\"3\" deprecated=\"24\"/>\n\t\t<method name=\"addNmeaListener(Landroid/location/GpsStatus$NmeaListener;)Z\" since=\"5\" deprecated=\"24\" removed=\"29\"/>\n\t\t<method name=\"addNmeaListener(Landroid/location/OnNmeaMessageListener;)Z\" since=\"24\"/>\n\t\t<method name=\"addNmeaListener(Landroid/location/OnNmeaMessageListener;Landroid/os/Handler;)Z\" since=\"24\"/>\n\t\t<method name=\"addProximityAlert(DDFJLandroid/app/PendingIntent;)V\"/>\n\t\t<method name=\"addTestProvider(Ljava/lang/String;ZZZZZZZII)V\" since=\"3\"/>\n\t\t<method name=\"clearTestProviderEnabled(Ljava/lang/String;)V\" since=\"3\" deprecated=\"29\"/>\n\t\t<method name=\"clearTestProviderLocation(Ljava/lang/String;)V\" since=\"3\" deprecated=\"29\"/>\n\t\t<method name=\"clearTestProviderStatus(Ljava/lang/String;)V\" since=\"3\" deprecated=\"29\"/>\n\t\t<method name=\"getAllProviders()Ljava/util/List;\"/>\n\t\t<method name=\"getBestProvider(Landroid/location/Criteria;Z)Ljava/lang/String;\"/>\n\t\t<method name=\"getGnssHardwareModelName()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getGnssYearOfHardware()I\" since=\"28\"/>\n\t\t<method name=\"getGpsStatus(Landroid/location/GpsStatus;)Landroid/location/GpsStatus;\" since=\"3\" deprecated=\"24\"/>\n\t\t<method name=\"getLastKnownLocation(Ljava/lang/String;)Landroid/location/Location;\"/>\n\t\t<method name=\"getProvider(Ljava/lang/String;)Landroid/location/LocationProvider;\"/>\n\t\t<method name=\"getProviders(Landroid/location/Criteria;Z)Ljava/util/List;\"/>\n\t\t<method name=\"getProviders(Z)Ljava/util/List;\"/>\n\t\t<method name=\"isLocationEnabled()Z\" since=\"28\"/>\n\t\t<method name=\"isProviderEnabled(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"registerGnssMeasurementsCallback(Landroid/location/GnssMeasurementsEvent$Callback;)Z\" since=\"24\"/>\n\t\t<method name=\"registerGnssMeasurementsCallback(Landroid/location/GnssMeasurementsEvent$Callback;Landroid/os/Handler;)Z\" since=\"24\"/>\n\t\t<method name=\"registerGnssNavigationMessageCallback(Landroid/location/GnssNavigationMessage$Callback;)Z\" since=\"24\"/>\n\t\t<method name=\"registerGnssNavigationMessageCallback(Landroid/location/GnssNavigationMessage$Callback;Landroid/os/Handler;)Z\" since=\"24\"/>\n\t\t<method name=\"registerGnssStatusCallback(Landroid/location/GnssStatus$Callback;)Z\" since=\"24\"/>\n\t\t<method name=\"registerGnssStatusCallback(Landroid/location/GnssStatus$Callback;Landroid/os/Handler;)Z\" since=\"24\"/>\n\t\t<method name=\"removeGpsStatusListener(Landroid/location/GpsStatus$Listener;)V\" since=\"3\" deprecated=\"24\"/>\n\t\t<method name=\"removeNmeaListener(Landroid/location/GpsStatus$NmeaListener;)V\" since=\"5\" deprecated=\"24\" removed=\"29\"/>\n\t\t<method name=\"removeNmeaListener(Landroid/location/OnNmeaMessageListener;)V\" since=\"24\"/>\n\t\t<method name=\"removeProximityAlert(Landroid/app/PendingIntent;)V\"/>\n\t\t<method name=\"removeTestProvider(Ljava/lang/String;)V\" since=\"3\"/>\n\t\t<method name=\"removeUpdates(Landroid/app/PendingIntent;)V\" since=\"3\"/>\n\t\t<method name=\"removeUpdates(Landroid/location/LocationListener;)V\"/>\n\t\t<method name=\"requestLocationUpdates(JFLandroid/location/Criteria;Landroid/app/PendingIntent;)V\" since=\"9\"/>\n\t\t<method name=\"requestLocationUpdates(JFLandroid/location/Criteria;Landroid/location/LocationListener;Landroid/os/Looper;)V\" since=\"9\"/>\n\t\t<method name=\"requestLocationUpdates(Ljava/lang/String;JFLandroid/app/PendingIntent;)V\" since=\"3\"/>\n\t\t<method name=\"requestLocationUpdates(Ljava/lang/String;JFLandroid/location/LocationListener;)V\"/>\n\t\t<method name=\"requestLocationUpdates(Ljava/lang/String;JFLandroid/location/LocationListener;Landroid/os/Looper;)V\"/>\n\t\t<method name=\"requestSingleUpdate(Landroid/location/Criteria;Landroid/app/PendingIntent;)V\" since=\"9\"/>\n\t\t<method name=\"requestSingleUpdate(Landroid/location/Criteria;Landroid/location/LocationListener;Landroid/os/Looper;)V\" since=\"9\"/>\n\t\t<method name=\"requestSingleUpdate(Ljava/lang/String;Landroid/app/PendingIntent;)V\" since=\"9\"/>\n\t\t<method name=\"requestSingleUpdate(Ljava/lang/String;Landroid/location/LocationListener;Landroid/os/Looper;)V\" since=\"9\"/>\n\t\t<method name=\"sendExtraCommand(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Z\" since=\"3\"/>\n\t\t<method name=\"setTestProviderEnabled(Ljava/lang/String;Z)V\" since=\"3\"/>\n\t\t<method name=\"setTestProviderLocation(Ljava/lang/String;Landroid/location/Location;)V\" since=\"3\"/>\n\t\t<method name=\"setTestProviderStatus(Ljava/lang/String;ILandroid/os/Bundle;J)V\" since=\"3\" deprecated=\"29\"/>\n\t\t<method name=\"unregisterGnssMeasurementsCallback(Landroid/location/GnssMeasurementsEvent$Callback;)V\" since=\"24\"/>\n\t\t<method name=\"unregisterGnssNavigationMessageCallback(Landroid/location/GnssNavigationMessage$Callback;)V\" since=\"24\"/>\n\t\t<method name=\"unregisterGnssStatusCallback(Landroid/location/GnssStatus$Callback;)V\" since=\"24\"/>\n\t\t<field name=\"EXTRA_PROVIDER_NAME\" since=\"29\"/>\n\t\t<field name=\"GPS_PROVIDER\"/>\n\t\t<field name=\"KEY_LOCATION_CHANGED\" since=\"3\"/>\n\t\t<field name=\"KEY_PROVIDER_ENABLED\" since=\"3\"/>\n\t\t<field name=\"KEY_PROXIMITY_ENTERING\"/>\n\t\t<field name=\"KEY_STATUS_CHANGED\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"MODE_CHANGED_ACTION\" since=\"19\"/>\n\t\t<field name=\"NETWORK_PROVIDER\"/>\n\t\t<field name=\"PASSIVE_PROVIDER\" since=\"8\"/>\n\t\t<field name=\"PROVIDERS_CHANGED_ACTION\" since=\"9\"/>\n\t</class>\n\t<class name=\"android/location/LocationProvider\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAccuracy()I\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getPowerRequirement()I\"/>\n\t\t<method name=\"hasMonetaryCost()Z\"/>\n\t\t<method name=\"meetsCriteria(Landroid/location/Criteria;)Z\"/>\n\t\t<method name=\"requiresCell()Z\"/>\n\t\t<method name=\"requiresNetwork()Z\"/>\n\t\t<method name=\"requiresSatellite()Z\"/>\n\t\t<method name=\"supportsAltitude()Z\"/>\n\t\t<method name=\"supportsBearing()Z\"/>\n\t\t<method name=\"supportsSpeed()Z\"/>\n\t\t<field name=\"AVAILABLE\" deprecated=\"29\"/>\n\t\t<field name=\"OUT_OF_SERVICE\" deprecated=\"29\"/>\n\t\t<field name=\"TEMPORARILY_UNAVAILABLE\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/location/OnNmeaMessageListener\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onNmeaMessage(Ljava/lang/String;J)V\"/>\n\t</class>\n\t<class name=\"android/location/SettingInjectorService\" since=\"19\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onGetEnabled()Z\"/>\n\t\t<method name=\"onGetSummary()Ljava/lang/String;\" deprecated=\"21\"/>\n\t\t<method name=\"refreshSettings(Landroid/content/Context;)V\" since=\"29\"/>\n\t\t<field name=\"ACTION_INJECTED_SETTING_CHANGED\"/>\n\t\t<field name=\"ACTION_SERVICE_INTENT\"/>\n\t\t<field name=\"ATTRIBUTES_NAME\"/>\n\t\t<field name=\"META_DATA_NAME\"/>\n\t</class>\n\t<class name=\"android/media/AsyncPlayer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"play(Landroid/content/Context;Landroid/net/Uri;ZI)V\" deprecated=\"23\"/>\n\t\t<method name=\"play(Landroid/content/Context;Landroid/net/Uri;ZLandroid/media/AudioAttributes;)V\" since=\"23\"/>\n\t\t<method name=\"stop()V\"/>\n\t</class>\n\t<class name=\"android/media/AudioAttributes\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"areHapticChannelsMuted()Z\" since=\"29\"/>\n\t\t<method name=\"getAllowedCapturePolicy()I\" since=\"29\"/>\n\t\t<method name=\"getContentType()I\"/>\n\t\t<method name=\"getFlags()I\"/>\n\t\t<method name=\"getUsage()I\"/>\n\t\t<method name=\"getVolumeControlStream()I\" since=\"26\"/>\n\t\t<field name=\"ALLOW_CAPTURE_BY_ALL\" since=\"29\"/>\n\t\t<field name=\"ALLOW_CAPTURE_BY_NONE\" since=\"29\"/>\n\t\t<field name=\"ALLOW_CAPTURE_BY_SYSTEM\" since=\"29\"/>\n\t\t<field name=\"CONTENT_TYPE_MOVIE\"/>\n\t\t<field name=\"CONTENT_TYPE_MUSIC\"/>\n\t\t<field name=\"CONTENT_TYPE_SONIFICATION\"/>\n\t\t<field name=\"CONTENT_TYPE_SPEECH\"/>\n\t\t<field name=\"CONTENT_TYPE_UNKNOWN\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FLAG_AUDIBILITY_ENFORCED\"/>\n\t\t<field name=\"FLAG_HW_AV_SYNC\"/>\n\t\t<field name=\"FLAG_LOW_LATENCY\" since=\"24\" deprecated=\"26\"/>\n\t\t<field name=\"USAGE_ALARM\"/>\n\t\t<field name=\"USAGE_ASSISTANCE_ACCESSIBILITY\"/>\n\t\t<field name=\"USAGE_ASSISTANCE_NAVIGATION_GUIDANCE\"/>\n\t\t<field name=\"USAGE_ASSISTANCE_SONIFICATION\"/>\n\t\t<field name=\"USAGE_ASSISTANT\" since=\"26\"/>\n\t\t<field name=\"USAGE_GAME\"/>\n\t\t<field name=\"USAGE_MEDIA\"/>\n\t\t<field name=\"USAGE_NOTIFICATION\"/>\n\t\t<field name=\"USAGE_NOTIFICATION_COMMUNICATION_DELAYED\"/>\n\t\t<field name=\"USAGE_NOTIFICATION_COMMUNICATION_INSTANT\"/>\n\t\t<field name=\"USAGE_NOTIFICATION_COMMUNICATION_REQUEST\"/>\n\t\t<field name=\"USAGE_NOTIFICATION_EVENT\"/>\n\t\t<field name=\"USAGE_NOTIFICATION_RINGTONE\"/>\n\t\t<field name=\"USAGE_UNKNOWN\"/>\n\t\t<field name=\"USAGE_VOICE_COMMUNICATION\"/>\n\t\t<field name=\"USAGE_VOICE_COMMUNICATION_SIGNALLING\"/>\n\t</class>\n\t<class name=\"android/media/AudioAttributes$Builder\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/media/AudioAttributes;)V\"/>\n\t\t<method name=\"build()Landroid/media/AudioAttributes;\"/>\n\t\t<method name=\"setAllowedCapturePolicy(I)Landroid/media/AudioAttributes$Builder;\" since=\"29\"/>\n\t\t<method name=\"setContentType(I)Landroid/media/AudioAttributes$Builder;\"/>\n\t\t<method name=\"setFlags(I)Landroid/media/AudioAttributes$Builder;\"/>\n\t\t<method name=\"setHapticChannelsMuted(Z)Landroid/media/AudioAttributes$Builder;\" since=\"29\"/>\n\t\t<method name=\"setLegacyStreamType(I)Landroid/media/AudioAttributes$Builder;\"/>\n\t\t<method name=\"setUsage(I)Landroid/media/AudioAttributes$Builder;\"/>\n\t</class>\n\t<class name=\"android/media/AudioDeviceCallback\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onAudioDevicesAdded([Landroid/media/AudioDeviceInfo;)V\"/>\n\t\t<method name=\"onAudioDevicesRemoved([Landroid/media/AudioDeviceInfo;)V\"/>\n\t</class>\n\t<class name=\"android/media/AudioDeviceInfo\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAddress()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getChannelCounts()[I\"/>\n\t\t<method name=\"getChannelIndexMasks()[I\"/>\n\t\t<method name=\"getChannelMasks()[I\"/>\n\t\t<method name=\"getEncodings()[I\"/>\n\t\t<method name=\"getId()I\"/>\n\t\t<method name=\"getProductName()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getSampleRates()[I\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<method name=\"isSink()Z\"/>\n\t\t<method name=\"isSource()Z\"/>\n\t\t<field name=\"TYPE_AUX_LINE\"/>\n\t\t<field name=\"TYPE_BLUETOOTH_A2DP\"/>\n\t\t<field name=\"TYPE_BLUETOOTH_SCO\"/>\n\t\t<field name=\"TYPE_BUILTIN_EARPIECE\"/>\n\t\t<field name=\"TYPE_BUILTIN_MIC\"/>\n\t\t<field name=\"TYPE_BUILTIN_SPEAKER\"/>\n\t\t<field name=\"TYPE_BUS\" since=\"24\"/>\n\t\t<field name=\"TYPE_DOCK\"/>\n\t\t<field name=\"TYPE_FM\"/>\n\t\t<field name=\"TYPE_FM_TUNER\"/>\n\t\t<field name=\"TYPE_HDMI\"/>\n\t\t<field name=\"TYPE_HDMI_ARC\"/>\n\t\t<field name=\"TYPE_HEARING_AID\" since=\"28\"/>\n\t\t<field name=\"TYPE_IP\"/>\n\t\t<field name=\"TYPE_LINE_ANALOG\"/>\n\t\t<field name=\"TYPE_LINE_DIGITAL\"/>\n\t\t<field name=\"TYPE_TELEPHONY\"/>\n\t\t<field name=\"TYPE_TV_TUNER\"/>\n\t\t<field name=\"TYPE_UNKNOWN\"/>\n\t\t<field name=\"TYPE_USB_ACCESSORY\"/>\n\t\t<field name=\"TYPE_USB_DEVICE\"/>\n\t\t<field name=\"TYPE_USB_HEADSET\" since=\"26\"/>\n\t\t<field name=\"TYPE_WIRED_HEADPHONES\"/>\n\t\t<field name=\"TYPE_WIRED_HEADSET\"/>\n\t</class>\n\t<class name=\"android/media/AudioFocusRequest\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"acceptsDelayedFocusGain()Z\"/>\n\t\t<method name=\"getAudioAttributes()Landroid/media/AudioAttributes;\"/>\n\t\t<method name=\"getFocusGain()I\"/>\n\t\t<method name=\"willPauseWhenDucked()Z\"/>\n\t</class>\n\t<class name=\"android/media/AudioFocusRequest$Builder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/media/AudioFocusRequest;)V\"/>\n\t\t<method name=\"build()Landroid/media/AudioFocusRequest;\"/>\n\t\t<method name=\"setAcceptsDelayedFocusGain(Z)Landroid/media/AudioFocusRequest$Builder;\"/>\n\t\t<method name=\"setAudioAttributes(Landroid/media/AudioAttributes;)Landroid/media/AudioFocusRequest$Builder;\"/>\n\t\t<method name=\"setFocusGain(I)Landroid/media/AudioFocusRequest$Builder;\"/>\n\t\t<method name=\"setForceDucking(Z)Landroid/media/AudioFocusRequest$Builder;\" since=\"28\"/>\n\t\t<method name=\"setOnAudioFocusChangeListener(Landroid/media/AudioManager$OnAudioFocusChangeListener;)Landroid/media/AudioFocusRequest$Builder;\"/>\n\t\t<method name=\"setOnAudioFocusChangeListener(Landroid/media/AudioManager$OnAudioFocusChangeListener;Landroid/os/Handler;)Landroid/media/AudioFocusRequest$Builder;\"/>\n\t\t<method name=\"setWillPauseWhenDucked(Z)Landroid/media/AudioFocusRequest$Builder;\"/>\n\t</class>\n\t<class name=\"android/media/AudioFormat\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\" since=\"24\"/>\n\t\t<method name=\"&lt;init>()V\" removed=\"21\"/>\n\t\t<method name=\"getChannelCount()I\" since=\"23\"/>\n\t\t<method name=\"getChannelIndexMask()I\" since=\"23\"/>\n\t\t<method name=\"getChannelMask()I\" since=\"21\"/>\n\t\t<method name=\"getEncoding()I\" since=\"21\"/>\n\t\t<method name=\"getFrameSizeInBytes()I\" since=\"29\"/>\n\t\t<method name=\"getSampleRate()I\" since=\"21\"/>\n\t\t<field name=\"CHANNEL_CONFIGURATION_DEFAULT\" deprecated=\"15\"/>\n\t\t<field name=\"CHANNEL_CONFIGURATION_INVALID\" deprecated=\"15\"/>\n\t\t<field name=\"CHANNEL_CONFIGURATION_MONO\" deprecated=\"15\"/>\n\t\t<field name=\"CHANNEL_CONFIGURATION_STEREO\" deprecated=\"15\"/>\n\t\t<field name=\"CHANNEL_INVALID\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_IN_BACK\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_IN_BACK_PROCESSED\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_IN_DEFAULT\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_IN_FRONT\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_IN_FRONT_PROCESSED\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_IN_LEFT\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_IN_LEFT_PROCESSED\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_IN_MONO\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_IN_PRESSURE\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_IN_RIGHT\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_IN_RIGHT_PROCESSED\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_IN_STEREO\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_IN_VOICE_DNLINK\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_IN_VOICE_UPLINK\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_IN_X_AXIS\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_IN_Y_AXIS\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_IN_Z_AXIS\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_OUT_5POINT1\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_OUT_7POINT1\" since=\"5\" deprecated=\"23\"/>\n\t\t<field name=\"CHANNEL_OUT_7POINT1_SURROUND\" since=\"23\"/>\n\t\t<field name=\"CHANNEL_OUT_BACK_CENTER\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_OUT_BACK_LEFT\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_OUT_BACK_RIGHT\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_OUT_DEFAULT\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_OUT_FRONT_CENTER\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_OUT_FRONT_LEFT\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_OUT_FRONT_LEFT_OF_CENTER\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_OUT_FRONT_RIGHT\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_OUT_FRONT_RIGHT_OF_CENTER\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_OUT_LOW_FREQUENCY\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_OUT_MONO\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_OUT_QUAD\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_OUT_SIDE_LEFT\" since=\"21\"/>\n\t\t<field name=\"CHANNEL_OUT_SIDE_RIGHT\" since=\"21\"/>\n\t\t<field name=\"CHANNEL_OUT_STEREO\" since=\"5\"/>\n\t\t<field name=\"CHANNEL_OUT_SURROUND\" since=\"5\"/>\n\t\t<field name=\"CREATOR\" since=\"24\"/>\n\t\t<field name=\"ENCODING_AAC_ELD\" since=\"28\"/>\n\t\t<field name=\"ENCODING_AAC_HE_V1\" since=\"28\"/>\n\t\t<field name=\"ENCODING_AAC_HE_V2\" since=\"28\"/>\n\t\t<field name=\"ENCODING_AAC_LC\" since=\"28\"/>\n\t\t<field name=\"ENCODING_AAC_XHE\" since=\"28\"/>\n\t\t<field name=\"ENCODING_AC3\" since=\"21\"/>\n\t\t<field name=\"ENCODING_AC4\" since=\"28\"/>\n\t\t<field name=\"ENCODING_DEFAULT\"/>\n\t\t<field name=\"ENCODING_DOLBY_MAT\" since=\"29\"/>\n\t\t<field name=\"ENCODING_DOLBY_TRUEHD\" since=\"25\"/>\n\t\t<field name=\"ENCODING_DTS\" since=\"23\"/>\n\t\t<field name=\"ENCODING_DTS_HD\" since=\"23\"/>\n\t\t<field name=\"ENCODING_E_AC3\" since=\"21\"/>\n\t\t<field name=\"ENCODING_E_AC3_JOC\" since=\"28\"/>\n\t\t<field name=\"ENCODING_IEC61937\" since=\"24\"/>\n\t\t<field name=\"ENCODING_INVALID\"/>\n\t\t<field name=\"ENCODING_MP3\" since=\"28\"/>\n\t\t<field name=\"ENCODING_OPUS\" since=\"30\"/>\n\t\t<field name=\"ENCODING_PCM_16BIT\"/>\n\t\t<field name=\"ENCODING_PCM_8BIT\"/>\n\t\t<field name=\"ENCODING_PCM_FLOAT\" since=\"21\"/>\n\t\t<field name=\"SAMPLE_RATE_UNSPECIFIED\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/media/AudioFormat$Builder\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/media/AudioFormat;)V\"/>\n\t\t<method name=\"build()Landroid/media/AudioFormat;\"/>\n\t\t<method name=\"setChannelIndexMask(I)Landroid/media/AudioFormat$Builder;\" since=\"23\"/>\n\t\t<method name=\"setChannelMask(I)Landroid/media/AudioFormat$Builder;\"/>\n\t\t<method name=\"setEncoding(I)Landroid/media/AudioFormat$Builder;\"/>\n\t\t<method name=\"setSampleRate(I)Landroid/media/AudioFormat$Builder;\"/>\n\t</class>\n\t<class name=\"android/media/AudioManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"abandonAudioFocus(Landroid/media/AudioManager$OnAudioFocusChangeListener;)I\" since=\"8\" deprecated=\"26\"/>\n\t\t<method name=\"abandonAudioFocusRequest(Landroid/media/AudioFocusRequest;)I\" since=\"26\"/>\n\t\t<method name=\"adjustStreamVolume(III)V\"/>\n\t\t<method name=\"adjustSuggestedStreamVolume(III)V\"/>\n\t\t<method name=\"adjustVolume(II)V\"/>\n\t\t<method name=\"dispatchMediaKeyEvent(Landroid/view/KeyEvent;)V\" since=\"19\"/>\n\t\t<method name=\"generateAudioSessionId()I\" since=\"21\"/>\n\t\t<method name=\"getActivePlaybackConfigurations()Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"getActiveRecordingConfigurations()Ljava/util/List;\" since=\"24\"/>\n\t\t<method name=\"getAllowedCapturePolicy()I\" since=\"29\"/>\n\t\t<method name=\"getDevices(I)[Landroid/media/AudioDeviceInfo;\" since=\"23\"/>\n\t\t<method name=\"getMicrophones()Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"getMode()I\"/>\n\t\t<method name=\"getParameters(Ljava/lang/String;)Ljava/lang/String;\" since=\"5\"/>\n\t\t<method name=\"getProperty(Ljava/lang/String;)Ljava/lang/String;\" since=\"17\"/>\n\t\t<method name=\"getRingerMode()I\"/>\n\t\t<method name=\"getRouting(I)I\" deprecated=\"15\"/>\n\t\t<method name=\"getStreamMaxVolume(I)I\"/>\n\t\t<method name=\"getStreamMinVolume(I)I\" since=\"28\"/>\n\t\t<method name=\"getStreamVolume(I)I\"/>\n\t\t<method name=\"getStreamVolumeDb(III)F\" since=\"28\"/>\n\t\t<method name=\"getVibrateSetting(I)I\" deprecated=\"16\"/>\n\t\t<method name=\"isBluetoothA2dpOn()Z\" since=\"3\" deprecated=\"26\"/>\n\t\t<method name=\"isBluetoothScoAvailableOffCall()Z\" since=\"8\"/>\n\t\t<method name=\"isBluetoothScoOn()Z\"/>\n\t\t<method name=\"isHapticPlaybackSupported()Z\" since=\"29\"/>\n\t\t<method name=\"isMicrophoneMute()Z\"/>\n\t\t<method name=\"isMusicActive()Z\"/>\n\t\t<method name=\"isOffloadedPlaybackSupported(Landroid/media/AudioFormat;Landroid/media/AudioAttributes;)Z\" since=\"29\"/>\n\t\t<method name=\"isSpeakerphoneOn()Z\"/>\n\t\t<method name=\"isStreamMute(I)Z\" since=\"23\"/>\n\t\t<method name=\"isVolumeFixed()Z\" since=\"21\"/>\n\t\t<method name=\"isWiredHeadsetOn()Z\" since=\"5\" deprecated=\"15\"/>\n\t\t<method name=\"loadSoundEffects()V\"/>\n\t\t<method name=\"playSoundEffect(I)V\"/>\n\t\t<method name=\"playSoundEffect(IF)V\" since=\"3\"/>\n\t\t<method name=\"registerAudioDeviceCallback(Landroid/media/AudioDeviceCallback;Landroid/os/Handler;)V\" since=\"23\"/>\n\t\t<method name=\"registerAudioPlaybackCallback(Landroid/media/AudioManager$AudioPlaybackCallback;Landroid/os/Handler;)V\" since=\"26\"/>\n\t\t<method name=\"registerAudioRecordingCallback(Landroid/media/AudioManager$AudioRecordingCallback;Landroid/os/Handler;)V\" since=\"24\"/>\n\t\t<method name=\"registerMediaButtonEventReceiver(Landroid/app/PendingIntent;)V\" since=\"18\" deprecated=\"21\"/>\n\t\t<method name=\"registerMediaButtonEventReceiver(Landroid/content/ComponentName;)V\" since=\"8\" deprecated=\"21\"/>\n\t\t<method name=\"registerRemoteControlClient(Landroid/media/RemoteControlClient;)V\" since=\"14\" deprecated=\"21\"/>\n\t\t<method name=\"registerRemoteController(Landroid/media/RemoteController;)Z\" since=\"19\" deprecated=\"21\"/>\n\t\t<method name=\"requestAudioFocus(Landroid/media/AudioFocusRequest;)I\" since=\"26\"/>\n\t\t<method name=\"requestAudioFocus(Landroid/media/AudioManager$OnAudioFocusChangeListener;II)I\" since=\"8\" deprecated=\"26\"/>\n\t\t<method name=\"setAllowedCapturePolicy(I)V\" since=\"29\"/>\n\t\t<method name=\"setBluetoothA2dpOn(Z)V\" since=\"3\" deprecated=\"15\"/>\n\t\t<method name=\"setBluetoothScoOn(Z)V\"/>\n\t\t<method name=\"setMicrophoneMute(Z)V\"/>\n\t\t<method name=\"setMode(I)V\"/>\n\t\t<method name=\"setParameters(Ljava/lang/String;)V\" since=\"5\"/>\n\t\t<method name=\"setRingerMode(I)V\"/>\n\t\t<method name=\"setRouting(III)V\" deprecated=\"15\"/>\n\t\t<method name=\"setSpeakerphoneOn(Z)V\"/>\n\t\t<method name=\"setStreamMute(IZ)V\" deprecated=\"23\"/>\n\t\t<method name=\"setStreamSolo(IZ)V\" deprecated=\"23\"/>\n\t\t<method name=\"setStreamVolume(III)V\"/>\n\t\t<method name=\"setVibrateSetting(II)V\" deprecated=\"16\"/>\n\t\t<method name=\"setWiredHeadsetOn(Z)V\" since=\"5\" deprecated=\"15\"/>\n\t\t<method name=\"shouldVibrate(I)Z\" deprecated=\"16\"/>\n\t\t<method name=\"startBluetoothSco()V\" since=\"8\"/>\n\t\t<method name=\"stopBluetoothSco()V\" since=\"8\"/>\n\t\t<method name=\"unloadSoundEffects()V\"/>\n\t\t<method name=\"unregisterAudioDeviceCallback(Landroid/media/AudioDeviceCallback;)V\" since=\"23\"/>\n\t\t<method name=\"unregisterAudioPlaybackCallback(Landroid/media/AudioManager$AudioPlaybackCallback;)V\" since=\"26\"/>\n\t\t<method name=\"unregisterAudioRecordingCallback(Landroid/media/AudioManager$AudioRecordingCallback;)V\" since=\"24\"/>\n\t\t<method name=\"unregisterMediaButtonEventReceiver(Landroid/app/PendingIntent;)V\" since=\"18\" deprecated=\"21\"/>\n\t\t<method name=\"unregisterMediaButtonEventReceiver(Landroid/content/ComponentName;)V\" since=\"8\" deprecated=\"21\"/>\n\t\t<method name=\"unregisterRemoteControlClient(Landroid/media/RemoteControlClient;)V\" since=\"14\" deprecated=\"21\"/>\n\t\t<method name=\"unregisterRemoteController(Landroid/media/RemoteController;)V\" since=\"19\" deprecated=\"21\"/>\n\t\t<field name=\"ACTION_AUDIO_BECOMING_NOISY\" since=\"3\"/>\n\t\t<field name=\"ACTION_HDMI_AUDIO_PLUG\" since=\"21\"/>\n\t\t<field name=\"ACTION_HEADSET_PLUG\" since=\"21\"/>\n\t\t<field name=\"ACTION_MICROPHONE_MUTE_CHANGED\" since=\"28\"/>\n\t\t<field name=\"ACTION_SCO_AUDIO_STATE_CHANGED\" since=\"8\" deprecated=\"15\"/>\n\t\t<field name=\"ACTION_SCO_AUDIO_STATE_UPDATED\" since=\"14\"/>\n\t\t<field name=\"ACTION_SPEAKERPHONE_STATE_CHANGED\" since=\"29\"/>\n\t\t<field name=\"ADJUST_LOWER\"/>\n\t\t<field name=\"ADJUST_MUTE\" since=\"23\"/>\n\t\t<field name=\"ADJUST_RAISE\"/>\n\t\t<field name=\"ADJUST_SAME\"/>\n\t\t<field name=\"ADJUST_TOGGLE_MUTE\" since=\"23\"/>\n\t\t<field name=\"ADJUST_UNMUTE\" since=\"23\"/>\n\t\t<field name=\"AUDIOFOCUS_GAIN\" since=\"8\"/>\n\t\t<field name=\"AUDIOFOCUS_GAIN_TRANSIENT\" since=\"8\"/>\n\t\t<field name=\"AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE\" since=\"19\"/>\n\t\t<field name=\"AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK\" since=\"8\"/>\n\t\t<field name=\"AUDIOFOCUS_LOSS\" since=\"8\"/>\n\t\t<field name=\"AUDIOFOCUS_LOSS_TRANSIENT\" since=\"8\"/>\n\t\t<field name=\"AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK\" since=\"8\"/>\n\t\t<field name=\"AUDIOFOCUS_NONE\" since=\"26\"/>\n\t\t<field name=\"AUDIOFOCUS_REQUEST_DELAYED\" since=\"26\"/>\n\t\t<field name=\"AUDIOFOCUS_REQUEST_FAILED\" since=\"8\"/>\n\t\t<field name=\"AUDIOFOCUS_REQUEST_GRANTED\" since=\"8\"/>\n\t\t<field name=\"AUDIO_SESSION_ID_GENERATE\" since=\"21\"/>\n\t\t<field name=\"ERROR\" since=\"21\"/>\n\t\t<field name=\"ERROR_DEAD_OBJECT\" since=\"21\"/>\n\t\t<field name=\"EXTRA_AUDIO_PLUG_STATE\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ENCODINGS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_MAX_CHANNEL_COUNT\" since=\"21\"/>\n\t\t<field name=\"EXTRA_RINGER_MODE\"/>\n\t\t<field name=\"EXTRA_SCO_AUDIO_PREVIOUS_STATE\" since=\"14\"/>\n\t\t<field name=\"EXTRA_SCO_AUDIO_STATE\" since=\"8\"/>\n\t\t<field name=\"EXTRA_VIBRATE_SETTING\" deprecated=\"16\"/>\n\t\t<field name=\"EXTRA_VIBRATE_TYPE\" deprecated=\"16\"/>\n\t\t<field name=\"FLAG_ALLOW_RINGER_MODES\"/>\n\t\t<field name=\"FLAG_PLAY_SOUND\"/>\n\t\t<field name=\"FLAG_REMOVE_SOUND_AND_VIBRATE\"/>\n\t\t<field name=\"FLAG_SHOW_UI\"/>\n\t\t<field name=\"FLAG_VIBRATE\"/>\n\t\t<field name=\"FX_FOCUS_NAVIGATION_DOWN\"/>\n\t\t<field name=\"FX_FOCUS_NAVIGATION_LEFT\"/>\n\t\t<field name=\"FX_FOCUS_NAVIGATION_RIGHT\"/>\n\t\t<field name=\"FX_FOCUS_NAVIGATION_UP\"/>\n\t\t<field name=\"FX_KEYPRESS_DELETE\" since=\"3\"/>\n\t\t<field name=\"FX_KEYPRESS_INVALID\" since=\"19\"/>\n\t\t<field name=\"FX_KEYPRESS_RETURN\" since=\"3\"/>\n\t\t<field name=\"FX_KEYPRESS_SPACEBAR\" since=\"3\"/>\n\t\t<field name=\"FX_KEYPRESS_STANDARD\" since=\"3\"/>\n\t\t<field name=\"FX_KEY_CLICK\"/>\n\t\t<field name=\"GET_DEVICES_ALL\" since=\"23\"/>\n\t\t<field name=\"GET_DEVICES_INPUTS\" since=\"23\"/>\n\t\t<field name=\"GET_DEVICES_OUTPUTS\" since=\"23\"/>\n\t\t<field name=\"MODE_CURRENT\"/>\n\t\t<field name=\"MODE_INVALID\"/>\n\t\t<field name=\"MODE_IN_CALL\"/>\n\t\t<field name=\"MODE_IN_COMMUNICATION\" since=\"11\"/>\n\t\t<field name=\"MODE_NORMAL\"/>\n\t\t<field name=\"MODE_RINGTONE\"/>\n\t\t<field name=\"NUM_STREAMS\" deprecated=\"15\"/>\n\t\t<field name=\"PROPERTY_OUTPUT_FRAMES_PER_BUFFER\" since=\"17\"/>\n\t\t<field name=\"PROPERTY_OUTPUT_SAMPLE_RATE\" since=\"17\"/>\n\t\t<field name=\"PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED\" since=\"24\"/>\n\t\t<field name=\"PROPERTY_SUPPORT_MIC_NEAR_ULTRASOUND\" since=\"23\"/>\n\t\t<field name=\"PROPERTY_SUPPORT_SPEAKER_NEAR_ULTRASOUND\" since=\"23\"/>\n\t\t<field name=\"RINGER_MODE_CHANGED_ACTION\"/>\n\t\t<field name=\"RINGER_MODE_NORMAL\"/>\n\t\t<field name=\"RINGER_MODE_SILENT\"/>\n\t\t<field name=\"RINGER_MODE_VIBRATE\"/>\n\t\t<field name=\"ROUTE_ALL\" deprecated=\"15\"/>\n\t\t<field name=\"ROUTE_BLUETOOTH\" deprecated=\"15\"/>\n\t\t<field name=\"ROUTE_BLUETOOTH_A2DP\" since=\"3\" deprecated=\"15\"/>\n\t\t<field name=\"ROUTE_BLUETOOTH_SCO\" since=\"3\" deprecated=\"15\"/>\n\t\t<field name=\"ROUTE_EARPIECE\" deprecated=\"15\"/>\n\t\t<field name=\"ROUTE_HEADSET\" deprecated=\"15\"/>\n\t\t<field name=\"ROUTE_SPEAKER\" deprecated=\"15\"/>\n\t\t<field name=\"SCO_AUDIO_STATE_CONNECTED\" since=\"8\"/>\n\t\t<field name=\"SCO_AUDIO_STATE_CONNECTING\" since=\"14\"/>\n\t\t<field name=\"SCO_AUDIO_STATE_DISCONNECTED\" since=\"8\"/>\n\t\t<field name=\"SCO_AUDIO_STATE_ERROR\" since=\"8\"/>\n\t\t<field name=\"STREAM_ACCESSIBILITY\" since=\"26\"/>\n\t\t<field name=\"STREAM_ALARM\"/>\n\t\t<field name=\"STREAM_DTMF\" since=\"5\"/>\n\t\t<field name=\"STREAM_MUSIC\"/>\n\t\t<field name=\"STREAM_NOTIFICATION\" since=\"3\"/>\n\t\t<field name=\"STREAM_RING\"/>\n\t\t<field name=\"STREAM_SYSTEM\"/>\n\t\t<field name=\"STREAM_VOICE_CALL\"/>\n\t\t<field name=\"USE_DEFAULT_STREAM_TYPE\"/>\n\t\t<field name=\"VIBRATE_SETTING_CHANGED_ACTION\" deprecated=\"16\"/>\n\t\t<field name=\"VIBRATE_SETTING_OFF\" deprecated=\"16\"/>\n\t\t<field name=\"VIBRATE_SETTING_ON\" deprecated=\"16\"/>\n\t\t<field name=\"VIBRATE_SETTING_ONLY_SILENT\" deprecated=\"16\"/>\n\t\t<field name=\"VIBRATE_TYPE_NOTIFICATION\" deprecated=\"16\"/>\n\t\t<field name=\"VIBRATE_TYPE_RINGER\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/media/AudioManager$AudioPlaybackCallback\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onPlaybackConfigChanged(Ljava/util/List;)V\"/>\n\t</class>\n\t<class name=\"android/media/AudioManager$AudioRecordingCallback\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onRecordingConfigChanged(Ljava/util/List;)V\"/>\n\t</class>\n\t<class name=\"android/media/AudioManager$OnAudioFocusChangeListener\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onAudioFocusChange(I)V\"/>\n\t</class>\n\t<class name=\"android/media/AudioPlaybackCaptureConfiguration\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getExcludeUids()[I\"/>\n\t\t<method name=\"getExcludeUsages()[I\"/>\n\t\t<method name=\"getMatchingUids()[I\"/>\n\t\t<method name=\"getMatchingUsages()[I\"/>\n\t\t<method name=\"getMediaProjection()Landroid/media/projection/MediaProjection;\"/>\n\t</class>\n\t<class name=\"android/media/AudioPlaybackCaptureConfiguration$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/media/projection/MediaProjection;)V\"/>\n\t\t<method name=\"addMatchingUid(I)Landroid/media/AudioPlaybackCaptureConfiguration$Builder;\"/>\n\t\t<method name=\"addMatchingUsage(I)Landroid/media/AudioPlaybackCaptureConfiguration$Builder;\"/>\n\t\t<method name=\"build()Landroid/media/AudioPlaybackCaptureConfiguration;\"/>\n\t\t<method name=\"excludeUid(I)Landroid/media/AudioPlaybackCaptureConfiguration$Builder;\"/>\n\t\t<method name=\"excludeUsage(I)Landroid/media/AudioPlaybackCaptureConfiguration$Builder;\"/>\n\t</class>\n\t<class name=\"android/media/AudioPlaybackConfiguration\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getAudioAttributes()Landroid/media/AudioAttributes;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/media/AudioPresentation\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getLabels()Ljava/util/Map;\"/>\n\t\t<method name=\"getLocale()Ljava/util/Locale;\"/>\n\t\t<method name=\"getMasteringIndication()I\"/>\n\t\t<method name=\"getPresentationId()I\" since=\"29\"/>\n\t\t<method name=\"getProgramId()I\" since=\"29\"/>\n\t\t<method name=\"hasAudioDescription()Z\"/>\n\t\t<method name=\"hasDialogueEnhancement()Z\"/>\n\t\t<method name=\"hasSpokenSubtitles()Z\"/>\n\t\t<field name=\"MASTERED_FOR_3D\"/>\n\t\t<field name=\"MASTERED_FOR_HEADPHONE\"/>\n\t\t<field name=\"MASTERED_FOR_STEREO\"/>\n\t\t<field name=\"MASTERED_FOR_SURROUND\"/>\n\t\t<field name=\"MASTERING_NOT_INDICATED\"/>\n\t</class>\n\t<class name=\"android/media/AudioPresentation$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"build()Landroid/media/AudioPresentation;\"/>\n\t\t<method name=\"setHasAudioDescription(Z)Landroid/media/AudioPresentation$Builder;\"/>\n\t\t<method name=\"setHasDialogueEnhancement(Z)Landroid/media/AudioPresentation$Builder;\"/>\n\t\t<method name=\"setHasSpokenSubtitles(Z)Landroid/media/AudioPresentation$Builder;\"/>\n\t\t<method name=\"setLabels(Ljava/util/Map;)Landroid/media/AudioPresentation$Builder;\"/>\n\t\t<method name=\"setLocale(Landroid/icu/util/ULocale;)Landroid/media/AudioPresentation$Builder;\"/>\n\t\t<method name=\"setMasteringIndication(I)Landroid/media/AudioPresentation$Builder;\"/>\n\t\t<method name=\"setProgramId(I)Landroid/media/AudioPresentation$Builder;\"/>\n\t</class>\n\t<class name=\"android/media/AudioRecord\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/media/AudioRecordingMonitor\" since=\"29\"/>\n\t\t<implements name=\"android/media/AudioRouting\" since=\"24\"/>\n\t\t<implements name=\"android/media/MicrophoneDirection\" since=\"29\"/>\n\t\t<method name=\"&lt;init>(IIIII)V\"/>\n\t\t<method name=\"addOnRoutingChangedListener(Landroid/media/AudioRecord$OnRoutingChangedListener;Landroid/os/Handler;)V\" since=\"23\" deprecated=\"24\"/>\n\t\t<method name=\"getActiveMicrophones()Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"getAudioFormat()I\"/>\n\t\t<method name=\"getAudioSessionId()I\" since=\"16\"/>\n\t\t<method name=\"getAudioSource()I\"/>\n\t\t<method name=\"getBufferSizeInFrames()I\" since=\"23\"/>\n\t\t<method name=\"getChannelConfiguration()I\"/>\n\t\t<method name=\"getChannelCount()I\"/>\n\t\t<method name=\"getFormat()Landroid/media/AudioFormat;\" since=\"23\"/>\n\t\t<method name=\"getMetrics()Landroid/os/PersistableBundle;\" since=\"28\"/>\n\t\t<method name=\"getMinBufferSize(III)I\"/>\n\t\t<method name=\"getNotificationMarkerPosition()I\"/>\n\t\t<method name=\"getPositionNotificationPeriod()I\"/>\n\t\t<method name=\"getPreferredDevice()Landroid/media/AudioDeviceInfo;\" since=\"23\"/>\n\t\t<method name=\"getRecordingState()I\"/>\n\t\t<method name=\"getRoutedDevice()Landroid/media/AudioDeviceInfo;\" since=\"23\"/>\n\t\t<method name=\"getSampleRate()I\"/>\n\t\t<method name=\"getState()I\"/>\n\t\t<method name=\"getTimestamp(Landroid/media/AudioTimestamp;I)I\" since=\"24\"/>\n\t\t<method name=\"read(Ljava/nio/ByteBuffer;I)I\"/>\n\t\t<method name=\"read(Ljava/nio/ByteBuffer;II)I\" since=\"23\"/>\n\t\t<method name=\"read([BII)I\"/>\n\t\t<method name=\"read([BIII)I\" since=\"23\"/>\n\t\t<method name=\"read([FIII)I\" since=\"23\"/>\n\t\t<method name=\"read([SII)I\"/>\n\t\t<method name=\"read([SIII)I\" since=\"23\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"removeOnRoutingChangedListener(Landroid/media/AudioRecord$OnRoutingChangedListener;)V\" since=\"23\" deprecated=\"24\"/>\n\t\t<method name=\"setNotificationMarkerPosition(I)I\"/>\n\t\t<method name=\"setPositionNotificationPeriod(I)I\"/>\n\t\t<method name=\"setPreferredDevice(Landroid/media/AudioDeviceInfo;)Z\" since=\"23\"/>\n\t\t<method name=\"setRecordPositionUpdateListener(Landroid/media/AudioRecord$OnRecordPositionUpdateListener;)V\"/>\n\t\t<method name=\"setRecordPositionUpdateListener(Landroid/media/AudioRecord$OnRecordPositionUpdateListener;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"startRecording()V\"/>\n\t\t<method name=\"startRecording(Landroid/media/MediaSyncEvent;)V\" since=\"16\"/>\n\t\t<method name=\"stop()V\"/>\n\t\t<field name=\"ERROR\"/>\n\t\t<field name=\"ERROR_BAD_VALUE\"/>\n\t\t<field name=\"ERROR_DEAD_OBJECT\" since=\"24\"/>\n\t\t<field name=\"ERROR_INVALID_OPERATION\"/>\n\t\t<field name=\"READ_BLOCKING\" since=\"23\"/>\n\t\t<field name=\"READ_NON_BLOCKING\" since=\"23\"/>\n\t\t<field name=\"RECORDSTATE_RECORDING\"/>\n\t\t<field name=\"RECORDSTATE_STOPPED\"/>\n\t\t<field name=\"STATE_INITIALIZED\"/>\n\t\t<field name=\"STATE_UNINITIALIZED\"/>\n\t\t<field name=\"SUCCESS\"/>\n\t</class>\n\t<class name=\"android/media/AudioRecord$Builder\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/media/AudioRecord;\"/>\n\t\t<method name=\"setAudioFormat(Landroid/media/AudioFormat;)Landroid/media/AudioRecord$Builder;\"/>\n\t\t<method name=\"setAudioPlaybackCaptureConfig(Landroid/media/AudioPlaybackCaptureConfiguration;)Landroid/media/AudioRecord$Builder;\" since=\"29\"/>\n\t\t<method name=\"setAudioSource(I)Landroid/media/AudioRecord$Builder;\"/>\n\t\t<method name=\"setBufferSizeInBytes(I)Landroid/media/AudioRecord$Builder;\"/>\n\t</class>\n\t<class name=\"android/media/AudioRecord$MetricsConstants\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CHANNELS\"/>\n\t\t<field name=\"ENCODING\"/>\n\t\t<field name=\"LATENCY\" deprecated=\"29\"/>\n\t\t<field name=\"SAMPLERATE\"/>\n\t\t<field name=\"SOURCE\"/>\n\t</class>\n\t<class name=\"android/media/AudioRecord$OnRecordPositionUpdateListener\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onMarkerReached(Landroid/media/AudioRecord;)V\"/>\n\t\t<method name=\"onPeriodicNotification(Landroid/media/AudioRecord;)V\"/>\n\t</class>\n\t<class name=\"android/media/AudioRecord$OnRoutingChangedListener\" since=\"23\" deprecated=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/media/AudioRouting$OnRoutingChangedListener\" since=\"24\"/>\n\t\t<method name=\"onRoutingChanged(Landroid/media/AudioRecord;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/media/AudioRecordingConfiguration\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getAudioDevice()Landroid/media/AudioDeviceInfo;\"/>\n\t\t<method name=\"getAudioSource()I\" since=\"29\"/>\n\t\t<method name=\"getClientAudioSessionId()I\"/>\n\t\t<method name=\"getClientAudioSource()I\"/>\n\t\t<method name=\"getClientEffects()Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"getClientFormat()Landroid/media/AudioFormat;\"/>\n\t\t<method name=\"getEffects()Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"getFormat()Landroid/media/AudioFormat;\"/>\n\t\t<method name=\"isClientSilenced()Z\" since=\"29\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/media/AudioRecordingMonitor\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getActiveRecordingConfiguration()Landroid/media/AudioRecordingConfiguration;\"/>\n\t\t<method name=\"registerAudioRecordingCallback(Ljava/util/concurrent/Executor;Landroid/media/AudioManager$AudioRecordingCallback;)V\"/>\n\t\t<method name=\"unregisterAudioRecordingCallback(Landroid/media/AudioManager$AudioRecordingCallback;)V\"/>\n\t</class>\n\t<class name=\"android/media/AudioRouting\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addOnRoutingChangedListener(Landroid/media/AudioRouting$OnRoutingChangedListener;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"getPreferredDevice()Landroid/media/AudioDeviceInfo;\"/>\n\t\t<method name=\"getRoutedDevice()Landroid/media/AudioDeviceInfo;\"/>\n\t\t<method name=\"removeOnRoutingChangedListener(Landroid/media/AudioRouting$OnRoutingChangedListener;)V\"/>\n\t\t<method name=\"setPreferredDevice(Landroid/media/AudioDeviceInfo;)Z\"/>\n\t</class>\n\t<class name=\"android/media/AudioRouting$OnRoutingChangedListener\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onRoutingChanged(Landroid/media/AudioRouting;)V\"/>\n\t</class>\n\t<class name=\"android/media/AudioTimestamp\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"TIMEBASE_BOOTTIME\" since=\"24\"/>\n\t\t<field name=\"TIMEBASE_MONOTONIC\" since=\"24\"/>\n\t\t<field name=\"framePosition\"/>\n\t\t<field name=\"nanoTime\"/>\n\t</class>\n\t<class name=\"android/media/AudioTrack\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/media/AudioRouting\" since=\"24\"/>\n\t\t<implements name=\"android/media/VolumeAutomation\" since=\"26\"/>\n\t\t<method name=\"&lt;init>(IIIIII)V\" deprecated=\"26\"/>\n\t\t<method name=\"&lt;init>(IIIIIII)V\" since=\"9\" deprecated=\"26\"/>\n\t\t<method name=\"&lt;init>(Landroid/media/AudioAttributes;Landroid/media/AudioFormat;III)V\" since=\"21\"/>\n\t\t<method name=\"addOnRoutingChangedListener(Landroid/media/AudioTrack$OnRoutingChangedListener;Landroid/os/Handler;)V\" since=\"23\" deprecated=\"24\"/>\n\t\t<method name=\"attachAuxEffect(I)I\" since=\"9\"/>\n\t\t<method name=\"flush()V\"/>\n\t\t<method name=\"getAudioAttributes()Landroid/media/AudioAttributes;\" since=\"29\"/>\n\t\t<method name=\"getAudioFormat()I\"/>\n\t\t<method name=\"getAudioSessionId()I\" since=\"9\"/>\n\t\t<method name=\"getBufferCapacityInFrames()I\" since=\"24\"/>\n\t\t<method name=\"getBufferSizeInFrames()I\" since=\"23\"/>\n\t\t<method name=\"getChannelConfiguration()I\"/>\n\t\t<method name=\"getChannelCount()I\"/>\n\t\t<method name=\"getFormat()Landroid/media/AudioFormat;\" since=\"23\"/>\n\t\t<method name=\"getMaxVolume()F\"/>\n\t\t<method name=\"getMetrics()Landroid/os/PersistableBundle;\" since=\"28\"/>\n\t\t<method name=\"getMinBufferSize(III)I\"/>\n\t\t<method name=\"getMinVolume()F\"/>\n\t\t<method name=\"getNativeFrameCount()I\" deprecated=\"19\"/>\n\t\t<method name=\"getNativeOutputSampleRate(I)I\"/>\n\t\t<method name=\"getNotificationMarkerPosition()I\"/>\n\t\t<method name=\"getOffloadDelay()I\" since=\"29\"/>\n\t\t<method name=\"getOffloadPadding()I\" since=\"29\"/>\n\t\t<method name=\"getPerformanceMode()I\" since=\"26\"/>\n\t\t<method name=\"getPlayState()I\"/>\n\t\t<method name=\"getPlaybackHeadPosition()I\"/>\n\t\t<method name=\"getPlaybackParams()Landroid/media/PlaybackParams;\" since=\"23\"/>\n\t\t<method name=\"getPlaybackRate()I\"/>\n\t\t<method name=\"getPositionNotificationPeriod()I\"/>\n\t\t<method name=\"getPreferredDevice()Landroid/media/AudioDeviceInfo;\" since=\"23\"/>\n\t\t<method name=\"getRoutedDevice()Landroid/media/AudioDeviceInfo;\" since=\"23\"/>\n\t\t<method name=\"getSampleRate()I\"/>\n\t\t<method name=\"getState()I\"/>\n\t\t<method name=\"getStreamType()I\"/>\n\t\t<method name=\"getTimestamp(Landroid/media/AudioTimestamp;)Z\" since=\"19\"/>\n\t\t<method name=\"getUnderrunCount()I\" since=\"24\"/>\n\t\t<method name=\"isDirectPlaybackSupported(Landroid/media/AudioFormat;Landroid/media/AudioAttributes;)Z\" since=\"29\"/>\n\t\t<method name=\"isOffloadedPlayback()Z\" since=\"29\"/>\n\t\t<method name=\"pause()V\"/>\n\t\t<method name=\"play()V\"/>\n\t\t<method name=\"registerStreamEventCallback(Ljava/util/concurrent/Executor;Landroid/media/AudioTrack$StreamEventCallback;)V\" since=\"29\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"reloadStaticData()I\"/>\n\t\t<method name=\"removeOnRoutingChangedListener(Landroid/media/AudioTrack$OnRoutingChangedListener;)V\" since=\"23\" deprecated=\"24\"/>\n\t\t<method name=\"setAuxEffectSendLevel(F)I\" since=\"9\"/>\n\t\t<method name=\"setBufferSizeInFrames(I)I\" since=\"24\"/>\n\t\t<method name=\"setLoopPoints(III)I\"/>\n\t\t<method name=\"setNotificationMarkerPosition(I)I\"/>\n\t\t<method name=\"setOffloadDelayPadding(II)V\" since=\"29\"/>\n\t\t<method name=\"setOffloadEndOfStream()V\" since=\"29\"/>\n\t\t<method name=\"setPlaybackHeadPosition(I)I\"/>\n\t\t<method name=\"setPlaybackParams(Landroid/media/PlaybackParams;)V\" since=\"23\"/>\n\t\t<method name=\"setPlaybackPositionUpdateListener(Landroid/media/AudioTrack$OnPlaybackPositionUpdateListener;)V\"/>\n\t\t<method name=\"setPlaybackPositionUpdateListener(Landroid/media/AudioTrack$OnPlaybackPositionUpdateListener;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"setPlaybackRate(I)I\"/>\n\t\t<method name=\"setPositionNotificationPeriod(I)I\"/>\n\t\t<method name=\"setPreferredDevice(Landroid/media/AudioDeviceInfo;)Z\" since=\"23\"/>\n\t\t<method name=\"setPresentation(Landroid/media/AudioPresentation;)I\" since=\"28\"/>\n\t\t<method name=\"setState(I)V\" deprecated=\"19\"/>\n\t\t<method name=\"setStereoVolume(FF)I\" deprecated=\"21\"/>\n\t\t<method name=\"setVolume(F)I\" since=\"21\"/>\n\t\t<method name=\"stop()V\"/>\n\t\t<method name=\"unregisterStreamEventCallback(Landroid/media/AudioTrack$StreamEventCallback;)V\" since=\"29\"/>\n\t\t<method name=\"write(Ljava/nio/ByteBuffer;II)I\" since=\"21\"/>\n\t\t<method name=\"write(Ljava/nio/ByteBuffer;IIJ)I\" since=\"23\"/>\n\t\t<method name=\"write([BII)I\"/>\n\t\t<method name=\"write([BIII)I\" since=\"23\"/>\n\t\t<method name=\"write([FIII)I\" since=\"21\"/>\n\t\t<method name=\"write([SII)I\"/>\n\t\t<method name=\"write([SIII)I\" since=\"23\"/>\n\t\t<field name=\"ERROR\"/>\n\t\t<field name=\"ERROR_BAD_VALUE\"/>\n\t\t<field name=\"ERROR_DEAD_OBJECT\" since=\"24\"/>\n\t\t<field name=\"ERROR_INVALID_OPERATION\"/>\n\t\t<field name=\"MODE_STATIC\"/>\n\t\t<field name=\"MODE_STREAM\"/>\n\t\t<field name=\"PERFORMANCE_MODE_LOW_LATENCY\" since=\"26\"/>\n\t\t<field name=\"PERFORMANCE_MODE_NONE\" since=\"26\"/>\n\t\t<field name=\"PERFORMANCE_MODE_POWER_SAVING\" since=\"26\"/>\n\t\t<field name=\"PLAYSTATE_PAUSED\"/>\n\t\t<field name=\"PLAYSTATE_PLAYING\"/>\n\t\t<field name=\"PLAYSTATE_STOPPED\"/>\n\t\t<field name=\"STATE_INITIALIZED\"/>\n\t\t<field name=\"STATE_NO_STATIC_DATA\"/>\n\t\t<field name=\"STATE_UNINITIALIZED\"/>\n\t\t<field name=\"SUCCESS\"/>\n\t\t<field name=\"WRITE_BLOCKING\" since=\"21\"/>\n\t\t<field name=\"WRITE_NON_BLOCKING\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/media/AudioTrack$Builder\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/media/AudioTrack;\"/>\n\t\t<method name=\"setAudioAttributes(Landroid/media/AudioAttributes;)Landroid/media/AudioTrack$Builder;\"/>\n\t\t<method name=\"setAudioFormat(Landroid/media/AudioFormat;)Landroid/media/AudioTrack$Builder;\"/>\n\t\t<method name=\"setBufferSizeInBytes(I)Landroid/media/AudioTrack$Builder;\"/>\n\t\t<method name=\"setOffloadedPlayback(Z)Landroid/media/AudioTrack$Builder;\" since=\"29\"/>\n\t\t<method name=\"setPerformanceMode(I)Landroid/media/AudioTrack$Builder;\" since=\"26\"/>\n\t\t<method name=\"setSessionId(I)Landroid/media/AudioTrack$Builder;\"/>\n\t\t<method name=\"setTransferMode(I)Landroid/media/AudioTrack$Builder;\"/>\n\t</class>\n\t<class name=\"android/media/AudioTrack$MetricsConstants\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CHANNELMASK\" deprecated=\"29\"/>\n\t\t<field name=\"CONTENTTYPE\"/>\n\t\t<field name=\"SAMPLERATE\" deprecated=\"29\"/>\n\t\t<field name=\"STREAMTYPE\"/>\n\t\t<field name=\"USAGE\"/>\n\t</class>\n\t<class name=\"android/media/AudioTrack$OnPlaybackPositionUpdateListener\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onMarkerReached(Landroid/media/AudioTrack;)V\"/>\n\t\t<method name=\"onPeriodicNotification(Landroid/media/AudioTrack;)V\"/>\n\t</class>\n\t<class name=\"android/media/AudioTrack$OnRoutingChangedListener\" since=\"23\" deprecated=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/media/AudioRouting$OnRoutingChangedListener\" since=\"24\"/>\n\t\t<method name=\"onRoutingChanged(Landroid/media/AudioTrack;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/media/AudioTrack$StreamEventCallback\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onDataRequest(Landroid/media/AudioTrack;I)V\"/>\n\t\t<method name=\"onPresentationEnded(Landroid/media/AudioTrack;)V\"/>\n\t\t<method name=\"onTearDown(Landroid/media/AudioTrack;)V\"/>\n\t</class>\n\t<class name=\"android/media/CamcorderProfile\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"get(I)Landroid/media/CamcorderProfile;\"/>\n\t\t<method name=\"get(II)Landroid/media/CamcorderProfile;\" since=\"9\"/>\n\t\t<method name=\"hasProfile(I)Z\" since=\"11\"/>\n\t\t<method name=\"hasProfile(II)Z\" since=\"11\"/>\n\t\t<field name=\"QUALITY_1080P\" since=\"11\"/>\n\t\t<field name=\"QUALITY_2160P\" since=\"21\"/>\n\t\t<field name=\"QUALITY_480P\" since=\"11\"/>\n\t\t<field name=\"QUALITY_720P\" since=\"11\"/>\n\t\t<field name=\"QUALITY_CIF\" since=\"11\"/>\n\t\t<field name=\"QUALITY_HIGH\"/>\n\t\t<field name=\"QUALITY_HIGH_SPEED_1080P\" since=\"21\"/>\n\t\t<field name=\"QUALITY_HIGH_SPEED_2160P\" since=\"21\"/>\n\t\t<field name=\"QUALITY_HIGH_SPEED_480P\" since=\"21\"/>\n\t\t<field name=\"QUALITY_HIGH_SPEED_720P\" since=\"21\"/>\n\t\t<field name=\"QUALITY_HIGH_SPEED_HIGH\" since=\"21\"/>\n\t\t<field name=\"QUALITY_HIGH_SPEED_LOW\" since=\"21\"/>\n\t\t<field name=\"QUALITY_LOW\"/>\n\t\t<field name=\"QUALITY_QCIF\" since=\"11\"/>\n\t\t<field name=\"QUALITY_QVGA\" since=\"15\"/>\n\t\t<field name=\"QUALITY_TIME_LAPSE_1080P\" since=\"11\"/>\n\t\t<field name=\"QUALITY_TIME_LAPSE_2160P\" since=\"21\"/>\n\t\t<field name=\"QUALITY_TIME_LAPSE_480P\" since=\"11\"/>\n\t\t<field name=\"QUALITY_TIME_LAPSE_720P\" since=\"11\"/>\n\t\t<field name=\"QUALITY_TIME_LAPSE_CIF\" since=\"11\"/>\n\t\t<field name=\"QUALITY_TIME_LAPSE_HIGH\" since=\"11\"/>\n\t\t<field name=\"QUALITY_TIME_LAPSE_LOW\" since=\"11\"/>\n\t\t<field name=\"QUALITY_TIME_LAPSE_QCIF\" since=\"11\"/>\n\t\t<field name=\"QUALITY_TIME_LAPSE_QVGA\" since=\"15\"/>\n\t\t<field name=\"audioBitRate\"/>\n\t\t<field name=\"audioChannels\"/>\n\t\t<field name=\"audioCodec\"/>\n\t\t<field name=\"audioSampleRate\"/>\n\t\t<field name=\"duration\"/>\n\t\t<field name=\"fileFormat\"/>\n\t\t<field name=\"quality\"/>\n\t\t<field name=\"videoBitRate\"/>\n\t\t<field name=\"videoCodec\"/>\n\t\t<field name=\"videoFrameHeight\"/>\n\t\t<field name=\"videoFrameRate\"/>\n\t\t<field name=\"videoFrameWidth\"/>\n\t</class>\n\t<class name=\"android/media/CameraProfile\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getJpegEncodingQualityParameter(I)I\"/>\n\t\t<method name=\"getJpegEncodingQualityParameter(II)I\" since=\"9\"/>\n\t\t<field name=\"QUALITY_HIGH\"/>\n\t\t<field name=\"QUALITY_LOW\"/>\n\t\t<field name=\"QUALITY_MEDIUM\"/>\n\t</class>\n\t<class name=\"android/media/DeniedByServerException\" since=\"18\">\n\t\t<extends name=\"android/media/MediaDrmException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/media/DrmInitData\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"get(Ljava/util/UUID;)Landroid/media/DrmInitData$SchemeInitData;\"/>\n\t</class>\n\t<class name=\"android/media/DrmInitData$SchemeInitData\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"data\"/>\n\t\t<field name=\"mimeType\"/>\n\t</class>\n\t<class name=\"android/media/ExifInterface\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;)V\" since=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/FileDescriptor;)V\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getAltitude(D)D\" since=\"9\"/>\n\t\t<method name=\"getAttribute(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getAttributeBytes(Ljava/lang/String;)[B\" since=\"29\"/>\n\t\t<method name=\"getAttributeDouble(Ljava/lang/String;D)D\" since=\"8\"/>\n\t\t<method name=\"getAttributeInt(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"getAttributeRange(Ljava/lang/String;)[J\" since=\"29\"/>\n\t\t<method name=\"getLatLong([F)Z\"/>\n\t\t<method name=\"getThumbnail()[B\"/>\n\t\t<method name=\"getThumbnailBitmap()Landroid/graphics/Bitmap;\" since=\"26\"/>\n\t\t<method name=\"getThumbnailBytes()[B\" since=\"26\"/>\n\t\t<method name=\"getThumbnailRange()[J\" since=\"24\"/>\n\t\t<method name=\"hasAttribute(Ljava/lang/String;)Z\" since=\"29\"/>\n\t\t<method name=\"hasThumbnail()Z\"/>\n\t\t<method name=\"isThumbnailCompressed()Z\" since=\"26\"/>\n\t\t<method name=\"saveAttributes()V\"/>\n\t\t<method name=\"setAttribute(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<field name=\"ORIENTATION_FLIP_HORIZONTAL\"/>\n\t\t<field name=\"ORIENTATION_FLIP_VERTICAL\"/>\n\t\t<field name=\"ORIENTATION_NORMAL\"/>\n\t\t<field name=\"ORIENTATION_ROTATE_180\"/>\n\t\t<field name=\"ORIENTATION_ROTATE_270\"/>\n\t\t<field name=\"ORIENTATION_ROTATE_90\"/>\n\t\t<field name=\"ORIENTATION_TRANSPOSE\"/>\n\t\t<field name=\"ORIENTATION_TRANSVERSE\"/>\n\t\t<field name=\"ORIENTATION_UNDEFINED\"/>\n\t\t<field name=\"TAG_APERTURE\" since=\"11\" deprecated=\"24\"/>\n\t\t<field name=\"TAG_APERTURE_VALUE\" since=\"24\"/>\n\t\t<field name=\"TAG_ARTIST\" since=\"24\"/>\n\t\t<field name=\"TAG_BITS_PER_SAMPLE\" since=\"24\"/>\n\t\t<field name=\"TAG_BRIGHTNESS_VALUE\" since=\"24\"/>\n\t\t<field name=\"TAG_CFA_PATTERN\" since=\"24\"/>\n\t\t<field name=\"TAG_COLOR_SPACE\" since=\"24\"/>\n\t\t<field name=\"TAG_COMPONENTS_CONFIGURATION\" since=\"24\"/>\n\t\t<field name=\"TAG_COMPRESSED_BITS_PER_PIXEL\" since=\"24\"/>\n\t\t<field name=\"TAG_COMPRESSION\" since=\"24\"/>\n\t\t<field name=\"TAG_CONTRAST\" since=\"24\"/>\n\t\t<field name=\"TAG_COPYRIGHT\" since=\"24\"/>\n\t\t<field name=\"TAG_CUSTOM_RENDERED\" since=\"24\"/>\n\t\t<field name=\"TAG_DATETIME\"/>\n\t\t<field name=\"TAG_DATETIME_DIGITIZED\" since=\"23\"/>\n\t\t<field name=\"TAG_DATETIME_ORIGINAL\" since=\"24\"/>\n\t\t<field name=\"TAG_DEFAULT_CROP_SIZE\" since=\"26\"/>\n\t\t<field name=\"TAG_DEVICE_SETTING_DESCRIPTION\" since=\"24\"/>\n\t\t<field name=\"TAG_DIGITAL_ZOOM_RATIO\" since=\"24\"/>\n\t\t<field name=\"TAG_DNG_VERSION\" since=\"26\"/>\n\t\t<field name=\"TAG_EXIF_VERSION\" since=\"24\"/>\n\t\t<field name=\"TAG_EXPOSURE_BIAS_VALUE\" since=\"24\"/>\n\t\t<field name=\"TAG_EXPOSURE_INDEX\" since=\"24\"/>\n\t\t<field name=\"TAG_EXPOSURE_MODE\" since=\"24\"/>\n\t\t<field name=\"TAG_EXPOSURE_PROGRAM\" since=\"24\"/>\n\t\t<field name=\"TAG_EXPOSURE_TIME\" since=\"11\"/>\n\t\t<field name=\"TAG_FILE_SOURCE\" since=\"24\"/>\n\t\t<field name=\"TAG_FLASH\"/>\n\t\t<field name=\"TAG_FLASHPIX_VERSION\" since=\"24\"/>\n\t\t<field name=\"TAG_FLASH_ENERGY\" since=\"24\"/>\n\t\t<field name=\"TAG_FOCAL_LENGTH\" since=\"8\"/>\n\t\t<field name=\"TAG_FOCAL_LENGTH_IN_35MM_FILM\" since=\"24\"/>\n\t\t<field name=\"TAG_FOCAL_PLANE_RESOLUTION_UNIT\" since=\"24\"/>\n\t\t<field name=\"TAG_FOCAL_PLANE_X_RESOLUTION\" since=\"24\"/>\n\t\t<field name=\"TAG_FOCAL_PLANE_Y_RESOLUTION\" since=\"24\"/>\n\t\t<field name=\"TAG_F_NUMBER\" since=\"24\"/>\n\t\t<field name=\"TAG_GAIN_CONTROL\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_ALTITUDE\" since=\"9\"/>\n\t\t<field name=\"TAG_GPS_ALTITUDE_REF\" since=\"9\"/>\n\t\t<field name=\"TAG_GPS_AREA_INFORMATION\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_DATESTAMP\" since=\"8\"/>\n\t\t<field name=\"TAG_GPS_DEST_BEARING\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_DEST_BEARING_REF\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_DEST_DISTANCE\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_DEST_DISTANCE_REF\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_DEST_LATITUDE\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_DEST_LATITUDE_REF\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_DEST_LONGITUDE\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_DEST_LONGITUDE_REF\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_DIFFERENTIAL\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_DOP\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_IMG_DIRECTION\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_IMG_DIRECTION_REF\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_LATITUDE\"/>\n\t\t<field name=\"TAG_GPS_LATITUDE_REF\"/>\n\t\t<field name=\"TAG_GPS_LONGITUDE\"/>\n\t\t<field name=\"TAG_GPS_LONGITUDE_REF\"/>\n\t\t<field name=\"TAG_GPS_MAP_DATUM\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_MEASURE_MODE\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_PROCESSING_METHOD\" since=\"8\"/>\n\t\t<field name=\"TAG_GPS_SATELLITES\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_SPEED\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_SPEED_REF\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_STATUS\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_TIMESTAMP\" since=\"8\"/>\n\t\t<field name=\"TAG_GPS_TRACK\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_TRACK_REF\" since=\"24\"/>\n\t\t<field name=\"TAG_GPS_VERSION_ID\" since=\"24\"/>\n\t\t<field name=\"TAG_IMAGE_DESCRIPTION\" since=\"24\"/>\n\t\t<field name=\"TAG_IMAGE_LENGTH\"/>\n\t\t<field name=\"TAG_IMAGE_UNIQUE_ID\" since=\"24\"/>\n\t\t<field name=\"TAG_IMAGE_WIDTH\"/>\n\t\t<field name=\"TAG_INTEROPERABILITY_INDEX\" since=\"24\"/>\n\t\t<field name=\"TAG_ISO\" since=\"11\" deprecated=\"24\"/>\n\t\t<field name=\"TAG_ISO_SPEED_RATINGS\" since=\"24\"/>\n\t\t<field name=\"TAG_JPEG_INTERCHANGE_FORMAT\" since=\"24\"/>\n\t\t<field name=\"TAG_JPEG_INTERCHANGE_FORMAT_LENGTH\" since=\"24\"/>\n\t\t<field name=\"TAG_LIGHT_SOURCE\" since=\"24\"/>\n\t\t<field name=\"TAG_MAKE\"/>\n\t\t<field name=\"TAG_MAKER_NOTE\" since=\"24\"/>\n\t\t<field name=\"TAG_MAX_APERTURE_VALUE\" since=\"24\"/>\n\t\t<field name=\"TAG_METERING_MODE\" since=\"24\"/>\n\t\t<field name=\"TAG_MODEL\"/>\n\t\t<field name=\"TAG_NEW_SUBFILE_TYPE\" since=\"26\"/>\n\t\t<field name=\"TAG_OECF\" since=\"24\"/>\n\t\t<field name=\"TAG_ORF_ASPECT_FRAME\" since=\"26\"/>\n\t\t<field name=\"TAG_ORF_PREVIEW_IMAGE_LENGTH\" since=\"26\"/>\n\t\t<field name=\"TAG_ORF_PREVIEW_IMAGE_START\" since=\"26\"/>\n\t\t<field name=\"TAG_ORF_THUMBNAIL_IMAGE\" since=\"26\"/>\n\t\t<field name=\"TAG_ORIENTATION\"/>\n\t\t<field name=\"TAG_PHOTOMETRIC_INTERPRETATION\" since=\"24\"/>\n\t\t<field name=\"TAG_PIXEL_X_DIMENSION\" since=\"24\"/>\n\t\t<field name=\"TAG_PIXEL_Y_DIMENSION\" since=\"24\"/>\n\t\t<field name=\"TAG_PLANAR_CONFIGURATION\" since=\"24\"/>\n\t\t<field name=\"TAG_PRIMARY_CHROMATICITIES\" since=\"24\"/>\n\t\t<field name=\"TAG_REFERENCE_BLACK_WHITE\" since=\"24\"/>\n\t\t<field name=\"TAG_RELATED_SOUND_FILE\" since=\"24\"/>\n\t\t<field name=\"TAG_RESOLUTION_UNIT\" since=\"24\"/>\n\t\t<field name=\"TAG_ROWS_PER_STRIP\" since=\"24\"/>\n\t\t<field name=\"TAG_RW2_ISO\" since=\"26\"/>\n\t\t<field name=\"TAG_RW2_JPG_FROM_RAW\" since=\"26\"/>\n\t\t<field name=\"TAG_RW2_SENSOR_BOTTOM_BORDER\" since=\"26\"/>\n\t\t<field name=\"TAG_RW2_SENSOR_LEFT_BORDER\" since=\"26\"/>\n\t\t<field name=\"TAG_RW2_SENSOR_RIGHT_BORDER\" since=\"26\"/>\n\t\t<field name=\"TAG_RW2_SENSOR_TOP_BORDER\" since=\"26\"/>\n\t\t<field name=\"TAG_SAMPLES_PER_PIXEL\" since=\"24\"/>\n\t\t<field name=\"TAG_SATURATION\" since=\"24\"/>\n\t\t<field name=\"TAG_SCENE_CAPTURE_TYPE\" since=\"24\"/>\n\t\t<field name=\"TAG_SCENE_TYPE\" since=\"24\"/>\n\t\t<field name=\"TAG_SENSING_METHOD\" since=\"24\"/>\n\t\t<field name=\"TAG_SHARPNESS\" since=\"24\"/>\n\t\t<field name=\"TAG_SHUTTER_SPEED_VALUE\" since=\"24\"/>\n\t\t<field name=\"TAG_SOFTWARE\" since=\"24\"/>\n\t\t<field name=\"TAG_SPATIAL_FREQUENCY_RESPONSE\" since=\"24\"/>\n\t\t<field name=\"TAG_SPECTRAL_SENSITIVITY\" since=\"24\"/>\n\t\t<field name=\"TAG_STRIP_BYTE_COUNTS\" since=\"24\"/>\n\t\t<field name=\"TAG_STRIP_OFFSETS\" since=\"24\"/>\n\t\t<field name=\"TAG_SUBFILE_TYPE\" since=\"26\"/>\n\t\t<field name=\"TAG_SUBJECT_AREA\" since=\"24\"/>\n\t\t<field name=\"TAG_SUBJECT_DISTANCE\" since=\"24\"/>\n\t\t<field name=\"TAG_SUBJECT_DISTANCE_RANGE\" since=\"24\"/>\n\t\t<field name=\"TAG_SUBJECT_LOCATION\" since=\"24\"/>\n\t\t<field name=\"TAG_SUBSEC_TIME\" since=\"23\"/>\n\t\t<field name=\"TAG_SUBSEC_TIME_DIG\" since=\"23\" deprecated=\"24\"/>\n\t\t<field name=\"TAG_SUBSEC_TIME_DIGITIZED\" since=\"24\"/>\n\t\t<field name=\"TAG_SUBSEC_TIME_ORIG\" since=\"23\" deprecated=\"24\"/>\n\t\t<field name=\"TAG_SUBSEC_TIME_ORIGINAL\" since=\"24\"/>\n\t\t<field name=\"TAG_THUMBNAIL_IMAGE_LENGTH\" since=\"24\"/>\n\t\t<field name=\"TAG_THUMBNAIL_IMAGE_WIDTH\" since=\"24\"/>\n\t\t<field name=\"TAG_TRANSFER_FUNCTION\" since=\"24\"/>\n\t\t<field name=\"TAG_USER_COMMENT\" since=\"24\"/>\n\t\t<field name=\"TAG_WHITE_BALANCE\"/>\n\t\t<field name=\"TAG_WHITE_POINT\" since=\"24\"/>\n\t\t<field name=\"TAG_XMP\" since=\"29\"/>\n\t\t<field name=\"TAG_X_RESOLUTION\" since=\"24\"/>\n\t\t<field name=\"TAG_Y_CB_CR_COEFFICIENTS\" since=\"24\"/>\n\t\t<field name=\"TAG_Y_CB_CR_POSITIONING\" since=\"24\"/>\n\t\t<field name=\"TAG_Y_CB_CR_SUB_SAMPLING\" since=\"24\"/>\n\t\t<field name=\"TAG_Y_RESOLUTION\" since=\"24\"/>\n\t\t<field name=\"WHITEBALANCE_AUTO\"/>\n\t\t<field name=\"WHITEBALANCE_MANUAL\"/>\n\t</class>\n\t<class name=\"android/media/FaceDetector\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"findFaces(Landroid/graphics/Bitmap;[Landroid/media/FaceDetector$Face;)I\"/>\n\t</class>\n\t<class name=\"android/media/FaceDetector$Face\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"confidence()F\"/>\n\t\t<method name=\"eyesDistance()F\"/>\n\t\t<method name=\"getMidPoint(Landroid/graphics/PointF;)V\"/>\n\t\t<method name=\"pose(I)F\"/>\n\t\t<field name=\"CONFIDENCE_THRESHOLD\"/>\n\t\t<field name=\"EULER_X\"/>\n\t\t<field name=\"EULER_Y\"/>\n\t\t<field name=\"EULER_Z\"/>\n\t</class>\n\t<class name=\"android/media/Image\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"getCropRect()Landroid/graphics/Rect;\" since=\"21\"/>\n\t\t<method name=\"getFormat()I\"/>\n\t\t<method name=\"getHardwareBuffer()Landroid/hardware/HardwareBuffer;\" since=\"28\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getPlanes()[Landroid/media/Image$Plane;\"/>\n\t\t<method name=\"getTimestamp()J\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t\t<method name=\"setCropRect(Landroid/graphics/Rect;)V\" since=\"21\"/>\n\t\t<method name=\"setTimestamp(J)V\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/media/Image$Plane\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getBuffer()Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"getPixelStride()I\"/>\n\t\t<method name=\"getRowStride()I\"/>\n\t</class>\n\t<class name=\"android/media/ImageReader\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"acquireLatestImage()Landroid/media/Image;\"/>\n\t\t<method name=\"acquireNextImage()Landroid/media/Image;\"/>\n\t\t<method name=\"discardFreeBuffers()V\" since=\"28\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getImageFormat()I\"/>\n\t\t<method name=\"getMaxImages()I\"/>\n\t\t<method name=\"getSurface()Landroid/view/Surface;\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t\t<method name=\"newInstance(IIII)Landroid/media/ImageReader;\"/>\n\t\t<method name=\"newInstance(IIIIJ)Landroid/media/ImageReader;\" since=\"29\"/>\n\t\t<method name=\"setOnImageAvailableListener(Landroid/media/ImageReader$OnImageAvailableListener;Landroid/os/Handler;)V\"/>\n\t</class>\n\t<class name=\"android/media/ImageReader$OnImageAvailableListener\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onImageAvailable(Landroid/media/ImageReader;)V\"/>\n\t</class>\n\t<class name=\"android/media/ImageWriter\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"dequeueInputImage()Landroid/media/Image;\"/>\n\t\t<method name=\"getFormat()I\"/>\n\t\t<method name=\"getMaxImages()I\"/>\n\t\t<method name=\"newInstance(Landroid/view/Surface;I)Landroid/media/ImageWriter;\"/>\n\t\t<method name=\"newInstance(Landroid/view/Surface;II)Landroid/media/ImageWriter;\" since=\"29\"/>\n\t\t<method name=\"queueInputImage(Landroid/media/Image;)V\"/>\n\t\t<method name=\"setOnImageReleasedListener(Landroid/media/ImageWriter$OnImageReleasedListener;Landroid/os/Handler;)V\"/>\n\t</class>\n\t<class name=\"android/media/ImageWriter$OnImageReleasedListener\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onImageReleased(Landroid/media/ImageWriter;)V\"/>\n\t</class>\n\t<class name=\"android/media/JetPlayer\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"clearQueue()Z\"/>\n\t\t<method name=\"closeJetFile()Z\"/>\n\t\t<method name=\"getJetPlayer()Landroid/media/JetPlayer;\"/>\n\t\t<method name=\"getMaxTracks()I\"/>\n\t\t<method name=\"loadJetFile(Landroid/content/res/AssetFileDescriptor;)Z\"/>\n\t\t<method name=\"loadJetFile(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"pause()Z\"/>\n\t\t<method name=\"play()Z\"/>\n\t\t<method name=\"queueJetSegment(IIIIIB)Z\"/>\n\t\t<method name=\"queueJetSegmentMuteArray(IIII[ZB)Z\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"setEventListener(Landroid/media/JetPlayer$OnJetEventListener;)V\"/>\n\t\t<method name=\"setEventListener(Landroid/media/JetPlayer$OnJetEventListener;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"setMuteArray([ZZ)Z\"/>\n\t\t<method name=\"setMuteFlag(IZZ)Z\"/>\n\t\t<method name=\"setMuteFlags(IZ)Z\"/>\n\t\t<method name=\"triggerClip(I)Z\"/>\n\t</class>\n\t<class name=\"android/media/JetPlayer$OnJetEventListener\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onJetEvent(Landroid/media/JetPlayer;SBBBB)V\"/>\n\t\t<method name=\"onJetNumQueuedSegmentUpdate(Landroid/media/JetPlayer;I)V\"/>\n\t\t<method name=\"onJetPauseUpdate(Landroid/media/JetPlayer;I)V\"/>\n\t\t<method name=\"onJetUserIdUpdate(Landroid/media/JetPlayer;II)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaActionSound\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"load(I)V\"/>\n\t\t<method name=\"play(I)V\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<field name=\"FOCUS_COMPLETE\"/>\n\t\t<field name=\"SHUTTER_CLICK\"/>\n\t\t<field name=\"START_VIDEO_RECORDING\"/>\n\t\t<field name=\"STOP_VIDEO_RECORDING\"/>\n\t</class>\n\t<class name=\"android/media/MediaCas\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"enumeratePlugins()[Landroid/media/MediaCas$PluginDescriptor;\"/>\n\t\t<method name=\"isSystemIdSupported(I)Z\"/>\n\t\t<method name=\"openSession()Landroid/media/MediaCas$Session;\"/>\n\t\t<method name=\"processEmm([B)V\"/>\n\t\t<method name=\"processEmm([BII)V\"/>\n\t\t<method name=\"provision(Ljava/lang/String;)V\"/>\n\t\t<method name=\"refreshEntitlements(I[B)V\"/>\n\t\t<method name=\"sendEvent(II[B)V\"/>\n\t\t<method name=\"setEventListener(Landroid/media/MediaCas$EventListener;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"setPrivateData([B)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaCas$EventListener\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onEvent(Landroid/media/MediaCas;II[B)V\"/>\n\t\t<method name=\"onSessionEvent(Landroid/media/MediaCas;Landroid/media/MediaCas$Session;II[B)V\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/media/MediaCas$PluginDescriptor\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getSystemId()I\"/>\n\t</class>\n\t<class name=\"android/media/MediaCas$Session\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"processEcm([B)V\"/>\n\t\t<method name=\"processEcm([BII)V\"/>\n\t\t<method name=\"sendSessionEvent(II[B)V\" since=\"29\"/>\n\t\t<method name=\"setPrivateData([B)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaCasException\" since=\"26\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t</class>\n\t<class name=\"android/media/MediaCasException$DeniedByServerException\" since=\"26\">\n\t\t<extends name=\"android/media/MediaCasException\"/>\n\t</class>\n\t<class name=\"android/media/MediaCasException$NotProvisionedException\" since=\"26\">\n\t\t<extends name=\"android/media/MediaCasException\"/>\n\t</class>\n\t<class name=\"android/media/MediaCasException$ResourceBusyException\" since=\"26\">\n\t\t<extends name=\"android/media/MediaCasException\"/>\n\t</class>\n\t<class name=\"android/media/MediaCasException$UnsupportedCasException\" since=\"26\">\n\t\t<extends name=\"android/media/MediaCasException\"/>\n\t</class>\n\t<class name=\"android/media/MediaCasStateException\" since=\"26\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"getDiagnosticInfo()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/media/MediaCodec\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"configure(Landroid/media/MediaFormat;Landroid/view/Surface;ILandroid/media/MediaDescrambler;)V\" since=\"26\"/>\n\t\t<method name=\"configure(Landroid/media/MediaFormat;Landroid/view/Surface;Landroid/media/MediaCrypto;I)V\"/>\n\t\t<method name=\"createByCodecName(Ljava/lang/String;)Landroid/media/MediaCodec;\"/>\n\t\t<method name=\"createDecoderByType(Ljava/lang/String;)Landroid/media/MediaCodec;\"/>\n\t\t<method name=\"createEncoderByType(Ljava/lang/String;)Landroid/media/MediaCodec;\"/>\n\t\t<method name=\"createInputSurface()Landroid/view/Surface;\" since=\"18\"/>\n\t\t<method name=\"createPersistentInputSurface()Landroid/view/Surface;\" since=\"23\"/>\n\t\t<method name=\"dequeueInputBuffer(J)I\"/>\n\t\t<method name=\"dequeueOutputBuffer(Landroid/media/MediaCodec$BufferInfo;J)I\"/>\n\t\t<method name=\"flush()V\"/>\n\t\t<method name=\"getCanonicalName()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getCodecInfo()Landroid/media/MediaCodecInfo;\" since=\"18\"/>\n\t\t<method name=\"getInputBuffer(I)Ljava/nio/ByteBuffer;\" since=\"21\"/>\n\t\t<method name=\"getInputBuffers()[Ljava/nio/ByteBuffer;\" deprecated=\"21\"/>\n\t\t<method name=\"getInputFormat()Landroid/media/MediaFormat;\" since=\"21\"/>\n\t\t<method name=\"getInputImage(I)Landroid/media/Image;\" since=\"21\"/>\n\t\t<method name=\"getMetrics()Landroid/os/PersistableBundle;\" since=\"26\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\" since=\"18\"/>\n\t\t<method name=\"getOutputBuffer(I)Ljava/nio/ByteBuffer;\" since=\"21\"/>\n\t\t<method name=\"getOutputBuffers()[Ljava/nio/ByteBuffer;\" deprecated=\"21\"/>\n\t\t<method name=\"getOutputFormat()Landroid/media/MediaFormat;\"/>\n\t\t<method name=\"getOutputFormat(I)Landroid/media/MediaFormat;\" since=\"21\"/>\n\t\t<method name=\"getOutputImage(I)Landroid/media/Image;\" since=\"21\"/>\n\t\t<method name=\"queueInputBuffer(IIIJI)V\"/>\n\t\t<method name=\"queueSecureInputBuffer(IILandroid/media/MediaCodec$CryptoInfo;JI)V\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"releaseOutputBuffer(IJ)V\" since=\"21\"/>\n\t\t<method name=\"releaseOutputBuffer(IZ)V\"/>\n\t\t<method name=\"reset()V\" since=\"21\"/>\n\t\t<method name=\"setAudioPresentation(Landroid/media/AudioPresentation;)V\" since=\"29\"/>\n\t\t<method name=\"setCallback(Landroid/media/MediaCodec$Callback;)V\" since=\"21\"/>\n\t\t<method name=\"setCallback(Landroid/media/MediaCodec$Callback;Landroid/os/Handler;)V\" since=\"23\"/>\n\t\t<method name=\"setInputSurface(Landroid/view/Surface;)V\" since=\"23\"/>\n\t\t<method name=\"setOnFrameRenderedListener(Landroid/media/MediaCodec$OnFrameRenderedListener;Landroid/os/Handler;)V\" since=\"23\"/>\n\t\t<method name=\"setOutputSurface(Landroid/view/Surface;)V\" since=\"23\"/>\n\t\t<method name=\"setParameters(Landroid/os/Bundle;)V\" since=\"19\"/>\n\t\t<method name=\"setVideoScalingMode(I)V\"/>\n\t\t<method name=\"signalEndOfInputStream()V\" since=\"18\"/>\n\t\t<method name=\"start()V\"/>\n\t\t<method name=\"stop()V\"/>\n\t\t<field name=\"BUFFER_FLAG_CODEC_CONFIG\"/>\n\t\t<field name=\"BUFFER_FLAG_END_OF_STREAM\"/>\n\t\t<field name=\"BUFFER_FLAG_KEY_FRAME\" since=\"21\"/>\n\t\t<field name=\"BUFFER_FLAG_PARTIAL_FRAME\" since=\"26\"/>\n\t\t<field name=\"BUFFER_FLAG_SYNC_FRAME\" deprecated=\"21\"/>\n\t\t<field name=\"CONFIGURE_FLAG_ENCODE\"/>\n\t\t<field name=\"CRYPTO_MODE_AES_CBC\" since=\"24\"/>\n\t\t<field name=\"CRYPTO_MODE_AES_CTR\"/>\n\t\t<field name=\"CRYPTO_MODE_UNENCRYPTED\"/>\n\t\t<field name=\"INFO_OUTPUT_BUFFERS_CHANGED\" deprecated=\"21\"/>\n\t\t<field name=\"INFO_OUTPUT_FORMAT_CHANGED\"/>\n\t\t<field name=\"INFO_TRY_AGAIN_LATER\"/>\n\t\t<field name=\"PARAMETER_KEY_HDR10_PLUS_INFO\" since=\"29\"/>\n\t\t<field name=\"PARAMETER_KEY_OFFSET_TIME\" since=\"29\"/>\n\t\t<field name=\"PARAMETER_KEY_REQUEST_SYNC_FRAME\" since=\"19\"/>\n\t\t<field name=\"PARAMETER_KEY_SUSPEND\" since=\"19\"/>\n\t\t<field name=\"PARAMETER_KEY_SUSPEND_TIME\" since=\"29\"/>\n\t\t<field name=\"PARAMETER_KEY_VIDEO_BITRATE\" since=\"19\"/>\n\t\t<field name=\"VIDEO_SCALING_MODE_SCALE_TO_FIT\"/>\n\t\t<field name=\"VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING\"/>\n\t</class>\n\t<class name=\"android/media/MediaCodec$BufferInfo\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"set(IIJI)V\"/>\n\t\t<field name=\"flags\"/>\n\t\t<field name=\"offset\"/>\n\t\t<field name=\"presentationTimeUs\"/>\n\t\t<field name=\"size\"/>\n\t</class>\n\t<class name=\"android/media/MediaCodec$Callback\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onError(Landroid/media/MediaCodec;Landroid/media/MediaCodec$CodecException;)V\"/>\n\t\t<method name=\"onInputBufferAvailable(Landroid/media/MediaCodec;I)V\"/>\n\t\t<method name=\"onOutputBufferAvailable(Landroid/media/MediaCodec;ILandroid/media/MediaCodec$BufferInfo;)V\"/>\n\t\t<method name=\"onOutputFormatChanged(Landroid/media/MediaCodec;Landroid/media/MediaFormat;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaCodec$CodecException\" since=\"21\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"getDiagnosticInfo()Ljava/lang/String;\"/>\n\t\t<method name=\"getErrorCode()I\" since=\"23\"/>\n\t\t<method name=\"isRecoverable()Z\"/>\n\t\t<method name=\"isTransient()Z\"/>\n\t\t<field name=\"ERROR_INSUFFICIENT_RESOURCE\" since=\"23\"/>\n\t\t<field name=\"ERROR_RECLAIMED\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/media/MediaCodec$CryptoException\" since=\"16\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/String;)V\"/>\n\t\t<method name=\"getErrorCode()I\"/>\n\t\t<field name=\"ERROR_FRAME_TOO_LARGE\" since=\"29\"/>\n\t\t<field name=\"ERROR_INSUFFICIENT_OUTPUT_PROTECTION\" since=\"21\"/>\n\t\t<field name=\"ERROR_INSUFFICIENT_SECURITY\" since=\"29\"/>\n\t\t<field name=\"ERROR_KEY_EXPIRED\" since=\"19\"/>\n\t\t<field name=\"ERROR_LOST_STATE\" since=\"29\"/>\n\t\t<field name=\"ERROR_NO_KEY\" since=\"19\"/>\n\t\t<field name=\"ERROR_RESOURCE_BUSY\" since=\"19\"/>\n\t\t<field name=\"ERROR_SESSION_NOT_OPENED\" since=\"23\"/>\n\t\t<field name=\"ERROR_UNSUPPORTED_OPERATION\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/media/MediaCodec$CryptoInfo\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"set(I[I[I[B[BI)V\"/>\n\t\t<method name=\"setPattern(Landroid/media/MediaCodec$CryptoInfo$Pattern;)V\" since=\"24\"/>\n\t\t<field name=\"iv\"/>\n\t\t<field name=\"key\"/>\n\t\t<field name=\"mode\"/>\n\t\t<field name=\"numBytesOfClearData\"/>\n\t\t<field name=\"numBytesOfEncryptedData\"/>\n\t\t<field name=\"numSubSamples\"/>\n\t</class>\n\t<class name=\"android/media/MediaCodec$CryptoInfo$Pattern\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"getEncryptBlocks()I\"/>\n\t\t<method name=\"getSkipBlocks()I\"/>\n\t\t<method name=\"set(II)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaCodec$MetricsConstants\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CODEC\"/>\n\t\t<field name=\"ENCODER\"/>\n\t\t<field name=\"HEIGHT\"/>\n\t\t<field name=\"MIME_TYPE\"/>\n\t\t<field name=\"MODE\"/>\n\t\t<field name=\"MODE_AUDIO\"/>\n\t\t<field name=\"MODE_VIDEO\"/>\n\t\t<field name=\"ROTATION\"/>\n\t\t<field name=\"SECURE\"/>\n\t\t<field name=\"WIDTH\"/>\n\t</class>\n\t<class name=\"android/media/MediaCodec$OnFrameRenderedListener\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onFrameRendered(Landroid/media/MediaCodec;JJ)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaCodecInfo\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getCanonicalName()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getCapabilitiesForType(Ljava/lang/String;)Landroid/media/MediaCodecInfo$CodecCapabilities;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getSupportedTypes()[Ljava/lang/String;\"/>\n\t\t<method name=\"isAlias()Z\" since=\"29\"/>\n\t\t<method name=\"isEncoder()Z\"/>\n\t\t<method name=\"isHardwareAccelerated()Z\" since=\"29\"/>\n\t\t<method name=\"isSoftwareOnly()Z\" since=\"29\"/>\n\t\t<method name=\"isVendor()Z\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/media/MediaCodecInfo$AudioCapabilities\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getBitrateRange()Landroid/util/Range;\"/>\n\t\t<method name=\"getMaxInputChannelCount()I\"/>\n\t\t<method name=\"getSupportedSampleRateRanges()[Landroid/util/Range;\"/>\n\t\t<method name=\"getSupportedSampleRates()[I\"/>\n\t\t<method name=\"isSampleRateSupported(I)Z\"/>\n\t</class>\n\t<class name=\"android/media/MediaCodecInfo$CodecCapabilities\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"createFromProfileLevel(Ljava/lang/String;II)Landroid/media/MediaCodecInfo$CodecCapabilities;\" since=\"21\"/>\n\t\t<method name=\"getAudioCapabilities()Landroid/media/MediaCodecInfo$AudioCapabilities;\" since=\"21\"/>\n\t\t<method name=\"getDefaultFormat()Landroid/media/MediaFormat;\" since=\"21\"/>\n\t\t<method name=\"getEncoderCapabilities()Landroid/media/MediaCodecInfo$EncoderCapabilities;\" since=\"21\"/>\n\t\t<method name=\"getMaxSupportedInstances()I\" since=\"23\"/>\n\t\t<method name=\"getMimeType()Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"getVideoCapabilities()Landroid/media/MediaCodecInfo$VideoCapabilities;\" since=\"21\"/>\n\t\t<method name=\"isFeatureRequired(Ljava/lang/String;)Z\" since=\"21\"/>\n\t\t<method name=\"isFeatureSupported(Ljava/lang/String;)Z\" since=\"19\"/>\n\t\t<method name=\"isFormatSupported(Landroid/media/MediaFormat;)Z\" since=\"21\"/>\n\t\t<field name=\"COLOR_Format12bitRGB444\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_Format16bitARGB1555\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_Format16bitARGB4444\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_Format16bitBGR565\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_Format16bitRGB565\"/>\n\t\t<field name=\"COLOR_Format18BitBGR666\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_Format18bitARGB1665\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_Format18bitRGB666\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_Format19bitARGB1666\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_Format24BitABGR6666\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_Format24BitARGB6666\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_Format24bitARGB1887\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_Format24bitBGR888\"/>\n\t\t<field name=\"COLOR_Format24bitRGB888\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_Format25bitARGB1888\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_Format32bitABGR8888\" since=\"23\"/>\n\t\t<field name=\"COLOR_Format32bitARGB8888\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_Format32bitBGRA8888\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_Format8bitRGB332\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_FormatCbYCrY\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_FormatCrYCbY\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_FormatL16\"/>\n\t\t<field name=\"COLOR_FormatL2\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_FormatL24\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_FormatL32\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_FormatL4\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_FormatL8\"/>\n\t\t<field name=\"COLOR_FormatMonochrome\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_FormatRGBAFlexible\" since=\"23\"/>\n\t\t<field name=\"COLOR_FormatRGBFlexible\" since=\"23\"/>\n\t\t<field name=\"COLOR_FormatRawBayer10bit\"/>\n\t\t<field name=\"COLOR_FormatRawBayer8bit\"/>\n\t\t<field name=\"COLOR_FormatRawBayer8bitcompressed\"/>\n\t\t<field name=\"COLOR_FormatSurface\" since=\"18\"/>\n\t\t<field name=\"COLOR_FormatYCbYCr\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_FormatYCrYCb\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_FormatYUV411PackedPlanar\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_FormatYUV411Planar\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_FormatYUV420Flexible\" since=\"21\"/>\n\t\t<field name=\"COLOR_FormatYUV420PackedPlanar\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_FormatYUV420PackedSemiPlanar\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_FormatYUV420Planar\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_FormatYUV420SemiPlanar\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_FormatYUV422Flexible\" since=\"23\"/>\n\t\t<field name=\"COLOR_FormatYUV422PackedPlanar\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_FormatYUV422PackedSemiPlanar\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_FormatYUV422Planar\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_FormatYUV422SemiPlanar\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_FormatYUV444Flexible\" since=\"23\"/>\n\t\t<field name=\"COLOR_FormatYUV444Interleaved\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_QCOM_FormatYUV420SemiPlanar\" deprecated=\"23\"/>\n\t\t<field name=\"COLOR_TI_FormatYUV420PackedSemiPlanar\" deprecated=\"23\"/>\n\t\t<field name=\"FEATURE_AdaptivePlayback\" since=\"19\"/>\n\t\t<field name=\"FEATURE_DynamicTimestamp\" since=\"29\"/>\n\t\t<field name=\"FEATURE_FrameParsing\" since=\"29\"/>\n\t\t<field name=\"FEATURE_IntraRefresh\" since=\"24\"/>\n\t\t<field name=\"FEATURE_MultipleFrames\" since=\"29\"/>\n\t\t<field name=\"FEATURE_PartialFrame\" since=\"26\"/>\n\t\t<field name=\"FEATURE_SecurePlayback\" since=\"21\"/>\n\t\t<field name=\"FEATURE_TunneledPlayback\" since=\"21\"/>\n\t\t<field name=\"colorFormats\"/>\n\t\t<field name=\"profileLevels\"/>\n\t</class>\n\t<class name=\"android/media/MediaCodecInfo$CodecProfileLevel\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"AACObjectELD\"/>\n\t\t<field name=\"AACObjectERLC\"/>\n\t\t<field name=\"AACObjectERScalable\" since=\"26\"/>\n\t\t<field name=\"AACObjectHE\"/>\n\t\t<field name=\"AACObjectHE_PS\"/>\n\t\t<field name=\"AACObjectLC\"/>\n\t\t<field name=\"AACObjectLD\"/>\n\t\t<field name=\"AACObjectLTP\"/>\n\t\t<field name=\"AACObjectMain\"/>\n\t\t<field name=\"AACObjectSSR\"/>\n\t\t<field name=\"AACObjectScalable\"/>\n\t\t<field name=\"AACObjectXHE\" since=\"28\"/>\n\t\t<field name=\"AV1Level2\" since=\"29\"/>\n\t\t<field name=\"AV1Level21\" since=\"29\"/>\n\t\t<field name=\"AV1Level22\" since=\"29\"/>\n\t\t<field name=\"AV1Level23\" since=\"29\"/>\n\t\t<field name=\"AV1Level3\" since=\"29\"/>\n\t\t<field name=\"AV1Level31\" since=\"29\"/>\n\t\t<field name=\"AV1Level32\" since=\"29\"/>\n\t\t<field name=\"AV1Level33\" since=\"29\"/>\n\t\t<field name=\"AV1Level4\" since=\"29\"/>\n\t\t<field name=\"AV1Level41\" since=\"29\"/>\n\t\t<field name=\"AV1Level42\" since=\"29\"/>\n\t\t<field name=\"AV1Level43\" since=\"29\"/>\n\t\t<field name=\"AV1Level5\" since=\"29\"/>\n\t\t<field name=\"AV1Level51\" since=\"29\"/>\n\t\t<field name=\"AV1Level52\" since=\"29\"/>\n\t\t<field name=\"AV1Level53\" since=\"29\"/>\n\t\t<field name=\"AV1Level6\" since=\"29\"/>\n\t\t<field name=\"AV1Level61\" since=\"29\"/>\n\t\t<field name=\"AV1Level62\" since=\"29\"/>\n\t\t<field name=\"AV1Level63\" since=\"29\"/>\n\t\t<field name=\"AV1Level7\" since=\"29\"/>\n\t\t<field name=\"AV1Level71\" since=\"29\"/>\n\t\t<field name=\"AV1Level72\" since=\"29\"/>\n\t\t<field name=\"AV1Level73\" since=\"29\"/>\n\t\t<field name=\"AV1ProfileMain10\" since=\"29\"/>\n\t\t<field name=\"AV1ProfileMain10HDR10\" since=\"29\"/>\n\t\t<field name=\"AV1ProfileMain10HDR10Plus\" since=\"29\"/>\n\t\t<field name=\"AV1ProfileMain8\" since=\"29\"/>\n\t\t<field name=\"AVCLevel1\"/>\n\t\t<field name=\"AVCLevel11\"/>\n\t\t<field name=\"AVCLevel12\"/>\n\t\t<field name=\"AVCLevel13\"/>\n\t\t<field name=\"AVCLevel1b\"/>\n\t\t<field name=\"AVCLevel2\"/>\n\t\t<field name=\"AVCLevel21\"/>\n\t\t<field name=\"AVCLevel22\"/>\n\t\t<field name=\"AVCLevel3\"/>\n\t\t<field name=\"AVCLevel31\"/>\n\t\t<field name=\"AVCLevel32\"/>\n\t\t<field name=\"AVCLevel4\"/>\n\t\t<field name=\"AVCLevel41\"/>\n\t\t<field name=\"AVCLevel42\"/>\n\t\t<field name=\"AVCLevel5\"/>\n\t\t<field name=\"AVCLevel51\"/>\n\t\t<field name=\"AVCLevel52\" since=\"21\"/>\n\t\t<field name=\"AVCLevel6\" since=\"29\"/>\n\t\t<field name=\"AVCLevel61\" since=\"29\"/>\n\t\t<field name=\"AVCLevel62\" since=\"29\"/>\n\t\t<field name=\"AVCProfileBaseline\"/>\n\t\t<field name=\"AVCProfileConstrainedBaseline\" since=\"27\"/>\n\t\t<field name=\"AVCProfileConstrainedHigh\" since=\"27\"/>\n\t\t<field name=\"AVCProfileExtended\"/>\n\t\t<field name=\"AVCProfileHigh\"/>\n\t\t<field name=\"AVCProfileHigh10\"/>\n\t\t<field name=\"AVCProfileHigh422\"/>\n\t\t<field name=\"AVCProfileHigh444\"/>\n\t\t<field name=\"AVCProfileMain\"/>\n\t\t<field name=\"DolbyVisionLevelFhd24\" since=\"24\"/>\n\t\t<field name=\"DolbyVisionLevelFhd30\" since=\"24\"/>\n\t\t<field name=\"DolbyVisionLevelFhd60\" since=\"24\"/>\n\t\t<field name=\"DolbyVisionLevelHd24\" since=\"24\"/>\n\t\t<field name=\"DolbyVisionLevelHd30\" since=\"24\"/>\n\t\t<field name=\"DolbyVisionLevelUhd24\" since=\"24\"/>\n\t\t<field name=\"DolbyVisionLevelUhd30\" since=\"24\"/>\n\t\t<field name=\"DolbyVisionLevelUhd48\" since=\"24\"/>\n\t\t<field name=\"DolbyVisionLevelUhd60\" since=\"24\"/>\n\t\t<field name=\"DolbyVisionProfileDvavPen\" since=\"24\"/>\n\t\t<field name=\"DolbyVisionProfileDvavPer\" since=\"24\"/>\n\t\t<field name=\"DolbyVisionProfileDvavSe\" since=\"27\"/>\n\t\t<field name=\"DolbyVisionProfileDvheDen\" since=\"24\"/>\n\t\t<field name=\"DolbyVisionProfileDvheDer\" since=\"24\"/>\n\t\t<field name=\"DolbyVisionProfileDvheDtb\" since=\"24\"/>\n\t\t<field name=\"DolbyVisionProfileDvheDth\" since=\"24\"/>\n\t\t<field name=\"DolbyVisionProfileDvheDtr\" since=\"24\"/>\n\t\t<field name=\"DolbyVisionProfileDvheSt\" since=\"27\"/>\n\t\t<field name=\"DolbyVisionProfileDvheStn\" since=\"24\"/>\n\t\t<field name=\"H263Level10\"/>\n\t\t<field name=\"H263Level20\"/>\n\t\t<field name=\"H263Level30\"/>\n\t\t<field name=\"H263Level40\"/>\n\t\t<field name=\"H263Level45\"/>\n\t\t<field name=\"H263Level50\"/>\n\t\t<field name=\"H263Level60\"/>\n\t\t<field name=\"H263Level70\"/>\n\t\t<field name=\"H263ProfileBackwardCompatible\"/>\n\t\t<field name=\"H263ProfileBaseline\"/>\n\t\t<field name=\"H263ProfileH320Coding\"/>\n\t\t<field name=\"H263ProfileHighCompression\"/>\n\t\t<field name=\"H263ProfileHighLatency\"/>\n\t\t<field name=\"H263ProfileISWV2\"/>\n\t\t<field name=\"H263ProfileISWV3\"/>\n\t\t<field name=\"H263ProfileInterlace\"/>\n\t\t<field name=\"H263ProfileInternet\"/>\n\t\t<field name=\"HEVCHighTierLevel1\" since=\"21\"/>\n\t\t<field name=\"HEVCHighTierLevel2\" since=\"21\"/>\n\t\t<field name=\"HEVCHighTierLevel21\" since=\"21\"/>\n\t\t<field name=\"HEVCHighTierLevel3\" since=\"21\"/>\n\t\t<field name=\"HEVCHighTierLevel31\" since=\"21\"/>\n\t\t<field name=\"HEVCHighTierLevel4\" since=\"21\"/>\n\t\t<field name=\"HEVCHighTierLevel41\" since=\"21\"/>\n\t\t<field name=\"HEVCHighTierLevel5\" since=\"21\"/>\n\t\t<field name=\"HEVCHighTierLevel51\" since=\"21\"/>\n\t\t<field name=\"HEVCHighTierLevel52\" since=\"21\"/>\n\t\t<field name=\"HEVCHighTierLevel6\" since=\"21\"/>\n\t\t<field name=\"HEVCHighTierLevel61\" since=\"21\"/>\n\t\t<field name=\"HEVCHighTierLevel62\" since=\"21\"/>\n\t\t<field name=\"HEVCMainTierLevel1\" since=\"21\"/>\n\t\t<field name=\"HEVCMainTierLevel2\" since=\"21\"/>\n\t\t<field name=\"HEVCMainTierLevel21\" since=\"21\"/>\n\t\t<field name=\"HEVCMainTierLevel3\" since=\"21\"/>\n\t\t<field name=\"HEVCMainTierLevel31\" since=\"21\"/>\n\t\t<field name=\"HEVCMainTierLevel4\" since=\"21\"/>\n\t\t<field name=\"HEVCMainTierLevel41\" since=\"21\"/>\n\t\t<field name=\"HEVCMainTierLevel5\" since=\"21\"/>\n\t\t<field name=\"HEVCMainTierLevel51\" since=\"21\"/>\n\t\t<field name=\"HEVCMainTierLevel52\" since=\"21\"/>\n\t\t<field name=\"HEVCMainTierLevel6\" since=\"21\"/>\n\t\t<field name=\"HEVCMainTierLevel61\" since=\"21\"/>\n\t\t<field name=\"HEVCMainTierLevel62\" since=\"21\"/>\n\t\t<field name=\"HEVCProfileMain\" since=\"21\"/>\n\t\t<field name=\"HEVCProfileMain10\" since=\"21\"/>\n\t\t<field name=\"HEVCProfileMain10HDR10\" since=\"24\"/>\n\t\t<field name=\"HEVCProfileMain10HDR10Plus\" since=\"29\"/>\n\t\t<field name=\"HEVCProfileMainStill\" since=\"28\"/>\n\t\t<field name=\"MPEG2LevelH14\" since=\"23\"/>\n\t\t<field name=\"MPEG2LevelHL\" since=\"23\"/>\n\t\t<field name=\"MPEG2LevelHP\" since=\"24\"/>\n\t\t<field name=\"MPEG2LevelLL\" since=\"23\"/>\n\t\t<field name=\"MPEG2LevelML\" since=\"23\"/>\n\t\t<field name=\"MPEG2Profile422\" since=\"23\"/>\n\t\t<field name=\"MPEG2ProfileHigh\" since=\"23\"/>\n\t\t<field name=\"MPEG2ProfileMain\" since=\"23\"/>\n\t\t<field name=\"MPEG2ProfileSNR\" since=\"23\"/>\n\t\t<field name=\"MPEG2ProfileSimple\" since=\"23\"/>\n\t\t<field name=\"MPEG2ProfileSpatial\" since=\"23\"/>\n\t\t<field name=\"MPEG4Level0\"/>\n\t\t<field name=\"MPEG4Level0b\"/>\n\t\t<field name=\"MPEG4Level1\"/>\n\t\t<field name=\"MPEG4Level2\"/>\n\t\t<field name=\"MPEG4Level3\"/>\n\t\t<field name=\"MPEG4Level3b\" since=\"24\"/>\n\t\t<field name=\"MPEG4Level4\"/>\n\t\t<field name=\"MPEG4Level4a\"/>\n\t\t<field name=\"MPEG4Level5\"/>\n\t\t<field name=\"MPEG4Level6\" since=\"24\"/>\n\t\t<field name=\"MPEG4ProfileAdvancedCoding\"/>\n\t\t<field name=\"MPEG4ProfileAdvancedCore\"/>\n\t\t<field name=\"MPEG4ProfileAdvancedRealTime\"/>\n\t\t<field name=\"MPEG4ProfileAdvancedScalable\"/>\n\t\t<field name=\"MPEG4ProfileAdvancedSimple\"/>\n\t\t<field name=\"MPEG4ProfileBasicAnimated\"/>\n\t\t<field name=\"MPEG4ProfileCore\"/>\n\t\t<field name=\"MPEG4ProfileCoreScalable\"/>\n\t\t<field name=\"MPEG4ProfileHybrid\"/>\n\t\t<field name=\"MPEG4ProfileMain\"/>\n\t\t<field name=\"MPEG4ProfileNbit\"/>\n\t\t<field name=\"MPEG4ProfileScalableTexture\"/>\n\t\t<field name=\"MPEG4ProfileSimple\"/>\n\t\t<field name=\"MPEG4ProfileSimpleFBA\"/>\n\t\t<field name=\"MPEG4ProfileSimpleFace\"/>\n\t\t<field name=\"MPEG4ProfileSimpleScalable\"/>\n\t\t<field name=\"VP8Level_Version0\" since=\"18\"/>\n\t\t<field name=\"VP8Level_Version1\" since=\"18\"/>\n\t\t<field name=\"VP8Level_Version2\" since=\"18\"/>\n\t\t<field name=\"VP8Level_Version3\" since=\"18\"/>\n\t\t<field name=\"VP8ProfileMain\" since=\"18\"/>\n\t\t<field name=\"VP9Level1\" since=\"24\"/>\n\t\t<field name=\"VP9Level11\" since=\"24\"/>\n\t\t<field name=\"VP9Level2\" since=\"24\"/>\n\t\t<field name=\"VP9Level21\" since=\"24\"/>\n\t\t<field name=\"VP9Level3\" since=\"24\"/>\n\t\t<field name=\"VP9Level31\" since=\"24\"/>\n\t\t<field name=\"VP9Level4\" since=\"24\"/>\n\t\t<field name=\"VP9Level41\" since=\"24\"/>\n\t\t<field name=\"VP9Level5\" since=\"24\"/>\n\t\t<field name=\"VP9Level51\" since=\"24\"/>\n\t\t<field name=\"VP9Level52\" since=\"24\"/>\n\t\t<field name=\"VP9Level6\" since=\"24\"/>\n\t\t<field name=\"VP9Level61\" since=\"24\"/>\n\t\t<field name=\"VP9Level62\" since=\"24\"/>\n\t\t<field name=\"VP9Profile0\" since=\"24\"/>\n\t\t<field name=\"VP9Profile1\" since=\"24\"/>\n\t\t<field name=\"VP9Profile2\" since=\"24\"/>\n\t\t<field name=\"VP9Profile2HDR\" since=\"24\"/>\n\t\t<field name=\"VP9Profile2HDR10Plus\" since=\"29\"/>\n\t\t<field name=\"VP9Profile3\" since=\"24\"/>\n\t\t<field name=\"VP9Profile3HDR\" since=\"24\"/>\n\t\t<field name=\"VP9Profile3HDR10Plus\" since=\"29\"/>\n\t\t<field name=\"level\"/>\n\t\t<field name=\"profile\"/>\n\t</class>\n\t<class name=\"android/media/MediaCodecInfo$EncoderCapabilities\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getComplexityRange()Landroid/util/Range;\"/>\n\t\t<method name=\"getQualityRange()Landroid/util/Range;\" since=\"28\"/>\n\t\t<method name=\"isBitrateModeSupported(I)Z\"/>\n\t\t<field name=\"BITRATE_MODE_CBR\"/>\n\t\t<field name=\"BITRATE_MODE_CQ\"/>\n\t\t<field name=\"BITRATE_MODE_VBR\"/>\n\t</class>\n\t<class name=\"android/media/MediaCodecInfo$VideoCapabilities\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"areSizeAndRateSupported(IID)Z\"/>\n\t\t<method name=\"getAchievableFrameRatesFor(II)Landroid/util/Range;\" since=\"23\"/>\n\t\t<method name=\"getBitrateRange()Landroid/util/Range;\"/>\n\t\t<method name=\"getHeightAlignment()I\"/>\n\t\t<method name=\"getSupportedFrameRates()Landroid/util/Range;\"/>\n\t\t<method name=\"getSupportedFrameRatesFor(II)Landroid/util/Range;\"/>\n\t\t<method name=\"getSupportedHeights()Landroid/util/Range;\"/>\n\t\t<method name=\"getSupportedHeightsFor(I)Landroid/util/Range;\"/>\n\t\t<method name=\"getSupportedPerformancePoints()Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"getSupportedWidths()Landroid/util/Range;\"/>\n\t\t<method name=\"getSupportedWidthsFor(I)Landroid/util/Range;\"/>\n\t\t<method name=\"getWidthAlignment()I\"/>\n\t\t<method name=\"isSizeSupported(II)Z\"/>\n\t</class>\n\t<class name=\"android/media/MediaCodecInfo$VideoCapabilities$PerformancePoint\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"covers(Landroid/media/MediaCodecInfo$VideoCapabilities$PerformancePoint;)Z\"/>\n\t\t<method name=\"covers(Landroid/media/MediaFormat;)Z\"/>\n\t\t<field name=\"FHD_100\"/>\n\t\t<field name=\"FHD_120\"/>\n\t\t<field name=\"FHD_200\"/>\n\t\t<field name=\"FHD_24\"/>\n\t\t<field name=\"FHD_240\"/>\n\t\t<field name=\"FHD_25\"/>\n\t\t<field name=\"FHD_30\"/>\n\t\t<field name=\"FHD_50\"/>\n\t\t<field name=\"FHD_60\"/>\n\t\t<field name=\"HD_100\"/>\n\t\t<field name=\"HD_120\"/>\n\t\t<field name=\"HD_200\"/>\n\t\t<field name=\"HD_24\"/>\n\t\t<field name=\"HD_240\"/>\n\t\t<field name=\"HD_25\"/>\n\t\t<field name=\"HD_30\"/>\n\t\t<field name=\"HD_50\"/>\n\t\t<field name=\"HD_60\"/>\n\t\t<field name=\"SD_24\"/>\n\t\t<field name=\"SD_25\"/>\n\t\t<field name=\"SD_30\"/>\n\t\t<field name=\"SD_48\"/>\n\t\t<field name=\"SD_50\"/>\n\t\t<field name=\"SD_60\"/>\n\t\t<field name=\"UHD_100\"/>\n\t\t<field name=\"UHD_120\"/>\n\t\t<field name=\"UHD_200\"/>\n\t\t<field name=\"UHD_24\"/>\n\t\t<field name=\"UHD_240\"/>\n\t\t<field name=\"UHD_25\"/>\n\t\t<field name=\"UHD_30\"/>\n\t\t<field name=\"UHD_50\"/>\n\t\t<field name=\"UHD_60\"/>\n\t</class>\n\t<class name=\"android/media/MediaCodecList\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\" since=\"21\"/>\n\t\t<method name=\"findDecoderForFormat(Landroid/media/MediaFormat;)Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"findEncoderForFormat(Landroid/media/MediaFormat;)Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"getCodecCount()I\" deprecated=\"21\"/>\n\t\t<method name=\"getCodecInfoAt(I)Landroid/media/MediaCodecInfo;\" deprecated=\"21\"/>\n\t\t<method name=\"getCodecInfos()[Landroid/media/MediaCodecInfo;\" since=\"21\"/>\n\t\t<field name=\"ALL_CODECS\" since=\"21\"/>\n\t\t<field name=\"REGULAR_CODECS\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/media/MediaController2\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"cancelSessionCommand(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"getConnectedToken()Landroid/media/Session2Token;\"/>\n\t\t<method name=\"isPlaybackActive()Z\"/>\n\t\t<method name=\"sendSessionCommand(Landroid/media/Session2Command;Landroid/os/Bundle;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"android/media/MediaController2$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/media/Session2Token;)V\"/>\n\t\t<method name=\"build()Landroid/media/MediaController2;\"/>\n\t\t<method name=\"setConnectionHints(Landroid/os/Bundle;)Landroid/media/MediaController2$Builder;\"/>\n\t\t<method name=\"setControllerCallback(Ljava/util/concurrent/Executor;Landroid/media/MediaController2$ControllerCallback;)Landroid/media/MediaController2$Builder;\"/>\n\t</class>\n\t<class name=\"android/media/MediaController2$ControllerCallback\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCommandResult(Landroid/media/MediaController2;Ljava/lang/Object;Landroid/media/Session2Command;Landroid/media/Session2Command$Result;)V\"/>\n\t\t<method name=\"onConnected(Landroid/media/MediaController2;Landroid/media/Session2CommandGroup;)V\"/>\n\t\t<method name=\"onDisconnected(Landroid/media/MediaController2;)V\"/>\n\t\t<method name=\"onPlaybackActiveChanged(Landroid/media/MediaController2;Z)V\"/>\n\t\t<method name=\"onSessionCommand(Landroid/media/MediaController2;Landroid/media/Session2Command;Landroid/os/Bundle;)Landroid/media/Session2Command$Result;\"/>\n\t</class>\n\t<class name=\"android/media/MediaCrypto\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/UUID;[B)V\"/>\n\t\t<method name=\"isCryptoSchemeSupported(Ljava/util/UUID;)Z\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"requiresSecureDecoderComponent(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"setMediaDrmSession([B)V\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/media/MediaCryptoException\" since=\"16\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaDataSource\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getSize()J\"/>\n\t\t<method name=\"readAt(J[BII)I\"/>\n\t</class>\n\t<class name=\"android/media/MediaDescrambler\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"descramble(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;Landroid/media/MediaCodec$CryptoInfo;)I\"/>\n\t\t<method name=\"requiresSecureDecoderComponent(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"setMediaCasSession(Landroid/media/MediaCas$Session;)V\"/>\n\t\t<field name=\"SCRAMBLE_CONTROL_EVEN_KEY\" since=\"28\"/>\n\t\t<field name=\"SCRAMBLE_CONTROL_ODD_KEY\" since=\"28\"/>\n\t\t<field name=\"SCRAMBLE_CONTROL_RESERVED\" since=\"28\"/>\n\t\t<field name=\"SCRAMBLE_CONTROL_UNSCRAMBLED\" since=\"28\"/>\n\t\t<field name=\"SCRAMBLE_FLAG_PES_HEADER\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/media/MediaDescription\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getDescription()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getIconBitmap()Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"getIconUri()Landroid/net/Uri;\"/>\n\t\t<method name=\"getMediaId()Ljava/lang/String;\"/>\n\t\t<method name=\"getMediaUri()Landroid/net/Uri;\" since=\"23\"/>\n\t\t<method name=\"getSubtitle()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTitle()Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"BT_FOLDER_TYPE_ALBUMS\" since=\"26\"/>\n\t\t<field name=\"BT_FOLDER_TYPE_ARTISTS\" since=\"26\"/>\n\t\t<field name=\"BT_FOLDER_TYPE_GENRES\" since=\"26\"/>\n\t\t<field name=\"BT_FOLDER_TYPE_MIXED\" since=\"26\"/>\n\t\t<field name=\"BT_FOLDER_TYPE_PLAYLISTS\" since=\"26\"/>\n\t\t<field name=\"BT_FOLDER_TYPE_TITLES\" since=\"26\"/>\n\t\t<field name=\"BT_FOLDER_TYPE_YEARS\" since=\"26\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"EXTRA_BT_FOLDER_TYPE\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/media/MediaDescription$Builder\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/media/MediaDescription;\"/>\n\t\t<method name=\"setDescription(Ljava/lang/CharSequence;)Landroid/media/MediaDescription$Builder;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/media/MediaDescription$Builder;\"/>\n\t\t<method name=\"setIconBitmap(Landroid/graphics/Bitmap;)Landroid/media/MediaDescription$Builder;\"/>\n\t\t<method name=\"setIconUri(Landroid/net/Uri;)Landroid/media/MediaDescription$Builder;\"/>\n\t\t<method name=\"setMediaId(Ljava/lang/String;)Landroid/media/MediaDescription$Builder;\"/>\n\t\t<method name=\"setMediaUri(Landroid/net/Uri;)Landroid/media/MediaDescription$Builder;\" since=\"23\"/>\n\t\t<method name=\"setSubtitle(Ljava/lang/CharSequence;)Landroid/media/MediaDescription$Builder;\"/>\n\t\t<method name=\"setTitle(Ljava/lang/CharSequence;)Landroid/media/MediaDescription$Builder;\"/>\n\t</class>\n\t<class name=\"android/media/MediaDrm\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\" since=\"28\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/UUID;)V\"/>\n\t\t<method name=\"clearOnEventListener()V\" since=\"29\"/>\n\t\t<method name=\"clearOnExpirationUpdateListener()V\" since=\"29\"/>\n\t\t<method name=\"clearOnKeyStatusChangeListener()V\" since=\"29\"/>\n\t\t<method name=\"clearOnSessionLostStateListener()V\" since=\"29\"/>\n\t\t<method name=\"closeSession([B)V\"/>\n\t\t<method name=\"getConnectedHdcpLevel()I\" since=\"28\"/>\n\t\t<method name=\"getCryptoSession([BLjava/lang/String;Ljava/lang/String;)Landroid/media/MediaDrm$CryptoSession;\"/>\n\t\t<method name=\"getKeyRequest([B[BLjava/lang/String;ILjava/util/HashMap;)Landroid/media/MediaDrm$KeyRequest;\"/>\n\t\t<method name=\"getMaxHdcpLevel()I\" since=\"28\"/>\n\t\t<method name=\"getMaxSecurityLevel()I\" since=\"28\"/>\n\t\t<method name=\"getMaxSessionCount()I\" since=\"28\"/>\n\t\t<method name=\"getMetrics()Landroid/os/PersistableBundle;\" since=\"28\"/>\n\t\t<method name=\"getOfflineLicenseKeySetIds()Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"getOfflineLicenseState([B)I\" since=\"29\"/>\n\t\t<method name=\"getOpenSessionCount()I\" since=\"28\"/>\n\t\t<method name=\"getPropertyByteArray(Ljava/lang/String;)[B\"/>\n\t\t<method name=\"getPropertyString(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getProvisionRequest()Landroid/media/MediaDrm$ProvisionRequest;\"/>\n\t\t<method name=\"getSecureStop([B)[B\" since=\"22\"/>\n\t\t<method name=\"getSecureStopIds()Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"getSecureStops()Ljava/util/List;\"/>\n\t\t<method name=\"getSecurityLevel([B)I\" since=\"28\"/>\n\t\t<method name=\"isCryptoSchemeSupported(Ljava/util/UUID;)Z\"/>\n\t\t<method name=\"isCryptoSchemeSupported(Ljava/util/UUID;Ljava/lang/String;)Z\" since=\"19\"/>\n\t\t<method name=\"isCryptoSchemeSupported(Ljava/util/UUID;Ljava/lang/String;I)Z\" since=\"29\"/>\n\t\t<method name=\"openSession()[B\"/>\n\t\t<method name=\"openSession(I)[B\" since=\"28\"/>\n\t\t<method name=\"provideKeyResponse([B[B)[B\"/>\n\t\t<method name=\"provideProvisionResponse([B)V\"/>\n\t\t<method name=\"queryKeyStatus([B)Ljava/util/HashMap;\"/>\n\t\t<method name=\"release()V\" deprecated=\"28\"/>\n\t\t<method name=\"releaseAllSecureStops()V\" since=\"22\" deprecated=\"28\"/>\n\t\t<method name=\"releaseSecureStops([B)V\"/>\n\t\t<method name=\"removeAllSecureStops()V\" since=\"28\"/>\n\t\t<method name=\"removeKeys([B)V\"/>\n\t\t<method name=\"removeOfflineLicense([B)V\" since=\"29\"/>\n\t\t<method name=\"removeSecureStop([B)V\" since=\"28\"/>\n\t\t<method name=\"restoreKeys([B[B)V\"/>\n\t\t<method name=\"setOnEventListener(Landroid/media/MediaDrm$OnEventListener;)V\"/>\n\t\t<method name=\"setOnEventListener(Landroid/media/MediaDrm$OnEventListener;Landroid/os/Handler;)V\" since=\"29\"/>\n\t\t<method name=\"setOnEventListener(Ljava/util/concurrent/Executor;Landroid/media/MediaDrm$OnEventListener;)V\" since=\"29\"/>\n\t\t<method name=\"setOnExpirationUpdateListener(Landroid/media/MediaDrm$OnExpirationUpdateListener;Landroid/os/Handler;)V\" since=\"23\"/>\n\t\t<method name=\"setOnExpirationUpdateListener(Ljava/util/concurrent/Executor;Landroid/media/MediaDrm$OnExpirationUpdateListener;)V\" since=\"29\"/>\n\t\t<method name=\"setOnKeyStatusChangeListener(Landroid/media/MediaDrm$OnKeyStatusChangeListener;Landroid/os/Handler;)V\" since=\"23\"/>\n\t\t<method name=\"setOnKeyStatusChangeListener(Ljava/util/concurrent/Executor;Landroid/media/MediaDrm$OnKeyStatusChangeListener;)V\" since=\"29\"/>\n\t\t<method name=\"setOnSessionLostStateListener(Landroid/media/MediaDrm$OnSessionLostStateListener;Landroid/os/Handler;)V\" since=\"29\"/>\n\t\t<method name=\"setOnSessionLostStateListener(Ljava/util/concurrent/Executor;Landroid/media/MediaDrm$OnSessionLostStateListener;)V\" since=\"29\"/>\n\t\t<method name=\"setPropertyByteArray(Ljava/lang/String;[B)V\"/>\n\t\t<method name=\"setPropertyString(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<field name=\"EVENT_KEY_EXPIRED\" deprecated=\"26\"/>\n\t\t<field name=\"EVENT_KEY_REQUIRED\"/>\n\t\t<field name=\"EVENT_PROVISION_REQUIRED\" deprecated=\"23\"/>\n\t\t<field name=\"EVENT_SESSION_RECLAIMED\" since=\"23\"/>\n\t\t<field name=\"EVENT_VENDOR_DEFINED\"/>\n\t\t<field name=\"HDCP_LEVEL_UNKNOWN\" since=\"28\"/>\n\t\t<field name=\"HDCP_NONE\" since=\"28\"/>\n\t\t<field name=\"HDCP_NO_DIGITAL_OUTPUT\" since=\"28\"/>\n\t\t<field name=\"HDCP_V1\" since=\"28\"/>\n\t\t<field name=\"HDCP_V2\" since=\"28\"/>\n\t\t<field name=\"HDCP_V2_1\" since=\"28\"/>\n\t\t<field name=\"HDCP_V2_2\" since=\"28\"/>\n\t\t<field name=\"HDCP_V2_3\" since=\"29\"/>\n\t\t<field name=\"KEY_TYPE_OFFLINE\"/>\n\t\t<field name=\"KEY_TYPE_RELEASE\"/>\n\t\t<field name=\"KEY_TYPE_STREAMING\"/>\n\t\t<field name=\"OFFLINE_LICENSE_STATE_RELEASED\" since=\"29\"/>\n\t\t<field name=\"OFFLINE_LICENSE_STATE_UNKNOWN\" since=\"29\"/>\n\t\t<field name=\"OFFLINE_LICENSE_STATE_USABLE\" since=\"29\"/>\n\t\t<field name=\"PROPERTY_ALGORITHMS\"/>\n\t\t<field name=\"PROPERTY_DESCRIPTION\"/>\n\t\t<field name=\"PROPERTY_DEVICE_UNIQUE_ID\"/>\n\t\t<field name=\"PROPERTY_VENDOR\"/>\n\t\t<field name=\"PROPERTY_VERSION\"/>\n\t\t<field name=\"SECURITY_LEVEL_HW_SECURE_ALL\" since=\"28\"/>\n\t\t<field name=\"SECURITY_LEVEL_HW_SECURE_CRYPTO\" since=\"28\"/>\n\t\t<field name=\"SECURITY_LEVEL_HW_SECURE_DECODE\" since=\"28\"/>\n\t\t<field name=\"SECURITY_LEVEL_SW_SECURE_CRYPTO\" since=\"28\"/>\n\t\t<field name=\"SECURITY_LEVEL_SW_SECURE_DECODE\" since=\"28\"/>\n\t\t<field name=\"SECURITY_LEVEL_UNKNOWN\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/media/MediaDrm$CryptoSession\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"decrypt([B[B[B)[B\"/>\n\t\t<method name=\"encrypt([B[B[B)[B\"/>\n\t\t<method name=\"sign([B[B)[B\"/>\n\t\t<method name=\"verify([B[B[B)Z\"/>\n\t</class>\n\t<class name=\"android/media/MediaDrm$HdcpLevel\" since=\"28\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t</class>\n\t<class name=\"android/media/MediaDrm$KeyRequest\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getData()[B\"/>\n\t\t<method name=\"getDefaultUrl()Ljava/lang/String;\"/>\n\t\t<method name=\"getRequestType()I\" since=\"23\"/>\n\t\t<field name=\"REQUEST_TYPE_INITIAL\" since=\"23\"/>\n\t\t<field name=\"REQUEST_TYPE_NONE\" since=\"28\"/>\n\t\t<field name=\"REQUEST_TYPE_RELEASE\" since=\"23\"/>\n\t\t<field name=\"REQUEST_TYPE_RENEWAL\" since=\"23\"/>\n\t\t<field name=\"REQUEST_TYPE_UPDATE\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/media/MediaDrm$KeyStatus\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getKeyId()[B\"/>\n\t\t<method name=\"getStatusCode()I\"/>\n\t\t<field name=\"STATUS_EXPIRED\"/>\n\t\t<field name=\"STATUS_INTERNAL_ERROR\"/>\n\t\t<field name=\"STATUS_OUTPUT_NOT_ALLOWED\"/>\n\t\t<field name=\"STATUS_PENDING\"/>\n\t\t<field name=\"STATUS_USABLE\"/>\n\t\t<field name=\"STATUS_USABLE_IN_FUTURE\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/media/MediaDrm$MediaDrmStateException\" since=\"21\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"getDiagnosticInfo()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/media/MediaDrm$MetricsConstants\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CLOSE_SESSION_ERROR_COUNT\"/>\n\t\t<field name=\"CLOSE_SESSION_ERROR_LIST\"/>\n\t\t<field name=\"CLOSE_SESSION_OK_COUNT\"/>\n\t\t<field name=\"EVENT_KEY_EXPIRED_COUNT\"/>\n\t\t<field name=\"EVENT_KEY_NEEDED_COUNT\"/>\n\t\t<field name=\"EVENT_PROVISION_REQUIRED_COUNT\"/>\n\t\t<field name=\"EVENT_SESSION_RECLAIMED_COUNT\"/>\n\t\t<field name=\"EVENT_VENDOR_DEFINED_COUNT\"/>\n\t\t<field name=\"GET_DEVICE_UNIQUE_ID_ERROR_COUNT\"/>\n\t\t<field name=\"GET_DEVICE_UNIQUE_ID_ERROR_LIST\"/>\n\t\t<field name=\"GET_DEVICE_UNIQUE_ID_OK_COUNT\"/>\n\t\t<field name=\"GET_KEY_REQUEST_ERROR_COUNT\"/>\n\t\t<field name=\"GET_KEY_REQUEST_ERROR_LIST\"/>\n\t\t<field name=\"GET_KEY_REQUEST_OK_COUNT\"/>\n\t\t<field name=\"GET_KEY_REQUEST_OK_TIME_MICROS\"/>\n\t\t<field name=\"GET_PROVISION_REQUEST_ERROR_COUNT\"/>\n\t\t<field name=\"GET_PROVISION_REQUEST_ERROR_LIST\"/>\n\t\t<field name=\"GET_PROVISION_REQUEST_OK_COUNT\"/>\n\t\t<field name=\"KEY_STATUS_EXPIRED_COUNT\"/>\n\t\t<field name=\"KEY_STATUS_INTERNAL_ERROR_COUNT\"/>\n\t\t<field name=\"KEY_STATUS_OUTPUT_NOT_ALLOWED_COUNT\"/>\n\t\t<field name=\"KEY_STATUS_PENDING_COUNT\"/>\n\t\t<field name=\"KEY_STATUS_USABLE_COUNT\"/>\n\t\t<field name=\"OPEN_SESSION_ERROR_COUNT\"/>\n\t\t<field name=\"OPEN_SESSION_ERROR_LIST\"/>\n\t\t<field name=\"OPEN_SESSION_OK_COUNT\"/>\n\t\t<field name=\"PROVIDE_KEY_RESPONSE_ERROR_COUNT\"/>\n\t\t<field name=\"PROVIDE_KEY_RESPONSE_ERROR_LIST\"/>\n\t\t<field name=\"PROVIDE_KEY_RESPONSE_OK_COUNT\"/>\n\t\t<field name=\"PROVIDE_KEY_RESPONSE_OK_TIME_MICROS\"/>\n\t\t<field name=\"PROVIDE_PROVISION_RESPONSE_ERROR_COUNT\"/>\n\t\t<field name=\"PROVIDE_PROVISION_RESPONSE_ERROR_LIST\"/>\n\t\t<field name=\"PROVIDE_PROVISION_RESPONSE_OK_COUNT\"/>\n\t\t<field name=\"SESSION_END_TIMES_MS\"/>\n\t\t<field name=\"SESSION_START_TIMES_MS\"/>\n\t</class>\n\t<class name=\"android/media/MediaDrm$OnEventListener\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onEvent(Landroid/media/MediaDrm;[BII[B)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaDrm$OnExpirationUpdateListener\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onExpirationUpdate(Landroid/media/MediaDrm;[BJ)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaDrm$OnKeyStatusChangeListener\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onKeyStatusChange(Landroid/media/MediaDrm;[BLjava/util/List;Z)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaDrm$OnSessionLostStateListener\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onSessionLostState(Landroid/media/MediaDrm;[B)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaDrm$ProvisionRequest\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getData()[B\"/>\n\t\t<method name=\"getDefaultUrl()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/media/MediaDrm$SecurityLevel\" since=\"28\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t</class>\n\t<class name=\"android/media/MediaDrm$SessionException\" since=\"29\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/String;)V\"/>\n\t\t<method name=\"getErrorCode()I\"/>\n\t\t<field name=\"ERROR_RESOURCE_CONTENTION\"/>\n\t\t<field name=\"ERROR_UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/media/MediaDrmException\" since=\"18\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaDrmResetException\" since=\"23\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaExtractor\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"advance()Z\"/>\n\t\t<method name=\"getAudioPresentations(I)Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"getCachedDuration()J\"/>\n\t\t<method name=\"getCasInfo(I)Landroid/media/MediaExtractor$CasInfo;\" since=\"26\"/>\n\t\t<method name=\"getDrmInitData()Landroid/media/DrmInitData;\" since=\"24\"/>\n\t\t<method name=\"getMetrics()Landroid/os/PersistableBundle;\" since=\"26\"/>\n\t\t<method name=\"getPsshInfo()Ljava/util/Map;\" since=\"18\"/>\n\t\t<method name=\"getSampleCryptoInfo(Landroid/media/MediaCodec$CryptoInfo;)Z\"/>\n\t\t<method name=\"getSampleFlags()I\"/>\n\t\t<method name=\"getSampleSize()J\" since=\"28\"/>\n\t\t<method name=\"getSampleTime()J\"/>\n\t\t<method name=\"getSampleTrackIndex()I\"/>\n\t\t<method name=\"getTrackCount()I\"/>\n\t\t<method name=\"getTrackFormat(I)Landroid/media/MediaFormat;\"/>\n\t\t<method name=\"hasCacheReachedEndOfStream()Z\"/>\n\t\t<method name=\"readSampleData(Ljava/nio/ByteBuffer;I)I\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"seekTo(JI)V\"/>\n\t\t<method name=\"selectTrack(I)V\"/>\n\t\t<method name=\"setDataSource(Landroid/content/Context;Landroid/net/Uri;Ljava/util/Map;)V\"/>\n\t\t<method name=\"setDataSource(Landroid/content/res/AssetFileDescriptor;)V\" since=\"24\"/>\n\t\t<method name=\"setDataSource(Landroid/media/MediaDataSource;)V\" since=\"23\"/>\n\t\t<method name=\"setDataSource(Ljava/io/FileDescriptor;)V\"/>\n\t\t<method name=\"setDataSource(Ljava/io/FileDescriptor;JJ)V\"/>\n\t\t<method name=\"setDataSource(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setDataSource(Ljava/lang/String;Ljava/util/Map;)V\"/>\n\t\t<method name=\"setMediaCas(Landroid/media/MediaCas;)V\" since=\"26\"/>\n\t\t<method name=\"unselectTrack(I)V\"/>\n\t\t<field name=\"SAMPLE_FLAG_ENCRYPTED\"/>\n\t\t<field name=\"SAMPLE_FLAG_PARTIAL_FRAME\" since=\"26\"/>\n\t\t<field name=\"SAMPLE_FLAG_SYNC\"/>\n\t\t<field name=\"SEEK_TO_CLOSEST_SYNC\"/>\n\t\t<field name=\"SEEK_TO_NEXT_SYNC\"/>\n\t\t<field name=\"SEEK_TO_PREVIOUS_SYNC\"/>\n\t</class>\n\t<class name=\"android/media/MediaExtractor$CasInfo\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getPrivateData()[B\" since=\"29\"/>\n\t\t<method name=\"getSession()Landroid/media/MediaCas$Session;\"/>\n\t\t<method name=\"getSystemId()I\"/>\n\t</class>\n\t<class name=\"android/media/MediaExtractor$MetricsConstants\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"FORMAT\"/>\n\t\t<field name=\"MIME_TYPE\"/>\n\t\t<field name=\"TRACKS\"/>\n\t</class>\n\t<class name=\"android/media/MediaFormat\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/media/MediaFormat;)V\" since=\"29\"/>\n\t\t<method name=\"containsFeature(Ljava/lang/String;)Z\" since=\"29\"/>\n\t\t<method name=\"containsKey(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"createAudioFormat(Ljava/lang/String;II)Landroid/media/MediaFormat;\"/>\n\t\t<method name=\"createSubtitleFormat(Ljava/lang/String;Ljava/lang/String;)Landroid/media/MediaFormat;\" since=\"19\"/>\n\t\t<method name=\"createVideoFormat(Ljava/lang/String;II)Landroid/media/MediaFormat;\"/>\n\t\t<method name=\"getByteBuffer(Ljava/lang/String;)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"getByteBuffer(Ljava/lang/String;Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;\" since=\"29\"/>\n\t\t<method name=\"getFeatureEnabled(Ljava/lang/String;)Z\" since=\"21\"/>\n\t\t<method name=\"getFeatures()Ljava/util/Set;\" since=\"29\"/>\n\t\t<method name=\"getFloat(Ljava/lang/String;)F\"/>\n\t\t<method name=\"getFloat(Ljava/lang/String;F)F\" since=\"29\"/>\n\t\t<method name=\"getInteger(Ljava/lang/String;)I\"/>\n\t\t<method name=\"getInteger(Ljava/lang/String;I)I\" since=\"29\"/>\n\t\t<method name=\"getKeys()Ljava/util/Set;\" since=\"29\"/>\n\t\t<method name=\"getLong(Ljava/lang/String;)J\"/>\n\t\t<method name=\"getLong(Ljava/lang/String;J)J\" since=\"29\"/>\n\t\t<method name=\"getNumber(Ljava/lang/String;)Ljava/lang/Number;\" since=\"29\"/>\n\t\t<method name=\"getNumber(Ljava/lang/String;Ljava/lang/Number;)Ljava/lang/Number;\" since=\"29\"/>\n\t\t<method name=\"getString(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getValueTypeForKey(Ljava/lang/String;)I\" since=\"29\"/>\n\t\t<method name=\"removeFeature(Ljava/lang/String;)V\" since=\"29\"/>\n\t\t<method name=\"removeKey(Ljava/lang/String;)V\" since=\"29\"/>\n\t\t<method name=\"setByteBuffer(Ljava/lang/String;Ljava/nio/ByteBuffer;)V\"/>\n\t\t<method name=\"setFeatureEnabled(Ljava/lang/String;Z)V\" since=\"21\"/>\n\t\t<method name=\"setFloat(Ljava/lang/String;F)V\"/>\n\t\t<method name=\"setInteger(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"setLong(Ljava/lang/String;J)V\"/>\n\t\t<method name=\"setString(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<field name=\"COLOR_RANGE_FULL\" since=\"24\"/>\n\t\t<field name=\"COLOR_RANGE_LIMITED\" since=\"24\"/>\n\t\t<field name=\"COLOR_STANDARD_BT2020\" since=\"24\"/>\n\t\t<field name=\"COLOR_STANDARD_BT601_NTSC\" since=\"24\"/>\n\t\t<field name=\"COLOR_STANDARD_BT601_PAL\" since=\"24\"/>\n\t\t<field name=\"COLOR_STANDARD_BT709\" since=\"24\"/>\n\t\t<field name=\"COLOR_TRANSFER_HLG\" since=\"24\"/>\n\t\t<field name=\"COLOR_TRANSFER_LINEAR\" since=\"24\"/>\n\t\t<field name=\"COLOR_TRANSFER_SDR_VIDEO\" since=\"24\"/>\n\t\t<field name=\"COLOR_TRANSFER_ST2084\" since=\"24\"/>\n\t\t<field name=\"KEY_AAC_DRC_ATTENUATION_FACTOR\" since=\"21\"/>\n\t\t<field name=\"KEY_AAC_DRC_BOOST_FACTOR\" since=\"21\"/>\n\t\t<field name=\"KEY_AAC_DRC_EFFECT_TYPE\" since=\"28\"/>\n\t\t<field name=\"KEY_AAC_DRC_HEAVY_COMPRESSION\" since=\"21\"/>\n\t\t<field name=\"KEY_AAC_DRC_TARGET_REFERENCE_LEVEL\" since=\"21\"/>\n\t\t<field name=\"KEY_AAC_ENCODED_TARGET_LEVEL\" since=\"21\"/>\n\t\t<field name=\"KEY_AAC_MAX_OUTPUT_CHANNEL_COUNT\" since=\"21\"/>\n\t\t<field name=\"KEY_AAC_PROFILE\"/>\n\t\t<field name=\"KEY_AAC_SBR_MODE\" since=\"21\"/>\n\t\t<field name=\"KEY_AUDIO_SESSION_ID\" since=\"21\"/>\n\t\t<field name=\"KEY_BITRATE_MODE\" since=\"21\"/>\n\t\t<field name=\"KEY_BIT_RATE\"/>\n\t\t<field name=\"KEY_CAPTURE_RATE\" since=\"21\"/>\n\t\t<field name=\"KEY_CHANNEL_COUNT\"/>\n\t\t<field name=\"KEY_CHANNEL_MASK\"/>\n\t\t<field name=\"KEY_COLOR_FORMAT\"/>\n\t\t<field name=\"KEY_COLOR_RANGE\" since=\"24\"/>\n\t\t<field name=\"KEY_COLOR_STANDARD\" since=\"24\"/>\n\t\t<field name=\"KEY_COLOR_TRANSFER\" since=\"24\"/>\n\t\t<field name=\"KEY_COMPLEXITY\" since=\"21\"/>\n\t\t<field name=\"KEY_CREATE_INPUT_SURFACE_SUSPENDED\" since=\"29\"/>\n\t\t<field name=\"KEY_DURATION\"/>\n\t\t<field name=\"KEY_FLAC_COMPRESSION_LEVEL\"/>\n\t\t<field name=\"KEY_FRAME_RATE\"/>\n\t\t<field name=\"KEY_GRID_COLUMNS\" since=\"28\"/>\n\t\t<field name=\"KEY_GRID_ROWS\" since=\"28\"/>\n\t\t<field name=\"KEY_HAPTIC_CHANNEL_COUNT\" since=\"29\"/>\n\t\t<field name=\"KEY_HDR10_PLUS_INFO\" since=\"29\"/>\n\t\t<field name=\"KEY_HDR_STATIC_INFO\" since=\"24\"/>\n\t\t<field name=\"KEY_HEIGHT\"/>\n\t\t<field name=\"KEY_INTRA_REFRESH_PERIOD\" since=\"24\"/>\n\t\t<field name=\"KEY_IS_ADTS\"/>\n\t\t<field name=\"KEY_IS_AUTOSELECT\" since=\"19\"/>\n\t\t<field name=\"KEY_IS_DEFAULT\" since=\"19\"/>\n\t\t<field name=\"KEY_IS_FORCED_SUBTITLE\" since=\"19\"/>\n\t\t<field name=\"KEY_I_FRAME_INTERVAL\"/>\n\t\t<field name=\"KEY_LANGUAGE\" since=\"19\"/>\n\t\t<field name=\"KEY_LATENCY\" since=\"26\"/>\n\t\t<field name=\"KEY_LEVEL\" since=\"23\"/>\n\t\t<field name=\"KEY_MAX_B_FRAMES\" since=\"29\"/>\n\t\t<field name=\"KEY_MAX_FPS_TO_ENCODER\" since=\"29\"/>\n\t\t<field name=\"KEY_MAX_HEIGHT\" since=\"19\"/>\n\t\t<field name=\"KEY_MAX_INPUT_SIZE\"/>\n\t\t<field name=\"KEY_MAX_PTS_GAP_TO_ENCODER\" since=\"29\"/>\n\t\t<field name=\"KEY_MAX_WIDTH\" since=\"19\"/>\n\t\t<field name=\"KEY_MIME\"/>\n\t\t<field name=\"KEY_OPERATING_RATE\" since=\"23\"/>\n\t\t<field name=\"KEY_OUTPUT_REORDER_DEPTH\" since=\"28\"/>\n\t\t<field name=\"KEY_PCM_ENCODING\" since=\"24\"/>\n\t\t<field name=\"KEY_PREPEND_HEADER_TO_SYNC_FRAMES\" since=\"29\"/>\n\t\t<field name=\"KEY_PRIORITY\" since=\"23\"/>\n\t\t<field name=\"KEY_PROFILE\" since=\"21\"/>\n\t\t<field name=\"KEY_PUSH_BLANK_BUFFERS_ON_STOP\" since=\"19\"/>\n\t\t<field name=\"KEY_QUALITY\" since=\"28\"/>\n\t\t<field name=\"KEY_REPEAT_PREVIOUS_FRAME_AFTER\" since=\"19\"/>\n\t\t<field name=\"KEY_ROTATION\" since=\"23\"/>\n\t\t<field name=\"KEY_SAMPLE_RATE\"/>\n\t\t<field name=\"KEY_SLICE_HEIGHT\" since=\"23\"/>\n\t\t<field name=\"KEY_STRIDE\" since=\"23\"/>\n\t\t<field name=\"KEY_TEMPORAL_LAYERING\" since=\"21\"/>\n\t\t<field name=\"KEY_TILE_HEIGHT\" since=\"28\"/>\n\t\t<field name=\"KEY_TILE_WIDTH\" since=\"28\"/>\n\t\t<field name=\"KEY_TRACK_ID\" since=\"24\"/>\n\t\t<field name=\"KEY_WIDTH\"/>\n\t\t<field name=\"MIMETYPE_AUDIO_AAC\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_AUDIO_AC3\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_AUDIO_AC4\" since=\"29\"/>\n\t\t<field name=\"MIMETYPE_AUDIO_AMR_NB\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_AUDIO_AMR_WB\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_AUDIO_EAC3\" since=\"23\"/>\n\t\t<field name=\"MIMETYPE_AUDIO_EAC3_JOC\" since=\"29\"/>\n\t\t<field name=\"MIMETYPE_AUDIO_FLAC\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_AUDIO_G711_ALAW\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_AUDIO_G711_MLAW\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_AUDIO_MPEG\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_AUDIO_MSGSM\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_AUDIO_OPUS\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_AUDIO_QCELP\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_AUDIO_RAW\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_AUDIO_SCRAMBLED\" since=\"26\"/>\n\t\t<field name=\"MIMETYPE_AUDIO_VORBIS\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_IMAGE_ANDROID_HEIC\" since=\"28\"/>\n\t\t<field name=\"MIMETYPE_TEXT_CEA_608\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_TEXT_CEA_708\" since=\"28\"/>\n\t\t<field name=\"MIMETYPE_TEXT_SUBRIP\" since=\"28\"/>\n\t\t<field name=\"MIMETYPE_TEXT_VTT\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_VIDEO_AV1\" since=\"29\"/>\n\t\t<field name=\"MIMETYPE_VIDEO_AVC\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_VIDEO_DOLBY_VISION\" since=\"24\"/>\n\t\t<field name=\"MIMETYPE_VIDEO_H263\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_VIDEO_HEVC\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_VIDEO_MPEG2\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_VIDEO_MPEG4\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_VIDEO_RAW\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_VIDEO_SCRAMBLED\" since=\"26\"/>\n\t\t<field name=\"MIMETYPE_VIDEO_VP8\" since=\"21\"/>\n\t\t<field name=\"MIMETYPE_VIDEO_VP9\" since=\"21\"/>\n\t\t<field name=\"TYPE_BYTE_BUFFER\" since=\"29\"/>\n\t\t<field name=\"TYPE_FLOAT\" since=\"29\"/>\n\t\t<field name=\"TYPE_INTEGER\" since=\"29\"/>\n\t\t<field name=\"TYPE_LONG\" since=\"29\"/>\n\t\t<field name=\"TYPE_NULL\" since=\"29\"/>\n\t\t<field name=\"TYPE_STRING\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/media/MediaMetadata\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"containsKey(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"getBitmap(Ljava/lang/String;)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"getDescription()Landroid/media/MediaDescription;\"/>\n\t\t<method name=\"getLong(Ljava/lang/String;)J\"/>\n\t\t<method name=\"getRating(Ljava/lang/String;)Landroid/media/Rating;\"/>\n\t\t<method name=\"getString(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getText(Ljava/lang/String;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"keySet()Ljava/util/Set;\"/>\n\t\t<method name=\"size()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"METADATA_KEY_ALBUM\"/>\n\t\t<field name=\"METADATA_KEY_ALBUM_ART\"/>\n\t\t<field name=\"METADATA_KEY_ALBUM_ARTIST\"/>\n\t\t<field name=\"METADATA_KEY_ALBUM_ART_URI\"/>\n\t\t<field name=\"METADATA_KEY_ART\"/>\n\t\t<field name=\"METADATA_KEY_ARTIST\"/>\n\t\t<field name=\"METADATA_KEY_ART_URI\"/>\n\t\t<field name=\"METADATA_KEY_AUTHOR\"/>\n\t\t<field name=\"METADATA_KEY_BT_FOLDER_TYPE\" since=\"26\"/>\n\t\t<field name=\"METADATA_KEY_COMPILATION\"/>\n\t\t<field name=\"METADATA_KEY_COMPOSER\"/>\n\t\t<field name=\"METADATA_KEY_DATE\"/>\n\t\t<field name=\"METADATA_KEY_DISC_NUMBER\"/>\n\t\t<field name=\"METADATA_KEY_DISPLAY_DESCRIPTION\"/>\n\t\t<field name=\"METADATA_KEY_DISPLAY_ICON\"/>\n\t\t<field name=\"METADATA_KEY_DISPLAY_ICON_URI\"/>\n\t\t<field name=\"METADATA_KEY_DISPLAY_SUBTITLE\"/>\n\t\t<field name=\"METADATA_KEY_DISPLAY_TITLE\"/>\n\t\t<field name=\"METADATA_KEY_DURATION\"/>\n\t\t<field name=\"METADATA_KEY_GENRE\"/>\n\t\t<field name=\"METADATA_KEY_MEDIA_ID\"/>\n\t\t<field name=\"METADATA_KEY_MEDIA_URI\" since=\"26\"/>\n\t\t<field name=\"METADATA_KEY_NUM_TRACKS\"/>\n\t\t<field name=\"METADATA_KEY_RATING\"/>\n\t\t<field name=\"METADATA_KEY_TITLE\"/>\n\t\t<field name=\"METADATA_KEY_TRACK_NUMBER\"/>\n\t\t<field name=\"METADATA_KEY_USER_RATING\"/>\n\t\t<field name=\"METADATA_KEY_WRITER\"/>\n\t\t<field name=\"METADATA_KEY_YEAR\"/>\n\t</class>\n\t<class name=\"android/media/MediaMetadata$Builder\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/media/MediaMetadata;)V\"/>\n\t\t<method name=\"build()Landroid/media/MediaMetadata;\"/>\n\t\t<method name=\"putBitmap(Ljava/lang/String;Landroid/graphics/Bitmap;)Landroid/media/MediaMetadata$Builder;\"/>\n\t\t<method name=\"putLong(Ljava/lang/String;J)Landroid/media/MediaMetadata$Builder;\"/>\n\t\t<method name=\"putRating(Ljava/lang/String;Landroid/media/Rating;)Landroid/media/MediaMetadata$Builder;\"/>\n\t\t<method name=\"putString(Ljava/lang/String;Ljava/lang/String;)Landroid/media/MediaMetadata$Builder;\"/>\n\t\t<method name=\"putText(Ljava/lang/String;Ljava/lang/CharSequence;)Landroid/media/MediaMetadata$Builder;\"/>\n\t</class>\n\t<class name=\"android/media/MediaMetadataEditor\" since=\"19\" deprecated=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addEditableKey(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"apply()V\" deprecated=\"29\"/>\n\t\t<method name=\"clear()V\" deprecated=\"29\"/>\n\t\t<method name=\"getBitmap(ILandroid/graphics/Bitmap;)Landroid/graphics/Bitmap;\" deprecated=\"29\"/>\n\t\t<method name=\"getEditableKeys()[I\" deprecated=\"29\"/>\n\t\t<method name=\"getLong(IJ)J\" deprecated=\"29\"/>\n\t\t<method name=\"getObject(ILjava/lang/Object;)Ljava/lang/Object;\" deprecated=\"29\"/>\n\t\t<method name=\"getString(ILjava/lang/String;)Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"putBitmap(ILandroid/graphics/Bitmap;)Landroid/media/MediaMetadataEditor;\" deprecated=\"29\"/>\n\t\t<method name=\"putLong(IJ)Landroid/media/MediaMetadataEditor;\" deprecated=\"29\"/>\n\t\t<method name=\"putObject(ILjava/lang/Object;)Landroid/media/MediaMetadataEditor;\" deprecated=\"29\"/>\n\t\t<method name=\"putString(ILjava/lang/String;)Landroid/media/MediaMetadataEditor;\" deprecated=\"29\"/>\n\t\t<method name=\"removeEditableKeys()V\" deprecated=\"29\"/>\n\t\t<field name=\"BITMAP_KEY_ARTWORK\" deprecated=\"29\"/>\n\t\t<field name=\"RATING_KEY_BY_OTHERS\" deprecated=\"29\"/>\n\t\t<field name=\"RATING_KEY_BY_USER\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/media/MediaMetadataRetriever\" since=\"10\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\" since=\"29\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"extractMetadata(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getEmbeddedPicture()[B\"/>\n\t\t<method name=\"getFrameAtIndex(I)Landroid/graphics/Bitmap;\" since=\"28\"/>\n\t\t<method name=\"getFrameAtIndex(ILandroid/media/MediaMetadataRetriever$BitmapParams;)Landroid/graphics/Bitmap;\" since=\"28\"/>\n\t\t<method name=\"getFrameAtTime()Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"getFrameAtTime(J)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"getFrameAtTime(JI)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"getFramesAtIndex(II)Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"getFramesAtIndex(IILandroid/media/MediaMetadataRetriever$BitmapParams;)Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"getImageAtIndex(I)Landroid/graphics/Bitmap;\" since=\"28\"/>\n\t\t<method name=\"getImageAtIndex(ILandroid/media/MediaMetadataRetriever$BitmapParams;)Landroid/graphics/Bitmap;\" since=\"28\"/>\n\t\t<method name=\"getPrimaryImage()Landroid/graphics/Bitmap;\" since=\"28\"/>\n\t\t<method name=\"getPrimaryImage(Landroid/media/MediaMetadataRetriever$BitmapParams;)Landroid/graphics/Bitmap;\" since=\"28\"/>\n\t\t<method name=\"getScaledFrameAtTime(JIII)Landroid/graphics/Bitmap;\" since=\"27\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"setDataSource(Landroid/content/Context;Landroid/net/Uri;)V\"/>\n\t\t<method name=\"setDataSource(Landroid/media/MediaDataSource;)V\" since=\"23\"/>\n\t\t<method name=\"setDataSource(Ljava/io/FileDescriptor;)V\"/>\n\t\t<method name=\"setDataSource(Ljava/io/FileDescriptor;JJ)V\"/>\n\t\t<method name=\"setDataSource(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setDataSource(Ljava/lang/String;Ljava/util/Map;)V\" since=\"14\"/>\n\t\t<field name=\"METADATA_KEY_ALBUM\"/>\n\t\t<field name=\"METADATA_KEY_ALBUMARTIST\"/>\n\t\t<field name=\"METADATA_KEY_ARTIST\"/>\n\t\t<field name=\"METADATA_KEY_AUTHOR\"/>\n\t\t<field name=\"METADATA_KEY_BITRATE\" since=\"14\"/>\n\t\t<field name=\"METADATA_KEY_CAPTURE_FRAMERATE\" since=\"23\"/>\n\t\t<field name=\"METADATA_KEY_CD_TRACK_NUMBER\"/>\n\t\t<field name=\"METADATA_KEY_COMPILATION\"/>\n\t\t<field name=\"METADATA_KEY_COMPOSER\"/>\n\t\t<field name=\"METADATA_KEY_DATE\"/>\n\t\t<field name=\"METADATA_KEY_DISC_NUMBER\"/>\n\t\t<field name=\"METADATA_KEY_DURATION\"/>\n\t\t<field name=\"METADATA_KEY_EXIF_LENGTH\" since=\"29\"/>\n\t\t<field name=\"METADATA_KEY_EXIF_OFFSET\" since=\"29\"/>\n\t\t<field name=\"METADATA_KEY_GENRE\"/>\n\t\t<field name=\"METADATA_KEY_HAS_AUDIO\" since=\"14\"/>\n\t\t<field name=\"METADATA_KEY_HAS_IMAGE\" since=\"28\"/>\n\t\t<field name=\"METADATA_KEY_HAS_VIDEO\" since=\"14\"/>\n\t\t<field name=\"METADATA_KEY_IMAGE_COUNT\" since=\"28\"/>\n\t\t<field name=\"METADATA_KEY_IMAGE_HEIGHT\" since=\"28\"/>\n\t\t<field name=\"METADATA_KEY_IMAGE_PRIMARY\" since=\"28\"/>\n\t\t<field name=\"METADATA_KEY_IMAGE_ROTATION\" since=\"28\"/>\n\t\t<field name=\"METADATA_KEY_IMAGE_WIDTH\" since=\"28\"/>\n\t\t<field name=\"METADATA_KEY_LOCATION\" since=\"15\"/>\n\t\t<field name=\"METADATA_KEY_MIMETYPE\"/>\n\t\t<field name=\"METADATA_KEY_NUM_TRACKS\"/>\n\t\t<field name=\"METADATA_KEY_TITLE\"/>\n\t\t<field name=\"METADATA_KEY_VIDEO_FRAME_COUNT\" since=\"28\"/>\n\t\t<field name=\"METADATA_KEY_VIDEO_HEIGHT\" since=\"14\"/>\n\t\t<field name=\"METADATA_KEY_VIDEO_ROTATION\" since=\"17\"/>\n\t\t<field name=\"METADATA_KEY_VIDEO_WIDTH\" since=\"14\"/>\n\t\t<field name=\"METADATA_KEY_WRITER\"/>\n\t\t<field name=\"METADATA_KEY_YEAR\"/>\n\t\t<field name=\"OPTION_CLOSEST\"/>\n\t\t<field name=\"OPTION_CLOSEST_SYNC\"/>\n\t\t<field name=\"OPTION_NEXT_SYNC\"/>\n\t\t<field name=\"OPTION_PREVIOUS_SYNC\"/>\n\t</class>\n\t<class name=\"android/media/MediaMetadataRetriever$BitmapParams\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getActualConfig()Landroid/graphics/Bitmap$Config;\"/>\n\t\t<method name=\"getPreferredConfig()Landroid/graphics/Bitmap$Config;\"/>\n\t\t<method name=\"setPreferredConfig(Landroid/graphics/Bitmap$Config;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaMuxer\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/FileDescriptor;I)V\" since=\"26\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"addTrack(Landroid/media/MediaFormat;)I\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"setLocation(FF)V\" since=\"19\"/>\n\t\t<method name=\"setOrientationHint(I)V\"/>\n\t\t<method name=\"start()V\"/>\n\t\t<method name=\"stop()V\"/>\n\t\t<method name=\"writeSampleData(ILjava/nio/ByteBuffer;Landroid/media/MediaCodec$BufferInfo;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaMuxer$OutputFormat\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"MUXER_OUTPUT_3GPP\" since=\"26\"/>\n\t\t<field name=\"MUXER_OUTPUT_HEIF\" since=\"28\"/>\n\t\t<field name=\"MUXER_OUTPUT_MPEG_4\"/>\n\t\t<field name=\"MUXER_OUTPUT_OGG\" since=\"29\"/>\n\t\t<field name=\"MUXER_OUTPUT_WEBM\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/media/MediaPlayer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/media/AudioRouting\" since=\"28\"/>\n\t\t<implements name=\"android/media/VolumeAutomation\" since=\"26\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addTimedTextSource(Landroid/content/Context;Landroid/net/Uri;Ljava/lang/String;)V\" since=\"16\"/>\n\t\t<method name=\"addTimedTextSource(Ljava/io/FileDescriptor;JJLjava/lang/String;)V\" since=\"16\"/>\n\t\t<method name=\"addTimedTextSource(Ljava/io/FileDescriptor;Ljava/lang/String;)V\" since=\"16\"/>\n\t\t<method name=\"addTimedTextSource(Ljava/lang/String;Ljava/lang/String;)V\" since=\"16\"/>\n\t\t<method name=\"attachAuxEffect(I)V\" since=\"9\"/>\n\t\t<method name=\"clearOnMediaTimeDiscontinuityListener()V\" since=\"28\"/>\n\t\t<method name=\"clearOnSubtitleDataListener()V\" since=\"28\"/>\n\t\t<method name=\"create(Landroid/content/Context;I)Landroid/media/MediaPlayer;\"/>\n\t\t<method name=\"create(Landroid/content/Context;ILandroid/media/AudioAttributes;I)Landroid/media/MediaPlayer;\" since=\"21\"/>\n\t\t<method name=\"create(Landroid/content/Context;Landroid/net/Uri;)Landroid/media/MediaPlayer;\"/>\n\t\t<method name=\"create(Landroid/content/Context;Landroid/net/Uri;Landroid/view/SurfaceHolder;)Landroid/media/MediaPlayer;\"/>\n\t\t<method name=\"create(Landroid/content/Context;Landroid/net/Uri;Landroid/view/SurfaceHolder;Landroid/media/AudioAttributes;I)Landroid/media/MediaPlayer;\" since=\"21\"/>\n\t\t<method name=\"deselectTrack(I)V\" since=\"16\"/>\n\t\t<method name=\"getAudioSessionId()I\" since=\"9\"/>\n\t\t<method name=\"getCurrentPosition()I\"/>\n\t\t<method name=\"getDrmInfo()Landroid/media/MediaPlayer$DrmInfo;\" since=\"26\"/>\n\t\t<method name=\"getDrmPropertyString(Ljava/lang/String;)Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getDuration()I\"/>\n\t\t<method name=\"getKeyRequest([B[BLjava/lang/String;ILjava/util/Map;)Landroid/media/MediaDrm$KeyRequest;\" since=\"26\"/>\n\t\t<method name=\"getMetrics()Landroid/os/PersistableBundle;\" since=\"26\"/>\n\t\t<method name=\"getPlaybackParams()Landroid/media/PlaybackParams;\" since=\"23\"/>\n\t\t<method name=\"getSelectedTrack(I)I\" since=\"21\"/>\n\t\t<method name=\"getSyncParams()Landroid/media/SyncParams;\" since=\"23\"/>\n\t\t<method name=\"getTimestamp()Landroid/media/MediaTimestamp;\" since=\"23\"/>\n\t\t<method name=\"getTrackInfo()[Landroid/media/MediaPlayer$TrackInfo;\" since=\"16\"/>\n\t\t<method name=\"getVideoHeight()I\"/>\n\t\t<method name=\"getVideoWidth()I\"/>\n\t\t<method name=\"isLooping()Z\" since=\"3\"/>\n\t\t<method name=\"isPlaying()Z\"/>\n\t\t<method name=\"pause()V\"/>\n\t\t<method name=\"prepare()V\"/>\n\t\t<method name=\"prepareAsync()V\"/>\n\t\t<method name=\"prepareDrm(Ljava/util/UUID;)V\" since=\"26\"/>\n\t\t<method name=\"provideKeyResponse([B[B)[B\" since=\"26\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"releaseDrm()V\" since=\"26\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"restoreKeys([B)V\" since=\"26\"/>\n\t\t<method name=\"seekTo(I)V\"/>\n\t\t<method name=\"seekTo(JI)V\" since=\"26\"/>\n\t\t<method name=\"selectTrack(I)V\" since=\"16\"/>\n\t\t<method name=\"setAudioAttributes(Landroid/media/AudioAttributes;)V\" since=\"21\"/>\n\t\t<method name=\"setAudioSessionId(I)V\" since=\"9\"/>\n\t\t<method name=\"setAudioStreamType(I)V\" deprecated=\"26\"/>\n\t\t<method name=\"setAuxEffectSendLevel(F)V\" since=\"9\"/>\n\t\t<method name=\"setDataSource(Landroid/content/Context;Landroid/net/Uri;)V\"/>\n\t\t<method name=\"setDataSource(Landroid/content/Context;Landroid/net/Uri;Ljava/util/Map;)V\" since=\"14\"/>\n\t\t<method name=\"setDataSource(Landroid/content/Context;Landroid/net/Uri;Ljava/util/Map;Ljava/util/List;)V\" since=\"26\"/>\n\t\t<method name=\"setDataSource(Landroid/content/res/AssetFileDescriptor;)V\" since=\"24\"/>\n\t\t<method name=\"setDataSource(Landroid/media/MediaDataSource;)V\" since=\"23\"/>\n\t\t<method name=\"setDataSource(Ljava/io/FileDescriptor;)V\"/>\n\t\t<method name=\"setDataSource(Ljava/io/FileDescriptor;JJ)V\"/>\n\t\t<method name=\"setDataSource(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setDisplay(Landroid/view/SurfaceHolder;)V\"/>\n\t\t<method name=\"setDrmPropertyString(Ljava/lang/String;Ljava/lang/String;)V\" since=\"26\"/>\n\t\t<method name=\"setLooping(Z)V\"/>\n\t\t<method name=\"setNextMediaPlayer(Landroid/media/MediaPlayer;)V\" since=\"16\"/>\n\t\t<method name=\"setOnBufferingUpdateListener(Landroid/media/MediaPlayer$OnBufferingUpdateListener;)V\"/>\n\t\t<method name=\"setOnCompletionListener(Landroid/media/MediaPlayer$OnCompletionListener;)V\"/>\n\t\t<method name=\"setOnDrmConfigHelper(Landroid/media/MediaPlayer$OnDrmConfigHelper;)V\" since=\"26\"/>\n\t\t<method name=\"setOnDrmInfoListener(Landroid/media/MediaPlayer$OnDrmInfoListener;)V\" since=\"26\"/>\n\t\t<method name=\"setOnDrmInfoListener(Landroid/media/MediaPlayer$OnDrmInfoListener;Landroid/os/Handler;)V\" since=\"26\"/>\n\t\t<method name=\"setOnDrmPreparedListener(Landroid/media/MediaPlayer$OnDrmPreparedListener;)V\" since=\"26\"/>\n\t\t<method name=\"setOnDrmPreparedListener(Landroid/media/MediaPlayer$OnDrmPreparedListener;Landroid/os/Handler;)V\" since=\"26\"/>\n\t\t<method name=\"setOnErrorListener(Landroid/media/MediaPlayer$OnErrorListener;)V\"/>\n\t\t<method name=\"setOnInfoListener(Landroid/media/MediaPlayer$OnInfoListener;)V\" since=\"3\"/>\n\t\t<method name=\"setOnMediaTimeDiscontinuityListener(Landroid/media/MediaPlayer$OnMediaTimeDiscontinuityListener;)V\" since=\"28\"/>\n\t\t<method name=\"setOnMediaTimeDiscontinuityListener(Landroid/media/MediaPlayer$OnMediaTimeDiscontinuityListener;Landroid/os/Handler;)V\" since=\"28\"/>\n\t\t<method name=\"setOnPreparedListener(Landroid/media/MediaPlayer$OnPreparedListener;)V\"/>\n\t\t<method name=\"setOnSeekCompleteListener(Landroid/media/MediaPlayer$OnSeekCompleteListener;)V\"/>\n\t\t<method name=\"setOnSubtitleDataListener(Landroid/media/MediaPlayer$OnSubtitleDataListener;)V\" since=\"28\"/>\n\t\t<method name=\"setOnSubtitleDataListener(Landroid/media/MediaPlayer$OnSubtitleDataListener;Landroid/os/Handler;)V\" since=\"28\"/>\n\t\t<method name=\"setOnTimedMetaDataAvailableListener(Landroid/media/MediaPlayer$OnTimedMetaDataAvailableListener;)V\" since=\"23\"/>\n\t\t<method name=\"setOnTimedTextListener(Landroid/media/MediaPlayer$OnTimedTextListener;)V\" since=\"16\"/>\n\t\t<method name=\"setOnVideoSizeChangedListener(Landroid/media/MediaPlayer$OnVideoSizeChangedListener;)V\" since=\"3\"/>\n\t\t<method name=\"setPlaybackParams(Landroid/media/PlaybackParams;)V\" since=\"23\"/>\n\t\t<method name=\"setScreenOnWhilePlaying(Z)V\"/>\n\t\t<method name=\"setSurface(Landroid/view/Surface;)V\" since=\"14\"/>\n\t\t<method name=\"setSyncParams(Landroid/media/SyncParams;)V\" since=\"23\"/>\n\t\t<method name=\"setVideoScalingMode(I)V\" since=\"16\"/>\n\t\t<method name=\"setVolume(FF)V\"/>\n\t\t<method name=\"setWakeMode(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"start()V\"/>\n\t\t<method name=\"stop()V\"/>\n\t\t<field name=\"MEDIA_ERROR_IO\" since=\"17\"/>\n\t\t<field name=\"MEDIA_ERROR_MALFORMED\" since=\"17\"/>\n\t\t<field name=\"MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK\" since=\"3\"/>\n\t\t<field name=\"MEDIA_ERROR_SERVER_DIED\"/>\n\t\t<field name=\"MEDIA_ERROR_TIMED_OUT\" since=\"17\"/>\n\t\t<field name=\"MEDIA_ERROR_UNKNOWN\"/>\n\t\t<field name=\"MEDIA_ERROR_UNSUPPORTED\" since=\"17\"/>\n\t\t<field name=\"MEDIA_INFO_AUDIO_NOT_PLAYING\" since=\"26\"/>\n\t\t<field name=\"MEDIA_INFO_BAD_INTERLEAVING\" since=\"3\"/>\n\t\t<field name=\"MEDIA_INFO_BUFFERING_END\" since=\"9\"/>\n\t\t<field name=\"MEDIA_INFO_BUFFERING_START\" since=\"9\"/>\n\t\t<field name=\"MEDIA_INFO_METADATA_UPDATE\" since=\"5\"/>\n\t\t<field name=\"MEDIA_INFO_NOT_SEEKABLE\" since=\"3\"/>\n\t\t<field name=\"MEDIA_INFO_STARTED_AS_NEXT\" since=\"28\"/>\n\t\t<field name=\"MEDIA_INFO_SUBTITLE_TIMED_OUT\" since=\"19\"/>\n\t\t<field name=\"MEDIA_INFO_UNKNOWN\" since=\"3\"/>\n\t\t<field name=\"MEDIA_INFO_UNSUPPORTED_SUBTITLE\" since=\"19\"/>\n\t\t<field name=\"MEDIA_INFO_VIDEO_NOT_PLAYING\" since=\"26\"/>\n\t\t<field name=\"MEDIA_INFO_VIDEO_RENDERING_START\" since=\"17\"/>\n\t\t<field name=\"MEDIA_INFO_VIDEO_TRACK_LAGGING\" since=\"3\"/>\n\t\t<field name=\"MEDIA_MIMETYPE_TEXT_SUBRIP\" since=\"16\" deprecated=\"28\"/>\n\t\t<field name=\"PREPARE_DRM_STATUS_PREPARATION_ERROR\" since=\"26\"/>\n\t\t<field name=\"PREPARE_DRM_STATUS_PROVISIONING_NETWORK_ERROR\" since=\"26\"/>\n\t\t<field name=\"PREPARE_DRM_STATUS_PROVISIONING_SERVER_ERROR\" since=\"26\"/>\n\t\t<field name=\"PREPARE_DRM_STATUS_SUCCESS\" since=\"26\"/>\n\t\t<field name=\"SEEK_CLOSEST\" since=\"26\"/>\n\t\t<field name=\"SEEK_CLOSEST_SYNC\" since=\"26\"/>\n\t\t<field name=\"SEEK_NEXT_SYNC\" since=\"26\"/>\n\t\t<field name=\"SEEK_PREVIOUS_SYNC\" since=\"26\"/>\n\t\t<field name=\"VIDEO_SCALING_MODE_SCALE_TO_FIT\" since=\"16\"/>\n\t\t<field name=\"VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING\" since=\"16\"/>\n\t</class>\n\t<class name=\"android/media/MediaPlayer$DrmInfo\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getPssh()Ljava/util/Map;\"/>\n\t\t<method name=\"getSupportedSchemes()[Ljava/util/UUID;\"/>\n\t</class>\n\t<class name=\"android/media/MediaPlayer$MetricsConstants\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CODEC_AUDIO\"/>\n\t\t<field name=\"CODEC_VIDEO\"/>\n\t\t<field name=\"DURATION\"/>\n\t\t<field name=\"ERRORS\"/>\n\t\t<field name=\"ERROR_CODE\"/>\n\t\t<field name=\"FRAMES\"/>\n\t\t<field name=\"FRAMES_DROPPED\"/>\n\t\t<field name=\"HEIGHT\"/>\n\t\t<field name=\"MIME_TYPE_AUDIO\"/>\n\t\t<field name=\"MIME_TYPE_VIDEO\"/>\n\t\t<field name=\"PLAYING\"/>\n\t\t<field name=\"WIDTH\"/>\n\t</class>\n\t<class name=\"android/media/MediaPlayer$NoDrmSchemeException\" since=\"26\">\n\t\t<extends name=\"android/media/MediaDrmException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaPlayer$OnBufferingUpdateListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onBufferingUpdate(Landroid/media/MediaPlayer;I)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaPlayer$OnCompletionListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onCompletion(Landroid/media/MediaPlayer;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaPlayer$OnDrmConfigHelper\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDrmConfig(Landroid/media/MediaPlayer;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaPlayer$OnDrmInfoListener\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDrmInfo(Landroid/media/MediaPlayer;Landroid/media/MediaPlayer$DrmInfo;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaPlayer$OnDrmPreparedListener\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDrmPrepared(Landroid/media/MediaPlayer;I)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaPlayer$OnErrorListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onError(Landroid/media/MediaPlayer;II)Z\"/>\n\t</class>\n\t<class name=\"android/media/MediaPlayer$OnInfoListener\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onInfo(Landroid/media/MediaPlayer;II)Z\"/>\n\t</class>\n\t<class name=\"android/media/MediaPlayer$OnMediaTimeDiscontinuityListener\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onMediaTimeDiscontinuity(Landroid/media/MediaPlayer;Landroid/media/MediaTimestamp;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaPlayer$OnPreparedListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onPrepared(Landroid/media/MediaPlayer;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaPlayer$OnSeekCompleteListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onSeekComplete(Landroid/media/MediaPlayer;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaPlayer$OnSubtitleDataListener\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onSubtitleData(Landroid/media/MediaPlayer;Landroid/media/SubtitleData;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaPlayer$OnTimedMetaDataAvailableListener\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onTimedMetaDataAvailable(Landroid/media/MediaPlayer;Landroid/media/TimedMetaData;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaPlayer$OnTimedTextListener\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onTimedText(Landroid/media/MediaPlayer;Landroid/media/TimedText;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaPlayer$OnVideoSizeChangedListener\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onVideoSizeChanged(Landroid/media/MediaPlayer;II)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaPlayer$ProvisioningNetworkErrorException\" since=\"26\">\n\t\t<extends name=\"android/media/MediaDrmException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaPlayer$ProvisioningServerErrorException\" since=\"26\">\n\t\t<extends name=\"android/media/MediaDrmException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaPlayer$TrackInfo\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getFormat()Landroid/media/MediaFormat;\" since=\"19\"/>\n\t\t<method name=\"getLanguage()Ljava/lang/String;\"/>\n\t\t<method name=\"getTrackType()I\"/>\n\t\t<field name=\"MEDIA_TRACK_TYPE_AUDIO\"/>\n\t\t<field name=\"MEDIA_TRACK_TYPE_METADATA\" since=\"23\"/>\n\t\t<field name=\"MEDIA_TRACK_TYPE_SUBTITLE\" since=\"21\"/>\n\t\t<field name=\"MEDIA_TRACK_TYPE_TIMEDTEXT\"/>\n\t\t<field name=\"MEDIA_TRACK_TYPE_UNKNOWN\"/>\n\t\t<field name=\"MEDIA_TRACK_TYPE_VIDEO\"/>\n\t</class>\n\t<class name=\"android/media/MediaRecorder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/media/AudioRecordingMonitor\" since=\"29\"/>\n\t\t<implements name=\"android/media/AudioRouting\" since=\"28\"/>\n\t\t<implements name=\"android/media/MicrophoneDirection\" since=\"29\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getActiveMicrophones()Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"getAudioSourceMax()I\" since=\"4\"/>\n\t\t<method name=\"getMaxAmplitude()I\"/>\n\t\t<method name=\"getMetrics()Landroid/os/PersistableBundle;\" since=\"26\"/>\n\t\t<method name=\"getSurface()Landroid/view/Surface;\" since=\"21\"/>\n\t\t<method name=\"pause()V\" since=\"24\"/>\n\t\t<method name=\"prepare()V\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"resume()V\" since=\"24\"/>\n\t\t<method name=\"setAudioChannels(I)V\" since=\"8\"/>\n\t\t<method name=\"setAudioEncoder(I)V\"/>\n\t\t<method name=\"setAudioEncodingBitRate(I)V\" since=\"8\"/>\n\t\t<method name=\"setAudioSamplingRate(I)V\" since=\"8\"/>\n\t\t<method name=\"setAudioSource(I)V\"/>\n\t\t<method name=\"setAuxiliaryOutputFile(Ljava/io/FileDescriptor;)V\" since=\"11\" deprecated=\"15\" removed=\"16\"/>\n\t\t<method name=\"setAuxiliaryOutputFile(Ljava/lang/String;)V\" since=\"11\" deprecated=\"15\" removed=\"16\"/>\n\t\t<method name=\"setCamera(Landroid/hardware/Camera;)V\" since=\"3\" deprecated=\"21\"/>\n\t\t<method name=\"setCaptureRate(D)V\" since=\"11\"/>\n\t\t<method name=\"setInputSurface(Landroid/view/Surface;)V\" since=\"23\"/>\n\t\t<method name=\"setLocation(FF)V\" since=\"14\"/>\n\t\t<method name=\"setMaxDuration(I)V\" since=\"3\"/>\n\t\t<method name=\"setMaxFileSize(J)V\" since=\"3\"/>\n\t\t<method name=\"setNextOutputFile(Ljava/io/File;)V\" since=\"26\"/>\n\t\t<method name=\"setNextOutputFile(Ljava/io/FileDescriptor;)V\" since=\"26\"/>\n\t\t<method name=\"setOnErrorListener(Landroid/media/MediaRecorder$OnErrorListener;)V\" since=\"3\"/>\n\t\t<method name=\"setOnInfoListener(Landroid/media/MediaRecorder$OnInfoListener;)V\" since=\"3\"/>\n\t\t<method name=\"setOrientationHint(I)V\" since=\"9\"/>\n\t\t<method name=\"setOutputFile(Ljava/io/File;)V\" since=\"26\"/>\n\t\t<method name=\"setOutputFile(Ljava/io/FileDescriptor;)V\" since=\"3\"/>\n\t\t<method name=\"setOutputFile(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setOutputFormat(I)V\"/>\n\t\t<method name=\"setPreviewDisplay(Landroid/view/Surface;)V\"/>\n\t\t<method name=\"setProfile(Landroid/media/CamcorderProfile;)V\" since=\"8\"/>\n\t\t<method name=\"setVideoEncoder(I)V\" since=\"3\"/>\n\t\t<method name=\"setVideoEncodingBitRate(I)V\" since=\"8\"/>\n\t\t<method name=\"setVideoEncodingProfileLevel(II)V\" since=\"26\"/>\n\t\t<method name=\"setVideoFrameRate(I)V\" since=\"3\"/>\n\t\t<method name=\"setVideoSize(II)V\" since=\"3\"/>\n\t\t<method name=\"setVideoSource(I)V\" since=\"3\"/>\n\t\t<method name=\"start()V\"/>\n\t\t<method name=\"stop()V\"/>\n\t\t<field name=\"MEDIA_ERROR_SERVER_DIED\" since=\"17\"/>\n\t\t<field name=\"MEDIA_RECORDER_ERROR_UNKNOWN\" since=\"3\"/>\n\t\t<field name=\"MEDIA_RECORDER_INFO_MAX_DURATION_REACHED\" since=\"3\"/>\n\t\t<field name=\"MEDIA_RECORDER_INFO_MAX_FILESIZE_APPROACHING\" since=\"26\"/>\n\t\t<field name=\"MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED\" since=\"3\"/>\n\t\t<field name=\"MEDIA_RECORDER_INFO_NEXT_OUTPUT_FILE_STARTED\" since=\"26\"/>\n\t\t<field name=\"MEDIA_RECORDER_INFO_UNKNOWN\" since=\"3\"/>\n\t</class>\n\t<class name=\"android/media/MediaRecorder$AudioEncoder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"AAC\" since=\"10\"/>\n\t\t<field name=\"AAC_ELD\" since=\"16\"/>\n\t\t<field name=\"AMR_NB\"/>\n\t\t<field name=\"AMR_WB\" since=\"10\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t\t<field name=\"HE_AAC\" since=\"16\"/>\n\t\t<field name=\"OPUS\" since=\"29\"/>\n\t\t<field name=\"VORBIS\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/media/MediaRecorder$AudioSource\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CAMCORDER\" since=\"7\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t\t<field name=\"MIC\"/>\n\t\t<field name=\"REMOTE_SUBMIX\" since=\"19\"/>\n\t\t<field name=\"UNPROCESSED\" since=\"24\"/>\n\t\t<field name=\"VOICE_CALL\" since=\"4\"/>\n\t\t<field name=\"VOICE_COMMUNICATION\" since=\"11\"/>\n\t\t<field name=\"VOICE_DOWNLINK\" since=\"4\"/>\n\t\t<field name=\"VOICE_PERFORMANCE\" since=\"29\"/>\n\t\t<field name=\"VOICE_RECOGNITION\" since=\"7\"/>\n\t\t<field name=\"VOICE_UPLINK\" since=\"4\"/>\n\t</class>\n\t<class name=\"android/media/MediaRecorder$MetricsConstants\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"AUDIO_BITRATE\"/>\n\t\t<field name=\"AUDIO_CHANNELS\"/>\n\t\t<field name=\"AUDIO_SAMPLERATE\"/>\n\t\t<field name=\"AUDIO_TIMESCALE\"/>\n\t\t<field name=\"CAPTURE_FPS\"/>\n\t\t<field name=\"CAPTURE_FPS_ENABLE\"/>\n\t\t<field name=\"FRAMERATE\"/>\n\t\t<field name=\"HEIGHT\"/>\n\t\t<field name=\"MOVIE_TIMESCALE\"/>\n\t\t<field name=\"ROTATION\"/>\n\t\t<field name=\"VIDEO_BITRATE\"/>\n\t\t<field name=\"VIDEO_IFRAME_INTERVAL\"/>\n\t\t<field name=\"VIDEO_LEVEL\"/>\n\t\t<field name=\"VIDEO_PROFILE\"/>\n\t\t<field name=\"VIDEO_TIMESCALE\"/>\n\t\t<field name=\"WIDTH\"/>\n\t</class>\n\t<class name=\"android/media/MediaRecorder$OnErrorListener\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onError(Landroid/media/MediaRecorder;II)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaRecorder$OnInfoListener\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onInfo(Landroid/media/MediaRecorder;II)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaRecorder$OutputFormat\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"AAC_ADTS\" since=\"16\"/>\n\t\t<field name=\"AMR_NB\" since=\"10\"/>\n\t\t<field name=\"AMR_WB\" since=\"10\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t\t<field name=\"MPEG_2_TS\" since=\"26\"/>\n\t\t<field name=\"MPEG_4\"/>\n\t\t<field name=\"OGG\" since=\"29\"/>\n\t\t<field name=\"RAW_AMR\" since=\"3\" deprecated=\"16\"/>\n\t\t<field name=\"THREE_GPP\"/>\n\t\t<field name=\"WEBM\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/media/MediaRecorder$VideoEncoder\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t\t<field name=\"H263\"/>\n\t\t<field name=\"H264\"/>\n\t\t<field name=\"HEVC\" since=\"24\"/>\n\t\t<field name=\"MPEG_4_SP\"/>\n\t\t<field name=\"VP8\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/media/MediaRecorder$VideoSource\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CAMERA\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t\t<field name=\"SURFACE\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/media/MediaRouter\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addCallback(ILandroid/media/MediaRouter$Callback;)V\"/>\n\t\t<method name=\"addCallback(ILandroid/media/MediaRouter$Callback;I)V\" since=\"18\"/>\n\t\t<method name=\"addUserRoute(Landroid/media/MediaRouter$UserRouteInfo;)V\"/>\n\t\t<method name=\"clearUserRoutes()V\"/>\n\t\t<method name=\"createRouteCategory(IZ)Landroid/media/MediaRouter$RouteCategory;\"/>\n\t\t<method name=\"createRouteCategory(Ljava/lang/CharSequence;Z)Landroid/media/MediaRouter$RouteCategory;\"/>\n\t\t<method name=\"createUserRoute(Landroid/media/MediaRouter$RouteCategory;)Landroid/media/MediaRouter$UserRouteInfo;\"/>\n\t\t<method name=\"getCategoryAt(I)Landroid/media/MediaRouter$RouteCategory;\"/>\n\t\t<method name=\"getCategoryCount()I\"/>\n\t\t<method name=\"getDefaultRoute()Landroid/media/MediaRouter$RouteInfo;\" since=\"18\"/>\n\t\t<method name=\"getRouteAt(I)Landroid/media/MediaRouter$RouteInfo;\"/>\n\t\t<method name=\"getRouteCount()I\"/>\n\t\t<method name=\"getSelectedRoute(I)Landroid/media/MediaRouter$RouteInfo;\"/>\n\t\t<method name=\"removeCallback(Landroid/media/MediaRouter$Callback;)V\"/>\n\t\t<method name=\"removeUserRoute(Landroid/media/MediaRouter$UserRouteInfo;)V\"/>\n\t\t<method name=\"selectRoute(ILandroid/media/MediaRouter$RouteInfo;)V\"/>\n\t\t<field name=\"CALLBACK_FLAG_PERFORM_ACTIVE_SCAN\" since=\"18\"/>\n\t\t<field name=\"CALLBACK_FLAG_UNFILTERED_EVENTS\" since=\"18\"/>\n\t\t<field name=\"ROUTE_TYPE_LIVE_AUDIO\"/>\n\t\t<field name=\"ROUTE_TYPE_LIVE_VIDEO\" since=\"17\"/>\n\t\t<field name=\"ROUTE_TYPE_USER\"/>\n\t</class>\n\t<class name=\"android/media/MediaRouter$Callback\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onRouteAdded(Landroid/media/MediaRouter;Landroid/media/MediaRouter$RouteInfo;)V\"/>\n\t\t<method name=\"onRouteChanged(Landroid/media/MediaRouter;Landroid/media/MediaRouter$RouteInfo;)V\"/>\n\t\t<method name=\"onRouteGrouped(Landroid/media/MediaRouter;Landroid/media/MediaRouter$RouteInfo;Landroid/media/MediaRouter$RouteGroup;I)V\"/>\n\t\t<method name=\"onRoutePresentationDisplayChanged(Landroid/media/MediaRouter;Landroid/media/MediaRouter$RouteInfo;)V\" since=\"17\"/>\n\t\t<method name=\"onRouteRemoved(Landroid/media/MediaRouter;Landroid/media/MediaRouter$RouteInfo;)V\"/>\n\t\t<method name=\"onRouteSelected(Landroid/media/MediaRouter;ILandroid/media/MediaRouter$RouteInfo;)V\"/>\n\t\t<method name=\"onRouteUngrouped(Landroid/media/MediaRouter;Landroid/media/MediaRouter$RouteInfo;Landroid/media/MediaRouter$RouteGroup;)V\"/>\n\t\t<method name=\"onRouteUnselected(Landroid/media/MediaRouter;ILandroid/media/MediaRouter$RouteInfo;)V\"/>\n\t\t<method name=\"onRouteVolumeChanged(Landroid/media/MediaRouter;Landroid/media/MediaRouter$RouteInfo;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaRouter$RouteCategory\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getName()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getName(Landroid/content/Context;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getRoutes(Ljava/util/List;)Ljava/util/List;\"/>\n\t\t<method name=\"getSupportedTypes()I\"/>\n\t\t<method name=\"isGroupable()Z\"/>\n\t</class>\n\t<class name=\"android/media/MediaRouter$RouteGroup\" since=\"16\">\n\t\t<extends name=\"android/media/MediaRouter$RouteInfo\"/>\n\t\t<method name=\"addRoute(Landroid/media/MediaRouter$RouteInfo;)V\"/>\n\t\t<method name=\"addRoute(Landroid/media/MediaRouter$RouteInfo;I)V\"/>\n\t\t<method name=\"getRouteAt(I)Landroid/media/MediaRouter$RouteInfo;\"/>\n\t\t<method name=\"getRouteCount()I\"/>\n\t\t<method name=\"removeRoute(I)V\"/>\n\t\t<method name=\"removeRoute(Landroid/media/MediaRouter$RouteInfo;)V\"/>\n\t\t<method name=\"setIconDrawable(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setIconResource(I)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaRouter$RouteInfo\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getCategory()Landroid/media/MediaRouter$RouteCategory;\"/>\n\t\t<method name=\"getDescription()Ljava/lang/CharSequence;\" since=\"18\"/>\n\t\t<method name=\"getDeviceType()I\" since=\"24\"/>\n\t\t<method name=\"getGroup()Landroid/media/MediaRouter$RouteGroup;\"/>\n\t\t<method name=\"getIconDrawable()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getName()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getName(Landroid/content/Context;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getPlaybackStream()I\"/>\n\t\t<method name=\"getPlaybackType()I\"/>\n\t\t<method name=\"getPresentationDisplay()Landroid/view/Display;\" since=\"17\"/>\n\t\t<method name=\"getStatus()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getSupportedTypes()I\"/>\n\t\t<method name=\"getTag()Ljava/lang/Object;\"/>\n\t\t<method name=\"getVolume()I\"/>\n\t\t<method name=\"getVolumeHandling()I\"/>\n\t\t<method name=\"getVolumeMax()I\"/>\n\t\t<method name=\"isConnecting()Z\" since=\"18\"/>\n\t\t<method name=\"isEnabled()Z\" since=\"17\"/>\n\t\t<method name=\"requestSetVolume(I)V\"/>\n\t\t<method name=\"requestUpdateVolume(I)V\"/>\n\t\t<method name=\"setTag(Ljava/lang/Object;)V\"/>\n\t\t<field name=\"DEVICE_TYPE_BLUETOOTH\" since=\"24\"/>\n\t\t<field name=\"DEVICE_TYPE_SPEAKER\" since=\"24\"/>\n\t\t<field name=\"DEVICE_TYPE_TV\" since=\"24\"/>\n\t\t<field name=\"DEVICE_TYPE_UNKNOWN\" since=\"24\"/>\n\t\t<field name=\"PLAYBACK_TYPE_LOCAL\"/>\n\t\t<field name=\"PLAYBACK_TYPE_REMOTE\"/>\n\t\t<field name=\"PLAYBACK_VOLUME_FIXED\"/>\n\t\t<field name=\"PLAYBACK_VOLUME_VARIABLE\"/>\n\t</class>\n\t<class name=\"android/media/MediaRouter$SimpleCallback\" since=\"16\">\n\t\t<extends name=\"android/media/MediaRouter$Callback\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/media/MediaRouter$UserRouteInfo\" since=\"16\">\n\t\t<extends name=\"android/media/MediaRouter$RouteInfo\"/>\n\t\t<method name=\"getRemoteControlClient()Landroid/media/RemoteControlClient;\"/>\n\t\t<method name=\"setDescription(Ljava/lang/CharSequence;)V\" since=\"18\"/>\n\t\t<method name=\"setIconDrawable(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setIconResource(I)V\"/>\n\t\t<method name=\"setName(I)V\"/>\n\t\t<method name=\"setName(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setPlaybackStream(I)V\"/>\n\t\t<method name=\"setPlaybackType(I)V\"/>\n\t\t<method name=\"setRemoteControlClient(Landroid/media/RemoteControlClient;)V\"/>\n\t\t<method name=\"setStatus(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setVolume(I)V\"/>\n\t\t<method name=\"setVolumeCallback(Landroid/media/MediaRouter$VolumeCallback;)V\"/>\n\t\t<method name=\"setVolumeHandling(I)V\"/>\n\t\t<method name=\"setVolumeMax(I)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaRouter$VolumeCallback\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onVolumeSetRequest(Landroid/media/MediaRouter$RouteInfo;I)V\"/>\n\t\t<method name=\"onVolumeUpdateRequest(Landroid/media/MediaRouter$RouteInfo;I)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaScannerConnection\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/content/ServiceConnection\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/media/MediaScannerConnection$MediaScannerConnectionClient;)V\"/>\n\t\t<method name=\"connect()V\"/>\n\t\t<method name=\"disconnect()V\"/>\n\t\t<method name=\"isConnected()Z\"/>\n\t\t<method name=\"scanFile(Landroid/content/Context;[Ljava/lang/String;[Ljava/lang/String;Landroid/media/MediaScannerConnection$OnScanCompletedListener;)V\" since=\"8\"/>\n\t\t<method name=\"scanFile(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaScannerConnection$MediaScannerConnectionClient\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/media/MediaScannerConnection$OnScanCompletedListener\" since=\"8\"/>\n\t\t<method name=\"onMediaScannerConnected()V\"/>\n\t\t<method name=\"onScanCompleted(Ljava/lang/String;Landroid/net/Uri;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaScannerConnection$OnScanCompletedListener\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onScanCompleted(Ljava/lang/String;Landroid/net/Uri;)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaSession2\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"broadcastSessionCommand(Landroid/media/Session2Command;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"cancelSessionCommand(Landroid/media/MediaSession2$ControllerInfo;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"getConnectedControllers()Ljava/util/List;\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\"/>\n\t\t<method name=\"getToken()Landroid/media/Session2Token;\"/>\n\t\t<method name=\"isPlaybackActive()Z\"/>\n\t\t<method name=\"sendSessionCommand(Landroid/media/MediaSession2$ControllerInfo;Landroid/media/Session2Command;Landroid/os/Bundle;)Ljava/lang/Object;\"/>\n\t\t<method name=\"setPlaybackActive(Z)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaSession2$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"build()Landroid/media/MediaSession2;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/media/MediaSession2$Builder;\"/>\n\t\t<method name=\"setId(Ljava/lang/String;)Landroid/media/MediaSession2$Builder;\"/>\n\t\t<method name=\"setSessionActivity(Landroid/app/PendingIntent;)Landroid/media/MediaSession2$Builder;\"/>\n\t\t<method name=\"setSessionCallback(Ljava/util/concurrent/Executor;Landroid/media/MediaSession2$SessionCallback;)Landroid/media/MediaSession2$Builder;\"/>\n\t</class>\n\t<class name=\"android/media/MediaSession2$ControllerInfo\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getConnectionHints()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getRemoteUserInfo()Landroid/media/session/MediaSessionManager$RemoteUserInfo;\"/>\n\t\t<method name=\"getUid()I\"/>\n\t</class>\n\t<class name=\"android/media/MediaSession2$SessionCallback\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCommandResult(Landroid/media/MediaSession2;Landroid/media/MediaSession2$ControllerInfo;Ljava/lang/Object;Landroid/media/Session2Command;Landroid/media/Session2Command$Result;)V\"/>\n\t\t<method name=\"onConnect(Landroid/media/MediaSession2;Landroid/media/MediaSession2$ControllerInfo;)Landroid/media/Session2CommandGroup;\"/>\n\t\t<method name=\"onDisconnected(Landroid/media/MediaSession2;Landroid/media/MediaSession2$ControllerInfo;)V\"/>\n\t\t<method name=\"onPostConnect(Landroid/media/MediaSession2;Landroid/media/MediaSession2$ControllerInfo;)V\"/>\n\t\t<method name=\"onSessionCommand(Landroid/media/MediaSession2;Landroid/media/MediaSession2$ControllerInfo;Landroid/media/Session2Command;Landroid/os/Bundle;)Landroid/media/Session2Command$Result;\"/>\n\t</class>\n\t<class name=\"android/media/MediaSession2Service\" since=\"29\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addSession(Landroid/media/MediaSession2;)V\"/>\n\t\t<method name=\"getSessions()Ljava/util/List;\"/>\n\t\t<method name=\"onGetSession(Landroid/media/MediaSession2$ControllerInfo;)Landroid/media/MediaSession2;\"/>\n\t\t<method name=\"onUpdateNotification(Landroid/media/MediaSession2;)Landroid/media/MediaSession2Service$MediaNotification;\"/>\n\t\t<method name=\"removeSession(Landroid/media/MediaSession2;)V\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t</class>\n\t<class name=\"android/media/MediaSession2Service$MediaNotification\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(ILandroid/app/Notification;)V\"/>\n\t\t<method name=\"getNotification()Landroid/app/Notification;\"/>\n\t\t<method name=\"getNotificationId()I\"/>\n\t</class>\n\t<class name=\"android/media/MediaSync\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"createInputSurface()Landroid/view/Surface;\"/>\n\t\t<method name=\"flush()V\"/>\n\t\t<method name=\"getPlaybackParams()Landroid/media/PlaybackParams;\"/>\n\t\t<method name=\"getSyncParams()Landroid/media/SyncParams;\"/>\n\t\t<method name=\"getTimestamp()Landroid/media/MediaTimestamp;\"/>\n\t\t<method name=\"queueAudio(Ljava/nio/ByteBuffer;IJ)V\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"setAudioTrack(Landroid/media/AudioTrack;)V\"/>\n\t\t<method name=\"setCallback(Landroid/media/MediaSync$Callback;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"setOnErrorListener(Landroid/media/MediaSync$OnErrorListener;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"setPlaybackParams(Landroid/media/PlaybackParams;)V\"/>\n\t\t<method name=\"setSurface(Landroid/view/Surface;)V\"/>\n\t\t<method name=\"setSyncParams(Landroid/media/SyncParams;)V\"/>\n\t\t<field name=\"MEDIASYNC_ERROR_AUDIOTRACK_FAIL\"/>\n\t\t<field name=\"MEDIASYNC_ERROR_SURFACE_FAIL\"/>\n\t</class>\n\t<class name=\"android/media/MediaSync$Callback\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onAudioBufferConsumed(Landroid/media/MediaSync;Ljava/nio/ByteBuffer;I)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaSync$OnErrorListener\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onError(Landroid/media/MediaSync;II)V\"/>\n\t</class>\n\t<class name=\"android/media/MediaSyncEvent\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createEvent(I)Landroid/media/MediaSyncEvent;\"/>\n\t\t<method name=\"getAudioSessionId()I\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<method name=\"setAudioSessionId(I)Landroid/media/MediaSyncEvent;\"/>\n\t\t<field name=\"SYNC_EVENT_NONE\"/>\n\t\t<field name=\"SYNC_EVENT_PRESENTATION_COMPLETE\"/>\n\t</class>\n\t<class name=\"android/media/MediaTimestamp\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(JJF)V\" since=\"29\"/>\n\t\t<method name=\"getAnchorMediaTimeUs()J\"/>\n\t\t<method name=\"getAnchorSystemNanoTime()J\" since=\"29\"/>\n\t\t<method name=\"getAnchorSytemNanoTime()J\" deprecated=\"29\"/>\n\t\t<method name=\"getMediaClockRate()F\"/>\n\t\t<field name=\"TIMESTAMP_UNKNOWN\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/media/MicrophoneDirection\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"setPreferredMicrophoneDirection(I)Z\"/>\n\t\t<method name=\"setPreferredMicrophoneFieldDimension(F)Z\"/>\n\t\t<field name=\"MIC_DIRECTION_AWAY_FROM_USER\"/>\n\t\t<field name=\"MIC_DIRECTION_EXTERNAL\"/>\n\t\t<field name=\"MIC_DIRECTION_TOWARDS_USER\"/>\n\t\t<field name=\"MIC_DIRECTION_UNSPECIFIED\"/>\n\t</class>\n\t<class name=\"android/media/MicrophoneInfo\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAddress()Ljava/lang/String;\"/>\n\t\t<method name=\"getChannelMapping()Ljava/util/List;\"/>\n\t\t<method name=\"getDescription()Ljava/lang/String;\"/>\n\t\t<method name=\"getDirectionality()I\"/>\n\t\t<method name=\"getFrequencyResponse()Ljava/util/List;\"/>\n\t\t<method name=\"getGroup()I\"/>\n\t\t<method name=\"getId()I\"/>\n\t\t<method name=\"getIndexInTheGroup()I\"/>\n\t\t<method name=\"getLocation()I\"/>\n\t\t<method name=\"getMaxSpl()F\"/>\n\t\t<method name=\"getMinSpl()F\"/>\n\t\t<method name=\"getOrientation()Landroid/media/MicrophoneInfo$Coordinate3F;\"/>\n\t\t<method name=\"getPosition()Landroid/media/MicrophoneInfo$Coordinate3F;\"/>\n\t\t<method name=\"getSensitivity()F\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<field name=\"CHANNEL_MAPPING_DIRECT\"/>\n\t\t<field name=\"CHANNEL_MAPPING_PROCESSED\"/>\n\t\t<field name=\"DIRECTIONALITY_BI_DIRECTIONAL\"/>\n\t\t<field name=\"DIRECTIONALITY_CARDIOID\"/>\n\t\t<field name=\"DIRECTIONALITY_HYPER_CARDIOID\"/>\n\t\t<field name=\"DIRECTIONALITY_OMNI\"/>\n\t\t<field name=\"DIRECTIONALITY_SUPER_CARDIOID\"/>\n\t\t<field name=\"DIRECTIONALITY_UNKNOWN\"/>\n\t\t<field name=\"GROUP_UNKNOWN\"/>\n\t\t<field name=\"INDEX_IN_THE_GROUP_UNKNOWN\"/>\n\t\t<field name=\"LOCATION_MAINBODY\"/>\n\t\t<field name=\"LOCATION_MAINBODY_MOVABLE\"/>\n\t\t<field name=\"LOCATION_PERIPHERAL\"/>\n\t\t<field name=\"LOCATION_UNKNOWN\"/>\n\t\t<field name=\"ORIENTATION_UNKNOWN\"/>\n\t\t<field name=\"POSITION_UNKNOWN\"/>\n\t\t<field name=\"SENSITIVITY_UNKNOWN\"/>\n\t\t<field name=\"SPL_UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/media/MicrophoneInfo$Coordinate3F\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t\t<field name=\"z\"/>\n\t</class>\n\t<class name=\"android/media/NotProvisionedException\" since=\"18\">\n\t\t<extends name=\"android/media/MediaDrmException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/media/PlaybackParams\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"allowDefaults()Landroid/media/PlaybackParams;\"/>\n\t\t<method name=\"getAudioFallbackMode()I\"/>\n\t\t<method name=\"getPitch()F\"/>\n\t\t<method name=\"getSpeed()F\"/>\n\t\t<method name=\"setAudioFallbackMode(I)Landroid/media/PlaybackParams;\"/>\n\t\t<method name=\"setPitch(F)Landroid/media/PlaybackParams;\"/>\n\t\t<method name=\"setSpeed(F)Landroid/media/PlaybackParams;\"/>\n\t\t<field name=\"AUDIO_FALLBACK_MODE_DEFAULT\"/>\n\t\t<field name=\"AUDIO_FALLBACK_MODE_FAIL\"/>\n\t\t<field name=\"AUDIO_FALLBACK_MODE_MUTE\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/media/Rating\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getPercentRating()F\"/>\n\t\t<method name=\"getRatingStyle()I\"/>\n\t\t<method name=\"getStarRating()F\"/>\n\t\t<method name=\"hasHeart()Z\"/>\n\t\t<method name=\"isRated()Z\"/>\n\t\t<method name=\"isThumbUp()Z\"/>\n\t\t<method name=\"newHeartRating(Z)Landroid/media/Rating;\"/>\n\t\t<method name=\"newPercentageRating(F)Landroid/media/Rating;\"/>\n\t\t<method name=\"newStarRating(IF)Landroid/media/Rating;\"/>\n\t\t<method name=\"newThumbRating(Z)Landroid/media/Rating;\"/>\n\t\t<method name=\"newUnratedRating(I)Landroid/media/Rating;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"RATING_3_STARS\"/>\n\t\t<field name=\"RATING_4_STARS\"/>\n\t\t<field name=\"RATING_5_STARS\"/>\n\t\t<field name=\"RATING_HEART\"/>\n\t\t<field name=\"RATING_NONE\" since=\"21\"/>\n\t\t<field name=\"RATING_PERCENTAGE\"/>\n\t\t<field name=\"RATING_THUMB_UP_DOWN\"/>\n\t</class>\n\t<class name=\"android/media/RemoteControlClient\" since=\"14\" deprecated=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/PendingIntent;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/PendingIntent;Landroid/os/Looper;)V\" deprecated=\"29\"/>\n\t\t<method name=\"editMetadata(Z)Landroid/media/RemoteControlClient$MetadataEditor;\" deprecated=\"29\"/>\n\t\t<method name=\"getMediaSession()Landroid/media/session/MediaSession;\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"setMetadataUpdateListener(Landroid/media/RemoteControlClient$OnMetadataUpdateListener;)V\" since=\"19\" deprecated=\"29\"/>\n\t\t<method name=\"setOnGetPlaybackPositionListener(Landroid/media/RemoteControlClient$OnGetPlaybackPositionListener;)V\" since=\"18\" deprecated=\"29\"/>\n\t\t<method name=\"setPlaybackPositionUpdateListener(Landroid/media/RemoteControlClient$OnPlaybackPositionUpdateListener;)V\" since=\"18\" deprecated=\"29\"/>\n\t\t<method name=\"setPlaybackState(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setPlaybackState(IJF)V\" since=\"18\" deprecated=\"29\"/>\n\t\t<method name=\"setTransportControlFlags(I)V\" deprecated=\"29\"/>\n\t\t<field name=\"FLAG_KEY_MEDIA_FAST_FORWARD\" deprecated=\"29\"/>\n\t\t<field name=\"FLAG_KEY_MEDIA_NEXT\" deprecated=\"29\"/>\n\t\t<field name=\"FLAG_KEY_MEDIA_PAUSE\" deprecated=\"29\"/>\n\t\t<field name=\"FLAG_KEY_MEDIA_PLAY\" deprecated=\"29\"/>\n\t\t<field name=\"FLAG_KEY_MEDIA_PLAY_PAUSE\" deprecated=\"29\"/>\n\t\t<field name=\"FLAG_KEY_MEDIA_POSITION_UPDATE\" since=\"18\" deprecated=\"29\"/>\n\t\t<field name=\"FLAG_KEY_MEDIA_PREVIOUS\" deprecated=\"29\"/>\n\t\t<field name=\"FLAG_KEY_MEDIA_RATING\" since=\"19\" deprecated=\"29\"/>\n\t\t<field name=\"FLAG_KEY_MEDIA_REWIND\" deprecated=\"29\"/>\n\t\t<field name=\"FLAG_KEY_MEDIA_STOP\" deprecated=\"29\"/>\n\t\t<field name=\"PLAYSTATE_BUFFERING\" deprecated=\"29\"/>\n\t\t<field name=\"PLAYSTATE_ERROR\" deprecated=\"29\"/>\n\t\t<field name=\"PLAYSTATE_FAST_FORWARDING\" deprecated=\"29\"/>\n\t\t<field name=\"PLAYSTATE_PAUSED\" deprecated=\"29\"/>\n\t\t<field name=\"PLAYSTATE_PLAYING\" deprecated=\"29\"/>\n\t\t<field name=\"PLAYSTATE_REWINDING\" deprecated=\"29\"/>\n\t\t<field name=\"PLAYSTATE_SKIPPING_BACKWARDS\" deprecated=\"29\"/>\n\t\t<field name=\"PLAYSTATE_SKIPPING_FORWARDS\" deprecated=\"29\"/>\n\t\t<field name=\"PLAYSTATE_STOPPED\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/media/RemoteControlClient$MetadataEditor\" since=\"14\" deprecated=\"21\">\n\t\t<extends name=\"android/media/MediaMetadataEditor\" since=\"19\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"19\"/>\n\t\t<method name=\"apply()V\" deprecated=\"29\"/>\n\t\t<method name=\"clear()V\" deprecated=\"29\"/>\n\t\t<method name=\"putBitmap(ILandroid/graphics/Bitmap;)Landroid/media/RemoteControlClient$MetadataEditor;\" deprecated=\"29\"/>\n\t\t<method name=\"putLong(IJ)Landroid/media/RemoteControlClient$MetadataEditor;\" deprecated=\"29\"/>\n\t\t<method name=\"putObject(ILjava/lang/Object;)Landroid/media/RemoteControlClient$MetadataEditor;\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"putString(ILjava/lang/String;)Landroid/media/RemoteControlClient$MetadataEditor;\" deprecated=\"29\"/>\n\t\t<field name=\"BITMAP_KEY_ARTWORK\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/media/RemoteControlClient$OnGetPlaybackPositionListener\" since=\"18\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onGetPlaybackPosition()J\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/media/RemoteControlClient$OnMetadataUpdateListener\" since=\"19\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onMetadataUpdate(ILjava/lang/Object;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/media/RemoteControlClient$OnPlaybackPositionUpdateListener\" since=\"18\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onPlaybackPositionUpdate(J)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/media/RemoteController\" since=\"19\" deprecated=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/media/RemoteController$OnClientUpdateListener;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/media/RemoteController$OnClientUpdateListener;Landroid/os/Looper;)V\" deprecated=\"29\"/>\n\t\t<method name=\"clearArtworkConfiguration()Z\" deprecated=\"29\"/>\n\t\t<method name=\"editMetadata()Landroid/media/RemoteController$MetadataEditor;\" deprecated=\"29\"/>\n\t\t<method name=\"getEstimatedMediaPosition()J\" deprecated=\"29\"/>\n\t\t<method name=\"seekTo(J)Z\" deprecated=\"29\"/>\n\t\t<method name=\"sendMediaKeyEvent(Landroid/view/KeyEvent;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"setArtworkConfiguration(II)Z\" deprecated=\"29\"/>\n\t\t<method name=\"setSynchronizationMode(I)Z\" deprecated=\"29\"/>\n\t\t<field name=\"POSITION_SYNCHRONIZATION_CHECK\" deprecated=\"29\"/>\n\t\t<field name=\"POSITION_SYNCHRONIZATION_NONE\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/media/RemoteController$MetadataEditor\" since=\"19\" deprecated=\"29\">\n\t\t<extends name=\"android/media/MediaMetadataEditor\"/>\n\t</class>\n\t<class name=\"android/media/RemoteController$OnClientUpdateListener\" since=\"19\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onClientChange(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"onClientMetadataUpdate(Landroid/media/RemoteController$MetadataEditor;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onClientPlaybackStateUpdate(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"onClientPlaybackStateUpdate(IJJF)V\" deprecated=\"29\"/>\n\t\t<method name=\"onClientTransportControlUpdate(I)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/media/ResourceBusyException\" since=\"19\">\n\t\t<extends name=\"android/media/MediaDrmException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/media/Ringtone\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAudioAttributes()Landroid/media/AudioAttributes;\" since=\"21\"/>\n\t\t<method name=\"getStreamType()I\" deprecated=\"21\"/>\n\t\t<method name=\"getTitle(Landroid/content/Context;)Ljava/lang/String;\"/>\n\t\t<method name=\"getVolume()F\" since=\"28\"/>\n\t\t<method name=\"isLooping()Z\" since=\"28\"/>\n\t\t<method name=\"isPlaying()Z\"/>\n\t\t<method name=\"play()V\"/>\n\t\t<method name=\"setAudioAttributes(Landroid/media/AudioAttributes;)V\" since=\"21\"/>\n\t\t<method name=\"setLooping(Z)V\" since=\"28\"/>\n\t\t<method name=\"setStreamType(I)V\" deprecated=\"21\"/>\n\t\t<method name=\"setVolume(F)V\" since=\"28\"/>\n\t\t<method name=\"stop()V\"/>\n\t</class>\n\t<class name=\"android/media/RingtoneManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/Activity;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"getActualDefaultRingtoneUri(Landroid/content/Context;I)Landroid/net/Uri;\"/>\n\t\t<method name=\"getCursor()Landroid/database/Cursor;\"/>\n\t\t<method name=\"getDefaultType(Landroid/net/Uri;)I\"/>\n\t\t<method name=\"getDefaultUri(I)Landroid/net/Uri;\"/>\n\t\t<method name=\"getIncludeDrm()Z\" deprecated=\"19\"/>\n\t\t<method name=\"getRingtone(I)Landroid/media/Ringtone;\"/>\n\t\t<method name=\"getRingtone(Landroid/content/Context;Landroid/net/Uri;)Landroid/media/Ringtone;\"/>\n\t\t<method name=\"getRingtonePosition(Landroid/net/Uri;)I\"/>\n\t\t<method name=\"getRingtoneUri(I)Landroid/net/Uri;\"/>\n\t\t<method name=\"getStopPreviousRingtone()Z\"/>\n\t\t<method name=\"getValidRingtoneUri(Landroid/content/Context;)Landroid/net/Uri;\"/>\n\t\t<method name=\"hasHapticChannels(I)Z\" since=\"29\"/>\n\t\t<method name=\"hasHapticChannels(Landroid/net/Uri;)Z\" since=\"29\"/>\n\t\t<method name=\"inferStreamType()I\" since=\"3\"/>\n\t\t<method name=\"isDefault(Landroid/net/Uri;)Z\"/>\n\t\t<method name=\"openDefaultRingtoneUri(Landroid/content/Context;Landroid/net/Uri;)Landroid/content/res/AssetFileDescriptor;\" since=\"29\"/>\n\t\t<method name=\"setActualDefaultRingtoneUri(Landroid/content/Context;ILandroid/net/Uri;)V\"/>\n\t\t<method name=\"setIncludeDrm(Z)V\" deprecated=\"19\"/>\n\t\t<method name=\"setStopPreviousRingtone(Z)V\"/>\n\t\t<method name=\"setType(I)V\"/>\n\t\t<method name=\"stopPreviousRingtone()V\"/>\n\t\t<field name=\"ACTION_RINGTONE_PICKER\"/>\n\t\t<field name=\"EXTRA_RINGTONE_DEFAULT_URI\"/>\n\t\t<field name=\"EXTRA_RINGTONE_EXISTING_URI\"/>\n\t\t<field name=\"EXTRA_RINGTONE_INCLUDE_DRM\" deprecated=\"19\"/>\n\t\t<field name=\"EXTRA_RINGTONE_PICKED_URI\"/>\n\t\t<field name=\"EXTRA_RINGTONE_SHOW_DEFAULT\"/>\n\t\t<field name=\"EXTRA_RINGTONE_SHOW_SILENT\"/>\n\t\t<field name=\"EXTRA_RINGTONE_TITLE\"/>\n\t\t<field name=\"EXTRA_RINGTONE_TYPE\"/>\n\t\t<field name=\"ID_COLUMN_INDEX\"/>\n\t\t<field name=\"TITLE_COLUMN_INDEX\"/>\n\t\t<field name=\"TYPE_ALARM\"/>\n\t\t<field name=\"TYPE_ALL\"/>\n\t\t<field name=\"TYPE_NOTIFICATION\"/>\n\t\t<field name=\"TYPE_RINGTONE\"/>\n\t\t<field name=\"URI_COLUMN_INDEX\"/>\n\t</class>\n\t<class name=\"android/media/Session2Command\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"getCommandCode()I\"/>\n\t\t<method name=\"getCustomAction()Ljava/lang/String;\"/>\n\t\t<method name=\"getCustomExtras()Landroid/os/Bundle;\"/>\n\t\t<field name=\"COMMAND_CODE_CUSTOM\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/media/Session2Command$Result\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(ILandroid/os/Bundle;)V\"/>\n\t\t<method name=\"getResultCode()I\"/>\n\t\t<method name=\"getResultData()Landroid/os/Bundle;\"/>\n\t\t<field name=\"RESULT_ERROR_UNKNOWN_ERROR\"/>\n\t\t<field name=\"RESULT_INFO_SKIPPED\"/>\n\t\t<field name=\"RESULT_SUCCESS\"/>\n\t</class>\n\t<class name=\"android/media/Session2CommandGroup\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getCommands()Ljava/util/Set;\"/>\n\t\t<method name=\"hasCommand(I)Z\"/>\n\t\t<method name=\"hasCommand(Landroid/media/Session2Command;)Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/media/Session2CommandGroup$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/media/Session2CommandGroup;)V\"/>\n\t\t<method name=\"addCommand(Landroid/media/Session2Command;)Landroid/media/Session2CommandGroup$Builder;\"/>\n\t\t<method name=\"build()Landroid/media/Session2CommandGroup;\"/>\n\t\t<method name=\"removeCommand(Landroid/media/Session2Command;)Landroid/media/Session2CommandGroup$Builder;\"/>\n\t</class>\n\t<class name=\"android/media/Session2Token\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/content/ComponentName;)V\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getServiceName()Ljava/lang/String;\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<method name=\"getUid()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"TYPE_SESSION\"/>\n\t\t<field name=\"TYPE_SESSION_SERVICE\"/>\n\t</class>\n\t<class name=\"android/media/SoundPool\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(III)V\" deprecated=\"21\"/>\n\t\t<method name=\"autoPause()V\" since=\"8\"/>\n\t\t<method name=\"autoResume()V\" since=\"8\"/>\n\t\t<method name=\"load(Landroid/content/Context;II)I\"/>\n\t\t<method name=\"load(Landroid/content/res/AssetFileDescriptor;I)I\" since=\"3\"/>\n\t\t<method name=\"load(Ljava/io/FileDescriptor;JJI)I\" since=\"3\"/>\n\t\t<method name=\"load(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"pause(I)V\"/>\n\t\t<method name=\"play(IFFIIF)I\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"resume(I)V\"/>\n\t\t<method name=\"setLoop(II)V\"/>\n\t\t<method name=\"setOnLoadCompleteListener(Landroid/media/SoundPool$OnLoadCompleteListener;)V\" since=\"8\"/>\n\t\t<method name=\"setPriority(II)V\"/>\n\t\t<method name=\"setRate(IF)V\"/>\n\t\t<method name=\"setVolume(IFF)V\"/>\n\t\t<method name=\"stop(I)V\"/>\n\t\t<method name=\"unload(I)Z\"/>\n\t</class>\n\t<class name=\"android/media/SoundPool$Builder\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/media/SoundPool;\"/>\n\t\t<method name=\"setAudioAttributes(Landroid/media/AudioAttributes;)Landroid/media/SoundPool$Builder;\"/>\n\t\t<method name=\"setMaxStreams(I)Landroid/media/SoundPool$Builder;\"/>\n\t</class>\n\t<class name=\"android/media/SoundPool$OnLoadCompleteListener\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onLoadComplete(Landroid/media/SoundPool;II)V\"/>\n\t</class>\n\t<class name=\"android/media/SubtitleData\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(IJJ[B)V\" since=\"29\"/>\n\t\t<method name=\"getData()[B\"/>\n\t\t<method name=\"getDurationUs()J\"/>\n\t\t<method name=\"getStartTimeUs()J\"/>\n\t\t<method name=\"getTrackIndex()I\"/>\n\t</class>\n\t<class name=\"android/media/SyncParams\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"allowDefaults()Landroid/media/SyncParams;\"/>\n\t\t<method name=\"getAudioAdjustMode()I\"/>\n\t\t<method name=\"getFrameRate()F\"/>\n\t\t<method name=\"getSyncSource()I\"/>\n\t\t<method name=\"getTolerance()F\"/>\n\t\t<method name=\"setAudioAdjustMode(I)Landroid/media/SyncParams;\"/>\n\t\t<method name=\"setFrameRate(F)Landroid/media/SyncParams;\"/>\n\t\t<method name=\"setSyncSource(I)Landroid/media/SyncParams;\"/>\n\t\t<method name=\"setTolerance(F)Landroid/media/SyncParams;\"/>\n\t\t<field name=\"AUDIO_ADJUST_MODE_DEFAULT\"/>\n\t\t<field name=\"AUDIO_ADJUST_MODE_RESAMPLE\"/>\n\t\t<field name=\"AUDIO_ADJUST_MODE_STRETCH\"/>\n\t\t<field name=\"SYNC_SOURCE_AUDIO\"/>\n\t\t<field name=\"SYNC_SOURCE_DEFAULT\"/>\n\t\t<field name=\"SYNC_SOURCE_SYSTEM_CLOCK\"/>\n\t\t<field name=\"SYNC_SOURCE_VSYNC\"/>\n\t</class>\n\t<class name=\"android/media/ThumbnailUtils\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"createAudioThumbnail(Ljava/io/File;Landroid/util/Size;Landroid/os/CancellationSignal;)Landroid/graphics/Bitmap;\" since=\"29\"/>\n\t\t<method name=\"createAudioThumbnail(Ljava/lang/String;I)Landroid/graphics/Bitmap;\" since=\"29\" deprecated=\"29\"/>\n\t\t<method name=\"createImageThumbnail(Ljava/io/File;Landroid/util/Size;Landroid/os/CancellationSignal;)Landroid/graphics/Bitmap;\" since=\"29\"/>\n\t\t<method name=\"createImageThumbnail(Ljava/lang/String;I)Landroid/graphics/Bitmap;\" since=\"29\" deprecated=\"29\"/>\n\t\t<method name=\"createVideoThumbnail(Ljava/io/File;Landroid/util/Size;Landroid/os/CancellationSignal;)Landroid/graphics/Bitmap;\" since=\"29\"/>\n\t\t<method name=\"createVideoThumbnail(Ljava/lang/String;I)Landroid/graphics/Bitmap;\" deprecated=\"29\"/>\n\t\t<method name=\"extractThumbnail(Landroid/graphics/Bitmap;II)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"extractThumbnail(Landroid/graphics/Bitmap;III)Landroid/graphics/Bitmap;\"/>\n\t\t<field name=\"OPTIONS_RECYCLE_INPUT\"/>\n\t</class>\n\t<class name=\"android/media/TimedMetaData\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(J[B)V\" since=\"29\"/>\n\t\t<method name=\"getMetaData()[B\"/>\n\t\t<method name=\"getTimestamp()J\"/>\n\t</class>\n\t<class name=\"android/media/TimedText\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getBounds()Landroid/graphics/Rect;\"/>\n\t\t<method name=\"getText()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/media/ToneGenerator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"getAudioSessionId()I\" since=\"16\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"startTone(I)Z\"/>\n\t\t<method name=\"startTone(II)Z\" since=\"5\"/>\n\t\t<method name=\"stopTone()V\"/>\n\t\t<field name=\"MAX_VOLUME\"/>\n\t\t<field name=\"MIN_VOLUME\"/>\n\t\t<field name=\"TONE_CDMA_ABBR_ALERT\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_ABBR_INTERCEPT\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_ABBR_REORDER\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_ALERT_AUTOREDIAL_LITE\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_ALERT_CALL_GUARD\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_ALERT_INCALL_LITE\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_ALERT_NETWORK_LITE\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_ANSWER\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_CALLDROP_LITE\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_CALL_SIGNAL_ISDN_INTERGROUP\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_CALL_SIGNAL_ISDN_NORMAL\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_CALL_SIGNAL_ISDN_PAT3\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_CALL_SIGNAL_ISDN_PAT5\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_CALL_SIGNAL_ISDN_PAT6\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_CALL_SIGNAL_ISDN_PAT7\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_CALL_SIGNAL_ISDN_PING_RING\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_CALL_SIGNAL_ISDN_SP_PRI\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_CONFIRM\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_DIAL_TONE_LITE\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_EMERGENCY_RINGBACK\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_HIGH_L\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_HIGH_PBX_L\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_HIGH_PBX_SLS\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_HIGH_PBX_SS\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_HIGH_PBX_SSL\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_HIGH_PBX_S_X4\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_HIGH_SLS\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_HIGH_SS\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_HIGH_SSL\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_HIGH_SS_2\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_HIGH_S_X4\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_INTERCEPT\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_KEYPAD_VOLUME_KEY_LITE\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_LOW_L\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_LOW_PBX_L\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_LOW_PBX_SLS\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_LOW_PBX_SS\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_LOW_PBX_SSL\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_LOW_PBX_S_X4\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_LOW_SLS\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_LOW_SS\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_LOW_SSL\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_LOW_SS_2\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_LOW_S_X4\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_MED_L\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_MED_PBX_L\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_MED_PBX_SLS\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_MED_PBX_SS\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_MED_PBX_SSL\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_MED_PBX_S_X4\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_MED_SLS\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_MED_SS\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_MED_SSL\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_MED_SS_2\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_MED_S_X4\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_NETWORK_BUSY\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_NETWORK_BUSY_ONE_SHOT\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_NETWORK_CALLWAITING\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_NETWORK_USA_RINGBACK\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_ONE_MIN_BEEP\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_PIP\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_PRESSHOLDKEY_LITE\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_REORDER\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_SIGNAL_OFF\" since=\"4\"/>\n\t\t<field name=\"TONE_CDMA_SOFT_ERROR_LITE\" since=\"4\"/>\n\t\t<field name=\"TONE_DTMF_0\"/>\n\t\t<field name=\"TONE_DTMF_1\"/>\n\t\t<field name=\"TONE_DTMF_2\"/>\n\t\t<field name=\"TONE_DTMF_3\"/>\n\t\t<field name=\"TONE_DTMF_4\"/>\n\t\t<field name=\"TONE_DTMF_5\"/>\n\t\t<field name=\"TONE_DTMF_6\"/>\n\t\t<field name=\"TONE_DTMF_7\"/>\n\t\t<field name=\"TONE_DTMF_8\"/>\n\t\t<field name=\"TONE_DTMF_9\"/>\n\t\t<field name=\"TONE_DTMF_A\"/>\n\t\t<field name=\"TONE_DTMF_B\"/>\n\t\t<field name=\"TONE_DTMF_C\"/>\n\t\t<field name=\"TONE_DTMF_D\"/>\n\t\t<field name=\"TONE_DTMF_P\"/>\n\t\t<field name=\"TONE_DTMF_S\"/>\n\t\t<field name=\"TONE_PROP_ACK\"/>\n\t\t<field name=\"TONE_PROP_BEEP\"/>\n\t\t<field name=\"TONE_PROP_BEEP2\"/>\n\t\t<field name=\"TONE_PROP_NACK\"/>\n\t\t<field name=\"TONE_PROP_PROMPT\"/>\n\t\t<field name=\"TONE_SUP_BUSY\"/>\n\t\t<field name=\"TONE_SUP_CALL_WAITING\"/>\n\t\t<field name=\"TONE_SUP_CONFIRM\" since=\"4\"/>\n\t\t<field name=\"TONE_SUP_CONGESTION\"/>\n\t\t<field name=\"TONE_SUP_CONGESTION_ABBREV\" since=\"4\"/>\n\t\t<field name=\"TONE_SUP_DIAL\"/>\n\t\t<field name=\"TONE_SUP_ERROR\"/>\n\t\t<field name=\"TONE_SUP_INTERCEPT\" since=\"4\"/>\n\t\t<field name=\"TONE_SUP_INTERCEPT_ABBREV\" since=\"4\"/>\n\t\t<field name=\"TONE_SUP_PIP\" since=\"4\"/>\n\t\t<field name=\"TONE_SUP_RADIO_ACK\"/>\n\t\t<field name=\"TONE_SUP_RADIO_NOTAVAIL\"/>\n\t\t<field name=\"TONE_SUP_RINGTONE\"/>\n\t</class>\n\t<class name=\"android/media/UnsupportedSchemeException\" since=\"18\">\n\t\t<extends name=\"android/media/MediaDrmException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/media/VolumeAutomation\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createVolumeShaper(Landroid/media/VolumeShaper$Configuration;)Landroid/media/VolumeShaper;\"/>\n\t</class>\n\t<class name=\"android/media/VolumeProvider\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"getCurrentVolume()I\"/>\n\t\t<method name=\"getMaxVolume()I\"/>\n\t\t<method name=\"getVolumeControl()I\"/>\n\t\t<method name=\"onAdjustVolume(I)V\"/>\n\t\t<method name=\"onSetVolumeTo(I)V\"/>\n\t\t<method name=\"setCurrentVolume(I)V\"/>\n\t\t<field name=\"VOLUME_CONTROL_ABSOLUTE\"/>\n\t\t<field name=\"VOLUME_CONTROL_FIXED\"/>\n\t\t<field name=\"VOLUME_CONTROL_RELATIVE\"/>\n\t</class>\n\t<class name=\"android/media/VolumeShaper\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"apply(Landroid/media/VolumeShaper$Operation;)V\"/>\n\t\t<method name=\"getVolume()F\"/>\n\t\t<method name=\"replace(Landroid/media/VolumeShaper$Configuration;Landroid/media/VolumeShaper$Operation;Z)V\"/>\n\t</class>\n\t<class name=\"android/media/VolumeShaper$Configuration\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getDuration()J\"/>\n\t\t<method name=\"getInterpolatorType()I\"/>\n\t\t<method name=\"getMaximumCurvePoints()I\"/>\n\t\t<method name=\"getTimes()[F\"/>\n\t\t<method name=\"getVolumes()[F\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"CUBIC_RAMP\"/>\n\t\t<field name=\"INTERPOLATOR_TYPE_CUBIC\"/>\n\t\t<field name=\"INTERPOLATOR_TYPE_CUBIC_MONOTONIC\"/>\n\t\t<field name=\"INTERPOLATOR_TYPE_LINEAR\"/>\n\t\t<field name=\"INTERPOLATOR_TYPE_STEP\"/>\n\t\t<field name=\"LINEAR_RAMP\"/>\n\t\t<field name=\"SCURVE_RAMP\"/>\n\t\t<field name=\"SINE_RAMP\"/>\n\t</class>\n\t<class name=\"android/media/VolumeShaper$Configuration$Builder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/media/VolumeShaper$Configuration;)V\"/>\n\t\t<method name=\"build()Landroid/media/VolumeShaper$Configuration;\"/>\n\t\t<method name=\"invertVolumes()Landroid/media/VolumeShaper$Configuration$Builder;\"/>\n\t\t<method name=\"reflectTimes()Landroid/media/VolumeShaper$Configuration$Builder;\"/>\n\t\t<method name=\"scaleToEndVolume(F)Landroid/media/VolumeShaper$Configuration$Builder;\"/>\n\t\t<method name=\"scaleToStartVolume(F)Landroid/media/VolumeShaper$Configuration$Builder;\"/>\n\t\t<method name=\"setCurve([F[F)Landroid/media/VolumeShaper$Configuration$Builder;\"/>\n\t\t<method name=\"setDuration(J)Landroid/media/VolumeShaper$Configuration$Builder;\"/>\n\t\t<method name=\"setInterpolatorType(I)Landroid/media/VolumeShaper$Configuration$Builder;\"/>\n\t</class>\n\t<class name=\"android/media/VolumeShaper$Operation\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"PLAY\"/>\n\t\t<field name=\"REVERSE\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/AcousticEchoCanceler\" since=\"16\">\n\t\t<extends name=\"android/media/audiofx/AudioEffect\"/>\n\t\t<method name=\"create(I)Landroid/media/audiofx/AcousticEchoCanceler;\"/>\n\t\t<method name=\"isAvailable()Z\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/AudioEffect\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getDescriptor()Landroid/media/audiofx/AudioEffect$Descriptor;\"/>\n\t\t<method name=\"getEnabled()Z\"/>\n\t\t<method name=\"getId()I\"/>\n\t\t<method name=\"hasControl()Z\"/>\n\t\t<method name=\"queryEffects()[Landroid/media/audiofx/AudioEffect$Descriptor;\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"setControlStatusListener(Landroid/media/audiofx/AudioEffect$OnControlStatusChangeListener;)V\"/>\n\t\t<method name=\"setEnableStatusListener(Landroid/media/audiofx/AudioEffect$OnEnableStatusChangeListener;)V\"/>\n\t\t<method name=\"setEnabled(Z)I\"/>\n\t\t<field name=\"ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION\"/>\n\t\t<field name=\"ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL\"/>\n\t\t<field name=\"ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION\"/>\n\t\t<field name=\"ALREADY_EXISTS\"/>\n\t\t<field name=\"CONTENT_TYPE_GAME\"/>\n\t\t<field name=\"CONTENT_TYPE_MOVIE\"/>\n\t\t<field name=\"CONTENT_TYPE_MUSIC\"/>\n\t\t<field name=\"CONTENT_TYPE_VOICE\"/>\n\t\t<field name=\"EFFECT_AUXILIARY\"/>\n\t\t<field name=\"EFFECT_INSERT\"/>\n\t\t<field name=\"EFFECT_TYPE_AEC\" since=\"18\"/>\n\t\t<field name=\"EFFECT_TYPE_AGC\" since=\"18\"/>\n\t\t<field name=\"EFFECT_TYPE_BASS_BOOST\" since=\"18\"/>\n\t\t<field name=\"EFFECT_TYPE_DYNAMICS_PROCESSING\" since=\"28\"/>\n\t\t<field name=\"EFFECT_TYPE_ENV_REVERB\" since=\"18\"/>\n\t\t<field name=\"EFFECT_TYPE_EQUALIZER\" since=\"18\"/>\n\t\t<field name=\"EFFECT_TYPE_LOUDNESS_ENHANCER\" since=\"19\"/>\n\t\t<field name=\"EFFECT_TYPE_NS\" since=\"18\"/>\n\t\t<field name=\"EFFECT_TYPE_PRESET_REVERB\" since=\"18\"/>\n\t\t<field name=\"EFFECT_TYPE_VIRTUALIZER\" since=\"18\"/>\n\t\t<field name=\"ERROR\"/>\n\t\t<field name=\"ERROR_BAD_VALUE\"/>\n\t\t<field name=\"ERROR_DEAD_OBJECT\"/>\n\t\t<field name=\"ERROR_INVALID_OPERATION\"/>\n\t\t<field name=\"ERROR_NO_INIT\"/>\n\t\t<field name=\"ERROR_NO_MEMORY\"/>\n\t\t<field name=\"EXTRA_AUDIO_SESSION\"/>\n\t\t<field name=\"EXTRA_CONTENT_TYPE\"/>\n\t\t<field name=\"EXTRA_PACKAGE_NAME\"/>\n\t\t<field name=\"SUCCESS\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/AudioEffect$Descriptor\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<field name=\"connectMode\"/>\n\t\t<field name=\"implementor\"/>\n\t\t<field name=\"name\"/>\n\t\t<field name=\"type\"/>\n\t\t<field name=\"uuid\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/AudioEffect$OnControlStatusChangeListener\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onControlStatusChange(Landroid/media/audiofx/AudioEffect;Z)V\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/AudioEffect$OnEnableStatusChangeListener\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onEnableStatusChange(Landroid/media/audiofx/AudioEffect;Z)V\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/AutomaticGainControl\" since=\"16\">\n\t\t<extends name=\"android/media/audiofx/AudioEffect\"/>\n\t\t<method name=\"create(I)Landroid/media/audiofx/AutomaticGainControl;\"/>\n\t\t<method name=\"isAvailable()Z\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/BassBoost\" since=\"9\">\n\t\t<extends name=\"android/media/audiofx/AudioEffect\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"getProperties()Landroid/media/audiofx/BassBoost$Settings;\"/>\n\t\t<method name=\"getRoundedStrength()S\"/>\n\t\t<method name=\"getStrengthSupported()Z\"/>\n\t\t<method name=\"setParameterListener(Landroid/media/audiofx/BassBoost$OnParameterChangeListener;)V\"/>\n\t\t<method name=\"setProperties(Landroid/media/audiofx/BassBoost$Settings;)V\"/>\n\t\t<method name=\"setStrength(S)V\"/>\n\t\t<field name=\"PARAM_STRENGTH\"/>\n\t\t<field name=\"PARAM_STRENGTH_SUPPORTED\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/BassBoost$OnParameterChangeListener\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onParameterChange(Landroid/media/audiofx/BassBoost;IIS)V\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/BassBoost$Settings\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<field name=\"strength\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/DynamicsProcessing\" since=\"28\">\n\t\t<extends name=\"android/media/audiofx/AudioEffect\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(IILandroid/media/audiofx/DynamicsProcessing$Config;)V\"/>\n\t\t<method name=\"getChannelByChannelIndex(I)Landroid/media/audiofx/DynamicsProcessing$Channel;\"/>\n\t\t<method name=\"getChannelCount()I\"/>\n\t\t<method name=\"getConfig()Landroid/media/audiofx/DynamicsProcessing$Config;\"/>\n\t\t<method name=\"getInputGainByChannelIndex(I)F\"/>\n\t\t<method name=\"getLimiterByChannelIndex(I)Landroid/media/audiofx/DynamicsProcessing$Limiter;\"/>\n\t\t<method name=\"getMbcBandByChannelIndex(II)Landroid/media/audiofx/DynamicsProcessing$MbcBand;\"/>\n\t\t<method name=\"getMbcByChannelIndex(I)Landroid/media/audiofx/DynamicsProcessing$Mbc;\"/>\n\t\t<method name=\"getPostEqBandByChannelIndex(II)Landroid/media/audiofx/DynamicsProcessing$EqBand;\"/>\n\t\t<method name=\"getPostEqByChannelIndex(I)Landroid/media/audiofx/DynamicsProcessing$Eq;\"/>\n\t\t<method name=\"getPreEqBandByChannelIndex(II)Landroid/media/audiofx/DynamicsProcessing$EqBand;\"/>\n\t\t<method name=\"getPreEqByChannelIndex(I)Landroid/media/audiofx/DynamicsProcessing$Eq;\"/>\n\t\t<method name=\"setAllChannelsTo(Landroid/media/audiofx/DynamicsProcessing$Channel;)V\"/>\n\t\t<method name=\"setChannelTo(ILandroid/media/audiofx/DynamicsProcessing$Channel;)V\"/>\n\t\t<method name=\"setInputGainAllChannelsTo(F)V\"/>\n\t\t<method name=\"setInputGainbyChannel(IF)V\"/>\n\t\t<method name=\"setLimiterAllChannelsTo(Landroid/media/audiofx/DynamicsProcessing$Limiter;)V\"/>\n\t\t<method name=\"setLimiterByChannelIndex(ILandroid/media/audiofx/DynamicsProcessing$Limiter;)V\"/>\n\t\t<method name=\"setMbcAllChannelsTo(Landroid/media/audiofx/DynamicsProcessing$Mbc;)V\"/>\n\t\t<method name=\"setMbcBandAllChannelsTo(ILandroid/media/audiofx/DynamicsProcessing$MbcBand;)V\"/>\n\t\t<method name=\"setMbcBandByChannelIndex(IILandroid/media/audiofx/DynamicsProcessing$MbcBand;)V\"/>\n\t\t<method name=\"setMbcByChannelIndex(ILandroid/media/audiofx/DynamicsProcessing$Mbc;)V\"/>\n\t\t<method name=\"setPostEqAllChannelsTo(Landroid/media/audiofx/DynamicsProcessing$Eq;)V\"/>\n\t\t<method name=\"setPostEqBandAllChannelsTo(ILandroid/media/audiofx/DynamicsProcessing$EqBand;)V\"/>\n\t\t<method name=\"setPostEqBandByChannelIndex(IILandroid/media/audiofx/DynamicsProcessing$EqBand;)V\"/>\n\t\t<method name=\"setPostEqByChannelIndex(ILandroid/media/audiofx/DynamicsProcessing$Eq;)V\"/>\n\t\t<method name=\"setPreEqAllChannelsTo(Landroid/media/audiofx/DynamicsProcessing$Eq;)V\"/>\n\t\t<method name=\"setPreEqBandAllChannelsTo(ILandroid/media/audiofx/DynamicsProcessing$EqBand;)V\"/>\n\t\t<method name=\"setPreEqBandByChannelIndex(IILandroid/media/audiofx/DynamicsProcessing$EqBand;)V\"/>\n\t\t<method name=\"setPreEqByChannelIndex(ILandroid/media/audiofx/DynamicsProcessing$Eq;)V\"/>\n\t\t<field name=\"VARIANT_FAVOR_FREQUENCY_RESOLUTION\"/>\n\t\t<field name=\"VARIANT_FAVOR_TIME_RESOLUTION\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/DynamicsProcessing$BandBase\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(ZF)V\"/>\n\t\t<method name=\"getCutoffFrequency()F\"/>\n\t\t<method name=\"isEnabled()Z\"/>\n\t\t<method name=\"setCutoffFrequency(F)V\"/>\n\t\t<method name=\"setEnabled(Z)V\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/DynamicsProcessing$BandStage\" since=\"28\">\n\t\t<extends name=\"android/media/audiofx/DynamicsProcessing$Stage\"/>\n\t\t<method name=\"&lt;init>(ZZI)V\"/>\n\t\t<method name=\"getBandCount()I\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/DynamicsProcessing$Channel\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(FZIZIZIZ)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/media/audiofx/DynamicsProcessing$Channel;)V\"/>\n\t\t<method name=\"getInputGain()F\"/>\n\t\t<method name=\"getLimiter()Landroid/media/audiofx/DynamicsProcessing$Limiter;\"/>\n\t\t<method name=\"getMbc()Landroid/media/audiofx/DynamicsProcessing$Mbc;\"/>\n\t\t<method name=\"getMbcBand(I)Landroid/media/audiofx/DynamicsProcessing$MbcBand;\"/>\n\t\t<method name=\"getPostEq()Landroid/media/audiofx/DynamicsProcessing$Eq;\"/>\n\t\t<method name=\"getPostEqBand(I)Landroid/media/audiofx/DynamicsProcessing$EqBand;\"/>\n\t\t<method name=\"getPreEq()Landroid/media/audiofx/DynamicsProcessing$Eq;\"/>\n\t\t<method name=\"getPreEqBand(I)Landroid/media/audiofx/DynamicsProcessing$EqBand;\"/>\n\t\t<method name=\"setInputGain(F)V\"/>\n\t\t<method name=\"setLimiter(Landroid/media/audiofx/DynamicsProcessing$Limiter;)V\"/>\n\t\t<method name=\"setMbc(Landroid/media/audiofx/DynamicsProcessing$Mbc;)V\"/>\n\t\t<method name=\"setMbcBand(ILandroid/media/audiofx/DynamicsProcessing$MbcBand;)V\"/>\n\t\t<method name=\"setPostEq(Landroid/media/audiofx/DynamicsProcessing$Eq;)V\"/>\n\t\t<method name=\"setPostEqBand(ILandroid/media/audiofx/DynamicsProcessing$EqBand;)V\"/>\n\t\t<method name=\"setPreEq(Landroid/media/audiofx/DynamicsProcessing$Eq;)V\"/>\n\t\t<method name=\"setPreEqBand(ILandroid/media/audiofx/DynamicsProcessing$EqBand;)V\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/DynamicsProcessing$Config\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getChannelByChannelIndex(I)Landroid/media/audiofx/DynamicsProcessing$Channel;\"/>\n\t\t<method name=\"getInputGainByChannelIndex(I)F\"/>\n\t\t<method name=\"getLimiterByChannelIndex(I)Landroid/media/audiofx/DynamicsProcessing$Limiter;\"/>\n\t\t<method name=\"getMbcBandByChannelIndex(II)Landroid/media/audiofx/DynamicsProcessing$MbcBand;\"/>\n\t\t<method name=\"getMbcBandCount()I\"/>\n\t\t<method name=\"getMbcByChannelIndex(I)Landroid/media/audiofx/DynamicsProcessing$Mbc;\"/>\n\t\t<method name=\"getPostEqBandByChannelIndex(II)Landroid/media/audiofx/DynamicsProcessing$EqBand;\"/>\n\t\t<method name=\"getPostEqBandCount()I\"/>\n\t\t<method name=\"getPostEqByChannelIndex(I)Landroid/media/audiofx/DynamicsProcessing$Eq;\"/>\n\t\t<method name=\"getPreEqBandByChannelIndex(II)Landroid/media/audiofx/DynamicsProcessing$EqBand;\"/>\n\t\t<method name=\"getPreEqBandCount()I\"/>\n\t\t<method name=\"getPreEqByChannelIndex(I)Landroid/media/audiofx/DynamicsProcessing$Eq;\"/>\n\t\t<method name=\"getPreferredFrameDuration()F\"/>\n\t\t<method name=\"getVariant()I\"/>\n\t\t<method name=\"isLimiterInUse()Z\"/>\n\t\t<method name=\"isMbcInUse()Z\"/>\n\t\t<method name=\"isPostEqInUse()Z\"/>\n\t\t<method name=\"isPreEqInUse()Z\"/>\n\t\t<method name=\"setAllChannelsTo(Landroid/media/audiofx/DynamicsProcessing$Channel;)V\"/>\n\t\t<method name=\"setChannelTo(ILandroid/media/audiofx/DynamicsProcessing$Channel;)V\"/>\n\t\t<method name=\"setInputGainAllChannelsTo(F)V\"/>\n\t\t<method name=\"setInputGainByChannelIndex(IF)V\"/>\n\t\t<method name=\"setLimiterAllChannelsTo(Landroid/media/audiofx/DynamicsProcessing$Limiter;)V\"/>\n\t\t<method name=\"setLimiterByChannelIndex(ILandroid/media/audiofx/DynamicsProcessing$Limiter;)V\"/>\n\t\t<method name=\"setMbcAllChannelsTo(Landroid/media/audiofx/DynamicsProcessing$Mbc;)V\"/>\n\t\t<method name=\"setMbcBandAllChannelsTo(ILandroid/media/audiofx/DynamicsProcessing$MbcBand;)V\"/>\n\t\t<method name=\"setMbcBandByChannelIndex(IILandroid/media/audiofx/DynamicsProcessing$MbcBand;)V\"/>\n\t\t<method name=\"setMbcByChannelIndex(ILandroid/media/audiofx/DynamicsProcessing$Mbc;)V\"/>\n\t\t<method name=\"setPostEqAllChannelsTo(Landroid/media/audiofx/DynamicsProcessing$Eq;)V\"/>\n\t\t<method name=\"setPostEqBandAllChannelsTo(ILandroid/media/audiofx/DynamicsProcessing$EqBand;)V\"/>\n\t\t<method name=\"setPostEqBandByChannelIndex(IILandroid/media/audiofx/DynamicsProcessing$EqBand;)V\"/>\n\t\t<method name=\"setPostEqByChannelIndex(ILandroid/media/audiofx/DynamicsProcessing$Eq;)V\"/>\n\t\t<method name=\"setPreEqAllChannelsTo(Landroid/media/audiofx/DynamicsProcessing$Eq;)V\"/>\n\t\t<method name=\"setPreEqBandAllChannelsTo(ILandroid/media/audiofx/DynamicsProcessing$EqBand;)V\"/>\n\t\t<method name=\"setPreEqBandByChannelIndex(IILandroid/media/audiofx/DynamicsProcessing$EqBand;)V\"/>\n\t\t<method name=\"setPreEqByChannelIndex(ILandroid/media/audiofx/DynamicsProcessing$Eq;)V\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/DynamicsProcessing$Config$Builder\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(IIZIZIZIZ)V\"/>\n\t\t<method name=\"build()Landroid/media/audiofx/DynamicsProcessing$Config;\"/>\n\t\t<method name=\"setAllChannelsTo(Landroid/media/audiofx/DynamicsProcessing$Channel;)Landroid/media/audiofx/DynamicsProcessing$Config$Builder;\"/>\n\t\t<method name=\"setChannelTo(ILandroid/media/audiofx/DynamicsProcessing$Channel;)Landroid/media/audiofx/DynamicsProcessing$Config$Builder;\"/>\n\t\t<method name=\"setInputGainAllChannelsTo(F)Landroid/media/audiofx/DynamicsProcessing$Config$Builder;\"/>\n\t\t<method name=\"setInputGainByChannelIndex(IF)Landroid/media/audiofx/DynamicsProcessing$Config$Builder;\"/>\n\t\t<method name=\"setLimiterAllChannelsTo(Landroid/media/audiofx/DynamicsProcessing$Limiter;)Landroid/media/audiofx/DynamicsProcessing$Config$Builder;\"/>\n\t\t<method name=\"setLimiterByChannelIndex(ILandroid/media/audiofx/DynamicsProcessing$Limiter;)Landroid/media/audiofx/DynamicsProcessing$Config$Builder;\"/>\n\t\t<method name=\"setMbcAllChannelsTo(Landroid/media/audiofx/DynamicsProcessing$Mbc;)Landroid/media/audiofx/DynamicsProcessing$Config$Builder;\"/>\n\t\t<method name=\"setMbcByChannelIndex(ILandroid/media/audiofx/DynamicsProcessing$Mbc;)Landroid/media/audiofx/DynamicsProcessing$Config$Builder;\"/>\n\t\t<method name=\"setPostEqAllChannelsTo(Landroid/media/audiofx/DynamicsProcessing$Eq;)Landroid/media/audiofx/DynamicsProcessing$Config$Builder;\"/>\n\t\t<method name=\"setPostEqByChannelIndex(ILandroid/media/audiofx/DynamicsProcessing$Eq;)Landroid/media/audiofx/DynamicsProcessing$Config$Builder;\"/>\n\t\t<method name=\"setPreEqAllChannelsTo(Landroid/media/audiofx/DynamicsProcessing$Eq;)Landroid/media/audiofx/DynamicsProcessing$Config$Builder;\"/>\n\t\t<method name=\"setPreEqByChannelIndex(ILandroid/media/audiofx/DynamicsProcessing$Eq;)Landroid/media/audiofx/DynamicsProcessing$Config$Builder;\"/>\n\t\t<method name=\"setPreferredFrameDuration(F)Landroid/media/audiofx/DynamicsProcessing$Config$Builder;\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/DynamicsProcessing$Eq\" since=\"28\">\n\t\t<extends name=\"android/media/audiofx/DynamicsProcessing$BandStage\"/>\n\t\t<method name=\"&lt;init>(Landroid/media/audiofx/DynamicsProcessing$Eq;)V\"/>\n\t\t<method name=\"&lt;init>(ZZI)V\"/>\n\t\t<method name=\"getBand(I)Landroid/media/audiofx/DynamicsProcessing$EqBand;\"/>\n\t\t<method name=\"setBand(ILandroid/media/audiofx/DynamicsProcessing$EqBand;)V\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/DynamicsProcessing$EqBand\" since=\"28\">\n\t\t<extends name=\"android/media/audiofx/DynamicsProcessing$BandBase\"/>\n\t\t<method name=\"&lt;init>(Landroid/media/audiofx/DynamicsProcessing$EqBand;)V\"/>\n\t\t<method name=\"&lt;init>(ZFF)V\"/>\n\t\t<method name=\"getGain()F\"/>\n\t\t<method name=\"setGain(F)V\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/DynamicsProcessing$Limiter\" since=\"28\">\n\t\t<extends name=\"android/media/audiofx/DynamicsProcessing$Stage\"/>\n\t\t<method name=\"&lt;init>(Landroid/media/audiofx/DynamicsProcessing$Limiter;)V\"/>\n\t\t<method name=\"&lt;init>(ZZIFFFFF)V\"/>\n\t\t<method name=\"getAttackTime()F\"/>\n\t\t<method name=\"getLinkGroup()I\"/>\n\t\t<method name=\"getPostGain()F\"/>\n\t\t<method name=\"getRatio()F\"/>\n\t\t<method name=\"getReleaseTime()F\"/>\n\t\t<method name=\"getThreshold()F\"/>\n\t\t<method name=\"setAttackTime(F)V\"/>\n\t\t<method name=\"setLinkGroup(I)V\"/>\n\t\t<method name=\"setPostGain(F)V\"/>\n\t\t<method name=\"setRatio(F)V\"/>\n\t\t<method name=\"setReleaseTime(F)V\"/>\n\t\t<method name=\"setThreshold(F)V\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/DynamicsProcessing$Mbc\" since=\"28\">\n\t\t<extends name=\"android/media/audiofx/DynamicsProcessing$BandStage\"/>\n\t\t<method name=\"&lt;init>(Landroid/media/audiofx/DynamicsProcessing$Mbc;)V\"/>\n\t\t<method name=\"&lt;init>(ZZI)V\"/>\n\t\t<method name=\"getBand(I)Landroid/media/audiofx/DynamicsProcessing$MbcBand;\"/>\n\t\t<method name=\"setBand(ILandroid/media/audiofx/DynamicsProcessing$MbcBand;)V\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/DynamicsProcessing$MbcBand\" since=\"28\">\n\t\t<extends name=\"android/media/audiofx/DynamicsProcessing$BandBase\"/>\n\t\t<method name=\"&lt;init>(Landroid/media/audiofx/DynamicsProcessing$MbcBand;)V\"/>\n\t\t<method name=\"&lt;init>(ZFFFFFFFFFF)V\"/>\n\t\t<method name=\"getAttackTime()F\"/>\n\t\t<method name=\"getExpanderRatio()F\"/>\n\t\t<method name=\"getKneeWidth()F\"/>\n\t\t<method name=\"getNoiseGateThreshold()F\"/>\n\t\t<method name=\"getPostGain()F\"/>\n\t\t<method name=\"getPreGain()F\"/>\n\t\t<method name=\"getRatio()F\"/>\n\t\t<method name=\"getReleaseTime()F\"/>\n\t\t<method name=\"getThreshold()F\"/>\n\t\t<method name=\"setAttackTime(F)V\"/>\n\t\t<method name=\"setExpanderRatio(F)V\"/>\n\t\t<method name=\"setKneeWidth(F)V\"/>\n\t\t<method name=\"setNoiseGateThreshold(F)V\"/>\n\t\t<method name=\"setPostGain(F)V\"/>\n\t\t<method name=\"setPreGain(F)V\"/>\n\t\t<method name=\"setRatio(F)V\"/>\n\t\t<method name=\"setReleaseTime(F)V\"/>\n\t\t<method name=\"setThreshold(F)V\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/DynamicsProcessing$Stage\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(ZZ)V\"/>\n\t\t<method name=\"isEnabled()Z\"/>\n\t\t<method name=\"isInUse()Z\"/>\n\t\t<method name=\"setEnabled(Z)V\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/EnvironmentalReverb\" since=\"9\">\n\t\t<extends name=\"android/media/audiofx/AudioEffect\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"getDecayHFRatio()S\"/>\n\t\t<method name=\"getDecayTime()I\"/>\n\t\t<method name=\"getDensity()S\"/>\n\t\t<method name=\"getDiffusion()S\"/>\n\t\t<method name=\"getProperties()Landroid/media/audiofx/EnvironmentalReverb$Settings;\"/>\n\t\t<method name=\"getReflectionsDelay()I\"/>\n\t\t<method name=\"getReflectionsLevel()S\"/>\n\t\t<method name=\"getReverbDelay()I\"/>\n\t\t<method name=\"getReverbLevel()S\"/>\n\t\t<method name=\"getRoomHFLevel()S\"/>\n\t\t<method name=\"getRoomLevel()S\"/>\n\t\t<method name=\"setDecayHFRatio(S)V\"/>\n\t\t<method name=\"setDecayTime(I)V\"/>\n\t\t<method name=\"setDensity(S)V\"/>\n\t\t<method name=\"setDiffusion(S)V\"/>\n\t\t<method name=\"setParameterListener(Landroid/media/audiofx/EnvironmentalReverb$OnParameterChangeListener;)V\"/>\n\t\t<method name=\"setProperties(Landroid/media/audiofx/EnvironmentalReverb$Settings;)V\"/>\n\t\t<method name=\"setReflectionsDelay(I)V\"/>\n\t\t<method name=\"setReflectionsLevel(S)V\"/>\n\t\t<method name=\"setReverbDelay(I)V\"/>\n\t\t<method name=\"setReverbLevel(S)V\"/>\n\t\t<method name=\"setRoomHFLevel(S)V\"/>\n\t\t<method name=\"setRoomLevel(S)V\"/>\n\t\t<field name=\"PARAM_DECAY_HF_RATIO\"/>\n\t\t<field name=\"PARAM_DECAY_TIME\"/>\n\t\t<field name=\"PARAM_DENSITY\"/>\n\t\t<field name=\"PARAM_DIFFUSION\"/>\n\t\t<field name=\"PARAM_REFLECTIONS_DELAY\"/>\n\t\t<field name=\"PARAM_REFLECTIONS_LEVEL\"/>\n\t\t<field name=\"PARAM_REVERB_DELAY\"/>\n\t\t<field name=\"PARAM_REVERB_LEVEL\"/>\n\t\t<field name=\"PARAM_ROOM_HF_LEVEL\"/>\n\t\t<field name=\"PARAM_ROOM_LEVEL\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/EnvironmentalReverb$OnParameterChangeListener\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onParameterChange(Landroid/media/audiofx/EnvironmentalReverb;III)V\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/EnvironmentalReverb$Settings\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<field name=\"decayHFRatio\"/>\n\t\t<field name=\"decayTime\"/>\n\t\t<field name=\"density\"/>\n\t\t<field name=\"diffusion\"/>\n\t\t<field name=\"reflectionsDelay\"/>\n\t\t<field name=\"reflectionsLevel\"/>\n\t\t<field name=\"reverbDelay\"/>\n\t\t<field name=\"reverbLevel\"/>\n\t\t<field name=\"roomHFLevel\"/>\n\t\t<field name=\"roomLevel\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/Equalizer\" since=\"9\">\n\t\t<extends name=\"android/media/audiofx/AudioEffect\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"getBand(I)S\"/>\n\t\t<method name=\"getBandFreqRange(S)[I\"/>\n\t\t<method name=\"getBandLevel(S)S\"/>\n\t\t<method name=\"getBandLevelRange()[S\"/>\n\t\t<method name=\"getCenterFreq(S)I\"/>\n\t\t<method name=\"getCurrentPreset()S\"/>\n\t\t<method name=\"getNumberOfBands()S\"/>\n\t\t<method name=\"getNumberOfPresets()S\"/>\n\t\t<method name=\"getPresetName(S)Ljava/lang/String;\"/>\n\t\t<method name=\"getProperties()Landroid/media/audiofx/Equalizer$Settings;\"/>\n\t\t<method name=\"setBandLevel(SS)V\"/>\n\t\t<method name=\"setParameterListener(Landroid/media/audiofx/Equalizer$OnParameterChangeListener;)V\"/>\n\t\t<method name=\"setProperties(Landroid/media/audiofx/Equalizer$Settings;)V\"/>\n\t\t<method name=\"usePreset(S)V\"/>\n\t\t<field name=\"PARAM_BAND_FREQ_RANGE\"/>\n\t\t<field name=\"PARAM_BAND_LEVEL\"/>\n\t\t<field name=\"PARAM_CENTER_FREQ\"/>\n\t\t<field name=\"PARAM_CURRENT_PRESET\"/>\n\t\t<field name=\"PARAM_GET_BAND\"/>\n\t\t<field name=\"PARAM_GET_NUM_OF_PRESETS\"/>\n\t\t<field name=\"PARAM_GET_PRESET_NAME\"/>\n\t\t<field name=\"PARAM_LEVEL_RANGE\"/>\n\t\t<field name=\"PARAM_NUM_BANDS\"/>\n\t\t<field name=\"PARAM_STRING_SIZE_MAX\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/Equalizer$OnParameterChangeListener\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onParameterChange(Landroid/media/audiofx/Equalizer;IIII)V\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/Equalizer$Settings\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<field name=\"bandLevels\"/>\n\t\t<field name=\"curPreset\"/>\n\t\t<field name=\"numBands\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/LoudnessEnhancer\" since=\"19\">\n\t\t<extends name=\"android/media/audiofx/AudioEffect\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"getTargetGain()F\"/>\n\t\t<method name=\"setTargetGain(I)V\"/>\n\t\t<field name=\"PARAM_TARGET_GAIN_MB\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/NoiseSuppressor\" since=\"16\">\n\t\t<extends name=\"android/media/audiofx/AudioEffect\"/>\n\t\t<method name=\"create(I)Landroid/media/audiofx/NoiseSuppressor;\"/>\n\t\t<method name=\"isAvailable()Z\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/PresetReverb\" since=\"9\">\n\t\t<extends name=\"android/media/audiofx/AudioEffect\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"getPreset()S\"/>\n\t\t<method name=\"getProperties()Landroid/media/audiofx/PresetReverb$Settings;\"/>\n\t\t<method name=\"setParameterListener(Landroid/media/audiofx/PresetReverb$OnParameterChangeListener;)V\"/>\n\t\t<method name=\"setPreset(S)V\"/>\n\t\t<method name=\"setProperties(Landroid/media/audiofx/PresetReverb$Settings;)V\"/>\n\t\t<field name=\"PARAM_PRESET\"/>\n\t\t<field name=\"PRESET_LARGEHALL\"/>\n\t\t<field name=\"PRESET_LARGEROOM\"/>\n\t\t<field name=\"PRESET_MEDIUMHALL\"/>\n\t\t<field name=\"PRESET_MEDIUMROOM\"/>\n\t\t<field name=\"PRESET_NONE\"/>\n\t\t<field name=\"PRESET_PLATE\"/>\n\t\t<field name=\"PRESET_SMALLROOM\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/PresetReverb$OnParameterChangeListener\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onParameterChange(Landroid/media/audiofx/PresetReverb;IIS)V\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/PresetReverb$Settings\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<field name=\"preset\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/Virtualizer\" since=\"9\">\n\t\t<extends name=\"android/media/audiofx/AudioEffect\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"canVirtualize(II)Z\" since=\"21\"/>\n\t\t<method name=\"forceVirtualizationMode(I)Z\" since=\"21\"/>\n\t\t<method name=\"getProperties()Landroid/media/audiofx/Virtualizer$Settings;\"/>\n\t\t<method name=\"getRoundedStrength()S\"/>\n\t\t<method name=\"getSpeakerAngles(II[I)Z\" since=\"21\"/>\n\t\t<method name=\"getStrengthSupported()Z\"/>\n\t\t<method name=\"getVirtualizationMode()I\" since=\"21\"/>\n\t\t<method name=\"setParameterListener(Landroid/media/audiofx/Virtualizer$OnParameterChangeListener;)V\"/>\n\t\t<method name=\"setProperties(Landroid/media/audiofx/Virtualizer$Settings;)V\"/>\n\t\t<method name=\"setStrength(S)V\"/>\n\t\t<field name=\"PARAM_STRENGTH\"/>\n\t\t<field name=\"PARAM_STRENGTH_SUPPORTED\"/>\n\t\t<field name=\"VIRTUALIZATION_MODE_AUTO\" since=\"21\"/>\n\t\t<field name=\"VIRTUALIZATION_MODE_BINAURAL\" since=\"21\"/>\n\t\t<field name=\"VIRTUALIZATION_MODE_OFF\" since=\"21\"/>\n\t\t<field name=\"VIRTUALIZATION_MODE_TRANSAURAL\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/Virtualizer$OnParameterChangeListener\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onParameterChange(Landroid/media/audiofx/Virtualizer;IIS)V\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/Virtualizer$Settings\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<field name=\"strength\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/Visualizer\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"getCaptureSize()I\"/>\n\t\t<method name=\"getCaptureSizeRange()[I\"/>\n\t\t<method name=\"getEnabled()Z\"/>\n\t\t<method name=\"getFft([B)I\"/>\n\t\t<method name=\"getMaxCaptureRate()I\"/>\n\t\t<method name=\"getMeasurementMode()I\" since=\"19\"/>\n\t\t<method name=\"getMeasurementPeakRms(Landroid/media/audiofx/Visualizer$MeasurementPeakRms;)I\" since=\"19\"/>\n\t\t<method name=\"getSamplingRate()I\"/>\n\t\t<method name=\"getScalingMode()I\" since=\"16\"/>\n\t\t<method name=\"getWaveForm([B)I\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"setCaptureSize(I)I\"/>\n\t\t<method name=\"setDataCaptureListener(Landroid/media/audiofx/Visualizer$OnDataCaptureListener;IZZ)I\"/>\n\t\t<method name=\"setEnabled(Z)I\"/>\n\t\t<method name=\"setMeasurementMode(I)I\" since=\"19\"/>\n\t\t<method name=\"setScalingMode(I)I\" since=\"16\"/>\n\t\t<field name=\"ALREADY_EXISTS\"/>\n\t\t<field name=\"ERROR\"/>\n\t\t<field name=\"ERROR_BAD_VALUE\"/>\n\t\t<field name=\"ERROR_DEAD_OBJECT\"/>\n\t\t<field name=\"ERROR_INVALID_OPERATION\"/>\n\t\t<field name=\"ERROR_NO_INIT\"/>\n\t\t<field name=\"ERROR_NO_MEMORY\"/>\n\t\t<field name=\"MEASUREMENT_MODE_NONE\" since=\"19\"/>\n\t\t<field name=\"MEASUREMENT_MODE_PEAK_RMS\" since=\"19\"/>\n\t\t<field name=\"SCALING_MODE_AS_PLAYED\" since=\"16\"/>\n\t\t<field name=\"SCALING_MODE_NORMALIZED\" since=\"16\"/>\n\t\t<field name=\"STATE_ENABLED\"/>\n\t\t<field name=\"STATE_INITIALIZED\"/>\n\t\t<field name=\"STATE_UNINITIALIZED\"/>\n\t\t<field name=\"SUCCESS\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/Visualizer$MeasurementPeakRms\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"mPeak\"/>\n\t\t<field name=\"mRms\"/>\n\t</class>\n\t<class name=\"android/media/audiofx/Visualizer$OnDataCaptureListener\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onFftDataCapture(Landroid/media/audiofx/Visualizer;[BI)V\"/>\n\t\t<method name=\"onWaveFormDataCapture(Landroid/media/audiofx/Visualizer;[BI)V\"/>\n\t</class>\n\t<class name=\"android/media/browse/MediaBrowser\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/content/ComponentName;Landroid/media/browse/MediaBrowser$ConnectionCallback;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"connect()V\"/>\n\t\t<method name=\"disconnect()V\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getItem(Ljava/lang/String;Landroid/media/browse/MediaBrowser$ItemCallback;)V\" since=\"23\"/>\n\t\t<method name=\"getRoot()Ljava/lang/String;\"/>\n\t\t<method name=\"getServiceComponent()Landroid/content/ComponentName;\"/>\n\t\t<method name=\"getSessionToken()Landroid/media/session/MediaSession$Token;\"/>\n\t\t<method name=\"isConnected()Z\"/>\n\t\t<method name=\"subscribe(Ljava/lang/String;Landroid/media/browse/MediaBrowser$SubscriptionCallback;)V\"/>\n\t\t<method name=\"subscribe(Ljava/lang/String;Landroid/os/Bundle;Landroid/media/browse/MediaBrowser$SubscriptionCallback;)V\" since=\"24\"/>\n\t\t<method name=\"unsubscribe(Ljava/lang/String;)V\"/>\n\t\t<method name=\"unsubscribe(Ljava/lang/String;Landroid/media/browse/MediaBrowser$SubscriptionCallback;)V\" since=\"24\"/>\n\t\t<field name=\"EXTRA_PAGE\" since=\"24\"/>\n\t\t<field name=\"EXTRA_PAGE_SIZE\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/media/browse/MediaBrowser$ConnectionCallback\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onConnected()V\"/>\n\t\t<method name=\"onConnectionFailed()V\"/>\n\t\t<method name=\"onConnectionSuspended()V\"/>\n\t</class>\n\t<class name=\"android/media/browse/MediaBrowser$ItemCallback\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onError(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onItemLoaded(Landroid/media/browse/MediaBrowser$MediaItem;)V\"/>\n\t</class>\n\t<class name=\"android/media/browse/MediaBrowser$MediaItem\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/media/MediaDescription;I)V\"/>\n\t\t<method name=\"getDescription()Landroid/media/MediaDescription;\"/>\n\t\t<method name=\"getFlags()I\"/>\n\t\t<method name=\"getMediaId()Ljava/lang/String;\"/>\n\t\t<method name=\"isBrowsable()Z\"/>\n\t\t<method name=\"isPlayable()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FLAG_BROWSABLE\"/>\n\t\t<field name=\"FLAG_PLAYABLE\"/>\n\t</class>\n\t<class name=\"android/media/browse/MediaBrowser$SubscriptionCallback\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onChildrenLoaded(Ljava/lang/String;Ljava/util/List;)V\"/>\n\t\t<method name=\"onChildrenLoaded(Ljava/lang/String;Ljava/util/List;Landroid/os/Bundle;)V\" since=\"24\"/>\n\t\t<method name=\"onError(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onError(Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/media/effect/Effect\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"apply(IIII)V\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"setParameter(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"setUpdateListener(Landroid/media/effect/EffectUpdateListener;)V\"/>\n\t</class>\n\t<class name=\"android/media/effect/EffectContext\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createWithCurrentGlContext()Landroid/media/effect/EffectContext;\"/>\n\t\t<method name=\"getFactory()Landroid/media/effect/EffectFactory;\"/>\n\t\t<method name=\"release()V\"/>\n\t</class>\n\t<class name=\"android/media/effect/EffectFactory\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createEffect(Ljava/lang/String;)Landroid/media/effect/Effect;\"/>\n\t\t<method name=\"isEffectSupported(Ljava/lang/String;)Z\"/>\n\t\t<field name=\"EFFECT_AUTOFIX\"/>\n\t\t<field name=\"EFFECT_BACKDROPPER\"/>\n\t\t<field name=\"EFFECT_BITMAPOVERLAY\"/>\n\t\t<field name=\"EFFECT_BLACKWHITE\"/>\n\t\t<field name=\"EFFECT_BRIGHTNESS\"/>\n\t\t<field name=\"EFFECT_CONTRAST\"/>\n\t\t<field name=\"EFFECT_CROP\"/>\n\t\t<field name=\"EFFECT_CROSSPROCESS\"/>\n\t\t<field name=\"EFFECT_DOCUMENTARY\"/>\n\t\t<field name=\"EFFECT_DUOTONE\"/>\n\t\t<field name=\"EFFECT_FILLLIGHT\"/>\n\t\t<field name=\"EFFECT_FISHEYE\"/>\n\t\t<field name=\"EFFECT_FLIP\"/>\n\t\t<field name=\"EFFECT_GRAIN\"/>\n\t\t<field name=\"EFFECT_GRAYSCALE\"/>\n\t\t<field name=\"EFFECT_LOMOISH\"/>\n\t\t<field name=\"EFFECT_NEGATIVE\"/>\n\t\t<field name=\"EFFECT_POSTERIZE\"/>\n\t\t<field name=\"EFFECT_REDEYE\"/>\n\t\t<field name=\"EFFECT_ROTATE\"/>\n\t\t<field name=\"EFFECT_SATURATE\"/>\n\t\t<field name=\"EFFECT_SEPIA\"/>\n\t\t<field name=\"EFFECT_SHARPEN\"/>\n\t\t<field name=\"EFFECT_STRAIGHTEN\"/>\n\t\t<field name=\"EFFECT_TEMPERATURE\"/>\n\t\t<field name=\"EFFECT_TINT\"/>\n\t\t<field name=\"EFFECT_VIGNETTE\"/>\n\t</class>\n\t<class name=\"android/media/effect/EffectUpdateListener\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onEffectUpdated(Landroid/media/effect/Effect;Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"android/media/midi/MidiDevice\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<method name=\"connectPorts(Landroid/media/midi/MidiInputPort;I)Landroid/media/midi/MidiDevice$MidiConnection;\"/>\n\t\t<method name=\"getInfo()Landroid/media/midi/MidiDeviceInfo;\"/>\n\t\t<method name=\"openInputPort(I)Landroid/media/midi/MidiInputPort;\"/>\n\t\t<method name=\"openOutputPort(I)Landroid/media/midi/MidiOutputPort;\"/>\n\t</class>\n\t<class name=\"android/media/midi/MidiDevice$MidiConnection\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t</class>\n\t<class name=\"android/media/midi/MidiDeviceInfo\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getId()I\"/>\n\t\t<method name=\"getInputPortCount()I\"/>\n\t\t<method name=\"getOutputPortCount()I\"/>\n\t\t<method name=\"getPorts()[Landroid/media/midi/MidiDeviceInfo$PortInfo;\"/>\n\t\t<method name=\"getProperties()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<method name=\"isPrivate()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"PROPERTY_BLUETOOTH_DEVICE\"/>\n\t\t<field name=\"PROPERTY_MANUFACTURER\"/>\n\t\t<field name=\"PROPERTY_NAME\"/>\n\t\t<field name=\"PROPERTY_PRODUCT\"/>\n\t\t<field name=\"PROPERTY_SERIAL_NUMBER\"/>\n\t\t<field name=\"PROPERTY_USB_DEVICE\"/>\n\t\t<field name=\"PROPERTY_VERSION\"/>\n\t\t<field name=\"TYPE_BLUETOOTH\"/>\n\t\t<field name=\"TYPE_USB\"/>\n\t\t<field name=\"TYPE_VIRTUAL\"/>\n\t</class>\n\t<class name=\"android/media/midi/MidiDeviceInfo$PortInfo\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getPortNumber()I\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<field name=\"TYPE_INPUT\"/>\n\t\t<field name=\"TYPE_OUTPUT\"/>\n\t</class>\n\t<class name=\"android/media/midi/MidiDeviceService\" since=\"23\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getDeviceInfo()Landroid/media/midi/MidiDeviceInfo;\"/>\n\t\t<method name=\"getOutputPortReceivers()[Landroid/media/midi/MidiReceiver;\"/>\n\t\t<method name=\"onClose()V\"/>\n\t\t<method name=\"onDeviceStatusChanged(Landroid/media/midi/MidiDeviceStatus;)V\"/>\n\t\t<method name=\"onGetInputPortReceivers()[Landroid/media/midi/MidiReceiver;\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t</class>\n\t<class name=\"android/media/midi/MidiDeviceStatus\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getDeviceInfo()Landroid/media/midi/MidiDeviceInfo;\"/>\n\t\t<method name=\"getOutputPortOpenCount(I)I\"/>\n\t\t<method name=\"isInputPortOpen(I)Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/media/midi/MidiInputPort\" since=\"23\">\n\t\t<extends name=\"android/media/midi/MidiReceiver\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<method name=\"getPortNumber()I\"/>\n\t</class>\n\t<class name=\"android/media/midi/MidiManager\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getDevices()[Landroid/media/midi/MidiDeviceInfo;\"/>\n\t\t<method name=\"openBluetoothDevice(Landroid/bluetooth/BluetoothDevice;Landroid/media/midi/MidiManager$OnDeviceOpenedListener;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"openDevice(Landroid/media/midi/MidiDeviceInfo;Landroid/media/midi/MidiManager$OnDeviceOpenedListener;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"registerDeviceCallback(Landroid/media/midi/MidiManager$DeviceCallback;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"unregisterDeviceCallback(Landroid/media/midi/MidiManager$DeviceCallback;)V\"/>\n\t</class>\n\t<class name=\"android/media/midi/MidiManager$DeviceCallback\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onDeviceAdded(Landroid/media/midi/MidiDeviceInfo;)V\"/>\n\t\t<method name=\"onDeviceRemoved(Landroid/media/midi/MidiDeviceInfo;)V\"/>\n\t\t<method name=\"onDeviceStatusChanged(Landroid/media/midi/MidiDeviceStatus;)V\"/>\n\t</class>\n\t<class name=\"android/media/midi/MidiManager$OnDeviceOpenedListener\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDeviceOpened(Landroid/media/midi/MidiDevice;)V\"/>\n\t</class>\n\t<class name=\"android/media/midi/MidiOutputPort\" since=\"23\">\n\t\t<extends name=\"android/media/midi/MidiSender\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<method name=\"getPortNumber()I\"/>\n\t</class>\n\t<class name=\"android/media/midi/MidiReceiver\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"flush()V\"/>\n\t\t<method name=\"getMaxMessageSize()I\"/>\n\t\t<method name=\"onFlush()V\"/>\n\t\t<method name=\"onSend([BIIJ)V\"/>\n\t\t<method name=\"send([BII)V\"/>\n\t\t<method name=\"send([BIIJ)V\"/>\n\t</class>\n\t<class name=\"android/media/midi/MidiSender\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"connect(Landroid/media/midi/MidiReceiver;)V\"/>\n\t\t<method name=\"disconnect(Landroid/media/midi/MidiReceiver;)V\"/>\n\t\t<method name=\"onConnect(Landroid/media/midi/MidiReceiver;)V\"/>\n\t\t<method name=\"onDisconnect(Landroid/media/midi/MidiReceiver;)V\"/>\n\t</class>\n\t<class name=\"android/media/projection/MediaProjection\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createVirtualDisplay(Ljava/lang/String;IIIILandroid/view/Surface;Landroid/hardware/display/VirtualDisplay$Callback;Landroid/os/Handler;)Landroid/hardware/display/VirtualDisplay;\"/>\n\t\t<method name=\"registerCallback(Landroid/media/projection/MediaProjection$Callback;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"stop()V\"/>\n\t\t<method name=\"unregisterCallback(Landroid/media/projection/MediaProjection$Callback;)V\"/>\n\t</class>\n\t<class name=\"android/media/projection/MediaProjection$Callback\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onStop()V\"/>\n\t</class>\n\t<class name=\"android/media/projection/MediaProjectionManager\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createScreenCaptureIntent()Landroid/content/Intent;\"/>\n\t\t<method name=\"getMediaProjection(ILandroid/content/Intent;)Landroid/media/projection/MediaProjection;\"/>\n\t</class>\n\t<class name=\"android/media/session/MediaController\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/media/session/MediaSession$Token;)V\"/>\n\t\t<method name=\"adjustVolume(II)V\"/>\n\t\t<method name=\"dispatchMediaButtonEvent(Landroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getFlags()J\"/>\n\t\t<method name=\"getMetadata()Landroid/media/MediaMetadata;\"/>\n\t\t<method name=\"getPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getPlaybackInfo()Landroid/media/session/MediaController$PlaybackInfo;\"/>\n\t\t<method name=\"getPlaybackState()Landroid/media/session/PlaybackState;\"/>\n\t\t<method name=\"getQueue()Ljava/util/List;\"/>\n\t\t<method name=\"getQueueTitle()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getRatingType()I\"/>\n\t\t<method name=\"getSessionActivity()Landroid/app/PendingIntent;\"/>\n\t\t<method name=\"getSessionInfo()Landroid/os/Bundle;\" since=\"29\"/>\n\t\t<method name=\"getSessionToken()Landroid/media/session/MediaSession$Token;\"/>\n\t\t<method name=\"getTransportControls()Landroid/media/session/MediaController$TransportControls;\"/>\n\t\t<method name=\"registerCallback(Landroid/media/session/MediaController$Callback;)V\"/>\n\t\t<method name=\"registerCallback(Landroid/media/session/MediaController$Callback;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"sendCommand(Ljava/lang/String;Landroid/os/Bundle;Landroid/os/ResultReceiver;)V\"/>\n\t\t<method name=\"setVolumeTo(II)V\"/>\n\t\t<method name=\"unregisterCallback(Landroid/media/session/MediaController$Callback;)V\"/>\n\t</class>\n\t<class name=\"android/media/session/MediaController$Callback\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onAudioInfoChanged(Landroid/media/session/MediaController$PlaybackInfo;)V\"/>\n\t\t<method name=\"onExtrasChanged(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onMetadataChanged(Landroid/media/MediaMetadata;)V\"/>\n\t\t<method name=\"onPlaybackStateChanged(Landroid/media/session/PlaybackState;)V\"/>\n\t\t<method name=\"onQueueChanged(Ljava/util/List;)V\"/>\n\t\t<method name=\"onQueueTitleChanged(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"onSessionDestroyed()V\"/>\n\t\t<method name=\"onSessionEvent(Ljava/lang/String;Landroid/os/Bundle;)V\"/>\n\t</class>\n\t<class name=\"android/media/session/MediaController$PlaybackInfo\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\" since=\"29\"/>\n\t\t<method name=\"getAudioAttributes()Landroid/media/AudioAttributes;\"/>\n\t\t<method name=\"getCurrentVolume()I\"/>\n\t\t<method name=\"getMaxVolume()I\"/>\n\t\t<method name=\"getPlaybackType()I\"/>\n\t\t<method name=\"getVolumeControl()I\"/>\n\t\t<field name=\"CREATOR\" since=\"29\"/>\n\t\t<field name=\"PLAYBACK_TYPE_LOCAL\"/>\n\t\t<field name=\"PLAYBACK_TYPE_REMOTE\"/>\n\t</class>\n\t<class name=\"android/media/session/MediaController$TransportControls\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"fastForward()V\"/>\n\t\t<method name=\"pause()V\"/>\n\t\t<method name=\"play()V\"/>\n\t\t<method name=\"playFromMediaId(Ljava/lang/String;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"playFromSearch(Ljava/lang/String;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"playFromUri(Landroid/net/Uri;Landroid/os/Bundle;)V\" since=\"23\"/>\n\t\t<method name=\"prepare()V\" since=\"24\"/>\n\t\t<method name=\"prepareFromMediaId(Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"24\"/>\n\t\t<method name=\"prepareFromSearch(Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"24\"/>\n\t\t<method name=\"prepareFromUri(Landroid/net/Uri;Landroid/os/Bundle;)V\" since=\"24\"/>\n\t\t<method name=\"rewind()V\"/>\n\t\t<method name=\"seekTo(J)V\"/>\n\t\t<method name=\"sendCustomAction(Landroid/media/session/PlaybackState$CustomAction;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"sendCustomAction(Ljava/lang/String;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"setPlaybackSpeed(F)V\" since=\"29\"/>\n\t\t<method name=\"setRating(Landroid/media/Rating;)V\"/>\n\t\t<method name=\"skipToNext()V\"/>\n\t\t<method name=\"skipToPrevious()V\"/>\n\t\t<method name=\"skipToQueueItem(J)V\"/>\n\t\t<method name=\"stop()V\"/>\n\t</class>\n\t<class name=\"android/media/session/MediaSession\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"29\"/>\n\t\t<method name=\"getController()Landroid/media/session/MediaController;\"/>\n\t\t<method name=\"getCurrentControllerInfo()Landroid/media/session/MediaSessionManager$RemoteUserInfo;\" since=\"28\"/>\n\t\t<method name=\"getSessionToken()Landroid/media/session/MediaSession$Token;\"/>\n\t\t<method name=\"isActive()Z\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"sendSessionEvent(Ljava/lang/String;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"setActive(Z)V\"/>\n\t\t<method name=\"setCallback(Landroid/media/session/MediaSession$Callback;)V\"/>\n\t\t<method name=\"setCallback(Landroid/media/session/MediaSession$Callback;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"setFlags(I)V\"/>\n\t\t<method name=\"setMediaButtonReceiver(Landroid/app/PendingIntent;)V\"/>\n\t\t<method name=\"setMetadata(Landroid/media/MediaMetadata;)V\"/>\n\t\t<method name=\"setPlaybackState(Landroid/media/session/PlaybackState;)V\"/>\n\t\t<method name=\"setPlaybackToLocal(Landroid/media/AudioAttributes;)V\"/>\n\t\t<method name=\"setPlaybackToRemote(Landroid/media/VolumeProvider;)V\"/>\n\t\t<method name=\"setQueue(Ljava/util/List;)V\"/>\n\t\t<method name=\"setQueueTitle(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setRatingType(I)V\" since=\"22\"/>\n\t\t<method name=\"setSessionActivity(Landroid/app/PendingIntent;)V\"/>\n\t\t<field name=\"FLAG_HANDLES_MEDIA_BUTTONS\" deprecated=\"26\"/>\n\t\t<field name=\"FLAG_HANDLES_TRANSPORT_CONTROLS\" deprecated=\"26\"/>\n\t</class>\n\t<class name=\"android/media/session/MediaSession$Callback\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCommand(Ljava/lang/String;Landroid/os/Bundle;Landroid/os/ResultReceiver;)V\"/>\n\t\t<method name=\"onCustomAction(Ljava/lang/String;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onFastForward()V\"/>\n\t\t<method name=\"onMediaButtonEvent(Landroid/content/Intent;)Z\"/>\n\t\t<method name=\"onPause()V\"/>\n\t\t<method name=\"onPlay()V\"/>\n\t\t<method name=\"onPlayFromMediaId(Ljava/lang/String;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onPlayFromSearch(Ljava/lang/String;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onPlayFromUri(Landroid/net/Uri;Landroid/os/Bundle;)V\" since=\"23\"/>\n\t\t<method name=\"onPrepare()V\" since=\"24\"/>\n\t\t<method name=\"onPrepareFromMediaId(Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"24\"/>\n\t\t<method name=\"onPrepareFromSearch(Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"24\"/>\n\t\t<method name=\"onPrepareFromUri(Landroid/net/Uri;Landroid/os/Bundle;)V\" since=\"24\"/>\n\t\t<method name=\"onRewind()V\"/>\n\t\t<method name=\"onSeekTo(J)V\"/>\n\t\t<method name=\"onSetPlaybackSpeed(F)V\" since=\"29\"/>\n\t\t<method name=\"onSetRating(Landroid/media/Rating;)V\"/>\n\t\t<method name=\"onSkipToNext()V\"/>\n\t\t<method name=\"onSkipToPrevious()V\"/>\n\t\t<method name=\"onSkipToQueueItem(J)V\"/>\n\t\t<method name=\"onStop()V\"/>\n\t</class>\n\t<class name=\"android/media/session/MediaSession$QueueItem\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/media/MediaDescription;J)V\"/>\n\t\t<method name=\"getDescription()Landroid/media/MediaDescription;\"/>\n\t\t<method name=\"getQueueId()J\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"UNKNOWN_ID\"/>\n\t</class>\n\t<class name=\"android/media/session/MediaSession$Token\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/media/session/MediaSessionManager\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addOnActiveSessionsChangedListener(Landroid/media/session/MediaSessionManager$OnActiveSessionsChangedListener;Landroid/content/ComponentName;)V\"/>\n\t\t<method name=\"addOnActiveSessionsChangedListener(Landroid/media/session/MediaSessionManager$OnActiveSessionsChangedListener;Landroid/content/ComponentName;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"addOnSession2TokensChangedListener(Landroid/media/session/MediaSessionManager$OnSession2TokensChangedListener;)V\" since=\"29\"/>\n\t\t<method name=\"addOnSession2TokensChangedListener(Landroid/media/session/MediaSessionManager$OnSession2TokensChangedListener;Landroid/os/Handler;)V\" since=\"29\"/>\n\t\t<method name=\"getActiveSessions(Landroid/content/ComponentName;)Ljava/util/List;\"/>\n\t\t<method name=\"getSession2Tokens()Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"isTrustedForMediaControl(Landroid/media/session/MediaSessionManager$RemoteUserInfo;)Z\" since=\"28\"/>\n\t\t<method name=\"notifySession2Created(Landroid/media/Session2Token;)V\" since=\"29\"/>\n\t\t<method name=\"removeOnActiveSessionsChangedListener(Landroid/media/session/MediaSessionManager$OnActiveSessionsChangedListener;)V\"/>\n\t\t<method name=\"removeOnSession2TokensChangedListener(Landroid/media/session/MediaSessionManager$OnSession2TokensChangedListener;)V\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/media/session/MediaSessionManager$OnActiveSessionsChangedListener\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onActiveSessionsChanged(Ljava/util/List;)V\"/>\n\t</class>\n\t<class name=\"android/media/session/MediaSessionManager$OnSession2TokensChangedListener\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onSession2TokensChanged(Ljava/util/List;)V\"/>\n\t</class>\n\t<class name=\"android/media/session/MediaSessionManager$RemoteUserInfo\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;II)V\"/>\n\t\t<method name=\"getPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getPid()I\"/>\n\t\t<method name=\"getUid()I\"/>\n\t</class>\n\t<class name=\"android/media/session/PlaybackState\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getActions()J\"/>\n\t\t<method name=\"getActiveQueueItemId()J\"/>\n\t\t<method name=\"getBufferedPosition()J\"/>\n\t\t<method name=\"getCustomActions()Ljava/util/List;\"/>\n\t\t<method name=\"getErrorMessage()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\" since=\"22\"/>\n\t\t<method name=\"getLastPositionUpdateTime()J\"/>\n\t\t<method name=\"getPlaybackSpeed()F\"/>\n\t\t<method name=\"getPosition()J\"/>\n\t\t<method name=\"getState()I\"/>\n\t\t<field name=\"ACTION_FAST_FORWARD\"/>\n\t\t<field name=\"ACTION_PAUSE\"/>\n\t\t<field name=\"ACTION_PLAY\"/>\n\t\t<field name=\"ACTION_PLAY_FROM_MEDIA_ID\"/>\n\t\t<field name=\"ACTION_PLAY_FROM_SEARCH\"/>\n\t\t<field name=\"ACTION_PLAY_FROM_URI\" since=\"23\"/>\n\t\t<field name=\"ACTION_PLAY_PAUSE\"/>\n\t\t<field name=\"ACTION_PREPARE\" since=\"24\"/>\n\t\t<field name=\"ACTION_PREPARE_FROM_MEDIA_ID\" since=\"24\"/>\n\t\t<field name=\"ACTION_PREPARE_FROM_SEARCH\" since=\"24\"/>\n\t\t<field name=\"ACTION_PREPARE_FROM_URI\" since=\"24\"/>\n\t\t<field name=\"ACTION_REWIND\"/>\n\t\t<field name=\"ACTION_SEEK_TO\"/>\n\t\t<field name=\"ACTION_SET_RATING\"/>\n\t\t<field name=\"ACTION_SKIP_TO_NEXT\"/>\n\t\t<field name=\"ACTION_SKIP_TO_PREVIOUS\"/>\n\t\t<field name=\"ACTION_SKIP_TO_QUEUE_ITEM\"/>\n\t\t<field name=\"ACTION_STOP\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"PLAYBACK_POSITION_UNKNOWN\"/>\n\t\t<field name=\"STATE_BUFFERING\"/>\n\t\t<field name=\"STATE_CONNECTING\"/>\n\t\t<field name=\"STATE_ERROR\"/>\n\t\t<field name=\"STATE_FAST_FORWARDING\"/>\n\t\t<field name=\"STATE_NONE\"/>\n\t\t<field name=\"STATE_PAUSED\"/>\n\t\t<field name=\"STATE_PLAYING\"/>\n\t\t<field name=\"STATE_REWINDING\"/>\n\t\t<field name=\"STATE_SKIPPING_TO_NEXT\"/>\n\t\t<field name=\"STATE_SKIPPING_TO_PREVIOUS\"/>\n\t\t<field name=\"STATE_SKIPPING_TO_QUEUE_ITEM\"/>\n\t\t<field name=\"STATE_STOPPED\"/>\n\t</class>\n\t<class name=\"android/media/session/PlaybackState$Builder\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/media/session/PlaybackState;)V\"/>\n\t\t<method name=\"addCustomAction(Landroid/media/session/PlaybackState$CustomAction;)Landroid/media/session/PlaybackState$Builder;\"/>\n\t\t<method name=\"addCustomAction(Ljava/lang/String;Ljava/lang/String;I)Landroid/media/session/PlaybackState$Builder;\"/>\n\t\t<method name=\"build()Landroid/media/session/PlaybackState;\"/>\n\t\t<method name=\"setActions(J)Landroid/media/session/PlaybackState$Builder;\"/>\n\t\t<method name=\"setActiveQueueItemId(J)Landroid/media/session/PlaybackState$Builder;\"/>\n\t\t<method name=\"setBufferedPosition(J)Landroid/media/session/PlaybackState$Builder;\"/>\n\t\t<method name=\"setErrorMessage(Ljava/lang/CharSequence;)Landroid/media/session/PlaybackState$Builder;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/media/session/PlaybackState$Builder;\" since=\"22\"/>\n\t\t<method name=\"setState(IJF)Landroid/media/session/PlaybackState$Builder;\"/>\n\t\t<method name=\"setState(IJFJ)Landroid/media/session/PlaybackState$Builder;\"/>\n\t</class>\n\t<class name=\"android/media/session/PlaybackState$CustomAction\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getAction()Ljava/lang/String;\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getIcon()I\"/>\n\t\t<method name=\"getName()Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/media/session/PlaybackState$CustomAction$Builder\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/CharSequence;I)V\"/>\n\t\t<method name=\"build()Landroid/media/session/PlaybackState$CustomAction;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/media/session/PlaybackState$CustomAction$Builder;\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvContentRating\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"contains(Landroid/media/tv/TvContentRating;)Z\" since=\"24\"/>\n\t\t<method name=\"createRating(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Landroid/media/tv/TvContentRating;\"/>\n\t\t<method name=\"flattenToString()Ljava/lang/String;\"/>\n\t\t<method name=\"getDomain()Ljava/lang/String;\"/>\n\t\t<method name=\"getMainRating()Ljava/lang/String;\"/>\n\t\t<method name=\"getRatingSystem()Ljava/lang/String;\"/>\n\t\t<method name=\"getSubRatings()Ljava/util/List;\"/>\n\t\t<method name=\"unflattenFromString(Ljava/lang/String;)Landroid/media/tv/TvContentRating;\"/>\n\t\t<field name=\"UNRATED\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvContract\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"buildChannelLogoUri(J)Landroid/net/Uri;\"/>\n\t\t<method name=\"buildChannelLogoUri(Landroid/net/Uri;)Landroid/net/Uri;\"/>\n\t\t<method name=\"buildChannelUri(J)Landroid/net/Uri;\"/>\n\t\t<method name=\"buildChannelUriForPassthroughInput(Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<method name=\"buildChannelsUriForInput(Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<method name=\"buildInputId(Landroid/content/ComponentName;)Ljava/lang/String;\"/>\n\t\t<method name=\"buildPreviewProgramUri(J)Landroid/net/Uri;\" since=\"26\"/>\n\t\t<method name=\"buildPreviewProgramsUriForChannel(J)Landroid/net/Uri;\" since=\"26\"/>\n\t\t<method name=\"buildPreviewProgramsUriForChannel(Landroid/net/Uri;)Landroid/net/Uri;\" since=\"26\"/>\n\t\t<method name=\"buildProgramUri(J)Landroid/net/Uri;\"/>\n\t\t<method name=\"buildProgramsUriForChannel(J)Landroid/net/Uri;\"/>\n\t\t<method name=\"buildProgramsUriForChannel(JJJ)Landroid/net/Uri;\"/>\n\t\t<method name=\"buildProgramsUriForChannel(Landroid/net/Uri;)Landroid/net/Uri;\"/>\n\t\t<method name=\"buildProgramsUriForChannel(Landroid/net/Uri;JJ)Landroid/net/Uri;\"/>\n\t\t<method name=\"buildRecordedProgramUri(J)Landroid/net/Uri;\" since=\"24\"/>\n\t\t<method name=\"buildWatchNextProgramUri(J)Landroid/net/Uri;\" since=\"26\"/>\n\t\t<method name=\"isChannelUri(Landroid/net/Uri;)Z\" since=\"24\"/>\n\t\t<method name=\"isChannelUriForPassthroughInput(Landroid/net/Uri;)Z\" since=\"24\"/>\n\t\t<method name=\"isChannelUriForTunerInput(Landroid/net/Uri;)Z\" since=\"24\"/>\n\t\t<method name=\"isProgramUri(Landroid/net/Uri;)Z\" since=\"24\"/>\n\t\t<method name=\"isRecordedProgramUri(Landroid/net/Uri;)Z\" since=\"27\"/>\n\t\t<method name=\"requestChannelBrowsable(Landroid/content/Context;J)V\" since=\"26\"/>\n\t\t<field name=\"ACTION_INITIALIZE_PROGRAMS\" since=\"26\"/>\n\t\t<field name=\"ACTION_PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT\" since=\"26\"/>\n\t\t<field name=\"ACTION_PREVIEW_PROGRAM_BROWSABLE_DISABLED\" since=\"26\"/>\n\t\t<field name=\"ACTION_REQUEST_CHANNEL_BROWSABLE\" since=\"26\"/>\n\t\t<field name=\"ACTION_WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED\" since=\"26\"/>\n\t\t<field name=\"AUTHORITY\"/>\n\t\t<field name=\"EXTRA_CHANNEL_ID\" since=\"26\"/>\n\t\t<field name=\"EXTRA_PREVIEW_PROGRAM_ID\" since=\"26\"/>\n\t\t<field name=\"EXTRA_WATCH_NEXT_PROGRAM_ID\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvContract$BaseTvColumns\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<field name=\"COLUMN_PACKAGE_NAME\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvContract$Channels\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/media/tv/TvContract$BaseTvColumns\"/>\n\t\t<method name=\"getVideoResolution(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<field name=\"COLUMN_APP_LINK_COLOR\" since=\"23\"/>\n\t\t<field name=\"COLUMN_APP_LINK_ICON_URI\" since=\"23\"/>\n\t\t<field name=\"COLUMN_APP_LINK_INTENT_URI\" since=\"23\"/>\n\t\t<field name=\"COLUMN_APP_LINK_POSTER_ART_URI\" since=\"23\"/>\n\t\t<field name=\"COLUMN_APP_LINK_TEXT\" since=\"23\"/>\n\t\t<field name=\"COLUMN_BROWSABLE\" since=\"26\"/>\n\t\t<field name=\"COLUMN_DESCRIPTION\"/>\n\t\t<field name=\"COLUMN_DISPLAY_NAME\"/>\n\t\t<field name=\"COLUMN_DISPLAY_NUMBER\"/>\n\t\t<field name=\"COLUMN_GLOBAL_CONTENT_ID\" since=\"30\"/>\n\t\t<field name=\"COLUMN_INPUT_ID\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_DATA\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_FLAG1\" since=\"23\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_FLAG2\" since=\"23\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_FLAG3\" since=\"23\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_FLAG4\" since=\"23\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_ID\" since=\"26\"/>\n\t\t<field name=\"COLUMN_LOCKED\" since=\"26\"/>\n\t\t<field name=\"COLUMN_NETWORK_AFFILIATION\"/>\n\t\t<field name=\"COLUMN_ORIGINAL_NETWORK_ID\"/>\n\t\t<field name=\"COLUMN_SEARCHABLE\"/>\n\t\t<field name=\"COLUMN_SERVICE_ID\"/>\n\t\t<field name=\"COLUMN_SERVICE_TYPE\"/>\n\t\t<field name=\"COLUMN_TRANSIENT\" since=\"26\"/>\n\t\t<field name=\"COLUMN_TRANSPORT_STREAM_ID\"/>\n\t\t<field name=\"COLUMN_TYPE\"/>\n\t\t<field name=\"COLUMN_VERSION_NUMBER\"/>\n\t\t<field name=\"COLUMN_VIDEO_FORMAT\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"SERVICE_TYPE_AUDIO\"/>\n\t\t<field name=\"SERVICE_TYPE_AUDIO_VIDEO\"/>\n\t\t<field name=\"SERVICE_TYPE_OTHER\"/>\n\t\t<field name=\"TYPE_1SEG\"/>\n\t\t<field name=\"TYPE_ATSC3_T\" since=\"30\"/>\n\t\t<field name=\"TYPE_ATSC_C\"/>\n\t\t<field name=\"TYPE_ATSC_M_H\"/>\n\t\t<field name=\"TYPE_ATSC_T\"/>\n\t\t<field name=\"TYPE_CMMB\"/>\n\t\t<field name=\"TYPE_DTMB\"/>\n\t\t<field name=\"TYPE_DVB_C\"/>\n\t\t<field name=\"TYPE_DVB_C2\"/>\n\t\t<field name=\"TYPE_DVB_H\"/>\n\t\t<field name=\"TYPE_DVB_S\"/>\n\t\t<field name=\"TYPE_DVB_S2\"/>\n\t\t<field name=\"TYPE_DVB_SH\"/>\n\t\t<field name=\"TYPE_DVB_T\"/>\n\t\t<field name=\"TYPE_DVB_T2\"/>\n\t\t<field name=\"TYPE_ISDB_C\"/>\n\t\t<field name=\"TYPE_ISDB_S\"/>\n\t\t<field name=\"TYPE_ISDB_S3\" since=\"29\"/>\n\t\t<field name=\"TYPE_ISDB_T\"/>\n\t\t<field name=\"TYPE_ISDB_TB\"/>\n\t\t<field name=\"TYPE_NTSC\"/>\n\t\t<field name=\"TYPE_OTHER\"/>\n\t\t<field name=\"TYPE_PAL\"/>\n\t\t<field name=\"TYPE_PREVIEW\" since=\"26\"/>\n\t\t<field name=\"TYPE_SECAM\"/>\n\t\t<field name=\"TYPE_S_DMB\"/>\n\t\t<field name=\"TYPE_T_DMB\"/>\n\t\t<field name=\"VIDEO_FORMAT_1080I\"/>\n\t\t<field name=\"VIDEO_FORMAT_1080P\"/>\n\t\t<field name=\"VIDEO_FORMAT_2160P\"/>\n\t\t<field name=\"VIDEO_FORMAT_240P\"/>\n\t\t<field name=\"VIDEO_FORMAT_360P\"/>\n\t\t<field name=\"VIDEO_FORMAT_4320P\"/>\n\t\t<field name=\"VIDEO_FORMAT_480I\"/>\n\t\t<field name=\"VIDEO_FORMAT_480P\"/>\n\t\t<field name=\"VIDEO_FORMAT_576I\"/>\n\t\t<field name=\"VIDEO_FORMAT_576P\"/>\n\t\t<field name=\"VIDEO_FORMAT_720P\"/>\n\t\t<field name=\"VIDEO_RESOLUTION_ED\"/>\n\t\t<field name=\"VIDEO_RESOLUTION_FHD\"/>\n\t\t<field name=\"VIDEO_RESOLUTION_HD\"/>\n\t\t<field name=\"VIDEO_RESOLUTION_SD\"/>\n\t\t<field name=\"VIDEO_RESOLUTION_UHD\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvContract$Channels$Logo\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvContract$PreviewPrograms\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/media/tv/TvContract$BaseTvColumns\"/>\n\t\t<field name=\"ASPECT_RATIO_16_9\"/>\n\t\t<field name=\"ASPECT_RATIO_1_1\"/>\n\t\t<field name=\"ASPECT_RATIO_2_3\"/>\n\t\t<field name=\"ASPECT_RATIO_3_2\"/>\n\t\t<field name=\"ASPECT_RATIO_4_3\"/>\n\t\t<field name=\"AVAILABILITY_AVAILABLE\"/>\n\t\t<field name=\"AVAILABILITY_FREE_WITH_SUBSCRIPTION\"/>\n\t\t<field name=\"AVAILABILITY_PAID_CONTENT\"/>\n\t\t<field name=\"COLUMN_AUDIO_LANGUAGE\"/>\n\t\t<field name=\"COLUMN_AUTHOR\"/>\n\t\t<field name=\"COLUMN_AVAILABILITY\"/>\n\t\t<field name=\"COLUMN_BROWSABLE\"/>\n\t\t<field name=\"COLUMN_CANONICAL_GENRE\"/>\n\t\t<field name=\"COLUMN_CHANNEL_ID\"/>\n\t\t<field name=\"COLUMN_CONTENT_ID\"/>\n\t\t<field name=\"COLUMN_CONTENT_RATING\"/>\n\t\t<field name=\"COLUMN_DURATION_MILLIS\"/>\n\t\t<field name=\"COLUMN_EPISODE_DISPLAY_NUMBER\"/>\n\t\t<field name=\"COLUMN_EPISODE_TITLE\"/>\n\t\t<field name=\"COLUMN_INTENT_URI\"/>\n\t\t<field name=\"COLUMN_INTERACTION_COUNT\"/>\n\t\t<field name=\"COLUMN_INTERACTION_TYPE\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_DATA\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_FLAG1\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_FLAG2\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_FLAG3\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_FLAG4\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_ID\"/>\n\t\t<field name=\"COLUMN_ITEM_COUNT\"/>\n\t\t<field name=\"COLUMN_LAST_PLAYBACK_POSITION_MILLIS\"/>\n\t\t<field name=\"COLUMN_LIVE\"/>\n\t\t<field name=\"COLUMN_LOGO_URI\"/>\n\t\t<field name=\"COLUMN_LONG_DESCRIPTION\"/>\n\t\t<field name=\"COLUMN_OFFER_PRICE\"/>\n\t\t<field name=\"COLUMN_POSTER_ART_ASPECT_RATIO\"/>\n\t\t<field name=\"COLUMN_POSTER_ART_URI\"/>\n\t\t<field name=\"COLUMN_PREVIEW_VIDEO_URI\"/>\n\t\t<field name=\"COLUMN_RELEASE_DATE\"/>\n\t\t<field name=\"COLUMN_REVIEW_RATING\"/>\n\t\t<field name=\"COLUMN_REVIEW_RATING_STYLE\"/>\n\t\t<field name=\"COLUMN_SEARCHABLE\"/>\n\t\t<field name=\"COLUMN_SEASON_DISPLAY_NUMBER\"/>\n\t\t<field name=\"COLUMN_SEASON_TITLE\"/>\n\t\t<field name=\"COLUMN_SERIES_ID\" since=\"29\"/>\n\t\t<field name=\"COLUMN_SHORT_DESCRIPTION\"/>\n\t\t<field name=\"COLUMN_SPLIT_ID\" since=\"30\"/>\n\t\t<field name=\"COLUMN_STARTING_PRICE\"/>\n\t\t<field name=\"COLUMN_THUMBNAIL_ASPECT_RATIO\"/>\n\t\t<field name=\"COLUMN_THUMBNAIL_URI\"/>\n\t\t<field name=\"COLUMN_TITLE\"/>\n\t\t<field name=\"COLUMN_TRANSIENT\"/>\n\t\t<field name=\"COLUMN_TYPE\"/>\n\t\t<field name=\"COLUMN_VERSION_NUMBER\"/>\n\t\t<field name=\"COLUMN_VIDEO_HEIGHT\"/>\n\t\t<field name=\"COLUMN_VIDEO_WIDTH\"/>\n\t\t<field name=\"COLUMN_WEIGHT\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"INTERACTION_TYPE_FANS\"/>\n\t\t<field name=\"INTERACTION_TYPE_FOLLOWERS\"/>\n\t\t<field name=\"INTERACTION_TYPE_LIKES\"/>\n\t\t<field name=\"INTERACTION_TYPE_LISTENS\"/>\n\t\t<field name=\"INTERACTION_TYPE_THUMBS\"/>\n\t\t<field name=\"INTERACTION_TYPE_VIEWERS\"/>\n\t\t<field name=\"INTERACTION_TYPE_VIEWS\"/>\n\t\t<field name=\"REVIEW_RATING_STYLE_PERCENTAGE\"/>\n\t\t<field name=\"REVIEW_RATING_STYLE_STARS\"/>\n\t\t<field name=\"REVIEW_RATING_STYLE_THUMBS_UP_DOWN\"/>\n\t\t<field name=\"TYPE_ALBUM\"/>\n\t\t<field name=\"TYPE_ARTIST\"/>\n\t\t<field name=\"TYPE_CHANNEL\"/>\n\t\t<field name=\"TYPE_CLIP\"/>\n\t\t<field name=\"TYPE_EVENT\"/>\n\t\t<field name=\"TYPE_MOVIE\"/>\n\t\t<field name=\"TYPE_PLAYLIST\"/>\n\t\t<field name=\"TYPE_STATION\"/>\n\t\t<field name=\"TYPE_TRACK\"/>\n\t\t<field name=\"TYPE_TV_EPISODE\"/>\n\t\t<field name=\"TYPE_TV_SEASON\"/>\n\t\t<field name=\"TYPE_TV_SERIES\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvContract$Programs\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/media/tv/TvContract$BaseTvColumns\"/>\n\t\t<field name=\"COLUMN_AUDIO_LANGUAGE\"/>\n\t\t<field name=\"COLUMN_BROADCAST_GENRE\"/>\n\t\t<field name=\"COLUMN_CANONICAL_GENRE\"/>\n\t\t<field name=\"COLUMN_CHANNEL_ID\"/>\n\t\t<field name=\"COLUMN_CONTENT_RATING\"/>\n\t\t<field name=\"COLUMN_END_TIME_UTC_MILLIS\"/>\n\t\t<field name=\"COLUMN_EPISODE_DISPLAY_NUMBER\" since=\"24\"/>\n\t\t<field name=\"COLUMN_EPISODE_NUMBER\" deprecated=\"24\"/>\n\t\t<field name=\"COLUMN_EPISODE_TITLE\"/>\n\t\t<field name=\"COLUMN_EVENT_ID\" since=\"30\"/>\n\t\t<field name=\"COLUMN_GLOBAL_CONTENT_ID\" since=\"30\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_DATA\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_FLAG1\" since=\"23\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_FLAG2\" since=\"23\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_FLAG3\" since=\"23\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_FLAG4\" since=\"23\"/>\n\t\t<field name=\"COLUMN_LONG_DESCRIPTION\"/>\n\t\t<field name=\"COLUMN_POSTER_ART_URI\"/>\n\t\t<field name=\"COLUMN_RECORDING_PROHIBITED\" since=\"24\"/>\n\t\t<field name=\"COLUMN_REVIEW_RATING\" since=\"26\"/>\n\t\t<field name=\"COLUMN_REVIEW_RATING_STYLE\" since=\"26\"/>\n\t\t<field name=\"COLUMN_SEARCHABLE\" since=\"23\"/>\n\t\t<field name=\"COLUMN_SEASON_DISPLAY_NUMBER\" since=\"24\"/>\n\t\t<field name=\"COLUMN_SEASON_NUMBER\" deprecated=\"24\"/>\n\t\t<field name=\"COLUMN_SEASON_TITLE\" since=\"24\"/>\n\t\t<field name=\"COLUMN_SERIES_ID\" since=\"29\"/>\n\t\t<field name=\"COLUMN_SHORT_DESCRIPTION\"/>\n\t\t<field name=\"COLUMN_SPLIT_ID\" since=\"30\"/>\n\t\t<field name=\"COLUMN_START_TIME_UTC_MILLIS\"/>\n\t\t<field name=\"COLUMN_THUMBNAIL_URI\"/>\n\t\t<field name=\"COLUMN_TITLE\"/>\n\t\t<field name=\"COLUMN_VERSION_NUMBER\"/>\n\t\t<field name=\"COLUMN_VIDEO_HEIGHT\"/>\n\t\t<field name=\"COLUMN_VIDEO_WIDTH\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"REVIEW_RATING_STYLE_PERCENTAGE\" since=\"26\"/>\n\t\t<field name=\"REVIEW_RATING_STYLE_STARS\" since=\"26\"/>\n\t\t<field name=\"REVIEW_RATING_STYLE_THUMBS_UP_DOWN\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvContract$Programs$Genres\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"decode(Ljava/lang/String;)[Ljava/lang/String;\"/>\n\t\t<method name=\"encode([Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"isCanonical(Ljava/lang/String;)Z\" since=\"24\"/>\n\t\t<field name=\"ANIMAL_WILDLIFE\"/>\n\t\t<field name=\"ARTS\" since=\"22\"/>\n\t\t<field name=\"COMEDY\"/>\n\t\t<field name=\"DRAMA\"/>\n\t\t<field name=\"EDUCATION\"/>\n\t\t<field name=\"ENTERTAINMENT\" since=\"22\"/>\n\t\t<field name=\"FAMILY_KIDS\"/>\n\t\t<field name=\"GAMING\"/>\n\t\t<field name=\"LIFE_STYLE\" since=\"22\"/>\n\t\t<field name=\"MOVIES\"/>\n\t\t<field name=\"MUSIC\" since=\"22\"/>\n\t\t<field name=\"NEWS\"/>\n\t\t<field name=\"PREMIER\" since=\"22\"/>\n\t\t<field name=\"SHOPPING\"/>\n\t\t<field name=\"SPORTS\"/>\n\t\t<field name=\"TECH_SCIENCE\" since=\"22\"/>\n\t\t<field name=\"TRAVEL\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvContract$RecordedPrograms\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/media/tv/TvContract$BaseTvColumns\"/>\n\t\t<field name=\"COLUMN_AUDIO_LANGUAGE\"/>\n\t\t<field name=\"COLUMN_BROADCAST_GENRE\"/>\n\t\t<field name=\"COLUMN_CANONICAL_GENRE\"/>\n\t\t<field name=\"COLUMN_CHANNEL_ID\"/>\n\t\t<field name=\"COLUMN_CONTENT_RATING\"/>\n\t\t<field name=\"COLUMN_END_TIME_UTC_MILLIS\"/>\n\t\t<field name=\"COLUMN_EPISODE_DISPLAY_NUMBER\"/>\n\t\t<field name=\"COLUMN_EPISODE_TITLE\"/>\n\t\t<field name=\"COLUMN_INPUT_ID\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_DATA\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_FLAG1\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_FLAG2\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_FLAG3\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_FLAG4\"/>\n\t\t<field name=\"COLUMN_LONG_DESCRIPTION\"/>\n\t\t<field name=\"COLUMN_POSTER_ART_URI\"/>\n\t\t<field name=\"COLUMN_RECORDING_DATA_BYTES\"/>\n\t\t<field name=\"COLUMN_RECORDING_DATA_URI\"/>\n\t\t<field name=\"COLUMN_RECORDING_DURATION_MILLIS\"/>\n\t\t<field name=\"COLUMN_RECORDING_EXPIRE_TIME_UTC_MILLIS\"/>\n\t\t<field name=\"COLUMN_REVIEW_RATING\" since=\"26\"/>\n\t\t<field name=\"COLUMN_REVIEW_RATING_STYLE\" since=\"26\"/>\n\t\t<field name=\"COLUMN_SEARCHABLE\"/>\n\t\t<field name=\"COLUMN_SEASON_DISPLAY_NUMBER\"/>\n\t\t<field name=\"COLUMN_SEASON_TITLE\"/>\n\t\t<field name=\"COLUMN_SERIES_ID\" since=\"29\"/>\n\t\t<field name=\"COLUMN_SHORT_DESCRIPTION\"/>\n\t\t<field name=\"COLUMN_SPLIT_ID\" since=\"30\"/>\n\t\t<field name=\"COLUMN_START_TIME_UTC_MILLIS\"/>\n\t\t<field name=\"COLUMN_THUMBNAIL_URI\"/>\n\t\t<field name=\"COLUMN_TITLE\"/>\n\t\t<field name=\"COLUMN_VERSION_NUMBER\"/>\n\t\t<field name=\"COLUMN_VIDEO_HEIGHT\"/>\n\t\t<field name=\"COLUMN_VIDEO_WIDTH\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"REVIEW_RATING_STYLE_PERCENTAGE\" since=\"26\"/>\n\t\t<field name=\"REVIEW_RATING_STYLE_STARS\" since=\"26\"/>\n\t\t<field name=\"REVIEW_RATING_STYLE_THUMBS_UP_DOWN\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvContract$WatchNextPrograms\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/media/tv/TvContract$BaseTvColumns\"/>\n\t\t<field name=\"ASPECT_RATIO_16_9\"/>\n\t\t<field name=\"ASPECT_RATIO_1_1\"/>\n\t\t<field name=\"ASPECT_RATIO_2_3\"/>\n\t\t<field name=\"ASPECT_RATIO_3_2\"/>\n\t\t<field name=\"ASPECT_RATIO_4_3\"/>\n\t\t<field name=\"AVAILABILITY_AVAILABLE\"/>\n\t\t<field name=\"AVAILABILITY_FREE_WITH_SUBSCRIPTION\"/>\n\t\t<field name=\"AVAILABILITY_PAID_CONTENT\"/>\n\t\t<field name=\"COLUMN_AUDIO_LANGUAGE\"/>\n\t\t<field name=\"COLUMN_AUTHOR\"/>\n\t\t<field name=\"COLUMN_AVAILABILITY\"/>\n\t\t<field name=\"COLUMN_BROWSABLE\"/>\n\t\t<field name=\"COLUMN_CANONICAL_GENRE\"/>\n\t\t<field name=\"COLUMN_CONTENT_ID\"/>\n\t\t<field name=\"COLUMN_CONTENT_RATING\"/>\n\t\t<field name=\"COLUMN_DURATION_MILLIS\"/>\n\t\t<field name=\"COLUMN_EPISODE_DISPLAY_NUMBER\"/>\n\t\t<field name=\"COLUMN_EPISODE_TITLE\"/>\n\t\t<field name=\"COLUMN_INTENT_URI\"/>\n\t\t<field name=\"COLUMN_INTERACTION_COUNT\"/>\n\t\t<field name=\"COLUMN_INTERACTION_TYPE\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_DATA\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_FLAG1\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_FLAG2\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_FLAG3\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_FLAG4\"/>\n\t\t<field name=\"COLUMN_INTERNAL_PROVIDER_ID\"/>\n\t\t<field name=\"COLUMN_ITEM_COUNT\"/>\n\t\t<field name=\"COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS\"/>\n\t\t<field name=\"COLUMN_LAST_PLAYBACK_POSITION_MILLIS\"/>\n\t\t<field name=\"COLUMN_LIVE\"/>\n\t\t<field name=\"COLUMN_LOGO_URI\"/>\n\t\t<field name=\"COLUMN_LONG_DESCRIPTION\"/>\n\t\t<field name=\"COLUMN_OFFER_PRICE\"/>\n\t\t<field name=\"COLUMN_POSTER_ART_ASPECT_RATIO\"/>\n\t\t<field name=\"COLUMN_POSTER_ART_URI\"/>\n\t\t<field name=\"COLUMN_PREVIEW_VIDEO_URI\"/>\n\t\t<field name=\"COLUMN_RELEASE_DATE\"/>\n\t\t<field name=\"COLUMN_REVIEW_RATING\"/>\n\t\t<field name=\"COLUMN_REVIEW_RATING_STYLE\"/>\n\t\t<field name=\"COLUMN_SEARCHABLE\"/>\n\t\t<field name=\"COLUMN_SEASON_DISPLAY_NUMBER\"/>\n\t\t<field name=\"COLUMN_SEASON_TITLE\"/>\n\t\t<field name=\"COLUMN_SERIES_ID\" since=\"29\"/>\n\t\t<field name=\"COLUMN_SHORT_DESCRIPTION\"/>\n\t\t<field name=\"COLUMN_SPLIT_ID\" since=\"30\"/>\n\t\t<field name=\"COLUMN_STARTING_PRICE\"/>\n\t\t<field name=\"COLUMN_THUMBNAIL_ASPECT_RATIO\"/>\n\t\t<field name=\"COLUMN_THUMBNAIL_URI\"/>\n\t\t<field name=\"COLUMN_TITLE\"/>\n\t\t<field name=\"COLUMN_TRANSIENT\"/>\n\t\t<field name=\"COLUMN_TYPE\"/>\n\t\t<field name=\"COLUMN_VERSION_NUMBER\"/>\n\t\t<field name=\"COLUMN_VIDEO_HEIGHT\"/>\n\t\t<field name=\"COLUMN_VIDEO_WIDTH\"/>\n\t\t<field name=\"COLUMN_WATCH_NEXT_TYPE\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"INTERACTION_TYPE_FANS\"/>\n\t\t<field name=\"INTERACTION_TYPE_FOLLOWERS\"/>\n\t\t<field name=\"INTERACTION_TYPE_LIKES\"/>\n\t\t<field name=\"INTERACTION_TYPE_LISTENS\"/>\n\t\t<field name=\"INTERACTION_TYPE_THUMBS\"/>\n\t\t<field name=\"INTERACTION_TYPE_VIEWERS\"/>\n\t\t<field name=\"INTERACTION_TYPE_VIEWS\"/>\n\t\t<field name=\"REVIEW_RATING_STYLE_PERCENTAGE\"/>\n\t\t<field name=\"REVIEW_RATING_STYLE_STARS\"/>\n\t\t<field name=\"REVIEW_RATING_STYLE_THUMBS_UP_DOWN\"/>\n\t\t<field name=\"TYPE_ALBUM\"/>\n\t\t<field name=\"TYPE_ARTIST\"/>\n\t\t<field name=\"TYPE_CHANNEL\"/>\n\t\t<field name=\"TYPE_CLIP\"/>\n\t\t<field name=\"TYPE_EVENT\"/>\n\t\t<field name=\"TYPE_MOVIE\"/>\n\t\t<field name=\"TYPE_PLAYLIST\"/>\n\t\t<field name=\"TYPE_STATION\"/>\n\t\t<field name=\"TYPE_TRACK\"/>\n\t\t<field name=\"TYPE_TV_EPISODE\"/>\n\t\t<field name=\"TYPE_TV_SEASON\"/>\n\t\t<field name=\"TYPE_TV_SERIES\"/>\n\t\t<field name=\"WATCH_NEXT_TYPE_CONTINUE\"/>\n\t\t<field name=\"WATCH_NEXT_TYPE_NEW\"/>\n\t\t<field name=\"WATCH_NEXT_TYPE_NEXT\"/>\n\t\t<field name=\"WATCH_NEXT_TYPE_WATCHLIST\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvInputInfo\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"canRecord()Z\" since=\"24\"/>\n\t\t<method name=\"createSettingsIntent()Landroid/content/Intent;\" deprecated=\"26\"/>\n\t\t<method name=\"createSetupIntent()Landroid/content/Intent;\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\" since=\"24\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\"/>\n\t\t<method name=\"getParentId()Ljava/lang/String;\"/>\n\t\t<method name=\"getServiceInfo()Landroid/content/pm/ServiceInfo;\"/>\n\t\t<method name=\"getTunerCount()I\" since=\"24\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<method name=\"isHidden(Landroid/content/Context;)Z\" since=\"24\"/>\n\t\t<method name=\"isPassthroughInput()Z\"/>\n\t\t<method name=\"loadCustomLabel(Landroid/content/Context;)Ljava/lang/CharSequence;\" since=\"24\"/>\n\t\t<method name=\"loadIcon(Landroid/content/Context;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"loadLabel(Landroid/content/Context;)Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"EXTRA_INPUT_ID\"/>\n\t\t<field name=\"TYPE_COMPONENT\"/>\n\t\t<field name=\"TYPE_COMPOSITE\"/>\n\t\t<field name=\"TYPE_DISPLAY_PORT\"/>\n\t\t<field name=\"TYPE_DVI\"/>\n\t\t<field name=\"TYPE_HDMI\"/>\n\t\t<field name=\"TYPE_OTHER\"/>\n\t\t<field name=\"TYPE_SCART\"/>\n\t\t<field name=\"TYPE_SVIDEO\"/>\n\t\t<field name=\"TYPE_TUNER\"/>\n\t\t<field name=\"TYPE_VGA\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvInputInfo$Builder\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/content/ComponentName;)V\"/>\n\t\t<method name=\"build()Landroid/media/tv/TvInputInfo;\"/>\n\t\t<method name=\"setCanRecord(Z)Landroid/media/tv/TvInputInfo$Builder;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/media/tv/TvInputInfo$Builder;\"/>\n\t\t<method name=\"setTunerCount(I)Landroid/media/tv/TvInputInfo$Builder;\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvInputManager\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getBlockedRatings()Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"getInputState(Ljava/lang/String;)I\"/>\n\t\t<method name=\"getTvInputInfo(Ljava/lang/String;)Landroid/media/tv/TvInputInfo;\"/>\n\t\t<method name=\"getTvInputList()Ljava/util/List;\"/>\n\t\t<method name=\"isParentalControlsEnabled()Z\"/>\n\t\t<method name=\"isRatingBlocked(Landroid/media/tv/TvContentRating;)Z\"/>\n\t\t<method name=\"registerCallback(Landroid/media/tv/TvInputManager$TvInputCallback;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"unregisterCallback(Landroid/media/tv/TvInputManager$TvInputCallback;)V\"/>\n\t\t<method name=\"updateTvInputInfo(Landroid/media/tv/TvInputInfo;)V\" since=\"24\"/>\n\t\t<field name=\"ACTION_BLOCKED_RATINGS_CHANGED\"/>\n\t\t<field name=\"ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED\"/>\n\t\t<field name=\"ACTION_QUERY_CONTENT_RATING_SYSTEMS\"/>\n\t\t<field name=\"ACTION_SETUP_INPUTS\" since=\"24\"/>\n\t\t<field name=\"ACTION_VIEW_RECORDING_SCHEDULES\" since=\"26\"/>\n\t\t<field name=\"INPUT_STATE_CONNECTED\"/>\n\t\t<field name=\"INPUT_STATE_CONNECTED_STANDBY\"/>\n\t\t<field name=\"INPUT_STATE_DISCONNECTED\"/>\n\t\t<field name=\"META_DATA_CONTENT_RATING_SYSTEMS\"/>\n\t\t<field name=\"RECORDING_ERROR_INSUFFICIENT_SPACE\" since=\"24\"/>\n\t\t<field name=\"RECORDING_ERROR_RESOURCE_BUSY\" since=\"24\"/>\n\t\t<field name=\"RECORDING_ERROR_UNKNOWN\" since=\"24\"/>\n\t\t<field name=\"TIME_SHIFT_INVALID_TIME\" since=\"23\"/>\n\t\t<field name=\"TIME_SHIFT_STATUS_AVAILABLE\" since=\"23\"/>\n\t\t<field name=\"TIME_SHIFT_STATUS_UNAVAILABLE\" since=\"23\"/>\n\t\t<field name=\"TIME_SHIFT_STATUS_UNKNOWN\" since=\"23\"/>\n\t\t<field name=\"TIME_SHIFT_STATUS_UNSUPPORTED\" since=\"23\"/>\n\t\t<field name=\"VIDEO_UNAVAILABLE_REASON_AUDIO_ONLY\" since=\"23\"/>\n\t\t<field name=\"VIDEO_UNAVAILABLE_REASON_BUFFERING\"/>\n\t\t<field name=\"VIDEO_UNAVAILABLE_REASON_TUNING\"/>\n\t\t<field name=\"VIDEO_UNAVAILABLE_REASON_UNKNOWN\"/>\n\t\t<field name=\"VIDEO_UNAVAILABLE_REASON_WEAK_SIGNAL\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvInputManager$TvInputCallback\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onInputAdded(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onInputRemoved(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onInputStateChanged(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"onInputUpdated(Ljava/lang/String;)V\" since=\"24\"/>\n\t\t<method name=\"onTvInputInfoUpdated(Landroid/media/tv/TvInputInfo;)V\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvInputService\" since=\"21\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCreateRecordingSession(Ljava/lang/String;)Landroid/media/tv/TvInputService$RecordingSession;\" since=\"24\"/>\n\t\t<method name=\"onCreateSession(Ljava/lang/String;)Landroid/media/tv/TvInputService$Session;\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t\t<field name=\"SERVICE_META_DATA\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvInputService$HardwareSession\" since=\"21\">\n\t\t<extends name=\"android/media/tv/TvInputService$Session\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"getHardwareInputId()Ljava/lang/String;\"/>\n\t\t<method name=\"onHardwareVideoAvailable()V\"/>\n\t\t<method name=\"onHardwareVideoUnavailable(I)V\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvInputService$RecordingSession\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"notifyError(I)V\"/>\n\t\t<method name=\"notifyRecordingStopped(Landroid/net/Uri;)V\"/>\n\t\t<method name=\"notifyTuned(Landroid/net/Uri;)V\"/>\n\t\t<method name=\"onAppPrivateCommand(Ljava/lang/String;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onRelease()V\"/>\n\t\t<method name=\"onStartRecording(Landroid/net/Uri;)V\"/>\n\t\t<method name=\"onStopRecording()V\"/>\n\t\t<method name=\"onTune(Landroid/net/Uri;)V\"/>\n\t\t<method name=\"onTune(Landroid/net/Uri;Landroid/os/Bundle;)V\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvInputService$Session\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/view/KeyEvent$Callback\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"layoutSurface(IIII)V\" since=\"23\"/>\n\t\t<method name=\"notifyChannelRetuned(Landroid/net/Uri;)V\"/>\n\t\t<method name=\"notifyContentAllowed()V\"/>\n\t\t<method name=\"notifyContentBlocked(Landroid/media/tv/TvContentRating;)V\"/>\n\t\t<method name=\"notifyTimeShiftStatusChanged(I)V\" since=\"23\"/>\n\t\t<method name=\"notifyTrackSelected(ILjava/lang/String;)V\"/>\n\t\t<method name=\"notifyTracksChanged(Ljava/util/List;)V\"/>\n\t\t<method name=\"notifyVideoAvailable()V\"/>\n\t\t<method name=\"notifyVideoUnavailable(I)V\"/>\n\t\t<method name=\"onAppPrivateCommand(Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"24\"/>\n\t\t<method name=\"onCreateOverlayView()Landroid/view/View;\"/>\n\t\t<method name=\"onGenericMotionEvent(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"onOverlayViewSizeChanged(II)V\" since=\"23\"/>\n\t\t<method name=\"onRelease()V\"/>\n\t\t<method name=\"onSelectTrack(ILjava/lang/String;)Z\"/>\n\t\t<method name=\"onSetCaptionEnabled(Z)V\"/>\n\t\t<method name=\"onSetStreamVolume(F)V\"/>\n\t\t<method name=\"onSetSurface(Landroid/view/Surface;)Z\"/>\n\t\t<method name=\"onSurfaceChanged(III)V\"/>\n\t\t<method name=\"onTimeShiftGetCurrentPosition()J\" since=\"23\"/>\n\t\t<method name=\"onTimeShiftGetStartPosition()J\" since=\"23\"/>\n\t\t<method name=\"onTimeShiftPause()V\" since=\"23\"/>\n\t\t<method name=\"onTimeShiftPlay(Landroid/net/Uri;)V\" since=\"24\"/>\n\t\t<method name=\"onTimeShiftResume()V\" since=\"23\"/>\n\t\t<method name=\"onTimeShiftSeekTo(J)V\" since=\"23\"/>\n\t\t<method name=\"onTimeShiftSetPlaybackParams(Landroid/media/PlaybackParams;)V\" since=\"23\"/>\n\t\t<method name=\"onTouchEvent(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"onTrackballEvent(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"onTune(Landroid/net/Uri;)Z\"/>\n\t\t<method name=\"onTune(Landroid/net/Uri;Landroid/os/Bundle;)Z\" since=\"24\"/>\n\t\t<method name=\"onUnblockContent(Landroid/media/tv/TvContentRating;)V\"/>\n\t\t<method name=\"setOverlayViewEnabled(Z)V\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvRecordingClient\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/lang/String;Landroid/media/tv/TvRecordingClient$RecordingCallback;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"sendAppPrivateCommand(Ljava/lang/String;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"startRecording(Landroid/net/Uri;)V\"/>\n\t\t<method name=\"stopRecording()V\"/>\n\t\t<method name=\"tune(Ljava/lang/String;Landroid/net/Uri;)V\"/>\n\t\t<method name=\"tune(Ljava/lang/String;Landroid/net/Uri;Landroid/os/Bundle;)V\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvRecordingClient$RecordingCallback\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onConnectionFailed(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onDisconnected(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onError(I)V\"/>\n\t\t<method name=\"onRecordingStopped(Landroid/net/Uri;)V\"/>\n\t\t<method name=\"onTuned(Landroid/net/Uri;)V\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvTrackInfo\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getAudioChannelCount()I\"/>\n\t\t<method name=\"getAudioSampleRate()I\"/>\n\t\t<method name=\"getDescription()Ljava/lang/CharSequence;\" since=\"23\"/>\n\t\t<method name=\"getEncoding()Ljava/lang/String;\" since=\"30\"/>\n\t\t<method name=\"getExtra()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\"/>\n\t\t<method name=\"getLanguage()Ljava/lang/String;\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<method name=\"getVideoActiveFormatDescription()B\" since=\"24\"/>\n\t\t<method name=\"getVideoFrameRate()F\"/>\n\t\t<method name=\"getVideoHeight()I\"/>\n\t\t<method name=\"getVideoPixelAspectRatio()F\" since=\"23\"/>\n\t\t<method name=\"getVideoWidth()I\"/>\n\t\t<method name=\"isAudioDescription()Z\" since=\"30\"/>\n\t\t<method name=\"isEncrypted()Z\" since=\"30\"/>\n\t\t<method name=\"isHardOfHearing()Z\" since=\"30\"/>\n\t\t<method name=\"isSpokenSubtitle()Z\" since=\"30\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"TYPE_AUDIO\"/>\n\t\t<field name=\"TYPE_SUBTITLE\"/>\n\t\t<field name=\"TYPE_VIDEO\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvTrackInfo$Builder\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/String;)V\"/>\n\t\t<method name=\"build()Landroid/media/tv/TvTrackInfo;\"/>\n\t\t<method name=\"setAudioChannelCount(I)Landroid/media/tv/TvTrackInfo$Builder;\"/>\n\t\t<method name=\"setAudioDescription(Z)Landroid/media/tv/TvTrackInfo$Builder;\" since=\"30\"/>\n\t\t<method name=\"setAudioSampleRate(I)Landroid/media/tv/TvTrackInfo$Builder;\"/>\n\t\t<method name=\"setDescription(Ljava/lang/CharSequence;)Landroid/media/tv/TvTrackInfo$Builder;\" since=\"23\"/>\n\t\t<method name=\"setEncoding(Ljava/lang/String;)Landroid/media/tv/TvTrackInfo$Builder;\" since=\"30\"/>\n\t\t<method name=\"setEncrypted(Z)Landroid/media/tv/TvTrackInfo$Builder;\" since=\"30\"/>\n\t\t<method name=\"setExtra(Landroid/os/Bundle;)Landroid/media/tv/TvTrackInfo$Builder;\"/>\n\t\t<method name=\"setHardOfHearing(Z)Landroid/media/tv/TvTrackInfo$Builder;\" since=\"30\"/>\n\t\t<method name=\"setLanguage(Ljava/lang/String;)Landroid/media/tv/TvTrackInfo$Builder;\"/>\n\t\t<method name=\"setSpokenSubtitle(Z)Landroid/media/tv/TvTrackInfo$Builder;\" since=\"30\"/>\n\t\t<method name=\"setVideoActiveFormatDescription(B)Landroid/media/tv/TvTrackInfo$Builder;\" since=\"24\"/>\n\t\t<method name=\"setVideoFrameRate(F)Landroid/media/tv/TvTrackInfo$Builder;\"/>\n\t\t<method name=\"setVideoHeight(I)Landroid/media/tv/TvTrackInfo$Builder;\"/>\n\t\t<method name=\"setVideoPixelAspectRatio(F)Landroid/media/tv/TvTrackInfo$Builder;\" since=\"23\"/>\n\t\t<method name=\"setVideoWidth(I)Landroid/media/tv/TvTrackInfo$Builder;\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvView\" since=\"21\">\n\t\t<extends name=\"android/view/ViewGroup\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"dispatchUnhandledInputEvent(Landroid/view/InputEvent;)Z\"/>\n\t\t<method name=\"getSelectedTrack(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getTracks(I)Ljava/util/List;\"/>\n\t\t<method name=\"onUnhandledInputEvent(Landroid/view/InputEvent;)Z\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"selectTrack(ILjava/lang/String;)V\"/>\n\t\t<method name=\"sendAppPrivateCommand(Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"24\"/>\n\t\t<method name=\"setCallback(Landroid/media/tv/TvView$TvInputCallback;)V\"/>\n\t\t<method name=\"setCaptionEnabled(Z)V\"/>\n\t\t<method name=\"setOnUnhandledInputEventListener(Landroid/media/tv/TvView$OnUnhandledInputEventListener;)V\"/>\n\t\t<method name=\"setStreamVolume(F)V\"/>\n\t\t<method name=\"setTimeShiftPositionCallback(Landroid/media/tv/TvView$TimeShiftPositionCallback;)V\" since=\"23\"/>\n\t\t<method name=\"setZOrderMediaOverlay(Z)V\" since=\"24\"/>\n\t\t<method name=\"setZOrderOnTop(Z)V\" since=\"24\"/>\n\t\t<method name=\"timeShiftPause()V\" since=\"23\"/>\n\t\t<method name=\"timeShiftPlay(Ljava/lang/String;Landroid/net/Uri;)V\" since=\"24\"/>\n\t\t<method name=\"timeShiftResume()V\" since=\"23\"/>\n\t\t<method name=\"timeShiftSeekTo(J)V\" since=\"23\"/>\n\t\t<method name=\"timeShiftSetPlaybackParams(Landroid/media/PlaybackParams;)V\" since=\"23\"/>\n\t\t<method name=\"tune(Ljava/lang/String;Landroid/net/Uri;)V\"/>\n\t\t<method name=\"tune(Ljava/lang/String;Landroid/net/Uri;Landroid/os/Bundle;)V\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvView$OnUnhandledInputEventListener\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onUnhandledInputEvent(Landroid/view/InputEvent;)Z\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvView$TimeShiftPositionCallback\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onTimeShiftCurrentPositionChanged(Ljava/lang/String;J)V\"/>\n\t\t<method name=\"onTimeShiftStartPositionChanged(Ljava/lang/String;J)V\"/>\n\t</class>\n\t<class name=\"android/media/tv/TvView$TvInputCallback\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onChannelRetuned(Ljava/lang/String;Landroid/net/Uri;)V\"/>\n\t\t<method name=\"onConnectionFailed(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onContentAllowed(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onContentBlocked(Ljava/lang/String;Landroid/media/tv/TvContentRating;)V\"/>\n\t\t<method name=\"onDisconnected(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onTimeShiftStatusChanged(Ljava/lang/String;I)V\" since=\"23\"/>\n\t\t<method name=\"onTrackSelected(Ljava/lang/String;ILjava/lang/String;)V\"/>\n\t\t<method name=\"onTracksChanged(Ljava/lang/String;Ljava/util/List;)V\"/>\n\t\t<method name=\"onVideoAvailable(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onVideoSizeChanged(Ljava/lang/String;II)V\"/>\n\t\t<method name=\"onVideoUnavailable(Ljava/lang/String;I)V\"/>\n\t</class>\n\t<class name=\"android/mtp/MtpConstants\" since=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"isAbstractObject(I)Z\"/>\n\t\t<field name=\"ASSOCIATION_TYPE_GENERIC_FOLDER\"/>\n\t\t<field name=\"FORMAT_3GP_CONTAINER\"/>\n\t\t<field name=\"FORMAT_AAC\"/>\n\t\t<field name=\"FORMAT_ABSTRACT_AUDIO_ALBUM\"/>\n\t\t<field name=\"FORMAT_ABSTRACT_AUDIO_PLAYLIST\"/>\n\t\t<field name=\"FORMAT_ABSTRACT_AV_PLAYLIST\"/>\n\t\t<field name=\"FORMAT_ABSTRACT_DOCUMENT\"/>\n\t\t<field name=\"FORMAT_ABSTRACT_IMAGE_ALBUM\"/>\n\t\t<field name=\"FORMAT_ABSTRACT_MEDIACAST\"/>\n\t\t<field name=\"FORMAT_ABSTRACT_MULTIMEDIA_ALBUM\"/>\n\t\t<field name=\"FORMAT_ABSTRACT_VIDEO_ALBUM\"/>\n\t\t<field name=\"FORMAT_ABSTRACT_VIDEO_PLAYLIST\"/>\n\t\t<field name=\"FORMAT_AIFF\"/>\n\t\t<field name=\"FORMAT_ASF\"/>\n\t\t<field name=\"FORMAT_ASSOCIATION\"/>\n\t\t<field name=\"FORMAT_ASX_PLAYLIST\"/>\n\t\t<field name=\"FORMAT_AUDIBLE\"/>\n\t\t<field name=\"FORMAT_AVI\"/>\n\t\t<field name=\"FORMAT_BMP\"/>\n\t\t<field name=\"FORMAT_DEFINED\" since=\"24\"/>\n\t\t<field name=\"FORMAT_DNG\" since=\"24\"/>\n\t\t<field name=\"FORMAT_DPOF\"/>\n\t\t<field name=\"FORMAT_EXECUTABLE\"/>\n\t\t<field name=\"FORMAT_EXIF_JPEG\"/>\n\t\t<field name=\"FORMAT_FLAC\"/>\n\t\t<field name=\"FORMAT_GIF\"/>\n\t\t<field name=\"FORMAT_HTML\"/>\n\t\t<field name=\"FORMAT_JFIF\"/>\n\t\t<field name=\"FORMAT_JP2\"/>\n\t\t<field name=\"FORMAT_JPX\"/>\n\t\t<field name=\"FORMAT_M3U_PLAYLIST\"/>\n\t\t<field name=\"FORMAT_MP2\"/>\n\t\t<field name=\"FORMAT_MP3\"/>\n\t\t<field name=\"FORMAT_MP4_CONTAINER\"/>\n\t\t<field name=\"FORMAT_MPEG\"/>\n\t\t<field name=\"FORMAT_MPL_PLAYLIST\"/>\n\t\t<field name=\"FORMAT_MS_EXCEL_SPREADSHEET\"/>\n\t\t<field name=\"FORMAT_MS_POWERPOINT_PRESENTATION\"/>\n\t\t<field name=\"FORMAT_MS_WORD_DOCUMENT\"/>\n\t\t<field name=\"FORMAT_OGG\"/>\n\t\t<field name=\"FORMAT_PICT\"/>\n\t\t<field name=\"FORMAT_PLS_PLAYLIST\"/>\n\t\t<field name=\"FORMAT_PNG\"/>\n\t\t<field name=\"FORMAT_SCRIPT\"/>\n\t\t<field name=\"FORMAT_TEXT\"/>\n\t\t<field name=\"FORMAT_TIFF\"/>\n\t\t<field name=\"FORMAT_TIFF_EP\"/>\n\t\t<field name=\"FORMAT_UNDEFINED\"/>\n\t\t<field name=\"FORMAT_UNDEFINED_AUDIO\"/>\n\t\t<field name=\"FORMAT_UNDEFINED_COLLECTION\"/>\n\t\t<field name=\"FORMAT_UNDEFINED_DOCUMENT\"/>\n\t\t<field name=\"FORMAT_UNDEFINED_FIRMWARE\"/>\n\t\t<field name=\"FORMAT_UNDEFINED_VIDEO\"/>\n\t\t<field name=\"FORMAT_WAV\"/>\n\t\t<field name=\"FORMAT_WINDOWS_IMAGE_FORMAT\"/>\n\t\t<field name=\"FORMAT_WMA\"/>\n\t\t<field name=\"FORMAT_WMV\"/>\n\t\t<field name=\"FORMAT_WPL_PLAYLIST\"/>\n\t\t<field name=\"FORMAT_XML_DOCUMENT\"/>\n\t\t<field name=\"OPERATION_CLOSE_SESSION\" since=\"24\"/>\n\t\t<field name=\"OPERATION_COPY_OBJECT\" since=\"24\"/>\n\t\t<field name=\"OPERATION_DELETE_OBJECT\" since=\"24\"/>\n\t\t<field name=\"OPERATION_FORMAT_STORE\" since=\"24\"/>\n\t\t<field name=\"OPERATION_GET_DEVICE_INFO\" since=\"24\"/>\n\t\t<field name=\"OPERATION_GET_DEVICE_PROP_DESC\" since=\"24\"/>\n\t\t<field name=\"OPERATION_GET_DEVICE_PROP_VALUE\" since=\"24\"/>\n\t\t<field name=\"OPERATION_GET_NUM_OBJECTS\" since=\"24\"/>\n\t\t<field name=\"OPERATION_GET_OBJECT\" since=\"24\"/>\n\t\t<field name=\"OPERATION_GET_OBJECT_HANDLES\" since=\"24\"/>\n\t\t<field name=\"OPERATION_GET_OBJECT_INFO\" since=\"24\"/>\n\t\t<field name=\"OPERATION_GET_OBJECT_PROPS_SUPPORTED\" since=\"24\"/>\n\t\t<field name=\"OPERATION_GET_OBJECT_PROP_DESC\" since=\"24\"/>\n\t\t<field name=\"OPERATION_GET_OBJECT_PROP_VALUE\" since=\"24\"/>\n\t\t<field name=\"OPERATION_GET_OBJECT_REFERENCES\" since=\"24\"/>\n\t\t<field name=\"OPERATION_GET_PARTIAL_OBJECT\" since=\"24\"/>\n\t\t<field name=\"OPERATION_GET_PARTIAL_OBJECT_64\" since=\"24\"/>\n\t\t<field name=\"OPERATION_GET_STORAGE_INFO\" since=\"24\"/>\n\t\t<field name=\"OPERATION_GET_STORAGE_I_DS\" since=\"24\"/>\n\t\t<field name=\"OPERATION_GET_THUMB\" since=\"24\"/>\n\t\t<field name=\"OPERATION_INITIATE_CAPTURE\" since=\"24\"/>\n\t\t<field name=\"OPERATION_INITIATE_OPEN_CAPTURE\" since=\"24\"/>\n\t\t<field name=\"OPERATION_MOVE_OBJECT\" since=\"24\"/>\n\t\t<field name=\"OPERATION_OPEN_SESSION\" since=\"24\"/>\n\t\t<field name=\"OPERATION_POWER_DOWN\" since=\"24\"/>\n\t\t<field name=\"OPERATION_RESET_DEVICE\" since=\"24\"/>\n\t\t<field name=\"OPERATION_RESET_DEVICE_PROP_VALUE\" since=\"24\"/>\n\t\t<field name=\"OPERATION_SELF_TEST\" since=\"24\"/>\n\t\t<field name=\"OPERATION_SEND_OBJECT\" since=\"24\"/>\n\t\t<field name=\"OPERATION_SEND_OBJECT_INFO\" since=\"24\"/>\n\t\t<field name=\"OPERATION_SET_DEVICE_PROP_VALUE\" since=\"24\"/>\n\t\t<field name=\"OPERATION_SET_OBJECT_PROP_VALUE\" since=\"24\"/>\n\t\t<field name=\"OPERATION_SET_OBJECT_PROTECTION\" since=\"24\"/>\n\t\t<field name=\"OPERATION_SET_OBJECT_REFERENCES\" since=\"24\"/>\n\t\t<field name=\"OPERATION_SKIP\" since=\"24\"/>\n\t\t<field name=\"OPERATION_TERMINATE_OPEN_CAPTURE\" since=\"24\"/>\n\t\t<field name=\"PROTECTION_STATUS_NONE\"/>\n\t\t<field name=\"PROTECTION_STATUS_NON_TRANSFERABLE_DATA\"/>\n\t\t<field name=\"PROTECTION_STATUS_READ_ONLY\"/>\n\t\t<field name=\"PROTECTION_STATUS_READ_ONLY_DATA\"/>\n\t</class>\n\t<class name=\"android/mtp/MtpDevice\" since=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/hardware/usb/UsbDevice;)V\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"deleteObject(I)Z\"/>\n\t\t<method name=\"getDeviceId()I\"/>\n\t\t<method name=\"getDeviceInfo()Landroid/mtp/MtpDeviceInfo;\"/>\n\t\t<method name=\"getDeviceName()Ljava/lang/String;\"/>\n\t\t<method name=\"getObject(II)[B\"/>\n\t\t<method name=\"getObjectHandles(III)[I\"/>\n\t\t<method name=\"getObjectInfo(I)Landroid/mtp/MtpObjectInfo;\"/>\n\t\t<method name=\"getParent(I)J\"/>\n\t\t<method name=\"getPartialObject(IJJ[B)J\" since=\"24\"/>\n\t\t<method name=\"getPartialObject64(IJJ[B)J\" since=\"24\"/>\n\t\t<method name=\"getStorageId(I)J\"/>\n\t\t<method name=\"getStorageIds()[I\"/>\n\t\t<method name=\"getStorageInfo(I)Landroid/mtp/MtpStorageInfo;\"/>\n\t\t<method name=\"getThumbnail(I)[B\"/>\n\t\t<method name=\"importFile(ILandroid/os/ParcelFileDescriptor;)Z\" since=\"24\"/>\n\t\t<method name=\"importFile(ILjava/lang/String;)Z\"/>\n\t\t<method name=\"open(Landroid/hardware/usb/UsbDeviceConnection;)Z\"/>\n\t\t<method name=\"readEvent(Landroid/os/CancellationSignal;)Landroid/mtp/MtpEvent;\" since=\"24\"/>\n\t\t<method name=\"sendObject(IJLandroid/os/ParcelFileDescriptor;)Z\" since=\"24\"/>\n\t\t<method name=\"sendObjectInfo(Landroid/mtp/MtpObjectInfo;)Landroid/mtp/MtpObjectInfo;\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/mtp/MtpDeviceInfo\" since=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getEventsSupported()[I\" since=\"24\"/>\n\t\t<method name=\"getManufacturer()Ljava/lang/String;\"/>\n\t\t<method name=\"getModel()Ljava/lang/String;\"/>\n\t\t<method name=\"getOperationsSupported()[I\" since=\"24\"/>\n\t\t<method name=\"getSerialNumber()Ljava/lang/String;\"/>\n\t\t<method name=\"getVersion()Ljava/lang/String;\"/>\n\t\t<method name=\"isEventSupported(I)Z\" since=\"24\"/>\n\t\t<method name=\"isOperationSupported(I)Z\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/mtp/MtpEvent\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getDevicePropCode()I\"/>\n\t\t<method name=\"getEventCode()I\"/>\n\t\t<method name=\"getObjectFormatCode()I\"/>\n\t\t<method name=\"getObjectHandle()I\"/>\n\t\t<method name=\"getObjectPropCode()I\"/>\n\t\t<method name=\"getParameter1()I\"/>\n\t\t<method name=\"getParameter2()I\"/>\n\t\t<method name=\"getParameter3()I\"/>\n\t\t<method name=\"getStorageId()I\"/>\n\t\t<method name=\"getTransactionId()I\"/>\n\t\t<field name=\"EVENT_CANCEL_TRANSACTION\"/>\n\t\t<field name=\"EVENT_CAPTURE_COMPLETE\"/>\n\t\t<field name=\"EVENT_DEVICE_INFO_CHANGED\"/>\n\t\t<field name=\"EVENT_DEVICE_PROP_CHANGED\"/>\n\t\t<field name=\"EVENT_DEVICE_RESET\"/>\n\t\t<field name=\"EVENT_OBJECT_ADDED\"/>\n\t\t<field name=\"EVENT_OBJECT_INFO_CHANGED\"/>\n\t\t<field name=\"EVENT_OBJECT_PROP_CHANGED\"/>\n\t\t<field name=\"EVENT_OBJECT_PROP_DESC_CHANGED\"/>\n\t\t<field name=\"EVENT_OBJECT_REFERENCES_CHANGED\"/>\n\t\t<field name=\"EVENT_OBJECT_REMOVED\"/>\n\t\t<field name=\"EVENT_REQUEST_OBJECT_TRANSFER\"/>\n\t\t<field name=\"EVENT_STORAGE_INFO_CHANGED\"/>\n\t\t<field name=\"EVENT_STORE_ADDED\"/>\n\t\t<field name=\"EVENT_STORE_FULL\"/>\n\t\t<field name=\"EVENT_STORE_REMOVED\"/>\n\t\t<field name=\"EVENT_UNDEFINED\"/>\n\t\t<field name=\"EVENT_UNREPORTED_STATUS\"/>\n\t</class>\n\t<class name=\"android/mtp/MtpObjectInfo\" since=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAssociationDesc()I\"/>\n\t\t<method name=\"getAssociationType()I\"/>\n\t\t<method name=\"getCompressedSize()I\"/>\n\t\t<method name=\"getCompressedSizeLong()J\" since=\"24\"/>\n\t\t<method name=\"getDateCreated()J\"/>\n\t\t<method name=\"getDateModified()J\"/>\n\t\t<method name=\"getFormat()I\"/>\n\t\t<method name=\"getImagePixDepth()I\"/>\n\t\t<method name=\"getImagePixDepthLong()J\" since=\"24\"/>\n\t\t<method name=\"getImagePixHeight()I\"/>\n\t\t<method name=\"getImagePixHeightLong()J\" since=\"24\"/>\n\t\t<method name=\"getImagePixWidth()I\"/>\n\t\t<method name=\"getImagePixWidthLong()J\" since=\"24\"/>\n\t\t<method name=\"getKeywords()Ljava/lang/String;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getObjectHandle()I\"/>\n\t\t<method name=\"getParent()I\"/>\n\t\t<method name=\"getProtectionStatus()I\"/>\n\t\t<method name=\"getSequenceNumber()I\"/>\n\t\t<method name=\"getSequenceNumberLong()J\" since=\"24\"/>\n\t\t<method name=\"getStorageId()I\"/>\n\t\t<method name=\"getThumbCompressedSize()I\"/>\n\t\t<method name=\"getThumbCompressedSizeLong()J\" since=\"24\"/>\n\t\t<method name=\"getThumbFormat()I\"/>\n\t\t<method name=\"getThumbPixHeight()I\"/>\n\t\t<method name=\"getThumbPixHeightLong()J\" since=\"24\"/>\n\t\t<method name=\"getThumbPixWidth()I\"/>\n\t\t<method name=\"getThumbPixWidthLong()J\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/mtp/MtpObjectInfo$Builder\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/mtp/MtpObjectInfo;)V\"/>\n\t\t<method name=\"build()Landroid/mtp/MtpObjectInfo;\"/>\n\t\t<method name=\"setAssociationDesc(I)Landroid/mtp/MtpObjectInfo$Builder;\"/>\n\t\t<method name=\"setAssociationType(I)Landroid/mtp/MtpObjectInfo$Builder;\"/>\n\t\t<method name=\"setCompressedSize(J)Landroid/mtp/MtpObjectInfo$Builder;\"/>\n\t\t<method name=\"setDateCreated(J)Landroid/mtp/MtpObjectInfo$Builder;\"/>\n\t\t<method name=\"setDateModified(J)Landroid/mtp/MtpObjectInfo$Builder;\"/>\n\t\t<method name=\"setFormat(I)Landroid/mtp/MtpObjectInfo$Builder;\"/>\n\t\t<method name=\"setImagePixDepth(J)Landroid/mtp/MtpObjectInfo$Builder;\"/>\n\t\t<method name=\"setImagePixHeight(J)Landroid/mtp/MtpObjectInfo$Builder;\"/>\n\t\t<method name=\"setImagePixWidth(J)Landroid/mtp/MtpObjectInfo$Builder;\"/>\n\t\t<method name=\"setKeywords(Ljava/lang/String;)Landroid/mtp/MtpObjectInfo$Builder;\"/>\n\t\t<method name=\"setName(Ljava/lang/String;)Landroid/mtp/MtpObjectInfo$Builder;\"/>\n\t\t<method name=\"setObjectHandle(I)Landroid/mtp/MtpObjectInfo$Builder;\"/>\n\t\t<method name=\"setParent(I)Landroid/mtp/MtpObjectInfo$Builder;\"/>\n\t\t<method name=\"setProtectionStatus(I)Landroid/mtp/MtpObjectInfo$Builder;\"/>\n\t\t<method name=\"setSequenceNumber(J)Landroid/mtp/MtpObjectInfo$Builder;\"/>\n\t\t<method name=\"setStorageId(I)Landroid/mtp/MtpObjectInfo$Builder;\"/>\n\t\t<method name=\"setThumbCompressedSize(J)Landroid/mtp/MtpObjectInfo$Builder;\"/>\n\t\t<method name=\"setThumbFormat(I)Landroid/mtp/MtpObjectInfo$Builder;\"/>\n\t\t<method name=\"setThumbPixHeight(J)Landroid/mtp/MtpObjectInfo$Builder;\"/>\n\t\t<method name=\"setThumbPixWidth(J)Landroid/mtp/MtpObjectInfo$Builder;\"/>\n\t</class>\n\t<class name=\"android/mtp/MtpStorageInfo\" since=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getDescription()Ljava/lang/String;\"/>\n\t\t<method name=\"getFreeSpace()J\"/>\n\t\t<method name=\"getMaxCapacity()J\"/>\n\t\t<method name=\"getStorageId()I\"/>\n\t\t<method name=\"getVolumeIdentifier()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/net/CaptivePortal\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"ignoreNetwork()V\"/>\n\t\t<method name=\"reportCaptivePortalDismissed()V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/ConnectivityDiagnosticsManager\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"registerConnectivityDiagnosticsCallback(Landroid/net/NetworkRequest;Ljava/util/concurrent/Executor;Landroid/net/ConnectivityDiagnosticsManager$ConnectivityDiagnosticsCallback;)V\"/>\n\t\t<method name=\"unregisterConnectivityDiagnosticsCallback(Landroid/net/ConnectivityDiagnosticsManager$ConnectivityDiagnosticsCallback;)V\"/>\n\t</class>\n\t<class name=\"android/net/ConnectivityDiagnosticsManager$ConnectivityDiagnosticsCallback\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onConnectivityReportAvailable(Landroid/net/ConnectivityDiagnosticsManager$ConnectivityReport;)V\"/>\n\t\t<method name=\"onDataStallSuspected(Landroid/net/ConnectivityDiagnosticsManager$DataStallReport;)V\"/>\n\t\t<method name=\"onNetworkConnectivityReported(Landroid/net/Network;Z)V\"/>\n\t</class>\n\t<class name=\"android/net/ConnectivityDiagnosticsManager$ConnectivityReport\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/Network;JLandroid/net/LinkProperties;Landroid/net/NetworkCapabilities;Landroid/os/PersistableBundle;)V\"/>\n\t\t<method name=\"getAdditionalInfo()Landroid/os/PersistableBundle;\"/>\n\t\t<method name=\"getLinkProperties()Landroid/net/LinkProperties;\"/>\n\t\t<method name=\"getNetwork()Landroid/net/Network;\"/>\n\t\t<method name=\"getNetworkCapabilities()Landroid/net/NetworkCapabilities;\"/>\n\t\t<method name=\"getReportTimestamp()J\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"KEY_NETWORK_PROBES_ATTEMPTED_BITMASK\"/>\n\t\t<field name=\"KEY_NETWORK_PROBES_SUCCEEDED_BITMASK\"/>\n\t\t<field name=\"KEY_NETWORK_VALIDATION_RESULT\"/>\n\t\t<field name=\"NETWORK_PROBE_DNS\"/>\n\t\t<field name=\"NETWORK_PROBE_FALLBACK\"/>\n\t\t<field name=\"NETWORK_PROBE_HTTP\"/>\n\t\t<field name=\"NETWORK_PROBE_HTTPS\"/>\n\t\t<field name=\"NETWORK_PROBE_PRIVATE_DNS\"/>\n\t\t<field name=\"NETWORK_VALIDATION_RESULT_INVALID\"/>\n\t\t<field name=\"NETWORK_VALIDATION_RESULT_PARTIALLY_VALID\"/>\n\t\t<field name=\"NETWORK_VALIDATION_RESULT_SKIPPED\"/>\n\t\t<field name=\"NETWORK_VALIDATION_RESULT_VALID\"/>\n\t</class>\n\t<class name=\"android/net/ConnectivityDiagnosticsManager$DataStallReport\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/Network;JILandroid/net/LinkProperties;Landroid/net/NetworkCapabilities;Landroid/os/PersistableBundle;)V\"/>\n\t\t<method name=\"getDetectionMethod()I\"/>\n\t\t<method name=\"getLinkProperties()Landroid/net/LinkProperties;\"/>\n\t\t<method name=\"getNetwork()Landroid/net/Network;\"/>\n\t\t<method name=\"getNetworkCapabilities()Landroid/net/NetworkCapabilities;\"/>\n\t\t<method name=\"getReportTimestamp()J\"/>\n\t\t<method name=\"getStallDetails()Landroid/os/PersistableBundle;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"DETECTION_METHOD_DNS_EVENTS\"/>\n\t\t<field name=\"DETECTION_METHOD_TCP_METRICS\"/>\n\t\t<field name=\"KEY_DNS_CONSECUTIVE_TIMEOUTS\"/>\n\t\t<field name=\"KEY_TCP_METRICS_COLLECTION_PERIOD_MILLIS\"/>\n\t\t<field name=\"KEY_TCP_PACKET_FAIL_RATE\"/>\n\t</class>\n\t<class name=\"android/net/ConnectivityManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addDefaultNetworkActiveListener(Landroid/net/ConnectivityManager$OnNetworkActiveListener;)V\" since=\"21\"/>\n\t\t<method name=\"bindProcessToNetwork(Landroid/net/Network;)Z\" since=\"23\"/>\n\t\t<method name=\"createSocketKeepalive(Landroid/net/Network;Landroid/net/IpSecManager$UdpEncapsulationSocket;Ljava/net/InetAddress;Ljava/net/InetAddress;Ljava/util/concurrent/Executor;Landroid/net/SocketKeepalive$Callback;)Landroid/net/SocketKeepalive;\" since=\"29\"/>\n\t\t<method name=\"getActiveNetwork()Landroid/net/Network;\" since=\"23\"/>\n\t\t<method name=\"getActiveNetworkInfo()Landroid/net/NetworkInfo;\" deprecated=\"29\"/>\n\t\t<method name=\"getAllNetworkInfo()[Landroid/net/NetworkInfo;\" deprecated=\"23\"/>\n\t\t<method name=\"getAllNetworks()[Landroid/net/Network;\" since=\"21\"/>\n\t\t<method name=\"getBackgroundDataSetting()Z\" since=\"3\" deprecated=\"15\"/>\n\t\t<method name=\"getBoundNetworkForProcess()Landroid/net/Network;\" since=\"23\"/>\n\t\t<method name=\"getConnectionOwnerUid(ILjava/net/InetSocketAddress;Ljava/net/InetSocketAddress;)I\" since=\"29\"/>\n\t\t<method name=\"getDefaultProxy()Landroid/net/ProxyInfo;\" since=\"23\"/>\n\t\t<method name=\"getLinkProperties(Landroid/net/Network;)Landroid/net/LinkProperties;\" since=\"21\"/>\n\t\t<method name=\"getMultipathPreference(Landroid/net/Network;)I\" since=\"26\"/>\n\t\t<method name=\"getNetworkCapabilities(Landroid/net/Network;)Landroid/net/NetworkCapabilities;\" since=\"21\"/>\n\t\t<method name=\"getNetworkInfo(I)Landroid/net/NetworkInfo;\" deprecated=\"23\"/>\n\t\t<method name=\"getNetworkInfo(Landroid/net/Network;)Landroid/net/NetworkInfo;\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"getNetworkPreference()I\" deprecated=\"21\"/>\n\t\t<method name=\"getNetworkWatchlistConfigHash()[B\" since=\"28\"/>\n\t\t<method name=\"getProcessDefaultNetwork()Landroid/net/Network;\" since=\"21\" deprecated=\"23\"/>\n\t\t<method name=\"getRestrictBackgroundStatus()I\" since=\"24\"/>\n\t\t<method name=\"isActiveNetworkMetered()Z\" since=\"16\"/>\n\t\t<method name=\"isDefaultNetworkActive()Z\" since=\"21\"/>\n\t\t<method name=\"isNetworkTypeValid(I)Z\" deprecated=\"23\"/>\n\t\t<method name=\"registerDefaultNetworkCallback(Landroid/net/ConnectivityManager$NetworkCallback;)V\" since=\"24\"/>\n\t\t<method name=\"registerDefaultNetworkCallback(Landroid/net/ConnectivityManager$NetworkCallback;Landroid/os/Handler;)V\" since=\"26\"/>\n\t\t<method name=\"registerNetworkCallback(Landroid/net/NetworkRequest;Landroid/app/PendingIntent;)V\" since=\"23\"/>\n\t\t<method name=\"registerNetworkCallback(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;)V\" since=\"21\"/>\n\t\t<method name=\"registerNetworkCallback(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;Landroid/os/Handler;)V\" since=\"26\"/>\n\t\t<method name=\"releaseNetworkRequest(Landroid/app/PendingIntent;)V\" since=\"22\"/>\n\t\t<method name=\"removeDefaultNetworkActiveListener(Landroid/net/ConnectivityManager$OnNetworkActiveListener;)V\" since=\"21\"/>\n\t\t<method name=\"reportBadNetwork(Landroid/net/Network;)V\" since=\"21\" deprecated=\"23\"/>\n\t\t<method name=\"reportNetworkConnectivity(Landroid/net/Network;Z)V\" since=\"23\"/>\n\t\t<method name=\"requestBandwidthUpdate(Landroid/net/Network;)Z\" since=\"23\"/>\n\t\t<method name=\"requestNetwork(Landroid/net/NetworkRequest;Landroid/app/PendingIntent;)V\" since=\"22\"/>\n\t\t<method name=\"requestNetwork(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;)V\" since=\"21\"/>\n\t\t<method name=\"requestNetwork(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;I)V\" since=\"26\"/>\n\t\t<method name=\"requestNetwork(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;Landroid/os/Handler;)V\" since=\"26\"/>\n\t\t<method name=\"requestNetwork(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;Landroid/os/Handler;I)V\" since=\"26\"/>\n\t\t<method name=\"requestRouteToHost(II)Z\" deprecated=\"21\" removed=\"26\"/>\n\t\t<method name=\"setNetworkPreference(I)V\" deprecated=\"21\"/>\n\t\t<method name=\"setProcessDefaultNetwork(Landroid/net/Network;)Z\" since=\"21\" deprecated=\"23\"/>\n\t\t<method name=\"startUsingNetworkFeature(ILjava/lang/String;)I\" deprecated=\"21\" removed=\"26\"/>\n\t\t<method name=\"stopUsingNetworkFeature(ILjava/lang/String;)I\" deprecated=\"21\" removed=\"26\"/>\n\t\t<method name=\"unregisterNetworkCallback(Landroid/app/PendingIntent;)V\" since=\"23\"/>\n\t\t<method name=\"unregisterNetworkCallback(Landroid/net/ConnectivityManager$NetworkCallback;)V\" since=\"21\"/>\n\t\t<field name=\"ACTION_BACKGROUND_DATA_SETTING_CHANGED\" since=\"3\" deprecated=\"16\"/>\n\t\t<field name=\"ACTION_CAPTIVE_PORTAL_SIGN_IN\" since=\"23\"/>\n\t\t<field name=\"ACTION_RESTRICT_BACKGROUND_CHANGED\" since=\"24\"/>\n\t\t<field name=\"CONNECTIVITY_ACTION\" deprecated=\"28\"/>\n\t\t<field name=\"DEFAULT_NETWORK_PREFERENCE\" deprecated=\"18\"/>\n\t\t<field name=\"EXTRA_CAPTIVE_PORTAL\" since=\"23\"/>\n\t\t<field name=\"EXTRA_CAPTIVE_PORTAL_URL\" since=\"24\"/>\n\t\t<field name=\"EXTRA_EXTRA_INFO\" deprecated=\"29\"/>\n\t\t<field name=\"EXTRA_IS_FAILOVER\" deprecated=\"29\"/>\n\t\t<field name=\"EXTRA_NETWORK\" since=\"22\"/>\n\t\t<field name=\"EXTRA_NETWORK_INFO\" deprecated=\"15\"/>\n\t\t<field name=\"EXTRA_NETWORK_REQUEST\" since=\"22\"/>\n\t\t<field name=\"EXTRA_NETWORK_TYPE\" since=\"17\" deprecated=\"29\"/>\n\t\t<field name=\"EXTRA_NO_CONNECTIVITY\"/>\n\t\t<field name=\"EXTRA_OTHER_NETWORK_INFO\" deprecated=\"29\"/>\n\t\t<field name=\"EXTRA_REASON\"/>\n\t\t<field name=\"MULTIPATH_PREFERENCE_HANDOVER\" since=\"26\"/>\n\t\t<field name=\"MULTIPATH_PREFERENCE_PERFORMANCE\" since=\"26\"/>\n\t\t<field name=\"MULTIPATH_PREFERENCE_RELIABILITY\" since=\"26\"/>\n\t\t<field name=\"RESTRICT_BACKGROUND_STATUS_DISABLED\" since=\"24\"/>\n\t\t<field name=\"RESTRICT_BACKGROUND_STATUS_ENABLED\" since=\"24\"/>\n\t\t<field name=\"RESTRICT_BACKGROUND_STATUS_WHITELISTED\" since=\"24\"/>\n\t\t<field name=\"TYPE_BLUETOOTH\" since=\"13\" deprecated=\"28\"/>\n\t\t<field name=\"TYPE_DUMMY\" since=\"14\" deprecated=\"28\"/>\n\t\t<field name=\"TYPE_ETHERNET\" since=\"13\" deprecated=\"28\"/>\n\t\t<field name=\"TYPE_MOBILE\" deprecated=\"28\"/>\n\t\t<field name=\"TYPE_MOBILE_DUN\" since=\"8\" deprecated=\"28\"/>\n\t\t<field name=\"TYPE_MOBILE_HIPRI\" since=\"8\" deprecated=\"23\"/>\n\t\t<field name=\"TYPE_MOBILE_MMS\" since=\"8\" deprecated=\"23\"/>\n\t\t<field name=\"TYPE_MOBILE_SUPL\" since=\"8\" deprecated=\"23\"/>\n\t\t<field name=\"TYPE_VPN\" since=\"21\" deprecated=\"28\"/>\n\t\t<field name=\"TYPE_WIFI\" deprecated=\"28\"/>\n\t\t<field name=\"TYPE_WIMAX\" since=\"8\" deprecated=\"28\"/>\n\t</class>\n\t<class name=\"android/net/ConnectivityManager$NetworkCallback\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onAvailable(Landroid/net/Network;)V\"/>\n\t\t<method name=\"onBlockedStatusChanged(Landroid/net/Network;Z)V\" since=\"29\"/>\n\t\t<method name=\"onCapabilitiesChanged(Landroid/net/Network;Landroid/net/NetworkCapabilities;)V\"/>\n\t\t<method name=\"onLinkPropertiesChanged(Landroid/net/Network;Landroid/net/LinkProperties;)V\"/>\n\t\t<method name=\"onLosing(Landroid/net/Network;I)V\"/>\n\t\t<method name=\"onLost(Landroid/net/Network;)V\"/>\n\t\t<method name=\"onUnavailable()V\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/net/ConnectivityManager$OnNetworkActiveListener\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onNetworkActive()V\"/>\n\t</class>\n\t<class name=\"android/net/Credentials\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"getGid()I\"/>\n\t\t<method name=\"getPid()I\"/>\n\t\t<method name=\"getUid()I\"/>\n\t</class>\n\t<class name=\"android/net/DhcpInfo\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"CREATOR\" since=\"30\"/>\n\t\t<field name=\"dns1\"/>\n\t\t<field name=\"dns2\"/>\n\t\t<field name=\"gateway\"/>\n\t\t<field name=\"ipAddress\"/>\n\t\t<field name=\"leaseDuration\"/>\n\t\t<field name=\"netmask\"/>\n\t\t<field name=\"serverAddress\"/>\n\t</class>\n\t<class name=\"android/net/DnsResolver\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getInstance()Landroid/net/DnsResolver;\"/>\n\t\t<method name=\"query(Landroid/net/Network;Ljava/lang/String;IILjava/util/concurrent/Executor;Landroid/os/CancellationSignal;Landroid/net/DnsResolver$Callback;)V\"/>\n\t\t<method name=\"query(Landroid/net/Network;Ljava/lang/String;ILjava/util/concurrent/Executor;Landroid/os/CancellationSignal;Landroid/net/DnsResolver$Callback;)V\"/>\n\t\t<method name=\"rawQuery(Landroid/net/Network;Ljava/lang/String;IIILjava/util/concurrent/Executor;Landroid/os/CancellationSignal;Landroid/net/DnsResolver$Callback;)V\"/>\n\t\t<method name=\"rawQuery(Landroid/net/Network;[BILjava/util/concurrent/Executor;Landroid/os/CancellationSignal;Landroid/net/DnsResolver$Callback;)V\"/>\n\t\t<field name=\"CLASS_IN\"/>\n\t\t<field name=\"ERROR_PARSE\"/>\n\t\t<field name=\"ERROR_SYSTEM\"/>\n\t\t<field name=\"FLAG_EMPTY\"/>\n\t\t<field name=\"FLAG_NO_CACHE_LOOKUP\"/>\n\t\t<field name=\"FLAG_NO_CACHE_STORE\"/>\n\t\t<field name=\"FLAG_NO_RETRY\"/>\n\t\t<field name=\"TYPE_A\"/>\n\t\t<field name=\"TYPE_AAAA\"/>\n\t</class>\n\t<class name=\"android/net/DnsResolver$Callback\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onAnswer(Ljava/lang/Object;I)V\"/>\n\t\t<method name=\"onError(Landroid/net/DnsResolver$DnsException;)V\"/>\n\t</class>\n\t<class name=\"android/net/DnsResolver$DnsException\" since=\"29\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<field name=\"code\"/>\n\t</class>\n\t<class name=\"android/net/Ikev2VpnProfile\" since=\"30\">\n\t\t<extends name=\"android/net/PlatformVpnProfile\"/>\n\t\t<method name=\"getAllowedAlgorithms()Ljava/util/List;\"/>\n\t\t<method name=\"getMaxMtu()I\"/>\n\t\t<method name=\"getPassword()Ljava/lang/String;\"/>\n\t\t<method name=\"getPresharedKey()[B\"/>\n\t\t<method name=\"getProxyInfo()Landroid/net/ProxyInfo;\"/>\n\t\t<method name=\"getRsaPrivateKey()Ljava/security/PrivateKey;\"/>\n\t\t<method name=\"getServerAddr()Ljava/lang/String;\"/>\n\t\t<method name=\"getServerRootCaCert()Ljava/security/cert/X509Certificate;\"/>\n\t\t<method name=\"getUserCert()Ljava/security/cert/X509Certificate;\"/>\n\t\t<method name=\"getUserIdentity()Ljava/lang/String;\"/>\n\t\t<method name=\"getUsername()Ljava/lang/String;\"/>\n\t\t<method name=\"isBypassable()Z\"/>\n\t\t<method name=\"isMetered()Z\"/>\n\t</class>\n\t<class name=\"android/net/Ikev2VpnProfile$Builder\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"build()Landroid/net/Ikev2VpnProfile;\"/>\n\t\t<method name=\"setAllowedAlgorithms(Ljava/util/List;)Landroid/net/Ikev2VpnProfile$Builder;\"/>\n\t\t<method name=\"setAuthDigitalSignature(Ljava/security/cert/X509Certificate;Ljava/security/PrivateKey;Ljava/security/cert/X509Certificate;)Landroid/net/Ikev2VpnProfile$Builder;\"/>\n\t\t<method name=\"setAuthPsk([B)Landroid/net/Ikev2VpnProfile$Builder;\"/>\n\t\t<method name=\"setAuthUsernamePassword(Ljava/lang/String;Ljava/lang/String;Ljava/security/cert/X509Certificate;)Landroid/net/Ikev2VpnProfile$Builder;\"/>\n\t\t<method name=\"setBypassable(Z)Landroid/net/Ikev2VpnProfile$Builder;\"/>\n\t\t<method name=\"setMaxMtu(I)Landroid/net/Ikev2VpnProfile$Builder;\"/>\n\t\t<method name=\"setMetered(Z)Landroid/net/Ikev2VpnProfile$Builder;\"/>\n\t\t<method name=\"setProxy(Landroid/net/ProxyInfo;)Landroid/net/Ikev2VpnProfile$Builder;\"/>\n\t</class>\n\t<class name=\"android/net/InetAddresses\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"isNumericAddress(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"parseNumericAddress(Ljava/lang/String;)Ljava/net/InetAddress;\"/>\n\t</class>\n\t<class name=\"android/net/IpPrefix\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"contains(Ljava/net/InetAddress;)Z\" since=\"23\"/>\n\t\t<method name=\"getAddress()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getPrefixLength()I\"/>\n\t\t<method name=\"getRawAddress()[B\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/IpSecAlgorithm\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;[B)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;[BI)V\"/>\n\t\t<method name=\"getKey()[B\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getTruncationLengthBits()I\"/>\n\t\t<field name=\"AUTH_CRYPT_AES_GCM\"/>\n\t\t<field name=\"AUTH_HMAC_MD5\"/>\n\t\t<field name=\"AUTH_HMAC_SHA1\"/>\n\t\t<field name=\"AUTH_HMAC_SHA256\"/>\n\t\t<field name=\"AUTH_HMAC_SHA384\"/>\n\t\t<field name=\"AUTH_HMAC_SHA512\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"CRYPT_AES_CBC\"/>\n\t</class>\n\t<class name=\"android/net/IpSecManager\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"allocateSecurityParameterIndex(Ljava/net/InetAddress;)Landroid/net/IpSecManager$SecurityParameterIndex;\"/>\n\t\t<method name=\"allocateSecurityParameterIndex(Ljava/net/InetAddress;I)Landroid/net/IpSecManager$SecurityParameterIndex;\"/>\n\t\t<method name=\"applyTransportModeTransform(Ljava/io/FileDescriptor;ILandroid/net/IpSecTransform;)V\"/>\n\t\t<method name=\"applyTransportModeTransform(Ljava/net/DatagramSocket;ILandroid/net/IpSecTransform;)V\"/>\n\t\t<method name=\"applyTransportModeTransform(Ljava/net/Socket;ILandroid/net/IpSecTransform;)V\"/>\n\t\t<method name=\"openUdpEncapsulationSocket()Landroid/net/IpSecManager$UdpEncapsulationSocket;\"/>\n\t\t<method name=\"openUdpEncapsulationSocket(I)Landroid/net/IpSecManager$UdpEncapsulationSocket;\"/>\n\t\t<method name=\"removeTransportModeTransforms(Ljava/io/FileDescriptor;)V\"/>\n\t\t<method name=\"removeTransportModeTransforms(Ljava/net/DatagramSocket;)V\"/>\n\t\t<method name=\"removeTransportModeTransforms(Ljava/net/Socket;)V\"/>\n\t\t<field name=\"DIRECTION_IN\"/>\n\t\t<field name=\"DIRECTION_OUT\"/>\n\t</class>\n\t<class name=\"android/net/IpSecManager$ResourceUnavailableException\" since=\"28\">\n\t\t<extends name=\"android/util/AndroidException\"/>\n\t</class>\n\t<class name=\"android/net/IpSecManager$SecurityParameterIndex\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"getSpi()I\"/>\n\t</class>\n\t<class name=\"android/net/IpSecManager$SpiUnavailableException\" since=\"28\">\n\t\t<extends name=\"android/util/AndroidException\"/>\n\t\t<method name=\"getSpi()I\"/>\n\t</class>\n\t<class name=\"android/net/IpSecManager$UdpEncapsulationSocket\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"getFileDescriptor()Ljava/io/FileDescriptor;\"/>\n\t\t<method name=\"getPort()I\"/>\n\t</class>\n\t<class name=\"android/net/IpSecTransform\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t</class>\n\t<class name=\"android/net/IpSecTransform$Builder\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"buildTransportModeTransform(Ljava/net/InetAddress;Landroid/net/IpSecManager$SecurityParameterIndex;)Landroid/net/IpSecTransform;\"/>\n\t\t<method name=\"setAuthenticatedEncryption(Landroid/net/IpSecAlgorithm;)Landroid/net/IpSecTransform$Builder;\"/>\n\t\t<method name=\"setAuthentication(Landroid/net/IpSecAlgorithm;)Landroid/net/IpSecTransform$Builder;\"/>\n\t\t<method name=\"setEncryption(Landroid/net/IpSecAlgorithm;)Landroid/net/IpSecTransform$Builder;\"/>\n\t\t<method name=\"setIpv4Encapsulation(Landroid/net/IpSecManager$UdpEncapsulationSocket;I)Landroid/net/IpSecTransform$Builder;\"/>\n\t</class>\n\t<class name=\"android/net/LinkAddress\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getAddress()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getFlags()I\"/>\n\t\t<method name=\"getPrefixLength()I\"/>\n\t\t<method name=\"getScope()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/LinkProperties\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\" since=\"29\"/>\n\t\t<method name=\"addRoute(Landroid/net/RouteInfo;)Z\" since=\"29\"/>\n\t\t<method name=\"clear()V\" since=\"29\"/>\n\t\t<method name=\"getDhcpServerAddress()Ljava/net/Inet4Address;\" since=\"30\"/>\n\t\t<method name=\"getDnsServers()Ljava/util/List;\"/>\n\t\t<method name=\"getDomains()Ljava/lang/String;\"/>\n\t\t<method name=\"getHttpProxy()Landroid/net/ProxyInfo;\"/>\n\t\t<method name=\"getInterfaceName()Ljava/lang/String;\"/>\n\t\t<method name=\"getLinkAddresses()Ljava/util/List;\"/>\n\t\t<method name=\"getMtu()I\" since=\"29\"/>\n\t\t<method name=\"getNat64Prefix()Landroid/net/IpPrefix;\" since=\"30\"/>\n\t\t<method name=\"getPrivateDnsServerName()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getRoutes()Ljava/util/List;\"/>\n\t\t<method name=\"isPrivateDnsActive()Z\" since=\"28\"/>\n\t\t<method name=\"isWakeOnLanSupported()Z\" since=\"30\"/>\n\t\t<method name=\"setDhcpServerAddress(Ljava/net/Inet4Address;)V\" since=\"30\"/>\n\t\t<method name=\"setDnsServers(Ljava/util/Collection;)V\" since=\"29\"/>\n\t\t<method name=\"setDomains(Ljava/lang/String;)V\" since=\"29\"/>\n\t\t<method name=\"setHttpProxy(Landroid/net/ProxyInfo;)V\" since=\"29\"/>\n\t\t<method name=\"setInterfaceName(Ljava/lang/String;)V\" since=\"29\"/>\n\t\t<method name=\"setLinkAddresses(Ljava/util/Collection;)V\" since=\"29\"/>\n\t\t<method name=\"setMtu(I)V\" since=\"29\"/>\n\t\t<method name=\"setNat64Prefix(Landroid/net/IpPrefix;)V\" since=\"30\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/LocalServerSocket\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\" since=\"28\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/FileDescriptor;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"accept()Landroid/net/LocalSocket;\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"getFileDescriptor()Ljava/io/FileDescriptor;\"/>\n\t\t<method name=\"getLocalSocketAddress()Landroid/net/LocalSocketAddress;\"/>\n\t</class>\n\t<class name=\"android/net/LocalSocket\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\" since=\"17\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\" since=\"19\"/>\n\t\t<method name=\"bind(Landroid/net/LocalSocketAddress;)V\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"connect(Landroid/net/LocalSocketAddress;)V\"/>\n\t\t<method name=\"connect(Landroid/net/LocalSocketAddress;I)V\"/>\n\t\t<method name=\"getAncillaryFileDescriptors()[Ljava/io/FileDescriptor;\"/>\n\t\t<method name=\"getFileDescriptor()Ljava/io/FileDescriptor;\"/>\n\t\t<method name=\"getInputStream()Ljava/io/InputStream;\"/>\n\t\t<method name=\"getLocalSocketAddress()Landroid/net/LocalSocketAddress;\"/>\n\t\t<method name=\"getOutputStream()Ljava/io/OutputStream;\"/>\n\t\t<method name=\"getPeerCredentials()Landroid/net/Credentials;\"/>\n\t\t<method name=\"getReceiveBufferSize()I\"/>\n\t\t<method name=\"getRemoteSocketAddress()Landroid/net/LocalSocketAddress;\"/>\n\t\t<method name=\"getSendBufferSize()I\"/>\n\t\t<method name=\"getSoTimeout()I\"/>\n\t\t<method name=\"isBound()Z\"/>\n\t\t<method name=\"isClosed()Z\"/>\n\t\t<method name=\"isConnected()Z\"/>\n\t\t<method name=\"isInputShutdown()Z\"/>\n\t\t<method name=\"isOutputShutdown()Z\"/>\n\t\t<method name=\"setFileDescriptorsForSend([Ljava/io/FileDescriptor;)V\"/>\n\t\t<method name=\"setReceiveBufferSize(I)V\"/>\n\t\t<method name=\"setSendBufferSize(I)V\"/>\n\t\t<method name=\"setSoTimeout(I)V\"/>\n\t\t<method name=\"shutdownInput()V\"/>\n\t\t<method name=\"shutdownOutput()V\"/>\n\t\t<field name=\"SOCKET_DGRAM\" since=\"19\"/>\n\t\t<field name=\"SOCKET_SEQPACKET\" since=\"19\"/>\n\t\t<field name=\"SOCKET_STREAM\" since=\"19\"/>\n\t</class>\n\t<class name=\"android/net/LocalSocketAddress\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Landroid/net/LocalSocketAddress$Namespace;)V\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getNamespace()Landroid/net/LocalSocketAddress$Namespace;\"/>\n\t</class>\n\t<class name=\"android/net/LocalSocketAddress$Namespace\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/net/LocalSocketAddress$Namespace;\"/>\n\t\t<method name=\"values()[Landroid/net/LocalSocketAddress$Namespace;\"/>\n\t\t<field name=\"ABSTRACT\"/>\n\t\t<field name=\"FILESYSTEM\"/>\n\t\t<field name=\"RESERVED\"/>\n\t</class>\n\t<class name=\"android/net/MacAddress\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"fromBytes([B)Landroid/net/MacAddress;\"/>\n\t\t<method name=\"fromString(Ljava/lang/String;)Landroid/net/MacAddress;\"/>\n\t\t<method name=\"getAddressType()I\"/>\n\t\t<method name=\"getLinkLocalIpv6FromEui48Mac()Ljava/net/Inet6Address;\" since=\"30\"/>\n\t\t<method name=\"isLocallyAssigned()Z\"/>\n\t\t<method name=\"matches(Landroid/net/MacAddress;Landroid/net/MacAddress;)Z\" since=\"30\"/>\n\t\t<method name=\"toByteArray()[B\"/>\n\t\t<method name=\"toOuiString()Ljava/lang/String;\"/>\n\t\t<field name=\"BROADCAST_ADDRESS\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"TYPE_BROADCAST\"/>\n\t\t<field name=\"TYPE_MULTICAST\"/>\n\t\t<field name=\"TYPE_UNICAST\"/>\n\t</class>\n\t<class name=\"android/net/MailTo\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getBody()Ljava/lang/String;\"/>\n\t\t<method name=\"getCc()Ljava/lang/String;\"/>\n\t\t<method name=\"getHeaders()Ljava/util/Map;\"/>\n\t\t<method name=\"getSubject()Ljava/lang/String;\"/>\n\t\t<method name=\"getTo()Ljava/lang/String;\"/>\n\t\t<method name=\"isMailTo(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"parse(Ljava/lang/String;)Landroid/net/MailTo;\"/>\n\t\t<field name=\"MAILTO_SCHEME\"/>\n\t</class>\n\t<class name=\"android/net/Network\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"bindSocket(Ljava/io/FileDescriptor;)V\" since=\"23\"/>\n\t\t<method name=\"bindSocket(Ljava/net/DatagramSocket;)V\" since=\"22\"/>\n\t\t<method name=\"bindSocket(Ljava/net/Socket;)V\"/>\n\t\t<method name=\"fromNetworkHandle(J)Landroid/net/Network;\" since=\"28\"/>\n\t\t<method name=\"getAllByName(Ljava/lang/String;)[Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getByName(Ljava/lang/String;)Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getNetworkHandle()J\" since=\"23\"/>\n\t\t<method name=\"getSocketFactory()Ljavax/net/SocketFactory;\"/>\n\t\t<method name=\"openConnection(Ljava/net/URL;)Ljava/net/URLConnection;\"/>\n\t\t<method name=\"openConnection(Ljava/net/URL;Ljava/net/Proxy;)Ljava/net/URLConnection;\" since=\"23\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/NetworkCapabilities\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\" since=\"30\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/NetworkCapabilities;)V\"/>\n\t\t<method name=\"getLinkDownstreamBandwidthKbps()I\"/>\n\t\t<method name=\"getLinkUpstreamBandwidthKbps()I\"/>\n\t\t<method name=\"getNetworkSpecifier()Landroid/net/NetworkSpecifier;\" since=\"30\"/>\n\t\t<method name=\"getOwnerUid()I\" since=\"30\"/>\n\t\t<method name=\"getSignalStrength()I\" since=\"29\"/>\n\t\t<method name=\"getTransportInfo()Landroid/net/TransportInfo;\" since=\"29\"/>\n\t\t<method name=\"hasCapability(I)Z\"/>\n\t\t<method name=\"hasTransport(I)Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"NET_CAPABILITY_CAPTIVE_PORTAL\" since=\"23\"/>\n\t\t<field name=\"NET_CAPABILITY_CBS\"/>\n\t\t<field name=\"NET_CAPABILITY_DUN\"/>\n\t\t<field name=\"NET_CAPABILITY_EIMS\"/>\n\t\t<field name=\"NET_CAPABILITY_FOREGROUND\" since=\"28\"/>\n\t\t<field name=\"NET_CAPABILITY_FOTA\"/>\n\t\t<field name=\"NET_CAPABILITY_IA\"/>\n\t\t<field name=\"NET_CAPABILITY_IMS\"/>\n\t\t<field name=\"NET_CAPABILITY_INTERNET\"/>\n\t\t<field name=\"NET_CAPABILITY_MCX\" since=\"29\"/>\n\t\t<field name=\"NET_CAPABILITY_MMS\"/>\n\t\t<field name=\"NET_CAPABILITY_NOT_CONGESTED\" since=\"28\"/>\n\t\t<field name=\"NET_CAPABILITY_NOT_METERED\"/>\n\t\t<field name=\"NET_CAPABILITY_NOT_RESTRICTED\"/>\n\t\t<field name=\"NET_CAPABILITY_NOT_ROAMING\" since=\"28\"/>\n\t\t<field name=\"NET_CAPABILITY_NOT_SUSPENDED\" since=\"28\"/>\n\t\t<field name=\"NET_CAPABILITY_NOT_VPN\"/>\n\t\t<field name=\"NET_CAPABILITY_RCS\"/>\n\t\t<field name=\"NET_CAPABILITY_SUPL\"/>\n\t\t<field name=\"NET_CAPABILITY_TEMPORARILY_NOT_METERED\" since=\"30\"/>\n\t\t<field name=\"NET_CAPABILITY_TRUSTED\"/>\n\t\t<field name=\"NET_CAPABILITY_VALIDATED\" since=\"23\"/>\n\t\t<field name=\"NET_CAPABILITY_WIFI_P2P\"/>\n\t\t<field name=\"NET_CAPABILITY_XCAP\"/>\n\t\t<field name=\"SIGNAL_STRENGTH_UNSPECIFIED\" since=\"29\"/>\n\t\t<field name=\"TRANSPORT_BLUETOOTH\"/>\n\t\t<field name=\"TRANSPORT_CELLULAR\"/>\n\t\t<field name=\"TRANSPORT_ETHERNET\"/>\n\t\t<field name=\"TRANSPORT_LOWPAN\" since=\"27\"/>\n\t\t<field name=\"TRANSPORT_VPN\"/>\n\t\t<field name=\"TRANSPORT_WIFI\"/>\n\t\t<field name=\"TRANSPORT_WIFI_AWARE\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/net/NetworkInfo\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(I)V\" removed=\"3\"/>\n\t\t<method name=\"&lt;init>(IILjava/lang/String;Ljava/lang/String;)V\" since=\"30\" deprecated=\"30\"/>\n\t\t<method name=\"getDetailedState()Landroid/net/NetworkInfo$DetailedState;\" deprecated=\"29\"/>\n\t\t<method name=\"getExtraInfo()Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getReason()Ljava/lang/String;\" deprecated=\"28\"/>\n\t\t<method name=\"getState()Landroid/net/NetworkInfo$State;\" deprecated=\"28\"/>\n\t\t<method name=\"getSubtype()I\" since=\"3\" deprecated=\"29\"/>\n\t\t<method name=\"getSubtypeName()Ljava/lang/String;\" since=\"3\" deprecated=\"29\"/>\n\t\t<method name=\"getType()I\" deprecated=\"28\"/>\n\t\t<method name=\"getTypeName()Ljava/lang/String;\" deprecated=\"28\"/>\n\t\t<method name=\"isAvailable()Z\" deprecated=\"28\"/>\n\t\t<method name=\"isConnected()Z\" deprecated=\"29\"/>\n\t\t<method name=\"isConnectedOrConnecting()Z\" deprecated=\"28\"/>\n\t\t<method name=\"isFailover()Z\" deprecated=\"28\"/>\n\t\t<method name=\"isRoaming()Z\" since=\"3\" deprecated=\"28\"/>\n\t\t<method name=\"setDetailedState(Landroid/net/NetworkInfo$DetailedState;Ljava/lang/String;Ljava/lang/String;)V\" since=\"30\" deprecated=\"30\"/>\n\t\t<field name=\"CREATOR\" since=\"24\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/net/NetworkInfo$DetailedState\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/net/NetworkInfo$DetailedState;\"/>\n\t\t<method name=\"values()[Landroid/net/NetworkInfo$DetailedState;\"/>\n\t\t<field name=\"AUTHENTICATING\" deprecated=\"29\"/>\n\t\t<field name=\"BLOCKED\" since=\"14\" deprecated=\"29\"/>\n\t\t<field name=\"CAPTIVE_PORTAL_CHECK\" since=\"17\" deprecated=\"29\"/>\n\t\t<field name=\"CONNECTED\" deprecated=\"29\"/>\n\t\t<field name=\"CONNECTING\" deprecated=\"29\"/>\n\t\t<field name=\"DISCONNECTED\" deprecated=\"29\"/>\n\t\t<field name=\"DISCONNECTING\" deprecated=\"29\"/>\n\t\t<field name=\"FAILED\" deprecated=\"29\"/>\n\t\t<field name=\"IDLE\" deprecated=\"29\"/>\n\t\t<field name=\"OBTAINING_IPADDR\" deprecated=\"29\"/>\n\t\t<field name=\"SCANNING\" deprecated=\"29\"/>\n\t\t<field name=\"SUSPENDED\" deprecated=\"29\"/>\n\t\t<field name=\"VERIFYING_POOR_LINK\" since=\"16\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/net/NetworkInfo$State\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/net/NetworkInfo$State;\"/>\n\t\t<method name=\"values()[Landroid/net/NetworkInfo$State;\"/>\n\t\t<field name=\"CONNECTED\" deprecated=\"29\"/>\n\t\t<field name=\"CONNECTING\" deprecated=\"29\"/>\n\t\t<field name=\"DISCONNECTED\" deprecated=\"29\"/>\n\t\t<field name=\"DISCONNECTING\" deprecated=\"29\"/>\n\t\t<field name=\"SUSPENDED\" deprecated=\"29\"/>\n\t\t<field name=\"UNKNOWN\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/net/NetworkRequest\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"canBeSatisfiedBy(Landroid/net/NetworkCapabilities;)Z\" since=\"30\"/>\n\t\t<method name=\"getNetworkSpecifier()Landroid/net/NetworkSpecifier;\" since=\"30\"/>\n\t\t<method name=\"hasCapability(I)Z\" since=\"28\"/>\n\t\t<method name=\"hasTransport(I)Z\" since=\"28\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/NetworkRequest$Builder\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addCapability(I)Landroid/net/NetworkRequest$Builder;\"/>\n\t\t<method name=\"addTransportType(I)Landroid/net/NetworkRequest$Builder;\"/>\n\t\t<method name=\"build()Landroid/net/NetworkRequest;\"/>\n\t\t<method name=\"clearCapabilities()Landroid/net/NetworkRequest$Builder;\" since=\"30\"/>\n\t\t<method name=\"removeCapability(I)Landroid/net/NetworkRequest$Builder;\"/>\n\t\t<method name=\"removeTransportType(I)Landroid/net/NetworkRequest$Builder;\"/>\n\t\t<method name=\"setNetworkSpecifier(Landroid/net/NetworkSpecifier;)Landroid/net/NetworkRequest$Builder;\" since=\"26\"/>\n\t\t<method name=\"setNetworkSpecifier(Ljava/lang/String;)Landroid/net/NetworkRequest$Builder;\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/net/NetworkSpecifier\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/net/ParseException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<field name=\"response\"/>\n\t</class>\n\t<class name=\"android/net/PlatformVpnProfile\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<method name=\"getTypeString()Ljava/lang/String;\"/>\n\t\t<field name=\"TYPE_IKEV2_IPSEC_PSK\"/>\n\t\t<field name=\"TYPE_IKEV2_IPSEC_RSA\"/>\n\t\t<field name=\"TYPE_IKEV2_IPSEC_USER_PASS\"/>\n\t</class>\n\t<class name=\"android/net/Proxy\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getDefaultHost()Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"getDefaultPort()I\" deprecated=\"15\"/>\n\t\t<method name=\"getHost(Landroid/content/Context;)Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"getPort(Landroid/content/Context;)I\" deprecated=\"15\"/>\n\t\t<field name=\"EXTRA_PROXY_INFO\" since=\"21\" deprecated=\"23\"/>\n\t\t<field name=\"PROXY_CHANGE_ACTION\"/>\n\t</class>\n\t<class name=\"android/net/ProxyInfo\" since=\"21\" deprecated=\"22\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/ProxyInfo;)V\" since=\"30\"/>\n\t\t<method name=\"buildDirectProxy(Ljava/lang/String;I)Landroid/net/ProxyInfo;\"/>\n\t\t<method name=\"buildDirectProxy(Ljava/lang/String;ILjava/util/List;)Landroid/net/ProxyInfo;\"/>\n\t\t<method name=\"buildPacProxy(Landroid/net/Uri;)Landroid/net/ProxyInfo;\"/>\n\t\t<method name=\"buildPacProxy(Landroid/net/Uri;I)Landroid/net/ProxyInfo;\" since=\"30\"/>\n\t\t<method name=\"getExclusionList()[Ljava/lang/String;\"/>\n\t\t<method name=\"getHost()Ljava/lang/String;\"/>\n\t\t<method name=\"getPacFileUrl()Landroid/net/Uri;\"/>\n\t\t<method name=\"getPort()I\"/>\n\t\t<method name=\"isValid()Z\" since=\"30\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/PskKeyManager\" since=\"21\" removed=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"chooseClientKeyIdentity(Ljava/lang/String;Ljava/net/Socket;)Ljava/lang/String;\"/>\n\t\t<method name=\"chooseClientKeyIdentity(Ljava/lang/String;Ljavax/net/ssl/SSLEngine;)Ljava/lang/String;\"/>\n\t\t<method name=\"chooseServerKeyIdentityHint(Ljava/net/Socket;)Ljava/lang/String;\"/>\n\t\t<method name=\"chooseServerKeyIdentityHint(Ljavax/net/ssl/SSLEngine;)Ljava/lang/String;\"/>\n\t\t<method name=\"getKey(Ljava/lang/String;Ljava/lang/String;Ljava/net/Socket;)Ljavax/crypto/SecretKey;\"/>\n\t\t<method name=\"getKey(Ljava/lang/String;Ljava/lang/String;Ljavax/net/ssl/SSLEngine;)Ljavax/crypto/SecretKey;\"/>\n\t\t<field name=\"MAX_IDENTITY_HINT_LENGTH_BYTES\"/>\n\t\t<field name=\"MAX_IDENTITY_LENGTH_BYTES\"/>\n\t\t<field name=\"MAX_KEY_LENGTH_BYTES\"/>\n\t</class>\n\t<class name=\"android/net/RouteInfo\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getDestination()Landroid/net/IpPrefix;\"/>\n\t\t<method name=\"getGateway()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getInterface()Ljava/lang/String;\"/>\n\t\t<method name=\"hasGateway()Z\" since=\"29\"/>\n\t\t<method name=\"isDefaultRoute()Z\"/>\n\t\t<method name=\"matches(Ljava/net/InetAddress;)Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/SSLCertificateSocketFactory\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"javax/net/ssl/SSLSocketFactory\"/>\n\t\t<method name=\"&lt;init>(I)V\" deprecated=\"15\"/>\n\t\t<method name=\"getDefault(I)Ljavax/net/SocketFactory;\" deprecated=\"29\"/>\n\t\t<method name=\"getDefault(ILandroid/net/SSLSessionCache;)Ljavax/net/ssl/SSLSocketFactory;\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"getHttpSocketFactory(ILandroid/net/SSLSessionCache;)Lorg/apache/http/conn/ssl/SSLSocketFactory;\" since=\"8\" deprecated=\"22\" removed=\"23\"/>\n\t\t<method name=\"getInsecure(ILandroid/net/SSLSessionCache;)Ljavax/net/ssl/SSLSocketFactory;\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"getNpnSelectedProtocol(Ljava/net/Socket;)[B\" since=\"16\" deprecated=\"29\"/>\n\t\t<method name=\"setHostname(Ljava/net/Socket;Ljava/lang/String;)V\" since=\"17\" deprecated=\"29\"/>\n\t\t<method name=\"setKeyManagers([Ljavax/net/ssl/KeyManager;)V\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"setNpnProtocols([[B)V\" since=\"16\" deprecated=\"29\"/>\n\t\t<method name=\"setTrustManagers([Ljavax/net/ssl/TrustManager;)V\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"setUseSessionTickets(Ljava/net/Socket;Z)V\" since=\"17\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/net/SSLSessionCache\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;)V\"/>\n\t</class>\n\t<class name=\"android/net/SocketKeepalive\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"start(I)V\"/>\n\t\t<method name=\"stop()V\"/>\n\t\t<field name=\"ERROR_HARDWARE_ERROR\"/>\n\t\t<field name=\"ERROR_INSUFFICIENT_RESOURCES\"/>\n\t\t<field name=\"ERROR_INVALID_INTERVAL\"/>\n\t\t<field name=\"ERROR_INVALID_IP_ADDRESS\"/>\n\t\t<field name=\"ERROR_INVALID_LENGTH\"/>\n\t\t<field name=\"ERROR_INVALID_NETWORK\"/>\n\t\t<field name=\"ERROR_INVALID_PORT\"/>\n\t\t<field name=\"ERROR_INVALID_SOCKET\"/>\n\t\t<field name=\"ERROR_SOCKET_NOT_IDLE\"/>\n\t\t<field name=\"ERROR_UNSUPPORTED\"/>\n\t</class>\n\t<class name=\"android/net/SocketKeepalive$Callback\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onDataReceived()V\"/>\n\t\t<method name=\"onError(I)V\"/>\n\t\t<method name=\"onStarted()V\"/>\n\t\t<method name=\"onStopped()V\"/>\n\t</class>\n\t<class name=\"android/net/TelephonyNetworkSpecifier\" since=\"30\">\n\t\t<extends name=\"android/net/NetworkSpecifier\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getSubscriptionId()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/TelephonyNetworkSpecifier$Builder\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/net/TelephonyNetworkSpecifier;\"/>\n\t\t<method name=\"setSubscriptionId(I)Landroid/net/TelephonyNetworkSpecifier$Builder;\"/>\n\t</class>\n\t<class name=\"android/net/TrafficStats\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"clearThreadStatsTag()V\" since=\"14\"/>\n\t\t<method name=\"clearThreadStatsUid()V\" since=\"28\"/>\n\t\t<method name=\"getAndSetThreadStatsTag(I)I\" since=\"26\"/>\n\t\t<method name=\"getMobileRxBytes()J\"/>\n\t\t<method name=\"getMobileRxPackets()J\"/>\n\t\t<method name=\"getMobileTxBytes()J\"/>\n\t\t<method name=\"getMobileTxPackets()J\"/>\n\t\t<method name=\"getRxPackets(Ljava/lang/String;)J\" since=\"30\"/>\n\t\t<method name=\"getThreadStatsTag()I\" since=\"14\"/>\n\t\t<method name=\"getThreadStatsUid()I\" since=\"28\"/>\n\t\t<method name=\"getTotalRxBytes()J\"/>\n\t\t<method name=\"getTotalRxPackets()J\"/>\n\t\t<method name=\"getTotalTxBytes()J\"/>\n\t\t<method name=\"getTotalTxPackets()J\"/>\n\t\t<method name=\"getTxPackets(Ljava/lang/String;)J\" since=\"30\"/>\n\t\t<method name=\"getUidRxBytes(I)J\"/>\n\t\t<method name=\"getUidRxPackets(I)J\" since=\"12\"/>\n\t\t<method name=\"getUidTcpRxBytes(I)J\" since=\"12\" deprecated=\"18\"/>\n\t\t<method name=\"getUidTcpRxSegments(I)J\" since=\"12\" deprecated=\"18\"/>\n\t\t<method name=\"getUidTcpTxBytes(I)J\" since=\"12\" deprecated=\"18\"/>\n\t\t<method name=\"getUidTcpTxSegments(I)J\" since=\"12\" deprecated=\"18\"/>\n\t\t<method name=\"getUidTxBytes(I)J\"/>\n\t\t<method name=\"getUidTxPackets(I)J\" since=\"12\"/>\n\t\t<method name=\"getUidUdpRxBytes(I)J\" since=\"12\" deprecated=\"18\"/>\n\t\t<method name=\"getUidUdpRxPackets(I)J\" since=\"12\" deprecated=\"18\"/>\n\t\t<method name=\"getUidUdpTxBytes(I)J\" since=\"12\" deprecated=\"18\"/>\n\t\t<method name=\"getUidUdpTxPackets(I)J\" since=\"12\" deprecated=\"18\"/>\n\t\t<method name=\"incrementOperationCount(I)V\" since=\"14\"/>\n\t\t<method name=\"incrementOperationCount(II)V\" since=\"14\"/>\n\t\t<method name=\"setThreadStatsTag(I)V\" since=\"14\"/>\n\t\t<method name=\"setThreadStatsUid(I)V\" since=\"28\"/>\n\t\t<method name=\"tagDatagramSocket(Ljava/net/DatagramSocket;)V\" since=\"24\"/>\n\t\t<method name=\"tagFileDescriptor(Ljava/io/FileDescriptor;)V\" since=\"28\"/>\n\t\t<method name=\"tagSocket(Ljava/net/Socket;)V\" since=\"14\"/>\n\t\t<method name=\"untagDatagramSocket(Ljava/net/DatagramSocket;)V\" since=\"24\"/>\n\t\t<method name=\"untagFileDescriptor(Ljava/io/FileDescriptor;)V\" since=\"28\"/>\n\t\t<method name=\"untagSocket(Ljava/net/Socket;)V\" since=\"14\"/>\n\t\t<field name=\"UNSUPPORTED\"/>\n\t</class>\n\t<class name=\"android/net/TransportInfo\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/net/Uri\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"buildUpon()Landroid/net/Uri$Builder;\"/>\n\t\t<method name=\"compareTo(Landroid/net/Uri;)I\"/>\n\t\t<method name=\"decode(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"encode(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"fromFile(Ljava/io/File;)Landroid/net/Uri;\"/>\n\t\t<method name=\"fromParts(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<method name=\"getAuthority()Ljava/lang/String;\"/>\n\t\t<method name=\"getBooleanQueryParameter(Ljava/lang/String;Z)Z\" since=\"11\"/>\n\t\t<method name=\"getEncodedAuthority()Ljava/lang/String;\"/>\n\t\t<method name=\"getEncodedFragment()Ljava/lang/String;\"/>\n\t\t<method name=\"getEncodedPath()Ljava/lang/String;\"/>\n\t\t<method name=\"getEncodedQuery()Ljava/lang/String;\"/>\n\t\t<method name=\"getEncodedSchemeSpecificPart()Ljava/lang/String;\"/>\n\t\t<method name=\"getEncodedUserInfo()Ljava/lang/String;\"/>\n\t\t<method name=\"getFragment()Ljava/lang/String;\"/>\n\t\t<method name=\"getHost()Ljava/lang/String;\"/>\n\t\t<method name=\"getLastPathSegment()Ljava/lang/String;\"/>\n\t\t<method name=\"getPath()Ljava/lang/String;\"/>\n\t\t<method name=\"getPathSegments()Ljava/util/List;\"/>\n\t\t<method name=\"getPort()I\"/>\n\t\t<method name=\"getQuery()Ljava/lang/String;\"/>\n\t\t<method name=\"getQueryParameter(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getQueryParameterNames()Ljava/util/Set;\" since=\"11\"/>\n\t\t<method name=\"getQueryParameters(Ljava/lang/String;)Ljava/util/List;\"/>\n\t\t<method name=\"getScheme()Ljava/lang/String;\"/>\n\t\t<method name=\"getSchemeSpecificPart()Ljava/lang/String;\"/>\n\t\t<method name=\"getUserInfo()Ljava/lang/String;\"/>\n\t\t<method name=\"isAbsolute()Z\"/>\n\t\t<method name=\"isHierarchical()Z\"/>\n\t\t<method name=\"isOpaque()Z\"/>\n\t\t<method name=\"isRelative()Z\"/>\n\t\t<method name=\"normalizeScheme()Landroid/net/Uri;\" since=\"16\"/>\n\t\t<method name=\"parse(Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<method name=\"withAppendedPath(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<method name=\"writeToParcel(Landroid/os/Parcel;Landroid/net/Uri;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"EMPTY\"/>\n\t</class>\n\t<class name=\"android/net/Uri$Builder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"appendEncodedPath(Ljava/lang/String;)Landroid/net/Uri$Builder;\"/>\n\t\t<method name=\"appendPath(Ljava/lang/String;)Landroid/net/Uri$Builder;\"/>\n\t\t<method name=\"appendQueryParameter(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri$Builder;\"/>\n\t\t<method name=\"authority(Ljava/lang/String;)Landroid/net/Uri$Builder;\"/>\n\t\t<method name=\"build()Landroid/net/Uri;\"/>\n\t\t<method name=\"clearQuery()Landroid/net/Uri$Builder;\" since=\"11\"/>\n\t\t<method name=\"encodedAuthority(Ljava/lang/String;)Landroid/net/Uri$Builder;\"/>\n\t\t<method name=\"encodedFragment(Ljava/lang/String;)Landroid/net/Uri$Builder;\"/>\n\t\t<method name=\"encodedOpaquePart(Ljava/lang/String;)Landroid/net/Uri$Builder;\"/>\n\t\t<method name=\"encodedPath(Ljava/lang/String;)Landroid/net/Uri$Builder;\"/>\n\t\t<method name=\"encodedQuery(Ljava/lang/String;)Landroid/net/Uri$Builder;\"/>\n\t\t<method name=\"fragment(Ljava/lang/String;)Landroid/net/Uri$Builder;\"/>\n\t\t<method name=\"opaquePart(Ljava/lang/String;)Landroid/net/Uri$Builder;\"/>\n\t\t<method name=\"path(Ljava/lang/String;)Landroid/net/Uri$Builder;\"/>\n\t\t<method name=\"query(Ljava/lang/String;)Landroid/net/Uri$Builder;\"/>\n\t\t<method name=\"scheme(Ljava/lang/String;)Landroid/net/Uri$Builder;\"/>\n\t</class>\n\t<class name=\"android/net/UrlQuerySanitizer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"addSanitizedEntry(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"decodeHexDigit(C)I\"/>\n\t\t<method name=\"getAllButNulAndAngleBracketsLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;\"/>\n\t\t<method name=\"getAllButNulLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;\"/>\n\t\t<method name=\"getAllButWhitespaceLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;\"/>\n\t\t<method name=\"getAllIllegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;\"/>\n\t\t<method name=\"getAllowUnregisteredParamaters()Z\"/>\n\t\t<method name=\"getAmpAndSpaceLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;\"/>\n\t\t<method name=\"getAmpLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;\"/>\n\t\t<method name=\"getEffectiveValueSanitizer(Ljava/lang/String;)Landroid/net/UrlQuerySanitizer$ValueSanitizer;\"/>\n\t\t<method name=\"getParameterList()Ljava/util/List;\"/>\n\t\t<method name=\"getParameterSet()Ljava/util/Set;\"/>\n\t\t<method name=\"getPreferFirstRepeatedParameter()Z\"/>\n\t\t<method name=\"getSpaceLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;\"/>\n\t\t<method name=\"getUnregisteredParameterValueSanitizer()Landroid/net/UrlQuerySanitizer$ValueSanitizer;\"/>\n\t\t<method name=\"getUrlAndSpaceLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;\"/>\n\t\t<method name=\"getUrlLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;\"/>\n\t\t<method name=\"getValue(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getValueSanitizer(Ljava/lang/String;)Landroid/net/UrlQuerySanitizer$ValueSanitizer;\"/>\n\t\t<method name=\"hasParameter(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isHexDigit(C)Z\"/>\n\t\t<method name=\"parseEntry(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"parseQuery(Ljava/lang/String;)V\"/>\n\t\t<method name=\"parseUrl(Ljava/lang/String;)V\"/>\n\t\t<method name=\"registerParameter(Ljava/lang/String;Landroid/net/UrlQuerySanitizer$ValueSanitizer;)V\"/>\n\t\t<method name=\"registerParameters([Ljava/lang/String;Landroid/net/UrlQuerySanitizer$ValueSanitizer;)V\"/>\n\t\t<method name=\"setAllowUnregisteredParamaters(Z)V\"/>\n\t\t<method name=\"setPreferFirstRepeatedParameter(Z)V\"/>\n\t\t<method name=\"setUnregisteredParameterValueSanitizer(Landroid/net/UrlQuerySanitizer$ValueSanitizer;)V\"/>\n\t\t<method name=\"unescape(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/net/UrlQuerySanitizer$IllegalCharacterValueSanitizer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/net/UrlQuerySanitizer$ValueSanitizer\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<field name=\"ALL_BUT_NUL_AND_ANGLE_BRACKETS_LEGAL\"/>\n\t\t<field name=\"ALL_BUT_NUL_LEGAL\"/>\n\t\t<field name=\"ALL_BUT_WHITESPACE_LEGAL\"/>\n\t\t<field name=\"ALL_ILLEGAL\"/>\n\t\t<field name=\"ALL_OK\"/>\n\t\t<field name=\"ALL_WHITESPACE_OK\"/>\n\t\t<field name=\"AMP_AND_SPACE_LEGAL\"/>\n\t\t<field name=\"AMP_LEGAL\"/>\n\t\t<field name=\"AMP_OK\"/>\n\t\t<field name=\"DQUOTE_OK\"/>\n\t\t<field name=\"GT_OK\"/>\n\t\t<field name=\"LT_OK\"/>\n\t\t<field name=\"NON_7_BIT_ASCII_OK\"/>\n\t\t<field name=\"NUL_OK\"/>\n\t\t<field name=\"OTHER_WHITESPACE_OK\"/>\n\t\t<field name=\"PCT_OK\"/>\n\t\t<field name=\"SCRIPT_URL_OK\"/>\n\t\t<field name=\"SPACE_LEGAL\"/>\n\t\t<field name=\"SPACE_OK\"/>\n\t\t<field name=\"SQUOTE_OK\"/>\n\t\t<field name=\"URL_AND_SPACE_LEGAL\"/>\n\t\t<field name=\"URL_LEGAL\"/>\n\t</class>\n\t<class name=\"android/net/UrlQuerySanitizer$ParameterValuePair\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/UrlQuerySanitizer;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<field name=\"mParameter\"/>\n\t\t<field name=\"mValue\"/>\n\t</class>\n\t<class name=\"android/net/UrlQuerySanitizer$ValueSanitizer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"sanitize(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/net/VpnManager\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"deleteProvisionedVpnProfile()V\"/>\n\t\t<method name=\"provisionVpnProfile(Landroid/net/PlatformVpnProfile;)Landroid/content/Intent;\"/>\n\t\t<method name=\"startProvisionedVpnProfile()V\"/>\n\t\t<method name=\"stopProvisionedVpnProfile()V\"/>\n\t</class>\n\t<class name=\"android/net/VpnService\" since=\"14\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"isAlwaysOn()Z\" since=\"29\"/>\n\t\t<method name=\"isLockdownEnabled()Z\" since=\"29\"/>\n\t\t<method name=\"onRevoke()V\"/>\n\t\t<method name=\"prepare(Landroid/content/Context;)Landroid/content/Intent;\"/>\n\t\t<method name=\"protect(I)Z\"/>\n\t\t<method name=\"protect(Ljava/net/DatagramSocket;)Z\"/>\n\t\t<method name=\"protect(Ljava/net/Socket;)Z\"/>\n\t\t<method name=\"setUnderlyingNetworks([Landroid/net/Network;)Z\" since=\"22\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t\t<field name=\"SERVICE_META_DATA_SUPPORTS_ALWAYS_ON\" since=\"27\"/>\n\t</class>\n\t<class name=\"android/net/VpnService$Builder\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/VpnService;)V\"/>\n\t\t<method name=\"addAddress(Ljava/lang/String;I)Landroid/net/VpnService$Builder;\"/>\n\t\t<method name=\"addAddress(Ljava/net/InetAddress;I)Landroid/net/VpnService$Builder;\"/>\n\t\t<method name=\"addAllowedApplication(Ljava/lang/String;)Landroid/net/VpnService$Builder;\" since=\"21\"/>\n\t\t<method name=\"addDisallowedApplication(Ljava/lang/String;)Landroid/net/VpnService$Builder;\" since=\"21\"/>\n\t\t<method name=\"addDnsServer(Ljava/lang/String;)Landroid/net/VpnService$Builder;\"/>\n\t\t<method name=\"addDnsServer(Ljava/net/InetAddress;)Landroid/net/VpnService$Builder;\"/>\n\t\t<method name=\"addRoute(Ljava/lang/String;I)Landroid/net/VpnService$Builder;\"/>\n\t\t<method name=\"addRoute(Ljava/net/InetAddress;I)Landroid/net/VpnService$Builder;\"/>\n\t\t<method name=\"addSearchDomain(Ljava/lang/String;)Landroid/net/VpnService$Builder;\"/>\n\t\t<method name=\"allowBypass()Landroid/net/VpnService$Builder;\" since=\"21\"/>\n\t\t<method name=\"allowFamily(I)Landroid/net/VpnService$Builder;\" since=\"21\"/>\n\t\t<method name=\"establish()Landroid/os/ParcelFileDescriptor;\"/>\n\t\t<method name=\"setBlocking(Z)Landroid/net/VpnService$Builder;\" since=\"21\"/>\n\t\t<method name=\"setConfigureIntent(Landroid/app/PendingIntent;)Landroid/net/VpnService$Builder;\"/>\n\t\t<method name=\"setHttpProxy(Landroid/net/ProxyInfo;)Landroid/net/VpnService$Builder;\" since=\"29\"/>\n\t\t<method name=\"setMetered(Z)Landroid/net/VpnService$Builder;\" since=\"29\"/>\n\t\t<method name=\"setMtu(I)Landroid/net/VpnService$Builder;\"/>\n\t\t<method name=\"setSession(Ljava/lang/String;)Landroid/net/VpnService$Builder;\"/>\n\t\t<method name=\"setUnderlyingNetworks([Landroid/net/Network;)Landroid/net/VpnService$Builder;\" since=\"22\"/>\n\t</class>\n\t<class name=\"android/net/http/AndroidHttpClient\" since=\"8\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/client/HttpClient\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"disableCurlLogging()V\"/>\n\t\t<method name=\"enableCurlLogging(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"getCompressedEntity([BLandroid/content/ContentResolver;)Lorg/apache/http/entity/AbstractHttpEntity;\"/>\n\t\t<method name=\"getMinGzipSize(Landroid/content/ContentResolver;)J\"/>\n\t\t<method name=\"getUngzippedContent(Lorg/apache/http/HttpEntity;)Ljava/io/InputStream;\"/>\n\t\t<method name=\"modifyRequestToAcceptGzipResponse(Lorg/apache/http/HttpRequest;)V\"/>\n\t\t<method name=\"newInstance(Ljava/lang/String;)Landroid/net/http/AndroidHttpClient;\" deprecated=\"22\"/>\n\t\t<method name=\"newInstance(Ljava/lang/String;Landroid/content/Context;)Landroid/net/http/AndroidHttpClient;\" deprecated=\"22\"/>\n\t\t<method name=\"parseDate(Ljava/lang/String;)J\"/>\n\t\t<field name=\"DEFAULT_SYNC_MIN_GZIP_BYTES\"/>\n\t</class>\n\t<class name=\"android/net/http/HttpResponseCache\" since=\"14\">\n\t\t<extends name=\"java/net/ResponseCache\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<method name=\"delete()V\"/>\n\t\t<method name=\"flush()V\"/>\n\t\t<method name=\"getHitCount()I\"/>\n\t\t<method name=\"getInstalled()Landroid/net/http/HttpResponseCache;\"/>\n\t\t<method name=\"getNetworkCount()I\"/>\n\t\t<method name=\"getRequestCount()I\"/>\n\t\t<method name=\"install(Ljava/io/File;J)Landroid/net/http/HttpResponseCache;\"/>\n\t\t<method name=\"maxSize()J\"/>\n\t\t<method name=\"size()J\"/>\n\t</class>\n\t<class name=\"android/net/http/SslCertificate\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/util/Date;Ljava/util/Date;)V\" since=\"8\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/cert/X509Certificate;)V\"/>\n\t\t<method name=\"getIssuedBy()Landroid/net/http/SslCertificate$DName;\"/>\n\t\t<method name=\"getIssuedTo()Landroid/net/http/SslCertificate$DName;\"/>\n\t\t<method name=\"getValidNotAfter()Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"getValidNotAfterDate()Ljava/util/Date;\" since=\"8\"/>\n\t\t<method name=\"getValidNotBefore()Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"getValidNotBeforeDate()Ljava/util/Date;\" since=\"8\"/>\n\t\t<method name=\"getX509Certificate()Ljava/security/cert/X509Certificate;\" since=\"29\"/>\n\t\t<method name=\"restoreState(Landroid/os/Bundle;)Landroid/net/http/SslCertificate;\"/>\n\t\t<method name=\"saveState(Landroid/net/http/SslCertificate;)Landroid/os/Bundle;\"/>\n\t</class>\n\t<class name=\"android/net/http/SslCertificate$DName\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/http/SslCertificate;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getCName()Ljava/lang/String;\"/>\n\t\t<method name=\"getDName()Ljava/lang/String;\"/>\n\t\t<method name=\"getOName()Ljava/lang/String;\"/>\n\t\t<method name=\"getUName()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/net/http/SslError\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(ILandroid/net/http/SslCertificate;)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(ILandroid/net/http/SslCertificate;Ljava/lang/String;)V\" since=\"14\"/>\n\t\t<method name=\"&lt;init>(ILjava/security/cert/X509Certificate;)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(ILjava/security/cert/X509Certificate;Ljava/lang/String;)V\" since=\"14\"/>\n\t\t<method name=\"addError(I)Z\"/>\n\t\t<method name=\"getCertificate()Landroid/net/http/SslCertificate;\"/>\n\t\t<method name=\"getPrimaryError()I\"/>\n\t\t<method name=\"getUrl()Ljava/lang/String;\" since=\"14\"/>\n\t\t<method name=\"hasError(I)Z\"/>\n\t\t<field name=\"SSL_DATE_INVALID\" since=\"14\"/>\n\t\t<field name=\"SSL_EXPIRED\"/>\n\t\t<field name=\"SSL_IDMISMATCH\"/>\n\t\t<field name=\"SSL_INVALID\" since=\"14\"/>\n\t\t<field name=\"SSL_MAX_ERROR\" deprecated=\"15\"/>\n\t\t<field name=\"SSL_NOTYETVALID\"/>\n\t\t<field name=\"SSL_UNTRUSTED\"/>\n\t</class>\n\t<class name=\"android/net/http/X509TrustManagerExtensions\" since=\"17\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljavax/net/ssl/X509TrustManager;)V\"/>\n\t\t<method name=\"checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;\"/>\n\t\t<method name=\"isSameTrustConfiguration(Ljava/lang/String;Ljava/lang/String;)Z\" since=\"28\"/>\n\t\t<method name=\"isUserAddedCertificate(Ljava/security/cert/X509Certificate;)Z\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/net/nsd/NsdManager\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"discoverServices(Ljava/lang/String;ILandroid/net/nsd/NsdManager$DiscoveryListener;)V\"/>\n\t\t<method name=\"registerService(Landroid/net/nsd/NsdServiceInfo;ILandroid/net/nsd/NsdManager$RegistrationListener;)V\"/>\n\t\t<method name=\"resolveService(Landroid/net/nsd/NsdServiceInfo;Landroid/net/nsd/NsdManager$ResolveListener;)V\"/>\n\t\t<method name=\"stopServiceDiscovery(Landroid/net/nsd/NsdManager$DiscoveryListener;)V\"/>\n\t\t<method name=\"unregisterService(Landroid/net/nsd/NsdManager$RegistrationListener;)V\"/>\n\t\t<field name=\"ACTION_NSD_STATE_CHANGED\"/>\n\t\t<field name=\"EXTRA_NSD_STATE\"/>\n\t\t<field name=\"FAILURE_ALREADY_ACTIVE\"/>\n\t\t<field name=\"FAILURE_INTERNAL_ERROR\"/>\n\t\t<field name=\"FAILURE_MAX_LIMIT\"/>\n\t\t<field name=\"NSD_STATE_DISABLED\"/>\n\t\t<field name=\"NSD_STATE_ENABLED\"/>\n\t\t<field name=\"PROTOCOL_DNS_SD\"/>\n\t</class>\n\t<class name=\"android/net/nsd/NsdManager$DiscoveryListener\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDiscoveryStarted(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onDiscoveryStopped(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onServiceFound(Landroid/net/nsd/NsdServiceInfo;)V\"/>\n\t\t<method name=\"onServiceLost(Landroid/net/nsd/NsdServiceInfo;)V\"/>\n\t\t<method name=\"onStartDiscoveryFailed(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"onStopDiscoveryFailed(Ljava/lang/String;I)V\"/>\n\t</class>\n\t<class name=\"android/net/nsd/NsdManager$RegistrationListener\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onRegistrationFailed(Landroid/net/nsd/NsdServiceInfo;I)V\"/>\n\t\t<method name=\"onServiceRegistered(Landroid/net/nsd/NsdServiceInfo;)V\"/>\n\t\t<method name=\"onServiceUnregistered(Landroid/net/nsd/NsdServiceInfo;)V\"/>\n\t\t<method name=\"onUnregistrationFailed(Landroid/net/nsd/NsdServiceInfo;I)V\"/>\n\t</class>\n\t<class name=\"android/net/nsd/NsdManager$ResolveListener\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onResolveFailed(Landroid/net/nsd/NsdServiceInfo;I)V\"/>\n\t\t<method name=\"onServiceResolved(Landroid/net/nsd/NsdServiceInfo;)V\"/>\n\t</class>\n\t<class name=\"android/net/nsd/NsdServiceInfo\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getAttributes()Ljava/util/Map;\" since=\"21\"/>\n\t\t<method name=\"getHost()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getPort()I\"/>\n\t\t<method name=\"getServiceName()Ljava/lang/String;\"/>\n\t\t<method name=\"getServiceType()Ljava/lang/String;\"/>\n\t\t<method name=\"removeAttribute(Ljava/lang/String;)V\" since=\"21\"/>\n\t\t<method name=\"setAttribute(Ljava/lang/String;Ljava/lang/String;)V\" since=\"21\"/>\n\t\t<method name=\"setHost(Ljava/net/InetAddress;)V\"/>\n\t\t<method name=\"setPort(I)V\"/>\n\t\t<method name=\"setServiceName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setServiceType(Ljava/lang/String;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/rtp/AudioCodec\" since=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getCodec(ILjava/lang/String;Ljava/lang/String;)Landroid/net/rtp/AudioCodec;\"/>\n\t\t<method name=\"getCodecs()[Landroid/net/rtp/AudioCodec;\"/>\n\t\t<field name=\"AMR\"/>\n\t\t<field name=\"GSM\"/>\n\t\t<field name=\"GSM_EFR\"/>\n\t\t<field name=\"PCMA\"/>\n\t\t<field name=\"PCMU\"/>\n\t\t<field name=\"fmtp\"/>\n\t\t<field name=\"rtpmap\"/>\n\t\t<field name=\"type\"/>\n\t</class>\n\t<class name=\"android/net/rtp/AudioGroup\" since=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" since=\"30\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"getMode()I\"/>\n\t\t<method name=\"getStreams()[Landroid/net/rtp/AudioStream;\"/>\n\t\t<method name=\"sendDtmf(I)V\"/>\n\t\t<method name=\"setMode(I)V\"/>\n\t\t<field name=\"MODE_ECHO_SUPPRESSION\"/>\n\t\t<field name=\"MODE_MUTED\"/>\n\t\t<field name=\"MODE_NORMAL\"/>\n\t\t<field name=\"MODE_ON_HOLD\"/>\n\t</class>\n\t<class name=\"android/net/rtp/AudioStream\" since=\"12\">\n\t\t<extends name=\"android/net/rtp/RtpStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/InetAddress;)V\"/>\n\t\t<method name=\"getCodec()Landroid/net/rtp/AudioCodec;\"/>\n\t\t<method name=\"getDtmfType()I\"/>\n\t\t<method name=\"getGroup()Landroid/net/rtp/AudioGroup;\"/>\n\t\t<method name=\"join(Landroid/net/rtp/AudioGroup;)V\"/>\n\t\t<method name=\"setCodec(Landroid/net/rtp/AudioCodec;)V\"/>\n\t\t<method name=\"setDtmfType(I)V\"/>\n\t</class>\n\t<class name=\"android/net/rtp/RtpStream\" since=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"associate(Ljava/net/InetAddress;I)V\"/>\n\t\t<method name=\"getLocalAddress()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getLocalPort()I\"/>\n\t\t<method name=\"getMode()I\"/>\n\t\t<method name=\"getRemoteAddress()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getRemotePort()I\"/>\n\t\t<method name=\"isBusy()Z\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"setMode(I)V\"/>\n\t\t<field name=\"MODE_NORMAL\"/>\n\t\t<field name=\"MODE_RECEIVE_ONLY\"/>\n\t\t<field name=\"MODE_SEND_ONLY\"/>\n\t</class>\n\t<class name=\"android/net/sip/SipAudioCall\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/net/sip/SipProfile;)V\"/>\n\t\t<method name=\"answerCall(I)V\"/>\n\t\t<method name=\"attachCall(Landroid/net/sip/SipSession;Ljava/lang/String;)V\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"continueCall(I)V\"/>\n\t\t<method name=\"endCall()V\"/>\n\t\t<method name=\"getLocalProfile()Landroid/net/sip/SipProfile;\"/>\n\t\t<method name=\"getPeerProfile()Landroid/net/sip/SipProfile;\"/>\n\t\t<method name=\"getState()I\"/>\n\t\t<method name=\"holdCall(I)V\"/>\n\t\t<method name=\"isInCall()Z\"/>\n\t\t<method name=\"isMuted()Z\"/>\n\t\t<method name=\"isOnHold()Z\"/>\n\t\t<method name=\"makeCall(Landroid/net/sip/SipProfile;Landroid/net/sip/SipSession;I)V\"/>\n\t\t<method name=\"sendDtmf(I)V\"/>\n\t\t<method name=\"sendDtmf(ILandroid/os/Message;)V\"/>\n\t\t<method name=\"setListener(Landroid/net/sip/SipAudioCall$Listener;)V\"/>\n\t\t<method name=\"setListener(Landroid/net/sip/SipAudioCall$Listener;Z)V\"/>\n\t\t<method name=\"setSpeakerMode(Z)V\"/>\n\t\t<method name=\"startAudio()V\"/>\n\t\t<method name=\"toggleMute()V\"/>\n\t</class>\n\t<class name=\"android/net/sip/SipAudioCall$Listener\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCallBusy(Landroid/net/sip/SipAudioCall;)V\"/>\n\t\t<method name=\"onCallEnded(Landroid/net/sip/SipAudioCall;)V\"/>\n\t\t<method name=\"onCallEstablished(Landroid/net/sip/SipAudioCall;)V\"/>\n\t\t<method name=\"onCallHeld(Landroid/net/sip/SipAudioCall;)V\"/>\n\t\t<method name=\"onCalling(Landroid/net/sip/SipAudioCall;)V\"/>\n\t\t<method name=\"onChanged(Landroid/net/sip/SipAudioCall;)V\"/>\n\t\t<method name=\"onError(Landroid/net/sip/SipAudioCall;ILjava/lang/String;)V\"/>\n\t\t<method name=\"onReadyToCall(Landroid/net/sip/SipAudioCall;)V\"/>\n\t\t<method name=\"onRinging(Landroid/net/sip/SipAudioCall;Landroid/net/sip/SipProfile;)V\"/>\n\t\t<method name=\"onRingingBack(Landroid/net/sip/SipAudioCall;)V\"/>\n\t</class>\n\t<class name=\"android/net/sip/SipErrorCode\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"toString(I)Ljava/lang/String;\"/>\n\t\t<field name=\"CLIENT_ERROR\"/>\n\t\t<field name=\"CROSS_DOMAIN_AUTHENTICATION\"/>\n\t\t<field name=\"DATA_CONNECTION_LOST\"/>\n\t\t<field name=\"INVALID_CREDENTIALS\"/>\n\t\t<field name=\"INVALID_REMOTE_URI\"/>\n\t\t<field name=\"IN_PROGRESS\"/>\n\t\t<field name=\"NO_ERROR\"/>\n\t\t<field name=\"PEER_NOT_REACHABLE\"/>\n\t\t<field name=\"SERVER_ERROR\"/>\n\t\t<field name=\"SERVER_UNREACHABLE\"/>\n\t\t<field name=\"SOCKET_ERROR\"/>\n\t\t<field name=\"TIME_OUT\"/>\n\t\t<field name=\"TRANSACTION_TERMINTED\"/>\n\t</class>\n\t<class name=\"android/net/sip/SipException\" since=\"9\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/net/sip/SipManager\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"close(Ljava/lang/String;)V\"/>\n\t\t<method name=\"createSipSession(Landroid/net/sip/SipProfile;Landroid/net/sip/SipSession$Listener;)Landroid/net/sip/SipSession;\"/>\n\t\t<method name=\"getCallId(Landroid/content/Intent;)Ljava/lang/String;\"/>\n\t\t<method name=\"getOfferSessionDescription(Landroid/content/Intent;)Ljava/lang/String;\"/>\n\t\t<method name=\"getSessionFor(Landroid/content/Intent;)Landroid/net/sip/SipSession;\"/>\n\t\t<method name=\"isApiSupported(Landroid/content/Context;)Z\"/>\n\t\t<method name=\"isIncomingCallIntent(Landroid/content/Intent;)Z\"/>\n\t\t<method name=\"isOpened(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isRegistered(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isSipWifiOnly(Landroid/content/Context;)Z\"/>\n\t\t<method name=\"isVoipSupported(Landroid/content/Context;)Z\"/>\n\t\t<method name=\"makeAudioCall(Landroid/net/sip/SipProfile;Landroid/net/sip/SipProfile;Landroid/net/sip/SipAudioCall$Listener;I)Landroid/net/sip/SipAudioCall;\"/>\n\t\t<method name=\"makeAudioCall(Ljava/lang/String;Ljava/lang/String;Landroid/net/sip/SipAudioCall$Listener;I)Landroid/net/sip/SipAudioCall;\"/>\n\t\t<method name=\"newInstance(Landroid/content/Context;)Landroid/net/sip/SipManager;\"/>\n\t\t<method name=\"open(Landroid/net/sip/SipProfile;)V\"/>\n\t\t<method name=\"open(Landroid/net/sip/SipProfile;Landroid/app/PendingIntent;Landroid/net/sip/SipRegistrationListener;)V\"/>\n\t\t<method name=\"register(Landroid/net/sip/SipProfile;ILandroid/net/sip/SipRegistrationListener;)V\"/>\n\t\t<method name=\"setRegistrationListener(Ljava/lang/String;Landroid/net/sip/SipRegistrationListener;)V\"/>\n\t\t<method name=\"takeAudioCall(Landroid/content/Intent;Landroid/net/sip/SipAudioCall$Listener;)Landroid/net/sip/SipAudioCall;\"/>\n\t\t<method name=\"unregister(Landroid/net/sip/SipProfile;Landroid/net/sip/SipRegistrationListener;)V\"/>\n\t\t<field name=\"EXTRA_CALL_ID\"/>\n\t\t<field name=\"EXTRA_OFFER_SD\"/>\n\t\t<field name=\"INCOMING_CALL_RESULT_CODE\"/>\n\t</class>\n\t<class name=\"android/net/sip/SipProfile\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"getAuthUserName()Ljava/lang/String;\" since=\"12\"/>\n\t\t<method name=\"getAutoRegistration()Z\"/>\n\t\t<method name=\"getDisplayName()Ljava/lang/String;\"/>\n\t\t<method name=\"getPassword()Ljava/lang/String;\"/>\n\t\t<method name=\"getPort()I\"/>\n\t\t<method name=\"getProfileName()Ljava/lang/String;\"/>\n\t\t<method name=\"getProtocol()Ljava/lang/String;\"/>\n\t\t<method name=\"getProxyAddress()Ljava/lang/String;\"/>\n\t\t<method name=\"getSendKeepAlive()Z\"/>\n\t\t<method name=\"getSipDomain()Ljava/lang/String;\"/>\n\t\t<method name=\"getUriString()Ljava/lang/String;\"/>\n\t\t<method name=\"getUserName()Ljava/lang/String;\"/>\n\t\t<method name=\"setCallingUid(I)V\" since=\"30\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/sip/SipProfile$Builder\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/sip/SipProfile;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"build()Landroid/net/sip/SipProfile;\"/>\n\t\t<method name=\"setAuthUserName(Ljava/lang/String;)Landroid/net/sip/SipProfile$Builder;\" since=\"12\"/>\n\t\t<method name=\"setAutoRegistration(Z)Landroid/net/sip/SipProfile$Builder;\"/>\n\t\t<method name=\"setDisplayName(Ljava/lang/String;)Landroid/net/sip/SipProfile$Builder;\"/>\n\t\t<method name=\"setOutboundProxy(Ljava/lang/String;)Landroid/net/sip/SipProfile$Builder;\"/>\n\t\t<method name=\"setPassword(Ljava/lang/String;)Landroid/net/sip/SipProfile$Builder;\"/>\n\t\t<method name=\"setPort(I)Landroid/net/sip/SipProfile$Builder;\"/>\n\t\t<method name=\"setProfileName(Ljava/lang/String;)Landroid/net/sip/SipProfile$Builder;\"/>\n\t\t<method name=\"setProtocol(Ljava/lang/String;)Landroid/net/sip/SipProfile$Builder;\"/>\n\t\t<method name=\"setSendKeepAlive(Z)Landroid/net/sip/SipProfile$Builder;\"/>\n\t</class>\n\t<class name=\"android/net/sip/SipRegistrationListener\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onRegistering(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onRegistrationDone(Ljava/lang/String;J)V\"/>\n\t\t<method name=\"onRegistrationFailed(Ljava/lang/String;ILjava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/net/sip/SipSession\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"answerCall(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"changeCall(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"endCall()V\"/>\n\t\t<method name=\"getCallId()Ljava/lang/String;\"/>\n\t\t<method name=\"getLocalIp()Ljava/lang/String;\"/>\n\t\t<method name=\"getLocalProfile()Landroid/net/sip/SipProfile;\"/>\n\t\t<method name=\"getPeerProfile()Landroid/net/sip/SipProfile;\"/>\n\t\t<method name=\"getState()I\"/>\n\t\t<method name=\"isInCall()Z\"/>\n\t\t<method name=\"makeCall(Landroid/net/sip/SipProfile;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"register(I)V\"/>\n\t\t<method name=\"setListener(Landroid/net/sip/SipSession$Listener;)V\"/>\n\t\t<method name=\"unregister()V\"/>\n\t</class>\n\t<class name=\"android/net/sip/SipSession$Listener\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCallBusy(Landroid/net/sip/SipSession;)V\"/>\n\t\t<method name=\"onCallChangeFailed(Landroid/net/sip/SipSession;ILjava/lang/String;)V\"/>\n\t\t<method name=\"onCallEnded(Landroid/net/sip/SipSession;)V\"/>\n\t\t<method name=\"onCallEstablished(Landroid/net/sip/SipSession;Ljava/lang/String;)V\"/>\n\t\t<method name=\"onCalling(Landroid/net/sip/SipSession;)V\"/>\n\t\t<method name=\"onError(Landroid/net/sip/SipSession;ILjava/lang/String;)V\"/>\n\t\t<method name=\"onRegistering(Landroid/net/sip/SipSession;)V\"/>\n\t\t<method name=\"onRegistrationDone(Landroid/net/sip/SipSession;I)V\"/>\n\t\t<method name=\"onRegistrationFailed(Landroid/net/sip/SipSession;ILjava/lang/String;)V\"/>\n\t\t<method name=\"onRegistrationTimeout(Landroid/net/sip/SipSession;)V\"/>\n\t\t<method name=\"onRinging(Landroid/net/sip/SipSession;Landroid/net/sip/SipProfile;Ljava/lang/String;)V\"/>\n\t\t<method name=\"onRingingBack(Landroid/net/sip/SipSession;)V\"/>\n\t</class>\n\t<class name=\"android/net/sip/SipSession$State\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"toString(I)Ljava/lang/String;\"/>\n\t\t<field name=\"DEREGISTERING\"/>\n\t\t<field name=\"INCOMING_CALL\"/>\n\t\t<field name=\"INCOMING_CALL_ANSWERING\"/>\n\t\t<field name=\"IN_CALL\"/>\n\t\t<field name=\"NOT_DEFINED\"/>\n\t\t<field name=\"OUTGOING_CALL\"/>\n\t\t<field name=\"OUTGOING_CALL_CANCELING\"/>\n\t\t<field name=\"OUTGOING_CALL_RING_BACK\"/>\n\t\t<field name=\"PINGING\"/>\n\t\t<field name=\"READY_TO_CALL\"/>\n\t\t<field name=\"REGISTERING\"/>\n\t</class>\n\t<class name=\"android/net/ssl/SSLEngines\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"isSupportedEngine(Ljavax/net/ssl/SSLEngine;)Z\"/>\n\t\t<method name=\"setUseSessionTickets(Ljavax/net/ssl/SSLEngine;Z)V\"/>\n\t</class>\n\t<class name=\"android/net/ssl/SSLSockets\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"isSupportedSocket(Ljavax/net/ssl/SSLSocket;)Z\"/>\n\t\t<method name=\"setUseSessionTickets(Ljavax/net/ssl/SSLSocket;Z)V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/ScanResult\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/wifi/ScanResult;)V\" since=\"30\"/>\n\t\t<method name=\"getInformationElements()Ljava/util/List;\" since=\"30\"/>\n\t\t<method name=\"is80211mcResponder()Z\" since=\"23\"/>\n\t\t<method name=\"isPasspointNetwork()Z\" since=\"23\"/>\n\t\t<field name=\"BSSID\"/>\n\t\t<field name=\"CHANNEL_WIDTH_160MHZ\" since=\"23\"/>\n\t\t<field name=\"CHANNEL_WIDTH_20MHZ\" since=\"23\"/>\n\t\t<field name=\"CHANNEL_WIDTH_40MHZ\" since=\"23\"/>\n\t\t<field name=\"CHANNEL_WIDTH_80MHZ\" since=\"23\"/>\n\t\t<field name=\"CHANNEL_WIDTH_80MHZ_PLUS_MHZ\" since=\"23\"/>\n\t\t<field name=\"CREATOR\" since=\"30\"/>\n\t\t<field name=\"SSID\"/>\n\t\t<field name=\"capabilities\"/>\n\t\t<field name=\"centerFreq0\" since=\"23\"/>\n\t\t<field name=\"centerFreq1\" since=\"23\"/>\n\t\t<field name=\"channelWidth\" since=\"23\"/>\n\t\t<field name=\"frequency\"/>\n\t\t<field name=\"level\"/>\n\t\t<field name=\"operatorFriendlyName\" since=\"23\"/>\n\t\t<field name=\"timestamp\" since=\"17\"/>\n\t\t<field name=\"venueName\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/net/wifi/ScanResult$InformationElement\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/wifi/ScanResult$InformationElement;)V\"/>\n\t\t<method name=\"getBytes()Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"getId()I\"/>\n\t</class>\n\t<class name=\"android/net/wifi/SupplicantState\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"isValidState(Landroid/net/wifi/SupplicantState;)Z\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/net/wifi/SupplicantState;\"/>\n\t\t<method name=\"values()[Landroid/net/wifi/SupplicantState;\"/>\n\t\t<field name=\"ASSOCIATED\"/>\n\t\t<field name=\"ASSOCIATING\"/>\n\t\t<field name=\"AUTHENTICATING\" since=\"14\"/>\n\t\t<field name=\"COMPLETED\"/>\n\t\t<field name=\"DISCONNECTED\"/>\n\t\t<field name=\"DORMANT\"/>\n\t\t<field name=\"FOUR_WAY_HANDSHAKE\"/>\n\t\t<field name=\"GROUP_HANDSHAKE\"/>\n\t\t<field name=\"INACTIVE\"/>\n\t\t<field name=\"INTERFACE_DISABLED\" since=\"14\"/>\n\t\t<field name=\"INVALID\"/>\n\t\t<field name=\"SCANNING\"/>\n\t\t<field name=\"UNINITIALIZED\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiConfiguration\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"getHttpProxy()Landroid/net/ProxyInfo;\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"getRandomizedMacAddress()Landroid/net/MacAddress;\" since=\"29\" deprecated=\"29\"/>\n\t\t<method name=\"isPasspoint()Z\" since=\"23\" deprecated=\"29\"/>\n\t\t<method name=\"setHttpProxy(Landroid/net/ProxyInfo;)V\" since=\"26\" deprecated=\"29\"/>\n\t\t<field name=\"BSSID\" deprecated=\"29\"/>\n\t\t<field name=\"FQDN\" since=\"21\" deprecated=\"29\"/>\n\t\t<field name=\"SSID\" deprecated=\"29\"/>\n\t\t<field name=\"allowedAuthAlgorithms\" deprecated=\"29\"/>\n\t\t<field name=\"allowedGroupCiphers\" deprecated=\"29\"/>\n\t\t<field name=\"allowedGroupManagementCiphers\" since=\"29\" deprecated=\"29\"/>\n\t\t<field name=\"allowedKeyManagement\" deprecated=\"29\"/>\n\t\t<field name=\"allowedPairwiseCiphers\" deprecated=\"29\"/>\n\t\t<field name=\"allowedProtocols\" deprecated=\"29\"/>\n\t\t<field name=\"allowedSuiteBCiphers\" since=\"29\" deprecated=\"29\"/>\n\t\t<field name=\"enterpriseConfig\" since=\"18\" deprecated=\"29\"/>\n\t\t<field name=\"hiddenSSID\" deprecated=\"29\"/>\n\t\t<field name=\"isHomeProviderNetwork\" since=\"26\" deprecated=\"29\"/>\n\t\t<field name=\"networkId\" deprecated=\"29\"/>\n\t\t<field name=\"preSharedKey\" deprecated=\"29\"/>\n\t\t<field name=\"priority\" deprecated=\"26\"/>\n\t\t<field name=\"providerFriendlyName\" since=\"23\" deprecated=\"29\"/>\n\t\t<field name=\"roamingConsortiumIds\" since=\"23\" deprecated=\"29\"/>\n\t\t<field name=\"status\" deprecated=\"29\"/>\n\t\t<field name=\"wepKeys\" deprecated=\"28\"/>\n\t\t<field name=\"wepTxKeyIndex\" deprecated=\"28\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiConfiguration$AuthAlgorithm\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"LEAP\" deprecated=\"29\"/>\n\t\t<field name=\"OPEN\" deprecated=\"29\"/>\n\t\t<field name=\"SHARED\" deprecated=\"28\"/>\n\t\t<field name=\"strings\" deprecated=\"29\"/>\n\t\t<field name=\"varName\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiConfiguration$GroupCipher\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CCMP\" deprecated=\"29\"/>\n\t\t<field name=\"GCMP_256\" since=\"29\" deprecated=\"29\"/>\n\t\t<field name=\"TKIP\" deprecated=\"29\"/>\n\t\t<field name=\"WEP104\" deprecated=\"28\"/>\n\t\t<field name=\"WEP40\" deprecated=\"28\"/>\n\t\t<field name=\"strings\" deprecated=\"29\"/>\n\t\t<field name=\"varName\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiConfiguration$GroupMgmtCipher\" since=\"29\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"BIP_CMAC_256\" deprecated=\"29\"/>\n\t\t<field name=\"BIP_GMAC_128\" deprecated=\"29\"/>\n\t\t<field name=\"BIP_GMAC_256\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiConfiguration$KeyMgmt\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"IEEE8021X\" deprecated=\"29\"/>\n\t\t<field name=\"NONE\" deprecated=\"29\"/>\n\t\t<field name=\"OWE\" since=\"29\" deprecated=\"29\"/>\n\t\t<field name=\"SAE\" since=\"29\" deprecated=\"29\"/>\n\t\t<field name=\"SUITE_B_192\" since=\"29\" deprecated=\"29\"/>\n\t\t<field name=\"WPA_EAP\" deprecated=\"29\"/>\n\t\t<field name=\"WPA_PSK\" deprecated=\"29\"/>\n\t\t<field name=\"strings\" deprecated=\"29\"/>\n\t\t<field name=\"varName\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiConfiguration$PairwiseCipher\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CCMP\" deprecated=\"29\"/>\n\t\t<field name=\"GCMP_256\" since=\"29\" deprecated=\"29\"/>\n\t\t<field name=\"NONE\" deprecated=\"29\"/>\n\t\t<field name=\"TKIP\" deprecated=\"28\"/>\n\t\t<field name=\"strings\" deprecated=\"29\"/>\n\t\t<field name=\"varName\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiConfiguration$Protocol\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"RSN\" deprecated=\"29\"/>\n\t\t<field name=\"WPA\" deprecated=\"28\"/>\n\t\t<field name=\"strings\" deprecated=\"29\"/>\n\t\t<field name=\"varName\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiConfiguration$Status\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CURRENT\" deprecated=\"29\"/>\n\t\t<field name=\"DISABLED\" deprecated=\"29\"/>\n\t\t<field name=\"ENABLED\" deprecated=\"29\"/>\n\t\t<field name=\"strings\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiEnterpriseConfig\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/wifi/WifiEnterpriseConfig;)V\"/>\n\t\t<method name=\"getAltSubjectMatch()Ljava/lang/String;\" since=\"23\"/>\n\t\t<method name=\"getAnonymousIdentity()Ljava/lang/String;\"/>\n\t\t<method name=\"getCaCertificate()Ljava/security/cert/X509Certificate;\"/>\n\t\t<method name=\"getCaCertificates()[Ljava/security/cert/X509Certificate;\" since=\"24\"/>\n\t\t<method name=\"getClientCertificate()Ljava/security/cert/X509Certificate;\"/>\n\t\t<method name=\"getClientCertificateChain()[Ljava/security/cert/X509Certificate;\" since=\"26\"/>\n\t\t<method name=\"getDomainSuffixMatch()Ljava/lang/String;\" since=\"23\"/>\n\t\t<method name=\"getEapMethod()I\"/>\n\t\t<method name=\"getIdentity()Ljava/lang/String;\"/>\n\t\t<method name=\"getPassword()Ljava/lang/String;\"/>\n\t\t<method name=\"getPhase2Method()I\"/>\n\t\t<method name=\"getPlmn()Ljava/lang/String;\" since=\"23\"/>\n\t\t<method name=\"getRealm()Ljava/lang/String;\" since=\"23\"/>\n\t\t<method name=\"getSubjectMatch()Ljava/lang/String;\" deprecated=\"23\"/>\n\t\t<method name=\"setAltSubjectMatch(Ljava/lang/String;)V\" since=\"23\"/>\n\t\t<method name=\"setAnonymousIdentity(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setCaCertificate(Ljava/security/cert/X509Certificate;)V\"/>\n\t\t<method name=\"setCaCertificates([Ljava/security/cert/X509Certificate;)V\" since=\"24\"/>\n\t\t<method name=\"setClientKeyEntry(Ljava/security/PrivateKey;Ljava/security/cert/X509Certificate;)V\"/>\n\t\t<method name=\"setClientKeyEntryWithCertificateChain(Ljava/security/PrivateKey;[Ljava/security/cert/X509Certificate;)V\" since=\"26\"/>\n\t\t<method name=\"setDomainSuffixMatch(Ljava/lang/String;)V\" since=\"23\"/>\n\t\t<method name=\"setEapMethod(I)V\"/>\n\t\t<method name=\"setIdentity(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setPassword(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setPhase2Method(I)V\"/>\n\t\t<method name=\"setPlmn(Ljava/lang/String;)V\" since=\"23\"/>\n\t\t<method name=\"setRealm(Ljava/lang/String;)V\" since=\"23\"/>\n\t\t<method name=\"setSubjectMatch(Ljava/lang/String;)V\" deprecated=\"23\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiEnterpriseConfig$Eap\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"AKA\" since=\"21\"/>\n\t\t<field name=\"AKA_PRIME\" since=\"23\"/>\n\t\t<field name=\"NONE\"/>\n\t\t<field name=\"PEAP\"/>\n\t\t<field name=\"PWD\"/>\n\t\t<field name=\"SIM\" since=\"21\"/>\n\t\t<field name=\"TLS\"/>\n\t\t<field name=\"TTLS\"/>\n\t\t<field name=\"UNAUTH_TLS\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiEnterpriseConfig$Phase2\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"AKA\" since=\"26\"/>\n\t\t<field name=\"AKA_PRIME\" since=\"26\"/>\n\t\t<field name=\"GTC\"/>\n\t\t<field name=\"MSCHAP\"/>\n\t\t<field name=\"MSCHAPV2\"/>\n\t\t<field name=\"NONE\"/>\n\t\t<field name=\"PAP\"/>\n\t\t<field name=\"SIM\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiInfo\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getBSSID()Ljava/lang/String;\"/>\n\t\t<method name=\"getDetailedStateOf(Landroid/net/wifi/SupplicantState;)Landroid/net/NetworkInfo$DetailedState;\"/>\n\t\t<method name=\"getFrequency()I\" since=\"21\"/>\n\t\t<method name=\"getHiddenSSID()Z\"/>\n\t\t<method name=\"getIpAddress()I\"/>\n\t\t<method name=\"getLinkSpeed()I\"/>\n\t\t<method name=\"getMacAddress()Ljava/lang/String;\"/>\n\t\t<method name=\"getNetworkId()I\"/>\n\t\t<method name=\"getPasspointFqdn()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getPasspointProviderFriendlyName()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getRssi()I\"/>\n\t\t<method name=\"getRxLinkSpeedMbps()I\" since=\"29\"/>\n\t\t<method name=\"getSSID()Ljava/lang/String;\"/>\n\t\t<method name=\"getSupplicantState()Landroid/net/wifi/SupplicantState;\"/>\n\t\t<method name=\"getTxLinkSpeedMbps()I\" since=\"29\"/>\n\t\t<field name=\"FREQUENCY_UNITS\" since=\"21\"/>\n\t\t<field name=\"LINK_SPEED_UNITS\"/>\n\t\t<field name=\"LINK_SPEED_UNKNOWN\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addNetwork(Landroid/net/wifi/WifiConfiguration;)I\" deprecated=\"29\"/>\n\t\t<method name=\"addNetworkSuggestions(Ljava/util/List;)I\" since=\"29\"/>\n\t\t<method name=\"addOrUpdatePasspointConfiguration(Landroid/net/wifi/hotspot2/PasspointConfiguration;)V\" since=\"26\"/>\n\t\t<method name=\"calculateSignalLevel(II)I\"/>\n\t\t<method name=\"cancelWps(Landroid/net/wifi/WifiManager$WpsCallback;)V\" since=\"21\" deprecated=\"28\"/>\n\t\t<method name=\"compareSignalLevel(II)I\"/>\n\t\t<method name=\"createMulticastLock(Ljava/lang/String;)Landroid/net/wifi/WifiManager$MulticastLock;\" since=\"4\"/>\n\t\t<method name=\"createWifiLock(ILjava/lang/String;)Landroid/net/wifi/WifiManager$WifiLock;\" since=\"3\"/>\n\t\t<method name=\"createWifiLock(Ljava/lang/String;)Landroid/net/wifi/WifiManager$WifiLock;\" deprecated=\"29\"/>\n\t\t<method name=\"disableNetwork(I)Z\" deprecated=\"29\"/>\n\t\t<method name=\"disconnect()Z\" deprecated=\"29\"/>\n\t\t<method name=\"enableNetwork(IZ)Z\" deprecated=\"29\"/>\n\t\t<method name=\"getConfiguredNetworks()Ljava/util/List;\" deprecated=\"29\"/>\n\t\t<method name=\"getConnectionInfo()Landroid/net/wifi/WifiInfo;\"/>\n\t\t<method name=\"getDhcpInfo()Landroid/net/DhcpInfo;\"/>\n\t\t<method name=\"getMaxNumberOfNetworkSuggestionsPerApp()I\" since=\"29\"/>\n\t\t<method name=\"getPasspointConfigurations()Ljava/util/List;\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"getScanResults()Ljava/util/List;\"/>\n\t\t<method name=\"getWifiState()I\"/>\n\t\t<method name=\"is5GHzBandSupported()Z\" since=\"21\"/>\n\t\t<method name=\"isDeviceToApRttSupported()Z\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"isEasyConnectSupported()Z\" since=\"29\"/>\n\t\t<method name=\"isEnhancedOpenSupported()Z\" since=\"29\"/>\n\t\t<method name=\"isEnhancedPowerReportingSupported()Z\" since=\"21\"/>\n\t\t<method name=\"isP2pSupported()Z\" since=\"21\"/>\n\t\t<method name=\"isPreferredNetworkOffloadSupported()Z\" since=\"21\"/>\n\t\t<method name=\"isScanAlwaysAvailable()Z\" since=\"18\" deprecated=\"29\"/>\n\t\t<method name=\"isTdlsSupported()Z\" since=\"21\"/>\n\t\t<method name=\"isWifiEnabled()Z\"/>\n\t\t<method name=\"isWpa3SaeSupported()Z\" since=\"29\"/>\n\t\t<method name=\"isWpa3SuiteBSupported()Z\" since=\"29\"/>\n\t\t<method name=\"pingSupplicant()Z\" deprecated=\"26\"/>\n\t\t<method name=\"reassociate()Z\" deprecated=\"29\"/>\n\t\t<method name=\"reconnect()Z\" deprecated=\"29\"/>\n\t\t<method name=\"removeNetwork(I)Z\" deprecated=\"29\"/>\n\t\t<method name=\"removeNetworkSuggestions(Ljava/util/List;)I\" since=\"29\"/>\n\t\t<method name=\"removePasspointConfiguration(Ljava/lang/String;)V\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"saveConfiguration()Z\" deprecated=\"26\"/>\n\t\t<method name=\"setTdlsEnabled(Ljava/net/InetAddress;Z)V\" since=\"19\"/>\n\t\t<method name=\"setTdlsEnabledWithMacAddress(Ljava/lang/String;Z)V\" since=\"19\"/>\n\t\t<method name=\"setWifiEnabled(Z)Z\" deprecated=\"29\"/>\n\t\t<method name=\"startLocalOnlyHotspot(Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallback;Landroid/os/Handler;)V\" since=\"26\"/>\n\t\t<method name=\"startScan()Z\" deprecated=\"28\"/>\n\t\t<method name=\"startWps(Landroid/net/wifi/WpsInfo;Landroid/net/wifi/WifiManager$WpsCallback;)V\" since=\"21\" deprecated=\"28\"/>\n\t\t<method name=\"updateNetwork(Landroid/net/wifi/WifiConfiguration;)I\" deprecated=\"29\"/>\n\t\t<field name=\"ACTION_PICK_WIFI_NETWORK\"/>\n\t\t<field name=\"ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE\" since=\"18\"/>\n\t\t<field name=\"ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION\" since=\"29\"/>\n\t\t<field name=\"ERROR_AUTHENTICATING\" deprecated=\"28\"/>\n\t\t<field name=\"EXTRA_BSSID\" deprecated=\"28\"/>\n\t\t<field name=\"EXTRA_NETWORK_INFO\"/>\n\t\t<field name=\"EXTRA_NETWORK_SUGGESTION\" since=\"29\"/>\n\t\t<field name=\"EXTRA_NEW_RSSI\"/>\n\t\t<field name=\"EXTRA_NEW_STATE\" deprecated=\"28\"/>\n\t\t<field name=\"EXTRA_PREVIOUS_WIFI_STATE\"/>\n\t\t<field name=\"EXTRA_RESULTS_UPDATED\" since=\"23\"/>\n\t\t<field name=\"EXTRA_SUPPLICANT_CONNECTED\" deprecated=\"28\"/>\n\t\t<field name=\"EXTRA_SUPPLICANT_ERROR\" deprecated=\"28\"/>\n\t\t<field name=\"EXTRA_WIFI_INFO\" since=\"14\" deprecated=\"28\"/>\n\t\t<field name=\"EXTRA_WIFI_STATE\"/>\n\t\t<field name=\"NETWORK_IDS_CHANGED_ACTION\"/>\n\t\t<field name=\"NETWORK_STATE_CHANGED_ACTION\"/>\n\t\t<field name=\"RSSI_CHANGED_ACTION\"/>\n\t\t<field name=\"SCAN_RESULTS_AVAILABLE_ACTION\"/>\n\t\t<field name=\"STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_DUPLICATE\" since=\"29\"/>\n\t\t<field name=\"STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_EXCEEDS_MAX_PER_APP\" since=\"29\"/>\n\t\t<field name=\"STATUS_NETWORK_SUGGESTIONS_ERROR_APP_DISALLOWED\" since=\"29\"/>\n\t\t<field name=\"STATUS_NETWORK_SUGGESTIONS_ERROR_INTERNAL\" since=\"29\"/>\n\t\t<field name=\"STATUS_NETWORK_SUGGESTIONS_ERROR_REMOVE_INVALID\" since=\"29\"/>\n\t\t<field name=\"STATUS_NETWORK_SUGGESTIONS_SUCCESS\" since=\"29\"/>\n\t\t<field name=\"SUPPLICANT_CONNECTION_CHANGE_ACTION\" deprecated=\"28\"/>\n\t\t<field name=\"SUPPLICANT_STATE_CHANGED_ACTION\" deprecated=\"28\"/>\n\t\t<field name=\"UNKNOWN_SSID\" since=\"30\"/>\n\t\t<field name=\"WIFI_MODE_FULL\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"WIFI_MODE_FULL_HIGH_PERF\" since=\"12\"/>\n\t\t<field name=\"WIFI_MODE_FULL_LOW_LATENCY\" since=\"29\"/>\n\t\t<field name=\"WIFI_MODE_SCAN_ONLY\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"WIFI_STATE_CHANGED_ACTION\"/>\n\t\t<field name=\"WIFI_STATE_DISABLED\"/>\n\t\t<field name=\"WIFI_STATE_DISABLING\"/>\n\t\t<field name=\"WIFI_STATE_ENABLED\"/>\n\t\t<field name=\"WIFI_STATE_ENABLING\"/>\n\t\t<field name=\"WIFI_STATE_UNKNOWN\"/>\n\t\t<field name=\"WPS_AUTH_FAILURE\" since=\"21\" deprecated=\"28\"/>\n\t\t<field name=\"WPS_OVERLAP_ERROR\" since=\"21\" deprecated=\"28\"/>\n\t\t<field name=\"WPS_TIMED_OUT\" since=\"21\" deprecated=\"28\"/>\n\t\t<field name=\"WPS_TKIP_ONLY_PROHIBITED\" since=\"21\" deprecated=\"28\"/>\n\t\t<field name=\"WPS_WEP_PROHIBITED\" since=\"21\" deprecated=\"28\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiManager$LocalOnlyHotspotCallback\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onFailed(I)V\"/>\n\t\t<method name=\"onStarted(Landroid/net/wifi/WifiManager$LocalOnlyHotspotReservation;)V\"/>\n\t\t<method name=\"onStopped()V\"/>\n\t\t<field name=\"ERROR_GENERIC\"/>\n\t\t<field name=\"ERROR_INCOMPATIBLE_MODE\"/>\n\t\t<field name=\"ERROR_NO_CHANNEL\"/>\n\t\t<field name=\"ERROR_TETHERING_DISALLOWED\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiManager$LocalOnlyHotspotReservation\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"getWifiConfiguration()Landroid/net/wifi/WifiConfiguration;\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiManager$MulticastLock\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"acquire()V\"/>\n\t\t<method name=\"isHeld()Z\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"setReferenceCounted(Z)V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiManager$WifiLock\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"acquire()V\"/>\n\t\t<method name=\"isHeld()Z\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"setReferenceCounted(Z)V\"/>\n\t\t<method name=\"setWorkSource(Landroid/os/WorkSource;)V\" since=\"9\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiManager$WpsCallback\" since=\"21\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"onFailed(I)V\" deprecated=\"28\"/>\n\t\t<method name=\"onStarted(Ljava/lang/String;)V\" deprecated=\"28\"/>\n\t\t<method name=\"onSucceeded()V\" deprecated=\"28\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiNetworkSpecifier\" since=\"29\">\n\t\t<extends name=\"android/net/NetworkSpecifier\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiNetworkSpecifier$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/net/wifi/WifiNetworkSpecifier;\"/>\n\t\t<method name=\"setBssid(Landroid/net/MacAddress;)Landroid/net/wifi/WifiNetworkSpecifier$Builder;\"/>\n\t\t<method name=\"setBssidPattern(Landroid/net/MacAddress;Landroid/net/MacAddress;)Landroid/net/wifi/WifiNetworkSpecifier$Builder;\"/>\n\t\t<method name=\"setIsEnhancedOpen(Z)Landroid/net/wifi/WifiNetworkSpecifier$Builder;\"/>\n\t\t<method name=\"setIsHiddenSsid(Z)Landroid/net/wifi/WifiNetworkSpecifier$Builder;\"/>\n\t\t<method name=\"setSsid(Ljava/lang/String;)Landroid/net/wifi/WifiNetworkSpecifier$Builder;\"/>\n\t\t<method name=\"setSsidPattern(Landroid/os/PatternMatcher;)Landroid/net/wifi/WifiNetworkSpecifier$Builder;\"/>\n\t\t<method name=\"setWpa2EnterpriseConfig(Landroid/net/wifi/WifiEnterpriseConfig;)Landroid/net/wifi/WifiNetworkSpecifier$Builder;\"/>\n\t\t<method name=\"setWpa2Passphrase(Ljava/lang/String;)Landroid/net/wifi/WifiNetworkSpecifier$Builder;\"/>\n\t\t<method name=\"setWpa3EnterpriseConfig(Landroid/net/wifi/WifiEnterpriseConfig;)Landroid/net/wifi/WifiNetworkSpecifier$Builder;\"/>\n\t\t<method name=\"setWpa3Passphrase(Ljava/lang/String;)Landroid/net/wifi/WifiNetworkSpecifier$Builder;\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiNetworkSuggestion\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WifiNetworkSuggestion$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/net/wifi/WifiNetworkSuggestion;\"/>\n\t\t<method name=\"setBssid(Landroid/net/MacAddress;)Landroid/net/wifi/WifiNetworkSuggestion$Builder;\"/>\n\t\t<method name=\"setIsAppInteractionRequired(Z)Landroid/net/wifi/WifiNetworkSuggestion$Builder;\"/>\n\t\t<method name=\"setIsEnhancedOpen(Z)Landroid/net/wifi/WifiNetworkSuggestion$Builder;\"/>\n\t\t<method name=\"setIsHiddenSsid(Z)Landroid/net/wifi/WifiNetworkSuggestion$Builder;\"/>\n\t\t<method name=\"setIsMetered(Z)Landroid/net/wifi/WifiNetworkSuggestion$Builder;\"/>\n\t\t<method name=\"setIsUserInteractionRequired(Z)Landroid/net/wifi/WifiNetworkSuggestion$Builder;\"/>\n\t\t<method name=\"setPriority(I)Landroid/net/wifi/WifiNetworkSuggestion$Builder;\"/>\n\t\t<method name=\"setSsid(Ljava/lang/String;)Landroid/net/wifi/WifiNetworkSuggestion$Builder;\"/>\n\t\t<method name=\"setWpa2EnterpriseConfig(Landroid/net/wifi/WifiEnterpriseConfig;)Landroid/net/wifi/WifiNetworkSuggestion$Builder;\"/>\n\t\t<method name=\"setWpa2Passphrase(Ljava/lang/String;)Landroid/net/wifi/WifiNetworkSuggestion$Builder;\"/>\n\t\t<method name=\"setWpa3EnterpriseConfig(Landroid/net/wifi/WifiEnterpriseConfig;)Landroid/net/wifi/WifiNetworkSuggestion$Builder;\"/>\n\t\t<method name=\"setWpa3Passphrase(Ljava/lang/String;)Landroid/net/wifi/WifiNetworkSuggestion$Builder;\"/>\n\t</class>\n\t<class name=\"android/net/wifi/WpsInfo\" since=\"14\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"28\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/wifi/WpsInfo;)V\" deprecated=\"28\"/>\n\t\t<field name=\"BSSID\" since=\"21\" deprecated=\"28\"/>\n\t\t<field name=\"CREATOR\" deprecated=\"28\"/>\n\t\t<field name=\"DISPLAY\" deprecated=\"28\"/>\n\t\t<field name=\"INVALID\" deprecated=\"28\"/>\n\t\t<field name=\"KEYPAD\" deprecated=\"28\"/>\n\t\t<field name=\"LABEL\" deprecated=\"28\"/>\n\t\t<field name=\"PBC\" deprecated=\"28\"/>\n\t\t<field name=\"pin\" deprecated=\"28\"/>\n\t\t<field name=\"setup\" deprecated=\"28\"/>\n\t</class>\n\t<class name=\"android/net/wifi/aware/AttachCallback\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onAttachFailed()V\"/>\n\t\t<method name=\"onAttached(Landroid/net/wifi/aware/WifiAwareSession;)V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/aware/Characteristics\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getMaxMatchFilterLength()I\"/>\n\t\t<method name=\"getMaxServiceNameLength()I\"/>\n\t\t<method name=\"getMaxServiceSpecificInfoLength()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/wifi/aware/DiscoverySession\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"createNetworkSpecifierOpen(Landroid/net/wifi/aware/PeerHandle;)Landroid/net/NetworkSpecifier;\" deprecated=\"29\"/>\n\t\t<method name=\"createNetworkSpecifierPassphrase(Landroid/net/wifi/aware/PeerHandle;Ljava/lang/String;)Landroid/net/NetworkSpecifier;\" deprecated=\"29\"/>\n\t\t<method name=\"sendMessage(Landroid/net/wifi/aware/PeerHandle;I[B)V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/aware/DiscoverySessionCallback\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onMessageReceived(Landroid/net/wifi/aware/PeerHandle;[B)V\"/>\n\t\t<method name=\"onMessageSendFailed(I)V\"/>\n\t\t<method name=\"onMessageSendSucceeded(I)V\"/>\n\t\t<method name=\"onPublishStarted(Landroid/net/wifi/aware/PublishDiscoverySession;)V\"/>\n\t\t<method name=\"onServiceDiscovered(Landroid/net/wifi/aware/PeerHandle;[BLjava/util/List;)V\"/>\n\t\t<method name=\"onServiceDiscoveredWithinRange(Landroid/net/wifi/aware/PeerHandle;[BLjava/util/List;I)V\" since=\"28\"/>\n\t\t<method name=\"onSessionConfigFailed()V\"/>\n\t\t<method name=\"onSessionConfigUpdated()V\"/>\n\t\t<method name=\"onSessionTerminated()V\"/>\n\t\t<method name=\"onSubscribeStarted(Landroid/net/wifi/aware/SubscribeDiscoverySession;)V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/aware/IdentityChangedListener\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onIdentityChanged([B)V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/aware/ParcelablePeerHandle\" since=\"29\">\n\t\t<extends name=\"android/net/wifi/aware/PeerHandle\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/wifi/aware/PeerHandle;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/wifi/aware/PeerHandle\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/net/wifi/aware/PublishConfig\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"PUBLISH_TYPE_SOLICITED\"/>\n\t\t<field name=\"PUBLISH_TYPE_UNSOLICITED\"/>\n\t</class>\n\t<class name=\"android/net/wifi/aware/PublishConfig$Builder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/net/wifi/aware/PublishConfig;\"/>\n\t\t<method name=\"setMatchFilter(Ljava/util/List;)Landroid/net/wifi/aware/PublishConfig$Builder;\"/>\n\t\t<method name=\"setPublishType(I)Landroid/net/wifi/aware/PublishConfig$Builder;\"/>\n\t\t<method name=\"setRangingEnabled(Z)Landroid/net/wifi/aware/PublishConfig$Builder;\" since=\"28\"/>\n\t\t<method name=\"setServiceName(Ljava/lang/String;)Landroid/net/wifi/aware/PublishConfig$Builder;\"/>\n\t\t<method name=\"setServiceSpecificInfo([B)Landroid/net/wifi/aware/PublishConfig$Builder;\"/>\n\t\t<method name=\"setTerminateNotificationEnabled(Z)Landroid/net/wifi/aware/PublishConfig$Builder;\"/>\n\t\t<method name=\"setTtlSec(I)Landroid/net/wifi/aware/PublishConfig$Builder;\"/>\n\t</class>\n\t<class name=\"android/net/wifi/aware/PublishDiscoverySession\" since=\"26\">\n\t\t<extends name=\"android/net/wifi/aware/DiscoverySession\"/>\n\t\t<method name=\"updatePublish(Landroid/net/wifi/aware/PublishConfig;)V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/aware/SubscribeConfig\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"SUBSCRIBE_TYPE_ACTIVE\"/>\n\t\t<field name=\"SUBSCRIBE_TYPE_PASSIVE\"/>\n\t</class>\n\t<class name=\"android/net/wifi/aware/SubscribeConfig$Builder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/net/wifi/aware/SubscribeConfig;\"/>\n\t\t<method name=\"setMatchFilter(Ljava/util/List;)Landroid/net/wifi/aware/SubscribeConfig$Builder;\"/>\n\t\t<method name=\"setMaxDistanceMm(I)Landroid/net/wifi/aware/SubscribeConfig$Builder;\" since=\"28\"/>\n\t\t<method name=\"setMinDistanceMm(I)Landroid/net/wifi/aware/SubscribeConfig$Builder;\" since=\"28\"/>\n\t\t<method name=\"setServiceName(Ljava/lang/String;)Landroid/net/wifi/aware/SubscribeConfig$Builder;\"/>\n\t\t<method name=\"setServiceSpecificInfo([B)Landroid/net/wifi/aware/SubscribeConfig$Builder;\"/>\n\t\t<method name=\"setSubscribeType(I)Landroid/net/wifi/aware/SubscribeConfig$Builder;\"/>\n\t\t<method name=\"setTerminateNotificationEnabled(Z)Landroid/net/wifi/aware/SubscribeConfig$Builder;\"/>\n\t\t<method name=\"setTtlSec(I)Landroid/net/wifi/aware/SubscribeConfig$Builder;\"/>\n\t</class>\n\t<class name=\"android/net/wifi/aware/SubscribeDiscoverySession\" since=\"26\">\n\t\t<extends name=\"android/net/wifi/aware/DiscoverySession\"/>\n\t\t<method name=\"updateSubscribe(Landroid/net/wifi/aware/SubscribeConfig;)V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/aware/WifiAwareManager\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"attach(Landroid/net/wifi/aware/AttachCallback;Landroid/net/wifi/aware/IdentityChangedListener;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"attach(Landroid/net/wifi/aware/AttachCallback;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"getCharacteristics()Landroid/net/wifi/aware/Characteristics;\"/>\n\t\t<method name=\"isAvailable()Z\"/>\n\t\t<field name=\"ACTION_WIFI_AWARE_STATE_CHANGED\"/>\n\t\t<field name=\"WIFI_AWARE_DATA_PATH_ROLE_INITIATOR\"/>\n\t\t<field name=\"WIFI_AWARE_DATA_PATH_ROLE_RESPONDER\"/>\n\t</class>\n\t<class name=\"android/net/wifi/aware/WifiAwareNetworkInfo\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/net/TransportInfo\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getPeerIpv6Addr()Ljava/net/Inet6Address;\"/>\n\t\t<method name=\"getPort()I\"/>\n\t\t<method name=\"getTransportProtocol()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/wifi/aware/WifiAwareNetworkSpecifier\" since=\"29\">\n\t\t<extends name=\"android/net/NetworkSpecifier\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/wifi/aware/WifiAwareNetworkSpecifier$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/wifi/aware/DiscoverySession;Landroid/net/wifi/aware/PeerHandle;)V\"/>\n\t\t<method name=\"build()Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;\"/>\n\t\t<method name=\"setPort(I)Landroid/net/wifi/aware/WifiAwareNetworkSpecifier$Builder;\"/>\n\t\t<method name=\"setPskPassphrase(Ljava/lang/String;)Landroid/net/wifi/aware/WifiAwareNetworkSpecifier$Builder;\"/>\n\t\t<method name=\"setTransportProtocol(I)Landroid/net/wifi/aware/WifiAwareNetworkSpecifier$Builder;\"/>\n\t</class>\n\t<class name=\"android/net/wifi/aware/WifiAwareSession\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"createNetworkSpecifierOpen(I[B)Landroid/net/NetworkSpecifier;\"/>\n\t\t<method name=\"createNetworkSpecifierPassphrase(I[BLjava/lang/String;)Landroid/net/NetworkSpecifier;\"/>\n\t\t<method name=\"publish(Landroid/net/wifi/aware/PublishConfig;Landroid/net/wifi/aware/DiscoverySessionCallback;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"subscribe(Landroid/net/wifi/aware/SubscribeConfig;Landroid/net/wifi/aware/DiscoverySessionCallback;Landroid/os/Handler;)V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/hotspot2/ConfigParser\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"parsePasspointConfig(Ljava/lang/String;[B)Landroid/net/wifi/hotspot2/PasspointConfiguration;\"/>\n\t</class>\n\t<class name=\"android/net/wifi/hotspot2/PasspointConfiguration\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/wifi/hotspot2/PasspointConfiguration;)V\"/>\n\t\t<method name=\"getCredential()Landroid/net/wifi/hotspot2/pps/Credential;\"/>\n\t\t<method name=\"getHomeSp()Landroid/net/wifi/hotspot2/pps/HomeSp;\"/>\n\t\t<method name=\"setCredential(Landroid/net/wifi/hotspot2/pps/Credential;)V\"/>\n\t\t<method name=\"setHomeSp(Landroid/net/wifi/hotspot2/pps/HomeSp;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/wifi/hotspot2/omadm/PpsMoParser\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"parseMoText(Ljava/lang/String;)Landroid/net/wifi/hotspot2/PasspointConfiguration;\"/>\n\t</class>\n\t<class name=\"android/net/wifi/hotspot2/pps/Credential\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/wifi/hotspot2/pps/Credential;)V\"/>\n\t\t<method name=\"getCaCertificate()Ljava/security/cert/X509Certificate;\"/>\n\t\t<method name=\"getCertCredential()Landroid/net/wifi/hotspot2/pps/Credential$CertificateCredential;\"/>\n\t\t<method name=\"getClientCertificateChain()[Ljava/security/cert/X509Certificate;\"/>\n\t\t<method name=\"getClientPrivateKey()Ljava/security/PrivateKey;\"/>\n\t\t<method name=\"getRealm()Ljava/lang/String;\"/>\n\t\t<method name=\"getSimCredential()Landroid/net/wifi/hotspot2/pps/Credential$SimCredential;\"/>\n\t\t<method name=\"getUserCredential()Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;\"/>\n\t\t<method name=\"setCaCertificate(Ljava/security/cert/X509Certificate;)V\"/>\n\t\t<method name=\"setCertCredential(Landroid/net/wifi/hotspot2/pps/Credential$CertificateCredential;)V\"/>\n\t\t<method name=\"setClientCertificateChain([Ljava/security/cert/X509Certificate;)V\"/>\n\t\t<method name=\"setClientPrivateKey(Ljava/security/PrivateKey;)V\"/>\n\t\t<method name=\"setRealm(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setSimCredential(Landroid/net/wifi/hotspot2/pps/Credential$SimCredential;)V\"/>\n\t\t<method name=\"setUserCredential(Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/wifi/hotspot2/pps/Credential$CertificateCredential\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/wifi/hotspot2/pps/Credential$CertificateCredential;)V\"/>\n\t\t<method name=\"getCertSha256Fingerprint()[B\"/>\n\t\t<method name=\"getCertType()Ljava/lang/String;\"/>\n\t\t<method name=\"setCertSha256Fingerprint([B)V\"/>\n\t\t<method name=\"setCertType(Ljava/lang/String;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/wifi/hotspot2/pps/Credential$SimCredential\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/wifi/hotspot2/pps/Credential$SimCredential;)V\"/>\n\t\t<method name=\"getEapType()I\"/>\n\t\t<method name=\"getImsi()Ljava/lang/String;\"/>\n\t\t<method name=\"setEapType(I)V\"/>\n\t\t<method name=\"setImsi(Ljava/lang/String;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/wifi/hotspot2/pps/Credential$UserCredential\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;)V\"/>\n\t\t<method name=\"getEapType()I\"/>\n\t\t<method name=\"getNonEapInnerMethod()Ljava/lang/String;\"/>\n\t\t<method name=\"getPassword()Ljava/lang/String;\"/>\n\t\t<method name=\"getUsername()Ljava/lang/String;\"/>\n\t\t<method name=\"setEapType(I)V\"/>\n\t\t<method name=\"setNonEapInnerMethod(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setPassword(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setUsername(Ljava/lang/String;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/wifi/hotspot2/pps/HomeSp\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/wifi/hotspot2/pps/HomeSp;)V\"/>\n\t\t<method name=\"getFqdn()Ljava/lang/String;\"/>\n\t\t<method name=\"getFriendlyName()Ljava/lang/String;\"/>\n\t\t<method name=\"getRoamingConsortiumOis()[J\"/>\n\t\t<method name=\"setFqdn(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setFriendlyName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setRoamingConsortiumOis([J)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/WifiP2pConfig\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/wifi/p2p/WifiP2pConfig;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"GROUP_OWNER_BAND_2GHZ\" since=\"29\"/>\n\t\t<field name=\"GROUP_OWNER_BAND_5GHZ\" since=\"29\"/>\n\t\t<field name=\"GROUP_OWNER_BAND_AUTO\" since=\"29\"/>\n\t\t<field name=\"deviceAddress\"/>\n\t\t<field name=\"groupOwnerIntent\"/>\n\t\t<field name=\"wps\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/WifiP2pConfig$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/net/wifi/p2p/WifiP2pConfig;\"/>\n\t\t<method name=\"enablePersistentMode(Z)Landroid/net/wifi/p2p/WifiP2pConfig$Builder;\"/>\n\t\t<method name=\"setDeviceAddress(Landroid/net/MacAddress;)Landroid/net/wifi/p2p/WifiP2pConfig$Builder;\"/>\n\t\t<method name=\"setGroupOperatingBand(I)Landroid/net/wifi/p2p/WifiP2pConfig$Builder;\"/>\n\t\t<method name=\"setGroupOperatingFrequency(I)Landroid/net/wifi/p2p/WifiP2pConfig$Builder;\"/>\n\t\t<method name=\"setNetworkName(Ljava/lang/String;)Landroid/net/wifi/p2p/WifiP2pConfig$Builder;\"/>\n\t\t<method name=\"setPassphrase(Ljava/lang/String;)Landroid/net/wifi/p2p/WifiP2pConfig$Builder;\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/WifiP2pDevice\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/wifi/p2p/WifiP2pDevice;)V\"/>\n\t\t<method name=\"isGroupOwner()Z\"/>\n\t\t<method name=\"isServiceDiscoveryCapable()Z\"/>\n\t\t<method name=\"wpsDisplaySupported()Z\"/>\n\t\t<method name=\"wpsKeypadSupported()Z\"/>\n\t\t<method name=\"wpsPbcSupported()Z\"/>\n\t\t<field name=\"AVAILABLE\"/>\n\t\t<field name=\"CONNECTED\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FAILED\"/>\n\t\t<field name=\"INVITED\"/>\n\t\t<field name=\"UNAVAILABLE\"/>\n\t\t<field name=\"deviceAddress\"/>\n\t\t<field name=\"deviceName\"/>\n\t\t<field name=\"primaryDeviceType\"/>\n\t\t<field name=\"secondaryDeviceType\"/>\n\t\t<field name=\"status\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/WifiP2pDeviceList\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/wifi/p2p/WifiP2pDeviceList;)V\"/>\n\t\t<method name=\"get(Ljava/lang/String;)Landroid/net/wifi/p2p/WifiP2pDevice;\" since=\"18\"/>\n\t\t<method name=\"getDeviceList()Ljava/util/Collection;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/WifiP2pGroup\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/wifi/p2p/WifiP2pGroup;)V\"/>\n\t\t<method name=\"getClientList()Ljava/util/Collection;\"/>\n\t\t<method name=\"getFrequency()I\" since=\"29\"/>\n\t\t<method name=\"getInterface()Ljava/lang/String;\"/>\n\t\t<method name=\"getNetworkName()Ljava/lang/String;\"/>\n\t\t<method name=\"getOwner()Landroid/net/wifi/p2p/WifiP2pDevice;\"/>\n\t\t<method name=\"getPassphrase()Ljava/lang/String;\"/>\n\t\t<method name=\"isGroupOwner()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/WifiP2pInfo\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/wifi/p2p/WifiP2pInfo;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"groupFormed\"/>\n\t\t<field name=\"groupOwnerAddress\"/>\n\t\t<field name=\"isGroupOwner\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/WifiP2pManager\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addLocalService(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/nsd/WifiP2pServiceInfo;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V\" since=\"16\"/>\n\t\t<method name=\"addServiceRequest(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V\" since=\"16\"/>\n\t\t<method name=\"cancelConnect(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V\"/>\n\t\t<method name=\"clearLocalServices(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V\" since=\"16\"/>\n\t\t<method name=\"clearServiceRequests(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V\" since=\"16\"/>\n\t\t<method name=\"connect(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pConfig;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V\"/>\n\t\t<method name=\"createGroup(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pConfig;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V\" since=\"29\"/>\n\t\t<method name=\"createGroup(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V\"/>\n\t\t<method name=\"discoverPeers(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V\"/>\n\t\t<method name=\"discoverServices(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V\" since=\"16\"/>\n\t\t<method name=\"initialize(Landroid/content/Context;Landroid/os/Looper;Landroid/net/wifi/p2p/WifiP2pManager$ChannelListener;)Landroid/net/wifi/p2p/WifiP2pManager$Channel;\"/>\n\t\t<method name=\"removeGroup(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V\"/>\n\t\t<method name=\"removeLocalService(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/nsd/WifiP2pServiceInfo;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V\" since=\"16\"/>\n\t\t<method name=\"removeServiceRequest(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V\" since=\"16\"/>\n\t\t<method name=\"requestConnectionInfo(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ConnectionInfoListener;)V\"/>\n\t\t<method name=\"requestDeviceInfo(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$DeviceInfoListener;)V\" since=\"29\"/>\n\t\t<method name=\"requestDiscoveryState(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$DiscoveryStateListener;)V\" since=\"29\"/>\n\t\t<method name=\"requestGroupInfo(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$GroupInfoListener;)V\"/>\n\t\t<method name=\"requestNetworkInfo(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$NetworkInfoListener;)V\" since=\"29\"/>\n\t\t<method name=\"requestP2pState(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$P2pStateListener;)V\" since=\"29\"/>\n\t\t<method name=\"requestPeers(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$PeerListListener;)V\"/>\n\t\t<method name=\"setDnsSdResponseListeners(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$DnsSdServiceResponseListener;Landroid/net/wifi/p2p/WifiP2pManager$DnsSdTxtRecordListener;)V\" since=\"16\"/>\n\t\t<method name=\"setServiceResponseListener(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ServiceResponseListener;)V\" since=\"16\"/>\n\t\t<method name=\"setUpnpServiceResponseListener(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$UpnpServiceResponseListener;)V\" since=\"16\"/>\n\t\t<method name=\"stopPeerDiscovery(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V\" since=\"16\"/>\n\t\t<field name=\"BUSY\"/>\n\t\t<field name=\"ERROR\"/>\n\t\t<field name=\"EXTRA_DISCOVERY_STATE\" since=\"16\"/>\n\t\t<field name=\"EXTRA_NETWORK_INFO\"/>\n\t\t<field name=\"EXTRA_P2P_DEVICE_LIST\" since=\"18\"/>\n\t\t<field name=\"EXTRA_WIFI_P2P_DEVICE\"/>\n\t\t<field name=\"EXTRA_WIFI_P2P_GROUP\" since=\"18\"/>\n\t\t<field name=\"EXTRA_WIFI_P2P_INFO\"/>\n\t\t<field name=\"EXTRA_WIFI_STATE\"/>\n\t\t<field name=\"NO_SERVICE_REQUESTS\" since=\"16\"/>\n\t\t<field name=\"P2P_UNSUPPORTED\"/>\n\t\t<field name=\"WIFI_P2P_CONNECTION_CHANGED_ACTION\"/>\n\t\t<field name=\"WIFI_P2P_DISCOVERY_CHANGED_ACTION\" since=\"16\"/>\n\t\t<field name=\"WIFI_P2P_DISCOVERY_STARTED\" since=\"16\"/>\n\t\t<field name=\"WIFI_P2P_DISCOVERY_STOPPED\" since=\"16\"/>\n\t\t<field name=\"WIFI_P2P_PEERS_CHANGED_ACTION\"/>\n\t\t<field name=\"WIFI_P2P_STATE_CHANGED_ACTION\"/>\n\t\t<field name=\"WIFI_P2P_STATE_DISABLED\"/>\n\t\t<field name=\"WIFI_P2P_STATE_ENABLED\"/>\n\t\t<field name=\"WIFI_P2P_THIS_DEVICE_CHANGED_ACTION\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/WifiP2pManager$ActionListener\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onFailure(I)V\"/>\n\t\t<method name=\"onSuccess()V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/WifiP2pManager$Channel\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\" since=\"27\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/WifiP2pManager$ChannelListener\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onChannelDisconnected()V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/WifiP2pManager$ConnectionInfoListener\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onConnectionInfoAvailable(Landroid/net/wifi/p2p/WifiP2pInfo;)V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/WifiP2pManager$DeviceInfoListener\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDeviceInfoAvailable(Landroid/net/wifi/p2p/WifiP2pDevice;)V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/WifiP2pManager$DiscoveryStateListener\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDiscoveryStateAvailable(I)V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/WifiP2pManager$DnsSdServiceResponseListener\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDnsSdServiceAvailable(Ljava/lang/String;Ljava/lang/String;Landroid/net/wifi/p2p/WifiP2pDevice;)V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/WifiP2pManager$DnsSdTxtRecordListener\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDnsSdTxtRecordAvailable(Ljava/lang/String;Ljava/util/Map;Landroid/net/wifi/p2p/WifiP2pDevice;)V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/WifiP2pManager$GroupInfoListener\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onGroupInfoAvailable(Landroid/net/wifi/p2p/WifiP2pGroup;)V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/WifiP2pManager$NetworkInfoListener\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onNetworkInfoAvailable(Landroid/net/NetworkInfo;)V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/WifiP2pManager$P2pStateListener\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onP2pStateAvailable(I)V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/WifiP2pManager$PeerListListener\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onPeersAvailable(Landroid/net/wifi/p2p/WifiP2pDeviceList;)V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/WifiP2pManager$ServiceResponseListener\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onServiceAvailable(I[BLandroid/net/wifi/p2p/WifiP2pDevice;)V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/WifiP2pManager$UpnpServiceResponseListener\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onUpnpServiceAvailable(Ljava/util/List;Landroid/net/wifi/p2p/WifiP2pDevice;)V\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo\" since=\"16\">\n\t\t<extends name=\"android/net/wifi/p2p/nsd/WifiP2pServiceInfo\"/>\n\t\t<method name=\"newInstance(Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo;\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest\" since=\"16\">\n\t\t<extends name=\"android/net/wifi/p2p/nsd/WifiP2pServiceRequest\"/>\n\t\t<method name=\"newInstance()Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest;\"/>\n\t\t<method name=\"newInstance(Ljava/lang/String;)Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest;\"/>\n\t\t<method name=\"newInstance(Ljava/lang/String;Ljava/lang/String;)Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest;\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/nsd/WifiP2pServiceInfo\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"SERVICE_TYPE_ALL\"/>\n\t\t<field name=\"SERVICE_TYPE_BONJOUR\"/>\n\t\t<field name=\"SERVICE_TYPE_UPNP\"/>\n\t\t<field name=\"SERVICE_TYPE_VENDOR_SPECIFIC\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/nsd/WifiP2pServiceRequest\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"newInstance(I)Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;\"/>\n\t\t<method name=\"newInstance(ILjava/lang/String;)Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/nsd/WifiP2pUpnpServiceInfo\" since=\"16\">\n\t\t<extends name=\"android/net/wifi/p2p/nsd/WifiP2pServiceInfo\"/>\n\t\t<method name=\"newInstance(Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceInfo;\"/>\n\t</class>\n\t<class name=\"android/net/wifi/p2p/nsd/WifiP2pUpnpServiceRequest\" since=\"16\">\n\t\t<extends name=\"android/net/wifi/p2p/nsd/WifiP2pServiceRequest\"/>\n\t\t<method name=\"newInstance()Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceRequest;\"/>\n\t\t<method name=\"newInstance(Ljava/lang/String;)Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceRequest;\"/>\n\t</class>\n\t<class name=\"android/net/wifi/rtt/CivicLocationKeys\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ADDITIONAL_CODE\"/>\n\t\t<field name=\"APT\"/>\n\t\t<field name=\"BOROUGH\"/>\n\t\t<field name=\"BRANCH_ROAD_NAME\"/>\n\t\t<field name=\"BUILDING\"/>\n\t\t<field name=\"CITY\"/>\n\t\t<field name=\"COUNTY\"/>\n\t\t<field name=\"DESK\"/>\n\t\t<field name=\"FLOOR\"/>\n\t\t<field name=\"GROUP_OF_STREETS\"/>\n\t\t<field name=\"HNO\"/>\n\t\t<field name=\"HNS\"/>\n\t\t<field name=\"LANGUAGE\"/>\n\t\t<field name=\"LMK\"/>\n\t\t<field name=\"LOC\"/>\n\t\t<field name=\"NAM\"/>\n\t\t<field name=\"NEIGHBORHOOD\"/>\n\t\t<field name=\"PCN\"/>\n\t\t<field name=\"POD\"/>\n\t\t<field name=\"POSTAL_CODE\"/>\n\t\t<field name=\"PO_BOX\"/>\n\t\t<field name=\"PRD\"/>\n\t\t<field name=\"PRIMARY_ROAD_NAME\"/>\n\t\t<field name=\"ROAD_SECTION\"/>\n\t\t<field name=\"ROOM\"/>\n\t\t<field name=\"SCRIPT\"/>\n\t\t<field name=\"STATE\"/>\n\t\t<field name=\"STREET_NAME_POST_MODIFIER\"/>\n\t\t<field name=\"STREET_NAME_PRE_MODIFIER\"/>\n\t\t<field name=\"STS\"/>\n\t\t<field name=\"SUBBRANCH_ROAD_NAME\"/>\n\t\t<field name=\"TYPE_OF_PLACE\"/>\n\t</class>\n\t<class name=\"android/net/wifi/rtt/RangingRequest\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getMaxPeers()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/net/wifi/rtt/RangingRequest$Builder\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addAccessPoint(Landroid/net/wifi/ScanResult;)Landroid/net/wifi/rtt/RangingRequest$Builder;\"/>\n\t\t<method name=\"addAccessPoints(Ljava/util/List;)Landroid/net/wifi/rtt/RangingRequest$Builder;\"/>\n\t\t<method name=\"addWifiAwarePeer(Landroid/net/MacAddress;)Landroid/net/wifi/rtt/RangingRequest$Builder;\"/>\n\t\t<method name=\"addWifiAwarePeer(Landroid/net/wifi/aware/PeerHandle;)Landroid/net/wifi/rtt/RangingRequest$Builder;\"/>\n\t\t<method name=\"build()Landroid/net/wifi/rtt/RangingRequest;\"/>\n\t</class>\n\t<class name=\"android/net/wifi/rtt/RangingResult\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getDistanceMm()I\"/>\n\t\t<method name=\"getDistanceStdDevMm()I\"/>\n\t\t<method name=\"getMacAddress()Landroid/net/MacAddress;\"/>\n\t\t<method name=\"getNumAttemptedMeasurements()I\"/>\n\t\t<method name=\"getNumSuccessfulMeasurements()I\"/>\n\t\t<method name=\"getPeerHandle()Landroid/net/wifi/aware/PeerHandle;\"/>\n\t\t<method name=\"getRangingTimestampMillis()J\"/>\n\t\t<method name=\"getRssi()I\"/>\n\t\t<method name=\"getStatus()I\"/>\n\t\t<method name=\"getUnverifiedResponderLocation()Landroid/net/wifi/rtt/ResponderLocation;\" since=\"29\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"STATUS_FAIL\"/>\n\t\t<field name=\"STATUS_RESPONDER_DOES_NOT_SUPPORT_IEEE80211MC\"/>\n\t\t<field name=\"STATUS_SUCCESS\"/>\n\t</class>\n\t<class name=\"android/net/wifi/rtt/RangingResultCallback\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onRangingFailure(I)V\"/>\n\t\t<method name=\"onRangingResults(Ljava/util/List;)V\"/>\n\t\t<field name=\"STATUS_CODE_FAIL\"/>\n\t\t<field name=\"STATUS_CODE_FAIL_RTT_NOT_AVAILABLE\"/>\n\t</class>\n\t<class name=\"android/net/wifi/rtt/ResponderLocation\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getAltitude()D\"/>\n\t\t<method name=\"getAltitudeType()I\"/>\n\t\t<method name=\"getAltitudeUncertainty()D\"/>\n\t\t<method name=\"getColocatedBssids()Ljava/util/List;\"/>\n\t\t<method name=\"getDatum()I\"/>\n\t\t<method name=\"getExpectedToMove()I\"/>\n\t\t<method name=\"getFloorNumber()D\"/>\n\t\t<method name=\"getHeightAboveFloorMeters()D\"/>\n\t\t<method name=\"getHeightAboveFloorUncertaintyMeters()D\"/>\n\t\t<method name=\"getLatitude()D\"/>\n\t\t<method name=\"getLatitudeUncertainty()D\"/>\n\t\t<method name=\"getLciVersion()I\"/>\n\t\t<method name=\"getLongitude()D\"/>\n\t\t<method name=\"getLongitudeUncertainty()D\"/>\n\t\t<method name=\"getMapImageMimeType()Ljava/lang/String;\"/>\n\t\t<method name=\"getMapImageUri()Landroid/net/Uri;\"/>\n\t\t<method name=\"getRegisteredLocationAgreementIndication()Z\"/>\n\t\t<method name=\"isLciSubelementValid()Z\"/>\n\t\t<method name=\"isZaxisSubelementValid()Z\"/>\n\t\t<method name=\"toCivicLocationAddress()Landroid/location/Address;\"/>\n\t\t<method name=\"toCivicLocationSparseArray()Landroid/util/SparseArray;\"/>\n\t\t<method name=\"toLocation()Landroid/location/Location;\"/>\n\t\t<field name=\"ALTITUDE_FLOORS\"/>\n\t\t<field name=\"ALTITUDE_METERS\"/>\n\t\t<field name=\"ALTITUDE_UNDEFINED\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"DATUM_NAD83_MLLW\"/>\n\t\t<field name=\"DATUM_NAD83_NAV88\"/>\n\t\t<field name=\"DATUM_UNDEFINED\"/>\n\t\t<field name=\"DATUM_WGS84\"/>\n\t\t<field name=\"LCI_VERSION_1\"/>\n\t\t<field name=\"LOCATION_FIXED\"/>\n\t\t<field name=\"LOCATION_MOVEMENT_UNKNOWN\"/>\n\t\t<field name=\"LOCATION_RESERVED\"/>\n\t\t<field name=\"LOCATION_VARIABLE\"/>\n\t</class>\n\t<class name=\"android/net/wifi/rtt/WifiRttManager\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"isAvailable()Z\"/>\n\t\t<method name=\"startRanging(Landroid/net/wifi/rtt/RangingRequest;Ljava/util/concurrent/Executor;Landroid/net/wifi/rtt/RangingResultCallback;)V\"/>\n\t\t<field name=\"ACTION_WIFI_RTT_STATE_CHANGED\"/>\n\t</class>\n\t<class name=\"android/nfc/FormatException\" since=\"9\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\" since=\"16\"/>\n\t</class>\n\t<class name=\"android/nfc/NdefMessage\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/nfc/NdefRecord;[Landroid/nfc/NdefRecord;)V\" since=\"16\"/>\n\t\t<method name=\"&lt;init>([B)V\"/>\n\t\t<method name=\"&lt;init>([Landroid/nfc/NdefRecord;)V\"/>\n\t\t<method name=\"getByteArrayLength()I\" since=\"16\"/>\n\t\t<method name=\"getRecords()[Landroid/nfc/NdefRecord;\"/>\n\t\t<method name=\"toByteArray()[B\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/nfc/NdefRecord\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(S[B[B[B)V\"/>\n\t\t<method name=\"&lt;init>([B)V\" deprecated=\"16\"/>\n\t\t<method name=\"createApplicationRecord(Ljava/lang/String;)Landroid/nfc/NdefRecord;\" since=\"14\"/>\n\t\t<method name=\"createExternal(Ljava/lang/String;Ljava/lang/String;[B)Landroid/nfc/NdefRecord;\" since=\"16\"/>\n\t\t<method name=\"createMime(Ljava/lang/String;[B)Landroid/nfc/NdefRecord;\" since=\"16\"/>\n\t\t<method name=\"createTextRecord(Ljava/lang/String;Ljava/lang/String;)Landroid/nfc/NdefRecord;\" since=\"21\"/>\n\t\t<method name=\"createUri(Landroid/net/Uri;)Landroid/nfc/NdefRecord;\" since=\"14\"/>\n\t\t<method name=\"createUri(Ljava/lang/String;)Landroid/nfc/NdefRecord;\" since=\"14\"/>\n\t\t<method name=\"getId()[B\"/>\n\t\t<method name=\"getPayload()[B\"/>\n\t\t<method name=\"getTnf()S\"/>\n\t\t<method name=\"getType()[B\"/>\n\t\t<method name=\"toByteArray()[B\" deprecated=\"16\"/>\n\t\t<method name=\"toMimeType()Ljava/lang/String;\" since=\"16\"/>\n\t\t<method name=\"toUri()Landroid/net/Uri;\" since=\"16\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"RTD_ALTERNATIVE_CARRIER\"/>\n\t\t<field name=\"RTD_HANDOVER_CARRIER\"/>\n\t\t<field name=\"RTD_HANDOVER_REQUEST\"/>\n\t\t<field name=\"RTD_HANDOVER_SELECT\"/>\n\t\t<field name=\"RTD_SMART_POSTER\"/>\n\t\t<field name=\"RTD_TEXT\"/>\n\t\t<field name=\"RTD_URI\"/>\n\t\t<field name=\"TNF_ABSOLUTE_URI\"/>\n\t\t<field name=\"TNF_EMPTY\"/>\n\t\t<field name=\"TNF_EXTERNAL_TYPE\"/>\n\t\t<field name=\"TNF_MIME_MEDIA\"/>\n\t\t<field name=\"TNF_UNCHANGED\"/>\n\t\t<field name=\"TNF_UNKNOWN\"/>\n\t\t<field name=\"TNF_WELL_KNOWN\"/>\n\t</class>\n\t<class name=\"android/nfc/NfcAdapter\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"disableForegroundDispatch(Landroid/app/Activity;)V\" since=\"10\"/>\n\t\t<method name=\"disableForegroundNdefPush(Landroid/app/Activity;)V\" since=\"10\" deprecated=\"15\"/>\n\t\t<method name=\"disableReaderMode(Landroid/app/Activity;)V\" since=\"19\"/>\n\t\t<method name=\"enableForegroundDispatch(Landroid/app/Activity;Landroid/app/PendingIntent;[Landroid/content/IntentFilter;[[Ljava/lang/String;)V\" since=\"10\"/>\n\t\t<method name=\"enableForegroundNdefPush(Landroid/app/Activity;Landroid/nfc/NdefMessage;)V\" since=\"10\" deprecated=\"15\"/>\n\t\t<method name=\"enableReaderMode(Landroid/app/Activity;Landroid/nfc/NfcAdapter$ReaderCallback;ILandroid/os/Bundle;)V\" since=\"19\"/>\n\t\t<method name=\"getDefaultAdapter()Landroid/nfc/NfcAdapter;\" deprecated=\"15\" removed=\"16\"/>\n\t\t<method name=\"getDefaultAdapter(Landroid/content/Context;)Landroid/nfc/NfcAdapter;\" since=\"10\"/>\n\t\t<method name=\"ignore(Landroid/nfc/Tag;ILandroid/nfc/NfcAdapter$OnTagRemovedListener;Landroid/os/Handler;)Z\" since=\"24\"/>\n\t\t<method name=\"invokeBeam(Landroid/app/Activity;)Z\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"isEnabled()Z\"/>\n\t\t<method name=\"isNdefPushEnabled()Z\" since=\"16\" deprecated=\"29\"/>\n\t\t<method name=\"isSecureNfcEnabled()Z\" since=\"29\"/>\n\t\t<method name=\"isSecureNfcSupported()Z\" since=\"29\"/>\n\t\t<method name=\"setBeamPushUris([Landroid/net/Uri;Landroid/app/Activity;)V\" since=\"16\" deprecated=\"29\"/>\n\t\t<method name=\"setBeamPushUrisCallback(Landroid/nfc/NfcAdapter$CreateBeamUrisCallback;Landroid/app/Activity;)V\" since=\"16\" deprecated=\"29\"/>\n\t\t<method name=\"setNdefPushMessage(Landroid/nfc/NdefMessage;Landroid/app/Activity;[Landroid/app/Activity;)V\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"setNdefPushMessageCallback(Landroid/nfc/NfcAdapter$CreateNdefMessageCallback;Landroid/app/Activity;[Landroid/app/Activity;)V\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"setOnNdefPushCompleteCallback(Landroid/nfc/NfcAdapter$OnNdefPushCompleteCallback;Landroid/app/Activity;[Landroid/app/Activity;)V\" since=\"14\" deprecated=\"29\"/>\n\t\t<field name=\"ACTION_ADAPTER_STATE_CHANGED\" since=\"18\"/>\n\t\t<field name=\"ACTION_NDEF_DISCOVERED\" since=\"10\"/>\n\t\t<field name=\"ACTION_PREFERRED_PAYMENT_CHANGED\" since=\"30\"/>\n\t\t<field name=\"ACTION_TAG_DISCOVERED\"/>\n\t\t<field name=\"ACTION_TECH_DISCOVERED\" since=\"10\"/>\n\t\t<field name=\"ACTION_TRANSACTION_DETECTED\" since=\"28\"/>\n\t\t<field name=\"EXTRA_ADAPTER_STATE\" since=\"18\"/>\n\t\t<field name=\"EXTRA_AID\" since=\"28\"/>\n\t\t<field name=\"EXTRA_DATA\" since=\"28\"/>\n\t\t<field name=\"EXTRA_ID\"/>\n\t\t<field name=\"EXTRA_NDEF_MESSAGES\"/>\n\t\t<field name=\"EXTRA_PREFERRED_PAYMENT_CHANGED_REASON\" since=\"30\"/>\n\t\t<field name=\"EXTRA_READER_PRESENCE_CHECK_DELAY\" since=\"19\"/>\n\t\t<field name=\"EXTRA_SECURE_ELEMENT_NAME\" since=\"28\"/>\n\t\t<field name=\"EXTRA_TAG\" since=\"10\"/>\n\t\t<field name=\"FLAG_READER_NFC_A\" since=\"19\"/>\n\t\t<field name=\"FLAG_READER_NFC_B\" since=\"19\"/>\n\t\t<field name=\"FLAG_READER_NFC_BARCODE\" since=\"19\"/>\n\t\t<field name=\"FLAG_READER_NFC_F\" since=\"19\"/>\n\t\t<field name=\"FLAG_READER_NFC_V\" since=\"19\"/>\n\t\t<field name=\"FLAG_READER_NO_PLATFORM_SOUNDS\" since=\"19\"/>\n\t\t<field name=\"FLAG_READER_SKIP_NDEF_CHECK\" since=\"19\"/>\n\t\t<field name=\"PREFERRED_PAYMENT_CHANGED\" since=\"30\"/>\n\t\t<field name=\"PREFERRED_PAYMENT_LOADED\" since=\"30\"/>\n\t\t<field name=\"PREFERRED_PAYMENT_UPDATED\" since=\"30\"/>\n\t\t<field name=\"STATE_OFF\" since=\"18\"/>\n\t\t<field name=\"STATE_ON\" since=\"18\"/>\n\t\t<field name=\"STATE_TURNING_OFF\" since=\"18\"/>\n\t\t<field name=\"STATE_TURNING_ON\" since=\"18\"/>\n\t</class>\n\t<class name=\"android/nfc/NfcAdapter$CreateBeamUrisCallback\" since=\"16\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createBeamUris(Landroid/nfc/NfcEvent;)[Landroid/net/Uri;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/nfc/NfcAdapter$CreateNdefMessageCallback\" since=\"14\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createNdefMessage(Landroid/nfc/NfcEvent;)Landroid/nfc/NdefMessage;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/nfc/NfcAdapter$OnNdefPushCompleteCallback\" since=\"14\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onNdefPushComplete(Landroid/nfc/NfcEvent;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/nfc/NfcAdapter$OnTagRemovedListener\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onTagRemoved()V\"/>\n\t</class>\n\t<class name=\"android/nfc/NfcAdapter$ReaderCallback\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onTagDiscovered(Landroid/nfc/Tag;)V\"/>\n\t</class>\n\t<class name=\"android/nfc/NfcEvent\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"nfcAdapter\"/>\n\t\t<field name=\"peerLlcpMajorVersion\" since=\"23\"/>\n\t\t<field name=\"peerLlcpMinorVersion\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/nfc/NfcManager\" since=\"10\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getDefaultAdapter()Landroid/nfc/NfcAdapter;\"/>\n\t</class>\n\t<class name=\"android/nfc/Tag\" since=\"10\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getId()[B\"/>\n\t\t<method name=\"getTechList()[Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/nfc/TagLostException\" since=\"10\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/nfc/cardemulation/CardEmulation\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"categoryAllowsForegroundPreference(Ljava/lang/String;)Z\" since=\"21\"/>\n\t\t<method name=\"getAidsForPreferredPaymentService()Ljava/util/List;\" since=\"30\"/>\n\t\t<method name=\"getAidsForService(Landroid/content/ComponentName;Ljava/lang/String;)Ljava/util/List;\" since=\"21\"/>\n\t\t<method name=\"getDescriptionForPreferredPaymentService()Ljava/lang/CharSequence;\" since=\"30\"/>\n\t\t<method name=\"getInstance(Landroid/nfc/NfcAdapter;)Landroid/nfc/cardemulation/CardEmulation;\"/>\n\t\t<method name=\"getRouteDestinationForPreferredPaymentService()Ljava/lang/String;\" since=\"30\"/>\n\t\t<method name=\"getSelectionModeForCategory(Ljava/lang/String;)I\"/>\n\t\t<method name=\"isDefaultServiceForAid(Landroid/content/ComponentName;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isDefaultServiceForCategory(Landroid/content/ComponentName;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"registerAidsForService(Landroid/content/ComponentName;Ljava/lang/String;Ljava/util/List;)Z\" since=\"21\"/>\n\t\t<method name=\"removeAidsForService(Landroid/content/ComponentName;Ljava/lang/String;)Z\" since=\"21\"/>\n\t\t<method name=\"setOffHostForService(Landroid/content/ComponentName;Ljava/lang/String;)Z\" since=\"29\"/>\n\t\t<method name=\"setPreferredService(Landroid/app/Activity;Landroid/content/ComponentName;)Z\" since=\"21\"/>\n\t\t<method name=\"supportsAidPrefixRegistration()Z\" since=\"21\"/>\n\t\t<method name=\"unsetOffHostForService(Landroid/content/ComponentName;)Z\" since=\"29\"/>\n\t\t<method name=\"unsetPreferredService(Landroid/app/Activity;)Z\" since=\"21\"/>\n\t\t<field name=\"ACTION_CHANGE_DEFAULT\"/>\n\t\t<field name=\"CATEGORY_OTHER\"/>\n\t\t<field name=\"CATEGORY_PAYMENT\"/>\n\t\t<field name=\"EXTRA_CATEGORY\"/>\n\t\t<field name=\"EXTRA_SERVICE_COMPONENT\"/>\n\t\t<field name=\"SELECTION_MODE_ALWAYS_ASK\"/>\n\t\t<field name=\"SELECTION_MODE_ASK_IF_CONFLICT\"/>\n\t\t<field name=\"SELECTION_MODE_PREFER_DEFAULT\"/>\n\t</class>\n\t<class name=\"android/nfc/cardemulation/HostApduService\" since=\"19\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"notifyUnhandled()V\"/>\n\t\t<method name=\"onDeactivated(I)V\"/>\n\t\t<method name=\"processCommandApdu([BLandroid/os/Bundle;)[B\"/>\n\t\t<method name=\"sendResponseApdu([B)V\"/>\n\t\t<field name=\"DEACTIVATION_DESELECTED\"/>\n\t\t<field name=\"DEACTIVATION_LINK_LOSS\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t\t<field name=\"SERVICE_META_DATA\"/>\n\t</class>\n\t<class name=\"android/nfc/cardemulation/HostNfcFService\" since=\"24\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onDeactivated(I)V\"/>\n\t\t<method name=\"processNfcFPacket([BLandroid/os/Bundle;)[B\"/>\n\t\t<method name=\"sendResponsePacket([B)V\"/>\n\t\t<field name=\"DEACTIVATION_LINK_LOSS\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t\t<field name=\"SERVICE_META_DATA\"/>\n\t</class>\n\t<class name=\"android/nfc/cardemulation/NfcFCardEmulation\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"disableService(Landroid/app/Activity;)Z\"/>\n\t\t<method name=\"enableService(Landroid/app/Activity;Landroid/content/ComponentName;)Z\"/>\n\t\t<method name=\"getInstance(Landroid/nfc/NfcAdapter;)Landroid/nfc/cardemulation/NfcFCardEmulation;\"/>\n\t\t<method name=\"getNfcid2ForService(Landroid/content/ComponentName;)Ljava/lang/String;\"/>\n\t\t<method name=\"getSystemCodeForService(Landroid/content/ComponentName;)Ljava/lang/String;\"/>\n\t\t<method name=\"registerSystemCodeForService(Landroid/content/ComponentName;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"setNfcid2ForService(Landroid/content/ComponentName;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"unregisterSystemCodeForService(Landroid/content/ComponentName;)Z\"/>\n\t</class>\n\t<class name=\"android/nfc/cardemulation/OffHostApduService\" since=\"19\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t\t<field name=\"SERVICE_META_DATA\"/>\n\t</class>\n\t<class name=\"android/nfc/tech/IsoDep\" since=\"10\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/nfc/tech/TagTechnology\"/>\n\t\t<method name=\"get(Landroid/nfc/Tag;)Landroid/nfc/tech/IsoDep;\"/>\n\t\t<method name=\"getHiLayerResponse()[B\"/>\n\t\t<method name=\"getHistoricalBytes()[B\"/>\n\t\t<method name=\"getMaxTransceiveLength()I\" since=\"14\"/>\n\t\t<method name=\"getTimeout()I\" since=\"14\"/>\n\t\t<method name=\"isExtendedLengthApduSupported()Z\" since=\"16\"/>\n\t\t<method name=\"setTimeout(I)V\"/>\n\t\t<method name=\"transceive([B)[B\"/>\n\t</class>\n\t<class name=\"android/nfc/tech/MifareClassic\" since=\"10\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/nfc/tech/TagTechnology\"/>\n\t\t<method name=\"authenticateSectorWithKeyA(I[B)Z\"/>\n\t\t<method name=\"authenticateSectorWithKeyB(I[B)Z\"/>\n\t\t<method name=\"blockToSector(I)I\"/>\n\t\t<method name=\"decrement(II)V\"/>\n\t\t<method name=\"get(Landroid/nfc/Tag;)Landroid/nfc/tech/MifareClassic;\"/>\n\t\t<method name=\"getBlockCount()I\"/>\n\t\t<method name=\"getBlockCountInSector(I)I\"/>\n\t\t<method name=\"getMaxTransceiveLength()I\" since=\"14\"/>\n\t\t<method name=\"getSectorCount()I\"/>\n\t\t<method name=\"getSize()I\"/>\n\t\t<method name=\"getTimeout()I\" since=\"14\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<method name=\"increment(II)V\"/>\n\t\t<method name=\"readBlock(I)[B\"/>\n\t\t<method name=\"restore(I)V\"/>\n\t\t<method name=\"sectorToBlock(I)I\"/>\n\t\t<method name=\"setTimeout(I)V\" since=\"14\"/>\n\t\t<method name=\"transceive([B)[B\"/>\n\t\t<method name=\"transfer(I)V\"/>\n\t\t<method name=\"writeBlock(I[B)V\"/>\n\t\t<field name=\"BLOCK_SIZE\"/>\n\t\t<field name=\"KEY_DEFAULT\"/>\n\t\t<field name=\"KEY_MIFARE_APPLICATION_DIRECTORY\"/>\n\t\t<field name=\"KEY_NFC_FORUM\"/>\n\t\t<field name=\"SIZE_1K\"/>\n\t\t<field name=\"SIZE_2K\"/>\n\t\t<field name=\"SIZE_4K\"/>\n\t\t<field name=\"SIZE_MINI\"/>\n\t\t<field name=\"TYPE_CLASSIC\"/>\n\t\t<field name=\"TYPE_PLUS\"/>\n\t\t<field name=\"TYPE_PRO\"/>\n\t\t<field name=\"TYPE_UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/nfc/tech/MifareUltralight\" since=\"10\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/nfc/tech/TagTechnology\"/>\n\t\t<method name=\"get(Landroid/nfc/Tag;)Landroid/nfc/tech/MifareUltralight;\"/>\n\t\t<method name=\"getMaxTransceiveLength()I\" since=\"14\"/>\n\t\t<method name=\"getTimeout()I\" since=\"14\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<method name=\"readPages(I)[B\"/>\n\t\t<method name=\"setTimeout(I)V\" since=\"14\"/>\n\t\t<method name=\"transceive([B)[B\"/>\n\t\t<method name=\"writePage(I[B)V\"/>\n\t\t<field name=\"PAGE_SIZE\"/>\n\t\t<field name=\"TYPE_ULTRALIGHT\"/>\n\t\t<field name=\"TYPE_ULTRALIGHT_C\"/>\n\t\t<field name=\"TYPE_UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/nfc/tech/Ndef\" since=\"10\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/nfc/tech/TagTechnology\"/>\n\t\t<method name=\"canMakeReadOnly()Z\"/>\n\t\t<method name=\"get(Landroid/nfc/Tag;)Landroid/nfc/tech/Ndef;\"/>\n\t\t<method name=\"getCachedNdefMessage()Landroid/nfc/NdefMessage;\"/>\n\t\t<method name=\"getMaxSize()I\"/>\n\t\t<method name=\"getNdefMessage()Landroid/nfc/NdefMessage;\"/>\n\t\t<method name=\"getType()Ljava/lang/String;\"/>\n\t\t<method name=\"isWritable()Z\"/>\n\t\t<method name=\"makeReadOnly()Z\"/>\n\t\t<method name=\"writeNdefMessage(Landroid/nfc/NdefMessage;)V\"/>\n\t\t<field name=\"MIFARE_CLASSIC\"/>\n\t\t<field name=\"NFC_FORUM_TYPE_1\"/>\n\t\t<field name=\"NFC_FORUM_TYPE_2\"/>\n\t\t<field name=\"NFC_FORUM_TYPE_3\"/>\n\t\t<field name=\"NFC_FORUM_TYPE_4\"/>\n\t</class>\n\t<class name=\"android/nfc/tech/NdefFormatable\" since=\"10\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/nfc/tech/TagTechnology\"/>\n\t\t<method name=\"format(Landroid/nfc/NdefMessage;)V\"/>\n\t\t<method name=\"formatReadOnly(Landroid/nfc/NdefMessage;)V\"/>\n\t\t<method name=\"get(Landroid/nfc/Tag;)Landroid/nfc/tech/NdefFormatable;\"/>\n\t</class>\n\t<class name=\"android/nfc/tech/NfcA\" since=\"10\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/nfc/tech/TagTechnology\"/>\n\t\t<method name=\"get(Landroid/nfc/Tag;)Landroid/nfc/tech/NfcA;\"/>\n\t\t<method name=\"getAtqa()[B\"/>\n\t\t<method name=\"getMaxTransceiveLength()I\" since=\"14\"/>\n\t\t<method name=\"getSak()S\"/>\n\t\t<method name=\"getTimeout()I\" since=\"14\"/>\n\t\t<method name=\"setTimeout(I)V\" since=\"14\"/>\n\t\t<method name=\"transceive([B)[B\"/>\n\t</class>\n\t<class name=\"android/nfc/tech/NfcB\" since=\"10\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/nfc/tech/TagTechnology\"/>\n\t\t<method name=\"get(Landroid/nfc/Tag;)Landroid/nfc/tech/NfcB;\"/>\n\t\t<method name=\"getApplicationData()[B\"/>\n\t\t<method name=\"getMaxTransceiveLength()I\" since=\"14\"/>\n\t\t<method name=\"getProtocolInfo()[B\"/>\n\t\t<method name=\"transceive([B)[B\"/>\n\t</class>\n\t<class name=\"android/nfc/tech/NfcBarcode\" since=\"17\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/nfc/tech/TagTechnology\"/>\n\t\t<method name=\"get(Landroid/nfc/Tag;)Landroid/nfc/tech/NfcBarcode;\"/>\n\t\t<method name=\"getBarcode()[B\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<field name=\"TYPE_KOVIO\"/>\n\t\t<field name=\"TYPE_UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/nfc/tech/NfcF\" since=\"10\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/nfc/tech/TagTechnology\"/>\n\t\t<method name=\"get(Landroid/nfc/Tag;)Landroid/nfc/tech/NfcF;\"/>\n\t\t<method name=\"getManufacturer()[B\"/>\n\t\t<method name=\"getMaxTransceiveLength()I\" since=\"14\"/>\n\t\t<method name=\"getSystemCode()[B\"/>\n\t\t<method name=\"getTimeout()I\" since=\"14\"/>\n\t\t<method name=\"setTimeout(I)V\" since=\"14\"/>\n\t\t<method name=\"transceive([B)[B\"/>\n\t</class>\n\t<class name=\"android/nfc/tech/NfcV\" since=\"10\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/nfc/tech/TagTechnology\"/>\n\t\t<method name=\"get(Landroid/nfc/Tag;)Landroid/nfc/tech/NfcV;\"/>\n\t\t<method name=\"getDsfId()B\"/>\n\t\t<method name=\"getMaxTransceiveLength()I\" since=\"14\"/>\n\t\t<method name=\"getResponseFlags()B\"/>\n\t\t<method name=\"transceive([B)[B\"/>\n\t</class>\n\t<class name=\"android/nfc/tech/TagTechnology\" since=\"10\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<method name=\"connect()V\"/>\n\t\t<method name=\"getTag()Landroid/nfc/Tag;\"/>\n\t\t<method name=\"isConnected()Z\"/>\n\t</class>\n\t<class name=\"android/opengl/EGL14\" since=\"17\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"eglBindAPI(I)Z\"/>\n\t\t<method name=\"eglBindTexImage(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;I)Z\"/>\n\t\t<method name=\"eglChooseConfig(Landroid/opengl/EGLDisplay;[II[Landroid/opengl/EGLConfig;II[II)Z\"/>\n\t\t<method name=\"eglCopyBuffers(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;I)Z\"/>\n\t\t<method name=\"eglCreateContext(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;Landroid/opengl/EGLContext;[II)Landroid/opengl/EGLContext;\"/>\n\t\t<method name=\"eglCreatePbufferFromClientBuffer(Landroid/opengl/EGLDisplay;IILandroid/opengl/EGLConfig;[II)Landroid/opengl/EGLSurface;\"/>\n\t\t<method name=\"eglCreatePbufferSurface(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;[II)Landroid/opengl/EGLSurface;\"/>\n\t\t<method name=\"eglCreatePixmapSurface(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;I[II)Landroid/opengl/EGLSurface;\" deprecated=\"26\"/>\n\t\t<method name=\"eglCreateWindowSurface(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;Ljava/lang/Object;[II)Landroid/opengl/EGLSurface;\"/>\n\t\t<method name=\"eglDestroyContext(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLContext;)Z\"/>\n\t\t<method name=\"eglDestroySurface(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;)Z\"/>\n\t\t<method name=\"eglGetConfigAttrib(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;I[II)Z\"/>\n\t\t<method name=\"eglGetConfigs(Landroid/opengl/EGLDisplay;[Landroid/opengl/EGLConfig;II[II)Z\"/>\n\t\t<method name=\"eglGetCurrentContext()Landroid/opengl/EGLContext;\"/>\n\t\t<method name=\"eglGetCurrentDisplay()Landroid/opengl/EGLDisplay;\"/>\n\t\t<method name=\"eglGetCurrentSurface(I)Landroid/opengl/EGLSurface;\"/>\n\t\t<method name=\"eglGetDisplay(I)Landroid/opengl/EGLDisplay;\"/>\n\t\t<method name=\"eglGetError()I\"/>\n\t\t<method name=\"eglInitialize(Landroid/opengl/EGLDisplay;[II[II)Z\"/>\n\t\t<method name=\"eglMakeCurrent(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;Landroid/opengl/EGLSurface;Landroid/opengl/EGLContext;)Z\"/>\n\t\t<method name=\"eglQueryAPI()I\"/>\n\t\t<method name=\"eglQueryContext(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLContext;I[II)Z\"/>\n\t\t<method name=\"eglQueryString(Landroid/opengl/EGLDisplay;I)Ljava/lang/String;\"/>\n\t\t<method name=\"eglQuerySurface(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;I[II)Z\"/>\n\t\t<method name=\"eglReleaseTexImage(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;I)Z\"/>\n\t\t<method name=\"eglReleaseThread()Z\"/>\n\t\t<method name=\"eglSurfaceAttrib(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;II)Z\"/>\n\t\t<method name=\"eglSwapBuffers(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;)Z\"/>\n\t\t<method name=\"eglSwapInterval(Landroid/opengl/EGLDisplay;I)Z\"/>\n\t\t<method name=\"eglTerminate(Landroid/opengl/EGLDisplay;)Z\"/>\n\t\t<method name=\"eglWaitClient()Z\"/>\n\t\t<method name=\"eglWaitGL()Z\"/>\n\t\t<method name=\"eglWaitNative(I)Z\"/>\n\t\t<field name=\"EGL_ALPHA_MASK_SIZE\"/>\n\t\t<field name=\"EGL_ALPHA_SIZE\"/>\n\t\t<field name=\"EGL_BACK_BUFFER\"/>\n\t\t<field name=\"EGL_BAD_ACCESS\"/>\n\t\t<field name=\"EGL_BAD_ALLOC\"/>\n\t\t<field name=\"EGL_BAD_ATTRIBUTE\"/>\n\t\t<field name=\"EGL_BAD_CONFIG\"/>\n\t\t<field name=\"EGL_BAD_CONTEXT\"/>\n\t\t<field name=\"EGL_BAD_CURRENT_SURFACE\"/>\n\t\t<field name=\"EGL_BAD_DISPLAY\"/>\n\t\t<field name=\"EGL_BAD_MATCH\"/>\n\t\t<field name=\"EGL_BAD_NATIVE_PIXMAP\"/>\n\t\t<field name=\"EGL_BAD_NATIVE_WINDOW\"/>\n\t\t<field name=\"EGL_BAD_PARAMETER\"/>\n\t\t<field name=\"EGL_BAD_SURFACE\"/>\n\t\t<field name=\"EGL_BIND_TO_TEXTURE_RGB\"/>\n\t\t<field name=\"EGL_BIND_TO_TEXTURE_RGBA\"/>\n\t\t<field name=\"EGL_BLUE_SIZE\"/>\n\t\t<field name=\"EGL_BUFFER_DESTROYED\"/>\n\t\t<field name=\"EGL_BUFFER_PRESERVED\"/>\n\t\t<field name=\"EGL_BUFFER_SIZE\"/>\n\t\t<field name=\"EGL_CLIENT_APIS\"/>\n\t\t<field name=\"EGL_COLOR_BUFFER_TYPE\"/>\n\t\t<field name=\"EGL_CONFIG_CAVEAT\"/>\n\t\t<field name=\"EGL_CONFIG_ID\"/>\n\t\t<field name=\"EGL_CONFORMANT\"/>\n\t\t<field name=\"EGL_CONTEXT_CLIENT_TYPE\"/>\n\t\t<field name=\"EGL_CONTEXT_CLIENT_VERSION\"/>\n\t\t<field name=\"EGL_CONTEXT_LOST\"/>\n\t\t<field name=\"EGL_CORE_NATIVE_ENGINE\"/>\n\t\t<field name=\"EGL_DEFAULT_DISPLAY\"/>\n\t\t<field name=\"EGL_DEPTH_SIZE\"/>\n\t\t<field name=\"EGL_DISPLAY_SCALING\"/>\n\t\t<field name=\"EGL_DRAW\"/>\n\t\t<field name=\"EGL_EXTENSIONS\"/>\n\t\t<field name=\"EGL_FALSE\"/>\n\t\t<field name=\"EGL_GREEN_SIZE\"/>\n\t\t<field name=\"EGL_HEIGHT\"/>\n\t\t<field name=\"EGL_HORIZONTAL_RESOLUTION\"/>\n\t\t<field name=\"EGL_LARGEST_PBUFFER\"/>\n\t\t<field name=\"EGL_LEVEL\"/>\n\t\t<field name=\"EGL_LUMINANCE_BUFFER\"/>\n\t\t<field name=\"EGL_LUMINANCE_SIZE\"/>\n\t\t<field name=\"EGL_MATCH_NATIVE_PIXMAP\"/>\n\t\t<field name=\"EGL_MAX_PBUFFER_HEIGHT\"/>\n\t\t<field name=\"EGL_MAX_PBUFFER_PIXELS\"/>\n\t\t<field name=\"EGL_MAX_PBUFFER_WIDTH\"/>\n\t\t<field name=\"EGL_MAX_SWAP_INTERVAL\"/>\n\t\t<field name=\"EGL_MIN_SWAP_INTERVAL\"/>\n\t\t<field name=\"EGL_MIPMAP_LEVEL\"/>\n\t\t<field name=\"EGL_MIPMAP_TEXTURE\"/>\n\t\t<field name=\"EGL_MULTISAMPLE_RESOLVE\"/>\n\t\t<field name=\"EGL_MULTISAMPLE_RESOLVE_BOX\"/>\n\t\t<field name=\"EGL_MULTISAMPLE_RESOLVE_BOX_BIT\"/>\n\t\t<field name=\"EGL_MULTISAMPLE_RESOLVE_DEFAULT\"/>\n\t\t<field name=\"EGL_NATIVE_RENDERABLE\"/>\n\t\t<field name=\"EGL_NATIVE_VISUAL_ID\"/>\n\t\t<field name=\"EGL_NATIVE_VISUAL_TYPE\"/>\n\t\t<field name=\"EGL_NONE\"/>\n\t\t<field name=\"EGL_NON_CONFORMANT_CONFIG\"/>\n\t\t<field name=\"EGL_NOT_INITIALIZED\"/>\n\t\t<field name=\"EGL_NO_CONTEXT\"/>\n\t\t<field name=\"EGL_NO_DISPLAY\"/>\n\t\t<field name=\"EGL_NO_SURFACE\"/>\n\t\t<field name=\"EGL_NO_TEXTURE\"/>\n\t\t<field name=\"EGL_OPENGL_API\"/>\n\t\t<field name=\"EGL_OPENGL_BIT\"/>\n\t\t<field name=\"EGL_OPENGL_ES2_BIT\"/>\n\t\t<field name=\"EGL_OPENGL_ES_API\"/>\n\t\t<field name=\"EGL_OPENGL_ES_BIT\"/>\n\t\t<field name=\"EGL_OPENVG_API\"/>\n\t\t<field name=\"EGL_OPENVG_BIT\"/>\n\t\t<field name=\"EGL_OPENVG_IMAGE\"/>\n\t\t<field name=\"EGL_PBUFFER_BIT\"/>\n\t\t<field name=\"EGL_PIXEL_ASPECT_RATIO\"/>\n\t\t<field name=\"EGL_PIXMAP_BIT\"/>\n\t\t<field name=\"EGL_READ\"/>\n\t\t<field name=\"EGL_RED_SIZE\"/>\n\t\t<field name=\"EGL_RENDERABLE_TYPE\"/>\n\t\t<field name=\"EGL_RENDER_BUFFER\"/>\n\t\t<field name=\"EGL_RGB_BUFFER\"/>\n\t\t<field name=\"EGL_SAMPLES\"/>\n\t\t<field name=\"EGL_SAMPLE_BUFFERS\"/>\n\t\t<field name=\"EGL_SINGLE_BUFFER\"/>\n\t\t<field name=\"EGL_SLOW_CONFIG\"/>\n\t\t<field name=\"EGL_STENCIL_SIZE\"/>\n\t\t<field name=\"EGL_SUCCESS\"/>\n\t\t<field name=\"EGL_SURFACE_TYPE\"/>\n\t\t<field name=\"EGL_SWAP_BEHAVIOR\"/>\n\t\t<field name=\"EGL_SWAP_BEHAVIOR_PRESERVED_BIT\"/>\n\t\t<field name=\"EGL_TEXTURE_2D\"/>\n\t\t<field name=\"EGL_TEXTURE_FORMAT\"/>\n\t\t<field name=\"EGL_TEXTURE_RGB\"/>\n\t\t<field name=\"EGL_TEXTURE_RGBA\"/>\n\t\t<field name=\"EGL_TEXTURE_TARGET\"/>\n\t\t<field name=\"EGL_TRANSPARENT_BLUE_VALUE\"/>\n\t\t<field name=\"EGL_TRANSPARENT_GREEN_VALUE\"/>\n\t\t<field name=\"EGL_TRANSPARENT_RED_VALUE\"/>\n\t\t<field name=\"EGL_TRANSPARENT_RGB\"/>\n\t\t<field name=\"EGL_TRANSPARENT_TYPE\"/>\n\t\t<field name=\"EGL_TRUE\"/>\n\t\t<field name=\"EGL_VENDOR\"/>\n\t\t<field name=\"EGL_VERSION\"/>\n\t\t<field name=\"EGL_VERTICAL_RESOLUTION\"/>\n\t\t<field name=\"EGL_VG_ALPHA_FORMAT\"/>\n\t\t<field name=\"EGL_VG_ALPHA_FORMAT_NONPRE\"/>\n\t\t<field name=\"EGL_VG_ALPHA_FORMAT_PRE\"/>\n\t\t<field name=\"EGL_VG_ALPHA_FORMAT_PRE_BIT\"/>\n\t\t<field name=\"EGL_VG_COLORSPACE\"/>\n\t\t<field name=\"EGL_VG_COLORSPACE_LINEAR\"/>\n\t\t<field name=\"EGL_VG_COLORSPACE_LINEAR_BIT\"/>\n\t\t<field name=\"EGL_VG_COLORSPACE_sRGB\"/>\n\t\t<field name=\"EGL_WIDTH\"/>\n\t\t<field name=\"EGL_WINDOW_BIT\"/>\n\t</class>\n\t<class name=\"android/opengl/EGL15\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"eglClientWaitSync(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSync;IJ)I\"/>\n\t\t<method name=\"eglCreateImage(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLContext;IJ[JI)Landroid/opengl/EGLImage;\"/>\n\t\t<method name=\"eglCreatePlatformPixmapSurface(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;Ljava/nio/Buffer;[JI)Landroid/opengl/EGLSurface;\"/>\n\t\t<method name=\"eglCreatePlatformWindowSurface(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;Ljava/nio/Buffer;[JI)Landroid/opengl/EGLSurface;\"/>\n\t\t<method name=\"eglCreateSync(Landroid/opengl/EGLDisplay;I[JI)Landroid/opengl/EGLSync;\"/>\n\t\t<method name=\"eglDestroyImage(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLImage;)Z\"/>\n\t\t<method name=\"eglDestroySync(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSync;)Z\"/>\n\t\t<method name=\"eglGetPlatformDisplay(IJ[JI)Landroid/opengl/EGLDisplay;\"/>\n\t\t<method name=\"eglGetSyncAttrib(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSync;I[JI)Z\"/>\n\t\t<method name=\"eglWaitSync(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSync;I)Z\"/>\n\t\t<field name=\"EGL_CL_EVENT_HANDLE\"/>\n\t\t<field name=\"EGL_CONDITION_SATISFIED\"/>\n\t\t<field name=\"EGL_CONTEXT_MAJOR_VERSION\"/>\n\t\t<field name=\"EGL_CONTEXT_MINOR_VERSION\"/>\n\t\t<field name=\"EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT\"/>\n\t\t<field name=\"EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT\"/>\n\t\t<field name=\"EGL_CONTEXT_OPENGL_DEBUG\"/>\n\t\t<field name=\"EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE\"/>\n\t\t<field name=\"EGL_CONTEXT_OPENGL_PROFILE_MASK\"/>\n\t\t<field name=\"EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY\"/>\n\t\t<field name=\"EGL_CONTEXT_OPENGL_ROBUST_ACCESS\"/>\n\t\t<field name=\"EGL_FOREVER\"/>\n\t\t<field name=\"EGL_GL_COLORSPACE\"/>\n\t\t<field name=\"EGL_GL_COLORSPACE_LINEAR\"/>\n\t\t<field name=\"EGL_GL_COLORSPACE_SRGB\"/>\n\t\t<field name=\"EGL_GL_RENDERBUFFER\"/>\n\t\t<field name=\"EGL_GL_TEXTURE_2D\"/>\n\t\t<field name=\"EGL_GL_TEXTURE_3D\"/>\n\t\t<field name=\"EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X\"/>\n\t\t<field name=\"EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y\"/>\n\t\t<field name=\"EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z\"/>\n\t\t<field name=\"EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X\"/>\n\t\t<field name=\"EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y\"/>\n\t\t<field name=\"EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z\"/>\n\t\t<field name=\"EGL_GL_TEXTURE_LEVEL\"/>\n\t\t<field name=\"EGL_GL_TEXTURE_ZOFFSET\"/>\n\t\t<field name=\"EGL_IMAGE_PRESERVED\"/>\n\t\t<field name=\"EGL_LOSE_CONTEXT_ON_RESET\"/>\n\t\t<field name=\"EGL_NO_CONTEXT\"/>\n\t\t<field name=\"EGL_NO_DISPLAY\"/>\n\t\t<field name=\"EGL_NO_IMAGE\"/>\n\t\t<field name=\"EGL_NO_RESET_NOTIFICATION\"/>\n\t\t<field name=\"EGL_NO_SURFACE\"/>\n\t\t<field name=\"EGL_NO_SYNC\"/>\n\t\t<field name=\"EGL_OPENGL_ES3_BIT\"/>\n\t\t<field name=\"EGL_PLATFORM_ANDROID_KHR\"/>\n\t\t<field name=\"EGL_SIGNALED\"/>\n\t\t<field name=\"EGL_SYNC_CL_EVENT\"/>\n\t\t<field name=\"EGL_SYNC_CL_EVENT_COMPLETE\"/>\n\t\t<field name=\"EGL_SYNC_CONDITION\"/>\n\t\t<field name=\"EGL_SYNC_FENCE\"/>\n\t\t<field name=\"EGL_SYNC_FLUSH_COMMANDS_BIT\"/>\n\t\t<field name=\"EGL_SYNC_PRIOR_COMMANDS_COMPLETE\"/>\n\t\t<field name=\"EGL_SYNC_STATUS\"/>\n\t\t<field name=\"EGL_SYNC_TYPE\"/>\n\t\t<field name=\"EGL_TIMEOUT_EXPIRED\"/>\n\t\t<field name=\"EGL_UNSIGNALED\"/>\n\t</class>\n\t<class name=\"android/opengl/EGLConfig\" since=\"17\">\n\t\t<extends name=\"android/opengl/EGLObjectHandle\"/>\n\t</class>\n\t<class name=\"android/opengl/EGLContext\" since=\"17\">\n\t\t<extends name=\"android/opengl/EGLObjectHandle\"/>\n\t</class>\n\t<class name=\"android/opengl/EGLDisplay\" since=\"17\">\n\t\t<extends name=\"android/opengl/EGLObjectHandle\"/>\n\t</class>\n\t<class name=\"android/opengl/EGLExt\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"eglPresentationTimeANDROID(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;J)Z\"/>\n\t\t<field name=\"EGL_CONTEXT_FLAGS_KHR\"/>\n\t\t<field name=\"EGL_CONTEXT_MAJOR_VERSION_KHR\"/>\n\t\t<field name=\"EGL_CONTEXT_MINOR_VERSION_KHR\"/>\n\t\t<field name=\"EGL_OPENGL_ES3_BIT_KHR\"/>\n\t\t<field name=\"EGL_RECORDABLE_ANDROID\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/opengl/EGLImage\" since=\"29\">\n\t\t<extends name=\"android/opengl/EGLObjectHandle\"/>\n\t</class>\n\t<class name=\"android/opengl/EGLObjectHandle\" since=\"17\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\" deprecated=\"21\"/>\n\t\t<method name=\"&lt;init>(J)V\" since=\"21\"/>\n\t\t<method name=\"getHandle()I\" deprecated=\"21\"/>\n\t\t<method name=\"getNativeHandle()J\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/opengl/EGLSurface\" since=\"17\">\n\t\t<extends name=\"android/opengl/EGLObjectHandle\"/>\n\t</class>\n\t<class name=\"android/opengl/EGLSync\" since=\"29\">\n\t\t<extends name=\"android/opengl/EGLObjectHandle\"/>\n\t</class>\n\t<class name=\"android/opengl/ETC1\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"decodeBlock(Ljava/nio/Buffer;Ljava/nio/Buffer;)V\"/>\n\t\t<method name=\"decodeImage(Ljava/nio/Buffer;Ljava/nio/Buffer;IIII)V\"/>\n\t\t<method name=\"encodeBlock(Ljava/nio/Buffer;ILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"encodeImage(Ljava/nio/Buffer;IIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"formatHeader(Ljava/nio/Buffer;II)V\"/>\n\t\t<method name=\"getEncodedDataSize(II)I\"/>\n\t\t<method name=\"getHeight(Ljava/nio/Buffer;)I\"/>\n\t\t<method name=\"getWidth(Ljava/nio/Buffer;)I\"/>\n\t\t<method name=\"isValid(Ljava/nio/Buffer;)Z\"/>\n\t\t<field name=\"DECODED_BLOCK_SIZE\"/>\n\t\t<field name=\"ENCODED_BLOCK_SIZE\"/>\n\t\t<field name=\"ETC1_RGB8_OES\"/>\n\t\t<field name=\"ETC_PKM_HEADER_SIZE\"/>\n\t</class>\n\t<class name=\"android/opengl/ETC1Util\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"compressTexture(Ljava/nio/Buffer;IIII)Landroid/opengl/ETC1Util$ETC1Texture;\"/>\n\t\t<method name=\"createTexture(Ljava/io/InputStream;)Landroid/opengl/ETC1Util$ETC1Texture;\"/>\n\t\t<method name=\"isETC1Supported()Z\"/>\n\t\t<method name=\"loadTexture(IIIIILandroid/opengl/ETC1Util$ETC1Texture;)V\"/>\n\t\t<method name=\"loadTexture(IIIIILjava/io/InputStream;)V\"/>\n\t\t<method name=\"writeTexture(Landroid/opengl/ETC1Util$ETC1Texture;Ljava/io/OutputStream;)V\"/>\n\t</class>\n\t<class name=\"android/opengl/ETC1Util$ETC1Texture\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(IILjava/nio/ByteBuffer;)V\"/>\n\t\t<method name=\"getData()Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t</class>\n\t<class name=\"android/opengl/GLDebugHelper\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"wrap(Ljavax/microedition/khronos/egl/EGL;ILjava/io/Writer;)Ljavax/microedition/khronos/egl/EGL;\"/>\n\t\t<method name=\"wrap(Ljavax/microedition/khronos/opengles/GL;ILjava/io/Writer;)Ljavax/microedition/khronos/opengles/GL;\"/>\n\t\t<field name=\"CONFIG_CHECK_GL_ERROR\"/>\n\t\t<field name=\"CONFIG_CHECK_THREAD\"/>\n\t\t<field name=\"CONFIG_LOG_ARGUMENT_NAMES\"/>\n\t\t<field name=\"ERROR_WRONG_THREAD\"/>\n\t</class>\n\t<class name=\"android/opengl/GLES10\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"glActiveTexture(I)V\"/>\n\t\t<method name=\"glAlphaFunc(IF)V\"/>\n\t\t<method name=\"glAlphaFuncx(II)V\"/>\n\t\t<method name=\"glBindTexture(II)V\"/>\n\t\t<method name=\"glBlendFunc(II)V\"/>\n\t\t<method name=\"glClear(I)V\"/>\n\t\t<method name=\"glClearColor(FFFF)V\"/>\n\t\t<method name=\"glClearColorx(IIII)V\"/>\n\t\t<method name=\"glClearDepthf(F)V\"/>\n\t\t<method name=\"glClearDepthx(I)V\"/>\n\t\t<method name=\"glClearStencil(I)V\"/>\n\t\t<method name=\"glClientActiveTexture(I)V\"/>\n\t\t<method name=\"glColor4f(FFFF)V\"/>\n\t\t<method name=\"glColor4x(IIII)V\"/>\n\t\t<method name=\"glColorMask(ZZZZ)V\"/>\n\t\t<method name=\"glColorPointer(IIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glCompressedTexImage2D(IIIIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glCompressedTexSubImage2D(IIIIIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glCopyTexImage2D(IIIIIIII)V\"/>\n\t\t<method name=\"glCopyTexSubImage2D(IIIIIIII)V\"/>\n\t\t<method name=\"glCullFace(I)V\"/>\n\t\t<method name=\"glDeleteTextures(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDeleteTextures(I[II)V\"/>\n\t\t<method name=\"glDepthFunc(I)V\"/>\n\t\t<method name=\"glDepthMask(Z)V\"/>\n\t\t<method name=\"glDepthRangef(FF)V\"/>\n\t\t<method name=\"glDepthRangex(II)V\"/>\n\t\t<method name=\"glDisable(I)V\"/>\n\t\t<method name=\"glDisableClientState(I)V\"/>\n\t\t<method name=\"glDrawArrays(III)V\"/>\n\t\t<method name=\"glDrawElements(IIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glEnable(I)V\"/>\n\t\t<method name=\"glEnableClientState(I)V\"/>\n\t\t<method name=\"glFinish()V\"/>\n\t\t<method name=\"glFlush()V\"/>\n\t\t<method name=\"glFogf(IF)V\"/>\n\t\t<method name=\"glFogfv(ILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glFogfv(I[FI)V\"/>\n\t\t<method name=\"glFogx(II)V\"/>\n\t\t<method name=\"glFogxv(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glFogxv(I[II)V\"/>\n\t\t<method name=\"glFrontFace(I)V\"/>\n\t\t<method name=\"glFrustumf(FFFFFF)V\"/>\n\t\t<method name=\"glFrustumx(IIIIII)V\"/>\n\t\t<method name=\"glGenTextures(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGenTextures(I[II)V\"/>\n\t\t<method name=\"glGetError()I\"/>\n\t\t<method name=\"glGetIntegerv(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetIntegerv(I[II)V\"/>\n\t\t<method name=\"glGetString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"glHint(II)V\"/>\n\t\t<method name=\"glLightModelf(IF)V\"/>\n\t\t<method name=\"glLightModelfv(ILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glLightModelfv(I[FI)V\"/>\n\t\t<method name=\"glLightModelx(II)V\"/>\n\t\t<method name=\"glLightModelxv(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glLightModelxv(I[II)V\"/>\n\t\t<method name=\"glLightf(IIF)V\"/>\n\t\t<method name=\"glLightfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glLightfv(II[FI)V\"/>\n\t\t<method name=\"glLightx(III)V\"/>\n\t\t<method name=\"glLightxv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glLightxv(II[II)V\"/>\n\t\t<method name=\"glLineWidth(F)V\"/>\n\t\t<method name=\"glLineWidthx(I)V\"/>\n\t\t<method name=\"glLoadIdentity()V\"/>\n\t\t<method name=\"glLoadMatrixf(Ljava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glLoadMatrixf([FI)V\"/>\n\t\t<method name=\"glLoadMatrixx(Ljava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glLoadMatrixx([II)V\"/>\n\t\t<method name=\"glLogicOp(I)V\"/>\n\t\t<method name=\"glMaterialf(IIF)V\"/>\n\t\t<method name=\"glMaterialfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glMaterialfv(II[FI)V\"/>\n\t\t<method name=\"glMaterialx(III)V\"/>\n\t\t<method name=\"glMaterialxv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glMaterialxv(II[II)V\"/>\n\t\t<method name=\"glMatrixMode(I)V\"/>\n\t\t<method name=\"glMultMatrixf(Ljava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glMultMatrixf([FI)V\"/>\n\t\t<method name=\"glMultMatrixx(Ljava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glMultMatrixx([II)V\"/>\n\t\t<method name=\"glMultiTexCoord4f(IFFFF)V\"/>\n\t\t<method name=\"glMultiTexCoord4x(IIIII)V\"/>\n\t\t<method name=\"glNormal3f(FFF)V\"/>\n\t\t<method name=\"glNormal3x(III)V\"/>\n\t\t<method name=\"glNormalPointer(IILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glOrthof(FFFFFF)V\"/>\n\t\t<method name=\"glOrthox(IIIIII)V\"/>\n\t\t<method name=\"glPixelStorei(II)V\"/>\n\t\t<method name=\"glPointSize(F)V\"/>\n\t\t<method name=\"glPointSizex(I)V\"/>\n\t\t<method name=\"glPolygonOffset(FF)V\"/>\n\t\t<method name=\"glPolygonOffsetx(II)V\"/>\n\t\t<method name=\"glPopMatrix()V\"/>\n\t\t<method name=\"glPushMatrix()V\"/>\n\t\t<method name=\"glReadPixels(IIIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glRotatef(FFFF)V\"/>\n\t\t<method name=\"glRotatex(IIII)V\"/>\n\t\t<method name=\"glSampleCoverage(FZ)V\"/>\n\t\t<method name=\"glSampleCoveragex(IZ)V\"/>\n\t\t<method name=\"glScalef(FFF)V\"/>\n\t\t<method name=\"glScalex(III)V\"/>\n\t\t<method name=\"glScissor(IIII)V\"/>\n\t\t<method name=\"glShadeModel(I)V\"/>\n\t\t<method name=\"glStencilFunc(III)V\"/>\n\t\t<method name=\"glStencilMask(I)V\"/>\n\t\t<method name=\"glStencilOp(III)V\"/>\n\t\t<method name=\"glTexCoordPointer(IIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glTexEnvf(IIF)V\"/>\n\t\t<method name=\"glTexEnvfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glTexEnvfv(II[FI)V\"/>\n\t\t<method name=\"glTexEnvx(III)V\"/>\n\t\t<method name=\"glTexEnvxv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glTexEnvxv(II[II)V\"/>\n\t\t<method name=\"glTexImage2D(IIIIIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glTexParameterf(IIF)V\"/>\n\t\t<method name=\"glTexParameterx(III)V\"/>\n\t\t<method name=\"glTexSubImage2D(IIIIIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glTranslatef(FFF)V\"/>\n\t\t<method name=\"glTranslatex(III)V\"/>\n\t\t<method name=\"glVertexPointer(IIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glViewport(IIII)V\"/>\n\t\t<field name=\"GL_ADD\"/>\n\t\t<field name=\"GL_ALIASED_LINE_WIDTH_RANGE\"/>\n\t\t<field name=\"GL_ALIASED_POINT_SIZE_RANGE\"/>\n\t\t<field name=\"GL_ALPHA\"/>\n\t\t<field name=\"GL_ALPHA_BITS\"/>\n\t\t<field name=\"GL_ALPHA_TEST\"/>\n\t\t<field name=\"GL_ALWAYS\"/>\n\t\t<field name=\"GL_AMBIENT\"/>\n\t\t<field name=\"GL_AMBIENT_AND_DIFFUSE\"/>\n\t\t<field name=\"GL_AND\"/>\n\t\t<field name=\"GL_AND_INVERTED\"/>\n\t\t<field name=\"GL_AND_REVERSE\"/>\n\t\t<field name=\"GL_BACK\"/>\n\t\t<field name=\"GL_BLEND\"/>\n\t\t<field name=\"GL_BLUE_BITS\"/>\n\t\t<field name=\"GL_BYTE\"/>\n\t\t<field name=\"GL_CCW\"/>\n\t\t<field name=\"GL_CLAMP_TO_EDGE\"/>\n\t\t<field name=\"GL_CLEAR\"/>\n\t\t<field name=\"GL_COLOR_ARRAY\"/>\n\t\t<field name=\"GL_COLOR_BUFFER_BIT\"/>\n\t\t<field name=\"GL_COLOR_LOGIC_OP\"/>\n\t\t<field name=\"GL_COLOR_MATERIAL\"/>\n\t\t<field name=\"GL_COMPRESSED_TEXTURE_FORMATS\"/>\n\t\t<field name=\"GL_CONSTANT_ATTENUATION\"/>\n\t\t<field name=\"GL_COPY\"/>\n\t\t<field name=\"GL_COPY_INVERTED\"/>\n\t\t<field name=\"GL_CULL_FACE\"/>\n\t\t<field name=\"GL_CW\"/>\n\t\t<field name=\"GL_DECAL\"/>\n\t\t<field name=\"GL_DECR\"/>\n\t\t<field name=\"GL_DEPTH_BITS\"/>\n\t\t<field name=\"GL_DEPTH_BUFFER_BIT\"/>\n\t\t<field name=\"GL_DEPTH_TEST\"/>\n\t\t<field name=\"GL_DIFFUSE\"/>\n\t\t<field name=\"GL_DITHER\"/>\n\t\t<field name=\"GL_DONT_CARE\"/>\n\t\t<field name=\"GL_DST_ALPHA\"/>\n\t\t<field name=\"GL_DST_COLOR\"/>\n\t\t<field name=\"GL_EMISSION\"/>\n\t\t<field name=\"GL_EQUAL\"/>\n\t\t<field name=\"GL_EQUIV\"/>\n\t\t<field name=\"GL_EXP\"/>\n\t\t<field name=\"GL_EXP2\"/>\n\t\t<field name=\"GL_EXTENSIONS\"/>\n\t\t<field name=\"GL_FALSE\"/>\n\t\t<field name=\"GL_FASTEST\"/>\n\t\t<field name=\"GL_FIXED\"/>\n\t\t<field name=\"GL_FLAT\"/>\n\t\t<field name=\"GL_FLOAT\"/>\n\t\t<field name=\"GL_FOG\"/>\n\t\t<field name=\"GL_FOG_COLOR\"/>\n\t\t<field name=\"GL_FOG_DENSITY\"/>\n\t\t<field name=\"GL_FOG_END\"/>\n\t\t<field name=\"GL_FOG_HINT\"/>\n\t\t<field name=\"GL_FOG_MODE\"/>\n\t\t<field name=\"GL_FOG_START\"/>\n\t\t<field name=\"GL_FRONT\"/>\n\t\t<field name=\"GL_FRONT_AND_BACK\"/>\n\t\t<field name=\"GL_GEQUAL\"/>\n\t\t<field name=\"GL_GREATER\"/>\n\t\t<field name=\"GL_GREEN_BITS\"/>\n\t\t<field name=\"GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES\"/>\n\t\t<field name=\"GL_IMPLEMENTATION_COLOR_READ_TYPE_OES\"/>\n\t\t<field name=\"GL_INCR\"/>\n\t\t<field name=\"GL_INVALID_ENUM\"/>\n\t\t<field name=\"GL_INVALID_OPERATION\"/>\n\t\t<field name=\"GL_INVALID_VALUE\"/>\n\t\t<field name=\"GL_INVERT\"/>\n\t\t<field name=\"GL_KEEP\"/>\n\t\t<field name=\"GL_LEQUAL\"/>\n\t\t<field name=\"GL_LESS\"/>\n\t\t<field name=\"GL_LIGHT0\"/>\n\t\t<field name=\"GL_LIGHT1\"/>\n\t\t<field name=\"GL_LIGHT2\"/>\n\t\t<field name=\"GL_LIGHT3\"/>\n\t\t<field name=\"GL_LIGHT4\"/>\n\t\t<field name=\"GL_LIGHT5\"/>\n\t\t<field name=\"GL_LIGHT6\"/>\n\t\t<field name=\"GL_LIGHT7\"/>\n\t\t<field name=\"GL_LIGHTING\"/>\n\t\t<field name=\"GL_LIGHT_MODEL_AMBIENT\"/>\n\t\t<field name=\"GL_LIGHT_MODEL_TWO_SIDE\"/>\n\t\t<field name=\"GL_LINEAR\"/>\n\t\t<field name=\"GL_LINEAR_ATTENUATION\"/>\n\t\t<field name=\"GL_LINEAR_MIPMAP_LINEAR\"/>\n\t\t<field name=\"GL_LINEAR_MIPMAP_NEAREST\"/>\n\t\t<field name=\"GL_LINES\"/>\n\t\t<field name=\"GL_LINE_LOOP\"/>\n\t\t<field name=\"GL_LINE_SMOOTH\"/>\n\t\t<field name=\"GL_LINE_SMOOTH_HINT\"/>\n\t\t<field name=\"GL_LINE_STRIP\"/>\n\t\t<field name=\"GL_LUMINANCE\"/>\n\t\t<field name=\"GL_LUMINANCE_ALPHA\"/>\n\t\t<field name=\"GL_MAX_ELEMENTS_INDICES\"/>\n\t\t<field name=\"GL_MAX_ELEMENTS_VERTICES\"/>\n\t\t<field name=\"GL_MAX_LIGHTS\"/>\n\t\t<field name=\"GL_MAX_MODELVIEW_STACK_DEPTH\"/>\n\t\t<field name=\"GL_MAX_PROJECTION_STACK_DEPTH\"/>\n\t\t<field name=\"GL_MAX_TEXTURE_SIZE\"/>\n\t\t<field name=\"GL_MAX_TEXTURE_STACK_DEPTH\"/>\n\t\t<field name=\"GL_MAX_TEXTURE_UNITS\"/>\n\t\t<field name=\"GL_MAX_VIEWPORT_DIMS\"/>\n\t\t<field name=\"GL_MODELVIEW\"/>\n\t\t<field name=\"GL_MODULATE\"/>\n\t\t<field name=\"GL_MULTISAMPLE\"/>\n\t\t<field name=\"GL_NAND\"/>\n\t\t<field name=\"GL_NEAREST\"/>\n\t\t<field name=\"GL_NEAREST_MIPMAP_LINEAR\"/>\n\t\t<field name=\"GL_NEAREST_MIPMAP_NEAREST\"/>\n\t\t<field name=\"GL_NEVER\"/>\n\t\t<field name=\"GL_NICEST\"/>\n\t\t<field name=\"GL_NOOP\"/>\n\t\t<field name=\"GL_NOR\"/>\n\t\t<field name=\"GL_NORMALIZE\"/>\n\t\t<field name=\"GL_NORMAL_ARRAY\"/>\n\t\t<field name=\"GL_NOTEQUAL\"/>\n\t\t<field name=\"GL_NO_ERROR\"/>\n\t\t<field name=\"GL_NUM_COMPRESSED_TEXTURE_FORMATS\"/>\n\t\t<field name=\"GL_ONE\"/>\n\t\t<field name=\"GL_ONE_MINUS_DST_ALPHA\"/>\n\t\t<field name=\"GL_ONE_MINUS_DST_COLOR\"/>\n\t\t<field name=\"GL_ONE_MINUS_SRC_ALPHA\"/>\n\t\t<field name=\"GL_ONE_MINUS_SRC_COLOR\"/>\n\t\t<field name=\"GL_OR\"/>\n\t\t<field name=\"GL_OR_INVERTED\"/>\n\t\t<field name=\"GL_OR_REVERSE\"/>\n\t\t<field name=\"GL_OUT_OF_MEMORY\"/>\n\t\t<field name=\"GL_PACK_ALIGNMENT\"/>\n\t\t<field name=\"GL_PALETTE4_R5_G6_B5_OES\"/>\n\t\t<field name=\"GL_PALETTE4_RGB5_A1_OES\"/>\n\t\t<field name=\"GL_PALETTE4_RGB8_OES\"/>\n\t\t<field name=\"GL_PALETTE4_RGBA4_OES\"/>\n\t\t<field name=\"GL_PALETTE4_RGBA8_OES\"/>\n\t\t<field name=\"GL_PALETTE8_R5_G6_B5_OES\"/>\n\t\t<field name=\"GL_PALETTE8_RGB5_A1_OES\"/>\n\t\t<field name=\"GL_PALETTE8_RGB8_OES\"/>\n\t\t<field name=\"GL_PALETTE8_RGBA4_OES\"/>\n\t\t<field name=\"GL_PALETTE8_RGBA8_OES\"/>\n\t\t<field name=\"GL_PERSPECTIVE_CORRECTION_HINT\"/>\n\t\t<field name=\"GL_POINTS\"/>\n\t\t<field name=\"GL_POINT_FADE_THRESHOLD_SIZE\"/>\n\t\t<field name=\"GL_POINT_SIZE\"/>\n\t\t<field name=\"GL_POINT_SMOOTH\"/>\n\t\t<field name=\"GL_POINT_SMOOTH_HINT\"/>\n\t\t<field name=\"GL_POLYGON_OFFSET_FILL\"/>\n\t\t<field name=\"GL_POLYGON_SMOOTH_HINT\"/>\n\t\t<field name=\"GL_POSITION\"/>\n\t\t<field name=\"GL_PROJECTION\"/>\n\t\t<field name=\"GL_QUADRATIC_ATTENUATION\"/>\n\t\t<field name=\"GL_RED_BITS\"/>\n\t\t<field name=\"GL_RENDERER\"/>\n\t\t<field name=\"GL_REPEAT\"/>\n\t\t<field name=\"GL_REPLACE\"/>\n\t\t<field name=\"GL_RESCALE_NORMAL\"/>\n\t\t<field name=\"GL_RGB\"/>\n\t\t<field name=\"GL_RGBA\"/>\n\t\t<field name=\"GL_SAMPLE_ALPHA_TO_COVERAGE\"/>\n\t\t<field name=\"GL_SAMPLE_ALPHA_TO_ONE\"/>\n\t\t<field name=\"GL_SAMPLE_COVERAGE\"/>\n\t\t<field name=\"GL_SCISSOR_TEST\"/>\n\t\t<field name=\"GL_SET\"/>\n\t\t<field name=\"GL_SHININESS\"/>\n\t\t<field name=\"GL_SHORT\"/>\n\t\t<field name=\"GL_SMOOTH\"/>\n\t\t<field name=\"GL_SMOOTH_LINE_WIDTH_RANGE\"/>\n\t\t<field name=\"GL_SMOOTH_POINT_SIZE_RANGE\"/>\n\t\t<field name=\"GL_SPECULAR\"/>\n\t\t<field name=\"GL_SPOT_CUTOFF\"/>\n\t\t<field name=\"GL_SPOT_DIRECTION\"/>\n\t\t<field name=\"GL_SPOT_EXPONENT\"/>\n\t\t<field name=\"GL_SRC_ALPHA\"/>\n\t\t<field name=\"GL_SRC_ALPHA_SATURATE\"/>\n\t\t<field name=\"GL_SRC_COLOR\"/>\n\t\t<field name=\"GL_STACK_OVERFLOW\"/>\n\t\t<field name=\"GL_STACK_UNDERFLOW\"/>\n\t\t<field name=\"GL_STENCIL_BITS\"/>\n\t\t<field name=\"GL_STENCIL_BUFFER_BIT\"/>\n\t\t<field name=\"GL_STENCIL_TEST\"/>\n\t\t<field name=\"GL_SUBPIXEL_BITS\"/>\n\t\t<field name=\"GL_TEXTURE\"/>\n\t\t<field name=\"GL_TEXTURE0\"/>\n\t\t<field name=\"GL_TEXTURE1\"/>\n\t\t<field name=\"GL_TEXTURE10\"/>\n\t\t<field name=\"GL_TEXTURE11\"/>\n\t\t<field name=\"GL_TEXTURE12\"/>\n\t\t<field name=\"GL_TEXTURE13\"/>\n\t\t<field name=\"GL_TEXTURE14\"/>\n\t\t<field name=\"GL_TEXTURE15\"/>\n\t\t<field name=\"GL_TEXTURE16\"/>\n\t\t<field name=\"GL_TEXTURE17\"/>\n\t\t<field name=\"GL_TEXTURE18\"/>\n\t\t<field name=\"GL_TEXTURE19\"/>\n\t\t<field name=\"GL_TEXTURE2\"/>\n\t\t<field name=\"GL_TEXTURE20\"/>\n\t\t<field name=\"GL_TEXTURE21\"/>\n\t\t<field name=\"GL_TEXTURE22\"/>\n\t\t<field name=\"GL_TEXTURE23\"/>\n\t\t<field name=\"GL_TEXTURE24\"/>\n\t\t<field name=\"GL_TEXTURE25\"/>\n\t\t<field name=\"GL_TEXTURE26\"/>\n\t\t<field name=\"GL_TEXTURE27\"/>\n\t\t<field name=\"GL_TEXTURE28\"/>\n\t\t<field name=\"GL_TEXTURE29\"/>\n\t\t<field name=\"GL_TEXTURE3\"/>\n\t\t<field name=\"GL_TEXTURE30\"/>\n\t\t<field name=\"GL_TEXTURE31\"/>\n\t\t<field name=\"GL_TEXTURE4\"/>\n\t\t<field name=\"GL_TEXTURE5\"/>\n\t\t<field name=\"GL_TEXTURE6\"/>\n\t\t<field name=\"GL_TEXTURE7\"/>\n\t\t<field name=\"GL_TEXTURE8\"/>\n\t\t<field name=\"GL_TEXTURE9\"/>\n\t\t<field name=\"GL_TEXTURE_2D\"/>\n\t\t<field name=\"GL_TEXTURE_COORD_ARRAY\"/>\n\t\t<field name=\"GL_TEXTURE_ENV\"/>\n\t\t<field name=\"GL_TEXTURE_ENV_COLOR\"/>\n\t\t<field name=\"GL_TEXTURE_ENV_MODE\"/>\n\t\t<field name=\"GL_TEXTURE_MAG_FILTER\"/>\n\t\t<field name=\"GL_TEXTURE_MIN_FILTER\"/>\n\t\t<field name=\"GL_TEXTURE_WRAP_S\"/>\n\t\t<field name=\"GL_TEXTURE_WRAP_T\"/>\n\t\t<field name=\"GL_TRIANGLES\"/>\n\t\t<field name=\"GL_TRIANGLE_FAN\"/>\n\t\t<field name=\"GL_TRIANGLE_STRIP\"/>\n\t\t<field name=\"GL_TRUE\"/>\n\t\t<field name=\"GL_UNPACK_ALIGNMENT\"/>\n\t\t<field name=\"GL_UNSIGNED_BYTE\"/>\n\t\t<field name=\"GL_UNSIGNED_SHORT\"/>\n\t\t<field name=\"GL_UNSIGNED_SHORT_4_4_4_4\"/>\n\t\t<field name=\"GL_UNSIGNED_SHORT_5_5_5_1\"/>\n\t\t<field name=\"GL_UNSIGNED_SHORT_5_6_5\"/>\n\t\t<field name=\"GL_VENDOR\"/>\n\t\t<field name=\"GL_VERSION\"/>\n\t\t<field name=\"GL_VERTEX_ARRAY\"/>\n\t\t<field name=\"GL_XOR\"/>\n\t\t<field name=\"GL_ZERO\"/>\n\t</class>\n\t<class name=\"android/opengl/GLES10Ext\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"glQueryMatrixxOES(Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;)I\"/>\n\t\t<method name=\"glQueryMatrixxOES([II[II)I\"/>\n\t</class>\n\t<class name=\"android/opengl/GLES11\" since=\"4\">\n\t\t<extends name=\"android/opengl/GLES10\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"glBindBuffer(II)V\"/>\n\t\t<method name=\"glBufferData(IILjava/nio/Buffer;I)V\"/>\n\t\t<method name=\"glBufferSubData(IIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glClipPlanef(ILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glClipPlanef(I[FI)V\"/>\n\t\t<method name=\"glClipPlanex(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glClipPlanex(I[II)V\"/>\n\t\t<method name=\"glColor4ub(BBBB)V\"/>\n\t\t<method name=\"glColorPointer(IIII)V\"/>\n\t\t<method name=\"glDeleteBuffers(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDeleteBuffers(I[II)V\"/>\n\t\t<method name=\"glDrawElements(IIII)V\"/>\n\t\t<method name=\"glGenBuffers(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGenBuffers(I[II)V\"/>\n\t\t<method name=\"glGetBooleanv(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetBooleanv(I[ZI)V\"/>\n\t\t<method name=\"glGetBufferParameteriv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetBufferParameteriv(II[II)V\"/>\n\t\t<method name=\"glGetClipPlanef(ILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetClipPlanef(I[FI)V\"/>\n\t\t<method name=\"glGetClipPlanex(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetClipPlanex(I[II)V\"/>\n\t\t<method name=\"glGetFixedv(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetFixedv(I[II)V\"/>\n\t\t<method name=\"glGetFloatv(ILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetFloatv(I[FI)V\"/>\n\t\t<method name=\"glGetLightfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetLightfv(II[FI)V\"/>\n\t\t<method name=\"glGetLightxv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetLightxv(II[II)V\"/>\n\t\t<method name=\"glGetMaterialfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetMaterialfv(II[FI)V\"/>\n\t\t<method name=\"glGetMaterialxv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetMaterialxv(II[II)V\"/>\n\t\t<method name=\"glGetTexEnvfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetTexEnvfv(II[FI)V\"/>\n\t\t<method name=\"glGetTexEnviv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetTexEnviv(II[II)V\"/>\n\t\t<method name=\"glGetTexEnvxv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetTexEnvxv(II[II)V\"/>\n\t\t<method name=\"glGetTexParameterfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetTexParameterfv(II[FI)V\"/>\n\t\t<method name=\"glGetTexParameteriv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetTexParameteriv(II[II)V\"/>\n\t\t<method name=\"glGetTexParameterxv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetTexParameterxv(II[II)V\"/>\n\t\t<method name=\"glIsBuffer(I)Z\"/>\n\t\t<method name=\"glIsEnabled(I)Z\"/>\n\t\t<method name=\"glIsTexture(I)Z\"/>\n\t\t<method name=\"glNormalPointer(III)V\"/>\n\t\t<method name=\"glPointParameterf(IF)V\"/>\n\t\t<method name=\"glPointParameterfv(ILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glPointParameterfv(I[FI)V\"/>\n\t\t<method name=\"glPointParameterx(II)V\"/>\n\t\t<method name=\"glPointParameterxv(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glPointParameterxv(I[II)V\"/>\n\t\t<method name=\"glPointSizePointerOES(IILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glTexCoordPointer(IIII)V\"/>\n\t\t<method name=\"glTexEnvi(III)V\"/>\n\t\t<method name=\"glTexEnviv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glTexEnviv(II[II)V\"/>\n\t\t<method name=\"glTexParameterfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glTexParameterfv(II[FI)V\"/>\n\t\t<method name=\"glTexParameteri(III)V\"/>\n\t\t<method name=\"glTexParameteriv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glTexParameteriv(II[II)V\"/>\n\t\t<method name=\"glTexParameterxv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glTexParameterxv(II[II)V\"/>\n\t\t<method name=\"glVertexPointer(IIII)V\"/>\n\t\t<field name=\"GL_ACTIVE_TEXTURE\"/>\n\t\t<field name=\"GL_ADD_SIGNED\"/>\n\t\t<field name=\"GL_ALPHA_SCALE\"/>\n\t\t<field name=\"GL_ALPHA_TEST_FUNC\"/>\n\t\t<field name=\"GL_ALPHA_TEST_REF\"/>\n\t\t<field name=\"GL_ARRAY_BUFFER\"/>\n\t\t<field name=\"GL_ARRAY_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_BLEND_DST\"/>\n\t\t<field name=\"GL_BLEND_SRC\"/>\n\t\t<field name=\"GL_BUFFER_ACCESS\"/>\n\t\t<field name=\"GL_BUFFER_SIZE\"/>\n\t\t<field name=\"GL_BUFFER_USAGE\"/>\n\t\t<field name=\"GL_CLIENT_ACTIVE_TEXTURE\"/>\n\t\t<field name=\"GL_CLIP_PLANE0\"/>\n\t\t<field name=\"GL_CLIP_PLANE1\"/>\n\t\t<field name=\"GL_CLIP_PLANE2\"/>\n\t\t<field name=\"GL_CLIP_PLANE3\"/>\n\t\t<field name=\"GL_CLIP_PLANE4\"/>\n\t\t<field name=\"GL_CLIP_PLANE5\"/>\n\t\t<field name=\"GL_COLOR_ARRAY_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_COLOR_ARRAY_POINTER\"/>\n\t\t<field name=\"GL_COLOR_ARRAY_SIZE\"/>\n\t\t<field name=\"GL_COLOR_ARRAY_STRIDE\"/>\n\t\t<field name=\"GL_COLOR_ARRAY_TYPE\"/>\n\t\t<field name=\"GL_COLOR_CLEAR_VALUE\"/>\n\t\t<field name=\"GL_COLOR_WRITEMASK\"/>\n\t\t<field name=\"GL_COMBINE\"/>\n\t\t<field name=\"GL_COMBINE_ALPHA\"/>\n\t\t<field name=\"GL_COMBINE_RGB\"/>\n\t\t<field name=\"GL_CONSTANT\"/>\n\t\t<field name=\"GL_COORD_REPLACE_OES\"/>\n\t\t<field name=\"GL_CULL_FACE_MODE\"/>\n\t\t<field name=\"GL_CURRENT_COLOR\"/>\n\t\t<field name=\"GL_CURRENT_NORMAL\"/>\n\t\t<field name=\"GL_CURRENT_TEXTURE_COORDS\"/>\n\t\t<field name=\"GL_DEPTH_CLEAR_VALUE\"/>\n\t\t<field name=\"GL_DEPTH_FUNC\"/>\n\t\t<field name=\"GL_DEPTH_RANGE\"/>\n\t\t<field name=\"GL_DEPTH_WRITEMASK\"/>\n\t\t<field name=\"GL_DOT3_RGB\"/>\n\t\t<field name=\"GL_DOT3_RGBA\"/>\n\t\t<field name=\"GL_DYNAMIC_DRAW\"/>\n\t\t<field name=\"GL_ELEMENT_ARRAY_BUFFER\"/>\n\t\t<field name=\"GL_ELEMENT_ARRAY_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_FRONT_FACE\"/>\n\t\t<field name=\"GL_GENERATE_MIPMAP\"/>\n\t\t<field name=\"GL_GENERATE_MIPMAP_HINT\"/>\n\t\t<field name=\"GL_INTERPOLATE\"/>\n\t\t<field name=\"GL_LINE_WIDTH\"/>\n\t\t<field name=\"GL_LOGIC_OP_MODE\"/>\n\t\t<field name=\"GL_MATRIX_MODE\"/>\n\t\t<field name=\"GL_MAX_CLIP_PLANES\"/>\n\t\t<field name=\"GL_MODELVIEW_MATRIX\"/>\n\t\t<field name=\"GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES\"/>\n\t\t<field name=\"GL_MODELVIEW_STACK_DEPTH\"/>\n\t\t<field name=\"GL_NORMAL_ARRAY_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_NORMAL_ARRAY_POINTER\"/>\n\t\t<field name=\"GL_NORMAL_ARRAY_STRIDE\"/>\n\t\t<field name=\"GL_NORMAL_ARRAY_TYPE\"/>\n\t\t<field name=\"GL_OPERAND0_ALPHA\"/>\n\t\t<field name=\"GL_OPERAND0_RGB\"/>\n\t\t<field name=\"GL_OPERAND1_ALPHA\"/>\n\t\t<field name=\"GL_OPERAND1_RGB\"/>\n\t\t<field name=\"GL_OPERAND2_ALPHA\"/>\n\t\t<field name=\"GL_OPERAND2_RGB\"/>\n\t\t<field name=\"GL_POINT_DISTANCE_ATTENUATION\"/>\n\t\t<field name=\"GL_POINT_FADE_THRESHOLD_SIZE\"/>\n\t\t<field name=\"GL_POINT_SIZE\"/>\n\t\t<field name=\"GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES\"/>\n\t\t<field name=\"GL_POINT_SIZE_ARRAY_OES\"/>\n\t\t<field name=\"GL_POINT_SIZE_ARRAY_POINTER_OES\"/>\n\t\t<field name=\"GL_POINT_SIZE_ARRAY_STRIDE_OES\"/>\n\t\t<field name=\"GL_POINT_SIZE_ARRAY_TYPE_OES\"/>\n\t\t<field name=\"GL_POINT_SIZE_MAX\"/>\n\t\t<field name=\"GL_POINT_SIZE_MIN\"/>\n\t\t<field name=\"GL_POINT_SPRITE_OES\"/>\n\t\t<field name=\"GL_POLYGON_OFFSET_FACTOR\"/>\n\t\t<field name=\"GL_POLYGON_OFFSET_UNITS\"/>\n\t\t<field name=\"GL_PREVIOUS\"/>\n\t\t<field name=\"GL_PRIMARY_COLOR\"/>\n\t\t<field name=\"GL_PROJECTION_MATRIX\"/>\n\t\t<field name=\"GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES\"/>\n\t\t<field name=\"GL_PROJECTION_STACK_DEPTH\"/>\n\t\t<field name=\"GL_RGB_SCALE\"/>\n\t\t<field name=\"GL_SAMPLES\"/>\n\t\t<field name=\"GL_SAMPLE_BUFFERS\"/>\n\t\t<field name=\"GL_SAMPLE_COVERAGE_INVERT\"/>\n\t\t<field name=\"GL_SAMPLE_COVERAGE_VALUE\"/>\n\t\t<field name=\"GL_SCISSOR_BOX\"/>\n\t\t<field name=\"GL_SHADE_MODEL\"/>\n\t\t<field name=\"GL_SRC0_ALPHA\"/>\n\t\t<field name=\"GL_SRC0_RGB\"/>\n\t\t<field name=\"GL_SRC1_ALPHA\"/>\n\t\t<field name=\"GL_SRC1_RGB\"/>\n\t\t<field name=\"GL_SRC2_ALPHA\"/>\n\t\t<field name=\"GL_SRC2_RGB\"/>\n\t\t<field name=\"GL_STATIC_DRAW\"/>\n\t\t<field name=\"GL_STENCIL_CLEAR_VALUE\"/>\n\t\t<field name=\"GL_STENCIL_FAIL\"/>\n\t\t<field name=\"GL_STENCIL_FUNC\"/>\n\t\t<field name=\"GL_STENCIL_PASS_DEPTH_FAIL\"/>\n\t\t<field name=\"GL_STENCIL_PASS_DEPTH_PASS\"/>\n\t\t<field name=\"GL_STENCIL_REF\"/>\n\t\t<field name=\"GL_STENCIL_VALUE_MASK\"/>\n\t\t<field name=\"GL_STENCIL_WRITEMASK\"/>\n\t\t<field name=\"GL_SUBTRACT\"/>\n\t\t<field name=\"GL_TEXTURE_BINDING_2D\"/>\n\t\t<field name=\"GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_TEXTURE_COORD_ARRAY_POINTER\"/>\n\t\t<field name=\"GL_TEXTURE_COORD_ARRAY_SIZE\"/>\n\t\t<field name=\"GL_TEXTURE_COORD_ARRAY_STRIDE\"/>\n\t\t<field name=\"GL_TEXTURE_COORD_ARRAY_TYPE\"/>\n\t\t<field name=\"GL_TEXTURE_MATRIX\"/>\n\t\t<field name=\"GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES\"/>\n\t\t<field name=\"GL_TEXTURE_STACK_DEPTH\"/>\n\t\t<field name=\"GL_VERTEX_ARRAY_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_VERTEX_ARRAY_POINTER\"/>\n\t\t<field name=\"GL_VERTEX_ARRAY_SIZE\"/>\n\t\t<field name=\"GL_VERTEX_ARRAY_STRIDE\"/>\n\t\t<field name=\"GL_VERTEX_ARRAY_TYPE\"/>\n\t\t<field name=\"GL_VIEWPORT\"/>\n\t\t<field name=\"GL_WRITE_ONLY\"/>\n\t</class>\n\t<class name=\"android/opengl/GLES11Ext\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"glAlphaFuncxOES(II)V\"/>\n\t\t<method name=\"glBindFramebufferOES(II)V\"/>\n\t\t<method name=\"glBindRenderbufferOES(II)V\"/>\n\t\t<method name=\"glBlendEquationOES(I)V\"/>\n\t\t<method name=\"glBlendEquationSeparateOES(II)V\"/>\n\t\t<method name=\"glBlendFuncSeparateOES(IIII)V\"/>\n\t\t<method name=\"glCheckFramebufferStatusOES(I)I\"/>\n\t\t<method name=\"glClearColorxOES(IIII)V\"/>\n\t\t<method name=\"glClearDepthfOES(F)V\"/>\n\t\t<method name=\"glClearDepthxOES(I)V\"/>\n\t\t<method name=\"glClipPlanefOES(ILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glClipPlanefOES(I[FI)V\"/>\n\t\t<method name=\"glClipPlanexOES(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glClipPlanexOES(I[II)V\"/>\n\t\t<method name=\"glColor4xOES(IIII)V\"/>\n\t\t<method name=\"glCurrentPaletteMatrixOES(I)V\"/>\n\t\t<method name=\"glDeleteFramebuffersOES(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDeleteFramebuffersOES(I[II)V\"/>\n\t\t<method name=\"glDeleteRenderbuffersOES(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDeleteRenderbuffersOES(I[II)V\"/>\n\t\t<method name=\"glDepthRangefOES(FF)V\"/>\n\t\t<method name=\"glDepthRangexOES(II)V\"/>\n\t\t<method name=\"glDrawTexfOES(FFFFF)V\"/>\n\t\t<method name=\"glDrawTexfvOES(Ljava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glDrawTexfvOES([FI)V\"/>\n\t\t<method name=\"glDrawTexiOES(IIIII)V\"/>\n\t\t<method name=\"glDrawTexivOES(Ljava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDrawTexivOES([II)V\"/>\n\t\t<method name=\"glDrawTexsOES(SSSSS)V\"/>\n\t\t<method name=\"glDrawTexsvOES(Ljava/nio/ShortBuffer;)V\"/>\n\t\t<method name=\"glDrawTexsvOES([SI)V\"/>\n\t\t<method name=\"glDrawTexxOES(IIIII)V\"/>\n\t\t<method name=\"glDrawTexxvOES(Ljava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDrawTexxvOES([II)V\"/>\n\t\t<method name=\"glEGLImageTargetRenderbufferStorageOES(ILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glEGLImageTargetTexture2DOES(ILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glFogxOES(II)V\"/>\n\t\t<method name=\"glFogxvOES(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glFogxvOES(I[II)V\"/>\n\t\t<method name=\"glFramebufferRenderbufferOES(IIII)V\"/>\n\t\t<method name=\"glFramebufferTexture2DOES(IIIII)V\"/>\n\t\t<method name=\"glFrustumfOES(FFFFFF)V\"/>\n\t\t<method name=\"glFrustumxOES(IIIIII)V\"/>\n\t\t<method name=\"glGenFramebuffersOES(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGenFramebuffersOES(I[II)V\"/>\n\t\t<method name=\"glGenRenderbuffersOES(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGenRenderbuffersOES(I[II)V\"/>\n\t\t<method name=\"glGenerateMipmapOES(I)V\"/>\n\t\t<method name=\"glGetClipPlanefOES(ILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetClipPlanefOES(I[FI)V\"/>\n\t\t<method name=\"glGetClipPlanexOES(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetClipPlanexOES(I[II)V\"/>\n\t\t<method name=\"glGetFixedvOES(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetFixedvOES(I[II)V\"/>\n\t\t<method name=\"glGetFramebufferAttachmentParameterivOES(IIILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetFramebufferAttachmentParameterivOES(III[II)V\"/>\n\t\t<method name=\"glGetLightxvOES(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetLightxvOES(II[II)V\"/>\n\t\t<method name=\"glGetMaterialxvOES(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetMaterialxvOES(II[II)V\"/>\n\t\t<method name=\"glGetRenderbufferParameterivOES(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetRenderbufferParameterivOES(II[II)V\"/>\n\t\t<method name=\"glGetTexEnvxvOES(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetTexEnvxvOES(II[II)V\"/>\n\t\t<method name=\"glGetTexGenfvOES(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetTexGenfvOES(II[FI)V\"/>\n\t\t<method name=\"glGetTexGenivOES(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetTexGenivOES(II[II)V\"/>\n\t\t<method name=\"glGetTexGenxvOES(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetTexGenxvOES(II[II)V\"/>\n\t\t<method name=\"glGetTexParameterxvOES(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetTexParameterxvOES(II[II)V\"/>\n\t\t<method name=\"glIsFramebufferOES(I)Z\"/>\n\t\t<method name=\"glIsRenderbufferOES(I)Z\"/>\n\t\t<method name=\"glLightModelxOES(II)V\"/>\n\t\t<method name=\"glLightModelxvOES(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glLightModelxvOES(I[II)V\"/>\n\t\t<method name=\"glLightxOES(III)V\"/>\n\t\t<method name=\"glLightxvOES(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glLightxvOES(II[II)V\"/>\n\t\t<method name=\"glLineWidthxOES(I)V\"/>\n\t\t<method name=\"glLoadMatrixxOES(Ljava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glLoadMatrixxOES([II)V\"/>\n\t\t<method name=\"glLoadPaletteFromModelViewMatrixOES()V\"/>\n\t\t<method name=\"glMaterialxOES(III)V\"/>\n\t\t<method name=\"glMaterialxvOES(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glMaterialxvOES(II[II)V\"/>\n\t\t<method name=\"glMatrixIndexPointerOES(IIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glMultMatrixxOES(Ljava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glMultMatrixxOES([II)V\"/>\n\t\t<method name=\"glMultiTexCoord4xOES(IIIII)V\"/>\n\t\t<method name=\"glNormal3xOES(III)V\"/>\n\t\t<method name=\"glOrthofOES(FFFFFF)V\"/>\n\t\t<method name=\"glOrthoxOES(IIIIII)V\"/>\n\t\t<method name=\"glPointParameterxOES(II)V\"/>\n\t\t<method name=\"glPointParameterxvOES(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glPointParameterxvOES(I[II)V\"/>\n\t\t<method name=\"glPointSizexOES(I)V\"/>\n\t\t<method name=\"glPolygonOffsetxOES(II)V\"/>\n\t\t<method name=\"glRenderbufferStorageOES(IIII)V\"/>\n\t\t<method name=\"glRotatexOES(IIII)V\"/>\n\t\t<method name=\"glSampleCoveragexOES(IZ)V\"/>\n\t\t<method name=\"glScalexOES(III)V\"/>\n\t\t<method name=\"glTexEnvxOES(III)V\"/>\n\t\t<method name=\"glTexEnvxvOES(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glTexEnvxvOES(II[II)V\"/>\n\t\t<method name=\"glTexGenfOES(IIF)V\"/>\n\t\t<method name=\"glTexGenfvOES(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glTexGenfvOES(II[FI)V\"/>\n\t\t<method name=\"glTexGeniOES(III)V\"/>\n\t\t<method name=\"glTexGenivOES(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glTexGenivOES(II[II)V\"/>\n\t\t<method name=\"glTexGenxOES(III)V\"/>\n\t\t<method name=\"glTexGenxvOES(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glTexGenxvOES(II[II)V\"/>\n\t\t<method name=\"glTexParameterxOES(III)V\"/>\n\t\t<method name=\"glTexParameterxvOES(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glTexParameterxvOES(II[II)V\"/>\n\t\t<method name=\"glTranslatexOES(III)V\"/>\n\t\t<method name=\"glWeightPointerOES(IIILjava/nio/Buffer;)V\"/>\n\t\t<field name=\"GL_3DC_XY_AMD\"/>\n\t\t<field name=\"GL_3DC_X_AMD\"/>\n\t\t<field name=\"GL_ATC_RGBA_EXPLICIT_ALPHA_AMD\"/>\n\t\t<field name=\"GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD\"/>\n\t\t<field name=\"GL_ATC_RGB_AMD\"/>\n\t\t<field name=\"GL_BGRA\"/>\n\t\t<field name=\"GL_BLEND_DST_ALPHA_OES\"/>\n\t\t<field name=\"GL_BLEND_DST_RGB_OES\"/>\n\t\t<field name=\"GL_BLEND_EQUATION_ALPHA_OES\"/>\n\t\t<field name=\"GL_BLEND_EQUATION_OES\"/>\n\t\t<field name=\"GL_BLEND_EQUATION_RGB_OES\"/>\n\t\t<field name=\"GL_BLEND_SRC_ALPHA_OES\"/>\n\t\t<field name=\"GL_BLEND_SRC_RGB_OES\"/>\n\t\t<field name=\"GL_BUFFER_ACCESS_OES\"/>\n\t\t<field name=\"GL_BUFFER_MAPPED_OES\"/>\n\t\t<field name=\"GL_BUFFER_MAP_POINTER_OES\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT0_OES\"/>\n\t\t<field name=\"GL_CURRENT_PALETTE_MATRIX_OES\"/>\n\t\t<field name=\"GL_DECR_WRAP_OES\"/>\n\t\t<field name=\"GL_DEPTH24_STENCIL8_OES\"/>\n\t\t<field name=\"GL_DEPTH_ATTACHMENT_OES\"/>\n\t\t<field name=\"GL_DEPTH_COMPONENT16_OES\"/>\n\t\t<field name=\"GL_DEPTH_COMPONENT24_OES\"/>\n\t\t<field name=\"GL_DEPTH_COMPONENT32_OES\"/>\n\t\t<field name=\"GL_DEPTH_STENCIL_OES\"/>\n\t\t<field name=\"GL_ETC1_RGB8_OES\"/>\n\t\t<field name=\"GL_FIXED_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_BINDING_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_COMPLETE_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_UNSUPPORTED_OES\"/>\n\t\t<field name=\"GL_FUNC_ADD_OES\"/>\n\t\t<field name=\"GL_FUNC_REVERSE_SUBTRACT_OES\"/>\n\t\t<field name=\"GL_FUNC_SUBTRACT_OES\"/>\n\t\t<field name=\"GL_INCR_WRAP_OES\"/>\n\t\t<field name=\"GL_INVALID_FRAMEBUFFER_OPERATION_OES\"/>\n\t\t<field name=\"GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES\"/>\n\t\t<field name=\"GL_MATRIX_INDEX_ARRAY_OES\"/>\n\t\t<field name=\"GL_MATRIX_INDEX_ARRAY_POINTER_OES\"/>\n\t\t<field name=\"GL_MATRIX_INDEX_ARRAY_SIZE_OES\"/>\n\t\t<field name=\"GL_MATRIX_INDEX_ARRAY_STRIDE_OES\"/>\n\t\t<field name=\"GL_MATRIX_INDEX_ARRAY_TYPE_OES\"/>\n\t\t<field name=\"GL_MATRIX_PALETTE_OES\"/>\n\t\t<field name=\"GL_MAX_CUBE_MAP_TEXTURE_SIZE_OES\"/>\n\t\t<field name=\"GL_MAX_PALETTE_MATRICES_OES\"/>\n\t\t<field name=\"GL_MAX_RENDERBUFFER_SIZE_OES\"/>\n\t\t<field name=\"GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT\"/>\n\t\t<field name=\"GL_MAX_VERTEX_UNITS_OES\"/>\n\t\t<field name=\"GL_MIRRORED_REPEAT_OES\"/>\n\t\t<field name=\"GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES\"/>\n\t\t<field name=\"GL_NONE_OES\"/>\n\t\t<field name=\"GL_NORMAL_MAP_OES\"/>\n\t\t<field name=\"GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES\"/>\n\t\t<field name=\"GL_REFLECTION_MAP_OES\"/>\n\t\t<field name=\"GL_RENDERBUFFER_ALPHA_SIZE_OES\"/>\n\t\t<field name=\"GL_RENDERBUFFER_BINDING_OES\"/>\n\t\t<field name=\"GL_RENDERBUFFER_BLUE_SIZE_OES\"/>\n\t\t<field name=\"GL_RENDERBUFFER_DEPTH_SIZE_OES\"/>\n\t\t<field name=\"GL_RENDERBUFFER_GREEN_SIZE_OES\"/>\n\t\t<field name=\"GL_RENDERBUFFER_HEIGHT_OES\"/>\n\t\t<field name=\"GL_RENDERBUFFER_INTERNAL_FORMAT_OES\"/>\n\t\t<field name=\"GL_RENDERBUFFER_OES\"/>\n\t\t<field name=\"GL_RENDERBUFFER_RED_SIZE_OES\"/>\n\t\t<field name=\"GL_RENDERBUFFER_STENCIL_SIZE_OES\"/>\n\t\t<field name=\"GL_RENDERBUFFER_WIDTH_OES\"/>\n\t\t<field name=\"GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES\" since=\"15\"/>\n\t\t<field name=\"GL_RGB565_OES\"/>\n\t\t<field name=\"GL_RGB5_A1_OES\"/>\n\t\t<field name=\"GL_RGB8_OES\"/>\n\t\t<field name=\"GL_RGBA4_OES\"/>\n\t\t<field name=\"GL_RGBA8_OES\"/>\n\t\t<field name=\"GL_SAMPLER_EXTERNAL_OES\" since=\"15\"/>\n\t\t<field name=\"GL_STENCIL_ATTACHMENT_OES\"/>\n\t\t<field name=\"GL_STENCIL_INDEX1_OES\"/>\n\t\t<field name=\"GL_STENCIL_INDEX4_OES\"/>\n\t\t<field name=\"GL_STENCIL_INDEX8_OES\"/>\n\t\t<field name=\"GL_TEXTURE_BINDING_CUBE_MAP_OES\"/>\n\t\t<field name=\"GL_TEXTURE_BINDING_EXTERNAL_OES\" since=\"15\"/>\n\t\t<field name=\"GL_TEXTURE_CROP_RECT_OES\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP_OES\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES\"/>\n\t\t<field name=\"GL_TEXTURE_EXTERNAL_OES\" since=\"15\"/>\n\t\t<field name=\"GL_TEXTURE_GEN_MODE_OES\"/>\n\t\t<field name=\"GL_TEXTURE_GEN_STR_OES\"/>\n\t\t<field name=\"GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES\"/>\n\t\t<field name=\"GL_TEXTURE_MAX_ANISOTROPY_EXT\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_24_8_OES\"/>\n\t\t<field name=\"GL_WEIGHT_ARRAY_BUFFER_BINDING_OES\"/>\n\t\t<field name=\"GL_WEIGHT_ARRAY_OES\"/>\n\t\t<field name=\"GL_WEIGHT_ARRAY_POINTER_OES\"/>\n\t\t<field name=\"GL_WEIGHT_ARRAY_SIZE_OES\"/>\n\t\t<field name=\"GL_WEIGHT_ARRAY_STRIDE_OES\"/>\n\t\t<field name=\"GL_WEIGHT_ARRAY_TYPE_OES\"/>\n\t\t<field name=\"GL_WRITE_ONLY_OES\"/>\n\t</class>\n\t<class name=\"android/opengl/GLES20\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"glActiveTexture(I)V\"/>\n\t\t<method name=\"glAttachShader(II)V\"/>\n\t\t<method name=\"glBindAttribLocation(IILjava/lang/String;)V\"/>\n\t\t<method name=\"glBindBuffer(II)V\"/>\n\t\t<method name=\"glBindFramebuffer(II)V\"/>\n\t\t<method name=\"glBindRenderbuffer(II)V\"/>\n\t\t<method name=\"glBindTexture(II)V\"/>\n\t\t<method name=\"glBlendColor(FFFF)V\"/>\n\t\t<method name=\"glBlendEquation(I)V\"/>\n\t\t<method name=\"glBlendEquationSeparate(II)V\"/>\n\t\t<method name=\"glBlendFunc(II)V\"/>\n\t\t<method name=\"glBlendFuncSeparate(IIII)V\"/>\n\t\t<method name=\"glBufferData(IILjava/nio/Buffer;I)V\"/>\n\t\t<method name=\"glBufferSubData(IIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glCheckFramebufferStatus(I)I\"/>\n\t\t<method name=\"glClear(I)V\"/>\n\t\t<method name=\"glClearColor(FFFF)V\"/>\n\t\t<method name=\"glClearDepthf(F)V\"/>\n\t\t<method name=\"glClearStencil(I)V\"/>\n\t\t<method name=\"glColorMask(ZZZZ)V\"/>\n\t\t<method name=\"glCompileShader(I)V\"/>\n\t\t<method name=\"glCompressedTexImage2D(IIIIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glCompressedTexSubImage2D(IIIIIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glCopyTexImage2D(IIIIIIII)V\"/>\n\t\t<method name=\"glCopyTexSubImage2D(IIIIIIII)V\"/>\n\t\t<method name=\"glCreateProgram()I\"/>\n\t\t<method name=\"glCreateShader(I)I\"/>\n\t\t<method name=\"glCullFace(I)V\"/>\n\t\t<method name=\"glDeleteBuffers(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDeleteBuffers(I[II)V\"/>\n\t\t<method name=\"glDeleteFramebuffers(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDeleteFramebuffers(I[II)V\"/>\n\t\t<method name=\"glDeleteProgram(I)V\"/>\n\t\t<method name=\"glDeleteRenderbuffers(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDeleteRenderbuffers(I[II)V\"/>\n\t\t<method name=\"glDeleteShader(I)V\"/>\n\t\t<method name=\"glDeleteTextures(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDeleteTextures(I[II)V\"/>\n\t\t<method name=\"glDepthFunc(I)V\"/>\n\t\t<method name=\"glDepthMask(Z)V\"/>\n\t\t<method name=\"glDepthRangef(FF)V\"/>\n\t\t<method name=\"glDetachShader(II)V\"/>\n\t\t<method name=\"glDisable(I)V\"/>\n\t\t<method name=\"glDisableVertexAttribArray(I)V\"/>\n\t\t<method name=\"glDrawArrays(III)V\"/>\n\t\t<method name=\"glDrawElements(IIII)V\" since=\"9\"/>\n\t\t<method name=\"glDrawElements(IIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glEnable(I)V\"/>\n\t\t<method name=\"glEnableVertexAttribArray(I)V\"/>\n\t\t<method name=\"glFinish()V\"/>\n\t\t<method name=\"glFlush()V\"/>\n\t\t<method name=\"glFramebufferRenderbuffer(IIII)V\"/>\n\t\t<method name=\"glFramebufferTexture2D(IIIII)V\"/>\n\t\t<method name=\"glFrontFace(I)V\"/>\n\t\t<method name=\"glGenBuffers(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGenBuffers(I[II)V\"/>\n\t\t<method name=\"glGenFramebuffers(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGenFramebuffers(I[II)V\"/>\n\t\t<method name=\"glGenRenderbuffers(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGenRenderbuffers(I[II)V\"/>\n\t\t<method name=\"glGenTextures(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGenTextures(I[II)V\"/>\n\t\t<method name=\"glGenerateMipmap(I)V\"/>\n\t\t<method name=\"glGetActiveAttrib(IIILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;B)V\" removed=\"21\"/>\n\t\t<method name=\"glGetActiveAttrib(III[II[II[II[BI)V\"/>\n\t\t<method name=\"glGetActiveAttrib(IILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)Ljava/lang/String;\" since=\"17\"/>\n\t\t<method name=\"glGetActiveAttrib(II[II[II)Ljava/lang/String;\" since=\"17\"/>\n\t\t<method name=\"glGetActiveUniform(IIILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;B)V\" removed=\"21\"/>\n\t\t<method name=\"glGetActiveUniform(III[II[II[II[BI)V\"/>\n\t\t<method name=\"glGetActiveUniform(IILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)Ljava/lang/String;\" since=\"17\"/>\n\t\t<method name=\"glGetActiveUniform(II[II[II)Ljava/lang/String;\" since=\"17\"/>\n\t\t<method name=\"glGetAttachedShaders(IILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetAttachedShaders(II[II[II)V\"/>\n\t\t<method name=\"glGetAttribLocation(ILjava/lang/String;)I\"/>\n\t\t<method name=\"glGetBooleanv(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetBooleanv(I[ZI)V\"/>\n\t\t<method name=\"glGetBufferParameteriv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetBufferParameteriv(II[II)V\"/>\n\t\t<method name=\"glGetError()I\"/>\n\t\t<method name=\"glGetFloatv(ILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetFloatv(I[FI)V\"/>\n\t\t<method name=\"glGetFramebufferAttachmentParameteriv(IIILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetFramebufferAttachmentParameteriv(III[II)V\"/>\n\t\t<method name=\"glGetIntegerv(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetIntegerv(I[II)V\"/>\n\t\t<method name=\"glGetProgramInfoLog(I)Ljava/lang/String;\"/>\n\t\t<method name=\"glGetProgramiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetProgramiv(II[II)V\"/>\n\t\t<method name=\"glGetRenderbufferParameteriv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetRenderbufferParameteriv(II[II)V\"/>\n\t\t<method name=\"glGetShaderInfoLog(I)Ljava/lang/String;\"/>\n\t\t<method name=\"glGetShaderPrecisionFormat(IILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetShaderPrecisionFormat(II[II[II)V\"/>\n\t\t<method name=\"glGetShaderSource(I)Ljava/lang/String;\" since=\"17\"/>\n\t\t<method name=\"glGetShaderSource(IILjava/nio/IntBuffer;B)V\" removed=\"21\"/>\n\t\t<method name=\"glGetShaderSource(II[II[BI)V\"/>\n\t\t<method name=\"glGetShaderiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetShaderiv(II[II)V\"/>\n\t\t<method name=\"glGetString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"glGetTexParameterfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetTexParameterfv(II[FI)V\"/>\n\t\t<method name=\"glGetTexParameteriv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetTexParameteriv(II[II)V\"/>\n\t\t<method name=\"glGetUniformLocation(ILjava/lang/String;)I\"/>\n\t\t<method name=\"glGetUniformfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetUniformfv(II[FI)V\"/>\n\t\t<method name=\"glGetUniformiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetUniformiv(II[II)V\"/>\n\t\t<method name=\"glGetVertexAttribfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetVertexAttribfv(II[FI)V\"/>\n\t\t<method name=\"glGetVertexAttribiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetVertexAttribiv(II[II)V\"/>\n\t\t<method name=\"glHint(II)V\"/>\n\t\t<method name=\"glIsBuffer(I)Z\"/>\n\t\t<method name=\"glIsEnabled(I)Z\"/>\n\t\t<method name=\"glIsFramebuffer(I)Z\"/>\n\t\t<method name=\"glIsProgram(I)Z\"/>\n\t\t<method name=\"glIsRenderbuffer(I)Z\"/>\n\t\t<method name=\"glIsShader(I)Z\"/>\n\t\t<method name=\"glIsTexture(I)Z\"/>\n\t\t<method name=\"glLineWidth(F)V\"/>\n\t\t<method name=\"glLinkProgram(I)V\"/>\n\t\t<method name=\"glPixelStorei(II)V\"/>\n\t\t<method name=\"glPolygonOffset(FF)V\"/>\n\t\t<method name=\"glReadPixels(IIIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glReleaseShaderCompiler()V\"/>\n\t\t<method name=\"glRenderbufferStorage(IIII)V\"/>\n\t\t<method name=\"glSampleCoverage(FZ)V\"/>\n\t\t<method name=\"glScissor(IIII)V\"/>\n\t\t<method name=\"glShaderBinary(ILjava/nio/IntBuffer;ILjava/nio/Buffer;I)V\"/>\n\t\t<method name=\"glShaderBinary(I[IIILjava/nio/Buffer;I)V\"/>\n\t\t<method name=\"glShaderSource(ILjava/lang/String;)V\"/>\n\t\t<method name=\"glStencilFunc(III)V\"/>\n\t\t<method name=\"glStencilFuncSeparate(IIII)V\"/>\n\t\t<method name=\"glStencilMask(I)V\"/>\n\t\t<method name=\"glStencilMaskSeparate(II)V\"/>\n\t\t<method name=\"glStencilOp(III)V\"/>\n\t\t<method name=\"glStencilOpSeparate(IIII)V\"/>\n\t\t<method name=\"glTexImage2D(IIIIIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glTexParameterf(IIF)V\"/>\n\t\t<method name=\"glTexParameterfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glTexParameterfv(II[FI)V\"/>\n\t\t<method name=\"glTexParameteri(III)V\"/>\n\t\t<method name=\"glTexParameteriv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glTexParameteriv(II[II)V\"/>\n\t\t<method name=\"glTexSubImage2D(IIIIIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glUniform1f(IF)V\"/>\n\t\t<method name=\"glUniform1fv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glUniform1fv(II[FI)V\"/>\n\t\t<method name=\"glUniform1i(II)V\"/>\n\t\t<method name=\"glUniform1iv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glUniform1iv(II[II)V\"/>\n\t\t<method name=\"glUniform2f(IFF)V\"/>\n\t\t<method name=\"glUniform2fv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glUniform2fv(II[FI)V\"/>\n\t\t<method name=\"glUniform2i(III)V\"/>\n\t\t<method name=\"glUniform2iv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glUniform2iv(II[II)V\"/>\n\t\t<method name=\"glUniform3f(IFFF)V\"/>\n\t\t<method name=\"glUniform3fv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glUniform3fv(II[FI)V\"/>\n\t\t<method name=\"glUniform3i(IIII)V\"/>\n\t\t<method name=\"glUniform3iv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glUniform3iv(II[II)V\"/>\n\t\t<method name=\"glUniform4f(IFFFF)V\"/>\n\t\t<method name=\"glUniform4fv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glUniform4fv(II[FI)V\"/>\n\t\t<method name=\"glUniform4i(IIIII)V\"/>\n\t\t<method name=\"glUniform4iv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glUniform4iv(II[II)V\"/>\n\t\t<method name=\"glUniformMatrix2fv(IIZLjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glUniformMatrix2fv(IIZ[FI)V\"/>\n\t\t<method name=\"glUniformMatrix3fv(IIZLjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glUniformMatrix3fv(IIZ[FI)V\"/>\n\t\t<method name=\"glUniformMatrix4fv(IIZLjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glUniformMatrix4fv(IIZ[FI)V\"/>\n\t\t<method name=\"glUseProgram(I)V\"/>\n\t\t<method name=\"glValidateProgram(I)V\"/>\n\t\t<method name=\"glVertexAttrib1f(IF)V\"/>\n\t\t<method name=\"glVertexAttrib1fv(ILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glVertexAttrib1fv(I[FI)V\"/>\n\t\t<method name=\"glVertexAttrib2f(IFF)V\"/>\n\t\t<method name=\"glVertexAttrib2fv(ILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glVertexAttrib2fv(I[FI)V\"/>\n\t\t<method name=\"glVertexAttrib3f(IFFF)V\"/>\n\t\t<method name=\"glVertexAttrib3fv(ILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glVertexAttrib3fv(I[FI)V\"/>\n\t\t<method name=\"glVertexAttrib4f(IFFFF)V\"/>\n\t\t<method name=\"glVertexAttrib4fv(ILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glVertexAttrib4fv(I[FI)V\"/>\n\t\t<method name=\"glVertexAttribPointer(IIIZII)V\" since=\"9\"/>\n\t\t<method name=\"glVertexAttribPointer(IIIZILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glViewport(IIII)V\"/>\n\t\t<field name=\"GL_ACTIVE_ATTRIBUTES\"/>\n\t\t<field name=\"GL_ACTIVE_ATTRIBUTE_MAX_LENGTH\"/>\n\t\t<field name=\"GL_ACTIVE_TEXTURE\"/>\n\t\t<field name=\"GL_ACTIVE_UNIFORMS\"/>\n\t\t<field name=\"GL_ACTIVE_UNIFORM_MAX_LENGTH\"/>\n\t\t<field name=\"GL_ALIASED_LINE_WIDTH_RANGE\"/>\n\t\t<field name=\"GL_ALIASED_POINT_SIZE_RANGE\"/>\n\t\t<field name=\"GL_ALPHA\"/>\n\t\t<field name=\"GL_ALPHA_BITS\"/>\n\t\t<field name=\"GL_ALWAYS\"/>\n\t\t<field name=\"GL_ARRAY_BUFFER\"/>\n\t\t<field name=\"GL_ARRAY_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_ATTACHED_SHADERS\"/>\n\t\t<field name=\"GL_BACK\"/>\n\t\t<field name=\"GL_BLEND\"/>\n\t\t<field name=\"GL_BLEND_COLOR\"/>\n\t\t<field name=\"GL_BLEND_DST_ALPHA\"/>\n\t\t<field name=\"GL_BLEND_DST_RGB\"/>\n\t\t<field name=\"GL_BLEND_EQUATION\"/>\n\t\t<field name=\"GL_BLEND_EQUATION_ALPHA\"/>\n\t\t<field name=\"GL_BLEND_EQUATION_RGB\"/>\n\t\t<field name=\"GL_BLEND_SRC_ALPHA\"/>\n\t\t<field name=\"GL_BLEND_SRC_RGB\"/>\n\t\t<field name=\"GL_BLUE_BITS\"/>\n\t\t<field name=\"GL_BOOL\"/>\n\t\t<field name=\"GL_BOOL_VEC2\"/>\n\t\t<field name=\"GL_BOOL_VEC3\"/>\n\t\t<field name=\"GL_BOOL_VEC4\"/>\n\t\t<field name=\"GL_BUFFER_SIZE\"/>\n\t\t<field name=\"GL_BUFFER_USAGE\"/>\n\t\t<field name=\"GL_BYTE\"/>\n\t\t<field name=\"GL_CCW\"/>\n\t\t<field name=\"GL_CLAMP_TO_EDGE\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT0\"/>\n\t\t<field name=\"GL_COLOR_BUFFER_BIT\"/>\n\t\t<field name=\"GL_COLOR_CLEAR_VALUE\"/>\n\t\t<field name=\"GL_COLOR_WRITEMASK\"/>\n\t\t<field name=\"GL_COMPILE_STATUS\"/>\n\t\t<field name=\"GL_COMPRESSED_TEXTURE_FORMATS\"/>\n\t\t<field name=\"GL_CONSTANT_ALPHA\"/>\n\t\t<field name=\"GL_CONSTANT_COLOR\"/>\n\t\t<field name=\"GL_CULL_FACE\"/>\n\t\t<field name=\"GL_CULL_FACE_MODE\"/>\n\t\t<field name=\"GL_CURRENT_PROGRAM\"/>\n\t\t<field name=\"GL_CURRENT_VERTEX_ATTRIB\"/>\n\t\t<field name=\"GL_CW\"/>\n\t\t<field name=\"GL_DECR\"/>\n\t\t<field name=\"GL_DECR_WRAP\"/>\n\t\t<field name=\"GL_DELETE_STATUS\"/>\n\t\t<field name=\"GL_DEPTH_ATTACHMENT\"/>\n\t\t<field name=\"GL_DEPTH_BITS\"/>\n\t\t<field name=\"GL_DEPTH_BUFFER_BIT\"/>\n\t\t<field name=\"GL_DEPTH_CLEAR_VALUE\"/>\n\t\t<field name=\"GL_DEPTH_COMPONENT\"/>\n\t\t<field name=\"GL_DEPTH_COMPONENT16\"/>\n\t\t<field name=\"GL_DEPTH_FUNC\"/>\n\t\t<field name=\"GL_DEPTH_RANGE\"/>\n\t\t<field name=\"GL_DEPTH_TEST\"/>\n\t\t<field name=\"GL_DEPTH_WRITEMASK\"/>\n\t\t<field name=\"GL_DITHER\"/>\n\t\t<field name=\"GL_DONT_CARE\"/>\n\t\t<field name=\"GL_DST_ALPHA\"/>\n\t\t<field name=\"GL_DST_COLOR\"/>\n\t\t<field name=\"GL_DYNAMIC_DRAW\"/>\n\t\t<field name=\"GL_ELEMENT_ARRAY_BUFFER\"/>\n\t\t<field name=\"GL_ELEMENT_ARRAY_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_EQUAL\"/>\n\t\t<field name=\"GL_EXTENSIONS\"/>\n\t\t<field name=\"GL_FALSE\"/>\n\t\t<field name=\"GL_FASTEST\"/>\n\t\t<field name=\"GL_FIXED\"/>\n\t\t<field name=\"GL_FLOAT\"/>\n\t\t<field name=\"GL_FLOAT_MAT2\"/>\n\t\t<field name=\"GL_FLOAT_MAT3\"/>\n\t\t<field name=\"GL_FLOAT_MAT4\"/>\n\t\t<field name=\"GL_FLOAT_VEC2\"/>\n\t\t<field name=\"GL_FLOAT_VEC3\"/>\n\t\t<field name=\"GL_FLOAT_VEC4\"/>\n\t\t<field name=\"GL_FRAGMENT_SHADER\"/>\n\t\t<field name=\"GL_FRAMEBUFFER\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_BINDING\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_COMPLETE\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_UNSUPPORTED\"/>\n\t\t<field name=\"GL_FRONT\"/>\n\t\t<field name=\"GL_FRONT_AND_BACK\"/>\n\t\t<field name=\"GL_FRONT_FACE\"/>\n\t\t<field name=\"GL_FUNC_ADD\"/>\n\t\t<field name=\"GL_FUNC_REVERSE_SUBTRACT\"/>\n\t\t<field name=\"GL_FUNC_SUBTRACT\"/>\n\t\t<field name=\"GL_GENERATE_MIPMAP_HINT\"/>\n\t\t<field name=\"GL_GEQUAL\"/>\n\t\t<field name=\"GL_GREATER\"/>\n\t\t<field name=\"GL_GREEN_BITS\"/>\n\t\t<field name=\"GL_HIGH_FLOAT\"/>\n\t\t<field name=\"GL_HIGH_INT\"/>\n\t\t<field name=\"GL_IMPLEMENTATION_COLOR_READ_FORMAT\"/>\n\t\t<field name=\"GL_IMPLEMENTATION_COLOR_READ_TYPE\"/>\n\t\t<field name=\"GL_INCR\"/>\n\t\t<field name=\"GL_INCR_WRAP\"/>\n\t\t<field name=\"GL_INFO_LOG_LENGTH\"/>\n\t\t<field name=\"GL_INT\"/>\n\t\t<field name=\"GL_INT_VEC2\"/>\n\t\t<field name=\"GL_INT_VEC3\"/>\n\t\t<field name=\"GL_INT_VEC4\"/>\n\t\t<field name=\"GL_INVALID_ENUM\"/>\n\t\t<field name=\"GL_INVALID_FRAMEBUFFER_OPERATION\"/>\n\t\t<field name=\"GL_INVALID_OPERATION\"/>\n\t\t<field name=\"GL_INVALID_VALUE\"/>\n\t\t<field name=\"GL_INVERT\"/>\n\t\t<field name=\"GL_KEEP\"/>\n\t\t<field name=\"GL_LEQUAL\"/>\n\t\t<field name=\"GL_LESS\"/>\n\t\t<field name=\"GL_LINEAR\"/>\n\t\t<field name=\"GL_LINEAR_MIPMAP_LINEAR\"/>\n\t\t<field name=\"GL_LINEAR_MIPMAP_NEAREST\"/>\n\t\t<field name=\"GL_LINES\"/>\n\t\t<field name=\"GL_LINE_LOOP\"/>\n\t\t<field name=\"GL_LINE_STRIP\"/>\n\t\t<field name=\"GL_LINE_WIDTH\"/>\n\t\t<field name=\"GL_LINK_STATUS\"/>\n\t\t<field name=\"GL_LOW_FLOAT\"/>\n\t\t<field name=\"GL_LOW_INT\"/>\n\t\t<field name=\"GL_LUMINANCE\"/>\n\t\t<field name=\"GL_LUMINANCE_ALPHA\"/>\n\t\t<field name=\"GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS\"/>\n\t\t<field name=\"GL_MAX_CUBE_MAP_TEXTURE_SIZE\"/>\n\t\t<field name=\"GL_MAX_FRAGMENT_UNIFORM_VECTORS\"/>\n\t\t<field name=\"GL_MAX_RENDERBUFFER_SIZE\"/>\n\t\t<field name=\"GL_MAX_TEXTURE_IMAGE_UNITS\"/>\n\t\t<field name=\"GL_MAX_TEXTURE_SIZE\"/>\n\t\t<field name=\"GL_MAX_VARYING_VECTORS\"/>\n\t\t<field name=\"GL_MAX_VERTEX_ATTRIBS\"/>\n\t\t<field name=\"GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS\"/>\n\t\t<field name=\"GL_MAX_VERTEX_UNIFORM_VECTORS\"/>\n\t\t<field name=\"GL_MAX_VIEWPORT_DIMS\"/>\n\t\t<field name=\"GL_MEDIUM_FLOAT\"/>\n\t\t<field name=\"GL_MEDIUM_INT\"/>\n\t\t<field name=\"GL_MIRRORED_REPEAT\"/>\n\t\t<field name=\"GL_NEAREST\"/>\n\t\t<field name=\"GL_NEAREST_MIPMAP_LINEAR\"/>\n\t\t<field name=\"GL_NEAREST_MIPMAP_NEAREST\"/>\n\t\t<field name=\"GL_NEVER\"/>\n\t\t<field name=\"GL_NICEST\"/>\n\t\t<field name=\"GL_NONE\"/>\n\t\t<field name=\"GL_NOTEQUAL\"/>\n\t\t<field name=\"GL_NO_ERROR\"/>\n\t\t<field name=\"GL_NUM_COMPRESSED_TEXTURE_FORMATS\"/>\n\t\t<field name=\"GL_NUM_SHADER_BINARY_FORMATS\"/>\n\t\t<field name=\"GL_ONE\"/>\n\t\t<field name=\"GL_ONE_MINUS_CONSTANT_ALPHA\"/>\n\t\t<field name=\"GL_ONE_MINUS_CONSTANT_COLOR\"/>\n\t\t<field name=\"GL_ONE_MINUS_DST_ALPHA\"/>\n\t\t<field name=\"GL_ONE_MINUS_DST_COLOR\"/>\n\t\t<field name=\"GL_ONE_MINUS_SRC_ALPHA\"/>\n\t\t<field name=\"GL_ONE_MINUS_SRC_COLOR\"/>\n\t\t<field name=\"GL_OUT_OF_MEMORY\"/>\n\t\t<field name=\"GL_PACK_ALIGNMENT\"/>\n\t\t<field name=\"GL_POINTS\"/>\n\t\t<field name=\"GL_POLYGON_OFFSET_FACTOR\"/>\n\t\t<field name=\"GL_POLYGON_OFFSET_FILL\"/>\n\t\t<field name=\"GL_POLYGON_OFFSET_UNITS\"/>\n\t\t<field name=\"GL_RED_BITS\"/>\n\t\t<field name=\"GL_RENDERBUFFER\"/>\n\t\t<field name=\"GL_RENDERBUFFER_ALPHA_SIZE\"/>\n\t\t<field name=\"GL_RENDERBUFFER_BINDING\"/>\n\t\t<field name=\"GL_RENDERBUFFER_BLUE_SIZE\"/>\n\t\t<field name=\"GL_RENDERBUFFER_DEPTH_SIZE\"/>\n\t\t<field name=\"GL_RENDERBUFFER_GREEN_SIZE\"/>\n\t\t<field name=\"GL_RENDERBUFFER_HEIGHT\"/>\n\t\t<field name=\"GL_RENDERBUFFER_INTERNAL_FORMAT\"/>\n\t\t<field name=\"GL_RENDERBUFFER_RED_SIZE\"/>\n\t\t<field name=\"GL_RENDERBUFFER_STENCIL_SIZE\"/>\n\t\t<field name=\"GL_RENDERBUFFER_WIDTH\"/>\n\t\t<field name=\"GL_RENDERER\"/>\n\t\t<field name=\"GL_REPEAT\"/>\n\t\t<field name=\"GL_REPLACE\"/>\n\t\t<field name=\"GL_RGB\"/>\n\t\t<field name=\"GL_RGB565\"/>\n\t\t<field name=\"GL_RGB5_A1\"/>\n\t\t<field name=\"GL_RGBA\"/>\n\t\t<field name=\"GL_RGBA4\"/>\n\t\t<field name=\"GL_SAMPLER_2D\"/>\n\t\t<field name=\"GL_SAMPLER_CUBE\"/>\n\t\t<field name=\"GL_SAMPLES\"/>\n\t\t<field name=\"GL_SAMPLE_ALPHA_TO_COVERAGE\"/>\n\t\t<field name=\"GL_SAMPLE_BUFFERS\"/>\n\t\t<field name=\"GL_SAMPLE_COVERAGE\"/>\n\t\t<field name=\"GL_SAMPLE_COVERAGE_INVERT\"/>\n\t\t<field name=\"GL_SAMPLE_COVERAGE_VALUE\"/>\n\t\t<field name=\"GL_SCISSOR_BOX\"/>\n\t\t<field name=\"GL_SCISSOR_TEST\"/>\n\t\t<field name=\"GL_SHADER_BINARY_FORMATS\"/>\n\t\t<field name=\"GL_SHADER_COMPILER\"/>\n\t\t<field name=\"GL_SHADER_SOURCE_LENGTH\"/>\n\t\t<field name=\"GL_SHADER_TYPE\"/>\n\t\t<field name=\"GL_SHADING_LANGUAGE_VERSION\"/>\n\t\t<field name=\"GL_SHORT\"/>\n\t\t<field name=\"GL_SRC_ALPHA\"/>\n\t\t<field name=\"GL_SRC_ALPHA_SATURATE\"/>\n\t\t<field name=\"GL_SRC_COLOR\"/>\n\t\t<field name=\"GL_STATIC_DRAW\"/>\n\t\t<field name=\"GL_STENCIL_ATTACHMENT\"/>\n\t\t<field name=\"GL_STENCIL_BACK_FAIL\"/>\n\t\t<field name=\"GL_STENCIL_BACK_FUNC\"/>\n\t\t<field name=\"GL_STENCIL_BACK_PASS_DEPTH_FAIL\"/>\n\t\t<field name=\"GL_STENCIL_BACK_PASS_DEPTH_PASS\"/>\n\t\t<field name=\"GL_STENCIL_BACK_REF\"/>\n\t\t<field name=\"GL_STENCIL_BACK_VALUE_MASK\"/>\n\t\t<field name=\"GL_STENCIL_BACK_WRITEMASK\"/>\n\t\t<field name=\"GL_STENCIL_BITS\"/>\n\t\t<field name=\"GL_STENCIL_BUFFER_BIT\"/>\n\t\t<field name=\"GL_STENCIL_CLEAR_VALUE\"/>\n\t\t<field name=\"GL_STENCIL_FAIL\"/>\n\t\t<field name=\"GL_STENCIL_FUNC\"/>\n\t\t<field name=\"GL_STENCIL_INDEX\" deprecated=\"18\"/>\n\t\t<field name=\"GL_STENCIL_INDEX8\"/>\n\t\t<field name=\"GL_STENCIL_PASS_DEPTH_FAIL\"/>\n\t\t<field name=\"GL_STENCIL_PASS_DEPTH_PASS\"/>\n\t\t<field name=\"GL_STENCIL_REF\"/>\n\t\t<field name=\"GL_STENCIL_TEST\"/>\n\t\t<field name=\"GL_STENCIL_VALUE_MASK\"/>\n\t\t<field name=\"GL_STENCIL_WRITEMASK\"/>\n\t\t<field name=\"GL_STREAM_DRAW\"/>\n\t\t<field name=\"GL_SUBPIXEL_BITS\"/>\n\t\t<field name=\"GL_TEXTURE\"/>\n\t\t<field name=\"GL_TEXTURE0\"/>\n\t\t<field name=\"GL_TEXTURE1\"/>\n\t\t<field name=\"GL_TEXTURE10\"/>\n\t\t<field name=\"GL_TEXTURE11\"/>\n\t\t<field name=\"GL_TEXTURE12\"/>\n\t\t<field name=\"GL_TEXTURE13\"/>\n\t\t<field name=\"GL_TEXTURE14\"/>\n\t\t<field name=\"GL_TEXTURE15\"/>\n\t\t<field name=\"GL_TEXTURE16\"/>\n\t\t<field name=\"GL_TEXTURE17\"/>\n\t\t<field name=\"GL_TEXTURE18\"/>\n\t\t<field name=\"GL_TEXTURE19\"/>\n\t\t<field name=\"GL_TEXTURE2\"/>\n\t\t<field name=\"GL_TEXTURE20\"/>\n\t\t<field name=\"GL_TEXTURE21\"/>\n\t\t<field name=\"GL_TEXTURE22\"/>\n\t\t<field name=\"GL_TEXTURE23\"/>\n\t\t<field name=\"GL_TEXTURE24\"/>\n\t\t<field name=\"GL_TEXTURE25\"/>\n\t\t<field name=\"GL_TEXTURE26\"/>\n\t\t<field name=\"GL_TEXTURE27\"/>\n\t\t<field name=\"GL_TEXTURE28\"/>\n\t\t<field name=\"GL_TEXTURE29\"/>\n\t\t<field name=\"GL_TEXTURE3\"/>\n\t\t<field name=\"GL_TEXTURE30\"/>\n\t\t<field name=\"GL_TEXTURE31\"/>\n\t\t<field name=\"GL_TEXTURE4\"/>\n\t\t<field name=\"GL_TEXTURE5\"/>\n\t\t<field name=\"GL_TEXTURE6\"/>\n\t\t<field name=\"GL_TEXTURE7\"/>\n\t\t<field name=\"GL_TEXTURE8\"/>\n\t\t<field name=\"GL_TEXTURE9\"/>\n\t\t<field name=\"GL_TEXTURE_2D\"/>\n\t\t<field name=\"GL_TEXTURE_BINDING_2D\"/>\n\t\t<field name=\"GL_TEXTURE_BINDING_CUBE_MAP\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP_NEGATIVE_X\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP_NEGATIVE_Y\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP_NEGATIVE_Z\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP_POSITIVE_X\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP_POSITIVE_Y\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP_POSITIVE_Z\"/>\n\t\t<field name=\"GL_TEXTURE_MAG_FILTER\"/>\n\t\t<field name=\"GL_TEXTURE_MIN_FILTER\"/>\n\t\t<field name=\"GL_TEXTURE_WRAP_S\"/>\n\t\t<field name=\"GL_TEXTURE_WRAP_T\"/>\n\t\t<field name=\"GL_TRIANGLES\"/>\n\t\t<field name=\"GL_TRIANGLE_FAN\"/>\n\t\t<field name=\"GL_TRIANGLE_STRIP\"/>\n\t\t<field name=\"GL_TRUE\"/>\n\t\t<field name=\"GL_UNPACK_ALIGNMENT\"/>\n\t\t<field name=\"GL_UNSIGNED_BYTE\"/>\n\t\t<field name=\"GL_UNSIGNED_INT\"/>\n\t\t<field name=\"GL_UNSIGNED_SHORT\"/>\n\t\t<field name=\"GL_UNSIGNED_SHORT_4_4_4_4\"/>\n\t\t<field name=\"GL_UNSIGNED_SHORT_5_5_5_1\"/>\n\t\t<field name=\"GL_UNSIGNED_SHORT_5_6_5\"/>\n\t\t<field name=\"GL_VALIDATE_STATUS\"/>\n\t\t<field name=\"GL_VENDOR\"/>\n\t\t<field name=\"GL_VERSION\"/>\n\t\t<field name=\"GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_VERTEX_ATTRIB_ARRAY_ENABLED\"/>\n\t\t<field name=\"GL_VERTEX_ATTRIB_ARRAY_NORMALIZED\"/>\n\t\t<field name=\"GL_VERTEX_ATTRIB_ARRAY_POINTER\"/>\n\t\t<field name=\"GL_VERTEX_ATTRIB_ARRAY_SIZE\"/>\n\t\t<field name=\"GL_VERTEX_ATTRIB_ARRAY_STRIDE\"/>\n\t\t<field name=\"GL_VERTEX_ATTRIB_ARRAY_TYPE\"/>\n\t\t<field name=\"GL_VERTEX_SHADER\"/>\n\t\t<field name=\"GL_VIEWPORT\"/>\n\t\t<field name=\"GL_ZERO\"/>\n\t</class>\n\t<class name=\"android/opengl/GLES30\" since=\"18\">\n\t\t<extends name=\"android/opengl/GLES20\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"glBeginQuery(II)V\"/>\n\t\t<method name=\"glBeginTransformFeedback(I)V\"/>\n\t\t<method name=\"glBindBufferBase(III)V\"/>\n\t\t<method name=\"glBindBufferRange(IIIII)V\"/>\n\t\t<method name=\"glBindSampler(II)V\"/>\n\t\t<method name=\"glBindTransformFeedback(II)V\"/>\n\t\t<method name=\"glBindVertexArray(I)V\"/>\n\t\t<method name=\"glBlitFramebuffer(IIIIIIIIII)V\"/>\n\t\t<method name=\"glClearBufferfi(IIFI)V\"/>\n\t\t<method name=\"glClearBufferfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glClearBufferfv(II[FI)V\"/>\n\t\t<method name=\"glClearBufferiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glClearBufferiv(II[II)V\"/>\n\t\t<method name=\"glClearBufferuiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glClearBufferuiv(II[II)V\"/>\n\t\t<method name=\"glClientWaitSync(JIJ)I\"/>\n\t\t<method name=\"glCompressedTexImage3D(IIIIIIIII)V\"/>\n\t\t<method name=\"glCompressedTexImage3D(IIIIIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glCompressedTexSubImage3D(IIIIIIIIIII)V\"/>\n\t\t<method name=\"glCompressedTexSubImage3D(IIIIIIIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glCopyBufferSubData(IIIII)V\"/>\n\t\t<method name=\"glCopyTexSubImage3D(IIIIIIIII)V\"/>\n\t\t<method name=\"glDeleteQueries(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDeleteQueries(I[II)V\"/>\n\t\t<method name=\"glDeleteSamplers(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDeleteSamplers(I[II)V\"/>\n\t\t<method name=\"glDeleteSync(J)V\"/>\n\t\t<method name=\"glDeleteTransformFeedbacks(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDeleteTransformFeedbacks(I[II)V\"/>\n\t\t<method name=\"glDeleteVertexArrays(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDeleteVertexArrays(I[II)V\"/>\n\t\t<method name=\"glDrawArraysInstanced(IIII)V\"/>\n\t\t<method name=\"glDrawBuffers(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDrawBuffers(I[II)V\"/>\n\t\t<method name=\"glDrawElementsInstanced(IIIII)V\"/>\n\t\t<method name=\"glDrawElementsInstanced(IIILjava/nio/Buffer;I)V\"/>\n\t\t<method name=\"glDrawRangeElements(IIIIII)V\"/>\n\t\t<method name=\"glDrawRangeElements(IIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glEndQuery(I)V\"/>\n\t\t<method name=\"glEndTransformFeedback()V\"/>\n\t\t<method name=\"glFenceSync(II)J\"/>\n\t\t<method name=\"glFlushMappedBufferRange(III)V\"/>\n\t\t<method name=\"glFramebufferTextureLayer(IIIII)V\"/>\n\t\t<method name=\"glGenQueries(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGenQueries(I[II)V\"/>\n\t\t<method name=\"glGenSamplers(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGenSamplers(I[II)V\"/>\n\t\t<method name=\"glGenTransformFeedbacks(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGenTransformFeedbacks(I[II)V\"/>\n\t\t<method name=\"glGenVertexArrays(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGenVertexArrays(I[II)V\"/>\n\t\t<method name=\"glGetActiveUniformBlockName(II)Ljava/lang/String;\"/>\n\t\t<method name=\"glGetActiveUniformBlockName(III[II[BI)V\"/>\n\t\t<method name=\"glGetActiveUniformBlockName(IILjava/nio/Buffer;Ljava/nio/Buffer;)V\"/>\n\t\t<method name=\"glGetActiveUniformBlockiv(IIILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetActiveUniformBlockiv(III[II)V\"/>\n\t\t<method name=\"glGetActiveUniformsiv(IILjava/nio/IntBuffer;ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetActiveUniformsiv(II[III[II)V\"/>\n\t\t<method name=\"glGetBufferParameteri64v(IILjava/nio/LongBuffer;)V\"/>\n\t\t<method name=\"glGetBufferParameteri64v(II[JI)V\"/>\n\t\t<method name=\"glGetBufferPointerv(II)Ljava/nio/Buffer;\"/>\n\t\t<method name=\"glGetFragDataLocation(ILjava/lang/String;)I\"/>\n\t\t<method name=\"glGetInteger64i_v(IILjava/nio/LongBuffer;)V\"/>\n\t\t<method name=\"glGetInteger64i_v(II[JI)V\"/>\n\t\t<method name=\"glGetInteger64v(ILjava/nio/LongBuffer;)V\"/>\n\t\t<method name=\"glGetInteger64v(I[JI)V\"/>\n\t\t<method name=\"glGetIntegeri_v(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetIntegeri_v(II[II)V\"/>\n\t\t<method name=\"glGetInternalformativ(IIIILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetInternalformativ(IIII[II)V\"/>\n\t\t<method name=\"glGetProgramBinary(IILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/Buffer;)V\"/>\n\t\t<method name=\"glGetProgramBinary(II[II[IILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glGetQueryObjectuiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetQueryObjectuiv(II[II)V\"/>\n\t\t<method name=\"glGetQueryiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetQueryiv(II[II)V\"/>\n\t\t<method name=\"glGetSamplerParameterfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetSamplerParameterfv(II[FI)V\"/>\n\t\t<method name=\"glGetSamplerParameteriv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetSamplerParameteriv(II[II)V\"/>\n\t\t<method name=\"glGetStringi(II)Ljava/lang/String;\"/>\n\t\t<method name=\"glGetSynciv(JIILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetSynciv(JII[II[II)V\"/>\n\t\t<method name=\"glGetTransformFeedbackVarying(IIILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;B)V\" deprecated=\"24\"/>\n\t\t<method name=\"glGetTransformFeedbackVarying(IIILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/ByteBuffer;)V\" since=\"24\"/>\n\t\t<method name=\"glGetTransformFeedbackVarying(III[II[II[II[BI)V\"/>\n\t\t<method name=\"glGetTransformFeedbackVarying(IILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)Ljava/lang/String;\"/>\n\t\t<method name=\"glGetTransformFeedbackVarying(II[II[II)Ljava/lang/String;\"/>\n\t\t<method name=\"glGetUniformBlockIndex(ILjava/lang/String;)I\"/>\n\t\t<method name=\"glGetUniformIndices(I[Ljava/lang/String;Ljava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetUniformIndices(I[Ljava/lang/String;[II)V\"/>\n\t\t<method name=\"glGetUniformuiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetUniformuiv(II[II)V\"/>\n\t\t<method name=\"glGetVertexAttribIiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetVertexAttribIiv(II[II)V\"/>\n\t\t<method name=\"glGetVertexAttribIuiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetVertexAttribIuiv(II[II)V\"/>\n\t\t<method name=\"glInvalidateFramebuffer(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glInvalidateFramebuffer(II[II)V\"/>\n\t\t<method name=\"glInvalidateSubFramebuffer(IILjava/nio/IntBuffer;IIII)V\"/>\n\t\t<method name=\"glInvalidateSubFramebuffer(II[IIIIII)V\"/>\n\t\t<method name=\"glIsQuery(I)Z\"/>\n\t\t<method name=\"glIsSampler(I)Z\"/>\n\t\t<method name=\"glIsSync(J)Z\"/>\n\t\t<method name=\"glIsTransformFeedback(I)Z\"/>\n\t\t<method name=\"glIsVertexArray(I)Z\"/>\n\t\t<method name=\"glMapBufferRange(IIII)Ljava/nio/Buffer;\"/>\n\t\t<method name=\"glPauseTransformFeedback()V\"/>\n\t\t<method name=\"glProgramBinary(IILjava/nio/Buffer;I)V\"/>\n\t\t<method name=\"glProgramParameteri(III)V\"/>\n\t\t<method name=\"glReadBuffer(I)V\"/>\n\t\t<method name=\"glReadPixels(IIIIIII)V\" since=\"24\"/>\n\t\t<method name=\"glRenderbufferStorageMultisample(IIIII)V\"/>\n\t\t<method name=\"glResumeTransformFeedback()V\"/>\n\t\t<method name=\"glSamplerParameterf(IIF)V\"/>\n\t\t<method name=\"glSamplerParameterfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glSamplerParameterfv(II[FI)V\"/>\n\t\t<method name=\"glSamplerParameteri(III)V\"/>\n\t\t<method name=\"glSamplerParameteriv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glSamplerParameteriv(II[II)V\"/>\n\t\t<method name=\"glTexImage3D(IIIIIIIIII)V\"/>\n\t\t<method name=\"glTexImage3D(IIIIIIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glTexStorage2D(IIIII)V\"/>\n\t\t<method name=\"glTexStorage3D(IIIIII)V\"/>\n\t\t<method name=\"glTexSubImage3D(IIIIIIIIIII)V\"/>\n\t\t<method name=\"glTexSubImage3D(IIIIIIIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glTransformFeedbackVaryings(I[Ljava/lang/String;I)V\"/>\n\t\t<method name=\"glUniform1ui(II)V\"/>\n\t\t<method name=\"glUniform1uiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glUniform1uiv(II[II)V\"/>\n\t\t<method name=\"glUniform2ui(III)V\"/>\n\t\t<method name=\"glUniform2uiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glUniform2uiv(II[II)V\"/>\n\t\t<method name=\"glUniform3ui(IIII)V\"/>\n\t\t<method name=\"glUniform3uiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glUniform3uiv(II[II)V\"/>\n\t\t<method name=\"glUniform4ui(IIIII)V\"/>\n\t\t<method name=\"glUniform4uiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glUniform4uiv(II[II)V\"/>\n\t\t<method name=\"glUniformBlockBinding(III)V\"/>\n\t\t<method name=\"glUniformMatrix2x3fv(IIZLjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glUniformMatrix2x3fv(IIZ[FI)V\"/>\n\t\t<method name=\"glUniformMatrix2x4fv(IIZLjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glUniformMatrix2x4fv(IIZ[FI)V\"/>\n\t\t<method name=\"glUniformMatrix3x2fv(IIZLjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glUniformMatrix3x2fv(IIZ[FI)V\"/>\n\t\t<method name=\"glUniformMatrix3x4fv(IIZLjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glUniformMatrix3x4fv(IIZ[FI)V\"/>\n\t\t<method name=\"glUniformMatrix4x2fv(IIZLjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glUniformMatrix4x2fv(IIZ[FI)V\"/>\n\t\t<method name=\"glUniformMatrix4x3fv(IIZLjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glUniformMatrix4x3fv(IIZ[FI)V\"/>\n\t\t<method name=\"glUnmapBuffer(I)Z\"/>\n\t\t<method name=\"glVertexAttribDivisor(II)V\"/>\n\t\t<method name=\"glVertexAttribI4i(IIIII)V\"/>\n\t\t<method name=\"glVertexAttribI4iv(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glVertexAttribI4iv(I[II)V\"/>\n\t\t<method name=\"glVertexAttribI4ui(IIIII)V\"/>\n\t\t<method name=\"glVertexAttribI4uiv(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glVertexAttribI4uiv(I[II)V\"/>\n\t\t<method name=\"glVertexAttribIPointer(IIIII)V\"/>\n\t\t<method name=\"glVertexAttribIPointer(IIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glWaitSync(JIJ)V\"/>\n\t\t<field name=\"GL_ACTIVE_UNIFORM_BLOCKS\"/>\n\t\t<field name=\"GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH\"/>\n\t\t<field name=\"GL_ALREADY_SIGNALED\"/>\n\t\t<field name=\"GL_ANY_SAMPLES_PASSED\"/>\n\t\t<field name=\"GL_ANY_SAMPLES_PASSED_CONSERVATIVE\"/>\n\t\t<field name=\"GL_BLUE\"/>\n\t\t<field name=\"GL_BUFFER_ACCESS_FLAGS\"/>\n\t\t<field name=\"GL_BUFFER_MAPPED\"/>\n\t\t<field name=\"GL_BUFFER_MAP_LENGTH\"/>\n\t\t<field name=\"GL_BUFFER_MAP_OFFSET\"/>\n\t\t<field name=\"GL_BUFFER_MAP_POINTER\"/>\n\t\t<field name=\"GL_COLOR\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT1\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT10\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT11\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT12\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT13\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT14\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT15\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT2\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT3\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT4\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT5\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT6\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT7\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT8\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT9\"/>\n\t\t<field name=\"GL_COMPARE_REF_TO_TEXTURE\"/>\n\t\t<field name=\"GL_COMPRESSED_R11_EAC\"/>\n\t\t<field name=\"GL_COMPRESSED_RG11_EAC\"/>\n\t\t<field name=\"GL_COMPRESSED_RGB8_ETC2\"/>\n\t\t<field name=\"GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA8_ETC2_EAC\"/>\n\t\t<field name=\"GL_COMPRESSED_SIGNED_R11_EAC\"/>\n\t\t<field name=\"GL_COMPRESSED_SIGNED_RG11_EAC\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ETC2\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2\"/>\n\t\t<field name=\"GL_CONDITION_SATISFIED\"/>\n\t\t<field name=\"GL_COPY_READ_BUFFER\"/>\n\t\t<field name=\"GL_COPY_READ_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_COPY_WRITE_BUFFER\"/>\n\t\t<field name=\"GL_COPY_WRITE_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_CURRENT_QUERY\"/>\n\t\t<field name=\"GL_DEPTH\"/>\n\t\t<field name=\"GL_DEPTH24_STENCIL8\"/>\n\t\t<field name=\"GL_DEPTH32F_STENCIL8\"/>\n\t\t<field name=\"GL_DEPTH_COMPONENT24\"/>\n\t\t<field name=\"GL_DEPTH_COMPONENT32F\"/>\n\t\t<field name=\"GL_DEPTH_STENCIL\"/>\n\t\t<field name=\"GL_DEPTH_STENCIL_ATTACHMENT\"/>\n\t\t<field name=\"GL_DRAW_BUFFER0\"/>\n\t\t<field name=\"GL_DRAW_BUFFER1\"/>\n\t\t<field name=\"GL_DRAW_BUFFER10\"/>\n\t\t<field name=\"GL_DRAW_BUFFER11\"/>\n\t\t<field name=\"GL_DRAW_BUFFER12\"/>\n\t\t<field name=\"GL_DRAW_BUFFER13\"/>\n\t\t<field name=\"GL_DRAW_BUFFER14\"/>\n\t\t<field name=\"GL_DRAW_BUFFER15\"/>\n\t\t<field name=\"GL_DRAW_BUFFER2\"/>\n\t\t<field name=\"GL_DRAW_BUFFER3\"/>\n\t\t<field name=\"GL_DRAW_BUFFER4\"/>\n\t\t<field name=\"GL_DRAW_BUFFER5\"/>\n\t\t<field name=\"GL_DRAW_BUFFER6\"/>\n\t\t<field name=\"GL_DRAW_BUFFER7\"/>\n\t\t<field name=\"GL_DRAW_BUFFER8\"/>\n\t\t<field name=\"GL_DRAW_BUFFER9\"/>\n\t\t<field name=\"GL_DRAW_FRAMEBUFFER\"/>\n\t\t<field name=\"GL_DRAW_FRAMEBUFFER_BINDING\"/>\n\t\t<field name=\"GL_DYNAMIC_COPY\"/>\n\t\t<field name=\"GL_DYNAMIC_READ\"/>\n\t\t<field name=\"GL_FLOAT_32_UNSIGNED_INT_24_8_REV\"/>\n\t\t<field name=\"GL_FLOAT_MAT2x3\"/>\n\t\t<field name=\"GL_FLOAT_MAT2x4\"/>\n\t\t<field name=\"GL_FLOAT_MAT3x2\"/>\n\t\t<field name=\"GL_FLOAT_MAT3x4\"/>\n\t\t<field name=\"GL_FLOAT_MAT4x2\"/>\n\t\t<field name=\"GL_FLOAT_MAT4x3\"/>\n\t\t<field name=\"GL_FRAGMENT_SHADER_DERIVATIVE_HINT\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_DEFAULT\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_UNDEFINED\"/>\n\t\t<field name=\"GL_GREEN\"/>\n\t\t<field name=\"GL_HALF_FLOAT\"/>\n\t\t<field name=\"GL_INTERLEAVED_ATTRIBS\"/>\n\t\t<field name=\"GL_INT_2_10_10_10_REV\"/>\n\t\t<field name=\"GL_INT_SAMPLER_2D\"/>\n\t\t<field name=\"GL_INT_SAMPLER_2D_ARRAY\"/>\n\t\t<field name=\"GL_INT_SAMPLER_3D\"/>\n\t\t<field name=\"GL_INT_SAMPLER_CUBE\"/>\n\t\t<field name=\"GL_INVALID_INDEX\"/>\n\t\t<field name=\"GL_MAJOR_VERSION\"/>\n\t\t<field name=\"GL_MAP_FLUSH_EXPLICIT_BIT\"/>\n\t\t<field name=\"GL_MAP_INVALIDATE_BUFFER_BIT\"/>\n\t\t<field name=\"GL_MAP_INVALIDATE_RANGE_BIT\"/>\n\t\t<field name=\"GL_MAP_READ_BIT\"/>\n\t\t<field name=\"GL_MAP_UNSYNCHRONIZED_BIT\"/>\n\t\t<field name=\"GL_MAP_WRITE_BIT\"/>\n\t\t<field name=\"GL_MAX\"/>\n\t\t<field name=\"GL_MAX_3D_TEXTURE_SIZE\"/>\n\t\t<field name=\"GL_MAX_ARRAY_TEXTURE_LAYERS\"/>\n\t\t<field name=\"GL_MAX_COLOR_ATTACHMENTS\"/>\n\t\t<field name=\"GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_COMBINED_UNIFORM_BLOCKS\"/>\n\t\t<field name=\"GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_DRAW_BUFFERS\"/>\n\t\t<field name=\"GL_MAX_ELEMENTS_INDICES\"/>\n\t\t<field name=\"GL_MAX_ELEMENTS_VERTICES\"/>\n\t\t<field name=\"GL_MAX_ELEMENT_INDEX\"/>\n\t\t<field name=\"GL_MAX_FRAGMENT_INPUT_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_FRAGMENT_UNIFORM_BLOCKS\"/>\n\t\t<field name=\"GL_MAX_FRAGMENT_UNIFORM_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_PROGRAM_TEXEL_OFFSET\"/>\n\t\t<field name=\"GL_MAX_SAMPLES\"/>\n\t\t<field name=\"GL_MAX_SERVER_WAIT_TIMEOUT\"/>\n\t\t<field name=\"GL_MAX_TEXTURE_LOD_BIAS\"/>\n\t\t<field name=\"GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS\"/>\n\t\t<field name=\"GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_UNIFORM_BLOCK_SIZE\"/>\n\t\t<field name=\"GL_MAX_UNIFORM_BUFFER_BINDINGS\"/>\n\t\t<field name=\"GL_MAX_VARYING_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_VERTEX_OUTPUT_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_VERTEX_UNIFORM_BLOCKS\"/>\n\t\t<field name=\"GL_MAX_VERTEX_UNIFORM_COMPONENTS\"/>\n\t\t<field name=\"GL_MIN\"/>\n\t\t<field name=\"GL_MINOR_VERSION\"/>\n\t\t<field name=\"GL_MIN_PROGRAM_TEXEL_OFFSET\"/>\n\t\t<field name=\"GL_NUM_EXTENSIONS\"/>\n\t\t<field name=\"GL_NUM_PROGRAM_BINARY_FORMATS\"/>\n\t\t<field name=\"GL_NUM_SAMPLE_COUNTS\"/>\n\t\t<field name=\"GL_OBJECT_TYPE\"/>\n\t\t<field name=\"GL_PACK_ROW_LENGTH\"/>\n\t\t<field name=\"GL_PACK_SKIP_PIXELS\"/>\n\t\t<field name=\"GL_PACK_SKIP_ROWS\"/>\n\t\t<field name=\"GL_PIXEL_PACK_BUFFER\"/>\n\t\t<field name=\"GL_PIXEL_PACK_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_PIXEL_UNPACK_BUFFER\"/>\n\t\t<field name=\"GL_PIXEL_UNPACK_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_PRIMITIVE_RESTART_FIXED_INDEX\"/>\n\t\t<field name=\"GL_PROGRAM_BINARY_FORMATS\"/>\n\t\t<field name=\"GL_PROGRAM_BINARY_LENGTH\"/>\n\t\t<field name=\"GL_PROGRAM_BINARY_RETRIEVABLE_HINT\"/>\n\t\t<field name=\"GL_QUERY_RESULT\"/>\n\t\t<field name=\"GL_QUERY_RESULT_AVAILABLE\"/>\n\t\t<field name=\"GL_R11F_G11F_B10F\"/>\n\t\t<field name=\"GL_R16F\"/>\n\t\t<field name=\"GL_R16I\"/>\n\t\t<field name=\"GL_R16UI\"/>\n\t\t<field name=\"GL_R32F\"/>\n\t\t<field name=\"GL_R32I\"/>\n\t\t<field name=\"GL_R32UI\"/>\n\t\t<field name=\"GL_R8\"/>\n\t\t<field name=\"GL_R8I\"/>\n\t\t<field name=\"GL_R8UI\"/>\n\t\t<field name=\"GL_R8_SNORM\"/>\n\t\t<field name=\"GL_RASTERIZER_DISCARD\"/>\n\t\t<field name=\"GL_READ_BUFFER\"/>\n\t\t<field name=\"GL_READ_FRAMEBUFFER\"/>\n\t\t<field name=\"GL_READ_FRAMEBUFFER_BINDING\"/>\n\t\t<field name=\"GL_RED\"/>\n\t\t<field name=\"GL_RED_INTEGER\"/>\n\t\t<field name=\"GL_RENDERBUFFER_SAMPLES\"/>\n\t\t<field name=\"GL_RG\"/>\n\t\t<field name=\"GL_RG16F\"/>\n\t\t<field name=\"GL_RG16I\"/>\n\t\t<field name=\"GL_RG16UI\"/>\n\t\t<field name=\"GL_RG32F\"/>\n\t\t<field name=\"GL_RG32I\"/>\n\t\t<field name=\"GL_RG32UI\"/>\n\t\t<field name=\"GL_RG8\"/>\n\t\t<field name=\"GL_RG8I\"/>\n\t\t<field name=\"GL_RG8UI\"/>\n\t\t<field name=\"GL_RG8_SNORM\"/>\n\t\t<field name=\"GL_RGB10_A2\"/>\n\t\t<field name=\"GL_RGB10_A2UI\"/>\n\t\t<field name=\"GL_RGB16F\"/>\n\t\t<field name=\"GL_RGB16I\"/>\n\t\t<field name=\"GL_RGB16UI\"/>\n\t\t<field name=\"GL_RGB32F\"/>\n\t\t<field name=\"GL_RGB32I\"/>\n\t\t<field name=\"GL_RGB32UI\"/>\n\t\t<field name=\"GL_RGB8\"/>\n\t\t<field name=\"GL_RGB8I\"/>\n\t\t<field name=\"GL_RGB8UI\"/>\n\t\t<field name=\"GL_RGB8_SNORM\"/>\n\t\t<field name=\"GL_RGB9_E5\"/>\n\t\t<field name=\"GL_RGBA16F\"/>\n\t\t<field name=\"GL_RGBA16I\"/>\n\t\t<field name=\"GL_RGBA16UI\"/>\n\t\t<field name=\"GL_RGBA32F\"/>\n\t\t<field name=\"GL_RGBA32I\"/>\n\t\t<field name=\"GL_RGBA32UI\"/>\n\t\t<field name=\"GL_RGBA8\"/>\n\t\t<field name=\"GL_RGBA8I\"/>\n\t\t<field name=\"GL_RGBA8UI\"/>\n\t\t<field name=\"GL_RGBA8_SNORM\"/>\n\t\t<field name=\"GL_RGBA_INTEGER\"/>\n\t\t<field name=\"GL_RGB_INTEGER\"/>\n\t\t<field name=\"GL_RG_INTEGER\"/>\n\t\t<field name=\"GL_SAMPLER_2D_ARRAY\"/>\n\t\t<field name=\"GL_SAMPLER_2D_ARRAY_SHADOW\"/>\n\t\t<field name=\"GL_SAMPLER_2D_SHADOW\"/>\n\t\t<field name=\"GL_SAMPLER_3D\"/>\n\t\t<field name=\"GL_SAMPLER_BINDING\"/>\n\t\t<field name=\"GL_SAMPLER_CUBE_SHADOW\"/>\n\t\t<field name=\"GL_SEPARATE_ATTRIBS\"/>\n\t\t<field name=\"GL_SIGNALED\"/>\n\t\t<field name=\"GL_SIGNED_NORMALIZED\"/>\n\t\t<field name=\"GL_SRGB\"/>\n\t\t<field name=\"GL_SRGB8\"/>\n\t\t<field name=\"GL_SRGB8_ALPHA8\"/>\n\t\t<field name=\"GL_STATIC_COPY\"/>\n\t\t<field name=\"GL_STATIC_READ\"/>\n\t\t<field name=\"GL_STENCIL\"/>\n\t\t<field name=\"GL_STREAM_COPY\"/>\n\t\t<field name=\"GL_STREAM_READ\"/>\n\t\t<field name=\"GL_SYNC_CONDITION\"/>\n\t\t<field name=\"GL_SYNC_FENCE\"/>\n\t\t<field name=\"GL_SYNC_FLAGS\"/>\n\t\t<field name=\"GL_SYNC_FLUSH_COMMANDS_BIT\"/>\n\t\t<field name=\"GL_SYNC_GPU_COMMANDS_COMPLETE\"/>\n\t\t<field name=\"GL_SYNC_STATUS\"/>\n\t\t<field name=\"GL_TEXTURE_2D_ARRAY\"/>\n\t\t<field name=\"GL_TEXTURE_3D\"/>\n\t\t<field name=\"GL_TEXTURE_BASE_LEVEL\"/>\n\t\t<field name=\"GL_TEXTURE_BINDING_2D_ARRAY\"/>\n\t\t<field name=\"GL_TEXTURE_BINDING_3D\"/>\n\t\t<field name=\"GL_TEXTURE_COMPARE_FUNC\"/>\n\t\t<field name=\"GL_TEXTURE_COMPARE_MODE\"/>\n\t\t<field name=\"GL_TEXTURE_IMMUTABLE_FORMAT\"/>\n\t\t<field name=\"GL_TEXTURE_IMMUTABLE_LEVELS\"/>\n\t\t<field name=\"GL_TEXTURE_MAX_LEVEL\"/>\n\t\t<field name=\"GL_TEXTURE_MAX_LOD\"/>\n\t\t<field name=\"GL_TEXTURE_MIN_LOD\"/>\n\t\t<field name=\"GL_TEXTURE_SWIZZLE_A\"/>\n\t\t<field name=\"GL_TEXTURE_SWIZZLE_B\"/>\n\t\t<field name=\"GL_TEXTURE_SWIZZLE_G\"/>\n\t\t<field name=\"GL_TEXTURE_SWIZZLE_R\"/>\n\t\t<field name=\"GL_TEXTURE_WRAP_R\"/>\n\t\t<field name=\"GL_TIMEOUT_EXPIRED\"/>\n\t\t<field name=\"GL_TIMEOUT_IGNORED\"/>\n\t\t<field name=\"GL_TRANSFORM_FEEDBACK\"/>\n\t\t<field name=\"GL_TRANSFORM_FEEDBACK_ACTIVE\"/>\n\t\t<field name=\"GL_TRANSFORM_FEEDBACK_BINDING\"/>\n\t\t<field name=\"GL_TRANSFORM_FEEDBACK_BUFFER\"/>\n\t\t<field name=\"GL_TRANSFORM_FEEDBACK_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_TRANSFORM_FEEDBACK_BUFFER_MODE\"/>\n\t\t<field name=\"GL_TRANSFORM_FEEDBACK_BUFFER_SIZE\"/>\n\t\t<field name=\"GL_TRANSFORM_FEEDBACK_BUFFER_START\"/>\n\t\t<field name=\"GL_TRANSFORM_FEEDBACK_PAUSED\"/>\n\t\t<field name=\"GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN\"/>\n\t\t<field name=\"GL_TRANSFORM_FEEDBACK_VARYINGS\"/>\n\t\t<field name=\"GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH\"/>\n\t\t<field name=\"GL_UNIFORM_ARRAY_STRIDE\"/>\n\t\t<field name=\"GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS\"/>\n\t\t<field name=\"GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES\"/>\n\t\t<field name=\"GL_UNIFORM_BLOCK_BINDING\"/>\n\t\t<field name=\"GL_UNIFORM_BLOCK_DATA_SIZE\"/>\n\t\t<field name=\"GL_UNIFORM_BLOCK_INDEX\"/>\n\t\t<field name=\"GL_UNIFORM_BLOCK_NAME_LENGTH\"/>\n\t\t<field name=\"GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER\"/>\n\t\t<field name=\"GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER\"/>\n\t\t<field name=\"GL_UNIFORM_BUFFER\"/>\n\t\t<field name=\"GL_UNIFORM_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT\"/>\n\t\t<field name=\"GL_UNIFORM_BUFFER_SIZE\"/>\n\t\t<field name=\"GL_UNIFORM_BUFFER_START\"/>\n\t\t<field name=\"GL_UNIFORM_IS_ROW_MAJOR\"/>\n\t\t<field name=\"GL_UNIFORM_MATRIX_STRIDE\"/>\n\t\t<field name=\"GL_UNIFORM_NAME_LENGTH\"/>\n\t\t<field name=\"GL_UNIFORM_OFFSET\"/>\n\t\t<field name=\"GL_UNIFORM_SIZE\"/>\n\t\t<field name=\"GL_UNIFORM_TYPE\"/>\n\t\t<field name=\"GL_UNPACK_IMAGE_HEIGHT\"/>\n\t\t<field name=\"GL_UNPACK_ROW_LENGTH\"/>\n\t\t<field name=\"GL_UNPACK_SKIP_IMAGES\"/>\n\t\t<field name=\"GL_UNPACK_SKIP_PIXELS\"/>\n\t\t<field name=\"GL_UNPACK_SKIP_ROWS\"/>\n\t\t<field name=\"GL_UNSIGNALED\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_10F_11F_11F_REV\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_24_8\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_2_10_10_10_REV\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_5_9_9_9_REV\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_SAMPLER_2D\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_SAMPLER_2D_ARRAY\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_SAMPLER_3D\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_SAMPLER_CUBE\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_VEC2\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_VEC3\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_VEC4\"/>\n\t\t<field name=\"GL_UNSIGNED_NORMALIZED\"/>\n\t\t<field name=\"GL_VERTEX_ARRAY_BINDING\"/>\n\t\t<field name=\"GL_VERTEX_ATTRIB_ARRAY_DIVISOR\"/>\n\t\t<field name=\"GL_VERTEX_ATTRIB_ARRAY_INTEGER\"/>\n\t\t<field name=\"GL_WAIT_FAILED\"/>\n\t</class>\n\t<class name=\"android/opengl/GLES31\" since=\"21\">\n\t\t<extends name=\"android/opengl/GLES30\"/>\n\t\t<method name=\"glActiveShaderProgram(II)V\"/>\n\t\t<method name=\"glBindImageTexture(IIIZIII)V\"/>\n\t\t<method name=\"glBindProgramPipeline(I)V\"/>\n\t\t<method name=\"glBindVertexBuffer(IIJI)V\"/>\n\t\t<method name=\"glCreateShaderProgramv(I[Ljava/lang/String;)I\"/>\n\t\t<method name=\"glDeleteProgramPipelines(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDeleteProgramPipelines(I[II)V\"/>\n\t\t<method name=\"glDispatchCompute(III)V\"/>\n\t\t<method name=\"glDispatchComputeIndirect(J)V\"/>\n\t\t<method name=\"glDrawArraysIndirect(IJ)V\"/>\n\t\t<method name=\"glDrawElementsIndirect(IIJ)V\"/>\n\t\t<method name=\"glFramebufferParameteri(III)V\"/>\n\t\t<method name=\"glGenProgramPipelines(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGenProgramPipelines(I[II)V\"/>\n\t\t<method name=\"glGetBooleani_v(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetBooleani_v(II[ZI)V\"/>\n\t\t<method name=\"glGetFramebufferParameteriv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetFramebufferParameteriv(II[II)V\"/>\n\t\t<method name=\"glGetMultisamplefv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetMultisamplefv(II[FI)V\"/>\n\t\t<method name=\"glGetProgramInterfaceiv(IIILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetProgramInterfaceiv(III[II)V\"/>\n\t\t<method name=\"glGetProgramPipelineInfoLog(I)Ljava/lang/String;\"/>\n\t\t<method name=\"glGetProgramPipelineiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetProgramPipelineiv(II[II)V\"/>\n\t\t<method name=\"glGetProgramResourceIndex(IILjava/lang/String;)I\"/>\n\t\t<method name=\"glGetProgramResourceLocation(IILjava/lang/String;)I\"/>\n\t\t<method name=\"glGetProgramResourceName(III)Ljava/lang/String;\"/>\n\t\t<method name=\"glGetProgramResourceiv(IIIILjava/nio/IntBuffer;ILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetProgramResourceiv(IIII[III[II[II)V\"/>\n\t\t<method name=\"glGetTexLevelParameterfv(IIILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetTexLevelParameterfv(III[FI)V\"/>\n\t\t<method name=\"glGetTexLevelParameteriv(IIILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetTexLevelParameteriv(III[II)V\"/>\n\t\t<method name=\"glIsProgramPipeline(I)Z\"/>\n\t\t<method name=\"glMemoryBarrier(I)V\"/>\n\t\t<method name=\"glMemoryBarrierByRegion(I)V\"/>\n\t\t<method name=\"glProgramUniform1f(IIF)V\"/>\n\t\t<method name=\"glProgramUniform1fv(IIILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glProgramUniform1fv(III[FI)V\"/>\n\t\t<method name=\"glProgramUniform1i(III)V\"/>\n\t\t<method name=\"glProgramUniform1iv(IIILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glProgramUniform1iv(III[II)V\"/>\n\t\t<method name=\"glProgramUniform1ui(III)V\"/>\n\t\t<method name=\"glProgramUniform1uiv(IIILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glProgramUniform1uiv(III[II)V\"/>\n\t\t<method name=\"glProgramUniform2f(IIFF)V\"/>\n\t\t<method name=\"glProgramUniform2fv(IIILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glProgramUniform2fv(III[FI)V\"/>\n\t\t<method name=\"glProgramUniform2i(IIII)V\"/>\n\t\t<method name=\"glProgramUniform2iv(IIILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glProgramUniform2iv(III[II)V\"/>\n\t\t<method name=\"glProgramUniform2ui(IIII)V\"/>\n\t\t<method name=\"glProgramUniform2uiv(IIILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glProgramUniform2uiv(III[II)V\"/>\n\t\t<method name=\"glProgramUniform3f(IIFFF)V\"/>\n\t\t<method name=\"glProgramUniform3fv(IIILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glProgramUniform3fv(III[FI)V\"/>\n\t\t<method name=\"glProgramUniform3i(IIIII)V\"/>\n\t\t<method name=\"glProgramUniform3iv(IIILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glProgramUniform3iv(III[II)V\"/>\n\t\t<method name=\"glProgramUniform3ui(IIIII)V\"/>\n\t\t<method name=\"glProgramUniform3uiv(IIILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glProgramUniform3uiv(III[II)V\"/>\n\t\t<method name=\"glProgramUniform4f(IIFFFF)V\"/>\n\t\t<method name=\"glProgramUniform4fv(IIILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glProgramUniform4fv(III[FI)V\"/>\n\t\t<method name=\"glProgramUniform4i(IIIIII)V\"/>\n\t\t<method name=\"glProgramUniform4iv(IIILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glProgramUniform4iv(III[II)V\"/>\n\t\t<method name=\"glProgramUniform4ui(IIIIII)V\"/>\n\t\t<method name=\"glProgramUniform4uiv(IIILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glProgramUniform4uiv(III[II)V\"/>\n\t\t<method name=\"glProgramUniformMatrix2fv(IIIZLjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glProgramUniformMatrix2fv(IIIZ[FI)V\"/>\n\t\t<method name=\"glProgramUniformMatrix2x3fv(IIIZLjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glProgramUniformMatrix2x3fv(IIIZ[FI)V\"/>\n\t\t<method name=\"glProgramUniformMatrix2x4fv(IIIZLjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glProgramUniformMatrix2x4fv(IIIZ[FI)V\"/>\n\t\t<method name=\"glProgramUniformMatrix3fv(IIIZLjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glProgramUniformMatrix3fv(IIIZ[FI)V\"/>\n\t\t<method name=\"glProgramUniformMatrix3x2fv(IIIZLjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glProgramUniformMatrix3x2fv(IIIZ[FI)V\"/>\n\t\t<method name=\"glProgramUniformMatrix3x4fv(IIIZLjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glProgramUniformMatrix3x4fv(IIIZ[FI)V\"/>\n\t\t<method name=\"glProgramUniformMatrix4fv(IIIZLjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glProgramUniformMatrix4fv(IIIZ[FI)V\"/>\n\t\t<method name=\"glProgramUniformMatrix4x2fv(IIIZLjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glProgramUniformMatrix4x2fv(IIIZ[FI)V\"/>\n\t\t<method name=\"glProgramUniformMatrix4x3fv(IIIZLjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glProgramUniformMatrix4x3fv(IIIZ[FI)V\"/>\n\t\t<method name=\"glSampleMaski(II)V\"/>\n\t\t<method name=\"glTexStorage2DMultisample(IIIIIZ)V\"/>\n\t\t<method name=\"glUseProgramStages(III)V\"/>\n\t\t<method name=\"glValidateProgramPipeline(I)V\"/>\n\t\t<method name=\"glVertexAttribBinding(II)V\"/>\n\t\t<method name=\"glVertexAttribFormat(IIIZI)V\"/>\n\t\t<method name=\"glVertexAttribIFormat(IIII)V\"/>\n\t\t<method name=\"glVertexBindingDivisor(II)V\"/>\n\t\t<field name=\"GL_ACTIVE_ATOMIC_COUNTER_BUFFERS\"/>\n\t\t<field name=\"GL_ACTIVE_PROGRAM\"/>\n\t\t<field name=\"GL_ACTIVE_RESOURCES\"/>\n\t\t<field name=\"GL_ACTIVE_VARIABLES\"/>\n\t\t<field name=\"GL_ALL_BARRIER_BITS\" since=\"24\"/>\n\t\t<field name=\"GL_ALL_SHADER_BITS\"/>\n\t\t<field name=\"GL_ARRAY_SIZE\"/>\n\t\t<field name=\"GL_ARRAY_STRIDE\"/>\n\t\t<field name=\"GL_ATOMIC_COUNTER_BARRIER_BIT\"/>\n\t\t<field name=\"GL_ATOMIC_COUNTER_BUFFER\"/>\n\t\t<field name=\"GL_ATOMIC_COUNTER_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_ATOMIC_COUNTER_BUFFER_INDEX\"/>\n\t\t<field name=\"GL_ATOMIC_COUNTER_BUFFER_SIZE\"/>\n\t\t<field name=\"GL_ATOMIC_COUNTER_BUFFER_START\"/>\n\t\t<field name=\"GL_BLOCK_INDEX\"/>\n\t\t<field name=\"GL_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_BUFFER_DATA_SIZE\"/>\n\t\t<field name=\"GL_BUFFER_UPDATE_BARRIER_BIT\"/>\n\t\t<field name=\"GL_BUFFER_VARIABLE\"/>\n\t\t<field name=\"GL_COMMAND_BARRIER_BIT\"/>\n\t\t<field name=\"GL_COMPUTE_SHADER\"/>\n\t\t<field name=\"GL_COMPUTE_SHADER_BIT\"/>\n\t\t<field name=\"GL_COMPUTE_WORK_GROUP_SIZE\"/>\n\t\t<field name=\"GL_DEPTH_STENCIL_TEXTURE_MODE\"/>\n\t\t<field name=\"GL_DISPATCH_INDIRECT_BUFFER\"/>\n\t\t<field name=\"GL_DISPATCH_INDIRECT_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_DRAW_INDIRECT_BUFFER\"/>\n\t\t<field name=\"GL_DRAW_INDIRECT_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_ELEMENT_ARRAY_BARRIER_BIT\" since=\"24\"/>\n\t\t<field name=\"GL_FRAGMENT_SHADER_BIT\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_BARRIER_BIT\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_DEFAULT_HEIGHT\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_DEFAULT_SAMPLES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_DEFAULT_WIDTH\"/>\n\t\t<field name=\"GL_IMAGE_2D\"/>\n\t\t<field name=\"GL_IMAGE_2D_ARRAY\"/>\n\t\t<field name=\"GL_IMAGE_3D\"/>\n\t\t<field name=\"GL_IMAGE_BINDING_ACCESS\"/>\n\t\t<field name=\"GL_IMAGE_BINDING_FORMAT\"/>\n\t\t<field name=\"GL_IMAGE_BINDING_LAYER\"/>\n\t\t<field name=\"GL_IMAGE_BINDING_LAYERED\"/>\n\t\t<field name=\"GL_IMAGE_BINDING_LEVEL\"/>\n\t\t<field name=\"GL_IMAGE_BINDING_NAME\"/>\n\t\t<field name=\"GL_IMAGE_CUBE\"/>\n\t\t<field name=\"GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS\"/>\n\t\t<field name=\"GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE\"/>\n\t\t<field name=\"GL_IMAGE_FORMAT_COMPATIBILITY_TYPE\"/>\n\t\t<field name=\"GL_INT_IMAGE_2D\"/>\n\t\t<field name=\"GL_INT_IMAGE_2D_ARRAY\"/>\n\t\t<field name=\"GL_INT_IMAGE_3D\"/>\n\t\t<field name=\"GL_INT_IMAGE_CUBE\"/>\n\t\t<field name=\"GL_INT_SAMPLER_2D_MULTISAMPLE\"/>\n\t\t<field name=\"GL_IS_ROW_MAJOR\"/>\n\t\t<field name=\"GL_LOCATION\"/>\n\t\t<field name=\"GL_MATRIX_STRIDE\"/>\n\t\t<field name=\"GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS\"/>\n\t\t<field name=\"GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE\"/>\n\t\t<field name=\"GL_MAX_COLOR_TEXTURE_SAMPLES\"/>\n\t\t<field name=\"GL_MAX_COMBINED_ATOMIC_COUNTERS\"/>\n\t\t<field name=\"GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS\"/>\n\t\t<field name=\"GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_COMBINED_IMAGE_UNIFORMS\"/>\n\t\t<field name=\"GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES\"/>\n\t\t<field name=\"GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS\"/>\n\t\t<field name=\"GL_MAX_COMPUTE_ATOMIC_COUNTERS\"/>\n\t\t<field name=\"GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS\"/>\n\t\t<field name=\"GL_MAX_COMPUTE_IMAGE_UNIFORMS\"/>\n\t\t<field name=\"GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS\"/>\n\t\t<field name=\"GL_MAX_COMPUTE_SHARED_MEMORY_SIZE\"/>\n\t\t<field name=\"GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS\"/>\n\t\t<field name=\"GL_MAX_COMPUTE_UNIFORM_BLOCKS\"/>\n\t\t<field name=\"GL_MAX_COMPUTE_UNIFORM_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_COMPUTE_WORK_GROUP_COUNT\"/>\n\t\t<field name=\"GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS\"/>\n\t\t<field name=\"GL_MAX_COMPUTE_WORK_GROUP_SIZE\"/>\n\t\t<field name=\"GL_MAX_DEPTH_TEXTURE_SAMPLES\"/>\n\t\t<field name=\"GL_MAX_FRAGMENT_ATOMIC_COUNTERS\"/>\n\t\t<field name=\"GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS\"/>\n\t\t<field name=\"GL_MAX_FRAGMENT_IMAGE_UNIFORMS\"/>\n\t\t<field name=\"GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS\"/>\n\t\t<field name=\"GL_MAX_FRAMEBUFFER_HEIGHT\"/>\n\t\t<field name=\"GL_MAX_FRAMEBUFFER_SAMPLES\"/>\n\t\t<field name=\"GL_MAX_FRAMEBUFFER_WIDTH\"/>\n\t\t<field name=\"GL_MAX_IMAGE_UNITS\"/>\n\t\t<field name=\"GL_MAX_INTEGER_SAMPLES\"/>\n\t\t<field name=\"GL_MAX_NAME_LENGTH\"/>\n\t\t<field name=\"GL_MAX_NUM_ACTIVE_VARIABLES\"/>\n\t\t<field name=\"GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET\"/>\n\t\t<field name=\"GL_MAX_SAMPLE_MASK_WORDS\"/>\n\t\t<field name=\"GL_MAX_SHADER_STORAGE_BLOCK_SIZE\"/>\n\t\t<field name=\"GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS\"/>\n\t\t<field name=\"GL_MAX_UNIFORM_LOCATIONS\"/>\n\t\t<field name=\"GL_MAX_VERTEX_ATOMIC_COUNTERS\"/>\n\t\t<field name=\"GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS\"/>\n\t\t<field name=\"GL_MAX_VERTEX_ATTRIB_BINDINGS\"/>\n\t\t<field name=\"GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET\"/>\n\t\t<field name=\"GL_MAX_VERTEX_ATTRIB_STRIDE\"/>\n\t\t<field name=\"GL_MAX_VERTEX_IMAGE_UNIFORMS\"/>\n\t\t<field name=\"GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS\"/>\n\t\t<field name=\"GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET\"/>\n\t\t<field name=\"GL_NAME_LENGTH\"/>\n\t\t<field name=\"GL_NUM_ACTIVE_VARIABLES\"/>\n\t\t<field name=\"GL_OFFSET\"/>\n\t\t<field name=\"GL_PIXEL_BUFFER_BARRIER_BIT\"/>\n\t\t<field name=\"GL_PROGRAM_INPUT\"/>\n\t\t<field name=\"GL_PROGRAM_OUTPUT\"/>\n\t\t<field name=\"GL_PROGRAM_PIPELINE_BINDING\"/>\n\t\t<field name=\"GL_PROGRAM_SEPARABLE\"/>\n\t\t<field name=\"GL_READ_ONLY\"/>\n\t\t<field name=\"GL_READ_WRITE\"/>\n\t\t<field name=\"GL_REFERENCED_BY_COMPUTE_SHADER\"/>\n\t\t<field name=\"GL_REFERENCED_BY_FRAGMENT_SHADER\"/>\n\t\t<field name=\"GL_REFERENCED_BY_VERTEX_SHADER\"/>\n\t\t<field name=\"GL_SAMPLER_2D_MULTISAMPLE\"/>\n\t\t<field name=\"GL_SAMPLE_MASK\"/>\n\t\t<field name=\"GL_SAMPLE_MASK_VALUE\"/>\n\t\t<field name=\"GL_SAMPLE_POSITION\"/>\n\t\t<field name=\"GL_SHADER_IMAGE_ACCESS_BARRIER_BIT\" since=\"24\"/>\n\t\t<field name=\"GL_SHADER_STORAGE_BARRIER_BIT\"/>\n\t\t<field name=\"GL_SHADER_STORAGE_BLOCK\"/>\n\t\t<field name=\"GL_SHADER_STORAGE_BUFFER\"/>\n\t\t<field name=\"GL_SHADER_STORAGE_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT\"/>\n\t\t<field name=\"GL_SHADER_STORAGE_BUFFER_SIZE\"/>\n\t\t<field name=\"GL_SHADER_STORAGE_BUFFER_START\"/>\n\t\t<field name=\"GL_STENCIL_INDEX\"/>\n\t\t<field name=\"GL_TEXTURE_2D_MULTISAMPLE\"/>\n\t\t<field name=\"GL_TEXTURE_ALPHA_SIZE\"/>\n\t\t<field name=\"GL_TEXTURE_ALPHA_TYPE\"/>\n\t\t<field name=\"GL_TEXTURE_BINDING_2D_MULTISAMPLE\"/>\n\t\t<field name=\"GL_TEXTURE_BLUE_SIZE\"/>\n\t\t<field name=\"GL_TEXTURE_BLUE_TYPE\"/>\n\t\t<field name=\"GL_TEXTURE_COMPRESSED\"/>\n\t\t<field name=\"GL_TEXTURE_DEPTH\"/>\n\t\t<field name=\"GL_TEXTURE_DEPTH_SIZE\"/>\n\t\t<field name=\"GL_TEXTURE_DEPTH_TYPE\"/>\n\t\t<field name=\"GL_TEXTURE_FETCH_BARRIER_BIT\"/>\n\t\t<field name=\"GL_TEXTURE_FIXED_SAMPLE_LOCATIONS\"/>\n\t\t<field name=\"GL_TEXTURE_GREEN_SIZE\"/>\n\t\t<field name=\"GL_TEXTURE_GREEN_TYPE\"/>\n\t\t<field name=\"GL_TEXTURE_HEIGHT\"/>\n\t\t<field name=\"GL_TEXTURE_INTERNAL_FORMAT\"/>\n\t\t<field name=\"GL_TEXTURE_RED_SIZE\"/>\n\t\t<field name=\"GL_TEXTURE_RED_TYPE\"/>\n\t\t<field name=\"GL_TEXTURE_SAMPLES\"/>\n\t\t<field name=\"GL_TEXTURE_SHARED_SIZE\"/>\n\t\t<field name=\"GL_TEXTURE_STENCIL_SIZE\"/>\n\t\t<field name=\"GL_TEXTURE_UPDATE_BARRIER_BIT\"/>\n\t\t<field name=\"GL_TEXTURE_WIDTH\"/>\n\t\t<field name=\"GL_TOP_LEVEL_ARRAY_SIZE\"/>\n\t\t<field name=\"GL_TOP_LEVEL_ARRAY_STRIDE\"/>\n\t\t<field name=\"GL_TRANSFORM_FEEDBACK_BARRIER_BIT\"/>\n\t\t<field name=\"GL_TRANSFORM_FEEDBACK_VARYING\"/>\n\t\t<field name=\"GL_TYPE\"/>\n\t\t<field name=\"GL_UNIFORM\"/>\n\t\t<field name=\"GL_UNIFORM_BARRIER_BIT\"/>\n\t\t<field name=\"GL_UNIFORM_BLOCK\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_ATOMIC_COUNTER\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_IMAGE_2D\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_IMAGE_2D_ARRAY\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_IMAGE_3D\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_IMAGE_CUBE\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE\"/>\n\t\t<field name=\"GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT\" since=\"24\"/>\n\t\t<field name=\"GL_VERTEX_ATTRIB_BINDING\"/>\n\t\t<field name=\"GL_VERTEX_ATTRIB_RELATIVE_OFFSET\"/>\n\t\t<field name=\"GL_VERTEX_BINDING_BUFFER\"/>\n\t\t<field name=\"GL_VERTEX_BINDING_DIVISOR\"/>\n\t\t<field name=\"GL_VERTEX_BINDING_OFFSET\"/>\n\t\t<field name=\"GL_VERTEX_BINDING_STRIDE\"/>\n\t\t<field name=\"GL_VERTEX_SHADER_BIT\"/>\n\t\t<field name=\"GL_WRITE_ONLY\"/>\n\t</class>\n\t<class name=\"android/opengl/GLES31Ext\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"glBlendBarrierKHR()V\"/>\n\t\t<method name=\"glBlendEquationSeparateiEXT(III)V\"/>\n\t\t<method name=\"glBlendEquationiEXT(II)V\"/>\n\t\t<method name=\"glBlendFuncSeparateiEXT(IIIII)V\"/>\n\t\t<method name=\"glBlendFunciEXT(III)V\"/>\n\t\t<method name=\"glColorMaskiEXT(IZZZZ)V\"/>\n\t\t<method name=\"glCopyImageSubDataEXT(IIIIIIIIIIIIIII)V\"/>\n\t\t<method name=\"glDebugMessageCallbackKHR(Landroid/opengl/GLES31Ext$DebugProcKHR;)V\"/>\n\t\t<method name=\"glDebugMessageControlKHR(IIIILjava/nio/IntBuffer;Z)V\"/>\n\t\t<method name=\"glDebugMessageControlKHR(IIII[IIZ)V\"/>\n\t\t<method name=\"glDebugMessageInsertKHR(IIIILjava/lang/String;)V\"/>\n\t\t<method name=\"glDisableiEXT(II)V\"/>\n\t\t<method name=\"glEnableiEXT(II)V\"/>\n\t\t<method name=\"glFramebufferTextureEXT(IIII)V\"/>\n\t\t<method name=\"glGetDebugMessageCallbackKHR()Landroid/opengl/GLES31Ext$DebugProcKHR;\"/>\n\t\t<method name=\"glGetDebugMessageLogKHR(II[II[II[II[II[II[BI)I\"/>\n\t\t<method name=\"glGetDebugMessageLogKHR(ILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;)[Ljava/lang/String;\"/>\n\t\t<method name=\"glGetDebugMessageLogKHR(ILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/ByteBuffer;)I\"/>\n\t\t<method name=\"glGetDebugMessageLogKHR(I[II[II[II[II)[Ljava/lang/String;\"/>\n\t\t<method name=\"glGetObjectLabelKHR(II)Ljava/lang/String;\"/>\n\t\t<method name=\"glGetObjectPtrLabelKHR(J)Ljava/lang/String;\"/>\n\t\t<method name=\"glGetSamplerParameterIivEXT(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetSamplerParameterIivEXT(II[II)V\"/>\n\t\t<method name=\"glGetSamplerParameterIuivEXT(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetSamplerParameterIuivEXT(II[II)V\"/>\n\t\t<method name=\"glGetTexParameterIivEXT(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetTexParameterIivEXT(II[II)V\"/>\n\t\t<method name=\"glGetTexParameterIuivEXT(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetTexParameterIuivEXT(II[II)V\"/>\n\t\t<method name=\"glIsEnablediEXT(II)Z\"/>\n\t\t<method name=\"glMinSampleShadingOES(F)V\"/>\n\t\t<method name=\"glObjectLabelKHR(IIILjava/lang/String;)V\"/>\n\t\t<method name=\"glObjectPtrLabelKHR(JLjava/lang/String;)V\"/>\n\t\t<method name=\"glPatchParameteriEXT(II)V\"/>\n\t\t<method name=\"glPopDebugGroupKHR()V\"/>\n\t\t<method name=\"glPrimitiveBoundingBoxEXT(FFFFFFFF)V\"/>\n\t\t<method name=\"glPushDebugGroupKHR(IIILjava/lang/String;)V\"/>\n\t\t<method name=\"glSamplerParameterIivEXT(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glSamplerParameterIivEXT(II[II)V\"/>\n\t\t<method name=\"glSamplerParameterIuivEXT(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glSamplerParameterIuivEXT(II[II)V\"/>\n\t\t<method name=\"glTexBufferEXT(III)V\"/>\n\t\t<method name=\"glTexBufferRangeEXT(IIIII)V\"/>\n\t\t<method name=\"glTexParameterIivEXT(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glTexParameterIivEXT(II[II)V\"/>\n\t\t<method name=\"glTexParameterIuivEXT(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glTexParameterIuivEXT(II[II)V\"/>\n\t\t<method name=\"glTexStorage3DMultisampleOES(IIIIIIZ)V\"/>\n\t\t<field name=\"GL_BLEND_ADVANCED_COHERENT_KHR\"/>\n\t\t<field name=\"GL_BUFFER_KHR\"/>\n\t\t<field name=\"GL_CLAMP_TO_BORDER_EXT\"/>\n\t\t<field name=\"GL_COLORBURN_KHR\"/>\n\t\t<field name=\"GL_COLORDODGE_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_10x10_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_10x5_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_10x6_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_10x8_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_12x10_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_12x12_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_4x4_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_5x4_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_5x5_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_6x5_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_6x6_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_8x5_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_8x6_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_8x8_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR\"/>\n\t\t<field name=\"GL_CONTEXT_FLAG_DEBUG_BIT_KHR\"/>\n\t\t<field name=\"GL_DARKEN_KHR\"/>\n\t\t<field name=\"GL_DEBUG_CALLBACK_FUNCTION_KHR\"/>\n\t\t<field name=\"GL_DEBUG_CALLBACK_USER_PARAM_KHR\"/>\n\t\t<field name=\"GL_DEBUG_GROUP_STACK_DEPTH_KHR\"/>\n\t\t<field name=\"GL_DEBUG_LOGGED_MESSAGES_KHR\"/>\n\t\t<field name=\"GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR\"/>\n\t\t<field name=\"GL_DEBUG_OUTPUT_KHR\"/>\n\t\t<field name=\"GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR\"/>\n\t\t<field name=\"GL_DEBUG_SEVERITY_HIGH_KHR\"/>\n\t\t<field name=\"GL_DEBUG_SEVERITY_LOW_KHR\"/>\n\t\t<field name=\"GL_DEBUG_SEVERITY_MEDIUM_KHR\"/>\n\t\t<field name=\"GL_DEBUG_SEVERITY_NOTIFICATION_KHR\"/>\n\t\t<field name=\"GL_DEBUG_SOURCE_API_KHR\"/>\n\t\t<field name=\"GL_DEBUG_SOURCE_APPLICATION_KHR\"/>\n\t\t<field name=\"GL_DEBUG_SOURCE_OTHER_KHR\"/>\n\t\t<field name=\"GL_DEBUG_SOURCE_SHADER_COMPILER_KHR\"/>\n\t\t<field name=\"GL_DEBUG_SOURCE_THIRD_PARTY_KHR\"/>\n\t\t<field name=\"GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR\"/>\n\t\t<field name=\"GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR\"/>\n\t\t<field name=\"GL_DEBUG_TYPE_ERROR_KHR\"/>\n\t\t<field name=\"GL_DEBUG_TYPE_MARKER_KHR\"/>\n\t\t<field name=\"GL_DEBUG_TYPE_OTHER_KHR\"/>\n\t\t<field name=\"GL_DEBUG_TYPE_PERFORMANCE_KHR\"/>\n\t\t<field name=\"GL_DEBUG_TYPE_POP_GROUP_KHR\"/>\n\t\t<field name=\"GL_DEBUG_TYPE_PORTABILITY_KHR\"/>\n\t\t<field name=\"GL_DEBUG_TYPE_PUSH_GROUP_KHR\"/>\n\t\t<field name=\"GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR\"/>\n\t\t<field name=\"GL_DECODE_EXT\"/>\n\t\t<field name=\"GL_DIFFERENCE_KHR\"/>\n\t\t<field name=\"GL_EXCLUSION_KHR\"/>\n\t\t<field name=\"GL_FIRST_VERTEX_CONVENTION_EXT\"/>\n\t\t<field name=\"GL_FRACTIONAL_EVEN_EXT\"/>\n\t\t<field name=\"GL_FRACTIONAL_ODD_EXT\"/>\n\t\t<field name=\"GL_FRAGMENT_INTERPOLATION_OFFSET_BITS_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT\"/>\n\t\t<field name=\"GL_GEOMETRY_LINKED_INPUT_TYPE_EXT\"/>\n\t\t<field name=\"GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT\"/>\n\t\t<field name=\"GL_GEOMETRY_LINKED_VERTICES_OUT_EXT\"/>\n\t\t<field name=\"GL_GEOMETRY_SHADER_BIT_EXT\"/>\n\t\t<field name=\"GL_GEOMETRY_SHADER_EXT\"/>\n\t\t<field name=\"GL_GEOMETRY_SHADER_INVOCATIONS_EXT\"/>\n\t\t<field name=\"GL_HARDLIGHT_KHR\"/>\n\t\t<field name=\"GL_HSL_COLOR_KHR\"/>\n\t\t<field name=\"GL_HSL_HUE_KHR\"/>\n\t\t<field name=\"GL_HSL_LUMINOSITY_KHR\"/>\n\t\t<field name=\"GL_HSL_SATURATION_KHR\"/>\n\t\t<field name=\"GL_IMAGE_BUFFER_EXT\"/>\n\t\t<field name=\"GL_IMAGE_CUBE_MAP_ARRAY_EXT\"/>\n\t\t<field name=\"GL_INT_IMAGE_BUFFER_EXT\"/>\n\t\t<field name=\"GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT\"/>\n\t\t<field name=\"GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES\"/>\n\t\t<field name=\"GL_INT_SAMPLER_BUFFER_EXT\"/>\n\t\t<field name=\"GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT\"/>\n\t\t<field name=\"GL_ISOLINES_EXT\"/>\n\t\t<field name=\"GL_IS_PER_PATCH_EXT\"/>\n\t\t<field name=\"GL_LAST_VERTEX_CONVENTION_EXT\"/>\n\t\t<field name=\"GL_LAYER_PROVOKING_VERTEX_EXT\"/>\n\t\t<field name=\"GL_LIGHTEN_KHR\"/>\n\t\t<field name=\"GL_LINES_ADJACENCY_EXT\"/>\n\t\t<field name=\"GL_LINE_STRIP_ADJACENCY_EXT\"/>\n\t\t<field name=\"GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT\"/>\n\t\t<field name=\"GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_EXT\"/>\n\t\t<field name=\"GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT\"/>\n\t\t<field name=\"GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR\"/>\n\t\t<field name=\"GL_MAX_DEBUG_LOGGED_MESSAGES_KHR\"/>\n\t\t<field name=\"GL_MAX_DEBUG_MESSAGE_LENGTH_KHR\"/>\n\t\t<field name=\"GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_OES\"/>\n\t\t<field name=\"GL_MAX_FRAMEBUFFER_LAYERS_EXT\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT\"/>\n\t\t<field name=\"GL_MAX_LABEL_LENGTH_KHR\"/>\n\t\t<field name=\"GL_MAX_PATCH_VERTICES_EXT\"/>\n\t\t<field name=\"GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_EXT\"/>\n\t\t<field name=\"GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_EXT\"/>\n\t\t<field name=\"GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_EXT\"/>\n\t\t<field name=\"GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_EXT\"/>\n\t\t<field name=\"GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT\"/>\n\t\t<field name=\"GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_EXT\"/>\n\t\t<field name=\"GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_EXT\"/>\n\t\t<field name=\"GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_EXT\"/>\n\t\t<field name=\"GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_EXT\"/>\n\t\t<field name=\"GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_EXT\"/>\n\t\t<field name=\"GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_EXT\"/>\n\t\t<field name=\"GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_EXT\"/>\n\t\t<field name=\"GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_EXT\"/>\n\t\t<field name=\"GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_EXT\"/>\n\t\t<field name=\"GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_EXT\"/>\n\t\t<field name=\"GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_EXT\"/>\n\t\t<field name=\"GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_EXT\"/>\n\t\t<field name=\"GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_EXT\"/>\n\t\t<field name=\"GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT\"/>\n\t\t<field name=\"GL_MAX_TESS_GEN_LEVEL_EXT\"/>\n\t\t<field name=\"GL_MAX_TESS_PATCH_COMPONENTS_EXT\"/>\n\t\t<field name=\"GL_MAX_TEXTURE_BUFFER_SIZE_EXT\"/>\n\t\t<field name=\"GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_OES\"/>\n\t\t<field name=\"GL_MIN_SAMPLE_SHADING_VALUE_OES\"/>\n\t\t<field name=\"GL_MULTIPLY_KHR\"/>\n\t\t<field name=\"GL_OVERLAY_KHR\"/>\n\t\t<field name=\"GL_PATCHES_EXT\"/>\n\t\t<field name=\"GL_PATCH_VERTICES_EXT\"/>\n\t\t<field name=\"GL_PRIMITIVES_GENERATED_EXT\"/>\n\t\t<field name=\"GL_PRIMITIVE_BOUNDING_BOX_EXT\"/>\n\t\t<field name=\"GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED\"/>\n\t\t<field name=\"GL_PROGRAM_KHR\"/>\n\t\t<field name=\"GL_QUADS_EXT\"/>\n\t\t<field name=\"GL_QUERY_KHR\"/>\n\t\t<field name=\"GL_REFERENCED_BY_GEOMETRY_SHADER_EXT\"/>\n\t\t<field name=\"GL_REFERENCED_BY_TESS_CONTROL_SHADER_EXT\"/>\n\t\t<field name=\"GL_REFERENCED_BY_TESS_EVALUATION_SHADER_EXT\"/>\n\t\t<field name=\"GL_SAMPLER_2D_MULTISAMPLE_ARRAY_OES\"/>\n\t\t<field name=\"GL_SAMPLER_BUFFER_EXT\"/>\n\t\t<field name=\"GL_SAMPLER_CUBE_MAP_ARRAY_EXT\"/>\n\t\t<field name=\"GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT\"/>\n\t\t<field name=\"GL_SAMPLER_KHR\"/>\n\t\t<field name=\"GL_SAMPLE_SHADING_OES\"/>\n\t\t<field name=\"GL_SCREEN_KHR\"/>\n\t\t<field name=\"GL_SHADER_KHR\"/>\n\t\t<field name=\"GL_SKIP_DECODE_EXT\"/>\n\t\t<field name=\"GL_SOFTLIGHT_KHR\"/>\n\t\t<field name=\"GL_STACK_OVERFLOW_KHR\"/>\n\t\t<field name=\"GL_STACK_UNDERFLOW_KHR\"/>\n\t\t<field name=\"GL_STENCIL_INDEX8_OES\"/>\n\t\t<field name=\"GL_STENCIL_INDEX_OES\"/>\n\t\t<field name=\"GL_TESS_CONTROL_OUTPUT_VERTICES_EXT\"/>\n\t\t<field name=\"GL_TESS_CONTROL_SHADER_BIT_EXT\"/>\n\t\t<field name=\"GL_TESS_CONTROL_SHADER_EXT\"/>\n\t\t<field name=\"GL_TESS_EVALUATION_SHADER_BIT_EXT\"/>\n\t\t<field name=\"GL_TESS_EVALUATION_SHADER_EXT\"/>\n\t\t<field name=\"GL_TESS_GEN_MODE_EXT\"/>\n\t\t<field name=\"GL_TESS_GEN_POINT_MODE_EXT\"/>\n\t\t<field name=\"GL_TESS_GEN_SPACING_EXT\"/>\n\t\t<field name=\"GL_TESS_GEN_VERTEX_ORDER_EXT\"/>\n\t\t<field name=\"GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES\"/>\n\t\t<field name=\"GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY_OES\"/>\n\t\t<field name=\"GL_TEXTURE_BINDING_BUFFER_EXT\"/>\n\t\t<field name=\"GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT\"/>\n\t\t<field name=\"GL_TEXTURE_BORDER_COLOR_EXT\"/>\n\t\t<field name=\"GL_TEXTURE_BUFFER_BINDING_EXT\"/>\n\t\t<field name=\"GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT\"/>\n\t\t<field name=\"GL_TEXTURE_BUFFER_EXT\"/>\n\t\t<field name=\"GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT\"/>\n\t\t<field name=\"GL_TEXTURE_BUFFER_OFFSET_EXT\"/>\n\t\t<field name=\"GL_TEXTURE_BUFFER_SIZE_EXT\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP_ARRAY_EXT\"/>\n\t\t<field name=\"GL_TEXTURE_SRGB_DECODE_EXT\"/>\n\t\t<field name=\"GL_TRIANGLES_ADJACENCY_EXT\"/>\n\t\t<field name=\"GL_TRIANGLE_STRIP_ADJACENCY_EXT\"/>\n\t\t<field name=\"GL_UNDEFINED_VERTEX_EXT\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_IMAGE_BUFFER_EXT\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT\"/>\n\t\t<field name=\"GL_VERTEX_ARRAY_KHR\"/>\n\t</class>\n\t<class name=\"android/opengl/GLES31Ext$DebugProcKHR\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onMessage(IIIILjava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/opengl/GLES32\" since=\"24\">\n\t\t<extends name=\"android/opengl/GLES31\"/>\n\t\t<method name=\"glBlendBarrier()V\"/>\n\t\t<method name=\"glBlendEquationSeparatei(III)V\"/>\n\t\t<method name=\"glBlendEquationi(II)V\"/>\n\t\t<method name=\"glBlendFuncSeparatei(IIIII)V\"/>\n\t\t<method name=\"glBlendFunci(III)V\"/>\n\t\t<method name=\"glColorMaski(IZZZZ)V\"/>\n\t\t<method name=\"glCopyImageSubData(IIIIIIIIIIIIIII)V\"/>\n\t\t<method name=\"glDebugMessageCallback(Landroid/opengl/GLES32$DebugProc;)V\"/>\n\t\t<method name=\"glDebugMessageControl(IIIILjava/nio/IntBuffer;Z)V\"/>\n\t\t<method name=\"glDebugMessageControl(IIII[IIZ)V\"/>\n\t\t<method name=\"glDebugMessageInsert(IIIIILjava/lang/String;)V\"/>\n\t\t<method name=\"glDisablei(II)V\"/>\n\t\t<method name=\"glDrawElementsBaseVertex(IIILjava/nio/Buffer;I)V\"/>\n\t\t<method name=\"glDrawElementsInstancedBaseVertex(IIIIII)V\"/>\n\t\t<method name=\"glDrawElementsInstancedBaseVertex(IIILjava/nio/Buffer;II)V\"/>\n\t\t<method name=\"glDrawRangeElementsBaseVertex(IIIIILjava/nio/Buffer;I)V\"/>\n\t\t<method name=\"glEnablei(II)V\"/>\n\t\t<method name=\"glFramebufferTexture(IIII)V\"/>\n\t\t<method name=\"glGetDebugMessageLog(II[II[II[II[II[II[BI)I\"/>\n\t\t<method name=\"glGetDebugMessageLog(ILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;)[Ljava/lang/String;\"/>\n\t\t<method name=\"glGetDebugMessageLog(ILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/ByteBuffer;)I\"/>\n\t\t<method name=\"glGetDebugMessageLog(I[II[II[II[II)[Ljava/lang/String;\"/>\n\t\t<method name=\"glGetGraphicsResetStatus()I\"/>\n\t\t<method name=\"glGetObjectLabel(II)Ljava/lang/String;\"/>\n\t\t<method name=\"glGetObjectPtrLabel(J)Ljava/lang/String;\"/>\n\t\t<method name=\"glGetPointerv(I)J\"/>\n\t\t<method name=\"glGetSamplerParameterIiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetSamplerParameterIiv(II[II)V\"/>\n\t\t<method name=\"glGetSamplerParameterIuiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetSamplerParameterIuiv(II[II)V\"/>\n\t\t<method name=\"glGetTexParameterIiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetTexParameterIiv(II[II)V\"/>\n\t\t<method name=\"glGetTexParameterIuiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetTexParameterIuiv(II[II)V\"/>\n\t\t<method name=\"glGetnUniformfv(IIILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetnUniformfv(III[FI)V\"/>\n\t\t<method name=\"glGetnUniformiv(IIILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetnUniformiv(III[II)V\"/>\n\t\t<method name=\"glGetnUniformuiv(IIILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetnUniformuiv(III[II)V\"/>\n\t\t<method name=\"glIsEnabledi(II)Z\"/>\n\t\t<method name=\"glMinSampleShading(F)V\"/>\n\t\t<method name=\"glObjectLabel(IIILjava/lang/String;)V\"/>\n\t\t<method name=\"glObjectPtrLabel(JLjava/lang/String;)V\"/>\n\t\t<method name=\"glPatchParameteri(II)V\"/>\n\t\t<method name=\"glPopDebugGroup()V\"/>\n\t\t<method name=\"glPrimitiveBoundingBox(FFFFFFFF)V\"/>\n\t\t<method name=\"glPushDebugGroup(IIILjava/lang/String;)V\"/>\n\t\t<method name=\"glReadnPixels(IIIIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glSamplerParameterIiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glSamplerParameterIiv(II[II)V\"/>\n\t\t<method name=\"glSamplerParameterIuiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glSamplerParameterIuiv(II[II)V\"/>\n\t\t<method name=\"glTexBuffer(III)V\"/>\n\t\t<method name=\"glTexBufferRange(IIIII)V\"/>\n\t\t<method name=\"glTexParameterIiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glTexParameterIiv(II[II)V\"/>\n\t\t<method name=\"glTexParameterIuiv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glTexParameterIuiv(II[II)V\"/>\n\t\t<method name=\"glTexStorage3DMultisample(IIIIIIZ)V\"/>\n\t\t<field name=\"GL_BUFFER\"/>\n\t\t<field name=\"GL_CLAMP_TO_BORDER\"/>\n\t\t<field name=\"GL_COLORBURN\"/>\n\t\t<field name=\"GL_COLORDODGE\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_10x10\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_10x5\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_10x6\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_10x8\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_12x10\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_12x12\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_4x4\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_5x4\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_5x5\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_6x5\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_6x6\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_8x5\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_8x6\"/>\n\t\t<field name=\"GL_COMPRESSED_RGBA_ASTC_8x8\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6\"/>\n\t\t<field name=\"GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8\"/>\n\t\t<field name=\"GL_CONTEXT_FLAGS\"/>\n\t\t<field name=\"GL_CONTEXT_FLAG_DEBUG_BIT\"/>\n\t\t<field name=\"GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT\"/>\n\t\t<field name=\"GL_CONTEXT_LOST\"/>\n\t\t<field name=\"GL_DARKEN\"/>\n\t\t<field name=\"GL_DEBUG_CALLBACK_FUNCTION\"/>\n\t\t<field name=\"GL_DEBUG_CALLBACK_USER_PARAM\"/>\n\t\t<field name=\"GL_DEBUG_GROUP_STACK_DEPTH\"/>\n\t\t<field name=\"GL_DEBUG_LOGGED_MESSAGES\"/>\n\t\t<field name=\"GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH\"/>\n\t\t<field name=\"GL_DEBUG_OUTPUT\"/>\n\t\t<field name=\"GL_DEBUG_OUTPUT_SYNCHRONOUS\"/>\n\t\t<field name=\"GL_DEBUG_SEVERITY_HIGH\"/>\n\t\t<field name=\"GL_DEBUG_SEVERITY_LOW\"/>\n\t\t<field name=\"GL_DEBUG_SEVERITY_MEDIUM\"/>\n\t\t<field name=\"GL_DEBUG_SEVERITY_NOTIFICATION\"/>\n\t\t<field name=\"GL_DEBUG_SOURCE_API\"/>\n\t\t<field name=\"GL_DEBUG_SOURCE_APPLICATION\"/>\n\t\t<field name=\"GL_DEBUG_SOURCE_OTHER\"/>\n\t\t<field name=\"GL_DEBUG_SOURCE_SHADER_COMPILER\"/>\n\t\t<field name=\"GL_DEBUG_SOURCE_THIRD_PARTY\"/>\n\t\t<field name=\"GL_DEBUG_SOURCE_WINDOW_SYSTEM\"/>\n\t\t<field name=\"GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR\"/>\n\t\t<field name=\"GL_DEBUG_TYPE_ERROR\"/>\n\t\t<field name=\"GL_DEBUG_TYPE_MARKER\"/>\n\t\t<field name=\"GL_DEBUG_TYPE_OTHER\"/>\n\t\t<field name=\"GL_DEBUG_TYPE_PERFORMANCE\"/>\n\t\t<field name=\"GL_DEBUG_TYPE_POP_GROUP\"/>\n\t\t<field name=\"GL_DEBUG_TYPE_PORTABILITY\"/>\n\t\t<field name=\"GL_DEBUG_TYPE_PUSH_GROUP\"/>\n\t\t<field name=\"GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR\"/>\n\t\t<field name=\"GL_DIFFERENCE\"/>\n\t\t<field name=\"GL_EXCLUSION\"/>\n\t\t<field name=\"GL_FIRST_VERTEX_CONVENTION\"/>\n\t\t<field name=\"GL_FRACTIONAL_EVEN\"/>\n\t\t<field name=\"GL_FRACTIONAL_ODD\"/>\n\t\t<field name=\"GL_FRAGMENT_INTERPOLATION_OFFSET_BITS\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_LAYERED\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_DEFAULT_LAYERS\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS\"/>\n\t\t<field name=\"GL_GEOMETRY_INPUT_TYPE\"/>\n\t\t<field name=\"GL_GEOMETRY_OUTPUT_TYPE\"/>\n\t\t<field name=\"GL_GEOMETRY_SHADER\"/>\n\t\t<field name=\"GL_GEOMETRY_SHADER_BIT\"/>\n\t\t<field name=\"GL_GEOMETRY_SHADER_INVOCATIONS\"/>\n\t\t<field name=\"GL_GEOMETRY_VERTICES_OUT\"/>\n\t\t<field name=\"GL_GUILTY_CONTEXT_RESET\"/>\n\t\t<field name=\"GL_HARDLIGHT\"/>\n\t\t<field name=\"GL_HSL_COLOR\"/>\n\t\t<field name=\"GL_HSL_HUE\"/>\n\t\t<field name=\"GL_HSL_LUMINOSITY\"/>\n\t\t<field name=\"GL_HSL_SATURATION\"/>\n\t\t<field name=\"GL_IMAGE_BUFFER\"/>\n\t\t<field name=\"GL_IMAGE_CUBE_MAP_ARRAY\"/>\n\t\t<field name=\"GL_INNOCENT_CONTEXT_RESET\"/>\n\t\t<field name=\"GL_INT_IMAGE_BUFFER\"/>\n\t\t<field name=\"GL_INT_IMAGE_CUBE_MAP_ARRAY\"/>\n\t\t<field name=\"GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY\"/>\n\t\t<field name=\"GL_INT_SAMPLER_BUFFER\"/>\n\t\t<field name=\"GL_INT_SAMPLER_CUBE_MAP_ARRAY\"/>\n\t\t<field name=\"GL_ISOLINES\"/>\n\t\t<field name=\"GL_IS_PER_PATCH\"/>\n\t\t<field name=\"GL_LAST_VERTEX_CONVENTION\"/>\n\t\t<field name=\"GL_LAYER_PROVOKING_VERTEX\"/>\n\t\t<field name=\"GL_LIGHTEN\"/>\n\t\t<field name=\"GL_LINES_ADJACENCY\"/>\n\t\t<field name=\"GL_LINE_STRIP_ADJACENCY\"/>\n\t\t<field name=\"GL_LOSE_CONTEXT_ON_RESET\"/>\n\t\t<field name=\"GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_DEBUG_GROUP_STACK_DEPTH\"/>\n\t\t<field name=\"GL_MAX_DEBUG_LOGGED_MESSAGES\"/>\n\t\t<field name=\"GL_MAX_DEBUG_MESSAGE_LENGTH\"/>\n\t\t<field name=\"GL_MAX_FRAGMENT_INTERPOLATION_OFFSET\"/>\n\t\t<field name=\"GL_MAX_FRAMEBUFFER_LAYERS\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_ATOMIC_COUNTERS\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_IMAGE_UNIFORMS\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_INPUT_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_OUTPUT_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_OUTPUT_VERTICES\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_SHADER_INVOCATIONS\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_UNIFORM_BLOCKS\"/>\n\t\t<field name=\"GL_MAX_GEOMETRY_UNIFORM_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_LABEL_LENGTH\"/>\n\t\t<field name=\"GL_MAX_PATCH_VERTICES\"/>\n\t\t<field name=\"GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS\"/>\n\t\t<field name=\"GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS\"/>\n\t\t<field name=\"GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS\"/>\n\t\t<field name=\"GL_MAX_TESS_CONTROL_INPUT_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS\"/>\n\t\t<field name=\"GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS\"/>\n\t\t<field name=\"GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS\"/>\n\t\t<field name=\"GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS\"/>\n\t\t<field name=\"GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS\"/>\n\t\t<field name=\"GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS\"/>\n\t\t<field name=\"GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS\"/>\n\t\t<field name=\"GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS\"/>\n\t\t<field name=\"GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS\"/>\n\t\t<field name=\"GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_TESS_GEN_LEVEL\"/>\n\t\t<field name=\"GL_MAX_TESS_PATCH_COMPONENTS\"/>\n\t\t<field name=\"GL_MAX_TEXTURE_BUFFER_SIZE\"/>\n\t\t<field name=\"GL_MIN_FRAGMENT_INTERPOLATION_OFFSET\"/>\n\t\t<field name=\"GL_MIN_SAMPLE_SHADING_VALUE\"/>\n\t\t<field name=\"GL_MULTIPLY\"/>\n\t\t<field name=\"GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY\"/>\n\t\t<field name=\"GL_MULTISAMPLE_LINE_WIDTH_RANGE\"/>\n\t\t<field name=\"GL_NO_RESET_NOTIFICATION\"/>\n\t\t<field name=\"GL_OVERLAY\"/>\n\t\t<field name=\"GL_PATCHES\"/>\n\t\t<field name=\"GL_PATCH_VERTICES\"/>\n\t\t<field name=\"GL_PRIMITIVES_GENERATED\"/>\n\t\t<field name=\"GL_PRIMITIVE_BOUNDING_BOX\"/>\n\t\t<field name=\"GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED\"/>\n\t\t<field name=\"GL_PROGRAM\"/>\n\t\t<field name=\"GL_PROGRAM_PIPELINE\"/>\n\t\t<field name=\"GL_QUADS\"/>\n\t\t<field name=\"GL_QUERY\"/>\n\t\t<field name=\"GL_REFERENCED_BY_GEOMETRY_SHADER\"/>\n\t\t<field name=\"GL_REFERENCED_BY_TESS_CONTROL_SHADER\"/>\n\t\t<field name=\"GL_REFERENCED_BY_TESS_EVALUATION_SHADER\"/>\n\t\t<field name=\"GL_RESET_NOTIFICATION_STRATEGY\"/>\n\t\t<field name=\"GL_SAMPLER\"/>\n\t\t<field name=\"GL_SAMPLER_2D_MULTISAMPLE_ARRAY\"/>\n\t\t<field name=\"GL_SAMPLER_BUFFER\"/>\n\t\t<field name=\"GL_SAMPLER_CUBE_MAP_ARRAY\"/>\n\t\t<field name=\"GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW\"/>\n\t\t<field name=\"GL_SAMPLE_SHADING\"/>\n\t\t<field name=\"GL_SCREEN\"/>\n\t\t<field name=\"GL_SHADER\"/>\n\t\t<field name=\"GL_SOFTLIGHT\"/>\n\t\t<field name=\"GL_STACK_OVERFLOW\"/>\n\t\t<field name=\"GL_STACK_UNDERFLOW\"/>\n\t\t<field name=\"GL_TESS_CONTROL_OUTPUT_VERTICES\"/>\n\t\t<field name=\"GL_TESS_CONTROL_SHADER\"/>\n\t\t<field name=\"GL_TESS_CONTROL_SHADER_BIT\"/>\n\t\t<field name=\"GL_TESS_EVALUATION_SHADER\"/>\n\t\t<field name=\"GL_TESS_EVALUATION_SHADER_BIT\"/>\n\t\t<field name=\"GL_TESS_GEN_MODE\"/>\n\t\t<field name=\"GL_TESS_GEN_POINT_MODE\"/>\n\t\t<field name=\"GL_TESS_GEN_SPACING\"/>\n\t\t<field name=\"GL_TESS_GEN_VERTEX_ORDER\"/>\n\t\t<field name=\"GL_TEXTURE_2D_MULTISAMPLE_ARRAY\"/>\n\t\t<field name=\"GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY\"/>\n\t\t<field name=\"GL_TEXTURE_BINDING_BUFFER\"/>\n\t\t<field name=\"GL_TEXTURE_BINDING_CUBE_MAP_ARRAY\"/>\n\t\t<field name=\"GL_TEXTURE_BORDER_COLOR\"/>\n\t\t<field name=\"GL_TEXTURE_BUFFER\"/>\n\t\t<field name=\"GL_TEXTURE_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_TEXTURE_BUFFER_DATA_STORE_BINDING\"/>\n\t\t<field name=\"GL_TEXTURE_BUFFER_OFFSET\"/>\n\t\t<field name=\"GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT\"/>\n\t\t<field name=\"GL_TEXTURE_BUFFER_SIZE\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP_ARRAY\"/>\n\t\t<field name=\"GL_TRIANGLES_ADJACENCY\"/>\n\t\t<field name=\"GL_TRIANGLE_STRIP_ADJACENCY\"/>\n\t\t<field name=\"GL_UNDEFINED_VERTEX\"/>\n\t\t<field name=\"GL_UNKNOWN_CONTEXT_RESET\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_IMAGE_BUFFER\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_SAMPLER_BUFFER\"/>\n\t\t<field name=\"GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY\"/>\n\t\t<field name=\"GL_VERTEX_ARRAY\"/>\n\t</class>\n\t<class name=\"android/opengl/GLES32$DebugProc\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onMessage(IIIILjava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/opengl/GLException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/opengl/GLSurfaceView\" since=\"3\">\n\t\t<extends name=\"android/view/SurfaceView\"/>\n\t\t<implements name=\"android/view/SurfaceHolder$Callback\" removed=\"24\"/>\n\t\t<implements name=\"android/view/SurfaceHolder$Callback2\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"getDebugFlags()I\"/>\n\t\t<method name=\"getPreserveEGLContextOnPause()Z\" since=\"11\"/>\n\t\t<method name=\"getRenderMode()I\"/>\n\t\t<method name=\"onPause()V\"/>\n\t\t<method name=\"onResume()V\"/>\n\t\t<method name=\"queueEvent(Ljava/lang/Runnable;)V\"/>\n\t\t<method name=\"requestRender()V\"/>\n\t\t<method name=\"setDebugFlags(I)V\"/>\n\t\t<method name=\"setEGLConfigChooser(IIIIII)V\"/>\n\t\t<method name=\"setEGLConfigChooser(Landroid/opengl/GLSurfaceView$EGLConfigChooser;)V\"/>\n\t\t<method name=\"setEGLConfigChooser(Z)V\"/>\n\t\t<method name=\"setEGLContextClientVersion(I)V\" since=\"8\"/>\n\t\t<method name=\"setEGLContextFactory(Landroid/opengl/GLSurfaceView$EGLContextFactory;)V\" since=\"5\"/>\n\t\t<method name=\"setEGLWindowSurfaceFactory(Landroid/opengl/GLSurfaceView$EGLWindowSurfaceFactory;)V\" since=\"5\"/>\n\t\t<method name=\"setGLWrapper(Landroid/opengl/GLSurfaceView$GLWrapper;)V\"/>\n\t\t<method name=\"setPreserveEGLContextOnPause(Z)V\" since=\"11\"/>\n\t\t<method name=\"setRenderMode(I)V\"/>\n\t\t<method name=\"setRenderer(Landroid/opengl/GLSurfaceView$Renderer;)V\"/>\n\t\t<field name=\"DEBUG_CHECK_GL_ERROR\"/>\n\t\t<field name=\"DEBUG_LOG_GL_CALLS\"/>\n\t\t<field name=\"RENDERMODE_CONTINUOUSLY\"/>\n\t\t<field name=\"RENDERMODE_WHEN_DIRTY\"/>\n\t</class>\n\t<class name=\"android/opengl/GLSurfaceView$EGLConfigChooser\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"chooseConfig(Ljavax/microedition/khronos/egl/EGL10;Ljavax/microedition/khronos/egl/EGLDisplay;)Ljavax/microedition/khronos/egl/EGLConfig;\"/>\n\t</class>\n\t<class name=\"android/opengl/GLSurfaceView$EGLContextFactory\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createContext(Ljavax/microedition/khronos/egl/EGL10;Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;)Ljavax/microedition/khronos/egl/EGLContext;\"/>\n\t\t<method name=\"destroyContext(Ljavax/microedition/khronos/egl/EGL10;Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLContext;)V\"/>\n\t</class>\n\t<class name=\"android/opengl/GLSurfaceView$EGLWindowSurfaceFactory\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createWindowSurface(Ljavax/microedition/khronos/egl/EGL10;Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;Ljava/lang/Object;)Ljavax/microedition/khronos/egl/EGLSurface;\"/>\n\t\t<method name=\"destroySurface(Ljavax/microedition/khronos/egl/EGL10;Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLSurface;)V\"/>\n\t</class>\n\t<class name=\"android/opengl/GLSurfaceView$GLWrapper\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"wrap(Ljavax/microedition/khronos/opengles/GL;)Ljavax/microedition/khronos/opengles/GL;\"/>\n\t</class>\n\t<class name=\"android/opengl/GLSurfaceView$Renderer\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDrawFrame(Ljavax/microedition/khronos/opengles/GL10;)V\"/>\n\t\t<method name=\"onSurfaceChanged(Ljavax/microedition/khronos/opengles/GL10;II)V\"/>\n\t\t<method name=\"onSurfaceCreated(Ljavax/microedition/khronos/opengles/GL10;Ljavax/microedition/khronos/egl/EGLConfig;)V\"/>\n\t</class>\n\t<class name=\"android/opengl/GLU\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"gluErrorString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"gluLookAt(Ljavax/microedition/khronos/opengles/GL10;FFFFFFFFF)V\"/>\n\t\t<method name=\"gluOrtho2D(Ljavax/microedition/khronos/opengles/GL10;FFFF)V\"/>\n\t\t<method name=\"gluPerspective(Ljavax/microedition/khronos/opengles/GL10;FFFF)V\"/>\n\t\t<method name=\"gluProject(FFF[FI[FI[II[FI)I\"/>\n\t\t<method name=\"gluUnProject(FFF[FI[FI[II[FI)I\"/>\n\t</class>\n\t<class name=\"android/opengl/GLUtils\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getEGLErrorString(I)Ljava/lang/String;\" since=\"14\"/>\n\t\t<method name=\"getInternalFormat(Landroid/graphics/Bitmap;)I\"/>\n\t\t<method name=\"getType(Landroid/graphics/Bitmap;)I\"/>\n\t\t<method name=\"texImage2D(IIILandroid/graphics/Bitmap;I)V\"/>\n\t\t<method name=\"texImage2D(IIILandroid/graphics/Bitmap;II)V\"/>\n\t\t<method name=\"texImage2D(IILandroid/graphics/Bitmap;I)V\"/>\n\t\t<method name=\"texSubImage2D(IIIILandroid/graphics/Bitmap;)V\"/>\n\t\t<method name=\"texSubImage2D(IIIILandroid/graphics/Bitmap;II)V\"/>\n\t</class>\n\t<class name=\"android/opengl/Matrix\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"19\"/>\n\t\t<method name=\"frustumM([FIFFFFFF)V\"/>\n\t\t<method name=\"invertM([FI[FI)Z\"/>\n\t\t<method name=\"length(FFF)F\"/>\n\t\t<method name=\"multiplyMM([FI[FI[FI)V\"/>\n\t\t<method name=\"multiplyMV([FI[FI[FI)V\"/>\n\t\t<method name=\"orthoM([FIFFFFFF)V\"/>\n\t\t<method name=\"perspectiveM([FIFFFF)V\" since=\"14\"/>\n\t\t<method name=\"rotateM([FIFFFF)V\"/>\n\t\t<method name=\"rotateM([FI[FIFFFF)V\"/>\n\t\t<method name=\"scaleM([FIFFF)V\"/>\n\t\t<method name=\"scaleM([FI[FIFFF)V\"/>\n\t\t<method name=\"setIdentityM([FI)V\"/>\n\t\t<method name=\"setLookAtM([FIFFFFFFFFF)V\" since=\"8\"/>\n\t\t<method name=\"setRotateEulerM([FIFFF)V\"/>\n\t\t<method name=\"setRotateM([FIFFFF)V\"/>\n\t\t<method name=\"translateM([FIFFF)V\"/>\n\t\t<method name=\"translateM([FI[FIFFF)V\"/>\n\t\t<method name=\"transposeM([FI[FI)V\"/>\n\t</class>\n\t<class name=\"android/opengl/Visibility\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"computeBoundingSphere([FII[FI)V\"/>\n\t\t<method name=\"frustumCullSpheres([FI[FII[III)I\"/>\n\t\t<method name=\"visibilityTest([FI[FI[CII)I\"/>\n\t</class>\n\t<class name=\"android/os/AsyncTask\" since=\"3\" deprecated=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"cancel(Z)Z\" deprecated=\"30\"/>\n\t\t<method name=\"doInBackground([Ljava/lang/Object;)Ljava/lang/Object;\" deprecated=\"30\"/>\n\t\t<method name=\"execute(Ljava/lang/Runnable;)V\" since=\"11\" deprecated=\"30\"/>\n\t\t<method name=\"execute([Ljava/lang/Object;)Landroid/os/AsyncTask;\" deprecated=\"30\"/>\n\t\t<method name=\"executeOnExecutor(Ljava/util/concurrent/Executor;[Ljava/lang/Object;)Landroid/os/AsyncTask;\" since=\"11\" deprecated=\"30\"/>\n\t\t<method name=\"get()Ljava/lang/Object;\" deprecated=\"30\"/>\n\t\t<method name=\"get(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;\" deprecated=\"30\"/>\n\t\t<method name=\"getStatus()Landroid/os/AsyncTask$Status;\" deprecated=\"30\"/>\n\t\t<method name=\"isCancelled()Z\" deprecated=\"30\"/>\n\t\t<method name=\"onCancelled()V\" deprecated=\"30\"/>\n\t\t<method name=\"onCancelled(Ljava/lang/Object;)V\" since=\"11\" deprecated=\"30\"/>\n\t\t<method name=\"onPostExecute(Ljava/lang/Object;)V\" deprecated=\"30\"/>\n\t\t<method name=\"onPreExecute()V\" deprecated=\"30\"/>\n\t\t<method name=\"onProgressUpdate([Ljava/lang/Object;)V\" deprecated=\"30\"/>\n\t\t<method name=\"publishProgress([Ljava/lang/Object;)V\" deprecated=\"30\"/>\n\t\t<field name=\"SERIAL_EXECUTOR\" since=\"11\" deprecated=\"30\"/>\n\t\t<field name=\"THREAD_POOL_EXECUTOR\" since=\"11\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/os/AsyncTask$Status\" since=\"3\" deprecated=\"30\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/os/AsyncTask$Status;\"/>\n\t\t<method name=\"values()[Landroid/os/AsyncTask$Status;\"/>\n\t\t<field name=\"FINISHED\" deprecated=\"30\"/>\n\t\t<field name=\"PENDING\" deprecated=\"30\"/>\n\t\t<field name=\"RUNNING\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/os/BadParcelableException\" since=\"1\">\n\t\t<extends name=\"android/util/AndroidRuntimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Exception;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/os/BaseBundle\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"containsKey(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"get(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getBoolean(Ljava/lang/String;)Z\" since=\"22\"/>\n\t\t<method name=\"getBoolean(Ljava/lang/String;Z)Z\" since=\"22\"/>\n\t\t<method name=\"getBooleanArray(Ljava/lang/String;)[Z\" since=\"22\"/>\n\t\t<method name=\"getDouble(Ljava/lang/String;)D\"/>\n\t\t<method name=\"getDouble(Ljava/lang/String;D)D\"/>\n\t\t<method name=\"getDoubleArray(Ljava/lang/String;)[D\"/>\n\t\t<method name=\"getInt(Ljava/lang/String;)I\"/>\n\t\t<method name=\"getInt(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"getIntArray(Ljava/lang/String;)[I\"/>\n\t\t<method name=\"getLong(Ljava/lang/String;)J\"/>\n\t\t<method name=\"getLong(Ljava/lang/String;J)J\"/>\n\t\t<method name=\"getLongArray(Ljava/lang/String;)[J\"/>\n\t\t<method name=\"getString(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getStringArray(Ljava/lang/String;)[Ljava/lang/String;\"/>\n\t\t<method name=\"isEmpty()Z\"/>\n\t\t<method name=\"keySet()Ljava/util/Set;\"/>\n\t\t<method name=\"putAll(Landroid/os/PersistableBundle;)V\"/>\n\t\t<method name=\"putBoolean(Ljava/lang/String;Z)V\" since=\"22\"/>\n\t\t<method name=\"putBooleanArray(Ljava/lang/String;[Z)V\" since=\"22\"/>\n\t\t<method name=\"putDouble(Ljava/lang/String;D)V\"/>\n\t\t<method name=\"putDoubleArray(Ljava/lang/String;[D)V\"/>\n\t\t<method name=\"putInt(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"putIntArray(Ljava/lang/String;[I)V\"/>\n\t\t<method name=\"putLong(Ljava/lang/String;J)V\"/>\n\t\t<method name=\"putLongArray(Ljava/lang/String;[J)V\"/>\n\t\t<method name=\"putString(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"putStringArray(Ljava/lang/String;[Ljava/lang/String;)V\"/>\n\t\t<method name=\"remove(Ljava/lang/String;)V\"/>\n\t\t<method name=\"size()I\"/>\n\t</class>\n\t<class name=\"android/os/BatteryManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" removed=\"23\"/>\n\t\t<method name=\"computeChargeTimeRemaining()J\" since=\"28\"/>\n\t\t<method name=\"getIntProperty(I)I\" since=\"21\"/>\n\t\t<method name=\"getLongProperty(I)J\" since=\"21\"/>\n\t\t<method name=\"isCharging()Z\" since=\"23\"/>\n\t\t<field name=\"ACTION_CHARGING\" since=\"23\"/>\n\t\t<field name=\"ACTION_DISCHARGING\" since=\"23\"/>\n\t\t<field name=\"BATTERY_HEALTH_COLD\" since=\"11\"/>\n\t\t<field name=\"BATTERY_HEALTH_DEAD\"/>\n\t\t<field name=\"BATTERY_HEALTH_GOOD\"/>\n\t\t<field name=\"BATTERY_HEALTH_OVERHEAT\"/>\n\t\t<field name=\"BATTERY_HEALTH_OVER_VOLTAGE\"/>\n\t\t<field name=\"BATTERY_HEALTH_UNKNOWN\"/>\n\t\t<field name=\"BATTERY_HEALTH_UNSPECIFIED_FAILURE\"/>\n\t\t<field name=\"BATTERY_PLUGGED_AC\"/>\n\t\t<field name=\"BATTERY_PLUGGED_USB\"/>\n\t\t<field name=\"BATTERY_PLUGGED_WIRELESS\" since=\"17\"/>\n\t\t<field name=\"BATTERY_PROPERTY_CAPACITY\" since=\"21\"/>\n\t\t<field name=\"BATTERY_PROPERTY_CHARGE_COUNTER\" since=\"21\"/>\n\t\t<field name=\"BATTERY_PROPERTY_CURRENT_AVERAGE\" since=\"21\"/>\n\t\t<field name=\"BATTERY_PROPERTY_CURRENT_NOW\" since=\"21\"/>\n\t\t<field name=\"BATTERY_PROPERTY_ENERGY_COUNTER\" since=\"21\"/>\n\t\t<field name=\"BATTERY_PROPERTY_STATUS\" since=\"26\"/>\n\t\t<field name=\"BATTERY_STATUS_CHARGING\"/>\n\t\t<field name=\"BATTERY_STATUS_DISCHARGING\"/>\n\t\t<field name=\"BATTERY_STATUS_FULL\"/>\n\t\t<field name=\"BATTERY_STATUS_NOT_CHARGING\"/>\n\t\t<field name=\"BATTERY_STATUS_UNKNOWN\"/>\n\t\t<field name=\"EXTRA_BATTERY_LOW\" since=\"28\"/>\n\t\t<field name=\"EXTRA_HEALTH\" since=\"5\"/>\n\t\t<field name=\"EXTRA_ICON_SMALL\" since=\"5\"/>\n\t\t<field name=\"EXTRA_LEVEL\" since=\"5\"/>\n\t\t<field name=\"EXTRA_PLUGGED\" since=\"5\"/>\n\t\t<field name=\"EXTRA_PRESENT\" since=\"5\"/>\n\t\t<field name=\"EXTRA_SCALE\" since=\"5\"/>\n\t\t<field name=\"EXTRA_STATUS\" since=\"5\"/>\n\t\t<field name=\"EXTRA_TECHNOLOGY\" since=\"5\"/>\n\t\t<field name=\"EXTRA_TEMPERATURE\" since=\"5\"/>\n\t\t<field name=\"EXTRA_VOLTAGE\" since=\"5\"/>\n\t</class>\n\t<class name=\"android/os/Binder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/IBinder\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" since=\"29\"/>\n\t\t<method name=\"attachInterface(Landroid/os/IInterface;Ljava/lang/String;)V\"/>\n\t\t<method name=\"clearCallingIdentity()J\"/>\n\t\t<method name=\"clearCallingWorkSource()J\" since=\"29\"/>\n\t\t<method name=\"dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V\"/>\n\t\t<method name=\"flushPendingCommands()V\"/>\n\t\t<method name=\"getCallingPid()I\"/>\n\t\t<method name=\"getCallingUid()I\"/>\n\t\t<method name=\"getCallingUidOrThrow()I\" since=\"29\"/>\n\t\t<method name=\"getCallingUserHandle()Landroid/os/UserHandle;\" since=\"17\"/>\n\t\t<method name=\"getCallingWorkSourceUid()I\" since=\"29\"/>\n\t\t<method name=\"joinThreadPool()V\"/>\n\t\t<method name=\"onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z\"/>\n\t\t<method name=\"restoreCallingIdentity(J)V\"/>\n\t\t<method name=\"restoreCallingWorkSource(J)V\" since=\"29\"/>\n\t\t<method name=\"setCallingWorkSourceUid(I)J\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/os/Build\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getFingerprintedPartitions()Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"getRadioVersion()Ljava/lang/String;\" since=\"14\"/>\n\t\t<method name=\"getSerial()Ljava/lang/String;\" since=\"26\"/>\n\t\t<field name=\"BOARD\"/>\n\t\t<field name=\"BOOTLOADER\" since=\"8\"/>\n\t\t<field name=\"BRAND\"/>\n\t\t<field name=\"CPU_ABI\" since=\"4\" deprecated=\"21\"/>\n\t\t<field name=\"CPU_ABI2\" since=\"8\" deprecated=\"21\"/>\n\t\t<field name=\"DEVICE\"/>\n\t\t<field name=\"DISPLAY\" since=\"3\"/>\n\t\t<field name=\"FINGERPRINT\"/>\n\t\t<field name=\"HARDWARE\" since=\"8\"/>\n\t\t<field name=\"HOST\"/>\n\t\t<field name=\"ID\"/>\n\t\t<field name=\"MANUFACTURER\" since=\"4\"/>\n\t\t<field name=\"MODEL\"/>\n\t\t<field name=\"PRODUCT\"/>\n\t\t<field name=\"RADIO\" since=\"8\" deprecated=\"15\"/>\n\t\t<field name=\"SERIAL\" since=\"9\" deprecated=\"26\"/>\n\t\t<field name=\"SKU\" since=\"30\"/>\n\t\t<field name=\"SUPPORTED_32_BIT_ABIS\" since=\"21\"/>\n\t\t<field name=\"SUPPORTED_64_BIT_ABIS\" since=\"21\"/>\n\t\t<field name=\"SUPPORTED_ABIS\" since=\"21\"/>\n\t\t<field name=\"TAGS\"/>\n\t\t<field name=\"TIME\"/>\n\t\t<field name=\"TYPE\"/>\n\t\t<field name=\"UNKNOWN\" since=\"8\"/>\n\t\t<field name=\"USER\"/>\n\t</class>\n\t<class name=\"android/os/Build$Partition\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getBuildTimeMillis()J\"/>\n\t\t<method name=\"getFingerprint()Ljava/lang/String;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<field name=\"PARTITION_NAME_SYSTEM\"/>\n\t</class>\n\t<class name=\"android/os/Build$VERSION\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"BASE_OS\" since=\"23\"/>\n\t\t<field name=\"CODENAME\" since=\"4\"/>\n\t\t<field name=\"INCREMENTAL\"/>\n\t\t<field name=\"PREVIEW_SDK_INT\" since=\"23\"/>\n\t\t<field name=\"RELEASE\"/>\n\t\t<field name=\"SDK\" deprecated=\"15\"/>\n\t\t<field name=\"SDK_INT\" since=\"4\"/>\n\t\t<field name=\"SECURITY_PATCH\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/os/Build$VERSION_CODES\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"BASE\"/>\n\t\t<field name=\"BASE_1_1\"/>\n\t\t<field name=\"CUPCAKE\"/>\n\t\t<field name=\"CUR_DEVELOPMENT\"/>\n\t\t<field name=\"DONUT\"/>\n\t\t<field name=\"ECLAIR\" since=\"5\"/>\n\t\t<field name=\"ECLAIR_0_1\" since=\"6\"/>\n\t\t<field name=\"ECLAIR_MR1\" since=\"7\"/>\n\t\t<field name=\"FROYO\" since=\"8\"/>\n\t\t<field name=\"GINGERBREAD\" since=\"9\"/>\n\t\t<field name=\"GINGERBREAD_MR1\" since=\"10\"/>\n\t\t<field name=\"HONEYCOMB\" since=\"11\"/>\n\t\t<field name=\"HONEYCOMB_MR1\" since=\"12\"/>\n\t\t<field name=\"HONEYCOMB_MR2\" since=\"13\"/>\n\t\t<field name=\"ICE_CREAM_SANDWICH\" since=\"14\"/>\n\t\t<field name=\"ICE_CREAM_SANDWICH_MR1\" since=\"15\"/>\n\t\t<field name=\"JELLY_BEAN\" since=\"16\"/>\n\t\t<field name=\"JELLY_BEAN_MR1\" since=\"17\"/>\n\t\t<field name=\"JELLY_BEAN_MR2\" since=\"18\"/>\n\t\t<field name=\"KITKAT\" since=\"19\"/>\n\t\t<field name=\"KITKAT_WATCH\" since=\"20\"/>\n\t\t<field name=\"LOLLIPOP\" since=\"21\"/>\n\t\t<field name=\"LOLLIPOP_MR1\" since=\"22\"/>\n\t\t<field name=\"M\" since=\"23\"/>\n\t\t<field name=\"N\" since=\"24\"/>\n\t\t<field name=\"N_MR1\" since=\"25\"/>\n\t\t<field name=\"O\" since=\"26\"/>\n\t\t<field name=\"O_MR1\" since=\"27\"/>\n\t\t<field name=\"P\" since=\"28\"/>\n\t\t<field name=\"Q\" since=\"29\"/>\n\t\t<field name=\"R\" since=\"30\"/>\n\t</class>\n\t<class name=\"android/os/Bundle\" since=\"1\">\n\t\t<extends name=\"android/os/BaseBundle\" since=\"21\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"21\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/PersistableBundle;)V\" since=\"21\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/ClassLoader;)V\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"containsKey(Ljava/lang/String;)Z\" removed=\"21\"/>\n\t\t<method name=\"deepCopy()Landroid/os/Bundle;\" since=\"26\"/>\n\t\t<method name=\"get(Ljava/lang/String;)Ljava/lang/Object;\" removed=\"21\"/>\n\t\t<method name=\"getBinder(Ljava/lang/String;)Landroid/os/IBinder;\" since=\"18\"/>\n\t\t<method name=\"getBoolean(Ljava/lang/String;)Z\" removed=\"22\"/>\n\t\t<method name=\"getBoolean(Ljava/lang/String;Z)Z\" removed=\"22\"/>\n\t\t<method name=\"getBooleanArray(Ljava/lang/String;)[Z\" removed=\"22\"/>\n\t\t<method name=\"getBundle(Ljava/lang/String;)Landroid/os/Bundle;\"/>\n\t\t<method name=\"getByte(Ljava/lang/String;)B\"/>\n\t\t<method name=\"getByte(Ljava/lang/String;B)Ljava/lang/Byte;\"/>\n\t\t<method name=\"getByteArray(Ljava/lang/String;)[B\"/>\n\t\t<method name=\"getChar(Ljava/lang/String;)C\"/>\n\t\t<method name=\"getChar(Ljava/lang/String;C)C\"/>\n\t\t<method name=\"getCharArray(Ljava/lang/String;)[C\"/>\n\t\t<method name=\"getCharSequence(Ljava/lang/String;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getCharSequence(Ljava/lang/String;Ljava/lang/CharSequence;)Ljava/lang/CharSequence;\" since=\"12\"/>\n\t\t<method name=\"getCharSequenceArray(Ljava/lang/String;)[Ljava/lang/CharSequence;\" since=\"8\"/>\n\t\t<method name=\"getCharSequenceArrayList(Ljava/lang/String;)Ljava/util/ArrayList;\" since=\"8\"/>\n\t\t<method name=\"getClassLoader()Ljava/lang/ClassLoader;\" since=\"11\"/>\n\t\t<method name=\"getDouble(Ljava/lang/String;)D\" removed=\"21\"/>\n\t\t<method name=\"getDouble(Ljava/lang/String;D)D\" removed=\"21\"/>\n\t\t<method name=\"getDoubleArray(Ljava/lang/String;)[D\" removed=\"21\"/>\n\t\t<method name=\"getFloat(Ljava/lang/String;)F\"/>\n\t\t<method name=\"getFloat(Ljava/lang/String;F)F\"/>\n\t\t<method name=\"getFloatArray(Ljava/lang/String;)[F\"/>\n\t\t<method name=\"getInt(Ljava/lang/String;)I\" removed=\"21\"/>\n\t\t<method name=\"getInt(Ljava/lang/String;I)I\" removed=\"21\"/>\n\t\t<method name=\"getIntArray(Ljava/lang/String;)[I\" removed=\"21\"/>\n\t\t<method name=\"getIntegerArrayList(Ljava/lang/String;)Ljava/util/ArrayList;\"/>\n\t\t<method name=\"getLong(Ljava/lang/String;)J\" removed=\"21\"/>\n\t\t<method name=\"getLong(Ljava/lang/String;J)J\" removed=\"21\"/>\n\t\t<method name=\"getLongArray(Ljava/lang/String;)[J\" removed=\"21\"/>\n\t\t<method name=\"getParcelable(Ljava/lang/String;)Landroid/os/Parcelable;\"/>\n\t\t<method name=\"getParcelableArray(Ljava/lang/String;)[Landroid/os/Parcelable;\"/>\n\t\t<method name=\"getParcelableArrayList(Ljava/lang/String;)Ljava/util/ArrayList;\"/>\n\t\t<method name=\"getSerializable(Ljava/lang/String;)Ljava/io/Serializable;\"/>\n\t\t<method name=\"getShort(Ljava/lang/String;)S\"/>\n\t\t<method name=\"getShort(Ljava/lang/String;S)S\"/>\n\t\t<method name=\"getShortArray(Ljava/lang/String;)[S\"/>\n\t\t<method name=\"getSize(Ljava/lang/String;)Landroid/util/Size;\" since=\"21\"/>\n\t\t<method name=\"getSizeF(Ljava/lang/String;)Landroid/util/SizeF;\" since=\"21\"/>\n\t\t<method name=\"getSparseParcelableArray(Ljava/lang/String;)Landroid/util/SparseArray;\"/>\n\t\t<method name=\"getString(Ljava/lang/String;)Ljava/lang/String;\" removed=\"21\"/>\n\t\t<method name=\"getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\" since=\"12\" removed=\"21\"/>\n\t\t<method name=\"getStringArray(Ljava/lang/String;)[Ljava/lang/String;\" removed=\"21\"/>\n\t\t<method name=\"getStringArrayList(Ljava/lang/String;)Ljava/util/ArrayList;\"/>\n\t\t<method name=\"hasFileDescriptors()Z\"/>\n\t\t<method name=\"isEmpty()Z\" removed=\"21\"/>\n\t\t<method name=\"keySet()Ljava/util/Set;\" removed=\"21\"/>\n\t\t<method name=\"putAll(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"putBinder(Ljava/lang/String;Landroid/os/IBinder;)V\" since=\"18\"/>\n\t\t<method name=\"putBoolean(Ljava/lang/String;Z)V\" removed=\"22\"/>\n\t\t<method name=\"putBooleanArray(Ljava/lang/String;[Z)V\" removed=\"22\"/>\n\t\t<method name=\"putBundle(Ljava/lang/String;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"putByte(Ljava/lang/String;B)V\"/>\n\t\t<method name=\"putByteArray(Ljava/lang/String;[B)V\"/>\n\t\t<method name=\"putChar(Ljava/lang/String;C)V\"/>\n\t\t<method name=\"putCharArray(Ljava/lang/String;[C)V\"/>\n\t\t<method name=\"putCharSequence(Ljava/lang/String;Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"putCharSequenceArray(Ljava/lang/String;[Ljava/lang/CharSequence;)V\" since=\"8\"/>\n\t\t<method name=\"putCharSequenceArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V\" since=\"8\"/>\n\t\t<method name=\"putDouble(Ljava/lang/String;D)V\" removed=\"21\"/>\n\t\t<method name=\"putDoubleArray(Ljava/lang/String;[D)V\" removed=\"21\"/>\n\t\t<method name=\"putFloat(Ljava/lang/String;F)V\"/>\n\t\t<method name=\"putFloatArray(Ljava/lang/String;[F)V\"/>\n\t\t<method name=\"putInt(Ljava/lang/String;I)V\" removed=\"21\"/>\n\t\t<method name=\"putIntArray(Ljava/lang/String;[I)V\" removed=\"21\"/>\n\t\t<method name=\"putIntegerArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V\"/>\n\t\t<method name=\"putLong(Ljava/lang/String;J)V\" removed=\"21\"/>\n\t\t<method name=\"putLongArray(Ljava/lang/String;[J)V\" removed=\"21\"/>\n\t\t<method name=\"putParcelable(Ljava/lang/String;Landroid/os/Parcelable;)V\"/>\n\t\t<method name=\"putParcelableArray(Ljava/lang/String;[Landroid/os/Parcelable;)V\"/>\n\t\t<method name=\"putParcelableArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V\"/>\n\t\t<method name=\"putSerializable(Ljava/lang/String;Ljava/io/Serializable;)V\"/>\n\t\t<method name=\"putShort(Ljava/lang/String;S)V\"/>\n\t\t<method name=\"putShortArray(Ljava/lang/String;[S)V\"/>\n\t\t<method name=\"putSize(Ljava/lang/String;Landroid/util/Size;)V\" since=\"21\"/>\n\t\t<method name=\"putSizeF(Ljava/lang/String;Landroid/util/SizeF;)V\" since=\"21\"/>\n\t\t<method name=\"putSparseParcelableArray(Ljava/lang/String;Landroid/util/SparseArray;)V\"/>\n\t\t<method name=\"putString(Ljava/lang/String;Ljava/lang/String;)V\" removed=\"21\"/>\n\t\t<method name=\"putStringArray(Ljava/lang/String;[Ljava/lang/String;)V\" removed=\"21\"/>\n\t\t<method name=\"putStringArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V\"/>\n\t\t<method name=\"readFromParcel(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"remove(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setClassLoader(Ljava/lang/ClassLoader;)V\"/>\n\t\t<method name=\"size()I\" removed=\"21\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"EMPTY\"/>\n\t</class>\n\t<class name=\"android/os/CancellationSignal\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"cancel()V\"/>\n\t\t<method name=\"isCanceled()Z\"/>\n\t\t<method name=\"setOnCancelListener(Landroid/os/CancellationSignal$OnCancelListener;)V\"/>\n\t\t<method name=\"throwIfCanceled()V\"/>\n\t</class>\n\t<class name=\"android/os/CancellationSignal$OnCancelListener\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onCancel()V\"/>\n\t</class>\n\t<class name=\"android/os/ConditionVariable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Z)V\"/>\n\t\t<method name=\"block()V\"/>\n\t\t<method name=\"block(J)Z\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"open()V\"/>\n\t</class>\n\t<class name=\"android/os/CountDownTimer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(JJ)V\"/>\n\t\t<method name=\"cancel()V\"/>\n\t\t<method name=\"onFinish()V\"/>\n\t\t<method name=\"onTick(J)V\"/>\n\t\t<method name=\"start()Landroid/os/CountDownTimer;\"/>\n\t</class>\n\t<class name=\"android/os/CpuUsageInfo\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getActive()J\"/>\n\t\t<method name=\"getTotal()J\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/os/DeadObjectException\" since=\"1\">\n\t\t<extends name=\"android/os/RemoteException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/os/DeadSystemException\" since=\"24\">\n\t\t<extends name=\"android/os/DeadObjectException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/os/Debug\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"attachJvmtiAgent(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)V\" since=\"28\"/>\n\t\t<method name=\"changeDebugPort(I)V\" deprecated=\"15\"/>\n\t\t<method name=\"dumpHprofData(Ljava/lang/String;)V\" since=\"3\"/>\n\t\t<method name=\"dumpService(Ljava/lang/String;Ljava/io/FileDescriptor;[Ljava/lang/String;)Z\" since=\"8\"/>\n\t\t<method name=\"enableEmulatorTraceOutput()V\"/>\n\t\t<method name=\"getBinderDeathObjectCount()I\"/>\n\t\t<method name=\"getBinderLocalObjectCount()I\"/>\n\t\t<method name=\"getBinderProxyObjectCount()I\"/>\n\t\t<method name=\"getBinderReceivedTransactions()I\"/>\n\t\t<method name=\"getBinderSentTransactions()I\"/>\n\t\t<method name=\"getGlobalAllocCount()I\" deprecated=\"23\"/>\n\t\t<method name=\"getGlobalAllocSize()I\" deprecated=\"23\"/>\n\t\t<method name=\"getGlobalClassInitCount()I\" since=\"8\" deprecated=\"23\"/>\n\t\t<method name=\"getGlobalClassInitTime()I\" since=\"8\" deprecated=\"23\"/>\n\t\t<method name=\"getGlobalExternalAllocCount()I\" deprecated=\"15\"/>\n\t\t<method name=\"getGlobalExternalAllocSize()I\" deprecated=\"15\"/>\n\t\t<method name=\"getGlobalExternalFreedCount()I\" deprecated=\"15\"/>\n\t\t<method name=\"getGlobalExternalFreedSize()I\" deprecated=\"15\"/>\n\t\t<method name=\"getGlobalFreedCount()I\" deprecated=\"23\"/>\n\t\t<method name=\"getGlobalFreedSize()I\" deprecated=\"23\"/>\n\t\t<method name=\"getGlobalGcInvocationCount()I\" deprecated=\"23\"/>\n\t\t<method name=\"getLoadedClassCount()I\"/>\n\t\t<method name=\"getMemoryInfo(Landroid/os/Debug$MemoryInfo;)V\"/>\n\t\t<method name=\"getNativeHeapAllocatedSize()J\"/>\n\t\t<method name=\"getNativeHeapFreeSize()J\"/>\n\t\t<method name=\"getNativeHeapSize()J\"/>\n\t\t<method name=\"getPss()J\" since=\"14\"/>\n\t\t<method name=\"getRuntimeStat(Ljava/lang/String;)Ljava/lang/String;\" since=\"23\"/>\n\t\t<method name=\"getRuntimeStats()Ljava/util/Map;\" since=\"23\"/>\n\t\t<method name=\"getThreadAllocCount()I\" deprecated=\"23\"/>\n\t\t<method name=\"getThreadAllocSize()I\" deprecated=\"23\"/>\n\t\t<method name=\"getThreadExternalAllocCount()I\" deprecated=\"15\"/>\n\t\t<method name=\"getThreadExternalAllocSize()I\" deprecated=\"15\"/>\n\t\t<method name=\"getThreadGcInvocationCount()I\" deprecated=\"23\"/>\n\t\t<method name=\"isDebuggerConnected()Z\"/>\n\t\t<method name=\"printLoadedClasses(I)V\"/>\n\t\t<method name=\"resetAllCounts()V\" deprecated=\"23\"/>\n\t\t<method name=\"resetGlobalAllocCount()V\" deprecated=\"23\"/>\n\t\t<method name=\"resetGlobalAllocSize()V\" deprecated=\"23\"/>\n\t\t<method name=\"resetGlobalClassInitCount()V\" since=\"8\" deprecated=\"23\"/>\n\t\t<method name=\"resetGlobalClassInitTime()V\" since=\"8\" deprecated=\"23\"/>\n\t\t<method name=\"resetGlobalExternalAllocCount()V\" deprecated=\"15\"/>\n\t\t<method name=\"resetGlobalExternalAllocSize()V\" deprecated=\"15\"/>\n\t\t<method name=\"resetGlobalExternalFreedCount()V\" deprecated=\"15\"/>\n\t\t<method name=\"resetGlobalExternalFreedSize()V\" deprecated=\"15\"/>\n\t\t<method name=\"resetGlobalFreedCount()V\" deprecated=\"23\"/>\n\t\t<method name=\"resetGlobalFreedSize()V\" deprecated=\"23\"/>\n\t\t<method name=\"resetGlobalGcInvocationCount()V\" deprecated=\"23\"/>\n\t\t<method name=\"resetThreadAllocCount()V\" deprecated=\"23\"/>\n\t\t<method name=\"resetThreadAllocSize()V\" deprecated=\"23\"/>\n\t\t<method name=\"resetThreadExternalAllocCount()V\" deprecated=\"15\"/>\n\t\t<method name=\"resetThreadExternalAllocSize()V\" deprecated=\"15\"/>\n\t\t<method name=\"resetThreadGcInvocationCount()V\" deprecated=\"23\"/>\n\t\t<method name=\"setAllocationLimit(I)I\" deprecated=\"15\"/>\n\t\t<method name=\"setGlobalAllocationLimit(I)I\" deprecated=\"15\"/>\n\t\t<method name=\"startAllocCounting()V\" deprecated=\"18\"/>\n\t\t<method name=\"startMethodTracing()V\"/>\n\t\t<method name=\"startMethodTracing(Ljava/lang/String;)V\"/>\n\t\t<method name=\"startMethodTracing(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"startMethodTracing(Ljava/lang/String;II)V\"/>\n\t\t<method name=\"startMethodTracingSampling(Ljava/lang/String;II)V\" since=\"21\"/>\n\t\t<method name=\"startNativeTracing()V\"/>\n\t\t<method name=\"stopAllocCounting()V\" deprecated=\"18\"/>\n\t\t<method name=\"stopMethodTracing()V\"/>\n\t\t<method name=\"stopNativeTracing()V\"/>\n\t\t<method name=\"threadCpuTimeNanos()J\"/>\n\t\t<method name=\"waitForDebugger()V\"/>\n\t\t<method name=\"waitingForDebugger()Z\"/>\n\t\t<field name=\"SHOW_CLASSLOADER\"/>\n\t\t<field name=\"SHOW_FULL_DETAIL\"/>\n\t\t<field name=\"SHOW_INITIALIZED\"/>\n\t\t<field name=\"TRACE_COUNT_ALLOCS\" deprecated=\"23\"/>\n\t</class>\n\t<class name=\"android/os/Debug$InstructionCount\" since=\"1\" deprecated=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"collect()Z\" deprecated=\"29\"/>\n\t\t<method name=\"globalMethodInvocations()I\" deprecated=\"29\"/>\n\t\t<method name=\"globalTotal()I\" deprecated=\"29\"/>\n\t\t<method name=\"resetAndStart()Z\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/os/Debug$MemoryInfo\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\" since=\"5\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getMemoryStat(Ljava/lang/String;)Ljava/lang/String;\" since=\"23\"/>\n\t\t<method name=\"getMemoryStats()Ljava/util/Map;\" since=\"23\"/>\n\t\t<method name=\"getOtherLabel(I)Ljava/lang/String;\" since=\"14\" removed=\"19\"/>\n\t\t<method name=\"getOtherPrivateDirty(I)I\" since=\"14\" removed=\"19\"/>\n\t\t<method name=\"getOtherPss(I)I\" since=\"14\" removed=\"19\"/>\n\t\t<method name=\"getOtherSharedDirty(I)I\" since=\"14\" removed=\"19\"/>\n\t\t<method name=\"getTotalPrivateClean()I\" since=\"19\"/>\n\t\t<method name=\"getTotalPrivateDirty()I\" since=\"5\"/>\n\t\t<method name=\"getTotalPss()I\" since=\"5\"/>\n\t\t<method name=\"getTotalSharedClean()I\" since=\"19\"/>\n\t\t<method name=\"getTotalSharedDirty()I\" since=\"5\"/>\n\t\t<method name=\"getTotalSwappablePss()I\" since=\"19\"/>\n\t\t<method name=\"readFromParcel(Landroid/os/Parcel;)V\" since=\"5\"/>\n\t\t<field name=\"CREATOR\" since=\"5\"/>\n\t\t<field name=\"dalvikPrivateDirty\"/>\n\t\t<field name=\"dalvikPss\"/>\n\t\t<field name=\"dalvikSharedDirty\"/>\n\t\t<field name=\"nativePrivateDirty\"/>\n\t\t<field name=\"nativePss\"/>\n\t\t<field name=\"nativeSharedDirty\"/>\n\t\t<field name=\"otherPrivateDirty\"/>\n\t\t<field name=\"otherPss\"/>\n\t\t<field name=\"otherSharedDirty\"/>\n\t</class>\n\t<class name=\"android/os/DropBoxManager\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addData(Ljava/lang/String;[BI)V\"/>\n\t\t<method name=\"addFile(Ljava/lang/String;Ljava/io/File;I)V\"/>\n\t\t<method name=\"addText(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getNextEntry(Ljava/lang/String;J)Landroid/os/DropBoxManager$Entry;\"/>\n\t\t<method name=\"isTagEnabled(Ljava/lang/String;)Z\"/>\n\t\t<field name=\"ACTION_DROPBOX_ENTRY_ADDED\" since=\"11\"/>\n\t\t<field name=\"EXTRA_DROPPED_COUNT\" since=\"29\"/>\n\t\t<field name=\"EXTRA_TAG\" since=\"11\"/>\n\t\t<field name=\"EXTRA_TIME\" since=\"11\"/>\n\t\t<field name=\"IS_EMPTY\"/>\n\t\t<field name=\"IS_GZIPPED\"/>\n\t\t<field name=\"IS_TEXT\"/>\n\t</class>\n\t<class name=\"android/os/DropBoxManager$Entry\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"java/io/Closeable\" since=\"9\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;J)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;JLandroid/os/ParcelFileDescriptor;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;JLjava/io/File;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;JLjava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;J[BI)V\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"getFlags()I\"/>\n\t\t<method name=\"getInputStream()Ljava/io/InputStream;\"/>\n\t\t<method name=\"getTag()Ljava/lang/String;\"/>\n\t\t<method name=\"getText(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getTimeMillis()J\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/os/Environment\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getDataDirectory()Ljava/io/File;\"/>\n\t\t<method name=\"getDownloadCacheDirectory()Ljava/io/File;\"/>\n\t\t<method name=\"getExternalStorageDirectory()Ljava/io/File;\" deprecated=\"29\"/>\n\t\t<method name=\"getExternalStoragePublicDirectory(Ljava/lang/String;)Ljava/io/File;\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"getExternalStorageState()Ljava/lang/String;\"/>\n\t\t<method name=\"getExternalStorageState(Ljava/io/File;)Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"getRootDirectory()Ljava/io/File;\"/>\n\t\t<method name=\"getStorageState(Ljava/io/File;)Ljava/lang/String;\" since=\"19\" deprecated=\"21\"/>\n\t\t<method name=\"isExternalStorageEmulated()Z\" since=\"11\"/>\n\t\t<method name=\"isExternalStorageEmulated(Ljava/io/File;)Z\" since=\"21\"/>\n\t\t<method name=\"isExternalStorageLegacy()Z\" since=\"29\"/>\n\t\t<method name=\"isExternalStorageLegacy(Ljava/io/File;)Z\" since=\"29\"/>\n\t\t<method name=\"isExternalStorageRemovable()Z\" since=\"9\"/>\n\t\t<method name=\"isExternalStorageRemovable(Ljava/io/File;)Z\" since=\"21\"/>\n\t\t<field name=\"DIRECTORY_ALARMS\" since=\"8\"/>\n\t\t<field name=\"DIRECTORY_AUDIOBOOKS\" since=\"29\"/>\n\t\t<field name=\"DIRECTORY_DCIM\" since=\"8\"/>\n\t\t<field name=\"DIRECTORY_DOCUMENTS\" since=\"19\"/>\n\t\t<field name=\"DIRECTORY_DOWNLOADS\" since=\"8\"/>\n\t\t<field name=\"DIRECTORY_MOVIES\" since=\"8\"/>\n\t\t<field name=\"DIRECTORY_MUSIC\" since=\"8\"/>\n\t\t<field name=\"DIRECTORY_NOTIFICATIONS\" since=\"8\"/>\n\t\t<field name=\"DIRECTORY_PICTURES\" since=\"8\"/>\n\t\t<field name=\"DIRECTORY_PODCASTS\" since=\"8\"/>\n\t\t<field name=\"DIRECTORY_RINGTONES\" since=\"8\"/>\n\t\t<field name=\"DIRECTORY_SCREENSHOTS\" since=\"29\"/>\n\t\t<field name=\"MEDIA_BAD_REMOVAL\"/>\n\t\t<field name=\"MEDIA_CHECKING\" since=\"3\"/>\n\t\t<field name=\"MEDIA_EJECTING\" since=\"23\"/>\n\t\t<field name=\"MEDIA_MOUNTED\"/>\n\t\t<field name=\"MEDIA_MOUNTED_READ_ONLY\"/>\n\t\t<field name=\"MEDIA_NOFS\" since=\"3\"/>\n\t\t<field name=\"MEDIA_REMOVED\"/>\n\t\t<field name=\"MEDIA_SHARED\"/>\n\t\t<field name=\"MEDIA_UNKNOWN\" since=\"19\"/>\n\t\t<field name=\"MEDIA_UNMOUNTABLE\"/>\n\t\t<field name=\"MEDIA_UNMOUNTED\"/>\n\t</class>\n\t<class name=\"android/os/FileObserver\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;)V\" since=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;I)V\" since=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/List;)V\" since=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/List;I)V\" since=\"29\"/>\n\t\t<method name=\"onEvent(ILjava/lang/String;)V\"/>\n\t\t<method name=\"startWatching()V\"/>\n\t\t<method name=\"stopWatching()V\"/>\n\t\t<field name=\"ACCESS\"/>\n\t\t<field name=\"ALL_EVENTS\"/>\n\t\t<field name=\"ATTRIB\"/>\n\t\t<field name=\"CLOSE_NOWRITE\"/>\n\t\t<field name=\"CLOSE_WRITE\"/>\n\t\t<field name=\"CREATE\"/>\n\t\t<field name=\"DELETE\"/>\n\t\t<field name=\"DELETE_SELF\"/>\n\t\t<field name=\"MODIFY\"/>\n\t\t<field name=\"MOVED_FROM\"/>\n\t\t<field name=\"MOVED_TO\"/>\n\t\t<field name=\"MOVE_SELF\"/>\n\t\t<field name=\"OPEN\"/>\n\t</class>\n\t<class name=\"android/os/FileUriExposedException\" since=\"24\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/os/FileUtils\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"closeQuietly(Ljava/io/FileDescriptor;)V\" deprecated=\"30\"/>\n\t\t<method name=\"closeQuietly(Ljava/lang/AutoCloseable;)V\" deprecated=\"30\"/>\n\t\t<method name=\"copy(Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;)J\"/>\n\t\t<method name=\"copy(Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;Landroid/os/CancellationSignal;Ljava/util/concurrent/Executor;Landroid/os/FileUtils$ProgressListener;)J\"/>\n\t\t<method name=\"copy(Ljava/io/InputStream;Ljava/io/OutputStream;)J\"/>\n\t\t<method name=\"copy(Ljava/io/InputStream;Ljava/io/OutputStream;Landroid/os/CancellationSignal;Ljava/util/concurrent/Executor;Landroid/os/FileUtils$ProgressListener;)J\"/>\n\t</class>\n\t<class name=\"android/os/FileUtils$ProgressListener\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onProgress(J)V\"/>\n\t</class>\n\t<class name=\"android/os/Handler\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Handler$Callback;)V\" since=\"3\" deprecated=\"30\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Looper;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Looper;Landroid/os/Handler$Callback;)V\" since=\"3\"/>\n\t\t<method name=\"createAsync(Landroid/os/Looper;)Landroid/os/Handler;\" since=\"28\"/>\n\t\t<method name=\"createAsync(Landroid/os/Looper;Landroid/os/Handler$Callback;)Landroid/os/Handler;\" since=\"28\"/>\n\t\t<method name=\"dispatchMessage(Landroid/os/Message;)V\"/>\n\t\t<method name=\"dump(Landroid/util/Printer;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getLooper()Landroid/os/Looper;\"/>\n\t\t<method name=\"getMessageName(Landroid/os/Message;)Ljava/lang/String;\" since=\"14\"/>\n\t\t<method name=\"handleMessage(Landroid/os/Message;)V\"/>\n\t\t<method name=\"hasCallbacks(Ljava/lang/Runnable;)Z\" since=\"29\"/>\n\t\t<method name=\"hasMessages(I)Z\"/>\n\t\t<method name=\"hasMessages(ILjava/lang/Object;)Z\"/>\n\t\t<method name=\"obtainMessage()Landroid/os/Message;\"/>\n\t\t<method name=\"obtainMessage(I)Landroid/os/Message;\"/>\n\t\t<method name=\"obtainMessage(III)Landroid/os/Message;\"/>\n\t\t<method name=\"obtainMessage(IIILjava/lang/Object;)Landroid/os/Message;\"/>\n\t\t<method name=\"obtainMessage(ILjava/lang/Object;)Landroid/os/Message;\"/>\n\t\t<method name=\"post(Ljava/lang/Runnable;)Z\"/>\n\t\t<method name=\"postAtFrontOfQueue(Ljava/lang/Runnable;)Z\"/>\n\t\t<method name=\"postAtTime(Ljava/lang/Runnable;J)Z\"/>\n\t\t<method name=\"postAtTime(Ljava/lang/Runnable;Ljava/lang/Object;J)Z\"/>\n\t\t<method name=\"postDelayed(Ljava/lang/Runnable;J)Z\"/>\n\t\t<method name=\"postDelayed(Ljava/lang/Runnable;Ljava/lang/Object;J)Z\" since=\"28\"/>\n\t\t<method name=\"removeCallbacks(Ljava/lang/Runnable;)V\"/>\n\t\t<method name=\"removeCallbacks(Ljava/lang/Runnable;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"removeCallbacksAndMessages(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"removeMessages(I)V\"/>\n\t\t<method name=\"removeMessages(ILjava/lang/Object;)V\"/>\n\t\t<method name=\"sendEmptyMessage(I)Z\"/>\n\t\t<method name=\"sendEmptyMessageAtTime(IJ)Z\"/>\n\t\t<method name=\"sendEmptyMessageDelayed(IJ)Z\"/>\n\t\t<method name=\"sendMessage(Landroid/os/Message;)Z\"/>\n\t\t<method name=\"sendMessageAtFrontOfQueue(Landroid/os/Message;)Z\"/>\n\t\t<method name=\"sendMessageAtTime(Landroid/os/Message;J)Z\"/>\n\t\t<method name=\"sendMessageDelayed(Landroid/os/Message;J)Z\"/>\n\t</class>\n\t<class name=\"android/os/Handler$Callback\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"handleMessage(Landroid/os/Message;)Z\"/>\n\t</class>\n\t<class name=\"android/os/HandlerThread\" since=\"1\">\n\t\t<extends name=\"java/lang/Thread\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"getLooper()Landroid/os/Looper;\"/>\n\t\t<method name=\"getThreadId()I\"/>\n\t\t<method name=\"onLooperPrepared()V\"/>\n\t\t<method name=\"quit()Z\" since=\"5\"/>\n\t\t<method name=\"quitSafely()Z\" since=\"18\"/>\n\t</class>\n\t<class name=\"android/os/HardwarePropertiesManager\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getCpuUsages()[Landroid/os/CpuUsageInfo;\"/>\n\t\t<method name=\"getDeviceTemperatures(II)[F\"/>\n\t\t<method name=\"getFanSpeeds()[F\"/>\n\t\t<field name=\"DEVICE_TEMPERATURE_BATTERY\"/>\n\t\t<field name=\"DEVICE_TEMPERATURE_CPU\"/>\n\t\t<field name=\"DEVICE_TEMPERATURE_GPU\"/>\n\t\t<field name=\"DEVICE_TEMPERATURE_SKIN\"/>\n\t\t<field name=\"TEMPERATURE_CURRENT\"/>\n\t\t<field name=\"TEMPERATURE_SHUTDOWN\"/>\n\t\t<field name=\"TEMPERATURE_THROTTLING\"/>\n\t\t<field name=\"TEMPERATURE_THROTTLING_BELOW_VR_MIN\"/>\n\t\t<field name=\"UNDEFINED_TEMPERATURE\"/>\n\t</class>\n\t<class name=\"android/os/IBinder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"dump(Ljava/io/FileDescriptor;[Ljava/lang/String;)V\" since=\"3\"/>\n\t\t<method name=\"dumpAsync(Ljava/io/FileDescriptor;[Ljava/lang/String;)V\" since=\"13\"/>\n\t\t<method name=\"getInterfaceDescriptor()Ljava/lang/String;\"/>\n\t\t<method name=\"isBinderAlive()Z\"/>\n\t\t<method name=\"linkToDeath(Landroid/os/IBinder$DeathRecipient;I)V\"/>\n\t\t<method name=\"pingBinder()Z\"/>\n\t\t<method name=\"queryLocalInterface(Ljava/lang/String;)Landroid/os/IInterface;\"/>\n\t\t<method name=\"transact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z\"/>\n\t\t<method name=\"unlinkToDeath(Landroid/os/IBinder$DeathRecipient;I)Z\"/>\n\t\t<field name=\"DUMP_TRANSACTION\"/>\n\t\t<field name=\"FIRST_CALL_TRANSACTION\"/>\n\t\t<field name=\"FLAG_ONEWAY\"/>\n\t\t<field name=\"INTERFACE_TRANSACTION\"/>\n\t\t<field name=\"LAST_CALL_TRANSACTION\"/>\n\t\t<field name=\"LIKE_TRANSACTION\" since=\"15\"/>\n\t\t<field name=\"PING_TRANSACTION\"/>\n\t\t<field name=\"TWEET_TRANSACTION\" since=\"13\"/>\n\t</class>\n\t<class name=\"android/os/IBinder$DeathRecipient\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"binderDied()V\"/>\n\t</class>\n\t<class name=\"android/os/IInterface\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"asBinder()Landroid/os/IBinder;\"/>\n\t</class>\n\t<class name=\"android/os/LocaleList\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>([Ljava/util/Locale;)V\"/>\n\t\t<method name=\"forLanguageTags(Ljava/lang/String;)Landroid/os/LocaleList;\"/>\n\t\t<method name=\"get(I)Ljava/util/Locale;\"/>\n\t\t<method name=\"getAdjustedDefault()Landroid/os/LocaleList;\"/>\n\t\t<method name=\"getDefault()Landroid/os/LocaleList;\"/>\n\t\t<method name=\"getEmptyLocaleList()Landroid/os/LocaleList;\"/>\n\t\t<method name=\"getFirstMatch([Ljava/lang/String;)Ljava/util/Locale;\"/>\n\t\t<method name=\"indexOf(Ljava/util/Locale;)I\"/>\n\t\t<method name=\"isEmpty()Z\"/>\n\t\t<method name=\"isPseudoLocale(Landroid/icu/util/ULocale;)Z\" since=\"29\"/>\n\t\t<method name=\"setDefault(Landroid/os/LocaleList;)V\"/>\n\t\t<method name=\"size()I\"/>\n\t\t<method name=\"toLanguageTags()Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/os/Looper\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"dump(Landroid/util/Printer;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getMainLooper()Landroid/os/Looper;\"/>\n\t\t<method name=\"getQueue()Landroid/os/MessageQueue;\" since=\"23\"/>\n\t\t<method name=\"getThread()Ljava/lang/Thread;\" since=\"3\"/>\n\t\t<method name=\"isCurrentThread()Z\" since=\"23\"/>\n\t\t<method name=\"loop()V\"/>\n\t\t<method name=\"myLooper()Landroid/os/Looper;\"/>\n\t\t<method name=\"myQueue()Landroid/os/MessageQueue;\"/>\n\t\t<method name=\"prepare()V\"/>\n\t\t<method name=\"prepareMainLooper()V\" deprecated=\"30\"/>\n\t\t<method name=\"quit()V\"/>\n\t\t<method name=\"quitSafely()V\" since=\"18\"/>\n\t\t<method name=\"setMessageLogging(Landroid/util/Printer;)V\"/>\n\t</class>\n\t<class name=\"android/os/MemoryFile\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"allowPurging(Z)Z\" deprecated=\"27\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"getInputStream()Ljava/io/InputStream;\"/>\n\t\t<method name=\"getOutputStream()Ljava/io/OutputStream;\"/>\n\t\t<method name=\"isPurgingAllowed()Z\" deprecated=\"27\"/>\n\t\t<method name=\"length()I\"/>\n\t\t<method name=\"readBytes([BIII)I\"/>\n\t\t<method name=\"writeBytes([BIII)V\"/>\n\t</class>\n\t<class name=\"android/os/Message\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"copyFrom(Landroid/os/Message;)V\"/>\n\t\t<method name=\"getCallback()Ljava/lang/Runnable;\"/>\n\t\t<method name=\"getData()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getTarget()Landroid/os/Handler;\"/>\n\t\t<method name=\"getWhen()J\"/>\n\t\t<method name=\"isAsynchronous()Z\" since=\"22\"/>\n\t\t<method name=\"obtain()Landroid/os/Message;\"/>\n\t\t<method name=\"obtain(Landroid/os/Handler;)Landroid/os/Message;\"/>\n\t\t<method name=\"obtain(Landroid/os/Handler;I)Landroid/os/Message;\"/>\n\t\t<method name=\"obtain(Landroid/os/Handler;III)Landroid/os/Message;\"/>\n\t\t<method name=\"obtain(Landroid/os/Handler;IIILjava/lang/Object;)Landroid/os/Message;\"/>\n\t\t<method name=\"obtain(Landroid/os/Handler;ILjava/lang/Object;)Landroid/os/Message;\"/>\n\t\t<method name=\"obtain(Landroid/os/Handler;Ljava/lang/Runnable;)Landroid/os/Message;\"/>\n\t\t<method name=\"obtain(Landroid/os/Message;)Landroid/os/Message;\"/>\n\t\t<method name=\"peekData()Landroid/os/Bundle;\"/>\n\t\t<method name=\"recycle()V\"/>\n\t\t<method name=\"sendToTarget()V\"/>\n\t\t<method name=\"setAsynchronous(Z)V\" since=\"22\"/>\n\t\t<method name=\"setData(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"setTarget(Landroid/os/Handler;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"arg1\"/>\n\t\t<field name=\"arg2\"/>\n\t\t<field name=\"obj\"/>\n\t\t<field name=\"replyTo\"/>\n\t\t<field name=\"sendingUid\" since=\"21\"/>\n\t\t<field name=\"what\"/>\n\t</class>\n\t<class name=\"android/os/MessageQueue\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addIdleHandler(Landroid/os/MessageQueue$IdleHandler;)V\"/>\n\t\t<method name=\"addOnFileDescriptorEventListener(Ljava/io/FileDescriptor;ILandroid/os/MessageQueue$OnFileDescriptorEventListener;)V\" since=\"23\"/>\n\t\t<method name=\"isIdle()Z\" since=\"23\"/>\n\t\t<method name=\"removeIdleHandler(Landroid/os/MessageQueue$IdleHandler;)V\"/>\n\t\t<method name=\"removeOnFileDescriptorEventListener(Ljava/io/FileDescriptor;)V\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/os/MessageQueue$IdleHandler\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"queueIdle()Z\"/>\n\t</class>\n\t<class name=\"android/os/MessageQueue$OnFileDescriptorEventListener\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onFileDescriptorEvents(Ljava/io/FileDescriptor;I)I\"/>\n\t\t<field name=\"EVENT_ERROR\"/>\n\t\t<field name=\"EVENT_INPUT\"/>\n\t\t<field name=\"EVENT_OUTPUT\"/>\n\t</class>\n\t<class name=\"android/os/Messenger\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Handler;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/IBinder;)V\"/>\n\t\t<method name=\"getBinder()Landroid/os/IBinder;\"/>\n\t\t<method name=\"readMessengerOrNullFromParcel(Landroid/os/Parcel;)Landroid/os/Messenger;\"/>\n\t\t<method name=\"send(Landroid/os/Message;)V\"/>\n\t\t<method name=\"writeMessengerOrNullToParcel(Landroid/os/Messenger;Landroid/os/Parcel;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/os/NetworkOnMainThreadException\" since=\"11\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/os/OperationCanceledException\" since=\"16\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/os/Parcel\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"appendFrom(Landroid/os/Parcel;II)V\"/>\n\t\t<method name=\"createBinderArray()[Landroid/os/IBinder;\"/>\n\t\t<method name=\"createBinderArrayList()Ljava/util/ArrayList;\"/>\n\t\t<method name=\"createBooleanArray()[Z\"/>\n\t\t<method name=\"createByteArray()[B\"/>\n\t\t<method name=\"createCharArray()[C\"/>\n\t\t<method name=\"createDoubleArray()[D\"/>\n\t\t<method name=\"createFloatArray()[F\"/>\n\t\t<method name=\"createIntArray()[I\"/>\n\t\t<method name=\"createLongArray()[J\"/>\n\t\t<method name=\"createStringArray()[Ljava/lang/String;\"/>\n\t\t<method name=\"createStringArrayList()Ljava/util/ArrayList;\"/>\n\t\t<method name=\"createTypedArray(Landroid/os/Parcelable$Creator;)[Ljava/lang/Object;\"/>\n\t\t<method name=\"createTypedArrayList(Landroid/os/Parcelable$Creator;)Ljava/util/ArrayList;\"/>\n\t\t<method name=\"createTypedArrayMap(Landroid/os/Parcelable$Creator;)Landroid/util/ArrayMap;\" since=\"29\"/>\n\t\t<method name=\"createTypedSparseArray(Landroid/os/Parcelable$Creator;)Landroid/util/SparseArray;\" since=\"29\"/>\n\t\t<method name=\"dataAvail()I\"/>\n\t\t<method name=\"dataCapacity()I\"/>\n\t\t<method name=\"dataPosition()I\"/>\n\t\t<method name=\"dataSize()I\"/>\n\t\t<method name=\"enforceInterface(Ljava/lang/String;)V\"/>\n\t\t<method name=\"hasFileDescriptors()Z\"/>\n\t\t<method name=\"marshall()[B\"/>\n\t\t<method name=\"obtain()Landroid/os/Parcel;\"/>\n\t\t<method name=\"obtain(I)Landroid/os/Parcel;\" removed=\"21\"/>\n\t\t<method name=\"readArray(Ljava/lang/ClassLoader;)[Ljava/lang/Object;\"/>\n\t\t<method name=\"readArrayList(Ljava/lang/ClassLoader;)Ljava/util/ArrayList;\"/>\n\t\t<method name=\"readBinderArray([Landroid/os/IBinder;)V\"/>\n\t\t<method name=\"readBinderList(Ljava/util/List;)V\"/>\n\t\t<method name=\"readBoolean()Z\" since=\"29\"/>\n\t\t<method name=\"readBooleanArray([Z)V\"/>\n\t\t<method name=\"readBundle()Landroid/os/Bundle;\"/>\n\t\t<method name=\"readBundle(Ljava/lang/ClassLoader;)Landroid/os/Bundle;\"/>\n\t\t<method name=\"readByte()B\"/>\n\t\t<method name=\"readByteArray([B)V\"/>\n\t\t<method name=\"readCharArray([C)V\"/>\n\t\t<method name=\"readDouble()D\"/>\n\t\t<method name=\"readDoubleArray([D)V\"/>\n\t\t<method name=\"readException()V\"/>\n\t\t<method name=\"readException(ILjava/lang/String;)V\"/>\n\t\t<method name=\"readFileDescriptor()Landroid/os/ParcelFileDescriptor;\"/>\n\t\t<method name=\"readFloat()F\"/>\n\t\t<method name=\"readFloatArray([F)V\"/>\n\t\t<method name=\"readHashMap(Ljava/lang/ClassLoader;)Ljava/util/HashMap;\"/>\n\t\t<method name=\"readInt()I\"/>\n\t\t<method name=\"readIntArray([I)V\"/>\n\t\t<method name=\"readList(Ljava/util/List;Ljava/lang/ClassLoader;)V\"/>\n\t\t<method name=\"readLong()J\"/>\n\t\t<method name=\"readLongArray([J)V\"/>\n\t\t<method name=\"readMap(Ljava/util/Map;Ljava/lang/ClassLoader;)V\"/>\n\t\t<method name=\"readParcelable(Ljava/lang/ClassLoader;)Landroid/os/Parcelable;\"/>\n\t\t<method name=\"readParcelableArray(Ljava/lang/ClassLoader;)[Landroid/os/Parcelable;\"/>\n\t\t<method name=\"readParcelableList(Ljava/util/List;Ljava/lang/ClassLoader;)Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"readPersistableBundle()Landroid/os/PersistableBundle;\" since=\"21\"/>\n\t\t<method name=\"readPersistableBundle(Ljava/lang/ClassLoader;)Landroid/os/PersistableBundle;\" since=\"21\"/>\n\t\t<method name=\"readSerializable()Ljava/io/Serializable;\"/>\n\t\t<method name=\"readSize()Landroid/util/Size;\" since=\"21\"/>\n\t\t<method name=\"readSizeF()Landroid/util/SizeF;\" since=\"21\"/>\n\t\t<method name=\"readSparseArray(Ljava/lang/ClassLoader;)Landroid/util/SparseArray;\"/>\n\t\t<method name=\"readSparseBooleanArray()Landroid/util/SparseBooleanArray;\"/>\n\t\t<method name=\"readString()Ljava/lang/String;\"/>\n\t\t<method name=\"readStringArray([Ljava/lang/String;)V\"/>\n\t\t<method name=\"readStringList(Ljava/util/List;)V\"/>\n\t\t<method name=\"readStrongBinder()Landroid/os/IBinder;\"/>\n\t\t<method name=\"readTypedArray([Ljava/lang/Object;Landroid/os/Parcelable$Creator;)V\"/>\n\t\t<method name=\"readTypedList(Ljava/util/List;Landroid/os/Parcelable$Creator;)V\"/>\n\t\t<method name=\"readTypedObject(Landroid/os/Parcelable$Creator;)Ljava/lang/Object;\" since=\"23\"/>\n\t\t<method name=\"readValue(Ljava/lang/ClassLoader;)Ljava/lang/Object;\"/>\n\t\t<method name=\"recycle()V\"/>\n\t\t<method name=\"setDataCapacity(I)V\"/>\n\t\t<method name=\"setDataPosition(I)V\"/>\n\t\t<method name=\"setDataSize(I)V\"/>\n\t\t<method name=\"unmarshall([BII)V\"/>\n\t\t<method name=\"writeArray([Ljava/lang/Object;)V\"/>\n\t\t<method name=\"writeBinderArray([Landroid/os/IBinder;)V\"/>\n\t\t<method name=\"writeBinderList(Ljava/util/List;)V\"/>\n\t\t<method name=\"writeBoolean(Z)V\" since=\"29\"/>\n\t\t<method name=\"writeBooleanArray([Z)V\"/>\n\t\t<method name=\"writeBundle(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"writeByte(B)V\"/>\n\t\t<method name=\"writeByteArray([B)V\"/>\n\t\t<method name=\"writeByteArray([BII)V\"/>\n\t\t<method name=\"writeCharArray([C)V\"/>\n\t\t<method name=\"writeDouble(D)V\"/>\n\t\t<method name=\"writeDoubleArray([D)V\"/>\n\t\t<method name=\"writeException(Ljava/lang/Exception;)V\"/>\n\t\t<method name=\"writeFileDescriptor(Ljava/io/FileDescriptor;)V\"/>\n\t\t<method name=\"writeFloat(F)V\"/>\n\t\t<method name=\"writeFloatArray([F)V\"/>\n\t\t<method name=\"writeInt(I)V\"/>\n\t\t<method name=\"writeIntArray([I)V\"/>\n\t\t<method name=\"writeInterfaceToken(Ljava/lang/String;)V\"/>\n\t\t<method name=\"writeList(Ljava/util/List;)V\"/>\n\t\t<method name=\"writeLong(J)V\"/>\n\t\t<method name=\"writeLongArray([J)V\"/>\n\t\t<method name=\"writeMap(Ljava/util/Map;)V\"/>\n\t\t<method name=\"writeNoException()V\"/>\n\t\t<method name=\"writeParcelable(Landroid/os/Parcelable;I)V\"/>\n\t\t<method name=\"writeParcelableArray([Landroid/os/Parcelable;I)V\"/>\n\t\t<method name=\"writeParcelableList(Ljava/util/List;I)V\" since=\"29\"/>\n\t\t<method name=\"writePersistableBundle(Landroid/os/PersistableBundle;)V\" since=\"21\"/>\n\t\t<method name=\"writeSerializable(Ljava/io/Serializable;)V\"/>\n\t\t<method name=\"writeSize(Landroid/util/Size;)V\" since=\"21\"/>\n\t\t<method name=\"writeSizeF(Landroid/util/SizeF;)V\" since=\"21\"/>\n\t\t<method name=\"writeSparseArray(Landroid/util/SparseArray;)V\"/>\n\t\t<method name=\"writeSparseBooleanArray(Landroid/util/SparseBooleanArray;)V\"/>\n\t\t<method name=\"writeString(Ljava/lang/String;)V\"/>\n\t\t<method name=\"writeStringArray([Ljava/lang/String;)V\"/>\n\t\t<method name=\"writeStringList(Ljava/util/List;)V\"/>\n\t\t<method name=\"writeStrongBinder(Landroid/os/IBinder;)V\"/>\n\t\t<method name=\"writeStrongInterface(Landroid/os/IInterface;)V\"/>\n\t\t<method name=\"writeTypedArray([Landroid/os/Parcelable;I)V\"/>\n\t\t<method name=\"writeTypedArrayMap(Landroid/util/ArrayMap;I)V\" since=\"29\"/>\n\t\t<method name=\"writeTypedList(Ljava/util/List;)V\"/>\n\t\t<method name=\"writeTypedObject(Landroid/os/Parcelable;I)V\" since=\"23\"/>\n\t\t<method name=\"writeTypedSparseArray(Landroid/util/SparseArray;I)V\" since=\"29\"/>\n\t\t<method name=\"writeValue(Ljava/lang/Object;)V\"/>\n\t\t<field name=\"STRING_CREATOR\"/>\n\t</class>\n\t<class name=\"android/os/ParcelFileDescriptor\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"java/io/Closeable\" since=\"16\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/ParcelFileDescriptor;)V\"/>\n\t\t<method name=\"adoptFd(I)Landroid/os/ParcelFileDescriptor;\" since=\"13\"/>\n\t\t<method name=\"canDetectErrors()Z\" since=\"19\"/>\n\t\t<method name=\"checkError()V\" since=\"19\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"closeWithError(Ljava/lang/String;)V\" since=\"19\"/>\n\t\t<method name=\"createPipe()[Landroid/os/ParcelFileDescriptor;\" since=\"9\"/>\n\t\t<method name=\"createReliablePipe()[Landroid/os/ParcelFileDescriptor;\" since=\"19\"/>\n\t\t<method name=\"createReliableSocketPair()[Landroid/os/ParcelFileDescriptor;\" since=\"19\"/>\n\t\t<method name=\"createSocketPair()[Landroid/os/ParcelFileDescriptor;\" since=\"19\"/>\n\t\t<method name=\"detachFd()I\" since=\"12\"/>\n\t\t<method name=\"dup()Landroid/os/ParcelFileDescriptor;\" since=\"14\"/>\n\t\t<method name=\"dup(Ljava/io/FileDescriptor;)Landroid/os/ParcelFileDescriptor;\" since=\"13\"/>\n\t\t<method name=\"fromDatagramSocket(Ljava/net/DatagramSocket;)Landroid/os/ParcelFileDescriptor;\" since=\"14\"/>\n\t\t<method name=\"fromFd(I)Landroid/os/ParcelFileDescriptor;\" since=\"13\"/>\n\t\t<method name=\"fromSocket(Ljava/net/Socket;)Landroid/os/ParcelFileDescriptor;\"/>\n\t\t<method name=\"getFd()I\" since=\"12\"/>\n\t\t<method name=\"getFileDescriptor()Ljava/io/FileDescriptor;\"/>\n\t\t<method name=\"getStatSize()J\" since=\"3\"/>\n\t\t<method name=\"open(Ljava/io/File;I)Landroid/os/ParcelFileDescriptor;\"/>\n\t\t<method name=\"open(Ljava/io/File;ILandroid/os/Handler;Landroid/os/ParcelFileDescriptor$OnCloseListener;)Landroid/os/ParcelFileDescriptor;\" since=\"19\"/>\n\t\t<method name=\"parseMode(Ljava/lang/String;)I\" since=\"19\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"MODE_APPEND\" since=\"3\"/>\n\t\t<field name=\"MODE_CREATE\"/>\n\t\t<field name=\"MODE_READ_ONLY\"/>\n\t\t<field name=\"MODE_READ_WRITE\"/>\n\t\t<field name=\"MODE_TRUNCATE\"/>\n\t\t<field name=\"MODE_WORLD_READABLE\" deprecated=\"19\"/>\n\t\t<field name=\"MODE_WORLD_WRITEABLE\" deprecated=\"19\"/>\n\t\t<field name=\"MODE_WRITE_ONLY\"/>\n\t</class>\n\t<class name=\"android/os/ParcelFileDescriptor$AutoCloseInputStream\" since=\"1\">\n\t\t<extends name=\"java/io/FileInputStream\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/ParcelFileDescriptor;)V\"/>\n\t</class>\n\t<class name=\"android/os/ParcelFileDescriptor$AutoCloseOutputStream\" since=\"1\">\n\t\t<extends name=\"java/io/FileOutputStream\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/ParcelFileDescriptor;)V\"/>\n\t</class>\n\t<class name=\"android/os/ParcelFileDescriptor$FileDescriptorDetachedException\" since=\"19\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/os/ParcelFileDescriptor$OnCloseListener\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onClose(Ljava/io/IOException;)V\"/>\n\t</class>\n\t<class name=\"android/os/ParcelFormatException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/os/ParcelUuid\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/UUID;)V\"/>\n\t\t<method name=\"fromString(Ljava/lang/String;)Landroid/os/ParcelUuid;\"/>\n\t\t<method name=\"getUuid()Ljava/util/UUID;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/os/Parcelable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"describeContents()I\"/>\n\t\t<method name=\"writeToParcel(Landroid/os/Parcel;I)V\"/>\n\t\t<field name=\"CONTENTS_FILE_DESCRIPTOR\"/>\n\t\t<field name=\"PARCELABLE_WRITE_RETURN_VALUE\"/>\n\t</class>\n\t<class name=\"android/os/Parcelable$ClassLoaderCreator\" since=\"13\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable$Creator\"/>\n\t\t<method name=\"createFromParcel(Landroid/os/Parcel;Ljava/lang/ClassLoader;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"android/os/Parcelable$Creator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;\"/>\n\t\t<method name=\"newArray(I)[Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"android/os/PatternMatcher\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"getPath()Ljava/lang/String;\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<method name=\"match(Ljava/lang/String;)Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"PATTERN_ADVANCED_GLOB\" since=\"26\"/>\n\t\t<field name=\"PATTERN_LITERAL\"/>\n\t\t<field name=\"PATTERN_PREFIX\"/>\n\t\t<field name=\"PATTERN_SIMPLE_GLOB\"/>\n\t</class>\n\t<class name=\"android/os/PersistableBundle\" since=\"21\">\n\t\t<extends name=\"android/os/BaseBundle\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/PersistableBundle;)V\"/>\n\t\t<method name=\"deepCopy()Landroid/os/PersistableBundle;\" since=\"26\"/>\n\t\t<method name=\"getPersistableBundle(Ljava/lang/String;)Landroid/os/PersistableBundle;\"/>\n\t\t<method name=\"putPersistableBundle(Ljava/lang/String;Landroid/os/PersistableBundle;)V\"/>\n\t\t<method name=\"readFromStream(Ljava/io/InputStream;)Landroid/os/PersistableBundle;\" since=\"30\"/>\n\t\t<method name=\"writeToStream(Ljava/io/OutputStream;)V\" since=\"30\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"EMPTY\"/>\n\t</class>\n\t<class name=\"android/os/PowerManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addThermalStatusListener(Landroid/os/PowerManager$OnThermalStatusChangedListener;)V\" since=\"29\"/>\n\t\t<method name=\"addThermalStatusListener(Ljava/util/concurrent/Executor;Landroid/os/PowerManager$OnThermalStatusChangedListener;)V\" since=\"29\"/>\n\t\t<method name=\"getCurrentThermalStatus()I\" since=\"29\"/>\n\t\t<method name=\"getLocationPowerSaveMode()I\" since=\"28\"/>\n\t\t<method name=\"goToSleep(J)V\" removed=\"21\"/>\n\t\t<method name=\"isDeviceIdleMode()Z\" since=\"23\"/>\n\t\t<method name=\"isIgnoringBatteryOptimizations(Ljava/lang/String;)Z\" since=\"23\"/>\n\t\t<method name=\"isInteractive()Z\" since=\"20\"/>\n\t\t<method name=\"isPowerSaveMode()Z\" since=\"21\"/>\n\t\t<method name=\"isRebootingUserspaceSupported()Z\" since=\"30\"/>\n\t\t<method name=\"isScreenOn()Z\" since=\"7\" deprecated=\"20\"/>\n\t\t<method name=\"isSustainedPerformanceModeSupported()Z\" since=\"24\"/>\n\t\t<method name=\"isWakeLockLevelSupported(I)Z\" since=\"21\"/>\n\t\t<method name=\"newWakeLock(ILjava/lang/String;)Landroid/os/PowerManager$WakeLock;\"/>\n\t\t<method name=\"reboot(Ljava/lang/String;)V\" since=\"8\"/>\n\t\t<method name=\"removeThermalStatusListener(Landroid/os/PowerManager$OnThermalStatusChangedListener;)V\" since=\"29\"/>\n\t\t<method name=\"userActivity(JZ)V\" removed=\"21\"/>\n\t\t<method name=\"wakeUp(J)V\" since=\"17\" removed=\"21\"/>\n\t\t<field name=\"ACQUIRE_CAUSES_WAKEUP\"/>\n\t\t<field name=\"ACTION_DEVICE_IDLE_MODE_CHANGED\" since=\"23\"/>\n\t\t<field name=\"ACTION_POWER_SAVE_MODE_CHANGED\" since=\"21\"/>\n\t\t<field name=\"FULL_WAKE_LOCK\" deprecated=\"17\"/>\n\t\t<field name=\"LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF\" since=\"28\"/>\n\t\t<field name=\"LOCATION_MODE_FOREGROUND_ONLY\" since=\"28\"/>\n\t\t<field name=\"LOCATION_MODE_GPS_DISABLED_WHEN_SCREEN_OFF\" since=\"28\"/>\n\t\t<field name=\"LOCATION_MODE_NO_CHANGE\" since=\"28\"/>\n\t\t<field name=\"LOCATION_MODE_THROTTLE_REQUESTS_WHEN_SCREEN_OFF\" since=\"29\"/>\n\t\t<field name=\"ON_AFTER_RELEASE\"/>\n\t\t<field name=\"PARTIAL_WAKE_LOCK\"/>\n\t\t<field name=\"PROXIMITY_SCREEN_OFF_WAKE_LOCK\" since=\"21\"/>\n\t\t<field name=\"RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY\" since=\"21\"/>\n\t\t<field name=\"SCREEN_BRIGHT_WAKE_LOCK\" deprecated=\"15\"/>\n\t\t<field name=\"SCREEN_DIM_WAKE_LOCK\" deprecated=\"17\"/>\n\t\t<field name=\"THERMAL_STATUS_CRITICAL\" since=\"29\"/>\n\t\t<field name=\"THERMAL_STATUS_EMERGENCY\" since=\"29\"/>\n\t\t<field name=\"THERMAL_STATUS_LIGHT\" since=\"29\"/>\n\t\t<field name=\"THERMAL_STATUS_MODERATE\" since=\"29\"/>\n\t\t<field name=\"THERMAL_STATUS_NONE\" since=\"29\"/>\n\t\t<field name=\"THERMAL_STATUS_SEVERE\" since=\"29\"/>\n\t\t<field name=\"THERMAL_STATUS_SHUTDOWN\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/os/PowerManager$OnThermalStatusChangedListener\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onThermalStatusChanged(I)V\"/>\n\t</class>\n\t<class name=\"android/os/PowerManager$WakeLock\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"acquire()V\"/>\n\t\t<method name=\"acquire(J)V\"/>\n\t\t<method name=\"isHeld()Z\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"release(I)V\" since=\"21\"/>\n\t\t<method name=\"setReferenceCounted(Z)V\"/>\n\t\t<method name=\"setWorkSource(Landroid/os/WorkSource;)V\" since=\"9\"/>\n\t</class>\n\t<class name=\"android/os/Process\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getElapsedCpuTime()J\"/>\n\t\t<method name=\"getExclusiveCores()[I\" since=\"24\"/>\n\t\t<method name=\"getGidForName(Ljava/lang/String;)I\"/>\n\t\t<method name=\"getStartElapsedRealtime()J\" since=\"24\"/>\n\t\t<method name=\"getStartUptimeMillis()J\" since=\"24\"/>\n\t\t<method name=\"getThreadPriority(I)I\"/>\n\t\t<method name=\"getUidForName(Ljava/lang/String;)I\"/>\n\t\t<method name=\"is64Bit()Z\" since=\"23\"/>\n\t\t<method name=\"isApplicationUid(I)Z\" since=\"24\"/>\n\t\t<method name=\"isIsolated()Z\" since=\"28\"/>\n\t\t<method name=\"killProcess(I)V\"/>\n\t\t<method name=\"myPid()I\"/>\n\t\t<method name=\"myTid()I\"/>\n\t\t<method name=\"myUid()I\" since=\"2\"/>\n\t\t<method name=\"myUserHandle()Landroid/os/UserHandle;\" since=\"17\"/>\n\t\t<method name=\"sendSignal(II)V\"/>\n\t\t<method name=\"setThreadPriority(I)V\"/>\n\t\t<method name=\"setThreadPriority(II)V\"/>\n\t\t<method name=\"supportsProcesses()Z\" deprecated=\"15\"/>\n\t\t<field name=\"BLUETOOTH_GID\" removed=\"18\"/>\n\t\t<field name=\"BLUETOOTH_UID\" since=\"29\"/>\n\t\t<field name=\"FIRST_APPLICATION_UID\"/>\n\t\t<field name=\"INVALID_UID\" since=\"29\"/>\n\t\t<field name=\"LAST_APPLICATION_UID\"/>\n\t\t<field name=\"PHONE_UID\"/>\n\t\t<field name=\"ROOT_UID\" since=\"29\"/>\n\t\t<field name=\"SHELL_UID\" since=\"29\"/>\n\t\t<field name=\"SIGNAL_KILL\"/>\n\t\t<field name=\"SIGNAL_QUIT\"/>\n\t\t<field name=\"SIGNAL_USR1\"/>\n\t\t<field name=\"SYSTEM_UID\"/>\n\t\t<field name=\"THREAD_PRIORITY_AUDIO\"/>\n\t\t<field name=\"THREAD_PRIORITY_BACKGROUND\"/>\n\t\t<field name=\"THREAD_PRIORITY_DEFAULT\"/>\n\t\t<field name=\"THREAD_PRIORITY_DISPLAY\"/>\n\t\t<field name=\"THREAD_PRIORITY_FOREGROUND\"/>\n\t\t<field name=\"THREAD_PRIORITY_LESS_FAVORABLE\"/>\n\t\t<field name=\"THREAD_PRIORITY_LOWEST\"/>\n\t\t<field name=\"THREAD_PRIORITY_MORE_FAVORABLE\"/>\n\t\t<field name=\"THREAD_PRIORITY_URGENT_AUDIO\"/>\n\t\t<field name=\"THREAD_PRIORITY_URGENT_DISPLAY\"/>\n\t\t<field name=\"THREAD_PRIORITY_VIDEO\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/os/ProxyFileDescriptorCallback\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onFsync()V\"/>\n\t\t<method name=\"onGetSize()J\"/>\n\t\t<method name=\"onRead(JI[B)I\"/>\n\t\t<method name=\"onRelease()V\"/>\n\t\t<method name=\"onWrite(JI[B)I\"/>\n\t</class>\n\t<class name=\"android/os/RecoverySystem\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" removed=\"23\"/>\n\t\t<method name=\"installPackage(Landroid/content/Context;Ljava/io/File;)V\"/>\n\t\t<method name=\"rebootWipeCache(Landroid/content/Context;)V\" since=\"14\"/>\n\t\t<method name=\"rebootWipeUserData(Landroid/content/Context;)V\"/>\n\t\t<method name=\"verifyPackage(Ljava/io/File;Landroid/os/RecoverySystem$ProgressListener;Ljava/io/File;)V\"/>\n\t</class>\n\t<class name=\"android/os/RecoverySystem$ProgressListener\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onProgress(I)V\"/>\n\t</class>\n\t<class name=\"android/os/RemoteCallbackList\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"beginBroadcast()I\"/>\n\t\t<method name=\"finishBroadcast()V\"/>\n\t\t<method name=\"getBroadcastCookie(I)Ljava/lang/Object;\" since=\"4\"/>\n\t\t<method name=\"getBroadcastItem(I)Landroid/os/IInterface;\"/>\n\t\t<method name=\"getRegisteredCallbackCookie(I)Ljava/lang/Object;\" since=\"26\"/>\n\t\t<method name=\"getRegisteredCallbackCount()I\" since=\"17\"/>\n\t\t<method name=\"getRegisteredCallbackItem(I)Landroid/os/IInterface;\" since=\"26\"/>\n\t\t<method name=\"kill()V\"/>\n\t\t<method name=\"onCallbackDied(Landroid/os/IInterface;)V\"/>\n\t\t<method name=\"onCallbackDied(Landroid/os/IInterface;Ljava/lang/Object;)V\" since=\"4\"/>\n\t\t<method name=\"register(Landroid/os/IInterface;)Z\"/>\n\t\t<method name=\"register(Landroid/os/IInterface;Ljava/lang/Object;)Z\" since=\"4\"/>\n\t\t<method name=\"unregister(Landroid/os/IInterface;)Z\"/>\n\t</class>\n\t<class name=\"android/os/RemoteException\" since=\"1\">\n\t\t<extends name=\"android/util/AndroidException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" since=\"15\"/>\n\t</class>\n\t<class name=\"android/os/ResultReceiver\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Handler;)V\"/>\n\t\t<method name=\"onReceiveResult(ILandroid/os/Bundle;)V\"/>\n\t\t<method name=\"send(ILandroid/os/Bundle;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/os/SharedMemory\" since=\"27\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<method name=\"create(Ljava/lang/String;I)Landroid/os/SharedMemory;\"/>\n\t\t<method name=\"getSize()I\"/>\n\t\t<method name=\"map(III)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"mapReadOnly()Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"mapReadWrite()Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"setProtect(I)Z\"/>\n\t\t<method name=\"unmap(Ljava/nio/ByteBuffer;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/os/StatFs\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getAvailableBlocks()I\" deprecated=\"18\"/>\n\t\t<method name=\"getAvailableBlocksLong()J\" since=\"18\"/>\n\t\t<method name=\"getAvailableBytes()J\" since=\"18\"/>\n\t\t<method name=\"getBlockCount()I\" deprecated=\"18\"/>\n\t\t<method name=\"getBlockCountLong()J\" since=\"18\"/>\n\t\t<method name=\"getBlockSize()I\" deprecated=\"18\"/>\n\t\t<method name=\"getBlockSizeLong()J\" since=\"18\"/>\n\t\t<method name=\"getFreeBlocks()I\" deprecated=\"18\"/>\n\t\t<method name=\"getFreeBlocksLong()J\" since=\"18\"/>\n\t\t<method name=\"getFreeBytes()J\" since=\"18\"/>\n\t\t<method name=\"getTotalBytes()J\" since=\"18\"/>\n\t\t<method name=\"restat(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/os/StrictMode\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"allowThreadDiskReads()Landroid/os/StrictMode$ThreadPolicy;\"/>\n\t\t<method name=\"allowThreadDiskWrites()Landroid/os/StrictMode$ThreadPolicy;\"/>\n\t\t<method name=\"enableDefaults()V\"/>\n\t\t<method name=\"getThreadPolicy()Landroid/os/StrictMode$ThreadPolicy;\"/>\n\t\t<method name=\"getVmPolicy()Landroid/os/StrictMode$VmPolicy;\"/>\n\t\t<method name=\"noteSlowCall(Ljava/lang/String;)V\" since=\"11\"/>\n\t\t<method name=\"setThreadPolicy(Landroid/os/StrictMode$ThreadPolicy;)V\"/>\n\t\t<method name=\"setVmPolicy(Landroid/os/StrictMode$VmPolicy;)V\"/>\n\t</class>\n\t<class name=\"android/os/StrictMode$OnThreadViolationListener\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onThreadViolation(Landroid/os/strictmode/Violation;)V\"/>\n\t</class>\n\t<class name=\"android/os/StrictMode$OnVmViolationListener\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onVmViolation(Landroid/os/strictmode/Violation;)V\"/>\n\t</class>\n\t<class name=\"android/os/StrictMode$ThreadPolicy\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"LAX\"/>\n\t</class>\n\t<class name=\"android/os/StrictMode$ThreadPolicy$Builder\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/StrictMode$ThreadPolicy;)V\"/>\n\t\t<method name=\"build()Landroid/os/StrictMode$ThreadPolicy;\"/>\n\t\t<method name=\"detectAll()Landroid/os/StrictMode$ThreadPolicy$Builder;\"/>\n\t\t<method name=\"detectCustomSlowCalls()Landroid/os/StrictMode$ThreadPolicy$Builder;\" since=\"11\"/>\n\t\t<method name=\"detectDiskReads()Landroid/os/StrictMode$ThreadPolicy$Builder;\"/>\n\t\t<method name=\"detectDiskWrites()Landroid/os/StrictMode$ThreadPolicy$Builder;\"/>\n\t\t<method name=\"detectNetwork()Landroid/os/StrictMode$ThreadPolicy$Builder;\"/>\n\t\t<method name=\"detectResourceMismatches()Landroid/os/StrictMode$ThreadPolicy$Builder;\" since=\"23\"/>\n\t\t<method name=\"detectUnbufferedIo()Landroid/os/StrictMode$ThreadPolicy$Builder;\" since=\"26\"/>\n\t\t<method name=\"penaltyDeath()Landroid/os/StrictMode$ThreadPolicy$Builder;\"/>\n\t\t<method name=\"penaltyDeathOnNetwork()Landroid/os/StrictMode$ThreadPolicy$Builder;\" since=\"11\"/>\n\t\t<method name=\"penaltyDialog()Landroid/os/StrictMode$ThreadPolicy$Builder;\"/>\n\t\t<method name=\"penaltyDropBox()Landroid/os/StrictMode$ThreadPolicy$Builder;\"/>\n\t\t<method name=\"penaltyFlashScreen()Landroid/os/StrictMode$ThreadPolicy$Builder;\" since=\"11\"/>\n\t\t<method name=\"penaltyListener(Ljava/util/concurrent/Executor;Landroid/os/StrictMode$OnThreadViolationListener;)Landroid/os/StrictMode$ThreadPolicy$Builder;\" since=\"28\"/>\n\t\t<method name=\"penaltyLog()Landroid/os/StrictMode$ThreadPolicy$Builder;\"/>\n\t\t<method name=\"permitAll()Landroid/os/StrictMode$ThreadPolicy$Builder;\"/>\n\t\t<method name=\"permitCustomSlowCalls()Landroid/os/StrictMode$ThreadPolicy$Builder;\" since=\"11\"/>\n\t\t<method name=\"permitDiskReads()Landroid/os/StrictMode$ThreadPolicy$Builder;\"/>\n\t\t<method name=\"permitDiskWrites()Landroid/os/StrictMode$ThreadPolicy$Builder;\"/>\n\t\t<method name=\"permitNetwork()Landroid/os/StrictMode$ThreadPolicy$Builder;\"/>\n\t\t<method name=\"permitResourceMismatches()Landroid/os/StrictMode$ThreadPolicy$Builder;\" since=\"23\"/>\n\t\t<method name=\"permitUnbufferedIo()Landroid/os/StrictMode$ThreadPolicy$Builder;\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/os/StrictMode$VmPolicy\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"LAX\"/>\n\t</class>\n\t<class name=\"android/os/StrictMode$VmPolicy$Builder\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/StrictMode$VmPolicy;)V\" since=\"11\"/>\n\t\t<method name=\"build()Landroid/os/StrictMode$VmPolicy;\"/>\n\t\t<method name=\"detectActivityLeaks()Landroid/os/StrictMode$VmPolicy$Builder;\" since=\"11\"/>\n\t\t<method name=\"detectAll()Landroid/os/StrictMode$VmPolicy$Builder;\"/>\n\t\t<method name=\"detectCleartextNetwork()Landroid/os/StrictMode$VmPolicy$Builder;\" since=\"23\"/>\n\t\t<method name=\"detectContentUriWithoutPermission()Landroid/os/StrictMode$VmPolicy$Builder;\" since=\"26\"/>\n\t\t<method name=\"detectCredentialProtectedWhileLocked()Landroid/os/StrictMode$VmPolicy$Builder;\" since=\"29\"/>\n\t\t<method name=\"detectFileUriExposure()Landroid/os/StrictMode$VmPolicy$Builder;\" since=\"18\"/>\n\t\t<method name=\"detectImplicitDirectBoot()Landroid/os/StrictMode$VmPolicy$Builder;\" since=\"29\"/>\n\t\t<method name=\"detectLeakedClosableObjects()Landroid/os/StrictMode$VmPolicy$Builder;\" since=\"11\"/>\n\t\t<method name=\"detectLeakedRegistrationObjects()Landroid/os/StrictMode$VmPolicy$Builder;\" since=\"16\"/>\n\t\t<method name=\"detectLeakedSqlLiteObjects()Landroid/os/StrictMode$VmPolicy$Builder;\"/>\n\t\t<method name=\"detectNonSdkApiUsage()Landroid/os/StrictMode$VmPolicy$Builder;\" since=\"28\"/>\n\t\t<method name=\"detectUntaggedSockets()Landroid/os/StrictMode$VmPolicy$Builder;\" since=\"26\"/>\n\t\t<method name=\"penaltyDeath()Landroid/os/StrictMode$VmPolicy$Builder;\"/>\n\t\t<method name=\"penaltyDeathOnCleartextNetwork()Landroid/os/StrictMode$VmPolicy$Builder;\" since=\"23\"/>\n\t\t<method name=\"penaltyDeathOnFileUriExposure()Landroid/os/StrictMode$VmPolicy$Builder;\" since=\"24\"/>\n\t\t<method name=\"penaltyDropBox()Landroid/os/StrictMode$VmPolicy$Builder;\"/>\n\t\t<method name=\"penaltyListener(Ljava/util/concurrent/Executor;Landroid/os/StrictMode$OnVmViolationListener;)Landroid/os/StrictMode$VmPolicy$Builder;\" since=\"28\"/>\n\t\t<method name=\"penaltyLog()Landroid/os/StrictMode$VmPolicy$Builder;\"/>\n\t\t<method name=\"permitNonSdkApiUsage()Landroid/os/StrictMode$VmPolicy$Builder;\" since=\"28\"/>\n\t\t<method name=\"setClassInstanceLimit(Ljava/lang/Class;I)Landroid/os/StrictMode$VmPolicy$Builder;\" since=\"11\"/>\n\t</class>\n\t<class name=\"android/os/SystemClock\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"currentGnssTimeClock()Ljava/time/Clock;\" since=\"29\"/>\n\t\t<method name=\"currentThreadTimeMillis()J\"/>\n\t\t<method name=\"elapsedRealtime()J\"/>\n\t\t<method name=\"elapsedRealtimeNanos()J\" since=\"17\"/>\n\t\t<method name=\"setCurrentTimeMillis(J)Z\"/>\n\t\t<method name=\"sleep(J)V\"/>\n\t\t<method name=\"uptimeMillis()J\"/>\n\t</class>\n\t<class name=\"android/os/TestLooperManager\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"execute(Landroid/os/Message;)V\"/>\n\t\t<method name=\"getMessageQueue()Landroid/os/MessageQueue;\"/>\n\t\t<method name=\"hasMessages(Landroid/os/Handler;Ljava/lang/Object;I)Z\"/>\n\t\t<method name=\"hasMessages(Landroid/os/Handler;Ljava/lang/Object;Ljava/lang/Runnable;)Z\"/>\n\t\t<method name=\"next()Landroid/os/Message;\"/>\n\t\t<method name=\"recycle(Landroid/os/Message;)V\"/>\n\t\t<method name=\"release()V\"/>\n\t</class>\n\t<class name=\"android/os/TokenWatcher\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Handler;Ljava/lang/String;)V\"/>\n\t\t<method name=\"acquire(Landroid/os/IBinder;Ljava/lang/String;)V\"/>\n\t\t<method name=\"acquired()V\"/>\n\t\t<method name=\"cleanup(Landroid/os/IBinder;Z)V\"/>\n\t\t<method name=\"dump()V\"/>\n\t\t<method name=\"dump(Ljava/io/PrintWriter;)V\" since=\"16\"/>\n\t\t<method name=\"isAcquired()Z\"/>\n\t\t<method name=\"release(Landroid/os/IBinder;)V\"/>\n\t\t<method name=\"released()V\"/>\n\t</class>\n\t<class name=\"android/os/Trace\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"beginAsyncSection(Ljava/lang/String;I)V\" since=\"29\"/>\n\t\t<method name=\"beginSection(Ljava/lang/String;)V\"/>\n\t\t<method name=\"endAsyncSection(Ljava/lang/String;I)V\" since=\"29\"/>\n\t\t<method name=\"endSection()V\"/>\n\t\t<method name=\"isEnabled()Z\" since=\"29\"/>\n\t\t<method name=\"setCounter(Ljava/lang/String;J)V\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/os/TransactionTooLargeException\" since=\"15\">\n\t\t<extends name=\"android/os/RemoteException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/os/UserHandle\" since=\"17\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"getUserHandleForUid(I)Landroid/os/UserHandle;\" since=\"24\"/>\n\t\t<method name=\"readFromParcel(Landroid/os/Parcel;)Landroid/os/UserHandle;\"/>\n\t\t<method name=\"writeToParcel(Landroid/os/UserHandle;Landroid/os/Parcel;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/os/UserManager\" since=\"17\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createUserCreationIntent(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/PersistableBundle;)Landroid/content/Intent;\" since=\"24\"/>\n\t\t<method name=\"getApplicationRestrictions(Ljava/lang/String;)Landroid/os/Bundle;\" since=\"18\"/>\n\t\t<method name=\"getSerialNumberForUser(Landroid/os/UserHandle;)J\"/>\n\t\t<method name=\"getUserCount()I\"/>\n\t\t<method name=\"getUserCreationTime(Landroid/os/UserHandle;)J\" since=\"23\"/>\n\t\t<method name=\"getUserForSerialNumber(J)Landroid/os/UserHandle;\"/>\n\t\t<method name=\"getUserName()Ljava/lang/String;\"/>\n\t\t<method name=\"getUserProfiles()Ljava/util/List;\" since=\"21\"/>\n\t\t<method name=\"getUserRestrictions()Landroid/os/Bundle;\" since=\"18\"/>\n\t\t<method name=\"getUserRestrictions(Landroid/os/UserHandle;)Landroid/os/Bundle;\" since=\"18\"/>\n\t\t<method name=\"hasUserRestriction(Ljava/lang/String;)Z\" since=\"21\"/>\n\t\t<method name=\"isDemoUser()Z\" since=\"25\"/>\n\t\t<method name=\"isQuietModeEnabled(Landroid/os/UserHandle;)Z\" since=\"24\"/>\n\t\t<method name=\"isSystemUser()Z\" since=\"23\"/>\n\t\t<method name=\"isUserAGoat()Z\"/>\n\t\t<method name=\"isUserRunning(Landroid/os/UserHandle;)Z\"/>\n\t\t<method name=\"isUserRunningOrStopping(Landroid/os/UserHandle;)Z\"/>\n\t\t<method name=\"isUserUnlocked()Z\" since=\"24\"/>\n\t\t<method name=\"isUserUnlocked(Landroid/os/UserHandle;)Z\" since=\"24\"/>\n\t\t<method name=\"requestQuietModeEnabled(ZLandroid/os/UserHandle;)Z\" since=\"28\"/>\n\t\t<method name=\"setRestrictionsChallenge(Ljava/lang/String;)Z\" since=\"19\" deprecated=\"23\"/>\n\t\t<method name=\"setUserRestriction(Ljava/lang/String;Z)V\" since=\"18\" deprecated=\"21\"/>\n\t\t<method name=\"setUserRestrictions(Landroid/os/Bundle;)V\" since=\"18\" deprecated=\"21\"/>\n\t\t<method name=\"setUserRestrictions(Landroid/os/Bundle;Landroid/os/UserHandle;)V\" since=\"18\" deprecated=\"21\"/>\n\t\t<method name=\"supportsMultipleUsers()Z\" since=\"24\"/>\n\t\t<field name=\"ALLOW_PARENT_PROFILE_APP_LINKING\" since=\"23\"/>\n\t\t<field name=\"DISALLOW_ADD_MANAGED_PROFILE\" since=\"26\"/>\n\t\t<field name=\"DISALLOW_ADD_USER\" since=\"21\"/>\n\t\t<field name=\"DISALLOW_ADJUST_VOLUME\" since=\"21\"/>\n\t\t<field name=\"DISALLOW_AIRPLANE_MODE\" since=\"28\"/>\n\t\t<field name=\"DISALLOW_AMBIENT_DISPLAY\" since=\"28\"/>\n\t\t<field name=\"DISALLOW_APPS_CONTROL\" since=\"21\"/>\n\t\t<field name=\"DISALLOW_AUTOFILL\" since=\"26\"/>\n\t\t<field name=\"DISALLOW_BLUETOOTH\" since=\"26\"/>\n\t\t<field name=\"DISALLOW_BLUETOOTH_SHARING\" since=\"26\"/>\n\t\t<field name=\"DISALLOW_CONFIG_BLUETOOTH\" since=\"18\"/>\n\t\t<field name=\"DISALLOW_CONFIG_BRIGHTNESS\" since=\"28\"/>\n\t\t<field name=\"DISALLOW_CONFIG_CELL_BROADCASTS\" since=\"21\"/>\n\t\t<field name=\"DISALLOW_CONFIG_CREDENTIALS\" since=\"18\"/>\n\t\t<field name=\"DISALLOW_CONFIG_DATE_TIME\" since=\"28\"/>\n\t\t<field name=\"DISALLOW_CONFIG_LOCALE\" since=\"28\"/>\n\t\t<field name=\"DISALLOW_CONFIG_LOCATION\" since=\"28\"/>\n\t\t<field name=\"DISALLOW_CONFIG_MOBILE_NETWORKS\" since=\"21\"/>\n\t\t<field name=\"DISALLOW_CONFIG_PRIVATE_DNS\" since=\"29\"/>\n\t\t<field name=\"DISALLOW_CONFIG_SCREEN_TIMEOUT\" since=\"28\"/>\n\t\t<field name=\"DISALLOW_CONFIG_TETHERING\" since=\"21\"/>\n\t\t<field name=\"DISALLOW_CONFIG_VPN\" since=\"21\"/>\n\t\t<field name=\"DISALLOW_CONFIG_WIFI\" since=\"18\"/>\n\t\t<field name=\"DISALLOW_CONTENT_CAPTURE\" since=\"29\"/>\n\t\t<field name=\"DISALLOW_CONTENT_SUGGESTIONS\" since=\"29\"/>\n\t\t<field name=\"DISALLOW_CREATE_WINDOWS\" since=\"21\"/>\n\t\t<field name=\"DISALLOW_CROSS_PROFILE_COPY_PASTE\" since=\"21\"/>\n\t\t<field name=\"DISALLOW_DATA_ROAMING\" since=\"24\"/>\n\t\t<field name=\"DISALLOW_DEBUGGING_FEATURES\" since=\"21\"/>\n\t\t<field name=\"DISALLOW_FACTORY_RESET\" since=\"21\"/>\n\t\t<field name=\"DISALLOW_FUN\" since=\"23\"/>\n\t\t<field name=\"DISALLOW_INSTALL_APPS\" since=\"18\"/>\n\t\t<field name=\"DISALLOW_INSTALL_UNKNOWN_SOURCES\" since=\"18\"/>\n\t\t<field name=\"DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY\" since=\"29\"/>\n\t\t<field name=\"DISALLOW_MODIFY_ACCOUNTS\" since=\"18\"/>\n\t\t<field name=\"DISALLOW_MOUNT_PHYSICAL_MEDIA\" since=\"21\"/>\n\t\t<field name=\"DISALLOW_NETWORK_RESET\" since=\"23\"/>\n\t\t<field name=\"DISALLOW_OUTGOING_BEAM\" since=\"22\"/>\n\t\t<field name=\"DISALLOW_OUTGOING_CALLS\" since=\"21\"/>\n\t\t<field name=\"DISALLOW_PRINTING\" since=\"28\"/>\n\t\t<field name=\"DISALLOW_REMOVE_MANAGED_PROFILE\" since=\"26\"/>\n\t\t<field name=\"DISALLOW_REMOVE_USER\" since=\"18\"/>\n\t\t<field name=\"DISALLOW_SAFE_BOOT\" since=\"23\"/>\n\t\t<field name=\"DISALLOW_SET_USER_ICON\" since=\"24\"/>\n\t\t<field name=\"DISALLOW_SET_WALLPAPER\" since=\"24\"/>\n\t\t<field name=\"DISALLOW_SHARE_INTO_MANAGED_PROFILE\" since=\"28\"/>\n\t\t<field name=\"DISALLOW_SHARE_LOCATION\" since=\"18\"/>\n\t\t<field name=\"DISALLOW_SMS\" since=\"21\"/>\n\t\t<field name=\"DISALLOW_SYSTEM_ERROR_DIALOGS\" since=\"28\"/>\n\t\t<field name=\"DISALLOW_UNIFIED_PASSWORD\" since=\"28\"/>\n\t\t<field name=\"DISALLOW_UNINSTALL_APPS\" since=\"18\"/>\n\t\t<field name=\"DISALLOW_UNMUTE_MICROPHONE\" since=\"21\"/>\n\t\t<field name=\"DISALLOW_USB_FILE_TRANSFER\" since=\"18\"/>\n\t\t<field name=\"DISALLOW_USER_SWITCH\" since=\"28\"/>\n\t\t<field name=\"ENSURE_VERIFY_APPS\" since=\"21\"/>\n\t\t<field name=\"KEY_RESTRICTIONS_PENDING\" since=\"22\"/>\n\t\t<field name=\"USER_CREATION_FAILED_NOT_PERMITTED\" since=\"24\"/>\n\t\t<field name=\"USER_CREATION_FAILED_NO_MORE_USERS\" since=\"24\"/>\n\t\t<field name=\"USER_OPERATION_ERROR_CURRENT_USER\" since=\"28\"/>\n\t\t<field name=\"USER_OPERATION_ERROR_LOW_STORAGE\" since=\"28\"/>\n\t\t<field name=\"USER_OPERATION_ERROR_MANAGED_PROFILE\" since=\"28\"/>\n\t\t<field name=\"USER_OPERATION_ERROR_MAX_RUNNING_USERS\" since=\"28\"/>\n\t\t<field name=\"USER_OPERATION_ERROR_MAX_USERS\" since=\"28\"/>\n\t\t<field name=\"USER_OPERATION_ERROR_UNKNOWN\" since=\"28\"/>\n\t\t<field name=\"USER_OPERATION_SUCCESS\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/os/UserManager$UserOperationException\" since=\"28\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"getUserOperationResult()I\"/>\n\t</class>\n\t<class name=\"android/os/VibrationEffect\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"createOneShot(JI)Landroid/os/VibrationEffect;\"/>\n\t\t<method name=\"createPredefined(I)Landroid/os/VibrationEffect;\" since=\"29\"/>\n\t\t<method name=\"createWaveform([JI)Landroid/os/VibrationEffect;\"/>\n\t\t<method name=\"createWaveform([J[II)Landroid/os/VibrationEffect;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"DEFAULT_AMPLITUDE\"/>\n\t\t<field name=\"EFFECT_CLICK\" since=\"29\"/>\n\t\t<field name=\"EFFECT_DOUBLE_CLICK\" since=\"29\"/>\n\t\t<field name=\"EFFECT_HEAVY_CLICK\" since=\"29\"/>\n\t\t<field name=\"EFFECT_TICK\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/os/Vibrator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"cancel()V\"/>\n\t\t<method name=\"hasAmplitudeControl()Z\" since=\"26\"/>\n\t\t<method name=\"hasVibrator()Z\" since=\"11\"/>\n\t\t<method name=\"vibrate(J)V\" deprecated=\"26\"/>\n\t\t<method name=\"vibrate(JLandroid/media/AudioAttributes;)V\" since=\"21\" deprecated=\"26\"/>\n\t\t<method name=\"vibrate(Landroid/os/VibrationEffect;)V\" since=\"26\"/>\n\t\t<method name=\"vibrate(Landroid/os/VibrationEffect;Landroid/media/AudioAttributes;)V\" since=\"26\"/>\n\t\t<method name=\"vibrate([JI)V\" deprecated=\"26\"/>\n\t\t<method name=\"vibrate([JILandroid/media/AudioAttributes;)V\" since=\"21\" deprecated=\"26\"/>\n\t</class>\n\t<class name=\"android/os/WorkSource\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/WorkSource;)V\"/>\n\t\t<method name=\"add(Landroid/os/WorkSource;)Z\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"diff(Landroid/os/WorkSource;)Z\"/>\n\t\t<method name=\"remove(Landroid/os/WorkSource;)Z\"/>\n\t\t<method name=\"set(Landroid/os/WorkSource;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/os/health/HealthStats\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getDataType()Ljava/lang/String;\"/>\n\t\t<method name=\"getMeasurement(I)J\"/>\n\t\t<method name=\"getMeasurementKeyAt(I)I\"/>\n\t\t<method name=\"getMeasurementKeyCount()I\"/>\n\t\t<method name=\"getMeasurements(I)Ljava/util/Map;\"/>\n\t\t<method name=\"getMeasurementsKeyAt(I)I\"/>\n\t\t<method name=\"getMeasurementsKeyCount()I\"/>\n\t\t<method name=\"getStats(I)Ljava/util/Map;\"/>\n\t\t<method name=\"getStatsKeyAt(I)I\"/>\n\t\t<method name=\"getStatsKeyCount()I\"/>\n\t\t<method name=\"getTimer(I)Landroid/os/health/TimerStat;\"/>\n\t\t<method name=\"getTimerCount(I)I\"/>\n\t\t<method name=\"getTimerKeyAt(I)I\"/>\n\t\t<method name=\"getTimerKeyCount()I\"/>\n\t\t<method name=\"getTimerTime(I)J\"/>\n\t\t<method name=\"getTimers(I)Ljava/util/Map;\"/>\n\t\t<method name=\"getTimersKeyAt(I)I\"/>\n\t\t<method name=\"getTimersKeyCount()I\"/>\n\t\t<method name=\"hasMeasurement(I)Z\"/>\n\t\t<method name=\"hasMeasurements(I)Z\"/>\n\t\t<method name=\"hasStats(I)Z\"/>\n\t\t<method name=\"hasTimer(I)Z\"/>\n\t\t<method name=\"hasTimers(I)Z\"/>\n\t</class>\n\t<class name=\"android/os/health/PackageHealthStats\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"MEASUREMENTS_WAKEUP_ALARMS_COUNT\"/>\n\t\t<field name=\"STATS_SERVICES\"/>\n\t</class>\n\t<class name=\"android/os/health/PidHealthStats\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"MEASUREMENT_WAKE_NESTING_COUNT\"/>\n\t\t<field name=\"MEASUREMENT_WAKE_START_MS\"/>\n\t\t<field name=\"MEASUREMENT_WAKE_SUM_MS\"/>\n\t</class>\n\t<class name=\"android/os/health/ProcessHealthStats\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"MEASUREMENT_ANR_COUNT\"/>\n\t\t<field name=\"MEASUREMENT_CRASHES_COUNT\"/>\n\t\t<field name=\"MEASUREMENT_FOREGROUND_MS\"/>\n\t\t<field name=\"MEASUREMENT_STARTS_COUNT\"/>\n\t\t<field name=\"MEASUREMENT_SYSTEM_TIME_MS\"/>\n\t\t<field name=\"MEASUREMENT_USER_TIME_MS\"/>\n\t</class>\n\t<class name=\"android/os/health/ServiceHealthStats\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"MEASUREMENT_LAUNCH_COUNT\"/>\n\t\t<field name=\"MEASUREMENT_START_SERVICE_COUNT\"/>\n\t</class>\n\t<class name=\"android/os/health/SystemHealthManager\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"takeMyUidSnapshot()Landroid/os/health/HealthStats;\"/>\n\t\t<method name=\"takeUidSnapshot(I)Landroid/os/health/HealthStats;\"/>\n\t\t<method name=\"takeUidSnapshots([I)[Landroid/os/health/HealthStats;\"/>\n\t</class>\n\t<class name=\"android/os/health/TimerStat\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(IJ)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"getCount()I\"/>\n\t\t<method name=\"getTime()J\"/>\n\t\t<method name=\"setCount(I)V\"/>\n\t\t<method name=\"setTime(J)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/os/health/UidHealthStats\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"MEASUREMENT_BLUETOOTH_IDLE_MS\"/>\n\t\t<field name=\"MEASUREMENT_BLUETOOTH_POWER_MAMS\"/>\n\t\t<field name=\"MEASUREMENT_BLUETOOTH_RX_BYTES\"/>\n\t\t<field name=\"MEASUREMENT_BLUETOOTH_RX_MS\"/>\n\t\t<field name=\"MEASUREMENT_BLUETOOTH_RX_PACKETS\"/>\n\t\t<field name=\"MEASUREMENT_BLUETOOTH_TX_BYTES\"/>\n\t\t<field name=\"MEASUREMENT_BLUETOOTH_TX_MS\"/>\n\t\t<field name=\"MEASUREMENT_BLUETOOTH_TX_PACKETS\"/>\n\t\t<field name=\"MEASUREMENT_BUTTON_USER_ACTIVITY_COUNT\"/>\n\t\t<field name=\"MEASUREMENT_CPU_POWER_MAMS\" deprecated=\"26\"/>\n\t\t<field name=\"MEASUREMENT_MOBILE_IDLE_MS\"/>\n\t\t<field name=\"MEASUREMENT_MOBILE_POWER_MAMS\"/>\n\t\t<field name=\"MEASUREMENT_MOBILE_RX_BYTES\"/>\n\t\t<field name=\"MEASUREMENT_MOBILE_RX_MS\"/>\n\t\t<field name=\"MEASUREMENT_MOBILE_RX_PACKETS\"/>\n\t\t<field name=\"MEASUREMENT_MOBILE_TX_BYTES\"/>\n\t\t<field name=\"MEASUREMENT_MOBILE_TX_MS\"/>\n\t\t<field name=\"MEASUREMENT_MOBILE_TX_PACKETS\"/>\n\t\t<field name=\"MEASUREMENT_OTHER_USER_ACTIVITY_COUNT\"/>\n\t\t<field name=\"MEASUREMENT_REALTIME_BATTERY_MS\"/>\n\t\t<field name=\"MEASUREMENT_REALTIME_SCREEN_OFF_BATTERY_MS\"/>\n\t\t<field name=\"MEASUREMENT_SYSTEM_CPU_TIME_MS\"/>\n\t\t<field name=\"MEASUREMENT_TOUCH_USER_ACTIVITY_COUNT\"/>\n\t\t<field name=\"MEASUREMENT_UPTIME_BATTERY_MS\"/>\n\t\t<field name=\"MEASUREMENT_UPTIME_SCREEN_OFF_BATTERY_MS\"/>\n\t\t<field name=\"MEASUREMENT_USER_CPU_TIME_MS\"/>\n\t\t<field name=\"MEASUREMENT_WIFI_FULL_LOCK_MS\"/>\n\t\t<field name=\"MEASUREMENT_WIFI_IDLE_MS\"/>\n\t\t<field name=\"MEASUREMENT_WIFI_MULTICAST_MS\"/>\n\t\t<field name=\"MEASUREMENT_WIFI_POWER_MAMS\"/>\n\t\t<field name=\"MEASUREMENT_WIFI_RUNNING_MS\"/>\n\t\t<field name=\"MEASUREMENT_WIFI_RX_BYTES\"/>\n\t\t<field name=\"MEASUREMENT_WIFI_RX_MS\"/>\n\t\t<field name=\"MEASUREMENT_WIFI_RX_PACKETS\"/>\n\t\t<field name=\"MEASUREMENT_WIFI_TX_BYTES\"/>\n\t\t<field name=\"MEASUREMENT_WIFI_TX_MS\"/>\n\t\t<field name=\"MEASUREMENT_WIFI_TX_PACKETS\"/>\n\t\t<field name=\"STATS_PACKAGES\"/>\n\t\t<field name=\"STATS_PIDS\"/>\n\t\t<field name=\"STATS_PROCESSES\"/>\n\t\t<field name=\"TIMERS_JOBS\"/>\n\t\t<field name=\"TIMERS_SENSORS\"/>\n\t\t<field name=\"TIMERS_SYNCS\"/>\n\t\t<field name=\"TIMERS_WAKELOCKS_DRAW\"/>\n\t\t<field name=\"TIMERS_WAKELOCKS_FULL\"/>\n\t\t<field name=\"TIMERS_WAKELOCKS_PARTIAL\"/>\n\t\t<field name=\"TIMERS_WAKELOCKS_WINDOW\"/>\n\t\t<field name=\"TIMER_AUDIO\"/>\n\t\t<field name=\"TIMER_BLUETOOTH_SCAN\"/>\n\t\t<field name=\"TIMER_CAMERA\"/>\n\t\t<field name=\"TIMER_FLASHLIGHT\"/>\n\t\t<field name=\"TIMER_FOREGROUND_ACTIVITY\"/>\n\t\t<field name=\"TIMER_GPS_SENSOR\"/>\n\t\t<field name=\"TIMER_MOBILE_RADIO_ACTIVE\"/>\n\t\t<field name=\"TIMER_PROCESS_STATE_BACKGROUND_MS\"/>\n\t\t<field name=\"TIMER_PROCESS_STATE_CACHED_MS\"/>\n\t\t<field name=\"TIMER_PROCESS_STATE_FOREGROUND_MS\"/>\n\t\t<field name=\"TIMER_PROCESS_STATE_FOREGROUND_SERVICE_MS\"/>\n\t\t<field name=\"TIMER_PROCESS_STATE_TOP_MS\"/>\n\t\t<field name=\"TIMER_PROCESS_STATE_TOP_SLEEPING_MS\"/>\n\t\t<field name=\"TIMER_VIBRATOR\"/>\n\t\t<field name=\"TIMER_VIDEO\"/>\n\t\t<field name=\"TIMER_WIFI_SCAN\"/>\n\t</class>\n\t<class name=\"android/os/storage/OnObbStateChangeListener\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onObbStateChange(Ljava/lang/String;I)V\"/>\n\t\t<field name=\"ERROR_ALREADY_MOUNTED\"/>\n\t\t<field name=\"ERROR_COULD_NOT_MOUNT\"/>\n\t\t<field name=\"ERROR_COULD_NOT_UNMOUNT\"/>\n\t\t<field name=\"ERROR_INTERNAL\"/>\n\t\t<field name=\"ERROR_NOT_MOUNTED\"/>\n\t\t<field name=\"ERROR_PERMISSION_DENIED\"/>\n\t\t<field name=\"MOUNTED\"/>\n\t\t<field name=\"UNMOUNTED\"/>\n\t</class>\n\t<class name=\"android/os/storage/StorageManager\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"allocateBytes(Ljava/io/FileDescriptor;J)V\" since=\"26\"/>\n\t\t<method name=\"allocateBytes(Ljava/util/UUID;J)V\" since=\"26\"/>\n\t\t<method name=\"getAllocatableBytes(Ljava/util/UUID;)J\" since=\"26\"/>\n\t\t<method name=\"getCacheQuotaBytes(Ljava/util/UUID;)J\" since=\"26\"/>\n\t\t<method name=\"getCacheSizeBytes(Ljava/util/UUID;)J\" since=\"26\"/>\n\t\t<method name=\"getMountedObbPath(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getPrimaryStorageVolume()Landroid/os/storage/StorageVolume;\" since=\"24\"/>\n\t\t<method name=\"getStorageVolume(Landroid/net/Uri;)Landroid/os/storage/StorageVolume;\" since=\"29\"/>\n\t\t<method name=\"getStorageVolume(Ljava/io/File;)Landroid/os/storage/StorageVolume;\" since=\"24\"/>\n\t\t<method name=\"getStorageVolumes()Ljava/util/List;\" since=\"24\"/>\n\t\t<method name=\"getUuidForPath(Ljava/io/File;)Ljava/util/UUID;\" since=\"26\"/>\n\t\t<method name=\"isAllocationSupported(Ljava/io/FileDescriptor;)Z\" since=\"27\"/>\n\t\t<method name=\"isCacheBehaviorGroup(Ljava/io/File;)Z\" since=\"26\"/>\n\t\t<method name=\"isCacheBehaviorTombstone(Ljava/io/File;)Z\" since=\"26\"/>\n\t\t<method name=\"isCheckpointSupported()Z\" since=\"30\"/>\n\t\t<method name=\"isEncrypted(Ljava/io/File;)Z\" since=\"24\"/>\n\t\t<method name=\"isObbMounted(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"mountObb(Ljava/lang/String;Ljava/lang/String;Landroid/os/storage/OnObbStateChangeListener;)Z\"/>\n\t\t<method name=\"openProxyFileDescriptor(ILandroid/os/ProxyFileDescriptorCallback;Landroid/os/Handler;)Landroid/os/ParcelFileDescriptor;\" since=\"26\"/>\n\t\t<method name=\"setCacheBehaviorGroup(Ljava/io/File;Z)V\" since=\"26\"/>\n\t\t<method name=\"setCacheBehaviorTombstone(Ljava/io/File;Z)V\" since=\"26\"/>\n\t\t<method name=\"unmountObb(Ljava/lang/String;ZLandroid/os/storage/OnObbStateChangeListener;)Z\"/>\n\t\t<field name=\"ACTION_MANAGE_STORAGE\" since=\"25\"/>\n\t\t<field name=\"EXTRA_REQUESTED_BYTES\" since=\"26\"/>\n\t\t<field name=\"EXTRA_UUID\" since=\"26\"/>\n\t\t<field name=\"UUID_DEFAULT\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/os/storage/StorageVolume\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"createAccessIntent(Ljava/lang/String;)Landroid/content/Intent;\" deprecated=\"29\"/>\n\t\t<method name=\"createOpenDocumentTreeIntent()Landroid/content/Intent;\" since=\"29\"/>\n\t\t<method name=\"getDescription(Landroid/content/Context;)Ljava/lang/String;\"/>\n\t\t<method name=\"getState()Ljava/lang/String;\"/>\n\t\t<method name=\"getUuid()Ljava/lang/String;\"/>\n\t\t<method name=\"isEmulated()Z\"/>\n\t\t<method name=\"isPrimary()Z\"/>\n\t\t<method name=\"isRemovable()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"EXTRA_STORAGE_VOLUME\"/>\n\t</class>\n\t<class name=\"android/os/strictmode/CleartextNetworkViolation\" since=\"28\">\n\t\t<extends name=\"android/os/strictmode/Violation\"/>\n\t</class>\n\t<class name=\"android/os/strictmode/ContentUriWithoutPermissionViolation\" since=\"28\">\n\t\t<extends name=\"android/os/strictmode/Violation\"/>\n\t</class>\n\t<class name=\"android/os/strictmode/CredentialProtectedWhileLockedViolation\" since=\"29\">\n\t\t<extends name=\"android/os/strictmode/Violation\"/>\n\t</class>\n\t<class name=\"android/os/strictmode/CustomViolation\" since=\"28\">\n\t\t<extends name=\"android/os/strictmode/Violation\"/>\n\t</class>\n\t<class name=\"android/os/strictmode/DiskReadViolation\" since=\"28\">\n\t\t<extends name=\"android/os/strictmode/Violation\"/>\n\t</class>\n\t<class name=\"android/os/strictmode/DiskWriteViolation\" since=\"28\">\n\t\t<extends name=\"android/os/strictmode/Violation\"/>\n\t</class>\n\t<class name=\"android/os/strictmode/FileUriExposedViolation\" since=\"28\">\n\t\t<extends name=\"android/os/strictmode/Violation\"/>\n\t</class>\n\t<class name=\"android/os/strictmode/ImplicitDirectBootViolation\" since=\"29\">\n\t\t<extends name=\"android/os/strictmode/Violation\"/>\n\t</class>\n\t<class name=\"android/os/strictmode/InstanceCountViolation\" since=\"28\">\n\t\t<extends name=\"android/os/strictmode/Violation\"/>\n\t\t<method name=\"getNumberOfInstances()J\"/>\n\t</class>\n\t<class name=\"android/os/strictmode/IntentReceiverLeakedViolation\" since=\"28\">\n\t\t<extends name=\"android/os/strictmode/Violation\"/>\n\t</class>\n\t<class name=\"android/os/strictmode/LeakedClosableViolation\" since=\"28\">\n\t\t<extends name=\"android/os/strictmode/Violation\"/>\n\t</class>\n\t<class name=\"android/os/strictmode/NetworkViolation\" since=\"28\">\n\t\t<extends name=\"android/os/strictmode/Violation\"/>\n\t</class>\n\t<class name=\"android/os/strictmode/NonSdkApiUsedViolation\" since=\"28\">\n\t\t<extends name=\"android/os/strictmode/Violation\"/>\n\t</class>\n\t<class name=\"android/os/strictmode/ResourceMismatchViolation\" since=\"28\">\n\t\t<extends name=\"android/os/strictmode/Violation\"/>\n\t</class>\n\t<class name=\"android/os/strictmode/ServiceConnectionLeakedViolation\" since=\"28\">\n\t\t<extends name=\"android/os/strictmode/Violation\"/>\n\t</class>\n\t<class name=\"android/os/strictmode/SqliteObjectLeakedViolation\" since=\"28\">\n\t\t<extends name=\"android/os/strictmode/Violation\"/>\n\t</class>\n\t<class name=\"android/os/strictmode/UnbufferedIoViolation\" since=\"28\">\n\t\t<extends name=\"android/os/strictmode/Violation\"/>\n\t</class>\n\t<class name=\"android/os/strictmode/UntaggedSocketViolation\" since=\"28\">\n\t\t<extends name=\"android/os/strictmode/Violation\"/>\n\t</class>\n\t<class name=\"android/os/strictmode/Violation\" since=\"28\">\n\t\t<extends name=\"java/lang/Throwable\"/>\n\t</class>\n\t<class name=\"android/os/strictmode/WebViewMethodCalledOnWrongThreadViolation\" since=\"28\">\n\t\t<extends name=\"android/os/strictmode/Violation\"/>\n\t</class>\n\t<class name=\"android/preference/CheckBoxPreference\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"android/preference/Preference\" removed=\"14\"/>\n\t\t<extends name=\"android/preference/TwoStatePreference\" since=\"14\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"getDisableDependentsState()Z\" removed=\"14\"/>\n\t\t<method name=\"getSummaryOff()Ljava/lang/CharSequence;\" removed=\"14\"/>\n\t\t<method name=\"getSummaryOn()Ljava/lang/CharSequence;\" removed=\"14\"/>\n\t\t<method name=\"isChecked()Z\" removed=\"14\"/>\n\t\t<method name=\"setChecked(Z)V\" removed=\"14\"/>\n\t\t<method name=\"setDisableDependentsState(Z)V\" removed=\"14\"/>\n\t\t<method name=\"setSummaryOff(I)V\" removed=\"14\"/>\n\t\t<method name=\"setSummaryOff(Ljava/lang/CharSequence;)V\" removed=\"14\"/>\n\t\t<method name=\"setSummaryOn(I)V\" removed=\"14\"/>\n\t\t<method name=\"setSummaryOn(Ljava/lang/CharSequence;)V\" removed=\"14\"/>\n\t</class>\n\t<class name=\"android/preference/DialogPreference\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"android/preference/Preference\"/>\n\t\t<implements name=\"android/content/DialogInterface$OnClickListener\"/>\n\t\t<implements name=\"android/content/DialogInterface$OnDismissListener\"/>\n\t\t<implements name=\"android/preference/PreferenceManager$OnActivityDestroyListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"getDialog()Landroid/app/Dialog;\" since=\"3\" deprecated=\"29\"/>\n\t\t<method name=\"getDialogIcon()Landroid/graphics/drawable/Drawable;\" deprecated=\"29\"/>\n\t\t<method name=\"getDialogLayoutResource()I\" deprecated=\"29\"/>\n\t\t<method name=\"getDialogMessage()Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"getDialogTitle()Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"getNegativeButtonText()Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"getPositiveButtonText()Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"onBindDialogView(Landroid/view/View;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onCreateDialogView()Landroid/view/View;\" deprecated=\"29\"/>\n\t\t<method name=\"onDialogClosed(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"onPrepareDialogBuilder(Landroid/app/AlertDialog$Builder;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setDialogIcon(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setDialogIcon(Landroid/graphics/drawable/Drawable;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setDialogLayoutResource(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setDialogMessage(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setDialogMessage(Ljava/lang/CharSequence;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setDialogTitle(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setDialogTitle(Ljava/lang/CharSequence;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setNegativeButtonText(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setNegativeButtonText(Ljava/lang/CharSequence;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setPositiveButtonText(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setPositiveButtonText(Ljava/lang/CharSequence;)V\" deprecated=\"29\"/>\n\t\t<method name=\"showDialog(Landroid/os/Bundle;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/EditTextPreference\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"android/preference/DialogPreference\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"getEditText()Landroid/widget/EditText;\" deprecated=\"29\"/>\n\t\t<method name=\"getText()Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"onAddEditTextToDialogView(Landroid/view/View;Landroid/widget/EditText;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setText(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/ListPreference\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"android/preference/DialogPreference\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"findIndexOfValue(Ljava/lang/String;)I\" deprecated=\"29\"/>\n\t\t<method name=\"getEntries()[Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"getEntry()Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"getEntryValues()[Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"getValue()Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"setEntries(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setEntries([Ljava/lang/CharSequence;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setEntryValues(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setEntryValues([Ljava/lang/CharSequence;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setValue(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setValueIndex(I)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/MultiSelectListPreference\" since=\"11\" deprecated=\"29\">\n\t\t<extends name=\"android/preference/DialogPreference\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"findIndexOfValue(Ljava/lang/String;)I\" deprecated=\"29\"/>\n\t\t<method name=\"getEntries()[Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"getEntryValues()[Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"getValues()Ljava/util/Set;\" deprecated=\"29\"/>\n\t\t<method name=\"setEntries(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setEntries([Ljava/lang/CharSequence;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setEntryValues(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setEntryValues([Ljava/lang/CharSequence;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setValues(Ljava/util/Set;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/Preference\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"callChangeListener(Ljava/lang/Object;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"compareTo(Landroid/preference/Preference;)I\" deprecated=\"29\"/>\n\t\t<method name=\"findPreferenceInHierarchy(Ljava/lang/String;)Landroid/preference/Preference;\" deprecated=\"29\"/>\n\t\t<method name=\"getContext()Landroid/content/Context;\" deprecated=\"29\"/>\n\t\t<method name=\"getDependency()Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getEditor()Landroid/content/SharedPreferences$Editor;\" deprecated=\"29\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"getFragment()Ljava/lang/String;\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"getIcon()Landroid/graphics/drawable/Drawable;\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"getIntent()Landroid/content/Intent;\" deprecated=\"29\"/>\n\t\t<method name=\"getKey()Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getLayoutResource()I\" deprecated=\"29\"/>\n\t\t<method name=\"getOnPreferenceChangeListener()Landroid/preference/Preference$OnPreferenceChangeListener;\" deprecated=\"29\"/>\n\t\t<method name=\"getOnPreferenceClickListener()Landroid/preference/Preference$OnPreferenceClickListener;\" deprecated=\"29\"/>\n\t\t<method name=\"getOrder()I\" deprecated=\"29\"/>\n\t\t<method name=\"getParent()Landroid/preference/PreferenceGroup;\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"getPersistedBoolean(Z)Z\" deprecated=\"29\"/>\n\t\t<method name=\"getPersistedFloat(F)F\" deprecated=\"29\"/>\n\t\t<method name=\"getPersistedInt(I)I\" deprecated=\"29\"/>\n\t\t<method name=\"getPersistedLong(J)J\" deprecated=\"29\"/>\n\t\t<method name=\"getPersistedString(Ljava/lang/String;)Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getPersistedStringSet(Ljava/util/Set;)Ljava/util/Set;\" since=\"24\" deprecated=\"29\"/>\n\t\t<method name=\"getPreferenceDataStore()Landroid/preference/PreferenceDataStore;\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"getPreferenceManager()Landroid/preference/PreferenceManager;\" deprecated=\"29\"/>\n\t\t<method name=\"getSharedPreferences()Landroid/content/SharedPreferences;\" deprecated=\"29\"/>\n\t\t<method name=\"getShouldDisableView()Z\" deprecated=\"29\"/>\n\t\t<method name=\"getSummary()Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"getTitle()Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"getTitleRes()I\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"getView(Landroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View;\" deprecated=\"29\"/>\n\t\t<method name=\"getWidgetLayoutResource()I\" deprecated=\"29\"/>\n\t\t<method name=\"hasKey()Z\" deprecated=\"29\"/>\n\t\t<method name=\"isEnabled()Z\" deprecated=\"29\"/>\n\t\t<method name=\"isIconSpaceReserved()Z\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"isPersistent()Z\" deprecated=\"29\"/>\n\t\t<method name=\"isRecycleEnabled()Z\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"isSelectable()Z\" deprecated=\"29\"/>\n\t\t<method name=\"isSingleLineTitle()Z\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"notifyChanged()V\" deprecated=\"29\"/>\n\t\t<method name=\"notifyDependencyChange(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"notifyHierarchyChanged()V\" deprecated=\"29\"/>\n\t\t<method name=\"onAttachedToActivity()V\" deprecated=\"29\"/>\n\t\t<method name=\"onAttachedToHierarchy(Landroid/preference/PreferenceManager;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onBindView(Landroid/view/View;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onClick()V\" deprecated=\"29\"/>\n\t\t<method name=\"onCreateView(Landroid/view/ViewGroup;)Landroid/view/View;\" deprecated=\"29\"/>\n\t\t<method name=\"onDependencyChanged(Landroid/preference/Preference;Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"onGetDefaultValue(Landroid/content/res/TypedArray;I)Ljava/lang/Object;\" deprecated=\"29\"/>\n\t\t<method name=\"onParentChanged(Landroid/preference/Preference;Z)V\" since=\"19\" deprecated=\"29\"/>\n\t\t<method name=\"onPrepareForRemoval()V\" deprecated=\"29\"/>\n\t\t<method name=\"onRestoreInstanceState(Landroid/os/Parcelable;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onSaveInstanceState()Landroid/os/Parcelable;\" deprecated=\"29\"/>\n\t\t<method name=\"onSetInitialValue(ZLjava/lang/Object;)V\" deprecated=\"29\"/>\n\t\t<method name=\"peekExtras()Landroid/os/Bundle;\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"persistBoolean(Z)Z\" deprecated=\"29\"/>\n\t\t<method name=\"persistFloat(F)Z\" deprecated=\"29\"/>\n\t\t<method name=\"persistInt(I)Z\" deprecated=\"29\"/>\n\t\t<method name=\"persistLong(J)Z\" deprecated=\"29\"/>\n\t\t<method name=\"persistString(Ljava/lang/String;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"persistStringSet(Ljava/util/Set;)Z\" since=\"24\" deprecated=\"29\"/>\n\t\t<method name=\"restoreHierarchyState(Landroid/os/Bundle;)V\" deprecated=\"29\"/>\n\t\t<method name=\"saveHierarchyState(Landroid/os/Bundle;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setDefaultValue(Ljava/lang/Object;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setDependency(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setEnabled(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setFragment(Ljava/lang/String;)V\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"setIcon(I)V\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"setIcon(Landroid/graphics/drawable/Drawable;)V\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"setIconSpaceReserved(Z)V\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"setIntent(Landroid/content/Intent;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setKey(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setLayoutResource(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setOnPreferenceChangeListener(Landroid/preference/Preference$OnPreferenceChangeListener;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setOnPreferenceClickListener(Landroid/preference/Preference$OnPreferenceClickListener;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setOrder(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setPersistent(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setPreferenceDataStore(Landroid/preference/PreferenceDataStore;)V\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"setRecycleEnabled(Z)V\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"setSelectable(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setShouldDisableView(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setSingleLineTitle(Z)V\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"setSummary(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setSummary(Ljava/lang/CharSequence;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setTitle(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setTitle(Ljava/lang/CharSequence;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setWidgetLayoutResource(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"shouldCommit()Z\" deprecated=\"29\"/>\n\t\t<method name=\"shouldDisableDependents()Z\" deprecated=\"29\"/>\n\t\t<method name=\"shouldPersist()Z\" deprecated=\"29\"/>\n\t\t<field name=\"DEFAULT_ORDER\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/Preference$BaseSavedState\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"android/view/AbsSavedState\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcelable;)V\" deprecated=\"29\"/>\n\t\t<field name=\"CREATOR\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/Preference$OnPreferenceChangeListener\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onPreferenceChange(Landroid/preference/Preference;Ljava/lang/Object;)Z\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/Preference$OnPreferenceClickListener\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onPreferenceClick(Landroid/preference/Preference;)Z\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/PreferenceActivity\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"android/app/ListActivity\"/>\n\t\t<implements name=\"android/preference/PreferenceFragment$OnPreferenceStartFragmentCallback\" since=\"11\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"addPreferencesFromIntent(Landroid/content/Intent;)V\" deprecated=\"15\"/>\n\t\t<method name=\"addPreferencesFromResource(I)V\" deprecated=\"15\"/>\n\t\t<method name=\"findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;\" deprecated=\"15\"/>\n\t\t<method name=\"finishPreferencePanel(Landroid/app/Fragment;ILandroid/content/Intent;)V\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"getPreferenceManager()Landroid/preference/PreferenceManager;\" deprecated=\"15\"/>\n\t\t<method name=\"getPreferenceScreen()Landroid/preference/PreferenceScreen;\" deprecated=\"15\"/>\n\t\t<method name=\"hasHeaders()Z\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"invalidateHeaders()V\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"isMultiPane()Z\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"isValidFragment(Ljava/lang/String;)Z\" since=\"19\" deprecated=\"29\"/>\n\t\t<method name=\"loadHeadersFromResource(ILjava/util/List;)V\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"onBuildHeaders(Ljava/util/List;)V\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"onBuildStartFragmentIntent(Ljava/lang/String;Landroid/os/Bundle;II)Landroid/content/Intent;\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"onGetInitialHeader()Landroid/preference/PreferenceActivity$Header;\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"onGetNewHeader()Landroid/preference/PreferenceActivity$Header;\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"onHeaderClick(Landroid/preference/PreferenceActivity$Header;I)V\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"onIsHidingHeaders()Z\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"onIsMultiPane()Z\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"onPreferenceTreeClick(Landroid/preference/PreferenceScreen;Landroid/preference/Preference;)Z\" deprecated=\"15\"/>\n\t\t<method name=\"setListFooter(Landroid/view/View;)V\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"setParentTitle(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/view/View$OnClickListener;)V\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"setPreferenceScreen(Landroid/preference/PreferenceScreen;)V\" deprecated=\"15\"/>\n\t\t<method name=\"showBreadCrumbs(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)V\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"startPreferenceFragment(Landroid/app/Fragment;Z)V\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"startPreferencePanel(Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/CharSequence;Landroid/app/Fragment;I)V\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"startWithFragment(Ljava/lang/String;Landroid/os/Bundle;Landroid/app/Fragment;I)V\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"startWithFragment(Ljava/lang/String;Landroid/os/Bundle;Landroid/app/Fragment;III)V\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"switchToHeader(Landroid/preference/PreferenceActivity$Header;)V\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"switchToHeader(Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"11\" deprecated=\"29\"/>\n\t\t<field name=\"EXTRA_NO_HEADERS\" since=\"11\" deprecated=\"29\"/>\n\t\t<field name=\"EXTRA_SHOW_FRAGMENT\" since=\"11\" deprecated=\"29\"/>\n\t\t<field name=\"EXTRA_SHOW_FRAGMENT_ARGUMENTS\" since=\"11\" deprecated=\"29\"/>\n\t\t<field name=\"EXTRA_SHOW_FRAGMENT_SHORT_TITLE\" since=\"14\" deprecated=\"29\"/>\n\t\t<field name=\"EXTRA_SHOW_FRAGMENT_TITLE\" since=\"14\" deprecated=\"29\"/>\n\t\t<field name=\"HEADER_ID_UNDEFINED\" since=\"11\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/PreferenceActivity$Header\" since=\"11\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"getBreadCrumbShortTitle(Landroid/content/res/Resources;)Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"getBreadCrumbTitle(Landroid/content/res/Resources;)Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"getSummary(Landroid/content/res/Resources;)Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"getTitle(Landroid/content/res/Resources;)Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"readFromParcel(Landroid/os/Parcel;)V\" deprecated=\"29\"/>\n\t\t<field name=\"CREATOR\" deprecated=\"29\"/>\n\t\t<field name=\"breadCrumbShortTitle\" deprecated=\"29\"/>\n\t\t<field name=\"breadCrumbShortTitleRes\" deprecated=\"29\"/>\n\t\t<field name=\"breadCrumbTitle\" deprecated=\"29\"/>\n\t\t<field name=\"breadCrumbTitleRes\" deprecated=\"29\"/>\n\t\t<field name=\"extras\" deprecated=\"29\"/>\n\t\t<field name=\"fragment\" deprecated=\"29\"/>\n\t\t<field name=\"fragmentArguments\" deprecated=\"29\"/>\n\t\t<field name=\"iconRes\" deprecated=\"29\"/>\n\t\t<field name=\"id\" deprecated=\"29\"/>\n\t\t<field name=\"intent\" deprecated=\"29\"/>\n\t\t<field name=\"summary\" deprecated=\"29\"/>\n\t\t<field name=\"summaryRes\" deprecated=\"29\"/>\n\t\t<field name=\"title\" deprecated=\"29\"/>\n\t\t<field name=\"titleRes\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/PreferenceCategory\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"android/preference/PreferenceGroup\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/PreferenceDataStore\" since=\"26\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getBoolean(Ljava/lang/String;Z)Z\" deprecated=\"29\"/>\n\t\t<method name=\"getFloat(Ljava/lang/String;F)F\" deprecated=\"29\"/>\n\t\t<method name=\"getInt(Ljava/lang/String;I)I\" deprecated=\"29\"/>\n\t\t<method name=\"getLong(Ljava/lang/String;J)J\" deprecated=\"29\"/>\n\t\t<method name=\"getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getStringSet(Ljava/lang/String;Ljava/util/Set;)Ljava/util/Set;\" deprecated=\"29\"/>\n\t\t<method name=\"putBoolean(Ljava/lang/String;Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"putFloat(Ljava/lang/String;F)V\" deprecated=\"29\"/>\n\t\t<method name=\"putInt(Ljava/lang/String;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"putLong(Ljava/lang/String;J)V\" deprecated=\"29\"/>\n\t\t<method name=\"putString(Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"putStringSet(Ljava/lang/String;Ljava/util/Set;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/PreferenceFragment\" since=\"11\" deprecated=\"28\">\n\t\t<extends name=\"android/app/Fragment\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"addPreferencesFromIntent(Landroid/content/Intent;)V\" deprecated=\"29\"/>\n\t\t<method name=\"addPreferencesFromResource(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;\" deprecated=\"29\"/>\n\t\t<method name=\"getPreferenceManager()Landroid/preference/PreferenceManager;\" deprecated=\"29\"/>\n\t\t<method name=\"getPreferenceScreen()Landroid/preference/PreferenceScreen;\" deprecated=\"29\"/>\n\t\t<method name=\"onPreferenceTreeClick(Landroid/preference/PreferenceScreen;Landroid/preference/Preference;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"setPreferenceScreen(Landroid/preference/PreferenceScreen;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/PreferenceFragment$OnPreferenceStartFragmentCallback\" since=\"11\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onPreferenceStartFragment(Landroid/preference/PreferenceFragment;Landroid/preference/Preference;)Z\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/PreferenceGroup\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"android/preference/Preference\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"addItemFromInflater(Landroid/preference/Preference;)V\" deprecated=\"29\"/>\n\t\t<method name=\"addPreference(Landroid/preference/Preference;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchRestoreInstanceState(Landroid/os/Bundle;)V\" deprecated=\"29\"/>\n\t\t<method name=\"dispatchSaveInstanceState(Landroid/os/Bundle;)V\" deprecated=\"29\"/>\n\t\t<method name=\"findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;\" deprecated=\"29\"/>\n\t\t<method name=\"getPreference(I)Landroid/preference/Preference;\" deprecated=\"29\"/>\n\t\t<method name=\"getPreferenceCount()I\" deprecated=\"29\"/>\n\t\t<method name=\"isOnSameScreenAsChildren()Z\" deprecated=\"29\"/>\n\t\t<method name=\"isOrderingAsAdded()Z\" deprecated=\"29\"/>\n\t\t<method name=\"onPrepareAddPreference(Landroid/preference/Preference;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"removeAll()V\" deprecated=\"29\"/>\n\t\t<method name=\"removePreference(Landroid/preference/Preference;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"setOrderingAsAdded(Z)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/PreferenceManager\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createPreferenceScreen(Landroid/content/Context;)Landroid/preference/PreferenceScreen;\" deprecated=\"29\"/>\n\t\t<method name=\"findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;\" deprecated=\"29\"/>\n\t\t<method name=\"getDefaultSharedPreferences(Landroid/content/Context;)Landroid/content/SharedPreferences;\" deprecated=\"29\"/>\n\t\t<method name=\"getDefaultSharedPreferencesName(Landroid/content/Context;)Ljava/lang/String;\" since=\"24\" deprecated=\"29\"/>\n\t\t<method name=\"getPreferenceDataStore()Landroid/preference/PreferenceDataStore;\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"getSharedPreferences()Landroid/content/SharedPreferences;\" deprecated=\"29\"/>\n\t\t<method name=\"getSharedPreferencesMode()I\" deprecated=\"29\"/>\n\t\t<method name=\"getSharedPreferencesName()Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"isStorageDefault()Z\" since=\"24\" deprecated=\"29\"/>\n\t\t<method name=\"isStorageDeviceProtected()Z\" since=\"24\" deprecated=\"29\"/>\n\t\t<method name=\"setDefaultValues(Landroid/content/Context;IZ)V\" deprecated=\"29\"/>\n\t\t<method name=\"setDefaultValues(Landroid/content/Context;Ljava/lang/String;IIZ)V\" deprecated=\"29\"/>\n\t\t<method name=\"setPreferenceDataStore(Landroid/preference/PreferenceDataStore;)V\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"setSharedPreferencesMode(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setSharedPreferencesName(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setStorageDefault()V\" since=\"24\" deprecated=\"29\"/>\n\t\t<method name=\"setStorageDeviceProtected()V\" since=\"24\" deprecated=\"29\"/>\n\t\t<field name=\"KEY_HAS_SET_DEFAULT_VALUES\" deprecated=\"29\"/>\n\t\t<field name=\"METADATA_KEY_PREFERENCES\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/PreferenceManager$OnActivityDestroyListener\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onActivityDestroy()V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/PreferenceManager$OnActivityResultListener\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onActivityResult(IILandroid/content/Intent;)Z\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/PreferenceManager$OnActivityStopListener\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onActivityStop()V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/PreferenceScreen\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"android/preference/PreferenceGroup\"/>\n\t\t<implements name=\"android/content/DialogInterface$OnDismissListener\"/>\n\t\t<implements name=\"android/widget/AdapterView$OnItemClickListener\"/>\n\t\t<method name=\"bind(Landroid/widget/ListView;)V\" deprecated=\"29\"/>\n\t\t<method name=\"getDialog()Landroid/app/Dialog;\" deprecated=\"29\"/>\n\t\t<method name=\"getRootAdapter()Landroid/widget/ListAdapter;\" deprecated=\"29\"/>\n\t\t<method name=\"onCreateRootAdapter()Landroid/widget/ListAdapter;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/RingtonePreference\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"android/preference/Preference\"/>\n\t\t<implements name=\"android/preference/PreferenceManager$OnActivityResultListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"getRingtoneType()I\" deprecated=\"29\"/>\n\t\t<method name=\"getShowDefault()Z\" deprecated=\"29\"/>\n\t\t<method name=\"getShowSilent()Z\" deprecated=\"29\"/>\n\t\t<method name=\"onPrepareRingtonePickerIntent(Landroid/content/Intent;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onRestoreRingtone()Landroid/net/Uri;\" deprecated=\"29\"/>\n\t\t<method name=\"onSaveRingtone(Landroid/net/Uri;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setRingtoneType(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setShowDefault(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setShowSilent(Z)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/SwitchPreference\" since=\"14\" deprecated=\"29\">\n\t\t<extends name=\"android/preference/TwoStatePreference\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"getSwitchTextOff()Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"getSwitchTextOn()Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"setSwitchTextOff(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setSwitchTextOff(Ljava/lang/CharSequence;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setSwitchTextOn(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setSwitchTextOn(Ljava/lang/CharSequence;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/preference/TwoStatePreference\" since=\"14\" deprecated=\"29\">\n\t\t<extends name=\"android/preference/Preference\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"getDisableDependentsState()Z\" deprecated=\"29\"/>\n\t\t<method name=\"getSummaryOff()Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"getSummaryOn()Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"isChecked()Z\" deprecated=\"29\"/>\n\t\t<method name=\"setChecked(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setDisableDependentsState(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setSummaryOff(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setSummaryOff(Ljava/lang/CharSequence;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setSummaryOn(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setSummaryOn(Ljava/lang/CharSequence;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/print/PageRange\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"getEnd()I\"/>\n\t\t<method name=\"getStart()I\"/>\n\t\t<field name=\"ALL_PAGES\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/print/PrintAttributes\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getColorMode()I\"/>\n\t\t<method name=\"getDuplexMode()I\" since=\"23\"/>\n\t\t<method name=\"getMediaSize()Landroid/print/PrintAttributes$MediaSize;\"/>\n\t\t<method name=\"getMinMargins()Landroid/print/PrintAttributes$Margins;\"/>\n\t\t<method name=\"getResolution()Landroid/print/PrintAttributes$Resolution;\"/>\n\t\t<field name=\"COLOR_MODE_COLOR\"/>\n\t\t<field name=\"COLOR_MODE_MONOCHROME\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"DUPLEX_MODE_LONG_EDGE\" since=\"23\"/>\n\t\t<field name=\"DUPLEX_MODE_NONE\" since=\"23\"/>\n\t\t<field name=\"DUPLEX_MODE_SHORT_EDGE\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/print/PrintAttributes$Builder\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/print/PrintAttributes;\"/>\n\t\t<method name=\"setColorMode(I)Landroid/print/PrintAttributes$Builder;\"/>\n\t\t<method name=\"setDuplexMode(I)Landroid/print/PrintAttributes$Builder;\" since=\"23\"/>\n\t\t<method name=\"setMediaSize(Landroid/print/PrintAttributes$MediaSize;)Landroid/print/PrintAttributes$Builder;\"/>\n\t\t<method name=\"setMinMargins(Landroid/print/PrintAttributes$Margins;)Landroid/print/PrintAttributes$Builder;\"/>\n\t\t<method name=\"setResolution(Landroid/print/PrintAttributes$Resolution;)Landroid/print/PrintAttributes$Builder;\"/>\n\t</class>\n\t<class name=\"android/print/PrintAttributes$Margins\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(IIII)V\"/>\n\t\t<method name=\"getBottomMils()I\"/>\n\t\t<method name=\"getLeftMils()I\"/>\n\t\t<method name=\"getRightMils()I\"/>\n\t\t<method name=\"getTopMils()I\"/>\n\t\t<field name=\"NO_MARGINS\"/>\n\t</class>\n\t<class name=\"android/print/PrintAttributes$MediaSize\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;II)V\"/>\n\t\t<method name=\"asLandscape()Landroid/print/PrintAttributes$MediaSize;\"/>\n\t\t<method name=\"asPortrait()Landroid/print/PrintAttributes$MediaSize;\"/>\n\t\t<method name=\"getHeightMils()I\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\"/>\n\t\t<method name=\"getLabel(Landroid/content/pm/PackageManager;)Ljava/lang/String;\"/>\n\t\t<method name=\"getWidthMils()I\"/>\n\t\t<method name=\"isPortrait()Z\"/>\n\t\t<field name=\"ISO_A0\"/>\n\t\t<field name=\"ISO_A1\"/>\n\t\t<field name=\"ISO_A10\"/>\n\t\t<field name=\"ISO_A2\"/>\n\t\t<field name=\"ISO_A3\"/>\n\t\t<field name=\"ISO_A4\"/>\n\t\t<field name=\"ISO_A5\"/>\n\t\t<field name=\"ISO_A6\"/>\n\t\t<field name=\"ISO_A7\"/>\n\t\t<field name=\"ISO_A8\"/>\n\t\t<field name=\"ISO_A9\"/>\n\t\t<field name=\"ISO_B0\"/>\n\t\t<field name=\"ISO_B1\"/>\n\t\t<field name=\"ISO_B10\"/>\n\t\t<field name=\"ISO_B2\"/>\n\t\t<field name=\"ISO_B3\"/>\n\t\t<field name=\"ISO_B4\"/>\n\t\t<field name=\"ISO_B5\"/>\n\t\t<field name=\"ISO_B6\"/>\n\t\t<field name=\"ISO_B7\"/>\n\t\t<field name=\"ISO_B8\"/>\n\t\t<field name=\"ISO_B9\"/>\n\t\t<field name=\"ISO_C0\"/>\n\t\t<field name=\"ISO_C1\"/>\n\t\t<field name=\"ISO_C10\"/>\n\t\t<field name=\"ISO_C2\"/>\n\t\t<field name=\"ISO_C3\"/>\n\t\t<field name=\"ISO_C4\"/>\n\t\t<field name=\"ISO_C5\"/>\n\t\t<field name=\"ISO_C6\"/>\n\t\t<field name=\"ISO_C7\"/>\n\t\t<field name=\"ISO_C8\"/>\n\t\t<field name=\"ISO_C9\"/>\n\t\t<field name=\"JIS_B0\"/>\n\t\t<field name=\"JIS_B1\"/>\n\t\t<field name=\"JIS_B10\"/>\n\t\t<field name=\"JIS_B2\"/>\n\t\t<field name=\"JIS_B3\"/>\n\t\t<field name=\"JIS_B4\"/>\n\t\t<field name=\"JIS_B5\"/>\n\t\t<field name=\"JIS_B6\"/>\n\t\t<field name=\"JIS_B7\"/>\n\t\t<field name=\"JIS_B8\"/>\n\t\t<field name=\"JIS_B9\"/>\n\t\t<field name=\"JIS_EXEC\"/>\n\t\t<field name=\"JPN_CHOU2\"/>\n\t\t<field name=\"JPN_CHOU3\"/>\n\t\t<field name=\"JPN_CHOU4\"/>\n\t\t<field name=\"JPN_HAGAKI\"/>\n\t\t<field name=\"JPN_KAHU\"/>\n\t\t<field name=\"JPN_KAKU2\"/>\n\t\t<field name=\"JPN_OUFUKU\"/>\n\t\t<field name=\"JPN_YOU4\"/>\n\t\t<field name=\"NA_FOOLSCAP\"/>\n\t\t<field name=\"NA_GOVT_LETTER\"/>\n\t\t<field name=\"NA_INDEX_3X5\"/>\n\t\t<field name=\"NA_INDEX_4X6\"/>\n\t\t<field name=\"NA_INDEX_5X8\"/>\n\t\t<field name=\"NA_JUNIOR_LEGAL\"/>\n\t\t<field name=\"NA_LEDGER\"/>\n\t\t<field name=\"NA_LEGAL\"/>\n\t\t<field name=\"NA_LETTER\"/>\n\t\t<field name=\"NA_MONARCH\"/>\n\t\t<field name=\"NA_QUARTO\"/>\n\t\t<field name=\"NA_TABLOID\"/>\n\t\t<field name=\"OM_DAI_PA_KAI\"/>\n\t\t<field name=\"OM_JUURO_KU_KAI\"/>\n\t\t<field name=\"OM_PA_KAI\"/>\n\t\t<field name=\"PRC_1\"/>\n\t\t<field name=\"PRC_10\"/>\n\t\t<field name=\"PRC_16K\"/>\n\t\t<field name=\"PRC_2\"/>\n\t\t<field name=\"PRC_3\"/>\n\t\t<field name=\"PRC_4\"/>\n\t\t<field name=\"PRC_5\"/>\n\t\t<field name=\"PRC_6\"/>\n\t\t<field name=\"PRC_7\"/>\n\t\t<field name=\"PRC_8\"/>\n\t\t<field name=\"PRC_9\"/>\n\t\t<field name=\"ROC_16K\"/>\n\t\t<field name=\"ROC_8K\"/>\n\t\t<field name=\"UNKNOWN_LANDSCAPE\"/>\n\t\t<field name=\"UNKNOWN_PORTRAIT\"/>\n\t</class>\n\t<class name=\"android/print/PrintAttributes$Resolution\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;II)V\"/>\n\t\t<method name=\"getHorizontalDpi()I\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\"/>\n\t\t<method name=\"getLabel()Ljava/lang/String;\"/>\n\t\t<method name=\"getVerticalDpi()I\"/>\n\t</class>\n\t<class name=\"android/print/PrintDocumentAdapter\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onFinish()V\"/>\n\t\t<method name=\"onLayout(Landroid/print/PrintAttributes;Landroid/print/PrintAttributes;Landroid/os/CancellationSignal;Landroid/print/PrintDocumentAdapter$LayoutResultCallback;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onStart()V\"/>\n\t\t<method name=\"onWrite([Landroid/print/PageRange;Landroid/os/ParcelFileDescriptor;Landroid/os/CancellationSignal;Landroid/print/PrintDocumentAdapter$WriteResultCallback;)V\"/>\n\t\t<field name=\"EXTRA_PRINT_PREVIEW\"/>\n\t</class>\n\t<class name=\"android/print/PrintDocumentAdapter$LayoutResultCallback\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onLayoutCancelled()V\"/>\n\t\t<method name=\"onLayoutFailed(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"onLayoutFinished(Landroid/print/PrintDocumentInfo;Z)V\"/>\n\t</class>\n\t<class name=\"android/print/PrintDocumentAdapter$WriteResultCallback\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onWriteCancelled()V\"/>\n\t\t<method name=\"onWriteFailed(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"onWriteFinished([Landroid/print/PageRange;)V\"/>\n\t</class>\n\t<class name=\"android/print/PrintDocumentInfo\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getContentType()I\"/>\n\t\t<method name=\"getDataSize()J\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getPageCount()I\"/>\n\t\t<field name=\"CONTENT_TYPE_DOCUMENT\"/>\n\t\t<field name=\"CONTENT_TYPE_PHOTO\"/>\n\t\t<field name=\"CONTENT_TYPE_UNKNOWN\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"PAGE_COUNT_UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/print/PrintDocumentInfo$Builder\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"build()Landroid/print/PrintDocumentInfo;\"/>\n\t\t<method name=\"setContentType(I)Landroid/print/PrintDocumentInfo$Builder;\"/>\n\t\t<method name=\"setPageCount(I)Landroid/print/PrintDocumentInfo$Builder;\"/>\n\t</class>\n\t<class name=\"android/print/PrintJob\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"cancel()V\"/>\n\t\t<method name=\"getId()Landroid/print/PrintJobId;\"/>\n\t\t<method name=\"getInfo()Landroid/print/PrintJobInfo;\"/>\n\t\t<method name=\"isBlocked()Z\"/>\n\t\t<method name=\"isCancelled()Z\"/>\n\t\t<method name=\"isCompleted()Z\"/>\n\t\t<method name=\"isFailed()Z\"/>\n\t\t<method name=\"isQueued()Z\"/>\n\t\t<method name=\"isStarted()Z\"/>\n\t\t<method name=\"restart()V\"/>\n\t</class>\n\t<class name=\"android/print/PrintJobId\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/print/PrintJobInfo\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getAdvancedIntOption(Ljava/lang/String;)I\" since=\"26\"/>\n\t\t<method name=\"getAdvancedStringOption(Ljava/lang/String;)Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getAttributes()Landroid/print/PrintAttributes;\"/>\n\t\t<method name=\"getCopies()I\"/>\n\t\t<method name=\"getCreationTime()J\"/>\n\t\t<method name=\"getId()Landroid/print/PrintJobId;\"/>\n\t\t<method name=\"getLabel()Ljava/lang/String;\"/>\n\t\t<method name=\"getPages()[Landroid/print/PageRange;\"/>\n\t\t<method name=\"getPrinterId()Landroid/print/PrinterId;\"/>\n\t\t<method name=\"getState()I\"/>\n\t\t<method name=\"hasAdvancedOption(Ljava/lang/String;)Z\" since=\"26\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"STATE_BLOCKED\"/>\n\t\t<field name=\"STATE_CANCELED\"/>\n\t\t<field name=\"STATE_COMPLETED\"/>\n\t\t<field name=\"STATE_CREATED\"/>\n\t\t<field name=\"STATE_FAILED\"/>\n\t\t<field name=\"STATE_QUEUED\"/>\n\t\t<field name=\"STATE_STARTED\"/>\n\t</class>\n\t<class name=\"android/print/PrintJobInfo$Builder\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/print/PrintJobInfo;)V\"/>\n\t\t<method name=\"build()Landroid/print/PrintJobInfo;\"/>\n\t\t<method name=\"putAdvancedOption(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"putAdvancedOption(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setAttributes(Landroid/print/PrintAttributes;)V\"/>\n\t\t<method name=\"setCopies(I)V\"/>\n\t\t<method name=\"setPages([Landroid/print/PageRange;)V\"/>\n\t</class>\n\t<class name=\"android/print/PrintManager\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getPrintJobs()Ljava/util/List;\"/>\n\t\t<method name=\"print(Ljava/lang/String;Landroid/print/PrintDocumentAdapter;Landroid/print/PrintAttributes;)Landroid/print/PrintJob;\"/>\n\t</class>\n\t<class name=\"android/print/PrinterCapabilitiesInfo\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getColorModes()I\"/>\n\t\t<method name=\"getDefaults()Landroid/print/PrintAttributes;\"/>\n\t\t<method name=\"getDuplexModes()I\" since=\"23\"/>\n\t\t<method name=\"getMediaSizes()Ljava/util/List;\"/>\n\t\t<method name=\"getMinMargins()Landroid/print/PrintAttributes$Margins;\"/>\n\t\t<method name=\"getResolutions()Ljava/util/List;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/print/PrinterCapabilitiesInfo$Builder\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/print/PrinterId;)V\"/>\n\t\t<method name=\"addMediaSize(Landroid/print/PrintAttributes$MediaSize;Z)Landroid/print/PrinterCapabilitiesInfo$Builder;\"/>\n\t\t<method name=\"addResolution(Landroid/print/PrintAttributes$Resolution;Z)Landroid/print/PrinterCapabilitiesInfo$Builder;\"/>\n\t\t<method name=\"build()Landroid/print/PrinterCapabilitiesInfo;\"/>\n\t\t<method name=\"setColorModes(II)Landroid/print/PrinterCapabilitiesInfo$Builder;\"/>\n\t\t<method name=\"setDuplexModes(II)Landroid/print/PrinterCapabilitiesInfo$Builder;\" since=\"23\"/>\n\t\t<method name=\"setMinMargins(Landroid/print/PrintAttributes$Margins;)Landroid/print/PrinterCapabilitiesInfo$Builder;\"/>\n\t</class>\n\t<class name=\"android/print/PrinterId\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getLocalId()Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/print/PrinterInfo\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getCapabilities()Landroid/print/PrinterCapabilitiesInfo;\"/>\n\t\t<method name=\"getDescription()Ljava/lang/String;\"/>\n\t\t<method name=\"getId()Landroid/print/PrinterId;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getStatus()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"STATUS_BUSY\"/>\n\t\t<field name=\"STATUS_IDLE\"/>\n\t\t<field name=\"STATUS_UNAVAILABLE\"/>\n\t</class>\n\t<class name=\"android/print/PrinterInfo$Builder\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/print/PrinterId;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/print/PrinterInfo;)V\"/>\n\t\t<method name=\"build()Landroid/print/PrinterInfo;\"/>\n\t\t<method name=\"setCapabilities(Landroid/print/PrinterCapabilitiesInfo;)Landroid/print/PrinterInfo$Builder;\"/>\n\t\t<method name=\"setDescription(Ljava/lang/String;)Landroid/print/PrinterInfo$Builder;\"/>\n\t\t<method name=\"setHasCustomPrinterIcon(Z)Landroid/print/PrinterInfo$Builder;\" since=\"24\"/>\n\t\t<method name=\"setIconResourceId(I)Landroid/print/PrinterInfo$Builder;\" since=\"24\"/>\n\t\t<method name=\"setInfoIntent(Landroid/app/PendingIntent;)Landroid/print/PrinterInfo$Builder;\" since=\"24\"/>\n\t\t<method name=\"setName(Ljava/lang/String;)Landroid/print/PrinterInfo$Builder;\"/>\n\t\t<method name=\"setStatus(I)Landroid/print/PrinterInfo$Builder;\"/>\n\t</class>\n\t<class name=\"android/print/pdf/PrintedPdfDocument\" since=\"19\">\n\t\t<extends name=\"android/graphics/pdf/PdfDocument\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/print/PrintAttributes;)V\"/>\n\t\t<method name=\"getPageContentRect()Landroid/graphics/Rect;\"/>\n\t\t<method name=\"getPageHeight()I\"/>\n\t\t<method name=\"getPageWidth()I\"/>\n\t\t<method name=\"startPage(I)Landroid/graphics/pdf/PdfDocument$Page;\"/>\n\t</class>\n\t<class name=\"android/printservice/CustomPrinterIconCallback\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onCustomPrinterIconLoaded(Landroid/graphics/drawable/Icon;)Z\"/>\n\t</class>\n\t<class name=\"android/printservice/PrintDocument\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getData()Landroid/os/ParcelFileDescriptor;\"/>\n\t\t<method name=\"getInfo()Landroid/print/PrintDocumentInfo;\"/>\n\t</class>\n\t<class name=\"android/printservice/PrintJob\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"block(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"cancel()Z\"/>\n\t\t<method name=\"complete()Z\"/>\n\t\t<method name=\"fail(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"getAdvancedIntOption(Ljava/lang/String;)I\"/>\n\t\t<method name=\"getAdvancedStringOption(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDocument()Landroid/printservice/PrintDocument;\"/>\n\t\t<method name=\"getId()Landroid/print/PrintJobId;\"/>\n\t\t<method name=\"getInfo()Landroid/print/PrintJobInfo;\"/>\n\t\t<method name=\"getTag()Ljava/lang/String;\"/>\n\t\t<method name=\"hasAdvancedOption(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isBlocked()Z\"/>\n\t\t<method name=\"isCancelled()Z\"/>\n\t\t<method name=\"isCompleted()Z\"/>\n\t\t<method name=\"isFailed()Z\"/>\n\t\t<method name=\"isQueued()Z\"/>\n\t\t<method name=\"isStarted()Z\"/>\n\t\t<method name=\"setProgress(F)V\" since=\"24\"/>\n\t\t<method name=\"setStatus(I)V\" since=\"24\"/>\n\t\t<method name=\"setStatus(Ljava/lang/CharSequence;)V\" since=\"24\"/>\n\t\t<method name=\"setTag(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"start()Z\"/>\n\t</class>\n\t<class name=\"android/printservice/PrintService\" since=\"19\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"generatePrinterId(Ljava/lang/String;)Landroid/print/PrinterId;\"/>\n\t\t<method name=\"getActivePrintJobs()Ljava/util/List;\"/>\n\t\t<method name=\"onConnected()V\"/>\n\t\t<method name=\"onCreatePrinterDiscoverySession()Landroid/printservice/PrinterDiscoverySession;\"/>\n\t\t<method name=\"onDisconnected()V\"/>\n\t\t<method name=\"onPrintJobQueued(Landroid/printservice/PrintJob;)V\"/>\n\t\t<method name=\"onRequestCancelPrintJob(Landroid/printservice/PrintJob;)V\"/>\n\t\t<field name=\"EXTRA_CAN_SELECT_PRINTER\" since=\"26\"/>\n\t\t<field name=\"EXTRA_PRINTER_INFO\" since=\"21\"/>\n\t\t<field name=\"EXTRA_PRINT_DOCUMENT_INFO\" since=\"23\"/>\n\t\t<field name=\"EXTRA_PRINT_JOB_INFO\"/>\n\t\t<field name=\"EXTRA_SELECT_PRINTER\" since=\"26\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t\t<field name=\"SERVICE_META_DATA\"/>\n\t</class>\n\t<class name=\"android/printservice/PrinterDiscoverySession\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addPrinters(Ljava/util/List;)V\"/>\n\t\t<method name=\"getPrinters()Ljava/util/List;\"/>\n\t\t<method name=\"getTrackedPrinters()Ljava/util/List;\"/>\n\t\t<method name=\"isDestroyed()Z\"/>\n\t\t<method name=\"isPrinterDiscoveryStarted()Z\"/>\n\t\t<method name=\"onDestroy()V\"/>\n\t\t<method name=\"onRequestCustomPrinterIcon(Landroid/print/PrinterId;Landroid/os/CancellationSignal;Landroid/printservice/CustomPrinterIconCallback;)V\" since=\"24\"/>\n\t\t<method name=\"onStartPrinterDiscovery(Ljava/util/List;)V\"/>\n\t\t<method name=\"onStartPrinterStateTracking(Landroid/print/PrinterId;)V\"/>\n\t\t<method name=\"onStopPrinterDiscovery()V\"/>\n\t\t<method name=\"onStopPrinterStateTracking(Landroid/print/PrinterId;)V\"/>\n\t\t<method name=\"onValidatePrinters(Ljava/util/List;)V\"/>\n\t\t<method name=\"removePrinters(Ljava/util/List;)V\"/>\n\t</class>\n\t<class name=\"android/provider/AlarmClock\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"ACTION_DISMISS_ALARM\" since=\"23\"/>\n\t\t<field name=\"ACTION_DISMISS_TIMER\" since=\"28\"/>\n\t\t<field name=\"ACTION_SET_ALARM\"/>\n\t\t<field name=\"ACTION_SET_TIMER\" since=\"19\"/>\n\t\t<field name=\"ACTION_SHOW_ALARMS\" since=\"19\"/>\n\t\t<field name=\"ACTION_SHOW_TIMERS\" since=\"26\"/>\n\t\t<field name=\"ACTION_SNOOZE_ALARM\" since=\"23\"/>\n\t\t<field name=\"ALARM_SEARCH_MODE_ALL\" since=\"23\"/>\n\t\t<field name=\"ALARM_SEARCH_MODE_LABEL\" since=\"23\"/>\n\t\t<field name=\"ALARM_SEARCH_MODE_NEXT\" since=\"23\"/>\n\t\t<field name=\"ALARM_SEARCH_MODE_TIME\" since=\"23\"/>\n\t\t<field name=\"EXTRA_ALARM_SEARCH_MODE\" since=\"23\"/>\n\t\t<field name=\"EXTRA_ALARM_SNOOZE_DURATION\" since=\"23\"/>\n\t\t<field name=\"EXTRA_DAYS\" since=\"19\"/>\n\t\t<field name=\"EXTRA_HOUR\"/>\n\t\t<field name=\"EXTRA_IS_PM\" since=\"23\"/>\n\t\t<field name=\"EXTRA_LENGTH\" since=\"19\"/>\n\t\t<field name=\"EXTRA_MESSAGE\"/>\n\t\t<field name=\"EXTRA_MINUTES\"/>\n\t\t<field name=\"EXTRA_RINGTONE\" since=\"19\"/>\n\t\t<field name=\"EXTRA_SKIP_UI\" since=\"11\"/>\n\t\t<field name=\"EXTRA_VIBRATE\" since=\"19\"/>\n\t\t<field name=\"VALUE_RINGTONE_SILENT\" since=\"19\"/>\n\t</class>\n\t<class name=\"android/provider/BaseColumns\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"_COUNT\"/>\n\t\t<field name=\"_ID\"/>\n\t</class>\n\t<class name=\"android/provider/BlockedNumberContract\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"canCurrentUserBlockNumbers(Landroid/content/Context;)Z\"/>\n\t\t<method name=\"isBlocked(Landroid/content/Context;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"unblock(Landroid/content/Context;Ljava/lang/String;)I\"/>\n\t\t<field name=\"AUTHORITY\"/>\n\t\t<field name=\"AUTHORITY_URI\"/>\n\t</class>\n\t<class name=\"android/provider/BlockedNumberContract$BlockedNumbers\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"COLUMN_E164_NUMBER\"/>\n\t\t<field name=\"COLUMN_ID\"/>\n\t\t<field name=\"COLUMN_ORIGINAL_NUMBER\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/Browser\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addSearchUrl(Landroid/content/ContentResolver;Ljava/lang/String;)V\" removed=\"23\"/>\n\t\t<method name=\"canClearHistory(Landroid/content/ContentResolver;)Z\" removed=\"23\"/>\n\t\t<method name=\"clearHistory(Landroid/content/ContentResolver;)V\" removed=\"23\"/>\n\t\t<method name=\"clearSearches(Landroid/content/ContentResolver;)V\" removed=\"23\"/>\n\t\t<method name=\"deleteFromHistory(Landroid/content/ContentResolver;Ljava/lang/String;)V\" removed=\"23\"/>\n\t\t<method name=\"deleteHistoryTimeFrame(Landroid/content/ContentResolver;JJ)V\" removed=\"23\"/>\n\t\t<method name=\"getAllBookmarks(Landroid/content/ContentResolver;)Landroid/database/Cursor;\" removed=\"23\"/>\n\t\t<method name=\"getAllVisitedUrls(Landroid/content/ContentResolver;)Landroid/database/Cursor;\" removed=\"23\"/>\n\t\t<method name=\"requestAllIcons(Landroid/content/ContentResolver;Ljava/lang/String;Landroid/webkit/WebIconDatabase$IconListener;)V\" removed=\"23\"/>\n\t\t<method name=\"saveBookmark(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)V\" removed=\"23\"/>\n\t\t<method name=\"sendString(Landroid/content/Context;Ljava/lang/String;)V\"/>\n\t\t<method name=\"truncateHistory(Landroid/content/ContentResolver;)V\" removed=\"23\"/>\n\t\t<method name=\"updateVisitedHistory(Landroid/content/ContentResolver;Ljava/lang/String;Z)V\" removed=\"23\"/>\n\t\t<field name=\"BOOKMARKS_URI\" removed=\"23\"/>\n\t\t<field name=\"EXTRA_APPLICATION_ID\" since=\"3\"/>\n\t\t<field name=\"EXTRA_CREATE_NEW_TAB\" since=\"12\"/>\n\t\t<field name=\"EXTRA_HEADERS\" since=\"8\"/>\n\t\t<field name=\"HISTORY_PROJECTION\" removed=\"23\"/>\n\t\t<field name=\"HISTORY_PROJECTION_BOOKMARK_INDEX\" removed=\"23\"/>\n\t\t<field name=\"HISTORY_PROJECTION_DATE_INDEX\" removed=\"23\"/>\n\t\t<field name=\"HISTORY_PROJECTION_FAVICON_INDEX\" removed=\"23\"/>\n\t\t<field name=\"HISTORY_PROJECTION_ID_INDEX\" removed=\"23\"/>\n\t\t<field name=\"HISTORY_PROJECTION_TITLE_INDEX\" removed=\"23\"/>\n\t\t<field name=\"HISTORY_PROJECTION_URL_INDEX\" removed=\"23\"/>\n\t\t<field name=\"HISTORY_PROJECTION_VISITS_INDEX\" removed=\"23\"/>\n\t\t<field name=\"INITIAL_ZOOM_LEVEL\"/>\n\t\t<field name=\"SEARCHES_PROJECTION\" removed=\"23\"/>\n\t\t<field name=\"SEARCHES_PROJECTION_DATE_INDEX\" removed=\"23\"/>\n\t\t<field name=\"SEARCHES_PROJECTION_SEARCH_INDEX\" removed=\"23\"/>\n\t\t<field name=\"SEARCHES_URI\" removed=\"23\"/>\n\t\t<field name=\"TRUNCATE_HISTORY_PROJECTION\" removed=\"23\"/>\n\t\t<field name=\"TRUNCATE_HISTORY_PROJECTION_ID_INDEX\" removed=\"23\"/>\n\t\t<field name=\"TRUNCATE_N_OLDEST\" removed=\"23\"/>\n\t</class>\n\t<class name=\"android/provider/Browser$BookmarkColumns\" since=\"1\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"BOOKMARK\"/>\n\t\t<field name=\"CREATED\"/>\n\t\t<field name=\"DATE\"/>\n\t\t<field name=\"FAVICON\"/>\n\t\t<field name=\"TITLE\"/>\n\t\t<field name=\"URL\"/>\n\t\t<field name=\"VISITS\"/>\n\t</class>\n\t<class name=\"android/provider/Browser$SearchColumns\" since=\"1\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"DATE\"/>\n\t\t<field name=\"SEARCH\"/>\n\t\t<field name=\"URL\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"startViewCalendarEventInManagedProfile(Landroid/content/Context;JJJZI)Z\" since=\"29\"/>\n\t\t<field name=\"ACCOUNT_TYPE_LOCAL\"/>\n\t\t<field name=\"ACTION_EVENT_REMINDER\"/>\n\t\t<field name=\"ACTION_HANDLE_CUSTOM_EVENT\" since=\"16\"/>\n\t\t<field name=\"ACTION_VIEW_MANAGED_PROFILE_CALENDAR_EVENT\" since=\"29\"/>\n\t\t<field name=\"AUTHORITY\"/>\n\t\t<field name=\"CALLER_IS_SYNCADAPTER\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"EXTRA_CUSTOM_APP_URI\" since=\"16\"/>\n\t\t<field name=\"EXTRA_EVENT_ALL_DAY\"/>\n\t\t<field name=\"EXTRA_EVENT_BEGIN_TIME\"/>\n\t\t<field name=\"EXTRA_EVENT_END_TIME\"/>\n\t\t<field name=\"EXTRA_EVENT_ID\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$Attendees\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/CalendarContract$AttendeesColumns\"/>\n\t\t<implements name=\"android/provider/CalendarContract$EventsColumns\"/>\n\t\t<method name=\"query(Landroid/content/ContentResolver;J[Ljava/lang/String;)Landroid/database/Cursor;\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$AttendeesColumns\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ATTENDEE_EMAIL\"/>\n\t\t<field name=\"ATTENDEE_IDENTITY\" since=\"16\"/>\n\t\t<field name=\"ATTENDEE_ID_NAMESPACE\" since=\"16\"/>\n\t\t<field name=\"ATTENDEE_NAME\"/>\n\t\t<field name=\"ATTENDEE_RELATIONSHIP\"/>\n\t\t<field name=\"ATTENDEE_STATUS\"/>\n\t\t<field name=\"ATTENDEE_STATUS_ACCEPTED\"/>\n\t\t<field name=\"ATTENDEE_STATUS_DECLINED\"/>\n\t\t<field name=\"ATTENDEE_STATUS_INVITED\"/>\n\t\t<field name=\"ATTENDEE_STATUS_NONE\"/>\n\t\t<field name=\"ATTENDEE_STATUS_TENTATIVE\"/>\n\t\t<field name=\"ATTENDEE_TYPE\"/>\n\t\t<field name=\"EVENT_ID\"/>\n\t\t<field name=\"RELATIONSHIP_ATTENDEE\"/>\n\t\t<field name=\"RELATIONSHIP_NONE\"/>\n\t\t<field name=\"RELATIONSHIP_ORGANIZER\"/>\n\t\t<field name=\"RELATIONSHIP_PERFORMER\"/>\n\t\t<field name=\"RELATIONSHIP_SPEAKER\"/>\n\t\t<field name=\"TYPE_NONE\"/>\n\t\t<field name=\"TYPE_OPTIONAL\"/>\n\t\t<field name=\"TYPE_REQUIRED\"/>\n\t\t<field name=\"TYPE_RESOURCE\" since=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$CalendarAlerts\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/CalendarContract$CalendarAlertsColumns\"/>\n\t\t<implements name=\"android/provider/CalendarContract$CalendarColumns\"/>\n\t\t<implements name=\"android/provider/CalendarContract$EventsColumns\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"CONTENT_URI_BY_INSTANCE\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$CalendarAlertsColumns\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ALARM_TIME\"/>\n\t\t<field name=\"BEGIN\"/>\n\t\t<field name=\"CREATION_TIME\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t\t<field name=\"END\"/>\n\t\t<field name=\"EVENT_ID\"/>\n\t\t<field name=\"MINUTES\"/>\n\t\t<field name=\"NOTIFY_TIME\"/>\n\t\t<field name=\"RECEIVED_TIME\"/>\n\t\t<field name=\"STATE\"/>\n\t\t<field name=\"STATE_DISMISSED\"/>\n\t\t<field name=\"STATE_FIRED\"/>\n\t\t<field name=\"STATE_SCHEDULED\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$CalendarCache\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/CalendarContract$CalendarCacheColumns\"/>\n\t\t<field name=\"KEY_TIMEZONE_INSTANCES\"/>\n\t\t<field name=\"KEY_TIMEZONE_INSTANCES_PREVIOUS\"/>\n\t\t<field name=\"KEY_TIMEZONE_TYPE\"/>\n\t\t<field name=\"TIMEZONE_TYPE_AUTO\"/>\n\t\t<field name=\"TIMEZONE_TYPE_HOME\"/>\n\t\t<field name=\"URI\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$CalendarCacheColumns\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"KEY\"/>\n\t\t<field name=\"VALUE\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$CalendarColumns\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ALLOWED_ATTENDEE_TYPES\" since=\"15\"/>\n\t\t<field name=\"ALLOWED_AVAILABILITY\" since=\"15\"/>\n\t\t<field name=\"ALLOWED_REMINDERS\"/>\n\t\t<field name=\"CALENDAR_ACCESS_LEVEL\"/>\n\t\t<field name=\"CALENDAR_COLOR\"/>\n\t\t<field name=\"CALENDAR_COLOR_KEY\" since=\"15\"/>\n\t\t<field name=\"CALENDAR_DISPLAY_NAME\"/>\n\t\t<field name=\"CALENDAR_TIME_ZONE\"/>\n\t\t<field name=\"CAL_ACCESS_CONTRIBUTOR\"/>\n\t\t<field name=\"CAL_ACCESS_EDITOR\"/>\n\t\t<field name=\"CAL_ACCESS_FREEBUSY\"/>\n\t\t<field name=\"CAL_ACCESS_NONE\"/>\n\t\t<field name=\"CAL_ACCESS_OVERRIDE\"/>\n\t\t<field name=\"CAL_ACCESS_OWNER\"/>\n\t\t<field name=\"CAL_ACCESS_READ\"/>\n\t\t<field name=\"CAL_ACCESS_RESPOND\"/>\n\t\t<field name=\"CAL_ACCESS_ROOT\"/>\n\t\t<field name=\"CAN_MODIFY_TIME_ZONE\"/>\n\t\t<field name=\"CAN_ORGANIZER_RESPOND\"/>\n\t\t<field name=\"IS_PRIMARY\" since=\"17\"/>\n\t\t<field name=\"MAX_REMINDERS\"/>\n\t\t<field name=\"OWNER_ACCOUNT\"/>\n\t\t<field name=\"SYNC_EVENTS\"/>\n\t\t<field name=\"VISIBLE\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$CalendarEntity\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/CalendarContract$CalendarColumns\"/>\n\t\t<implements name=\"android/provider/CalendarContract$SyncColumns\"/>\n\t\t<method name=\"newEntityIterator(Landroid/database/Cursor;)Landroid/content/EntityIterator;\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$CalendarSyncColumns\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CAL_SYNC1\"/>\n\t\t<field name=\"CAL_SYNC10\"/>\n\t\t<field name=\"CAL_SYNC2\"/>\n\t\t<field name=\"CAL_SYNC3\"/>\n\t\t<field name=\"CAL_SYNC4\"/>\n\t\t<field name=\"CAL_SYNC5\"/>\n\t\t<field name=\"CAL_SYNC6\"/>\n\t\t<field name=\"CAL_SYNC7\"/>\n\t\t<field name=\"CAL_SYNC8\"/>\n\t\t<field name=\"CAL_SYNC9\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$Calendars\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/CalendarContract$CalendarColumns\"/>\n\t\t<implements name=\"android/provider/CalendarContract$SyncColumns\"/>\n\t\t<field name=\"CALENDAR_LOCATION\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t\t<field name=\"ENTERPRISE_CONTENT_URI\" since=\"29\"/>\n\t\t<field name=\"NAME\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$Colors\" since=\"15\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/CalendarContract$ColorsColumns\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$ColorsColumns\" since=\"15\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/SyncStateContract$Columns\"/>\n\t\t<field name=\"COLOR\"/>\n\t\t<field name=\"COLOR_KEY\"/>\n\t\t<field name=\"COLOR_TYPE\"/>\n\t\t<field name=\"TYPE_CALENDAR\"/>\n\t\t<field name=\"TYPE_EVENT\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$EventDays\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/CalendarContract$EventDaysColumns\"/>\n\t\t<method name=\"query(Landroid/content/ContentResolver;II[Ljava/lang/String;)Landroid/database/Cursor;\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$EventDaysColumns\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ENDDAY\"/>\n\t\t<field name=\"STARTDAY\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$Events\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/CalendarContract$CalendarColumns\"/>\n\t\t<implements name=\"android/provider/CalendarContract$EventsColumns\"/>\n\t\t<implements name=\"android/provider/CalendarContract$SyncColumns\"/>\n\t\t<field name=\"CONTENT_EXCEPTION_URI\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"ENTERPRISE_CONTENT_URI\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$EventsColumns\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ACCESS_CONFIDENTIAL\"/>\n\t\t<field name=\"ACCESS_DEFAULT\"/>\n\t\t<field name=\"ACCESS_LEVEL\"/>\n\t\t<field name=\"ACCESS_PRIVATE\"/>\n\t\t<field name=\"ACCESS_PUBLIC\"/>\n\t\t<field name=\"ALL_DAY\"/>\n\t\t<field name=\"AVAILABILITY\"/>\n\t\t<field name=\"AVAILABILITY_BUSY\"/>\n\t\t<field name=\"AVAILABILITY_FREE\"/>\n\t\t<field name=\"AVAILABILITY_TENTATIVE\" since=\"15\"/>\n\t\t<field name=\"CALENDAR_ID\"/>\n\t\t<field name=\"CAN_INVITE_OTHERS\"/>\n\t\t<field name=\"CUSTOM_APP_PACKAGE\" since=\"16\"/>\n\t\t<field name=\"CUSTOM_APP_URI\" since=\"16\"/>\n\t\t<field name=\"DESCRIPTION\"/>\n\t\t<field name=\"DISPLAY_COLOR\" since=\"16\"/>\n\t\t<field name=\"DTEND\"/>\n\t\t<field name=\"DTSTART\"/>\n\t\t<field name=\"DURATION\"/>\n\t\t<field name=\"EVENT_COLOR\"/>\n\t\t<field name=\"EVENT_COLOR_KEY\" since=\"15\"/>\n\t\t<field name=\"EVENT_END_TIMEZONE\"/>\n\t\t<field name=\"EVENT_LOCATION\"/>\n\t\t<field name=\"EVENT_TIMEZONE\"/>\n\t\t<field name=\"EXDATE\"/>\n\t\t<field name=\"EXRULE\"/>\n\t\t<field name=\"GUESTS_CAN_INVITE_OTHERS\"/>\n\t\t<field name=\"GUESTS_CAN_MODIFY\"/>\n\t\t<field name=\"GUESTS_CAN_SEE_GUESTS\"/>\n\t\t<field name=\"HAS_ALARM\"/>\n\t\t<field name=\"HAS_ATTENDEE_DATA\"/>\n\t\t<field name=\"HAS_EXTENDED_PROPERTIES\"/>\n\t\t<field name=\"IS_ORGANIZER\" since=\"17\"/>\n\t\t<field name=\"LAST_DATE\"/>\n\t\t<field name=\"LAST_SYNCED\"/>\n\t\t<field name=\"ORGANIZER\"/>\n\t\t<field name=\"ORIGINAL_ALL_DAY\"/>\n\t\t<field name=\"ORIGINAL_ID\"/>\n\t\t<field name=\"ORIGINAL_INSTANCE_TIME\"/>\n\t\t<field name=\"ORIGINAL_SYNC_ID\"/>\n\t\t<field name=\"RDATE\"/>\n\t\t<field name=\"RRULE\"/>\n\t\t<field name=\"SELF_ATTENDEE_STATUS\"/>\n\t\t<field name=\"STATUS\"/>\n\t\t<field name=\"STATUS_CANCELED\"/>\n\t\t<field name=\"STATUS_CONFIRMED\"/>\n\t\t<field name=\"STATUS_TENTATIVE\"/>\n\t\t<field name=\"SYNC_DATA1\"/>\n\t\t<field name=\"SYNC_DATA10\"/>\n\t\t<field name=\"SYNC_DATA2\"/>\n\t\t<field name=\"SYNC_DATA3\"/>\n\t\t<field name=\"SYNC_DATA4\"/>\n\t\t<field name=\"SYNC_DATA5\"/>\n\t\t<field name=\"SYNC_DATA6\"/>\n\t\t<field name=\"SYNC_DATA7\"/>\n\t\t<field name=\"SYNC_DATA8\"/>\n\t\t<field name=\"SYNC_DATA9\"/>\n\t\t<field name=\"TITLE\"/>\n\t\t<field name=\"UID_2445\" since=\"17\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$EventsEntity\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/CalendarContract$EventsColumns\"/>\n\t\t<implements name=\"android/provider/CalendarContract$SyncColumns\"/>\n\t\t<method name=\"newEntityIterator(Landroid/database/Cursor;Landroid/content/ContentProviderClient;)Landroid/content/EntityIterator;\"/>\n\t\t<method name=\"newEntityIterator(Landroid/database/Cursor;Landroid/content/ContentResolver;)Landroid/content/EntityIterator;\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$ExtendedProperties\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/CalendarContract$EventsColumns\"/>\n\t\t<implements name=\"android/provider/CalendarContract$ExtendedPropertiesColumns\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$ExtendedPropertiesColumns\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"EVENT_ID\"/>\n\t\t<field name=\"NAME\"/>\n\t\t<field name=\"VALUE\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$Instances\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/CalendarContract$CalendarColumns\"/>\n\t\t<implements name=\"android/provider/CalendarContract$EventsColumns\"/>\n\t\t<method name=\"query(Landroid/content/ContentResolver;[Ljava/lang/String;JJ)Landroid/database/Cursor;\"/>\n\t\t<method name=\"query(Landroid/content/ContentResolver;[Ljava/lang/String;JJLjava/lang/String;)Landroid/database/Cursor;\"/>\n\t\t<field name=\"BEGIN\"/>\n\t\t<field name=\"CONTENT_BY_DAY_URI\"/>\n\t\t<field name=\"CONTENT_SEARCH_BY_DAY_URI\"/>\n\t\t<field name=\"CONTENT_SEARCH_URI\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"END\"/>\n\t\t<field name=\"END_DAY\"/>\n\t\t<field name=\"END_MINUTE\"/>\n\t\t<field name=\"ENTERPRISE_CONTENT_BY_DAY_URI\" since=\"29\"/>\n\t\t<field name=\"ENTERPRISE_CONTENT_SEARCH_BY_DAY_URI\" since=\"29\"/>\n\t\t<field name=\"ENTERPRISE_CONTENT_SEARCH_URI\" since=\"29\"/>\n\t\t<field name=\"ENTERPRISE_CONTENT_URI\" since=\"29\"/>\n\t\t<field name=\"EVENT_ID\"/>\n\t\t<field name=\"START_DAY\"/>\n\t\t<field name=\"START_MINUTE\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$Reminders\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/CalendarContract$EventsColumns\"/>\n\t\t<implements name=\"android/provider/CalendarContract$RemindersColumns\"/>\n\t\t<method name=\"query(Landroid/content/ContentResolver;J[Ljava/lang/String;)Landroid/database/Cursor;\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$RemindersColumns\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"EVENT_ID\"/>\n\t\t<field name=\"METHOD\"/>\n\t\t<field name=\"METHOD_ALARM\" since=\"16\"/>\n\t\t<field name=\"METHOD_ALERT\"/>\n\t\t<field name=\"METHOD_DEFAULT\"/>\n\t\t<field name=\"METHOD_EMAIL\"/>\n\t\t<field name=\"METHOD_SMS\"/>\n\t\t<field name=\"MINUTES\"/>\n\t\t<field name=\"MINUTES_DEFAULT\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$SyncColumns\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/CalendarContract$CalendarSyncColumns\"/>\n\t\t<field name=\"ACCOUNT_NAME\"/>\n\t\t<field name=\"ACCOUNT_TYPE\"/>\n\t\t<field name=\"CAN_PARTIALLY_UPDATE\"/>\n\t\t<field name=\"DELETED\"/>\n\t\t<field name=\"DIRTY\"/>\n\t\t<field name=\"MUTATORS\" since=\"18\"/>\n\t\t<field name=\"_SYNC_ID\"/>\n\t</class>\n\t<class name=\"android/provider/CalendarContract$SyncState\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/SyncStateContract$Columns\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/CallLog\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"AUTHORITY\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/CallLog$Calls\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getLastOutgoingCall(Landroid/content/Context;)Ljava/lang/String;\" since=\"8\"/>\n\t\t<field name=\"ANSWERED_EXTERNALLY_TYPE\" since=\"25\"/>\n\t\t<field name=\"BLOCKED_TYPE\" since=\"24\"/>\n\t\t<field name=\"BLOCK_REASON\" since=\"29\"/>\n\t\t<field name=\"BLOCK_REASON_BLOCKED_NUMBER\" since=\"29\"/>\n\t\t<field name=\"BLOCK_REASON_CALL_SCREENING_SERVICE\" since=\"29\"/>\n\t\t<field name=\"BLOCK_REASON_DIRECT_TO_VOICEMAIL\" since=\"29\"/>\n\t\t<field name=\"BLOCK_REASON_NOT_BLOCKED\" since=\"29\"/>\n\t\t<field name=\"BLOCK_REASON_NOT_IN_CONTACTS\" since=\"29\"/>\n\t\t<field name=\"BLOCK_REASON_PAY_PHONE\" since=\"29\"/>\n\t\t<field name=\"BLOCK_REASON_RESTRICTED_NUMBER\" since=\"29\"/>\n\t\t<field name=\"BLOCK_REASON_UNKNOWN_NUMBER\" since=\"29\"/>\n\t\t<field name=\"CACHED_FORMATTED_NUMBER\" since=\"21\"/>\n\t\t<field name=\"CACHED_LOOKUP_URI\" since=\"21\"/>\n\t\t<field name=\"CACHED_MATCHED_NUMBER\" since=\"21\"/>\n\t\t<field name=\"CACHED_NAME\"/>\n\t\t<field name=\"CACHED_NORMALIZED_NUMBER\" since=\"21\"/>\n\t\t<field name=\"CACHED_NUMBER_LABEL\"/>\n\t\t<field name=\"CACHED_NUMBER_TYPE\"/>\n\t\t<field name=\"CACHED_PHOTO_ID\" since=\"21\"/>\n\t\t<field name=\"CACHED_PHOTO_URI\" since=\"23\"/>\n\t\t<field name=\"CALL_SCREENING_APP_NAME\" since=\"29\"/>\n\t\t<field name=\"CALL_SCREENING_COMPONENT_NAME\" since=\"29\"/>\n\t\t<field name=\"CONTENT_FILTER_URI\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"CONTENT_URI_WITH_VOICEMAIL\" since=\"21\"/>\n\t\t<field name=\"COUNTRY_ISO\" since=\"21\"/>\n\t\t<field name=\"DATA_USAGE\" since=\"21\"/>\n\t\t<field name=\"DATE\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t\t<field name=\"DURATION\"/>\n\t\t<field name=\"EXTRA_CALL_TYPE_FILTER\" since=\"21\"/>\n\t\t<field name=\"FEATURES\" since=\"21\"/>\n\t\t<field name=\"FEATURES_ASSISTED_DIALING_USED\" since=\"30\"/>\n\t\t<field name=\"FEATURES_HD_CALL\" since=\"26\"/>\n\t\t<field name=\"FEATURES_PULLED_EXTERNALLY\" since=\"25\"/>\n\t\t<field name=\"FEATURES_RTT\" since=\"28\"/>\n\t\t<field name=\"FEATURES_VIDEO\" since=\"21\"/>\n\t\t<field name=\"FEATURES_VOLTE\" since=\"30\"/>\n\t\t<field name=\"FEATURES_WIFI\" since=\"26\"/>\n\t\t<field name=\"GEOCODED_LOCATION\" since=\"21\"/>\n\t\t<field name=\"INCOMING_TYPE\"/>\n\t\t<field name=\"IS_READ\" since=\"14\"/>\n\t\t<field name=\"LAST_MODIFIED\" since=\"24\"/>\n\t\t<field name=\"LIMIT_PARAM_KEY\" since=\"17\"/>\n\t\t<field name=\"MISSED_TYPE\"/>\n\t\t<field name=\"NEW\"/>\n\t\t<field name=\"NUMBER\"/>\n\t\t<field name=\"NUMBER_PRESENTATION\" since=\"19\"/>\n\t\t<field name=\"OFFSET_PARAM_KEY\" since=\"17\"/>\n\t\t<field name=\"OUTGOING_TYPE\"/>\n\t\t<field name=\"PHONE_ACCOUNT_COMPONENT_NAME\" since=\"21\"/>\n\t\t<field name=\"PHONE_ACCOUNT_ID\" since=\"21\"/>\n\t\t<field name=\"POST_DIAL_DIGITS\" since=\"24\"/>\n\t\t<field name=\"PRESENTATION_ALLOWED\" since=\"19\"/>\n\t\t<field name=\"PRESENTATION_PAYPHONE\" since=\"19\"/>\n\t\t<field name=\"PRESENTATION_RESTRICTED\" since=\"19\"/>\n\t\t<field name=\"PRESENTATION_UNKNOWN\" since=\"19\"/>\n\t\t<field name=\"REJECTED_TYPE\" since=\"24\"/>\n\t\t<field name=\"TRANSCRIPTION\" since=\"21\"/>\n\t\t<field name=\"TYPE\"/>\n\t\t<field name=\"VIA_NUMBER\" since=\"24\"/>\n\t\t<field name=\"VOICEMAIL_TYPE\" since=\"21\"/>\n\t\t<field name=\"VOICEMAIL_URI\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"AUTHORITY\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_URI\" deprecated=\"15\"/>\n\t\t<field name=\"KIND_EMAIL\" deprecated=\"15\"/>\n\t\t<field name=\"KIND_IM\" deprecated=\"15\"/>\n\t\t<field name=\"KIND_ORGANIZATION\" deprecated=\"15\"/>\n\t\t<field name=\"KIND_PHONE\" deprecated=\"15\"/>\n\t\t<field name=\"KIND_POSTAL\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$ContactMethods\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/Contacts$ContactMethodsColumns\"/>\n\t\t<implements name=\"android/provider/Contacts$PeopleColumns\"/>\n\t\t<method name=\"addPostalLocation(Landroid/content/Context;JDD)V\" deprecated=\"15\"/>\n\t\t<method name=\"decodeImProtocol(Ljava/lang/String;)Ljava/lang/Object;\" deprecated=\"15\"/>\n\t\t<method name=\"encodeCustomImProtocol(Ljava/lang/String;)Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"encodePredefinedImProtocol(I)Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"getDisplayLabel(Landroid/content/Context;IILjava/lang/CharSequence;)Ljava/lang/CharSequence;\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_EMAIL_ITEM_TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_EMAIL_TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_EMAIL_URI\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_IM_ITEM_TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_POSTAL_ITEM_TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_POSTAL_TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_URI\" deprecated=\"15\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\" deprecated=\"15\"/>\n\t\t<field name=\"PERSON_ID\" deprecated=\"15\"/>\n\t\t<field name=\"POSTAL_LOCATION_LATITUDE\" deprecated=\"15\"/>\n\t\t<field name=\"POSTAL_LOCATION_LONGITUDE\" deprecated=\"15\"/>\n\t\t<field name=\"PROTOCOL_AIM\" deprecated=\"15\"/>\n\t\t<field name=\"PROTOCOL_GOOGLE_TALK\" deprecated=\"15\"/>\n\t\t<field name=\"PROTOCOL_ICQ\" deprecated=\"15\"/>\n\t\t<field name=\"PROTOCOL_JABBER\" deprecated=\"15\"/>\n\t\t<field name=\"PROTOCOL_MSN\" deprecated=\"15\"/>\n\t\t<field name=\"PROTOCOL_QQ\" deprecated=\"15\"/>\n\t\t<field name=\"PROTOCOL_SKYPE\" deprecated=\"15\"/>\n\t\t<field name=\"PROTOCOL_YAHOO\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$ContactMethodsColumns\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"AUX_DATA\" deprecated=\"15\"/>\n\t\t<field name=\"DATA\" deprecated=\"15\"/>\n\t\t<field name=\"ISPRIMARY\" deprecated=\"15\"/>\n\t\t<field name=\"KIND\" deprecated=\"15\"/>\n\t\t<field name=\"LABEL\" deprecated=\"15\"/>\n\t\t<field name=\"TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"TYPE_CUSTOM\" deprecated=\"15\"/>\n\t\t<field name=\"TYPE_HOME\" deprecated=\"15\"/>\n\t\t<field name=\"TYPE_OTHER\" deprecated=\"15\"/>\n\t\t<field name=\"TYPE_WORK\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$Extensions\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/Contacts$ExtensionsColumns\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_URI\" deprecated=\"15\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\" deprecated=\"15\"/>\n\t\t<field name=\"PERSON_ID\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$ExtensionsColumns\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"NAME\" deprecated=\"15\"/>\n\t\t<field name=\"VALUE\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$GroupMembership\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/Contacts$GroupsColumns\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_URI\" deprecated=\"15\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\" deprecated=\"15\"/>\n\t\t<field name=\"GROUP_ID\" deprecated=\"15\"/>\n\t\t<field name=\"GROUP_SYNC_ACCOUNT\" deprecated=\"15\"/>\n\t\t<field name=\"GROUP_SYNC_ACCOUNT_TYPE\" since=\"5\" deprecated=\"15\"/>\n\t\t<field name=\"GROUP_SYNC_ID\" deprecated=\"15\"/>\n\t\t<field name=\"PERSON_ID\" deprecated=\"15\"/>\n\t\t<field name=\"RAW_CONTENT_URI\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$Groups\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/Contacts$GroupsColumns\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_URI\" deprecated=\"15\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\" deprecated=\"15\"/>\n\t\t<field name=\"DELETED_CONTENT_URI\" deprecated=\"15\"/>\n\t\t<field name=\"GROUP_ANDROID_STARRED\" deprecated=\"15\"/>\n\t\t<field name=\"GROUP_MY_CONTACTS\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$GroupsColumns\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"NAME\" deprecated=\"15\"/>\n\t\t<field name=\"NOTES\" deprecated=\"15\"/>\n\t\t<field name=\"SHOULD_SYNC\" deprecated=\"15\"/>\n\t\t<field name=\"SYSTEM_ID\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$Intents\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"15\"/>\n\t\t<field name=\"ATTACH_IMAGE\" deprecated=\"15\"/>\n\t\t<field name=\"EXTRA_CREATE_DESCRIPTION\" since=\"3\" deprecated=\"15\"/>\n\t\t<field name=\"EXTRA_FORCE_CREATE\" since=\"3\" deprecated=\"15\"/>\n\t\t<field name=\"SEARCH_SUGGESTION_CLICKED\" deprecated=\"15\"/>\n\t\t<field name=\"SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED\" deprecated=\"15\"/>\n\t\t<field name=\"SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED\" deprecated=\"15\"/>\n\t\t<field name=\"SHOW_OR_CREATE_CONTACT\" since=\"3\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$Intents$Insert\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"15\"/>\n\t\t<field name=\"ACTION\" deprecated=\"15\"/>\n\t\t<field name=\"COMPANY\" deprecated=\"15\"/>\n\t\t<field name=\"EMAIL\" deprecated=\"15\"/>\n\t\t<field name=\"EMAIL_ISPRIMARY\" deprecated=\"15\"/>\n\t\t<field name=\"EMAIL_TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"FULL_MODE\" deprecated=\"15\"/>\n\t\t<field name=\"IM_HANDLE\" deprecated=\"15\"/>\n\t\t<field name=\"IM_ISPRIMARY\" deprecated=\"15\"/>\n\t\t<field name=\"IM_PROTOCOL\" deprecated=\"15\"/>\n\t\t<field name=\"JOB_TITLE\" deprecated=\"15\"/>\n\t\t<field name=\"NAME\" deprecated=\"15\"/>\n\t\t<field name=\"NOTES\" deprecated=\"15\"/>\n\t\t<field name=\"PHONE\" deprecated=\"15\"/>\n\t\t<field name=\"PHONETIC_NAME\" since=\"3\" deprecated=\"15\"/>\n\t\t<field name=\"PHONE_ISPRIMARY\" deprecated=\"15\"/>\n\t\t<field name=\"PHONE_TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"POSTAL\" deprecated=\"15\"/>\n\t\t<field name=\"POSTAL_ISPRIMARY\" deprecated=\"15\"/>\n\t\t<field name=\"POSTAL_TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"SECONDARY_EMAIL\" since=\"3\" deprecated=\"15\"/>\n\t\t<field name=\"SECONDARY_EMAIL_TYPE\" since=\"3\" deprecated=\"15\"/>\n\t\t<field name=\"SECONDARY_PHONE\" since=\"3\" deprecated=\"15\"/>\n\t\t<field name=\"SECONDARY_PHONE_TYPE\" since=\"3\" deprecated=\"15\"/>\n\t\t<field name=\"TERTIARY_EMAIL\" since=\"3\" deprecated=\"15\"/>\n\t\t<field name=\"TERTIARY_EMAIL_TYPE\" since=\"3\" deprecated=\"15\"/>\n\t\t<field name=\"TERTIARY_PHONE\" since=\"3\" deprecated=\"15\"/>\n\t\t<field name=\"TERTIARY_PHONE_TYPE\" since=\"3\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$Intents$UI\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"15\"/>\n\t\t<field name=\"FILTER_CONTACTS_ACTION\" deprecated=\"15\"/>\n\t\t<field name=\"FILTER_TEXT_EXTRA_KEY\" deprecated=\"15\"/>\n\t\t<field name=\"GROUP_NAME_EXTRA_KEY\" deprecated=\"15\"/>\n\t\t<field name=\"LIST_ALL_CONTACTS_ACTION\" deprecated=\"15\"/>\n\t\t<field name=\"LIST_CONTACTS_WITH_PHONES_ACTION\" deprecated=\"15\"/>\n\t\t<field name=\"LIST_DEFAULT\" deprecated=\"15\"/>\n\t\t<field name=\"LIST_FREQUENT_ACTION\" deprecated=\"15\"/>\n\t\t<field name=\"LIST_GROUP_ACTION\" deprecated=\"15\"/>\n\t\t<field name=\"LIST_STARRED_ACTION\" deprecated=\"15\"/>\n\t\t<field name=\"LIST_STREQUENT_ACTION\" deprecated=\"15\"/>\n\t\t<field name=\"TITLE_EXTRA_KEY\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$OrganizationColumns\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"COMPANY\" deprecated=\"15\"/>\n\t\t<field name=\"ISPRIMARY\" deprecated=\"15\"/>\n\t\t<field name=\"LABEL\" deprecated=\"15\"/>\n\t\t<field name=\"PERSON_ID\" deprecated=\"15\"/>\n\t\t<field name=\"TITLE\" deprecated=\"15\"/>\n\t\t<field name=\"TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"TYPE_CUSTOM\" deprecated=\"15\"/>\n\t\t<field name=\"TYPE_OTHER\" deprecated=\"15\"/>\n\t\t<field name=\"TYPE_WORK\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$Organizations\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/Contacts$OrganizationColumns\"/>\n\t\t<method name=\"getDisplayLabel(Landroid/content/Context;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_URI\" deprecated=\"15\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$People\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/Contacts$PeopleColumns\"/>\n\t\t<implements name=\"android/provider/Contacts$PhonesColumns\"/>\n\t\t<implements name=\"android/provider/Contacts$PresenceColumns\"/>\n\t\t<method name=\"addToGroup(Landroid/content/ContentResolver;JJ)Landroid/net/Uri;\" deprecated=\"15\"/>\n\t\t<method name=\"addToGroup(Landroid/content/ContentResolver;JLjava/lang/String;)Landroid/net/Uri;\" deprecated=\"15\"/>\n\t\t<method name=\"addToMyContactsGroup(Landroid/content/ContentResolver;J)Landroid/net/Uri;\" deprecated=\"15\"/>\n\t\t<method name=\"createPersonInMyContactsGroup(Landroid/content/ContentResolver;Landroid/content/ContentValues;)Landroid/net/Uri;\" deprecated=\"15\"/>\n\t\t<method name=\"loadContactPhoto(Landroid/content/Context;Landroid/net/Uri;ILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;\" deprecated=\"15\"/>\n\t\t<method name=\"markAsContacted(Landroid/content/ContentResolver;J)V\" deprecated=\"15\"/>\n\t\t<method name=\"openContactPhotoInputStream(Landroid/content/ContentResolver;Landroid/net/Uri;)Ljava/io/InputStream;\" deprecated=\"15\"/>\n\t\t<method name=\"queryGroups(Landroid/content/ContentResolver;J)Landroid/database/Cursor;\" deprecated=\"15\"/>\n\t\t<method name=\"setPhotoData(Landroid/content/ContentResolver;Landroid/net/Uri;[B)V\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_FILTER_URI\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_URI\" deprecated=\"15\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\" deprecated=\"15\"/>\n\t\t<field name=\"DELETED_CONTENT_URI\" deprecated=\"15\"/>\n\t\t<field name=\"PRIMARY_EMAIL_ID\" deprecated=\"15\"/>\n\t\t<field name=\"PRIMARY_ORGANIZATION_ID\" deprecated=\"15\"/>\n\t\t<field name=\"PRIMARY_PHONE_ID\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$People$ContactMethods\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/Contacts$ContactMethodsColumns\"/>\n\t\t<implements name=\"android/provider/Contacts$PeopleColumns\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\" deprecated=\"15\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$People$Extensions\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/Contacts$ExtensionsColumns\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\" deprecated=\"15\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\" deprecated=\"15\"/>\n\t\t<field name=\"PERSON_ID\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$People$Phones\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/Contacts$PeopleColumns\"/>\n\t\t<implements name=\"android/provider/Contacts$PhonesColumns\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\" deprecated=\"15\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$PeopleColumns\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CUSTOM_RINGTONE\" deprecated=\"15\"/>\n\t\t<field name=\"DISPLAY_NAME\" deprecated=\"15\"/>\n\t\t<field name=\"LAST_TIME_CONTACTED\" deprecated=\"15\"/>\n\t\t<field name=\"NAME\" deprecated=\"15\"/>\n\t\t<field name=\"NOTES\" deprecated=\"15\"/>\n\t\t<field name=\"PHONETIC_NAME\" since=\"3\" deprecated=\"15\"/>\n\t\t<field name=\"PHOTO_VERSION\" deprecated=\"15\"/>\n\t\t<field name=\"SEND_TO_VOICEMAIL\" deprecated=\"15\"/>\n\t\t<field name=\"STARRED\" deprecated=\"15\"/>\n\t\t<field name=\"TIMES_CONTACTED\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$Phones\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/Contacts$PeopleColumns\"/>\n\t\t<implements name=\"android/provider/Contacts$PhonesColumns\"/>\n\t\t<method name=\"getDisplayLabel(Landroid/content/Context;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;\" deprecated=\"15\"/>\n\t\t<method name=\"getDisplayLabel(Landroid/content/Context;ILjava/lang/CharSequence;[Ljava/lang/CharSequence;)Ljava/lang/CharSequence;\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_FILTER_URL\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_URI\" deprecated=\"15\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\" deprecated=\"15\"/>\n\t\t<field name=\"PERSON_ID\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$PhonesColumns\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ISPRIMARY\" deprecated=\"15\"/>\n\t\t<field name=\"LABEL\" deprecated=\"15\"/>\n\t\t<field name=\"NUMBER\" deprecated=\"15\"/>\n\t\t<field name=\"NUMBER_KEY\" deprecated=\"15\"/>\n\t\t<field name=\"TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"TYPE_CUSTOM\" deprecated=\"15\"/>\n\t\t<field name=\"TYPE_FAX_HOME\" deprecated=\"15\"/>\n\t\t<field name=\"TYPE_FAX_WORK\" deprecated=\"15\"/>\n\t\t<field name=\"TYPE_HOME\" deprecated=\"15\"/>\n\t\t<field name=\"TYPE_MOBILE\" deprecated=\"15\"/>\n\t\t<field name=\"TYPE_OTHER\" deprecated=\"15\"/>\n\t\t<field name=\"TYPE_PAGER\" deprecated=\"15\"/>\n\t\t<field name=\"TYPE_WORK\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$Photos\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/Contacts$PhotosColumns\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_URI\" deprecated=\"15\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$PhotosColumns\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"DATA\" deprecated=\"15\"/>\n\t\t<field name=\"DOWNLOAD_REQUIRED\" deprecated=\"15\"/>\n\t\t<field name=\"EXISTS_ON_SERVER\" deprecated=\"15\"/>\n\t\t<field name=\"LOCAL_VERSION\" deprecated=\"15\"/>\n\t\t<field name=\"PERSON_ID\" deprecated=\"15\"/>\n\t\t<field name=\"SYNC_ERROR\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$PresenceColumns\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"AVAILABLE\" since=\"8\" deprecated=\"29\"/>\n\t\t<field name=\"AWAY\" since=\"8\" deprecated=\"29\"/>\n\t\t<field name=\"DO_NOT_DISTURB\" since=\"8\" deprecated=\"29\"/>\n\t\t<field name=\"IDLE\" since=\"8\" deprecated=\"29\"/>\n\t\t<field name=\"IM_ACCOUNT\" deprecated=\"15\"/>\n\t\t<field name=\"IM_HANDLE\" deprecated=\"15\"/>\n\t\t<field name=\"IM_PROTOCOL\" deprecated=\"15\"/>\n\t\t<field name=\"INVISIBLE\" since=\"8\" deprecated=\"29\"/>\n\t\t<field name=\"OFFLINE\" since=\"8\" deprecated=\"29\"/>\n\t\t<field name=\"PRESENCE_CUSTOM_STATUS\" since=\"8\" deprecated=\"29\"/>\n\t\t<field name=\"PRESENCE_STATUS\" since=\"8\" deprecated=\"29\"/>\n\t\t<field name=\"PRIORITY\" since=\"8\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$Settings\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/Contacts$SettingsColumns\"/>\n\t\t<method name=\"getSetting(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"setSetting(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_URI\" deprecated=\"15\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\" deprecated=\"15\"/>\n\t\t<field name=\"SYNC_EVERYTHING\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Contacts$SettingsColumns\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"KEY\" deprecated=\"15\"/>\n\t\t<field name=\"VALUE\" deprecated=\"15\"/>\n\t\t<field name=\"_SYNC_ACCOUNT\" deprecated=\"15\"/>\n\t\t<field name=\"_SYNC_ACCOUNT_TYPE\" since=\"5\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"isProfileId(J)Z\" since=\"14\"/>\n\t\t<field name=\"AUTHORITY\"/>\n\t\t<field name=\"AUTHORITY_URI\"/>\n\t\t<field name=\"CALLER_IS_SYNCADAPTER\"/>\n\t\t<field name=\"DEFERRED_SNIPPETING\" since=\"21\"/>\n\t\t<field name=\"DEFERRED_SNIPPETING_QUERY\" since=\"21\"/>\n\t\t<field name=\"DIRECTORY_PARAM_KEY\" since=\"11\"/>\n\t\t<field name=\"LIMIT_PARAM_KEY\" since=\"11\"/>\n\t\t<field name=\"PRIMARY_ACCOUNT_NAME\" since=\"14\"/>\n\t\t<field name=\"PRIMARY_ACCOUNT_TYPE\" since=\"14\"/>\n\t\t<field name=\"REMOVE_DUPLICATE_ENTRIES\" since=\"21\"/>\n\t\t<field name=\"STREQUENT_PHONE_ONLY\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$AggregationExceptions\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"RAW_CONTACT_ID1\"/>\n\t\t<field name=\"RAW_CONTACT_ID2\"/>\n\t\t<field name=\"TYPE\"/>\n\t\t<field name=\"TYPE_AUTOMATIC\"/>\n\t\t<field name=\"TYPE_KEEP_SEPARATE\"/>\n\t\t<field name=\"TYPE_KEEP_TOGETHER\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$BaseSyncColumns\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"SYNC1\"/>\n\t\t<field name=\"SYNC2\"/>\n\t\t<field name=\"SYNC3\"/>\n\t\t<field name=\"SYNC4\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$CommonDataKinds\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$CommonDataKinds$BaseTypes\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"TYPE_CUSTOM\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$CommonDataKinds$Callable\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$CommonDataKinds$CommonColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumnsWithJoins\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"CONTENT_FILTER_URI\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"ENTERPRISE_CONTENT_FILTER_URI\" since=\"24\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_COUNTS\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_TITLES\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$CommonDataKinds$CommonColumns\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$CommonDataKinds$BaseTypes\"/>\n\t\t<field name=\"DATA\"/>\n\t\t<field name=\"LABEL\"/>\n\t\t<field name=\"TYPE\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$CommonDataKinds$Contactables\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$CommonDataKinds$CommonColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumnsWithJoins\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"CONTENT_FILTER_URI\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_COUNTS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_TITLES\" since=\"21\"/>\n\t\t<field name=\"VISIBLE_CONTACTS_ONLY\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$CommonDataKinds$Email\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$CommonDataKinds$CommonColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumnsWithJoins\"/>\n\t\t<method name=\"getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTypeLabelResource(I)I\"/>\n\t\t<field name=\"ADDRESS\" since=\"11\"/>\n\t\t<field name=\"CONTENT_FILTER_URI\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"CONTENT_LOOKUP_URI\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DISPLAY_NAME\"/>\n\t\t<field name=\"ENTERPRISE_CONTENT_FILTER_URI\" since=\"24\"/>\n\t\t<field name=\"ENTERPRISE_CONTENT_LOOKUP_URI\" since=\"23\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_COUNTS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_TITLES\" since=\"21\"/>\n\t\t<field name=\"TYPE_HOME\"/>\n\t\t<field name=\"TYPE_MOBILE\"/>\n\t\t<field name=\"TYPE_OTHER\"/>\n\t\t<field name=\"TYPE_WORK\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$CommonDataKinds$Event\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$CommonDataKinds$CommonColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumnsWithJoins\"/>\n\t\t<method name=\"getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;\" since=\"21\"/>\n\t\t<method name=\"getTypeResource(Ljava/lang/Integer;)I\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_COUNTS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_TITLES\" since=\"21\"/>\n\t\t<field name=\"START_DATE\"/>\n\t\t<field name=\"TYPE_ANNIVERSARY\"/>\n\t\t<field name=\"TYPE_BIRTHDAY\"/>\n\t\t<field name=\"TYPE_OTHER\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$CommonDataKinds$GroupMembership\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumnsWithJoins\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_COUNTS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_TITLES\" since=\"21\"/>\n\t\t<field name=\"GROUP_ROW_ID\"/>\n\t\t<field name=\"GROUP_SOURCE_ID\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$CommonDataKinds$Identity\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumnsWithJoins\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_COUNTS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_TITLES\" since=\"21\"/>\n\t\t<field name=\"IDENTITY\"/>\n\t\t<field name=\"NAMESPACE\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$CommonDataKinds$Im\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$CommonDataKinds$CommonColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumnsWithJoins\"/>\n\t\t<method name=\"getProtocolLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getProtocolLabelResource(I)I\"/>\n\t\t<method name=\"getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTypeLabelResource(I)I\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"CUSTOM_PROTOCOL\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_COUNTS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_TITLES\" since=\"21\"/>\n\t\t<field name=\"PROTOCOL\"/>\n\t\t<field name=\"PROTOCOL_AIM\"/>\n\t\t<field name=\"PROTOCOL_CUSTOM\"/>\n\t\t<field name=\"PROTOCOL_GOOGLE_TALK\"/>\n\t\t<field name=\"PROTOCOL_ICQ\"/>\n\t\t<field name=\"PROTOCOL_JABBER\"/>\n\t\t<field name=\"PROTOCOL_MSN\"/>\n\t\t<field name=\"PROTOCOL_NETMEETING\"/>\n\t\t<field name=\"PROTOCOL_QQ\"/>\n\t\t<field name=\"PROTOCOL_SKYPE\"/>\n\t\t<field name=\"PROTOCOL_YAHOO\"/>\n\t\t<field name=\"TYPE_HOME\"/>\n\t\t<field name=\"TYPE_OTHER\"/>\n\t\t<field name=\"TYPE_WORK\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$CommonDataKinds$Nickname\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$CommonDataKinds$CommonColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumnsWithJoins\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_COUNTS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_TITLES\" since=\"21\"/>\n\t\t<field name=\"NAME\"/>\n\t\t<field name=\"TYPE_DEFAULT\"/>\n\t\t<field name=\"TYPE_INITIALS\"/>\n\t\t<field name=\"TYPE_MAIDEN_NAME\" since=\"9\"/>\n\t\t<field name=\"TYPE_MAINDEN_NAME\" deprecated=\"15\"/>\n\t\t<field name=\"TYPE_OTHER_NAME\"/>\n\t\t<field name=\"TYPE_SHORT_NAME\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$CommonDataKinds$Note\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumnsWithJoins\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_COUNTS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_TITLES\" since=\"21\"/>\n\t\t<field name=\"NOTE\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$CommonDataKinds$Organization\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$CommonDataKinds$CommonColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumnsWithJoins\"/>\n\t\t<method name=\"getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTypeLabelResource(I)I\"/>\n\t\t<field name=\"COMPANY\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"DEPARTMENT\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_COUNTS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_TITLES\" since=\"21\"/>\n\t\t<field name=\"JOB_DESCRIPTION\"/>\n\t\t<field name=\"OFFICE_LOCATION\"/>\n\t\t<field name=\"PHONETIC_NAME\"/>\n\t\t<field name=\"PHONETIC_NAME_STYLE\" since=\"24\"/>\n\t\t<field name=\"SYMBOL\"/>\n\t\t<field name=\"TITLE\"/>\n\t\t<field name=\"TYPE_OTHER\"/>\n\t\t<field name=\"TYPE_WORK\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$CommonDataKinds$Phone\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$CommonDataKinds$CommonColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumnsWithJoins\"/>\n\t\t<method name=\"getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTypeLabelResource(I)I\"/>\n\t\t<field name=\"CONTENT_FILTER_URI\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"ENTERPRISE_CONTENT_FILTER_URI\" since=\"24\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_COUNTS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_TITLES\" since=\"21\"/>\n\t\t<field name=\"NORMALIZED_NUMBER\" since=\"16\"/>\n\t\t<field name=\"NUMBER\"/>\n\t\t<field name=\"SEARCH_DISPLAY_NAME_KEY\" since=\"16\"/>\n\t\t<field name=\"SEARCH_PHONE_NUMBER_KEY\" since=\"16\"/>\n\t\t<field name=\"TYPE_ASSISTANT\"/>\n\t\t<field name=\"TYPE_CALLBACK\"/>\n\t\t<field name=\"TYPE_CAR\"/>\n\t\t<field name=\"TYPE_COMPANY_MAIN\"/>\n\t\t<field name=\"TYPE_FAX_HOME\"/>\n\t\t<field name=\"TYPE_FAX_WORK\"/>\n\t\t<field name=\"TYPE_HOME\"/>\n\t\t<field name=\"TYPE_ISDN\"/>\n\t\t<field name=\"TYPE_MAIN\"/>\n\t\t<field name=\"TYPE_MMS\"/>\n\t\t<field name=\"TYPE_MOBILE\"/>\n\t\t<field name=\"TYPE_OTHER\"/>\n\t\t<field name=\"TYPE_OTHER_FAX\"/>\n\t\t<field name=\"TYPE_PAGER\"/>\n\t\t<field name=\"TYPE_RADIO\"/>\n\t\t<field name=\"TYPE_TELEX\"/>\n\t\t<field name=\"TYPE_TTY_TDD\"/>\n\t\t<field name=\"TYPE_WORK\"/>\n\t\t<field name=\"TYPE_WORK_MOBILE\"/>\n\t\t<field name=\"TYPE_WORK_PAGER\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$CommonDataKinds$Photo\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumnsWithJoins\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_COUNTS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_TITLES\" since=\"21\"/>\n\t\t<field name=\"PHOTO\"/>\n\t\t<field name=\"PHOTO_FILE_ID\" since=\"14\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$CommonDataKinds$Relation\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$CommonDataKinds$CommonColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumnsWithJoins\"/>\n\t\t<method name=\"getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;\" since=\"11\"/>\n\t\t<method name=\"getTypeLabelResource(I)I\" since=\"11\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_COUNTS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_TITLES\" since=\"21\"/>\n\t\t<field name=\"NAME\"/>\n\t\t<field name=\"TYPE_ASSISTANT\"/>\n\t\t<field name=\"TYPE_BROTHER\"/>\n\t\t<field name=\"TYPE_CHILD\"/>\n\t\t<field name=\"TYPE_DOMESTIC_PARTNER\"/>\n\t\t<field name=\"TYPE_FATHER\"/>\n\t\t<field name=\"TYPE_FRIEND\"/>\n\t\t<field name=\"TYPE_MANAGER\"/>\n\t\t<field name=\"TYPE_MOTHER\"/>\n\t\t<field name=\"TYPE_PARENT\"/>\n\t\t<field name=\"TYPE_PARTNER\"/>\n\t\t<field name=\"TYPE_REFERRED_BY\"/>\n\t\t<field name=\"TYPE_RELATIVE\"/>\n\t\t<field name=\"TYPE_SISTER\"/>\n\t\t<field name=\"TYPE_SPOUSE\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$CommonDataKinds$SipAddress\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$CommonDataKinds$CommonColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumnsWithJoins\"/>\n\t\t<method name=\"getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTypeLabelResource(I)I\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_COUNTS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_TITLES\" since=\"21\"/>\n\t\t<field name=\"SIP_ADDRESS\"/>\n\t\t<field name=\"TYPE_HOME\"/>\n\t\t<field name=\"TYPE_OTHER\"/>\n\t\t<field name=\"TYPE_WORK\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$CommonDataKinds$StructuredName\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumnsWithJoins\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"DISPLAY_NAME\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_COUNTS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_TITLES\" since=\"21\"/>\n\t\t<field name=\"FAMILY_NAME\"/>\n\t\t<field name=\"FULL_NAME_STYLE\" since=\"21\"/>\n\t\t<field name=\"GIVEN_NAME\"/>\n\t\t<field name=\"MIDDLE_NAME\"/>\n\t\t<field name=\"PHONETIC_FAMILY_NAME\"/>\n\t\t<field name=\"PHONETIC_GIVEN_NAME\"/>\n\t\t<field name=\"PHONETIC_MIDDLE_NAME\"/>\n\t\t<field name=\"PHONETIC_NAME_STYLE\" since=\"24\"/>\n\t\t<field name=\"PREFIX\"/>\n\t\t<field name=\"SUFFIX\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$CommonDataKinds$StructuredPostal\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$CommonDataKinds$CommonColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumnsWithJoins\"/>\n\t\t<method name=\"getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTypeLabelResource(I)I\"/>\n\t\t<field name=\"CITY\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"COUNTRY\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_COUNTS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_TITLES\" since=\"21\"/>\n\t\t<field name=\"FORMATTED_ADDRESS\"/>\n\t\t<field name=\"NEIGHBORHOOD\"/>\n\t\t<field name=\"POBOX\"/>\n\t\t<field name=\"POSTCODE\"/>\n\t\t<field name=\"REGION\"/>\n\t\t<field name=\"STREET\"/>\n\t\t<field name=\"TYPE_HOME\"/>\n\t\t<field name=\"TYPE_OTHER\"/>\n\t\t<field name=\"TYPE_WORK\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$CommonDataKinds$Website\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$CommonDataKinds$CommonColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumnsWithJoins\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_COUNTS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_TITLES\" since=\"21\"/>\n\t\t<field name=\"TYPE_BLOG\"/>\n\t\t<field name=\"TYPE_FTP\"/>\n\t\t<field name=\"TYPE_HOME\"/>\n\t\t<field name=\"TYPE_HOMEPAGE\"/>\n\t\t<field name=\"TYPE_OTHER\"/>\n\t\t<field name=\"TYPE_PROFILE\"/>\n\t\t<field name=\"TYPE_WORK\"/>\n\t\t<field name=\"URL\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$ContactNameColumns\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"DISPLAY_NAME_ALTERNATIVE\"/>\n\t\t<field name=\"DISPLAY_NAME_PRIMARY\"/>\n\t\t<field name=\"DISPLAY_NAME_SOURCE\"/>\n\t\t<field name=\"PHONETIC_NAME\"/>\n\t\t<field name=\"PHONETIC_NAME_STYLE\"/>\n\t\t<field name=\"SORT_KEY_ALTERNATIVE\"/>\n\t\t<field name=\"SORT_KEY_PRIMARY\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$ContactOptionsColumns\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CUSTOM_RINGTONE\"/>\n\t\t<field name=\"LAST_TIME_CONTACTED\" deprecated=\"29\"/>\n\t\t<field name=\"PINNED\" since=\"21\"/>\n\t\t<field name=\"SEND_TO_VOICEMAIL\"/>\n\t\t<field name=\"STARRED\"/>\n\t\t<field name=\"TIMES_CONTACTED\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$ContactStatusColumns\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CONTACT_CHAT_CAPABILITY\" since=\"11\"/>\n\t\t<field name=\"CONTACT_PRESENCE\"/>\n\t\t<field name=\"CONTACT_STATUS\"/>\n\t\t<field name=\"CONTACT_STATUS_ICON\"/>\n\t\t<field name=\"CONTACT_STATUS_LABEL\"/>\n\t\t<field name=\"CONTACT_STATUS_RES_PACKAGE\"/>\n\t\t<field name=\"CONTACT_STATUS_TIMESTAMP\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$Contacts\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactNameColumns\" since=\"11\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactOptionsColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactStatusColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactsColumns\"/>\n\t\t<method name=\"getLookupUri(JLjava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<method name=\"getLookupUri(Landroid/content/ContentResolver;Landroid/net/Uri;)Landroid/net/Uri;\"/>\n\t\t<method name=\"isEnterpriseContactId(J)Z\" since=\"21\"/>\n\t\t<method name=\"lookupContact(Landroid/content/ContentResolver;Landroid/net/Uri;)Landroid/net/Uri;\"/>\n\t\t<method name=\"markAsContacted(Landroid/content/ContentResolver;J)V\" deprecated=\"16\"/>\n\t\t<method name=\"openContactPhotoInputStream(Landroid/content/ContentResolver;Landroid/net/Uri;)Ljava/io/InputStream;\"/>\n\t\t<method name=\"openContactPhotoInputStream(Landroid/content/ContentResolver;Landroid/net/Uri;Z)Ljava/io/InputStream;\" since=\"14\"/>\n\t\t<field name=\"CONTENT_FILTER_URI\"/>\n\t\t<field name=\"CONTENT_FREQUENT_URI\" since=\"21\" deprecated=\"29\"/>\n\t\t<field name=\"CONTENT_GROUP_URI\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"CONTENT_LOOKUP_URI\"/>\n\t\t<field name=\"CONTENT_MULTI_VCARD_URI\" since=\"21\"/>\n\t\t<field name=\"CONTENT_STREQUENT_FILTER_URI\"/>\n\t\t<field name=\"CONTENT_STREQUENT_URI\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"CONTENT_VCARD_TYPE\"/>\n\t\t<field name=\"CONTENT_VCARD_URI\"/>\n\t\t<field name=\"ENTERPRISE_CONTENT_FILTER_URI\" since=\"24\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_COUNTS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_TITLES\" since=\"21\"/>\n\t\t<field name=\"QUERY_PARAMETER_VCARD_NO_PHOTO\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$Contacts$AggregationSuggestions\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactOptionsColumns\" since=\"11\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactStatusColumns\" since=\"11\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactsColumns\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$Contacts$AggregationSuggestions$Builder\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addNameParameter(Ljava/lang/String;)Landroid/provider/ContactsContract$Contacts$AggregationSuggestions$Builder;\"/>\n\t\t<method name=\"build()Landroid/net/Uri;\"/>\n\t\t<method name=\"setContactId(J)Landroid/provider/ContactsContract$Contacts$AggregationSuggestions$Builder;\"/>\n\t\t<method name=\"setLimit(I)Landroid/provider/ContactsContract$Contacts$AggregationSuggestions$Builder;\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$Contacts$Data\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumns\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$Contacts$Entity\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$BaseSyncColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactNameColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactOptionsColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactStatusColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactsColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataUsageStatColumns\" since=\"21\"/>\n\t\t<implements name=\"android/provider/ContactsContract$RawContactsColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$StatusColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$SyncColumns\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\"/>\n\t\t<field name=\"DATA_ID\"/>\n\t\t<field name=\"RAW_CONTACT_ID\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$Contacts$Photo\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumns\" removed=\"11\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumnsWithJoins\" since=\"11\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\"/>\n\t\t<field name=\"DISPLAY_PHOTO\" since=\"14\"/>\n\t\t<field name=\"PHOTO\" since=\"11\"/>\n\t\t<field name=\"PHOTO_FILE_ID\" since=\"14\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$Contacts$StreamItems\" since=\"15\" deprecated=\"21\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$StreamItemsColumns\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\" deprecated=\"21\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$ContactsColumns\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CONTACT_LAST_UPDATED_TIMESTAMP\" since=\"18\"/>\n\t\t<field name=\"DISPLAY_NAME\"/>\n\t\t<field name=\"HAS_PHONE_NUMBER\"/>\n\t\t<field name=\"IN_DEFAULT_DIRECTORY\" since=\"21\"/>\n\t\t<field name=\"IN_VISIBLE_GROUP\"/>\n\t\t<field name=\"IS_USER_PROFILE\" since=\"14\"/>\n\t\t<field name=\"LOOKUP_KEY\"/>\n\t\t<field name=\"NAME_RAW_CONTACT_ID\" since=\"21\"/>\n\t\t<field name=\"PHOTO_FILE_ID\" since=\"14\"/>\n\t\t<field name=\"PHOTO_ID\"/>\n\t\t<field name=\"PHOTO_THUMBNAIL_URI\" since=\"11\"/>\n\t\t<field name=\"PHOTO_URI\" since=\"11\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$Data\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumnsWithJoins\"/>\n\t\t<method name=\"getContactLookupUri(Landroid/content/ContentResolver;Landroid/net/Uri;)Landroid/net/Uri;\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_COUNTS\" since=\"21\"/>\n\t\t<field name=\"EXTRA_ADDRESS_BOOK_INDEX_TITLES\" since=\"21\"/>\n\t\t<field name=\"VISIBLE_CONTACTS_ONLY\" since=\"18\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$DataColumns\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CARRIER_PRESENCE\" since=\"23\"/>\n\t\t<field name=\"CARRIER_PRESENCE_VT_CAPABLE\" since=\"23\"/>\n\t\t<field name=\"DATA1\"/>\n\t\t<field name=\"DATA10\"/>\n\t\t<field name=\"DATA11\"/>\n\t\t<field name=\"DATA12\"/>\n\t\t<field name=\"DATA13\"/>\n\t\t<field name=\"DATA14\"/>\n\t\t<field name=\"DATA15\"/>\n\t\t<field name=\"DATA2\"/>\n\t\t<field name=\"DATA3\"/>\n\t\t<field name=\"DATA4\"/>\n\t\t<field name=\"DATA5\"/>\n\t\t<field name=\"DATA6\"/>\n\t\t<field name=\"DATA7\"/>\n\t\t<field name=\"DATA8\"/>\n\t\t<field name=\"DATA9\"/>\n\t\t<field name=\"DATA_VERSION\"/>\n\t\t<field name=\"IS_PRIMARY\"/>\n\t\t<field name=\"IS_READ_ONLY\" since=\"11\"/>\n\t\t<field name=\"IS_SUPER_PRIMARY\"/>\n\t\t<field name=\"MIMETYPE\"/>\n\t\t<field name=\"PREFERRED_PHONE_ACCOUNT_COMPONENT_NAME\" since=\"28\"/>\n\t\t<field name=\"PREFERRED_PHONE_ACCOUNT_ID\" since=\"28\"/>\n\t\t<field name=\"RAW_CONTACT_ID\"/>\n\t\t<field name=\"RES_PACKAGE\" since=\"21\"/>\n\t\t<field name=\"SYNC1\"/>\n\t\t<field name=\"SYNC2\"/>\n\t\t<field name=\"SYNC3\"/>\n\t\t<field name=\"SYNC4\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$DataColumnsWithJoins\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactNameColumns\" since=\"11\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactOptionsColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactStatusColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactsColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataUsageStatColumns\" since=\"18\"/>\n\t\t<implements name=\"android/provider/ContactsContract$RawContactsColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$StatusColumns\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$DataUsageFeedback\" since=\"14\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<field name=\"DELETE_USAGE_URI\" since=\"16\" deprecated=\"29\"/>\n\t\t<field name=\"FEEDBACK_URI\" deprecated=\"29\"/>\n\t\t<field name=\"USAGE_TYPE\" deprecated=\"29\"/>\n\t\t<field name=\"USAGE_TYPE_CALL\" deprecated=\"29\"/>\n\t\t<field name=\"USAGE_TYPE_LONG_TEXT\" deprecated=\"29\"/>\n\t\t<field name=\"USAGE_TYPE_SHORT_TEXT\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$DataUsageStatColumns\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"LAST_TIME_USED\" deprecated=\"29\"/>\n\t\t<field name=\"TIMES_USED\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$DeletedContacts\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DeletedContactsColumns\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DAYS_KEPT_MILLISECONDS\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$DeletedContactsColumns\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CONTACT_DELETED_TIMESTAMP\"/>\n\t\t<field name=\"CONTACT_ID\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$Directory\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<method name=\"isEnterpriseDirectoryId(J)Z\" since=\"24\"/>\n\t\t<method name=\"isRemoteDirectoryId(J)Z\" since=\"24\"/>\n\t\t<method name=\"notifyDirectoryChange(Landroid/content/ContentResolver;)V\"/>\n\t\t<field name=\"ACCOUNT_NAME\"/>\n\t\t<field name=\"ACCOUNT_TYPE\"/>\n\t\t<field name=\"CALLER_PACKAGE_PARAM_KEY\" since=\"26\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t\t<field name=\"DIRECTORY_AUTHORITY\"/>\n\t\t<field name=\"DISPLAY_NAME\"/>\n\t\t<field name=\"ENTERPRISE_CONTENT_URI\" since=\"24\"/>\n\t\t<field name=\"ENTERPRISE_DEFAULT\" since=\"24\"/>\n\t\t<field name=\"ENTERPRISE_LOCAL_INVISIBLE\" since=\"24\"/>\n\t\t<field name=\"EXPORT_SUPPORT\"/>\n\t\t<field name=\"EXPORT_SUPPORT_ANY_ACCOUNT\"/>\n\t\t<field name=\"EXPORT_SUPPORT_NONE\"/>\n\t\t<field name=\"EXPORT_SUPPORT_SAME_ACCOUNT_ONLY\"/>\n\t\t<field name=\"LOCAL_INVISIBLE\"/>\n\t\t<field name=\"PACKAGE_NAME\"/>\n\t\t<field name=\"PHOTO_SUPPORT\"/>\n\t\t<field name=\"PHOTO_SUPPORT_FULL\"/>\n\t\t<field name=\"PHOTO_SUPPORT_FULL_SIZE_ONLY\"/>\n\t\t<field name=\"PHOTO_SUPPORT_NONE\"/>\n\t\t<field name=\"PHOTO_SUPPORT_THUMBNAIL_ONLY\"/>\n\t\t<field name=\"SHORTCUT_SUPPORT\"/>\n\t\t<field name=\"SHORTCUT_SUPPORT_DATA_ITEMS_ONLY\"/>\n\t\t<field name=\"SHORTCUT_SUPPORT_FULL\"/>\n\t\t<field name=\"SHORTCUT_SUPPORT_NONE\"/>\n\t\t<field name=\"TYPE_RESOURCE_ID\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$DisplayNameSources\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"EMAIL\"/>\n\t\t<field name=\"NICKNAME\"/>\n\t\t<field name=\"ORGANIZATION\"/>\n\t\t<field name=\"PHONE\"/>\n\t\t<field name=\"STRUCTURED_NAME\"/>\n\t\t<field name=\"STRUCTURED_PHONETIC_NAME\" since=\"23\"/>\n\t\t<field name=\"UNDEFINED\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$DisplayPhoto\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CONTENT_MAX_DIMENSIONS_URI\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DISPLAY_MAX_DIM\"/>\n\t\t<field name=\"THUMBNAIL_MAX_DIM\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$FullNameStyle\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CHINESE\"/>\n\t\t<field name=\"CJK\"/>\n\t\t<field name=\"JAPANESE\"/>\n\t\t<field name=\"KOREAN\"/>\n\t\t<field name=\"UNDEFINED\"/>\n\t\t<field name=\"WESTERN\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$Groups\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$GroupsColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$SyncColumns\"/>\n\t\t<method name=\"newEntityIterator(Landroid/database/Cursor;)Landroid/content/EntityIterator;\" since=\"8\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"CONTENT_SUMMARY_URI\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$GroupsColumns\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"AUTO_ADD\" since=\"11\"/>\n\t\t<field name=\"DATA_SET\" since=\"14\"/>\n\t\t<field name=\"DELETED\"/>\n\t\t<field name=\"FAVORITES\" since=\"11\"/>\n\t\t<field name=\"GROUP_IS_READ_ONLY\" since=\"11\"/>\n\t\t<field name=\"GROUP_VISIBLE\"/>\n\t\t<field name=\"NOTES\"/>\n\t\t<field name=\"RES_PACKAGE\" since=\"21\"/>\n\t\t<field name=\"SHOULD_SYNC\"/>\n\t\t<field name=\"SUMMARY_COUNT\"/>\n\t\t<field name=\"SUMMARY_WITH_PHONES\"/>\n\t\t<field name=\"SYSTEM_ID\"/>\n\t\t<field name=\"TITLE\"/>\n\t\t<field name=\"TITLE_RES\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$Intents\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"ACTION_VOICE_SEND_MESSAGE_TO_CONTACTS\" since=\"24\"/>\n\t\t<field name=\"ATTACH_IMAGE\"/>\n\t\t<field name=\"CONTACTS_DATABASE_CREATED\" since=\"18\"/>\n\t\t<field name=\"EXTRA_CREATE_DESCRIPTION\"/>\n\t\t<field name=\"EXTRA_FORCE_CREATE\"/>\n\t\t<field name=\"EXTRA_RECIPIENT_CONTACT_CHAT_ID\" since=\"24\"/>\n\t\t<field name=\"EXTRA_RECIPIENT_CONTACT_NAME\" since=\"24\"/>\n\t\t<field name=\"EXTRA_RECIPIENT_CONTACT_URI\" since=\"24\"/>\n\t\t<field name=\"INVITE_CONTACT\" since=\"14\"/>\n\t\t<field name=\"METADATA_ACCOUNT_TYPE\" since=\"24\"/>\n\t\t<field name=\"METADATA_MIMETYPE\" since=\"24\"/>\n\t\t<field name=\"SEARCH_SUGGESTION_CLICKED\"/>\n\t\t<field name=\"SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED\"/>\n\t\t<field name=\"SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED\"/>\n\t\t<field name=\"SHOW_OR_CREATE_CONTACT\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$Intents$Insert\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"ACTION\"/>\n\t\t<field name=\"COMPANY\"/>\n\t\t<field name=\"DATA\" since=\"11\"/>\n\t\t<field name=\"EMAIL\"/>\n\t\t<field name=\"EMAIL_ISPRIMARY\"/>\n\t\t<field name=\"EMAIL_TYPE\"/>\n\t\t<field name=\"EXTRA_ACCOUNT\" since=\"23\"/>\n\t\t<field name=\"EXTRA_DATA_SET\" since=\"23\"/>\n\t\t<field name=\"FULL_MODE\"/>\n\t\t<field name=\"IM_HANDLE\"/>\n\t\t<field name=\"IM_ISPRIMARY\"/>\n\t\t<field name=\"IM_PROTOCOL\"/>\n\t\t<field name=\"JOB_TITLE\"/>\n\t\t<field name=\"NAME\"/>\n\t\t<field name=\"NOTES\"/>\n\t\t<field name=\"PHONE\"/>\n\t\t<field name=\"PHONETIC_NAME\"/>\n\t\t<field name=\"PHONE_ISPRIMARY\"/>\n\t\t<field name=\"PHONE_TYPE\"/>\n\t\t<field name=\"POSTAL\"/>\n\t\t<field name=\"POSTAL_ISPRIMARY\"/>\n\t\t<field name=\"POSTAL_TYPE\"/>\n\t\t<field name=\"SECONDARY_EMAIL\"/>\n\t\t<field name=\"SECONDARY_EMAIL_TYPE\"/>\n\t\t<field name=\"SECONDARY_PHONE\"/>\n\t\t<field name=\"SECONDARY_PHONE_TYPE\"/>\n\t\t<field name=\"TERTIARY_EMAIL\"/>\n\t\t<field name=\"TERTIARY_EMAIL_TYPE\"/>\n\t\t<field name=\"TERTIARY_PHONE\"/>\n\t\t<field name=\"TERTIARY_PHONE_TYPE\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$PhoneLookup\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactNameColumns\" since=\"26\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactOptionsColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactsColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$PhoneLookupColumns\"/>\n\t\t<field name=\"CONTENT_FILTER_URI\"/>\n\t\t<field name=\"ENTERPRISE_CONTENT_FILTER_URI\" since=\"21\"/>\n\t\t<field name=\"QUERY_PARAMETER_SIP_ADDRESS\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$PhoneLookupColumns\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CONTACT_ID\" since=\"24\"/>\n\t\t<field name=\"DATA_ID\" since=\"24\"/>\n\t\t<field name=\"LABEL\"/>\n\t\t<field name=\"NORMALIZED_NUMBER\" since=\"16\"/>\n\t\t<field name=\"NUMBER\"/>\n\t\t<field name=\"TYPE\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$PhoneticNameStyle\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"JAPANESE\"/>\n\t\t<field name=\"KOREAN\"/>\n\t\t<field name=\"PINYIN\"/>\n\t\t<field name=\"UNDEFINED\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$PinnedPositions\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"pin(Landroid/content/ContentResolver;JI)V\"/>\n\t\t<method name=\"undemote(Landroid/content/ContentResolver;J)V\"/>\n\t\t<field name=\"DEMOTED\"/>\n\t\t<field name=\"UNPINNED\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$Presence\" since=\"5\" deprecated=\"5\">\n\t\t<extends name=\"android/provider/ContactsContract$StatusUpdates\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$PresenceColumns\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CUSTOM_PROTOCOL\"/>\n\t\t<field name=\"DATA_ID\"/>\n\t\t<field name=\"IM_ACCOUNT\"/>\n\t\t<field name=\"IM_HANDLE\"/>\n\t\t<field name=\"PROTOCOL\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$Profile\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactNameColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactOptionsColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactStatusColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactsColumns\"/>\n\t\t<field name=\"CONTENT_RAW_CONTACTS_URI\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"CONTENT_VCARD_URI\"/>\n\t\t<field name=\"MIN_ID\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$ProfileSyncState\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/SyncStateContract$Columns\"/>\n\t\t<method name=\"get(Landroid/content/ContentProviderClient;Landroid/accounts/Account;)[B\"/>\n\t\t<method name=\"getWithUri(Landroid/content/ContentProviderClient;Landroid/accounts/Account;)Landroid/util/Pair;\"/>\n\t\t<method name=\"newSetOperation(Landroid/accounts/Account;[B)Landroid/content/ContentProviderOperation;\"/>\n\t\t<method name=\"set(Landroid/content/ContentProviderClient;Landroid/accounts/Account;[B)V\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$ProviderStatus\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DATABASE_CREATION_TIMESTAMP\" since=\"26\"/>\n\t\t<field name=\"STATUS\"/>\n\t\t<field name=\"STATUS_BUSY\"/>\n\t\t<field name=\"STATUS_EMPTY\"/>\n\t\t<field name=\"STATUS_NORMAL\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$QuickContact\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"showQuickContact(Landroid/content/Context;Landroid/graphics/Rect;Landroid/net/Uri;I[Ljava/lang/String;)V\"/>\n\t\t<method name=\"showQuickContact(Landroid/content/Context;Landroid/graphics/Rect;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;)V\" since=\"23\"/>\n\t\t<method name=\"showQuickContact(Landroid/content/Context;Landroid/view/View;Landroid/net/Uri;I[Ljava/lang/String;)V\"/>\n\t\t<method name=\"showQuickContact(Landroid/content/Context;Landroid/view/View;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;)V\" since=\"23\"/>\n\t\t<field name=\"ACTION_QUICK_CONTACT\" since=\"21\"/>\n\t\t<field name=\"EXTRA_EXCLUDE_MIMES\" since=\"21\"/>\n\t\t<field name=\"EXTRA_MODE\" since=\"23\"/>\n\t\t<field name=\"EXTRA_PRIORITIZED_MIMETYPE\" since=\"23\"/>\n\t\t<field name=\"MODE_LARGE\"/>\n\t\t<field name=\"MODE_MEDIUM\"/>\n\t\t<field name=\"MODE_SMALL\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$RawContacts\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactNameColumns\" since=\"11\"/>\n\t\t<implements name=\"android/provider/ContactsContract$ContactOptionsColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$RawContactsColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$SyncColumns\"/>\n\t\t<method name=\"getContactLookupUri(Landroid/content/ContentResolver;Landroid/net/Uri;)Landroid/net/Uri;\"/>\n\t\t<method name=\"newEntityIterator(Landroid/database/Cursor;)Landroid/content/EntityIterator;\" since=\"8\"/>\n\t\t<field name=\"AGGREGATION_MODE_DEFAULT\"/>\n\t\t<field name=\"AGGREGATION_MODE_DISABLED\"/>\n\t\t<field name=\"AGGREGATION_MODE_IMMEDIATE\" deprecated=\"15\"/>\n\t\t<field name=\"AGGREGATION_MODE_SUSPENDED\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$RawContacts$Data\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumns\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$RawContacts$DisplayPhoto\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$RawContacts$Entity\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumns\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\"/>\n\t\t<field name=\"DATA_ID\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$RawContacts$StreamItems\" since=\"15\" deprecated=\"21\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$StreamItemsColumns\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\" deprecated=\"21\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$RawContactsColumns\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ACCOUNT_TYPE_AND_DATA_SET\" since=\"21\"/>\n\t\t<field name=\"AGGREGATION_MODE\"/>\n\t\t<field name=\"BACKUP_ID\" since=\"24\"/>\n\t\t<field name=\"CONTACT_ID\"/>\n\t\t<field name=\"DATA_SET\" since=\"14\"/>\n\t\t<field name=\"DELETED\"/>\n\t\t<field name=\"METADATA_DIRTY\" since=\"24\"/>\n\t\t<field name=\"RAW_CONTACT_IS_READ_ONLY\" since=\"11\"/>\n\t\t<field name=\"RAW_CONTACT_IS_USER_PROFILE\" since=\"14\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$RawContactsEntity\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$DataColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$RawContactsColumns\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DATA_ID\"/>\n\t\t<field name=\"PROFILE_CONTENT_URI\" since=\"14\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$SearchSnippets\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"DEFERRED_SNIPPETING_KEY\"/>\n\t\t<field name=\"SNIPPET\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$Settings\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$SettingsColumns\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$SettingsColumns\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ACCOUNT_NAME\"/>\n\t\t<field name=\"ACCOUNT_TYPE\"/>\n\t\t<field name=\"ANY_UNSYNCED\"/>\n\t\t<field name=\"DATA_SET\" since=\"14\"/>\n\t\t<field name=\"SHOULD_SYNC\"/>\n\t\t<field name=\"UNGROUPED_COUNT\"/>\n\t\t<field name=\"UNGROUPED_VISIBLE\"/>\n\t\t<field name=\"UNGROUPED_WITH_PHONES\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$StatusColumns\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"AVAILABLE\" since=\"8\"/>\n\t\t<field name=\"AWAY\" since=\"8\"/>\n\t\t<field name=\"CAPABILITY_HAS_CAMERA\" since=\"11\"/>\n\t\t<field name=\"CAPABILITY_HAS_VIDEO\" since=\"11\"/>\n\t\t<field name=\"CAPABILITY_HAS_VOICE\" since=\"11\"/>\n\t\t<field name=\"CHAT_CAPABILITY\" since=\"11\"/>\n\t\t<field name=\"DO_NOT_DISTURB\" since=\"8\"/>\n\t\t<field name=\"IDLE\" since=\"8\"/>\n\t\t<field name=\"INVISIBLE\" since=\"8\"/>\n\t\t<field name=\"OFFLINE\" since=\"8\"/>\n\t\t<field name=\"PRESENCE\"/>\n\t\t<field name=\"PRESENCE_CUSTOM_STATUS\" since=\"8\" deprecated=\"15\"/>\n\t\t<field name=\"PRESENCE_STATUS\" since=\"8\" deprecated=\"15\"/>\n\t\t<field name=\"STATUS\"/>\n\t\t<field name=\"STATUS_ICON\"/>\n\t\t<field name=\"STATUS_LABEL\"/>\n\t\t<field name=\"STATUS_RES_PACKAGE\"/>\n\t\t<field name=\"STATUS_TIMESTAMP\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$StatusUpdates\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$PresenceColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$StatusColumns\"/>\n\t\t<method name=\"getPresenceIconResourceId(I)I\"/>\n\t\t<method name=\"getPresencePrecedence(I)I\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"PROFILE_CONTENT_URI\" since=\"14\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$StreamItemPhotos\" since=\"15\" deprecated=\"21\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$StreamItemPhotosColumns\"/>\n\t\t<field name=\"PHOTO\" deprecated=\"21\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$StreamItemPhotosColumns\" since=\"15\" deprecated=\"21\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"PHOTO_FILE_ID\" deprecated=\"21\"/>\n\t\t<field name=\"PHOTO_URI\" deprecated=\"21\"/>\n\t\t<field name=\"SORT_INDEX\" deprecated=\"21\"/>\n\t\t<field name=\"STREAM_ITEM_ID\" deprecated=\"21\"/>\n\t\t<field name=\"SYNC1\" deprecated=\"21\"/>\n\t\t<field name=\"SYNC2\" deprecated=\"21\"/>\n\t\t<field name=\"SYNC3\" deprecated=\"21\"/>\n\t\t<field name=\"SYNC4\" deprecated=\"21\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$StreamItems\" since=\"15\" deprecated=\"21\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$StreamItemsColumns\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\" deprecated=\"21\"/>\n\t\t<field name=\"CONTENT_LIMIT_URI\" deprecated=\"21\"/>\n\t\t<field name=\"CONTENT_PHOTO_URI\" deprecated=\"21\"/>\n\t\t<field name=\"CONTENT_TYPE\" deprecated=\"21\"/>\n\t\t<field name=\"CONTENT_URI\" deprecated=\"21\"/>\n\t\t<field name=\"MAX_ITEMS\" deprecated=\"21\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$StreamItems$StreamItemPhotos\" since=\"15\" deprecated=\"21\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/ContactsContract$StreamItemPhotosColumns\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\" deprecated=\"21\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\" deprecated=\"21\"/>\n\t\t<field name=\"CONTENT_TYPE\" deprecated=\"21\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$StreamItemsColumns\" since=\"15\" deprecated=\"21\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ACCOUNT_NAME\" deprecated=\"21\"/>\n\t\t<field name=\"ACCOUNT_TYPE\" deprecated=\"21\"/>\n\t\t<field name=\"COMMENTS\" deprecated=\"21\"/>\n\t\t<field name=\"CONTACT_ID\" deprecated=\"21\"/>\n\t\t<field name=\"CONTACT_LOOKUP_KEY\" deprecated=\"21\"/>\n\t\t<field name=\"DATA_SET\" deprecated=\"21\"/>\n\t\t<field name=\"RAW_CONTACT_ID\" deprecated=\"21\"/>\n\t\t<field name=\"RAW_CONTACT_SOURCE_ID\" deprecated=\"21\"/>\n\t\t<field name=\"RES_ICON\" deprecated=\"21\"/>\n\t\t<field name=\"RES_LABEL\" deprecated=\"21\"/>\n\t\t<field name=\"RES_PACKAGE\" deprecated=\"21\"/>\n\t\t<field name=\"SYNC1\" deprecated=\"21\"/>\n\t\t<field name=\"SYNC2\" deprecated=\"21\"/>\n\t\t<field name=\"SYNC3\" deprecated=\"21\"/>\n\t\t<field name=\"SYNC4\" deprecated=\"21\"/>\n\t\t<field name=\"TEXT\" deprecated=\"21\"/>\n\t\t<field name=\"TIMESTAMP\" deprecated=\"21\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$SyncColumns\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/ContactsContract$BaseSyncColumns\"/>\n\t\t<field name=\"ACCOUNT_NAME\"/>\n\t\t<field name=\"ACCOUNT_TYPE\"/>\n\t\t<field name=\"DIRTY\"/>\n\t\t<field name=\"SOURCE_ID\"/>\n\t\t<field name=\"VERSION\"/>\n\t</class>\n\t<class name=\"android/provider/ContactsContract$SyncState\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/SyncStateContract$Columns\"/>\n\t\t<method name=\"get(Landroid/content/ContentProviderClient;Landroid/accounts/Account;)[B\"/>\n\t\t<method name=\"getWithUri(Landroid/content/ContentProviderClient;Landroid/accounts/Account;)Landroid/util/Pair;\"/>\n\t\t<method name=\"newSetOperation(Landroid/accounts/Account;[B)Landroid/content/ContentProviderOperation;\"/>\n\t\t<method name=\"set(Landroid/content/ContentProviderClient;Landroid/accounts/Account;[B)V\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/DocumentsContract\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"buildChildDocumentsUri(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<method name=\"buildChildDocumentsUriUsingTree(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;\" since=\"21\"/>\n\t\t<method name=\"buildDocumentUri(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<method name=\"buildDocumentUriUsingTree(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;\" since=\"21\"/>\n\t\t<method name=\"buildRecentDocumentsUri(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<method name=\"buildRootUri(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<method name=\"buildRootsUri(Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<method name=\"buildSearchDocumentsUri(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<method name=\"buildTreeDocumentUri(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;\" since=\"21\"/>\n\t\t<method name=\"copyDocument(Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/net/Uri;)Landroid/net/Uri;\" since=\"24\"/>\n\t\t<method name=\"createDocument(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;\" since=\"21\"/>\n\t\t<method name=\"createWebLinkIntent(Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/os/Bundle;)Landroid/content/IntentSender;\" since=\"26\"/>\n\t\t<method name=\"deleteDocument(Landroid/content/ContentResolver;Landroid/net/Uri;)Z\"/>\n\t\t<method name=\"ejectRoot(Landroid/content/ContentResolver;Landroid/net/Uri;)V\" since=\"26\"/>\n\t\t<method name=\"findDocumentPath(Landroid/content/ContentResolver;Landroid/net/Uri;)Landroid/provider/DocumentsContract$Path;\" since=\"26\"/>\n\t\t<method name=\"getDocumentId(Landroid/net/Uri;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDocumentMetadata(Landroid/content/ContentResolver;Landroid/net/Uri;)Landroid/os/Bundle;\" since=\"29\"/>\n\t\t<method name=\"getDocumentThumbnail(Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/graphics/Point;Landroid/os/CancellationSignal;)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"getRootId(Landroid/net/Uri;)Ljava/lang/String;\"/>\n\t\t<method name=\"getSearchDocumentsQuery(Landroid/net/Uri;)Ljava/lang/String;\"/>\n\t\t<method name=\"getTreeDocumentId(Landroid/net/Uri;)Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"isChildDocument(Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/net/Uri;)Z\" since=\"29\"/>\n\t\t<method name=\"isDocumentUri(Landroid/content/Context;Landroid/net/Uri;)Z\"/>\n\t\t<method name=\"isRootUri(Landroid/content/Context;Landroid/net/Uri;)Z\" since=\"29\"/>\n\t\t<method name=\"isRootsUri(Landroid/content/Context;Landroid/net/Uri;)Z\" since=\"29\"/>\n\t\t<method name=\"isTreeUri(Landroid/net/Uri;)Z\" since=\"24\"/>\n\t\t<method name=\"moveDocument(Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/net/Uri;Landroid/net/Uri;)Landroid/net/Uri;\" since=\"24\"/>\n\t\t<method name=\"removeDocument(Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/net/Uri;)Z\" since=\"24\"/>\n\t\t<method name=\"renameDocument(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;\" since=\"21\"/>\n\t\t<field name=\"ACTION_DOCUMENT_SETTINGS\" since=\"26\"/>\n\t\t<field name=\"EXTRA_ERROR\"/>\n\t\t<field name=\"EXTRA_EXCLUDE_SELF\" since=\"23\"/>\n\t\t<field name=\"EXTRA_INFO\"/>\n\t\t<field name=\"EXTRA_INITIAL_URI\" since=\"26\"/>\n\t\t<field name=\"EXTRA_LOADING\"/>\n\t\t<field name=\"EXTRA_ORIENTATION\" since=\"24\"/>\n\t\t<field name=\"EXTRA_PROMPT\" since=\"23\"/>\n\t\t<field name=\"METADATA_EXIF\" since=\"29\"/>\n\t\t<field name=\"METADATA_TREE_COUNT\" since=\"29\"/>\n\t\t<field name=\"METADATA_TREE_SIZE\" since=\"29\"/>\n\t\t<field name=\"METADATA_TYPES\" since=\"29\"/>\n\t\t<field name=\"PROVIDER_INTERFACE\"/>\n\t\t<field name=\"QUERY_ARG_DISPLAY_NAME\" since=\"29\"/>\n\t\t<field name=\"QUERY_ARG_EXCLUDE_MEDIA\" since=\"29\"/>\n\t\t<field name=\"QUERY_ARG_FILE_SIZE_OVER\" since=\"29\"/>\n\t\t<field name=\"QUERY_ARG_LAST_MODIFIED_AFTER\" since=\"29\"/>\n\t\t<field name=\"QUERY_ARG_MIME_TYPES\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/provider/DocumentsContract$Document\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"COLUMN_DISPLAY_NAME\"/>\n\t\t<field name=\"COLUMN_DOCUMENT_ID\"/>\n\t\t<field name=\"COLUMN_FLAGS\"/>\n\t\t<field name=\"COLUMN_ICON\"/>\n\t\t<field name=\"COLUMN_LAST_MODIFIED\"/>\n\t\t<field name=\"COLUMN_MIME_TYPE\"/>\n\t\t<field name=\"COLUMN_SIZE\"/>\n\t\t<field name=\"COLUMN_SUMMARY\"/>\n\t\t<field name=\"FLAG_DIR_PREFERS_GRID\"/>\n\t\t<field name=\"FLAG_DIR_PREFERS_LAST_MODIFIED\"/>\n\t\t<field name=\"FLAG_DIR_SUPPORTS_CREATE\"/>\n\t\t<field name=\"FLAG_PARTIAL\" since=\"29\"/>\n\t\t<field name=\"FLAG_SUPPORTS_COPY\" since=\"24\"/>\n\t\t<field name=\"FLAG_SUPPORTS_DELETE\"/>\n\t\t<field name=\"FLAG_SUPPORTS_METADATA\" since=\"29\"/>\n\t\t<field name=\"FLAG_SUPPORTS_MOVE\" since=\"24\"/>\n\t\t<field name=\"FLAG_SUPPORTS_REMOVE\" since=\"24\"/>\n\t\t<field name=\"FLAG_SUPPORTS_RENAME\" since=\"21\"/>\n\t\t<field name=\"FLAG_SUPPORTS_SETTINGS\" since=\"26\"/>\n\t\t<field name=\"FLAG_SUPPORTS_THUMBNAIL\"/>\n\t\t<field name=\"FLAG_SUPPORTS_WRITE\"/>\n\t\t<field name=\"FLAG_VIRTUAL_DOCUMENT\" since=\"24\"/>\n\t\t<field name=\"FLAG_WEB_LINKABLE\" since=\"26\"/>\n\t\t<field name=\"MIME_TYPE_DIR\"/>\n\t</class>\n\t<class name=\"android/provider/DocumentsContract$Path\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/util/List;)V\"/>\n\t\t<method name=\"getPath()Ljava/util/List;\"/>\n\t\t<method name=\"getRootId()Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/provider/DocumentsContract$Root\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"COLUMN_AVAILABLE_BYTES\"/>\n\t\t<field name=\"COLUMN_CAPACITY_BYTES\" since=\"24\"/>\n\t\t<field name=\"COLUMN_DOCUMENT_ID\"/>\n\t\t<field name=\"COLUMN_FLAGS\"/>\n\t\t<field name=\"COLUMN_ICON\"/>\n\t\t<field name=\"COLUMN_MIME_TYPES\"/>\n\t\t<field name=\"COLUMN_QUERY_ARGS\" since=\"29\"/>\n\t\t<field name=\"COLUMN_ROOT_ID\"/>\n\t\t<field name=\"COLUMN_SUMMARY\"/>\n\t\t<field name=\"COLUMN_TITLE\"/>\n\t\t<field name=\"FLAG_EMPTY\" since=\"29\"/>\n\t\t<field name=\"FLAG_LOCAL_ONLY\"/>\n\t\t<field name=\"FLAG_SUPPORTS_CREATE\"/>\n\t\t<field name=\"FLAG_SUPPORTS_EJECT\" since=\"26\"/>\n\t\t<field name=\"FLAG_SUPPORTS_IS_CHILD\" since=\"21\"/>\n\t\t<field name=\"FLAG_SUPPORTS_RECENTS\"/>\n\t\t<field name=\"FLAG_SUPPORTS_SEARCH\"/>\n\t\t<field name=\"MIME_TYPE_ITEM\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/provider/DocumentsProvider\" since=\"19\">\n\t\t<extends name=\"android/content/ContentProvider\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"copyDocument(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\" since=\"24\"/>\n\t\t<method name=\"createDocument(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"createWebLinkIntent(Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/IntentSender;\" since=\"26\"/>\n\t\t<method name=\"deleteDocument(Ljava/lang/String;)V\"/>\n\t\t<method name=\"ejectRoot(Ljava/lang/String;)V\" since=\"26\"/>\n\t\t<method name=\"findDocumentPath(Ljava/lang/String;Ljava/lang/String;)Landroid/provider/DocumentsContract$Path;\" since=\"26\"/>\n\t\t<method name=\"getDocumentMetadata(Ljava/lang/String;)Landroid/os/Bundle;\" since=\"29\"/>\n\t\t<method name=\"getDocumentStreamTypes(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;\" since=\"24\"/>\n\t\t<method name=\"getDocumentType(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"isChildDocument(Ljava/lang/String;Ljava/lang/String;)Z\" since=\"21\"/>\n\t\t<method name=\"moveDocument(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\" since=\"24\"/>\n\t\t<method name=\"openDocument(Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/os/ParcelFileDescriptor;\"/>\n\t\t<method name=\"openDocumentThumbnail(Ljava/lang/String;Landroid/graphics/Point;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;\"/>\n\t\t<method name=\"openTypedDocument(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;\" since=\"24\"/>\n\t\t<method name=\"queryChildDocuments(Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;)Landroid/database/Cursor;\" since=\"26\"/>\n\t\t<method name=\"queryChildDocuments(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;\"/>\n\t\t<method name=\"queryDocument(Ljava/lang/String;[Ljava/lang/String;)Landroid/database/Cursor;\"/>\n\t\t<method name=\"queryRecentDocuments(Ljava/lang/String;[Ljava/lang/String;)Landroid/database/Cursor;\"/>\n\t\t<method name=\"queryRecentDocuments(Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/database/Cursor;\" since=\"29\"/>\n\t\t<method name=\"queryRoots([Ljava/lang/String;)Landroid/database/Cursor;\"/>\n\t\t<method name=\"querySearchDocuments(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Landroid/database/Cursor;\"/>\n\t\t<method name=\"querySearchDocuments(Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;)Landroid/database/Cursor;\" since=\"29\"/>\n\t\t<method name=\"removeDocument(Ljava/lang/String;Ljava/lang/String;)V\" since=\"24\"/>\n\t\t<method name=\"renameDocument(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"revokeDocumentPermission(Ljava/lang/String;)V\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/provider/FontRequest\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V\"/>\n\t\t<method name=\"getCertificates()Ljava/util/List;\"/>\n\t\t<method name=\"getProviderAuthority()Ljava/lang/String;\"/>\n\t\t<method name=\"getProviderPackage()Ljava/lang/String;\"/>\n\t\t<method name=\"getQuery()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/provider/FontsContract\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"buildTypeface(Landroid/content/Context;Landroid/os/CancellationSignal;[Landroid/provider/FontsContract$FontInfo;)Landroid/graphics/Typeface;\"/>\n\t\t<method name=\"fetchFonts(Landroid/content/Context;Landroid/os/CancellationSignal;Landroid/provider/FontRequest;)Landroid/provider/FontsContract$FontFamilyResult;\"/>\n\t\t<method name=\"requestFonts(Landroid/content/Context;Landroid/provider/FontRequest;Landroid/os/Handler;Landroid/os/CancellationSignal;Landroid/provider/FontsContract$FontRequestCallback;)V\"/>\n\t</class>\n\t<class name=\"android/provider/FontsContract$Columns\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<field name=\"FILE_ID\"/>\n\t\t<field name=\"ITALIC\"/>\n\t\t<field name=\"RESULT_CODE\"/>\n\t\t<field name=\"RESULT_CODE_FONT_NOT_FOUND\"/>\n\t\t<field name=\"RESULT_CODE_FONT_UNAVAILABLE\"/>\n\t\t<field name=\"RESULT_CODE_MALFORMED_QUERY\"/>\n\t\t<field name=\"RESULT_CODE_OK\"/>\n\t\t<field name=\"TTC_INDEX\"/>\n\t\t<field name=\"VARIATION_SETTINGS\"/>\n\t\t<field name=\"WEIGHT\"/>\n\t</class>\n\t<class name=\"android/provider/FontsContract$FontFamilyResult\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getFonts()[Landroid/provider/FontsContract$FontInfo;\"/>\n\t\t<method name=\"getStatusCode()I\"/>\n\t\t<field name=\"STATUS_OK\"/>\n\t\t<field name=\"STATUS_REJECTED\"/>\n\t\t<field name=\"STATUS_UNEXPECTED_DATA_PROVIDED\"/>\n\t\t<field name=\"STATUS_WRONG_CERTIFICATES\"/>\n\t</class>\n\t<class name=\"android/provider/FontsContract$FontInfo\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAxes()[Landroid/graphics/fonts/FontVariationAxis;\"/>\n\t\t<method name=\"getResultCode()I\"/>\n\t\t<method name=\"getTtcIndex()I\"/>\n\t\t<method name=\"getUri()Landroid/net/Uri;\"/>\n\t\t<method name=\"getWeight()I\"/>\n\t\t<method name=\"isItalic()Z\"/>\n\t</class>\n\t<class name=\"android/provider/FontsContract$FontRequestCallback\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onTypefaceRequestFailed(I)V\"/>\n\t\t<method name=\"onTypefaceRetrieved(Landroid/graphics/Typeface;)V\"/>\n\t\t<field name=\"FAIL_REASON_FONT_LOAD_ERROR\"/>\n\t\t<field name=\"FAIL_REASON_FONT_NOT_FOUND\"/>\n\t\t<field name=\"FAIL_REASON_FONT_UNAVAILABLE\"/>\n\t\t<field name=\"FAIL_REASON_MALFORMED_QUERY\"/>\n\t\t<field name=\"FAIL_REASON_PROVIDER_NOT_FOUND\"/>\n\t\t<field name=\"FAIL_REASON_WRONG_CERTIFICATES\"/>\n\t</class>\n\t<class name=\"android/provider/LiveFolders\" since=\"3\" deprecated=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<field name=\"ACTION_CREATE_LIVE_FOLDER\" deprecated=\"29\"/>\n\t\t<field name=\"DESCRIPTION\" deprecated=\"29\"/>\n\t\t<field name=\"DISPLAY_MODE_GRID\" deprecated=\"29\"/>\n\t\t<field name=\"DISPLAY_MODE_LIST\" deprecated=\"29\"/>\n\t\t<field name=\"EXTRA_LIVE_FOLDER_BASE_INTENT\" deprecated=\"29\"/>\n\t\t<field name=\"EXTRA_LIVE_FOLDER_DISPLAY_MODE\" deprecated=\"29\"/>\n\t\t<field name=\"EXTRA_LIVE_FOLDER_ICON\" deprecated=\"29\"/>\n\t\t<field name=\"EXTRA_LIVE_FOLDER_NAME\" deprecated=\"29\"/>\n\t\t<field name=\"ICON_BITMAP\" deprecated=\"29\"/>\n\t\t<field name=\"ICON_PACKAGE\" deprecated=\"29\"/>\n\t\t<field name=\"ICON_RESOURCE\" deprecated=\"29\"/>\n\t\t<field name=\"INTENT\" deprecated=\"29\"/>\n\t\t<field name=\"NAME\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getDocumentUri(Landroid/content/Context;Landroid/net/Uri;)Landroid/net/Uri;\" since=\"26\"/>\n\t\t<method name=\"getExternalVolumeNames(Landroid/content/Context;)Ljava/util/Set;\" since=\"29\"/>\n\t\t<method name=\"getMediaScannerUri()Landroid/net/Uri;\"/>\n\t\t<method name=\"getMediaUri(Landroid/content/Context;Landroid/net/Uri;)Landroid/net/Uri;\" since=\"29\"/>\n\t\t<method name=\"getVersion(Landroid/content/Context;)Ljava/lang/String;\" since=\"12\"/>\n\t\t<method name=\"getVersion(Landroid/content/Context;Ljava/lang/String;)Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getVolumeName(Landroid/net/Uri;)Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"setIncludePending(Landroid/net/Uri;)Landroid/net/Uri;\" since=\"29\"/>\n\t\t<method name=\"setRequireOriginal(Landroid/net/Uri;)Landroid/net/Uri;\" since=\"29\"/>\n\t\t<field name=\"ACTION_IMAGE_CAPTURE\" since=\"3\"/>\n\t\t<field name=\"ACTION_IMAGE_CAPTURE_SECURE\" since=\"17\"/>\n\t\t<field name=\"ACTION_REVIEW\" since=\"29\"/>\n\t\t<field name=\"ACTION_REVIEW_SECURE\" since=\"29\"/>\n\t\t<field name=\"ACTION_VIDEO_CAPTURE\" since=\"3\"/>\n\t\t<field name=\"AUTHORITY\"/>\n\t\t<field name=\"AUTHORITY_URI\" since=\"29\"/>\n\t\t<field name=\"EXTRA_BRIGHTNESS\" since=\"29\"/>\n\t\t<field name=\"EXTRA_DURATION_LIMIT\" since=\"8\"/>\n\t\t<field name=\"EXTRA_FINISH_ON_COMPLETION\" since=\"3\"/>\n\t\t<field name=\"EXTRA_FULL_SCREEN\" since=\"8\"/>\n\t\t<field name=\"EXTRA_MEDIA_ALBUM\" since=\"3\"/>\n\t\t<field name=\"EXTRA_MEDIA_ARTIST\" since=\"3\"/>\n\t\t<field name=\"EXTRA_MEDIA_FOCUS\" since=\"3\"/>\n\t\t<field name=\"EXTRA_MEDIA_GENRE\" since=\"21\"/>\n\t\t<field name=\"EXTRA_MEDIA_PLAYLIST\" since=\"21\"/>\n\t\t<field name=\"EXTRA_MEDIA_RADIO_CHANNEL\" since=\"21\"/>\n\t\t<field name=\"EXTRA_MEDIA_TITLE\" since=\"3\"/>\n\t\t<field name=\"EXTRA_OUTPUT\" since=\"3\"/>\n\t\t<field name=\"EXTRA_SCREEN_ORIENTATION\" since=\"3\"/>\n\t\t<field name=\"EXTRA_SHOW_ACTION_ICONS\" since=\"8\"/>\n\t\t<field name=\"EXTRA_SIZE_LIMIT\" since=\"8\"/>\n\t\t<field name=\"EXTRA_VIDEO_QUALITY\" since=\"3\"/>\n\t\t<field name=\"INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH\" since=\"9\"/>\n\t\t<field name=\"INTENT_ACTION_MEDIA_SEARCH\" since=\"3\"/>\n\t\t<field name=\"INTENT_ACTION_MUSIC_PLAYER\" since=\"8\" deprecated=\"15\"/>\n\t\t<field name=\"INTENT_ACTION_STILL_IMAGE_CAMERA\" since=\"3\"/>\n\t\t<field name=\"INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE\" since=\"17\"/>\n\t\t<field name=\"INTENT_ACTION_TEXT_OPEN_FROM_SEARCH\" since=\"17\"/>\n\t\t<field name=\"INTENT_ACTION_VIDEO_CAMERA\" since=\"3\"/>\n\t\t<field name=\"INTENT_ACTION_VIDEO_PLAY_FROM_SEARCH\" since=\"17\"/>\n\t\t<field name=\"MEDIA_IGNORE_FILENAME\" since=\"9\"/>\n\t\t<field name=\"MEDIA_SCANNER_VOLUME\"/>\n\t\t<field name=\"META_DATA_STILL_IMAGE_CAMERA_PREWARM_SERVICE\" since=\"23\"/>\n\t\t<field name=\"UNKNOWN_STRING\" since=\"8\"/>\n\t\t<field name=\"VOLUME_EXTERNAL\" since=\"29\"/>\n\t\t<field name=\"VOLUME_EXTERNAL_PRIMARY\" since=\"29\"/>\n\t\t<field name=\"VOLUME_INTERNAL\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Audio\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"keyFor(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Audio$AlbumColumns\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ALBUM\"/>\n\t\t<field name=\"ALBUM_ART\" deprecated=\"29\"/>\n\t\t<field name=\"ALBUM_ID\"/>\n\t\t<field name=\"ALBUM_KEY\"/>\n\t\t<field name=\"ARTIST\"/>\n\t\t<field name=\"ARTIST_ID\" since=\"29\"/>\n\t\t<field name=\"FIRST_YEAR\"/>\n\t\t<field name=\"LAST_YEAR\"/>\n\t\t<field name=\"NUMBER_OF_SONGS\"/>\n\t\t<field name=\"NUMBER_OF_SONGS_FOR_ARTIST\" since=\"3\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Audio$Albums\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/MediaStore$Audio$AlbumColumns\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getContentUri(Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t\t<field name=\"ENTRY_CONTENT_TYPE\"/>\n\t\t<field name=\"EXTERNAL_CONTENT_URI\"/>\n\t\t<field name=\"INTERNAL_CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Audio$ArtistColumns\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ARTIST\"/>\n\t\t<field name=\"ARTIST_KEY\"/>\n\t\t<field name=\"NUMBER_OF_ALBUMS\"/>\n\t\t<field name=\"NUMBER_OF_TRACKS\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Audio$Artists\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/MediaStore$Audio$ArtistColumns\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getContentUri(Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t\t<field name=\"ENTRY_CONTENT_TYPE\"/>\n\t\t<field name=\"EXTERNAL_CONTENT_URI\"/>\n\t\t<field name=\"INTERNAL_CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Audio$Artists$Albums\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/MediaStore$Audio$AlbumColumns\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getContentUri(Ljava/lang/String;J)Landroid/net/Uri;\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Audio$AudioColumns\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/MediaStore$MediaColumns\"/>\n\t\t<field name=\"ALBUM\"/>\n\t\t<field name=\"ALBUM_ART\" removed=\"14\"/>\n\t\t<field name=\"ALBUM_ID\"/>\n\t\t<field name=\"ALBUM_KEY\"/>\n\t\t<field name=\"ARTIST\"/>\n\t\t<field name=\"ARTIST_ID\"/>\n\t\t<field name=\"ARTIST_KEY\"/>\n\t\t<field name=\"BOOKMARK\" since=\"8\"/>\n\t\t<field name=\"COMPOSER\"/>\n\t\t<field name=\"DURATION\" removed=\"29\"/>\n\t\t<field name=\"IS_ALARM\"/>\n\t\t<field name=\"IS_AUDIOBOOK\" since=\"29\"/>\n\t\t<field name=\"IS_MUSIC\"/>\n\t\t<field name=\"IS_NOTIFICATION\"/>\n\t\t<field name=\"IS_PODCAST\" since=\"8\"/>\n\t\t<field name=\"IS_RINGTONE\"/>\n\t\t<field name=\"TITLE_KEY\"/>\n\t\t<field name=\"TRACK\"/>\n\t\t<field name=\"YEAR\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Audio$Genres\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/MediaStore$Audio$GenresColumns\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getContentUri(Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<method name=\"getContentUriForAudioId(Ljava/lang/String;I)Landroid/net/Uri;\" since=\"11\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t\t<field name=\"ENTRY_CONTENT_TYPE\"/>\n\t\t<field name=\"EXTERNAL_CONTENT_URI\"/>\n\t\t<field name=\"INTERNAL_CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Audio$Genres$Members\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/MediaStore$Audio$AudioColumns\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getContentUri(Ljava/lang/String;J)Landroid/net/Uri;\"/>\n\t\t<field name=\"AUDIO_ID\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t\t<field name=\"GENRE_ID\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Audio$GenresColumns\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"NAME\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Audio$Media\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/MediaStore$Audio$AudioColumns\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getContentUri(Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<method name=\"getContentUriForPath(Ljava/lang/String;)Landroid/net/Uri;\" deprecated=\"29\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t\t<field name=\"ENTRY_CONTENT_TYPE\" since=\"21\"/>\n\t\t<field name=\"EXTERNAL_CONTENT_URI\"/>\n\t\t<field name=\"EXTRA_MAX_BYTES\" since=\"3\"/>\n\t\t<field name=\"INTERNAL_CONTENT_URI\"/>\n\t\t<field name=\"RECORD_SOUND_ACTION\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Audio$Playlists\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/MediaStore$Audio$PlaylistsColumns\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getContentUri(Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t\t<field name=\"ENTRY_CONTENT_TYPE\"/>\n\t\t<field name=\"EXTERNAL_CONTENT_URI\"/>\n\t\t<field name=\"INTERNAL_CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Audio$Playlists$Members\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/MediaStore$Audio$AudioColumns\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getContentUri(Ljava/lang/String;J)Landroid/net/Uri;\"/>\n\t\t<method name=\"moveItem(Landroid/content/ContentResolver;JII)Z\" since=\"8\"/>\n\t\t<field name=\"AUDIO_ID\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t\t<field name=\"PLAYLIST_ID\"/>\n\t\t<field name=\"PLAY_ORDER\"/>\n\t\t<field name=\"_ID\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Audio$PlaylistsColumns\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"DATA\" deprecated=\"29\"/>\n\t\t<field name=\"DATE_ADDED\"/>\n\t\t<field name=\"DATE_MODIFIED\"/>\n\t\t<field name=\"NAME\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Audio$Radio\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ENTRY_CONTENT_TYPE\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$DownloadColumns\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/MediaStore$MediaColumns\"/>\n\t\t<field name=\"DOWNLOAD_URI\"/>\n\t\t<field name=\"REFERER_URI\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Downloads\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/MediaStore$DownloadColumns\"/>\n\t\t<method name=\"getContentUri(Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"EXTERNAL_CONTENT_URI\"/>\n\t\t<field name=\"INTERNAL_CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Files\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getContentUri(Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<method name=\"getContentUri(Ljava/lang/String;J)Landroid/net/Uri;\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Files$FileColumns\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/MediaStore$MediaColumns\"/>\n\t\t<field name=\"MEDIA_TYPE\"/>\n\t\t<field name=\"MEDIA_TYPE_AUDIO\"/>\n\t\t<field name=\"MEDIA_TYPE_IMAGE\"/>\n\t\t<field name=\"MEDIA_TYPE_NONE\"/>\n\t\t<field name=\"MEDIA_TYPE_PLAYLIST\"/>\n\t\t<field name=\"MEDIA_TYPE_VIDEO\"/>\n\t\t<field name=\"MIME_TYPE\"/>\n\t\t<field name=\"PARENT\"/>\n\t\t<field name=\"TITLE\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Images\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Images$ImageColumns\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/MediaStore$MediaColumns\"/>\n\t\t<field name=\"BUCKET_DISPLAY_NAME\" removed=\"29\"/>\n\t\t<field name=\"BUCKET_ID\" removed=\"29\"/>\n\t\t<field name=\"DATE_TAKEN\" removed=\"29\"/>\n\t\t<field name=\"DESCRIPTION\"/>\n\t\t<field name=\"IS_PRIVATE\"/>\n\t\t<field name=\"LATITUDE\" deprecated=\"29\"/>\n\t\t<field name=\"LONGITUDE\" deprecated=\"29\"/>\n\t\t<field name=\"MINI_THUMB_MAGIC\" deprecated=\"29\"/>\n\t\t<field name=\"ORIENTATION\" removed=\"29\"/>\n\t\t<field name=\"PICASA_ID\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Images$Media\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/MediaStore$Images$ImageColumns\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getBitmap(Landroid/content/ContentResolver;Landroid/net/Uri;)Landroid/graphics/Bitmap;\" deprecated=\"29\"/>\n\t\t<method name=\"getContentUri(Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<method name=\"insertImage(Landroid/content/ContentResolver;Landroid/graphics/Bitmap;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"insertImage(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"query(Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;)Landroid/database/Cursor;\" deprecated=\"29\"/>\n\t\t<method name=\"query(Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;\" deprecated=\"29\"/>\n\t\t<method name=\"query(Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;\" deprecated=\"29\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t\t<field name=\"EXTERNAL_CONTENT_URI\"/>\n\t\t<field name=\"INTERNAL_CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Images$Thumbnails\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"cancelThumbnailRequest(Landroid/content/ContentResolver;J)V\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"cancelThumbnailRequest(Landroid/content/ContentResolver;JJ)V\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"getContentUri(Ljava/lang/String;)Landroid/net/Uri;\" deprecated=\"29\"/>\n\t\t<method name=\"getThumbnail(Landroid/content/ContentResolver;JILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getThumbnail(Landroid/content/ContentResolver;JJILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"query(Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;)Landroid/database/Cursor;\" deprecated=\"29\"/>\n\t\t<method name=\"queryMiniThumbnail(Landroid/content/ContentResolver;JI[Ljava/lang/String;)Landroid/database/Cursor;\" deprecated=\"29\"/>\n\t\t<method name=\"queryMiniThumbnails(Landroid/content/ContentResolver;Landroid/net/Uri;I[Ljava/lang/String;)Landroid/database/Cursor;\" deprecated=\"29\"/>\n\t\t<field name=\"DATA\" deprecated=\"29\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\" deprecated=\"29\"/>\n\t\t<field name=\"EXTERNAL_CONTENT_URI\" deprecated=\"29\"/>\n\t\t<field name=\"FULL_SCREEN_KIND\" deprecated=\"29\"/>\n\t\t<field name=\"HEIGHT\" deprecated=\"29\"/>\n\t\t<field name=\"IMAGE_ID\" deprecated=\"29\"/>\n\t\t<field name=\"INTERNAL_CONTENT_URI\" deprecated=\"29\"/>\n\t\t<field name=\"KIND\" deprecated=\"29\"/>\n\t\t<field name=\"MICRO_KIND\" deprecated=\"29\"/>\n\t\t<field name=\"MINI_KIND\" deprecated=\"29\"/>\n\t\t<field name=\"THUMB_DATA\" since=\"5\" deprecated=\"29\"/>\n\t\t<field name=\"WIDTH\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$MediaColumns\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<field name=\"BUCKET_DISPLAY_NAME\" since=\"29\"/>\n\t\t<field name=\"BUCKET_ID\" since=\"29\"/>\n\t\t<field name=\"DATA\" deprecated=\"29\"/>\n\t\t<field name=\"DATE_ADDED\"/>\n\t\t<field name=\"DATE_EXPIRES\" since=\"29\"/>\n\t\t<field name=\"DATE_MODIFIED\"/>\n\t\t<field name=\"DATE_TAKEN\" since=\"29\"/>\n\t\t<field name=\"DISPLAY_NAME\"/>\n\t\t<field name=\"DOCUMENT_ID\" since=\"29\"/>\n\t\t<field name=\"DURATION\" since=\"29\"/>\n\t\t<field name=\"HEIGHT\" since=\"16\"/>\n\t\t<field name=\"INSTANCE_ID\" since=\"29\"/>\n\t\t<field name=\"IS_PENDING\" since=\"29\"/>\n\t\t<field name=\"MIME_TYPE\"/>\n\t\t<field name=\"ORIENTATION\" since=\"29\"/>\n\t\t<field name=\"ORIGINAL_DOCUMENT_ID\" since=\"29\"/>\n\t\t<field name=\"OWNER_PACKAGE_NAME\" since=\"29\"/>\n\t\t<field name=\"RELATIVE_PATH\" since=\"29\"/>\n\t\t<field name=\"SIZE\"/>\n\t\t<field name=\"TITLE\"/>\n\t\t<field name=\"VOLUME_NAME\" since=\"29\"/>\n\t\t<field name=\"WIDTH\" since=\"16\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Video\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"query(Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;)Landroid/database/Cursor;\" deprecated=\"29\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Video$Media\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/MediaStore$Video$VideoColumns\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getContentUri(Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t\t<field name=\"EXTERNAL_CONTENT_URI\"/>\n\t\t<field name=\"INTERNAL_CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Video$Thumbnails\" since=\"5\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"cancelThumbnailRequest(Landroid/content/ContentResolver;J)V\" deprecated=\"29\"/>\n\t\t<method name=\"cancelThumbnailRequest(Landroid/content/ContentResolver;JJ)V\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"getContentUri(Ljava/lang/String;)Landroid/net/Uri;\" deprecated=\"29\"/>\n\t\t<method name=\"getThumbnail(Landroid/content/ContentResolver;JILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;\" deprecated=\"29\"/>\n\t\t<method name=\"getThumbnail(Landroid/content/ContentResolver;JJILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;\" since=\"8\" deprecated=\"29\"/>\n\t\t<field name=\"DATA\" deprecated=\"29\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\" deprecated=\"29\"/>\n\t\t<field name=\"EXTERNAL_CONTENT_URI\" deprecated=\"29\"/>\n\t\t<field name=\"FULL_SCREEN_KIND\" deprecated=\"29\"/>\n\t\t<field name=\"HEIGHT\" deprecated=\"29\"/>\n\t\t<field name=\"INTERNAL_CONTENT_URI\" deprecated=\"29\"/>\n\t\t<field name=\"KIND\" deprecated=\"29\"/>\n\t\t<field name=\"MICRO_KIND\" deprecated=\"29\"/>\n\t\t<field name=\"MINI_KIND\" deprecated=\"29\"/>\n\t\t<field name=\"VIDEO_ID\" deprecated=\"29\"/>\n\t\t<field name=\"WIDTH\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/provider/MediaStore$Video$VideoColumns\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/MediaStore$MediaColumns\"/>\n\t\t<field name=\"ALBUM\"/>\n\t\t<field name=\"ARTIST\"/>\n\t\t<field name=\"BOOKMARK\" since=\"3\"/>\n\t\t<field name=\"BUCKET_DISPLAY_NAME\" since=\"3\" removed=\"29\"/>\n\t\t<field name=\"BUCKET_ID\" since=\"3\" removed=\"29\"/>\n\t\t<field name=\"CATEGORY\"/>\n\t\t<field name=\"DATE_TAKEN\" removed=\"29\"/>\n\t\t<field name=\"DESCRIPTION\"/>\n\t\t<field name=\"DURATION\" removed=\"29\"/>\n\t\t<field name=\"IS_PRIVATE\"/>\n\t\t<field name=\"LANGUAGE\"/>\n\t\t<field name=\"LATITUDE\" deprecated=\"29\"/>\n\t\t<field name=\"LONGITUDE\" deprecated=\"29\"/>\n\t\t<field name=\"MINI_THUMB_MAGIC\" deprecated=\"29\"/>\n\t\t<field name=\"RESOLUTION\"/>\n\t\t<field name=\"TAGS\"/>\n\t</class>\n\t<class name=\"android/provider/OpenableColumns\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"DISPLAY_NAME\"/>\n\t\t<field name=\"SIZE\"/>\n\t</class>\n\t<class name=\"android/provider/SearchRecentSuggestions\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"clearHistory()V\"/>\n\t\t<method name=\"saveRecentQuery(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"truncateHistory(Landroid/content/ContentResolver;I)V\"/>\n\t\t<field name=\"QUERIES_PROJECTION_1LINE\"/>\n\t\t<field name=\"QUERIES_PROJECTION_2LINE\"/>\n\t\t<field name=\"QUERIES_PROJECTION_DATE_INDEX\"/>\n\t\t<field name=\"QUERIES_PROJECTION_DISPLAY1_INDEX\"/>\n\t\t<field name=\"QUERIES_PROJECTION_DISPLAY2_INDEX\"/>\n\t\t<field name=\"QUERIES_PROJECTION_QUERY_INDEX\"/>\n\t</class>\n\t<class name=\"android/provider/Settings\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"canDrawOverlays(Landroid/content/Context;)Z\" since=\"23\"/>\n\t\t<field name=\"ACTION_ACCESSIBILITY_SETTINGS\" since=\"5\"/>\n\t\t<field name=\"ACTION_ADD_ACCOUNT\" since=\"8\"/>\n\t\t<field name=\"ACTION_AIRPLANE_MODE_SETTINGS\" since=\"3\"/>\n\t\t<field name=\"ACTION_APN_SETTINGS\"/>\n\t\t<field name=\"ACTION_APPLICATION_DETAILS_SETTINGS\" since=\"9\"/>\n\t\t<field name=\"ACTION_APPLICATION_DEVELOPMENT_SETTINGS\" since=\"3\"/>\n\t\t<field name=\"ACTION_APPLICATION_SETTINGS\"/>\n\t\t<field name=\"ACTION_APP_NOTIFICATION_BUBBLE_SETTINGS\" since=\"29\"/>\n\t\t<field name=\"ACTION_APP_NOTIFICATION_SETTINGS\" since=\"26\"/>\n\t\t<field name=\"ACTION_APP_SEARCH_SETTINGS\" since=\"29\"/>\n\t\t<field name=\"ACTION_APP_USAGE_SETTINGS\" since=\"29\"/>\n\t\t<field name=\"ACTION_BATTERY_SAVER_SETTINGS\" since=\"22\"/>\n\t\t<field name=\"ACTION_BLUETOOTH_SETTINGS\"/>\n\t\t<field name=\"ACTION_CAPTIONING_SETTINGS\" since=\"19\"/>\n\t\t<field name=\"ACTION_CAST_SETTINGS\" since=\"21\"/>\n\t\t<field name=\"ACTION_CHANNEL_NOTIFICATION_SETTINGS\" since=\"26\"/>\n\t\t<field name=\"ACTION_DATA_ROAMING_SETTINGS\" since=\"3\"/>\n\t\t<field name=\"ACTION_DATA_USAGE_SETTINGS\" since=\"28\"/>\n\t\t<field name=\"ACTION_DATE_SETTINGS\"/>\n\t\t<field name=\"ACTION_DEVICE_INFO_SETTINGS\" since=\"8\"/>\n\t\t<field name=\"ACTION_DISPLAY_SETTINGS\"/>\n\t\t<field name=\"ACTION_DREAM_SETTINGS\" since=\"18\"/>\n\t\t<field name=\"ACTION_FINGERPRINT_ENROLL\" since=\"28\"/>\n\t\t<field name=\"ACTION_HARD_KEYBOARD_SETTINGS\" since=\"24\"/>\n\t\t<field name=\"ACTION_HOME_SETTINGS\" since=\"21\"/>\n\t\t<field name=\"ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS\" since=\"24\"/>\n\t\t<field name=\"ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS\" since=\"23\"/>\n\t\t<field name=\"ACTION_INPUT_METHOD_SETTINGS\" since=\"3\"/>\n\t\t<field name=\"ACTION_INPUT_METHOD_SUBTYPE_SETTINGS\" since=\"11\"/>\n\t\t<field name=\"ACTION_INTERNAL_STORAGE_SETTINGS\" since=\"3\"/>\n\t\t<field name=\"ACTION_LOCALE_SETTINGS\"/>\n\t\t<field name=\"ACTION_LOCATION_SOURCE_SETTINGS\"/>\n\t\t<field name=\"ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS\" since=\"9\"/>\n\t\t<field name=\"ACTION_MANAGE_APPLICATIONS_SETTINGS\" since=\"3\"/>\n\t\t<field name=\"ACTION_MANAGE_DEFAULT_APPS_SETTINGS\" since=\"24\"/>\n\t\t<field name=\"ACTION_MANAGE_OVERLAY_PERMISSION\" since=\"23\"/>\n\t\t<field name=\"ACTION_MANAGE_UNKNOWN_APP_SOURCES\" since=\"26\"/>\n\t\t<field name=\"ACTION_MANAGE_WRITE_SETTINGS\" since=\"23\"/>\n\t\t<field name=\"ACTION_MEMORY_CARD_SETTINGS\" since=\"3\"/>\n\t\t<field name=\"ACTION_NETWORK_OPERATOR_SETTINGS\" since=\"3\"/>\n\t\t<field name=\"ACTION_NFCSHARING_SETTINGS\" since=\"14\"/>\n\t\t<field name=\"ACTION_NFC_PAYMENT_SETTINGS\" since=\"19\"/>\n\t\t<field name=\"ACTION_NFC_SETTINGS\" since=\"16\"/>\n\t\t<field name=\"ACTION_NIGHT_DISPLAY_SETTINGS\" since=\"26\"/>\n\t\t<field name=\"ACTION_NOTIFICATION_ASSISTANT_SETTINGS\" since=\"29\"/>\n\t\t<field name=\"ACTION_NOTIFICATION_LISTENER_SETTINGS\" since=\"22\"/>\n\t\t<field name=\"ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS\" since=\"23\"/>\n\t\t<field name=\"ACTION_PRINT_SETTINGS\" since=\"19\"/>\n\t\t<field name=\"ACTION_PRIVACY_SETTINGS\" since=\"5\"/>\n\t\t<field name=\"ACTION_PROCESS_WIFI_EASY_CONNECT_URI\" since=\"29\"/>\n\t\t<field name=\"ACTION_QUICK_LAUNCH_SETTINGS\" since=\"3\"/>\n\t\t<field name=\"ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS\" since=\"23\"/>\n\t\t<field name=\"ACTION_REQUEST_SET_AUTOFILL_SERVICE\" since=\"26\"/>\n\t\t<field name=\"ACTION_SEARCH_SETTINGS\" since=\"8\"/>\n\t\t<field name=\"ACTION_SECURITY_SETTINGS\"/>\n\t\t<field name=\"ACTION_SETTINGS\"/>\n\t\t<field name=\"ACTION_SHOW_REGULATORY_INFO\" since=\"21\"/>\n\t\t<field name=\"ACTION_SOUND_SETTINGS\"/>\n\t\t<field name=\"ACTION_STORAGE_VOLUME_ACCESS_SETTINGS\" since=\"28\" deprecated=\"29\"/>\n\t\t<field name=\"ACTION_SYNC_SETTINGS\" since=\"3\"/>\n\t\t<field name=\"ACTION_USAGE_ACCESS_SETTINGS\" since=\"21\"/>\n\t\t<field name=\"ACTION_USER_DICTIONARY_SETTINGS\" since=\"3\"/>\n\t\t<field name=\"ACTION_VOICE_CONTROL_AIRPLANE_MODE\" since=\"23\"/>\n\t\t<field name=\"ACTION_VOICE_CONTROL_BATTERY_SAVER_MODE\" since=\"23\"/>\n\t\t<field name=\"ACTION_VOICE_CONTROL_DO_NOT_DISTURB_MODE\" since=\"23\"/>\n\t\t<field name=\"ACTION_VOICE_INPUT_SETTINGS\" since=\"21\"/>\n\t\t<field name=\"ACTION_VPN_SETTINGS\" since=\"24\"/>\n\t\t<field name=\"ACTION_VR_LISTENER_SETTINGS\" since=\"24\"/>\n\t\t<field name=\"ACTION_WEBVIEW_SETTINGS\" since=\"24\"/>\n\t\t<field name=\"ACTION_WIFI_IP_SETTINGS\" since=\"3\"/>\n\t\t<field name=\"ACTION_WIFI_SETTINGS\"/>\n\t\t<field name=\"ACTION_WIRELESS_SETTINGS\"/>\n\t\t<field name=\"ACTION_ZEN_MODE_PRIORITY_SETTINGS\" since=\"26\"/>\n\t\t<field name=\"AUTHORITY\"/>\n\t\t<field name=\"EXTRA_ACCOUNT_TYPES\" since=\"18\"/>\n\t\t<field name=\"EXTRA_AIRPLANE_MODE_ENABLED\" since=\"23\"/>\n\t\t<field name=\"EXTRA_APP_PACKAGE\" since=\"26\"/>\n\t\t<field name=\"EXTRA_AUTHORITIES\" since=\"8\"/>\n\t\t<field name=\"EXTRA_BATTERY_SAVER_MODE_ENABLED\" since=\"23\"/>\n\t\t<field name=\"EXTRA_CHANNEL_ID\" since=\"26\"/>\n\t\t<field name=\"EXTRA_DO_NOT_DISTURB_MODE_ENABLED\" since=\"23\"/>\n\t\t<field name=\"EXTRA_DO_NOT_DISTURB_MODE_MINUTES\" since=\"23\"/>\n\t\t<field name=\"EXTRA_INPUT_METHOD_ID\" since=\"11\"/>\n\t\t<field name=\"EXTRA_SUB_ID\" since=\"28\"/>\n\t\t<field name=\"INTENT_CATEGORY_USAGE_ACCESS_CONFIG\" since=\"23\"/>\n\t\t<field name=\"METADATA_USAGE_ACCESS_REASON\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/provider/Settings$Global\" since=\"17\">\n\t\t<extends name=\"android/provider/Settings$NameValueTable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getFloat(Landroid/content/ContentResolver;Ljava/lang/String;)F\"/>\n\t\t<method name=\"getFloat(Landroid/content/ContentResolver;Ljava/lang/String;F)F\"/>\n\t\t<method name=\"getInt(Landroid/content/ContentResolver;Ljava/lang/String;)I\"/>\n\t\t<method name=\"getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I\"/>\n\t\t<method name=\"getLong(Landroid/content/ContentResolver;Ljava/lang/String;)J\"/>\n\t\t<method name=\"getLong(Landroid/content/ContentResolver;Ljava/lang/String;J)J\"/>\n\t\t<method name=\"getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getUriFor(Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<method name=\"putFloat(Landroid/content/ContentResolver;Ljava/lang/String;F)Z\"/>\n\t\t<method name=\"putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z\"/>\n\t\t<method name=\"putLong(Landroid/content/ContentResolver;Ljava/lang/String;J)Z\"/>\n\t\t<method name=\"putString(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;)Z\"/>\n\t\t<field name=\"ADB_ENABLED\"/>\n\t\t<field name=\"AIRPLANE_MODE_ON\"/>\n\t\t<field name=\"AIRPLANE_MODE_RADIOS\"/>\n\t\t<field name=\"ALWAYS_FINISH_ACTIVITIES\"/>\n\t\t<field name=\"ANIMATOR_DURATION_SCALE\"/>\n\t\t<field name=\"APPLY_RAMPING_RINGER\" since=\"29\"/>\n\t\t<field name=\"AUTO_TIME\"/>\n\t\t<field name=\"AUTO_TIME_ZONE\"/>\n\t\t<field name=\"BLUETOOTH_ON\"/>\n\t\t<field name=\"BOOT_COUNT\" since=\"24\"/>\n\t\t<field name=\"CONTACT_METADATA_SYNC_ENABLED\" since=\"24\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DATA_ROAMING\"/>\n\t\t<field name=\"DEBUG_APP\"/>\n\t\t<field name=\"DEVELOPMENT_SETTINGS_ENABLED\"/>\n\t\t<field name=\"DEVICE_NAME\" since=\"25\"/>\n\t\t<field name=\"DEVICE_PROVISIONED\"/>\n\t\t<field name=\"HTTP_PROXY\"/>\n\t\t<field name=\"INSTALL_NON_MARKET_APPS\" deprecated=\"21\"/>\n\t\t<field name=\"MODE_RINGER\"/>\n\t\t<field name=\"NETWORK_PREFERENCE\"/>\n\t\t<field name=\"RADIO_BLUETOOTH\"/>\n\t\t<field name=\"RADIO_CELL\"/>\n\t\t<field name=\"RADIO_NFC\"/>\n\t\t<field name=\"RADIO_WIFI\"/>\n\t\t<field name=\"SHOW_PROCESSES\" deprecated=\"25\"/>\n\t\t<field name=\"STAY_ON_WHILE_PLUGGED_IN\"/>\n\t\t<field name=\"SYS_PROP_SETTING_VERSION\" removed=\"24\"/>\n\t\t<field name=\"TRANSITION_ANIMATION_SCALE\"/>\n\t\t<field name=\"USB_MASS_STORAGE_ENABLED\"/>\n\t\t<field name=\"USE_GOOGLE_MAIL\"/>\n\t\t<field name=\"WAIT_FOR_DEBUGGER\"/>\n\t\t<field name=\"WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN\" since=\"23\"/>\n\t\t<field name=\"WIFI_MAX_DHCP_RETRY_COUNT\"/>\n\t\t<field name=\"WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS\"/>\n\t\t<field name=\"WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON\" deprecated=\"26\"/>\n\t\t<field name=\"WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY\"/>\n\t\t<field name=\"WIFI_NUM_OPEN_NETWORKS_KEPT\"/>\n\t\t<field name=\"WIFI_ON\"/>\n\t\t<field name=\"WIFI_SLEEP_POLICY\"/>\n\t\t<field name=\"WIFI_SLEEP_POLICY_DEFAULT\"/>\n\t\t<field name=\"WIFI_SLEEP_POLICY_NEVER\"/>\n\t\t<field name=\"WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED\"/>\n\t\t<field name=\"WIFI_WATCHDOG_ON\"/>\n\t\t<field name=\"WINDOW_ANIMATION_SCALE\"/>\n\t</class>\n\t<class name=\"android/provider/Settings$NameValueTable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getUriFor(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<method name=\"putString(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;)Z\"/>\n\t\t<field name=\"NAME\"/>\n\t\t<field name=\"VALUE\"/>\n\t</class>\n\t<class name=\"android/provider/Settings$Panel\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ACTION_INTERNET_CONNECTIVITY\"/>\n\t\t<field name=\"ACTION_NFC\"/>\n\t\t<field name=\"ACTION_VOLUME\"/>\n\t\t<field name=\"ACTION_WIFI\"/>\n\t</class>\n\t<class name=\"android/provider/Settings$Secure\" since=\"3\">\n\t\t<extends name=\"android/provider/Settings$NameValueTable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getFloat(Landroid/content/ContentResolver;Ljava/lang/String;)F\"/>\n\t\t<method name=\"getFloat(Landroid/content/ContentResolver;Ljava/lang/String;F)F\"/>\n\t\t<method name=\"getInt(Landroid/content/ContentResolver;Ljava/lang/String;)I\"/>\n\t\t<method name=\"getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I\"/>\n\t\t<method name=\"getLong(Landroid/content/ContentResolver;Ljava/lang/String;)J\"/>\n\t\t<method name=\"getLong(Landroid/content/ContentResolver;Ljava/lang/String;J)J\"/>\n\t\t<method name=\"getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getUriFor(Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<method name=\"isLocationProviderEnabled(Landroid/content/ContentResolver;Ljava/lang/String;)Z\" since=\"8\" deprecated=\"19\"/>\n\t\t<method name=\"putFloat(Landroid/content/ContentResolver;Ljava/lang/String;F)Z\"/>\n\t\t<method name=\"putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z\"/>\n\t\t<method name=\"putLong(Landroid/content/ContentResolver;Ljava/lang/String;J)Z\"/>\n\t\t<method name=\"putString(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"setLocationProviderEnabled(Landroid/content/ContentResolver;Ljava/lang/String;Z)V\" since=\"8\" deprecated=\"19\"/>\n\t\t<field name=\"ACCESSIBILITY_DISPLAY_INVERSION_ENABLED\" since=\"21\"/>\n\t\t<field name=\"ACCESSIBILITY_ENABLED\" since=\"4\"/>\n\t\t<field name=\"ACCESSIBILITY_SPEAK_PASSWORD\" since=\"15\" deprecated=\"26\"/>\n\t\t<field name=\"ADB_ENABLED\" deprecated=\"17\"/>\n\t\t<field name=\"ALLOWED_GEOLOCATION_ORIGINS\" since=\"8\"/>\n\t\t<field name=\"ALLOW_MOCK_LOCATION\" deprecated=\"23\"/>\n\t\t<field name=\"ANDROID_ID\"/>\n\t\t<field name=\"BACKGROUND_DATA\" deprecated=\"15\"/>\n\t\t<field name=\"BLUETOOTH_ON\" deprecated=\"17\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DATA_ROAMING\" deprecated=\"17\"/>\n\t\t<field name=\"DEFAULT_INPUT_METHOD\"/>\n\t\t<field name=\"DEVELOPMENT_SETTINGS_ENABLED\" since=\"16\" deprecated=\"17\"/>\n\t\t<field name=\"DEVICE_PROVISIONED\" deprecated=\"17\"/>\n\t\t<field name=\"ENABLED_ACCESSIBILITY_SERVICES\" since=\"4\"/>\n\t\t<field name=\"ENABLED_INPUT_METHODS\"/>\n\t\t<field name=\"HTTP_PROXY\" deprecated=\"17\"/>\n\t\t<field name=\"INPUT_METHOD_SELECTOR_VISIBILITY\" since=\"11\"/>\n\t\t<field name=\"INSTALL_NON_MARKET_APPS\" deprecated=\"17\"/>\n\t\t<field name=\"LOCATION_MODE\" since=\"19\" deprecated=\"28\"/>\n\t\t<field name=\"LOCATION_MODE_BATTERY_SAVING\" since=\"19\" deprecated=\"28\"/>\n\t\t<field name=\"LOCATION_MODE_HIGH_ACCURACY\" since=\"19\" deprecated=\"28\"/>\n\t\t<field name=\"LOCATION_MODE_OFF\" since=\"19\" deprecated=\"28\"/>\n\t\t<field name=\"LOCATION_MODE_SENSORS_ONLY\" since=\"19\" deprecated=\"28\"/>\n\t\t<field name=\"LOCATION_PROVIDERS_ALLOWED\" deprecated=\"19\"/>\n\t\t<field name=\"LOCK_PATTERN_ENABLED\" since=\"8\" deprecated=\"23\"/>\n\t\t<field name=\"LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED\" since=\"8\" deprecated=\"17\"/>\n\t\t<field name=\"LOCK_PATTERN_VISIBLE\" since=\"8\" deprecated=\"23\"/>\n\t\t<field name=\"LOGGING_ID\" deprecated=\"15\"/>\n\t\t<field name=\"NETWORK_PREFERENCE\" deprecated=\"17\"/>\n\t\t<field name=\"PARENTAL_CONTROL_ENABLED\"/>\n\t\t<field name=\"PARENTAL_CONTROL_LAST_UPDATE\"/>\n\t\t<field name=\"PARENTAL_CONTROL_REDIRECT_URL\"/>\n\t\t<field name=\"RTT_CALLING_MODE\" since=\"28\"/>\n\t\t<field name=\"SELECTED_INPUT_METHOD_SUBTYPE\" since=\"11\"/>\n\t\t<field name=\"SETTINGS_CLASSNAME\"/>\n\t\t<field name=\"SKIP_FIRST_USE_HINTS\" since=\"21\"/>\n\t\t<field name=\"SYS_PROP_SETTING_VERSION\" removed=\"24\"/>\n\t\t<field name=\"TOUCH_EXPLORATION_ENABLED\" since=\"14\"/>\n\t\t<field name=\"TTS_DEFAULT_COUNTRY\" since=\"4\" deprecated=\"15\"/>\n\t\t<field name=\"TTS_DEFAULT_LANG\" since=\"4\" deprecated=\"15\"/>\n\t\t<field name=\"TTS_DEFAULT_PITCH\" since=\"4\"/>\n\t\t<field name=\"TTS_DEFAULT_RATE\" since=\"4\"/>\n\t\t<field name=\"TTS_DEFAULT_SYNTH\" since=\"4\"/>\n\t\t<field name=\"TTS_DEFAULT_VARIANT\" since=\"4\" deprecated=\"15\"/>\n\t\t<field name=\"TTS_ENABLED_PLUGINS\" since=\"8\"/>\n\t\t<field name=\"TTS_USE_DEFAULTS\" since=\"4\" deprecated=\"15\"/>\n\t\t<field name=\"USB_MASS_STORAGE_ENABLED\" deprecated=\"17\"/>\n\t\t<field name=\"USE_GOOGLE_MAIL\" deprecated=\"17\"/>\n\t\t<field name=\"WIFI_MAX_DHCP_RETRY_COUNT\" deprecated=\"17\"/>\n\t\t<field name=\"WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS\" deprecated=\"17\"/>\n\t\t<field name=\"WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON\" deprecated=\"17\"/>\n\t\t<field name=\"WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY\" deprecated=\"17\"/>\n\t\t<field name=\"WIFI_NUM_OPEN_NETWORKS_KEPT\" deprecated=\"17\"/>\n\t\t<field name=\"WIFI_ON\" deprecated=\"17\"/>\n\t\t<field name=\"WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_WATCHDOG_AP_COUNT\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_WATCHDOG_MAX_AP_CHECKS\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_WATCHDOG_ON\" deprecated=\"17\"/>\n\t\t<field name=\"WIFI_WATCHDOG_PING_COUNT\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_WATCHDOG_PING_DELAY_MS\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_WATCHDOG_PING_TIMEOUT_MS\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_WATCHDOG_WATCH_LIST\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/provider/Settings$SettingNotFoundException\" since=\"1\">\n\t\t<extends name=\"android/util/AndroidException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/provider/Settings$System\" since=\"1\">\n\t\t<extends name=\"android/provider/Settings$NameValueTable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"canWrite(Landroid/content/Context;)Z\" since=\"23\"/>\n\t\t<method name=\"getConfiguration(Landroid/content/ContentResolver;Landroid/content/res/Configuration;)V\"/>\n\t\t<method name=\"getFloat(Landroid/content/ContentResolver;Ljava/lang/String;)F\"/>\n\t\t<method name=\"getFloat(Landroid/content/ContentResolver;Ljava/lang/String;F)F\"/>\n\t\t<method name=\"getInt(Landroid/content/ContentResolver;Ljava/lang/String;)I\"/>\n\t\t<method name=\"getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I\"/>\n\t\t<method name=\"getLong(Landroid/content/ContentResolver;Ljava/lang/String;)J\" since=\"3\"/>\n\t\t<method name=\"getLong(Landroid/content/ContentResolver;Ljava/lang/String;J)J\" since=\"3\"/>\n\t\t<method name=\"getShowGTalkServiceStatus(Landroid/content/ContentResolver;)Z\" deprecated=\"17\"/>\n\t\t<method name=\"getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getUriFor(Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<method name=\"putConfiguration(Landroid/content/ContentResolver;Landroid/content/res/Configuration;)Z\"/>\n\t\t<method name=\"putFloat(Landroid/content/ContentResolver;Ljava/lang/String;F)Z\"/>\n\t\t<method name=\"putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z\"/>\n\t\t<method name=\"putLong(Landroid/content/ContentResolver;Ljava/lang/String;J)Z\" since=\"3\"/>\n\t\t<method name=\"putString(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"setShowGTalkServiceStatus(Landroid/content/ContentResolver;Z)V\" deprecated=\"17\"/>\n\t\t<field name=\"ACCELEROMETER_ROTATION\" since=\"3\"/>\n\t\t<field name=\"ADB_ENABLED\" deprecated=\"15\"/>\n\t\t<field name=\"AIRPLANE_MODE_ON\" deprecated=\"17\"/>\n\t\t<field name=\"AIRPLANE_MODE_RADIOS\" deprecated=\"17\"/>\n\t\t<field name=\"ALARM_ALERT\" since=\"5\"/>\n\t\t<field name=\"ALWAYS_FINISH_ACTIVITIES\" deprecated=\"17\"/>\n\t\t<field name=\"ANDROID_ID\" deprecated=\"15\"/>\n\t\t<field name=\"ANIMATOR_DURATION_SCALE\" since=\"16\" deprecated=\"17\"/>\n\t\t<field name=\"APPEND_FOR_LAST_AUDIBLE\" removed=\"23\"/>\n\t\t<field name=\"AUTO_TIME\" deprecated=\"17\"/>\n\t\t<field name=\"AUTO_TIME_ZONE\" since=\"11\" deprecated=\"17\"/>\n\t\t<field name=\"BLUETOOTH_DISCOVERABILITY\"/>\n\t\t<field name=\"BLUETOOTH_DISCOVERABILITY_TIMEOUT\"/>\n\t\t<field name=\"BLUETOOTH_ON\" deprecated=\"15\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DATA_ROAMING\" deprecated=\"15\"/>\n\t\t<field name=\"DATE_FORMAT\"/>\n\t\t<field name=\"DEBUG_APP\" deprecated=\"17\"/>\n\t\t<field name=\"DEFAULT_ALARM_ALERT_URI\" since=\"5\"/>\n\t\t<field name=\"DEFAULT_NOTIFICATION_URI\"/>\n\t\t<field name=\"DEFAULT_RINGTONE_URI\"/>\n\t\t<field name=\"DEVICE_PROVISIONED\" deprecated=\"15\"/>\n\t\t<field name=\"DIM_SCREEN\" deprecated=\"17\"/>\n\t\t<field name=\"DTMF_TONE_TYPE_WHEN_DIALING\" since=\"23\"/>\n\t\t<field name=\"DTMF_TONE_WHEN_DIALING\"/>\n\t\t<field name=\"END_BUTTON_BEHAVIOR\"/>\n\t\t<field name=\"FONT_SCALE\"/>\n\t\t<field name=\"HAPTIC_FEEDBACK_ENABLED\" since=\"3\"/>\n\t\t<field name=\"HTTP_PROXY\" deprecated=\"15\"/>\n\t\t<field name=\"INSTALL_NON_MARKET_APPS\" deprecated=\"15\"/>\n\t\t<field name=\"LOCATION_PROVIDERS_ALLOWED\" deprecated=\"15\"/>\n\t\t<field name=\"LOCK_PATTERN_ENABLED\" deprecated=\"15\"/>\n\t\t<field name=\"LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED\" since=\"3\" deprecated=\"15\"/>\n\t\t<field name=\"LOCK_PATTERN_VISIBLE\" deprecated=\"15\"/>\n\t\t<field name=\"LOGGING_ID\" deprecated=\"15\"/>\n\t\t<field name=\"MODE_RINGER\" deprecated=\"17\"/>\n\t\t<field name=\"MODE_RINGER_STREAMS_AFFECTED\"/>\n\t\t<field name=\"MUTE_STREAMS_AFFECTED\"/>\n\t\t<field name=\"NETWORK_PREFERENCE\" deprecated=\"15\"/>\n\t\t<field name=\"NEXT_ALARM_FORMATTED\" deprecated=\"21\"/>\n\t\t<field name=\"NOTIFICATION_SOUND\"/>\n\t\t<field name=\"PARENTAL_CONTROL_ENABLED\" deprecated=\"15\"/>\n\t\t<field name=\"PARENTAL_CONTROL_LAST_UPDATE\" deprecated=\"15\"/>\n\t\t<field name=\"PARENTAL_CONTROL_REDIRECT_URL\" deprecated=\"15\"/>\n\t\t<field name=\"RADIO_BLUETOOTH\" deprecated=\"17\"/>\n\t\t<field name=\"RADIO_CELL\" deprecated=\"17\"/>\n\t\t<field name=\"RADIO_NFC\" since=\"14\" deprecated=\"17\"/>\n\t\t<field name=\"RADIO_WIFI\" deprecated=\"17\"/>\n\t\t<field name=\"RINGTONE\"/>\n\t\t<field name=\"SCREEN_BRIGHTNESS\"/>\n\t\t<field name=\"SCREEN_BRIGHTNESS_MODE\" since=\"8\"/>\n\t\t<field name=\"SCREEN_BRIGHTNESS_MODE_AUTOMATIC\" since=\"8\"/>\n\t\t<field name=\"SCREEN_BRIGHTNESS_MODE_MANUAL\" since=\"8\"/>\n\t\t<field name=\"SCREEN_OFF_TIMEOUT\"/>\n\t\t<field name=\"SETTINGS_CLASSNAME\" deprecated=\"15\"/>\n\t\t<field name=\"SETUP_WIZARD_HAS_RUN\"/>\n\t\t<field name=\"SHOW_GTALK_SERVICE_STATUS\"/>\n\t\t<field name=\"SHOW_PROCESSES\" deprecated=\"17\"/>\n\t\t<field name=\"SHOW_WEB_SUGGESTIONS\" since=\"4\" deprecated=\"15\"/>\n\t\t<field name=\"SOUND_EFFECTS_ENABLED\"/>\n\t\t<field name=\"STAY_ON_WHILE_PLUGGED_IN\" deprecated=\"17\"/>\n\t\t<field name=\"SYS_PROP_SETTING_VERSION\" removed=\"24\"/>\n\t\t<field name=\"TEXT_AUTO_CAPS\"/>\n\t\t<field name=\"TEXT_AUTO_PUNCTUATE\"/>\n\t\t<field name=\"TEXT_AUTO_REPLACE\"/>\n\t\t<field name=\"TEXT_SHOW_PASSWORD\"/>\n\t\t<field name=\"TIME_12_24\"/>\n\t\t<field name=\"TRANSITION_ANIMATION_SCALE\" deprecated=\"17\"/>\n\t\t<field name=\"USB_MASS_STORAGE_ENABLED\" deprecated=\"15\"/>\n\t\t<field name=\"USER_ROTATION\" since=\"11\"/>\n\t\t<field name=\"USE_GOOGLE_MAIL\" deprecated=\"15\"/>\n\t\t<field name=\"VIBRATE_ON\"/>\n\t\t<field name=\"VIBRATE_WHEN_RINGING\" since=\"23\"/>\n\t\t<field name=\"VOLUME_ALARM\" removed=\"23\"/>\n\t\t<field name=\"VOLUME_BLUETOOTH_SCO\" since=\"8\" removed=\"23\"/>\n\t\t<field name=\"VOLUME_MUSIC\" removed=\"23\"/>\n\t\t<field name=\"VOLUME_NOTIFICATION\" since=\"3\" removed=\"23\"/>\n\t\t<field name=\"VOLUME_RING\" removed=\"23\"/>\n\t\t<field name=\"VOLUME_SETTINGS\" removed=\"23\"/>\n\t\t<field name=\"VOLUME_SYSTEM\" removed=\"23\"/>\n\t\t<field name=\"VOLUME_VOICE\" removed=\"23\"/>\n\t\t<field name=\"WAIT_FOR_DEBUGGER\" deprecated=\"17\"/>\n\t\t<field name=\"WALLPAPER_ACTIVITY\" deprecated=\"17\"/>\n\t\t<field name=\"WIFI_MAX_DHCP_RETRY_COUNT\" since=\"3\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS\" since=\"3\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_NUM_OPEN_NETWORKS_KEPT\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_ON\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_SLEEP_POLICY\" since=\"3\" deprecated=\"17\"/>\n\t\t<field name=\"WIFI_SLEEP_POLICY_DEFAULT\" since=\"3\" deprecated=\"17\"/>\n\t\t<field name=\"WIFI_SLEEP_POLICY_NEVER\" since=\"3\" deprecated=\"17\"/>\n\t\t<field name=\"WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED\" since=\"3\" deprecated=\"17\"/>\n\t\t<field name=\"WIFI_STATIC_DNS1\" deprecated=\"17\"/>\n\t\t<field name=\"WIFI_STATIC_DNS2\" deprecated=\"17\"/>\n\t\t<field name=\"WIFI_STATIC_GATEWAY\" deprecated=\"17\"/>\n\t\t<field name=\"WIFI_STATIC_IP\" deprecated=\"17\"/>\n\t\t<field name=\"WIFI_STATIC_NETMASK\" deprecated=\"17\"/>\n\t\t<field name=\"WIFI_USE_STATIC_IP\" deprecated=\"17\"/>\n\t\t<field name=\"WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_WATCHDOG_AP_COUNT\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_WATCHDOG_MAX_AP_CHECKS\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_WATCHDOG_ON\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_WATCHDOG_PING_COUNT\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_WATCHDOG_PING_DELAY_MS\" deprecated=\"15\"/>\n\t\t<field name=\"WIFI_WATCHDOG_PING_TIMEOUT_MS\" deprecated=\"15\"/>\n\t\t<field name=\"WINDOW_ANIMATION_SCALE\" deprecated=\"17\"/>\n\t</class>\n\t<class name=\"android/provider/SettingsSlicesContract\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"AUTHORITY\"/>\n\t\t<field name=\"BASE_URI\"/>\n\t\t<field name=\"KEY_AIRPLANE_MODE\"/>\n\t\t<field name=\"KEY_BATTERY_SAVER\"/>\n\t\t<field name=\"KEY_BLUETOOTH\"/>\n\t\t<field name=\"KEY_LOCATION\"/>\n\t\t<field name=\"KEY_WIFI\"/>\n\t\t<field name=\"PATH_SETTING_ACTION\"/>\n\t\t<field name=\"PATH_SETTING_INTENT\"/>\n\t</class>\n\t<class name=\"android/provider/SyncStateContract\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/provider/SyncStateContract$Columns\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<field name=\"ACCOUNT_NAME\"/>\n\t\t<field name=\"ACCOUNT_TYPE\"/>\n\t\t<field name=\"DATA\"/>\n\t</class>\n\t<class name=\"android/provider/SyncStateContract$Constants\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/SyncStateContract$Columns\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"CONTENT_DIRECTORY\"/>\n\t</class>\n\t<class name=\"android/provider/SyncStateContract$Helpers\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"get(Landroid/content/ContentProviderClient;Landroid/net/Uri;Landroid/accounts/Account;)[B\"/>\n\t\t<method name=\"getWithUri(Landroid/content/ContentProviderClient;Landroid/net/Uri;Landroid/accounts/Account;)Landroid/util/Pair;\"/>\n\t\t<method name=\"insert(Landroid/content/ContentProviderClient;Landroid/net/Uri;Landroid/accounts/Account;[B)Landroid/net/Uri;\"/>\n\t\t<method name=\"newSetOperation(Landroid/net/Uri;Landroid/accounts/Account;[B)Landroid/content/ContentProviderOperation;\"/>\n\t\t<method name=\"newUpdateOperation(Landroid/net/Uri;[B)Landroid/content/ContentProviderOperation;\"/>\n\t\t<method name=\"set(Landroid/content/ContentProviderClient;Landroid/net/Uri;Landroid/accounts/Account;[B)V\"/>\n\t\t<method name=\"update(Landroid/content/ContentProviderClient;Landroid/net/Uri;[B)V\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$BaseMmsColumns\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<field name=\"CONTENT_CLASS\"/>\n\t\t<field name=\"CONTENT_LOCATION\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CREATOR\" since=\"21\"/>\n\t\t<field name=\"DATE\"/>\n\t\t<field name=\"DATE_SENT\"/>\n\t\t<field name=\"DELIVERY_REPORT\"/>\n\t\t<field name=\"DELIVERY_TIME\"/>\n\t\t<field name=\"EXPIRY\"/>\n\t\t<field name=\"LOCKED\"/>\n\t\t<field name=\"MESSAGE_BOX\"/>\n\t\t<field name=\"MESSAGE_BOX_ALL\"/>\n\t\t<field name=\"MESSAGE_BOX_DRAFTS\"/>\n\t\t<field name=\"MESSAGE_BOX_FAILED\" since=\"21\"/>\n\t\t<field name=\"MESSAGE_BOX_INBOX\"/>\n\t\t<field name=\"MESSAGE_BOX_OUTBOX\"/>\n\t\t<field name=\"MESSAGE_BOX_SENT\"/>\n\t\t<field name=\"MESSAGE_CLASS\"/>\n\t\t<field name=\"MESSAGE_ID\"/>\n\t\t<field name=\"MESSAGE_SIZE\"/>\n\t\t<field name=\"MESSAGE_TYPE\"/>\n\t\t<field name=\"MMS_VERSION\"/>\n\t\t<field name=\"PRIORITY\"/>\n\t\t<field name=\"READ\"/>\n\t\t<field name=\"READ_REPORT\"/>\n\t\t<field name=\"READ_STATUS\"/>\n\t\t<field name=\"REPORT_ALLOWED\"/>\n\t\t<field name=\"RESPONSE_STATUS\"/>\n\t\t<field name=\"RESPONSE_TEXT\"/>\n\t\t<field name=\"RETRIEVE_STATUS\"/>\n\t\t<field name=\"RETRIEVE_TEXT\"/>\n\t\t<field name=\"RETRIEVE_TEXT_CHARSET\"/>\n\t\t<field name=\"SEEN\"/>\n\t\t<field name=\"STATUS\"/>\n\t\t<field name=\"SUBJECT\"/>\n\t\t<field name=\"SUBJECT_CHARSET\"/>\n\t\t<field name=\"SUBSCRIPTION_ID\" since=\"22\"/>\n\t\t<field name=\"TEXT_ONLY\"/>\n\t\t<field name=\"THREAD_ID\"/>\n\t\t<field name=\"TRANSACTION_ID\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$CanonicalAddressesColumns\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<field name=\"ADDRESS\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$CarrierId\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<method name=\"getSpecificCarrierIdUriForSubscriptionId(I)Landroid/net/Uri;\" since=\"29\"/>\n\t\t<method name=\"getUriForSubscriptionId(I)Landroid/net/Uri;\"/>\n\t\t<field name=\"CARRIER_ID\"/>\n\t\t<field name=\"CARRIER_NAME\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"SPECIFIC_CARRIER_ID\" since=\"29\"/>\n\t\t<field name=\"SPECIFIC_CARRIER_ID_NAME\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$Carriers\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<field name=\"APN\"/>\n\t\t<field name=\"AUTH_TYPE\"/>\n\t\t<field name=\"BEARER\" deprecated=\"28\"/>\n\t\t<field name=\"CARRIER_ENABLED\"/>\n\t\t<field name=\"CARRIER_ID\" since=\"29\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"CURRENT\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t\t<field name=\"MCC\" deprecated=\"29\"/>\n\t\t<field name=\"MMSC\"/>\n\t\t<field name=\"MMSPORT\"/>\n\t\t<field name=\"MMSPROXY\"/>\n\t\t<field name=\"MNC\" deprecated=\"29\"/>\n\t\t<field name=\"MVNO_MATCH_DATA\" deprecated=\"29\"/>\n\t\t<field name=\"MVNO_TYPE\" deprecated=\"29\"/>\n\t\t<field name=\"NAME\"/>\n\t\t<field name=\"NETWORK_TYPE_BITMASK\" since=\"28\"/>\n\t\t<field name=\"NUMERIC\" deprecated=\"29\"/>\n\t\t<field name=\"PASSWORD\"/>\n\t\t<field name=\"PORT\"/>\n\t\t<field name=\"PROTOCOL\"/>\n\t\t<field name=\"PROXY\"/>\n\t\t<field name=\"ROAMING_PROTOCOL\"/>\n\t\t<field name=\"SERVER\"/>\n\t\t<field name=\"SIM_APN_URI\" since=\"29\"/>\n\t\t<field name=\"SUBSCRIPTION_ID\" since=\"22\"/>\n\t\t<field name=\"TYPE\"/>\n\t\t<field name=\"USER\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$Mms\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/Telephony$BaseMmsColumns\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t\t<field name=\"REPORT_REQUEST_URI\"/>\n\t\t<field name=\"REPORT_STATUS_URI\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$Mms$Addr\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<method name=\"getAddrUriForMessage(Ljava/lang/String;)Landroid/net/Uri;\" since=\"30\"/>\n\t\t<field name=\"ADDRESS\"/>\n\t\t<field name=\"CHARSET\"/>\n\t\t<field name=\"CONTACT_ID\"/>\n\t\t<field name=\"MSG_ID\"/>\n\t\t<field name=\"TYPE\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$Mms$Draft\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/Telephony$BaseMmsColumns\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$Mms$Inbox\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/Telephony$BaseMmsColumns\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$Mms$Intents\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CONTENT_CHANGED_ACTION\"/>\n\t\t<field name=\"DELETED_CONTENTS\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$Mms$Outbox\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/Telephony$BaseMmsColumns\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$Mms$Part\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<method name=\"getPartUriForMessage(Ljava/lang/String;)Landroid/net/Uri;\" since=\"30\"/>\n\t\t<field name=\"CHARSET\"/>\n\t\t<field name=\"CONTENT_DISPOSITION\"/>\n\t\t<field name=\"CONTENT_ID\"/>\n\t\t<field name=\"CONTENT_LOCATION\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\" since=\"29\"/>\n\t\t<field name=\"CT_START\"/>\n\t\t<field name=\"CT_TYPE\"/>\n\t\t<field name=\"FILENAME\"/>\n\t\t<field name=\"MSG_ID\"/>\n\t\t<field name=\"NAME\"/>\n\t\t<field name=\"SEQ\"/>\n\t\t<field name=\"TEXT\"/>\n\t\t<field name=\"_DATA\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$Mms$Rate\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"SENT_TIME\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$Mms$Sent\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/Telephony$BaseMmsColumns\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$MmsSms\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<field name=\"CONTENT_CONVERSATIONS_URI\"/>\n\t\t<field name=\"CONTENT_DRAFT_URI\"/>\n\t\t<field name=\"CONTENT_FILTER_BYPHONE_URI\"/>\n\t\t<field name=\"CONTENT_LOCKED_URI\"/>\n\t\t<field name=\"CONTENT_UNDELIVERED_URI\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"ERR_TYPE_GENERIC\"/>\n\t\t<field name=\"ERR_TYPE_GENERIC_PERMANENT\"/>\n\t\t<field name=\"ERR_TYPE_MMS_PROTO_PERMANENT\"/>\n\t\t<field name=\"ERR_TYPE_MMS_PROTO_TRANSIENT\"/>\n\t\t<field name=\"ERR_TYPE_SMS_PROTO_PERMANENT\"/>\n\t\t<field name=\"ERR_TYPE_SMS_PROTO_TRANSIENT\"/>\n\t\t<field name=\"ERR_TYPE_TRANSPORT_FAILURE\"/>\n\t\t<field name=\"MMS_PROTO\"/>\n\t\t<field name=\"NO_ERROR\"/>\n\t\t<field name=\"SEARCH_URI\"/>\n\t\t<field name=\"SMS_PROTO\"/>\n\t\t<field name=\"TYPE_DISCRIMINATOR_COLUMN\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$MmsSms$PendingMessages\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DUE_TIME\"/>\n\t\t<field name=\"ERROR_CODE\"/>\n\t\t<field name=\"ERROR_TYPE\"/>\n\t\t<field name=\"LAST_TRY\"/>\n\t\t<field name=\"MSG_ID\"/>\n\t\t<field name=\"MSG_TYPE\"/>\n\t\t<field name=\"PROTO_TYPE\"/>\n\t\t<field name=\"RETRY_INDEX\"/>\n\t\t<field name=\"SUBSCRIPTION_ID\" since=\"22\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$ServiceStateTable\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getUriForSubscriptionId(I)Landroid/net/Uri;\"/>\n\t\t<method name=\"getUriForSubscriptionIdAndField(ILjava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<field name=\"AUTHORITY\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"IS_MANUAL_NETWORK_SELECTION\"/>\n\t\t<field name=\"VOICE_OPERATOR_NUMERIC\"/>\n\t\t<field name=\"VOICE_REG_STATE\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$Sms\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/Telephony$TextBasedSmsColumns\"/>\n\t\t<method name=\"getDefaultSmsPackage(Landroid/content/Context;)Ljava/lang/String;\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$Sms$Conversations\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/Telephony$TextBasedSmsColumns\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t\t<field name=\"MESSAGE_COUNT\"/>\n\t\t<field name=\"SNIPPET\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$Sms$Draft\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/Telephony$TextBasedSmsColumns\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$Sms$Inbox\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/Telephony$TextBasedSmsColumns\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$Sms$Intents\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getMessagesFromIntent(Landroid/content/Intent;)[Landroid/telephony/SmsMessage;\"/>\n\t\t<field name=\"ACTION_CHANGE_DEFAULT\"/>\n\t\t<field name=\"ACTION_DEFAULT_SMS_PACKAGE_CHANGED\" since=\"24\"/>\n\t\t<field name=\"ACTION_EXTERNAL_PROVIDER_CHANGE\" since=\"24\"/>\n\t\t<field name=\"DATA_SMS_RECEIVED_ACTION\"/>\n\t\t<field name=\"EXTRA_IS_DEFAULT_SMS_APP\" since=\"24\"/>\n\t\t<field name=\"EXTRA_PACKAGE_NAME\"/>\n\t\t<field name=\"RESULT_SMS_DUPLICATED\"/>\n\t\t<field name=\"RESULT_SMS_GENERIC_ERROR\"/>\n\t\t<field name=\"RESULT_SMS_HANDLED\"/>\n\t\t<field name=\"RESULT_SMS_OUT_OF_MEMORY\"/>\n\t\t<field name=\"RESULT_SMS_UNSUPPORTED\"/>\n\t\t<field name=\"SECRET_CODE_ACTION\" since=\"28\" deprecated=\"29\"/>\n\t\t<field name=\"SIM_FULL_ACTION\"/>\n\t\t<field name=\"SMS_CB_RECEIVED_ACTION\"/>\n\t\t<field name=\"SMS_DELIVER_ACTION\"/>\n\t\t<field name=\"SMS_EMERGENCY_CB_RECEIVED_ACTION\" removed=\"24\"/>\n\t\t<field name=\"SMS_RECEIVED_ACTION\"/>\n\t\t<field name=\"SMS_REJECTED_ACTION\"/>\n\t\t<field name=\"SMS_SERVICE_CATEGORY_PROGRAM_DATA_RECEIVED_ACTION\"/>\n\t\t<field name=\"WAP_PUSH_DELIVER_ACTION\"/>\n\t\t<field name=\"WAP_PUSH_RECEIVED_ACTION\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$Sms$Outbox\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/Telephony$TextBasedSmsColumns\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$Sms$Sent\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/Telephony$TextBasedSmsColumns\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$TextBasedSmsColumns\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ADDRESS\"/>\n\t\t<field name=\"BODY\"/>\n\t\t<field name=\"CREATOR\" since=\"21\"/>\n\t\t<field name=\"DATE\"/>\n\t\t<field name=\"DATE_SENT\"/>\n\t\t<field name=\"ERROR_CODE\"/>\n\t\t<field name=\"LOCKED\"/>\n\t\t<field name=\"MESSAGE_TYPE_ALL\"/>\n\t\t<field name=\"MESSAGE_TYPE_DRAFT\"/>\n\t\t<field name=\"MESSAGE_TYPE_FAILED\"/>\n\t\t<field name=\"MESSAGE_TYPE_INBOX\"/>\n\t\t<field name=\"MESSAGE_TYPE_OUTBOX\"/>\n\t\t<field name=\"MESSAGE_TYPE_QUEUED\"/>\n\t\t<field name=\"MESSAGE_TYPE_SENT\"/>\n\t\t<field name=\"PERSON\"/>\n\t\t<field name=\"PROTOCOL\"/>\n\t\t<field name=\"READ\"/>\n\t\t<field name=\"REPLY_PATH_PRESENT\"/>\n\t\t<field name=\"SEEN\"/>\n\t\t<field name=\"SERVICE_CENTER\"/>\n\t\t<field name=\"STATUS\"/>\n\t\t<field name=\"STATUS_COMPLETE\"/>\n\t\t<field name=\"STATUS_FAILED\"/>\n\t\t<field name=\"STATUS_NONE\"/>\n\t\t<field name=\"STATUS_PENDING\"/>\n\t\t<field name=\"SUBJECT\"/>\n\t\t<field name=\"SUBSCRIPTION_ID\" since=\"22\"/>\n\t\t<field name=\"THREAD_ID\"/>\n\t\t<field name=\"TYPE\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$Threads\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/Telephony$ThreadsColumns\"/>\n\t\t<method name=\"getOrCreateThreadId(Landroid/content/Context;Ljava/lang/String;)J\" since=\"23\"/>\n\t\t<method name=\"getOrCreateThreadId(Landroid/content/Context;Ljava/util/Set;)J\" since=\"23\"/>\n\t\t<field name=\"BROADCAST_THREAD\"/>\n\t\t<field name=\"COMMON_THREAD\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"OBSOLETE_THREADS_URI\"/>\n\t</class>\n\t<class name=\"android/provider/Telephony$ThreadsColumns\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<field name=\"ARCHIVED\" since=\"21\"/>\n\t\t<field name=\"DATE\"/>\n\t\t<field name=\"ERROR\"/>\n\t\t<field name=\"HAS_ATTACHMENT\"/>\n\t\t<field name=\"MESSAGE_COUNT\"/>\n\t\t<field name=\"READ\"/>\n\t\t<field name=\"RECIPIENT_IDS\"/>\n\t\t<field name=\"SNIPPET\"/>\n\t\t<field name=\"SNIPPET_CHARSET\"/>\n\t\t<field name=\"TYPE\"/>\n\t</class>\n\t<class name=\"android/provider/UserDictionary\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"AUTHORITY\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t</class>\n\t<class name=\"android/provider/UserDictionary$Words\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addWord(Landroid/content/Context;Ljava/lang/String;II)V\" deprecated=\"16\"/>\n\t\t<method name=\"addWord(Landroid/content/Context;Ljava/lang/String;ILjava/lang/String;Ljava/util/Locale;)V\" since=\"16\"/>\n\t\t<field name=\"APP_ID\"/>\n\t\t<field name=\"CONTENT_ITEM_TYPE\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DEFAULT_SORT_ORDER\"/>\n\t\t<field name=\"FREQUENCY\"/>\n\t\t<field name=\"LOCALE\"/>\n\t\t<field name=\"LOCALE_TYPE_ALL\" deprecated=\"16\"/>\n\t\t<field name=\"LOCALE_TYPE_CURRENT\" deprecated=\"16\"/>\n\t\t<field name=\"SHORTCUT\" since=\"16\"/>\n\t\t<field name=\"WORD\"/>\n\t\t<field name=\"_ID\"/>\n\t</class>\n\t<class name=\"android/provider/VoicemailContract\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ACTION_FETCH_VOICEMAIL\"/>\n\t\t<field name=\"ACTION_NEW_VOICEMAIL\"/>\n\t\t<field name=\"ACTION_SYNC_VOICEMAIL\" since=\"24\"/>\n\t\t<field name=\"AUTHORITY\"/>\n\t\t<field name=\"EXTRA_PHONE_ACCOUNT_HANDLE\" since=\"25\"/>\n\t\t<field name=\"EXTRA_SELF_CHANGE\"/>\n\t\t<field name=\"PARAM_KEY_SOURCE_PACKAGE\"/>\n\t</class>\n\t<class name=\"android/provider/VoicemailContract$Status\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<method name=\"buildSourceUri(Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<field name=\"CONFIGURATION_STATE\"/>\n\t\t<field name=\"CONFIGURATION_STATE_CAN_BE_CONFIGURED\"/>\n\t\t<field name=\"CONFIGURATION_STATE_CONFIGURING\" since=\"25\"/>\n\t\t<field name=\"CONFIGURATION_STATE_DISABLED\" since=\"25\"/>\n\t\t<field name=\"CONFIGURATION_STATE_FAILED\" since=\"25\"/>\n\t\t<field name=\"CONFIGURATION_STATE_NOT_CONFIGURED\"/>\n\t\t<field name=\"CONFIGURATION_STATE_OK\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DATA_CHANNEL_STATE\"/>\n\t\t<field name=\"DATA_CHANNEL_STATE_BAD_CONFIGURATION\" since=\"24\"/>\n\t\t<field name=\"DATA_CHANNEL_STATE_COMMUNICATION_ERROR\" since=\"24\"/>\n\t\t<field name=\"DATA_CHANNEL_STATE_NO_CONNECTION\"/>\n\t\t<field name=\"DATA_CHANNEL_STATE_NO_CONNECTION_CELLULAR_REQUIRED\" since=\"24\"/>\n\t\t<field name=\"DATA_CHANNEL_STATE_OK\"/>\n\t\t<field name=\"DATA_CHANNEL_STATE_SERVER_CONNECTION_ERROR\" since=\"24\"/>\n\t\t<field name=\"DATA_CHANNEL_STATE_SERVER_ERROR\" since=\"24\"/>\n\t\t<field name=\"DIR_TYPE\"/>\n\t\t<field name=\"ITEM_TYPE\"/>\n\t\t<field name=\"NOTIFICATION_CHANNEL_STATE\"/>\n\t\t<field name=\"NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING\"/>\n\t\t<field name=\"NOTIFICATION_CHANNEL_STATE_NO_CONNECTION\"/>\n\t\t<field name=\"NOTIFICATION_CHANNEL_STATE_OK\"/>\n\t\t<field name=\"PHONE_ACCOUNT_COMPONENT_NAME\" since=\"23\"/>\n\t\t<field name=\"PHONE_ACCOUNT_ID\" since=\"23\"/>\n\t\t<field name=\"QUOTA_OCCUPIED\" since=\"24\"/>\n\t\t<field name=\"QUOTA_TOTAL\" since=\"24\"/>\n\t\t<field name=\"QUOTA_UNAVAILABLE\" since=\"24\"/>\n\t\t<field name=\"SETTINGS_URI\"/>\n\t\t<field name=\"SOURCE_PACKAGE\"/>\n\t\t<field name=\"SOURCE_TYPE\" since=\"25\"/>\n\t\t<field name=\"VOICEMAIL_ACCESS_URI\"/>\n\t</class>\n\t<class name=\"android/provider/VoicemailContract$Voicemails\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/provider/BaseColumns\"/>\n\t\t<implements name=\"android/provider/OpenableColumns\"/>\n\t\t<method name=\"buildSourceUri(Ljava/lang/String;)Landroid/net/Uri;\"/>\n\t\t<field name=\"ARCHIVED\" since=\"26\"/>\n\t\t<field name=\"BACKED_UP\" since=\"26\"/>\n\t\t<field name=\"CONTENT_URI\"/>\n\t\t<field name=\"DATE\"/>\n\t\t<field name=\"DELETED\" since=\"23\"/>\n\t\t<field name=\"DIRTY\" since=\"23\"/>\n\t\t<field name=\"DIRTY_RETAIN\" since=\"28\"/>\n\t\t<field name=\"DIR_TYPE\"/>\n\t\t<field name=\"DURATION\"/>\n\t\t<field name=\"HAS_CONTENT\"/>\n\t\t<field name=\"IS_OMTP_VOICEMAIL\" since=\"26\"/>\n\t\t<field name=\"IS_READ\"/>\n\t\t<field name=\"ITEM_TYPE\"/>\n\t\t<field name=\"LAST_MODIFIED\" since=\"24\"/>\n\t\t<field name=\"MIME_TYPE\"/>\n\t\t<field name=\"NEW\" since=\"28\"/>\n\t\t<field name=\"NUMBER\"/>\n\t\t<field name=\"PHONE_ACCOUNT_COMPONENT_NAME\" since=\"23\"/>\n\t\t<field name=\"PHONE_ACCOUNT_ID\" since=\"23\"/>\n\t\t<field name=\"RESTORED\" since=\"26\"/>\n\t\t<field name=\"SOURCE_DATA\"/>\n\t\t<field name=\"SOURCE_PACKAGE\"/>\n\t\t<field name=\"TRANSCRIPTION\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/renderscript/Allocation\" since=\"11\">\n\t\t<extends name=\"android/renderscript/BaseObj\"/>\n\t\t<method name=\"copy1DRangeFrom(IILandroid/renderscript/Allocation;I)V\" since=\"14\"/>\n\t\t<method name=\"copy1DRangeFrom(IILjava/lang/Object;)V\" since=\"21\"/>\n\t\t<method name=\"copy1DRangeFrom(II[B)V\"/>\n\t\t<method name=\"copy1DRangeFrom(II[F)V\"/>\n\t\t<method name=\"copy1DRangeFrom(II[I)V\"/>\n\t\t<method name=\"copy1DRangeFrom(II[S)V\"/>\n\t\t<method name=\"copy1DRangeFromUnchecked(IILjava/lang/Object;)V\" since=\"21\"/>\n\t\t<method name=\"copy1DRangeFromUnchecked(II[B)V\"/>\n\t\t<method name=\"copy1DRangeFromUnchecked(II[F)V\"/>\n\t\t<method name=\"copy1DRangeFromUnchecked(II[I)V\"/>\n\t\t<method name=\"copy1DRangeFromUnchecked(II[S)V\"/>\n\t\t<method name=\"copy1DRangeTo(IILjava/lang/Object;)V\" since=\"23\"/>\n\t\t<method name=\"copy1DRangeTo(II[B)V\" since=\"23\"/>\n\t\t<method name=\"copy1DRangeTo(II[F)V\" since=\"23\"/>\n\t\t<method name=\"copy1DRangeTo(II[I)V\" since=\"23\"/>\n\t\t<method name=\"copy1DRangeTo(II[S)V\" since=\"23\"/>\n\t\t<method name=\"copy1DRangeToUnchecked(IILjava/lang/Object;)V\" since=\"23\"/>\n\t\t<method name=\"copy1DRangeToUnchecked(II[B)V\" since=\"23\"/>\n\t\t<method name=\"copy1DRangeToUnchecked(II[F)V\" since=\"23\"/>\n\t\t<method name=\"copy1DRangeToUnchecked(II[I)V\" since=\"23\"/>\n\t\t<method name=\"copy1DRangeToUnchecked(II[S)V\" since=\"23\"/>\n\t\t<method name=\"copy2DRangeFrom(IIIILandroid/renderscript/Allocation;II)V\" since=\"14\"/>\n\t\t<method name=\"copy2DRangeFrom(IIIILjava/lang/Object;)V\" since=\"21\"/>\n\t\t<method name=\"copy2DRangeFrom(IIII[B)V\"/>\n\t\t<method name=\"copy2DRangeFrom(IIII[F)V\"/>\n\t\t<method name=\"copy2DRangeFrom(IIII[I)V\"/>\n\t\t<method name=\"copy2DRangeFrom(IIII[S)V\"/>\n\t\t<method name=\"copy2DRangeFrom(IILandroid/graphics/Bitmap;)V\"/>\n\t\t<method name=\"copy2DRangeTo(IIIILjava/lang/Object;)V\" since=\"23\"/>\n\t\t<method name=\"copy2DRangeTo(IIII[B)V\" since=\"23\"/>\n\t\t<method name=\"copy2DRangeTo(IIII[F)V\" since=\"23\"/>\n\t\t<method name=\"copy2DRangeTo(IIII[I)V\" since=\"23\"/>\n\t\t<method name=\"copy2DRangeTo(IIII[S)V\" since=\"23\"/>\n\t\t<method name=\"copy3DRangeFrom(IIIIIILandroid/renderscript/Allocation;III)V\" since=\"23\"/>\n\t\t<method name=\"copy3DRangeFrom(IIIIIILjava/lang/Object;)V\" since=\"23\"/>\n\t\t<method name=\"copy3DRangeTo(IIIIIILjava/lang/Object;)V\" since=\"23\"/>\n\t\t<method name=\"copyFrom(Landroid/graphics/Bitmap;)V\"/>\n\t\t<method name=\"copyFrom(Landroid/renderscript/Allocation;)V\" since=\"18\"/>\n\t\t<method name=\"copyFrom(Ljava/lang/Object;)V\" since=\"21\"/>\n\t\t<method name=\"copyFrom([B)V\"/>\n\t\t<method name=\"copyFrom([F)V\"/>\n\t\t<method name=\"copyFrom([I)V\"/>\n\t\t<method name=\"copyFrom([Landroid/renderscript/BaseObj;)V\"/>\n\t\t<method name=\"copyFrom([S)V\"/>\n\t\t<method name=\"copyFromUnchecked(Ljava/lang/Object;)V\" since=\"21\"/>\n\t\t<method name=\"copyFromUnchecked([B)V\"/>\n\t\t<method name=\"copyFromUnchecked([F)V\"/>\n\t\t<method name=\"copyFromUnchecked([I)V\"/>\n\t\t<method name=\"copyFromUnchecked([S)V\"/>\n\t\t<method name=\"copyTo(Landroid/graphics/Bitmap;)V\"/>\n\t\t<method name=\"copyTo(Ljava/lang/Object;)V\" since=\"21\"/>\n\t\t<method name=\"copyTo([B)V\"/>\n\t\t<method name=\"copyTo([F)V\"/>\n\t\t<method name=\"copyTo([I)V\"/>\n\t\t<method name=\"copyTo([S)V\"/>\n\t\t<method name=\"createAllocations(Landroid/renderscript/RenderScript;Landroid/renderscript/Type;II)[Landroid/renderscript/Allocation;\" since=\"24\"/>\n\t\t<method name=\"createCubemapFromBitmap(Landroid/renderscript/RenderScript;Landroid/graphics/Bitmap;)Landroid/renderscript/Allocation;\"/>\n\t\t<method name=\"createCubemapFromBitmap(Landroid/renderscript/RenderScript;Landroid/graphics/Bitmap;Landroid/renderscript/Allocation$MipmapControl;I)Landroid/renderscript/Allocation;\"/>\n\t\t<method name=\"createCubemapFromCubeFaces(Landroid/renderscript/RenderScript;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;)Landroid/renderscript/Allocation;\"/>\n\t\t<method name=\"createCubemapFromCubeFaces(Landroid/renderscript/RenderScript;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/renderscript/Allocation$MipmapControl;I)Landroid/renderscript/Allocation;\"/>\n\t\t<method name=\"createFromBitmap(Landroid/renderscript/RenderScript;Landroid/graphics/Bitmap;)Landroid/renderscript/Allocation;\"/>\n\t\t<method name=\"createFromBitmap(Landroid/renderscript/RenderScript;Landroid/graphics/Bitmap;Landroid/renderscript/Allocation$MipmapControl;I)Landroid/renderscript/Allocation;\"/>\n\t\t<method name=\"createFromBitmapResource(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;I)Landroid/renderscript/Allocation;\"/>\n\t\t<method name=\"createFromBitmapResource(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;ILandroid/renderscript/Allocation$MipmapControl;I)Landroid/renderscript/Allocation;\"/>\n\t\t<method name=\"createFromString(Landroid/renderscript/RenderScript;Ljava/lang/String;I)Landroid/renderscript/Allocation;\"/>\n\t\t<method name=\"createSized(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;I)Landroid/renderscript/Allocation;\"/>\n\t\t<method name=\"createSized(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;II)Landroid/renderscript/Allocation;\"/>\n\t\t<method name=\"createTyped(Landroid/renderscript/RenderScript;Landroid/renderscript/Type;)Landroid/renderscript/Allocation;\"/>\n\t\t<method name=\"createTyped(Landroid/renderscript/RenderScript;Landroid/renderscript/Type;I)Landroid/renderscript/Allocation;\"/>\n\t\t<method name=\"createTyped(Landroid/renderscript/RenderScript;Landroid/renderscript/Type;Landroid/renderscript/Allocation$MipmapControl;I)Landroid/renderscript/Allocation;\"/>\n\t\t<method name=\"generateMipmaps()V\"/>\n\t\t<method name=\"getByteBuffer()Ljava/nio/ByteBuffer;\" since=\"24\"/>\n\t\t<method name=\"getBytesSize()I\" since=\"16\"/>\n\t\t<method name=\"getElement()Landroid/renderscript/Element;\" since=\"16\"/>\n\t\t<method name=\"getStride()J\" since=\"24\"/>\n\t\t<method name=\"getSurface()Landroid/view/Surface;\" since=\"16\"/>\n\t\t<method name=\"getTimeStamp()J\" since=\"24\"/>\n\t\t<method name=\"getType()Landroid/renderscript/Type;\"/>\n\t\t<method name=\"getUsage()I\" since=\"16\"/>\n\t\t<method name=\"ioReceive()V\" since=\"16\"/>\n\t\t<method name=\"ioSend()V\" since=\"16\"/>\n\t\t<method name=\"resize(I)V\" deprecated=\"18\"/>\n\t\t<method name=\"setAutoPadding(Z)V\" since=\"23\"/>\n\t\t<method name=\"setFromFieldPacker(IIIILandroid/renderscript/FieldPacker;)V\" since=\"23\"/>\n\t\t<method name=\"setFromFieldPacker(IILandroid/renderscript/FieldPacker;)V\"/>\n\t\t<method name=\"setFromFieldPacker(ILandroid/renderscript/FieldPacker;)V\"/>\n\t\t<method name=\"setOnBufferAvailableListener(Landroid/renderscript/Allocation$OnBufferAvailableListener;)V\" since=\"19\"/>\n\t\t<method name=\"setSurface(Landroid/view/Surface;)V\" since=\"16\"/>\n\t\t<method name=\"syncAll(I)V\"/>\n\t\t<field name=\"USAGE_GRAPHICS_CONSTANTS\"/>\n\t\t<field name=\"USAGE_GRAPHICS_RENDER_TARGET\" since=\"14\"/>\n\t\t<field name=\"USAGE_GRAPHICS_TEXTURE\"/>\n\t\t<field name=\"USAGE_GRAPHICS_VERTEX\"/>\n\t\t<field name=\"USAGE_IO_INPUT\" since=\"16\"/>\n\t\t<field name=\"USAGE_IO_OUTPUT\" since=\"16\"/>\n\t\t<field name=\"USAGE_SCRIPT\"/>\n\t\t<field name=\"USAGE_SHARED\" since=\"18\"/>\n\t</class>\n\t<class name=\"android/renderscript/Allocation$MipmapControl\" since=\"11\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/renderscript/Allocation$MipmapControl;\"/>\n\t\t<method name=\"values()[Landroid/renderscript/Allocation$MipmapControl;\"/>\n\t\t<field name=\"MIPMAP_FULL\"/>\n\t\t<field name=\"MIPMAP_NONE\"/>\n\t\t<field name=\"MIPMAP_ON_SYNC_TO_TEXTURE\"/>\n\t</class>\n\t<class name=\"android/renderscript/Allocation$OnBufferAvailableListener\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onBufferAvailable(Landroid/renderscript/Allocation;)V\"/>\n\t</class>\n\t<class name=\"android/renderscript/AllocationAdapter\" since=\"11\">\n\t\t<extends name=\"android/renderscript/Allocation\"/>\n\t\t<method name=\"create1D(Landroid/renderscript/RenderScript;Landroid/renderscript/Allocation;)Landroid/renderscript/AllocationAdapter;\" since=\"14\"/>\n\t\t<method name=\"create2D(Landroid/renderscript/RenderScript;Landroid/renderscript/Allocation;)Landroid/renderscript/AllocationAdapter;\"/>\n\t\t<method name=\"createTyped(Landroid/renderscript/RenderScript;Landroid/renderscript/Allocation;Landroid/renderscript/Type;)Landroid/renderscript/AllocationAdapter;\" since=\"23\"/>\n\t\t<method name=\"readData([F)V\" removed=\"14\"/>\n\t\t<method name=\"readData([I)V\" removed=\"14\"/>\n\t\t<method name=\"setFace(Landroid/renderscript/Type$CubemapFace;)V\"/>\n\t\t<method name=\"setLOD(I)V\"/>\n\t\t<method name=\"setX(I)V\" since=\"23\"/>\n\t\t<method name=\"setY(I)V\"/>\n\t\t<method name=\"setZ(I)V\"/>\n\t\t<method name=\"subData(ILandroid/renderscript/FieldPacker;)V\" removed=\"14\"/>\n\t\t<method name=\"subData1D(II[B)V\" removed=\"14\"/>\n\t\t<method name=\"subData1D(II[F)V\" removed=\"14\"/>\n\t\t<method name=\"subData1D(II[I)V\" removed=\"14\"/>\n\t\t<method name=\"subData1D(II[S)V\" removed=\"14\"/>\n\t\t<method name=\"subData2D(IIII[F)V\" removed=\"14\"/>\n\t\t<method name=\"subData2D(IIII[I)V\" removed=\"14\"/>\n\t\t<method name=\"subElementData(IILandroid/renderscript/FieldPacker;)V\" removed=\"14\"/>\n\t</class>\n\t<class name=\"android/renderscript/BaseObj\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"destroy()V\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\" since=\"14\"/>\n\t\t<method name=\"setName(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/renderscript/Byte2\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(BB)V\" since=\"14\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t</class>\n\t<class name=\"android/renderscript/Byte3\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(BBB)V\" since=\"14\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t\t<field name=\"z\"/>\n\t</class>\n\t<class name=\"android/renderscript/Byte4\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(BBBB)V\" since=\"14\"/>\n\t\t<field name=\"w\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t\t<field name=\"z\"/>\n\t</class>\n\t<class name=\"android/renderscript/Double2\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(DD)V\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t</class>\n\t<class name=\"android/renderscript/Double3\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(DDD)V\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t\t<field name=\"z\"/>\n\t</class>\n\t<class name=\"android/renderscript/Double4\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(DDDD)V\"/>\n\t\t<field name=\"w\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t\t<field name=\"z\"/>\n\t</class>\n\t<class name=\"android/renderscript/Element\" since=\"11\">\n\t\t<extends name=\"android/renderscript/BaseObj\"/>\n\t\t<method name=\"ALLOCATION(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"A_8(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"BOOLEAN(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"ELEMENT(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"F16(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"23\"/>\n\t\t<method name=\"F16_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"23\"/>\n\t\t<method name=\"F16_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"23\"/>\n\t\t<method name=\"F16_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"23\"/>\n\t\t<method name=\"F32(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"F32_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"F32_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"F32_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"F64(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"F64_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"F64_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"F64_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"FONT(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"16\"/>\n\t\t<method name=\"I16(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"I16_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"I16_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"I16_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"I32(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"I32_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"I32_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"I32_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"I64(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"I64_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"I64_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"I64_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"I8(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"I8_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"I8_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"I8_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"MATRIX4X4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" deprecated=\"16\"/>\n\t\t<method name=\"MATRIX_2X2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"MATRIX_3X3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"MATRIX_4X4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"MESH(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"PROGRAM_FRAGMENT(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"PROGRAM_RASTER(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"PROGRAM_STORE(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"PROGRAM_VERTEX(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"RGBA_4444(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"RGBA_5551(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"RGBA_8888(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"RGB_565(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"RGB_888(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"SAMPLER(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"SCRIPT(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"TYPE(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"U16(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"U16_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"U16_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"U16_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"U32(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"U32_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"U32_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"U32_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"U64(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"U64_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"U64_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"U64_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"U8(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"U8_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"U8_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"14\"/>\n\t\t<method name=\"U8_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"YUV(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;\" since=\"19\"/>\n\t\t<method name=\"createPixel(Landroid/renderscript/RenderScript;Landroid/renderscript/Element$DataType;Landroid/renderscript/Element$DataKind;)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"createVector(Landroid/renderscript/RenderScript;Landroid/renderscript/Element$DataType;I)Landroid/renderscript/Element;\"/>\n\t\t<method name=\"getBytesSize()I\" since=\"16\"/>\n\t\t<method name=\"getDataKind()Landroid/renderscript/Element$DataKind;\" since=\"16\"/>\n\t\t<method name=\"getDataType()Landroid/renderscript/Element$DataType;\" since=\"16\"/>\n\t\t<method name=\"getSubElement(I)Landroid/renderscript/Element;\" since=\"16\"/>\n\t\t<method name=\"getSubElementArraySize(I)I\" since=\"16\"/>\n\t\t<method name=\"getSubElementCount()I\" since=\"16\"/>\n\t\t<method name=\"getSubElementName(I)Ljava/lang/String;\" since=\"16\"/>\n\t\t<method name=\"getSubElementOffsetBytes(I)I\" since=\"16\"/>\n\t\t<method name=\"getVectorSize()I\" since=\"16\"/>\n\t\t<method name=\"isCompatible(Landroid/renderscript/Element;)Z\" since=\"14\"/>\n\t\t<method name=\"isComplex()Z\"/>\n\t</class>\n\t<class name=\"android/renderscript/Element$Builder\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/renderscript/RenderScript;)V\"/>\n\t\t<method name=\"add(Landroid/renderscript/Element;Ljava/lang/String;)Landroid/renderscript/Element$Builder;\"/>\n\t\t<method name=\"add(Landroid/renderscript/Element;Ljava/lang/String;I)Landroid/renderscript/Element$Builder;\"/>\n\t\t<method name=\"create()Landroid/renderscript/Element;\"/>\n\t</class>\n\t<class name=\"android/renderscript/Element$DataKind\" since=\"11\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/renderscript/Element$DataKind;\"/>\n\t\t<method name=\"values()[Landroid/renderscript/Element$DataKind;\"/>\n\t\t<field name=\"PIXEL_A\"/>\n\t\t<field name=\"PIXEL_DEPTH\" since=\"14\"/>\n\t\t<field name=\"PIXEL_L\"/>\n\t\t<field name=\"PIXEL_LA\"/>\n\t\t<field name=\"PIXEL_RGB\"/>\n\t\t<field name=\"PIXEL_RGBA\"/>\n\t\t<field name=\"PIXEL_YUV\" since=\"18\"/>\n\t\t<field name=\"USER\"/>\n\t</class>\n\t<class name=\"android/renderscript/Element$DataType\" since=\"11\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/renderscript/Element$DataType;\"/>\n\t\t<method name=\"values()[Landroid/renderscript/Element$DataType;\"/>\n\t\t<field name=\"BOOLEAN\"/>\n\t\t<field name=\"FLOAT_16\" since=\"23\"/>\n\t\t<field name=\"FLOAT_32\"/>\n\t\t<field name=\"FLOAT_64\"/>\n\t\t<field name=\"MATRIX_2X2\"/>\n\t\t<field name=\"MATRIX_3X3\"/>\n\t\t<field name=\"MATRIX_4X4\"/>\n\t\t<field name=\"NONE\" since=\"16\"/>\n\t\t<field name=\"RS_ALLOCATION\"/>\n\t\t<field name=\"RS_ELEMENT\"/>\n\t\t<field name=\"RS_FONT\" since=\"16\"/>\n\t\t<field name=\"RS_MESH\"/>\n\t\t<field name=\"RS_PROGRAM_FRAGMENT\"/>\n\t\t<field name=\"RS_PROGRAM_RASTER\"/>\n\t\t<field name=\"RS_PROGRAM_STORE\"/>\n\t\t<field name=\"RS_PROGRAM_VERTEX\"/>\n\t\t<field name=\"RS_SAMPLER\"/>\n\t\t<field name=\"RS_SCRIPT\"/>\n\t\t<field name=\"RS_TYPE\"/>\n\t\t<field name=\"SIGNED_16\"/>\n\t\t<field name=\"SIGNED_32\"/>\n\t\t<field name=\"SIGNED_64\"/>\n\t\t<field name=\"SIGNED_8\"/>\n\t\t<field name=\"UNSIGNED_16\"/>\n\t\t<field name=\"UNSIGNED_32\"/>\n\t\t<field name=\"UNSIGNED_4_4_4_4\"/>\n\t\t<field name=\"UNSIGNED_5_5_5_1\"/>\n\t\t<field name=\"UNSIGNED_5_6_5\"/>\n\t\t<field name=\"UNSIGNED_64\"/>\n\t\t<field name=\"UNSIGNED_8\"/>\n\t</class>\n\t<class name=\"android/renderscript/FieldPacker\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>([B)V\" since=\"18\"/>\n\t\t<method name=\"addBoolean(Z)V\"/>\n\t\t<method name=\"addF32(F)V\"/>\n\t\t<method name=\"addF32(Landroid/renderscript/Float2;)V\"/>\n\t\t<method name=\"addF32(Landroid/renderscript/Float3;)V\"/>\n\t\t<method name=\"addF32(Landroid/renderscript/Float4;)V\"/>\n\t\t<method name=\"addF64(D)V\"/>\n\t\t<method name=\"addF64(Landroid/renderscript/Double2;)V\" since=\"14\"/>\n\t\t<method name=\"addF64(Landroid/renderscript/Double3;)V\" since=\"14\"/>\n\t\t<method name=\"addF64(Landroid/renderscript/Double4;)V\" since=\"14\"/>\n\t\t<method name=\"addI16(Landroid/renderscript/Short2;)V\"/>\n\t\t<method name=\"addI16(Landroid/renderscript/Short3;)V\"/>\n\t\t<method name=\"addI16(Landroid/renderscript/Short4;)V\"/>\n\t\t<method name=\"addI16(S)V\"/>\n\t\t<method name=\"addI32(I)V\"/>\n\t\t<method name=\"addI32(Landroid/renderscript/Int2;)V\"/>\n\t\t<method name=\"addI32(Landroid/renderscript/Int3;)V\"/>\n\t\t<method name=\"addI32(Landroid/renderscript/Int4;)V\"/>\n\t\t<method name=\"addI64(J)V\"/>\n\t\t<method name=\"addI64(Landroid/renderscript/Long2;)V\" since=\"14\"/>\n\t\t<method name=\"addI64(Landroid/renderscript/Long3;)V\" since=\"14\"/>\n\t\t<method name=\"addI64(Landroid/renderscript/Long4;)V\" since=\"14\"/>\n\t\t<method name=\"addI8(B)V\"/>\n\t\t<method name=\"addI8(Landroid/renderscript/Byte2;)V\"/>\n\t\t<method name=\"addI8(Landroid/renderscript/Byte3;)V\"/>\n\t\t<method name=\"addI8(Landroid/renderscript/Byte4;)V\"/>\n\t\t<method name=\"addMatrix(Landroid/renderscript/Matrix2f;)V\"/>\n\t\t<method name=\"addMatrix(Landroid/renderscript/Matrix3f;)V\"/>\n\t\t<method name=\"addMatrix(Landroid/renderscript/Matrix4f;)V\"/>\n\t\t<method name=\"addObj(Landroid/renderscript/BaseObj;)V\"/>\n\t\t<method name=\"addU16(I)V\"/>\n\t\t<method name=\"addU16(Landroid/renderscript/Int2;)V\"/>\n\t\t<method name=\"addU16(Landroid/renderscript/Int3;)V\"/>\n\t\t<method name=\"addU16(Landroid/renderscript/Int4;)V\"/>\n\t\t<method name=\"addU32(J)V\"/>\n\t\t<method name=\"addU32(Landroid/renderscript/Long2;)V\"/>\n\t\t<method name=\"addU32(Landroid/renderscript/Long3;)V\"/>\n\t\t<method name=\"addU32(Landroid/renderscript/Long4;)V\"/>\n\t\t<method name=\"addU64(J)V\"/>\n\t\t<method name=\"addU64(Landroid/renderscript/Long2;)V\" since=\"14\"/>\n\t\t<method name=\"addU64(Landroid/renderscript/Long3;)V\" since=\"14\"/>\n\t\t<method name=\"addU64(Landroid/renderscript/Long4;)V\" since=\"14\"/>\n\t\t<method name=\"addU8(Landroid/renderscript/Short2;)V\"/>\n\t\t<method name=\"addU8(Landroid/renderscript/Short3;)V\"/>\n\t\t<method name=\"addU8(Landroid/renderscript/Short4;)V\"/>\n\t\t<method name=\"addU8(S)V\"/>\n\t\t<method name=\"align(I)V\"/>\n\t\t<method name=\"getData()[B\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"reset(I)V\"/>\n\t\t<method name=\"skip(I)V\"/>\n\t\t<method name=\"subBoolean()Z\" since=\"18\"/>\n\t\t<method name=\"subByte2()Landroid/renderscript/Byte2;\" since=\"18\"/>\n\t\t<method name=\"subByte3()Landroid/renderscript/Byte3;\" since=\"18\"/>\n\t\t<method name=\"subByte4()Landroid/renderscript/Byte4;\" since=\"18\"/>\n\t\t<method name=\"subDouble2()Landroid/renderscript/Double2;\" since=\"18\"/>\n\t\t<method name=\"subDouble3()Landroid/renderscript/Double3;\" since=\"18\"/>\n\t\t<method name=\"subDouble4()Landroid/renderscript/Double4;\" since=\"18\"/>\n\t\t<method name=\"subF32()F\" since=\"18\"/>\n\t\t<method name=\"subF64()D\" since=\"18\"/>\n\t\t<method name=\"subFloat2()Landroid/renderscript/Float2;\" since=\"18\"/>\n\t\t<method name=\"subFloat3()Landroid/renderscript/Float3;\" since=\"18\"/>\n\t\t<method name=\"subFloat4()Landroid/renderscript/Float4;\" since=\"18\"/>\n\t\t<method name=\"subI16()S\" since=\"18\"/>\n\t\t<method name=\"subI32()I\" since=\"18\"/>\n\t\t<method name=\"subI64()J\" since=\"18\"/>\n\t\t<method name=\"subI8()B\" since=\"18\"/>\n\t\t<method name=\"subInt2()Landroid/renderscript/Int2;\" since=\"18\"/>\n\t\t<method name=\"subInt3()Landroid/renderscript/Int3;\" since=\"18\"/>\n\t\t<method name=\"subInt4()Landroid/renderscript/Int4;\" since=\"18\"/>\n\t\t<method name=\"subLong2()Landroid/renderscript/Long2;\" since=\"18\"/>\n\t\t<method name=\"subLong3()Landroid/renderscript/Long3;\" since=\"18\"/>\n\t\t<method name=\"subLong4()Landroid/renderscript/Long4;\" since=\"18\"/>\n\t\t<method name=\"subMatrix2f()Landroid/renderscript/Matrix2f;\" since=\"18\"/>\n\t\t<method name=\"subMatrix3f()Landroid/renderscript/Matrix3f;\" since=\"18\"/>\n\t\t<method name=\"subMatrix4f()Landroid/renderscript/Matrix4f;\" since=\"18\"/>\n\t\t<method name=\"subShort2()Landroid/renderscript/Short2;\" since=\"18\"/>\n\t\t<method name=\"subShort3()Landroid/renderscript/Short3;\" since=\"18\"/>\n\t\t<method name=\"subShort4()Landroid/renderscript/Short4;\" since=\"18\"/>\n\t\t<method name=\"subalign(I)V\" since=\"18\"/>\n\t</class>\n\t<class name=\"android/renderscript/FileA3D\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"android/renderscript/BaseObj\"/>\n\t\t<method name=\"createFromAsset(Landroid/renderscript/RenderScript;Landroid/content/res/AssetManager;Ljava/lang/String;)Landroid/renderscript/FileA3D;\" deprecated=\"16\"/>\n\t\t<method name=\"createFromFile(Landroid/renderscript/RenderScript;Ljava/io/File;)Landroid/renderscript/FileA3D;\" deprecated=\"16\"/>\n\t\t<method name=\"createFromFile(Landroid/renderscript/RenderScript;Ljava/lang/String;)Landroid/renderscript/FileA3D;\" deprecated=\"16\"/>\n\t\t<method name=\"createFromResource(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;I)Landroid/renderscript/FileA3D;\" deprecated=\"16\"/>\n\t\t<method name=\"getIndexEntry(I)Landroid/renderscript/FileA3D$IndexEntry;\" deprecated=\"16\"/>\n\t\t<method name=\"getIndexEntryCount()I\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/FileA3D$EntryType\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/renderscript/FileA3D$EntryType;\"/>\n\t\t<method name=\"values()[Landroid/renderscript/FileA3D$EntryType;\"/>\n\t\t<field name=\"MESH\"/>\n\t\t<field name=\"UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/renderscript/FileA3D$IndexEntry\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getEntryType()Landroid/renderscript/FileA3D$EntryType;\" deprecated=\"16\"/>\n\t\t<method name=\"getMesh()Landroid/renderscript/Mesh;\" deprecated=\"16\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\" deprecated=\"16\"/>\n\t\t<method name=\"getObject()Landroid/renderscript/BaseObj;\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/Float2\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(FF)V\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t</class>\n\t<class name=\"android/renderscript/Float3\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(FFF)V\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t\t<field name=\"z\"/>\n\t</class>\n\t<class name=\"android/renderscript/Float4\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(FFFF)V\"/>\n\t\t<field name=\"w\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t\t<field name=\"z\"/>\n\t</class>\n\t<class name=\"android/renderscript/Font\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"android/renderscript/BaseObj\"/>\n\t\t<method name=\"create(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;Ljava/lang/String;Landroid/renderscript/Font$Style;F)Landroid/renderscript/Font;\" deprecated=\"16\"/>\n\t\t<method name=\"createFromAsset(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;Ljava/lang/String;F)Landroid/renderscript/Font;\" deprecated=\"16\"/>\n\t\t<method name=\"createFromFile(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;Ljava/io/File;F)Landroid/renderscript/Font;\" deprecated=\"16\"/>\n\t\t<method name=\"createFromFile(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;Ljava/lang/String;F)Landroid/renderscript/Font;\" deprecated=\"16\"/>\n\t\t<method name=\"createFromResource(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;IF)Landroid/renderscript/Font;\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/Font$Style\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/renderscript/Font$Style;\"/>\n\t\t<method name=\"values()[Landroid/renderscript/Font$Style;\"/>\n\t\t<field name=\"BOLD\"/>\n\t\t<field name=\"BOLD_ITALIC\"/>\n\t\t<field name=\"ITALIC\"/>\n\t\t<field name=\"NORMAL\"/>\n\t</class>\n\t<class name=\"android/renderscript/Int2\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(II)V\" since=\"14\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t</class>\n\t<class name=\"android/renderscript/Int3\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(III)V\" since=\"14\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t\t<field name=\"z\"/>\n\t</class>\n\t<class name=\"android/renderscript/Int4\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(IIII)V\" since=\"14\"/>\n\t\t<field name=\"w\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t\t<field name=\"z\"/>\n\t</class>\n\t<class name=\"android/renderscript/Long2\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(JJ)V\" since=\"14\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t</class>\n\t<class name=\"android/renderscript/Long3\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(JJJ)V\" since=\"14\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t\t<field name=\"z\"/>\n\t</class>\n\t<class name=\"android/renderscript/Long4\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(JJJJ)V\" since=\"14\"/>\n\t\t<field name=\"w\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t\t<field name=\"z\"/>\n\t</class>\n\t<class name=\"android/renderscript/Matrix2f\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>([F)V\"/>\n\t\t<method name=\"get(II)F\"/>\n\t\t<method name=\"getArray()[F\"/>\n\t\t<method name=\"load(Landroid/renderscript/Matrix2f;)V\"/>\n\t\t<method name=\"loadIdentity()V\"/>\n\t\t<method name=\"loadMultiply(Landroid/renderscript/Matrix2f;Landroid/renderscript/Matrix2f;)V\"/>\n\t\t<method name=\"loadRotate(F)V\"/>\n\t\t<method name=\"loadScale(FF)V\"/>\n\t\t<method name=\"multiply(Landroid/renderscript/Matrix2f;)V\"/>\n\t\t<method name=\"rotate(F)V\"/>\n\t\t<method name=\"scale(FF)V\"/>\n\t\t<method name=\"set(IIF)V\"/>\n\t\t<method name=\"transpose()V\"/>\n\t</class>\n\t<class name=\"android/renderscript/Matrix3f\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>([F)V\"/>\n\t\t<method name=\"get(II)F\"/>\n\t\t<method name=\"getArray()[F\"/>\n\t\t<method name=\"load(Landroid/renderscript/Matrix3f;)V\"/>\n\t\t<method name=\"loadIdentity()V\"/>\n\t\t<method name=\"loadMultiply(Landroid/renderscript/Matrix3f;Landroid/renderscript/Matrix3f;)V\"/>\n\t\t<method name=\"loadRotate(F)V\"/>\n\t\t<method name=\"loadRotate(FFFF)V\"/>\n\t\t<method name=\"loadScale(FF)V\"/>\n\t\t<method name=\"loadScale(FFF)V\"/>\n\t\t<method name=\"loadTranslate(FF)V\"/>\n\t\t<method name=\"multiply(Landroid/renderscript/Matrix3f;)V\"/>\n\t\t<method name=\"rotate(F)V\"/>\n\t\t<method name=\"rotate(FFFF)V\"/>\n\t\t<method name=\"scale(FF)V\"/>\n\t\t<method name=\"scale(FFF)V\"/>\n\t\t<method name=\"set(IIF)V\"/>\n\t\t<method name=\"translate(FF)V\"/>\n\t\t<method name=\"transpose()V\"/>\n\t</class>\n\t<class name=\"android/renderscript/Matrix4f\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>([F)V\"/>\n\t\t<method name=\"get(II)F\"/>\n\t\t<method name=\"getArray()[F\"/>\n\t\t<method name=\"inverse()Z\"/>\n\t\t<method name=\"inverseTranspose()Z\"/>\n\t\t<method name=\"load(Landroid/renderscript/Matrix4f;)V\"/>\n\t\t<method name=\"loadFrustum(FFFFFF)V\"/>\n\t\t<method name=\"loadIdentity()V\"/>\n\t\t<method name=\"loadMultiply(Landroid/renderscript/Matrix4f;Landroid/renderscript/Matrix4f;)V\"/>\n\t\t<method name=\"loadOrtho(FFFFFF)V\"/>\n\t\t<method name=\"loadOrthoWindow(II)V\"/>\n\t\t<method name=\"loadPerspective(FFFF)V\"/>\n\t\t<method name=\"loadProjectionNormalized(II)V\"/>\n\t\t<method name=\"loadRotate(FFFF)V\"/>\n\t\t<method name=\"loadScale(FFF)V\"/>\n\t\t<method name=\"loadTranslate(FFF)V\"/>\n\t\t<method name=\"multiply(Landroid/renderscript/Matrix4f;)V\"/>\n\t\t<method name=\"rotate(FFFF)V\"/>\n\t\t<method name=\"scale(FFF)V\"/>\n\t\t<method name=\"set(IIF)V\"/>\n\t\t<method name=\"translate(FFF)V\"/>\n\t\t<method name=\"transpose()V\"/>\n\t</class>\n\t<class name=\"android/renderscript/Mesh\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"android/renderscript/BaseObj\"/>\n\t\t<method name=\"getIndexSetAllocation(I)Landroid/renderscript/Allocation;\" deprecated=\"16\"/>\n\t\t<method name=\"getPrimitive(I)Landroid/renderscript/Mesh$Primitive;\" deprecated=\"16\"/>\n\t\t<method name=\"getPrimitiveCount()I\" deprecated=\"16\"/>\n\t\t<method name=\"getVertexAllocation(I)Landroid/renderscript/Allocation;\" deprecated=\"16\"/>\n\t\t<method name=\"getVertexAllocationCount()I\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/Mesh$AllocationBuilder\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/renderscript/RenderScript;)V\" deprecated=\"16\"/>\n\t\t<method name=\"addIndexSetAllocation(Landroid/renderscript/Allocation;Landroid/renderscript/Mesh$Primitive;)Landroid/renderscript/Mesh$AllocationBuilder;\" deprecated=\"16\"/>\n\t\t<method name=\"addIndexSetType(Landroid/renderscript/Mesh$Primitive;)Landroid/renderscript/Mesh$AllocationBuilder;\" deprecated=\"16\"/>\n\t\t<method name=\"addVertexAllocation(Landroid/renderscript/Allocation;)Landroid/renderscript/Mesh$AllocationBuilder;\" deprecated=\"16\"/>\n\t\t<method name=\"create()Landroid/renderscript/Mesh;\" deprecated=\"16\"/>\n\t\t<method name=\"getCurrentIndexSetIndex()I\" deprecated=\"16\"/>\n\t\t<method name=\"getCurrentVertexTypeIndex()I\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/Mesh$Builder\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/renderscript/RenderScript;I)V\" deprecated=\"16\"/>\n\t\t<method name=\"addIndexSetType(Landroid/renderscript/Element;ILandroid/renderscript/Mesh$Primitive;)Landroid/renderscript/Mesh$Builder;\" deprecated=\"16\"/>\n\t\t<method name=\"addIndexSetType(Landroid/renderscript/Mesh$Primitive;)Landroid/renderscript/Mesh$Builder;\" deprecated=\"16\"/>\n\t\t<method name=\"addIndexSetType(Landroid/renderscript/Type;Landroid/renderscript/Mesh$Primitive;)Landroid/renderscript/Mesh$Builder;\" deprecated=\"16\"/>\n\t\t<method name=\"addVertexType(Landroid/renderscript/Element;I)Landroid/renderscript/Mesh$Builder;\" deprecated=\"16\"/>\n\t\t<method name=\"addVertexType(Landroid/renderscript/Type;)Landroid/renderscript/Mesh$Builder;\" deprecated=\"16\"/>\n\t\t<method name=\"create()Landroid/renderscript/Mesh;\" deprecated=\"16\"/>\n\t\t<method name=\"getCurrentIndexSetIndex()I\" deprecated=\"16\"/>\n\t\t<method name=\"getCurrentVertexTypeIndex()I\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/Mesh$Primitive\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/renderscript/Mesh$Primitive;\"/>\n\t\t<method name=\"values()[Landroid/renderscript/Mesh$Primitive;\"/>\n\t\t<field name=\"LINE\"/>\n\t\t<field name=\"LINE_STRIP\"/>\n\t\t<field name=\"POINT\"/>\n\t\t<field name=\"TRIANGLE\"/>\n\t\t<field name=\"TRIANGLE_FAN\"/>\n\t\t<field name=\"TRIANGLE_STRIP\"/>\n\t</class>\n\t<class name=\"android/renderscript/Mesh$TriangleMeshBuilder\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/renderscript/RenderScript;II)V\" deprecated=\"16\"/>\n\t\t<method name=\"addTriangle(III)Landroid/renderscript/Mesh$TriangleMeshBuilder;\" deprecated=\"16\"/>\n\t\t<method name=\"addVertex(FF)Landroid/renderscript/Mesh$TriangleMeshBuilder;\" deprecated=\"16\"/>\n\t\t<method name=\"addVertex(FFF)Landroid/renderscript/Mesh$TriangleMeshBuilder;\" deprecated=\"16\"/>\n\t\t<method name=\"create(Z)Landroid/renderscript/Mesh;\" deprecated=\"16\"/>\n\t\t<method name=\"setColor(FFFF)Landroid/renderscript/Mesh$TriangleMeshBuilder;\" deprecated=\"16\"/>\n\t\t<method name=\"setNormal(FFF)Landroid/renderscript/Mesh$TriangleMeshBuilder;\" deprecated=\"16\"/>\n\t\t<method name=\"setTexture(FF)Landroid/renderscript/Mesh$TriangleMeshBuilder;\" deprecated=\"16\"/>\n\t\t<field name=\"COLOR\" deprecated=\"16\"/>\n\t\t<field name=\"NORMAL\" deprecated=\"16\"/>\n\t\t<field name=\"TEXTURE_0\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/Program\" since=\"11\" removed=\"18\">\n\t\t<extends name=\"android/renderscript/BaseObj\"/>\n\t\t<method name=\"bindConstants(Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"bindSampler(Landroid/renderscript/Sampler;I)V\"/>\n\t\t<method name=\"bindTexture(Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"getConstant(I)Landroid/renderscript/Type;\" since=\"16\"/>\n\t\t<method name=\"getConstantCount()I\" since=\"16\"/>\n\t\t<method name=\"getTextureCount()I\" since=\"16\"/>\n\t\t<method name=\"getTextureName(I)Ljava/lang/String;\" since=\"16\"/>\n\t\t<method name=\"getTextureType(I)Landroid/renderscript/Program$TextureType;\" since=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/Program$BaseProgramBuilder\" since=\"11\" removed=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/renderscript/RenderScript;)V\"/>\n\t\t<method name=\"addConstant(Landroid/renderscript/Type;)Landroid/renderscript/Program$BaseProgramBuilder;\"/>\n\t\t<method name=\"addTexture(Landroid/renderscript/Program$TextureType;)Landroid/renderscript/Program$BaseProgramBuilder;\"/>\n\t\t<method name=\"addTexture(Landroid/renderscript/Program$TextureType;Ljava/lang/String;)Landroid/renderscript/Program$BaseProgramBuilder;\" since=\"16\"/>\n\t\t<method name=\"getCurrentConstantIndex()I\"/>\n\t\t<method name=\"getCurrentTextureIndex()I\"/>\n\t\t<method name=\"initProgram(Landroid/renderscript/Program;)V\"/>\n\t\t<method name=\"setShader(Landroid/content/res/Resources;I)Landroid/renderscript/Program$BaseProgramBuilder;\"/>\n\t\t<method name=\"setShader(Ljava/lang/String;)Landroid/renderscript/Program$BaseProgramBuilder;\"/>\n\t</class>\n\t<class name=\"android/renderscript/Program$TextureType\" since=\"11\" removed=\"18\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/renderscript/Program$TextureType;\"/>\n\t\t<method name=\"values()[Landroid/renderscript/Program$TextureType;\"/>\n\t\t<field name=\"TEXTURE_2D\"/>\n\t\t<field name=\"TEXTURE_CUBE\"/>\n\t</class>\n\t<class name=\"android/renderscript/ProgramFragment\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"android/renderscript/Program\"/>\n\t</class>\n\t<class name=\"android/renderscript/ProgramFragment$Builder\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"android/renderscript/Program$BaseProgramBuilder\"/>\n\t\t<method name=\"&lt;init>(Landroid/renderscript/RenderScript;)V\" deprecated=\"16\"/>\n\t\t<method name=\"create()Landroid/renderscript/ProgramFragment;\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/ProgramFragmentFixedFunction\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"android/renderscript/ProgramFragment\"/>\n\t</class>\n\t<class name=\"android/renderscript/ProgramFragmentFixedFunction$Builder\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/renderscript/RenderScript;)V\" deprecated=\"16\"/>\n\t\t<method name=\"create()Landroid/renderscript/ProgramFragmentFixedFunction;\" deprecated=\"16\"/>\n\t\t<method name=\"setPointSpriteTexCoordinateReplacement(Z)Landroid/renderscript/ProgramFragmentFixedFunction$Builder;\" deprecated=\"16\"/>\n\t\t<method name=\"setTexture(Landroid/renderscript/ProgramFragmentFixedFunction$Builder$EnvMode;Landroid/renderscript/ProgramFragmentFixedFunction$Builder$Format;I)Landroid/renderscript/ProgramFragmentFixedFunction$Builder;\" deprecated=\"16\"/>\n\t\t<method name=\"setVaryingColor(Z)Landroid/renderscript/ProgramFragmentFixedFunction$Builder;\" deprecated=\"16\"/>\n\t\t<field name=\"MAX_TEXTURE\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/ProgramFragmentFixedFunction$Builder$EnvMode\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/renderscript/ProgramFragmentFixedFunction$Builder$EnvMode;\"/>\n\t\t<method name=\"values()[Landroid/renderscript/ProgramFragmentFixedFunction$Builder$EnvMode;\"/>\n\t\t<field name=\"DECAL\"/>\n\t\t<field name=\"MODULATE\"/>\n\t\t<field name=\"REPLACE\"/>\n\t</class>\n\t<class name=\"android/renderscript/ProgramFragmentFixedFunction$Builder$Format\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/renderscript/ProgramFragmentFixedFunction$Builder$Format;\"/>\n\t\t<method name=\"values()[Landroid/renderscript/ProgramFragmentFixedFunction$Builder$Format;\"/>\n\t\t<field name=\"ALPHA\"/>\n\t\t<field name=\"LUMINANCE_ALPHA\"/>\n\t\t<field name=\"RGB\"/>\n\t\t<field name=\"RGBA\"/>\n\t</class>\n\t<class name=\"android/renderscript/ProgramRaster\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"android/renderscript/BaseObj\"/>\n\t\t<method name=\"CULL_BACK(Landroid/renderscript/RenderScript;)Landroid/renderscript/ProgramRaster;\" deprecated=\"16\"/>\n\t\t<method name=\"CULL_FRONT(Landroid/renderscript/RenderScript;)Landroid/renderscript/ProgramRaster;\" deprecated=\"16\"/>\n\t\t<method name=\"CULL_NONE(Landroid/renderscript/RenderScript;)Landroid/renderscript/ProgramRaster;\" deprecated=\"16\"/>\n\t\t<method name=\"getCullMode()Landroid/renderscript/ProgramRaster$CullMode;\" since=\"16\" deprecated=\"16\"/>\n\t\t<method name=\"isPointSpriteEnabled()Z\" since=\"16\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/ProgramRaster$Builder\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/renderscript/RenderScript;)V\" deprecated=\"16\"/>\n\t\t<method name=\"create()Landroid/renderscript/ProgramRaster;\" deprecated=\"16\"/>\n\t\t<method name=\"setCullMode(Landroid/renderscript/ProgramRaster$CullMode;)Landroid/renderscript/ProgramRaster$Builder;\" deprecated=\"16\"/>\n\t\t<method name=\"setPointSpriteEnabled(Z)Landroid/renderscript/ProgramRaster$Builder;\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/ProgramRaster$CullMode\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/renderscript/ProgramRaster$CullMode;\"/>\n\t\t<method name=\"values()[Landroid/renderscript/ProgramRaster$CullMode;\"/>\n\t\t<field name=\"BACK\"/>\n\t\t<field name=\"FRONT\"/>\n\t\t<field name=\"NONE\"/>\n\t</class>\n\t<class name=\"android/renderscript/ProgramStore\" since=\"11\" removed=\"18\">\n\t\t<extends name=\"android/renderscript/BaseObj\"/>\n\t\t<method name=\"BLEND_ALPHA_DEPTH_NONE(Landroid/renderscript/RenderScript;)Landroid/renderscript/ProgramStore;\"/>\n\t\t<method name=\"BLEND_ALPHA_DEPTH_TEST(Landroid/renderscript/RenderScript;)Landroid/renderscript/ProgramStore;\"/>\n\t\t<method name=\"BLEND_NONE_DEPTH_NONE(Landroid/renderscript/RenderScript;)Landroid/renderscript/ProgramStore;\"/>\n\t\t<method name=\"BLEND_NONE_DEPTH_TEST(Landroid/renderscript/RenderScript;)Landroid/renderscript/ProgramStore;\"/>\n\t\t<method name=\"getBlendDstFunc()Landroid/renderscript/ProgramStore$BlendDstFunc;\" since=\"16\"/>\n\t\t<method name=\"getBlendSrcFunc()Landroid/renderscript/ProgramStore$BlendSrcFunc;\" since=\"16\"/>\n\t\t<method name=\"getDepthFunc()Landroid/renderscript/ProgramStore$DepthFunc;\" since=\"16\"/>\n\t\t<method name=\"isColorMaskAlphaEnabled()Z\" since=\"16\"/>\n\t\t<method name=\"isColorMaskBlueEnabled()Z\" since=\"16\"/>\n\t\t<method name=\"isColorMaskGreenEnabled()Z\" since=\"16\"/>\n\t\t<method name=\"isColorMaskRedEnabled()Z\" since=\"16\"/>\n\t\t<method name=\"isDepthMaskEnabled()Z\" since=\"16\"/>\n\t\t<method name=\"isDitherEnabled()Z\" since=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/ProgramStore$BlendDstFunc\" since=\"11\" removed=\"18\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/renderscript/ProgramStore$BlendDstFunc;\"/>\n\t\t<method name=\"values()[Landroid/renderscript/ProgramStore$BlendDstFunc;\"/>\n\t\t<field name=\"DST_ALPHA\"/>\n\t\t<field name=\"ONE\"/>\n\t\t<field name=\"ONE_MINUS_DST_ALPHA\"/>\n\t\t<field name=\"ONE_MINUS_SRC_ALPHA\"/>\n\t\t<field name=\"ONE_MINUS_SRC_COLOR\"/>\n\t\t<field name=\"SRC_ALPHA\"/>\n\t\t<field name=\"SRC_COLOR\"/>\n\t\t<field name=\"ZERO\"/>\n\t</class>\n\t<class name=\"android/renderscript/ProgramStore$BlendSrcFunc\" since=\"11\" removed=\"18\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/renderscript/ProgramStore$BlendSrcFunc;\"/>\n\t\t<method name=\"values()[Landroid/renderscript/ProgramStore$BlendSrcFunc;\"/>\n\t\t<field name=\"DST_ALPHA\"/>\n\t\t<field name=\"DST_COLOR\"/>\n\t\t<field name=\"ONE\"/>\n\t\t<field name=\"ONE_MINUS_DST_ALPHA\"/>\n\t\t<field name=\"ONE_MINUS_DST_COLOR\"/>\n\t\t<field name=\"ONE_MINUS_SRC_ALPHA\"/>\n\t\t<field name=\"SRC_ALPHA\"/>\n\t\t<field name=\"SRC_ALPHA_SATURATE\"/>\n\t\t<field name=\"ZERO\"/>\n\t</class>\n\t<class name=\"android/renderscript/ProgramStore$Builder\" since=\"11\" removed=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/renderscript/RenderScript;)V\"/>\n\t\t<method name=\"create()Landroid/renderscript/ProgramStore;\"/>\n\t\t<method name=\"setBlendFunc(Landroid/renderscript/ProgramStore$BlendSrcFunc;Landroid/renderscript/ProgramStore$BlendDstFunc;)Landroid/renderscript/ProgramStore$Builder;\"/>\n\t\t<method name=\"setColorMaskEnabled(ZZZZ)Landroid/renderscript/ProgramStore$Builder;\"/>\n\t\t<method name=\"setDepthFunc(Landroid/renderscript/ProgramStore$DepthFunc;)Landroid/renderscript/ProgramStore$Builder;\"/>\n\t\t<method name=\"setDepthMaskEnabled(Z)Landroid/renderscript/ProgramStore$Builder;\"/>\n\t\t<method name=\"setDitherEnabled(Z)Landroid/renderscript/ProgramStore$Builder;\"/>\n\t</class>\n\t<class name=\"android/renderscript/ProgramStore$DepthFunc\" since=\"11\" removed=\"18\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/renderscript/ProgramStore$DepthFunc;\"/>\n\t\t<method name=\"values()[Landroid/renderscript/ProgramStore$DepthFunc;\"/>\n\t\t<field name=\"ALWAYS\"/>\n\t\t<field name=\"EQUAL\"/>\n\t\t<field name=\"GREATER\"/>\n\t\t<field name=\"GREATER_OR_EQUAL\"/>\n\t\t<field name=\"LESS\"/>\n\t\t<field name=\"LESS_OR_EQUAL\"/>\n\t\t<field name=\"NOT_EQUAL\"/>\n\t</class>\n\t<class name=\"android/renderscript/ProgramVertex\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"android/renderscript/Program\"/>\n\t\t<method name=\"getInput(I)Landroid/renderscript/Element;\" since=\"16\" deprecated=\"16\"/>\n\t\t<method name=\"getInputCount()I\" since=\"16\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/ProgramVertex$Builder\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"android/renderscript/Program$BaseProgramBuilder\"/>\n\t\t<method name=\"&lt;init>(Landroid/renderscript/RenderScript;)V\" deprecated=\"16\"/>\n\t\t<method name=\"addInput(Landroid/renderscript/Element;)Landroid/renderscript/ProgramVertex$Builder;\" deprecated=\"16\"/>\n\t\t<method name=\"create()Landroid/renderscript/ProgramVertex;\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/ProgramVertexFixedFunction\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"android/renderscript/ProgramVertex\"/>\n\t\t<method name=\"bindConstants(Landroid/renderscript/ProgramVertexFixedFunction$Constants;)V\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/ProgramVertexFixedFunction$Builder\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/renderscript/RenderScript;)V\" deprecated=\"16\"/>\n\t\t<method name=\"create()Landroid/renderscript/ProgramVertexFixedFunction;\" deprecated=\"16\"/>\n\t\t<method name=\"setTextureMatrixEnable(Z)Landroid/renderscript/ProgramVertexFixedFunction$Builder;\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/ProgramVertexFixedFunction$Constants\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/renderscript/RenderScript;)V\" deprecated=\"16\"/>\n\t\t<method name=\"destroy()V\" deprecated=\"16\"/>\n\t\t<method name=\"setModelview(Landroid/renderscript/Matrix4f;)V\" deprecated=\"16\"/>\n\t\t<method name=\"setProjection(Landroid/renderscript/Matrix4f;)V\" deprecated=\"16\"/>\n\t\t<method name=\"setTexture(Landroid/renderscript/Matrix4f;)V\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/RSDriverException\" since=\"11\">\n\t\t<extends name=\"android/renderscript/RSRuntimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/renderscript/RSIllegalArgumentException\" since=\"11\">\n\t\t<extends name=\"android/renderscript/RSRuntimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/renderscript/RSInvalidStateException\" since=\"11\">\n\t\t<extends name=\"android/renderscript/RSRuntimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/renderscript/RSRuntimeException\" since=\"11\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/renderscript/RSSurfaceView\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"android/view/SurfaceView\"/>\n\t\t<implements name=\"android/view/SurfaceHolder$Callback\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"16\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"16\"/>\n\t\t<method name=\"createRenderScriptGL(Landroid/renderscript/RenderScriptGL$SurfaceConfig;)Landroid/renderscript/RenderScriptGL;\" deprecated=\"16\"/>\n\t\t<method name=\"destroyRenderScriptGL()V\" deprecated=\"16\"/>\n\t\t<method name=\"getRenderScriptGL()Landroid/renderscript/RenderScriptGL;\" deprecated=\"16\"/>\n\t\t<method name=\"pause()V\" deprecated=\"16\"/>\n\t\t<method name=\"resume()V\" deprecated=\"16\"/>\n\t\t<method name=\"setRenderScriptGL(Landroid/renderscript/RenderScriptGL;)V\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/RSTextureView\" since=\"14\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"android/view/TextureView\"/>\n\t\t<implements name=\"android/view/TextureView$SurfaceTextureListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"16\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"16\"/>\n\t\t<method name=\"createRenderScriptGL(Landroid/renderscript/RenderScriptGL$SurfaceConfig;)Landroid/renderscript/RenderScriptGL;\" deprecated=\"16\"/>\n\t\t<method name=\"destroyRenderScriptGL()V\" deprecated=\"16\"/>\n\t\t<method name=\"getRenderScriptGL()Landroid/renderscript/RenderScriptGL;\" deprecated=\"16\"/>\n\t\t<method name=\"pause()V\" deprecated=\"16\"/>\n\t\t<method name=\"resume()V\" deprecated=\"16\"/>\n\t\t<method name=\"setRenderScriptGL(Landroid/renderscript/RenderScriptGL;)V\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/RenderScript\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"contextDump()V\"/>\n\t\t<method name=\"create(Landroid/content/Context;)Landroid/renderscript/RenderScript;\"/>\n\t\t<method name=\"create(Landroid/content/Context;Landroid/renderscript/RenderScript$ContextType;)Landroid/renderscript/RenderScript;\" since=\"18\"/>\n\t\t<method name=\"create(Landroid/content/Context;Landroid/renderscript/RenderScript$ContextType;I)Landroid/renderscript/RenderScript;\" since=\"21\"/>\n\t\t<method name=\"createMultiContext(Landroid/content/Context;Landroid/renderscript/RenderScript$ContextType;II)Landroid/renderscript/RenderScript;\" since=\"23\"/>\n\t\t<method name=\"destroy()V\"/>\n\t\t<method name=\"finish()V\"/>\n\t\t<method name=\"getApplicationContext()Landroid/content/Context;\"/>\n\t\t<method name=\"getErrorHandler()Landroid/renderscript/RenderScript$RSErrorHandler;\"/>\n\t\t<method name=\"getMessageHandler()Landroid/renderscript/RenderScript$RSMessageHandler;\"/>\n\t\t<method name=\"getMinorVersion()J\" since=\"23\"/>\n\t\t<method name=\"releaseAllContexts()V\" since=\"23\"/>\n\t\t<method name=\"sendMessage(I[I)V\" since=\"18\"/>\n\t\t<method name=\"setErrorHandler(Landroid/renderscript/RenderScript$RSErrorHandler;)V\"/>\n\t\t<method name=\"setMessageHandler(Landroid/renderscript/RenderScript$RSMessageHandler;)V\"/>\n\t\t<method name=\"setPriority(Landroid/renderscript/RenderScript$Priority;)V\"/>\n\t\t<field name=\"CREATE_FLAG_LOW_LATENCY\" since=\"21\"/>\n\t\t<field name=\"CREATE_FLAG_LOW_POWER\" since=\"21\"/>\n\t\t<field name=\"CREATE_FLAG_NONE\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/renderscript/RenderScript$ContextType\" since=\"18\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/renderscript/RenderScript$ContextType;\"/>\n\t\t<method name=\"values()[Landroid/renderscript/RenderScript$ContextType;\"/>\n\t\t<field name=\"DEBUG\"/>\n\t\t<field name=\"NORMAL\"/>\n\t\t<field name=\"PROFILE\"/>\n\t</class>\n\t<class name=\"android/renderscript/RenderScript$Priority\" since=\"11\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/renderscript/RenderScript$Priority;\"/>\n\t\t<method name=\"values()[Landroid/renderscript/RenderScript$Priority;\"/>\n\t\t<field name=\"LOW\"/>\n\t\t<field name=\"NORMAL\"/>\n\t</class>\n\t<class name=\"android/renderscript/RenderScript$RSErrorHandler\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Runnable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"mErrorMessage\"/>\n\t\t<field name=\"mErrorNum\"/>\n\t</class>\n\t<class name=\"android/renderscript/RenderScript$RSMessageHandler\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Runnable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"mData\"/>\n\t\t<field name=\"mID\"/>\n\t\t<field name=\"mLength\"/>\n\t</class>\n\t<class name=\"android/renderscript/RenderScriptGL\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"android/renderscript/RenderScript\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/renderscript/RenderScriptGL$SurfaceConfig;)V\" deprecated=\"16\"/>\n\t\t<method name=\"bindProgramFragment(Landroid/renderscript/ProgramFragment;)V\" deprecated=\"16\"/>\n\t\t<method name=\"bindProgramRaster(Landroid/renderscript/ProgramRaster;)V\" deprecated=\"16\"/>\n\t\t<method name=\"bindProgramStore(Landroid/renderscript/ProgramStore;)V\" deprecated=\"16\"/>\n\t\t<method name=\"bindProgramVertex(Landroid/renderscript/ProgramVertex;)V\" deprecated=\"16\"/>\n\t\t<method name=\"bindRootScript(Landroid/renderscript/Script;)V\" deprecated=\"16\"/>\n\t\t<method name=\"getHeight()I\" deprecated=\"16\"/>\n\t\t<method name=\"getWidth()I\" deprecated=\"16\"/>\n\t\t<method name=\"pause()V\" deprecated=\"16\"/>\n\t\t<method name=\"resume()V\" deprecated=\"16\"/>\n\t\t<method name=\"setSurface(Landroid/view/SurfaceHolder;II)V\" deprecated=\"16\"/>\n\t\t<method name=\"setSurfaceTexture(Landroid/graphics/SurfaceTexture;II)V\" since=\"14\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/RenderScriptGL$SurfaceConfig\" since=\"11\" deprecated=\"16\" removed=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"16\"/>\n\t\t<method name=\"&lt;init>(Landroid/renderscript/RenderScriptGL$SurfaceConfig;)V\" deprecated=\"16\"/>\n\t\t<method name=\"setAlpha(II)V\" deprecated=\"16\"/>\n\t\t<method name=\"setColor(II)V\" deprecated=\"16\"/>\n\t\t<method name=\"setDepth(II)V\" deprecated=\"16\"/>\n\t\t<method name=\"setSamples(IIF)V\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/Sampler\" since=\"11\">\n\t\t<extends name=\"android/renderscript/BaseObj\"/>\n\t\t<method name=\"CLAMP_LINEAR(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;\"/>\n\t\t<method name=\"CLAMP_LINEAR_MIP_LINEAR(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;\"/>\n\t\t<method name=\"CLAMP_NEAREST(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;\"/>\n\t\t<method name=\"MIRRORED_REPEAT_LINEAR(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;\" since=\"18\"/>\n\t\t<method name=\"MIRRORED_REPEAT_LINEAR_MIP_LINEAR(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;\" since=\"18\"/>\n\t\t<method name=\"MIRRORED_REPEAT_NEAREST(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;\" since=\"18\"/>\n\t\t<method name=\"WRAP_LINEAR(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;\"/>\n\t\t<method name=\"WRAP_LINEAR_MIP_LINEAR(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;\"/>\n\t\t<method name=\"WRAP_NEAREST(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;\"/>\n\t\t<method name=\"getAnisotropy()F\" since=\"16\"/>\n\t\t<method name=\"getMagnification()Landroid/renderscript/Sampler$Value;\" since=\"16\"/>\n\t\t<method name=\"getMinification()Landroid/renderscript/Sampler$Value;\" since=\"16\"/>\n\t\t<method name=\"getWrapS()Landroid/renderscript/Sampler$Value;\" since=\"16\"/>\n\t\t<method name=\"getWrapT()Landroid/renderscript/Sampler$Value;\" since=\"16\"/>\n\t</class>\n\t<class name=\"android/renderscript/Sampler$Builder\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/renderscript/RenderScript;)V\"/>\n\t\t<method name=\"create()Landroid/renderscript/Sampler;\"/>\n\t\t<method name=\"setAnisotropy(F)V\"/>\n\t\t<method name=\"setMagnification(Landroid/renderscript/Sampler$Value;)V\"/>\n\t\t<method name=\"setMinification(Landroid/renderscript/Sampler$Value;)V\"/>\n\t\t<method name=\"setWrapS(Landroid/renderscript/Sampler$Value;)V\"/>\n\t\t<method name=\"setWrapT(Landroid/renderscript/Sampler$Value;)V\"/>\n\t</class>\n\t<class name=\"android/renderscript/Sampler$Value\" since=\"11\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/renderscript/Sampler$Value;\"/>\n\t\t<method name=\"values()[Landroid/renderscript/Sampler$Value;\"/>\n\t\t<field name=\"CLAMP\"/>\n\t\t<field name=\"LINEAR\"/>\n\t\t<field name=\"LINEAR_MIP_LINEAR\"/>\n\t\t<field name=\"LINEAR_MIP_NEAREST\"/>\n\t\t<field name=\"MIRRORED_REPEAT\" since=\"18\"/>\n\t\t<field name=\"NEAREST\"/>\n\t\t<field name=\"WRAP\"/>\n\t</class>\n\t<class name=\"android/renderscript/Script\" since=\"11\">\n\t\t<extends name=\"android/renderscript/BaseObj\"/>\n\t\t<method name=\"bindAllocation(Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"createFieldID(ILandroid/renderscript/Element;)Landroid/renderscript/Script$FieldID;\" since=\"17\"/>\n\t\t<method name=\"createInvokeID(I)Landroid/renderscript/Script$InvokeID;\" since=\"23\"/>\n\t\t<method name=\"createKernelID(IILandroid/renderscript/Element;Landroid/renderscript/Element;)Landroid/renderscript/Script$KernelID;\" since=\"17\"/>\n\t\t<method name=\"forEach(ILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/FieldPacker;)V\" since=\"14\"/>\n\t\t<method name=\"forEach(ILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/FieldPacker;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"18\"/>\n\t\t<method name=\"forEach(I[Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/FieldPacker;)V\" since=\"23\"/>\n\t\t<method name=\"forEach(I[Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/FieldPacker;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"23\"/>\n\t\t<method name=\"getVarB(I)Z\" since=\"18\"/>\n\t\t<method name=\"getVarD(I)D\" since=\"18\"/>\n\t\t<method name=\"getVarF(I)F\" since=\"18\"/>\n\t\t<method name=\"getVarI(I)I\" since=\"18\"/>\n\t\t<method name=\"getVarJ(I)J\" since=\"18\"/>\n\t\t<method name=\"getVarV(ILandroid/renderscript/FieldPacker;)V\" since=\"18\"/>\n\t\t<method name=\"invoke(I)V\"/>\n\t\t<method name=\"invoke(ILandroid/renderscript/FieldPacker;)V\"/>\n\t\t<method name=\"reduce(I[Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"24\"/>\n\t\t<method name=\"setTimeZone(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setVar(ID)V\"/>\n\t\t<method name=\"setVar(IF)V\"/>\n\t\t<method name=\"setVar(II)V\"/>\n\t\t<method name=\"setVar(IJ)V\"/>\n\t\t<method name=\"setVar(ILandroid/renderscript/BaseObj;)V\"/>\n\t\t<method name=\"setVar(ILandroid/renderscript/FieldPacker;)V\"/>\n\t\t<method name=\"setVar(ILandroid/renderscript/FieldPacker;Landroid/renderscript/Element;[I)V\" since=\"16\"/>\n\t\t<method name=\"setVar(IZ)V\"/>\n\t</class>\n\t<class name=\"android/renderscript/Script$Builder\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/renderscript/Script$FieldBase\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getAllocation()Landroid/renderscript/Allocation;\"/>\n\t\t<method name=\"getElement()Landroid/renderscript/Element;\"/>\n\t\t<method name=\"getType()Landroid/renderscript/Type;\"/>\n\t\t<method name=\"init(Landroid/renderscript/RenderScript;I)V\"/>\n\t\t<method name=\"init(Landroid/renderscript/RenderScript;II)V\"/>\n\t\t<method name=\"updateAllocation()V\"/>\n\t\t<field name=\"mAllocation\"/>\n\t\t<field name=\"mElement\"/>\n\t</class>\n\t<class name=\"android/renderscript/Script$FieldID\" since=\"17\">\n\t\t<extends name=\"android/renderscript/BaseObj\"/>\n\t</class>\n\t<class name=\"android/renderscript/Script$InvokeID\" since=\"23\">\n\t\t<extends name=\"android/renderscript/BaseObj\"/>\n\t</class>\n\t<class name=\"android/renderscript/Script$KernelID\" since=\"17\">\n\t\t<extends name=\"android/renderscript/BaseObj\"/>\n\t</class>\n\t<class name=\"android/renderscript/Script$LaunchOptions\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getXEnd()I\"/>\n\t\t<method name=\"getXStart()I\"/>\n\t\t<method name=\"getYEnd()I\"/>\n\t\t<method name=\"getYStart()I\"/>\n\t\t<method name=\"getZEnd()I\"/>\n\t\t<method name=\"getZStart()I\"/>\n\t\t<method name=\"setX(II)Landroid/renderscript/Script$LaunchOptions;\"/>\n\t\t<method name=\"setY(II)Landroid/renderscript/Script$LaunchOptions;\"/>\n\t\t<method name=\"setZ(II)Landroid/renderscript/Script$LaunchOptions;\"/>\n\t</class>\n\t<class name=\"android/renderscript/ScriptC\" since=\"11\">\n\t\t<extends name=\"android/renderscript/Script\"/>\n\t\t<method name=\"&lt;init>(ILandroid/renderscript/RenderScript;)V\"/>\n\t\t<method name=\"&lt;init>(JLandroid/renderscript/RenderScript;)V\" since=\"21\"/>\n\t\t<method name=\"&lt;init>(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/renderscript/RenderScript;Ljava/lang/String;[B[B)V\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/renderscript/ScriptGroup\" since=\"17\">\n\t\t<extends name=\"android/renderscript/BaseObj\"/>\n\t\t<method name=\"execute()V\" deprecated=\"23\"/>\n\t\t<method name=\"execute([Ljava/lang/Object;)[Ljava/lang/Object;\" since=\"23\"/>\n\t\t<method name=\"setInput(Landroid/renderscript/Script$KernelID;Landroid/renderscript/Allocation;)V\" deprecated=\"23\"/>\n\t\t<method name=\"setOutput(Landroid/renderscript/Script$KernelID;Landroid/renderscript/Allocation;)V\" deprecated=\"23\"/>\n\t</class>\n\t<class name=\"android/renderscript/ScriptGroup$Binding\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/renderscript/Script$FieldID;Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"android/renderscript/ScriptGroup$Builder\" since=\"17\" deprecated=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/renderscript/RenderScript;)V\" deprecated=\"29\"/>\n\t\t<method name=\"addConnection(Landroid/renderscript/Type;Landroid/renderscript/Script$KernelID;Landroid/renderscript/Script$FieldID;)Landroid/renderscript/ScriptGroup$Builder;\" deprecated=\"29\"/>\n\t\t<method name=\"addConnection(Landroid/renderscript/Type;Landroid/renderscript/Script$KernelID;Landroid/renderscript/Script$KernelID;)Landroid/renderscript/ScriptGroup$Builder;\" deprecated=\"29\"/>\n\t\t<method name=\"addKernel(Landroid/renderscript/Script$KernelID;)Landroid/renderscript/ScriptGroup$Builder;\" deprecated=\"29\"/>\n\t\t<method name=\"create()Landroid/renderscript/ScriptGroup;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/renderscript/ScriptGroup$Builder2\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/renderscript/RenderScript;)V\"/>\n\t\t<method name=\"addInput()Landroid/renderscript/ScriptGroup$Input;\"/>\n\t\t<method name=\"addInvoke(Landroid/renderscript/Script$InvokeID;[Ljava/lang/Object;)Landroid/renderscript/ScriptGroup$Closure;\"/>\n\t\t<method name=\"addKernel(Landroid/renderscript/Script$KernelID;Landroid/renderscript/Type;[Ljava/lang/Object;)Landroid/renderscript/ScriptGroup$Closure;\"/>\n\t\t<method name=\"create(Ljava/lang/String;[Landroid/renderscript/ScriptGroup$Future;)Landroid/renderscript/ScriptGroup;\"/>\n\t</class>\n\t<class name=\"android/renderscript/ScriptGroup$Closure\" since=\"23\">\n\t\t<extends name=\"android/renderscript/BaseObj\"/>\n\t\t<method name=\"getGlobal(Landroid/renderscript/Script$FieldID;)Landroid/renderscript/ScriptGroup$Future;\"/>\n\t\t<method name=\"getReturn()Landroid/renderscript/ScriptGroup$Future;\"/>\n\t</class>\n\t<class name=\"android/renderscript/ScriptGroup$Future\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/renderscript/ScriptGroup$Input\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/renderscript/ScriptIntrinsic\" since=\"17\">\n\t\t<extends name=\"android/renderscript/Script\"/>\n\t</class>\n\t<class name=\"android/renderscript/ScriptIntrinsic3DLUT\" since=\"18\">\n\t\t<extends name=\"android/renderscript/ScriptIntrinsic\"/>\n\t\t<method name=\"create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsic3DLUT;\"/>\n\t\t<method name=\"forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"getKernelID()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"setLUT(Landroid/renderscript/Allocation;)V\"/>\n\t</class>\n\t<class name=\"android/renderscript/ScriptIntrinsicBLAS\" since=\"23\">\n\t\t<extends name=\"android/renderscript/ScriptIntrinsic\"/>\n\t\t<method name=\"BNNM(Landroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;II)V\"/>\n\t\t<method name=\"CGBMV(IIILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;ILandroid/renderscript/Float2;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"CGEMM(IILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Float2;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"CGEMV(ILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;ILandroid/renderscript/Float2;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"CGERC(Landroid/renderscript/Float2;Landroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"CGERU(Landroid/renderscript/Float2;Landroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"CHBMV(IILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;ILandroid/renderscript/Float2;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"CHEMM(IILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Float2;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"CHEMV(ILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;ILandroid/renderscript/Float2;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"CHER(IFLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"CHER2(ILandroid/renderscript/Float2;Landroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"CHER2K(IILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;FLandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"CHERK(IIFLandroid/renderscript/Allocation;FLandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"CHPMV(ILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;ILandroid/renderscript/Float2;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"CHPR(IFLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"CHPR2(ILandroid/renderscript/Float2;Landroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"CSYMM(IILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Float2;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"CSYR2K(IILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Float2;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"CSYRK(IILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Float2;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"CTBMV(IIIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"CTBSV(IIIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"CTPMV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"CTPSV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"CTRMM(IIIILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"CTRMV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"CTRSM(IIIILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"CTRSV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"DGBMV(IIIDLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;IDLandroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"DGEMM(IIDLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;DLandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"DGEMV(IDLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;IDLandroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"DGER(DLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"DSBMV(IIDLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;IDLandroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"DSPMV(IDLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;IDLandroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"DSPR(IDLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"DSPR2(IDLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"DSYMM(IIDLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;DLandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"DSYMV(IDLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;IDLandroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"DSYR(IDLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"DSYR2(IDLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"DSYR2K(IIDLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;DLandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"DSYRK(IIDLandroid/renderscript/Allocation;DLandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"DTBMV(IIIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"DTBSV(IIIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"DTPMV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"DTPSV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"DTRMM(IIIIDLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"DTRMV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"DTRSM(IIIIDLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"DTRSV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"SGBMV(IIIFLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;IFLandroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"SGEMM(IIFLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;FLandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"SGEMV(IFLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;IFLandroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"SGER(FLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"SSBMV(IIFLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;IFLandroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"SSPMV(IFLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;IFLandroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"SSPR(IFLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"SSPR2(IFLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"SSYMM(IIFLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;FLandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"SSYMV(IFLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;IFLandroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"SSYR(IFLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"SSYR2(IFLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"SSYR2K(IIFLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;FLandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"SSYRK(IIFLandroid/renderscript/Allocation;FLandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"STBMV(IIIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"STBSV(IIIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"STPMV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"STPSV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"STRMM(IIIIFLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"STRMV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"STRSM(IIIIFLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"STRSV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"ZGBMV(IIILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;ILandroid/renderscript/Double2;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"ZGEMM(IILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Double2;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"ZGEMV(ILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;ILandroid/renderscript/Double2;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"ZGERC(Landroid/renderscript/Double2;Landroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"ZGERU(Landroid/renderscript/Double2;Landroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"ZHBMV(IILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;ILandroid/renderscript/Double2;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"ZHEMM(IILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Double2;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"ZHEMV(ILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;ILandroid/renderscript/Double2;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"ZHER(IDLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"ZHER2(ILandroid/renderscript/Double2;Landroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"ZHER2K(IILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;DLandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"ZHERK(IIDLandroid/renderscript/Allocation;DLandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"ZHPMV(ILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;ILandroid/renderscript/Double2;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"ZHPR(IDLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"ZHPR2(ILandroid/renderscript/Double2;Landroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"ZSYMM(IILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Double2;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"ZSYR2K(IILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Double2;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"ZSYRK(IILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Double2;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"ZTBMV(IIIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"ZTBSV(IIIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"ZTPMV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"ZTPSV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"ZTRMM(IIIILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"ZTRMV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"ZTRSM(IIIILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"ZTRSV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V\"/>\n\t\t<method name=\"create(Landroid/renderscript/RenderScript;)Landroid/renderscript/ScriptIntrinsicBLAS;\"/>\n\t\t<field name=\"CONJ_TRANSPOSE\"/>\n\t\t<field name=\"LEFT\"/>\n\t\t<field name=\"LOWER\"/>\n\t\t<field name=\"NON_UNIT\"/>\n\t\t<field name=\"NO_TRANSPOSE\"/>\n\t\t<field name=\"RIGHT\"/>\n\t\t<field name=\"TRANSPOSE\"/>\n\t\t<field name=\"UNIT\"/>\n\t\t<field name=\"UPPER\"/>\n\t</class>\n\t<class name=\"android/renderscript/ScriptIntrinsicBlend\" since=\"17\">\n\t\t<extends name=\"android/renderscript/ScriptIntrinsic\"/>\n\t\t<method name=\"create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicBlend;\"/>\n\t\t<method name=\"forEachAdd(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEachAdd(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"forEachClear(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEachClear(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"forEachDst(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEachDst(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"forEachDstAtop(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEachDstAtop(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"forEachDstIn(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEachDstIn(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"forEachDstOut(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEachDstOut(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"forEachDstOver(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEachDstOver(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"forEachMultiply(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEachMultiply(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"forEachSrc(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEachSrc(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"forEachSrcAtop(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEachSrcAtop(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"forEachSrcIn(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEachSrcIn(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"forEachSrcOut(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEachSrcOut(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"forEachSrcOver(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEachSrcOver(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"forEachSubtract(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEachSubtract(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"forEachXor(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEachXor(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"getKernelIDAdd()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"getKernelIDClear()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"getKernelIDDst()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"getKernelIDDstAtop()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"getKernelIDDstIn()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"getKernelIDDstOut()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"getKernelIDDstOver()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"getKernelIDMultiply()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"getKernelIDSrc()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"getKernelIDSrcAtop()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"getKernelIDSrcIn()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"getKernelIDSrcOut()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"getKernelIDSrcOver()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"getKernelIDSubtract()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"getKernelIDXor()Landroid/renderscript/Script$KernelID;\"/>\n\t</class>\n\t<class name=\"android/renderscript/ScriptIntrinsicBlur\" since=\"17\">\n\t\t<extends name=\"android/renderscript/ScriptIntrinsic\"/>\n\t\t<method name=\"create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicBlur;\"/>\n\t\t<method name=\"forEach(Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"getFieldID_Input()Landroid/renderscript/Script$FieldID;\"/>\n\t\t<method name=\"getKernelID()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"setInput(Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"setRadius(F)V\"/>\n\t</class>\n\t<class name=\"android/renderscript/ScriptIntrinsicColorMatrix\" since=\"17\">\n\t\t<extends name=\"android/renderscript/ScriptIntrinsic\"/>\n\t\t<method name=\"create(Landroid/renderscript/RenderScript;)Landroid/renderscript/ScriptIntrinsicColorMatrix;\" since=\"19\"/>\n\t\t<method name=\"create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicColorMatrix;\" deprecated=\"19\"/>\n\t\t<method name=\"forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"getKernelID()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"setAdd(FFFF)V\" since=\"19\"/>\n\t\t<method name=\"setAdd(Landroid/renderscript/Float4;)V\" since=\"19\"/>\n\t\t<method name=\"setColorMatrix(Landroid/renderscript/Matrix3f;)V\"/>\n\t\t<method name=\"setColorMatrix(Landroid/renderscript/Matrix4f;)V\"/>\n\t\t<method name=\"setGreyscale()V\"/>\n\t\t<method name=\"setRGBtoYUV()V\"/>\n\t\t<method name=\"setYUVtoRGB()V\"/>\n\t</class>\n\t<class name=\"android/renderscript/ScriptIntrinsicConvolve3x3\" since=\"17\">\n\t\t<extends name=\"android/renderscript/ScriptIntrinsic\"/>\n\t\t<method name=\"create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicConvolve3x3;\"/>\n\t\t<method name=\"forEach(Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"getFieldID_Input()Landroid/renderscript/Script$FieldID;\"/>\n\t\t<method name=\"getKernelID()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"setCoefficients([F)V\"/>\n\t\t<method name=\"setInput(Landroid/renderscript/Allocation;)V\"/>\n\t</class>\n\t<class name=\"android/renderscript/ScriptIntrinsicConvolve5x5\" since=\"17\">\n\t\t<extends name=\"android/renderscript/ScriptIntrinsic\"/>\n\t\t<method name=\"create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicConvolve5x5;\"/>\n\t\t<method name=\"forEach(Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"getFieldID_Input()Landroid/renderscript/Script$FieldID;\"/>\n\t\t<method name=\"getKernelID()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"setCoefficients([F)V\"/>\n\t\t<method name=\"setInput(Landroid/renderscript/Allocation;)V\"/>\n\t</class>\n\t<class name=\"android/renderscript/ScriptIntrinsicHistogram\" since=\"19\">\n\t\t<extends name=\"android/renderscript/ScriptIntrinsic\"/>\n\t\t<method name=\"create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicHistogram;\"/>\n\t\t<method name=\"forEach(Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"forEach_Dot(Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEach_Dot(Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"getFieldID_Input()Landroid/renderscript/Script$FieldID;\"/>\n\t\t<method name=\"getKernelID_Separate()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"setDotCoefficients(FFFF)V\"/>\n\t\t<method name=\"setOutput(Landroid/renderscript/Allocation;)V\"/>\n\t</class>\n\t<class name=\"android/renderscript/ScriptIntrinsicLUT\" since=\"17\">\n\t\t<extends name=\"android/renderscript/ScriptIntrinsic\"/>\n\t\t<method name=\"create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicLUT;\"/>\n\t\t<method name=\"forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\" since=\"21\"/>\n\t\t<method name=\"getKernelID()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"setAlpha(II)V\"/>\n\t\t<method name=\"setBlue(II)V\"/>\n\t\t<method name=\"setGreen(II)V\"/>\n\t\t<method name=\"setRed(II)V\"/>\n\t</class>\n\t<class name=\"android/renderscript/ScriptIntrinsicResize\" since=\"20\">\n\t\t<extends name=\"android/renderscript/ScriptIntrinsic\"/>\n\t\t<method name=\"create(Landroid/renderscript/RenderScript;)Landroid/renderscript/ScriptIntrinsicResize;\"/>\n\t\t<method name=\"forEach_bicubic(Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"forEach_bicubic(Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V\"/>\n\t\t<method name=\"getFieldID_Input()Landroid/renderscript/Script$FieldID;\"/>\n\t\t<method name=\"getKernelID_bicubic()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"setInput(Landroid/renderscript/Allocation;)V\"/>\n\t</class>\n\t<class name=\"android/renderscript/ScriptIntrinsicYuvToRGB\" since=\"17\">\n\t\t<extends name=\"android/renderscript/ScriptIntrinsic\"/>\n\t\t<method name=\"create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicYuvToRGB;\"/>\n\t\t<method name=\"forEach(Landroid/renderscript/Allocation;)V\"/>\n\t\t<method name=\"getFieldID_Input()Landroid/renderscript/Script$FieldID;\"/>\n\t\t<method name=\"getKernelID()Landroid/renderscript/Script$KernelID;\"/>\n\t\t<method name=\"setInput(Landroid/renderscript/Allocation;)V\"/>\n\t</class>\n\t<class name=\"android/renderscript/Short2\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(SS)V\" since=\"14\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t</class>\n\t<class name=\"android/renderscript/Short3\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(SSS)V\" since=\"14\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t\t<field name=\"z\"/>\n\t</class>\n\t<class name=\"android/renderscript/Short4\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(SSSS)V\" since=\"14\"/>\n\t\t<field name=\"w\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t\t<field name=\"z\"/>\n\t</class>\n\t<class name=\"android/renderscript/Type\" since=\"11\">\n\t\t<extends name=\"android/renderscript/BaseObj\"/>\n\t\t<method name=\"createX(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;I)Landroid/renderscript/Type;\" since=\"21\"/>\n\t\t<method name=\"createXY(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;II)Landroid/renderscript/Type;\" since=\"21\"/>\n\t\t<method name=\"createXYZ(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;III)Landroid/renderscript/Type;\" since=\"21\"/>\n\t\t<method name=\"getCount()I\"/>\n\t\t<method name=\"getElement()Landroid/renderscript/Element;\"/>\n\t\t<method name=\"getX()I\"/>\n\t\t<method name=\"getY()I\"/>\n\t\t<method name=\"getYuv()I\" since=\"18\"/>\n\t\t<method name=\"getZ()I\"/>\n\t\t<method name=\"hasFaces()Z\"/>\n\t\t<method name=\"hasMipmaps()Z\"/>\n\t</class>\n\t<class name=\"android/renderscript/Type$Builder\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)V\"/>\n\t\t<method name=\"create()Landroid/renderscript/Type;\"/>\n\t\t<method name=\"setFaces(Z)Landroid/renderscript/Type$Builder;\"/>\n\t\t<method name=\"setMipmaps(Z)Landroid/renderscript/Type$Builder;\"/>\n\t\t<method name=\"setX(I)Landroid/renderscript/Type$Builder;\"/>\n\t\t<method name=\"setY(I)Landroid/renderscript/Type$Builder;\"/>\n\t\t<method name=\"setYuvFormat(I)Landroid/renderscript/Type$Builder;\" since=\"18\"/>\n\t\t<method name=\"setZ(I)Landroid/renderscript/Type$Builder;\" since=\"18\"/>\n\t</class>\n\t<class name=\"android/renderscript/Type$CubemapFace\" since=\"11\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/renderscript/Type$CubemapFace;\"/>\n\t\t<method name=\"values()[Landroid/renderscript/Type$CubemapFace;\"/>\n\t\t<field name=\"NEGATIVE_X\"/>\n\t\t<field name=\"NEGATIVE_Y\"/>\n\t\t<field name=\"NEGATIVE_Z\"/>\n\t\t<field name=\"POSITIVE_X\" since=\"14\"/>\n\t\t<field name=\"POSITIVE_Y\" since=\"14\"/>\n\t\t<field name=\"POSITIVE_Z\" since=\"14\"/>\n\t\t<field name=\"POSITVE_X\" deprecated=\"29\"/>\n\t\t<field name=\"POSITVE_Y\" deprecated=\"29\"/>\n\t\t<field name=\"POSITVE_Z\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/sax/Element\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getChild(Ljava/lang/String;)Landroid/sax/Element;\"/>\n\t\t<method name=\"getChild(Ljava/lang/String;Ljava/lang/String;)Landroid/sax/Element;\"/>\n\t\t<method name=\"requireChild(Ljava/lang/String;)Landroid/sax/Element;\"/>\n\t\t<method name=\"requireChild(Ljava/lang/String;Ljava/lang/String;)Landroid/sax/Element;\"/>\n\t\t<method name=\"setElementListener(Landroid/sax/ElementListener;)V\"/>\n\t\t<method name=\"setEndElementListener(Landroid/sax/EndElementListener;)V\"/>\n\t\t<method name=\"setEndTextElementListener(Landroid/sax/EndTextElementListener;)V\"/>\n\t\t<method name=\"setStartElementListener(Landroid/sax/StartElementListener;)V\"/>\n\t\t<method name=\"setTextElementListener(Landroid/sax/TextElementListener;)V\"/>\n\t</class>\n\t<class name=\"android/sax/ElementListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/sax/EndElementListener\"/>\n\t\t<implements name=\"android/sax/StartElementListener\"/>\n\t</class>\n\t<class name=\"android/sax/EndElementListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"end()V\"/>\n\t</class>\n\t<class name=\"android/sax/EndTextElementListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"end(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/sax/RootElement\" since=\"1\">\n\t\t<extends name=\"android/sax/Element\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getContentHandler()Lorg/xml/sax/ContentHandler;\"/>\n\t</class>\n\t<class name=\"android/sax/StartElementListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"start(Lorg/xml/sax/Attributes;)V\"/>\n\t</class>\n\t<class name=\"android/sax/TextElementListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/sax/EndTextElementListener\"/>\n\t\t<implements name=\"android/sax/StartElementListener\"/>\n\t</class>\n\t<class name=\"android/se/omapi/Channel\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/channels/Channel\"/>\n\t\t<method name=\"getSelectResponse()[B\"/>\n\t\t<method name=\"getSession()Landroid/se/omapi/Session;\"/>\n\t\t<method name=\"isBasicChannel()Z\"/>\n\t\t<method name=\"selectNext()Z\"/>\n\t\t<method name=\"transmit([B)[B\"/>\n\t</class>\n\t<class name=\"android/se/omapi/Reader\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"closeSessions()V\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getSEService()Landroid/se/omapi/SEService;\"/>\n\t\t<method name=\"isSecureElementPresent()Z\"/>\n\t\t<method name=\"openSession()Landroid/se/omapi/Session;\"/>\n\t</class>\n\t<class name=\"android/se/omapi/SEService\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/util/concurrent/Executor;Landroid/se/omapi/SEService$OnConnectedListener;)V\"/>\n\t\t<method name=\"getReaders()[Landroid/se/omapi/Reader;\"/>\n\t\t<method name=\"getUiccReader(I)Landroid/se/omapi/Reader;\" since=\"30\"/>\n\t\t<method name=\"getVersion()Ljava/lang/String;\"/>\n\t\t<method name=\"isConnected()Z\"/>\n\t\t<method name=\"shutdown()V\"/>\n\t</class>\n\t<class name=\"android/se/omapi/SEService$OnConnectedListener\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onConnected()V\"/>\n\t</class>\n\t<class name=\"android/se/omapi/Session\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"closeChannels()V\"/>\n\t\t<method name=\"getATR()[B\"/>\n\t\t<method name=\"getReader()Landroid/se/omapi/Reader;\"/>\n\t\t<method name=\"isClosed()Z\"/>\n\t\t<method name=\"openBasicChannel([B)Landroid/se/omapi/Channel;\"/>\n\t\t<method name=\"openBasicChannel([BB)Landroid/se/omapi/Channel;\"/>\n\t\t<method name=\"openLogicalChannel([B)Landroid/se/omapi/Channel;\"/>\n\t\t<method name=\"openLogicalChannel([BB)Landroid/se/omapi/Channel;\"/>\n\t</class>\n\t<class name=\"android/security/AttestedKeyPair\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAttestationRecord()Ljava/util/List;\"/>\n\t\t<method name=\"getKeyPair()Ljava/security/KeyPair;\"/>\n\t</class>\n\t<class name=\"android/security/ConfirmationAlreadyPresentingException\" since=\"28\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/security/ConfirmationCallback\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCanceled()V\"/>\n\t\t<method name=\"onConfirmed([B)V\"/>\n\t\t<method name=\"onDismissed()V\"/>\n\t\t<method name=\"onError(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/security/ConfirmationNotAvailableException\" since=\"28\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/security/ConfirmationPrompt\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"cancelPrompt()V\"/>\n\t\t<method name=\"isSupported(Landroid/content/Context;)Z\"/>\n\t\t<method name=\"presentPrompt(Ljava/util/concurrent/Executor;Landroid/security/ConfirmationCallback;)V\"/>\n\t</class>\n\t<class name=\"android/security/ConfirmationPrompt$Builder\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"build()Landroid/security/ConfirmationPrompt;\"/>\n\t\t<method name=\"setExtraData([B)Landroid/security/ConfirmationPrompt$Builder;\"/>\n\t\t<method name=\"setPromptText(Ljava/lang/CharSequence;)Landroid/security/ConfirmationPrompt$Builder;\"/>\n\t</class>\n\t<class name=\"android/security/KeyChain\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"choosePrivateKeyAlias(Landroid/app/Activity;Landroid/security/KeyChainAliasCallback;[Ljava/lang/String;[Ljava/security/Principal;Landroid/net/Uri;Ljava/lang/String;)V\" since=\"23\"/>\n\t\t<method name=\"choosePrivateKeyAlias(Landroid/app/Activity;Landroid/security/KeyChainAliasCallback;[Ljava/lang/String;[Ljava/security/Principal;Ljava/lang/String;ILjava/lang/String;)V\"/>\n\t\t<method name=\"createInstallIntent()Landroid/content/Intent;\"/>\n\t\t<method name=\"getCertificateChain(Landroid/content/Context;Ljava/lang/String;)[Ljava/security/cert/X509Certificate;\"/>\n\t\t<method name=\"getPrivateKey(Landroid/content/Context;Ljava/lang/String;)Ljava/security/PrivateKey;\"/>\n\t\t<method name=\"isBoundKeyAlgorithm(Ljava/lang/String;)Z\" since=\"18\" deprecated=\"23\"/>\n\t\t<method name=\"isKeyAlgorithmSupported(Ljava/lang/String;)Z\" since=\"18\"/>\n\t\t<field name=\"ACTION_KEYCHAIN_CHANGED\" since=\"26\"/>\n\t\t<field name=\"ACTION_KEY_ACCESS_CHANGED\" since=\"26\"/>\n\t\t<field name=\"ACTION_STORAGE_CHANGED\" since=\"16\" deprecated=\"26\"/>\n\t\t<field name=\"ACTION_TRUST_STORE_CHANGED\" since=\"26\"/>\n\t\t<field name=\"EXTRA_CERTIFICATE\"/>\n\t\t<field name=\"EXTRA_KEY_ACCESSIBLE\" since=\"26\"/>\n\t\t<field name=\"EXTRA_KEY_ALIAS\" since=\"26\"/>\n\t\t<field name=\"EXTRA_NAME\"/>\n\t\t<field name=\"EXTRA_PKCS12\"/>\n\t</class>\n\t<class name=\"android/security/KeyChainAliasCallback\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"alias(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/security/KeyChainException\" since=\"14\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/security/KeyPairGeneratorSpec\" since=\"18\" deprecated=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/AlgorithmParameterSpec\"/>\n\t\t<method name=\"getAlgorithmParameterSpec()Ljava/security/spec/AlgorithmParameterSpec;\" since=\"19\" deprecated=\"29\"/>\n\t\t<method name=\"getContext()Landroid/content/Context;\" deprecated=\"29\"/>\n\t\t<method name=\"getEndDate()Ljava/util/Date;\" deprecated=\"29\"/>\n\t\t<method name=\"getKeySize()I\" since=\"19\" deprecated=\"29\"/>\n\t\t<method name=\"getKeyType()Ljava/lang/String;\" since=\"19\" deprecated=\"29\"/>\n\t\t<method name=\"getKeystoreAlias()Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getSerialNumber()Ljava/math/BigInteger;\" deprecated=\"29\"/>\n\t\t<method name=\"getStartDate()Ljava/util/Date;\" deprecated=\"29\"/>\n\t\t<method name=\"getSubjectDN()Ljavax/security/auth/x500/X500Principal;\" deprecated=\"29\"/>\n\t\t<method name=\"isEncryptionRequired()Z\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/security/KeyPairGeneratorSpec$Builder\" since=\"18\" deprecated=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"build()Landroid/security/KeyPairGeneratorSpec;\" deprecated=\"29\"/>\n\t\t<method name=\"setAlgorithmParameterSpec(Ljava/security/spec/AlgorithmParameterSpec;)Landroid/security/KeyPairGeneratorSpec$Builder;\" since=\"19\" deprecated=\"29\"/>\n\t\t<method name=\"setAlias(Ljava/lang/String;)Landroid/security/KeyPairGeneratorSpec$Builder;\" deprecated=\"29\"/>\n\t\t<method name=\"setEncryptionRequired()Landroid/security/KeyPairGeneratorSpec$Builder;\" deprecated=\"29\"/>\n\t\t<method name=\"setEndDate(Ljava/util/Date;)Landroid/security/KeyPairGeneratorSpec$Builder;\" deprecated=\"29\"/>\n\t\t<method name=\"setKeySize(I)Landroid/security/KeyPairGeneratorSpec$Builder;\" since=\"19\" deprecated=\"29\"/>\n\t\t<method name=\"setKeyType(Ljava/lang/String;)Landroid/security/KeyPairGeneratorSpec$Builder;\" since=\"19\" deprecated=\"29\"/>\n\t\t<method name=\"setSerialNumber(Ljava/math/BigInteger;)Landroid/security/KeyPairGeneratorSpec$Builder;\" deprecated=\"29\"/>\n\t\t<method name=\"setStartDate(Ljava/util/Date;)Landroid/security/KeyPairGeneratorSpec$Builder;\" deprecated=\"29\"/>\n\t\t<method name=\"setSubject(Ljavax/security/auth/x500/X500Principal;)Landroid/security/KeyPairGeneratorSpec$Builder;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/security/KeyStoreParameter\" since=\"18\" deprecated=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/KeyStore$ProtectionParameter\"/>\n\t\t<method name=\"isEncryptionRequired()Z\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/security/KeyStoreParameter$Builder\" since=\"18\" deprecated=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"build()Landroid/security/KeyStoreParameter;\" deprecated=\"29\"/>\n\t\t<method name=\"setEncryptionRequired(Z)Landroid/security/KeyStoreParameter$Builder;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/security/NetworkSecurityPolicy\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getInstance()Landroid/security/NetworkSecurityPolicy;\"/>\n\t\t<method name=\"isCleartextTrafficPermitted()Z\"/>\n\t\t<method name=\"isCleartextTrafficPermitted(Ljava/lang/String;)Z\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/security/identity/AccessControlProfile\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/security/identity/AccessControlProfile$Builder\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/security/identity/AccessControlProfileId;)V\"/>\n\t\t<method name=\"build()Landroid/security/identity/AccessControlProfile;\"/>\n\t\t<method name=\"setReaderCertificate(Ljava/security/cert/X509Certificate;)Landroid/security/identity/AccessControlProfile$Builder;\"/>\n\t\t<method name=\"setUserAuthenticationRequired(Z)Landroid/security/identity/AccessControlProfile$Builder;\"/>\n\t\t<method name=\"setUserAuthenticationTimeout(J)Landroid/security/identity/AccessControlProfile$Builder;\"/>\n\t</class>\n\t<class name=\"android/security/identity/AccessControlProfileId\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"getId()I\"/>\n\t</class>\n\t<class name=\"android/security/identity/AlreadyPersonalizedException\" since=\"30\">\n\t\t<extends name=\"android/security/identity/IdentityCredentialException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/security/identity/CipherSuiteNotSupportedException\" since=\"30\">\n\t\t<extends name=\"android/security/identity/IdentityCredentialException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/security/identity/DocTypeNotSupportedException\" since=\"30\">\n\t\t<extends name=\"android/security/identity/IdentityCredentialException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/security/identity/EphemeralPublicKeyNotFoundException\" since=\"30\">\n\t\t<extends name=\"android/security/identity/IdentityCredentialException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/security/identity/IdentityCredential\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createEphemeralKeyPair()Ljava/security/KeyPair;\"/>\n\t\t<method name=\"decryptMessageFromReader([B)[B\"/>\n\t\t<method name=\"encryptMessageToReader([B)[B\"/>\n\t\t<method name=\"getAuthKeysNeedingCertification()Ljava/util/Collection;\"/>\n\t\t<method name=\"getAuthenticationDataUsageCount()[I\"/>\n\t\t<method name=\"getCredentialKeyCertificateChain()Ljava/util/Collection;\"/>\n\t\t<method name=\"getEntries([BLjava/util/Map;[B[B)Landroid/security/identity/ResultData;\"/>\n\t\t<method name=\"setAllowUsingExhaustedKeys(Z)V\"/>\n\t\t<method name=\"setAvailableAuthenticationKeys(II)V\"/>\n\t\t<method name=\"setReaderEphemeralPublicKey(Ljava/security/PublicKey;)V\"/>\n\t\t<method name=\"storeStaticAuthenticationData(Ljava/security/cert/X509Certificate;[B)V\"/>\n\t</class>\n\t<class name=\"android/security/identity/IdentityCredentialException\" since=\"30\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/security/identity/IdentityCredentialStore\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createCredential(Ljava/lang/String;Ljava/lang/String;)Landroid/security/identity/WritableIdentityCredential;\"/>\n\t\t<method name=\"deleteCredentialByName(Ljava/lang/String;)[B\"/>\n\t\t<method name=\"getCredentialByName(Ljava/lang/String;I)Landroid/security/identity/IdentityCredential;\"/>\n\t\t<method name=\"getDirectAccessInstance(Landroid/content/Context;)Landroid/security/identity/IdentityCredentialStore;\"/>\n\t\t<method name=\"getInstance(Landroid/content/Context;)Landroid/security/identity/IdentityCredentialStore;\"/>\n\t\t<method name=\"getSupportedDocTypes()[Ljava/lang/String;\"/>\n\t\t<field name=\"CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256\"/>\n\t</class>\n\t<class name=\"android/security/identity/InvalidReaderSignatureException\" since=\"30\">\n\t\t<extends name=\"android/security/identity/IdentityCredentialException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/security/identity/InvalidRequestMessageException\" since=\"30\">\n\t\t<extends name=\"android/security/identity/IdentityCredentialException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/security/identity/MessageDecryptionException\" since=\"30\">\n\t\t<extends name=\"android/security/identity/IdentityCredentialException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/security/identity/NoAuthenticationKeyAvailableException\" since=\"30\">\n\t\t<extends name=\"android/security/identity/IdentityCredentialException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/security/identity/PersonalizationData\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/security/identity/PersonalizationData$Builder\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addAccessControlProfile(Landroid/security/identity/AccessControlProfile;)Landroid/security/identity/PersonalizationData$Builder;\"/>\n\t\t<method name=\"build()Landroid/security/identity/PersonalizationData;\"/>\n\t\t<method name=\"putEntry(Ljava/lang/String;Ljava/lang/String;Ljava/util/Collection;[B)Landroid/security/identity/PersonalizationData$Builder;\"/>\n\t</class>\n\t<class name=\"android/security/identity/ResultData\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAuthenticatedData()[B\"/>\n\t\t<method name=\"getEntry(Ljava/lang/String;Ljava/lang/String;)[B\"/>\n\t\t<method name=\"getEntryNames(Ljava/lang/String;)Ljava/util/Collection;\"/>\n\t\t<method name=\"getMessageAuthenticationCode()[B\"/>\n\t\t<method name=\"getNamespaces()Ljava/util/Collection;\"/>\n\t\t<method name=\"getRetrievedEntryNames(Ljava/lang/String;)Ljava/util/Collection;\"/>\n\t\t<method name=\"getStaticAuthenticationData()[B\"/>\n\t\t<method name=\"getStatus(Ljava/lang/String;Ljava/lang/String;)I\"/>\n\t\t<field name=\"STATUS_NOT_IN_REQUEST_MESSAGE\"/>\n\t\t<field name=\"STATUS_NOT_REQUESTED\"/>\n\t\t<field name=\"STATUS_NO_ACCESS_CONTROL_PROFILES\"/>\n\t\t<field name=\"STATUS_NO_SUCH_ENTRY\"/>\n\t\t<field name=\"STATUS_OK\"/>\n\t\t<field name=\"STATUS_READER_AUTHENTICATION_FAILED\"/>\n\t\t<field name=\"STATUS_USER_AUTHENTICATION_FAILED\"/>\n\t</class>\n\t<class name=\"android/security/identity/SessionTranscriptMismatchException\" since=\"30\">\n\t\t<extends name=\"android/security/identity/IdentityCredentialException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/security/identity/UnknownAuthenticationKeyException\" since=\"30\">\n\t\t<extends name=\"android/security/identity/IdentityCredentialException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/security/identity/WritableIdentityCredential\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getCredentialKeyCertificateChain([B)Ljava/util/Collection;\"/>\n\t\t<method name=\"personalize(Landroid/security/identity/PersonalizationData;)[B\"/>\n\t</class>\n\t<class name=\"android/security/keystore/KeyExpiredException\" since=\"23\">\n\t\t<extends name=\"java/security/InvalidKeyException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/security/keystore/KeyGenParameterSpec\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/AlgorithmParameterSpec\"/>\n\t\t<method name=\"getAlgorithmParameterSpec()Ljava/security/spec/AlgorithmParameterSpec;\"/>\n\t\t<method name=\"getAttestationChallenge()[B\" since=\"24\"/>\n\t\t<method name=\"getBlockModes()[Ljava/lang/String;\"/>\n\t\t<method name=\"getCertificateNotAfter()Ljava/util/Date;\"/>\n\t\t<method name=\"getCertificateNotBefore()Ljava/util/Date;\"/>\n\t\t<method name=\"getCertificateSerialNumber()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getCertificateSubject()Ljavax/security/auth/x500/X500Principal;\"/>\n\t\t<method name=\"getDigests()[Ljava/lang/String;\"/>\n\t\t<method name=\"getEncryptionPaddings()[Ljava/lang/String;\"/>\n\t\t<method name=\"getKeySize()I\"/>\n\t\t<method name=\"getKeyValidityForConsumptionEnd()Ljava/util/Date;\"/>\n\t\t<method name=\"getKeyValidityForOriginationEnd()Ljava/util/Date;\"/>\n\t\t<method name=\"getKeyValidityStart()Ljava/util/Date;\"/>\n\t\t<method name=\"getKeystoreAlias()Ljava/lang/String;\"/>\n\t\t<method name=\"getPurposes()I\"/>\n\t\t<method name=\"getSignaturePaddings()[Ljava/lang/String;\"/>\n\t\t<method name=\"getUserAuthenticationValidityDurationSeconds()I\"/>\n\t\t<method name=\"isDevicePropertiesAttestationIncluded()Z\" since=\"30\"/>\n\t\t<method name=\"isDigestsSpecified()Z\"/>\n\t\t<method name=\"isInvalidatedByBiometricEnrollment()Z\" since=\"24\"/>\n\t\t<method name=\"isRandomizedEncryptionRequired()Z\"/>\n\t\t<method name=\"isStrongBoxBacked()Z\" since=\"28\"/>\n\t\t<method name=\"isUnlockedDeviceRequired()Z\" since=\"28\"/>\n\t\t<method name=\"isUserAuthenticationRequired()Z\"/>\n\t\t<method name=\"isUserAuthenticationValidWhileOnBody()Z\" since=\"24\"/>\n\t\t<method name=\"isUserConfirmationRequired()Z\" since=\"28\"/>\n\t\t<method name=\"isUserPresenceRequired()Z\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/security/keystore/KeyGenParameterSpec$Builder\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"build()Landroid/security/keystore/KeyGenParameterSpec;\"/>\n\t\t<method name=\"setAlgorithmParameterSpec(Ljava/security/spec/AlgorithmParameterSpec;)Landroid/security/keystore/KeyGenParameterSpec$Builder;\"/>\n\t\t<method name=\"setAttestationChallenge([B)Landroid/security/keystore/KeyGenParameterSpec$Builder;\" since=\"24\"/>\n\t\t<method name=\"setBlockModes([Ljava/lang/String;)Landroid/security/keystore/KeyGenParameterSpec$Builder;\"/>\n\t\t<method name=\"setCertificateNotAfter(Ljava/util/Date;)Landroid/security/keystore/KeyGenParameterSpec$Builder;\"/>\n\t\t<method name=\"setCertificateNotBefore(Ljava/util/Date;)Landroid/security/keystore/KeyGenParameterSpec$Builder;\"/>\n\t\t<method name=\"setCertificateSerialNumber(Ljava/math/BigInteger;)Landroid/security/keystore/KeyGenParameterSpec$Builder;\"/>\n\t\t<method name=\"setCertificateSubject(Ljavax/security/auth/x500/X500Principal;)Landroid/security/keystore/KeyGenParameterSpec$Builder;\"/>\n\t\t<method name=\"setDevicePropertiesAttestationIncluded(Z)Landroid/security/keystore/KeyGenParameterSpec$Builder;\" since=\"30\"/>\n\t\t<method name=\"setDigests([Ljava/lang/String;)Landroid/security/keystore/KeyGenParameterSpec$Builder;\"/>\n\t\t<method name=\"setEncryptionPaddings([Ljava/lang/String;)Landroid/security/keystore/KeyGenParameterSpec$Builder;\"/>\n\t\t<method name=\"setInvalidatedByBiometricEnrollment(Z)Landroid/security/keystore/KeyGenParameterSpec$Builder;\" since=\"24\"/>\n\t\t<method name=\"setIsStrongBoxBacked(Z)Landroid/security/keystore/KeyGenParameterSpec$Builder;\" since=\"28\"/>\n\t\t<method name=\"setKeySize(I)Landroid/security/keystore/KeyGenParameterSpec$Builder;\"/>\n\t\t<method name=\"setKeyValidityEnd(Ljava/util/Date;)Landroid/security/keystore/KeyGenParameterSpec$Builder;\"/>\n\t\t<method name=\"setKeyValidityForConsumptionEnd(Ljava/util/Date;)Landroid/security/keystore/KeyGenParameterSpec$Builder;\"/>\n\t\t<method name=\"setKeyValidityForOriginationEnd(Ljava/util/Date;)Landroid/security/keystore/KeyGenParameterSpec$Builder;\"/>\n\t\t<method name=\"setKeyValidityStart(Ljava/util/Date;)Landroid/security/keystore/KeyGenParameterSpec$Builder;\"/>\n\t\t<method name=\"setRandomizedEncryptionRequired(Z)Landroid/security/keystore/KeyGenParameterSpec$Builder;\"/>\n\t\t<method name=\"setSignaturePaddings([Ljava/lang/String;)Landroid/security/keystore/KeyGenParameterSpec$Builder;\"/>\n\t\t<method name=\"setUnlockedDeviceRequired(Z)Landroid/security/keystore/KeyGenParameterSpec$Builder;\" since=\"28\"/>\n\t\t<method name=\"setUserAuthenticationRequired(Z)Landroid/security/keystore/KeyGenParameterSpec$Builder;\"/>\n\t\t<method name=\"setUserAuthenticationValidWhileOnBody(Z)Landroid/security/keystore/KeyGenParameterSpec$Builder;\" since=\"24\"/>\n\t\t<method name=\"setUserAuthenticationValidityDurationSeconds(I)Landroid/security/keystore/KeyGenParameterSpec$Builder;\"/>\n\t\t<method name=\"setUserConfirmationRequired(Z)Landroid/security/keystore/KeyGenParameterSpec$Builder;\" since=\"28\"/>\n\t\t<method name=\"setUserPresenceRequired(Z)Landroid/security/keystore/KeyGenParameterSpec$Builder;\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/security/keystore/KeyInfo\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/KeySpec\"/>\n\t\t<method name=\"getBlockModes()[Ljava/lang/String;\"/>\n\t\t<method name=\"getDigests()[Ljava/lang/String;\"/>\n\t\t<method name=\"getEncryptionPaddings()[Ljava/lang/String;\"/>\n\t\t<method name=\"getKeySize()I\"/>\n\t\t<method name=\"getKeyValidityForConsumptionEnd()Ljava/util/Date;\"/>\n\t\t<method name=\"getKeyValidityForOriginationEnd()Ljava/util/Date;\"/>\n\t\t<method name=\"getKeyValidityStart()Ljava/util/Date;\"/>\n\t\t<method name=\"getKeystoreAlias()Ljava/lang/String;\"/>\n\t\t<method name=\"getOrigin()I\"/>\n\t\t<method name=\"getPurposes()I\"/>\n\t\t<method name=\"getSignaturePaddings()[Ljava/lang/String;\"/>\n\t\t<method name=\"getUserAuthenticationValidityDurationSeconds()I\"/>\n\t\t<method name=\"isInsideSecureHardware()Z\"/>\n\t\t<method name=\"isInvalidatedByBiometricEnrollment()Z\" since=\"24\"/>\n\t\t<method name=\"isTrustedUserPresenceRequired()Z\" since=\"28\"/>\n\t\t<method name=\"isUserAuthenticationRequired()Z\"/>\n\t\t<method name=\"isUserAuthenticationRequirementEnforcedBySecureHardware()Z\"/>\n\t\t<method name=\"isUserAuthenticationValidWhileOnBody()Z\" since=\"24\"/>\n\t\t<method name=\"isUserConfirmationRequired()Z\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/security/keystore/KeyNotYetValidException\" since=\"23\">\n\t\t<extends name=\"java/security/InvalidKeyException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/security/keystore/KeyPermanentlyInvalidatedException\" since=\"23\">\n\t\t<extends name=\"java/security/InvalidKeyException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/security/keystore/KeyProperties\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"BLOCK_MODE_CBC\"/>\n\t\t<field name=\"BLOCK_MODE_CTR\"/>\n\t\t<field name=\"BLOCK_MODE_ECB\"/>\n\t\t<field name=\"BLOCK_MODE_GCM\"/>\n\t\t<field name=\"DIGEST_MD5\"/>\n\t\t<field name=\"DIGEST_NONE\"/>\n\t\t<field name=\"DIGEST_SHA1\"/>\n\t\t<field name=\"DIGEST_SHA224\"/>\n\t\t<field name=\"DIGEST_SHA256\"/>\n\t\t<field name=\"DIGEST_SHA384\"/>\n\t\t<field name=\"DIGEST_SHA512\"/>\n\t\t<field name=\"ENCRYPTION_PADDING_NONE\"/>\n\t\t<field name=\"ENCRYPTION_PADDING_PKCS7\"/>\n\t\t<field name=\"ENCRYPTION_PADDING_RSA_OAEP\"/>\n\t\t<field name=\"ENCRYPTION_PADDING_RSA_PKCS1\"/>\n\t\t<field name=\"KEY_ALGORITHM_3DES\" since=\"28\" deprecated=\"28\"/>\n\t\t<field name=\"KEY_ALGORITHM_AES\"/>\n\t\t<field name=\"KEY_ALGORITHM_EC\"/>\n\t\t<field name=\"KEY_ALGORITHM_HMAC_SHA1\"/>\n\t\t<field name=\"KEY_ALGORITHM_HMAC_SHA224\"/>\n\t\t<field name=\"KEY_ALGORITHM_HMAC_SHA256\"/>\n\t\t<field name=\"KEY_ALGORITHM_HMAC_SHA384\"/>\n\t\t<field name=\"KEY_ALGORITHM_HMAC_SHA512\"/>\n\t\t<field name=\"KEY_ALGORITHM_RSA\"/>\n\t\t<field name=\"ORIGIN_GENERATED\"/>\n\t\t<field name=\"ORIGIN_IMPORTED\"/>\n\t\t<field name=\"ORIGIN_SECURELY_IMPORTED\" since=\"28\"/>\n\t\t<field name=\"ORIGIN_UNKNOWN\"/>\n\t\t<field name=\"PURPOSE_DECRYPT\"/>\n\t\t<field name=\"PURPOSE_ENCRYPT\"/>\n\t\t<field name=\"PURPOSE_SIGN\"/>\n\t\t<field name=\"PURPOSE_VERIFY\"/>\n\t\t<field name=\"PURPOSE_WRAP_KEY\" since=\"28\"/>\n\t\t<field name=\"SIGNATURE_PADDING_RSA_PKCS1\"/>\n\t\t<field name=\"SIGNATURE_PADDING_RSA_PSS\"/>\n\t</class>\n\t<class name=\"android/security/keystore/KeyProtection\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/KeyStore$ProtectionParameter\"/>\n\t\t<method name=\"getBlockModes()[Ljava/lang/String;\"/>\n\t\t<method name=\"getDigests()[Ljava/lang/String;\"/>\n\t\t<method name=\"getEncryptionPaddings()[Ljava/lang/String;\"/>\n\t\t<method name=\"getKeyValidityForConsumptionEnd()Ljava/util/Date;\"/>\n\t\t<method name=\"getKeyValidityForOriginationEnd()Ljava/util/Date;\"/>\n\t\t<method name=\"getKeyValidityStart()Ljava/util/Date;\"/>\n\t\t<method name=\"getPurposes()I\"/>\n\t\t<method name=\"getSignaturePaddings()[Ljava/lang/String;\"/>\n\t\t<method name=\"getUserAuthenticationValidityDurationSeconds()I\"/>\n\t\t<method name=\"isDigestsSpecified()Z\"/>\n\t\t<method name=\"isInvalidatedByBiometricEnrollment()Z\" since=\"24\"/>\n\t\t<method name=\"isRandomizedEncryptionRequired()Z\"/>\n\t\t<method name=\"isUnlockedDeviceRequired()Z\" since=\"28\"/>\n\t\t<method name=\"isUserAuthenticationRequired()Z\"/>\n\t\t<method name=\"isUserAuthenticationValidWhileOnBody()Z\" since=\"24\"/>\n\t\t<method name=\"isUserConfirmationRequired()Z\" since=\"28\"/>\n\t\t<method name=\"isUserPresenceRequired()Z\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/security/keystore/KeyProtection$Builder\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"build()Landroid/security/keystore/KeyProtection;\"/>\n\t\t<method name=\"setBlockModes([Ljava/lang/String;)Landroid/security/keystore/KeyProtection$Builder;\"/>\n\t\t<method name=\"setDigests([Ljava/lang/String;)Landroid/security/keystore/KeyProtection$Builder;\"/>\n\t\t<method name=\"setEncryptionPaddings([Ljava/lang/String;)Landroid/security/keystore/KeyProtection$Builder;\"/>\n\t\t<method name=\"setInvalidatedByBiometricEnrollment(Z)Landroid/security/keystore/KeyProtection$Builder;\" since=\"24\"/>\n\t\t<method name=\"setKeyValidityEnd(Ljava/util/Date;)Landroid/security/keystore/KeyProtection$Builder;\"/>\n\t\t<method name=\"setKeyValidityForConsumptionEnd(Ljava/util/Date;)Landroid/security/keystore/KeyProtection$Builder;\"/>\n\t\t<method name=\"setKeyValidityForOriginationEnd(Ljava/util/Date;)Landroid/security/keystore/KeyProtection$Builder;\"/>\n\t\t<method name=\"setKeyValidityStart(Ljava/util/Date;)Landroid/security/keystore/KeyProtection$Builder;\"/>\n\t\t<method name=\"setRandomizedEncryptionRequired(Z)Landroid/security/keystore/KeyProtection$Builder;\"/>\n\t\t<method name=\"setSignaturePaddings([Ljava/lang/String;)Landroid/security/keystore/KeyProtection$Builder;\"/>\n\t\t<method name=\"setUnlockedDeviceRequired(Z)Landroid/security/keystore/KeyProtection$Builder;\" since=\"28\"/>\n\t\t<method name=\"setUserAuthenticationRequired(Z)Landroid/security/keystore/KeyProtection$Builder;\"/>\n\t\t<method name=\"setUserAuthenticationValidWhileOnBody(Z)Landroid/security/keystore/KeyProtection$Builder;\" since=\"24\"/>\n\t\t<method name=\"setUserAuthenticationValidityDurationSeconds(I)Landroid/security/keystore/KeyProtection$Builder;\"/>\n\t\t<method name=\"setUserConfirmationRequired(Z)Landroid/security/keystore/KeyProtection$Builder;\" since=\"28\"/>\n\t\t<method name=\"setUserPresenceRequired(Z)Landroid/security/keystore/KeyProtection$Builder;\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/security/keystore/SecureKeyImportUnavailableException\" since=\"28\">\n\t\t<extends name=\"java/security/ProviderException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/security/keystore/StrongBoxUnavailableException\" since=\"28\">\n\t\t<extends name=\"java/security/ProviderException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/security/keystore/UserNotAuthenticatedException\" since=\"23\">\n\t\t<extends name=\"java/security/InvalidKeyException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/security/keystore/UserPresenceUnavailableException\" since=\"28\">\n\t\t<extends name=\"java/security/InvalidKeyException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/security/keystore/WrappedKeyEntry\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/KeyStore$Entry\"/>\n\t\t<method name=\"&lt;init>([BLjava/lang/String;Ljava/lang/String;Ljava/security/spec/AlgorithmParameterSpec;)V\"/>\n\t\t<method name=\"getAlgorithmParameterSpec()Ljava/security/spec/AlgorithmParameterSpec;\"/>\n\t\t<method name=\"getTransformation()Ljava/lang/String;\"/>\n\t\t<method name=\"getWrappedKeyBytes()[B\"/>\n\t\t<method name=\"getWrappingKeyAlias()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/service/autofill/AutofillService\" since=\"26\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getFillEventHistory()Landroid/service/autofill/FillEventHistory;\"/>\n\t\t<method name=\"onConnected()V\"/>\n\t\t<method name=\"onDisconnected()V\"/>\n\t\t<method name=\"onFillRequest(Landroid/service/autofill/FillRequest;Landroid/os/CancellationSignal;Landroid/service/autofill/FillCallback;)V\"/>\n\t\t<method name=\"onSaveRequest(Landroid/service/autofill/SaveRequest;Landroid/service/autofill/SaveCallback;)V\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t\t<field name=\"SERVICE_META_DATA\"/>\n\t</class>\n\t<class name=\"android/service/autofill/BatchUpdates\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/service/autofill/BatchUpdates$Builder\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/service/autofill/BatchUpdates;\"/>\n\t\t<method name=\"transformChild(ILandroid/service/autofill/Transformation;)Landroid/service/autofill/BatchUpdates$Builder;\"/>\n\t\t<method name=\"updateTemplate(Landroid/widget/RemoteViews;)Landroid/service/autofill/BatchUpdates$Builder;\"/>\n\t</class>\n\t<class name=\"android/service/autofill/CharSequenceTransformation\" since=\"27\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"android/service/autofill/Transformation\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/service/autofill/CharSequenceTransformation$Builder\" since=\"27\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/autofill/AutofillId;Ljava/util/regex/Pattern;Ljava/lang/String;)V\"/>\n\t\t<method name=\"addField(Landroid/view/autofill/AutofillId;Ljava/util/regex/Pattern;Ljava/lang/String;)Landroid/service/autofill/CharSequenceTransformation$Builder;\"/>\n\t\t<method name=\"build()Landroid/service/autofill/CharSequenceTransformation;\"/>\n\t</class>\n\t<class name=\"android/service/autofill/CustomDescription\" since=\"27\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/service/autofill/CustomDescription$Builder\" since=\"27\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/widget/RemoteViews;)V\"/>\n\t\t<method name=\"addChild(ILandroid/service/autofill/Transformation;)Landroid/service/autofill/CustomDescription$Builder;\"/>\n\t\t<method name=\"addOnClickAction(ILandroid/service/autofill/OnClickAction;)Landroid/service/autofill/CustomDescription$Builder;\" since=\"29\"/>\n\t\t<method name=\"batchUpdate(Landroid/service/autofill/Validator;Landroid/service/autofill/BatchUpdates;)Landroid/service/autofill/CustomDescription$Builder;\" since=\"28\"/>\n\t\t<method name=\"build()Landroid/service/autofill/CustomDescription;\"/>\n\t</class>\n\t<class name=\"android/service/autofill/Dataset\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/service/autofill/Dataset$Builder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/widget/RemoteViews;)V\"/>\n\t\t<method name=\"build()Landroid/service/autofill/Dataset;\"/>\n\t\t<method name=\"setAuthentication(Landroid/content/IntentSender;)Landroid/service/autofill/Dataset$Builder;\"/>\n\t\t<method name=\"setId(Ljava/lang/String;)Landroid/service/autofill/Dataset$Builder;\"/>\n\t\t<method name=\"setValue(Landroid/view/autofill/AutofillId;Landroid/view/autofill/AutofillValue;)Landroid/service/autofill/Dataset$Builder;\"/>\n\t\t<method name=\"setValue(Landroid/view/autofill/AutofillId;Landroid/view/autofill/AutofillValue;Landroid/widget/RemoteViews;)Landroid/service/autofill/Dataset$Builder;\"/>\n\t\t<method name=\"setValue(Landroid/view/autofill/AutofillId;Landroid/view/autofill/AutofillValue;Ljava/util/regex/Pattern;)Landroid/service/autofill/Dataset$Builder;\" since=\"28\"/>\n\t\t<method name=\"setValue(Landroid/view/autofill/AutofillId;Landroid/view/autofill/AutofillValue;Ljava/util/regex/Pattern;Landroid/widget/RemoteViews;)Landroid/service/autofill/Dataset$Builder;\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/service/autofill/DateTransformation\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"android/service/autofill/Transformation\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/autofill/AutofillId;Landroid/icu/text/DateFormat;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/service/autofill/DateValueSanitizer\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"android/service/autofill/Sanitizer\"/>\n\t\t<method name=\"&lt;init>(Landroid/icu/text/DateFormat;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/service/autofill/FieldClassification\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getMatches()Ljava/util/List;\"/>\n\t</class>\n\t<class name=\"android/service/autofill/FieldClassification$Match\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getCategoryId()Ljava/lang/String;\"/>\n\t\t<method name=\"getScore()F\"/>\n\t</class>\n\t<class name=\"android/service/autofill/FillCallback\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onFailure(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"onSuccess(Landroid/service/autofill/FillResponse;)V\"/>\n\t</class>\n\t<class name=\"android/service/autofill/FillContext\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getFocusedId()Landroid/view/autofill/AutofillId;\" since=\"29\"/>\n\t\t<method name=\"getRequestId()I\"/>\n\t\t<method name=\"getStructure()Landroid/app/assist/AssistStructure;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/service/autofill/FillEventHistory\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getClientState()Landroid/os/Bundle;\" deprecated=\"28\"/>\n\t\t<method name=\"getEvents()Ljava/util/List;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/service/autofill/FillEventHistory$Event\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getChangedFields()Ljava/util/Map;\" since=\"28\"/>\n\t\t<method name=\"getClientState()Landroid/os/Bundle;\" since=\"28\"/>\n\t\t<method name=\"getDatasetId()Ljava/lang/String;\"/>\n\t\t<method name=\"getFieldsClassification()Ljava/util/Map;\" since=\"28\"/>\n\t\t<method name=\"getIgnoredDatasetIds()Ljava/util/Set;\" since=\"28\"/>\n\t\t<method name=\"getManuallyEnteredField()Ljava/util/Map;\" since=\"28\"/>\n\t\t<method name=\"getSelectedDatasetIds()Ljava/util/Set;\" since=\"28\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<field name=\"TYPE_AUTHENTICATION_SELECTED\"/>\n\t\t<field name=\"TYPE_CONTEXT_COMMITTED\" since=\"28\"/>\n\t\t<field name=\"TYPE_DATASET_AUTHENTICATION_SELECTED\"/>\n\t\t<field name=\"TYPE_DATASET_SELECTED\"/>\n\t\t<field name=\"TYPE_SAVE_SHOWN\"/>\n\t</class>\n\t<class name=\"android/service/autofill/FillRequest\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getClientState()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getFillContexts()Ljava/util/List;\"/>\n\t\t<method name=\"getFlags()I\"/>\n\t\t<method name=\"getId()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FLAG_COMPATIBILITY_MODE_REQUEST\" since=\"29\"/>\n\t\t<field name=\"FLAG_MANUAL_REQUEST\"/>\n\t</class>\n\t<class name=\"android/service/autofill/FillResponse\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FLAG_DISABLE_ACTIVITY_ONLY\" since=\"28\"/>\n\t\t<field name=\"FLAG_TRACK_CONTEXT_COMMITED\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/service/autofill/FillResponse$Builder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addDataset(Landroid/service/autofill/Dataset;)Landroid/service/autofill/FillResponse$Builder;\"/>\n\t\t<method name=\"build()Landroid/service/autofill/FillResponse;\"/>\n\t\t<method name=\"disableAutofill(J)Landroid/service/autofill/FillResponse$Builder;\" since=\"28\"/>\n\t\t<method name=\"setAuthentication([Landroid/view/autofill/AutofillId;Landroid/content/IntentSender;Landroid/widget/RemoteViews;)Landroid/service/autofill/FillResponse$Builder;\"/>\n\t\t<method name=\"setClientState(Landroid/os/Bundle;)Landroid/service/autofill/FillResponse$Builder;\"/>\n\t\t<method name=\"setFieldClassificationIds([Landroid/view/autofill/AutofillId;)Landroid/service/autofill/FillResponse$Builder;\" since=\"28\"/>\n\t\t<method name=\"setFlags(I)Landroid/service/autofill/FillResponse$Builder;\" since=\"28\"/>\n\t\t<method name=\"setFooter(Landroid/widget/RemoteViews;)Landroid/service/autofill/FillResponse$Builder;\" since=\"28\"/>\n\t\t<method name=\"setHeader(Landroid/widget/RemoteViews;)Landroid/service/autofill/FillResponse$Builder;\" since=\"28\"/>\n\t\t<method name=\"setIgnoredIds([Landroid/view/autofill/AutofillId;)Landroid/service/autofill/FillResponse$Builder;\"/>\n\t\t<method name=\"setSaveInfo(Landroid/service/autofill/SaveInfo;)Landroid/service/autofill/FillResponse$Builder;\"/>\n\t\t<method name=\"setUserData(Landroid/service/autofill/UserData;)Landroid/service/autofill/FillResponse$Builder;\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/service/autofill/ImageTransformation\" since=\"27\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"android/service/autofill/Transformation\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/service/autofill/ImageTransformation$Builder\" since=\"27\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/autofill/AutofillId;Ljava/util/regex/Pattern;I)V\" deprecated=\"28\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/autofill/AutofillId;Ljava/util/regex/Pattern;ILjava/lang/CharSequence;)V\" since=\"28\"/>\n\t\t<method name=\"addOption(Ljava/util/regex/Pattern;I)Landroid/service/autofill/ImageTransformation$Builder;\" deprecated=\"28\"/>\n\t\t<method name=\"addOption(Ljava/util/regex/Pattern;ILjava/lang/CharSequence;)Landroid/service/autofill/ImageTransformation$Builder;\" since=\"28\"/>\n\t\t<method name=\"build()Landroid/service/autofill/ImageTransformation;\"/>\n\t</class>\n\t<class name=\"android/service/autofill/LuhnChecksumValidator\" since=\"27\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"android/service/autofill/Validator\"/>\n\t\t<method name=\"&lt;init>([Landroid/view/autofill/AutofillId;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/service/autofill/OnClickAction\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/service/autofill/RegexValidator\" since=\"27\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"android/service/autofill/Validator\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/autofill/AutofillId;Ljava/util/regex/Pattern;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/service/autofill/Sanitizer\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/service/autofill/SaveCallback\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onFailure(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"onSuccess()V\"/>\n\t\t<method name=\"onSuccess(Landroid/content/IntentSender;)V\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/service/autofill/SaveInfo\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FLAG_DELAY_SAVE\" since=\"29\"/>\n\t\t<field name=\"FLAG_DONT_SAVE_ON_FINISH\" since=\"28\"/>\n\t\t<field name=\"FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE\"/>\n\t\t<field name=\"NEGATIVE_BUTTON_STYLE_CANCEL\"/>\n\t\t<field name=\"NEGATIVE_BUTTON_STYLE_REJECT\"/>\n\t\t<field name=\"SAVE_DATA_TYPE_ADDRESS\"/>\n\t\t<field name=\"SAVE_DATA_TYPE_CREDIT_CARD\"/>\n\t\t<field name=\"SAVE_DATA_TYPE_EMAIL_ADDRESS\"/>\n\t\t<field name=\"SAVE_DATA_TYPE_GENERIC\"/>\n\t\t<field name=\"SAVE_DATA_TYPE_PASSWORD\"/>\n\t\t<field name=\"SAVE_DATA_TYPE_USERNAME\"/>\n\t</class>\n\t<class name=\"android/service/autofill/SaveInfo$Builder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\" since=\"27\"/>\n\t\t<method name=\"&lt;init>(I[Landroid/view/autofill/AutofillId;)V\"/>\n\t\t<method name=\"addSanitizer(Landroid/service/autofill/Sanitizer;[Landroid/view/autofill/AutofillId;)Landroid/service/autofill/SaveInfo$Builder;\" since=\"28\"/>\n\t\t<method name=\"build()Landroid/service/autofill/SaveInfo;\"/>\n\t\t<method name=\"setCustomDescription(Landroid/service/autofill/CustomDescription;)Landroid/service/autofill/SaveInfo$Builder;\" since=\"27\"/>\n\t\t<method name=\"setDescription(Ljava/lang/CharSequence;)Landroid/service/autofill/SaveInfo$Builder;\"/>\n\t\t<method name=\"setFlags(I)Landroid/service/autofill/SaveInfo$Builder;\"/>\n\t\t<method name=\"setNegativeAction(ILandroid/content/IntentSender;)Landroid/service/autofill/SaveInfo$Builder;\"/>\n\t\t<method name=\"setOptionalIds([Landroid/view/autofill/AutofillId;)Landroid/service/autofill/SaveInfo$Builder;\"/>\n\t\t<method name=\"setTriggerId(Landroid/view/autofill/AutofillId;)Landroid/service/autofill/SaveInfo$Builder;\" since=\"28\"/>\n\t\t<method name=\"setValidator(Landroid/service/autofill/Validator;)Landroid/service/autofill/SaveInfo$Builder;\" since=\"27\"/>\n\t</class>\n\t<class name=\"android/service/autofill/SaveRequest\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getClientState()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getDatasetIds()Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"getFillContexts()Ljava/util/List;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/service/autofill/TextValueSanitizer\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"android/service/autofill/Sanitizer\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/regex/Pattern;Ljava/lang/String;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/service/autofill/Transformation\" since=\"27\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/service/autofill/UserData\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getFieldClassificationAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getFieldClassificationAlgorithmForCategory(Ljava/lang/String;)Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\"/>\n\t\t<method name=\"getMaxCategoryCount()I\"/>\n\t\t<method name=\"getMaxFieldClassificationIdsSize()I\"/>\n\t\t<method name=\"getMaxUserDataSize()I\"/>\n\t\t<method name=\"getMaxValueLength()I\"/>\n\t\t<method name=\"getMinValueLength()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/service/autofill/UserData$Builder\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"add(Ljava/lang/String;Ljava/lang/String;)Landroid/service/autofill/UserData$Builder;\"/>\n\t\t<method name=\"build()Landroid/service/autofill/UserData;\"/>\n\t\t<method name=\"setFieldClassificationAlgorithm(Ljava/lang/String;Landroid/os/Bundle;)Landroid/service/autofill/UserData$Builder;\"/>\n\t\t<method name=\"setFieldClassificationAlgorithmForCategory(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/service/autofill/UserData$Builder;\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/service/autofill/Validator\" since=\"27\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/service/autofill/Validators\" since=\"27\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"and([Landroid/service/autofill/Validator;)Landroid/service/autofill/Validator;\"/>\n\t\t<method name=\"not(Landroid/service/autofill/Validator;)Landroid/service/autofill/Validator;\" since=\"28\"/>\n\t\t<method name=\"or([Landroid/service/autofill/Validator;)Landroid/service/autofill/Validator;\"/>\n\t</class>\n\t<class name=\"android/service/autofill/VisibilitySetterAction\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"android/service/autofill/OnClickAction\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/service/autofill/VisibilitySetterAction$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"build()Landroid/service/autofill/VisibilitySetterAction;\"/>\n\t\t<method name=\"setVisibility(II)Landroid/service/autofill/VisibilitySetterAction$Builder;\"/>\n\t</class>\n\t<class name=\"android/service/carrier/CarrierIdentifier\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)V\" since=\"29\"/>\n\t\t<method name=\"&lt;init>([BLjava/lang/String;Ljava/lang/String;)V\" since=\"28\"/>\n\t\t<method name=\"getCarrierId()I\" since=\"29\"/>\n\t\t<method name=\"getGid1()Ljava/lang/String;\"/>\n\t\t<method name=\"getGid2()Ljava/lang/String;\"/>\n\t\t<method name=\"getImsi()Ljava/lang/String;\"/>\n\t\t<method name=\"getMcc()Ljava/lang/String;\"/>\n\t\t<method name=\"getMnc()Ljava/lang/String;\"/>\n\t\t<method name=\"getSpecificCarrierId()I\" since=\"29\"/>\n\t\t<method name=\"getSpn()Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/service/carrier/CarrierMessagingClientService\" since=\"29\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/service/carrier/CarrierMessagingService\" since=\"22\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onDownloadMms(Landroid/net/Uri;ILandroid/net/Uri;Landroid/service/carrier/CarrierMessagingService$ResultCallback;)V\"/>\n\t\t<method name=\"onFilterSms(Landroid/service/carrier/MessagePdu;Ljava/lang/String;IILandroid/service/carrier/CarrierMessagingService$ResultCallback;)V\" deprecated=\"24\"/>\n\t\t<method name=\"onReceiveTextSms(Landroid/service/carrier/MessagePdu;Ljava/lang/String;IILandroid/service/carrier/CarrierMessagingService$ResultCallback;)V\" since=\"24\"/>\n\t\t<method name=\"onSendDataSms([BILjava/lang/String;IILandroid/service/carrier/CarrierMessagingService$ResultCallback;)V\" since=\"23\"/>\n\t\t<method name=\"onSendDataSms([BILjava/lang/String;ILandroid/service/carrier/CarrierMessagingService$ResultCallback;)V\" deprecated=\"23\"/>\n\t\t<method name=\"onSendMms(Landroid/net/Uri;ILandroid/net/Uri;Landroid/service/carrier/CarrierMessagingService$ResultCallback;)V\"/>\n\t\t<method name=\"onSendMultipartTextSms(Ljava/util/List;ILjava/lang/String;ILandroid/service/carrier/CarrierMessagingService$ResultCallback;)V\" since=\"23\"/>\n\t\t<method name=\"onSendMultipartTextSms(Ljava/util/List;ILjava/lang/String;Landroid/service/carrier/CarrierMessagingService$ResultCallback;)V\" deprecated=\"23\"/>\n\t\t<method name=\"onSendTextSms(Ljava/lang/String;ILjava/lang/String;ILandroid/service/carrier/CarrierMessagingService$ResultCallback;)V\" since=\"23\"/>\n\t\t<method name=\"onSendTextSms(Ljava/lang/String;ILjava/lang/String;Landroid/service/carrier/CarrierMessagingService$ResultCallback;)V\" deprecated=\"23\"/>\n\t\t<field name=\"DOWNLOAD_STATUS_ERROR\"/>\n\t\t<field name=\"DOWNLOAD_STATUS_OK\"/>\n\t\t<field name=\"DOWNLOAD_STATUS_RETRY_ON_CARRIER_NETWORK\"/>\n\t\t<field name=\"RECEIVE_OPTIONS_DEFAULT\" since=\"24\"/>\n\t\t<field name=\"RECEIVE_OPTIONS_DROP\" since=\"24\"/>\n\t\t<field name=\"RECEIVE_OPTIONS_SKIP_NOTIFY_WHEN_CREDENTIAL_PROTECTED_STORAGE_UNAVAILABLE\" since=\"24\"/>\n\t\t<field name=\"SEND_FLAG_REQUEST_DELIVERY_STATUS\" since=\"23\"/>\n\t\t<field name=\"SEND_STATUS_ERROR\"/>\n\t\t<field name=\"SEND_STATUS_OK\"/>\n\t\t<field name=\"SEND_STATUS_RETRY_ON_CARRIER_NETWORK\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t</class>\n\t<class name=\"android/service/carrier/CarrierMessagingService$ResultCallback\" since=\"22\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onReceiveResult(Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"android/service/carrier/CarrierMessagingService$SendMmsResult\" since=\"22\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I[B)V\"/>\n\t\t<method name=\"getSendConfPdu()[B\"/>\n\t\t<method name=\"getSendStatus()I\"/>\n\t</class>\n\t<class name=\"android/service/carrier/CarrierMessagingService$SendMultipartSmsResult\" since=\"22\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I[I)V\"/>\n\t\t<method name=\"getMessageRefs()[I\"/>\n\t\t<method name=\"getSendStatus()I\"/>\n\t</class>\n\t<class name=\"android/service/carrier/CarrierMessagingService$SendSmsResult\" since=\"22\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"getMessageRef()I\"/>\n\t\t<method name=\"getSendStatus()I\"/>\n\t</class>\n\t<class name=\"android/service/carrier/CarrierService\" since=\"23\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"notifyCarrierNetworkChange(Z)V\"/>\n\t\t<method name=\"onLoadConfig(Landroid/service/carrier/CarrierIdentifier;)Landroid/os/PersistableBundle;\"/>\n\t\t<field name=\"CARRIER_SERVICE_INTERFACE\"/>\n\t</class>\n\t<class name=\"android/service/carrier/MessagePdu\" since=\"22\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/List;)V\"/>\n\t\t<method name=\"getPdus()Ljava/util/List;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/service/chooser/ChooserTarget\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;Landroid/graphics/drawable/Icon;FLandroid/content/ComponentName;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"getComponentName()Landroid/content/ComponentName;\"/>\n\t\t<method name=\"getIcon()Landroid/graphics/drawable/Icon;\"/>\n\t\t<method name=\"getIntentExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getScore()F\"/>\n\t\t<method name=\"getTitle()Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/service/chooser/ChooserTargetService\" since=\"23\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onGetChooserTargets(Landroid/content/ComponentName;Landroid/content/IntentFilter;)Ljava/util/List;\"/>\n\t\t<field name=\"BIND_PERMISSION\"/>\n\t\t<field name=\"META_DATA_NAME\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t</class>\n\t<class name=\"android/service/dreams/DreamService\" since=\"17\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<implements name=\"android/view/Window$Callback\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"findViewById(I)Landroid/view/View;\"/>\n\t\t<method name=\"finish()V\"/>\n\t\t<method name=\"getWindow()Landroid/view/Window;\"/>\n\t\t<method name=\"getWindowManager()Landroid/view/WindowManager;\"/>\n\t\t<method name=\"isFullscreen()Z\"/>\n\t\t<method name=\"isInteractive()Z\"/>\n\t\t<method name=\"isScreenBright()Z\"/>\n\t\t<method name=\"onDreamingStarted()V\"/>\n\t\t<method name=\"onDreamingStopped()V\"/>\n\t\t<method name=\"onWakeUp()V\" since=\"21\"/>\n\t\t<method name=\"requireViewById(I)Landroid/view/View;\" since=\"28\"/>\n\t\t<method name=\"setContentView(I)V\"/>\n\t\t<method name=\"setContentView(Landroid/view/View;)V\"/>\n\t\t<method name=\"setContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"setFullscreen(Z)V\"/>\n\t\t<method name=\"setInteractive(Z)V\"/>\n\t\t<method name=\"setScreenBright(Z)V\"/>\n\t\t<method name=\"wakeUp()V\" since=\"21\"/>\n\t\t<field name=\"DREAM_META_DATA\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t</class>\n\t<class name=\"android/service/media/CameraPrewarmService\" since=\"23\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCooldown(Z)V\"/>\n\t\t<method name=\"onPrewarm()V\"/>\n\t</class>\n\t<class name=\"android/service/media/MediaBrowserService\" since=\"21\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getBrowserRootHints()Landroid/os/Bundle;\" since=\"24\"/>\n\t\t<method name=\"getCurrentBrowserInfo()Landroid/media/session/MediaSessionManager$RemoteUserInfo;\" since=\"28\"/>\n\t\t<method name=\"getSessionToken()Landroid/media/session/MediaSession$Token;\"/>\n\t\t<method name=\"notifyChildrenChanged(Ljava/lang/String;)V\"/>\n\t\t<method name=\"notifyChildrenChanged(Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"24\"/>\n\t\t<method name=\"onGetRoot(Ljava/lang/String;ILandroid/os/Bundle;)Landroid/service/media/MediaBrowserService$BrowserRoot;\"/>\n\t\t<method name=\"onLoadChildren(Ljava/lang/String;Landroid/service/media/MediaBrowserService$Result;)V\"/>\n\t\t<method name=\"onLoadChildren(Ljava/lang/String;Landroid/service/media/MediaBrowserService$Result;Landroid/os/Bundle;)V\" since=\"24\"/>\n\t\t<method name=\"onLoadItem(Ljava/lang/String;Landroid/service/media/MediaBrowserService$Result;)V\" since=\"23\"/>\n\t\t<method name=\"setSessionToken(Landroid/media/session/MediaSession$Token;)V\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t</class>\n\t<class name=\"android/service/media/MediaBrowserService$BrowserRoot\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getRootId()Ljava/lang/String;\"/>\n\t\t<field name=\"EXTRA_OFFLINE\" since=\"24\"/>\n\t\t<field name=\"EXTRA_RECENT\" since=\"24\"/>\n\t\t<field name=\"EXTRA_SUGGESTED\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/service/media/MediaBrowserService$Result\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"detach()V\"/>\n\t\t<method name=\"sendResult(Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"android/service/notification/Condition\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/Uri;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;III)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"copy()Landroid/service/notification/Condition;\"/>\n\t\t<method name=\"isValidId(Landroid/net/Uri;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"newId(Landroid/content/Context;)Landroid/net/Uri$Builder;\"/>\n\t\t<method name=\"relevanceToString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"stateToString(I)Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FLAG_RELEVANT_ALWAYS\"/>\n\t\t<field name=\"FLAG_RELEVANT_NOW\"/>\n\t\t<field name=\"SCHEME\"/>\n\t\t<field name=\"STATE_ERROR\"/>\n\t\t<field name=\"STATE_FALSE\"/>\n\t\t<field name=\"STATE_TRUE\"/>\n\t\t<field name=\"STATE_UNKNOWN\"/>\n\t\t<field name=\"flags\"/>\n\t\t<field name=\"icon\"/>\n\t\t<field name=\"id\"/>\n\t\t<field name=\"line1\"/>\n\t\t<field name=\"line2\"/>\n\t\t<field name=\"state\"/>\n\t\t<field name=\"summary\"/>\n\t</class>\n\t<class name=\"android/service/notification/ConditionProviderService\" since=\"24\" deprecated=\"29\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"notifyCondition(Landroid/service/notification/Condition;)V\" deprecated=\"29\"/>\n\t\t<method name=\"notifyConditions([Landroid/service/notification/Condition;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onConnected()V\" deprecated=\"29\"/>\n\t\t<method name=\"onRequestConditions(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"onSubscribe(Landroid/net/Uri;)V\" deprecated=\"29\"/>\n\t\t<method name=\"onUnsubscribe(Landroid/net/Uri;)V\" deprecated=\"29\"/>\n\t\t<method name=\"requestRebind(Landroid/content/ComponentName;)V\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"requestUnbind()V\" since=\"26\" deprecated=\"29\"/>\n\t\t<field name=\"EXTRA_RULE_ID\" deprecated=\"29\"/>\n\t\t<field name=\"META_DATA_CONFIGURATION_ACTIVITY\" deprecated=\"29\"/>\n\t\t<field name=\"META_DATA_RULE_INSTANCE_LIMIT\" deprecated=\"29\"/>\n\t\t<field name=\"META_DATA_RULE_TYPE\" deprecated=\"29\"/>\n\t\t<field name=\"SERVICE_INTERFACE\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/service/notification/NotificationListenerService\" since=\"18\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"cancelAllNotifications()V\"/>\n\t\t<method name=\"cancelNotification(Ljava/lang/String;)V\" since=\"21\"/>\n\t\t<method name=\"cancelNotification(Ljava/lang/String;Ljava/lang/String;I)V\" deprecated=\"21\"/>\n\t\t<method name=\"cancelNotifications([Ljava/lang/String;)V\" since=\"21\"/>\n\t\t<method name=\"clearRequestedListenerHints()V\" since=\"29\"/>\n\t\t<method name=\"getActiveNotifications()[Landroid/service/notification/StatusBarNotification;\"/>\n\t\t<method name=\"getActiveNotifications([Ljava/lang/String;)[Landroid/service/notification/StatusBarNotification;\" since=\"21\"/>\n\t\t<method name=\"getCurrentInterruptionFilter()I\" since=\"21\"/>\n\t\t<method name=\"getCurrentListenerHints()I\" since=\"21\"/>\n\t\t<method name=\"getCurrentRanking()Landroid/service/notification/NotificationListenerService$RankingMap;\" since=\"21\"/>\n\t\t<method name=\"getNotificationChannelGroups(Ljava/lang/String;Landroid/os/UserHandle;)Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"getNotificationChannels(Ljava/lang/String;Landroid/os/UserHandle;)Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"getSnoozedNotifications()[Landroid/service/notification/StatusBarNotification;\" since=\"26\"/>\n\t\t<method name=\"onInterruptionFilterChanged(I)V\" since=\"21\"/>\n\t\t<method name=\"onListenerConnected()V\" since=\"21\"/>\n\t\t<method name=\"onListenerDisconnected()V\" since=\"24\"/>\n\t\t<method name=\"onListenerHintsChanged(I)V\" since=\"21\"/>\n\t\t<method name=\"onNotificationChannelGroupModified(Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannelGroup;I)V\" since=\"26\"/>\n\t\t<method name=\"onNotificationChannelModified(Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannel;I)V\" since=\"26\"/>\n\t\t<method name=\"onNotificationPosted(Landroid/service/notification/StatusBarNotification;)V\"/>\n\t\t<method name=\"onNotificationPosted(Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationListenerService$RankingMap;)V\" since=\"21\"/>\n\t\t<method name=\"onNotificationRankingUpdate(Landroid/service/notification/NotificationListenerService$RankingMap;)V\" since=\"21\"/>\n\t\t<method name=\"onNotificationRemoved(Landroid/service/notification/StatusBarNotification;)V\"/>\n\t\t<method name=\"onNotificationRemoved(Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationListenerService$RankingMap;)V\" since=\"21\"/>\n\t\t<method name=\"onNotificationRemoved(Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationListenerService$RankingMap;I)V\" since=\"26\"/>\n\t\t<method name=\"onSilentStatusBarIconsVisibilityChanged(Z)V\" since=\"29\"/>\n\t\t<method name=\"requestInterruptionFilter(I)V\" since=\"21\"/>\n\t\t<method name=\"requestListenerHints(I)V\" since=\"21\"/>\n\t\t<method name=\"requestRebind(Landroid/content/ComponentName;)V\" since=\"24\"/>\n\t\t<method name=\"requestUnbind()V\" since=\"24\"/>\n\t\t<method name=\"setNotificationsShown([Ljava/lang/String;)V\" since=\"23\"/>\n\t\t<method name=\"snoozeNotification(Ljava/lang/String;J)V\" since=\"26\"/>\n\t\t<method name=\"updateNotificationChannel(Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannel;)V\" since=\"26\"/>\n\t\t<field name=\"HINT_HOST_DISABLE_CALL_EFFECTS\" since=\"24\"/>\n\t\t<field name=\"HINT_HOST_DISABLE_EFFECTS\" since=\"21\"/>\n\t\t<field name=\"HINT_HOST_DISABLE_NOTIFICATION_EFFECTS\" since=\"24\"/>\n\t\t<field name=\"INTERRUPTION_FILTER_ALARMS\" since=\"23\"/>\n\t\t<field name=\"INTERRUPTION_FILTER_ALL\" since=\"21\"/>\n\t\t<field name=\"INTERRUPTION_FILTER_NONE\" since=\"21\"/>\n\t\t<field name=\"INTERRUPTION_FILTER_PRIORITY\" since=\"21\"/>\n\t\t<field name=\"INTERRUPTION_FILTER_UNKNOWN\" since=\"23\"/>\n\t\t<field name=\"NOTIFICATION_CHANNEL_OR_GROUP_ADDED\" since=\"26\"/>\n\t\t<field name=\"NOTIFICATION_CHANNEL_OR_GROUP_DELETED\" since=\"26\"/>\n\t\t<field name=\"NOTIFICATION_CHANNEL_OR_GROUP_UPDATED\" since=\"26\"/>\n\t\t<field name=\"REASON_APP_CANCEL\" since=\"26\"/>\n\t\t<field name=\"REASON_APP_CANCEL_ALL\" since=\"26\"/>\n\t\t<field name=\"REASON_CANCEL\" since=\"26\"/>\n\t\t<field name=\"REASON_CANCEL_ALL\" since=\"26\"/>\n\t\t<field name=\"REASON_CHANNEL_BANNED\" since=\"26\"/>\n\t\t<field name=\"REASON_CLICK\" since=\"26\"/>\n\t\t<field name=\"REASON_ERROR\" since=\"26\"/>\n\t\t<field name=\"REASON_GROUP_OPTIMIZATION\" since=\"26\"/>\n\t\t<field name=\"REASON_GROUP_SUMMARY_CANCELED\" since=\"26\"/>\n\t\t<field name=\"REASON_LISTENER_CANCEL\" since=\"26\"/>\n\t\t<field name=\"REASON_LISTENER_CANCEL_ALL\" since=\"26\"/>\n\t\t<field name=\"REASON_PACKAGE_BANNED\" since=\"26\"/>\n\t\t<field name=\"REASON_PACKAGE_CHANGED\" since=\"26\"/>\n\t\t<field name=\"REASON_PACKAGE_SUSPENDED\" since=\"26\"/>\n\t\t<field name=\"REASON_PROFILE_TURNED_OFF\" since=\"26\"/>\n\t\t<field name=\"REASON_SNOOZED\" since=\"26\"/>\n\t\t<field name=\"REASON_TIMEOUT\" since=\"26\"/>\n\t\t<field name=\"REASON_UNAUTOBUNDLED\" since=\"26\"/>\n\t\t<field name=\"REASON_USER_STOPPED\" since=\"26\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t\t<field name=\"SUPPRESSED_EFFECT_SCREEN_OFF\" since=\"24\" deprecated=\"28\"/>\n\t\t<field name=\"SUPPRESSED_EFFECT_SCREEN_ON\" since=\"24\" deprecated=\"28\"/>\n\t</class>\n\t<class name=\"android/service/notification/NotificationListenerService$Ranking\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"canBubble()Z\" since=\"29\"/>\n\t\t<method name=\"canShowBadge()Z\" since=\"26\"/>\n\t\t<method name=\"getChannel()Landroid/app/NotificationChannel;\" since=\"26\"/>\n\t\t<method name=\"getImportance()I\" since=\"24\"/>\n\t\t<method name=\"getImportanceExplanation()Ljava/lang/CharSequence;\" since=\"24\"/>\n\t\t<method name=\"getKey()Ljava/lang/String;\"/>\n\t\t<method name=\"getLastAudiblyAlertedMillis()J\" since=\"29\"/>\n\t\t<method name=\"getOverrideGroupKey()Ljava/lang/String;\" since=\"24\"/>\n\t\t<method name=\"getRank()I\"/>\n\t\t<method name=\"getSmartActions()Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"getSmartReplies()Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"getSuppressedVisualEffects()I\" since=\"24\"/>\n\t\t<method name=\"getUserSentiment()I\" since=\"28\"/>\n\t\t<method name=\"isAmbient()Z\"/>\n\t\t<method name=\"isSuspended()Z\" since=\"28\"/>\n\t\t<method name=\"matchesInterruptionFilter()Z\"/>\n\t\t<field name=\"USER_SENTIMENT_NEGATIVE\" since=\"28\"/>\n\t\t<field name=\"USER_SENTIMENT_NEUTRAL\" since=\"28\"/>\n\t\t<field name=\"USER_SENTIMENT_POSITIVE\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/service/notification/NotificationListenerService$RankingMap\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getOrderedKeys()[Ljava/lang/String;\"/>\n\t\t<method name=\"getRanking(Ljava/lang/String;Landroid/service/notification/NotificationListenerService$Ranking;)Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/service/notification/StatusBarNotification\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;IIILandroid/app/Notification;Landroid/os/UserHandle;J)V\" deprecated=\"26\"/>\n\t\t<method name=\"clone()Landroid/service/notification/StatusBarNotification;\"/>\n\t\t<method name=\"getGroupKey()Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"getId()I\"/>\n\t\t<method name=\"getKey()Ljava/lang/String;\" since=\"20\"/>\n\t\t<method name=\"getNotification()Landroid/app/Notification;\"/>\n\t\t<method name=\"getOpPkg()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getOverrideGroupKey()Ljava/lang/String;\" since=\"24\"/>\n\t\t<method name=\"getPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getPostTime()J\"/>\n\t\t<method name=\"getTag()Ljava/lang/String;\"/>\n\t\t<method name=\"getUid()I\" since=\"29\"/>\n\t\t<method name=\"getUser()Landroid/os/UserHandle;\" since=\"21\"/>\n\t\t<method name=\"getUserId()I\" deprecated=\"21\"/>\n\t\t<method name=\"isClearable()Z\"/>\n\t\t<method name=\"isGroup()Z\" since=\"24\"/>\n\t\t<method name=\"isOngoing()Z\"/>\n\t\t<method name=\"setOverrideGroupKey(Ljava/lang/String;)V\" since=\"24\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/service/notification/ZenPolicy\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getPriorityCallSenders()I\"/>\n\t\t<method name=\"getPriorityCategoryAlarms()I\"/>\n\t\t<method name=\"getPriorityCategoryCalls()I\"/>\n\t\t<method name=\"getPriorityCategoryEvents()I\"/>\n\t\t<method name=\"getPriorityCategoryMedia()I\"/>\n\t\t<method name=\"getPriorityCategoryMessages()I\"/>\n\t\t<method name=\"getPriorityCategoryReminders()I\"/>\n\t\t<method name=\"getPriorityCategoryRepeatCallers()I\"/>\n\t\t<method name=\"getPriorityCategorySystem()I\"/>\n\t\t<method name=\"getPriorityMessageSenders()I\"/>\n\t\t<method name=\"getVisualEffectAmbient()I\"/>\n\t\t<method name=\"getVisualEffectBadge()I\"/>\n\t\t<method name=\"getVisualEffectFullScreenIntent()I\"/>\n\t\t<method name=\"getVisualEffectLights()I\"/>\n\t\t<method name=\"getVisualEffectNotificationList()I\"/>\n\t\t<method name=\"getVisualEffectPeek()I\"/>\n\t\t<method name=\"getVisualEffectStatusBar()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"PEOPLE_TYPE_ANYONE\"/>\n\t\t<field name=\"PEOPLE_TYPE_CONTACTS\"/>\n\t\t<field name=\"PEOPLE_TYPE_NONE\"/>\n\t\t<field name=\"PEOPLE_TYPE_STARRED\"/>\n\t\t<field name=\"PEOPLE_TYPE_UNSET\"/>\n\t\t<field name=\"STATE_ALLOW\"/>\n\t\t<field name=\"STATE_DISALLOW\"/>\n\t\t<field name=\"STATE_UNSET\"/>\n\t</class>\n\t<class name=\"android/service/notification/ZenPolicy$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"allowAlarms(Z)Landroid/service/notification/ZenPolicy$Builder;\"/>\n\t\t<method name=\"allowAllSounds()Landroid/service/notification/ZenPolicy$Builder;\"/>\n\t\t<method name=\"allowCalls(I)Landroid/service/notification/ZenPolicy$Builder;\"/>\n\t\t<method name=\"allowEvents(Z)Landroid/service/notification/ZenPolicy$Builder;\"/>\n\t\t<method name=\"allowMedia(Z)Landroid/service/notification/ZenPolicy$Builder;\"/>\n\t\t<method name=\"allowMessages(I)Landroid/service/notification/ZenPolicy$Builder;\"/>\n\t\t<method name=\"allowReminders(Z)Landroid/service/notification/ZenPolicy$Builder;\"/>\n\t\t<method name=\"allowRepeatCallers(Z)Landroid/service/notification/ZenPolicy$Builder;\"/>\n\t\t<method name=\"allowSystem(Z)Landroid/service/notification/ZenPolicy$Builder;\"/>\n\t\t<method name=\"build()Landroid/service/notification/ZenPolicy;\"/>\n\t\t<method name=\"disallowAllSounds()Landroid/service/notification/ZenPolicy$Builder;\"/>\n\t\t<method name=\"hideAllVisualEffects()Landroid/service/notification/ZenPolicy$Builder;\"/>\n\t\t<method name=\"showAllVisualEffects()Landroid/service/notification/ZenPolicy$Builder;\"/>\n\t\t<method name=\"showBadges(Z)Landroid/service/notification/ZenPolicy$Builder;\"/>\n\t\t<method name=\"showFullScreenIntent(Z)Landroid/service/notification/ZenPolicy$Builder;\"/>\n\t\t<method name=\"showInAmbientDisplay(Z)Landroid/service/notification/ZenPolicy$Builder;\"/>\n\t\t<method name=\"showInNotificationList(Z)Landroid/service/notification/ZenPolicy$Builder;\"/>\n\t\t<method name=\"showLights(Z)Landroid/service/notification/ZenPolicy$Builder;\"/>\n\t\t<method name=\"showPeeking(Z)Landroid/service/notification/ZenPolicy$Builder;\"/>\n\t\t<method name=\"showStatusBarIcons(Z)Landroid/service/notification/ZenPolicy$Builder;\"/>\n\t</class>\n\t<class name=\"android/service/quicksettings/Tile\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getContentDescription()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getIcon()Landroid/graphics/drawable/Icon;\"/>\n\t\t<method name=\"getLabel()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getState()I\"/>\n\t\t<method name=\"getSubtitle()Ljava/lang/CharSequence;\" since=\"29\"/>\n\t\t<method name=\"setContentDescription(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setIcon(Landroid/graphics/drawable/Icon;)V\"/>\n\t\t<method name=\"setLabel(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setState(I)V\"/>\n\t\t<method name=\"setSubtitle(Ljava/lang/CharSequence;)V\" since=\"29\"/>\n\t\t<method name=\"updateTile()V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"STATE_ACTIVE\"/>\n\t\t<field name=\"STATE_INACTIVE\"/>\n\t\t<field name=\"STATE_UNAVAILABLE\"/>\n\t</class>\n\t<class name=\"android/service/quicksettings/TileService\" since=\"24\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getQsTile()Landroid/service/quicksettings/Tile;\"/>\n\t\t<method name=\"isLocked()Z\"/>\n\t\t<method name=\"isSecure()Z\"/>\n\t\t<method name=\"onClick()V\"/>\n\t\t<method name=\"onStartListening()V\"/>\n\t\t<method name=\"onStopListening()V\"/>\n\t\t<method name=\"onTileAdded()V\"/>\n\t\t<method name=\"onTileRemoved()V\"/>\n\t\t<method name=\"requestListeningState(Landroid/content/Context;Landroid/content/ComponentName;)V\"/>\n\t\t<method name=\"showDialog(Landroid/app/Dialog;)V\"/>\n\t\t<method name=\"startActivityAndCollapse(Landroid/content/Intent;)V\"/>\n\t\t<method name=\"unlockAndRun(Ljava/lang/Runnable;)V\"/>\n\t\t<field name=\"ACTION_QS_TILE\"/>\n\t\t<field name=\"ACTION_QS_TILE_PREFERENCES\"/>\n\t\t<field name=\"META_DATA_ACTIVE_TILE\"/>\n\t</class>\n\t<class name=\"android/service/restrictions/RestrictionsReceiver\" since=\"21\">\n\t\t<extends name=\"android/content/BroadcastReceiver\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onRequestPermission(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/PersistableBundle;)V\"/>\n\t</class>\n\t<class name=\"android/service/textservice/SpellCheckerService\" since=\"14\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"createSession()Landroid/service/textservice/SpellCheckerService$Session;\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t</class>\n\t<class name=\"android/service/textservice/SpellCheckerService$Session\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getBundle()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getLocale()Ljava/lang/String;\"/>\n\t\t<method name=\"onCancel()V\"/>\n\t\t<method name=\"onClose()V\" since=\"15\"/>\n\t\t<method name=\"onCreate()V\"/>\n\t\t<method name=\"onGetSentenceSuggestionsMultiple([Landroid/view/textservice/TextInfo;I)[Landroid/view/textservice/SentenceSuggestionsInfo;\" since=\"16\"/>\n\t\t<method name=\"onGetSuggestions(Landroid/view/textservice/TextInfo;I)Landroid/view/textservice/SuggestionsInfo;\"/>\n\t\t<method name=\"onGetSuggestionsMultiple([Landroid/view/textservice/TextInfo;IZ)[Landroid/view/textservice/SuggestionsInfo;\"/>\n\t</class>\n\t<class name=\"android/service/voice/AlwaysOnHotwordDetector\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createEnrollIntent()Landroid/content/Intent;\"/>\n\t\t<method name=\"createReEnrollIntent()Landroid/content/Intent;\"/>\n\t\t<method name=\"createUnEnrollIntent()Landroid/content/Intent;\"/>\n\t\t<method name=\"getSupportedRecognitionModes()I\"/>\n\t\t<method name=\"startRecognition(I)Z\"/>\n\t\t<method name=\"stopRecognition()Z\"/>\n\t\t<field name=\"RECOGNITION_FLAG_ALLOW_MULTIPLE_TRIGGERS\"/>\n\t\t<field name=\"RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO\"/>\n\t\t<field name=\"RECOGNITION_MODE_USER_IDENTIFICATION\"/>\n\t\t<field name=\"RECOGNITION_MODE_VOICE_TRIGGER\"/>\n\t\t<field name=\"STATE_HARDWARE_UNAVAILABLE\"/>\n\t\t<field name=\"STATE_KEYPHRASE_ENROLLED\"/>\n\t\t<field name=\"STATE_KEYPHRASE_UNENROLLED\"/>\n\t\t<field name=\"STATE_KEYPHRASE_UNSUPPORTED\"/>\n\t</class>\n\t<class name=\"android/service/voice/AlwaysOnHotwordDetector$Callback\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onAvailabilityChanged(I)V\"/>\n\t\t<method name=\"onDetected(Landroid/service/voice/AlwaysOnHotwordDetector$EventPayload;)V\"/>\n\t\t<method name=\"onError()V\"/>\n\t\t<method name=\"onRecognitionPaused()V\"/>\n\t\t<method name=\"onRecognitionResumed()V\"/>\n\t</class>\n\t<class name=\"android/service/voice/AlwaysOnHotwordDetector$EventPayload\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getCaptureAudioFormat()Landroid/media/AudioFormat;\"/>\n\t\t<method name=\"getTriggerAudio()[B\"/>\n\t</class>\n\t<class name=\"android/service/voice/VoiceInteractionService\" since=\"21\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"createAlwaysOnHotwordDetector(Ljava/lang/String;Ljava/util/Locale;Landroid/service/voice/AlwaysOnHotwordDetector$Callback;)Landroid/service/voice/AlwaysOnHotwordDetector;\"/>\n\t\t<method name=\"getDisabledShowContext()I\" since=\"23\"/>\n\t\t<method name=\"isActiveService(Landroid/content/Context;Landroid/content/ComponentName;)Z\"/>\n\t\t<method name=\"onGetSupportedVoiceActions(Ljava/util/Set;)Ljava/util/Set;\" since=\"29\"/>\n\t\t<method name=\"onLaunchVoiceAssistFromKeyguard()V\" since=\"23\"/>\n\t\t<method name=\"onReady()V\"/>\n\t\t<method name=\"onShutdown()V\"/>\n\t\t<method name=\"setDisabledShowContext(I)V\" since=\"23\"/>\n\t\t<method name=\"setUiHints(Landroid/os/Bundle;)V\" since=\"29\"/>\n\t\t<method name=\"showSession(Landroid/os/Bundle;I)V\" since=\"23\"/>\n\t\t<method name=\"startSession(Landroid/os/Bundle;)V\" removed=\"23\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t\t<field name=\"SERVICE_META_DATA\"/>\n\t</class>\n\t<class name=\"android/service/voice/VoiceInteractionSession\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/content/ComponentCallbacks2\" since=\"23\"/>\n\t\t<implements name=\"android/view/KeyEvent$Callback\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"closeSystemDialogs()V\" since=\"23\"/>\n\t\t<method name=\"dump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V\" since=\"23\"/>\n\t\t<method name=\"finish()V\"/>\n\t\t<method name=\"getContext()Landroid/content/Context;\" since=\"23\"/>\n\t\t<method name=\"getDisabledShowContext()I\" since=\"23\"/>\n\t\t<method name=\"getLayoutInflater()Landroid/view/LayoutInflater;\" since=\"23\"/>\n\t\t<method name=\"getUserDisabledShowContext()I\" since=\"23\"/>\n\t\t<method name=\"getWindow()Landroid/app/Dialog;\" since=\"23\"/>\n\t\t<method name=\"hide()V\" since=\"23\"/>\n\t\t<method name=\"onAssistStructureFailure(Ljava/lang/Throwable;)V\" since=\"23\"/>\n\t\t<method name=\"onBackPressed()V\" since=\"23\"/>\n\t\t<method name=\"onCancelRequest(Landroid/service/voice/VoiceInteractionSession$Request;)V\" since=\"23\"/>\n\t\t<method name=\"onCloseSystemDialogs()V\"/>\n\t\t<method name=\"onComputeInsets(Landroid/service/voice/VoiceInteractionSession$Insets;)V\" since=\"23\"/>\n\t\t<method name=\"onCreate()V\" since=\"23\"/>\n\t\t<method name=\"onCreate(Landroid/os/Bundle;)V\" removed=\"23\"/>\n\t\t<method name=\"onCreateContentView()Landroid/view/View;\" since=\"23\"/>\n\t\t<method name=\"onDestroy()V\"/>\n\t\t<method name=\"onDirectActionsInvalidated(Landroid/service/voice/VoiceInteractionSession$ActivityId;)V\" since=\"29\"/>\n\t\t<method name=\"onGetSupportedCommands([Ljava/lang/String;)[Z\" since=\"23\"/>\n\t\t<method name=\"onHandleAssist(Landroid/os/Bundle;Landroid/app/assist/AssistStructure;Landroid/app/assist/AssistContent;)V\" since=\"23\" deprecated=\"29\"/>\n\t\t<method name=\"onHandleAssist(Landroid/service/voice/VoiceInteractionSession$AssistState;)V\" since=\"29\"/>\n\t\t<method name=\"onHandleAssistSecondary(Landroid/os/Bundle;Landroid/app/assist/AssistStructure;Landroid/app/assist/AssistContent;II)V\" since=\"24\" deprecated=\"29\"/>\n\t\t<method name=\"onHandleScreenshot(Landroid/graphics/Bitmap;)V\" since=\"23\"/>\n\t\t<method name=\"onHide()V\" since=\"23\"/>\n\t\t<method name=\"onLockscreenShown()V\" since=\"23\"/>\n\t\t<method name=\"onPrepareShow(Landroid/os/Bundle;I)V\" since=\"26\"/>\n\t\t<method name=\"onRequestAbortVoice(Landroid/service/voice/VoiceInteractionSession$AbortVoiceRequest;)V\" since=\"23\"/>\n\t\t<method name=\"onRequestCommand(Landroid/service/voice/VoiceInteractionSession$CommandRequest;)V\" since=\"23\"/>\n\t\t<method name=\"onRequestCompleteVoice(Landroid/service/voice/VoiceInteractionSession$CompleteVoiceRequest;)V\" since=\"23\"/>\n\t\t<method name=\"onRequestConfirmation(Landroid/service/voice/VoiceInteractionSession$ConfirmationRequest;)V\" since=\"23\"/>\n\t\t<method name=\"onRequestPickOption(Landroid/service/voice/VoiceInteractionSession$PickOptionRequest;)V\" since=\"23\"/>\n\t\t<method name=\"onShow(Landroid/os/Bundle;I)V\" since=\"23\"/>\n\t\t<method name=\"onTaskFinished(Landroid/content/Intent;I)V\" since=\"23\"/>\n\t\t<method name=\"onTaskStarted(Landroid/content/Intent;I)V\" since=\"23\"/>\n\t\t<method name=\"performDirectAction(Landroid/app/DirectAction;Landroid/os/Bundle;Landroid/os/CancellationSignal;Ljava/util/concurrent/Executor;Ljava/util/function/Consumer;)V\" since=\"29\"/>\n\t\t<method name=\"requestDirectActions(Landroid/service/voice/VoiceInteractionSession$ActivityId;Landroid/os/CancellationSignal;Ljava/util/concurrent/Executor;Ljava/util/function/Consumer;)V\" since=\"29\"/>\n\t\t<method name=\"setContentView(Landroid/view/View;)V\"/>\n\t\t<method name=\"setDisabledShowContext(I)V\" since=\"23\"/>\n\t\t<method name=\"setKeepAwake(Z)V\" since=\"23\"/>\n\t\t<method name=\"setTheme(I)V\" since=\"23\"/>\n\t\t<method name=\"setUiEnabled(Z)V\" since=\"26\"/>\n\t\t<method name=\"show(Landroid/os/Bundle;I)V\" since=\"23\"/>\n\t\t<method name=\"startAssistantActivity(Landroid/content/Intent;)V\" since=\"26\"/>\n\t\t<method name=\"startVoiceActivity(Landroid/content/Intent;)V\" since=\"23\"/>\n\t\t<field name=\"SHOW_SOURCE_ACTIVITY\" since=\"24\"/>\n\t\t<field name=\"SHOW_SOURCE_APPLICATION\" since=\"23\"/>\n\t\t<field name=\"SHOW_SOURCE_ASSIST_GESTURE\" since=\"23\"/>\n\t\t<field name=\"SHOW_SOURCE_AUTOMOTIVE_SYSTEM_UI\" since=\"29\"/>\n\t\t<field name=\"SHOW_SOURCE_NOTIFICATION\" since=\"29\"/>\n\t\t<field name=\"SHOW_SOURCE_PUSH_TO_TALK\" since=\"29\"/>\n\t\t<field name=\"SHOW_WITH_ASSIST\" since=\"23\"/>\n\t\t<field name=\"SHOW_WITH_SCREENSHOT\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/service/voice/VoiceInteractionSession$AbortVoiceRequest\" since=\"23\">\n\t\t<extends name=\"android/service/voice/VoiceInteractionSession$Request\"/>\n\t\t<method name=\"getMessage()Ljava/lang/CharSequence;\" deprecated=\"23\"/>\n\t\t<method name=\"getVoicePrompt()Landroid/app/VoiceInteractor$Prompt;\"/>\n\t\t<method name=\"sendAbortResult(Landroid/os/Bundle;)V\"/>\n\t</class>\n\t<class name=\"android/service/voice/VoiceInteractionSession$ActivityId\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/service/voice/VoiceInteractionSession$AssistState\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getActivityId()Landroid/service/voice/VoiceInteractionSession$ActivityId;\"/>\n\t\t<method name=\"getAssistContent()Landroid/app/assist/AssistContent;\"/>\n\t\t<method name=\"getAssistData()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getAssistStructure()Landroid/app/assist/AssistStructure;\"/>\n\t\t<method name=\"getCount()I\"/>\n\t\t<method name=\"getIndex()I\"/>\n\t\t<method name=\"isFocused()Z\"/>\n\t</class>\n\t<class name=\"android/service/voice/VoiceInteractionSession$CommandRequest\" since=\"23\">\n\t\t<extends name=\"android/service/voice/VoiceInteractionSession$Request\"/>\n\t\t<method name=\"getCommand()Ljava/lang/String;\"/>\n\t\t<method name=\"sendIntermediateResult(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"sendResult(Landroid/os/Bundle;)V\"/>\n\t</class>\n\t<class name=\"android/service/voice/VoiceInteractionSession$CompleteVoiceRequest\" since=\"23\">\n\t\t<extends name=\"android/service/voice/VoiceInteractionSession$Request\"/>\n\t\t<method name=\"getMessage()Ljava/lang/CharSequence;\" deprecated=\"23\"/>\n\t\t<method name=\"getVoicePrompt()Landroid/app/VoiceInteractor$Prompt;\"/>\n\t\t<method name=\"sendCompleteResult(Landroid/os/Bundle;)V\"/>\n\t</class>\n\t<class name=\"android/service/voice/VoiceInteractionSession$ConfirmationRequest\" since=\"23\">\n\t\t<extends name=\"android/service/voice/VoiceInteractionSession$Request\"/>\n\t\t<method name=\"getPrompt()Ljava/lang/CharSequence;\" deprecated=\"23\"/>\n\t\t<method name=\"getVoicePrompt()Landroid/app/VoiceInteractor$Prompt;\"/>\n\t\t<method name=\"sendConfirmationResult(ZLandroid/os/Bundle;)V\"/>\n\t</class>\n\t<class name=\"android/service/voice/VoiceInteractionSession$Insets\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"TOUCHABLE_INSETS_CONTENT\"/>\n\t\t<field name=\"TOUCHABLE_INSETS_FRAME\"/>\n\t\t<field name=\"TOUCHABLE_INSETS_REGION\"/>\n\t\t<field name=\"contentInsets\"/>\n\t\t<field name=\"touchableInsets\"/>\n\t\t<field name=\"touchableRegion\"/>\n\t</class>\n\t<class name=\"android/service/voice/VoiceInteractionSession$PickOptionRequest\" since=\"23\">\n\t\t<extends name=\"android/service/voice/VoiceInteractionSession$Request\"/>\n\t\t<method name=\"getOptions()[Landroid/app/VoiceInteractor$PickOptionRequest$Option;\"/>\n\t\t<method name=\"getPrompt()Ljava/lang/CharSequence;\" deprecated=\"23\"/>\n\t\t<method name=\"getVoicePrompt()Landroid/app/VoiceInteractor$Prompt;\"/>\n\t\t<method name=\"sendIntermediatePickOptionResult([Landroid/app/VoiceInteractor$PickOptionRequest$Option;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"sendPickOptionResult([Landroid/app/VoiceInteractor$PickOptionRequest$Option;Landroid/os/Bundle;)V\"/>\n\t</class>\n\t<class name=\"android/service/voice/VoiceInteractionSession$Request\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"cancel()V\"/>\n\t\t<method name=\"getCallingPackage()Ljava/lang/String;\"/>\n\t\t<method name=\"getCallingUid()I\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"isActive()Z\"/>\n\t</class>\n\t<class name=\"android/service/voice/VoiceInteractionSessionService\" since=\"21\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onNewSession(Landroid/os/Bundle;)Landroid/service/voice/VoiceInteractionSession;\"/>\n\t</class>\n\t<class name=\"android/service/vr/VrListenerService\" since=\"24\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"isVrModePackageEnabled(Landroid/content/Context;Landroid/content/ComponentName;)Z\"/>\n\t\t<method name=\"onCurrentVrActivityChanged(Landroid/content/ComponentName;)V\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t</class>\n\t<class name=\"android/service/wallpaper/WallpaperService\" since=\"7\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCreateEngine()Landroid/service/wallpaper/WallpaperService$Engine;\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t\t<field name=\"SERVICE_META_DATA\"/>\n\t</class>\n\t<class name=\"android/service/wallpaper/WallpaperService$Engine\" since=\"7\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/service/wallpaper/WallpaperService;)V\"/>\n\t\t<method name=\"dump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V\" since=\"14\"/>\n\t\t<method name=\"getDesiredMinimumHeight()I\"/>\n\t\t<method name=\"getDesiredMinimumWidth()I\"/>\n\t\t<method name=\"getDisplayContext()Landroid/content/Context;\" since=\"29\"/>\n\t\t<method name=\"getSurfaceHolder()Landroid/view/SurfaceHolder;\"/>\n\t\t<method name=\"isPreview()Z\"/>\n\t\t<method name=\"isVisible()Z\"/>\n\t\t<method name=\"notifyColorsChanged()V\" since=\"27\"/>\n\t\t<method name=\"onApplyWindowInsets(Landroid/view/WindowInsets;)V\" since=\"21\"/>\n\t\t<method name=\"onCommand(Ljava/lang/String;IIILandroid/os/Bundle;Z)Landroid/os/Bundle;\"/>\n\t\t<method name=\"onComputeColors()Landroid/app/WallpaperColors;\" since=\"27\"/>\n\t\t<method name=\"onCreate(Landroid/view/SurfaceHolder;)V\"/>\n\t\t<method name=\"onDesiredSizeChanged(II)V\"/>\n\t\t<method name=\"onDestroy()V\"/>\n\t\t<method name=\"onOffsetsChanged(FFFFII)V\"/>\n\t\t<method name=\"onSurfaceChanged(Landroid/view/SurfaceHolder;III)V\"/>\n\t\t<method name=\"onSurfaceCreated(Landroid/view/SurfaceHolder;)V\"/>\n\t\t<method name=\"onSurfaceDestroyed(Landroid/view/SurfaceHolder;)V\"/>\n\t\t<method name=\"onSurfaceRedrawNeeded(Landroid/view/SurfaceHolder;)V\" since=\"9\"/>\n\t\t<method name=\"onTouchEvent(Landroid/view/MotionEvent;)V\"/>\n\t\t<method name=\"onVisibilityChanged(Z)V\"/>\n\t\t<method name=\"setOffsetNotificationsEnabled(Z)V\" since=\"15\"/>\n\t\t<method name=\"setTouchEventsEnabled(Z)V\"/>\n\t</class>\n\t<class name=\"android/speech/RecognitionListener\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onBeginningOfSpeech()V\"/>\n\t\t<method name=\"onBufferReceived([B)V\"/>\n\t\t<method name=\"onEndOfSpeech()V\"/>\n\t\t<method name=\"onError(I)V\"/>\n\t\t<method name=\"onEvent(ILandroid/os/Bundle;)V\"/>\n\t\t<method name=\"onPartialResults(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onReadyForSpeech(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onResults(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onRmsChanged(F)V\"/>\n\t</class>\n\t<class name=\"android/speech/RecognitionService\" since=\"8\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCancel(Landroid/speech/RecognitionService$Callback;)V\"/>\n\t\t<method name=\"onStartListening(Landroid/content/Intent;Landroid/speech/RecognitionService$Callback;)V\"/>\n\t\t<method name=\"onStopListening(Landroid/speech/RecognitionService$Callback;)V\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t\t<field name=\"SERVICE_META_DATA\"/>\n\t</class>\n\t<class name=\"android/speech/RecognitionService$Callback\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"beginningOfSpeech()V\"/>\n\t\t<method name=\"bufferReceived([B)V\"/>\n\t\t<method name=\"endOfSpeech()V\"/>\n\t\t<method name=\"error(I)V\"/>\n\t\t<method name=\"getCallingUid()I\" since=\"23\"/>\n\t\t<method name=\"partialResults(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"readyForSpeech(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"results(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"rmsChanged(F)V\"/>\n\t</class>\n\t<class name=\"android/speech/RecognizerIntent\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getVoiceDetailsIntent(Landroid/content/Context;)Landroid/content/Intent;\" since=\"8\"/>\n\t\t<field name=\"ACTION_GET_LANGUAGE_DETAILS\" since=\"8\"/>\n\t\t<field name=\"ACTION_RECOGNIZE_SPEECH\"/>\n\t\t<field name=\"ACTION_VOICE_SEARCH_HANDS_FREE\" since=\"16\"/>\n\t\t<field name=\"ACTION_WEB_SEARCH\"/>\n\t\t<field name=\"DETAILS_META_DATA\" since=\"8\"/>\n\t\t<field name=\"EXTRA_CALLING_PACKAGE\" since=\"8\"/>\n\t\t<field name=\"EXTRA_CONFIDENCE_SCORES\" since=\"14\"/>\n\t\t<field name=\"EXTRA_LANGUAGE\"/>\n\t\t<field name=\"EXTRA_LANGUAGE_MODEL\"/>\n\t\t<field name=\"EXTRA_LANGUAGE_PREFERENCE\" since=\"8\"/>\n\t\t<field name=\"EXTRA_MAX_RESULTS\"/>\n\t\t<field name=\"EXTRA_ONLY_RETURN_LANGUAGE_PREFERENCE\" since=\"8\"/>\n\t\t<field name=\"EXTRA_ORIGIN\" since=\"14\"/>\n\t\t<field name=\"EXTRA_PARTIAL_RESULTS\" since=\"8\"/>\n\t\t<field name=\"EXTRA_PREFER_OFFLINE\" since=\"23\"/>\n\t\t<field name=\"EXTRA_PROMPT\"/>\n\t\t<field name=\"EXTRA_RESULTS\"/>\n\t\t<field name=\"EXTRA_RESULTS_PENDINGINTENT\"/>\n\t\t<field name=\"EXTRA_RESULTS_PENDINGINTENT_BUNDLE\"/>\n\t\t<field name=\"EXTRA_SECURE\" since=\"16\"/>\n\t\t<field name=\"EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS\" since=\"8\"/>\n\t\t<field name=\"EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS\" since=\"8\"/>\n\t\t<field name=\"EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS\" since=\"8\"/>\n\t\t<field name=\"EXTRA_SUPPORTED_LANGUAGES\" since=\"8\"/>\n\t\t<field name=\"EXTRA_WEB_SEARCH_ONLY\" since=\"11\"/>\n\t\t<field name=\"LANGUAGE_MODEL_FREE_FORM\"/>\n\t\t<field name=\"LANGUAGE_MODEL_WEB_SEARCH\"/>\n\t\t<field name=\"RESULT_AUDIO_ERROR\"/>\n\t\t<field name=\"RESULT_CLIENT_ERROR\"/>\n\t\t<field name=\"RESULT_NETWORK_ERROR\"/>\n\t\t<field name=\"RESULT_NO_MATCH\"/>\n\t\t<field name=\"RESULT_SERVER_ERROR\"/>\n\t</class>\n\t<class name=\"android/speech/RecognizerResultsIntent\" since=\"10\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ACTION_VOICE_SEARCH_RESULTS\"/>\n\t\t<field name=\"EXTRA_VOICE_SEARCH_RESULT_HTML\"/>\n\t\t<field name=\"EXTRA_VOICE_SEARCH_RESULT_HTML_BASE_URLS\"/>\n\t\t<field name=\"EXTRA_VOICE_SEARCH_RESULT_HTTP_HEADERS\"/>\n\t\t<field name=\"EXTRA_VOICE_SEARCH_RESULT_STRINGS\"/>\n\t\t<field name=\"EXTRA_VOICE_SEARCH_RESULT_URLS\"/>\n\t\t<field name=\"URI_SCHEME_INLINE\"/>\n\t</class>\n\t<class name=\"android/speech/SpeechRecognizer\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"cancel()V\"/>\n\t\t<method name=\"createSpeechRecognizer(Landroid/content/Context;)Landroid/speech/SpeechRecognizer;\"/>\n\t\t<method name=\"createSpeechRecognizer(Landroid/content/Context;Landroid/content/ComponentName;)Landroid/speech/SpeechRecognizer;\"/>\n\t\t<method name=\"destroy()V\"/>\n\t\t<method name=\"isRecognitionAvailable(Landroid/content/Context;)Z\"/>\n\t\t<method name=\"setRecognitionListener(Landroid/speech/RecognitionListener;)V\"/>\n\t\t<method name=\"startListening(Landroid/content/Intent;)V\"/>\n\t\t<method name=\"stopListening()V\"/>\n\t\t<field name=\"CONFIDENCE_SCORES\" since=\"14\"/>\n\t\t<field name=\"ERROR_AUDIO\"/>\n\t\t<field name=\"ERROR_CLIENT\"/>\n\t\t<field name=\"ERROR_INSUFFICIENT_PERMISSIONS\"/>\n\t\t<field name=\"ERROR_NETWORK\"/>\n\t\t<field name=\"ERROR_NETWORK_TIMEOUT\"/>\n\t\t<field name=\"ERROR_NO_MATCH\"/>\n\t\t<field name=\"ERROR_RECOGNIZER_BUSY\"/>\n\t\t<field name=\"ERROR_SERVER\"/>\n\t\t<field name=\"ERROR_SPEECH_TIMEOUT\"/>\n\t\t<field name=\"RESULTS_RECOGNITION\"/>\n\t</class>\n\t<class name=\"android/speech/tts/SynthesisCallback\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"audioAvailable([BII)I\"/>\n\t\t<method name=\"done()I\"/>\n\t\t<method name=\"error()V\"/>\n\t\t<method name=\"error(I)V\" since=\"21\"/>\n\t\t<method name=\"getMaxBufferSize()I\"/>\n\t\t<method name=\"hasFinished()Z\" since=\"21\"/>\n\t\t<method name=\"hasStarted()Z\" since=\"21\"/>\n\t\t<method name=\"rangeStart(III)V\" since=\"26\"/>\n\t\t<method name=\"start(III)I\"/>\n\t</class>\n\t<class name=\"android/speech/tts/SynthesisRequest\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;Landroid/os/Bundle;)V\" since=\"21\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"getCallerUid()I\" since=\"19\"/>\n\t\t<method name=\"getCharSequenceText()Ljava/lang/CharSequence;\" since=\"21\"/>\n\t\t<method name=\"getCountry()Ljava/lang/String;\"/>\n\t\t<method name=\"getLanguage()Ljava/lang/String;\"/>\n\t\t<method name=\"getParams()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getPitch()I\"/>\n\t\t<method name=\"getSpeechRate()I\"/>\n\t\t<method name=\"getText()Ljava/lang/String;\" deprecated=\"21\"/>\n\t\t<method name=\"getVariant()Ljava/lang/String;\"/>\n\t\t<method name=\"getVoiceName()Ljava/lang/String;\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/speech/tts/TextToSpeech\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/speech/tts/TextToSpeech$OnInitListener;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/speech/tts/TextToSpeech$OnInitListener;Ljava/lang/String;)V\" since=\"14\"/>\n\t\t<method name=\"addEarcon(Ljava/lang/String;Ljava/io/File;)I\" since=\"21\"/>\n\t\t<method name=\"addEarcon(Ljava/lang/String;Ljava/lang/String;)I\" deprecated=\"21\"/>\n\t\t<method name=\"addEarcon(Ljava/lang/String;Ljava/lang/String;I)I\"/>\n\t\t<method name=\"addSpeech(Ljava/lang/CharSequence;Ljava/io/File;)I\" since=\"21\"/>\n\t\t<method name=\"addSpeech(Ljava/lang/CharSequence;Ljava/lang/String;I)I\" since=\"21\"/>\n\t\t<method name=\"addSpeech(Ljava/lang/String;Ljava/lang/String;)I\"/>\n\t\t<method name=\"addSpeech(Ljava/lang/String;Ljava/lang/String;I)I\"/>\n\t\t<method name=\"areDefaultsEnforced()Z\" since=\"8\" deprecated=\"21\"/>\n\t\t<method name=\"getAvailableLanguages()Ljava/util/Set;\" since=\"21\"/>\n\t\t<method name=\"getDefaultEngine()Ljava/lang/String;\" since=\"8\"/>\n\t\t<method name=\"getDefaultLanguage()Ljava/util/Locale;\" since=\"18\" deprecated=\"21\"/>\n\t\t<method name=\"getDefaultVoice()Landroid/speech/tts/Voice;\" since=\"21\"/>\n\t\t<method name=\"getEngines()Ljava/util/List;\" since=\"14\"/>\n\t\t<method name=\"getFeatures(Ljava/util/Locale;)Ljava/util/Set;\" since=\"15\" deprecated=\"21\"/>\n\t\t<method name=\"getLanguage()Ljava/util/Locale;\" deprecated=\"21\"/>\n\t\t<method name=\"getMaxSpeechInputLength()I\" since=\"18\"/>\n\t\t<method name=\"getVoice()Landroid/speech/tts/Voice;\" since=\"21\"/>\n\t\t<method name=\"getVoices()Ljava/util/Set;\" since=\"21\"/>\n\t\t<method name=\"isLanguageAvailable(Ljava/util/Locale;)I\"/>\n\t\t<method name=\"isSpeaking()Z\"/>\n\t\t<method name=\"playEarcon(Ljava/lang/String;ILandroid/os/Bundle;Ljava/lang/String;)I\" since=\"21\"/>\n\t\t<method name=\"playEarcon(Ljava/lang/String;ILjava/util/HashMap;)I\" deprecated=\"21\"/>\n\t\t<method name=\"playSilence(JILjava/util/HashMap;)I\" deprecated=\"21\"/>\n\t\t<method name=\"playSilentUtterance(JILjava/lang/String;)I\" since=\"21\"/>\n\t\t<method name=\"setAudioAttributes(Landroid/media/AudioAttributes;)I\" since=\"21\"/>\n\t\t<method name=\"setEngineByPackageName(Ljava/lang/String;)I\" since=\"8\" deprecated=\"15\"/>\n\t\t<method name=\"setLanguage(Ljava/util/Locale;)I\"/>\n\t\t<method name=\"setOnUtteranceCompletedListener(Landroid/speech/tts/TextToSpeech$OnUtteranceCompletedListener;)I\" deprecated=\"15\"/>\n\t\t<method name=\"setOnUtteranceProgressListener(Landroid/speech/tts/UtteranceProgressListener;)I\" since=\"15\"/>\n\t\t<method name=\"setPitch(F)I\"/>\n\t\t<method name=\"setSpeechRate(F)I\"/>\n\t\t<method name=\"setVoice(Landroid/speech/tts/Voice;)I\" since=\"21\"/>\n\t\t<method name=\"shutdown()V\"/>\n\t\t<method name=\"speak(Ljava/lang/CharSequence;ILandroid/os/Bundle;Ljava/lang/String;)I\" since=\"21\"/>\n\t\t<method name=\"speak(Ljava/lang/String;ILjava/util/HashMap;)I\" deprecated=\"21\"/>\n\t\t<method name=\"stop()I\"/>\n\t\t<method name=\"synthesizeToFile(Ljava/lang/CharSequence;Landroid/os/Bundle;Ljava/io/File;Ljava/lang/String;)I\" since=\"21\"/>\n\t\t<method name=\"synthesizeToFile(Ljava/lang/String;Ljava/util/HashMap;Ljava/lang/String;)I\" deprecated=\"21\"/>\n\t\t<field name=\"ACTION_TTS_QUEUE_PROCESSING_COMPLETED\"/>\n\t\t<field name=\"ERROR\"/>\n\t\t<field name=\"ERROR_INVALID_REQUEST\" since=\"21\"/>\n\t\t<field name=\"ERROR_NETWORK\" since=\"21\"/>\n\t\t<field name=\"ERROR_NETWORK_TIMEOUT\" since=\"21\"/>\n\t\t<field name=\"ERROR_NOT_INSTALLED_YET\" since=\"21\"/>\n\t\t<field name=\"ERROR_OUTPUT\" since=\"21\"/>\n\t\t<field name=\"ERROR_SERVICE\" since=\"21\"/>\n\t\t<field name=\"ERROR_SYNTHESIS\" since=\"21\"/>\n\t\t<field name=\"LANG_AVAILABLE\"/>\n\t\t<field name=\"LANG_COUNTRY_AVAILABLE\"/>\n\t\t<field name=\"LANG_COUNTRY_VAR_AVAILABLE\"/>\n\t\t<field name=\"LANG_MISSING_DATA\"/>\n\t\t<field name=\"LANG_NOT_SUPPORTED\"/>\n\t\t<field name=\"QUEUE_ADD\"/>\n\t\t<field name=\"QUEUE_FLUSH\"/>\n\t\t<field name=\"STOPPED\" since=\"21\"/>\n\t\t<field name=\"SUCCESS\"/>\n\t</class>\n\t<class name=\"android/speech/tts/TextToSpeech$Engine\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/speech/tts/TextToSpeech;)V\"/>\n\t\t<field name=\"ACTION_CHECK_TTS_DATA\"/>\n\t\t<field name=\"ACTION_GET_SAMPLE_TEXT\" since=\"18\"/>\n\t\t<field name=\"ACTION_INSTALL_TTS_DATA\"/>\n\t\t<field name=\"ACTION_TTS_DATA_INSTALLED\"/>\n\t\t<field name=\"CHECK_VOICE_DATA_BAD_DATA\" deprecated=\"18\"/>\n\t\t<field name=\"CHECK_VOICE_DATA_FAIL\"/>\n\t\t<field name=\"CHECK_VOICE_DATA_MISSING_DATA\" deprecated=\"18\"/>\n\t\t<field name=\"CHECK_VOICE_DATA_MISSING_VOLUME\" deprecated=\"18\"/>\n\t\t<field name=\"CHECK_VOICE_DATA_PASS\"/>\n\t\t<field name=\"DEFAULT_STREAM\"/>\n\t\t<field name=\"EXTRA_AVAILABLE_VOICES\" since=\"8\"/>\n\t\t<field name=\"EXTRA_CHECK_VOICE_DATA_FOR\" since=\"8\" deprecated=\"18\"/>\n\t\t<field name=\"EXTRA_SAMPLE_TEXT\" since=\"18\"/>\n\t\t<field name=\"EXTRA_TTS_DATA_INSTALLED\" deprecated=\"18\"/>\n\t\t<field name=\"EXTRA_UNAVAILABLE_VOICES\" since=\"8\"/>\n\t\t<field name=\"EXTRA_VOICE_DATA_FILES\" deprecated=\"18\"/>\n\t\t<field name=\"EXTRA_VOICE_DATA_FILES_INFO\" deprecated=\"18\"/>\n\t\t<field name=\"EXTRA_VOICE_DATA_ROOT_DIRECTORY\" deprecated=\"18\"/>\n\t\t<field name=\"INTENT_ACTION_TTS_SERVICE\" since=\"14\"/>\n\t\t<field name=\"KEY_FEATURE_EMBEDDED_SYNTHESIS\" since=\"15\" deprecated=\"21\"/>\n\t\t<field name=\"KEY_FEATURE_NETWORK_RETRIES_COUNT\" since=\"21\"/>\n\t\t<field name=\"KEY_FEATURE_NETWORK_SYNTHESIS\" since=\"15\" deprecated=\"21\"/>\n\t\t<field name=\"KEY_FEATURE_NETWORK_TIMEOUT_MS\" since=\"21\"/>\n\t\t<field name=\"KEY_FEATURE_NOT_INSTALLED\" since=\"21\"/>\n\t\t<field name=\"KEY_PARAM_PAN\" since=\"11\"/>\n\t\t<field name=\"KEY_PARAM_SESSION_ID\" since=\"21\"/>\n\t\t<field name=\"KEY_PARAM_STREAM\"/>\n\t\t<field name=\"KEY_PARAM_UTTERANCE_ID\"/>\n\t\t<field name=\"KEY_PARAM_VOLUME\" since=\"11\"/>\n\t\t<field name=\"SERVICE_META_DATA\" since=\"14\"/>\n\t</class>\n\t<class name=\"android/speech/tts/TextToSpeech$EngineInfo\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"icon\"/>\n\t\t<field name=\"label\"/>\n\t\t<field name=\"name\"/>\n\t</class>\n\t<class name=\"android/speech/tts/TextToSpeech$OnInitListener\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onInit(I)V\"/>\n\t</class>\n\t<class name=\"android/speech/tts/TextToSpeech$OnUtteranceCompletedListener\" since=\"4\" deprecated=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onUtteranceCompleted(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/speech/tts/TextToSpeechService\" since=\"14\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onGetDefaultVoiceNameFor(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"onGetFeaturesForLanguage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/util/Set;\" since=\"15\"/>\n\t\t<method name=\"onGetLanguage()[Ljava/lang/String;\"/>\n\t\t<method name=\"onGetVoices()Ljava/util/List;\" since=\"21\"/>\n\t\t<method name=\"onIsLanguageAvailable(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I\"/>\n\t\t<method name=\"onIsValidVoiceName(Ljava/lang/String;)I\" since=\"21\"/>\n\t\t<method name=\"onLoadLanguage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I\"/>\n\t\t<method name=\"onLoadVoice(Ljava/lang/String;)I\" since=\"21\"/>\n\t\t<method name=\"onStop()V\"/>\n\t\t<method name=\"onSynthesizeText(Landroid/speech/tts/SynthesisRequest;Landroid/speech/tts/SynthesisCallback;)V\"/>\n\t</class>\n\t<class name=\"android/speech/tts/UtteranceProgressListener\" since=\"15\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onAudioAvailable(Ljava/lang/String;[B)V\" since=\"24\"/>\n\t\t<method name=\"onBeginSynthesis(Ljava/lang/String;III)V\" since=\"24\"/>\n\t\t<method name=\"onDone(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onError(Ljava/lang/String;)V\" deprecated=\"21\"/>\n\t\t<method name=\"onError(Ljava/lang/String;I)V\" since=\"21\"/>\n\t\t<method name=\"onRangeStart(Ljava/lang/String;III)V\" since=\"26\"/>\n\t\t<method name=\"onStart(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onStop(Ljava/lang/String;Z)V\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/speech/tts/Voice\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/util/Locale;IIZLjava/util/Set;)V\"/>\n\t\t<method name=\"getFeatures()Ljava/util/Set;\"/>\n\t\t<method name=\"getLatency()I\"/>\n\t\t<method name=\"getLocale()Ljava/util/Locale;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getQuality()I\"/>\n\t\t<method name=\"isNetworkConnectionRequired()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"LATENCY_HIGH\"/>\n\t\t<field name=\"LATENCY_LOW\"/>\n\t\t<field name=\"LATENCY_NORMAL\"/>\n\t\t<field name=\"LATENCY_VERY_HIGH\"/>\n\t\t<field name=\"LATENCY_VERY_LOW\"/>\n\t\t<field name=\"QUALITY_HIGH\"/>\n\t\t<field name=\"QUALITY_LOW\"/>\n\t\t<field name=\"QUALITY_NORMAL\"/>\n\t\t<field name=\"QUALITY_VERY_HIGH\"/>\n\t\t<field name=\"QUALITY_VERY_LOW\"/>\n\t</class>\n\t<class name=\"android/system/ErrnoException\" since=\"21\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;ILjava/lang/Throwable;)V\"/>\n\t\t<method name=\"rethrowAsIOException()Ljava/io/IOException;\" since=\"30\"/>\n\t\t<method name=\"rethrowAsSocketException()Ljava/net/SocketException;\" since=\"30\"/>\n\t\t<field name=\"errno\"/>\n\t</class>\n\t<class name=\"android/system/Int64Ref\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(J)V\"/>\n\t\t<field name=\"value\"/>\n\t</class>\n\t<class name=\"android/system/Os\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"accept(Ljava/io/FileDescriptor;Ljava/net/InetSocketAddress;)Ljava/io/FileDescriptor;\"/>\n\t\t<method name=\"access(Ljava/lang/String;I)Z\"/>\n\t\t<method name=\"bind(Ljava/io/FileDescriptor;Ljava/net/InetAddress;I)V\"/>\n\t\t<method name=\"bind(Ljava/io/FileDescriptor;Ljava/net/SocketAddress;)V\" since=\"29\"/>\n\t\t<method name=\"chmod(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"chown(Ljava/lang/String;II)V\"/>\n\t\t<method name=\"close(Ljava/io/FileDescriptor;)V\"/>\n\t\t<method name=\"connect(Ljava/io/FileDescriptor;Ljava/net/InetAddress;I)V\"/>\n\t\t<method name=\"connect(Ljava/io/FileDescriptor;Ljava/net/SocketAddress;)V\" since=\"29\"/>\n\t\t<method name=\"dup(Ljava/io/FileDescriptor;)Ljava/io/FileDescriptor;\"/>\n\t\t<method name=\"dup2(Ljava/io/FileDescriptor;I)Ljava/io/FileDescriptor;\"/>\n\t\t<method name=\"environ()[Ljava/lang/String;\"/>\n\t\t<method name=\"execv(Ljava/lang/String;[Ljava/lang/String;)V\"/>\n\t\t<method name=\"execve(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;)V\"/>\n\t\t<method name=\"fchmod(Ljava/io/FileDescriptor;I)V\"/>\n\t\t<method name=\"fchown(Ljava/io/FileDescriptor;II)V\"/>\n\t\t<method name=\"fcntlInt(Ljava/io/FileDescriptor;II)I\" since=\"30\"/>\n\t\t<method name=\"fdatasync(Ljava/io/FileDescriptor;)V\"/>\n\t\t<method name=\"fstat(Ljava/io/FileDescriptor;)Landroid/system/StructStat;\"/>\n\t\t<method name=\"fstatvfs(Ljava/io/FileDescriptor;)Landroid/system/StructStatVfs;\"/>\n\t\t<method name=\"fsync(Ljava/io/FileDescriptor;)V\"/>\n\t\t<method name=\"ftruncate(Ljava/io/FileDescriptor;J)V\"/>\n\t\t<method name=\"gai_strerror(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getegid()I\"/>\n\t\t<method name=\"getenv(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"geteuid()I\"/>\n\t\t<method name=\"getgid()I\"/>\n\t\t<method name=\"getpeername(Ljava/io/FileDescriptor;)Ljava/net/SocketAddress;\"/>\n\t\t<method name=\"getpid()I\"/>\n\t\t<method name=\"getppid()I\"/>\n\t\t<method name=\"getsockname(Ljava/io/FileDescriptor;)Ljava/net/SocketAddress;\"/>\n\t\t<method name=\"getsockoptTimeval(Ljava/io/FileDescriptor;II)Landroid/system/StructTimeval;\" since=\"29\"/>\n\t\t<method name=\"gettid()I\"/>\n\t\t<method name=\"getuid()I\"/>\n\t\t<method name=\"getxattr(Ljava/lang/String;Ljava/lang/String;)[B\" since=\"26\"/>\n\t\t<method name=\"if_indextoname(I)Ljava/lang/String;\"/>\n\t\t<method name=\"if_nametoindex(Ljava/lang/String;)I\" since=\"26\"/>\n\t\t<method name=\"inet_pton(ILjava/lang/String;)Ljava/net/InetAddress;\"/>\n\t\t<method name=\"isatty(Ljava/io/FileDescriptor;)Z\"/>\n\t\t<method name=\"kill(II)V\"/>\n\t\t<method name=\"lchown(Ljava/lang/String;II)V\"/>\n\t\t<method name=\"link(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"listen(Ljava/io/FileDescriptor;I)V\"/>\n\t\t<method name=\"listxattr(Ljava/lang/String;)[Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"lseek(Ljava/io/FileDescriptor;JI)J\"/>\n\t\t<method name=\"lstat(Ljava/lang/String;)Landroid/system/StructStat;\"/>\n\t\t<method name=\"memfd_create(Ljava/lang/String;I)Ljava/io/FileDescriptor;\" since=\"30\"/>\n\t\t<method name=\"mincore(JJ[B)V\"/>\n\t\t<method name=\"mkdir(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"mkfifo(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"mlock(JJ)V\"/>\n\t\t<method name=\"mmap(JJIILjava/io/FileDescriptor;J)J\"/>\n\t\t<method name=\"msync(JJI)V\"/>\n\t\t<method name=\"munlock(JJ)V\"/>\n\t\t<method name=\"munmap(JJ)V\"/>\n\t\t<method name=\"open(Ljava/lang/String;II)Ljava/io/FileDescriptor;\"/>\n\t\t<method name=\"pipe()[Ljava/io/FileDescriptor;\"/>\n\t\t<method name=\"poll([Landroid/system/StructPollfd;I)I\"/>\n\t\t<method name=\"posix_fallocate(Ljava/io/FileDescriptor;JJ)V\"/>\n\t\t<method name=\"prctl(IJJJJ)I\"/>\n\t\t<method name=\"pread(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;J)I\"/>\n\t\t<method name=\"pread(Ljava/io/FileDescriptor;[BIIJ)I\"/>\n\t\t<method name=\"pwrite(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;J)I\"/>\n\t\t<method name=\"pwrite(Ljava/io/FileDescriptor;[BIIJ)I\"/>\n\t\t<method name=\"read(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;)I\"/>\n\t\t<method name=\"read(Ljava/io/FileDescriptor;[BII)I\"/>\n\t\t<method name=\"readlink(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"readv(Ljava/io/FileDescriptor;[Ljava/lang/Object;[I[I)I\"/>\n\t\t<method name=\"recvfrom(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;ILjava/net/InetSocketAddress;)I\"/>\n\t\t<method name=\"recvfrom(Ljava/io/FileDescriptor;[BIIILjava/net/InetSocketAddress;)I\"/>\n\t\t<method name=\"remove(Ljava/lang/String;)V\"/>\n\t\t<method name=\"removexattr(Ljava/lang/String;Ljava/lang/String;)V\" since=\"26\"/>\n\t\t<method name=\"rename(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"sendfile(Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;Landroid/system/Int64Ref;J)J\" since=\"28\"/>\n\t\t<method name=\"sendfile(Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;Landroid/util/MutableLong;J)J\" removed=\"28\"/>\n\t\t<method name=\"sendto(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;ILjava/net/InetAddress;I)I\"/>\n\t\t<method name=\"sendto(Ljava/io/FileDescriptor;[BIIILjava/net/InetAddress;I)I\"/>\n\t\t<method name=\"sendto(Ljava/io/FileDescriptor;[BIIILjava/net/SocketAddress;)I\" since=\"29\"/>\n\t\t<method name=\"setegid(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setenv(Ljava/lang/String;Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"seteuid(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setgid(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setsid()I\"/>\n\t\t<method name=\"setsockoptInt(Ljava/io/FileDescriptor;III)V\" since=\"26\"/>\n\t\t<method name=\"setsockoptTimeval(Ljava/io/FileDescriptor;IILandroid/system/StructTimeval;)V\" since=\"29\"/>\n\t\t<method name=\"setuid(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setxattr(Ljava/lang/String;Ljava/lang/String;[BI)V\" since=\"26\"/>\n\t\t<method name=\"shutdown(Ljava/io/FileDescriptor;I)V\"/>\n\t\t<method name=\"socket(III)Ljava/io/FileDescriptor;\"/>\n\t\t<method name=\"socketpair(IIILjava/io/FileDescriptor;Ljava/io/FileDescriptor;)V\"/>\n\t\t<method name=\"stat(Ljava/lang/String;)Landroid/system/StructStat;\"/>\n\t\t<method name=\"statvfs(Ljava/lang/String;)Landroid/system/StructStatVfs;\"/>\n\t\t<method name=\"strerror(I)Ljava/lang/String;\"/>\n\t\t<method name=\"strsignal(I)Ljava/lang/String;\"/>\n\t\t<method name=\"symlink(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"sysconf(I)J\"/>\n\t\t<method name=\"tcdrain(Ljava/io/FileDescriptor;)V\"/>\n\t\t<method name=\"tcsendbreak(Ljava/io/FileDescriptor;I)V\"/>\n\t\t<method name=\"umask(I)I\"/>\n\t\t<method name=\"uname()Landroid/system/StructUtsname;\"/>\n\t\t<method name=\"unsetenv(Ljava/lang/String;)V\"/>\n\t\t<method name=\"waitpid(ILandroid/util/MutableInt;I)I\" removed=\"28\"/>\n\t\t<method name=\"write(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;)I\"/>\n\t\t<method name=\"write(Ljava/io/FileDescriptor;[BII)I\"/>\n\t\t<method name=\"writev(Ljava/io/FileDescriptor;[Ljava/lang/Object;[I[I)I\"/>\n\t</class>\n\t<class name=\"android/system/OsConstants\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"S_ISBLK(I)Z\"/>\n\t\t<method name=\"S_ISCHR(I)Z\"/>\n\t\t<method name=\"S_ISDIR(I)Z\"/>\n\t\t<method name=\"S_ISFIFO(I)Z\"/>\n\t\t<method name=\"S_ISLNK(I)Z\"/>\n\t\t<method name=\"S_ISREG(I)Z\"/>\n\t\t<method name=\"S_ISSOCK(I)Z\"/>\n\t\t<method name=\"WCOREDUMP(I)Z\"/>\n\t\t<method name=\"WEXITSTATUS(I)I\"/>\n\t\t<method name=\"WIFEXITED(I)Z\"/>\n\t\t<method name=\"WIFSIGNALED(I)Z\"/>\n\t\t<method name=\"WIFSTOPPED(I)Z\"/>\n\t\t<method name=\"WSTOPSIG(I)I\"/>\n\t\t<method name=\"WTERMSIG(I)I\"/>\n\t\t<method name=\"errnoName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"gaiName(I)Ljava/lang/String;\"/>\n\t\t<field name=\"AF_INET\"/>\n\t\t<field name=\"AF_INET6\"/>\n\t\t<field name=\"AF_NETLINK\" since=\"29\"/>\n\t\t<field name=\"AF_PACKET\" since=\"29\"/>\n\t\t<field name=\"AF_UNIX\"/>\n\t\t<field name=\"AF_UNSPEC\"/>\n\t\t<field name=\"AI_ADDRCONFIG\"/>\n\t\t<field name=\"AI_ALL\"/>\n\t\t<field name=\"AI_CANONNAME\"/>\n\t\t<field name=\"AI_NUMERICHOST\"/>\n\t\t<field name=\"AI_NUMERICSERV\"/>\n\t\t<field name=\"AI_PASSIVE\"/>\n\t\t<field name=\"AI_V4MAPPED\"/>\n\t\t<field name=\"ARPHRD_ETHER\" since=\"29\"/>\n\t\t<field name=\"CAP_AUDIT_CONTROL\"/>\n\t\t<field name=\"CAP_AUDIT_WRITE\"/>\n\t\t<field name=\"CAP_BLOCK_SUSPEND\"/>\n\t\t<field name=\"CAP_CHOWN\"/>\n\t\t<field name=\"CAP_DAC_OVERRIDE\"/>\n\t\t<field name=\"CAP_DAC_READ_SEARCH\"/>\n\t\t<field name=\"CAP_FOWNER\"/>\n\t\t<field name=\"CAP_FSETID\"/>\n\t\t<field name=\"CAP_IPC_LOCK\"/>\n\t\t<field name=\"CAP_IPC_OWNER\"/>\n\t\t<field name=\"CAP_KILL\"/>\n\t\t<field name=\"CAP_LAST_CAP\"/>\n\t\t<field name=\"CAP_LEASE\"/>\n\t\t<field name=\"CAP_LINUX_IMMUTABLE\"/>\n\t\t<field name=\"CAP_MAC_ADMIN\"/>\n\t\t<field name=\"CAP_MAC_OVERRIDE\"/>\n\t\t<field name=\"CAP_MKNOD\"/>\n\t\t<field name=\"CAP_NET_ADMIN\"/>\n\t\t<field name=\"CAP_NET_BIND_SERVICE\"/>\n\t\t<field name=\"CAP_NET_BROADCAST\"/>\n\t\t<field name=\"CAP_NET_RAW\"/>\n\t\t<field name=\"CAP_SETFCAP\"/>\n\t\t<field name=\"CAP_SETGID\"/>\n\t\t<field name=\"CAP_SETPCAP\"/>\n\t\t<field name=\"CAP_SETUID\"/>\n\t\t<field name=\"CAP_SYSLOG\"/>\n\t\t<field name=\"CAP_SYS_ADMIN\"/>\n\t\t<field name=\"CAP_SYS_BOOT\"/>\n\t\t<field name=\"CAP_SYS_CHROOT\"/>\n\t\t<field name=\"CAP_SYS_MODULE\"/>\n\t\t<field name=\"CAP_SYS_NICE\"/>\n\t\t<field name=\"CAP_SYS_PACCT\"/>\n\t\t<field name=\"CAP_SYS_PTRACE\"/>\n\t\t<field name=\"CAP_SYS_RAWIO\"/>\n\t\t<field name=\"CAP_SYS_RESOURCE\"/>\n\t\t<field name=\"CAP_SYS_TIME\"/>\n\t\t<field name=\"CAP_SYS_TTY_CONFIG\"/>\n\t\t<field name=\"CAP_WAKE_ALARM\"/>\n\t\t<field name=\"E2BIG\"/>\n\t\t<field name=\"EACCES\"/>\n\t\t<field name=\"EADDRINUSE\"/>\n\t\t<field name=\"EADDRNOTAVAIL\"/>\n\t\t<field name=\"EAFNOSUPPORT\"/>\n\t\t<field name=\"EAGAIN\"/>\n\t\t<field name=\"EAI_AGAIN\"/>\n\t\t<field name=\"EAI_BADFLAGS\"/>\n\t\t<field name=\"EAI_FAIL\"/>\n\t\t<field name=\"EAI_FAMILY\"/>\n\t\t<field name=\"EAI_MEMORY\"/>\n\t\t<field name=\"EAI_NODATA\"/>\n\t\t<field name=\"EAI_NONAME\"/>\n\t\t<field name=\"EAI_OVERFLOW\"/>\n\t\t<field name=\"EAI_SERVICE\"/>\n\t\t<field name=\"EAI_SOCKTYPE\"/>\n\t\t<field name=\"EAI_SYSTEM\"/>\n\t\t<field name=\"EALREADY\"/>\n\t\t<field name=\"EBADF\"/>\n\t\t<field name=\"EBADMSG\"/>\n\t\t<field name=\"EBUSY\"/>\n\t\t<field name=\"ECANCELED\"/>\n\t\t<field name=\"ECHILD\"/>\n\t\t<field name=\"ECONNABORTED\"/>\n\t\t<field name=\"ECONNREFUSED\"/>\n\t\t<field name=\"ECONNRESET\"/>\n\t\t<field name=\"EDEADLK\"/>\n\t\t<field name=\"EDESTADDRREQ\"/>\n\t\t<field name=\"EDOM\"/>\n\t\t<field name=\"EDQUOT\"/>\n\t\t<field name=\"EEXIST\"/>\n\t\t<field name=\"EFAULT\"/>\n\t\t<field name=\"EFBIG\"/>\n\t\t<field name=\"EHOSTUNREACH\"/>\n\t\t<field name=\"EIDRM\"/>\n\t\t<field name=\"EILSEQ\"/>\n\t\t<field name=\"EINPROGRESS\"/>\n\t\t<field name=\"EINTR\"/>\n\t\t<field name=\"EINVAL\"/>\n\t\t<field name=\"EIO\"/>\n\t\t<field name=\"EISCONN\"/>\n\t\t<field name=\"EISDIR\"/>\n\t\t<field name=\"ELOOP\"/>\n\t\t<field name=\"EMFILE\"/>\n\t\t<field name=\"EMLINK\"/>\n\t\t<field name=\"EMSGSIZE\"/>\n\t\t<field name=\"EMULTIHOP\"/>\n\t\t<field name=\"ENAMETOOLONG\"/>\n\t\t<field name=\"ENETDOWN\"/>\n\t\t<field name=\"ENETRESET\"/>\n\t\t<field name=\"ENETUNREACH\"/>\n\t\t<field name=\"ENFILE\"/>\n\t\t<field name=\"ENOBUFS\"/>\n\t\t<field name=\"ENODATA\"/>\n\t\t<field name=\"ENODEV\"/>\n\t\t<field name=\"ENOENT\"/>\n\t\t<field name=\"ENOEXEC\"/>\n\t\t<field name=\"ENOLCK\"/>\n\t\t<field name=\"ENOLINK\"/>\n\t\t<field name=\"ENOMEM\"/>\n\t\t<field name=\"ENOMSG\"/>\n\t\t<field name=\"ENOPROTOOPT\"/>\n\t\t<field name=\"ENOSPC\"/>\n\t\t<field name=\"ENOSR\"/>\n\t\t<field name=\"ENOSTR\"/>\n\t\t<field name=\"ENOSYS\"/>\n\t\t<field name=\"ENOTCONN\"/>\n\t\t<field name=\"ENOTDIR\"/>\n\t\t<field name=\"ENOTEMPTY\"/>\n\t\t<field name=\"ENOTSOCK\"/>\n\t\t<field name=\"ENOTSUP\"/>\n\t\t<field name=\"ENOTTY\"/>\n\t\t<field name=\"ENXIO\"/>\n\t\t<field name=\"EOPNOTSUPP\"/>\n\t\t<field name=\"EOVERFLOW\"/>\n\t\t<field name=\"EPERM\"/>\n\t\t<field name=\"EPIPE\"/>\n\t\t<field name=\"EPROTO\"/>\n\t\t<field name=\"EPROTONOSUPPORT\"/>\n\t\t<field name=\"EPROTOTYPE\"/>\n\t\t<field name=\"ERANGE\"/>\n\t\t<field name=\"EROFS\"/>\n\t\t<field name=\"ESPIPE\"/>\n\t\t<field name=\"ESRCH\"/>\n\t\t<field name=\"ESTALE\"/>\n\t\t<field name=\"ETH_P_ALL\" since=\"29\"/>\n\t\t<field name=\"ETH_P_ARP\" since=\"29\"/>\n\t\t<field name=\"ETH_P_IP\" since=\"29\"/>\n\t\t<field name=\"ETH_P_IPV6\" since=\"29\"/>\n\t\t<field name=\"ETIME\"/>\n\t\t<field name=\"ETIMEDOUT\"/>\n\t\t<field name=\"ETXTBSY\"/>\n\t\t<field name=\"EXDEV\"/>\n\t\t<field name=\"EXIT_FAILURE\"/>\n\t\t<field name=\"EXIT_SUCCESS\"/>\n\t\t<field name=\"FD_CLOEXEC\"/>\n\t\t<field name=\"FIONREAD\"/>\n\t\t<field name=\"F_DUPFD\"/>\n\t\t<field name=\"F_DUPFD_CLOEXEC\" since=\"27\"/>\n\t\t<field name=\"F_GETFD\"/>\n\t\t<field name=\"F_GETFL\"/>\n\t\t<field name=\"F_GETLK\"/>\n\t\t<field name=\"F_GETLK64\"/>\n\t\t<field name=\"F_GETOWN\"/>\n\t\t<field name=\"F_OK\"/>\n\t\t<field name=\"F_RDLCK\"/>\n\t\t<field name=\"F_SETFD\"/>\n\t\t<field name=\"F_SETFL\"/>\n\t\t<field name=\"F_SETLK\"/>\n\t\t<field name=\"F_SETLK64\"/>\n\t\t<field name=\"F_SETLKW\"/>\n\t\t<field name=\"F_SETLKW64\"/>\n\t\t<field name=\"F_SETOWN\"/>\n\t\t<field name=\"F_UNLCK\"/>\n\t\t<field name=\"F_WRLCK\"/>\n\t\t<field name=\"ICMP6_ECHO_REPLY\" since=\"29\"/>\n\t\t<field name=\"ICMP6_ECHO_REQUEST\" since=\"29\"/>\n\t\t<field name=\"ICMP_ECHO\" since=\"29\"/>\n\t\t<field name=\"ICMP_ECHOREPLY\" since=\"29\"/>\n\t\t<field name=\"IFA_F_DADFAILED\"/>\n\t\t<field name=\"IFA_F_DEPRECATED\"/>\n\t\t<field name=\"IFA_F_HOMEADDRESS\"/>\n\t\t<field name=\"IFA_F_NODAD\"/>\n\t\t<field name=\"IFA_F_OPTIMISTIC\"/>\n\t\t<field name=\"IFA_F_PERMANENT\"/>\n\t\t<field name=\"IFA_F_SECONDARY\"/>\n\t\t<field name=\"IFA_F_TEMPORARY\"/>\n\t\t<field name=\"IFA_F_TENTATIVE\"/>\n\t\t<field name=\"IFF_ALLMULTI\"/>\n\t\t<field name=\"IFF_AUTOMEDIA\"/>\n\t\t<field name=\"IFF_BROADCAST\"/>\n\t\t<field name=\"IFF_DEBUG\"/>\n\t\t<field name=\"IFF_DYNAMIC\"/>\n\t\t<field name=\"IFF_LOOPBACK\"/>\n\t\t<field name=\"IFF_MASTER\"/>\n\t\t<field name=\"IFF_MULTICAST\"/>\n\t\t<field name=\"IFF_NOARP\"/>\n\t\t<field name=\"IFF_NOTRAILERS\"/>\n\t\t<field name=\"IFF_POINTOPOINT\"/>\n\t\t<field name=\"IFF_PORTSEL\"/>\n\t\t<field name=\"IFF_PROMISC\"/>\n\t\t<field name=\"IFF_RUNNING\"/>\n\t\t<field name=\"IFF_SLAVE\"/>\n\t\t<field name=\"IFF_UP\"/>\n\t\t<field name=\"IPPROTO_ICMP\"/>\n\t\t<field name=\"IPPROTO_ICMPV6\"/>\n\t\t<field name=\"IPPROTO_IP\"/>\n\t\t<field name=\"IPPROTO_IPV6\"/>\n\t\t<field name=\"IPPROTO_RAW\"/>\n\t\t<field name=\"IPPROTO_TCP\"/>\n\t\t<field name=\"IPPROTO_UDP\"/>\n\t\t<field name=\"IPV6_CHECKSUM\"/>\n\t\t<field name=\"IPV6_MULTICAST_HOPS\"/>\n\t\t<field name=\"IPV6_MULTICAST_IF\"/>\n\t\t<field name=\"IPV6_MULTICAST_LOOP\"/>\n\t\t<field name=\"IPV6_RECVDSTOPTS\"/>\n\t\t<field name=\"IPV6_RECVHOPLIMIT\"/>\n\t\t<field name=\"IPV6_RECVHOPOPTS\"/>\n\t\t<field name=\"IPV6_RECVPKTINFO\"/>\n\t\t<field name=\"IPV6_RECVRTHDR\"/>\n\t\t<field name=\"IPV6_RECVTCLASS\"/>\n\t\t<field name=\"IPV6_TCLASS\"/>\n\t\t<field name=\"IPV6_UNICAST_HOPS\"/>\n\t\t<field name=\"IPV6_V6ONLY\"/>\n\t\t<field name=\"IP_MULTICAST_IF\"/>\n\t\t<field name=\"IP_MULTICAST_LOOP\"/>\n\t\t<field name=\"IP_MULTICAST_TTL\"/>\n\t\t<field name=\"IP_TOS\"/>\n\t\t<field name=\"IP_TTL\"/>\n\t\t<field name=\"MAP_ANONYMOUS\" since=\"30\"/>\n\t\t<field name=\"MAP_FIXED\"/>\n\t\t<field name=\"MAP_PRIVATE\"/>\n\t\t<field name=\"MAP_SHARED\"/>\n\t\t<field name=\"MCAST_BLOCK_SOURCE\"/>\n\t\t<field name=\"MCAST_JOIN_GROUP\"/>\n\t\t<field name=\"MCAST_JOIN_SOURCE_GROUP\"/>\n\t\t<field name=\"MCAST_LEAVE_GROUP\"/>\n\t\t<field name=\"MCAST_LEAVE_SOURCE_GROUP\"/>\n\t\t<field name=\"MCAST_UNBLOCK_SOURCE\"/>\n\t\t<field name=\"MCL_CURRENT\"/>\n\t\t<field name=\"MCL_FUTURE\"/>\n\t\t<field name=\"MFD_CLOEXEC\" since=\"30\"/>\n\t\t<field name=\"MSG_CTRUNC\"/>\n\t\t<field name=\"MSG_DONTROUTE\"/>\n\t\t<field name=\"MSG_EOR\"/>\n\t\t<field name=\"MSG_OOB\"/>\n\t\t<field name=\"MSG_PEEK\"/>\n\t\t<field name=\"MSG_TRUNC\"/>\n\t\t<field name=\"MSG_WAITALL\"/>\n\t\t<field name=\"MS_ASYNC\"/>\n\t\t<field name=\"MS_INVALIDATE\"/>\n\t\t<field name=\"MS_SYNC\"/>\n\t\t<field name=\"NETLINK_INET_DIAG\" since=\"29\"/>\n\t\t<field name=\"NETLINK_NETFILTER\" since=\"30\"/>\n\t\t<field name=\"NETLINK_ROUTE\" since=\"29\"/>\n\t\t<field name=\"NI_DGRAM\"/>\n\t\t<field name=\"NI_NAMEREQD\"/>\n\t\t<field name=\"NI_NOFQDN\"/>\n\t\t<field name=\"NI_NUMERICHOST\"/>\n\t\t<field name=\"NI_NUMERICSERV\"/>\n\t\t<field name=\"O_ACCMODE\"/>\n\t\t<field name=\"O_APPEND\"/>\n\t\t<field name=\"O_CLOEXEC\" since=\"27\"/>\n\t\t<field name=\"O_CREAT\"/>\n\t\t<field name=\"O_DSYNC\" since=\"27\"/>\n\t\t<field name=\"O_EXCL\"/>\n\t\t<field name=\"O_NOCTTY\"/>\n\t\t<field name=\"O_NOFOLLOW\"/>\n\t\t<field name=\"O_NONBLOCK\"/>\n\t\t<field name=\"O_RDONLY\"/>\n\t\t<field name=\"O_RDWR\"/>\n\t\t<field name=\"O_SYNC\"/>\n\t\t<field name=\"O_TRUNC\"/>\n\t\t<field name=\"O_WRONLY\"/>\n\t\t<field name=\"POLLERR\"/>\n\t\t<field name=\"POLLHUP\"/>\n\t\t<field name=\"POLLIN\"/>\n\t\t<field name=\"POLLNVAL\"/>\n\t\t<field name=\"POLLOUT\"/>\n\t\t<field name=\"POLLPRI\"/>\n\t\t<field name=\"POLLRDBAND\"/>\n\t\t<field name=\"POLLRDNORM\"/>\n\t\t<field name=\"POLLWRBAND\"/>\n\t\t<field name=\"POLLWRNORM\"/>\n\t\t<field name=\"PROT_EXEC\"/>\n\t\t<field name=\"PROT_NONE\"/>\n\t\t<field name=\"PROT_READ\"/>\n\t\t<field name=\"PROT_WRITE\"/>\n\t\t<field name=\"PR_GET_DUMPABLE\"/>\n\t\t<field name=\"PR_SET_DUMPABLE\"/>\n\t\t<field name=\"PR_SET_NO_NEW_PRIVS\"/>\n\t\t<field name=\"RTMGRP_NEIGH\" since=\"29\"/>\n\t\t<field name=\"RT_SCOPE_HOST\"/>\n\t\t<field name=\"RT_SCOPE_LINK\"/>\n\t\t<field name=\"RT_SCOPE_NOWHERE\"/>\n\t\t<field name=\"RT_SCOPE_SITE\"/>\n\t\t<field name=\"RT_SCOPE_UNIVERSE\"/>\n\t\t<field name=\"R_OK\"/>\n\t\t<field name=\"SEEK_CUR\"/>\n\t\t<field name=\"SEEK_END\"/>\n\t\t<field name=\"SEEK_SET\"/>\n\t\t<field name=\"SHUT_RD\"/>\n\t\t<field name=\"SHUT_RDWR\"/>\n\t\t<field name=\"SHUT_WR\"/>\n\t\t<field name=\"SIGABRT\"/>\n\t\t<field name=\"SIGALRM\"/>\n\t\t<field name=\"SIGBUS\"/>\n\t\t<field name=\"SIGCHLD\"/>\n\t\t<field name=\"SIGCONT\"/>\n\t\t<field name=\"SIGFPE\"/>\n\t\t<field name=\"SIGHUP\"/>\n\t\t<field name=\"SIGILL\"/>\n\t\t<field name=\"SIGINT\"/>\n\t\t<field name=\"SIGIO\"/>\n\t\t<field name=\"SIGKILL\"/>\n\t\t<field name=\"SIGPIPE\"/>\n\t\t<field name=\"SIGPROF\"/>\n\t\t<field name=\"SIGPWR\"/>\n\t\t<field name=\"SIGQUIT\"/>\n\t\t<field name=\"SIGRTMAX\"/>\n\t\t<field name=\"SIGRTMIN\"/>\n\t\t<field name=\"SIGSEGV\"/>\n\t\t<field name=\"SIGSTKFLT\"/>\n\t\t<field name=\"SIGSTOP\"/>\n\t\t<field name=\"SIGSYS\"/>\n\t\t<field name=\"SIGTERM\"/>\n\t\t<field name=\"SIGTRAP\"/>\n\t\t<field name=\"SIGTSTP\"/>\n\t\t<field name=\"SIGTTIN\"/>\n\t\t<field name=\"SIGTTOU\"/>\n\t\t<field name=\"SIGURG\"/>\n\t\t<field name=\"SIGUSR1\"/>\n\t\t<field name=\"SIGUSR2\"/>\n\t\t<field name=\"SIGVTALRM\"/>\n\t\t<field name=\"SIGWINCH\"/>\n\t\t<field name=\"SIGXCPU\"/>\n\t\t<field name=\"SIGXFSZ\"/>\n\t\t<field name=\"SIOCGIFADDR\"/>\n\t\t<field name=\"SIOCGIFBRDADDR\"/>\n\t\t<field name=\"SIOCGIFDSTADDR\"/>\n\t\t<field name=\"SIOCGIFNETMASK\"/>\n\t\t<field name=\"SOCK_CLOEXEC\" since=\"29\"/>\n\t\t<field name=\"SOCK_DGRAM\"/>\n\t\t<field name=\"SOCK_NONBLOCK\" since=\"29\"/>\n\t\t<field name=\"SOCK_RAW\"/>\n\t\t<field name=\"SOCK_SEQPACKET\"/>\n\t\t<field name=\"SOCK_STREAM\"/>\n\t\t<field name=\"SOL_SOCKET\"/>\n\t\t<field name=\"SO_BINDTODEVICE\"/>\n\t\t<field name=\"SO_BROADCAST\"/>\n\t\t<field name=\"SO_DEBUG\"/>\n\t\t<field name=\"SO_DONTROUTE\"/>\n\t\t<field name=\"SO_ERROR\"/>\n\t\t<field name=\"SO_KEEPALIVE\"/>\n\t\t<field name=\"SO_LINGER\"/>\n\t\t<field name=\"SO_OOBINLINE\"/>\n\t\t<field name=\"SO_PASSCRED\"/>\n\t\t<field name=\"SO_PEERCRED\"/>\n\t\t<field name=\"SO_RCVBUF\"/>\n\t\t<field name=\"SO_RCVLOWAT\"/>\n\t\t<field name=\"SO_RCVTIMEO\"/>\n\t\t<field name=\"SO_REUSEADDR\"/>\n\t\t<field name=\"SO_SNDBUF\"/>\n\t\t<field name=\"SO_SNDLOWAT\"/>\n\t\t<field name=\"SO_SNDTIMEO\"/>\n\t\t<field name=\"SO_TYPE\"/>\n\t\t<field name=\"STDERR_FILENO\"/>\n\t\t<field name=\"STDIN_FILENO\"/>\n\t\t<field name=\"STDOUT_FILENO\"/>\n\t\t<field name=\"ST_MANDLOCK\" since=\"23\"/>\n\t\t<field name=\"ST_NOATIME\" since=\"23\"/>\n\t\t<field name=\"ST_NODEV\" since=\"23\"/>\n\t\t<field name=\"ST_NODIRATIME\" since=\"23\"/>\n\t\t<field name=\"ST_NOEXEC\" since=\"23\"/>\n\t\t<field name=\"ST_NOSUID\" since=\"23\"/>\n\t\t<field name=\"ST_RDONLY\" since=\"23\"/>\n\t\t<field name=\"ST_RELATIME\" since=\"23\"/>\n\t\t<field name=\"ST_SYNCHRONOUS\" since=\"23\"/>\n\t\t<field name=\"S_IFBLK\"/>\n\t\t<field name=\"S_IFCHR\"/>\n\t\t<field name=\"S_IFDIR\"/>\n\t\t<field name=\"S_IFIFO\"/>\n\t\t<field name=\"S_IFLNK\"/>\n\t\t<field name=\"S_IFMT\"/>\n\t\t<field name=\"S_IFREG\"/>\n\t\t<field name=\"S_IFSOCK\"/>\n\t\t<field name=\"S_IRGRP\"/>\n\t\t<field name=\"S_IROTH\"/>\n\t\t<field name=\"S_IRUSR\"/>\n\t\t<field name=\"S_IRWXG\"/>\n\t\t<field name=\"S_IRWXO\"/>\n\t\t<field name=\"S_IRWXU\"/>\n\t\t<field name=\"S_ISGID\"/>\n\t\t<field name=\"S_ISUID\"/>\n\t\t<field name=\"S_ISVTX\"/>\n\t\t<field name=\"S_IWGRP\"/>\n\t\t<field name=\"S_IWOTH\"/>\n\t\t<field name=\"S_IWUSR\"/>\n\t\t<field name=\"S_IXGRP\"/>\n\t\t<field name=\"S_IXOTH\"/>\n\t\t<field name=\"S_IXUSR\"/>\n\t\t<field name=\"TCP_NODELAY\"/>\n\t\t<field name=\"TCP_USER_TIMEOUT\" since=\"26\"/>\n\t\t<field name=\"WCONTINUED\"/>\n\t\t<field name=\"WEXITED\"/>\n\t\t<field name=\"WNOHANG\"/>\n\t\t<field name=\"WNOWAIT\"/>\n\t\t<field name=\"WSTOPPED\"/>\n\t\t<field name=\"WUNTRACED\"/>\n\t\t<field name=\"W_OK\"/>\n\t\t<field name=\"X_OK\"/>\n\t\t<field name=\"_SC_2_CHAR_TERM\"/>\n\t\t<field name=\"_SC_2_C_BIND\"/>\n\t\t<field name=\"_SC_2_C_DEV\"/>\n\t\t<field name=\"_SC_2_C_VERSION\"/>\n\t\t<field name=\"_SC_2_FORT_DEV\"/>\n\t\t<field name=\"_SC_2_FORT_RUN\"/>\n\t\t<field name=\"_SC_2_LOCALEDEF\"/>\n\t\t<field name=\"_SC_2_SW_DEV\"/>\n\t\t<field name=\"_SC_2_UPE\"/>\n\t\t<field name=\"_SC_2_VERSION\"/>\n\t\t<field name=\"_SC_AIO_LISTIO_MAX\"/>\n\t\t<field name=\"_SC_AIO_MAX\"/>\n\t\t<field name=\"_SC_AIO_PRIO_DELTA_MAX\"/>\n\t\t<field name=\"_SC_ARG_MAX\"/>\n\t\t<field name=\"_SC_ASYNCHRONOUS_IO\"/>\n\t\t<field name=\"_SC_ATEXIT_MAX\"/>\n\t\t<field name=\"_SC_AVPHYS_PAGES\"/>\n\t\t<field name=\"_SC_BC_BASE_MAX\"/>\n\t\t<field name=\"_SC_BC_DIM_MAX\"/>\n\t\t<field name=\"_SC_BC_SCALE_MAX\"/>\n\t\t<field name=\"_SC_BC_STRING_MAX\"/>\n\t\t<field name=\"_SC_CHILD_MAX\"/>\n\t\t<field name=\"_SC_CLK_TCK\"/>\n\t\t<field name=\"_SC_COLL_WEIGHTS_MAX\"/>\n\t\t<field name=\"_SC_DELAYTIMER_MAX\"/>\n\t\t<field name=\"_SC_EXPR_NEST_MAX\"/>\n\t\t<field name=\"_SC_FSYNC\"/>\n\t\t<field name=\"_SC_GETGR_R_SIZE_MAX\"/>\n\t\t<field name=\"_SC_GETPW_R_SIZE_MAX\"/>\n\t\t<field name=\"_SC_IOV_MAX\"/>\n\t\t<field name=\"_SC_JOB_CONTROL\"/>\n\t\t<field name=\"_SC_LINE_MAX\"/>\n\t\t<field name=\"_SC_LOGIN_NAME_MAX\"/>\n\t\t<field name=\"_SC_MAPPED_FILES\"/>\n\t\t<field name=\"_SC_MEMLOCK\"/>\n\t\t<field name=\"_SC_MEMLOCK_RANGE\"/>\n\t\t<field name=\"_SC_MEMORY_PROTECTION\"/>\n\t\t<field name=\"_SC_MESSAGE_PASSING\"/>\n\t\t<field name=\"_SC_MQ_OPEN_MAX\"/>\n\t\t<field name=\"_SC_MQ_PRIO_MAX\"/>\n\t\t<field name=\"_SC_NGROUPS_MAX\"/>\n\t\t<field name=\"_SC_NPROCESSORS_CONF\"/>\n\t\t<field name=\"_SC_NPROCESSORS_ONLN\"/>\n\t\t<field name=\"_SC_OPEN_MAX\"/>\n\t\t<field name=\"_SC_PAGESIZE\"/>\n\t\t<field name=\"_SC_PAGE_SIZE\"/>\n\t\t<field name=\"_SC_PASS_MAX\"/>\n\t\t<field name=\"_SC_PHYS_PAGES\"/>\n\t\t<field name=\"_SC_PRIORITIZED_IO\"/>\n\t\t<field name=\"_SC_PRIORITY_SCHEDULING\"/>\n\t\t<field name=\"_SC_REALTIME_SIGNALS\"/>\n\t\t<field name=\"_SC_RE_DUP_MAX\"/>\n\t\t<field name=\"_SC_RTSIG_MAX\"/>\n\t\t<field name=\"_SC_SAVED_IDS\"/>\n\t\t<field name=\"_SC_SEMAPHORES\"/>\n\t\t<field name=\"_SC_SEM_NSEMS_MAX\"/>\n\t\t<field name=\"_SC_SEM_VALUE_MAX\"/>\n\t\t<field name=\"_SC_SHARED_MEMORY_OBJECTS\"/>\n\t\t<field name=\"_SC_SIGQUEUE_MAX\"/>\n\t\t<field name=\"_SC_STREAM_MAX\"/>\n\t\t<field name=\"_SC_SYNCHRONIZED_IO\"/>\n\t\t<field name=\"_SC_THREADS\"/>\n\t\t<field name=\"_SC_THREAD_ATTR_STACKADDR\"/>\n\t\t<field name=\"_SC_THREAD_ATTR_STACKSIZE\"/>\n\t\t<field name=\"_SC_THREAD_DESTRUCTOR_ITERATIONS\"/>\n\t\t<field name=\"_SC_THREAD_KEYS_MAX\"/>\n\t\t<field name=\"_SC_THREAD_PRIORITY_SCHEDULING\"/>\n\t\t<field name=\"_SC_THREAD_PRIO_INHERIT\"/>\n\t\t<field name=\"_SC_THREAD_PRIO_PROTECT\"/>\n\t\t<field name=\"_SC_THREAD_SAFE_FUNCTIONS\"/>\n\t\t<field name=\"_SC_THREAD_STACK_MIN\"/>\n\t\t<field name=\"_SC_THREAD_THREADS_MAX\"/>\n\t\t<field name=\"_SC_TIMERS\"/>\n\t\t<field name=\"_SC_TIMER_MAX\"/>\n\t\t<field name=\"_SC_TTY_NAME_MAX\"/>\n\t\t<field name=\"_SC_TZNAME_MAX\"/>\n\t\t<field name=\"_SC_VERSION\"/>\n\t\t<field name=\"_SC_XBS5_ILP32_OFF32\"/>\n\t\t<field name=\"_SC_XBS5_ILP32_OFFBIG\"/>\n\t\t<field name=\"_SC_XBS5_LP64_OFF64\"/>\n\t\t<field name=\"_SC_XBS5_LPBIG_OFFBIG\"/>\n\t\t<field name=\"_SC_XOPEN_CRYPT\"/>\n\t\t<field name=\"_SC_XOPEN_ENH_I18N\"/>\n\t\t<field name=\"_SC_XOPEN_LEGACY\"/>\n\t\t<field name=\"_SC_XOPEN_REALTIME\"/>\n\t\t<field name=\"_SC_XOPEN_REALTIME_THREADS\"/>\n\t\t<field name=\"_SC_XOPEN_SHM\"/>\n\t\t<field name=\"_SC_XOPEN_UNIX\"/>\n\t\t<field name=\"_SC_XOPEN_VERSION\"/>\n\t\t<field name=\"_SC_XOPEN_XCU_VERSION\"/>\n\t</class>\n\t<class name=\"android/system/StructPollfd\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"events\"/>\n\t\t<field name=\"fd\"/>\n\t\t<field name=\"revents\"/>\n\t\t<field name=\"userData\"/>\n\t</class>\n\t<class name=\"android/system/StructStat\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(JJIJIIJJJJJJJ)V\"/>\n\t\t<method name=\"&lt;init>(JJIJIIJJLandroid/system/StructTimespec;Landroid/system/StructTimespec;Landroid/system/StructTimespec;JJ)V\" since=\"27\"/>\n\t\t<field name=\"st_atim\" since=\"27\"/>\n\t\t<field name=\"st_atime\"/>\n\t\t<field name=\"st_blksize\"/>\n\t\t<field name=\"st_blocks\"/>\n\t\t<field name=\"st_ctim\" since=\"27\"/>\n\t\t<field name=\"st_ctime\"/>\n\t\t<field name=\"st_dev\"/>\n\t\t<field name=\"st_gid\"/>\n\t\t<field name=\"st_ino\"/>\n\t\t<field name=\"st_mode\"/>\n\t\t<field name=\"st_mtim\" since=\"27\"/>\n\t\t<field name=\"st_mtime\"/>\n\t\t<field name=\"st_nlink\"/>\n\t\t<field name=\"st_rdev\"/>\n\t\t<field name=\"st_size\"/>\n\t\t<field name=\"st_uid\"/>\n\t</class>\n\t<class name=\"android/system/StructStatVfs\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(JJJJJJJJJJJ)V\"/>\n\t\t<field name=\"f_bavail\"/>\n\t\t<field name=\"f_bfree\"/>\n\t\t<field name=\"f_blocks\"/>\n\t\t<field name=\"f_bsize\"/>\n\t\t<field name=\"f_favail\"/>\n\t\t<field name=\"f_ffree\"/>\n\t\t<field name=\"f_files\"/>\n\t\t<field name=\"f_flag\"/>\n\t\t<field name=\"f_frsize\"/>\n\t\t<field name=\"f_fsid\"/>\n\t\t<field name=\"f_namemax\"/>\n\t</class>\n\t<class name=\"android/system/StructTimespec\" since=\"27\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(JJ)V\"/>\n\t\t<method name=\"compareTo(Landroid/system/StructTimespec;)I\"/>\n\t\t<field name=\"tv_nsec\"/>\n\t\t<field name=\"tv_sec\"/>\n\t</class>\n\t<class name=\"android/system/StructTimeval\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"fromMillis(J)Landroid/system/StructTimeval;\"/>\n\t\t<method name=\"toMillis()J\"/>\n\t\t<field name=\"tv_sec\"/>\n\t\t<field name=\"tv_usec\"/>\n\t</class>\n\t<class name=\"android/system/StructUtsname\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<field name=\"machine\"/>\n\t\t<field name=\"nodename\"/>\n\t\t<field name=\"release\"/>\n\t\t<field name=\"sysname\"/>\n\t\t<field name=\"version\"/>\n\t</class>\n\t<class name=\"android/telecom/Call\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"answer(I)V\"/>\n\t\t<method name=\"conference(Landroid/telecom/Call;)V\"/>\n\t\t<method name=\"deflect(Landroid/net/Uri;)V\" since=\"28\"/>\n\t\t<method name=\"disconnect()V\"/>\n\t\t<method name=\"getCannedTextResponses()Ljava/util/List;\"/>\n\t\t<method name=\"getChildren()Ljava/util/List;\"/>\n\t\t<method name=\"getConferenceableCalls()Ljava/util/List;\"/>\n\t\t<method name=\"getDetails()Landroid/telecom/Call$Details;\"/>\n\t\t<method name=\"getGenericConferenceActiveChildCall()Landroid/telecom/Call;\" since=\"30\"/>\n\t\t<method name=\"getParent()Landroid/telecom/Call;\"/>\n\t\t<method name=\"getRemainingPostDialSequence()Ljava/lang/String;\"/>\n\t\t<method name=\"getRttCall()Landroid/telecom/Call$RttCall;\" since=\"26\"/>\n\t\t<method name=\"getState()I\"/>\n\t\t<method name=\"getVideoCall()Landroid/telecom/InCallService$VideoCall;\"/>\n\t\t<method name=\"handoverTo(Landroid/telecom/PhoneAccountHandle;ILandroid/os/Bundle;)V\" since=\"28\"/>\n\t\t<method name=\"hold()V\"/>\n\t\t<method name=\"isRttActive()Z\" since=\"26\"/>\n\t\t<method name=\"mergeConference()V\"/>\n\t\t<method name=\"phoneAccountSelected(Landroid/telecom/PhoneAccountHandle;Z)V\"/>\n\t\t<method name=\"playDtmfTone(C)V\"/>\n\t\t<method name=\"postDialContinue(Z)V\"/>\n\t\t<method name=\"pullExternalCall()V\" since=\"25\"/>\n\t\t<method name=\"putExtras(Landroid/os/Bundle;)V\" since=\"25\"/>\n\t\t<method name=\"registerCallback(Landroid/telecom/Call$Callback;)V\"/>\n\t\t<method name=\"registerCallback(Landroid/telecom/Call$Callback;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"reject(I)V\" since=\"30\"/>\n\t\t<method name=\"reject(ZLjava/lang/String;)V\"/>\n\t\t<method name=\"removeExtras(Ljava/util/List;)V\" since=\"25\"/>\n\t\t<method name=\"removeExtras([Ljava/lang/String;)V\" since=\"25\"/>\n\t\t<method name=\"respondToRttRequest(IZ)V\" since=\"26\"/>\n\t\t<method name=\"sendCallEvent(Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"25\"/>\n\t\t<method name=\"sendRttRequest()V\" since=\"26\"/>\n\t\t<method name=\"splitFromConference()V\"/>\n\t\t<method name=\"stopDtmfTone()V\"/>\n\t\t<method name=\"stopRtt()V\" since=\"26\"/>\n\t\t<method name=\"swapConference()V\"/>\n\t\t<method name=\"unhold()V\"/>\n\t\t<method name=\"unregisterCallback(Landroid/telecom/Call$Callback;)V\"/>\n\t\t<field name=\"AVAILABLE_PHONE_ACCOUNTS\" deprecated=\"29\"/>\n\t\t<field name=\"EXTRA_LAST_EMERGENCY_CALLBACK_TIME_MILLIS\" since=\"26\"/>\n\t\t<field name=\"EXTRA_SILENT_RINGING_REQUESTED\" since=\"29\"/>\n\t\t<field name=\"EXTRA_SUGGESTED_PHONE_ACCOUNTS\" since=\"29\"/>\n\t\t<field name=\"REJECT_REASON_DECLINED\" since=\"30\"/>\n\t\t<field name=\"REJECT_REASON_UNWANTED\" since=\"30\"/>\n\t\t<field name=\"STATE_ACTIVE\"/>\n\t\t<field name=\"STATE_AUDIO_PROCESSING\" since=\"30\"/>\n\t\t<field name=\"STATE_CONNECTING\"/>\n\t\t<field name=\"STATE_DIALING\"/>\n\t\t<field name=\"STATE_DISCONNECTED\"/>\n\t\t<field name=\"STATE_DISCONNECTING\"/>\n\t\t<field name=\"STATE_HOLDING\"/>\n\t\t<field name=\"STATE_NEW\"/>\n\t\t<field name=\"STATE_PULLING_CALL\" since=\"25\"/>\n\t\t<field name=\"STATE_RINGING\"/>\n\t\t<field name=\"STATE_SELECT_PHONE_ACCOUNT\"/>\n\t\t<field name=\"STATE_SIMULATED_RINGING\" since=\"30\"/>\n\t</class>\n\t<class name=\"android/telecom/Call$Callback\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCallDestroyed(Landroid/telecom/Call;)V\"/>\n\t\t<method name=\"onCannedTextResponsesLoaded(Landroid/telecom/Call;Ljava/util/List;)V\"/>\n\t\t<method name=\"onChildrenChanged(Landroid/telecom/Call;Ljava/util/List;)V\"/>\n\t\t<method name=\"onConferenceableCallsChanged(Landroid/telecom/Call;Ljava/util/List;)V\"/>\n\t\t<method name=\"onConnectionEvent(Landroid/telecom/Call;Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"25\"/>\n\t\t<method name=\"onDetailsChanged(Landroid/telecom/Call;Landroid/telecom/Call$Details;)V\"/>\n\t\t<method name=\"onHandoverComplete(Landroid/telecom/Call;)V\" since=\"28\"/>\n\t\t<method name=\"onHandoverFailed(Landroid/telecom/Call;I)V\" since=\"28\"/>\n\t\t<method name=\"onParentChanged(Landroid/telecom/Call;Landroid/telecom/Call;)V\"/>\n\t\t<method name=\"onPostDialWait(Landroid/telecom/Call;Ljava/lang/String;)V\"/>\n\t\t<method name=\"onRttInitiationFailure(Landroid/telecom/Call;I)V\" since=\"26\"/>\n\t\t<method name=\"onRttModeChanged(Landroid/telecom/Call;I)V\" since=\"26\"/>\n\t\t<method name=\"onRttRequest(Landroid/telecom/Call;I)V\" since=\"26\"/>\n\t\t<method name=\"onRttStatusChanged(Landroid/telecom/Call;ZLandroid/telecom/Call$RttCall;)V\" since=\"26\"/>\n\t\t<method name=\"onStateChanged(Landroid/telecom/Call;I)V\"/>\n\t\t<method name=\"onVideoCallChanged(Landroid/telecom/Call;Landroid/telecom/InCallService$VideoCall;)V\"/>\n\t\t<field name=\"HANDOVER_FAILURE_DEST_APP_REJECTED\" since=\"28\"/>\n\t\t<field name=\"HANDOVER_FAILURE_NOT_SUPPORTED\" since=\"28\"/>\n\t\t<field name=\"HANDOVER_FAILURE_ONGOING_EMERGENCY_CALL\" since=\"28\"/>\n\t\t<field name=\"HANDOVER_FAILURE_UNKNOWN\" since=\"28\"/>\n\t\t<field name=\"HANDOVER_FAILURE_USER_REJECTED\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/telecom/Call$Details\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"can(I)Z\"/>\n\t\t<method name=\"can(II)Z\"/>\n\t\t<method name=\"capabilitiesToString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getAccountHandle()Landroid/telecom/PhoneAccountHandle;\"/>\n\t\t<method name=\"getCallCapabilities()I\"/>\n\t\t<method name=\"getCallDirection()I\" since=\"29\"/>\n\t\t<method name=\"getCallProperties()I\"/>\n\t\t<method name=\"getCallerDisplayName()Ljava/lang/String;\"/>\n\t\t<method name=\"getCallerDisplayNamePresentation()I\"/>\n\t\t<method name=\"getCallerNumberVerificationStatus()I\" since=\"30\"/>\n\t\t<method name=\"getConnectTimeMillis()J\"/>\n\t\t<method name=\"getContactDisplayName()Ljava/lang/String;\" since=\"30\"/>\n\t\t<method name=\"getCreationTimeMillis()J\" since=\"26\"/>\n\t\t<method name=\"getDisconnectCause()Landroid/telecom/DisconnectCause;\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getGatewayInfo()Landroid/telecom/GatewayInfo;\"/>\n\t\t<method name=\"getHandle()Landroid/net/Uri;\"/>\n\t\t<method name=\"getHandlePresentation()I\"/>\n\t\t<method name=\"getIntentExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getStatusHints()Landroid/telecom/StatusHints;\"/>\n\t\t<method name=\"getVideoState()I\"/>\n\t\t<method name=\"hasProperty(I)Z\"/>\n\t\t<method name=\"hasProperty(II)Z\"/>\n\t\t<method name=\"propertiesToString(I)Ljava/lang/String;\"/>\n\t\t<field name=\"CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO\" since=\"24\"/>\n\t\t<field name=\"CAPABILITY_CAN_PAUSE_VIDEO\"/>\n\t\t<field name=\"CAPABILITY_CAN_PULL_CALL\" since=\"25\"/>\n\t\t<field name=\"CAPABILITY_DISCONNECT_FROM_CONFERENCE\"/>\n\t\t<field name=\"CAPABILITY_HOLD\"/>\n\t\t<field name=\"CAPABILITY_MANAGE_CONFERENCE\"/>\n\t\t<field name=\"CAPABILITY_MERGE_CONFERENCE\"/>\n\t\t<field name=\"CAPABILITY_MUTE\"/>\n\t\t<field name=\"CAPABILITY_RESPOND_VIA_TEXT\"/>\n\t\t<field name=\"CAPABILITY_SEPARATE_FROM_CONFERENCE\"/>\n\t\t<field name=\"CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL\"/>\n\t\t<field name=\"CAPABILITY_SUPPORTS_VT_LOCAL_RX\"/>\n\t\t<field name=\"CAPABILITY_SUPPORTS_VT_LOCAL_TX\"/>\n\t\t<field name=\"CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL\"/>\n\t\t<field name=\"CAPABILITY_SUPPORTS_VT_REMOTE_RX\"/>\n\t\t<field name=\"CAPABILITY_SUPPORTS_VT_REMOTE_TX\"/>\n\t\t<field name=\"CAPABILITY_SUPPORT_DEFLECT\" since=\"28\"/>\n\t\t<field name=\"CAPABILITY_SUPPORT_HOLD\"/>\n\t\t<field name=\"CAPABILITY_SWAP_CONFERENCE\"/>\n\t\t<field name=\"DIRECTION_INCOMING\" since=\"29\"/>\n\t\t<field name=\"DIRECTION_OUTGOING\" since=\"29\"/>\n\t\t<field name=\"DIRECTION_UNKNOWN\" since=\"29\"/>\n\t\t<field name=\"PROPERTY_ASSISTED_DIALING\" since=\"30\"/>\n\t\t<field name=\"PROPERTY_CONFERENCE\"/>\n\t\t<field name=\"PROPERTY_EMERGENCY_CALLBACK_MODE\"/>\n\t\t<field name=\"PROPERTY_ENTERPRISE_CALL\" since=\"24\"/>\n\t\t<field name=\"PROPERTY_GENERIC_CONFERENCE\"/>\n\t\t<field name=\"PROPERTY_HAS_CDMA_VOICE_PRIVACY\" since=\"25\"/>\n\t\t<field name=\"PROPERTY_HIGH_DEF_AUDIO\"/>\n\t\t<field name=\"PROPERTY_IS_EXTERNAL_CALL\" since=\"25\"/>\n\t\t<field name=\"PROPERTY_NETWORK_IDENTIFIED_EMERGENCY_CALL\" since=\"29\"/>\n\t\t<field name=\"PROPERTY_RTT\" since=\"28\"/>\n\t\t<field name=\"PROPERTY_SELF_MANAGED\" since=\"26\"/>\n\t\t<field name=\"PROPERTY_VOIP_AUDIO_MODE\" since=\"29\"/>\n\t\t<field name=\"PROPERTY_WIFI\"/>\n\t</class>\n\t<class name=\"android/telecom/Call$RttCall\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getRttAudioMode()I\"/>\n\t\t<method name=\"read()Ljava/lang/String;\"/>\n\t\t<method name=\"readImmediately()Ljava/lang/String;\" since=\"27\"/>\n\t\t<method name=\"setRttMode(I)V\"/>\n\t\t<method name=\"write(Ljava/lang/String;)V\"/>\n\t\t<field name=\"RTT_MODE_FULL\"/>\n\t\t<field name=\"RTT_MODE_HCO\"/>\n\t\t<field name=\"RTT_MODE_VCO\"/>\n\t</class>\n\t<class name=\"android/telecom/CallAudioState\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(ZII)V\"/>\n\t\t<method name=\"audioRouteToString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getActiveBluetoothDevice()Landroid/bluetooth/BluetoothDevice;\" since=\"28\"/>\n\t\t<method name=\"getRoute()I\"/>\n\t\t<method name=\"getSupportedBluetoothDevices()Ljava/util/Collection;\" since=\"28\"/>\n\t\t<method name=\"getSupportedRouteMask()I\"/>\n\t\t<method name=\"isMuted()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"ROUTE_BLUETOOTH\"/>\n\t\t<field name=\"ROUTE_EARPIECE\"/>\n\t\t<field name=\"ROUTE_SPEAKER\"/>\n\t\t<field name=\"ROUTE_WIRED_HEADSET\"/>\n\t\t<field name=\"ROUTE_WIRED_OR_EARPIECE\"/>\n\t</class>\n\t<class name=\"android/telecom/CallRedirectionService\" since=\"29\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"cancelCall()V\"/>\n\t\t<method name=\"onPlaceCall(Landroid/net/Uri;Landroid/telecom/PhoneAccountHandle;Z)V\"/>\n\t\t<method name=\"placeCallUnmodified()V\"/>\n\t\t<method name=\"redirectCall(Landroid/net/Uri;Landroid/telecom/PhoneAccountHandle;Z)V\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t</class>\n\t<class name=\"android/telecom/CallScreeningService\" since=\"24\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onScreenCall(Landroid/telecom/Call$Details;)V\"/>\n\t\t<method name=\"respondToCall(Landroid/telecom/Call$Details;Landroid/telecom/CallScreeningService$CallResponse;)V\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t</class>\n\t<class name=\"android/telecom/CallScreeningService$CallResponse\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getDisallowCall()Z\"/>\n\t\t<method name=\"getRejectCall()Z\"/>\n\t\t<method name=\"getSilenceCall()Z\" since=\"29\"/>\n\t\t<method name=\"getSkipCallLog()Z\"/>\n\t\t<method name=\"getSkipNotification()Z\"/>\n\t</class>\n\t<class name=\"android/telecom/CallScreeningService$CallResponse$Builder\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/telecom/CallScreeningService$CallResponse;\"/>\n\t\t<method name=\"setDisallowCall(Z)Landroid/telecom/CallScreeningService$CallResponse$Builder;\"/>\n\t\t<method name=\"setRejectCall(Z)Landroid/telecom/CallScreeningService$CallResponse$Builder;\"/>\n\t\t<method name=\"setSilenceCall(Z)Landroid/telecom/CallScreeningService$CallResponse$Builder;\" since=\"29\"/>\n\t\t<method name=\"setSkipCallLog(Z)Landroid/telecom/CallScreeningService$CallResponse$Builder;\"/>\n\t\t<method name=\"setSkipNotification(Z)Landroid/telecom/CallScreeningService$CallResponse$Builder;\"/>\n\t</class>\n\t<class name=\"android/telecom/Conference\" since=\"23\">\n\t\t<extends name=\"android/telecom/Conferenceable\"/>\n\t\t<method name=\"&lt;init>(Landroid/telecom/PhoneAccountHandle;)V\"/>\n\t\t<method name=\"addConnection(Landroid/telecom/Connection;)Z\"/>\n\t\t<method name=\"destroy()V\"/>\n\t\t<method name=\"getCallAudioState()Landroid/telecom/CallAudioState;\"/>\n\t\t<method name=\"getConferenceableConnections()Ljava/util/List;\"/>\n\t\t<method name=\"getConnectionCapabilities()I\"/>\n\t\t<method name=\"getConnectionProperties()I\" since=\"25\"/>\n\t\t<method name=\"getConnectionStartElapsedRealtimeMillis()J\" since=\"30\"/>\n\t\t<method name=\"getConnectionTime()J\"/>\n\t\t<method name=\"getConnections()Ljava/util/List;\"/>\n\t\t<method name=\"getDisconnectCause()Landroid/telecom/DisconnectCause;\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getPhoneAccountHandle()Landroid/telecom/PhoneAccountHandle;\"/>\n\t\t<method name=\"getState()I\"/>\n\t\t<method name=\"getStatusHints()Landroid/telecom/StatusHints;\"/>\n\t\t<method name=\"getVideoProvider()Landroid/telecom/Connection$VideoProvider;\"/>\n\t\t<method name=\"getVideoState()I\"/>\n\t\t<method name=\"onCallAudioStateChanged(Landroid/telecom/CallAudioState;)V\"/>\n\t\t<method name=\"onConnectionAdded(Landroid/telecom/Connection;)V\"/>\n\t\t<method name=\"onDisconnect()V\"/>\n\t\t<method name=\"onExtrasChanged(Landroid/os/Bundle;)V\" since=\"25\"/>\n\t\t<method name=\"onHold()V\"/>\n\t\t<method name=\"onMerge()V\"/>\n\t\t<method name=\"onMerge(Landroid/telecom/Connection;)V\"/>\n\t\t<method name=\"onPlayDtmfTone(C)V\"/>\n\t\t<method name=\"onSeparate(Landroid/telecom/Connection;)V\"/>\n\t\t<method name=\"onStopDtmfTone()V\"/>\n\t\t<method name=\"onSwap()V\"/>\n\t\t<method name=\"onUnhold()V\"/>\n\t\t<method name=\"putExtras(Landroid/os/Bundle;)V\" since=\"25\"/>\n\t\t<method name=\"removeConnection(Landroid/telecom/Connection;)V\"/>\n\t\t<method name=\"removeExtras(Ljava/util/List;)V\" since=\"25\"/>\n\t\t<method name=\"removeExtras([Ljava/lang/String;)V\" since=\"25\"/>\n\t\t<method name=\"sendConferenceEvent(Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"30\"/>\n\t\t<method name=\"setActive()V\"/>\n\t\t<method name=\"setConferenceableConnections(Ljava/util/List;)V\"/>\n\t\t<method name=\"setConnectionCapabilities(I)V\"/>\n\t\t<method name=\"setConnectionProperties(I)V\" since=\"25\"/>\n\t\t<method name=\"setConnectionStartElapsedRealTime(J)V\" since=\"28\" deprecated=\"30\"/>\n\t\t<method name=\"setConnectionStartElapsedRealtimeMillis(J)V\" since=\"30\"/>\n\t\t<method name=\"setConnectionTime(J)V\"/>\n\t\t<method name=\"setDialing()V\"/>\n\t\t<method name=\"setDisconnected(Landroid/telecom/DisconnectCause;)V\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"setOnHold()V\"/>\n\t\t<method name=\"setStatusHints(Landroid/telecom/StatusHints;)V\"/>\n\t\t<method name=\"setVideoProvider(Landroid/telecom/Connection;Landroid/telecom/Connection$VideoProvider;)V\"/>\n\t\t<method name=\"setVideoState(Landroid/telecom/Connection;I)V\"/>\n\t\t<field name=\"CONNECT_TIME_NOT_SPECIFIED\"/>\n\t</class>\n\t<class name=\"android/telecom/Conferenceable\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/telecom/Connection\" since=\"23\">\n\t\t<extends name=\"android/telecom/Conferenceable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"capabilitiesToString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"createCanceledConnection()Landroid/telecom/Connection;\"/>\n\t\t<method name=\"createFailedConnection(Landroid/telecom/DisconnectCause;)Landroid/telecom/Connection;\"/>\n\t\t<method name=\"destroy()V\"/>\n\t\t<method name=\"getAddress()Landroid/net/Uri;\"/>\n\t\t<method name=\"getAddressPresentation()I\"/>\n\t\t<method name=\"getAudioModeIsVoip()Z\"/>\n\t\t<method name=\"getCallAudioState()Landroid/telecom/CallAudioState;\"/>\n\t\t<method name=\"getCallerDisplayName()Ljava/lang/String;\"/>\n\t\t<method name=\"getCallerDisplayNamePresentation()I\"/>\n\t\t<method name=\"getCallerNumberVerificationStatus()I\" since=\"30\"/>\n\t\t<method name=\"getConference()Landroid/telecom/Conference;\"/>\n\t\t<method name=\"getConferenceables()Ljava/util/List;\"/>\n\t\t<method name=\"getConnectionCapabilities()I\"/>\n\t\t<method name=\"getConnectionProperties()I\" since=\"25\"/>\n\t\t<method name=\"getDisconnectCause()Landroid/telecom/DisconnectCause;\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getState()I\"/>\n\t\t<method name=\"getStatusHints()Landroid/telecom/StatusHints;\"/>\n\t\t<method name=\"getVideoProvider()Landroid/telecom/Connection$VideoProvider;\"/>\n\t\t<method name=\"getVideoState()I\" since=\"30\"/>\n\t\t<method name=\"handleRttUpgradeResponse(Landroid/telecom/Connection$RttTextStream;)V\" since=\"28\"/>\n\t\t<method name=\"isRingbackRequested()Z\"/>\n\t\t<method name=\"notifyConferenceMergeFailed()V\" since=\"30\"/>\n\t\t<method name=\"onAbort()V\"/>\n\t\t<method name=\"onAnswer()V\"/>\n\t\t<method name=\"onAnswer(I)V\"/>\n\t\t<method name=\"onCallAudioStateChanged(Landroid/telecom/CallAudioState;)V\"/>\n\t\t<method name=\"onCallEvent(Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"25\"/>\n\t\t<method name=\"onDeflect(Landroid/net/Uri;)V\" since=\"28\"/>\n\t\t<method name=\"onDisconnect()V\"/>\n\t\t<method name=\"onExtrasChanged(Landroid/os/Bundle;)V\" since=\"25\"/>\n\t\t<method name=\"onHandoverComplete()V\" since=\"28\"/>\n\t\t<method name=\"onHold()V\"/>\n\t\t<method name=\"onPlayDtmfTone(C)V\"/>\n\t\t<method name=\"onPostDialContinue(Z)V\"/>\n\t\t<method name=\"onPullExternalCall()V\" since=\"25\"/>\n\t\t<method name=\"onReject()V\"/>\n\t\t<method name=\"onReject(I)V\" since=\"30\"/>\n\t\t<method name=\"onReject(Ljava/lang/String;)V\" since=\"24\"/>\n\t\t<method name=\"onSeparate()V\"/>\n\t\t<method name=\"onShowIncomingCallUi()V\" since=\"26\"/>\n\t\t<method name=\"onSilence()V\" since=\"29\"/>\n\t\t<method name=\"onStartRtt(Landroid/telecom/Connection$RttTextStream;)V\" since=\"28\"/>\n\t\t<method name=\"onStateChanged(I)V\"/>\n\t\t<method name=\"onStopDtmfTone()V\"/>\n\t\t<method name=\"onStopRtt()V\" since=\"28\"/>\n\t\t<method name=\"onUnhold()V\"/>\n\t\t<method name=\"propertiesToString(I)Ljava/lang/String;\" since=\"25\"/>\n\t\t<method name=\"putExtras(Landroid/os/Bundle;)V\" since=\"25\"/>\n\t\t<method name=\"removeExtras(Ljava/util/List;)V\" since=\"25\"/>\n\t\t<method name=\"removeExtras([Ljava/lang/String;)V\" since=\"25\"/>\n\t\t<method name=\"requestBluetoothAudio(Landroid/bluetooth/BluetoothDevice;)V\" since=\"28\"/>\n\t\t<method name=\"sendConnectionEvent(Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"25\"/>\n\t\t<method name=\"sendRemoteRttRequest()V\" since=\"28\"/>\n\t\t<method name=\"sendRttInitiationFailure(I)V\" since=\"28\"/>\n\t\t<method name=\"sendRttInitiationSuccess()V\" since=\"28\"/>\n\t\t<method name=\"sendRttSessionRemotelyTerminated()V\" since=\"28\"/>\n\t\t<method name=\"setActive()V\"/>\n\t\t<method name=\"setAddress(Landroid/net/Uri;I)V\"/>\n\t\t<method name=\"setAudioModeIsVoip(Z)V\"/>\n\t\t<method name=\"setAudioRoute(I)V\" since=\"26\"/>\n\t\t<method name=\"setCallerDisplayName(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"setCallerNumberVerificationStatus(I)V\" since=\"30\"/>\n\t\t<method name=\"setConferenceableConnections(Ljava/util/List;)V\"/>\n\t\t<method name=\"setConferenceables(Ljava/util/List;)V\"/>\n\t\t<method name=\"setConnectionCapabilities(I)V\"/>\n\t\t<method name=\"setConnectionProperties(I)V\" since=\"25\"/>\n\t\t<method name=\"setDialing()V\"/>\n\t\t<method name=\"setDisconnected(Landroid/telecom/DisconnectCause;)V\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"setInitialized()V\"/>\n\t\t<method name=\"setInitializing()V\"/>\n\t\t<method name=\"setNextPostDialChar(C)V\"/>\n\t\t<method name=\"setOnHold()V\"/>\n\t\t<method name=\"setPostDialWait(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setPulling()V\" since=\"25\"/>\n\t\t<method name=\"setRingbackRequested(Z)V\"/>\n\t\t<method name=\"setRinging()V\"/>\n\t\t<method name=\"setStatusHints(Landroid/telecom/StatusHints;)V\"/>\n\t\t<method name=\"setVideoProvider(Landroid/telecom/Connection$VideoProvider;)V\"/>\n\t\t<method name=\"setVideoState(I)V\"/>\n\t\t<method name=\"stateToString(I)Ljava/lang/String;\"/>\n\t\t<field name=\"AUDIO_CODEC_AMR\" since=\"30\"/>\n\t\t<field name=\"AUDIO_CODEC_AMR_WB\" since=\"30\"/>\n\t\t<field name=\"AUDIO_CODEC_EVRC\" since=\"30\"/>\n\t\t<field name=\"AUDIO_CODEC_EVRC_B\" since=\"30\"/>\n\t\t<field name=\"AUDIO_CODEC_EVRC_NW\" since=\"30\"/>\n\t\t<field name=\"AUDIO_CODEC_EVRC_WB\" since=\"30\"/>\n\t\t<field name=\"AUDIO_CODEC_EVS_FB\" since=\"30\"/>\n\t\t<field name=\"AUDIO_CODEC_EVS_NB\" since=\"30\"/>\n\t\t<field name=\"AUDIO_CODEC_EVS_SWB\" since=\"30\"/>\n\t\t<field name=\"AUDIO_CODEC_EVS_WB\" since=\"30\"/>\n\t\t<field name=\"AUDIO_CODEC_G711A\" since=\"30\"/>\n\t\t<field name=\"AUDIO_CODEC_G711AB\" since=\"30\"/>\n\t\t<field name=\"AUDIO_CODEC_G711U\" since=\"30\"/>\n\t\t<field name=\"AUDIO_CODEC_G722\" since=\"30\"/>\n\t\t<field name=\"AUDIO_CODEC_G723\" since=\"30\"/>\n\t\t<field name=\"AUDIO_CODEC_G729\" since=\"30\"/>\n\t\t<field name=\"AUDIO_CODEC_GSM_EFR\" since=\"30\"/>\n\t\t<field name=\"AUDIO_CODEC_GSM_FR\" since=\"30\"/>\n\t\t<field name=\"AUDIO_CODEC_GSM_HR\" since=\"30\"/>\n\t\t<field name=\"AUDIO_CODEC_NONE\" since=\"30\"/>\n\t\t<field name=\"AUDIO_CODEC_QCELP13K\" since=\"30\"/>\n\t\t<field name=\"CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO\" since=\"24\"/>\n\t\t<field name=\"CAPABILITY_CAN_PAUSE_VIDEO\"/>\n\t\t<field name=\"CAPABILITY_CAN_PULL_CALL\" since=\"25\"/>\n\t\t<field name=\"CAPABILITY_CAN_SEND_RESPONSE_VIA_CONNECTION\" since=\"24\"/>\n\t\t<field name=\"CAPABILITY_CAN_UPGRADE_TO_VIDEO\" deprecated=\"29\"/>\n\t\t<field name=\"CAPABILITY_DISCONNECT_FROM_CONFERENCE\"/>\n\t\t<field name=\"CAPABILITY_HOLD\"/>\n\t\t<field name=\"CAPABILITY_MANAGE_CONFERENCE\"/>\n\t\t<field name=\"CAPABILITY_MERGE_CONFERENCE\"/>\n\t\t<field name=\"CAPABILITY_MUTE\"/>\n\t\t<field name=\"CAPABILITY_RESPOND_VIA_TEXT\"/>\n\t\t<field name=\"CAPABILITY_SEPARATE_FROM_CONFERENCE\"/>\n\t\t<field name=\"CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL\"/>\n\t\t<field name=\"CAPABILITY_SUPPORTS_VT_LOCAL_RX\"/>\n\t\t<field name=\"CAPABILITY_SUPPORTS_VT_LOCAL_TX\"/>\n\t\t<field name=\"CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL\"/>\n\t\t<field name=\"CAPABILITY_SUPPORTS_VT_REMOTE_RX\"/>\n\t\t<field name=\"CAPABILITY_SUPPORTS_VT_REMOTE_TX\"/>\n\t\t<field name=\"CAPABILITY_SUPPORT_DEFLECT\" since=\"28\"/>\n\t\t<field name=\"CAPABILITY_SUPPORT_HOLD\"/>\n\t\t<field name=\"CAPABILITY_SWAP_CONFERENCE\"/>\n\t\t<field name=\"EVENT_CALL_HOLD_FAILED\" since=\"30\"/>\n\t\t<field name=\"EVENT_CALL_MERGE_FAILED\" since=\"25\"/>\n\t\t<field name=\"EVENT_CALL_PULL_FAILED\" since=\"25\"/>\n\t\t<field name=\"EVENT_CALL_REMOTELY_HELD\" since=\"30\"/>\n\t\t<field name=\"EVENT_CALL_REMOTELY_UNHELD\" since=\"30\"/>\n\t\t<field name=\"EVENT_CALL_SWITCH_FAILED\" since=\"30\"/>\n\t\t<field name=\"EVENT_MERGE_COMPLETE\" since=\"30\"/>\n\t\t<field name=\"EVENT_MERGE_START\" since=\"30\"/>\n\t\t<field name=\"EVENT_ON_HOLD_TONE_END\" since=\"30\"/>\n\t\t<field name=\"EVENT_ON_HOLD_TONE_START\" since=\"30\"/>\n\t\t<field name=\"EVENT_RTT_AUDIO_INDICATION_CHANGED\" since=\"29\"/>\n\t\t<field name=\"EXTRA_ANSWERING_DROPS_FG_CALL\" since=\"25\"/>\n\t\t<field name=\"EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME\" since=\"26\"/>\n\t\t<field name=\"EXTRA_AUDIO_CODEC\" since=\"30\"/>\n\t\t<field name=\"EXTRA_CALL_SUBJECT\"/>\n\t\t<field name=\"EXTRA_CHILD_ADDRESS\"/>\n\t\t<field name=\"EXTRA_IS_RTT_AUDIO_PRESENT\" since=\"29\"/>\n\t\t<field name=\"EXTRA_LAST_FORWARDED_NUMBER\"/>\n\t\t<field name=\"EXTRA_SIP_INVITE\" since=\"29\"/>\n\t\t<field name=\"PROPERTY_ASSISTED_DIALING\" since=\"30\"/>\n\t\t<field name=\"PROPERTY_HAS_CDMA_VOICE_PRIVACY\" since=\"25\"/>\n\t\t<field name=\"PROPERTY_HIGH_DEF_AUDIO\" since=\"30\"/>\n\t\t<field name=\"PROPERTY_IS_EXTERNAL_CALL\" since=\"25\"/>\n\t\t<field name=\"PROPERTY_IS_RTT\" since=\"28\"/>\n\t\t<field name=\"PROPERTY_NETWORK_IDENTIFIED_EMERGENCY_CALL\" since=\"30\"/>\n\t\t<field name=\"PROPERTY_SELF_MANAGED\" since=\"26\"/>\n\t\t<field name=\"PROPERTY_WIFI\" since=\"30\"/>\n\t\t<field name=\"STATE_ACTIVE\"/>\n\t\t<field name=\"STATE_DIALING\"/>\n\t\t<field name=\"STATE_DISCONNECTED\"/>\n\t\t<field name=\"STATE_HOLDING\"/>\n\t\t<field name=\"STATE_INITIALIZING\"/>\n\t\t<field name=\"STATE_NEW\"/>\n\t\t<field name=\"STATE_PULLING_CALL\" since=\"25\"/>\n\t\t<field name=\"STATE_RINGING\"/>\n\t\t<field name=\"VERIFICATION_STATUS_FAILED\" since=\"30\"/>\n\t\t<field name=\"VERIFICATION_STATUS_NOT_VERIFIED\" since=\"30\"/>\n\t\t<field name=\"VERIFICATION_STATUS_PASSED\" since=\"30\"/>\n\t</class>\n\t<class name=\"android/telecom/Connection$RttModifyStatus\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"SESSION_MODIFY_REQUEST_FAIL\"/>\n\t\t<field name=\"SESSION_MODIFY_REQUEST_INVALID\"/>\n\t\t<field name=\"SESSION_MODIFY_REQUEST_REJECTED_BY_REMOTE\"/>\n\t\t<field name=\"SESSION_MODIFY_REQUEST_SUCCESS\"/>\n\t\t<field name=\"SESSION_MODIFY_REQUEST_TIMED_OUT\"/>\n\t</class>\n\t<class name=\"android/telecom/Connection$RttTextStream\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"read()Ljava/lang/String;\"/>\n\t\t<method name=\"readImmediately()Ljava/lang/String;\"/>\n\t\t<method name=\"write(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/telecom/Connection$VideoProvider\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"changeCameraCapabilities(Landroid/telecom/VideoProfile$CameraCapabilities;)V\"/>\n\t\t<method name=\"changePeerDimensions(II)V\"/>\n\t\t<method name=\"changeVideoQuality(I)V\"/>\n\t\t<method name=\"handleCallSessionEvent(I)V\"/>\n\t\t<method name=\"onRequestCameraCapabilities()V\"/>\n\t\t<method name=\"onRequestConnectionDataUsage()V\"/>\n\t\t<method name=\"onSendSessionModifyRequest(Landroid/telecom/VideoProfile;Landroid/telecom/VideoProfile;)V\"/>\n\t\t<method name=\"onSendSessionModifyResponse(Landroid/telecom/VideoProfile;)V\"/>\n\t\t<method name=\"onSetCamera(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onSetDeviceOrientation(I)V\"/>\n\t\t<method name=\"onSetDisplaySurface(Landroid/view/Surface;)V\"/>\n\t\t<method name=\"onSetPauseImage(Landroid/net/Uri;)V\"/>\n\t\t<method name=\"onSetPreviewSurface(Landroid/view/Surface;)V\"/>\n\t\t<method name=\"onSetZoom(F)V\"/>\n\t\t<method name=\"receiveSessionModifyRequest(Landroid/telecom/VideoProfile;)V\"/>\n\t\t<method name=\"receiveSessionModifyResponse(ILandroid/telecom/VideoProfile;Landroid/telecom/VideoProfile;)V\"/>\n\t\t<method name=\"setCallDataUsage(J)V\"/>\n\t\t<field name=\"SESSION_EVENT_CAMERA_FAILURE\"/>\n\t\t<field name=\"SESSION_EVENT_CAMERA_PERMISSION_ERROR\" since=\"26\"/>\n\t\t<field name=\"SESSION_EVENT_CAMERA_READY\"/>\n\t\t<field name=\"SESSION_EVENT_RX_PAUSE\"/>\n\t\t<field name=\"SESSION_EVENT_RX_RESUME\"/>\n\t\t<field name=\"SESSION_EVENT_TX_START\"/>\n\t\t<field name=\"SESSION_EVENT_TX_STOP\"/>\n\t\t<field name=\"SESSION_MODIFY_REQUEST_FAIL\"/>\n\t\t<field name=\"SESSION_MODIFY_REQUEST_INVALID\"/>\n\t\t<field name=\"SESSION_MODIFY_REQUEST_REJECTED_BY_REMOTE\"/>\n\t\t<field name=\"SESSION_MODIFY_REQUEST_SUCCESS\"/>\n\t\t<field name=\"SESSION_MODIFY_REQUEST_TIMED_OUT\"/>\n\t</class>\n\t<class name=\"android/telecom/ConnectionRequest\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/telecom/PhoneAccountHandle;Landroid/net/Uri;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/telecom/PhoneAccountHandle;Landroid/net/Uri;Landroid/os/Bundle;I)V\"/>\n\t\t<method name=\"getAccountHandle()Landroid/telecom/PhoneAccountHandle;\"/>\n\t\t<method name=\"getAddress()Landroid/net/Uri;\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getParticipants()Ljava/util/List;\" since=\"30\"/>\n\t\t<method name=\"getRttTextStream()Landroid/telecom/Connection$RttTextStream;\" since=\"28\"/>\n\t\t<method name=\"getVideoState()I\"/>\n\t\t<method name=\"isAdhocConferenceCall()Z\" since=\"30\"/>\n\t\t<method name=\"isRequestingRtt()Z\" since=\"28\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telecom/ConnectionService\" since=\"23\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addConference(Landroid/telecom/Conference;)V\"/>\n\t\t<method name=\"addExistingConnection(Landroid/telecom/PhoneAccountHandle;Landroid/telecom/Connection;)V\"/>\n\t\t<method name=\"conferenceRemoteConnections(Landroid/telecom/RemoteConnection;Landroid/telecom/RemoteConnection;)V\"/>\n\t\t<method name=\"connectionServiceFocusReleased()V\" since=\"28\"/>\n\t\t<method name=\"createRemoteIncomingConnection(Landroid/telecom/PhoneAccountHandle;Landroid/telecom/ConnectionRequest;)Landroid/telecom/RemoteConnection;\"/>\n\t\t<method name=\"createRemoteOutgoingConnection(Landroid/telecom/PhoneAccountHandle;Landroid/telecom/ConnectionRequest;)Landroid/telecom/RemoteConnection;\"/>\n\t\t<method name=\"getAllConferences()Ljava/util/Collection;\" since=\"24\"/>\n\t\t<method name=\"getAllConnections()Ljava/util/Collection;\"/>\n\t\t<method name=\"onConference(Landroid/telecom/Connection;Landroid/telecom/Connection;)V\"/>\n\t\t<method name=\"onConnectionServiceFocusGained()V\" since=\"28\"/>\n\t\t<method name=\"onConnectionServiceFocusLost()V\" since=\"28\"/>\n\t\t<method name=\"onCreateIncomingConnection(Landroid/telecom/PhoneAccountHandle;Landroid/telecom/ConnectionRequest;)Landroid/telecom/Connection;\"/>\n\t\t<method name=\"onCreateIncomingConnectionFailed(Landroid/telecom/PhoneAccountHandle;Landroid/telecom/ConnectionRequest;)V\" since=\"26\"/>\n\t\t<method name=\"onCreateIncomingHandoverConnection(Landroid/telecom/PhoneAccountHandle;Landroid/telecom/ConnectionRequest;)Landroid/telecom/Connection;\" since=\"28\"/>\n\t\t<method name=\"onCreateOutgoingConnection(Landroid/telecom/PhoneAccountHandle;Landroid/telecom/ConnectionRequest;)Landroid/telecom/Connection;\"/>\n\t\t<method name=\"onCreateOutgoingConnectionFailed(Landroid/telecom/PhoneAccountHandle;Landroid/telecom/ConnectionRequest;)V\" since=\"26\"/>\n\t\t<method name=\"onCreateOutgoingHandoverConnection(Landroid/telecom/PhoneAccountHandle;Landroid/telecom/ConnectionRequest;)Landroid/telecom/Connection;\" since=\"28\"/>\n\t\t<method name=\"onHandoverFailed(Landroid/telecom/ConnectionRequest;I)V\" since=\"28\"/>\n\t\t<method name=\"onRemoteConferenceAdded(Landroid/telecom/RemoteConference;)V\"/>\n\t\t<method name=\"onRemoteExistingConnectionAdded(Landroid/telecom/RemoteConnection;)V\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t</class>\n\t<class name=\"android/telecom/DisconnectCause\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/String;)V\"/>\n\t\t<method name=\"getCode()I\"/>\n\t\t<method name=\"getDescription()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getLabel()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getReason()Ljava/lang/String;\"/>\n\t\t<method name=\"getTone()I\"/>\n\t\t<field name=\"ANSWERED_ELSEWHERE\" since=\"25\"/>\n\t\t<field name=\"BUSY\"/>\n\t\t<field name=\"CALL_PULLED\" since=\"25\"/>\n\t\t<field name=\"CANCELED\"/>\n\t\t<field name=\"CONNECTION_MANAGER_NOT_SUPPORTED\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"ERROR\"/>\n\t\t<field name=\"LOCAL\"/>\n\t\t<field name=\"MISSED\"/>\n\t\t<field name=\"OTHER\"/>\n\t\t<field name=\"REASON_EMERGENCY_CALL_PLACED\" since=\"30\"/>\n\t\t<field name=\"REJECTED\"/>\n\t\t<field name=\"REMOTE\"/>\n\t\t<field name=\"RESTRICTED\"/>\n\t\t<field name=\"UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/telecom/GatewayInfo\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Landroid/net/Uri;Landroid/net/Uri;)V\"/>\n\t\t<method name=\"getGatewayAddress()Landroid/net/Uri;\"/>\n\t\t<method name=\"getGatewayProviderPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getOriginalAddress()Landroid/net/Uri;\"/>\n\t\t<method name=\"isEmpty()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telecom/InCallService\" since=\"23\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"canAddCall()Z\"/>\n\t\t<method name=\"getCallAudioState()Landroid/telecom/CallAudioState;\"/>\n\t\t<method name=\"getCalls()Ljava/util/List;\"/>\n\t\t<method name=\"onBringToForeground(Z)V\"/>\n\t\t<method name=\"onCallAdded(Landroid/telecom/Call;)V\"/>\n\t\t<method name=\"onCallAudioStateChanged(Landroid/telecom/CallAudioState;)V\"/>\n\t\t<method name=\"onCallRemoved(Landroid/telecom/Call;)V\"/>\n\t\t<method name=\"onCanAddCallChanged(Z)V\"/>\n\t\t<method name=\"onConnectionEvent(Landroid/telecom/Call;Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"25\"/>\n\t\t<method name=\"onSilenceRinger()V\" since=\"24\"/>\n\t\t<method name=\"requestBluetoothAudio(Landroid/bluetooth/BluetoothDevice;)V\" since=\"28\"/>\n\t\t<method name=\"setAudioRoute(I)V\"/>\n\t\t<method name=\"setMuted(Z)V\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t</class>\n\t<class name=\"android/telecom/InCallService$VideoCall\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"registerCallback(Landroid/telecom/InCallService$VideoCall$Callback;)V\"/>\n\t\t<method name=\"registerCallback(Landroid/telecom/InCallService$VideoCall$Callback;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"requestCallDataUsage()V\"/>\n\t\t<method name=\"requestCameraCapabilities()V\"/>\n\t\t<method name=\"sendSessionModifyRequest(Landroid/telecom/VideoProfile;)V\"/>\n\t\t<method name=\"sendSessionModifyResponse(Landroid/telecom/VideoProfile;)V\"/>\n\t\t<method name=\"setCamera(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setDeviceOrientation(I)V\"/>\n\t\t<method name=\"setDisplaySurface(Landroid/view/Surface;)V\"/>\n\t\t<method name=\"setPauseImage(Landroid/net/Uri;)V\"/>\n\t\t<method name=\"setPreviewSurface(Landroid/view/Surface;)V\"/>\n\t\t<method name=\"setZoom(F)V\"/>\n\t\t<method name=\"unregisterCallback(Landroid/telecom/InCallService$VideoCall$Callback;)V\"/>\n\t</class>\n\t<class name=\"android/telecom/InCallService$VideoCall$Callback\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCallDataUsageChanged(J)V\"/>\n\t\t<method name=\"onCallSessionEvent(I)V\"/>\n\t\t<method name=\"onCameraCapabilitiesChanged(Landroid/telecom/VideoProfile$CameraCapabilities;)V\"/>\n\t\t<method name=\"onPeerDimensionsChanged(II)V\"/>\n\t\t<method name=\"onSessionModifyRequestReceived(Landroid/telecom/VideoProfile;)V\"/>\n\t\t<method name=\"onSessionModifyResponseReceived(ILandroid/telecom/VideoProfile;Landroid/telecom/VideoProfile;)V\"/>\n\t\t<method name=\"onVideoQualityChanged(I)V\"/>\n\t</class>\n\t<class name=\"android/telecom/PhoneAccount\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"builder(Landroid/telecom/PhoneAccountHandle;Ljava/lang/CharSequence;)Landroid/telecom/PhoneAccount$Builder;\"/>\n\t\t<method name=\"getAccountHandle()Landroid/telecom/PhoneAccountHandle;\"/>\n\t\t<method name=\"getAddress()Landroid/net/Uri;\"/>\n\t\t<method name=\"getCapabilities()I\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\" since=\"24\"/>\n\t\t<method name=\"getHighlightColor()I\"/>\n\t\t<method name=\"getIcon()Landroid/graphics/drawable/Icon;\"/>\n\t\t<method name=\"getLabel()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getShortDescription()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getSubscriptionAddress()Landroid/net/Uri;\"/>\n\t\t<method name=\"getSupportedUriSchemes()Ljava/util/List;\"/>\n\t\t<method name=\"hasCapabilities(I)Z\"/>\n\t\t<method name=\"isEnabled()Z\"/>\n\t\t<method name=\"supportsUriScheme(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"toBuilder()Landroid/telecom/PhoneAccount$Builder;\"/>\n\t\t<field name=\"CAPABILITY_ADHOC_CONFERENCE_CALLING\" since=\"30\"/>\n\t\t<field name=\"CAPABILITY_CALL_PROVIDER\"/>\n\t\t<field name=\"CAPABILITY_CALL_SUBJECT\"/>\n\t\t<field name=\"CAPABILITY_CONNECTION_MANAGER\"/>\n\t\t<field name=\"CAPABILITY_PLACE_EMERGENCY_CALLS\"/>\n\t\t<field name=\"CAPABILITY_RTT\" since=\"26\"/>\n\t\t<field name=\"CAPABILITY_SELF_MANAGED\" since=\"26\"/>\n\t\t<field name=\"CAPABILITY_SIM_SUBSCRIPTION\"/>\n\t\t<field name=\"CAPABILITY_SUPPORTS_VIDEO_CALLING\" since=\"26\"/>\n\t\t<field name=\"CAPABILITY_VIDEO_CALLING\"/>\n\t\t<field name=\"CAPABILITY_VIDEO_CALLING_RELIES_ON_PRESENCE\" since=\"24\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"EXTRA_CALL_SUBJECT_CHARACTER_ENCODING\" since=\"24\"/>\n\t\t<field name=\"EXTRA_CALL_SUBJECT_MAX_LENGTH\" since=\"24\"/>\n\t\t<field name=\"EXTRA_LOG_SELF_MANAGED_CALLS\" since=\"28\"/>\n\t\t<field name=\"EXTRA_SUPPORTS_HANDOVER_FROM\" since=\"28\"/>\n\t\t<field name=\"EXTRA_SUPPORTS_HANDOVER_TO\" since=\"28\"/>\n\t\t<field name=\"NO_HIGHLIGHT_COLOR\"/>\n\t\t<field name=\"NO_RESOURCE_ID\"/>\n\t\t<field name=\"SCHEME_SIP\"/>\n\t\t<field name=\"SCHEME_TEL\"/>\n\t\t<field name=\"SCHEME_VOICEMAIL\"/>\n\t</class>\n\t<class name=\"android/telecom/PhoneAccount$Builder\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/telecom/PhoneAccount;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/telecom/PhoneAccountHandle;Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"addSupportedUriScheme(Ljava/lang/String;)Landroid/telecom/PhoneAccount$Builder;\"/>\n\t\t<method name=\"build()Landroid/telecom/PhoneAccount;\"/>\n\t\t<method name=\"setAddress(Landroid/net/Uri;)Landroid/telecom/PhoneAccount$Builder;\"/>\n\t\t<method name=\"setCapabilities(I)Landroid/telecom/PhoneAccount$Builder;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/telecom/PhoneAccount$Builder;\" since=\"24\"/>\n\t\t<method name=\"setHighlightColor(I)Landroid/telecom/PhoneAccount$Builder;\"/>\n\t\t<method name=\"setIcon(Landroid/graphics/drawable/Icon;)Landroid/telecom/PhoneAccount$Builder;\"/>\n\t\t<method name=\"setShortDescription(Ljava/lang/CharSequence;)Landroid/telecom/PhoneAccount$Builder;\"/>\n\t\t<method name=\"setSubscriptionAddress(Landroid/net/Uri;)Landroid/telecom/PhoneAccount$Builder;\"/>\n\t\t<method name=\"setSupportedUriSchemes(Ljava/util/List;)Landroid/telecom/PhoneAccount$Builder;\"/>\n\t</class>\n\t<class name=\"android/telecom/PhoneAccountHandle\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/ComponentName;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/ComponentName;Ljava/lang/String;Landroid/os/UserHandle;)V\"/>\n\t\t<method name=\"getComponentName()Landroid/content/ComponentName;\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\"/>\n\t\t<method name=\"getUserHandle()Landroid/os/UserHandle;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telecom/PhoneAccountSuggestion\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/telecom/PhoneAccountHandle;IZ)V\"/>\n\t\t<method name=\"getPhoneAccountHandle()Landroid/telecom/PhoneAccountHandle;\"/>\n\t\t<method name=\"getReason()I\"/>\n\t\t<method name=\"shouldAutoSelect()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"REASON_FREQUENT\"/>\n\t\t<field name=\"REASON_INTRA_CARRIER\"/>\n\t\t<field name=\"REASON_NONE\"/>\n\t\t<field name=\"REASON_OTHER\"/>\n\t\t<field name=\"REASON_USER_SET\"/>\n\t</class>\n\t<class name=\"android/telecom/RemoteConference\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"disconnect()V\"/>\n\t\t<method name=\"getConferenceableConnections()Ljava/util/List;\"/>\n\t\t<method name=\"getConnectionCapabilities()I\"/>\n\t\t<method name=\"getConnectionProperties()I\" since=\"24\"/>\n\t\t<method name=\"getConnections()Ljava/util/List;\"/>\n\t\t<method name=\"getDisconnectCause()Landroid/telecom/DisconnectCause;\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getState()I\"/>\n\t\t<method name=\"hold()V\"/>\n\t\t<method name=\"merge()V\"/>\n\t\t<method name=\"playDtmfTone(C)V\"/>\n\t\t<method name=\"registerCallback(Landroid/telecom/RemoteConference$Callback;)V\"/>\n\t\t<method name=\"registerCallback(Landroid/telecom/RemoteConference$Callback;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"separate(Landroid/telecom/RemoteConnection;)V\"/>\n\t\t<method name=\"setCallAudioState(Landroid/telecom/CallAudioState;)V\"/>\n\t\t<method name=\"stopDtmfTone()V\"/>\n\t\t<method name=\"swap()V\"/>\n\t\t<method name=\"unhold()V\"/>\n\t\t<method name=\"unregisterCallback(Landroid/telecom/RemoteConference$Callback;)V\"/>\n\t</class>\n\t<class name=\"android/telecom/RemoteConference$Callback\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onConferenceableConnectionsChanged(Landroid/telecom/RemoteConference;Ljava/util/List;)V\"/>\n\t\t<method name=\"onConnectionAdded(Landroid/telecom/RemoteConference;Landroid/telecom/RemoteConnection;)V\"/>\n\t\t<method name=\"onConnectionCapabilitiesChanged(Landroid/telecom/RemoteConference;I)V\"/>\n\t\t<method name=\"onConnectionPropertiesChanged(Landroid/telecom/RemoteConference;I)V\" since=\"25\"/>\n\t\t<method name=\"onConnectionRemoved(Landroid/telecom/RemoteConference;Landroid/telecom/RemoteConnection;)V\"/>\n\t\t<method name=\"onDestroyed(Landroid/telecom/RemoteConference;)V\"/>\n\t\t<method name=\"onDisconnected(Landroid/telecom/RemoteConference;Landroid/telecom/DisconnectCause;)V\"/>\n\t\t<method name=\"onExtrasChanged(Landroid/telecom/RemoteConference;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onStateChanged(Landroid/telecom/RemoteConference;II)V\"/>\n\t</class>\n\t<class name=\"android/telecom/RemoteConnection\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"abort()V\"/>\n\t\t<method name=\"answer()V\"/>\n\t\t<method name=\"disconnect()V\"/>\n\t\t<method name=\"getAddress()Landroid/net/Uri;\"/>\n\t\t<method name=\"getAddressPresentation()I\"/>\n\t\t<method name=\"getCallerDisplayName()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getCallerDisplayNamePresentation()I\"/>\n\t\t<method name=\"getConference()Landroid/telecom/RemoteConference;\"/>\n\t\t<method name=\"getConferenceableConnections()Ljava/util/List;\"/>\n\t\t<method name=\"getConnectionCapabilities()I\"/>\n\t\t<method name=\"getConnectionProperties()I\" since=\"25\"/>\n\t\t<method name=\"getDisconnectCause()Landroid/telecom/DisconnectCause;\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getState()I\"/>\n\t\t<method name=\"getStatusHints()Landroid/telecom/StatusHints;\"/>\n\t\t<method name=\"getVideoProvider()Landroid/telecom/RemoteConnection$VideoProvider;\"/>\n\t\t<method name=\"getVideoState()I\"/>\n\t\t<method name=\"hold()V\"/>\n\t\t<method name=\"isRingbackRequested()Z\"/>\n\t\t<method name=\"isVoipAudioMode()Z\"/>\n\t\t<method name=\"playDtmfTone(C)V\"/>\n\t\t<method name=\"postDialContinue(Z)V\"/>\n\t\t<method name=\"pullExternalCall()V\" since=\"25\"/>\n\t\t<method name=\"registerCallback(Landroid/telecom/RemoteConnection$Callback;)V\"/>\n\t\t<method name=\"registerCallback(Landroid/telecom/RemoteConnection$Callback;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"reject()V\"/>\n\t\t<method name=\"setCallAudioState(Landroid/telecom/CallAudioState;)V\"/>\n\t\t<method name=\"stopDtmfTone()V\"/>\n\t\t<method name=\"unhold()V\"/>\n\t\t<method name=\"unregisterCallback(Landroid/telecom/RemoteConnection$Callback;)V\"/>\n\t</class>\n\t<class name=\"android/telecom/RemoteConnection$Callback\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onAddressChanged(Landroid/telecom/RemoteConnection;Landroid/net/Uri;I)V\"/>\n\t\t<method name=\"onCallerDisplayNameChanged(Landroid/telecom/RemoteConnection;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"onConferenceChanged(Landroid/telecom/RemoteConnection;Landroid/telecom/RemoteConference;)V\"/>\n\t\t<method name=\"onConferenceableConnectionsChanged(Landroid/telecom/RemoteConnection;Ljava/util/List;)V\"/>\n\t\t<method name=\"onConnectionCapabilitiesChanged(Landroid/telecom/RemoteConnection;I)V\"/>\n\t\t<method name=\"onConnectionEvent(Landroid/telecom/RemoteConnection;Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"25\"/>\n\t\t<method name=\"onConnectionPropertiesChanged(Landroid/telecom/RemoteConnection;I)V\" since=\"25\"/>\n\t\t<method name=\"onDestroyed(Landroid/telecom/RemoteConnection;)V\"/>\n\t\t<method name=\"onDisconnected(Landroid/telecom/RemoteConnection;Landroid/telecom/DisconnectCause;)V\"/>\n\t\t<method name=\"onExtrasChanged(Landroid/telecom/RemoteConnection;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onPostDialChar(Landroid/telecom/RemoteConnection;C)V\"/>\n\t\t<method name=\"onPostDialWait(Landroid/telecom/RemoteConnection;Ljava/lang/String;)V\"/>\n\t\t<method name=\"onRingbackRequested(Landroid/telecom/RemoteConnection;Z)V\"/>\n\t\t<method name=\"onStateChanged(Landroid/telecom/RemoteConnection;I)V\"/>\n\t\t<method name=\"onStatusHintsChanged(Landroid/telecom/RemoteConnection;Landroid/telecom/StatusHints;)V\"/>\n\t\t<method name=\"onVideoProviderChanged(Landroid/telecom/RemoteConnection;Landroid/telecom/RemoteConnection$VideoProvider;)V\"/>\n\t\t<method name=\"onVideoStateChanged(Landroid/telecom/RemoteConnection;I)V\"/>\n\t\t<method name=\"onVoipAudioChanged(Landroid/telecom/RemoteConnection;Z)V\"/>\n\t</class>\n\t<class name=\"android/telecom/RemoteConnection$VideoProvider\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"registerCallback(Landroid/telecom/RemoteConnection$VideoProvider$Callback;)V\"/>\n\t\t<method name=\"requestCallDataUsage()V\"/>\n\t\t<method name=\"requestCameraCapabilities()V\"/>\n\t\t<method name=\"sendSessionModifyRequest(Landroid/telecom/VideoProfile;Landroid/telecom/VideoProfile;)V\"/>\n\t\t<method name=\"sendSessionModifyResponse(Landroid/telecom/VideoProfile;)V\"/>\n\t\t<method name=\"setCamera(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setDeviceOrientation(I)V\"/>\n\t\t<method name=\"setDisplaySurface(Landroid/view/Surface;)V\"/>\n\t\t<method name=\"setPauseImage(Landroid/net/Uri;)V\"/>\n\t\t<method name=\"setPreviewSurface(Landroid/view/Surface;)V\"/>\n\t\t<method name=\"setZoom(F)V\"/>\n\t\t<method name=\"unregisterCallback(Landroid/telecom/RemoteConnection$VideoProvider$Callback;)V\"/>\n\t</class>\n\t<class name=\"android/telecom/RemoteConnection$VideoProvider$Callback\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCallDataUsageChanged(Landroid/telecom/RemoteConnection$VideoProvider;J)V\"/>\n\t\t<method name=\"onCallSessionEvent(Landroid/telecom/RemoteConnection$VideoProvider;I)V\"/>\n\t\t<method name=\"onCameraCapabilitiesChanged(Landroid/telecom/RemoteConnection$VideoProvider;Landroid/telecom/VideoProfile$CameraCapabilities;)V\"/>\n\t\t<method name=\"onPeerDimensionsChanged(Landroid/telecom/RemoteConnection$VideoProvider;II)V\"/>\n\t\t<method name=\"onSessionModifyRequestReceived(Landroid/telecom/RemoteConnection$VideoProvider;Landroid/telecom/VideoProfile;)V\"/>\n\t\t<method name=\"onSessionModifyResponseReceived(Landroid/telecom/RemoteConnection$VideoProvider;ILandroid/telecom/VideoProfile;Landroid/telecom/VideoProfile;)V\"/>\n\t\t<method name=\"onVideoQualityChanged(Landroid/telecom/RemoteConnection$VideoProvider;I)V\"/>\n\t</class>\n\t<class name=\"android/telecom/StatusHints\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;Landroid/graphics/drawable/Icon;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getIcon()Landroid/graphics/drawable/Icon;\"/>\n\t\t<method name=\"getLabel()Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telecom/TelecomManager\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"acceptHandover(Landroid/net/Uri;ILandroid/telecom/PhoneAccountHandle;)V\" since=\"28\"/>\n\t\t<method name=\"acceptRingingCall()V\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"acceptRingingCall(I)V\" since=\"26\" deprecated=\"29\"/>\n\t\t<method name=\"addNewIncomingCall(Landroid/telecom/PhoneAccountHandle;Landroid/os/Bundle;)V\" since=\"23\"/>\n\t\t<method name=\"cancelMissedCallsNotification()V\"/>\n\t\t<method name=\"createManageBlockedNumbersIntent()Landroid/content/Intent;\" since=\"24\"/>\n\t\t<method name=\"endCall()Z\" since=\"28\" deprecated=\"29\"/>\n\t\t<method name=\"getAdnUriForPhoneAccount(Landroid/telecom/PhoneAccountHandle;)Landroid/net/Uri;\" since=\"23\"/>\n\t\t<method name=\"getCallCapablePhoneAccounts()Ljava/util/List;\" since=\"23\"/>\n\t\t<method name=\"getDefaultDialerPackage()Ljava/lang/String;\" since=\"23\"/>\n\t\t<method name=\"getDefaultOutgoingPhoneAccount(Ljava/lang/String;)Landroid/telecom/PhoneAccountHandle;\" since=\"23\"/>\n\t\t<method name=\"getLine1Number(Landroid/telecom/PhoneAccountHandle;)Ljava/lang/String;\" since=\"23\"/>\n\t\t<method name=\"getPhoneAccount(Landroid/telecom/PhoneAccountHandle;)Landroid/telecom/PhoneAccount;\" since=\"23\"/>\n\t\t<method name=\"getSelfManagedPhoneAccounts()Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"getSimCallManager()Landroid/telecom/PhoneAccountHandle;\" since=\"23\"/>\n\t\t<method name=\"getSimCallManagerForSubscription(I)Landroid/telecom/PhoneAccountHandle;\" since=\"30\"/>\n\t\t<method name=\"getSystemDialerPackage()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getUserSelectedOutgoingPhoneAccount()Landroid/telecom/PhoneAccountHandle;\" since=\"29\"/>\n\t\t<method name=\"getVoiceMailNumber(Landroid/telecom/PhoneAccountHandle;)Ljava/lang/String;\" since=\"23\"/>\n\t\t<method name=\"handleMmi(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"handleMmi(Ljava/lang/String;Landroid/telecom/PhoneAccountHandle;)Z\" since=\"23\"/>\n\t\t<method name=\"isInCall()Z\"/>\n\t\t<method name=\"isInManagedCall()Z\" since=\"26\"/>\n\t\t<method name=\"isIncomingCallPermitted(Landroid/telecom/PhoneAccountHandle;)Z\" since=\"26\"/>\n\t\t<method name=\"isOutgoingCallPermitted(Landroid/telecom/PhoneAccountHandle;)Z\" since=\"26\"/>\n\t\t<method name=\"isTtySupported()Z\" since=\"28\"/>\n\t\t<method name=\"isVoiceMailNumber(Landroid/telecom/PhoneAccountHandle;Ljava/lang/String;)Z\" since=\"23\"/>\n\t\t<method name=\"placeCall(Landroid/net/Uri;Landroid/os/Bundle;)V\" since=\"23\"/>\n\t\t<method name=\"registerPhoneAccount(Landroid/telecom/PhoneAccount;)V\" since=\"23\"/>\n\t\t<method name=\"showInCallScreen(Z)V\"/>\n\t\t<method name=\"silenceRinger()V\" since=\"23\"/>\n\t\t<method name=\"unregisterPhoneAccount(Landroid/telecom/PhoneAccountHandle;)V\" since=\"23\"/>\n\t\t<field name=\"ACTION_CHANGE_DEFAULT_DIALER\" since=\"23\"/>\n\t\t<field name=\"ACTION_CHANGE_PHONE_ACCOUNTS\" since=\"23\"/>\n\t\t<field name=\"ACTION_CONFIGURE_PHONE_ACCOUNT\" since=\"23\"/>\n\t\t<field name=\"ACTION_DEFAULT_CALL_SCREENING_APP_CHANGED\" since=\"29\"/>\n\t\t<field name=\"ACTION_DEFAULT_DIALER_CHANGED\" since=\"23\"/>\n\t\t<field name=\"ACTION_INCOMING_CALL\" since=\"23\" deprecated=\"26\"/>\n\t\t<field name=\"ACTION_PHONE_ACCOUNT_REGISTERED\" since=\"26\"/>\n\t\t<field name=\"ACTION_PHONE_ACCOUNT_UNREGISTERED\" since=\"26\"/>\n\t\t<field name=\"ACTION_POST_CALL\" since=\"30\"/>\n\t\t<field name=\"ACTION_SHOW_CALL_ACCESSIBILITY_SETTINGS\" since=\"23\"/>\n\t\t<field name=\"ACTION_SHOW_CALL_SETTINGS\"/>\n\t\t<field name=\"ACTION_SHOW_MISSED_CALLS_NOTIFICATION\" since=\"24\"/>\n\t\t<field name=\"ACTION_SHOW_RESPOND_VIA_SMS_SETTINGS\" since=\"23\"/>\n\t\t<field name=\"DTMF_CHARACTER_PAUSE\"/>\n\t\t<field name=\"DTMF_CHARACTER_WAIT\"/>\n\t\t<field name=\"DURATION_LONG\" since=\"30\"/>\n\t\t<field name=\"DURATION_MEDIUM\" since=\"30\"/>\n\t\t<field name=\"DURATION_SHORT\" since=\"30\"/>\n\t\t<field name=\"DURATION_VERY_SHORT\" since=\"30\"/>\n\t\t<field name=\"EXTRA_CALL_BACK_NUMBER\" since=\"23\"/>\n\t\t<field name=\"EXTRA_CALL_DISCONNECT_CAUSE\"/>\n\t\t<field name=\"EXTRA_CALL_DISCONNECT_MESSAGE\"/>\n\t\t<field name=\"EXTRA_CALL_DURATION\" since=\"30\"/>\n\t\t<field name=\"EXTRA_CALL_NETWORK_TYPE\" since=\"29\"/>\n\t\t<field name=\"EXTRA_CALL_SUBJECT\" since=\"23\"/>\n\t\t<field name=\"EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME\" since=\"23\"/>\n\t\t<field name=\"EXTRA_DEFAULT_CALL_SCREENING_APP_COMPONENT_NAME\" since=\"29\"/>\n\t\t<field name=\"EXTRA_DISCONNECT_CAUSE\" since=\"30\"/>\n\t\t<field name=\"EXTRA_HANDLE\" since=\"30\"/>\n\t\t<field name=\"EXTRA_INCOMING_CALL_ADDRESS\" since=\"23\"/>\n\t\t<field name=\"EXTRA_INCOMING_CALL_EXTRAS\" since=\"23\"/>\n\t\t<field name=\"EXTRA_INCOMING_VIDEO_STATE\" since=\"26\"/>\n\t\t<field name=\"EXTRA_IS_DEFAULT_CALL_SCREENING_APP\" since=\"29\"/>\n\t\t<field name=\"EXTRA_NOTIFICATION_COUNT\" since=\"24\"/>\n\t\t<field name=\"EXTRA_NOTIFICATION_PHONE_NUMBER\" since=\"24\"/>\n\t\t<field name=\"EXTRA_OUTGOING_CALL_EXTRAS\" since=\"23\"/>\n\t\t<field name=\"EXTRA_PHONE_ACCOUNT_HANDLE\" since=\"23\"/>\n\t\t<field name=\"EXTRA_START_CALL_WITH_RTT\" since=\"26\"/>\n\t\t<field name=\"EXTRA_START_CALL_WITH_SPEAKERPHONE\"/>\n\t\t<field name=\"EXTRA_START_CALL_WITH_VIDEO_STATE\" since=\"23\"/>\n\t\t<field name=\"EXTRA_USE_ASSISTED_DIALING\" since=\"30\"/>\n\t\t<field name=\"GATEWAY_ORIGINAL_ADDRESS\"/>\n\t\t<field name=\"GATEWAY_PROVIDER_PACKAGE\"/>\n\t\t<field name=\"METADATA_INCLUDE_EXTERNAL_CALLS\" since=\"25\"/>\n\t\t<field name=\"METADATA_INCLUDE_SELF_MANAGED_CALLS\" since=\"26\"/>\n\t\t<field name=\"METADATA_IN_CALL_SERVICE_CAR_MODE_UI\" since=\"29\"/>\n\t\t<field name=\"METADATA_IN_CALL_SERVICE_RINGING\" since=\"24\"/>\n\t\t<field name=\"METADATA_IN_CALL_SERVICE_UI\" since=\"23\"/>\n\t\t<field name=\"PRESENTATION_ALLOWED\"/>\n\t\t<field name=\"PRESENTATION_PAYPHONE\"/>\n\t\t<field name=\"PRESENTATION_RESTRICTED\"/>\n\t\t<field name=\"PRESENTATION_UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/telecom/VideoProfile\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"getQuality()I\"/>\n\t\t<method name=\"getVideoState()I\"/>\n\t\t<method name=\"isAudioOnly(I)Z\"/>\n\t\t<method name=\"isBidirectional(I)Z\"/>\n\t\t<method name=\"isPaused(I)Z\"/>\n\t\t<method name=\"isReceptionEnabled(I)Z\"/>\n\t\t<method name=\"isTransmissionEnabled(I)Z\"/>\n\t\t<method name=\"isVideo(I)Z\"/>\n\t\t<method name=\"videoStateToString(I)Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"QUALITY_DEFAULT\"/>\n\t\t<field name=\"QUALITY_HIGH\"/>\n\t\t<field name=\"QUALITY_LOW\"/>\n\t\t<field name=\"QUALITY_MEDIUM\"/>\n\t\t<field name=\"STATE_AUDIO_ONLY\"/>\n\t\t<field name=\"STATE_BIDIRECTIONAL\"/>\n\t\t<field name=\"STATE_PAUSED\"/>\n\t\t<field name=\"STATE_RX_ENABLED\"/>\n\t\t<field name=\"STATE_TX_ENABLED\"/>\n\t</class>\n\t<class name=\"android/telecom/VideoProfile$CameraCapabilities\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(IIZF)V\" since=\"29\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getMaxZoom()F\" since=\"29\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t\t<method name=\"isZoomSupported()Z\" since=\"29\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/AccessNetworkConstants\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"TRANSPORT_TYPE_WLAN\" since=\"30\"/>\n\t\t<field name=\"TRANSPORT_TYPE_WWAN\" since=\"30\"/>\n\t</class>\n\t<class name=\"android/telephony/AccessNetworkConstants$AccessNetworkType\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CDMA2000\"/>\n\t\t<field name=\"EUTRAN\"/>\n\t\t<field name=\"GERAN\"/>\n\t\t<field name=\"IWLAN\"/>\n\t\t<field name=\"NGRAN\" since=\"30\"/>\n\t\t<field name=\"UNKNOWN\"/>\n\t\t<field name=\"UTRAN\"/>\n\t</class>\n\t<class name=\"android/telephony/AccessNetworkConstants$EutranBand\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"BAND_1\"/>\n\t\t<field name=\"BAND_10\"/>\n\t\t<field name=\"BAND_11\"/>\n\t\t<field name=\"BAND_12\"/>\n\t\t<field name=\"BAND_13\"/>\n\t\t<field name=\"BAND_14\"/>\n\t\t<field name=\"BAND_17\"/>\n\t\t<field name=\"BAND_18\"/>\n\t\t<field name=\"BAND_19\"/>\n\t\t<field name=\"BAND_2\"/>\n\t\t<field name=\"BAND_20\"/>\n\t\t<field name=\"BAND_21\"/>\n\t\t<field name=\"BAND_22\"/>\n\t\t<field name=\"BAND_23\"/>\n\t\t<field name=\"BAND_24\"/>\n\t\t<field name=\"BAND_25\"/>\n\t\t<field name=\"BAND_26\"/>\n\t\t<field name=\"BAND_27\"/>\n\t\t<field name=\"BAND_28\"/>\n\t\t<field name=\"BAND_3\"/>\n\t\t<field name=\"BAND_30\"/>\n\t\t<field name=\"BAND_31\"/>\n\t\t<field name=\"BAND_33\"/>\n\t\t<field name=\"BAND_34\"/>\n\t\t<field name=\"BAND_35\"/>\n\t\t<field name=\"BAND_36\"/>\n\t\t<field name=\"BAND_37\"/>\n\t\t<field name=\"BAND_38\"/>\n\t\t<field name=\"BAND_39\"/>\n\t\t<field name=\"BAND_4\"/>\n\t\t<field name=\"BAND_40\"/>\n\t\t<field name=\"BAND_41\"/>\n\t\t<field name=\"BAND_42\"/>\n\t\t<field name=\"BAND_43\"/>\n\t\t<field name=\"BAND_44\"/>\n\t\t<field name=\"BAND_45\"/>\n\t\t<field name=\"BAND_46\"/>\n\t\t<field name=\"BAND_47\"/>\n\t\t<field name=\"BAND_48\"/>\n\t\t<field name=\"BAND_49\" since=\"30\"/>\n\t\t<field name=\"BAND_5\"/>\n\t\t<field name=\"BAND_50\" since=\"30\"/>\n\t\t<field name=\"BAND_51\" since=\"30\"/>\n\t\t<field name=\"BAND_52\" since=\"30\"/>\n\t\t<field name=\"BAND_53\" since=\"30\"/>\n\t\t<field name=\"BAND_6\"/>\n\t\t<field name=\"BAND_65\"/>\n\t\t<field name=\"BAND_66\"/>\n\t\t<field name=\"BAND_68\"/>\n\t\t<field name=\"BAND_7\"/>\n\t\t<field name=\"BAND_70\"/>\n\t\t<field name=\"BAND_71\" since=\"30\"/>\n\t\t<field name=\"BAND_72\" since=\"30\"/>\n\t\t<field name=\"BAND_73\" since=\"30\"/>\n\t\t<field name=\"BAND_74\" since=\"30\"/>\n\t\t<field name=\"BAND_8\"/>\n\t\t<field name=\"BAND_85\" since=\"30\"/>\n\t\t<field name=\"BAND_87\" since=\"30\"/>\n\t\t<field name=\"BAND_88\" since=\"30\"/>\n\t\t<field name=\"BAND_9\"/>\n\t</class>\n\t<class name=\"android/telephony/AccessNetworkConstants$GeranBand\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"BAND_450\"/>\n\t\t<field name=\"BAND_480\"/>\n\t\t<field name=\"BAND_710\"/>\n\t\t<field name=\"BAND_750\"/>\n\t\t<field name=\"BAND_850\"/>\n\t\t<field name=\"BAND_DCS1800\"/>\n\t\t<field name=\"BAND_E900\"/>\n\t\t<field name=\"BAND_ER900\"/>\n\t\t<field name=\"BAND_P900\"/>\n\t\t<field name=\"BAND_PCS1900\"/>\n\t\t<field name=\"BAND_R900\"/>\n\t\t<field name=\"BAND_T380\"/>\n\t\t<field name=\"BAND_T410\"/>\n\t\t<field name=\"BAND_T810\"/>\n\t</class>\n\t<class name=\"android/telephony/AccessNetworkConstants$NgranBands\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"BAND_1\"/>\n\t\t<field name=\"BAND_12\"/>\n\t\t<field name=\"BAND_14\"/>\n\t\t<field name=\"BAND_18\"/>\n\t\t<field name=\"BAND_2\"/>\n\t\t<field name=\"BAND_20\"/>\n\t\t<field name=\"BAND_25\"/>\n\t\t<field name=\"BAND_257\"/>\n\t\t<field name=\"BAND_258\"/>\n\t\t<field name=\"BAND_260\"/>\n\t\t<field name=\"BAND_261\"/>\n\t\t<field name=\"BAND_28\"/>\n\t\t<field name=\"BAND_29\"/>\n\t\t<field name=\"BAND_3\"/>\n\t\t<field name=\"BAND_30\"/>\n\t\t<field name=\"BAND_34\"/>\n\t\t<field name=\"BAND_38\"/>\n\t\t<field name=\"BAND_39\"/>\n\t\t<field name=\"BAND_40\"/>\n\t\t<field name=\"BAND_41\"/>\n\t\t<field name=\"BAND_48\"/>\n\t\t<field name=\"BAND_5\"/>\n\t\t<field name=\"BAND_50\"/>\n\t\t<field name=\"BAND_51\"/>\n\t\t<field name=\"BAND_65\"/>\n\t\t<field name=\"BAND_66\"/>\n\t\t<field name=\"BAND_7\"/>\n\t\t<field name=\"BAND_70\"/>\n\t\t<field name=\"BAND_71\"/>\n\t\t<field name=\"BAND_74\"/>\n\t\t<field name=\"BAND_75\"/>\n\t\t<field name=\"BAND_76\"/>\n\t\t<field name=\"BAND_77\"/>\n\t\t<field name=\"BAND_78\"/>\n\t\t<field name=\"BAND_79\"/>\n\t\t<field name=\"BAND_8\"/>\n\t\t<field name=\"BAND_80\"/>\n\t\t<field name=\"BAND_81\"/>\n\t\t<field name=\"BAND_82\"/>\n\t\t<field name=\"BAND_83\"/>\n\t\t<field name=\"BAND_84\"/>\n\t\t<field name=\"BAND_86\"/>\n\t\t<field name=\"BAND_89\"/>\n\t\t<field name=\"BAND_90\"/>\n\t\t<field name=\"BAND_91\"/>\n\t\t<field name=\"BAND_92\"/>\n\t\t<field name=\"BAND_93\"/>\n\t\t<field name=\"BAND_94\"/>\n\t\t<field name=\"BAND_95\"/>\n\t</class>\n\t<class name=\"android/telephony/AccessNetworkConstants$UtranBand\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"BAND_1\"/>\n\t\t<field name=\"BAND_10\"/>\n\t\t<field name=\"BAND_11\"/>\n\t\t<field name=\"BAND_12\"/>\n\t\t<field name=\"BAND_13\"/>\n\t\t<field name=\"BAND_14\"/>\n\t\t<field name=\"BAND_19\"/>\n\t\t<field name=\"BAND_2\"/>\n\t\t<field name=\"BAND_20\"/>\n\t\t<field name=\"BAND_21\"/>\n\t\t<field name=\"BAND_22\"/>\n\t\t<field name=\"BAND_25\"/>\n\t\t<field name=\"BAND_26\"/>\n\t\t<field name=\"BAND_3\"/>\n\t\t<field name=\"BAND_4\"/>\n\t\t<field name=\"BAND_5\"/>\n\t\t<field name=\"BAND_6\"/>\n\t\t<field name=\"BAND_7\"/>\n\t\t<field name=\"BAND_8\"/>\n\t\t<field name=\"BAND_9\"/>\n\t\t<field name=\"BAND_A\" since=\"30\"/>\n\t\t<field name=\"BAND_B\" since=\"30\"/>\n\t\t<field name=\"BAND_C\" since=\"30\"/>\n\t\t<field name=\"BAND_D\" since=\"30\"/>\n\t\t<field name=\"BAND_E\" since=\"30\"/>\n\t\t<field name=\"BAND_F\" since=\"30\"/>\n\t</class>\n\t<class name=\"android/telephony/AvailableNetworkInfo\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(IILjava/util/List;Ljava/util/List;)V\"/>\n\t\t<method name=\"getBands()Ljava/util/List;\"/>\n\t\t<method name=\"getMccMncs()Ljava/util/List;\"/>\n\t\t<method name=\"getPriority()I\"/>\n\t\t<method name=\"getSubId()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"PRIORITY_HIGH\"/>\n\t\t<field name=\"PRIORITY_LOW\"/>\n\t\t<field name=\"PRIORITY_MED\"/>\n\t</class>\n\t<class name=\"android/telephony/BarringInfo\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getBarringServiceInfo(I)Landroid/telephony/BarringInfo$BarringServiceInfo;\"/>\n\t\t<field name=\"BARRING_SERVICE_TYPE_CS_FALLBACK\"/>\n\t\t<field name=\"BARRING_SERVICE_TYPE_CS_SERVICE\"/>\n\t\t<field name=\"BARRING_SERVICE_TYPE_CS_VOICE\"/>\n\t\t<field name=\"BARRING_SERVICE_TYPE_EMERGENCY\"/>\n\t\t<field name=\"BARRING_SERVICE_TYPE_MMTEL_VIDEO\"/>\n\t\t<field name=\"BARRING_SERVICE_TYPE_MMTEL_VOICE\"/>\n\t\t<field name=\"BARRING_SERVICE_TYPE_MO_DATA\"/>\n\t\t<field name=\"BARRING_SERVICE_TYPE_MO_SIGNALLING\"/>\n\t\t<field name=\"BARRING_SERVICE_TYPE_PS_SERVICE\"/>\n\t\t<field name=\"BARRING_SERVICE_TYPE_SMS\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/BarringInfo$BarringServiceInfo\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getBarringType()I\"/>\n\t\t<method name=\"getConditionalBarringFactor()I\"/>\n\t\t<method name=\"getConditionalBarringTimeSeconds()I\"/>\n\t\t<method name=\"isBarred()Z\"/>\n\t\t<method name=\"isConditionallyBarred()Z\"/>\n\t\t<field name=\"BARRING_TYPE_CONDITIONAL\"/>\n\t\t<field name=\"BARRING_TYPE_NONE\"/>\n\t\t<field name=\"BARRING_TYPE_UNCONDITIONAL\"/>\n\t\t<field name=\"BARRING_TYPE_UNKNOWN\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/CarrierConfigManager\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getConfig()Landroid/os/PersistableBundle;\"/>\n\t\t<method name=\"getConfigByComponentForSubId(Ljava/lang/String;I)Landroid/os/PersistableBundle;\" since=\"30\"/>\n\t\t<method name=\"getConfigForSubId(I)Landroid/os/PersistableBundle;\"/>\n\t\t<method name=\"isConfigForIdentifiedCarrier(Landroid/os/PersistableBundle;)Z\" since=\"28\"/>\n\t\t<method name=\"notifyConfigChangedForSubId(I)V\"/>\n\t\t<field name=\"ACTION_CARRIER_CONFIG_CHANGED\"/>\n\t\t<field name=\"DATA_CYCLE_THRESHOLD_DISABLED\" since=\"26\"/>\n\t\t<field name=\"DATA_CYCLE_USE_PLATFORM_DEFAULT\" since=\"30\"/>\n\t\t<field name=\"EXTRA_SLOT_INDEX\" since=\"28\"/>\n\t\t<field name=\"EXTRA_SUBSCRIPTION_INDEX\" since=\"28\"/>\n\t\t<field name=\"IMSI_KEY_AVAILABILITY_INT\" since=\"30\"/>\n\t\t<field name=\"KEY_5G_NR_SSRSRP_THRESHOLDS_INT_ARRAY\" since=\"30\"/>\n\t\t<field name=\"KEY_5G_NR_SSRSRQ_THRESHOLDS_INT_ARRAY\" since=\"30\"/>\n\t\t<field name=\"KEY_5G_NR_SSSINR_THRESHOLDS_INT_ARRAY\" since=\"30\"/>\n\t\t<field name=\"KEY_ADDITIONAL_CALL_SETTING_BOOL\"/>\n\t\t<field name=\"KEY_ALLOW_ADDING_APNS_BOOL\" since=\"24\"/>\n\t\t<field name=\"KEY_ALLOW_ADD_CALL_DURING_VIDEO_CALL_BOOL\" since=\"25\"/>\n\t\t<field name=\"KEY_ALLOW_EMERGENCY_NUMBERS_IN_CALL_LOG_BOOL\"/>\n\t\t<field name=\"KEY_ALLOW_EMERGENCY_VIDEO_CALLS_BOOL\" since=\"24\"/>\n\t\t<field name=\"KEY_ALLOW_HOLD_CALL_DURING_EMERGENCY_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_ALLOW_HOLD_VIDEO_CALL_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_ALLOW_LOCAL_DTMF_TONES_BOOL\"/>\n\t\t<field name=\"KEY_ALLOW_MERGE_WIFI_CALLS_WHEN_VOWIFI_OFF_BOOL\" since=\"25\"/>\n\t\t<field name=\"KEY_ALLOW_NON_EMERGENCY_CALLS_IN_ECM_BOOL\" since=\"24\"/>\n\t\t<field name=\"KEY_ALLOW_VIDEO_CALLING_FALLBACK_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_ALWAYS_SHOW_DATA_RAT_ICON_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_ALWAYS_SHOW_EMERGENCY_ALERT_ONOFF_BOOL\" since=\"24\" deprecated=\"30\"/>\n\t\t<field name=\"KEY_ALWAYS_SHOW_PRIMARY_SIGNAL_BAR_IN_OPPORTUNISTIC_NETWORK_BOOLEAN\" since=\"30\"/>\n\t\t<field name=\"KEY_APN_EXPAND_BOOL\"/>\n\t\t<field name=\"KEY_APN_SETTINGS_DEFAULT_APN_TYPES_STRING_ARRAY\" since=\"30\"/>\n\t\t<field name=\"KEY_AUTO_RETRY_ENABLED_BOOL\"/>\n\t\t<field name=\"KEY_CALL_BARRING_SUPPORTS_DEACTIVATE_ALL_BOOL\" since=\"29\"/>\n\t\t<field name=\"KEY_CALL_BARRING_SUPPORTS_PASSWORD_CHANGE_BOOL\" since=\"29\"/>\n\t\t<field name=\"KEY_CALL_BARRING_VISIBILITY_BOOL\" since=\"29\"/>\n\t\t<field name=\"KEY_CALL_FORWARDING_BLOCKS_WHILE_ROAMING_STRING_ARRAY\" since=\"26\"/>\n\t\t<field name=\"KEY_CALL_REDIRECTION_SERVICE_COMPONENT_NAME_STRING\" since=\"30\"/>\n\t\t<field name=\"KEY_CARRIER_ALLOW_DEFLECT_IMS_CALL_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_CARRIER_ALLOW_TURNOFF_IMS_BOOL\"/>\n\t\t<field name=\"KEY_CARRIER_APP_REQUIRED_DURING_SIM_SETUP_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_CARRIER_CALL_SCREENING_APP_STRING\" since=\"29\"/>\n\t\t<field name=\"KEY_CARRIER_CERTIFICATE_STRING_ARRAY\" since=\"30\"/>\n\t\t<field name=\"KEY_CARRIER_CONFIG_APPLIED_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_CARRIER_CONFIG_VERSION_STRING\" since=\"29\"/>\n\t\t<field name=\"KEY_CARRIER_DATA_CALL_PERMANENT_FAILURE_STRINGS\" since=\"26\"/>\n\t\t<field name=\"KEY_CARRIER_DEFAULT_ACTIONS_ON_DCFAILURE_STRING_ARRAY\" since=\"30\"/>\n\t\t<field name=\"KEY_CARRIER_DEFAULT_ACTIONS_ON_DEFAULT_NETWORK_AVAILABLE\" since=\"30\"/>\n\t\t<field name=\"KEY_CARRIER_DEFAULT_ACTIONS_ON_REDIRECTION_STRING_ARRAY\" since=\"30\"/>\n\t\t<field name=\"KEY_CARRIER_DEFAULT_ACTIONS_ON_RESET\" since=\"30\"/>\n\t\t<field name=\"KEY_CARRIER_DEFAULT_REDIRECTION_URL_STRING_ARRAY\" since=\"30\"/>\n\t\t<field name=\"KEY_CARRIER_DEFAULT_WFC_IMS_ENABLED_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_CARRIER_DEFAULT_WFC_IMS_MODE_INT\" since=\"29\"/>\n\t\t<field name=\"KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_MODE_INT\" since=\"29\"/>\n\t\t<field name=\"KEY_CARRIER_FORCE_DISABLE_ETWS_CMAS_TEST_BOOL\" since=\"24\" deprecated=\"30\"/>\n\t\t<field name=\"KEY_CARRIER_IMS_GBA_REQUIRED_BOOL\" since=\"24\"/>\n\t\t<field name=\"KEY_CARRIER_INSTANT_LETTERING_AVAILABLE_BOOL\" since=\"24\"/>\n\t\t<field name=\"KEY_CARRIER_INSTANT_LETTERING_ENCODING_STRING\" since=\"24\"/>\n\t\t<field name=\"KEY_CARRIER_INSTANT_LETTERING_ESCAPED_CHARS_STRING\" since=\"24\"/>\n\t\t<field name=\"KEY_CARRIER_INSTANT_LETTERING_INVALID_CHARS_STRING\" since=\"24\"/>\n\t\t<field name=\"KEY_CARRIER_INSTANT_LETTERING_LENGTH_LIMIT_INT\" since=\"24\"/>\n\t\t<field name=\"KEY_CARRIER_NAME_OVERRIDE_BOOL\" since=\"28\"/>\n\t\t<field name=\"KEY_CARRIER_NAME_STRING\" since=\"28\"/>\n\t\t<field name=\"KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_CARRIER_SETTINGS_ACTIVITY_COMPONENT_NAME_STRING\" since=\"30\"/>\n\t\t<field name=\"KEY_CARRIER_SETTINGS_ENABLE_BOOL\"/>\n\t\t<field name=\"KEY_CARRIER_SUPPORTS_SS_OVER_UT_BOOL\" since=\"29\"/>\n\t\t<field name=\"KEY_CARRIER_USE_IMS_FIRST_FOR_EMERGENCY_BOOL\" since=\"24\"/>\n\t\t<field name=\"KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL\" since=\"29\"/>\n\t\t<field name=\"KEY_CARRIER_VOLTE_AVAILABLE_BOOL\"/>\n\t\t<field name=\"KEY_CARRIER_VOLTE_OVERRIDE_WFC_PROVISIONING_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_CARRIER_VOLTE_PROVISIONED_BOOL\" since=\"26\"/>\n\t\t<field name=\"KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL\"/>\n\t\t<field name=\"KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL\"/>\n\t\t<field name=\"KEY_CARRIER_VT_AVAILABLE_BOOL\"/>\n\t\t<field name=\"KEY_CARRIER_VVM_PACKAGE_NAME_STRING\" deprecated=\"26\"/>\n\t\t<field name=\"KEY_CARRIER_VVM_PACKAGE_NAME_STRING_ARRAY\" since=\"26\"/>\n\t\t<field name=\"KEY_CARRIER_WFC_IMS_AVAILABLE_BOOL\"/>\n\t\t<field name=\"KEY_CARRIER_WFC_SUPPORTS_WIFI_ONLY_BOOL\" since=\"24\"/>\n\t\t<field name=\"KEY_CDMA_3WAYCALL_FLASH_DELAY_INT\" since=\"26\"/>\n\t\t<field name=\"KEY_CDMA_DTMF_TONE_DELAY_INT\" since=\"24\"/>\n\t\t<field name=\"KEY_CDMA_NONROAMING_NETWORKS_STRING_ARRAY\"/>\n\t\t<field name=\"KEY_CDMA_ROAMING_MODE_INT\" since=\"28\"/>\n\t\t<field name=\"KEY_CDMA_ROAMING_NETWORKS_STRING_ARRAY\"/>\n\t\t<field name=\"KEY_CHECK_PRICING_WITH_CARRIER_FOR_DATA_ROAMING_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_CI_ACTION_ON_SYS_UPDATE_BOOL\" since=\"24\"/>\n\t\t<field name=\"KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_STRING\" since=\"24\"/>\n\t\t<field name=\"KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING\" since=\"24\"/>\n\t\t<field name=\"KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING\" since=\"24\"/>\n\t\t<field name=\"KEY_CONFIG_IMS_MMTEL_PACKAGE_OVERRIDE_STRING\" since=\"30\"/>\n\t\t<field name=\"KEY_CONFIG_IMS_PACKAGE_OVERRIDE_STRING\" since=\"26\" deprecated=\"30\"/>\n\t\t<field name=\"KEY_CONFIG_IMS_RCS_PACKAGE_OVERRIDE_STRING\" since=\"30\"/>\n\t\t<field name=\"KEY_CONFIG_PLANS_PACKAGE_OVERRIDE_STRING\" since=\"28\"/>\n\t\t<field name=\"KEY_CONFIG_TELEPHONY_USE_OWN_NUMBER_FOR_VOICEMAIL_BOOL\" since=\"28\"/>\n\t\t<field name=\"KEY_CONFIG_WIFI_DISABLE_IN_ECBM\" since=\"30\"/>\n\t\t<field name=\"KEY_CSP_ENABLED_BOOL\"/>\n\t\t<field name=\"KEY_DATA_LIMIT_NOTIFICATION_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG\" since=\"26\"/>\n\t\t<field name=\"KEY_DATA_RAPID_NOTIFICATION_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_DATA_SWITCH_VALIDATION_TIMEOUT_LONG\" since=\"30\"/>\n\t\t<field name=\"KEY_DATA_WARNING_NOTIFICATION_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_DATA_WARNING_THRESHOLD_BYTES_LONG\" since=\"26\"/>\n\t\t<field name=\"KEY_DEFAULT_SIM_CALL_MANAGER_STRING\"/>\n\t\t<field name=\"KEY_DEFAULT_VM_NUMBER_ROAMING_AND_IMS_UNREGISTERED_STRING\" since=\"30\"/>\n\t\t<field name=\"KEY_DEFAULT_VM_NUMBER_STRING\" since=\"26\"/>\n\t\t<field name=\"KEY_DIAL_STRING_REPLACE_STRING_ARRAY\" since=\"26\"/>\n\t\t<field name=\"KEY_DISABLE_CDMA_ACTIVATION_CODE_BOOL\"/>\n\t\t<field name=\"KEY_DISABLE_CHARGE_INDICATION_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_DISABLE_SUPPLEMENTARY_SERVICES_IN_AIRPLANE_MODE_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_DISCONNECT_CAUSE_PLAY_BUSYTONE_INT_ARRAY\" since=\"30\"/>\n\t\t<field name=\"KEY_DISPLAY_HD_AUDIO_PROPERTY_BOOL\" since=\"27\"/>\n\t\t<field name=\"KEY_DROP_VIDEO_CALL_WHEN_ANSWERING_AUDIO_CALL_BOOL\" since=\"25\"/>\n\t\t<field name=\"KEY_DTMF_TYPE_ENABLED_BOOL\"/>\n\t\t<field name=\"KEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT\" since=\"24\"/>\n\t\t<field name=\"KEY_EDITABLE_ENHANCED_4G_LTE_BOOL\" since=\"24\"/>\n\t\t<field name=\"KEY_EDITABLE_VOICEMAIL_NUMBER_BOOL\" since=\"26\"/>\n\t\t<field name=\"KEY_EDITABLE_VOICEMAIL_NUMBER_SETTING_BOOL\" since=\"28\"/>\n\t\t<field name=\"KEY_EDITABLE_WFC_MODE_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_EDITABLE_WFC_ROAMING_MODE_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_EMERGENCY_NOTIFICATION_DELAY_INT\" since=\"30\"/>\n\t\t<field name=\"KEY_EMERGENCY_NUMBER_PREFIX_STRING_ARRAY\" since=\"29\"/>\n\t\t<field name=\"KEY_ENABLE_DIALER_KEY_VIBRATION_BOOL\"/>\n\t\t<field name=\"KEY_ENHANCED_4G_LTE_ON_BY_DEFAULT_BOOL\" since=\"29\"/>\n\t\t<field name=\"KEY_ENHANCED_4G_LTE_TITLE_VARIANT_INT\" since=\"30\"/>\n\t\t<field name=\"KEY_FORCE_HOME_NETWORK_BOOL\"/>\n\t\t<field name=\"KEY_GSM_DTMF_TONE_DELAY_INT\" since=\"24\"/>\n\t\t<field name=\"KEY_GSM_NONROAMING_NETWORKS_STRING_ARRAY\"/>\n\t\t<field name=\"KEY_GSM_ROAMING_NETWORKS_STRING_ARRAY\"/>\n\t\t<field name=\"KEY_HAS_IN_CALL_NOISE_SUPPRESSION_BOOL\"/>\n\t\t<field name=\"KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL\"/>\n\t\t<field name=\"KEY_HIDE_ENHANCED_4G_LTE_BOOL\" since=\"26\"/>\n\t\t<field name=\"KEY_HIDE_IMS_APN_BOOL\" since=\"24\"/>\n\t\t<field name=\"KEY_HIDE_LTE_PLUS_DATA_ICON_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL\" since=\"24\"/>\n\t\t<field name=\"KEY_HIDE_PRESET_APN_DETAILS_BOOL\" since=\"29\"/>\n\t\t<field name=\"KEY_HIDE_SIM_LOCK_SETTINGS_BOOL\"/>\n\t\t<field name=\"KEY_IGNORE_DATA_ENABLED_CHANGED_FOR_VIDEO_CALLS\" since=\"30\"/>\n\t\t<field name=\"KEY_IGNORE_RTT_MODE_SETTING_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_IGNORE_SIM_NETWORK_LOCKED_EVENTS_BOOL\"/>\n\t\t<field name=\"KEY_IMS_CONFERENCE_SIZE_LIMIT_INT\" since=\"26\"/>\n\t\t<field name=\"KEY_IMS_DTMF_TONE_DELAY_INT\" since=\"24\"/>\n\t\t<field name=\"KEY_IS_IMS_CONFERENCE_SIZE_ENFORCED_BOOL\" since=\"26\"/>\n\t\t<field name=\"KEY_LTE_ENABLED_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_LTE_RSRQ_THRESHOLDS_INT_ARRAY\" since=\"30\"/>\n\t\t<field name=\"KEY_LTE_RSSNR_THRESHOLDS_INT_ARRAY\" since=\"30\"/>\n\t\t<field name=\"KEY_MDN_IS_ADDITIONAL_VOICEMAIL_NUMBER_BOOL\" since=\"26\"/>\n\t\t<field name=\"KEY_MMS_ALIAS_ENABLED_BOOL\"/>\n\t\t<field name=\"KEY_MMS_ALIAS_MAX_CHARS_INT\"/>\n\t\t<field name=\"KEY_MMS_ALIAS_MIN_CHARS_INT\"/>\n\t\t<field name=\"KEY_MMS_ALLOW_ATTACH_AUDIO_BOOL\"/>\n\t\t<field name=\"KEY_MMS_APPEND_TRANSACTION_ID_BOOL\"/>\n\t\t<field name=\"KEY_MMS_CLOSE_CONNECTION_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_MMS_EMAIL_GATEWAY_NUMBER_STRING\"/>\n\t\t<field name=\"KEY_MMS_GROUP_MMS_ENABLED_BOOL\"/>\n\t\t<field name=\"KEY_MMS_HTTP_PARAMS_STRING\"/>\n\t\t<field name=\"KEY_MMS_HTTP_SOCKET_TIMEOUT_INT\"/>\n\t\t<field name=\"KEY_MMS_MAX_IMAGE_HEIGHT_INT\"/>\n\t\t<field name=\"KEY_MMS_MAX_IMAGE_WIDTH_INT\"/>\n\t\t<field name=\"KEY_MMS_MAX_MESSAGE_SIZE_INT\"/>\n\t\t<field name=\"KEY_MMS_MESSAGE_TEXT_MAX_SIZE_INT\"/>\n\t\t<field name=\"KEY_MMS_MMS_DELIVERY_REPORT_ENABLED_BOOL\"/>\n\t\t<field name=\"KEY_MMS_MMS_ENABLED_BOOL\"/>\n\t\t<field name=\"KEY_MMS_MMS_READ_REPORT_ENABLED_BOOL\"/>\n\t\t<field name=\"KEY_MMS_MULTIPART_SMS_ENABLED_BOOL\"/>\n\t\t<field name=\"KEY_MMS_NAI_SUFFIX_STRING\"/>\n\t\t<field name=\"KEY_MMS_NOTIFY_WAP_MMSC_ENABLED_BOOL\"/>\n\t\t<field name=\"KEY_MMS_RECIPIENT_LIMIT_INT\"/>\n\t\t<field name=\"KEY_MMS_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES_BOOL\"/>\n\t\t<field name=\"KEY_MMS_SHOW_CELL_BROADCAST_APP_LINKS_BOOL\"/>\n\t\t<field name=\"KEY_MMS_SMS_DELIVERY_REPORT_ENABLED_BOOL\"/>\n\t\t<field name=\"KEY_MMS_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD_INT\"/>\n\t\t<field name=\"KEY_MMS_SMS_TO_MMS_TEXT_THRESHOLD_INT\"/>\n\t\t<field name=\"KEY_MMS_SUBJECT_MAX_LENGTH_INT\"/>\n\t\t<field name=\"KEY_MMS_SUPPORT_HTTP_CHARSET_HEADER_BOOL\"/>\n\t\t<field name=\"KEY_MMS_SUPPORT_MMS_CONTENT_DISPOSITION_BOOL\"/>\n\t\t<field name=\"KEY_MMS_UA_PROF_TAG_NAME_STRING\"/>\n\t\t<field name=\"KEY_MMS_UA_PROF_URL_STRING\"/>\n\t\t<field name=\"KEY_MMS_USER_AGENT_STRING\"/>\n\t\t<field name=\"KEY_MONTHLY_DATA_CYCLE_DAY_INT\" since=\"26\"/>\n\t\t<field name=\"KEY_ONLY_AUTO_SELECT_IN_HOME_NETWORK_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_ONLY_SINGLE_DC_ALLOWED_INT_ARRAY\" since=\"26\"/>\n\t\t<field name=\"KEY_OPERATOR_SELECTION_EXPAND_BOOL\"/>\n\t\t<field name=\"KEY_OPPORTUNISTIC_NETWORK_BACKOFF_TIME_LONG\" since=\"30\"/>\n\t\t<field name=\"KEY_OPPORTUNISTIC_NETWORK_DATA_SWITCH_EXIT_HYSTERESIS_TIME_LONG\" since=\"30\"/>\n\t\t<field name=\"KEY_OPPORTUNISTIC_NETWORK_DATA_SWITCH_HYSTERESIS_TIME_LONG\" since=\"29\"/>\n\t\t<field name=\"KEY_OPPORTUNISTIC_NETWORK_ENTRY_OR_EXIT_HYSTERESIS_TIME_LONG\" since=\"29\"/>\n\t\t<field name=\"KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_BANDWIDTH_INT\" since=\"29\"/>\n\t\t<field name=\"KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_RSRP_INT\" since=\"29\"/>\n\t\t<field name=\"KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_RSSNR_INT\" since=\"29\"/>\n\t\t<field name=\"KEY_OPPORTUNISTIC_NETWORK_EXIT_THRESHOLD_RSRP_INT\" since=\"29\"/>\n\t\t<field name=\"KEY_OPPORTUNISTIC_NETWORK_EXIT_THRESHOLD_RSSNR_INT\" since=\"29\"/>\n\t\t<field name=\"KEY_OPPORTUNISTIC_NETWORK_MAX_BACKOFF_TIME_LONG\" since=\"30\"/>\n\t\t<field name=\"KEY_OPPORTUNISTIC_NETWORK_PING_PONG_TIME_LONG\" since=\"30\"/>\n\t\t<field name=\"KEY_PING_TEST_BEFORE_DATA_SWITCH_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_PREFER_2G_BOOL\"/>\n\t\t<field name=\"KEY_PREVENT_CLIR_ACTIVATION_AND_DEACTIVATION_CODE_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_RADIO_RESTART_FAILURE_CAUSES_INT_ARRAY\" since=\"29\"/>\n\t\t<field name=\"KEY_RCS_CONFIG_SERVER_URL_STRING\" since=\"26\"/>\n\t\t<field name=\"KEY_READ_ONLY_APN_FIELDS_STRING_ARRAY\" since=\"30\"/>\n\t\t<field name=\"KEY_READ_ONLY_APN_TYPES_STRING_ARRAY\" since=\"30\"/>\n\t\t<field name=\"KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL\" since=\"24\"/>\n\t\t<field name=\"KEY_RESTART_RADIO_ON_PDP_FAIL_REGULAR_DEACTIVATION_BOOL\" since=\"26\" deprecated=\"29\"/>\n\t\t<field name=\"KEY_RTT_SUPPORTED_BOOL\" since=\"28\"/>\n\t\t<field name=\"KEY_SHOW_4G_FOR_3G_DATA_ICON_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_SHOW_APN_SETTING_CDMA_BOOL\"/>\n\t\t<field name=\"KEY_SHOW_BLOCKING_PAY_PHONE_OPTION_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_SHOW_CALL_BLOCKING_DISABLED_NOTIFICATION_ALWAYS_BOOL\" since=\"29\"/>\n\t\t<field name=\"KEY_SHOW_CDMA_CHOICES_BOOL\"/>\n\t\t<field name=\"KEY_SHOW_ICCID_IN_SIM_STATUS_BOOL\" since=\"24\"/>\n\t\t<field name=\"KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_SHOW_ONSCREEN_DIAL_BUTTON_BOOL\"/>\n\t\t<field name=\"KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL\" since=\"28\"/>\n\t\t<field name=\"KEY_SHOW_VIDEO_CALL_CHARGES_ALERT_DIALOG_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_SHOW_WFC_LOCATION_PRIVACY_POLICY_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_SIMPLIFIED_NETWORK_SETTINGS_BOOL\" since=\"26\"/>\n\t\t<field name=\"KEY_SIM_NETWORK_UNLOCK_ALLOW_DISMISS_BOOL\"/>\n\t\t<field name=\"KEY_SMS_REQUIRES_DESTINATION_NUMBER_CONVERSION_BOOL\" since=\"26\"/>\n\t\t<field name=\"KEY_SUPPORT_3GPP_CALL_FORWARDING_WHILE_ROAMING_BOOL\" since=\"26\"/>\n\t\t<field name=\"KEY_SUPPORT_CLIR_NETWORK_DEFAULT_BOOL\" since=\"29\"/>\n\t\t<field name=\"KEY_SUPPORT_CONFERENCE_CALL_BOOL\" since=\"24\"/>\n\t\t<field name=\"KEY_SUPPORT_EMERGENCY_SMS_OVER_IMS_BOOL\" since=\"29\"/>\n\t\t<field name=\"KEY_SUPPORT_ENHANCED_CALL_BLOCKING_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_SUPPORT_IMS_CONFERENCE_EVENT_PACKAGE_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_SUPPORT_PAUSE_IMS_VIDEO_CALLS_BOOL\"/>\n\t\t<field name=\"KEY_SUPPORT_SWAP_AFTER_MERGE_BOOL\"/>\n\t\t<field name=\"KEY_SUPPORT_TDSCDMA_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_SUPPORT_TDSCDMA_ROAMING_NETWORKS_STRING_ARRAY\" since=\"30\"/>\n\t\t<field name=\"KEY_SWITCH_DATA_TO_PRIMARY_IF_PRIMARY_IS_OOS_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_TREAT_DOWNGRADED_VIDEO_CALLS_AS_VIDEO_CALLS_BOOL\" since=\"25\"/>\n\t\t<field name=\"KEY_TTY_SUPPORTED_BOOL\" since=\"29\"/>\n\t\t<field name=\"KEY_UNLOGGABLE_NUMBERS_STRING_ARRAY\" since=\"30\"/>\n\t\t<field name=\"KEY_USE_HFA_FOR_PROVISIONING_BOOL\"/>\n\t\t<field name=\"KEY_USE_OTASP_FOR_PROVISIONING_BOOL\"/>\n\t\t<field name=\"KEY_USE_RCS_PRESENCE_BOOL\" since=\"24\"/>\n\t\t<field name=\"KEY_USE_RCS_SIP_OPTIONS_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_VOICEMAIL_NOTIFICATION_PERSISTENT_BOOL\"/>\n\t\t<field name=\"KEY_VOICE_PRIVACY_DISABLE_UI_BOOL\"/>\n\t\t<field name=\"KEY_VOLTE_REPLACEMENT_RAT_INT\"/>\n\t\t<field name=\"KEY_VVM_CELLULAR_DATA_REQUIRED_BOOL\" since=\"24\"/>\n\t\t<field name=\"KEY_VVM_CLIENT_PREFIX_STRING\" since=\"26\"/>\n\t\t<field name=\"KEY_VVM_DESTINATION_NUMBER_STRING\"/>\n\t\t<field name=\"KEY_VVM_DISABLED_CAPABILITIES_STRING_ARRAY\" since=\"26\"/>\n\t\t<field name=\"KEY_VVM_LEGACY_MODE_ENABLED_BOOL\" since=\"26\"/>\n\t\t<field name=\"KEY_VVM_PORT_NUMBER_INT\"/>\n\t\t<field name=\"KEY_VVM_PREFETCH_BOOL\" since=\"24\"/>\n\t\t<field name=\"KEY_VVM_SSL_ENABLED_BOOL\" since=\"26\"/>\n\t\t<field name=\"KEY_VVM_TYPE_STRING\"/>\n\t\t<field name=\"KEY_WFC_EMERGENCY_ADDRESS_CARRIER_APP_STRING\" since=\"30\"/>\n\t\t<field name=\"KEY_WORLD_MODE_ENABLED_BOOL\" since=\"30\"/>\n\t\t<field name=\"KEY_WORLD_PHONE_BOOL\"/>\n\t</class>\n\t<class name=\"android/telephony/CarrierConfigManager$Gps\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"KEY_PERSIST_LPP_MODE_BOOL\"/>\n\t\t<field name=\"KEY_PREFIX\"/>\n\t</class>\n\t<class name=\"android/telephony/CarrierConfigManager$Ims\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"KEY_PREFIX\"/>\n\t</class>\n\t<class name=\"android/telephony/CellIdentity\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getOperatorAlphaLong()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getOperatorAlphaShort()Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/CellIdentityCdma\" since=\"17\">\n\t\t<extends name=\"android/telephony/CellIdentity\" since=\"28\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"28\"/>\n\t\t<implements name=\"android/os/Parcelable\" removed=\"28\"/>\n\t\t<method name=\"getBasestationId()I\"/>\n\t\t<method name=\"getLatitude()I\"/>\n\t\t<method name=\"getLongitude()I\"/>\n\t\t<method name=\"getNetworkId()I\"/>\n\t\t<method name=\"getSystemId()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/CellIdentityGsm\" since=\"17\">\n\t\t<extends name=\"android/telephony/CellIdentity\" since=\"28\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"28\"/>\n\t\t<implements name=\"android/os/Parcelable\" removed=\"28\"/>\n\t\t<method name=\"getAdditionalPlmns()Ljava/util/Set;\" since=\"30\"/>\n\t\t<method name=\"getArfcn()I\" since=\"24\"/>\n\t\t<method name=\"getBsic()I\" since=\"24\"/>\n\t\t<method name=\"getCid()I\"/>\n\t\t<method name=\"getLac()I\"/>\n\t\t<method name=\"getMcc()I\" deprecated=\"28\"/>\n\t\t<method name=\"getMccString()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getMnc()I\" deprecated=\"28\"/>\n\t\t<method name=\"getMncString()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getMobileNetworkOperator()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getPsc()I\" deprecated=\"18\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/CellIdentityLte\" since=\"17\">\n\t\t<extends name=\"android/telephony/CellIdentity\" since=\"28\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"28\"/>\n\t\t<implements name=\"android/os/Parcelable\" removed=\"28\"/>\n\t\t<method name=\"getAdditionalPlmns()Ljava/util/Set;\" since=\"30\"/>\n\t\t<method name=\"getBands()[I\" since=\"30\"/>\n\t\t<method name=\"getBandwidth()I\" since=\"28\"/>\n\t\t<method name=\"getCi()I\"/>\n\t\t<method name=\"getClosedSubscriberGroupInfo()Landroid/telephony/ClosedSubscriberGroupInfo;\" since=\"30\"/>\n\t\t<method name=\"getEarfcn()I\" since=\"24\"/>\n\t\t<method name=\"getMcc()I\" deprecated=\"28\"/>\n\t\t<method name=\"getMccString()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getMnc()I\" deprecated=\"28\"/>\n\t\t<method name=\"getMncString()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getMobileNetworkOperator()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getPci()I\"/>\n\t\t<method name=\"getTac()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/CellIdentityNr\" since=\"29\">\n\t\t<extends name=\"android/telephony/CellIdentity\"/>\n\t\t<method name=\"getAdditionalPlmns()Ljava/util/Set;\" since=\"30\"/>\n\t\t<method name=\"getBands()[I\" since=\"30\"/>\n\t\t<method name=\"getMccString()Ljava/lang/String;\"/>\n\t\t<method name=\"getMncString()Ljava/lang/String;\"/>\n\t\t<method name=\"getNci()J\"/>\n\t\t<method name=\"getNrarfcn()I\"/>\n\t\t<method name=\"getPci()I\"/>\n\t\t<method name=\"getTac()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/CellIdentityTdscdma\" since=\"28\">\n\t\t<extends name=\"android/telephony/CellIdentity\"/>\n\t\t<method name=\"getAdditionalPlmns()Ljava/util/Set;\" since=\"30\"/>\n\t\t<method name=\"getCid()I\"/>\n\t\t<method name=\"getClosedSubscriberGroupInfo()Landroid/telephony/ClosedSubscriberGroupInfo;\" since=\"30\"/>\n\t\t<method name=\"getCpid()I\"/>\n\t\t<method name=\"getLac()I\"/>\n\t\t<method name=\"getMccString()Ljava/lang/String;\"/>\n\t\t<method name=\"getMncString()Ljava/lang/String;\"/>\n\t\t<method name=\"getMobileNetworkOperator()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getUarfcn()I\" since=\"29\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/CellIdentityWcdma\" since=\"18\">\n\t\t<extends name=\"android/telephony/CellIdentity\" since=\"28\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"28\"/>\n\t\t<implements name=\"android/os/Parcelable\" removed=\"28\"/>\n\t\t<method name=\"getAdditionalPlmns()Ljava/util/Set;\" since=\"30\"/>\n\t\t<method name=\"getCid()I\"/>\n\t\t<method name=\"getClosedSubscriberGroupInfo()Landroid/telephony/ClosedSubscriberGroupInfo;\" since=\"30\"/>\n\t\t<method name=\"getLac()I\"/>\n\t\t<method name=\"getMcc()I\" deprecated=\"28\"/>\n\t\t<method name=\"getMccString()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getMnc()I\" deprecated=\"28\"/>\n\t\t<method name=\"getMncString()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getMobileNetworkOperator()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getPsc()I\"/>\n\t\t<method name=\"getUarfcn()I\" since=\"24\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/CellInfo\" since=\"17\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getCellConnectionStatus()I\" since=\"28\"/>\n\t\t<method name=\"getCellIdentity()Landroid/telephony/CellIdentity;\" since=\"30\"/>\n\t\t<method name=\"getCellSignalStrength()Landroid/telephony/CellSignalStrength;\" since=\"30\"/>\n\t\t<method name=\"getTimeStamp()J\" deprecated=\"30\"/>\n\t\t<method name=\"getTimestampMillis()J\" since=\"30\"/>\n\t\t<method name=\"isRegistered()Z\"/>\n\t\t<field name=\"CONNECTION_NONE\" since=\"28\"/>\n\t\t<field name=\"CONNECTION_PRIMARY_SERVING\" since=\"28\"/>\n\t\t<field name=\"CONNECTION_SECONDARY_SERVING\" since=\"28\"/>\n\t\t<field name=\"CONNECTION_UNKNOWN\" since=\"28\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"UNAVAILABLE\" since=\"29\"/>\n\t\t<field name=\"UNAVAILABLE_LONG\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/telephony/CellInfoCdma\" since=\"17\">\n\t\t<extends name=\"android/telephony/CellInfo\"/>\n\t\t<method name=\"getCellIdentity()Landroid/telephony/CellIdentityCdma;\"/>\n\t\t<method name=\"getCellSignalStrength()Landroid/telephony/CellSignalStrengthCdma;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/CellInfoGsm\" since=\"17\">\n\t\t<extends name=\"android/telephony/CellInfo\"/>\n\t\t<method name=\"getCellIdentity()Landroid/telephony/CellIdentityGsm;\"/>\n\t\t<method name=\"getCellSignalStrength()Landroid/telephony/CellSignalStrengthGsm;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/CellInfoLte\" since=\"17\">\n\t\t<extends name=\"android/telephony/CellInfo\"/>\n\t\t<method name=\"getCellIdentity()Landroid/telephony/CellIdentityLte;\"/>\n\t\t<method name=\"getCellSignalStrength()Landroid/telephony/CellSignalStrengthLte;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/CellInfoNr\" since=\"29\">\n\t\t<extends name=\"android/telephony/CellInfo\"/>\n\t\t<method name=\"getCellIdentity()Landroid/telephony/CellIdentity;\"/>\n\t\t<method name=\"getCellSignalStrength()Landroid/telephony/CellSignalStrength;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/CellInfoTdscdma\" since=\"29\">\n\t\t<extends name=\"android/telephony/CellInfo\"/>\n\t\t<method name=\"getCellIdentity()Landroid/telephony/CellIdentityTdscdma;\"/>\n\t\t<method name=\"getCellSignalStrength()Landroid/telephony/CellSignalStrengthTdscdma;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/CellInfoWcdma\" since=\"18\">\n\t\t<extends name=\"android/telephony/CellInfo\"/>\n\t\t<method name=\"getCellIdentity()Landroid/telephony/CellIdentityWcdma;\"/>\n\t\t<method name=\"getCellSignalStrength()Landroid/telephony/CellSignalStrengthWcdma;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/CellLocation\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getEmpty()Landroid/telephony/CellLocation;\"/>\n\t\t<method name=\"requestLocationUpdate()V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/telephony/CellSignalStrength\" since=\"17\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAsuLevel()I\"/>\n\t\t<method name=\"getDbm()I\"/>\n\t\t<method name=\"getLevel()I\"/>\n\t\t<method name=\"getNumSignalStrengthLevels()I\" since=\"30\"/>\n\t\t<field name=\"SIGNAL_STRENGTH_GOOD\" since=\"23\"/>\n\t\t<field name=\"SIGNAL_STRENGTH_GREAT\" since=\"23\"/>\n\t\t<field name=\"SIGNAL_STRENGTH_MODERATE\" since=\"23\"/>\n\t\t<field name=\"SIGNAL_STRENGTH_NONE_OR_UNKNOWN\" since=\"23\"/>\n\t\t<field name=\"SIGNAL_STRENGTH_POOR\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/telephony/CellSignalStrengthCdma\" since=\"17\">\n\t\t<extends name=\"android/telephony/CellSignalStrength\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getCdmaDbm()I\"/>\n\t\t<method name=\"getCdmaEcio()I\"/>\n\t\t<method name=\"getCdmaLevel()I\"/>\n\t\t<method name=\"getEvdoDbm()I\"/>\n\t\t<method name=\"getEvdoEcio()I\"/>\n\t\t<method name=\"getEvdoLevel()I\"/>\n\t\t<method name=\"getEvdoSnr()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/CellSignalStrengthGsm\" since=\"17\">\n\t\t<extends name=\"android/telephony/CellSignalStrength\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getBitErrorRate()I\" since=\"29\"/>\n\t\t<method name=\"getRssi()I\" since=\"30\"/>\n\t\t<method name=\"getTimingAdvance()I\" since=\"26\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/CellSignalStrengthLte\" since=\"17\">\n\t\t<extends name=\"android/telephony/CellSignalStrength\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getCqi()I\" since=\"26\"/>\n\t\t<method name=\"getRsrp()I\" since=\"26\"/>\n\t\t<method name=\"getRsrq()I\" since=\"26\"/>\n\t\t<method name=\"getRssi()I\" since=\"29\"/>\n\t\t<method name=\"getRssnr()I\" since=\"26\"/>\n\t\t<method name=\"getTimingAdvance()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/CellSignalStrengthNr\" since=\"29\">\n\t\t<extends name=\"android/telephony/CellSignalStrength\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getCsiRsrp()I\"/>\n\t\t<method name=\"getCsiRsrq()I\"/>\n\t\t<method name=\"getCsiSinr()I\"/>\n\t\t<method name=\"getSsRsrp()I\"/>\n\t\t<method name=\"getSsRsrq()I\"/>\n\t\t<method name=\"getSsSinr()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/CellSignalStrengthTdscdma\" since=\"29\">\n\t\t<extends name=\"android/telephony/CellSignalStrength\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getRscp()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/CellSignalStrengthWcdma\" since=\"18\">\n\t\t<extends name=\"android/telephony/CellSignalStrength\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getEcNo()I\" since=\"30\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/ClosedSubscriberGroupInfo\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getCsgIdentity()I\"/>\n\t\t<method name=\"getCsgIndicator()Z\"/>\n\t\t<method name=\"getHomeNodebName()Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/DisconnectCause\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ALREADY_DIALING\"/>\n\t\t<field name=\"ANSWERED_ELSEWHERE\"/>\n\t\t<field name=\"BUSY\"/>\n\t\t<field name=\"CALLING_DISABLED\"/>\n\t\t<field name=\"CALL_BARRED\"/>\n\t\t<field name=\"CALL_PULLED\"/>\n\t\t<field name=\"CANT_CALL_WHILE_RINGING\"/>\n\t\t<field name=\"CDMA_ACCESS_BLOCKED\"/>\n\t\t<field name=\"CDMA_ACCESS_FAILURE\"/>\n\t\t<field name=\"CDMA_ALREADY_ACTIVATED\"/>\n\t\t<field name=\"CDMA_DROP\"/>\n\t\t<field name=\"CDMA_INTERCEPT\"/>\n\t\t<field name=\"CDMA_LOCKED_UNTIL_POWER_CYCLE\"/>\n\t\t<field name=\"CDMA_NOT_EMERGENCY\"/>\n\t\t<field name=\"CDMA_PREEMPTED\"/>\n\t\t<field name=\"CDMA_REORDER\"/>\n\t\t<field name=\"CDMA_RETRY_ORDER\"/>\n\t\t<field name=\"CDMA_SO_REJECT\"/>\n\t\t<field name=\"CONGESTION\"/>\n\t\t<field name=\"CS_RESTRICTED\"/>\n\t\t<field name=\"CS_RESTRICTED_EMERGENCY\"/>\n\t\t<field name=\"CS_RESTRICTED_NORMAL\"/>\n\t\t<field name=\"DATA_DISABLED\"/>\n\t\t<field name=\"DATA_LIMIT_REACHED\"/>\n\t\t<field name=\"DIALED_CALL_FORWARDING_WHILE_ROAMING\"/>\n\t\t<field name=\"DIALED_MMI\"/>\n\t\t<field name=\"DIAL_LOW_BATTERY\"/>\n\t\t<field name=\"DIAL_MODIFIED_TO_DIAL\"/>\n\t\t<field name=\"DIAL_MODIFIED_TO_DIAL_VIDEO\"/>\n\t\t<field name=\"DIAL_MODIFIED_TO_SS\"/>\n\t\t<field name=\"DIAL_MODIFIED_TO_USSD\"/>\n\t\t<field name=\"DIAL_VIDEO_MODIFIED_TO_DIAL\"/>\n\t\t<field name=\"DIAL_VIDEO_MODIFIED_TO_DIAL_VIDEO\"/>\n\t\t<field name=\"DIAL_VIDEO_MODIFIED_TO_SS\"/>\n\t\t<field name=\"DIAL_VIDEO_MODIFIED_TO_USSD\"/>\n\t\t<field name=\"EMERGENCY_CALL_OVER_WFC_NOT_AVAILABLE\"/>\n\t\t<field name=\"EMERGENCY_PERM_FAILURE\"/>\n\t\t<field name=\"EMERGENCY_TEMP_FAILURE\"/>\n\t\t<field name=\"ERROR_UNSPECIFIED\"/>\n\t\t<field name=\"FDN_BLOCKED\"/>\n\t\t<field name=\"ICC_ERROR\"/>\n\t\t<field name=\"IMEI_NOT_ACCEPTED\"/>\n\t\t<field name=\"IMS_ACCESS_BLOCKED\"/>\n\t\t<field name=\"IMS_MERGED_SUCCESSFULLY\"/>\n\t\t<field name=\"IMS_SIP_ALTERNATE_EMERGENCY_CALL\"/>\n\t\t<field name=\"INCOMING_MISSED\"/>\n\t\t<field name=\"INCOMING_REJECTED\"/>\n\t\t<field name=\"INVALID_CREDENTIALS\"/>\n\t\t<field name=\"INVALID_NUMBER\"/>\n\t\t<field name=\"LIMIT_EXCEEDED\"/>\n\t\t<field name=\"LOCAL\"/>\n\t\t<field name=\"LOST_SIGNAL\"/>\n\t\t<field name=\"LOW_BATTERY\"/>\n\t\t<field name=\"MAXIMUM_NUMBER_OF_CALLS_REACHED\"/>\n\t\t<field name=\"MEDIA_TIMEOUT\"/>\n\t\t<field name=\"MMI\"/>\n\t\t<field name=\"NORMAL\"/>\n\t\t<field name=\"NORMAL_UNSPECIFIED\"/>\n\t\t<field name=\"NOT_DISCONNECTED\"/>\n\t\t<field name=\"NOT_VALID\"/>\n\t\t<field name=\"NO_PHONE_NUMBER_SUPPLIED\"/>\n\t\t<field name=\"NUMBER_UNREACHABLE\"/>\n\t\t<field name=\"OTASP_PROVISIONING_IN_PROCESS\"/>\n\t\t<field name=\"OUTGOING_CANCELED\"/>\n\t\t<field name=\"OUTGOING_EMERGENCY_CALL_PLACED\"/>\n\t\t<field name=\"OUTGOING_FAILURE\"/>\n\t\t<field name=\"OUT_OF_NETWORK\"/>\n\t\t<field name=\"OUT_OF_SERVICE\"/>\n\t\t<field name=\"POWER_OFF\"/>\n\t\t<field name=\"SERVER_ERROR\"/>\n\t\t<field name=\"SERVER_UNREACHABLE\"/>\n\t\t<field name=\"TIMED_OUT\"/>\n\t\t<field name=\"TOO_MANY_ONGOING_CALLS\"/>\n\t\t<field name=\"UNOBTAINABLE_NUMBER\"/>\n\t\t<field name=\"VIDEO_CALL_NOT_ALLOWED_WHILE_TTY_ENABLED\"/>\n\t\t<field name=\"VOICEMAIL_NUMBER_MISSING\"/>\n\t\t<field name=\"WFC_SERVICE_NOT_AVAILABLE_IN_THIS_LOCATION\"/>\n\t\t<field name=\"WIFI_LOST\"/>\n\t</class>\n\t<class name=\"android/telephony/IccOpenLogicalChannelResponse\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getChannel()I\"/>\n\t\t<method name=\"getSelectResponse()[B\"/>\n\t\t<method name=\"getStatus()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"INVALID_CHANNEL\"/>\n\t\t<field name=\"STATUS_MISSING_RESOURCE\"/>\n\t\t<field name=\"STATUS_NO_ERROR\"/>\n\t\t<field name=\"STATUS_NO_SUCH_ELEMENT\"/>\n\t\t<field name=\"STATUS_UNKNOWN_ERROR\"/>\n\t</class>\n\t<class name=\"android/telephony/MbmsDownloadSession\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"addProgressListener(Landroid/telephony/mbms/DownloadRequest;Ljava/util/concurrent/Executor;Landroid/telephony/mbms/DownloadProgressListener;)V\"/>\n\t\t<method name=\"addServiceAnnouncement([B)V\" since=\"30\"/>\n\t\t<method name=\"addStatusListener(Landroid/telephony/mbms/DownloadRequest;Ljava/util/concurrent/Executor;Landroid/telephony/mbms/DownloadStatusListener;)V\"/>\n\t\t<method name=\"cancelDownload(Landroid/telephony/mbms/DownloadRequest;)V\"/>\n\t\t<method name=\"create(Landroid/content/Context;Ljava/util/concurrent/Executor;ILandroid/telephony/mbms/MbmsDownloadSessionCallback;)Landroid/telephony/MbmsDownloadSession;\"/>\n\t\t<method name=\"create(Landroid/content/Context;Ljava/util/concurrent/Executor;Landroid/telephony/mbms/MbmsDownloadSessionCallback;)Landroid/telephony/MbmsDownloadSession;\"/>\n\t\t<method name=\"download(Landroid/telephony/mbms/DownloadRequest;)V\"/>\n\t\t<method name=\"getMaximumServiceAnnouncementSize()I\" since=\"30\"/>\n\t\t<method name=\"getTempFileRootDirectory()Ljava/io/File;\"/>\n\t\t<method name=\"listPendingDownloads()Ljava/util/List;\"/>\n\t\t<method name=\"removeProgressListener(Landroid/telephony/mbms/DownloadRequest;Landroid/telephony/mbms/DownloadProgressListener;)V\"/>\n\t\t<method name=\"removeStatusListener(Landroid/telephony/mbms/DownloadRequest;Landroid/telephony/mbms/DownloadStatusListener;)V\"/>\n\t\t<method name=\"requestDownloadState(Landroid/telephony/mbms/DownloadRequest;Landroid/telephony/mbms/FileInfo;)V\"/>\n\t\t<method name=\"requestUpdateFileServices(Ljava/util/List;)V\"/>\n\t\t<method name=\"resetDownloadKnowledge(Landroid/telephony/mbms/DownloadRequest;)V\"/>\n\t\t<method name=\"setTempFileRootDirectory(Ljava/io/File;)V\"/>\n\t\t<field name=\"DEFAULT_TOP_LEVEL_TEMP_DIRECTORY\"/>\n\t\t<field name=\"EXTRA_MBMS_COMPLETED_FILE_URI\"/>\n\t\t<field name=\"EXTRA_MBMS_DOWNLOAD_REQUEST\"/>\n\t\t<field name=\"EXTRA_MBMS_DOWNLOAD_RESULT\"/>\n\t\t<field name=\"EXTRA_MBMS_FILE_INFO\"/>\n\t\t<field name=\"RESULT_CANCELLED\"/>\n\t\t<field name=\"RESULT_DOWNLOAD_FAILURE\"/>\n\t\t<field name=\"RESULT_EXPIRED\"/>\n\t\t<field name=\"RESULT_FILE_ROOT_UNREACHABLE\"/>\n\t\t<field name=\"RESULT_IO_ERROR\"/>\n\t\t<field name=\"RESULT_OUT_OF_STORAGE\"/>\n\t\t<field name=\"RESULT_SERVICE_ID_NOT_DEFINED\"/>\n\t\t<field name=\"RESULT_SUCCESSFUL\"/>\n\t\t<field name=\"STATUS_ACTIVELY_DOWNLOADING\"/>\n\t\t<field name=\"STATUS_PENDING_DOWNLOAD\"/>\n\t\t<field name=\"STATUS_PENDING_DOWNLOAD_WINDOW\"/>\n\t\t<field name=\"STATUS_PENDING_REPAIR\"/>\n\t\t<field name=\"STATUS_UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/telephony/MbmsGroupCallSession\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"create(Landroid/content/Context;ILjava/util/concurrent/Executor;Landroid/telephony/mbms/MbmsGroupCallSessionCallback;)Landroid/telephony/MbmsGroupCallSession;\"/>\n\t\t<method name=\"create(Landroid/content/Context;Ljava/util/concurrent/Executor;Landroid/telephony/mbms/MbmsGroupCallSessionCallback;)Landroid/telephony/MbmsGroupCallSession;\"/>\n\t\t<method name=\"startGroupCall(JLjava/util/List;Ljava/util/List;Ljava/util/concurrent/Executor;Landroid/telephony/mbms/GroupCallCallback;)Landroid/telephony/mbms/GroupCall;\"/>\n\t</class>\n\t<class name=\"android/telephony/MbmsStreamingSession\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"create(Landroid/content/Context;Ljava/util/concurrent/Executor;ILandroid/telephony/mbms/MbmsStreamingSessionCallback;)Landroid/telephony/MbmsStreamingSession;\"/>\n\t\t<method name=\"create(Landroid/content/Context;Ljava/util/concurrent/Executor;Landroid/telephony/mbms/MbmsStreamingSessionCallback;)Landroid/telephony/MbmsStreamingSession;\"/>\n\t\t<method name=\"requestUpdateStreamingServices(Ljava/util/List;)V\"/>\n\t\t<method name=\"startStreaming(Landroid/telephony/mbms/StreamingServiceInfo;Ljava/util/concurrent/Executor;Landroid/telephony/mbms/StreamingServiceCallback;)Landroid/telephony/mbms/StreamingService;\"/>\n\t</class>\n\t<class name=\"android/telephony/NeighboringCellInfo\" since=\"3\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(II)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/String;I)V\" since=\"7\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" deprecated=\"29\"/>\n\t\t<method name=\"getCid()I\" deprecated=\"29\"/>\n\t\t<method name=\"getLac()I\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getNetworkType()I\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getPsc()I\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getRssi()I\" deprecated=\"29\"/>\n\t\t<method name=\"setCid(I)V\" deprecated=\"15\"/>\n\t\t<method name=\"setRssi(I)V\" deprecated=\"15\"/>\n\t\t<field name=\"CREATOR\" deprecated=\"29\"/>\n\t\t<field name=\"UNKNOWN_CID\" deprecated=\"29\"/>\n\t\t<field name=\"UNKNOWN_RSSI\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/telephony/NetworkRegistrationInfo\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getAccessNetworkTechnology()I\"/>\n\t\t<method name=\"getAvailableServices()Ljava/util/List;\"/>\n\t\t<method name=\"getCellIdentity()Landroid/telephony/CellIdentity;\"/>\n\t\t<method name=\"getDomain()I\"/>\n\t\t<method name=\"getRegisteredPlmn()Ljava/lang/String;\"/>\n\t\t<method name=\"getTransportType()I\"/>\n\t\t<method name=\"isRegistered()Z\"/>\n\t\t<method name=\"isRoaming()Z\"/>\n\t\t<method name=\"isSearching()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"DOMAIN_CS\"/>\n\t\t<field name=\"DOMAIN_CS_PS\"/>\n\t\t<field name=\"DOMAIN_PS\"/>\n\t\t<field name=\"DOMAIN_UNKNOWN\"/>\n\t\t<field name=\"NR_STATE_CONNECTED\"/>\n\t\t<field name=\"NR_STATE_NONE\"/>\n\t\t<field name=\"NR_STATE_NOT_RESTRICTED\"/>\n\t\t<field name=\"NR_STATE_RESTRICTED\"/>\n\t\t<field name=\"SERVICE_TYPE_DATA\"/>\n\t\t<field name=\"SERVICE_TYPE_EMERGENCY\"/>\n\t\t<field name=\"SERVICE_TYPE_SMS\"/>\n\t\t<field name=\"SERVICE_TYPE_UNKNOWN\"/>\n\t\t<field name=\"SERVICE_TYPE_VIDEO\"/>\n\t\t<field name=\"SERVICE_TYPE_VOICE\"/>\n\t</class>\n\t<class name=\"android/telephony/NetworkScan\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"stopScan()V\"/>\n\t\t<field name=\"ERROR_INTERRUPTED\"/>\n\t\t<field name=\"ERROR_INVALID_SCAN\"/>\n\t\t<field name=\"ERROR_INVALID_SCANID\"/>\n\t\t<field name=\"ERROR_MODEM_ERROR\"/>\n\t\t<field name=\"ERROR_MODEM_UNAVAILABLE\"/>\n\t\t<field name=\"ERROR_RADIO_INTERFACE_ERROR\"/>\n\t\t<field name=\"ERROR_UNSUPPORTED\"/>\n\t\t<field name=\"SUCCESS\"/>\n\t</class>\n\t<class name=\"android/telephony/NetworkScanRequest\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(I[Landroid/telephony/RadioAccessSpecifier;IIZILjava/util/ArrayList;)V\"/>\n\t\t<method name=\"getIncrementalResults()Z\"/>\n\t\t<method name=\"getIncrementalResultsPeriodicity()I\"/>\n\t\t<method name=\"getMaxSearchTime()I\"/>\n\t\t<method name=\"getPlmns()Ljava/util/ArrayList;\"/>\n\t\t<method name=\"getScanType()I\"/>\n\t\t<method name=\"getSearchPeriodicity()I\"/>\n\t\t<method name=\"getSpecifiers()[Landroid/telephony/RadioAccessSpecifier;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"SCAN_TYPE_ONE_SHOT\"/>\n\t\t<field name=\"SCAN_TYPE_PERIODIC\"/>\n\t</class>\n\t<class name=\"android/telephony/PackageChangeReceiver\" since=\"30\">\n\t\t<extends name=\"android/content/BroadcastReceiver\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onHandleForceStop([Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"onPackageAdded(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onPackageAppeared()V\"/>\n\t\t<method name=\"onPackageDisappeared()V\"/>\n\t\t<method name=\"onPackageModified(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onPackageRemoved(Ljava/lang/String;)V\"/>\n\t\t<method name=\"onPackageUpdateFinished(Ljava/lang/String;)V\"/>\n\t\t<method name=\"register(Landroid/content/Context;Landroid/os/Looper;Landroid/os/UserHandle;)V\"/>\n\t\t<method name=\"unregister()V\"/>\n\t</class>\n\t<class name=\"android/telephony/PhoneCapability\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/PhoneNumberFormattingTextWatcher\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/TextWatcher\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/telephony/PhoneNumberUtils\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addTtsSpan(Landroid/text/Spannable;II)V\" since=\"23\"/>\n\t\t<method name=\"calledPartyBCDFragmentToString([BII)Ljava/lang/String;\" deprecated=\"28\"/>\n\t\t<method name=\"calledPartyBCDFragmentToString([BIII)Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"calledPartyBCDToString([BII)Ljava/lang/String;\" deprecated=\"28\"/>\n\t\t<method name=\"calledPartyBCDToString([BIII)Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"compare(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)Z\" since=\"5\"/>\n\t\t<method name=\"compare(Ljava/lang/String;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"convertKeypadLettersToDigits(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"createTtsSpan(Ljava/lang/String;)Landroid/text/style/TtsSpan;\" since=\"23\"/>\n\t\t<method name=\"createTtsSpannable(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;\" since=\"23\"/>\n\t\t<method name=\"extractNetworkPortion(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"extractPostDialPortion(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"formatJapaneseNumber(Landroid/text/Editable;)V\" since=\"3\" deprecated=\"21\"/>\n\t\t<method name=\"formatNanpNumber(Landroid/text/Editable;)V\" deprecated=\"21\"/>\n\t\t<method name=\"formatNumber(Landroid/text/Editable;I)V\" deprecated=\"21\"/>\n\t\t<method name=\"formatNumber(Ljava/lang/String;)Ljava/lang/String;\" deprecated=\"21\"/>\n\t\t<method name=\"formatNumber(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"formatNumber(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"formatNumberToE164(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"formatNumberToRFC3966(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\" since=\"23\"/>\n\t\t<method name=\"getFormatTypeForLocale(Ljava/util/Locale;)I\" deprecated=\"21\"/>\n\t\t<method name=\"getNumberFromIntent(Landroid/content/Intent;Landroid/content/Context;)Ljava/lang/String;\"/>\n\t\t<method name=\"getStrippedReversed(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"is12Key(C)Z\"/>\n\t\t<method name=\"isDialable(C)Z\"/>\n\t\t<method name=\"isEmergencyNumber(Ljava/lang/String;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"isGlobalPhoneNumber(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isISODigit(C)Z\"/>\n\t\t<method name=\"isLocalEmergencyNumber(Landroid/content/Context;Ljava/lang/String;)Z\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"isNonSeparator(C)Z\"/>\n\t\t<method name=\"isReallyDialable(C)Z\"/>\n\t\t<method name=\"isStartsPostDial(C)Z\"/>\n\t\t<method name=\"isVoiceMailNumber(Ljava/lang/String;)Z\" since=\"21\"/>\n\t\t<method name=\"isWellFormedSmsAddress(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"networkPortionToCalledPartyBCD(Ljava/lang/String;)[B\"/>\n\t\t<method name=\"networkPortionToCalledPartyBCDWithLength(Ljava/lang/String;)[B\"/>\n\t\t<method name=\"normalizeNumber(Ljava/lang/String;)Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"numberToCalledPartyBCD(Ljava/lang/String;)[B\" deprecated=\"28\"/>\n\t\t<method name=\"numberToCalledPartyBCD(Ljava/lang/String;I)[B\" since=\"28\"/>\n\t\t<method name=\"replaceUnicodeDigits(Ljava/lang/String;)Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"stringFromStringAndTOA(Ljava/lang/String;I)Ljava/lang/String;\"/>\n\t\t<method name=\"stripSeparators(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"toCallerIDMinMatch(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"toaFromString(Ljava/lang/String;)I\"/>\n\t\t<field name=\"BCD_EXTENDED_TYPE_CALLED_PARTY\" since=\"28\"/>\n\t\t<field name=\"BCD_EXTENDED_TYPE_EF_ADN\" since=\"28\"/>\n\t\t<field name=\"FORMAT_JAPAN\" since=\"3\"/>\n\t\t<field name=\"FORMAT_NANP\"/>\n\t\t<field name=\"FORMAT_UNKNOWN\"/>\n\t\t<field name=\"PAUSE\"/>\n\t\t<field name=\"TOA_International\"/>\n\t\t<field name=\"TOA_Unknown\"/>\n\t\t<field name=\"WAIT\"/>\n\t\t<field name=\"WILD\"/>\n\t</class>\n\t<class name=\"android/telephony/PhoneStateListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/concurrent/Executor;)V\" since=\"29\"/>\n\t\t<method name=\"onActiveDataSubscriptionIdChanged(I)V\" since=\"29\"/>\n\t\t<method name=\"onBarringInfoChanged(Landroid/telephony/BarringInfo;)V\" since=\"30\"/>\n\t\t<method name=\"onCallDisconnectCauseChanged(II)V\" since=\"30\"/>\n\t\t<method name=\"onCallForwardingIndicatorChanged(Z)V\"/>\n\t\t<method name=\"onCallStateChanged(ILjava/lang/String;)V\"/>\n\t\t<method name=\"onCellInfoChanged(Ljava/util/List;)V\" since=\"17\"/>\n\t\t<method name=\"onCellLocationChanged(Landroid/telephony/CellLocation;)V\"/>\n\t\t<method name=\"onDataActivity(I)V\"/>\n\t\t<method name=\"onDataConnectionStateChanged(I)V\"/>\n\t\t<method name=\"onDataConnectionStateChanged(II)V\" since=\"7\"/>\n\t\t<method name=\"onDisplayInfoChanged(Landroid/telephony/TelephonyDisplayInfo;)V\" since=\"30\"/>\n\t\t<method name=\"onImsCallDisconnectCauseChanged(Landroid/telephony/ims/ImsReasonInfo;)V\" since=\"30\"/>\n\t\t<method name=\"onMessageWaitingIndicatorChanged(Z)V\"/>\n\t\t<method name=\"onPreciseDataConnectionStateChanged(Landroid/telephony/PreciseDataConnectionState;)V\" since=\"30\"/>\n\t\t<method name=\"onRegistrationFailed(Landroid/telephony/CellIdentity;Ljava/lang/String;III)V\" since=\"30\"/>\n\t\t<method name=\"onServiceStateChanged(Landroid/telephony/ServiceState;)V\"/>\n\t\t<method name=\"onSignalStrengthChanged(I)V\" deprecated=\"15\"/>\n\t\t<method name=\"onSignalStrengthsChanged(Landroid/telephony/SignalStrength;)V\" since=\"7\"/>\n\t\t<method name=\"onUserMobileDataStateChanged(Z)V\" since=\"28\"/>\n\t\t<field name=\"LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE\" since=\"29\"/>\n\t\t<field name=\"LISTEN_BARRING_INFO\" since=\"30\"/>\n\t\t<field name=\"LISTEN_CALL_DISCONNECT_CAUSES\" since=\"30\"/>\n\t\t<field name=\"LISTEN_CALL_FORWARDING_INDICATOR\"/>\n\t\t<field name=\"LISTEN_CALL_STATE\"/>\n\t\t<field name=\"LISTEN_CELL_INFO\" since=\"17\"/>\n\t\t<field name=\"LISTEN_CELL_LOCATION\"/>\n\t\t<field name=\"LISTEN_DATA_ACTIVITY\"/>\n\t\t<field name=\"LISTEN_DATA_CONNECTION_STATE\"/>\n\t\t<field name=\"LISTEN_DISPLAY_INFO_CHANGED\" since=\"30\"/>\n\t\t<field name=\"LISTEN_EMERGENCY_NUMBER_LIST\" since=\"29\"/>\n\t\t<field name=\"LISTEN_IMS_CALL_DISCONNECT_CAUSES\" since=\"30\"/>\n\t\t<field name=\"LISTEN_MESSAGE_WAITING_INDICATOR\"/>\n\t\t<field name=\"LISTEN_NONE\"/>\n\t\t<field name=\"LISTEN_PRECISE_DATA_CONNECTION_STATE\" since=\"30\"/>\n\t\t<field name=\"LISTEN_REGISTRATION_FAILURE\" since=\"30\"/>\n\t\t<field name=\"LISTEN_SERVICE_STATE\"/>\n\t\t<field name=\"LISTEN_SIGNAL_STRENGTH\" deprecated=\"15\"/>\n\t\t<field name=\"LISTEN_SIGNAL_STRENGTHS\" since=\"7\"/>\n\t\t<field name=\"LISTEN_USER_MOBILE_DATA_STATE\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/telephony/PreciseDataConnectionState\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getApnSetting()Landroid/telephony/data/ApnSetting;\"/>\n\t\t<method name=\"getLastCauseCode()I\"/>\n\t\t<method name=\"getLinkProperties()Landroid/net/LinkProperties;\"/>\n\t\t<method name=\"getNetworkType()I\"/>\n\t\t<method name=\"getState()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/RadioAccessSpecifier\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(I[I[I)V\"/>\n\t\t<method name=\"getBands()[I\"/>\n\t\t<method name=\"getChannels()[I\"/>\n\t\t<method name=\"getRadioAccessNetwork()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/ServiceState\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/telephony/ServiceState;)V\"/>\n\t\t<method name=\"copyFrom(Landroid/telephony/ServiceState;)V\"/>\n\t\t<method name=\"getCdmaNetworkId()I\" since=\"28\"/>\n\t\t<method name=\"getCdmaSystemId()I\" since=\"28\"/>\n\t\t<method name=\"getCellBandwidths()[I\" since=\"28\"/>\n\t\t<method name=\"getChannelNumber()I\" since=\"28\"/>\n\t\t<method name=\"getDuplexMode()I\" since=\"28\"/>\n\t\t<method name=\"getIsManualSelection()Z\"/>\n\t\t<method name=\"getNetworkRegistrationInfoList()Ljava/util/List;\" since=\"30\"/>\n\t\t<method name=\"getOperatorAlphaLong()Ljava/lang/String;\"/>\n\t\t<method name=\"getOperatorAlphaShort()Ljava/lang/String;\"/>\n\t\t<method name=\"getOperatorNumeric()Ljava/lang/String;\"/>\n\t\t<method name=\"getRoaming()Z\"/>\n\t\t<method name=\"getState()I\"/>\n\t\t<method name=\"isSearching()Z\" since=\"30\"/>\n\t\t<method name=\"setIsManualSelection(Z)V\"/>\n\t\t<method name=\"setOperatorName(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setRoaming(Z)V\"/>\n\t\t<method name=\"setState(I)V\"/>\n\t\t<method name=\"setStateOff()V\"/>\n\t\t<method name=\"setStateOutOfService()V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"DUPLEX_MODE_FDD\" since=\"28\"/>\n\t\t<field name=\"DUPLEX_MODE_TDD\" since=\"28\"/>\n\t\t<field name=\"DUPLEX_MODE_UNKNOWN\" since=\"28\"/>\n\t\t<field name=\"STATE_EMERGENCY_ONLY\"/>\n\t\t<field name=\"STATE_IN_SERVICE\"/>\n\t\t<field name=\"STATE_OUT_OF_SERVICE\"/>\n\t\t<field name=\"STATE_POWER_OFF\"/>\n\t\t<field name=\"UNKNOWN_ID\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/telephony/SignalStrength\" since=\"7\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getCdmaDbm()I\" deprecated=\"29\"/>\n\t\t<method name=\"getCdmaEcio()I\" deprecated=\"29\"/>\n\t\t<method name=\"getCellSignalStrengths()Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"getCellSignalStrengths(Ljava/lang/Class;)Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"getEvdoDbm()I\" deprecated=\"29\"/>\n\t\t<method name=\"getEvdoEcio()I\" deprecated=\"29\"/>\n\t\t<method name=\"getEvdoSnr()I\" deprecated=\"29\"/>\n\t\t<method name=\"getGsmBitErrorRate()I\" deprecated=\"29\"/>\n\t\t<method name=\"getGsmSignalStrength()I\" deprecated=\"29\"/>\n\t\t<method name=\"getLevel()I\" since=\"23\"/>\n\t\t<method name=\"getTimestampMillis()J\" since=\"30\"/>\n\t\t<method name=\"isGsm()Z\" deprecated=\"29\"/>\n\t\t<field name=\"CREATOR\" since=\"30\"/>\n\t\t<field name=\"INVALID\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/telephony/SmsManager\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createAppSpecificSmsToken(Landroid/app/PendingIntent;)Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"createAppSpecificSmsTokenWithPackageInfo(Ljava/lang/String;Landroid/app/PendingIntent;)Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"divideMessage(Ljava/lang/String;)Ljava/util/ArrayList;\"/>\n\t\t<method name=\"downloadMultimediaMessage(Landroid/content/Context;Ljava/lang/String;Landroid/net/Uri;Landroid/os/Bundle;Landroid/app/PendingIntent;)V\" since=\"21\"/>\n\t\t<method name=\"getCarrierConfigValues()Landroid/os/Bundle;\" since=\"21\"/>\n\t\t<method name=\"getDefault()Landroid/telephony/SmsManager;\"/>\n\t\t<method name=\"getDefaultSmsSubscriptionId()I\" since=\"22\"/>\n\t\t<method name=\"getSmsManagerForSubscriptionId(I)Landroid/telephony/SmsManager;\" since=\"22\"/>\n\t\t<method name=\"getSmsMessagesForFinancialApp(Landroid/os/Bundle;Ljava/util/concurrent/Executor;Landroid/telephony/SmsManager$FinancialSmsCallback;)V\" since=\"29\"/>\n\t\t<method name=\"getSmscAddress()Ljava/lang/String;\" since=\"30\"/>\n\t\t<method name=\"getSubscriptionId()I\" since=\"22\"/>\n\t\t<method name=\"injectSmsPdu([BLjava/lang/String;Landroid/app/PendingIntent;)V\" since=\"22\"/>\n\t\t<method name=\"sendDataMessage(Ljava/lang/String;Ljava/lang/String;S[BLandroid/app/PendingIntent;Landroid/app/PendingIntent;)V\"/>\n\t\t<method name=\"sendMultimediaMessage(Landroid/content/Context;Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Landroid/app/PendingIntent;)V\" since=\"21\"/>\n\t\t<method name=\"sendMultipartTextMessage(Ljava/lang/String;Ljava/lang/String;Ljava/util/ArrayList;Ljava/util/ArrayList;Ljava/util/ArrayList;)V\"/>\n\t\t<method name=\"sendTextMessage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;)V\"/>\n\t\t<method name=\"sendTextMessageWithoutPersisting(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;)V\" since=\"28\"/>\n\t\t<method name=\"setSmscAddress(Ljava/lang/String;)Z\" since=\"30\"/>\n\t\t<field name=\"EXTRA_MMS_DATA\" since=\"21\"/>\n\t\t<field name=\"EXTRA_MMS_HTTP_STATUS\" since=\"22\"/>\n\t\t<field name=\"MMS_CONFIG_ALIAS_ENABLED\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_ALIAS_MAX_CHARS\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_ALIAS_MIN_CHARS\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_ALLOW_ATTACH_AUDIO\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_APPEND_TRANSACTION_ID\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_EMAIL_GATEWAY_NUMBER\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_GROUP_MMS_ENABLED\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_HTTP_PARAMS\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_HTTP_SOCKET_TIMEOUT\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_MAX_IMAGE_HEIGHT\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_MAX_IMAGE_WIDTH\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_MAX_MESSAGE_SIZE\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_MESSAGE_TEXT_MAX_SIZE\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_MMS_DELIVERY_REPORT_ENABLED\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_MMS_ENABLED\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_MMS_READ_REPORT_ENABLED\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_MULTIPART_SMS_ENABLED\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_NAI_SUFFIX\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_NOTIFY_WAP_MMSC_ENABLED\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_RECIPIENT_LIMIT\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_SHOW_CELL_BROADCAST_APP_LINKS\" since=\"22\"/>\n\t\t<field name=\"MMS_CONFIG_SMS_DELIVERY_REPORT_ENABLED\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_SMS_TO_MMS_TEXT_THRESHOLD\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_SUBJECT_MAX_LENGTH\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_SUPPORT_HTTP_CHARSET_HEADER\" since=\"23\"/>\n\t\t<field name=\"MMS_CONFIG_SUPPORT_MMS_CONTENT_DISPOSITION\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_UA_PROF_TAG_NAME\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_UA_PROF_URL\" since=\"21\"/>\n\t\t<field name=\"MMS_CONFIG_USER_AGENT\" since=\"21\"/>\n\t\t<field name=\"MMS_ERROR_CONFIGURATION_ERROR\" since=\"21\"/>\n\t\t<field name=\"MMS_ERROR_HTTP_FAILURE\" since=\"21\"/>\n\t\t<field name=\"MMS_ERROR_INVALID_APN\" since=\"21\"/>\n\t\t<field name=\"MMS_ERROR_IO_ERROR\" since=\"21\"/>\n\t\t<field name=\"MMS_ERROR_NO_DATA_NETWORK\" since=\"22\"/>\n\t\t<field name=\"MMS_ERROR_RETRY\" since=\"21\"/>\n\t\t<field name=\"MMS_ERROR_UNABLE_CONNECT_MMS\" since=\"21\"/>\n\t\t<field name=\"MMS_ERROR_UNSPECIFIED\" since=\"21\"/>\n\t\t<field name=\"RESULT_BLUETOOTH_DISCONNECTED\" since=\"30\"/>\n\t\t<field name=\"RESULT_CANCELLED\" since=\"30\"/>\n\t\t<field name=\"RESULT_ENCODING_ERROR\" since=\"30\"/>\n\t\t<field name=\"RESULT_ERROR_FDN_CHECK_FAILURE\" since=\"30\"/>\n\t\t<field name=\"RESULT_ERROR_GENERIC_FAILURE\"/>\n\t\t<field name=\"RESULT_ERROR_LIMIT_EXCEEDED\" since=\"27\"/>\n\t\t<field name=\"RESULT_ERROR_NONE\" since=\"30\"/>\n\t\t<field name=\"RESULT_ERROR_NO_SERVICE\"/>\n\t\t<field name=\"RESULT_ERROR_NULL_PDU\"/>\n\t\t<field name=\"RESULT_ERROR_RADIO_OFF\"/>\n\t\t<field name=\"RESULT_ERROR_SHORT_CODE_NEVER_ALLOWED\" since=\"27\"/>\n\t\t<field name=\"RESULT_ERROR_SHORT_CODE_NOT_ALLOWED\" since=\"27\"/>\n\t\t<field name=\"RESULT_INTERNAL_ERROR\" since=\"30\"/>\n\t\t<field name=\"RESULT_INVALID_ARGUMENTS\" since=\"30\"/>\n\t\t<field name=\"RESULT_INVALID_BLUETOOTH_ADDRESS\" since=\"30\"/>\n\t\t<field name=\"RESULT_INVALID_SMSC_ADDRESS\" since=\"30\"/>\n\t\t<field name=\"RESULT_INVALID_SMS_FORMAT\" since=\"30\"/>\n\t\t<field name=\"RESULT_INVALID_STATE\" since=\"30\"/>\n\t\t<field name=\"RESULT_MODEM_ERROR\" since=\"30\"/>\n\t\t<field name=\"RESULT_NETWORK_ERROR\" since=\"30\"/>\n\t\t<field name=\"RESULT_NETWORK_REJECT\" since=\"30\"/>\n\t\t<field name=\"RESULT_NO_BLUETOOTH_SERVICE\" since=\"30\"/>\n\t\t<field name=\"RESULT_NO_DEFAULT_SMS_APP\" since=\"30\"/>\n\t\t<field name=\"RESULT_NO_MEMORY\" since=\"30\"/>\n\t\t<field name=\"RESULT_NO_RESOURCES\" since=\"30\"/>\n\t\t<field name=\"RESULT_OPERATION_NOT_ALLOWED\" since=\"30\"/>\n\t\t<field name=\"RESULT_RADIO_NOT_AVAILABLE\" since=\"30\"/>\n\t\t<field name=\"RESULT_REMOTE_EXCEPTION\" since=\"30\"/>\n\t\t<field name=\"RESULT_REQUEST_NOT_SUPPORTED\" since=\"30\"/>\n\t\t<field name=\"RESULT_RIL_CANCELLED\" since=\"30\"/>\n\t\t<field name=\"RESULT_RIL_ENCODING_ERR\" since=\"30\"/>\n\t\t<field name=\"RESULT_RIL_INTERNAL_ERR\" since=\"30\"/>\n\t\t<field name=\"RESULT_RIL_INVALID_ARGUMENTS\" since=\"30\"/>\n\t\t<field name=\"RESULT_RIL_INVALID_MODEM_STATE\" since=\"30\"/>\n\t\t<field name=\"RESULT_RIL_INVALID_SMSC_ADDRESS\" since=\"30\"/>\n\t\t<field name=\"RESULT_RIL_INVALID_SMS_FORMAT\" since=\"30\"/>\n\t\t<field name=\"RESULT_RIL_INVALID_STATE\" since=\"30\"/>\n\t\t<field name=\"RESULT_RIL_MODEM_ERR\" since=\"30\"/>\n\t\t<field name=\"RESULT_RIL_NETWORK_ERR\" since=\"30\"/>\n\t\t<field name=\"RESULT_RIL_NETWORK_NOT_READY\" since=\"30\"/>\n\t\t<field name=\"RESULT_RIL_NETWORK_REJECT\" since=\"30\"/>\n\t\t<field name=\"RESULT_RIL_NO_MEMORY\" since=\"30\"/>\n\t\t<field name=\"RESULT_RIL_NO_RESOURCES\" since=\"30\"/>\n\t\t<field name=\"RESULT_RIL_OPERATION_NOT_ALLOWED\" since=\"30\"/>\n\t\t<field name=\"RESULT_RIL_RADIO_NOT_AVAILABLE\" since=\"30\"/>\n\t\t<field name=\"RESULT_RIL_REQUEST_NOT_SUPPORTED\" since=\"30\"/>\n\t\t<field name=\"RESULT_RIL_REQUEST_RATE_LIMITED\" since=\"30\"/>\n\t\t<field name=\"RESULT_RIL_SIM_ABSENT\" since=\"30\"/>\n\t\t<field name=\"RESULT_RIL_SMS_SEND_FAIL_RETRY\" since=\"30\"/>\n\t\t<field name=\"RESULT_RIL_SYSTEM_ERR\" since=\"30\"/>\n\t\t<field name=\"RESULT_SMS_BLOCKED_DURING_EMERGENCY\" since=\"30\"/>\n\t\t<field name=\"RESULT_SMS_SEND_RETRY_FAILED\" since=\"30\"/>\n\t\t<field name=\"RESULT_SYSTEM_ERROR\" since=\"30\"/>\n\t\t<field name=\"RESULT_UNEXPECTED_EVENT_STOP_SENDING\" since=\"30\"/>\n\t\t<field name=\"STATUS_ON_ICC_FREE\"/>\n\t\t<field name=\"STATUS_ON_ICC_READ\"/>\n\t\t<field name=\"STATUS_ON_ICC_SENT\"/>\n\t\t<field name=\"STATUS_ON_ICC_UNREAD\"/>\n\t\t<field name=\"STATUS_ON_ICC_UNSENT\"/>\n\t</class>\n\t<class name=\"android/telephony/SmsManager$FinancialSmsCallback\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onFinancialSmsMessages(Landroid/database/CursorWindow;)V\"/>\n\t</class>\n\t<class name=\"android/telephony/SmsMessage\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"calculateLength(Ljava/lang/CharSequence;Z)[I\"/>\n\t\t<method name=\"calculateLength(Ljava/lang/String;Z)[I\"/>\n\t\t<method name=\"createFromPdu([B)Landroid/telephony/SmsMessage;\" deprecated=\"23\"/>\n\t\t<method name=\"createFromPdu([BLjava/lang/String;)Landroid/telephony/SmsMessage;\" since=\"23\"/>\n\t\t<method name=\"createSmsSubmitPdu([BZ)Landroid/telephony/SmsMessage;\" since=\"30\"/>\n\t\t<method name=\"getDisplayMessageBody()Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayOriginatingAddress()Ljava/lang/String;\"/>\n\t\t<method name=\"getEmailBody()Ljava/lang/String;\"/>\n\t\t<method name=\"getEmailFrom()Ljava/lang/String;\"/>\n\t\t<method name=\"getIndexOnIcc()I\"/>\n\t\t<method name=\"getIndexOnSim()I\" deprecated=\"15\"/>\n\t\t<method name=\"getMessageBody()Ljava/lang/String;\"/>\n\t\t<method name=\"getMessageClass()Landroid/telephony/SmsMessage$MessageClass;\"/>\n\t\t<method name=\"getOriginatingAddress()Ljava/lang/String;\"/>\n\t\t<method name=\"getPdu()[B\"/>\n\t\t<method name=\"getProtocolIdentifier()I\"/>\n\t\t<method name=\"getPseudoSubject()Ljava/lang/String;\"/>\n\t\t<method name=\"getRecipientAddress()Ljava/lang/String;\" since=\"30\"/>\n\t\t<method name=\"getServiceCenterAddress()Ljava/lang/String;\"/>\n\t\t<method name=\"getStatus()I\"/>\n\t\t<method name=\"getStatusOnIcc()I\"/>\n\t\t<method name=\"getStatusOnSim()I\" deprecated=\"15\"/>\n\t\t<method name=\"getSubmitPdu(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)Landroid/telephony/SmsMessage$SubmitPdu;\"/>\n\t\t<method name=\"getSubmitPdu(Ljava/lang/String;Ljava/lang/String;S[BZ)Landroid/telephony/SmsMessage$SubmitPdu;\"/>\n\t\t<method name=\"getTPLayerLengthForPDU(Ljava/lang/String;)I\"/>\n\t\t<method name=\"getTimestampMillis()J\"/>\n\t\t<method name=\"getUserData()[B\"/>\n\t\t<method name=\"isCphsMwiMessage()Z\"/>\n\t\t<method name=\"isEmail()Z\"/>\n\t\t<method name=\"isMWIClearMessage()Z\"/>\n\t\t<method name=\"isMWISetMessage()Z\"/>\n\t\t<method name=\"isMwiDontStore()Z\"/>\n\t\t<method name=\"isReplace()Z\"/>\n\t\t<method name=\"isReplyPathPresent()Z\"/>\n\t\t<method name=\"isStatusReportMessage()Z\"/>\n\t\t<field name=\"ENCODING_16BIT\"/>\n\t\t<field name=\"ENCODING_7BIT\"/>\n\t\t<field name=\"ENCODING_8BIT\"/>\n\t\t<field name=\"ENCODING_UNKNOWN\"/>\n\t\t<field name=\"FORMAT_3GPP\" since=\"28\"/>\n\t\t<field name=\"FORMAT_3GPP2\" since=\"28\"/>\n\t\t<field name=\"MAX_USER_DATA_BYTES\"/>\n\t\t<field name=\"MAX_USER_DATA_BYTES_WITH_HEADER\"/>\n\t\t<field name=\"MAX_USER_DATA_SEPTETS\"/>\n\t\t<field name=\"MAX_USER_DATA_SEPTETS_WITH_HEADER\"/>\n\t</class>\n\t<class name=\"android/telephony/SmsMessage$MessageClass\" since=\"4\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/telephony/SmsMessage$MessageClass;\"/>\n\t\t<method name=\"values()[Landroid/telephony/SmsMessage$MessageClass;\"/>\n\t\t<field name=\"CLASS_0\"/>\n\t\t<field name=\"CLASS_1\"/>\n\t\t<field name=\"CLASS_2\"/>\n\t\t<field name=\"CLASS_3\"/>\n\t\t<field name=\"UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/telephony/SmsMessage$SubmitPdu\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"encodedMessage\"/>\n\t\t<field name=\"encodedScAddress\"/>\n\t</class>\n\t<class name=\"android/telephony/SubscriptionInfo\" since=\"22\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"createIconBitmap(Landroid/content/Context;)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"getCardId()I\" since=\"29\"/>\n\t\t<method name=\"getCarrierId()I\" since=\"29\"/>\n\t\t<method name=\"getCarrierName()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getCountryIso()Ljava/lang/String;\"/>\n\t\t<method name=\"getDataRoaming()I\"/>\n\t\t<method name=\"getDisplayName()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getGroupUuid()Landroid/os/ParcelUuid;\" since=\"29\"/>\n\t\t<method name=\"getIccId()Ljava/lang/String;\"/>\n\t\t<method name=\"getIconTint()I\"/>\n\t\t<method name=\"getMcc()I\" deprecated=\"29\"/>\n\t\t<method name=\"getMccString()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getMnc()I\" deprecated=\"29\"/>\n\t\t<method name=\"getMncString()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getNumber()Ljava/lang/String;\"/>\n\t\t<method name=\"getSimSlotIndex()I\"/>\n\t\t<method name=\"getSubscriptionId()I\"/>\n\t\t<method name=\"getSubscriptionType()I\" since=\"29\"/>\n\t\t<method name=\"isEmbedded()Z\" since=\"28\"/>\n\t\t<method name=\"isOpportunistic()Z\" since=\"29\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/SubscriptionManager\" since=\"22\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addOnOpportunisticSubscriptionsChangedListener(Ljava/util/concurrent/Executor;Landroid/telephony/SubscriptionManager$OnOpportunisticSubscriptionsChangedListener;)V\" since=\"29\"/>\n\t\t<method name=\"addOnSubscriptionsChangedListener(Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;)V\" deprecated=\"30\"/>\n\t\t<method name=\"addOnSubscriptionsChangedListener(Ljava/util/concurrent/Executor;Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;)V\" since=\"30\"/>\n\t\t<method name=\"addSubscriptionsIntoGroup(Ljava/util/List;Landroid/os/ParcelUuid;)V\" since=\"29\"/>\n\t\t<method name=\"canManageSubscription(Landroid/telephony/SubscriptionInfo;)Z\" since=\"28\"/>\n\t\t<method name=\"createSubscriptionGroup(Ljava/util/List;)Landroid/os/ParcelUuid;\" since=\"29\"/>\n\t\t<method name=\"from(Landroid/content/Context;)Landroid/telephony/SubscriptionManager;\" deprecated=\"28\"/>\n\t\t<method name=\"getAccessibleSubscriptionInfoList()Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"getActiveAndHiddenSubscriptionInfoList()Ljava/util/List;\" since=\"30\"/>\n\t\t<method name=\"getActiveDataSubscriptionId()I\" since=\"30\"/>\n\t\t<method name=\"getActiveSubscriptionInfo(I)Landroid/telephony/SubscriptionInfo;\"/>\n\t\t<method name=\"getActiveSubscriptionInfoCount()I\"/>\n\t\t<method name=\"getActiveSubscriptionInfoCountMax()I\"/>\n\t\t<method name=\"getActiveSubscriptionInfoForSimSlotIndex(I)Landroid/telephony/SubscriptionInfo;\"/>\n\t\t<method name=\"getActiveSubscriptionInfoList()Ljava/util/List;\"/>\n\t\t<method name=\"getDefaultDataSubscriptionId()I\" since=\"24\"/>\n\t\t<method name=\"getDefaultSmsSubscriptionId()I\" since=\"24\"/>\n\t\t<method name=\"getDefaultSubscriptionId()I\" since=\"24\"/>\n\t\t<method name=\"getDefaultVoiceSubscriptionId()I\" since=\"24\"/>\n\t\t<method name=\"getOpportunisticSubscriptions()Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"getSlotIndex(I)I\" since=\"29\"/>\n\t\t<method name=\"getSubscriptionIds(I)[I\" since=\"29\"/>\n\t\t<method name=\"getSubscriptionPlans(I)Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"getSubscriptionsInGroup(Landroid/os/ParcelUuid;)Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"isActiveSubscriptionId(I)Z\" since=\"29\"/>\n\t\t<method name=\"isNetworkRoaming(I)Z\"/>\n\t\t<method name=\"isUsableSubscriptionId(I)Z\" since=\"29\"/>\n\t\t<method name=\"isValidSubscriptionId(I)Z\" since=\"29\"/>\n\t\t<method name=\"removeOnOpportunisticSubscriptionsChangedListener(Landroid/telephony/SubscriptionManager$OnOpportunisticSubscriptionsChangedListener;)V\" since=\"29\"/>\n\t\t<method name=\"removeOnSubscriptionsChangedListener(Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;)V\"/>\n\t\t<method name=\"removeSubscriptionsFromGroup(Ljava/util/List;Landroid/os/ParcelUuid;)V\" since=\"29\"/>\n\t\t<method name=\"setOpportunistic(ZI)Z\" since=\"29\"/>\n\t\t<method name=\"setSubscriptionOverrideCongested(IZJ)V\" since=\"28\"/>\n\t\t<method name=\"setSubscriptionOverrideUnmetered(IZJ)V\" since=\"28\"/>\n\t\t<method name=\"setSubscriptionPlans(ILjava/util/List;)V\" since=\"28\"/>\n\t\t<method name=\"switchToSubscription(ILandroid/app/PendingIntent;)V\" since=\"29\"/>\n\t\t<field name=\"ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED\" since=\"26\"/>\n\t\t<field name=\"ACTION_DEFAULT_SUBSCRIPTION_CHANGED\" since=\"26\"/>\n\t\t<field name=\"ACTION_MANAGE_SUBSCRIPTION_PLANS\" since=\"28\"/>\n\t\t<field name=\"ACTION_REFRESH_SUBSCRIPTION_PLANS\" since=\"28\"/>\n\t\t<field name=\"DATA_ROAMING_DISABLE\"/>\n\t\t<field name=\"DATA_ROAMING_ENABLE\"/>\n\t\t<field name=\"DEFAULT_SUBSCRIPTION_ID\" since=\"29\"/>\n\t\t<field name=\"EXTRA_SLOT_INDEX\" since=\"30\"/>\n\t\t<field name=\"EXTRA_SUBSCRIPTION_INDEX\" since=\"26\"/>\n\t\t<field name=\"INVALID_SIM_SLOT_INDEX\" since=\"29\"/>\n\t\t<field name=\"INVALID_SUBSCRIPTION_ID\" since=\"24\"/>\n\t\t<field name=\"SUBSCRIPTION_TYPE_LOCAL_SIM\" since=\"29\"/>\n\t\t<field name=\"SUBSCRIPTION_TYPE_REMOTE_SIM\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/telephony/SubscriptionManager$OnOpportunisticSubscriptionsChangedListener\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onOpportunisticSubscriptionsChanged()V\"/>\n\t</class>\n\t<class name=\"android/telephony/SubscriptionManager$OnSubscriptionsChangedListener\" since=\"22\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onSubscriptionsChanged()V\"/>\n\t</class>\n\t<class name=\"android/telephony/SubscriptionPlan\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"cycleIterator()Ljava/util/Iterator;\"/>\n\t\t<method name=\"getDataLimitBehavior()I\"/>\n\t\t<method name=\"getDataLimitBytes()J\"/>\n\t\t<method name=\"getDataUsageBytes()J\"/>\n\t\t<method name=\"getDataUsageTime()J\"/>\n\t\t<method name=\"getNetworkTypes()[I\" since=\"30\"/>\n\t\t<method name=\"getSummary()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTitle()Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"BYTES_UNKNOWN\"/>\n\t\t<field name=\"BYTES_UNLIMITED\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"LIMIT_BEHAVIOR_BILLED\"/>\n\t\t<field name=\"LIMIT_BEHAVIOR_DISABLED\"/>\n\t\t<field name=\"LIMIT_BEHAVIOR_THROTTLED\"/>\n\t\t<field name=\"LIMIT_BEHAVIOR_UNKNOWN\"/>\n\t\t<field name=\"TIME_UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/telephony/SubscriptionPlan$Builder\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"build()Landroid/telephony/SubscriptionPlan;\"/>\n\t\t<method name=\"createNonrecurring(Ljava/time/ZonedDateTime;Ljava/time/ZonedDateTime;)Landroid/telephony/SubscriptionPlan$Builder;\"/>\n\t\t<method name=\"createRecurring(Ljava/time/ZonedDateTime;Ljava/time/Period;)Landroid/telephony/SubscriptionPlan$Builder;\"/>\n\t\t<method name=\"resetNetworkTypes()Landroid/telephony/SubscriptionPlan$Builder;\" since=\"30\"/>\n\t\t<method name=\"setDataLimit(JI)Landroid/telephony/SubscriptionPlan$Builder;\"/>\n\t\t<method name=\"setDataUsage(JJ)Landroid/telephony/SubscriptionPlan$Builder;\"/>\n\t\t<method name=\"setNetworkTypes([I)Landroid/telephony/SubscriptionPlan$Builder;\" since=\"30\"/>\n\t\t<method name=\"setSummary(Ljava/lang/CharSequence;)Landroid/telephony/SubscriptionPlan$Builder;\"/>\n\t\t<method name=\"setTitle(Ljava/lang/CharSequence;)Landroid/telephony/SubscriptionPlan$Builder;\"/>\n\t</class>\n\t<class name=\"android/telephony/TelephonyDisplayInfo\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getNetworkType()I\"/>\n\t\t<method name=\"getOverrideNetworkType()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"OVERRIDE_NETWORK_TYPE_LTE_ADVANCED_PRO\"/>\n\t\t<field name=\"OVERRIDE_NETWORK_TYPE_LTE_CA\"/>\n\t\t<field name=\"OVERRIDE_NETWORK_TYPE_NONE\"/>\n\t\t<field name=\"OVERRIDE_NETWORK_TYPE_NR_NSA\"/>\n\t\t<field name=\"OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE\"/>\n\t</class>\n\t<class name=\"android/telephony/TelephonyManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"canChangeDtmfToneLength()Z\" since=\"23\"/>\n\t\t<method name=\"createForPhoneAccountHandle(Landroid/telecom/PhoneAccountHandle;)Landroid/telephony/TelephonyManager;\" since=\"26\"/>\n\t\t<method name=\"createForSubscriptionId(I)Landroid/telephony/TelephonyManager;\" since=\"24\"/>\n\t\t<method name=\"doesSwitchMultiSimConfigTriggerReboot()Z\" since=\"29\"/>\n\t\t<method name=\"getActiveModemCount()I\" since=\"30\"/>\n\t\t<method name=\"getAllCellInfo()Ljava/util/List;\" since=\"17\"/>\n\t\t<method name=\"getAllNetworkTypes()[I\" since=\"30\"/>\n\t\t<method name=\"getCallState()I\"/>\n\t\t<method name=\"getCardIdForDefaultEuicc()I\" since=\"29\"/>\n\t\t<method name=\"getCarrierConfig()Landroid/os/PersistableBundle;\" since=\"26\"/>\n\t\t<method name=\"getCarrierIdFromSimMccMnc()I\" since=\"29\"/>\n\t\t<method name=\"getCellLocation()Landroid/telephony/CellLocation;\" deprecated=\"26\"/>\n\t\t<method name=\"getDataActivity()I\"/>\n\t\t<method name=\"getDataNetworkType()I\" since=\"24\"/>\n\t\t<method name=\"getDataState()I\"/>\n\t\t<method name=\"getDeviceId()Ljava/lang/String;\" deprecated=\"26\"/>\n\t\t<method name=\"getDeviceId(I)Ljava/lang/String;\" since=\"23\" deprecated=\"26\"/>\n\t\t<method name=\"getDeviceSoftwareVersion()Ljava/lang/String;\"/>\n\t\t<method name=\"getEmergencyNumberList()Ljava/util/Map;\" since=\"29\"/>\n\t\t<method name=\"getEmergencyNumberList(I)Ljava/util/Map;\" since=\"29\"/>\n\t\t<method name=\"getForbiddenPlmns()[Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getGroupIdLevel1()Ljava/lang/String;\" since=\"18\"/>\n\t\t<method name=\"getIccAuthentication(IILjava/lang/String;)Ljava/lang/String;\" since=\"24\"/>\n\t\t<method name=\"getImei()Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getImei(I)Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getLine1Number()Ljava/lang/String;\"/>\n\t\t<method name=\"getManufacturerCode()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getManufacturerCode(I)Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getMeid()Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getMeid(I)Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getMmsUAProfUrl()Ljava/lang/String;\" since=\"19\"/>\n\t\t<method name=\"getMmsUserAgent()Ljava/lang/String;\" since=\"19\"/>\n\t\t<method name=\"getNai()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getNeighboringCellInfo()Ljava/util/List;\" since=\"3\" deprecated=\"23\" removed=\"29\"/>\n\t\t<method name=\"getNetworkCountryIso()Ljava/lang/String;\"/>\n\t\t<method name=\"getNetworkCountryIso(I)Ljava/lang/String;\" since=\"30\"/>\n\t\t<method name=\"getNetworkOperator()Ljava/lang/String;\"/>\n\t\t<method name=\"getNetworkOperatorName()Ljava/lang/String;\"/>\n\t\t<method name=\"getNetworkSelectionMode()I\" since=\"30\"/>\n\t\t<method name=\"getNetworkSpecifier()Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getNetworkType()I\" deprecated=\"30\"/>\n\t\t<method name=\"getPhoneCount()I\" since=\"23\" deprecated=\"30\"/>\n\t\t<method name=\"getPhoneType()I\"/>\n\t\t<method name=\"getPreferredOpportunisticDataSubscription()I\" since=\"29\"/>\n\t\t<method name=\"getServiceState()Landroid/telephony/ServiceState;\" since=\"26\"/>\n\t\t<method name=\"getSignalStrength()Landroid/telephony/SignalStrength;\" since=\"28\"/>\n\t\t<method name=\"getSimCarrierId()I\" since=\"28\"/>\n\t\t<method name=\"getSimCarrierIdName()Ljava/lang/CharSequence;\" since=\"28\"/>\n\t\t<method name=\"getSimCountryIso()Ljava/lang/String;\"/>\n\t\t<method name=\"getSimOperator()Ljava/lang/String;\"/>\n\t\t<method name=\"getSimOperatorName()Ljava/lang/String;\"/>\n\t\t<method name=\"getSimSerialNumber()Ljava/lang/String;\"/>\n\t\t<method name=\"getSimSpecificCarrierId()I\" since=\"29\"/>\n\t\t<method name=\"getSimSpecificCarrierIdName()Ljava/lang/CharSequence;\" since=\"29\"/>\n\t\t<method name=\"getSimState()I\"/>\n\t\t<method name=\"getSimState(I)I\" since=\"26\"/>\n\t\t<method name=\"getSubscriberId()Ljava/lang/String;\"/>\n\t\t<method name=\"getSubscriptionId(Landroid/telecom/PhoneAccountHandle;)I\" since=\"30\"/>\n\t\t<method name=\"getSupportedModemCount()I\" since=\"30\"/>\n\t\t<method name=\"getTypeAllocationCode()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getTypeAllocationCode(I)Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getUiccCardsInfo()Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"getVisualVoicemailPackageName()Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getVoiceMailAlphaTag()Ljava/lang/String;\"/>\n\t\t<method name=\"getVoiceMailNumber()Ljava/lang/String;\"/>\n\t\t<method name=\"getVoiceNetworkType()I\" since=\"24\"/>\n\t\t<method name=\"getVoicemailRingtoneUri(Landroid/telecom/PhoneAccountHandle;)Landroid/net/Uri;\" since=\"24\"/>\n\t\t<method name=\"hasCarrierPrivileges()Z\" since=\"22\"/>\n\t\t<method name=\"hasIccCard()Z\" since=\"5\"/>\n\t\t<method name=\"iccCloseLogicalChannel(I)Z\" since=\"21\" deprecated=\"30\"/>\n\t\t<method name=\"iccExchangeSimIO(IIIIILjava/lang/String;)[B\" since=\"21\" deprecated=\"30\"/>\n\t\t<method name=\"iccOpenLogicalChannel(Ljava/lang/String;)Landroid/telephony/IccOpenLogicalChannelResponse;\" since=\"21\" deprecated=\"26\"/>\n\t\t<method name=\"iccOpenLogicalChannel(Ljava/lang/String;I)Landroid/telephony/IccOpenLogicalChannelResponse;\" since=\"26\" deprecated=\"30\"/>\n\t\t<method name=\"iccTransmitApduBasicChannel(IIIIILjava/lang/String;)Ljava/lang/String;\" since=\"21\" deprecated=\"30\"/>\n\t\t<method name=\"iccTransmitApduLogicalChannel(IIIIIILjava/lang/String;)Ljava/lang/String;\" since=\"21\" deprecated=\"30\"/>\n\t\t<method name=\"isConcurrentVoiceAndDataSupported()Z\" since=\"26\"/>\n\t\t<method name=\"isDataEnabled()Z\" since=\"26\"/>\n\t\t<method name=\"isDataRoamingEnabled()Z\" since=\"29\"/>\n\t\t<method name=\"isEmergencyNumber(Ljava/lang/String;)Z\" since=\"29\"/>\n\t\t<method name=\"isHearingAidCompatibilitySupported()Z\" since=\"23\"/>\n\t\t<method name=\"isMultiSimSupported()I\" since=\"29\"/>\n\t\t<method name=\"isNetworkRoaming()Z\"/>\n\t\t<method name=\"isRttSupported()Z\" since=\"29\"/>\n\t\t<method name=\"isSmsCapable()Z\" since=\"21\"/>\n\t\t<method name=\"isTtyModeSupported()Z\" since=\"23\" deprecated=\"28\"/>\n\t\t<method name=\"isVoiceCapable()Z\" since=\"22\"/>\n\t\t<method name=\"isVoicemailVibrationEnabled(Landroid/telecom/PhoneAccountHandle;)Z\" since=\"24\"/>\n\t\t<method name=\"isWorldPhone()Z\" since=\"23\"/>\n\t\t<method name=\"listen(Landroid/telephony/PhoneStateListener;I)V\"/>\n\t\t<method name=\"requestCellInfoUpdate(Ljava/util/concurrent/Executor;Landroid/telephony/TelephonyManager$CellInfoCallback;)V\" since=\"29\"/>\n\t\t<method name=\"requestNetworkScan(Landroid/telephony/NetworkScanRequest;Ljava/util/concurrent/Executor;Landroid/telephony/TelephonyScanManager$NetworkScanCallback;)Landroid/telephony/NetworkScan;\" since=\"28\"/>\n\t\t<method name=\"sendDialerSpecialCode(Ljava/lang/String;)V\" since=\"26\"/>\n\t\t<method name=\"sendEnvelopeWithStatus(Ljava/lang/String;)Ljava/lang/String;\" since=\"21\" deprecated=\"30\"/>\n\t\t<method name=\"sendUssdRequest(Ljava/lang/String;Landroid/telephony/TelephonyManager$UssdResponseCallback;Landroid/os/Handler;)V\" since=\"26\"/>\n\t\t<method name=\"sendVisualVoicemailSms(Ljava/lang/String;ILjava/lang/String;Landroid/app/PendingIntent;)V\" since=\"26\"/>\n\t\t<method name=\"setDataEnabled(Z)V\" since=\"26\"/>\n\t\t<method name=\"setForbiddenPlmns(Ljava/util/List;)I\" since=\"30\"/>\n\t\t<method name=\"setLine1NumberForDisplay(Ljava/lang/String;Ljava/lang/String;)Z\" since=\"22\"/>\n\t\t<method name=\"setNetworkSelectionModeAutomatic()V\" since=\"28\"/>\n\t\t<method name=\"setNetworkSelectionModeManual(Ljava/lang/String;Z)Z\" since=\"28\"/>\n\t\t<method name=\"setNetworkSelectionModeManual(Ljava/lang/String;ZI)Z\" since=\"30\"/>\n\t\t<method name=\"setOperatorBrandOverride(Ljava/lang/String;)Z\" since=\"22\"/>\n\t\t<method name=\"setPreferredNetworkTypeToGlobal()Z\" since=\"22\"/>\n\t\t<method name=\"setPreferredOpportunisticDataSubscription(IZLjava/util/concurrent/Executor;Ljava/util/function/Consumer;)V\" since=\"29\"/>\n\t\t<method name=\"setVisualVoicemailSmsFilterSettings(Landroid/telephony/VisualVoicemailSmsFilterSettings;)V\" since=\"26\"/>\n\t\t<method name=\"setVoiceMailNumber(Ljava/lang/String;Ljava/lang/String;)Z\" since=\"22\"/>\n\t\t<method name=\"setVoicemailRingtoneUri(Landroid/telecom/PhoneAccountHandle;Landroid/net/Uri;)V\" since=\"26\" deprecated=\"28\"/>\n\t\t<method name=\"setVoicemailVibrationEnabled(Landroid/telecom/PhoneAccountHandle;Z)V\" since=\"26\" deprecated=\"28\"/>\n\t\t<method name=\"switchMultiSimConfig(I)V\" since=\"29\"/>\n\t\t<method name=\"updateAvailableNetworks(Ljava/util/List;Ljava/util/concurrent/Executor;Ljava/util/function/Consumer;)V\" since=\"29\"/>\n\t\t<field name=\"ACTION_CARRIER_MESSAGING_CLIENT_SERVICE\" since=\"29\"/>\n\t\t<field name=\"ACTION_CONFIGURE_VOICEMAIL\" since=\"23\"/>\n\t\t<field name=\"ACTION_MULTI_SIM_CONFIG_CHANGED\" since=\"30\"/>\n\t\t<field name=\"ACTION_NETWORK_COUNTRY_CHANGED\" since=\"29\"/>\n\t\t<field name=\"ACTION_PHONE_STATE_CHANGED\" since=\"3\"/>\n\t\t<field name=\"ACTION_RESPOND_VIA_MESSAGE\" since=\"18\"/>\n\t\t<field name=\"ACTION_SECRET_CODE\" since=\"29\"/>\n\t\t<field name=\"ACTION_SHOW_VOICEMAIL_NOTIFICATION\" since=\"26\"/>\n\t\t<field name=\"ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED\" since=\"28\"/>\n\t\t<field name=\"ACTION_SUBSCRIPTION_SPECIFIC_CARRIER_IDENTITY_CHANGED\" since=\"29\"/>\n\t\t<field name=\"APPTYPE_CSIM\" since=\"24\"/>\n\t\t<field name=\"APPTYPE_ISIM\" since=\"24\"/>\n\t\t<field name=\"APPTYPE_RUIM\" since=\"24\"/>\n\t\t<field name=\"APPTYPE_SIM\" since=\"24\"/>\n\t\t<field name=\"APPTYPE_USIM\" since=\"24\"/>\n\t\t<field name=\"AUTHTYPE_EAP_AKA\" since=\"24\"/>\n\t\t<field name=\"AUTHTYPE_EAP_SIM\" since=\"24\"/>\n\t\t<field name=\"CALLBACK_ON_MORE_ERROR_CODE_CHANGE\" since=\"30\"/>\n\t\t<field name=\"CALL_STATE_IDLE\"/>\n\t\t<field name=\"CALL_STATE_OFFHOOK\"/>\n\t\t<field name=\"CALL_STATE_RINGING\"/>\n\t\t<field name=\"CDMA_ROAMING_MODE_AFFILIATED\" since=\"28\"/>\n\t\t<field name=\"CDMA_ROAMING_MODE_ANY\" since=\"28\"/>\n\t\t<field name=\"CDMA_ROAMING_MODE_HOME\" since=\"28\"/>\n\t\t<field name=\"CDMA_ROAMING_MODE_RADIO_DEFAULT\" since=\"28\"/>\n\t\t<field name=\"DATA_ACTIVITY_DORMANT\" since=\"4\"/>\n\t\t<field name=\"DATA_ACTIVITY_IN\"/>\n\t\t<field name=\"DATA_ACTIVITY_INOUT\"/>\n\t\t<field name=\"DATA_ACTIVITY_NONE\"/>\n\t\t<field name=\"DATA_ACTIVITY_OUT\"/>\n\t\t<field name=\"DATA_CONNECTED\"/>\n\t\t<field name=\"DATA_CONNECTING\"/>\n\t\t<field name=\"DATA_DISCONNECTED\"/>\n\t\t<field name=\"DATA_DISCONNECTING\" since=\"30\"/>\n\t\t<field name=\"DATA_SUSPENDED\"/>\n\t\t<field name=\"DATA_UNKNOWN\" since=\"29\"/>\n\t\t<field name=\"EXTRA_ACTIVE_SIM_SUPPORTED_COUNT\" since=\"30\"/>\n\t\t<field name=\"EXTRA_CALL_VOICEMAIL_INTENT\" since=\"26\"/>\n\t\t<field name=\"EXTRA_CARRIER_ID\" since=\"28\"/>\n\t\t<field name=\"EXTRA_CARRIER_NAME\" since=\"28\"/>\n\t\t<field name=\"EXTRA_HIDE_PUBLIC_SETTINGS\" since=\"26\"/>\n\t\t<field name=\"EXTRA_INCOMING_NUMBER\" since=\"3\" deprecated=\"29\"/>\n\t\t<field name=\"EXTRA_IS_REFRESH\" since=\"27\"/>\n\t\t<field name=\"EXTRA_LAUNCH_VOICEMAIL_SETTINGS_INTENT\" since=\"26\"/>\n\t\t<field name=\"EXTRA_NETWORK_COUNTRY\" since=\"29\"/>\n\t\t<field name=\"EXTRA_NOTIFICATION_COUNT\" since=\"26\"/>\n\t\t<field name=\"EXTRA_PHONE_ACCOUNT_HANDLE\" since=\"26\"/>\n\t\t<field name=\"EXTRA_SPECIFIC_CARRIER_ID\" since=\"29\"/>\n\t\t<field name=\"EXTRA_SPECIFIC_CARRIER_NAME\" since=\"29\"/>\n\t\t<field name=\"EXTRA_STATE\" since=\"3\"/>\n\t\t<field name=\"EXTRA_STATE_IDLE\" since=\"3\"/>\n\t\t<field name=\"EXTRA_STATE_OFFHOOK\" since=\"3\"/>\n\t\t<field name=\"EXTRA_STATE_RINGING\" since=\"3\"/>\n\t\t<field name=\"EXTRA_SUBSCRIPTION_ID\" since=\"28\"/>\n\t\t<field name=\"EXTRA_VOICEMAIL_NUMBER\" since=\"26\"/>\n\t\t<field name=\"METADATA_HIDE_VOICEMAIL_SETTINGS_MENU\" since=\"26\"/>\n\t\t<field name=\"MULTISIM_ALLOWED\" since=\"29\"/>\n\t\t<field name=\"MULTISIM_NOT_SUPPORTED_BY_CARRIER\" since=\"29\"/>\n\t\t<field name=\"MULTISIM_NOT_SUPPORTED_BY_HARDWARE\" since=\"29\"/>\n\t\t<field name=\"NETWORK_SELECTION_MODE_AUTO\" since=\"30\"/>\n\t\t<field name=\"NETWORK_SELECTION_MODE_MANUAL\" since=\"30\"/>\n\t\t<field name=\"NETWORK_SELECTION_MODE_UNKNOWN\" since=\"30\"/>\n\t\t<field name=\"NETWORK_TYPE_1xRTT\" since=\"4\"/>\n\t\t<field name=\"NETWORK_TYPE_CDMA\" since=\"4\"/>\n\t\t<field name=\"NETWORK_TYPE_EDGE\"/>\n\t\t<field name=\"NETWORK_TYPE_EHRPD\" since=\"11\"/>\n\t\t<field name=\"NETWORK_TYPE_EVDO_0\" since=\"4\"/>\n\t\t<field name=\"NETWORK_TYPE_EVDO_A\" since=\"4\"/>\n\t\t<field name=\"NETWORK_TYPE_EVDO_B\" since=\"9\"/>\n\t\t<field name=\"NETWORK_TYPE_GPRS\"/>\n\t\t<field name=\"NETWORK_TYPE_GSM\" since=\"25\"/>\n\t\t<field name=\"NETWORK_TYPE_HSDPA\" since=\"5\"/>\n\t\t<field name=\"NETWORK_TYPE_HSPA\" since=\"5\"/>\n\t\t<field name=\"NETWORK_TYPE_HSPAP\" since=\"13\"/>\n\t\t<field name=\"NETWORK_TYPE_HSUPA\" since=\"5\"/>\n\t\t<field name=\"NETWORK_TYPE_IDEN\" since=\"8\"/>\n\t\t<field name=\"NETWORK_TYPE_IWLAN\" since=\"25\"/>\n\t\t<field name=\"NETWORK_TYPE_LTE\" since=\"11\"/>\n\t\t<field name=\"NETWORK_TYPE_NR\" since=\"29\"/>\n\t\t<field name=\"NETWORK_TYPE_TD_SCDMA\" since=\"25\"/>\n\t\t<field name=\"NETWORK_TYPE_UMTS\"/>\n\t\t<field name=\"NETWORK_TYPE_UNKNOWN\"/>\n\t\t<field name=\"PHONE_TYPE_CDMA\" since=\"4\"/>\n\t\t<field name=\"PHONE_TYPE_GSM\"/>\n\t\t<field name=\"PHONE_TYPE_NONE\"/>\n\t\t<field name=\"PHONE_TYPE_SIP\" since=\"11\"/>\n\t\t<field name=\"SET_OPPORTUNISTIC_SUB_INACTIVE_SUBSCRIPTION\" since=\"29\"/>\n\t\t<field name=\"SET_OPPORTUNISTIC_SUB_NO_OPPORTUNISTIC_SUB_AVAILABLE\" since=\"30\"/>\n\t\t<field name=\"SET_OPPORTUNISTIC_SUB_REMOTE_SERVICE_EXCEPTION\" since=\"30\"/>\n\t\t<field name=\"SET_OPPORTUNISTIC_SUB_SUCCESS\" since=\"29\"/>\n\t\t<field name=\"SET_OPPORTUNISTIC_SUB_VALIDATION_FAILED\" since=\"29\"/>\n\t\t<field name=\"SIM_STATE_ABSENT\"/>\n\t\t<field name=\"SIM_STATE_CARD_IO_ERROR\" since=\"26\"/>\n\t\t<field name=\"SIM_STATE_CARD_RESTRICTED\" since=\"26\"/>\n\t\t<field name=\"SIM_STATE_NETWORK_LOCKED\"/>\n\t\t<field name=\"SIM_STATE_NOT_READY\" since=\"26\"/>\n\t\t<field name=\"SIM_STATE_PERM_DISABLED\" since=\"26\"/>\n\t\t<field name=\"SIM_STATE_PIN_REQUIRED\"/>\n\t\t<field name=\"SIM_STATE_PUK_REQUIRED\"/>\n\t\t<field name=\"SIM_STATE_READY\"/>\n\t\t<field name=\"SIM_STATE_UNKNOWN\"/>\n\t\t<field name=\"UNINITIALIZED_CARD_ID\" since=\"29\"/>\n\t\t<field name=\"UNKNOWN_CARRIER_ID\" since=\"28\"/>\n\t\t<field name=\"UNSUPPORTED_CARD_ID\" since=\"29\"/>\n\t\t<field name=\"UPDATE_AVAILABLE_NETWORKS_ABORTED\" since=\"29\"/>\n\t\t<field name=\"UPDATE_AVAILABLE_NETWORKS_DISABLE_MODEM_FAIL\" since=\"30\"/>\n\t\t<field name=\"UPDATE_AVAILABLE_NETWORKS_ENABLE_MODEM_FAIL\" since=\"30\"/>\n\t\t<field name=\"UPDATE_AVAILABLE_NETWORKS_INVALID_ARGUMENTS\" since=\"29\"/>\n\t\t<field name=\"UPDATE_AVAILABLE_NETWORKS_MULTIPLE_NETWORKS_NOT_SUPPORTED\" since=\"30\"/>\n\t\t<field name=\"UPDATE_AVAILABLE_NETWORKS_NO_CARRIER_PRIVILEGE\" since=\"29\"/>\n\t\t<field name=\"UPDATE_AVAILABLE_NETWORKS_NO_OPPORTUNISTIC_SUB_AVAILABLE\" since=\"30\"/>\n\t\t<field name=\"UPDATE_AVAILABLE_NETWORKS_REMOTE_SERVICE_EXCEPTION\" since=\"30\"/>\n\t\t<field name=\"UPDATE_AVAILABLE_NETWORKS_SERVICE_IS_DISABLED\" since=\"30\"/>\n\t\t<field name=\"UPDATE_AVAILABLE_NETWORKS_SUCCESS\" since=\"29\"/>\n\t\t<field name=\"UPDATE_AVAILABLE_NETWORKS_UNKNOWN_FAILURE\" since=\"29\"/>\n\t\t<field name=\"USSD_ERROR_SERVICE_UNAVAIL\" since=\"26\"/>\n\t\t<field name=\"USSD_RETURN_FAILURE\" since=\"26\"/>\n\t\t<field name=\"VVM_TYPE_CVVM\" since=\"23\"/>\n\t\t<field name=\"VVM_TYPE_OMTP\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/telephony/TelephonyManager$CellInfoCallback\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCellInfo(Ljava/util/List;)V\"/>\n\t\t<method name=\"onError(ILjava/lang/Throwable;)V\"/>\n\t\t<field name=\"ERROR_MODEM_ERROR\"/>\n\t\t<field name=\"ERROR_TIMEOUT\"/>\n\t</class>\n\t<class name=\"android/telephony/TelephonyManager$UssdResponseCallback\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onReceiveUssdResponse(Landroid/telephony/TelephonyManager;Ljava/lang/String;Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"onReceiveUssdResponseFailed(Landroid/telephony/TelephonyManager;Ljava/lang/String;I)V\"/>\n\t</class>\n\t<class name=\"android/telephony/TelephonyScanManager\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/telephony/TelephonyScanManager$NetworkScanCallback\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onComplete()V\"/>\n\t\t<method name=\"onError(I)V\"/>\n\t\t<method name=\"onResults(Ljava/util/List;)V\"/>\n\t</class>\n\t<class name=\"android/telephony/UiccCardInfo\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getCardId()I\"/>\n\t\t<method name=\"getEid()Ljava/lang/String;\"/>\n\t\t<method name=\"getIccId()Ljava/lang/String;\"/>\n\t\t<method name=\"getSlotIndex()I\"/>\n\t\t<method name=\"isEuicc()Z\"/>\n\t\t<method name=\"isRemovable()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/VisualVoicemailService\" since=\"26\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCellServiceConnected(Landroid/telephony/VisualVoicemailService$VisualVoicemailTask;Landroid/telecom/PhoneAccountHandle;)V\"/>\n\t\t<method name=\"onSimRemoved(Landroid/telephony/VisualVoicemailService$VisualVoicemailTask;Landroid/telecom/PhoneAccountHandle;)V\"/>\n\t\t<method name=\"onSmsReceived(Landroid/telephony/VisualVoicemailService$VisualVoicemailTask;Landroid/telephony/VisualVoicemailSms;)V\"/>\n\t\t<method name=\"onStopped(Landroid/telephony/VisualVoicemailService$VisualVoicemailTask;)V\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t</class>\n\t<class name=\"android/telephony/VisualVoicemailService$VisualVoicemailTask\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"finish()V\"/>\n\t</class>\n\t<class name=\"android/telephony/VisualVoicemailSms\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getFields()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getMessageBody()Ljava/lang/String;\"/>\n\t\t<method name=\"getPhoneAccountHandle()Landroid/telecom/PhoneAccountHandle;\"/>\n\t\t<method name=\"getPrefix()Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/VisualVoicemailSmsFilterSettings\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"DESTINATION_PORT_ANY\"/>\n\t\t<field name=\"DESTINATION_PORT_DATA_SMS\"/>\n\t\t<field name=\"clientPrefix\"/>\n\t\t<field name=\"destinationPort\"/>\n\t\t<field name=\"originatingNumbers\"/>\n\t</class>\n\t<class name=\"android/telephony/VisualVoicemailSmsFilterSettings$Builder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/telephony/VisualVoicemailSmsFilterSettings;\"/>\n\t\t<method name=\"setClientPrefix(Ljava/lang/String;)Landroid/telephony/VisualVoicemailSmsFilterSettings$Builder;\"/>\n\t\t<method name=\"setDestinationPort(I)Landroid/telephony/VisualVoicemailSmsFilterSettings$Builder;\"/>\n\t\t<method name=\"setOriginatingNumbers(Ljava/util/List;)Landroid/telephony/VisualVoicemailSmsFilterSettings$Builder;\"/>\n\t</class>\n\t<class name=\"android/telephony/cdma/CdmaCellLocation\" since=\"5\">\n\t\t<extends name=\"android/telephony/CellLocation\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"convertQuartSecToDecDegrees(I)D\" since=\"17\"/>\n\t\t<method name=\"fillInNotifierBundle(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"getBaseStationId()I\"/>\n\t\t<method name=\"getBaseStationLatitude()I\"/>\n\t\t<method name=\"getBaseStationLongitude()I\"/>\n\t\t<method name=\"getNetworkId()I\"/>\n\t\t<method name=\"getSystemId()I\"/>\n\t\t<method name=\"setCellLocationData(III)V\"/>\n\t\t<method name=\"setCellLocationData(IIIII)V\"/>\n\t\t<method name=\"setStateInvalid()V\"/>\n\t</class>\n\t<class name=\"android/telephony/data/ApnSetting\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getApnName()Ljava/lang/String;\"/>\n\t\t<method name=\"getApnTypeBitmask()I\"/>\n\t\t<method name=\"getAuthType()I\"/>\n\t\t<method name=\"getCarrierId()I\" since=\"29\"/>\n\t\t<method name=\"getEntryName()Ljava/lang/String;\"/>\n\t\t<method name=\"getId()I\"/>\n\t\t<method name=\"getMmsProxyAddress()Ljava/net/InetAddress;\" deprecated=\"29\"/>\n\t\t<method name=\"getMmsProxyAddressAsString()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getMmsProxyPort()I\"/>\n\t\t<method name=\"getMmsc()Landroid/net/Uri;\"/>\n\t\t<method name=\"getMvnoType()I\"/>\n\t\t<method name=\"getNetworkTypeBitmask()I\"/>\n\t\t<method name=\"getOperatorNumeric()Ljava/lang/String;\"/>\n\t\t<method name=\"getPassword()Ljava/lang/String;\"/>\n\t\t<method name=\"getProtocol()I\"/>\n\t\t<method name=\"getProxyAddress()Ljava/net/InetAddress;\" deprecated=\"29\"/>\n\t\t<method name=\"getProxyAddressAsString()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getProxyPort()I\"/>\n\t\t<method name=\"getRoamingProtocol()I\"/>\n\t\t<method name=\"getUser()Ljava/lang/String;\"/>\n\t\t<method name=\"isEnabled()Z\"/>\n\t\t<field name=\"AUTH_TYPE_CHAP\"/>\n\t\t<field name=\"AUTH_TYPE_NONE\"/>\n\t\t<field name=\"AUTH_TYPE_PAP\"/>\n\t\t<field name=\"AUTH_TYPE_PAP_OR_CHAP\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"MVNO_TYPE_GID\"/>\n\t\t<field name=\"MVNO_TYPE_ICCID\"/>\n\t\t<field name=\"MVNO_TYPE_IMSI\"/>\n\t\t<field name=\"MVNO_TYPE_SPN\"/>\n\t\t<field name=\"PROTOCOL_IP\"/>\n\t\t<field name=\"PROTOCOL_IPV4V6\"/>\n\t\t<field name=\"PROTOCOL_IPV6\"/>\n\t\t<field name=\"PROTOCOL_NON_IP\" since=\"29\"/>\n\t\t<field name=\"PROTOCOL_PPP\"/>\n\t\t<field name=\"PROTOCOL_UNSTRUCTURED\" since=\"29\"/>\n\t\t<field name=\"TYPE_CBS\"/>\n\t\t<field name=\"TYPE_DEFAULT\"/>\n\t\t<field name=\"TYPE_DUN\"/>\n\t\t<field name=\"TYPE_EMERGENCY\"/>\n\t\t<field name=\"TYPE_FOTA\"/>\n\t\t<field name=\"TYPE_HIPRI\"/>\n\t\t<field name=\"TYPE_IA\"/>\n\t\t<field name=\"TYPE_IMS\"/>\n\t\t<field name=\"TYPE_MCX\" since=\"29\"/>\n\t\t<field name=\"TYPE_MMS\"/>\n\t\t<field name=\"TYPE_SUPL\"/>\n\t\t<field name=\"TYPE_XCAP\" since=\"30\"/>\n\t</class>\n\t<class name=\"android/telephony/data/ApnSetting$Builder\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/telephony/data/ApnSetting;\"/>\n\t\t<method name=\"setApnName(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;\"/>\n\t\t<method name=\"setApnTypeBitmask(I)Landroid/telephony/data/ApnSetting$Builder;\"/>\n\t\t<method name=\"setAuthType(I)Landroid/telephony/data/ApnSetting$Builder;\"/>\n\t\t<method name=\"setCarrierEnabled(Z)Landroid/telephony/data/ApnSetting$Builder;\"/>\n\t\t<method name=\"setCarrierId(I)Landroid/telephony/data/ApnSetting$Builder;\" since=\"29\"/>\n\t\t<method name=\"setEntryName(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;\"/>\n\t\t<method name=\"setMmsProxyAddress(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;\" since=\"29\"/>\n\t\t<method name=\"setMmsProxyAddress(Ljava/net/InetAddress;)Landroid/telephony/data/ApnSetting$Builder;\" deprecated=\"29\"/>\n\t\t<method name=\"setMmsProxyPort(I)Landroid/telephony/data/ApnSetting$Builder;\"/>\n\t\t<method name=\"setMmsc(Landroid/net/Uri;)Landroid/telephony/data/ApnSetting$Builder;\"/>\n\t\t<method name=\"setMvnoType(I)Landroid/telephony/data/ApnSetting$Builder;\"/>\n\t\t<method name=\"setNetworkTypeBitmask(I)Landroid/telephony/data/ApnSetting$Builder;\"/>\n\t\t<method name=\"setOperatorNumeric(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;\"/>\n\t\t<method name=\"setPassword(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;\"/>\n\t\t<method name=\"setProtocol(I)Landroid/telephony/data/ApnSetting$Builder;\"/>\n\t\t<method name=\"setProxyAddress(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;\" since=\"29\"/>\n\t\t<method name=\"setProxyAddress(Ljava/net/InetAddress;)Landroid/telephony/data/ApnSetting$Builder;\" deprecated=\"29\"/>\n\t\t<method name=\"setProxyPort(I)Landroid/telephony/data/ApnSetting$Builder;\"/>\n\t\t<method name=\"setRoamingProtocol(I)Landroid/telephony/data/ApnSetting$Builder;\"/>\n\t\t<method name=\"setUser(Ljava/lang/String;)Landroid/telephony/data/ApnSetting$Builder;\"/>\n\t</class>\n\t<class name=\"android/telephony/emergency/EmergencyNumber\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"compareTo(Landroid/telephony/emergency/EmergencyNumber;)I\"/>\n\t\t<method name=\"getCountryIso()Ljava/lang/String;\"/>\n\t\t<method name=\"getEmergencyCallRouting()I\"/>\n\t\t<method name=\"getEmergencyNumberSources()Ljava/util/List;\"/>\n\t\t<method name=\"getEmergencyServiceCategories()Ljava/util/List;\"/>\n\t\t<method name=\"getEmergencyUrns()Ljava/util/List;\"/>\n\t\t<method name=\"getMnc()Ljava/lang/String;\"/>\n\t\t<method name=\"getNumber()Ljava/lang/String;\"/>\n\t\t<method name=\"isFromSources(I)Z\"/>\n\t\t<method name=\"isInEmergencyServiceCategories(I)Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"EMERGENCY_CALL_ROUTING_EMERGENCY\"/>\n\t\t<field name=\"EMERGENCY_CALL_ROUTING_NORMAL\"/>\n\t\t<field name=\"EMERGENCY_CALL_ROUTING_UNKNOWN\"/>\n\t\t<field name=\"EMERGENCY_NUMBER_SOURCE_DATABASE\"/>\n\t\t<field name=\"EMERGENCY_NUMBER_SOURCE_DEFAULT\"/>\n\t\t<field name=\"EMERGENCY_NUMBER_SOURCE_MODEM_CONFIG\"/>\n\t\t<field name=\"EMERGENCY_NUMBER_SOURCE_NETWORK_SIGNALING\"/>\n\t\t<field name=\"EMERGENCY_NUMBER_SOURCE_SIM\"/>\n\t\t<field name=\"EMERGENCY_SERVICE_CATEGORY_AIEC\"/>\n\t\t<field name=\"EMERGENCY_SERVICE_CATEGORY_AMBULANCE\"/>\n\t\t<field name=\"EMERGENCY_SERVICE_CATEGORY_FIRE_BRIGADE\"/>\n\t\t<field name=\"EMERGENCY_SERVICE_CATEGORY_MARINE_GUARD\"/>\n\t\t<field name=\"EMERGENCY_SERVICE_CATEGORY_MIEC\"/>\n\t\t<field name=\"EMERGENCY_SERVICE_CATEGORY_MOUNTAIN_RESCUE\"/>\n\t\t<field name=\"EMERGENCY_SERVICE_CATEGORY_POLICE\"/>\n\t\t<field name=\"EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED\"/>\n\t</class>\n\t<class name=\"android/telephony/euicc/DownloadableSubscription\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"forActivationCode(Ljava/lang/String;)Landroid/telephony/euicc/DownloadableSubscription;\"/>\n\t\t<method name=\"getConfirmationCode()Ljava/lang/String;\"/>\n\t\t<method name=\"getEncodedActivationCode()Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/euicc/EuiccInfo\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getOsVersion()Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/euicc/EuiccManager\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createForCardId(I)Landroid/telephony/euicc/EuiccManager;\" since=\"29\"/>\n\t\t<method name=\"deleteSubscription(ILandroid/app/PendingIntent;)V\"/>\n\t\t<method name=\"downloadSubscription(Landroid/telephony/euicc/DownloadableSubscription;ZLandroid/app/PendingIntent;)V\"/>\n\t\t<method name=\"getEid()Ljava/lang/String;\"/>\n\t\t<method name=\"getEuiccInfo()Landroid/telephony/euicc/EuiccInfo;\"/>\n\t\t<method name=\"isEnabled()Z\"/>\n\t\t<method name=\"startResolutionActivity(Landroid/app/Activity;ILandroid/content/Intent;Landroid/app/PendingIntent;)V\"/>\n\t\t<method name=\"switchToSubscription(ILandroid/app/PendingIntent;)V\"/>\n\t\t<method name=\"updateSubscriptionNickname(ILjava/lang/String;Landroid/app/PendingIntent;)V\" since=\"29\"/>\n\t\t<field name=\"ACTION_MANAGE_EMBEDDED_SUBSCRIPTIONS\"/>\n\t\t<field name=\"ACTION_NOTIFY_CARRIER_SETUP_INCOMPLETE\"/>\n\t\t<field name=\"ACTION_START_EUICC_ACTIVATION\" since=\"30\"/>\n\t\t<field name=\"EMBEDDED_SUBSCRIPTION_RESULT_ERROR\"/>\n\t\t<field name=\"EMBEDDED_SUBSCRIPTION_RESULT_OK\"/>\n\t\t<field name=\"EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR\"/>\n\t\t<field name=\"ERROR_ADDRESS_MISSING\" since=\"30\"/>\n\t\t<field name=\"ERROR_CARRIER_LOCKED\" since=\"30\"/>\n\t\t<field name=\"ERROR_CERTIFICATE_ERROR\" since=\"30\"/>\n\t\t<field name=\"ERROR_CONNECTION_ERROR\" since=\"30\"/>\n\t\t<field name=\"ERROR_DISALLOWED_BY_PPR\" since=\"30\"/>\n\t\t<field name=\"ERROR_EUICC_INSUFFICIENT_MEMORY\" since=\"30\"/>\n\t\t<field name=\"ERROR_EUICC_MISSING\" since=\"30\"/>\n\t\t<field name=\"ERROR_INCOMPATIBLE_CARRIER\" since=\"30\"/>\n\t\t<field name=\"ERROR_INSTALL_PROFILE\" since=\"30\"/>\n\t\t<field name=\"ERROR_INVALID_ACTIVATION_CODE\" since=\"30\"/>\n\t\t<field name=\"ERROR_INVALID_CONFIRMATION_CODE\" since=\"30\"/>\n\t\t<field name=\"ERROR_INVALID_RESPONSE\" since=\"30\"/>\n\t\t<field name=\"ERROR_NO_PROFILES_AVAILABLE\" since=\"30\"/>\n\t\t<field name=\"ERROR_OPERATION_BUSY\" since=\"30\"/>\n\t\t<field name=\"ERROR_SIM_MISSING\" since=\"30\"/>\n\t\t<field name=\"ERROR_TIME_OUT\" since=\"30\"/>\n\t\t<field name=\"ERROR_UNSUPPORTED_VERSION\" since=\"30\"/>\n\t\t<field name=\"EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE\"/>\n\t\t<field name=\"EXTRA_EMBEDDED_SUBSCRIPTION_DOWNLOADABLE_SUBSCRIPTION\"/>\n\t\t<field name=\"EXTRA_EMBEDDED_SUBSCRIPTION_ERROR_CODE\" since=\"30\"/>\n\t\t<field name=\"EXTRA_EMBEDDED_SUBSCRIPTION_OPERATION_CODE\" since=\"30\"/>\n\t\t<field name=\"EXTRA_EMBEDDED_SUBSCRIPTION_SMDX_REASON_CODE\" since=\"30\"/>\n\t\t<field name=\"EXTRA_EMBEDDED_SUBSCRIPTION_SMDX_SUBJECT_CODE\" since=\"30\"/>\n\t\t<field name=\"EXTRA_USE_QR_SCANNER\" since=\"30\"/>\n\t\t<field name=\"META_DATA_CARRIER_ICON\"/>\n\t\t<field name=\"OPERATION_APDU\" since=\"30\"/>\n\t\t<field name=\"OPERATION_DOWNLOAD\" since=\"30\"/>\n\t\t<field name=\"OPERATION_EUICC_CARD\" since=\"30\"/>\n\t\t<field name=\"OPERATION_EUICC_GSMA\" since=\"30\"/>\n\t\t<field name=\"OPERATION_HTTP\" since=\"30\"/>\n\t\t<field name=\"OPERATION_METADATA\" since=\"30\"/>\n\t\t<field name=\"OPERATION_SIM_SLOT\" since=\"30\"/>\n\t\t<field name=\"OPERATION_SMDX\" since=\"30\"/>\n\t\t<field name=\"OPERATION_SMDX_SUBJECT_REASON_CODE\" since=\"30\"/>\n\t\t<field name=\"OPERATION_SWITCH\" since=\"30\"/>\n\t\t<field name=\"OPERATION_SYSTEM\" since=\"30\"/>\n\t</class>\n\t<class name=\"android/telephony/gsm/GsmCellLocation\" since=\"1\">\n\t\t<extends name=\"android/telephony/CellLocation\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"fillInNotifierBundle(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"getCid()I\"/>\n\t\t<method name=\"getLac()I\"/>\n\t\t<method name=\"getPsc()I\" since=\"9\"/>\n\t\t<method name=\"setLacAndCid(II)V\"/>\n\t\t<method name=\"setStateInvalid()V\"/>\n\t</class>\n\t<class name=\"android/telephony/gsm/SmsManager\" since=\"1\" deprecated=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"divideMessage(Ljava/lang/String;)Ljava/util/ArrayList;\" deprecated=\"15\"/>\n\t\t<method name=\"getDefault()Landroid/telephony/gsm/SmsManager;\" deprecated=\"15\"/>\n\t\t<method name=\"sendDataMessage(Ljava/lang/String;Ljava/lang/String;S[BLandroid/app/PendingIntent;Landroid/app/PendingIntent;)V\" deprecated=\"15\"/>\n\t\t<method name=\"sendMultipartTextMessage(Ljava/lang/String;Ljava/lang/String;Ljava/util/ArrayList;Ljava/util/ArrayList;Ljava/util/ArrayList;)V\" deprecated=\"15\"/>\n\t\t<method name=\"sendTextMessage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;)V\" deprecated=\"15\"/>\n\t\t<field name=\"RESULT_ERROR_GENERIC_FAILURE\" deprecated=\"15\"/>\n\t\t<field name=\"RESULT_ERROR_NO_SERVICE\" deprecated=\"15\"/>\n\t\t<field name=\"RESULT_ERROR_NULL_PDU\" deprecated=\"15\"/>\n\t\t<field name=\"RESULT_ERROR_RADIO_OFF\" deprecated=\"15\"/>\n\t\t<field name=\"STATUS_ON_SIM_FREE\" deprecated=\"15\"/>\n\t\t<field name=\"STATUS_ON_SIM_READ\" deprecated=\"15\"/>\n\t\t<field name=\"STATUS_ON_SIM_SENT\" deprecated=\"15\"/>\n\t\t<field name=\"STATUS_ON_SIM_UNREAD\" deprecated=\"15\"/>\n\t\t<field name=\"STATUS_ON_SIM_UNSENT\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/telephony/gsm/SmsMessage\" since=\"1\" deprecated=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"15\"/>\n\t\t<method name=\"calculateLength(Ljava/lang/CharSequence;Z)[I\" since=\"3\" deprecated=\"15\"/>\n\t\t<method name=\"calculateLength(Ljava/lang/String;Z)[I\" deprecated=\"15\"/>\n\t\t<method name=\"createFromPdu([B)Landroid/telephony/gsm/SmsMessage;\" deprecated=\"15\"/>\n\t\t<method name=\"getDisplayMessageBody()Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"getDisplayOriginatingAddress()Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"getEmailBody()Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"getEmailFrom()Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"getIndexOnSim()I\" deprecated=\"15\"/>\n\t\t<method name=\"getMessageBody()Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"getMessageClass()Landroid/telephony/gsm/SmsMessage$MessageClass;\" deprecated=\"15\"/>\n\t\t<method name=\"getOriginatingAddress()Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"getPdu()[B\" deprecated=\"15\"/>\n\t\t<method name=\"getProtocolIdentifier()I\" deprecated=\"15\"/>\n\t\t<method name=\"getPseudoSubject()Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"getServiceCenterAddress()Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"getStatus()I\" deprecated=\"15\"/>\n\t\t<method name=\"getStatusOnSim()I\" deprecated=\"15\"/>\n\t\t<method name=\"getSubmitPdu(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)Landroid/telephony/gsm/SmsMessage$SubmitPdu;\" deprecated=\"15\"/>\n\t\t<method name=\"getSubmitPdu(Ljava/lang/String;Ljava/lang/String;S[BZ)Landroid/telephony/gsm/SmsMessage$SubmitPdu;\" deprecated=\"15\"/>\n\t\t<method name=\"getTPLayerLengthForPDU(Ljava/lang/String;)I\" deprecated=\"15\"/>\n\t\t<method name=\"getTimestampMillis()J\" deprecated=\"15\"/>\n\t\t<method name=\"getUserData()[B\" deprecated=\"15\"/>\n\t\t<method name=\"isCphsMwiMessage()Z\" deprecated=\"15\"/>\n\t\t<method name=\"isEmail()Z\" deprecated=\"15\"/>\n\t\t<method name=\"isMWIClearMessage()Z\" deprecated=\"15\"/>\n\t\t<method name=\"isMWISetMessage()Z\" deprecated=\"15\"/>\n\t\t<method name=\"isMwiDontStore()Z\" deprecated=\"15\"/>\n\t\t<method name=\"isReplace()Z\" deprecated=\"15\"/>\n\t\t<method name=\"isReplyPathPresent()Z\" deprecated=\"15\"/>\n\t\t<method name=\"isStatusReportMessage()Z\" deprecated=\"15\"/>\n\t\t<field name=\"ENCODING_16BIT\" deprecated=\"15\"/>\n\t\t<field name=\"ENCODING_7BIT\" deprecated=\"15\"/>\n\t\t<field name=\"ENCODING_8BIT\" deprecated=\"15\"/>\n\t\t<field name=\"ENCODING_UNKNOWN\" deprecated=\"15\"/>\n\t\t<field name=\"MAX_USER_DATA_BYTES\" deprecated=\"15\"/>\n\t\t<field name=\"MAX_USER_DATA_SEPTETS\" deprecated=\"15\"/>\n\t\t<field name=\"MAX_USER_DATA_SEPTETS_WITH_HEADER\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/telephony/gsm/SmsMessage$MessageClass\" since=\"1\" deprecated=\"4\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/telephony/gsm/SmsMessage$MessageClass;\"/>\n\t\t<method name=\"values()[Landroid/telephony/gsm/SmsMessage$MessageClass;\"/>\n\t\t<field name=\"CLASS_0\" deprecated=\"29\"/>\n\t\t<field name=\"CLASS_1\" deprecated=\"29\"/>\n\t\t<field name=\"CLASS_2\" deprecated=\"29\"/>\n\t\t<field name=\"CLASS_3\" deprecated=\"29\"/>\n\t\t<field name=\"UNKNOWN\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/telephony/gsm/SmsMessage$SubmitPdu\" since=\"1\" deprecated=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"15\"/>\n\t\t<field name=\"encodedMessage\" deprecated=\"15\"/>\n\t\t<field name=\"encodedScAddress\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/telephony/ims/ImsException\" since=\"30\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"getCode()I\"/>\n\t\t<field name=\"CODE_ERROR_INVALID_SUBSCRIPTION\"/>\n\t\t<field name=\"CODE_ERROR_SERVICE_UNAVAILABLE\"/>\n\t\t<field name=\"CODE_ERROR_UNSPECIFIED\"/>\n\t\t<field name=\"CODE_ERROR_UNSUPPORTED_OPERATION\"/>\n\t</class>\n\t<class name=\"android/telephony/ims/ImsManager\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getImsMmTelManager(I)Landroid/telephony/ims/ImsMmTelManager;\"/>\n\t\t<method name=\"getImsRcsManager(I)Landroid/telephony/ims/ImsRcsManager;\"/>\n\t\t<field name=\"ACTION_WFC_IMS_REGISTRATION_ERROR\"/>\n\t\t<field name=\"EXTRA_WFC_REGISTRATION_FAILURE_MESSAGE\"/>\n\t\t<field name=\"EXTRA_WFC_REGISTRATION_FAILURE_TITLE\"/>\n\t</class>\n\t<class name=\"android/telephony/ims/ImsMmTelManager\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/telephony/ims/RegistrationManager\"/>\n\t\t<method name=\"getVoWiFiModeSetting()I\"/>\n\t\t<method name=\"isAdvancedCallingSettingEnabled()Z\"/>\n\t\t<method name=\"isTtyOverVolteEnabled()Z\"/>\n\t\t<method name=\"isVoWiFiRoamingSettingEnabled()Z\"/>\n\t\t<method name=\"isVoWiFiSettingEnabled()Z\"/>\n\t\t<method name=\"isVtSettingEnabled()Z\"/>\n\t\t<method name=\"registerMmTelCapabilityCallback(Ljava/util/concurrent/Executor;Landroid/telephony/ims/ImsMmTelManager$CapabilityCallback;)V\"/>\n\t\t<method name=\"unregisterMmTelCapabilityCallback(Landroid/telephony/ims/ImsMmTelManager$CapabilityCallback;)V\"/>\n\t\t<field name=\"WIFI_MODE_CELLULAR_PREFERRED\"/>\n\t\t<field name=\"WIFI_MODE_WIFI_ONLY\"/>\n\t\t<field name=\"WIFI_MODE_WIFI_PREFERRED\"/>\n\t</class>\n\t<class name=\"android/telephony/ims/ImsMmTelManager$CapabilityCallback\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onCapabilitiesStatusChanged(Landroid/telephony/ims/feature/MmTelFeature$MmTelCapabilities;)V\"/>\n\t</class>\n\t<class name=\"android/telephony/ims/ImsRcsManager\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getUceAdapter()Landroid/telephony/ims/RcsUceAdapter;\"/>\n\t\t<field name=\"ACTION_SHOW_CAPABILITY_DISCOVERY_OPT_IN\"/>\n\t</class>\n\t<class name=\"android/telephony/ims/ImsReasonInfo\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(IILjava/lang/String;)V\"/>\n\t\t<method name=\"getCode()I\"/>\n\t\t<method name=\"getExtraCode()I\"/>\n\t\t<method name=\"getExtraMessage()Ljava/lang/String;\"/>\n\t\t<field name=\"CODE_ACCESS_CLASS_BLOCKED\"/>\n\t\t<field name=\"CODE_ANSWERED_ELSEWHERE\"/>\n\t\t<field name=\"CODE_BLACKLISTED_CALL_ID\"/>\n\t\t<field name=\"CODE_CALL_BARRED\"/>\n\t\t<field name=\"CODE_CALL_DROP_IWLAN_TO_LTE_UNAVAILABLE\"/>\n\t\t<field name=\"CODE_CALL_END_CAUSE_CALL_PULL\"/>\n\t\t<field name=\"CODE_CALL_PULL_OUT_OF_SYNC\"/>\n\t\t<field name=\"CODE_DATA_DISABLED\"/>\n\t\t<field name=\"CODE_DATA_LIMIT_REACHED\"/>\n\t\t<field name=\"CODE_DIAL_MODIFIED_TO_DIAL\"/>\n\t\t<field name=\"CODE_DIAL_MODIFIED_TO_DIAL_VIDEO\"/>\n\t\t<field name=\"CODE_DIAL_MODIFIED_TO_SS\"/>\n\t\t<field name=\"CODE_DIAL_MODIFIED_TO_USSD\"/>\n\t\t<field name=\"CODE_DIAL_VIDEO_MODIFIED_TO_DIAL\"/>\n\t\t<field name=\"CODE_DIAL_VIDEO_MODIFIED_TO_DIAL_VIDEO\"/>\n\t\t<field name=\"CODE_DIAL_VIDEO_MODIFIED_TO_SS\"/>\n\t\t<field name=\"CODE_DIAL_VIDEO_MODIFIED_TO_USSD\"/>\n\t\t<field name=\"CODE_ECBM_NOT_SUPPORTED\"/>\n\t\t<field name=\"CODE_EMERGENCY_PERM_FAILURE\"/>\n\t\t<field name=\"CODE_EMERGENCY_TEMP_FAILURE\"/>\n\t\t<field name=\"CODE_EPDG_TUNNEL_ESTABLISH_FAILURE\"/>\n\t\t<field name=\"CODE_EPDG_TUNNEL_LOST_CONNECTION\"/>\n\t\t<field name=\"CODE_EPDG_TUNNEL_REKEY_FAILURE\"/>\n\t\t<field name=\"CODE_FDN_BLOCKED\"/>\n\t\t<field name=\"CODE_IKEV2_AUTH_FAILURE\"/>\n\t\t<field name=\"CODE_IMEI_NOT_ACCEPTED\"/>\n\t\t<field name=\"CODE_IWLAN_DPD_FAILURE\"/>\n\t\t<field name=\"CODE_LOCAL_CALL_BUSY\"/>\n\t\t<field name=\"CODE_LOCAL_CALL_CS_RETRY_REQUIRED\"/>\n\t\t<field name=\"CODE_LOCAL_CALL_DECLINE\"/>\n\t\t<field name=\"CODE_LOCAL_CALL_EXCEEDED\"/>\n\t\t<field name=\"CODE_LOCAL_CALL_RESOURCE_RESERVATION_FAILED\"/>\n\t\t<field name=\"CODE_LOCAL_CALL_TERMINATED\"/>\n\t\t<field name=\"CODE_LOCAL_CALL_VCC_ON_PROGRESSING\"/>\n\t\t<field name=\"CODE_LOCAL_CALL_VOLTE_RETRY_REQUIRED\"/>\n\t\t<field name=\"CODE_LOCAL_ENDED_BY_CONFERENCE_MERGE\"/>\n\t\t<field name=\"CODE_LOCAL_HO_NOT_FEASIBLE\"/>\n\t\t<field name=\"CODE_LOCAL_ILLEGAL_ARGUMENT\"/>\n\t\t<field name=\"CODE_LOCAL_ILLEGAL_STATE\"/>\n\t\t<field name=\"CODE_LOCAL_IMS_SERVICE_DOWN\"/>\n\t\t<field name=\"CODE_LOCAL_INTERNAL_ERROR\"/>\n\t\t<field name=\"CODE_LOCAL_LOW_BATTERY\"/>\n\t\t<field name=\"CODE_LOCAL_NETWORK_IP_CHANGED\"/>\n\t\t<field name=\"CODE_LOCAL_NETWORK_NO_LTE_COVERAGE\"/>\n\t\t<field name=\"CODE_LOCAL_NETWORK_NO_SERVICE\"/>\n\t\t<field name=\"CODE_LOCAL_NETWORK_ROAMING\"/>\n\t\t<field name=\"CODE_LOCAL_NOT_REGISTERED\"/>\n\t\t<field name=\"CODE_LOCAL_NO_PENDING_CALL\"/>\n\t\t<field name=\"CODE_LOCAL_POWER_OFF\"/>\n\t\t<field name=\"CODE_LOCAL_SERVICE_UNAVAILABLE\"/>\n\t\t<field name=\"CODE_LOW_BATTERY\"/>\n\t\t<field name=\"CODE_MAXIMUM_NUMBER_OF_CALLS_REACHED\"/>\n\t\t<field name=\"CODE_MEDIA_INIT_FAILED\"/>\n\t\t<field name=\"CODE_MEDIA_NOT_ACCEPTABLE\"/>\n\t\t<field name=\"CODE_MEDIA_NO_DATA\"/>\n\t\t<field name=\"CODE_MEDIA_UNSPECIFIED\"/>\n\t\t<field name=\"CODE_MULTIENDPOINT_NOT_SUPPORTED\"/>\n\t\t<field name=\"CODE_NETWORK_DETACH\"/>\n\t\t<field name=\"CODE_NETWORK_REJECT\"/>\n\t\t<field name=\"CODE_NETWORK_RESP_TIMEOUT\"/>\n\t\t<field name=\"CODE_NO_CSFB_IN_CS_ROAM\"/>\n\t\t<field name=\"CODE_NO_VALID_SIM\"/>\n\t\t<field name=\"CODE_OEM_CAUSE_1\"/>\n\t\t<field name=\"CODE_OEM_CAUSE_10\"/>\n\t\t<field name=\"CODE_OEM_CAUSE_11\"/>\n\t\t<field name=\"CODE_OEM_CAUSE_12\"/>\n\t\t<field name=\"CODE_OEM_CAUSE_13\"/>\n\t\t<field name=\"CODE_OEM_CAUSE_14\"/>\n\t\t<field name=\"CODE_OEM_CAUSE_15\"/>\n\t\t<field name=\"CODE_OEM_CAUSE_2\"/>\n\t\t<field name=\"CODE_OEM_CAUSE_3\"/>\n\t\t<field name=\"CODE_OEM_CAUSE_4\"/>\n\t\t<field name=\"CODE_OEM_CAUSE_5\"/>\n\t\t<field name=\"CODE_OEM_CAUSE_6\"/>\n\t\t<field name=\"CODE_OEM_CAUSE_7\"/>\n\t\t<field name=\"CODE_OEM_CAUSE_8\"/>\n\t\t<field name=\"CODE_OEM_CAUSE_9\"/>\n\t\t<field name=\"CODE_RADIO_ACCESS_FAILURE\"/>\n\t\t<field name=\"CODE_RADIO_INTERNAL_ERROR\"/>\n\t\t<field name=\"CODE_RADIO_LINK_FAILURE\"/>\n\t\t<field name=\"CODE_RADIO_LINK_LOST\"/>\n\t\t<field name=\"CODE_RADIO_OFF\"/>\n\t\t<field name=\"CODE_RADIO_RELEASE_ABNORMAL\"/>\n\t\t<field name=\"CODE_RADIO_RELEASE_NORMAL\"/>\n\t\t<field name=\"CODE_RADIO_SETUP_FAILURE\"/>\n\t\t<field name=\"CODE_RADIO_UPLINK_FAILURE\"/>\n\t\t<field name=\"CODE_REGISTRATION_ERROR\"/>\n\t\t<field name=\"CODE_REJECTED_ELSEWHERE\"/>\n\t\t<field name=\"CODE_REJECT_1X_COLLISION\"/>\n\t\t<field name=\"CODE_REJECT_CALL_ON_OTHER_SUB\"/>\n\t\t<field name=\"CODE_REJECT_CALL_TYPE_NOT_ALLOWED\"/>\n\t\t<field name=\"CODE_REJECT_CONFERENCE_TTY_NOT_ALLOWED\"/>\n\t\t<field name=\"CODE_REJECT_INTERNAL_ERROR\"/>\n\t\t<field name=\"CODE_REJECT_MAX_CALL_LIMIT_REACHED\"/>\n\t\t<field name=\"CODE_REJECT_ONGOING_CALL_SETUP\"/>\n\t\t<field name=\"CODE_REJECT_ONGOING_CALL_TRANSFER\"/>\n\t\t<field name=\"CODE_REJECT_ONGOING_CALL_UPGRADE\"/>\n\t\t<field name=\"CODE_REJECT_ONGOING_CALL_WAITING_DISABLED\"/>\n\t\t<field name=\"CODE_REJECT_ONGOING_CONFERENCE_CALL\"/>\n\t\t<field name=\"CODE_REJECT_ONGOING_CS_CALL\"/>\n\t\t<field name=\"CODE_REJECT_ONGOING_E911_CALL\"/>\n\t\t<field name=\"CODE_REJECT_ONGOING_ENCRYPTED_CALL\"/>\n\t\t<field name=\"CODE_REJECT_ONGOING_HANDOVER\"/>\n\t\t<field name=\"CODE_REJECT_QOS_FAILURE\"/>\n\t\t<field name=\"CODE_REJECT_SERVICE_NOT_REGISTERED\"/>\n\t\t<field name=\"CODE_REJECT_UNKNOWN\"/>\n\t\t<field name=\"CODE_REJECT_UNSUPPORTED_SDP_HEADERS\"/>\n\t\t<field name=\"CODE_REJECT_UNSUPPORTED_SIP_HEADERS\"/>\n\t\t<field name=\"CODE_REJECT_VT_AVPF_NOT_ALLOWED\"/>\n\t\t<field name=\"CODE_REJECT_VT_TTY_NOT_ALLOWED\"/>\n\t\t<field name=\"CODE_REMOTE_CALL_DECLINE\"/>\n\t\t<field name=\"CODE_SESSION_MODIFICATION_FAILED\"/>\n\t\t<field name=\"CODE_SIP_ALTERNATE_EMERGENCY_CALL\"/>\n\t\t<field name=\"CODE_SIP_AMBIGUOUS\"/>\n\t\t<field name=\"CODE_SIP_BAD_ADDRESS\"/>\n\t\t<field name=\"CODE_SIP_BAD_REQUEST\"/>\n\t\t<field name=\"CODE_SIP_BUSY\"/>\n\t\t<field name=\"CODE_SIP_CALL_OR_TRANS_DOES_NOT_EXIST\"/>\n\t\t<field name=\"CODE_SIP_CLIENT_ERROR\"/>\n\t\t<field name=\"CODE_SIP_EXTENSION_REQUIRED\"/>\n\t\t<field name=\"CODE_SIP_FORBIDDEN\"/>\n\t\t<field name=\"CODE_SIP_GLOBAL_ERROR\"/>\n\t\t<field name=\"CODE_SIP_INTERVAL_TOO_BRIEF\"/>\n\t\t<field name=\"CODE_SIP_LOOP_DETECTED\"/>\n\t\t<field name=\"CODE_SIP_METHOD_NOT_ALLOWED\"/>\n\t\t<field name=\"CODE_SIP_NOT_ACCEPTABLE\"/>\n\t\t<field name=\"CODE_SIP_NOT_FOUND\"/>\n\t\t<field name=\"CODE_SIP_NOT_REACHABLE\"/>\n\t\t<field name=\"CODE_SIP_NOT_SUPPORTED\"/>\n\t\t<field name=\"CODE_SIP_PROXY_AUTHENTICATION_REQUIRED\"/>\n\t\t<field name=\"CODE_SIP_REDIRECTED\"/>\n\t\t<field name=\"CODE_SIP_REQUEST_CANCELLED\"/>\n\t\t<field name=\"CODE_SIP_REQUEST_ENTITY_TOO_LARGE\"/>\n\t\t<field name=\"CODE_SIP_REQUEST_PENDING\"/>\n\t\t<field name=\"CODE_SIP_REQUEST_TIMEOUT\"/>\n\t\t<field name=\"CODE_SIP_REQUEST_URI_TOO_LARGE\"/>\n\t\t<field name=\"CODE_SIP_SERVER_ERROR\"/>\n\t\t<field name=\"CODE_SIP_SERVER_INTERNAL_ERROR\"/>\n\t\t<field name=\"CODE_SIP_SERVER_TIMEOUT\"/>\n\t\t<field name=\"CODE_SIP_SERVICE_UNAVAILABLE\"/>\n\t\t<field name=\"CODE_SIP_TEMPRARILY_UNAVAILABLE\"/>\n\t\t<field name=\"CODE_SIP_TOO_MANY_HOPS\"/>\n\t\t<field name=\"CODE_SIP_TRANSACTION_DOES_NOT_EXIST\"/>\n\t\t<field name=\"CODE_SIP_UNDECIPHERABLE\"/>\n\t\t<field name=\"CODE_SIP_USER_MARKED_UNWANTED\"/>\n\t\t<field name=\"CODE_SIP_USER_REJECTED\"/>\n\t\t<field name=\"CODE_SUPP_SVC_CANCELLED\"/>\n\t\t<field name=\"CODE_SUPP_SVC_FAILED\"/>\n\t\t<field name=\"CODE_SUPP_SVC_REINVITE_COLLISION\"/>\n\t\t<field name=\"CODE_TIMEOUT_1XX_WAITING\"/>\n\t\t<field name=\"CODE_TIMEOUT_NO_ANSWER\"/>\n\t\t<field name=\"CODE_TIMEOUT_NO_ANSWER_CALL_UPDATE\"/>\n\t\t<field name=\"CODE_UNSPECIFIED\"/>\n\t\t<field name=\"CODE_USER_CANCELLED_SESSION_MODIFICATION\"/>\n\t\t<field name=\"CODE_USER_DECLINE\"/>\n\t\t<field name=\"CODE_USER_IGNORE\"/>\n\t\t<field name=\"CODE_USER_NOANSWER\"/>\n\t\t<field name=\"CODE_USER_REJECTED_SESSION_MODIFICATION\"/>\n\t\t<field name=\"CODE_USER_TERMINATED\"/>\n\t\t<field name=\"CODE_USER_TERMINATED_BY_REMOTE\"/>\n\t\t<field name=\"CODE_UT_CB_PASSWORD_MISMATCH\"/>\n\t\t<field name=\"CODE_UT_NETWORK_ERROR\"/>\n\t\t<field name=\"CODE_UT_NOT_SUPPORTED\"/>\n\t\t<field name=\"CODE_UT_OPERATION_NOT_ALLOWED\"/>\n\t\t<field name=\"CODE_UT_SERVICE_UNAVAILABLE\"/>\n\t\t<field name=\"CODE_UT_SS_MODIFIED_TO_DIAL\"/>\n\t\t<field name=\"CODE_UT_SS_MODIFIED_TO_DIAL_VIDEO\"/>\n\t\t<field name=\"CODE_UT_SS_MODIFIED_TO_SS\"/>\n\t\t<field name=\"CODE_UT_SS_MODIFIED_TO_USSD\"/>\n\t\t<field name=\"CODE_WIFI_LOST\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"EXTRA_CODE_CALL_RETRY_BY_SETTINGS\"/>\n\t\t<field name=\"EXTRA_CODE_CALL_RETRY_NORMAL\"/>\n\t\t<field name=\"EXTRA_CODE_CALL_RETRY_SILENT_REDIAL\"/>\n\t</class>\n\t<class name=\"android/telephony/ims/RcsUceAdapter\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"isUceSettingEnabled()Z\"/>\n\t</class>\n\t<class name=\"android/telephony/ims/RegistrationManager\" since=\"30\">\n\t\t<method name=\"getRegistrationState(Ljava/util/concurrent/Executor;Ljava/util/function/Consumer;)V\"/>\n\t\t<method name=\"getRegistrationTransportType(Ljava/util/concurrent/Executor;Ljava/util/function/Consumer;)V\"/>\n\t\t<method name=\"registerImsRegistrationCallback(Ljava/util/concurrent/Executor;Landroid/telephony/ims/RegistrationManager$RegistrationCallback;)V\"/>\n\t\t<method name=\"unregisterImsRegistrationCallback(Landroid/telephony/ims/RegistrationManager$RegistrationCallback;)V\"/>\n\t\t<field name=\"REGISTRATION_STATE_NOT_REGISTERED\"/>\n\t\t<field name=\"REGISTRATION_STATE_REGISTERED\"/>\n\t\t<field name=\"REGISTRATION_STATE_REGISTERING\"/>\n\t</class>\n\t<class name=\"android/telephony/ims/RegistrationManager$RegistrationCallback\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onRegistered(I)V\"/>\n\t\t<method name=\"onRegistering(I)V\"/>\n\t\t<method name=\"onTechnologyChangeFailed(ILandroid/telephony/ims/ImsReasonInfo;)V\"/>\n\t\t<method name=\"onUnregistered(Landroid/telephony/ims/ImsReasonInfo;)V\"/>\n\t</class>\n\t<class name=\"android/telephony/ims/feature/MmTelFeature\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/telephony/ims/feature/MmTelFeature$MmTelCapabilities\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CAPABILITY_TYPE_SMS\"/>\n\t\t<field name=\"CAPABILITY_TYPE_UT\"/>\n\t\t<field name=\"CAPABILITY_TYPE_VIDEO\"/>\n\t\t<field name=\"CAPABILITY_TYPE_VOICE\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/DownloadProgressListener\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onProgressUpdated(Landroid/telephony/mbms/DownloadRequest;Landroid/telephony/mbms/FileInfo;IIII)V\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/DownloadRequest\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getDestinationUri()Landroid/net/Uri;\"/>\n\t\t<method name=\"getFileServiceId()Ljava/lang/String;\"/>\n\t\t<method name=\"getMaxAppIntentSize()I\"/>\n\t\t<method name=\"getMaxDestinationUriSize()I\"/>\n\t\t<method name=\"getSourceUri()Landroid/net/Uri;\"/>\n\t\t<method name=\"getSubscriptionId()I\"/>\n\t\t<method name=\"toByteArray()[B\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/DownloadRequest$Builder\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/Uri;Landroid/net/Uri;)V\"/>\n\t\t<method name=\"build()Landroid/telephony/mbms/DownloadRequest;\"/>\n\t\t<method name=\"fromDownloadRequest(Landroid/telephony/mbms/DownloadRequest;)Landroid/telephony/mbms/DownloadRequest$Builder;\"/>\n\t\t<method name=\"fromSerializedRequest([B)Landroid/telephony/mbms/DownloadRequest$Builder;\"/>\n\t\t<method name=\"setAppIntent(Landroid/content/Intent;)Landroid/telephony/mbms/DownloadRequest$Builder;\"/>\n\t\t<method name=\"setServiceInfo(Landroid/telephony/mbms/FileServiceInfo;)Landroid/telephony/mbms/DownloadRequest$Builder;\"/>\n\t\t<method name=\"setSubscriptionId(I)Landroid/telephony/mbms/DownloadRequest$Builder;\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/DownloadStatusListener\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onStatusUpdated(Landroid/telephony/mbms/DownloadRequest;Landroid/telephony/mbms/FileInfo;I)V\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/FileInfo\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getMimeType()Ljava/lang/String;\"/>\n\t\t<method name=\"getUri()Landroid/net/Uri;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/FileServiceInfo\" since=\"28\">\n\t\t<extends name=\"android/telephony/mbms/ServiceInfo\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getFiles()Ljava/util/List;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/GroupCall\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"getTmgi()J\"/>\n\t\t<method name=\"updateGroupCall(Ljava/util/List;Ljava/util/List;)V\"/>\n\t\t<field name=\"REASON_BY_USER_REQUEST\"/>\n\t\t<field name=\"REASON_FREQUENCY_CONFLICT\"/>\n\t\t<field name=\"REASON_LEFT_MBMS_BROADCAST_AREA\"/>\n\t\t<field name=\"REASON_NONE\"/>\n\t\t<field name=\"REASON_NOT_CONNECTED_TO_HOMECARRIER_LTE\"/>\n\t\t<field name=\"REASON_OUT_OF_MEMORY\"/>\n\t\t<field name=\"STATE_STALLED\"/>\n\t\t<field name=\"STATE_STARTED\"/>\n\t\t<field name=\"STATE_STOPPED\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/GroupCallCallback\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onBroadcastSignalStrengthUpdated(I)V\"/>\n\t\t<method name=\"onError(ILjava/lang/String;)V\"/>\n\t\t<method name=\"onGroupCallStateChanged(II)V\"/>\n\t\t<field name=\"SIGNAL_STRENGTH_UNAVAILABLE\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/MbmsDownloadReceiver\" since=\"28\">\n\t\t<extends name=\"android/content/BroadcastReceiver\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/MbmsDownloadSessionCallback\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onError(ILjava/lang/String;)V\"/>\n\t\t<method name=\"onFileServicesUpdated(Ljava/util/List;)V\"/>\n\t\t<method name=\"onMiddlewareReady()V\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/MbmsErrors\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ERROR_MIDDLEWARE_LOST\"/>\n\t\t<field name=\"ERROR_MIDDLEWARE_NOT_BOUND\"/>\n\t\t<field name=\"ERROR_NO_UNIQUE_MIDDLEWARE\"/>\n\t\t<field name=\"SUCCESS\"/>\n\t\t<field name=\"UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/MbmsErrors$DownloadErrors\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT\"/>\n\t\t<field name=\"ERROR_MALFORMED_SERVICE_ANNOUNCEMENT\" since=\"30\"/>\n\t\t<field name=\"ERROR_UNKNOWN_DOWNLOAD_REQUEST\"/>\n\t\t<field name=\"ERROR_UNKNOWN_FILE_INFO\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/MbmsErrors$GeneralErrors\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ERROR_CARRIER_CHANGE_NOT_ALLOWED\"/>\n\t\t<field name=\"ERROR_IN_E911\"/>\n\t\t<field name=\"ERROR_MIDDLEWARE_NOT_YET_READY\"/>\n\t\t<field name=\"ERROR_MIDDLEWARE_TEMPORARILY_UNAVAILABLE\"/>\n\t\t<field name=\"ERROR_NOT_CONNECTED_TO_HOME_CARRIER_LTE\"/>\n\t\t<field name=\"ERROR_OUT_OF_MEMORY\"/>\n\t\t<field name=\"ERROR_UNABLE_TO_READ_SIM\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/MbmsErrors$GroupCallErrors\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ERROR_DUPLICATE_START_GROUP_CALL\"/>\n\t\t<field name=\"ERROR_UNABLE_TO_START_SERVICE\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/MbmsErrors$InitializationErrors\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ERROR_APP_PERMISSIONS_NOT_GRANTED\"/>\n\t\t<field name=\"ERROR_DUPLICATE_INITIALIZE\"/>\n\t\t<field name=\"ERROR_UNABLE_TO_INITIALIZE\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/MbmsErrors$StreamingErrors\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ERROR_CONCURRENT_SERVICE_LIMIT_REACHED\"/>\n\t\t<field name=\"ERROR_DUPLICATE_START_STREAM\"/>\n\t\t<field name=\"ERROR_UNABLE_TO_START_SERVICE\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/MbmsGroupCallSessionCallback\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onAvailableSaisUpdated(Ljava/util/List;Ljava/util/List;)V\"/>\n\t\t<method name=\"onError(ILjava/lang/String;)V\"/>\n\t\t<method name=\"onMiddlewareReady()V\"/>\n\t\t<method name=\"onServiceInterfaceAvailable(Ljava/lang/String;I)V\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/MbmsStreamingSessionCallback\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onError(ILjava/lang/String;)V\"/>\n\t\t<method name=\"onMiddlewareReady()V\"/>\n\t\t<method name=\"onStreamingServicesUpdated(Ljava/util/List;)V\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/ServiceInfo\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getLocales()Ljava/util/List;\"/>\n\t\t<method name=\"getNameForLocale(Ljava/util/Locale;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getNamedContentLocales()Ljava/util/Set;\"/>\n\t\t<method name=\"getServiceClassName()Ljava/lang/String;\"/>\n\t\t<method name=\"getServiceId()Ljava/lang/String;\"/>\n\t\t<method name=\"getSessionEndTime()Ljava/util/Date;\"/>\n\t\t<method name=\"getSessionStartTime()Ljava/util/Date;\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/StreamingService\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"getInfo()Landroid/telephony/mbms/StreamingServiceInfo;\"/>\n\t\t<method name=\"getPlaybackUri()Landroid/net/Uri;\"/>\n\t\t<field name=\"BROADCAST_METHOD\"/>\n\t\t<field name=\"REASON_BY_USER_REQUEST\"/>\n\t\t<field name=\"REASON_END_OF_SESSION\"/>\n\t\t<field name=\"REASON_FREQUENCY_CONFLICT\"/>\n\t\t<field name=\"REASON_LEFT_MBMS_BROADCAST_AREA\"/>\n\t\t<field name=\"REASON_NONE\"/>\n\t\t<field name=\"REASON_NOT_CONNECTED_TO_HOMECARRIER_LTE\"/>\n\t\t<field name=\"REASON_OUT_OF_MEMORY\"/>\n\t\t<field name=\"STATE_STALLED\"/>\n\t\t<field name=\"STATE_STARTED\"/>\n\t\t<field name=\"STATE_STOPPED\"/>\n\t\t<field name=\"UNICAST_METHOD\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/StreamingServiceCallback\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onBroadcastSignalStrengthUpdated(I)V\"/>\n\t\t<method name=\"onError(ILjava/lang/String;)V\"/>\n\t\t<method name=\"onMediaDescriptionUpdated()V\"/>\n\t\t<method name=\"onStreamMethodUpdated(I)V\"/>\n\t\t<method name=\"onStreamStateUpdated(II)V\"/>\n\t\t<field name=\"SIGNAL_STRENGTH_UNAVAILABLE\"/>\n\t</class>\n\t<class name=\"android/telephony/mbms/StreamingServiceInfo\" since=\"28\">\n\t\t<extends name=\"android/telephony/mbms/ServiceInfo\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/test/ActivityInstrumentationTestCase\" since=\"1\" deprecated=\"3\">\n\t\t<extends name=\"android/test/ActivityTestCase\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Class;)V\" deprecated=\"30\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Class;Z)V\" deprecated=\"30\"/>\n\t\t<method name=\"testActivityTestCaseSetUpProperly()V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/ActivityInstrumentationTestCase2\" since=\"3\" deprecated=\"24\">\n\t\t<extends name=\"android/test/ActivityTestCase\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Class;)V\" since=\"8\" deprecated=\"30\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Class;)V\" deprecated=\"15\"/>\n\t\t<method name=\"setActivityInitialTouchMode(Z)V\" deprecated=\"30\"/>\n\t\t<method name=\"setActivityIntent(Landroid/content/Intent;)V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/ActivityTestCase\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"android/test/InstrumentationTestCase\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"getActivity()Landroid/app/Activity;\" deprecated=\"30\"/>\n\t\t<method name=\"scrubClass(Ljava/lang/Class;)V\" deprecated=\"30\"/>\n\t\t<method name=\"setActivity(Landroid/app/Activity;)V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/ActivityUnitTestCase\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"android/test/ActivityTestCase\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Class;)V\" deprecated=\"30\"/>\n\t\t<method name=\"getFinishedActivityRequest()I\" deprecated=\"30\"/>\n\t\t<method name=\"getRequestedOrientation()I\" deprecated=\"30\"/>\n\t\t<method name=\"getStartedActivityIntent()Landroid/content/Intent;\" deprecated=\"30\"/>\n\t\t<method name=\"getStartedActivityRequest()I\" deprecated=\"30\"/>\n\t\t<method name=\"isFinishCalled()Z\" deprecated=\"30\"/>\n\t\t<method name=\"setActivityContext(Landroid/content/Context;)V\" deprecated=\"30\"/>\n\t\t<method name=\"setApplication(Landroid/app/Application;)V\" deprecated=\"30\"/>\n\t\t<method name=\"startActivity(Landroid/content/Intent;Landroid/os/Bundle;Ljava/lang/Object;)Landroid/app/Activity;\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/AndroidTestCase\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"junit/framework/TestCase\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"assertActivityRequiresPermission(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\" since=\"4\" deprecated=\"30\"/>\n\t\t<method name=\"assertReadingContentUriRequiresPermission(Landroid/net/Uri;Ljava/lang/String;)V\" since=\"4\" deprecated=\"30\"/>\n\t\t<method name=\"assertWritingContentUriRequiresPermission(Landroid/net/Uri;Ljava/lang/String;)V\" since=\"4\" deprecated=\"30\"/>\n\t\t<method name=\"getContext()Landroid/content/Context;\" deprecated=\"30\"/>\n\t\t<method name=\"getTestContext()Landroid/content/Context;\" since=\"30\" deprecated=\"30\"/>\n\t\t<method name=\"scrubClass(Ljava/lang/Class;)V\" deprecated=\"30\"/>\n\t\t<method name=\"setContext(Landroid/content/Context;)V\" deprecated=\"30\"/>\n\t\t<method name=\"setTestContext(Landroid/content/Context;)V\" since=\"30\" deprecated=\"30\"/>\n\t\t<method name=\"testAndroidTestCaseSetupProperly()V\" deprecated=\"30\"/>\n\t\t<field name=\"mContext\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/AndroidTestRunner\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"junit/runner/BaseTestRunner\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"addTestListener(Ljunit/framework/TestListener;)V\" deprecated=\"30\"/>\n\t\t<method name=\"clearTestListeners()V\" deprecated=\"30\"/>\n\t\t<method name=\"createTestResult()Ljunit/framework/TestResult;\" deprecated=\"30\"/>\n\t\t<method name=\"getTestCases()Ljava/util/List;\" deprecated=\"30\"/>\n\t\t<method name=\"getTestClassName()Ljava/lang/String;\" deprecated=\"30\"/>\n\t\t<method name=\"getTestResult()Ljunit/framework/TestResult;\" deprecated=\"30\"/>\n\t\t<method name=\"runTest()V\" deprecated=\"30\"/>\n\t\t<method name=\"runTest(Ljunit/framework/TestResult;)V\" deprecated=\"30\"/>\n\t\t<method name=\"setContext(Landroid/content/Context;)V\" deprecated=\"30\"/>\n\t\t<method name=\"setInstrumentaiton(Landroid/app/Instrumentation;)V\" deprecated=\"15\"/>\n\t\t<method name=\"setInstrumentation(Landroid/app/Instrumentation;)V\" since=\"5\" deprecated=\"30\"/>\n\t\t<method name=\"setTest(Ljunit/framework/Test;)V\" deprecated=\"30\"/>\n\t\t<method name=\"setTestClassName(Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/ApplicationTestCase\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"android/test/AndroidTestCase\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Class;)V\" deprecated=\"30\"/>\n\t\t<method name=\"createApplication()V\" deprecated=\"30\"/>\n\t\t<method name=\"getApplication()Landroid/app/Application;\" deprecated=\"30\"/>\n\t\t<method name=\"getSystemContext()Landroid/content/Context;\" deprecated=\"30\"/>\n\t\t<method name=\"terminateApplication()V\" deprecated=\"30\"/>\n\t\t<method name=\"testApplicationTestCaseSetUpProperly()V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/AssertionFailedError\" since=\"1\" deprecated=\"16\">\n\t\t<extends name=\"java/lang/Error\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/ComparisonFailure\" since=\"1\" deprecated=\"16\">\n\t\t<extends name=\"android/test/AssertionFailedError\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/FlakyTest\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t\t<method name=\"tolerance()I\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/InstrumentationTestCase\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"junit/framework/TestCase\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"getInstrumentation()Landroid/app/Instrumentation;\" deprecated=\"30\"/>\n\t\t<method name=\"injectInsrumentation(Landroid/app/Instrumentation;)V\" deprecated=\"15\"/>\n\t\t<method name=\"injectInstrumentation(Landroid/app/Instrumentation;)V\" since=\"5\" deprecated=\"30\"/>\n\t\t<method name=\"launchActivity(Ljava/lang/String;Ljava/lang/Class;Landroid/os/Bundle;)Landroid/app/Activity;\" deprecated=\"30\"/>\n\t\t<method name=\"launchActivityWithIntent(Ljava/lang/String;Ljava/lang/Class;Landroid/content/Intent;)Landroid/app/Activity;\" since=\"3\" deprecated=\"30\"/>\n\t\t<method name=\"runTestOnUiThread(Ljava/lang/Runnable;)V\" since=\"3\" deprecated=\"30\"/>\n\t\t<method name=\"sendKeys(Ljava/lang/String;)V\" deprecated=\"30\"/>\n\t\t<method name=\"sendKeys([I)V\" deprecated=\"30\"/>\n\t\t<method name=\"sendRepeatedKeys([I)V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/InstrumentationTestRunner\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"android/app/Instrumentation\"/>\n\t\t<implements name=\"android/test/TestSuiteProvider\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"addTestListener(Ljunit/framework/TestListener;)V\" since=\"30\" deprecated=\"30\"/>\n\t\t<method name=\"getAllTests()Ljunit/framework/TestSuite;\" deprecated=\"30\"/>\n\t\t<method name=\"getAndroidTestRunner()Landroid/test/AndroidTestRunner;\" deprecated=\"30\"/>\n\t\t<method name=\"getArguments()Landroid/os/Bundle;\" since=\"18\" deprecated=\"30\"/>\n\t\t<method name=\"getLoader()Ljava/lang/ClassLoader;\" deprecated=\"30\"/>\n\t\t<field name=\"REPORT_KEY_NAME_CLASS\" deprecated=\"30\"/>\n\t\t<field name=\"REPORT_KEY_NAME_TEST\" deprecated=\"30\"/>\n\t\t<field name=\"REPORT_KEY_NUM_CURRENT\" deprecated=\"30\"/>\n\t\t<field name=\"REPORT_KEY_NUM_TOTAL\" deprecated=\"30\"/>\n\t\t<field name=\"REPORT_KEY_STACK\" deprecated=\"30\"/>\n\t\t<field name=\"REPORT_VALUE_ID\" deprecated=\"30\"/>\n\t\t<field name=\"REPORT_VALUE_RESULT_ERROR\" deprecated=\"30\"/>\n\t\t<field name=\"REPORT_VALUE_RESULT_FAILURE\" deprecated=\"30\"/>\n\t\t<field name=\"REPORT_VALUE_RESULT_OK\" deprecated=\"30\"/>\n\t\t<field name=\"REPORT_VALUE_RESULT_START\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/InstrumentationTestSuite\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"junit/framework/TestSuite\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/Instrumentation;)V\" deprecated=\"30\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Class;Landroid/app/Instrumentation;)V\" deprecated=\"30\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Landroid/app/Instrumentation;)V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/IsolatedContext\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"android/content/ContextWrapper\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/ContentResolver;Landroid/content/Context;)V\" deprecated=\"30\"/>\n\t\t<method name=\"getAndClearBroadcastIntents()Ljava/util/List;\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/LaunchPerformanceBase\" since=\"30\" deprecated=\"30\">\n\t\t<extends name=\"android/app/Instrumentation\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"LaunchApp()V\" deprecated=\"30\"/>\n\t\t<field name=\"mIntent\" deprecated=\"30\"/>\n\t\t<field name=\"mResults\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/LoaderTestCase\" since=\"11\">\n\t\t<extends name=\"android/test/AndroidTestCase\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getLoaderResultSynchronously(Landroid/content/Loader;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"android/test/MoreAsserts\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"assertAssignableFrom(Ljava/lang/Class;Ljava/lang/Class;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertAssignableFrom(Ljava/lang/Class;Ljava/lang/Object;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertContainsRegex(Ljava/lang/String;Ljava/lang/String;)Ljava/util/regex/MatchResult;\" deprecated=\"30\"/>\n\t\t<method name=\"assertContainsRegex(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/util/regex/MatchResult;\" deprecated=\"30\"/>\n\t\t<method name=\"assertContentsInAnyOrder(Ljava/lang/Iterable;[Ljava/lang/Object;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertContentsInAnyOrder(Ljava/lang/String;Ljava/lang/Iterable;[Ljava/lang/Object;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertContentsInOrder(Ljava/lang/Iterable;[Ljava/lang/Object;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertContentsInOrder(Ljava/lang/String;Ljava/lang/Iterable;[Ljava/lang/Object;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertEmpty(Ljava/lang/Iterable;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertEmpty(Ljava/lang/String;Ljava/lang/Iterable;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertEmpty(Ljava/lang/String;Ljava/util/Map;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertEmpty(Ljava/util/Map;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertEquals(Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertEquals(Ljava/lang/String;[B[B)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertEquals(Ljava/lang/String;[D[D)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertEquals(Ljava/lang/String;[I[I)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertEquals(Ljava/lang/String;[Ljava/lang/Object;[Ljava/lang/Object;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertEquals(Ljava/util/Set;Ljava/util/Set;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertEquals([B[B)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertEquals([D[D)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertEquals([I[I)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertEquals([Ljava/lang/Object;[Ljava/lang/Object;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertMatchesRegex(Ljava/lang/String;Ljava/lang/String;)Ljava/util/regex/MatchResult;\" deprecated=\"30\"/>\n\t\t<method name=\"assertMatchesRegex(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/util/regex/MatchResult;\" deprecated=\"30\"/>\n\t\t<method name=\"assertNotContainsRegex(Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertNotContainsRegex(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertNotEmpty(Ljava/lang/Iterable;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertNotEmpty(Ljava/lang/String;Ljava/lang/Iterable;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertNotEmpty(Ljava/lang/String;Ljava/util/Map;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertNotEmpty(Ljava/util/Map;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertNotEqual(Ljava/lang/Object;Ljava/lang/Object;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertNotEqual(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertNotMatchesRegex(Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertNotMatchesRegex(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"30\"/>\n\t\t<method name=\"checkEqualsAndHashCodeMethods(Ljava/lang/Object;Ljava/lang/Object;Z)V\" deprecated=\"30\"/>\n\t\t<method name=\"checkEqualsAndHashCodeMethods(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Z)V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/PerformanceTestCase\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"isPerformanceOnly()Z\" deprecated=\"30\"/>\n\t\t<method name=\"startPerformance(Landroid/test/PerformanceTestCase$Intermediates;)I\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/PerformanceTestCase$Intermediates\" since=\"1\" deprecated=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addIntermediate(Ljava/lang/String;)V\" deprecated=\"30\"/>\n\t\t<method name=\"addIntermediate(Ljava/lang/String;J)V\" deprecated=\"30\"/>\n\t\t<method name=\"finishTiming(Z)V\" deprecated=\"30\"/>\n\t\t<method name=\"setInternalIterations(I)V\" deprecated=\"30\"/>\n\t\t<method name=\"startTiming(Z)V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/ProviderTestCase\" since=\"1\" deprecated=\"5\">\n\t\t<extends name=\"android/test/InstrumentationTestCase\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Class;Ljava/lang/String;)V\" deprecated=\"30\"/>\n\t\t<method name=\"getMockContentResolver()Landroid/test/mock/MockContentResolver;\" deprecated=\"30\"/>\n\t\t<method name=\"getMockContext()Landroid/test/IsolatedContext;\" deprecated=\"30\"/>\n\t\t<method name=\"getProvider()Landroid/content/ContentProvider;\" deprecated=\"30\"/>\n\t\t<method name=\"newResolverWithContentProviderFromSql(Landroid/content/Context;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)Landroid/content/ContentResolver;\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/ProviderTestCase2\" since=\"3\">\n\t\t<extends name=\"android/test/AndroidTestCase\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Class;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getMockContentResolver()Landroid/test/mock/MockContentResolver;\"/>\n\t\t<method name=\"getMockContext()Landroid/test/IsolatedContext;\"/>\n\t\t<method name=\"getProvider()Landroid/content/ContentProvider;\"/>\n\t\t<method name=\"newResolverWithContentProviderFromSql(Landroid/content/Context;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)Landroid/content/ContentResolver;\"/>\n\t</class>\n\t<class name=\"android/test/RenamingDelegatingContext\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"android/content/ContextWrapper\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/content/Context;Ljava/lang/String;)V\" deprecated=\"30\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/lang/String;)V\" deprecated=\"30\"/>\n\t\t<method name=\"getDatabasePrefix()Ljava/lang/String;\" deprecated=\"30\"/>\n\t\t<method name=\"makeExistingFilesAndDbsAccessible()V\" deprecated=\"30\"/>\n\t\t<method name=\"providerWithRenamedContext(Ljava/lang/Class;Landroid/content/Context;Ljava/lang/String;)Landroid/content/ContentProvider;\" deprecated=\"30\"/>\n\t\t<method name=\"providerWithRenamedContext(Ljava/lang/Class;Landroid/content/Context;Ljava/lang/String;Z)Landroid/content/ContentProvider;\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/RepetitiveTest\" since=\"30\" deprecated=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t\t<method name=\"numIterations()I\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/ServiceTestCase\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"android/test/AndroidTestCase\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Class;)V\" deprecated=\"30\"/>\n\t\t<method name=\"bindService(Landroid/content/Intent;)Landroid/os/IBinder;\" deprecated=\"30\"/>\n\t\t<method name=\"getApplication()Landroid/app/Application;\" deprecated=\"30\"/>\n\t\t<method name=\"getService()Landroid/app/Service;\" deprecated=\"30\"/>\n\t\t<method name=\"getSystemContext()Landroid/content/Context;\" deprecated=\"30\"/>\n\t\t<method name=\"setApplication(Landroid/app/Application;)V\" deprecated=\"30\"/>\n\t\t<method name=\"setupService()V\" deprecated=\"30\"/>\n\t\t<method name=\"shutdownService()V\" deprecated=\"30\"/>\n\t\t<method name=\"startService(Landroid/content/Intent;)V\" deprecated=\"30\"/>\n\t\t<method name=\"testServiceTestCaseSetUpProperly()V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/SingleLaunchActivityTestCase\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"android/test/InstrumentationTestCase\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Class;)V\" deprecated=\"30\"/>\n\t\t<method name=\"getActivity()Landroid/app/Activity;\" deprecated=\"30\"/>\n\t\t<method name=\"testActivityTestCaseSetUpProperly()V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/SyncBaseInstrumentation\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"android/test/InstrumentationTestCase\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"cancelSyncsandDisableAutoSync()V\" deprecated=\"30\"/>\n\t\t<method name=\"syncProvider(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/TestSuiteProvider\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getTestSuite()Ljunit/framework/TestSuite;\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/TouchUtils\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"clickView(Landroid/test/InstrumentationTestCase;Landroid/view/View;)V\" deprecated=\"30\"/>\n\t\t<method name=\"drag(Landroid/test/ActivityInstrumentationTestCase;FFFFI)V\" deprecated=\"15\"/>\n\t\t<method name=\"drag(Landroid/test/InstrumentationTestCase;FFFFI)V\" since=\"3\" deprecated=\"30\"/>\n\t\t<method name=\"dragQuarterScreenDown(Landroid/test/ActivityInstrumentationTestCase;)V\" deprecated=\"15\"/>\n\t\t<method name=\"dragQuarterScreenDown(Landroid/test/InstrumentationTestCase;Landroid/app/Activity;)V\" since=\"3\" deprecated=\"30\"/>\n\t\t<method name=\"dragQuarterScreenUp(Landroid/test/ActivityInstrumentationTestCase;)V\" deprecated=\"15\"/>\n\t\t<method name=\"dragQuarterScreenUp(Landroid/test/InstrumentationTestCase;Landroid/app/Activity;)V\" since=\"3\" deprecated=\"30\"/>\n\t\t<method name=\"dragViewBy(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;III)I\" deprecated=\"15\"/>\n\t\t<method name=\"dragViewBy(Landroid/test/InstrumentationTestCase;Landroid/view/View;III)I\" since=\"3\" deprecated=\"15\"/>\n\t\t<method name=\"dragViewTo(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;III)I\" deprecated=\"15\"/>\n\t\t<method name=\"dragViewTo(Landroid/test/InstrumentationTestCase;Landroid/view/View;III)I\" since=\"3\" deprecated=\"30\"/>\n\t\t<method name=\"dragViewToBottom(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;)V\" deprecated=\"15\"/>\n\t\t<method name=\"dragViewToBottom(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;I)V\" deprecated=\"15\"/>\n\t\t<method name=\"dragViewToBottom(Landroid/test/InstrumentationTestCase;Landroid/app/Activity;Landroid/view/View;)V\" since=\"3\" deprecated=\"30\"/>\n\t\t<method name=\"dragViewToBottom(Landroid/test/InstrumentationTestCase;Landroid/app/Activity;Landroid/view/View;I)V\" since=\"3\" deprecated=\"30\"/>\n\t\t<method name=\"dragViewToTop(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;)V\" deprecated=\"15\"/>\n\t\t<method name=\"dragViewToTop(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;I)V\" deprecated=\"15\"/>\n\t\t<method name=\"dragViewToTop(Landroid/test/InstrumentationTestCase;Landroid/view/View;)V\" since=\"3\" deprecated=\"30\"/>\n\t\t<method name=\"dragViewToTop(Landroid/test/InstrumentationTestCase;Landroid/view/View;I)V\" since=\"3\" deprecated=\"30\"/>\n\t\t<method name=\"dragViewToX(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;II)I\" deprecated=\"15\"/>\n\t\t<method name=\"dragViewToX(Landroid/test/InstrumentationTestCase;Landroid/view/View;II)I\" since=\"3\" deprecated=\"30\"/>\n\t\t<method name=\"dragViewToY(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;II)I\" deprecated=\"15\"/>\n\t\t<method name=\"dragViewToY(Landroid/test/InstrumentationTestCase;Landroid/view/View;II)I\" since=\"3\" deprecated=\"30\"/>\n\t\t<method name=\"longClickView(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;)V\" deprecated=\"15\"/>\n\t\t<method name=\"longClickView(Landroid/test/InstrumentationTestCase;Landroid/view/View;)V\" since=\"3\" deprecated=\"30\"/>\n\t\t<method name=\"scrollToBottom(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/ViewGroup;)V\" deprecated=\"15\"/>\n\t\t<method name=\"scrollToBottom(Landroid/test/InstrumentationTestCase;Landroid/app/Activity;Landroid/view/ViewGroup;)V\" since=\"3\" deprecated=\"30\"/>\n\t\t<method name=\"scrollToTop(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/ViewGroup;)V\" deprecated=\"15\"/>\n\t\t<method name=\"scrollToTop(Landroid/test/InstrumentationTestCase;Landroid/app/Activity;Landroid/view/ViewGroup;)V\" since=\"3\" deprecated=\"30\"/>\n\t\t<method name=\"tapView(Landroid/test/InstrumentationTestCase;Landroid/view/View;)V\" deprecated=\"30\"/>\n\t\t<method name=\"touchAndCancelView(Landroid/test/InstrumentationTestCase;Landroid/view/View;)V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/UiThreadTest\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t</class>\n\t<class name=\"android/test/ViewAsserts\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"assertBaselineAligned(Landroid/view/View;Landroid/view/View;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertBottomAligned(Landroid/view/View;Landroid/view/View;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertBottomAligned(Landroid/view/View;Landroid/view/View;I)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertGroupContains(Landroid/view/ViewGroup;Landroid/view/View;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertGroupIntegrity(Landroid/view/ViewGroup;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertGroupNotContains(Landroid/view/ViewGroup;Landroid/view/View;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertHasScreenCoordinates(Landroid/view/View;Landroid/view/View;II)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertHorizontalCenterAligned(Landroid/view/View;Landroid/view/View;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertLeftAligned(Landroid/view/View;Landroid/view/View;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertLeftAligned(Landroid/view/View;Landroid/view/View;I)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertOffScreenAbove(Landroid/view/View;Landroid/view/View;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertOffScreenBelow(Landroid/view/View;Landroid/view/View;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertOnScreen(Landroid/view/View;Landroid/view/View;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertRightAligned(Landroid/view/View;Landroid/view/View;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertRightAligned(Landroid/view/View;Landroid/view/View;I)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertTopAligned(Landroid/view/View;Landroid/view/View;)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertTopAligned(Landroid/view/View;Landroid/view/View;I)V\" deprecated=\"30\"/>\n\t\t<method name=\"assertVerticalCenterAligned(Landroid/view/View;Landroid/view/View;)V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/mock/MockAccountManager\" since=\"30\" deprecated=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"newMockAccountManager(Landroid/content/Context;)Landroid/accounts/AccountManager;\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/mock/MockApplication\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"android/app/Application\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/mock/MockContentProvider\" since=\"8\">\n\t\t<extends name=\"android/content/ContentProvider\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;[Landroid/content/pm/PathPermission;)V\"/>\n\t\t<method name=\"attachInfoForTesting(Landroid/content/ContentProvider;Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V\" since=\"30\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/mock/MockContentResolver\" since=\"1\">\n\t\t<extends name=\"android/content/ContentResolver\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" since=\"18\"/>\n\t\t<method name=\"addProvider(Ljava/lang/String;Landroid/content/ContentProvider;)V\"/>\n\t</class>\n\t<class name=\"android/test/mock/MockContext\" since=\"1\">\n\t\t<extends name=\"android/content/Context\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getPackageCodePath()Ljava/lang/String;\"/>\n\t\t<method name=\"getPackageResourcePath()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/test/mock/MockCursor\" since=\"8\" deprecated=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/database/Cursor\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"abortUpdates()V\" removed=\"11\"/>\n\t\t<method name=\"commitUpdates()Z\" removed=\"11\"/>\n\t\t<method name=\"commitUpdates(Ljava/util/Map;)Z\" removed=\"11\"/>\n\t\t<method name=\"deleteRow()Z\" removed=\"11\"/>\n\t\t<method name=\"hasUpdates()Z\" removed=\"11\"/>\n\t\t<method name=\"supportsUpdates()Z\" removed=\"11\"/>\n\t\t<method name=\"updateBlob(I[B)Z\" removed=\"11\"/>\n\t\t<method name=\"updateDouble(ID)Z\" removed=\"11\"/>\n\t\t<method name=\"updateFloat(IF)Z\" removed=\"11\"/>\n\t\t<method name=\"updateInt(II)Z\" removed=\"11\"/>\n\t\t<method name=\"updateLong(IJ)Z\" removed=\"11\"/>\n\t\t<method name=\"updateShort(IS)Z\" removed=\"11\"/>\n\t\t<method name=\"updateString(ILjava/lang/String;)Z\" removed=\"11\"/>\n\t\t<method name=\"updateToNull(I)Z\" removed=\"11\"/>\n\t</class>\n\t<class name=\"android/test/mock/MockDialogInterface\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/content/DialogInterface\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/mock/MockPackageManager\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"android/content/pm/PackageManager\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"getAllIntentFilters(Ljava/lang/String;)Ljava/util/List;\" since=\"23\" deprecated=\"30\"/>\n\t\t<method name=\"getDefaultBrowserPackageName(I)Ljava/lang/String;\" since=\"23\" removed=\"24\"/>\n\t\t<method name=\"resolveServiceAsUser(Landroid/content/Intent;II)Landroid/content/pm/ResolveInfo;\" since=\"30\" deprecated=\"30\"/>\n\t\t<method name=\"setDefaultBrowserPackageName(Ljava/lang/String;I)Z\" since=\"23\" removed=\"24\"/>\n\t\t<method name=\"setPackageObbPath(Ljava/lang/String;Ljava/lang/String;)V\" since=\"9\" removed=\"10\"/>\n\t</class>\n\t<class name=\"android/test/mock/MockResources\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"android/content/res/Resources\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/mock/MockService\" since=\"30\" deprecated=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"attachForTesting(Landroid/app/Service;Landroid/content/Context;Ljava/lang/String;Landroid/app/Application;)V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/suitebuilder/TestMethod\" since=\"1\" deprecated=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Class;)V\" since=\"3\" deprecated=\"30\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/reflect/Method;Ljava/lang/Class;)V\" deprecated=\"30\"/>\n\t\t<method name=\"&lt;init>(Ljunit/framework/TestCase;)V\" since=\"3\" deprecated=\"30\"/>\n\t\t<method name=\"createTest()Ljunit/framework/TestCase;\" deprecated=\"30\"/>\n\t\t<method name=\"getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;\" deprecated=\"30\"/>\n\t\t<method name=\"getEnclosingClass()Ljava/lang/Class;\" deprecated=\"30\"/>\n\t\t<method name=\"getEnclosingClassname()Ljava/lang/String;\" deprecated=\"30\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/suitebuilder/TestSuiteBuilder\" since=\"1\" deprecated=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Class;)V\" deprecated=\"30\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/ClassLoader;)V\" deprecated=\"30\"/>\n\t\t<method name=\"addRequirements(Ljava/util/List;)Landroid/test/suitebuilder/TestSuiteBuilder;\" removed=\"28\"/>\n\t\t<method name=\"addRequirements([Lcom/android/internal/util/Predicate;)Landroid/test/suitebuilder/TestSuiteBuilder;\" removed=\"28\"/>\n\t\t<method name=\"build()Ljunit/framework/TestSuite;\" deprecated=\"30\"/>\n\t\t<method name=\"excludePackages([Ljava/lang/String;)Landroid/test/suitebuilder/TestSuiteBuilder;\" deprecated=\"30\"/>\n\t\t<method name=\"getSuiteName()Ljava/lang/String;\" deprecated=\"30\"/>\n\t\t<method name=\"includeAllPackagesUnderHere()Landroid/test/suitebuilder/TestSuiteBuilder;\" deprecated=\"30\"/>\n\t\t<method name=\"includePackages([Ljava/lang/String;)Landroid/test/suitebuilder/TestSuiteBuilder;\" deprecated=\"30\"/>\n\t\t<method name=\"named(Ljava/lang/String;)Landroid/test/suitebuilder/TestSuiteBuilder;\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/suitebuilder/TestSuiteBuilder$FailedToCreateTests\" since=\"1\" deprecated=\"26\">\n\t\t<extends name=\"junit/framework/TestCase\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Exception;)V\" deprecated=\"30\"/>\n\t\t<method name=\"testSuiteConstructionFailed()V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/suitebuilder/UnitTestSuiteBuilder\" since=\"30\" deprecated=\"30\">\n\t\t<extends name=\"android/test/suitebuilder/TestSuiteBuilder\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Class;)V\" deprecated=\"30\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/ClassLoader;)V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/test/suitebuilder/annotation/LargeTest\" since=\"2\" deprecated=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t</class>\n\t<class name=\"android/test/suitebuilder/annotation/MediumTest\" since=\"2\" deprecated=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t</class>\n\t<class name=\"android/test/suitebuilder/annotation/SmallTest\" since=\"2\" deprecated=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t</class>\n\t<class name=\"android/test/suitebuilder/annotation/Smoke\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t</class>\n\t<class name=\"android/test/suitebuilder/annotation/Suppress\" since=\"1\" deprecated=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t</class>\n\t<class name=\"android/text/AlteredCharSequence\" since=\"1\" deprecated=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/GetChars\"/>\n\t\t<implements name=\"java/lang/CharSequence\"/>\n\t\t<method name=\"make(Ljava/lang/CharSequence;[CII)Landroid/text/AlteredCharSequence;\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/text/AndroidCharacter\" since=\"1\" deprecated=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"getDirectionalities([C[BI)V\" deprecated=\"29\"/>\n\t\t<method name=\"getEastAsianWidth(C)I\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"getEastAsianWidths([CII[B)V\" since=\"8\" deprecated=\"29\"/>\n\t\t<method name=\"getMirror(C)C\" deprecated=\"29\"/>\n\t\t<method name=\"mirror([CII)Z\" deprecated=\"29\"/>\n\t\t<field name=\"EAST_ASIAN_WIDTH_AMBIGUOUS\" since=\"8\" deprecated=\"29\"/>\n\t\t<field name=\"EAST_ASIAN_WIDTH_FULL_WIDTH\" since=\"8\" deprecated=\"29\"/>\n\t\t<field name=\"EAST_ASIAN_WIDTH_HALF_WIDTH\" since=\"8\" deprecated=\"29\"/>\n\t\t<field name=\"EAST_ASIAN_WIDTH_NARROW\" since=\"8\" deprecated=\"29\"/>\n\t\t<field name=\"EAST_ASIAN_WIDTH_NEUTRAL\" since=\"8\" deprecated=\"29\"/>\n\t\t<field name=\"EAST_ASIAN_WIDTH_WIDE\" since=\"8\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/text/Annotation\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getKey()Ljava/lang/String;\"/>\n\t\t<method name=\"getValue()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/text/AutoText\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"get(Ljava/lang/CharSequence;IILandroid/view/View;)Ljava/lang/String;\"/>\n\t\t<method name=\"getSize(Landroid/view/View;)I\" since=\"3\"/>\n\t</class>\n\t<class name=\"android/text/BidiFormatter\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getInstance()Landroid/text/BidiFormatter;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Landroid/text/BidiFormatter;\"/>\n\t\t<method name=\"getInstance(Z)Landroid/text/BidiFormatter;\"/>\n\t\t<method name=\"getStereoReset()Z\"/>\n\t\t<method name=\"isRtl(Ljava/lang/CharSequence;)Z\" since=\"26\"/>\n\t\t<method name=\"isRtl(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isRtlContext()Z\"/>\n\t\t<method name=\"unicodeWrap(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;\" since=\"26\"/>\n\t\t<method name=\"unicodeWrap(Ljava/lang/CharSequence;Landroid/text/TextDirectionHeuristic;)Ljava/lang/CharSequence;\" since=\"26\"/>\n\t\t<method name=\"unicodeWrap(Ljava/lang/CharSequence;Landroid/text/TextDirectionHeuristic;Z)Ljava/lang/CharSequence;\" since=\"26\"/>\n\t\t<method name=\"unicodeWrap(Ljava/lang/CharSequence;Z)Ljava/lang/CharSequence;\" since=\"26\"/>\n\t\t<method name=\"unicodeWrap(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"unicodeWrap(Ljava/lang/String;Landroid/text/TextDirectionHeuristic;)Ljava/lang/String;\"/>\n\t\t<method name=\"unicodeWrap(Ljava/lang/String;Landroid/text/TextDirectionHeuristic;Z)Ljava/lang/String;\"/>\n\t\t<method name=\"unicodeWrap(Ljava/lang/String;Z)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/text/BidiFormatter$Builder\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"&lt;init>(Z)V\"/>\n\t\t<method name=\"build()Landroid/text/BidiFormatter;\"/>\n\t\t<method name=\"setTextDirectionHeuristic(Landroid/text/TextDirectionHeuristic;)Landroid/text/BidiFormatter$Builder;\"/>\n\t\t<method name=\"stereoReset(Z)Landroid/text/BidiFormatter$Builder;\"/>\n\t</class>\n\t<class name=\"android/text/BoringLayout\" since=\"1\">\n\t\t<extends name=\"android/text/Layout\"/>\n\t\t<implements name=\"android/text/TextUtils$EllipsizeCallback\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;Z)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;ZLandroid/text/TextUtils$TruncateAt;I)V\"/>\n\t\t<method name=\"isBoring(Ljava/lang/CharSequence;Landroid/text/TextPaint;)Landroid/text/BoringLayout$Metrics;\"/>\n\t\t<method name=\"isBoring(Ljava/lang/CharSequence;Landroid/text/TextPaint;Landroid/text/BoringLayout$Metrics;)Landroid/text/BoringLayout$Metrics;\"/>\n\t\t<method name=\"make(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;Z)Landroid/text/BoringLayout;\"/>\n\t\t<method name=\"make(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;ZLandroid/text/TextUtils$TruncateAt;I)Landroid/text/BoringLayout;\"/>\n\t\t<method name=\"replaceOrMake(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;Z)Landroid/text/BoringLayout;\"/>\n\t\t<method name=\"replaceOrMake(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;ZLandroid/text/TextUtils$TruncateAt;I)Landroid/text/BoringLayout;\"/>\n\t</class>\n\t<class name=\"android/text/BoringLayout$Metrics\" since=\"1\">\n\t\t<extends name=\"android/graphics/Paint$FontMetricsInt\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"width\"/>\n\t</class>\n\t<class name=\"android/text/ClipboardManager\" since=\"1\" deprecated=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"getText()Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"hasText()Z\" deprecated=\"29\"/>\n\t\t<method name=\"setText(Ljava/lang/CharSequence;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/text/DynamicLayout\" since=\"1\">\n\t\t<extends name=\"android/text/Layout\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFZ)V\" deprecated=\"28\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFZ)V\" deprecated=\"28\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFZLandroid/text/TextUtils$TruncateAt;I)V\" deprecated=\"28\"/>\n\t</class>\n\t<class name=\"android/text/DynamicLayout$Builder\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"build()Landroid/text/DynamicLayout;\"/>\n\t\t<method name=\"obtain(Ljava/lang/CharSequence;Landroid/text/TextPaint;I)Landroid/text/DynamicLayout$Builder;\"/>\n\t\t<method name=\"setAlignment(Landroid/text/Layout$Alignment;)Landroid/text/DynamicLayout$Builder;\"/>\n\t\t<method name=\"setBreakStrategy(I)Landroid/text/DynamicLayout$Builder;\"/>\n\t\t<method name=\"setDisplayText(Ljava/lang/CharSequence;)Landroid/text/DynamicLayout$Builder;\"/>\n\t\t<method name=\"setEllipsize(Landroid/text/TextUtils$TruncateAt;)Landroid/text/DynamicLayout$Builder;\"/>\n\t\t<method name=\"setEllipsizedWidth(I)Landroid/text/DynamicLayout$Builder;\"/>\n\t\t<method name=\"setHyphenationFrequency(I)Landroid/text/DynamicLayout$Builder;\"/>\n\t\t<method name=\"setIncludePad(Z)Landroid/text/DynamicLayout$Builder;\"/>\n\t\t<method name=\"setJustificationMode(I)Landroid/text/DynamicLayout$Builder;\"/>\n\t\t<method name=\"setLineSpacing(FF)Landroid/text/DynamicLayout$Builder;\"/>\n\t\t<method name=\"setTextDirection(Landroid/text/TextDirectionHeuristic;)Landroid/text/DynamicLayout$Builder;\"/>\n\t\t<method name=\"setUseLineSpacingFromFallbacks(Z)Landroid/text/DynamicLayout$Builder;\"/>\n\t</class>\n\t<class name=\"android/text/Editable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/GetChars\"/>\n\t\t<implements name=\"android/text/Spannable\"/>\n\t\t<implements name=\"java/lang/Appendable\"/>\n\t\t<implements name=\"java/lang/CharSequence\"/>\n\t\t<method name=\"append(C)Landroid/text/Editable;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;)Landroid/text/Editable;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;II)Landroid/text/Editable;\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"clearSpans()V\"/>\n\t\t<method name=\"delete(II)Landroid/text/Editable;\"/>\n\t\t<method name=\"getFilters()[Landroid/text/InputFilter;\"/>\n\t\t<method name=\"insert(ILjava/lang/CharSequence;)Landroid/text/Editable;\"/>\n\t\t<method name=\"insert(ILjava/lang/CharSequence;II)Landroid/text/Editable;\"/>\n\t\t<method name=\"replace(IILjava/lang/CharSequence;)Landroid/text/Editable;\"/>\n\t\t<method name=\"replace(IILjava/lang/CharSequence;II)Landroid/text/Editable;\"/>\n\t\t<method name=\"setFilters([Landroid/text/InputFilter;)V\"/>\n\t</class>\n\t<class name=\"android/text/Editable$Factory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getInstance()Landroid/text/Editable$Factory;\"/>\n\t\t<method name=\"newEditable(Ljava/lang/CharSequence;)Landroid/text/Editable;\"/>\n\t</class>\n\t<class name=\"android/text/GetChars\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/CharSequence\"/>\n\t\t<method name=\"getChars(II[CI)V\"/>\n\t</class>\n\t<class name=\"android/text/Html\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"escapeHtml(Ljava/lang/CharSequence;)Ljava/lang/String;\" since=\"16\"/>\n\t\t<method name=\"fromHtml(Ljava/lang/String;)Landroid/text/Spanned;\" deprecated=\"24\"/>\n\t\t<method name=\"fromHtml(Ljava/lang/String;I)Landroid/text/Spanned;\" since=\"24\"/>\n\t\t<method name=\"fromHtml(Ljava/lang/String;ILandroid/text/Html$ImageGetter;Landroid/text/Html$TagHandler;)Landroid/text/Spanned;\" since=\"24\"/>\n\t\t<method name=\"fromHtml(Ljava/lang/String;Landroid/text/Html$ImageGetter;Landroid/text/Html$TagHandler;)Landroid/text/Spanned;\" deprecated=\"24\"/>\n\t\t<method name=\"toHtml(Landroid/text/Spanned;)Ljava/lang/String;\" deprecated=\"24\"/>\n\t\t<method name=\"toHtml(Landroid/text/Spanned;I)Ljava/lang/String;\" since=\"24\"/>\n\t\t<field name=\"FROM_HTML_MODE_COMPACT\" since=\"24\"/>\n\t\t<field name=\"FROM_HTML_MODE_LEGACY\" since=\"24\"/>\n\t\t<field name=\"FROM_HTML_OPTION_USE_CSS_COLORS\" since=\"24\"/>\n\t\t<field name=\"FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE\" since=\"24\"/>\n\t\t<field name=\"FROM_HTML_SEPARATOR_LINE_BREAK_DIV\" since=\"24\"/>\n\t\t<field name=\"FROM_HTML_SEPARATOR_LINE_BREAK_HEADING\" since=\"24\"/>\n\t\t<field name=\"FROM_HTML_SEPARATOR_LINE_BREAK_LIST\" since=\"24\"/>\n\t\t<field name=\"FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM\" since=\"24\"/>\n\t\t<field name=\"FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH\" since=\"24\"/>\n\t\t<field name=\"TO_HTML_PARAGRAPH_LINES_CONSECUTIVE\" since=\"24\"/>\n\t\t<field name=\"TO_HTML_PARAGRAPH_LINES_INDIVIDUAL\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/text/Html$ImageGetter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getDrawable(Ljava/lang/String;)Landroid/graphics/drawable/Drawable;\"/>\n\t</class>\n\t<class name=\"android/text/Html$TagHandler\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"handleTag(ZLjava/lang/String;Landroid/text/Editable;Lorg/xml/sax/XMLReader;)V\"/>\n\t</class>\n\t<class name=\"android/text/InputFilter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"filter(Ljava/lang/CharSequence;IILandroid/text/Spanned;II)Ljava/lang/CharSequence;\"/>\n\t</class>\n\t<class name=\"android/text/InputFilter$AllCaps\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/InputFilter\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\" since=\"27\"/>\n\t</class>\n\t<class name=\"android/text/InputFilter$LengthFilter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/InputFilter\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"getMax()I\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/text/InputType\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"TYPE_CLASS_DATETIME\"/>\n\t\t<field name=\"TYPE_CLASS_NUMBER\"/>\n\t\t<field name=\"TYPE_CLASS_PHONE\"/>\n\t\t<field name=\"TYPE_CLASS_TEXT\"/>\n\t\t<field name=\"TYPE_DATETIME_VARIATION_DATE\"/>\n\t\t<field name=\"TYPE_DATETIME_VARIATION_NORMAL\"/>\n\t\t<field name=\"TYPE_DATETIME_VARIATION_TIME\"/>\n\t\t<field name=\"TYPE_MASK_CLASS\"/>\n\t\t<field name=\"TYPE_MASK_FLAGS\"/>\n\t\t<field name=\"TYPE_MASK_VARIATION\"/>\n\t\t<field name=\"TYPE_NULL\"/>\n\t\t<field name=\"TYPE_NUMBER_FLAG_DECIMAL\"/>\n\t\t<field name=\"TYPE_NUMBER_FLAG_SIGNED\"/>\n\t\t<field name=\"TYPE_NUMBER_VARIATION_NORMAL\" since=\"11\"/>\n\t\t<field name=\"TYPE_NUMBER_VARIATION_PASSWORD\" since=\"11\"/>\n\t\t<field name=\"TYPE_TEXT_FLAG_AUTO_COMPLETE\"/>\n\t\t<field name=\"TYPE_TEXT_FLAG_AUTO_CORRECT\"/>\n\t\t<field name=\"TYPE_TEXT_FLAG_CAP_CHARACTERS\"/>\n\t\t<field name=\"TYPE_TEXT_FLAG_CAP_SENTENCES\"/>\n\t\t<field name=\"TYPE_TEXT_FLAG_CAP_WORDS\"/>\n\t\t<field name=\"TYPE_TEXT_FLAG_IME_MULTI_LINE\"/>\n\t\t<field name=\"TYPE_TEXT_FLAG_MULTI_LINE\"/>\n\t\t<field name=\"TYPE_TEXT_FLAG_NO_SUGGESTIONS\" since=\"5\"/>\n\t\t<field name=\"TYPE_TEXT_VARIATION_EMAIL_ADDRESS\"/>\n\t\t<field name=\"TYPE_TEXT_VARIATION_EMAIL_SUBJECT\"/>\n\t\t<field name=\"TYPE_TEXT_VARIATION_FILTER\"/>\n\t\t<field name=\"TYPE_TEXT_VARIATION_LONG_MESSAGE\"/>\n\t\t<field name=\"TYPE_TEXT_VARIATION_NORMAL\"/>\n\t\t<field name=\"TYPE_TEXT_VARIATION_PASSWORD\"/>\n\t\t<field name=\"TYPE_TEXT_VARIATION_PERSON_NAME\"/>\n\t\t<field name=\"TYPE_TEXT_VARIATION_PHONETIC\"/>\n\t\t<field name=\"TYPE_TEXT_VARIATION_POSTAL_ADDRESS\"/>\n\t\t<field name=\"TYPE_TEXT_VARIATION_SHORT_MESSAGE\"/>\n\t\t<field name=\"TYPE_TEXT_VARIATION_URI\"/>\n\t\t<field name=\"TYPE_TEXT_VARIATION_VISIBLE_PASSWORD\"/>\n\t\t<field name=\"TYPE_TEXT_VARIATION_WEB_EDIT_TEXT\"/>\n\t\t<field name=\"TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS\" since=\"11\"/>\n\t\t<field name=\"TYPE_TEXT_VARIATION_WEB_PASSWORD\" since=\"11\"/>\n\t</class>\n\t<class name=\"android/text/Layout\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FF)V\"/>\n\t\t<method name=\"draw(Landroid/graphics/Canvas;)V\"/>\n\t\t<method name=\"draw(Landroid/graphics/Canvas;Landroid/graphics/Path;Landroid/graphics/Paint;I)V\"/>\n\t\t<method name=\"getAlignment()Landroid/text/Layout$Alignment;\"/>\n\t\t<method name=\"getBottomPadding()I\"/>\n\t\t<method name=\"getCursorPath(ILandroid/graphics/Path;Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"getDesiredWidth(Ljava/lang/CharSequence;IILandroid/text/TextPaint;)F\"/>\n\t\t<method name=\"getDesiredWidth(Ljava/lang/CharSequence;Landroid/text/TextPaint;)F\"/>\n\t\t<method name=\"getEllipsisCount(I)I\"/>\n\t\t<method name=\"getEllipsisStart(I)I\"/>\n\t\t<method name=\"getEllipsizedWidth()I\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getLineAscent(I)I\"/>\n\t\t<method name=\"getLineBaseline(I)I\"/>\n\t\t<method name=\"getLineBottom(I)I\"/>\n\t\t<method name=\"getLineBounds(ILandroid/graphics/Rect;)I\"/>\n\t\t<method name=\"getLineContainsTab(I)Z\"/>\n\t\t<method name=\"getLineCount()I\"/>\n\t\t<method name=\"getLineDescent(I)I\"/>\n\t\t<method name=\"getLineDirections(I)Landroid/text/Layout$Directions;\"/>\n\t\t<method name=\"getLineEnd(I)I\"/>\n\t\t<method name=\"getLineForOffset(I)I\"/>\n\t\t<method name=\"getLineForVertical(I)I\"/>\n\t\t<method name=\"getLineLeft(I)F\"/>\n\t\t<method name=\"getLineMax(I)F\"/>\n\t\t<method name=\"getLineRight(I)F\"/>\n\t\t<method name=\"getLineStart(I)I\"/>\n\t\t<method name=\"getLineTop(I)I\"/>\n\t\t<method name=\"getLineVisibleEnd(I)I\"/>\n\t\t<method name=\"getLineWidth(I)F\"/>\n\t\t<method name=\"getOffsetForHorizontal(IF)I\"/>\n\t\t<method name=\"getOffsetToLeftOf(I)I\"/>\n\t\t<method name=\"getOffsetToRightOf(I)I\"/>\n\t\t<method name=\"getPaint()Landroid/text/TextPaint;\"/>\n\t\t<method name=\"getParagraphAlignment(I)Landroid/text/Layout$Alignment;\"/>\n\t\t<method name=\"getParagraphDirection(I)I\"/>\n\t\t<method name=\"getParagraphLeft(I)I\"/>\n\t\t<method name=\"getParagraphRight(I)I\"/>\n\t\t<method name=\"getPrimaryHorizontal(I)F\"/>\n\t\t<method name=\"getSecondaryHorizontal(I)F\"/>\n\t\t<method name=\"getSelectionPath(IILandroid/graphics/Path;)V\"/>\n\t\t<method name=\"getSpacingAdd()F\"/>\n\t\t<method name=\"getSpacingMultiplier()F\"/>\n\t\t<method name=\"getText()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTopPadding()I\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t\t<method name=\"increaseWidthTo(I)V\"/>\n\t\t<method name=\"isRtlCharAt(I)Z\" since=\"14\"/>\n\t\t<method name=\"isSpanned()Z\"/>\n\t\t<field name=\"BREAK_STRATEGY_BALANCED\" since=\"23\"/>\n\t\t<field name=\"BREAK_STRATEGY_HIGH_QUALITY\" since=\"23\"/>\n\t\t<field name=\"BREAK_STRATEGY_SIMPLE\" since=\"23\"/>\n\t\t<field name=\"DEFAULT_LINESPACING_ADDITION\" since=\"28\"/>\n\t\t<field name=\"DEFAULT_LINESPACING_MULTIPLIER\" since=\"28\"/>\n\t\t<field name=\"DIR_LEFT_TO_RIGHT\"/>\n\t\t<field name=\"DIR_RIGHT_TO_LEFT\"/>\n\t\t<field name=\"HYPHENATION_FREQUENCY_FULL\" since=\"23\"/>\n\t\t<field name=\"HYPHENATION_FREQUENCY_NONE\" since=\"23\"/>\n\t\t<field name=\"HYPHENATION_FREQUENCY_NORMAL\" since=\"23\"/>\n\t\t<field name=\"JUSTIFICATION_MODE_INTER_WORD\" since=\"26\"/>\n\t\t<field name=\"JUSTIFICATION_MODE_NONE\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/text/Layout$Alignment\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/text/Layout$Alignment;\"/>\n\t\t<method name=\"values()[Landroid/text/Layout$Alignment;\"/>\n\t\t<field name=\"ALIGN_CENTER\"/>\n\t\t<field name=\"ALIGN_LEFT\" since=\"28\" removed=\"29\"/>\n\t\t<field name=\"ALIGN_NORMAL\"/>\n\t\t<field name=\"ALIGN_OPPOSITE\"/>\n\t\t<field name=\"ALIGN_RIGHT\" since=\"28\" removed=\"29\"/>\n\t</class>\n\t<class name=\"android/text/Layout$Directions\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/text/LoginFilter\" since=\"1\" deprecated=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/InputFilter\"/>\n\t\t<method name=\"isAllowed(C)Z\" deprecated=\"30\"/>\n\t\t<method name=\"onInvalidCharacter(C)V\" deprecated=\"30\"/>\n\t\t<method name=\"onStart()V\" deprecated=\"30\"/>\n\t\t<method name=\"onStop()V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/text/LoginFilter$PasswordFilterGMail\" since=\"1\" deprecated=\"30\">\n\t\t<extends name=\"android/text/LoginFilter\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"&lt;init>(Z)V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/text/LoginFilter$UsernameFilterGMail\" since=\"1\" deprecated=\"30\">\n\t\t<extends name=\"android/text/LoginFilter\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"&lt;init>(Z)V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/text/LoginFilter$UsernameFilterGeneric\" since=\"1\" deprecated=\"30\">\n\t\t<extends name=\"android/text/LoginFilter\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"30\"/>\n\t\t<method name=\"&lt;init>(Z)V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/text/NoCopySpan\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/text/NoCopySpan$Concrete\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/NoCopySpan\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/text/ParcelableSpan\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getSpanTypeId()I\"/>\n\t</class>\n\t<class name=\"android/text/PrecomputedText\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/Spannable\"/>\n\t\t<method name=\"create(Ljava/lang/CharSequence;Landroid/text/PrecomputedText$Params;)Landroid/text/PrecomputedText;\"/>\n\t\t<method name=\"getBounds(IILandroid/graphics/Rect;)V\"/>\n\t\t<method name=\"getParagraphCount()I\"/>\n\t\t<method name=\"getParagraphEnd(I)I\"/>\n\t\t<method name=\"getParagraphStart(I)I\"/>\n\t\t<method name=\"getParams()Landroid/text/PrecomputedText$Params;\"/>\n\t\t<method name=\"getWidth(II)F\"/>\n\t</class>\n\t<class name=\"android/text/PrecomputedText$Params\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getBreakStrategy()I\"/>\n\t\t<method name=\"getHyphenationFrequency()I\"/>\n\t\t<method name=\"getTextDirection()Landroid/text/TextDirectionHeuristic;\"/>\n\t\t<method name=\"getTextPaint()Landroid/text/TextPaint;\"/>\n\t</class>\n\t<class name=\"android/text/PrecomputedText$Params$Builder\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/text/PrecomputedText$Params;)V\" since=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/text/TextPaint;)V\"/>\n\t\t<method name=\"build()Landroid/text/PrecomputedText$Params;\"/>\n\t\t<method name=\"setBreakStrategy(I)Landroid/text/PrecomputedText$Params$Builder;\"/>\n\t\t<method name=\"setHyphenationFrequency(I)Landroid/text/PrecomputedText$Params$Builder;\"/>\n\t\t<method name=\"setTextDirection(Landroid/text/TextDirectionHeuristic;)Landroid/text/PrecomputedText$Params$Builder;\"/>\n\t</class>\n\t<class name=\"android/text/Selection\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"extendDown(Landroid/text/Spannable;Landroid/text/Layout;)Z\"/>\n\t\t<method name=\"extendLeft(Landroid/text/Spannable;Landroid/text/Layout;)Z\"/>\n\t\t<method name=\"extendRight(Landroid/text/Spannable;Landroid/text/Layout;)Z\"/>\n\t\t<method name=\"extendSelection(Landroid/text/Spannable;I)V\"/>\n\t\t<method name=\"extendToLeftEdge(Landroid/text/Spannable;Landroid/text/Layout;)Z\"/>\n\t\t<method name=\"extendToRightEdge(Landroid/text/Spannable;Landroid/text/Layout;)Z\"/>\n\t\t<method name=\"extendUp(Landroid/text/Spannable;Landroid/text/Layout;)Z\"/>\n\t\t<method name=\"getSelectionEnd(Ljava/lang/CharSequence;)I\"/>\n\t\t<method name=\"getSelectionStart(Ljava/lang/CharSequence;)I\"/>\n\t\t<method name=\"moveDown(Landroid/text/Spannable;Landroid/text/Layout;)Z\"/>\n\t\t<method name=\"moveLeft(Landroid/text/Spannable;Landroid/text/Layout;)Z\"/>\n\t\t<method name=\"moveRight(Landroid/text/Spannable;Landroid/text/Layout;)Z\"/>\n\t\t<method name=\"moveToLeftEdge(Landroid/text/Spannable;Landroid/text/Layout;)Z\"/>\n\t\t<method name=\"moveToRightEdge(Landroid/text/Spannable;Landroid/text/Layout;)Z\"/>\n\t\t<method name=\"moveUp(Landroid/text/Spannable;Landroid/text/Layout;)Z\"/>\n\t\t<method name=\"removeSelection(Landroid/text/Spannable;)V\"/>\n\t\t<method name=\"selectAll(Landroid/text/Spannable;)V\"/>\n\t\t<method name=\"setSelection(Landroid/text/Spannable;I)V\"/>\n\t\t<method name=\"setSelection(Landroid/text/Spannable;II)V\"/>\n\t\t<field name=\"SELECTION_END\"/>\n\t\t<field name=\"SELECTION_START\"/>\n\t</class>\n\t<class name=\"android/text/SpanWatcher\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/NoCopySpan\" since=\"3\"/>\n\t\t<method name=\"onSpanAdded(Landroid/text/Spannable;Ljava/lang/Object;II)V\"/>\n\t\t<method name=\"onSpanChanged(Landroid/text/Spannable;Ljava/lang/Object;IIII)V\"/>\n\t\t<method name=\"onSpanRemoved(Landroid/text/Spannable;Ljava/lang/Object;II)V\"/>\n\t</class>\n\t<class name=\"android/text/Spannable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/Spanned\"/>\n\t\t<method name=\"removeSpan(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"setSpan(Ljava/lang/Object;III)V\"/>\n\t</class>\n\t<class name=\"android/text/Spannable$Factory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getInstance()Landroid/text/Spannable$Factory;\"/>\n\t\t<method name=\"newSpannable(Ljava/lang/CharSequence;)Landroid/text/Spannable;\"/>\n\t</class>\n\t<class name=\"android/text/SpannableString\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/GetChars\"/>\n\t\t<implements name=\"android/text/Spannable\"/>\n\t\t<implements name=\"java/lang/CharSequence\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"valueOf(Ljava/lang/CharSequence;)Landroid/text/SpannableString;\"/>\n\t</class>\n\t<class name=\"android/text/SpannableStringBuilder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/Editable\"/>\n\t\t<implements name=\"android/text/GetChars\"/>\n\t\t<implements name=\"android/text/Spannable\"/>\n\t\t<implements name=\"java/lang/Appendable\"/>\n\t\t<implements name=\"java/lang/CharSequence\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;II)V\"/>\n\t\t<method name=\"append(C)Landroid/text/SpannableStringBuilder;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;)Landroid/text/SpannableStringBuilder;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;II)Landroid/text/SpannableStringBuilder;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;Ljava/lang/Object;I)Landroid/text/SpannableStringBuilder;\" since=\"21\"/>\n\t\t<method name=\"delete(II)Landroid/text/SpannableStringBuilder;\"/>\n\t\t<method name=\"getTextRunCursor(IIIIILandroid/graphics/Paint;)I\" since=\"11\" deprecated=\"15\"/>\n\t\t<method name=\"getTextWatcherDepth()I\" since=\"23\"/>\n\t\t<method name=\"insert(ILjava/lang/CharSequence;)Landroid/text/SpannableStringBuilder;\"/>\n\t\t<method name=\"insert(ILjava/lang/CharSequence;II)Landroid/text/SpannableStringBuilder;\"/>\n\t\t<method name=\"replace(IILjava/lang/CharSequence;)Landroid/text/SpannableStringBuilder;\"/>\n\t\t<method name=\"replace(IILjava/lang/CharSequence;II)Landroid/text/SpannableStringBuilder;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/CharSequence;)Landroid/text/SpannableStringBuilder;\"/>\n\t</class>\n\t<class name=\"android/text/Spanned\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/CharSequence\"/>\n\t\t<method name=\"getSpanEnd(Ljava/lang/Object;)I\"/>\n\t\t<method name=\"getSpanFlags(Ljava/lang/Object;)I\"/>\n\t\t<method name=\"getSpanStart(Ljava/lang/Object;)I\"/>\n\t\t<method name=\"getSpans(IILjava/lang/Class;)[Ljava/lang/Object;\"/>\n\t\t<method name=\"nextSpanTransition(IILjava/lang/Class;)I\"/>\n\t\t<field name=\"SPAN_COMPOSING\" since=\"3\"/>\n\t\t<field name=\"SPAN_EXCLUSIVE_EXCLUSIVE\"/>\n\t\t<field name=\"SPAN_EXCLUSIVE_INCLUSIVE\"/>\n\t\t<field name=\"SPAN_INCLUSIVE_EXCLUSIVE\"/>\n\t\t<field name=\"SPAN_INCLUSIVE_INCLUSIVE\"/>\n\t\t<field name=\"SPAN_INTERMEDIATE\" since=\"3\"/>\n\t\t<field name=\"SPAN_MARK_MARK\"/>\n\t\t<field name=\"SPAN_MARK_POINT\"/>\n\t\t<field name=\"SPAN_PARAGRAPH\"/>\n\t\t<field name=\"SPAN_POINT_MARK\"/>\n\t\t<field name=\"SPAN_POINT_MARK_MASK\" since=\"3\"/>\n\t\t<field name=\"SPAN_POINT_POINT\"/>\n\t\t<field name=\"SPAN_PRIORITY\"/>\n\t\t<field name=\"SPAN_PRIORITY_SHIFT\"/>\n\t\t<field name=\"SPAN_USER\"/>\n\t\t<field name=\"SPAN_USER_SHIFT\"/>\n\t</class>\n\t<class name=\"android/text/SpannedString\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/GetChars\"/>\n\t\t<implements name=\"android/text/Spanned\"/>\n\t\t<implements name=\"java/lang/CharSequence\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"valueOf(Ljava/lang/CharSequence;)Landroid/text/SpannedString;\"/>\n\t</class>\n\t<class name=\"android/text/StaticLayout\" since=\"1\">\n\t\t<extends name=\"android/text/Layout\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;IILandroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFZ)V\" deprecated=\"28\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;IILandroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFZLandroid/text/TextUtils$TruncateAt;I)V\" deprecated=\"28\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFZ)V\" deprecated=\"28\"/>\n\t</class>\n\t<class name=\"android/text/StaticLayout$Builder\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"build()Landroid/text/StaticLayout;\"/>\n\t\t<method name=\"obtain(Ljava/lang/CharSequence;IILandroid/text/TextPaint;I)Landroid/text/StaticLayout$Builder;\"/>\n\t\t<method name=\"setAlignment(Landroid/text/Layout$Alignment;)Landroid/text/StaticLayout$Builder;\"/>\n\t\t<method name=\"setBreakStrategy(I)Landroid/text/StaticLayout$Builder;\"/>\n\t\t<method name=\"setEllipsize(Landroid/text/TextUtils$TruncateAt;)Landroid/text/StaticLayout$Builder;\"/>\n\t\t<method name=\"setEllipsizedWidth(I)Landroid/text/StaticLayout$Builder;\"/>\n\t\t<method name=\"setHyphenationFrequency(I)Landroid/text/StaticLayout$Builder;\"/>\n\t\t<method name=\"setIncludePad(Z)Landroid/text/StaticLayout$Builder;\"/>\n\t\t<method name=\"setIndents([I[I)Landroid/text/StaticLayout$Builder;\"/>\n\t\t<method name=\"setJustificationMode(I)Landroid/text/StaticLayout$Builder;\" since=\"26\"/>\n\t\t<method name=\"setLineSpacing(FF)Landroid/text/StaticLayout$Builder;\"/>\n\t\t<method name=\"setMaxLines(I)Landroid/text/StaticLayout$Builder;\"/>\n\t\t<method name=\"setText(Ljava/lang/CharSequence;)Landroid/text/StaticLayout$Builder;\"/>\n\t\t<method name=\"setTextDirection(Landroid/text/TextDirectionHeuristic;)Landroid/text/StaticLayout$Builder;\"/>\n\t\t<method name=\"setUseLineSpacingFromFallbacks(Z)Landroid/text/StaticLayout$Builder;\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/text/TextDirectionHeuristic\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"isRtl(Ljava/lang/CharSequence;II)Z\"/>\n\t\t<method name=\"isRtl([CII)Z\"/>\n\t</class>\n\t<class name=\"android/text/TextDirectionHeuristics\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"ANYRTL_LTR\"/>\n\t\t<field name=\"FIRSTSTRONG_LTR\"/>\n\t\t<field name=\"FIRSTSTRONG_RTL\"/>\n\t\t<field name=\"LOCALE\"/>\n\t\t<field name=\"LTR\"/>\n\t\t<field name=\"RTL\"/>\n\t</class>\n\t<class name=\"android/text/TextPaint\" since=\"1\">\n\t\t<extends name=\"android/graphics/Paint\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Paint;)V\"/>\n\t\t<method name=\"set(Landroid/text/TextPaint;)V\"/>\n\t\t<field name=\"baselineShift\"/>\n\t\t<field name=\"bgColor\"/>\n\t\t<field name=\"density\" since=\"5\"/>\n\t\t<field name=\"drawableState\"/>\n\t\t<field name=\"linkColor\"/>\n\t\t<field name=\"underlineColor\" since=\"29\"/>\n\t\t<field name=\"underlineThickness\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/text/TextUtils\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"commaEllipsize(Ljava/lang/CharSequence;Landroid/text/TextPaint;FLjava/lang/String;Ljava/lang/String;)Ljava/lang/CharSequence;\" deprecated=\"26\"/>\n\t\t<method name=\"concat([Ljava/lang/CharSequence;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"copySpansFrom(Landroid/text/Spanned;IILjava/lang/Class;Landroid/text/Spannable;I)V\"/>\n\t\t<method name=\"dumpSpans(Ljava/lang/CharSequence;Landroid/util/Printer;Ljava/lang/String;)V\" since=\"3\"/>\n\t\t<method name=\"ellipsize(Ljava/lang/CharSequence;Landroid/text/TextPaint;FLandroid/text/TextUtils$TruncateAt;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"ellipsize(Ljava/lang/CharSequence;Landroid/text/TextPaint;FLandroid/text/TextUtils$TruncateAt;ZLandroid/text/TextUtils$EllipsizeCallback;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"equals(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z\"/>\n\t\t<method name=\"expandTemplate(Ljava/lang/CharSequence;[Ljava/lang/CharSequence;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getCapsMode(Ljava/lang/CharSequence;II)I\" since=\"3\"/>\n\t\t<method name=\"getChars(Ljava/lang/CharSequence;II[CI)V\"/>\n\t\t<method name=\"getLayoutDirectionFromLocale(Ljava/util/Locale;)I\" since=\"17\"/>\n\t\t<method name=\"getOffsetAfter(Ljava/lang/CharSequence;I)I\"/>\n\t\t<method name=\"getOffsetBefore(Ljava/lang/CharSequence;I)I\"/>\n\t\t<method name=\"getReverse(Ljava/lang/CharSequence;II)Ljava/lang/CharSequence;\" deprecated=\"24\"/>\n\t\t<method name=\"getTrimmedLength(Ljava/lang/CharSequence;)I\"/>\n\t\t<method name=\"htmlEncode(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"indexOf(Ljava/lang/CharSequence;C)I\"/>\n\t\t<method name=\"indexOf(Ljava/lang/CharSequence;CI)I\"/>\n\t\t<method name=\"indexOf(Ljava/lang/CharSequence;CII)I\"/>\n\t\t<method name=\"indexOf(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)I\"/>\n\t\t<method name=\"indexOf(Ljava/lang/CharSequence;Ljava/lang/CharSequence;I)I\"/>\n\t\t<method name=\"indexOf(Ljava/lang/CharSequence;Ljava/lang/CharSequence;II)I\"/>\n\t\t<method name=\"isDigitsOnly(Ljava/lang/CharSequence;)Z\"/>\n\t\t<method name=\"isEmpty(Ljava/lang/CharSequence;)Z\"/>\n\t\t<method name=\"isGraphic(C)Z\" deprecated=\"24\"/>\n\t\t<method name=\"isGraphic(Ljava/lang/CharSequence;)Z\"/>\n\t\t<method name=\"join(Ljava/lang/CharSequence;Ljava/lang/Iterable;)Ljava/lang/String;\"/>\n\t\t<method name=\"join(Ljava/lang/CharSequence;[Ljava/lang/Object;)Ljava/lang/String;\"/>\n\t\t<method name=\"lastIndexOf(Ljava/lang/CharSequence;C)I\"/>\n\t\t<method name=\"lastIndexOf(Ljava/lang/CharSequence;CI)I\"/>\n\t\t<method name=\"lastIndexOf(Ljava/lang/CharSequence;CII)I\"/>\n\t\t<method name=\"listEllipsize(Landroid/content/Context;Ljava/util/List;Ljava/lang/String;Landroid/text/TextPaint;FI)Ljava/lang/CharSequence;\" since=\"26\"/>\n\t\t<method name=\"makeSafeForPresentation(Ljava/lang/String;IFI)Ljava/lang/CharSequence;\" since=\"29\"/>\n\t\t<method name=\"regionMatches(Ljava/lang/CharSequence;ILjava/lang/CharSequence;II)Z\"/>\n\t\t<method name=\"replace(Ljava/lang/CharSequence;[Ljava/lang/String;[Ljava/lang/CharSequence;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"split(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;\"/>\n\t\t<method name=\"split(Ljava/lang/String;Ljava/util/regex/Pattern;)[Ljava/lang/String;\"/>\n\t\t<method name=\"stringOrSpannedString(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"substring(Ljava/lang/CharSequence;II)Ljava/lang/String;\"/>\n\t\t<method name=\"writeToParcel(Ljava/lang/CharSequence;Landroid/os/Parcel;I)V\"/>\n\t\t<field name=\"CAP_MODE_CHARACTERS\" since=\"3\"/>\n\t\t<field name=\"CAP_MODE_SENTENCES\" since=\"3\"/>\n\t\t<field name=\"CAP_MODE_WORDS\" since=\"3\"/>\n\t\t<field name=\"CHAR_SEQUENCE_CREATOR\"/>\n\t\t<field name=\"SAFE_STRING_FLAG_FIRST_LINE\" since=\"29\"/>\n\t\t<field name=\"SAFE_STRING_FLAG_SINGLE_LINE\" since=\"29\"/>\n\t\t<field name=\"SAFE_STRING_FLAG_TRIM\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/text/TextUtils$EllipsizeCallback\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"ellipsized(II)V\"/>\n\t</class>\n\t<class name=\"android/text/TextUtils$SimpleStringSplitter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/TextUtils$StringSplitter\"/>\n\t\t<implements name=\"java/util/Iterator\"/>\n\t\t<method name=\"&lt;init>(C)V\"/>\n\t\t<method name=\"next()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/text/TextUtils$StringSplitter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Iterable\"/>\n\t\t<method name=\"setString(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/text/TextUtils$TruncateAt\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/text/TextUtils$TruncateAt;\"/>\n\t\t<method name=\"values()[Landroid/text/TextUtils$TruncateAt;\"/>\n\t\t<field name=\"END\"/>\n\t\t<field name=\"END_SMALL\" since=\"28\" removed=\"29\"/>\n\t\t<field name=\"MARQUEE\" since=\"2\"/>\n\t\t<field name=\"MIDDLE\"/>\n\t\t<field name=\"START\"/>\n\t</class>\n\t<class name=\"android/text/TextWatcher\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/NoCopySpan\" since=\"3\"/>\n\t\t<method name=\"afterTextChanged(Landroid/text/Editable;)V\"/>\n\t\t<method name=\"beforeTextChanged(Ljava/lang/CharSequence;III)V\"/>\n\t\t<method name=\"onTextChanged(Ljava/lang/CharSequence;III)V\"/>\n\t</class>\n\t<class name=\"android/text/format/DateFormat\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"format(Ljava/lang/CharSequence;J)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"format(Ljava/lang/CharSequence;Ljava/util/Calendar;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"format(Ljava/lang/CharSequence;Ljava/util/Date;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getBestDateTimePattern(Ljava/util/Locale;Ljava/lang/String;)Ljava/lang/String;\" since=\"18\"/>\n\t\t<method name=\"getDateFormat(Landroid/content/Context;)Ljava/text/DateFormat;\"/>\n\t\t<method name=\"getDateFormatOrder(Landroid/content/Context;)[C\"/>\n\t\t<method name=\"getLongDateFormat(Landroid/content/Context;)Ljava/text/DateFormat;\"/>\n\t\t<method name=\"getMediumDateFormat(Landroid/content/Context;)Ljava/text/DateFormat;\"/>\n\t\t<method name=\"getTimeFormat(Landroid/content/Context;)Ljava/text/DateFormat;\"/>\n\t\t<method name=\"is24HourFormat(Landroid/content/Context;)Z\"/>\n\t\t<field name=\"AM_PM\" deprecated=\"18\" removed=\"22\"/>\n\t\t<field name=\"CAPITAL_AM_PM\" deprecated=\"18\" removed=\"22\"/>\n\t\t<field name=\"DATE\" deprecated=\"18\" removed=\"22\"/>\n\t\t<field name=\"DAY\" deprecated=\"18\" removed=\"22\"/>\n\t\t<field name=\"HOUR\" deprecated=\"18\" removed=\"22\"/>\n\t\t<field name=\"HOUR_OF_DAY\" deprecated=\"18\" removed=\"22\"/>\n\t\t<field name=\"MINUTE\" deprecated=\"18\" removed=\"22\"/>\n\t\t<field name=\"MONTH\" deprecated=\"18\" removed=\"22\"/>\n\t\t<field name=\"QUOTE\" deprecated=\"18\" removed=\"22\"/>\n\t\t<field name=\"SECONDS\" deprecated=\"18\" removed=\"22\"/>\n\t\t<field name=\"STANDALONE_MONTH\" since=\"17\" deprecated=\"18\" removed=\"22\"/>\n\t\t<field name=\"TIME_ZONE\" deprecated=\"18\" removed=\"22\"/>\n\t\t<field name=\"YEAR\" deprecated=\"18\" removed=\"22\"/>\n\t</class>\n\t<class name=\"android/text/format/DateUtils\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"formatDateRange(Landroid/content/Context;JJI)Ljava/lang/String;\"/>\n\t\t<method name=\"formatDateRange(Landroid/content/Context;Ljava/util/Formatter;JJI)Ljava/util/Formatter;\" since=\"5\"/>\n\t\t<method name=\"formatDateRange(Landroid/content/Context;Ljava/util/Formatter;JJILjava/lang/String;)Ljava/util/Formatter;\" since=\"9\"/>\n\t\t<method name=\"formatDateTime(Landroid/content/Context;JI)Ljava/lang/String;\"/>\n\t\t<method name=\"formatElapsedTime(J)Ljava/lang/String;\"/>\n\t\t<method name=\"formatElapsedTime(Ljava/lang/StringBuilder;J)Ljava/lang/String;\"/>\n\t\t<method name=\"formatSameDayTime(JJII)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getAMPMString(I)Ljava/lang/String;\" deprecated=\"17\"/>\n\t\t<method name=\"getDayOfWeekString(II)Ljava/lang/String;\" deprecated=\"17\"/>\n\t\t<method name=\"getMonthString(II)Ljava/lang/String;\" deprecated=\"17\"/>\n\t\t<method name=\"getRelativeDateTimeString(Landroid/content/Context;JJJI)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getRelativeTimeSpanString(J)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getRelativeTimeSpanString(JJJ)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getRelativeTimeSpanString(JJJI)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getRelativeTimeSpanString(Landroid/content/Context;J)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getRelativeTimeSpanString(Landroid/content/Context;JZ)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"isToday(J)Z\"/>\n\t\t<field name=\"ABBREV_MONTH_FORMAT\" deprecated=\"17\"/>\n\t\t<field name=\"ABBREV_WEEKDAY_FORMAT\"/>\n\t\t<field name=\"DAY_IN_MILLIS\"/>\n\t\t<field name=\"FORMAT_12HOUR\" deprecated=\"17\"/>\n\t\t<field name=\"FORMAT_24HOUR\" deprecated=\"17\"/>\n\t\t<field name=\"FORMAT_ABBREV_ALL\"/>\n\t\t<field name=\"FORMAT_ABBREV_MONTH\"/>\n\t\t<field name=\"FORMAT_ABBREV_RELATIVE\"/>\n\t\t<field name=\"FORMAT_ABBREV_TIME\"/>\n\t\t<field name=\"FORMAT_ABBREV_WEEKDAY\"/>\n\t\t<field name=\"FORMAT_CAP_AMPM\" deprecated=\"17\"/>\n\t\t<field name=\"FORMAT_CAP_MIDNIGHT\" deprecated=\"17\"/>\n\t\t<field name=\"FORMAT_CAP_NOON\" deprecated=\"17\"/>\n\t\t<field name=\"FORMAT_CAP_NOON_MIDNIGHT\" deprecated=\"17\"/>\n\t\t<field name=\"FORMAT_NO_MIDNIGHT\"/>\n\t\t<field name=\"FORMAT_NO_MONTH_DAY\"/>\n\t\t<field name=\"FORMAT_NO_NOON\"/>\n\t\t<field name=\"FORMAT_NO_NOON_MIDNIGHT\" deprecated=\"17\"/>\n\t\t<field name=\"FORMAT_NO_YEAR\"/>\n\t\t<field name=\"FORMAT_NUMERIC_DATE\"/>\n\t\t<field name=\"FORMAT_SHOW_DATE\"/>\n\t\t<field name=\"FORMAT_SHOW_TIME\"/>\n\t\t<field name=\"FORMAT_SHOW_WEEKDAY\"/>\n\t\t<field name=\"FORMAT_SHOW_YEAR\"/>\n\t\t<field name=\"FORMAT_UTC\" deprecated=\"15\"/>\n\t\t<field name=\"HOUR_IN_MILLIS\"/>\n\t\t<field name=\"HOUR_MINUTE_24\" deprecated=\"17\"/>\n\t\t<field name=\"LENGTH_LONG\" deprecated=\"17\"/>\n\t\t<field name=\"LENGTH_MEDIUM\" deprecated=\"17\"/>\n\t\t<field name=\"LENGTH_SHORT\" deprecated=\"17\"/>\n\t\t<field name=\"LENGTH_SHORTER\" deprecated=\"17\"/>\n\t\t<field name=\"LENGTH_SHORTEST\" deprecated=\"17\"/>\n\t\t<field name=\"MINUTE_IN_MILLIS\"/>\n\t\t<field name=\"MONTH_DAY_FORMAT\"/>\n\t\t<field name=\"MONTH_FORMAT\"/>\n\t\t<field name=\"NUMERIC_MONTH_FORMAT\"/>\n\t\t<field name=\"SECOND_IN_MILLIS\"/>\n\t\t<field name=\"WEEKDAY_FORMAT\"/>\n\t\t<field name=\"WEEK_IN_MILLIS\"/>\n\t\t<field name=\"YEAR_FORMAT\"/>\n\t\t<field name=\"YEAR_FORMAT_TWO_DIGITS\"/>\n\t\t<field name=\"YEAR_IN_MILLIS\" deprecated=\"30\"/>\n\t\t<field name=\"sameMonthTable\" deprecated=\"17\"/>\n\t\t<field name=\"sameYearTable\" deprecated=\"17\"/>\n\t</class>\n\t<class name=\"android/text/format/Formatter\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"formatFileSize(Landroid/content/Context;J)Ljava/lang/String;\"/>\n\t\t<method name=\"formatIpAddress(I)Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"formatShortFileSize(Landroid/content/Context;J)Ljava/lang/String;\" since=\"5\"/>\n\t</class>\n\t<class name=\"android/text/format/Time\" since=\"3\" deprecated=\"22\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/text/format/Time;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"after(Landroid/text/format/Time;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"before(Landroid/text/format/Time;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"clear(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"compare(Landroid/text/format/Time;Landroid/text/format/Time;)I\" deprecated=\"29\"/>\n\t\t<method name=\"format(Ljava/lang/String;)Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"format2445()Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"format3339(Z)Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getActualMaximum(I)I\" deprecated=\"29\"/>\n\t\t<method name=\"getCurrentTimezone()Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getJulianDay(JJ)I\" deprecated=\"29\"/>\n\t\t<method name=\"getJulianMondayFromWeeksSinceEpoch(I)I\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"getWeekNumber()I\" deprecated=\"29\"/>\n\t\t<method name=\"getWeeksSinceEpochFromJulianDay(II)I\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"isEpoch(Landroid/text/format/Time;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"normalize(Z)J\" deprecated=\"29\"/>\n\t\t<method name=\"parse(Ljava/lang/String;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"parse3339(Ljava/lang/String;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"set(III)V\" deprecated=\"29\"/>\n\t\t<method name=\"set(IIIIII)V\" deprecated=\"29\"/>\n\t\t<method name=\"set(J)V\" deprecated=\"29\"/>\n\t\t<method name=\"set(Landroid/text/format/Time;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setJulianDay(I)J\" deprecated=\"29\"/>\n\t\t<method name=\"setToNow()V\" deprecated=\"29\"/>\n\t\t<method name=\"switchTimezone(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"toMillis(Z)J\" deprecated=\"29\"/>\n\t\t<field name=\"EPOCH_JULIAN_DAY\" deprecated=\"29\"/>\n\t\t<field name=\"FRIDAY\" deprecated=\"29\"/>\n\t\t<field name=\"HOUR\" deprecated=\"29\"/>\n\t\t<field name=\"MINUTE\" deprecated=\"29\"/>\n\t\t<field name=\"MONDAY\" deprecated=\"29\"/>\n\t\t<field name=\"MONDAY_BEFORE_JULIAN_EPOCH\" since=\"11\" deprecated=\"29\"/>\n\t\t<field name=\"MONTH\" deprecated=\"29\"/>\n\t\t<field name=\"MONTH_DAY\" deprecated=\"29\"/>\n\t\t<field name=\"SATURDAY\" deprecated=\"29\"/>\n\t\t<field name=\"SECOND\" deprecated=\"29\"/>\n\t\t<field name=\"SUNDAY\" deprecated=\"29\"/>\n\t\t<field name=\"THURSDAY\" deprecated=\"29\"/>\n\t\t<field name=\"TIMEZONE_UTC\" deprecated=\"29\"/>\n\t\t<field name=\"TUESDAY\" deprecated=\"29\"/>\n\t\t<field name=\"WEDNESDAY\" deprecated=\"29\"/>\n\t\t<field name=\"WEEK_DAY\" deprecated=\"29\"/>\n\t\t<field name=\"WEEK_NUM\" deprecated=\"29\"/>\n\t\t<field name=\"YEAR\" deprecated=\"29\"/>\n\t\t<field name=\"YEAR_DAY\" deprecated=\"29\"/>\n\t\t<field name=\"allDay\" deprecated=\"29\"/>\n\t\t<field name=\"gmtoff\" deprecated=\"29\"/>\n\t\t<field name=\"hour\" deprecated=\"29\"/>\n\t\t<field name=\"isDst\" deprecated=\"29\"/>\n\t\t<field name=\"minute\" deprecated=\"29\"/>\n\t\t<field name=\"month\" deprecated=\"29\"/>\n\t\t<field name=\"monthDay\" deprecated=\"29\"/>\n\t\t<field name=\"second\" deprecated=\"29\"/>\n\t\t<field name=\"timezone\" deprecated=\"29\"/>\n\t\t<field name=\"weekDay\" deprecated=\"29\"/>\n\t\t<field name=\"year\" deprecated=\"29\"/>\n\t\t<field name=\"yearDay\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/text/method/ArrowKeyMovementMethod\" since=\"1\">\n\t\t<extends name=\"android/text/method/BaseMovementMethod\" since=\"11\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"11\"/>\n\t\t<implements name=\"android/text/method/MovementMethod\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getInstance()Landroid/text/method/MovementMethod;\"/>\n\t</class>\n\t<class name=\"android/text/method/BaseKeyListener\" since=\"1\">\n\t\t<extends name=\"android/text/method/MetaKeyKeyListener\"/>\n\t\t<implements name=\"android/text/method/KeyListener\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"backspace(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"forwardDelete(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z\" since=\"11\"/>\n\t</class>\n\t<class name=\"android/text/method/BaseMovementMethod\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/method/MovementMethod\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"bottom(Landroid/widget/TextView;Landroid/text/Spannable;)Z\"/>\n\t\t<method name=\"down(Landroid/widget/TextView;Landroid/text/Spannable;)Z\"/>\n\t\t<method name=\"end(Landroid/widget/TextView;Landroid/text/Spannable;)Z\"/>\n\t\t<method name=\"getMovementMetaState(Landroid/text/Spannable;Landroid/view/KeyEvent;)I\"/>\n\t\t<method name=\"handleMovementKey(Landroid/widget/TextView;Landroid/text/Spannable;IILandroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"home(Landroid/widget/TextView;Landroid/text/Spannable;)Z\"/>\n\t\t<method name=\"left(Landroid/widget/TextView;Landroid/text/Spannable;)Z\"/>\n\t\t<method name=\"lineEnd(Landroid/widget/TextView;Landroid/text/Spannable;)Z\"/>\n\t\t<method name=\"lineStart(Landroid/widget/TextView;Landroid/text/Spannable;)Z\"/>\n\t\t<method name=\"pageDown(Landroid/widget/TextView;Landroid/text/Spannable;)Z\"/>\n\t\t<method name=\"pageUp(Landroid/widget/TextView;Landroid/text/Spannable;)Z\"/>\n\t\t<method name=\"right(Landroid/widget/TextView;Landroid/text/Spannable;)Z\"/>\n\t\t<method name=\"top(Landroid/widget/TextView;Landroid/text/Spannable;)Z\"/>\n\t\t<method name=\"up(Landroid/widget/TextView;Landroid/text/Spannable;)Z\"/>\n\t</class>\n\t<class name=\"android/text/method/CharacterPickerDialog\" since=\"1\">\n\t\t<extends name=\"android/app/Dialog\"/>\n\t\t<implements name=\"android/view/View$OnClickListener\"/>\n\t\t<implements name=\"android/widget/AdapterView$OnItemClickListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/view/View;Landroid/text/Editable;Ljava/lang/String;Z)V\"/>\n\t</class>\n\t<class name=\"android/text/method/DateKeyListener\" since=\"1\">\n\t\t<extends name=\"android/text/method/NumberKeyListener\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"26\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\" since=\"26\"/>\n\t\t<method name=\"getInstance()Landroid/text/method/DateKeyListener;\" deprecated=\"26\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Landroid/text/method/DateKeyListener;\" since=\"26\"/>\n\t\t<field name=\"CHARACTERS\" deprecated=\"26\"/>\n\t</class>\n\t<class name=\"android/text/method/DateTimeKeyListener\" since=\"1\">\n\t\t<extends name=\"android/text/method/NumberKeyListener\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"26\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\" since=\"26\"/>\n\t\t<method name=\"getInstance()Landroid/text/method/DateTimeKeyListener;\" deprecated=\"26\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Landroid/text/method/DateTimeKeyListener;\" since=\"26\"/>\n\t\t<field name=\"CHARACTERS\" deprecated=\"26\"/>\n\t</class>\n\t<class name=\"android/text/method/DialerKeyListener\" since=\"1\">\n\t\t<extends name=\"android/text/method/NumberKeyListener\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getInstance()Landroid/text/method/DialerKeyListener;\"/>\n\t\t<field name=\"CHARACTERS\"/>\n\t</class>\n\t<class name=\"android/text/method/DigitsKeyListener\" since=\"1\">\n\t\t<extends name=\"android/text/method/NumberKeyListener\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"26\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\" since=\"26\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;ZZ)V\" since=\"26\"/>\n\t\t<method name=\"&lt;init>(ZZ)V\" deprecated=\"26\"/>\n\t\t<method name=\"getInstance()Landroid/text/method/DigitsKeyListener;\" deprecated=\"26\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Landroid/text/method/DigitsKeyListener;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Landroid/text/method/DigitsKeyListener;\" since=\"26\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;ZZ)Landroid/text/method/DigitsKeyListener;\" since=\"26\"/>\n\t\t<method name=\"getInstance(ZZ)Landroid/text/method/DigitsKeyListener;\" deprecated=\"26\"/>\n\t</class>\n\t<class name=\"android/text/method/HideReturnsTransformationMethod\" since=\"1\">\n\t\t<extends name=\"android/text/method/ReplacementTransformationMethod\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getInstance()Landroid/text/method/HideReturnsTransformationMethod;\"/>\n\t</class>\n\t<class name=\"android/text/method/KeyListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"clearMetaKeyState(Landroid/view/View;Landroid/text/Editable;I)V\" since=\"3\"/>\n\t\t<method name=\"getInputType()I\" since=\"3\"/>\n\t\t<method name=\"onKeyDown(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"onKeyOther(Landroid/view/View;Landroid/text/Editable;Landroid/view/KeyEvent;)Z\" since=\"3\"/>\n\t\t<method name=\"onKeyUp(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z\"/>\n\t</class>\n\t<class name=\"android/text/method/LinkMovementMethod\" since=\"1\">\n\t\t<extends name=\"android/text/method/ScrollingMovementMethod\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/text/method/MetaKeyKeyListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"adjustMetaAfterKeypress(J)J\" since=\"3\"/>\n\t\t<method name=\"adjustMetaAfterKeypress(Landroid/text/Spannable;)V\"/>\n\t\t<method name=\"clearMetaKeyState(JI)J\" since=\"3\"/>\n\t\t<method name=\"clearMetaKeyState(Landroid/text/Editable;I)V\" since=\"3\"/>\n\t\t<method name=\"clearMetaKeyState(Landroid/view/View;Landroid/text/Editable;I)V\" since=\"3\"/>\n\t\t<method name=\"getMetaState(J)I\" since=\"3\"/>\n\t\t<method name=\"getMetaState(JI)I\" since=\"3\"/>\n\t\t<method name=\"getMetaState(Ljava/lang/CharSequence;)I\"/>\n\t\t<method name=\"getMetaState(Ljava/lang/CharSequence;I)I\"/>\n\t\t<method name=\"getMetaState(Ljava/lang/CharSequence;ILandroid/view/KeyEvent;)I\" since=\"19\"/>\n\t\t<method name=\"getMetaState(Ljava/lang/CharSequence;Landroid/view/KeyEvent;)I\" since=\"19\"/>\n\t\t<method name=\"handleKeyDown(JILandroid/view/KeyEvent;)J\" since=\"3\"/>\n\t\t<method name=\"handleKeyUp(JILandroid/view/KeyEvent;)J\" since=\"3\"/>\n\t\t<method name=\"isMetaTracker(Ljava/lang/CharSequence;Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"isSelectingMetaTracker(Ljava/lang/CharSequence;Ljava/lang/Object;)Z\" since=\"3\"/>\n\t\t<method name=\"onKeyDown(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"onKeyUp(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"resetLockedMeta(J)J\" since=\"3\"/>\n\t\t<method name=\"resetLockedMeta(Landroid/text/Spannable;)V\"/>\n\t\t<method name=\"resetMetaState(Landroid/text/Spannable;)V\"/>\n\t\t<field name=\"META_ALT_LOCKED\"/>\n\t\t<field name=\"META_ALT_ON\"/>\n\t\t<field name=\"META_CAP_LOCKED\"/>\n\t\t<field name=\"META_SHIFT_ON\"/>\n\t\t<field name=\"META_SYM_LOCKED\"/>\n\t\t<field name=\"META_SYM_ON\"/>\n\t</class>\n\t<class name=\"android/text/method/MovementMethod\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"canSelectArbitrarily()Z\"/>\n\t\t<method name=\"initialize(Landroid/widget/TextView;Landroid/text/Spannable;)V\"/>\n\t\t<method name=\"onGenericMotionEvent(Landroid/widget/TextView;Landroid/text/Spannable;Landroid/view/MotionEvent;)Z\" since=\"12\"/>\n\t\t<method name=\"onKeyDown(Landroid/widget/TextView;Landroid/text/Spannable;ILandroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"onKeyOther(Landroid/widget/TextView;Landroid/text/Spannable;Landroid/view/KeyEvent;)Z\" since=\"3\"/>\n\t\t<method name=\"onKeyUp(Landroid/widget/TextView;Landroid/text/Spannable;ILandroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"onTakeFocus(Landroid/widget/TextView;Landroid/text/Spannable;I)V\"/>\n\t\t<method name=\"onTouchEvent(Landroid/widget/TextView;Landroid/text/Spannable;Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"onTrackballEvent(Landroid/widget/TextView;Landroid/text/Spannable;Landroid/view/MotionEvent;)Z\"/>\n\t</class>\n\t<class name=\"android/text/method/MultiTapKeyListener\" since=\"1\">\n\t\t<extends name=\"android/text/method/BaseKeyListener\"/>\n\t\t<implements name=\"android/text/SpanWatcher\"/>\n\t\t<method name=\"&lt;init>(Landroid/text/method/TextKeyListener$Capitalize;Z)V\"/>\n\t\t<method name=\"getInstance(ZLandroid/text/method/TextKeyListener$Capitalize;)Landroid/text/method/MultiTapKeyListener;\"/>\n\t</class>\n\t<class name=\"android/text/method/NumberKeyListener\" since=\"1\">\n\t\t<extends name=\"android/text/method/BaseKeyListener\"/>\n\t\t<implements name=\"android/text/InputFilter\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getAcceptedChars()[C\"/>\n\t\t<method name=\"lookup(Landroid/view/KeyEvent;Landroid/text/Spannable;)I\"/>\n\t\t<method name=\"ok([CC)Z\"/>\n\t</class>\n\t<class name=\"android/text/method/PasswordTransformationMethod\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/TextWatcher\"/>\n\t\t<implements name=\"android/text/method/TransformationMethod\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getInstance()Landroid/text/method/PasswordTransformationMethod;\"/>\n\t</class>\n\t<class name=\"android/text/method/QwertyKeyListener\" since=\"1\">\n\t\t<extends name=\"android/text/method/BaseKeyListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/text/method/TextKeyListener$Capitalize;Z)V\"/>\n\t\t<method name=\"getInstance(ZLandroid/text/method/TextKeyListener$Capitalize;)Landroid/text/method/QwertyKeyListener;\"/>\n\t\t<method name=\"getInstanceForFullKeyboard()Landroid/text/method/QwertyKeyListener;\" since=\"11\"/>\n\t\t<method name=\"markAsReplaced(Landroid/text/Spannable;IILjava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/text/method/ReplacementTransformationMethod\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/method/TransformationMethod\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getOriginal()[C\"/>\n\t\t<method name=\"getReplacement()[C\"/>\n\t</class>\n\t<class name=\"android/text/method/ScrollingMovementMethod\" since=\"1\">\n\t\t<extends name=\"android/text/method/BaseMovementMethod\" since=\"11\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"11\"/>\n\t\t<implements name=\"android/text/method/MovementMethod\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"down(Landroid/widget/TextView;Landroid/text/Spannable;)Z\"/>\n\t\t<method name=\"getInstance()Landroid/text/method/MovementMethod;\"/>\n\t\t<method name=\"left(Landroid/widget/TextView;Landroid/text/Spannable;)Z\"/>\n\t\t<method name=\"right(Landroid/widget/TextView;Landroid/text/Spannable;)Z\"/>\n\t\t<method name=\"up(Landroid/widget/TextView;Landroid/text/Spannable;)Z\"/>\n\t</class>\n\t<class name=\"android/text/method/SingleLineTransformationMethod\" since=\"1\">\n\t\t<extends name=\"android/text/method/ReplacementTransformationMethod\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getInstance()Landroid/text/method/SingleLineTransformationMethod;\"/>\n\t</class>\n\t<class name=\"android/text/method/TextKeyListener\" since=\"1\">\n\t\t<extends name=\"android/text/method/BaseKeyListener\"/>\n\t\t<implements name=\"android/text/SpanWatcher\"/>\n\t\t<method name=\"&lt;init>(Landroid/text/method/TextKeyListener$Capitalize;Z)V\"/>\n\t\t<method name=\"clear(Landroid/text/Editable;)V\"/>\n\t\t<method name=\"getInstance()Landroid/text/method/TextKeyListener;\"/>\n\t\t<method name=\"getInstance(ZLandroid/text/method/TextKeyListener$Capitalize;)Landroid/text/method/TextKeyListener;\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"shouldCap(Landroid/text/method/TextKeyListener$Capitalize;Ljava/lang/CharSequence;I)Z\"/>\n\t</class>\n\t<class name=\"android/text/method/TextKeyListener$Capitalize\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/text/method/TextKeyListener$Capitalize;\"/>\n\t\t<method name=\"values()[Landroid/text/method/TextKeyListener$Capitalize;\"/>\n\t\t<field name=\"CHARACTERS\"/>\n\t\t<field name=\"NONE\"/>\n\t\t<field name=\"SENTENCES\"/>\n\t\t<field name=\"WORDS\"/>\n\t</class>\n\t<class name=\"android/text/method/TimeKeyListener\" since=\"1\">\n\t\t<extends name=\"android/text/method/NumberKeyListener\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"26\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\" since=\"26\"/>\n\t\t<method name=\"getInstance()Landroid/text/method/TimeKeyListener;\" deprecated=\"26\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Landroid/text/method/TimeKeyListener;\" since=\"26\"/>\n\t\t<field name=\"CHARACTERS\" deprecated=\"26\"/>\n\t</class>\n\t<class name=\"android/text/method/Touch\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getInitialScrollX(Landroid/widget/TextView;Landroid/text/Spannable;)I\" since=\"3\"/>\n\t\t<method name=\"getInitialScrollY(Landroid/widget/TextView;Landroid/text/Spannable;)I\" since=\"3\"/>\n\t\t<method name=\"onTouchEvent(Landroid/widget/TextView;Landroid/text/Spannable;Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"scrollTo(Landroid/widget/TextView;Landroid/text/Layout;II)V\"/>\n\t</class>\n\t<class name=\"android/text/method/TransformationMethod\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getTransformation(Ljava/lang/CharSequence;Landroid/view/View;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"onFocusChanged(Landroid/view/View;Ljava/lang/CharSequence;ZILandroid/graphics/Rect;)V\"/>\n\t</class>\n\t<class name=\"android/text/style/AbsoluteSizeSpan\" since=\"1\">\n\t\t<extends name=\"android/text/style/MetricAffectingSpan\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(IZ)V\" since=\"5\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" since=\"3\"/>\n\t\t<method name=\"getDip()Z\" since=\"5\"/>\n\t\t<method name=\"getSize()I\"/>\n\t</class>\n\t<class name=\"android/text/style/AlignmentSpan\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/style/ParagraphStyle\"/>\n\t\t<method name=\"getAlignment()Landroid/text/Layout$Alignment;\"/>\n\t</class>\n\t<class name=\"android/text/style/AlignmentSpan$Standard\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\" since=\"3\"/>\n\t\t<implements name=\"android/text/style/AlignmentSpan\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(Landroid/text/Layout$Alignment;)V\"/>\n\t</class>\n\t<class name=\"android/text/style/BackgroundColorSpan\" since=\"1\">\n\t\t<extends name=\"android/text/style/CharacterStyle\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\" since=\"3\"/>\n\t\t<implements name=\"android/text/style/UpdateAppearance\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" since=\"3\"/>\n\t\t<method name=\"getBackgroundColor()I\"/>\n\t</class>\n\t<class name=\"android/text/style/BulletSpan\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\" since=\"3\"/>\n\t\t<implements name=\"android/text/style/LeadingMarginSpan\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(III)V\" since=\"28\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" since=\"3\"/>\n\t\t<method name=\"getBulletRadius()I\" since=\"28\"/>\n\t\t<method name=\"getColor()I\" since=\"28\"/>\n\t\t<method name=\"getGapWidth()I\" since=\"28\"/>\n\t\t<field name=\"STANDARD_GAP_WIDTH\"/>\n\t</class>\n\t<class name=\"android/text/style/CharacterStyle\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getUnderlying()Landroid/text/style/CharacterStyle;\"/>\n\t\t<method name=\"updateDrawState(Landroid/text/TextPaint;)V\"/>\n\t\t<method name=\"wrap(Landroid/text/style/CharacterStyle;)Landroid/text/style/CharacterStyle;\"/>\n\t</class>\n\t<class name=\"android/text/style/ClickableSpan\" since=\"1\">\n\t\t<extends name=\"android/text/style/CharacterStyle\"/>\n\t\t<implements name=\"android/text/style/UpdateAppearance\" since=\"3\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onClick(Landroid/view/View;)V\"/>\n\t</class>\n\t<class name=\"android/text/style/DrawableMarginSpan\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/style/LeadingMarginSpan\"/>\n\t\t<implements name=\"android/text/style/LineHeightSpan\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/drawable/Drawable;I)V\"/>\n\t</class>\n\t<class name=\"android/text/style/DynamicDrawableSpan\" since=\"1\">\n\t\t<extends name=\"android/text/style/ReplacementSpan\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\" since=\"3\"/>\n\t\t<method name=\"getDrawable()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getVerticalAlignment()I\" since=\"3\"/>\n\t\t<field name=\"ALIGN_BASELINE\" since=\"3\"/>\n\t\t<field name=\"ALIGN_BOTTOM\" since=\"3\"/>\n\t\t<field name=\"ALIGN_CENTER\" since=\"29\"/>\n\t\t<field name=\"mVerticalAlignment\" since=\"3\"/>\n\t</class>\n\t<class name=\"android/text/style/EasyEditSpan\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/PendingIntent;)V\" since=\"18\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" since=\"18\"/>\n\t\t<field name=\"EXTRA_TEXT_CHANGED_TYPE\" since=\"18\"/>\n\t\t<field name=\"TEXT_DELETED\" since=\"18\"/>\n\t\t<field name=\"TEXT_MODIFIED\" since=\"18\"/>\n\t</class>\n\t<class name=\"android/text/style/ForegroundColorSpan\" since=\"1\">\n\t\t<extends name=\"android/text/style/CharacterStyle\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\" since=\"3\"/>\n\t\t<implements name=\"android/text/style/UpdateAppearance\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" since=\"3\"/>\n\t\t<method name=\"getForegroundColor()I\"/>\n\t</class>\n\t<class name=\"android/text/style/IconMarginSpan\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/style/LeadingMarginSpan\"/>\n\t\t<implements name=\"android/text/style/LineHeightSpan\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Bitmap;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Bitmap;I)V\"/>\n\t</class>\n\t<class name=\"android/text/style/ImageSpan\" since=\"1\">\n\t\t<extends name=\"android/text/style/DynamicDrawableSpan\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;II)V\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/graphics/Bitmap;)V\" since=\"4\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/graphics/Bitmap;I)V\" since=\"4\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/net/Uri;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/net/Uri;I)V\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Bitmap;)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Bitmap;I)V\" since=\"3\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/drawable/Drawable;I)V\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/drawable/Drawable;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/drawable/Drawable;Ljava/lang/String;I)V\" since=\"3\"/>\n\t\t<method name=\"getSource()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/text/style/LeadingMarginSpan\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/style/ParagraphStyle\"/>\n\t\t<method name=\"drawLeadingMargin(Landroid/graphics/Canvas;Landroid/graphics/Paint;IIIIILjava/lang/CharSequence;IIZLandroid/text/Layout;)V\"/>\n\t\t<method name=\"getLeadingMargin(Z)I\"/>\n\t</class>\n\t<class name=\"android/text/style/LeadingMarginSpan$LeadingMarginSpan2\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/style/LeadingMarginSpan\"/>\n\t\t<implements name=\"android/text/style/WrapTogetherSpan\"/>\n\t\t<method name=\"getLeadingMarginLineCount()I\"/>\n\t</class>\n\t<class name=\"android/text/style/LeadingMarginSpan$Standard\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\" since=\"3\"/>\n\t\t<implements name=\"android/text/style/LeadingMarginSpan\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" since=\"3\"/>\n\t</class>\n\t<class name=\"android/text/style/LineBackgroundSpan\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/style/ParagraphStyle\"/>\n\t\t<method name=\"drawBackground(Landroid/graphics/Canvas;Landroid/graphics/Paint;IIIIILjava/lang/CharSequence;III)V\"/>\n\t</class>\n\t<class name=\"android/text/style/LineBackgroundSpan$Standard\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\"/>\n\t\t<implements name=\"android/text/style/LineBackgroundSpan\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"getColor()I\"/>\n\t</class>\n\t<class name=\"android/text/style/LineHeightSpan\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/style/ParagraphStyle\"/>\n\t\t<implements name=\"android/text/style/WrapTogetherSpan\"/>\n\t\t<method name=\"chooseHeight(Ljava/lang/CharSequence;IIIILandroid/graphics/Paint$FontMetricsInt;)V\"/>\n\t</class>\n\t<class name=\"android/text/style/LineHeightSpan$Standard\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\"/>\n\t\t<implements name=\"android/text/style/LineHeightSpan\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t</class>\n\t<class name=\"android/text/style/LineHeightSpan$WithDensity\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/style/LineHeightSpan\"/>\n\t\t<method name=\"chooseHeight(Ljava/lang/CharSequence;IIIILandroid/graphics/Paint$FontMetricsInt;Landroid/text/TextPaint;)V\"/>\n\t</class>\n\t<class name=\"android/text/style/LocaleSpan\" since=\"17\">\n\t\t<extends name=\"android/text/style/MetricAffectingSpan\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/LocaleList;)V\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"getLocale()Ljava/util/Locale;\"/>\n\t\t<method name=\"getLocales()Landroid/os/LocaleList;\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/text/style/MaskFilterSpan\" since=\"1\">\n\t\t<extends name=\"android/text/style/CharacterStyle\"/>\n\t\t<implements name=\"android/text/style/UpdateAppearance\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/MaskFilter;)V\"/>\n\t\t<method name=\"getMaskFilter()Landroid/graphics/MaskFilter;\"/>\n\t</class>\n\t<class name=\"android/text/style/MetricAffectingSpan\" since=\"1\">\n\t\t<extends name=\"android/text/style/CharacterStyle\"/>\n\t\t<implements name=\"android/text/style/UpdateLayout\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getUnderlying()Landroid/text/style/MetricAffectingSpan;\"/>\n\t\t<method name=\"updateMeasureState(Landroid/text/TextPaint;)V\"/>\n\t</class>\n\t<class name=\"android/text/style/ParagraphStyle\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/text/style/QuoteSpan\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\" since=\"3\"/>\n\t\t<implements name=\"android/text/style/LeadingMarginSpan\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(III)V\" since=\"28\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" since=\"3\"/>\n\t\t<method name=\"getColor()I\"/>\n\t\t<method name=\"getGapWidth()I\" since=\"28\"/>\n\t\t<method name=\"getStripeWidth()I\" since=\"28\"/>\n\t\t<field name=\"STANDARD_COLOR\" since=\"28\"/>\n\t\t<field name=\"STANDARD_GAP_WIDTH_PX\" since=\"28\"/>\n\t\t<field name=\"STANDARD_STRIPE_WIDTH_PX\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/text/style/RasterizerSpan\" since=\"1\" removed=\"26\">\n\t\t<extends name=\"android/text/style/CharacterStyle\"/>\n\t\t<implements name=\"android/text/style/UpdateAppearance\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Rasterizer;)V\"/>\n\t\t<method name=\"getRasterizer()Landroid/graphics/Rasterizer;\"/>\n\t</class>\n\t<class name=\"android/text/style/RelativeSizeSpan\" since=\"1\">\n\t\t<extends name=\"android/text/style/MetricAffectingSpan\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(F)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" since=\"3\"/>\n\t\t<method name=\"getSizeChange()F\"/>\n\t</class>\n\t<class name=\"android/text/style/ReplacementSpan\" since=\"1\">\n\t\t<extends name=\"android/text/style/MetricAffectingSpan\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"draw(Landroid/graphics/Canvas;Ljava/lang/CharSequence;IIFIIILandroid/graphics/Paint;)V\"/>\n\t\t<method name=\"getSize(Landroid/graphics/Paint;Ljava/lang/CharSequence;IILandroid/graphics/Paint$FontMetricsInt;)I\"/>\n\t</class>\n\t<class name=\"android/text/style/ScaleXSpan\" since=\"1\">\n\t\t<extends name=\"android/text/style/MetricAffectingSpan\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(F)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" since=\"3\"/>\n\t\t<method name=\"getScaleX()F\"/>\n\t</class>\n\t<class name=\"android/text/style/StrikethroughSpan\" since=\"1\">\n\t\t<extends name=\"android/text/style/CharacterStyle\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\" since=\"3\"/>\n\t\t<implements name=\"android/text/style/UpdateAppearance\" since=\"3\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" since=\"3\"/>\n\t</class>\n\t<class name=\"android/text/style/StyleSpan\" since=\"1\">\n\t\t<extends name=\"android/text/style/MetricAffectingSpan\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" since=\"3\"/>\n\t\t<method name=\"getStyle()I\"/>\n\t</class>\n\t<class name=\"android/text/style/SubscriptSpan\" since=\"1\">\n\t\t<extends name=\"android/text/style/MetricAffectingSpan\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\" since=\"3\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" since=\"3\"/>\n\t</class>\n\t<class name=\"android/text/style/SuggestionSpan\" since=\"14\">\n\t\t<extends name=\"android/text/style/CharacterStyle\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/util/Locale;[Ljava/lang/String;ILjava/lang/Class;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;[Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;[Ljava/lang/String;I)V\"/>\n\t\t<method name=\"getFlags()I\"/>\n\t\t<method name=\"getLocale()Ljava/lang/String;\" deprecated=\"24\"/>\n\t\t<method name=\"getLocaleObject()Ljava/util/Locale;\" since=\"24\"/>\n\t\t<method name=\"getSuggestions()[Ljava/lang/String;\"/>\n\t\t<method name=\"getUnderlineColor()I\" since=\"29\"/>\n\t\t<method name=\"setFlags(I)V\"/>\n\t\t<field name=\"ACTION_SUGGESTION_PICKED\" deprecated=\"29\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FLAG_AUTO_CORRECTION\" since=\"15\"/>\n\t\t<field name=\"FLAG_EASY_CORRECT\"/>\n\t\t<field name=\"FLAG_MISSPELLED\"/>\n\t\t<field name=\"SUGGESTIONS_MAX_SIZE\"/>\n\t\t<field name=\"SUGGESTION_SPAN_PICKED_AFTER\" deprecated=\"29\"/>\n\t\t<field name=\"SUGGESTION_SPAN_PICKED_BEFORE\" deprecated=\"29\"/>\n\t\t<field name=\"SUGGESTION_SPAN_PICKED_HASHCODE\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/text/style/SuperscriptSpan\" since=\"1\">\n\t\t<extends name=\"android/text/style/MetricAffectingSpan\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\" since=\"3\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" since=\"3\"/>\n\t</class>\n\t<class name=\"android/text/style/TabStopSpan\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/style/ParagraphStyle\"/>\n\t\t<method name=\"getTabStop()I\"/>\n\t</class>\n\t<class name=\"android/text/style/TabStopSpan$Standard\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/style/TabStopSpan\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t</class>\n\t<class name=\"android/text/style/TextAppearanceSpan\" since=\"1\">\n\t\t<extends name=\"android/text/style/MetricAffectingSpan\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;II)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;IILandroid/content/res/ColorStateList;Landroid/content/res/ColorStateList;)V\"/>\n\t\t<method name=\"getFamily()Ljava/lang/String;\"/>\n\t\t<method name=\"getFontFeatureSettings()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getFontVariationSettings()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getLinkTextColor()Landroid/content/res/ColorStateList;\"/>\n\t\t<method name=\"getShadowColor()I\" since=\"29\"/>\n\t\t<method name=\"getShadowDx()F\" since=\"29\"/>\n\t\t<method name=\"getShadowDy()F\" since=\"29\"/>\n\t\t<method name=\"getShadowRadius()F\" since=\"29\"/>\n\t\t<method name=\"getTextColor()Landroid/content/res/ColorStateList;\"/>\n\t\t<method name=\"getTextFontWeight()I\" since=\"29\"/>\n\t\t<method name=\"getTextLocales()Landroid/os/LocaleList;\" since=\"29\"/>\n\t\t<method name=\"getTextSize()I\"/>\n\t\t<method name=\"getTextStyle()I\"/>\n\t\t<method name=\"getTypeface()Landroid/graphics/Typeface;\" since=\"29\"/>\n\t\t<method name=\"isElegantTextHeight()Z\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/text/style/TtsSpan\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Landroid/os/PersistableBundle;)V\"/>\n\t\t<method name=\"getArgs()Landroid/os/PersistableBundle;\"/>\n\t\t<method name=\"getType()Ljava/lang/String;\"/>\n\t\t<field name=\"ANIMACY_ANIMATE\"/>\n\t\t<field name=\"ANIMACY_INANIMATE\"/>\n\t\t<field name=\"ARG_ANIMACY\"/>\n\t\t<field name=\"ARG_CASE\"/>\n\t\t<field name=\"ARG_COUNTRY_CODE\"/>\n\t\t<field name=\"ARG_CURRENCY\"/>\n\t\t<field name=\"ARG_DAY\"/>\n\t\t<field name=\"ARG_DENOMINATOR\"/>\n\t\t<field name=\"ARG_DIGITS\"/>\n\t\t<field name=\"ARG_DOMAIN\"/>\n\t\t<field name=\"ARG_EXTENSION\"/>\n\t\t<field name=\"ARG_FRACTIONAL_PART\"/>\n\t\t<field name=\"ARG_FRAGMENT_ID\"/>\n\t\t<field name=\"ARG_GENDER\"/>\n\t\t<field name=\"ARG_HOURS\"/>\n\t\t<field name=\"ARG_INTEGER_PART\"/>\n\t\t<field name=\"ARG_MINUTES\"/>\n\t\t<field name=\"ARG_MONTH\"/>\n\t\t<field name=\"ARG_MULTIPLICITY\"/>\n\t\t<field name=\"ARG_NUMBER\"/>\n\t\t<field name=\"ARG_NUMBER_PARTS\"/>\n\t\t<field name=\"ARG_NUMERATOR\"/>\n\t\t<field name=\"ARG_PASSWORD\"/>\n\t\t<field name=\"ARG_PATH\"/>\n\t\t<field name=\"ARG_PORT\"/>\n\t\t<field name=\"ARG_PROTOCOL\"/>\n\t\t<field name=\"ARG_QUANTITY\"/>\n\t\t<field name=\"ARG_QUERY_STRING\"/>\n\t\t<field name=\"ARG_TEXT\"/>\n\t\t<field name=\"ARG_UNIT\"/>\n\t\t<field name=\"ARG_USERNAME\"/>\n\t\t<field name=\"ARG_VERBATIM\"/>\n\t\t<field name=\"ARG_WEEKDAY\"/>\n\t\t<field name=\"ARG_YEAR\"/>\n\t\t<field name=\"CASE_ABLATIVE\"/>\n\t\t<field name=\"CASE_ACCUSATIVE\"/>\n\t\t<field name=\"CASE_DATIVE\"/>\n\t\t<field name=\"CASE_GENITIVE\"/>\n\t\t<field name=\"CASE_INSTRUMENTAL\"/>\n\t\t<field name=\"CASE_LOCATIVE\"/>\n\t\t<field name=\"CASE_NOMINATIVE\"/>\n\t\t<field name=\"CASE_VOCATIVE\"/>\n\t\t<field name=\"GENDER_FEMALE\"/>\n\t\t<field name=\"GENDER_MALE\"/>\n\t\t<field name=\"GENDER_NEUTRAL\"/>\n\t\t<field name=\"MONTH_APRIL\"/>\n\t\t<field name=\"MONTH_AUGUST\"/>\n\t\t<field name=\"MONTH_DECEMBER\"/>\n\t\t<field name=\"MONTH_FEBRUARY\"/>\n\t\t<field name=\"MONTH_JANUARY\"/>\n\t\t<field name=\"MONTH_JULY\"/>\n\t\t<field name=\"MONTH_JUNE\"/>\n\t\t<field name=\"MONTH_MARCH\"/>\n\t\t<field name=\"MONTH_MAY\"/>\n\t\t<field name=\"MONTH_NOVEMBER\"/>\n\t\t<field name=\"MONTH_OCTOBER\"/>\n\t\t<field name=\"MONTH_SEPTEMBER\"/>\n\t\t<field name=\"MULTIPLICITY_DUAL\"/>\n\t\t<field name=\"MULTIPLICITY_PLURAL\"/>\n\t\t<field name=\"MULTIPLICITY_SINGLE\"/>\n\t\t<field name=\"TYPE_CARDINAL\"/>\n\t\t<field name=\"TYPE_DATE\"/>\n\t\t<field name=\"TYPE_DECIMAL\"/>\n\t\t<field name=\"TYPE_DIGITS\"/>\n\t\t<field name=\"TYPE_ELECTRONIC\"/>\n\t\t<field name=\"TYPE_FRACTION\"/>\n\t\t<field name=\"TYPE_MEASURE\"/>\n\t\t<field name=\"TYPE_MONEY\"/>\n\t\t<field name=\"TYPE_ORDINAL\"/>\n\t\t<field name=\"TYPE_TELEPHONE\"/>\n\t\t<field name=\"TYPE_TEXT\"/>\n\t\t<field name=\"TYPE_TIME\"/>\n\t\t<field name=\"TYPE_VERBATIM\"/>\n\t\t<field name=\"WEEKDAY_FRIDAY\"/>\n\t\t<field name=\"WEEKDAY_MONDAY\"/>\n\t\t<field name=\"WEEKDAY_SATURDAY\"/>\n\t\t<field name=\"WEEKDAY_SUNDAY\"/>\n\t\t<field name=\"WEEKDAY_THURSDAY\"/>\n\t\t<field name=\"WEEKDAY_TUESDAY\"/>\n\t\t<field name=\"WEEKDAY_WEDNESDAY\"/>\n\t</class>\n\t<class name=\"android/text/style/TtsSpan$Builder\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"build()Landroid/text/style/TtsSpan;\"/>\n\t\t<method name=\"setIntArgument(Ljava/lang/String;I)Landroid/text/style/TtsSpan$Builder;\"/>\n\t\t<method name=\"setLongArgument(Ljava/lang/String;J)Landroid/text/style/TtsSpan$Builder;\"/>\n\t\t<method name=\"setStringArgument(Ljava/lang/String;Ljava/lang/String;)Landroid/text/style/TtsSpan$Builder;\"/>\n\t</class>\n\t<class name=\"android/text/style/TtsSpan$CardinalBuilder\" since=\"21\">\n\t\t<extends name=\"android/text/style/TtsSpan$SemioticClassBuilder\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(J)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setNumber(J)Landroid/text/style/TtsSpan$CardinalBuilder;\"/>\n\t\t<method name=\"setNumber(Ljava/lang/String;)Landroid/text/style/TtsSpan$CardinalBuilder;\"/>\n\t</class>\n\t<class name=\"android/text/style/TtsSpan$DateBuilder\" since=\"21\">\n\t\t<extends name=\"android/text/style/TtsSpan$SemioticClassBuilder\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;)V\"/>\n\t\t<method name=\"setDay(I)Landroid/text/style/TtsSpan$DateBuilder;\"/>\n\t\t<method name=\"setMonth(I)Landroid/text/style/TtsSpan$DateBuilder;\"/>\n\t\t<method name=\"setWeekday(I)Landroid/text/style/TtsSpan$DateBuilder;\"/>\n\t\t<method name=\"setYear(I)Landroid/text/style/TtsSpan$DateBuilder;\"/>\n\t</class>\n\t<class name=\"android/text/style/TtsSpan$DecimalBuilder\" since=\"21\">\n\t\t<extends name=\"android/text/style/TtsSpan$SemioticClassBuilder\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(DII)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setArgumentsFromDouble(DII)Landroid/text/style/TtsSpan$DecimalBuilder;\"/>\n\t\t<method name=\"setFractionalPart(Ljava/lang/String;)Landroid/text/style/TtsSpan$DecimalBuilder;\"/>\n\t\t<method name=\"setIntegerPart(J)Landroid/text/style/TtsSpan$DecimalBuilder;\"/>\n\t\t<method name=\"setIntegerPart(Ljava/lang/String;)Landroid/text/style/TtsSpan$DecimalBuilder;\"/>\n\t</class>\n\t<class name=\"android/text/style/TtsSpan$DigitsBuilder\" since=\"21\">\n\t\t<extends name=\"android/text/style/TtsSpan$SemioticClassBuilder\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setDigits(Ljava/lang/String;)Landroid/text/style/TtsSpan$DigitsBuilder;\"/>\n\t</class>\n\t<class name=\"android/text/style/TtsSpan$ElectronicBuilder\" since=\"21\">\n\t\t<extends name=\"android/text/style/TtsSpan$SemioticClassBuilder\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"setDomain(Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;\"/>\n\t\t<method name=\"setEmailArguments(Ljava/lang/String;Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;\"/>\n\t\t<method name=\"setFragmentId(Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;\"/>\n\t\t<method name=\"setPassword(Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;\"/>\n\t\t<method name=\"setPath(Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;\"/>\n\t\t<method name=\"setPort(I)Landroid/text/style/TtsSpan$ElectronicBuilder;\"/>\n\t\t<method name=\"setProtocol(Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;\"/>\n\t\t<method name=\"setQueryString(Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;\"/>\n\t\t<method name=\"setUsername(Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;\"/>\n\t</class>\n\t<class name=\"android/text/style/TtsSpan$FractionBuilder\" since=\"21\">\n\t\t<extends name=\"android/text/style/TtsSpan$SemioticClassBuilder\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(JJJ)V\"/>\n\t\t<method name=\"setDenominator(J)Landroid/text/style/TtsSpan$FractionBuilder;\"/>\n\t\t<method name=\"setDenominator(Ljava/lang/String;)Landroid/text/style/TtsSpan$FractionBuilder;\"/>\n\t\t<method name=\"setIntegerPart(J)Landroid/text/style/TtsSpan$FractionBuilder;\"/>\n\t\t<method name=\"setIntegerPart(Ljava/lang/String;)Landroid/text/style/TtsSpan$FractionBuilder;\"/>\n\t\t<method name=\"setNumerator(J)Landroid/text/style/TtsSpan$FractionBuilder;\"/>\n\t\t<method name=\"setNumerator(Ljava/lang/String;)Landroid/text/style/TtsSpan$FractionBuilder;\"/>\n\t</class>\n\t<class name=\"android/text/style/TtsSpan$MeasureBuilder\" since=\"21\">\n\t\t<extends name=\"android/text/style/TtsSpan$SemioticClassBuilder\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"setDenominator(J)Landroid/text/style/TtsSpan$MeasureBuilder;\"/>\n\t\t<method name=\"setDenominator(Ljava/lang/String;)Landroid/text/style/TtsSpan$MeasureBuilder;\"/>\n\t\t<method name=\"setFractionalPart(Ljava/lang/String;)Landroid/text/style/TtsSpan$MeasureBuilder;\"/>\n\t\t<method name=\"setIntegerPart(J)Landroid/text/style/TtsSpan$MeasureBuilder;\"/>\n\t\t<method name=\"setIntegerPart(Ljava/lang/String;)Landroid/text/style/TtsSpan$MeasureBuilder;\"/>\n\t\t<method name=\"setNumber(J)Landroid/text/style/TtsSpan$MeasureBuilder;\"/>\n\t\t<method name=\"setNumber(Ljava/lang/String;)Landroid/text/style/TtsSpan$MeasureBuilder;\"/>\n\t\t<method name=\"setNumerator(J)Landroid/text/style/TtsSpan$MeasureBuilder;\"/>\n\t\t<method name=\"setNumerator(Ljava/lang/String;)Landroid/text/style/TtsSpan$MeasureBuilder;\"/>\n\t\t<method name=\"setUnit(Ljava/lang/String;)Landroid/text/style/TtsSpan$MeasureBuilder;\"/>\n\t</class>\n\t<class name=\"android/text/style/TtsSpan$MoneyBuilder\" since=\"21\">\n\t\t<extends name=\"android/text/style/TtsSpan$SemioticClassBuilder\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"setCurrency(Ljava/lang/String;)Landroid/text/style/TtsSpan$MoneyBuilder;\"/>\n\t\t<method name=\"setFractionalPart(Ljava/lang/String;)Landroid/text/style/TtsSpan$MoneyBuilder;\"/>\n\t\t<method name=\"setIntegerPart(J)Landroid/text/style/TtsSpan$MoneyBuilder;\"/>\n\t\t<method name=\"setIntegerPart(Ljava/lang/String;)Landroid/text/style/TtsSpan$MoneyBuilder;\"/>\n\t\t<method name=\"setQuantity(Ljava/lang/String;)Landroid/text/style/TtsSpan$MoneyBuilder;\"/>\n\t</class>\n\t<class name=\"android/text/style/TtsSpan$OrdinalBuilder\" since=\"21\">\n\t\t<extends name=\"android/text/style/TtsSpan$SemioticClassBuilder\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(J)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setNumber(J)Landroid/text/style/TtsSpan$OrdinalBuilder;\"/>\n\t\t<method name=\"setNumber(Ljava/lang/String;)Landroid/text/style/TtsSpan$OrdinalBuilder;\"/>\n\t</class>\n\t<class name=\"android/text/style/TtsSpan$SemioticClassBuilder\" since=\"21\">\n\t\t<extends name=\"android/text/style/TtsSpan$Builder\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setAnimacy(Ljava/lang/String;)Landroid/text/style/TtsSpan$SemioticClassBuilder;\"/>\n\t\t<method name=\"setCase(Ljava/lang/String;)Landroid/text/style/TtsSpan$SemioticClassBuilder;\"/>\n\t\t<method name=\"setGender(Ljava/lang/String;)Landroid/text/style/TtsSpan$SemioticClassBuilder;\"/>\n\t\t<method name=\"setMultiplicity(Ljava/lang/String;)Landroid/text/style/TtsSpan$SemioticClassBuilder;\"/>\n\t</class>\n\t<class name=\"android/text/style/TtsSpan$TelephoneBuilder\" since=\"21\">\n\t\t<extends name=\"android/text/style/TtsSpan$SemioticClassBuilder\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setCountryCode(Ljava/lang/String;)Landroid/text/style/TtsSpan$TelephoneBuilder;\"/>\n\t\t<method name=\"setExtension(Ljava/lang/String;)Landroid/text/style/TtsSpan$TelephoneBuilder;\"/>\n\t\t<method name=\"setNumberParts(Ljava/lang/String;)Landroid/text/style/TtsSpan$TelephoneBuilder;\"/>\n\t</class>\n\t<class name=\"android/text/style/TtsSpan$TextBuilder\" since=\"21\">\n\t\t<extends name=\"android/text/style/TtsSpan$SemioticClassBuilder\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setText(Ljava/lang/String;)Landroid/text/style/TtsSpan$TextBuilder;\"/>\n\t</class>\n\t<class name=\"android/text/style/TtsSpan$TimeBuilder\" since=\"21\">\n\t\t<extends name=\"android/text/style/TtsSpan$SemioticClassBuilder\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"setHours(I)Landroid/text/style/TtsSpan$TimeBuilder;\"/>\n\t\t<method name=\"setMinutes(I)Landroid/text/style/TtsSpan$TimeBuilder;\"/>\n\t</class>\n\t<class name=\"android/text/style/TtsSpan$VerbatimBuilder\" since=\"21\">\n\t\t<extends name=\"android/text/style/TtsSpan$SemioticClassBuilder\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setVerbatim(Ljava/lang/String;)Landroid/text/style/TtsSpan$VerbatimBuilder;\"/>\n\t</class>\n\t<class name=\"android/text/style/TypefaceSpan\" since=\"1\">\n\t\t<extends name=\"android/text/style/MetricAffectingSpan\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Typeface;)V\" since=\"28\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getFamily()Ljava/lang/String;\"/>\n\t\t<method name=\"getTypeface()Landroid/graphics/Typeface;\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/text/style/URLSpan\" since=\"1\">\n\t\t<extends name=\"android/text/style/ClickableSpan\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getURL()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/text/style/UnderlineSpan\" since=\"1\">\n\t\t<extends name=\"android/text/style/CharacterStyle\"/>\n\t\t<implements name=\"android/text/ParcelableSpan\" since=\"3\"/>\n\t\t<implements name=\"android/text/style/UpdateAppearance\" since=\"3\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\" since=\"3\"/>\n\t</class>\n\t<class name=\"android/text/style/UpdateAppearance\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/text/style/UpdateLayout\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/style/UpdateAppearance\" since=\"3\"/>\n\t</class>\n\t<class name=\"android/text/style/WrapTogetherSpan\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/text/style/ParagraphStyle\"/>\n\t</class>\n\t<class name=\"android/text/util/Linkify\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addLinks(Landroid/text/Spannable;I)Z\"/>\n\t\t<method name=\"addLinks(Landroid/text/Spannable;ILjava/util/function/Function;)Z\" since=\"29\"/>\n\t\t<method name=\"addLinks(Landroid/text/Spannable;Ljava/util/regex/Pattern;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"addLinks(Landroid/text/Spannable;Ljava/util/regex/Pattern;Ljava/lang/String;Landroid/text/util/Linkify$MatchFilter;Landroid/text/util/Linkify$TransformFilter;)Z\"/>\n\t\t<method name=\"addLinks(Landroid/text/Spannable;Ljava/util/regex/Pattern;Ljava/lang/String;[Ljava/lang/String;Landroid/text/util/Linkify$MatchFilter;Landroid/text/util/Linkify$TransformFilter;)Z\" since=\"24\"/>\n\t\t<method name=\"addLinks(Landroid/text/Spannable;Ljava/util/regex/Pattern;Ljava/lang/String;[Ljava/lang/String;Landroid/text/util/Linkify$MatchFilter;Landroid/text/util/Linkify$TransformFilter;Ljava/util/function/Function;)Z\" since=\"29\"/>\n\t\t<method name=\"addLinks(Landroid/widget/TextView;I)Z\"/>\n\t\t<method name=\"addLinks(Landroid/widget/TextView;Ljava/util/regex/Pattern;Ljava/lang/String;)V\"/>\n\t\t<method name=\"addLinks(Landroid/widget/TextView;Ljava/util/regex/Pattern;Ljava/lang/String;Landroid/text/util/Linkify$MatchFilter;Landroid/text/util/Linkify$TransformFilter;)V\"/>\n\t\t<method name=\"addLinks(Landroid/widget/TextView;Ljava/util/regex/Pattern;Ljava/lang/String;[Ljava/lang/String;Landroid/text/util/Linkify$MatchFilter;Landroid/text/util/Linkify$TransformFilter;)V\" since=\"24\"/>\n\t\t<field name=\"ALL\"/>\n\t\t<field name=\"EMAIL_ADDRESSES\"/>\n\t\t<field name=\"MAP_ADDRESSES\" deprecated=\"28\"/>\n\t\t<field name=\"PHONE_NUMBERS\"/>\n\t\t<field name=\"WEB_URLS\"/>\n\t\t<field name=\"sPhoneNumberMatchFilter\"/>\n\t\t<field name=\"sPhoneNumberTransformFilter\"/>\n\t\t<field name=\"sUrlMatchFilter\"/>\n\t</class>\n\t<class name=\"android/text/util/Linkify$MatchFilter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"acceptMatch(Ljava/lang/CharSequence;II)Z\"/>\n\t</class>\n\t<class name=\"android/text/util/Linkify$TransformFilter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"transformUrl(Ljava/util/regex/Matcher;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/text/util/Rfc822Token\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getAddress()Ljava/lang/String;\"/>\n\t\t<method name=\"getComment()Ljava/lang/String;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"quoteComment(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"quoteName(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"quoteNameIfNecessary(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"setAddress(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setComment(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setName(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/text/util/Rfc822Tokenizer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/widget/MultiAutoCompleteTextView$Tokenizer\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"tokenize(Ljava/lang/CharSequence;)[Landroid/text/util/Rfc822Token;\"/>\n\t\t<method name=\"tokenize(Ljava/lang/CharSequence;Ljava/util/Collection;)V\" since=\"8\"/>\n\t</class>\n\t<class name=\"android/transition/ArcMotion\" since=\"21\">\n\t\t<extends name=\"android/transition/PathMotion\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"getMaximumAngle()F\"/>\n\t\t<method name=\"getMinimumHorizontalAngle()F\"/>\n\t\t<method name=\"getMinimumVerticalAngle()F\"/>\n\t\t<method name=\"setMaximumAngle(F)V\"/>\n\t\t<method name=\"setMinimumHorizontalAngle(F)V\"/>\n\t\t<method name=\"setMinimumVerticalAngle(F)V\"/>\n\t</class>\n\t<class name=\"android/transition/AutoTransition\" since=\"19\">\n\t\t<extends name=\"android/transition/TransitionSet\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/transition/ChangeBounds\" since=\"19\">\n\t\t<extends name=\"android/transition/Transition\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" since=\"21\"/>\n\t\t<method name=\"getResizeClip()Z\" since=\"22\"/>\n\t\t<method name=\"setReparent(Z)V\" deprecated=\"21\"/>\n\t\t<method name=\"setResizeClip(Z)V\"/>\n\t</class>\n\t<class name=\"android/transition/ChangeClipBounds\" since=\"21\">\n\t\t<extends name=\"android/transition/Transition\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t</class>\n\t<class name=\"android/transition/ChangeImageTransform\" since=\"21\">\n\t\t<extends name=\"android/transition/Transition\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t</class>\n\t<class name=\"android/transition/ChangeScroll\" since=\"23\">\n\t\t<extends name=\"android/transition/Transition\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t</class>\n\t<class name=\"android/transition/ChangeTransform\" since=\"21\">\n\t\t<extends name=\"android/transition/Transition\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"getReparent()Z\"/>\n\t\t<method name=\"getReparentWithOverlay()Z\"/>\n\t\t<method name=\"setReparent(Z)V\"/>\n\t\t<method name=\"setReparentWithOverlay(Z)V\"/>\n\t</class>\n\t<class name=\"android/transition/CircularPropagation\" since=\"21\">\n\t\t<extends name=\"android/transition/VisibilityPropagation\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"setPropagationSpeed(F)V\"/>\n\t</class>\n\t<class name=\"android/transition/Explode\" since=\"21\">\n\t\t<extends name=\"android/transition/Visibility\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t</class>\n\t<class name=\"android/transition/Fade\" since=\"19\">\n\t\t<extends name=\"android/transition/Visibility\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" since=\"21\"/>\n\t\t<field name=\"IN\"/>\n\t\t<field name=\"OUT\"/>\n\t</class>\n\t<class name=\"android/transition/PathMotion\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"getPath(FFFF)Landroid/graphics/Path;\"/>\n\t</class>\n\t<class name=\"android/transition/PatternPathMotion\" since=\"21\">\n\t\t<extends name=\"android/transition/PathMotion\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Path;)V\"/>\n\t\t<method name=\"getPatternPath()Landroid/graphics/Path;\"/>\n\t\t<method name=\"setPatternPath(Landroid/graphics/Path;)V\"/>\n\t</class>\n\t<class name=\"android/transition/Scene\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup;Landroid/view/View;)V\" since=\"21\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup;Landroid/view/ViewGroup;)V\" deprecated=\"21\"/>\n\t\t<method name=\"enter()V\"/>\n\t\t<method name=\"exit()V\"/>\n\t\t<method name=\"getCurrentScene(Landroid/view/ViewGroup;)Landroid/transition/Scene;\" since=\"29\"/>\n\t\t<method name=\"getSceneForLayout(Landroid/view/ViewGroup;ILandroid/content/Context;)Landroid/transition/Scene;\"/>\n\t\t<method name=\"getSceneRoot()Landroid/view/ViewGroup;\"/>\n\t\t<method name=\"setEnterAction(Ljava/lang/Runnable;)V\"/>\n\t\t<method name=\"setExitAction(Ljava/lang/Runnable;)V\"/>\n\t</class>\n\t<class name=\"android/transition/SidePropagation\" since=\"21\">\n\t\t<extends name=\"android/transition/VisibilityPropagation\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"setPropagationSpeed(F)V\"/>\n\t\t<method name=\"setSide(I)V\"/>\n\t</class>\n\t<class name=\"android/transition/Slide\" since=\"21\">\n\t\t<extends name=\"android/transition/Visibility\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"getSlideEdge()I\"/>\n\t\t<method name=\"setSlideEdge(I)V\"/>\n\t</class>\n\t<class name=\"android/transition/Transition\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" since=\"21\"/>\n\t\t<method name=\"addListener(Landroid/transition/Transition$TransitionListener;)Landroid/transition/Transition;\"/>\n\t\t<method name=\"addTarget(I)Landroid/transition/Transition;\"/>\n\t\t<method name=\"addTarget(Landroid/view/View;)Landroid/transition/Transition;\"/>\n\t\t<method name=\"addTarget(Ljava/lang/Class;)Landroid/transition/Transition;\" since=\"21\"/>\n\t\t<method name=\"addTarget(Ljava/lang/String;)Landroid/transition/Transition;\" since=\"21\"/>\n\t\t<method name=\"canRemoveViews()Z\" since=\"21\"/>\n\t\t<method name=\"captureEndValues(Landroid/transition/TransitionValues;)V\"/>\n\t\t<method name=\"captureStartValues(Landroid/transition/TransitionValues;)V\"/>\n\t\t<method name=\"clone()Landroid/transition/Transition;\"/>\n\t\t<method name=\"createAnimator(Landroid/view/ViewGroup;Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)Landroid/animation/Animator;\"/>\n\t\t<method name=\"excludeChildren(IZ)Landroid/transition/Transition;\"/>\n\t\t<method name=\"excludeChildren(Landroid/view/View;Z)Landroid/transition/Transition;\"/>\n\t\t<method name=\"excludeChildren(Ljava/lang/Class;Z)Landroid/transition/Transition;\"/>\n\t\t<method name=\"excludeTarget(IZ)Landroid/transition/Transition;\"/>\n\t\t<method name=\"excludeTarget(Landroid/view/View;Z)Landroid/transition/Transition;\"/>\n\t\t<method name=\"excludeTarget(Ljava/lang/Class;Z)Landroid/transition/Transition;\"/>\n\t\t<method name=\"excludeTarget(Ljava/lang/String;Z)Landroid/transition/Transition;\" since=\"21\"/>\n\t\t<method name=\"getDuration()J\"/>\n\t\t<method name=\"getEpicenter()Landroid/graphics/Rect;\" since=\"21\"/>\n\t\t<method name=\"getEpicenterCallback()Landroid/transition/Transition$EpicenterCallback;\" since=\"21\"/>\n\t\t<method name=\"getInterpolator()Landroid/animation/TimeInterpolator;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getPathMotion()Landroid/transition/PathMotion;\" since=\"21\"/>\n\t\t<method name=\"getPropagation()Landroid/transition/TransitionPropagation;\" since=\"21\"/>\n\t\t<method name=\"getStartDelay()J\"/>\n\t\t<method name=\"getTargetIds()Ljava/util/List;\"/>\n\t\t<method name=\"getTargetNames()Ljava/util/List;\" since=\"21\"/>\n\t\t<method name=\"getTargetTypes()Ljava/util/List;\" since=\"21\"/>\n\t\t<method name=\"getTargets()Ljava/util/List;\"/>\n\t\t<method name=\"getTransitionProperties()[Ljava/lang/String;\"/>\n\t\t<method name=\"getTransitionValues(Landroid/view/View;Z)Landroid/transition/TransitionValues;\"/>\n\t\t<method name=\"isTransitionRequired(Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)Z\" since=\"23\"/>\n\t\t<method name=\"removeListener(Landroid/transition/Transition$TransitionListener;)Landroid/transition/Transition;\"/>\n\t\t<method name=\"removeTarget(I)Landroid/transition/Transition;\"/>\n\t\t<method name=\"removeTarget(Landroid/view/View;)Landroid/transition/Transition;\"/>\n\t\t<method name=\"removeTarget(Ljava/lang/Class;)Landroid/transition/Transition;\" since=\"21\"/>\n\t\t<method name=\"removeTarget(Ljava/lang/String;)Landroid/transition/Transition;\" since=\"21\"/>\n\t\t<method name=\"setDuration(J)Landroid/transition/Transition;\"/>\n\t\t<method name=\"setEpicenterCallback(Landroid/transition/Transition$EpicenterCallback;)V\" since=\"21\"/>\n\t\t<method name=\"setInterpolator(Landroid/animation/TimeInterpolator;)Landroid/transition/Transition;\"/>\n\t\t<method name=\"setMatchOrder([I)V\" since=\"21\"/>\n\t\t<method name=\"setPathMotion(Landroid/transition/PathMotion;)V\" since=\"21\"/>\n\t\t<method name=\"setPropagation(Landroid/transition/TransitionPropagation;)V\" since=\"21\"/>\n\t\t<method name=\"setStartDelay(J)Landroid/transition/Transition;\"/>\n\t\t<field name=\"MATCH_ID\" since=\"21\"/>\n\t\t<field name=\"MATCH_INSTANCE\" since=\"21\"/>\n\t\t<field name=\"MATCH_ITEM_ID\" since=\"21\"/>\n\t\t<field name=\"MATCH_NAME\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/transition/Transition$EpicenterCallback\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onGetEpicenter(Landroid/transition/Transition;)Landroid/graphics/Rect;\"/>\n\t</class>\n\t<class name=\"android/transition/Transition$TransitionListener\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onTransitionCancel(Landroid/transition/Transition;)V\"/>\n\t\t<method name=\"onTransitionEnd(Landroid/transition/Transition;)V\"/>\n\t\t<method name=\"onTransitionPause(Landroid/transition/Transition;)V\"/>\n\t\t<method name=\"onTransitionResume(Landroid/transition/Transition;)V\"/>\n\t\t<method name=\"onTransitionStart(Landroid/transition/Transition;)V\"/>\n\t</class>\n\t<class name=\"android/transition/TransitionInflater\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"from(Landroid/content/Context;)Landroid/transition/TransitionInflater;\"/>\n\t\t<method name=\"inflateTransition(I)Landroid/transition/Transition;\"/>\n\t\t<method name=\"inflateTransitionManager(ILandroid/view/ViewGroup;)Landroid/transition/TransitionManager;\"/>\n\t</class>\n\t<class name=\"android/transition/TransitionListenerAdapter\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/transition/Transition$TransitionListener\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/transition/TransitionManager\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"beginDelayedTransition(Landroid/view/ViewGroup;)V\"/>\n\t\t<method name=\"beginDelayedTransition(Landroid/view/ViewGroup;Landroid/transition/Transition;)V\"/>\n\t\t<method name=\"endTransitions(Landroid/view/ViewGroup;)V\" since=\"23\"/>\n\t\t<method name=\"go(Landroid/transition/Scene;)V\"/>\n\t\t<method name=\"go(Landroid/transition/Scene;Landroid/transition/Transition;)V\"/>\n\t\t<method name=\"setTransition(Landroid/transition/Scene;Landroid/transition/Scene;Landroid/transition/Transition;)V\"/>\n\t\t<method name=\"setTransition(Landroid/transition/Scene;Landroid/transition/Transition;)V\"/>\n\t\t<method name=\"transitionTo(Landroid/transition/Scene;)V\"/>\n\t</class>\n\t<class name=\"android/transition/TransitionPropagation\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"captureValues(Landroid/transition/TransitionValues;)V\"/>\n\t\t<method name=\"getPropagationProperties()[Ljava/lang/String;\"/>\n\t\t<method name=\"getStartDelay(Landroid/view/ViewGroup;Landroid/transition/Transition;Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)J\"/>\n\t</class>\n\t<class name=\"android/transition/TransitionSet\" since=\"19\">\n\t\t<extends name=\"android/transition/Transition\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" since=\"21\"/>\n\t\t<method name=\"addListener(Landroid/transition/Transition$TransitionListener;)Landroid/transition/TransitionSet;\"/>\n\t\t<method name=\"addTarget(I)Landroid/transition/TransitionSet;\"/>\n\t\t<method name=\"addTarget(Landroid/view/View;)Landroid/transition/TransitionSet;\"/>\n\t\t<method name=\"addTarget(Ljava/lang/Class;)Landroid/transition/TransitionSet;\" since=\"21\"/>\n\t\t<method name=\"addTarget(Ljava/lang/String;)Landroid/transition/TransitionSet;\" since=\"21\"/>\n\t\t<method name=\"addTransition(Landroid/transition/Transition;)Landroid/transition/TransitionSet;\"/>\n\t\t<method name=\"clone()Landroid/transition/TransitionSet;\"/>\n\t\t<method name=\"getOrdering()I\"/>\n\t\t<method name=\"getTransitionAt(I)Landroid/transition/Transition;\" since=\"21\"/>\n\t\t<method name=\"getTransitionCount()I\" since=\"21\"/>\n\t\t<method name=\"removeListener(Landroid/transition/Transition$TransitionListener;)Landroid/transition/TransitionSet;\"/>\n\t\t<method name=\"removeTarget(I)Landroid/transition/TransitionSet;\"/>\n\t\t<method name=\"removeTarget(Landroid/view/View;)Landroid/transition/TransitionSet;\"/>\n\t\t<method name=\"removeTarget(Ljava/lang/Class;)Landroid/transition/TransitionSet;\" since=\"21\"/>\n\t\t<method name=\"removeTarget(Ljava/lang/String;)Landroid/transition/TransitionSet;\" since=\"21\"/>\n\t\t<method name=\"removeTransition(Landroid/transition/Transition;)Landroid/transition/TransitionSet;\"/>\n\t\t<method name=\"setDuration(J)Landroid/transition/TransitionSet;\"/>\n\t\t<method name=\"setInterpolator(Landroid/animation/TimeInterpolator;)Landroid/transition/TransitionSet;\"/>\n\t\t<method name=\"setOrdering(I)Landroid/transition/TransitionSet;\"/>\n\t\t<method name=\"setStartDelay(J)Landroid/transition/TransitionSet;\"/>\n\t\t<field name=\"ORDERING_SEQUENTIAL\"/>\n\t\t<field name=\"ORDERING_TOGETHER\"/>\n\t</class>\n\t<class name=\"android/transition/TransitionValues\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/View;)V\" since=\"29\"/>\n\t\t<field name=\"values\"/>\n\t\t<field name=\"view\"/>\n\t</class>\n\t<class name=\"android/transition/Visibility\" since=\"19\">\n\t\t<extends name=\"android/transition/Transition\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" since=\"21\"/>\n\t\t<method name=\"getMode()I\" since=\"21\"/>\n\t\t<method name=\"isVisible(Landroid/transition/TransitionValues;)Z\"/>\n\t\t<method name=\"onAppear(Landroid/view/ViewGroup;Landroid/transition/TransitionValues;ILandroid/transition/TransitionValues;I)Landroid/animation/Animator;\"/>\n\t\t<method name=\"onAppear(Landroid/view/ViewGroup;Landroid/view/View;Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)Landroid/animation/Animator;\" since=\"21\"/>\n\t\t<method name=\"onDisappear(Landroid/view/ViewGroup;Landroid/transition/TransitionValues;ILandroid/transition/TransitionValues;I)Landroid/animation/Animator;\"/>\n\t\t<method name=\"onDisappear(Landroid/view/ViewGroup;Landroid/view/View;Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)Landroid/animation/Animator;\" since=\"21\"/>\n\t\t<method name=\"setMode(I)V\" since=\"21\"/>\n\t\t<field name=\"MODE_IN\" since=\"21\"/>\n\t\t<field name=\"MODE_OUT\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/transition/VisibilityPropagation\" since=\"21\">\n\t\t<extends name=\"android/transition/TransitionPropagation\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getViewVisibility(Landroid/transition/TransitionValues;)I\"/>\n\t\t<method name=\"getViewX(Landroid/transition/TransitionValues;)I\"/>\n\t\t<method name=\"getViewY(Landroid/transition/TransitionValues;)I\"/>\n\t</class>\n\t<class name=\"android/util/AndroidException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Exception;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\" since=\"11\"/>\n\t</class>\n\t<class name=\"android/util/AndroidRuntimeException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Exception;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\" since=\"11\"/>\n\t</class>\n\t<class name=\"android/util/ArrayMap\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Map\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/util/ArrayMap;)V\"/>\n\t\t<method name=\"containsAll(Ljava/util/Collection;)Z\"/>\n\t\t<method name=\"ensureCapacity(I)V\"/>\n\t\t<method name=\"indexOfKey(Ljava/lang/Object;)I\" since=\"21\"/>\n\t\t<method name=\"indexOfValue(Ljava/lang/Object;)I\" since=\"29\"/>\n\t\t<method name=\"keyAt(I)Ljava/lang/Object;\"/>\n\t\t<method name=\"putAll(Landroid/util/ArrayMap;)V\"/>\n\t\t<method name=\"removeAll(Ljava/util/Collection;)Z\"/>\n\t\t<method name=\"removeAt(I)Ljava/lang/Object;\"/>\n\t\t<method name=\"retainAll(Ljava/util/Collection;)Z\"/>\n\t\t<method name=\"setValueAt(ILjava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"valueAt(I)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"android/util/ArraySet\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Collection\"/>\n\t\t<implements name=\"java/util/Set\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/util/ArraySet;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Collection;)V\" since=\"29\"/>\n\t\t<method name=\"&lt;init>([Ljava/lang/Object;)V\" since=\"30\"/>\n\t\t<method name=\"addAll(Landroid/util/ArraySet;)V\"/>\n\t\t<method name=\"ensureCapacity(I)V\"/>\n\t\t<method name=\"indexOf(Ljava/lang/Object;)I\"/>\n\t\t<method name=\"removeAll(Landroid/util/ArraySet;)Z\"/>\n\t\t<method name=\"removeAt(I)Ljava/lang/Object;\"/>\n\t\t<method name=\"valueAt(I)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"android/util/AtomicFile\" since=\"17\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;)V\"/>\n\t\t<method name=\"delete()V\"/>\n\t\t<method name=\"failWrite(Ljava/io/FileOutputStream;)V\"/>\n\t\t<method name=\"finishWrite(Ljava/io/FileOutputStream;)V\"/>\n\t\t<method name=\"getBaseFile()Ljava/io/File;\"/>\n\t\t<method name=\"openRead()Ljava/io/FileInputStream;\"/>\n\t\t<method name=\"readFully()[B\"/>\n\t\t<method name=\"startWrite()Ljava/io/FileOutputStream;\"/>\n\t</class>\n\t<class name=\"android/util/AttributeSet\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAttributeBooleanValue(IZ)Z\"/>\n\t\t<method name=\"getAttributeBooleanValue(Ljava/lang/String;Ljava/lang/String;Z)Z\"/>\n\t\t<method name=\"getAttributeCount()I\"/>\n\t\t<method name=\"getAttributeFloatValue(IF)F\"/>\n\t\t<method name=\"getAttributeFloatValue(Ljava/lang/String;Ljava/lang/String;F)F\"/>\n\t\t<method name=\"getAttributeIntValue(II)I\"/>\n\t\t<method name=\"getAttributeIntValue(Ljava/lang/String;Ljava/lang/String;I)I\"/>\n\t\t<method name=\"getAttributeListValue(I[Ljava/lang/String;I)I\"/>\n\t\t<method name=\"getAttributeListValue(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;I)I\"/>\n\t\t<method name=\"getAttributeName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getAttributeNameResource(I)I\"/>\n\t\t<method name=\"getAttributeNamespace(I)Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getAttributeResourceValue(II)I\"/>\n\t\t<method name=\"getAttributeResourceValue(Ljava/lang/String;Ljava/lang/String;I)I\"/>\n\t\t<method name=\"getAttributeUnsignedIntValue(II)I\"/>\n\t\t<method name=\"getAttributeUnsignedIntValue(Ljava/lang/String;Ljava/lang/String;I)I\"/>\n\t\t<method name=\"getAttributeValue(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getAttributeValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getClassAttribute()Ljava/lang/String;\"/>\n\t\t<method name=\"getIdAttribute()Ljava/lang/String;\"/>\n\t\t<method name=\"getIdAttributeResourceValue(I)I\"/>\n\t\t<method name=\"getPositionDescription()Ljava/lang/String;\"/>\n\t\t<method name=\"getStyleAttribute()I\"/>\n\t</class>\n\t<class name=\"android/util/Base64\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"decode(Ljava/lang/String;I)[B\"/>\n\t\t<method name=\"decode([BI)[B\"/>\n\t\t<method name=\"decode([BIII)[B\"/>\n\t\t<method name=\"encode([BI)[B\"/>\n\t\t<method name=\"encode([BIII)[B\"/>\n\t\t<method name=\"encodeToString([BI)Ljava/lang/String;\"/>\n\t\t<method name=\"encodeToString([BIII)Ljava/lang/String;\"/>\n\t\t<field name=\"CRLF\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t\t<field name=\"NO_CLOSE\"/>\n\t\t<field name=\"NO_PADDING\"/>\n\t\t<field name=\"NO_WRAP\"/>\n\t\t<field name=\"URL_SAFE\"/>\n\t</class>\n\t<class name=\"android/util/Base64DataException\" since=\"11\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/util/Base64InputStream\" since=\"8\">\n\t\t<extends name=\"java/io/FilterInputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;I)V\"/>\n\t</class>\n\t<class name=\"android/util/Base64OutputStream\" since=\"8\">\n\t\t<extends name=\"java/io/FilterOutputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;I)V\"/>\n\t</class>\n\t<class name=\"android/util/CloseGuard\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"open(Ljava/lang/String;)V\"/>\n\t\t<method name=\"warnIfOpen()V\"/>\n\t</class>\n\t<class name=\"android/util/Config\" since=\"1\" deprecated=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" removed=\"12\"/>\n\t\t<field name=\"DEBUG\" deprecated=\"15\"/>\n\t\t<field name=\"LOGD\" deprecated=\"15\"/>\n\t\t<field name=\"LOGV\" deprecated=\"15\"/>\n\t\t<field name=\"PROFILE\" deprecated=\"15\"/>\n\t\t<field name=\"RELEASE\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/util/DebugUtils\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" removed=\"12\"/>\n\t\t<method name=\"isObjectSelected(Ljava/lang/Object;)Z\"/>\n\t</class>\n\t<class name=\"android/util/DisplayMetrics\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"equals(Landroid/util/DisplayMetrics;)Z\" since=\"17\"/>\n\t\t<method name=\"setTo(Landroid/util/DisplayMetrics;)V\"/>\n\t\t<method name=\"setToDefaults()V\"/>\n\t\t<field name=\"DENSITY_140\" since=\"29\"/>\n\t\t<field name=\"DENSITY_180\" since=\"29\"/>\n\t\t<field name=\"DENSITY_200\" since=\"29\"/>\n\t\t<field name=\"DENSITY_220\" since=\"29\"/>\n\t\t<field name=\"DENSITY_260\" since=\"25\"/>\n\t\t<field name=\"DENSITY_280\" since=\"22\"/>\n\t\t<field name=\"DENSITY_300\" since=\"25\"/>\n\t\t<field name=\"DENSITY_340\" since=\"25\"/>\n\t\t<field name=\"DENSITY_360\" since=\"23\"/>\n\t\t<field name=\"DENSITY_400\" since=\"19\"/>\n\t\t<field name=\"DENSITY_420\" since=\"23\"/>\n\t\t<field name=\"DENSITY_440\" since=\"28\"/>\n\t\t<field name=\"DENSITY_450\" since=\"29\"/>\n\t\t<field name=\"DENSITY_560\" since=\"21\"/>\n\t\t<field name=\"DENSITY_600\" since=\"29\"/>\n\t\t<field name=\"DENSITY_DEFAULT\" since=\"4\"/>\n\t\t<field name=\"DENSITY_DEVICE_STABLE\" since=\"24\"/>\n\t\t<field name=\"DENSITY_HIGH\" since=\"4\"/>\n\t\t<field name=\"DENSITY_LOW\" since=\"4\"/>\n\t\t<field name=\"DENSITY_MEDIUM\" since=\"4\"/>\n\t\t<field name=\"DENSITY_TV\" since=\"13\"/>\n\t\t<field name=\"DENSITY_XHIGH\" since=\"9\"/>\n\t\t<field name=\"DENSITY_XXHIGH\" since=\"16\"/>\n\t\t<field name=\"DENSITY_XXXHIGH\" since=\"18\"/>\n\t\t<field name=\"density\"/>\n\t\t<field name=\"densityDpi\" since=\"4\"/>\n\t\t<field name=\"heightPixels\"/>\n\t\t<field name=\"scaledDensity\"/>\n\t\t<field name=\"widthPixels\"/>\n\t\t<field name=\"xdpi\"/>\n\t\t<field name=\"ydpi\"/>\n\t</class>\n\t<class name=\"android/util/EventLog\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" removed=\"12\"/>\n\t\t<method name=\"getTagCode(Ljava/lang/String;)I\"/>\n\t\t<method name=\"getTagName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"readEvents([ILjava/util/Collection;)V\"/>\n\t\t<method name=\"writeEvent(IF)I\" since=\"23\"/>\n\t\t<method name=\"writeEvent(II)I\"/>\n\t\t<method name=\"writeEvent(IJ)I\"/>\n\t\t<method name=\"writeEvent(ILjava/lang/String;)I\"/>\n\t\t<method name=\"writeEvent(I[Ljava/lang/Object;)I\"/>\n\t</class>\n\t<class name=\"android/util/EventLog$Event\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getData()Ljava/lang/Object;\"/>\n\t\t<method name=\"getProcessId()I\"/>\n\t\t<method name=\"getTag()I\"/>\n\t\t<method name=\"getThreadId()I\"/>\n\t\t<method name=\"getTimeNanos()J\"/>\n\t</class>\n\t<class name=\"android/util/EventLogTags\" since=\"1\" deprecated=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/BufferedReader;)V\" deprecated=\"29\"/>\n\t\t<method name=\"get(I)Landroid/util/EventLogTags$Description;\" deprecated=\"29\"/>\n\t\t<method name=\"get(Ljava/lang/String;)Landroid/util/EventLogTags$Description;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/util/EventLogTags$Description\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"mName\" deprecated=\"29\"/>\n\t\t<field name=\"mTag\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/util/FloatMath\" since=\"1\" deprecated=\"22\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"ceil(F)F\" removed=\"23\"/>\n\t\t<method name=\"cos(F)F\" removed=\"23\"/>\n\t\t<method name=\"exp(F)F\" since=\"17\" removed=\"23\"/>\n\t\t<method name=\"floor(F)F\" removed=\"23\"/>\n\t\t<method name=\"hypot(FF)F\" since=\"17\" removed=\"23\"/>\n\t\t<method name=\"pow(FF)F\" since=\"17\" removed=\"23\"/>\n\t\t<method name=\"sin(F)F\" removed=\"23\"/>\n\t\t<method name=\"sqrt(F)F\" removed=\"23\"/>\n\t</class>\n\t<class name=\"android/util/FloatProperty\" since=\"24\">\n\t\t<extends name=\"android/util/Property\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"set(Ljava/lang/Object;Ljava/lang/Float;)V\"/>\n\t\t<method name=\"setValue(Ljava/lang/Object;F)V\"/>\n\t</class>\n\t<class name=\"android/util/Half\" since=\"26\">\n\t\t<extends name=\"java/lang/Number\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(D)V\"/>\n\t\t<method name=\"&lt;init>(F)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(S)V\"/>\n\t\t<method name=\"abs(S)S\"/>\n\t\t<method name=\"ceil(S)S\"/>\n\t\t<method name=\"compare(SS)I\"/>\n\t\t<method name=\"compareTo(Landroid/util/Half;)I\"/>\n\t\t<method name=\"copySign(SS)S\"/>\n\t\t<method name=\"equals(SS)Z\"/>\n\t\t<method name=\"floor(S)S\"/>\n\t\t<method name=\"getExponent(S)I\"/>\n\t\t<method name=\"getSign(S)I\"/>\n\t\t<method name=\"getSignificand(S)I\"/>\n\t\t<method name=\"greater(SS)Z\"/>\n\t\t<method name=\"greaterEquals(SS)Z\"/>\n\t\t<method name=\"halfToIntBits(S)I\"/>\n\t\t<method name=\"halfToRawIntBits(S)I\"/>\n\t\t<method name=\"halfToShortBits(S)S\"/>\n\t\t<method name=\"halfValue()S\"/>\n\t\t<method name=\"hashCode(S)I\"/>\n\t\t<method name=\"intBitsToHalf(I)S\"/>\n\t\t<method name=\"isInfinite(S)Z\"/>\n\t\t<method name=\"isNaN()Z\"/>\n\t\t<method name=\"isNaN(S)Z\"/>\n\t\t<method name=\"isNormalized(S)Z\"/>\n\t\t<method name=\"less(SS)Z\"/>\n\t\t<method name=\"lessEquals(SS)Z\"/>\n\t\t<method name=\"max(SS)S\"/>\n\t\t<method name=\"min(SS)S\"/>\n\t\t<method name=\"parseHalf(Ljava/lang/String;)S\"/>\n\t\t<method name=\"round(S)S\"/>\n\t\t<method name=\"toFloat(S)F\"/>\n\t\t<method name=\"toHalf(F)S\"/>\n\t\t<method name=\"toHexString(S)Ljava/lang/String;\"/>\n\t\t<method name=\"toString(S)Ljava/lang/String;\"/>\n\t\t<method name=\"trunc(S)S\"/>\n\t\t<method name=\"valueOf(F)Landroid/util/Half;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/util/Half;\"/>\n\t\t<method name=\"valueOf(S)Landroid/util/Half;\"/>\n\t\t<field name=\"EPSILON\"/>\n\t\t<field name=\"LOWEST_VALUE\"/>\n\t\t<field name=\"MAX_EXPONENT\"/>\n\t\t<field name=\"MAX_VALUE\"/>\n\t\t<field name=\"MIN_EXPONENT\"/>\n\t\t<field name=\"MIN_NORMAL\"/>\n\t\t<field name=\"MIN_VALUE\"/>\n\t\t<field name=\"NEGATIVE_INFINITY\"/>\n\t\t<field name=\"NEGATIVE_ZERO\"/>\n\t\t<field name=\"NaN\"/>\n\t\t<field name=\"POSITIVE_INFINITY\"/>\n\t\t<field name=\"POSITIVE_ZERO\"/>\n\t\t<field name=\"SIZE\"/>\n\t</class>\n\t<class name=\"android/util/IntProperty\" since=\"24\">\n\t\t<extends name=\"android/util/Property\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"set(Ljava/lang/Object;Ljava/lang/Integer;)V\"/>\n\t\t<method name=\"setValue(Ljava/lang/Object;I)V\"/>\n\t</class>\n\t<class name=\"android/util/JsonReader\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Reader;)V\"/>\n\t\t<method name=\"beginArray()V\"/>\n\t\t<method name=\"beginObject()V\"/>\n\t\t<method name=\"endArray()V\"/>\n\t\t<method name=\"endObject()V\"/>\n\t\t<method name=\"hasNext()Z\"/>\n\t\t<method name=\"isLenient()Z\"/>\n\t\t<method name=\"nextBoolean()Z\"/>\n\t\t<method name=\"nextDouble()D\"/>\n\t\t<method name=\"nextInt()I\"/>\n\t\t<method name=\"nextLong()J\"/>\n\t\t<method name=\"nextName()Ljava/lang/String;\"/>\n\t\t<method name=\"nextNull()V\"/>\n\t\t<method name=\"nextString()Ljava/lang/String;\"/>\n\t\t<method name=\"peek()Landroid/util/JsonToken;\"/>\n\t\t<method name=\"setLenient(Z)V\"/>\n\t\t<method name=\"skipValue()V\"/>\n\t</class>\n\t<class name=\"android/util/JsonToken\" since=\"11\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/util/JsonToken;\"/>\n\t\t<method name=\"values()[Landroid/util/JsonToken;\"/>\n\t\t<field name=\"BEGIN_ARRAY\"/>\n\t\t<field name=\"BEGIN_OBJECT\"/>\n\t\t<field name=\"BOOLEAN\"/>\n\t\t<field name=\"END_ARRAY\"/>\n\t\t<field name=\"END_DOCUMENT\"/>\n\t\t<field name=\"END_OBJECT\"/>\n\t\t<field name=\"NAME\"/>\n\t\t<field name=\"NULL\"/>\n\t\t<field name=\"NUMBER\"/>\n\t\t<field name=\"STRING\"/>\n\t</class>\n\t<class name=\"android/util/JsonWriter\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Writer;)V\"/>\n\t\t<method name=\"beginArray()Landroid/util/JsonWriter;\"/>\n\t\t<method name=\"beginObject()Landroid/util/JsonWriter;\"/>\n\t\t<method name=\"endArray()Landroid/util/JsonWriter;\"/>\n\t\t<method name=\"endObject()Landroid/util/JsonWriter;\"/>\n\t\t<method name=\"flush()V\"/>\n\t\t<method name=\"isLenient()Z\"/>\n\t\t<method name=\"name(Ljava/lang/String;)Landroid/util/JsonWriter;\"/>\n\t\t<method name=\"nullValue()Landroid/util/JsonWriter;\"/>\n\t\t<method name=\"setIndent(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setLenient(Z)V\"/>\n\t\t<method name=\"value(D)Landroid/util/JsonWriter;\"/>\n\t\t<method name=\"value(J)Landroid/util/JsonWriter;\"/>\n\t\t<method name=\"value(Ljava/lang/Number;)Landroid/util/JsonWriter;\"/>\n\t\t<method name=\"value(Ljava/lang/String;)Landroid/util/JsonWriter;\"/>\n\t\t<method name=\"value(Z)Landroid/util/JsonWriter;\"/>\n\t</class>\n\t<class name=\"android/util/LayoutDirection\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"INHERIT\"/>\n\t\t<field name=\"LOCALE\"/>\n\t\t<field name=\"LTR\"/>\n\t\t<field name=\"RTL\"/>\n\t</class>\n\t<class name=\"android/util/Log\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"d(Ljava/lang/String;Ljava/lang/String;)I\"/>\n\t\t<method name=\"d(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I\"/>\n\t\t<method name=\"e(Ljava/lang/String;Ljava/lang/String;)I\"/>\n\t\t<method name=\"e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I\"/>\n\t\t<method name=\"getStackTraceString(Ljava/lang/Throwable;)Ljava/lang/String;\"/>\n\t\t<method name=\"i(Ljava/lang/String;Ljava/lang/String;)I\"/>\n\t\t<method name=\"i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I\"/>\n\t\t<method name=\"isLoggable(Ljava/lang/String;I)Z\"/>\n\t\t<method name=\"println(ILjava/lang/String;Ljava/lang/String;)I\"/>\n\t\t<method name=\"v(Ljava/lang/String;Ljava/lang/String;)I\"/>\n\t\t<method name=\"v(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I\"/>\n\t\t<method name=\"w(Ljava/lang/String;Ljava/lang/String;)I\"/>\n\t\t<method name=\"w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I\"/>\n\t\t<method name=\"w(Ljava/lang/String;Ljava/lang/Throwable;)I\"/>\n\t\t<method name=\"wtf(Ljava/lang/String;Ljava/lang/String;)I\" since=\"8\"/>\n\t\t<method name=\"wtf(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I\" since=\"8\"/>\n\t\t<method name=\"wtf(Ljava/lang/String;Ljava/lang/Throwable;)I\" since=\"8\"/>\n\t\t<field name=\"ASSERT\"/>\n\t\t<field name=\"DEBUG\"/>\n\t\t<field name=\"ERROR\"/>\n\t\t<field name=\"INFO\"/>\n\t\t<field name=\"VERBOSE\"/>\n\t\t<field name=\"WARN\"/>\n\t</class>\n\t<class name=\"android/util/LogPrinter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/util/Printer\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/util/LongSparseArray\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"append(JLjava/lang/Object;)V\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"clone()Landroid/util/LongSparseArray;\"/>\n\t\t<method name=\"delete(J)V\"/>\n\t\t<method name=\"get(J)Ljava/lang/Object;\"/>\n\t\t<method name=\"get(JLjava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"indexOfKey(J)I\"/>\n\t\t<method name=\"indexOfValue(Ljava/lang/Object;)I\"/>\n\t\t<method name=\"keyAt(I)J\"/>\n\t\t<method name=\"put(JLjava/lang/Object;)V\"/>\n\t\t<method name=\"remove(J)V\"/>\n\t\t<method name=\"removeAt(I)V\"/>\n\t\t<method name=\"setValueAt(ILjava/lang/Object;)V\"/>\n\t\t<method name=\"size()I\"/>\n\t\t<method name=\"valueAt(I)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"android/util/LruCache\" since=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"create(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"createCount()I\"/>\n\t\t<method name=\"entryRemoved(ZLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"evictAll()V\"/>\n\t\t<method name=\"evictionCount()I\"/>\n\t\t<method name=\"get(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"hitCount()I\"/>\n\t\t<method name=\"maxSize()I\"/>\n\t\t<method name=\"missCount()I\"/>\n\t\t<method name=\"put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"putCount()I\"/>\n\t\t<method name=\"remove(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"resize(I)V\" since=\"21\"/>\n\t\t<method name=\"size()I\"/>\n\t\t<method name=\"sizeOf(Ljava/lang/Object;Ljava/lang/Object;)I\"/>\n\t\t<method name=\"snapshot()Ljava/util/Map;\"/>\n\t\t<method name=\"trimToSize(I)V\" since=\"17\"/>\n\t</class>\n\t<class name=\"android/util/MalformedJsonException\" since=\"11\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/util/MonthDisplayHelper\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"getColumnOf(I)I\"/>\n\t\t<method name=\"getDayAt(II)I\"/>\n\t\t<method name=\"getDigitsForRow(I)[I\"/>\n\t\t<method name=\"getFirstDayOfMonth()I\"/>\n\t\t<method name=\"getMonth()I\"/>\n\t\t<method name=\"getNumberOfDaysInMonth()I\"/>\n\t\t<method name=\"getOffset()I\"/>\n\t\t<method name=\"getRowOf(I)I\"/>\n\t\t<method name=\"getWeekStartDay()I\"/>\n\t\t<method name=\"getYear()I\"/>\n\t\t<method name=\"isWithinCurrentMonth(II)Z\"/>\n\t\t<method name=\"nextMonth()V\"/>\n\t\t<method name=\"previousMonth()V\"/>\n\t</class>\n\t<class name=\"android/util/MutableBoolean\" since=\"21\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Z)V\" deprecated=\"29\"/>\n\t\t<field name=\"value\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/util/MutableByte\" since=\"21\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(B)V\" deprecated=\"29\"/>\n\t\t<field name=\"value\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/util/MutableChar\" since=\"21\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(C)V\" deprecated=\"29\"/>\n\t\t<field name=\"value\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/util/MutableDouble\" since=\"21\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(D)V\" deprecated=\"29\"/>\n\t\t<field name=\"value\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/util/MutableFloat\" since=\"21\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(F)V\" deprecated=\"29\"/>\n\t\t<field name=\"value\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/util/MutableInt\" since=\"21\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\" deprecated=\"29\"/>\n\t\t<field name=\"value\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/util/MutableLong\" since=\"21\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(J)V\" deprecated=\"29\"/>\n\t\t<field name=\"value\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/util/MutableShort\" since=\"21\" deprecated=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(S)V\" deprecated=\"29\"/>\n\t\t<field name=\"value\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/util/NoSuchPropertyException\" since=\"14\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/util/Pair\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"create(Ljava/lang/Object;Ljava/lang/Object;)Landroid/util/Pair;\"/>\n\t\t<field name=\"first\"/>\n\t\t<field name=\"second\"/>\n\t</class>\n\t<class name=\"android/util/Patterns\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"concatGroups(Ljava/util/regex/Matcher;)Ljava/lang/String;\"/>\n\t\t<method name=\"digitsAndPlusOnly(Ljava/util/regex/Matcher;)Ljava/lang/String;\"/>\n\t\t<field name=\"DOMAIN_NAME\"/>\n\t\t<field name=\"EMAIL_ADDRESS\"/>\n\t\t<field name=\"GOOD_IRI_CHAR\" deprecated=\"24\"/>\n\t\t<field name=\"IP_ADDRESS\"/>\n\t\t<field name=\"PHONE\"/>\n\t\t<field name=\"TOP_LEVEL_DOMAIN\" deprecated=\"21\"/>\n\t\t<field name=\"TOP_LEVEL_DOMAIN_STR\" deprecated=\"21\"/>\n\t\t<field name=\"TOP_LEVEL_DOMAIN_STR_FOR_WEB_URL\" deprecated=\"21\"/>\n\t\t<field name=\"WEB_URL\"/>\n\t</class>\n\t<class name=\"android/util/PrintStreamPrinter\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/util/Printer\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/PrintStream;)V\"/>\n\t</class>\n\t<class name=\"android/util/PrintWriterPrinter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/util/Printer\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/PrintWriter;)V\"/>\n\t</class>\n\t<class name=\"android/util/Printer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"println(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/util/Property\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Class;Ljava/lang/String;)V\"/>\n\t\t<method name=\"get(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getType()Ljava/lang/Class;\"/>\n\t\t<method name=\"isReadOnly()Z\"/>\n\t\t<method name=\"of(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/String;)Landroid/util/Property;\"/>\n\t\t<method name=\"set(Ljava/lang/Object;Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"android/util/Range\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Comparable;Ljava/lang/Comparable;)V\"/>\n\t\t<method name=\"clamp(Ljava/lang/Comparable;)Ljava/lang/Comparable;\"/>\n\t\t<method name=\"contains(Landroid/util/Range;)Z\"/>\n\t\t<method name=\"contains(Ljava/lang/Comparable;)Z\"/>\n\t\t<method name=\"create(Ljava/lang/Comparable;Ljava/lang/Comparable;)Landroid/util/Range;\"/>\n\t\t<method name=\"extend(Landroid/util/Range;)Landroid/util/Range;\"/>\n\t\t<method name=\"extend(Ljava/lang/Comparable;)Landroid/util/Range;\"/>\n\t\t<method name=\"extend(Ljava/lang/Comparable;Ljava/lang/Comparable;)Landroid/util/Range;\"/>\n\t\t<method name=\"getLower()Ljava/lang/Comparable;\"/>\n\t\t<method name=\"getUpper()Ljava/lang/Comparable;\"/>\n\t\t<method name=\"intersect(Landroid/util/Range;)Landroid/util/Range;\"/>\n\t\t<method name=\"intersect(Ljava/lang/Comparable;Ljava/lang/Comparable;)Landroid/util/Range;\"/>\n\t</class>\n\t<class name=\"android/util/Rational\" since=\"21\">\n\t\t<extends name=\"java/lang/Number\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"compareTo(Landroid/util/Rational;)I\"/>\n\t\t<method name=\"getDenominator()I\"/>\n\t\t<method name=\"getNumerator()I\"/>\n\t\t<method name=\"isFinite()Z\"/>\n\t\t<method name=\"isInfinite()Z\"/>\n\t\t<method name=\"isNaN()Z\"/>\n\t\t<method name=\"isZero()Z\"/>\n\t\t<method name=\"parseRational(Ljava/lang/String;)Landroid/util/Rational;\"/>\n\t\t<field name=\"NEGATIVE_INFINITY\"/>\n\t\t<field name=\"NaN\"/>\n\t\t<field name=\"POSITIVE_INFINITY\"/>\n\t\t<field name=\"ZERO\"/>\n\t</class>\n\t<class name=\"android/util/Size\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t\t<method name=\"parseSize(Ljava/lang/String;)Landroid/util/Size;\"/>\n\t</class>\n\t<class name=\"android/util/SizeF\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(FF)V\"/>\n\t\t<method name=\"getHeight()F\"/>\n\t\t<method name=\"getWidth()F\"/>\n\t\t<method name=\"parseSizeF(Ljava/lang/String;)Landroid/util/SizeF;\"/>\n\t</class>\n\t<class name=\"android/util/SparseArray\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\" since=\"14\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"append(ILjava/lang/Object;)V\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"clone()Landroid/util/SparseArray;\" since=\"14\"/>\n\t\t<method name=\"delete(I)V\"/>\n\t\t<method name=\"get(I)Ljava/lang/Object;\"/>\n\t\t<method name=\"get(ILjava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"indexOfKey(I)I\"/>\n\t\t<method name=\"indexOfValue(Ljava/lang/Object;)I\"/>\n\t\t<method name=\"keyAt(I)I\"/>\n\t\t<method name=\"put(ILjava/lang/Object;)V\"/>\n\t\t<method name=\"remove(I)V\"/>\n\t\t<method name=\"removeAt(I)V\" since=\"11\"/>\n\t\t<method name=\"removeAtRange(II)V\" since=\"19\"/>\n\t\t<method name=\"setValueAt(ILjava/lang/Object;)V\"/>\n\t\t<method name=\"size()I\"/>\n\t\t<method name=\"valueAt(I)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"android/util/SparseBooleanArray\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\" since=\"14\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"append(IZ)V\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"clone()Landroid/util/SparseBooleanArray;\" since=\"14\"/>\n\t\t<method name=\"delete(I)V\"/>\n\t\t<method name=\"get(I)Z\"/>\n\t\t<method name=\"get(IZ)Z\"/>\n\t\t<method name=\"indexOfKey(I)I\"/>\n\t\t<method name=\"indexOfValue(Z)I\"/>\n\t\t<method name=\"keyAt(I)I\"/>\n\t\t<method name=\"put(IZ)V\"/>\n\t\t<method name=\"removeAt(I)V\" since=\"28\"/>\n\t\t<method name=\"setValueAt(IZ)V\" since=\"29\"/>\n\t\t<method name=\"size()I\"/>\n\t\t<method name=\"valueAt(I)Z\"/>\n\t</class>\n\t<class name=\"android/util/SparseIntArray\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\" since=\"14\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"append(II)V\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"clone()Landroid/util/SparseIntArray;\" since=\"14\"/>\n\t\t<method name=\"delete(I)V\"/>\n\t\t<method name=\"get(I)I\"/>\n\t\t<method name=\"get(II)I\"/>\n\t\t<method name=\"indexOfKey(I)I\"/>\n\t\t<method name=\"indexOfValue(I)I\"/>\n\t\t<method name=\"keyAt(I)I\"/>\n\t\t<method name=\"put(II)V\"/>\n\t\t<method name=\"removeAt(I)V\" since=\"3\"/>\n\t\t<method name=\"setValueAt(II)V\" since=\"29\"/>\n\t\t<method name=\"size()I\"/>\n\t\t<method name=\"valueAt(I)I\"/>\n\t</class>\n\t<class name=\"android/util/SparseLongArray\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"append(IJ)V\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"clone()Landroid/util/SparseLongArray;\"/>\n\t\t<method name=\"delete(I)V\"/>\n\t\t<method name=\"get(I)J\"/>\n\t\t<method name=\"get(IJ)J\"/>\n\t\t<method name=\"indexOfKey(I)I\"/>\n\t\t<method name=\"indexOfValue(J)I\"/>\n\t\t<method name=\"keyAt(I)I\"/>\n\t\t<method name=\"put(IJ)V\"/>\n\t\t<method name=\"removeAt(I)V\"/>\n\t\t<method name=\"size()I\"/>\n\t\t<method name=\"valueAt(I)J\"/>\n\t</class>\n\t<class name=\"android/util/StateSet\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" removed=\"12\"/>\n\t\t<method name=\"dump([I)Ljava/lang/String;\"/>\n\t\t<method name=\"isWildCard([I)Z\"/>\n\t\t<method name=\"stateSetMatches([II)Z\"/>\n\t\t<method name=\"stateSetMatches([I[I)Z\"/>\n\t\t<method name=\"trimStateSet([II)[I\"/>\n\t\t<field name=\"NOTHING\" since=\"11\"/>\n\t\t<field name=\"WILD_CARD\"/>\n\t</class>\n\t<class name=\"android/util/StatsLog\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"logBinaryPushStateChanged(Ljava/lang/String;JII[J)Z\" since=\"29\"/>\n\t\t<method name=\"logEvent(I)Z\"/>\n\t\t<method name=\"logStart(I)Z\"/>\n\t\t<method name=\"logStop(I)Z\"/>\n\t</class>\n\t<class name=\"android/util/StringBuilderPrinter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/util/Printer\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/StringBuilder;)V\"/>\n\t</class>\n\t<class name=\"android/util/TimeFormatException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t</class>\n\t<class name=\"android/util/TimeUtils\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" removed=\"12\"/>\n\t\t<method name=\"getTimeZone(IZJLjava/lang/String;)Ljava/util/TimeZone;\"/>\n\t\t<method name=\"getTimeZoneDatabaseVersion()Ljava/lang/String;\" since=\"3\"/>\n\t\t<method name=\"getTimeZoneIdsForCountryCode(Ljava/lang/String;)Ljava/util/List;\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/util/TimingLogger\" since=\"1\" deprecated=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"30\"/>\n\t\t<method name=\"addSplit(Ljava/lang/String;)V\" deprecated=\"30\"/>\n\t\t<method name=\"dumpToLog()V\" deprecated=\"30\"/>\n\t\t<method name=\"reset()V\" deprecated=\"30\"/>\n\t\t<method name=\"reset(Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"30\"/>\n\t</class>\n\t<class name=\"android/util/TypedValue\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"applyDimension(IFLandroid/util/DisplayMetrics;)F\"/>\n\t\t<method name=\"coerceToString()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"coerceToString(II)Ljava/lang/String;\"/>\n\t\t<method name=\"complexToDimension(ILandroid/util/DisplayMetrics;)F\"/>\n\t\t<method name=\"complexToDimensionNoisy(ILandroid/util/DisplayMetrics;)F\" removed=\"20\"/>\n\t\t<method name=\"complexToDimensionPixelOffset(ILandroid/util/DisplayMetrics;)I\"/>\n\t\t<method name=\"complexToDimensionPixelSize(ILandroid/util/DisplayMetrics;)I\"/>\n\t\t<method name=\"complexToFloat(I)F\"/>\n\t\t<method name=\"complexToFraction(IFF)F\"/>\n\t\t<method name=\"getComplexUnit()I\" since=\"22\"/>\n\t\t<method name=\"getDimension(Landroid/util/DisplayMetrics;)F\"/>\n\t\t<method name=\"getFloat()F\"/>\n\t\t<method name=\"getFraction(FF)F\"/>\n\t\t<method name=\"isColorType()Z\" since=\"29\"/>\n\t\t<method name=\"setTo(Landroid/util/TypedValue;)V\"/>\n\t\t<field name=\"COMPLEX_MANTISSA_MASK\"/>\n\t\t<field name=\"COMPLEX_MANTISSA_SHIFT\"/>\n\t\t<field name=\"COMPLEX_RADIX_0p23\"/>\n\t\t<field name=\"COMPLEX_RADIX_16p7\"/>\n\t\t<field name=\"COMPLEX_RADIX_23p0\"/>\n\t\t<field name=\"COMPLEX_RADIX_8p15\"/>\n\t\t<field name=\"COMPLEX_RADIX_MASK\"/>\n\t\t<field name=\"COMPLEX_RADIX_SHIFT\"/>\n\t\t<field name=\"COMPLEX_UNIT_DIP\"/>\n\t\t<field name=\"COMPLEX_UNIT_FRACTION\"/>\n\t\t<field name=\"COMPLEX_UNIT_FRACTION_PARENT\"/>\n\t\t<field name=\"COMPLEX_UNIT_IN\"/>\n\t\t<field name=\"COMPLEX_UNIT_MASK\"/>\n\t\t<field name=\"COMPLEX_UNIT_MM\"/>\n\t\t<field name=\"COMPLEX_UNIT_PT\"/>\n\t\t<field name=\"COMPLEX_UNIT_PX\"/>\n\t\t<field name=\"COMPLEX_UNIT_SHIFT\"/>\n\t\t<field name=\"COMPLEX_UNIT_SP\"/>\n\t\t<field name=\"DATA_NULL_EMPTY\" since=\"22\"/>\n\t\t<field name=\"DATA_NULL_UNDEFINED\" since=\"22\"/>\n\t\t<field name=\"DENSITY_DEFAULT\" since=\"4\"/>\n\t\t<field name=\"DENSITY_NONE\" since=\"4\"/>\n\t\t<field name=\"TYPE_ATTRIBUTE\"/>\n\t\t<field name=\"TYPE_DIMENSION\"/>\n\t\t<field name=\"TYPE_FIRST_COLOR_INT\"/>\n\t\t<field name=\"TYPE_FIRST_INT\"/>\n\t\t<field name=\"TYPE_FLOAT\"/>\n\t\t<field name=\"TYPE_FRACTION\"/>\n\t\t<field name=\"TYPE_INT_BOOLEAN\"/>\n\t\t<field name=\"TYPE_INT_COLOR_ARGB4\"/>\n\t\t<field name=\"TYPE_INT_COLOR_ARGB8\"/>\n\t\t<field name=\"TYPE_INT_COLOR_RGB4\"/>\n\t\t<field name=\"TYPE_INT_COLOR_RGB8\"/>\n\t\t<field name=\"TYPE_INT_DEC\"/>\n\t\t<field name=\"TYPE_INT_HEX\"/>\n\t\t<field name=\"TYPE_LAST_COLOR_INT\"/>\n\t\t<field name=\"TYPE_LAST_INT\"/>\n\t\t<field name=\"TYPE_NULL\"/>\n\t\t<field name=\"TYPE_REFERENCE\"/>\n\t\t<field name=\"TYPE_STRING\"/>\n\t\t<field name=\"assetCookie\"/>\n\t\t<field name=\"changingConfigurations\"/>\n\t\t<field name=\"data\"/>\n\t\t<field name=\"density\" since=\"4\"/>\n\t\t<field name=\"resourceId\"/>\n\t\t<field name=\"sourceResourceId\" since=\"29\"/>\n\t\t<field name=\"string\"/>\n\t\t<field name=\"type\"/>\n\t</class>\n\t<class name=\"android/util/Xml\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" removed=\"12\"/>\n\t\t<method name=\"asAttributeSet(Lorg/xmlpull/v1/XmlPullParser;)Landroid/util/AttributeSet;\"/>\n\t\t<method name=\"findEncodingByName(Ljava/lang/String;)Landroid/util/Xml$Encoding;\"/>\n\t\t<method name=\"newPullParser()Lorg/xmlpull/v1/XmlPullParser;\"/>\n\t\t<method name=\"newSerializer()Lorg/xmlpull/v1/XmlSerializer;\"/>\n\t\t<method name=\"parse(Ljava/io/InputStream;Landroid/util/Xml$Encoding;Lorg/xml/sax/ContentHandler;)V\"/>\n\t\t<method name=\"parse(Ljava/io/Reader;Lorg/xml/sax/ContentHandler;)V\"/>\n\t\t<method name=\"parse(Ljava/lang/String;Lorg/xml/sax/ContentHandler;)V\"/>\n\t\t<field name=\"FEATURE_RELAXED\"/>\n\t</class>\n\t<class name=\"android/util/Xml$Encoding\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/util/Xml$Encoding;\"/>\n\t\t<method name=\"values()[Landroid/util/Xml$Encoding;\"/>\n\t\t<field name=\"ISO_8859_1\"/>\n\t\t<field name=\"US_ASCII\"/>\n\t\t<field name=\"UTF_16\"/>\n\t\t<field name=\"UTF_8\"/>\n\t</class>\n\t<class name=\"android/util/proto/ProtoOutputStream\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"checkFieldId(JJ)I\"/>\n\t\t<method name=\"dump(Ljava/lang/String;)V\"/>\n\t\t<method name=\"end(J)V\"/>\n\t\t<method name=\"flush()V\"/>\n\t\t<method name=\"getBytes()[B\"/>\n\t\t<method name=\"getFieldCountString(J)Ljava/lang/String;\"/>\n\t\t<method name=\"getFieldIdString(J)Ljava/lang/String;\"/>\n\t\t<method name=\"getFieldTypeString(J)Ljava/lang/String;\"/>\n\t\t<method name=\"getRawSize()I\"/>\n\t\t<method name=\"getWireTypeString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"makeFieldId(IJ)J\"/>\n\t\t<method name=\"makeToken(IZIII)J\"/>\n\t\t<method name=\"start(J)J\"/>\n\t\t<method name=\"token2String(J)Ljava/lang/String;\"/>\n\t\t<method name=\"write(JD)V\"/>\n\t\t<method name=\"write(JF)V\"/>\n\t\t<method name=\"write(JI)V\"/>\n\t\t<method name=\"write(JJ)V\"/>\n\t\t<method name=\"write(JLjava/lang/String;)V\"/>\n\t\t<method name=\"write(JZ)V\"/>\n\t\t<method name=\"write(J[B)V\"/>\n\t\t<method name=\"writeTag(II)V\"/>\n\t\t<field name=\"FIELD_COUNT_MASK\"/>\n\t\t<field name=\"FIELD_COUNT_PACKED\"/>\n\t\t<field name=\"FIELD_COUNT_REPEATED\"/>\n\t\t<field name=\"FIELD_COUNT_SHIFT\"/>\n\t\t<field name=\"FIELD_COUNT_SINGLE\"/>\n\t\t<field name=\"FIELD_COUNT_UNKNOWN\"/>\n\t\t<field name=\"FIELD_ID_SHIFT\"/>\n\t\t<field name=\"FIELD_TYPE_BOOL\"/>\n\t\t<field name=\"FIELD_TYPE_BYTES\"/>\n\t\t<field name=\"FIELD_TYPE_DOUBLE\"/>\n\t\t<field name=\"FIELD_TYPE_ENUM\"/>\n\t\t<field name=\"FIELD_TYPE_FIXED32\"/>\n\t\t<field name=\"FIELD_TYPE_FIXED64\"/>\n\t\t<field name=\"FIELD_TYPE_FLOAT\"/>\n\t\t<field name=\"FIELD_TYPE_INT32\"/>\n\t\t<field name=\"FIELD_TYPE_INT64\"/>\n\t\t<field name=\"FIELD_TYPE_MASK\"/>\n\t\t<field name=\"FIELD_TYPE_MESSAGE\"/>\n\t\t<field name=\"FIELD_TYPE_SFIXED32\"/>\n\t\t<field name=\"FIELD_TYPE_SFIXED64\"/>\n\t\t<field name=\"FIELD_TYPE_SHIFT\"/>\n\t\t<field name=\"FIELD_TYPE_SINT32\"/>\n\t\t<field name=\"FIELD_TYPE_SINT64\"/>\n\t\t<field name=\"FIELD_TYPE_STRING\"/>\n\t\t<field name=\"FIELD_TYPE_UINT32\"/>\n\t\t<field name=\"FIELD_TYPE_UINT64\"/>\n\t\t<field name=\"WIRE_TYPE_END_GROUP\"/>\n\t\t<field name=\"WIRE_TYPE_FIXED32\"/>\n\t\t<field name=\"WIRE_TYPE_FIXED64\"/>\n\t\t<field name=\"WIRE_TYPE_LENGTH_DELIMITED\"/>\n\t\t<field name=\"WIRE_TYPE_MASK\"/>\n\t\t<field name=\"WIRE_TYPE_START_GROUP\"/>\n\t\t<field name=\"WIRE_TYPE_VARINT\"/>\n\t</class>\n\t<class name=\"android/view/AbsSavedState\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;Ljava/lang/ClassLoader;)V\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcelable;)V\"/>\n\t\t<method name=\"getSuperState()Landroid/os/Parcelable;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"EMPTY_STATE\"/>\n\t</class>\n\t<class name=\"android/view/ActionMode\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"finish()V\"/>\n\t\t<method name=\"getCustomView()Landroid/view/View;\"/>\n\t\t<method name=\"getMenu()Landroid/view/Menu;\"/>\n\t\t<method name=\"getMenuInflater()Landroid/view/MenuInflater;\"/>\n\t\t<method name=\"getSubtitle()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTag()Ljava/lang/Object;\" since=\"14\"/>\n\t\t<method name=\"getTitle()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTitleOptionalHint()Z\" since=\"16\"/>\n\t\t<method name=\"getType()I\" since=\"23\"/>\n\t\t<method name=\"hide(J)V\" since=\"23\"/>\n\t\t<method name=\"invalidate()V\"/>\n\t\t<method name=\"invalidateContentRect()V\" since=\"23\"/>\n\t\t<method name=\"isTitleOptional()Z\" since=\"16\"/>\n\t\t<method name=\"onWindowFocusChanged(Z)V\" since=\"23\"/>\n\t\t<method name=\"setCustomView(Landroid/view/View;)V\"/>\n\t\t<method name=\"setSubtitle(I)V\"/>\n\t\t<method name=\"setSubtitle(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setTag(Ljava/lang/Object;)V\" since=\"14\"/>\n\t\t<method name=\"setTitle(I)V\"/>\n\t\t<method name=\"setTitle(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setTitleOptionalHint(Z)V\" since=\"16\"/>\n\t\t<method name=\"setType(I)V\" since=\"23\"/>\n\t\t<field name=\"DEFAULT_HIDE_DURATION\" since=\"23\"/>\n\t\t<field name=\"TYPE_FLOATING\" since=\"23\"/>\n\t\t<field name=\"TYPE_PRIMARY\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/view/ActionMode$Callback\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onActionItemClicked(Landroid/view/ActionMode;Landroid/view/MenuItem;)Z\"/>\n\t\t<method name=\"onCreateActionMode(Landroid/view/ActionMode;Landroid/view/Menu;)Z\"/>\n\t\t<method name=\"onDestroyActionMode(Landroid/view/ActionMode;)V\"/>\n\t\t<method name=\"onPrepareActionMode(Landroid/view/ActionMode;Landroid/view/Menu;)Z\"/>\n\t</class>\n\t<class name=\"android/view/ActionMode$Callback2\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/view/ActionMode$Callback\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onGetContentRect(Landroid/view/ActionMode;Landroid/view/View;Landroid/graphics/Rect;)V\"/>\n\t</class>\n\t<class name=\"android/view/ActionProvider\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"hasSubMenu()Z\"/>\n\t\t<method name=\"isVisible()Z\" since=\"16\"/>\n\t\t<method name=\"onCreateActionView()Landroid/view/View;\" deprecated=\"16\"/>\n\t\t<method name=\"onCreateActionView(Landroid/view/MenuItem;)Landroid/view/View;\" since=\"16\"/>\n\t\t<method name=\"onPerformDefaultAction()Z\"/>\n\t\t<method name=\"onPrepareSubMenu(Landroid/view/SubMenu;)V\"/>\n\t\t<method name=\"overridesItemVisibility()Z\" since=\"16\"/>\n\t\t<method name=\"refreshVisibility()V\" since=\"16\"/>\n\t\t<method name=\"setVisibilityListener(Landroid/view/ActionProvider$VisibilityListener;)V\" since=\"16\"/>\n\t</class>\n\t<class name=\"android/view/ActionProvider$VisibilityListener\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onActionProviderVisibilityChanged(Z)V\"/>\n\t</class>\n\t<class name=\"android/view/Choreographer\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getInstance()Landroid/view/Choreographer;\"/>\n\t\t<method name=\"postFrameCallback(Landroid/view/Choreographer$FrameCallback;)V\"/>\n\t\t<method name=\"postFrameCallbackDelayed(Landroid/view/Choreographer$FrameCallback;J)V\"/>\n\t\t<method name=\"removeFrameCallback(Landroid/view/Choreographer$FrameCallback;)V\"/>\n\t</class>\n\t<class name=\"android/view/Choreographer$FrameCallback\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"doFrame(J)V\"/>\n\t</class>\n\t<class name=\"android/view/CollapsibleActionView\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onActionViewCollapsed()V\"/>\n\t\t<method name=\"onActionViewExpanded()V\"/>\n\t</class>\n\t<class name=\"android/view/ContextMenu\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/view/Menu\"/>\n\t\t<method name=\"clearHeader()V\"/>\n\t\t<method name=\"setHeaderIcon(I)Landroid/view/ContextMenu;\"/>\n\t\t<method name=\"setHeaderIcon(Landroid/graphics/drawable/Drawable;)Landroid/view/ContextMenu;\"/>\n\t\t<method name=\"setHeaderTitle(I)Landroid/view/ContextMenu;\"/>\n\t\t<method name=\"setHeaderTitle(Ljava/lang/CharSequence;)Landroid/view/ContextMenu;\"/>\n\t\t<method name=\"setHeaderView(Landroid/view/View;)Landroid/view/ContextMenu;\"/>\n\t</class>\n\t<class name=\"android/view/ContextMenu$ContextMenuInfo\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/view/ContextThemeWrapper\" since=\"1\">\n\t\t<extends name=\"android/content/ContextWrapper\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/content/res/Resources$Theme;)V\" since=\"23\"/>\n\t\t<method name=\"applyOverrideConfiguration(Landroid/content/res/Configuration;)V\" since=\"17\"/>\n\t\t<method name=\"onApplyThemeResource(Landroid/content/res/Resources$Theme;IZ)V\"/>\n\t\t<method name=\"setTheme(Landroid/content/res/Resources$Theme;)V\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/view/Display\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAppVsyncOffsetNanos()J\" since=\"21\"/>\n\t\t<method name=\"getCurrentSizeRange(Landroid/graphics/Point;Landroid/graphics/Point;)V\" since=\"16\"/>\n\t\t<method name=\"getCutout()Landroid/view/DisplayCutout;\" since=\"29\"/>\n\t\t<method name=\"getDisplayId()I\"/>\n\t\t<method name=\"getFlags()I\" since=\"17\"/>\n\t\t<method name=\"getHdrCapabilities()Landroid/view/Display$HdrCapabilities;\" since=\"24\"/>\n\t\t<method name=\"getHeight()I\" deprecated=\"15\"/>\n\t\t<method name=\"getMetrics(Landroid/util/DisplayMetrics;)V\"/>\n\t\t<method name=\"getMode()Landroid/view/Display$Mode;\" since=\"23\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\" since=\"17\"/>\n\t\t<method name=\"getOrientation()I\" deprecated=\"15\"/>\n\t\t<method name=\"getPixelFormat()I\" deprecated=\"17\"/>\n\t\t<method name=\"getPreferredWideGamutColorSpace()Landroid/graphics/ColorSpace;\" since=\"29\"/>\n\t\t<method name=\"getPresentationDeadlineNanos()J\" since=\"21\"/>\n\t\t<method name=\"getRealMetrics(Landroid/util/DisplayMetrics;)V\" since=\"17\"/>\n\t\t<method name=\"getRealSize(Landroid/graphics/Point;)V\" since=\"17\"/>\n\t\t<method name=\"getRectSize(Landroid/graphics/Rect;)V\" since=\"13\"/>\n\t\t<method name=\"getRefreshRate()F\"/>\n\t\t<method name=\"getRotation()I\" since=\"8\"/>\n\t\t<method name=\"getSize(Landroid/graphics/Point;)V\" since=\"13\"/>\n\t\t<method name=\"getState()I\" since=\"20\"/>\n\t\t<method name=\"getSupportedModes()[Landroid/view/Display$Mode;\" since=\"23\"/>\n\t\t<method name=\"getSupportedRefreshRates()[F\" since=\"21\" deprecated=\"23\"/>\n\t\t<method name=\"getWidth()I\" deprecated=\"15\"/>\n\t\t<method name=\"isHdr()Z\" since=\"26\"/>\n\t\t<method name=\"isValid()Z\" since=\"17\"/>\n\t\t<method name=\"isWideColorGamut()Z\" since=\"26\"/>\n\t\t<field name=\"DEFAULT_DISPLAY\"/>\n\t\t<field name=\"FLAG_PRESENTATION\" since=\"19\"/>\n\t\t<field name=\"FLAG_PRIVATE\" since=\"19\"/>\n\t\t<field name=\"FLAG_ROUND\" since=\"23\"/>\n\t\t<field name=\"FLAG_SECURE\" since=\"17\"/>\n\t\t<field name=\"FLAG_SUPPORTS_PROTECTED_BUFFERS\" since=\"17\"/>\n\t\t<field name=\"INVALID_DISPLAY\" since=\"23\"/>\n\t\t<field name=\"STATE_DOZE\" since=\"21\"/>\n\t\t<field name=\"STATE_DOZE_SUSPEND\" since=\"21\"/>\n\t\t<field name=\"STATE_DOZING\" since=\"20\" removed=\"21\"/>\n\t\t<field name=\"STATE_OFF\" since=\"20\"/>\n\t\t<field name=\"STATE_ON\" since=\"20\"/>\n\t\t<field name=\"STATE_ON_SUSPEND\" since=\"28\"/>\n\t\t<field name=\"STATE_UNKNOWN\" since=\"20\"/>\n\t\t<field name=\"STATE_VR\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/view/Display$HdrCapabilities\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getDesiredMaxAverageLuminance()F\"/>\n\t\t<method name=\"getDesiredMaxLuminance()F\"/>\n\t\t<method name=\"getDesiredMinLuminance()F\"/>\n\t\t<method name=\"getSupportedHdrTypes()[I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"HDR_TYPE_DOLBY_VISION\"/>\n\t\t<field name=\"HDR_TYPE_HDR10\"/>\n\t\t<field name=\"HDR_TYPE_HDR10_PLUS\" since=\"29\"/>\n\t\t<field name=\"HDR_TYPE_HLG\"/>\n\t\t<field name=\"INVALID_LUMINANCE\"/>\n\t</class>\n\t<class name=\"android/view/Display$Mode\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getModeId()I\"/>\n\t\t<method name=\"getPhysicalHeight()I\"/>\n\t\t<method name=\"getPhysicalWidth()I\"/>\n\t\t<method name=\"getRefreshRate()F\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/DisplayCutout\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Insets;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;)V\" since=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Rect;Ljava/util/List;)V\" deprecated=\"29\"/>\n\t\t<method name=\"getBoundingRectBottom()Landroid/graphics/Rect;\" since=\"29\"/>\n\t\t<method name=\"getBoundingRectLeft()Landroid/graphics/Rect;\" since=\"29\"/>\n\t\t<method name=\"getBoundingRectRight()Landroid/graphics/Rect;\" since=\"29\"/>\n\t\t<method name=\"getBoundingRectTop()Landroid/graphics/Rect;\" since=\"29\"/>\n\t\t<method name=\"getBoundingRects()Ljava/util/List;\"/>\n\t\t<method name=\"getSafeInsetBottom()I\"/>\n\t\t<method name=\"getSafeInsetLeft()I\"/>\n\t\t<method name=\"getSafeInsetRight()I\"/>\n\t\t<method name=\"getSafeInsetTop()I\"/>\n\t</class>\n\t<class name=\"android/view/DragAndDropPermissions\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/DragEvent\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getAction()I\"/>\n\t\t<method name=\"getClipData()Landroid/content/ClipData;\"/>\n\t\t<method name=\"getClipDescription()Landroid/content/ClipDescription;\"/>\n\t\t<method name=\"getLocalState()Ljava/lang/Object;\"/>\n\t\t<method name=\"getResult()Z\"/>\n\t\t<method name=\"getX()F\"/>\n\t\t<method name=\"getY()F\"/>\n\t\t<field name=\"ACTION_DRAG_ENDED\"/>\n\t\t<field name=\"ACTION_DRAG_ENTERED\"/>\n\t\t<field name=\"ACTION_DRAG_EXITED\"/>\n\t\t<field name=\"ACTION_DRAG_LOCATION\"/>\n\t\t<field name=\"ACTION_DRAG_STARTED\"/>\n\t\t<field name=\"ACTION_DROP\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/FocusFinder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"findNearestTouchable(Landroid/view/ViewGroup;III[I)Landroid/view/View;\"/>\n\t\t<method name=\"findNextFocus(Landroid/view/ViewGroup;Landroid/view/View;I)Landroid/view/View;\"/>\n\t\t<method name=\"findNextFocusFromRect(Landroid/view/ViewGroup;Landroid/graphics/Rect;I)Landroid/view/View;\"/>\n\t\t<method name=\"findNextKeyboardNavigationCluster(Landroid/view/View;Landroid/view/View;I)Landroid/view/View;\" since=\"26\"/>\n\t\t<method name=\"getInstance()Landroid/view/FocusFinder;\"/>\n\t</class>\n\t<class name=\"android/view/FrameMetrics\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/FrameMetrics;)V\"/>\n\t\t<method name=\"getMetric(I)J\"/>\n\t\t<field name=\"ANIMATION_DURATION\"/>\n\t\t<field name=\"COMMAND_ISSUE_DURATION\"/>\n\t\t<field name=\"DRAW_DURATION\"/>\n\t\t<field name=\"FIRST_DRAW_FRAME\"/>\n\t\t<field name=\"INPUT_HANDLING_DURATION\"/>\n\t\t<field name=\"INTENDED_VSYNC_TIMESTAMP\" since=\"26\"/>\n\t\t<field name=\"LAYOUT_MEASURE_DURATION\"/>\n\t\t<field name=\"SWAP_BUFFERS_DURATION\"/>\n\t\t<field name=\"SYNC_DURATION\"/>\n\t\t<field name=\"TOTAL_DURATION\"/>\n\t\t<field name=\"UNKNOWN_DELAY_DURATION\"/>\n\t\t<field name=\"VSYNC_TIMESTAMP\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/view/FrameStats\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getEndTimeNano()J\"/>\n\t\t<method name=\"getFrameCount()I\"/>\n\t\t<method name=\"getFramePresentedTimeNano(I)J\"/>\n\t\t<method name=\"getRefreshPeriodNano()J\"/>\n\t\t<method name=\"getStartTimeNano()J\"/>\n\t\t<field name=\"UNDEFINED_TIME_NANO\"/>\n\t</class>\n\t<class name=\"android/view/GestureDetector\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/view/GestureDetector$OnGestureListener;)V\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/view/GestureDetector$OnGestureListener;Landroid/os/Handler;)V\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/view/GestureDetector$OnGestureListener;Landroid/os/Handler;Z)V\" since=\"8\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/GestureDetector$OnGestureListener;)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/GestureDetector$OnGestureListener;Landroid/os/Handler;)V\" deprecated=\"15\"/>\n\t\t<method name=\"isLongpressEnabled()Z\"/>\n\t\t<method name=\"onGenericMotionEvent(Landroid/view/MotionEvent;)Z\" since=\"23\"/>\n\t\t<method name=\"onTouchEvent(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"setContextClickListener(Landroid/view/GestureDetector$OnContextClickListener;)V\" since=\"23\"/>\n\t\t<method name=\"setIsLongpressEnabled(Z)V\"/>\n\t\t<method name=\"setOnDoubleTapListener(Landroid/view/GestureDetector$OnDoubleTapListener;)V\" since=\"3\"/>\n\t</class>\n\t<class name=\"android/view/GestureDetector$OnContextClickListener\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onContextClick(Landroid/view/MotionEvent;)Z\"/>\n\t</class>\n\t<class name=\"android/view/GestureDetector$OnDoubleTapListener\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDoubleTap(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"onDoubleTapEvent(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"onSingleTapConfirmed(Landroid/view/MotionEvent;)Z\"/>\n\t</class>\n\t<class name=\"android/view/GestureDetector$OnGestureListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDown(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"onFling(Landroid/view/MotionEvent;Landroid/view/MotionEvent;FF)Z\"/>\n\t\t<method name=\"onLongPress(Landroid/view/MotionEvent;)V\"/>\n\t\t<method name=\"onScroll(Landroid/view/MotionEvent;Landroid/view/MotionEvent;FF)Z\"/>\n\t\t<method name=\"onShowPress(Landroid/view/MotionEvent;)V\"/>\n\t\t<method name=\"onSingleTapUp(Landroid/view/MotionEvent;)Z\"/>\n\t</class>\n\t<class name=\"android/view/GestureDetector$SimpleOnGestureListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/view/GestureDetector$OnContextClickListener\" since=\"23\"/>\n\t\t<implements name=\"android/view/GestureDetector$OnDoubleTapListener\" since=\"3\"/>\n\t\t<implements name=\"android/view/GestureDetector$OnGestureListener\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/view/Gravity\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"apply(IIILandroid/graphics/Rect;IILandroid/graphics/Rect;)V\"/>\n\t\t<method name=\"apply(IIILandroid/graphics/Rect;IILandroid/graphics/Rect;I)V\" since=\"17\"/>\n\t\t<method name=\"apply(IIILandroid/graphics/Rect;Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"apply(IIILandroid/graphics/Rect;Landroid/graphics/Rect;I)V\" since=\"17\"/>\n\t\t<method name=\"applyDisplay(ILandroid/graphics/Rect;Landroid/graphics/Rect;)V\" since=\"3\"/>\n\t\t<method name=\"applyDisplay(ILandroid/graphics/Rect;Landroid/graphics/Rect;I)V\" since=\"17\"/>\n\t\t<method name=\"getAbsoluteGravity(II)I\" since=\"14\"/>\n\t\t<method name=\"isHorizontal(I)Z\"/>\n\t\t<method name=\"isVertical(I)Z\"/>\n\t\t<field name=\"AXIS_CLIP\" since=\"3\"/>\n\t\t<field name=\"AXIS_PULL_AFTER\"/>\n\t\t<field name=\"AXIS_PULL_BEFORE\"/>\n\t\t<field name=\"AXIS_SPECIFIED\"/>\n\t\t<field name=\"AXIS_X_SHIFT\"/>\n\t\t<field name=\"AXIS_Y_SHIFT\"/>\n\t\t<field name=\"BOTTOM\"/>\n\t\t<field name=\"CENTER\"/>\n\t\t<field name=\"CENTER_HORIZONTAL\"/>\n\t\t<field name=\"CENTER_VERTICAL\"/>\n\t\t<field name=\"CLIP_HORIZONTAL\" since=\"3\"/>\n\t\t<field name=\"CLIP_VERTICAL\" since=\"3\"/>\n\t\t<field name=\"DISPLAY_CLIP_HORIZONTAL\" since=\"3\"/>\n\t\t<field name=\"DISPLAY_CLIP_VERTICAL\" since=\"3\"/>\n\t\t<field name=\"END\" since=\"14\"/>\n\t\t<field name=\"FILL\"/>\n\t\t<field name=\"FILL_HORIZONTAL\"/>\n\t\t<field name=\"FILL_VERTICAL\"/>\n\t\t<field name=\"HORIZONTAL_GRAVITY_MASK\"/>\n\t\t<field name=\"LEFT\"/>\n\t\t<field name=\"NO_GRAVITY\"/>\n\t\t<field name=\"RELATIVE_HORIZONTAL_GRAVITY_MASK\" since=\"14\"/>\n\t\t<field name=\"RELATIVE_LAYOUT_DIRECTION\" since=\"14\"/>\n\t\t<field name=\"RIGHT\"/>\n\t\t<field name=\"START\" since=\"14\"/>\n\t\t<field name=\"TOP\"/>\n\t\t<field name=\"VERTICAL_GRAVITY_MASK\"/>\n\t</class>\n\t<class name=\"android/view/HapticFeedbackConstants\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CLOCK_TICK\" since=\"21\"/>\n\t\t<field name=\"CONTEXT_CLICK\" since=\"23\"/>\n\t\t<field name=\"FLAG_IGNORE_GLOBAL_SETTING\"/>\n\t\t<field name=\"FLAG_IGNORE_VIEW_SETTING\"/>\n\t\t<field name=\"KEYBOARD_PRESS\" since=\"27\"/>\n\t\t<field name=\"KEYBOARD_RELEASE\" since=\"27\"/>\n\t\t<field name=\"KEYBOARD_TAP\" since=\"8\"/>\n\t\t<field name=\"LONG_PRESS\"/>\n\t\t<field name=\"TEXT_HANDLE_MOVE\" since=\"27\"/>\n\t\t<field name=\"VIRTUAL_KEY\" since=\"5\"/>\n\t\t<field name=\"VIRTUAL_KEY_RELEASE\" since=\"27\"/>\n\t</class>\n\t<class name=\"android/view/InflateException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"android/view/InputDevice\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getControllerNumber()I\" since=\"19\"/>\n\t\t<method name=\"getDescriptor()Ljava/lang/String;\" since=\"16\"/>\n\t\t<method name=\"getDevice(I)Landroid/view/InputDevice;\"/>\n\t\t<method name=\"getDeviceIds()[I\"/>\n\t\t<method name=\"getId()I\"/>\n\t\t<method name=\"getKeyCharacterMap()Landroid/view/KeyCharacterMap;\"/>\n\t\t<method name=\"getKeyboardType()I\"/>\n\t\t<method name=\"getMotionRange(I)Landroid/view/InputDevice$MotionRange;\"/>\n\t\t<method name=\"getMotionRange(II)Landroid/view/InputDevice$MotionRange;\" since=\"12\"/>\n\t\t<method name=\"getMotionRanges()Ljava/util/List;\" since=\"12\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getProductId()I\" since=\"19\"/>\n\t\t<method name=\"getSources()I\"/>\n\t\t<method name=\"getVendorId()I\" since=\"19\"/>\n\t\t<method name=\"getVibrator()Landroid/os/Vibrator;\" since=\"16\"/>\n\t\t<method name=\"hasKeys([I)[Z\" since=\"19\"/>\n\t\t<method name=\"hasMicrophone()Z\" since=\"23\"/>\n\t\t<method name=\"isEnabled()Z\" since=\"27\"/>\n\t\t<method name=\"isExternal()Z\" since=\"29\"/>\n\t\t<method name=\"isVirtual()Z\" since=\"16\"/>\n\t\t<method name=\"supportsSource(I)Z\" since=\"21\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"KEYBOARD_TYPE_ALPHABETIC\"/>\n\t\t<field name=\"KEYBOARD_TYPE_NONE\"/>\n\t\t<field name=\"KEYBOARD_TYPE_NON_ALPHABETIC\"/>\n\t\t<field name=\"MOTION_RANGE_ORIENTATION\" deprecated=\"15\"/>\n\t\t<field name=\"MOTION_RANGE_PRESSURE\" deprecated=\"15\"/>\n\t\t<field name=\"MOTION_RANGE_SIZE\" deprecated=\"15\"/>\n\t\t<field name=\"MOTION_RANGE_TOOL_MAJOR\" deprecated=\"15\"/>\n\t\t<field name=\"MOTION_RANGE_TOOL_MINOR\" deprecated=\"15\"/>\n\t\t<field name=\"MOTION_RANGE_TOUCH_MAJOR\" deprecated=\"15\"/>\n\t\t<field name=\"MOTION_RANGE_TOUCH_MINOR\" deprecated=\"15\"/>\n\t\t<field name=\"MOTION_RANGE_X\" deprecated=\"15\"/>\n\t\t<field name=\"MOTION_RANGE_Y\" deprecated=\"15\"/>\n\t\t<field name=\"SOURCE_ANY\"/>\n\t\t<field name=\"SOURCE_BLUETOOTH_STYLUS\" since=\"23\"/>\n\t\t<field name=\"SOURCE_CLASS_BUTTON\"/>\n\t\t<field name=\"SOURCE_CLASS_JOYSTICK\" since=\"12\"/>\n\t\t<field name=\"SOURCE_CLASS_MASK\"/>\n\t\t<field name=\"SOURCE_CLASS_NONE\" since=\"18\"/>\n\t\t<field name=\"SOURCE_CLASS_POINTER\"/>\n\t\t<field name=\"SOURCE_CLASS_POSITION\"/>\n\t\t<field name=\"SOURCE_CLASS_TRACKBALL\"/>\n\t\t<field name=\"SOURCE_DPAD\"/>\n\t\t<field name=\"SOURCE_GAMEPAD\" since=\"12\"/>\n\t\t<field name=\"SOURCE_HDMI\" since=\"21\"/>\n\t\t<field name=\"SOURCE_JOYSTICK\" since=\"12\"/>\n\t\t<field name=\"SOURCE_KEYBOARD\"/>\n\t\t<field name=\"SOURCE_MOUSE\"/>\n\t\t<field name=\"SOURCE_MOUSE_RELATIVE\" since=\"26\"/>\n\t\t<field name=\"SOURCE_ROTARY_ENCODER\" since=\"26\"/>\n\t\t<field name=\"SOURCE_STYLUS\" since=\"14\"/>\n\t\t<field name=\"SOURCE_TOUCHPAD\"/>\n\t\t<field name=\"SOURCE_TOUCHSCREEN\"/>\n\t\t<field name=\"SOURCE_TOUCH_NAVIGATION\" since=\"18\"/>\n\t\t<field name=\"SOURCE_TRACKBALL\"/>\n\t\t<field name=\"SOURCE_UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/view/InputDevice$MotionRange\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAxis()I\" since=\"12\"/>\n\t\t<method name=\"getFlat()F\"/>\n\t\t<method name=\"getFuzz()F\"/>\n\t\t<method name=\"getMax()F\"/>\n\t\t<method name=\"getMin()F\"/>\n\t\t<method name=\"getRange()F\"/>\n\t\t<method name=\"getResolution()F\" since=\"18\"/>\n\t\t<method name=\"getSource()I\" since=\"12\"/>\n\t\t<method name=\"isFromSource(I)Z\" since=\"18\"/>\n\t</class>\n\t<class name=\"android/view/InputEvent\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getDevice()Landroid/view/InputDevice;\"/>\n\t\t<method name=\"getDeviceId()I\"/>\n\t\t<method name=\"getEventTime()J\" since=\"16\"/>\n\t\t<method name=\"getSource()I\"/>\n\t\t<method name=\"isFromSource(I)Z\" since=\"18\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/InputQueue\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/view/InputQueue$Callback\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onInputQueueCreated(Landroid/view/InputQueue;)V\"/>\n\t\t<method name=\"onInputQueueDestroyed(Landroid/view/InputQueue;)V\"/>\n\t</class>\n\t<class name=\"android/view/KeyCharacterMap\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\" since=\"16\"/>\n\t\t<method name=\"deviceHasKey(I)Z\" since=\"3\"/>\n\t\t<method name=\"deviceHasKeys([I)[Z\" since=\"3\"/>\n\t\t<method name=\"get(II)I\"/>\n\t\t<method name=\"getDeadChar(II)I\"/>\n\t\t<method name=\"getDisplayLabel(I)C\"/>\n\t\t<method name=\"getEvents([C)[Landroid/view/KeyEvent;\"/>\n\t\t<method name=\"getKeyData(ILandroid/view/KeyCharacterMap$KeyData;)Z\" deprecated=\"15\"/>\n\t\t<method name=\"getKeyboardType()I\"/>\n\t\t<method name=\"getMatch(I[C)C\"/>\n\t\t<method name=\"getMatch(I[CI)C\"/>\n\t\t<method name=\"getModifierBehavior()I\" since=\"11\"/>\n\t\t<method name=\"getNumber(I)C\"/>\n\t\t<method name=\"isPrintingKey(I)Z\"/>\n\t\t<method name=\"load(I)Landroid/view/KeyCharacterMap;\"/>\n\t\t<field name=\"ALPHA\"/>\n\t\t<field name=\"BUILT_IN_KEYBOARD\" deprecated=\"15\"/>\n\t\t<field name=\"COMBINING_ACCENT\"/>\n\t\t<field name=\"COMBINING_ACCENT_MASK\"/>\n\t\t<field name=\"CREATOR\" since=\"16\"/>\n\t\t<field name=\"FULL\" since=\"11\"/>\n\t\t<field name=\"HEX_INPUT\"/>\n\t\t<field name=\"MODIFIER_BEHAVIOR_CHORDED\" since=\"11\"/>\n\t\t<field name=\"MODIFIER_BEHAVIOR_CHORDED_OR_TOGGLED\" since=\"11\"/>\n\t\t<field name=\"NUMERIC\"/>\n\t\t<field name=\"PICKER_DIALOG_INPUT\"/>\n\t\t<field name=\"PREDICTIVE\"/>\n\t\t<field name=\"SPECIAL_FUNCTION\" since=\"11\"/>\n\t\t<field name=\"VIRTUAL_KEYBOARD\" since=\"11\"/>\n\t</class>\n\t<class name=\"android/view/KeyCharacterMap$KeyData\" since=\"1\" deprecated=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<field name=\"META_LENGTH\" deprecated=\"29\"/>\n\t\t<field name=\"displayLabel\" deprecated=\"29\"/>\n\t\t<field name=\"meta\" deprecated=\"29\"/>\n\t\t<field name=\"number\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/view/KeyCharacterMap$UnavailableException\" since=\"11\">\n\t\t<extends name=\"android/util/AndroidRuntimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/view/KeyEvent\" since=\"1\">\n\t\t<extends name=\"android/view/InputEvent\" since=\"9\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"9\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(JJIII)V\"/>\n\t\t<method name=\"&lt;init>(JJIIII)V\"/>\n\t\t<method name=\"&lt;init>(JJIIIIII)V\"/>\n\t\t<method name=\"&lt;init>(JJIIIIIII)V\"/>\n\t\t<method name=\"&lt;init>(JJIIIIIIII)V\" since=\"9\"/>\n\t\t<method name=\"&lt;init>(JLjava/lang/String;II)V\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/KeyEvent;)V\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/KeyEvent;JI)V\" deprecated=\"15\"/>\n\t\t<method name=\"changeAction(Landroid/view/KeyEvent;I)Landroid/view/KeyEvent;\" since=\"3\"/>\n\t\t<method name=\"changeFlags(Landroid/view/KeyEvent;I)Landroid/view/KeyEvent;\" since=\"3\"/>\n\t\t<method name=\"changeTimeRepeat(Landroid/view/KeyEvent;JI)Landroid/view/KeyEvent;\" since=\"3\"/>\n\t\t<method name=\"changeTimeRepeat(Landroid/view/KeyEvent;JII)Landroid/view/KeyEvent;\" since=\"5\"/>\n\t\t<method name=\"dispatch(Landroid/view/KeyEvent$Callback;)Z\" deprecated=\"15\"/>\n\t\t<method name=\"dispatch(Landroid/view/KeyEvent$Callback;Landroid/view/KeyEvent$DispatcherState;Ljava/lang/Object;)Z\" since=\"5\"/>\n\t\t<method name=\"getAction()I\"/>\n\t\t<method name=\"getCharacters()Ljava/lang/String;\" since=\"3\" deprecated=\"29\"/>\n\t\t<method name=\"getDeadChar(II)I\"/>\n\t\t<method name=\"getDeviceId()I\"/>\n\t\t<method name=\"getDisplayLabel()C\"/>\n\t\t<method name=\"getDownTime()J\"/>\n\t\t<method name=\"getEventTime()J\"/>\n\t\t<method name=\"getFlags()I\"/>\n\t\t<method name=\"getKeyCharacterMap()Landroid/view/KeyCharacterMap;\" since=\"11\"/>\n\t\t<method name=\"getKeyCode()I\"/>\n\t\t<method name=\"getKeyData(Landroid/view/KeyCharacterMap$KeyData;)Z\" deprecated=\"15\"/>\n\t\t<method name=\"getMatch([C)C\"/>\n\t\t<method name=\"getMatch([CI)C\"/>\n\t\t<method name=\"getMaxKeyCode()I\" since=\"3\"/>\n\t\t<method name=\"getMetaState()I\"/>\n\t\t<method name=\"getModifierMetaStateMask()I\" since=\"11\"/>\n\t\t<method name=\"getModifiers()I\" since=\"13\"/>\n\t\t<method name=\"getNumber()C\"/>\n\t\t<method name=\"getRepeatCount()I\"/>\n\t\t<method name=\"getScanCode()I\"/>\n\t\t<method name=\"getUnicodeChar()I\"/>\n\t\t<method name=\"getUnicodeChar(I)I\"/>\n\t\t<method name=\"hasModifiers(I)Z\" since=\"11\"/>\n\t\t<method name=\"hasNoModifiers()Z\" since=\"11\"/>\n\t\t<method name=\"isAltPressed()Z\"/>\n\t\t<method name=\"isCanceled()Z\" since=\"5\"/>\n\t\t<method name=\"isCapsLockOn()Z\" since=\"11\"/>\n\t\t<method name=\"isCtrlPressed()Z\" since=\"11\"/>\n\t\t<method name=\"isFunctionPressed()Z\" since=\"11\"/>\n\t\t<method name=\"isGamepadButton(I)Z\" since=\"12\"/>\n\t\t<method name=\"isLongPress()Z\" since=\"5\"/>\n\t\t<method name=\"isMetaPressed()Z\" since=\"11\"/>\n\t\t<method name=\"isModifierKey(I)Z\"/>\n\t\t<method name=\"isNumLockOn()Z\" since=\"11\"/>\n\t\t<method name=\"isPrintingKey()Z\"/>\n\t\t<method name=\"isScrollLockOn()Z\" since=\"11\"/>\n\t\t<method name=\"isShiftPressed()Z\"/>\n\t\t<method name=\"isSymPressed()Z\"/>\n\t\t<method name=\"isSystem()Z\"/>\n\t\t<method name=\"isTracking()Z\" since=\"5\"/>\n\t\t<method name=\"keyCodeFromString(Ljava/lang/String;)I\" since=\"12\"/>\n\t\t<method name=\"keyCodeToString(I)Ljava/lang/String;\" since=\"12\"/>\n\t\t<method name=\"metaStateHasModifiers(II)Z\" since=\"11\"/>\n\t\t<method name=\"metaStateHasNoModifiers(I)Z\" since=\"11\"/>\n\t\t<method name=\"normalizeMetaState(I)I\" since=\"11\"/>\n\t\t<method name=\"setSource(I)V\" since=\"12\"/>\n\t\t<method name=\"startTracking()V\" since=\"5\"/>\n\t\t<field name=\"ACTION_DOWN\"/>\n\t\t<field name=\"ACTION_MULTIPLE\" deprecated=\"29\"/>\n\t\t<field name=\"ACTION_UP\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FLAG_CANCELED\" since=\"5\"/>\n\t\t<field name=\"FLAG_CANCELED_LONG_PRESS\" since=\"5\"/>\n\t\t<field name=\"FLAG_EDITOR_ACTION\" since=\"3\"/>\n\t\t<field name=\"FLAG_FALLBACK\" since=\"11\"/>\n\t\t<field name=\"FLAG_FROM_SYSTEM\" since=\"3\"/>\n\t\t<field name=\"FLAG_KEEP_TOUCH_MODE\" since=\"3\"/>\n\t\t<field name=\"FLAG_LONG_PRESS\" since=\"5\"/>\n\t\t<field name=\"FLAG_SOFT_KEYBOARD\" since=\"3\"/>\n\t\t<field name=\"FLAG_TRACKING\" since=\"5\"/>\n\t\t<field name=\"FLAG_VIRTUAL_HARD_KEY\" since=\"5\"/>\n\t\t<field name=\"FLAG_WOKE_HERE\" deprecated=\"20\"/>\n\t\t<field name=\"KEYCODE_0\"/>\n\t\t<field name=\"KEYCODE_1\"/>\n\t\t<field name=\"KEYCODE_11\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_12\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_2\"/>\n\t\t<field name=\"KEYCODE_3\"/>\n\t\t<field name=\"KEYCODE_3D_MODE\" since=\"14\"/>\n\t\t<field name=\"KEYCODE_4\"/>\n\t\t<field name=\"KEYCODE_5\"/>\n\t\t<field name=\"KEYCODE_6\"/>\n\t\t<field name=\"KEYCODE_7\"/>\n\t\t<field name=\"KEYCODE_8\"/>\n\t\t<field name=\"KEYCODE_9\"/>\n\t\t<field name=\"KEYCODE_A\"/>\n\t\t<field name=\"KEYCODE_ALL_APPS\" since=\"28\"/>\n\t\t<field name=\"KEYCODE_ALT_LEFT\"/>\n\t\t<field name=\"KEYCODE_ALT_RIGHT\"/>\n\t\t<field name=\"KEYCODE_APOSTROPHE\"/>\n\t\t<field name=\"KEYCODE_APP_SWITCH\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_ASSIST\" since=\"16\"/>\n\t\t<field name=\"KEYCODE_AT\"/>\n\t\t<field name=\"KEYCODE_AVR_INPUT\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_AVR_POWER\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_B\"/>\n\t\t<field name=\"KEYCODE_BACK\"/>\n\t\t<field name=\"KEYCODE_BACKSLASH\"/>\n\t\t<field name=\"KEYCODE_BOOKMARK\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_BREAK\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_BRIGHTNESS_DOWN\" since=\"18\"/>\n\t\t<field name=\"KEYCODE_BRIGHTNESS_UP\" since=\"18\"/>\n\t\t<field name=\"KEYCODE_BUTTON_1\" since=\"12\"/>\n\t\t<field name=\"KEYCODE_BUTTON_10\" since=\"12\"/>\n\t\t<field name=\"KEYCODE_BUTTON_11\" since=\"12\"/>\n\t\t<field name=\"KEYCODE_BUTTON_12\" since=\"12\"/>\n\t\t<field name=\"KEYCODE_BUTTON_13\" since=\"12\"/>\n\t\t<field name=\"KEYCODE_BUTTON_14\" since=\"12\"/>\n\t\t<field name=\"KEYCODE_BUTTON_15\" since=\"12\"/>\n\t\t<field name=\"KEYCODE_BUTTON_16\" since=\"12\"/>\n\t\t<field name=\"KEYCODE_BUTTON_2\" since=\"12\"/>\n\t\t<field name=\"KEYCODE_BUTTON_3\" since=\"12\"/>\n\t\t<field name=\"KEYCODE_BUTTON_4\" since=\"12\"/>\n\t\t<field name=\"KEYCODE_BUTTON_5\" since=\"12\"/>\n\t\t<field name=\"KEYCODE_BUTTON_6\" since=\"12\"/>\n\t\t<field name=\"KEYCODE_BUTTON_7\" since=\"12\"/>\n\t\t<field name=\"KEYCODE_BUTTON_8\" since=\"12\"/>\n\t\t<field name=\"KEYCODE_BUTTON_9\" since=\"12\"/>\n\t\t<field name=\"KEYCODE_BUTTON_A\" since=\"9\"/>\n\t\t<field name=\"KEYCODE_BUTTON_B\" since=\"9\"/>\n\t\t<field name=\"KEYCODE_BUTTON_C\" since=\"9\"/>\n\t\t<field name=\"KEYCODE_BUTTON_L1\" since=\"9\"/>\n\t\t<field name=\"KEYCODE_BUTTON_L2\" since=\"9\"/>\n\t\t<field name=\"KEYCODE_BUTTON_MODE\" since=\"9\"/>\n\t\t<field name=\"KEYCODE_BUTTON_R1\" since=\"9\"/>\n\t\t<field name=\"KEYCODE_BUTTON_R2\" since=\"9\"/>\n\t\t<field name=\"KEYCODE_BUTTON_SELECT\" since=\"9\"/>\n\t\t<field name=\"KEYCODE_BUTTON_START\" since=\"9\"/>\n\t\t<field name=\"KEYCODE_BUTTON_THUMBL\" since=\"9\"/>\n\t\t<field name=\"KEYCODE_BUTTON_THUMBR\" since=\"9\"/>\n\t\t<field name=\"KEYCODE_BUTTON_X\" since=\"9\"/>\n\t\t<field name=\"KEYCODE_BUTTON_Y\" since=\"9\"/>\n\t\t<field name=\"KEYCODE_BUTTON_Z\" since=\"9\"/>\n\t\t<field name=\"KEYCODE_C\"/>\n\t\t<field name=\"KEYCODE_CALCULATOR\" since=\"15\"/>\n\t\t<field name=\"KEYCODE_CALENDAR\" since=\"15\"/>\n\t\t<field name=\"KEYCODE_CALL\"/>\n\t\t<field name=\"KEYCODE_CAMERA\"/>\n\t\t<field name=\"KEYCODE_CAPS_LOCK\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_CAPTIONS\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_CHANNEL_DOWN\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_CHANNEL_UP\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_CLEAR\"/>\n\t\t<field name=\"KEYCODE_COMMA\"/>\n\t\t<field name=\"KEYCODE_CONTACTS\" since=\"15\"/>\n\t\t<field name=\"KEYCODE_COPY\" since=\"24\"/>\n\t\t<field name=\"KEYCODE_CTRL_LEFT\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_CTRL_RIGHT\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_CUT\" since=\"24\"/>\n\t\t<field name=\"KEYCODE_D\"/>\n\t\t<field name=\"KEYCODE_DEL\"/>\n\t\t<field name=\"KEYCODE_DPAD_CENTER\"/>\n\t\t<field name=\"KEYCODE_DPAD_DOWN\"/>\n\t\t<field name=\"KEYCODE_DPAD_DOWN_LEFT\" since=\"24\"/>\n\t\t<field name=\"KEYCODE_DPAD_DOWN_RIGHT\" since=\"24\"/>\n\t\t<field name=\"KEYCODE_DPAD_LEFT\"/>\n\t\t<field name=\"KEYCODE_DPAD_RIGHT\"/>\n\t\t<field name=\"KEYCODE_DPAD_UP\"/>\n\t\t<field name=\"KEYCODE_DPAD_UP_LEFT\" since=\"24\"/>\n\t\t<field name=\"KEYCODE_DPAD_UP_RIGHT\" since=\"24\"/>\n\t\t<field name=\"KEYCODE_DVR\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_E\"/>\n\t\t<field name=\"KEYCODE_EISU\" since=\"16\"/>\n\t\t<field name=\"KEYCODE_ENDCALL\"/>\n\t\t<field name=\"KEYCODE_ENTER\"/>\n\t\t<field name=\"KEYCODE_ENVELOPE\"/>\n\t\t<field name=\"KEYCODE_EQUALS\"/>\n\t\t<field name=\"KEYCODE_ESCAPE\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_EXPLORER\"/>\n\t\t<field name=\"KEYCODE_F\"/>\n\t\t<field name=\"KEYCODE_F1\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_F10\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_F11\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_F12\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_F2\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_F3\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_F4\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_F5\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_F6\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_F7\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_F8\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_F9\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_FOCUS\"/>\n\t\t<field name=\"KEYCODE_FORWARD\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_FORWARD_DEL\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_FUNCTION\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_G\"/>\n\t\t<field name=\"KEYCODE_GRAVE\"/>\n\t\t<field name=\"KEYCODE_GUIDE\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_H\"/>\n\t\t<field name=\"KEYCODE_HEADSETHOOK\"/>\n\t\t<field name=\"KEYCODE_HELP\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_HENKAN\" since=\"16\"/>\n\t\t<field name=\"KEYCODE_HOME\"/>\n\t\t<field name=\"KEYCODE_I\"/>\n\t\t<field name=\"KEYCODE_INFO\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_INSERT\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_J\"/>\n\t\t<field name=\"KEYCODE_K\"/>\n\t\t<field name=\"KEYCODE_KANA\" since=\"16\"/>\n\t\t<field name=\"KEYCODE_KATAKANA_HIRAGANA\" since=\"16\"/>\n\t\t<field name=\"KEYCODE_L\"/>\n\t\t<field name=\"KEYCODE_LANGUAGE_SWITCH\" since=\"14\"/>\n\t\t<field name=\"KEYCODE_LAST_CHANNEL\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_LEFT_BRACKET\"/>\n\t\t<field name=\"KEYCODE_M\"/>\n\t\t<field name=\"KEYCODE_MANNER_MODE\" since=\"14\"/>\n\t\t<field name=\"KEYCODE_MEDIA_AUDIO_TRACK\" since=\"19\"/>\n\t\t<field name=\"KEYCODE_MEDIA_CLOSE\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_MEDIA_EJECT\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_MEDIA_FAST_FORWARD\" since=\"3\"/>\n\t\t<field name=\"KEYCODE_MEDIA_NEXT\" since=\"3\"/>\n\t\t<field name=\"KEYCODE_MEDIA_PAUSE\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_MEDIA_PLAY\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_MEDIA_PLAY_PAUSE\" since=\"3\"/>\n\t\t<field name=\"KEYCODE_MEDIA_PREVIOUS\" since=\"3\"/>\n\t\t<field name=\"KEYCODE_MEDIA_RECORD\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_MEDIA_REWIND\" since=\"3\"/>\n\t\t<field name=\"KEYCODE_MEDIA_SKIP_BACKWARD\" since=\"23\"/>\n\t\t<field name=\"KEYCODE_MEDIA_SKIP_FORWARD\" since=\"23\"/>\n\t\t<field name=\"KEYCODE_MEDIA_STEP_BACKWARD\" since=\"23\"/>\n\t\t<field name=\"KEYCODE_MEDIA_STEP_FORWARD\" since=\"23\"/>\n\t\t<field name=\"KEYCODE_MEDIA_STOP\" since=\"3\"/>\n\t\t<field name=\"KEYCODE_MEDIA_TOP_MENU\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_MENU\"/>\n\t\t<field name=\"KEYCODE_META_LEFT\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_META_RIGHT\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_MINUS\"/>\n\t\t<field name=\"KEYCODE_MOVE_END\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_MOVE_HOME\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_MUHENKAN\" since=\"16\"/>\n\t\t<field name=\"KEYCODE_MUSIC\" since=\"15\"/>\n\t\t<field name=\"KEYCODE_MUTE\" since=\"3\"/>\n\t\t<field name=\"KEYCODE_N\"/>\n\t\t<field name=\"KEYCODE_NAVIGATE_IN\" since=\"23\"/>\n\t\t<field name=\"KEYCODE_NAVIGATE_NEXT\" since=\"23\"/>\n\t\t<field name=\"KEYCODE_NAVIGATE_OUT\" since=\"23\"/>\n\t\t<field name=\"KEYCODE_NAVIGATE_PREVIOUS\" since=\"23\"/>\n\t\t<field name=\"KEYCODE_NOTIFICATION\"/>\n\t\t<field name=\"KEYCODE_NUM\"/>\n\t\t<field name=\"KEYCODE_NUMPAD_0\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_NUMPAD_1\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_NUMPAD_2\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_NUMPAD_3\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_NUMPAD_4\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_NUMPAD_5\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_NUMPAD_6\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_NUMPAD_7\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_NUMPAD_8\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_NUMPAD_9\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_NUMPAD_ADD\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_NUMPAD_COMMA\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_NUMPAD_DIVIDE\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_NUMPAD_DOT\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_NUMPAD_ENTER\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_NUMPAD_EQUALS\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_NUMPAD_LEFT_PAREN\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_NUMPAD_MULTIPLY\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_NUMPAD_RIGHT_PAREN\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_NUMPAD_SUBTRACT\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_NUM_LOCK\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_O\"/>\n\t\t<field name=\"KEYCODE_P\"/>\n\t\t<field name=\"KEYCODE_PAGE_DOWN\" since=\"9\"/>\n\t\t<field name=\"KEYCODE_PAGE_UP\" since=\"9\"/>\n\t\t<field name=\"KEYCODE_PAIRING\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_PASTE\" since=\"24\"/>\n\t\t<field name=\"KEYCODE_PERIOD\"/>\n\t\t<field name=\"KEYCODE_PICTSYMBOLS\" since=\"9\"/>\n\t\t<field name=\"KEYCODE_PLUS\"/>\n\t\t<field name=\"KEYCODE_POUND\"/>\n\t\t<field name=\"KEYCODE_POWER\"/>\n\t\t<field name=\"KEYCODE_PROFILE_SWITCH\" since=\"29\"/>\n\t\t<field name=\"KEYCODE_PROG_BLUE\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_PROG_GREEN\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_PROG_RED\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_PROG_YELLOW\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_Q\"/>\n\t\t<field name=\"KEYCODE_R\"/>\n\t\t<field name=\"KEYCODE_REFRESH\" since=\"28\"/>\n\t\t<field name=\"KEYCODE_RIGHT_BRACKET\"/>\n\t\t<field name=\"KEYCODE_RO\" since=\"16\"/>\n\t\t<field name=\"KEYCODE_S\"/>\n\t\t<field name=\"KEYCODE_SCROLL_LOCK\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_SEARCH\"/>\n\t\t<field name=\"KEYCODE_SEMICOLON\"/>\n\t\t<field name=\"KEYCODE_SETTINGS\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_SHIFT_LEFT\"/>\n\t\t<field name=\"KEYCODE_SHIFT_RIGHT\"/>\n\t\t<field name=\"KEYCODE_SLASH\"/>\n\t\t<field name=\"KEYCODE_SLEEP\" since=\"20\"/>\n\t\t<field name=\"KEYCODE_SOFT_LEFT\"/>\n\t\t<field name=\"KEYCODE_SOFT_RIGHT\"/>\n\t\t<field name=\"KEYCODE_SOFT_SLEEP\" since=\"24\"/>\n\t\t<field name=\"KEYCODE_SPACE\"/>\n\t\t<field name=\"KEYCODE_STAR\"/>\n\t\t<field name=\"KEYCODE_STB_INPUT\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_STB_POWER\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_STEM_1\" since=\"24\"/>\n\t\t<field name=\"KEYCODE_STEM_2\" since=\"24\"/>\n\t\t<field name=\"KEYCODE_STEM_3\" since=\"24\"/>\n\t\t<field name=\"KEYCODE_STEM_PRIMARY\" since=\"24\"/>\n\t\t<field name=\"KEYCODE_SWITCH_CHARSET\" since=\"9\"/>\n\t\t<field name=\"KEYCODE_SYM\"/>\n\t\t<field name=\"KEYCODE_SYSRQ\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_SYSTEM_NAVIGATION_DOWN\" since=\"25\"/>\n\t\t<field name=\"KEYCODE_SYSTEM_NAVIGATION_LEFT\" since=\"25\"/>\n\t\t<field name=\"KEYCODE_SYSTEM_NAVIGATION_RIGHT\" since=\"25\"/>\n\t\t<field name=\"KEYCODE_SYSTEM_NAVIGATION_UP\" since=\"25\"/>\n\t\t<field name=\"KEYCODE_T\"/>\n\t\t<field name=\"KEYCODE_TAB\"/>\n\t\t<field name=\"KEYCODE_THUMBS_DOWN\" since=\"29\"/>\n\t\t<field name=\"KEYCODE_THUMBS_UP\" since=\"29\"/>\n\t\t<field name=\"KEYCODE_TV\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_TV_ANTENNA_CABLE\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_AUDIO_DESCRIPTION\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_CONTENTS_MENU\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_DATA_SERVICE\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_INPUT\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_TV_INPUT_COMPONENT_1\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_INPUT_COMPONENT_2\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_INPUT_COMPOSITE_1\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_INPUT_COMPOSITE_2\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_INPUT_HDMI_1\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_INPUT_HDMI_2\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_INPUT_HDMI_3\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_INPUT_HDMI_4\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_INPUT_VGA_1\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_MEDIA_CONTEXT_MENU\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_NETWORK\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_NUMBER_ENTRY\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_POWER\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_TV_RADIO_SERVICE\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_SATELLITE\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_SATELLITE_BS\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_SATELLITE_CS\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_SATELLITE_SERVICE\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_TELETEXT\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_TERRESTRIAL_ANALOG\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_TERRESTRIAL_DIGITAL\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_TIMER_PROGRAMMING\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_TV_ZOOM_MODE\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_U\"/>\n\t\t<field name=\"KEYCODE_UNKNOWN\"/>\n\t\t<field name=\"KEYCODE_V\"/>\n\t\t<field name=\"KEYCODE_VOICE_ASSIST\" since=\"21\"/>\n\t\t<field name=\"KEYCODE_VOLUME_DOWN\"/>\n\t\t<field name=\"KEYCODE_VOLUME_MUTE\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_VOLUME_UP\"/>\n\t\t<field name=\"KEYCODE_W\"/>\n\t\t<field name=\"KEYCODE_WAKEUP\" since=\"20\"/>\n\t\t<field name=\"KEYCODE_WINDOW\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_X\"/>\n\t\t<field name=\"KEYCODE_Y\"/>\n\t\t<field name=\"KEYCODE_YEN\" since=\"16\"/>\n\t\t<field name=\"KEYCODE_Z\"/>\n\t\t<field name=\"KEYCODE_ZENKAKU_HANKAKU\" since=\"16\"/>\n\t\t<field name=\"KEYCODE_ZOOM_IN\" since=\"11\"/>\n\t\t<field name=\"KEYCODE_ZOOM_OUT\" since=\"11\"/>\n\t\t<field name=\"MAX_KEYCODE\" deprecated=\"15\"/>\n\t\t<field name=\"META_ALT_LEFT_ON\"/>\n\t\t<field name=\"META_ALT_MASK\" since=\"11\"/>\n\t\t<field name=\"META_ALT_ON\"/>\n\t\t<field name=\"META_ALT_RIGHT_ON\"/>\n\t\t<field name=\"META_CAPS_LOCK_ON\" since=\"11\"/>\n\t\t<field name=\"META_CTRL_LEFT_ON\" since=\"11\"/>\n\t\t<field name=\"META_CTRL_MASK\" since=\"11\"/>\n\t\t<field name=\"META_CTRL_ON\" since=\"11\"/>\n\t\t<field name=\"META_CTRL_RIGHT_ON\" since=\"11\"/>\n\t\t<field name=\"META_FUNCTION_ON\" since=\"11\"/>\n\t\t<field name=\"META_META_LEFT_ON\" since=\"11\"/>\n\t\t<field name=\"META_META_MASK\" since=\"11\"/>\n\t\t<field name=\"META_META_ON\" since=\"11\"/>\n\t\t<field name=\"META_META_RIGHT_ON\" since=\"11\"/>\n\t\t<field name=\"META_NUM_LOCK_ON\" since=\"11\"/>\n\t\t<field name=\"META_SCROLL_LOCK_ON\" since=\"11\"/>\n\t\t<field name=\"META_SHIFT_LEFT_ON\"/>\n\t\t<field name=\"META_SHIFT_MASK\" since=\"11\"/>\n\t\t<field name=\"META_SHIFT_ON\"/>\n\t\t<field name=\"META_SHIFT_RIGHT_ON\"/>\n\t\t<field name=\"META_SYM_ON\"/>\n\t</class>\n\t<class name=\"android/view/KeyEvent$Callback\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onKeyDown(ILandroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"onKeyLongPress(ILandroid/view/KeyEvent;)Z\" since=\"5\"/>\n\t\t<method name=\"onKeyMultiple(IILandroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"onKeyUp(ILandroid/view/KeyEvent;)Z\"/>\n\t</class>\n\t<class name=\"android/view/KeyEvent$DispatcherState\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"handleUpEvent(Landroid/view/KeyEvent;)V\"/>\n\t\t<method name=\"isTracking(Landroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"performedLongPress(Landroid/view/KeyEvent;)V\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"reset(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"startTracking(Landroid/view/KeyEvent;Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"android/view/KeyboardShortcutGroup\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;Ljava/util/List;)V\"/>\n\t\t<method name=\"addItem(Landroid/view/KeyboardShortcutInfo;)V\"/>\n\t\t<method name=\"getItems()Ljava/util/List;\"/>\n\t\t<method name=\"getLabel()Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/KeyboardShortcutInfo\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;CI)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;II)V\"/>\n\t\t<method name=\"getBaseCharacter()C\"/>\n\t\t<method name=\"getKeycode()I\"/>\n\t\t<method name=\"getLabel()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getModifiers()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/LayoutInflater\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/LayoutInflater;Landroid/content/Context;)V\"/>\n\t\t<method name=\"cloneInContext(Landroid/content/Context;)Landroid/view/LayoutInflater;\"/>\n\t\t<method name=\"createView(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View;\" since=\"29\"/>\n\t\t<method name=\"createView(Ljava/lang/String;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View;\"/>\n\t\t<method name=\"from(Landroid/content/Context;)Landroid/view/LayoutInflater;\"/>\n\t\t<method name=\"getContext()Landroid/content/Context;\"/>\n\t\t<method name=\"getFactory()Landroid/view/LayoutInflater$Factory;\"/>\n\t\t<method name=\"getFactory2()Landroid/view/LayoutInflater$Factory2;\" since=\"11\"/>\n\t\t<method name=\"getFilter()Landroid/view/LayoutInflater$Filter;\"/>\n\t\t<method name=\"inflate(ILandroid/view/ViewGroup;)Landroid/view/View;\"/>\n\t\t<method name=\"inflate(ILandroid/view/ViewGroup;Z)Landroid/view/View;\"/>\n\t\t<method name=\"inflate(Lorg/xmlpull/v1/XmlPullParser;Landroid/view/ViewGroup;)Landroid/view/View;\"/>\n\t\t<method name=\"inflate(Lorg/xmlpull/v1/XmlPullParser;Landroid/view/ViewGroup;Z)Landroid/view/View;\"/>\n\t\t<method name=\"onCreateView(Landroid/content/Context;Landroid/view/View;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View;\" since=\"29\"/>\n\t\t<method name=\"onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View;\" since=\"11\"/>\n\t\t<method name=\"onCreateView(Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View;\"/>\n\t\t<method name=\"setFactory(Landroid/view/LayoutInflater$Factory;)V\"/>\n\t\t<method name=\"setFactory2(Landroid/view/LayoutInflater$Factory2;)V\" since=\"11\"/>\n\t\t<method name=\"setFilter(Landroid/view/LayoutInflater$Filter;)V\"/>\n\t</class>\n\t<class name=\"android/view/LayoutInflater$Factory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onCreateView(Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;\"/>\n\t</class>\n\t<class name=\"android/view/LayoutInflater$Factory2\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/view/LayoutInflater$Factory\"/>\n\t\t<method name=\"onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;\"/>\n\t</class>\n\t<class name=\"android/view/LayoutInflater$Filter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onLoadClass(Ljava/lang/Class;)Z\"/>\n\t</class>\n\t<class name=\"android/view/Menu\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"add(I)Landroid/view/MenuItem;\"/>\n\t\t<method name=\"add(IIII)Landroid/view/MenuItem;\"/>\n\t\t<method name=\"add(IIILjava/lang/CharSequence;)Landroid/view/MenuItem;\"/>\n\t\t<method name=\"add(Ljava/lang/CharSequence;)Landroid/view/MenuItem;\"/>\n\t\t<method name=\"addIntentOptions(IIILandroid/content/ComponentName;[Landroid/content/Intent;Landroid/content/Intent;I[Landroid/view/MenuItem;)I\"/>\n\t\t<method name=\"addSubMenu(I)Landroid/view/SubMenu;\"/>\n\t\t<method name=\"addSubMenu(IIII)Landroid/view/SubMenu;\"/>\n\t\t<method name=\"addSubMenu(IIILjava/lang/CharSequence;)Landroid/view/SubMenu;\"/>\n\t\t<method name=\"addSubMenu(Ljava/lang/CharSequence;)Landroid/view/SubMenu;\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"close()V\" since=\"3\"/>\n\t\t<method name=\"findItem(I)Landroid/view/MenuItem;\"/>\n\t\t<method name=\"getItem(I)Landroid/view/MenuItem;\" since=\"3\"/>\n\t\t<method name=\"hasVisibleItems()Z\"/>\n\t\t<method name=\"isShortcutKey(ILandroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"performIdentifierAction(II)Z\"/>\n\t\t<method name=\"performShortcut(ILandroid/view/KeyEvent;I)Z\"/>\n\t\t<method name=\"removeGroup(I)V\"/>\n\t\t<method name=\"removeItem(I)V\"/>\n\t\t<method name=\"setGroupCheckable(IZZ)V\"/>\n\t\t<method name=\"setGroupDividerEnabled(Z)V\" since=\"28\"/>\n\t\t<method name=\"setGroupEnabled(IZ)V\"/>\n\t\t<method name=\"setGroupVisible(IZ)V\"/>\n\t\t<method name=\"setQwertyMode(Z)V\"/>\n\t\t<method name=\"size()I\"/>\n\t\t<field name=\"CATEGORY_ALTERNATIVE\"/>\n\t\t<field name=\"CATEGORY_CONTAINER\"/>\n\t\t<field name=\"CATEGORY_SECONDARY\"/>\n\t\t<field name=\"CATEGORY_SYSTEM\"/>\n\t\t<field name=\"FIRST\"/>\n\t\t<field name=\"FLAG_ALWAYS_PERFORM_CLOSE\"/>\n\t\t<field name=\"FLAG_APPEND_TO_GROUP\"/>\n\t\t<field name=\"FLAG_PERFORM_NO_CLOSE\"/>\n\t\t<field name=\"NONE\"/>\n\t\t<field name=\"SUPPORTED_MODIFIERS_MASK\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/view/MenuInflater\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"inflate(ILandroid/view/Menu;)V\"/>\n\t</class>\n\t<class name=\"android/view/MenuItem\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"collapseActionView()Z\" since=\"14\"/>\n\t\t<method name=\"expandActionView()Z\" since=\"14\"/>\n\t\t<method name=\"getActionProvider()Landroid/view/ActionProvider;\" since=\"14\"/>\n\t\t<method name=\"getActionView()Landroid/view/View;\" since=\"11\"/>\n\t\t<method name=\"getAlphabeticModifiers()I\" since=\"26\"/>\n\t\t<method name=\"getAlphabeticShortcut()C\"/>\n\t\t<method name=\"getContentDescription()Ljava/lang/CharSequence;\" since=\"26\"/>\n\t\t<method name=\"getGroupId()I\"/>\n\t\t<method name=\"getIcon()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getIconTintBlendMode()Landroid/graphics/BlendMode;\" since=\"29\"/>\n\t\t<method name=\"getIconTintList()Landroid/content/res/ColorStateList;\" since=\"26\"/>\n\t\t<method name=\"getIconTintMode()Landroid/graphics/PorterDuff$Mode;\" since=\"26\"/>\n\t\t<method name=\"getIntent()Landroid/content/Intent;\"/>\n\t\t<method name=\"getItemId()I\"/>\n\t\t<method name=\"getMenuInfo()Landroid/view/ContextMenu$ContextMenuInfo;\"/>\n\t\t<method name=\"getNumericModifiers()I\" since=\"26\"/>\n\t\t<method name=\"getNumericShortcut()C\"/>\n\t\t<method name=\"getOrder()I\"/>\n\t\t<method name=\"getSubMenu()Landroid/view/SubMenu;\"/>\n\t\t<method name=\"getTitle()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTitleCondensed()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTooltipText()Ljava/lang/CharSequence;\" since=\"26\"/>\n\t\t<method name=\"hasSubMenu()Z\"/>\n\t\t<method name=\"isActionViewExpanded()Z\" since=\"14\"/>\n\t\t<method name=\"isCheckable()Z\"/>\n\t\t<method name=\"isChecked()Z\"/>\n\t\t<method name=\"isEnabled()Z\"/>\n\t\t<method name=\"isVisible()Z\"/>\n\t\t<method name=\"setActionProvider(Landroid/view/ActionProvider;)Landroid/view/MenuItem;\" since=\"14\"/>\n\t\t<method name=\"setActionView(I)Landroid/view/MenuItem;\" since=\"11\"/>\n\t\t<method name=\"setActionView(Landroid/view/View;)Landroid/view/MenuItem;\" since=\"11\"/>\n\t\t<method name=\"setAlphabeticShortcut(C)Landroid/view/MenuItem;\"/>\n\t\t<method name=\"setAlphabeticShortcut(CI)Landroid/view/MenuItem;\" since=\"26\"/>\n\t\t<method name=\"setCheckable(Z)Landroid/view/MenuItem;\"/>\n\t\t<method name=\"setChecked(Z)Landroid/view/MenuItem;\"/>\n\t\t<method name=\"setContentDescription(Ljava/lang/CharSequence;)Landroid/view/MenuItem;\" since=\"26\"/>\n\t\t<method name=\"setEnabled(Z)Landroid/view/MenuItem;\"/>\n\t\t<method name=\"setIcon(I)Landroid/view/MenuItem;\"/>\n\t\t<method name=\"setIcon(Landroid/graphics/drawable/Drawable;)Landroid/view/MenuItem;\"/>\n\t\t<method name=\"setIconTintBlendMode(Landroid/graphics/BlendMode;)Landroid/view/MenuItem;\" since=\"29\"/>\n\t\t<method name=\"setIconTintList(Landroid/content/res/ColorStateList;)Landroid/view/MenuItem;\" since=\"26\"/>\n\t\t<method name=\"setIconTintMode(Landroid/graphics/PorterDuff$Mode;)Landroid/view/MenuItem;\" since=\"26\"/>\n\t\t<method name=\"setIntent(Landroid/content/Intent;)Landroid/view/MenuItem;\"/>\n\t\t<method name=\"setNumericShortcut(C)Landroid/view/MenuItem;\"/>\n\t\t<method name=\"setNumericShortcut(CI)Landroid/view/MenuItem;\" since=\"26\"/>\n\t\t<method name=\"setOnActionExpandListener(Landroid/view/MenuItem$OnActionExpandListener;)Landroid/view/MenuItem;\" since=\"14\"/>\n\t\t<method name=\"setOnMenuItemClickListener(Landroid/view/MenuItem$OnMenuItemClickListener;)Landroid/view/MenuItem;\"/>\n\t\t<method name=\"setShortcut(CC)Landroid/view/MenuItem;\"/>\n\t\t<method name=\"setShortcut(CCII)Landroid/view/MenuItem;\" since=\"26\"/>\n\t\t<method name=\"setShowAsAction(I)V\" since=\"11\"/>\n\t\t<method name=\"setShowAsActionFlags(I)Landroid/view/MenuItem;\" since=\"14\"/>\n\t\t<method name=\"setTitle(I)Landroid/view/MenuItem;\"/>\n\t\t<method name=\"setTitle(Ljava/lang/CharSequence;)Landroid/view/MenuItem;\"/>\n\t\t<method name=\"setTitleCondensed(Ljava/lang/CharSequence;)Landroid/view/MenuItem;\"/>\n\t\t<method name=\"setTooltipText(Ljava/lang/CharSequence;)Landroid/view/MenuItem;\" since=\"26\"/>\n\t\t<method name=\"setVisible(Z)Landroid/view/MenuItem;\"/>\n\t\t<field name=\"SHOW_AS_ACTION_ALWAYS\" since=\"11\"/>\n\t\t<field name=\"SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW\" since=\"14\"/>\n\t\t<field name=\"SHOW_AS_ACTION_IF_ROOM\" since=\"11\"/>\n\t\t<field name=\"SHOW_AS_ACTION_NEVER\" since=\"11\"/>\n\t\t<field name=\"SHOW_AS_ACTION_WITH_TEXT\" since=\"11\"/>\n\t</class>\n\t<class name=\"android/view/MenuItem$OnActionExpandListener\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onMenuItemActionCollapse(Landroid/view/MenuItem;)Z\"/>\n\t\t<method name=\"onMenuItemActionExpand(Landroid/view/MenuItem;)Z\"/>\n\t</class>\n\t<class name=\"android/view/MenuItem$OnMenuItemClickListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onMenuItemClick(Landroid/view/MenuItem;)Z\"/>\n\t</class>\n\t<class name=\"android/view/MotionEvent\" since=\"1\">\n\t\t<extends name=\"android/view/InputEvent\" since=\"9\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"9\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"actionToString(I)Ljava/lang/String;\" since=\"19\"/>\n\t\t<method name=\"addBatch(JFFFFI)V\"/>\n\t\t<method name=\"addBatch(J[Landroid/view/MotionEvent$PointerCoords;I)V\" since=\"9\"/>\n\t\t<method name=\"axisFromString(Ljava/lang/String;)I\" since=\"12\"/>\n\t\t<method name=\"axisToString(I)Ljava/lang/String;\" since=\"12\"/>\n\t\t<method name=\"findPointerIndex(I)I\" since=\"5\"/>\n\t\t<method name=\"getAction()I\"/>\n\t\t<method name=\"getActionButton()I\" since=\"23\"/>\n\t\t<method name=\"getActionIndex()I\" since=\"8\"/>\n\t\t<method name=\"getActionMasked()I\" since=\"8\"/>\n\t\t<method name=\"getAxisValue(I)F\" since=\"12\"/>\n\t\t<method name=\"getAxisValue(II)F\" since=\"12\"/>\n\t\t<method name=\"getButtonState()I\" since=\"14\"/>\n\t\t<method name=\"getClassification()I\" since=\"29\"/>\n\t\t<method name=\"getDeviceId()I\"/>\n\t\t<method name=\"getDownTime()J\"/>\n\t\t<method name=\"getEdgeFlags()I\"/>\n\t\t<method name=\"getEventTime()J\"/>\n\t\t<method name=\"getFlags()I\" since=\"9\"/>\n\t\t<method name=\"getHistoricalAxisValue(II)F\" since=\"12\"/>\n\t\t<method name=\"getHistoricalAxisValue(III)F\" since=\"12\"/>\n\t\t<method name=\"getHistoricalEventTime(I)J\"/>\n\t\t<method name=\"getHistoricalOrientation(I)F\" since=\"9\"/>\n\t\t<method name=\"getHistoricalOrientation(II)F\" since=\"9\"/>\n\t\t<method name=\"getHistoricalPointerCoords(IILandroid/view/MotionEvent$PointerCoords;)V\" since=\"9\"/>\n\t\t<method name=\"getHistoricalPressure(I)F\"/>\n\t\t<method name=\"getHistoricalPressure(II)F\" since=\"5\"/>\n\t\t<method name=\"getHistoricalSize(I)F\"/>\n\t\t<method name=\"getHistoricalSize(II)F\" since=\"5\"/>\n\t\t<method name=\"getHistoricalToolMajor(I)F\" since=\"9\"/>\n\t\t<method name=\"getHistoricalToolMajor(II)F\" since=\"9\"/>\n\t\t<method name=\"getHistoricalToolMinor(I)F\" since=\"9\"/>\n\t\t<method name=\"getHistoricalToolMinor(II)F\" since=\"9\"/>\n\t\t<method name=\"getHistoricalTouchMajor(I)F\" since=\"9\"/>\n\t\t<method name=\"getHistoricalTouchMajor(II)F\" since=\"9\"/>\n\t\t<method name=\"getHistoricalTouchMinor(I)F\" since=\"9\"/>\n\t\t<method name=\"getHistoricalTouchMinor(II)F\" since=\"9\"/>\n\t\t<method name=\"getHistoricalX(I)F\"/>\n\t\t<method name=\"getHistoricalX(II)F\" since=\"5\"/>\n\t\t<method name=\"getHistoricalY(I)F\"/>\n\t\t<method name=\"getHistoricalY(II)F\" since=\"5\"/>\n\t\t<method name=\"getHistorySize()I\"/>\n\t\t<method name=\"getMetaState()I\"/>\n\t\t<method name=\"getOrientation()F\" since=\"9\"/>\n\t\t<method name=\"getOrientation(I)F\" since=\"9\"/>\n\t\t<method name=\"getPointerCoords(ILandroid/view/MotionEvent$PointerCoords;)V\" since=\"9\"/>\n\t\t<method name=\"getPointerCount()I\" since=\"5\"/>\n\t\t<method name=\"getPointerId(I)I\" since=\"5\"/>\n\t\t<method name=\"getPointerProperties(ILandroid/view/MotionEvent$PointerProperties;)V\" since=\"14\"/>\n\t\t<method name=\"getPressure()F\"/>\n\t\t<method name=\"getPressure(I)F\" since=\"5\"/>\n\t\t<method name=\"getRawX()F\"/>\n\t\t<method name=\"getRawX(I)F\" since=\"29\"/>\n\t\t<method name=\"getRawY()F\"/>\n\t\t<method name=\"getRawY(I)F\" since=\"29\"/>\n\t\t<method name=\"getSize()F\"/>\n\t\t<method name=\"getSize(I)F\" since=\"5\"/>\n\t\t<method name=\"getToolMajor()F\" since=\"9\"/>\n\t\t<method name=\"getToolMajor(I)F\" since=\"9\"/>\n\t\t<method name=\"getToolMinor()F\" since=\"9\"/>\n\t\t<method name=\"getToolMinor(I)F\" since=\"9\"/>\n\t\t<method name=\"getToolType(I)I\" since=\"14\"/>\n\t\t<method name=\"getTouchMajor()F\" since=\"9\"/>\n\t\t<method name=\"getTouchMajor(I)F\" since=\"9\"/>\n\t\t<method name=\"getTouchMinor()F\" since=\"9\"/>\n\t\t<method name=\"getTouchMinor(I)F\" since=\"9\"/>\n\t\t<method name=\"getX()F\"/>\n\t\t<method name=\"getX(I)F\" since=\"5\"/>\n\t\t<method name=\"getXPrecision()F\"/>\n\t\t<method name=\"getY()F\"/>\n\t\t<method name=\"getY(I)F\" since=\"5\"/>\n\t\t<method name=\"getYPrecision()F\"/>\n\t\t<method name=\"isButtonPressed(I)Z\" since=\"21\"/>\n\t\t<method name=\"obtain(JJIFFFFIFFII)Landroid/view/MotionEvent;\"/>\n\t\t<method name=\"obtain(JJIFFI)Landroid/view/MotionEvent;\"/>\n\t\t<method name=\"obtain(JJIIFFFFIFFII)Landroid/view/MotionEvent;\" since=\"5\" deprecated=\"15\"/>\n\t\t<method name=\"obtain(JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;\" since=\"9\" deprecated=\"15\"/>\n\t\t<method name=\"obtain(JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;\" since=\"14\"/>\n\t\t<method name=\"obtain(Landroid/view/MotionEvent;)Landroid/view/MotionEvent;\"/>\n\t\t<method name=\"obtainNoHistory(Landroid/view/MotionEvent;)Landroid/view/MotionEvent;\" since=\"5\"/>\n\t\t<method name=\"offsetLocation(FF)V\"/>\n\t\t<method name=\"recycle()V\"/>\n\t\t<method name=\"setAction(I)V\"/>\n\t\t<method name=\"setEdgeFlags(I)V\"/>\n\t\t<method name=\"setLocation(FF)V\"/>\n\t\t<method name=\"setSource(I)V\" since=\"12\"/>\n\t\t<method name=\"transform(Landroid/graphics/Matrix;)V\" since=\"11\"/>\n\t\t<field name=\"ACTION_BUTTON_PRESS\" since=\"23\"/>\n\t\t<field name=\"ACTION_BUTTON_RELEASE\" since=\"23\"/>\n\t\t<field name=\"ACTION_CANCEL\"/>\n\t\t<field name=\"ACTION_DOWN\"/>\n\t\t<field name=\"ACTION_HOVER_ENTER\" since=\"14\"/>\n\t\t<field name=\"ACTION_HOVER_EXIT\" since=\"14\"/>\n\t\t<field name=\"ACTION_HOVER_MOVE\" since=\"12\"/>\n\t\t<field name=\"ACTION_MASK\" since=\"5\"/>\n\t\t<field name=\"ACTION_MOVE\"/>\n\t\t<field name=\"ACTION_OUTSIDE\" since=\"3\"/>\n\t\t<field name=\"ACTION_POINTER_1_DOWN\" since=\"5\" deprecated=\"15\"/>\n\t\t<field name=\"ACTION_POINTER_1_UP\" since=\"5\" deprecated=\"15\"/>\n\t\t<field name=\"ACTION_POINTER_2_DOWN\" since=\"5\" deprecated=\"15\"/>\n\t\t<field name=\"ACTION_POINTER_2_UP\" since=\"5\" deprecated=\"15\"/>\n\t\t<field name=\"ACTION_POINTER_3_DOWN\" since=\"5\" deprecated=\"15\"/>\n\t\t<field name=\"ACTION_POINTER_3_UP\" since=\"5\" deprecated=\"15\"/>\n\t\t<field name=\"ACTION_POINTER_DOWN\" since=\"5\"/>\n\t\t<field name=\"ACTION_POINTER_ID_MASK\" since=\"5\" deprecated=\"15\"/>\n\t\t<field name=\"ACTION_POINTER_ID_SHIFT\" since=\"5\" deprecated=\"15\"/>\n\t\t<field name=\"ACTION_POINTER_INDEX_MASK\" since=\"8\"/>\n\t\t<field name=\"ACTION_POINTER_INDEX_SHIFT\" since=\"8\"/>\n\t\t<field name=\"ACTION_POINTER_UP\" since=\"5\"/>\n\t\t<field name=\"ACTION_SCROLL\" since=\"12\"/>\n\t\t<field name=\"ACTION_UP\"/>\n\t\t<field name=\"AXIS_BRAKE\" since=\"12\"/>\n\t\t<field name=\"AXIS_DISTANCE\" since=\"14\"/>\n\t\t<field name=\"AXIS_GAS\" since=\"12\"/>\n\t\t<field name=\"AXIS_GENERIC_1\" since=\"12\"/>\n\t\t<field name=\"AXIS_GENERIC_10\" since=\"12\"/>\n\t\t<field name=\"AXIS_GENERIC_11\" since=\"12\"/>\n\t\t<field name=\"AXIS_GENERIC_12\" since=\"12\"/>\n\t\t<field name=\"AXIS_GENERIC_13\" since=\"12\"/>\n\t\t<field name=\"AXIS_GENERIC_14\" since=\"12\"/>\n\t\t<field name=\"AXIS_GENERIC_15\" since=\"12\"/>\n\t\t<field name=\"AXIS_GENERIC_16\" since=\"12\"/>\n\t\t<field name=\"AXIS_GENERIC_2\" since=\"12\"/>\n\t\t<field name=\"AXIS_GENERIC_3\" since=\"12\"/>\n\t\t<field name=\"AXIS_GENERIC_4\" since=\"12\"/>\n\t\t<field name=\"AXIS_GENERIC_5\" since=\"12\"/>\n\t\t<field name=\"AXIS_GENERIC_6\" since=\"12\"/>\n\t\t<field name=\"AXIS_GENERIC_7\" since=\"12\"/>\n\t\t<field name=\"AXIS_GENERIC_8\" since=\"12\"/>\n\t\t<field name=\"AXIS_GENERIC_9\" since=\"12\"/>\n\t\t<field name=\"AXIS_HAT_X\" since=\"12\"/>\n\t\t<field name=\"AXIS_HAT_Y\" since=\"12\"/>\n\t\t<field name=\"AXIS_HSCROLL\" since=\"12\"/>\n\t\t<field name=\"AXIS_LTRIGGER\" since=\"12\"/>\n\t\t<field name=\"AXIS_ORIENTATION\" since=\"12\"/>\n\t\t<field name=\"AXIS_PRESSURE\" since=\"12\"/>\n\t\t<field name=\"AXIS_RELATIVE_X\" since=\"24\"/>\n\t\t<field name=\"AXIS_RELATIVE_Y\" since=\"24\"/>\n\t\t<field name=\"AXIS_RTRIGGER\" since=\"12\"/>\n\t\t<field name=\"AXIS_RUDDER\" since=\"12\"/>\n\t\t<field name=\"AXIS_RX\" since=\"12\"/>\n\t\t<field name=\"AXIS_RY\" since=\"12\"/>\n\t\t<field name=\"AXIS_RZ\" since=\"12\"/>\n\t\t<field name=\"AXIS_SCROLL\" since=\"26\"/>\n\t\t<field name=\"AXIS_SIZE\" since=\"12\"/>\n\t\t<field name=\"AXIS_THROTTLE\" since=\"12\"/>\n\t\t<field name=\"AXIS_TILT\" since=\"14\"/>\n\t\t<field name=\"AXIS_TOOL_MAJOR\" since=\"12\"/>\n\t\t<field name=\"AXIS_TOOL_MINOR\" since=\"12\"/>\n\t\t<field name=\"AXIS_TOUCH_MAJOR\" since=\"12\"/>\n\t\t<field name=\"AXIS_TOUCH_MINOR\" since=\"12\"/>\n\t\t<field name=\"AXIS_VSCROLL\" since=\"12\"/>\n\t\t<field name=\"AXIS_WHEEL\" since=\"12\"/>\n\t\t<field name=\"AXIS_X\" since=\"12\"/>\n\t\t<field name=\"AXIS_Y\" since=\"12\"/>\n\t\t<field name=\"AXIS_Z\" since=\"12\"/>\n\t\t<field name=\"BUTTON_BACK\" since=\"14\"/>\n\t\t<field name=\"BUTTON_FORWARD\" since=\"14\"/>\n\t\t<field name=\"BUTTON_PRIMARY\" since=\"14\"/>\n\t\t<field name=\"BUTTON_SECONDARY\" since=\"14\"/>\n\t\t<field name=\"BUTTON_STYLUS_PRIMARY\" since=\"23\"/>\n\t\t<field name=\"BUTTON_STYLUS_SECONDARY\" since=\"23\"/>\n\t\t<field name=\"BUTTON_TERTIARY\" since=\"14\"/>\n\t\t<field name=\"CLASSIFICATION_AMBIGUOUS_GESTURE\" since=\"29\"/>\n\t\t<field name=\"CLASSIFICATION_DEEP_PRESS\" since=\"29\"/>\n\t\t<field name=\"CLASSIFICATION_NONE\" since=\"29\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"EDGE_BOTTOM\"/>\n\t\t<field name=\"EDGE_LEFT\"/>\n\t\t<field name=\"EDGE_RIGHT\"/>\n\t\t<field name=\"EDGE_TOP\"/>\n\t\t<field name=\"FLAG_WINDOW_IS_OBSCURED\" since=\"9\"/>\n\t\t<field name=\"FLAG_WINDOW_IS_PARTIALLY_OBSCURED\" since=\"29\"/>\n\t\t<field name=\"INVALID_POINTER_ID\" since=\"14\"/>\n\t\t<field name=\"TOOL_TYPE_ERASER\" since=\"14\"/>\n\t\t<field name=\"TOOL_TYPE_FINGER\" since=\"14\"/>\n\t\t<field name=\"TOOL_TYPE_MOUSE\" since=\"14\"/>\n\t\t<field name=\"TOOL_TYPE_STYLUS\" since=\"14\"/>\n\t\t<field name=\"TOOL_TYPE_UNKNOWN\" since=\"14\"/>\n\t</class>\n\t<class name=\"android/view/MotionEvent$PointerCoords\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/MotionEvent$PointerCoords;)V\" since=\"12\"/>\n\t\t<method name=\"clear()V\" since=\"12\"/>\n\t\t<method name=\"copyFrom(Landroid/view/MotionEvent$PointerCoords;)V\" since=\"12\"/>\n\t\t<method name=\"getAxisValue(I)F\" since=\"12\"/>\n\t\t<method name=\"setAxisValue(IF)V\" since=\"12\"/>\n\t\t<field name=\"orientation\"/>\n\t\t<field name=\"pressure\"/>\n\t\t<field name=\"size\"/>\n\t\t<field name=\"toolMajor\"/>\n\t\t<field name=\"toolMinor\"/>\n\t\t<field name=\"touchMajor\"/>\n\t\t<field name=\"touchMinor\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t</class>\n\t<class name=\"android/view/MotionEvent$PointerProperties\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/MotionEvent$PointerProperties;)V\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"copyFrom(Landroid/view/MotionEvent$PointerProperties;)V\"/>\n\t\t<field name=\"id\"/>\n\t\t<field name=\"toolType\"/>\n\t</class>\n\t<class name=\"android/view/OrientationEventListener\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"canDetectOrientation()Z\"/>\n\t\t<method name=\"disable()V\"/>\n\t\t<method name=\"enable()V\"/>\n\t\t<method name=\"onOrientationChanged(I)V\"/>\n\t\t<field name=\"ORIENTATION_UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/view/OrientationListener\" since=\"1\" deprecated=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/hardware/SensorListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;I)V\" since=\"3\" deprecated=\"29\"/>\n\t\t<method name=\"disable()V\" deprecated=\"29\"/>\n\t\t<method name=\"enable()V\" deprecated=\"29\"/>\n\t\t<method name=\"onOrientationChanged(I)V\" deprecated=\"29\"/>\n\t\t<field name=\"ORIENTATION_UNKNOWN\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/view/PixelCopy\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"request(Landroid/view/Surface;Landroid/graphics/Bitmap;Landroid/view/PixelCopy$OnPixelCopyFinishedListener;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"request(Landroid/view/Surface;Landroid/graphics/Rect;Landroid/graphics/Bitmap;Landroid/view/PixelCopy$OnPixelCopyFinishedListener;Landroid/os/Handler;)V\" since=\"26\"/>\n\t\t<method name=\"request(Landroid/view/SurfaceView;Landroid/graphics/Bitmap;Landroid/view/PixelCopy$OnPixelCopyFinishedListener;Landroid/os/Handler;)V\"/>\n\t\t<method name=\"request(Landroid/view/SurfaceView;Landroid/graphics/Rect;Landroid/graphics/Bitmap;Landroid/view/PixelCopy$OnPixelCopyFinishedListener;Landroid/os/Handler;)V\" since=\"26\"/>\n\t\t<method name=\"request(Landroid/view/Window;Landroid/graphics/Bitmap;Landroid/view/PixelCopy$OnPixelCopyFinishedListener;Landroid/os/Handler;)V\" since=\"26\"/>\n\t\t<method name=\"request(Landroid/view/Window;Landroid/graphics/Rect;Landroid/graphics/Bitmap;Landroid/view/PixelCopy$OnPixelCopyFinishedListener;Landroid/os/Handler;)V\" since=\"26\"/>\n\t\t<field name=\"ERROR_DESTINATION_INVALID\"/>\n\t\t<field name=\"ERROR_SOURCE_INVALID\"/>\n\t\t<field name=\"ERROR_SOURCE_NO_DATA\"/>\n\t\t<field name=\"ERROR_TIMEOUT\"/>\n\t\t<field name=\"ERROR_UNKNOWN\"/>\n\t\t<field name=\"SUCCESS\"/>\n\t</class>\n\t<class name=\"android/view/PixelCopy$OnPixelCopyFinishedListener\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onPixelCopyFinished(I)V\"/>\n\t</class>\n\t<class name=\"android/view/PointerIcon\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"create(Landroid/graphics/Bitmap;FF)Landroid/view/PointerIcon;\"/>\n\t\t<method name=\"getSystemIcon(Landroid/content/Context;I)Landroid/view/PointerIcon;\"/>\n\t\t<method name=\"load(Landroid/content/res/Resources;I)Landroid/view/PointerIcon;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"TYPE_ALIAS\"/>\n\t\t<field name=\"TYPE_ALL_SCROLL\"/>\n\t\t<field name=\"TYPE_ARROW\"/>\n\t\t<field name=\"TYPE_CELL\"/>\n\t\t<field name=\"TYPE_CONTEXT_MENU\"/>\n\t\t<field name=\"TYPE_COPY\"/>\n\t\t<field name=\"TYPE_CROSSHAIR\"/>\n\t\t<field name=\"TYPE_DEFAULT\"/>\n\t\t<field name=\"TYPE_GRAB\"/>\n\t\t<field name=\"TYPE_GRABBING\"/>\n\t\t<field name=\"TYPE_HAND\"/>\n\t\t<field name=\"TYPE_HELP\"/>\n\t\t<field name=\"TYPE_HORIZONTAL_DOUBLE_ARROW\"/>\n\t\t<field name=\"TYPE_NO_DROP\"/>\n\t\t<field name=\"TYPE_NULL\"/>\n\t\t<field name=\"TYPE_TEXT\"/>\n\t\t<field name=\"TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW\"/>\n\t\t<field name=\"TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW\"/>\n\t\t<field name=\"TYPE_VERTICAL_DOUBLE_ARROW\"/>\n\t\t<field name=\"TYPE_VERTICAL_TEXT\"/>\n\t\t<field name=\"TYPE_WAIT\"/>\n\t\t<field name=\"TYPE_ZOOM_IN\"/>\n\t\t<field name=\"TYPE_ZOOM_OUT\"/>\n\t</class>\n\t<class name=\"android/view/ScaleGestureDetector\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/view/ScaleGestureDetector$OnScaleGestureListener;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/view/ScaleGestureDetector$OnScaleGestureListener;Landroid/os/Handler;)V\" since=\"19\"/>\n\t\t<method name=\"getCurrentSpan()F\"/>\n\t\t<method name=\"getCurrentSpanX()F\" since=\"11\"/>\n\t\t<method name=\"getCurrentSpanY()F\" since=\"11\"/>\n\t\t<method name=\"getEventTime()J\"/>\n\t\t<method name=\"getFocusX()F\"/>\n\t\t<method name=\"getFocusY()F\"/>\n\t\t<method name=\"getPreviousSpan()F\"/>\n\t\t<method name=\"getPreviousSpanX()F\" since=\"11\"/>\n\t\t<method name=\"getPreviousSpanY()F\" since=\"11\"/>\n\t\t<method name=\"getScaleFactor()F\"/>\n\t\t<method name=\"getTimeDelta()J\"/>\n\t\t<method name=\"isInProgress()Z\"/>\n\t\t<method name=\"isQuickScaleEnabled()Z\" since=\"19\"/>\n\t\t<method name=\"isStylusScaleEnabled()Z\" since=\"23\"/>\n\t\t<method name=\"onTouchEvent(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"setQuickScaleEnabled(Z)V\" since=\"19\"/>\n\t\t<method name=\"setStylusScaleEnabled(Z)V\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/view/ScaleGestureDetector$OnScaleGestureListener\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onScale(Landroid/view/ScaleGestureDetector;)Z\"/>\n\t\t<method name=\"onScaleBegin(Landroid/view/ScaleGestureDetector;)Z\"/>\n\t\t<method name=\"onScaleEnd(Landroid/view/ScaleGestureDetector;)V\"/>\n\t</class>\n\t<class name=\"android/view/ScaleGestureDetector$SimpleOnScaleGestureListener\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/view/ScaleGestureDetector$OnScaleGestureListener\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/view/SearchEvent\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/InputDevice;)V\"/>\n\t\t<method name=\"getInputDevice()Landroid/view/InputDevice;\"/>\n\t</class>\n\t<class name=\"android/view/SoundEffectConstants\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getContantForFocusDirection(I)I\"/>\n\t\t<field name=\"CLICK\"/>\n\t\t<field name=\"NAVIGATION_DOWN\"/>\n\t\t<field name=\"NAVIGATION_LEFT\"/>\n\t\t<field name=\"NAVIGATION_RIGHT\"/>\n\t\t<field name=\"NAVIGATION_UP\"/>\n\t</class>\n\t<class name=\"android/view/SubMenu\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/view/Menu\"/>\n\t\t<method name=\"clearHeader()V\"/>\n\t\t<method name=\"getItem()Landroid/view/MenuItem;\"/>\n\t\t<method name=\"setHeaderIcon(I)Landroid/view/SubMenu;\"/>\n\t\t<method name=\"setHeaderIcon(Landroid/graphics/drawable/Drawable;)Landroid/view/SubMenu;\"/>\n\t\t<method name=\"setHeaderTitle(I)Landroid/view/SubMenu;\"/>\n\t\t<method name=\"setHeaderTitle(Ljava/lang/CharSequence;)Landroid/view/SubMenu;\"/>\n\t\t<method name=\"setHeaderView(Landroid/view/View;)Landroid/view/SubMenu;\"/>\n\t\t<method name=\"setIcon(I)Landroid/view/SubMenu;\"/>\n\t\t<method name=\"setIcon(Landroid/graphics/drawable/Drawable;)Landroid/view/SubMenu;\"/>\n\t</class>\n\t<class name=\"android/view/Surface\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/SurfaceTexture;)V\" since=\"14\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/SurfaceControl;)V\" since=\"29\"/>\n\t\t<method name=\"freeze()V\" removed=\"14\"/>\n\t\t<method name=\"hide()V\" removed=\"14\"/>\n\t\t<method name=\"isValid()Z\"/>\n\t\t<method name=\"lockCanvas(Landroid/graphics/Rect;)Landroid/graphics/Canvas;\"/>\n\t\t<method name=\"lockHardwareCanvas()Landroid/graphics/Canvas;\" since=\"23\"/>\n\t\t<method name=\"readFromParcel(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"release()V\" since=\"14\"/>\n\t\t<method name=\"setAlpha(F)V\" removed=\"14\"/>\n\t\t<method name=\"setFlags(II)V\" removed=\"14\"/>\n\t\t<method name=\"setFreezeTint(I)V\" removed=\"14\"/>\n\t\t<method name=\"setLayer(I)V\" removed=\"14\"/>\n\t\t<method name=\"setMatrix(FFFF)V\" removed=\"14\"/>\n\t\t<method name=\"setOrientation(II)V\" removed=\"14\"/>\n\t\t<method name=\"setPosition(II)V\" removed=\"14\"/>\n\t\t<method name=\"setSize(II)V\" removed=\"14\"/>\n\t\t<method name=\"setTransparentRegionHint(Landroid/graphics/Region;)V\" removed=\"14\"/>\n\t\t<method name=\"show()V\" removed=\"14\"/>\n\t\t<method name=\"unfreeze()V\" removed=\"14\"/>\n\t\t<method name=\"unlockCanvas(Landroid/graphics/Canvas;)V\" deprecated=\"17\"/>\n\t\t<method name=\"unlockCanvasAndPost(Landroid/graphics/Canvas;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FX_SURFACE_BLUR\" removed=\"14\"/>\n\t\t<field name=\"FX_SURFACE_DIM\" removed=\"14\"/>\n\t\t<field name=\"FX_SURFACE_MASK\" removed=\"14\"/>\n\t\t<field name=\"FX_SURFACE_NORMAL\" removed=\"14\"/>\n\t\t<field name=\"GPU\" removed=\"14\"/>\n\t\t<field name=\"HARDWARE\" removed=\"14\"/>\n\t\t<field name=\"HIDDEN\" removed=\"14\"/>\n\t\t<field name=\"NON_PREMULTIPLIED\" removed=\"14\"/>\n\t\t<field name=\"PUSH_BUFFERS\" removed=\"14\"/>\n\t\t<field name=\"ROTATION_0\"/>\n\t\t<field name=\"ROTATION_180\"/>\n\t\t<field name=\"ROTATION_270\"/>\n\t\t<field name=\"ROTATION_90\"/>\n\t\t<field name=\"SECURE\" removed=\"14\"/>\n\t\t<field name=\"SURACE_FROZEN\" removed=\"14\"/>\n\t\t<field name=\"SURFACE_BLUR_FREEZE\" removed=\"14\"/>\n\t\t<field name=\"SURFACE_DITHER\" removed=\"14\"/>\n\t\t<field name=\"SURFACE_FROZEN\" since=\"4\" removed=\"14\"/>\n\t\t<field name=\"SURFACE_HIDDEN\" removed=\"14\"/>\n\t</class>\n\t<class name=\"android/view/Surface$OutOfResourcesException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\" removed=\"19\"/>\n\t\t<extends name=\"java/lang/RuntimeException\" since=\"19\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/view/SurfaceControl\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"isValid()Z\"/>\n\t\t<method name=\"readFromParcel(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/SurfaceControl$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/view/SurfaceControl;\"/>\n\t\t<method name=\"setBufferSize(II)Landroid/view/SurfaceControl$Builder;\"/>\n\t\t<method name=\"setFormat(I)Landroid/view/SurfaceControl$Builder;\"/>\n\t\t<method name=\"setName(Ljava/lang/String;)Landroid/view/SurfaceControl$Builder;\"/>\n\t\t<method name=\"setOpaque(Z)Landroid/view/SurfaceControl$Builder;\"/>\n\t\t<method name=\"setParent(Landroid/view/SurfaceControl;)Landroid/view/SurfaceControl$Builder;\"/>\n\t</class>\n\t<class name=\"android/view/SurfaceControl$Transaction\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"apply()V\"/>\n\t\t<method name=\"merge(Landroid/view/SurfaceControl$Transaction;)Landroid/view/SurfaceControl$Transaction;\"/>\n\t\t<method name=\"reparent(Landroid/view/SurfaceControl;Landroid/view/SurfaceControl;)Landroid/view/SurfaceControl$Transaction;\"/>\n\t\t<method name=\"setAlpha(Landroid/view/SurfaceControl;F)Landroid/view/SurfaceControl$Transaction;\"/>\n\t\t<method name=\"setBufferSize(Landroid/view/SurfaceControl;II)Landroid/view/SurfaceControl$Transaction;\"/>\n\t\t<method name=\"setGeometry(Landroid/view/SurfaceControl;Landroid/graphics/Rect;Landroid/graphics/Rect;I)Landroid/view/SurfaceControl$Transaction;\"/>\n\t\t<method name=\"setLayer(Landroid/view/SurfaceControl;I)Landroid/view/SurfaceControl$Transaction;\"/>\n\t\t<method name=\"setVisibility(Landroid/view/SurfaceControl;Z)Landroid/view/SurfaceControl$Transaction;\"/>\n\t</class>\n\t<class name=\"android/view/SurfaceHolder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addCallback(Landroid/view/SurfaceHolder$Callback;)V\"/>\n\t\t<method name=\"getSurface()Landroid/view/Surface;\"/>\n\t\t<method name=\"getSurfaceFrame()Landroid/graphics/Rect;\"/>\n\t\t<method name=\"isCreating()Z\"/>\n\t\t<method name=\"lockCanvas()Landroid/graphics/Canvas;\"/>\n\t\t<method name=\"lockCanvas(Landroid/graphics/Rect;)Landroid/graphics/Canvas;\"/>\n\t\t<method name=\"lockHardwareCanvas()Landroid/graphics/Canvas;\" since=\"26\"/>\n\t\t<method name=\"removeCallback(Landroid/view/SurfaceHolder$Callback;)V\"/>\n\t\t<method name=\"setFixedSize(II)V\"/>\n\t\t<method name=\"setFormat(I)V\"/>\n\t\t<method name=\"setKeepScreenOn(Z)V\"/>\n\t\t<method name=\"setSizeFromLayout()V\"/>\n\t\t<method name=\"setType(I)V\" deprecated=\"15\"/>\n\t\t<method name=\"unlockCanvasAndPost(Landroid/graphics/Canvas;)V\"/>\n\t\t<field name=\"SURFACE_TYPE_GPU\" deprecated=\"15\"/>\n\t\t<field name=\"SURFACE_TYPE_HARDWARE\" deprecated=\"15\"/>\n\t\t<field name=\"SURFACE_TYPE_NORMAL\" deprecated=\"15\"/>\n\t\t<field name=\"SURFACE_TYPE_PUSH_BUFFERS\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/view/SurfaceHolder$BadSurfaceTypeException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/view/SurfaceHolder$Callback\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"surfaceChanged(Landroid/view/SurfaceHolder;III)V\"/>\n\t\t<method name=\"surfaceCreated(Landroid/view/SurfaceHolder;)V\"/>\n\t\t<method name=\"surfaceDestroyed(Landroid/view/SurfaceHolder;)V\"/>\n\t</class>\n\t<class name=\"android/view/SurfaceHolder$Callback2\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/view/SurfaceHolder$Callback\"/>\n\t\t<method name=\"surfaceRedrawNeeded(Landroid/view/SurfaceHolder;)V\"/>\n\t\t<method name=\"surfaceRedrawNeededAsync(Landroid/view/SurfaceHolder;Ljava/lang/Runnable;)V\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/view/SurfaceView\" since=\"1\">\n\t\t<extends name=\"android/view/View\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"gatherTransparentRegion(Landroid/graphics/Region;)Z\"/>\n\t\t<method name=\"getHolder()Landroid/view/SurfaceHolder;\"/>\n\t\t<method name=\"getSurfaceControl()Landroid/view/SurfaceControl;\" since=\"29\"/>\n\t\t<method name=\"setSecure(Z)V\" since=\"17\"/>\n\t\t<method name=\"setZOrderMediaOverlay(Z)V\" since=\"5\"/>\n\t\t<method name=\"setZOrderOnTop(Z)V\" since=\"5\"/>\n\t</class>\n\t<class name=\"android/view/TextureView\" since=\"14\">\n\t\t<extends name=\"android/view/View\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"getBitmap()Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"getBitmap(II)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"getBitmap(Landroid/graphics/Bitmap;)Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"getSurfaceTexture()Landroid/graphics/SurfaceTexture;\"/>\n\t\t<method name=\"getSurfaceTextureListener()Landroid/view/TextureView$SurfaceTextureListener;\"/>\n\t\t<method name=\"getTransform(Landroid/graphics/Matrix;)Landroid/graphics/Matrix;\"/>\n\t\t<method name=\"isAvailable()Z\"/>\n\t\t<method name=\"lockCanvas()Landroid/graphics/Canvas;\"/>\n\t\t<method name=\"lockCanvas(Landroid/graphics/Rect;)Landroid/graphics/Canvas;\"/>\n\t\t<method name=\"setOpaque(Z)V\"/>\n\t\t<method name=\"setSurfaceTexture(Landroid/graphics/SurfaceTexture;)V\" since=\"16\"/>\n\t\t<method name=\"setSurfaceTextureListener(Landroid/view/TextureView$SurfaceTextureListener;)V\"/>\n\t\t<method name=\"setTransform(Landroid/graphics/Matrix;)V\"/>\n\t\t<method name=\"unlockCanvasAndPost(Landroid/graphics/Canvas;)V\"/>\n\t</class>\n\t<class name=\"android/view/TextureView$SurfaceTextureListener\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onSurfaceTextureAvailable(Landroid/graphics/SurfaceTexture;II)V\"/>\n\t\t<method name=\"onSurfaceTextureDestroyed(Landroid/graphics/SurfaceTexture;)Z\"/>\n\t\t<method name=\"onSurfaceTextureSizeChanged(Landroid/graphics/SurfaceTexture;II)V\"/>\n\t\t<method name=\"onSurfaceTextureUpdated(Landroid/graphics/SurfaceTexture;)V\"/>\n\t</class>\n\t<class name=\"android/view/TouchDelegate\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Rect;Landroid/view/View;)V\"/>\n\t\t<method name=\"getTouchDelegateInfo()Landroid/view/accessibility/AccessibilityNodeInfo$TouchDelegateInfo;\" since=\"29\"/>\n\t\t<method name=\"onTouchEvent(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"onTouchExplorationHoverEvent(Landroid/view/MotionEvent;)Z\" since=\"29\"/>\n\t\t<field name=\"ABOVE\"/>\n\t\t<field name=\"BELOW\"/>\n\t\t<field name=\"TO_LEFT\"/>\n\t\t<field name=\"TO_RIGHT\"/>\n\t</class>\n\t<class name=\"android/view/VelocityTracker\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addMovement(Landroid/view/MotionEvent;)V\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"computeCurrentVelocity(I)V\"/>\n\t\t<method name=\"computeCurrentVelocity(IF)V\" since=\"4\"/>\n\t\t<method name=\"getXVelocity()F\"/>\n\t\t<method name=\"getXVelocity(I)F\" since=\"8\"/>\n\t\t<method name=\"getYVelocity()F\"/>\n\t\t<method name=\"getYVelocity(I)F\" since=\"8\"/>\n\t\t<method name=\"obtain()Landroid/view/VelocityTracker;\"/>\n\t\t<method name=\"recycle()V\"/>\n\t</class>\n\t<class name=\"android/view/View\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/graphics/drawable/Drawable$Callback\"/>\n\t\t<implements name=\"android/view/KeyEvent$Callback\"/>\n\t\t<implements name=\"android/view/accessibility/AccessibilityEventSource\" since=\"4\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"addChildrenForAccessibility(Ljava/util/ArrayList;)V\" since=\"16\"/>\n\t\t<method name=\"addExtraDataToAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"26\"/>\n\t\t<method name=\"addFocusables(Ljava/util/ArrayList;I)V\"/>\n\t\t<method name=\"addFocusables(Ljava/util/ArrayList;II)V\" since=\"4\"/>\n\t\t<method name=\"addKeyboardNavigationClusters(Ljava/util/Collection;I)V\" since=\"26\"/>\n\t\t<method name=\"addOnAttachStateChangeListener(Landroid/view/View$OnAttachStateChangeListener;)V\" since=\"12\"/>\n\t\t<method name=\"addOnLayoutChangeListener(Landroid/view/View$OnLayoutChangeListener;)V\" since=\"11\"/>\n\t\t<method name=\"addOnUnhandledKeyEventListener(Landroid/view/View$OnUnhandledKeyEventListener;)V\" since=\"28\"/>\n\t\t<method name=\"addTouchables(Ljava/util/ArrayList;)V\"/>\n\t\t<method name=\"animate()Landroid/view/ViewPropertyAnimator;\" since=\"12\"/>\n\t\t<method name=\"announceForAccessibility(Ljava/lang/CharSequence;)V\" since=\"16\"/>\n\t\t<method name=\"autofill(Landroid/util/SparseArray;)V\" since=\"26\"/>\n\t\t<method name=\"autofill(Landroid/view/autofill/AutofillValue;)V\" since=\"26\"/>\n\t\t<method name=\"awakenScrollBars()Z\" since=\"5\"/>\n\t\t<method name=\"awakenScrollBars(I)Z\" since=\"5\"/>\n\t\t<method name=\"awakenScrollBars(IZ)Z\" since=\"5\"/>\n\t\t<method name=\"bringToFront()V\"/>\n\t\t<method name=\"buildDrawingCache()V\" deprecated=\"28\"/>\n\t\t<method name=\"buildDrawingCache(Z)V\" since=\"4\" deprecated=\"28\"/>\n\t\t<method name=\"buildLayer()V\" since=\"12\"/>\n\t\t<method name=\"callOnClick()Z\" since=\"15\"/>\n\t\t<method name=\"canResolveLayoutDirection()Z\" since=\"19\"/>\n\t\t<method name=\"canResolveTextAlignment()Z\" since=\"19\"/>\n\t\t<method name=\"canResolveTextDirection()Z\" since=\"19\"/>\n\t\t<method name=\"canScrollHorizontally(I)Z\" since=\"14\"/>\n\t\t<method name=\"canScrollVertically(I)Z\" since=\"14\"/>\n\t\t<method name=\"cancelDragAndDrop()V\" since=\"24\"/>\n\t\t<method name=\"cancelLongPress()V\"/>\n\t\t<method name=\"cancelPendingInputEvents()V\" since=\"19\"/>\n\t\t<method name=\"checkInputConnectionProxy(Landroid/view/View;)Z\" since=\"3\"/>\n\t\t<method name=\"clearAnimation()V\"/>\n\t\t<method name=\"clearFocus()V\"/>\n\t\t<method name=\"combineMeasuredStates(II)I\" since=\"11\"/>\n\t\t<method name=\"computeHorizontalScrollExtent()I\"/>\n\t\t<method name=\"computeHorizontalScrollOffset()I\"/>\n\t\t<method name=\"computeHorizontalScrollRange()I\"/>\n\t\t<method name=\"computeScroll()V\"/>\n\t\t<method name=\"computeSystemWindowInsets(Landroid/view/WindowInsets;Landroid/graphics/Rect;)Landroid/view/WindowInsets;\" since=\"21\"/>\n\t\t<method name=\"computeVerticalScrollExtent()I\"/>\n\t\t<method name=\"computeVerticalScrollOffset()I\"/>\n\t\t<method name=\"computeVerticalScrollRange()I\"/>\n\t\t<method name=\"createAccessibilityNodeInfo()Landroid/view/accessibility/AccessibilityNodeInfo;\" since=\"14\"/>\n\t\t<method name=\"createContextMenu(Landroid/view/ContextMenu;)V\"/>\n\t\t<method name=\"destroyDrawingCache()V\" deprecated=\"28\"/>\n\t\t<method name=\"dispatchApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;\" since=\"20\"/>\n\t\t<method name=\"dispatchCapturedPointerEvent(Landroid/view/MotionEvent;)Z\" since=\"26\"/>\n\t\t<method name=\"dispatchConfigurationChanged(Landroid/content/res/Configuration;)V\" since=\"8\"/>\n\t\t<method name=\"dispatchDisplayHint(I)V\" since=\"8\"/>\n\t\t<method name=\"dispatchDragEvent(Landroid/view/DragEvent;)Z\" since=\"11\"/>\n\t\t<method name=\"dispatchDraw(Landroid/graphics/Canvas;)V\"/>\n\t\t<method name=\"dispatchDrawableHotspotChanged(FF)V\" since=\"22\"/>\n\t\t<method name=\"dispatchFinishTemporaryDetach()V\" since=\"24\"/>\n\t\t<method name=\"dispatchGenericFocusedEvent(Landroid/view/MotionEvent;)Z\" since=\"14\"/>\n\t\t<method name=\"dispatchGenericMotionEvent(Landroid/view/MotionEvent;)Z\" since=\"12\"/>\n\t\t<method name=\"dispatchGenericPointerEvent(Landroid/view/MotionEvent;)Z\" since=\"14\"/>\n\t\t<method name=\"dispatchHoverEvent(Landroid/view/MotionEvent;)Z\" since=\"14\"/>\n\t\t<method name=\"dispatchKeyEvent(Landroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"dispatchKeyEventPreIme(Landroid/view/KeyEvent;)Z\" since=\"3\"/>\n\t\t<method name=\"dispatchKeyShortcutEvent(Landroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"dispatchNestedFling(FFZ)Z\" since=\"21\"/>\n\t\t<method name=\"dispatchNestedPreFling(FF)Z\" since=\"21\"/>\n\t\t<method name=\"dispatchNestedPrePerformAccessibilityAction(ILandroid/os/Bundle;)Z\" since=\"22\"/>\n\t\t<method name=\"dispatchNestedPreScroll(II[I[I)Z\" since=\"21\"/>\n\t\t<method name=\"dispatchNestedScroll(IIII[I)Z\" since=\"21\"/>\n\t\t<method name=\"dispatchPointerCaptureChanged(Z)V\" since=\"26\"/>\n\t\t<method name=\"dispatchPopulateAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)Z\" since=\"4\"/>\n\t\t<method name=\"dispatchProvideAutofillStructure(Landroid/view/ViewStructure;I)V\" since=\"26\"/>\n\t\t<method name=\"dispatchProvideStructure(Landroid/view/ViewStructure;)V\" since=\"23\"/>\n\t\t<method name=\"dispatchRestoreInstanceState(Landroid/util/SparseArray;)V\"/>\n\t\t<method name=\"dispatchSaveInstanceState(Landroid/util/SparseArray;)V\"/>\n\t\t<method name=\"dispatchSetActivated(Z)V\" since=\"11\"/>\n\t\t<method name=\"dispatchSetPressed(Z)V\"/>\n\t\t<method name=\"dispatchSetSelected(Z)V\"/>\n\t\t<method name=\"dispatchStartTemporaryDetach()V\" since=\"24\"/>\n\t\t<method name=\"dispatchSystemUiVisibilityChanged(I)V\" since=\"11\"/>\n\t\t<method name=\"dispatchTouchEvent(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"dispatchTrackballEvent(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"dispatchUnhandledMove(Landroid/view/View;I)Z\"/>\n\t\t<method name=\"dispatchVisibilityChanged(Landroid/view/View;I)V\" since=\"8\"/>\n\t\t<method name=\"dispatchWindowFocusChanged(Z)V\"/>\n\t\t<method name=\"dispatchWindowSystemUiVisiblityChanged(I)V\" since=\"16\"/>\n\t\t<method name=\"dispatchWindowVisibilityChanged(I)V\"/>\n\t\t<method name=\"draw(Landroid/graphics/Canvas;)V\"/>\n\t\t<method name=\"drawableHotspotChanged(FF)V\" since=\"21\"/>\n\t\t<method name=\"drawableStateChanged()V\"/>\n\t\t<method name=\"findFocus()Landroid/view/View;\"/>\n\t\t<method name=\"findViewById(I)Landroid/view/View;\"/>\n\t\t<method name=\"findViewWithTag(Ljava/lang/Object;)Landroid/view/View;\"/>\n\t\t<method name=\"findViewsWithText(Ljava/util/ArrayList;Ljava/lang/CharSequence;I)V\" since=\"14\"/>\n\t\t<method name=\"fitSystemWindows(Landroid/graphics/Rect;)Z\" deprecated=\"20\"/>\n\t\t<method name=\"fitsSystemWindows()Z\" since=\"14\" removed=\"16\"/>\n\t\t<method name=\"focusSearch(I)Landroid/view/View;\"/>\n\t\t<method name=\"forceHasOverlappingRendering(Z)V\" since=\"24\"/>\n\t\t<method name=\"forceLayout()V\"/>\n\t\t<method name=\"generateViewId()I\" since=\"17\"/>\n\t\t<method name=\"getAccessibilityClassName()Ljava/lang/CharSequence;\" since=\"23\"/>\n\t\t<method name=\"getAccessibilityDelegate()Landroid/view/View$AccessibilityDelegate;\" since=\"29\"/>\n\t\t<method name=\"getAccessibilityLiveRegion()I\" since=\"19\"/>\n\t\t<method name=\"getAccessibilityNodeProvider()Landroid/view/accessibility/AccessibilityNodeProvider;\" since=\"16\"/>\n\t\t<method name=\"getAccessibilityPaneTitle()Ljava/lang/CharSequence;\" since=\"28\"/>\n\t\t<method name=\"getAccessibilityTraversalAfter()I\" since=\"22\"/>\n\t\t<method name=\"getAccessibilityTraversalBefore()I\" since=\"22\"/>\n\t\t<method name=\"getAlpha()F\" since=\"11\"/>\n\t\t<method name=\"getAnimation()Landroid/view/animation/Animation;\"/>\n\t\t<method name=\"getAnimationMatrix()Landroid/graphics/Matrix;\" since=\"29\"/>\n\t\t<method name=\"getApplicationWindowToken()Landroid/os/IBinder;\"/>\n\t\t<method name=\"getAttributeResolutionStack(I)[I\" since=\"29\"/>\n\t\t<method name=\"getAttributeSourceResourceMap()Ljava/util/Map;\" since=\"29\"/>\n\t\t<method name=\"getAutofillHints()[Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getAutofillId()Landroid/view/autofill/AutofillId;\" since=\"26\"/>\n\t\t<method name=\"getAutofillType()I\" since=\"26\"/>\n\t\t<method name=\"getAutofillValue()Landroid/view/autofill/AutofillValue;\" since=\"26\"/>\n\t\t<method name=\"getBackground()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getBackgroundTintBlendMode()Landroid/graphics/BlendMode;\" since=\"29\"/>\n\t\t<method name=\"getBackgroundTintList()Landroid/content/res/ColorStateList;\" since=\"21\"/>\n\t\t<method name=\"getBackgroundTintMode()Landroid/graphics/PorterDuff$Mode;\" since=\"21\"/>\n\t\t<method name=\"getBaseline()I\"/>\n\t\t<method name=\"getBottom()I\"/>\n\t\t<method name=\"getBottomFadingEdgeStrength()F\"/>\n\t\t<method name=\"getBottomPaddingOffset()I\" since=\"2\"/>\n\t\t<method name=\"getCameraDistance()F\" since=\"16\"/>\n\t\t<method name=\"getClipBounds()Landroid/graphics/Rect;\" since=\"18\"/>\n\t\t<method name=\"getClipBounds(Landroid/graphics/Rect;)Z\" since=\"23\"/>\n\t\t<method name=\"getClipToOutline()Z\" since=\"21\"/>\n\t\t<method name=\"getContentCaptureSession()Landroid/view/contentcapture/ContentCaptureSession;\" since=\"29\"/>\n\t\t<method name=\"getContentDescription()Ljava/lang/CharSequence;\" since=\"4\"/>\n\t\t<method name=\"getContext()Landroid/content/Context;\"/>\n\t\t<method name=\"getContextMenuInfo()Landroid/view/ContextMenu$ContextMenuInfo;\"/>\n\t\t<method name=\"getDefaultFocusHighlightEnabled()Z\" since=\"26\"/>\n\t\t<method name=\"getDefaultSize(II)I\"/>\n\t\t<method name=\"getDisplay()Landroid/view/Display;\" since=\"17\"/>\n\t\t<method name=\"getDrawableState()[I\"/>\n\t\t<method name=\"getDrawingCache()Landroid/graphics/Bitmap;\" deprecated=\"28\"/>\n\t\t<method name=\"getDrawingCache(Z)Landroid/graphics/Bitmap;\" since=\"4\" deprecated=\"28\"/>\n\t\t<method name=\"getDrawingCacheBackgroundColor()I\" deprecated=\"28\"/>\n\t\t<method name=\"getDrawingCacheQuality()I\" deprecated=\"28\"/>\n\t\t<method name=\"getDrawingRect(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"getDrawingTime()J\"/>\n\t\t<method name=\"getElevation()F\" since=\"21\"/>\n\t\t<method name=\"getExplicitStyle()I\" since=\"29\"/>\n\t\t<method name=\"getFilterTouchesWhenObscured()Z\" since=\"9\"/>\n\t\t<method name=\"getFitsSystemWindows()Z\" since=\"16\"/>\n\t\t<method name=\"getFocusable()I\" since=\"26\"/>\n\t\t<method name=\"getFocusables(I)Ljava/util/ArrayList;\"/>\n\t\t<method name=\"getFocusedRect(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"getForeground()Landroid/graphics/drawable/Drawable;\" since=\"23\"/>\n\t\t<method name=\"getForegroundGravity()I\" since=\"23\"/>\n\t\t<method name=\"getForegroundTintBlendMode()Landroid/graphics/BlendMode;\" since=\"29\"/>\n\t\t<method name=\"getForegroundTintList()Landroid/content/res/ColorStateList;\" since=\"23\"/>\n\t\t<method name=\"getForegroundTintMode()Landroid/graphics/PorterDuff$Mode;\" since=\"23\"/>\n\t\t<method name=\"getGlobalVisibleRect(Landroid/graphics/Rect;)Z\"/>\n\t\t<method name=\"getGlobalVisibleRect(Landroid/graphics/Rect;Landroid/graphics/Point;)Z\"/>\n\t\t<method name=\"getHandler()Landroid/os/Handler;\"/>\n\t\t<method name=\"getHasOverlappingRendering()Z\" since=\"24\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getHitRect(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"getHorizontalFadingEdgeLength()I\"/>\n\t\t<method name=\"getHorizontalScrollbarHeight()I\"/>\n\t\t<method name=\"getHorizontalScrollbarThumbDrawable()Landroid/graphics/drawable/Drawable;\" since=\"29\"/>\n\t\t<method name=\"getHorizontalScrollbarTrackDrawable()Landroid/graphics/drawable/Drawable;\" since=\"29\"/>\n\t\t<method name=\"getId()I\"/>\n\t\t<method name=\"getImportantForAccessibility()I\" since=\"16\"/>\n\t\t<method name=\"getImportantForAutofill()I\" since=\"26\"/>\n\t\t<method name=\"getKeepScreenOn()Z\"/>\n\t\t<method name=\"getKeyDispatcherState()Landroid/view/KeyEvent$DispatcherState;\" since=\"5\"/>\n\t\t<method name=\"getLabelFor()I\" since=\"17\"/>\n\t\t<method name=\"getLayerType()I\" since=\"11\"/>\n\t\t<method name=\"getLayoutDirection()I\" since=\"17\"/>\n\t\t<method name=\"getLayoutParams()Landroid/view/ViewGroup$LayoutParams;\"/>\n\t\t<method name=\"getLeft()I\"/>\n\t\t<method name=\"getLeftFadingEdgeStrength()F\"/>\n\t\t<method name=\"getLeftPaddingOffset()I\" since=\"2\"/>\n\t\t<method name=\"getLocalVisibleRect(Landroid/graphics/Rect;)Z\"/>\n\t\t<method name=\"getLocationInSurface([I)V\" since=\"29\"/>\n\t\t<method name=\"getLocationInWindow([I)V\"/>\n\t\t<method name=\"getLocationOnScreen([I)V\"/>\n\t\t<method name=\"getMatrix()Landroid/graphics/Matrix;\" since=\"11\"/>\n\t\t<method name=\"getMeasuredHeight()I\"/>\n\t\t<method name=\"getMeasuredHeightAndState()I\" since=\"11\"/>\n\t\t<method name=\"getMeasuredState()I\" since=\"11\"/>\n\t\t<method name=\"getMeasuredWidth()I\"/>\n\t\t<method name=\"getMeasuredWidthAndState()I\" since=\"11\"/>\n\t\t<method name=\"getMinimumHeight()I\" since=\"16\"/>\n\t\t<method name=\"getMinimumWidth()I\" since=\"16\"/>\n\t\t<method name=\"getNextClusterForwardId()I\" since=\"26\"/>\n\t\t<method name=\"getNextFocusDownId()I\"/>\n\t\t<method name=\"getNextFocusForwardId()I\" since=\"11\"/>\n\t\t<method name=\"getNextFocusLeftId()I\"/>\n\t\t<method name=\"getNextFocusRightId()I\"/>\n\t\t<method name=\"getNextFocusUpId()I\"/>\n\t\t<method name=\"getOnFocusChangeListener()Landroid/view/View$OnFocusChangeListener;\"/>\n\t\t<method name=\"getOutlineAmbientShadowColor()I\" since=\"28\"/>\n\t\t<method name=\"getOutlineProvider()Landroid/view/ViewOutlineProvider;\" since=\"21\"/>\n\t\t<method name=\"getOutlineSpotShadowColor()I\" since=\"28\"/>\n\t\t<method name=\"getOverScrollMode()I\" since=\"9\"/>\n\t\t<method name=\"getOverlay()Landroid/view/ViewOverlay;\" since=\"18\"/>\n\t\t<method name=\"getPaddingBottom()I\"/>\n\t\t<method name=\"getPaddingEnd()I\" since=\"17\"/>\n\t\t<method name=\"getPaddingLeft()I\"/>\n\t\t<method name=\"getPaddingRight()I\"/>\n\t\t<method name=\"getPaddingStart()I\" since=\"17\"/>\n\t\t<method name=\"getPaddingTop()I\"/>\n\t\t<method name=\"getParent()Landroid/view/ViewParent;\"/>\n\t\t<method name=\"getParentForAccessibility()Landroid/view/ViewParent;\" since=\"16\"/>\n\t\t<method name=\"getPivotX()F\" since=\"11\"/>\n\t\t<method name=\"getPivotY()F\" since=\"11\"/>\n\t\t<method name=\"getPointerIcon()Landroid/view/PointerIcon;\" since=\"24\"/>\n\t\t<method name=\"getResources()Landroid/content/res/Resources;\"/>\n\t\t<method name=\"getRevealOnFocusHint()Z\" since=\"25\"/>\n\t\t<method name=\"getRight()I\"/>\n\t\t<method name=\"getRightFadingEdgeStrength()F\"/>\n\t\t<method name=\"getRightPaddingOffset()I\" since=\"2\"/>\n\t\t<method name=\"getRootView()Landroid/view/View;\"/>\n\t\t<method name=\"getRootWindowInsets()Landroid/view/WindowInsets;\" since=\"23\"/>\n\t\t<method name=\"getRotation()F\" since=\"11\"/>\n\t\t<method name=\"getRotationX()F\" since=\"11\"/>\n\t\t<method name=\"getRotationY()F\" since=\"11\"/>\n\t\t<method name=\"getScaleX()F\" since=\"11\"/>\n\t\t<method name=\"getScaleY()F\" since=\"11\"/>\n\t\t<method name=\"getScrollBarDefaultDelayBeforeFade()I\" since=\"16\"/>\n\t\t<method name=\"getScrollBarFadeDuration()I\" since=\"16\"/>\n\t\t<method name=\"getScrollBarSize()I\" since=\"16\"/>\n\t\t<method name=\"getScrollBarStyle()I\"/>\n\t\t<method name=\"getScrollIndicators()I\" since=\"23\"/>\n\t\t<method name=\"getScrollX()I\"/>\n\t\t<method name=\"getScrollY()I\"/>\n\t\t<method name=\"getSolidColor()I\"/>\n\t\t<method name=\"getSourceLayoutResId()I\" since=\"29\"/>\n\t\t<method name=\"getStateListAnimator()Landroid/animation/StateListAnimator;\" since=\"21\"/>\n\t\t<method name=\"getSuggestedMinimumHeight()I\"/>\n\t\t<method name=\"getSuggestedMinimumWidth()I\"/>\n\t\t<method name=\"getSystemGestureExclusionRects()Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"getSystemUiVisibility()I\" since=\"11\"/>\n\t\t<method name=\"getTag()Ljava/lang/Object;\"/>\n\t\t<method name=\"getTag(I)Ljava/lang/Object;\" since=\"4\"/>\n\t\t<method name=\"getTextAlignment()I\" since=\"17\"/>\n\t\t<method name=\"getTextDirection()I\" since=\"17\"/>\n\t\t<method name=\"getTooltipText()Ljava/lang/CharSequence;\" since=\"26\"/>\n\t\t<method name=\"getTop()I\"/>\n\t\t<method name=\"getTopFadingEdgeStrength()F\"/>\n\t\t<method name=\"getTopPaddingOffset()I\" since=\"2\"/>\n\t\t<method name=\"getTouchDelegate()Landroid/view/TouchDelegate;\"/>\n\t\t<method name=\"getTouchables()Ljava/util/ArrayList;\"/>\n\t\t<method name=\"getTransitionAlpha()F\" since=\"29\"/>\n\t\t<method name=\"getTransitionName()Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"getTranslationX()F\" since=\"11\"/>\n\t\t<method name=\"getTranslationY()F\" since=\"11\"/>\n\t\t<method name=\"getTranslationZ()F\" since=\"21\"/>\n\t\t<method name=\"getUniqueDrawingId()J\" since=\"29\"/>\n\t\t<method name=\"getVerticalFadingEdgeLength()I\"/>\n\t\t<method name=\"getVerticalScrollbarPosition()I\" since=\"11\"/>\n\t\t<method name=\"getVerticalScrollbarThumbDrawable()Landroid/graphics/drawable/Drawable;\" since=\"29\"/>\n\t\t<method name=\"getVerticalScrollbarTrackDrawable()Landroid/graphics/drawable/Drawable;\" since=\"29\"/>\n\t\t<method name=\"getVerticalScrollbarWidth()I\"/>\n\t\t<method name=\"getViewTreeObserver()Landroid/view/ViewTreeObserver;\"/>\n\t\t<method name=\"getVisibility()I\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t\t<method name=\"getWindowAttachCount()I\"/>\n\t\t<method name=\"getWindowId()Landroid/view/WindowId;\" since=\"18\"/>\n\t\t<method name=\"getWindowSystemUiVisibility()I\" since=\"16\"/>\n\t\t<method name=\"getWindowToken()Landroid/os/IBinder;\"/>\n\t\t<method name=\"getWindowVisibility()I\"/>\n\t\t<method name=\"getWindowVisibleDisplayFrame(Landroid/graphics/Rect;)V\" since=\"3\"/>\n\t\t<method name=\"getX()F\" since=\"11\"/>\n\t\t<method name=\"getY()F\" since=\"11\"/>\n\t\t<method name=\"getZ()F\" since=\"21\"/>\n\t\t<method name=\"hasExplicitFocusable()Z\" since=\"26\"/>\n\t\t<method name=\"hasFocus()Z\"/>\n\t\t<method name=\"hasFocusable()Z\"/>\n\t\t<method name=\"hasNestedScrollingParent()Z\" since=\"21\"/>\n\t\t<method name=\"hasOnClickListeners()Z\" since=\"15\"/>\n\t\t<method name=\"hasOverlappingRendering()Z\" since=\"16\"/>\n\t\t<method name=\"hasPointerCapture()Z\" since=\"26\"/>\n\t\t<method name=\"hasTransientState()Z\" since=\"16\"/>\n\t\t<method name=\"hasWindowFocus()Z\"/>\n\t\t<method name=\"inflate(Landroid/content/Context;ILandroid/view/ViewGroup;)Landroid/view/View;\"/>\n\t\t<method name=\"initializeFadingEdge(Landroid/content/res/TypedArray;)V\" removed=\"21\"/>\n\t\t<method name=\"initializeScrollbars(Landroid/content/res/TypedArray;)V\" removed=\"21\"/>\n\t\t<method name=\"invalidate()V\"/>\n\t\t<method name=\"invalidate(IIII)V\" deprecated=\"28\"/>\n\t\t<method name=\"invalidate(Landroid/graphics/Rect;)V\" deprecated=\"28\"/>\n\t\t<method name=\"invalidateOutline()V\" since=\"21\"/>\n\t\t<method name=\"isAccessibilityFocused()Z\" since=\"21\"/>\n\t\t<method name=\"isAccessibilityHeading()Z\" since=\"28\"/>\n\t\t<method name=\"isActivated()Z\" since=\"11\"/>\n\t\t<method name=\"isAttachedToWindow()Z\" since=\"19\"/>\n\t\t<method name=\"isClickable()Z\"/>\n\t\t<method name=\"isContextClickable()Z\" since=\"23\"/>\n\t\t<method name=\"isDirty()Z\" since=\"11\"/>\n\t\t<method name=\"isDrawingCacheEnabled()Z\" deprecated=\"28\"/>\n\t\t<method name=\"isDuplicateParentStateEnabled()Z\"/>\n\t\t<method name=\"isEnabled()Z\"/>\n\t\t<method name=\"isFocusable()Z\"/>\n\t\t<method name=\"isFocusableInTouchMode()Z\"/>\n\t\t<method name=\"isFocused()Z\"/>\n\t\t<method name=\"isFocusedByDefault()Z\" since=\"26\"/>\n\t\t<method name=\"isForceDarkAllowed()Z\" since=\"29\"/>\n\t\t<method name=\"isHapticFeedbackEnabled()Z\" since=\"3\"/>\n\t\t<method name=\"isHardwareAccelerated()Z\" since=\"11\"/>\n\t\t<method name=\"isHorizontalFadingEdgeEnabled()Z\"/>\n\t\t<method name=\"isHorizontalScrollBarEnabled()Z\"/>\n\t\t<method name=\"isHovered()Z\" since=\"14\"/>\n\t\t<method name=\"isImportantForAccessibility()Z\" since=\"21\"/>\n\t\t<method name=\"isImportantForAutofill()Z\" since=\"26\"/>\n\t\t<method name=\"isInEditMode()Z\" since=\"3\"/>\n\t\t<method name=\"isInLayout()Z\" since=\"18\"/>\n\t\t<method name=\"isInTouchMode()Z\"/>\n\t\t<method name=\"isKeyboardNavigationCluster()Z\" since=\"26\"/>\n\t\t<method name=\"isLaidOut()Z\" since=\"19\"/>\n\t\t<method name=\"isLayoutDirectionResolved()Z\" since=\"19\"/>\n\t\t<method name=\"isLayoutRequested()Z\"/>\n\t\t<method name=\"isLongClickable()Z\"/>\n\t\t<method name=\"isNestedScrollingEnabled()Z\" since=\"21\"/>\n\t\t<method name=\"isOpaque()Z\" since=\"7\"/>\n\t\t<method name=\"isPaddingOffsetRequired()Z\" since=\"2\"/>\n\t\t<method name=\"isPaddingRelative()Z\" since=\"17\"/>\n\t\t<method name=\"isPivotSet()Z\" since=\"28\"/>\n\t\t<method name=\"isPressed()Z\"/>\n\t\t<method name=\"isSaveEnabled()Z\"/>\n\t\t<method name=\"isSaveFromParentEnabled()Z\" since=\"11\"/>\n\t\t<method name=\"isScreenReaderFocusable()Z\" since=\"28\"/>\n\t\t<method name=\"isScrollContainer()Z\" since=\"16\"/>\n\t\t<method name=\"isScrollbarFadingEnabled()Z\" since=\"5\"/>\n\t\t<method name=\"isSelected()Z\"/>\n\t\t<method name=\"isShown()Z\"/>\n\t\t<method name=\"isSoundEffectsEnabled()Z\"/>\n\t\t<method name=\"isTemporarilyDetached()Z\" since=\"24\"/>\n\t\t<method name=\"isTextAlignmentResolved()Z\" since=\"19\"/>\n\t\t<method name=\"isTextDirectionResolved()Z\" since=\"19\"/>\n\t\t<method name=\"isVerticalFadingEdgeEnabled()Z\"/>\n\t\t<method name=\"isVerticalScrollBarEnabled()Z\"/>\n\t\t<method name=\"isVisibleToUserForAutofill(I)Z\" since=\"28\"/>\n\t\t<method name=\"jumpDrawablesToCurrentState()V\" since=\"11\"/>\n\t\t<method name=\"keyboardNavigationClusterSearch(Landroid/view/View;I)Landroid/view/View;\" since=\"26\"/>\n\t\t<method name=\"layout(IIII)V\"/>\n\t\t<method name=\"measure(II)V\"/>\n\t\t<method name=\"mergeDrawableStates([I[I)[I\"/>\n\t\t<method name=\"offsetLeftAndRight(I)V\"/>\n\t\t<method name=\"offsetTopAndBottom(I)V\"/>\n\t\t<method name=\"onAnimationEnd()V\"/>\n\t\t<method name=\"onAnimationStart()V\"/>\n\t\t<method name=\"onApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;\" since=\"20\"/>\n\t\t<method name=\"onAttachedToWindow()V\"/>\n\t\t<method name=\"onCancelPendingInputEvents()V\" since=\"19\"/>\n\t\t<method name=\"onCapturedPointerEvent(Landroid/view/MotionEvent;)Z\" since=\"26\"/>\n\t\t<method name=\"onCheckIsTextEditor()Z\" since=\"3\"/>\n\t\t<method name=\"onConfigurationChanged(Landroid/content/res/Configuration;)V\" since=\"8\"/>\n\t\t<method name=\"onCreateContextMenu(Landroid/view/ContextMenu;)V\"/>\n\t\t<method name=\"onCreateDrawableState(I)[I\"/>\n\t\t<method name=\"onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection;\" since=\"3\"/>\n\t\t<method name=\"onDetachedFromWindow()V\"/>\n\t\t<method name=\"onDisplayHint(I)V\" since=\"8\"/>\n\t\t<method name=\"onDragEvent(Landroid/view/DragEvent;)Z\" since=\"11\"/>\n\t\t<method name=\"onDraw(Landroid/graphics/Canvas;)V\"/>\n\t\t<method name=\"onDrawForeground(Landroid/graphics/Canvas;)V\" since=\"23\"/>\n\t\t<method name=\"onDrawScrollBars(Landroid/graphics/Canvas;)V\" since=\"7\"/>\n\t\t<method name=\"onFilterTouchEventForSecurity(Landroid/view/MotionEvent;)Z\" since=\"9\"/>\n\t\t<method name=\"onFinishInflate()V\"/>\n\t\t<method name=\"onFinishTemporaryDetach()V\" since=\"3\"/>\n\t\t<method name=\"onFocusChanged(ZILandroid/graphics/Rect;)V\"/>\n\t\t<method name=\"onGenericMotionEvent(Landroid/view/MotionEvent;)Z\" since=\"12\"/>\n\t\t<method name=\"onHoverChanged(Z)V\" since=\"14\"/>\n\t\t<method name=\"onHoverEvent(Landroid/view/MotionEvent;)Z\" since=\"14\"/>\n\t\t<method name=\"onInitializeAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V\" since=\"14\"/>\n\t\t<method name=\"onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V\" since=\"14\"/>\n\t\t<method name=\"onKeyPreIme(ILandroid/view/KeyEvent;)Z\" since=\"3\"/>\n\t\t<method name=\"onKeyShortcut(ILandroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"onLayout(ZIIII)V\"/>\n\t\t<method name=\"onMeasure(II)V\"/>\n\t\t<method name=\"onOverScrolled(IIZZ)V\" since=\"9\"/>\n\t\t<method name=\"onPointerCaptureChange(Z)V\" since=\"26\"/>\n\t\t<method name=\"onPopulateAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V\" since=\"14\"/>\n\t\t<method name=\"onProvideAutofillStructure(Landroid/view/ViewStructure;I)V\" since=\"26\"/>\n\t\t<method name=\"onProvideAutofillVirtualStructure(Landroid/view/ViewStructure;I)V\" since=\"26\"/>\n\t\t<method name=\"onProvideStructure(Landroid/view/ViewStructure;)V\" since=\"23\"/>\n\t\t<method name=\"onProvideVirtualStructure(Landroid/view/ViewStructure;)V\" since=\"23\"/>\n\t\t<method name=\"onResolvePointerIcon(Landroid/view/MotionEvent;I)Landroid/view/PointerIcon;\" since=\"24\"/>\n\t\t<method name=\"onRestoreInstanceState(Landroid/os/Parcelable;)V\"/>\n\t\t<method name=\"onRtlPropertiesChanged(I)V\" since=\"17\"/>\n\t\t<method name=\"onSaveInstanceState()Landroid/os/Parcelable;\"/>\n\t\t<method name=\"onScreenStateChanged(I)V\" since=\"16\"/>\n\t\t<method name=\"onScrollChanged(IIII)V\"/>\n\t\t<method name=\"onSetAlpha(I)Z\"/>\n\t\t<method name=\"onSizeChanged(IIII)V\"/>\n\t\t<method name=\"onStartTemporaryDetach()V\" since=\"3\"/>\n\t\t<method name=\"onTouchEvent(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"onTrackballEvent(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"onVisibilityAggregated(Z)V\" since=\"24\"/>\n\t\t<method name=\"onVisibilityChanged(Landroid/view/View;I)V\" since=\"8\"/>\n\t\t<method name=\"onWindowFocusChanged(Z)V\"/>\n\t\t<method name=\"onWindowSystemUiVisibilityChanged(I)V\" since=\"16\"/>\n\t\t<method name=\"onWindowVisibilityChanged(I)V\"/>\n\t\t<method name=\"overScrollBy(IIIIIIIIZ)Z\" since=\"9\"/>\n\t\t<method name=\"performAccessibilityAction(ILandroid/os/Bundle;)Z\" since=\"16\"/>\n\t\t<method name=\"performClick()Z\"/>\n\t\t<method name=\"performContextClick()Z\" since=\"23\"/>\n\t\t<method name=\"performContextClick(FF)Z\" since=\"24\"/>\n\t\t<method name=\"performHapticFeedback(I)Z\" since=\"3\"/>\n\t\t<method name=\"performHapticFeedback(II)Z\" since=\"3\"/>\n\t\t<method name=\"performLongClick()Z\"/>\n\t\t<method name=\"performLongClick(FF)Z\" since=\"24\"/>\n\t\t<method name=\"playSoundEffect(I)V\"/>\n\t\t<method name=\"post(Ljava/lang/Runnable;)Z\"/>\n\t\t<method name=\"postDelayed(Ljava/lang/Runnable;J)Z\"/>\n\t\t<method name=\"postInvalidate()V\"/>\n\t\t<method name=\"postInvalidate(IIII)V\"/>\n\t\t<method name=\"postInvalidateDelayed(J)V\"/>\n\t\t<method name=\"postInvalidateDelayed(JIIII)V\"/>\n\t\t<method name=\"postInvalidateOnAnimation()V\" since=\"16\"/>\n\t\t<method name=\"postInvalidateOnAnimation(IIII)V\" since=\"16\"/>\n\t\t<method name=\"postOnAnimation(Ljava/lang/Runnable;)V\" since=\"16\"/>\n\t\t<method name=\"postOnAnimationDelayed(Ljava/lang/Runnable;J)V\" since=\"16\"/>\n\t\t<method name=\"refreshDrawableState()V\"/>\n\t\t<method name=\"releasePointerCapture()V\" since=\"26\"/>\n\t\t<method name=\"removeCallbacks(Ljava/lang/Runnable;)Z\"/>\n\t\t<method name=\"removeOnAttachStateChangeListener(Landroid/view/View$OnAttachStateChangeListener;)V\" since=\"12\"/>\n\t\t<method name=\"removeOnLayoutChangeListener(Landroid/view/View$OnLayoutChangeListener;)V\" since=\"11\"/>\n\t\t<method name=\"removeOnUnhandledKeyEventListener(Landroid/view/View$OnUnhandledKeyEventListener;)V\" since=\"28\"/>\n\t\t<method name=\"requestApplyInsets()V\" since=\"20\"/>\n\t\t<method name=\"requestFitSystemWindows()V\" since=\"16\" deprecated=\"20\"/>\n\t\t<method name=\"requestFocus()Z\"/>\n\t\t<method name=\"requestFocus(I)Z\"/>\n\t\t<method name=\"requestFocus(ILandroid/graphics/Rect;)Z\"/>\n\t\t<method name=\"requestFocusFromTouch()Z\"/>\n\t\t<method name=\"requestLayout()V\"/>\n\t\t<method name=\"requestPointerCapture()V\" since=\"26\"/>\n\t\t<method name=\"requestRectangleOnScreen(Landroid/graphics/Rect;)Z\"/>\n\t\t<method name=\"requestRectangleOnScreen(Landroid/graphics/Rect;Z)Z\"/>\n\t\t<method name=\"requestUnbufferedDispatch(Landroid/view/MotionEvent;)V\" since=\"21\"/>\n\t\t<method name=\"requireViewById(I)Landroid/view/View;\" since=\"28\"/>\n\t\t<method name=\"resetPivot()V\" since=\"28\"/>\n\t\t<method name=\"resolveSize(II)I\"/>\n\t\t<method name=\"resolveSizeAndState(III)I\" since=\"11\"/>\n\t\t<method name=\"restoreDefaultFocus()Z\" since=\"26\"/>\n\t\t<method name=\"restoreHierarchyState(Landroid/util/SparseArray;)V\"/>\n\t\t<method name=\"saveAttributeDataForStyleable(Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V\" since=\"29\"/>\n\t\t<method name=\"saveHierarchyState(Landroid/util/SparseArray;)V\"/>\n\t\t<method name=\"scrollBy(II)V\"/>\n\t\t<method name=\"scrollTo(II)V\"/>\n\t\t<method name=\"setAccessibilityDelegate(Landroid/view/View$AccessibilityDelegate;)V\" since=\"14\"/>\n\t\t<method name=\"setAccessibilityHeading(Z)V\" since=\"28\"/>\n\t\t<method name=\"setAccessibilityLiveRegion(I)V\" since=\"19\"/>\n\t\t<method name=\"setAccessibilityPaneTitle(Ljava/lang/CharSequence;)V\" since=\"28\"/>\n\t\t<method name=\"setAccessibilityTraversalAfter(I)V\" since=\"22\"/>\n\t\t<method name=\"setAccessibilityTraversalBefore(I)V\" since=\"22\"/>\n\t\t<method name=\"setActivated(Z)V\" since=\"11\"/>\n\t\t<method name=\"setAlpha(F)V\" since=\"11\"/>\n\t\t<method name=\"setAnimation(Landroid/view/animation/Animation;)V\"/>\n\t\t<method name=\"setAnimationMatrix(Landroid/graphics/Matrix;)V\" since=\"29\"/>\n\t\t<method name=\"setAutofillHints([Ljava/lang/String;)V\" since=\"26\"/>\n\t\t<method name=\"setAutofillId(Landroid/view/autofill/AutofillId;)V\" since=\"28\"/>\n\t\t<method name=\"setBackground(Landroid/graphics/drawable/Drawable;)V\" since=\"16\"/>\n\t\t<method name=\"setBackgroundColor(I)V\"/>\n\t\t<method name=\"setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V\" deprecated=\"16\"/>\n\t\t<method name=\"setBackgroundResource(I)V\"/>\n\t\t<method name=\"setBackgroundTintBlendMode(Landroid/graphics/BlendMode;)V\" since=\"29\"/>\n\t\t<method name=\"setBackgroundTintList(Landroid/content/res/ColorStateList;)V\" since=\"21\"/>\n\t\t<method name=\"setBackgroundTintMode(Landroid/graphics/PorterDuff$Mode;)V\" since=\"21\"/>\n\t\t<method name=\"setBottom(I)V\" since=\"11\"/>\n\t\t<method name=\"setCameraDistance(F)V\" since=\"12\"/>\n\t\t<method name=\"setClickable(Z)V\"/>\n\t\t<method name=\"setClipBounds(Landroid/graphics/Rect;)V\" since=\"18\"/>\n\t\t<method name=\"setClipToOutline(Z)V\" since=\"21\"/>\n\t\t<method name=\"setContentCaptureSession(Landroid/view/contentcapture/ContentCaptureSession;)V\" since=\"29\"/>\n\t\t<method name=\"setContentDescription(Ljava/lang/CharSequence;)V\" since=\"4\"/>\n\t\t<method name=\"setContextClickable(Z)V\" since=\"23\"/>\n\t\t<method name=\"setDefaultFocusHighlightEnabled(Z)V\" since=\"26\"/>\n\t\t<method name=\"setDrawingCacheBackgroundColor(I)V\" deprecated=\"28\"/>\n\t\t<method name=\"setDrawingCacheEnabled(Z)V\" deprecated=\"28\"/>\n\t\t<method name=\"setDrawingCacheQuality(I)V\" deprecated=\"28\"/>\n\t\t<method name=\"setDuplicateParentStateEnabled(Z)V\"/>\n\t\t<method name=\"setElevation(F)V\" since=\"21\"/>\n\t\t<method name=\"setEnabled(Z)V\"/>\n\t\t<method name=\"setFadingEdgeLength(I)V\"/>\n\t\t<method name=\"setFilterTouchesWhenObscured(Z)V\" since=\"9\"/>\n\t\t<method name=\"setFitsSystemWindows(Z)V\" since=\"14\"/>\n\t\t<method name=\"setFocusable(I)V\" since=\"26\"/>\n\t\t<method name=\"setFocusable(Z)V\"/>\n\t\t<method name=\"setFocusableInTouchMode(Z)V\"/>\n\t\t<method name=\"setFocusedByDefault(Z)V\" since=\"26\"/>\n\t\t<method name=\"setForceDarkAllowed(Z)V\" since=\"29\"/>\n\t\t<method name=\"setForeground(Landroid/graphics/drawable/Drawable;)V\" since=\"23\"/>\n\t\t<method name=\"setForegroundGravity(I)V\" since=\"23\"/>\n\t\t<method name=\"setForegroundTintBlendMode(Landroid/graphics/BlendMode;)V\" since=\"29\"/>\n\t\t<method name=\"setForegroundTintList(Landroid/content/res/ColorStateList;)V\" since=\"23\"/>\n\t\t<method name=\"setForegroundTintMode(Landroid/graphics/PorterDuff$Mode;)V\" since=\"23\"/>\n\t\t<method name=\"setHapticFeedbackEnabled(Z)V\" since=\"3\"/>\n\t\t<method name=\"setHasTransientState(Z)V\" since=\"16\"/>\n\t\t<method name=\"setHorizontalFadingEdgeEnabled(Z)V\"/>\n\t\t<method name=\"setHorizontalScrollBarEnabled(Z)V\"/>\n\t\t<method name=\"setHorizontalScrollbarThumbDrawable(Landroid/graphics/drawable/Drawable;)V\" since=\"29\"/>\n\t\t<method name=\"setHorizontalScrollbarTrackDrawable(Landroid/graphics/drawable/Drawable;)V\" since=\"29\"/>\n\t\t<method name=\"setHovered(Z)V\" since=\"14\"/>\n\t\t<method name=\"setId(I)V\"/>\n\t\t<method name=\"setImportantForAccessibility(I)V\" since=\"16\"/>\n\t\t<method name=\"setImportantForAutofill(I)V\" since=\"26\"/>\n\t\t<method name=\"setKeepScreenOn(Z)V\"/>\n\t\t<method name=\"setKeyboardNavigationCluster(Z)V\" since=\"26\"/>\n\t\t<method name=\"setLabelFor(I)V\" since=\"17\"/>\n\t\t<method name=\"setLayerPaint(Landroid/graphics/Paint;)V\" since=\"17\"/>\n\t\t<method name=\"setLayerType(ILandroid/graphics/Paint;)V\" since=\"11\"/>\n\t\t<method name=\"setLayoutDirection(I)V\" since=\"17\"/>\n\t\t<method name=\"setLayoutParams(Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"setLeft(I)V\" since=\"11\"/>\n\t\t<method name=\"setLeftTopRightBottom(IIII)V\" since=\"29\"/>\n\t\t<method name=\"setLongClickable(Z)V\"/>\n\t\t<method name=\"setMeasuredDimension(II)V\"/>\n\t\t<method name=\"setMinimumHeight(I)V\"/>\n\t\t<method name=\"setMinimumWidth(I)V\"/>\n\t\t<method name=\"setNestedScrollingEnabled(Z)V\" since=\"21\"/>\n\t\t<method name=\"setNextClusterForwardId(I)V\" since=\"26\"/>\n\t\t<method name=\"setNextFocusDownId(I)V\"/>\n\t\t<method name=\"setNextFocusForwardId(I)V\" since=\"11\"/>\n\t\t<method name=\"setNextFocusLeftId(I)V\"/>\n\t\t<method name=\"setNextFocusRightId(I)V\"/>\n\t\t<method name=\"setNextFocusUpId(I)V\"/>\n\t\t<method name=\"setOnApplyWindowInsetsListener(Landroid/view/View$OnApplyWindowInsetsListener;)V\" since=\"20\"/>\n\t\t<method name=\"setOnCapturedPointerListener(Landroid/view/View$OnCapturedPointerListener;)V\" since=\"26\"/>\n\t\t<method name=\"setOnClickListener(Landroid/view/View$OnClickListener;)V\"/>\n\t\t<method name=\"setOnContextClickListener(Landroid/view/View$OnContextClickListener;)V\" since=\"23\"/>\n\t\t<method name=\"setOnCreateContextMenuListener(Landroid/view/View$OnCreateContextMenuListener;)V\"/>\n\t\t<method name=\"setOnDragListener(Landroid/view/View$OnDragListener;)V\" since=\"11\"/>\n\t\t<method name=\"setOnFocusChangeListener(Landroid/view/View$OnFocusChangeListener;)V\"/>\n\t\t<method name=\"setOnGenericMotionListener(Landroid/view/View$OnGenericMotionListener;)V\" since=\"12\"/>\n\t\t<method name=\"setOnHoverListener(Landroid/view/View$OnHoverListener;)V\" since=\"14\"/>\n\t\t<method name=\"setOnKeyListener(Landroid/view/View$OnKeyListener;)V\"/>\n\t\t<method name=\"setOnLongClickListener(Landroid/view/View$OnLongClickListener;)V\"/>\n\t\t<method name=\"setOnScrollChangeListener(Landroid/view/View$OnScrollChangeListener;)V\" since=\"23\"/>\n\t\t<method name=\"setOnSystemUiVisibilityChangeListener(Landroid/view/View$OnSystemUiVisibilityChangeListener;)V\" since=\"11\"/>\n\t\t<method name=\"setOnTouchListener(Landroid/view/View$OnTouchListener;)V\"/>\n\t\t<method name=\"setOutlineAmbientShadowColor(I)V\" since=\"28\"/>\n\t\t<method name=\"setOutlineProvider(Landroid/view/ViewOutlineProvider;)V\" since=\"21\"/>\n\t\t<method name=\"setOutlineSpotShadowColor(I)V\" since=\"28\"/>\n\t\t<method name=\"setOverScrollMode(I)V\" since=\"9\"/>\n\t\t<method name=\"setPadding(IIII)V\"/>\n\t\t<method name=\"setPaddingRelative(IIII)V\" since=\"17\"/>\n\t\t<method name=\"setPivotX(F)V\" since=\"11\"/>\n\t\t<method name=\"setPivotY(F)V\" since=\"11\"/>\n\t\t<method name=\"setPointerIcon(Landroid/view/PointerIcon;)V\" since=\"24\"/>\n\t\t<method name=\"setPressed(Z)V\"/>\n\t\t<method name=\"setRevealOnFocusHint(Z)V\" since=\"25\"/>\n\t\t<method name=\"setRight(I)V\" since=\"11\"/>\n\t\t<method name=\"setRotation(F)V\" since=\"11\"/>\n\t\t<method name=\"setRotationX(F)V\" since=\"11\"/>\n\t\t<method name=\"setRotationY(F)V\" since=\"11\"/>\n\t\t<method name=\"setSaveEnabled(Z)V\"/>\n\t\t<method name=\"setSaveFromParentEnabled(Z)V\" since=\"11\"/>\n\t\t<method name=\"setScaleX(F)V\" since=\"11\"/>\n\t\t<method name=\"setScaleY(F)V\" since=\"11\"/>\n\t\t<method name=\"setScreenReaderFocusable(Z)V\" since=\"28\"/>\n\t\t<method name=\"setScrollBarDefaultDelayBeforeFade(I)V\" since=\"16\"/>\n\t\t<method name=\"setScrollBarFadeDuration(I)V\" since=\"16\"/>\n\t\t<method name=\"setScrollBarSize(I)V\" since=\"16\"/>\n\t\t<method name=\"setScrollBarStyle(I)V\"/>\n\t\t<method name=\"setScrollContainer(Z)V\" since=\"3\"/>\n\t\t<method name=\"setScrollIndicators(I)V\" since=\"23\"/>\n\t\t<method name=\"setScrollIndicators(II)V\" since=\"23\"/>\n\t\t<method name=\"setScrollX(I)V\" since=\"14\"/>\n\t\t<method name=\"setScrollY(I)V\" since=\"14\"/>\n\t\t<method name=\"setScrollbarFadingEnabled(Z)V\" since=\"5\"/>\n\t\t<method name=\"setSelected(Z)V\"/>\n\t\t<method name=\"setSoundEffectsEnabled(Z)V\"/>\n\t\t<method name=\"setStateListAnimator(Landroid/animation/StateListAnimator;)V\" since=\"21\"/>\n\t\t<method name=\"setSystemGestureExclusionRects(Ljava/util/List;)V\" since=\"29\"/>\n\t\t<method name=\"setSystemUiVisibility(I)V\" since=\"11\"/>\n\t\t<method name=\"setTag(ILjava/lang/Object;)V\" since=\"4\"/>\n\t\t<method name=\"setTag(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"setTextAlignment(I)V\" since=\"17\"/>\n\t\t<method name=\"setTextDirection(I)V\" since=\"17\"/>\n\t\t<method name=\"setTooltipText(Ljava/lang/CharSequence;)V\" since=\"26\"/>\n\t\t<method name=\"setTop(I)V\" since=\"11\"/>\n\t\t<method name=\"setTouchDelegate(Landroid/view/TouchDelegate;)V\"/>\n\t\t<method name=\"setTransitionAlpha(F)V\" since=\"29\"/>\n\t\t<method name=\"setTransitionName(Ljava/lang/String;)V\" since=\"21\"/>\n\t\t<method name=\"setTransitionVisibility(I)V\" since=\"29\"/>\n\t\t<method name=\"setTranslationX(F)V\" since=\"11\"/>\n\t\t<method name=\"setTranslationY(F)V\" since=\"11\"/>\n\t\t<method name=\"setTranslationZ(F)V\" since=\"21\"/>\n\t\t<method name=\"setVerticalFadingEdgeEnabled(Z)V\"/>\n\t\t<method name=\"setVerticalScrollBarEnabled(Z)V\"/>\n\t\t<method name=\"setVerticalScrollbarPosition(I)V\" since=\"11\"/>\n\t\t<method name=\"setVerticalScrollbarThumbDrawable(Landroid/graphics/drawable/Drawable;)V\" since=\"29\"/>\n\t\t<method name=\"setVerticalScrollbarTrackDrawable(Landroid/graphics/drawable/Drawable;)V\" since=\"29\"/>\n\t\t<method name=\"setVisibility(I)V\"/>\n\t\t<method name=\"setWillNotCacheDrawing(Z)V\" deprecated=\"28\"/>\n\t\t<method name=\"setWillNotDraw(Z)V\"/>\n\t\t<method name=\"setX(F)V\" since=\"11\"/>\n\t\t<method name=\"setY(F)V\" since=\"11\"/>\n\t\t<method name=\"setZ(F)V\" since=\"21\"/>\n\t\t<method name=\"showContextMenu()Z\"/>\n\t\t<method name=\"showContextMenu(FF)Z\" since=\"24\"/>\n\t\t<method name=\"startActionMode(Landroid/view/ActionMode$Callback;)Landroid/view/ActionMode;\" since=\"11\"/>\n\t\t<method name=\"startActionMode(Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;\" since=\"23\"/>\n\t\t<method name=\"startAnimation(Landroid/view/animation/Animation;)V\"/>\n\t\t<method name=\"startDrag(Landroid/content/ClipData;Landroid/view/View$DragShadowBuilder;Ljava/lang/Object;I)Z\" since=\"11\" deprecated=\"24\"/>\n\t\t<method name=\"startDragAndDrop(Landroid/content/ClipData;Landroid/view/View$DragShadowBuilder;Ljava/lang/Object;I)Z\" since=\"24\"/>\n\t\t<method name=\"startNestedScroll(I)Z\" since=\"21\"/>\n\t\t<method name=\"stopNestedScroll()V\" since=\"21\"/>\n\t\t<method name=\"transformMatrixToGlobal(Landroid/graphics/Matrix;)V\" since=\"29\"/>\n\t\t<method name=\"transformMatrixToLocal(Landroid/graphics/Matrix;)V\" since=\"29\"/>\n\t\t<method name=\"unscheduleDrawable(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"updateDragShadow(Landroid/view/View$DragShadowBuilder;)V\" since=\"24\"/>\n\t\t<method name=\"verifyDrawable(Landroid/graphics/drawable/Drawable;)Z\"/>\n\t\t<method name=\"willNotCacheDrawing()Z\" deprecated=\"28\"/>\n\t\t<method name=\"willNotDraw()Z\"/>\n\t\t<field name=\"ACCESSIBILITY_LIVE_REGION_ASSERTIVE\" since=\"19\"/>\n\t\t<field name=\"ACCESSIBILITY_LIVE_REGION_NONE\" since=\"19\"/>\n\t\t<field name=\"ACCESSIBILITY_LIVE_REGION_POLITE\" since=\"19\"/>\n\t\t<field name=\"ALPHA\" since=\"14\"/>\n\t\t<field name=\"AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS\" since=\"26\"/>\n\t\t<field name=\"AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE\" since=\"26\"/>\n\t\t<field name=\"AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY\" since=\"26\"/>\n\t\t<field name=\"AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH\" since=\"26\"/>\n\t\t<field name=\"AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR\" since=\"26\"/>\n\t\t<field name=\"AUTOFILL_HINT_CREDIT_CARD_NUMBER\" since=\"26\"/>\n\t\t<field name=\"AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE\" since=\"26\"/>\n\t\t<field name=\"AUTOFILL_HINT_EMAIL_ADDRESS\" since=\"26\"/>\n\t\t<field name=\"AUTOFILL_HINT_NAME\" since=\"26\"/>\n\t\t<field name=\"AUTOFILL_HINT_PASSWORD\" since=\"26\"/>\n\t\t<field name=\"AUTOFILL_HINT_PHONE\" since=\"26\"/>\n\t\t<field name=\"AUTOFILL_HINT_POSTAL_ADDRESS\" since=\"26\"/>\n\t\t<field name=\"AUTOFILL_HINT_POSTAL_CODE\" since=\"26\"/>\n\t\t<field name=\"AUTOFILL_HINT_USERNAME\" since=\"26\"/>\n\t\t<field name=\"AUTOFILL_TYPE_DATE\" since=\"26\"/>\n\t\t<field name=\"AUTOFILL_TYPE_LIST\" since=\"26\"/>\n\t\t<field name=\"AUTOFILL_TYPE_NONE\" since=\"26\"/>\n\t\t<field name=\"AUTOFILL_TYPE_TEXT\" since=\"26\"/>\n\t\t<field name=\"AUTOFILL_TYPE_TOGGLE\" since=\"26\"/>\n\t\t<field name=\"DRAG_FLAG_GLOBAL\" since=\"24\"/>\n\t\t<field name=\"DRAG_FLAG_GLOBAL_PERSISTABLE_URI_PERMISSION\" since=\"24\"/>\n\t\t<field name=\"DRAG_FLAG_GLOBAL_PREFIX_URI_PERMISSION\" since=\"24\"/>\n\t\t<field name=\"DRAG_FLAG_GLOBAL_URI_READ\" since=\"24\"/>\n\t\t<field name=\"DRAG_FLAG_GLOBAL_URI_WRITE\" since=\"24\"/>\n\t\t<field name=\"DRAG_FLAG_OPAQUE\" since=\"24\"/>\n\t\t<field name=\"DRAWING_CACHE_QUALITY_AUTO\" deprecated=\"28\"/>\n\t\t<field name=\"DRAWING_CACHE_QUALITY_HIGH\" deprecated=\"28\"/>\n\t\t<field name=\"DRAWING_CACHE_QUALITY_LOW\" deprecated=\"28\"/>\n\t\t<field name=\"EMPTY_STATE_SET\"/>\n\t\t<field name=\"ENABLED_FOCUSED_SELECTED_STATE_SET\"/>\n\t\t<field name=\"ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET\"/>\n\t\t<field name=\"ENABLED_FOCUSED_STATE_SET\"/>\n\t\t<field name=\"ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET\"/>\n\t\t<field name=\"ENABLED_SELECTED_STATE_SET\"/>\n\t\t<field name=\"ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET\"/>\n\t\t<field name=\"ENABLED_STATE_SET\"/>\n\t\t<field name=\"ENABLED_WINDOW_FOCUSED_STATE_SET\"/>\n\t\t<field name=\"FIND_VIEWS_WITH_CONTENT_DESCRIPTION\" since=\"14\"/>\n\t\t<field name=\"FIND_VIEWS_WITH_TEXT\" since=\"14\"/>\n\t\t<field name=\"FOCUSABLE\" since=\"26\"/>\n\t\t<field name=\"FOCUSABLES_ALL\" since=\"4\"/>\n\t\t<field name=\"FOCUSABLES_TOUCH_MODE\" since=\"4\"/>\n\t\t<field name=\"FOCUSABLE_AUTO\" since=\"26\"/>\n\t\t<field name=\"FOCUSED_SELECTED_STATE_SET\"/>\n\t\t<field name=\"FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET\"/>\n\t\t<field name=\"FOCUSED_STATE_SET\"/>\n\t\t<field name=\"FOCUSED_WINDOW_FOCUSED_STATE_SET\"/>\n\t\t<field name=\"FOCUS_BACKWARD\"/>\n\t\t<field name=\"FOCUS_DOWN\"/>\n\t\t<field name=\"FOCUS_FORWARD\"/>\n\t\t<field name=\"FOCUS_LEFT\"/>\n\t\t<field name=\"FOCUS_RIGHT\"/>\n\t\t<field name=\"FOCUS_UP\"/>\n\t\t<field name=\"GONE\"/>\n\t\t<field name=\"HAPTIC_FEEDBACK_ENABLED\" since=\"3\"/>\n\t\t<field name=\"IMPORTANT_FOR_ACCESSIBILITY_AUTO\" since=\"16\"/>\n\t\t<field name=\"IMPORTANT_FOR_ACCESSIBILITY_NO\" since=\"16\"/>\n\t\t<field name=\"IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS\" since=\"19\"/>\n\t\t<field name=\"IMPORTANT_FOR_ACCESSIBILITY_YES\" since=\"16\"/>\n\t\t<field name=\"IMPORTANT_FOR_AUTOFILL_AUTO\" since=\"26\"/>\n\t\t<field name=\"IMPORTANT_FOR_AUTOFILL_NO\" since=\"26\"/>\n\t\t<field name=\"IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS\" since=\"26\"/>\n\t\t<field name=\"IMPORTANT_FOR_AUTOFILL_YES\" since=\"26\"/>\n\t\t<field name=\"IMPORTANT_FOR_AUTOFILL_YES_EXCLUDE_DESCENDANTS\" since=\"26\"/>\n\t\t<field name=\"INVISIBLE\"/>\n\t\t<field name=\"KEEP_SCREEN_ON\"/>\n\t\t<field name=\"LAYER_TYPE_HARDWARE\" since=\"11\"/>\n\t\t<field name=\"LAYER_TYPE_NONE\" since=\"11\"/>\n\t\t<field name=\"LAYER_TYPE_SOFTWARE\" since=\"11\"/>\n\t\t<field name=\"LAYOUT_DIRECTION_INHERIT\" since=\"17\"/>\n\t\t<field name=\"LAYOUT_DIRECTION_LOCALE\" since=\"17\"/>\n\t\t<field name=\"LAYOUT_DIRECTION_LTR\" since=\"17\"/>\n\t\t<field name=\"LAYOUT_DIRECTION_RTL\" since=\"17\"/>\n\t\t<field name=\"MEASURED_HEIGHT_STATE_SHIFT\" since=\"11\"/>\n\t\t<field name=\"MEASURED_SIZE_MASK\" since=\"11\"/>\n\t\t<field name=\"MEASURED_STATE_MASK\" since=\"11\"/>\n\t\t<field name=\"MEASURED_STATE_TOO_SMALL\" since=\"11\"/>\n\t\t<field name=\"NOT_FOCUSABLE\" since=\"26\"/>\n\t\t<field name=\"NO_ID\"/>\n\t\t<field name=\"OVER_SCROLL_ALWAYS\" since=\"9\"/>\n\t\t<field name=\"OVER_SCROLL_IF_CONTENT_SCROLLS\" since=\"9\"/>\n\t\t<field name=\"OVER_SCROLL_NEVER\" since=\"9\"/>\n\t\t<field name=\"PRESSED_ENABLED_FOCUSED_SELECTED_STATE_SET\"/>\n\t\t<field name=\"PRESSED_ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET\"/>\n\t\t<field name=\"PRESSED_ENABLED_FOCUSED_STATE_SET\"/>\n\t\t<field name=\"PRESSED_ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET\"/>\n\t\t<field name=\"PRESSED_ENABLED_SELECTED_STATE_SET\"/>\n\t\t<field name=\"PRESSED_ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET\"/>\n\t\t<field name=\"PRESSED_ENABLED_STATE_SET\"/>\n\t\t<field name=\"PRESSED_ENABLED_WINDOW_FOCUSED_STATE_SET\"/>\n\t\t<field name=\"PRESSED_FOCUSED_SELECTED_STATE_SET\"/>\n\t\t<field name=\"PRESSED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET\"/>\n\t\t<field name=\"PRESSED_FOCUSED_STATE_SET\"/>\n\t\t<field name=\"PRESSED_FOCUSED_WINDOW_FOCUSED_STATE_SET\"/>\n\t\t<field name=\"PRESSED_SELECTED_STATE_SET\"/>\n\t\t<field name=\"PRESSED_SELECTED_WINDOW_FOCUSED_STATE_SET\"/>\n\t\t<field name=\"PRESSED_STATE_SET\" since=\"19\"/>\n\t\t<field name=\"PRESSED_WINDOW_FOCUSED_STATE_SET\"/>\n\t\t<field name=\"ROTATION\" since=\"14\"/>\n\t\t<field name=\"ROTATION_X\" since=\"14\"/>\n\t\t<field name=\"ROTATION_Y\" since=\"14\"/>\n\t\t<field name=\"SCALE_X\" since=\"14\"/>\n\t\t<field name=\"SCALE_Y\" since=\"14\"/>\n\t\t<field name=\"SCREEN_STATE_OFF\" since=\"16\"/>\n\t\t<field name=\"SCREEN_STATE_ON\" since=\"16\"/>\n\t\t<field name=\"SCROLLBARS_INSIDE_INSET\"/>\n\t\t<field name=\"SCROLLBARS_INSIDE_OVERLAY\"/>\n\t\t<field name=\"SCROLLBARS_OUTSIDE_INSET\"/>\n\t\t<field name=\"SCROLLBARS_OUTSIDE_OVERLAY\"/>\n\t\t<field name=\"SCROLLBAR_POSITION_DEFAULT\" since=\"11\"/>\n\t\t<field name=\"SCROLLBAR_POSITION_LEFT\" since=\"11\"/>\n\t\t<field name=\"SCROLLBAR_POSITION_RIGHT\" since=\"11\"/>\n\t\t<field name=\"SCROLL_AXIS_HORIZONTAL\" since=\"21\"/>\n\t\t<field name=\"SCROLL_AXIS_NONE\" since=\"21\"/>\n\t\t<field name=\"SCROLL_AXIS_VERTICAL\" since=\"21\"/>\n\t\t<field name=\"SCROLL_INDICATOR_BOTTOM\" since=\"23\"/>\n\t\t<field name=\"SCROLL_INDICATOR_END\" since=\"23\"/>\n\t\t<field name=\"SCROLL_INDICATOR_LEFT\" since=\"23\"/>\n\t\t<field name=\"SCROLL_INDICATOR_RIGHT\" since=\"23\"/>\n\t\t<field name=\"SCROLL_INDICATOR_START\" since=\"23\"/>\n\t\t<field name=\"SCROLL_INDICATOR_TOP\" since=\"23\"/>\n\t\t<field name=\"SELECTED_STATE_SET\"/>\n\t\t<field name=\"SELECTED_WINDOW_FOCUSED_STATE_SET\"/>\n\t\t<field name=\"SOUND_EFFECTS_ENABLED\"/>\n\t\t<field name=\"STATUS_BAR_HIDDEN\" since=\"11\" deprecated=\"15\"/>\n\t\t<field name=\"STATUS_BAR_VISIBLE\" since=\"11\" deprecated=\"15\"/>\n\t\t<field name=\"SYSTEM_UI_FLAG_FULLSCREEN\" since=\"16\"/>\n\t\t<field name=\"SYSTEM_UI_FLAG_HIDE_NAVIGATION\" since=\"14\"/>\n\t\t<field name=\"SYSTEM_UI_FLAG_IMMERSIVE\" since=\"19\"/>\n\t\t<field name=\"SYSTEM_UI_FLAG_IMMERSIVE_STICKY\" since=\"19\"/>\n\t\t<field name=\"SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN\" since=\"16\"/>\n\t\t<field name=\"SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION\" since=\"16\"/>\n\t\t<field name=\"SYSTEM_UI_FLAG_LAYOUT_STABLE\" since=\"16\"/>\n\t\t<field name=\"SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR\" since=\"26\"/>\n\t\t<field name=\"SYSTEM_UI_FLAG_LIGHT_STATUS_BAR\" since=\"23\"/>\n\t\t<field name=\"SYSTEM_UI_FLAG_LOW_PROFILE\" since=\"14\"/>\n\t\t<field name=\"SYSTEM_UI_FLAG_VISIBLE\" since=\"14\"/>\n\t\t<field name=\"SYSTEM_UI_LAYOUT_FLAGS\" since=\"16\"/>\n\t\t<field name=\"TEXT_ALIGNMENT_CENTER\" since=\"17\"/>\n\t\t<field name=\"TEXT_ALIGNMENT_GRAVITY\" since=\"17\"/>\n\t\t<field name=\"TEXT_ALIGNMENT_INHERIT\" since=\"16\"/>\n\t\t<field name=\"TEXT_ALIGNMENT_RESOLVED_DEFAULT\" since=\"16\" removed=\"17\"/>\n\t\t<field name=\"TEXT_ALIGNMENT_TEXT_END\" since=\"17\"/>\n\t\t<field name=\"TEXT_ALIGNMENT_TEXT_START\" since=\"17\"/>\n\t\t<field name=\"TEXT_ALIGNMENT_VIEW_END\" since=\"17\"/>\n\t\t<field name=\"TEXT_ALIGNMENT_VIEW_START\" since=\"17\"/>\n\t\t<field name=\"TEXT_DIRECTION_ANY_RTL\" since=\"17\"/>\n\t\t<field name=\"TEXT_DIRECTION_FIRST_STRONG\" since=\"17\"/>\n\t\t<field name=\"TEXT_DIRECTION_FIRST_STRONG_LTR\" since=\"23\"/>\n\t\t<field name=\"TEXT_DIRECTION_FIRST_STRONG_RTL\" since=\"23\"/>\n\t\t<field name=\"TEXT_DIRECTION_INHERIT\" since=\"17\"/>\n\t\t<field name=\"TEXT_DIRECTION_LOCALE\" since=\"17\"/>\n\t\t<field name=\"TEXT_DIRECTION_LTR\" since=\"17\"/>\n\t\t<field name=\"TEXT_DIRECTION_RTL\" since=\"17\"/>\n\t\t<field name=\"TRANSLATION_X\" since=\"14\"/>\n\t\t<field name=\"TRANSLATION_Y\" since=\"14\"/>\n\t\t<field name=\"TRANSLATION_Z\" since=\"21\"/>\n\t\t<field name=\"VIEW_LOG_TAG\"/>\n\t\t<field name=\"VISIBLE\"/>\n\t\t<field name=\"WINDOW_FOCUSED_STATE_SET\"/>\n\t\t<field name=\"X\" since=\"14\"/>\n\t\t<field name=\"Y\" since=\"14\"/>\n\t\t<field name=\"Z\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/view/View$AccessibilityDelegate\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addExtraDataToAccessibilityNodeInfo(Landroid/view/View;Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"26\"/>\n\t\t<method name=\"dispatchPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z\"/>\n\t\t<method name=\"getAccessibilityNodeProvider(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeProvider;\" since=\"16\"/>\n\t\t<method name=\"onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V\"/>\n\t\t<method name=\"onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroid/view/accessibility/AccessibilityNodeInfo;)V\"/>\n\t\t<method name=\"onPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V\"/>\n\t\t<method name=\"onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z\"/>\n\t\t<method name=\"performAccessibilityAction(Landroid/view/View;ILandroid/os/Bundle;)Z\" since=\"16\"/>\n\t\t<method name=\"sendAccessibilityEvent(Landroid/view/View;I)V\"/>\n\t\t<method name=\"sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V\"/>\n\t</class>\n\t<class name=\"android/view/View$BaseSavedState\" since=\"1\">\n\t\t<extends name=\"android/view/AbsSavedState\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;Ljava/lang/ClassLoader;)V\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcelable;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/View$DragShadowBuilder\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/View;)V\"/>\n\t\t<method name=\"getView()Landroid/view/View;\"/>\n\t\t<method name=\"onDrawShadow(Landroid/graphics/Canvas;)V\"/>\n\t\t<method name=\"onProvideShadowMetrics(Landroid/graphics/Point;Landroid/graphics/Point;)V\"/>\n\t</class>\n\t<class name=\"android/view/View$MeasureSpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getMode(I)I\"/>\n\t\t<method name=\"getSize(I)I\"/>\n\t\t<method name=\"makeMeasureSpec(II)I\"/>\n\t\t<method name=\"toString(I)Ljava/lang/String;\"/>\n\t\t<field name=\"AT_MOST\"/>\n\t\t<field name=\"EXACTLY\"/>\n\t\t<field name=\"UNSPECIFIED\"/>\n\t</class>\n\t<class name=\"android/view/View$OnApplyWindowInsetsListener\" since=\"20\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets;\"/>\n\t</class>\n\t<class name=\"android/view/View$OnAttachStateChangeListener\" since=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onViewAttachedToWindow(Landroid/view/View;)V\"/>\n\t\t<method name=\"onViewDetachedFromWindow(Landroid/view/View;)V\"/>\n\t</class>\n\t<class name=\"android/view/View$OnCapturedPointerListener\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onCapturedPointer(Landroid/view/View;Landroid/view/MotionEvent;)Z\"/>\n\t</class>\n\t<class name=\"android/view/View$OnClickListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onClick(Landroid/view/View;)V\"/>\n\t</class>\n\t<class name=\"android/view/View$OnContextClickListener\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onContextClick(Landroid/view/View;)Z\"/>\n\t</class>\n\t<class name=\"android/view/View$OnCreateContextMenuListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onCreateContextMenu(Landroid/view/ContextMenu;Landroid/view/View;Landroid/view/ContextMenu$ContextMenuInfo;)V\"/>\n\t</class>\n\t<class name=\"android/view/View$OnDragListener\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDrag(Landroid/view/View;Landroid/view/DragEvent;)Z\"/>\n\t</class>\n\t<class name=\"android/view/View$OnFocusChangeListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onFocusChange(Landroid/view/View;Z)V\"/>\n\t</class>\n\t<class name=\"android/view/View$OnGenericMotionListener\" since=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onGenericMotion(Landroid/view/View;Landroid/view/MotionEvent;)Z\"/>\n\t</class>\n\t<class name=\"android/view/View$OnHoverListener\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onHover(Landroid/view/View;Landroid/view/MotionEvent;)Z\"/>\n\t</class>\n\t<class name=\"android/view/View$OnKeyListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onKey(Landroid/view/View;ILandroid/view/KeyEvent;)Z\"/>\n\t</class>\n\t<class name=\"android/view/View$OnLayoutChangeListener\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onLayoutChange(Landroid/view/View;IIIIIIII)V\"/>\n\t</class>\n\t<class name=\"android/view/View$OnLongClickListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onLongClick(Landroid/view/View;)Z\"/>\n\t</class>\n\t<class name=\"android/view/View$OnScrollChangeListener\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onScrollChange(Landroid/view/View;IIII)V\"/>\n\t</class>\n\t<class name=\"android/view/View$OnSystemUiVisibilityChangeListener\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onSystemUiVisibilityChange(I)V\"/>\n\t</class>\n\t<class name=\"android/view/View$OnTouchListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onTouch(Landroid/view/View;Landroid/view/MotionEvent;)Z\"/>\n\t</class>\n\t<class name=\"android/view/View$OnUnhandledKeyEventListener\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onUnhandledKeyEvent(Landroid/view/View;Landroid/view/KeyEvent;)Z\"/>\n\t</class>\n\t<class name=\"android/view/ViewAnimationUtils\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createCircularReveal(Landroid/view/View;IIFF)Landroid/animation/Animator;\"/>\n\t</class>\n\t<class name=\"android/view/ViewConfiguration\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"15\"/>\n\t\t<method name=\"get(Landroid/content/Context;)Landroid/view/ViewConfiguration;\" since=\"3\"/>\n\t\t<method name=\"getAmbiguousGestureMultiplier()F\" since=\"29\"/>\n\t\t<method name=\"getDefaultActionModeHideDuration()J\" since=\"23\"/>\n\t\t<method name=\"getDoubleTapTimeout()I\" since=\"3\"/>\n\t\t<method name=\"getEdgeSlop()I\" deprecated=\"15\"/>\n\t\t<method name=\"getFadingEdgeLength()I\" deprecated=\"15\"/>\n\t\t<method name=\"getGlobalActionKeyTimeout()J\" deprecated=\"20\"/>\n\t\t<method name=\"getJumpTapTimeout()I\"/>\n\t\t<method name=\"getKeyRepeatDelay()I\" since=\"12\"/>\n\t\t<method name=\"getKeyRepeatTimeout()I\" since=\"12\"/>\n\t\t<method name=\"getLongPressTimeout()I\"/>\n\t\t<method name=\"getMaximumDrawingCacheSize()I\" deprecated=\"15\"/>\n\t\t<method name=\"getMaximumFlingVelocity()I\" since=\"4\" deprecated=\"15\"/>\n\t\t<method name=\"getMinimumFlingVelocity()I\" deprecated=\"15\"/>\n\t\t<method name=\"getPressedStateDuration()I\"/>\n\t\t<method name=\"getScaledDoubleTapSlop()I\" since=\"3\"/>\n\t\t<method name=\"getScaledEdgeSlop()I\" since=\"3\"/>\n\t\t<method name=\"getScaledFadingEdgeLength()I\" since=\"3\"/>\n\t\t<method name=\"getScaledHorizontalScrollFactor()F\" since=\"26\"/>\n\t\t<method name=\"getScaledHoverSlop()I\" since=\"28\"/>\n\t\t<method name=\"getScaledMaximumDrawingCacheSize()I\" since=\"3\"/>\n\t\t<method name=\"getScaledMaximumFlingVelocity()I\" since=\"4\"/>\n\t\t<method name=\"getScaledMinimumFlingVelocity()I\" since=\"3\"/>\n\t\t<method name=\"getScaledMinimumScalingSpan()I\" since=\"29\"/>\n\t\t<method name=\"getScaledOverflingDistance()I\" since=\"9\"/>\n\t\t<method name=\"getScaledOverscrollDistance()I\" since=\"9\"/>\n\t\t<method name=\"getScaledPagingTouchSlop()I\" since=\"8\"/>\n\t\t<method name=\"getScaledScrollBarSize()I\" since=\"3\"/>\n\t\t<method name=\"getScaledTouchSlop()I\" since=\"3\"/>\n\t\t<method name=\"getScaledVerticalScrollFactor()F\" since=\"26\"/>\n\t\t<method name=\"getScaledWindowTouchSlop()I\" since=\"3\"/>\n\t\t<method name=\"getScrollBarFadeDuration()I\" since=\"5\"/>\n\t\t<method name=\"getScrollBarSize()I\" deprecated=\"15\"/>\n\t\t<method name=\"getScrollDefaultDelay()I\" since=\"5\"/>\n\t\t<method name=\"getScrollFriction()F\"/>\n\t\t<method name=\"getTapTimeout()I\"/>\n\t\t<method name=\"getTouchSlop()I\" deprecated=\"15\"/>\n\t\t<method name=\"getWindowTouchSlop()I\" deprecated=\"15\"/>\n\t\t<method name=\"getZoomControlsTimeout()J\"/>\n\t\t<method name=\"hasPermanentMenuKey()Z\" since=\"14\"/>\n\t\t<method name=\"shouldShowMenuShortcutsWhenKeyboardPresent()Z\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/view/ViewDebug\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"dumpCapturedView(Ljava/lang/String;Ljava/lang/Object;)V\" since=\"3\"/>\n\t\t<method name=\"startHierarchyTracing(Ljava/lang/String;Landroid/view/View;)V\" deprecated=\"16\"/>\n\t\t<method name=\"startRecyclerTracing(Ljava/lang/String;Landroid/view/View;)V\" deprecated=\"16\"/>\n\t\t<method name=\"stopHierarchyTracing()V\" deprecated=\"16\"/>\n\t\t<method name=\"stopRecyclerTracing()V\" deprecated=\"16\"/>\n\t\t<method name=\"trace(Landroid/view/View;Landroid/view/ViewDebug$HierarchyTraceType;)V\" deprecated=\"16\"/>\n\t\t<method name=\"trace(Landroid/view/View;Landroid/view/ViewDebug$RecyclerTraceType;[I)V\" deprecated=\"16\"/>\n\t\t<field name=\"TRACE_HIERARCHY\" deprecated=\"16\"/>\n\t\t<field name=\"TRACE_RECYCLER\" deprecated=\"16\"/>\n\t</class>\n\t<class name=\"android/view/ViewDebug$CapturedViewProperty\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t\t<method name=\"retrieveReturn()Z\"/>\n\t</class>\n\t<class name=\"android/view/ViewDebug$ExportedProperty\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t\t<method name=\"category()Ljava/lang/String;\" since=\"9\"/>\n\t\t<method name=\"deepExport()Z\"/>\n\t\t<method name=\"flagMapping()[Landroid/view/ViewDebug$FlagToString;\" since=\"4\"/>\n\t\t<method name=\"formatToHexString()Z\" since=\"21\"/>\n\t\t<method name=\"hasAdjacentMapping()Z\" since=\"21\"/>\n\t\t<method name=\"indexMapping()[Landroid/view/ViewDebug$IntToString;\" since=\"3\"/>\n\t\t<method name=\"mapping()[Landroid/view/ViewDebug$IntToString;\"/>\n\t\t<method name=\"prefix()Ljava/lang/String;\"/>\n\t\t<method name=\"resolveId()Z\"/>\n\t</class>\n\t<class name=\"android/view/ViewDebug$FlagToString\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t\t<method name=\"equals()I\"/>\n\t\t<method name=\"mask()I\"/>\n\t\t<method name=\"name()Ljava/lang/String;\"/>\n\t\t<method name=\"outputIf()Z\"/>\n\t</class>\n\t<class name=\"android/view/ViewDebug$HierarchyTraceType\" since=\"1\" deprecated=\"16\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/view/ViewDebug$HierarchyTraceType;\"/>\n\t\t<method name=\"values()[Landroid/view/ViewDebug$HierarchyTraceType;\"/>\n\t\t<field name=\"BUILD_CACHE\" deprecated=\"29\"/>\n\t\t<field name=\"DRAW\" deprecated=\"29\"/>\n\t\t<field name=\"INVALIDATE\" deprecated=\"29\"/>\n\t\t<field name=\"INVALIDATE_CHILD\" deprecated=\"29\"/>\n\t\t<field name=\"INVALIDATE_CHILD_IN_PARENT\" deprecated=\"29\"/>\n\t\t<field name=\"ON_LAYOUT\" deprecated=\"29\"/>\n\t\t<field name=\"ON_MEASURE\" deprecated=\"29\"/>\n\t\t<field name=\"REQUEST_LAYOUT\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/view/ViewDebug$IntToString\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t\t<method name=\"from()I\"/>\n\t\t<method name=\"to()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/view/ViewDebug$RecyclerTraceType\" since=\"1\" deprecated=\"16\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/view/ViewDebug$RecyclerTraceType;\"/>\n\t\t<method name=\"values()[Landroid/view/ViewDebug$RecyclerTraceType;\"/>\n\t\t<field name=\"BIND_VIEW\" deprecated=\"29\"/>\n\t\t<field name=\"MOVE_FROM_ACTIVE_TO_SCRAP_HEAP\" deprecated=\"29\"/>\n\t\t<field name=\"MOVE_TO_ACTIVE_HEAP\" removed=\"8\"/>\n\t\t<field name=\"MOVE_TO_SCRAP_HEAP\" deprecated=\"29\"/>\n\t\t<field name=\"NEW_VIEW\" deprecated=\"29\"/>\n\t\t<field name=\"RECYCLE_FROM_ACTIVE_HEAP\" deprecated=\"29\"/>\n\t\t<field name=\"RECYCLE_FROM_SCRAP_HEAP\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/view/ViewGroup\" since=\"1\">\n\t\t<extends name=\"android/view/View\"/>\n\t\t<implements name=\"android/view/ViewManager\"/>\n\t\t<implements name=\"android/view/ViewParent\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"addStatesFromChildren()Z\"/>\n\t\t<method name=\"addView(Landroid/view/View;)V\"/>\n\t\t<method name=\"addView(Landroid/view/View;I)V\"/>\n\t\t<method name=\"addView(Landroid/view/View;II)V\"/>\n\t\t<method name=\"addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"addViewInLayout(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)Z\"/>\n\t\t<method name=\"addViewInLayout(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;Z)Z\"/>\n\t\t<method name=\"attachLayoutAnimationParameters(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;II)V\"/>\n\t\t<method name=\"attachViewToParent(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"canAnimate()Z\"/>\n\t\t<method name=\"checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z\"/>\n\t\t<method name=\"cleanupLayoutState(Landroid/view/View;)V\"/>\n\t\t<method name=\"clearDisappearingChildren()V\"/>\n\t\t<method name=\"debug(I)V\"/>\n\t\t<method name=\"detachAllViewsFromParent()V\"/>\n\t\t<method name=\"detachViewFromParent(I)V\"/>\n\t\t<method name=\"detachViewFromParent(Landroid/view/View;)V\"/>\n\t\t<method name=\"detachViewsFromParent(II)V\"/>\n\t\t<method name=\"dispatchFreezeSelfOnly(Landroid/util/SparseArray;)V\"/>\n\t\t<method name=\"dispatchThawSelfOnly(Landroid/util/SparseArray;)V\"/>\n\t\t<method name=\"drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z\"/>\n\t\t<method name=\"endViewTransition(Landroid/view/View;)V\" since=\"11\"/>\n\t\t<method name=\"gatherTransparentRegion(Landroid/graphics/Region;)Z\"/>\n\t\t<method name=\"generateDefaultLayoutParams()Landroid/view/ViewGroup$LayoutParams;\"/>\n\t\t<method name=\"generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;\"/>\n\t\t<method name=\"generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/view/ViewGroup$LayoutParams;\"/>\n\t\t<method name=\"getChildAt(I)Landroid/view/View;\"/>\n\t\t<method name=\"getChildCount()I\"/>\n\t\t<method name=\"getChildDrawingOrder(I)I\" since=\"29\"/>\n\t\t<method name=\"getChildDrawingOrder(II)I\"/>\n\t\t<method name=\"getChildMeasureSpec(III)I\"/>\n\t\t<method name=\"getChildStaticTransformation(Landroid/view/View;Landroid/view/animation/Transformation;)Z\"/>\n\t\t<method name=\"getClipChildren()Z\" since=\"18\"/>\n\t\t<method name=\"getClipToPadding()Z\" since=\"21\"/>\n\t\t<method name=\"getDescendantFocusability()I\"/>\n\t\t<method name=\"getFocusedChild()Landroid/view/View;\"/>\n\t\t<method name=\"getLayoutAnimation()Landroid/view/animation/LayoutAnimationController;\"/>\n\t\t<method name=\"getLayoutAnimationListener()Landroid/view/animation/Animation$AnimationListener;\"/>\n\t\t<method name=\"getLayoutMode()I\" since=\"18\"/>\n\t\t<method name=\"getLayoutTransition()Landroid/animation/LayoutTransition;\" since=\"11\"/>\n\t\t<method name=\"getNestedScrollAxes()I\" since=\"21\"/>\n\t\t<method name=\"getOverlay()Landroid/view/ViewGroupOverlay;\" since=\"18\"/>\n\t\t<method name=\"getPersistentDrawingCache()I\" deprecated=\"28\"/>\n\t\t<method name=\"getTouchscreenBlocksFocus()Z\" since=\"21\"/>\n\t\t<method name=\"indexOfChild(Landroid/view/View;)I\"/>\n\t\t<method name=\"isAlwaysDrawnWithCacheEnabled()Z\" deprecated=\"23\"/>\n\t\t<method name=\"isAnimationCacheEnabled()Z\" deprecated=\"23\"/>\n\t\t<method name=\"isChildrenDrawingOrderEnabled()Z\" since=\"7\"/>\n\t\t<method name=\"isChildrenDrawnWithCacheEnabled()Z\" deprecated=\"23\"/>\n\t\t<method name=\"isLayoutSuppressed()Z\" since=\"29\"/>\n\t\t<method name=\"isMotionEventSplittingEnabled()Z\" since=\"11\"/>\n\t\t<method name=\"isTransitionGroup()Z\" since=\"21\"/>\n\t\t<method name=\"measureChild(Landroid/view/View;II)V\"/>\n\t\t<method name=\"measureChildWithMargins(Landroid/view/View;IIII)V\"/>\n\t\t<method name=\"measureChildren(II)V\"/>\n\t\t<method name=\"offsetDescendantRectToMyCoords(Landroid/view/View;Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"offsetRectIntoDescendantCoords(Landroid/view/View;Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"onInterceptHoverEvent(Landroid/view/MotionEvent;)Z\" since=\"14\"/>\n\t\t<method name=\"onInterceptTouchEvent(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"onRequestFocusInDescendants(ILandroid/graphics/Rect;)Z\"/>\n\t\t<method name=\"onRequestSendAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z\" since=\"14\"/>\n\t\t<method name=\"onViewAdded(Landroid/view/View;)V\" since=\"23\"/>\n\t\t<method name=\"onViewRemoved(Landroid/view/View;)V\" since=\"23\"/>\n\t\t<method name=\"removeAllViews()V\"/>\n\t\t<method name=\"removeAllViewsInLayout()V\"/>\n\t\t<method name=\"removeDetachedView(Landroid/view/View;Z)V\"/>\n\t\t<method name=\"removeViewAt(I)V\"/>\n\t\t<method name=\"removeViewInLayout(Landroid/view/View;)V\"/>\n\t\t<method name=\"removeViews(II)V\"/>\n\t\t<method name=\"removeViewsInLayout(II)V\"/>\n\t\t<method name=\"requestChildRectangleOnScreen(Landroid/view/View;Landroid/graphics/Rect;Z)Z\"/>\n\t\t<method name=\"resetResolvedLayoutDirection()V\" since=\"14\" removed=\"16\"/>\n\t\t<method name=\"resetResolvedTextDirection()V\" since=\"14\" removed=\"16\"/>\n\t\t<method name=\"scheduleLayoutAnimation()V\"/>\n\t\t<method name=\"setAddStatesFromChildren(Z)V\"/>\n\t\t<method name=\"setAlwaysDrawnWithCacheEnabled(Z)V\" deprecated=\"23\"/>\n\t\t<method name=\"setAnimationCacheEnabled(Z)V\" deprecated=\"23\"/>\n\t\t<method name=\"setChildrenDrawingCacheEnabled(Z)V\" deprecated=\"28\"/>\n\t\t<method name=\"setChildrenDrawingOrderEnabled(Z)V\" since=\"7\"/>\n\t\t<method name=\"setChildrenDrawnWithCacheEnabled(Z)V\" deprecated=\"23\"/>\n\t\t<method name=\"setClipChildren(Z)V\"/>\n\t\t<method name=\"setClipToPadding(Z)V\"/>\n\t\t<method name=\"setDescendantFocusability(I)V\"/>\n\t\t<method name=\"setLayoutAnimation(Landroid/view/animation/LayoutAnimationController;)V\"/>\n\t\t<method name=\"setLayoutAnimationListener(Landroid/view/animation/Animation$AnimationListener;)V\"/>\n\t\t<method name=\"setLayoutMode(I)V\" since=\"18\"/>\n\t\t<method name=\"setLayoutTransition(Landroid/animation/LayoutTransition;)V\" since=\"11\"/>\n\t\t<method name=\"setMotionEventSplittingEnabled(Z)V\" since=\"11\"/>\n\t\t<method name=\"setOnHierarchyChangeListener(Landroid/view/ViewGroup$OnHierarchyChangeListener;)V\"/>\n\t\t<method name=\"setPersistentDrawingCache(I)V\" deprecated=\"28\"/>\n\t\t<method name=\"setStaticTransformationsEnabled(Z)V\" since=\"3\"/>\n\t\t<method name=\"setTouchscreenBlocksFocus(Z)V\" since=\"21\"/>\n\t\t<method name=\"setTransitionGroup(Z)V\" since=\"21\"/>\n\t\t<method name=\"shouldDelayChildPressedState()Z\" since=\"14\"/>\n\t\t<method name=\"startLayoutAnimation()V\"/>\n\t\t<method name=\"startViewTransition(Landroid/view/View;)V\" since=\"11\"/>\n\t\t<method name=\"suppressLayout(Z)V\" since=\"29\"/>\n\t\t<field name=\"CLIP_TO_PADDING_MASK\"/>\n\t\t<field name=\"FLAG_USE_CHILD_DRAWING_ORDER\" removed=\"7\"/>\n\t\t<field name=\"FOCUS_AFTER_DESCENDANTS\"/>\n\t\t<field name=\"FOCUS_BEFORE_DESCENDANTS\"/>\n\t\t<field name=\"FOCUS_BLOCK_DESCENDANTS\"/>\n\t\t<field name=\"LAYOUT_MODE_CLIP_BOUNDS\" since=\"18\"/>\n\t\t<field name=\"LAYOUT_MODE_OPTICAL_BOUNDS\" since=\"18\"/>\n\t\t<field name=\"PERSISTENT_ALL_CACHES\" deprecated=\"28\"/>\n\t\t<field name=\"PERSISTENT_ANIMATION_CACHE\" deprecated=\"28\"/>\n\t\t<field name=\"PERSISTENT_NO_CACHE\" deprecated=\"28\"/>\n\t\t<field name=\"PERSISTENT_SCROLLING_CACHE\" deprecated=\"28\"/>\n\t</class>\n\t<class name=\"android/view/ViewGroup$LayoutParams\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"resolveLayoutDirection(I)V\" since=\"17\"/>\n\t\t<method name=\"setBaseAttributes(Landroid/content/res/TypedArray;II)V\"/>\n\t\t<field name=\"FILL_PARENT\" deprecated=\"15\"/>\n\t\t<field name=\"MATCH_PARENT\" since=\"8\"/>\n\t\t<field name=\"WRAP_CONTENT\"/>\n\t\t<field name=\"height\"/>\n\t\t<field name=\"layoutAnimationParameters\"/>\n\t\t<field name=\"width\"/>\n\t</class>\n\t<class name=\"android/view/ViewGroup$MarginLayoutParams\" since=\"1\">\n\t\t<extends name=\"android/view/ViewGroup$LayoutParams\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V\"/>\n\t\t<method name=\"getLayoutDirection()I\" since=\"17\"/>\n\t\t<method name=\"getMarginEnd()I\" since=\"17\"/>\n\t\t<method name=\"getMarginStart()I\" since=\"17\"/>\n\t\t<method name=\"isMarginRelative()Z\" since=\"17\"/>\n\t\t<method name=\"setLayoutDirection(I)V\" since=\"17\"/>\n\t\t<method name=\"setMarginEnd(I)V\" since=\"17\"/>\n\t\t<method name=\"setMarginStart(I)V\" since=\"17\"/>\n\t\t<method name=\"setMargins(IIII)V\"/>\n\t\t<field name=\"bottomMargin\"/>\n\t\t<field name=\"leftMargin\"/>\n\t\t<field name=\"rightMargin\"/>\n\t\t<field name=\"topMargin\"/>\n\t</class>\n\t<class name=\"android/view/ViewGroup$OnHierarchyChangeListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onChildViewAdded(Landroid/view/View;Landroid/view/View;)V\"/>\n\t\t<method name=\"onChildViewRemoved(Landroid/view/View;Landroid/view/View;)V\"/>\n\t</class>\n\t<class name=\"android/view/ViewGroupOverlay\" since=\"18\">\n\t\t<extends name=\"android/view/ViewOverlay\"/>\n\t\t<method name=\"add(Landroid/view/View;)V\"/>\n\t\t<method name=\"remove(Landroid/view/View;)V\"/>\n\t</class>\n\t<class name=\"android/view/ViewManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"removeView(Landroid/view/View;)V\"/>\n\t\t<method name=\"updateViewLayout(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t</class>\n\t<class name=\"android/view/ViewOutlineProvider\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getOutline(Landroid/view/View;Landroid/graphics/Outline;)V\"/>\n\t\t<field name=\"BACKGROUND\"/>\n\t\t<field name=\"BOUNDS\"/>\n\t\t<field name=\"PADDED_BOUNDS\"/>\n\t</class>\n\t<class name=\"android/view/ViewOverlay\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"add(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"remove(Landroid/graphics/drawable/Drawable;)V\"/>\n\t</class>\n\t<class name=\"android/view/ViewParent\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"bringChildToFront(Landroid/view/View;)V\"/>\n\t\t<method name=\"canResolveLayoutDirection()Z\" since=\"19\"/>\n\t\t<method name=\"canResolveTextAlignment()Z\" since=\"19\"/>\n\t\t<method name=\"canResolveTextDirection()Z\" since=\"19\"/>\n\t\t<method name=\"childDrawableStateChanged(Landroid/view/View;)V\"/>\n\t\t<method name=\"childHasTransientStateChanged(Landroid/view/View;Z)V\" since=\"19\"/>\n\t\t<method name=\"clearChildFocus(Landroid/view/View;)V\"/>\n\t\t<method name=\"createContextMenu(Landroid/view/ContextMenu;)V\"/>\n\t\t<method name=\"focusSearch(Landroid/view/View;I)Landroid/view/View;\"/>\n\t\t<method name=\"focusableViewAvailable(Landroid/view/View;)V\"/>\n\t\t<method name=\"getChildVisibleRect(Landroid/view/View;Landroid/graphics/Rect;Landroid/graphics/Point;)Z\"/>\n\t\t<method name=\"getLayoutDirection()I\" since=\"19\"/>\n\t\t<method name=\"getParent()Landroid/view/ViewParent;\"/>\n\t\t<method name=\"getParentForAccessibility()Landroid/view/ViewParent;\" since=\"16\"/>\n\t\t<method name=\"getTextAlignment()I\" since=\"19\"/>\n\t\t<method name=\"getTextDirection()I\" since=\"19\"/>\n\t\t<method name=\"invalidateChild(Landroid/view/View;Landroid/graphics/Rect;)V\" deprecated=\"26\"/>\n\t\t<method name=\"invalidateChildInParent([ILandroid/graphics/Rect;)Landroid/view/ViewParent;\" deprecated=\"26\"/>\n\t\t<method name=\"isLayoutDirectionResolved()Z\" since=\"19\"/>\n\t\t<method name=\"isLayoutRequested()Z\"/>\n\t\t<method name=\"isTextAlignmentResolved()Z\" since=\"19\"/>\n\t\t<method name=\"isTextDirectionResolved()Z\" since=\"19\"/>\n\t\t<method name=\"keyboardNavigationClusterSearch(Landroid/view/View;I)Landroid/view/View;\" since=\"26\"/>\n\t\t<method name=\"notifySubtreeAccessibilityStateChanged(Landroid/view/View;Landroid/view/View;I)V\" since=\"19\"/>\n\t\t<method name=\"onDescendantInvalidated(Landroid/view/View;Landroid/view/View;)V\" since=\"26\"/>\n\t\t<method name=\"onNestedFling(Landroid/view/View;FFZ)Z\" since=\"21\"/>\n\t\t<method name=\"onNestedPreFling(Landroid/view/View;FF)Z\" since=\"21\"/>\n\t\t<method name=\"onNestedPrePerformAccessibilityAction(Landroid/view/View;ILandroid/os/Bundle;)Z\" since=\"22\"/>\n\t\t<method name=\"onNestedPreScroll(Landroid/view/View;II[I)V\" since=\"21\"/>\n\t\t<method name=\"onNestedScroll(Landroid/view/View;IIII)V\" since=\"21\"/>\n\t\t<method name=\"onNestedScrollAccepted(Landroid/view/View;Landroid/view/View;I)V\" since=\"21\"/>\n\t\t<method name=\"onStartNestedScroll(Landroid/view/View;Landroid/view/View;I)Z\" since=\"21\"/>\n\t\t<method name=\"onStopNestedScroll(Landroid/view/View;)V\" since=\"21\"/>\n\t\t<method name=\"recomputeViewAttributes(Landroid/view/View;)V\"/>\n\t\t<method name=\"requestChildFocus(Landroid/view/View;Landroid/view/View;)V\"/>\n\t\t<method name=\"requestChildRectangleOnScreen(Landroid/view/View;Landroid/graphics/Rect;Z)Z\" since=\"3\"/>\n\t\t<method name=\"requestDisallowInterceptTouchEvent(Z)V\"/>\n\t\t<method name=\"requestFitSystemWindows()V\" since=\"16\"/>\n\t\t<method name=\"requestLayout()V\"/>\n\t\t<method name=\"requestSendAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z\" since=\"14\"/>\n\t\t<method name=\"requestTransparentRegion(Landroid/view/View;)V\"/>\n\t\t<method name=\"showContextMenuForChild(Landroid/view/View;)Z\"/>\n\t\t<method name=\"showContextMenuForChild(Landroid/view/View;FF)Z\" since=\"24\"/>\n\t\t<method name=\"startActionModeForChild(Landroid/view/View;Landroid/view/ActionMode$Callback;)Landroid/view/ActionMode;\" since=\"11\"/>\n\t\t<method name=\"startActionModeForChild(Landroid/view/View;Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/view/ViewPropertyAnimator\" since=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"alpha(F)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"alphaBy(F)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"cancel()V\" since=\"14\"/>\n\t\t<method name=\"getDuration()J\" since=\"14\"/>\n\t\t<method name=\"getInterpolator()Landroid/animation/TimeInterpolator;\" since=\"18\"/>\n\t\t<method name=\"getStartDelay()J\" since=\"14\"/>\n\t\t<method name=\"rotation(F)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"rotationBy(F)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"rotationX(F)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"rotationXBy(F)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"rotationY(F)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"rotationYBy(F)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"scaleX(F)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"scaleXBy(F)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"scaleY(F)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"scaleYBy(F)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"setDuration(J)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"setInterpolator(Landroid/animation/TimeInterpolator;)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"setListener(Landroid/animation/Animator$AnimatorListener;)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"setStartDelay(J)Landroid/view/ViewPropertyAnimator;\" since=\"14\"/>\n\t\t<method name=\"setUpdateListener(Landroid/animation/ValueAnimator$AnimatorUpdateListener;)Landroid/view/ViewPropertyAnimator;\" since=\"19\"/>\n\t\t<method name=\"start()V\" since=\"14\"/>\n\t\t<method name=\"translationX(F)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"translationXBy(F)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"translationY(F)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"translationYBy(F)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"translationZ(F)Landroid/view/ViewPropertyAnimator;\" since=\"21\"/>\n\t\t<method name=\"translationZBy(F)Landroid/view/ViewPropertyAnimator;\" since=\"21\"/>\n\t\t<method name=\"withEndAction(Ljava/lang/Runnable;)Landroid/view/ViewPropertyAnimator;\" since=\"16\"/>\n\t\t<method name=\"withLayer()Landroid/view/ViewPropertyAnimator;\" since=\"16\"/>\n\t\t<method name=\"withStartAction(Ljava/lang/Runnable;)Landroid/view/ViewPropertyAnimator;\" since=\"16\"/>\n\t\t<method name=\"x(F)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"xBy(F)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"y(F)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"yBy(F)Landroid/view/ViewPropertyAnimator;\"/>\n\t\t<method name=\"z(F)Landroid/view/ViewPropertyAnimator;\" since=\"21\"/>\n\t\t<method name=\"zBy(F)Landroid/view/ViewPropertyAnimator;\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/view/ViewStructure\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addChildCount(I)I\"/>\n\t\t<method name=\"asyncCommit()V\"/>\n\t\t<method name=\"asyncNewChild(I)Landroid/view/ViewStructure;\"/>\n\t\t<method name=\"getAutofillId()Landroid/view/autofill/AutofillId;\" since=\"26\"/>\n\t\t<method name=\"getChildCount()I\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getHint()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getText()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTextSelectionEnd()I\"/>\n\t\t<method name=\"getTextSelectionStart()I\"/>\n\t\t<method name=\"hasExtras()Z\"/>\n\t\t<method name=\"newChild(I)Landroid/view/ViewStructure;\"/>\n\t\t<method name=\"newHtmlInfoBuilder(Ljava/lang/String;)Landroid/view/ViewStructure$HtmlInfo$Builder;\" since=\"26\"/>\n\t\t<method name=\"setAccessibilityFocused(Z)V\"/>\n\t\t<method name=\"setActivated(Z)V\"/>\n\t\t<method name=\"setAlpha(F)V\"/>\n\t\t<method name=\"setAutofillHints([Ljava/lang/String;)V\" since=\"26\"/>\n\t\t<method name=\"setAutofillId(Landroid/view/autofill/AutofillId;)V\" since=\"26\"/>\n\t\t<method name=\"setAutofillId(Landroid/view/autofill/AutofillId;I)V\" since=\"26\"/>\n\t\t<method name=\"setAutofillOptions([Ljava/lang/CharSequence;)V\" since=\"26\"/>\n\t\t<method name=\"setAutofillType(I)V\" since=\"26\"/>\n\t\t<method name=\"setAutofillValue(Landroid/view/autofill/AutofillValue;)V\" since=\"26\"/>\n\t\t<method name=\"setCheckable(Z)V\"/>\n\t\t<method name=\"setChecked(Z)V\"/>\n\t\t<method name=\"setChildCount(I)V\"/>\n\t\t<method name=\"setClassName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setClickable(Z)V\"/>\n\t\t<method name=\"setContentDescription(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setContextClickable(Z)V\"/>\n\t\t<method name=\"setDataIsSensitive(Z)V\" since=\"26\"/>\n\t\t<method name=\"setDimens(IIIIII)V\"/>\n\t\t<method name=\"setElevation(F)V\"/>\n\t\t<method name=\"setEnabled(Z)V\"/>\n\t\t<method name=\"setFocusable(Z)V\"/>\n\t\t<method name=\"setFocused(Z)V\"/>\n\t\t<method name=\"setHint(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setHtmlInfo(Landroid/view/ViewStructure$HtmlInfo;)V\" since=\"26\"/>\n\t\t<method name=\"setId(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setImportantForAutofill(I)V\" since=\"28\"/>\n\t\t<method name=\"setInputType(I)V\" since=\"26\"/>\n\t\t<method name=\"setLocaleList(Landroid/os/LocaleList;)V\" since=\"26\"/>\n\t\t<method name=\"setLongClickable(Z)V\"/>\n\t\t<method name=\"setMaxTextEms(I)V\" since=\"28\"/>\n\t\t<method name=\"setMaxTextLength(I)V\" since=\"28\"/>\n\t\t<method name=\"setMinTextEms(I)V\" since=\"28\"/>\n\t\t<method name=\"setOpaque(Z)V\" since=\"26\"/>\n\t\t<method name=\"setSelected(Z)V\"/>\n\t\t<method name=\"setText(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setText(Ljava/lang/CharSequence;II)V\"/>\n\t\t<method name=\"setTextIdEntry(Ljava/lang/String;)V\" since=\"28\"/>\n\t\t<method name=\"setTextLines([I[I)V\"/>\n\t\t<method name=\"setTextStyle(FIII)V\"/>\n\t\t<method name=\"setTransformation(Landroid/graphics/Matrix;)V\"/>\n\t\t<method name=\"setVisibility(I)V\"/>\n\t\t<method name=\"setWebDomain(Ljava/lang/String;)V\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/view/ViewStructure$HtmlInfo\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getAttributes()Ljava/util/List;\"/>\n\t\t<method name=\"getTag()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/view/ViewStructure$HtmlInfo$Builder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addAttribute(Ljava/lang/String;Ljava/lang/String;)Landroid/view/ViewStructure$HtmlInfo$Builder;\"/>\n\t\t<method name=\"build()Landroid/view/ViewStructure$HtmlInfo;\"/>\n\t</class>\n\t<class name=\"android/view/ViewStub\" since=\"1\">\n\t\t<extends name=\"android/view/View\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"getInflatedId()I\"/>\n\t\t<method name=\"getLayoutInflater()Landroid/view/LayoutInflater;\" since=\"16\"/>\n\t\t<method name=\"getLayoutResource()I\"/>\n\t\t<method name=\"inflate()Landroid/view/View;\"/>\n\t\t<method name=\"setInflatedId(I)V\"/>\n\t\t<method name=\"setLayoutInflater(Landroid/view/LayoutInflater;)V\" since=\"16\"/>\n\t\t<method name=\"setLayoutResource(I)V\"/>\n\t\t<method name=\"setOnInflateListener(Landroid/view/ViewStub$OnInflateListener;)V\"/>\n\t</class>\n\t<class name=\"android/view/ViewStub$OnInflateListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onInflate(Landroid/view/ViewStub;Landroid/view/View;)V\"/>\n\t</class>\n\t<class name=\"android/view/ViewTreeObserver\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addOnDrawListener(Landroid/view/ViewTreeObserver$OnDrawListener;)V\" since=\"16\"/>\n\t\t<method name=\"addOnGlobalFocusChangeListener(Landroid/view/ViewTreeObserver$OnGlobalFocusChangeListener;)V\"/>\n\t\t<method name=\"addOnGlobalLayoutListener(Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;)V\"/>\n\t\t<method name=\"addOnPreDrawListener(Landroid/view/ViewTreeObserver$OnPreDrawListener;)V\"/>\n\t\t<method name=\"addOnScrollChangedListener(Landroid/view/ViewTreeObserver$OnScrollChangedListener;)V\" since=\"3\"/>\n\t\t<method name=\"addOnSystemGestureExclusionRectsChangedListener(Ljava/util/function/Consumer;)V\" since=\"29\"/>\n\t\t<method name=\"addOnTouchModeChangeListener(Landroid/view/ViewTreeObserver$OnTouchModeChangeListener;)V\"/>\n\t\t<method name=\"addOnWindowAttachListener(Landroid/view/ViewTreeObserver$OnWindowAttachListener;)V\" since=\"18\"/>\n\t\t<method name=\"addOnWindowFocusChangeListener(Landroid/view/ViewTreeObserver$OnWindowFocusChangeListener;)V\" since=\"18\"/>\n\t\t<method name=\"dispatchOnDraw()V\" since=\"16\"/>\n\t\t<method name=\"dispatchOnGlobalLayout()V\"/>\n\t\t<method name=\"dispatchOnPreDraw()Z\"/>\n\t\t<method name=\"isAlive()Z\"/>\n\t\t<method name=\"registerFrameCommitCallback(Ljava/lang/Runnable;)V\" since=\"29\"/>\n\t\t<method name=\"removeGlobalOnLayoutListener(Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;)V\" deprecated=\"16\"/>\n\t\t<method name=\"removeOnDrawListener(Landroid/view/ViewTreeObserver$OnDrawListener;)V\" since=\"16\"/>\n\t\t<method name=\"removeOnGlobalFocusChangeListener(Landroid/view/ViewTreeObserver$OnGlobalFocusChangeListener;)V\"/>\n\t\t<method name=\"removeOnGlobalLayoutListener(Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;)V\" since=\"16\"/>\n\t\t<method name=\"removeOnPreDrawListener(Landroid/view/ViewTreeObserver$OnPreDrawListener;)V\"/>\n\t\t<method name=\"removeOnScrollChangedListener(Landroid/view/ViewTreeObserver$OnScrollChangedListener;)V\" since=\"3\"/>\n\t\t<method name=\"removeOnSystemGestureExclusionRectsChangedListener(Ljava/util/function/Consumer;)V\" since=\"29\"/>\n\t\t<method name=\"removeOnTouchModeChangeListener(Landroid/view/ViewTreeObserver$OnTouchModeChangeListener;)V\"/>\n\t\t<method name=\"removeOnWindowAttachListener(Landroid/view/ViewTreeObserver$OnWindowAttachListener;)V\" since=\"18\"/>\n\t\t<method name=\"removeOnWindowFocusChangeListener(Landroid/view/ViewTreeObserver$OnWindowFocusChangeListener;)V\" since=\"18\"/>\n\t\t<method name=\"unregisterFrameCommitCallback(Ljava/lang/Runnable;)Z\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/view/ViewTreeObserver$OnDrawListener\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDraw()V\"/>\n\t</class>\n\t<class name=\"android/view/ViewTreeObserver$OnGlobalFocusChangeListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onGlobalFocusChanged(Landroid/view/View;Landroid/view/View;)V\"/>\n\t</class>\n\t<class name=\"android/view/ViewTreeObserver$OnGlobalLayoutListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onGlobalLayout()V\"/>\n\t</class>\n\t<class name=\"android/view/ViewTreeObserver$OnPreDrawListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onPreDraw()Z\"/>\n\t</class>\n\t<class name=\"android/view/ViewTreeObserver$OnScrollChangedListener\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onScrollChanged()V\"/>\n\t</class>\n\t<class name=\"android/view/ViewTreeObserver$OnTouchModeChangeListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onTouchModeChanged(Z)V\"/>\n\t</class>\n\t<class name=\"android/view/ViewTreeObserver$OnWindowAttachListener\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onWindowAttached()V\"/>\n\t\t<method name=\"onWindowDetached()V\"/>\n\t</class>\n\t<class name=\"android/view/ViewTreeObserver$OnWindowFocusChangeListener\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onWindowFocusChanged(Z)V\"/>\n\t</class>\n\t<class name=\"android/view/Window\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"addContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"addFlags(I)V\"/>\n\t\t<method name=\"addOnFrameMetricsAvailableListener(Landroid/view/Window$OnFrameMetricsAvailableListener;Landroid/os/Handler;)V\" since=\"24\"/>\n\t\t<method name=\"clearFlags(I)V\"/>\n\t\t<method name=\"closeAllPanels()V\"/>\n\t\t<method name=\"closePanel(I)V\"/>\n\t\t<method name=\"findViewById(I)Landroid/view/View;\"/>\n\t\t<method name=\"getAllowEnterTransitionOverlap()Z\" since=\"21\"/>\n\t\t<method name=\"getAllowReturnTransitionOverlap()Z\" since=\"21\"/>\n\t\t<method name=\"getAttributes()Landroid/view/WindowManager$LayoutParams;\"/>\n\t\t<method name=\"getCallback()Landroid/view/Window$Callback;\"/>\n\t\t<method name=\"getColorMode()I\" since=\"26\"/>\n\t\t<method name=\"getContainer()Landroid/view/Window;\"/>\n\t\t<method name=\"getContentScene()Landroid/transition/Scene;\" since=\"21\"/>\n\t\t<method name=\"getContext()Landroid/content/Context;\"/>\n\t\t<method name=\"getCurrentFocus()Landroid/view/View;\"/>\n\t\t<method name=\"getDecorView()Landroid/view/View;\"/>\n\t\t<method name=\"getDefaultFeatures(Landroid/content/Context;)I\" since=\"22\"/>\n\t\t<method name=\"getEnterTransition()Landroid/transition/Transition;\" since=\"21\"/>\n\t\t<method name=\"getExitTransition()Landroid/transition/Transition;\" since=\"21\"/>\n\t\t<method name=\"getFeatures()I\"/>\n\t\t<method name=\"getForcedWindowFlags()I\"/>\n\t\t<method name=\"getLayoutInflater()Landroid/view/LayoutInflater;\"/>\n\t\t<method name=\"getLocalFeatures()I\"/>\n\t\t<method name=\"getMediaController()Landroid/media/session/MediaController;\" since=\"21\"/>\n\t\t<method name=\"getNavigationBarColor()I\" since=\"21\"/>\n\t\t<method name=\"getNavigationBarDividerColor()I\" since=\"28\"/>\n\t\t<method name=\"getReenterTransition()Landroid/transition/Transition;\" since=\"21\"/>\n\t\t<method name=\"getReturnTransition()Landroid/transition/Transition;\" since=\"21\"/>\n\t\t<method name=\"getSharedElementEnterTransition()Landroid/transition/Transition;\" since=\"21\"/>\n\t\t<method name=\"getSharedElementExitTransition()Landroid/transition/Transition;\" since=\"21\"/>\n\t\t<method name=\"getSharedElementReenterTransition()Landroid/transition/Transition;\" since=\"21\"/>\n\t\t<method name=\"getSharedElementReturnTransition()Landroid/transition/Transition;\" since=\"21\"/>\n\t\t<method name=\"getSharedElementsUseOverlay()Z\" since=\"21\"/>\n\t\t<method name=\"getStatusBarColor()I\" since=\"21\"/>\n\t\t<method name=\"getSystemGestureExclusionRects()Ljava/util/List;\" since=\"29\"/>\n\t\t<method name=\"getTransitionBackgroundFadeDuration()J\" since=\"21\"/>\n\t\t<method name=\"getTransitionManager()Landroid/transition/TransitionManager;\" since=\"21\"/>\n\t\t<method name=\"getVolumeControlStream()I\"/>\n\t\t<method name=\"getWindowManager()Landroid/view/WindowManager;\"/>\n\t\t<method name=\"getWindowStyle()Landroid/content/res/TypedArray;\"/>\n\t\t<method name=\"hasChildren()Z\"/>\n\t\t<method name=\"hasFeature(I)Z\" since=\"11\"/>\n\t\t<method name=\"hasSoftInputMode()Z\" since=\"3\"/>\n\t\t<method name=\"injectInputEvent(Landroid/view/InputEvent;)V\" since=\"19\"/>\n\t\t<method name=\"invalidatePanelMenu(I)V\" since=\"11\"/>\n\t\t<method name=\"isActive()Z\"/>\n\t\t<method name=\"isFloating()Z\"/>\n\t\t<method name=\"isNavigationBarContrastEnforced()Z\" since=\"29\"/>\n\t\t<method name=\"isShortcutKey(ILandroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"isStatusBarContrastEnforced()Z\" since=\"29\"/>\n\t\t<method name=\"isWideColorGamut()Z\" since=\"27\"/>\n\t\t<method name=\"makeActive()V\"/>\n\t\t<method name=\"onActive()V\"/>\n\t\t<method name=\"onConfigurationChanged(Landroid/content/res/Configuration;)V\"/>\n\t\t<method name=\"openPanel(ILandroid/view/KeyEvent;)V\"/>\n\t\t<method name=\"peekDecorView()Landroid/view/View;\"/>\n\t\t<method name=\"performContextMenuIdentifierAction(II)Z\"/>\n\t\t<method name=\"performPanelIdentifierAction(III)Z\"/>\n\t\t<method name=\"performPanelShortcut(IILandroid/view/KeyEvent;I)Z\"/>\n\t\t<method name=\"removeOnFrameMetricsAvailableListener(Landroid/view/Window$OnFrameMetricsAvailableListener;)V\" since=\"24\"/>\n\t\t<method name=\"requestFeature(I)Z\"/>\n\t\t<method name=\"requireViewById(I)Landroid/view/View;\" since=\"28\"/>\n\t\t<method name=\"restoreHierarchyState(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"saveHierarchyState()Landroid/os/Bundle;\"/>\n\t\t<method name=\"setAllowEnterTransitionOverlap(Z)V\" since=\"21\"/>\n\t\t<method name=\"setAllowReturnTransitionOverlap(Z)V\" since=\"21\"/>\n\t\t<method name=\"setAttributes(Landroid/view/WindowManager$LayoutParams;)V\"/>\n\t\t<method name=\"setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setBackgroundDrawableResource(I)V\"/>\n\t\t<method name=\"setCallback(Landroid/view/Window$Callback;)V\"/>\n\t\t<method name=\"setChildDrawable(ILandroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setChildInt(II)V\"/>\n\t\t<method name=\"setClipToOutline(Z)V\" since=\"22\"/>\n\t\t<method name=\"setColorMode(I)V\" since=\"26\"/>\n\t\t<method name=\"setContainer(Landroid/view/Window;)V\"/>\n\t\t<method name=\"setContentView(I)V\"/>\n\t\t<method name=\"setContentView(Landroid/view/View;)V\"/>\n\t\t<method name=\"setContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"setDecorCaptionShade(I)V\" since=\"24\"/>\n\t\t<method name=\"setDefaultWindowFormat(I)V\"/>\n\t\t<method name=\"setDimAmount(F)V\" since=\"14\"/>\n\t\t<method name=\"setElevation(F)V\" since=\"22\"/>\n\t\t<method name=\"setEnterTransition(Landroid/transition/Transition;)V\" since=\"21\"/>\n\t\t<method name=\"setExitTransition(Landroid/transition/Transition;)V\" since=\"21\"/>\n\t\t<method name=\"setFeatureDrawable(ILandroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setFeatureDrawableAlpha(II)V\"/>\n\t\t<method name=\"setFeatureDrawableResource(II)V\"/>\n\t\t<method name=\"setFeatureDrawableUri(ILandroid/net/Uri;)V\"/>\n\t\t<method name=\"setFeatureInt(II)V\"/>\n\t\t<method name=\"setFlags(II)V\"/>\n\t\t<method name=\"setFormat(I)V\"/>\n\t\t<method name=\"setGravity(I)V\"/>\n\t\t<method name=\"setIcon(I)V\" since=\"19\"/>\n\t\t<method name=\"setLayout(II)V\"/>\n\t\t<method name=\"setLocalFocus(ZZ)V\" since=\"19\"/>\n\t\t<method name=\"setLogo(I)V\" since=\"19\"/>\n\t\t<method name=\"setMediaController(Landroid/media/session/MediaController;)V\" since=\"21\"/>\n\t\t<method name=\"setNavigationBarColor(I)V\" since=\"21\"/>\n\t\t<method name=\"setNavigationBarContrastEnforced(Z)V\" since=\"29\"/>\n\t\t<method name=\"setNavigationBarDividerColor(I)V\" since=\"28\"/>\n\t\t<method name=\"setReenterTransition(Landroid/transition/Transition;)V\" since=\"21\"/>\n\t\t<method name=\"setResizingCaptionDrawable(Landroid/graphics/drawable/Drawable;)V\" since=\"24\"/>\n\t\t<method name=\"setRestrictedCaptionAreaListener(Landroid/view/Window$OnRestrictedCaptionAreaChangedListener;)V\" since=\"24\"/>\n\t\t<method name=\"setReturnTransition(Landroid/transition/Transition;)V\" since=\"21\"/>\n\t\t<method name=\"setSharedElementEnterTransition(Landroid/transition/Transition;)V\" since=\"21\"/>\n\t\t<method name=\"setSharedElementExitTransition(Landroid/transition/Transition;)V\" since=\"21\"/>\n\t\t<method name=\"setSharedElementReenterTransition(Landroid/transition/Transition;)V\" since=\"21\"/>\n\t\t<method name=\"setSharedElementReturnTransition(Landroid/transition/Transition;)V\" since=\"21\"/>\n\t\t<method name=\"setSharedElementsUseOverlay(Z)V\" since=\"21\"/>\n\t\t<method name=\"setSoftInputMode(I)V\" since=\"3\"/>\n\t\t<method name=\"setStatusBarColor(I)V\" since=\"21\"/>\n\t\t<method name=\"setStatusBarContrastEnforced(Z)V\" since=\"29\"/>\n\t\t<method name=\"setSustainedPerformanceMode(Z)V\" since=\"24\"/>\n\t\t<method name=\"setSystemGestureExclusionRects(Ljava/util/List;)V\" since=\"29\"/>\n\t\t<method name=\"setTitle(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setTitleColor(I)V\" deprecated=\"21\"/>\n\t\t<method name=\"setTransitionBackgroundFadeDuration(J)V\" since=\"21\"/>\n\t\t<method name=\"setTransitionManager(Landroid/transition/TransitionManager;)V\" since=\"21\"/>\n\t\t<method name=\"setType(I)V\"/>\n\t\t<method name=\"setUiOptions(I)V\" since=\"14\"/>\n\t\t<method name=\"setUiOptions(II)V\" since=\"14\"/>\n\t\t<method name=\"setVolumeControlStream(I)V\"/>\n\t\t<method name=\"setWindowAnimations(I)V\" since=\"3\"/>\n\t\t<method name=\"setWindowManager(Landroid/view/WindowManager;Landroid/os/IBinder;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setWindowManager(Landroid/view/WindowManager;Landroid/os/IBinder;Ljava/lang/String;Z)V\" since=\"11\"/>\n\t\t<method name=\"superDispatchGenericMotionEvent(Landroid/view/MotionEvent;)Z\" since=\"12\"/>\n\t\t<method name=\"superDispatchKeyEvent(Landroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"superDispatchKeyShortcutEvent(Landroid/view/KeyEvent;)Z\" since=\"11\"/>\n\t\t<method name=\"superDispatchTouchEvent(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"superDispatchTrackballEvent(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"takeInputQueue(Landroid/view/InputQueue$Callback;)V\" since=\"9\"/>\n\t\t<method name=\"takeKeyEvents(Z)V\"/>\n\t\t<method name=\"takeSurface(Landroid/view/SurfaceHolder$Callback2;)V\" since=\"9\"/>\n\t\t<method name=\"togglePanel(ILandroid/view/KeyEvent;)V\"/>\n\t\t<field name=\"DECOR_CAPTION_SHADE_AUTO\" since=\"24\"/>\n\t\t<field name=\"DECOR_CAPTION_SHADE_DARK\" since=\"24\"/>\n\t\t<field name=\"DECOR_CAPTION_SHADE_LIGHT\" since=\"24\"/>\n\t\t<field name=\"DEFAULT_FEATURES\" deprecated=\"22\"/>\n\t\t<field name=\"FEATURE_ACTION_BAR\" since=\"11\"/>\n\t\t<field name=\"FEATURE_ACTION_BAR_OVERLAY\" since=\"11\"/>\n\t\t<field name=\"FEATURE_ACTION_MODE_OVERLAY\" since=\"11\"/>\n\t\t<field name=\"FEATURE_ACTIVITY_TRANSITIONS\" since=\"21\"/>\n\t\t<field name=\"FEATURE_CONTENT_TRANSITIONS\" since=\"21\"/>\n\t\t<field name=\"FEATURE_CONTEXT_MENU\"/>\n\t\t<field name=\"FEATURE_CUSTOM_TITLE\"/>\n\t\t<field name=\"FEATURE_INDETERMINATE_PROGRESS\" deprecated=\"24\"/>\n\t\t<field name=\"FEATURE_LEFT_ICON\"/>\n\t\t<field name=\"FEATURE_NO_TITLE\"/>\n\t\t<field name=\"FEATURE_OPTIONS_PANEL\"/>\n\t\t<field name=\"FEATURE_PROGRESS\" deprecated=\"24\"/>\n\t\t<field name=\"FEATURE_RIGHT_ICON\"/>\n\t\t<field name=\"FEATURE_SWIPE_TO_DISMISS\" since=\"20\"/>\n\t\t<field name=\"ID_ANDROID_CONTENT\"/>\n\t\t<field name=\"NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME\" since=\"21\"/>\n\t\t<field name=\"PROGRESS_END\" deprecated=\"24\"/>\n\t\t<field name=\"PROGRESS_INDETERMINATE_OFF\" deprecated=\"24\"/>\n\t\t<field name=\"PROGRESS_INDETERMINATE_ON\" deprecated=\"24\"/>\n\t\t<field name=\"PROGRESS_SECONDARY_END\" deprecated=\"24\"/>\n\t\t<field name=\"PROGRESS_SECONDARY_START\" deprecated=\"24\"/>\n\t\t<field name=\"PROGRESS_START\" deprecated=\"24\"/>\n\t\t<field name=\"PROGRESS_VISIBILITY_OFF\" deprecated=\"24\"/>\n\t\t<field name=\"PROGRESS_VISIBILITY_ON\" deprecated=\"24\"/>\n\t\t<field name=\"STATUS_BAR_BACKGROUND_TRANSITION_NAME\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/view/Window$Callback\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"dispatchGenericMotionEvent(Landroid/view/MotionEvent;)Z\" since=\"12\"/>\n\t\t<method name=\"dispatchKeyEvent(Landroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"dispatchKeyShortcutEvent(Landroid/view/KeyEvent;)Z\" since=\"11\"/>\n\t\t<method name=\"dispatchPopulateAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)Z\" since=\"4\"/>\n\t\t<method name=\"dispatchTouchEvent(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"dispatchTrackballEvent(Landroid/view/MotionEvent;)Z\"/>\n\t\t<method name=\"onActionModeFinished(Landroid/view/ActionMode;)V\" since=\"11\"/>\n\t\t<method name=\"onActionModeStarted(Landroid/view/ActionMode;)V\" since=\"11\"/>\n\t\t<method name=\"onAttachedToWindow()V\" since=\"5\"/>\n\t\t<method name=\"onContentChanged()V\"/>\n\t\t<method name=\"onCreatePanelMenu(ILandroid/view/Menu;)Z\"/>\n\t\t<method name=\"onCreatePanelView(I)Landroid/view/View;\"/>\n\t\t<method name=\"onDetachedFromWindow()V\" since=\"5\"/>\n\t\t<method name=\"onMenuItemSelected(ILandroid/view/MenuItem;)Z\"/>\n\t\t<method name=\"onMenuOpened(ILandroid/view/Menu;)Z\"/>\n\t\t<method name=\"onPanelClosed(ILandroid/view/Menu;)V\"/>\n\t\t<method name=\"onPointerCaptureChanged(Z)V\" since=\"26\"/>\n\t\t<method name=\"onPreparePanel(ILandroid/view/View;Landroid/view/Menu;)Z\"/>\n\t\t<method name=\"onProvideKeyboardShortcuts(Ljava/util/List;Landroid/view/Menu;I)V\" since=\"24\"/>\n\t\t<method name=\"onSearchRequested()Z\"/>\n\t\t<method name=\"onSearchRequested(Landroid/view/SearchEvent;)Z\" since=\"23\"/>\n\t\t<method name=\"onWindowAttributesChanged(Landroid/view/WindowManager$LayoutParams;)V\"/>\n\t\t<method name=\"onWindowFocusChanged(Z)V\"/>\n\t\t<method name=\"onWindowStartingActionMode(Landroid/view/ActionMode$Callback;)Landroid/view/ActionMode;\" since=\"11\"/>\n\t\t<method name=\"onWindowStartingActionMode(Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/view/Window$OnFrameMetricsAvailableListener\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onFrameMetricsAvailable(Landroid/view/Window;Landroid/view/FrameMetrics;I)V\"/>\n\t</class>\n\t<class name=\"android/view/Window$OnRestrictedCaptionAreaChangedListener\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onRestrictedCaptionAreaChanged(Landroid/graphics/Rect;)V\"/>\n\t</class>\n\t<class name=\"android/view/WindowAnimationFrameStats\" since=\"21\">\n\t\t<extends name=\"android/view/FrameStats\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/WindowContentFrameStats\" since=\"21\">\n\t\t<extends name=\"android/view/FrameStats\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getFramePostedTimeNano(I)J\"/>\n\t\t<method name=\"getFrameReadyTimeNano(I)J\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/WindowId\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"isFocused()Z\"/>\n\t\t<method name=\"registerFocusObserver(Landroid/view/WindowId$FocusObserver;)V\"/>\n\t\t<method name=\"unregisterFocusObserver(Landroid/view/WindowId$FocusObserver;)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/WindowId$FocusObserver\" since=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onFocusGained(Landroid/view/WindowId;)V\"/>\n\t\t<method name=\"onFocusLost(Landroid/view/WindowId;)V\"/>\n\t</class>\n\t<class name=\"android/view/WindowInsets\" since=\"20\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/WindowInsets;)V\"/>\n\t\t<method name=\"consumeDisplayCutout()Landroid/view/WindowInsets;\" since=\"28\"/>\n\t\t<method name=\"consumeStableInsets()Landroid/view/WindowInsets;\" since=\"21\"/>\n\t\t<method name=\"consumeSystemWindowInsets()Landroid/view/WindowInsets;\"/>\n\t\t<method name=\"getDisplayCutout()Landroid/view/DisplayCutout;\" since=\"28\"/>\n\t\t<method name=\"getMandatorySystemGestureInsets()Landroid/graphics/Insets;\" since=\"29\"/>\n\t\t<method name=\"getStableInsetBottom()I\" since=\"21\"/>\n\t\t<method name=\"getStableInsetLeft()I\" since=\"21\"/>\n\t\t<method name=\"getStableInsetRight()I\" since=\"21\"/>\n\t\t<method name=\"getStableInsetTop()I\" since=\"21\"/>\n\t\t<method name=\"getStableInsets()Landroid/graphics/Insets;\" since=\"29\"/>\n\t\t<method name=\"getSystemGestureInsets()Landroid/graphics/Insets;\" since=\"29\"/>\n\t\t<method name=\"getSystemWindowInsetBottom()I\"/>\n\t\t<method name=\"getSystemWindowInsetLeft()I\"/>\n\t\t<method name=\"getSystemWindowInsetRight()I\"/>\n\t\t<method name=\"getSystemWindowInsetTop()I\"/>\n\t\t<method name=\"getSystemWindowInsets()Landroid/graphics/Insets;\" since=\"29\"/>\n\t\t<method name=\"getTappableElementInsets()Landroid/graphics/Insets;\" since=\"29\"/>\n\t\t<method name=\"hasInsets()Z\"/>\n\t\t<method name=\"hasStableInsets()Z\" since=\"21\"/>\n\t\t<method name=\"hasSystemWindowInsets()Z\"/>\n\t\t<method name=\"inset(IIII)Landroid/view/WindowInsets;\" since=\"29\"/>\n\t\t<method name=\"isConsumed()Z\" since=\"21\"/>\n\t\t<method name=\"isRound()Z\"/>\n\t\t<method name=\"replaceSystemWindowInsets(IIII)Landroid/view/WindowInsets;\" deprecated=\"29\"/>\n\t\t<method name=\"replaceSystemWindowInsets(Landroid/graphics/Rect;)Landroid/view/WindowInsets;\" since=\"21\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/view/WindowInsets$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/WindowInsets;)V\"/>\n\t\t<method name=\"build()Landroid/view/WindowInsets;\"/>\n\t\t<method name=\"setDisplayCutout(Landroid/view/DisplayCutout;)Landroid/view/WindowInsets$Builder;\"/>\n\t\t<method name=\"setMandatorySystemGestureInsets(Landroid/graphics/Insets;)Landroid/view/WindowInsets$Builder;\"/>\n\t\t<method name=\"setStableInsets(Landroid/graphics/Insets;)Landroid/view/WindowInsets$Builder;\"/>\n\t\t<method name=\"setSystemGestureInsets(Landroid/graphics/Insets;)Landroid/view/WindowInsets$Builder;\"/>\n\t\t<method name=\"setSystemWindowInsets(Landroid/graphics/Insets;)Landroid/view/WindowInsets$Builder;\"/>\n\t\t<method name=\"setTappableElementInsets(Landroid/graphics/Insets;)Landroid/view/WindowInsets$Builder;\"/>\n\t</class>\n\t<class name=\"android/view/WindowManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/view/ViewManager\"/>\n\t\t<method name=\"getDefaultDisplay()Landroid/view/Display;\"/>\n\t\t<method name=\"removeViewImmediate(Landroid/view/View;)V\"/>\n\t</class>\n\t<class name=\"android/view/WindowManager$BadTokenException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/view/WindowManager$InvalidDisplayException\" since=\"17\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/view/WindowManager$LayoutParams\" since=\"1\">\n\t\t<extends name=\"android/view/ViewGroup$LayoutParams\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"&lt;init>(IIIII)V\"/>\n\t\t<method name=\"&lt;init>(IIIIIII)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"copyFrom(Landroid/view/WindowManager$LayoutParams;)I\"/>\n\t\t<method name=\"debug(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getColorMode()I\" since=\"26\"/>\n\t\t<method name=\"getTitle()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"mayUseInputMethod(I)Z\" since=\"3\"/>\n\t\t<method name=\"setColorMode(I)V\" since=\"26\"/>\n\t\t<method name=\"setTitle(Ljava/lang/CharSequence;)V\"/>\n\t\t<field name=\"ALPHA_CHANGED\"/>\n\t\t<field name=\"ANIMATION_CHANGED\"/>\n\t\t<field name=\"BRIGHTNESS_OVERRIDE_FULL\" since=\"8\"/>\n\t\t<field name=\"BRIGHTNESS_OVERRIDE_NONE\" since=\"8\"/>\n\t\t<field name=\"BRIGHTNESS_OVERRIDE_OFF\" since=\"8\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"DIM_AMOUNT_CHANGED\"/>\n\t\t<field name=\"FIRST_APPLICATION_WINDOW\"/>\n\t\t<field name=\"FIRST_SUB_WINDOW\"/>\n\t\t<field name=\"FIRST_SYSTEM_WINDOW\"/>\n\t\t<field name=\"FLAGS_CHANGED\"/>\n\t\t<field name=\"FLAG_ALLOW_LOCK_WHILE_SCREEN_ON\" since=\"8\"/>\n\t\t<field name=\"FLAG_ALT_FOCUSABLE_IM\" since=\"3\"/>\n\t\t<field name=\"FLAG_BLUR_BEHIND\" deprecated=\"15\"/>\n\t\t<field name=\"FLAG_DIM_BEHIND\"/>\n\t\t<field name=\"FLAG_DISMISS_KEYGUARD\" since=\"5\" deprecated=\"26\"/>\n\t\t<field name=\"FLAG_DITHER\" deprecated=\"17\"/>\n\t\t<field name=\"FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS\" since=\"21\"/>\n\t\t<field name=\"FLAG_FORCE_NOT_FULLSCREEN\"/>\n\t\t<field name=\"FLAG_FULLSCREEN\"/>\n\t\t<field name=\"FLAG_HARDWARE_ACCELERATED\" since=\"11\"/>\n\t\t<field name=\"FLAG_IGNORE_CHEEK_PRESSES\"/>\n\t\t<field name=\"FLAG_KEEP_SCREEN_ON\"/>\n\t\t<field name=\"FLAG_LAYOUT_ATTACHED_IN_DECOR\" since=\"22\"/>\n\t\t<field name=\"FLAG_LAYOUT_INSET_DECOR\"/>\n\t\t<field name=\"FLAG_LAYOUT_IN_OVERSCAN\" since=\"18\"/>\n\t\t<field name=\"FLAG_LAYOUT_IN_SCREEN\"/>\n\t\t<field name=\"FLAG_LAYOUT_NO_LIMITS\"/>\n\t\t<field name=\"FLAG_LOCAL_FOCUS_MODE\" since=\"19\"/>\n\t\t<field name=\"FLAG_NOT_FOCUSABLE\"/>\n\t\t<field name=\"FLAG_NOT_TOUCHABLE\"/>\n\t\t<field name=\"FLAG_NOT_TOUCH_MODAL\"/>\n\t\t<field name=\"FLAG_SCALED\"/>\n\t\t<field name=\"FLAG_SECURE\"/>\n\t\t<field name=\"FLAG_SHOW_WALLPAPER\" since=\"5\"/>\n\t\t<field name=\"FLAG_SHOW_WHEN_LOCKED\" since=\"5\" deprecated=\"27\"/>\n\t\t<field name=\"FLAG_SPLIT_TOUCH\" since=\"11\"/>\n\t\t<field name=\"FLAG_TOUCHABLE_WHEN_WAKING\" deprecated=\"20\"/>\n\t\t<field name=\"FLAG_TRANSLUCENT_NAVIGATION\" since=\"19\"/>\n\t\t<field name=\"FLAG_TRANSLUCENT_STATUS\" since=\"19\"/>\n\t\t<field name=\"FLAG_TURN_SCREEN_ON\" since=\"5\" deprecated=\"27\"/>\n\t\t<field name=\"FLAG_WATCH_OUTSIDE_TOUCH\" since=\"3\"/>\n\t\t<field name=\"FORMAT_CHANGED\"/>\n\t\t<field name=\"LAST_APPLICATION_WINDOW\"/>\n\t\t<field name=\"LAST_SUB_WINDOW\"/>\n\t\t<field name=\"LAST_SYSTEM_WINDOW\"/>\n\t\t<field name=\"LAYOUT_CHANGED\"/>\n\t\t<field name=\"LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT\" since=\"28\"/>\n\t\t<field name=\"LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER\" since=\"28\"/>\n\t\t<field name=\"LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES\" since=\"28\"/>\n\t\t<field name=\"MEMORY_TYPE_CHANGED\"/>\n\t\t<field name=\"MEMORY_TYPE_GPU\" deprecated=\"15\"/>\n\t\t<field name=\"MEMORY_TYPE_HARDWARE\" deprecated=\"15\"/>\n\t\t<field name=\"MEMORY_TYPE_NORMAL\" deprecated=\"15\"/>\n\t\t<field name=\"MEMORY_TYPE_PUSH_BUFFERS\" deprecated=\"15\"/>\n\t\t<field name=\"ROTATION_ANIMATION_CHANGED\" since=\"18\"/>\n\t\t<field name=\"ROTATION_ANIMATION_CROSSFADE\" since=\"18\"/>\n\t\t<field name=\"ROTATION_ANIMATION_JUMPCUT\" since=\"18\"/>\n\t\t<field name=\"ROTATION_ANIMATION_ROTATE\" since=\"18\"/>\n\t\t<field name=\"ROTATION_ANIMATION_SEAMLESS\" since=\"26\"/>\n\t\t<field name=\"SCREEN_BRIGHTNESS_CHANGED\" since=\"3\"/>\n\t\t<field name=\"SCREEN_ORIENTATION_CHANGED\" since=\"3\"/>\n\t\t<field name=\"SOFT_INPUT_ADJUST_NOTHING\" since=\"11\"/>\n\t\t<field name=\"SOFT_INPUT_ADJUST_PAN\" since=\"3\"/>\n\t\t<field name=\"SOFT_INPUT_ADJUST_RESIZE\" since=\"3\"/>\n\t\t<field name=\"SOFT_INPUT_ADJUST_UNSPECIFIED\" since=\"3\"/>\n\t\t<field name=\"SOFT_INPUT_IS_FORWARD_NAVIGATION\" since=\"3\"/>\n\t\t<field name=\"SOFT_INPUT_MASK_ADJUST\" since=\"3\"/>\n\t\t<field name=\"SOFT_INPUT_MASK_STATE\" since=\"3\"/>\n\t\t<field name=\"SOFT_INPUT_MODE_CHANGED\" since=\"3\"/>\n\t\t<field name=\"SOFT_INPUT_STATE_ALWAYS_HIDDEN\" since=\"3\"/>\n\t\t<field name=\"SOFT_INPUT_STATE_ALWAYS_VISIBLE\" since=\"3\"/>\n\t\t<field name=\"SOFT_INPUT_STATE_HIDDEN\" since=\"3\"/>\n\t\t<field name=\"SOFT_INPUT_STATE_UNCHANGED\" since=\"3\"/>\n\t\t<field name=\"SOFT_INPUT_STATE_UNSPECIFIED\" since=\"3\"/>\n\t\t<field name=\"SOFT_INPUT_STATE_VISIBLE\" since=\"3\"/>\n\t\t<field name=\"TITLE_CHANGED\"/>\n\t\t<field name=\"TYPE_ACCESSIBILITY_OVERLAY\" since=\"22\"/>\n\t\t<field name=\"TYPE_APPLICATION\"/>\n\t\t<field name=\"TYPE_APPLICATION_ATTACHED_DIALOG\" since=\"3\"/>\n\t\t<field name=\"TYPE_APPLICATION_MEDIA\"/>\n\t\t<field name=\"TYPE_APPLICATION_OVERLAY\" since=\"26\"/>\n\t\t<field name=\"TYPE_APPLICATION_PANEL\"/>\n\t\t<field name=\"TYPE_APPLICATION_STARTING\"/>\n\t\t<field name=\"TYPE_APPLICATION_SUB_PANEL\"/>\n\t\t<field name=\"TYPE_BASE_APPLICATION\"/>\n\t\t<field name=\"TYPE_CHANGED\"/>\n\t\t<field name=\"TYPE_DRAWN_APPLICATION\" since=\"25\"/>\n\t\t<field name=\"TYPE_INPUT_METHOD\" since=\"3\"/>\n\t\t<field name=\"TYPE_INPUT_METHOD_DIALOG\" since=\"3\"/>\n\t\t<field name=\"TYPE_KEYGUARD\" removed=\"21\"/>\n\t\t<field name=\"TYPE_KEYGUARD_DIALOG\"/>\n\t\t<field name=\"TYPE_PHONE\" deprecated=\"26\"/>\n\t\t<field name=\"TYPE_PRIORITY_PHONE\" deprecated=\"26\"/>\n\t\t<field name=\"TYPE_PRIVATE_PRESENTATION\" since=\"19\"/>\n\t\t<field name=\"TYPE_SEARCH_BAR\"/>\n\t\t<field name=\"TYPE_STATUS_BAR\"/>\n\t\t<field name=\"TYPE_STATUS_BAR_PANEL\"/>\n\t\t<field name=\"TYPE_SYSTEM_ALERT\" deprecated=\"26\"/>\n\t\t<field name=\"TYPE_SYSTEM_DIALOG\"/>\n\t\t<field name=\"TYPE_SYSTEM_ERROR\" deprecated=\"26\"/>\n\t\t<field name=\"TYPE_SYSTEM_OVERLAY\" deprecated=\"26\"/>\n\t\t<field name=\"TYPE_TOAST\" deprecated=\"26\"/>\n\t\t<field name=\"TYPE_WALLPAPER\" since=\"5\"/>\n\t\t<field name=\"alpha\"/>\n\t\t<field name=\"buttonBrightness\" since=\"8\"/>\n\t\t<field name=\"dimAmount\"/>\n\t\t<field name=\"flags\"/>\n\t\t<field name=\"format\"/>\n\t\t<field name=\"gravity\"/>\n\t\t<field name=\"horizontalMargin\"/>\n\t\t<field name=\"horizontalWeight\"/>\n\t\t<field name=\"layoutInDisplayCutoutMode\" since=\"28\"/>\n\t\t<field name=\"memoryType\" deprecated=\"15\"/>\n\t\t<field name=\"packageName\"/>\n\t\t<field name=\"preferredDisplayModeId\" since=\"23\"/>\n\t\t<field name=\"preferredRefreshRate\" since=\"21\" deprecated=\"23\"/>\n\t\t<field name=\"rotationAnimation\" since=\"18\"/>\n\t\t<field name=\"screenBrightness\" since=\"3\"/>\n\t\t<field name=\"screenOrientation\" since=\"3\"/>\n\t\t<field name=\"softInputMode\" since=\"3\"/>\n\t\t<field name=\"systemUiVisibility\" since=\"11\"/>\n\t\t<field name=\"token\"/>\n\t\t<field name=\"type\"/>\n\t\t<field name=\"verticalMargin\"/>\n\t\t<field name=\"verticalWeight\"/>\n\t\t<field name=\"windowAnimations\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t</class>\n\t<class name=\"android/view/accessibility/AccessibilityEvent\" since=\"4\">\n\t\t<extends name=\"android/view/accessibility/AccessibilityRecord\" since=\"14\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"14\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"appendRecord(Landroid/view/accessibility/AccessibilityRecord;)V\" since=\"14\"/>\n\t\t<method name=\"eventTypeToString(I)Ljava/lang/String;\" since=\"14\"/>\n\t\t<method name=\"getAction()I\" since=\"16\"/>\n\t\t<method name=\"getAddedCount()I\" removed=\"14\"/>\n\t\t<method name=\"getBeforeText()Ljava/lang/CharSequence;\" removed=\"14\"/>\n\t\t<method name=\"getClassName()Ljava/lang/CharSequence;\" removed=\"14\"/>\n\t\t<method name=\"getContentChangeTypes()I\" since=\"19\"/>\n\t\t<method name=\"getContentDescription()Ljava/lang/CharSequence;\" removed=\"14\"/>\n\t\t<method name=\"getCurrentItemIndex()I\" removed=\"14\"/>\n\t\t<method name=\"getEventTime()J\"/>\n\t\t<method name=\"getEventType()I\"/>\n\t\t<method name=\"getFromIndex()I\" removed=\"14\"/>\n\t\t<method name=\"getItemCount()I\" removed=\"14\"/>\n\t\t<method name=\"getMovementGranularity()I\" since=\"16\"/>\n\t\t<method name=\"getPackageName()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getParcelableData()Landroid/os/Parcelable;\" removed=\"14\"/>\n\t\t<method name=\"getRecord(I)Landroid/view/accessibility/AccessibilityRecord;\" since=\"14\"/>\n\t\t<method name=\"getRecordCount()I\" since=\"14\"/>\n\t\t<method name=\"getRemovedCount()I\" removed=\"14\"/>\n\t\t<method name=\"getText()Ljava/util/List;\" removed=\"14\"/>\n\t\t<method name=\"getWindowChanges()I\" since=\"28\"/>\n\t\t<method name=\"initFromParcel(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"isChecked()Z\" removed=\"14\"/>\n\t\t<method name=\"isEnabled()Z\" removed=\"14\"/>\n\t\t<method name=\"isFullScreen()Z\" removed=\"14\"/>\n\t\t<method name=\"isPassword()Z\" removed=\"14\"/>\n\t\t<method name=\"obtain()Landroid/view/accessibility/AccessibilityEvent;\"/>\n\t\t<method name=\"obtain(I)Landroid/view/accessibility/AccessibilityEvent;\"/>\n\t\t<method name=\"obtain(Landroid/view/accessibility/AccessibilityEvent;)Landroid/view/accessibility/AccessibilityEvent;\" since=\"14\"/>\n\t\t<method name=\"recycle()V\"/>\n\t\t<method name=\"setAction(I)V\" since=\"16\"/>\n\t\t<method name=\"setAddedCount(I)V\" removed=\"14\"/>\n\t\t<method name=\"setBeforeText(Ljava/lang/CharSequence;)V\" removed=\"14\"/>\n\t\t<method name=\"setChecked(Z)V\" removed=\"14\"/>\n\t\t<method name=\"setClassName(Ljava/lang/CharSequence;)V\" removed=\"14\"/>\n\t\t<method name=\"setContentChangeTypes(I)V\" since=\"19\"/>\n\t\t<method name=\"setContentDescription(Ljava/lang/CharSequence;)V\" removed=\"14\"/>\n\t\t<method name=\"setCurrentItemIndex(I)V\" removed=\"14\"/>\n\t\t<method name=\"setEnabled(Z)V\" removed=\"14\"/>\n\t\t<method name=\"setEventTime(J)V\"/>\n\t\t<method name=\"setEventType(I)V\"/>\n\t\t<method name=\"setFromIndex(I)V\" removed=\"14\"/>\n\t\t<method name=\"setFullScreen(Z)V\" removed=\"14\"/>\n\t\t<method name=\"setItemCount(I)V\" removed=\"14\"/>\n\t\t<method name=\"setMovementGranularity(I)V\" since=\"16\"/>\n\t\t<method name=\"setPackageName(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setParcelableData(Landroid/os/Parcelable;)V\" removed=\"14\"/>\n\t\t<method name=\"setPassword(Z)V\" removed=\"14\"/>\n\t\t<method name=\"setRemovedCount(I)V\" removed=\"14\"/>\n\t\t<field name=\"CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION\" since=\"19\"/>\n\t\t<field name=\"CONTENT_CHANGE_TYPE_PANE_APPEARED\" since=\"28\"/>\n\t\t<field name=\"CONTENT_CHANGE_TYPE_PANE_DISAPPEARED\" since=\"28\"/>\n\t\t<field name=\"CONTENT_CHANGE_TYPE_PANE_TITLE\" since=\"28\"/>\n\t\t<field name=\"CONTENT_CHANGE_TYPE_SUBTREE\" since=\"19\"/>\n\t\t<field name=\"CONTENT_CHANGE_TYPE_TEXT\" since=\"19\"/>\n\t\t<field name=\"CONTENT_CHANGE_TYPE_UNDEFINED\" since=\"19\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"INVALID_POSITION\"/>\n\t\t<field name=\"MAX_TEXT_LENGTH\" deprecated=\"15\"/>\n\t\t<field name=\"TYPES_ALL_MASK\"/>\n\t\t<field name=\"TYPE_ANNOUNCEMENT\" since=\"16\"/>\n\t\t<field name=\"TYPE_ASSIST_READING_CONTEXT\" since=\"23\"/>\n\t\t<field name=\"TYPE_GESTURE_DETECTION_END\" since=\"17\"/>\n\t\t<field name=\"TYPE_GESTURE_DETECTION_START\" since=\"17\"/>\n\t\t<field name=\"TYPE_NOTIFICATION_STATE_CHANGED\"/>\n\t\t<field name=\"TYPE_TOUCH_EXPLORATION_GESTURE_END\" since=\"14\"/>\n\t\t<field name=\"TYPE_TOUCH_EXPLORATION_GESTURE_START\" since=\"14\"/>\n\t\t<field name=\"TYPE_TOUCH_INTERACTION_END\" since=\"17\"/>\n\t\t<field name=\"TYPE_TOUCH_INTERACTION_START\" since=\"17\"/>\n\t\t<field name=\"TYPE_VIEW_ACCESSIBILITY_FOCUSED\" since=\"16\"/>\n\t\t<field name=\"TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED\" since=\"16\"/>\n\t\t<field name=\"TYPE_VIEW_CLICKED\"/>\n\t\t<field name=\"TYPE_VIEW_CONTEXT_CLICKED\" since=\"23\"/>\n\t\t<field name=\"TYPE_VIEW_FOCUSED\"/>\n\t\t<field name=\"TYPE_VIEW_HOVER_ENTER\" since=\"14\"/>\n\t\t<field name=\"TYPE_VIEW_HOVER_EXIT\" since=\"14\"/>\n\t\t<field name=\"TYPE_VIEW_LONG_CLICKED\"/>\n\t\t<field name=\"TYPE_VIEW_SCROLLED\" since=\"14\"/>\n\t\t<field name=\"TYPE_VIEW_SELECTED\"/>\n\t\t<field name=\"TYPE_VIEW_TEXT_CHANGED\"/>\n\t\t<field name=\"TYPE_VIEW_TEXT_SELECTION_CHANGED\" since=\"14\"/>\n\t\t<field name=\"TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY\" since=\"16\"/>\n\t\t<field name=\"TYPE_WINDOWS_CHANGED\" since=\"21\"/>\n\t\t<field name=\"TYPE_WINDOW_CONTENT_CHANGED\" since=\"14\"/>\n\t\t<field name=\"TYPE_WINDOW_STATE_CHANGED\"/>\n\t\t<field name=\"WINDOWS_CHANGE_ACCESSIBILITY_FOCUSED\" since=\"28\"/>\n\t\t<field name=\"WINDOWS_CHANGE_ACTIVE\" since=\"28\"/>\n\t\t<field name=\"WINDOWS_CHANGE_ADDED\" since=\"28\"/>\n\t\t<field name=\"WINDOWS_CHANGE_BOUNDS\" since=\"28\"/>\n\t\t<field name=\"WINDOWS_CHANGE_CHILDREN\" since=\"28\"/>\n\t\t<field name=\"WINDOWS_CHANGE_FOCUSED\" since=\"28\"/>\n\t\t<field name=\"WINDOWS_CHANGE_LAYER\" since=\"28\"/>\n\t\t<field name=\"WINDOWS_CHANGE_PARENT\" since=\"28\"/>\n\t\t<field name=\"WINDOWS_CHANGE_PIP\" since=\"28\"/>\n\t\t<field name=\"WINDOWS_CHANGE_REMOVED\" since=\"28\"/>\n\t\t<field name=\"WINDOWS_CHANGE_TITLE\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/view/accessibility/AccessibilityEventSource\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"sendAccessibilityEvent(I)V\"/>\n\t\t<method name=\"sendAccessibilityEventUnchecked(Landroid/view/accessibility/AccessibilityEvent;)V\"/>\n\t</class>\n\t<class name=\"android/view/accessibility/AccessibilityManager\" since=\"4\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addAccessibilityRequestPreparer(Landroid/view/accessibility/AccessibilityRequestPreparer;)V\" since=\"27\"/>\n\t\t<method name=\"addAccessibilityStateChangeListener(Landroid/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener;)Z\" since=\"14\"/>\n\t\t<method name=\"addAccessibilityStateChangeListener(Landroid/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener;Landroid/os/Handler;)V\" since=\"26\"/>\n\t\t<method name=\"addTouchExplorationStateChangeListener(Landroid/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener;)Z\" since=\"19\"/>\n\t\t<method name=\"addTouchExplorationStateChangeListener(Landroid/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener;Landroid/os/Handler;)V\" since=\"26\"/>\n\t\t<method name=\"getAccessibilityServiceList()Ljava/util/List;\" deprecated=\"15\"/>\n\t\t<method name=\"getEnabledAccessibilityServiceList(I)Ljava/util/List;\" since=\"14\"/>\n\t\t<method name=\"getInstalledAccessibilityServiceList()Ljava/util/List;\" since=\"14\"/>\n\t\t<method name=\"getRecommendedTimeoutMillis(II)I\" since=\"29\"/>\n\t\t<method name=\"interrupt()V\"/>\n\t\t<method name=\"isAccessibilityButtonSupported()Z\" since=\"27\"/>\n\t\t<method name=\"isEnabled()Z\"/>\n\t\t<method name=\"isTouchExplorationEnabled()Z\" since=\"14\"/>\n\t\t<method name=\"removeAccessibilityRequestPreparer(Landroid/view/accessibility/AccessibilityRequestPreparer;)V\" since=\"27\"/>\n\t\t<method name=\"removeAccessibilityStateChangeListener(Landroid/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener;)Z\" since=\"14\"/>\n\t\t<method name=\"removeTouchExplorationStateChangeListener(Landroid/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener;)Z\" since=\"19\"/>\n\t\t<method name=\"sendAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V\"/>\n\t\t<field name=\"FLAG_CONTENT_CONTROLS\" since=\"29\"/>\n\t\t<field name=\"FLAG_CONTENT_ICONS\" since=\"29\"/>\n\t\t<field name=\"FLAG_CONTENT_TEXT\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onAccessibilityStateChanged(Z)V\"/>\n\t</class>\n\t<class name=\"android/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onTouchExplorationStateChanged(Z)V\"/>\n\t</class>\n\t<class name=\"android/view/accessibility/AccessibilityNodeInfo\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"addAction(I)V\" deprecated=\"21\"/>\n\t\t<method name=\"addAction(Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction;)V\" since=\"21\"/>\n\t\t<method name=\"addChild(Landroid/view/View;)V\"/>\n\t\t<method name=\"addChild(Landroid/view/View;I)V\" since=\"16\"/>\n\t\t<method name=\"canOpenPopup()Z\" since=\"19\"/>\n\t\t<method name=\"findAccessibilityNodeInfosByText(Ljava/lang/String;)Ljava/util/List;\"/>\n\t\t<method name=\"findAccessibilityNodeInfosByViewId(Ljava/lang/String;)Ljava/util/List;\" since=\"18\"/>\n\t\t<method name=\"findFocus(I)Landroid/view/accessibility/AccessibilityNodeInfo;\" since=\"16\"/>\n\t\t<method name=\"focusSearch(I)Landroid/view/accessibility/AccessibilityNodeInfo;\" since=\"16\"/>\n\t\t<method name=\"getActionList()Ljava/util/List;\" since=\"21\"/>\n\t\t<method name=\"getActions()I\" deprecated=\"21\"/>\n\t\t<method name=\"getAvailableExtraData()Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"getBoundsInParent(Landroid/graphics/Rect;)V\" deprecated=\"29\"/>\n\t\t<method name=\"getBoundsInScreen(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"getChild(I)Landroid/view/accessibility/AccessibilityNodeInfo;\"/>\n\t\t<method name=\"getChildCount()I\"/>\n\t\t<method name=\"getClassName()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getCollectionInfo()Landroid/view/accessibility/AccessibilityNodeInfo$CollectionInfo;\" since=\"19\"/>\n\t\t<method name=\"getCollectionItemInfo()Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;\" since=\"19\"/>\n\t\t<method name=\"getContentDescription()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getDrawingOrder()I\" since=\"24\"/>\n\t\t<method name=\"getError()Ljava/lang/CharSequence;\" since=\"21\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\" since=\"19\"/>\n\t\t<method name=\"getHintText()Ljava/lang/CharSequence;\" since=\"26\"/>\n\t\t<method name=\"getInputType()I\" since=\"19\"/>\n\t\t<method name=\"getLabelFor()Landroid/view/accessibility/AccessibilityNodeInfo;\" since=\"17\"/>\n\t\t<method name=\"getLabeledBy()Landroid/view/accessibility/AccessibilityNodeInfo;\" since=\"17\"/>\n\t\t<method name=\"getLiveRegion()I\" since=\"19\"/>\n\t\t<method name=\"getMaxTextLength()I\" since=\"21\"/>\n\t\t<method name=\"getMovementGranularities()I\" since=\"16\"/>\n\t\t<method name=\"getPackageName()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getPaneTitle()Ljava/lang/CharSequence;\" since=\"28\"/>\n\t\t<method name=\"getParent()Landroid/view/accessibility/AccessibilityNodeInfo;\"/>\n\t\t<method name=\"getRangeInfo()Landroid/view/accessibility/AccessibilityNodeInfo$RangeInfo;\" since=\"19\"/>\n\t\t<method name=\"getText()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTextSelectionEnd()I\" since=\"18\"/>\n\t\t<method name=\"getTextSelectionStart()I\" since=\"18\"/>\n\t\t<method name=\"getTooltipText()Ljava/lang/CharSequence;\" since=\"28\"/>\n\t\t<method name=\"getTouchDelegateInfo()Landroid/view/accessibility/AccessibilityNodeInfo$TouchDelegateInfo;\" since=\"29\"/>\n\t\t<method name=\"getTraversalAfter()Landroid/view/accessibility/AccessibilityNodeInfo;\" since=\"22\"/>\n\t\t<method name=\"getTraversalBefore()Landroid/view/accessibility/AccessibilityNodeInfo;\" since=\"22\"/>\n\t\t<method name=\"getViewIdResourceName()Ljava/lang/String;\" since=\"18\"/>\n\t\t<method name=\"getWindow()Landroid/view/accessibility/AccessibilityWindowInfo;\" since=\"21\"/>\n\t\t<method name=\"getWindowId()I\"/>\n\t\t<method name=\"isAccessibilityFocused()Z\" since=\"16\"/>\n\t\t<method name=\"isCheckable()Z\"/>\n\t\t<method name=\"isChecked()Z\"/>\n\t\t<method name=\"isClickable()Z\"/>\n\t\t<method name=\"isContentInvalid()Z\" since=\"19\"/>\n\t\t<method name=\"isContextClickable()Z\" since=\"23\"/>\n\t\t<method name=\"isDismissable()Z\" since=\"19\"/>\n\t\t<method name=\"isEditable()Z\" since=\"18\"/>\n\t\t<method name=\"isEnabled()Z\"/>\n\t\t<method name=\"isFocusable()Z\"/>\n\t\t<method name=\"isFocused()Z\"/>\n\t\t<method name=\"isHeading()Z\" since=\"28\"/>\n\t\t<method name=\"isImportantForAccessibility()Z\" since=\"24\"/>\n\t\t<method name=\"isLongClickable()Z\"/>\n\t\t<method name=\"isMultiLine()Z\" since=\"19\"/>\n\t\t<method name=\"isPassword()Z\"/>\n\t\t<method name=\"isScreenReaderFocusable()Z\" since=\"28\"/>\n\t\t<method name=\"isScrollable()Z\"/>\n\t\t<method name=\"isSelected()Z\"/>\n\t\t<method name=\"isShowingHintText()Z\" since=\"26\"/>\n\t\t<method name=\"isTextEntryKey()Z\" since=\"29\"/>\n\t\t<method name=\"isVisibleToUser()Z\" since=\"16\"/>\n\t\t<method name=\"obtain()Landroid/view/accessibility/AccessibilityNodeInfo;\"/>\n\t\t<method name=\"obtain(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeInfo;\"/>\n\t\t<method name=\"obtain(Landroid/view/View;I)Landroid/view/accessibility/AccessibilityNodeInfo;\" since=\"16\"/>\n\t\t<method name=\"obtain(Landroid/view/accessibility/AccessibilityNodeInfo;)Landroid/view/accessibility/AccessibilityNodeInfo;\"/>\n\t\t<method name=\"performAction(I)Z\"/>\n\t\t<method name=\"performAction(ILandroid/os/Bundle;)Z\" since=\"16\"/>\n\t\t<method name=\"recycle()V\"/>\n\t\t<method name=\"refresh()Z\" since=\"18\"/>\n\t\t<method name=\"refreshWithExtraData(Ljava/lang/String;Landroid/os/Bundle;)Z\" since=\"26\"/>\n\t\t<method name=\"removeAction(I)V\" since=\"21\" deprecated=\"21\"/>\n\t\t<method name=\"removeAction(Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction;)Z\" since=\"21\"/>\n\t\t<method name=\"removeChild(Landroid/view/View;)Z\" since=\"21\"/>\n\t\t<method name=\"removeChild(Landroid/view/View;I)Z\" since=\"21\"/>\n\t\t<method name=\"setAccessibilityFocused(Z)V\" since=\"16\"/>\n\t\t<method name=\"setAvailableExtraData(Ljava/util/List;)V\" since=\"26\"/>\n\t\t<method name=\"setBoundsInParent(Landroid/graphics/Rect;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setBoundsInScreen(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"setCanOpenPopup(Z)V\" since=\"19\"/>\n\t\t<method name=\"setCheckable(Z)V\"/>\n\t\t<method name=\"setChecked(Z)V\"/>\n\t\t<method name=\"setClassName(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setClickable(Z)V\"/>\n\t\t<method name=\"setCollectionInfo(Landroid/view/accessibility/AccessibilityNodeInfo$CollectionInfo;)V\" since=\"19\"/>\n\t\t<method name=\"setCollectionItemInfo(Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;)V\" since=\"19\"/>\n\t\t<method name=\"setContentDescription(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setContentInvalid(Z)V\" since=\"19\"/>\n\t\t<method name=\"setContextClickable(Z)V\" since=\"23\"/>\n\t\t<method name=\"setDismissable(Z)V\" since=\"19\"/>\n\t\t<method name=\"setDrawingOrder(I)V\" since=\"24\"/>\n\t\t<method name=\"setEditable(Z)V\" since=\"18\"/>\n\t\t<method name=\"setEnabled(Z)V\"/>\n\t\t<method name=\"setError(Ljava/lang/CharSequence;)V\" since=\"21\"/>\n\t\t<method name=\"setFocusable(Z)V\"/>\n\t\t<method name=\"setFocused(Z)V\"/>\n\t\t<method name=\"setHeading(Z)V\" since=\"28\"/>\n\t\t<method name=\"setHintText(Ljava/lang/CharSequence;)V\" since=\"26\"/>\n\t\t<method name=\"setImportantForAccessibility(Z)V\" since=\"24\"/>\n\t\t<method name=\"setInputType(I)V\" since=\"19\"/>\n\t\t<method name=\"setLabelFor(Landroid/view/View;)V\" since=\"17\"/>\n\t\t<method name=\"setLabelFor(Landroid/view/View;I)V\" since=\"17\"/>\n\t\t<method name=\"setLabeledBy(Landroid/view/View;)V\" since=\"17\"/>\n\t\t<method name=\"setLabeledBy(Landroid/view/View;I)V\" since=\"17\"/>\n\t\t<method name=\"setLiveRegion(I)V\" since=\"19\"/>\n\t\t<method name=\"setLongClickable(Z)V\"/>\n\t\t<method name=\"setMaxTextLength(I)V\" since=\"21\"/>\n\t\t<method name=\"setMovementGranularities(I)V\" since=\"16\"/>\n\t\t<method name=\"setMultiLine(Z)V\" since=\"19\"/>\n\t\t<method name=\"setPackageName(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setPaneTitle(Ljava/lang/CharSequence;)V\" since=\"28\"/>\n\t\t<method name=\"setParent(Landroid/view/View;)V\"/>\n\t\t<method name=\"setParent(Landroid/view/View;I)V\" since=\"16\"/>\n\t\t<method name=\"setPassword(Z)V\"/>\n\t\t<method name=\"setRangeInfo(Landroid/view/accessibility/AccessibilityNodeInfo$RangeInfo;)V\" since=\"19\"/>\n\t\t<method name=\"setScreenReaderFocusable(Z)V\" since=\"28\"/>\n\t\t<method name=\"setScrollable(Z)V\"/>\n\t\t<method name=\"setSelected(Z)V\"/>\n\t\t<method name=\"setShowingHintText(Z)V\" since=\"26\"/>\n\t\t<method name=\"setSource(Landroid/view/View;)V\"/>\n\t\t<method name=\"setSource(Landroid/view/View;I)V\" since=\"16\"/>\n\t\t<method name=\"setText(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setTextEntryKey(Z)V\" since=\"29\"/>\n\t\t<method name=\"setTextSelection(II)V\" since=\"18\"/>\n\t\t<method name=\"setTooltipText(Ljava/lang/CharSequence;)V\" since=\"28\"/>\n\t\t<method name=\"setTouchDelegateInfo(Landroid/view/accessibility/AccessibilityNodeInfo$TouchDelegateInfo;)V\" since=\"29\"/>\n\t\t<method name=\"setTraversalAfter(Landroid/view/View;)V\" since=\"22\"/>\n\t\t<method name=\"setTraversalAfter(Landroid/view/View;I)V\" since=\"22\"/>\n\t\t<method name=\"setTraversalBefore(Landroid/view/View;)V\" since=\"22\"/>\n\t\t<method name=\"setTraversalBefore(Landroid/view/View;I)V\" since=\"22\"/>\n\t\t<method name=\"setViewIdResourceName(Ljava/lang/String;)V\" since=\"18\"/>\n\t\t<method name=\"setVisibleToUser(Z)V\" since=\"16\"/>\n\t\t<field name=\"ACTION_ACCESSIBILITY_FOCUS\" since=\"16\"/>\n\t\t<field name=\"ACTION_ARGUMENT_COLUMN_INT\" since=\"23\"/>\n\t\t<field name=\"ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN\" since=\"18\"/>\n\t\t<field name=\"ACTION_ARGUMENT_HTML_ELEMENT_STRING\" since=\"16\"/>\n\t\t<field name=\"ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT\" since=\"16\"/>\n\t\t<field name=\"ACTION_ARGUMENT_MOVE_WINDOW_X\" since=\"26\"/>\n\t\t<field name=\"ACTION_ARGUMENT_MOVE_WINDOW_Y\" since=\"26\"/>\n\t\t<field name=\"ACTION_ARGUMENT_PROGRESS_VALUE\" since=\"24\"/>\n\t\t<field name=\"ACTION_ARGUMENT_ROW_INT\" since=\"23\"/>\n\t\t<field name=\"ACTION_ARGUMENT_SELECTION_END_INT\" since=\"18\"/>\n\t\t<field name=\"ACTION_ARGUMENT_SELECTION_START_INT\" since=\"18\"/>\n\t\t<field name=\"ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE\" since=\"21\"/>\n\t\t<field name=\"ACTION_CLEAR_ACCESSIBILITY_FOCUS\" since=\"16\"/>\n\t\t<field name=\"ACTION_CLEAR_FOCUS\"/>\n\t\t<field name=\"ACTION_CLEAR_SELECTION\"/>\n\t\t<field name=\"ACTION_CLICK\" since=\"16\"/>\n\t\t<field name=\"ACTION_COLLAPSE\" since=\"19\"/>\n\t\t<field name=\"ACTION_COPY\" since=\"18\"/>\n\t\t<field name=\"ACTION_CUT\" since=\"18\"/>\n\t\t<field name=\"ACTION_DISMISS\" since=\"19\"/>\n\t\t<field name=\"ACTION_EXPAND\" since=\"19\"/>\n\t\t<field name=\"ACTION_FOCUS\"/>\n\t\t<field name=\"ACTION_LONG_CLICK\" since=\"16\"/>\n\t\t<field name=\"ACTION_NEXT_AT_MOVEMENT_GRANULARITY\" since=\"16\"/>\n\t\t<field name=\"ACTION_NEXT_HTML_ELEMENT\" since=\"16\"/>\n\t\t<field name=\"ACTION_PASTE\" since=\"18\"/>\n\t\t<field name=\"ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY\" since=\"16\"/>\n\t\t<field name=\"ACTION_PREVIOUS_HTML_ELEMENT\" since=\"16\"/>\n\t\t<field name=\"ACTION_SCROLL_BACKWARD\" since=\"16\"/>\n\t\t<field name=\"ACTION_SCROLL_FORWARD\" since=\"16\"/>\n\t\t<field name=\"ACTION_SELECT\"/>\n\t\t<field name=\"ACTION_SET_SELECTION\" since=\"18\"/>\n\t\t<field name=\"ACTION_SET_TEXT\" since=\"21\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH\" since=\"26\"/>\n\t\t<field name=\"EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX\" since=\"26\"/>\n\t\t<field name=\"EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY\" since=\"26\"/>\n\t\t<field name=\"FOCUS_ACCESSIBILITY\" since=\"16\"/>\n\t\t<field name=\"FOCUS_INPUT\" since=\"16\"/>\n\t\t<field name=\"MOVEMENT_GRANULARITY_CHARACTER\" since=\"16\"/>\n\t\t<field name=\"MOVEMENT_GRANULARITY_LINE\" since=\"16\"/>\n\t\t<field name=\"MOVEMENT_GRANULARITY_PAGE\" since=\"16\"/>\n\t\t<field name=\"MOVEMENT_GRANULARITY_PARAGRAPH\" since=\"16\"/>\n\t\t<field name=\"MOVEMENT_GRANULARITY_WORD\" since=\"16\"/>\n\t</class>\n\t<class name=\"android/view/accessibility/AccessibilityNodeInfo$AccessibilityAction\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/CharSequence;)V\"/>\n\t\t<method name=\"getId()I\"/>\n\t\t<method name=\"getLabel()Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"ACTION_ACCESSIBILITY_FOCUS\"/>\n\t\t<field name=\"ACTION_CLEAR_ACCESSIBILITY_FOCUS\"/>\n\t\t<field name=\"ACTION_CLEAR_FOCUS\"/>\n\t\t<field name=\"ACTION_CLEAR_SELECTION\"/>\n\t\t<field name=\"ACTION_CLICK\"/>\n\t\t<field name=\"ACTION_COLLAPSE\"/>\n\t\t<field name=\"ACTION_CONTEXT_CLICK\" since=\"23\"/>\n\t\t<field name=\"ACTION_COPY\"/>\n\t\t<field name=\"ACTION_CUT\"/>\n\t\t<field name=\"ACTION_DISMISS\"/>\n\t\t<field name=\"ACTION_EXPAND\"/>\n\t\t<field name=\"ACTION_FOCUS\"/>\n\t\t<field name=\"ACTION_HIDE_TOOLTIP\" since=\"28\"/>\n\t\t<field name=\"ACTION_LONG_CLICK\"/>\n\t\t<field name=\"ACTION_MOVE_WINDOW\" since=\"26\"/>\n\t\t<field name=\"ACTION_NEXT_AT_MOVEMENT_GRANULARITY\"/>\n\t\t<field name=\"ACTION_NEXT_HTML_ELEMENT\"/>\n\t\t<field name=\"ACTION_PAGE_DOWN\" since=\"29\"/>\n\t\t<field name=\"ACTION_PAGE_LEFT\" since=\"29\"/>\n\t\t<field name=\"ACTION_PAGE_RIGHT\" since=\"29\"/>\n\t\t<field name=\"ACTION_PAGE_UP\" since=\"29\"/>\n\t\t<field name=\"ACTION_PASTE\"/>\n\t\t<field name=\"ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY\"/>\n\t\t<field name=\"ACTION_PREVIOUS_HTML_ELEMENT\"/>\n\t\t<field name=\"ACTION_SCROLL_BACKWARD\"/>\n\t\t<field name=\"ACTION_SCROLL_DOWN\" since=\"23\"/>\n\t\t<field name=\"ACTION_SCROLL_FORWARD\"/>\n\t\t<field name=\"ACTION_SCROLL_LEFT\" since=\"23\"/>\n\t\t<field name=\"ACTION_SCROLL_RIGHT\" since=\"23\"/>\n\t\t<field name=\"ACTION_SCROLL_TO_POSITION\" since=\"23\"/>\n\t\t<field name=\"ACTION_SCROLL_UP\" since=\"23\"/>\n\t\t<field name=\"ACTION_SELECT\"/>\n\t\t<field name=\"ACTION_SET_PROGRESS\" since=\"24\"/>\n\t\t<field name=\"ACTION_SET_SELECTION\"/>\n\t\t<field name=\"ACTION_SET_TEXT\"/>\n\t\t<field name=\"ACTION_SHOW_ON_SCREEN\" since=\"23\"/>\n\t\t<field name=\"ACTION_SHOW_TOOLTIP\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/view/accessibility/AccessibilityNodeInfo$CollectionInfo\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getColumnCount()I\"/>\n\t\t<method name=\"getRowCount()I\"/>\n\t\t<method name=\"getSelectionMode()I\" since=\"21\"/>\n\t\t<method name=\"isHierarchical()Z\"/>\n\t\t<method name=\"obtain(IIZ)Landroid/view/accessibility/AccessibilityNodeInfo$CollectionInfo;\"/>\n\t\t<method name=\"obtain(IIZI)Landroid/view/accessibility/AccessibilityNodeInfo$CollectionInfo;\" since=\"21\"/>\n\t\t<field name=\"SELECTION_MODE_MULTIPLE\" since=\"21\"/>\n\t\t<field name=\"SELECTION_MODE_NONE\" since=\"21\"/>\n\t\t<field name=\"SELECTION_MODE_SINGLE\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getColumnIndex()I\"/>\n\t\t<method name=\"getColumnSpan()I\"/>\n\t\t<method name=\"getRowIndex()I\"/>\n\t\t<method name=\"getRowSpan()I\"/>\n\t\t<method name=\"isHeading()Z\" deprecated=\"28\"/>\n\t\t<method name=\"isSelected()Z\" since=\"21\"/>\n\t\t<method name=\"obtain(IIIIZ)Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;\"/>\n\t\t<method name=\"obtain(IIIIZZ)Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/view/accessibility/AccessibilityNodeInfo$RangeInfo\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getCurrent()F\"/>\n\t\t<method name=\"getMax()F\"/>\n\t\t<method name=\"getMin()F\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<method name=\"obtain(IFFF)Landroid/view/accessibility/AccessibilityNodeInfo$RangeInfo;\"/>\n\t\t<field name=\"RANGE_TYPE_FLOAT\"/>\n\t\t<field name=\"RANGE_TYPE_INT\"/>\n\t\t<field name=\"RANGE_TYPE_PERCENT\"/>\n\t</class>\n\t<class name=\"android/view/accessibility/AccessibilityNodeInfo$TouchDelegateInfo\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Map;)V\"/>\n\t\t<method name=\"getRegionAt(I)Landroid/graphics/Region;\"/>\n\t\t<method name=\"getRegionCount()I\"/>\n\t\t<method name=\"getTargetForRegion(Landroid/graphics/Region;)Landroid/view/accessibility/AccessibilityNodeInfo;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/accessibility/AccessibilityNodeProvider\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addExtraDataToAccessibilityNodeInfo(ILandroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/String;Landroid/os/Bundle;)V\" since=\"26\"/>\n\t\t<method name=\"createAccessibilityNodeInfo(I)Landroid/view/accessibility/AccessibilityNodeInfo;\"/>\n\t\t<method name=\"findAccessibilityNodeInfosByText(Ljava/lang/String;I)Ljava/util/List;\"/>\n\t\t<method name=\"findFocus(I)Landroid/view/accessibility/AccessibilityNodeInfo;\" since=\"19\"/>\n\t\t<method name=\"performAction(IILandroid/os/Bundle;)Z\"/>\n\t\t<field name=\"HOST_VIEW_ID\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/view/accessibility/AccessibilityRecord\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAddedCount()I\"/>\n\t\t<method name=\"getBeforeText()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getClassName()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getContentDescription()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getCurrentItemIndex()I\"/>\n\t\t<method name=\"getFromIndex()I\"/>\n\t\t<method name=\"getItemCount()I\"/>\n\t\t<method name=\"getMaxScrollX()I\" since=\"15\"/>\n\t\t<method name=\"getMaxScrollY()I\" since=\"15\"/>\n\t\t<method name=\"getParcelableData()Landroid/os/Parcelable;\"/>\n\t\t<method name=\"getRemovedCount()I\"/>\n\t\t<method name=\"getScrollDeltaX()I\" since=\"28\"/>\n\t\t<method name=\"getScrollDeltaY()I\" since=\"28\"/>\n\t\t<method name=\"getScrollX()I\"/>\n\t\t<method name=\"getScrollY()I\"/>\n\t\t<method name=\"getSource()Landroid/view/accessibility/AccessibilityNodeInfo;\"/>\n\t\t<method name=\"getText()Ljava/util/List;\"/>\n\t\t<method name=\"getToIndex()I\"/>\n\t\t<method name=\"getWindowId()I\"/>\n\t\t<method name=\"isChecked()Z\"/>\n\t\t<method name=\"isEnabled()Z\"/>\n\t\t<method name=\"isFullScreen()Z\"/>\n\t\t<method name=\"isPassword()Z\"/>\n\t\t<method name=\"isScrollable()Z\"/>\n\t\t<method name=\"obtain()Landroid/view/accessibility/AccessibilityRecord;\"/>\n\t\t<method name=\"obtain(Landroid/view/accessibility/AccessibilityRecord;)Landroid/view/accessibility/AccessibilityRecord;\"/>\n\t\t<method name=\"recycle()V\"/>\n\t\t<method name=\"setAddedCount(I)V\"/>\n\t\t<method name=\"setBeforeText(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setChecked(Z)V\"/>\n\t\t<method name=\"setClassName(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setContentDescription(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setCurrentItemIndex(I)V\"/>\n\t\t<method name=\"setEnabled(Z)V\"/>\n\t\t<method name=\"setFromIndex(I)V\"/>\n\t\t<method name=\"setFullScreen(Z)V\"/>\n\t\t<method name=\"setItemCount(I)V\"/>\n\t\t<method name=\"setMaxScrollX(I)V\" since=\"15\"/>\n\t\t<method name=\"setMaxScrollY(I)V\" since=\"15\"/>\n\t\t<method name=\"setParcelableData(Landroid/os/Parcelable;)V\"/>\n\t\t<method name=\"setPassword(Z)V\"/>\n\t\t<method name=\"setRemovedCount(I)V\"/>\n\t\t<method name=\"setScrollDeltaX(I)V\" since=\"28\"/>\n\t\t<method name=\"setScrollDeltaY(I)V\" since=\"28\"/>\n\t\t<method name=\"setScrollX(I)V\"/>\n\t\t<method name=\"setScrollY(I)V\"/>\n\t\t<method name=\"setScrollable(Z)V\"/>\n\t\t<method name=\"setSource(Landroid/view/View;)V\"/>\n\t\t<method name=\"setSource(Landroid/view/View;I)V\" since=\"16\"/>\n\t\t<method name=\"setToIndex(I)V\"/>\n\t</class>\n\t<class name=\"android/view/accessibility/AccessibilityRequestPreparer\" since=\"27\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/View;I)V\"/>\n\t\t<method name=\"getView()Landroid/view/View;\"/>\n\t\t<method name=\"onPrepareExtraData(ILjava/lang/String;Landroid/os/Bundle;Landroid/os/Message;)V\"/>\n\t\t<field name=\"REQUEST_TYPE_EXTRA_DATA\"/>\n\t</class>\n\t<class name=\"android/view/accessibility/AccessibilityWindowInfo\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getAnchor()Landroid/view/accessibility/AccessibilityNodeInfo;\" since=\"24\"/>\n\t\t<method name=\"getBoundsInScreen(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"getChild(I)Landroid/view/accessibility/AccessibilityWindowInfo;\"/>\n\t\t<method name=\"getChildCount()I\"/>\n\t\t<method name=\"getId()I\"/>\n\t\t<method name=\"getLayer()I\"/>\n\t\t<method name=\"getParent()Landroid/view/accessibility/AccessibilityWindowInfo;\"/>\n\t\t<method name=\"getRoot()Landroid/view/accessibility/AccessibilityNodeInfo;\"/>\n\t\t<method name=\"getTitle()Ljava/lang/CharSequence;\" since=\"24\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<method name=\"isAccessibilityFocused()Z\"/>\n\t\t<method name=\"isActive()Z\"/>\n\t\t<method name=\"isFocused()Z\"/>\n\t\t<method name=\"isInPictureInPictureMode()Z\" since=\"26\"/>\n\t\t<method name=\"obtain()Landroid/view/accessibility/AccessibilityWindowInfo;\"/>\n\t\t<method name=\"obtain(Landroid/view/accessibility/AccessibilityWindowInfo;)Landroid/view/accessibility/AccessibilityWindowInfo;\"/>\n\t\t<method name=\"recycle()V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"TYPE_ACCESSIBILITY_OVERLAY\" since=\"22\"/>\n\t\t<field name=\"TYPE_APPLICATION\"/>\n\t\t<field name=\"TYPE_INPUT_METHOD\"/>\n\t\t<field name=\"TYPE_SPLIT_SCREEN_DIVIDER\" since=\"24\"/>\n\t\t<field name=\"TYPE_SYSTEM\"/>\n\t</class>\n\t<class name=\"android/view/accessibility/CaptioningManager\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addCaptioningChangeListener(Landroid/view/accessibility/CaptioningManager$CaptioningChangeListener;)V\"/>\n\t\t<method name=\"getFontScale()F\"/>\n\t\t<method name=\"getLocale()Ljava/util/Locale;\"/>\n\t\t<method name=\"getUserStyle()Landroid/view/accessibility/CaptioningManager$CaptionStyle;\"/>\n\t\t<method name=\"isEnabled()Z\"/>\n\t\t<method name=\"removeCaptioningChangeListener(Landroid/view/accessibility/CaptioningManager$CaptioningChangeListener;)V\"/>\n\t</class>\n\t<class name=\"android/view/accessibility/CaptioningManager$CaptionStyle\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getTypeface()Landroid/graphics/Typeface;\"/>\n\t\t<method name=\"hasBackgroundColor()Z\" since=\"21\"/>\n\t\t<method name=\"hasEdgeColor()Z\" since=\"21\"/>\n\t\t<method name=\"hasEdgeType()Z\" since=\"21\"/>\n\t\t<method name=\"hasForegroundColor()Z\" since=\"21\"/>\n\t\t<method name=\"hasWindowColor()Z\" since=\"21\"/>\n\t\t<field name=\"EDGE_TYPE_DEPRESSED\" since=\"21\"/>\n\t\t<field name=\"EDGE_TYPE_DROP_SHADOW\"/>\n\t\t<field name=\"EDGE_TYPE_NONE\"/>\n\t\t<field name=\"EDGE_TYPE_OUTLINE\"/>\n\t\t<field name=\"EDGE_TYPE_RAISED\" since=\"21\"/>\n\t\t<field name=\"EDGE_TYPE_UNSPECIFIED\" since=\"21\"/>\n\t\t<field name=\"backgroundColor\"/>\n\t\t<field name=\"edgeColor\"/>\n\t\t<field name=\"edgeType\"/>\n\t\t<field name=\"foregroundColor\"/>\n\t\t<field name=\"windowColor\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/view/accessibility/CaptioningManager$CaptioningChangeListener\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onEnabledChanged(Z)V\"/>\n\t\t<method name=\"onFontScaleChanged(F)V\"/>\n\t\t<method name=\"onLocaleChanged(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"onUserStyleChanged(Landroid/view/accessibility/CaptioningManager$CaptionStyle;)V\"/>\n\t</class>\n\t<class name=\"android/view/animation/AccelerateDecelerateInterpolator\" since=\"1\">\n\t\t<extends name=\"android/view/animation/BaseInterpolator\" since=\"22\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"22\"/>\n\t\t<implements name=\"android/view/animation/Interpolator\" removed=\"22\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t</class>\n\t<class name=\"android/view/animation/AccelerateInterpolator\" since=\"1\">\n\t\t<extends name=\"android/view/animation/BaseInterpolator\" since=\"22\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"22\"/>\n\t\t<implements name=\"android/view/animation/Interpolator\" removed=\"22\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(F)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t</class>\n\t<class name=\"android/view/animation/AlphaAnimation\" since=\"1\">\n\t\t<extends name=\"android/view/animation/Animation\"/>\n\t\t<method name=\"&lt;init>(FF)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t</class>\n\t<class name=\"android/view/animation/Animation\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\" since=\"3\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"applyTransformation(FLandroid/view/animation/Transformation;)V\"/>\n\t\t<method name=\"cancel()V\" since=\"8\"/>\n\t\t<method name=\"clone()Landroid/view/animation/Animation;\" since=\"3\"/>\n\t\t<method name=\"computeDurationHint()J\" since=\"3\"/>\n\t\t<method name=\"ensureInterpolator()V\"/>\n\t\t<method name=\"getBackgroundColor()I\" since=\"12\"/>\n\t\t<method name=\"getDetachWallpaper()Z\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"getDuration()J\"/>\n\t\t<method name=\"getFillAfter()Z\"/>\n\t\t<method name=\"getFillBefore()Z\"/>\n\t\t<method name=\"getInterpolator()Landroid/view/animation/Interpolator;\"/>\n\t\t<method name=\"getRepeatCount()I\"/>\n\t\t<method name=\"getRepeatMode()I\"/>\n\t\t<method name=\"getScaleFactor()F\" since=\"11\"/>\n\t\t<method name=\"getStartOffset()J\"/>\n\t\t<method name=\"getStartTime()J\"/>\n\t\t<method name=\"getTransformation(JLandroid/view/animation/Transformation;)Z\"/>\n\t\t<method name=\"getTransformation(JLandroid/view/animation/Transformation;F)Z\" since=\"11\"/>\n\t\t<method name=\"getZAdjustment()I\"/>\n\t\t<method name=\"hasEnded()Z\"/>\n\t\t<method name=\"hasStarted()Z\"/>\n\t\t<method name=\"initialize(IIII)V\"/>\n\t\t<method name=\"isFillEnabled()Z\" since=\"3\"/>\n\t\t<method name=\"isInitialized()Z\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"resolveSize(IFII)F\"/>\n\t\t<method name=\"restrictDuration(J)V\"/>\n\t\t<method name=\"scaleCurrentDuration(F)V\"/>\n\t\t<method name=\"setAnimationListener(Landroid/view/animation/Animation$AnimationListener;)V\"/>\n\t\t<method name=\"setBackgroundColor(I)V\" since=\"12\"/>\n\t\t<method name=\"setDetachWallpaper(Z)V\" since=\"5\" deprecated=\"29\"/>\n\t\t<method name=\"setDuration(J)V\"/>\n\t\t<method name=\"setFillAfter(Z)V\"/>\n\t\t<method name=\"setFillBefore(Z)V\"/>\n\t\t<method name=\"setFillEnabled(Z)V\" since=\"3\"/>\n\t\t<method name=\"setInterpolator(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"setInterpolator(Landroid/view/animation/Interpolator;)V\"/>\n\t\t<method name=\"setRepeatCount(I)V\"/>\n\t\t<method name=\"setRepeatMode(I)V\"/>\n\t\t<method name=\"setStartOffset(J)V\"/>\n\t\t<method name=\"setStartTime(J)V\"/>\n\t\t<method name=\"setZAdjustment(I)V\"/>\n\t\t<method name=\"start()V\"/>\n\t\t<method name=\"startNow()V\"/>\n\t\t<method name=\"willChangeBounds()Z\"/>\n\t\t<method name=\"willChangeTransformationMatrix()Z\"/>\n\t\t<field name=\"ABSOLUTE\"/>\n\t\t<field name=\"INFINITE\"/>\n\t\t<field name=\"RELATIVE_TO_PARENT\"/>\n\t\t<field name=\"RELATIVE_TO_SELF\"/>\n\t\t<field name=\"RESTART\"/>\n\t\t<field name=\"REVERSE\"/>\n\t\t<field name=\"START_ON_FIRST_FRAME\"/>\n\t\t<field name=\"ZORDER_BOTTOM\"/>\n\t\t<field name=\"ZORDER_NORMAL\"/>\n\t\t<field name=\"ZORDER_TOP\"/>\n\t</class>\n\t<class name=\"android/view/animation/Animation$AnimationListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onAnimationEnd(Landroid/view/animation/Animation;)V\"/>\n\t\t<method name=\"onAnimationRepeat(Landroid/view/animation/Animation;)V\"/>\n\t\t<method name=\"onAnimationStart(Landroid/view/animation/Animation;)V\"/>\n\t</class>\n\t<class name=\"android/view/animation/Animation$Description\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"type\"/>\n\t\t<field name=\"value\"/>\n\t</class>\n\t<class name=\"android/view/animation/AnimationSet\" since=\"1\">\n\t\t<extends name=\"android/view/animation/Animation\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Z)V\"/>\n\t\t<method name=\"addAnimation(Landroid/view/animation/Animation;)V\"/>\n\t\t<method name=\"clone()Landroid/view/animation/AnimationSet;\" since=\"3\"/>\n\t\t<method name=\"getAnimations()Ljava/util/List;\"/>\n\t</class>\n\t<class name=\"android/view/animation/AnimationUtils\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"currentAnimationTimeMillis()J\"/>\n\t\t<method name=\"loadAnimation(Landroid/content/Context;I)Landroid/view/animation/Animation;\"/>\n\t\t<method name=\"loadInterpolator(Landroid/content/Context;I)Landroid/view/animation/Interpolator;\"/>\n\t\t<method name=\"loadLayoutAnimation(Landroid/content/Context;I)Landroid/view/animation/LayoutAnimationController;\"/>\n\t\t<method name=\"makeInAnimation(Landroid/content/Context;Z)Landroid/view/animation/Animation;\"/>\n\t\t<method name=\"makeInChildBottomAnimation(Landroid/content/Context;)Landroid/view/animation/Animation;\"/>\n\t\t<method name=\"makeOutAnimation(Landroid/content/Context;Z)Landroid/view/animation/Animation;\"/>\n\t</class>\n\t<class name=\"android/view/animation/AnticipateInterpolator\" since=\"4\">\n\t\t<extends name=\"android/view/animation/BaseInterpolator\" since=\"22\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"22\"/>\n\t\t<implements name=\"android/view/animation/Interpolator\" removed=\"22\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(F)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t</class>\n\t<class name=\"android/view/animation/AnticipateOvershootInterpolator\" since=\"4\">\n\t\t<extends name=\"android/view/animation/BaseInterpolator\" since=\"22\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"22\"/>\n\t\t<implements name=\"android/view/animation/Interpolator\" removed=\"22\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(F)V\"/>\n\t\t<method name=\"&lt;init>(FF)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t</class>\n\t<class name=\"android/view/animation/BaseInterpolator\" since=\"22\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/view/animation/Interpolator\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/view/animation/BounceInterpolator\" since=\"4\">\n\t\t<extends name=\"android/view/animation/BaseInterpolator\" since=\"22\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"22\"/>\n\t\t<implements name=\"android/view/animation/Interpolator\" removed=\"22\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t</class>\n\t<class name=\"android/view/animation/CycleInterpolator\" since=\"1\">\n\t\t<extends name=\"android/view/animation/BaseInterpolator\" since=\"22\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"22\"/>\n\t\t<implements name=\"android/view/animation/Interpolator\" removed=\"22\"/>\n\t\t<method name=\"&lt;init>(F)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t</class>\n\t<class name=\"android/view/animation/DecelerateInterpolator\" since=\"1\">\n\t\t<extends name=\"android/view/animation/BaseInterpolator\" since=\"22\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"22\"/>\n\t\t<implements name=\"android/view/animation/Interpolator\" removed=\"22\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(F)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t</class>\n\t<class name=\"android/view/animation/GridLayoutAnimationController\" since=\"1\">\n\t\t<extends name=\"android/view/animation/LayoutAnimationController\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/animation/Animation;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/animation/Animation;FF)V\"/>\n\t\t<method name=\"getColumnDelay()F\"/>\n\t\t<method name=\"getDirection()I\"/>\n\t\t<method name=\"getDirectionPriority()I\"/>\n\t\t<method name=\"getRowDelay()F\"/>\n\t\t<method name=\"setColumnDelay(F)V\"/>\n\t\t<method name=\"setDirection(I)V\"/>\n\t\t<method name=\"setDirectionPriority(I)V\"/>\n\t\t<method name=\"setRowDelay(F)V\"/>\n\t\t<field name=\"DIRECTION_BOTTOM_TO_TOP\"/>\n\t\t<field name=\"DIRECTION_HORIZONTAL_MASK\"/>\n\t\t<field name=\"DIRECTION_LEFT_TO_RIGHT\"/>\n\t\t<field name=\"DIRECTION_RIGHT_TO_LEFT\"/>\n\t\t<field name=\"DIRECTION_TOP_TO_BOTTOM\"/>\n\t\t<field name=\"DIRECTION_VERTICAL_MASK\"/>\n\t\t<field name=\"PRIORITY_COLUMN\"/>\n\t\t<field name=\"PRIORITY_NONE\"/>\n\t\t<field name=\"PRIORITY_ROW\"/>\n\t</class>\n\t<class name=\"android/view/animation/GridLayoutAnimationController$AnimationParameters\" since=\"1\">\n\t\t<extends name=\"android/view/animation/LayoutAnimationController$AnimationParameters\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"column\"/>\n\t\t<field name=\"columnsCount\"/>\n\t\t<field name=\"row\"/>\n\t\t<field name=\"rowsCount\"/>\n\t</class>\n\t<class name=\"android/view/animation/Interpolator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/animation/TimeInterpolator\" since=\"11\"/>\n\t\t<method name=\"getInterpolation(F)F\" removed=\"11\"/>\n\t</class>\n\t<class name=\"android/view/animation/LayoutAnimationController\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/animation/Animation;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/animation/Animation;F)V\"/>\n\t\t<method name=\"getAnimation()Landroid/view/animation/Animation;\"/>\n\t\t<method name=\"getAnimationForView(Landroid/view/View;)Landroid/view/animation/Animation;\"/>\n\t\t<method name=\"getDelay()F\"/>\n\t\t<method name=\"getDelayForView(Landroid/view/View;)J\"/>\n\t\t<method name=\"getInterpolator()Landroid/view/animation/Interpolator;\"/>\n\t\t<method name=\"getOrder()I\"/>\n\t\t<method name=\"getTransformedIndex(Landroid/view/animation/LayoutAnimationController$AnimationParameters;)I\"/>\n\t\t<method name=\"isDone()Z\"/>\n\t\t<method name=\"setAnimation(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"setAnimation(Landroid/view/animation/Animation;)V\"/>\n\t\t<method name=\"setDelay(F)V\"/>\n\t\t<method name=\"setInterpolator(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"setInterpolator(Landroid/view/animation/Interpolator;)V\"/>\n\t\t<method name=\"setOrder(I)V\"/>\n\t\t<method name=\"start()V\"/>\n\t\t<method name=\"willOverlap()Z\"/>\n\t\t<field name=\"ORDER_NORMAL\"/>\n\t\t<field name=\"ORDER_RANDOM\"/>\n\t\t<field name=\"ORDER_REVERSE\"/>\n\t\t<field name=\"mAnimation\"/>\n\t\t<field name=\"mInterpolator\"/>\n\t\t<field name=\"mRandomizer\"/>\n\t</class>\n\t<class name=\"android/view/animation/LayoutAnimationController$AnimationParameters\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"count\"/>\n\t\t<field name=\"index\"/>\n\t</class>\n\t<class name=\"android/view/animation/LinearInterpolator\" since=\"1\">\n\t\t<extends name=\"android/view/animation/BaseInterpolator\" since=\"22\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"22\"/>\n\t\t<implements name=\"android/view/animation/Interpolator\" removed=\"22\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t</class>\n\t<class name=\"android/view/animation/OvershootInterpolator\" since=\"4\">\n\t\t<extends name=\"android/view/animation/BaseInterpolator\" since=\"22\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"22\"/>\n\t\t<implements name=\"android/view/animation/Interpolator\" removed=\"22\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(F)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t</class>\n\t<class name=\"android/view/animation/PathInterpolator\" since=\"21\">\n\t\t<extends name=\"android/view/animation/BaseInterpolator\" since=\"22\"/>\n\t\t<extends name=\"java/lang/Object\" removed=\"22\"/>\n\t\t<implements name=\"android/view/animation/Interpolator\" removed=\"22\"/>\n\t\t<method name=\"&lt;init>(FF)V\"/>\n\t\t<method name=\"&lt;init>(FFFF)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/Path;)V\"/>\n\t</class>\n\t<class name=\"android/view/animation/RotateAnimation\" since=\"1\">\n\t\t<extends name=\"android/view/animation/Animation\"/>\n\t\t<method name=\"&lt;init>(FF)V\"/>\n\t\t<method name=\"&lt;init>(FFFF)V\"/>\n\t\t<method name=\"&lt;init>(FFIFIF)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t</class>\n\t<class name=\"android/view/animation/ScaleAnimation\" since=\"1\">\n\t\t<extends name=\"android/view/animation/Animation\"/>\n\t\t<method name=\"&lt;init>(FFFF)V\"/>\n\t\t<method name=\"&lt;init>(FFFFFF)V\"/>\n\t\t<method name=\"&lt;init>(FFFFIFIF)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t</class>\n\t<class name=\"android/view/animation/Transformation\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"compose(Landroid/view/animation/Transformation;)V\"/>\n\t\t<method name=\"getAlpha()F\"/>\n\t\t<method name=\"getMatrix()Landroid/graphics/Matrix;\"/>\n\t\t<method name=\"getTransformationType()I\"/>\n\t\t<method name=\"set(Landroid/view/animation/Transformation;)V\"/>\n\t\t<method name=\"setAlpha(F)V\"/>\n\t\t<method name=\"setTransformationType(I)V\"/>\n\t\t<method name=\"toShortString()Ljava/lang/String;\" since=\"3\"/>\n\t\t<field name=\"TYPE_ALPHA\"/>\n\t\t<field name=\"TYPE_BOTH\"/>\n\t\t<field name=\"TYPE_IDENTITY\"/>\n\t\t<field name=\"TYPE_MATRIX\"/>\n\t\t<field name=\"mAlpha\"/>\n\t\t<field name=\"mMatrix\"/>\n\t\t<field name=\"mTransformationType\"/>\n\t</class>\n\t<class name=\"android/view/animation/TranslateAnimation\" since=\"1\">\n\t\t<extends name=\"android/view/animation/Animation\"/>\n\t\t<method name=\"&lt;init>(FFFF)V\"/>\n\t\t<method name=\"&lt;init>(IFIFIFIF)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t</class>\n\t<class name=\"android/view/autofill/AutofillId\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/autofill/AutofillManager\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"cancel()V\"/>\n\t\t<method name=\"commit()V\"/>\n\t\t<method name=\"disableAutofillServices()V\"/>\n\t\t<method name=\"getAutofillServiceComponentName()Landroid/content/ComponentName;\" since=\"28\"/>\n\t\t<method name=\"getAvailableFieldClassificationAlgorithms()Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"getDefaultFieldClassificationAlgorithm()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getNextAutofillId()Landroid/view/autofill/AutofillId;\" since=\"28\"/>\n\t\t<method name=\"getUserData()Landroid/service/autofill/UserData;\" since=\"28\"/>\n\t\t<method name=\"getUserDataId()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"hasEnabledAutofillServices()Z\"/>\n\t\t<method name=\"isAutofillSupported()Z\"/>\n\t\t<method name=\"isEnabled()Z\"/>\n\t\t<method name=\"isFieldClassificationEnabled()Z\" since=\"28\"/>\n\t\t<method name=\"notifyValueChanged(Landroid/view/View;)V\"/>\n\t\t<method name=\"notifyValueChanged(Landroid/view/View;ILandroid/view/autofill/AutofillValue;)V\"/>\n\t\t<method name=\"notifyViewClicked(Landroid/view/View;)V\" since=\"28\"/>\n\t\t<method name=\"notifyViewClicked(Landroid/view/View;I)V\" since=\"28\"/>\n\t\t<method name=\"notifyViewEntered(Landroid/view/View;)V\"/>\n\t\t<method name=\"notifyViewEntered(Landroid/view/View;ILandroid/graphics/Rect;)V\"/>\n\t\t<method name=\"notifyViewExited(Landroid/view/View;)V\"/>\n\t\t<method name=\"notifyViewExited(Landroid/view/View;I)V\"/>\n\t\t<method name=\"notifyViewVisibilityChanged(Landroid/view/View;IZ)V\" since=\"27\"/>\n\t\t<method name=\"notifyViewVisibilityChanged(Landroid/view/View;Z)V\" since=\"27\"/>\n\t\t<method name=\"registerCallback(Landroid/view/autofill/AutofillManager$AutofillCallback;)V\"/>\n\t\t<method name=\"requestAutofill(Landroid/view/View;)V\"/>\n\t\t<method name=\"requestAutofill(Landroid/view/View;ILandroid/graphics/Rect;)V\"/>\n\t\t<method name=\"setUserData(Landroid/service/autofill/UserData;)V\" since=\"28\"/>\n\t\t<method name=\"unregisterCallback(Landroid/view/autofill/AutofillManager$AutofillCallback;)V\"/>\n\t\t<field name=\"EXTRA_ASSIST_STRUCTURE\"/>\n\t\t<field name=\"EXTRA_AUTHENTICATION_RESULT\"/>\n\t\t<field name=\"EXTRA_CLIENT_STATE\"/>\n\t</class>\n\t<class name=\"android/view/autofill/AutofillManager$AutofillCallback\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onAutofillEvent(Landroid/view/View;I)V\"/>\n\t\t<method name=\"onAutofillEvent(Landroid/view/View;II)V\"/>\n\t\t<field name=\"EVENT_INPUT_HIDDEN\"/>\n\t\t<field name=\"EVENT_INPUT_SHOWN\"/>\n\t\t<field name=\"EVENT_INPUT_UNAVAILABLE\"/>\n\t</class>\n\t<class name=\"android/view/autofill/AutofillValue\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"forDate(J)Landroid/view/autofill/AutofillValue;\"/>\n\t\t<method name=\"forList(I)Landroid/view/autofill/AutofillValue;\"/>\n\t\t<method name=\"forText(Ljava/lang/CharSequence;)Landroid/view/autofill/AutofillValue;\"/>\n\t\t<method name=\"forToggle(Z)Landroid/view/autofill/AutofillValue;\"/>\n\t\t<method name=\"getDateValue()J\"/>\n\t\t<method name=\"getListValue()I\"/>\n\t\t<method name=\"getTextValue()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getToggleValue()Z\"/>\n\t\t<method name=\"isDate()Z\"/>\n\t\t<method name=\"isList()Z\"/>\n\t\t<method name=\"isText()Z\"/>\n\t\t<method name=\"isToggle()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/contentcapture/ContentCaptureCondition\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/LocusId;I)V\"/>\n\t\t<method name=\"getFlags()I\"/>\n\t\t<method name=\"getLocusId()Landroid/content/LocusId;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FLAG_IS_REGEX\"/>\n\t</class>\n\t<class name=\"android/view/contentcapture/ContentCaptureContext\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"forLocusId(Ljava/lang/String;)Landroid/view/contentcapture/ContentCaptureContext;\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getLocusId()Landroid/content/LocusId;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/contentcapture/ContentCaptureContext$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/LocusId;)V\"/>\n\t\t<method name=\"build()Landroid/view/contentcapture/ContentCaptureContext;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/view/contentcapture/ContentCaptureContext$Builder;\"/>\n\t</class>\n\t<class name=\"android/view/contentcapture/ContentCaptureManager\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getContentCaptureConditions()Ljava/util/Set;\"/>\n\t\t<method name=\"getServiceComponentName()Landroid/content/ComponentName;\"/>\n\t\t<method name=\"isContentCaptureEnabled()Z\"/>\n\t\t<method name=\"removeData(Landroid/view/contentcapture/DataRemovalRequest;)V\"/>\n\t\t<method name=\"setContentCaptureEnabled(Z)V\"/>\n\t</class>\n\t<class name=\"android/view/contentcapture/ContentCaptureSession\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"createContentCaptureSession(Landroid/view/contentcapture/ContentCaptureContext;)Landroid/view/contentcapture/ContentCaptureSession;\"/>\n\t\t<method name=\"destroy()V\"/>\n\t\t<method name=\"getContentCaptureContext()Landroid/view/contentcapture/ContentCaptureContext;\"/>\n\t\t<method name=\"getContentCaptureSessionId()Landroid/view/contentcapture/ContentCaptureSessionId;\"/>\n\t\t<method name=\"newAutofillId(Landroid/view/autofill/AutofillId;J)Landroid/view/autofill/AutofillId;\"/>\n\t\t<method name=\"newViewStructure(Landroid/view/View;)Landroid/view/ViewStructure;\"/>\n\t\t<method name=\"newVirtualViewStructure(Landroid/view/autofill/AutofillId;J)Landroid/view/ViewStructure;\"/>\n\t\t<method name=\"notifyViewAppeared(Landroid/view/ViewStructure;)V\"/>\n\t\t<method name=\"notifyViewDisappeared(Landroid/view/autofill/AutofillId;)V\"/>\n\t\t<method name=\"notifyViewTextChanged(Landroid/view/autofill/AutofillId;Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"notifyViewsDisappeared(Landroid/view/autofill/AutofillId;[J)V\"/>\n\t\t<method name=\"setContentCaptureContext(Landroid/view/contentcapture/ContentCaptureContext;)V\"/>\n\t</class>\n\t<class name=\"android/view/contentcapture/ContentCaptureSessionId\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/contentcapture/DataRemovalRequest\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getLocusIdRequests()Ljava/util/List;\"/>\n\t\t<method name=\"getPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"isForEverything()Z\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FLAG_IS_PREFIX\"/>\n\t</class>\n\t<class name=\"android/view/contentcapture/DataRemovalRequest$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addLocusId(Landroid/content/LocusId;I)Landroid/view/contentcapture/DataRemovalRequest$Builder;\"/>\n\t\t<method name=\"build()Landroid/view/contentcapture/DataRemovalRequest;\"/>\n\t\t<method name=\"forEverything()Landroid/view/contentcapture/DataRemovalRequest$Builder;\"/>\n\t</class>\n\t<class name=\"android/view/contentcapture/DataRemovalRequest$LocusIdRequest\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getFlags()I\"/>\n\t\t<method name=\"getLocusId()Landroid/content/LocusId;\"/>\n\t</class>\n\t<class name=\"android/view/inputmethod/BaseInputConnection\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/view/inputmethod/InputConnection\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/View;Z)V\"/>\n\t\t<method name=\"getComposingSpanEnd(Landroid/text/Spannable;)I\"/>\n\t\t<method name=\"getComposingSpanStart(Landroid/text/Spannable;)I\"/>\n\t\t<method name=\"getEditable()Landroid/text/Editable;\"/>\n\t\t<method name=\"removeComposingSpans(Landroid/text/Spannable;)V\"/>\n\t\t<method name=\"setComposingSpans(Landroid/text/Spannable;)V\"/>\n\t</class>\n\t<class name=\"android/view/inputmethod/CompletionInfo\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(JILjava/lang/CharSequence;)V\"/>\n\t\t<method name=\"&lt;init>(JILjava/lang/CharSequence;Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"getId()J\"/>\n\t\t<method name=\"getLabel()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getPosition()I\"/>\n\t\t<method name=\"getText()Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/inputmethod/CorrectionInfo\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/CharSequence;Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"getNewText()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getOffset()I\"/>\n\t\t<method name=\"getOldText()Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/inputmethod/CursorAnchorInfo\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"getCharacterBounds(I)Landroid/graphics/RectF;\"/>\n\t\t<method name=\"getCharacterBoundsFlags(I)I\"/>\n\t\t<method name=\"getComposingText()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getComposingTextStart()I\"/>\n\t\t<method name=\"getInsertionMarkerBaseline()F\"/>\n\t\t<method name=\"getInsertionMarkerBottom()F\"/>\n\t\t<method name=\"getInsertionMarkerFlags()I\"/>\n\t\t<method name=\"getInsertionMarkerHorizontal()F\"/>\n\t\t<method name=\"getInsertionMarkerTop()F\"/>\n\t\t<method name=\"getMatrix()Landroid/graphics/Matrix;\"/>\n\t\t<method name=\"getSelectionEnd()I\"/>\n\t\t<method name=\"getSelectionStart()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FLAG_HAS_INVISIBLE_REGION\"/>\n\t\t<field name=\"FLAG_HAS_VISIBLE_REGION\"/>\n\t\t<field name=\"FLAG_IS_RTL\"/>\n\t</class>\n\t<class name=\"android/view/inputmethod/CursorAnchorInfo$Builder\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addCharacterBounds(IFFFFI)Landroid/view/inputmethod/CursorAnchorInfo$Builder;\"/>\n\t\t<method name=\"build()Landroid/view/inputmethod/CursorAnchorInfo;\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"setComposingText(ILjava/lang/CharSequence;)Landroid/view/inputmethod/CursorAnchorInfo$Builder;\"/>\n\t\t<method name=\"setInsertionMarkerLocation(FFFFI)Landroid/view/inputmethod/CursorAnchorInfo$Builder;\"/>\n\t\t<method name=\"setMatrix(Landroid/graphics/Matrix;)Landroid/view/inputmethod/CursorAnchorInfo$Builder;\"/>\n\t\t<method name=\"setSelectionRange(II)Landroid/view/inputmethod/CursorAnchorInfo$Builder;\"/>\n\t</class>\n\t<class name=\"android/view/inputmethod/EditorInfo\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"android/text/InputType\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"dump(Landroid/util/Printer;Ljava/lang/String;)V\"/>\n\t\t<method name=\"makeCompatible(I)V\" since=\"11\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"IME_ACTION_DONE\"/>\n\t\t<field name=\"IME_ACTION_GO\"/>\n\t\t<field name=\"IME_ACTION_NEXT\"/>\n\t\t<field name=\"IME_ACTION_NONE\"/>\n\t\t<field name=\"IME_ACTION_PREVIOUS\" since=\"11\"/>\n\t\t<field name=\"IME_ACTION_SEARCH\"/>\n\t\t<field name=\"IME_ACTION_SEND\"/>\n\t\t<field name=\"IME_ACTION_UNSPECIFIED\"/>\n\t\t<field name=\"IME_FLAG_FORCE_ASCII\" since=\"16\"/>\n\t\t<field name=\"IME_FLAG_NAVIGATE_NEXT\" since=\"11\"/>\n\t\t<field name=\"IME_FLAG_NAVIGATE_PREVIOUS\" since=\"11\"/>\n\t\t<field name=\"IME_FLAG_NO_ACCESSORY_ACTION\"/>\n\t\t<field name=\"IME_FLAG_NO_ENTER_ACTION\"/>\n\t\t<field name=\"IME_FLAG_NO_EXTRACT_UI\"/>\n\t\t<field name=\"IME_FLAG_NO_FULLSCREEN\" since=\"11\"/>\n\t\t<field name=\"IME_FLAG_NO_PERSONALIZED_LEARNING\" since=\"26\"/>\n\t\t<field name=\"IME_MASK_ACTION\"/>\n\t\t<field name=\"IME_NULL\"/>\n\t\t<field name=\"actionId\"/>\n\t\t<field name=\"actionLabel\"/>\n\t\t<field name=\"contentMimeTypes\" since=\"25\"/>\n\t\t<field name=\"extras\"/>\n\t\t<field name=\"fieldId\"/>\n\t\t<field name=\"fieldName\"/>\n\t\t<field name=\"hintLocales\" since=\"24\"/>\n\t\t<field name=\"hintText\"/>\n\t\t<field name=\"imeOptions\"/>\n\t\t<field name=\"initialCapsMode\"/>\n\t\t<field name=\"initialSelEnd\"/>\n\t\t<field name=\"initialSelStart\"/>\n\t\t<field name=\"inputType\"/>\n\t\t<field name=\"label\"/>\n\t\t<field name=\"packageName\"/>\n\t\t<field name=\"privateImeOptions\"/>\n\t</class>\n\t<class name=\"android/view/inputmethod/ExtractedText\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"FLAG_SELECTING\"/>\n\t\t<field name=\"FLAG_SINGLE_LINE\"/>\n\t\t<field name=\"flags\"/>\n\t\t<field name=\"hint\" since=\"28\"/>\n\t\t<field name=\"partialEndOffset\"/>\n\t\t<field name=\"partialStartOffset\"/>\n\t\t<field name=\"selectionEnd\"/>\n\t\t<field name=\"selectionStart\"/>\n\t\t<field name=\"startOffset\"/>\n\t\t<field name=\"text\"/>\n\t</class>\n\t<class name=\"android/view/inputmethod/ExtractedTextRequest\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"flags\"/>\n\t\t<field name=\"hintMaxChars\"/>\n\t\t<field name=\"hintMaxLines\"/>\n\t\t<field name=\"token\"/>\n\t</class>\n\t<class name=\"android/view/inputmethod/InputBinding\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/inputmethod/InputConnection;Landroid/os/IBinder;II)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/InputBinding;)V\"/>\n\t\t<method name=\"getConnection()Landroid/view/inputmethod/InputConnection;\"/>\n\t\t<method name=\"getConnectionToken()Landroid/os/IBinder;\"/>\n\t\t<method name=\"getPid()I\"/>\n\t\t<method name=\"getUid()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/inputmethod/InputConnection\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"beginBatchEdit()Z\"/>\n\t\t<method name=\"clearMetaKeyStates(I)Z\"/>\n\t\t<method name=\"closeConnection()V\" since=\"24\"/>\n\t\t<method name=\"commitCompletion(Landroid/view/inputmethod/CompletionInfo;)Z\"/>\n\t\t<method name=\"commitContent(Landroid/view/inputmethod/InputContentInfo;ILandroid/os/Bundle;)Z\" since=\"25\"/>\n\t\t<method name=\"commitCorrection(Landroid/view/inputmethod/CorrectionInfo;)Z\" since=\"11\"/>\n\t\t<method name=\"commitText(Ljava/lang/CharSequence;I)Z\"/>\n\t\t<method name=\"deleteSurroundingText(II)Z\"/>\n\t\t<method name=\"deleteSurroundingTextInCodePoints(II)Z\" since=\"24\"/>\n\t\t<method name=\"endBatchEdit()Z\"/>\n\t\t<method name=\"finishComposingText()Z\"/>\n\t\t<method name=\"getCursorCapsMode(I)I\"/>\n\t\t<method name=\"getExtractedText(Landroid/view/inputmethod/ExtractedTextRequest;I)Landroid/view/inputmethod/ExtractedText;\"/>\n\t\t<method name=\"getHandler()Landroid/os/Handler;\" since=\"24\"/>\n\t\t<method name=\"getSelectedText(I)Ljava/lang/CharSequence;\" since=\"9\"/>\n\t\t<method name=\"getTextAfterCursor(II)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTextBeforeCursor(II)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"performContextMenuAction(I)Z\"/>\n\t\t<method name=\"performEditorAction(I)Z\"/>\n\t\t<method name=\"performPrivateCommand(Ljava/lang/String;Landroid/os/Bundle;)Z\"/>\n\t\t<method name=\"reportFullscreenMode(Z)Z\"/>\n\t\t<method name=\"requestCursorUpdates(I)Z\" since=\"21\"/>\n\t\t<method name=\"sendKeyEvent(Landroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"setComposingRegion(II)Z\" since=\"9\"/>\n\t\t<method name=\"setComposingText(Ljava/lang/CharSequence;I)Z\"/>\n\t\t<method name=\"setSelection(II)Z\"/>\n\t\t<field name=\"CURSOR_UPDATE_IMMEDIATE\" since=\"21\"/>\n\t\t<field name=\"CURSOR_UPDATE_MONITOR\" since=\"21\"/>\n\t\t<field name=\"GET_EXTRACTED_TEXT_MONITOR\"/>\n\t\t<field name=\"GET_TEXT_WITH_STYLES\"/>\n\t\t<field name=\"INPUT_CONTENT_GRANT_READ_URI_PERMISSION\" since=\"25\"/>\n\t</class>\n\t<class name=\"android/view/inputmethod/InputConnectionWrapper\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/view/inputmethod/InputConnection\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/inputmethod/InputConnection;Z)V\"/>\n\t\t<method name=\"setTarget(Landroid/view/inputmethod/InputConnection;)V\"/>\n\t</class>\n\t<class name=\"android/view/inputmethod/InputContentInfo\" since=\"25\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/Uri;Landroid/content/ClipDescription;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/net/Uri;Landroid/content/ClipDescription;Landroid/net/Uri;)V\"/>\n\t\t<method name=\"getContentUri()Landroid/net/Uri;\"/>\n\t\t<method name=\"getDescription()Landroid/content/ClipDescription;\"/>\n\t\t<method name=\"getLinkUri()Landroid/net/Uri;\"/>\n\t\t<method name=\"releasePermission()V\"/>\n\t\t<method name=\"requestPermission()V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/inputmethod/InputMethod\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"attachToken(Landroid/os/IBinder;)V\"/>\n\t\t<method name=\"bindInput(Landroid/view/inputmethod/InputBinding;)V\"/>\n\t\t<method name=\"changeInputMethodSubtype(Landroid/view/inputmethod/InputMethodSubtype;)V\" since=\"11\"/>\n\t\t<method name=\"createSession(Landroid/view/inputmethod/InputMethod$SessionCallback;)V\"/>\n\t\t<method name=\"hideSoftInput(ILandroid/os/ResultReceiver;)V\"/>\n\t\t<method name=\"restartInput(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)V\"/>\n\t\t<method name=\"revokeSession(Landroid/view/inputmethod/InputMethodSession;)V\"/>\n\t\t<method name=\"setSessionEnabled(Landroid/view/inputmethod/InputMethodSession;Z)V\"/>\n\t\t<method name=\"showSoftInput(ILandroid/os/ResultReceiver;)V\"/>\n\t\t<method name=\"startInput(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)V\"/>\n\t\t<method name=\"unbindInput()V\"/>\n\t\t<field name=\"SERVICE_INTERFACE\"/>\n\t\t<field name=\"SERVICE_META_DATA\"/>\n\t\t<field name=\"SHOW_EXPLICIT\"/>\n\t\t<field name=\"SHOW_FORCED\"/>\n\t</class>\n\t<class name=\"android/view/inputmethod/InputMethod$SessionCallback\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"sessionCreated(Landroid/view/inputmethod/InputMethodSession;)V\"/>\n\t</class>\n\t<class name=\"android/view/inputmethod/InputMethodInfo\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/content/pm/ResolveInfo;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/CharSequence;Ljava/lang/String;)V\"/>\n\t\t<method name=\"dump(Landroid/util/Printer;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getComponent()Landroid/content/ComponentName;\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\"/>\n\t\t<method name=\"getIsDefaultResourceId()I\"/>\n\t\t<method name=\"getPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getServiceInfo()Landroid/content/pm/ServiceInfo;\"/>\n\t\t<method name=\"getServiceName()Ljava/lang/String;\"/>\n\t\t<method name=\"getSettingsActivity()Ljava/lang/String;\"/>\n\t\t<method name=\"getSubtypeAt(I)Landroid/view/inputmethod/InputMethodSubtype;\" since=\"11\"/>\n\t\t<method name=\"getSubtypeCount()I\" since=\"11\"/>\n\t\t<method name=\"loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/inputmethod/InputMethodManager\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"dispatchKeyEventFromInputMethod(Landroid/view/View;Landroid/view/KeyEvent;)V\" since=\"24\"/>\n\t\t<method name=\"displayCompletions(Landroid/view/View;[Landroid/view/inputmethod/CompletionInfo;)V\"/>\n\t\t<method name=\"getCurrentInputMethodSubtype()Landroid/view/inputmethod/InputMethodSubtype;\" since=\"11\"/>\n\t\t<method name=\"getEnabledInputMethodList()Ljava/util/List;\"/>\n\t\t<method name=\"getEnabledInputMethodSubtypeList(Landroid/view/inputmethod/InputMethodInfo;Z)Ljava/util/List;\" since=\"11\"/>\n\t\t<method name=\"getInputMethodList()Ljava/util/List;\"/>\n\t\t<method name=\"getLastInputMethodSubtype()Landroid/view/inputmethod/InputMethodSubtype;\" since=\"14\"/>\n\t\t<method name=\"getShortcutInputMethodsAndSubtypes()Ljava/util/Map;\" since=\"11\"/>\n\t\t<method name=\"hideSoftInputFromInputMethod(Landroid/os/IBinder;I)V\" deprecated=\"28\"/>\n\t\t<method name=\"hideSoftInputFromWindow(Landroid/os/IBinder;I)Z\"/>\n\t\t<method name=\"hideSoftInputFromWindow(Landroid/os/IBinder;ILandroid/os/ResultReceiver;)Z\"/>\n\t\t<method name=\"hideStatusIcon(Landroid/os/IBinder;)V\" deprecated=\"28\"/>\n\t\t<method name=\"isAcceptingText()Z\"/>\n\t\t<method name=\"isActive()Z\"/>\n\t\t<method name=\"isActive(Landroid/view/View;)Z\"/>\n\t\t<method name=\"isFullscreenMode()Z\"/>\n\t\t<method name=\"isWatchingCursor(Landroid/view/View;)Z\" deprecated=\"21\"/>\n\t\t<method name=\"restartInput(Landroid/view/View;)V\"/>\n\t\t<method name=\"sendAppPrivateCommand(Landroid/view/View;Ljava/lang/String;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"setAdditionalInputMethodSubtypes(Ljava/lang/String;[Landroid/view/inputmethod/InputMethodSubtype;)V\" since=\"14\" deprecated=\"29\"/>\n\t\t<method name=\"setCurrentInputMethodSubtype(Landroid/view/inputmethod/InputMethodSubtype;)Z\" since=\"11\" deprecated=\"29\"/>\n\t\t<method name=\"setInputMethod(Landroid/os/IBinder;Ljava/lang/String;)V\" deprecated=\"28\"/>\n\t\t<method name=\"setInputMethodAndSubtype(Landroid/os/IBinder;Ljava/lang/String;Landroid/view/inputmethod/InputMethodSubtype;)V\" since=\"11\" deprecated=\"28\"/>\n\t\t<method name=\"shouldOfferSwitchingToNextInputMethod(Landroid/os/IBinder;)Z\" since=\"19\" deprecated=\"28\"/>\n\t\t<method name=\"showInputMethodAndSubtypeEnabler(Ljava/lang/String;)V\" since=\"11\"/>\n\t\t<method name=\"showInputMethodPicker()V\"/>\n\t\t<method name=\"showSoftInput(Landroid/view/View;I)Z\"/>\n\t\t<method name=\"showSoftInput(Landroid/view/View;ILandroid/os/ResultReceiver;)Z\"/>\n\t\t<method name=\"showSoftInputFromInputMethod(Landroid/os/IBinder;I)V\" deprecated=\"28\"/>\n\t\t<method name=\"showStatusIcon(Landroid/os/IBinder;Ljava/lang/String;I)V\" deprecated=\"28\"/>\n\t\t<method name=\"switchToLastInputMethod(Landroid/os/IBinder;)Z\" since=\"11\" deprecated=\"28\"/>\n\t\t<method name=\"switchToNextInputMethod(Landroid/os/IBinder;Z)Z\" since=\"16\" deprecated=\"28\"/>\n\t\t<method name=\"toggleSoftInput(II)V\"/>\n\t\t<method name=\"toggleSoftInputFromWindow(Landroid/os/IBinder;II)V\"/>\n\t\t<method name=\"updateCursor(Landroid/view/View;IIII)V\" deprecated=\"21\"/>\n\t\t<method name=\"updateCursorAnchorInfo(Landroid/view/View;Landroid/view/inputmethod/CursorAnchorInfo;)V\" since=\"21\"/>\n\t\t<method name=\"updateExtractedText(Landroid/view/View;ILandroid/view/inputmethod/ExtractedText;)V\"/>\n\t\t<method name=\"updateSelection(Landroid/view/View;IIII)V\"/>\n\t\t<method name=\"viewClicked(Landroid/view/View;)V\" since=\"14\" deprecated=\"29\"/>\n\t\t<field name=\"HIDE_IMPLICIT_ONLY\"/>\n\t\t<field name=\"HIDE_NOT_ALWAYS\"/>\n\t\t<field name=\"RESULT_HIDDEN\"/>\n\t\t<field name=\"RESULT_SHOWN\"/>\n\t\t<field name=\"RESULT_UNCHANGED_HIDDEN\"/>\n\t\t<field name=\"RESULT_UNCHANGED_SHOWN\"/>\n\t\t<field name=\"SHOW_FORCED\"/>\n\t\t<field name=\"SHOW_IMPLICIT\"/>\n\t</class>\n\t<class name=\"android/view/inputmethod/InputMethodSession\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"appPrivateCommand(Ljava/lang/String;Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"dispatchGenericMotionEvent(ILandroid/view/MotionEvent;Landroid/view/inputmethod/InputMethodSession$EventCallback;)V\" since=\"17\"/>\n\t\t<method name=\"dispatchKeyEvent(ILandroid/view/KeyEvent;Landroid/view/inputmethod/InputMethodSession$EventCallback;)V\"/>\n\t\t<method name=\"dispatchTrackballEvent(ILandroid/view/MotionEvent;Landroid/view/inputmethod/InputMethodSession$EventCallback;)V\"/>\n\t\t<method name=\"displayCompletions([Landroid/view/inputmethod/CompletionInfo;)V\"/>\n\t\t<method name=\"finishInput()V\"/>\n\t\t<method name=\"toggleSoftInput(II)V\"/>\n\t\t<method name=\"updateCursor(Landroid/graphics/Rect;)V\"/>\n\t\t<method name=\"updateCursorAnchorInfo(Landroid/view/inputmethod/CursorAnchorInfo;)V\" since=\"21\"/>\n\t\t<method name=\"updateExtractedText(ILandroid/view/inputmethod/ExtractedText;)V\"/>\n\t\t<method name=\"updateSelection(IIIIII)V\"/>\n\t\t<method name=\"viewClicked(Z)V\" since=\"14\"/>\n\t</class>\n\t<class name=\"android/view/inputmethod/InputMethodSession$EventCallback\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"finishedEvent(IZ)V\"/>\n\t</class>\n\t<class name=\"android/view/inputmethod/InputMethodSubtype\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZ)V\" since=\"14\" deprecated=\"19\"/>\n\t\t<method name=\"&lt;init>(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZI)V\" since=\"17\" deprecated=\"19\"/>\n\t\t<method name=\"containsExtraValueKey(Ljava/lang/String;)Z\" since=\"12\"/>\n\t\t<method name=\"getDisplayName(Landroid/content/Context;Ljava/lang/String;Landroid/content/pm/ApplicationInfo;)Ljava/lang/CharSequence;\" since=\"14\"/>\n\t\t<method name=\"getExtraValue()Ljava/lang/String;\"/>\n\t\t<method name=\"getExtraValueOf(Ljava/lang/String;)Ljava/lang/String;\" since=\"12\"/>\n\t\t<method name=\"getIconResId()I\"/>\n\t\t<method name=\"getLanguageTag()Ljava/lang/String;\" since=\"24\"/>\n\t\t<method name=\"getLocale()Ljava/lang/String;\" deprecated=\"24\"/>\n\t\t<method name=\"getMode()Ljava/lang/String;\"/>\n\t\t<method name=\"getNameResId()I\"/>\n\t\t<method name=\"isAsciiCapable()Z\" since=\"19\"/>\n\t\t<method name=\"isAuxiliary()Z\" since=\"14\"/>\n\t\t<method name=\"overridesImplicitlyEnabledSubtype()Z\" since=\"14\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/view/inputmethod/InputMethodSubtype;\"/>\n\t\t<method name=\"setIsAsciiCapable(Z)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;\"/>\n\t\t<method name=\"setIsAuxiliary(Z)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;\"/>\n\t\t<method name=\"setLanguageTag(Ljava/lang/String;)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;\" since=\"24\"/>\n\t\t<method name=\"setOverridesImplicitlyEnabledSubtype(Z)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;\"/>\n\t\t<method name=\"setSubtypeExtraValue(Ljava/lang/String;)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;\"/>\n\t\t<method name=\"setSubtypeIconResId(I)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;\"/>\n\t\t<method name=\"setSubtypeId(I)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;\"/>\n\t\t<method name=\"setSubtypeLocale(Ljava/lang/String;)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;\"/>\n\t\t<method name=\"setSubtypeMode(Ljava/lang/String;)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;\"/>\n\t\t<method name=\"setSubtypeNameResId(I)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;\"/>\n\t</class>\n\t<class name=\"android/view/inspector/InspectionCompanion\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"mapProperties(Landroid/view/inspector/PropertyMapper;)V\"/>\n\t\t<method name=\"readProperties(Ljava/lang/Object;Landroid/view/inspector/PropertyReader;)V\"/>\n\t</class>\n\t<class name=\"android/view/inspector/InspectionCompanion$UninitializedPropertyMapException\" since=\"29\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/view/inspector/InspectionCompanionProvider\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"provide(Ljava/lang/Class;)Landroid/view/inspector/InspectionCompanion;\"/>\n\t</class>\n\t<class name=\"android/view/inspector/IntFlagMapping\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"add(IILjava/lang/String;)V\"/>\n\t\t<method name=\"get(I)Ljava/util/Set;\"/>\n\t</class>\n\t<class name=\"android/view/inspector/PropertyMapper\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"mapBoolean(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"mapByte(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"mapChar(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"mapColor(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"mapDouble(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"mapFloat(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"mapGravity(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"mapInt(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"mapIntEnum(Ljava/lang/String;ILjava/util/function/IntFunction;)I\"/>\n\t\t<method name=\"mapIntFlag(Ljava/lang/String;ILjava/util/function/IntFunction;)I\"/>\n\t\t<method name=\"mapLong(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"mapObject(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"mapResourceId(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"mapShort(Ljava/lang/String;I)I\"/>\n\t</class>\n\t<class name=\"android/view/inspector/PropertyMapper$PropertyConflictException\" since=\"29\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/view/inspector/PropertyReader\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"readBoolean(IZ)V\"/>\n\t\t<method name=\"readByte(IB)V\"/>\n\t\t<method name=\"readChar(IC)V\"/>\n\t\t<method name=\"readColor(II)V\"/>\n\t\t<method name=\"readColor(IJ)V\"/>\n\t\t<method name=\"readColor(ILandroid/graphics/Color;)V\"/>\n\t\t<method name=\"readDouble(ID)V\"/>\n\t\t<method name=\"readFloat(IF)V\"/>\n\t\t<method name=\"readGravity(II)V\"/>\n\t\t<method name=\"readInt(II)V\"/>\n\t\t<method name=\"readIntEnum(II)V\"/>\n\t\t<method name=\"readIntFlag(II)V\"/>\n\t\t<method name=\"readLong(IJ)V\"/>\n\t\t<method name=\"readObject(ILjava/lang/Object;)V\"/>\n\t\t<method name=\"readResourceId(II)V\"/>\n\t\t<method name=\"readShort(IS)V\"/>\n\t</class>\n\t<class name=\"android/view/inspector/PropertyReader$PropertyTypeMismatchException\" since=\"29\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/view/inspector/StaticInspectionCompanionProvider\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/view/inspector/InspectionCompanionProvider\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/view/inspector/WindowInspector\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getGlobalWindowViews()Ljava/util/List;\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/ConversationAction\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getAction()Landroid/app/RemoteAction;\"/>\n\t\t<method name=\"getConfidenceScore()F\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getTextReply()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getType()Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"TYPE_CALL_PHONE\"/>\n\t\t<field name=\"TYPE_CREATE_REMINDER\"/>\n\t\t<field name=\"TYPE_OPEN_URL\"/>\n\t\t<field name=\"TYPE_SEND_EMAIL\"/>\n\t\t<field name=\"TYPE_SEND_SMS\"/>\n\t\t<field name=\"TYPE_SHARE_LOCATION\"/>\n\t\t<field name=\"TYPE_TEXT_REPLY\"/>\n\t\t<field name=\"TYPE_TRACK_FLIGHT\"/>\n\t\t<field name=\"TYPE_VIEW_CALENDAR\"/>\n\t\t<field name=\"TYPE_VIEW_MAP\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/ConversationAction$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"build()Landroid/view/textclassifier/ConversationAction;\"/>\n\t\t<method name=\"setAction(Landroid/app/RemoteAction;)Landroid/view/textclassifier/ConversationAction$Builder;\"/>\n\t\t<method name=\"setConfidenceScore(F)Landroid/view/textclassifier/ConversationAction$Builder;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/view/textclassifier/ConversationAction$Builder;\"/>\n\t\t<method name=\"setTextReply(Ljava/lang/CharSequence;)Landroid/view/textclassifier/ConversationAction$Builder;\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/ConversationActions\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/List;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getConversationActions()Ljava/util/List;\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/ConversationActions$Message\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getAuthor()Landroid/app/Person;\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getReferenceTime()Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"getText()Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"PERSON_USER_OTHERS\"/>\n\t\t<field name=\"PERSON_USER_SELF\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/ConversationActions$Message$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/Person;)V\"/>\n\t\t<method name=\"build()Landroid/view/textclassifier/ConversationActions$Message;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/view/textclassifier/ConversationActions$Message$Builder;\"/>\n\t\t<method name=\"setReferenceTime(Ljava/time/ZonedDateTime;)Landroid/view/textclassifier/ConversationActions$Message$Builder;\"/>\n\t\t<method name=\"setText(Ljava/lang/CharSequence;)Landroid/view/textclassifier/ConversationActions$Message$Builder;\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/ConversationActions$Request\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getCallingPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getConversation()Ljava/util/List;\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getHints()Ljava/util/List;\"/>\n\t\t<method name=\"getMaxSuggestions()I\"/>\n\t\t<method name=\"getTypeConfig()Landroid/view/textclassifier/TextClassifier$EntityConfig;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"HINT_FOR_IN_APP\"/>\n\t\t<field name=\"HINT_FOR_NOTIFICATION\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/ConversationActions$Request$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/List;)V\"/>\n\t\t<method name=\"build()Landroid/view/textclassifier/ConversationActions$Request;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/view/textclassifier/ConversationActions$Request$Builder;\"/>\n\t\t<method name=\"setHints(Ljava/util/List;)Landroid/view/textclassifier/ConversationActions$Request$Builder;\"/>\n\t\t<method name=\"setMaxSuggestions(I)Landroid/view/textclassifier/ConversationActions$Request$Builder;\"/>\n\t\t<method name=\"setTypeConfig(Landroid/view/textclassifier/TextClassifier$EntityConfig;)Landroid/view/textclassifier/ConversationActions$Request$Builder;\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/SelectionEvent\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"createSelectionActionEvent(III)Landroid/view/textclassifier/SelectionEvent;\"/>\n\t\t<method name=\"createSelectionActionEvent(IIILandroid/view/textclassifier/TextClassification;)Landroid/view/textclassifier/SelectionEvent;\"/>\n\t\t<method name=\"createSelectionModifiedEvent(II)Landroid/view/textclassifier/SelectionEvent;\"/>\n\t\t<method name=\"createSelectionModifiedEvent(IILandroid/view/textclassifier/TextClassification;)Landroid/view/textclassifier/SelectionEvent;\"/>\n\t\t<method name=\"createSelectionModifiedEvent(IILandroid/view/textclassifier/TextSelection;)Landroid/view/textclassifier/SelectionEvent;\"/>\n\t\t<method name=\"createSelectionStartedEvent(II)Landroid/view/textclassifier/SelectionEvent;\"/>\n\t\t<method name=\"getDurationSincePreviousEvent()J\"/>\n\t\t<method name=\"getDurationSinceSessionStart()J\"/>\n\t\t<method name=\"getEnd()I\"/>\n\t\t<method name=\"getEntityType()Ljava/lang/String;\"/>\n\t\t<method name=\"getEventIndex()I\"/>\n\t\t<method name=\"getEventTime()J\"/>\n\t\t<method name=\"getEventType()I\"/>\n\t\t<method name=\"getInvocationMethod()I\"/>\n\t\t<method name=\"getPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getResultId()Ljava/lang/String;\"/>\n\t\t<method name=\"getSessionId()Landroid/view/textclassifier/TextClassificationSessionId;\"/>\n\t\t<method name=\"getSmartEnd()I\"/>\n\t\t<method name=\"getSmartStart()I\"/>\n\t\t<method name=\"getStart()I\"/>\n\t\t<method name=\"getWidgetType()Ljava/lang/String;\"/>\n\t\t<method name=\"getWidgetVersion()Ljava/lang/String;\"/>\n\t\t<method name=\"isTerminal(I)Z\"/>\n\t\t<field name=\"ACTION_ABANDON\"/>\n\t\t<field name=\"ACTION_COPY\"/>\n\t\t<field name=\"ACTION_CUT\"/>\n\t\t<field name=\"ACTION_DRAG\"/>\n\t\t<field name=\"ACTION_OTHER\"/>\n\t\t<field name=\"ACTION_OVERTYPE\"/>\n\t\t<field name=\"ACTION_PASTE\"/>\n\t\t<field name=\"ACTION_RESET\"/>\n\t\t<field name=\"ACTION_SELECT_ALL\"/>\n\t\t<field name=\"ACTION_SHARE\"/>\n\t\t<field name=\"ACTION_SMART_SHARE\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"EVENT_AUTO_SELECTION\"/>\n\t\t<field name=\"EVENT_SELECTION_MODIFIED\"/>\n\t\t<field name=\"EVENT_SELECTION_STARTED\"/>\n\t\t<field name=\"EVENT_SMART_SELECTION_MULTI\"/>\n\t\t<field name=\"EVENT_SMART_SELECTION_SINGLE\"/>\n\t\t<field name=\"INVOCATION_LINK\"/>\n\t\t<field name=\"INVOCATION_MANUAL\"/>\n\t\t<field name=\"INVOCATION_UNKNOWN\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassification\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\" since=\"28\"/>\n\t\t<method name=\"getActions()Ljava/util/List;\" since=\"28\"/>\n\t\t<method name=\"getConfidenceScore(Ljava/lang/String;)F\"/>\n\t\t<method name=\"getEntity(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getEntityCount()I\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\" since=\"29\"/>\n\t\t<method name=\"getIcon()Landroid/graphics/drawable/Drawable;\" deprecated=\"28\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getIntent()Landroid/content/Intent;\" deprecated=\"28\"/>\n\t\t<method name=\"getLabel()Ljava/lang/CharSequence;\" deprecated=\"28\"/>\n\t\t<method name=\"getOnClickListener()Landroid/view/View$OnClickListener;\" deprecated=\"28\"/>\n\t\t<method name=\"getText()Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassification$Builder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addAction(Landroid/app/RemoteAction;)Landroid/view/textclassifier/TextClassification$Builder;\" since=\"28\"/>\n\t\t<method name=\"build()Landroid/view/textclassifier/TextClassification;\"/>\n\t\t<method name=\"setEntityType(Ljava/lang/String;F)Landroid/view/textclassifier/TextClassification$Builder;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/view/textclassifier/TextClassification$Builder;\" since=\"29\"/>\n\t\t<method name=\"setIcon(Landroid/graphics/drawable/Drawable;)Landroid/view/textclassifier/TextClassification$Builder;\" deprecated=\"28\"/>\n\t\t<method name=\"setId(Ljava/lang/String;)Landroid/view/textclassifier/TextClassification$Builder;\" since=\"28\"/>\n\t\t<method name=\"setIntent(Landroid/content/Intent;)Landroid/view/textclassifier/TextClassification$Builder;\" deprecated=\"28\"/>\n\t\t<method name=\"setLabel(Ljava/lang/String;)Landroid/view/textclassifier/TextClassification$Builder;\" deprecated=\"28\"/>\n\t\t<method name=\"setOnClickListener(Landroid/view/View$OnClickListener;)Landroid/view/textclassifier/TextClassification$Builder;\" deprecated=\"28\"/>\n\t\t<method name=\"setText(Ljava/lang/String;)Landroid/view/textclassifier/TextClassification$Builder;\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassification$Request\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getCallingPackageName()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getDefaultLocales()Landroid/os/LocaleList;\"/>\n\t\t<method name=\"getEndIndex()I\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\" since=\"29\"/>\n\t\t<method name=\"getReferenceTime()Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"getStartIndex()I\"/>\n\t\t<method name=\"getText()Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassification$Request$Builder\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;II)V\"/>\n\t\t<method name=\"build()Landroid/view/textclassifier/TextClassification$Request;\"/>\n\t\t<method name=\"setDefaultLocales(Landroid/os/LocaleList;)Landroid/view/textclassifier/TextClassification$Request$Builder;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/view/textclassifier/TextClassification$Request$Builder;\" since=\"29\"/>\n\t\t<method name=\"setReferenceTime(Ljava/time/ZonedDateTime;)Landroid/view/textclassifier/TextClassification$Request$Builder;\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassificationContext\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getWidgetType()Ljava/lang/String;\"/>\n\t\t<method name=\"getWidgetVersion()Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassificationContext$Builder\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"build()Landroid/view/textclassifier/TextClassificationContext;\"/>\n\t\t<method name=\"setWidgetVersion(Ljava/lang/String;)Landroid/view/textclassifier/TextClassificationContext$Builder;\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassificationManager\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createTextClassificationSession(Landroid/view/textclassifier/TextClassificationContext;)Landroid/view/textclassifier/TextClassifier;\" since=\"28\"/>\n\t\t<method name=\"getTextClassifier()Landroid/view/textclassifier/TextClassifier;\"/>\n\t\t<method name=\"setTextClassificationSessionFactory(Landroid/view/textclassifier/TextClassificationSessionFactory;)V\" since=\"28\"/>\n\t\t<method name=\"setTextClassifier(Landroid/view/textclassifier/TextClassifier;)V\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassificationSessionFactory\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createTextClassificationSession(Landroid/view/textclassifier/TextClassificationContext;)Landroid/view/textclassifier/TextClassifier;\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassificationSessionId\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassifier\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"classifyText(Landroid/view/textclassifier/TextClassification$Request;)Landroid/view/textclassifier/TextClassification;\" since=\"28\"/>\n\t\t<method name=\"classifyText(Ljava/lang/CharSequence;IILandroid/os/LocaleList;)Landroid/view/textclassifier/TextClassification;\"/>\n\t\t<method name=\"destroy()V\" since=\"28\"/>\n\t\t<method name=\"detectLanguage(Landroid/view/textclassifier/TextLanguage$Request;)Landroid/view/textclassifier/TextLanguage;\" since=\"29\"/>\n\t\t<method name=\"generateLinks(Landroid/view/textclassifier/TextLinks$Request;)Landroid/view/textclassifier/TextLinks;\" since=\"28\"/>\n\t\t<method name=\"getMaxGenerateLinksTextLength()I\" since=\"28\"/>\n\t\t<method name=\"isDestroyed()Z\" since=\"28\"/>\n\t\t<method name=\"onSelectionEvent(Landroid/view/textclassifier/SelectionEvent;)V\" since=\"28\"/>\n\t\t<method name=\"onTextClassifierEvent(Landroid/view/textclassifier/TextClassifierEvent;)V\" since=\"29\"/>\n\t\t<method name=\"suggestConversationActions(Landroid/view/textclassifier/ConversationActions$Request;)Landroid/view/textclassifier/ConversationActions;\" since=\"29\"/>\n\t\t<method name=\"suggestSelection(Landroid/view/textclassifier/TextSelection$Request;)Landroid/view/textclassifier/TextSelection;\" since=\"28\"/>\n\t\t<method name=\"suggestSelection(Ljava/lang/CharSequence;IILandroid/os/LocaleList;)Landroid/view/textclassifier/TextSelection;\"/>\n\t\t<field name=\"EXTRA_FROM_TEXT_CLASSIFIER\" since=\"29\"/>\n\t\t<field name=\"HINT_TEXT_IS_EDITABLE\" since=\"28\"/>\n\t\t<field name=\"HINT_TEXT_IS_NOT_EDITABLE\" since=\"28\"/>\n\t\t<field name=\"NO_OP\"/>\n\t\t<field name=\"TYPE_ADDRESS\"/>\n\t\t<field name=\"TYPE_DATE\" since=\"28\"/>\n\t\t<field name=\"TYPE_DATE_TIME\" since=\"28\"/>\n\t\t<field name=\"TYPE_EMAIL\"/>\n\t\t<field name=\"TYPE_FLIGHT_NUMBER\" since=\"28\"/>\n\t\t<field name=\"TYPE_OTHER\"/>\n\t\t<field name=\"TYPE_PHONE\"/>\n\t\t<field name=\"TYPE_UNKNOWN\" since=\"28\"/>\n\t\t<field name=\"TYPE_URL\"/>\n\t\t<field name=\"WIDGET_TYPE_CUSTOM_EDITTEXT\" since=\"28\"/>\n\t\t<field name=\"WIDGET_TYPE_CUSTOM_TEXTVIEW\" since=\"28\"/>\n\t\t<field name=\"WIDGET_TYPE_CUSTOM_UNSELECTABLE_TEXTVIEW\" since=\"28\"/>\n\t\t<field name=\"WIDGET_TYPE_EDITTEXT\" since=\"28\"/>\n\t\t<field name=\"WIDGET_TYPE_EDIT_WEBVIEW\" since=\"28\"/>\n\t\t<field name=\"WIDGET_TYPE_NOTIFICATION\" since=\"29\"/>\n\t\t<field name=\"WIDGET_TYPE_TEXTVIEW\" since=\"28\"/>\n\t\t<field name=\"WIDGET_TYPE_UNKNOWN\" since=\"28\"/>\n\t\t<field name=\"WIDGET_TYPE_UNSELECTABLE_TEXTVIEW\" since=\"28\"/>\n\t\t<field name=\"WIDGET_TYPE_WEBVIEW\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassifier$EntityConfig\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"create(Ljava/util/Collection;Ljava/util/Collection;Ljava/util/Collection;)Landroid/view/textclassifier/TextClassifier$EntityConfig;\" deprecated=\"29\"/>\n\t\t<method name=\"createWithExplicitEntityList(Ljava/util/Collection;)Landroid/view/textclassifier/TextClassifier$EntityConfig;\" deprecated=\"29\"/>\n\t\t<method name=\"createWithHints(Ljava/util/Collection;)Landroid/view/textclassifier/TextClassifier$EntityConfig;\" deprecated=\"29\"/>\n\t\t<method name=\"getHints()Ljava/util/Collection;\"/>\n\t\t<method name=\"resolveEntityListModifications(Ljava/util/Collection;)Ljava/util/Collection;\"/>\n\t\t<method name=\"shouldIncludeTypesFromTextClassifier()Z\" since=\"29\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassifier$EntityConfig$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/view/textclassifier/TextClassifier$EntityConfig;\"/>\n\t\t<method name=\"includeTypesFromTextClassifier(Z)Landroid/view/textclassifier/TextClassifier$EntityConfig$Builder;\"/>\n\t\t<method name=\"setExcludedTypes(Ljava/util/Collection;)Landroid/view/textclassifier/TextClassifier$EntityConfig$Builder;\"/>\n\t\t<method name=\"setHints(Ljava/util/Collection;)Landroid/view/textclassifier/TextClassifier$EntityConfig$Builder;\"/>\n\t\t<method name=\"setIncludedTypes(Ljava/util/Collection;)Landroid/view/textclassifier/TextClassifier$EntityConfig$Builder;\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassifierEvent\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getActionIndices()[I\"/>\n\t\t<method name=\"getEntityTypes()[Ljava/lang/String;\"/>\n\t\t<method name=\"getEventCategory()I\"/>\n\t\t<method name=\"getEventContext()Landroid/view/textclassifier/TextClassificationContext;\"/>\n\t\t<method name=\"getEventIndex()I\"/>\n\t\t<method name=\"getEventType()I\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getLocale()Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"getModelName()Ljava/lang/String;\"/>\n\t\t<method name=\"getResultId()Ljava/lang/String;\"/>\n\t\t<method name=\"getScores()[F\"/>\n\t\t<field name=\"CATEGORY_CONVERSATION_ACTIONS\"/>\n\t\t<field name=\"CATEGORY_LANGUAGE_DETECTION\"/>\n\t\t<field name=\"CATEGORY_LINKIFY\"/>\n\t\t<field name=\"CATEGORY_SELECTION\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"TYPE_ACTIONS_GENERATED\"/>\n\t\t<field name=\"TYPE_ACTIONS_SHOWN\"/>\n\t\t<field name=\"TYPE_AUTO_SELECTION\"/>\n\t\t<field name=\"TYPE_COPY_ACTION\"/>\n\t\t<field name=\"TYPE_CUT_ACTION\"/>\n\t\t<field name=\"TYPE_LINK_CLICKED\"/>\n\t\t<field name=\"TYPE_MANUAL_REPLY\"/>\n\t\t<field name=\"TYPE_OTHER_ACTION\"/>\n\t\t<field name=\"TYPE_OVERTYPE\"/>\n\t\t<field name=\"TYPE_PASTE_ACTION\"/>\n\t\t<field name=\"TYPE_SELECTION_DESTROYED\"/>\n\t\t<field name=\"TYPE_SELECTION_DRAG\"/>\n\t\t<field name=\"TYPE_SELECTION_MODIFIED\"/>\n\t\t<field name=\"TYPE_SELECTION_RESET\"/>\n\t\t<field name=\"TYPE_SELECTION_STARTED\"/>\n\t\t<field name=\"TYPE_SELECT_ALL\"/>\n\t\t<field name=\"TYPE_SHARE_ACTION\"/>\n\t\t<field name=\"TYPE_SMART_ACTION\"/>\n\t\t<field name=\"TYPE_SMART_SELECTION_MULTI\"/>\n\t\t<field name=\"TYPE_SMART_SELECTION_SINGLE\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassifierEvent$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"setActionIndices([I)Landroid/view/textclassifier/TextClassifierEvent$Builder;\"/>\n\t\t<method name=\"setEntityTypes([Ljava/lang/String;)Landroid/view/textclassifier/TextClassifierEvent$Builder;\"/>\n\t\t<method name=\"setEventContext(Landroid/view/textclassifier/TextClassificationContext;)Landroid/view/textclassifier/TextClassifierEvent$Builder;\"/>\n\t\t<method name=\"setEventIndex(I)Landroid/view/textclassifier/TextClassifierEvent$Builder;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/view/textclassifier/TextClassifierEvent$Builder;\"/>\n\t\t<method name=\"setLocale(Landroid/icu/util/ULocale;)Landroid/view/textclassifier/TextClassifierEvent$Builder;\"/>\n\t\t<method name=\"setModelName(Ljava/lang/String;)Landroid/view/textclassifier/TextClassifierEvent$Builder;\"/>\n\t\t<method name=\"setResultId(Ljava/lang/String;)Landroid/view/textclassifier/TextClassifierEvent$Builder;\"/>\n\t\t<method name=\"setScores([F)Landroid/view/textclassifier/TextClassifierEvent$Builder;\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassifierEvent$ConversationActionsEvent\" since=\"29\">\n\t\t<extends name=\"android/view/textclassifier/TextClassifierEvent\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassifierEvent$ConversationActionsEvent$Builder\" since=\"29\">\n\t\t<extends name=\"android/view/textclassifier/TextClassifierEvent$Builder\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"build()Landroid/view/textclassifier/TextClassifierEvent$ConversationActionsEvent;\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassifierEvent$LanguageDetectionEvent\" since=\"29\">\n\t\t<extends name=\"android/view/textclassifier/TextClassifierEvent\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassifierEvent$LanguageDetectionEvent$Builder\" since=\"29\">\n\t\t<extends name=\"android/view/textclassifier/TextClassifierEvent$Builder\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"build()Landroid/view/textclassifier/TextClassifierEvent$LanguageDetectionEvent;\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassifierEvent$TextLinkifyEvent\" since=\"29\">\n\t\t<extends name=\"android/view/textclassifier/TextClassifierEvent\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassifierEvent$TextLinkifyEvent$Builder\" since=\"29\">\n\t\t<extends name=\"android/view/textclassifier/TextClassifierEvent$Builder\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"build()Landroid/view/textclassifier/TextClassifierEvent$TextLinkifyEvent;\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassifierEvent$TextSelectionEvent\" since=\"29\">\n\t\t<extends name=\"android/view/textclassifier/TextClassifierEvent\"/>\n\t\t<method name=\"getRelativeSuggestedWordEndIndex()I\"/>\n\t\t<method name=\"getRelativeSuggestedWordStartIndex()I\"/>\n\t\t<method name=\"getRelativeWordEndIndex()I\"/>\n\t\t<method name=\"getRelativeWordStartIndex()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextClassifierEvent$TextSelectionEvent$Builder\" since=\"29\">\n\t\t<extends name=\"android/view/textclassifier/TextClassifierEvent$Builder\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"build()Landroid/view/textclassifier/TextClassifierEvent$TextSelectionEvent;\"/>\n\t\t<method name=\"setRelativeSuggestedWordEndIndex(I)Landroid/view/textclassifier/TextClassifierEvent$TextSelectionEvent$Builder;\"/>\n\t\t<method name=\"setRelativeSuggestedWordStartIndex(I)Landroid/view/textclassifier/TextClassifierEvent$TextSelectionEvent$Builder;\"/>\n\t\t<method name=\"setRelativeWordEndIndex(I)Landroid/view/textclassifier/TextClassifierEvent$TextSelectionEvent$Builder;\"/>\n\t\t<method name=\"setRelativeWordStartIndex(I)Landroid/view/textclassifier/TextClassifierEvent$TextSelectionEvent$Builder;\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextLanguage\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getConfidenceScore(Landroid/icu/util/ULocale;)F\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\"/>\n\t\t<method name=\"getLocale(I)Landroid/icu/util/ULocale;\"/>\n\t\t<method name=\"getLocaleHypothesisCount()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextLanguage$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Landroid/view/textclassifier/TextLanguage;\"/>\n\t\t<method name=\"putLocale(Landroid/icu/util/ULocale;F)Landroid/view/textclassifier/TextLanguage$Builder;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/view/textclassifier/TextLanguage$Builder;\"/>\n\t\t<method name=\"setId(Ljava/lang/String;)Landroid/view/textclassifier/TextLanguage$Builder;\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextLanguage$Request\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getCallingPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\"/>\n\t\t<method name=\"getText()Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextLanguage$Request$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"build()Landroid/view/textclassifier/TextLanguage$Request;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/view/textclassifier/TextLanguage$Request$Builder;\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextLinks\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"apply(Landroid/text/Spannable;ILjava/util/function/Function;)I\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\" since=\"29\"/>\n\t\t<method name=\"getLinks()Ljava/util/Collection;\"/>\n\t\t<field name=\"APPLY_STRATEGY_IGNORE\"/>\n\t\t<field name=\"APPLY_STRATEGY_REPLACE\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"STATUS_DIFFERENT_TEXT\"/>\n\t\t<field name=\"STATUS_LINKS_APPLIED\"/>\n\t\t<field name=\"STATUS_NO_LINKS_APPLIED\"/>\n\t\t<field name=\"STATUS_NO_LINKS_FOUND\"/>\n\t\t<field name=\"STATUS_UNSUPPORTED_CHARACTER\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextLinks$Builder\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"addLink(IILjava/util/Map;)Landroid/view/textclassifier/TextLinks$Builder;\"/>\n\t\t<method name=\"addLink(IILjava/util/Map;Landroid/os/Bundle;)Landroid/view/textclassifier/TextLinks$Builder;\" since=\"29\"/>\n\t\t<method name=\"build()Landroid/view/textclassifier/TextLinks;\"/>\n\t\t<method name=\"clearTextLinks()Landroid/view/textclassifier/TextLinks$Builder;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/view/textclassifier/TextLinks$Builder;\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextLinks$Request\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getCallingPackageName()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getDefaultLocales()Landroid/os/LocaleList;\"/>\n\t\t<method name=\"getEntityConfig()Landroid/view/textclassifier/TextClassifier$EntityConfig;\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\" since=\"29\"/>\n\t\t<method name=\"getText()Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextLinks$Request$Builder\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"build()Landroid/view/textclassifier/TextLinks$Request;\"/>\n\t\t<method name=\"setDefaultLocales(Landroid/os/LocaleList;)Landroid/view/textclassifier/TextLinks$Request$Builder;\"/>\n\t\t<method name=\"setEntityConfig(Landroid/view/textclassifier/TextClassifier$EntityConfig;)Landroid/view/textclassifier/TextLinks$Request$Builder;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/view/textclassifier/TextLinks$Request$Builder;\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextLinks$TextLink\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getConfidenceScore(Ljava/lang/String;)F\"/>\n\t\t<method name=\"getEnd()I\"/>\n\t\t<method name=\"getEntity(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getEntityCount()I\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\" since=\"29\"/>\n\t\t<method name=\"getStart()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextLinks$TextLinkSpan\" since=\"28\">\n\t\t<extends name=\"android/text/style/ClickableSpan\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/textclassifier/TextLinks$TextLink;)V\"/>\n\t\t<method name=\"getTextLink()Landroid/view/textclassifier/TextLinks$TextLink;\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextSelection\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\" since=\"28\"/>\n\t\t<method name=\"getConfidenceScore(Ljava/lang/String;)F\"/>\n\t\t<method name=\"getEntity(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getEntityCount()I\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\" since=\"29\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\" since=\"28\"/>\n\t\t<method name=\"getSelectionEndIndex()I\"/>\n\t\t<method name=\"getSelectionStartIndex()I\"/>\n\t\t<field name=\"CREATOR\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextSelection$Builder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"build()Landroid/view/textclassifier/TextSelection;\"/>\n\t\t<method name=\"setEntityType(Ljava/lang/String;F)Landroid/view/textclassifier/TextSelection$Builder;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/view/textclassifier/TextSelection$Builder;\" since=\"29\"/>\n\t\t<method name=\"setId(Ljava/lang/String;)Landroid/view/textclassifier/TextSelection$Builder;\" since=\"28\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextSelection$Request\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getCallingPackageName()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getDefaultLocales()Landroid/os/LocaleList;\"/>\n\t\t<method name=\"getEndIndex()I\"/>\n\t\t<method name=\"getExtras()Landroid/os/Bundle;\" since=\"29\"/>\n\t\t<method name=\"getStartIndex()I\"/>\n\t\t<method name=\"getText()Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/textclassifier/TextSelection$Request$Builder\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;II)V\"/>\n\t\t<method name=\"build()Landroid/view/textclassifier/TextSelection$Request;\"/>\n\t\t<method name=\"setDefaultLocales(Landroid/os/LocaleList;)Landroid/view/textclassifier/TextSelection$Request$Builder;\"/>\n\t\t<method name=\"setExtras(Landroid/os/Bundle;)Landroid/view/textclassifier/TextSelection$Request$Builder;\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/view/textservice/SentenceSuggestionsInfo\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"&lt;init>([Landroid/view/textservice/SuggestionsInfo;[I[I)V\"/>\n\t\t<method name=\"getLengthAt(I)I\"/>\n\t\t<method name=\"getOffsetAt(I)I\"/>\n\t\t<method name=\"getSuggestionsCount()I\"/>\n\t\t<method name=\"getSuggestionsInfoAt(I)Landroid/view/textservice/SuggestionsInfo;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/textservice/SpellCheckerInfo\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"getComponent()Landroid/content/ComponentName;\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\"/>\n\t\t<method name=\"getPackageName()Ljava/lang/String;\"/>\n\t\t<method name=\"getServiceInfo()Landroid/content/pm/ServiceInfo;\"/>\n\t\t<method name=\"getSettingsActivity()Ljava/lang/String;\"/>\n\t\t<method name=\"getSubtypeAt(I)Landroid/view/textservice/SpellCheckerSubtype;\"/>\n\t\t<method name=\"getSubtypeCount()I\"/>\n\t\t<method name=\"loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/textservice/SpellCheckerSession\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"cancel()V\" since=\"15\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"getSentenceSuggestions([Landroid/view/textservice/TextInfo;I)V\" since=\"16\"/>\n\t\t<method name=\"getSpellChecker()Landroid/view/textservice/SpellCheckerInfo;\"/>\n\t\t<method name=\"getSuggestions(Landroid/view/textservice/TextInfo;I)V\" deprecated=\"16\"/>\n\t\t<method name=\"getSuggestions([Landroid/view/textservice/TextInfo;IZ)V\" deprecated=\"16\"/>\n\t\t<method name=\"isSessionDisconnected()Z\"/>\n\t\t<field name=\"SERVICE_META_DATA\"/>\n\t</class>\n\t<class name=\"android/view/textservice/SpellCheckerSession$SpellCheckerSessionListener\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onGetSentenceSuggestions([Landroid/view/textservice/SentenceSuggestionsInfo;)V\" since=\"16\"/>\n\t\t<method name=\"onGetSuggestions([Landroid/view/textservice/SuggestionsInfo;)V\"/>\n\t</class>\n\t<class name=\"android/view/textservice/SpellCheckerSubtype\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/String;Ljava/lang/String;)V\" deprecated=\"24\"/>\n\t\t<method name=\"containsExtraValueKey(Ljava/lang/String;)Z\" since=\"16\"/>\n\t\t<method name=\"getDisplayName(Landroid/content/Context;Ljava/lang/String;Landroid/content/pm/ApplicationInfo;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getExtraValue()Ljava/lang/String;\"/>\n\t\t<method name=\"getExtraValueOf(Ljava/lang/String;)Ljava/lang/String;\" since=\"16\"/>\n\t\t<method name=\"getLanguageTag()Ljava/lang/String;\" since=\"24\"/>\n\t\t<method name=\"getLocale()Ljava/lang/String;\" deprecated=\"24\"/>\n\t\t<method name=\"getNameResId()I\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/textservice/SuggestionsInfo\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(I[Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(I[Ljava/lang/String;II)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"getCookie()I\"/>\n\t\t<method name=\"getSequence()I\"/>\n\t\t<method name=\"getSuggestionAt(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getSuggestionsAttributes()I\"/>\n\t\t<method name=\"getSuggestionsCount()I\"/>\n\t\t<method name=\"setCookieAndSequence(II)V\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS\" since=\"15\"/>\n\t\t<field name=\"RESULT_ATTR_IN_THE_DICTIONARY\"/>\n\t\t<field name=\"RESULT_ATTR_LOOKS_LIKE_TYPO\"/>\n\t</class>\n\t<class name=\"android/view/textservice/TextInfo\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;IIII)V\" since=\"21\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;II)V\"/>\n\t\t<method name=\"getCharSequence()Ljava/lang/CharSequence;\" since=\"21\"/>\n\t\t<method name=\"getCookie()I\"/>\n\t\t<method name=\"getSequence()I\"/>\n\t\t<method name=\"getText()Ljava/lang/String;\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/view/textservice/TextServicesManager\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"newSpellCheckerSession(Landroid/os/Bundle;Ljava/util/Locale;Landroid/view/textservice/SpellCheckerSession$SpellCheckerSessionListener;Z)Landroid/view/textservice/SpellCheckerSession;\"/>\n\t</class>\n\t<class name=\"android/webkit/CacheManager\" since=\"1\" deprecated=\"11\" removed=\"17\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"cacheDisabled()Z\" deprecated=\"15\"/>\n\t\t<method name=\"endCacheTransaction()Z\" deprecated=\"15\"/>\n\t\t<method name=\"getCacheFile(Ljava/lang/String;Ljava/util/Map;)Landroid/webkit/CacheManager$CacheResult;\" deprecated=\"15\"/>\n\t\t<method name=\"getCacheFileBaseDir()Ljava/io/File;\" deprecated=\"15\"/>\n\t\t<method name=\"saveCacheFile(Ljava/lang/String;Landroid/webkit/CacheManager$CacheResult;)V\" deprecated=\"15\"/>\n\t\t<method name=\"startCacheTransaction()Z\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/webkit/CacheManager$CacheResult\" since=\"1\" deprecated=\"11\" removed=\"17\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getContentDisposition()Ljava/lang/String;\" since=\"7\"/>\n\t\t<method name=\"getContentLength()J\"/>\n\t\t<method name=\"getETag()Ljava/lang/String;\"/>\n\t\t<method name=\"getEncoding()Ljava/lang/String;\"/>\n\t\t<method name=\"getExpires()J\"/>\n\t\t<method name=\"getExpiresString()Ljava/lang/String;\" since=\"7\"/>\n\t\t<method name=\"getHttpStatusCode()I\"/>\n\t\t<method name=\"getInputStream()Ljava/io/InputStream;\"/>\n\t\t<method name=\"getLastModified()Ljava/lang/String;\"/>\n\t\t<method name=\"getLocalPath()Ljava/lang/String;\"/>\n\t\t<method name=\"getLocation()Ljava/lang/String;\"/>\n\t\t<method name=\"getMimeType()Ljava/lang/String;\"/>\n\t\t<method name=\"getOutputStream()Ljava/io/OutputStream;\"/>\n\t\t<method name=\"setEncoding(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setInputStream(Ljava/io/InputStream;)V\"/>\n\t</class>\n\t<class name=\"android/webkit/ClientCertRequest\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"cancel()V\"/>\n\t\t<method name=\"getHost()Ljava/lang/String;\"/>\n\t\t<method name=\"getKeyTypes()[Ljava/lang/String;\"/>\n\t\t<method name=\"getPort()I\"/>\n\t\t<method name=\"getPrincipals()[Ljava/security/Principal;\"/>\n\t\t<method name=\"ignore()V\"/>\n\t\t<method name=\"proceed(Ljava/security/PrivateKey;[Ljava/security/cert/X509Certificate;)V\"/>\n\t</class>\n\t<class name=\"android/webkit/ConsoleMessage\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ILandroid/webkit/ConsoleMessage$MessageLevel;)V\"/>\n\t\t<method name=\"lineNumber()I\"/>\n\t\t<method name=\"message()Ljava/lang/String;\"/>\n\t\t<method name=\"messageLevel()Landroid/webkit/ConsoleMessage$MessageLevel;\"/>\n\t\t<method name=\"sourceId()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/webkit/ConsoleMessage$MessageLevel\" since=\"8\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/webkit/ConsoleMessage$MessageLevel;\"/>\n\t\t<method name=\"values()[Landroid/webkit/ConsoleMessage$MessageLevel;\"/>\n\t\t<field name=\"DEBUG\"/>\n\t\t<field name=\"ERROR\"/>\n\t\t<field name=\"LOG\"/>\n\t\t<field name=\"TIP\"/>\n\t\t<field name=\"WARNING\"/>\n\t</class>\n\t<class name=\"android/webkit/CookieManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" since=\"22\" deprecated=\"29\"/>\n\t\t<method name=\"acceptCookie()Z\"/>\n\t\t<method name=\"acceptThirdPartyCookies(Landroid/webkit/WebView;)Z\" since=\"21\"/>\n\t\t<method name=\"allowFileSchemeCookies()Z\" since=\"12\"/>\n\t\t<method name=\"flush()V\" since=\"21\"/>\n\t\t<method name=\"getCookie(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance()Landroid/webkit/CookieManager;\"/>\n\t\t<method name=\"hasCookies()Z\"/>\n\t\t<method name=\"removeAllCookie()V\" deprecated=\"21\"/>\n\t\t<method name=\"removeAllCookies(Landroid/webkit/ValueCallback;)V\" since=\"21\"/>\n\t\t<method name=\"removeExpiredCookie()V\" deprecated=\"21\"/>\n\t\t<method name=\"removeSessionCookie()V\" deprecated=\"21\"/>\n\t\t<method name=\"removeSessionCookies(Landroid/webkit/ValueCallback;)V\" since=\"21\"/>\n\t\t<method name=\"setAcceptCookie(Z)V\"/>\n\t\t<method name=\"setAcceptFileSchemeCookies(Z)V\" since=\"12\"/>\n\t\t<method name=\"setAcceptThirdPartyCookies(Landroid/webkit/WebView;Z)V\" since=\"21\"/>\n\t\t<method name=\"setCookie(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setCookie(Ljava/lang/String;Ljava/lang/String;Landroid/webkit/ValueCallback;)V\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/webkit/CookieSyncManager\" since=\"1\" deprecated=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Runnable\"/>\n\t\t<method name=\"createInstance(Landroid/content/Context;)Landroid/webkit/CookieSyncManager;\" deprecated=\"29\"/>\n\t\t<method name=\"getInstance()Landroid/webkit/CookieSyncManager;\" deprecated=\"29\"/>\n\t\t<method name=\"onSyncInit()V\" since=\"28\" removed=\"29\"/>\n\t\t<method name=\"resetSync()V\" since=\"9\" deprecated=\"21\"/>\n\t\t<method name=\"startSync()V\" since=\"9\" deprecated=\"21\"/>\n\t\t<method name=\"stopSync()V\" since=\"9\" deprecated=\"21\"/>\n\t\t<method name=\"sync()V\" since=\"9\" deprecated=\"21\"/>\n\t\t<method name=\"syncFromRamToFlash()V\" deprecated=\"21\"/>\n\t\t<field name=\"LOGTAG\" since=\"21\" removed=\"28\"/>\n\t\t<field name=\"mDataBase\" since=\"21\" removed=\"28\"/>\n\t\t<field name=\"mHandler\" since=\"21\" removed=\"28\"/>\n\t</class>\n\t<class name=\"android/webkit/DateSorter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"getBoundary(I)J\"/>\n\t\t<method name=\"getIndex(J)I\"/>\n\t\t<method name=\"getLabel(I)Ljava/lang/String;\"/>\n\t\t<field name=\"DAY_COUNT\"/>\n\t</class>\n\t<class name=\"android/webkit/DownloadListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDownloadStart(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J)V\"/>\n\t</class>\n\t<class name=\"android/webkit/GeolocationPermissions\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" removed=\"16\"/>\n\t\t<method name=\"allow(Ljava/lang/String;)V\" since=\"7\"/>\n\t\t<method name=\"clear(Ljava/lang/String;)V\" since=\"7\"/>\n\t\t<method name=\"clearAll()V\" since=\"7\"/>\n\t\t<method name=\"getAllowed(Ljava/lang/String;Landroid/webkit/ValueCallback;)V\" since=\"7\"/>\n\t\t<method name=\"getInstance()Landroid/webkit/GeolocationPermissions;\" since=\"7\"/>\n\t\t<method name=\"getOrigins(Landroid/webkit/ValueCallback;)V\" since=\"7\"/>\n\t</class>\n\t<class name=\"android/webkit/GeolocationPermissions$Callback\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"invoke(Ljava/lang/String;ZZ)V\"/>\n\t</class>\n\t<class name=\"android/webkit/HttpAuthHandler\" since=\"1\">\n\t\t<extends name=\"android/os/Handler\"/>\n\t\t<method name=\"cancel()V\"/>\n\t\t<method name=\"proceed(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"useHttpAuthUsernamePassword()Z\"/>\n\t</class>\n\t<class name=\"android/webkit/JavascriptInterface\" since=\"17\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t</class>\n\t<class name=\"android/webkit/JsPromptResult\" since=\"1\">\n\t\t<extends name=\"android/webkit/JsResult\"/>\n\t\t<method name=\"confirm(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/webkit/JsResult\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"cancel()V\"/>\n\t\t<method name=\"confirm()V\"/>\n\t\t<method name=\"wakeUp()V\" removed=\"16\"/>\n\t\t<field name=\"mProxy\" removed=\"8\"/>\n\t\t<field name=\"mResult\" removed=\"16\"/>\n\t</class>\n\t<class name=\"android/webkit/MimeTypeMap\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getExtensionFromMimeType(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getFileExtensionFromUrl(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getMimeTypeFromExtension(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getSingleton()Landroid/webkit/MimeTypeMap;\"/>\n\t\t<method name=\"hasExtension(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"hasMimeType(Ljava/lang/String;)Z\"/>\n\t</class>\n\t<class name=\"android/webkit/PermissionRequest\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"deny()V\"/>\n\t\t<method name=\"getOrigin()Landroid/net/Uri;\"/>\n\t\t<method name=\"getResources()[Ljava/lang/String;\"/>\n\t\t<method name=\"grant([Ljava/lang/String;)V\"/>\n\t\t<field name=\"RESOURCE_AUDIO_CAPTURE\"/>\n\t\t<field name=\"RESOURCE_MIDI_SYSEX\" since=\"23\"/>\n\t\t<field name=\"RESOURCE_PROTECTED_MEDIA_ID\"/>\n\t\t<field name=\"RESOURCE_VIDEO_CAPTURE\"/>\n\t</class>\n\t<class name=\"android/webkit/Plugin\" since=\"1\" deprecated=\"5\" removed=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"dispatchClickEvent(Landroid/content/Context;)V\"/>\n\t\t<method name=\"getDescription()Ljava/lang/String;\"/>\n\t\t<method name=\"getFileName()Ljava/lang/String;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getPath()Ljava/lang/String;\"/>\n\t\t<method name=\"setClickHandler(Landroid/webkit/Plugin$PreferencesClickHandler;)V\"/>\n\t\t<method name=\"setDescription(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setFileName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setPath(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/webkit/Plugin$PreferencesClickHandler\" since=\"1\" removed=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"handleClickEvent(Landroid/content/Context;)V\"/>\n\t</class>\n\t<class name=\"android/webkit/PluginData\" since=\"3\" deprecated=\"5\" removed=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;JLjava/util/Map;I)V\"/>\n\t\t<method name=\"getContentLength()J\"/>\n\t\t<method name=\"getHeaders()Ljava/util/Map;\"/>\n\t\t<method name=\"getInputStream()Ljava/io/InputStream;\"/>\n\t\t<method name=\"getStatusCode()I\"/>\n\t</class>\n\t<class name=\"android/webkit/PluginList\" since=\"1\" deprecated=\"5\" removed=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addPlugin(Landroid/webkit/Plugin;)V\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"getList()Ljava/util/List;\"/>\n\t\t<method name=\"pluginClicked(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"removePlugin(Landroid/webkit/Plugin;)V\"/>\n\t</class>\n\t<class name=\"android/webkit/PluginStub\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getEmbeddedView(ILandroid/content/Context;)Landroid/view/View;\"/>\n\t\t<method name=\"getFullScreenView(ILandroid/content/Context;)Landroid/view/View;\"/>\n\t</class>\n\t<class name=\"android/webkit/RenderProcessGoneDetail\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"didCrash()Z\"/>\n\t\t<method name=\"rendererPriorityAtExit()I\"/>\n\t</class>\n\t<class name=\"android/webkit/SafeBrowsingResponse\" since=\"27\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"backToSafety(Z)V\"/>\n\t\t<method name=\"proceed(Z)V\"/>\n\t\t<method name=\"showInterstitial(Z)V\"/>\n\t</class>\n\t<class name=\"android/webkit/ServiceWorkerClient\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"shouldInterceptRequest(Landroid/webkit/WebResourceRequest;)Landroid/webkit/WebResourceResponse;\"/>\n\t</class>\n\t<class name=\"android/webkit/ServiceWorkerController\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"getInstance()Landroid/webkit/ServiceWorkerController;\"/>\n\t\t<method name=\"getServiceWorkerWebSettings()Landroid/webkit/ServiceWorkerWebSettings;\"/>\n\t\t<method name=\"setServiceWorkerClient(Landroid/webkit/ServiceWorkerClient;)V\"/>\n\t</class>\n\t<class name=\"android/webkit/ServiceWorkerWebSettings\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getAllowContentAccess()Z\"/>\n\t\t<method name=\"getAllowFileAccess()Z\"/>\n\t\t<method name=\"getBlockNetworkLoads()Z\"/>\n\t\t<method name=\"getCacheMode()I\"/>\n\t\t<method name=\"setAllowContentAccess(Z)V\"/>\n\t\t<method name=\"setAllowFileAccess(Z)V\"/>\n\t\t<method name=\"setBlockNetworkLoads(Z)V\"/>\n\t\t<method name=\"setCacheMode(I)V\"/>\n\t</class>\n\t<class name=\"android/webkit/SslErrorHandler\" since=\"1\">\n\t\t<extends name=\"android/os/Handler\"/>\n\t\t<method name=\"cancel()V\"/>\n\t\t<method name=\"proceed()V\"/>\n\t</class>\n\t<class name=\"android/webkit/TracingConfig\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getCustomIncludedCategories()Ljava/util/List;\"/>\n\t\t<method name=\"getPredefinedCategories()I\"/>\n\t\t<method name=\"getTracingMode()I\"/>\n\t\t<field name=\"CATEGORIES_ALL\"/>\n\t\t<field name=\"CATEGORIES_ANDROID_WEBVIEW\"/>\n\t\t<field name=\"CATEGORIES_FRAME_VIEWER\"/>\n\t\t<field name=\"CATEGORIES_INPUT_LATENCY\"/>\n\t\t<field name=\"CATEGORIES_JAVASCRIPT_AND_RENDERING\"/>\n\t\t<field name=\"CATEGORIES_NONE\"/>\n\t\t<field name=\"CATEGORIES_RENDERING\"/>\n\t\t<field name=\"CATEGORIES_WEB_DEVELOPER\"/>\n\t\t<field name=\"RECORD_CONTINUOUSLY\"/>\n\t\t<field name=\"RECORD_UNTIL_FULL\"/>\n\t</class>\n\t<class name=\"android/webkit/TracingConfig$Builder\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addCategories(Ljava/util/Collection;)Landroid/webkit/TracingConfig$Builder;\"/>\n\t\t<method name=\"addCategories([I)Landroid/webkit/TracingConfig$Builder;\"/>\n\t\t<method name=\"addCategories([Ljava/lang/String;)Landroid/webkit/TracingConfig$Builder;\"/>\n\t\t<method name=\"build()Landroid/webkit/TracingConfig;\"/>\n\t\t<method name=\"setTracingMode(I)Landroid/webkit/TracingConfig$Builder;\"/>\n\t</class>\n\t<class name=\"android/webkit/TracingController\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"getInstance()Landroid/webkit/TracingController;\"/>\n\t\t<method name=\"isTracing()Z\"/>\n\t\t<method name=\"start(Landroid/webkit/TracingConfig;)V\"/>\n\t\t<method name=\"stop(Ljava/io/OutputStream;Ljava/util/concurrent/Executor;)Z\"/>\n\t</class>\n\t<class name=\"android/webkit/URLUtil\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"composeSearchUrl(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"decode([B)[B\"/>\n\t\t<method name=\"guessFileName(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"guessUrl(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"isAboutUrl(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isAssetUrl(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isContentUrl(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isCookielessProxyUrl(Ljava/lang/String;)Z\" deprecated=\"15\"/>\n\t\t<method name=\"isDataUrl(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isFileUrl(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isHttpUrl(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isHttpsUrl(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isJavaScriptUrl(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isNetworkUrl(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isValidUrl(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"stripAnchor(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/webkit/UrlInterceptHandler\" since=\"1\" deprecated=\"5\" removed=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getPluginData(Ljava/lang/String;Ljava/util/Map;)Landroid/webkit/PluginData;\" since=\"3\"/>\n\t\t<method name=\"service(Ljava/lang/String;Ljava/util/Map;)Landroid/webkit/CacheManager$CacheResult;\"/>\n\t</class>\n\t<class name=\"android/webkit/UrlInterceptRegistry\" since=\"1\" deprecated=\"5\" removed=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getPluginData(Ljava/lang/String;Ljava/util/Map;)Landroid/webkit/PluginData;\" since=\"3\"/>\n\t\t<method name=\"getSurrogate(Ljava/lang/String;Ljava/util/Map;)Landroid/webkit/CacheManager$CacheResult;\"/>\n\t\t<method name=\"registerHandler(Landroid/webkit/UrlInterceptHandler;)Z\"/>\n\t\t<method name=\"setUrlInterceptDisabled(Z)V\"/>\n\t\t<method name=\"unregisterHandler(Landroid/webkit/UrlInterceptHandler;)Z\"/>\n\t\t<method name=\"urlInterceptDisabled()Z\"/>\n\t</class>\n\t<class name=\"android/webkit/ValueCallback\" since=\"7\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onReceiveValue(Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"android/webkit/WebBackForwardList\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\" since=\"22\"/>\n\t\t<method name=\"clone()Landroid/webkit/WebBackForwardList;\"/>\n\t\t<method name=\"getCurrentIndex()I\"/>\n\t\t<method name=\"getCurrentItem()Landroid/webkit/WebHistoryItem;\"/>\n\t\t<method name=\"getItemAtIndex(I)Landroid/webkit/WebHistoryItem;\"/>\n\t\t<method name=\"getSize()I\"/>\n\t</class>\n\t<class name=\"android/webkit/WebChromeClient\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getDefaultVideoPoster()Landroid/graphics/Bitmap;\" since=\"7\"/>\n\t\t<method name=\"getVideoLoadingProgressView()Landroid/view/View;\" since=\"7\"/>\n\t\t<method name=\"getVisitedHistory(Landroid/webkit/ValueCallback;)V\" since=\"7\"/>\n\t\t<method name=\"onCloseWindow(Landroid/webkit/WebView;)V\"/>\n\t\t<method name=\"onConsoleMessage(Landroid/webkit/ConsoleMessage;)Z\" since=\"8\"/>\n\t\t<method name=\"onConsoleMessage(Ljava/lang/String;ILjava/lang/String;)V\" since=\"7\" deprecated=\"15\"/>\n\t\t<method name=\"onCreateWindow(Landroid/webkit/WebView;ZZLandroid/os/Message;)Z\"/>\n\t\t<method name=\"onExceededDatabaseQuota(Ljava/lang/String;Ljava/lang/String;JJJLandroid/webkit/WebStorage$QuotaUpdater;)V\" since=\"5\" deprecated=\"19\"/>\n\t\t<method name=\"onGeolocationPermissionsHidePrompt()V\" since=\"5\"/>\n\t\t<method name=\"onGeolocationPermissionsShowPrompt(Ljava/lang/String;Landroid/webkit/GeolocationPermissions$Callback;)V\" since=\"5\"/>\n\t\t<method name=\"onHideCustomView()V\" since=\"7\"/>\n\t\t<method name=\"onJsAlert(Landroid/webkit/WebView;Ljava/lang/String;Ljava/lang/String;Landroid/webkit/JsResult;)Z\"/>\n\t\t<method name=\"onJsBeforeUnload(Landroid/webkit/WebView;Ljava/lang/String;Ljava/lang/String;Landroid/webkit/JsResult;)Z\"/>\n\t\t<method name=\"onJsConfirm(Landroid/webkit/WebView;Ljava/lang/String;Ljava/lang/String;Landroid/webkit/JsResult;)Z\"/>\n\t\t<method name=\"onJsPrompt(Landroid/webkit/WebView;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/webkit/JsPromptResult;)Z\"/>\n\t\t<method name=\"onJsTimeout()Z\" since=\"7\" deprecated=\"17\"/>\n\t\t<method name=\"onPermissionRequest(Landroid/webkit/PermissionRequest;)V\" since=\"21\"/>\n\t\t<method name=\"onPermissionRequestCanceled(Landroid/webkit/PermissionRequest;)V\" since=\"21\"/>\n\t\t<method name=\"onProgressChanged(Landroid/webkit/WebView;I)V\"/>\n\t\t<method name=\"onReachedMaxAppCacheSize(JJLandroid/webkit/WebStorage$QuotaUpdater;)V\" since=\"7\" deprecated=\"19\"/>\n\t\t<method name=\"onReceivedIcon(Landroid/webkit/WebView;Landroid/graphics/Bitmap;)V\"/>\n\t\t<method name=\"onReceivedTitle(Landroid/webkit/WebView;Ljava/lang/String;)V\"/>\n\t\t<method name=\"onReceivedTouchIconUrl(Landroid/webkit/WebView;Ljava/lang/String;Z)V\" since=\"7\"/>\n\t\t<method name=\"onRequestFocus(Landroid/webkit/WebView;)V\"/>\n\t\t<method name=\"onShowCustomView(Landroid/view/View;ILandroid/webkit/WebChromeClient$CustomViewCallback;)V\" since=\"14\" deprecated=\"18\"/>\n\t\t<method name=\"onShowCustomView(Landroid/view/View;Landroid/webkit/WebChromeClient$CustomViewCallback;)V\" since=\"7\"/>\n\t\t<method name=\"onShowFileChooser(Landroid/webkit/WebView;Landroid/webkit/ValueCallback;Landroid/webkit/WebChromeClient$FileChooserParams;)Z\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/webkit/WebChromeClient$CustomViewCallback\" since=\"7\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onCustomViewHidden()V\"/>\n\t</class>\n\t<class name=\"android/webkit/WebChromeClient$FileChooserParams\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"createIntent()Landroid/content/Intent;\"/>\n\t\t<method name=\"getAcceptTypes()[Ljava/lang/String;\"/>\n\t\t<method name=\"getFilenameHint()Ljava/lang/String;\"/>\n\t\t<method name=\"getMode()I\"/>\n\t\t<method name=\"getTitle()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"isCaptureEnabled()Z\"/>\n\t\t<method name=\"parseResult(ILandroid/content/Intent;)[Landroid/net/Uri;\"/>\n\t\t<field name=\"MODE_OPEN\"/>\n\t\t<field name=\"MODE_OPEN_MULTIPLE\"/>\n\t\t<field name=\"MODE_SAVE\"/>\n\t</class>\n\t<class name=\"android/webkit/WebHistoryItem\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\" since=\"22\"/>\n\t\t<method name=\"clone()Landroid/webkit/WebHistoryItem;\"/>\n\t\t<method name=\"getFavicon()Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"getId()I\" deprecated=\"15\" removed=\"17\"/>\n\t\t<method name=\"getOriginalUrl()Ljava/lang/String;\" since=\"3\"/>\n\t\t<method name=\"getTitle()Ljava/lang/String;\"/>\n\t\t<method name=\"getUrl()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/webkit/WebIconDatabase\" since=\"1\" deprecated=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" since=\"22\" deprecated=\"29\"/>\n\t\t<method name=\"close()V\" deprecated=\"29\"/>\n\t\t<method name=\"getInstance()Landroid/webkit/WebIconDatabase;\" deprecated=\"29\"/>\n\t\t<method name=\"open(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"releaseIconForPageUrl(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"removeAllIcons()V\" deprecated=\"29\"/>\n\t\t<method name=\"requestIconForPageUrl(Ljava/lang/String;Landroid/webkit/WebIconDatabase$IconListener;)V\" deprecated=\"29\"/>\n\t\t<method name=\"retainIconForPageUrl(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/webkit/WebIconDatabase$IconListener\" since=\"1\" deprecated=\"18\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onReceivedIcon(Ljava/lang/String;Landroid/graphics/Bitmap;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/webkit/WebMessage\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;[Landroid/webkit/WebMessagePort;)V\"/>\n\t\t<method name=\"getData()Ljava/lang/String;\"/>\n\t\t<method name=\"getPorts()[Landroid/webkit/WebMessagePort;\"/>\n\t</class>\n\t<class name=\"android/webkit/WebMessagePort\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"postMessage(Landroid/webkit/WebMessage;)V\"/>\n\t\t<method name=\"setWebMessageCallback(Landroid/webkit/WebMessagePort$WebMessageCallback;)V\"/>\n\t\t<method name=\"setWebMessageCallback(Landroid/webkit/WebMessagePort$WebMessageCallback;Landroid/os/Handler;)V\"/>\n\t</class>\n\t<class name=\"android/webkit/WebMessagePort$WebMessageCallback\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onMessage(Landroid/webkit/WebMessagePort;Landroid/webkit/WebMessage;)V\"/>\n\t</class>\n\t<class name=\"android/webkit/WebResourceError\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getDescription()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getErrorCode()I\"/>\n\t</class>\n\t<class name=\"android/webkit/WebResourceRequest\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getMethod()Ljava/lang/String;\"/>\n\t\t<method name=\"getRequestHeaders()Ljava/util/Map;\"/>\n\t\t<method name=\"getUrl()Landroid/net/Uri;\"/>\n\t\t<method name=\"hasGesture()Z\"/>\n\t\t<method name=\"isForMainFrame()Z\"/>\n\t\t<method name=\"isRedirect()Z\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/webkit/WebResourceResponse\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/util/Map;Ljava/io/InputStream;)V\" since=\"21\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"getData()Ljava/io/InputStream;\"/>\n\t\t<method name=\"getEncoding()Ljava/lang/String;\"/>\n\t\t<method name=\"getMimeType()Ljava/lang/String;\"/>\n\t\t<method name=\"getReasonPhrase()Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"getResponseHeaders()Ljava/util/Map;\" since=\"21\"/>\n\t\t<method name=\"getStatusCode()I\" since=\"21\"/>\n\t\t<method name=\"setData(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"setEncoding(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setMimeType(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setResponseHeaders(Ljava/util/Map;)V\" since=\"21\"/>\n\t\t<method name=\"setStatusCodeAndReasonPhrase(ILjava/lang/String;)V\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/webkit/WebSettings\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" since=\"22\"/>\n\t\t<method name=\"enableSmoothTransition()Z\" since=\"11\" deprecated=\"17\"/>\n\t\t<method name=\"getAllowContentAccess()Z\" since=\"11\"/>\n\t\t<method name=\"getAllowFileAccess()Z\" since=\"3\"/>\n\t\t<method name=\"getAllowFileAccessFromFileURLs()Z\" since=\"16\"/>\n\t\t<method name=\"getAllowUniversalAccessFromFileURLs()Z\" since=\"16\"/>\n\t\t<method name=\"getBlockNetworkImage()Z\"/>\n\t\t<method name=\"getBlockNetworkLoads()Z\" since=\"8\"/>\n\t\t<method name=\"getBuiltInZoomControls()Z\" since=\"3\"/>\n\t\t<method name=\"getCacheMode()I\"/>\n\t\t<method name=\"getCursiveFontFamily()Ljava/lang/String;\"/>\n\t\t<method name=\"getDatabaseEnabled()Z\" since=\"5\"/>\n\t\t<method name=\"getDatabasePath()Ljava/lang/String;\" since=\"5\" deprecated=\"19\"/>\n\t\t<method name=\"getDefaultFixedFontSize()I\"/>\n\t\t<method name=\"getDefaultFontSize()I\"/>\n\t\t<method name=\"getDefaultTextEncodingName()Ljava/lang/String;\"/>\n\t\t<method name=\"getDefaultUserAgent(Landroid/content/Context;)Ljava/lang/String;\" since=\"17\"/>\n\t\t<method name=\"getDefaultZoom()Landroid/webkit/WebSettings$ZoomDensity;\" since=\"7\" deprecated=\"19\"/>\n\t\t<method name=\"getDisabledActionModeMenuItems()I\" since=\"24\"/>\n\t\t<method name=\"getDisplayZoomControls()Z\" since=\"11\"/>\n\t\t<method name=\"getDomStorageEnabled()Z\" since=\"7\"/>\n\t\t<method name=\"getFantasyFontFamily()Ljava/lang/String;\"/>\n\t\t<method name=\"getFixedFontFamily()Ljava/lang/String;\"/>\n\t\t<method name=\"getForceDark()I\" since=\"29\"/>\n\t\t<method name=\"getJavaScriptCanOpenWindowsAutomatically()Z\"/>\n\t\t<method name=\"getJavaScriptEnabled()Z\"/>\n\t\t<method name=\"getLayoutAlgorithm()Landroid/webkit/WebSettings$LayoutAlgorithm;\"/>\n\t\t<method name=\"getLightTouchEnabled()Z\" deprecated=\"18\"/>\n\t\t<method name=\"getLoadWithOverviewMode()Z\" since=\"7\"/>\n\t\t<method name=\"getLoadsImagesAutomatically()Z\"/>\n\t\t<method name=\"getMediaPlaybackRequiresUserGesture()Z\" since=\"17\"/>\n\t\t<method name=\"getMinimumFontSize()I\"/>\n\t\t<method name=\"getMinimumLogicalFontSize()I\"/>\n\t\t<method name=\"getMixedContentMode()I\" since=\"21\"/>\n\t\t<method name=\"getNavDump()Z\" deprecated=\"15\" removed=\"17\"/>\n\t\t<method name=\"getOffscreenPreRaster()Z\" since=\"23\"/>\n\t\t<method name=\"getPluginState()Landroid/webkit/WebSettings$PluginState;\" since=\"8\" deprecated=\"18\"/>\n\t\t<method name=\"getPluginsEnabled()Z\" deprecated=\"15\" removed=\"18\"/>\n\t\t<method name=\"getPluginsPath()Ljava/lang/String;\" deprecated=\"15\" removed=\"18\"/>\n\t\t<method name=\"getSafeBrowsingEnabled()Z\" since=\"26\"/>\n\t\t<method name=\"getSansSerifFontFamily()Ljava/lang/String;\"/>\n\t\t<method name=\"getSaveFormData()Z\" deprecated=\"26\"/>\n\t\t<method name=\"getSavePassword()Z\" deprecated=\"18\"/>\n\t\t<method name=\"getSerifFontFamily()Ljava/lang/String;\"/>\n\t\t<method name=\"getStandardFontFamily()Ljava/lang/String;\"/>\n\t\t<method name=\"getTextSize()Landroid/webkit/WebSettings$TextSize;\" deprecated=\"15\"/>\n\t\t<method name=\"getTextZoom()I\" since=\"14\"/>\n\t\t<method name=\"getUseDoubleTree()Z\" deprecated=\"15\" removed=\"17\"/>\n\t\t<method name=\"getUseWebViewBackgroundForOverscrollBackground()Z\" since=\"9\" deprecated=\"15\" removed=\"17\"/>\n\t\t<method name=\"getUseWideViewPort()Z\"/>\n\t\t<method name=\"getUserAgent()I\" deprecated=\"15\" removed=\"17\"/>\n\t\t<method name=\"getUserAgentString()Ljava/lang/String;\" since=\"3\"/>\n\t\t<method name=\"setAllowContentAccess(Z)V\" since=\"11\"/>\n\t\t<method name=\"setAllowFileAccess(Z)V\" since=\"3\"/>\n\t\t<method name=\"setAllowFileAccessFromFileURLs(Z)V\" since=\"16\"/>\n\t\t<method name=\"setAllowUniversalAccessFromFileURLs(Z)V\" since=\"16\"/>\n\t\t<method name=\"setAppCacheEnabled(Z)V\" since=\"7\"/>\n\t\t<method name=\"setAppCacheMaxSize(J)V\" since=\"7\" deprecated=\"18\"/>\n\t\t<method name=\"setAppCachePath(Ljava/lang/String;)V\" since=\"7\"/>\n\t\t<method name=\"setBlockNetworkImage(Z)V\"/>\n\t\t<method name=\"setBlockNetworkLoads(Z)V\" since=\"8\"/>\n\t\t<method name=\"setBuiltInZoomControls(Z)V\" since=\"3\"/>\n\t\t<method name=\"setCacheMode(I)V\"/>\n\t\t<method name=\"setCursiveFontFamily(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setDatabaseEnabled(Z)V\" since=\"5\"/>\n\t\t<method name=\"setDatabasePath(Ljava/lang/String;)V\" since=\"5\" deprecated=\"19\"/>\n\t\t<method name=\"setDefaultFixedFontSize(I)V\"/>\n\t\t<method name=\"setDefaultFontSize(I)V\"/>\n\t\t<method name=\"setDefaultTextEncodingName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setDefaultZoom(Landroid/webkit/WebSettings$ZoomDensity;)V\" since=\"7\" deprecated=\"19\"/>\n\t\t<method name=\"setDisabledActionModeMenuItems(I)V\" since=\"24\"/>\n\t\t<method name=\"setDisplayZoomControls(Z)V\" since=\"11\"/>\n\t\t<method name=\"setDomStorageEnabled(Z)V\" since=\"7\"/>\n\t\t<method name=\"setEnableSmoothTransition(Z)V\" since=\"11\" deprecated=\"17\"/>\n\t\t<method name=\"setFantasyFontFamily(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setFixedFontFamily(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setForceDark(I)V\" since=\"29\"/>\n\t\t<method name=\"setGeolocationDatabasePath(Ljava/lang/String;)V\" since=\"5\" deprecated=\"24\"/>\n\t\t<method name=\"setGeolocationEnabled(Z)V\" since=\"5\"/>\n\t\t<method name=\"setJavaScriptCanOpenWindowsAutomatically(Z)V\"/>\n\t\t<method name=\"setJavaScriptEnabled(Z)V\"/>\n\t\t<method name=\"setLayoutAlgorithm(Landroid/webkit/WebSettings$LayoutAlgorithm;)V\"/>\n\t\t<method name=\"setLightTouchEnabled(Z)V\" deprecated=\"18\"/>\n\t\t<method name=\"setLoadWithOverviewMode(Z)V\" since=\"7\"/>\n\t\t<method name=\"setLoadsImagesAutomatically(Z)V\"/>\n\t\t<method name=\"setMediaPlaybackRequiresUserGesture(Z)V\" since=\"17\"/>\n\t\t<method name=\"setMinimumFontSize(I)V\"/>\n\t\t<method name=\"setMinimumLogicalFontSize(I)V\"/>\n\t\t<method name=\"setMixedContentMode(I)V\" since=\"21\"/>\n\t\t<method name=\"setNavDump(Z)V\" deprecated=\"15\" removed=\"17\"/>\n\t\t<method name=\"setNeedInitialFocus(Z)V\"/>\n\t\t<method name=\"setOffscreenPreRaster(Z)V\" since=\"23\"/>\n\t\t<method name=\"setPluginState(Landroid/webkit/WebSettings$PluginState;)V\" since=\"8\" deprecated=\"18\"/>\n\t\t<method name=\"setPluginsEnabled(Z)V\" deprecated=\"15\" removed=\"18\"/>\n\t\t<method name=\"setPluginsPath(Ljava/lang/String;)V\" deprecated=\"15\" removed=\"18\"/>\n\t\t<method name=\"setRenderPriority(Landroid/webkit/WebSettings$RenderPriority;)V\" deprecated=\"18\"/>\n\t\t<method name=\"setSafeBrowsingEnabled(Z)V\" since=\"26\"/>\n\t\t<method name=\"setSansSerifFontFamily(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setSaveFormData(Z)V\" deprecated=\"26\"/>\n\t\t<method name=\"setSavePassword(Z)V\" deprecated=\"18\"/>\n\t\t<method name=\"setSerifFontFamily(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setStandardFontFamily(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setSupportMultipleWindows(Z)V\"/>\n\t\t<method name=\"setSupportZoom(Z)V\"/>\n\t\t<method name=\"setTextSize(Landroid/webkit/WebSettings$TextSize;)V\" deprecated=\"15\"/>\n\t\t<method name=\"setTextZoom(I)V\" since=\"14\"/>\n\t\t<method name=\"setUseDoubleTree(Z)V\" deprecated=\"15\" removed=\"17\"/>\n\t\t<method name=\"setUseWebViewBackgroundForOverscrollBackground(Z)V\" since=\"9\" deprecated=\"15\" removed=\"17\"/>\n\t\t<method name=\"setUseWideViewPort(Z)V\"/>\n\t\t<method name=\"setUserAgent(I)V\" deprecated=\"15\" removed=\"17\"/>\n\t\t<method name=\"setUserAgentString(Ljava/lang/String;)V\" since=\"3\"/>\n\t\t<method name=\"supportMultipleWindows()Z\"/>\n\t\t<method name=\"supportZoom()Z\"/>\n\t\t<field name=\"FORCE_DARK_AUTO\" since=\"29\"/>\n\t\t<field name=\"FORCE_DARK_OFF\" since=\"29\"/>\n\t\t<field name=\"FORCE_DARK_ON\" since=\"29\"/>\n\t\t<field name=\"LOAD_CACHE_ELSE_NETWORK\"/>\n\t\t<field name=\"LOAD_CACHE_ONLY\"/>\n\t\t<field name=\"LOAD_DEFAULT\"/>\n\t\t<field name=\"LOAD_NORMAL\" deprecated=\"17\"/>\n\t\t<field name=\"LOAD_NO_CACHE\"/>\n\t\t<field name=\"MENU_ITEM_NONE\" since=\"24\"/>\n\t\t<field name=\"MENU_ITEM_PROCESS_TEXT\" since=\"24\"/>\n\t\t<field name=\"MENU_ITEM_SHARE\" since=\"24\"/>\n\t\t<field name=\"MENU_ITEM_WEB_SEARCH\" since=\"24\"/>\n\t\t<field name=\"MIXED_CONTENT_ALWAYS_ALLOW\" since=\"21\"/>\n\t\t<field name=\"MIXED_CONTENT_COMPATIBILITY_MODE\" since=\"21\"/>\n\t\t<field name=\"MIXED_CONTENT_NEVER_ALLOW\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/webkit/WebSettings$LayoutAlgorithm\" since=\"1\" deprecated=\"12\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/webkit/WebSettings$LayoutAlgorithm;\"/>\n\t\t<method name=\"values()[Landroid/webkit/WebSettings$LayoutAlgorithm;\"/>\n\t\t<field name=\"NARROW_COLUMNS\" deprecated=\"29\"/>\n\t\t<field name=\"NORMAL\"/>\n\t\t<field name=\"SINGLE_COLUMN\" deprecated=\"29\"/>\n\t\t<field name=\"TEXT_AUTOSIZING\" since=\"19\"/>\n\t</class>\n\t<class name=\"android/webkit/WebSettings$PluginState\" since=\"8\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/webkit/WebSettings$PluginState;\"/>\n\t\t<method name=\"values()[Landroid/webkit/WebSettings$PluginState;\"/>\n\t\t<field name=\"OFF\"/>\n\t\t<field name=\"ON\"/>\n\t\t<field name=\"ON_DEMAND\"/>\n\t</class>\n\t<class name=\"android/webkit/WebSettings$RenderPriority\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/webkit/WebSettings$RenderPriority;\"/>\n\t\t<method name=\"values()[Landroid/webkit/WebSettings$RenderPriority;\"/>\n\t\t<field name=\"HIGH\"/>\n\t\t<field name=\"LOW\"/>\n\t\t<field name=\"NORMAL\"/>\n\t</class>\n\t<class name=\"android/webkit/WebSettings$TextSize\" since=\"1\" deprecated=\"15\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/webkit/WebSettings$TextSize;\"/>\n\t\t<method name=\"values()[Landroid/webkit/WebSettings$TextSize;\"/>\n\t\t<field name=\"LARGER\" deprecated=\"29\"/>\n\t\t<field name=\"LARGEST\" deprecated=\"29\"/>\n\t\t<field name=\"NORMAL\" deprecated=\"29\"/>\n\t\t<field name=\"SMALLER\" deprecated=\"29\"/>\n\t\t<field name=\"SMALLEST\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/webkit/WebSettings$ZoomDensity\" since=\"7\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/webkit/WebSettings$ZoomDensity;\"/>\n\t\t<method name=\"values()[Landroid/webkit/WebSettings$ZoomDensity;\"/>\n\t\t<field name=\"CLOSE\"/>\n\t\t<field name=\"FAR\"/>\n\t\t<field name=\"MEDIUM\"/>\n\t</class>\n\t<class name=\"android/webkit/WebStorage\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" removed=\"16\"/>\n\t\t<method name=\"deleteAllData()V\" since=\"7\"/>\n\t\t<method name=\"deleteOrigin(Ljava/lang/String;)V\" since=\"7\"/>\n\t\t<method name=\"getInstance()Landroid/webkit/WebStorage;\" since=\"7\"/>\n\t\t<method name=\"getOrigins(Landroid/webkit/ValueCallback;)V\" since=\"7\"/>\n\t\t<method name=\"getQuotaForOrigin(Ljava/lang/String;Landroid/webkit/ValueCallback;)V\" since=\"7\"/>\n\t\t<method name=\"getUsageForOrigin(Ljava/lang/String;Landroid/webkit/ValueCallback;)V\" since=\"7\"/>\n\t\t<method name=\"setQuotaForOrigin(Ljava/lang/String;J)V\" since=\"7\" deprecated=\"18\"/>\n\t</class>\n\t<class name=\"android/webkit/WebStorage$Origin\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getOrigin()Ljava/lang/String;\"/>\n\t\t<method name=\"getQuota()J\"/>\n\t\t<method name=\"getUsage()J\"/>\n\t</class>\n\t<class name=\"android/webkit/WebStorage$QuotaUpdater\" since=\"5\" deprecated=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"updateQuota(J)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/webkit/WebView\" since=\"1\">\n\t\t<extends name=\"android/widget/AbsoluteLayout\"/>\n\t\t<implements name=\"android/view/ViewGroup$OnHierarchyChangeListener\"/>\n\t\t<implements name=\"android/view/ViewTreeObserver$OnGlobalFocusChangeListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;IZ)V\" since=\"11\" deprecated=\"17\"/>\n\t\t<method name=\"addJavascriptInterface(Ljava/lang/Object;Ljava/lang/String;)V\"/>\n\t\t<method name=\"canGoBack()Z\"/>\n\t\t<method name=\"canGoBackOrForward(I)Z\"/>\n\t\t<method name=\"canGoForward()Z\"/>\n\t\t<method name=\"canZoomIn()Z\" since=\"11\" deprecated=\"17\"/>\n\t\t<method name=\"canZoomOut()Z\" since=\"11\" deprecated=\"17\"/>\n\t\t<method name=\"capturePicture()Landroid/graphics/Picture;\" deprecated=\"19\"/>\n\t\t<method name=\"clearCache(Z)V\"/>\n\t\t<method name=\"clearClientCertPreferences(Ljava/lang/Runnable;)V\" since=\"21\"/>\n\t\t<method name=\"clearFormData()V\"/>\n\t\t<method name=\"clearHistory()V\"/>\n\t\t<method name=\"clearMatches()V\" since=\"3\"/>\n\t\t<method name=\"clearSslPreferences()V\"/>\n\t\t<method name=\"clearView()V\" deprecated=\"18\"/>\n\t\t<method name=\"copyBackForwardList()Landroid/webkit/WebBackForwardList;\"/>\n\t\t<method name=\"createPrintDocumentAdapter()Landroid/print/PrintDocumentAdapter;\" since=\"19\" deprecated=\"21\"/>\n\t\t<method name=\"createPrintDocumentAdapter(Ljava/lang/String;)Landroid/print/PrintDocumentAdapter;\" since=\"21\"/>\n\t\t<method name=\"createWebMessageChannel()[Landroid/webkit/WebMessagePort;\" since=\"23\"/>\n\t\t<method name=\"debugDump()V\" deprecated=\"15\" removed=\"17\"/>\n\t\t<method name=\"destroy()V\"/>\n\t\t<method name=\"disablePlatformNotifications()V\" deprecated=\"15\" removed=\"17\"/>\n\t\t<method name=\"disableWebView()V\" since=\"28\"/>\n\t\t<method name=\"documentHasImages(Landroid/os/Message;)V\"/>\n\t\t<method name=\"emulateShiftHeld()V\" since=\"8\" deprecated=\"15\" removed=\"17\"/>\n\t\t<method name=\"enablePlatformNotifications()V\" deprecated=\"15\" removed=\"17\"/>\n\t\t<method name=\"enableSlowWholeDocumentDraw()V\" since=\"21\"/>\n\t\t<method name=\"evaluateJavascript(Ljava/lang/String;Landroid/webkit/ValueCallback;)V\" since=\"19\"/>\n\t\t<method name=\"findAddress(Ljava/lang/String;)Ljava/lang/String;\" deprecated=\"28\"/>\n\t\t<method name=\"findAll(Ljava/lang/String;)I\" since=\"3\" deprecated=\"16\"/>\n\t\t<method name=\"findAllAsync(Ljava/lang/String;)V\" since=\"16\"/>\n\t\t<method name=\"findNext(Z)V\" since=\"3\"/>\n\t\t<method name=\"flingScroll(II)V\"/>\n\t\t<method name=\"freeMemory()V\" since=\"7\" deprecated=\"19\"/>\n\t\t<method name=\"getCertificate()Landroid/net/http/SslCertificate;\"/>\n\t\t<method name=\"getContentHeight()I\"/>\n\t\t<method name=\"getCurrentWebViewPackage()Landroid/content/pm/PackageInfo;\" since=\"26\"/>\n\t\t<method name=\"getFavicon()Landroid/graphics/Bitmap;\"/>\n\t\t<method name=\"getHitTestResult()Landroid/webkit/WebView$HitTestResult;\"/>\n\t\t<method name=\"getHttpAuthUsernamePassword(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;\" deprecated=\"26\"/>\n\t\t<method name=\"getOriginalUrl()Ljava/lang/String;\" since=\"3\"/>\n\t\t<method name=\"getPluginList()Landroid/webkit/PluginList;\" removed=\"12\"/>\n\t\t<method name=\"getProgress()I\"/>\n\t\t<method name=\"getRendererPriorityWaivedWhenNotVisible()Z\" since=\"26\"/>\n\t\t<method name=\"getRendererRequestedPriority()I\" since=\"26\"/>\n\t\t<method name=\"getSafeBrowsingPrivacyPolicyUrl()Landroid/net/Uri;\" since=\"27\"/>\n\t\t<method name=\"getScale()F\" deprecated=\"17\"/>\n\t\t<method name=\"getSettings()Landroid/webkit/WebSettings;\"/>\n\t\t<method name=\"getTextClassifier()Landroid/view/textclassifier/TextClassifier;\" since=\"27\"/>\n\t\t<method name=\"getTitle()Ljava/lang/String;\"/>\n\t\t<method name=\"getUrl()Ljava/lang/String;\"/>\n\t\t<method name=\"getVisibleTitleHeight()I\" since=\"11\" deprecated=\"15\" removed=\"17\"/>\n\t\t<method name=\"getWebChromeClient()Landroid/webkit/WebChromeClient;\" since=\"26\"/>\n\t\t<method name=\"getWebViewClassLoader()Ljava/lang/ClassLoader;\" since=\"28\"/>\n\t\t<method name=\"getWebViewClient()Landroid/webkit/WebViewClient;\" since=\"26\"/>\n\t\t<method name=\"getWebViewLooper()Landroid/os/Looper;\" since=\"28\"/>\n\t\t<method name=\"getWebViewRenderProcess()Landroid/webkit/WebViewRenderProcess;\" since=\"29\"/>\n\t\t<method name=\"getWebViewRenderProcessClient()Landroid/webkit/WebViewRenderProcessClient;\" since=\"29\"/>\n\t\t<method name=\"getZoomControls()Landroid/view/View;\" deprecated=\"15\" removed=\"16\"/>\n\t\t<method name=\"goBack()V\"/>\n\t\t<method name=\"goBackOrForward(I)V\"/>\n\t\t<method name=\"goForward()V\"/>\n\t\t<method name=\"invokeZoomPicker()V\"/>\n\t\t<method name=\"isPrivateBrowsingEnabled()Z\" since=\"11\"/>\n\t\t<method name=\"loadData(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"loadDataWithBaseURL(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"loadUrl(Ljava/lang/String;)V\"/>\n\t\t<method name=\"loadUrl(Ljava/lang/String;Ljava/util/Map;)V\" since=\"8\"/>\n\t\t<method name=\"onPause()V\" since=\"11\"/>\n\t\t<method name=\"onResume()V\" since=\"11\"/>\n\t\t<method name=\"overlayHorizontalScrollbar()Z\" deprecated=\"23\"/>\n\t\t<method name=\"overlayVerticalScrollbar()Z\" deprecated=\"23\"/>\n\t\t<method name=\"pageDown(Z)Z\"/>\n\t\t<method name=\"pageUp(Z)Z\"/>\n\t\t<method name=\"pauseTimers()V\"/>\n\t\t<method name=\"postUrl(Ljava/lang/String;[B)V\" since=\"5\"/>\n\t\t<method name=\"postVisualStateCallback(JLandroid/webkit/WebView$VisualStateCallback;)V\" since=\"23\"/>\n\t\t<method name=\"postWebMessage(Landroid/webkit/WebMessage;Landroid/net/Uri;)V\" since=\"23\"/>\n\t\t<method name=\"refreshPlugins(Z)V\" removed=\"12\"/>\n\t\t<method name=\"reload()V\"/>\n\t\t<method name=\"removeJavascriptInterface(Ljava/lang/String;)V\" since=\"11\"/>\n\t\t<method name=\"requestFocusNodeHref(Landroid/os/Message;)V\"/>\n\t\t<method name=\"requestImageRef(Landroid/os/Message;)V\"/>\n\t\t<method name=\"restorePicture(Landroid/os/Bundle;Ljava/io/File;)Z\" since=\"3\" deprecated=\"15\" removed=\"17\"/>\n\t\t<method name=\"restoreState(Landroid/os/Bundle;)Landroid/webkit/WebBackForwardList;\"/>\n\t\t<method name=\"resumeTimers()V\"/>\n\t\t<method name=\"savePassword(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"18\"/>\n\t\t<method name=\"savePicture(Landroid/os/Bundle;Ljava/io/File;)Z\" since=\"3\" deprecated=\"15\" removed=\"17\"/>\n\t\t<method name=\"saveState(Landroid/os/Bundle;)Landroid/webkit/WebBackForwardList;\"/>\n\t\t<method name=\"saveWebArchive(Ljava/lang/String;)V\" since=\"11\"/>\n\t\t<method name=\"saveWebArchive(Ljava/lang/String;ZLandroid/webkit/ValueCallback;)V\" since=\"11\"/>\n\t\t<method name=\"setCertificate(Landroid/net/http/SslCertificate;)V\" deprecated=\"17\"/>\n\t\t<method name=\"setDataDirectorySuffix(Ljava/lang/String;)V\" since=\"28\"/>\n\t\t<method name=\"setDownloadListener(Landroid/webkit/DownloadListener;)V\"/>\n\t\t<method name=\"setFindListener(Landroid/webkit/WebView$FindListener;)V\" since=\"16\"/>\n\t\t<method name=\"setHorizontalScrollbarOverlay(Z)V\" deprecated=\"23\"/>\n\t\t<method name=\"setHttpAuthUsernamePassword(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"26\"/>\n\t\t<method name=\"setInitialScale(I)V\"/>\n\t\t<method name=\"setMapTrackballToArrowKeys(Z)V\" deprecated=\"17\"/>\n\t\t<method name=\"setNetworkAvailable(Z)V\" since=\"3\"/>\n\t\t<method name=\"setPictureListener(Landroid/webkit/WebView$PictureListener;)V\" deprecated=\"15\"/>\n\t\t<method name=\"setRendererPriorityPolicy(IZ)V\" since=\"26\"/>\n\t\t<method name=\"setSafeBrowsingWhitelist(Ljava/util/List;Landroid/webkit/ValueCallback;)V\" since=\"27\"/>\n\t\t<method name=\"setTextClassifier(Landroid/view/textclassifier/TextClassifier;)V\" since=\"27\"/>\n\t\t<method name=\"setVerticalScrollbarOverlay(Z)V\" deprecated=\"23\"/>\n\t\t<method name=\"setWebChromeClient(Landroid/webkit/WebChromeClient;)V\"/>\n\t\t<method name=\"setWebContentsDebuggingEnabled(Z)V\" since=\"19\"/>\n\t\t<method name=\"setWebViewClient(Landroid/webkit/WebViewClient;)V\"/>\n\t\t<method name=\"setWebViewRenderProcessClient(Landroid/webkit/WebViewRenderProcessClient;)V\" since=\"29\"/>\n\t\t<method name=\"setWebViewRenderProcessClient(Ljava/util/concurrent/Executor;Landroid/webkit/WebViewRenderProcessClient;)V\" since=\"29\"/>\n\t\t<method name=\"showFindDialog(Ljava/lang/String;Z)Z\" since=\"11\" deprecated=\"18\"/>\n\t\t<method name=\"startSafeBrowsing(Landroid/content/Context;Landroid/webkit/ValueCallback;)V\" since=\"27\"/>\n\t\t<method name=\"stopLoading()V\"/>\n\t\t<method name=\"zoomBy(F)V\" since=\"21\"/>\n\t\t<method name=\"zoomIn()Z\"/>\n\t\t<method name=\"zoomOut()Z\"/>\n\t\t<field name=\"RENDERER_PRIORITY_BOUND\" since=\"26\"/>\n\t\t<field name=\"RENDERER_PRIORITY_IMPORTANT\" since=\"26\"/>\n\t\t<field name=\"RENDERER_PRIORITY_WAIVED\" since=\"26\"/>\n\t\t<field name=\"SCHEME_GEO\"/>\n\t\t<field name=\"SCHEME_MAILTO\"/>\n\t\t<field name=\"SCHEME_TEL\"/>\n\t</class>\n\t<class name=\"android/webkit/WebView$FindListener\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onFindResultReceived(IIZ)V\"/>\n\t</class>\n\t<class name=\"android/webkit/WebView$HitTestResult\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getExtra()Ljava/lang/String;\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<field name=\"ANCHOR_TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"EDIT_TEXT_TYPE\"/>\n\t\t<field name=\"EMAIL_TYPE\"/>\n\t\t<field name=\"GEO_TYPE\"/>\n\t\t<field name=\"IMAGE_ANCHOR_TYPE\" deprecated=\"15\"/>\n\t\t<field name=\"IMAGE_TYPE\"/>\n\t\t<field name=\"PHONE_TYPE\"/>\n\t\t<field name=\"SRC_ANCHOR_TYPE\"/>\n\t\t<field name=\"SRC_IMAGE_ANCHOR_TYPE\"/>\n\t\t<field name=\"UNKNOWN_TYPE\"/>\n\t</class>\n\t<class name=\"android/webkit/WebView$PictureListener\" since=\"1\" deprecated=\"12\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onNewPicture(Landroid/webkit/WebView;Landroid/graphics/Picture;)V\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"android/webkit/WebView$VisualStateCallback\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onComplete(J)V\"/>\n\t</class>\n\t<class name=\"android/webkit/WebView$WebViewTransport\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/webkit/WebView;)V\"/>\n\t\t<method name=\"getWebView()Landroid/webkit/WebView;\"/>\n\t\t<method name=\"setWebView(Landroid/webkit/WebView;)V\"/>\n\t</class>\n\t<class name=\"android/webkit/WebViewClient\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"doUpdateVisitedHistory(Landroid/webkit/WebView;Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"onFormResubmission(Landroid/webkit/WebView;Landroid/os/Message;Landroid/os/Message;)V\"/>\n\t\t<method name=\"onLoadResource(Landroid/webkit/WebView;Ljava/lang/String;)V\"/>\n\t\t<method name=\"onPageCommitVisible(Landroid/webkit/WebView;Ljava/lang/String;)V\" since=\"23\"/>\n\t\t<method name=\"onPageFinished(Landroid/webkit/WebView;Ljava/lang/String;)V\"/>\n\t\t<method name=\"onPageStarted(Landroid/webkit/WebView;Ljava/lang/String;Landroid/graphics/Bitmap;)V\"/>\n\t\t<method name=\"onReceivedClientCertRequest(Landroid/webkit/WebView;Landroid/webkit/ClientCertRequest;)V\" since=\"21\"/>\n\t\t<method name=\"onReceivedError(Landroid/webkit/WebView;ILjava/lang/String;Ljava/lang/String;)V\" deprecated=\"23\"/>\n\t\t<method name=\"onReceivedError(Landroid/webkit/WebView;Landroid/webkit/WebResourceRequest;Landroid/webkit/WebResourceError;)V\" since=\"23\"/>\n\t\t<method name=\"onReceivedHttpAuthRequest(Landroid/webkit/WebView;Landroid/webkit/HttpAuthHandler;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"onReceivedHttpError(Landroid/webkit/WebView;Landroid/webkit/WebResourceRequest;Landroid/webkit/WebResourceResponse;)V\" since=\"23\"/>\n\t\t<method name=\"onReceivedLoginRequest(Landroid/webkit/WebView;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\" since=\"12\"/>\n\t\t<method name=\"onReceivedSslError(Landroid/webkit/WebView;Landroid/webkit/SslErrorHandler;Landroid/net/http/SslError;)V\" since=\"8\"/>\n\t\t<method name=\"onRenderProcessGone(Landroid/webkit/WebView;Landroid/webkit/RenderProcessGoneDetail;)Z\" since=\"26\"/>\n\t\t<method name=\"onSafeBrowsingHit(Landroid/webkit/WebView;Landroid/webkit/WebResourceRequest;ILandroid/webkit/SafeBrowsingResponse;)V\" since=\"27\"/>\n\t\t<method name=\"onScaleChanged(Landroid/webkit/WebView;FF)V\"/>\n\t\t<method name=\"onTooManyRedirects(Landroid/webkit/WebView;Landroid/os/Message;Landroid/os/Message;)V\" deprecated=\"15\"/>\n\t\t<method name=\"onUnhandledInputEvent(Landroid/webkit/WebView;Landroid/view/InputEvent;)V\" since=\"21\" removed=\"24\"/>\n\t\t<method name=\"onUnhandledKeyEvent(Landroid/webkit/WebView;Landroid/view/KeyEvent;)V\" deprecated=\"21\"/>\n\t\t<method name=\"shouldInterceptRequest(Landroid/webkit/WebView;Landroid/webkit/WebResourceRequest;)Landroid/webkit/WebResourceResponse;\" since=\"21\"/>\n\t\t<method name=\"shouldInterceptRequest(Landroid/webkit/WebView;Ljava/lang/String;)Landroid/webkit/WebResourceResponse;\" since=\"11\" deprecated=\"21\"/>\n\t\t<method name=\"shouldOverrideKeyEvent(Landroid/webkit/WebView;Landroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"shouldOverrideUrlLoading(Landroid/webkit/WebView;Landroid/webkit/WebResourceRequest;)Z\" since=\"24\"/>\n\t\t<method name=\"shouldOverrideUrlLoading(Landroid/webkit/WebView;Ljava/lang/String;)Z\" deprecated=\"24\"/>\n\t\t<field name=\"ERROR_AUTHENTICATION\" since=\"5\"/>\n\t\t<field name=\"ERROR_BAD_URL\" since=\"5\"/>\n\t\t<field name=\"ERROR_CONNECT\" since=\"5\"/>\n\t\t<field name=\"ERROR_FAILED_SSL_HANDSHAKE\" since=\"5\"/>\n\t\t<field name=\"ERROR_FILE\" since=\"5\"/>\n\t\t<field name=\"ERROR_FILE_NOT_FOUND\" since=\"5\"/>\n\t\t<field name=\"ERROR_HOST_LOOKUP\" since=\"5\"/>\n\t\t<field name=\"ERROR_IO\" since=\"5\"/>\n\t\t<field name=\"ERROR_PROXY_AUTHENTICATION\" since=\"5\"/>\n\t\t<field name=\"ERROR_REDIRECT_LOOP\" since=\"5\"/>\n\t\t<field name=\"ERROR_TIMEOUT\" since=\"5\"/>\n\t\t<field name=\"ERROR_TOO_MANY_REQUESTS\" since=\"5\"/>\n\t\t<field name=\"ERROR_UNKNOWN\" since=\"5\"/>\n\t\t<field name=\"ERROR_UNSAFE_RESOURCE\" since=\"26\"/>\n\t\t<field name=\"ERROR_UNSUPPORTED_AUTH_SCHEME\" since=\"5\"/>\n\t\t<field name=\"ERROR_UNSUPPORTED_SCHEME\" since=\"5\"/>\n\t\t<field name=\"SAFE_BROWSING_THREAT_BILLING\" since=\"29\"/>\n\t\t<field name=\"SAFE_BROWSING_THREAT_MALWARE\" since=\"27\"/>\n\t\t<field name=\"SAFE_BROWSING_THREAT_PHISHING\" since=\"27\"/>\n\t\t<field name=\"SAFE_BROWSING_THREAT_UNKNOWN\" since=\"27\"/>\n\t\t<field name=\"SAFE_BROWSING_THREAT_UNWANTED_SOFTWARE\" since=\"27\"/>\n\t</class>\n\t<class name=\"android/webkit/WebViewDatabase\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" since=\"22\" deprecated=\"29\"/>\n\t\t<method name=\"clearFormData()V\" deprecated=\"26\"/>\n\t\t<method name=\"clearHttpAuthUsernamePassword()V\"/>\n\t\t<method name=\"clearUsernamePassword()V\" deprecated=\"18\"/>\n\t\t<method name=\"getHttpAuthUsernamePassword(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getInstance(Landroid/content/Context;)Landroid/webkit/WebViewDatabase;\"/>\n\t\t<method name=\"hasFormData()Z\" deprecated=\"26\"/>\n\t\t<method name=\"hasHttpAuthUsernamePassword()Z\"/>\n\t\t<method name=\"hasUsernamePassword()Z\" deprecated=\"18\"/>\n\t\t<method name=\"setHttpAuthUsernamePassword(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\" since=\"26\"/>\n\t\t<field name=\"LOGTAG\" removed=\"17\"/>\n\t</class>\n\t<class name=\"android/webkit/WebViewFragment\" since=\"11\" deprecated=\"28\">\n\t\t<extends name=\"android/app/Fragment\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"getWebView()Landroid/webkit/WebView;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/webkit/WebViewRenderProcess\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"terminate()Z\"/>\n\t</class>\n\t<class name=\"android/webkit/WebViewRenderProcessClient\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onRenderProcessResponsive(Landroid/webkit/WebView;Landroid/webkit/WebViewRenderProcess;)V\"/>\n\t\t<method name=\"onRenderProcessUnresponsive(Landroid/webkit/WebView;Landroid/webkit/WebViewRenderProcess;)V\"/>\n\t</class>\n\t<class name=\"android/widget/AbsListView\" since=\"1\">\n\t\t<extends name=\"android/widget/AdapterView\"/>\n\t\t<implements name=\"android/text/TextWatcher\"/>\n\t\t<implements name=\"android/view/ViewTreeObserver$OnGlobalLayoutListener\"/>\n\t\t<implements name=\"android/view/ViewTreeObserver$OnTouchModeChangeListener\"/>\n\t\t<implements name=\"android/widget/Filter$FilterListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"canScrollList(I)Z\" since=\"19\"/>\n\t\t<method name=\"clearChoices()V\" since=\"11\"/>\n\t\t<method name=\"clearTextFilter()V\"/>\n\t\t<method name=\"deferNotifyDataSetChanged()V\" since=\"14\"/>\n\t\t<method name=\"fling(I)V\" since=\"21\"/>\n\t\t<method name=\"generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/AbsListView$LayoutParams;\"/>\n\t\t<method name=\"getBottomEdgeEffectColor()I\" since=\"29\"/>\n\t\t<method name=\"getCacheColorHint()I\"/>\n\t\t<method name=\"getCheckedItemCount()I\" since=\"11\"/>\n\t\t<method name=\"getCheckedItemIds()[J\" since=\"11\"/>\n\t\t<method name=\"getCheckedItemPosition()I\" since=\"11\"/>\n\t\t<method name=\"getCheckedItemPositions()Landroid/util/SparseBooleanArray;\" since=\"11\"/>\n\t\t<method name=\"getChoiceMode()I\" since=\"11\"/>\n\t\t<method name=\"getListPaddingBottom()I\"/>\n\t\t<method name=\"getListPaddingLeft()I\"/>\n\t\t<method name=\"getListPaddingRight()I\"/>\n\t\t<method name=\"getListPaddingTop()I\"/>\n\t\t<method name=\"getSelector()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getTextFilter()Ljava/lang/CharSequence;\" since=\"3\"/>\n\t\t<method name=\"getTopEdgeEffectColor()I\" since=\"29\"/>\n\t\t<method name=\"getTranscriptMode()I\"/>\n\t\t<method name=\"handleDataChanged()V\"/>\n\t\t<method name=\"hasTextFilter()Z\"/>\n\t\t<method name=\"invalidateViews()V\"/>\n\t\t<method name=\"isDrawSelectorOnTop()Z\" since=\"29\"/>\n\t\t<method name=\"isFastScrollAlwaysVisible()Z\" since=\"11\"/>\n\t\t<method name=\"isFastScrollEnabled()Z\" since=\"3\"/>\n\t\t<method name=\"isInFilterMode()Z\"/>\n\t\t<method name=\"isItemChecked(I)Z\" since=\"11\"/>\n\t\t<method name=\"isScrollingCacheEnabled()Z\"/>\n\t\t<method name=\"isSmoothScrollbarEnabled()Z\" since=\"3\"/>\n\t\t<method name=\"isStackFromBottom()Z\"/>\n\t\t<method name=\"isTextFilterEnabled()Z\"/>\n\t\t<method name=\"layoutChildren()V\"/>\n\t\t<method name=\"onInitializeAccessibilityNodeInfoForItem(Landroid/view/View;ILandroid/view/accessibility/AccessibilityNodeInfo;)V\" since=\"19\"/>\n\t\t<method name=\"onRemoteAdapterConnected()Z\" since=\"11\"/>\n\t\t<method name=\"onRemoteAdapterDisconnected()V\" since=\"11\"/>\n\t\t<method name=\"pointToPosition(II)I\"/>\n\t\t<method name=\"pointToRowId(II)J\"/>\n\t\t<method name=\"reclaimViews(Ljava/util/List;)V\"/>\n\t\t<method name=\"scrollListBy(I)V\" since=\"19\"/>\n\t\t<method name=\"setAdapter(Landroid/widget/ListAdapter;)V\" since=\"11\"/>\n\t\t<method name=\"setBottomEdgeEffectColor(I)V\" since=\"29\"/>\n\t\t<method name=\"setCacheColorHint(I)V\"/>\n\t\t<method name=\"setChoiceMode(I)V\" since=\"11\"/>\n\t\t<method name=\"setDrawSelectorOnTop(Z)V\"/>\n\t\t<method name=\"setEdgeEffectColor(I)V\" since=\"29\"/>\n\t\t<method name=\"setFastScrollAlwaysVisible(Z)V\" since=\"11\"/>\n\t\t<method name=\"setFastScrollEnabled(Z)V\" since=\"3\"/>\n\t\t<method name=\"setFastScrollStyle(I)V\" since=\"21\"/>\n\t\t<method name=\"setFilterText(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setFriction(F)V\" since=\"11\"/>\n\t\t<method name=\"setItemChecked(IZ)V\" since=\"11\"/>\n\t\t<method name=\"setMultiChoiceModeListener(Landroid/widget/AbsListView$MultiChoiceModeListener;)V\" since=\"11\"/>\n\t\t<method name=\"setOnScrollListener(Landroid/widget/AbsListView$OnScrollListener;)V\"/>\n\t\t<method name=\"setRecyclerListener(Landroid/widget/AbsListView$RecyclerListener;)V\"/>\n\t\t<method name=\"setRemoteViewsAdapter(Landroid/content/Intent;)V\" since=\"11\"/>\n\t\t<method name=\"setScrollIndicators(Landroid/view/View;Landroid/view/View;)V\"/>\n\t\t<method name=\"setScrollingCacheEnabled(Z)V\"/>\n\t\t<method name=\"setSelectionFromTop(II)V\" since=\"21\"/>\n\t\t<method name=\"setSelector(I)V\"/>\n\t\t<method name=\"setSelector(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setSmoothScrollbarEnabled(Z)V\" since=\"3\"/>\n\t\t<method name=\"setStackFromBottom(Z)V\"/>\n\t\t<method name=\"setTextFilterEnabled(Z)V\"/>\n\t\t<method name=\"setTopEdgeEffectColor(I)V\" since=\"29\"/>\n\t\t<method name=\"setTranscriptMode(I)V\"/>\n\t\t<method name=\"setVelocityScale(F)V\" since=\"11\"/>\n\t\t<method name=\"smoothScrollBy(II)V\" since=\"8\"/>\n\t\t<method name=\"smoothScrollToPosition(I)V\" since=\"8\"/>\n\t\t<method name=\"smoothScrollToPosition(II)V\" since=\"8\"/>\n\t\t<method name=\"smoothScrollToPositionFromTop(II)V\" since=\"11\"/>\n\t\t<method name=\"smoothScrollToPositionFromTop(III)V\" since=\"11\"/>\n\t\t<field name=\"CHOICE_MODE_MULTIPLE\" since=\"11\"/>\n\t\t<field name=\"CHOICE_MODE_MULTIPLE_MODAL\" since=\"11\"/>\n\t\t<field name=\"CHOICE_MODE_NONE\" since=\"11\"/>\n\t\t<field name=\"CHOICE_MODE_SINGLE\" since=\"11\"/>\n\t\t<field name=\"TRANSCRIPT_MODE_ALWAYS_SCROLL\"/>\n\t\t<field name=\"TRANSCRIPT_MODE_DISABLED\"/>\n\t\t<field name=\"TRANSCRIPT_MODE_NORMAL\"/>\n\t</class>\n\t<class name=\"android/widget/AbsListView$LayoutParams\" since=\"1\">\n\t\t<extends name=\"android/view/ViewGroup$LayoutParams\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t</class>\n\t<class name=\"android/widget/AbsListView$MultiChoiceModeListener\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/view/ActionMode$Callback\"/>\n\t\t<method name=\"onItemCheckedStateChanged(Landroid/view/ActionMode;IJZ)V\"/>\n\t</class>\n\t<class name=\"android/widget/AbsListView$OnScrollListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onScroll(Landroid/widget/AbsListView;III)V\"/>\n\t\t<method name=\"onScrollStateChanged(Landroid/widget/AbsListView;I)V\"/>\n\t\t<field name=\"SCROLL_STATE_FLING\"/>\n\t\t<field name=\"SCROLL_STATE_IDLE\"/>\n\t\t<field name=\"SCROLL_STATE_TOUCH_SCROLL\"/>\n\t</class>\n\t<class name=\"android/widget/AbsListView$RecyclerListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onMovedToScrapHeap(Landroid/view/View;)V\"/>\n\t</class>\n\t<class name=\"android/widget/AbsListView$SelectionBoundsAdjuster\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"adjustListItemSelectionBounds(Landroid/graphics/Rect;)V\"/>\n\t</class>\n\t<class name=\"android/widget/AbsSeekBar\" since=\"1\">\n\t\t<extends name=\"android/widget/ProgressBar\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"getKeyProgressIncrement()I\" since=\"3\"/>\n\t\t<method name=\"getSplitTrack()Z\" since=\"21\"/>\n\t\t<method name=\"getThumb()Landroid/graphics/drawable/Drawable;\" since=\"16\"/>\n\t\t<method name=\"getThumbOffset()I\"/>\n\t\t<method name=\"getThumbTintBlendMode()Landroid/graphics/BlendMode;\" since=\"29\"/>\n\t\t<method name=\"getThumbTintList()Landroid/content/res/ColorStateList;\" since=\"21\"/>\n\t\t<method name=\"getThumbTintMode()Landroid/graphics/PorterDuff$Mode;\" since=\"21\"/>\n\t\t<method name=\"getTickMark()Landroid/graphics/drawable/Drawable;\" since=\"24\"/>\n\t\t<method name=\"getTickMarkTintBlendMode()Landroid/graphics/BlendMode;\" since=\"29\"/>\n\t\t<method name=\"getTickMarkTintList()Landroid/content/res/ColorStateList;\" since=\"24\"/>\n\t\t<method name=\"getTickMarkTintMode()Landroid/graphics/PorterDuff$Mode;\" since=\"24\"/>\n\t\t<method name=\"setKeyProgressIncrement(I)V\" since=\"3\"/>\n\t\t<method name=\"setSplitTrack(Z)V\" since=\"21\"/>\n\t\t<method name=\"setThumb(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setThumbOffset(I)V\"/>\n\t\t<method name=\"setThumbTintBlendMode(Landroid/graphics/BlendMode;)V\" since=\"29\"/>\n\t\t<method name=\"setThumbTintList(Landroid/content/res/ColorStateList;)V\" since=\"21\"/>\n\t\t<method name=\"setThumbTintMode(Landroid/graphics/PorterDuff$Mode;)V\" since=\"21\"/>\n\t\t<method name=\"setTickMark(Landroid/graphics/drawable/Drawable;)V\" since=\"24\"/>\n\t\t<method name=\"setTickMarkTintBlendMode(Landroid/graphics/BlendMode;)V\" since=\"29\"/>\n\t\t<method name=\"setTickMarkTintList(Landroid/content/res/ColorStateList;)V\" since=\"24\"/>\n\t\t<method name=\"setTickMarkTintMode(Landroid/graphics/PorterDuff$Mode;)V\" since=\"24\"/>\n\t</class>\n\t<class name=\"android/widget/AbsSpinner\" since=\"1\">\n\t\t<extends name=\"android/widget/AdapterView\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"getAdapter()Landroid/widget/SpinnerAdapter;\"/>\n\t\t<method name=\"pointToPosition(II)I\"/>\n\t\t<method name=\"setAdapter(Landroid/widget/SpinnerAdapter;)V\"/>\n\t\t<method name=\"setSelection(IZ)V\"/>\n\t</class>\n\t<class name=\"android/widget/AbsoluteLayout\" since=\"1\" deprecated=\"3\">\n\t\t<extends name=\"android/view/ViewGroup\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/widget/AbsoluteLayout$LayoutParams\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"android/view/ViewGroup$LayoutParams\"/>\n\t\t<method name=\"&lt;init>(IIII)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V\" deprecated=\"29\"/>\n\t\t<method name=\"debug(Ljava/lang/String;)Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<field name=\"x\" deprecated=\"29\"/>\n\t\t<field name=\"y\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/widget/ActionMenuView\" since=\"21\">\n\t\t<extends name=\"android/widget/LinearLayout\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"dismissPopupMenus()V\"/>\n\t\t<method name=\"generateDefaultLayoutParams()Landroid/widget/ActionMenuView$LayoutParams;\"/>\n\t\t<method name=\"generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/ActionMenuView$LayoutParams;\"/>\n\t\t<method name=\"generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/widget/ActionMenuView$LayoutParams;\"/>\n\t\t<method name=\"getMenu()Landroid/view/Menu;\"/>\n\t\t<method name=\"getOverflowIcon()Landroid/graphics/drawable/Drawable;\" since=\"23\"/>\n\t\t<method name=\"getPopupTheme()I\"/>\n\t\t<method name=\"hideOverflowMenu()Z\"/>\n\t\t<method name=\"isOverflowMenuShowing()Z\"/>\n\t\t<method name=\"setOnMenuItemClickListener(Landroid/widget/ActionMenuView$OnMenuItemClickListener;)V\"/>\n\t\t<method name=\"setOverflowIcon(Landroid/graphics/drawable/Drawable;)V\" since=\"23\"/>\n\t\t<method name=\"setPopupTheme(I)V\"/>\n\t\t<method name=\"showOverflowMenu()Z\"/>\n\t</class>\n\t<class name=\"android/widget/ActionMenuView$LayoutParams\" since=\"21\">\n\t\t<extends name=\"android/widget/LinearLayout$LayoutParams\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/widget/ActionMenuView$LayoutParams;)V\"/>\n\t</class>\n\t<class name=\"android/widget/ActionMenuView$OnMenuItemClickListener\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onMenuItemClick(Landroid/view/MenuItem;)Z\"/>\n\t</class>\n\t<class name=\"android/widget/Adapter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAutofillOptions()[Ljava/lang/CharSequence;\" since=\"26\"/>\n\t\t<method name=\"getCount()I\"/>\n\t\t<method name=\"getItem(I)Ljava/lang/Object;\"/>\n\t\t<method name=\"getItemId(I)J\"/>\n\t\t<method name=\"getItemViewType(I)I\"/>\n\t\t<method name=\"getView(ILandroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View;\"/>\n\t\t<method name=\"getViewTypeCount()I\"/>\n\t\t<method name=\"hasStableIds()Z\"/>\n\t\t<method name=\"isEmpty()Z\"/>\n\t\t<method name=\"registerDataSetObserver(Landroid/database/DataSetObserver;)V\"/>\n\t\t<method name=\"unregisterDataSetObserver(Landroid/database/DataSetObserver;)V\"/>\n\t\t<field name=\"IGNORE_ITEM_VIEW_TYPE\"/>\n\t\t<field name=\"NO_SELECTION\"/>\n\t</class>\n\t<class name=\"android/widget/AdapterView\" since=\"1\">\n\t\t<extends name=\"android/view/ViewGroup\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"getAdapter()Landroid/widget/Adapter;\"/>\n\t\t<method name=\"getCount()I\"/>\n\t\t<method name=\"getEmptyView()Landroid/view/View;\"/>\n\t\t<method name=\"getFirstVisiblePosition()I\"/>\n\t\t<method name=\"getItemAtPosition(I)Ljava/lang/Object;\"/>\n\t\t<method name=\"getItemIdAtPosition(I)J\"/>\n\t\t<method name=\"getLastVisiblePosition()I\"/>\n\t\t<method name=\"getOnItemClickListener()Landroid/widget/AdapterView$OnItemClickListener;\"/>\n\t\t<method name=\"getOnItemLongClickListener()Landroid/widget/AdapterView$OnItemLongClickListener;\"/>\n\t\t<method name=\"getOnItemSelectedListener()Landroid/widget/AdapterView$OnItemSelectedListener;\"/>\n\t\t<method name=\"getPositionForView(Landroid/view/View;)I\"/>\n\t\t<method name=\"getSelectedItem()Ljava/lang/Object;\"/>\n\t\t<method name=\"getSelectedItemId()J\"/>\n\t\t<method name=\"getSelectedItemPosition()I\"/>\n\t\t<method name=\"getSelectedView()Landroid/view/View;\"/>\n\t\t<method name=\"performItemClick(Landroid/view/View;IJ)Z\"/>\n\t\t<method name=\"setAdapter(Landroid/widget/Adapter;)V\"/>\n\t\t<method name=\"setEmptyView(Landroid/view/View;)V\"/>\n\t\t<method name=\"setOnItemClickListener(Landroid/widget/AdapterView$OnItemClickListener;)V\"/>\n\t\t<method name=\"setOnItemLongClickListener(Landroid/widget/AdapterView$OnItemLongClickListener;)V\"/>\n\t\t<method name=\"setOnItemSelectedListener(Landroid/widget/AdapterView$OnItemSelectedListener;)V\"/>\n\t\t<method name=\"setSelection(I)V\"/>\n\t\t<field name=\"INVALID_POSITION\"/>\n\t\t<field name=\"INVALID_ROW_ID\"/>\n\t\t<field name=\"ITEM_VIEW_TYPE_HEADER_OR_FOOTER\"/>\n\t\t<field name=\"ITEM_VIEW_TYPE_IGNORE\"/>\n\t</class>\n\t<class name=\"android/widget/AdapterView$AdapterContextMenuInfo\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/view/ContextMenu$ContextMenuInfo\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/View;IJ)V\"/>\n\t\t<field name=\"id\"/>\n\t\t<field name=\"position\"/>\n\t\t<field name=\"targetView\"/>\n\t</class>\n\t<class name=\"android/widget/AdapterView$OnItemClickListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onItemClick(Landroid/widget/AdapterView;Landroid/view/View;IJ)V\"/>\n\t</class>\n\t<class name=\"android/widget/AdapterView$OnItemLongClickListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onItemLongClick(Landroid/widget/AdapterView;Landroid/view/View;IJ)Z\"/>\n\t</class>\n\t<class name=\"android/widget/AdapterView$OnItemSelectedListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onItemSelected(Landroid/widget/AdapterView;Landroid/view/View;IJ)V\"/>\n\t\t<method name=\"onNothingSelected(Landroid/widget/AdapterView;)V\"/>\n\t</class>\n\t<class name=\"android/widget/AdapterViewAnimator\" since=\"11\">\n\t\t<extends name=\"android/widget/AdapterView\"/>\n\t\t<implements name=\"android/widget/Advanceable\" since=\"16\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" since=\"14\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"advance()V\"/>\n\t\t<method name=\"deferNotifyDataSetChanged()V\" since=\"14\"/>\n\t\t<method name=\"fyiWillBeAdvancedByHostKThx()V\"/>\n\t\t<method name=\"getCurrentView()Landroid/view/View;\"/>\n\t\t<method name=\"getDisplayedChild()I\"/>\n\t\t<method name=\"getInAnimation()Landroid/animation/ObjectAnimator;\"/>\n\t\t<method name=\"getOutAnimation()Landroid/animation/ObjectAnimator;\"/>\n\t\t<method name=\"onRemoteAdapterConnected()Z\"/>\n\t\t<method name=\"onRemoteAdapterDisconnected()V\"/>\n\t\t<method name=\"setAnimateFirstView(Z)V\"/>\n\t\t<method name=\"setDisplayedChild(I)V\"/>\n\t\t<method name=\"setInAnimation(Landroid/animation/ObjectAnimator;)V\"/>\n\t\t<method name=\"setInAnimation(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"setOutAnimation(Landroid/animation/ObjectAnimator;)V\"/>\n\t\t<method name=\"setOutAnimation(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"setRemoteViewsAdapter(Landroid/content/Intent;)V\"/>\n\t\t<method name=\"showNext()V\"/>\n\t\t<method name=\"showPrevious()V\"/>\n\t</class>\n\t<class name=\"android/widget/AdapterViewFlipper\" since=\"11\">\n\t\t<extends name=\"android/widget/AdapterViewAnimator\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" since=\"21\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"getFlipInterval()I\" since=\"16\"/>\n\t\t<method name=\"isAutoStart()Z\"/>\n\t\t<method name=\"isFlipping()Z\"/>\n\t\t<method name=\"setAutoStart(Z)V\"/>\n\t\t<method name=\"setFlipInterval(I)V\"/>\n\t\t<method name=\"startFlipping()V\"/>\n\t\t<method name=\"stopFlipping()V\"/>\n\t</class>\n\t<class name=\"android/widget/Advanceable\" since=\"16\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"advance()V\"/>\n\t\t<method name=\"fyiWillBeAdvancedByHostKThx()V\"/>\n\t</class>\n\t<class name=\"android/widget/AlphabetIndexer\" since=\"3\">\n\t\t<extends name=\"android/database/DataSetObserver\"/>\n\t\t<implements name=\"android/widget/SectionIndexer\"/>\n\t\t<method name=\"&lt;init>(Landroid/database/Cursor;ILjava/lang/CharSequence;)V\"/>\n\t\t<method name=\"compare(Ljava/lang/String;Ljava/lang/String;)I\"/>\n\t\t<method name=\"setCursor(Landroid/database/Cursor;)V\"/>\n\t\t<field name=\"mAlphabet\"/>\n\t\t<field name=\"mColumnIndex\"/>\n\t\t<field name=\"mDataCursor\"/>\n\t</class>\n\t<class name=\"android/widget/AnalogClock\" since=\"1\" deprecated=\"23\">\n\t\t<extends name=\"android/view/View\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/widget/ArrayAdapter\" since=\"1\">\n\t\t<extends name=\"android/widget/BaseAdapter\"/>\n\t\t<implements name=\"android/widget/Filterable\"/>\n\t\t<implements name=\"android/widget/ThemedSpinnerAdapter\" since=\"23\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;II)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;IILjava/util/List;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;II[Ljava/lang/Object;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;ILjava/util/List;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;I[Ljava/lang/Object;)V\"/>\n\t\t<method name=\"add(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"addAll(Ljava/util/Collection;)V\" since=\"11\"/>\n\t\t<method name=\"addAll([Ljava/lang/Object;)V\" since=\"11\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"createFromResource(Landroid/content/Context;II)Landroid/widget/ArrayAdapter;\"/>\n\t\t<method name=\"getContext()Landroid/content/Context;\"/>\n\t\t<method name=\"getPosition(Ljava/lang/Object;)I\"/>\n\t\t<method name=\"insert(Ljava/lang/Object;I)V\"/>\n\t\t<method name=\"remove(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"setDropDownViewResource(I)V\"/>\n\t\t<method name=\"setNotifyOnChange(Z)V\"/>\n\t\t<method name=\"sort(Ljava/util/Comparator;)V\" since=\"3\"/>\n\t</class>\n\t<class name=\"android/widget/AutoCompleteTextView\" since=\"1\">\n\t\t<extends name=\"android/widget/EditText\"/>\n\t\t<implements name=\"android/widget/Filter$FilterListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;IILandroid/content/res/Resources$Theme;)V\" since=\"24\"/>\n\t\t<method name=\"clearListSelection()V\" since=\"3\"/>\n\t\t<method name=\"convertSelectionToString(Ljava/lang/Object;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"dismissDropDown()V\"/>\n\t\t<method name=\"enoughToFilter()Z\"/>\n\t\t<method name=\"getAdapter()Landroid/widget/ListAdapter;\"/>\n\t\t<method name=\"getCompletionHint()Ljava/lang/CharSequence;\" since=\"16\"/>\n\t\t<method name=\"getDropDownAnchor()I\" since=\"3\"/>\n\t\t<method name=\"getDropDownBackground()Landroid/graphics/drawable/Drawable;\" since=\"5\"/>\n\t\t<method name=\"getDropDownHeight()I\" since=\"4\"/>\n\t\t<method name=\"getDropDownHorizontalOffset()I\" since=\"5\"/>\n\t\t<method name=\"getDropDownVerticalOffset()I\" since=\"5\"/>\n\t\t<method name=\"getDropDownWidth()I\" since=\"3\"/>\n\t\t<method name=\"getFilter()Landroid/widget/Filter;\"/>\n\t\t<method name=\"getInputMethodMode()I\" since=\"29\"/>\n\t\t<method name=\"getItemClickListener()Landroid/widget/AdapterView$OnItemClickListener;\" deprecated=\"15\"/>\n\t\t<method name=\"getItemSelectedListener()Landroid/widget/AdapterView$OnItemSelectedListener;\" deprecated=\"15\"/>\n\t\t<method name=\"getListSelection()I\" since=\"3\"/>\n\t\t<method name=\"getOnItemClickListener()Landroid/widget/AdapterView$OnItemClickListener;\" since=\"3\"/>\n\t\t<method name=\"getOnItemSelectedListener()Landroid/widget/AdapterView$OnItemSelectedListener;\" since=\"3\"/>\n\t\t<method name=\"getThreshold()I\"/>\n\t\t<method name=\"getValidator()Landroid/widget/AutoCompleteTextView$Validator;\"/>\n\t\t<method name=\"isPerformingCompletion()Z\" since=\"3\"/>\n\t\t<method name=\"isPopupShowing()Z\"/>\n\t\t<method name=\"performCompletion()V\"/>\n\t\t<method name=\"performFiltering(Ljava/lang/CharSequence;I)V\"/>\n\t\t<method name=\"performValidation()V\"/>\n\t\t<method name=\"refreshAutoCompleteResults()V\" since=\"29\"/>\n\t\t<method name=\"replaceText(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setAdapter(Landroid/widget/ListAdapter;)V\"/>\n\t\t<method name=\"setCompletionHint(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setDropDownAnchor(I)V\" since=\"3\"/>\n\t\t<method name=\"setDropDownBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V\" since=\"5\"/>\n\t\t<method name=\"setDropDownBackgroundResource(I)V\" since=\"5\"/>\n\t\t<method name=\"setDropDownHeight(I)V\" since=\"4\"/>\n\t\t<method name=\"setDropDownHorizontalOffset(I)V\" since=\"5\"/>\n\t\t<method name=\"setDropDownVerticalOffset(I)V\" since=\"5\"/>\n\t\t<method name=\"setDropDownWidth(I)V\" since=\"3\"/>\n\t\t<method name=\"setInputMethodMode(I)V\" since=\"29\"/>\n\t\t<method name=\"setListSelection(I)V\" since=\"3\"/>\n\t\t<method name=\"setOnDismissListener(Landroid/widget/AutoCompleteTextView$OnDismissListener;)V\" since=\"17\"/>\n\t\t<method name=\"setOnItemClickListener(Landroid/widget/AdapterView$OnItemClickListener;)V\"/>\n\t\t<method name=\"setOnItemSelectedListener(Landroid/widget/AdapterView$OnItemSelectedListener;)V\"/>\n\t\t<method name=\"setText(Ljava/lang/CharSequence;Z)V\" since=\"17\"/>\n\t\t<method name=\"setThreshold(I)V\"/>\n\t\t<method name=\"setValidator(Landroid/widget/AutoCompleteTextView$Validator;)V\"/>\n\t\t<method name=\"showDropDown()V\"/>\n\t</class>\n\t<class name=\"android/widget/AutoCompleteTextView$OnDismissListener\" since=\"17\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDismiss()V\"/>\n\t</class>\n\t<class name=\"android/widget/AutoCompleteTextView$Validator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"fixText(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"isValid(Ljava/lang/CharSequence;)Z\"/>\n\t</class>\n\t<class name=\"android/widget/BaseAdapter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/widget/ListAdapter\"/>\n\t\t<implements name=\"android/widget/SpinnerAdapter\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"notifyDataSetChanged()V\"/>\n\t\t<method name=\"notifyDataSetInvalidated()V\"/>\n\t\t<method name=\"setAutofillOptions([Ljava/lang/CharSequence;)V\" since=\"27\"/>\n\t</class>\n\t<class name=\"android/widget/BaseExpandableListAdapter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/widget/ExpandableListAdapter\"/>\n\t\t<implements name=\"android/widget/HeterogeneousExpandableList\" since=\"8\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"notifyDataSetChanged()V\"/>\n\t\t<method name=\"notifyDataSetInvalidated()V\"/>\n\t</class>\n\t<class name=\"android/widget/Button\" since=\"1\">\n\t\t<extends name=\"android/widget/TextView\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/widget/CalendarView\" since=\"11\">\n\t\t<extends name=\"android/widget/FrameLayout\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"getDate()J\"/>\n\t\t<method name=\"getDateTextAppearance()I\" since=\"16\"/>\n\t\t<method name=\"getFirstDayOfWeek()I\"/>\n\t\t<method name=\"getFocusedMonthDateColor()I\" since=\"16\" deprecated=\"23\"/>\n\t\t<method name=\"getMaxDate()J\"/>\n\t\t<method name=\"getMinDate()J\"/>\n\t\t<method name=\"getSelectedDateVerticalBar()Landroid/graphics/drawable/Drawable;\" since=\"16\" deprecated=\"23\"/>\n\t\t<method name=\"getSelectedWeekBackgroundColor()I\" since=\"16\" deprecated=\"23\"/>\n\t\t<method name=\"getShowWeekNumber()Z\" deprecated=\"24\"/>\n\t\t<method name=\"getShownWeekCount()I\" since=\"16\" deprecated=\"23\"/>\n\t\t<method name=\"getUnfocusedMonthDateColor()I\" since=\"16\" deprecated=\"23\"/>\n\t\t<method name=\"getWeekDayTextAppearance()I\" since=\"16\"/>\n\t\t<method name=\"getWeekNumberColor()I\" since=\"16\" deprecated=\"23\"/>\n\t\t<method name=\"getWeekSeparatorLineColor()I\" since=\"16\" deprecated=\"23\"/>\n\t\t<method name=\"setDate(J)V\"/>\n\t\t<method name=\"setDate(JZZ)V\"/>\n\t\t<method name=\"setDateTextAppearance(I)V\" since=\"16\"/>\n\t\t<method name=\"setFirstDayOfWeek(I)V\"/>\n\t\t<method name=\"setFocusedMonthDateColor(I)V\" since=\"16\" deprecated=\"23\"/>\n\t\t<method name=\"setMaxDate(J)V\"/>\n\t\t<method name=\"setMinDate(J)V\"/>\n\t\t<method name=\"setOnDateChangeListener(Landroid/widget/CalendarView$OnDateChangeListener;)V\"/>\n\t\t<method name=\"setSelectedDateVerticalBar(I)V\" since=\"16\" deprecated=\"23\"/>\n\t\t<method name=\"setSelectedDateVerticalBar(Landroid/graphics/drawable/Drawable;)V\" since=\"16\" deprecated=\"23\"/>\n\t\t<method name=\"setSelectedWeekBackgroundColor(I)V\" since=\"16\" deprecated=\"23\"/>\n\t\t<method name=\"setShowWeekNumber(Z)V\" deprecated=\"24\"/>\n\t\t<method name=\"setShownWeekCount(I)V\" since=\"16\" deprecated=\"23\"/>\n\t\t<method name=\"setUnfocusedMonthDateColor(I)V\" since=\"16\" deprecated=\"23\"/>\n\t\t<method name=\"setWeekDayTextAppearance(I)V\" since=\"16\"/>\n\t\t<method name=\"setWeekNumberColor(I)V\" since=\"16\" deprecated=\"23\"/>\n\t\t<method name=\"setWeekSeparatorLineColor(I)V\" since=\"16\" deprecated=\"23\"/>\n\t</class>\n\t<class name=\"android/widget/CalendarView$OnDateChangeListener\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onSelectedDayChange(Landroid/widget/CalendarView;III)V\"/>\n\t</class>\n\t<class name=\"android/widget/CheckBox\" since=\"1\">\n\t\t<extends name=\"android/widget/CompoundButton\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/widget/Checkable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"isChecked()Z\"/>\n\t\t<method name=\"setChecked(Z)V\"/>\n\t\t<method name=\"toggle()V\"/>\n\t</class>\n\t<class name=\"android/widget/CheckedTextView\" since=\"1\">\n\t\t<extends name=\"android/widget/TextView\"/>\n\t\t<implements name=\"android/widget/Checkable\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"getCheckMarkDrawable()Landroid/graphics/drawable/Drawable;\" since=\"16\"/>\n\t\t<method name=\"getCheckMarkTintBlendMode()Landroid/graphics/BlendMode;\" since=\"29\"/>\n\t\t<method name=\"getCheckMarkTintList()Landroid/content/res/ColorStateList;\" since=\"21\"/>\n\t\t<method name=\"getCheckMarkTintMode()Landroid/graphics/PorterDuff$Mode;\" since=\"21\"/>\n\t\t<method name=\"onPaddingChanged(I)V\" since=\"16\" removed=\"17\"/>\n\t\t<method name=\"setCheckMarkDrawable(I)V\"/>\n\t\t<method name=\"setCheckMarkDrawable(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setCheckMarkTintBlendMode(Landroid/graphics/BlendMode;)V\" since=\"29\"/>\n\t\t<method name=\"setCheckMarkTintList(Landroid/content/res/ColorStateList;)V\" since=\"21\"/>\n\t\t<method name=\"setCheckMarkTintMode(Landroid/graphics/PorterDuff$Mode;)V\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/widget/Chronometer\" since=\"1\">\n\t\t<extends name=\"android/widget/TextView\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"getBase()J\"/>\n\t\t<method name=\"getFormat()Ljava/lang/String;\"/>\n\t\t<method name=\"getOnChronometerTickListener()Landroid/widget/Chronometer$OnChronometerTickListener;\" since=\"3\"/>\n\t\t<method name=\"isCountDown()Z\" since=\"24\"/>\n\t\t<method name=\"isTheFinalCountDown()Z\" since=\"26\"/>\n\t\t<method name=\"setBase(J)V\"/>\n\t\t<method name=\"setCountDown(Z)V\" since=\"24\"/>\n\t\t<method name=\"setFormat(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setOnChronometerTickListener(Landroid/widget/Chronometer$OnChronometerTickListener;)V\" since=\"3\"/>\n\t\t<method name=\"start()V\"/>\n\t\t<method name=\"stop()V\"/>\n\t</class>\n\t<class name=\"android/widget/Chronometer$OnChronometerTickListener\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onChronometerTick(Landroid/widget/Chronometer;)V\"/>\n\t</class>\n\t<class name=\"android/widget/CompoundButton\" since=\"1\">\n\t\t<extends name=\"android/widget/Button\"/>\n\t\t<implements name=\"android/widget/Checkable\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"getButtonDrawable()Landroid/graphics/drawable/Drawable;\" since=\"23\"/>\n\t\t<method name=\"getButtonTintBlendMode()Landroid/graphics/BlendMode;\" since=\"29\"/>\n\t\t<method name=\"getButtonTintList()Landroid/content/res/ColorStateList;\" since=\"21\"/>\n\t\t<method name=\"getButtonTintMode()Landroid/graphics/PorterDuff$Mode;\" since=\"21\"/>\n\t\t<method name=\"setButtonDrawable(I)V\"/>\n\t\t<method name=\"setButtonDrawable(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setButtonTintBlendMode(Landroid/graphics/BlendMode;)V\" since=\"29\"/>\n\t\t<method name=\"setButtonTintList(Landroid/content/res/ColorStateList;)V\" since=\"21\"/>\n\t\t<method name=\"setButtonTintMode(Landroid/graphics/PorterDuff$Mode;)V\" since=\"21\"/>\n\t\t<method name=\"setOnCheckedChangeListener(Landroid/widget/CompoundButton$OnCheckedChangeListener;)V\"/>\n\t</class>\n\t<class name=\"android/widget/CompoundButton$OnCheckedChangeListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onCheckedChanged(Landroid/widget/CompoundButton;Z)V\"/>\n\t</class>\n\t<class name=\"android/widget/CursorAdapter\" since=\"1\">\n\t\t<extends name=\"android/widget/BaseAdapter\"/>\n\t\t<implements name=\"android/widget/Filterable\"/>\n\t\t<implements name=\"android/widget/ThemedSpinnerAdapter\" since=\"23\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/database/Cursor;)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/database/Cursor;I)V\" since=\"11\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/database/Cursor;Z)V\"/>\n\t\t<method name=\"bindView(Landroid/view/View;Landroid/content/Context;Landroid/database/Cursor;)V\"/>\n\t\t<method name=\"changeCursor(Landroid/database/Cursor;)V\"/>\n\t\t<method name=\"convertToString(Landroid/database/Cursor;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getCursor()Landroid/database/Cursor;\"/>\n\t\t<method name=\"getFilterQueryProvider()Landroid/widget/FilterQueryProvider;\"/>\n\t\t<method name=\"init(Landroid/content/Context;Landroid/database/Cursor;Z)V\" deprecated=\"15\"/>\n\t\t<method name=\"newDropDownView(Landroid/content/Context;Landroid/database/Cursor;Landroid/view/ViewGroup;)Landroid/view/View;\"/>\n\t\t<method name=\"newView(Landroid/content/Context;Landroid/database/Cursor;Landroid/view/ViewGroup;)Landroid/view/View;\"/>\n\t\t<method name=\"onContentChanged()V\" since=\"3\"/>\n\t\t<method name=\"runQueryOnBackgroundThread(Ljava/lang/CharSequence;)Landroid/database/Cursor;\"/>\n\t\t<method name=\"setFilterQueryProvider(Landroid/widget/FilterQueryProvider;)V\"/>\n\t\t<method name=\"swapCursor(Landroid/database/Cursor;)Landroid/database/Cursor;\" since=\"11\"/>\n\t\t<field name=\"FLAG_AUTO_REQUERY\" since=\"11\" deprecated=\"15\"/>\n\t\t<field name=\"FLAG_REGISTER_CONTENT_OBSERVER\" since=\"11\"/>\n\t</class>\n\t<class name=\"android/widget/CursorTreeAdapter\" since=\"1\">\n\t\t<extends name=\"android/widget/BaseExpandableListAdapter\"/>\n\t\t<implements name=\"android/widget/Filterable\"/>\n\t\t<method name=\"&lt;init>(Landroid/database/Cursor;Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/database/Cursor;Landroid/content/Context;Z)V\"/>\n\t\t<method name=\"bindChildView(Landroid/view/View;Landroid/content/Context;Landroid/database/Cursor;Z)V\"/>\n\t\t<method name=\"bindGroupView(Landroid/view/View;Landroid/content/Context;Landroid/database/Cursor;Z)V\"/>\n\t\t<method name=\"changeCursor(Landroid/database/Cursor;)V\"/>\n\t\t<method name=\"convertToString(Landroid/database/Cursor;)Ljava/lang/String;\"/>\n\t\t<method name=\"getChild(II)Landroid/database/Cursor;\"/>\n\t\t<method name=\"getChildrenCursor(Landroid/database/Cursor;)Landroid/database/Cursor;\"/>\n\t\t<method name=\"getCursor()Landroid/database/Cursor;\"/>\n\t\t<method name=\"getFilterQueryProvider()Landroid/widget/FilterQueryProvider;\"/>\n\t\t<method name=\"getGroup(I)Landroid/database/Cursor;\"/>\n\t\t<method name=\"newChildView(Landroid/content/Context;Landroid/database/Cursor;ZLandroid/view/ViewGroup;)Landroid/view/View;\"/>\n\t\t<method name=\"newGroupView(Landroid/content/Context;Landroid/database/Cursor;ZLandroid/view/ViewGroup;)Landroid/view/View;\"/>\n\t\t<method name=\"notifyDataSetChanged(Z)V\"/>\n\t\t<method name=\"runQueryOnBackgroundThread(Ljava/lang/CharSequence;)Landroid/database/Cursor;\"/>\n\t\t<method name=\"setChildrenCursor(ILandroid/database/Cursor;)V\"/>\n\t\t<method name=\"setFilterQueryProvider(Landroid/widget/FilterQueryProvider;)V\"/>\n\t\t<method name=\"setGroupCursor(Landroid/database/Cursor;)V\"/>\n\t</class>\n\t<class name=\"android/widget/DatePicker\" since=\"1\">\n\t\t<extends name=\"android/widget/FrameLayout\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"getCalendarView()Landroid/widget/CalendarView;\" since=\"12\" deprecated=\"24\"/>\n\t\t<method name=\"getCalendarViewShown()Z\" since=\"11\" deprecated=\"24\"/>\n\t\t<method name=\"getDayOfMonth()I\"/>\n\t\t<method name=\"getFirstDayOfWeek()I\" since=\"21\"/>\n\t\t<method name=\"getMaxDate()J\" since=\"11\"/>\n\t\t<method name=\"getMinDate()J\" since=\"11\"/>\n\t\t<method name=\"getMonth()I\"/>\n\t\t<method name=\"getSpinnersShown()Z\" since=\"11\" deprecated=\"24\"/>\n\t\t<method name=\"getYear()I\"/>\n\t\t<method name=\"init(IIILandroid/widget/DatePicker$OnDateChangedListener;)V\"/>\n\t\t<method name=\"setCalendarViewShown(Z)V\" since=\"11\" deprecated=\"24\"/>\n\t\t<method name=\"setFirstDayOfWeek(I)V\" since=\"21\"/>\n\t\t<method name=\"setMaxDate(J)V\" since=\"11\"/>\n\t\t<method name=\"setMinDate(J)V\" since=\"11\"/>\n\t\t<method name=\"setOnDateChangedListener(Landroid/widget/DatePicker$OnDateChangedListener;)V\" since=\"26\"/>\n\t\t<method name=\"setSpinnersShown(Z)V\" since=\"11\" deprecated=\"24\"/>\n\t\t<method name=\"updateDate(III)V\"/>\n\t</class>\n\t<class name=\"android/widget/DatePicker$OnDateChangedListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDateChanged(Landroid/widget/DatePicker;III)V\"/>\n\t</class>\n\t<class name=\"android/widget/DialerFilter\" since=\"1\" deprecated=\"26\">\n\t\t<extends name=\"android/widget/RelativeLayout\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"append(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"clearText()V\" deprecated=\"29\"/>\n\t\t<method name=\"getDigits()Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"getFilterText()Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"getLetters()Ljava/lang/CharSequence;\" deprecated=\"29\"/>\n\t\t<method name=\"getMode()I\" deprecated=\"29\"/>\n\t\t<method name=\"isQwertyKeyboard()Z\" deprecated=\"29\"/>\n\t\t<method name=\"onModeChange(II)V\" deprecated=\"29\"/>\n\t\t<method name=\"removeFilterWatcher(Landroid/text/TextWatcher;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setDigitsWatcher(Landroid/text/TextWatcher;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setFilterWatcher(Landroid/text/TextWatcher;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setLettersWatcher(Landroid/text/TextWatcher;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setMode(I)V\" deprecated=\"29\"/>\n\t\t<field name=\"DIGITS_AND_LETTERS\" deprecated=\"29\"/>\n\t\t<field name=\"DIGITS_AND_LETTERS_NO_DIGITS\" deprecated=\"29\"/>\n\t\t<field name=\"DIGITS_AND_LETTERS_NO_LETTERS\" deprecated=\"29\"/>\n\t\t<field name=\"DIGITS_ONLY\" deprecated=\"29\"/>\n\t\t<field name=\"LETTERS_ONLY\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/widget/DigitalClock\" since=\"1\" deprecated=\"17\">\n\t\t<extends name=\"android/widget/TextView\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/widget/EdgeEffect\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"draw(Landroid/graphics/Canvas;)Z\"/>\n\t\t<method name=\"finish()V\"/>\n\t\t<method name=\"getBlendMode()Landroid/graphics/BlendMode;\" since=\"29\"/>\n\t\t<method name=\"getColor()I\" since=\"21\"/>\n\t\t<method name=\"getMaxHeight()I\" since=\"21\"/>\n\t\t<method name=\"isFinished()Z\"/>\n\t\t<method name=\"onAbsorb(I)V\"/>\n\t\t<method name=\"onPull(F)V\"/>\n\t\t<method name=\"onPull(FF)V\" since=\"21\"/>\n\t\t<method name=\"onRelease()V\"/>\n\t\t<method name=\"setBlendMode(Landroid/graphics/BlendMode;)V\" since=\"29\"/>\n\t\t<method name=\"setColor(I)V\" since=\"21\"/>\n\t\t<method name=\"setSize(II)V\"/>\n\t\t<field name=\"DEFAULT_BLEND_MODE\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/widget/EditText\" since=\"1\">\n\t\t<extends name=\"android/widget/TextView\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"extendSelection(I)V\"/>\n\t\t<method name=\"getText()Landroid/text/Editable;\"/>\n\t\t<method name=\"selectAll()V\"/>\n\t\t<method name=\"setSelection(I)V\"/>\n\t\t<method name=\"setSelection(II)V\"/>\n\t</class>\n\t<class name=\"android/widget/ExpandableListAdapter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"areAllItemsEnabled()Z\"/>\n\t\t<method name=\"getChild(II)Ljava/lang/Object;\"/>\n\t\t<method name=\"getChildId(II)J\"/>\n\t\t<method name=\"getChildView(IIZLandroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View;\"/>\n\t\t<method name=\"getChildrenCount(I)I\"/>\n\t\t<method name=\"getCombinedChildId(JJ)J\"/>\n\t\t<method name=\"getCombinedGroupId(J)J\"/>\n\t\t<method name=\"getGroup(I)Ljava/lang/Object;\"/>\n\t\t<method name=\"getGroupCount()I\"/>\n\t\t<method name=\"getGroupId(I)J\"/>\n\t\t<method name=\"getGroupView(IZLandroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View;\"/>\n\t\t<method name=\"hasStableIds()Z\"/>\n\t\t<method name=\"isChildSelectable(II)Z\"/>\n\t\t<method name=\"isEmpty()Z\"/>\n\t\t<method name=\"onGroupCollapsed(I)V\"/>\n\t\t<method name=\"onGroupExpanded(I)V\"/>\n\t\t<method name=\"registerDataSetObserver(Landroid/database/DataSetObserver;)V\"/>\n\t\t<method name=\"unregisterDataSetObserver(Landroid/database/DataSetObserver;)V\"/>\n\t</class>\n\t<class name=\"android/widget/ExpandableListView\" since=\"1\">\n\t\t<extends name=\"android/widget/ListView\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"collapseGroup(I)Z\"/>\n\t\t<method name=\"expandGroup(I)Z\"/>\n\t\t<method name=\"expandGroup(IZ)Z\" since=\"14\"/>\n\t\t<method name=\"getExpandableListAdapter()Landroid/widget/ExpandableListAdapter;\"/>\n\t\t<method name=\"getExpandableListPosition(I)J\"/>\n\t\t<method name=\"getFlatListPosition(J)I\"/>\n\t\t<method name=\"getPackedPositionChild(J)I\"/>\n\t\t<method name=\"getPackedPositionForChild(II)J\"/>\n\t\t<method name=\"getPackedPositionForGroup(I)J\"/>\n\t\t<method name=\"getPackedPositionGroup(J)I\"/>\n\t\t<method name=\"getPackedPositionType(J)I\"/>\n\t\t<method name=\"getSelectedId()J\"/>\n\t\t<method name=\"getSelectedPosition()J\"/>\n\t\t<method name=\"isGroupExpanded(I)Z\"/>\n\t\t<method name=\"setAdapter(Landroid/widget/ExpandableListAdapter;)V\"/>\n\t\t<method name=\"setChildDivider(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setChildIndicator(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setChildIndicatorBounds(II)V\"/>\n\t\t<method name=\"setChildIndicatorBoundsRelative(II)V\" since=\"18\"/>\n\t\t<method name=\"setGroupIndicator(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setIndicatorBounds(II)V\"/>\n\t\t<method name=\"setIndicatorBoundsRelative(II)V\" since=\"18\"/>\n\t\t<method name=\"setOnChildClickListener(Landroid/widget/ExpandableListView$OnChildClickListener;)V\"/>\n\t\t<method name=\"setOnGroupClickListener(Landroid/widget/ExpandableListView$OnGroupClickListener;)V\"/>\n\t\t<method name=\"setOnGroupCollapseListener(Landroid/widget/ExpandableListView$OnGroupCollapseListener;)V\"/>\n\t\t<method name=\"setOnGroupExpandListener(Landroid/widget/ExpandableListView$OnGroupExpandListener;)V\"/>\n\t\t<method name=\"setSelectedChild(IIZ)Z\"/>\n\t\t<method name=\"setSelectedGroup(I)V\"/>\n\t\t<field name=\"CHILD_INDICATOR_INHERIT\"/>\n\t\t<field name=\"PACKED_POSITION_TYPE_CHILD\"/>\n\t\t<field name=\"PACKED_POSITION_TYPE_GROUP\"/>\n\t\t<field name=\"PACKED_POSITION_TYPE_NULL\"/>\n\t\t<field name=\"PACKED_POSITION_VALUE_NULL\"/>\n\t</class>\n\t<class name=\"android/widget/ExpandableListView$ExpandableListContextMenuInfo\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/view/ContextMenu$ContextMenuInfo\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/View;JJ)V\"/>\n\t\t<field name=\"id\"/>\n\t\t<field name=\"packedPosition\"/>\n\t\t<field name=\"targetView\"/>\n\t</class>\n\t<class name=\"android/widget/ExpandableListView$OnChildClickListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onChildClick(Landroid/widget/ExpandableListView;Landroid/view/View;IIJ)Z\"/>\n\t</class>\n\t<class name=\"android/widget/ExpandableListView$OnGroupClickListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onGroupClick(Landroid/widget/ExpandableListView;Landroid/view/View;IJ)Z\"/>\n\t</class>\n\t<class name=\"android/widget/ExpandableListView$OnGroupCollapseListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onGroupCollapse(I)V\"/>\n\t</class>\n\t<class name=\"android/widget/ExpandableListView$OnGroupExpandListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onGroupExpand(I)V\"/>\n\t</class>\n\t<class name=\"android/widget/Filter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"convertResultToString(Ljava/lang/Object;)Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"filter(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"filter(Ljava/lang/CharSequence;Landroid/widget/Filter$FilterListener;)V\"/>\n\t\t<method name=\"performFiltering(Ljava/lang/CharSequence;)Landroid/widget/Filter$FilterResults;\"/>\n\t\t<method name=\"publishResults(Ljava/lang/CharSequence;Landroid/widget/Filter$FilterResults;)V\"/>\n\t</class>\n\t<class name=\"android/widget/Filter$FilterListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onFilterComplete(I)V\"/>\n\t</class>\n\t<class name=\"android/widget/Filter$FilterResults\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"count\"/>\n\t\t<field name=\"values\"/>\n\t</class>\n\t<class name=\"android/widget/FilterQueryProvider\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"runQuery(Ljava/lang/CharSequence;)Landroid/database/Cursor;\"/>\n\t</class>\n\t<class name=\"android/widget/Filterable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getFilter()Landroid/widget/Filter;\"/>\n\t</class>\n\t<class name=\"android/widget/FrameLayout\" since=\"1\">\n\t\t<extends name=\"android/view/ViewGroup\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"generateDefaultLayoutParams()Landroid/widget/FrameLayout$LayoutParams;\"/>\n\t\t<method name=\"generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/FrameLayout$LayoutParams;\"/>\n\t\t<method name=\"getConsiderGoneChildrenWhenMeasuring()Z\" deprecated=\"15\"/>\n\t\t<method name=\"getForeground()Landroid/graphics/drawable/Drawable;\" removed=\"23\"/>\n\t\t<method name=\"getForegroundGravity()I\" since=\"16\" removed=\"23\"/>\n\t\t<method name=\"getForegroundTintList()Landroid/content/res/ColorStateList;\" since=\"21\" removed=\"23\"/>\n\t\t<method name=\"getForegroundTintMode()Landroid/graphics/PorterDuff$Mode;\" since=\"21\" removed=\"23\"/>\n\t\t<method name=\"getMeasureAllChildren()Z\" since=\"14\"/>\n\t\t<method name=\"setForeground(Landroid/graphics/drawable/Drawable;)V\" removed=\"23\"/>\n\t\t<method name=\"setForegroundGravity(I)V\"/>\n\t\t<method name=\"setForegroundTintList(Landroid/content/res/ColorStateList;)V\" since=\"21\" removed=\"23\"/>\n\t\t<method name=\"setForegroundTintMode(Landroid/graphics/PorterDuff$Mode;)V\" since=\"21\" removed=\"23\"/>\n\t\t<method name=\"setMeasureAllChildren(Z)V\"/>\n\t</class>\n\t<class name=\"android/widget/FrameLayout$LayoutParams\" since=\"1\">\n\t\t<extends name=\"android/view/ViewGroup$MarginLayoutParams\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/widget/FrameLayout$LayoutParams;)V\" since=\"19\"/>\n\t\t<field name=\"UNSPECIFIED_GRAVITY\" since=\"24\"/>\n\t\t<field name=\"gravity\"/>\n\t</class>\n\t<class name=\"android/widget/Gallery\" since=\"1\" deprecated=\"16\">\n\t\t<extends name=\"android/widget/AbsSpinner\"/>\n\t\t<implements name=\"android/view/GestureDetector$OnGestureListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"setAnimationDuration(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setCallbackDuringFling(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setGravity(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setSpacing(I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setUnselectedAlpha(F)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/widget/Gallery$LayoutParams\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"android/view/ViewGroup$LayoutParams\"/>\n\t\t<method name=\"&lt;init>(II)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/widget/GridLayout\" since=\"14\">\n\t\t<extends name=\"android/view/ViewGroup\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"generateDefaultLayoutParams()Landroid/widget/GridLayout$LayoutParams;\"/>\n\t\t<method name=\"generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/GridLayout$LayoutParams;\"/>\n\t\t<method name=\"generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/widget/GridLayout$LayoutParams;\"/>\n\t\t<method name=\"getAlignmentMode()I\"/>\n\t\t<method name=\"getColumnCount()I\"/>\n\t\t<method name=\"getOrientation()I\"/>\n\t\t<method name=\"getRowCount()I\"/>\n\t\t<method name=\"getUseDefaultMargins()Z\"/>\n\t\t<method name=\"isColumnOrderPreserved()Z\"/>\n\t\t<method name=\"isRowOrderPreserved()Z\"/>\n\t\t<method name=\"setAlignmentMode(I)V\"/>\n\t\t<method name=\"setColumnCount(I)V\"/>\n\t\t<method name=\"setColumnOrderPreserved(Z)V\"/>\n\t\t<method name=\"setOrientation(I)V\"/>\n\t\t<method name=\"setRowCount(I)V\"/>\n\t\t<method name=\"setRowOrderPreserved(Z)V\"/>\n\t\t<method name=\"setUseDefaultMargins(Z)V\"/>\n\t\t<method name=\"spec(I)Landroid/widget/GridLayout$Spec;\"/>\n\t\t<method name=\"spec(IF)Landroid/widget/GridLayout$Spec;\" since=\"21\"/>\n\t\t<method name=\"spec(II)Landroid/widget/GridLayout$Spec;\"/>\n\t\t<method name=\"spec(IIF)Landroid/widget/GridLayout$Spec;\" since=\"21\"/>\n\t\t<method name=\"spec(IILandroid/widget/GridLayout$Alignment;)Landroid/widget/GridLayout$Spec;\"/>\n\t\t<method name=\"spec(IILandroid/widget/GridLayout$Alignment;F)Landroid/widget/GridLayout$Spec;\" since=\"21\"/>\n\t\t<method name=\"spec(ILandroid/widget/GridLayout$Alignment;)Landroid/widget/GridLayout$Spec;\"/>\n\t\t<method name=\"spec(ILandroid/widget/GridLayout$Alignment;F)Landroid/widget/GridLayout$Spec;\" since=\"21\"/>\n\t\t<field name=\"ALIGN_BOUNDS\"/>\n\t\t<field name=\"ALIGN_MARGINS\"/>\n\t\t<field name=\"BASELINE\"/>\n\t\t<field name=\"BOTTOM\"/>\n\t\t<field name=\"CENTER\"/>\n\t\t<field name=\"END\" since=\"16\"/>\n\t\t<field name=\"FILL\"/>\n\t\t<field name=\"HORIZONTAL\"/>\n\t\t<field name=\"LEFT\"/>\n\t\t<field name=\"RIGHT\"/>\n\t\t<field name=\"START\" since=\"16\"/>\n\t\t<field name=\"TOP\"/>\n\t\t<field name=\"UNDEFINED\"/>\n\t\t<field name=\"VERTICAL\"/>\n\t</class>\n\t<class name=\"android/widget/GridLayout$Alignment\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/widget/GridLayout$LayoutParams\" since=\"14\">\n\t\t<extends name=\"android/view/ViewGroup$MarginLayoutParams\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/widget/GridLayout$LayoutParams;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/widget/GridLayout$Spec;Landroid/widget/GridLayout$Spec;)V\"/>\n\t\t<method name=\"setGravity(I)V\"/>\n\t\t<field name=\"columnSpec\"/>\n\t\t<field name=\"rowSpec\"/>\n\t</class>\n\t<class name=\"android/widget/GridLayout$Spec\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"android/widget/GridView\" since=\"1\">\n\t\t<extends name=\"android/widget/AbsListView\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"getAdapter()Landroid/widget/ListAdapter;\"/>\n\t\t<method name=\"getColumnWidth()I\" since=\"16\"/>\n\t\t<method name=\"getGravity()I\" since=\"16\"/>\n\t\t<method name=\"getHorizontalSpacing()I\" since=\"16\"/>\n\t\t<method name=\"getNumColumns()I\" since=\"11\"/>\n\t\t<method name=\"getRequestedColumnWidth()I\" since=\"16\"/>\n\t\t<method name=\"getRequestedHorizontalSpacing()I\" since=\"16\"/>\n\t\t<method name=\"getStretchMode()I\"/>\n\t\t<method name=\"getVerticalSpacing()I\" since=\"16\"/>\n\t\t<method name=\"setAdapter(Landroid/widget/ListAdapter;)V\"/>\n\t\t<method name=\"setColumnWidth(I)V\"/>\n\t\t<method name=\"setGravity(I)V\"/>\n\t\t<method name=\"setHorizontalSpacing(I)V\"/>\n\t\t<method name=\"setNumColumns(I)V\"/>\n\t\t<method name=\"setStretchMode(I)V\"/>\n\t\t<method name=\"setVerticalSpacing(I)V\"/>\n\t\t<method name=\"smoothScrollByOffset(I)V\" since=\"11\"/>\n\t\t<field name=\"AUTO_FIT\"/>\n\t\t<field name=\"NO_STRETCH\"/>\n\t\t<field name=\"STRETCH_COLUMN_WIDTH\"/>\n\t\t<field name=\"STRETCH_SPACING\"/>\n\t\t<field name=\"STRETCH_SPACING_UNIFORM\" since=\"3\"/>\n\t</class>\n\t<class name=\"android/widget/HeaderViewListAdapter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/widget/Filterable\"/>\n\t\t<implements name=\"android/widget/WrapperListAdapter\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/ArrayList;Ljava/util/ArrayList;Landroid/widget/ListAdapter;)V\"/>\n\t\t<method name=\"getFootersCount()I\"/>\n\t\t<method name=\"getHeadersCount()I\"/>\n\t\t<method name=\"removeFooter(Landroid/view/View;)Z\"/>\n\t\t<method name=\"removeHeader(Landroid/view/View;)Z\"/>\n\t</class>\n\t<class name=\"android/widget/HeterogeneousExpandableList\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getChildType(II)I\"/>\n\t\t<method name=\"getChildTypeCount()I\"/>\n\t\t<method name=\"getGroupType(I)I\"/>\n\t\t<method name=\"getGroupTypeCount()I\"/>\n\t</class>\n\t<class name=\"android/widget/HorizontalScrollView\" since=\"3\">\n\t\t<extends name=\"android/widget/FrameLayout\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"arrowScroll(I)Z\"/>\n\t\t<method name=\"computeScrollDeltaToGetChildRectOnScreen(Landroid/graphics/Rect;)I\"/>\n\t\t<method name=\"executeKeyEvent(Landroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"fling(I)V\"/>\n\t\t<method name=\"fullScroll(I)Z\"/>\n\t\t<method name=\"getLeftEdgeEffectColor()I\" since=\"29\"/>\n\t\t<method name=\"getMaxScrollAmount()I\"/>\n\t\t<method name=\"getRightEdgeEffectColor()I\" since=\"29\"/>\n\t\t<method name=\"isFillViewport()Z\"/>\n\t\t<method name=\"isSmoothScrollingEnabled()Z\"/>\n\t\t<method name=\"pageScroll(I)Z\"/>\n\t\t<method name=\"setEdgeEffectColor(I)V\" since=\"29\"/>\n\t\t<method name=\"setFillViewport(Z)V\"/>\n\t\t<method name=\"setLeftEdgeEffectColor(I)V\" since=\"29\"/>\n\t\t<method name=\"setRightEdgeEffectColor(I)V\" since=\"29\"/>\n\t\t<method name=\"setSmoothScrollingEnabled(Z)V\"/>\n\t\t<method name=\"smoothScrollBy(II)V\"/>\n\t\t<method name=\"smoothScrollTo(II)V\"/>\n\t</class>\n\t<class name=\"android/widget/ImageButton\" since=\"1\">\n\t\t<extends name=\"android/widget/ImageView\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/widget/ImageSwitcher\" since=\"1\">\n\t\t<extends name=\"android/widget/ViewSwitcher\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"setImageDrawable(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setImageResource(I)V\"/>\n\t\t<method name=\"setImageURI(Landroid/net/Uri;)V\"/>\n\t</class>\n\t<class name=\"android/widget/ImageView\" since=\"1\">\n\t\t<extends name=\"android/view/View\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"animateTransform(Landroid/graphics/Matrix;)V\" since=\"29\"/>\n\t\t<method name=\"clearColorFilter()V\"/>\n\t\t<method name=\"getAdjustViewBounds()Z\" since=\"16\"/>\n\t\t<method name=\"getBaselineAlignBottom()Z\" since=\"11\"/>\n\t\t<method name=\"getColorFilter()Landroid/graphics/ColorFilter;\" since=\"16\"/>\n\t\t<method name=\"getCropToPadding()Z\" since=\"16\"/>\n\t\t<method name=\"getDrawable()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getImageAlpha()I\" since=\"16\"/>\n\t\t<method name=\"getImageMatrix()Landroid/graphics/Matrix;\"/>\n\t\t<method name=\"getImageTintBlendMode()Landroid/graphics/BlendMode;\" since=\"29\"/>\n\t\t<method name=\"getImageTintList()Landroid/content/res/ColorStateList;\" since=\"21\"/>\n\t\t<method name=\"getImageTintMode()Landroid/graphics/PorterDuff$Mode;\" since=\"21\"/>\n\t\t<method name=\"getMaxHeight()I\" since=\"16\"/>\n\t\t<method name=\"getMaxWidth()I\" since=\"16\"/>\n\t\t<method name=\"getScaleType()Landroid/widget/ImageView$ScaleType;\"/>\n\t\t<method name=\"setAdjustViewBounds(Z)V\"/>\n\t\t<method name=\"setAlpha(I)V\" deprecated=\"16\"/>\n\t\t<method name=\"setBaseline(I)V\" since=\"11\"/>\n\t\t<method name=\"setBaselineAlignBottom(Z)V\" since=\"11\"/>\n\t\t<method name=\"setColorFilter(I)V\" since=\"8\"/>\n\t\t<method name=\"setColorFilter(ILandroid/graphics/PorterDuff$Mode;)V\"/>\n\t\t<method name=\"setColorFilter(Landroid/graphics/ColorFilter;)V\"/>\n\t\t<method name=\"setCropToPadding(Z)V\" since=\"16\"/>\n\t\t<method name=\"setFrame(IIII)Z\"/>\n\t\t<method name=\"setImageAlpha(I)V\" since=\"16\"/>\n\t\t<method name=\"setImageBitmap(Landroid/graphics/Bitmap;)V\"/>\n\t\t<method name=\"setImageDrawable(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setImageIcon(Landroid/graphics/drawable/Icon;)V\" since=\"23\"/>\n\t\t<method name=\"setImageLevel(I)V\"/>\n\t\t<method name=\"setImageMatrix(Landroid/graphics/Matrix;)V\"/>\n\t\t<method name=\"setImageResource(I)V\"/>\n\t\t<method name=\"setImageState([IZ)V\"/>\n\t\t<method name=\"setImageTintBlendMode(Landroid/graphics/BlendMode;)V\" since=\"29\"/>\n\t\t<method name=\"setImageTintList(Landroid/content/res/ColorStateList;)V\" since=\"21\"/>\n\t\t<method name=\"setImageTintMode(Landroid/graphics/PorterDuff$Mode;)V\" since=\"21\"/>\n\t\t<method name=\"setImageURI(Landroid/net/Uri;)V\"/>\n\t\t<method name=\"setMaxHeight(I)V\"/>\n\t\t<method name=\"setMaxWidth(I)V\"/>\n\t\t<method name=\"setScaleType(Landroid/widget/ImageView$ScaleType;)V\"/>\n\t</class>\n\t<class name=\"android/widget/ImageView$ScaleType\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/widget/ImageView$ScaleType;\"/>\n\t\t<method name=\"values()[Landroid/widget/ImageView$ScaleType;\"/>\n\t\t<field name=\"CENTER\"/>\n\t\t<field name=\"CENTER_CROP\"/>\n\t\t<field name=\"CENTER_INSIDE\"/>\n\t\t<field name=\"FIT_CENTER\"/>\n\t\t<field name=\"FIT_END\"/>\n\t\t<field name=\"FIT_START\"/>\n\t\t<field name=\"FIT_XY\"/>\n\t\t<field name=\"MATRIX\"/>\n\t</class>\n\t<class name=\"android/widget/LinearLayout\" since=\"1\">\n\t\t<extends name=\"android/view/ViewGroup\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" since=\"11\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"generateDefaultLayoutParams()Landroid/widget/LinearLayout$LayoutParams;\"/>\n\t\t<method name=\"generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/LinearLayout$LayoutParams;\"/>\n\t\t<method name=\"generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/widget/LinearLayout$LayoutParams;\"/>\n\t\t<method name=\"getBaselineAlignedChildIndex()I\"/>\n\t\t<method name=\"getDividerDrawable()Landroid/graphics/drawable/Drawable;\" since=\"16\"/>\n\t\t<method name=\"getDividerPadding()I\" since=\"14\"/>\n\t\t<method name=\"getGravity()I\" since=\"24\"/>\n\t\t<method name=\"getOrientation()I\"/>\n\t\t<method name=\"getShowDividers()I\" since=\"11\"/>\n\t\t<method name=\"getWeightSum()F\"/>\n\t\t<method name=\"isBaselineAligned()Z\"/>\n\t\t<method name=\"isMeasureWithLargestChildEnabled()Z\" since=\"11\"/>\n\t\t<method name=\"setBaselineAligned(Z)V\"/>\n\t\t<method name=\"setBaselineAlignedChildIndex(I)V\"/>\n\t\t<method name=\"setDividerDrawable(Landroid/graphics/drawable/Drawable;)V\" since=\"11\"/>\n\t\t<method name=\"setDividerPadding(I)V\" since=\"14\"/>\n\t\t<method name=\"setGravity(I)V\"/>\n\t\t<method name=\"setHorizontalGravity(I)V\"/>\n\t\t<method name=\"setMeasureWithLargestChildEnabled(Z)V\" since=\"11\"/>\n\t\t<method name=\"setOrientation(I)V\"/>\n\t\t<method name=\"setShowDividers(I)V\" since=\"11\"/>\n\t\t<method name=\"setVerticalGravity(I)V\"/>\n\t\t<method name=\"setWeightSum(F)V\"/>\n\t\t<field name=\"HORIZONTAL\"/>\n\t\t<field name=\"SHOW_DIVIDER_BEGINNING\" since=\"11\"/>\n\t\t<field name=\"SHOW_DIVIDER_END\" since=\"11\"/>\n\t\t<field name=\"SHOW_DIVIDER_MIDDLE\" since=\"11\"/>\n\t\t<field name=\"SHOW_DIVIDER_NONE\" since=\"11\"/>\n\t\t<field name=\"VERTICAL\"/>\n\t</class>\n\t<class name=\"android/widget/LinearLayout$LayoutParams\" since=\"1\">\n\t\t<extends name=\"android/view/ViewGroup$MarginLayoutParams\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(IIF)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/widget/LinearLayout$LayoutParams;)V\" since=\"19\"/>\n\t\t<method name=\"debug(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<field name=\"gravity\"/>\n\t\t<field name=\"weight\"/>\n\t</class>\n\t<class name=\"android/widget/ListAdapter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/widget/Adapter\"/>\n\t\t<method name=\"areAllItemsEnabled()Z\"/>\n\t\t<method name=\"isEnabled(I)Z\"/>\n\t</class>\n\t<class name=\"android/widget/ListPopupWindow\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\"/>\n\t\t<method name=\"clearListSelection()V\"/>\n\t\t<method name=\"createDragToOpenListener(Landroid/view/View;)Landroid/view/View$OnTouchListener;\" since=\"19\"/>\n\t\t<method name=\"dismiss()V\"/>\n\t\t<method name=\"getAnchorView()Landroid/view/View;\"/>\n\t\t<method name=\"getAnimationStyle()I\"/>\n\t\t<method name=\"getBackground()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getEpicenterBounds()Landroid/graphics/Rect;\" since=\"29\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getHorizontalOffset()I\"/>\n\t\t<method name=\"getInputMethodMode()I\"/>\n\t\t<method name=\"getListView()Landroid/widget/ListView;\"/>\n\t\t<method name=\"getPromptPosition()I\"/>\n\t\t<method name=\"getSelectedItem()Ljava/lang/Object;\"/>\n\t\t<method name=\"getSelectedItemId()J\"/>\n\t\t<method name=\"getSelectedItemPosition()I\"/>\n\t\t<method name=\"getSelectedView()Landroid/view/View;\"/>\n\t\t<method name=\"getSoftInputMode()I\"/>\n\t\t<method name=\"getVerticalOffset()I\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t\t<method name=\"isInputMethodNotNeeded()Z\"/>\n\t\t<method name=\"isModal()Z\"/>\n\t\t<method name=\"isShowing()Z\"/>\n\t\t<method name=\"onKeyDown(ILandroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"onKeyPreIme(ILandroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"onKeyUp(ILandroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"performItemClick(I)Z\"/>\n\t\t<method name=\"postShow()V\"/>\n\t\t<method name=\"setAdapter(Landroid/widget/ListAdapter;)V\"/>\n\t\t<method name=\"setAnchorView(Landroid/view/View;)V\"/>\n\t\t<method name=\"setAnimationStyle(I)V\"/>\n\t\t<method name=\"setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setContentWidth(I)V\"/>\n\t\t<method name=\"setDropDownGravity(I)V\" since=\"19\"/>\n\t\t<method name=\"setEpicenterBounds(Landroid/graphics/Rect;)V\" since=\"29\"/>\n\t\t<method name=\"setHeight(I)V\"/>\n\t\t<method name=\"setHorizontalOffset(I)V\"/>\n\t\t<method name=\"setInputMethodMode(I)V\"/>\n\t\t<method name=\"setListSelector(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setModal(Z)V\"/>\n\t\t<method name=\"setOnDismissListener(Landroid/widget/PopupWindow$OnDismissListener;)V\"/>\n\t\t<method name=\"setOnItemClickListener(Landroid/widget/AdapterView$OnItemClickListener;)V\"/>\n\t\t<method name=\"setOnItemSelectedListener(Landroid/widget/AdapterView$OnItemSelectedListener;)V\"/>\n\t\t<method name=\"setPromptPosition(I)V\"/>\n\t\t<method name=\"setPromptView(Landroid/view/View;)V\"/>\n\t\t<method name=\"setSelection(I)V\"/>\n\t\t<method name=\"setSoftInputMode(I)V\"/>\n\t\t<method name=\"setVerticalOffset(I)V\"/>\n\t\t<method name=\"setWidth(I)V\"/>\n\t\t<method name=\"setWindowLayoutType(I)V\" since=\"23\"/>\n\t\t<method name=\"show()V\"/>\n\t\t<field name=\"INPUT_METHOD_FROM_FOCUSABLE\"/>\n\t\t<field name=\"INPUT_METHOD_NEEDED\"/>\n\t\t<field name=\"INPUT_METHOD_NOT_NEEDED\"/>\n\t\t<field name=\"MATCH_PARENT\"/>\n\t\t<field name=\"POSITION_PROMPT_ABOVE\"/>\n\t\t<field name=\"POSITION_PROMPT_BELOW\"/>\n\t\t<field name=\"WRAP_CONTENT\"/>\n\t</class>\n\t<class name=\"android/widget/ListView\" since=\"1\">\n\t\t<extends name=\"android/widget/AbsListView\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"addFooterView(Landroid/view/View;)V\"/>\n\t\t<method name=\"addFooterView(Landroid/view/View;Ljava/lang/Object;Z)V\"/>\n\t\t<method name=\"addHeaderView(Landroid/view/View;)V\"/>\n\t\t<method name=\"addHeaderView(Landroid/view/View;Ljava/lang/Object;Z)V\"/>\n\t\t<method name=\"areFooterDividersEnabled()Z\" since=\"19\"/>\n\t\t<method name=\"areHeaderDividersEnabled()Z\" since=\"19\"/>\n\t\t<method name=\"clearChoices()V\" removed=\"11\"/>\n\t\t<method name=\"findViewTraversal(I)Landroid/view/View;\" removed=\"26\"/>\n\t\t<method name=\"findViewWithTagTraversal(Ljava/lang/Object;)Landroid/view/View;\" removed=\"26\"/>\n\t\t<method name=\"getAdapter()Landroid/widget/ListAdapter;\"/>\n\t\t<method name=\"getCheckItemIds()[J\" since=\"4\" deprecated=\"15\"/>\n\t\t<method name=\"getCheckedItemIds()[J\" since=\"8\" removed=\"11\"/>\n\t\t<method name=\"getCheckedItemPosition()I\" removed=\"11\"/>\n\t\t<method name=\"getCheckedItemPositions()Landroid/util/SparseBooleanArray;\" removed=\"11\"/>\n\t\t<method name=\"getChoiceMode()I\" removed=\"11\"/>\n\t\t<method name=\"getDivider()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getDividerHeight()I\"/>\n\t\t<method name=\"getFooterViewsCount()I\"/>\n\t\t<method name=\"getHeaderViewsCount()I\"/>\n\t\t<method name=\"getItemsCanFocus()Z\"/>\n\t\t<method name=\"getMaxScrollAmount()I\"/>\n\t\t<method name=\"getOverscrollFooter()Landroid/graphics/drawable/Drawable;\" since=\"9\"/>\n\t\t<method name=\"getOverscrollHeader()Landroid/graphics/drawable/Drawable;\" since=\"9\"/>\n\t\t<method name=\"isItemChecked(I)Z\" removed=\"11\"/>\n\t\t<method name=\"removeFooterView(Landroid/view/View;)Z\"/>\n\t\t<method name=\"removeHeaderView(Landroid/view/View;)Z\"/>\n\t\t<method name=\"setAdapter(Landroid/widget/ListAdapter;)V\"/>\n\t\t<method name=\"setChoiceMode(I)V\" removed=\"11\"/>\n\t\t<method name=\"setDivider(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setDividerHeight(I)V\"/>\n\t\t<method name=\"setFooterDividersEnabled(Z)V\" since=\"3\"/>\n\t\t<method name=\"setHeaderDividersEnabled(Z)V\" since=\"3\"/>\n\t\t<method name=\"setItemChecked(IZ)V\" removed=\"11\"/>\n\t\t<method name=\"setItemsCanFocus(Z)V\"/>\n\t\t<method name=\"setOverscrollFooter(Landroid/graphics/drawable/Drawable;)V\" since=\"9\"/>\n\t\t<method name=\"setOverscrollHeader(Landroid/graphics/drawable/Drawable;)V\" since=\"9\"/>\n\t\t<method name=\"setSelectionAfterHeaderView()V\"/>\n\t\t<method name=\"setSelectionFromTop(II)V\" removed=\"21\"/>\n\t\t<method name=\"smoothScrollByOffset(I)V\" since=\"11\"/>\n\t\t<field name=\"CHOICE_MODE_MULTIPLE\" removed=\"11\"/>\n\t\t<field name=\"CHOICE_MODE_NONE\" removed=\"11\"/>\n\t\t<field name=\"CHOICE_MODE_SINGLE\" removed=\"11\"/>\n\t</class>\n\t<class name=\"android/widget/ListView$FixedViewInfo\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/widget/ListView;)V\"/>\n\t\t<field name=\"data\"/>\n\t\t<field name=\"isSelectable\"/>\n\t\t<field name=\"view\"/>\n\t</class>\n\t<class name=\"android/widget/Magnifier\" since=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/View;)V\" deprecated=\"29\"/>\n\t\t<method name=\"dismiss()V\"/>\n\t\t<method name=\"getCornerRadius()F\" since=\"29\"/>\n\t\t<method name=\"getDefaultHorizontalSourceToMagnifierOffset()I\" since=\"29\"/>\n\t\t<method name=\"getDefaultVerticalSourceToMagnifierOffset()I\" since=\"29\"/>\n\t\t<method name=\"getElevation()F\" since=\"29\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getOverlay()Landroid/graphics/drawable/Drawable;\" since=\"29\"/>\n\t\t<method name=\"getPosition()Landroid/graphics/Point;\" since=\"29\"/>\n\t\t<method name=\"getSourceHeight()I\" since=\"29\"/>\n\t\t<method name=\"getSourcePosition()Landroid/graphics/Point;\" since=\"29\"/>\n\t\t<method name=\"getSourceWidth()I\" since=\"29\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t\t<method name=\"getZoom()F\"/>\n\t\t<method name=\"isClippingEnabled()Z\" since=\"29\"/>\n\t\t<method name=\"setZoom(F)V\" since=\"29\"/>\n\t\t<method name=\"show(FF)V\"/>\n\t\t<method name=\"show(FFFF)V\" since=\"29\"/>\n\t\t<method name=\"update()V\"/>\n\t\t<field name=\"SOURCE_BOUND_MAX_IN_SURFACE\" since=\"29\"/>\n\t\t<field name=\"SOURCE_BOUND_MAX_VISIBLE\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/widget/Magnifier$Builder\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/View;)V\"/>\n\t\t<method name=\"build()Landroid/widget/Magnifier;\"/>\n\t\t<method name=\"setClippingEnabled(Z)Landroid/widget/Magnifier$Builder;\"/>\n\t\t<method name=\"setCornerRadius(F)Landroid/widget/Magnifier$Builder;\"/>\n\t\t<method name=\"setDefaultSourceToMagnifierOffset(II)Landroid/widget/Magnifier$Builder;\"/>\n\t\t<method name=\"setElevation(F)Landroid/widget/Magnifier$Builder;\"/>\n\t\t<method name=\"setInitialZoom(F)Landroid/widget/Magnifier$Builder;\"/>\n\t\t<method name=\"setOverlay(Landroid/graphics/drawable/Drawable;)Landroid/widget/Magnifier$Builder;\"/>\n\t\t<method name=\"setSize(II)Landroid/widget/Magnifier$Builder;\"/>\n\t\t<method name=\"setSourceBounds(IIII)Landroid/widget/Magnifier$Builder;\"/>\n\t</class>\n\t<class name=\"android/widget/MediaController\" since=\"1\">\n\t\t<extends name=\"android/widget/FrameLayout\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Z)V\"/>\n\t\t<method name=\"hide()V\"/>\n\t\t<method name=\"isShowing()Z\"/>\n\t\t<method name=\"setAnchorView(Landroid/view/View;)V\"/>\n\t\t<method name=\"setMediaPlayer(Landroid/widget/MediaController$MediaPlayerControl;)V\"/>\n\t\t<method name=\"setPrevNextListeners(Landroid/view/View$OnClickListener;Landroid/view/View$OnClickListener;)V\"/>\n\t\t<method name=\"show()V\"/>\n\t\t<method name=\"show(I)V\"/>\n\t</class>\n\t<class name=\"android/widget/MediaController$MediaPlayerControl\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"canPause()Z\" since=\"5\"/>\n\t\t<method name=\"canSeekBackward()Z\" since=\"5\"/>\n\t\t<method name=\"canSeekForward()Z\" since=\"5\"/>\n\t\t<method name=\"getAudioSessionId()I\" since=\"18\"/>\n\t\t<method name=\"getBufferPercentage()I\"/>\n\t\t<method name=\"getCurrentPosition()I\"/>\n\t\t<method name=\"getDuration()I\"/>\n\t\t<method name=\"isPlaying()Z\"/>\n\t\t<method name=\"pause()V\"/>\n\t\t<method name=\"seekTo(I)V\"/>\n\t\t<method name=\"start()V\"/>\n\t</class>\n\t<class name=\"android/widget/MultiAutoCompleteTextView\" since=\"1\">\n\t\t<extends name=\"android/widget/AutoCompleteTextView\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"performFiltering(Ljava/lang/CharSequence;III)V\"/>\n\t\t<method name=\"setTokenizer(Landroid/widget/MultiAutoCompleteTextView$Tokenizer;)V\"/>\n\t</class>\n\t<class name=\"android/widget/MultiAutoCompleteTextView$CommaTokenizer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/widget/MultiAutoCompleteTextView$Tokenizer\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"android/widget/MultiAutoCompleteTextView$Tokenizer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"findTokenEnd(Ljava/lang/CharSequence;I)I\"/>\n\t\t<method name=\"findTokenStart(Ljava/lang/CharSequence;I)I\"/>\n\t\t<method name=\"terminateToken(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;\"/>\n\t</class>\n\t<class name=\"android/widget/NumberPicker\" since=\"11\">\n\t\t<extends name=\"android/widget/LinearLayout\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"getDisplayedValues()[Ljava/lang/String;\"/>\n\t\t<method name=\"getMaxValue()I\"/>\n\t\t<method name=\"getMinValue()I\"/>\n\t\t<method name=\"getSelectionDividerHeight()I\" since=\"29\"/>\n\t\t<method name=\"getTextColor()I\" since=\"29\"/>\n\t\t<method name=\"getTextSize()F\" since=\"29\"/>\n\t\t<method name=\"getValue()I\"/>\n\t\t<method name=\"getWrapSelectorWheel()Z\"/>\n\t\t<method name=\"setDisplayedValues([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setFormatter(Landroid/widget/NumberPicker$Formatter;)V\"/>\n\t\t<method name=\"setMaxValue(I)V\"/>\n\t\t<method name=\"setMinValue(I)V\"/>\n\t\t<method name=\"setOnLongPressUpdateInterval(J)V\"/>\n\t\t<method name=\"setOnScrollListener(Landroid/widget/NumberPicker$OnScrollListener;)V\"/>\n\t\t<method name=\"setOnValueChangedListener(Landroid/widget/NumberPicker$OnValueChangeListener;)V\"/>\n\t\t<method name=\"setSelectionDividerHeight(I)V\" since=\"29\"/>\n\t\t<method name=\"setTextColor(I)V\" since=\"29\"/>\n\t\t<method name=\"setTextSize(F)V\" since=\"29\"/>\n\t\t<method name=\"setValue(I)V\"/>\n\t\t<method name=\"setWrapSelectorWheel(Z)V\"/>\n\t</class>\n\t<class name=\"android/widget/NumberPicker$Formatter\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"format(I)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"android/widget/NumberPicker$OnScrollListener\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onScrollStateChange(Landroid/widget/NumberPicker;I)V\"/>\n\t\t<field name=\"SCROLL_STATE_FLING\"/>\n\t\t<field name=\"SCROLL_STATE_IDLE\"/>\n\t\t<field name=\"SCROLL_STATE_TOUCH_SCROLL\"/>\n\t</class>\n\t<class name=\"android/widget/NumberPicker$OnValueChangeListener\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onValueChange(Landroid/widget/NumberPicker;II)V\"/>\n\t</class>\n\t<class name=\"android/widget/OverScroller\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/view/animation/Interpolator;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/view/animation/Interpolator;FF)V\" deprecated=\"26\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/view/animation/Interpolator;FFZ)V\" since=\"11\" deprecated=\"26\"/>\n\t\t<method name=\"abortAnimation()V\"/>\n\t\t<method name=\"computeScrollOffset()Z\"/>\n\t\t<method name=\"fling(IIIIIIII)V\"/>\n\t\t<method name=\"fling(IIIIIIIIII)V\"/>\n\t\t<method name=\"forceFinished(Z)V\"/>\n\t\t<method name=\"getCurrVelocity()F\" since=\"14\"/>\n\t\t<method name=\"getCurrX()I\"/>\n\t\t<method name=\"getCurrY()I\"/>\n\t\t<method name=\"getFinalX()I\"/>\n\t\t<method name=\"getFinalY()I\"/>\n\t\t<method name=\"getStartX()I\"/>\n\t\t<method name=\"getStartY()I\"/>\n\t\t<method name=\"isFinished()Z\"/>\n\t\t<method name=\"isOverScrolled()Z\"/>\n\t\t<method name=\"notifyHorizontalEdgeReached(III)V\"/>\n\t\t<method name=\"notifyVerticalEdgeReached(III)V\"/>\n\t\t<method name=\"setFriction(F)V\" since=\"11\"/>\n\t\t<method name=\"springBack(IIIIII)Z\"/>\n\t\t<method name=\"startScroll(IIII)V\"/>\n\t\t<method name=\"startScroll(IIIII)V\"/>\n\t</class>\n\t<class name=\"android/widget/PopupMenu\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/view/View;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/view/View;I)V\" since=\"19\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/view/View;III)V\" since=\"22\"/>\n\t\t<method name=\"dismiss()V\"/>\n\t\t<method name=\"getDragToOpenListener()Landroid/view/View$OnTouchListener;\" since=\"19\"/>\n\t\t<method name=\"getGravity()I\" since=\"23\"/>\n\t\t<method name=\"getMenu()Landroid/view/Menu;\"/>\n\t\t<method name=\"getMenuInflater()Landroid/view/MenuInflater;\"/>\n\t\t<method name=\"inflate(I)V\" since=\"14\"/>\n\t\t<method name=\"setForceShowIcon(Z)V\" since=\"29\"/>\n\t\t<method name=\"setGravity(I)V\" since=\"23\"/>\n\t\t<method name=\"setOnDismissListener(Landroid/widget/PopupMenu$OnDismissListener;)V\" since=\"14\"/>\n\t\t<method name=\"setOnMenuItemClickListener(Landroid/widget/PopupMenu$OnMenuItemClickListener;)V\"/>\n\t\t<method name=\"show()V\"/>\n\t</class>\n\t<class name=\"android/widget/PopupMenu$OnDismissListener\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDismiss(Landroid/widget/PopupMenu;)V\"/>\n\t</class>\n\t<class name=\"android/widget/PopupMenu$OnMenuItemClickListener\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onMenuItemClick(Landroid/view/MenuItem;)Z\"/>\n\t</class>\n\t<class name=\"android/widget/PopupWindow\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"11\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/View;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/View;II)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/View;IIZ)V\"/>\n\t\t<method name=\"dismiss()V\"/>\n\t\t<method name=\"getAnimationStyle()I\"/>\n\t\t<method name=\"getBackground()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getContentView()Landroid/view/View;\"/>\n\t\t<method name=\"getElevation()F\" since=\"21\"/>\n\t\t<method name=\"getEnterTransition()Landroid/transition/Transition;\" since=\"24\"/>\n\t\t<method name=\"getEpicenterBounds()Landroid/graphics/Rect;\" since=\"29\"/>\n\t\t<method name=\"getExitTransition()Landroid/transition/Transition;\" since=\"24\"/>\n\t\t<method name=\"getHeight()I\"/>\n\t\t<method name=\"getInputMethodMode()I\" since=\"3\"/>\n\t\t<method name=\"getMaxAvailableHeight(Landroid/view/View;)I\"/>\n\t\t<method name=\"getMaxAvailableHeight(Landroid/view/View;I)I\" since=\"3\"/>\n\t\t<method name=\"getMaxAvailableHeight(Landroid/view/View;IZ)I\" since=\"24\"/>\n\t\t<method name=\"getOverlapAnchor()Z\" since=\"23\"/>\n\t\t<method name=\"getSoftInputMode()I\" since=\"4\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t\t<method name=\"getWindowLayoutType()I\" since=\"23\"/>\n\t\t<method name=\"isAboveAnchor()Z\" since=\"3\"/>\n\t\t<method name=\"isAttachedInDecor()Z\" since=\"22\"/>\n\t\t<method name=\"isClippedToScreen()Z\" since=\"29\"/>\n\t\t<method name=\"isClippingEnabled()Z\" since=\"3\"/>\n\t\t<method name=\"isFocusable()Z\"/>\n\t\t<method name=\"isLaidOutInScreen()Z\" since=\"29\"/>\n\t\t<method name=\"isOutsideTouchable()Z\" since=\"3\"/>\n\t\t<method name=\"isShowing()Z\"/>\n\t\t<method name=\"isSplitTouchEnabled()Z\" since=\"11\"/>\n\t\t<method name=\"isTouchModal()Z\" since=\"29\"/>\n\t\t<method name=\"isTouchable()Z\" since=\"3\"/>\n\t\t<method name=\"setAnimationStyle(I)V\"/>\n\t\t<method name=\"setAttachedInDecor(Z)V\" since=\"22\"/>\n\t\t<method name=\"setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setClippingEnabled(Z)V\" since=\"3\"/>\n\t\t<method name=\"setContentView(Landroid/view/View;)V\"/>\n\t\t<method name=\"setElevation(F)V\" since=\"21\"/>\n\t\t<method name=\"setEnterTransition(Landroid/transition/Transition;)V\" since=\"23\"/>\n\t\t<method name=\"setEpicenterBounds(Landroid/graphics/Rect;)V\" since=\"29\"/>\n\t\t<method name=\"setExitTransition(Landroid/transition/Transition;)V\" since=\"23\"/>\n\t\t<method name=\"setFocusable(Z)V\"/>\n\t\t<method name=\"setHeight(I)V\"/>\n\t\t<method name=\"setIgnoreCheekPress()V\"/>\n\t\t<method name=\"setInputMethodMode(I)V\" since=\"3\"/>\n\t\t<method name=\"setIsClippedToScreen(Z)V\" since=\"29\"/>\n\t\t<method name=\"setIsLaidOutInScreen(Z)V\" since=\"29\"/>\n\t\t<method name=\"setOnDismissListener(Landroid/widget/PopupWindow$OnDismissListener;)V\"/>\n\t\t<method name=\"setOutsideTouchable(Z)V\" since=\"3\"/>\n\t\t<method name=\"setOverlapAnchor(Z)V\" since=\"23\"/>\n\t\t<method name=\"setSoftInputMode(I)V\" since=\"4\"/>\n\t\t<method name=\"setSplitTouchEnabled(Z)V\" since=\"11\"/>\n\t\t<method name=\"setTouchInterceptor(Landroid/view/View$OnTouchListener;)V\" since=\"3\"/>\n\t\t<method name=\"setTouchModal(Z)V\" since=\"29\"/>\n\t\t<method name=\"setTouchable(Z)V\" since=\"3\"/>\n\t\t<method name=\"setWidth(I)V\"/>\n\t\t<method name=\"setWindowLayoutMode(II)V\" since=\"3\" deprecated=\"23\"/>\n\t\t<method name=\"setWindowLayoutType(I)V\" since=\"23\"/>\n\t\t<method name=\"showAsDropDown(Landroid/view/View;)V\"/>\n\t\t<method name=\"showAsDropDown(Landroid/view/View;II)V\"/>\n\t\t<method name=\"showAsDropDown(Landroid/view/View;III)V\" since=\"19\"/>\n\t\t<method name=\"showAtLocation(Landroid/view/View;III)V\"/>\n\t\t<method name=\"update()V\" since=\"3\"/>\n\t\t<method name=\"update(II)V\" since=\"4\"/>\n\t\t<method name=\"update(IIII)V\"/>\n\t\t<method name=\"update(IIIIZ)V\" since=\"3\"/>\n\t\t<method name=\"update(Landroid/view/View;II)V\"/>\n\t\t<method name=\"update(Landroid/view/View;IIII)V\"/>\n\t\t<field name=\"INPUT_METHOD_FROM_FOCUSABLE\" since=\"3\"/>\n\t\t<field name=\"INPUT_METHOD_NEEDED\" since=\"3\"/>\n\t\t<field name=\"INPUT_METHOD_NOT_NEEDED\" since=\"3\"/>\n\t</class>\n\t<class name=\"android/widget/PopupWindow$OnDismissListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDismiss()V\"/>\n\t</class>\n\t<class name=\"android/widget/ProgressBar\" since=\"1\">\n\t\t<extends name=\"android/view/View\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"getCurrentDrawable()Landroid/graphics/drawable/Drawable;\" since=\"29\"/>\n\t\t<method name=\"getIndeterminateDrawable()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getIndeterminateTintBlendMode()Landroid/graphics/BlendMode;\" since=\"29\"/>\n\t\t<method name=\"getIndeterminateTintList()Landroid/content/res/ColorStateList;\" since=\"21\"/>\n\t\t<method name=\"getIndeterminateTintMode()Landroid/graphics/PorterDuff$Mode;\" since=\"21\"/>\n\t\t<method name=\"getInterpolator()Landroid/view/animation/Interpolator;\"/>\n\t\t<method name=\"getMax()I\"/>\n\t\t<method name=\"getMaxHeight()I\" since=\"29\"/>\n\t\t<method name=\"getMaxWidth()I\" since=\"29\"/>\n\t\t<method name=\"getMin()I\" since=\"26\"/>\n\t\t<method name=\"getMinHeight()I\" since=\"29\"/>\n\t\t<method name=\"getMinWidth()I\" since=\"29\"/>\n\t\t<method name=\"getProgress()I\"/>\n\t\t<method name=\"getProgressBackgroundTintBlendMode()Landroid/graphics/BlendMode;\" since=\"29\"/>\n\t\t<method name=\"getProgressBackgroundTintList()Landroid/content/res/ColorStateList;\" since=\"21\"/>\n\t\t<method name=\"getProgressBackgroundTintMode()Landroid/graphics/PorterDuff$Mode;\" since=\"21\"/>\n\t\t<method name=\"getProgressDrawable()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getProgressTintBlendMode()Landroid/graphics/BlendMode;\" since=\"29\"/>\n\t\t<method name=\"getProgressTintList()Landroid/content/res/ColorStateList;\" since=\"21\"/>\n\t\t<method name=\"getProgressTintMode()Landroid/graphics/PorterDuff$Mode;\" since=\"21\"/>\n\t\t<method name=\"getSecondaryProgress()I\"/>\n\t\t<method name=\"getSecondaryProgressTintBlendMode()Landroid/graphics/BlendMode;\" since=\"29\"/>\n\t\t<method name=\"getSecondaryProgressTintList()Landroid/content/res/ColorStateList;\" since=\"21\"/>\n\t\t<method name=\"getSecondaryProgressTintMode()Landroid/graphics/PorterDuff$Mode;\" since=\"21\"/>\n\t\t<method name=\"incrementProgressBy(I)V\"/>\n\t\t<method name=\"incrementSecondaryProgressBy(I)V\"/>\n\t\t<method name=\"isAnimating()Z\" since=\"26\"/>\n\t\t<method name=\"isIndeterminate()Z\"/>\n\t\t<method name=\"setIndeterminate(Z)V\"/>\n\t\t<method name=\"setIndeterminateDrawable(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setIndeterminateDrawableTiled(Landroid/graphics/drawable/Drawable;)V\" since=\"21\"/>\n\t\t<method name=\"setIndeterminateTintBlendMode(Landroid/graphics/BlendMode;)V\" since=\"29\"/>\n\t\t<method name=\"setIndeterminateTintList(Landroid/content/res/ColorStateList;)V\" since=\"21\"/>\n\t\t<method name=\"setIndeterminateTintMode(Landroid/graphics/PorterDuff$Mode;)V\" since=\"21\"/>\n\t\t<method name=\"setInterpolator(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"setInterpolator(Landroid/view/animation/Interpolator;)V\"/>\n\t\t<method name=\"setMax(I)V\"/>\n\t\t<method name=\"setMaxHeight(I)V\" since=\"29\"/>\n\t\t<method name=\"setMaxWidth(I)V\" since=\"29\"/>\n\t\t<method name=\"setMin(I)V\" since=\"26\"/>\n\t\t<method name=\"setMinHeight(I)V\" since=\"29\"/>\n\t\t<method name=\"setMinWidth(I)V\" since=\"29\"/>\n\t\t<method name=\"setProgress(I)V\"/>\n\t\t<method name=\"setProgress(IZ)V\" since=\"24\"/>\n\t\t<method name=\"setProgressBackgroundTintBlendMode(Landroid/graphics/BlendMode;)V\" since=\"29\"/>\n\t\t<method name=\"setProgressBackgroundTintList(Landroid/content/res/ColorStateList;)V\" since=\"21\"/>\n\t\t<method name=\"setProgressBackgroundTintMode(Landroid/graphics/PorterDuff$Mode;)V\" since=\"21\"/>\n\t\t<method name=\"setProgressDrawable(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setProgressDrawableTiled(Landroid/graphics/drawable/Drawable;)V\" since=\"21\"/>\n\t\t<method name=\"setProgressTintBlendMode(Landroid/graphics/BlendMode;)V\" since=\"29\"/>\n\t\t<method name=\"setProgressTintList(Landroid/content/res/ColorStateList;)V\" since=\"21\"/>\n\t\t<method name=\"setProgressTintMode(Landroid/graphics/PorterDuff$Mode;)V\" since=\"21\"/>\n\t\t<method name=\"setSecondaryProgress(I)V\"/>\n\t\t<method name=\"setSecondaryProgressTintBlendMode(Landroid/graphics/BlendMode;)V\" since=\"29\"/>\n\t\t<method name=\"setSecondaryProgressTintList(Landroid/content/res/ColorStateList;)V\" since=\"21\"/>\n\t\t<method name=\"setSecondaryProgressTintMode(Landroid/graphics/PorterDuff$Mode;)V\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/widget/QuickContactBadge\" since=\"5\">\n\t\t<extends name=\"android/widget/ImageView\"/>\n\t\t<implements name=\"android/view/View$OnClickListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"assignContactFromEmail(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"assignContactFromEmail(Ljava/lang/String;ZLandroid/os/Bundle;)V\" since=\"18\"/>\n\t\t<method name=\"assignContactFromPhone(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"assignContactFromPhone(Ljava/lang/String;ZLandroid/os/Bundle;)V\" since=\"18\"/>\n\t\t<method name=\"assignContactUri(Landroid/net/Uri;)V\"/>\n\t\t<method name=\"setExcludeMimes([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setImageToDefault()V\" since=\"11\"/>\n\t\t<method name=\"setMode(I)V\"/>\n\t\t<method name=\"setOverlay(Landroid/graphics/drawable/Drawable;)V\" since=\"21\"/>\n\t\t<method name=\"setPrioritizedMimeType(Ljava/lang/String;)V\" since=\"23\"/>\n\t\t<field name=\"mExcludeMimes\"/>\n\t</class>\n\t<class name=\"android/widget/RadioButton\" since=\"1\">\n\t\t<extends name=\"android/widget/CompoundButton\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/widget/RadioGroup\" since=\"1\">\n\t\t<extends name=\"android/widget/LinearLayout\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"check(I)V\"/>\n\t\t<method name=\"clearCheck()V\"/>\n\t\t<method name=\"generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/RadioGroup$LayoutParams;\"/>\n\t\t<method name=\"getCheckedRadioButtonId()I\"/>\n\t\t<method name=\"setOnCheckedChangeListener(Landroid/widget/RadioGroup$OnCheckedChangeListener;)V\"/>\n\t</class>\n\t<class name=\"android/widget/RadioGroup$LayoutParams\" since=\"1\">\n\t\t<extends name=\"android/widget/LinearLayout$LayoutParams\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(IIF)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V\"/>\n\t</class>\n\t<class name=\"android/widget/RadioGroup$OnCheckedChangeListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onCheckedChanged(Landroid/widget/RadioGroup;I)V\"/>\n\t</class>\n\t<class name=\"android/widget/RatingBar\" since=\"1\">\n\t\t<extends name=\"android/widget/AbsSeekBar\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"getNumStars()I\"/>\n\t\t<method name=\"getOnRatingBarChangeListener()Landroid/widget/RatingBar$OnRatingBarChangeListener;\"/>\n\t\t<method name=\"getRating()F\"/>\n\t\t<method name=\"getStepSize()F\"/>\n\t\t<method name=\"isIndicator()Z\"/>\n\t\t<method name=\"setIsIndicator(Z)V\"/>\n\t\t<method name=\"setNumStars(I)V\"/>\n\t\t<method name=\"setOnRatingBarChangeListener(Landroid/widget/RatingBar$OnRatingBarChangeListener;)V\"/>\n\t\t<method name=\"setRating(F)V\"/>\n\t\t<method name=\"setStepSize(F)V\"/>\n\t</class>\n\t<class name=\"android/widget/RatingBar$OnRatingBarChangeListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onRatingChanged(Landroid/widget/RatingBar;FZ)V\"/>\n\t</class>\n\t<class name=\"android/widget/RelativeLayout\" since=\"1\">\n\t\t<extends name=\"android/view/ViewGroup\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/RelativeLayout$LayoutParams;\"/>\n\t\t<method name=\"getGravity()I\" since=\"16\"/>\n\t\t<method name=\"getIgnoreGravity()I\" since=\"29\"/>\n\t\t<method name=\"setGravity(I)V\"/>\n\t\t<method name=\"setHorizontalGravity(I)V\"/>\n\t\t<method name=\"setIgnoreGravity(I)V\"/>\n\t\t<method name=\"setVerticalGravity(I)V\"/>\n\t\t<field name=\"ABOVE\"/>\n\t\t<field name=\"ALIGN_BASELINE\"/>\n\t\t<field name=\"ALIGN_BOTTOM\"/>\n\t\t<field name=\"ALIGN_END\" since=\"17\"/>\n\t\t<field name=\"ALIGN_LEFT\"/>\n\t\t<field name=\"ALIGN_PARENT_BOTTOM\"/>\n\t\t<field name=\"ALIGN_PARENT_END\" since=\"17\"/>\n\t\t<field name=\"ALIGN_PARENT_LEFT\"/>\n\t\t<field name=\"ALIGN_PARENT_RIGHT\"/>\n\t\t<field name=\"ALIGN_PARENT_START\" since=\"17\"/>\n\t\t<field name=\"ALIGN_PARENT_TOP\"/>\n\t\t<field name=\"ALIGN_RIGHT\"/>\n\t\t<field name=\"ALIGN_START\" since=\"17\"/>\n\t\t<field name=\"ALIGN_TOP\"/>\n\t\t<field name=\"BELOW\"/>\n\t\t<field name=\"CENTER_HORIZONTAL\"/>\n\t\t<field name=\"CENTER_IN_PARENT\"/>\n\t\t<field name=\"CENTER_VERTICAL\"/>\n\t\t<field name=\"END_OF\" since=\"17\"/>\n\t\t<field name=\"LEFT_OF\"/>\n\t\t<field name=\"RIGHT_OF\"/>\n\t\t<field name=\"START_OF\" since=\"17\"/>\n\t\t<field name=\"TRUE\"/>\n\t</class>\n\t<class name=\"android/widget/RelativeLayout$LayoutParams\" since=\"1\">\n\t\t<extends name=\"android/view/ViewGroup$MarginLayoutParams\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/widget/RelativeLayout$LayoutParams;)V\" since=\"19\"/>\n\t\t<method name=\"addRule(I)V\"/>\n\t\t<method name=\"addRule(II)V\"/>\n\t\t<method name=\"debug(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getRule(I)I\" since=\"23\"/>\n\t\t<method name=\"getRules()[I\"/>\n\t\t<method name=\"removeRule(I)V\" since=\"17\"/>\n\t\t<field name=\"alignWithParent\"/>\n\t</class>\n\t<class name=\"android/widget/RemoteViews\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/os/Parcelable\"/>\n\t\t<implements name=\"android/view/LayoutInflater$Filter\"/>\n\t\t<method name=\"&lt;init>(Landroid/os/Parcel;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/widget/RemoteViews;)V\" since=\"28\"/>\n\t\t<method name=\"&lt;init>(Landroid/widget/RemoteViews;Landroid/widget/RemoteViews;)V\" since=\"16\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"addView(ILandroid/widget/RemoteViews;)V\" since=\"7\"/>\n\t\t<method name=\"apply(Landroid/content/Context;Landroid/view/ViewGroup;)Landroid/view/View;\"/>\n\t\t<method name=\"clone()Landroid/widget/RemoteViews;\" since=\"9\" deprecated=\"28\"/>\n\t\t<method name=\"getLayoutId()I\"/>\n\t\t<method name=\"getPackage()Ljava/lang/String;\"/>\n\t\t<method name=\"reapply(Landroid/content/Context;Landroid/view/View;)V\"/>\n\t\t<method name=\"removeAllViews(I)V\" since=\"7\"/>\n\t\t<method name=\"setAccessibilityTraversalAfter(II)V\" since=\"22\"/>\n\t\t<method name=\"setAccessibilityTraversalBefore(II)V\" since=\"22\"/>\n\t\t<method name=\"setBitmap(ILjava/lang/String;Landroid/graphics/Bitmap;)V\" since=\"3\"/>\n\t\t<method name=\"setBoolean(ILjava/lang/String;Z)V\" since=\"3\"/>\n\t\t<method name=\"setBundle(ILjava/lang/String;Landroid/os/Bundle;)V\" since=\"8\"/>\n\t\t<method name=\"setByte(ILjava/lang/String;B)V\" since=\"3\"/>\n\t\t<method name=\"setChar(ILjava/lang/String;C)V\" since=\"3\"/>\n\t\t<method name=\"setCharSequence(ILjava/lang/String;Ljava/lang/CharSequence;)V\" since=\"3\"/>\n\t\t<method name=\"setChronometer(IJLjava/lang/String;Z)V\"/>\n\t\t<method name=\"setChronometerCountDown(IZ)V\" since=\"24\"/>\n\t\t<method name=\"setContentDescription(ILjava/lang/CharSequence;)V\" since=\"15\"/>\n\t\t<method name=\"setDisplayedChild(II)V\" since=\"12\"/>\n\t\t<method name=\"setDouble(ILjava/lang/String;D)V\" since=\"3\"/>\n\t\t<method name=\"setEmptyView(II)V\" since=\"11\"/>\n\t\t<method name=\"setFloat(ILjava/lang/String;F)V\" since=\"3\"/>\n\t\t<method name=\"setIcon(ILjava/lang/String;Landroid/graphics/drawable/Icon;)V\" since=\"23\"/>\n\t\t<method name=\"setImageViewBitmap(ILandroid/graphics/Bitmap;)V\" since=\"3\"/>\n\t\t<method name=\"setImageViewIcon(ILandroid/graphics/drawable/Icon;)V\" since=\"23\"/>\n\t\t<method name=\"setImageViewResource(II)V\"/>\n\t\t<method name=\"setImageViewUri(ILandroid/net/Uri;)V\"/>\n\t\t<method name=\"setInt(ILjava/lang/String;I)V\" since=\"3\"/>\n\t\t<method name=\"setIntent(ILjava/lang/String;Landroid/content/Intent;)V\" since=\"11\"/>\n\t\t<method name=\"setLabelFor(II)V\" since=\"17\"/>\n\t\t<method name=\"setLightBackgroundLayoutId(I)V\" since=\"29\"/>\n\t\t<method name=\"setLong(ILjava/lang/String;J)V\" since=\"3\"/>\n\t\t<method name=\"setOnClickFillInIntent(ILandroid/content/Intent;)V\" since=\"11\"/>\n\t\t<method name=\"setOnClickPendingIntent(ILandroid/app/PendingIntent;)V\" since=\"3\"/>\n\t\t<method name=\"setOnClickResponse(ILandroid/widget/RemoteViews$RemoteResponse;)V\" since=\"29\"/>\n\t\t<method name=\"setPendingIntentTemplate(ILandroid/app/PendingIntent;)V\" since=\"11\"/>\n\t\t<method name=\"setProgressBar(IIIZ)V\"/>\n\t\t<method name=\"setRelativeScrollPosition(II)V\" since=\"11\"/>\n\t\t<method name=\"setRemoteAdapter(IILandroid/content/Intent;)V\" since=\"11\" deprecated=\"15\"/>\n\t\t<method name=\"setRemoteAdapter(ILandroid/content/Intent;)V\" since=\"14\"/>\n\t\t<method name=\"setScrollPosition(II)V\" since=\"11\"/>\n\t\t<method name=\"setShort(ILjava/lang/String;S)V\" since=\"3\"/>\n\t\t<method name=\"setString(ILjava/lang/String;Ljava/lang/String;)V\" since=\"3\"/>\n\t\t<method name=\"setTextColor(II)V\" since=\"3\"/>\n\t\t<method name=\"setTextViewCompoundDrawables(IIIII)V\" since=\"16\"/>\n\t\t<method name=\"setTextViewCompoundDrawablesRelative(IIIII)V\" since=\"16\"/>\n\t\t<method name=\"setTextViewText(ILjava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setTextViewTextSize(IIF)V\" since=\"16\"/>\n\t\t<method name=\"setUri(ILjava/lang/String;Landroid/net/Uri;)V\" since=\"3\"/>\n\t\t<method name=\"setViewPadding(IIIII)V\" since=\"16\"/>\n\t\t<method name=\"setViewVisibility(II)V\"/>\n\t\t<method name=\"showNext(I)V\" since=\"11\"/>\n\t\t<method name=\"showPrevious(I)V\" since=\"11\"/>\n\t\t<field name=\"CREATOR\"/>\n\t\t<field name=\"EXTRA_SHARED_ELEMENT_BOUNDS\" since=\"29\"/>\n\t</class>\n\t<class name=\"android/widget/RemoteViews$ActionException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Exception;)V\" since=\"3\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/widget/RemoteViews$RemoteResponse\" since=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addSharedElement(ILjava/lang/String;)Landroid/widget/RemoteViews$RemoteResponse;\"/>\n\t\t<method name=\"fromFillInIntent(Landroid/content/Intent;)Landroid/widget/RemoteViews$RemoteResponse;\"/>\n\t\t<method name=\"fromPendingIntent(Landroid/app/PendingIntent;)Landroid/widget/RemoteViews$RemoteResponse;\"/>\n\t</class>\n\t<class name=\"android/widget/RemoteViews$RemoteView\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t</class>\n\t<class name=\"android/widget/RemoteViewsService\" since=\"11\">\n\t\t<extends name=\"android/app/Service\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"onGetViewFactory(Landroid/content/Intent;)Landroid/widget/RemoteViewsService$RemoteViewsFactory;\"/>\n\t</class>\n\t<class name=\"android/widget/RemoteViewsService$RemoteViewsFactory\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getCount()I\"/>\n\t\t<method name=\"getItemId(I)J\"/>\n\t\t<method name=\"getLoadingView()Landroid/widget/RemoteViews;\"/>\n\t\t<method name=\"getViewAt(I)Landroid/widget/RemoteViews;\"/>\n\t\t<method name=\"getViewTypeCount()I\"/>\n\t\t<method name=\"hasStableIds()Z\"/>\n\t\t<method name=\"onCreate()V\"/>\n\t\t<method name=\"onDataSetChanged()V\"/>\n\t\t<method name=\"onDestroy()V\"/>\n\t</class>\n\t<class name=\"android/widget/ResourceCursorAdapter\" since=\"1\">\n\t\t<extends name=\"android/widget/CursorAdapter\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;ILandroid/database/Cursor;)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;ILandroid/database/Cursor;I)V\" since=\"11\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;ILandroid/database/Cursor;Z)V\" since=\"3\"/>\n\t\t<method name=\"setDropDownViewResource(I)V\"/>\n\t\t<method name=\"setViewResource(I)V\" since=\"3\"/>\n\t</class>\n\t<class name=\"android/widget/ResourceCursorTreeAdapter\" since=\"1\">\n\t\t<extends name=\"android/widget/CursorTreeAdapter\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/database/Cursor;II)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/database/Cursor;III)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/database/Cursor;IIII)V\"/>\n\t</class>\n\t<class name=\"android/widget/ScrollView\" since=\"1\">\n\t\t<extends name=\"android/widget/FrameLayout\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"arrowScroll(I)Z\"/>\n\t\t<method name=\"computeScrollDeltaToGetChildRectOnScreen(Landroid/graphics/Rect;)I\"/>\n\t\t<method name=\"executeKeyEvent(Landroid/view/KeyEvent;)Z\"/>\n\t\t<method name=\"fling(I)V\"/>\n\t\t<method name=\"fullScroll(I)Z\"/>\n\t\t<method name=\"getBottomEdgeEffectColor()I\" since=\"29\"/>\n\t\t<method name=\"getMaxScrollAmount()I\"/>\n\t\t<method name=\"getTopEdgeEffectColor()I\" since=\"29\"/>\n\t\t<method name=\"isFillViewport()Z\"/>\n\t\t<method name=\"isSmoothScrollingEnabled()Z\"/>\n\t\t<method name=\"pageScroll(I)Z\"/>\n\t\t<method name=\"scrollToDescendant(Landroid/view/View;)V\" since=\"29\"/>\n\t\t<method name=\"setBottomEdgeEffectColor(I)V\" since=\"29\"/>\n\t\t<method name=\"setEdgeEffectColor(I)V\" since=\"29\"/>\n\t\t<method name=\"setFillViewport(Z)V\"/>\n\t\t<method name=\"setSmoothScrollingEnabled(Z)V\"/>\n\t\t<method name=\"setTopEdgeEffectColor(I)V\" since=\"29\"/>\n\t\t<method name=\"smoothScrollBy(II)V\"/>\n\t\t<method name=\"smoothScrollTo(II)V\"/>\n\t</class>\n\t<class name=\"android/widget/Scroller\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/view/animation/Interpolator;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/view/animation/Interpolator;Z)V\" since=\"11\"/>\n\t\t<method name=\"abortAnimation()V\"/>\n\t\t<method name=\"computeScrollOffset()Z\"/>\n\t\t<method name=\"extendDuration(I)V\"/>\n\t\t<method name=\"fling(IIIIIIII)V\"/>\n\t\t<method name=\"forceFinished(Z)V\"/>\n\t\t<method name=\"getCurrVelocity()F\" since=\"14\"/>\n\t\t<method name=\"getCurrX()I\"/>\n\t\t<method name=\"getCurrY()I\"/>\n\t\t<method name=\"getDuration()I\"/>\n\t\t<method name=\"getFinalX()I\"/>\n\t\t<method name=\"getFinalY()I\"/>\n\t\t<method name=\"getStartX()I\" since=\"3\"/>\n\t\t<method name=\"getStartY()I\" since=\"3\"/>\n\t\t<method name=\"isFinished()Z\"/>\n\t\t<method name=\"setFinalX(I)V\"/>\n\t\t<method name=\"setFinalY(I)V\"/>\n\t\t<method name=\"setFriction(F)V\" since=\"11\"/>\n\t\t<method name=\"startScroll(IIII)V\"/>\n\t\t<method name=\"startScroll(IIIII)V\"/>\n\t\t<method name=\"timePassed()I\"/>\n\t</class>\n\t<class name=\"android/widget/SearchView\" since=\"11\">\n\t\t<extends name=\"android/widget/LinearLayout\"/>\n\t\t<implements name=\"android/view/CollapsibleActionView\" since=\"14\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" since=\"21\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"getImeOptions()I\" since=\"16\"/>\n\t\t<method name=\"getInputType()I\" since=\"16\"/>\n\t\t<method name=\"getMaxWidth()I\" since=\"16\"/>\n\t\t<method name=\"getQuery()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getQueryHint()Ljava/lang/CharSequence;\" since=\"16\"/>\n\t\t<method name=\"getSuggestionsAdapter()Landroid/widget/CursorAdapter;\"/>\n\t\t<method name=\"isIconfiedByDefault()Z\" deprecated=\"29\"/>\n\t\t<method name=\"isIconified()Z\"/>\n\t\t<method name=\"isIconifiedByDefault()Z\" since=\"29\"/>\n\t\t<method name=\"isQueryRefinementEnabled()Z\"/>\n\t\t<method name=\"isSubmitButtonEnabled()Z\"/>\n\t\t<method name=\"setIconified(Z)V\"/>\n\t\t<method name=\"setIconifiedByDefault(Z)V\"/>\n\t\t<method name=\"setImeOptions(I)V\" since=\"14\"/>\n\t\t<method name=\"setInputType(I)V\" since=\"14\"/>\n\t\t<method name=\"setMaxWidth(I)V\"/>\n\t\t<method name=\"setOnCloseListener(Landroid/widget/SearchView$OnCloseListener;)V\"/>\n\t\t<method name=\"setOnQueryTextFocusChangeListener(Landroid/view/View$OnFocusChangeListener;)V\"/>\n\t\t<method name=\"setOnQueryTextListener(Landroid/widget/SearchView$OnQueryTextListener;)V\"/>\n\t\t<method name=\"setOnSearchClickListener(Landroid/view/View$OnClickListener;)V\"/>\n\t\t<method name=\"setOnSuggestionListener(Landroid/widget/SearchView$OnSuggestionListener;)V\"/>\n\t\t<method name=\"setQuery(Ljava/lang/CharSequence;Z)V\"/>\n\t\t<method name=\"setQueryHint(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setQueryRefinementEnabled(Z)V\"/>\n\t\t<method name=\"setSearchableInfo(Landroid/app/SearchableInfo;)V\"/>\n\t\t<method name=\"setSubmitButtonEnabled(Z)V\"/>\n\t\t<method name=\"setSuggestionsAdapter(Landroid/widget/CursorAdapter;)V\"/>\n\t</class>\n\t<class name=\"android/widget/SearchView$OnCloseListener\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onClose()Z\"/>\n\t</class>\n\t<class name=\"android/widget/SearchView$OnQueryTextListener\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onQueryTextChange(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"onQueryTextSubmit(Ljava/lang/String;)Z\"/>\n\t</class>\n\t<class name=\"android/widget/SearchView$OnSuggestionListener\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onSuggestionClick(I)Z\"/>\n\t\t<method name=\"onSuggestionSelect(I)Z\"/>\n\t</class>\n\t<class name=\"android/widget/SectionIndexer\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getPositionForSection(I)I\"/>\n\t\t<method name=\"getSectionForPosition(I)I\"/>\n\t\t<method name=\"getSections()[Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"android/widget/SeekBar\" since=\"1\">\n\t\t<extends name=\"android/widget/AbsSeekBar\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"setOnSeekBarChangeListener(Landroid/widget/SeekBar$OnSeekBarChangeListener;)V\"/>\n\t</class>\n\t<class name=\"android/widget/SeekBar$OnSeekBarChangeListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onProgressChanged(Landroid/widget/SeekBar;IZ)V\"/>\n\t\t<method name=\"onStartTrackingTouch(Landroid/widget/SeekBar;)V\"/>\n\t\t<method name=\"onStopTrackingTouch(Landroid/widget/SeekBar;)V\"/>\n\t</class>\n\t<class name=\"android/widget/ShareActionProvider\" since=\"14\">\n\t\t<extends name=\"android/view/ActionProvider\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"setOnShareTargetSelectedListener(Landroid/widget/ShareActionProvider$OnShareTargetSelectedListener;)V\"/>\n\t\t<method name=\"setShareHistoryFileName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setShareIntent(Landroid/content/Intent;)V\"/>\n\t\t<field name=\"DEFAULT_SHARE_HISTORY_FILE_NAME\"/>\n\t</class>\n\t<class name=\"android/widget/ShareActionProvider$OnShareTargetSelectedListener\" since=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onShareTargetSelected(Landroid/widget/ShareActionProvider;Landroid/content/Intent;)Z\"/>\n\t</class>\n\t<class name=\"android/widget/SimpleAdapter\" since=\"1\">\n\t\t<extends name=\"android/widget/BaseAdapter\"/>\n\t\t<implements name=\"android/widget/Filterable\"/>\n\t\t<implements name=\"android/widget/ThemedSpinnerAdapter\" since=\"23\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/util/List;I[Ljava/lang/String;[I)V\"/>\n\t\t<method name=\"getViewBinder()Landroid/widget/SimpleAdapter$ViewBinder;\"/>\n\t\t<method name=\"setDropDownViewResource(I)V\"/>\n\t\t<method name=\"setViewBinder(Landroid/widget/SimpleAdapter$ViewBinder;)V\"/>\n\t\t<method name=\"setViewImage(Landroid/widget/ImageView;I)V\"/>\n\t\t<method name=\"setViewImage(Landroid/widget/ImageView;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setViewText(Landroid/widget/TextView;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/widget/SimpleAdapter$ViewBinder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"setViewValue(Landroid/view/View;Ljava/lang/Object;Ljava/lang/String;)Z\"/>\n\t</class>\n\t<class name=\"android/widget/SimpleCursorAdapter\" since=\"1\">\n\t\t<extends name=\"android/widget/ResourceCursorAdapter\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;ILandroid/database/Cursor;[Ljava/lang/String;[I)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;ILandroid/database/Cursor;[Ljava/lang/String;[II)V\" since=\"11\"/>\n\t\t<method name=\"changeCursorAndColumns(Landroid/database/Cursor;[Ljava/lang/String;[I)V\" since=\"3\"/>\n\t\t<method name=\"getCursorToStringConverter()Landroid/widget/SimpleCursorAdapter$CursorToStringConverter;\"/>\n\t\t<method name=\"getStringConversionColumn()I\"/>\n\t\t<method name=\"getViewBinder()Landroid/widget/SimpleCursorAdapter$ViewBinder;\"/>\n\t\t<method name=\"setCursorToStringConverter(Landroid/widget/SimpleCursorAdapter$CursorToStringConverter;)V\"/>\n\t\t<method name=\"setStringConversionColumn(I)V\"/>\n\t\t<method name=\"setViewBinder(Landroid/widget/SimpleCursorAdapter$ViewBinder;)V\"/>\n\t\t<method name=\"setViewImage(Landroid/widget/ImageView;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setViewText(Landroid/widget/TextView;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/widget/SimpleCursorAdapter$CursorToStringConverter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"convertToString(Landroid/database/Cursor;)Ljava/lang/CharSequence;\"/>\n\t</class>\n\t<class name=\"android/widget/SimpleCursorAdapter$ViewBinder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"setViewValue(Landroid/view/View;Landroid/database/Cursor;I)Z\"/>\n\t</class>\n\t<class name=\"android/widget/SimpleCursorTreeAdapter\" since=\"1\">\n\t\t<extends name=\"android/widget/ResourceCursorTreeAdapter\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/database/Cursor;II[Ljava/lang/String;[III[Ljava/lang/String;[I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/database/Cursor;II[Ljava/lang/String;[II[Ljava/lang/String;[I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/database/Cursor;I[Ljava/lang/String;[II[Ljava/lang/String;[I)V\"/>\n\t\t<method name=\"getViewBinder()Landroid/widget/SimpleCursorTreeAdapter$ViewBinder;\" since=\"5\"/>\n\t\t<method name=\"setViewBinder(Landroid/widget/SimpleCursorTreeAdapter$ViewBinder;)V\" since=\"5\"/>\n\t\t<method name=\"setViewImage(Landroid/widget/ImageView;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setViewText(Landroid/widget/TextView;Ljava/lang/String;)V\" since=\"5\"/>\n\t</class>\n\t<class name=\"android/widget/SimpleCursorTreeAdapter$ViewBinder\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"setViewValue(Landroid/view/View;Landroid/database/Cursor;I)Z\"/>\n\t</class>\n\t<class name=\"android/widget/SimpleExpandableListAdapter\" since=\"1\">\n\t\t<extends name=\"android/widget/BaseExpandableListAdapter\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/util/List;II[Ljava/lang/String;[ILjava/util/List;II[Ljava/lang/String;[I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/util/List;II[Ljava/lang/String;[ILjava/util/List;I[Ljava/lang/String;[I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/util/List;I[Ljava/lang/String;[ILjava/util/List;I[Ljava/lang/String;[I)V\"/>\n\t\t<method name=\"newChildView(ZLandroid/view/ViewGroup;)Landroid/view/View;\"/>\n\t\t<method name=\"newGroupView(ZLandroid/view/ViewGroup;)Landroid/view/View;\"/>\n\t</class>\n\t<class name=\"android/widget/SlidingDrawer\" since=\"3\" deprecated=\"17\">\n\t\t<extends name=\"android/view/ViewGroup\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"animateClose()V\" deprecated=\"29\"/>\n\t\t<method name=\"animateOpen()V\" deprecated=\"29\"/>\n\t\t<method name=\"animateToggle()V\" deprecated=\"29\"/>\n\t\t<method name=\"close()V\" deprecated=\"29\"/>\n\t\t<method name=\"getContent()Landroid/view/View;\" deprecated=\"29\"/>\n\t\t<method name=\"getHandle()Landroid/view/View;\" deprecated=\"29\"/>\n\t\t<method name=\"isMoving()Z\" deprecated=\"29\"/>\n\t\t<method name=\"isOpened()Z\" deprecated=\"29\"/>\n\t\t<method name=\"lock()V\" deprecated=\"29\"/>\n\t\t<method name=\"open()V\" deprecated=\"29\"/>\n\t\t<method name=\"setOnDrawerCloseListener(Landroid/widget/SlidingDrawer$OnDrawerCloseListener;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setOnDrawerOpenListener(Landroid/widget/SlidingDrawer$OnDrawerOpenListener;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setOnDrawerScrollListener(Landroid/widget/SlidingDrawer$OnDrawerScrollListener;)V\" deprecated=\"29\"/>\n\t\t<method name=\"toggle()V\" deprecated=\"29\"/>\n\t\t<method name=\"unlock()V\" deprecated=\"29\"/>\n\t\t<field name=\"ORIENTATION_HORIZONTAL\" deprecated=\"29\"/>\n\t\t<field name=\"ORIENTATION_VERTICAL\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/widget/SlidingDrawer$OnDrawerCloseListener\" since=\"3\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDrawerClosed()V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/widget/SlidingDrawer$OnDrawerOpenListener\" since=\"3\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onDrawerOpened()V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/widget/SlidingDrawer$OnDrawerScrollListener\" since=\"3\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onScrollEnded()V\" deprecated=\"29\"/>\n\t\t<method name=\"onScrollStarted()V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/widget/Space\" since=\"14\">\n\t\t<extends name=\"android/view/View\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/widget/Spinner\" since=\"1\">\n\t\t<extends name=\"android/widget/AbsSpinner\"/>\n\t\t<implements name=\"android/content/DialogInterface$OnClickListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;I)V\" since=\"11\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"11\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;III)V\" since=\"21\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;IIILandroid/content/res/Resources$Theme;)V\" since=\"23\"/>\n\t\t<method name=\"getDropDownHorizontalOffset()I\" since=\"16\"/>\n\t\t<method name=\"getDropDownVerticalOffset()I\" since=\"16\"/>\n\t\t<method name=\"getDropDownWidth()I\" since=\"16\"/>\n\t\t<method name=\"getGravity()I\" since=\"16\"/>\n\t\t<method name=\"getPopupBackground()Landroid/graphics/drawable/Drawable;\" since=\"16\"/>\n\t\t<method name=\"getPopupContext()Landroid/content/Context;\" since=\"23\"/>\n\t\t<method name=\"getPrompt()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"setDropDownHorizontalOffset(I)V\" since=\"16\"/>\n\t\t<method name=\"setDropDownVerticalOffset(I)V\" since=\"16\"/>\n\t\t<method name=\"setDropDownWidth(I)V\" since=\"16\"/>\n\t\t<method name=\"setGravity(I)V\" since=\"11\"/>\n\t\t<method name=\"setPopupBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V\" since=\"16\"/>\n\t\t<method name=\"setPopupBackgroundResource(I)V\" since=\"16\"/>\n\t\t<method name=\"setPrompt(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setPromptId(I)V\"/>\n\t\t<field name=\"MODE_DIALOG\" since=\"11\"/>\n\t\t<field name=\"MODE_DROPDOWN\" since=\"11\"/>\n\t</class>\n\t<class name=\"android/widget/SpinnerAdapter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/widget/Adapter\"/>\n\t\t<method name=\"getDropDownView(ILandroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View;\"/>\n\t</class>\n\t<class name=\"android/widget/StackView\" since=\"11\">\n\t\t<extends name=\"android/widget/AdapterViewAnimator\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" since=\"14\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t</class>\n\t<class name=\"android/widget/Switch\" since=\"14\">\n\t\t<extends name=\"android/widget/CompoundButton\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"getShowText()Z\" since=\"21\"/>\n\t\t<method name=\"getSplitTrack()Z\" since=\"21\"/>\n\t\t<method name=\"getSwitchMinWidth()I\" since=\"16\"/>\n\t\t<method name=\"getSwitchPadding()I\" since=\"16\"/>\n\t\t<method name=\"getTextOff()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTextOn()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getThumbDrawable()Landroid/graphics/drawable/Drawable;\" since=\"16\"/>\n\t\t<method name=\"getThumbTextPadding()I\" since=\"16\"/>\n\t\t<method name=\"getThumbTintBlendMode()Landroid/graphics/BlendMode;\" since=\"29\"/>\n\t\t<method name=\"getThumbTintList()Landroid/content/res/ColorStateList;\" since=\"23\"/>\n\t\t<method name=\"getThumbTintMode()Landroid/graphics/PorterDuff$Mode;\" since=\"23\"/>\n\t\t<method name=\"getTrackDrawable()Landroid/graphics/drawable/Drawable;\" since=\"16\"/>\n\t\t<method name=\"getTrackTintBlendMode()Landroid/graphics/BlendMode;\" since=\"29\"/>\n\t\t<method name=\"getTrackTintList()Landroid/content/res/ColorStateList;\" since=\"23\"/>\n\t\t<method name=\"getTrackTintMode()Landroid/graphics/PorterDuff$Mode;\" since=\"23\"/>\n\t\t<method name=\"setShowText(Z)V\" since=\"21\"/>\n\t\t<method name=\"setSplitTrack(Z)V\" since=\"21\"/>\n\t\t<method name=\"setSwitchMinWidth(I)V\" since=\"16\"/>\n\t\t<method name=\"setSwitchPadding(I)V\" since=\"16\"/>\n\t\t<method name=\"setSwitchTextAppearance(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"setSwitchTypeface(Landroid/graphics/Typeface;)V\"/>\n\t\t<method name=\"setSwitchTypeface(Landroid/graphics/Typeface;I)V\"/>\n\t\t<method name=\"setTextOff(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setTextOn(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setThumbDrawable(Landroid/graphics/drawable/Drawable;)V\" since=\"16\"/>\n\t\t<method name=\"setThumbResource(I)V\" since=\"16\"/>\n\t\t<method name=\"setThumbTextPadding(I)V\" since=\"16\"/>\n\t\t<method name=\"setThumbTintBlendMode(Landroid/graphics/BlendMode;)V\" since=\"29\"/>\n\t\t<method name=\"setThumbTintList(Landroid/content/res/ColorStateList;)V\" since=\"23\"/>\n\t\t<method name=\"setThumbTintMode(Landroid/graphics/PorterDuff$Mode;)V\" since=\"23\"/>\n\t\t<method name=\"setTrackDrawable(Landroid/graphics/drawable/Drawable;)V\" since=\"16\"/>\n\t\t<method name=\"setTrackResource(I)V\" since=\"16\"/>\n\t\t<method name=\"setTrackTintBlendMode(Landroid/graphics/BlendMode;)V\" since=\"29\"/>\n\t\t<method name=\"setTrackTintList(Landroid/content/res/ColorStateList;)V\" since=\"23\"/>\n\t\t<method name=\"setTrackTintMode(Landroid/graphics/PorterDuff$Mode;)V\" since=\"23\"/>\n\t</class>\n\t<class name=\"android/widget/TabHost\" since=\"1\">\n\t\t<extends name=\"android/widget/FrameLayout\"/>\n\t\t<implements name=\"android/view/ViewTreeObserver$OnTouchModeChangeListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" since=\"21\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"addTab(Landroid/widget/TabHost$TabSpec;)V\"/>\n\t\t<method name=\"clearAllTabs()V\"/>\n\t\t<method name=\"getCurrentTab()I\"/>\n\t\t<method name=\"getCurrentTabTag()Ljava/lang/String;\"/>\n\t\t<method name=\"getCurrentTabView()Landroid/view/View;\"/>\n\t\t<method name=\"getCurrentView()Landroid/view/View;\"/>\n\t\t<method name=\"getTabContentView()Landroid/widget/FrameLayout;\"/>\n\t\t<method name=\"getTabWidget()Landroid/widget/TabWidget;\"/>\n\t\t<method name=\"newTabSpec(Ljava/lang/String;)Landroid/widget/TabHost$TabSpec;\"/>\n\t\t<method name=\"setCurrentTab(I)V\"/>\n\t\t<method name=\"setCurrentTabByTag(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setOnTabChangedListener(Landroid/widget/TabHost$OnTabChangeListener;)V\"/>\n\t\t<method name=\"setup()V\"/>\n\t\t<method name=\"setup(Landroid/app/LocalActivityManager;)V\"/>\n\t</class>\n\t<class name=\"android/widget/TabHost$OnTabChangeListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onTabChanged(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"android/widget/TabHost$TabContentFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createTabContent(Ljava/lang/String;)Landroid/view/View;\"/>\n\t</class>\n\t<class name=\"android/widget/TabHost$TabSpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getTag()Ljava/lang/String;\" since=\"4\"/>\n\t\t<method name=\"setContent(I)Landroid/widget/TabHost$TabSpec;\"/>\n\t\t<method name=\"setContent(Landroid/content/Intent;)Landroid/widget/TabHost$TabSpec;\"/>\n\t\t<method name=\"setContent(Landroid/widget/TabHost$TabContentFactory;)Landroid/widget/TabHost$TabSpec;\"/>\n\t\t<method name=\"setIndicator(Landroid/view/View;)Landroid/widget/TabHost$TabSpec;\" since=\"4\"/>\n\t\t<method name=\"setIndicator(Ljava/lang/CharSequence;)Landroid/widget/TabHost$TabSpec;\"/>\n\t\t<method name=\"setIndicator(Ljava/lang/CharSequence;Landroid/graphics/drawable/Drawable;)Landroid/widget/TabHost$TabSpec;\"/>\n\t</class>\n\t<class name=\"android/widget/TabWidget\" since=\"1\">\n\t\t<extends name=\"android/widget/LinearLayout\"/>\n\t\t<implements name=\"android/view/View$OnFocusChangeListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"focusCurrentTab(I)V\"/>\n\t\t<method name=\"getChildTabViewAt(I)Landroid/view/View;\" since=\"4\"/>\n\t\t<method name=\"getLeftStripDrawable()Landroid/graphics/drawable/Drawable;\" since=\"24\"/>\n\t\t<method name=\"getRightStripDrawable()Landroid/graphics/drawable/Drawable;\" since=\"24\"/>\n\t\t<method name=\"getTabCount()I\" since=\"4\"/>\n\t\t<method name=\"isStripEnabled()Z\" since=\"8\"/>\n\t\t<method name=\"setCurrentTab(I)V\"/>\n\t\t<method name=\"setDividerDrawable(I)V\" since=\"4\"/>\n\t\t<method name=\"setDividerDrawable(Landroid/graphics/drawable/Drawable;)V\" since=\"4\"/>\n\t\t<method name=\"setLeftStripDrawable(I)V\" since=\"8\"/>\n\t\t<method name=\"setLeftStripDrawable(Landroid/graphics/drawable/Drawable;)V\" since=\"8\"/>\n\t\t<method name=\"setRightStripDrawable(I)V\" since=\"8\"/>\n\t\t<method name=\"setRightStripDrawable(Landroid/graphics/drawable/Drawable;)V\" since=\"8\"/>\n\t\t<method name=\"setStripEnabled(Z)V\" since=\"8\"/>\n\t</class>\n\t<class name=\"android/widget/TableLayout\" since=\"1\">\n\t\t<extends name=\"android/widget/LinearLayout\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/TableLayout$LayoutParams;\"/>\n\t\t<method name=\"isColumnCollapsed(I)Z\"/>\n\t\t<method name=\"isColumnShrinkable(I)Z\"/>\n\t\t<method name=\"isColumnStretchable(I)Z\"/>\n\t\t<method name=\"isShrinkAllColumns()Z\"/>\n\t\t<method name=\"isStretchAllColumns()Z\"/>\n\t\t<method name=\"setColumnCollapsed(IZ)V\"/>\n\t\t<method name=\"setColumnShrinkable(IZ)V\"/>\n\t\t<method name=\"setColumnStretchable(IZ)V\"/>\n\t\t<method name=\"setShrinkAllColumns(Z)V\"/>\n\t\t<method name=\"setStretchAllColumns(Z)V\"/>\n\t</class>\n\t<class name=\"android/widget/TableLayout$LayoutParams\" since=\"1\">\n\t\t<extends name=\"android/widget/LinearLayout$LayoutParams\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(IIF)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V\"/>\n\t</class>\n\t<class name=\"android/widget/TableRow\" since=\"1\">\n\t\t<extends name=\"android/widget/LinearLayout\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/TableRow$LayoutParams;\"/>\n\t\t<method name=\"getVirtualChildAt(I)Landroid/view/View;\"/>\n\t\t<method name=\"getVirtualChildCount()I\"/>\n\t</class>\n\t<class name=\"android/widget/TableRow$LayoutParams\" since=\"1\">\n\t\t<extends name=\"android/widget/LinearLayout$LayoutParams\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(IIF)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V\"/>\n\t\t<field name=\"column\"/>\n\t\t<field name=\"span\"/>\n\t</class>\n\t<class name=\"android/widget/TextClock\" since=\"17\">\n\t\t<extends name=\"android/widget/TextView\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"getFormat12Hour()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getFormat24Hour()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTimeZone()Ljava/lang/String;\"/>\n\t\t<method name=\"is24HourModeEnabled()Z\"/>\n\t\t<method name=\"setFormat12Hour(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setFormat24Hour(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setTimeZone(Ljava/lang/String;)V\"/>\n\t\t<field name=\"DEFAULT_FORMAT_12_HOUR\" deprecated=\"18\"/>\n\t\t<field name=\"DEFAULT_FORMAT_24_HOUR\" deprecated=\"18\"/>\n\t</class>\n\t<class name=\"android/widget/TextSwitcher\" since=\"1\">\n\t\t<extends name=\"android/widget/ViewSwitcher\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"setCurrentText(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setText(Ljava/lang/CharSequence;)V\"/>\n\t</class>\n\t<class name=\"android/widget/TextView\" since=\"1\">\n\t\t<extends name=\"android/view/View\"/>\n\t\t<implements name=\"android/view/ViewTreeObserver$OnPreDrawListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"addTextChangedListener(Landroid/text/TextWatcher;)V\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;II)V\"/>\n\t\t<method name=\"beginBatchEdit()V\" since=\"3\"/>\n\t\t<method name=\"bringPointIntoView(I)Z\" since=\"3\"/>\n\t\t<method name=\"clearComposingText()V\" since=\"3\"/>\n\t\t<method name=\"debug(I)V\"/>\n\t\t<method name=\"didTouchFocusSelect()Z\" since=\"3\"/>\n\t\t<method name=\"endBatchEdit()V\" since=\"3\"/>\n\t\t<method name=\"extractText(Landroid/view/inputmethod/ExtractedTextRequest;Landroid/view/inputmethod/ExtractedText;)Z\" since=\"3\"/>\n\t\t<method name=\"getAutoLinkMask()I\"/>\n\t\t<method name=\"getAutoSizeMaxTextSize()I\" since=\"26\"/>\n\t\t<method name=\"getAutoSizeMinTextSize()I\" since=\"26\"/>\n\t\t<method name=\"getAutoSizeStepGranularity()I\" since=\"26\"/>\n\t\t<method name=\"getAutoSizeTextAvailableSizes()[I\" since=\"26\"/>\n\t\t<method name=\"getAutoSizeTextType()I\" since=\"26\"/>\n\t\t<method name=\"getBreakStrategy()I\" since=\"23\"/>\n\t\t<method name=\"getCompoundDrawablePadding()I\"/>\n\t\t<method name=\"getCompoundDrawableTintBlendMode()Landroid/graphics/BlendMode;\" since=\"29\"/>\n\t\t<method name=\"getCompoundDrawableTintList()Landroid/content/res/ColorStateList;\" since=\"23\"/>\n\t\t<method name=\"getCompoundDrawableTintMode()Landroid/graphics/PorterDuff$Mode;\" since=\"23\"/>\n\t\t<method name=\"getCompoundDrawables()[Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getCompoundDrawablesRelative()[Landroid/graphics/drawable/Drawable;\" since=\"17\"/>\n\t\t<method name=\"getCompoundPaddingBottom()I\"/>\n\t\t<method name=\"getCompoundPaddingEnd()I\" since=\"17\"/>\n\t\t<method name=\"getCompoundPaddingLeft()I\"/>\n\t\t<method name=\"getCompoundPaddingRight()I\"/>\n\t\t<method name=\"getCompoundPaddingStart()I\" since=\"17\"/>\n\t\t<method name=\"getCompoundPaddingTop()I\"/>\n\t\t<method name=\"getCurrentHintTextColor()I\"/>\n\t\t<method name=\"getCurrentTextColor()I\"/>\n\t\t<method name=\"getCustomInsertionActionModeCallback()Landroid/view/ActionMode$Callback;\" since=\"23\"/>\n\t\t<method name=\"getCustomSelectionActionModeCallback()Landroid/view/ActionMode$Callback;\" since=\"11\"/>\n\t\t<method name=\"getDefaultEditable()Z\"/>\n\t\t<method name=\"getDefaultMovementMethod()Landroid/text/method/MovementMethod;\"/>\n\t\t<method name=\"getEditableText()Landroid/text/Editable;\" since=\"3\"/>\n\t\t<method name=\"getEllipsize()Landroid/text/TextUtils$TruncateAt;\"/>\n\t\t<method name=\"getError()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getExtendedPaddingBottom()I\"/>\n\t\t<method name=\"getExtendedPaddingTop()I\"/>\n\t\t<method name=\"getFilters()[Landroid/text/InputFilter;\"/>\n\t\t<method name=\"getFirstBaselineToTopHeight()I\" since=\"28\"/>\n\t\t<method name=\"getFontFeatureSettings()Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"getFontVariationSettings()Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getFreezesText()Z\"/>\n\t\t<method name=\"getGravity()I\"/>\n\t\t<method name=\"getHighlightColor()I\" since=\"16\"/>\n\t\t<method name=\"getHint()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getHintTextColors()Landroid/content/res/ColorStateList;\"/>\n\t\t<method name=\"getHyphenationFrequency()I\" since=\"23\"/>\n\t\t<method name=\"getImeActionId()I\" since=\"3\"/>\n\t\t<method name=\"getImeActionLabel()Ljava/lang/CharSequence;\" since=\"3\"/>\n\t\t<method name=\"getImeHintLocales()Landroid/os/LocaleList;\" since=\"24\"/>\n\t\t<method name=\"getImeOptions()I\" since=\"3\"/>\n\t\t<method name=\"getIncludeFontPadding()Z\" since=\"16\"/>\n\t\t<method name=\"getInputExtras(Z)Landroid/os/Bundle;\" since=\"3\"/>\n\t\t<method name=\"getInputType()I\" since=\"3\"/>\n\t\t<method name=\"getJustificationMode()I\" since=\"26\"/>\n\t\t<method name=\"getKeyListener()Landroid/text/method/KeyListener;\"/>\n\t\t<method name=\"getLastBaselineToBottomHeight()I\" since=\"28\"/>\n\t\t<method name=\"getLayout()Landroid/text/Layout;\"/>\n\t\t<method name=\"getLetterSpacing()F\" since=\"21\"/>\n\t\t<method name=\"getLineBounds(ILandroid/graphics/Rect;)I\"/>\n\t\t<method name=\"getLineCount()I\"/>\n\t\t<method name=\"getLineHeight()I\"/>\n\t\t<method name=\"getLineSpacingExtra()F\" since=\"16\"/>\n\t\t<method name=\"getLineSpacingMultiplier()F\" since=\"16\"/>\n\t\t<method name=\"getLinkTextColors()Landroid/content/res/ColorStateList;\"/>\n\t\t<method name=\"getLinksClickable()Z\"/>\n\t\t<method name=\"getMarqueeRepeatLimit()I\" since=\"16\"/>\n\t\t<method name=\"getMaxEms()I\" since=\"16\"/>\n\t\t<method name=\"getMaxHeight()I\" since=\"16\"/>\n\t\t<method name=\"getMaxLines()I\" since=\"16\"/>\n\t\t<method name=\"getMaxWidth()I\" since=\"16\"/>\n\t\t<method name=\"getMinEms()I\" since=\"16\"/>\n\t\t<method name=\"getMinHeight()I\" since=\"16\"/>\n\t\t<method name=\"getMinLines()I\" since=\"16\"/>\n\t\t<method name=\"getMinWidth()I\" since=\"16\"/>\n\t\t<method name=\"getMovementMethod()Landroid/text/method/MovementMethod;\"/>\n\t\t<method name=\"getOffsetForPosition(FF)I\" since=\"14\"/>\n\t\t<method name=\"getPaint()Landroid/text/TextPaint;\"/>\n\t\t<method name=\"getPaintFlags()I\"/>\n\t\t<method name=\"getPrivateImeOptions()Ljava/lang/String;\" since=\"3\"/>\n\t\t<method name=\"getSelectionEnd()I\"/>\n\t\t<method name=\"getSelectionStart()I\"/>\n\t\t<method name=\"getShadowColor()I\" since=\"16\"/>\n\t\t<method name=\"getShadowDx()F\" since=\"16\"/>\n\t\t<method name=\"getShadowDy()F\" since=\"16\"/>\n\t\t<method name=\"getShadowRadius()F\" since=\"16\"/>\n\t\t<method name=\"getShowSoftInputOnFocus()Z\" since=\"21\"/>\n\t\t<method name=\"getText()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTextClassifier()Landroid/view/textclassifier/TextClassifier;\" since=\"26\"/>\n\t\t<method name=\"getTextColor(Landroid/content/Context;Landroid/content/res/TypedArray;I)I\" removed=\"21\"/>\n\t\t<method name=\"getTextColors()Landroid/content/res/ColorStateList;\"/>\n\t\t<method name=\"getTextColors(Landroid/content/Context;Landroid/content/res/TypedArray;)Landroid/content/res/ColorStateList;\" removed=\"21\"/>\n\t\t<method name=\"getTextCursorDrawable()Landroid/graphics/drawable/Drawable;\" since=\"29\"/>\n\t\t<method name=\"getTextDirectionHeuristic()Landroid/text/TextDirectionHeuristic;\" since=\"29\"/>\n\t\t<method name=\"getTextLocale()Ljava/util/Locale;\" since=\"17\"/>\n\t\t<method name=\"getTextLocales()Landroid/os/LocaleList;\" since=\"24\"/>\n\t\t<method name=\"getTextMetricsParams()Landroid/text/PrecomputedText$Params;\" since=\"28\"/>\n\t\t<method name=\"getTextScaleX()F\"/>\n\t\t<method name=\"getTextSelectHandle()Landroid/graphics/drawable/Drawable;\" since=\"29\"/>\n\t\t<method name=\"getTextSelectHandleLeft()Landroid/graphics/drawable/Drawable;\" since=\"29\"/>\n\t\t<method name=\"getTextSelectHandleRight()Landroid/graphics/drawable/Drawable;\" since=\"29\"/>\n\t\t<method name=\"getTextSize()F\"/>\n\t\t<method name=\"getTotalPaddingBottom()I\"/>\n\t\t<method name=\"getTotalPaddingEnd()I\" since=\"17\"/>\n\t\t<method name=\"getTotalPaddingLeft()I\"/>\n\t\t<method name=\"getTotalPaddingRight()I\"/>\n\t\t<method name=\"getTotalPaddingStart()I\" since=\"17\"/>\n\t\t<method name=\"getTotalPaddingTop()I\"/>\n\t\t<method name=\"getTransformationMethod()Landroid/text/method/TransformationMethod;\"/>\n\t\t<method name=\"getTypeface()Landroid/graphics/Typeface;\"/>\n\t\t<method name=\"getUrls()[Landroid/text/style/URLSpan;\"/>\n\t\t<method name=\"hasSelection()Z\"/>\n\t\t<method name=\"isAllCaps()Z\" since=\"28\"/>\n\t\t<method name=\"isCursorVisible()Z\" since=\"16\"/>\n\t\t<method name=\"isElegantTextHeight()Z\" since=\"28\"/>\n\t\t<method name=\"isFallbackLineSpacing()Z\" since=\"28\"/>\n\t\t<method name=\"isHorizontallyScrollable()Z\" since=\"29\"/>\n\t\t<method name=\"isInputMethodTarget()Z\" since=\"3\"/>\n\t\t<method name=\"isSingleLine()Z\" since=\"29\"/>\n\t\t<method name=\"isSuggestionsEnabled()Z\" since=\"14\"/>\n\t\t<method name=\"isTextSelectable()Z\" since=\"11\"/>\n\t\t<method name=\"length()I\"/>\n\t\t<method name=\"moveCursorToVisibleOffset()Z\" since=\"3\"/>\n\t\t<method name=\"onBeginBatchEdit()V\" since=\"3\"/>\n\t\t<method name=\"onCommitCompletion(Landroid/view/inputmethod/CompletionInfo;)V\" since=\"3\"/>\n\t\t<method name=\"onCommitCorrection(Landroid/view/inputmethod/CorrectionInfo;)V\" since=\"11\"/>\n\t\t<method name=\"onEditorAction(I)V\" since=\"3\"/>\n\t\t<method name=\"onEndBatchEdit()V\" since=\"3\"/>\n\t\t<method name=\"onPrivateIMECommand(Ljava/lang/String;Landroid/os/Bundle;)Z\" since=\"3\"/>\n\t\t<method name=\"onSelectionChanged(II)V\" since=\"3\"/>\n\t\t<method name=\"onTextChanged(Ljava/lang/CharSequence;III)V\"/>\n\t\t<method name=\"onTextContextMenuItem(I)Z\" since=\"3\"/>\n\t\t<method name=\"removeTextChangedListener(Landroid/text/TextWatcher;)V\"/>\n\t\t<method name=\"resetResolvedDrawables()V\" since=\"14\" removed=\"17\"/>\n\t\t<method name=\"resetResolvedLayoutDirection()V\" since=\"14\" removed=\"16\"/>\n\t\t<method name=\"resolveDrawables()V\" since=\"14\" removed=\"17\"/>\n\t\t<method name=\"resolveTextDirection()V\" since=\"14\" removed=\"16\"/>\n\t\t<method name=\"setAllCaps(Z)V\" since=\"14\"/>\n\t\t<method name=\"setAutoLinkMask(I)V\"/>\n\t\t<method name=\"setAutoSizeTextTypeUniformWithConfiguration(IIII)V\" since=\"26\"/>\n\t\t<method name=\"setAutoSizeTextTypeUniformWithPresetSizes([II)V\" since=\"26\"/>\n\t\t<method name=\"setAutoSizeTextTypeWithDefaults(I)V\" since=\"26\"/>\n\t\t<method name=\"setBreakStrategy(I)V\" since=\"23\"/>\n\t\t<method name=\"setCompoundDrawablePadding(I)V\"/>\n\t\t<method name=\"setCompoundDrawableTintBlendMode(Landroid/graphics/BlendMode;)V\" since=\"29\"/>\n\t\t<method name=\"setCompoundDrawableTintList(Landroid/content/res/ColorStateList;)V\" since=\"23\"/>\n\t\t<method name=\"setCompoundDrawableTintMode(Landroid/graphics/PorterDuff$Mode;)V\" since=\"23\"/>\n\t\t<method name=\"setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setCompoundDrawablesRelative(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V\" since=\"17\"/>\n\t\t<method name=\"setCompoundDrawablesRelativeWithIntrinsicBounds(IIII)V\" since=\"17\"/>\n\t\t<method name=\"setCompoundDrawablesRelativeWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V\" since=\"17\"/>\n\t\t<method name=\"setCompoundDrawablesWithIntrinsicBounds(IIII)V\" since=\"3\"/>\n\t\t<method name=\"setCompoundDrawablesWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setCursorVisible(Z)V\"/>\n\t\t<method name=\"setCustomInsertionActionModeCallback(Landroid/view/ActionMode$Callback;)V\" since=\"23\"/>\n\t\t<method name=\"setCustomSelectionActionModeCallback(Landroid/view/ActionMode$Callback;)V\" since=\"11\"/>\n\t\t<method name=\"setEditableFactory(Landroid/text/Editable$Factory;)V\"/>\n\t\t<method name=\"setElegantTextHeight(Z)V\" since=\"21\"/>\n\t\t<method name=\"setEllipsize(Landroid/text/TextUtils$TruncateAt;)V\"/>\n\t\t<method name=\"setEms(I)V\"/>\n\t\t<method name=\"setError(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setError(Ljava/lang/CharSequence;Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setExtractedText(Landroid/view/inputmethod/ExtractedText;)V\" since=\"3\"/>\n\t\t<method name=\"setFallbackLineSpacing(Z)V\" since=\"28\"/>\n\t\t<method name=\"setFilters([Landroid/text/InputFilter;)V\"/>\n\t\t<method name=\"setFirstBaselineToTopHeight(I)V\" since=\"28\"/>\n\t\t<method name=\"setFontFeatureSettings(Ljava/lang/String;)V\" since=\"21\"/>\n\t\t<method name=\"setFontVariationSettings(Ljava/lang/String;)Z\" since=\"26\"/>\n\t\t<method name=\"setFrame(IIII)Z\"/>\n\t\t<method name=\"setFreezesText(Z)V\"/>\n\t\t<method name=\"setGravity(I)V\"/>\n\t\t<method name=\"setHeight(I)V\"/>\n\t\t<method name=\"setHighlightColor(I)V\"/>\n\t\t<method name=\"setHint(I)V\"/>\n\t\t<method name=\"setHint(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setHintTextColor(I)V\"/>\n\t\t<method name=\"setHintTextColor(Landroid/content/res/ColorStateList;)V\"/>\n\t\t<method name=\"setHorizontallyScrolling(Z)V\"/>\n\t\t<method name=\"setHyphenationFrequency(I)V\" since=\"23\"/>\n\t\t<method name=\"setImeActionLabel(Ljava/lang/CharSequence;I)V\" since=\"3\"/>\n\t\t<method name=\"setImeHintLocales(Landroid/os/LocaleList;)V\" since=\"24\"/>\n\t\t<method name=\"setImeOptions(I)V\" since=\"3\"/>\n\t\t<method name=\"setIncludeFontPadding(Z)V\"/>\n\t\t<method name=\"setInputExtras(I)V\" since=\"3\"/>\n\t\t<method name=\"setInputType(I)V\" since=\"3\"/>\n\t\t<method name=\"setJustificationMode(I)V\" since=\"26\"/>\n\t\t<method name=\"setKeyListener(Landroid/text/method/KeyListener;)V\"/>\n\t\t<method name=\"setLastBaselineToBottomHeight(I)V\" since=\"28\"/>\n\t\t<method name=\"setLetterSpacing(F)V\" since=\"21\"/>\n\t\t<method name=\"setLineHeight(I)V\" since=\"28\"/>\n\t\t<method name=\"setLineSpacing(FF)V\"/>\n\t\t<method name=\"setLines(I)V\"/>\n\t\t<method name=\"setLinkTextColor(I)V\"/>\n\t\t<method name=\"setLinkTextColor(Landroid/content/res/ColorStateList;)V\"/>\n\t\t<method name=\"setLinksClickable(Z)V\"/>\n\t\t<method name=\"setMarqueeRepeatLimit(I)V\" since=\"2\"/>\n\t\t<method name=\"setMaxEms(I)V\"/>\n\t\t<method name=\"setMaxHeight(I)V\"/>\n\t\t<method name=\"setMaxLines(I)V\"/>\n\t\t<method name=\"setMaxWidth(I)V\"/>\n\t\t<method name=\"setMinEms(I)V\"/>\n\t\t<method name=\"setMinHeight(I)V\"/>\n\t\t<method name=\"setMinLines(I)V\"/>\n\t\t<method name=\"setMinWidth(I)V\"/>\n\t\t<method name=\"setMovementMethod(Landroid/text/method/MovementMethod;)V\"/>\n\t\t<method name=\"setOnEditorActionListener(Landroid/widget/TextView$OnEditorActionListener;)V\" since=\"3\"/>\n\t\t<method name=\"setPaddingRelative(IIII)V\" since=\"16\"/>\n\t\t<method name=\"setPaintFlags(I)V\"/>\n\t\t<method name=\"setPrivateImeOptions(Ljava/lang/String;)V\" since=\"3\"/>\n\t\t<method name=\"setRawInputType(I)V\" since=\"3\"/>\n\t\t<method name=\"setScroller(Landroid/widget/Scroller;)V\"/>\n\t\t<method name=\"setSelectAllOnFocus(Z)V\"/>\n\t\t<method name=\"setShadowLayer(FFFI)V\"/>\n\t\t<method name=\"setShowSoftInputOnFocus(Z)V\" since=\"21\"/>\n\t\t<method name=\"setSingleLine()V\"/>\n\t\t<method name=\"setSingleLine(Z)V\"/>\n\t\t<method name=\"setSpannableFactory(Landroid/text/Spannable$Factory;)V\"/>\n\t\t<method name=\"setText(I)V\"/>\n\t\t<method name=\"setText(ILandroid/widget/TextView$BufferType;)V\"/>\n\t\t<method name=\"setText(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setText(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;)V\"/>\n\t\t<method name=\"setText([CII)V\"/>\n\t\t<method name=\"setTextAppearance(I)V\" since=\"23\"/>\n\t\t<method name=\"setTextAppearance(Landroid/content/Context;I)V\" deprecated=\"23\"/>\n\t\t<method name=\"setTextClassifier(Landroid/view/textclassifier/TextClassifier;)V\" since=\"26\"/>\n\t\t<method name=\"setTextColor(I)V\"/>\n\t\t<method name=\"setTextColor(Landroid/content/res/ColorStateList;)V\"/>\n\t\t<method name=\"setTextCursorDrawable(I)V\" since=\"29\"/>\n\t\t<method name=\"setTextCursorDrawable(Landroid/graphics/drawable/Drawable;)V\" since=\"29\"/>\n\t\t<method name=\"setTextIsSelectable(Z)V\" since=\"11\"/>\n\t\t<method name=\"setTextKeepState(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setTextKeepState(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;)V\"/>\n\t\t<method name=\"setTextLocale(Ljava/util/Locale;)V\" since=\"17\"/>\n\t\t<method name=\"setTextLocales(Landroid/os/LocaleList;)V\" since=\"24\"/>\n\t\t<method name=\"setTextMetricsParams(Landroid/text/PrecomputedText$Params;)V\" since=\"28\"/>\n\t\t<method name=\"setTextScaleX(F)V\"/>\n\t\t<method name=\"setTextSelectHandle(I)V\" since=\"29\"/>\n\t\t<method name=\"setTextSelectHandle(Landroid/graphics/drawable/Drawable;)V\" since=\"29\"/>\n\t\t<method name=\"setTextSelectHandleLeft(I)V\" since=\"29\"/>\n\t\t<method name=\"setTextSelectHandleLeft(Landroid/graphics/drawable/Drawable;)V\" since=\"29\"/>\n\t\t<method name=\"setTextSelectHandleRight(I)V\" since=\"29\"/>\n\t\t<method name=\"setTextSelectHandleRight(Landroid/graphics/drawable/Drawable;)V\" since=\"29\"/>\n\t\t<method name=\"setTextSize(F)V\"/>\n\t\t<method name=\"setTextSize(IF)V\"/>\n\t\t<method name=\"setTransformationMethod(Landroid/text/method/TransformationMethod;)V\"/>\n\t\t<method name=\"setTypeface(Landroid/graphics/Typeface;)V\"/>\n\t\t<method name=\"setTypeface(Landroid/graphics/Typeface;I)V\"/>\n\t\t<method name=\"setWidth(I)V\"/>\n\t\t<field name=\"AUTO_SIZE_TEXT_TYPE_NONE\" since=\"26\"/>\n\t\t<field name=\"AUTO_SIZE_TEXT_TYPE_UNIFORM\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/widget/TextView$BufferType\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Landroid/widget/TextView$BufferType;\"/>\n\t\t<method name=\"values()[Landroid/widget/TextView$BufferType;\"/>\n\t\t<field name=\"EDITABLE\"/>\n\t\t<field name=\"NORMAL\"/>\n\t\t<field name=\"SPANNABLE\"/>\n\t</class>\n\t<class name=\"android/widget/TextView$OnEditorActionListener\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onEditorAction(Landroid/widget/TextView;ILandroid/view/KeyEvent;)Z\"/>\n\t</class>\n\t<class name=\"android/widget/TextView$SavedState\" since=\"1\">\n\t\t<extends name=\"android/view/View$BaseSavedState\"/>\n\t\t<field name=\"CREATOR\"/>\n\t</class>\n\t<class name=\"android/widget/ThemedSpinnerAdapter\" since=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/widget/SpinnerAdapter\"/>\n\t\t<method name=\"getDropDownViewTheme()Landroid/content/res/Resources$Theme;\"/>\n\t\t<method name=\"setDropDownViewTheme(Landroid/content/res/Resources$Theme;)V\"/>\n\t</class>\n\t<class name=\"android/widget/TimePicker\" since=\"1\">\n\t\t<extends name=\"android/widget/FrameLayout\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"getCurrentHour()Ljava/lang/Integer;\" deprecated=\"23\"/>\n\t\t<method name=\"getCurrentMinute()Ljava/lang/Integer;\" deprecated=\"23\"/>\n\t\t<method name=\"getHour()I\" since=\"23\"/>\n\t\t<method name=\"getMinute()I\" since=\"23\"/>\n\t\t<method name=\"is24HourView()Z\"/>\n\t\t<method name=\"setCurrentHour(Ljava/lang/Integer;)V\" deprecated=\"23\"/>\n\t\t<method name=\"setCurrentMinute(Ljava/lang/Integer;)V\" deprecated=\"23\"/>\n\t\t<method name=\"setHour(I)V\" since=\"23\"/>\n\t\t<method name=\"setIs24HourView(Ljava/lang/Boolean;)V\"/>\n\t\t<method name=\"setMinute(I)V\" since=\"23\"/>\n\t\t<method name=\"setOnTimeChangedListener(Landroid/widget/TimePicker$OnTimeChangedListener;)V\"/>\n\t\t<method name=\"validateInput()Z\" since=\"26\"/>\n\t</class>\n\t<class name=\"android/widget/TimePicker$OnTimeChangedListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onTimeChanged(Landroid/widget/TimePicker;II)V\"/>\n\t</class>\n\t<class name=\"android/widget/Toast\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"cancel()V\"/>\n\t\t<method name=\"getDuration()I\"/>\n\t\t<method name=\"getGravity()I\"/>\n\t\t<method name=\"getHorizontalMargin()F\"/>\n\t\t<method name=\"getVerticalMargin()F\"/>\n\t\t<method name=\"getView()Landroid/view/View;\"/>\n\t\t<method name=\"getXOffset()I\"/>\n\t\t<method name=\"getYOffset()I\"/>\n\t\t<method name=\"makeText(Landroid/content/Context;II)Landroid/widget/Toast;\"/>\n\t\t<method name=\"makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;\"/>\n\t\t<method name=\"setDuration(I)V\"/>\n\t\t<method name=\"setGravity(III)V\"/>\n\t\t<method name=\"setMargin(FF)V\"/>\n\t\t<method name=\"setText(I)V\"/>\n\t\t<method name=\"setText(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setView(Landroid/view/View;)V\"/>\n\t\t<method name=\"show()V\"/>\n\t\t<field name=\"LENGTH_LONG\"/>\n\t\t<field name=\"LENGTH_SHORT\"/>\n\t</class>\n\t<class name=\"android/widget/ToggleButton\" since=\"1\">\n\t\t<extends name=\"android/widget/CompoundButton\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"getDisabledAlpha()F\" since=\"29\"/>\n\t\t<method name=\"getTextOff()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTextOn()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"setTextOff(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setTextOn(Ljava/lang/CharSequence;)V\"/>\n\t</class>\n\t<class name=\"android/widget/Toolbar\" since=\"21\">\n\t\t<extends name=\"android/view/ViewGroup\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\"/>\n\t\t<method name=\"collapseActionView()V\"/>\n\t\t<method name=\"dismissPopupMenus()V\"/>\n\t\t<method name=\"generateDefaultLayoutParams()Landroid/widget/Toolbar$LayoutParams;\"/>\n\t\t<method name=\"generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/Toolbar$LayoutParams;\"/>\n\t\t<method name=\"generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/widget/Toolbar$LayoutParams;\"/>\n\t\t<method name=\"getCollapseContentDescription()Ljava/lang/CharSequence;\" since=\"29\"/>\n\t\t<method name=\"getCollapseIcon()Landroid/graphics/drawable/Drawable;\" since=\"29\"/>\n\t\t<method name=\"getContentInsetEnd()I\"/>\n\t\t<method name=\"getContentInsetEndWithActions()I\" since=\"24\"/>\n\t\t<method name=\"getContentInsetLeft()I\"/>\n\t\t<method name=\"getContentInsetRight()I\"/>\n\t\t<method name=\"getContentInsetStart()I\"/>\n\t\t<method name=\"getContentInsetStartWithNavigation()I\" since=\"24\"/>\n\t\t<method name=\"getCurrentContentInsetEnd()I\" since=\"24\"/>\n\t\t<method name=\"getCurrentContentInsetLeft()I\" since=\"24\"/>\n\t\t<method name=\"getCurrentContentInsetRight()I\" since=\"24\"/>\n\t\t<method name=\"getCurrentContentInsetStart()I\" since=\"24\"/>\n\t\t<method name=\"getLogo()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getLogoDescription()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getMenu()Landroid/view/Menu;\"/>\n\t\t<method name=\"getNavigationContentDescription()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getNavigationIcon()Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getOverflowIcon()Landroid/graphics/drawable/Drawable;\" since=\"23\"/>\n\t\t<method name=\"getPopupTheme()I\"/>\n\t\t<method name=\"getSubtitle()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTitle()Ljava/lang/CharSequence;\"/>\n\t\t<method name=\"getTitleMarginBottom()I\" since=\"24\"/>\n\t\t<method name=\"getTitleMarginEnd()I\" since=\"24\"/>\n\t\t<method name=\"getTitleMarginStart()I\" since=\"24\"/>\n\t\t<method name=\"getTitleMarginTop()I\" since=\"24\"/>\n\t\t<method name=\"hasExpandedActionView()Z\"/>\n\t\t<method name=\"hideOverflowMenu()Z\"/>\n\t\t<method name=\"inflateMenu(I)V\"/>\n\t\t<method name=\"isOverflowMenuShowing()Z\"/>\n\t\t<method name=\"setCollapseContentDescription(I)V\" since=\"29\"/>\n\t\t<method name=\"setCollapseContentDescription(Ljava/lang/CharSequence;)V\" since=\"29\"/>\n\t\t<method name=\"setCollapseIcon(I)V\" since=\"29\"/>\n\t\t<method name=\"setCollapseIcon(Landroid/graphics/drawable/Drawable;)V\" since=\"29\"/>\n\t\t<method name=\"setContentInsetEndWithActions(I)V\" since=\"24\"/>\n\t\t<method name=\"setContentInsetStartWithNavigation(I)V\" since=\"24\"/>\n\t\t<method name=\"setContentInsetsAbsolute(II)V\"/>\n\t\t<method name=\"setContentInsetsRelative(II)V\"/>\n\t\t<method name=\"setLogo(I)V\"/>\n\t\t<method name=\"setLogo(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setLogoDescription(I)V\"/>\n\t\t<method name=\"setLogoDescription(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setNavigationContentDescription(I)V\"/>\n\t\t<method name=\"setNavigationContentDescription(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setNavigationIcon(I)V\"/>\n\t\t<method name=\"setNavigationIcon(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setNavigationOnClickListener(Landroid/view/View$OnClickListener;)V\"/>\n\t\t<method name=\"setOnMenuItemClickListener(Landroid/widget/Toolbar$OnMenuItemClickListener;)V\"/>\n\t\t<method name=\"setOverflowIcon(Landroid/graphics/drawable/Drawable;)V\" since=\"23\"/>\n\t\t<method name=\"setPopupTheme(I)V\"/>\n\t\t<method name=\"setSubtitle(I)V\"/>\n\t\t<method name=\"setSubtitle(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setSubtitleTextAppearance(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"setSubtitleTextColor(I)V\"/>\n\t\t<method name=\"setTitle(I)V\"/>\n\t\t<method name=\"setTitle(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"setTitleMargin(IIII)V\" since=\"24\"/>\n\t\t<method name=\"setTitleMarginBottom(I)V\" since=\"24\"/>\n\t\t<method name=\"setTitleMarginEnd(I)V\" since=\"24\"/>\n\t\t<method name=\"setTitleMarginStart(I)V\" since=\"24\"/>\n\t\t<method name=\"setTitleMarginTop(I)V\" since=\"24\"/>\n\t\t<method name=\"setTitleTextAppearance(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"setTitleTextColor(I)V\"/>\n\t\t<method name=\"showOverflowMenu()Z\"/>\n\t</class>\n\t<class name=\"android/widget/Toolbar$LayoutParams\" since=\"21\">\n\t\t<extends name=\"android/app/ActionBar$LayoutParams\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/app/ActionBar$LayoutParams;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/widget/Toolbar$LayoutParams;)V\"/>\n\t</class>\n\t<class name=\"android/widget/Toolbar$OnMenuItemClickListener\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onMenuItemClick(Landroid/view/MenuItem;)Z\"/>\n\t</class>\n\t<class name=\"android/widget/TwoLineListItem\" since=\"1\" deprecated=\"17\">\n\t\t<extends name=\"android/widget/RelativeLayout\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"getText1()Landroid/widget/TextView;\" deprecated=\"29\"/>\n\t\t<method name=\"getText2()Landroid/widget/TextView;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/widget/VideoView\" since=\"1\">\n\t\t<extends name=\"android/view/SurfaceView\"/>\n\t\t<implements name=\"android/widget/MediaController$MediaPlayerControl\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\"/>\n\t\t<method name=\"addSubtitleSource(Ljava/io/InputStream;Landroid/media/MediaFormat;)V\" since=\"19\"/>\n\t\t<method name=\"resolveAdjustedSize(II)I\"/>\n\t\t<method name=\"resume()V\" since=\"8\"/>\n\t\t<method name=\"setAudioAttributes(Landroid/media/AudioAttributes;)V\" since=\"26\"/>\n\t\t<method name=\"setAudioFocusRequest(I)V\" since=\"26\"/>\n\t\t<method name=\"setMediaController(Landroid/widget/MediaController;)V\"/>\n\t\t<method name=\"setOnCompletionListener(Landroid/media/MediaPlayer$OnCompletionListener;)V\"/>\n\t\t<method name=\"setOnErrorListener(Landroid/media/MediaPlayer$OnErrorListener;)V\"/>\n\t\t<method name=\"setOnInfoListener(Landroid/media/MediaPlayer$OnInfoListener;)V\" since=\"17\"/>\n\t\t<method name=\"setOnPreparedListener(Landroid/media/MediaPlayer$OnPreparedListener;)V\"/>\n\t\t<method name=\"setVideoPath(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setVideoURI(Landroid/net/Uri;)V\"/>\n\t\t<method name=\"setVideoURI(Landroid/net/Uri;Ljava/util/Map;)V\" since=\"21\"/>\n\t\t<method name=\"stopPlayback()V\"/>\n\t\t<method name=\"suspend()V\" since=\"8\"/>\n\t</class>\n\t<class name=\"android/widget/ViewAnimator\" since=\"1\">\n\t\t<extends name=\"android/widget/FrameLayout\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"getAnimateFirstView()Z\" since=\"17\"/>\n\t\t<method name=\"getCurrentView()Landroid/view/View;\"/>\n\t\t<method name=\"getDisplayedChild()I\"/>\n\t\t<method name=\"getInAnimation()Landroid/view/animation/Animation;\"/>\n\t\t<method name=\"getOutAnimation()Landroid/view/animation/Animation;\"/>\n\t\t<method name=\"setAnimateFirstView(Z)V\"/>\n\t\t<method name=\"setDisplayedChild(I)V\"/>\n\t\t<method name=\"setInAnimation(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"setInAnimation(Landroid/view/animation/Animation;)V\"/>\n\t\t<method name=\"setOutAnimation(Landroid/content/Context;I)V\"/>\n\t\t<method name=\"setOutAnimation(Landroid/view/animation/Animation;)V\"/>\n\t\t<method name=\"showNext()V\"/>\n\t\t<method name=\"showPrevious()V\"/>\n\t</class>\n\t<class name=\"android/widget/ViewFlipper\" since=\"1\">\n\t\t<extends name=\"android/widget/ViewAnimator\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"getFlipInterval()I\" since=\"29\"/>\n\t\t<method name=\"isAutoStart()Z\" since=\"7\"/>\n\t\t<method name=\"isFlipping()Z\"/>\n\t\t<method name=\"setAutoStart(Z)V\" since=\"7\"/>\n\t\t<method name=\"setFlipInterval(I)V\"/>\n\t\t<method name=\"startFlipping()V\"/>\n\t\t<method name=\"stopFlipping()V\"/>\n\t</class>\n\t<class name=\"android/widget/ViewSwitcher\" since=\"1\">\n\t\t<extends name=\"android/widget/ViewAnimator\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"getNextView()Landroid/view/View;\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"setFactory(Landroid/widget/ViewSwitcher$ViewFactory;)V\"/>\n\t</class>\n\t<class name=\"android/widget/ViewSwitcher$ViewFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"makeView()Landroid/view/View;\"/>\n\t</class>\n\t<class name=\"android/widget/WrapperListAdapter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/widget/ListAdapter\"/>\n\t\t<method name=\"getWrappedAdapter()Landroid/widget/ListAdapter;\"/>\n\t</class>\n\t<class name=\"android/widget/ZoomButton\" since=\"1\" deprecated=\"26\">\n\t\t<extends name=\"android/widget/ImageButton\"/>\n\t\t<implements name=\"android/view/View$OnLongClickListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\" since=\"21\" deprecated=\"29\"/>\n\t\t<method name=\"setZoomSpeed(J)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/widget/ZoomButtonsController\" since=\"4\" deprecated=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/view/View$OnTouchListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/View;)V\" deprecated=\"29\"/>\n\t\t<method name=\"getContainer()Landroid/view/ViewGroup;\" deprecated=\"29\"/>\n\t\t<method name=\"getZoomControls()Landroid/view/View;\" deprecated=\"29\"/>\n\t\t<method name=\"isAutoDismissed()Z\" deprecated=\"29\"/>\n\t\t<method name=\"isVisible()Z\" deprecated=\"29\"/>\n\t\t<method name=\"setAutoDismissed(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setFocusable(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setOnZoomListener(Landroid/widget/ZoomButtonsController$OnZoomListener;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setVisible(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setZoomInEnabled(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setZoomOutEnabled(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setZoomSpeed(J)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/widget/ZoomButtonsController$OnZoomListener\" since=\"4\" deprecated=\"29\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onVisibilityChanged(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"onZoom(Z)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"android/widget/ZoomControls\" since=\"1\" deprecated=\"29\">\n\t\t<extends name=\"android/widget/LinearLayout\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\" deprecated=\"29\"/>\n\t\t<method name=\"hide()V\" deprecated=\"29\"/>\n\t\t<method name=\"setIsZoomInEnabled(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setIsZoomOutEnabled(Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setOnZoomInClickListener(Landroid/view/View$OnClickListener;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setOnZoomOutClickListener(Landroid/view/View$OnClickListener;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setZoomSpeed(J)V\" deprecated=\"29\"/>\n\t\t<method name=\"show()V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"com/android/internal/util/Predicate\" since=\"1\" deprecated=\"26\" removed=\"28\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"apply(Ljava/lang/Object;)Z\"/>\n\t</class>\n\t<class name=\"com/google/android/collect/Lists\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"newArrayList()Ljava/util/ArrayList;\"/>\n\t\t<method name=\"newArrayList([Ljava/lang/Object;)Ljava/util/ArrayList;\"/>\n\t</class>\n\t<class name=\"com/google/android/collect/Maps\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"newArrayMap()Landroid/util/ArrayMap;\"/>\n\t\t<method name=\"newHashMap()Ljava/util/HashMap;\"/>\n\t</class>\n\t<class name=\"com/google/android/collect/Sets\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"newArraySet()Landroid/util/ArraySet;\"/>\n\t\t<method name=\"newArraySet([Ljava/lang/Object;)Landroid/util/ArraySet;\"/>\n\t\t<method name=\"newHashSet()Ljava/util/HashSet;\"/>\n\t\t<method name=\"newHashSet([Ljava/lang/Object;)Ljava/util/HashSet;\"/>\n\t\t<method name=\"newSortedSet()Ljava/util/SortedSet;\"/>\n\t\t<method name=\"newSortedSet([Ljava/lang/Object;)Ljava/util/SortedSet;\"/>\n\t</class>\n\t<class name=\"com/google/android/gles_jni/EGLConfigImpl\" since=\"30\">\n\t\t<extends name=\"javax/microedition/khronos/egl/EGLConfig\"/>\n\t</class>\n\t<class name=\"com/google/android/gles_jni/EGLContextImpl\" since=\"30\">\n\t\t<extends name=\"javax/microedition/khronos/egl/EGLContext\"/>\n\t\t<method name=\"&lt;init>(J)V\"/>\n\t</class>\n\t<class name=\"com/google/android/gles_jni/EGLDisplayImpl\" since=\"30\">\n\t\t<extends name=\"javax/microedition/khronos/egl/EGLDisplay\"/>\n\t\t<method name=\"&lt;init>(J)V\"/>\n\t</class>\n\t<class name=\"com/google/android/gles_jni/EGLImpl\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/microedition/khronos/egl/EGL10\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"com/google/android/gles_jni/EGLSurfaceImpl\" since=\"30\">\n\t\t<extends name=\"javax/microedition/khronos/egl/EGLSurface\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(J)V\"/>\n\t</class>\n\t<class name=\"com/google/android/gles_jni/GLImpl\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/microedition/khronos/opengles/GL10\"/>\n\t\t<implements name=\"javax/microedition/khronos/opengles/GL10Ext\"/>\n\t\t<implements name=\"javax/microedition/khronos/opengles/GL11\"/>\n\t\t<implements name=\"javax/microedition/khronos/opengles/GL11Ext\"/>\n\t\t<implements name=\"javax/microedition/khronos/opengles/GL11ExtensionPack\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"_glGetString(I)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"com/google/android/maps/GeoPoint\" since=\"1\" removed=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"getLatitudeE6()I\"/>\n\t\t<method name=\"getLongitudeE6()I\"/>\n\t</class>\n\t<class name=\"com/google/android/maps/ItemizedOverlay\" since=\"1\" removed=\"3\">\n\t\t<extends name=\"com/google/android/maps/Overlay\"/>\n\t\t<method name=\"&lt;init>(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"boundCenter(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"boundCenterBottom(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"createItem(I)Lcom/google/android/maps/OverlayItem;\"/>\n\t\t<method name=\"getCenter()Lcom/google/android/maps/GeoPoint;\"/>\n\t\t<method name=\"getFocus()Lcom/google/android/maps/OverlayItem;\"/>\n\t\t<method name=\"getIndexToDraw(I)I\"/>\n\t\t<method name=\"getItem(I)Lcom/google/android/maps/OverlayItem;\"/>\n\t\t<method name=\"getLastFocusedIndex()I\"/>\n\t\t<method name=\"getLatSpanE6()I\"/>\n\t\t<method name=\"getLonSpanE6()I\"/>\n\t\t<method name=\"hitTest(Lcom/google/android/maps/OverlayItem;Landroid/graphics/drawable/Drawable;II)Z\"/>\n\t\t<method name=\"nextFocus(Z)Lcom/google/android/maps/OverlayItem;\"/>\n\t\t<method name=\"onTap(I)Z\"/>\n\t\t<method name=\"populate()V\"/>\n\t\t<method name=\"setDrawFocusedItem(Z)V\"/>\n\t\t<method name=\"setFocus(Lcom/google/android/maps/OverlayItem;)V\"/>\n\t\t<method name=\"setLastFocusedIndex(I)V\"/>\n\t\t<method name=\"setOnFocusChangeListener(Lcom/google/android/maps/ItemizedOverlay$OnFocusChangeListener;)V\"/>\n\t\t<method name=\"size()I\"/>\n\t</class>\n\t<class name=\"com/google/android/maps/ItemizedOverlay$OnFocusChangeListener\" since=\"1\" removed=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"onFocusChanged(Lcom/google/android/maps/ItemizedOverlay;Lcom/google/android/maps/OverlayItem;)V\"/>\n\t</class>\n\t<class name=\"com/google/android/maps/MapActivity\" since=\"1\" removed=\"3\">\n\t\t<extends name=\"android/app/Activity\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"isLocationDisplayed()Z\"/>\n\t\t<method name=\"isRouteDisplayed()Z\"/>\n\t</class>\n\t<class name=\"com/google/android/maps/MapController\" since=\"1\" removed=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"android/view/View$OnKeyListener\"/>\n\t\t<method name=\"animateTo(Lcom/google/android/maps/GeoPoint;)V\"/>\n\t\t<method name=\"animateTo(Lcom/google/android/maps/GeoPoint;Landroid/os/Message;)V\"/>\n\t\t<method name=\"animateTo(Lcom/google/android/maps/GeoPoint;Ljava/lang/Runnable;)V\"/>\n\t\t<method name=\"scrollBy(II)V\"/>\n\t\t<method name=\"setCenter(Lcom/google/android/maps/GeoPoint;)V\"/>\n\t\t<method name=\"setZoom(I)I\"/>\n\t\t<method name=\"stopAnimation(Z)V\"/>\n\t\t<method name=\"stopPanning()V\"/>\n\t\t<method name=\"zoomIn()Z\"/>\n\t\t<method name=\"zoomInFixing(II)Z\"/>\n\t\t<method name=\"zoomOut()Z\"/>\n\t\t<method name=\"zoomOutFixing(II)Z\"/>\n\t\t<method name=\"zoomToSpan(II)V\"/>\n\t</class>\n\t<class name=\"com/google/android/maps/MapView\" since=\"1\" removed=\"3\">\n\t\t<extends name=\"android/view/ViewGroup\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Ljava/lang/String;)V\"/>\n\t\t<method name=\"canCoverCenter()Z\"/>\n\t\t<method name=\"displayZoomControls(Z)V\"/>\n\t\t<method name=\"generateDefaultLayoutParams()Lcom/google/android/maps/MapView$LayoutParams;\"/>\n\t\t<method name=\"getController()Lcom/google/android/maps/MapController;\"/>\n\t\t<method name=\"getLatitudeSpan()I\"/>\n\t\t<method name=\"getLongitudeSpan()I\"/>\n\t\t<method name=\"getMapCenter()Lcom/google/android/maps/GeoPoint;\"/>\n\t\t<method name=\"getMaxZoomLevel()I\"/>\n\t\t<method name=\"getOverlays()Ljava/util/List;\"/>\n\t\t<method name=\"getProjection()Lcom/google/android/maps/Projection;\"/>\n\t\t<method name=\"getZoomControls()Landroid/view/View;\"/>\n\t\t<method name=\"getZoomLevel()I\"/>\n\t\t<method name=\"isSatellite()Z\"/>\n\t\t<method name=\"isStreetView()Z\"/>\n\t\t<method name=\"isTraffic()Z\"/>\n\t\t<method name=\"onRestoreInstanceState(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"onSaveInstanceState(Landroid/os/Bundle;)V\"/>\n\t\t<method name=\"preLoad()V\"/>\n\t\t<method name=\"setReticleDrawMode(Lcom/google/android/maps/MapView$ReticleDrawMode;)V\"/>\n\t\t<method name=\"setSatellite(Z)V\"/>\n\t\t<method name=\"setStreetView(Z)V\"/>\n\t\t<method name=\"setTraffic(Z)V\"/>\n\t</class>\n\t<class name=\"com/google/android/maps/MapView$LayoutParams\" since=\"1\" removed=\"3\">\n\t\t<extends name=\"android/view/ViewGroup$LayoutParams\"/>\n\t\t<method name=\"&lt;init>(IIIII)V\"/>\n\t\t<method name=\"&lt;init>(IILcom/google/android/maps/GeoPoint;I)V\"/>\n\t\t<method name=\"&lt;init>(IILcom/google/android/maps/GeoPoint;III)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\"/>\n\t\t<method name=\"&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V\"/>\n\t\t<method name=\"debug(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<field name=\"BOTTOM\"/>\n\t\t<field name=\"BOTTOM_CENTER\"/>\n\t\t<field name=\"CENTER\"/>\n\t\t<field name=\"CENTER_HORIZONTAL\"/>\n\t\t<field name=\"CENTER_VERTICAL\"/>\n\t\t<field name=\"LEFT\"/>\n\t\t<field name=\"MODE_MAP\"/>\n\t\t<field name=\"MODE_VIEW\"/>\n\t\t<field name=\"RIGHT\"/>\n\t\t<field name=\"TOP\"/>\n\t\t<field name=\"TOP_LEFT\"/>\n\t\t<field name=\"alignment\"/>\n\t\t<field name=\"mode\"/>\n\t\t<field name=\"point\"/>\n\t\t<field name=\"x\"/>\n\t\t<field name=\"y\"/>\n\t</class>\n\t<class name=\"com/google/android/maps/MapView$ReticleDrawMode\" since=\"1\" removed=\"3\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Lcom/google/android/maps/MapView$ReticleDrawMode;\"/>\n\t\t<method name=\"values()[Lcom/google/android/maps/MapView$ReticleDrawMode;\"/>\n\t\t<field name=\"DRAW_RETICLE_NEVER\"/>\n\t\t<field name=\"DRAW_RETICLE_OVER\"/>\n\t\t<field name=\"DRAW_RETICLE_UNDER\"/>\n\t</class>\n\t<class name=\"com/google/android/maps/MyLocationOverlay\" since=\"1\" removed=\"3\">\n\t\t<extends name=\"com/google/android/maps/Overlay\"/>\n\t\t<implements name=\"android/hardware/SensorListener\"/>\n\t\t<implements name=\"android/location/LocationListener\"/>\n\t\t<method name=\"&lt;init>(Landroid/content/Context;Lcom/google/android/maps/MapView;)V\"/>\n\t\t<method name=\"disableCompass()V\"/>\n\t\t<method name=\"disableMyLocation()V\"/>\n\t\t<method name=\"dispatchTap()Z\"/>\n\t\t<method name=\"drawCompass(Landroid/graphics/Canvas;F)V\"/>\n\t\t<method name=\"drawMyLocation(Landroid/graphics/Canvas;Lcom/google/android/maps/MapView;Landroid/location/Location;Lcom/google/android/maps/GeoPoint;J)V\"/>\n\t\t<method name=\"enableCompass()Z\"/>\n\t\t<method name=\"enableMyLocation()Z\"/>\n\t\t<method name=\"getLastFix()Landroid/location/Location;\"/>\n\t\t<method name=\"getMyLocation()Lcom/google/android/maps/GeoPoint;\"/>\n\t\t<method name=\"getOrientation()F\"/>\n\t\t<method name=\"isCompassEnabled()Z\"/>\n\t\t<method name=\"isMyLocationEnabled()Z\"/>\n\t\t<method name=\"runOnFirstFix(Ljava/lang/Runnable;)Z\"/>\n\t</class>\n\t<class name=\"com/google/android/maps/Overlay\" since=\"1\" removed=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"draw(Landroid/graphics/Canvas;Lcom/google/android/maps/MapView;Z)V\"/>\n\t\t<method name=\"draw(Landroid/graphics/Canvas;Lcom/google/android/maps/MapView;ZJ)Z\"/>\n\t\t<method name=\"drawAt(Landroid/graphics/Canvas;Landroid/graphics/drawable/Drawable;IIZ)V\"/>\n\t\t<method name=\"onKeyDown(ILandroid/view/KeyEvent;Lcom/google/android/maps/MapView;)Z\"/>\n\t\t<method name=\"onKeyUp(ILandroid/view/KeyEvent;Lcom/google/android/maps/MapView;)Z\"/>\n\t\t<method name=\"onTap(Lcom/google/android/maps/GeoPoint;Lcom/google/android/maps/MapView;)Z\"/>\n\t\t<method name=\"onTouchEvent(Landroid/view/MotionEvent;Lcom/google/android/maps/MapView;)Z\"/>\n\t\t<method name=\"onTrackballEvent(Landroid/view/MotionEvent;Lcom/google/android/maps/MapView;)Z\"/>\n\t\t<field name=\"SHADOW_X_SKEW\"/>\n\t\t<field name=\"SHADOW_Y_SCALE\"/>\n\t</class>\n\t<class name=\"com/google/android/maps/OverlayItem\" since=\"1\" removed=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Lcom/google/android/maps/GeoPoint;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getMarker(I)Landroid/graphics/drawable/Drawable;\"/>\n\t\t<method name=\"getPoint()Lcom/google/android/maps/GeoPoint;\"/>\n\t\t<method name=\"getSnippet()Ljava/lang/String;\"/>\n\t\t<method name=\"getTitle()Ljava/lang/String;\"/>\n\t\t<method name=\"routableAddress()Ljava/lang/String;\"/>\n\t\t<method name=\"setMarker(Landroid/graphics/drawable/Drawable;)V\"/>\n\t\t<method name=\"setState(Landroid/graphics/drawable/Drawable;I)V\"/>\n\t\t<field name=\"ITEM_STATE_FOCUSED_MASK\"/>\n\t\t<field name=\"ITEM_STATE_PRESSED_MASK\"/>\n\t\t<field name=\"ITEM_STATE_SELECTED_MASK\"/>\n\t\t<field name=\"mMarker\"/>\n\t\t<field name=\"mPoint\"/>\n\t\t<field name=\"mSnippet\"/>\n\t\t<field name=\"mTitle\"/>\n\t</class>\n\t<class name=\"com/google/android/maps/Projection\" since=\"1\" removed=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"fromPixels(II)Lcom/google/android/maps/GeoPoint;\"/>\n\t\t<method name=\"metersToEquatorPixels(F)F\"/>\n\t\t<method name=\"toPixels(Lcom/google/android/maps/GeoPoint;Landroid/graphics/Point;)Landroid/graphics/Point;\"/>\n\t</class>\n\t<class name=\"com/google/android/maps/TrackballGestureDetector\" since=\"1\" removed=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"analyze(Landroid/view/MotionEvent;)V\"/>\n\t\t<method name=\"getCurrentDownX()F\"/>\n\t\t<method name=\"getCurrentDownY()F\"/>\n\t\t<method name=\"getFirstDownX()F\"/>\n\t\t<method name=\"getFirstDownY()F\"/>\n\t\t<method name=\"isDoubleTap()Z\"/>\n\t\t<method name=\"isScroll()Z\"/>\n\t\t<method name=\"isTap()Z\"/>\n\t\t<method name=\"registerLongPressCallback(Ljava/lang/Runnable;)V\"/>\n\t\t<method name=\"scrollX()F\"/>\n\t\t<method name=\"scrollY()F\"/>\n\t</class>\n\t<class name=\"com/google/android/util/AbstractMessageParser\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;ZZZZZZ)V\"/>\n\t\t<method name=\"getPart(I)Lcom/google/android/util/AbstractMessageParser$Part;\"/>\n\t\t<method name=\"getPartCount()I\"/>\n\t\t<method name=\"getParts()Ljava/util/List;\"/>\n\t\t<method name=\"getRawText()Ljava/lang/String;\"/>\n\t\t<method name=\"getResources()Lcom/google/android/util/AbstractMessageParser$Resources;\"/>\n\t\t<method name=\"parse()V\"/>\n\t\t<method name=\"reverse(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"toHtml()Ljava/lang/String;\"/>\n\t\t<method name=\"tokenForUrl(Ljava/lang/String;Ljava/lang/String;)Lcom/google/android/util/AbstractMessageParser$Token;\"/>\n\t\t<field name=\"musicNote\"/>\n\t</class>\n\t<class name=\"com/google/android/util/AbstractMessageParser$Acronym\" since=\"30\">\n\t\t<extends name=\"com/google/android/util/AbstractMessageParser$Token\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getValue()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"com/google/android/util/AbstractMessageParser$FlickrPhoto\" since=\"30\">\n\t\t<extends name=\"com/google/android/util/AbstractMessageParser$Token\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getGrouping()Ljava/lang/String;\"/>\n\t\t<method name=\"getGroupingId()Ljava/lang/String;\"/>\n\t\t<method name=\"getPhoto()Ljava/lang/String;\"/>\n\t\t<method name=\"getPhotoURL(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getRssUrl(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getTagsURL(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getUrl()Ljava/lang/String;\"/>\n\t\t<method name=\"getUser()Ljava/lang/String;\"/>\n\t\t<method name=\"getUserSetsURL(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getUserTagsURL(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getUserURL(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"matchURL(Ljava/lang/String;Ljava/lang/String;)Lcom/google/android/util/AbstractMessageParser$FlickrPhoto;\"/>\n\t</class>\n\t<class name=\"com/google/android/util/AbstractMessageParser$Format\" since=\"30\">\n\t\t<extends name=\"com/google/android/util/AbstractMessageParser$Token\"/>\n\t\t<method name=\"&lt;init>(CZ)V\"/>\n\t\t<method name=\"setMatched(Z)V\"/>\n\t</class>\n\t<class name=\"com/google/android/util/AbstractMessageParser$Html\" since=\"30\">\n\t\t<extends name=\"com/google/android/util/AbstractMessageParser$Token\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"trimLeadingWhitespace()V\"/>\n\t\t<method name=\"trimTrailingWhitespace()V\"/>\n\t\t<method name=\"trimTrailingWhitespace(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"com/google/android/util/AbstractMessageParser$Link\" since=\"30\">\n\t\t<extends name=\"com/google/android/util/AbstractMessageParser$Token\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getURL()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"com/google/android/util/AbstractMessageParser$MusicTrack\" since=\"30\">\n\t\t<extends name=\"com/google/android/util/AbstractMessageParser$Token\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getTrack()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"com/google/android/util/AbstractMessageParser$Part\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"add(Lcom/google/android/util/AbstractMessageParser$Token;)V\"/>\n\t\t<method name=\"getMediaToken()Lcom/google/android/util/AbstractMessageParser$Token;\"/>\n\t\t<method name=\"getRawText()Ljava/lang/String;\"/>\n\t\t<method name=\"getTokens()Ljava/util/ArrayList;\"/>\n\t\t<method name=\"getType(Z)Ljava/lang/String;\"/>\n\t\t<method name=\"isMedia()Z\"/>\n\t\t<method name=\"setMeText(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"com/google/android/util/AbstractMessageParser$Photo\" since=\"30\">\n\t\t<extends name=\"com/google/android/util/AbstractMessageParser$Token\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getAlbum()Ljava/lang/String;\"/>\n\t\t<method name=\"getAlbumURL(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getPhoto()Ljava/lang/String;\"/>\n\t\t<method name=\"getPhotoURL(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getRssUrl(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getUser()Ljava/lang/String;\"/>\n\t\t<method name=\"matchURL(Ljava/lang/String;Ljava/lang/String;)Lcom/google/android/util/AbstractMessageParser$Photo;\"/>\n\t</class>\n\t<class name=\"com/google/android/util/AbstractMessageParser$Resources\" since=\"30\">\n\t\t<method name=\"getAcronyms()Lcom/google/android/util/AbstractMessageParser$TrieNode;\"/>\n\t\t<method name=\"getDomainSuffixes()Lcom/google/android/util/AbstractMessageParser$TrieNode;\"/>\n\t\t<method name=\"getSchemes()Ljava/util/Set;\"/>\n\t\t<method name=\"getSmileys()Lcom/google/android/util/AbstractMessageParser$TrieNode;\"/>\n\t</class>\n\t<class name=\"com/google/android/util/AbstractMessageParser$Smiley\" since=\"30\">\n\t\t<extends name=\"com/google/android/util/AbstractMessageParser$Token\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"com/google/android/util/AbstractMessageParser$Token\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Lcom/google/android/util/AbstractMessageParser$Token$Type;Ljava/lang/String;)V\"/>\n\t\t<method name=\"controlCaps()Z\"/>\n\t\t<method name=\"getInfo()Ljava/util/List;\"/>\n\t\t<method name=\"getRawText()Ljava/lang/String;\"/>\n\t\t<method name=\"getType()Lcom/google/android/util/AbstractMessageParser$Token$Type;\"/>\n\t\t<method name=\"isArray()Z\"/>\n\t\t<method name=\"isHtml()Z\"/>\n\t\t<method name=\"isMedia()Z\"/>\n\t\t<method name=\"setCaps()Z\"/>\n\t\t<method name=\"toHtml(Z)Ljava/lang/String;\"/>\n\t\t<field name=\"text\"/>\n\t\t<field name=\"type\"/>\n\t</class>\n\t<class name=\"com/google/android/util/AbstractMessageParser$Token$Type\" since=\"30\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Lcom/google/android/util/AbstractMessageParser$Token$Type;\"/>\n\t\t<method name=\"values()[Lcom/google/android/util/AbstractMessageParser$Token$Type;\"/>\n\t\t<field name=\"ACRONYM\"/>\n\t\t<field name=\"FLICKR\"/>\n\t\t<field name=\"FORMAT\"/>\n\t\t<field name=\"GOOGLE_VIDEO\"/>\n\t\t<field name=\"HTML\"/>\n\t\t<field name=\"LINK\"/>\n\t\t<field name=\"MUSIC\"/>\n\t\t<field name=\"PHOTO\"/>\n\t\t<field name=\"SMILEY\"/>\n\t\t<field name=\"YOUTUBE_VIDEO\"/>\n\t</class>\n\t<class name=\"com/google/android/util/AbstractMessageParser$TrieNode\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"addToTrie(Lcom/google/android/util/AbstractMessageParser$TrieNode;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"exists()Z\"/>\n\t\t<method name=\"getChild(C)Lcom/google/android/util/AbstractMessageParser$TrieNode;\"/>\n\t\t<method name=\"getOrCreateChild(C)Lcom/google/android/util/AbstractMessageParser$TrieNode;\"/>\n\t\t<method name=\"getText()Ljava/lang/String;\"/>\n\t\t<method name=\"getValue()Ljava/lang/String;\"/>\n\t\t<method name=\"setValue(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"com/google/android/util/AbstractMessageParser$Video\" since=\"30\">\n\t\t<extends name=\"com/google/android/util/AbstractMessageParser$Token\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getDocID()Ljava/lang/String;\"/>\n\t\t<method name=\"getRssUrl(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getURL(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getURL(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"matchURL(Ljava/lang/String;Ljava/lang/String;)Lcom/google/android/util/AbstractMessageParser$Video;\"/>\n\t</class>\n\t<class name=\"com/google/android/util/AbstractMessageParser$YouTubeVideo\" since=\"30\">\n\t\t<extends name=\"com/google/android/util/AbstractMessageParser$Token\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getDocID()Ljava/lang/String;\"/>\n\t\t<method name=\"getPrefixedURL(ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getRssUrl(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getURL(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getURL(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"matchURL(Ljava/lang/String;Ljava/lang/String;)Lcom/google/android/util/AbstractMessageParser$YouTubeVideo;\"/>\n\t</class>\n\t<class name=\"com/google/android/util/Procedure\" since=\"30\">\n\t\t<method name=\"apply(Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"com/google/android/util/SmileyParser\" since=\"30\">\n\t\t<extends name=\"com/google/android/util/AbstractMessageParser\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Lcom/google/android/util/SmileyResources;)V\"/>\n\t\t<method name=\"getSpannableString(Landroid/content/Context;)Ljava/lang/CharSequence;\"/>\n\t</class>\n\t<class name=\"com/google/android/util/SmileyResources\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"com/google/android/util/AbstractMessageParser$Resources\"/>\n\t\t<method name=\"&lt;init>([Ljava/lang/String;[I)V\"/>\n\t\t<method name=\"getSmileyRes(Ljava/lang/String;)I\"/>\n\t</class>\n\t<class name=\"dalvik/annotation/TestTarget\" since=\"1\" deprecated=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t\t<method name=\"conceptName()Ljava/lang/String;\" since=\"3\" deprecated=\"29\"/>\n\t\t<method name=\"methodArgs()[Ljava/lang/Class;\" deprecated=\"29\"/>\n\t\t<method name=\"methodName()Ljava/lang/String;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"dalvik/annotation/TestTargetClass\" since=\"1\" deprecated=\"14\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t\t<method name=\"value()Ljava/lang/Class;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"dalvik/bytecode/OpcodeInfo\" since=\"11\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"MAXIMUM_PACKED_VALUE\"/>\n\t\t<field name=\"MAXIMUM_VALUE\"/>\n\t</class>\n\t<class name=\"dalvik/bytecode/Opcodes\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"OP_ADD_DOUBLE\"/>\n\t\t<field name=\"OP_ADD_DOUBLE_2ADDR\"/>\n\t\t<field name=\"OP_ADD_FLOAT\"/>\n\t\t<field name=\"OP_ADD_FLOAT_2ADDR\"/>\n\t\t<field name=\"OP_ADD_INT\"/>\n\t\t<field name=\"OP_ADD_INT_2ADDR\"/>\n\t\t<field name=\"OP_ADD_INT_LIT16\"/>\n\t\t<field name=\"OP_ADD_INT_LIT8\"/>\n\t\t<field name=\"OP_ADD_LONG\"/>\n\t\t<field name=\"OP_ADD_LONG_2ADDR\"/>\n\t\t<field name=\"OP_AGET\"/>\n\t\t<field name=\"OP_AGET_BOOLEAN\"/>\n\t\t<field name=\"OP_AGET_BYTE\"/>\n\t\t<field name=\"OP_AGET_CHAR\"/>\n\t\t<field name=\"OP_AGET_OBJECT\"/>\n\t\t<field name=\"OP_AGET_SHORT\"/>\n\t\t<field name=\"OP_AGET_WIDE\"/>\n\t\t<field name=\"OP_AND_INT\"/>\n\t\t<field name=\"OP_AND_INT_2ADDR\"/>\n\t\t<field name=\"OP_AND_INT_LIT16\"/>\n\t\t<field name=\"OP_AND_INT_LIT8\"/>\n\t\t<field name=\"OP_AND_LONG\"/>\n\t\t<field name=\"OP_AND_LONG_2ADDR\"/>\n\t\t<field name=\"OP_APUT\"/>\n\t\t<field name=\"OP_APUT_BOOLEAN\"/>\n\t\t<field name=\"OP_APUT_BYTE\"/>\n\t\t<field name=\"OP_APUT_CHAR\"/>\n\t\t<field name=\"OP_APUT_OBJECT\"/>\n\t\t<field name=\"OP_APUT_SHORT\"/>\n\t\t<field name=\"OP_APUT_WIDE\"/>\n\t\t<field name=\"OP_ARRAY_LENGTH\"/>\n\t\t<field name=\"OP_BREAKPOINT\" since=\"8\" deprecated=\"15\"/>\n\t\t<field name=\"OP_CHECK_CAST\"/>\n\t\t<field name=\"OP_CHECK_CAST_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_CMPG_DOUBLE\"/>\n\t\t<field name=\"OP_CMPG_FLOAT\"/>\n\t\t<field name=\"OP_CMPL_DOUBLE\"/>\n\t\t<field name=\"OP_CMPL_FLOAT\"/>\n\t\t<field name=\"OP_CMP_LONG\"/>\n\t\t<field name=\"OP_CONST\"/>\n\t\t<field name=\"OP_CONST_16\"/>\n\t\t<field name=\"OP_CONST_4\"/>\n\t\t<field name=\"OP_CONST_CLASS\"/>\n\t\t<field name=\"OP_CONST_CLASS_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_CONST_HIGH16\"/>\n\t\t<field name=\"OP_CONST_METHOD_HANDLE\" since=\"28\"/>\n\t\t<field name=\"OP_CONST_METHOD_TYPE\" since=\"28\"/>\n\t\t<field name=\"OP_CONST_STRING\"/>\n\t\t<field name=\"OP_CONST_STRING_JUMBO\"/>\n\t\t<field name=\"OP_CONST_WIDE\"/>\n\t\t<field name=\"OP_CONST_WIDE_16\"/>\n\t\t<field name=\"OP_CONST_WIDE_32\"/>\n\t\t<field name=\"OP_CONST_WIDE_HIGH16\"/>\n\t\t<field name=\"OP_DIV_DOUBLE\"/>\n\t\t<field name=\"OP_DIV_DOUBLE_2ADDR\"/>\n\t\t<field name=\"OP_DIV_FLOAT\"/>\n\t\t<field name=\"OP_DIV_FLOAT_2ADDR\"/>\n\t\t<field name=\"OP_DIV_INT\"/>\n\t\t<field name=\"OP_DIV_INT_2ADDR\"/>\n\t\t<field name=\"OP_DIV_INT_LIT16\"/>\n\t\t<field name=\"OP_DIV_INT_LIT8\"/>\n\t\t<field name=\"OP_DIV_LONG\"/>\n\t\t<field name=\"OP_DIV_LONG_2ADDR\"/>\n\t\t<field name=\"OP_DOUBLE_TO_FLOAT\"/>\n\t\t<field name=\"OP_DOUBLE_TO_INT\"/>\n\t\t<field name=\"OP_DOUBLE_TO_LONG\"/>\n\t\t<field name=\"OP_EXECUTE_INLINE\" deprecated=\"15\"/>\n\t\t<field name=\"OP_EXECUTE_INLINE_RANGE\" since=\"8\" deprecated=\"15\"/>\n\t\t<field name=\"OP_FILLED_NEW_ARRAY\"/>\n\t\t<field name=\"OP_FILLED_NEW_ARRAY_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_FILLED_NEW_ARRAY_RANGE\"/>\n\t\t<field name=\"OP_FILL_ARRAY_DATA\"/>\n\t\t<field name=\"OP_FLOAT_TO_DOUBLE\"/>\n\t\t<field name=\"OP_FLOAT_TO_INT\"/>\n\t\t<field name=\"OP_FLOAT_TO_LONG\"/>\n\t\t<field name=\"OP_GOTO\"/>\n\t\t<field name=\"OP_GOTO_16\"/>\n\t\t<field name=\"OP_GOTO_32\"/>\n\t\t<field name=\"OP_IF_EQ\"/>\n\t\t<field name=\"OP_IF_EQZ\"/>\n\t\t<field name=\"OP_IF_GE\"/>\n\t\t<field name=\"OP_IF_GEZ\"/>\n\t\t<field name=\"OP_IF_GT\"/>\n\t\t<field name=\"OP_IF_GTZ\"/>\n\t\t<field name=\"OP_IF_LE\"/>\n\t\t<field name=\"OP_IF_LEZ\"/>\n\t\t<field name=\"OP_IF_LT\"/>\n\t\t<field name=\"OP_IF_LTZ\"/>\n\t\t<field name=\"OP_IF_NE\"/>\n\t\t<field name=\"OP_IF_NEZ\"/>\n\t\t<field name=\"OP_IGET\"/>\n\t\t<field name=\"OP_IGET_BOOLEAN\"/>\n\t\t<field name=\"OP_IGET_BOOLEAN_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_IGET_BYTE\"/>\n\t\t<field name=\"OP_IGET_BYTE_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_IGET_CHAR\"/>\n\t\t<field name=\"OP_IGET_CHAR_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_IGET_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_IGET_OBJECT\"/>\n\t\t<field name=\"OP_IGET_OBJECT_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_IGET_OBJECT_QUICK\" deprecated=\"15\"/>\n\t\t<field name=\"OP_IGET_QUICK\" deprecated=\"15\"/>\n\t\t<field name=\"OP_IGET_SHORT\"/>\n\t\t<field name=\"OP_IGET_SHORT_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_IGET_WIDE\"/>\n\t\t<field name=\"OP_IGET_WIDE_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_IGET_WIDE_QUICK\" deprecated=\"15\"/>\n\t\t<field name=\"OP_IGET_WIDE_VOLATILE\" since=\"9\" deprecated=\"15\"/>\n\t\t<field name=\"OP_INSTANCE_OF\"/>\n\t\t<field name=\"OP_INSTANCE_OF_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_INT_TO_BYTE\"/>\n\t\t<field name=\"OP_INT_TO_CHAR\"/>\n\t\t<field name=\"OP_INT_TO_DOUBLE\"/>\n\t\t<field name=\"OP_INT_TO_FLOAT\"/>\n\t\t<field name=\"OP_INT_TO_LONG\"/>\n\t\t<field name=\"OP_INT_TO_SHORT\"/>\n\t\t<field name=\"OP_INVOKE_CUSTOM\" since=\"26\"/>\n\t\t<field name=\"OP_INVOKE_CUSTOM_RANGE\" since=\"26\"/>\n\t\t<field name=\"OP_INVOKE_DIRECT\"/>\n\t\t<field name=\"OP_INVOKE_DIRECT_EMPTY\" deprecated=\"15\"/>\n\t\t<field name=\"OP_INVOKE_DIRECT_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_INVOKE_DIRECT_RANGE\"/>\n\t\t<field name=\"OP_INVOKE_INTERFACE\"/>\n\t\t<field name=\"OP_INVOKE_INTERFACE_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_INVOKE_INTERFACE_RANGE\"/>\n\t\t<field name=\"OP_INVOKE_POLYMORPHIC\" since=\"26\"/>\n\t\t<field name=\"OP_INVOKE_POLYMORPHIC_RANGE\" since=\"26\"/>\n\t\t<field name=\"OP_INVOKE_STATIC\"/>\n\t\t<field name=\"OP_INVOKE_STATIC_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_INVOKE_STATIC_RANGE\"/>\n\t\t<field name=\"OP_INVOKE_SUPER\"/>\n\t\t<field name=\"OP_INVOKE_SUPER_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_INVOKE_SUPER_QUICK\" deprecated=\"15\"/>\n\t\t<field name=\"OP_INVOKE_SUPER_QUICK_RANGE\" deprecated=\"15\"/>\n\t\t<field name=\"OP_INVOKE_SUPER_RANGE\"/>\n\t\t<field name=\"OP_INVOKE_VIRTUAL\"/>\n\t\t<field name=\"OP_INVOKE_VIRTUAL_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_INVOKE_VIRTUAL_QUICK\" deprecated=\"15\"/>\n\t\t<field name=\"OP_INVOKE_VIRTUAL_QUICK_RANGE\" deprecated=\"15\"/>\n\t\t<field name=\"OP_INVOKE_VIRTUAL_RANGE\"/>\n\t\t<field name=\"OP_IPUT\"/>\n\t\t<field name=\"OP_IPUT_BOOLEAN\"/>\n\t\t<field name=\"OP_IPUT_BOOLEAN_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_IPUT_BYTE\"/>\n\t\t<field name=\"OP_IPUT_BYTE_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_IPUT_CHAR\"/>\n\t\t<field name=\"OP_IPUT_CHAR_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_IPUT_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_IPUT_OBJECT\"/>\n\t\t<field name=\"OP_IPUT_OBJECT_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_IPUT_OBJECT_QUICK\" deprecated=\"15\"/>\n\t\t<field name=\"OP_IPUT_QUICK\" deprecated=\"15\"/>\n\t\t<field name=\"OP_IPUT_SHORT\"/>\n\t\t<field name=\"OP_IPUT_SHORT_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_IPUT_WIDE\"/>\n\t\t<field name=\"OP_IPUT_WIDE_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_IPUT_WIDE_QUICK\" deprecated=\"15\"/>\n\t\t<field name=\"OP_IPUT_WIDE_VOLATILE\" since=\"9\" deprecated=\"15\"/>\n\t\t<field name=\"OP_LONG_TO_DOUBLE\"/>\n\t\t<field name=\"OP_LONG_TO_FLOAT\"/>\n\t\t<field name=\"OP_LONG_TO_INT\"/>\n\t\t<field name=\"OP_MONITOR_ENTER\"/>\n\t\t<field name=\"OP_MONITOR_EXIT\"/>\n\t\t<field name=\"OP_MOVE\"/>\n\t\t<field name=\"OP_MOVE_16\"/>\n\t\t<field name=\"OP_MOVE_EXCEPTION\"/>\n\t\t<field name=\"OP_MOVE_FROM16\"/>\n\t\t<field name=\"OP_MOVE_OBJECT\"/>\n\t\t<field name=\"OP_MOVE_OBJECT_16\"/>\n\t\t<field name=\"OP_MOVE_OBJECT_FROM16\"/>\n\t\t<field name=\"OP_MOVE_RESULT\"/>\n\t\t<field name=\"OP_MOVE_RESULT_OBJECT\"/>\n\t\t<field name=\"OP_MOVE_RESULT_WIDE\"/>\n\t\t<field name=\"OP_MOVE_WIDE\"/>\n\t\t<field name=\"OP_MOVE_WIDE_16\"/>\n\t\t<field name=\"OP_MOVE_WIDE_FROM16\"/>\n\t\t<field name=\"OP_MUL_DOUBLE\"/>\n\t\t<field name=\"OP_MUL_DOUBLE_2ADDR\"/>\n\t\t<field name=\"OP_MUL_FLOAT\"/>\n\t\t<field name=\"OP_MUL_FLOAT_2ADDR\"/>\n\t\t<field name=\"OP_MUL_INT\"/>\n\t\t<field name=\"OP_MUL_INT_2ADDR\"/>\n\t\t<field name=\"OP_MUL_INT_LIT16\"/>\n\t\t<field name=\"OP_MUL_INT_LIT8\"/>\n\t\t<field name=\"OP_MUL_LONG\"/>\n\t\t<field name=\"OP_MUL_LONG_2ADDR\"/>\n\t\t<field name=\"OP_NEG_DOUBLE\"/>\n\t\t<field name=\"OP_NEG_FLOAT\"/>\n\t\t<field name=\"OP_NEG_INT\"/>\n\t\t<field name=\"OP_NEG_LONG\"/>\n\t\t<field name=\"OP_NEW_ARRAY\"/>\n\t\t<field name=\"OP_NEW_ARRAY_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_NEW_INSTANCE\"/>\n\t\t<field name=\"OP_NEW_INSTANCE_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_NOP\"/>\n\t\t<field name=\"OP_NOT_INT\"/>\n\t\t<field name=\"OP_NOT_LONG\"/>\n\t\t<field name=\"OP_OR_INT\"/>\n\t\t<field name=\"OP_OR_INT_2ADDR\"/>\n\t\t<field name=\"OP_OR_INT_LIT16\"/>\n\t\t<field name=\"OP_OR_INT_LIT8\"/>\n\t\t<field name=\"OP_OR_LONG\"/>\n\t\t<field name=\"OP_OR_LONG_2ADDR\"/>\n\t\t<field name=\"OP_PACKED_SWITCH\"/>\n\t\t<field name=\"OP_REM_DOUBLE\"/>\n\t\t<field name=\"OP_REM_DOUBLE_2ADDR\"/>\n\t\t<field name=\"OP_REM_FLOAT\"/>\n\t\t<field name=\"OP_REM_FLOAT_2ADDR\"/>\n\t\t<field name=\"OP_REM_INT\"/>\n\t\t<field name=\"OP_REM_INT_2ADDR\"/>\n\t\t<field name=\"OP_REM_INT_LIT16\"/>\n\t\t<field name=\"OP_REM_INT_LIT8\"/>\n\t\t<field name=\"OP_REM_LONG\"/>\n\t\t<field name=\"OP_REM_LONG_2ADDR\"/>\n\t\t<field name=\"OP_RETURN\"/>\n\t\t<field name=\"OP_RETURN_OBJECT\"/>\n\t\t<field name=\"OP_RETURN_VOID\"/>\n\t\t<field name=\"OP_RETURN_WIDE\"/>\n\t\t<field name=\"OP_RSUB_INT\"/>\n\t\t<field name=\"OP_RSUB_INT_LIT8\"/>\n\t\t<field name=\"OP_SGET\"/>\n\t\t<field name=\"OP_SGET_BOOLEAN\"/>\n\t\t<field name=\"OP_SGET_BOOLEAN_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_SGET_BYTE\"/>\n\t\t<field name=\"OP_SGET_BYTE_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_SGET_CHAR\"/>\n\t\t<field name=\"OP_SGET_CHAR_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_SGET_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_SGET_OBJECT\"/>\n\t\t<field name=\"OP_SGET_OBJECT_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_SGET_SHORT\"/>\n\t\t<field name=\"OP_SGET_SHORT_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_SGET_WIDE\"/>\n\t\t<field name=\"OP_SGET_WIDE_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_SGET_WIDE_VOLATILE\" since=\"9\" deprecated=\"15\"/>\n\t\t<field name=\"OP_SHL_INT\"/>\n\t\t<field name=\"OP_SHL_INT_2ADDR\"/>\n\t\t<field name=\"OP_SHL_INT_LIT8\"/>\n\t\t<field name=\"OP_SHL_LONG\"/>\n\t\t<field name=\"OP_SHL_LONG_2ADDR\"/>\n\t\t<field name=\"OP_SHR_INT\"/>\n\t\t<field name=\"OP_SHR_INT_2ADDR\"/>\n\t\t<field name=\"OP_SHR_INT_LIT8\"/>\n\t\t<field name=\"OP_SHR_LONG\"/>\n\t\t<field name=\"OP_SHR_LONG_2ADDR\"/>\n\t\t<field name=\"OP_SPARSE_SWITCH\"/>\n\t\t<field name=\"OP_SPUT\"/>\n\t\t<field name=\"OP_SPUT_BOOLEAN\"/>\n\t\t<field name=\"OP_SPUT_BOOLEAN_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_SPUT_BYTE\"/>\n\t\t<field name=\"OP_SPUT_BYTE_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_SPUT_CHAR\"/>\n\t\t<field name=\"OP_SPUT_CHAR_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_SPUT_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_SPUT_OBJECT\"/>\n\t\t<field name=\"OP_SPUT_OBJECT_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_SPUT_SHORT\"/>\n\t\t<field name=\"OP_SPUT_SHORT_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_SPUT_WIDE\"/>\n\t\t<field name=\"OP_SPUT_WIDE_JUMBO\" since=\"11\"/>\n\t\t<field name=\"OP_SPUT_WIDE_VOLATILE\" since=\"9\" deprecated=\"15\"/>\n\t\t<field name=\"OP_SUB_DOUBLE\"/>\n\t\t<field name=\"OP_SUB_DOUBLE_2ADDR\"/>\n\t\t<field name=\"OP_SUB_FLOAT\"/>\n\t\t<field name=\"OP_SUB_FLOAT_2ADDR\"/>\n\t\t<field name=\"OP_SUB_INT\"/>\n\t\t<field name=\"OP_SUB_INT_2ADDR\"/>\n\t\t<field name=\"OP_SUB_LONG\"/>\n\t\t<field name=\"OP_SUB_LONG_2ADDR\"/>\n\t\t<field name=\"OP_THROW\"/>\n\t\t<field name=\"OP_THROW_VERIFICATION_ERROR\" since=\"8\" deprecated=\"15\"/>\n\t\t<field name=\"OP_UNUSED_3e\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_3f\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_40\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_41\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_42\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_43\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_73\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_79\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_7A\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_E3\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_E4\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_E5\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_E6\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_E7\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_E8\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_E9\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_EA\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_EB\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_EC\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_ED\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_EF\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_F1\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_FC\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_FD\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_FE\" removed=\"8\"/>\n\t\t<field name=\"OP_UNUSED_FF\" removed=\"8\"/>\n\t\t<field name=\"OP_USHR_INT\"/>\n\t\t<field name=\"OP_USHR_INT_2ADDR\"/>\n\t\t<field name=\"OP_USHR_INT_LIT8\"/>\n\t\t<field name=\"OP_USHR_LONG\"/>\n\t\t<field name=\"OP_USHR_LONG_2ADDR\"/>\n\t\t<field name=\"OP_XOR_INT\"/>\n\t\t<field name=\"OP_XOR_INT_2ADDR\"/>\n\t\t<field name=\"OP_XOR_INT_LIT16\"/>\n\t\t<field name=\"OP_XOR_INT_LIT8\"/>\n\t\t<field name=\"OP_XOR_LONG\"/>\n\t\t<field name=\"OP_XOR_LONG_2ADDR\"/>\n\t</class>\n\t<class name=\"dalvik/system/AllocationLimitError\" since=\"1\" removed=\"9\">\n\t\t<extends name=\"java/lang/VirtualMachineError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"dalvik/system/BaseDexClassLoader\" since=\"14\">\n\t\t<extends name=\"java/lang/ClassLoader\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/io/File;Ljava/lang/String;Ljava/lang/ClassLoader;)V\"/>\n\t</class>\n\t<class name=\"dalvik/system/DelegateLastClassLoader\" since=\"27\">\n\t\t<extends name=\"dalvik/system/PathClassLoader\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/ClassLoader;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Z)V\" since=\"29\"/>\n\t</class>\n\t<class name=\"dalvik/system/DexClassLoader\" since=\"3\">\n\t\t<extends name=\"dalvik/system/BaseDexClassLoader\" since=\"14\"/>\n\t\t<extends name=\"java/lang/ClassLoader\" removed=\"14\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)V\"/>\n\t</class>\n\t<class name=\"dalvik/system/DexFile\" since=\"1\" deprecated=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;)V\" deprecated=\"26\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" deprecated=\"26\"/>\n\t\t<method name=\"close()V\" deprecated=\"29\"/>\n\t\t<method name=\"entries()Ljava/util/Enumeration;\" deprecated=\"29\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"isDexOptNeeded(Ljava/lang/String;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"loadClass(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/Class;\" deprecated=\"29\"/>\n\t\t<method name=\"loadDex(Ljava/lang/String;Ljava/lang/String;I)Ldalvik/system/DexFile;\" since=\"3\" deprecated=\"26\"/>\n\t</class>\n\t<class name=\"dalvik/system/InMemoryDexClassLoader\" since=\"26\">\n\t\t<extends name=\"dalvik/system/BaseDexClassLoader\"/>\n\t\t<method name=\"&lt;init>(Ljava/nio/ByteBuffer;Ljava/lang/ClassLoader;)V\"/>\n\t\t<method name=\"&lt;init>([Ljava/nio/ByteBuffer;Ljava/lang/ClassLoader;)V\" since=\"27\"/>\n\t\t<method name=\"&lt;init>([Ljava/nio/ByteBuffer;Ljava/lang/String;Ljava/lang/ClassLoader;)V\" since=\"29\"/>\n\t</class>\n\t<class name=\"dalvik/system/PathClassLoader\" since=\"1\">\n\t\t<extends name=\"dalvik/system/BaseDexClassLoader\" since=\"14\"/>\n\t\t<extends name=\"java/lang/ClassLoader\" removed=\"14\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/ClassLoader;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)V\"/>\n\t</class>\n\t<class name=\"dalvik/system/PotentialDeadlockError\" since=\"1\" removed=\"9\">\n\t\t<extends name=\"java/lang/VirtualMachineError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"dalvik/system/StaleDexCacheError\" since=\"1\" removed=\"9\">\n\t\t<extends name=\"java/lang/VirtualMachineError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"dalvik/system/TemporaryDirectory\" since=\"1\" removed=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"setUpDirectory(Ljava/io/File;)V\"/>\n\t\t<method name=\"setUpDirectory(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"dalvik/system/TouchDex\" since=\"1\" removed=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"main([Ljava/lang/String;)V\"/>\n\t\t<method name=\"start(Ljava/lang/String;)I\"/>\n\t</class>\n\t<class name=\"dalvik/system/VMDebug\" since=\"1\" removed=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"dumpHprofData(Ljava/lang/String;)V\" since=\"3\"/>\n\t\t<method name=\"getAllocCount(I)I\"/>\n\t\t<method name=\"getInstructionCount([I)V\"/>\n\t\t<method name=\"getLoadedClassCount()I\"/>\n\t\t<method name=\"isDebuggerConnected()Z\"/>\n\t\t<method name=\"isDebuggingEnabled()Z\" since=\"3\"/>\n\t\t<method name=\"lastDebuggerActivity()J\"/>\n\t\t<method name=\"printLoadedClasses(I)V\"/>\n\t\t<method name=\"resetAllocCount(I)V\"/>\n\t\t<method name=\"resetInstructionCount()V\"/>\n\t\t<method name=\"setAllocationLimit(I)I\"/>\n\t\t<method name=\"setGlobalAllocationLimit(I)I\"/>\n\t\t<method name=\"startAllocCounting()V\"/>\n\t\t<method name=\"startEmulatorTracing()V\"/>\n\t\t<method name=\"startInstructionCounting()V\"/>\n\t\t<method name=\"startMethodTracing()V\"/>\n\t\t<method name=\"startMethodTracing(Ljava/lang/String;II)V\"/>\n\t\t<method name=\"stopAllocCounting()V\"/>\n\t\t<method name=\"stopEmulatorTracing()V\"/>\n\t\t<method name=\"stopInstructionCounting()V\"/>\n\t\t<method name=\"stopMethodTracing()V\"/>\n\t\t<method name=\"threadCpuTimeNanos()J\"/>\n\t\t<field name=\"DEFAULT_METHOD_TRACE_FILE_NAME\"/>\n\t\t<field name=\"KIND_ALL_COUNTS\"/>\n\t\t<field name=\"KIND_GLOBAL_ALLOCATED_BYTES\"/>\n\t\t<field name=\"KIND_GLOBAL_ALLOCATED_OBJECTS\"/>\n\t\t<field name=\"KIND_GLOBAL_CLASS_INIT_COUNT\" since=\"8\"/>\n\t\t<field name=\"KIND_GLOBAL_CLASS_INIT_TIME\" since=\"8\"/>\n\t\t<field name=\"KIND_GLOBAL_EXT_ALLOCATED_BYTES\"/>\n\t\t<field name=\"KIND_GLOBAL_EXT_ALLOCATED_OBJECTS\"/>\n\t\t<field name=\"KIND_GLOBAL_EXT_FREED_BYTES\"/>\n\t\t<field name=\"KIND_GLOBAL_EXT_FREED_OBJECTS\"/>\n\t\t<field name=\"KIND_GLOBAL_FREED_BYTES\"/>\n\t\t<field name=\"KIND_GLOBAL_FREED_OBJECTS\"/>\n\t\t<field name=\"KIND_GLOBAL_GC_INVOCATIONS\"/>\n\t\t<field name=\"KIND_THREAD_ALLOCATED_BYTES\"/>\n\t\t<field name=\"KIND_THREAD_ALLOCATED_OBJECTS\"/>\n\t\t<field name=\"KIND_THREAD_CLASS_INIT_COUNT\" since=\"8\"/>\n\t\t<field name=\"KIND_THREAD_CLASS_INIT_TIME\" since=\"8\"/>\n\t\t<field name=\"KIND_THREAD_EXT_ALLOCATED_BYTES\"/>\n\t\t<field name=\"KIND_THREAD_EXT_ALLOCATED_OBJECTS\"/>\n\t\t<field name=\"KIND_THREAD_EXT_FREED_BYTES\"/>\n\t\t<field name=\"KIND_THREAD_EXT_FREED_OBJECTS\"/>\n\t\t<field name=\"KIND_THREAD_FREED_BYTES\"/>\n\t\t<field name=\"KIND_THREAD_FREED_OBJECTS\"/>\n\t\t<field name=\"KIND_THREAD_GC_INVOCATIONS\"/>\n\t\t<field name=\"TRACE_COUNT_ALLOCS\"/>\n\t</class>\n\t<class name=\"dalvik/system/VMRuntime\" since=\"1\" removed=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"gcSoftReferences()V\"/>\n\t\t<method name=\"getExternalBytesAllocated()J\"/>\n\t\t<method name=\"getMinimumHeapSize()J\"/>\n\t\t<method name=\"getRuntime()Ldalvik/system/VMRuntime;\"/>\n\t\t<method name=\"getTargetHeapUtilization()F\"/>\n\t\t<method name=\"runFinalizationSync()V\"/>\n\t\t<method name=\"setMinimumHeapSize(J)J\"/>\n\t\t<method name=\"setTargetHeapUtilization(F)F\"/>\n\t</class>\n\t<class name=\"dalvik/system/VMStack\" since=\"1\" removed=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getCallingClassLoader()Ljava/lang/ClassLoader;\"/>\n\t\t<method name=\"getCallingClassLoader2()Ljava/lang/ClassLoader;\"/>\n\t\t<method name=\"getClasses(IZ)[Ljava/lang/Class;\"/>\n\t\t<method name=\"getThreadStackTrace(Ljava/lang/Thread;)[Ljava/lang/StackTraceElement;\"/>\n\t</class>\n\t<class name=\"dalvik/system/Zygote\" since=\"1\" removed=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"fork()I\"/>\n\t\t<method name=\"forkAndSpecialize(II[II[[I)I\" since=\"3\"/>\n\t\t<method name=\"forkAndSpecialize(II[IZ[[I)I\"/>\n\t\t<method name=\"forkSystemServer(II[II[[I)I\" since=\"3\"/>\n\t\t<method name=\"forkSystemServer(II[IZ[[I)I\"/>\n\t\t<field name=\"DEBUG_ENABLE_ASSERT\" since=\"3\"/>\n\t\t<field name=\"DEBUG_ENABLE_CHECKJNI\" since=\"3\"/>\n\t\t<field name=\"DEBUG_ENABLE_DEBUGGER\" since=\"3\"/>\n\t\t<field name=\"DEBUG_ENABLE_SAFEMODE\" since=\"8\"/>\n\t</class>\n\t<class name=\"java/awt/font/NumericShaper\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"getContextualShaper(I)Ljava/awt/font/NumericShaper;\"/>\n\t\t<method name=\"getContextualShaper(II)Ljava/awt/font/NumericShaper;\"/>\n\t\t<method name=\"getContextualShaper(Ljava/util/Set;)Ljava/awt/font/NumericShaper;\" since=\"24\"/>\n\t\t<method name=\"getContextualShaper(Ljava/util/Set;Ljava/awt/font/NumericShaper$Range;)Ljava/awt/font/NumericShaper;\" since=\"24\"/>\n\t\t<method name=\"getRangeSet()Ljava/util/Set;\" since=\"24\"/>\n\t\t<method name=\"getRanges()I\"/>\n\t\t<method name=\"getShaper(I)Ljava/awt/font/NumericShaper;\"/>\n\t\t<method name=\"getShaper(Ljava/awt/font/NumericShaper$Range;)Ljava/awt/font/NumericShaper;\" since=\"24\"/>\n\t\t<method name=\"isContextual()Z\"/>\n\t\t<method name=\"shape([CII)V\"/>\n\t\t<method name=\"shape([CIII)V\"/>\n\t\t<method name=\"shape([CIILjava/awt/font/NumericShaper$Range;)V\" since=\"24\"/>\n\t\t<field name=\"ALL_RANGES\"/>\n\t\t<field name=\"ARABIC\"/>\n\t\t<field name=\"BENGALI\"/>\n\t\t<field name=\"DEVANAGARI\"/>\n\t\t<field name=\"EASTERN_ARABIC\"/>\n\t\t<field name=\"ETHIOPIC\"/>\n\t\t<field name=\"EUROPEAN\"/>\n\t\t<field name=\"GUJARATI\"/>\n\t\t<field name=\"GURMUKHI\"/>\n\t\t<field name=\"KANNADA\"/>\n\t\t<field name=\"KHMER\"/>\n\t\t<field name=\"LAO\"/>\n\t\t<field name=\"MALAYALAM\"/>\n\t\t<field name=\"MONGOLIAN\"/>\n\t\t<field name=\"MYANMAR\"/>\n\t\t<field name=\"ORIYA\"/>\n\t\t<field name=\"TAMIL\"/>\n\t\t<field name=\"TELUGU\"/>\n\t\t<field name=\"THAI\"/>\n\t\t<field name=\"TIBETAN\"/>\n\t</class>\n\t<class name=\"java/awt/font/NumericShaper$Range\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/awt/font/NumericShaper$Range;\"/>\n\t\t<method name=\"values()[Ljava/awt/font/NumericShaper$Range;\"/>\n\t\t<field name=\"ARABIC\"/>\n\t\t<field name=\"BALINESE\"/>\n\t\t<field name=\"BENGALI\"/>\n\t\t<field name=\"CHAM\"/>\n\t\t<field name=\"DEVANAGARI\"/>\n\t\t<field name=\"EASTERN_ARABIC\"/>\n\t\t<field name=\"ETHIOPIC\"/>\n\t\t<field name=\"EUROPEAN\"/>\n\t\t<field name=\"GUJARATI\"/>\n\t\t<field name=\"GURMUKHI\"/>\n\t\t<field name=\"JAVANESE\"/>\n\t\t<field name=\"KANNADA\"/>\n\t\t<field name=\"KAYAH_LI\"/>\n\t\t<field name=\"KHMER\"/>\n\t\t<field name=\"LAO\"/>\n\t\t<field name=\"LEPCHA\"/>\n\t\t<field name=\"LIMBU\"/>\n\t\t<field name=\"MALAYALAM\"/>\n\t\t<field name=\"MEETEI_MAYEK\"/>\n\t\t<field name=\"MONGOLIAN\"/>\n\t\t<field name=\"MYANMAR\"/>\n\t\t<field name=\"MYANMAR_SHAN\"/>\n\t\t<field name=\"NEW_TAI_LUE\"/>\n\t\t<field name=\"NKO\"/>\n\t\t<field name=\"OL_CHIKI\"/>\n\t\t<field name=\"ORIYA\"/>\n\t\t<field name=\"SAURASHTRA\"/>\n\t\t<field name=\"SUNDANESE\"/>\n\t\t<field name=\"TAI_THAM_HORA\"/>\n\t\t<field name=\"TAI_THAM_THAM\"/>\n\t\t<field name=\"TAMIL\"/>\n\t\t<field name=\"TELUGU\"/>\n\t\t<field name=\"THAI\"/>\n\t\t<field name=\"TIBETAN\"/>\n\t\t<field name=\"VAI\"/>\n\t</class>\n\t<class name=\"java/awt/font/TextAttribute\" since=\"1\">\n\t\t<extends name=\"java/text/AttributedCharacterIterator$Attribute\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<field name=\"BACKGROUND\"/>\n\t\t<field name=\"BIDI_EMBEDDING\"/>\n\t\t<field name=\"CHAR_REPLACEMENT\"/>\n\t\t<field name=\"FAMILY\"/>\n\t\t<field name=\"FONT\"/>\n\t\t<field name=\"FOREGROUND\"/>\n\t\t<field name=\"INPUT_METHOD_HIGHLIGHT\"/>\n\t\t<field name=\"INPUT_METHOD_UNDERLINE\"/>\n\t\t<field name=\"JUSTIFICATION\"/>\n\t\t<field name=\"JUSTIFICATION_FULL\"/>\n\t\t<field name=\"JUSTIFICATION_NONE\"/>\n\t\t<field name=\"KERNING\" since=\"9\"/>\n\t\t<field name=\"KERNING_ON\" since=\"9\"/>\n\t\t<field name=\"LIGATURES\" since=\"9\"/>\n\t\t<field name=\"LIGATURES_ON\" since=\"9\"/>\n\t\t<field name=\"NUMERIC_SHAPING\"/>\n\t\t<field name=\"POSTURE\"/>\n\t\t<field name=\"POSTURE_OBLIQUE\"/>\n\t\t<field name=\"POSTURE_REGULAR\"/>\n\t\t<field name=\"RUN_DIRECTION\"/>\n\t\t<field name=\"RUN_DIRECTION_LTR\"/>\n\t\t<field name=\"RUN_DIRECTION_RTL\"/>\n\t\t<field name=\"SIZE\"/>\n\t\t<field name=\"STRIKETHROUGH\"/>\n\t\t<field name=\"STRIKETHROUGH_ON\"/>\n\t\t<field name=\"SUPERSCRIPT\"/>\n\t\t<field name=\"SUPERSCRIPT_SUB\"/>\n\t\t<field name=\"SUPERSCRIPT_SUPER\"/>\n\t\t<field name=\"SWAP_COLORS\"/>\n\t\t<field name=\"SWAP_COLORS_ON\"/>\n\t\t<field name=\"TRACKING\" since=\"9\"/>\n\t\t<field name=\"TRACKING_LOOSE\" since=\"9\"/>\n\t\t<field name=\"TRACKING_TIGHT\" since=\"9\"/>\n\t\t<field name=\"TRANSFORM\"/>\n\t\t<field name=\"UNDERLINE\"/>\n\t\t<field name=\"UNDERLINE_LOW_DASHED\"/>\n\t\t<field name=\"UNDERLINE_LOW_DOTTED\"/>\n\t\t<field name=\"UNDERLINE_LOW_GRAY\"/>\n\t\t<field name=\"UNDERLINE_LOW_ONE_PIXEL\"/>\n\t\t<field name=\"UNDERLINE_LOW_TWO_PIXEL\"/>\n\t\t<field name=\"UNDERLINE_ON\"/>\n\t\t<field name=\"WEIGHT\"/>\n\t\t<field name=\"WEIGHT_BOLD\"/>\n\t\t<field name=\"WEIGHT_DEMIBOLD\"/>\n\t\t<field name=\"WEIGHT_DEMILIGHT\"/>\n\t\t<field name=\"WEIGHT_EXTRABOLD\"/>\n\t\t<field name=\"WEIGHT_EXTRA_LIGHT\"/>\n\t\t<field name=\"WEIGHT_HEAVY\"/>\n\t\t<field name=\"WEIGHT_LIGHT\"/>\n\t\t<field name=\"WEIGHT_MEDIUM\"/>\n\t\t<field name=\"WEIGHT_REGULAR\"/>\n\t\t<field name=\"WEIGHT_SEMIBOLD\"/>\n\t\t<field name=\"WEIGHT_ULTRABOLD\"/>\n\t\t<field name=\"WIDTH\"/>\n\t\t<field name=\"WIDTH_CONDENSED\"/>\n\t\t<field name=\"WIDTH_EXTENDED\"/>\n\t\t<field name=\"WIDTH_REGULAR\"/>\n\t\t<field name=\"WIDTH_SEMI_CONDENSED\"/>\n\t\t<field name=\"WIDTH_SEMI_EXTENDED\"/>\n\t</class>\n\t<class name=\"java/beans/IndexedPropertyChangeEvent\" since=\"3\">\n\t\t<extends name=\"java/beans/PropertyChangeEvent\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;I)V\"/>\n\t\t<method name=\"getIndex()I\"/>\n\t</class>\n\t<class name=\"java/beans/PropertyChangeEvent\" since=\"3\">\n\t\t<extends name=\"java/util/EventObject\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"getNewValue()Ljava/lang/Object;\"/>\n\t\t<method name=\"getOldValue()Ljava/lang/Object;\"/>\n\t\t<method name=\"getPropagationId()Ljava/lang/Object;\"/>\n\t\t<method name=\"getPropertyName()Ljava/lang/String;\"/>\n\t\t<method name=\"setPropagationId(Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"java/beans/PropertyChangeListener\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/EventListener\"/>\n\t\t<method name=\"propertyChange(Ljava/beans/PropertyChangeEvent;)V\"/>\n\t</class>\n\t<class name=\"java/beans/PropertyChangeListenerProxy\" since=\"3\">\n\t\t<extends name=\"java/util/EventListenerProxy\"/>\n\t\t<implements name=\"java/beans/PropertyChangeListener\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/beans/PropertyChangeListener;)V\"/>\n\t\t<method name=\"getPropertyName()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/beans/PropertyChangeSupport\" since=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"addPropertyChangeListener(Ljava/beans/PropertyChangeListener;)V\"/>\n\t\t<method name=\"addPropertyChangeListener(Ljava/lang/String;Ljava/beans/PropertyChangeListener;)V\"/>\n\t\t<method name=\"fireIndexedPropertyChange(Ljava/lang/String;III)V\"/>\n\t\t<method name=\"fireIndexedPropertyChange(Ljava/lang/String;ILjava/lang/Object;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"fireIndexedPropertyChange(Ljava/lang/String;IZZ)V\"/>\n\t\t<method name=\"firePropertyChange(Ljava/beans/PropertyChangeEvent;)V\"/>\n\t\t<method name=\"firePropertyChange(Ljava/lang/String;II)V\"/>\n\t\t<method name=\"firePropertyChange(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"firePropertyChange(Ljava/lang/String;ZZ)V\"/>\n\t\t<method name=\"getPropertyChangeListeners()[Ljava/beans/PropertyChangeListener;\"/>\n\t\t<method name=\"getPropertyChangeListeners(Ljava/lang/String;)[Ljava/beans/PropertyChangeListener;\"/>\n\t\t<method name=\"hasListeners(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"removePropertyChangeListener(Ljava/beans/PropertyChangeListener;)V\"/>\n\t\t<method name=\"removePropertyChangeListener(Ljava/lang/String;Ljava/beans/PropertyChangeListener;)V\"/>\n\t</class>\n\t<class name=\"java/io/BufferedInputStream\" since=\"1\">\n\t\t<extends name=\"java/io/FilterInputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;I)V\"/>\n\t\t<field name=\"buf\"/>\n\t\t<field name=\"count\"/>\n\t\t<field name=\"marklimit\"/>\n\t\t<field name=\"markpos\"/>\n\t\t<field name=\"pos\"/>\n\t</class>\n\t<class name=\"java/io/BufferedOutputStream\" since=\"1\">\n\t\t<extends name=\"java/io/FilterOutputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;I)V\"/>\n\t\t<field name=\"buf\"/>\n\t\t<field name=\"count\"/>\n\t</class>\n\t<class name=\"java/io/BufferedReader\" since=\"1\">\n\t\t<extends name=\"java/io/Reader\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Reader;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Reader;I)V\"/>\n\t\t<method name=\"lines()Ljava/util/stream/Stream;\" since=\"24\"/>\n\t\t<method name=\"readLine()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/io/BufferedWriter\" since=\"1\">\n\t\t<extends name=\"java/io/Writer\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Writer;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Writer;I)V\"/>\n\t\t<method name=\"newLine()V\"/>\n\t</class>\n\t<class name=\"java/io/ByteArrayInputStream\" since=\"1\">\n\t\t<extends name=\"java/io/InputStream\"/>\n\t\t<method name=\"&lt;init>([B)V\"/>\n\t\t<method name=\"&lt;init>([BII)V\"/>\n\t\t<field name=\"buf\"/>\n\t\t<field name=\"count\"/>\n\t\t<field name=\"mark\"/>\n\t\t<field name=\"pos\"/>\n\t</class>\n\t<class name=\"java/io/ByteArrayOutputStream\" since=\"1\">\n\t\t<extends name=\"java/io/OutputStream\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"size()I\"/>\n\t\t<method name=\"toByteArray()[B\"/>\n\t\t<method name=\"toString(I)Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"toString(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"writeTo(Ljava/io/OutputStream;)V\"/>\n\t\t<field name=\"buf\"/>\n\t\t<field name=\"count\"/>\n\t</class>\n\t<class name=\"java/io/CharArrayReader\" since=\"1\">\n\t\t<extends name=\"java/io/Reader\"/>\n\t\t<method name=\"&lt;init>([C)V\"/>\n\t\t<method name=\"&lt;init>([CII)V\"/>\n\t\t<field name=\"buf\"/>\n\t\t<field name=\"count\"/>\n\t\t<field name=\"markedPos\"/>\n\t\t<field name=\"pos\"/>\n\t</class>\n\t<class name=\"java/io/CharArrayWriter\" since=\"1\">\n\t\t<extends name=\"java/io/Writer\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"append(C)Ljava/io/CharArrayWriter;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;)Ljava/io/CharArrayWriter;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;II)Ljava/io/CharArrayWriter;\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"size()I\"/>\n\t\t<method name=\"toCharArray()[C\"/>\n\t\t<method name=\"writeTo(Ljava/io/Writer;)V\"/>\n\t\t<field name=\"buf\"/>\n\t\t<field name=\"count\"/>\n\t</class>\n\t<class name=\"java/io/CharConversionException\" since=\"1\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/io/Closeable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\" since=\"19\"/>\n\t\t<method name=\"close()V\"/>\n\t</class>\n\t<class name=\"java/io/Console\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Flushable\"/>\n\t\t<method name=\"format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/Console;\"/>\n\t\t<method name=\"printf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/Console;\"/>\n\t\t<method name=\"readLine()Ljava/lang/String;\"/>\n\t\t<method name=\"readLine(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;\"/>\n\t\t<method name=\"readPassword()[C\"/>\n\t\t<method name=\"readPassword(Ljava/lang/String;[Ljava/lang/Object;)[C\"/>\n\t\t<method name=\"reader()Ljava/io/Reader;\"/>\n\t\t<method name=\"writer()Ljava/io/PrintWriter;\"/>\n\t</class>\n\t<class name=\"java/io/DataInput\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"readBoolean()Z\"/>\n\t\t<method name=\"readByte()B\"/>\n\t\t<method name=\"readChar()C\"/>\n\t\t<method name=\"readDouble()D\"/>\n\t\t<method name=\"readFloat()F\"/>\n\t\t<method name=\"readFully([B)V\"/>\n\t\t<method name=\"readFully([BII)V\"/>\n\t\t<method name=\"readInt()I\"/>\n\t\t<method name=\"readLine()Ljava/lang/String;\"/>\n\t\t<method name=\"readLong()J\"/>\n\t\t<method name=\"readShort()S\"/>\n\t\t<method name=\"readUTF()Ljava/lang/String;\"/>\n\t\t<method name=\"readUnsignedByte()I\"/>\n\t\t<method name=\"readUnsignedShort()I\"/>\n\t\t<method name=\"skipBytes(I)I\"/>\n\t</class>\n\t<class name=\"java/io/DataInputStream\" since=\"1\">\n\t\t<extends name=\"java/io/FilterInputStream\"/>\n\t\t<implements name=\"java/io/DataInput\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"readUTF(Ljava/io/DataInput;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/io/DataOutput\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"write(I)V\"/>\n\t\t<method name=\"write([B)V\"/>\n\t\t<method name=\"write([BII)V\"/>\n\t\t<method name=\"writeBoolean(Z)V\"/>\n\t\t<method name=\"writeByte(I)V\"/>\n\t\t<method name=\"writeBytes(Ljava/lang/String;)V\"/>\n\t\t<method name=\"writeChar(I)V\"/>\n\t\t<method name=\"writeChars(Ljava/lang/String;)V\"/>\n\t\t<method name=\"writeDouble(D)V\"/>\n\t\t<method name=\"writeFloat(F)V\"/>\n\t\t<method name=\"writeInt(I)V\"/>\n\t\t<method name=\"writeLong(J)V\"/>\n\t\t<method name=\"writeShort(I)V\"/>\n\t\t<method name=\"writeUTF(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/io/DataOutputStream\" since=\"1\">\n\t\t<extends name=\"java/io/FilterOutputStream\"/>\n\t\t<implements name=\"java/io/DataOutput\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"size()I\"/>\n\t\t<field name=\"written\"/>\n\t</class>\n\t<class name=\"java/io/EOFException\" since=\"1\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/io/Externalizable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"readExternal(Ljava/io/ObjectInput;)V\"/>\n\t\t<method name=\"writeExternal(Ljava/io/ObjectOutput;)V\"/>\n\t</class>\n\t<class name=\"java/io/File\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/URI;)V\"/>\n\t\t<method name=\"canExecute()Z\" since=\"9\"/>\n\t\t<method name=\"canRead()Z\"/>\n\t\t<method name=\"canWrite()Z\"/>\n\t\t<method name=\"compareTo(Ljava/io/File;)I\"/>\n\t\t<method name=\"createNewFile()Z\"/>\n\t\t<method name=\"createTempFile(Ljava/lang/String;Ljava/lang/String;)Ljava/io/File;\"/>\n\t\t<method name=\"createTempFile(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;)Ljava/io/File;\"/>\n\t\t<method name=\"delete()Z\"/>\n\t\t<method name=\"deleteOnExit()V\"/>\n\t\t<method name=\"exists()Z\"/>\n\t\t<method name=\"getAbsoluteFile()Ljava/io/File;\"/>\n\t\t<method name=\"getAbsolutePath()Ljava/lang/String;\"/>\n\t\t<method name=\"getCanonicalFile()Ljava/io/File;\"/>\n\t\t<method name=\"getCanonicalPath()Ljava/lang/String;\"/>\n\t\t<method name=\"getFreeSpace()J\" since=\"9\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getParent()Ljava/lang/String;\"/>\n\t\t<method name=\"getParentFile()Ljava/io/File;\"/>\n\t\t<method name=\"getPath()Ljava/lang/String;\"/>\n\t\t<method name=\"getTotalSpace()J\" since=\"9\"/>\n\t\t<method name=\"getUsableSpace()J\" since=\"9\"/>\n\t\t<method name=\"isAbsolute()Z\"/>\n\t\t<method name=\"isDirectory()Z\"/>\n\t\t<method name=\"isFile()Z\"/>\n\t\t<method name=\"isHidden()Z\"/>\n\t\t<method name=\"lastModified()J\"/>\n\t\t<method name=\"length()J\"/>\n\t\t<method name=\"list()[Ljava/lang/String;\"/>\n\t\t<method name=\"list(Ljava/io/FilenameFilter;)[Ljava/lang/String;\"/>\n\t\t<method name=\"listFiles()[Ljava/io/File;\"/>\n\t\t<method name=\"listFiles(Ljava/io/FileFilter;)[Ljava/io/File;\"/>\n\t\t<method name=\"listFiles(Ljava/io/FilenameFilter;)[Ljava/io/File;\"/>\n\t\t<method name=\"listRoots()[Ljava/io/File;\"/>\n\t\t<method name=\"mkdir()Z\"/>\n\t\t<method name=\"mkdirs()Z\"/>\n\t\t<method name=\"renameTo(Ljava/io/File;)Z\"/>\n\t\t<method name=\"setExecutable(Z)Z\" since=\"9\"/>\n\t\t<method name=\"setExecutable(ZZ)Z\" since=\"9\"/>\n\t\t<method name=\"setLastModified(J)Z\"/>\n\t\t<method name=\"setReadOnly()Z\"/>\n\t\t<method name=\"setReadable(Z)Z\" since=\"9\"/>\n\t\t<method name=\"setReadable(ZZ)Z\" since=\"9\"/>\n\t\t<method name=\"setWritable(Z)Z\" since=\"9\"/>\n\t\t<method name=\"setWritable(ZZ)Z\" since=\"9\"/>\n\t\t<method name=\"toPath()Ljava/nio/file/Path;\" since=\"26\"/>\n\t\t<method name=\"toURI()Ljava/net/URI;\"/>\n\t\t<method name=\"toURL()Ljava/net/URL;\" deprecated=\"15\"/>\n\t\t<field name=\"pathSeparator\"/>\n\t\t<field name=\"pathSeparatorChar\"/>\n\t\t<field name=\"separator\"/>\n\t\t<field name=\"separatorChar\"/>\n\t</class>\n\t<class name=\"java/io/FileDescriptor\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"sync()V\"/>\n\t\t<method name=\"valid()Z\"/>\n\t\t<field name=\"err\"/>\n\t\t<field name=\"in\"/>\n\t\t<field name=\"out\"/>\n\t</class>\n\t<class name=\"java/io/FileFilter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"accept(Ljava/io/File;)Z\"/>\n\t</class>\n\t<class name=\"java/io/FileInputStream\" since=\"1\">\n\t\t<extends name=\"java/io/InputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/FileDescriptor;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getChannel()Ljava/nio/channels/FileChannel;\"/>\n\t\t<method name=\"getFD()Ljava/io/FileDescriptor;\"/>\n\t</class>\n\t<class name=\"java/io/FileNotFoundException\" since=\"1\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/io/FileOutputStream\" since=\"1\">\n\t\t<extends name=\"java/io/OutputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;Z)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/FileDescriptor;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"getChannel()Ljava/nio/channels/FileChannel;\"/>\n\t\t<method name=\"getFD()Ljava/io/FileDescriptor;\"/>\n\t</class>\n\t<class name=\"java/io/FilePermission\" since=\"1\">\n\t\t<extends name=\"java/security/Permission\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/io/FileReader\" since=\"1\">\n\t\t<extends name=\"java/io/InputStreamReader\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/FileDescriptor;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/io/FileWriter\" since=\"1\">\n\t\t<extends name=\"java/io/OutputStreamWriter\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;Z)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/FileDescriptor;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Z)V\"/>\n\t</class>\n\t<class name=\"java/io/FilenameFilter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"accept(Ljava/io/File;Ljava/lang/String;)Z\"/>\n\t</class>\n\t<class name=\"java/io/FilterInputStream\" since=\"1\">\n\t\t<extends name=\"java/io/InputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\"/>\n\t\t<field name=\"in\"/>\n\t</class>\n\t<class name=\"java/io/FilterOutputStream\" since=\"1\">\n\t\t<extends name=\"java/io/OutputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;)V\"/>\n\t\t<field name=\"out\"/>\n\t</class>\n\t<class name=\"java/io/FilterReader\" since=\"1\">\n\t\t<extends name=\"java/io/Reader\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Reader;)V\"/>\n\t\t<field name=\"in\"/>\n\t</class>\n\t<class name=\"java/io/FilterWriter\" since=\"1\">\n\t\t<extends name=\"java/io/Writer\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Writer;)V\"/>\n\t\t<field name=\"out\"/>\n\t</class>\n\t<class name=\"java/io/Flushable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"flush()V\"/>\n\t</class>\n\t<class name=\"java/io/IOError\" since=\"9\">\n\t\t<extends name=\"java/lang/Error\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/io/IOException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\" since=\"9\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\" since=\"9\"/>\n\t</class>\n\t<class name=\"java/io/InputStream\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"available()I\"/>\n\t\t<method name=\"mark(I)V\"/>\n\t\t<method name=\"markSupported()Z\"/>\n\t\t<method name=\"read()I\"/>\n\t\t<method name=\"read([B)I\"/>\n\t\t<method name=\"read([BII)I\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"skip(J)J\"/>\n\t</class>\n\t<class name=\"java/io/InputStreamReader\" since=\"1\">\n\t\t<extends name=\"java/io/Reader\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;Ljava/nio/charset/Charset;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;Ljava/nio/charset/CharsetDecoder;)V\"/>\n\t\t<method name=\"getEncoding()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/io/InterruptedIOException\" since=\"1\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<field name=\"bytesTransferred\"/>\n\t</class>\n\t<class name=\"java/io/InvalidClassException\" since=\"1\">\n\t\t<extends name=\"java/io/ObjectStreamException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<field name=\"classname\"/>\n\t</class>\n\t<class name=\"java/io/InvalidObjectException\" since=\"1\">\n\t\t<extends name=\"java/io/ObjectStreamException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/io/LineNumberInputStream\" since=\"1\" deprecated=\"1\">\n\t\t<extends name=\"java/io/FilterInputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\" deprecated=\"29\"/>\n\t\t<method name=\"getLineNumber()I\" deprecated=\"29\"/>\n\t\t<method name=\"setLineNumber(I)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"java/io/LineNumberReader\" since=\"1\">\n\t\t<extends name=\"java/io/BufferedReader\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Reader;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Reader;I)V\"/>\n\t\t<method name=\"getLineNumber()I\"/>\n\t\t<method name=\"setLineNumber(I)V\"/>\n\t</class>\n\t<class name=\"java/io/NotActiveException\" since=\"1\">\n\t\t<extends name=\"java/io/ObjectStreamException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/io/NotSerializableException\" since=\"1\">\n\t\t<extends name=\"java/io/ObjectStreamException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/io/ObjectInput\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/DataInput\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\" since=\"19\"/>\n\t\t<method name=\"available()I\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"read()I\"/>\n\t\t<method name=\"read([B)I\"/>\n\t\t<method name=\"read([BII)I\"/>\n\t\t<method name=\"readObject()Ljava/lang/Object;\"/>\n\t\t<method name=\"skip(J)J\"/>\n\t</class>\n\t<class name=\"java/io/ObjectInputStream\" since=\"1\">\n\t\t<extends name=\"java/io/InputStream\"/>\n\t\t<implements name=\"java/io/ObjectInput\"/>\n\t\t<implements name=\"java/io/ObjectStreamConstants\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"defaultReadObject()V\"/>\n\t\t<method name=\"enableResolveObject(Z)Z\"/>\n\t\t<method name=\"readClassDescriptor()Ljava/io/ObjectStreamClass;\"/>\n\t\t<method name=\"readFields()Ljava/io/ObjectInputStream$GetField;\"/>\n\t\t<method name=\"readObjectOverride()Ljava/lang/Object;\"/>\n\t\t<method name=\"readStreamHeader()V\"/>\n\t\t<method name=\"readUnshared()Ljava/lang/Object;\"/>\n\t\t<method name=\"registerValidation(Ljava/io/ObjectInputValidation;I)V\"/>\n\t\t<method name=\"resolveClass(Ljava/io/ObjectStreamClass;)Ljava/lang/Class;\"/>\n\t\t<method name=\"resolveObject(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"resolveProxyClass([Ljava/lang/String;)Ljava/lang/Class;\"/>\n\t</class>\n\t<class name=\"java/io/ObjectInputStream$GetField\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"defaulted(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"get(Ljava/lang/String;B)B\"/>\n\t\t<method name=\"get(Ljava/lang/String;C)C\"/>\n\t\t<method name=\"get(Ljava/lang/String;D)D\"/>\n\t\t<method name=\"get(Ljava/lang/String;F)F\"/>\n\t\t<method name=\"get(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"get(Ljava/lang/String;J)J\"/>\n\t\t<method name=\"get(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"get(Ljava/lang/String;S)S\"/>\n\t\t<method name=\"get(Ljava/lang/String;Z)Z\"/>\n\t\t<method name=\"getObjectStreamClass()Ljava/io/ObjectStreamClass;\"/>\n\t</class>\n\t<class name=\"java/io/ObjectInputValidation\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"validateObject()V\"/>\n\t</class>\n\t<class name=\"java/io/ObjectOutput\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/DataOutput\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\" since=\"19\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"flush()V\"/>\n\t\t<method name=\"writeObject(Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"java/io/ObjectOutputStream\" since=\"1\">\n\t\t<extends name=\"java/io/OutputStream\"/>\n\t\t<implements name=\"java/io/ObjectOutput\"/>\n\t\t<implements name=\"java/io/ObjectStreamConstants\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"annotateClass(Ljava/lang/Class;)V\"/>\n\t\t<method name=\"annotateProxyClass(Ljava/lang/Class;)V\"/>\n\t\t<method name=\"defaultWriteObject()V\"/>\n\t\t<method name=\"drain()V\"/>\n\t\t<method name=\"enableReplaceObject(Z)Z\"/>\n\t\t<method name=\"putFields()Ljava/io/ObjectOutputStream$PutField;\"/>\n\t\t<method name=\"replaceObject(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"useProtocolVersion(I)V\"/>\n\t\t<method name=\"writeClassDescriptor(Ljava/io/ObjectStreamClass;)V\"/>\n\t\t<method name=\"writeFields()V\"/>\n\t\t<method name=\"writeObjectOverride(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"writeStreamHeader()V\"/>\n\t\t<method name=\"writeUnshared(Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"java/io/ObjectOutputStream$PutField\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"put(Ljava/lang/String;B)V\"/>\n\t\t<method name=\"put(Ljava/lang/String;C)V\"/>\n\t\t<method name=\"put(Ljava/lang/String;D)V\"/>\n\t\t<method name=\"put(Ljava/lang/String;F)V\"/>\n\t\t<method name=\"put(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"put(Ljava/lang/String;J)V\"/>\n\t\t<method name=\"put(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"put(Ljava/lang/String;S)V\"/>\n\t\t<method name=\"put(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"write(Ljava/io/ObjectOutput;)V\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"java/io/ObjectStreamClass\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"forClass()Ljava/lang/Class;\"/>\n\t\t<method name=\"getField(Ljava/lang/String;)Ljava/io/ObjectStreamField;\"/>\n\t\t<method name=\"getFields()[Ljava/io/ObjectStreamField;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getSerialVersionUID()J\"/>\n\t\t<method name=\"lookup(Ljava/lang/Class;)Ljava/io/ObjectStreamClass;\"/>\n\t\t<method name=\"lookupAny(Ljava/lang/Class;)Ljava/io/ObjectStreamClass;\" since=\"9\"/>\n\t\t<field name=\"NO_FIELDS\"/>\n\t</class>\n\t<class name=\"java/io/ObjectStreamConstants\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"PROTOCOL_VERSION_1\"/>\n\t\t<field name=\"PROTOCOL_VERSION_2\"/>\n\t\t<field name=\"SC_BLOCK_DATA\"/>\n\t\t<field name=\"SC_ENUM\"/>\n\t\t<field name=\"SC_EXTERNALIZABLE\"/>\n\t\t<field name=\"SC_SERIALIZABLE\"/>\n\t\t<field name=\"SC_WRITE_METHOD\"/>\n\t\t<field name=\"STREAM_MAGIC\"/>\n\t\t<field name=\"STREAM_VERSION\"/>\n\t\t<field name=\"SUBCLASS_IMPLEMENTATION_PERMISSION\"/>\n\t\t<field name=\"SUBSTITUTION_PERMISSION\"/>\n\t\t<field name=\"TC_ARRAY\"/>\n\t\t<field name=\"TC_BASE\"/>\n\t\t<field name=\"TC_BLOCKDATA\"/>\n\t\t<field name=\"TC_BLOCKDATALONG\"/>\n\t\t<field name=\"TC_CLASS\"/>\n\t\t<field name=\"TC_CLASSDESC\"/>\n\t\t<field name=\"TC_ENDBLOCKDATA\"/>\n\t\t<field name=\"TC_ENUM\"/>\n\t\t<field name=\"TC_EXCEPTION\"/>\n\t\t<field name=\"TC_LONGSTRING\"/>\n\t\t<field name=\"TC_MAX\"/>\n\t\t<field name=\"TC_NULL\"/>\n\t\t<field name=\"TC_OBJECT\"/>\n\t\t<field name=\"TC_PROXYCLASSDESC\"/>\n\t\t<field name=\"TC_REFERENCE\"/>\n\t\t<field name=\"TC_RESET\"/>\n\t\t<field name=\"TC_STRING\"/>\n\t\t<field name=\"baseWireHandle\"/>\n\t</class>\n\t<class name=\"java/io/ObjectStreamException\" since=\"1\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/io/ObjectStreamField\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Class;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Class;Z)V\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getOffset()I\"/>\n\t\t<method name=\"getType()Ljava/lang/Class;\"/>\n\t\t<method name=\"getTypeCode()C\"/>\n\t\t<method name=\"getTypeString()Ljava/lang/String;\"/>\n\t\t<method name=\"isPrimitive()Z\"/>\n\t\t<method name=\"isUnshared()Z\"/>\n\t\t<method name=\"setOffset(I)V\"/>\n\t</class>\n\t<class name=\"java/io/OptionalDataException\" since=\"1\">\n\t\t<extends name=\"java/io/ObjectStreamException\"/>\n\t\t<field name=\"eof\"/>\n\t\t<field name=\"length\"/>\n\t</class>\n\t<class name=\"java/io/OutputStream\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<implements name=\"java/io/Flushable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"write(I)V\"/>\n\t\t<method name=\"write([B)V\"/>\n\t\t<method name=\"write([BII)V\"/>\n\t</class>\n\t<class name=\"java/io/OutputStreamWriter\" since=\"1\">\n\t\t<extends name=\"java/io/Writer\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;Ljava/nio/charset/Charset;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;Ljava/nio/charset/CharsetEncoder;)V\"/>\n\t\t<method name=\"getEncoding()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/io/PipedInputStream\" since=\"1\">\n\t\t<extends name=\"java/io/InputStream\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\" since=\"9\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/PipedOutputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/PipedOutputStream;I)V\" since=\"9\"/>\n\t\t<method name=\"connect(Ljava/io/PipedOutputStream;)V\"/>\n\t\t<method name=\"receive(I)V\"/>\n\t\t<field name=\"PIPE_SIZE\"/>\n\t\t<field name=\"buffer\"/>\n\t\t<field name=\"in\"/>\n\t\t<field name=\"out\"/>\n\t</class>\n\t<class name=\"java/io/PipedOutputStream\" since=\"1\">\n\t\t<extends name=\"java/io/OutputStream\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/PipedInputStream;)V\"/>\n\t\t<method name=\"connect(Ljava/io/PipedInputStream;)V\"/>\n\t</class>\n\t<class name=\"java/io/PipedReader\" since=\"1\">\n\t\t<extends name=\"java/io/Reader\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\" since=\"9\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/PipedWriter;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/PipedWriter;I)V\" since=\"9\"/>\n\t\t<method name=\"connect(Ljava/io/PipedWriter;)V\"/>\n\t</class>\n\t<class name=\"java/io/PipedWriter\" since=\"1\">\n\t\t<extends name=\"java/io/Writer\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/PipedReader;)V\"/>\n\t\t<method name=\"connect(Ljava/io/PipedReader;)V\"/>\n\t</class>\n\t<class name=\"java/io/PrintStream\" since=\"1\">\n\t\t<extends name=\"java/io/FilterOutputStream\"/>\n\t\t<implements name=\"java/lang/Appendable\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;Z)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;ZLjava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"append(C)Ljava/io/PrintStream;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;)Ljava/io/PrintStream;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;II)Ljava/io/PrintStream;\"/>\n\t\t<method name=\"checkError()Z\"/>\n\t\t<method name=\"clearError()V\" since=\"9\"/>\n\t\t<method name=\"format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;\"/>\n\t\t<method name=\"format(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;\"/>\n\t\t<method name=\"print(C)V\"/>\n\t\t<method name=\"print(D)V\"/>\n\t\t<method name=\"print(F)V\"/>\n\t\t<method name=\"print(I)V\"/>\n\t\t<method name=\"print(J)V\"/>\n\t\t<method name=\"print(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"print(Ljava/lang/String;)V\"/>\n\t\t<method name=\"print(Z)V\"/>\n\t\t<method name=\"print([C)V\"/>\n\t\t<method name=\"printf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;\"/>\n\t\t<method name=\"printf(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;\"/>\n\t\t<method name=\"println()V\"/>\n\t\t<method name=\"println(C)V\"/>\n\t\t<method name=\"println(D)V\"/>\n\t\t<method name=\"println(F)V\"/>\n\t\t<method name=\"println(I)V\"/>\n\t\t<method name=\"println(J)V\"/>\n\t\t<method name=\"println(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"println(Ljava/lang/String;)V\"/>\n\t\t<method name=\"println(Z)V\"/>\n\t\t<method name=\"println([C)V\"/>\n\t\t<method name=\"setError()V\"/>\n\t</class>\n\t<class name=\"java/io/PrintWriter\" since=\"1\">\n\t\t<extends name=\"java/io/Writer\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;Z)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Writer;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Writer;Z)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"append(C)Ljava/io/PrintWriter;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;)Ljava/io/PrintWriter;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;II)Ljava/io/PrintWriter;\"/>\n\t\t<method name=\"checkError()Z\"/>\n\t\t<method name=\"clearError()V\" since=\"9\"/>\n\t\t<method name=\"format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintWriter;\"/>\n\t\t<method name=\"format(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintWriter;\"/>\n\t\t<method name=\"print(C)V\"/>\n\t\t<method name=\"print(D)V\"/>\n\t\t<method name=\"print(F)V\"/>\n\t\t<method name=\"print(I)V\"/>\n\t\t<method name=\"print(J)V\"/>\n\t\t<method name=\"print(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"print(Ljava/lang/String;)V\"/>\n\t\t<method name=\"print(Z)V\"/>\n\t\t<method name=\"print([C)V\"/>\n\t\t<method name=\"printf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintWriter;\"/>\n\t\t<method name=\"printf(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintWriter;\"/>\n\t\t<method name=\"println()V\"/>\n\t\t<method name=\"println(C)V\"/>\n\t\t<method name=\"println(D)V\"/>\n\t\t<method name=\"println(F)V\"/>\n\t\t<method name=\"println(I)V\"/>\n\t\t<method name=\"println(J)V\"/>\n\t\t<method name=\"println(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"println(Ljava/lang/String;)V\"/>\n\t\t<method name=\"println(Z)V\"/>\n\t\t<method name=\"println([C)V\"/>\n\t\t<method name=\"setError()V\"/>\n\t\t<field name=\"out\"/>\n\t</class>\n\t<class name=\"java/io/PushbackInputStream\" since=\"1\">\n\t\t<extends name=\"java/io/FilterInputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;I)V\"/>\n\t\t<method name=\"unread(I)V\"/>\n\t\t<method name=\"unread([B)V\"/>\n\t\t<method name=\"unread([BII)V\"/>\n\t\t<field name=\"buf\"/>\n\t\t<field name=\"pos\"/>\n\t</class>\n\t<class name=\"java/io/PushbackReader\" since=\"1\">\n\t\t<extends name=\"java/io/FilterReader\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Reader;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Reader;I)V\"/>\n\t\t<method name=\"unread(I)V\"/>\n\t\t<method name=\"unread([C)V\"/>\n\t\t<method name=\"unread([CII)V\"/>\n\t</class>\n\t<class name=\"java/io/RandomAccessFile\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<implements name=\"java/io/DataInput\"/>\n\t\t<implements name=\"java/io/DataOutput\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getChannel()Ljava/nio/channels/FileChannel;\"/>\n\t\t<method name=\"getFD()Ljava/io/FileDescriptor;\"/>\n\t\t<method name=\"getFilePointer()J\"/>\n\t\t<method name=\"length()J\"/>\n\t\t<method name=\"read()I\"/>\n\t\t<method name=\"read([B)I\"/>\n\t\t<method name=\"read([BII)I\"/>\n\t\t<method name=\"seek(J)V\"/>\n\t\t<method name=\"setLength(J)V\"/>\n\t</class>\n\t<class name=\"java/io/Reader\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<implements name=\"java/lang/Readable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"mark(I)V\"/>\n\t\t<method name=\"markSupported()Z\"/>\n\t\t<method name=\"read()I\"/>\n\t\t<method name=\"read([C)I\"/>\n\t\t<method name=\"read([CII)I\"/>\n\t\t<method name=\"ready()Z\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"skip(J)J\"/>\n\t\t<field name=\"lock\"/>\n\t</class>\n\t<class name=\"java/io/SequenceInputStream\" since=\"1\">\n\t\t<extends name=\"java/io/InputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Enumeration;)V\"/>\n\t</class>\n\t<class name=\"java/io/Serializable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"java/io/SerializablePermission\" since=\"1\">\n\t\t<extends name=\"java/security/BasicPermission\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/io/StreamCorruptedException\" since=\"1\">\n\t\t<extends name=\"java/io/ObjectStreamException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/io/StreamTokenizer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Reader;)V\"/>\n\t\t<method name=\"commentChar(I)V\"/>\n\t\t<method name=\"eolIsSignificant(Z)V\"/>\n\t\t<method name=\"lineno()I\"/>\n\t\t<method name=\"lowerCaseMode(Z)V\"/>\n\t\t<method name=\"nextToken()I\"/>\n\t\t<method name=\"ordinaryChar(I)V\"/>\n\t\t<method name=\"ordinaryChars(II)V\"/>\n\t\t<method name=\"parseNumbers()V\"/>\n\t\t<method name=\"pushBack()V\"/>\n\t\t<method name=\"quoteChar(I)V\"/>\n\t\t<method name=\"resetSyntax()V\"/>\n\t\t<method name=\"slashSlashComments(Z)V\"/>\n\t\t<method name=\"slashStarComments(Z)V\"/>\n\t\t<method name=\"whitespaceChars(II)V\"/>\n\t\t<method name=\"wordChars(II)V\"/>\n\t\t<field name=\"TT_EOF\"/>\n\t\t<field name=\"TT_EOL\"/>\n\t\t<field name=\"TT_NUMBER\"/>\n\t\t<field name=\"TT_WORD\"/>\n\t\t<field name=\"nval\"/>\n\t\t<field name=\"sval\"/>\n\t\t<field name=\"ttype\"/>\n\t</class>\n\t<class name=\"java/io/StringBufferInputStream\" since=\"1\" deprecated=\"1\">\n\t\t<extends name=\"java/io/InputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<field name=\"buffer\" deprecated=\"29\"/>\n\t\t<field name=\"count\" deprecated=\"29\"/>\n\t\t<field name=\"pos\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"java/io/StringReader\" since=\"1\">\n\t\t<extends name=\"java/io/Reader\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/io/StringWriter\" since=\"1\">\n\t\t<extends name=\"java/io/Writer\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"append(C)Ljava/io/StringWriter;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;)Ljava/io/StringWriter;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;II)Ljava/io/StringWriter;\"/>\n\t\t<method name=\"getBuffer()Ljava/lang/StringBuffer;\"/>\n\t</class>\n\t<class name=\"java/io/SyncFailedException\" since=\"1\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/io/UTFDataFormatException\" since=\"1\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/io/UncheckedIOException\" since=\"24\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/IOException;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/io/IOException;)V\"/>\n\t\t<method name=\"getCause()Ljava/io/IOException;\"/>\n\t</class>\n\t<class name=\"java/io/UnsupportedEncodingException\" since=\"1\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/io/WriteAbortedException\" since=\"1\">\n\t\t<extends name=\"java/io/ObjectStreamException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Exception;)V\"/>\n\t\t<field name=\"detail\"/>\n\t</class>\n\t<class name=\"java/io/Writer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<implements name=\"java/io/Flushable\"/>\n\t\t<implements name=\"java/lang/Appendable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"append(C)Ljava/io/Writer;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;)Ljava/io/Writer;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;II)Ljava/io/Writer;\"/>\n\t\t<method name=\"write(I)V\"/>\n\t\t<method name=\"write(Ljava/lang/String;)V\"/>\n\t\t<method name=\"write(Ljava/lang/String;II)V\"/>\n\t\t<method name=\"write([C)V\"/>\n\t\t<method name=\"write([CII)V\"/>\n\t\t<field name=\"lock\"/>\n\t</class>\n\t<class name=\"java/lang/AbstractMethodError\" since=\"1\">\n\t\t<extends name=\"java/lang/IncompatibleClassChangeError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/Appendable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"append(C)Ljava/lang/Appendable;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;)Ljava/lang/Appendable;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;II)Ljava/lang/Appendable;\"/>\n\t</class>\n\t<class name=\"java/lang/ArithmeticException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/ArrayIndexOutOfBoundsException\" since=\"1\">\n\t\t<extends name=\"java/lang/IndexOutOfBoundsException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/ArrayStoreException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/AssertionError\" since=\"1\">\n\t\t<extends name=\"java/lang/Error\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(C)V\"/>\n\t\t<method name=\"&lt;init>(D)V\"/>\n\t\t<method name=\"&lt;init>(F)V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(J)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\" since=\"19\"/>\n\t\t<method name=\"&lt;init>(Z)V\"/>\n\t</class>\n\t<class name=\"java/lang/AutoCloseable\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"close()V\"/>\n\t</class>\n\t<class name=\"java/lang/Boolean\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Z)V\"/>\n\t\t<method name=\"booleanValue()Z\"/>\n\t\t<method name=\"compare(ZZ)I\" since=\"19\"/>\n\t\t<method name=\"compareTo(Ljava/lang/Boolean;)I\"/>\n\t\t<method name=\"getBoolean(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"hashCode(Z)I\" since=\"24\"/>\n\t\t<method name=\"logicalAnd(ZZ)Z\" since=\"24\"/>\n\t\t<method name=\"logicalOr(ZZ)Z\" since=\"24\"/>\n\t\t<method name=\"logicalXor(ZZ)Z\" since=\"24\"/>\n\t\t<method name=\"parseBoolean(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"toString(Z)Ljava/lang/String;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/lang/Boolean;\"/>\n\t\t<method name=\"valueOf(Z)Ljava/lang/Boolean;\"/>\n\t\t<field name=\"FALSE\"/>\n\t\t<field name=\"TRUE\"/>\n\t\t<field name=\"TYPE\"/>\n\t</class>\n\t<class name=\"java/lang/BootstrapMethodError\" since=\"26\">\n\t\t<extends name=\"java/lang/LinkageError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/lang/Byte\" since=\"1\">\n\t\t<extends name=\"java/lang/Number\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(B)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"compare(BB)I\" since=\"19\"/>\n\t\t<method name=\"compareTo(Ljava/lang/Byte;)I\"/>\n\t\t<method name=\"decode(Ljava/lang/String;)Ljava/lang/Byte;\"/>\n\t\t<method name=\"hashCode(B)I\" since=\"24\"/>\n\t\t<method name=\"parseByte(Ljava/lang/String;)B\"/>\n\t\t<method name=\"parseByte(Ljava/lang/String;I)B\"/>\n\t\t<method name=\"toString(B)Ljava/lang/String;\"/>\n\t\t<method name=\"toUnsignedInt(B)I\" since=\"26\"/>\n\t\t<method name=\"toUnsignedLong(B)J\" since=\"26\"/>\n\t\t<method name=\"valueOf(B)Ljava/lang/Byte;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/lang/Byte;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;I)Ljava/lang/Byte;\"/>\n\t\t<field name=\"BYTES\" since=\"24\"/>\n\t\t<field name=\"MAX_VALUE\"/>\n\t\t<field name=\"MIN_VALUE\"/>\n\t\t<field name=\"SIZE\"/>\n\t\t<field name=\"TYPE\"/>\n\t</class>\n\t<class name=\"java/lang/CharSequence\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"charAt(I)C\"/>\n\t\t<method name=\"chars()Ljava/util/stream/IntStream;\" since=\"24\"/>\n\t\t<method name=\"codePoints()Ljava/util/stream/IntStream;\" since=\"24\"/>\n\t\t<method name=\"length()I\"/>\n\t\t<method name=\"subSequence(II)Ljava/lang/CharSequence;\"/>\n\t</class>\n\t<class name=\"java/lang/Character\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(C)V\"/>\n\t\t<method name=\"charCount(I)I\"/>\n\t\t<method name=\"charValue()C\"/>\n\t\t<method name=\"codePointAt(Ljava/lang/CharSequence;I)I\"/>\n\t\t<method name=\"codePointAt([CI)I\"/>\n\t\t<method name=\"codePointAt([CII)I\"/>\n\t\t<method name=\"codePointBefore(Ljava/lang/CharSequence;I)I\"/>\n\t\t<method name=\"codePointBefore([CI)I\"/>\n\t\t<method name=\"codePointBefore([CII)I\"/>\n\t\t<method name=\"codePointCount(Ljava/lang/CharSequence;II)I\"/>\n\t\t<method name=\"codePointCount([CII)I\"/>\n\t\t<method name=\"compare(CC)I\" since=\"19\"/>\n\t\t<method name=\"compareTo(Ljava/lang/Character;)I\"/>\n\t\t<method name=\"digit(CI)I\"/>\n\t\t<method name=\"digit(II)I\"/>\n\t\t<method name=\"forDigit(II)C\"/>\n\t\t<method name=\"getDirectionality(C)B\"/>\n\t\t<method name=\"getDirectionality(I)B\"/>\n\t\t<method name=\"getName(I)Ljava/lang/String;\" since=\"19\"/>\n\t\t<method name=\"getNumericValue(C)I\"/>\n\t\t<method name=\"getNumericValue(I)I\"/>\n\t\t<method name=\"getType(C)I\"/>\n\t\t<method name=\"getType(I)I\"/>\n\t\t<method name=\"hashCode(C)I\" since=\"24\"/>\n\t\t<method name=\"highSurrogate(I)C\" since=\"19\"/>\n\t\t<method name=\"isAlphabetic(I)Z\" since=\"19\"/>\n\t\t<method name=\"isBmpCodePoint(I)Z\" since=\"19\"/>\n\t\t<method name=\"isDefined(C)Z\"/>\n\t\t<method name=\"isDefined(I)Z\"/>\n\t\t<method name=\"isDigit(C)Z\"/>\n\t\t<method name=\"isDigit(I)Z\"/>\n\t\t<method name=\"isHighSurrogate(C)Z\"/>\n\t\t<method name=\"isISOControl(C)Z\"/>\n\t\t<method name=\"isISOControl(I)Z\"/>\n\t\t<method name=\"isIdentifierIgnorable(C)Z\"/>\n\t\t<method name=\"isIdentifierIgnorable(I)Z\"/>\n\t\t<method name=\"isIdeographic(I)Z\" since=\"19\"/>\n\t\t<method name=\"isJavaIdentifierPart(C)Z\"/>\n\t\t<method name=\"isJavaIdentifierPart(I)Z\"/>\n\t\t<method name=\"isJavaIdentifierStart(C)Z\"/>\n\t\t<method name=\"isJavaIdentifierStart(I)Z\"/>\n\t\t<method name=\"isJavaLetter(C)Z\" deprecated=\"15\"/>\n\t\t<method name=\"isJavaLetterOrDigit(C)Z\" deprecated=\"15\"/>\n\t\t<method name=\"isLetter(C)Z\"/>\n\t\t<method name=\"isLetter(I)Z\"/>\n\t\t<method name=\"isLetterOrDigit(C)Z\"/>\n\t\t<method name=\"isLetterOrDigit(I)Z\"/>\n\t\t<method name=\"isLowSurrogate(C)Z\"/>\n\t\t<method name=\"isLowerCase(C)Z\"/>\n\t\t<method name=\"isLowerCase(I)Z\"/>\n\t\t<method name=\"isMirrored(C)Z\"/>\n\t\t<method name=\"isMirrored(I)Z\"/>\n\t\t<method name=\"isSpace(C)Z\" deprecated=\"15\"/>\n\t\t<method name=\"isSpaceChar(C)Z\"/>\n\t\t<method name=\"isSpaceChar(I)Z\"/>\n\t\t<method name=\"isSupplementaryCodePoint(I)Z\"/>\n\t\t<method name=\"isSurrogate(C)Z\" since=\"19\"/>\n\t\t<method name=\"isSurrogatePair(CC)Z\"/>\n\t\t<method name=\"isTitleCase(C)Z\"/>\n\t\t<method name=\"isTitleCase(I)Z\"/>\n\t\t<method name=\"isUnicodeIdentifierPart(C)Z\"/>\n\t\t<method name=\"isUnicodeIdentifierPart(I)Z\"/>\n\t\t<method name=\"isUnicodeIdentifierStart(C)Z\"/>\n\t\t<method name=\"isUnicodeIdentifierStart(I)Z\"/>\n\t\t<method name=\"isUpperCase(C)Z\"/>\n\t\t<method name=\"isUpperCase(I)Z\"/>\n\t\t<method name=\"isValidCodePoint(I)Z\"/>\n\t\t<method name=\"isWhitespace(C)Z\"/>\n\t\t<method name=\"isWhitespace(I)Z\"/>\n\t\t<method name=\"lowSurrogate(I)C\" since=\"19\"/>\n\t\t<method name=\"offsetByCodePoints(Ljava/lang/CharSequence;II)I\"/>\n\t\t<method name=\"offsetByCodePoints([CIIII)I\"/>\n\t\t<method name=\"reverseBytes(C)C\"/>\n\t\t<method name=\"toChars(I)[C\"/>\n\t\t<method name=\"toChars(I[CI)I\"/>\n\t\t<method name=\"toCodePoint(CC)I\"/>\n\t\t<method name=\"toLowerCase(C)C\"/>\n\t\t<method name=\"toLowerCase(I)I\"/>\n\t\t<method name=\"toString(C)Ljava/lang/String;\"/>\n\t\t<method name=\"toTitleCase(C)C\"/>\n\t\t<method name=\"toTitleCase(I)I\"/>\n\t\t<method name=\"toUpperCase(C)C\"/>\n\t\t<method name=\"toUpperCase(I)I\"/>\n\t\t<method name=\"valueOf(C)Ljava/lang/Character;\"/>\n\t\t<field name=\"BYTES\" since=\"24\"/>\n\t\t<field name=\"COMBINING_SPACING_MARK\"/>\n\t\t<field name=\"CONNECTOR_PUNCTUATION\"/>\n\t\t<field name=\"CONTROL\"/>\n\t\t<field name=\"CURRENCY_SYMBOL\"/>\n\t\t<field name=\"DASH_PUNCTUATION\"/>\n\t\t<field name=\"DECIMAL_DIGIT_NUMBER\"/>\n\t\t<field name=\"DIRECTIONALITY_ARABIC_NUMBER\"/>\n\t\t<field name=\"DIRECTIONALITY_BOUNDARY_NEUTRAL\"/>\n\t\t<field name=\"DIRECTIONALITY_COMMON_NUMBER_SEPARATOR\"/>\n\t\t<field name=\"DIRECTIONALITY_EUROPEAN_NUMBER\"/>\n\t\t<field name=\"DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR\"/>\n\t\t<field name=\"DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR\"/>\n\t\t<field name=\"DIRECTIONALITY_LEFT_TO_RIGHT\"/>\n\t\t<field name=\"DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING\"/>\n\t\t<field name=\"DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE\"/>\n\t\t<field name=\"DIRECTIONALITY_NONSPACING_MARK\"/>\n\t\t<field name=\"DIRECTIONALITY_OTHER_NEUTRALS\"/>\n\t\t<field name=\"DIRECTIONALITY_PARAGRAPH_SEPARATOR\"/>\n\t\t<field name=\"DIRECTIONALITY_POP_DIRECTIONAL_FORMAT\"/>\n\t\t<field name=\"DIRECTIONALITY_RIGHT_TO_LEFT\"/>\n\t\t<field name=\"DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC\"/>\n\t\t<field name=\"DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING\"/>\n\t\t<field name=\"DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE\"/>\n\t\t<field name=\"DIRECTIONALITY_SEGMENT_SEPARATOR\"/>\n\t\t<field name=\"DIRECTIONALITY_UNDEFINED\"/>\n\t\t<field name=\"DIRECTIONALITY_WHITESPACE\"/>\n\t\t<field name=\"ENCLOSING_MARK\"/>\n\t\t<field name=\"END_PUNCTUATION\"/>\n\t\t<field name=\"FINAL_QUOTE_PUNCTUATION\"/>\n\t\t<field name=\"FORMAT\"/>\n\t\t<field name=\"INITIAL_QUOTE_PUNCTUATION\"/>\n\t\t<field name=\"LETTER_NUMBER\"/>\n\t\t<field name=\"LINE_SEPARATOR\"/>\n\t\t<field name=\"LOWERCASE_LETTER\"/>\n\t\t<field name=\"MATH_SYMBOL\"/>\n\t\t<field name=\"MAX_CODE_POINT\"/>\n\t\t<field name=\"MAX_HIGH_SURROGATE\"/>\n\t\t<field name=\"MAX_LOW_SURROGATE\"/>\n\t\t<field name=\"MAX_RADIX\"/>\n\t\t<field name=\"MAX_SURROGATE\"/>\n\t\t<field name=\"MAX_VALUE\"/>\n\t\t<field name=\"MIN_CODE_POINT\"/>\n\t\t<field name=\"MIN_HIGH_SURROGATE\"/>\n\t\t<field name=\"MIN_LOW_SURROGATE\"/>\n\t\t<field name=\"MIN_RADIX\"/>\n\t\t<field name=\"MIN_SUPPLEMENTARY_CODE_POINT\"/>\n\t\t<field name=\"MIN_SURROGATE\"/>\n\t\t<field name=\"MIN_VALUE\"/>\n\t\t<field name=\"MODIFIER_LETTER\"/>\n\t\t<field name=\"MODIFIER_SYMBOL\"/>\n\t\t<field name=\"NON_SPACING_MARK\"/>\n\t\t<field name=\"OTHER_LETTER\"/>\n\t\t<field name=\"OTHER_NUMBER\"/>\n\t\t<field name=\"OTHER_PUNCTUATION\"/>\n\t\t<field name=\"OTHER_SYMBOL\"/>\n\t\t<field name=\"PARAGRAPH_SEPARATOR\"/>\n\t\t<field name=\"PRIVATE_USE\"/>\n\t\t<field name=\"SIZE\"/>\n\t\t<field name=\"SPACE_SEPARATOR\"/>\n\t\t<field name=\"START_PUNCTUATION\"/>\n\t\t<field name=\"SURROGATE\"/>\n\t\t<field name=\"TITLECASE_LETTER\"/>\n\t\t<field name=\"TYPE\"/>\n\t\t<field name=\"UNASSIGNED\"/>\n\t\t<field name=\"UPPERCASE_LETTER\"/>\n\t</class>\n\t<class name=\"java/lang/Character$Subset\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/Character$UnicodeBlock\" since=\"1\">\n\t\t<extends name=\"java/lang/Character$Subset\"/>\n\t\t<method name=\"forName(Ljava/lang/String;)Ljava/lang/Character$UnicodeBlock;\"/>\n\t\t<method name=\"of(C)Ljava/lang/Character$UnicodeBlock;\"/>\n\t\t<method name=\"of(I)Ljava/lang/Character$UnicodeBlock;\"/>\n\t\t<field name=\"AEGEAN_NUMBERS\"/>\n\t\t<field name=\"ALCHEMICAL_SYMBOLS\" since=\"19\"/>\n\t\t<field name=\"ALPHABETIC_PRESENTATION_FORMS\"/>\n\t\t<field name=\"ANCIENT_GREEK_MUSICAL_NOTATION\" since=\"19\"/>\n\t\t<field name=\"ANCIENT_GREEK_NUMBERS\" since=\"19\"/>\n\t\t<field name=\"ANCIENT_SYMBOLS\" since=\"19\"/>\n\t\t<field name=\"ARABIC\"/>\n\t\t<field name=\"ARABIC_EXTENDED_A\" since=\"26\"/>\n\t\t<field name=\"ARABIC_MATHEMATICAL_ALPHABETIC_SYMBOLS\" since=\"26\"/>\n\t\t<field name=\"ARABIC_PRESENTATION_FORMS_A\"/>\n\t\t<field name=\"ARABIC_PRESENTATION_FORMS_B\"/>\n\t\t<field name=\"ARABIC_SUPPLEMENT\" since=\"19\"/>\n\t\t<field name=\"ARMENIAN\"/>\n\t\t<field name=\"ARROWS\"/>\n\t\t<field name=\"AVESTAN\" since=\"19\"/>\n\t\t<field name=\"BALINESE\" since=\"19\"/>\n\t\t<field name=\"BAMUM\" since=\"19\"/>\n\t\t<field name=\"BAMUM_SUPPLEMENT\" since=\"19\"/>\n\t\t<field name=\"BASIC_LATIN\"/>\n\t\t<field name=\"BATAK\" since=\"19\"/>\n\t\t<field name=\"BENGALI\"/>\n\t\t<field name=\"BLOCK_ELEMENTS\"/>\n\t\t<field name=\"BOPOMOFO\"/>\n\t\t<field name=\"BOPOMOFO_EXTENDED\"/>\n\t\t<field name=\"BOX_DRAWING\"/>\n\t\t<field name=\"BRAHMI\" since=\"19\"/>\n\t\t<field name=\"BRAILLE_PATTERNS\"/>\n\t\t<field name=\"BUGINESE\" since=\"19\"/>\n\t\t<field name=\"BUHID\"/>\n\t\t<field name=\"BYZANTINE_MUSICAL_SYMBOLS\"/>\n\t\t<field name=\"CARIAN\" since=\"19\"/>\n\t\t<field name=\"CHAKMA\" since=\"26\"/>\n\t\t<field name=\"CHAM\" since=\"19\"/>\n\t\t<field name=\"CHEROKEE\"/>\n\t\t<field name=\"CJK_COMPATIBILITY\"/>\n\t\t<field name=\"CJK_COMPATIBILITY_FORMS\"/>\n\t\t<field name=\"CJK_COMPATIBILITY_IDEOGRAPHS\"/>\n\t\t<field name=\"CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT\"/>\n\t\t<field name=\"CJK_RADICALS_SUPPLEMENT\"/>\n\t\t<field name=\"CJK_STROKES\" since=\"19\"/>\n\t\t<field name=\"CJK_SYMBOLS_AND_PUNCTUATION\"/>\n\t\t<field name=\"CJK_UNIFIED_IDEOGRAPHS\"/>\n\t\t<field name=\"CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A\"/>\n\t\t<field name=\"CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B\"/>\n\t\t<field name=\"CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C\" since=\"19\"/>\n\t\t<field name=\"CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D\" since=\"19\"/>\n\t\t<field name=\"COMBINING_DIACRITICAL_MARKS\"/>\n\t\t<field name=\"COMBINING_DIACRITICAL_MARKS_SUPPLEMENT\" since=\"19\"/>\n\t\t<field name=\"COMBINING_HALF_MARKS\"/>\n\t\t<field name=\"COMBINING_MARKS_FOR_SYMBOLS\"/>\n\t\t<field name=\"COMMON_INDIC_NUMBER_FORMS\" since=\"19\"/>\n\t\t<field name=\"CONTROL_PICTURES\"/>\n\t\t<field name=\"COPTIC\" since=\"19\"/>\n\t\t<field name=\"COUNTING_ROD_NUMERALS\" since=\"19\"/>\n\t\t<field name=\"CUNEIFORM\" since=\"19\"/>\n\t\t<field name=\"CUNEIFORM_NUMBERS_AND_PUNCTUATION\" since=\"19\"/>\n\t\t<field name=\"CURRENCY_SYMBOLS\"/>\n\t\t<field name=\"CYPRIOT_SYLLABARY\"/>\n\t\t<field name=\"CYRILLIC\"/>\n\t\t<field name=\"CYRILLIC_EXTENDED_A\" since=\"19\"/>\n\t\t<field name=\"CYRILLIC_EXTENDED_B\" since=\"19\"/>\n\t\t<field name=\"CYRILLIC_SUPPLEMENTARY\"/>\n\t\t<field name=\"DESERET\"/>\n\t\t<field name=\"DEVANAGARI\"/>\n\t\t<field name=\"DEVANAGARI_EXTENDED\" since=\"19\"/>\n\t\t<field name=\"DINGBATS\"/>\n\t\t<field name=\"DOMINO_TILES\" since=\"19\"/>\n\t\t<field name=\"EGYPTIAN_HIEROGLYPHS\" since=\"19\"/>\n\t\t<field name=\"EMOTICONS\" since=\"19\"/>\n\t\t<field name=\"ENCLOSED_ALPHANUMERICS\"/>\n\t\t<field name=\"ENCLOSED_ALPHANUMERIC_SUPPLEMENT\" since=\"19\"/>\n\t\t<field name=\"ENCLOSED_CJK_LETTERS_AND_MONTHS\"/>\n\t\t<field name=\"ENCLOSED_IDEOGRAPHIC_SUPPLEMENT\" since=\"19\"/>\n\t\t<field name=\"ETHIOPIC\"/>\n\t\t<field name=\"ETHIOPIC_EXTENDED\" since=\"19\"/>\n\t\t<field name=\"ETHIOPIC_EXTENDED_A\" since=\"19\"/>\n\t\t<field name=\"ETHIOPIC_SUPPLEMENT\" since=\"19\"/>\n\t\t<field name=\"GENERAL_PUNCTUATION\"/>\n\t\t<field name=\"GEOMETRIC_SHAPES\"/>\n\t\t<field name=\"GEORGIAN\"/>\n\t\t<field name=\"GEORGIAN_SUPPLEMENT\" since=\"19\"/>\n\t\t<field name=\"GLAGOLITIC\" since=\"19\"/>\n\t\t<field name=\"GOTHIC\"/>\n\t\t<field name=\"GREEK\"/>\n\t\t<field name=\"GREEK_EXTENDED\"/>\n\t\t<field name=\"GUJARATI\"/>\n\t\t<field name=\"GURMUKHI\"/>\n\t\t<field name=\"HALFWIDTH_AND_FULLWIDTH_FORMS\"/>\n\t\t<field name=\"HANGUL_COMPATIBILITY_JAMO\"/>\n\t\t<field name=\"HANGUL_JAMO\"/>\n\t\t<field name=\"HANGUL_JAMO_EXTENDED_A\" since=\"19\"/>\n\t\t<field name=\"HANGUL_JAMO_EXTENDED_B\" since=\"19\"/>\n\t\t<field name=\"HANGUL_SYLLABLES\"/>\n\t\t<field name=\"HANUNOO\"/>\n\t\t<field name=\"HEBREW\"/>\n\t\t<field name=\"HIGH_PRIVATE_USE_SURROGATES\"/>\n\t\t<field name=\"HIGH_SURROGATES\"/>\n\t\t<field name=\"HIRAGANA\"/>\n\t\t<field name=\"IDEOGRAPHIC_DESCRIPTION_CHARACTERS\"/>\n\t\t<field name=\"IMPERIAL_ARAMAIC\" since=\"19\"/>\n\t\t<field name=\"INSCRIPTIONAL_PAHLAVI\" since=\"19\"/>\n\t\t<field name=\"INSCRIPTIONAL_PARTHIAN\" since=\"19\"/>\n\t\t<field name=\"IPA_EXTENSIONS\"/>\n\t\t<field name=\"JAVANESE\" since=\"19\"/>\n\t\t<field name=\"KAITHI\" since=\"19\"/>\n\t\t<field name=\"KANA_SUPPLEMENT\" since=\"19\"/>\n\t\t<field name=\"KANBUN\"/>\n\t\t<field name=\"KANGXI_RADICALS\"/>\n\t\t<field name=\"KANNADA\"/>\n\t\t<field name=\"KATAKANA\"/>\n\t\t<field name=\"KATAKANA_PHONETIC_EXTENSIONS\"/>\n\t\t<field name=\"KAYAH_LI\" since=\"19\"/>\n\t\t<field name=\"KHAROSHTHI\" since=\"19\"/>\n\t\t<field name=\"KHMER\"/>\n\t\t<field name=\"KHMER_SYMBOLS\"/>\n\t\t<field name=\"LAO\"/>\n\t\t<field name=\"LATIN_1_SUPPLEMENT\"/>\n\t\t<field name=\"LATIN_EXTENDED_A\"/>\n\t\t<field name=\"LATIN_EXTENDED_ADDITIONAL\"/>\n\t\t<field name=\"LATIN_EXTENDED_B\"/>\n\t\t<field name=\"LATIN_EXTENDED_C\" since=\"19\"/>\n\t\t<field name=\"LATIN_EXTENDED_D\" since=\"19\"/>\n\t\t<field name=\"LEPCHA\" since=\"19\"/>\n\t\t<field name=\"LETTERLIKE_SYMBOLS\"/>\n\t\t<field name=\"LIMBU\"/>\n\t\t<field name=\"LINEAR_B_IDEOGRAMS\"/>\n\t\t<field name=\"LINEAR_B_SYLLABARY\"/>\n\t\t<field name=\"LISU\" since=\"19\"/>\n\t\t<field name=\"LOW_SURROGATES\"/>\n\t\t<field name=\"LYCIAN\" since=\"19\"/>\n\t\t<field name=\"LYDIAN\" since=\"19\"/>\n\t\t<field name=\"MAHJONG_TILES\" since=\"19\"/>\n\t\t<field name=\"MALAYALAM\"/>\n\t\t<field name=\"MANDAIC\" since=\"19\"/>\n\t\t<field name=\"MATHEMATICAL_ALPHANUMERIC_SYMBOLS\"/>\n\t\t<field name=\"MATHEMATICAL_OPERATORS\"/>\n\t\t<field name=\"MEETEI_MAYEK\" since=\"19\"/>\n\t\t<field name=\"MEETEI_MAYEK_EXTENSIONS\" since=\"26\"/>\n\t\t<field name=\"MEROITIC_CURSIVE\" since=\"26\"/>\n\t\t<field name=\"MEROITIC_HIEROGLYPHS\" since=\"26\"/>\n\t\t<field name=\"MIAO\" since=\"26\"/>\n\t\t<field name=\"MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A\"/>\n\t\t<field name=\"MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B\"/>\n\t\t<field name=\"MISCELLANEOUS_SYMBOLS\"/>\n\t\t<field name=\"MISCELLANEOUS_SYMBOLS_AND_ARROWS\"/>\n\t\t<field name=\"MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS\" since=\"19\"/>\n\t\t<field name=\"MISCELLANEOUS_TECHNICAL\"/>\n\t\t<field name=\"MODIFIER_TONE_LETTERS\" since=\"19\"/>\n\t\t<field name=\"MONGOLIAN\"/>\n\t\t<field name=\"MUSICAL_SYMBOLS\"/>\n\t\t<field name=\"MYANMAR\"/>\n\t\t<field name=\"MYANMAR_EXTENDED_A\" since=\"19\"/>\n\t\t<field name=\"NEW_TAI_LUE\" since=\"19\"/>\n\t\t<field name=\"NKO\" since=\"19\"/>\n\t\t<field name=\"NUMBER_FORMS\"/>\n\t\t<field name=\"OGHAM\"/>\n\t\t<field name=\"OLD_ITALIC\"/>\n\t\t<field name=\"OLD_PERSIAN\" since=\"19\"/>\n\t\t<field name=\"OLD_SOUTH_ARABIAN\" since=\"19\"/>\n\t\t<field name=\"OLD_TURKIC\" since=\"19\"/>\n\t\t<field name=\"OL_CHIKI\" since=\"19\"/>\n\t\t<field name=\"OPTICAL_CHARACTER_RECOGNITION\"/>\n\t\t<field name=\"ORIYA\"/>\n\t\t<field name=\"OSMANYA\"/>\n\t\t<field name=\"PHAGS_PA\" since=\"19\"/>\n\t\t<field name=\"PHAISTOS_DISC\" since=\"19\"/>\n\t\t<field name=\"PHOENICIAN\" since=\"19\"/>\n\t\t<field name=\"PHONETIC_EXTENSIONS\"/>\n\t\t<field name=\"PHONETIC_EXTENSIONS_SUPPLEMENT\" since=\"19\"/>\n\t\t<field name=\"PLAYING_CARDS\" since=\"19\"/>\n\t\t<field name=\"PRIVATE_USE_AREA\"/>\n\t\t<field name=\"REJANG\" since=\"19\"/>\n\t\t<field name=\"RUMI_NUMERAL_SYMBOLS\" since=\"19\"/>\n\t\t<field name=\"RUNIC\"/>\n\t\t<field name=\"SAMARITAN\" since=\"19\"/>\n\t\t<field name=\"SAURASHTRA\" since=\"19\"/>\n\t\t<field name=\"SHARADA\" since=\"26\"/>\n\t\t<field name=\"SHAVIAN\"/>\n\t\t<field name=\"SINHALA\"/>\n\t\t<field name=\"SMALL_FORM_VARIANTS\"/>\n\t\t<field name=\"SORA_SOMPENG\" since=\"26\"/>\n\t\t<field name=\"SPACING_MODIFIER_LETTERS\"/>\n\t\t<field name=\"SPECIALS\"/>\n\t\t<field name=\"SUNDANESE\" since=\"19\"/>\n\t\t<field name=\"SUNDANESE_SUPPLEMENT\" since=\"26\"/>\n\t\t<field name=\"SUPERSCRIPTS_AND_SUBSCRIPTS\"/>\n\t\t<field name=\"SUPPLEMENTAL_ARROWS_A\"/>\n\t\t<field name=\"SUPPLEMENTAL_ARROWS_B\"/>\n\t\t<field name=\"SUPPLEMENTAL_MATHEMATICAL_OPERATORS\"/>\n\t\t<field name=\"SUPPLEMENTAL_PUNCTUATION\" since=\"19\"/>\n\t\t<field name=\"SUPPLEMENTARY_PRIVATE_USE_AREA_A\"/>\n\t\t<field name=\"SUPPLEMENTARY_PRIVATE_USE_AREA_B\"/>\n\t\t<field name=\"SURROGATES_AREA\" deprecated=\"15\"/>\n\t\t<field name=\"SYLOTI_NAGRI\" since=\"19\"/>\n\t\t<field name=\"SYRIAC\"/>\n\t\t<field name=\"TAGALOG\"/>\n\t\t<field name=\"TAGBANWA\"/>\n\t\t<field name=\"TAGS\"/>\n\t\t<field name=\"TAI_LE\"/>\n\t\t<field name=\"TAI_THAM\" since=\"19\"/>\n\t\t<field name=\"TAI_VIET\" since=\"19\"/>\n\t\t<field name=\"TAI_XUAN_JING_SYMBOLS\"/>\n\t\t<field name=\"TAKRI\" since=\"26\"/>\n\t\t<field name=\"TAMIL\"/>\n\t\t<field name=\"TELUGU\"/>\n\t\t<field name=\"THAANA\"/>\n\t\t<field name=\"THAI\"/>\n\t\t<field name=\"TIBETAN\"/>\n\t\t<field name=\"TIFINAGH\" since=\"19\"/>\n\t\t<field name=\"TRANSPORT_AND_MAP_SYMBOLS\" since=\"19\"/>\n\t\t<field name=\"UGARITIC\"/>\n\t\t<field name=\"UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS\"/>\n\t\t<field name=\"UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED\" since=\"19\"/>\n\t\t<field name=\"VAI\" since=\"19\"/>\n\t\t<field name=\"VARIATION_SELECTORS\"/>\n\t\t<field name=\"VARIATION_SELECTORS_SUPPLEMENT\"/>\n\t\t<field name=\"VEDIC_EXTENSIONS\" since=\"19\"/>\n\t\t<field name=\"VERTICAL_FORMS\" since=\"19\"/>\n\t\t<field name=\"YIJING_HEXAGRAM_SYMBOLS\"/>\n\t\t<field name=\"YI_RADICALS\"/>\n\t\t<field name=\"YI_SYLLABLES\"/>\n\t</class>\n\t<class name=\"java/lang/Character$UnicodeScript\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"forName(Ljava/lang/String;)Ljava/lang/Character$UnicodeScript;\"/>\n\t\t<method name=\"of(I)Ljava/lang/Character$UnicodeScript;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/lang/Character$UnicodeScript;\"/>\n\t\t<method name=\"values()[Ljava/lang/Character$UnicodeScript;\"/>\n\t\t<field name=\"ARABIC\"/>\n\t\t<field name=\"ARMENIAN\"/>\n\t\t<field name=\"AVESTAN\"/>\n\t\t<field name=\"BALINESE\"/>\n\t\t<field name=\"BAMUM\"/>\n\t\t<field name=\"BATAK\"/>\n\t\t<field name=\"BENGALI\"/>\n\t\t<field name=\"BOPOMOFO\"/>\n\t\t<field name=\"BRAHMI\"/>\n\t\t<field name=\"BRAILLE\"/>\n\t\t<field name=\"BUGINESE\"/>\n\t\t<field name=\"BUHID\"/>\n\t\t<field name=\"CANADIAN_ABORIGINAL\"/>\n\t\t<field name=\"CARIAN\"/>\n\t\t<field name=\"CHAKMA\" since=\"26\"/>\n\t\t<field name=\"CHAM\"/>\n\t\t<field name=\"CHEROKEE\"/>\n\t\t<field name=\"COMMON\"/>\n\t\t<field name=\"COPTIC\"/>\n\t\t<field name=\"CUNEIFORM\"/>\n\t\t<field name=\"CYPRIOT\"/>\n\t\t<field name=\"CYRILLIC\"/>\n\t\t<field name=\"DESERET\"/>\n\t\t<field name=\"DEVANAGARI\"/>\n\t\t<field name=\"EGYPTIAN_HIEROGLYPHS\"/>\n\t\t<field name=\"ETHIOPIC\"/>\n\t\t<field name=\"GEORGIAN\"/>\n\t\t<field name=\"GLAGOLITIC\"/>\n\t\t<field name=\"GOTHIC\"/>\n\t\t<field name=\"GREEK\"/>\n\t\t<field name=\"GUJARATI\"/>\n\t\t<field name=\"GURMUKHI\"/>\n\t\t<field name=\"HAN\"/>\n\t\t<field name=\"HANGUL\"/>\n\t\t<field name=\"HANUNOO\"/>\n\t\t<field name=\"HEBREW\"/>\n\t\t<field name=\"HIRAGANA\"/>\n\t\t<field name=\"IMPERIAL_ARAMAIC\"/>\n\t\t<field name=\"INHERITED\"/>\n\t\t<field name=\"INSCRIPTIONAL_PAHLAVI\"/>\n\t\t<field name=\"INSCRIPTIONAL_PARTHIAN\"/>\n\t\t<field name=\"JAVANESE\"/>\n\t\t<field name=\"KAITHI\"/>\n\t\t<field name=\"KANNADA\"/>\n\t\t<field name=\"KATAKANA\"/>\n\t\t<field name=\"KAYAH_LI\"/>\n\t\t<field name=\"KHAROSHTHI\"/>\n\t\t<field name=\"KHMER\"/>\n\t\t<field name=\"LAO\"/>\n\t\t<field name=\"LATIN\"/>\n\t\t<field name=\"LEPCHA\"/>\n\t\t<field name=\"LIMBU\"/>\n\t\t<field name=\"LINEAR_B\"/>\n\t\t<field name=\"LISU\"/>\n\t\t<field name=\"LYCIAN\"/>\n\t\t<field name=\"LYDIAN\"/>\n\t\t<field name=\"MALAYALAM\"/>\n\t\t<field name=\"MANDAIC\"/>\n\t\t<field name=\"MEETEI_MAYEK\"/>\n\t\t<field name=\"MEROITIC_CURSIVE\" since=\"26\"/>\n\t\t<field name=\"MEROITIC_HIEROGLYPHS\" since=\"26\"/>\n\t\t<field name=\"MIAO\" since=\"26\"/>\n\t\t<field name=\"MONGOLIAN\"/>\n\t\t<field name=\"MYANMAR\"/>\n\t\t<field name=\"NEW_TAI_LUE\"/>\n\t\t<field name=\"NKO\"/>\n\t\t<field name=\"OGHAM\"/>\n\t\t<field name=\"OLD_ITALIC\"/>\n\t\t<field name=\"OLD_PERSIAN\"/>\n\t\t<field name=\"OLD_SOUTH_ARABIAN\"/>\n\t\t<field name=\"OLD_TURKIC\"/>\n\t\t<field name=\"OL_CHIKI\"/>\n\t\t<field name=\"ORIYA\"/>\n\t\t<field name=\"OSMANYA\"/>\n\t\t<field name=\"PHAGS_PA\"/>\n\t\t<field name=\"PHOENICIAN\"/>\n\t\t<field name=\"REJANG\"/>\n\t\t<field name=\"RUNIC\"/>\n\t\t<field name=\"SAMARITAN\"/>\n\t\t<field name=\"SAURASHTRA\"/>\n\t\t<field name=\"SHARADA\" since=\"26\"/>\n\t\t<field name=\"SHAVIAN\"/>\n\t\t<field name=\"SINHALA\"/>\n\t\t<field name=\"SORA_SOMPENG\" since=\"26\"/>\n\t\t<field name=\"SUNDANESE\"/>\n\t\t<field name=\"SYLOTI_NAGRI\"/>\n\t\t<field name=\"SYRIAC\"/>\n\t\t<field name=\"TAGALOG\"/>\n\t\t<field name=\"TAGBANWA\"/>\n\t\t<field name=\"TAI_LE\"/>\n\t\t<field name=\"TAI_THAM\"/>\n\t\t<field name=\"TAI_VIET\"/>\n\t\t<field name=\"TAKRI\" since=\"26\"/>\n\t\t<field name=\"TAMIL\"/>\n\t\t<field name=\"TELUGU\"/>\n\t\t<field name=\"THAANA\"/>\n\t\t<field name=\"THAI\"/>\n\t\t<field name=\"TIBETAN\"/>\n\t\t<field name=\"TIFINAGH\"/>\n\t\t<field name=\"UGARITIC\"/>\n\t\t<field name=\"UNKNOWN\"/>\n\t\t<field name=\"VAI\"/>\n\t\t<field name=\"YI\"/>\n\t</class>\n\t<class name=\"java/lang/Class\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/reflect/AnnotatedElement\"/>\n\t\t<implements name=\"java/lang/reflect/GenericDeclaration\"/>\n\t\t<implements name=\"java/lang/reflect/Type\"/>\n\t\t<method name=\"asSubclass(Ljava/lang/Class;)Ljava/lang/Class;\"/>\n\t\t<method name=\"cast(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"desiredAssertionStatus()Z\"/>\n\t\t<method name=\"forName(Ljava/lang/String;)Ljava/lang/Class;\"/>\n\t\t<method name=\"forName(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;\"/>\n\t\t<method name=\"getCanonicalName()Ljava/lang/String;\"/>\n\t\t<method name=\"getClassLoader()Ljava/lang/ClassLoader;\"/>\n\t\t<method name=\"getClasses()[Ljava/lang/Class;\"/>\n\t\t<method name=\"getComponentType()Ljava/lang/Class;\"/>\n\t\t<method name=\"getConstructor([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;\"/>\n\t\t<method name=\"getConstructors()[Ljava/lang/reflect/Constructor;\"/>\n\t\t<method name=\"getDeclaredClasses()[Ljava/lang/Class;\"/>\n\t\t<method name=\"getDeclaredConstructor([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;\"/>\n\t\t<method name=\"getDeclaredConstructors()[Ljava/lang/reflect/Constructor;\"/>\n\t\t<method name=\"getDeclaredField(Ljava/lang/String;)Ljava/lang/reflect/Field;\"/>\n\t\t<method name=\"getDeclaredFields()[Ljava/lang/reflect/Field;\"/>\n\t\t<method name=\"getDeclaredMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;\"/>\n\t\t<method name=\"getDeclaredMethods()[Ljava/lang/reflect/Method;\"/>\n\t\t<method name=\"getDeclaringClass()Ljava/lang/Class;\"/>\n\t\t<method name=\"getEnclosingClass()Ljava/lang/Class;\"/>\n\t\t<method name=\"getEnclosingConstructor()Ljava/lang/reflect/Constructor;\"/>\n\t\t<method name=\"getEnclosingMethod()Ljava/lang/reflect/Method;\"/>\n\t\t<method name=\"getEnumConstants()[Ljava/lang/Object;\"/>\n\t\t<method name=\"getField(Ljava/lang/String;)Ljava/lang/reflect/Field;\"/>\n\t\t<method name=\"getFields()[Ljava/lang/reflect/Field;\"/>\n\t\t<method name=\"getGenericInterfaces()[Ljava/lang/reflect/Type;\"/>\n\t\t<method name=\"getGenericSuperclass()Ljava/lang/reflect/Type;\"/>\n\t\t<method name=\"getInterfaces()[Ljava/lang/Class;\"/>\n\t\t<method name=\"getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;\"/>\n\t\t<method name=\"getMethods()[Ljava/lang/reflect/Method;\"/>\n\t\t<method name=\"getModifiers()I\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getPackage()Ljava/lang/Package;\"/>\n\t\t<method name=\"getProtectionDomain()Ljava/security/ProtectionDomain;\"/>\n\t\t<method name=\"getResource(Ljava/lang/String;)Ljava/net/URL;\"/>\n\t\t<method name=\"getResourceAsStream(Ljava/lang/String;)Ljava/io/InputStream;\"/>\n\t\t<method name=\"getSigners()[Ljava/lang/Object;\"/>\n\t\t<method name=\"getSimpleName()Ljava/lang/String;\"/>\n\t\t<method name=\"getSuperclass()Ljava/lang/Class;\"/>\n\t\t<method name=\"getTypeName()Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"isAnnotation()Z\"/>\n\t\t<method name=\"isAnonymousClass()Z\"/>\n\t\t<method name=\"isArray()Z\"/>\n\t\t<method name=\"isAssignableFrom(Ljava/lang/Class;)Z\"/>\n\t\t<method name=\"isEnum()Z\"/>\n\t\t<method name=\"isInstance(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"isInterface()Z\"/>\n\t\t<method name=\"isLocalClass()Z\"/>\n\t\t<method name=\"isMemberClass()Z\"/>\n\t\t<method name=\"isPrimitive()Z\"/>\n\t\t<method name=\"isSynthetic()Z\"/>\n\t\t<method name=\"newInstance()Ljava/lang/Object;\"/>\n\t\t<method name=\"toGenericString()Ljava/lang/String;\" since=\"26\"/>\n\t</class>\n\t<class name=\"java/lang/ClassCastException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/ClassCircularityError\" since=\"1\">\n\t\t<extends name=\"java/lang/LinkageError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/ClassFormatError\" since=\"1\">\n\t\t<extends name=\"java/lang/LinkageError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/ClassLoader\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/ClassLoader;)V\"/>\n\t\t<method name=\"clearAssertionStatus()V\"/>\n\t\t<method name=\"defineClass(Ljava/lang/String;Ljava/nio/ByteBuffer;Ljava/security/ProtectionDomain;)Ljava/lang/Class;\"/>\n\t\t<method name=\"defineClass(Ljava/lang/String;[BII)Ljava/lang/Class;\"/>\n\t\t<method name=\"defineClass(Ljava/lang/String;[BIILjava/security/ProtectionDomain;)Ljava/lang/Class;\"/>\n\t\t<method name=\"defineClass([BII)Ljava/lang/Class;\" deprecated=\"15\"/>\n\t\t<method name=\"definePackage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/net/URL;)Ljava/lang/Package;\"/>\n\t\t<method name=\"findClass(Ljava/lang/String;)Ljava/lang/Class;\"/>\n\t\t<method name=\"findLibrary(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"findLoadedClass(Ljava/lang/String;)Ljava/lang/Class;\"/>\n\t\t<method name=\"findResource(Ljava/lang/String;)Ljava/net/URL;\"/>\n\t\t<method name=\"findResources(Ljava/lang/String;)Ljava/util/Enumeration;\"/>\n\t\t<method name=\"findSystemClass(Ljava/lang/String;)Ljava/lang/Class;\"/>\n\t\t<method name=\"getPackage(Ljava/lang/String;)Ljava/lang/Package;\"/>\n\t\t<method name=\"getPackages()[Ljava/lang/Package;\"/>\n\t\t<method name=\"getParent()Ljava/lang/ClassLoader;\"/>\n\t\t<method name=\"getResource(Ljava/lang/String;)Ljava/net/URL;\"/>\n\t\t<method name=\"getResourceAsStream(Ljava/lang/String;)Ljava/io/InputStream;\"/>\n\t\t<method name=\"getResources(Ljava/lang/String;)Ljava/util/Enumeration;\"/>\n\t\t<method name=\"getSystemClassLoader()Ljava/lang/ClassLoader;\"/>\n\t\t<method name=\"getSystemResource(Ljava/lang/String;)Ljava/net/URL;\"/>\n\t\t<method name=\"getSystemResourceAsStream(Ljava/lang/String;)Ljava/io/InputStream;\"/>\n\t\t<method name=\"getSystemResources(Ljava/lang/String;)Ljava/util/Enumeration;\"/>\n\t\t<method name=\"loadClass(Ljava/lang/String;)Ljava/lang/Class;\"/>\n\t\t<method name=\"loadClass(Ljava/lang/String;Z)Ljava/lang/Class;\"/>\n\t\t<method name=\"registerAsParallelCapable()Z\" since=\"24\"/>\n\t\t<method name=\"resolveClass(Ljava/lang/Class;)V\"/>\n\t\t<method name=\"setClassAssertionStatus(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"setDefaultAssertionStatus(Z)V\"/>\n\t\t<method name=\"setPackageAssertionStatus(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"setSigners(Ljava/lang/Class;[Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"java/lang/ClassNotFoundException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\" removed=\"19\"/>\n\t\t<extends name=\"java/lang/ReflectiveOperationException\" since=\"19\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"getException()Ljava/lang/Throwable;\"/>\n\t</class>\n\t<class name=\"java/lang/CloneNotSupportedException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/Cloneable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"java/lang/Comparable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"compareTo(Ljava/lang/Object;)I\"/>\n\t</class>\n\t<class name=\"java/lang/Compiler\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"command(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"compileClass(Ljava/lang/Class;)Z\"/>\n\t\t<method name=\"compileClasses(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"disable()V\"/>\n\t\t<method name=\"enable()V\"/>\n\t</class>\n\t<class name=\"java/lang/Deprecated\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t</class>\n\t<class name=\"java/lang/Double\" since=\"1\">\n\t\t<extends name=\"java/lang/Number\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(D)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"compare(DD)I\"/>\n\t\t<method name=\"compareTo(Ljava/lang/Double;)I\"/>\n\t\t<method name=\"doubleToLongBits(D)J\"/>\n\t\t<method name=\"doubleToRawLongBits(D)J\"/>\n\t\t<method name=\"hashCode(D)I\" since=\"24\"/>\n\t\t<method name=\"isFinite(D)Z\" since=\"24\"/>\n\t\t<method name=\"isInfinite()Z\"/>\n\t\t<method name=\"isInfinite(D)Z\"/>\n\t\t<method name=\"isNaN()Z\"/>\n\t\t<method name=\"isNaN(D)Z\"/>\n\t\t<method name=\"longBitsToDouble(J)D\"/>\n\t\t<method name=\"max(DD)D\" since=\"24\"/>\n\t\t<method name=\"min(DD)D\" since=\"24\"/>\n\t\t<method name=\"parseDouble(Ljava/lang/String;)D\"/>\n\t\t<method name=\"sum(DD)D\" since=\"24\"/>\n\t\t<method name=\"toHexString(D)Ljava/lang/String;\"/>\n\t\t<method name=\"toString(D)Ljava/lang/String;\"/>\n\t\t<method name=\"valueOf(D)Ljava/lang/Double;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/lang/Double;\"/>\n\t\t<field name=\"BYTES\" since=\"24\"/>\n\t\t<field name=\"MAX_EXPONENT\" since=\"9\"/>\n\t\t<field name=\"MAX_VALUE\"/>\n\t\t<field name=\"MIN_EXPONENT\" since=\"9\"/>\n\t\t<field name=\"MIN_NORMAL\" since=\"9\"/>\n\t\t<field name=\"MIN_VALUE\"/>\n\t\t<field name=\"NEGATIVE_INFINITY\"/>\n\t\t<field name=\"NaN\"/>\n\t\t<field name=\"POSITIVE_INFINITY\"/>\n\t\t<field name=\"SIZE\"/>\n\t\t<field name=\"TYPE\"/>\n\t</class>\n\t<class name=\"java/lang/Enum\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"compareTo(Ljava/lang/Enum;)I\"/>\n\t\t<method name=\"getDeclaringClass()Ljava/lang/Class;\"/>\n\t\t<method name=\"name()Ljava/lang/String;\"/>\n\t\t<method name=\"ordinal()I\"/>\n\t\t<method name=\"valueOf(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;\"/>\n\t</class>\n\t<class name=\"java/lang/EnumConstantNotPresentException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Class;Ljava/lang/String;)V\"/>\n\t\t<method name=\"constantName()Ljava/lang/String;\"/>\n\t\t<method name=\"enumType()Ljava/lang/Class;\"/>\n\t</class>\n\t<class name=\"java/lang/Error\" since=\"1\">\n\t\t<extends name=\"java/lang/Throwable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;ZZ)V\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/lang/Exception\" since=\"1\">\n\t\t<extends name=\"java/lang/Throwable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;ZZ)V\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/lang/ExceptionInInitializerError\" since=\"1\">\n\t\t<extends name=\"java/lang/LinkageError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"getException()Ljava/lang/Throwable;\"/>\n\t</class>\n\t<class name=\"java/lang/Float\" since=\"1\">\n\t\t<extends name=\"java/lang/Number\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(D)V\"/>\n\t\t<method name=\"&lt;init>(F)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"compare(FF)I\"/>\n\t\t<method name=\"compareTo(Ljava/lang/Float;)I\"/>\n\t\t<method name=\"floatToIntBits(F)I\"/>\n\t\t<method name=\"floatToRawIntBits(F)I\"/>\n\t\t<method name=\"hashCode(F)I\" since=\"24\"/>\n\t\t<method name=\"intBitsToFloat(I)F\"/>\n\t\t<method name=\"isFinite(F)Z\" since=\"24\"/>\n\t\t<method name=\"isInfinite()Z\"/>\n\t\t<method name=\"isInfinite(F)Z\"/>\n\t\t<method name=\"isNaN()Z\"/>\n\t\t<method name=\"isNaN(F)Z\"/>\n\t\t<method name=\"max(FF)F\" since=\"24\"/>\n\t\t<method name=\"min(FF)F\" since=\"24\"/>\n\t\t<method name=\"parseFloat(Ljava/lang/String;)F\"/>\n\t\t<method name=\"sum(FF)F\" since=\"24\"/>\n\t\t<method name=\"toHexString(F)Ljava/lang/String;\"/>\n\t\t<method name=\"toString(F)Ljava/lang/String;\"/>\n\t\t<method name=\"valueOf(F)Ljava/lang/Float;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/lang/Float;\"/>\n\t\t<field name=\"BYTES\" since=\"24\"/>\n\t\t<field name=\"MAX_EXPONENT\" since=\"9\"/>\n\t\t<field name=\"MAX_VALUE\"/>\n\t\t<field name=\"MIN_EXPONENT\" since=\"9\"/>\n\t\t<field name=\"MIN_NORMAL\" since=\"9\"/>\n\t\t<field name=\"MIN_VALUE\"/>\n\t\t<field name=\"NEGATIVE_INFINITY\"/>\n\t\t<field name=\"NaN\"/>\n\t\t<field name=\"POSITIVE_INFINITY\"/>\n\t\t<field name=\"SIZE\"/>\n\t\t<field name=\"TYPE\"/>\n\t</class>\n\t<class name=\"java/lang/FunctionalInterface\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t</class>\n\t<class name=\"java/lang/IllegalAccessError\" since=\"1\">\n\t\t<extends name=\"java/lang/IncompatibleClassChangeError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/IllegalAccessException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\" removed=\"19\"/>\n\t\t<extends name=\"java/lang/ReflectiveOperationException\" since=\"19\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/IllegalArgumentException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/lang/IllegalMonitorStateException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/IllegalStateException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/lang/IllegalThreadStateException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalArgumentException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/IncompatibleClassChangeError\" since=\"1\">\n\t\t<extends name=\"java/lang/LinkageError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/IndexOutOfBoundsException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/InheritableThreadLocal\" since=\"1\">\n\t\t<extends name=\"java/lang/ThreadLocal\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"childValue(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/lang/InstantiationError\" since=\"1\">\n\t\t<extends name=\"java/lang/IncompatibleClassChangeError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/InstantiationException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\" removed=\"19\"/>\n\t\t<extends name=\"java/lang/ReflectiveOperationException\" since=\"19\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/Integer\" since=\"1\">\n\t\t<extends name=\"java/lang/Number\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"bitCount(I)I\"/>\n\t\t<method name=\"compare(II)I\" since=\"19\"/>\n\t\t<method name=\"compareTo(Ljava/lang/Integer;)I\"/>\n\t\t<method name=\"compareUnsigned(II)I\" since=\"26\"/>\n\t\t<method name=\"decode(Ljava/lang/String;)Ljava/lang/Integer;\"/>\n\t\t<method name=\"divideUnsigned(II)I\" since=\"26\"/>\n\t\t<method name=\"getInteger(Ljava/lang/String;)Ljava/lang/Integer;\"/>\n\t\t<method name=\"getInteger(Ljava/lang/String;I)Ljava/lang/Integer;\"/>\n\t\t<method name=\"getInteger(Ljava/lang/String;Ljava/lang/Integer;)Ljava/lang/Integer;\"/>\n\t\t<method name=\"hashCode(I)I\" since=\"24\"/>\n\t\t<method name=\"highestOneBit(I)I\"/>\n\t\t<method name=\"lowestOneBit(I)I\"/>\n\t\t<method name=\"max(II)I\" since=\"24\"/>\n\t\t<method name=\"min(II)I\" since=\"24\"/>\n\t\t<method name=\"numberOfLeadingZeros(I)I\"/>\n\t\t<method name=\"numberOfTrailingZeros(I)I\"/>\n\t\t<method name=\"parseInt(Ljava/lang/String;)I\"/>\n\t\t<method name=\"parseInt(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"parseUnsignedInt(Ljava/lang/String;)I\" since=\"26\"/>\n\t\t<method name=\"parseUnsignedInt(Ljava/lang/String;I)I\" since=\"26\"/>\n\t\t<method name=\"remainderUnsigned(II)I\" since=\"26\"/>\n\t\t<method name=\"reverse(I)I\"/>\n\t\t<method name=\"reverseBytes(I)I\"/>\n\t\t<method name=\"rotateLeft(II)I\"/>\n\t\t<method name=\"rotateRight(II)I\"/>\n\t\t<method name=\"signum(I)I\"/>\n\t\t<method name=\"sum(II)I\" since=\"24\"/>\n\t\t<method name=\"toBinaryString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"toHexString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"toOctalString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"toString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"toString(II)Ljava/lang/String;\"/>\n\t\t<method name=\"toUnsignedLong(I)J\" since=\"26\"/>\n\t\t<method name=\"toUnsignedString(I)Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"toUnsignedString(II)Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"valueOf(I)Ljava/lang/Integer;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/lang/Integer;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;I)Ljava/lang/Integer;\"/>\n\t\t<field name=\"BYTES\" since=\"24\"/>\n\t\t<field name=\"MAX_VALUE\"/>\n\t\t<field name=\"MIN_VALUE\"/>\n\t\t<field name=\"SIZE\"/>\n\t\t<field name=\"TYPE\"/>\n\t</class>\n\t<class name=\"java/lang/InternalError\" since=\"1\">\n\t\t<extends name=\"java/lang/VirtualMachineError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\" since=\"24\"/>\n\t</class>\n\t<class name=\"java/lang/InterruptedException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/Iterable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"forEach(Ljava/util/function/Consumer;)V\" since=\"24\"/>\n\t\t<method name=\"iterator()Ljava/util/Iterator;\"/>\n\t\t<method name=\"spliterator()Ljava/util/Spliterator;\" since=\"24\"/>\n\t</class>\n\t<class name=\"java/lang/LinkageError\" since=\"1\">\n\t\t<extends name=\"java/lang/Error\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\" since=\"19\"/>\n\t</class>\n\t<class name=\"java/lang/Long\" since=\"1\">\n\t\t<extends name=\"java/lang/Number\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(J)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"bitCount(J)I\"/>\n\t\t<method name=\"compare(JJ)I\" since=\"19\"/>\n\t\t<method name=\"compareTo(Ljava/lang/Long;)I\"/>\n\t\t<method name=\"compareUnsigned(JJ)I\" since=\"26\"/>\n\t\t<method name=\"decode(Ljava/lang/String;)Ljava/lang/Long;\"/>\n\t\t<method name=\"divideUnsigned(JJ)J\" since=\"26\"/>\n\t\t<method name=\"getLong(Ljava/lang/String;)Ljava/lang/Long;\"/>\n\t\t<method name=\"getLong(Ljava/lang/String;J)Ljava/lang/Long;\"/>\n\t\t<method name=\"getLong(Ljava/lang/String;Ljava/lang/Long;)Ljava/lang/Long;\"/>\n\t\t<method name=\"hashCode(J)I\" since=\"24\"/>\n\t\t<method name=\"highestOneBit(J)J\"/>\n\t\t<method name=\"lowestOneBit(J)J\"/>\n\t\t<method name=\"max(JJ)J\" since=\"24\"/>\n\t\t<method name=\"min(JJ)J\" since=\"24\"/>\n\t\t<method name=\"numberOfLeadingZeros(J)I\"/>\n\t\t<method name=\"numberOfTrailingZeros(J)I\"/>\n\t\t<method name=\"parseLong(Ljava/lang/String;)J\"/>\n\t\t<method name=\"parseLong(Ljava/lang/String;I)J\"/>\n\t\t<method name=\"parseUnsignedLong(Ljava/lang/String;)J\" since=\"26\"/>\n\t\t<method name=\"parseUnsignedLong(Ljava/lang/String;I)J\" since=\"26\"/>\n\t\t<method name=\"remainderUnsigned(JJ)J\" since=\"26\"/>\n\t\t<method name=\"reverse(J)J\"/>\n\t\t<method name=\"reverseBytes(J)J\"/>\n\t\t<method name=\"rotateLeft(JI)J\"/>\n\t\t<method name=\"rotateRight(JI)J\"/>\n\t\t<method name=\"signum(J)I\"/>\n\t\t<method name=\"sum(JJ)J\" since=\"24\"/>\n\t\t<method name=\"toBinaryString(J)Ljava/lang/String;\"/>\n\t\t<method name=\"toHexString(J)Ljava/lang/String;\"/>\n\t\t<method name=\"toOctalString(J)Ljava/lang/String;\"/>\n\t\t<method name=\"toString(J)Ljava/lang/String;\"/>\n\t\t<method name=\"toString(JI)Ljava/lang/String;\"/>\n\t\t<method name=\"toUnsignedString(J)Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"toUnsignedString(JI)Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"valueOf(J)Ljava/lang/Long;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/lang/Long;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;I)Ljava/lang/Long;\"/>\n\t\t<field name=\"BYTES\" since=\"24\"/>\n\t\t<field name=\"MAX_VALUE\"/>\n\t\t<field name=\"MIN_VALUE\"/>\n\t\t<field name=\"SIZE\"/>\n\t\t<field name=\"TYPE\"/>\n\t</class>\n\t<class name=\"java/lang/Math\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"IEEEremainder(DD)D\"/>\n\t\t<method name=\"abs(D)D\"/>\n\t\t<method name=\"abs(F)F\"/>\n\t\t<method name=\"abs(I)I\"/>\n\t\t<method name=\"abs(J)J\"/>\n\t\t<method name=\"acos(D)D\"/>\n\t\t<method name=\"addExact(II)I\" since=\"24\"/>\n\t\t<method name=\"addExact(JJ)J\" since=\"24\"/>\n\t\t<method name=\"asin(D)D\"/>\n\t\t<method name=\"atan(D)D\"/>\n\t\t<method name=\"atan2(DD)D\"/>\n\t\t<method name=\"cbrt(D)D\"/>\n\t\t<method name=\"ceil(D)D\"/>\n\t\t<method name=\"copySign(DD)D\" since=\"9\"/>\n\t\t<method name=\"copySign(FF)F\" since=\"9\"/>\n\t\t<method name=\"cos(D)D\"/>\n\t\t<method name=\"cosh(D)D\"/>\n\t\t<method name=\"decrementExact(I)I\" since=\"24\"/>\n\t\t<method name=\"decrementExact(J)J\" since=\"24\"/>\n\t\t<method name=\"exp(D)D\"/>\n\t\t<method name=\"expm1(D)D\"/>\n\t\t<method name=\"floor(D)D\"/>\n\t\t<method name=\"floorDiv(II)I\" since=\"24\"/>\n\t\t<method name=\"floorDiv(JJ)J\" since=\"24\"/>\n\t\t<method name=\"floorMod(II)I\" since=\"24\"/>\n\t\t<method name=\"floorMod(JJ)J\" since=\"24\"/>\n\t\t<method name=\"getExponent(D)I\" since=\"9\"/>\n\t\t<method name=\"getExponent(F)I\" since=\"9\"/>\n\t\t<method name=\"hypot(DD)D\"/>\n\t\t<method name=\"incrementExact(I)I\" since=\"24\"/>\n\t\t<method name=\"incrementExact(J)J\" since=\"24\"/>\n\t\t<method name=\"log(D)D\"/>\n\t\t<method name=\"log10(D)D\"/>\n\t\t<method name=\"log1p(D)D\"/>\n\t\t<method name=\"max(DD)D\"/>\n\t\t<method name=\"max(FF)F\"/>\n\t\t<method name=\"max(II)I\"/>\n\t\t<method name=\"max(JJ)J\"/>\n\t\t<method name=\"min(DD)D\"/>\n\t\t<method name=\"min(FF)F\"/>\n\t\t<method name=\"min(II)I\"/>\n\t\t<method name=\"min(JJ)J\"/>\n\t\t<method name=\"multiplyExact(II)I\" since=\"24\"/>\n\t\t<method name=\"multiplyExact(JJ)J\" since=\"24\"/>\n\t\t<method name=\"negateExact(I)I\" since=\"24\"/>\n\t\t<method name=\"negateExact(J)J\" since=\"24\"/>\n\t\t<method name=\"nextAfter(DD)D\" since=\"9\"/>\n\t\t<method name=\"nextAfter(FD)F\" since=\"9\"/>\n\t\t<method name=\"nextDown(D)D\" since=\"24\"/>\n\t\t<method name=\"nextDown(F)F\" since=\"24\"/>\n\t\t<method name=\"nextUp(D)D\" since=\"9\"/>\n\t\t<method name=\"nextUp(F)F\" since=\"9\"/>\n\t\t<method name=\"pow(DD)D\"/>\n\t\t<method name=\"random()D\"/>\n\t\t<method name=\"rint(D)D\"/>\n\t\t<method name=\"round(D)J\"/>\n\t\t<method name=\"round(F)I\"/>\n\t\t<method name=\"scalb(DI)D\" since=\"9\"/>\n\t\t<method name=\"scalb(FI)F\" since=\"9\"/>\n\t\t<method name=\"signum(D)D\"/>\n\t\t<method name=\"signum(F)F\"/>\n\t\t<method name=\"sin(D)D\"/>\n\t\t<method name=\"sinh(D)D\"/>\n\t\t<method name=\"sqrt(D)D\"/>\n\t\t<method name=\"subtractExact(II)I\" since=\"24\"/>\n\t\t<method name=\"subtractExact(JJ)J\" since=\"24\"/>\n\t\t<method name=\"tan(D)D\"/>\n\t\t<method name=\"tanh(D)D\"/>\n\t\t<method name=\"toDegrees(D)D\"/>\n\t\t<method name=\"toIntExact(J)I\" since=\"24\"/>\n\t\t<method name=\"toRadians(D)D\"/>\n\t\t<method name=\"ulp(D)D\"/>\n\t\t<method name=\"ulp(F)F\"/>\n\t\t<field name=\"E\"/>\n\t\t<field name=\"PI\"/>\n\t</class>\n\t<class name=\"java/lang/NegativeArraySizeException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/NoClassDefFoundError\" since=\"1\">\n\t\t<extends name=\"java/lang/LinkageError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/NoSuchFieldError\" since=\"1\">\n\t\t<extends name=\"java/lang/IncompatibleClassChangeError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/NoSuchFieldException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\" removed=\"19\"/>\n\t\t<extends name=\"java/lang/ReflectiveOperationException\" since=\"19\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/NoSuchMethodError\" since=\"1\">\n\t\t<extends name=\"java/lang/IncompatibleClassChangeError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/NoSuchMethodException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\" removed=\"19\"/>\n\t\t<extends name=\"java/lang/ReflectiveOperationException\" since=\"19\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/NullPointerException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/Number\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"byteValue()B\"/>\n\t\t<method name=\"doubleValue()D\"/>\n\t\t<method name=\"floatValue()F\"/>\n\t\t<method name=\"intValue()I\"/>\n\t\t<method name=\"longValue()J\"/>\n\t\t<method name=\"shortValue()S\"/>\n\t</class>\n\t<class name=\"java/lang/NumberFormatException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalArgumentException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/Object\" since=\"1\">\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"clone()Ljava/lang/Object;\"/>\n\t\t<method name=\"equals(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"finalize()V\"/>\n\t\t<method name=\"getClass()Ljava/lang/Class;\"/>\n\t\t<method name=\"hashCode()I\"/>\n\t\t<method name=\"notify()V\"/>\n\t\t<method name=\"notifyAll()V\"/>\n\t\t<method name=\"toString()Ljava/lang/String;\"/>\n\t\t<method name=\"wait()V\"/>\n\t\t<method name=\"wait(J)V\"/>\n\t\t<method name=\"wait(JI)V\"/>\n\t</class>\n\t<class name=\"java/lang/OutOfMemoryError\" since=\"1\">\n\t\t<extends name=\"java/lang/VirtualMachineError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/Override\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t</class>\n\t<class name=\"java/lang/Package\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/reflect/AnnotatedElement\"/>\n\t\t<method name=\"getImplementationTitle()Ljava/lang/String;\"/>\n\t\t<method name=\"getImplementationVendor()Ljava/lang/String;\"/>\n\t\t<method name=\"getImplementationVersion()Ljava/lang/String;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getPackage(Ljava/lang/String;)Ljava/lang/Package;\"/>\n\t\t<method name=\"getPackages()[Ljava/lang/Package;\"/>\n\t\t<method name=\"getSpecificationTitle()Ljava/lang/String;\"/>\n\t\t<method name=\"getSpecificationVendor()Ljava/lang/String;\"/>\n\t\t<method name=\"getSpecificationVersion()Ljava/lang/String;\"/>\n\t\t<method name=\"isCompatibleWith(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isSealed()Z\"/>\n\t\t<method name=\"isSealed(Ljava/net/URL;)Z\"/>\n\t</class>\n\t<class name=\"java/lang/Process\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"destroy()V\"/>\n\t\t<method name=\"destroyForcibly()Ljava/lang/Process;\" since=\"26\"/>\n\t\t<method name=\"exitValue()I\"/>\n\t\t<method name=\"getErrorStream()Ljava/io/InputStream;\"/>\n\t\t<method name=\"getInputStream()Ljava/io/InputStream;\"/>\n\t\t<method name=\"getOutputStream()Ljava/io/OutputStream;\"/>\n\t\t<method name=\"isAlive()Z\" since=\"26\"/>\n\t\t<method name=\"waitFor()I\"/>\n\t\t<method name=\"waitFor(JLjava/util/concurrent/TimeUnit;)Z\" since=\"26\"/>\n\t</class>\n\t<class name=\"java/lang/ProcessBuilder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/List;)V\"/>\n\t\t<method name=\"&lt;init>([Ljava/lang/String;)V\"/>\n\t\t<method name=\"command()Ljava/util/List;\"/>\n\t\t<method name=\"command(Ljava/util/List;)Ljava/lang/ProcessBuilder;\"/>\n\t\t<method name=\"command([Ljava/lang/String;)Ljava/lang/ProcessBuilder;\"/>\n\t\t<method name=\"directory()Ljava/io/File;\"/>\n\t\t<method name=\"directory(Ljava/io/File;)Ljava/lang/ProcessBuilder;\"/>\n\t\t<method name=\"environment()Ljava/util/Map;\"/>\n\t\t<method name=\"inheritIO()Ljava/lang/ProcessBuilder;\" since=\"26\"/>\n\t\t<method name=\"redirectError()Ljava/lang/ProcessBuilder$Redirect;\" since=\"26\"/>\n\t\t<method name=\"redirectError(Ljava/io/File;)Ljava/lang/ProcessBuilder;\" since=\"26\"/>\n\t\t<method name=\"redirectError(Ljava/lang/ProcessBuilder$Redirect;)Ljava/lang/ProcessBuilder;\" since=\"26\"/>\n\t\t<method name=\"redirectErrorStream()Z\"/>\n\t\t<method name=\"redirectErrorStream(Z)Ljava/lang/ProcessBuilder;\"/>\n\t\t<method name=\"redirectInput()Ljava/lang/ProcessBuilder$Redirect;\" since=\"26\"/>\n\t\t<method name=\"redirectInput(Ljava/io/File;)Ljava/lang/ProcessBuilder;\" since=\"26\"/>\n\t\t<method name=\"redirectInput(Ljava/lang/ProcessBuilder$Redirect;)Ljava/lang/ProcessBuilder;\" since=\"26\"/>\n\t\t<method name=\"redirectOutput()Ljava/lang/ProcessBuilder$Redirect;\" since=\"26\"/>\n\t\t<method name=\"redirectOutput(Ljava/io/File;)Ljava/lang/ProcessBuilder;\" since=\"26\"/>\n\t\t<method name=\"redirectOutput(Ljava/lang/ProcessBuilder$Redirect;)Ljava/lang/ProcessBuilder;\" since=\"26\"/>\n\t\t<method name=\"start()Ljava/lang/Process;\"/>\n\t</class>\n\t<class name=\"java/lang/ProcessBuilder$Redirect\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"appendTo(Ljava/io/File;)Ljava/lang/ProcessBuilder$Redirect;\"/>\n\t\t<method name=\"file()Ljava/io/File;\"/>\n\t\t<method name=\"from(Ljava/io/File;)Ljava/lang/ProcessBuilder$Redirect;\"/>\n\t\t<method name=\"to(Ljava/io/File;)Ljava/lang/ProcessBuilder$Redirect;\"/>\n\t\t<method name=\"type()Ljava/lang/ProcessBuilder$Redirect$Type;\"/>\n\t\t<field name=\"INHERIT\"/>\n\t\t<field name=\"PIPE\"/>\n\t</class>\n\t<class name=\"java/lang/ProcessBuilder$Redirect$Type\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/lang/ProcessBuilder$Redirect$Type;\"/>\n\t\t<method name=\"values()[Ljava/lang/ProcessBuilder$Redirect$Type;\"/>\n\t\t<field name=\"APPEND\"/>\n\t\t<field name=\"INHERIT\"/>\n\t\t<field name=\"PIPE\"/>\n\t\t<field name=\"READ\"/>\n\t\t<field name=\"WRITE\"/>\n\t</class>\n\t<class name=\"java/lang/Readable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"read(Ljava/nio/CharBuffer;)I\"/>\n\t</class>\n\t<class name=\"java/lang/ReflectiveOperationException\" since=\"19\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/lang/Runnable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"run()V\"/>\n\t</class>\n\t<class name=\"java/lang/Runtime\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addShutdownHook(Ljava/lang/Thread;)V\"/>\n\t\t<method name=\"availableProcessors()I\"/>\n\t\t<method name=\"exec(Ljava/lang/String;)Ljava/lang/Process;\"/>\n\t\t<method name=\"exec(Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/Process;\"/>\n\t\t<method name=\"exec(Ljava/lang/String;[Ljava/lang/String;Ljava/io/File;)Ljava/lang/Process;\"/>\n\t\t<method name=\"exec([Ljava/lang/String;)Ljava/lang/Process;\"/>\n\t\t<method name=\"exec([Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/Process;\"/>\n\t\t<method name=\"exec([Ljava/lang/String;[Ljava/lang/String;Ljava/io/File;)Ljava/lang/Process;\"/>\n\t\t<method name=\"exit(I)V\"/>\n\t\t<method name=\"freeMemory()J\"/>\n\t\t<method name=\"gc()V\"/>\n\t\t<method name=\"getLocalizedInputStream(Ljava/io/InputStream;)Ljava/io/InputStream;\" deprecated=\"15\"/>\n\t\t<method name=\"getLocalizedOutputStream(Ljava/io/OutputStream;)Ljava/io/OutputStream;\" deprecated=\"15\"/>\n\t\t<method name=\"getRuntime()Ljava/lang/Runtime;\"/>\n\t\t<method name=\"halt(I)V\"/>\n\t\t<method name=\"load(Ljava/lang/String;)V\"/>\n\t\t<method name=\"loadLibrary(Ljava/lang/String;)V\"/>\n\t\t<method name=\"maxMemory()J\"/>\n\t\t<method name=\"removeShutdownHook(Ljava/lang/Thread;)Z\"/>\n\t\t<method name=\"runFinalization()V\"/>\n\t\t<method name=\"runFinalizersOnExit(Z)V\" deprecated=\"15\"/>\n\t\t<method name=\"totalMemory()J\"/>\n\t\t<method name=\"traceInstructions(Z)V\"/>\n\t\t<method name=\"traceMethodCalls(Z)V\"/>\n\t</class>\n\t<class name=\"java/lang/RuntimeException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;ZZ)V\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/lang/RuntimePermission\" since=\"1\">\n\t\t<extends name=\"java/security/BasicPermission\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/SafeVarargs\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t</class>\n\t<class name=\"java/lang/SecurityException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/lang/SecurityManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"checkAccept(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"checkAccess(Ljava/lang/Thread;)V\"/>\n\t\t<method name=\"checkAccess(Ljava/lang/ThreadGroup;)V\"/>\n\t\t<method name=\"checkAwtEventQueueAccess()V\"/>\n\t\t<method name=\"checkConnect(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"checkConnect(Ljava/lang/String;ILjava/lang/Object;)V\"/>\n\t\t<method name=\"checkCreateClassLoader()V\"/>\n\t\t<method name=\"checkDelete(Ljava/lang/String;)V\"/>\n\t\t<method name=\"checkExec(Ljava/lang/String;)V\"/>\n\t\t<method name=\"checkExit(I)V\"/>\n\t\t<method name=\"checkLink(Ljava/lang/String;)V\"/>\n\t\t<method name=\"checkListen(I)V\"/>\n\t\t<method name=\"checkMemberAccess(Ljava/lang/Class;I)V\"/>\n\t\t<method name=\"checkMulticast(Ljava/net/InetAddress;)V\"/>\n\t\t<method name=\"checkMulticast(Ljava/net/InetAddress;B)V\" deprecated=\"15\"/>\n\t\t<method name=\"checkPackageAccess(Ljava/lang/String;)V\"/>\n\t\t<method name=\"checkPackageDefinition(Ljava/lang/String;)V\"/>\n\t\t<method name=\"checkPermission(Ljava/security/Permission;)V\"/>\n\t\t<method name=\"checkPermission(Ljava/security/Permission;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"checkPrintJobAccess()V\"/>\n\t\t<method name=\"checkPropertiesAccess()V\"/>\n\t\t<method name=\"checkPropertyAccess(Ljava/lang/String;)V\"/>\n\t\t<method name=\"checkRead(Ljava/io/FileDescriptor;)V\"/>\n\t\t<method name=\"checkRead(Ljava/lang/String;)V\"/>\n\t\t<method name=\"checkRead(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"checkSecurityAccess(Ljava/lang/String;)V\"/>\n\t\t<method name=\"checkSetFactory()V\"/>\n\t\t<method name=\"checkSystemClipboardAccess()V\"/>\n\t\t<method name=\"checkTopLevelWindow(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"checkWrite(Ljava/io/FileDescriptor;)V\"/>\n\t\t<method name=\"checkWrite(Ljava/lang/String;)V\"/>\n\t\t<method name=\"classDepth(Ljava/lang/String;)I\" deprecated=\"15\"/>\n\t\t<method name=\"classLoaderDepth()I\" deprecated=\"15\"/>\n\t\t<method name=\"currentClassLoader()Ljava/lang/ClassLoader;\" deprecated=\"15\"/>\n\t\t<method name=\"currentLoadedClass()Ljava/lang/Class;\" deprecated=\"15\"/>\n\t\t<method name=\"getClassContext()[Ljava/lang/Class;\"/>\n\t\t<method name=\"getInCheck()Z\" deprecated=\"15\"/>\n\t\t<method name=\"getSecurityContext()Ljava/lang/Object;\"/>\n\t\t<method name=\"getThreadGroup()Ljava/lang/ThreadGroup;\"/>\n\t\t<method name=\"inClass(Ljava/lang/String;)Z\" deprecated=\"15\"/>\n\t\t<method name=\"inClassLoader()Z\" deprecated=\"15\"/>\n\t\t<field name=\"inCheck\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"java/lang/Short\" since=\"1\">\n\t\t<extends name=\"java/lang/Number\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(S)V\"/>\n\t\t<method name=\"compare(SS)I\" since=\"19\"/>\n\t\t<method name=\"compareTo(Ljava/lang/Short;)I\"/>\n\t\t<method name=\"decode(Ljava/lang/String;)Ljava/lang/Short;\"/>\n\t\t<method name=\"hashCode(S)I\" since=\"24\"/>\n\t\t<method name=\"parseShort(Ljava/lang/String;)S\"/>\n\t\t<method name=\"parseShort(Ljava/lang/String;I)S\"/>\n\t\t<method name=\"reverseBytes(S)S\"/>\n\t\t<method name=\"toString(S)Ljava/lang/String;\"/>\n\t\t<method name=\"toUnsignedInt(S)I\" since=\"26\"/>\n\t\t<method name=\"toUnsignedLong(S)J\" since=\"26\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/lang/Short;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;I)Ljava/lang/Short;\"/>\n\t\t<method name=\"valueOf(S)Ljava/lang/Short;\"/>\n\t\t<field name=\"BYTES\" since=\"24\"/>\n\t\t<field name=\"MAX_VALUE\"/>\n\t\t<field name=\"MIN_VALUE\"/>\n\t\t<field name=\"SIZE\"/>\n\t\t<field name=\"TYPE\"/>\n\t</class>\n\t<class name=\"java/lang/StackOverflowError\" since=\"1\">\n\t\t<extends name=\"java/lang/VirtualMachineError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/StackTraceElement\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"getClassName()Ljava/lang/String;\"/>\n\t\t<method name=\"getFileName()Ljava/lang/String;\"/>\n\t\t<method name=\"getLineNumber()I\"/>\n\t\t<method name=\"getMethodName()Ljava/lang/String;\"/>\n\t\t<method name=\"isNativeMethod()Z\"/>\n\t</class>\n\t<class name=\"java/lang/StrictMath\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"IEEEremainder(DD)D\"/>\n\t\t<method name=\"abs(D)D\"/>\n\t\t<method name=\"abs(F)F\"/>\n\t\t<method name=\"abs(I)I\"/>\n\t\t<method name=\"abs(J)J\"/>\n\t\t<method name=\"acos(D)D\"/>\n\t\t<method name=\"addExact(II)I\" since=\"24\"/>\n\t\t<method name=\"addExact(JJ)J\" since=\"24\"/>\n\t\t<method name=\"asin(D)D\"/>\n\t\t<method name=\"atan(D)D\"/>\n\t\t<method name=\"atan2(DD)D\"/>\n\t\t<method name=\"cbrt(D)D\"/>\n\t\t<method name=\"ceil(D)D\"/>\n\t\t<method name=\"copySign(DD)D\" since=\"9\"/>\n\t\t<method name=\"copySign(FF)F\" since=\"9\"/>\n\t\t<method name=\"cos(D)D\"/>\n\t\t<method name=\"cosh(D)D\"/>\n\t\t<method name=\"exp(D)D\"/>\n\t\t<method name=\"expm1(D)D\"/>\n\t\t<method name=\"floor(D)D\"/>\n\t\t<method name=\"floorDiv(II)I\" since=\"24\"/>\n\t\t<method name=\"floorDiv(JJ)J\" since=\"24\"/>\n\t\t<method name=\"floorMod(II)I\" since=\"24\"/>\n\t\t<method name=\"floorMod(JJ)J\" since=\"24\"/>\n\t\t<method name=\"getExponent(D)I\" since=\"9\"/>\n\t\t<method name=\"getExponent(F)I\" since=\"9\"/>\n\t\t<method name=\"hypot(DD)D\"/>\n\t\t<method name=\"log(D)D\"/>\n\t\t<method name=\"log10(D)D\"/>\n\t\t<method name=\"log1p(D)D\"/>\n\t\t<method name=\"max(DD)D\"/>\n\t\t<method name=\"max(FF)F\"/>\n\t\t<method name=\"max(II)I\"/>\n\t\t<method name=\"max(JJ)J\"/>\n\t\t<method name=\"min(DD)D\"/>\n\t\t<method name=\"min(FF)F\"/>\n\t\t<method name=\"min(II)I\"/>\n\t\t<method name=\"min(JJ)J\"/>\n\t\t<method name=\"multiplyExact(II)I\" since=\"24\"/>\n\t\t<method name=\"multiplyExact(JJ)J\" since=\"24\"/>\n\t\t<method name=\"nextAfter(DD)D\" since=\"9\"/>\n\t\t<method name=\"nextAfter(FD)F\" since=\"9\"/>\n\t\t<method name=\"nextDown(D)D\" since=\"24\"/>\n\t\t<method name=\"nextDown(F)F\" since=\"24\"/>\n\t\t<method name=\"nextUp(D)D\" since=\"9\"/>\n\t\t<method name=\"nextUp(F)F\" since=\"9\"/>\n\t\t<method name=\"pow(DD)D\"/>\n\t\t<method name=\"random()D\"/>\n\t\t<method name=\"rint(D)D\"/>\n\t\t<method name=\"round(D)J\"/>\n\t\t<method name=\"round(F)I\"/>\n\t\t<method name=\"scalb(DI)D\" since=\"9\"/>\n\t\t<method name=\"scalb(FI)F\" since=\"9\"/>\n\t\t<method name=\"signum(D)D\"/>\n\t\t<method name=\"signum(F)F\"/>\n\t\t<method name=\"sin(D)D\"/>\n\t\t<method name=\"sinh(D)D\"/>\n\t\t<method name=\"sqrt(D)D\"/>\n\t\t<method name=\"subtractExact(II)I\" since=\"24\"/>\n\t\t<method name=\"subtractExact(JJ)J\" since=\"24\"/>\n\t\t<method name=\"tan(D)D\"/>\n\t\t<method name=\"tanh(D)D\"/>\n\t\t<method name=\"toDegrees(D)D\"/>\n\t\t<method name=\"toIntExact(J)I\" since=\"24\"/>\n\t\t<method name=\"toRadians(D)D\"/>\n\t\t<method name=\"ulp(D)D\"/>\n\t\t<method name=\"ulp(F)F\"/>\n\t\t<field name=\"E\"/>\n\t\t<field name=\"PI\"/>\n\t</class>\n\t<class name=\"java/lang/String\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/CharSequence\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/StringBuffer;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/StringBuilder;)V\"/>\n\t\t<method name=\"&lt;init>([B)V\"/>\n\t\t<method name=\"&lt;init>([BI)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>([BII)V\"/>\n\t\t<method name=\"&lt;init>([BIII)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>([BIILjava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>([BIILjava/nio/charset/Charset;)V\" since=\"9\"/>\n\t\t<method name=\"&lt;init>([BLjava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>([BLjava/nio/charset/Charset;)V\" since=\"9\"/>\n\t\t<method name=\"&lt;init>([C)V\"/>\n\t\t<method name=\"&lt;init>([CII)V\"/>\n\t\t<method name=\"&lt;init>([III)V\"/>\n\t\t<method name=\"codePointAt(I)I\"/>\n\t\t<method name=\"codePointBefore(I)I\"/>\n\t\t<method name=\"codePointCount(II)I\"/>\n\t\t<method name=\"compareTo(Ljava/lang/String;)I\"/>\n\t\t<method name=\"compareToIgnoreCase(Ljava/lang/String;)I\"/>\n\t\t<method name=\"concat(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"contains(Ljava/lang/CharSequence;)Z\"/>\n\t\t<method name=\"contentEquals(Ljava/lang/CharSequence;)Z\"/>\n\t\t<method name=\"contentEquals(Ljava/lang/StringBuffer;)Z\"/>\n\t\t<method name=\"copyValueOf([C)Ljava/lang/String;\"/>\n\t\t<method name=\"copyValueOf([CII)Ljava/lang/String;\"/>\n\t\t<method name=\"endsWith(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"equalsIgnoreCase(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;\"/>\n\t\t<method name=\"format(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;\"/>\n\t\t<method name=\"getBytes()[B\"/>\n\t\t<method name=\"getBytes(II[BI)V\" deprecated=\"15\"/>\n\t\t<method name=\"getBytes(Ljava/lang/String;)[B\"/>\n\t\t<method name=\"getBytes(Ljava/nio/charset/Charset;)[B\" since=\"9\"/>\n\t\t<method name=\"getChars(II[CI)V\"/>\n\t\t<method name=\"indexOf(I)I\"/>\n\t\t<method name=\"indexOf(II)I\"/>\n\t\t<method name=\"indexOf(Ljava/lang/String;)I\"/>\n\t\t<method name=\"indexOf(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"intern()Ljava/lang/String;\"/>\n\t\t<method name=\"isEmpty()Z\" since=\"9\"/>\n\t\t<method name=\"join(Ljava/lang/CharSequence;Ljava/lang/Iterable;)Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"join(Ljava/lang/CharSequence;[Ljava/lang/CharSequence;)Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"lastIndexOf(I)I\"/>\n\t\t<method name=\"lastIndexOf(II)I\"/>\n\t\t<method name=\"lastIndexOf(Ljava/lang/String;)I\"/>\n\t\t<method name=\"lastIndexOf(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"matches(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"offsetByCodePoints(II)I\"/>\n\t\t<method name=\"regionMatches(ILjava/lang/String;II)Z\"/>\n\t\t<method name=\"regionMatches(ZILjava/lang/String;II)Z\"/>\n\t\t<method name=\"replace(CC)Ljava/lang/String;\"/>\n\t\t<method name=\"replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String;\"/>\n\t\t<method name=\"replaceAll(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"replaceFirst(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"split(Ljava/lang/String;)[Ljava/lang/String;\"/>\n\t\t<method name=\"split(Ljava/lang/String;I)[Ljava/lang/String;\"/>\n\t\t<method name=\"startsWith(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"startsWith(Ljava/lang/String;I)Z\"/>\n\t\t<method name=\"substring(I)Ljava/lang/String;\"/>\n\t\t<method name=\"substring(II)Ljava/lang/String;\"/>\n\t\t<method name=\"toCharArray()[C\"/>\n\t\t<method name=\"toLowerCase()Ljava/lang/String;\"/>\n\t\t<method name=\"toLowerCase(Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"toUpperCase()Ljava/lang/String;\"/>\n\t\t<method name=\"toUpperCase(Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"trim()Ljava/lang/String;\"/>\n\t\t<method name=\"valueOf(C)Ljava/lang/String;\"/>\n\t\t<method name=\"valueOf(D)Ljava/lang/String;\"/>\n\t\t<method name=\"valueOf(F)Ljava/lang/String;\"/>\n\t\t<method name=\"valueOf(I)Ljava/lang/String;\"/>\n\t\t<method name=\"valueOf(J)Ljava/lang/String;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/Object;)Ljava/lang/String;\"/>\n\t\t<method name=\"valueOf(Z)Ljava/lang/String;\"/>\n\t\t<method name=\"valueOf([C)Ljava/lang/String;\"/>\n\t\t<method name=\"valueOf([CII)Ljava/lang/String;\"/>\n\t\t<field name=\"CASE_INSENSITIVE_ORDER\"/>\n\t</class>\n\t<class name=\"java/lang/StringBuffer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Appendable\"/>\n\t\t<implements name=\"java/lang/CharSequence\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"append(C)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"append(D)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"append(F)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"append(I)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"append(J)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;II)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"append(Ljava/lang/Object;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"append(Ljava/lang/String;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"append(Ljava/lang/StringBuffer;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"append(Z)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"append([C)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"append([CII)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"appendCodePoint(I)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"delete(II)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"deleteCharAt(I)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"insert(IC)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"insert(ID)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"insert(IF)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"insert(II)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"insert(IJ)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"insert(ILjava/lang/CharSequence;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"insert(ILjava/lang/CharSequence;II)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"insert(ILjava/lang/Object;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"insert(ILjava/lang/String;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"insert(IZ)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"insert(I[C)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"insert(I[CII)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"replace(IILjava/lang/String;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"reverse()Ljava/lang/StringBuffer;\"/>\n\t</class>\n\t<class name=\"java/lang/StringBuilder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Appendable\"/>\n\t\t<implements name=\"java/lang/CharSequence\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"append(C)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"append(D)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"append(F)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"append(I)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"append(J)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;II)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"append(Ljava/lang/Object;)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"append(Ljava/lang/String;)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"append(Ljava/lang/StringBuffer;)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"append(Z)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"append([C)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"append([CII)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"appendCodePoint(I)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"delete(II)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"deleteCharAt(I)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"insert(IC)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"insert(ID)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"insert(IF)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"insert(II)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"insert(IJ)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"insert(ILjava/lang/CharSequence;)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"insert(ILjava/lang/CharSequence;II)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"insert(ILjava/lang/Object;)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"insert(ILjava/lang/String;)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"insert(IZ)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"insert(I[C)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"insert(I[CII)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"replace(IILjava/lang/String;)Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"reverse()Ljava/lang/StringBuilder;\"/>\n\t\t<method name=\"setLength(I)V\" />\n\t</class>\n\t<class name=\"java/lang/StringIndexOutOfBoundsException\" since=\"1\">\n\t\t<extends name=\"java/lang/IndexOutOfBoundsException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/SuppressWarnings\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t\t<method name=\"value()[Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/lang/System\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V\"/>\n\t\t<method name=\"clearProperty(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"console()Ljava/io/Console;\" since=\"9\"/>\n\t\t<method name=\"currentTimeMillis()J\"/>\n\t\t<method name=\"exit(I)V\"/>\n\t\t<method name=\"gc()V\"/>\n\t\t<method name=\"getProperties()Ljava/util/Properties;\"/>\n\t\t<method name=\"getProperty(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getSecurityManager()Ljava/lang/SecurityManager;\"/>\n\t\t<method name=\"getenv()Ljava/util/Map;\"/>\n\t\t<method name=\"getenv(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"identityHashCode(Ljava/lang/Object;)I\"/>\n\t\t<method name=\"inheritedChannel()Ljava/nio/channels/Channel;\"/>\n\t\t<method name=\"lineSeparator()Ljava/lang/String;\" since=\"19\"/>\n\t\t<method name=\"load(Ljava/lang/String;)V\"/>\n\t\t<method name=\"loadLibrary(Ljava/lang/String;)V\"/>\n\t\t<method name=\"mapLibraryName(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"nanoTime()J\"/>\n\t\t<method name=\"runFinalization()V\"/>\n\t\t<method name=\"runFinalizersOnExit(Z)V\" deprecated=\"15\"/>\n\t\t<method name=\"setErr(Ljava/io/PrintStream;)V\"/>\n\t\t<method name=\"setIn(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"setOut(Ljava/io/PrintStream;)V\"/>\n\t\t<method name=\"setProperties(Ljava/util/Properties;)V\"/>\n\t\t<method name=\"setProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"setSecurityManager(Ljava/lang/SecurityManager;)V\"/>\n\t\t<field name=\"err\"/>\n\t\t<field name=\"in\"/>\n\t\t<field name=\"out\"/>\n\t</class>\n\t<class name=\"java/lang/Thread\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Runnable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Runnable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Runnable;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/ThreadGroup;Ljava/lang/Runnable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/ThreadGroup;Ljava/lang/Runnable;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/ThreadGroup;Ljava/lang/Runnable;Ljava/lang/String;J)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/ThreadGroup;Ljava/lang/String;)V\"/>\n\t\t<method name=\"activeCount()I\"/>\n\t\t<method name=\"checkAccess()V\"/>\n\t\t<method name=\"countStackFrames()I\" deprecated=\"15\"/>\n\t\t<method name=\"currentThread()Ljava/lang/Thread;\"/>\n\t\t<method name=\"destroy()V\" deprecated=\"15\"/>\n\t\t<method name=\"dumpStack()V\"/>\n\t\t<method name=\"enumerate([Ljava/lang/Thread;)I\"/>\n\t\t<method name=\"getAllStackTraces()Ljava/util/Map;\"/>\n\t\t<method name=\"getContextClassLoader()Ljava/lang/ClassLoader;\"/>\n\t\t<method name=\"getDefaultUncaughtExceptionHandler()Ljava/lang/Thread$UncaughtExceptionHandler;\"/>\n\t\t<method name=\"getId()J\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getPriority()I\"/>\n\t\t<method name=\"getStackTrace()[Ljava/lang/StackTraceElement;\"/>\n\t\t<method name=\"getState()Ljava/lang/Thread$State;\"/>\n\t\t<method name=\"getThreadGroup()Ljava/lang/ThreadGroup;\"/>\n\t\t<method name=\"getUncaughtExceptionHandler()Ljava/lang/Thread$UncaughtExceptionHandler;\"/>\n\t\t<method name=\"holdsLock(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"interrupt()V\"/>\n\t\t<method name=\"interrupted()Z\"/>\n\t\t<method name=\"isAlive()Z\"/>\n\t\t<method name=\"isDaemon()Z\"/>\n\t\t<method name=\"isInterrupted()Z\"/>\n\t\t<method name=\"join()V\"/>\n\t\t<method name=\"join(J)V\"/>\n\t\t<method name=\"join(JI)V\"/>\n\t\t<method name=\"resume()V\" deprecated=\"15\"/>\n\t\t<method name=\"setContextClassLoader(Ljava/lang/ClassLoader;)V\"/>\n\t\t<method name=\"setDaemon(Z)V\"/>\n\t\t<method name=\"setDefaultUncaughtExceptionHandler(Ljava/lang/Thread$UncaughtExceptionHandler;)V\"/>\n\t\t<method name=\"setName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setPriority(I)V\"/>\n\t\t<method name=\"setUncaughtExceptionHandler(Ljava/lang/Thread$UncaughtExceptionHandler;)V\"/>\n\t\t<method name=\"sleep(J)V\"/>\n\t\t<method name=\"sleep(JI)V\"/>\n\t\t<method name=\"start()V\"/>\n\t\t<method name=\"stop()V\" deprecated=\"15\"/>\n\t\t<method name=\"stop(Ljava/lang/Throwable;)V\" deprecated=\"15\"/>\n\t\t<method name=\"suspend()V\" deprecated=\"15\"/>\n\t\t<method name=\"yield()V\"/>\n\t\t<field name=\"MAX_PRIORITY\"/>\n\t\t<field name=\"MIN_PRIORITY\"/>\n\t\t<field name=\"NORM_PRIORITY\"/>\n\t</class>\n\t<class name=\"java/lang/Thread$State\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/lang/Thread$State;\"/>\n\t\t<method name=\"values()[Ljava/lang/Thread$State;\"/>\n\t\t<field name=\"BLOCKED\"/>\n\t\t<field name=\"NEW\"/>\n\t\t<field name=\"RUNNABLE\"/>\n\t\t<field name=\"TERMINATED\"/>\n\t\t<field name=\"TIMED_WAITING\"/>\n\t\t<field name=\"WAITING\"/>\n\t</class>\n\t<class name=\"java/lang/Thread$UncaughtExceptionHandler\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"uncaughtException(Ljava/lang/Thread;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/lang/ThreadDeath\" since=\"1\">\n\t\t<extends name=\"java/lang/Error\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/lang/ThreadGroup\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Thread$UncaughtExceptionHandler\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/ThreadGroup;Ljava/lang/String;)V\"/>\n\t\t<method name=\"activeCount()I\"/>\n\t\t<method name=\"activeGroupCount()I\"/>\n\t\t<method name=\"allowThreadSuspension(Z)Z\" deprecated=\"15\"/>\n\t\t<method name=\"checkAccess()V\"/>\n\t\t<method name=\"destroy()V\"/>\n\t\t<method name=\"enumerate([Ljava/lang/Thread;)I\"/>\n\t\t<method name=\"enumerate([Ljava/lang/Thread;Z)I\"/>\n\t\t<method name=\"enumerate([Ljava/lang/ThreadGroup;)I\"/>\n\t\t<method name=\"enumerate([Ljava/lang/ThreadGroup;Z)I\"/>\n\t\t<method name=\"getMaxPriority()I\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getParent()Ljava/lang/ThreadGroup;\"/>\n\t\t<method name=\"interrupt()V\"/>\n\t\t<method name=\"isDaemon()Z\"/>\n\t\t<method name=\"isDestroyed()Z\"/>\n\t\t<method name=\"list()V\"/>\n\t\t<method name=\"parentOf(Ljava/lang/ThreadGroup;)Z\"/>\n\t\t<method name=\"resume()V\" deprecated=\"15\"/>\n\t\t<method name=\"setDaemon(Z)V\"/>\n\t\t<method name=\"setMaxPriority(I)V\"/>\n\t\t<method name=\"stop()V\" deprecated=\"15\"/>\n\t\t<method name=\"suspend()V\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"java/lang/ThreadLocal\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"get()Ljava/lang/Object;\"/>\n\t\t<method name=\"initialValue()Ljava/lang/Object;\"/>\n\t\t<method name=\"remove()V\"/>\n\t\t<method name=\"set(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"withInitial(Ljava/util/function/Supplier;)Ljava/lang/ThreadLocal;\" since=\"26\"/>\n\t</class>\n\t<class name=\"java/lang/Throwable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;ZZ)V\" since=\"19\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"addSuppressed(Ljava/lang/Throwable;)V\" since=\"19\"/>\n\t\t<method name=\"fillInStackTrace()Ljava/lang/Throwable;\"/>\n\t\t<method name=\"getCause()Ljava/lang/Throwable;\"/>\n\t\t<method name=\"getLocalizedMessage()Ljava/lang/String;\"/>\n\t\t<method name=\"getMessage()Ljava/lang/String;\"/>\n\t\t<method name=\"getStackTrace()[Ljava/lang/StackTraceElement;\"/>\n\t\t<method name=\"getSuppressed()[Ljava/lang/Throwable;\" since=\"19\"/>\n\t\t<method name=\"initCause(Ljava/lang/Throwable;)Ljava/lang/Throwable;\"/>\n\t\t<method name=\"printStackTrace()V\"/>\n\t\t<method name=\"printStackTrace(Ljava/io/PrintStream;)V\"/>\n\t\t<method name=\"printStackTrace(Ljava/io/PrintWriter;)V\"/>\n\t\t<method name=\"setStackTrace([Ljava/lang/StackTraceElement;)V\"/>\n\t</class>\n\t<class name=\"java/lang/TypeNotPresentException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"typeName()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/lang/UnknownError\" since=\"1\">\n\t\t<extends name=\"java/lang/VirtualMachineError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/UnsatisfiedLinkError\" since=\"1\">\n\t\t<extends name=\"java/lang/LinkageError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/UnsupportedClassVersionError\" since=\"1\">\n\t\t<extends name=\"java/lang/ClassFormatError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/UnsupportedOperationException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/lang/VerifyError\" since=\"1\">\n\t\t<extends name=\"java/lang/LinkageError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/VirtualMachineError\" since=\"1\">\n\t\t<extends name=\"java/lang/Error\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\" since=\"24\"/>\n\t</class>\n\t<class name=\"java/lang/Void\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"TYPE\"/>\n\t</class>\n\t<class name=\"java/lang/annotation/Annotation\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"annotationType()Ljava/lang/Class;\"/>\n\t</class>\n\t<class name=\"java/lang/annotation/AnnotationFormatError\" since=\"1\">\n\t\t<extends name=\"java/lang/Error\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/lang/annotation/AnnotationTypeMismatchException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/reflect/Method;Ljava/lang/String;)V\"/>\n\t\t<method name=\"element()Ljava/lang/reflect/Method;\"/>\n\t\t<method name=\"foundType()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/lang/annotation/Documented\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t</class>\n\t<class name=\"java/lang/annotation/ElementType\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/lang/annotation/ElementType;\"/>\n\t\t<method name=\"values()[Ljava/lang/annotation/ElementType;\"/>\n\t\t<field name=\"ANNOTATION_TYPE\"/>\n\t\t<field name=\"CONSTRUCTOR\"/>\n\t\t<field name=\"FIELD\"/>\n\t\t<field name=\"LOCAL_VARIABLE\"/>\n\t\t<field name=\"METHOD\"/>\n\t\t<field name=\"PACKAGE\"/>\n\t\t<field name=\"PARAMETER\"/>\n\t\t<field name=\"TYPE\"/>\n\t\t<field name=\"TYPE_PARAMETER\" since=\"26\"/>\n\t\t<field name=\"TYPE_USE\" since=\"26\"/>\n\t</class>\n\t<class name=\"java/lang/annotation/IncompleteAnnotationException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Class;Ljava/lang/String;)V\"/>\n\t\t<method name=\"annotationType()Ljava/lang/Class;\"/>\n\t\t<method name=\"elementName()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/lang/annotation/Inherited\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t</class>\n\t<class name=\"java/lang/annotation/Native\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t</class>\n\t<class name=\"java/lang/annotation/Repeatable\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t\t<method name=\"value()Ljava/lang/Class;\"/>\n\t</class>\n\t<class name=\"java/lang/annotation/Retention\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t\t<method name=\"value()Ljava/lang/annotation/RetentionPolicy;\"/>\n\t</class>\n\t<class name=\"java/lang/annotation/RetentionPolicy\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/lang/annotation/RetentionPolicy;\"/>\n\t\t<method name=\"values()[Ljava/lang/annotation/RetentionPolicy;\"/>\n\t\t<field name=\"CLASS\"/>\n\t\t<field name=\"RUNTIME\"/>\n\t\t<field name=\"SOURCE\"/>\n\t</class>\n\t<class name=\"java/lang/annotation/Target\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/annotation/Annotation\"/>\n\t\t<method name=\"value()[Ljava/lang/annotation/ElementType;\"/>\n\t</class>\n\t<class name=\"java/lang/invoke/CallSite\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"dynamicInvoker()Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"getTarget()Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"setTarget(Ljava/lang/invoke/MethodHandle;)V\"/>\n\t\t<method name=\"type()Ljava/lang/invoke/MethodType;\"/>\n\t</class>\n\t<class name=\"java/lang/invoke/ConstantCallSite\" since=\"26\">\n\t\t<extends name=\"java/lang/invoke/CallSite\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/invoke/MethodHandle;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)V\"/>\n\t</class>\n\t<class name=\"java/lang/invoke/LambdaConversionException\" since=\"26\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;ZZ)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/lang/invoke/MethodHandle\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"asCollector(Ljava/lang/Class;I)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"asFixedArity()Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"asSpreader(Ljava/lang/Class;I)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"asType(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"asVarargsCollector(Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"bindTo(Ljava/lang/Object;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"invoke([Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"invokeExact([Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"invokeWithArguments(Ljava/util/List;)Ljava/lang/Object;\"/>\n\t\t<method name=\"invokeWithArguments([Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"isVarargsCollector()Z\"/>\n\t\t<method name=\"type()Ljava/lang/invoke/MethodType;\"/>\n\t</class>\n\t<class name=\"java/lang/invoke/MethodHandleInfo\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getDeclaringClass()Ljava/lang/Class;\"/>\n\t\t<method name=\"getMethodType()Ljava/lang/invoke/MethodType;\"/>\n\t\t<method name=\"getModifiers()I\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getReferenceKind()I\"/>\n\t\t<method name=\"isVarArgs()Z\"/>\n\t\t<method name=\"refKindIsField(I)Z\" deprecated=\"29\"/>\n\t\t<method name=\"refKindIsValid(I)Z\" deprecated=\"29\"/>\n\t\t<method name=\"refKindName(I)Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"referenceKindToString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"reflectAs(Ljava/lang/Class;Ljava/lang/invoke/MethodHandles$Lookup;)Ljava/lang/reflect/Member;\"/>\n\t\t<method name=\"toString(ILjava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/String;\"/>\n\t\t<field name=\"REF_getField\"/>\n\t\t<field name=\"REF_getStatic\"/>\n\t\t<field name=\"REF_invokeInterface\"/>\n\t\t<field name=\"REF_invokeSpecial\"/>\n\t\t<field name=\"REF_invokeStatic\"/>\n\t\t<field name=\"REF_invokeVirtual\"/>\n\t\t<field name=\"REF_newInvokeSpecial\"/>\n\t\t<field name=\"REF_putField\"/>\n\t\t<field name=\"REF_putStatic\"/>\n\t</class>\n\t<class name=\"java/lang/invoke/MethodHandles\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"arrayElementGetter(Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"arrayElementSetter(Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"catchException(Ljava/lang/invoke/MethodHandle;Ljava/lang/Class;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"collectArguments(Ljava/lang/invoke/MethodHandle;ILjava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"constant(Ljava/lang/Class;Ljava/lang/Object;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"dropArguments(Ljava/lang/invoke/MethodHandle;ILjava/util/List;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"dropArguments(Ljava/lang/invoke/MethodHandle;I[Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"exactInvoker(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"explicitCastArguments(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"filterArguments(Ljava/lang/invoke/MethodHandle;I[Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"filterReturnValue(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"foldArguments(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"guardWithTest(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"identity(Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"insertArguments(Ljava/lang/invoke/MethodHandle;I[Ljava/lang/Object;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"invoker(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"lookup()Ljava/lang/invoke/MethodHandles$Lookup;\"/>\n\t\t<method name=\"permuteArguments(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;[I)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"publicLookup()Ljava/lang/invoke/MethodHandles$Lookup;\"/>\n\t\t<method name=\"reflectAs(Ljava/lang/Class;Ljava/lang/invoke/MethodHandle;)Ljava/lang/reflect/Member;\"/>\n\t\t<method name=\"spreadInvoker(Ljava/lang/invoke/MethodType;I)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"throwException(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;\"/>\n\t</class>\n\t<class name=\"java/lang/invoke/MethodHandles$Lookup\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"bind(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"findConstructor(Ljava/lang/Class;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"findGetter(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"findSetter(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"findSpecial(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"findStatic(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"findStaticGetter(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"findStaticSetter(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"findVirtual(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"in(Ljava/lang/Class;)Ljava/lang/invoke/MethodHandles$Lookup;\"/>\n\t\t<method name=\"lookupClass()Ljava/lang/Class;\"/>\n\t\t<method name=\"lookupModes()I\"/>\n\t\t<method name=\"revealDirect(Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandleInfo;\"/>\n\t\t<method name=\"unreflect(Ljava/lang/reflect/Method;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"unreflectConstructor(Ljava/lang/reflect/Constructor;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"unreflectGetter(Ljava/lang/reflect/Field;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"unreflectSetter(Ljava/lang/reflect/Field;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<method name=\"unreflectSpecial(Ljava/lang/reflect/Method;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;\"/>\n\t\t<field name=\"PACKAGE\"/>\n\t\t<field name=\"PRIVATE\"/>\n\t\t<field name=\"PROTECTED\"/>\n\t\t<field name=\"PUBLIC\"/>\n\t</class>\n\t<class name=\"java/lang/invoke/MethodType\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"appendParameterTypes(Ljava/util/List;)Ljava/lang/invoke/MethodType;\"/>\n\t\t<method name=\"appendParameterTypes([Ljava/lang/Class;)Ljava/lang/invoke/MethodType;\"/>\n\t\t<method name=\"changeParameterType(ILjava/lang/Class;)Ljava/lang/invoke/MethodType;\"/>\n\t\t<method name=\"changeReturnType(Ljava/lang/Class;)Ljava/lang/invoke/MethodType;\"/>\n\t\t<method name=\"dropParameterTypes(II)Ljava/lang/invoke/MethodType;\"/>\n\t\t<method name=\"erase()Ljava/lang/invoke/MethodType;\"/>\n\t\t<method name=\"fromMethodDescriptorString(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/invoke/MethodType;\"/>\n\t\t<method name=\"generic()Ljava/lang/invoke/MethodType;\"/>\n\t\t<method name=\"genericMethodType(I)Ljava/lang/invoke/MethodType;\"/>\n\t\t<method name=\"genericMethodType(IZ)Ljava/lang/invoke/MethodType;\"/>\n\t\t<method name=\"hasPrimitives()Z\"/>\n\t\t<method name=\"hasWrappers()Z\"/>\n\t\t<method name=\"insertParameterTypes(ILjava/util/List;)Ljava/lang/invoke/MethodType;\"/>\n\t\t<method name=\"insertParameterTypes(I[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;\"/>\n\t\t<method name=\"methodType(Ljava/lang/Class;)Ljava/lang/invoke/MethodType;\"/>\n\t\t<method name=\"methodType(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/invoke/MethodType;\"/>\n\t\t<method name=\"methodType(Ljava/lang/Class;Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;\"/>\n\t\t<method name=\"methodType(Ljava/lang/Class;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodType;\"/>\n\t\t<method name=\"methodType(Ljava/lang/Class;Ljava/util/List;)Ljava/lang/invoke/MethodType;\"/>\n\t\t<method name=\"methodType(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;\"/>\n\t\t<method name=\"parameterArray()[Ljava/lang/Class;\"/>\n\t\t<method name=\"parameterCount()I\"/>\n\t\t<method name=\"parameterList()Ljava/util/List;\"/>\n\t\t<method name=\"parameterType(I)Ljava/lang/Class;\"/>\n\t\t<method name=\"returnType()Ljava/lang/Class;\"/>\n\t\t<method name=\"toMethodDescriptorString()Ljava/lang/String;\"/>\n\t\t<method name=\"unwrap()Ljava/lang/invoke/MethodType;\"/>\n\t\t<method name=\"wrap()Ljava/lang/invoke/MethodType;\"/>\n\t</class>\n\t<class name=\"java/lang/invoke/MutableCallSite\" since=\"26\">\n\t\t<extends name=\"java/lang/invoke/CallSite\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/invoke/MethodHandle;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/invoke/MethodType;)V\"/>\n\t</class>\n\t<class name=\"java/lang/invoke/VolatileCallSite\" since=\"26\">\n\t\t<extends name=\"java/lang/invoke/CallSite\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/invoke/MethodHandle;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/invoke/MethodType;)V\"/>\n\t</class>\n\t<class name=\"java/lang/invoke/WrongMethodTypeException\" since=\"26\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/ref/PhantomReference\" since=\"1\">\n\t\t<extends name=\"java/lang/ref/Reference\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V\"/>\n\t</class>\n\t<class name=\"java/lang/ref/Reference\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"enqueue()Z\"/>\n\t\t<method name=\"get()Ljava/lang/Object;\"/>\n\t\t<method name=\"isEnqueued()Z\"/>\n\t\t<method name=\"reachabilityFence(Ljava/lang/Object;)V\" since=\"28\"/>\n\t</class>\n\t<class name=\"java/lang/ref/ReferenceQueue\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"poll()Ljava/lang/ref/Reference;\"/>\n\t\t<method name=\"remove()Ljava/lang/ref/Reference;\"/>\n\t\t<method name=\"remove(J)Ljava/lang/ref/Reference;\"/>\n\t</class>\n\t<class name=\"java/lang/ref/SoftReference\" since=\"1\">\n\t\t<extends name=\"java/lang/ref/Reference\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V\"/>\n\t</class>\n\t<class name=\"java/lang/ref/WeakReference\" since=\"1\">\n\t\t<extends name=\"java/lang/ref/Reference\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/AccessibleObject\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/reflect/AnnotatedElement\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"isAccessible()Z\"/>\n\t\t<method name=\"setAccessible(Z)V\"/>\n\t\t<method name=\"setAccessible([Ljava/lang/reflect/AccessibleObject;Z)V\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/AnnotatedElement\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;\"/>\n\t\t<method name=\"getAnnotations()[Ljava/lang/annotation/Annotation;\"/>\n\t\t<method name=\"getAnnotationsByType(Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;\" since=\"24\"/>\n\t\t<method name=\"getDeclaredAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;\" since=\"24\"/>\n\t\t<method name=\"getDeclaredAnnotations()[Ljava/lang/annotation/Annotation;\"/>\n\t\t<method name=\"getDeclaredAnnotationsByType(Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;\" since=\"24\"/>\n\t\t<method name=\"isAnnotationPresent(Ljava/lang/Class;)Z\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/Array\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"get(Ljava/lang/Object;I)Ljava/lang/Object;\"/>\n\t\t<method name=\"getBoolean(Ljava/lang/Object;I)Z\"/>\n\t\t<method name=\"getByte(Ljava/lang/Object;I)B\"/>\n\t\t<method name=\"getChar(Ljava/lang/Object;I)C\"/>\n\t\t<method name=\"getDouble(Ljava/lang/Object;I)D\"/>\n\t\t<method name=\"getFloat(Ljava/lang/Object;I)F\"/>\n\t\t<method name=\"getInt(Ljava/lang/Object;I)I\"/>\n\t\t<method name=\"getLength(Ljava/lang/Object;)I\"/>\n\t\t<method name=\"getLong(Ljava/lang/Object;I)J\"/>\n\t\t<method name=\"getShort(Ljava/lang/Object;I)S\"/>\n\t\t<method name=\"newInstance(Ljava/lang/Class;I)Ljava/lang/Object;\"/>\n\t\t<method name=\"newInstance(Ljava/lang/Class;[I)Ljava/lang/Object;\"/>\n\t\t<method name=\"set(Ljava/lang/Object;ILjava/lang/Object;)V\"/>\n\t\t<method name=\"setBoolean(Ljava/lang/Object;IZ)V\"/>\n\t\t<method name=\"setByte(Ljava/lang/Object;IB)V\"/>\n\t\t<method name=\"setChar(Ljava/lang/Object;IC)V\"/>\n\t\t<method name=\"setDouble(Ljava/lang/Object;ID)V\"/>\n\t\t<method name=\"setFloat(Ljava/lang/Object;IF)V\"/>\n\t\t<method name=\"setInt(Ljava/lang/Object;II)V\"/>\n\t\t<method name=\"setLong(Ljava/lang/Object;IJ)V\"/>\n\t\t<method name=\"setShort(Ljava/lang/Object;IS)V\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/Constructor\" since=\"1\">\n\t\t<extends name=\"java/lang/reflect/AccessibleObject\" removed=\"26\"/>\n\t\t<extends name=\"java/lang/reflect/Executable\" since=\"26\"/>\n\t\t<implements name=\"java/lang/reflect/GenericDeclaration\" removed=\"26\"/>\n\t\t<implements name=\"java/lang/reflect/Member\" removed=\"26\"/>\n\t\t<method name=\"getExceptionTypes()[Ljava/lang/Class;\"/>\n\t\t<method name=\"getGenericExceptionTypes()[Ljava/lang/reflect/Type;\"/>\n\t\t<method name=\"getGenericParameterTypes()[Ljava/lang/reflect/Type;\"/>\n\t\t<method name=\"getParameterAnnotations()[[Ljava/lang/annotation/Annotation;\"/>\n\t\t<method name=\"getParameterTypes()[Ljava/lang/Class;\"/>\n\t\t<method name=\"isVarArgs()Z\"/>\n\t\t<method name=\"newInstance([Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"toGenericString()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/Executable\" since=\"26\">\n\t\t<extends name=\"java/lang/reflect/AccessibleObject\"/>\n\t\t<implements name=\"java/lang/reflect/GenericDeclaration\"/>\n\t\t<implements name=\"java/lang/reflect/Member\"/>\n\t\t<method name=\"getExceptionTypes()[Ljava/lang/Class;\"/>\n\t\t<method name=\"getGenericExceptionTypes()[Ljava/lang/reflect/Type;\"/>\n\t\t<method name=\"getGenericParameterTypes()[Ljava/lang/reflect/Type;\"/>\n\t\t<method name=\"getParameterAnnotations()[[Ljava/lang/annotation/Annotation;\"/>\n\t\t<method name=\"getParameterCount()I\"/>\n\t\t<method name=\"getParameterTypes()[Ljava/lang/Class;\"/>\n\t\t<method name=\"getParameters()[Ljava/lang/reflect/Parameter;\"/>\n\t\t<method name=\"isVarArgs()Z\"/>\n\t\t<method name=\"toGenericString()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/Field\" since=\"1\">\n\t\t<extends name=\"java/lang/reflect/AccessibleObject\"/>\n\t\t<implements name=\"java/lang/reflect/Member\"/>\n\t\t<method name=\"get(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getBoolean(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"getByte(Ljava/lang/Object;)B\"/>\n\t\t<method name=\"getChar(Ljava/lang/Object;)C\"/>\n\t\t<method name=\"getDouble(Ljava/lang/Object;)D\"/>\n\t\t<method name=\"getFloat(Ljava/lang/Object;)F\"/>\n\t\t<method name=\"getGenericType()Ljava/lang/reflect/Type;\"/>\n\t\t<method name=\"getInt(Ljava/lang/Object;)I\"/>\n\t\t<method name=\"getLong(Ljava/lang/Object;)J\"/>\n\t\t<method name=\"getShort(Ljava/lang/Object;)S\"/>\n\t\t<method name=\"getType()Ljava/lang/Class;\"/>\n\t\t<method name=\"isEnumConstant()Z\"/>\n\t\t<method name=\"set(Ljava/lang/Object;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"setBoolean(Ljava/lang/Object;Z)V\"/>\n\t\t<method name=\"setByte(Ljava/lang/Object;B)V\"/>\n\t\t<method name=\"setChar(Ljava/lang/Object;C)V\"/>\n\t\t<method name=\"setDouble(Ljava/lang/Object;D)V\"/>\n\t\t<method name=\"setFloat(Ljava/lang/Object;F)V\"/>\n\t\t<method name=\"setInt(Ljava/lang/Object;I)V\"/>\n\t\t<method name=\"setLong(Ljava/lang/Object;J)V\"/>\n\t\t<method name=\"setShort(Ljava/lang/Object;S)V\"/>\n\t\t<method name=\"toGenericString()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/GenericArrayType\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/reflect/Type\"/>\n\t\t<method name=\"getGenericComponentType()Ljava/lang/reflect/Type;\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/GenericDeclaration\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/reflect/AnnotatedElement\" since=\"26\"/>\n\t\t<method name=\"getTypeParameters()[Ljava/lang/reflect/TypeVariable;\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/GenericSignatureFormatError\" since=\"1\">\n\t\t<extends name=\"java/lang/ClassFormatError\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" since=\"26\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/InvocationHandler\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"invoke(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/InvocationTargetException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\" removed=\"19\"/>\n\t\t<extends name=\"java/lang/ReflectiveOperationException\" since=\"19\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getTargetException()Ljava/lang/Throwable;\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/MalformedParameterizedTypeException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/MalformedParametersException\" since=\"28\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/Member\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getDeclaringClass()Ljava/lang/Class;\"/>\n\t\t<method name=\"getModifiers()I\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"isSynthetic()Z\"/>\n\t\t<field name=\"DECLARED\"/>\n\t\t<field name=\"PUBLIC\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/Method\" since=\"1\">\n\t\t<extends name=\"java/lang/reflect/AccessibleObject\" removed=\"26\"/>\n\t\t<extends name=\"java/lang/reflect/Executable\" since=\"26\"/>\n\t\t<implements name=\"java/lang/reflect/GenericDeclaration\" removed=\"26\"/>\n\t\t<implements name=\"java/lang/reflect/Member\" removed=\"26\"/>\n\t\t<method name=\"getDefaultValue()Ljava/lang/Object;\"/>\n\t\t<method name=\"getExceptionTypes()[Ljava/lang/Class;\"/>\n\t\t<method name=\"getGenericExceptionTypes()[Ljava/lang/reflect/Type;\"/>\n\t\t<method name=\"getGenericParameterTypes()[Ljava/lang/reflect/Type;\"/>\n\t\t<method name=\"getGenericReturnType()Ljava/lang/reflect/Type;\"/>\n\t\t<method name=\"getParameterAnnotations()[[Ljava/lang/annotation/Annotation;\"/>\n\t\t<method name=\"getParameterTypes()[Ljava/lang/Class;\"/>\n\t\t<method name=\"getReturnType()Ljava/lang/Class;\"/>\n\t\t<method name=\"invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"isBridge()Z\"/>\n\t\t<method name=\"isDefault()Z\" since=\"24\"/>\n\t\t<method name=\"isVarArgs()Z\"/>\n\t\t<method name=\"toGenericString()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/Modifier\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"classModifiers()I\" since=\"19\"/>\n\t\t<method name=\"constructorModifiers()I\" since=\"19\"/>\n\t\t<method name=\"fieldModifiers()I\" since=\"19\"/>\n\t\t<method name=\"interfaceModifiers()I\" since=\"19\"/>\n\t\t<method name=\"isAbstract(I)Z\"/>\n\t\t<method name=\"isFinal(I)Z\"/>\n\t\t<method name=\"isInterface(I)Z\"/>\n\t\t<method name=\"isNative(I)Z\"/>\n\t\t<method name=\"isPrivate(I)Z\"/>\n\t\t<method name=\"isProtected(I)Z\"/>\n\t\t<method name=\"isPublic(I)Z\"/>\n\t\t<method name=\"isStatic(I)Z\"/>\n\t\t<method name=\"isStrict(I)Z\"/>\n\t\t<method name=\"isSynchronized(I)Z\"/>\n\t\t<method name=\"isTransient(I)Z\"/>\n\t\t<method name=\"isVolatile(I)Z\"/>\n\t\t<method name=\"methodModifiers()I\" since=\"19\"/>\n\t\t<method name=\"parameterModifiers()I\" since=\"26\"/>\n\t\t<method name=\"toString(I)Ljava/lang/String;\"/>\n\t\t<field name=\"ABSTRACT\"/>\n\t\t<field name=\"FINAL\"/>\n\t\t<field name=\"INTERFACE\"/>\n\t\t<field name=\"NATIVE\"/>\n\t\t<field name=\"PRIVATE\"/>\n\t\t<field name=\"PROTECTED\"/>\n\t\t<field name=\"PUBLIC\"/>\n\t\t<field name=\"STATIC\"/>\n\t\t<field name=\"STRICT\"/>\n\t\t<field name=\"SYNCHRONIZED\"/>\n\t\t<field name=\"TRANSIENT\"/>\n\t\t<field name=\"VOLATILE\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/Parameter\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/reflect/AnnotatedElement\"/>\n\t\t<method name=\"getDeclaringExecutable()Ljava/lang/reflect/Executable;\"/>\n\t\t<method name=\"getModifiers()I\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getParameterizedType()Ljava/lang/reflect/Type;\"/>\n\t\t<method name=\"getType()Ljava/lang/Class;\"/>\n\t\t<method name=\"isImplicit()Z\"/>\n\t\t<method name=\"isNamePresent()Z\"/>\n\t\t<method name=\"isSynthetic()Z\"/>\n\t\t<method name=\"isVarArgs()Z\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/ParameterizedType\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/reflect/Type\"/>\n\t\t<method name=\"getActualTypeArguments()[Ljava/lang/reflect/Type;\"/>\n\t\t<method name=\"getOwnerType()Ljava/lang/reflect/Type;\"/>\n\t\t<method name=\"getRawType()Ljava/lang/reflect/Type;\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/Proxy\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/reflect/InvocationHandler;)V\"/>\n\t\t<method name=\"getInvocationHandler(Ljava/lang/Object;)Ljava/lang/reflect/InvocationHandler;\"/>\n\t\t<method name=\"getProxyClass(Ljava/lang/ClassLoader;[Ljava/lang/Class;)Ljava/lang/Class;\"/>\n\t\t<method name=\"isProxyClass(Ljava/lang/Class;)Z\"/>\n\t\t<method name=\"newProxyInstance(Ljava/lang/ClassLoader;[Ljava/lang/Class;Ljava/lang/reflect/InvocationHandler;)Ljava/lang/Object;\"/>\n\t\t<field name=\"h\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/ReflectPermission\" since=\"1\">\n\t\t<extends name=\"java/security/BasicPermission\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/Type\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getTypeName()Ljava/lang/String;\" since=\"28\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/TypeVariable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/reflect/Type\"/>\n\t\t<method name=\"getBounds()[Ljava/lang/reflect/Type;\"/>\n\t\t<method name=\"getGenericDeclaration()Ljava/lang/reflect/GenericDeclaration;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/UndeclaredThrowableException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getUndeclaredThrowable()Ljava/lang/Throwable;\"/>\n\t</class>\n\t<class name=\"java/lang/reflect/WildcardType\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/reflect/Type\"/>\n\t\t<method name=\"getLowerBounds()[Ljava/lang/reflect/Type;\"/>\n\t\t<method name=\"getUpperBounds()[Ljava/lang/reflect/Type;\"/>\n\t</class>\n\t<class name=\"java/math/BigDecimal\" since=\"1\">\n\t\t<extends name=\"java/lang/Number\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(D)V\"/>\n\t\t<method name=\"&lt;init>(DLjava/math/MathContext;)V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/math/MathContext;)V\"/>\n\t\t<method name=\"&lt;init>(J)V\"/>\n\t\t<method name=\"&lt;init>(JLjava/math/MathContext;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/math/MathContext;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigInteger;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigInteger;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigInteger;ILjava/math/MathContext;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigInteger;Ljava/math/MathContext;)V\"/>\n\t\t<method name=\"&lt;init>([C)V\"/>\n\t\t<method name=\"&lt;init>([CII)V\"/>\n\t\t<method name=\"&lt;init>([CIILjava/math/MathContext;)V\"/>\n\t\t<method name=\"&lt;init>([CLjava/math/MathContext;)V\"/>\n\t\t<method name=\"abs()Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"abs(Ljava/math/MathContext;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"add(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"add(Ljava/math/BigDecimal;Ljava/math/MathContext;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"byteValueExact()B\"/>\n\t\t<method name=\"compareTo(Ljava/math/BigDecimal;)I\"/>\n\t\t<method name=\"divide(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"divide(Ljava/math/BigDecimal;I)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"divide(Ljava/math/BigDecimal;II)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"divide(Ljava/math/BigDecimal;ILjava/math/RoundingMode;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"divide(Ljava/math/BigDecimal;Ljava/math/MathContext;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"divide(Ljava/math/BigDecimal;Ljava/math/RoundingMode;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"divideAndRemainder(Ljava/math/BigDecimal;)[Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"divideAndRemainder(Ljava/math/BigDecimal;Ljava/math/MathContext;)[Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"divideToIntegralValue(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"divideToIntegralValue(Ljava/math/BigDecimal;Ljava/math/MathContext;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"intValueExact()I\"/>\n\t\t<method name=\"longValueExact()J\"/>\n\t\t<method name=\"max(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"min(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"movePointLeft(I)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"movePointRight(I)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"multiply(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"multiply(Ljava/math/BigDecimal;Ljava/math/MathContext;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"negate()Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"negate(Ljava/math/MathContext;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"plus()Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"plus(Ljava/math/MathContext;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"pow(I)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"pow(ILjava/math/MathContext;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"precision()I\"/>\n\t\t<method name=\"remainder(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"remainder(Ljava/math/BigDecimal;Ljava/math/MathContext;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"round(Ljava/math/MathContext;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"scale()I\"/>\n\t\t<method name=\"scaleByPowerOfTen(I)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"setScale(I)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"setScale(II)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"setScale(ILjava/math/RoundingMode;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"shortValueExact()S\"/>\n\t\t<method name=\"signum()I\"/>\n\t\t<method name=\"stripTrailingZeros()Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"subtract(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"subtract(Ljava/math/BigDecimal;Ljava/math/MathContext;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"toBigInteger()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"toBigIntegerExact()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"toEngineeringString()Ljava/lang/String;\"/>\n\t\t<method name=\"toPlainString()Ljava/lang/String;\"/>\n\t\t<method name=\"ulp()Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"unscaledValue()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"valueOf(D)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"valueOf(J)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"valueOf(JI)Ljava/math/BigDecimal;\"/>\n\t\t<field name=\"ONE\"/>\n\t\t<field name=\"ROUND_CEILING\"/>\n\t\t<field name=\"ROUND_DOWN\"/>\n\t\t<field name=\"ROUND_FLOOR\"/>\n\t\t<field name=\"ROUND_HALF_DOWN\"/>\n\t\t<field name=\"ROUND_HALF_EVEN\"/>\n\t\t<field name=\"ROUND_HALF_UP\"/>\n\t\t<field name=\"ROUND_UNNECESSARY\"/>\n\t\t<field name=\"ROUND_UP\"/>\n\t\t<field name=\"TEN\"/>\n\t\t<field name=\"ZERO\"/>\n\t</class>\n\t<class name=\"java/math/BigInteger\" since=\"1\">\n\t\t<extends name=\"java/lang/Number\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(IILjava/util/Random;)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/util/Random;)V\"/>\n\t\t<method name=\"&lt;init>(I[B)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>([B)V\"/>\n\t\t<method name=\"abs()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"add(Ljava/math/BigInteger;)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"and(Ljava/math/BigInteger;)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"andNot(Ljava/math/BigInteger;)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"bitCount()I\"/>\n\t\t<method name=\"bitLength()I\"/>\n\t\t<method name=\"clearBit(I)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"compareTo(Ljava/math/BigInteger;)I\"/>\n\t\t<method name=\"divide(Ljava/math/BigInteger;)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"divideAndRemainder(Ljava/math/BigInteger;)[Ljava/math/BigInteger;\"/>\n\t\t<method name=\"flipBit(I)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"gcd(Ljava/math/BigInteger;)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getLowestSetBit()I\"/>\n\t\t<method name=\"isProbablePrime(I)Z\"/>\n\t\t<method name=\"max(Ljava/math/BigInteger;)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"min(Ljava/math/BigInteger;)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"modInverse(Ljava/math/BigInteger;)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"modPow(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"multiply(Ljava/math/BigInteger;)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"negate()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"nextProbablePrime()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"not()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"or(Ljava/math/BigInteger;)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"pow(I)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"probablePrime(ILjava/util/Random;)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"remainder(Ljava/math/BigInteger;)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"setBit(I)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"shiftLeft(I)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"shiftRight(I)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"signum()I\"/>\n\t\t<method name=\"subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"testBit(I)Z\"/>\n\t\t<method name=\"toByteArray()[B\"/>\n\t\t<method name=\"toString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"valueOf(J)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"xor(Ljava/math/BigInteger;)Ljava/math/BigInteger;\"/>\n\t\t<field name=\"ONE\"/>\n\t\t<field name=\"TEN\"/>\n\t\t<field name=\"ZERO\"/>\n\t</class>\n\t<class name=\"java/math/MathContext\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/math/RoundingMode;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getPrecision()I\"/>\n\t\t<method name=\"getRoundingMode()Ljava/math/RoundingMode;\"/>\n\t\t<field name=\"DECIMAL128\"/>\n\t\t<field name=\"DECIMAL32\"/>\n\t\t<field name=\"DECIMAL64\"/>\n\t\t<field name=\"UNLIMITED\"/>\n\t</class>\n\t<class name=\"java/math/RoundingMode\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(I)Ljava/math/RoundingMode;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/math/RoundingMode;\"/>\n\t\t<method name=\"values()[Ljava/math/RoundingMode;\"/>\n\t\t<field name=\"CEILING\"/>\n\t\t<field name=\"DOWN\"/>\n\t\t<field name=\"FLOOR\"/>\n\t\t<field name=\"HALF_DOWN\"/>\n\t\t<field name=\"HALF_EVEN\"/>\n\t\t<field name=\"HALF_UP\"/>\n\t\t<field name=\"UNNECESSARY\"/>\n\t\t<field name=\"UP\"/>\n\t</class>\n\t<class name=\"java/net/Authenticator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getPasswordAuthentication()Ljava/net/PasswordAuthentication;\"/>\n\t\t<method name=\"getRequestingHost()Ljava/lang/String;\"/>\n\t\t<method name=\"getRequestingPort()I\"/>\n\t\t<method name=\"getRequestingPrompt()Ljava/lang/String;\"/>\n\t\t<method name=\"getRequestingProtocol()Ljava/lang/String;\"/>\n\t\t<method name=\"getRequestingScheme()Ljava/lang/String;\"/>\n\t\t<method name=\"getRequestingSite()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getRequestingURL()Ljava/net/URL;\"/>\n\t\t<method name=\"getRequestorType()Ljava/net/Authenticator$RequestorType;\"/>\n\t\t<method name=\"requestPasswordAuthentication(Ljava/lang/String;Ljava/net/InetAddress;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/net/PasswordAuthentication;\"/>\n\t\t<method name=\"requestPasswordAuthentication(Ljava/lang/String;Ljava/net/InetAddress;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/net/URL;Ljava/net/Authenticator$RequestorType;)Ljava/net/PasswordAuthentication;\"/>\n\t\t<method name=\"requestPasswordAuthentication(Ljava/net/InetAddress;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/net/PasswordAuthentication;\"/>\n\t\t<method name=\"setDefault(Ljava/net/Authenticator;)V\"/>\n\t</class>\n\t<class name=\"java/net/Authenticator$RequestorType\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/net/Authenticator$RequestorType;\"/>\n\t\t<method name=\"values()[Ljava/net/Authenticator$RequestorType;\"/>\n\t\t<field name=\"PROXY\"/>\n\t\t<field name=\"SERVER\"/>\n\t</class>\n\t<class name=\"java/net/BindException\" since=\"1\">\n\t\t<extends name=\"java/net/SocketException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/net/CacheRequest\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"abort()V\"/>\n\t\t<method name=\"getBody()Ljava/io/OutputStream;\"/>\n\t</class>\n\t<class name=\"java/net/CacheResponse\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getBody()Ljava/io/InputStream;\"/>\n\t\t<method name=\"getHeaders()Ljava/util/Map;\"/>\n\t</class>\n\t<class name=\"java/net/ConnectException\" since=\"1\">\n\t\t<extends name=\"java/net/SocketException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/net/ContentHandler\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getContent(Ljava/net/URLConnection;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getContent(Ljava/net/URLConnection;[Ljava/lang/Class;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/net/ContentHandlerFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createContentHandler(Ljava/lang/String;)Ljava/net/ContentHandler;\"/>\n\t</class>\n\t<class name=\"java/net/CookieHandler\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"get(Ljava/net/URI;Ljava/util/Map;)Ljava/util/Map;\"/>\n\t\t<method name=\"getDefault()Ljava/net/CookieHandler;\"/>\n\t\t<method name=\"put(Ljava/net/URI;Ljava/util/Map;)V\"/>\n\t\t<method name=\"setDefault(Ljava/net/CookieHandler;)V\"/>\n\t</class>\n\t<class name=\"java/net/CookieManager\" since=\"9\">\n\t\t<extends name=\"java/net/CookieHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/CookieStore;Ljava/net/CookiePolicy;)V\"/>\n\t\t<method name=\"getCookieStore()Ljava/net/CookieStore;\"/>\n\t\t<method name=\"setCookiePolicy(Ljava/net/CookiePolicy;)V\"/>\n\t</class>\n\t<class name=\"java/net/CookiePolicy\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"shouldAccept(Ljava/net/URI;Ljava/net/HttpCookie;)Z\"/>\n\t\t<field name=\"ACCEPT_ALL\"/>\n\t\t<field name=\"ACCEPT_NONE\"/>\n\t\t<field name=\"ACCEPT_ORIGINAL_SERVER\"/>\n\t</class>\n\t<class name=\"java/net/CookieStore\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"add(Ljava/net/URI;Ljava/net/HttpCookie;)V\"/>\n\t\t<method name=\"get(Ljava/net/URI;)Ljava/util/List;\"/>\n\t\t<method name=\"getCookies()Ljava/util/List;\"/>\n\t\t<method name=\"getURIs()Ljava/util/List;\"/>\n\t\t<method name=\"remove(Ljava/net/URI;Ljava/net/HttpCookie;)Z\"/>\n\t\t<method name=\"removeAll()Z\"/>\n\t</class>\n\t<class name=\"java/net/DatagramPacket\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>([BI)V\"/>\n\t\t<method name=\"&lt;init>([BII)V\"/>\n\t\t<method name=\"&lt;init>([BIILjava/net/InetAddress;I)V\"/>\n\t\t<method name=\"&lt;init>([BIILjava/net/SocketAddress;)V\"/>\n\t\t<method name=\"&lt;init>([BILjava/net/InetAddress;I)V\"/>\n\t\t<method name=\"&lt;init>([BILjava/net/SocketAddress;)V\"/>\n\t\t<method name=\"getAddress()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getData()[B\"/>\n\t\t<method name=\"getLength()I\"/>\n\t\t<method name=\"getOffset()I\"/>\n\t\t<method name=\"getPort()I\"/>\n\t\t<method name=\"getSocketAddress()Ljava/net/SocketAddress;\"/>\n\t\t<method name=\"setAddress(Ljava/net/InetAddress;)V\"/>\n\t\t<method name=\"setData([B)V\"/>\n\t\t<method name=\"setData([BII)V\"/>\n\t\t<method name=\"setLength(I)V\"/>\n\t\t<method name=\"setPort(I)V\"/>\n\t\t<method name=\"setSocketAddress(Ljava/net/SocketAddress;)V\"/>\n\t</class>\n\t<class name=\"java/net/DatagramSocket\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\" since=\"19\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/net/InetAddress;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/DatagramSocketImpl;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/SocketAddress;)V\"/>\n\t\t<method name=\"bind(Ljava/net/SocketAddress;)V\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"connect(Ljava/net/InetAddress;I)V\"/>\n\t\t<method name=\"connect(Ljava/net/SocketAddress;)V\"/>\n\t\t<method name=\"disconnect()V\"/>\n\t\t<method name=\"getBroadcast()Z\"/>\n\t\t<method name=\"getChannel()Ljava/nio/channels/DatagramChannel;\"/>\n\t\t<method name=\"getInetAddress()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getLocalAddress()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getLocalPort()I\"/>\n\t\t<method name=\"getLocalSocketAddress()Ljava/net/SocketAddress;\"/>\n\t\t<method name=\"getPort()I\"/>\n\t\t<method name=\"getReceiveBufferSize()I\"/>\n\t\t<method name=\"getRemoteSocketAddress()Ljava/net/SocketAddress;\"/>\n\t\t<method name=\"getReuseAddress()Z\"/>\n\t\t<method name=\"getSendBufferSize()I\"/>\n\t\t<method name=\"getSoTimeout()I\"/>\n\t\t<method name=\"getTrafficClass()I\"/>\n\t\t<method name=\"isBound()Z\"/>\n\t\t<method name=\"isClosed()Z\"/>\n\t\t<method name=\"isConnected()Z\"/>\n\t\t<method name=\"receive(Ljava/net/DatagramPacket;)V\"/>\n\t\t<method name=\"send(Ljava/net/DatagramPacket;)V\"/>\n\t\t<method name=\"setBroadcast(Z)V\"/>\n\t\t<method name=\"setDatagramSocketImplFactory(Ljava/net/DatagramSocketImplFactory;)V\"/>\n\t\t<method name=\"setReceiveBufferSize(I)V\"/>\n\t\t<method name=\"setReuseAddress(Z)V\"/>\n\t\t<method name=\"setSendBufferSize(I)V\"/>\n\t\t<method name=\"setSoTimeout(I)V\"/>\n\t\t<method name=\"setTrafficClass(I)V\"/>\n\t</class>\n\t<class name=\"java/net/DatagramSocketImpl\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/net/SocketOptions\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"bind(ILjava/net/InetAddress;)V\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"connect(Ljava/net/InetAddress;I)V\"/>\n\t\t<method name=\"create()V\"/>\n\t\t<method name=\"disconnect()V\"/>\n\t\t<method name=\"getFileDescriptor()Ljava/io/FileDescriptor;\"/>\n\t\t<method name=\"getLocalPort()I\"/>\n\t\t<method name=\"getTTL()B\" deprecated=\"15\"/>\n\t\t<method name=\"getTimeToLive()I\"/>\n\t\t<method name=\"join(Ljava/net/InetAddress;)V\"/>\n\t\t<method name=\"joinGroup(Ljava/net/SocketAddress;Ljava/net/NetworkInterface;)V\"/>\n\t\t<method name=\"leave(Ljava/net/InetAddress;)V\"/>\n\t\t<method name=\"leaveGroup(Ljava/net/SocketAddress;Ljava/net/NetworkInterface;)V\"/>\n\t\t<method name=\"peek(Ljava/net/InetAddress;)I\"/>\n\t\t<method name=\"peekData(Ljava/net/DatagramPacket;)I\"/>\n\t\t<method name=\"receive(Ljava/net/DatagramPacket;)V\"/>\n\t\t<method name=\"send(Ljava/net/DatagramPacket;)V\"/>\n\t\t<method name=\"setTTL(B)V\" deprecated=\"15\"/>\n\t\t<method name=\"setTimeToLive(I)V\"/>\n\t\t<field name=\"fd\"/>\n\t\t<field name=\"localPort\"/>\n\t</class>\n\t<class name=\"java/net/DatagramSocketImplFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createDatagramSocketImpl()Ljava/net/DatagramSocketImpl;\"/>\n\t</class>\n\t<class name=\"java/net/FileNameMap\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getContentTypeFor(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/net/HttpCookie\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"domainMatches(Ljava/lang/String;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"getComment()Ljava/lang/String;\"/>\n\t\t<method name=\"getCommentURL()Ljava/lang/String;\"/>\n\t\t<method name=\"getDiscard()Z\"/>\n\t\t<method name=\"getDomain()Ljava/lang/String;\"/>\n\t\t<method name=\"getMaxAge()J\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getPath()Ljava/lang/String;\"/>\n\t\t<method name=\"getPortlist()Ljava/lang/String;\"/>\n\t\t<method name=\"getSecure()Z\"/>\n\t\t<method name=\"getValue()Ljava/lang/String;\"/>\n\t\t<method name=\"getVersion()I\"/>\n\t\t<method name=\"hasExpired()Z\"/>\n\t\t<method name=\"isHttpOnly()Z\" since=\"24\"/>\n\t\t<method name=\"parse(Ljava/lang/String;)Ljava/util/List;\"/>\n\t\t<method name=\"setComment(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setCommentURL(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setDiscard(Z)V\"/>\n\t\t<method name=\"setDomain(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setHttpOnly(Z)V\" since=\"24\"/>\n\t\t<method name=\"setMaxAge(J)V\"/>\n\t\t<method name=\"setPath(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setPortlist(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setSecure(Z)V\"/>\n\t\t<method name=\"setValue(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setVersion(I)V\"/>\n\t</class>\n\t<class name=\"java/net/HttpRetryException\" since=\"1\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;ILjava/lang/String;)V\"/>\n\t\t<method name=\"getLocation()Ljava/lang/String;\"/>\n\t\t<method name=\"getReason()Ljava/lang/String;\"/>\n\t\t<method name=\"responseCode()I\"/>\n\t</class>\n\t<class name=\"java/net/HttpURLConnection\" since=\"1\">\n\t\t<extends name=\"java/net/URLConnection\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/URL;)V\"/>\n\t\t<method name=\"disconnect()V\"/>\n\t\t<method name=\"getErrorStream()Ljava/io/InputStream;\"/>\n\t\t<method name=\"getFollowRedirects()Z\"/>\n\t\t<method name=\"getInstanceFollowRedirects()Z\"/>\n\t\t<method name=\"getRequestMethod()Ljava/lang/String;\"/>\n\t\t<method name=\"getResponseCode()I\"/>\n\t\t<method name=\"getResponseMessage()Ljava/lang/String;\"/>\n\t\t<method name=\"setChunkedStreamingMode(I)V\"/>\n\t\t<method name=\"setFixedLengthStreamingMode(I)V\"/>\n\t\t<method name=\"setFixedLengthStreamingMode(J)V\" since=\"19\"/>\n\t\t<method name=\"setFollowRedirects(Z)V\"/>\n\t\t<method name=\"setInstanceFollowRedirects(Z)V\"/>\n\t\t<method name=\"setRequestMethod(Ljava/lang/String;)V\"/>\n\t\t<method name=\"usingProxy()Z\"/>\n\t\t<field name=\"HTTP_ACCEPTED\"/>\n\t\t<field name=\"HTTP_BAD_GATEWAY\"/>\n\t\t<field name=\"HTTP_BAD_METHOD\"/>\n\t\t<field name=\"HTTP_BAD_REQUEST\"/>\n\t\t<field name=\"HTTP_CLIENT_TIMEOUT\"/>\n\t\t<field name=\"HTTP_CONFLICT\"/>\n\t\t<field name=\"HTTP_CREATED\"/>\n\t\t<field name=\"HTTP_ENTITY_TOO_LARGE\"/>\n\t\t<field name=\"HTTP_FORBIDDEN\"/>\n\t\t<field name=\"HTTP_GATEWAY_TIMEOUT\"/>\n\t\t<field name=\"HTTP_GONE\"/>\n\t\t<field name=\"HTTP_INTERNAL_ERROR\"/>\n\t\t<field name=\"HTTP_LENGTH_REQUIRED\"/>\n\t\t<field name=\"HTTP_MOVED_PERM\"/>\n\t\t<field name=\"HTTP_MOVED_TEMP\"/>\n\t\t<field name=\"HTTP_MULT_CHOICE\"/>\n\t\t<field name=\"HTTP_NOT_ACCEPTABLE\"/>\n\t\t<field name=\"HTTP_NOT_AUTHORITATIVE\"/>\n\t\t<field name=\"HTTP_NOT_FOUND\"/>\n\t\t<field name=\"HTTP_NOT_IMPLEMENTED\"/>\n\t\t<field name=\"HTTP_NOT_MODIFIED\"/>\n\t\t<field name=\"HTTP_NO_CONTENT\"/>\n\t\t<field name=\"HTTP_OK\"/>\n\t\t<field name=\"HTTP_PARTIAL\"/>\n\t\t<field name=\"HTTP_PAYMENT_REQUIRED\"/>\n\t\t<field name=\"HTTP_PRECON_FAILED\"/>\n\t\t<field name=\"HTTP_PROXY_AUTH\"/>\n\t\t<field name=\"HTTP_REQ_TOO_LONG\"/>\n\t\t<field name=\"HTTP_RESET\"/>\n\t\t<field name=\"HTTP_SEE_OTHER\"/>\n\t\t<field name=\"HTTP_SERVER_ERROR\" deprecated=\"15\"/>\n\t\t<field name=\"HTTP_UNAUTHORIZED\"/>\n\t\t<field name=\"HTTP_UNAVAILABLE\"/>\n\t\t<field name=\"HTTP_UNSUPPORTED_TYPE\"/>\n\t\t<field name=\"HTTP_USE_PROXY\"/>\n\t\t<field name=\"HTTP_VERSION\"/>\n\t\t<field name=\"chunkLength\"/>\n\t\t<field name=\"fixedContentLength\"/>\n\t\t<field name=\"fixedContentLengthLong\" since=\"19\"/>\n\t\t<field name=\"instanceFollowRedirects\"/>\n\t\t<field name=\"method\"/>\n\t\t<field name=\"responseCode\"/>\n\t\t<field name=\"responseMessage\"/>\n\t</class>\n\t<class name=\"java/net/IDN\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"toASCII(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"toASCII(Ljava/lang/String;I)Ljava/lang/String;\"/>\n\t\t<method name=\"toUnicode(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"toUnicode(Ljava/lang/String;I)Ljava/lang/String;\"/>\n\t\t<field name=\"ALLOW_UNASSIGNED\"/>\n\t\t<field name=\"USE_STD3_ASCII_RULES\"/>\n\t</class>\n\t<class name=\"java/net/Inet4Address\" since=\"1\">\n\t\t<extends name=\"java/net/InetAddress\"/>\n\t</class>\n\t<class name=\"java/net/Inet6Address\" since=\"1\">\n\t\t<extends name=\"java/net/InetAddress\"/>\n\t\t<method name=\"getByAddress(Ljava/lang/String;[BI)Ljava/net/Inet6Address;\"/>\n\t\t<method name=\"getByAddress(Ljava/lang/String;[BLjava/net/NetworkInterface;)Ljava/net/Inet6Address;\"/>\n\t\t<method name=\"getScopeId()I\"/>\n\t\t<method name=\"getScopedInterface()Ljava/net/NetworkInterface;\"/>\n\t\t<method name=\"isIPv4CompatibleAddress()Z\"/>\n\t</class>\n\t<class name=\"java/net/InetAddress\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"getAddress()[B\"/>\n\t\t<method name=\"getAllByName(Ljava/lang/String;)[Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getByAddress(Ljava/lang/String;[B)Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getByAddress([B)Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getByName(Ljava/lang/String;)Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getCanonicalHostName()Ljava/lang/String;\"/>\n\t\t<method name=\"getHostAddress()Ljava/lang/String;\"/>\n\t\t<method name=\"getHostName()Ljava/lang/String;\"/>\n\t\t<method name=\"getLocalHost()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getLoopbackAddress()Ljava/net/InetAddress;\" since=\"19\"/>\n\t\t<method name=\"isAnyLocalAddress()Z\"/>\n\t\t<method name=\"isLinkLocalAddress()Z\"/>\n\t\t<method name=\"isLoopbackAddress()Z\"/>\n\t\t<method name=\"isMCGlobal()Z\"/>\n\t\t<method name=\"isMCLinkLocal()Z\"/>\n\t\t<method name=\"isMCNodeLocal()Z\"/>\n\t\t<method name=\"isMCOrgLocal()Z\"/>\n\t\t<method name=\"isMCSiteLocal()Z\"/>\n\t\t<method name=\"isMulticastAddress()Z\"/>\n\t\t<method name=\"isReachable(I)Z\"/>\n\t\t<method name=\"isReachable(Ljava/net/NetworkInterface;II)Z\"/>\n\t\t<method name=\"isSiteLocalAddress()Z\"/>\n\t</class>\n\t<class name=\"java/net/InetSocketAddress\" since=\"1\">\n\t\t<extends name=\"java/net/SocketAddress\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/InetAddress;I)V\"/>\n\t\t<method name=\"createUnresolved(Ljava/lang/String;I)Ljava/net/InetSocketAddress;\"/>\n\t\t<method name=\"getAddress()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getHostName()Ljava/lang/String;\"/>\n\t\t<method name=\"getHostString()Ljava/lang/String;\" since=\"19\"/>\n\t\t<method name=\"getPort()I\"/>\n\t\t<method name=\"isUnresolved()Z\"/>\n\t</class>\n\t<class name=\"java/net/InterfaceAddress\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAddress()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getBroadcast()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getNetworkPrefixLength()S\"/>\n\t</class>\n\t<class name=\"java/net/JarURLConnection\" since=\"1\">\n\t\t<extends name=\"java/net/URLConnection\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/URL;)V\"/>\n\t\t<method name=\"getAttributes()Ljava/util/jar/Attributes;\"/>\n\t\t<method name=\"getCertificates()[Ljava/security/cert/Certificate;\"/>\n\t\t<method name=\"getEntryName()Ljava/lang/String;\"/>\n\t\t<method name=\"getJarEntry()Ljava/util/jar/JarEntry;\"/>\n\t\t<method name=\"getJarFile()Ljava/util/jar/JarFile;\"/>\n\t\t<method name=\"getJarFileURL()Ljava/net/URL;\"/>\n\t\t<method name=\"getMainAttributes()Ljava/util/jar/Attributes;\"/>\n\t\t<method name=\"getManifest()Ljava/util/jar/Manifest;\"/>\n\t\t<field name=\"jarFileURLConnection\"/>\n\t</class>\n\t<class name=\"java/net/MalformedURLException\" since=\"1\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/net/MulticastSocket\" since=\"1\">\n\t\t<extends name=\"java/net/DatagramSocket\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/SocketAddress;)V\"/>\n\t\t<method name=\"getInterface()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getLoopbackMode()Z\"/>\n\t\t<method name=\"getNetworkInterface()Ljava/net/NetworkInterface;\"/>\n\t\t<method name=\"getTTL()B\" deprecated=\"15\"/>\n\t\t<method name=\"getTimeToLive()I\"/>\n\t\t<method name=\"joinGroup(Ljava/net/InetAddress;)V\"/>\n\t\t<method name=\"joinGroup(Ljava/net/SocketAddress;Ljava/net/NetworkInterface;)V\"/>\n\t\t<method name=\"leaveGroup(Ljava/net/InetAddress;)V\"/>\n\t\t<method name=\"leaveGroup(Ljava/net/SocketAddress;Ljava/net/NetworkInterface;)V\"/>\n\t\t<method name=\"send(Ljava/net/DatagramPacket;B)V\" deprecated=\"15\"/>\n\t\t<method name=\"setInterface(Ljava/net/InetAddress;)V\"/>\n\t\t<method name=\"setLoopbackMode(Z)V\"/>\n\t\t<method name=\"setNetworkInterface(Ljava/net/NetworkInterface;)V\"/>\n\t\t<method name=\"setTTL(B)V\" deprecated=\"15\"/>\n\t\t<method name=\"setTimeToLive(I)V\"/>\n\t</class>\n\t<class name=\"java/net/NetPermission\" since=\"1\">\n\t\t<extends name=\"java/security/BasicPermission\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/net/NetworkInterface\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getByIndex(I)Ljava/net/NetworkInterface;\" since=\"19\"/>\n\t\t<method name=\"getByInetAddress(Ljava/net/InetAddress;)Ljava/net/NetworkInterface;\"/>\n\t\t<method name=\"getByName(Ljava/lang/String;)Ljava/net/NetworkInterface;\"/>\n\t\t<method name=\"getDisplayName()Ljava/lang/String;\"/>\n\t\t<method name=\"getHardwareAddress()[B\" since=\"9\"/>\n\t\t<method name=\"getIndex()I\" since=\"19\"/>\n\t\t<method name=\"getInetAddresses()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"getInterfaceAddresses()Ljava/util/List;\" since=\"9\"/>\n\t\t<method name=\"getMTU()I\" since=\"9\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getNetworkInterfaces()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"getParent()Ljava/net/NetworkInterface;\" since=\"9\"/>\n\t\t<method name=\"getSubInterfaces()Ljava/util/Enumeration;\" since=\"9\"/>\n\t\t<method name=\"isLoopback()Z\" since=\"9\"/>\n\t\t<method name=\"isPointToPoint()Z\" since=\"9\"/>\n\t\t<method name=\"isUp()Z\" since=\"9\"/>\n\t\t<method name=\"isVirtual()Z\" since=\"9\"/>\n\t\t<method name=\"supportsMulticast()Z\" since=\"9\"/>\n\t</class>\n\t<class name=\"java/net/NoRouteToHostException\" since=\"1\">\n\t\t<extends name=\"java/net/SocketException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/net/PasswordAuthentication\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;[C)V\"/>\n\t\t<method name=\"getPassword()[C\"/>\n\t\t<method name=\"getUserName()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/net/PortUnreachableException\" since=\"1\">\n\t\t<extends name=\"java/net/SocketException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/net/ProtocolException\" since=\"1\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/net/ProtocolFamily\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"name()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/net/Proxy\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/Proxy$Type;Ljava/net/SocketAddress;)V\"/>\n\t\t<method name=\"address()Ljava/net/SocketAddress;\"/>\n\t\t<method name=\"type()Ljava/net/Proxy$Type;\"/>\n\t\t<field name=\"NO_PROXY\"/>\n\t</class>\n\t<class name=\"java/net/Proxy$Type\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/net/Proxy$Type;\"/>\n\t\t<method name=\"values()[Ljava/net/Proxy$Type;\"/>\n\t\t<field name=\"DIRECT\"/>\n\t\t<field name=\"HTTP\"/>\n\t\t<field name=\"SOCKS\"/>\n\t</class>\n\t<class name=\"java/net/ProxySelector\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"connectFailed(Ljava/net/URI;Ljava/net/SocketAddress;Ljava/io/IOException;)V\"/>\n\t\t<method name=\"getDefault()Ljava/net/ProxySelector;\"/>\n\t\t<method name=\"select(Ljava/net/URI;)Ljava/util/List;\"/>\n\t\t<method name=\"setDefault(Ljava/net/ProxySelector;)V\"/>\n\t</class>\n\t<class name=\"java/net/ResponseCache\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"get(Ljava/net/URI;Ljava/lang/String;Ljava/util/Map;)Ljava/net/CacheResponse;\"/>\n\t\t<method name=\"getDefault()Ljava/net/ResponseCache;\"/>\n\t\t<method name=\"put(Ljava/net/URI;Ljava/net/URLConnection;)Ljava/net/CacheRequest;\"/>\n\t\t<method name=\"setDefault(Ljava/net/ResponseCache;)V\"/>\n\t</class>\n\t<class name=\"java/net/SecureCacheResponse\" since=\"1\">\n\t\t<extends name=\"java/net/CacheResponse\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getCipherSuite()Ljava/lang/String;\"/>\n\t\t<method name=\"getLocalCertificateChain()Ljava/util/List;\"/>\n\t\t<method name=\"getLocalPrincipal()Ljava/security/Principal;\"/>\n\t\t<method name=\"getPeerPrincipal()Ljava/security/Principal;\"/>\n\t\t<method name=\"getServerCertificateChain()Ljava/util/List;\"/>\n\t</class>\n\t<class name=\"java/net/ServerSocket\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\" since=\"19\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(IILjava/net/InetAddress;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/SocketImpl;)V\" removed=\"2\"/>\n\t\t<method name=\"accept()Ljava/net/Socket;\"/>\n\t\t<method name=\"bind(Ljava/net/SocketAddress;)V\"/>\n\t\t<method name=\"bind(Ljava/net/SocketAddress;I)V\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"getChannel()Ljava/nio/channels/ServerSocketChannel;\"/>\n\t\t<method name=\"getInetAddress()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getLocalPort()I\"/>\n\t\t<method name=\"getLocalSocketAddress()Ljava/net/SocketAddress;\"/>\n\t\t<method name=\"getReceiveBufferSize()I\"/>\n\t\t<method name=\"getReuseAddress()Z\"/>\n\t\t<method name=\"getSoTimeout()I\"/>\n\t\t<method name=\"implAccept(Ljava/net/Socket;)V\"/>\n\t\t<method name=\"isBound()Z\"/>\n\t\t<method name=\"isClosed()Z\"/>\n\t\t<method name=\"setPerformancePreferences(III)V\"/>\n\t\t<method name=\"setReceiveBufferSize(I)V\"/>\n\t\t<method name=\"setReuseAddress(Z)V\"/>\n\t\t<method name=\"setSoTimeout(I)V\"/>\n\t\t<method name=\"setSocketFactory(Ljava/net/SocketImplFactory;)V\"/>\n\t</class>\n\t<class name=\"java/net/Socket\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\" since=\"19\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;ILjava/net/InetAddress;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;IZ)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/InetAddress;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/InetAddress;ILjava/net/InetAddress;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/InetAddress;IZ)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/Proxy;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/SocketImpl;)V\"/>\n\t\t<method name=\"bind(Ljava/net/SocketAddress;)V\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"connect(Ljava/net/SocketAddress;)V\"/>\n\t\t<method name=\"connect(Ljava/net/SocketAddress;I)V\"/>\n\t\t<method name=\"getChannel()Ljava/nio/channels/SocketChannel;\"/>\n\t\t<method name=\"getInetAddress()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getInputStream()Ljava/io/InputStream;\"/>\n\t\t<method name=\"getKeepAlive()Z\"/>\n\t\t<method name=\"getLocalAddress()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getLocalPort()I\"/>\n\t\t<method name=\"getLocalSocketAddress()Ljava/net/SocketAddress;\"/>\n\t\t<method name=\"getOOBInline()Z\"/>\n\t\t<method name=\"getOutputStream()Ljava/io/OutputStream;\"/>\n\t\t<method name=\"getPort()I\"/>\n\t\t<method name=\"getReceiveBufferSize()I\"/>\n\t\t<method name=\"getRemoteSocketAddress()Ljava/net/SocketAddress;\"/>\n\t\t<method name=\"getReuseAddress()Z\"/>\n\t\t<method name=\"getSendBufferSize()I\"/>\n\t\t<method name=\"getSoLinger()I\"/>\n\t\t<method name=\"getSoTimeout()I\"/>\n\t\t<method name=\"getTcpNoDelay()Z\"/>\n\t\t<method name=\"getTrafficClass()I\"/>\n\t\t<method name=\"isBound()Z\"/>\n\t\t<method name=\"isClosed()Z\"/>\n\t\t<method name=\"isConnected()Z\"/>\n\t\t<method name=\"isInputShutdown()Z\"/>\n\t\t<method name=\"isOutputShutdown()Z\"/>\n\t\t<method name=\"sendUrgentData(I)V\"/>\n\t\t<method name=\"setKeepAlive(Z)V\"/>\n\t\t<method name=\"setOOBInline(Z)V\"/>\n\t\t<method name=\"setPerformancePreferences(III)V\"/>\n\t\t<method name=\"setReceiveBufferSize(I)V\"/>\n\t\t<method name=\"setReuseAddress(Z)V\"/>\n\t\t<method name=\"setSendBufferSize(I)V\"/>\n\t\t<method name=\"setSoLinger(ZI)V\"/>\n\t\t<method name=\"setSoTimeout(I)V\"/>\n\t\t<method name=\"setSocketImplFactory(Ljava/net/SocketImplFactory;)V\"/>\n\t\t<method name=\"setTcpNoDelay(Z)V\"/>\n\t\t<method name=\"setTrafficClass(I)V\"/>\n\t\t<method name=\"shutdownInput()V\"/>\n\t\t<method name=\"shutdownOutput()V\"/>\n\t</class>\n\t<class name=\"java/net/SocketAddress\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/net/SocketException\" since=\"1\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/net/SocketImpl\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/net/SocketOptions\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"accept(Ljava/net/SocketImpl;)V\"/>\n\t\t<method name=\"available()I\"/>\n\t\t<method name=\"bind(Ljava/net/InetAddress;I)V\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"connect(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"connect(Ljava/net/InetAddress;I)V\"/>\n\t\t<method name=\"connect(Ljava/net/SocketAddress;I)V\"/>\n\t\t<method name=\"create(Z)V\"/>\n\t\t<method name=\"getFileDescriptor()Ljava/io/FileDescriptor;\"/>\n\t\t<method name=\"getInetAddress()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getInputStream()Ljava/io/InputStream;\"/>\n\t\t<method name=\"getLocalPort()I\"/>\n\t\t<method name=\"getOutputStream()Ljava/io/OutputStream;\"/>\n\t\t<method name=\"getPort()I\"/>\n\t\t<method name=\"listen(I)V\"/>\n\t\t<method name=\"sendUrgentData(I)V\"/>\n\t\t<method name=\"setPerformancePreferences(III)V\"/>\n\t\t<method name=\"shutdownInput()V\"/>\n\t\t<method name=\"shutdownOutput()V\"/>\n\t\t<method name=\"supportsUrgentData()Z\"/>\n\t\t<field name=\"address\"/>\n\t\t<field name=\"fd\"/>\n\t\t<field name=\"localport\"/>\n\t\t<field name=\"port\"/>\n\t</class>\n\t<class name=\"java/net/SocketImplFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createSocketImpl()Ljava/net/SocketImpl;\"/>\n\t</class>\n\t<class name=\"java/net/SocketOption\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"name()Ljava/lang/String;\"/>\n\t\t<method name=\"type()Ljava/lang/Class;\"/>\n\t</class>\n\t<class name=\"java/net/SocketOptions\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getOption(I)Ljava/lang/Object;\"/>\n\t\t<method name=\"setOption(ILjava/lang/Object;)V\"/>\n\t\t<field name=\"IP_MULTICAST_IF\"/>\n\t\t<field name=\"IP_MULTICAST_IF2\"/>\n\t\t<field name=\"IP_MULTICAST_LOOP\"/>\n\t\t<field name=\"IP_TOS\"/>\n\t\t<field name=\"SO_BINDADDR\"/>\n\t\t<field name=\"SO_BROADCAST\"/>\n\t\t<field name=\"SO_KEEPALIVE\"/>\n\t\t<field name=\"SO_LINGER\"/>\n\t\t<field name=\"SO_OOBINLINE\"/>\n\t\t<field name=\"SO_RCVBUF\"/>\n\t\t<field name=\"SO_REUSEADDR\"/>\n\t\t<field name=\"SO_SNDBUF\"/>\n\t\t<field name=\"SO_TIMEOUT\"/>\n\t\t<field name=\"TCP_NODELAY\"/>\n\t</class>\n\t<class name=\"java/net/SocketPermission\" since=\"1\">\n\t\t<extends name=\"java/security/Permission\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/net/SocketTimeoutException\" since=\"1\">\n\t\t<extends name=\"java/io/InterruptedIOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/net/StandardProtocolFamily\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<implements name=\"java/net/ProtocolFamily\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/net/StandardProtocolFamily;\"/>\n\t\t<method name=\"values()[Ljava/net/StandardProtocolFamily;\"/>\n\t\t<field name=\"INET\"/>\n\t\t<field name=\"INET6\"/>\n\t</class>\n\t<class name=\"java/net/StandardSocketOptions\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"IP_MULTICAST_IF\"/>\n\t\t<field name=\"IP_MULTICAST_LOOP\"/>\n\t\t<field name=\"IP_MULTICAST_TTL\"/>\n\t\t<field name=\"IP_TOS\"/>\n\t\t<field name=\"SO_BROADCAST\"/>\n\t\t<field name=\"SO_KEEPALIVE\"/>\n\t\t<field name=\"SO_LINGER\"/>\n\t\t<field name=\"SO_RCVBUF\"/>\n\t\t<field name=\"SO_REUSEADDR\"/>\n\t\t<field name=\"SO_SNDBUF\"/>\n\t\t<field name=\"TCP_NODELAY\"/>\n\t</class>\n\t<class name=\"java/net/URI\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"compareTo(Ljava/net/URI;)I\"/>\n\t\t<method name=\"create(Ljava/lang/String;)Ljava/net/URI;\"/>\n\t\t<method name=\"getAuthority()Ljava/lang/String;\"/>\n\t\t<method name=\"getFragment()Ljava/lang/String;\"/>\n\t\t<method name=\"getHost()Ljava/lang/String;\"/>\n\t\t<method name=\"getPath()Ljava/lang/String;\"/>\n\t\t<method name=\"getPort()I\"/>\n\t\t<method name=\"getQuery()Ljava/lang/String;\"/>\n\t\t<method name=\"getRawAuthority()Ljava/lang/String;\"/>\n\t\t<method name=\"getRawFragment()Ljava/lang/String;\"/>\n\t\t<method name=\"getRawPath()Ljava/lang/String;\"/>\n\t\t<method name=\"getRawQuery()Ljava/lang/String;\"/>\n\t\t<method name=\"getRawSchemeSpecificPart()Ljava/lang/String;\"/>\n\t\t<method name=\"getRawUserInfo()Ljava/lang/String;\"/>\n\t\t<method name=\"getScheme()Ljava/lang/String;\"/>\n\t\t<method name=\"getSchemeSpecificPart()Ljava/lang/String;\"/>\n\t\t<method name=\"getUserInfo()Ljava/lang/String;\"/>\n\t\t<method name=\"isAbsolute()Z\"/>\n\t\t<method name=\"isOpaque()Z\"/>\n\t\t<method name=\"normalize()Ljava/net/URI;\"/>\n\t\t<method name=\"parseServerAuthority()Ljava/net/URI;\"/>\n\t\t<method name=\"relativize(Ljava/net/URI;)Ljava/net/URI;\"/>\n\t\t<method name=\"resolve(Ljava/lang/String;)Ljava/net/URI;\"/>\n\t\t<method name=\"resolve(Ljava/net/URI;)Ljava/net/URI;\"/>\n\t\t<method name=\"toASCIIString()Ljava/lang/String;\"/>\n\t\t<method name=\"toURL()Ljava/net/URL;\"/>\n\t</class>\n\t<class name=\"java/net/URISyntaxException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"getIndex()I\"/>\n\t\t<method name=\"getInput()Ljava/lang/String;\"/>\n\t\t<method name=\"getReason()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/net/URL\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/net/URLStreamHandler;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/URL;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/URL;Ljava/lang/String;Ljava/net/URLStreamHandler;)V\"/>\n\t\t<method name=\"getAuthority()Ljava/lang/String;\"/>\n\t\t<method name=\"getContent()Ljava/lang/Object;\"/>\n\t\t<method name=\"getContent([Ljava/lang/Class;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getDefaultPort()I\"/>\n\t\t<method name=\"getFile()Ljava/lang/String;\"/>\n\t\t<method name=\"getHost()Ljava/lang/String;\"/>\n\t\t<method name=\"getPath()Ljava/lang/String;\"/>\n\t\t<method name=\"getPort()I\"/>\n\t\t<method name=\"getProtocol()Ljava/lang/String;\"/>\n\t\t<method name=\"getQuery()Ljava/lang/String;\"/>\n\t\t<method name=\"getRef()Ljava/lang/String;\"/>\n\t\t<method name=\"getUserInfo()Ljava/lang/String;\"/>\n\t\t<method name=\"openConnection()Ljava/net/URLConnection;\"/>\n\t\t<method name=\"openConnection(Ljava/net/Proxy;)Ljava/net/URLConnection;\"/>\n\t\t<method name=\"openStream()Ljava/io/InputStream;\"/>\n\t\t<method name=\"sameFile(Ljava/net/URL;)Z\"/>\n\t\t<method name=\"set(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V\" removed=\"26\"/>\n\t\t<method name=\"set(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\" removed=\"26\"/>\n\t\t<method name=\"setURLStreamHandlerFactory(Ljava/net/URLStreamHandlerFactory;)V\"/>\n\t\t<method name=\"toExternalForm()Ljava/lang/String;\"/>\n\t\t<method name=\"toURI()Ljava/net/URI;\"/>\n\t</class>\n\t<class name=\"java/net/URLClassLoader\" since=\"1\">\n\t\t<extends name=\"java/security/SecureClassLoader\"/>\n\t\t<implements name=\"java/io/Closeable\" since=\"24\"/>\n\t\t<method name=\"&lt;init>([Ljava/net/URL;)V\"/>\n\t\t<method name=\"&lt;init>([Ljava/net/URL;Ljava/lang/ClassLoader;)V\"/>\n\t\t<method name=\"&lt;init>([Ljava/net/URL;Ljava/lang/ClassLoader;Ljava/net/URLStreamHandlerFactory;)V\"/>\n\t\t<method name=\"addURL(Ljava/net/URL;)V\"/>\n\t\t<method name=\"definePackage(Ljava/lang/String;Ljava/util/jar/Manifest;Ljava/net/URL;)Ljava/lang/Package;\"/>\n\t\t<method name=\"getURLs()[Ljava/net/URL;\"/>\n\t\t<method name=\"newInstance([Ljava/net/URL;)Ljava/net/URLClassLoader;\"/>\n\t\t<method name=\"newInstance([Ljava/net/URL;Ljava/lang/ClassLoader;)Ljava/net/URLClassLoader;\"/>\n\t</class>\n\t<class name=\"java/net/URLConnection\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/URL;)V\"/>\n\t\t<method name=\"addRequestProperty(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"connect()V\"/>\n\t\t<method name=\"getAllowUserInteraction()Z\"/>\n\t\t<method name=\"getConnectTimeout()I\"/>\n\t\t<method name=\"getContent()Ljava/lang/Object;\"/>\n\t\t<method name=\"getContent([Ljava/lang/Class;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getContentEncoding()Ljava/lang/String;\"/>\n\t\t<method name=\"getContentLength()I\"/>\n\t\t<method name=\"getContentLengthLong()J\" since=\"24\"/>\n\t\t<method name=\"getContentType()Ljava/lang/String;\"/>\n\t\t<method name=\"getDate()J\"/>\n\t\t<method name=\"getDefaultAllowUserInteraction()Z\"/>\n\t\t<method name=\"getDefaultRequestProperty(Ljava/lang/String;)Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"getDefaultUseCaches()Z\"/>\n\t\t<method name=\"getDoInput()Z\"/>\n\t\t<method name=\"getDoOutput()Z\"/>\n\t\t<method name=\"getExpiration()J\"/>\n\t\t<method name=\"getFileNameMap()Ljava/net/FileNameMap;\"/>\n\t\t<method name=\"getHeaderField(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getHeaderField(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getHeaderFieldDate(Ljava/lang/String;J)J\"/>\n\t\t<method name=\"getHeaderFieldInt(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"getHeaderFieldKey(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getHeaderFieldLong(Ljava/lang/String;J)J\" since=\"24\"/>\n\t\t<method name=\"getHeaderFields()Ljava/util/Map;\"/>\n\t\t<method name=\"getIfModifiedSince()J\"/>\n\t\t<method name=\"getInputStream()Ljava/io/InputStream;\"/>\n\t\t<method name=\"getLastModified()J\"/>\n\t\t<method name=\"getOutputStream()Ljava/io/OutputStream;\"/>\n\t\t<method name=\"getPermission()Ljava/security/Permission;\"/>\n\t\t<method name=\"getReadTimeout()I\"/>\n\t\t<method name=\"getRequestProperties()Ljava/util/Map;\"/>\n\t\t<method name=\"getRequestProperty(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getURL()Ljava/net/URL;\"/>\n\t\t<method name=\"getUseCaches()Z\"/>\n\t\t<method name=\"guessContentTypeFromName(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"guessContentTypeFromStream(Ljava/io/InputStream;)Ljava/lang/String;\"/>\n\t\t<method name=\"setAllowUserInteraction(Z)V\"/>\n\t\t<method name=\"setConnectTimeout(I)V\"/>\n\t\t<method name=\"setContentHandlerFactory(Ljava/net/ContentHandlerFactory;)V\"/>\n\t\t<method name=\"setDefaultAllowUserInteraction(Z)V\"/>\n\t\t<method name=\"setDefaultRequestProperty(Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"15\"/>\n\t\t<method name=\"setDefaultUseCaches(Z)V\"/>\n\t\t<method name=\"setDoInput(Z)V\"/>\n\t\t<method name=\"setDoOutput(Z)V\"/>\n\t\t<method name=\"setFileNameMap(Ljava/net/FileNameMap;)V\"/>\n\t\t<method name=\"setIfModifiedSince(J)V\"/>\n\t\t<method name=\"setReadTimeout(I)V\"/>\n\t\t<method name=\"setRequestProperty(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setUseCaches(Z)V\"/>\n\t\t<field name=\"allowUserInteraction\"/>\n\t\t<field name=\"connected\"/>\n\t\t<field name=\"doInput\"/>\n\t\t<field name=\"doOutput\"/>\n\t\t<field name=\"ifModifiedSince\"/>\n\t\t<field name=\"url\"/>\n\t\t<field name=\"useCaches\"/>\n\t</class>\n\t<class name=\"java/net/URLDecoder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"decode(Ljava/lang/String;)Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"decode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/net/URLEncoder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"encode(Ljava/lang/String;)Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/net/URLStreamHandler\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"equals(Ljava/net/URL;Ljava/net/URL;)Z\"/>\n\t\t<method name=\"getDefaultPort()I\"/>\n\t\t<method name=\"getHostAddress(Ljava/net/URL;)Ljava/net/InetAddress;\"/>\n\t\t<method name=\"hashCode(Ljava/net/URL;)I\"/>\n\t\t<method name=\"hostsEqual(Ljava/net/URL;Ljava/net/URL;)Z\"/>\n\t\t<method name=\"openConnection(Ljava/net/URL;)Ljava/net/URLConnection;\"/>\n\t\t<method name=\"openConnection(Ljava/net/URL;Ljava/net/Proxy;)Ljava/net/URLConnection;\"/>\n\t\t<method name=\"parseURL(Ljava/net/URL;Ljava/lang/String;II)V\"/>\n\t\t<method name=\"sameFile(Ljava/net/URL;Ljava/net/URL;)Z\"/>\n\t\t<method name=\"setURL(Ljava/net/URL;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V\" deprecated=\"15\"/>\n\t\t<method name=\"setURL(Ljava/net/URL;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"toExternalForm(Ljava/net/URL;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/net/URLStreamHandlerFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createURLStreamHandler(Ljava/lang/String;)Ljava/net/URLStreamHandler;\"/>\n\t</class>\n\t<class name=\"java/net/UnknownHostException\" since=\"1\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/net/UnknownServiceException\" since=\"1\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/nio/Buffer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"array()Ljava/lang/Object;\" since=\"9\"/>\n\t\t<method name=\"arrayOffset()I\" since=\"9\"/>\n\t\t<method name=\"capacity()I\"/>\n\t\t<method name=\"clear()Ljava/nio/Buffer;\"/>\n\t\t<method name=\"flip()Ljava/nio/Buffer;\"/>\n\t\t<method name=\"hasArray()Z\" since=\"9\"/>\n\t\t<method name=\"hasRemaining()Z\"/>\n\t\t<method name=\"isDirect()Z\" since=\"9\"/>\n\t\t<method name=\"isReadOnly()Z\"/>\n\t\t<method name=\"limit()I\"/>\n\t\t<method name=\"limit(I)Ljava/nio/Buffer;\"/>\n\t\t<method name=\"mark()Ljava/nio/Buffer;\"/>\n\t\t<method name=\"position()I\"/>\n\t\t<method name=\"position(I)Ljava/nio/Buffer;\"/>\n\t\t<method name=\"remaining()I\"/>\n\t\t<method name=\"reset()Ljava/nio/Buffer;\"/>\n\t\t<method name=\"rewind()Ljava/nio/Buffer;\"/>\n\t</class>\n\t<class name=\"java/nio/BufferOverflowException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/BufferUnderflowException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/ByteBuffer\" since=\"1\">\n\t\t<extends name=\"java/nio/Buffer\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"allocate(I)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"allocateDirect(I)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"array()[B\"/>\n\t\t<method name=\"arrayOffset()I\"/>\n\t\t<method name=\"asCharBuffer()Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"asDoubleBuffer()Ljava/nio/DoubleBuffer;\"/>\n\t\t<method name=\"asFloatBuffer()Ljava/nio/FloatBuffer;\"/>\n\t\t<method name=\"asIntBuffer()Ljava/nio/IntBuffer;\"/>\n\t\t<method name=\"asLongBuffer()Ljava/nio/LongBuffer;\"/>\n\t\t<method name=\"asReadOnlyBuffer()Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"asShortBuffer()Ljava/nio/ShortBuffer;\"/>\n\t\t<method name=\"compact()Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"compareTo(Ljava/nio/ByteBuffer;)I\"/>\n\t\t<method name=\"duplicate()Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"get()B\"/>\n\t\t<method name=\"get(I)B\"/>\n\t\t<method name=\"get([B)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"get([BII)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"getChar()C\"/>\n\t\t<method name=\"getChar(I)C\"/>\n\t\t<method name=\"getDouble()D\"/>\n\t\t<method name=\"getDouble(I)D\"/>\n\t\t<method name=\"getFloat()F\"/>\n\t\t<method name=\"getFloat(I)F\"/>\n\t\t<method name=\"getInt()I\"/>\n\t\t<method name=\"getInt(I)I\"/>\n\t\t<method name=\"getLong()J\"/>\n\t\t<method name=\"getLong(I)J\"/>\n\t\t<method name=\"getShort()S\"/>\n\t\t<method name=\"getShort(I)S\"/>\n\t\t<method name=\"hasArray()Z\"/>\n\t\t<method name=\"isDirect()Z\"/>\n\t\t<method name=\"order()Ljava/nio/ByteOrder;\"/>\n\t\t<method name=\"order(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"put(B)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"put(IB)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"put(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"put([B)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"put([BII)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"putChar(C)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"putChar(IC)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"putDouble(D)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"putDouble(ID)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"putFloat(F)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"putFloat(IF)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"putInt(I)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"putInt(II)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"putLong(IJ)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"putLong(J)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"putShort(IS)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"putShort(S)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"slice()Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"wrap([B)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"wrap([BII)Ljava/nio/ByteBuffer;\"/>\n\t</class>\n\t<class name=\"java/nio/ByteOrder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"nativeOrder()Ljava/nio/ByteOrder;\"/>\n\t\t<field name=\"BIG_ENDIAN\"/>\n\t\t<field name=\"LITTLE_ENDIAN\"/>\n\t</class>\n\t<class name=\"java/nio/CharBuffer\" since=\"1\">\n\t\t<extends name=\"java/nio/Buffer\"/>\n\t\t<implements name=\"java/lang/Appendable\"/>\n\t\t<implements name=\"java/lang/CharSequence\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<implements name=\"java/lang/Readable\"/>\n\t\t<method name=\"allocate(I)Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"append(C)Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;)Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"append(Ljava/lang/CharSequence;II)Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"array()[C\"/>\n\t\t<method name=\"arrayOffset()I\"/>\n\t\t<method name=\"asReadOnlyBuffer()Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"compact()Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"compareTo(Ljava/nio/CharBuffer;)I\"/>\n\t\t<method name=\"duplicate()Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"get()C\"/>\n\t\t<method name=\"get(I)C\"/>\n\t\t<method name=\"get([C)Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"get([CII)Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"hasArray()Z\"/>\n\t\t<method name=\"isDirect()Z\"/>\n\t\t<method name=\"order()Ljava/nio/ByteOrder;\"/>\n\t\t<method name=\"put(C)Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"put(IC)Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"put(Ljava/lang/String;)Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"put(Ljava/lang/String;II)Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"put(Ljava/nio/CharBuffer;)Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"put([C)Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"put([CII)Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"slice()Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"subSequence(II)Ljava/nio/CharBuffer;\" since=\"19\"/>\n\t\t<method name=\"wrap(Ljava/lang/CharSequence;)Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"wrap(Ljava/lang/CharSequence;II)Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"wrap([C)Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"wrap([CII)Ljava/nio/CharBuffer;\"/>\n\t</class>\n\t<class name=\"java/nio/DoubleBuffer\" since=\"1\">\n\t\t<extends name=\"java/nio/Buffer\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"allocate(I)Ljava/nio/DoubleBuffer;\"/>\n\t\t<method name=\"array()[D\"/>\n\t\t<method name=\"arrayOffset()I\"/>\n\t\t<method name=\"asReadOnlyBuffer()Ljava/nio/DoubleBuffer;\"/>\n\t\t<method name=\"compact()Ljava/nio/DoubleBuffer;\"/>\n\t\t<method name=\"compareTo(Ljava/nio/DoubleBuffer;)I\"/>\n\t\t<method name=\"duplicate()Ljava/nio/DoubleBuffer;\"/>\n\t\t<method name=\"get()D\"/>\n\t\t<method name=\"get(I)D\"/>\n\t\t<method name=\"get([D)Ljava/nio/DoubleBuffer;\"/>\n\t\t<method name=\"get([DII)Ljava/nio/DoubleBuffer;\"/>\n\t\t<method name=\"hasArray()Z\"/>\n\t\t<method name=\"isDirect()Z\"/>\n\t\t<method name=\"order()Ljava/nio/ByteOrder;\"/>\n\t\t<method name=\"put(D)Ljava/nio/DoubleBuffer;\"/>\n\t\t<method name=\"put(ID)Ljava/nio/DoubleBuffer;\"/>\n\t\t<method name=\"put(Ljava/nio/DoubleBuffer;)Ljava/nio/DoubleBuffer;\"/>\n\t\t<method name=\"put([D)Ljava/nio/DoubleBuffer;\"/>\n\t\t<method name=\"put([DII)Ljava/nio/DoubleBuffer;\"/>\n\t\t<method name=\"slice()Ljava/nio/DoubleBuffer;\"/>\n\t\t<method name=\"wrap([D)Ljava/nio/DoubleBuffer;\"/>\n\t\t<method name=\"wrap([DII)Ljava/nio/DoubleBuffer;\"/>\n\t</class>\n\t<class name=\"java/nio/FloatBuffer\" since=\"1\">\n\t\t<extends name=\"java/nio/Buffer\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"allocate(I)Ljava/nio/FloatBuffer;\"/>\n\t\t<method name=\"array()[F\"/>\n\t\t<method name=\"arrayOffset()I\"/>\n\t\t<method name=\"asReadOnlyBuffer()Ljava/nio/FloatBuffer;\"/>\n\t\t<method name=\"compact()Ljava/nio/FloatBuffer;\"/>\n\t\t<method name=\"compareTo(Ljava/nio/FloatBuffer;)I\"/>\n\t\t<method name=\"duplicate()Ljava/nio/FloatBuffer;\"/>\n\t\t<method name=\"get()F\"/>\n\t\t<method name=\"get(I)F\"/>\n\t\t<method name=\"get([F)Ljava/nio/FloatBuffer;\"/>\n\t\t<method name=\"get([FII)Ljava/nio/FloatBuffer;\"/>\n\t\t<method name=\"hasArray()Z\"/>\n\t\t<method name=\"isDirect()Z\"/>\n\t\t<method name=\"order()Ljava/nio/ByteOrder;\"/>\n\t\t<method name=\"put(F)Ljava/nio/FloatBuffer;\"/>\n\t\t<method name=\"put(IF)Ljava/nio/FloatBuffer;\"/>\n\t\t<method name=\"put(Ljava/nio/FloatBuffer;)Ljava/nio/FloatBuffer;\"/>\n\t\t<method name=\"put([F)Ljava/nio/FloatBuffer;\"/>\n\t\t<method name=\"put([FII)Ljava/nio/FloatBuffer;\"/>\n\t\t<method name=\"slice()Ljava/nio/FloatBuffer;\"/>\n\t\t<method name=\"wrap([F)Ljava/nio/FloatBuffer;\"/>\n\t\t<method name=\"wrap([FII)Ljava/nio/FloatBuffer;\"/>\n\t</class>\n\t<class name=\"java/nio/IntBuffer\" since=\"1\">\n\t\t<extends name=\"java/nio/Buffer\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"allocate(I)Ljava/nio/IntBuffer;\"/>\n\t\t<method name=\"array()[I\"/>\n\t\t<method name=\"arrayOffset()I\"/>\n\t\t<method name=\"asReadOnlyBuffer()Ljava/nio/IntBuffer;\"/>\n\t\t<method name=\"compact()Ljava/nio/IntBuffer;\"/>\n\t\t<method name=\"compareTo(Ljava/nio/IntBuffer;)I\"/>\n\t\t<method name=\"duplicate()Ljava/nio/IntBuffer;\"/>\n\t\t<method name=\"get()I\"/>\n\t\t<method name=\"get(I)I\"/>\n\t\t<method name=\"get([I)Ljava/nio/IntBuffer;\"/>\n\t\t<method name=\"get([III)Ljava/nio/IntBuffer;\"/>\n\t\t<method name=\"hasArray()Z\"/>\n\t\t<method name=\"isDirect()Z\"/>\n\t\t<method name=\"order()Ljava/nio/ByteOrder;\"/>\n\t\t<method name=\"put(I)Ljava/nio/IntBuffer;\"/>\n\t\t<method name=\"put(II)Ljava/nio/IntBuffer;\"/>\n\t\t<method name=\"put(Ljava/nio/IntBuffer;)Ljava/nio/IntBuffer;\"/>\n\t\t<method name=\"put([I)Ljava/nio/IntBuffer;\"/>\n\t\t<method name=\"put([III)Ljava/nio/IntBuffer;\"/>\n\t\t<method name=\"slice()Ljava/nio/IntBuffer;\"/>\n\t\t<method name=\"wrap([I)Ljava/nio/IntBuffer;\"/>\n\t\t<method name=\"wrap([III)Ljava/nio/IntBuffer;\"/>\n\t</class>\n\t<class name=\"java/nio/InvalidMarkException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/LongBuffer\" since=\"1\">\n\t\t<extends name=\"java/nio/Buffer\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"allocate(I)Ljava/nio/LongBuffer;\"/>\n\t\t<method name=\"array()[J\"/>\n\t\t<method name=\"arrayOffset()I\"/>\n\t\t<method name=\"asReadOnlyBuffer()Ljava/nio/LongBuffer;\"/>\n\t\t<method name=\"compact()Ljava/nio/LongBuffer;\"/>\n\t\t<method name=\"compareTo(Ljava/nio/LongBuffer;)I\"/>\n\t\t<method name=\"duplicate()Ljava/nio/LongBuffer;\"/>\n\t\t<method name=\"get()J\"/>\n\t\t<method name=\"get(I)J\"/>\n\t\t<method name=\"get([J)Ljava/nio/LongBuffer;\"/>\n\t\t<method name=\"get([JII)Ljava/nio/LongBuffer;\"/>\n\t\t<method name=\"hasArray()Z\"/>\n\t\t<method name=\"isDirect()Z\"/>\n\t\t<method name=\"order()Ljava/nio/ByteOrder;\"/>\n\t\t<method name=\"put(IJ)Ljava/nio/LongBuffer;\"/>\n\t\t<method name=\"put(J)Ljava/nio/LongBuffer;\"/>\n\t\t<method name=\"put(Ljava/nio/LongBuffer;)Ljava/nio/LongBuffer;\"/>\n\t\t<method name=\"put([J)Ljava/nio/LongBuffer;\"/>\n\t\t<method name=\"put([JII)Ljava/nio/LongBuffer;\"/>\n\t\t<method name=\"slice()Ljava/nio/LongBuffer;\"/>\n\t\t<method name=\"wrap([J)Ljava/nio/LongBuffer;\"/>\n\t\t<method name=\"wrap([JII)Ljava/nio/LongBuffer;\"/>\n\t</class>\n\t<class name=\"java/nio/MappedByteBuffer\" since=\"1\">\n\t\t<extends name=\"java/nio/ByteBuffer\"/>\n\t\t<method name=\"force()Ljava/nio/MappedByteBuffer;\"/>\n\t\t<method name=\"isLoaded()Z\"/>\n\t\t<method name=\"load()Ljava/nio/MappedByteBuffer;\"/>\n\t</class>\n\t<class name=\"java/nio/ReadOnlyBufferException\" since=\"1\">\n\t\t<extends name=\"java/lang/UnsupportedOperationException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/ShortBuffer\" since=\"1\">\n\t\t<extends name=\"java/nio/Buffer\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"allocate(I)Ljava/nio/ShortBuffer;\"/>\n\t\t<method name=\"array()[S\"/>\n\t\t<method name=\"arrayOffset()I\"/>\n\t\t<method name=\"asReadOnlyBuffer()Ljava/nio/ShortBuffer;\"/>\n\t\t<method name=\"compact()Ljava/nio/ShortBuffer;\"/>\n\t\t<method name=\"compareTo(Ljava/nio/ShortBuffer;)I\"/>\n\t\t<method name=\"duplicate()Ljava/nio/ShortBuffer;\"/>\n\t\t<method name=\"get()S\"/>\n\t\t<method name=\"get(I)S\"/>\n\t\t<method name=\"get([S)Ljava/nio/ShortBuffer;\"/>\n\t\t<method name=\"get([SII)Ljava/nio/ShortBuffer;\"/>\n\t\t<method name=\"hasArray()Z\"/>\n\t\t<method name=\"isDirect()Z\"/>\n\t\t<method name=\"order()Ljava/nio/ByteOrder;\"/>\n\t\t<method name=\"put(IS)Ljava/nio/ShortBuffer;\"/>\n\t\t<method name=\"put(Ljava/nio/ShortBuffer;)Ljava/nio/ShortBuffer;\"/>\n\t\t<method name=\"put(S)Ljava/nio/ShortBuffer;\"/>\n\t\t<method name=\"put([S)Ljava/nio/ShortBuffer;\"/>\n\t\t<method name=\"put([SII)Ljava/nio/ShortBuffer;\"/>\n\t\t<method name=\"slice()Ljava/nio/ShortBuffer;\"/>\n\t\t<method name=\"wrap([S)Ljava/nio/ShortBuffer;\"/>\n\t\t<method name=\"wrap([SII)Ljava/nio/ShortBuffer;\"/>\n\t</class>\n\t<class name=\"java/nio/channels/AcceptPendingException\" since=\"26\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/AlreadyBoundException\" since=\"24\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/AlreadyConnectedException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/AsynchronousByteChannel\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/channels/AsynchronousChannel\"/>\n\t\t<method name=\"read(Ljava/nio/ByteBuffer;)Ljava/util/concurrent/Future;\"/>\n\t\t<method name=\"read(Ljava/nio/ByteBuffer;Ljava/lang/Object;Ljava/nio/channels/CompletionHandler;)V\"/>\n\t\t<method name=\"write(Ljava/nio/ByteBuffer;)Ljava/util/concurrent/Future;\"/>\n\t\t<method name=\"write(Ljava/nio/ByteBuffer;Ljava/lang/Object;Ljava/nio/channels/CompletionHandler;)V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/AsynchronousChannel\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/channels/Channel\"/>\n\t</class>\n\t<class name=\"java/nio/channels/AsynchronousChannelGroup\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/nio/channels/spi/AsynchronousChannelProvider;)V\"/>\n\t\t<method name=\"awaitTermination(JLjava/util/concurrent/TimeUnit;)Z\"/>\n\t\t<method name=\"isShutdown()Z\"/>\n\t\t<method name=\"isTerminated()Z\"/>\n\t\t<method name=\"provider()Ljava/nio/channels/spi/AsynchronousChannelProvider;\"/>\n\t\t<method name=\"shutdown()V\"/>\n\t\t<method name=\"shutdownNow()V\"/>\n\t\t<method name=\"withCachedThreadPool(Ljava/util/concurrent/ExecutorService;I)Ljava/nio/channels/AsynchronousChannelGroup;\"/>\n\t\t<method name=\"withFixedThreadPool(ILjava/util/concurrent/ThreadFactory;)Ljava/nio/channels/AsynchronousChannelGroup;\"/>\n\t\t<method name=\"withThreadPool(Ljava/util/concurrent/ExecutorService;)Ljava/nio/channels/AsynchronousChannelGroup;\"/>\n\t</class>\n\t<class name=\"java/nio/channels/AsynchronousCloseException\" since=\"1\">\n\t\t<extends name=\"java/nio/channels/ClosedChannelException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/AsynchronousFileChannel\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/channels/AsynchronousChannel\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"force(Z)V\"/>\n\t\t<method name=\"lock()Ljava/util/concurrent/Future;\"/>\n\t\t<method name=\"lock(JJZ)Ljava/util/concurrent/Future;\"/>\n\t\t<method name=\"lock(JJZLjava/lang/Object;Ljava/nio/channels/CompletionHandler;)V\"/>\n\t\t<method name=\"lock(Ljava/lang/Object;Ljava/nio/channels/CompletionHandler;)V\"/>\n\t\t<method name=\"open(Ljava/nio/file/Path;Ljava/util/Set;Ljava/util/concurrent/ExecutorService;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/AsynchronousFileChannel;\"/>\n\t\t<method name=\"open(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/nio/channels/AsynchronousFileChannel;\"/>\n\t\t<method name=\"read(Ljava/nio/ByteBuffer;J)Ljava/util/concurrent/Future;\"/>\n\t\t<method name=\"read(Ljava/nio/ByteBuffer;JLjava/lang/Object;Ljava/nio/channels/CompletionHandler;)V\"/>\n\t\t<method name=\"size()J\"/>\n\t\t<method name=\"truncate(J)Ljava/nio/channels/AsynchronousFileChannel;\"/>\n\t\t<method name=\"tryLock()Ljava/nio/channels/FileLock;\"/>\n\t\t<method name=\"tryLock(JJZ)Ljava/nio/channels/FileLock;\"/>\n\t\t<method name=\"write(Ljava/nio/ByteBuffer;J)Ljava/util/concurrent/Future;\"/>\n\t\t<method name=\"write(Ljava/nio/ByteBuffer;JLjava/lang/Object;Ljava/nio/channels/CompletionHandler;)V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/AsynchronousServerSocketChannel\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/channels/AsynchronousChannel\"/>\n\t\t<implements name=\"java/nio/channels/NetworkChannel\"/>\n\t\t<method name=\"&lt;init>(Ljava/nio/channels/spi/AsynchronousChannelProvider;)V\"/>\n\t\t<method name=\"accept()Ljava/util/concurrent/Future;\"/>\n\t\t<method name=\"accept(Ljava/lang/Object;Ljava/nio/channels/CompletionHandler;)V\"/>\n\t\t<method name=\"bind(Ljava/net/SocketAddress;)Ljava/nio/channels/AsynchronousServerSocketChannel;\"/>\n\t\t<method name=\"bind(Ljava/net/SocketAddress;I)Ljava/nio/channels/AsynchronousServerSocketChannel;\"/>\n\t\t<method name=\"open()Ljava/nio/channels/AsynchronousServerSocketChannel;\"/>\n\t\t<method name=\"open(Ljava/nio/channels/AsynchronousChannelGroup;)Ljava/nio/channels/AsynchronousServerSocketChannel;\"/>\n\t\t<method name=\"provider()Ljava/nio/channels/spi/AsynchronousChannelProvider;\"/>\n\t\t<method name=\"setOption(Ljava/net/SocketOption;Ljava/lang/Object;)Ljava/nio/channels/AsynchronousServerSocketChannel;\"/>\n\t</class>\n\t<class name=\"java/nio/channels/AsynchronousSocketChannel\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/channels/AsynchronousByteChannel\"/>\n\t\t<implements name=\"java/nio/channels/NetworkChannel\"/>\n\t\t<method name=\"&lt;init>(Ljava/nio/channels/spi/AsynchronousChannelProvider;)V\"/>\n\t\t<method name=\"bind(Ljava/net/SocketAddress;)Ljava/nio/channels/AsynchronousSocketChannel;\"/>\n\t\t<method name=\"connect(Ljava/net/SocketAddress;)Ljava/util/concurrent/Future;\"/>\n\t\t<method name=\"connect(Ljava/net/SocketAddress;Ljava/lang/Object;Ljava/nio/channels/CompletionHandler;)V\"/>\n\t\t<method name=\"getRemoteAddress()Ljava/net/SocketAddress;\"/>\n\t\t<method name=\"open()Ljava/nio/channels/AsynchronousSocketChannel;\"/>\n\t\t<method name=\"open(Ljava/nio/channels/AsynchronousChannelGroup;)Ljava/nio/channels/AsynchronousSocketChannel;\"/>\n\t\t<method name=\"provider()Ljava/nio/channels/spi/AsynchronousChannelProvider;\"/>\n\t\t<method name=\"read(Ljava/nio/ByteBuffer;JLjava/util/concurrent/TimeUnit;Ljava/lang/Object;Ljava/nio/channels/CompletionHandler;)V\"/>\n\t\t<method name=\"read([Ljava/nio/ByteBuffer;IIJLjava/util/concurrent/TimeUnit;Ljava/lang/Object;Ljava/nio/channels/CompletionHandler;)V\"/>\n\t\t<method name=\"setOption(Ljava/net/SocketOption;Ljava/lang/Object;)Ljava/nio/channels/AsynchronousSocketChannel;\"/>\n\t\t<method name=\"shutdownInput()Ljava/nio/channels/AsynchronousSocketChannel;\"/>\n\t\t<method name=\"shutdownOutput()Ljava/nio/channels/AsynchronousSocketChannel;\"/>\n\t\t<method name=\"write(Ljava/nio/ByteBuffer;JLjava/util/concurrent/TimeUnit;Ljava/lang/Object;Ljava/nio/channels/CompletionHandler;)V\"/>\n\t\t<method name=\"write([Ljava/nio/ByteBuffer;IIJLjava/util/concurrent/TimeUnit;Ljava/lang/Object;Ljava/nio/channels/CompletionHandler;)V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/ByteChannel\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/channels/ReadableByteChannel\"/>\n\t\t<implements name=\"java/nio/channels/WritableByteChannel\"/>\n\t</class>\n\t<class name=\"java/nio/channels/CancelledKeyException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/Channel\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<method name=\"isOpen()Z\"/>\n\t</class>\n\t<class name=\"java/nio/channels/Channels\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"newChannel(Ljava/io/InputStream;)Ljava/nio/channels/ReadableByteChannel;\"/>\n\t\t<method name=\"newChannel(Ljava/io/OutputStream;)Ljava/nio/channels/WritableByteChannel;\"/>\n\t\t<method name=\"newInputStream(Ljava/nio/channels/AsynchronousByteChannel;)Ljava/io/InputStream;\" since=\"26\"/>\n\t\t<method name=\"newInputStream(Ljava/nio/channels/ReadableByteChannel;)Ljava/io/InputStream;\"/>\n\t\t<method name=\"newOutputStream(Ljava/nio/channels/AsynchronousByteChannel;)Ljava/io/OutputStream;\" since=\"26\"/>\n\t\t<method name=\"newOutputStream(Ljava/nio/channels/WritableByteChannel;)Ljava/io/OutputStream;\"/>\n\t\t<method name=\"newReader(Ljava/nio/channels/ReadableByteChannel;Ljava/lang/String;)Ljava/io/Reader;\"/>\n\t\t<method name=\"newReader(Ljava/nio/channels/ReadableByteChannel;Ljava/nio/charset/CharsetDecoder;I)Ljava/io/Reader;\"/>\n\t\t<method name=\"newWriter(Ljava/nio/channels/WritableByteChannel;Ljava/lang/String;)Ljava/io/Writer;\"/>\n\t\t<method name=\"newWriter(Ljava/nio/channels/WritableByteChannel;Ljava/nio/charset/CharsetEncoder;I)Ljava/io/Writer;\"/>\n\t</class>\n\t<class name=\"java/nio/channels/ClosedByInterruptException\" since=\"1\">\n\t\t<extends name=\"java/nio/channels/AsynchronousCloseException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/ClosedChannelException\" since=\"1\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/ClosedSelectorException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/CompletionHandler\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"completed(Ljava/lang/Object;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"failed(Ljava/lang/Throwable;Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/ConnectionPendingException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/DatagramChannel\" since=\"1\">\n\t\t<extends name=\"java/nio/channels/spi/AbstractSelectableChannel\"/>\n\t\t<implements name=\"java/nio/channels/ByteChannel\"/>\n\t\t<implements name=\"java/nio/channels/GatheringByteChannel\"/>\n\t\t<implements name=\"java/nio/channels/MulticastChannel\" since=\"26\"/>\n\t\t<implements name=\"java/nio/channels/NetworkChannel\" since=\"24\" removed=\"26\"/>\n\t\t<implements name=\"java/nio/channels/ScatteringByteChannel\"/>\n\t\t<method name=\"&lt;init>(Ljava/nio/channels/spi/SelectorProvider;)V\"/>\n\t\t<method name=\"bind(Ljava/net/SocketAddress;)Ljava/nio/channels/DatagramChannel;\" since=\"24\"/>\n\t\t<method name=\"connect(Ljava/net/SocketAddress;)Ljava/nio/channels/DatagramChannel;\"/>\n\t\t<method name=\"disconnect()Ljava/nio/channels/DatagramChannel;\"/>\n\t\t<method name=\"getRemoteAddress()Ljava/net/SocketAddress;\" since=\"24\"/>\n\t\t<method name=\"isConnected()Z\"/>\n\t\t<method name=\"open()Ljava/nio/channels/DatagramChannel;\"/>\n\t\t<method name=\"open(Ljava/net/ProtocolFamily;)Ljava/nio/channels/DatagramChannel;\" since=\"24\"/>\n\t\t<method name=\"receive(Ljava/nio/ByteBuffer;)Ljava/net/SocketAddress;\"/>\n\t\t<method name=\"send(Ljava/nio/ByteBuffer;Ljava/net/SocketAddress;)I\"/>\n\t\t<method name=\"setOption(Ljava/net/SocketOption;Ljava/lang/Object;)Ljava/nio/channels/DatagramChannel;\" since=\"24\"/>\n\t\t<method name=\"socket()Ljava/net/DatagramSocket;\"/>\n\t</class>\n\t<class name=\"java/nio/channels/FileChannel\" since=\"1\">\n\t\t<extends name=\"java/nio/channels/spi/AbstractInterruptibleChannel\"/>\n\t\t<implements name=\"java/nio/channels/ByteChannel\" removed=\"24\"/>\n\t\t<implements name=\"java/nio/channels/GatheringByteChannel\"/>\n\t\t<implements name=\"java/nio/channels/ScatteringByteChannel\"/>\n\t\t<implements name=\"java/nio/channels/SeekableByteChannel\" since=\"24\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"force(Z)V\"/>\n\t\t<method name=\"lock()Ljava/nio/channels/FileLock;\"/>\n\t\t<method name=\"lock(JJZ)Ljava/nio/channels/FileLock;\"/>\n\t\t<method name=\"map(Ljava/nio/channels/FileChannel$MapMode;JJ)Ljava/nio/MappedByteBuffer;\"/>\n\t\t<method name=\"open(Ljava/nio/file/Path;Ljava/util/Set;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/FileChannel;\" since=\"26\"/>\n\t\t<method name=\"open(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/nio/channels/FileChannel;\" since=\"26\"/>\n\t\t<method name=\"position()J\"/>\n\t\t<method name=\"position(J)Ljava/nio/channels/FileChannel;\"/>\n\t\t<method name=\"read(Ljava/nio/ByteBuffer;J)I\"/>\n\t\t<method name=\"size()J\"/>\n\t\t<method name=\"transferFrom(Ljava/nio/channels/ReadableByteChannel;JJ)J\"/>\n\t\t<method name=\"transferTo(JJLjava/nio/channels/WritableByteChannel;)J\"/>\n\t\t<method name=\"truncate(J)Ljava/nio/channels/FileChannel;\"/>\n\t\t<method name=\"tryLock()Ljava/nio/channels/FileLock;\"/>\n\t\t<method name=\"tryLock(JJZ)Ljava/nio/channels/FileLock;\"/>\n\t\t<method name=\"write(Ljava/nio/ByteBuffer;J)I\"/>\n\t</class>\n\t<class name=\"java/nio/channels/FileChannel$MapMode\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"PRIVATE\"/>\n\t\t<field name=\"READ_ONLY\"/>\n\t\t<field name=\"READ_WRITE\"/>\n\t</class>\n\t<class name=\"java/nio/channels/FileLock\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\" since=\"19\"/>\n\t\t<method name=\"&lt;init>(Ljava/nio/channels/AsynchronousFileChannel;JJZ)V\" since=\"26\"/>\n\t\t<method name=\"&lt;init>(Ljava/nio/channels/FileChannel;JJZ)V\"/>\n\t\t<method name=\"acquiredBy()Ljava/nio/channels/Channel;\" since=\"24\"/>\n\t\t<method name=\"channel()Ljava/nio/channels/FileChannel;\"/>\n\t\t<method name=\"isShared()Z\"/>\n\t\t<method name=\"isValid()Z\"/>\n\t\t<method name=\"overlaps(JJ)Z\"/>\n\t\t<method name=\"position()J\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"size()J\"/>\n\t</class>\n\t<class name=\"java/nio/channels/FileLockInterruptionException\" since=\"1\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/GatheringByteChannel\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/channels/WritableByteChannel\"/>\n\t\t<method name=\"write([Ljava/nio/ByteBuffer;)J\"/>\n\t\t<method name=\"write([Ljava/nio/ByteBuffer;II)J\"/>\n\t</class>\n\t<class name=\"java/nio/channels/IllegalBlockingModeException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/IllegalChannelGroupException\" since=\"26\">\n\t\t<extends name=\"java/lang/IllegalArgumentException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/IllegalSelectorException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalArgumentException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/InterruptedByTimeoutException\" since=\"26\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/InterruptibleChannel\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/channels/Channel\"/>\n\t</class>\n\t<class name=\"java/nio/channels/MembershipKey\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"block(Ljava/net/InetAddress;)Ljava/nio/channels/MembershipKey;\"/>\n\t\t<method name=\"channel()Ljava/nio/channels/MulticastChannel;\"/>\n\t\t<method name=\"drop()V\"/>\n\t\t<method name=\"group()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"isValid()Z\"/>\n\t\t<method name=\"networkInterface()Ljava/net/NetworkInterface;\"/>\n\t\t<method name=\"sourceAddress()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"unblock(Ljava/net/InetAddress;)Ljava/nio/channels/MembershipKey;\"/>\n\t</class>\n\t<class name=\"java/nio/channels/MulticastChannel\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/channels/NetworkChannel\"/>\n\t\t<method name=\"join(Ljava/net/InetAddress;Ljava/net/NetworkInterface;)Ljava/nio/channels/MembershipKey;\"/>\n\t\t<method name=\"join(Ljava/net/InetAddress;Ljava/net/NetworkInterface;Ljava/net/InetAddress;)Ljava/nio/channels/MembershipKey;\"/>\n\t</class>\n\t<class name=\"java/nio/channels/NetworkChannel\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/channels/Channel\"/>\n\t\t<method name=\"bind(Ljava/net/SocketAddress;)Ljava/nio/channels/NetworkChannel;\"/>\n\t\t<method name=\"getLocalAddress()Ljava/net/SocketAddress;\"/>\n\t\t<method name=\"getOption(Ljava/net/SocketOption;)Ljava/lang/Object;\"/>\n\t\t<method name=\"setOption(Ljava/net/SocketOption;Ljava/lang/Object;)Ljava/nio/channels/NetworkChannel;\"/>\n\t\t<method name=\"supportedOptions()Ljava/util/Set;\"/>\n\t</class>\n\t<class name=\"java/nio/channels/NoConnectionPendingException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/NonReadableChannelException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/NonWritableChannelException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/NotYetBoundException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/NotYetConnectedException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/OverlappingFileLockException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/Pipe\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"open()Ljava/nio/channels/Pipe;\"/>\n\t\t<method name=\"sink()Ljava/nio/channels/Pipe$SinkChannel;\"/>\n\t\t<method name=\"source()Ljava/nio/channels/Pipe$SourceChannel;\"/>\n\t</class>\n\t<class name=\"java/nio/channels/Pipe$SinkChannel\" since=\"1\">\n\t\t<extends name=\"java/nio/channels/spi/AbstractSelectableChannel\"/>\n\t\t<implements name=\"java/nio/channels/GatheringByteChannel\"/>\n\t\t<implements name=\"java/nio/channels/WritableByteChannel\"/>\n\t\t<method name=\"&lt;init>(Ljava/nio/channels/spi/SelectorProvider;)V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/Pipe$SourceChannel\" since=\"1\">\n\t\t<extends name=\"java/nio/channels/spi/AbstractSelectableChannel\"/>\n\t\t<implements name=\"java/nio/channels/ReadableByteChannel\"/>\n\t\t<implements name=\"java/nio/channels/ScatteringByteChannel\"/>\n\t\t<method name=\"&lt;init>(Ljava/nio/channels/spi/SelectorProvider;)V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/ReadPendingException\" since=\"26\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/ReadableByteChannel\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/channels/Channel\"/>\n\t\t<method name=\"read(Ljava/nio/ByteBuffer;)I\"/>\n\t</class>\n\t<class name=\"java/nio/channels/ScatteringByteChannel\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/channels/ReadableByteChannel\"/>\n\t\t<method name=\"read([Ljava/nio/ByteBuffer;)J\"/>\n\t\t<method name=\"read([Ljava/nio/ByteBuffer;II)J\"/>\n\t</class>\n\t<class name=\"java/nio/channels/SeekableByteChannel\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/channels/ByteChannel\"/>\n\t\t<method name=\"position()J\"/>\n\t\t<method name=\"position(J)Ljava/nio/channels/SeekableByteChannel;\"/>\n\t\t<method name=\"size()J\"/>\n\t\t<method name=\"truncate(J)Ljava/nio/channels/SeekableByteChannel;\"/>\n\t</class>\n\t<class name=\"java/nio/channels/SelectableChannel\" since=\"1\">\n\t\t<extends name=\"java/nio/channels/spi/AbstractInterruptibleChannel\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"blockingLock()Ljava/lang/Object;\"/>\n\t\t<method name=\"configureBlocking(Z)Ljava/nio/channels/SelectableChannel;\"/>\n\t\t<method name=\"isBlocking()Z\"/>\n\t\t<method name=\"isRegistered()Z\"/>\n\t\t<method name=\"keyFor(Ljava/nio/channels/Selector;)Ljava/nio/channels/SelectionKey;\"/>\n\t\t<method name=\"provider()Ljava/nio/channels/spi/SelectorProvider;\"/>\n\t\t<method name=\"register(Ljava/nio/channels/Selector;I)Ljava/nio/channels/SelectionKey;\"/>\n\t\t<method name=\"register(Ljava/nio/channels/Selector;ILjava/lang/Object;)Ljava/nio/channels/SelectionKey;\"/>\n\t\t<method name=\"validOps()I\"/>\n\t</class>\n\t<class name=\"java/nio/channels/SelectionKey\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"attach(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"attachment()Ljava/lang/Object;\"/>\n\t\t<method name=\"cancel()V\"/>\n\t\t<method name=\"channel()Ljava/nio/channels/SelectableChannel;\"/>\n\t\t<method name=\"interestOps()I\"/>\n\t\t<method name=\"interestOps(I)Ljava/nio/channels/SelectionKey;\"/>\n\t\t<method name=\"isAcceptable()Z\"/>\n\t\t<method name=\"isConnectable()Z\"/>\n\t\t<method name=\"isReadable()Z\"/>\n\t\t<method name=\"isValid()Z\"/>\n\t\t<method name=\"isWritable()Z\"/>\n\t\t<method name=\"readyOps()I\"/>\n\t\t<method name=\"selector()Ljava/nio/channels/Selector;\"/>\n\t\t<field name=\"OP_ACCEPT\"/>\n\t\t<field name=\"OP_CONNECT\"/>\n\t\t<field name=\"OP_READ\"/>\n\t\t<field name=\"OP_WRITE\"/>\n\t</class>\n\t<class name=\"java/nio/channels/Selector\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\" since=\"19\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"isOpen()Z\"/>\n\t\t<method name=\"keys()Ljava/util/Set;\"/>\n\t\t<method name=\"open()Ljava/nio/channels/Selector;\"/>\n\t\t<method name=\"provider()Ljava/nio/channels/spi/SelectorProvider;\"/>\n\t\t<method name=\"select()I\"/>\n\t\t<method name=\"select(J)I\"/>\n\t\t<method name=\"selectNow()I\"/>\n\t\t<method name=\"selectedKeys()Ljava/util/Set;\"/>\n\t\t<method name=\"wakeup()Ljava/nio/channels/Selector;\"/>\n\t</class>\n\t<class name=\"java/nio/channels/ServerSocketChannel\" since=\"1\">\n\t\t<extends name=\"java/nio/channels/spi/AbstractSelectableChannel\"/>\n\t\t<implements name=\"java/nio/channels/NetworkChannel\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Ljava/nio/channels/spi/SelectorProvider;)V\"/>\n\t\t<method name=\"accept()Ljava/nio/channels/SocketChannel;\"/>\n\t\t<method name=\"bind(Ljava/net/SocketAddress;)Ljava/nio/channels/ServerSocketChannel;\" since=\"24\"/>\n\t\t<method name=\"bind(Ljava/net/SocketAddress;I)Ljava/nio/channels/ServerSocketChannel;\" since=\"24\"/>\n\t\t<method name=\"open()Ljava/nio/channels/ServerSocketChannel;\"/>\n\t\t<method name=\"setOption(Ljava/net/SocketOption;Ljava/lang/Object;)Ljava/nio/channels/ServerSocketChannel;\" since=\"24\"/>\n\t\t<method name=\"socket()Ljava/net/ServerSocket;\"/>\n\t</class>\n\t<class name=\"java/nio/channels/ShutdownChannelGroupException\" since=\"26\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/SocketChannel\" since=\"1\">\n\t\t<extends name=\"java/nio/channels/spi/AbstractSelectableChannel\"/>\n\t\t<implements name=\"java/nio/channels/ByteChannel\"/>\n\t\t<implements name=\"java/nio/channels/GatheringByteChannel\"/>\n\t\t<implements name=\"java/nio/channels/NetworkChannel\" since=\"24\"/>\n\t\t<implements name=\"java/nio/channels/ScatteringByteChannel\"/>\n\t\t<method name=\"&lt;init>(Ljava/nio/channels/spi/SelectorProvider;)V\"/>\n\t\t<method name=\"bind(Ljava/net/SocketAddress;)Ljava/nio/channels/SocketChannel;\" since=\"24\"/>\n\t\t<method name=\"connect(Ljava/net/SocketAddress;)Z\"/>\n\t\t<method name=\"finishConnect()Z\"/>\n\t\t<method name=\"getRemoteAddress()Ljava/net/SocketAddress;\" since=\"24\"/>\n\t\t<method name=\"isConnected()Z\"/>\n\t\t<method name=\"isConnectionPending()Z\"/>\n\t\t<method name=\"open()Ljava/nio/channels/SocketChannel;\"/>\n\t\t<method name=\"open(Ljava/net/SocketAddress;)Ljava/nio/channels/SocketChannel;\"/>\n\t\t<method name=\"setOption(Ljava/net/SocketOption;Ljava/lang/Object;)Ljava/nio/channels/SocketChannel;\" since=\"24\"/>\n\t\t<method name=\"shutdownInput()Ljava/nio/channels/SocketChannel;\" since=\"24\"/>\n\t\t<method name=\"shutdownOutput()Ljava/nio/channels/SocketChannel;\" since=\"24\"/>\n\t\t<method name=\"socket()Ljava/net/Socket;\"/>\n\t</class>\n\t<class name=\"java/nio/channels/UnresolvedAddressException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalArgumentException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/UnsupportedAddressTypeException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalArgumentException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/WritableByteChannel\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/channels/Channel\"/>\n\t\t<method name=\"write(Ljava/nio/ByteBuffer;)I\"/>\n\t</class>\n\t<class name=\"java/nio/channels/WritePendingException\" since=\"26\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/spi/AbstractInterruptibleChannel\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/channels/Channel\"/>\n\t\t<implements name=\"java/nio/channels/InterruptibleChannel\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"begin()V\"/>\n\t\t<method name=\"end(Z)V\"/>\n\t\t<method name=\"implCloseChannel()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/spi/AbstractSelectableChannel\" since=\"1\">\n\t\t<extends name=\"java/nio/channels/SelectableChannel\"/>\n\t\t<method name=\"&lt;init>(Ljava/nio/channels/spi/SelectorProvider;)V\"/>\n\t\t<method name=\"implCloseSelectableChannel()V\"/>\n\t\t<method name=\"implConfigureBlocking(Z)V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/spi/AbstractSelectionKey\" since=\"1\">\n\t\t<extends name=\"java/nio/channels/SelectionKey\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/channels/spi/AbstractSelector\" since=\"1\">\n\t\t<extends name=\"java/nio/channels/Selector\"/>\n\t\t<method name=\"&lt;init>(Ljava/nio/channels/spi/SelectorProvider;)V\"/>\n\t\t<method name=\"begin()V\"/>\n\t\t<method name=\"cancelledKeys()Ljava/util/Set;\"/>\n\t\t<method name=\"deregister(Ljava/nio/channels/spi/AbstractSelectionKey;)V\"/>\n\t\t<method name=\"end()V\"/>\n\t\t<method name=\"implCloseSelector()V\"/>\n\t\t<method name=\"register(Ljava/nio/channels/spi/AbstractSelectableChannel;ILjava/lang/Object;)Ljava/nio/channels/SelectionKey;\"/>\n\t</class>\n\t<class name=\"java/nio/channels/spi/AsynchronousChannelProvider\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"openAsynchronousChannelGroup(ILjava/util/concurrent/ThreadFactory;)Ljava/nio/channels/AsynchronousChannelGroup;\"/>\n\t\t<method name=\"openAsynchronousChannelGroup(Ljava/util/concurrent/ExecutorService;I)Ljava/nio/channels/AsynchronousChannelGroup;\"/>\n\t\t<method name=\"openAsynchronousServerSocketChannel(Ljava/nio/channels/AsynchronousChannelGroup;)Ljava/nio/channels/AsynchronousServerSocketChannel;\"/>\n\t\t<method name=\"openAsynchronousSocketChannel(Ljava/nio/channels/AsynchronousChannelGroup;)Ljava/nio/channels/AsynchronousSocketChannel;\"/>\n\t\t<method name=\"provider()Ljava/nio/channels/spi/AsynchronousChannelProvider;\"/>\n\t</class>\n\t<class name=\"java/nio/channels/spi/SelectorProvider\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"inheritedChannel()Ljava/nio/channels/Channel;\"/>\n\t\t<method name=\"openDatagramChannel()Ljava/nio/channels/DatagramChannel;\"/>\n\t\t<method name=\"openDatagramChannel(Ljava/net/ProtocolFamily;)Ljava/nio/channels/DatagramChannel;\" since=\"24\"/>\n\t\t<method name=\"openPipe()Ljava/nio/channels/Pipe;\"/>\n\t\t<method name=\"openSelector()Ljava/nio/channels/spi/AbstractSelector;\"/>\n\t\t<method name=\"openServerSocketChannel()Ljava/nio/channels/ServerSocketChannel;\"/>\n\t\t<method name=\"openSocketChannel()Ljava/nio/channels/SocketChannel;\"/>\n\t\t<method name=\"provider()Ljava/nio/channels/spi/SelectorProvider;\"/>\n\t</class>\n\t<class name=\"java/nio/charset/CharacterCodingException\" since=\"1\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/charset/Charset\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;[Ljava/lang/String;)V\"/>\n\t\t<method name=\"aliases()Ljava/util/Set;\"/>\n\t\t<method name=\"availableCharsets()Ljava/util/SortedMap;\"/>\n\t\t<method name=\"canEncode()Z\"/>\n\t\t<method name=\"compareTo(Ljava/nio/charset/Charset;)I\"/>\n\t\t<method name=\"contains(Ljava/nio/charset/Charset;)Z\"/>\n\t\t<method name=\"decode(Ljava/nio/ByteBuffer;)Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"defaultCharset()Ljava/nio/charset/Charset;\"/>\n\t\t<method name=\"displayName()Ljava/lang/String;\"/>\n\t\t<method name=\"displayName(Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"encode(Ljava/lang/String;)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"encode(Ljava/nio/CharBuffer;)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"forName(Ljava/lang/String;)Ljava/nio/charset/Charset;\"/>\n\t\t<method name=\"isRegistered()Z\"/>\n\t\t<method name=\"isSupported(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"name()Ljava/lang/String;\"/>\n\t\t<method name=\"newDecoder()Ljava/nio/charset/CharsetDecoder;\"/>\n\t\t<method name=\"newEncoder()Ljava/nio/charset/CharsetEncoder;\"/>\n\t</class>\n\t<class name=\"java/nio/charset/CharsetDecoder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/nio/charset/Charset;FF)V\"/>\n\t\t<method name=\"averageCharsPerByte()F\"/>\n\t\t<method name=\"charset()Ljava/nio/charset/Charset;\"/>\n\t\t<method name=\"decode(Ljava/nio/ByteBuffer;)Ljava/nio/CharBuffer;\"/>\n\t\t<method name=\"decode(Ljava/nio/ByteBuffer;Ljava/nio/CharBuffer;Z)Ljava/nio/charset/CoderResult;\"/>\n\t\t<method name=\"decodeLoop(Ljava/nio/ByteBuffer;Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;\"/>\n\t\t<method name=\"detectedCharset()Ljava/nio/charset/Charset;\"/>\n\t\t<method name=\"flush(Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;\"/>\n\t\t<method name=\"implFlush(Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;\"/>\n\t\t<method name=\"implOnMalformedInput(Ljava/nio/charset/CodingErrorAction;)V\"/>\n\t\t<method name=\"implOnUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)V\"/>\n\t\t<method name=\"implReplaceWith(Ljava/lang/String;)V\"/>\n\t\t<method name=\"implReset()V\"/>\n\t\t<method name=\"isAutoDetecting()Z\"/>\n\t\t<method name=\"isCharsetDetected()Z\"/>\n\t\t<method name=\"malformedInputAction()Ljava/nio/charset/CodingErrorAction;\"/>\n\t\t<method name=\"maxCharsPerByte()F\"/>\n\t\t<method name=\"onMalformedInput(Ljava/nio/charset/CodingErrorAction;)Ljava/nio/charset/CharsetDecoder;\"/>\n\t\t<method name=\"onUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)Ljava/nio/charset/CharsetDecoder;\"/>\n\t\t<method name=\"replaceWith(Ljava/lang/String;)Ljava/nio/charset/CharsetDecoder;\"/>\n\t\t<method name=\"replacement()Ljava/lang/String;\"/>\n\t\t<method name=\"reset()Ljava/nio/charset/CharsetDecoder;\"/>\n\t\t<method name=\"unmappableCharacterAction()Ljava/nio/charset/CodingErrorAction;\"/>\n\t</class>\n\t<class name=\"java/nio/charset/CharsetEncoder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/nio/charset/Charset;FF)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/nio/charset/Charset;FF[B)V\"/>\n\t\t<method name=\"averageBytesPerChar()F\"/>\n\t\t<method name=\"canEncode(C)Z\"/>\n\t\t<method name=\"canEncode(Ljava/lang/CharSequence;)Z\"/>\n\t\t<method name=\"charset()Ljava/nio/charset/Charset;\"/>\n\t\t<method name=\"encode(Ljava/nio/CharBuffer;)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"encode(Ljava/nio/CharBuffer;Ljava/nio/ByteBuffer;Z)Ljava/nio/charset/CoderResult;\"/>\n\t\t<method name=\"encodeLoop(Ljava/nio/CharBuffer;Ljava/nio/ByteBuffer;)Ljava/nio/charset/CoderResult;\"/>\n\t\t<method name=\"flush(Ljava/nio/ByteBuffer;)Ljava/nio/charset/CoderResult;\"/>\n\t\t<method name=\"implFlush(Ljava/nio/ByteBuffer;)Ljava/nio/charset/CoderResult;\"/>\n\t\t<method name=\"implOnMalformedInput(Ljava/nio/charset/CodingErrorAction;)V\"/>\n\t\t<method name=\"implOnUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)V\"/>\n\t\t<method name=\"implReplaceWith([B)V\"/>\n\t\t<method name=\"implReset()V\"/>\n\t\t<method name=\"isLegalReplacement([B)Z\"/>\n\t\t<method name=\"malformedInputAction()Ljava/nio/charset/CodingErrorAction;\"/>\n\t\t<method name=\"maxBytesPerChar()F\"/>\n\t\t<method name=\"onMalformedInput(Ljava/nio/charset/CodingErrorAction;)Ljava/nio/charset/CharsetEncoder;\"/>\n\t\t<method name=\"onUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)Ljava/nio/charset/CharsetEncoder;\"/>\n\t\t<method name=\"replaceWith([B)Ljava/nio/charset/CharsetEncoder;\"/>\n\t\t<method name=\"replacement()[B\"/>\n\t\t<method name=\"reset()Ljava/nio/charset/CharsetEncoder;\"/>\n\t\t<method name=\"unmappableCharacterAction()Ljava/nio/charset/CodingErrorAction;\"/>\n\t</class>\n\t<class name=\"java/nio/charset/CoderMalfunctionError\" since=\"1\">\n\t\t<extends name=\"java/lang/Error\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Exception;)V\"/>\n\t</class>\n\t<class name=\"java/nio/charset/CoderResult\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"isError()Z\"/>\n\t\t<method name=\"isMalformed()Z\"/>\n\t\t<method name=\"isOverflow()Z\"/>\n\t\t<method name=\"isUnderflow()Z\"/>\n\t\t<method name=\"isUnmappable()Z\"/>\n\t\t<method name=\"length()I\"/>\n\t\t<method name=\"malformedForLength(I)Ljava/nio/charset/CoderResult;\"/>\n\t\t<method name=\"throwException()V\"/>\n\t\t<method name=\"unmappableForLength(I)Ljava/nio/charset/CoderResult;\"/>\n\t\t<field name=\"OVERFLOW\"/>\n\t\t<field name=\"UNDERFLOW\"/>\n\t</class>\n\t<class name=\"java/nio/charset/CodingErrorAction\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"IGNORE\"/>\n\t\t<field name=\"REPLACE\"/>\n\t\t<field name=\"REPORT\"/>\n\t</class>\n\t<class name=\"java/nio/charset/IllegalCharsetNameException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalArgumentException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getCharsetName()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/nio/charset/MalformedInputException\" since=\"1\">\n\t\t<extends name=\"java/nio/charset/CharacterCodingException\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"getInputLength()I\"/>\n\t</class>\n\t<class name=\"java/nio/charset/StandardCharsets\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ISO_8859_1\"/>\n\t\t<field name=\"US_ASCII\"/>\n\t\t<field name=\"UTF_16\"/>\n\t\t<field name=\"UTF_16BE\"/>\n\t\t<field name=\"UTF_16LE\"/>\n\t\t<field name=\"UTF_8\"/>\n\t</class>\n\t<class name=\"java/nio/charset/UnmappableCharacterException\" since=\"1\">\n\t\t<extends name=\"java/nio/charset/CharacterCodingException\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"getInputLength()I\"/>\n\t</class>\n\t<class name=\"java/nio/charset/UnsupportedCharsetException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalArgumentException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getCharsetName()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/nio/charset/spi/CharsetProvider\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"charsetForName(Ljava/lang/String;)Ljava/nio/charset/Charset;\"/>\n\t\t<method name=\"charsets()Ljava/util/Iterator;\"/>\n\t</class>\n\t<class name=\"java/nio/file/AccessDeniedException\" since=\"26\">\n\t\t<extends name=\"java/nio/file/FileSystemException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/nio/file/AccessMode\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/nio/file/AccessMode;\"/>\n\t\t<method name=\"values()[Ljava/nio/file/AccessMode;\"/>\n\t\t<field name=\"EXECUTE\"/>\n\t\t<field name=\"READ\"/>\n\t\t<field name=\"WRITE\"/>\n\t</class>\n\t<class name=\"java/nio/file/AtomicMoveNotSupportedException\" since=\"26\">\n\t\t<extends name=\"java/nio/file/FileSystemException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/nio/file/ClosedDirectoryStreamException\" since=\"26\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/file/ClosedFileSystemException\" since=\"26\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/file/ClosedWatchServiceException\" since=\"26\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/file/CopyOption\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"java/nio/file/DirectoryIteratorException\" since=\"26\">\n\t\t<extends name=\"java/util/ConcurrentModificationException\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/IOException;)V\"/>\n\t\t<method name=\"getCause()Ljava/io/IOException;\"/>\n\t</class>\n\t<class name=\"java/nio/file/DirectoryNotEmptyException\" since=\"26\">\n\t\t<extends name=\"java/nio/file/FileSystemException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/nio/file/DirectoryStream\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<implements name=\"java/lang/Iterable\"/>\n\t</class>\n\t<class name=\"java/nio/file/DirectoryStream$Filter\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"accept(Ljava/lang/Object;)Z\"/>\n\t</class>\n\t<class name=\"java/nio/file/FileAlreadyExistsException\" since=\"26\">\n\t\t<extends name=\"java/nio/file/FileSystemException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/nio/file/FileStore\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getAttribute(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getFileStoreAttributeView(Ljava/lang/Class;)Ljava/nio/file/attribute/FileStoreAttributeView;\"/>\n\t\t<method name=\"getTotalSpace()J\"/>\n\t\t<method name=\"getUnallocatedSpace()J\"/>\n\t\t<method name=\"getUsableSpace()J\"/>\n\t\t<method name=\"isReadOnly()Z\"/>\n\t\t<method name=\"name()Ljava/lang/String;\"/>\n\t\t<method name=\"supportsFileAttributeView(Ljava/lang/Class;)Z\"/>\n\t\t<method name=\"supportsFileAttributeView(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"type()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/nio/file/FileSystem\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getFileStores()Ljava/lang/Iterable;\"/>\n\t\t<method name=\"getPath(Ljava/lang/String;[Ljava/lang/String;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"getPathMatcher(Ljava/lang/String;)Ljava/nio/file/PathMatcher;\"/>\n\t\t<method name=\"getRootDirectories()Ljava/lang/Iterable;\"/>\n\t\t<method name=\"getSeparator()Ljava/lang/String;\"/>\n\t\t<method name=\"getUserPrincipalLookupService()Ljava/nio/file/attribute/UserPrincipalLookupService;\"/>\n\t\t<method name=\"isOpen()Z\"/>\n\t\t<method name=\"isReadOnly()Z\"/>\n\t\t<method name=\"newWatchService()Ljava/nio/file/WatchService;\"/>\n\t\t<method name=\"provider()Ljava/nio/file/spi/FileSystemProvider;\"/>\n\t\t<method name=\"supportedFileAttributeViews()Ljava/util/Set;\"/>\n\t</class>\n\t<class name=\"java/nio/file/FileSystemAlreadyExistsException\" since=\"26\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/nio/file/FileSystemException\" since=\"26\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getFile()Ljava/lang/String;\"/>\n\t\t<method name=\"getOtherFile()Ljava/lang/String;\"/>\n\t\t<method name=\"getReason()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/nio/file/FileSystemLoopException\" since=\"26\">\n\t\t<extends name=\"java/nio/file/FileSystemException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/nio/file/FileSystemNotFoundException\" since=\"26\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/nio/file/FileSystems\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getDefault()Ljava/nio/file/FileSystem;\"/>\n\t\t<method name=\"getFileSystem(Ljava/net/URI;)Ljava/nio/file/FileSystem;\"/>\n\t\t<method name=\"newFileSystem(Ljava/net/URI;Ljava/util/Map;)Ljava/nio/file/FileSystem;\"/>\n\t\t<method name=\"newFileSystem(Ljava/net/URI;Ljava/util/Map;Ljava/lang/ClassLoader;)Ljava/nio/file/FileSystem;\"/>\n\t\t<method name=\"newFileSystem(Ljava/nio/file/Path;Ljava/lang/ClassLoader;)Ljava/nio/file/FileSystem;\"/>\n\t</class>\n\t<class name=\"java/nio/file/FileVisitOption\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/nio/file/FileVisitOption;\"/>\n\t\t<method name=\"values()[Ljava/nio/file/FileVisitOption;\"/>\n\t\t<field name=\"FOLLOW_LINKS\"/>\n\t</class>\n\t<class name=\"java/nio/file/FileVisitResult\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/nio/file/FileVisitResult;\"/>\n\t\t<method name=\"values()[Ljava/nio/file/FileVisitResult;\"/>\n\t\t<field name=\"CONTINUE\"/>\n\t\t<field name=\"SKIP_SIBLINGS\"/>\n\t\t<field name=\"SKIP_SUBTREE\"/>\n\t\t<field name=\"TERMINATE\"/>\n\t</class>\n\t<class name=\"java/nio/file/FileVisitor\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"postVisitDirectory(Ljava/lang/Object;Ljava/io/IOException;)Ljava/nio/file/FileVisitResult;\"/>\n\t\t<method name=\"preVisitDirectory(Ljava/lang/Object;Ljava/nio/file/attribute/BasicFileAttributes;)Ljava/nio/file/FileVisitResult;\"/>\n\t\t<method name=\"visitFile(Ljava/lang/Object;Ljava/nio/file/attribute/BasicFileAttributes;)Ljava/nio/file/FileVisitResult;\"/>\n\t\t<method name=\"visitFileFailed(Ljava/lang/Object;Ljava/io/IOException;)Ljava/nio/file/FileVisitResult;\"/>\n\t</class>\n\t<class name=\"java/nio/file/Files\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"copy(Ljava/io/InputStream;Ljava/nio/file/Path;[Ljava/nio/file/CopyOption;)J\"/>\n\t\t<method name=\"copy(Ljava/nio/file/Path;Ljava/io/OutputStream;)J\"/>\n\t\t<method name=\"copy(Ljava/nio/file/Path;Ljava/nio/file/Path;[Ljava/nio/file/CopyOption;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"createDirectories(Ljava/nio/file/Path;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"createDirectory(Ljava/nio/file/Path;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"createFile(Ljava/nio/file/Path;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"createLink(Ljava/nio/file/Path;Ljava/nio/file/Path;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"createSymbolicLink(Ljava/nio/file/Path;Ljava/nio/file/Path;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"createTempDirectory(Ljava/lang/String;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"createTempDirectory(Ljava/nio/file/Path;Ljava/lang/String;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"createTempFile(Ljava/lang/String;Ljava/lang/String;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"createTempFile(Ljava/nio/file/Path;Ljava/lang/String;Ljava/lang/String;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"delete(Ljava/nio/file/Path;)V\"/>\n\t\t<method name=\"deleteIfExists(Ljava/nio/file/Path;)Z\"/>\n\t\t<method name=\"exists(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Z\"/>\n\t\t<method name=\"find(Ljava/nio/file/Path;ILjava/util/function/BiPredicate;[Ljava/nio/file/FileVisitOption;)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"getAttribute(Ljava/nio/file/Path;Ljava/lang/String;[Ljava/nio/file/LinkOption;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getFileAttributeView(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/FileAttributeView;\"/>\n\t\t<method name=\"getFileStore(Ljava/nio/file/Path;)Ljava/nio/file/FileStore;\"/>\n\t\t<method name=\"getLastModifiedTime(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/FileTime;\"/>\n\t\t<method name=\"getOwner(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/UserPrincipal;\"/>\n\t\t<method name=\"getPosixFilePermissions(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Ljava/util/Set;\"/>\n\t\t<method name=\"isDirectory(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Z\"/>\n\t\t<method name=\"isExecutable(Ljava/nio/file/Path;)Z\"/>\n\t\t<method name=\"isHidden(Ljava/nio/file/Path;)Z\"/>\n\t\t<method name=\"isReadable(Ljava/nio/file/Path;)Z\"/>\n\t\t<method name=\"isRegularFile(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Z\"/>\n\t\t<method name=\"isSameFile(Ljava/nio/file/Path;Ljava/nio/file/Path;)Z\"/>\n\t\t<method name=\"isSymbolicLink(Ljava/nio/file/Path;)Z\"/>\n\t\t<method name=\"isWritable(Ljava/nio/file/Path;)Z\"/>\n\t\t<method name=\"lines(Ljava/nio/file/Path;)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"lines(Ljava/nio/file/Path;Ljava/nio/charset/Charset;)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"list(Ljava/nio/file/Path;)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"move(Ljava/nio/file/Path;Ljava/nio/file/Path;[Ljava/nio/file/CopyOption;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"newBufferedReader(Ljava/nio/file/Path;)Ljava/io/BufferedReader;\"/>\n\t\t<method name=\"newBufferedReader(Ljava/nio/file/Path;Ljava/nio/charset/Charset;)Ljava/io/BufferedReader;\"/>\n\t\t<method name=\"newBufferedWriter(Ljava/nio/file/Path;Ljava/nio/charset/Charset;[Ljava/nio/file/OpenOption;)Ljava/io/BufferedWriter;\"/>\n\t\t<method name=\"newBufferedWriter(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/BufferedWriter;\"/>\n\t\t<method name=\"newByteChannel(Ljava/nio/file/Path;Ljava/util/Set;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/SeekableByteChannel;\"/>\n\t\t<method name=\"newByteChannel(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/nio/channels/SeekableByteChannel;\"/>\n\t\t<method name=\"newDirectoryStream(Ljava/nio/file/Path;)Ljava/nio/file/DirectoryStream;\"/>\n\t\t<method name=\"newDirectoryStream(Ljava/nio/file/Path;Ljava/lang/String;)Ljava/nio/file/DirectoryStream;\"/>\n\t\t<method name=\"newDirectoryStream(Ljava/nio/file/Path;Ljava/nio/file/DirectoryStream$Filter;)Ljava/nio/file/DirectoryStream;\"/>\n\t\t<method name=\"newInputStream(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/InputStream;\"/>\n\t\t<method name=\"newOutputStream(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/OutputStream;\"/>\n\t\t<method name=\"notExists(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Z\"/>\n\t\t<method name=\"probeContentType(Ljava/nio/file/Path;)Ljava/lang/String;\"/>\n\t\t<method name=\"readAllBytes(Ljava/nio/file/Path;)[B\"/>\n\t\t<method name=\"readAllLines(Ljava/nio/file/Path;)Ljava/util/List;\"/>\n\t\t<method name=\"readAllLines(Ljava/nio/file/Path;Ljava/nio/charset/Charset;)Ljava/util/List;\"/>\n\t\t<method name=\"readAttributes(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/BasicFileAttributes;\"/>\n\t\t<method name=\"readAttributes(Ljava/nio/file/Path;Ljava/lang/String;[Ljava/nio/file/LinkOption;)Ljava/util/Map;\"/>\n\t\t<method name=\"readSymbolicLink(Ljava/nio/file/Path;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"setAttribute(Ljava/nio/file/Path;Ljava/lang/String;Ljava/lang/Object;[Ljava/nio/file/LinkOption;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"setLastModifiedTime(Ljava/nio/file/Path;Ljava/nio/file/attribute/FileTime;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"setOwner(Ljava/nio/file/Path;Ljava/nio/file/attribute/UserPrincipal;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"setPosixFilePermissions(Ljava/nio/file/Path;Ljava/util/Set;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"size(Ljava/nio/file/Path;)J\"/>\n\t\t<method name=\"walk(Ljava/nio/file/Path;I[Ljava/nio/file/FileVisitOption;)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"walk(Ljava/nio/file/Path;[Ljava/nio/file/FileVisitOption;)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"walkFileTree(Ljava/nio/file/Path;Ljava/nio/file/FileVisitor;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"walkFileTree(Ljava/nio/file/Path;Ljava/util/Set;ILjava/nio/file/FileVisitor;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"write(Ljava/nio/file/Path;Ljava/lang/Iterable;Ljava/nio/charset/Charset;[Ljava/nio/file/OpenOption;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"write(Ljava/nio/file/Path;Ljava/lang/Iterable;[Ljava/nio/file/OpenOption;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"write(Ljava/nio/file/Path;[B[Ljava/nio/file/OpenOption;)Ljava/nio/file/Path;\"/>\n\t</class>\n\t<class name=\"java/nio/file/InvalidPathException\" since=\"26\">\n\t\t<extends name=\"java/lang/IllegalArgumentException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"getIndex()I\"/>\n\t\t<method name=\"getInput()Ljava/lang/String;\"/>\n\t\t<method name=\"getReason()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/nio/file/LinkOption\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<implements name=\"java/nio/file/CopyOption\"/>\n\t\t<implements name=\"java/nio/file/OpenOption\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/nio/file/LinkOption;\"/>\n\t\t<method name=\"values()[Ljava/nio/file/LinkOption;\"/>\n\t\t<field name=\"NOFOLLOW_LINKS\"/>\n\t</class>\n\t<class name=\"java/nio/file/LinkPermission\" since=\"26\">\n\t\t<extends name=\"java/security/BasicPermission\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/nio/file/NoSuchFileException\" since=\"26\">\n\t\t<extends name=\"java/nio/file/FileSystemException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/nio/file/NotDirectoryException\" since=\"26\">\n\t\t<extends name=\"java/nio/file/FileSystemException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/nio/file/NotLinkException\" since=\"26\">\n\t\t<extends name=\"java/nio/file/FileSystemException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/nio/file/OpenOption\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"java/nio/file/Path\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<implements name=\"java/lang/Iterable\"/>\n\t\t<implements name=\"java/nio/file/Watchable\"/>\n\t\t<method name=\"compareTo(Ljava/nio/file/Path;)I\"/>\n\t\t<method name=\"endsWith(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"endsWith(Ljava/nio/file/Path;)Z\"/>\n\t\t<method name=\"getFileName()Ljava/nio/file/Path;\"/>\n\t\t<method name=\"getFileSystem()Ljava/nio/file/FileSystem;\"/>\n\t\t<method name=\"getName(I)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"getNameCount()I\"/>\n\t\t<method name=\"getParent()Ljava/nio/file/Path;\"/>\n\t\t<method name=\"getRoot()Ljava/nio/file/Path;\"/>\n\t\t<method name=\"isAbsolute()Z\"/>\n\t\t<method name=\"normalize()Ljava/nio/file/Path;\"/>\n\t\t<method name=\"relativize(Ljava/nio/file/Path;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"resolve(Ljava/lang/String;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"resolve(Ljava/nio/file/Path;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"resolveSibling(Ljava/lang/String;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"resolveSibling(Ljava/nio/file/Path;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"startsWith(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"startsWith(Ljava/nio/file/Path;)Z\"/>\n\t\t<method name=\"subpath(II)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"toAbsolutePath()Ljava/nio/file/Path;\"/>\n\t\t<method name=\"toFile()Ljava/io/File;\"/>\n\t\t<method name=\"toRealPath([Ljava/nio/file/LinkOption;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"toUri()Ljava/net/URI;\"/>\n\t</class>\n\t<class name=\"java/nio/file/PathMatcher\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"matches(Ljava/nio/file/Path;)Z\"/>\n\t</class>\n\t<class name=\"java/nio/file/Paths\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"get(Ljava/lang/String;[Ljava/lang/String;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"get(Ljava/net/URI;)Ljava/nio/file/Path;\"/>\n\t</class>\n\t<class name=\"java/nio/file/ProviderMismatchException\" since=\"26\">\n\t\t<extends name=\"java/lang/IllegalArgumentException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/nio/file/ProviderNotFoundException\" since=\"26\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/nio/file/ReadOnlyFileSystemException\" since=\"26\">\n\t\t<extends name=\"java/lang/UnsupportedOperationException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/file/SecureDirectoryStream\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/file/DirectoryStream\"/>\n\t\t<method name=\"deleteDirectory(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"deleteFile(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"getFileAttributeView(Ljava/lang/Class;)Ljava/nio/file/attribute/FileAttributeView;\"/>\n\t\t<method name=\"getFileAttributeView(Ljava/lang/Object;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/FileAttributeView;\"/>\n\t\t<method name=\"move(Ljava/lang/Object;Ljava/nio/file/SecureDirectoryStream;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"newByteChannel(Ljava/lang/Object;Ljava/util/Set;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/SeekableByteChannel;\"/>\n\t\t<method name=\"newDirectoryStream(Ljava/lang/Object;[Ljava/nio/file/LinkOption;)Ljava/nio/file/SecureDirectoryStream;\"/>\n\t</class>\n\t<class name=\"java/nio/file/SimpleFileVisitor\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/file/FileVisitor\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/nio/file/StandardCopyOption\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<implements name=\"java/nio/file/CopyOption\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/nio/file/StandardCopyOption;\"/>\n\t\t<method name=\"values()[Ljava/nio/file/StandardCopyOption;\"/>\n\t\t<field name=\"ATOMIC_MOVE\"/>\n\t\t<field name=\"COPY_ATTRIBUTES\"/>\n\t\t<field name=\"REPLACE_EXISTING\"/>\n\t</class>\n\t<class name=\"java/nio/file/StandardOpenOption\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<implements name=\"java/nio/file/OpenOption\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/nio/file/StandardOpenOption;\"/>\n\t\t<method name=\"values()[Ljava/nio/file/StandardOpenOption;\"/>\n\t\t<field name=\"APPEND\"/>\n\t\t<field name=\"CREATE\"/>\n\t\t<field name=\"CREATE_NEW\"/>\n\t\t<field name=\"DELETE_ON_CLOSE\"/>\n\t\t<field name=\"DSYNC\"/>\n\t\t<field name=\"READ\"/>\n\t\t<field name=\"SPARSE\"/>\n\t\t<field name=\"SYNC\"/>\n\t\t<field name=\"TRUNCATE_EXISTING\"/>\n\t\t<field name=\"WRITE\"/>\n\t</class>\n\t<class name=\"java/nio/file/StandardWatchEventKinds\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ENTRY_CREATE\"/>\n\t\t<field name=\"ENTRY_DELETE\"/>\n\t\t<field name=\"ENTRY_MODIFY\"/>\n\t\t<field name=\"OVERFLOW\"/>\n\t</class>\n\t<class name=\"java/nio/file/WatchEvent\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"context()Ljava/lang/Object;\"/>\n\t\t<method name=\"count()I\"/>\n\t\t<method name=\"kind()Ljava/nio/file/WatchEvent$Kind;\"/>\n\t</class>\n\t<class name=\"java/nio/file/WatchEvent$Kind\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"name()Ljava/lang/String;\"/>\n\t\t<method name=\"type()Ljava/lang/Class;\"/>\n\t</class>\n\t<class name=\"java/nio/file/WatchEvent$Modifier\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"name()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/nio/file/WatchKey\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"cancel()V\"/>\n\t\t<method name=\"isValid()Z\"/>\n\t\t<method name=\"pollEvents()Ljava/util/List;\"/>\n\t\t<method name=\"reset()Z\"/>\n\t\t<method name=\"watchable()Ljava/nio/file/Watchable;\"/>\n\t</class>\n\t<class name=\"java/nio/file/WatchService\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<method name=\"poll()Ljava/nio/file/WatchKey;\"/>\n\t\t<method name=\"poll(JLjava/util/concurrent/TimeUnit;)Ljava/nio/file/WatchKey;\"/>\n\t\t<method name=\"take()Ljava/nio/file/WatchKey;\"/>\n\t</class>\n\t<class name=\"java/nio/file/Watchable\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"register(Ljava/nio/file/WatchService;[Ljava/nio/file/WatchEvent$Kind;)Ljava/nio/file/WatchKey;\"/>\n\t\t<method name=\"register(Ljava/nio/file/WatchService;[Ljava/nio/file/WatchEvent$Kind;[Ljava/nio/file/WatchEvent$Modifier;)Ljava/nio/file/WatchKey;\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/AclEntry\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"flags()Ljava/util/Set;\"/>\n\t\t<method name=\"newBuilder()Ljava/nio/file/attribute/AclEntry$Builder;\"/>\n\t\t<method name=\"newBuilder(Ljava/nio/file/attribute/AclEntry;)Ljava/nio/file/attribute/AclEntry$Builder;\"/>\n\t\t<method name=\"permissions()Ljava/util/Set;\"/>\n\t\t<method name=\"principal()Ljava/nio/file/attribute/UserPrincipal;\"/>\n\t\t<method name=\"type()Ljava/nio/file/attribute/AclEntryType;\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/AclEntry$Builder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"build()Ljava/nio/file/attribute/AclEntry;\"/>\n\t\t<method name=\"setFlags(Ljava/util/Set;)Ljava/nio/file/attribute/AclEntry$Builder;\"/>\n\t\t<method name=\"setFlags([Ljava/nio/file/attribute/AclEntryFlag;)Ljava/nio/file/attribute/AclEntry$Builder;\"/>\n\t\t<method name=\"setPermissions(Ljava/util/Set;)Ljava/nio/file/attribute/AclEntry$Builder;\"/>\n\t\t<method name=\"setPermissions([Ljava/nio/file/attribute/AclEntryPermission;)Ljava/nio/file/attribute/AclEntry$Builder;\"/>\n\t\t<method name=\"setPrincipal(Ljava/nio/file/attribute/UserPrincipal;)Ljava/nio/file/attribute/AclEntry$Builder;\"/>\n\t\t<method name=\"setType(Ljava/nio/file/attribute/AclEntryType;)Ljava/nio/file/attribute/AclEntry$Builder;\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/AclEntryFlag\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/nio/file/attribute/AclEntryFlag;\"/>\n\t\t<method name=\"values()[Ljava/nio/file/attribute/AclEntryFlag;\"/>\n\t\t<field name=\"DIRECTORY_INHERIT\"/>\n\t\t<field name=\"FILE_INHERIT\"/>\n\t\t<field name=\"INHERIT_ONLY\"/>\n\t\t<field name=\"NO_PROPAGATE_INHERIT\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/AclEntryPermission\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/nio/file/attribute/AclEntryPermission;\"/>\n\t\t<method name=\"values()[Ljava/nio/file/attribute/AclEntryPermission;\"/>\n\t\t<field name=\"ADD_FILE\"/>\n\t\t<field name=\"ADD_SUBDIRECTORY\"/>\n\t\t<field name=\"APPEND_DATA\"/>\n\t\t<field name=\"DELETE\"/>\n\t\t<field name=\"DELETE_CHILD\"/>\n\t\t<field name=\"EXECUTE\"/>\n\t\t<field name=\"LIST_DIRECTORY\"/>\n\t\t<field name=\"READ_ACL\"/>\n\t\t<field name=\"READ_ATTRIBUTES\"/>\n\t\t<field name=\"READ_DATA\"/>\n\t\t<field name=\"READ_NAMED_ATTRS\"/>\n\t\t<field name=\"SYNCHRONIZE\"/>\n\t\t<field name=\"WRITE_ACL\"/>\n\t\t<field name=\"WRITE_ATTRIBUTES\"/>\n\t\t<field name=\"WRITE_DATA\"/>\n\t\t<field name=\"WRITE_NAMED_ATTRS\"/>\n\t\t<field name=\"WRITE_OWNER\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/AclEntryType\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/nio/file/attribute/AclEntryType;\"/>\n\t\t<method name=\"values()[Ljava/nio/file/attribute/AclEntryType;\"/>\n\t\t<field name=\"ALARM\"/>\n\t\t<field name=\"ALLOW\"/>\n\t\t<field name=\"AUDIT\"/>\n\t\t<field name=\"DENY\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/AclFileAttributeView\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/file/attribute/FileOwnerAttributeView\"/>\n\t\t<method name=\"getAcl()Ljava/util/List;\"/>\n\t\t<method name=\"setAcl(Ljava/util/List;)V\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/AttributeView\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"name()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/BasicFileAttributeView\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/file/attribute/FileAttributeView\"/>\n\t\t<method name=\"readAttributes()Ljava/nio/file/attribute/BasicFileAttributes;\"/>\n\t\t<method name=\"setTimes(Ljava/nio/file/attribute/FileTime;Ljava/nio/file/attribute/FileTime;Ljava/nio/file/attribute/FileTime;)V\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/BasicFileAttributes\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"creationTime()Ljava/nio/file/attribute/FileTime;\"/>\n\t\t<method name=\"fileKey()Ljava/lang/Object;\"/>\n\t\t<method name=\"isDirectory()Z\"/>\n\t\t<method name=\"isOther()Z\"/>\n\t\t<method name=\"isRegularFile()Z\"/>\n\t\t<method name=\"isSymbolicLink()Z\"/>\n\t\t<method name=\"lastAccessTime()Ljava/nio/file/attribute/FileTime;\"/>\n\t\t<method name=\"lastModifiedTime()Ljava/nio/file/attribute/FileTime;\"/>\n\t\t<method name=\"size()J\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/DosFileAttributeView\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/file/attribute/BasicFileAttributeView\"/>\n\t\t<method name=\"readAttributes()Ljava/nio/file/attribute/DosFileAttributes;\"/>\n\t\t<method name=\"setArchive(Z)V\"/>\n\t\t<method name=\"setHidden(Z)V\"/>\n\t\t<method name=\"setReadOnly(Z)V\"/>\n\t\t<method name=\"setSystem(Z)V\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/DosFileAttributes\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/file/attribute/BasicFileAttributes\"/>\n\t\t<method name=\"isArchive()Z\"/>\n\t\t<method name=\"isHidden()Z\"/>\n\t\t<method name=\"isReadOnly()Z\"/>\n\t\t<method name=\"isSystem()Z\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/FileAttribute\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"name()Ljava/lang/String;\"/>\n\t\t<method name=\"value()Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/FileAttributeView\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/file/attribute/AttributeView\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/FileOwnerAttributeView\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/file/attribute/FileAttributeView\"/>\n\t\t<method name=\"getOwner()Ljava/nio/file/attribute/UserPrincipal;\"/>\n\t\t<method name=\"setOwner(Ljava/nio/file/attribute/UserPrincipal;)V\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/FileStoreAttributeView\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/file/attribute/AttributeView\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/FileTime\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"compareTo(Ljava/nio/file/attribute/FileTime;)I\"/>\n\t\t<method name=\"from(JLjava/util/concurrent/TimeUnit;)Ljava/nio/file/attribute/FileTime;\"/>\n\t\t<method name=\"from(Ljava/time/Instant;)Ljava/nio/file/attribute/FileTime;\"/>\n\t\t<method name=\"fromMillis(J)Ljava/nio/file/attribute/FileTime;\"/>\n\t\t<method name=\"to(Ljava/util/concurrent/TimeUnit;)J\"/>\n\t\t<method name=\"toInstant()Ljava/time/Instant;\"/>\n\t\t<method name=\"toMillis()J\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/GroupPrincipal\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/file/attribute/UserPrincipal\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/PosixFileAttributeView\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/file/attribute/BasicFileAttributeView\"/>\n\t\t<implements name=\"java/nio/file/attribute/FileOwnerAttributeView\"/>\n\t\t<method name=\"readAttributes()Ljava/nio/file/attribute/PosixFileAttributes;\"/>\n\t\t<method name=\"setGroup(Ljava/nio/file/attribute/GroupPrincipal;)V\"/>\n\t\t<method name=\"setPermissions(Ljava/util/Set;)V\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/PosixFileAttributes\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/file/attribute/BasicFileAttributes\"/>\n\t\t<method name=\"group()Ljava/nio/file/attribute/GroupPrincipal;\"/>\n\t\t<method name=\"owner()Ljava/nio/file/attribute/UserPrincipal;\"/>\n\t\t<method name=\"permissions()Ljava/util/Set;\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/PosixFilePermission\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/nio/file/attribute/PosixFilePermission;\"/>\n\t\t<method name=\"values()[Ljava/nio/file/attribute/PosixFilePermission;\"/>\n\t\t<field name=\"GROUP_EXECUTE\"/>\n\t\t<field name=\"GROUP_READ\"/>\n\t\t<field name=\"GROUP_WRITE\"/>\n\t\t<field name=\"OTHERS_EXECUTE\"/>\n\t\t<field name=\"OTHERS_READ\"/>\n\t\t<field name=\"OTHERS_WRITE\"/>\n\t\t<field name=\"OWNER_EXECUTE\"/>\n\t\t<field name=\"OWNER_READ\"/>\n\t\t<field name=\"OWNER_WRITE\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/PosixFilePermissions\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"asFileAttribute(Ljava/util/Set;)Ljava/nio/file/attribute/FileAttribute;\"/>\n\t\t<method name=\"fromString(Ljava/lang/String;)Ljava/util/Set;\"/>\n\t\t<method name=\"toString(Ljava/util/Set;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/UserDefinedFileAttributeView\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/nio/file/attribute/FileAttributeView\"/>\n\t\t<method name=\"delete(Ljava/lang/String;)V\"/>\n\t\t<method name=\"list()Ljava/util/List;\"/>\n\t\t<method name=\"read(Ljava/lang/String;Ljava/nio/ByteBuffer;)I\"/>\n\t\t<method name=\"size(Ljava/lang/String;)I\"/>\n\t\t<method name=\"write(Ljava/lang/String;Ljava/nio/ByteBuffer;)I\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/UserPrincipal\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/Principal\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/UserPrincipalLookupService\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"lookupPrincipalByGroupName(Ljava/lang/String;)Ljava/nio/file/attribute/GroupPrincipal;\"/>\n\t\t<method name=\"lookupPrincipalByName(Ljava/lang/String;)Ljava/nio/file/attribute/UserPrincipal;\"/>\n\t</class>\n\t<class name=\"java/nio/file/attribute/UserPrincipalNotFoundException\" since=\"26\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/nio/file/spi/FileSystemProvider\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"checkAccess(Ljava/nio/file/Path;[Ljava/nio/file/AccessMode;)V\"/>\n\t\t<method name=\"copy(Ljava/nio/file/Path;Ljava/nio/file/Path;[Ljava/nio/file/CopyOption;)V\"/>\n\t\t<method name=\"createDirectory(Ljava/nio/file/Path;[Ljava/nio/file/attribute/FileAttribute;)V\"/>\n\t\t<method name=\"createLink(Ljava/nio/file/Path;Ljava/nio/file/Path;)V\"/>\n\t\t<method name=\"createSymbolicLink(Ljava/nio/file/Path;Ljava/nio/file/Path;[Ljava/nio/file/attribute/FileAttribute;)V\"/>\n\t\t<method name=\"delete(Ljava/nio/file/Path;)V\"/>\n\t\t<method name=\"deleteIfExists(Ljava/nio/file/Path;)Z\"/>\n\t\t<method name=\"getFileAttributeView(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/FileAttributeView;\"/>\n\t\t<method name=\"getFileStore(Ljava/nio/file/Path;)Ljava/nio/file/FileStore;\"/>\n\t\t<method name=\"getFileSystem(Ljava/net/URI;)Ljava/nio/file/FileSystem;\"/>\n\t\t<method name=\"getPath(Ljava/net/URI;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"getScheme()Ljava/lang/String;\"/>\n\t\t<method name=\"installedProviders()Ljava/util/List;\"/>\n\t\t<method name=\"isHidden(Ljava/nio/file/Path;)Z\"/>\n\t\t<method name=\"isSameFile(Ljava/nio/file/Path;Ljava/nio/file/Path;)Z\"/>\n\t\t<method name=\"move(Ljava/nio/file/Path;Ljava/nio/file/Path;[Ljava/nio/file/CopyOption;)V\"/>\n\t\t<method name=\"newAsynchronousFileChannel(Ljava/nio/file/Path;Ljava/util/Set;Ljava/util/concurrent/ExecutorService;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/AsynchronousFileChannel;\"/>\n\t\t<method name=\"newByteChannel(Ljava/nio/file/Path;Ljava/util/Set;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/SeekableByteChannel;\"/>\n\t\t<method name=\"newDirectoryStream(Ljava/nio/file/Path;Ljava/nio/file/DirectoryStream$Filter;)Ljava/nio/file/DirectoryStream;\"/>\n\t\t<method name=\"newFileChannel(Ljava/nio/file/Path;Ljava/util/Set;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/FileChannel;\"/>\n\t\t<method name=\"newFileSystem(Ljava/net/URI;Ljava/util/Map;)Ljava/nio/file/FileSystem;\"/>\n\t\t<method name=\"newFileSystem(Ljava/nio/file/Path;Ljava/util/Map;)Ljava/nio/file/FileSystem;\"/>\n\t\t<method name=\"newInputStream(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/InputStream;\"/>\n\t\t<method name=\"newOutputStream(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/OutputStream;\"/>\n\t\t<method name=\"readAttributes(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/BasicFileAttributes;\"/>\n\t\t<method name=\"readAttributes(Ljava/nio/file/Path;Ljava/lang/String;[Ljava/nio/file/LinkOption;)Ljava/util/Map;\"/>\n\t\t<method name=\"readSymbolicLink(Ljava/nio/file/Path;)Ljava/nio/file/Path;\"/>\n\t\t<method name=\"setAttribute(Ljava/nio/file/Path;Ljava/lang/String;Ljava/lang/Object;[Ljava/nio/file/LinkOption;)V\"/>\n\t</class>\n\t<class name=\"java/nio/file/spi/FileTypeDetector\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"probeContentType(Ljava/nio/file/Path;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/security/AccessControlContext\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/AccessControlContext;Ljava/security/DomainCombiner;)V\"/>\n\t\t<method name=\"&lt;init>([Ljava/security/ProtectionDomain;)V\"/>\n\t\t<method name=\"checkPermission(Ljava/security/Permission;)V\"/>\n\t\t<method name=\"getDomainCombiner()Ljava/security/DomainCombiner;\"/>\n\t</class>\n\t<class name=\"java/security/AccessControlException\" since=\"1\">\n\t\t<extends name=\"java/lang/SecurityException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/security/Permission;)V\"/>\n\t\t<method name=\"getPermission()Ljava/security/Permission;\"/>\n\t</class>\n\t<class name=\"java/security/AccessController\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"checkPermission(Ljava/security/Permission;)V\"/>\n\t\t<method name=\"doPrivileged(Ljava/security/PrivilegedAction;)Ljava/lang/Object;\"/>\n\t\t<method name=\"doPrivileged(Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;\"/>\n\t\t<method name=\"doPrivileged(Ljava/security/PrivilegedExceptionAction;)Ljava/lang/Object;\"/>\n\t\t<method name=\"doPrivileged(Ljava/security/PrivilegedExceptionAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;\"/>\n\t\t<method name=\"doPrivilegedWithCombiner(Ljava/security/PrivilegedAction;)Ljava/lang/Object;\" since=\"9\"/>\n\t\t<method name=\"doPrivilegedWithCombiner(Ljava/security/PrivilegedExceptionAction;)Ljava/lang/Object;\" since=\"9\"/>\n\t\t<method name=\"getContext()Ljava/security/AccessControlContext;\"/>\n\t</class>\n\t<class name=\"java/security/AlgorithmConstraints\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"permits(Ljava/util/Set;Ljava/lang/String;Ljava/security/AlgorithmParameters;)Z\"/>\n\t\t<method name=\"permits(Ljava/util/Set;Ljava/lang/String;Ljava/security/Key;Ljava/security/AlgorithmParameters;)Z\"/>\n\t\t<method name=\"permits(Ljava/util/Set;Ljava/security/Key;)Z\"/>\n\t</class>\n\t<class name=\"java/security/AlgorithmParameterGenerator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/AlgorithmParameterGeneratorSpi;Ljava/security/Provider;Ljava/lang/String;)V\"/>\n\t\t<method name=\"generateParameters()Ljava/security/AlgorithmParameters;\"/>\n\t\t<method name=\"getAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Ljava/security/AlgorithmParameterGenerator;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/AlgorithmParameterGenerator;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/AlgorithmParameterGenerator;\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"init(I)V\"/>\n\t\t<method name=\"init(ILjava/security/SecureRandom;)V\"/>\n\t\t<method name=\"init(Ljava/security/spec/AlgorithmParameterSpec;)V\"/>\n\t\t<method name=\"init(Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V\"/>\n\t</class>\n\t<class name=\"java/security/AlgorithmParameterGeneratorSpi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"engineGenerateParameters()Ljava/security/AlgorithmParameters;\"/>\n\t\t<method name=\"engineInit(ILjava/security/SecureRandom;)V\"/>\n\t\t<method name=\"engineInit(Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V\"/>\n\t</class>\n\t<class name=\"java/security/AlgorithmParameters\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/AlgorithmParametersSpi;Ljava/security/Provider;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getEncoded()[B\"/>\n\t\t<method name=\"getEncoded(Ljava/lang/String;)[B\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Ljava/security/AlgorithmParameters;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/AlgorithmParameters;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/AlgorithmParameters;\"/>\n\t\t<method name=\"getParameterSpec(Ljava/lang/Class;)Ljava/security/spec/AlgorithmParameterSpec;\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"init(Ljava/security/spec/AlgorithmParameterSpec;)V\"/>\n\t\t<method name=\"init([B)V\"/>\n\t\t<method name=\"init([BLjava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/security/AlgorithmParametersSpi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"engineGetEncoded()[B\"/>\n\t\t<method name=\"engineGetEncoded(Ljava/lang/String;)[B\"/>\n\t\t<method name=\"engineGetParameterSpec(Ljava/lang/Class;)Ljava/security/spec/AlgorithmParameterSpec;\"/>\n\t\t<method name=\"engineInit(Ljava/security/spec/AlgorithmParameterSpec;)V\"/>\n\t\t<method name=\"engineInit([B)V\"/>\n\t\t<method name=\"engineInit([BLjava/lang/String;)V\"/>\n\t\t<method name=\"engineToString()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/security/AllPermission\" since=\"1\">\n\t\t<extends name=\"java/security/Permission\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/security/AuthProvider\" since=\"1\">\n\t\t<extends name=\"java/security/Provider\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;DLjava/lang/String;)V\"/>\n\t\t<method name=\"login(Ljavax/security/auth/Subject;Ljavax/security/auth/callback/CallbackHandler;)V\"/>\n\t\t<method name=\"logout()V\"/>\n\t\t<method name=\"setCallbackHandler(Ljavax/security/auth/callback/CallbackHandler;)V\"/>\n\t</class>\n\t<class name=\"java/security/BasicPermission\" since=\"1\">\n\t\t<extends name=\"java/security/Permission\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/security/Certificate\" since=\"1\" deprecated=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"decode(Ljava/io/InputStream;)V\" deprecated=\"29\"/>\n\t\t<method name=\"encode(Ljava/io/OutputStream;)V\" deprecated=\"29\"/>\n\t\t<method name=\"getFormat()Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getGuarantor()Ljava/security/Principal;\" deprecated=\"29\"/>\n\t\t<method name=\"getPrincipal()Ljava/security/Principal;\" deprecated=\"29\"/>\n\t\t<method name=\"getPublicKey()Ljava/security/PublicKey;\" deprecated=\"29\"/>\n\t\t<method name=\"toString(Z)Ljava/lang/String;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"java/security/CodeSigner\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/cert/CertPath;Ljava/security/Timestamp;)V\"/>\n\t\t<method name=\"getSignerCertPath()Ljava/security/cert/CertPath;\"/>\n\t\t<method name=\"getTimestamp()Ljava/security/Timestamp;\"/>\n\t</class>\n\t<class name=\"java/security/CodeSource\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/URL;[Ljava/security/CodeSigner;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/URL;[Ljava/security/cert/Certificate;)V\"/>\n\t\t<method name=\"getCertificates()[Ljava/security/cert/Certificate;\"/>\n\t\t<method name=\"getCodeSigners()[Ljava/security/CodeSigner;\"/>\n\t\t<method name=\"getLocation()Ljava/net/URL;\"/>\n\t\t<method name=\"implies(Ljava/security/CodeSource;)Z\"/>\n\t</class>\n\t<class name=\"java/security/CryptoPrimitive\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/security/CryptoPrimitive;\"/>\n\t\t<method name=\"values()[Ljava/security/CryptoPrimitive;\"/>\n\t\t<field name=\"BLOCK_CIPHER\"/>\n\t\t<field name=\"KEY_AGREEMENT\"/>\n\t\t<field name=\"KEY_ENCAPSULATION\"/>\n\t\t<field name=\"KEY_WRAP\"/>\n\t\t<field name=\"MAC\"/>\n\t\t<field name=\"MESSAGE_DIGEST\"/>\n\t\t<field name=\"PUBLIC_KEY_ENCRYPTION\"/>\n\t\t<field name=\"SECURE_RANDOM\"/>\n\t\t<field name=\"SIGNATURE\"/>\n\t\t<field name=\"STREAM_CIPHER\"/>\n\t</class>\n\t<class name=\"java/security/DigestException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/security/DigestInputStream\" since=\"1\">\n\t\t<extends name=\"java/io/FilterInputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;Ljava/security/MessageDigest;)V\"/>\n\t\t<method name=\"getMessageDigest()Ljava/security/MessageDigest;\"/>\n\t\t<method name=\"on(Z)V\"/>\n\t\t<method name=\"setMessageDigest(Ljava/security/MessageDigest;)V\"/>\n\t\t<field name=\"digest\"/>\n\t</class>\n\t<class name=\"java/security/DigestOutputStream\" since=\"1\">\n\t\t<extends name=\"java/io/FilterOutputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;Ljava/security/MessageDigest;)V\"/>\n\t\t<method name=\"getMessageDigest()Ljava/security/MessageDigest;\"/>\n\t\t<method name=\"on(Z)V\"/>\n\t\t<method name=\"setMessageDigest(Ljava/security/MessageDigest;)V\"/>\n\t\t<field name=\"digest\"/>\n\t</class>\n\t<class name=\"java/security/DomainCombiner\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"combine([Ljava/security/ProtectionDomain;[Ljava/security/ProtectionDomain;)[Ljava/security/ProtectionDomain;\"/>\n\t</class>\n\t<class name=\"java/security/DomainLoadStoreParameter\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/KeyStore$LoadStoreParameter\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/URI;Ljava/util/Map;)V\"/>\n\t\t<method name=\"getConfiguration()Ljava/net/URI;\"/>\n\t\t<method name=\"getProtectionParams()Ljava/util/Map;\"/>\n\t</class>\n\t<class name=\"java/security/GeneralSecurityException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/security/Guard\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"checkGuard(Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"java/security/GuardedObject\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;Ljava/security/Guard;)V\"/>\n\t\t<method name=\"getObject()Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/security/Identity\" since=\"1\" deprecated=\"3\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/security/Principal\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/security/IdentityScope;)V\" deprecated=\"29\"/>\n\t\t<method name=\"addCertificate(Ljava/security/Certificate;)V\" deprecated=\"29\"/>\n\t\t<method name=\"certificates()[Ljava/security/Certificate;\" deprecated=\"29\"/>\n\t\t<method name=\"getInfo()Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getPublicKey()Ljava/security/PublicKey;\" deprecated=\"29\"/>\n\t\t<method name=\"getScope()Ljava/security/IdentityScope;\" deprecated=\"29\"/>\n\t\t<method name=\"identityEquals(Ljava/security/Identity;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"removeCertificate(Ljava/security/Certificate;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setInfo(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setPublicKey(Ljava/security/PublicKey;)V\" deprecated=\"29\"/>\n\t\t<method name=\"toString(Z)Ljava/lang/String;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"java/security/IdentityScope\" since=\"1\" deprecated=\"3\">\n\t\t<extends name=\"java/security/Identity\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/security/IdentityScope;)V\" deprecated=\"29\"/>\n\t\t<method name=\"addIdentity(Ljava/security/Identity;)V\" deprecated=\"29\"/>\n\t\t<method name=\"getIdentity(Ljava/lang/String;)Ljava/security/Identity;\" deprecated=\"29\"/>\n\t\t<method name=\"getIdentity(Ljava/security/Principal;)Ljava/security/Identity;\" deprecated=\"29\"/>\n\t\t<method name=\"getIdentity(Ljava/security/PublicKey;)Ljava/security/Identity;\" deprecated=\"29\"/>\n\t\t<method name=\"getSystemScope()Ljava/security/IdentityScope;\" deprecated=\"29\"/>\n\t\t<method name=\"identities()Ljava/util/Enumeration;\" deprecated=\"29\"/>\n\t\t<method name=\"removeIdentity(Ljava/security/Identity;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setSystemScope(Ljava/security/IdentityScope;)V\" deprecated=\"29\"/>\n\t\t<method name=\"size()I\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"java/security/InvalidAlgorithmParameterException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/security/InvalidKeyException\" since=\"1\">\n\t\t<extends name=\"java/security/KeyException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/security/InvalidParameterException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalArgumentException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/security/Key\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"getAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getEncoded()[B\"/>\n\t\t<method name=\"getFormat()Ljava/lang/String;\"/>\n\t\t<field name=\"serialVersionUID\"/>\n\t</class>\n\t<class name=\"java/security/KeyException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/security/KeyFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/KeyFactorySpi;Ljava/security/Provider;Ljava/lang/String;)V\"/>\n\t\t<method name=\"generatePrivate(Ljava/security/spec/KeySpec;)Ljava/security/PrivateKey;\"/>\n\t\t<method name=\"generatePublic(Ljava/security/spec/KeySpec;)Ljava/security/PublicKey;\"/>\n\t\t<method name=\"getAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Ljava/security/KeyFactory;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/KeyFactory;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/KeyFactory;\"/>\n\t\t<method name=\"getKeySpec(Ljava/security/Key;Ljava/lang/Class;)Ljava/security/spec/KeySpec;\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"translateKey(Ljava/security/Key;)Ljava/security/Key;\"/>\n\t</class>\n\t<class name=\"java/security/KeyFactorySpi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"engineGeneratePrivate(Ljava/security/spec/KeySpec;)Ljava/security/PrivateKey;\"/>\n\t\t<method name=\"engineGeneratePublic(Ljava/security/spec/KeySpec;)Ljava/security/PublicKey;\"/>\n\t\t<method name=\"engineGetKeySpec(Ljava/security/Key;Ljava/lang/Class;)Ljava/security/spec/KeySpec;\"/>\n\t\t<method name=\"engineTranslateKey(Ljava/security/Key;)Ljava/security/Key;\"/>\n\t</class>\n\t<class name=\"java/security/KeyManagementException\" since=\"1\">\n\t\t<extends name=\"java/security/KeyException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/security/KeyPair\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V\"/>\n\t\t<method name=\"getPrivate()Ljava/security/PrivateKey;\"/>\n\t\t<method name=\"getPublic()Ljava/security/PublicKey;\"/>\n\t</class>\n\t<class name=\"java/security/KeyPairGenerator\" since=\"1\">\n\t\t<extends name=\"java/security/KeyPairGeneratorSpi\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"genKeyPair()Ljava/security/KeyPair;\"/>\n\t\t<method name=\"getAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Ljava/security/KeyPairGenerator;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/KeyPairGenerator;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/KeyPairGenerator;\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"initialize(I)V\"/>\n\t\t<method name=\"initialize(Ljava/security/spec/AlgorithmParameterSpec;)V\"/>\n\t</class>\n\t<class name=\"java/security/KeyPairGeneratorSpi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"generateKeyPair()Ljava/security/KeyPair;\"/>\n\t\t<method name=\"initialize(ILjava/security/SecureRandom;)V\"/>\n\t\t<method name=\"initialize(Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V\"/>\n\t</class>\n\t<class name=\"java/security/KeyRep\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/KeyRep$Type;Ljava/lang/String;Ljava/lang/String;[B)V\"/>\n\t\t<method name=\"readResolve()Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/security/KeyRep$Type\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/security/KeyRep$Type;\"/>\n\t\t<method name=\"values()[Ljava/security/KeyRep$Type;\"/>\n\t\t<field name=\"PRIVATE\"/>\n\t\t<field name=\"PUBLIC\"/>\n\t\t<field name=\"SECRET\"/>\n\t</class>\n\t<class name=\"java/security/KeyStore\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/KeyStoreSpi;Ljava/security/Provider;Ljava/lang/String;)V\"/>\n\t\t<method name=\"aliases()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"containsAlias(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"deleteEntry(Ljava/lang/String;)V\"/>\n\t\t<method name=\"entryInstanceOf(Ljava/lang/String;Ljava/lang/Class;)Z\"/>\n\t\t<method name=\"getCertificate(Ljava/lang/String;)Ljava/security/cert/Certificate;\"/>\n\t\t<method name=\"getCertificateAlias(Ljava/security/cert/Certificate;)Ljava/lang/String;\"/>\n\t\t<method name=\"getCertificateChain(Ljava/lang/String;)[Ljava/security/cert/Certificate;\"/>\n\t\t<method name=\"getCreationDate(Ljava/lang/String;)Ljava/util/Date;\"/>\n\t\t<method name=\"getDefaultType()Ljava/lang/String;\"/>\n\t\t<method name=\"getEntry(Ljava/lang/String;Ljava/security/KeyStore$ProtectionParameter;)Ljava/security/KeyStore$Entry;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Ljava/security/KeyStore;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/KeyStore;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/KeyStore;\"/>\n\t\t<method name=\"getKey(Ljava/lang/String;[C)Ljava/security/Key;\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"getType()Ljava/lang/String;\"/>\n\t\t<method name=\"isCertificateEntry(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isKeyEntry(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"load(Ljava/io/InputStream;[C)V\"/>\n\t\t<method name=\"load(Ljava/security/KeyStore$LoadStoreParameter;)V\"/>\n\t\t<method name=\"setCertificateEntry(Ljava/lang/String;Ljava/security/cert/Certificate;)V\"/>\n\t\t<method name=\"setEntry(Ljava/lang/String;Ljava/security/KeyStore$Entry;Ljava/security/KeyStore$ProtectionParameter;)V\"/>\n\t\t<method name=\"setKeyEntry(Ljava/lang/String;Ljava/security/Key;[C[Ljava/security/cert/Certificate;)V\"/>\n\t\t<method name=\"setKeyEntry(Ljava/lang/String;[B[Ljava/security/cert/Certificate;)V\"/>\n\t\t<method name=\"size()I\"/>\n\t\t<method name=\"store(Ljava/io/OutputStream;[C)V\"/>\n\t\t<method name=\"store(Ljava/security/KeyStore$LoadStoreParameter;)V\"/>\n\t</class>\n\t<class name=\"java/security/KeyStore$Builder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getKeyStore()Ljava/security/KeyStore;\"/>\n\t\t<method name=\"getProtectionParameter(Ljava/lang/String;)Ljava/security/KeyStore$ProtectionParameter;\"/>\n\t\t<method name=\"newInstance(Ljava/lang/String;Ljava/security/Provider;Ljava/io/File;Ljava/security/KeyStore$ProtectionParameter;)Ljava/security/KeyStore$Builder;\"/>\n\t\t<method name=\"newInstance(Ljava/lang/String;Ljava/security/Provider;Ljava/security/KeyStore$ProtectionParameter;)Ljava/security/KeyStore$Builder;\"/>\n\t\t<method name=\"newInstance(Ljava/security/KeyStore;Ljava/security/KeyStore$ProtectionParameter;)Ljava/security/KeyStore$Builder;\"/>\n\t</class>\n\t<class name=\"java/security/KeyStore$CallbackHandlerProtection\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/KeyStore$ProtectionParameter\"/>\n\t\t<method name=\"&lt;init>(Ljavax/security/auth/callback/CallbackHandler;)V\"/>\n\t\t<method name=\"getCallbackHandler()Ljavax/security/auth/callback/CallbackHandler;\"/>\n\t</class>\n\t<class name=\"java/security/KeyStore$Entry\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAttributes()Ljava/util/Set;\" since=\"26\"/>\n\t</class>\n\t<class name=\"java/security/KeyStore$Entry$Attribute\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getValue()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/security/KeyStore$LoadStoreParameter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getProtectionParameter()Ljava/security/KeyStore$ProtectionParameter;\"/>\n\t</class>\n\t<class name=\"java/security/KeyStore$PasswordProtection\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/KeyStore$ProtectionParameter\"/>\n\t\t<implements name=\"javax/security/auth/Destroyable\"/>\n\t\t<method name=\"&lt;init>([C)V\"/>\n\t\t<method name=\"&lt;init>([CLjava/lang/String;Ljava/security/spec/AlgorithmParameterSpec;)V\" since=\"26\"/>\n\t\t<method name=\"getPassword()[C\"/>\n\t\t<method name=\"getProtectionAlgorithm()Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getProtectionParameters()Ljava/security/spec/AlgorithmParameterSpec;\" since=\"26\"/>\n\t</class>\n\t<class name=\"java/security/KeyStore$PrivateKeyEntry\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/KeyStore$Entry\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/PrivateKey;[Ljava/security/cert/Certificate;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/PrivateKey;[Ljava/security/cert/Certificate;Ljava/util/Set;)V\" since=\"26\"/>\n\t\t<method name=\"getCertificate()Ljava/security/cert/Certificate;\"/>\n\t\t<method name=\"getCertificateChain()[Ljava/security/cert/Certificate;\"/>\n\t\t<method name=\"getPrivateKey()Ljava/security/PrivateKey;\"/>\n\t</class>\n\t<class name=\"java/security/KeyStore$ProtectionParameter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"java/security/KeyStore$SecretKeyEntry\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/KeyStore$Entry\"/>\n\t\t<method name=\"&lt;init>(Ljavax/crypto/SecretKey;)V\"/>\n\t\t<method name=\"&lt;init>(Ljavax/crypto/SecretKey;Ljava/util/Set;)V\" since=\"26\"/>\n\t\t<method name=\"getSecretKey()Ljavax/crypto/SecretKey;\"/>\n\t</class>\n\t<class name=\"java/security/KeyStore$TrustedCertificateEntry\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/KeyStore$Entry\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/cert/Certificate;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/cert/Certificate;Ljava/util/Set;)V\" since=\"26\"/>\n\t\t<method name=\"getTrustedCertificate()Ljava/security/cert/Certificate;\"/>\n\t</class>\n\t<class name=\"java/security/KeyStoreException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/security/KeyStoreSpi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"engineAliases()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"engineContainsAlias(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"engineDeleteEntry(Ljava/lang/String;)V\"/>\n\t\t<method name=\"engineEntryInstanceOf(Ljava/lang/String;Ljava/lang/Class;)Z\"/>\n\t\t<method name=\"engineGetCertificate(Ljava/lang/String;)Ljava/security/cert/Certificate;\"/>\n\t\t<method name=\"engineGetCertificateAlias(Ljava/security/cert/Certificate;)Ljava/lang/String;\"/>\n\t\t<method name=\"engineGetCertificateChain(Ljava/lang/String;)[Ljava/security/cert/Certificate;\"/>\n\t\t<method name=\"engineGetCreationDate(Ljava/lang/String;)Ljava/util/Date;\"/>\n\t\t<method name=\"engineGetEntry(Ljava/lang/String;Ljava/security/KeyStore$ProtectionParameter;)Ljava/security/KeyStore$Entry;\"/>\n\t\t<method name=\"engineGetKey(Ljava/lang/String;[C)Ljava/security/Key;\"/>\n\t\t<method name=\"engineIsCertificateEntry(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"engineIsKeyEntry(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"engineLoad(Ljava/io/InputStream;[C)V\"/>\n\t\t<method name=\"engineLoad(Ljava/security/KeyStore$LoadStoreParameter;)V\"/>\n\t\t<method name=\"engineSetCertificateEntry(Ljava/lang/String;Ljava/security/cert/Certificate;)V\"/>\n\t\t<method name=\"engineSetEntry(Ljava/lang/String;Ljava/security/KeyStore$Entry;Ljava/security/KeyStore$ProtectionParameter;)V\"/>\n\t\t<method name=\"engineSetKeyEntry(Ljava/lang/String;Ljava/security/Key;[C[Ljava/security/cert/Certificate;)V\"/>\n\t\t<method name=\"engineSetKeyEntry(Ljava/lang/String;[B[Ljava/security/cert/Certificate;)V\"/>\n\t\t<method name=\"engineSize()I\"/>\n\t\t<method name=\"engineStore(Ljava/io/OutputStream;[C)V\"/>\n\t\t<method name=\"engineStore(Ljava/security/KeyStore$LoadStoreParameter;)V\"/>\n\t</class>\n\t<class name=\"java/security/MessageDigest\" since=\"1\">\n\t\t<extends name=\"java/security/MessageDigestSpi\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"digest()[B\"/>\n\t\t<method name=\"digest([B)[B\"/>\n\t\t<method name=\"digest([BII)I\"/>\n\t\t<method name=\"getAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getDigestLength()I\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Ljava/security/MessageDigest;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/MessageDigest;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/MessageDigest;\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"isEqual([B[B)Z\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"update(B)V\"/>\n\t\t<method name=\"update(Ljava/nio/ByteBuffer;)V\"/>\n\t\t<method name=\"update([B)V\"/>\n\t\t<method name=\"update([BII)V\"/>\n\t</class>\n\t<class name=\"java/security/MessageDigestSpi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"engineDigest()[B\"/>\n\t\t<method name=\"engineDigest([BII)I\"/>\n\t\t<method name=\"engineGetDigestLength()I\"/>\n\t\t<method name=\"engineReset()V\"/>\n\t\t<method name=\"engineUpdate(B)V\"/>\n\t\t<method name=\"engineUpdate(Ljava/nio/ByteBuffer;)V\"/>\n\t\t<method name=\"engineUpdate([BII)V\"/>\n\t</class>\n\t<class name=\"java/security/NoSuchAlgorithmException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/security/NoSuchProviderException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/security/PKCS12Attribute\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/KeyStore$Entry$Attribute\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>([B)V\"/>\n\t\t<method name=\"getEncoded()[B\"/>\n\t</class>\n\t<class name=\"java/security/Permission\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/security/Guard\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getActions()Ljava/lang/String;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"implies(Ljava/security/Permission;)Z\"/>\n\t\t<method name=\"newPermissionCollection()Ljava/security/PermissionCollection;\"/>\n\t</class>\n\t<class name=\"java/security/PermissionCollection\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"add(Ljava/security/Permission;)V\"/>\n\t\t<method name=\"elements()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"implies(Ljava/security/Permission;)Z\"/>\n\t\t<method name=\"isReadOnly()Z\"/>\n\t\t<method name=\"setReadOnly()V\"/>\n\t</class>\n\t<class name=\"java/security/Permissions\" since=\"1\">\n\t\t<extends name=\"java/security/PermissionCollection\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/security/Policy\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Policy$Parameters;)Ljava/security/Policy;\" since=\"9\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Policy$Parameters;Ljava/lang/String;)Ljava/security/Policy;\" since=\"9\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Policy$Parameters;Ljava/security/Provider;)Ljava/security/Policy;\" since=\"9\"/>\n\t\t<method name=\"getParameters()Ljava/security/Policy$Parameters;\" since=\"9\"/>\n\t\t<method name=\"getPermissions(Ljava/security/CodeSource;)Ljava/security/PermissionCollection;\"/>\n\t\t<method name=\"getPermissions(Ljava/security/ProtectionDomain;)Ljava/security/PermissionCollection;\"/>\n\t\t<method name=\"getPolicy()Ljava/security/Policy;\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\" since=\"9\"/>\n\t\t<method name=\"getType()Ljava/lang/String;\" since=\"9\"/>\n\t\t<method name=\"implies(Ljava/security/ProtectionDomain;Ljava/security/Permission;)Z\"/>\n\t\t<method name=\"refresh()V\"/>\n\t\t<method name=\"setPolicy(Ljava/security/Policy;)V\"/>\n\t\t<field name=\"UNSUPPORTED_EMPTY_COLLECTION\" since=\"9\"/>\n\t</class>\n\t<class name=\"java/security/Policy$Parameters\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"java/security/PolicySpi\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"engineGetPermissions(Ljava/security/CodeSource;)Ljava/security/PermissionCollection;\"/>\n\t\t<method name=\"engineGetPermissions(Ljava/security/ProtectionDomain;)Ljava/security/PermissionCollection;\"/>\n\t\t<method name=\"engineImplies(Ljava/security/ProtectionDomain;Ljava/security/Permission;)Z\"/>\n\t\t<method name=\"engineRefresh()V\"/>\n\t</class>\n\t<class name=\"java/security/Principal\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"implies(Ljavax/security/auth/Subject;)Z\" since=\"26\"/>\n\t</class>\n\t<class name=\"java/security/PrivateKey\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/Key\"/>\n\t\t<implements name=\"javax/security/auth/Destroyable\" since=\"26\"/>\n\t\t<field name=\"serialVersionUID\"/>\n\t</class>\n\t<class name=\"java/security/PrivilegedAction\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"run()Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/security/PrivilegedActionException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Exception;)V\"/>\n\t\t<method name=\"getException()Ljava/lang/Exception;\"/>\n\t</class>\n\t<class name=\"java/security/PrivilegedExceptionAction\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"run()Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/security/ProtectionDomain\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/CodeSource;Ljava/security/PermissionCollection;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/CodeSource;Ljava/security/PermissionCollection;Ljava/lang/ClassLoader;[Ljava/security/Principal;)V\"/>\n\t\t<method name=\"getClassLoader()Ljava/lang/ClassLoader;\"/>\n\t\t<method name=\"getCodeSource()Ljava/security/CodeSource;\"/>\n\t\t<method name=\"getPermissions()Ljava/security/PermissionCollection;\"/>\n\t\t<method name=\"getPrincipals()[Ljava/security/Principal;\"/>\n\t\t<method name=\"implies(Ljava/security/Permission;)Z\"/>\n\t</class>\n\t<class name=\"java/security/Provider\" since=\"1\">\n\t\t<extends name=\"java/util/Properties\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;DLjava/lang/String;)V\"/>\n\t\t<method name=\"getInfo()Ljava/lang/String;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getService(Ljava/lang/String;Ljava/lang/String;)Ljava/security/Provider$Service;\"/>\n\t\t<method name=\"getServices()Ljava/util/Set;\"/>\n\t\t<method name=\"getVersion()D\"/>\n\t\t<method name=\"putService(Ljava/security/Provider$Service;)V\"/>\n\t\t<method name=\"removeService(Ljava/security/Provider$Service;)V\"/>\n\t</class>\n\t<class name=\"java/security/Provider$Service\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/Provider;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/Map;)V\"/>\n\t\t<method name=\"getAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getAttribute(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getClassName()Ljava/lang/String;\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"getType()Ljava/lang/String;\"/>\n\t\t<method name=\"newInstance(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"supportsParameter(Ljava/lang/Object;)Z\"/>\n\t</class>\n\t<class name=\"java/security/ProviderException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/security/PublicKey\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/Key\"/>\n\t\t<field name=\"serialVersionUID\"/>\n\t</class>\n\t<class name=\"java/security/SecureClassLoader\" since=\"1\">\n\t\t<extends name=\"java/lang/ClassLoader\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/ClassLoader;)V\"/>\n\t\t<method name=\"defineClass(Ljava/lang/String;Ljava/nio/ByteBuffer;Ljava/security/CodeSource;)Ljava/lang/Class;\"/>\n\t\t<method name=\"defineClass(Ljava/lang/String;[BIILjava/security/CodeSource;)Ljava/lang/Class;\"/>\n\t\t<method name=\"getPermissions(Ljava/security/CodeSource;)Ljava/security/PermissionCollection;\"/>\n\t</class>\n\t<class name=\"java/security/SecureRandom\" since=\"1\">\n\t\t<extends name=\"java/util/Random\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/SecureRandomSpi;Ljava/security/Provider;)V\"/>\n\t\t<method name=\"&lt;init>([B)V\"/>\n\t\t<method name=\"generateSeed(I)[B\"/>\n\t\t<method name=\"getAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Ljava/security/SecureRandom;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/SecureRandom;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/SecureRandom;\"/>\n\t\t<method name=\"getInstanceStrong()Ljava/security/SecureRandom;\" since=\"26\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"getSeed(I)[B\"/>\n\t\t<method name=\"setSeed([B)V\"/>\n\t</class>\n\t<class name=\"java/security/SecureRandomSpi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"engineGenerateSeed(I)[B\"/>\n\t\t<method name=\"engineNextBytes([B)V\"/>\n\t\t<method name=\"engineSetSeed([B)V\"/>\n\t</class>\n\t<class name=\"java/security/Security\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addProvider(Ljava/security/Provider;)I\"/>\n\t\t<method name=\"getAlgorithmProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"getAlgorithms(Ljava/lang/String;)Ljava/util/Set;\"/>\n\t\t<method name=\"getProperty(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getProvider(Ljava/lang/String;)Ljava/security/Provider;\"/>\n\t\t<method name=\"getProviders()[Ljava/security/Provider;\"/>\n\t\t<method name=\"getProviders(Ljava/lang/String;)[Ljava/security/Provider;\"/>\n\t\t<method name=\"getProviders(Ljava/util/Map;)[Ljava/security/Provider;\"/>\n\t\t<method name=\"insertProviderAt(Ljava/security/Provider;I)I\"/>\n\t\t<method name=\"removeProvider(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setProperty(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/security/SecurityPermission\" since=\"1\">\n\t\t<extends name=\"java/security/BasicPermission\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/security/Signature\" since=\"1\">\n\t\t<extends name=\"java/security/SignatureSpi\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Ljava/security/Signature;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/Signature;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/Signature;\"/>\n\t\t<method name=\"getParameter(Ljava/lang/String;)Ljava/lang/Object;\" deprecated=\"15\"/>\n\t\t<method name=\"getParameters()Ljava/security/AlgorithmParameters;\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"initSign(Ljava/security/PrivateKey;)V\"/>\n\t\t<method name=\"initSign(Ljava/security/PrivateKey;Ljava/security/SecureRandom;)V\"/>\n\t\t<method name=\"initVerify(Ljava/security/PublicKey;)V\"/>\n\t\t<method name=\"initVerify(Ljava/security/cert/Certificate;)V\"/>\n\t\t<method name=\"setParameter(Ljava/lang/String;Ljava/lang/Object;)V\" deprecated=\"15\"/>\n\t\t<method name=\"setParameter(Ljava/security/spec/AlgorithmParameterSpec;)V\"/>\n\t\t<method name=\"sign()[B\"/>\n\t\t<method name=\"sign([BII)I\"/>\n\t\t<method name=\"update(B)V\"/>\n\t\t<method name=\"update(Ljava/nio/ByteBuffer;)V\"/>\n\t\t<method name=\"update([B)V\"/>\n\t\t<method name=\"update([BII)V\"/>\n\t\t<method name=\"verify([B)Z\"/>\n\t\t<method name=\"verify([BII)Z\"/>\n\t\t<field name=\"SIGN\"/>\n\t\t<field name=\"UNINITIALIZED\"/>\n\t\t<field name=\"VERIFY\"/>\n\t\t<field name=\"state\"/>\n\t</class>\n\t<class name=\"java/security/SignatureException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/security/SignatureSpi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"engineGetParameter(Ljava/lang/String;)Ljava/lang/Object;\" deprecated=\"15\"/>\n\t\t<method name=\"engineGetParameters()Ljava/security/AlgorithmParameters;\"/>\n\t\t<method name=\"engineInitSign(Ljava/security/PrivateKey;)V\"/>\n\t\t<method name=\"engineInitSign(Ljava/security/PrivateKey;Ljava/security/SecureRandom;)V\"/>\n\t\t<method name=\"engineInitVerify(Ljava/security/PublicKey;)V\"/>\n\t\t<method name=\"engineSetParameter(Ljava/lang/String;Ljava/lang/Object;)V\" deprecated=\"15\"/>\n\t\t<method name=\"engineSetParameter(Ljava/security/spec/AlgorithmParameterSpec;)V\"/>\n\t\t<method name=\"engineSign()[B\"/>\n\t\t<method name=\"engineSign([BII)I\"/>\n\t\t<method name=\"engineUpdate(B)V\"/>\n\t\t<method name=\"engineUpdate(Ljava/nio/ByteBuffer;)V\"/>\n\t\t<method name=\"engineUpdate([BII)V\"/>\n\t\t<method name=\"engineVerify([B)Z\"/>\n\t\t<method name=\"engineVerify([BII)Z\"/>\n\t\t<field name=\"appRandom\"/>\n\t</class>\n\t<class name=\"java/security/SignedObject\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Serializable;Ljava/security/PrivateKey;Ljava/security/Signature;)V\"/>\n\t\t<method name=\"getAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getObject()Ljava/lang/Object;\"/>\n\t\t<method name=\"getSignature()[B\"/>\n\t\t<method name=\"verify(Ljava/security/PublicKey;Ljava/security/Signature;)Z\"/>\n\t</class>\n\t<class name=\"java/security/Signer\" since=\"1\" deprecated=\"3\">\n\t\t<extends name=\"java/security/Identity\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/security/IdentityScope;)V\" deprecated=\"29\"/>\n\t\t<method name=\"getPrivateKey()Ljava/security/PrivateKey;\" deprecated=\"29\"/>\n\t\t<method name=\"setKeyPair(Ljava/security/KeyPair;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"java/security/Timestamp\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Date;Ljava/security/cert/CertPath;)V\"/>\n\t\t<method name=\"getSignerCertPath()Ljava/security/cert/CertPath;\"/>\n\t\t<method name=\"getTimestamp()Ljava/util/Date;\"/>\n\t</class>\n\t<class name=\"java/security/UnrecoverableEntryException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/security/UnrecoverableKeyException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\" removed=\"9\"/>\n\t\t<extends name=\"java/security/UnrecoverableEntryException\" since=\"9\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/security/UnresolvedPermission\" since=\"1\">\n\t\t<extends name=\"java/security/Permission\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/security/cert/Certificate;)V\"/>\n\t\t<method name=\"getUnresolvedActions()Ljava/lang/String;\"/>\n\t\t<method name=\"getUnresolvedCerts()[Ljava/security/cert/Certificate;\"/>\n\t\t<method name=\"getUnresolvedName()Ljava/lang/String;\"/>\n\t\t<method name=\"getUnresolvedType()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/security/acl/Acl\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/acl/Owner\"/>\n\t\t<method name=\"addEntry(Ljava/security/Principal;Ljava/security/acl/AclEntry;)Z\"/>\n\t\t<method name=\"checkPermission(Ljava/security/Principal;Ljava/security/acl/Permission;)Z\"/>\n\t\t<method name=\"entries()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getPermissions(Ljava/security/Principal;)Ljava/util/Enumeration;\"/>\n\t\t<method name=\"removeEntry(Ljava/security/Principal;Ljava/security/acl/AclEntry;)Z\"/>\n\t\t<method name=\"setName(Ljava/security/Principal;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/security/acl/AclEntry\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"addPermission(Ljava/security/acl/Permission;)Z\"/>\n\t\t<method name=\"checkPermission(Ljava/security/acl/Permission;)Z\"/>\n\t\t<method name=\"getPrincipal()Ljava/security/Principal;\"/>\n\t\t<method name=\"isNegative()Z\"/>\n\t\t<method name=\"permissions()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"removePermission(Ljava/security/acl/Permission;)Z\"/>\n\t\t<method name=\"setNegativePermissions()V\"/>\n\t\t<method name=\"setPrincipal(Ljava/security/Principal;)Z\"/>\n\t</class>\n\t<class name=\"java/security/acl/AclNotFoundException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/security/acl/Group\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/Principal\"/>\n\t\t<method name=\"addMember(Ljava/security/Principal;)Z\"/>\n\t\t<method name=\"isMember(Ljava/security/Principal;)Z\"/>\n\t\t<method name=\"members()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"removeMember(Ljava/security/Principal;)Z\"/>\n\t</class>\n\t<class name=\"java/security/acl/LastOwnerException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/security/acl/NotOwnerException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/security/acl/Owner\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addOwner(Ljava/security/Principal;Ljava/security/Principal;)Z\"/>\n\t\t<method name=\"deleteOwner(Ljava/security/Principal;Ljava/security/Principal;)Z\"/>\n\t\t<method name=\"isOwner(Ljava/security/Principal;)Z\"/>\n\t</class>\n\t<class name=\"java/security/acl/Permission\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"java/security/cert/CRL\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getType()Ljava/lang/String;\"/>\n\t\t<method name=\"isRevoked(Ljava/security/cert/Certificate;)Z\"/>\n\t</class>\n\t<class name=\"java/security/cert/CRLException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/security/cert/CRLReason\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/security/cert/CRLReason;\"/>\n\t\t<method name=\"values()[Ljava/security/cert/CRLReason;\"/>\n\t\t<field name=\"AA_COMPROMISE\"/>\n\t\t<field name=\"AFFILIATION_CHANGED\"/>\n\t\t<field name=\"CA_COMPROMISE\"/>\n\t\t<field name=\"CERTIFICATE_HOLD\"/>\n\t\t<field name=\"CESSATION_OF_OPERATION\"/>\n\t\t<field name=\"KEY_COMPROMISE\"/>\n\t\t<field name=\"PRIVILEGE_WITHDRAWN\"/>\n\t\t<field name=\"REMOVE_FROM_CRL\"/>\n\t\t<field name=\"SUPERSEDED\"/>\n\t\t<field name=\"UNSPECIFIED\"/>\n\t\t<field name=\"UNUSED\"/>\n\t</class>\n\t<class name=\"java/security/cert/CRLSelector\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"match(Ljava/security/cert/CRL;)Z\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertPath\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getCertificates()Ljava/util/List;\"/>\n\t\t<method name=\"getEncoded()[B\"/>\n\t\t<method name=\"getEncoded(Ljava/lang/String;)[B\"/>\n\t\t<method name=\"getEncodings()Ljava/util/Iterator;\"/>\n\t\t<method name=\"getType()Ljava/lang/String;\"/>\n\t\t<method name=\"writeReplace()Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertPath$CertPathRep\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;[B)V\"/>\n\t\t<method name=\"readResolve()Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertPathBuilder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/cert/CertPathBuilderSpi;Ljava/security/Provider;Ljava/lang/String;)V\"/>\n\t\t<method name=\"build(Ljava/security/cert/CertPathParameters;)Ljava/security/cert/CertPathBuilderResult;\"/>\n\t\t<method name=\"getAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getDefaultType()Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Ljava/security/cert/CertPathBuilder;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/cert/CertPathBuilder;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/cert/CertPathBuilder;\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"getRevocationChecker()Ljava/security/cert/CertPathChecker;\" since=\"24\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertPathBuilderException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertPathBuilderResult\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"getCertPath()Ljava/security/cert/CertPath;\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertPathBuilderSpi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"engineBuild(Ljava/security/cert/CertPathParameters;)Ljava/security/cert/CertPathBuilderResult;\"/>\n\t\t<method name=\"engineGetRevocationChecker()Ljava/security/cert/CertPathChecker;\" since=\"24\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertPathChecker\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"check(Ljava/security/cert/Certificate;)V\"/>\n\t\t<method name=\"init(Z)V\"/>\n\t\t<method name=\"isForwardCheckingSupported()Z\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertPathParameters\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertPathValidator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/cert/CertPathValidatorSpi;Ljava/security/Provider;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getDefaultType()Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Ljava/security/cert/CertPathValidator;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/cert/CertPathValidator;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/cert/CertPathValidator;\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"getRevocationChecker()Ljava/security/cert/CertPathChecker;\" since=\"24\"/>\n\t\t<method name=\"validate(Ljava/security/cert/CertPath;Ljava/security/cert/CertPathParameters;)Ljava/security/cert/CertPathValidatorResult;\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertPathValidatorException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;Ljava/security/cert/CertPath;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;Ljava/security/cert/CertPath;ILjava/security/cert/CertPathValidatorException$Reason;)V\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"getCertPath()Ljava/security/cert/CertPath;\"/>\n\t\t<method name=\"getIndex()I\"/>\n\t\t<method name=\"getReason()Ljava/security/cert/CertPathValidatorException$Reason;\" since=\"24\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertPathValidatorException$BasicReason\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<implements name=\"java/security/cert/CertPathValidatorException$Reason\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/security/cert/CertPathValidatorException$BasicReason;\"/>\n\t\t<method name=\"values()[Ljava/security/cert/CertPathValidatorException$BasicReason;\"/>\n\t\t<field name=\"ALGORITHM_CONSTRAINED\"/>\n\t\t<field name=\"EXPIRED\"/>\n\t\t<field name=\"INVALID_SIGNATURE\"/>\n\t\t<field name=\"NOT_YET_VALID\"/>\n\t\t<field name=\"REVOKED\"/>\n\t\t<field name=\"UNDETERMINED_REVOCATION_STATUS\"/>\n\t\t<field name=\"UNSPECIFIED\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertPathValidatorException$Reason\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertPathValidatorResult\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertPathValidatorSpi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"engineGetRevocationChecker()Ljava/security/cert/CertPathChecker;\" since=\"24\"/>\n\t\t<method name=\"engineValidate(Ljava/security/cert/CertPath;Ljava/security/cert/CertPathParameters;)Ljava/security/cert/CertPathValidatorResult;\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertSelector\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"match(Ljava/security/cert/Certificate;)Z\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertStore\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/cert/CertStoreSpi;Ljava/security/Provider;Ljava/lang/String;Ljava/security/cert/CertStoreParameters;)V\"/>\n\t\t<method name=\"getCRLs(Ljava/security/cert/CRLSelector;)Ljava/util/Collection;\"/>\n\t\t<method name=\"getCertStoreParameters()Ljava/security/cert/CertStoreParameters;\"/>\n\t\t<method name=\"getCertificates(Ljava/security/cert/CertSelector;)Ljava/util/Collection;\"/>\n\t\t<method name=\"getDefaultType()Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/cert/CertStoreParameters;)Ljava/security/cert/CertStore;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/cert/CertStoreParameters;Ljava/lang/String;)Ljava/security/cert/CertStore;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/cert/CertStoreParameters;Ljava/security/Provider;)Ljava/security/cert/CertStore;\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"getType()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertStoreException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertStoreParameters\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertStoreSpi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/cert/CertStoreParameters;)V\"/>\n\t\t<method name=\"engineGetCRLs(Ljava/security/cert/CRLSelector;)Ljava/util/Collection;\"/>\n\t\t<method name=\"engineGetCertificates(Ljava/security/cert/CertSelector;)Ljava/util/Collection;\"/>\n\t</class>\n\t<class name=\"java/security/cert/Certificate\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getEncoded()[B\"/>\n\t\t<method name=\"getPublicKey()Ljava/security/PublicKey;\"/>\n\t\t<method name=\"getType()Ljava/lang/String;\"/>\n\t\t<method name=\"verify(Ljava/security/PublicKey;)V\"/>\n\t\t<method name=\"verify(Ljava/security/PublicKey;Ljava/lang/String;)V\"/>\n\t\t<method name=\"verify(Ljava/security/PublicKey;Ljava/security/Provider;)V\" since=\"26\"/>\n\t\t<method name=\"writeReplace()Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/security/cert/Certificate$CertificateRep\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;[B)V\"/>\n\t\t<method name=\"readResolve()Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertificateEncodingException\" since=\"1\">\n\t\t<extends name=\"java/security/cert/CertificateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertificateException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertificateExpiredException\" since=\"1\">\n\t\t<extends name=\"java/security/cert/CertificateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertificateFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/cert/CertificateFactorySpi;Ljava/security/Provider;Ljava/lang/String;)V\"/>\n\t\t<method name=\"generateCRL(Ljava/io/InputStream;)Ljava/security/cert/CRL;\"/>\n\t\t<method name=\"generateCRLs(Ljava/io/InputStream;)Ljava/util/Collection;\"/>\n\t\t<method name=\"generateCertPath(Ljava/io/InputStream;)Ljava/security/cert/CertPath;\"/>\n\t\t<method name=\"generateCertPath(Ljava/io/InputStream;Ljava/lang/String;)Ljava/security/cert/CertPath;\"/>\n\t\t<method name=\"generateCertPath(Ljava/util/List;)Ljava/security/cert/CertPath;\"/>\n\t\t<method name=\"generateCertificate(Ljava/io/InputStream;)Ljava/security/cert/Certificate;\"/>\n\t\t<method name=\"generateCertificates(Ljava/io/InputStream;)Ljava/util/Collection;\"/>\n\t\t<method name=\"getCertPathEncodings()Ljava/util/Iterator;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Ljava/security/cert/CertificateFactory;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/cert/CertificateFactory;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/cert/CertificateFactory;\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"getType()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertificateFactorySpi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"engineGenerateCRL(Ljava/io/InputStream;)Ljava/security/cert/CRL;\"/>\n\t\t<method name=\"engineGenerateCRLs(Ljava/io/InputStream;)Ljava/util/Collection;\"/>\n\t\t<method name=\"engineGenerateCertPath(Ljava/io/InputStream;)Ljava/security/cert/CertPath;\"/>\n\t\t<method name=\"engineGenerateCertPath(Ljava/io/InputStream;Ljava/lang/String;)Ljava/security/cert/CertPath;\"/>\n\t\t<method name=\"engineGenerateCertPath(Ljava/util/List;)Ljava/security/cert/CertPath;\"/>\n\t\t<method name=\"engineGenerateCertificate(Ljava/io/InputStream;)Ljava/security/cert/Certificate;\"/>\n\t\t<method name=\"engineGenerateCertificates(Ljava/io/InputStream;)Ljava/util/Collection;\"/>\n\t\t<method name=\"engineGetCertPathEncodings()Ljava/util/Iterator;\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertificateNotYetValidException\" since=\"1\">\n\t\t<extends name=\"java/security/cert/CertificateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertificateParsingException\" since=\"1\">\n\t\t<extends name=\"java/security/cert/CertificateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/security/cert/CertificateRevokedException\" since=\"24\">\n\t\t<extends name=\"java/security/cert/CertificateException\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Date;Ljava/security/cert/CRLReason;Ljavax/security/auth/x500/X500Principal;Ljava/util/Map;)V\"/>\n\t\t<method name=\"getAuthorityName()Ljavax/security/auth/x500/X500Principal;\"/>\n\t\t<method name=\"getExtensions()Ljava/util/Map;\"/>\n\t\t<method name=\"getInvalidityDate()Ljava/util/Date;\"/>\n\t\t<method name=\"getRevocationDate()Ljava/util/Date;\"/>\n\t\t<method name=\"getRevocationReason()Ljava/security/cert/CRLReason;\"/>\n\t</class>\n\t<class name=\"java/security/cert/CollectionCertStoreParameters\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/cert/CertStoreParameters\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Collection;)V\"/>\n\t\t<method name=\"getCollection()Ljava/util/Collection;\"/>\n\t</class>\n\t<class name=\"java/security/cert/Extension\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"encode(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\"/>\n\t\t<method name=\"getValue()[B\"/>\n\t\t<method name=\"isCritical()Z\"/>\n\t</class>\n\t<class name=\"java/security/cert/LDAPCertStoreParameters\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/cert/CertStoreParameters\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"getPort()I\"/>\n\t\t<method name=\"getServerName()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/security/cert/PKIXBuilderParameters\" since=\"1\">\n\t\t<extends name=\"java/security/cert/PKIXParameters\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/KeyStore;Ljava/security/cert/CertSelector;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Set;Ljava/security/cert/CertSelector;)V\"/>\n\t\t<method name=\"getMaxPathLength()I\"/>\n\t\t<method name=\"setMaxPathLength(I)V\"/>\n\t</class>\n\t<class name=\"java/security/cert/PKIXCertPathBuilderResult\" since=\"1\">\n\t\t<extends name=\"java/security/cert/PKIXCertPathValidatorResult\"/>\n\t\t<implements name=\"java/security/cert/CertPathBuilderResult\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/cert/CertPath;Ljava/security/cert/TrustAnchor;Ljava/security/cert/PolicyNode;Ljava/security/PublicKey;)V\"/>\n\t</class>\n\t<class name=\"java/security/cert/PKIXCertPathChecker\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"java/security/cert/CertPathChecker\" since=\"24\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"check(Ljava/security/cert/Certificate;Ljava/util/Collection;)V\"/>\n\t\t<method name=\"getSupportedExtensions()Ljava/util/Set;\"/>\n\t\t<method name=\"init(Z)V\"/>\n\t\t<method name=\"isForwardCheckingSupported()Z\"/>\n\t</class>\n\t<class name=\"java/security/cert/PKIXCertPathValidatorResult\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/cert/CertPathValidatorResult\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/cert/TrustAnchor;Ljava/security/cert/PolicyNode;Ljava/security/PublicKey;)V\"/>\n\t\t<method name=\"getPolicyTree()Ljava/security/cert/PolicyNode;\"/>\n\t\t<method name=\"getPublicKey()Ljava/security/PublicKey;\"/>\n\t\t<method name=\"getTrustAnchor()Ljava/security/cert/TrustAnchor;\"/>\n\t</class>\n\t<class name=\"java/security/cert/PKIXParameters\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/cert/CertPathParameters\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/KeyStore;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Set;)V\"/>\n\t\t<method name=\"addCertPathChecker(Ljava/security/cert/PKIXCertPathChecker;)V\"/>\n\t\t<method name=\"addCertStore(Ljava/security/cert/CertStore;)V\"/>\n\t\t<method name=\"getCertPathCheckers()Ljava/util/List;\"/>\n\t\t<method name=\"getCertStores()Ljava/util/List;\"/>\n\t\t<method name=\"getDate()Ljava/util/Date;\"/>\n\t\t<method name=\"getInitialPolicies()Ljava/util/Set;\"/>\n\t\t<method name=\"getPolicyQualifiersRejected()Z\"/>\n\t\t<method name=\"getSigProvider()Ljava/lang/String;\"/>\n\t\t<method name=\"getTargetCertConstraints()Ljava/security/cert/CertSelector;\"/>\n\t\t<method name=\"getTrustAnchors()Ljava/util/Set;\"/>\n\t\t<method name=\"isAnyPolicyInhibited()Z\"/>\n\t\t<method name=\"isExplicitPolicyRequired()Z\"/>\n\t\t<method name=\"isPolicyMappingInhibited()Z\"/>\n\t\t<method name=\"isRevocationEnabled()Z\"/>\n\t\t<method name=\"setAnyPolicyInhibited(Z)V\"/>\n\t\t<method name=\"setCertPathCheckers(Ljava/util/List;)V\"/>\n\t\t<method name=\"setCertStores(Ljava/util/List;)V\"/>\n\t\t<method name=\"setDate(Ljava/util/Date;)V\"/>\n\t\t<method name=\"setExplicitPolicyRequired(Z)V\"/>\n\t\t<method name=\"setInitialPolicies(Ljava/util/Set;)V\"/>\n\t\t<method name=\"setPolicyMappingInhibited(Z)V\"/>\n\t\t<method name=\"setPolicyQualifiersRejected(Z)V\"/>\n\t\t<method name=\"setRevocationEnabled(Z)V\"/>\n\t\t<method name=\"setSigProvider(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setTargetCertConstraints(Ljava/security/cert/CertSelector;)V\"/>\n\t\t<method name=\"setTrustAnchors(Ljava/util/Set;)V\"/>\n\t</class>\n\t<class name=\"java/security/cert/PKIXReason\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<implements name=\"java/security/cert/CertPathValidatorException$Reason\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/security/cert/PKIXReason;\"/>\n\t\t<method name=\"values()[Ljava/security/cert/PKIXReason;\"/>\n\t\t<field name=\"INVALID_KEY_USAGE\"/>\n\t\t<field name=\"INVALID_NAME\"/>\n\t\t<field name=\"INVALID_POLICY\"/>\n\t\t<field name=\"NAME_CHAINING\"/>\n\t\t<field name=\"NOT_CA_CERT\"/>\n\t\t<field name=\"NO_TRUST_ANCHOR\"/>\n\t\t<field name=\"PATH_TOO_LONG\"/>\n\t\t<field name=\"UNRECOGNIZED_CRIT_EXT\"/>\n\t</class>\n\t<class name=\"java/security/cert/PKIXRevocationChecker\" since=\"24\">\n\t\t<extends name=\"java/security/cert/PKIXCertPathChecker\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"clone()Ljava/security/cert/PKIXRevocationChecker;\"/>\n\t\t<method name=\"getOcspExtensions()Ljava/util/List;\"/>\n\t\t<method name=\"getOcspResponder()Ljava/net/URI;\"/>\n\t\t<method name=\"getOcspResponderCert()Ljava/security/cert/X509Certificate;\"/>\n\t\t<method name=\"getOcspResponses()Ljava/util/Map;\"/>\n\t\t<method name=\"getOptions()Ljava/util/Set;\"/>\n\t\t<method name=\"getSoftFailExceptions()Ljava/util/List;\"/>\n\t\t<method name=\"setOcspExtensions(Ljava/util/List;)V\"/>\n\t\t<method name=\"setOcspResponder(Ljava/net/URI;)V\"/>\n\t\t<method name=\"setOcspResponderCert(Ljava/security/cert/X509Certificate;)V\"/>\n\t\t<method name=\"setOcspResponses(Ljava/util/Map;)V\"/>\n\t\t<method name=\"setOptions(Ljava/util/Set;)V\"/>\n\t</class>\n\t<class name=\"java/security/cert/PKIXRevocationChecker$Option\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/security/cert/PKIXRevocationChecker$Option;\"/>\n\t\t<method name=\"values()[Ljava/security/cert/PKIXRevocationChecker$Option;\"/>\n\t\t<field name=\"NO_FALLBACK\"/>\n\t\t<field name=\"ONLY_END_ENTITY\"/>\n\t\t<field name=\"PREFER_CRLS\"/>\n\t\t<field name=\"SOFT_FAIL\"/>\n\t</class>\n\t<class name=\"java/security/cert/PolicyNode\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getChildren()Ljava/util/Iterator;\"/>\n\t\t<method name=\"getDepth()I\"/>\n\t\t<method name=\"getExpectedPolicies()Ljava/util/Set;\"/>\n\t\t<method name=\"getParent()Ljava/security/cert/PolicyNode;\"/>\n\t\t<method name=\"getPolicyQualifiers()Ljava/util/Set;\"/>\n\t\t<method name=\"getValidPolicy()Ljava/lang/String;\"/>\n\t\t<method name=\"isCritical()Z\"/>\n\t</class>\n\t<class name=\"java/security/cert/PolicyQualifierInfo\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>([B)V\"/>\n\t\t<method name=\"getEncoded()[B\"/>\n\t\t<method name=\"getPolicyQualifier()[B\"/>\n\t\t<method name=\"getPolicyQualifierId()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/security/cert/TrustAnchor\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/security/PublicKey;[B)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/cert/X509Certificate;[B)V\"/>\n\t\t<method name=\"&lt;init>(Ljavax/security/auth/x500/X500Principal;Ljava/security/PublicKey;[B)V\"/>\n\t\t<method name=\"getCA()Ljavax/security/auth/x500/X500Principal;\"/>\n\t\t<method name=\"getCAName()Ljava/lang/String;\"/>\n\t\t<method name=\"getCAPublicKey()Ljava/security/PublicKey;\"/>\n\t\t<method name=\"getNameConstraints()[B\"/>\n\t\t<method name=\"getTrustedCert()Ljava/security/cert/X509Certificate;\"/>\n\t</class>\n\t<class name=\"java/security/cert/X509CRL\" since=\"1\">\n\t\t<extends name=\"java/security/cert/CRL\"/>\n\t\t<implements name=\"java/security/cert/X509Extension\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getEncoded()[B\"/>\n\t\t<method name=\"getIssuerDN()Ljava/security/Principal;\"/>\n\t\t<method name=\"getIssuerX500Principal()Ljavax/security/auth/x500/X500Principal;\"/>\n\t\t<method name=\"getNextUpdate()Ljava/util/Date;\"/>\n\t\t<method name=\"getRevokedCertificate(Ljava/math/BigInteger;)Ljava/security/cert/X509CRLEntry;\"/>\n\t\t<method name=\"getRevokedCertificate(Ljava/security/cert/X509Certificate;)Ljava/security/cert/X509CRLEntry;\"/>\n\t\t<method name=\"getRevokedCertificates()Ljava/util/Set;\"/>\n\t\t<method name=\"getSigAlgName()Ljava/lang/String;\"/>\n\t\t<method name=\"getSigAlgOID()Ljava/lang/String;\"/>\n\t\t<method name=\"getSigAlgParams()[B\"/>\n\t\t<method name=\"getSignature()[B\"/>\n\t\t<method name=\"getTBSCertList()[B\"/>\n\t\t<method name=\"getThisUpdate()Ljava/util/Date;\"/>\n\t\t<method name=\"getVersion()I\"/>\n\t\t<method name=\"verify(Ljava/security/PublicKey;)V\"/>\n\t\t<method name=\"verify(Ljava/security/PublicKey;Ljava/lang/String;)V\"/>\n\t\t<method name=\"verify(Ljava/security/PublicKey;Ljava/security/Provider;)V\" since=\"26\"/>\n\t</class>\n\t<class name=\"java/security/cert/X509CRLEntry\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/cert/X509Extension\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getCertificateIssuer()Ljavax/security/auth/x500/X500Principal;\"/>\n\t\t<method name=\"getEncoded()[B\"/>\n\t\t<method name=\"getRevocationDate()Ljava/util/Date;\"/>\n\t\t<method name=\"getRevocationReason()Ljava/security/cert/CRLReason;\" since=\"24\"/>\n\t\t<method name=\"getSerialNumber()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"hasExtensions()Z\"/>\n\t</class>\n\t<class name=\"java/security/cert/X509CRLSelector\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/cert/CRLSelector\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addIssuer(Ljavax/security/auth/x500/X500Principal;)V\"/>\n\t\t<method name=\"addIssuerName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"addIssuerName([B)V\"/>\n\t\t<method name=\"getCertificateChecking()Ljava/security/cert/X509Certificate;\"/>\n\t\t<method name=\"getDateAndTime()Ljava/util/Date;\"/>\n\t\t<method name=\"getIssuerNames()Ljava/util/Collection;\"/>\n\t\t<method name=\"getIssuers()Ljava/util/Collection;\"/>\n\t\t<method name=\"getMaxCRL()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getMinCRL()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"setCertificateChecking(Ljava/security/cert/X509Certificate;)V\"/>\n\t\t<method name=\"setDateAndTime(Ljava/util/Date;)V\"/>\n\t\t<method name=\"setIssuerNames(Ljava/util/Collection;)V\"/>\n\t\t<method name=\"setIssuers(Ljava/util/Collection;)V\"/>\n\t\t<method name=\"setMaxCRLNumber(Ljava/math/BigInteger;)V\"/>\n\t\t<method name=\"setMinCRLNumber(Ljava/math/BigInteger;)V\"/>\n\t</class>\n\t<class name=\"java/security/cert/X509CertSelector\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/cert/CertSelector\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addPathToName(ILjava/lang/String;)V\"/>\n\t\t<method name=\"addPathToName(I[B)V\"/>\n\t\t<method name=\"addSubjectAlternativeName(ILjava/lang/String;)V\"/>\n\t\t<method name=\"addSubjectAlternativeName(I[B)V\"/>\n\t\t<method name=\"getAuthorityKeyIdentifier()[B\"/>\n\t\t<method name=\"getBasicConstraints()I\"/>\n\t\t<method name=\"getCertificate()Ljava/security/cert/X509Certificate;\"/>\n\t\t<method name=\"getCertificateValid()Ljava/util/Date;\"/>\n\t\t<method name=\"getExtendedKeyUsage()Ljava/util/Set;\"/>\n\t\t<method name=\"getIssuer()Ljavax/security/auth/x500/X500Principal;\"/>\n\t\t<method name=\"getIssuerAsBytes()[B\"/>\n\t\t<method name=\"getIssuerAsString()Ljava/lang/String;\"/>\n\t\t<method name=\"getKeyUsage()[Z\"/>\n\t\t<method name=\"getMatchAllSubjectAltNames()Z\"/>\n\t\t<method name=\"getNameConstraints()[B\"/>\n\t\t<method name=\"getPathToNames()Ljava/util/Collection;\"/>\n\t\t<method name=\"getPolicy()Ljava/util/Set;\"/>\n\t\t<method name=\"getPrivateKeyValid()Ljava/util/Date;\"/>\n\t\t<method name=\"getSerialNumber()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getSubject()Ljavax/security/auth/x500/X500Principal;\"/>\n\t\t<method name=\"getSubjectAlternativeNames()Ljava/util/Collection;\"/>\n\t\t<method name=\"getSubjectAsBytes()[B\"/>\n\t\t<method name=\"getSubjectAsString()Ljava/lang/String;\"/>\n\t\t<method name=\"getSubjectKeyIdentifier()[B\"/>\n\t\t<method name=\"getSubjectPublicKey()Ljava/security/PublicKey;\"/>\n\t\t<method name=\"getSubjectPublicKeyAlgID()Ljava/lang/String;\"/>\n\t\t<method name=\"setAuthorityKeyIdentifier([B)V\"/>\n\t\t<method name=\"setBasicConstraints(I)V\"/>\n\t\t<method name=\"setCertificate(Ljava/security/cert/X509Certificate;)V\"/>\n\t\t<method name=\"setCertificateValid(Ljava/util/Date;)V\"/>\n\t\t<method name=\"setExtendedKeyUsage(Ljava/util/Set;)V\"/>\n\t\t<method name=\"setIssuer(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setIssuer(Ljavax/security/auth/x500/X500Principal;)V\"/>\n\t\t<method name=\"setIssuer([B)V\"/>\n\t\t<method name=\"setKeyUsage([Z)V\"/>\n\t\t<method name=\"setMatchAllSubjectAltNames(Z)V\"/>\n\t\t<method name=\"setNameConstraints([B)V\"/>\n\t\t<method name=\"setPathToNames(Ljava/util/Collection;)V\"/>\n\t\t<method name=\"setPolicy(Ljava/util/Set;)V\"/>\n\t\t<method name=\"setPrivateKeyValid(Ljava/util/Date;)V\"/>\n\t\t<method name=\"setSerialNumber(Ljava/math/BigInteger;)V\"/>\n\t\t<method name=\"setSubject(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setSubject(Ljavax/security/auth/x500/X500Principal;)V\"/>\n\t\t<method name=\"setSubject([B)V\"/>\n\t\t<method name=\"setSubjectAlternativeNames(Ljava/util/Collection;)V\"/>\n\t\t<method name=\"setSubjectKeyIdentifier([B)V\"/>\n\t\t<method name=\"setSubjectPublicKey(Ljava/security/PublicKey;)V\"/>\n\t\t<method name=\"setSubjectPublicKey([B)V\"/>\n\t\t<method name=\"setSubjectPublicKeyAlgID(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/security/cert/X509Certificate\" since=\"1\">\n\t\t<extends name=\"java/security/cert/Certificate\"/>\n\t\t<implements name=\"java/security/cert/X509Extension\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"checkValidity()V\"/>\n\t\t<method name=\"checkValidity(Ljava/util/Date;)V\"/>\n\t\t<method name=\"getBasicConstraints()I\"/>\n\t\t<method name=\"getExtendedKeyUsage()Ljava/util/List;\"/>\n\t\t<method name=\"getIssuerAlternativeNames()Ljava/util/Collection;\"/>\n\t\t<method name=\"getIssuerDN()Ljava/security/Principal;\"/>\n\t\t<method name=\"getIssuerUniqueID()[Z\"/>\n\t\t<method name=\"getIssuerX500Principal()Ljavax/security/auth/x500/X500Principal;\"/>\n\t\t<method name=\"getKeyUsage()[Z\"/>\n\t\t<method name=\"getNotAfter()Ljava/util/Date;\"/>\n\t\t<method name=\"getNotBefore()Ljava/util/Date;\"/>\n\t\t<method name=\"getSerialNumber()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getSigAlgName()Ljava/lang/String;\"/>\n\t\t<method name=\"getSigAlgOID()Ljava/lang/String;\"/>\n\t\t<method name=\"getSigAlgParams()[B\"/>\n\t\t<method name=\"getSignature()[B\"/>\n\t\t<method name=\"getSubjectAlternativeNames()Ljava/util/Collection;\"/>\n\t\t<method name=\"getSubjectDN()Ljava/security/Principal;\"/>\n\t\t<method name=\"getSubjectUniqueID()[Z\"/>\n\t\t<method name=\"getSubjectX500Principal()Ljavax/security/auth/x500/X500Principal;\"/>\n\t\t<method name=\"getTBSCertificate()[B\"/>\n\t\t<method name=\"getVersion()I\"/>\n\t\t<method name=\"verify(Ljava/security/PublicKey;Ljava/security/Provider;)V\" since=\"24\"/>\n\t</class>\n\t<class name=\"java/security/cert/X509Extension\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getCriticalExtensionOIDs()Ljava/util/Set;\"/>\n\t\t<method name=\"getExtensionValue(Ljava/lang/String;)[B\"/>\n\t\t<method name=\"getNonCriticalExtensionOIDs()Ljava/util/Set;\"/>\n\t\t<method name=\"hasUnsupportedCriticalExtension()Z\"/>\n\t</class>\n\t<class name=\"java/security/interfaces/DSAKey\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getParams()Ljava/security/interfaces/DSAParams;\"/>\n\t</class>\n\t<class name=\"java/security/interfaces/DSAKeyPairGenerator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"initialize(IZLjava/security/SecureRandom;)V\"/>\n\t\t<method name=\"initialize(Ljava/security/interfaces/DSAParams;Ljava/security/SecureRandom;)V\"/>\n\t</class>\n\t<class name=\"java/security/interfaces/DSAParams\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getG()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getP()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getQ()Ljava/math/BigInteger;\"/>\n\t</class>\n\t<class name=\"java/security/interfaces/DSAPrivateKey\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/PrivateKey\"/>\n\t\t<implements name=\"java/security/interfaces/DSAKey\"/>\n\t\t<method name=\"getX()Ljava/math/BigInteger;\"/>\n\t\t<field name=\"serialVersionUID\"/>\n\t</class>\n\t<class name=\"java/security/interfaces/DSAPublicKey\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/PublicKey\"/>\n\t\t<implements name=\"java/security/interfaces/DSAKey\"/>\n\t\t<method name=\"getY()Ljava/math/BigInteger;\"/>\n\t\t<field name=\"serialVersionUID\"/>\n\t</class>\n\t<class name=\"java/security/interfaces/ECKey\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getParams()Ljava/security/spec/ECParameterSpec;\"/>\n\t</class>\n\t<class name=\"java/security/interfaces/ECPrivateKey\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/PrivateKey\"/>\n\t\t<implements name=\"java/security/interfaces/ECKey\"/>\n\t\t<method name=\"getS()Ljava/math/BigInteger;\"/>\n\t\t<field name=\"serialVersionUID\"/>\n\t</class>\n\t<class name=\"java/security/interfaces/ECPublicKey\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/PublicKey\"/>\n\t\t<implements name=\"java/security/interfaces/ECKey\"/>\n\t\t<method name=\"getW()Ljava/security/spec/ECPoint;\"/>\n\t\t<field name=\"serialVersionUID\"/>\n\t</class>\n\t<class name=\"java/security/interfaces/RSAKey\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getModulus()Ljava/math/BigInteger;\"/>\n\t</class>\n\t<class name=\"java/security/interfaces/RSAMultiPrimePrivateCrtKey\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/interfaces/RSAPrivateKey\"/>\n\t\t<method name=\"getCrtCoefficient()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getOtherPrimeInfo()[Ljava/security/spec/RSAOtherPrimeInfo;\"/>\n\t\t<method name=\"getPrimeExponentP()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getPrimeExponentQ()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getPrimeP()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getPrimeQ()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getPublicExponent()Ljava/math/BigInteger;\"/>\n\t\t<field name=\"serialVersionUID\"/>\n\t</class>\n\t<class name=\"java/security/interfaces/RSAPrivateCrtKey\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/interfaces/RSAPrivateKey\"/>\n\t\t<method name=\"getCrtCoefficient()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getPrimeExponentP()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getPrimeExponentQ()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getPrimeP()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getPrimeQ()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getPublicExponent()Ljava/math/BigInteger;\"/>\n\t\t<field name=\"serialVersionUID\"/>\n\t</class>\n\t<class name=\"java/security/interfaces/RSAPrivateKey\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/PrivateKey\"/>\n\t\t<implements name=\"java/security/interfaces/RSAKey\"/>\n\t\t<method name=\"getPrivateExponent()Ljava/math/BigInteger;\"/>\n\t\t<field name=\"serialVersionUID\"/>\n\t</class>\n\t<class name=\"java/security/interfaces/RSAPublicKey\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/PublicKey\"/>\n\t\t<implements name=\"java/security/interfaces/RSAKey\"/>\n\t\t<method name=\"getPublicExponent()Ljava/math/BigInteger;\"/>\n\t\t<field name=\"serialVersionUID\"/>\n\t</class>\n\t<class name=\"java/security/spec/AlgorithmParameterSpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"java/security/spec/DSAParameterSpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/interfaces/DSAParams\"/>\n\t\t<implements name=\"java/security/spec/AlgorithmParameterSpec\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V\"/>\n\t</class>\n\t<class name=\"java/security/spec/DSAPrivateKeySpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/KeySpec\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V\"/>\n\t\t<method name=\"getG()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getP()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getQ()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getX()Ljava/math/BigInteger;\"/>\n\t</class>\n\t<class name=\"java/security/spec/DSAPublicKeySpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/KeySpec\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V\"/>\n\t\t<method name=\"getG()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getP()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getQ()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getY()Ljava/math/BigInteger;\"/>\n\t</class>\n\t<class name=\"java/security/spec/ECField\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getFieldSize()I\"/>\n\t</class>\n\t<class name=\"java/security/spec/ECFieldF2m\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/ECField\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/math/BigInteger;)V\"/>\n\t\t<method name=\"&lt;init>(I[I)V\"/>\n\t\t<method name=\"getM()I\"/>\n\t\t<method name=\"getMidTermsOfReductionPolynomial()[I\"/>\n\t\t<method name=\"getReductionPolynomial()Ljava/math/BigInteger;\"/>\n\t</class>\n\t<class name=\"java/security/spec/ECFieldFp\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/ECField\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigInteger;)V\"/>\n\t\t<method name=\"getP()Ljava/math/BigInteger;\"/>\n\t</class>\n\t<class name=\"java/security/spec/ECGenParameterSpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/AlgorithmParameterSpec\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/security/spec/ECParameterSpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/AlgorithmParameterSpec\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/spec/EllipticCurve;Ljava/security/spec/ECPoint;Ljava/math/BigInteger;I)V\"/>\n\t\t<method name=\"getCofactor()I\"/>\n\t\t<method name=\"getCurve()Ljava/security/spec/EllipticCurve;\"/>\n\t\t<method name=\"getGenerator()Ljava/security/spec/ECPoint;\"/>\n\t\t<method name=\"getOrder()Ljava/math/BigInteger;\"/>\n\t</class>\n\t<class name=\"java/security/spec/ECPoint\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;)V\"/>\n\t\t<method name=\"getAffineX()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getAffineY()Ljava/math/BigInteger;\"/>\n\t\t<field name=\"POINT_INFINITY\"/>\n\t</class>\n\t<class name=\"java/security/spec/ECPrivateKeySpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/KeySpec\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigInteger;Ljava/security/spec/ECParameterSpec;)V\"/>\n\t\t<method name=\"getParams()Ljava/security/spec/ECParameterSpec;\"/>\n\t\t<method name=\"getS()Ljava/math/BigInteger;\"/>\n\t</class>\n\t<class name=\"java/security/spec/ECPublicKeySpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/KeySpec\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/spec/ECPoint;Ljava/security/spec/ECParameterSpec;)V\"/>\n\t\t<method name=\"getParams()Ljava/security/spec/ECParameterSpec;\"/>\n\t\t<method name=\"getW()Ljava/security/spec/ECPoint;\"/>\n\t</class>\n\t<class name=\"java/security/spec/EllipticCurve\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;[B)V\"/>\n\t\t<method name=\"getA()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getB()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getField()Ljava/security/spec/ECField;\"/>\n\t\t<method name=\"getSeed()[B\"/>\n\t</class>\n\t<class name=\"java/security/spec/EncodedKeySpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/KeySpec\"/>\n\t\t<method name=\"&lt;init>([B)V\"/>\n\t\t<method name=\"getEncoded()[B\"/>\n\t\t<method name=\"getFormat()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/security/spec/InvalidKeySpecException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/security/spec/InvalidParameterSpecException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/security/spec/KeySpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"java/security/spec/MGF1ParameterSpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/AlgorithmParameterSpec\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getDigestAlgorithm()Ljava/lang/String;\"/>\n\t\t<field name=\"SHA1\"/>\n\t\t<field name=\"SHA224\" since=\"26\"/>\n\t\t<field name=\"SHA256\"/>\n\t\t<field name=\"SHA384\"/>\n\t\t<field name=\"SHA512\"/>\n\t</class>\n\t<class name=\"java/security/spec/PKCS8EncodedKeySpec\" since=\"1\">\n\t\t<extends name=\"java/security/spec/EncodedKeySpec\"/>\n\t\t<method name=\"&lt;init>([B)V\"/>\n\t</class>\n\t<class name=\"java/security/spec/PSSParameterSpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/AlgorithmParameterSpec\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/security/spec/AlgorithmParameterSpec;II)V\"/>\n\t\t<method name=\"getDigestAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getMGFAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getMGFParameters()Ljava/security/spec/AlgorithmParameterSpec;\"/>\n\t\t<method name=\"getSaltLength()I\"/>\n\t\t<method name=\"getTrailerField()I\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t</class>\n\t<class name=\"java/security/spec/RSAKeyGenParameterSpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/AlgorithmParameterSpec\"/>\n\t\t<method name=\"&lt;init>(ILjava/math/BigInteger;)V\"/>\n\t\t<method name=\"getKeysize()I\"/>\n\t\t<method name=\"getPublicExponent()Ljava/math/BigInteger;\"/>\n\t\t<field name=\"F0\"/>\n\t\t<field name=\"F4\"/>\n\t</class>\n\t<class name=\"java/security/spec/RSAMultiPrimePrivateCrtKeySpec\" since=\"1\">\n\t\t<extends name=\"java/security/spec/RSAPrivateKeySpec\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;[Ljava/security/spec/RSAOtherPrimeInfo;)V\"/>\n\t\t<method name=\"getCrtCoefficient()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getOtherPrimeInfo()[Ljava/security/spec/RSAOtherPrimeInfo;\"/>\n\t\t<method name=\"getPrimeExponentP()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getPrimeExponentQ()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getPrimeP()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getPrimeQ()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getPublicExponent()Ljava/math/BigInteger;\"/>\n\t</class>\n\t<class name=\"java/security/spec/RSAOtherPrimeInfo\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V\"/>\n\t\t<method name=\"getCrtCoefficient()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getExponent()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getPrime()Ljava/math/BigInteger;\"/>\n\t</class>\n\t<class name=\"java/security/spec/RSAPrivateCrtKeySpec\" since=\"1\">\n\t\t<extends name=\"java/security/spec/RSAPrivateKeySpec\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V\"/>\n\t\t<method name=\"getCrtCoefficient()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getPrimeExponentP()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getPrimeExponentQ()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getPrimeP()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getPrimeQ()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getPublicExponent()Ljava/math/BigInteger;\"/>\n\t</class>\n\t<class name=\"java/security/spec/RSAPrivateKeySpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/KeySpec\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;)V\"/>\n\t\t<method name=\"getModulus()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getPrivateExponent()Ljava/math/BigInteger;\"/>\n\t</class>\n\t<class name=\"java/security/spec/RSAPublicKeySpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/KeySpec\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;)V\"/>\n\t\t<method name=\"getModulus()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getPublicExponent()Ljava/math/BigInteger;\"/>\n\t</class>\n\t<class name=\"java/security/spec/X509EncodedKeySpec\" since=\"1\">\n\t\t<extends name=\"java/security/spec/EncodedKeySpec\"/>\n\t\t<method name=\"&lt;init>([B)V\"/>\n\t</class>\n\t<class name=\"java/sql/Array\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"free()V\" since=\"9\"/>\n\t\t<method name=\"getArray()Ljava/lang/Object;\"/>\n\t\t<method name=\"getArray(JI)Ljava/lang/Object;\"/>\n\t\t<method name=\"getArray(JILjava/util/Map;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getArray(Ljava/util/Map;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getBaseType()I\"/>\n\t\t<method name=\"getBaseTypeName()Ljava/lang/String;\"/>\n\t\t<method name=\"getResultSet()Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getResultSet(JI)Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getResultSet(JILjava/util/Map;)Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getResultSet(Ljava/util/Map;)Ljava/sql/ResultSet;\"/>\n\t</class>\n\t<class name=\"java/sql/BatchUpdateException\" since=\"1\">\n\t\t<extends name=\"java/sql/SQLException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;I[I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;I[ILjava/lang/Throwable;)V\" since=\"9\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;[I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;[ILjava/lang/Throwable;)V\" since=\"9\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;[I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;[ILjava/lang/Throwable;)V\" since=\"9\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\" since=\"9\"/>\n\t\t<method name=\"&lt;init>([I)V\"/>\n\t\t<method name=\"&lt;init>([ILjava/lang/Throwable;)V\" since=\"9\"/>\n\t\t<method name=\"getUpdateCounts()[I\"/>\n\t</class>\n\t<class name=\"java/sql/Blob\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"free()V\" since=\"9\"/>\n\t\t<method name=\"getBinaryStream()Ljava/io/InputStream;\"/>\n\t\t<method name=\"getBinaryStream(JJ)Ljava/io/InputStream;\" since=\"9\"/>\n\t\t<method name=\"getBytes(JI)[B\"/>\n\t\t<method name=\"length()J\"/>\n\t\t<method name=\"position(Ljava/sql/Blob;J)J\"/>\n\t\t<method name=\"position([BJ)J\"/>\n\t\t<method name=\"setBinaryStream(J)Ljava/io/OutputStream;\"/>\n\t\t<method name=\"setBytes(J[B)I\"/>\n\t\t<method name=\"setBytes(J[BII)I\"/>\n\t\t<method name=\"truncate(J)V\"/>\n\t</class>\n\t<class name=\"java/sql/CallableStatement\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/sql/PreparedStatement\"/>\n\t\t<method name=\"getArray(I)Ljava/sql/Array;\"/>\n\t\t<method name=\"getArray(Ljava/lang/String;)Ljava/sql/Array;\"/>\n\t\t<method name=\"getBigDecimal(I)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"getBigDecimal(II)Ljava/math/BigDecimal;\" deprecated=\"15\"/>\n\t\t<method name=\"getBigDecimal(Ljava/lang/String;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"getBlob(I)Ljava/sql/Blob;\"/>\n\t\t<method name=\"getBlob(Ljava/lang/String;)Ljava/sql/Blob;\"/>\n\t\t<method name=\"getBoolean(I)Z\"/>\n\t\t<method name=\"getBoolean(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"getByte(I)B\"/>\n\t\t<method name=\"getByte(Ljava/lang/String;)B\"/>\n\t\t<method name=\"getBytes(I)[B\"/>\n\t\t<method name=\"getBytes(Ljava/lang/String;)[B\"/>\n\t\t<method name=\"getCharacterStream(I)Ljava/io/Reader;\" since=\"9\"/>\n\t\t<method name=\"getCharacterStream(Ljava/lang/String;)Ljava/io/Reader;\" since=\"9\"/>\n\t\t<method name=\"getClob(I)Ljava/sql/Clob;\"/>\n\t\t<method name=\"getClob(Ljava/lang/String;)Ljava/sql/Clob;\"/>\n\t\t<method name=\"getDate(I)Ljava/sql/Date;\"/>\n\t\t<method name=\"getDate(ILjava/util/Calendar;)Ljava/sql/Date;\"/>\n\t\t<method name=\"getDate(Ljava/lang/String;)Ljava/sql/Date;\"/>\n\t\t<method name=\"getDate(Ljava/lang/String;Ljava/util/Calendar;)Ljava/sql/Date;\"/>\n\t\t<method name=\"getDouble(I)D\"/>\n\t\t<method name=\"getDouble(Ljava/lang/String;)D\"/>\n\t\t<method name=\"getFloat(I)F\"/>\n\t\t<method name=\"getFloat(Ljava/lang/String;)F\"/>\n\t\t<method name=\"getInt(I)I\"/>\n\t\t<method name=\"getInt(Ljava/lang/String;)I\"/>\n\t\t<method name=\"getLong(I)J\"/>\n\t\t<method name=\"getLong(Ljava/lang/String;)J\"/>\n\t\t<method name=\"getNCharacterStream(I)Ljava/io/Reader;\" since=\"9\"/>\n\t\t<method name=\"getNCharacterStream(Ljava/lang/String;)Ljava/io/Reader;\" since=\"9\"/>\n\t\t<method name=\"getNClob(I)Ljava/sql/NClob;\" since=\"9\"/>\n\t\t<method name=\"getNClob(Ljava/lang/String;)Ljava/sql/NClob;\" since=\"9\"/>\n\t\t<method name=\"getNString(I)Ljava/lang/String;\" since=\"9\"/>\n\t\t<method name=\"getNString(Ljava/lang/String;)Ljava/lang/String;\" since=\"9\"/>\n\t\t<method name=\"getObject(I)Ljava/lang/Object;\"/>\n\t\t<method name=\"getObject(ILjava/util/Map;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getObject(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getObject(Ljava/lang/String;Ljava/util/Map;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getRef(I)Ljava/sql/Ref;\"/>\n\t\t<method name=\"getRef(Ljava/lang/String;)Ljava/sql/Ref;\"/>\n\t\t<method name=\"getRowId(I)Ljava/sql/RowId;\" since=\"9\"/>\n\t\t<method name=\"getRowId(Ljava/lang/String;)Ljava/sql/RowId;\" since=\"9\"/>\n\t\t<method name=\"getSQLXML(I)Ljava/sql/SQLXML;\" since=\"9\"/>\n\t\t<method name=\"getSQLXML(Ljava/lang/String;)Ljava/sql/SQLXML;\" since=\"9\"/>\n\t\t<method name=\"getShort(I)S\"/>\n\t\t<method name=\"getShort(Ljava/lang/String;)S\"/>\n\t\t<method name=\"getString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getString(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getTime(I)Ljava/sql/Time;\"/>\n\t\t<method name=\"getTime(ILjava/util/Calendar;)Ljava/sql/Time;\"/>\n\t\t<method name=\"getTime(Ljava/lang/String;)Ljava/sql/Time;\"/>\n\t\t<method name=\"getTime(Ljava/lang/String;Ljava/util/Calendar;)Ljava/sql/Time;\"/>\n\t\t<method name=\"getTimestamp(I)Ljava/sql/Timestamp;\"/>\n\t\t<method name=\"getTimestamp(ILjava/util/Calendar;)Ljava/sql/Timestamp;\"/>\n\t\t<method name=\"getTimestamp(Ljava/lang/String;)Ljava/sql/Timestamp;\"/>\n\t\t<method name=\"getTimestamp(Ljava/lang/String;Ljava/util/Calendar;)Ljava/sql/Timestamp;\"/>\n\t\t<method name=\"getURL(I)Ljava/net/URL;\"/>\n\t\t<method name=\"getURL(Ljava/lang/String;)Ljava/net/URL;\"/>\n\t\t<method name=\"registerOutParameter(II)V\"/>\n\t\t<method name=\"registerOutParameter(III)V\"/>\n\t\t<method name=\"registerOutParameter(IILjava/lang/String;)V\"/>\n\t\t<method name=\"registerOutParameter(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"registerOutParameter(Ljava/lang/String;II)V\"/>\n\t\t<method name=\"registerOutParameter(Ljava/lang/String;ILjava/lang/String;)V\"/>\n\t\t<method name=\"setAsciiStream(Ljava/lang/String;Ljava/io/InputStream;)V\" since=\"9\"/>\n\t\t<method name=\"setAsciiStream(Ljava/lang/String;Ljava/io/InputStream;I)V\"/>\n\t\t<method name=\"setAsciiStream(Ljava/lang/String;Ljava/io/InputStream;J)V\" since=\"9\"/>\n\t\t<method name=\"setBigDecimal(Ljava/lang/String;Ljava/math/BigDecimal;)V\"/>\n\t\t<method name=\"setBinaryStream(Ljava/lang/String;Ljava/io/InputStream;)V\" since=\"9\"/>\n\t\t<method name=\"setBinaryStream(Ljava/lang/String;Ljava/io/InputStream;I)V\"/>\n\t\t<method name=\"setBinaryStream(Ljava/lang/String;Ljava/io/InputStream;J)V\" since=\"9\"/>\n\t\t<method name=\"setBlob(Ljava/lang/String;Ljava/io/InputStream;)V\" since=\"9\"/>\n\t\t<method name=\"setBlob(Ljava/lang/String;Ljava/io/InputStream;J)V\" since=\"9\"/>\n\t\t<method name=\"setBlob(Ljava/lang/String;Ljava/sql/Blob;)V\" since=\"9\"/>\n\t\t<method name=\"setBoolean(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"setByte(Ljava/lang/String;B)V\"/>\n\t\t<method name=\"setBytes(Ljava/lang/String;[B)V\"/>\n\t\t<method name=\"setCharacterStream(Ljava/lang/String;Ljava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"setCharacterStream(Ljava/lang/String;Ljava/io/Reader;I)V\"/>\n\t\t<method name=\"setCharacterStream(Ljava/lang/String;Ljava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"setClob(Ljava/lang/String;Ljava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"setClob(Ljava/lang/String;Ljava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"setClob(Ljava/lang/String;Ljava/sql/Clob;)V\" since=\"9\"/>\n\t\t<method name=\"setDate(Ljava/lang/String;Ljava/sql/Date;)V\"/>\n\t\t<method name=\"setDate(Ljava/lang/String;Ljava/sql/Date;Ljava/util/Calendar;)V\"/>\n\t\t<method name=\"setDouble(Ljava/lang/String;D)V\"/>\n\t\t<method name=\"setFloat(Ljava/lang/String;F)V\"/>\n\t\t<method name=\"setInt(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"setLong(Ljava/lang/String;J)V\"/>\n\t\t<method name=\"setNCharacterStream(Ljava/lang/String;Ljava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"setNCharacterStream(Ljava/lang/String;Ljava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"setNClob(Ljava/lang/String;Ljava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"setNClob(Ljava/lang/String;Ljava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"setNClob(Ljava/lang/String;Ljava/sql/NClob;)V\" since=\"9\"/>\n\t\t<method name=\"setNString(Ljava/lang/String;Ljava/lang/String;)V\" since=\"9\"/>\n\t\t<method name=\"setNull(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"setNull(Ljava/lang/String;ILjava/lang/String;)V\"/>\n\t\t<method name=\"setObject(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"setObject(Ljava/lang/String;Ljava/lang/Object;I)V\"/>\n\t\t<method name=\"setObject(Ljava/lang/String;Ljava/lang/Object;II)V\"/>\n\t\t<method name=\"setRowId(Ljava/lang/String;Ljava/sql/RowId;)V\" since=\"9\"/>\n\t\t<method name=\"setSQLXML(Ljava/lang/String;Ljava/sql/SQLXML;)V\" since=\"9\"/>\n\t\t<method name=\"setShort(Ljava/lang/String;S)V\"/>\n\t\t<method name=\"setString(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setTime(Ljava/lang/String;Ljava/sql/Time;)V\"/>\n\t\t<method name=\"setTime(Ljava/lang/String;Ljava/sql/Time;Ljava/util/Calendar;)V\"/>\n\t\t<method name=\"setTimestamp(Ljava/lang/String;Ljava/sql/Timestamp;)V\"/>\n\t\t<method name=\"setTimestamp(Ljava/lang/String;Ljava/sql/Timestamp;Ljava/util/Calendar;)V\"/>\n\t\t<method name=\"setURL(Ljava/lang/String;Ljava/net/URL;)V\"/>\n\t\t<method name=\"wasNull()Z\"/>\n\t</class>\n\t<class name=\"java/sql/ClientInfoStatus\" since=\"9\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/sql/ClientInfoStatus;\"/>\n\t\t<method name=\"values()[Ljava/sql/ClientInfoStatus;\"/>\n\t\t<field name=\"REASON_UNKNOWN\"/>\n\t\t<field name=\"REASON_UNKNOWN_PROPERTY\"/>\n\t\t<field name=\"REASON_VALUE_INVALID\"/>\n\t\t<field name=\"REASON_VALUE_TRUNCATED\"/>\n\t</class>\n\t<class name=\"java/sql/Clob\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"free()V\" since=\"9\"/>\n\t\t<method name=\"getAsciiStream()Ljava/io/InputStream;\"/>\n\t\t<method name=\"getCharacterStream()Ljava/io/Reader;\"/>\n\t\t<method name=\"getCharacterStream(JJ)Ljava/io/Reader;\" since=\"9\"/>\n\t\t<method name=\"getSubString(JI)Ljava/lang/String;\"/>\n\t\t<method name=\"length()J\"/>\n\t\t<method name=\"position(Ljava/lang/String;J)J\"/>\n\t\t<method name=\"position(Ljava/sql/Clob;J)J\"/>\n\t\t<method name=\"setAsciiStream(J)Ljava/io/OutputStream;\"/>\n\t\t<method name=\"setCharacterStream(J)Ljava/io/Writer;\"/>\n\t\t<method name=\"setString(JLjava/lang/String;)I\"/>\n\t\t<method name=\"setString(JLjava/lang/String;II)I\"/>\n\t\t<method name=\"truncate(J)V\"/>\n\t</class>\n\t<class name=\"java/sql/Connection\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\" since=\"19\"/>\n\t\t<implements name=\"java/sql/Wrapper\" since=\"9\"/>\n\t\t<method name=\"clearWarnings()V\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"commit()V\"/>\n\t\t<method name=\"createArrayOf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/sql/Array;\" since=\"9\"/>\n\t\t<method name=\"createBlob()Ljava/sql/Blob;\" since=\"9\"/>\n\t\t<method name=\"createClob()Ljava/sql/Clob;\" since=\"9\"/>\n\t\t<method name=\"createNClob()Ljava/sql/NClob;\" since=\"9\"/>\n\t\t<method name=\"createSQLXML()Ljava/sql/SQLXML;\" since=\"9\"/>\n\t\t<method name=\"createStatement()Ljava/sql/Statement;\"/>\n\t\t<method name=\"createStatement(II)Ljava/sql/Statement;\"/>\n\t\t<method name=\"createStatement(III)Ljava/sql/Statement;\"/>\n\t\t<method name=\"createStruct(Ljava/lang/String;[Ljava/lang/Object;)Ljava/sql/Struct;\" since=\"9\"/>\n\t\t<method name=\"getAutoCommit()Z\"/>\n\t\t<method name=\"getCatalog()Ljava/lang/String;\"/>\n\t\t<method name=\"getClientInfo()Ljava/util/Properties;\" since=\"9\"/>\n\t\t<method name=\"getClientInfo(Ljava/lang/String;)Ljava/lang/String;\" since=\"9\"/>\n\t\t<method name=\"getHoldability()I\"/>\n\t\t<method name=\"getMetaData()Ljava/sql/DatabaseMetaData;\"/>\n\t\t<method name=\"getTransactionIsolation()I\"/>\n\t\t<method name=\"getTypeMap()Ljava/util/Map;\"/>\n\t\t<method name=\"getWarnings()Ljava/sql/SQLWarning;\"/>\n\t\t<method name=\"isClosed()Z\"/>\n\t\t<method name=\"isReadOnly()Z\"/>\n\t\t<method name=\"isValid(I)Z\" since=\"9\"/>\n\t\t<method name=\"nativeSQL(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"prepareCall(Ljava/lang/String;)Ljava/sql/CallableStatement;\"/>\n\t\t<method name=\"prepareCall(Ljava/lang/String;II)Ljava/sql/CallableStatement;\"/>\n\t\t<method name=\"prepareCall(Ljava/lang/String;III)Ljava/sql/CallableStatement;\"/>\n\t\t<method name=\"prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;\"/>\n\t\t<method name=\"prepareStatement(Ljava/lang/String;I)Ljava/sql/PreparedStatement;\"/>\n\t\t<method name=\"prepareStatement(Ljava/lang/String;II)Ljava/sql/PreparedStatement;\"/>\n\t\t<method name=\"prepareStatement(Ljava/lang/String;III)Ljava/sql/PreparedStatement;\"/>\n\t\t<method name=\"prepareStatement(Ljava/lang/String;[I)Ljava/sql/PreparedStatement;\"/>\n\t\t<method name=\"prepareStatement(Ljava/lang/String;[Ljava/lang/String;)Ljava/sql/PreparedStatement;\"/>\n\t\t<method name=\"releaseSavepoint(Ljava/sql/Savepoint;)V\"/>\n\t\t<method name=\"rollback()V\"/>\n\t\t<method name=\"rollback(Ljava/sql/Savepoint;)V\"/>\n\t\t<method name=\"setAutoCommit(Z)V\"/>\n\t\t<method name=\"setCatalog(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setClientInfo(Ljava/lang/String;Ljava/lang/String;)V\" since=\"9\"/>\n\t\t<method name=\"setClientInfo(Ljava/util/Properties;)V\" since=\"9\"/>\n\t\t<method name=\"setHoldability(I)V\"/>\n\t\t<method name=\"setReadOnly(Z)V\"/>\n\t\t<method name=\"setSavepoint()Ljava/sql/Savepoint;\"/>\n\t\t<method name=\"setSavepoint(Ljava/lang/String;)Ljava/sql/Savepoint;\"/>\n\t\t<method name=\"setTransactionIsolation(I)V\"/>\n\t\t<method name=\"setTypeMap(Ljava/util/Map;)V\"/>\n\t\t<field name=\"TRANSACTION_NONE\"/>\n\t\t<field name=\"TRANSACTION_READ_COMMITTED\"/>\n\t\t<field name=\"TRANSACTION_READ_UNCOMMITTED\"/>\n\t\t<field name=\"TRANSACTION_REPEATABLE_READ\"/>\n\t\t<field name=\"TRANSACTION_SERIALIZABLE\"/>\n\t</class>\n\t<class name=\"java/sql/DataTruncation\" since=\"1\">\n\t\t<extends name=\"java/sql/SQLWarning\"/>\n\t\t<method name=\"&lt;init>(IZZII)V\"/>\n\t\t<method name=\"&lt;init>(IZZIILjava/lang/Throwable;)V\" since=\"9\"/>\n\t\t<method name=\"getDataSize()I\"/>\n\t\t<method name=\"getIndex()I\"/>\n\t\t<method name=\"getParameter()Z\"/>\n\t\t<method name=\"getRead()Z\"/>\n\t\t<method name=\"getTransferSize()I\"/>\n\t</class>\n\t<class name=\"java/sql/DatabaseMetaData\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/sql/Wrapper\" since=\"9\"/>\n\t\t<method name=\"allProceduresAreCallable()Z\"/>\n\t\t<method name=\"allTablesAreSelectable()Z\"/>\n\t\t<method name=\"autoCommitFailureClosesAllResultSets()Z\" since=\"9\"/>\n\t\t<method name=\"dataDefinitionCausesTransactionCommit()Z\"/>\n\t\t<method name=\"dataDefinitionIgnoredInTransactions()Z\"/>\n\t\t<method name=\"deletesAreDetected(I)Z\"/>\n\t\t<method name=\"doesMaxRowSizeIncludeBlobs()Z\"/>\n\t\t<method name=\"getAttributes(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getBestRowIdentifier(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZ)Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getCatalogSeparator()Ljava/lang/String;\"/>\n\t\t<method name=\"getCatalogTerm()Ljava/lang/String;\"/>\n\t\t<method name=\"getCatalogs()Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getClientInfoProperties()Ljava/sql/ResultSet;\" since=\"9\"/>\n\t\t<method name=\"getColumnPrivileges(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getColumns(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getConnection()Ljava/sql/Connection;\"/>\n\t\t<method name=\"getCrossReference(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getDatabaseMajorVersion()I\"/>\n\t\t<method name=\"getDatabaseMinorVersion()I\"/>\n\t\t<method name=\"getDatabaseProductName()Ljava/lang/String;\"/>\n\t\t<method name=\"getDatabaseProductVersion()Ljava/lang/String;\"/>\n\t\t<method name=\"getDefaultTransactionIsolation()I\"/>\n\t\t<method name=\"getDriverMajorVersion()I\"/>\n\t\t<method name=\"getDriverMinorVersion()I\"/>\n\t\t<method name=\"getDriverName()Ljava/lang/String;\"/>\n\t\t<method name=\"getDriverVersion()Ljava/lang/String;\"/>\n\t\t<method name=\"getExportedKeys(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getExtraNameCharacters()Ljava/lang/String;\"/>\n\t\t<method name=\"getFunctionColumns(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;\" since=\"9\"/>\n\t\t<method name=\"getFunctions(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;\" since=\"9\"/>\n\t\t<method name=\"getIdentifierQuoteString()Ljava/lang/String;\"/>\n\t\t<method name=\"getImportedKeys(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getIndexInfo(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZ)Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getJDBCMajorVersion()I\"/>\n\t\t<method name=\"getJDBCMinorVersion()I\"/>\n\t\t<method name=\"getMaxBinaryLiteralLength()I\"/>\n\t\t<method name=\"getMaxCatalogNameLength()I\"/>\n\t\t<method name=\"getMaxCharLiteralLength()I\"/>\n\t\t<method name=\"getMaxColumnNameLength()I\"/>\n\t\t<method name=\"getMaxColumnsInGroupBy()I\"/>\n\t\t<method name=\"getMaxColumnsInIndex()I\"/>\n\t\t<method name=\"getMaxColumnsInOrderBy()I\"/>\n\t\t<method name=\"getMaxColumnsInSelect()I\"/>\n\t\t<method name=\"getMaxColumnsInTable()I\"/>\n\t\t<method name=\"getMaxConnections()I\"/>\n\t\t<method name=\"getMaxCursorNameLength()I\"/>\n\t\t<method name=\"getMaxIndexLength()I\"/>\n\t\t<method name=\"getMaxProcedureNameLength()I\"/>\n\t\t<method name=\"getMaxRowSize()I\"/>\n\t\t<method name=\"getMaxSchemaNameLength()I\"/>\n\t\t<method name=\"getMaxStatementLength()I\"/>\n\t\t<method name=\"getMaxStatements()I\"/>\n\t\t<method name=\"getMaxTableNameLength()I\"/>\n\t\t<method name=\"getMaxTablesInSelect()I\"/>\n\t\t<method name=\"getMaxUserNameLength()I\"/>\n\t\t<method name=\"getNumericFunctions()Ljava/lang/String;\"/>\n\t\t<method name=\"getPrimaryKeys(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getProcedureColumns(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getProcedureTerm()Ljava/lang/String;\"/>\n\t\t<method name=\"getProcedures(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getResultSetHoldability()I\"/>\n\t\t<method name=\"getRowIdLifetime()Ljava/sql/RowIdLifetime;\" since=\"9\"/>\n\t\t<method name=\"getSQLKeywords()Ljava/lang/String;\"/>\n\t\t<method name=\"getSQLStateType()I\"/>\n\t\t<method name=\"getSchemaTerm()Ljava/lang/String;\"/>\n\t\t<method name=\"getSchemas()Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getSchemas(Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;\" since=\"9\"/>\n\t\t<method name=\"getSearchStringEscape()Ljava/lang/String;\"/>\n\t\t<method name=\"getStringFunctions()Ljava/lang/String;\"/>\n\t\t<method name=\"getSuperTables(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getSuperTypes(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getSystemFunctions()Ljava/lang/String;\"/>\n\t\t<method name=\"getTablePrivileges(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getTableTypes()Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getTables(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getTimeDateFunctions()Ljava/lang/String;\"/>\n\t\t<method name=\"getTypeInfo()Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getUDTs(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[I)Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getURL()Ljava/lang/String;\"/>\n\t\t<method name=\"getUserName()Ljava/lang/String;\"/>\n\t\t<method name=\"getVersionColumns(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"insertsAreDetected(I)Z\"/>\n\t\t<method name=\"isCatalogAtStart()Z\"/>\n\t\t<method name=\"isReadOnly()Z\"/>\n\t\t<method name=\"locatorsUpdateCopy()Z\"/>\n\t\t<method name=\"nullPlusNonNullIsNull()Z\"/>\n\t\t<method name=\"nullsAreSortedAtEnd()Z\"/>\n\t\t<method name=\"nullsAreSortedAtStart()Z\"/>\n\t\t<method name=\"nullsAreSortedHigh()Z\"/>\n\t\t<method name=\"nullsAreSortedLow()Z\"/>\n\t\t<method name=\"othersDeletesAreVisible(I)Z\"/>\n\t\t<method name=\"othersInsertsAreVisible(I)Z\"/>\n\t\t<method name=\"othersUpdatesAreVisible(I)Z\"/>\n\t\t<method name=\"ownDeletesAreVisible(I)Z\"/>\n\t\t<method name=\"ownInsertsAreVisible(I)Z\"/>\n\t\t<method name=\"ownUpdatesAreVisible(I)Z\"/>\n\t\t<method name=\"storesLowerCaseIdentifiers()Z\"/>\n\t\t<method name=\"storesLowerCaseQuotedIdentifiers()Z\"/>\n\t\t<method name=\"storesMixedCaseIdentifiers()Z\"/>\n\t\t<method name=\"storesMixedCaseQuotedIdentifiers()Z\"/>\n\t\t<method name=\"storesUpperCaseIdentifiers()Z\"/>\n\t\t<method name=\"storesUpperCaseQuotedIdentifiers()Z\"/>\n\t\t<method name=\"supportsANSI92EntryLevelSQL()Z\"/>\n\t\t<method name=\"supportsANSI92FullSQL()Z\"/>\n\t\t<method name=\"supportsANSI92IntermediateSQL()Z\"/>\n\t\t<method name=\"supportsAlterTableWithAddColumn()Z\"/>\n\t\t<method name=\"supportsAlterTableWithDropColumn()Z\"/>\n\t\t<method name=\"supportsBatchUpdates()Z\"/>\n\t\t<method name=\"supportsCatalogsInDataManipulation()Z\"/>\n\t\t<method name=\"supportsCatalogsInIndexDefinitions()Z\"/>\n\t\t<method name=\"supportsCatalogsInPrivilegeDefinitions()Z\"/>\n\t\t<method name=\"supportsCatalogsInProcedureCalls()Z\"/>\n\t\t<method name=\"supportsCatalogsInTableDefinitions()Z\"/>\n\t\t<method name=\"supportsColumnAliasing()Z\"/>\n\t\t<method name=\"supportsConvert()Z\"/>\n\t\t<method name=\"supportsConvert(II)Z\"/>\n\t\t<method name=\"supportsCoreSQLGrammar()Z\"/>\n\t\t<method name=\"supportsCorrelatedSubqueries()Z\"/>\n\t\t<method name=\"supportsDataDefinitionAndDataManipulationTransactions()Z\"/>\n\t\t<method name=\"supportsDataManipulationTransactionsOnly()Z\"/>\n\t\t<method name=\"supportsDifferentTableCorrelationNames()Z\"/>\n\t\t<method name=\"supportsExpressionsInOrderBy()Z\"/>\n\t\t<method name=\"supportsExtendedSQLGrammar()Z\"/>\n\t\t<method name=\"supportsFullOuterJoins()Z\"/>\n\t\t<method name=\"supportsGetGeneratedKeys()Z\"/>\n\t\t<method name=\"supportsGroupBy()Z\"/>\n\t\t<method name=\"supportsGroupByBeyondSelect()Z\"/>\n\t\t<method name=\"supportsGroupByUnrelated()Z\"/>\n\t\t<method name=\"supportsIntegrityEnhancementFacility()Z\"/>\n\t\t<method name=\"supportsLikeEscapeClause()Z\"/>\n\t\t<method name=\"supportsLimitedOuterJoins()Z\"/>\n\t\t<method name=\"supportsMinimumSQLGrammar()Z\"/>\n\t\t<method name=\"supportsMixedCaseIdentifiers()Z\"/>\n\t\t<method name=\"supportsMixedCaseQuotedIdentifiers()Z\"/>\n\t\t<method name=\"supportsMultipleOpenResults()Z\"/>\n\t\t<method name=\"supportsMultipleResultSets()Z\"/>\n\t\t<method name=\"supportsMultipleTransactions()Z\"/>\n\t\t<method name=\"supportsNamedParameters()Z\"/>\n\t\t<method name=\"supportsNonNullableColumns()Z\"/>\n\t\t<method name=\"supportsOpenCursorsAcrossCommit()Z\"/>\n\t\t<method name=\"supportsOpenCursorsAcrossRollback()Z\"/>\n\t\t<method name=\"supportsOpenStatementsAcrossCommit()Z\"/>\n\t\t<method name=\"supportsOpenStatementsAcrossRollback()Z\"/>\n\t\t<method name=\"supportsOrderByUnrelated()Z\"/>\n\t\t<method name=\"supportsOuterJoins()Z\"/>\n\t\t<method name=\"supportsPositionedDelete()Z\"/>\n\t\t<method name=\"supportsPositionedUpdate()Z\"/>\n\t\t<method name=\"supportsResultSetConcurrency(II)Z\"/>\n\t\t<method name=\"supportsResultSetHoldability(I)Z\"/>\n\t\t<method name=\"supportsResultSetType(I)Z\"/>\n\t\t<method name=\"supportsSavepoints()Z\"/>\n\t\t<method name=\"supportsSchemasInDataManipulation()Z\"/>\n\t\t<method name=\"supportsSchemasInIndexDefinitions()Z\"/>\n\t\t<method name=\"supportsSchemasInPrivilegeDefinitions()Z\"/>\n\t\t<method name=\"supportsSchemasInProcedureCalls()Z\"/>\n\t\t<method name=\"supportsSchemasInTableDefinitions()Z\"/>\n\t\t<method name=\"supportsSelectForUpdate()Z\"/>\n\t\t<method name=\"supportsStatementPooling()Z\"/>\n\t\t<method name=\"supportsStoredFunctionsUsingCallSyntax()Z\" since=\"9\"/>\n\t\t<method name=\"supportsStoredProcedures()Z\"/>\n\t\t<method name=\"supportsSubqueriesInComparisons()Z\"/>\n\t\t<method name=\"supportsSubqueriesInExists()Z\"/>\n\t\t<method name=\"supportsSubqueriesInIns()Z\"/>\n\t\t<method name=\"supportsSubqueriesInQuantifieds()Z\"/>\n\t\t<method name=\"supportsTableCorrelationNames()Z\"/>\n\t\t<method name=\"supportsTransactionIsolationLevel(I)Z\"/>\n\t\t<method name=\"supportsTransactions()Z\"/>\n\t\t<method name=\"supportsUnion()Z\"/>\n\t\t<method name=\"supportsUnionAll()Z\"/>\n\t\t<method name=\"updatesAreDetected(I)Z\"/>\n\t\t<method name=\"usesLocalFilePerTable()Z\"/>\n\t\t<method name=\"usesLocalFiles()Z\"/>\n\t\t<field name=\"attributeNoNulls\"/>\n\t\t<field name=\"attributeNullable\"/>\n\t\t<field name=\"attributeNullableUnknown\"/>\n\t\t<field name=\"bestRowNotPseudo\"/>\n\t\t<field name=\"bestRowPseudo\"/>\n\t\t<field name=\"bestRowSession\"/>\n\t\t<field name=\"bestRowTemporary\"/>\n\t\t<field name=\"bestRowTransaction\"/>\n\t\t<field name=\"bestRowUnknown\"/>\n\t\t<field name=\"columnNoNulls\"/>\n\t\t<field name=\"columnNullable\"/>\n\t\t<field name=\"columnNullableUnknown\"/>\n\t\t<field name=\"functionColumnIn\" since=\"9\"/>\n\t\t<field name=\"functionColumnInOut\" since=\"9\"/>\n\t\t<field name=\"functionColumnOut\" since=\"9\"/>\n\t\t<field name=\"functionColumnResult\" since=\"9\"/>\n\t\t<field name=\"functionColumnUnknown\" since=\"9\"/>\n\t\t<field name=\"functionNoNulls\" since=\"9\"/>\n\t\t<field name=\"functionNoTable\" since=\"9\"/>\n\t\t<field name=\"functionNullable\" since=\"9\"/>\n\t\t<field name=\"functionNullableUnknown\" since=\"9\"/>\n\t\t<field name=\"functionResultUnknown\" since=\"9\"/>\n\t\t<field name=\"functionReturn\" since=\"9\"/>\n\t\t<field name=\"functionReturnsTable\" since=\"9\"/>\n\t\t<field name=\"importedKeyCascade\"/>\n\t\t<field name=\"importedKeyInitiallyDeferred\"/>\n\t\t<field name=\"importedKeyInitiallyImmediate\"/>\n\t\t<field name=\"importedKeyNoAction\"/>\n\t\t<field name=\"importedKeyNotDeferrable\"/>\n\t\t<field name=\"importedKeyRestrict\"/>\n\t\t<field name=\"importedKeySetDefault\"/>\n\t\t<field name=\"importedKeySetNull\"/>\n\t\t<field name=\"procedureColumnIn\"/>\n\t\t<field name=\"procedureColumnInOut\"/>\n\t\t<field name=\"procedureColumnOut\"/>\n\t\t<field name=\"procedureColumnResult\"/>\n\t\t<field name=\"procedureColumnReturn\"/>\n\t\t<field name=\"procedureColumnUnknown\"/>\n\t\t<field name=\"procedureNoNulls\"/>\n\t\t<field name=\"procedureNoResult\"/>\n\t\t<field name=\"procedureNullable\"/>\n\t\t<field name=\"procedureNullableUnknown\"/>\n\t\t<field name=\"procedureResultUnknown\"/>\n\t\t<field name=\"procedureReturnsResult\"/>\n\t\t<field name=\"sqlStateSQL\" since=\"9\"/>\n\t\t<field name=\"sqlStateSQL99\"/>\n\t\t<field name=\"sqlStateXOpen\"/>\n\t\t<field name=\"tableIndexClustered\"/>\n\t\t<field name=\"tableIndexHashed\"/>\n\t\t<field name=\"tableIndexOther\"/>\n\t\t<field name=\"tableIndexStatistic\"/>\n\t\t<field name=\"typeNoNulls\"/>\n\t\t<field name=\"typeNullable\"/>\n\t\t<field name=\"typeNullableUnknown\"/>\n\t\t<field name=\"typePredBasic\"/>\n\t\t<field name=\"typePredChar\"/>\n\t\t<field name=\"typePredNone\"/>\n\t\t<field name=\"typeSearchable\"/>\n\t\t<field name=\"versionColumnNotPseudo\"/>\n\t\t<field name=\"versionColumnPseudo\"/>\n\t\t<field name=\"versionColumnUnknown\"/>\n\t</class>\n\t<class name=\"java/sql/Date\" since=\"1\">\n\t\t<extends name=\"java/util/Date\"/>\n\t\t<method name=\"&lt;init>(III)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(J)V\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/sql/Date;\"/>\n\t</class>\n\t<class name=\"java/sql/Driver\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"acceptsURL(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"connect(Ljava/lang/String;Ljava/util/Properties;)Ljava/sql/Connection;\"/>\n\t\t<method name=\"getMajorVersion()I\"/>\n\t\t<method name=\"getMinorVersion()I\"/>\n\t\t<method name=\"getPropertyInfo(Ljava/lang/String;Ljava/util/Properties;)[Ljava/sql/DriverPropertyInfo;\"/>\n\t\t<method name=\"jdbcCompliant()Z\"/>\n\t</class>\n\t<class name=\"java/sql/DriverManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"deregisterDriver(Ljava/sql/Driver;)V\"/>\n\t\t<method name=\"getConnection(Ljava/lang/String;)Ljava/sql/Connection;\"/>\n\t\t<method name=\"getConnection(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/Connection;\"/>\n\t\t<method name=\"getConnection(Ljava/lang/String;Ljava/util/Properties;)Ljava/sql/Connection;\"/>\n\t\t<method name=\"getDriver(Ljava/lang/String;)Ljava/sql/Driver;\"/>\n\t\t<method name=\"getDrivers()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"getLogStream()Ljava/io/PrintStream;\" deprecated=\"15\"/>\n\t\t<method name=\"getLogWriter()Ljava/io/PrintWriter;\"/>\n\t\t<method name=\"getLoginTimeout()I\"/>\n\t\t<method name=\"println(Ljava/lang/String;)V\"/>\n\t\t<method name=\"registerDriver(Ljava/sql/Driver;)V\"/>\n\t\t<method name=\"setLogStream(Ljava/io/PrintStream;)V\" deprecated=\"15\"/>\n\t\t<method name=\"setLogWriter(Ljava/io/PrintWriter;)V\"/>\n\t\t<method name=\"setLoginTimeout(I)V\"/>\n\t</class>\n\t<class name=\"java/sql/DriverPropertyInfo\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<field name=\"choices\"/>\n\t\t<field name=\"description\"/>\n\t\t<field name=\"name\"/>\n\t\t<field name=\"required\"/>\n\t\t<field name=\"value\"/>\n\t</class>\n\t<class name=\"java/sql/NClob\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/sql/Clob\"/>\n\t</class>\n\t<class name=\"java/sql/ParameterMetaData\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/sql/Wrapper\" since=\"9\"/>\n\t\t<method name=\"getParameterClassName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getParameterCount()I\"/>\n\t\t<method name=\"getParameterMode(I)I\"/>\n\t\t<method name=\"getParameterType(I)I\"/>\n\t\t<method name=\"getParameterTypeName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getPrecision(I)I\"/>\n\t\t<method name=\"getScale(I)I\"/>\n\t\t<method name=\"isNullable(I)I\"/>\n\t\t<method name=\"isSigned(I)Z\"/>\n\t\t<field name=\"parameterModeIn\"/>\n\t\t<field name=\"parameterModeInOut\"/>\n\t\t<field name=\"parameterModeOut\"/>\n\t\t<field name=\"parameterModeUnknown\"/>\n\t\t<field name=\"parameterNoNulls\"/>\n\t\t<field name=\"parameterNullable\"/>\n\t\t<field name=\"parameterNullableUnknown\"/>\n\t</class>\n\t<class name=\"java/sql/PreparedStatement\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/sql/Statement\"/>\n\t\t<method name=\"addBatch()V\"/>\n\t\t<method name=\"clearParameters()V\"/>\n\t\t<method name=\"execute()Z\"/>\n\t\t<method name=\"executeQuery()Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"executeUpdate()I\"/>\n\t\t<method name=\"getMetaData()Ljava/sql/ResultSetMetaData;\"/>\n\t\t<method name=\"getParameterMetaData()Ljava/sql/ParameterMetaData;\"/>\n\t\t<method name=\"setArray(ILjava/sql/Array;)V\"/>\n\t\t<method name=\"setAsciiStream(ILjava/io/InputStream;)V\" since=\"9\"/>\n\t\t<method name=\"setAsciiStream(ILjava/io/InputStream;I)V\"/>\n\t\t<method name=\"setAsciiStream(ILjava/io/InputStream;J)V\" since=\"9\"/>\n\t\t<method name=\"setBigDecimal(ILjava/math/BigDecimal;)V\"/>\n\t\t<method name=\"setBinaryStream(ILjava/io/InputStream;)V\" since=\"9\"/>\n\t\t<method name=\"setBinaryStream(ILjava/io/InputStream;I)V\"/>\n\t\t<method name=\"setBinaryStream(ILjava/io/InputStream;J)V\" since=\"9\"/>\n\t\t<method name=\"setBlob(ILjava/io/InputStream;)V\" since=\"9\"/>\n\t\t<method name=\"setBlob(ILjava/io/InputStream;J)V\" since=\"9\"/>\n\t\t<method name=\"setBlob(ILjava/sql/Blob;)V\"/>\n\t\t<method name=\"setBoolean(IZ)V\"/>\n\t\t<method name=\"setByte(IB)V\"/>\n\t\t<method name=\"setBytes(I[B)V\"/>\n\t\t<method name=\"setCharacterStream(ILjava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"setCharacterStream(ILjava/io/Reader;I)V\"/>\n\t\t<method name=\"setCharacterStream(ILjava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"setClob(ILjava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"setClob(ILjava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"setClob(ILjava/sql/Clob;)V\"/>\n\t\t<method name=\"setDate(ILjava/sql/Date;)V\"/>\n\t\t<method name=\"setDate(ILjava/sql/Date;Ljava/util/Calendar;)V\"/>\n\t\t<method name=\"setDouble(ID)V\"/>\n\t\t<method name=\"setFloat(IF)V\"/>\n\t\t<method name=\"setInt(II)V\"/>\n\t\t<method name=\"setLong(IJ)V\"/>\n\t\t<method name=\"setNCharacterStream(ILjava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"setNCharacterStream(ILjava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"setNClob(ILjava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"setNClob(ILjava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"setNClob(ILjava/sql/NClob;)V\" since=\"9\"/>\n\t\t<method name=\"setNString(ILjava/lang/String;)V\" since=\"9\"/>\n\t\t<method name=\"setNull(II)V\"/>\n\t\t<method name=\"setNull(IILjava/lang/String;)V\"/>\n\t\t<method name=\"setObject(ILjava/lang/Object;)V\"/>\n\t\t<method name=\"setObject(ILjava/lang/Object;I)V\"/>\n\t\t<method name=\"setObject(ILjava/lang/Object;II)V\"/>\n\t\t<method name=\"setRef(ILjava/sql/Ref;)V\"/>\n\t\t<method name=\"setRowId(ILjava/sql/RowId;)V\" since=\"9\"/>\n\t\t<method name=\"setSQLXML(ILjava/sql/SQLXML;)V\" since=\"9\"/>\n\t\t<method name=\"setShort(IS)V\"/>\n\t\t<method name=\"setString(ILjava/lang/String;)V\"/>\n\t\t<method name=\"setTime(ILjava/sql/Time;)V\"/>\n\t\t<method name=\"setTime(ILjava/sql/Time;Ljava/util/Calendar;)V\"/>\n\t\t<method name=\"setTimestamp(ILjava/sql/Timestamp;)V\"/>\n\t\t<method name=\"setTimestamp(ILjava/sql/Timestamp;Ljava/util/Calendar;)V\"/>\n\t\t<method name=\"setURL(ILjava/net/URL;)V\"/>\n\t\t<method name=\"setUnicodeStream(ILjava/io/InputStream;I)V\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"java/sql/Ref\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getBaseTypeName()Ljava/lang/String;\"/>\n\t\t<method name=\"getObject()Ljava/lang/Object;\"/>\n\t\t<method name=\"getObject(Ljava/util/Map;)Ljava/lang/Object;\"/>\n\t\t<method name=\"setObject(Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"java/sql/ResultSet\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\" since=\"19\"/>\n\t\t<implements name=\"java/sql/Wrapper\" since=\"9\"/>\n\t\t<method name=\"absolute(I)Z\"/>\n\t\t<method name=\"afterLast()V\"/>\n\t\t<method name=\"beforeFirst()V\"/>\n\t\t<method name=\"cancelRowUpdates()V\"/>\n\t\t<method name=\"clearWarnings()V\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"deleteRow()V\"/>\n\t\t<method name=\"findColumn(Ljava/lang/String;)I\"/>\n\t\t<method name=\"first()Z\"/>\n\t\t<method name=\"getArray(I)Ljava/sql/Array;\"/>\n\t\t<method name=\"getArray(Ljava/lang/String;)Ljava/sql/Array;\"/>\n\t\t<method name=\"getAsciiStream(I)Ljava/io/InputStream;\"/>\n\t\t<method name=\"getAsciiStream(Ljava/lang/String;)Ljava/io/InputStream;\"/>\n\t\t<method name=\"getBigDecimal(I)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"getBigDecimal(II)Ljava/math/BigDecimal;\" deprecated=\"15\"/>\n\t\t<method name=\"getBigDecimal(Ljava/lang/String;)Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"getBigDecimal(Ljava/lang/String;I)Ljava/math/BigDecimal;\" deprecated=\"15\"/>\n\t\t<method name=\"getBinaryStream(I)Ljava/io/InputStream;\"/>\n\t\t<method name=\"getBinaryStream(Ljava/lang/String;)Ljava/io/InputStream;\"/>\n\t\t<method name=\"getBlob(I)Ljava/sql/Blob;\"/>\n\t\t<method name=\"getBlob(Ljava/lang/String;)Ljava/sql/Blob;\"/>\n\t\t<method name=\"getBoolean(I)Z\"/>\n\t\t<method name=\"getBoolean(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"getByte(I)B\"/>\n\t\t<method name=\"getByte(Ljava/lang/String;)B\"/>\n\t\t<method name=\"getBytes(I)[B\"/>\n\t\t<method name=\"getBytes(Ljava/lang/String;)[B\"/>\n\t\t<method name=\"getCharacterStream(I)Ljava/io/Reader;\"/>\n\t\t<method name=\"getCharacterStream(Ljava/lang/String;)Ljava/io/Reader;\"/>\n\t\t<method name=\"getClob(I)Ljava/sql/Clob;\"/>\n\t\t<method name=\"getClob(Ljava/lang/String;)Ljava/sql/Clob;\"/>\n\t\t<method name=\"getConcurrency()I\"/>\n\t\t<method name=\"getCursorName()Ljava/lang/String;\"/>\n\t\t<method name=\"getDate(I)Ljava/sql/Date;\"/>\n\t\t<method name=\"getDate(ILjava/util/Calendar;)Ljava/sql/Date;\"/>\n\t\t<method name=\"getDate(Ljava/lang/String;)Ljava/sql/Date;\"/>\n\t\t<method name=\"getDate(Ljava/lang/String;Ljava/util/Calendar;)Ljava/sql/Date;\"/>\n\t\t<method name=\"getDouble(I)D\"/>\n\t\t<method name=\"getDouble(Ljava/lang/String;)D\"/>\n\t\t<method name=\"getFetchDirection()I\"/>\n\t\t<method name=\"getFetchSize()I\"/>\n\t\t<method name=\"getFloat(I)F\"/>\n\t\t<method name=\"getFloat(Ljava/lang/String;)F\"/>\n\t\t<method name=\"getHoldability()I\" since=\"9\"/>\n\t\t<method name=\"getInt(I)I\"/>\n\t\t<method name=\"getInt(Ljava/lang/String;)I\"/>\n\t\t<method name=\"getLong(I)J\"/>\n\t\t<method name=\"getLong(Ljava/lang/String;)J\"/>\n\t\t<method name=\"getMetaData()Ljava/sql/ResultSetMetaData;\"/>\n\t\t<method name=\"getNCharacterStream(I)Ljava/io/Reader;\" since=\"9\"/>\n\t\t<method name=\"getNCharacterStream(Ljava/lang/String;)Ljava/io/Reader;\" since=\"9\"/>\n\t\t<method name=\"getNClob(I)Ljava/sql/NClob;\" since=\"9\"/>\n\t\t<method name=\"getNClob(Ljava/lang/String;)Ljava/sql/NClob;\" since=\"9\"/>\n\t\t<method name=\"getNString(I)Ljava/lang/String;\" since=\"9\"/>\n\t\t<method name=\"getNString(Ljava/lang/String;)Ljava/lang/String;\" since=\"9\"/>\n\t\t<method name=\"getObject(I)Ljava/lang/Object;\"/>\n\t\t<method name=\"getObject(ILjava/util/Map;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getObject(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getObject(Ljava/lang/String;Ljava/util/Map;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getRef(I)Ljava/sql/Ref;\"/>\n\t\t<method name=\"getRef(Ljava/lang/String;)Ljava/sql/Ref;\"/>\n\t\t<method name=\"getRow()I\"/>\n\t\t<method name=\"getRowId(I)Ljava/sql/RowId;\" since=\"9\"/>\n\t\t<method name=\"getRowId(Ljava/lang/String;)Ljava/sql/RowId;\" since=\"9\"/>\n\t\t<method name=\"getSQLXML(I)Ljava/sql/SQLXML;\" since=\"9\"/>\n\t\t<method name=\"getSQLXML(Ljava/lang/String;)Ljava/sql/SQLXML;\" since=\"9\"/>\n\t\t<method name=\"getShort(I)S\"/>\n\t\t<method name=\"getShort(Ljava/lang/String;)S\"/>\n\t\t<method name=\"getStatement()Ljava/sql/Statement;\"/>\n\t\t<method name=\"getString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getString(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getTime(I)Ljava/sql/Time;\"/>\n\t\t<method name=\"getTime(ILjava/util/Calendar;)Ljava/sql/Time;\"/>\n\t\t<method name=\"getTime(Ljava/lang/String;)Ljava/sql/Time;\"/>\n\t\t<method name=\"getTime(Ljava/lang/String;Ljava/util/Calendar;)Ljava/sql/Time;\"/>\n\t\t<method name=\"getTimestamp(I)Ljava/sql/Timestamp;\"/>\n\t\t<method name=\"getTimestamp(ILjava/util/Calendar;)Ljava/sql/Timestamp;\"/>\n\t\t<method name=\"getTimestamp(Ljava/lang/String;)Ljava/sql/Timestamp;\"/>\n\t\t<method name=\"getTimestamp(Ljava/lang/String;Ljava/util/Calendar;)Ljava/sql/Timestamp;\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<method name=\"getURL(I)Ljava/net/URL;\"/>\n\t\t<method name=\"getURL(Ljava/lang/String;)Ljava/net/URL;\"/>\n\t\t<method name=\"getUnicodeStream(I)Ljava/io/InputStream;\" deprecated=\"15\"/>\n\t\t<method name=\"getUnicodeStream(Ljava/lang/String;)Ljava/io/InputStream;\" deprecated=\"15\"/>\n\t\t<method name=\"getWarnings()Ljava/sql/SQLWarning;\"/>\n\t\t<method name=\"insertRow()V\"/>\n\t\t<method name=\"isAfterLast()Z\"/>\n\t\t<method name=\"isBeforeFirst()Z\"/>\n\t\t<method name=\"isClosed()Z\" since=\"9\"/>\n\t\t<method name=\"isFirst()Z\"/>\n\t\t<method name=\"isLast()Z\"/>\n\t\t<method name=\"last()Z\"/>\n\t\t<method name=\"moveToCurrentRow()V\"/>\n\t\t<method name=\"moveToInsertRow()V\"/>\n\t\t<method name=\"next()Z\"/>\n\t\t<method name=\"previous()Z\"/>\n\t\t<method name=\"refreshRow()V\"/>\n\t\t<method name=\"relative(I)Z\"/>\n\t\t<method name=\"rowDeleted()Z\"/>\n\t\t<method name=\"rowInserted()Z\"/>\n\t\t<method name=\"rowUpdated()Z\"/>\n\t\t<method name=\"setFetchDirection(I)V\"/>\n\t\t<method name=\"setFetchSize(I)V\"/>\n\t\t<method name=\"updateArray(ILjava/sql/Array;)V\"/>\n\t\t<method name=\"updateArray(Ljava/lang/String;Ljava/sql/Array;)V\"/>\n\t\t<method name=\"updateAsciiStream(ILjava/io/InputStream;)V\" since=\"9\"/>\n\t\t<method name=\"updateAsciiStream(ILjava/io/InputStream;I)V\"/>\n\t\t<method name=\"updateAsciiStream(ILjava/io/InputStream;J)V\" since=\"9\"/>\n\t\t<method name=\"updateAsciiStream(Ljava/lang/String;Ljava/io/InputStream;)V\" since=\"9\"/>\n\t\t<method name=\"updateAsciiStream(Ljava/lang/String;Ljava/io/InputStream;I)V\"/>\n\t\t<method name=\"updateAsciiStream(Ljava/lang/String;Ljava/io/InputStream;J)V\" since=\"9\"/>\n\t\t<method name=\"updateBigDecimal(ILjava/math/BigDecimal;)V\"/>\n\t\t<method name=\"updateBigDecimal(Ljava/lang/String;Ljava/math/BigDecimal;)V\"/>\n\t\t<method name=\"updateBinaryStream(ILjava/io/InputStream;)V\" since=\"9\"/>\n\t\t<method name=\"updateBinaryStream(ILjava/io/InputStream;I)V\"/>\n\t\t<method name=\"updateBinaryStream(ILjava/io/InputStream;J)V\" since=\"9\"/>\n\t\t<method name=\"updateBinaryStream(Ljava/lang/String;Ljava/io/InputStream;)V\" since=\"9\"/>\n\t\t<method name=\"updateBinaryStream(Ljava/lang/String;Ljava/io/InputStream;I)V\"/>\n\t\t<method name=\"updateBinaryStream(Ljava/lang/String;Ljava/io/InputStream;J)V\" since=\"9\"/>\n\t\t<method name=\"updateBlob(ILjava/io/InputStream;)V\" since=\"9\"/>\n\t\t<method name=\"updateBlob(ILjava/io/InputStream;J)V\" since=\"9\"/>\n\t\t<method name=\"updateBlob(ILjava/sql/Blob;)V\"/>\n\t\t<method name=\"updateBlob(Ljava/lang/String;Ljava/io/InputStream;)V\" since=\"9\"/>\n\t\t<method name=\"updateBlob(Ljava/lang/String;Ljava/io/InputStream;J)V\" since=\"9\"/>\n\t\t<method name=\"updateBlob(Ljava/lang/String;Ljava/sql/Blob;)V\"/>\n\t\t<method name=\"updateBoolean(IZ)V\"/>\n\t\t<method name=\"updateBoolean(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"updateByte(IB)V\"/>\n\t\t<method name=\"updateByte(Ljava/lang/String;B)V\"/>\n\t\t<method name=\"updateBytes(I[B)V\"/>\n\t\t<method name=\"updateBytes(Ljava/lang/String;[B)V\"/>\n\t\t<method name=\"updateCharacterStream(ILjava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"updateCharacterStream(ILjava/io/Reader;I)V\"/>\n\t\t<method name=\"updateCharacterStream(ILjava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"updateCharacterStream(Ljava/lang/String;Ljava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"updateCharacterStream(Ljava/lang/String;Ljava/io/Reader;I)V\"/>\n\t\t<method name=\"updateCharacterStream(Ljava/lang/String;Ljava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"updateClob(ILjava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"updateClob(ILjava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"updateClob(ILjava/sql/Clob;)V\"/>\n\t\t<method name=\"updateClob(Ljava/lang/String;Ljava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"updateClob(Ljava/lang/String;Ljava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"updateClob(Ljava/lang/String;Ljava/sql/Clob;)V\"/>\n\t\t<method name=\"updateDate(ILjava/sql/Date;)V\"/>\n\t\t<method name=\"updateDate(Ljava/lang/String;Ljava/sql/Date;)V\"/>\n\t\t<method name=\"updateDouble(ID)V\"/>\n\t\t<method name=\"updateDouble(Ljava/lang/String;D)V\"/>\n\t\t<method name=\"updateFloat(IF)V\"/>\n\t\t<method name=\"updateFloat(Ljava/lang/String;F)V\"/>\n\t\t<method name=\"updateInt(II)V\"/>\n\t\t<method name=\"updateInt(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"updateLong(IJ)V\"/>\n\t\t<method name=\"updateLong(Ljava/lang/String;J)V\"/>\n\t\t<method name=\"updateNCharacterStream(ILjava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"updateNCharacterStream(ILjava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"updateNCharacterStream(Ljava/lang/String;Ljava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"updateNCharacterStream(Ljava/lang/String;Ljava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"updateNClob(ILjava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"updateNClob(ILjava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"updateNClob(ILjava/sql/NClob;)V\" since=\"9\"/>\n\t\t<method name=\"updateNClob(Ljava/lang/String;Ljava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"updateNClob(Ljava/lang/String;Ljava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"updateNClob(Ljava/lang/String;Ljava/sql/NClob;)V\" since=\"9\"/>\n\t\t<method name=\"updateNString(ILjava/lang/String;)V\" since=\"9\"/>\n\t\t<method name=\"updateNString(Ljava/lang/String;Ljava/lang/String;)V\" since=\"9\"/>\n\t\t<method name=\"updateNull(I)V\"/>\n\t\t<method name=\"updateNull(Ljava/lang/String;)V\"/>\n\t\t<method name=\"updateObject(ILjava/lang/Object;)V\"/>\n\t\t<method name=\"updateObject(ILjava/lang/Object;I)V\"/>\n\t\t<method name=\"updateObject(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"updateObject(Ljava/lang/String;Ljava/lang/Object;I)V\"/>\n\t\t<method name=\"updateRef(ILjava/sql/Ref;)V\"/>\n\t\t<method name=\"updateRef(Ljava/lang/String;Ljava/sql/Ref;)V\"/>\n\t\t<method name=\"updateRow()V\"/>\n\t\t<method name=\"updateRowId(ILjava/sql/RowId;)V\" since=\"9\"/>\n\t\t<method name=\"updateRowId(Ljava/lang/String;Ljava/sql/RowId;)V\" since=\"9\"/>\n\t\t<method name=\"updateSQLXML(ILjava/sql/SQLXML;)V\" since=\"9\"/>\n\t\t<method name=\"updateSQLXML(Ljava/lang/String;Ljava/sql/SQLXML;)V\" since=\"9\"/>\n\t\t<method name=\"updateShort(IS)V\"/>\n\t\t<method name=\"updateShort(Ljava/lang/String;S)V\"/>\n\t\t<method name=\"updateString(ILjava/lang/String;)V\"/>\n\t\t<method name=\"updateString(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"updateTime(ILjava/sql/Time;)V\"/>\n\t\t<method name=\"updateTime(Ljava/lang/String;Ljava/sql/Time;)V\"/>\n\t\t<method name=\"updateTimestamp(ILjava/sql/Timestamp;)V\"/>\n\t\t<method name=\"updateTimestamp(Ljava/lang/String;Ljava/sql/Timestamp;)V\"/>\n\t\t<method name=\"wasNull()Z\"/>\n\t\t<field name=\"CLOSE_CURSORS_AT_COMMIT\"/>\n\t\t<field name=\"CONCUR_READ_ONLY\"/>\n\t\t<field name=\"CONCUR_UPDATABLE\"/>\n\t\t<field name=\"FETCH_FORWARD\"/>\n\t\t<field name=\"FETCH_REVERSE\"/>\n\t\t<field name=\"FETCH_UNKNOWN\"/>\n\t\t<field name=\"HOLD_CURSORS_OVER_COMMIT\"/>\n\t\t<field name=\"TYPE_FORWARD_ONLY\"/>\n\t\t<field name=\"TYPE_SCROLL_INSENSITIVE\"/>\n\t\t<field name=\"TYPE_SCROLL_SENSITIVE\"/>\n\t</class>\n\t<class name=\"java/sql/ResultSetMetaData\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/sql/Wrapper\" since=\"9\"/>\n\t\t<method name=\"getCatalogName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getColumnClassName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getColumnCount()I\"/>\n\t\t<method name=\"getColumnDisplaySize(I)I\"/>\n\t\t<method name=\"getColumnLabel(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getColumnName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getColumnType(I)I\"/>\n\t\t<method name=\"getColumnTypeName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getPrecision(I)I\"/>\n\t\t<method name=\"getScale(I)I\"/>\n\t\t<method name=\"getSchemaName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getTableName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"isAutoIncrement(I)Z\"/>\n\t\t<method name=\"isCaseSensitive(I)Z\"/>\n\t\t<method name=\"isCurrency(I)Z\"/>\n\t\t<method name=\"isDefinitelyWritable(I)Z\"/>\n\t\t<method name=\"isNullable(I)I\"/>\n\t\t<method name=\"isReadOnly(I)Z\"/>\n\t\t<method name=\"isSearchable(I)Z\"/>\n\t\t<method name=\"isSigned(I)Z\"/>\n\t\t<method name=\"isWritable(I)Z\"/>\n\t\t<field name=\"columnNoNulls\"/>\n\t\t<field name=\"columnNullable\"/>\n\t\t<field name=\"columnNullableUnknown\"/>\n\t</class>\n\t<class name=\"java/sql/RowId\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getBytes()[B\"/>\n\t</class>\n\t<class name=\"java/sql/RowIdLifetime\" since=\"9\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/sql/RowIdLifetime;\"/>\n\t\t<method name=\"values()[Ljava/sql/RowIdLifetime;\"/>\n\t\t<field name=\"ROWID_UNSUPPORTED\"/>\n\t\t<field name=\"ROWID_VALID_FOREVER\"/>\n\t\t<field name=\"ROWID_VALID_OTHER\"/>\n\t\t<field name=\"ROWID_VALID_SESSION\"/>\n\t\t<field name=\"ROWID_VALID_TRANSACTION\"/>\n\t</class>\n\t<class name=\"java/sql/SQLClientInfoException\" since=\"9\">\n\t\t<extends name=\"java/sql/SQLException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/util/Map;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/util/Map;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/util/Map;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/util/Map;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Map;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Map;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"getFailedProperties()Ljava/util/Map;\"/>\n\t</class>\n\t<class name=\"java/sql/SQLData\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getSQLTypeName()Ljava/lang/String;\"/>\n\t\t<method name=\"readSQL(Ljava/sql/SQLInput;Ljava/lang/String;)V\"/>\n\t\t<method name=\"writeSQL(Ljava/sql/SQLOutput;)V\"/>\n\t</class>\n\t<class name=\"java/sql/SQLDataException\" since=\"9\">\n\t\t<extends name=\"java/sql/SQLNonTransientException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/sql/SQLException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<implements name=\"java/lang/Iterable\" since=\"9\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V\" since=\"9\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V\" since=\"9\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\" since=\"9\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\" since=\"9\"/>\n\t\t<method name=\"getErrorCode()I\"/>\n\t\t<method name=\"getNextException()Ljava/sql/SQLException;\"/>\n\t\t<method name=\"getSQLState()Ljava/lang/String;\"/>\n\t\t<method name=\"setNextException(Ljava/sql/SQLException;)V\"/>\n\t</class>\n\t<class name=\"java/sql/SQLFeatureNotSupportedException\" since=\"9\">\n\t\t<extends name=\"java/sql/SQLNonTransientException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/sql/SQLInput\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"readArray()Ljava/sql/Array;\"/>\n\t\t<method name=\"readAsciiStream()Ljava/io/InputStream;\"/>\n\t\t<method name=\"readBigDecimal()Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"readBinaryStream()Ljava/io/InputStream;\"/>\n\t\t<method name=\"readBlob()Ljava/sql/Blob;\"/>\n\t\t<method name=\"readBoolean()Z\"/>\n\t\t<method name=\"readByte()B\"/>\n\t\t<method name=\"readBytes()[B\"/>\n\t\t<method name=\"readCharacterStream()Ljava/io/Reader;\"/>\n\t\t<method name=\"readClob()Ljava/sql/Clob;\"/>\n\t\t<method name=\"readDate()Ljava/sql/Date;\"/>\n\t\t<method name=\"readDouble()D\"/>\n\t\t<method name=\"readFloat()F\"/>\n\t\t<method name=\"readInt()I\"/>\n\t\t<method name=\"readLong()J\"/>\n\t\t<method name=\"readNClob()Ljava/sql/NClob;\" since=\"9\"/>\n\t\t<method name=\"readNString()Ljava/lang/String;\" since=\"9\"/>\n\t\t<method name=\"readObject()Ljava/lang/Object;\"/>\n\t\t<method name=\"readRef()Ljava/sql/Ref;\"/>\n\t\t<method name=\"readRowId()Ljava/sql/RowId;\" since=\"9\"/>\n\t\t<method name=\"readSQLXML()Ljava/sql/SQLXML;\" since=\"9\"/>\n\t\t<method name=\"readShort()S\"/>\n\t\t<method name=\"readString()Ljava/lang/String;\"/>\n\t\t<method name=\"readTime()Ljava/sql/Time;\"/>\n\t\t<method name=\"readTimestamp()Ljava/sql/Timestamp;\"/>\n\t\t<method name=\"readURL()Ljava/net/URL;\"/>\n\t\t<method name=\"wasNull()Z\"/>\n\t</class>\n\t<class name=\"java/sql/SQLIntegrityConstraintViolationException\" since=\"9\">\n\t\t<extends name=\"java/sql/SQLNonTransientException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/sql/SQLInvalidAuthorizationSpecException\" since=\"9\">\n\t\t<extends name=\"java/sql/SQLNonTransientException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/sql/SQLNonTransientConnectionException\" since=\"9\">\n\t\t<extends name=\"java/sql/SQLNonTransientException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/sql/SQLNonTransientException\" since=\"9\">\n\t\t<extends name=\"java/sql/SQLException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/sql/SQLOutput\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"writeArray(Ljava/sql/Array;)V\"/>\n\t\t<method name=\"writeAsciiStream(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"writeBigDecimal(Ljava/math/BigDecimal;)V\"/>\n\t\t<method name=\"writeBinaryStream(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"writeBlob(Ljava/sql/Blob;)V\"/>\n\t\t<method name=\"writeBoolean(Z)V\"/>\n\t\t<method name=\"writeByte(B)V\"/>\n\t\t<method name=\"writeBytes([B)V\"/>\n\t\t<method name=\"writeCharacterStream(Ljava/io/Reader;)V\"/>\n\t\t<method name=\"writeClob(Ljava/sql/Clob;)V\"/>\n\t\t<method name=\"writeDate(Ljava/sql/Date;)V\"/>\n\t\t<method name=\"writeDouble(D)V\"/>\n\t\t<method name=\"writeFloat(F)V\"/>\n\t\t<method name=\"writeInt(I)V\"/>\n\t\t<method name=\"writeLong(J)V\"/>\n\t\t<method name=\"writeNClob(Ljava/sql/NClob;)V\" since=\"9\"/>\n\t\t<method name=\"writeNString(Ljava/lang/String;)V\" since=\"9\"/>\n\t\t<method name=\"writeObject(Ljava/sql/SQLData;)V\"/>\n\t\t<method name=\"writeRef(Ljava/sql/Ref;)V\"/>\n\t\t<method name=\"writeRowId(Ljava/sql/RowId;)V\" since=\"9\"/>\n\t\t<method name=\"writeSQLXML(Ljava/sql/SQLXML;)V\" since=\"9\"/>\n\t\t<method name=\"writeShort(S)V\"/>\n\t\t<method name=\"writeString(Ljava/lang/String;)V\"/>\n\t\t<method name=\"writeStruct(Ljava/sql/Struct;)V\"/>\n\t\t<method name=\"writeTime(Ljava/sql/Time;)V\"/>\n\t\t<method name=\"writeTimestamp(Ljava/sql/Timestamp;)V\"/>\n\t\t<method name=\"writeURL(Ljava/net/URL;)V\"/>\n\t</class>\n\t<class name=\"java/sql/SQLPermission\" since=\"1\">\n\t\t<extends name=\"java/security/BasicPermission\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/sql/SQLRecoverableException\" since=\"9\">\n\t\t<extends name=\"java/sql/SQLException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/sql/SQLSyntaxErrorException\" since=\"9\">\n\t\t<extends name=\"java/sql/SQLNonTransientException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/sql/SQLTimeoutException\" since=\"9\">\n\t\t<extends name=\"java/sql/SQLTransientException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/sql/SQLTransactionRollbackException\" since=\"9\">\n\t\t<extends name=\"java/sql/SQLTransientException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/sql/SQLTransientConnectionException\" since=\"9\">\n\t\t<extends name=\"java/sql/SQLTransientException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/sql/SQLTransientException\" since=\"9\">\n\t\t<extends name=\"java/sql/SQLException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/sql/SQLWarning\" since=\"1\">\n\t\t<extends name=\"java/sql/SQLException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V\" since=\"9\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V\" since=\"9\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\" since=\"9\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\" since=\"9\"/>\n\t\t<method name=\"getNextWarning()Ljava/sql/SQLWarning;\"/>\n\t\t<method name=\"setNextWarning(Ljava/sql/SQLWarning;)V\"/>\n\t</class>\n\t<class name=\"java/sql/SQLXML\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"free()V\"/>\n\t\t<method name=\"getBinaryStream()Ljava/io/InputStream;\"/>\n\t\t<method name=\"getCharacterStream()Ljava/io/Reader;\"/>\n\t\t<method name=\"getSource(Ljava/lang/Class;)Ljavax/xml/transform/Source;\"/>\n\t\t<method name=\"getString()Ljava/lang/String;\"/>\n\t\t<method name=\"setBinaryStream()Ljava/io/OutputStream;\"/>\n\t\t<method name=\"setCharacterStream()Ljava/io/Writer;\"/>\n\t\t<method name=\"setResult(Ljava/lang/Class;)Ljavax/xml/transform/Result;\"/>\n\t\t<method name=\"setString(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/sql/Savepoint\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getSavepointId()I\"/>\n\t\t<method name=\"getSavepointName()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/sql/Statement\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\" since=\"19\"/>\n\t\t<implements name=\"java/sql/Wrapper\" since=\"9\"/>\n\t\t<method name=\"addBatch(Ljava/lang/String;)V\"/>\n\t\t<method name=\"cancel()V\"/>\n\t\t<method name=\"clearBatch()V\"/>\n\t\t<method name=\"clearWarnings()V\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"execute(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"execute(Ljava/lang/String;I)Z\"/>\n\t\t<method name=\"execute(Ljava/lang/String;[I)Z\"/>\n\t\t<method name=\"execute(Ljava/lang/String;[Ljava/lang/String;)Z\"/>\n\t\t<method name=\"executeBatch()[I\"/>\n\t\t<method name=\"executeQuery(Ljava/lang/String;)Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"executeUpdate(Ljava/lang/String;)I\"/>\n\t\t<method name=\"executeUpdate(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"executeUpdate(Ljava/lang/String;[I)I\"/>\n\t\t<method name=\"executeUpdate(Ljava/lang/String;[Ljava/lang/String;)I\"/>\n\t\t<method name=\"getConnection()Ljava/sql/Connection;\"/>\n\t\t<method name=\"getFetchDirection()I\"/>\n\t\t<method name=\"getFetchSize()I\"/>\n\t\t<method name=\"getGeneratedKeys()Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getMaxFieldSize()I\"/>\n\t\t<method name=\"getMaxRows()I\"/>\n\t\t<method name=\"getMoreResults()Z\"/>\n\t\t<method name=\"getMoreResults(I)Z\"/>\n\t\t<method name=\"getQueryTimeout()I\"/>\n\t\t<method name=\"getResultSet()Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getResultSetConcurrency()I\"/>\n\t\t<method name=\"getResultSetHoldability()I\"/>\n\t\t<method name=\"getResultSetType()I\"/>\n\t\t<method name=\"getUpdateCount()I\"/>\n\t\t<method name=\"getWarnings()Ljava/sql/SQLWarning;\"/>\n\t\t<method name=\"isClosed()Z\" since=\"9\"/>\n\t\t<method name=\"isPoolable()Z\" since=\"9\"/>\n\t\t<method name=\"setCursorName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setEscapeProcessing(Z)V\"/>\n\t\t<method name=\"setFetchDirection(I)V\"/>\n\t\t<method name=\"setFetchSize(I)V\"/>\n\t\t<method name=\"setMaxFieldSize(I)V\"/>\n\t\t<method name=\"setMaxRows(I)V\"/>\n\t\t<method name=\"setPoolable(Z)V\" since=\"9\"/>\n\t\t<method name=\"setQueryTimeout(I)V\"/>\n\t\t<field name=\"CLOSE_ALL_RESULTS\"/>\n\t\t<field name=\"CLOSE_CURRENT_RESULT\"/>\n\t\t<field name=\"EXECUTE_FAILED\"/>\n\t\t<field name=\"KEEP_CURRENT_RESULT\"/>\n\t\t<field name=\"NO_GENERATED_KEYS\"/>\n\t\t<field name=\"RETURN_GENERATED_KEYS\"/>\n\t\t<field name=\"SUCCESS_NO_INFO\"/>\n\t</class>\n\t<class name=\"java/sql/Struct\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAttributes()[Ljava/lang/Object;\"/>\n\t\t<method name=\"getAttributes(Ljava/util/Map;)[Ljava/lang/Object;\"/>\n\t\t<method name=\"getSQLTypeName()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/sql/Time\" since=\"1\">\n\t\t<extends name=\"java/util/Date\"/>\n\t\t<method name=\"&lt;init>(III)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(J)V\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/sql/Time;\"/>\n\t</class>\n\t<class name=\"java/sql/Timestamp\" since=\"1\">\n\t\t<extends name=\"java/util/Date\"/>\n\t\t<method name=\"&lt;init>(IIIIIII)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(J)V\"/>\n\t\t<method name=\"after(Ljava/sql/Timestamp;)Z\"/>\n\t\t<method name=\"before(Ljava/sql/Timestamp;)Z\"/>\n\t\t<method name=\"compareTo(Ljava/sql/Timestamp;)I\"/>\n\t\t<method name=\"equals(Ljava/sql/Timestamp;)Z\"/>\n\t\t<method name=\"getNanos()I\"/>\n\t\t<method name=\"setNanos(I)V\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/sql/Timestamp;\"/>\n\t</class>\n\t<class name=\"java/sql/Types\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ARRAY\"/>\n\t\t<field name=\"BIGINT\"/>\n\t\t<field name=\"BINARY\"/>\n\t\t<field name=\"BIT\"/>\n\t\t<field name=\"BLOB\"/>\n\t\t<field name=\"BOOLEAN\"/>\n\t\t<field name=\"CHAR\"/>\n\t\t<field name=\"CLOB\"/>\n\t\t<field name=\"DATALINK\"/>\n\t\t<field name=\"DATE\"/>\n\t\t<field name=\"DECIMAL\"/>\n\t\t<field name=\"DISTINCT\"/>\n\t\t<field name=\"DOUBLE\"/>\n\t\t<field name=\"FLOAT\"/>\n\t\t<field name=\"INTEGER\"/>\n\t\t<field name=\"JAVA_OBJECT\"/>\n\t\t<field name=\"LONGNVARCHAR\" since=\"9\"/>\n\t\t<field name=\"LONGVARBINARY\"/>\n\t\t<field name=\"LONGVARCHAR\"/>\n\t\t<field name=\"NCHAR\" since=\"9\"/>\n\t\t<field name=\"NCLOB\" since=\"9\"/>\n\t\t<field name=\"NULL\"/>\n\t\t<field name=\"NUMERIC\"/>\n\t\t<field name=\"NVARCHAR\" since=\"9\"/>\n\t\t<field name=\"OTHER\"/>\n\t\t<field name=\"REAL\"/>\n\t\t<field name=\"REF\"/>\n\t\t<field name=\"ROWID\" since=\"9\"/>\n\t\t<field name=\"SMALLINT\"/>\n\t\t<field name=\"SQLXML\" since=\"9\"/>\n\t\t<field name=\"STRUCT\"/>\n\t\t<field name=\"TIME\"/>\n\t\t<field name=\"TIMESTAMP\"/>\n\t\t<field name=\"TINYINT\"/>\n\t\t<field name=\"VARBINARY\"/>\n\t\t<field name=\"VARCHAR\"/>\n\t</class>\n\t<class name=\"java/sql/Wrapper\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"isWrapperFor(Ljava/lang/Class;)Z\"/>\n\t\t<method name=\"unwrap(Ljava/lang/Class;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/text/Annotation\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"getValue()Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/text/AttributedCharacterIterator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/text/CharacterIterator\"/>\n\t\t<method name=\"getAllAttributeKeys()Ljava/util/Set;\"/>\n\t\t<method name=\"getAttribute(Ljava/text/AttributedCharacterIterator$Attribute;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getAttributes()Ljava/util/Map;\"/>\n\t\t<method name=\"getRunLimit()I\"/>\n\t\t<method name=\"getRunLimit(Ljava/text/AttributedCharacterIterator$Attribute;)I\"/>\n\t\t<method name=\"getRunLimit(Ljava/util/Set;)I\"/>\n\t\t<method name=\"getRunStart()I\"/>\n\t\t<method name=\"getRunStart(Ljava/text/AttributedCharacterIterator$Attribute;)I\"/>\n\t\t<method name=\"getRunStart(Ljava/util/Set;)I\"/>\n\t</class>\n\t<class name=\"java/text/AttributedCharacterIterator$Attribute\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"readResolve()Ljava/lang/Object;\"/>\n\t\t<field name=\"INPUT_METHOD_SEGMENT\"/>\n\t\t<field name=\"LANGUAGE\"/>\n\t\t<field name=\"READING\"/>\n\t</class>\n\t<class name=\"java/text/AttributedString\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/util/Map;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/text/AttributedCharacterIterator;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/text/AttributedCharacterIterator;II)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/text/AttributedCharacterIterator;II[Ljava/text/AttributedCharacterIterator$Attribute;)V\"/>\n\t\t<method name=\"addAttribute(Ljava/text/AttributedCharacterIterator$Attribute;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"addAttribute(Ljava/text/AttributedCharacterIterator$Attribute;Ljava/lang/Object;II)V\"/>\n\t\t<method name=\"addAttributes(Ljava/util/Map;II)V\"/>\n\t\t<method name=\"getIterator()Ljava/text/AttributedCharacterIterator;\"/>\n\t\t<method name=\"getIterator([Ljava/text/AttributedCharacterIterator$Attribute;)Ljava/text/AttributedCharacterIterator;\"/>\n\t\t<method name=\"getIterator([Ljava/text/AttributedCharacterIterator$Attribute;II)Ljava/text/AttributedCharacterIterator;\"/>\n\t</class>\n\t<class name=\"java/text/Bidi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/text/AttributedCharacterIterator;)V\"/>\n\t\t<method name=\"&lt;init>([CI[BIII)V\"/>\n\t\t<method name=\"baseIsLeftToRight()Z\"/>\n\t\t<method name=\"createLineBidi(II)Ljava/text/Bidi;\"/>\n\t\t<method name=\"getBaseLevel()I\"/>\n\t\t<method name=\"getLength()I\"/>\n\t\t<method name=\"getLevelAt(I)I\"/>\n\t\t<method name=\"getRunCount()I\"/>\n\t\t<method name=\"getRunLevel(I)I\"/>\n\t\t<method name=\"getRunLimit(I)I\"/>\n\t\t<method name=\"getRunStart(I)I\"/>\n\t\t<method name=\"isLeftToRight()Z\"/>\n\t\t<method name=\"isMixed()Z\"/>\n\t\t<method name=\"isRightToLeft()Z\"/>\n\t\t<method name=\"reorderVisually([BI[Ljava/lang/Object;II)V\"/>\n\t\t<method name=\"requiresBidi([CII)Z\"/>\n\t\t<field name=\"DIRECTION_DEFAULT_LEFT_TO_RIGHT\"/>\n\t\t<field name=\"DIRECTION_DEFAULT_RIGHT_TO_LEFT\"/>\n\t\t<field name=\"DIRECTION_LEFT_TO_RIGHT\"/>\n\t\t<field name=\"DIRECTION_RIGHT_TO_LEFT\"/>\n\t</class>\n\t<class name=\"java/text/BreakIterator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"current()I\"/>\n\t\t<method name=\"first()I\"/>\n\t\t<method name=\"following(I)I\"/>\n\t\t<method name=\"getAvailableLocales()[Ljava/util/Locale;\"/>\n\t\t<method name=\"getCharacterInstance()Ljava/text/BreakIterator;\"/>\n\t\t<method name=\"getCharacterInstance(Ljava/util/Locale;)Ljava/text/BreakIterator;\"/>\n\t\t<method name=\"getInt([BI)I\" removed=\"9\"/>\n\t\t<method name=\"getLineInstance()Ljava/text/BreakIterator;\"/>\n\t\t<method name=\"getLineInstance(Ljava/util/Locale;)Ljava/text/BreakIterator;\"/>\n\t\t<method name=\"getLong([BI)J\" removed=\"9\"/>\n\t\t<method name=\"getSentenceInstance()Ljava/text/BreakIterator;\"/>\n\t\t<method name=\"getSentenceInstance(Ljava/util/Locale;)Ljava/text/BreakIterator;\"/>\n\t\t<method name=\"getShort([BI)S\" removed=\"9\"/>\n\t\t<method name=\"getText()Ljava/text/CharacterIterator;\"/>\n\t\t<method name=\"getWordInstance()Ljava/text/BreakIterator;\"/>\n\t\t<method name=\"getWordInstance(Ljava/util/Locale;)Ljava/text/BreakIterator;\"/>\n\t\t<method name=\"isBoundary(I)Z\"/>\n\t\t<method name=\"last()I\"/>\n\t\t<method name=\"next()I\"/>\n\t\t<method name=\"next(I)I\"/>\n\t\t<method name=\"preceding(I)I\"/>\n\t\t<method name=\"previous()I\"/>\n\t\t<method name=\"setText(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setText(Ljava/text/CharacterIterator;)V\"/>\n\t\t<field name=\"DONE\"/>\n\t</class>\n\t<class name=\"java/text/CharacterIterator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"current()C\"/>\n\t\t<method name=\"first()C\"/>\n\t\t<method name=\"getBeginIndex()I\"/>\n\t\t<method name=\"getEndIndex()I\"/>\n\t\t<method name=\"getIndex()I\"/>\n\t\t<method name=\"last()C\"/>\n\t\t<method name=\"next()C\"/>\n\t\t<method name=\"previous()C\"/>\n\t\t<method name=\"setIndex(I)C\"/>\n\t\t<field name=\"DONE\"/>\n\t</class>\n\t<class name=\"java/text/ChoiceFormat\" since=\"1\">\n\t\t<extends name=\"java/text/NumberFormat\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>([D[Ljava/lang/String;)V\"/>\n\t\t<method name=\"applyPattern(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getFormats()[Ljava/lang/Object;\"/>\n\t\t<method name=\"getLimits()[D\"/>\n\t\t<method name=\"nextDouble(D)D\"/>\n\t\t<method name=\"nextDouble(DZ)D\"/>\n\t\t<method name=\"previousDouble(D)D\"/>\n\t\t<method name=\"setChoices([D[Ljava/lang/String;)V\"/>\n\t\t<method name=\"toPattern()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/text/CollationElementIterator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getMaxExpansion(I)I\"/>\n\t\t<method name=\"getOffset()I\"/>\n\t\t<method name=\"next()I\"/>\n\t\t<method name=\"previous()I\"/>\n\t\t<method name=\"primaryOrder(I)I\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"secondaryOrder(I)S\"/>\n\t\t<method name=\"setOffset(I)V\"/>\n\t\t<method name=\"setText(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setText(Ljava/text/CharacterIterator;)V\"/>\n\t\t<method name=\"tertiaryOrder(I)S\"/>\n\t\t<field name=\"NULLORDER\"/>\n\t</class>\n\t<class name=\"java/text/CollationKey\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" since=\"9\"/>\n\t\t<method name=\"compareTo(Ljava/text/CollationKey;)I\"/>\n\t\t<method name=\"getSourceString()Ljava/lang/String;\"/>\n\t\t<method name=\"toByteArray()[B\"/>\n\t</class>\n\t<class name=\"java/text/Collator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"java/util/Comparator\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"compare(Ljava/lang/String;Ljava/lang/String;)I\"/>\n\t\t<method name=\"equals(Ljava/lang/String;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"getAvailableLocales()[Ljava/util/Locale;\"/>\n\t\t<method name=\"getCollationKey(Ljava/lang/String;)Ljava/text/CollationKey;\"/>\n\t\t<method name=\"getDecomposition()I\"/>\n\t\t<method name=\"getInstance()Ljava/text/Collator;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Ljava/text/Collator;\"/>\n\t\t<method name=\"getStrength()I\"/>\n\t\t<method name=\"setDecomposition(I)V\"/>\n\t\t<method name=\"setStrength(I)V\"/>\n\t\t<field name=\"CANONICAL_DECOMPOSITION\"/>\n\t\t<field name=\"FULL_DECOMPOSITION\"/>\n\t\t<field name=\"IDENTICAL\"/>\n\t\t<field name=\"NO_DECOMPOSITION\"/>\n\t\t<field name=\"PRIMARY\"/>\n\t\t<field name=\"SECONDARY\"/>\n\t\t<field name=\"TERTIARY\"/>\n\t</class>\n\t<class name=\"java/text/DateFormat\" since=\"1\">\n\t\t<extends name=\"java/text/Format\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"format(Ljava/util/Date;)Ljava/lang/String;\"/>\n\t\t<method name=\"format(Ljava/util/Date;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"getAvailableLocales()[Ljava/util/Locale;\"/>\n\t\t<method name=\"getCalendar()Ljava/util/Calendar;\"/>\n\t\t<method name=\"getDateInstance()Ljava/text/DateFormat;\"/>\n\t\t<method name=\"getDateInstance(I)Ljava/text/DateFormat;\"/>\n\t\t<method name=\"getDateInstance(ILjava/util/Locale;)Ljava/text/DateFormat;\"/>\n\t\t<method name=\"getDateTimeInstance()Ljava/text/DateFormat;\"/>\n\t\t<method name=\"getDateTimeInstance(II)Ljava/text/DateFormat;\"/>\n\t\t<method name=\"getDateTimeInstance(IILjava/util/Locale;)Ljava/text/DateFormat;\"/>\n\t\t<method name=\"getInstance()Ljava/text/DateFormat;\"/>\n\t\t<method name=\"getNumberFormat()Ljava/text/NumberFormat;\"/>\n\t\t<method name=\"getTimeInstance()Ljava/text/DateFormat;\"/>\n\t\t<method name=\"getTimeInstance(I)Ljava/text/DateFormat;\"/>\n\t\t<method name=\"getTimeInstance(ILjava/util/Locale;)Ljava/text/DateFormat;\"/>\n\t\t<method name=\"getTimeZone()Ljava/util/TimeZone;\"/>\n\t\t<method name=\"isLenient()Z\"/>\n\t\t<method name=\"parse(Ljava/lang/String;)Ljava/util/Date;\"/>\n\t\t<method name=\"parse(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/util/Date;\"/>\n\t\t<method name=\"setCalendar(Ljava/util/Calendar;)V\"/>\n\t\t<method name=\"setLenient(Z)V\"/>\n\t\t<method name=\"setNumberFormat(Ljava/text/NumberFormat;)V\"/>\n\t\t<method name=\"setTimeZone(Ljava/util/TimeZone;)V\"/>\n\t\t<field name=\"AM_PM_FIELD\"/>\n\t\t<field name=\"DATE_FIELD\"/>\n\t\t<field name=\"DAY_OF_WEEK_FIELD\"/>\n\t\t<field name=\"DAY_OF_WEEK_IN_MONTH_FIELD\"/>\n\t\t<field name=\"DAY_OF_YEAR_FIELD\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t\t<field name=\"ERA_FIELD\"/>\n\t\t<field name=\"FULL\"/>\n\t\t<field name=\"HOUR0_FIELD\"/>\n\t\t<field name=\"HOUR1_FIELD\"/>\n\t\t<field name=\"HOUR_OF_DAY0_FIELD\"/>\n\t\t<field name=\"HOUR_OF_DAY1_FIELD\"/>\n\t\t<field name=\"LONG\"/>\n\t\t<field name=\"MEDIUM\"/>\n\t\t<field name=\"MILLISECOND_FIELD\"/>\n\t\t<field name=\"MINUTE_FIELD\"/>\n\t\t<field name=\"MONTH_FIELD\"/>\n\t\t<field name=\"SECOND_FIELD\"/>\n\t\t<field name=\"SHORT\"/>\n\t\t<field name=\"TIMEZONE_FIELD\"/>\n\t\t<field name=\"WEEK_OF_MONTH_FIELD\"/>\n\t\t<field name=\"WEEK_OF_YEAR_FIELD\"/>\n\t\t<field name=\"YEAR_FIELD\"/>\n\t\t<field name=\"calendar\"/>\n\t\t<field name=\"numberFormat\"/>\n\t</class>\n\t<class name=\"java/text/DateFormat$Field\" since=\"1\">\n\t\t<extends name=\"java/text/Format$Field\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"getCalendarField()I\"/>\n\t\t<method name=\"ofCalendarField(I)Ljava/text/DateFormat$Field;\"/>\n\t\t<field name=\"AM_PM\"/>\n\t\t<field name=\"DAY_OF_MONTH\"/>\n\t\t<field name=\"DAY_OF_WEEK\"/>\n\t\t<field name=\"DAY_OF_WEEK_IN_MONTH\"/>\n\t\t<field name=\"DAY_OF_YEAR\"/>\n\t\t<field name=\"ERA\"/>\n\t\t<field name=\"HOUR0\"/>\n\t\t<field name=\"HOUR1\"/>\n\t\t<field name=\"HOUR_OF_DAY0\"/>\n\t\t<field name=\"HOUR_OF_DAY1\"/>\n\t\t<field name=\"MILLISECOND\"/>\n\t\t<field name=\"MINUTE\"/>\n\t\t<field name=\"MONTH\"/>\n\t\t<field name=\"SECOND\"/>\n\t\t<field name=\"TIME_ZONE\"/>\n\t\t<field name=\"WEEK_OF_MONTH\"/>\n\t\t<field name=\"WEEK_OF_YEAR\"/>\n\t\t<field name=\"YEAR\"/>\n\t</class>\n\t<class name=\"java/text/DateFormatSymbols\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"getAmPmStrings()[Ljava/lang/String;\"/>\n\t\t<method name=\"getAvailableLocales()[Ljava/util/Locale;\" since=\"9\"/>\n\t\t<method name=\"getEras()[Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance()Ljava/text/DateFormatSymbols;\" since=\"9\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Ljava/text/DateFormatSymbols;\" since=\"9\"/>\n\t\t<method name=\"getLocalPatternChars()Ljava/lang/String;\"/>\n\t\t<method name=\"getMonths()[Ljava/lang/String;\"/>\n\t\t<method name=\"getShortMonths()[Ljava/lang/String;\"/>\n\t\t<method name=\"getShortWeekdays()[Ljava/lang/String;\"/>\n\t\t<method name=\"getWeekdays()[Ljava/lang/String;\"/>\n\t\t<method name=\"getZoneStrings()[[Ljava/lang/String;\"/>\n\t\t<method name=\"setAmPmStrings([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setEras([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setLocalPatternChars(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setMonths([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setShortMonths([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setShortWeekdays([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setWeekdays([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setZoneStrings([[Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/text/DecimalFormat\" since=\"1\">\n\t\t<extends name=\"java/text/NumberFormat\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/text/DecimalFormatSymbols;)V\"/>\n\t\t<method name=\"applyLocalizedPattern(Ljava/lang/String;)V\"/>\n\t\t<method name=\"applyPattern(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getDecimalFormatSymbols()Ljava/text/DecimalFormatSymbols;\"/>\n\t\t<method name=\"getGroupingSize()I\"/>\n\t\t<method name=\"getMultiplier()I\"/>\n\t\t<method name=\"getNegativePrefix()Ljava/lang/String;\"/>\n\t\t<method name=\"getNegativeSuffix()Ljava/lang/String;\"/>\n\t\t<method name=\"getPositivePrefix()Ljava/lang/String;\"/>\n\t\t<method name=\"getPositiveSuffix()Ljava/lang/String;\"/>\n\t\t<method name=\"isDecimalSeparatorAlwaysShown()Z\"/>\n\t\t<method name=\"isParseBigDecimal()Z\"/>\n\t\t<method name=\"setDecimalFormatSymbols(Ljava/text/DecimalFormatSymbols;)V\"/>\n\t\t<method name=\"setDecimalSeparatorAlwaysShown(Z)V\"/>\n\t\t<method name=\"setGroupingSize(I)V\"/>\n\t\t<method name=\"setMultiplier(I)V\"/>\n\t\t<method name=\"setNegativePrefix(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setNegativeSuffix(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setParseBigDecimal(Z)V\"/>\n\t\t<method name=\"setPositivePrefix(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setPositiveSuffix(Ljava/lang/String;)V\"/>\n\t\t<method name=\"toLocalizedPattern()Ljava/lang/String;\"/>\n\t\t<method name=\"toPattern()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/text/DecimalFormatSymbols\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"getAvailableLocales()[Ljava/util/Locale;\" since=\"9\"/>\n\t\t<method name=\"getCurrency()Ljava/util/Currency;\"/>\n\t\t<method name=\"getCurrencySymbol()Ljava/lang/String;\"/>\n\t\t<method name=\"getDecimalSeparator()C\"/>\n\t\t<method name=\"getDigit()C\"/>\n\t\t<method name=\"getExponentSeparator()Ljava/lang/String;\" since=\"9\"/>\n\t\t<method name=\"getGroupingSeparator()C\"/>\n\t\t<method name=\"getInfinity()Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance()Ljava/text/DecimalFormatSymbols;\" since=\"9\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Ljava/text/DecimalFormatSymbols;\" since=\"9\"/>\n\t\t<method name=\"getInternationalCurrencySymbol()Ljava/lang/String;\"/>\n\t\t<method name=\"getMinusSign()C\"/>\n\t\t<method name=\"getMonetaryDecimalSeparator()C\"/>\n\t\t<method name=\"getNaN()Ljava/lang/String;\"/>\n\t\t<method name=\"getPatternSeparator()C\"/>\n\t\t<method name=\"getPerMill()C\"/>\n\t\t<method name=\"getPercent()C\"/>\n\t\t<method name=\"getZeroDigit()C\"/>\n\t\t<method name=\"setCurrency(Ljava/util/Currency;)V\"/>\n\t\t<method name=\"setCurrencySymbol(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setDecimalSeparator(C)V\"/>\n\t\t<method name=\"setDigit(C)V\"/>\n\t\t<method name=\"setExponentSeparator(Ljava/lang/String;)V\" since=\"9\"/>\n\t\t<method name=\"setGroupingSeparator(C)V\"/>\n\t\t<method name=\"setInfinity(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setInternationalCurrencySymbol(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setMinusSign(C)V\"/>\n\t\t<method name=\"setMonetaryDecimalSeparator(C)V\"/>\n\t\t<method name=\"setNaN(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setPatternSeparator(C)V\"/>\n\t\t<method name=\"setPerMill(C)V\"/>\n\t\t<method name=\"setPercent(C)V\"/>\n\t\t<method name=\"setZeroDigit(C)V\"/>\n\t</class>\n\t<class name=\"java/text/FieldPosition\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/text/Format$Field;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/text/Format$Field;I)V\"/>\n\t\t<method name=\"getBeginIndex()I\"/>\n\t\t<method name=\"getEndIndex()I\"/>\n\t\t<method name=\"getField()I\"/>\n\t\t<method name=\"getFieldAttribute()Ljava/text/Format$Field;\"/>\n\t\t<method name=\"setBeginIndex(I)V\"/>\n\t\t<method name=\"setEndIndex(I)V\"/>\n\t</class>\n\t<class name=\"java/text/Format\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"format(Ljava/lang/Object;)Ljava/lang/String;\"/>\n\t\t<method name=\"format(Ljava/lang/Object;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"formatToCharacterIterator(Ljava/lang/Object;)Ljava/text/AttributedCharacterIterator;\"/>\n\t\t<method name=\"parseObject(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"parseObject(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/text/Format$Field\" since=\"1\">\n\t\t<extends name=\"java/text/AttributedCharacterIterator$Attribute\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/text/MessageFormat\" since=\"1\">\n\t\t<extends name=\"java/text/Format\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"applyPattern(Ljava/lang/String;)V\"/>\n\t\t<method name=\"format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;\"/>\n\t\t<method name=\"format([Ljava/lang/Object;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"getFormats()[Ljava/text/Format;\"/>\n\t\t<method name=\"getFormatsByArgumentIndex()[Ljava/text/Format;\"/>\n\t\t<method name=\"getLocale()Ljava/util/Locale;\"/>\n\t\t<method name=\"parse(Ljava/lang/String;)[Ljava/lang/Object;\"/>\n\t\t<method name=\"parse(Ljava/lang/String;Ljava/text/ParsePosition;)[Ljava/lang/Object;\"/>\n\t\t<method name=\"setFormat(ILjava/text/Format;)V\"/>\n\t\t<method name=\"setFormatByArgumentIndex(ILjava/text/Format;)V\"/>\n\t\t<method name=\"setFormats([Ljava/text/Format;)V\"/>\n\t\t<method name=\"setFormatsByArgumentIndex([Ljava/text/Format;)V\"/>\n\t\t<method name=\"setLocale(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"toPattern()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/text/MessageFormat$Field\" since=\"1\">\n\t\t<extends name=\"java/text/Format$Field\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<field name=\"ARGUMENT\"/>\n\t</class>\n\t<class name=\"java/text/Normalizer\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"isNormalized(Ljava/lang/CharSequence;Ljava/text/Normalizer$Form;)Z\"/>\n\t\t<method name=\"normalize(Ljava/lang/CharSequence;Ljava/text/Normalizer$Form;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/text/Normalizer$Form\" since=\"9\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/text/Normalizer$Form;\"/>\n\t\t<method name=\"values()[Ljava/text/Normalizer$Form;\"/>\n\t\t<field name=\"NFC\"/>\n\t\t<field name=\"NFD\"/>\n\t\t<field name=\"NFKC\"/>\n\t\t<field name=\"NFKD\"/>\n\t</class>\n\t<class name=\"java/text/NumberFormat\" since=\"1\">\n\t\t<extends name=\"java/text/Format\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"format(D)Ljava/lang/String;\"/>\n\t\t<method name=\"format(DLjava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"format(J)Ljava/lang/String;\"/>\n\t\t<method name=\"format(JLjava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"getAvailableLocales()[Ljava/util/Locale;\"/>\n\t\t<method name=\"getCurrency()Ljava/util/Currency;\"/>\n\t\t<method name=\"getCurrencyInstance()Ljava/text/NumberFormat;\"/>\n\t\t<method name=\"getCurrencyInstance(Ljava/util/Locale;)Ljava/text/NumberFormat;\"/>\n\t\t<method name=\"getInstance()Ljava/text/NumberFormat;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Ljava/text/NumberFormat;\"/>\n\t\t<method name=\"getIntegerInstance()Ljava/text/NumberFormat;\"/>\n\t\t<method name=\"getIntegerInstance(Ljava/util/Locale;)Ljava/text/NumberFormat;\"/>\n\t\t<method name=\"getMaximumFractionDigits()I\"/>\n\t\t<method name=\"getMaximumIntegerDigits()I\"/>\n\t\t<method name=\"getMinimumFractionDigits()I\"/>\n\t\t<method name=\"getMinimumIntegerDigits()I\"/>\n\t\t<method name=\"getNumberInstance()Ljava/text/NumberFormat;\"/>\n\t\t<method name=\"getNumberInstance(Ljava/util/Locale;)Ljava/text/NumberFormat;\"/>\n\t\t<method name=\"getPercentInstance()Ljava/text/NumberFormat;\"/>\n\t\t<method name=\"getPercentInstance(Ljava/util/Locale;)Ljava/text/NumberFormat;\"/>\n\t\t<method name=\"getRoundingMode()Ljava/math/RoundingMode;\" since=\"9\"/>\n\t\t<method name=\"isGroupingUsed()Z\"/>\n\t\t<method name=\"isParseIntegerOnly()Z\"/>\n\t\t<method name=\"parse(Ljava/lang/String;)Ljava/lang/Number;\"/>\n\t\t<method name=\"parse(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/lang/Number;\"/>\n\t\t<method name=\"setCurrency(Ljava/util/Currency;)V\"/>\n\t\t<method name=\"setGroupingUsed(Z)V\"/>\n\t\t<method name=\"setMaximumFractionDigits(I)V\"/>\n\t\t<method name=\"setMaximumIntegerDigits(I)V\"/>\n\t\t<method name=\"setMinimumFractionDigits(I)V\"/>\n\t\t<method name=\"setMinimumIntegerDigits(I)V\"/>\n\t\t<method name=\"setParseIntegerOnly(Z)V\"/>\n\t\t<method name=\"setRoundingMode(Ljava/math/RoundingMode;)V\" since=\"9\"/>\n\t\t<field name=\"FRACTION_FIELD\"/>\n\t\t<field name=\"INTEGER_FIELD\"/>\n\t</class>\n\t<class name=\"java/text/NumberFormat$Field\" since=\"1\">\n\t\t<extends name=\"java/text/Format$Field\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<field name=\"CURRENCY\"/>\n\t\t<field name=\"DECIMAL_SEPARATOR\"/>\n\t\t<field name=\"EXPONENT\"/>\n\t\t<field name=\"EXPONENT_SIGN\"/>\n\t\t<field name=\"EXPONENT_SYMBOL\"/>\n\t\t<field name=\"FRACTION\"/>\n\t\t<field name=\"GROUPING_SEPARATOR\"/>\n\t\t<field name=\"INTEGER\"/>\n\t\t<field name=\"PERCENT\"/>\n\t\t<field name=\"PERMILLE\"/>\n\t\t<field name=\"SIGN\"/>\n\t</class>\n\t<class name=\"java/text/ParseException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"getErrorOffset()I\"/>\n\t</class>\n\t<class name=\"java/text/ParsePosition\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"getErrorIndex()I\"/>\n\t\t<method name=\"getIndex()I\"/>\n\t\t<method name=\"setErrorIndex(I)V\"/>\n\t\t<method name=\"setIndex(I)V\"/>\n\t</class>\n\t<class name=\"java/text/RuleBasedCollator\" since=\"1\">\n\t\t<extends name=\"java/text/Collator\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getCollationElementIterator(Ljava/lang/String;)Ljava/text/CollationElementIterator;\"/>\n\t\t<method name=\"getCollationElementIterator(Ljava/text/CharacterIterator;)Ljava/text/CollationElementIterator;\"/>\n\t\t<method name=\"getRules()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/text/SimpleDateFormat\" since=\"1\">\n\t\t<extends name=\"java/text/DateFormat\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/text/DateFormatSymbols;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"applyLocalizedPattern(Ljava/lang/String;)V\"/>\n\t\t<method name=\"applyPattern(Ljava/lang/String;)V\"/>\n\t\t<method name=\"get2DigitYearStart()Ljava/util/Date;\"/>\n\t\t<method name=\"getDateFormatSymbols()Ljava/text/DateFormatSymbols;\"/>\n\t\t<method name=\"set2DigitYearStart(Ljava/util/Date;)V\"/>\n\t\t<method name=\"setDateFormatSymbols(Ljava/text/DateFormatSymbols;)V\"/>\n\t\t<method name=\"toLocalizedPattern()Ljava/lang/String;\"/>\n\t\t<method name=\"toPattern()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/text/StringCharacterIterator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/text/CharacterIterator\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;III)V\"/>\n\t\t<method name=\"setText(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/time/Clock\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"fixed(Ljava/time/Instant;Ljava/time/ZoneId;)Ljava/time/Clock;\"/>\n\t\t<method name=\"getZone()Ljava/time/ZoneId;\"/>\n\t\t<method name=\"instant()Ljava/time/Instant;\"/>\n\t\t<method name=\"millis()J\"/>\n\t\t<method name=\"offset(Ljava/time/Clock;Ljava/time/Duration;)Ljava/time/Clock;\"/>\n\t\t<method name=\"system(Ljava/time/ZoneId;)Ljava/time/Clock;\"/>\n\t\t<method name=\"systemDefaultZone()Ljava/time/Clock;\"/>\n\t\t<method name=\"systemUTC()Ljava/time/Clock;\"/>\n\t\t<method name=\"tick(Ljava/time/Clock;Ljava/time/Duration;)Ljava/time/Clock;\"/>\n\t\t<method name=\"tickMinutes(Ljava/time/ZoneId;)Ljava/time/Clock;\"/>\n\t\t<method name=\"tickSeconds(Ljava/time/ZoneId;)Ljava/time/Clock;\"/>\n\t\t<method name=\"withZone(Ljava/time/ZoneId;)Ljava/time/Clock;\"/>\n\t</class>\n\t<class name=\"java/time/DateTimeException\" since=\"26\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/time/DayOfWeek\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAccessor\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAdjuster\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/DayOfWeek;\"/>\n\t\t<method name=\"getDisplayName(Ljava/time/format/TextStyle;Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getValue()I\"/>\n\t\t<method name=\"minus(J)Ljava/time/DayOfWeek;\"/>\n\t\t<method name=\"of(I)Ljava/time/DayOfWeek;\"/>\n\t\t<method name=\"plus(J)Ljava/time/DayOfWeek;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/time/DayOfWeek;\"/>\n\t\t<method name=\"values()[Ljava/time/DayOfWeek;\"/>\n\t\t<field name=\"FRIDAY\"/>\n\t\t<field name=\"MONDAY\"/>\n\t\t<field name=\"SATURDAY\"/>\n\t\t<field name=\"SUNDAY\"/>\n\t\t<field name=\"THURSDAY\"/>\n\t\t<field name=\"TUESDAY\"/>\n\t\t<field name=\"WEDNESDAY\"/>\n\t</class>\n\t<class name=\"java/time/Duration\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAmount\"/>\n\t\t<method name=\"abs()Ljava/time/Duration;\"/>\n\t\t<method name=\"between(Ljava/time/temporal/Temporal;Ljava/time/temporal/Temporal;)Ljava/time/Duration;\"/>\n\t\t<method name=\"compareTo(Ljava/time/Duration;)I\"/>\n\t\t<method name=\"dividedBy(J)Ljava/time/Duration;\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAmount;)Ljava/time/Duration;\"/>\n\t\t<method name=\"getNano()I\"/>\n\t\t<method name=\"getSeconds()J\"/>\n\t\t<method name=\"isNegative()Z\"/>\n\t\t<method name=\"isZero()Z\"/>\n\t\t<method name=\"minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/Duration;\"/>\n\t\t<method name=\"minus(Ljava/time/Duration;)Ljava/time/Duration;\"/>\n\t\t<method name=\"minusDays(J)Ljava/time/Duration;\"/>\n\t\t<method name=\"minusHours(J)Ljava/time/Duration;\"/>\n\t\t<method name=\"minusMillis(J)Ljava/time/Duration;\"/>\n\t\t<method name=\"minusMinutes(J)Ljava/time/Duration;\"/>\n\t\t<method name=\"minusNanos(J)Ljava/time/Duration;\"/>\n\t\t<method name=\"minusSeconds(J)Ljava/time/Duration;\"/>\n\t\t<method name=\"multipliedBy(J)Ljava/time/Duration;\"/>\n\t\t<method name=\"negated()Ljava/time/Duration;\"/>\n\t\t<method name=\"of(JLjava/time/temporal/TemporalUnit;)Ljava/time/Duration;\"/>\n\t\t<method name=\"ofDays(J)Ljava/time/Duration;\"/>\n\t\t<method name=\"ofHours(J)Ljava/time/Duration;\"/>\n\t\t<method name=\"ofMillis(J)Ljava/time/Duration;\"/>\n\t\t<method name=\"ofMinutes(J)Ljava/time/Duration;\"/>\n\t\t<method name=\"ofNanos(J)Ljava/time/Duration;\"/>\n\t\t<method name=\"ofSeconds(J)Ljava/time/Duration;\"/>\n\t\t<method name=\"ofSeconds(JJ)Ljava/time/Duration;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;)Ljava/time/Duration;\"/>\n\t\t<method name=\"plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/Duration;\"/>\n\t\t<method name=\"plus(Ljava/time/Duration;)Ljava/time/Duration;\"/>\n\t\t<method name=\"plusDays(J)Ljava/time/Duration;\"/>\n\t\t<method name=\"plusHours(J)Ljava/time/Duration;\"/>\n\t\t<method name=\"plusMillis(J)Ljava/time/Duration;\"/>\n\t\t<method name=\"plusMinutes(J)Ljava/time/Duration;\"/>\n\t\t<method name=\"plusNanos(J)Ljava/time/Duration;\"/>\n\t\t<method name=\"plusSeconds(J)Ljava/time/Duration;\"/>\n\t\t<method name=\"toDays()J\"/>\n\t\t<method name=\"toHours()J\"/>\n\t\t<method name=\"toMillis()J\"/>\n\t\t<method name=\"toMinutes()J\"/>\n\t\t<method name=\"toNanos()J\"/>\n\t\t<method name=\"withNanos(I)Ljava/time/Duration;\"/>\n\t\t<method name=\"withSeconds(J)Ljava/time/Duration;\"/>\n\t\t<field name=\"ZERO\"/>\n\t</class>\n\t<class name=\"java/time/Instant\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<implements name=\"java/time/temporal/Temporal\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAdjuster\"/>\n\t\t<method name=\"atOffset(Ljava/time/ZoneOffset;)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"atZone(Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"compareTo(Ljava/time/Instant;)I\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/Instant;\"/>\n\t\t<method name=\"getEpochSecond()J\"/>\n\t\t<method name=\"getNano()I\"/>\n\t\t<method name=\"isAfter(Ljava/time/Instant;)Z\"/>\n\t\t<method name=\"isBefore(Ljava/time/Instant;)Z\"/>\n\t\t<method name=\"minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/Instant;\"/>\n\t\t<method name=\"minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/Instant;\"/>\n\t\t<method name=\"minusMillis(J)Ljava/time/Instant;\"/>\n\t\t<method name=\"minusNanos(J)Ljava/time/Instant;\"/>\n\t\t<method name=\"minusSeconds(J)Ljava/time/Instant;\"/>\n\t\t<method name=\"now()Ljava/time/Instant;\"/>\n\t\t<method name=\"now(Ljava/time/Clock;)Ljava/time/Instant;\"/>\n\t\t<method name=\"ofEpochMilli(J)Ljava/time/Instant;\"/>\n\t\t<method name=\"ofEpochSecond(J)Ljava/time/Instant;\"/>\n\t\t<method name=\"ofEpochSecond(JJ)Ljava/time/Instant;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;)Ljava/time/Instant;\"/>\n\t\t<method name=\"plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/Instant;\"/>\n\t\t<method name=\"plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/Instant;\"/>\n\t\t<method name=\"plusMillis(J)Ljava/time/Instant;\"/>\n\t\t<method name=\"plusNanos(J)Ljava/time/Instant;\"/>\n\t\t<method name=\"plusSeconds(J)Ljava/time/Instant;\"/>\n\t\t<method name=\"toEpochMilli()J\"/>\n\t\t<method name=\"truncatedTo(Ljava/time/temporal/TemporalUnit;)Ljava/time/Instant;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/Instant;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalField;J)Ljava/time/Instant;\"/>\n\t\t<field name=\"EPOCH\"/>\n\t\t<field name=\"MAX\"/>\n\t\t<field name=\"MIN\"/>\n\t</class>\n\t<class name=\"java/time/LocalDate\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/time/chrono/ChronoLocalDate\"/>\n\t\t<implements name=\"java/time/temporal/Temporal\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAdjuster\"/>\n\t\t<method name=\"atStartOfDay()Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"atStartOfDay(Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"atTime(II)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"atTime(III)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"atTime(IIII)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"atTime(Ljava/time/LocalTime;)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"atTime(Ljava/time/OffsetTime;)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"getChronology()Ljava/time/chrono/IsoChronology;\"/>\n\t\t<method name=\"getDayOfMonth()I\"/>\n\t\t<method name=\"getDayOfWeek()Ljava/time/DayOfWeek;\"/>\n\t\t<method name=\"getDayOfYear()I\"/>\n\t\t<method name=\"getMonth()Ljava/time/Month;\"/>\n\t\t<method name=\"getMonthValue()I\"/>\n\t\t<method name=\"getYear()I\"/>\n\t\t<method name=\"minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"minusDays(J)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"minusMonths(J)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"minusWeeks(J)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"minusYears(J)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"now()Ljava/time/LocalDate;\"/>\n\t\t<method name=\"now(Ljava/time/Clock;)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"now(Ljava/time/ZoneId;)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"of(III)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"of(ILjava/time/Month;I)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"ofEpochDay(J)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"ofYearDay(II)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;Ljava/time/format/DateTimeFormatter;)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"plusDays(J)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"plusMonths(J)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"plusWeeks(J)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"plusYears(J)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"until(Ljava/time/chrono/ChronoLocalDate;)Ljava/time/Period;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalField;J)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"withDayOfMonth(I)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"withDayOfYear(I)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"withMonth(I)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"withYear(I)Ljava/time/LocalDate;\"/>\n\t\t<field name=\"MAX\"/>\n\t\t<field name=\"MIN\"/>\n\t</class>\n\t<class name=\"java/time/LocalDateTime\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/time/chrono/ChronoLocalDateTime\"/>\n\t\t<implements name=\"java/time/temporal/Temporal\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAdjuster\"/>\n\t\t<method name=\"atOffset(Ljava/time/ZoneOffset;)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"atZone(Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"getDayOfMonth()I\"/>\n\t\t<method name=\"getDayOfWeek()Ljava/time/DayOfWeek;\"/>\n\t\t<method name=\"getDayOfYear()I\"/>\n\t\t<method name=\"getHour()I\"/>\n\t\t<method name=\"getMinute()I\"/>\n\t\t<method name=\"getMonth()Ljava/time/Month;\"/>\n\t\t<method name=\"getMonthValue()I\"/>\n\t\t<method name=\"getNano()I\"/>\n\t\t<method name=\"getSecond()I\"/>\n\t\t<method name=\"getYear()I\"/>\n\t\t<method name=\"minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"minusDays(J)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"minusHours(J)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"minusMinutes(J)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"minusMonths(J)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"minusNanos(J)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"minusSeconds(J)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"minusWeeks(J)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"minusYears(J)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"now()Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"now(Ljava/time/Clock;)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"now(Ljava/time/ZoneId;)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"of(IIIII)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"of(IIIIII)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"of(IIIIIII)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"of(ILjava/time/Month;III)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"of(ILjava/time/Month;IIII)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"of(ILjava/time/Month;IIIII)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"of(Ljava/time/LocalDate;Ljava/time/LocalTime;)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"ofEpochSecond(JILjava/time/ZoneOffset;)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"ofInstant(Ljava/time/Instant;Ljava/time/ZoneId;)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;Ljava/time/format/DateTimeFormatter;)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"plusDays(J)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"plusHours(J)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"plusMinutes(J)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"plusMonths(J)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"plusNanos(J)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"plusSeconds(J)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"plusWeeks(J)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"plusYears(J)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"toLocalDate()Ljava/time/LocalDate;\"/>\n\t\t<method name=\"truncatedTo(Ljava/time/temporal/TemporalUnit;)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalField;J)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"withDayOfMonth(I)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"withDayOfYear(I)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"withHour(I)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"withMinute(I)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"withMonth(I)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"withNano(I)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"withSecond(I)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"withYear(I)Ljava/time/LocalDateTime;\"/>\n\t\t<field name=\"MAX\"/>\n\t\t<field name=\"MIN\"/>\n\t</class>\n\t<class name=\"java/time/LocalTime\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<implements name=\"java/time/temporal/Temporal\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAdjuster\"/>\n\t\t<method name=\"atDate(Ljava/time/LocalDate;)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"atOffset(Ljava/time/ZoneOffset;)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"compareTo(Ljava/time/LocalTime;)I\"/>\n\t\t<method name=\"format(Ljava/time/format/DateTimeFormatter;)Ljava/lang/String;\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"getHour()I\"/>\n\t\t<method name=\"getMinute()I\"/>\n\t\t<method name=\"getNano()I\"/>\n\t\t<method name=\"getSecond()I\"/>\n\t\t<method name=\"isAfter(Ljava/time/LocalTime;)Z\"/>\n\t\t<method name=\"isBefore(Ljava/time/LocalTime;)Z\"/>\n\t\t<method name=\"minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"minusHours(J)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"minusMinutes(J)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"minusNanos(J)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"minusSeconds(J)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"now()Ljava/time/LocalTime;\"/>\n\t\t<method name=\"now(Ljava/time/Clock;)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"now(Ljava/time/ZoneId;)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"of(II)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"of(III)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"of(IIII)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"ofNanoOfDay(J)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"ofSecondOfDay(J)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;Ljava/time/format/DateTimeFormatter;)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"plusHours(J)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"plusMinutes(J)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"plusNanos(J)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"plusSeconds(J)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"toNanoOfDay()J\"/>\n\t\t<method name=\"toSecondOfDay()I\"/>\n\t\t<method name=\"truncatedTo(Ljava/time/temporal/TemporalUnit;)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalField;J)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"withHour(I)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"withMinute(I)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"withNano(I)Ljava/time/LocalTime;\"/>\n\t\t<method name=\"withSecond(I)Ljava/time/LocalTime;\"/>\n\t\t<field name=\"MAX\"/>\n\t\t<field name=\"MIDNIGHT\"/>\n\t\t<field name=\"MIN\"/>\n\t\t<field name=\"NOON\"/>\n\t</class>\n\t<class name=\"java/time/Month\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAccessor\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAdjuster\"/>\n\t\t<method name=\"firstDayOfYear(Z)I\"/>\n\t\t<method name=\"firstMonthOfQuarter()Ljava/time/Month;\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/Month;\"/>\n\t\t<method name=\"getDisplayName(Ljava/time/format/TextStyle;Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getValue()I\"/>\n\t\t<method name=\"length(Z)I\"/>\n\t\t<method name=\"maxLength()I\"/>\n\t\t<method name=\"minLength()I\"/>\n\t\t<method name=\"minus(J)Ljava/time/Month;\"/>\n\t\t<method name=\"of(I)Ljava/time/Month;\"/>\n\t\t<method name=\"plus(J)Ljava/time/Month;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/time/Month;\"/>\n\t\t<method name=\"values()[Ljava/time/Month;\"/>\n\t\t<field name=\"APRIL\"/>\n\t\t<field name=\"AUGUST\"/>\n\t\t<field name=\"DECEMBER\"/>\n\t\t<field name=\"FEBRUARY\"/>\n\t\t<field name=\"JANUARY\"/>\n\t\t<field name=\"JULY\"/>\n\t\t<field name=\"JUNE\"/>\n\t\t<field name=\"MARCH\"/>\n\t\t<field name=\"MAY\"/>\n\t\t<field name=\"NOVEMBER\"/>\n\t\t<field name=\"OCTOBER\"/>\n\t\t<field name=\"SEPTEMBER\"/>\n\t</class>\n\t<class name=\"java/time/MonthDay\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAccessor\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAdjuster\"/>\n\t\t<method name=\"atYear(I)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"compareTo(Ljava/time/MonthDay;)I\"/>\n\t\t<method name=\"format(Ljava/time/format/DateTimeFormatter;)Ljava/lang/String;\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/MonthDay;\"/>\n\t\t<method name=\"getDayOfMonth()I\"/>\n\t\t<method name=\"getMonth()Ljava/time/Month;\"/>\n\t\t<method name=\"getMonthValue()I\"/>\n\t\t<method name=\"isAfter(Ljava/time/MonthDay;)Z\"/>\n\t\t<method name=\"isBefore(Ljava/time/MonthDay;)Z\"/>\n\t\t<method name=\"isValidYear(I)Z\"/>\n\t\t<method name=\"now()Ljava/time/MonthDay;\"/>\n\t\t<method name=\"now(Ljava/time/Clock;)Ljava/time/MonthDay;\"/>\n\t\t<method name=\"now(Ljava/time/ZoneId;)Ljava/time/MonthDay;\"/>\n\t\t<method name=\"of(II)Ljava/time/MonthDay;\"/>\n\t\t<method name=\"of(Ljava/time/Month;I)Ljava/time/MonthDay;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;)Ljava/time/MonthDay;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;Ljava/time/format/DateTimeFormatter;)Ljava/time/MonthDay;\"/>\n\t\t<method name=\"with(Ljava/time/Month;)Ljava/time/MonthDay;\"/>\n\t\t<method name=\"withDayOfMonth(I)Ljava/time/MonthDay;\"/>\n\t\t<method name=\"withMonth(I)Ljava/time/MonthDay;\"/>\n\t</class>\n\t<class name=\"java/time/OffsetDateTime\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<implements name=\"java/time/temporal/Temporal\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAdjuster\"/>\n\t\t<method name=\"atZoneSameInstant(Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"atZoneSimilarLocal(Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"compareTo(Ljava/time/OffsetDateTime;)I\"/>\n\t\t<method name=\"format(Ljava/time/format/DateTimeFormatter;)Ljava/lang/String;\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"getDayOfMonth()I\"/>\n\t\t<method name=\"getDayOfWeek()Ljava/time/DayOfWeek;\"/>\n\t\t<method name=\"getDayOfYear()I\"/>\n\t\t<method name=\"getHour()I\"/>\n\t\t<method name=\"getMinute()I\"/>\n\t\t<method name=\"getMonth()Ljava/time/Month;\"/>\n\t\t<method name=\"getMonthValue()I\"/>\n\t\t<method name=\"getNano()I\"/>\n\t\t<method name=\"getOffset()Ljava/time/ZoneOffset;\"/>\n\t\t<method name=\"getSecond()I\"/>\n\t\t<method name=\"getYear()I\"/>\n\t\t<method name=\"isAfter(Ljava/time/OffsetDateTime;)Z\"/>\n\t\t<method name=\"isBefore(Ljava/time/OffsetDateTime;)Z\"/>\n\t\t<method name=\"isEqual(Ljava/time/OffsetDateTime;)Z\"/>\n\t\t<method name=\"minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"minusDays(J)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"minusHours(J)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"minusMinutes(J)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"minusMonths(J)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"minusNanos(J)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"minusSeconds(J)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"minusWeeks(J)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"minusYears(J)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"now()Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"now(Ljava/time/Clock;)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"now(Ljava/time/ZoneId;)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"of(IIIIIIILjava/time/ZoneOffset;)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"of(Ljava/time/LocalDate;Ljava/time/LocalTime;Ljava/time/ZoneOffset;)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"of(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"ofInstant(Ljava/time/Instant;Ljava/time/ZoneId;)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;Ljava/time/format/DateTimeFormatter;)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"plusDays(J)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"plusHours(J)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"plusMinutes(J)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"plusMonths(J)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"plusNanos(J)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"plusSeconds(J)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"plusWeeks(J)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"plusYears(J)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"timeLineOrder()Ljava/util/Comparator;\"/>\n\t\t<method name=\"toEpochSecond()J\"/>\n\t\t<method name=\"toInstant()Ljava/time/Instant;\"/>\n\t\t<method name=\"toLocalDate()Ljava/time/LocalDate;\"/>\n\t\t<method name=\"toLocalDateTime()Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"toLocalTime()Ljava/time/LocalTime;\"/>\n\t\t<method name=\"toOffsetTime()Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"toZonedDateTime()Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"truncatedTo(Ljava/time/temporal/TemporalUnit;)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalField;J)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"withDayOfMonth(I)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"withDayOfYear(I)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"withHour(I)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"withMinute(I)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"withMonth(I)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"withNano(I)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"withOffsetSameInstant(Ljava/time/ZoneOffset;)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"withOffsetSameLocal(Ljava/time/ZoneOffset;)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"withSecond(I)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"withYear(I)Ljava/time/OffsetDateTime;\"/>\n\t\t<field name=\"MAX\"/>\n\t\t<field name=\"MIN\"/>\n\t</class>\n\t<class name=\"java/time/OffsetTime\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<implements name=\"java/time/temporal/Temporal\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAdjuster\"/>\n\t\t<method name=\"atDate(Ljava/time/LocalDate;)Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"compareTo(Ljava/time/OffsetTime;)I\"/>\n\t\t<method name=\"format(Ljava/time/format/DateTimeFormatter;)Ljava/lang/String;\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"getHour()I\"/>\n\t\t<method name=\"getMinute()I\"/>\n\t\t<method name=\"getNano()I\"/>\n\t\t<method name=\"getOffset()Ljava/time/ZoneOffset;\"/>\n\t\t<method name=\"getSecond()I\"/>\n\t\t<method name=\"isAfter(Ljava/time/OffsetTime;)Z\"/>\n\t\t<method name=\"isBefore(Ljava/time/OffsetTime;)Z\"/>\n\t\t<method name=\"isEqual(Ljava/time/OffsetTime;)Z\"/>\n\t\t<method name=\"minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"minusHours(J)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"minusMinutes(J)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"minusNanos(J)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"minusSeconds(J)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"now()Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"now(Ljava/time/Clock;)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"now(Ljava/time/ZoneId;)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"of(IIIILjava/time/ZoneOffset;)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"of(Ljava/time/LocalTime;Ljava/time/ZoneOffset;)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"ofInstant(Ljava/time/Instant;Ljava/time/ZoneId;)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;Ljava/time/format/DateTimeFormatter;)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"plusHours(J)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"plusMinutes(J)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"plusNanos(J)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"plusSeconds(J)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"toLocalTime()Ljava/time/LocalTime;\"/>\n\t\t<method name=\"truncatedTo(Ljava/time/temporal/TemporalUnit;)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalField;J)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"withHour(I)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"withMinute(I)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"withNano(I)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"withOffsetSameInstant(Ljava/time/ZoneOffset;)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"withOffsetSameLocal(Ljava/time/ZoneOffset;)Ljava/time/OffsetTime;\"/>\n\t\t<method name=\"withSecond(I)Ljava/time/OffsetTime;\"/>\n\t\t<field name=\"MAX\"/>\n\t\t<field name=\"MIN\"/>\n\t</class>\n\t<class name=\"java/time/Period\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/time/chrono/ChronoPeriod\"/>\n\t\t<method name=\"between(Ljava/time/LocalDate;Ljava/time/LocalDate;)Ljava/time/Period;\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAmount;)Ljava/time/Period;\"/>\n\t\t<method name=\"getChronology()Ljava/time/chrono/IsoChronology;\"/>\n\t\t<method name=\"getDays()I\"/>\n\t\t<method name=\"getMonths()I\"/>\n\t\t<method name=\"getYears()I\"/>\n\t\t<method name=\"minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/Period;\"/>\n\t\t<method name=\"minusDays(J)Ljava/time/Period;\"/>\n\t\t<method name=\"minusMonths(J)Ljava/time/Period;\"/>\n\t\t<method name=\"minusYears(J)Ljava/time/Period;\"/>\n\t\t<method name=\"multipliedBy(I)Ljava/time/Period;\"/>\n\t\t<method name=\"negated()Ljava/time/Period;\"/>\n\t\t<method name=\"normalized()Ljava/time/Period;\"/>\n\t\t<method name=\"of(III)Ljava/time/Period;\"/>\n\t\t<method name=\"ofDays(I)Ljava/time/Period;\"/>\n\t\t<method name=\"ofMonths(I)Ljava/time/Period;\"/>\n\t\t<method name=\"ofWeeks(I)Ljava/time/Period;\"/>\n\t\t<method name=\"ofYears(I)Ljava/time/Period;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;)Ljava/time/Period;\"/>\n\t\t<method name=\"plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/Period;\"/>\n\t\t<method name=\"plusDays(J)Ljava/time/Period;\"/>\n\t\t<method name=\"plusMonths(J)Ljava/time/Period;\"/>\n\t\t<method name=\"plusYears(J)Ljava/time/Period;\"/>\n\t\t<method name=\"toTotalMonths()J\"/>\n\t\t<method name=\"withDays(I)Ljava/time/Period;\"/>\n\t\t<method name=\"withMonths(I)Ljava/time/Period;\"/>\n\t\t<method name=\"withYears(I)Ljava/time/Period;\"/>\n\t\t<field name=\"ZERO\"/>\n\t</class>\n\t<class name=\"java/time/Year\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<implements name=\"java/time/temporal/Temporal\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAdjuster\"/>\n\t\t<method name=\"atDay(I)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"atMonth(I)Ljava/time/YearMonth;\"/>\n\t\t<method name=\"atMonth(Ljava/time/Month;)Ljava/time/YearMonth;\"/>\n\t\t<method name=\"atMonthDay(Ljava/time/MonthDay;)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"compareTo(Ljava/time/Year;)I\"/>\n\t\t<method name=\"format(Ljava/time/format/DateTimeFormatter;)Ljava/lang/String;\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/Year;\"/>\n\t\t<method name=\"getValue()I\"/>\n\t\t<method name=\"isAfter(Ljava/time/Year;)Z\"/>\n\t\t<method name=\"isBefore(Ljava/time/Year;)Z\"/>\n\t\t<method name=\"isLeap()Z\"/>\n\t\t<method name=\"isLeap(J)Z\"/>\n\t\t<method name=\"isValidMonthDay(Ljava/time/MonthDay;)Z\"/>\n\t\t<method name=\"length()I\"/>\n\t\t<method name=\"minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/Year;\"/>\n\t\t<method name=\"minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/Year;\"/>\n\t\t<method name=\"minusYears(J)Ljava/time/Year;\"/>\n\t\t<method name=\"now()Ljava/time/Year;\"/>\n\t\t<method name=\"now(Ljava/time/Clock;)Ljava/time/Year;\"/>\n\t\t<method name=\"now(Ljava/time/ZoneId;)Ljava/time/Year;\"/>\n\t\t<method name=\"of(I)Ljava/time/Year;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;)Ljava/time/Year;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;Ljava/time/format/DateTimeFormatter;)Ljava/time/Year;\"/>\n\t\t<method name=\"plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/Year;\"/>\n\t\t<method name=\"plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/Year;\"/>\n\t\t<method name=\"plusYears(J)Ljava/time/Year;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/Year;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalField;J)Ljava/time/Year;\"/>\n\t\t<field name=\"MAX_VALUE\"/>\n\t\t<field name=\"MIN_VALUE\"/>\n\t</class>\n\t<class name=\"java/time/YearMonth\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<implements name=\"java/time/temporal/Temporal\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAdjuster\"/>\n\t\t<method name=\"atDay(I)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"atEndOfMonth()Ljava/time/LocalDate;\"/>\n\t\t<method name=\"compareTo(Ljava/time/YearMonth;)I\"/>\n\t\t<method name=\"format(Ljava/time/format/DateTimeFormatter;)Ljava/lang/String;\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/YearMonth;\"/>\n\t\t<method name=\"getMonth()Ljava/time/Month;\"/>\n\t\t<method name=\"getMonthValue()I\"/>\n\t\t<method name=\"getYear()I\"/>\n\t\t<method name=\"isAfter(Ljava/time/YearMonth;)Z\"/>\n\t\t<method name=\"isBefore(Ljava/time/YearMonth;)Z\"/>\n\t\t<method name=\"isLeapYear()Z\"/>\n\t\t<method name=\"isValidDay(I)Z\"/>\n\t\t<method name=\"lengthOfMonth()I\"/>\n\t\t<method name=\"lengthOfYear()I\"/>\n\t\t<method name=\"minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/YearMonth;\"/>\n\t\t<method name=\"minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/YearMonth;\"/>\n\t\t<method name=\"minusMonths(J)Ljava/time/YearMonth;\"/>\n\t\t<method name=\"minusYears(J)Ljava/time/YearMonth;\"/>\n\t\t<method name=\"now()Ljava/time/YearMonth;\"/>\n\t\t<method name=\"now(Ljava/time/Clock;)Ljava/time/YearMonth;\"/>\n\t\t<method name=\"now(Ljava/time/ZoneId;)Ljava/time/YearMonth;\"/>\n\t\t<method name=\"of(II)Ljava/time/YearMonth;\"/>\n\t\t<method name=\"of(ILjava/time/Month;)Ljava/time/YearMonth;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;)Ljava/time/YearMonth;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;Ljava/time/format/DateTimeFormatter;)Ljava/time/YearMonth;\"/>\n\t\t<method name=\"plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/YearMonth;\"/>\n\t\t<method name=\"plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/YearMonth;\"/>\n\t\t<method name=\"plusMonths(J)Ljava/time/YearMonth;\"/>\n\t\t<method name=\"plusYears(J)Ljava/time/YearMonth;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/YearMonth;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalField;J)Ljava/time/YearMonth;\"/>\n\t\t<method name=\"withMonth(I)Ljava/time/YearMonth;\"/>\n\t\t<method name=\"withYear(I)Ljava/time/YearMonth;\"/>\n\t</class>\n\t<class name=\"java/time/ZoneId\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/ZoneId;\"/>\n\t\t<method name=\"getAvailableZoneIds()Ljava/util/Set;\"/>\n\t\t<method name=\"getDisplayName(Ljava/time/format/TextStyle;Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\"/>\n\t\t<method name=\"getRules()Ljava/time/zone/ZoneRules;\"/>\n\t\t<method name=\"normalized()Ljava/time/ZoneId;\"/>\n\t\t<method name=\"of(Ljava/lang/String;)Ljava/time/ZoneId;\"/>\n\t\t<method name=\"of(Ljava/lang/String;Ljava/util/Map;)Ljava/time/ZoneId;\"/>\n\t\t<method name=\"ofOffset(Ljava/lang/String;Ljava/time/ZoneOffset;)Ljava/time/ZoneId;\"/>\n\t\t<method name=\"systemDefault()Ljava/time/ZoneId;\"/>\n\t\t<field name=\"SHORT_IDS\"/>\n\t</class>\n\t<class name=\"java/time/ZoneOffset\" since=\"26\">\n\t\t<extends name=\"java/time/ZoneId\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAccessor\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAdjuster\"/>\n\t\t<method name=\"compareTo(Ljava/time/ZoneOffset;)I\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/ZoneOffset;\"/>\n\t\t<method name=\"getTotalSeconds()I\"/>\n\t\t<method name=\"of(Ljava/lang/String;)Ljava/time/ZoneOffset;\"/>\n\t\t<method name=\"ofHours(I)Ljava/time/ZoneOffset;\"/>\n\t\t<method name=\"ofHoursMinutes(II)Ljava/time/ZoneOffset;\"/>\n\t\t<method name=\"ofHoursMinutesSeconds(III)Ljava/time/ZoneOffset;\"/>\n\t\t<method name=\"ofTotalSeconds(I)Ljava/time/ZoneOffset;\"/>\n\t\t<field name=\"MAX\"/>\n\t\t<field name=\"MIN\"/>\n\t\t<field name=\"UTC\"/>\n\t</class>\n\t<class name=\"java/time/ZonedDateTime\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/time/chrono/ChronoZonedDateTime\"/>\n\t\t<implements name=\"java/time/temporal/Temporal\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"getDayOfMonth()I\"/>\n\t\t<method name=\"getDayOfWeek()Ljava/time/DayOfWeek;\"/>\n\t\t<method name=\"getDayOfYear()I\"/>\n\t\t<method name=\"getHour()I\"/>\n\t\t<method name=\"getMinute()I\"/>\n\t\t<method name=\"getMonth()Ljava/time/Month;\"/>\n\t\t<method name=\"getMonthValue()I\"/>\n\t\t<method name=\"getNano()I\"/>\n\t\t<method name=\"getSecond()I\"/>\n\t\t<method name=\"getYear()I\"/>\n\t\t<method name=\"minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"minusDays(J)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"minusHours(J)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"minusMinutes(J)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"minusMonths(J)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"minusNanos(J)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"minusSeconds(J)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"minusWeeks(J)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"minusYears(J)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"now()Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"now(Ljava/time/Clock;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"now(Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"of(IIIIIIILjava/time/ZoneId;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"of(Ljava/time/LocalDate;Ljava/time/LocalTime;Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"of(Ljava/time/LocalDateTime;Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"ofInstant(Ljava/time/Instant;Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"ofInstant(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"ofLocal(Ljava/time/LocalDateTime;Ljava/time/ZoneId;Ljava/time/ZoneOffset;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"ofStrict(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;Ljava/time/format/DateTimeFormatter;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"plusDays(J)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"plusHours(J)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"plusMinutes(J)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"plusMonths(J)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"plusNanos(J)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"plusSeconds(J)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"plusWeeks(J)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"plusYears(J)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"toLocalDate()Ljava/time/LocalDate;\"/>\n\t\t<method name=\"toLocalDateTime()Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"toOffsetDateTime()Ljava/time/OffsetDateTime;\"/>\n\t\t<method name=\"truncatedTo(Ljava/time/temporal/TemporalUnit;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalField;J)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"withDayOfMonth(I)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"withDayOfYear(I)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"withEarlierOffsetAtOverlap()Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"withFixedOffsetZone()Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"withHour(I)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"withLaterOffsetAtOverlap()Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"withMinute(I)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"withMonth(I)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"withNano(I)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"withSecond(I)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"withYear(I)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"withZoneSameInstant(Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"withZoneSameLocal(Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;\"/>\n\t</class>\n\t<class name=\"java/time/chrono/AbstractChronology\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/time/chrono/Chronology\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/time/chrono/ChronoLocalDate\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<implements name=\"java/time/temporal/Temporal\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAdjuster\"/>\n\t\t<method name=\"atTime(Ljava/time/LocalTime;)Ljava/time/chrono/ChronoLocalDateTime;\"/>\n\t\t<method name=\"compareTo(Ljava/time/chrono/ChronoLocalDate;)I\"/>\n\t\t<method name=\"format(Ljava/time/format/DateTimeFormatter;)Ljava/lang/String;\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/ChronoLocalDate;\"/>\n\t\t<method name=\"getChronology()Ljava/time/chrono/Chronology;\"/>\n\t\t<method name=\"getEra()Ljava/time/chrono/Era;\"/>\n\t\t<method name=\"isAfter(Ljava/time/chrono/ChronoLocalDate;)Z\"/>\n\t\t<method name=\"isBefore(Ljava/time/chrono/ChronoLocalDate;)Z\"/>\n\t\t<method name=\"isEqual(Ljava/time/chrono/ChronoLocalDate;)Z\"/>\n\t\t<method name=\"isLeapYear()Z\"/>\n\t\t<method name=\"lengthOfMonth()I\"/>\n\t\t<method name=\"lengthOfYear()I\"/>\n\t\t<method name=\"minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/ChronoLocalDate;\"/>\n\t\t<method name=\"minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/ChronoLocalDate;\"/>\n\t\t<method name=\"plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/ChronoLocalDate;\"/>\n\t\t<method name=\"plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/ChronoLocalDate;\"/>\n\t\t<method name=\"timeLineOrder()Ljava/util/Comparator;\"/>\n\t\t<method name=\"toEpochDay()J\"/>\n\t\t<method name=\"until(Ljava/time/chrono/ChronoLocalDate;)Ljava/time/chrono/ChronoPeriod;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/chrono/ChronoLocalDate;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalField;J)Ljava/time/chrono/ChronoLocalDate;\"/>\n\t</class>\n\t<class name=\"java/time/chrono/ChronoLocalDateTime\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<implements name=\"java/time/temporal/Temporal\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAdjuster\"/>\n\t\t<method name=\"atZone(Ljava/time/ZoneId;)Ljava/time/chrono/ChronoZonedDateTime;\"/>\n\t\t<method name=\"compareTo(Ljava/time/chrono/ChronoLocalDateTime;)I\"/>\n\t\t<method name=\"format(Ljava/time/format/DateTimeFormatter;)Ljava/lang/String;\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/ChronoLocalDateTime;\"/>\n\t\t<method name=\"getChronology()Ljava/time/chrono/Chronology;\"/>\n\t\t<method name=\"isAfter(Ljava/time/chrono/ChronoLocalDateTime;)Z\"/>\n\t\t<method name=\"isBefore(Ljava/time/chrono/ChronoLocalDateTime;)Z\"/>\n\t\t<method name=\"isEqual(Ljava/time/chrono/ChronoLocalDateTime;)Z\"/>\n\t\t<method name=\"minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/ChronoLocalDateTime;\"/>\n\t\t<method name=\"minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/ChronoLocalDateTime;\"/>\n\t\t<method name=\"plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/ChronoLocalDateTime;\"/>\n\t\t<method name=\"plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/ChronoLocalDateTime;\"/>\n\t\t<method name=\"timeLineOrder()Ljava/util/Comparator;\"/>\n\t\t<method name=\"toEpochSecond(Ljava/time/ZoneOffset;)J\"/>\n\t\t<method name=\"toInstant(Ljava/time/ZoneOffset;)Ljava/time/Instant;\"/>\n\t\t<method name=\"toLocalDate()Ljava/time/chrono/ChronoLocalDate;\"/>\n\t\t<method name=\"toLocalTime()Ljava/time/LocalTime;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/chrono/ChronoLocalDateTime;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalField;J)Ljava/time/chrono/ChronoLocalDateTime;\"/>\n\t</class>\n\t<class name=\"java/time/chrono/ChronoPeriod\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAmount\"/>\n\t\t<method name=\"between(Ljava/time/chrono/ChronoLocalDate;Ljava/time/chrono/ChronoLocalDate;)Ljava/time/chrono/ChronoPeriod;\"/>\n\t\t<method name=\"getChronology()Ljava/time/chrono/Chronology;\"/>\n\t\t<method name=\"isNegative()Z\"/>\n\t\t<method name=\"isZero()Z\"/>\n\t\t<method name=\"minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/ChronoPeriod;\"/>\n\t\t<method name=\"multipliedBy(I)Ljava/time/chrono/ChronoPeriod;\"/>\n\t\t<method name=\"negated()Ljava/time/chrono/ChronoPeriod;\"/>\n\t\t<method name=\"normalized()Ljava/time/chrono/ChronoPeriod;\"/>\n\t\t<method name=\"plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/ChronoPeriod;\"/>\n\t</class>\n\t<class name=\"java/time/chrono/ChronoZonedDateTime\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<implements name=\"java/time/temporal/Temporal\"/>\n\t\t<method name=\"compareTo(Ljava/time/chrono/ChronoZonedDateTime;)I\"/>\n\t\t<method name=\"format(Ljava/time/format/DateTimeFormatter;)Ljava/lang/String;\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/ChronoZonedDateTime;\"/>\n\t\t<method name=\"getChronology()Ljava/time/chrono/Chronology;\"/>\n\t\t<method name=\"getOffset()Ljava/time/ZoneOffset;\"/>\n\t\t<method name=\"getZone()Ljava/time/ZoneId;\"/>\n\t\t<method name=\"isAfter(Ljava/time/chrono/ChronoZonedDateTime;)Z\"/>\n\t\t<method name=\"isBefore(Ljava/time/chrono/ChronoZonedDateTime;)Z\"/>\n\t\t<method name=\"isEqual(Ljava/time/chrono/ChronoZonedDateTime;)Z\"/>\n\t\t<method name=\"minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/ChronoZonedDateTime;\"/>\n\t\t<method name=\"minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/ChronoZonedDateTime;\"/>\n\t\t<method name=\"plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/ChronoZonedDateTime;\"/>\n\t\t<method name=\"plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/ChronoZonedDateTime;\"/>\n\t\t<method name=\"timeLineOrder()Ljava/util/Comparator;\"/>\n\t\t<method name=\"toEpochSecond()J\"/>\n\t\t<method name=\"toInstant()Ljava/time/Instant;\"/>\n\t\t<method name=\"toLocalDate()Ljava/time/chrono/ChronoLocalDate;\"/>\n\t\t<method name=\"toLocalDateTime()Ljava/time/chrono/ChronoLocalDateTime;\"/>\n\t\t<method name=\"toLocalTime()Ljava/time/LocalTime;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/chrono/ChronoZonedDateTime;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalField;J)Ljava/time/chrono/ChronoZonedDateTime;\"/>\n\t\t<method name=\"withEarlierOffsetAtOverlap()Ljava/time/chrono/ChronoZonedDateTime;\"/>\n\t\t<method name=\"withLaterOffsetAtOverlap()Ljava/time/chrono/ChronoZonedDateTime;\"/>\n\t\t<method name=\"withZoneSameInstant(Ljava/time/ZoneId;)Ljava/time/chrono/ChronoZonedDateTime;\"/>\n\t\t<method name=\"withZoneSameLocal(Ljava/time/ZoneId;)Ljava/time/chrono/ChronoZonedDateTime;\"/>\n\t</class>\n\t<class name=\"java/time/chrono/Chronology\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"compareTo(Ljava/time/chrono/Chronology;)I\"/>\n\t\t<method name=\"date(III)Ljava/time/chrono/ChronoLocalDate;\"/>\n\t\t<method name=\"date(Ljava/time/chrono/Era;III)Ljava/time/chrono/ChronoLocalDate;\"/>\n\t\t<method name=\"date(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/ChronoLocalDate;\"/>\n\t\t<method name=\"dateEpochDay(J)Ljava/time/chrono/ChronoLocalDate;\"/>\n\t\t<method name=\"dateNow()Ljava/time/chrono/ChronoLocalDate;\"/>\n\t\t<method name=\"dateNow(Ljava/time/Clock;)Ljava/time/chrono/ChronoLocalDate;\"/>\n\t\t<method name=\"dateNow(Ljava/time/ZoneId;)Ljava/time/chrono/ChronoLocalDate;\"/>\n\t\t<method name=\"dateYearDay(II)Ljava/time/chrono/ChronoLocalDate;\"/>\n\t\t<method name=\"dateYearDay(Ljava/time/chrono/Era;II)Ljava/time/chrono/ChronoLocalDate;\"/>\n\t\t<method name=\"eraOf(I)Ljava/time/chrono/Era;\"/>\n\t\t<method name=\"eras()Ljava/util/List;\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/Chronology;\"/>\n\t\t<method name=\"getAvailableChronologies()Ljava/util/Set;\"/>\n\t\t<method name=\"getCalendarType()Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName(Ljava/time/format/TextStyle;Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getId()Ljava/lang/String;\"/>\n\t\t<method name=\"isLeapYear(J)Z\"/>\n\t\t<method name=\"localDateTime(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/ChronoLocalDateTime;\"/>\n\t\t<method name=\"of(Ljava/lang/String;)Ljava/time/chrono/Chronology;\"/>\n\t\t<method name=\"ofLocale(Ljava/util/Locale;)Ljava/time/chrono/Chronology;\"/>\n\t\t<method name=\"period(III)Ljava/time/chrono/ChronoPeriod;\"/>\n\t\t<method name=\"prolepticYear(Ljava/time/chrono/Era;I)I\"/>\n\t\t<method name=\"range(Ljava/time/temporal/ChronoField;)Ljava/time/temporal/ValueRange;\"/>\n\t\t<method name=\"resolveDate(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;\"/>\n\t\t<method name=\"zonedDateTime(Ljava/time/Instant;Ljava/time/ZoneId;)Ljava/time/chrono/ChronoZonedDateTime;\"/>\n\t\t<method name=\"zonedDateTime(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/ChronoZonedDateTime;\"/>\n\t</class>\n\t<class name=\"java/time/chrono/Era\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAccessor\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAdjuster\"/>\n\t\t<method name=\"getDisplayName(Ljava/time/format/TextStyle;Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getValue()I\"/>\n\t</class>\n\t<class name=\"java/time/chrono/HijrahChronology\" since=\"26\">\n\t\t<extends name=\"java/time/chrono/AbstractChronology\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"date(III)Ljava/time/chrono/HijrahDate;\"/>\n\t\t<method name=\"date(Ljava/time/chrono/Era;III)Ljava/time/chrono/HijrahDate;\"/>\n\t\t<method name=\"date(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/HijrahDate;\"/>\n\t\t<method name=\"dateEpochDay(J)Ljava/time/chrono/HijrahDate;\"/>\n\t\t<method name=\"dateNow()Ljava/time/chrono/HijrahDate;\"/>\n\t\t<method name=\"dateNow(Ljava/time/Clock;)Ljava/time/chrono/HijrahDate;\"/>\n\t\t<method name=\"dateNow(Ljava/time/ZoneId;)Ljava/time/chrono/HijrahDate;\"/>\n\t\t<method name=\"dateYearDay(II)Ljava/time/chrono/HijrahDate;\"/>\n\t\t<method name=\"dateYearDay(Ljava/time/chrono/Era;II)Ljava/time/chrono/HijrahDate;\"/>\n\t\t<method name=\"eraOf(I)Ljava/time/chrono/HijrahEra;\"/>\n\t\t<method name=\"resolveDate(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/HijrahDate;\"/>\n\t\t<field name=\"INSTANCE\"/>\n\t</class>\n\t<class name=\"java/time/chrono/HijrahDate\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/HijrahDate;\"/>\n\t\t<method name=\"getChronology()Ljava/time/chrono/HijrahChronology;\"/>\n\t\t<method name=\"getEra()Ljava/time/chrono/HijrahEra;\"/>\n\t\t<method name=\"minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/HijrahDate;\"/>\n\t\t<method name=\"minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/HijrahDate;\"/>\n\t\t<method name=\"now()Ljava/time/chrono/HijrahDate;\"/>\n\t\t<method name=\"now(Ljava/time/Clock;)Ljava/time/chrono/HijrahDate;\"/>\n\t\t<method name=\"now(Ljava/time/ZoneId;)Ljava/time/chrono/HijrahDate;\"/>\n\t\t<method name=\"of(III)Ljava/time/chrono/HijrahDate;\"/>\n\t\t<method name=\"plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/HijrahDate;\"/>\n\t\t<method name=\"plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/HijrahDate;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/chrono/HijrahDate;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalField;J)Ljava/time/chrono/HijrahDate;\"/>\n\t\t<method name=\"withVariant(Ljava/time/chrono/HijrahChronology;)Ljava/time/chrono/HijrahDate;\"/>\n\t</class>\n\t<class name=\"java/time/chrono/HijrahEra\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<implements name=\"java/time/chrono/Era\"/>\n\t\t<method name=\"of(I)Ljava/time/chrono/HijrahEra;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/time/chrono/HijrahEra;\"/>\n\t\t<method name=\"values()[Ljava/time/chrono/HijrahEra;\"/>\n\t\t<field name=\"AH\"/>\n\t</class>\n\t<class name=\"java/time/chrono/IsoChronology\" since=\"26\">\n\t\t<extends name=\"java/time/chrono/AbstractChronology\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"date(III)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"date(Ljava/time/chrono/Era;III)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"date(Ljava/time/temporal/TemporalAccessor;)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"dateEpochDay(J)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"dateNow()Ljava/time/LocalDate;\"/>\n\t\t<method name=\"dateNow(Ljava/time/Clock;)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"dateNow(Ljava/time/ZoneId;)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"dateYearDay(II)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"dateYearDay(Ljava/time/chrono/Era;II)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"eraOf(I)Ljava/time/chrono/IsoEra;\"/>\n\t\t<method name=\"localDateTime(Ljava/time/temporal/TemporalAccessor;)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"period(III)Ljava/time/Period;\"/>\n\t\t<method name=\"resolveDate(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/LocalDate;\"/>\n\t\t<method name=\"zonedDateTime(Ljava/time/Instant;Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;\"/>\n\t\t<method name=\"zonedDateTime(Ljava/time/temporal/TemporalAccessor;)Ljava/time/ZonedDateTime;\"/>\n\t\t<field name=\"INSTANCE\"/>\n\t</class>\n\t<class name=\"java/time/chrono/IsoEra\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<implements name=\"java/time/chrono/Era\"/>\n\t\t<method name=\"of(I)Ljava/time/chrono/IsoEra;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/time/chrono/IsoEra;\"/>\n\t\t<method name=\"values()[Ljava/time/chrono/IsoEra;\"/>\n\t\t<field name=\"BCE\"/>\n\t\t<field name=\"CE\"/>\n\t</class>\n\t<class name=\"java/time/chrono/JapaneseChronology\" since=\"26\">\n\t\t<extends name=\"java/time/chrono/AbstractChronology\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"date(III)Ljava/time/chrono/JapaneseDate;\"/>\n\t\t<method name=\"date(Ljava/time/chrono/Era;III)Ljava/time/chrono/JapaneseDate;\"/>\n\t\t<method name=\"date(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/JapaneseDate;\"/>\n\t\t<method name=\"dateEpochDay(J)Ljava/time/chrono/JapaneseDate;\"/>\n\t\t<method name=\"dateNow()Ljava/time/chrono/JapaneseDate;\"/>\n\t\t<method name=\"dateNow(Ljava/time/Clock;)Ljava/time/chrono/JapaneseDate;\"/>\n\t\t<method name=\"dateNow(Ljava/time/ZoneId;)Ljava/time/chrono/JapaneseDate;\"/>\n\t\t<method name=\"dateYearDay(II)Ljava/time/chrono/JapaneseDate;\"/>\n\t\t<method name=\"dateYearDay(Ljava/time/chrono/Era;II)Ljava/time/chrono/JapaneseDate;\"/>\n\t\t<method name=\"eraOf(I)Ljava/time/chrono/JapaneseEra;\"/>\n\t\t<method name=\"resolveDate(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/JapaneseDate;\"/>\n\t\t<field name=\"INSTANCE\"/>\n\t</class>\n\t<class name=\"java/time/chrono/JapaneseDate\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/JapaneseDate;\"/>\n\t\t<method name=\"getChronology()Ljava/time/chrono/JapaneseChronology;\"/>\n\t\t<method name=\"getEra()Ljava/time/chrono/JapaneseEra;\"/>\n\t\t<method name=\"minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/JapaneseDate;\"/>\n\t\t<method name=\"minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/JapaneseDate;\"/>\n\t\t<method name=\"now()Ljava/time/chrono/JapaneseDate;\"/>\n\t\t<method name=\"now(Ljava/time/Clock;)Ljava/time/chrono/JapaneseDate;\"/>\n\t\t<method name=\"now(Ljava/time/ZoneId;)Ljava/time/chrono/JapaneseDate;\"/>\n\t\t<method name=\"of(III)Ljava/time/chrono/JapaneseDate;\"/>\n\t\t<method name=\"of(Ljava/time/chrono/JapaneseEra;III)Ljava/time/chrono/JapaneseDate;\"/>\n\t\t<method name=\"plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/JapaneseDate;\"/>\n\t\t<method name=\"plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/JapaneseDate;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/chrono/JapaneseDate;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalField;J)Ljava/time/chrono/JapaneseDate;\"/>\n\t</class>\n\t<class name=\"java/time/chrono/JapaneseEra\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/time/chrono/Era\"/>\n\t\t<method name=\"of(I)Ljava/time/chrono/JapaneseEra;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/time/chrono/JapaneseEra;\"/>\n\t\t<method name=\"values()[Ljava/time/chrono/JapaneseEra;\"/>\n\t\t<field name=\"HEISEI\"/>\n\t\t<field name=\"MEIJI\"/>\n\t\t<field name=\"REIWA\" since=\"30\"/>\n\t\t<field name=\"SHOWA\"/>\n\t\t<field name=\"TAISHO\"/>\n\t</class>\n\t<class name=\"java/time/chrono/MinguoChronology\" since=\"26\">\n\t\t<extends name=\"java/time/chrono/AbstractChronology\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"date(III)Ljava/time/chrono/MinguoDate;\"/>\n\t\t<method name=\"date(Ljava/time/chrono/Era;III)Ljava/time/chrono/MinguoDate;\"/>\n\t\t<method name=\"date(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/MinguoDate;\"/>\n\t\t<method name=\"dateEpochDay(J)Ljava/time/chrono/MinguoDate;\"/>\n\t\t<method name=\"dateNow()Ljava/time/chrono/MinguoDate;\"/>\n\t\t<method name=\"dateNow(Ljava/time/Clock;)Ljava/time/chrono/MinguoDate;\"/>\n\t\t<method name=\"dateNow(Ljava/time/ZoneId;)Ljava/time/chrono/MinguoDate;\"/>\n\t\t<method name=\"dateYearDay(II)Ljava/time/chrono/MinguoDate;\"/>\n\t\t<method name=\"dateYearDay(Ljava/time/chrono/Era;II)Ljava/time/chrono/MinguoDate;\"/>\n\t\t<method name=\"eraOf(I)Ljava/time/chrono/MinguoEra;\"/>\n\t\t<method name=\"resolveDate(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/MinguoDate;\"/>\n\t\t<field name=\"INSTANCE\"/>\n\t</class>\n\t<class name=\"java/time/chrono/MinguoDate\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/MinguoDate;\"/>\n\t\t<method name=\"getChronology()Ljava/time/chrono/MinguoChronology;\"/>\n\t\t<method name=\"getEra()Ljava/time/chrono/MinguoEra;\"/>\n\t\t<method name=\"minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/MinguoDate;\"/>\n\t\t<method name=\"minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/MinguoDate;\"/>\n\t\t<method name=\"now()Ljava/time/chrono/MinguoDate;\"/>\n\t\t<method name=\"now(Ljava/time/Clock;)Ljava/time/chrono/MinguoDate;\"/>\n\t\t<method name=\"now(Ljava/time/ZoneId;)Ljava/time/chrono/MinguoDate;\"/>\n\t\t<method name=\"of(III)Ljava/time/chrono/MinguoDate;\"/>\n\t\t<method name=\"plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/MinguoDate;\"/>\n\t\t<method name=\"plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/MinguoDate;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/chrono/MinguoDate;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalField;J)Ljava/time/chrono/MinguoDate;\"/>\n\t</class>\n\t<class name=\"java/time/chrono/MinguoEra\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<implements name=\"java/time/chrono/Era\"/>\n\t\t<method name=\"of(I)Ljava/time/chrono/MinguoEra;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/time/chrono/MinguoEra;\"/>\n\t\t<method name=\"values()[Ljava/time/chrono/MinguoEra;\"/>\n\t\t<field name=\"BEFORE_ROC\"/>\n\t\t<field name=\"ROC\"/>\n\t</class>\n\t<class name=\"java/time/chrono/ThaiBuddhistChronology\" since=\"26\">\n\t\t<extends name=\"java/time/chrono/AbstractChronology\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"date(III)Ljava/time/chrono/ThaiBuddhistDate;\"/>\n\t\t<method name=\"date(Ljava/time/chrono/Era;III)Ljava/time/chrono/ThaiBuddhistDate;\"/>\n\t\t<method name=\"date(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/ThaiBuddhistDate;\"/>\n\t\t<method name=\"dateEpochDay(J)Ljava/time/chrono/ThaiBuddhistDate;\"/>\n\t\t<method name=\"dateNow()Ljava/time/chrono/ThaiBuddhistDate;\"/>\n\t\t<method name=\"dateNow(Ljava/time/Clock;)Ljava/time/chrono/ThaiBuddhistDate;\"/>\n\t\t<method name=\"dateNow(Ljava/time/ZoneId;)Ljava/time/chrono/ThaiBuddhistDate;\"/>\n\t\t<method name=\"dateYearDay(II)Ljava/time/chrono/ThaiBuddhistDate;\"/>\n\t\t<method name=\"dateYearDay(Ljava/time/chrono/Era;II)Ljava/time/chrono/ThaiBuddhistDate;\"/>\n\t\t<method name=\"eraOf(I)Ljava/time/chrono/ThaiBuddhistEra;\"/>\n\t\t<method name=\"resolveDate(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/ThaiBuddhistDate;\"/>\n\t\t<field name=\"INSTANCE\"/>\n\t</class>\n\t<class name=\"java/time/chrono/ThaiBuddhistDate\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/ThaiBuddhistDate;\"/>\n\t\t<method name=\"getChronology()Ljava/time/chrono/ThaiBuddhistChronology;\"/>\n\t\t<method name=\"getEra()Ljava/time/chrono/ThaiBuddhistEra;\"/>\n\t\t<method name=\"minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/ThaiBuddhistDate;\"/>\n\t\t<method name=\"minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/ThaiBuddhistDate;\"/>\n\t\t<method name=\"now()Ljava/time/chrono/ThaiBuddhistDate;\"/>\n\t\t<method name=\"now(Ljava/time/Clock;)Ljava/time/chrono/ThaiBuddhistDate;\"/>\n\t\t<method name=\"now(Ljava/time/ZoneId;)Ljava/time/chrono/ThaiBuddhistDate;\"/>\n\t\t<method name=\"of(III)Ljava/time/chrono/ThaiBuddhistDate;\"/>\n\t\t<method name=\"plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/ThaiBuddhistDate;\"/>\n\t\t<method name=\"plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/ThaiBuddhistDate;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/chrono/ThaiBuddhistDate;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalField;J)Ljava/time/chrono/ThaiBuddhistDate;\"/>\n\t</class>\n\t<class name=\"java/time/chrono/ThaiBuddhistEra\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<implements name=\"java/time/chrono/Era\"/>\n\t\t<method name=\"of(I)Ljava/time/chrono/ThaiBuddhistEra;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/time/chrono/ThaiBuddhistEra;\"/>\n\t\t<method name=\"values()[Ljava/time/chrono/ThaiBuddhistEra;\"/>\n\t\t<field name=\"BE\"/>\n\t\t<field name=\"BEFORE_BE\"/>\n\t</class>\n\t<class name=\"java/time/format/DateTimeFormatter\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"format(Ljava/time/temporal/TemporalAccessor;)Ljava/lang/String;\"/>\n\t\t<method name=\"formatTo(Ljava/time/temporal/TemporalAccessor;Ljava/lang/Appendable;)V\"/>\n\t\t<method name=\"getChronology()Ljava/time/chrono/Chronology;\"/>\n\t\t<method name=\"getDecimalStyle()Ljava/time/format/DecimalStyle;\"/>\n\t\t<method name=\"getLocale()Ljava/util/Locale;\"/>\n\t\t<method name=\"getResolverFields()Ljava/util/Set;\"/>\n\t\t<method name=\"getResolverStyle()Ljava/time/format/ResolverStyle;\"/>\n\t\t<method name=\"getZone()Ljava/time/ZoneId;\"/>\n\t\t<method name=\"ofLocalizedDate(Ljava/time/format/FormatStyle;)Ljava/time/format/DateTimeFormatter;\"/>\n\t\t<method name=\"ofLocalizedDateTime(Ljava/time/format/FormatStyle;)Ljava/time/format/DateTimeFormatter;\"/>\n\t\t<method name=\"ofLocalizedDateTime(Ljava/time/format/FormatStyle;Ljava/time/format/FormatStyle;)Ljava/time/format/DateTimeFormatter;\"/>\n\t\t<method name=\"ofLocalizedTime(Ljava/time/format/FormatStyle;)Ljava/time/format/DateTimeFormatter;\"/>\n\t\t<method name=\"ofPattern(Ljava/lang/String;)Ljava/time/format/DateTimeFormatter;\"/>\n\t\t<method name=\"ofPattern(Ljava/lang/String;Ljava/util/Locale;)Ljava/time/format/DateTimeFormatter;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;)Ljava/time/temporal/TemporalAccessor;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;Ljava/text/ParsePosition;)Ljava/time/temporal/TemporalAccessor;\"/>\n\t\t<method name=\"parse(Ljava/lang/CharSequence;Ljava/time/temporal/TemporalQuery;)Ljava/lang/Object;\"/>\n\t\t<method name=\"parseBest(Ljava/lang/CharSequence;[Ljava/time/temporal/TemporalQuery;)Ljava/time/temporal/TemporalAccessor;\"/>\n\t\t<method name=\"parseUnresolved(Ljava/lang/CharSequence;Ljava/text/ParsePosition;)Ljava/time/temporal/TemporalAccessor;\"/>\n\t\t<method name=\"parsedExcessDays()Ljava/time/temporal/TemporalQuery;\"/>\n\t\t<method name=\"parsedLeapSecond()Ljava/time/temporal/TemporalQuery;\"/>\n\t\t<method name=\"toFormat()Ljava/text/Format;\"/>\n\t\t<method name=\"toFormat(Ljava/time/temporal/TemporalQuery;)Ljava/text/Format;\"/>\n\t\t<method name=\"withChronology(Ljava/time/chrono/Chronology;)Ljava/time/format/DateTimeFormatter;\"/>\n\t\t<method name=\"withDecimalStyle(Ljava/time/format/DecimalStyle;)Ljava/time/format/DateTimeFormatter;\"/>\n\t\t<method name=\"withLocale(Ljava/util/Locale;)Ljava/time/format/DateTimeFormatter;\"/>\n\t\t<method name=\"withResolverFields(Ljava/util/Set;)Ljava/time/format/DateTimeFormatter;\"/>\n\t\t<method name=\"withResolverFields([Ljava/time/temporal/TemporalField;)Ljava/time/format/DateTimeFormatter;\"/>\n\t\t<method name=\"withResolverStyle(Ljava/time/format/ResolverStyle;)Ljava/time/format/DateTimeFormatter;\"/>\n\t\t<method name=\"withZone(Ljava/time/ZoneId;)Ljava/time/format/DateTimeFormatter;\"/>\n\t\t<field name=\"BASIC_ISO_DATE\"/>\n\t\t<field name=\"ISO_DATE\"/>\n\t\t<field name=\"ISO_DATE_TIME\"/>\n\t\t<field name=\"ISO_INSTANT\"/>\n\t\t<field name=\"ISO_LOCAL_DATE\"/>\n\t\t<field name=\"ISO_LOCAL_DATE_TIME\"/>\n\t\t<field name=\"ISO_LOCAL_TIME\"/>\n\t\t<field name=\"ISO_OFFSET_DATE\"/>\n\t\t<field name=\"ISO_OFFSET_DATE_TIME\"/>\n\t\t<field name=\"ISO_OFFSET_TIME\"/>\n\t\t<field name=\"ISO_ORDINAL_DATE\"/>\n\t\t<field name=\"ISO_TIME\"/>\n\t\t<field name=\"ISO_WEEK_DATE\"/>\n\t\t<field name=\"ISO_ZONED_DATE_TIME\"/>\n\t\t<field name=\"RFC_1123_DATE_TIME\"/>\n\t</class>\n\t<class name=\"java/time/format/DateTimeFormatterBuilder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"append(Ljava/time/format/DateTimeFormatter;)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendChronologyId()Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendChronologyText(Ljava/time/format/TextStyle;)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendFraction(Ljava/time/temporal/TemporalField;IIZ)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendInstant()Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendInstant(I)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendLiteral(C)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendLiteral(Ljava/lang/String;)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendLocalized(Ljava/time/format/FormatStyle;Ljava/time/format/FormatStyle;)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendLocalizedOffset(Ljava/time/format/TextStyle;)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendOffset(Ljava/lang/String;Ljava/lang/String;)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendOffsetId()Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendOptional(Ljava/time/format/DateTimeFormatter;)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendPattern(Ljava/lang/String;)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendText(Ljava/time/temporal/TemporalField;)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendText(Ljava/time/temporal/TemporalField;Ljava/time/format/TextStyle;)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendText(Ljava/time/temporal/TemporalField;Ljava/util/Map;)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendValue(Ljava/time/temporal/TemporalField;)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendValue(Ljava/time/temporal/TemporalField;I)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendValue(Ljava/time/temporal/TemporalField;IILjava/time/format/SignStyle;)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendValueReduced(Ljava/time/temporal/TemporalField;III)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendValueReduced(Ljava/time/temporal/TemporalField;IILjava/time/chrono/ChronoLocalDate;)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendZoneId()Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendZoneOrOffsetId()Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendZoneRegionId()Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendZoneText(Ljava/time/format/TextStyle;)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"appendZoneText(Ljava/time/format/TextStyle;Ljava/util/Set;)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"getLocalizedDateTimePattern(Ljava/time/format/FormatStyle;Ljava/time/format/FormatStyle;Ljava/time/chrono/Chronology;Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"optionalEnd()Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"optionalStart()Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"padNext(I)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"padNext(IC)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"parseCaseInsensitive()Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"parseCaseSensitive()Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"parseDefaulting(Ljava/time/temporal/TemporalField;J)Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"parseLenient()Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"parseStrict()Ljava/time/format/DateTimeFormatterBuilder;\"/>\n\t\t<method name=\"toFormatter()Ljava/time/format/DateTimeFormatter;\"/>\n\t\t<method name=\"toFormatter(Ljava/util/Locale;)Ljava/time/format/DateTimeFormatter;\"/>\n\t</class>\n\t<class name=\"java/time/format/DateTimeParseException\" since=\"26\">\n\t\t<extends name=\"java/time/DateTimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/CharSequence;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/CharSequence;ILjava/lang/Throwable;)V\"/>\n\t\t<method name=\"getErrorIndex()I\"/>\n\t\t<method name=\"getParsedString()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/time/format/DecimalStyle\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAvailableLocales()Ljava/util/Set;\"/>\n\t\t<method name=\"getDecimalSeparator()C\"/>\n\t\t<method name=\"getNegativeSign()C\"/>\n\t\t<method name=\"getPositiveSign()C\"/>\n\t\t<method name=\"getZeroDigit()C\"/>\n\t\t<method name=\"of(Ljava/util/Locale;)Ljava/time/format/DecimalStyle;\"/>\n\t\t<method name=\"ofDefaultLocale()Ljava/time/format/DecimalStyle;\"/>\n\t\t<method name=\"withDecimalSeparator(C)Ljava/time/format/DecimalStyle;\"/>\n\t\t<method name=\"withNegativeSign(C)Ljava/time/format/DecimalStyle;\"/>\n\t\t<method name=\"withPositiveSign(C)Ljava/time/format/DecimalStyle;\"/>\n\t\t<method name=\"withZeroDigit(C)Ljava/time/format/DecimalStyle;\"/>\n\t\t<field name=\"STANDARD\"/>\n\t</class>\n\t<class name=\"java/time/format/FormatStyle\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/time/format/FormatStyle;\"/>\n\t\t<method name=\"values()[Ljava/time/format/FormatStyle;\"/>\n\t\t<field name=\"FULL\"/>\n\t\t<field name=\"LONG\"/>\n\t\t<field name=\"MEDIUM\"/>\n\t\t<field name=\"SHORT\"/>\n\t</class>\n\t<class name=\"java/time/format/ResolverStyle\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/time/format/ResolverStyle;\"/>\n\t\t<method name=\"values()[Ljava/time/format/ResolverStyle;\"/>\n\t\t<field name=\"LENIENT\"/>\n\t\t<field name=\"SMART\"/>\n\t\t<field name=\"STRICT\"/>\n\t</class>\n\t<class name=\"java/time/format/SignStyle\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/time/format/SignStyle;\"/>\n\t\t<method name=\"values()[Ljava/time/format/SignStyle;\"/>\n\t\t<field name=\"ALWAYS\"/>\n\t\t<field name=\"EXCEEDS_PAD\"/>\n\t\t<field name=\"NEVER\"/>\n\t\t<field name=\"NORMAL\"/>\n\t\t<field name=\"NOT_NEGATIVE\"/>\n\t</class>\n\t<class name=\"java/time/format/TextStyle\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"asNormal()Ljava/time/format/TextStyle;\"/>\n\t\t<method name=\"asStandalone()Ljava/time/format/TextStyle;\"/>\n\t\t<method name=\"isStandalone()Z\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/time/format/TextStyle;\"/>\n\t\t<method name=\"values()[Ljava/time/format/TextStyle;\"/>\n\t\t<field name=\"FULL\"/>\n\t\t<field name=\"FULL_STANDALONE\"/>\n\t\t<field name=\"NARROW\"/>\n\t\t<field name=\"NARROW_STANDALONE\"/>\n\t\t<field name=\"SHORT\"/>\n\t\t<field name=\"SHORT_STANDALONE\"/>\n\t</class>\n\t<class name=\"java/time/temporal/ChronoField\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<implements name=\"java/time/temporal/TemporalField\"/>\n\t\t<method name=\"checkValidIntValue(J)I\"/>\n\t\t<method name=\"checkValidValue(J)J\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/time/temporal/ChronoField;\"/>\n\t\t<method name=\"values()[Ljava/time/temporal/ChronoField;\"/>\n\t\t<field name=\"ALIGNED_DAY_OF_WEEK_IN_MONTH\"/>\n\t\t<field name=\"ALIGNED_DAY_OF_WEEK_IN_YEAR\"/>\n\t\t<field name=\"ALIGNED_WEEK_OF_MONTH\"/>\n\t\t<field name=\"ALIGNED_WEEK_OF_YEAR\"/>\n\t\t<field name=\"AMPM_OF_DAY\"/>\n\t\t<field name=\"CLOCK_HOUR_OF_AMPM\"/>\n\t\t<field name=\"CLOCK_HOUR_OF_DAY\"/>\n\t\t<field name=\"DAY_OF_MONTH\"/>\n\t\t<field name=\"DAY_OF_WEEK\"/>\n\t\t<field name=\"DAY_OF_YEAR\"/>\n\t\t<field name=\"EPOCH_DAY\"/>\n\t\t<field name=\"ERA\"/>\n\t\t<field name=\"HOUR_OF_AMPM\"/>\n\t\t<field name=\"HOUR_OF_DAY\"/>\n\t\t<field name=\"INSTANT_SECONDS\"/>\n\t\t<field name=\"MICRO_OF_DAY\"/>\n\t\t<field name=\"MICRO_OF_SECOND\"/>\n\t\t<field name=\"MILLI_OF_DAY\"/>\n\t\t<field name=\"MILLI_OF_SECOND\"/>\n\t\t<field name=\"MINUTE_OF_DAY\"/>\n\t\t<field name=\"MINUTE_OF_HOUR\"/>\n\t\t<field name=\"MONTH_OF_YEAR\"/>\n\t\t<field name=\"NANO_OF_DAY\"/>\n\t\t<field name=\"NANO_OF_SECOND\"/>\n\t\t<field name=\"OFFSET_SECONDS\"/>\n\t\t<field name=\"PROLEPTIC_MONTH\"/>\n\t\t<field name=\"SECOND_OF_DAY\"/>\n\t\t<field name=\"SECOND_OF_MINUTE\"/>\n\t\t<field name=\"YEAR\"/>\n\t\t<field name=\"YEAR_OF_ERA\"/>\n\t</class>\n\t<class name=\"java/time/temporal/ChronoUnit\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<implements name=\"java/time/temporal/TemporalUnit\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/time/temporal/ChronoUnit;\"/>\n\t\t<method name=\"values()[Ljava/time/temporal/ChronoUnit;\"/>\n\t\t<field name=\"CENTURIES\"/>\n\t\t<field name=\"DAYS\"/>\n\t\t<field name=\"DECADES\"/>\n\t\t<field name=\"ERAS\"/>\n\t\t<field name=\"FOREVER\"/>\n\t\t<field name=\"HALF_DAYS\"/>\n\t\t<field name=\"HOURS\"/>\n\t\t<field name=\"MICROS\"/>\n\t\t<field name=\"MILLENNIA\"/>\n\t\t<field name=\"MILLIS\"/>\n\t\t<field name=\"MINUTES\"/>\n\t\t<field name=\"MONTHS\"/>\n\t\t<field name=\"NANOS\"/>\n\t\t<field name=\"SECONDS\"/>\n\t\t<field name=\"WEEKS\"/>\n\t\t<field name=\"YEARS\"/>\n\t</class>\n\t<class name=\"java/time/temporal/IsoFields\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"DAY_OF_QUARTER\"/>\n\t\t<field name=\"QUARTER_OF_YEAR\"/>\n\t\t<field name=\"QUARTER_YEARS\"/>\n\t\t<field name=\"WEEK_BASED_YEAR\"/>\n\t\t<field name=\"WEEK_BASED_YEARS\"/>\n\t\t<field name=\"WEEK_OF_WEEK_BASED_YEAR\"/>\n\t</class>\n\t<class name=\"java/time/temporal/JulianFields\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"JULIAN_DAY\"/>\n\t\t<field name=\"MODIFIED_JULIAN_DAY\"/>\n\t\t<field name=\"RATA_DIE\"/>\n\t</class>\n\t<class name=\"java/time/temporal/Temporal\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/time/temporal/TemporalAccessor\"/>\n\t\t<method name=\"isSupported(Ljava/time/temporal/TemporalUnit;)Z\"/>\n\t\t<method name=\"minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/temporal/Temporal;\"/>\n\t\t<method name=\"minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/temporal/Temporal;\"/>\n\t\t<method name=\"plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/temporal/Temporal;\"/>\n\t\t<method name=\"plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/temporal/Temporal;\"/>\n\t\t<method name=\"until(Ljava/time/temporal/Temporal;Ljava/time/temporal/TemporalUnit;)J\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/temporal/Temporal;\"/>\n\t\t<method name=\"with(Ljava/time/temporal/TemporalField;J)Ljava/time/temporal/Temporal;\"/>\n\t</class>\n\t<class name=\"java/time/temporal/TemporalAccessor\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"get(Ljava/time/temporal/TemporalField;)I\"/>\n\t\t<method name=\"getLong(Ljava/time/temporal/TemporalField;)J\"/>\n\t\t<method name=\"isSupported(Ljava/time/temporal/TemporalField;)Z\"/>\n\t\t<method name=\"query(Ljava/time/temporal/TemporalQuery;)Ljava/lang/Object;\"/>\n\t\t<method name=\"range(Ljava/time/temporal/TemporalField;)Ljava/time/temporal/ValueRange;\"/>\n\t</class>\n\t<class name=\"java/time/temporal/TemporalAdjuster\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"adjustInto(Ljava/time/temporal/Temporal;)Ljava/time/temporal/Temporal;\"/>\n\t</class>\n\t<class name=\"java/time/temporal/TemporalAdjusters\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"dayOfWeekInMonth(ILjava/time/DayOfWeek;)Ljava/time/temporal/TemporalAdjuster;\"/>\n\t\t<method name=\"firstDayOfMonth()Ljava/time/temporal/TemporalAdjuster;\"/>\n\t\t<method name=\"firstDayOfNextMonth()Ljava/time/temporal/TemporalAdjuster;\"/>\n\t\t<method name=\"firstDayOfNextYear()Ljava/time/temporal/TemporalAdjuster;\"/>\n\t\t<method name=\"firstDayOfYear()Ljava/time/temporal/TemporalAdjuster;\"/>\n\t\t<method name=\"firstInMonth(Ljava/time/DayOfWeek;)Ljava/time/temporal/TemporalAdjuster;\"/>\n\t\t<method name=\"lastDayOfMonth()Ljava/time/temporal/TemporalAdjuster;\"/>\n\t\t<method name=\"lastDayOfYear()Ljava/time/temporal/TemporalAdjuster;\"/>\n\t\t<method name=\"lastInMonth(Ljava/time/DayOfWeek;)Ljava/time/temporal/TemporalAdjuster;\"/>\n\t\t<method name=\"next(Ljava/time/DayOfWeek;)Ljava/time/temporal/TemporalAdjuster;\"/>\n\t\t<method name=\"nextOrSame(Ljava/time/DayOfWeek;)Ljava/time/temporal/TemporalAdjuster;\"/>\n\t\t<method name=\"ofDateAdjuster(Ljava/util/function/UnaryOperator;)Ljava/time/temporal/TemporalAdjuster;\"/>\n\t\t<method name=\"previous(Ljava/time/DayOfWeek;)Ljava/time/temporal/TemporalAdjuster;\"/>\n\t\t<method name=\"previousOrSame(Ljava/time/DayOfWeek;)Ljava/time/temporal/TemporalAdjuster;\"/>\n\t</class>\n\t<class name=\"java/time/temporal/TemporalAmount\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addTo(Ljava/time/temporal/Temporal;)Ljava/time/temporal/Temporal;\"/>\n\t\t<method name=\"get(Ljava/time/temporal/TemporalUnit;)J\"/>\n\t\t<method name=\"getUnits()Ljava/util/List;\"/>\n\t\t<method name=\"subtractFrom(Ljava/time/temporal/Temporal;)Ljava/time/temporal/Temporal;\"/>\n\t</class>\n\t<class name=\"java/time/temporal/TemporalField\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"adjustInto(Ljava/time/temporal/Temporal;J)Ljava/time/temporal/Temporal;\"/>\n\t\t<method name=\"getBaseUnit()Ljava/time/temporal/TemporalUnit;\"/>\n\t\t<method name=\"getDisplayName(Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getFrom(Ljava/time/temporal/TemporalAccessor;)J\"/>\n\t\t<method name=\"getRangeUnit()Ljava/time/temporal/TemporalUnit;\"/>\n\t\t<method name=\"isDateBased()Z\"/>\n\t\t<method name=\"isSupportedBy(Ljava/time/temporal/TemporalAccessor;)Z\"/>\n\t\t<method name=\"isTimeBased()Z\"/>\n\t\t<method name=\"range()Ljava/time/temporal/ValueRange;\"/>\n\t\t<method name=\"rangeRefinedBy(Ljava/time/temporal/TemporalAccessor;)Ljava/time/temporal/ValueRange;\"/>\n\t\t<method name=\"resolve(Ljava/util/Map;Ljava/time/temporal/TemporalAccessor;Ljava/time/format/ResolverStyle;)Ljava/time/temporal/TemporalAccessor;\"/>\n\t</class>\n\t<class name=\"java/time/temporal/TemporalQueries\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"chronology()Ljava/time/temporal/TemporalQuery;\"/>\n\t\t<method name=\"localDate()Ljava/time/temporal/TemporalQuery;\"/>\n\t\t<method name=\"localTime()Ljava/time/temporal/TemporalQuery;\"/>\n\t\t<method name=\"offset()Ljava/time/temporal/TemporalQuery;\"/>\n\t\t<method name=\"precision()Ljava/time/temporal/TemporalQuery;\"/>\n\t\t<method name=\"zone()Ljava/time/temporal/TemporalQuery;\"/>\n\t\t<method name=\"zoneId()Ljava/time/temporal/TemporalQuery;\"/>\n\t</class>\n\t<class name=\"java/time/temporal/TemporalQuery\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"queryFrom(Ljava/time/temporal/TemporalAccessor;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/time/temporal/TemporalUnit\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addTo(Ljava/time/temporal/Temporal;J)Ljava/time/temporal/Temporal;\"/>\n\t\t<method name=\"between(Ljava/time/temporal/Temporal;Ljava/time/temporal/Temporal;)J\"/>\n\t\t<method name=\"getDuration()Ljava/time/Duration;\"/>\n\t\t<method name=\"isDateBased()Z\"/>\n\t\t<method name=\"isDurationEstimated()Z\"/>\n\t\t<method name=\"isSupportedBy(Ljava/time/temporal/Temporal;)Z\"/>\n\t\t<method name=\"isTimeBased()Z\"/>\n\t</class>\n\t<class name=\"java/time/temporal/UnsupportedTemporalTypeException\" since=\"26\">\n\t\t<extends name=\"java/time/DateTimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/time/temporal/ValueRange\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"checkValidIntValue(JLjava/time/temporal/TemporalField;)I\"/>\n\t\t<method name=\"checkValidValue(JLjava/time/temporal/TemporalField;)J\"/>\n\t\t<method name=\"getLargestMinimum()J\"/>\n\t\t<method name=\"getMaximum()J\"/>\n\t\t<method name=\"getMinimum()J\"/>\n\t\t<method name=\"getSmallestMaximum()J\"/>\n\t\t<method name=\"isFixed()Z\"/>\n\t\t<method name=\"isIntValue()Z\"/>\n\t\t<method name=\"isValidIntValue(J)Z\"/>\n\t\t<method name=\"isValidValue(J)Z\"/>\n\t\t<method name=\"of(JJ)Ljava/time/temporal/ValueRange;\"/>\n\t\t<method name=\"of(JJJ)Ljava/time/temporal/ValueRange;\"/>\n\t\t<method name=\"of(JJJJ)Ljava/time/temporal/ValueRange;\"/>\n\t</class>\n\t<class name=\"java/time/temporal/WeekFields\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"dayOfWeek()Ljava/time/temporal/TemporalField;\"/>\n\t\t<method name=\"getFirstDayOfWeek()Ljava/time/DayOfWeek;\"/>\n\t\t<method name=\"getMinimalDaysInFirstWeek()I\"/>\n\t\t<method name=\"of(Ljava/time/DayOfWeek;I)Ljava/time/temporal/WeekFields;\"/>\n\t\t<method name=\"of(Ljava/util/Locale;)Ljava/time/temporal/WeekFields;\"/>\n\t\t<method name=\"weekBasedYear()Ljava/time/temporal/TemporalField;\"/>\n\t\t<method name=\"weekOfMonth()Ljava/time/temporal/TemporalField;\"/>\n\t\t<method name=\"weekOfWeekBasedYear()Ljava/time/temporal/TemporalField;\"/>\n\t\t<method name=\"weekOfYear()Ljava/time/temporal/TemporalField;\"/>\n\t\t<field name=\"ISO\"/>\n\t\t<field name=\"SUNDAY_START\"/>\n\t\t<field name=\"WEEK_BASED_YEARS\"/>\n\t</class>\n\t<class name=\"java/time/zone/ZoneOffsetTransition\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"compareTo(Ljava/time/zone/ZoneOffsetTransition;)I\"/>\n\t\t<method name=\"getDateTimeAfter()Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"getDateTimeBefore()Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"getDuration()Ljava/time/Duration;\"/>\n\t\t<method name=\"getInstant()Ljava/time/Instant;\"/>\n\t\t<method name=\"getOffsetAfter()Ljava/time/ZoneOffset;\"/>\n\t\t<method name=\"getOffsetBefore()Ljava/time/ZoneOffset;\"/>\n\t\t<method name=\"isGap()Z\"/>\n\t\t<method name=\"isOverlap()Z\"/>\n\t\t<method name=\"isValidOffset(Ljava/time/ZoneOffset;)Z\"/>\n\t\t<method name=\"of(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;)Ljava/time/zone/ZoneOffsetTransition;\"/>\n\t\t<method name=\"toEpochSecond()J\"/>\n\t</class>\n\t<class name=\"java/time/zone/ZoneOffsetTransitionRule\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"createTransition(I)Ljava/time/zone/ZoneOffsetTransition;\"/>\n\t\t<method name=\"getDayOfMonthIndicator()I\"/>\n\t\t<method name=\"getDayOfWeek()Ljava/time/DayOfWeek;\"/>\n\t\t<method name=\"getLocalTime()Ljava/time/LocalTime;\"/>\n\t\t<method name=\"getMonth()Ljava/time/Month;\"/>\n\t\t<method name=\"getOffsetAfter()Ljava/time/ZoneOffset;\"/>\n\t\t<method name=\"getOffsetBefore()Ljava/time/ZoneOffset;\"/>\n\t\t<method name=\"getStandardOffset()Ljava/time/ZoneOffset;\"/>\n\t\t<method name=\"getTimeDefinition()Ljava/time/zone/ZoneOffsetTransitionRule$TimeDefinition;\"/>\n\t\t<method name=\"isMidnightEndOfDay()Z\"/>\n\t\t<method name=\"of(Ljava/time/Month;ILjava/time/DayOfWeek;Ljava/time/LocalTime;ZLjava/time/zone/ZoneOffsetTransitionRule$TimeDefinition;Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;)Ljava/time/zone/ZoneOffsetTransitionRule;\"/>\n\t</class>\n\t<class name=\"java/time/zone/ZoneOffsetTransitionRule$TimeDefinition\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"createDateTime(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;)Ljava/time/LocalDateTime;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/time/zone/ZoneOffsetTransitionRule$TimeDefinition;\"/>\n\t\t<method name=\"values()[Ljava/time/zone/ZoneOffsetTransitionRule$TimeDefinition;\"/>\n\t\t<field name=\"STANDARD\"/>\n\t\t<field name=\"UTC\"/>\n\t\t<field name=\"WALL\"/>\n\t</class>\n\t<class name=\"java/time/zone/ZoneRules\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"getDaylightSavings(Ljava/time/Instant;)Ljava/time/Duration;\"/>\n\t\t<method name=\"getOffset(Ljava/time/Instant;)Ljava/time/ZoneOffset;\"/>\n\t\t<method name=\"getOffset(Ljava/time/LocalDateTime;)Ljava/time/ZoneOffset;\"/>\n\t\t<method name=\"getStandardOffset(Ljava/time/Instant;)Ljava/time/ZoneOffset;\"/>\n\t\t<method name=\"getTransition(Ljava/time/LocalDateTime;)Ljava/time/zone/ZoneOffsetTransition;\"/>\n\t\t<method name=\"getTransitionRules()Ljava/util/List;\"/>\n\t\t<method name=\"getTransitions()Ljava/util/List;\"/>\n\t\t<method name=\"getValidOffsets(Ljava/time/LocalDateTime;)Ljava/util/List;\"/>\n\t\t<method name=\"isDaylightSavings(Ljava/time/Instant;)Z\"/>\n\t\t<method name=\"isFixedOffset()Z\"/>\n\t\t<method name=\"isValidOffset(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;)Z\"/>\n\t\t<method name=\"nextTransition(Ljava/time/Instant;)Ljava/time/zone/ZoneOffsetTransition;\"/>\n\t\t<method name=\"of(Ljava/time/ZoneOffset;)Ljava/time/zone/ZoneRules;\"/>\n\t\t<method name=\"of(Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;Ljava/util/List;Ljava/util/List;Ljava/util/List;)Ljava/time/zone/ZoneRules;\"/>\n\t\t<method name=\"previousTransition(Ljava/time/Instant;)Ljava/time/zone/ZoneOffsetTransition;\"/>\n\t</class>\n\t<class name=\"java/time/zone/ZoneRulesException\" since=\"26\">\n\t\t<extends name=\"java/time/DateTimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/util/AbstractCollection\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Collection\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/util/AbstractList\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractCollection\"/>\n\t\t<implements name=\"java/util/List\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"removeRange(II)V\"/>\n\t\t<field name=\"modCount\"/>\n\t</class>\n\t<class name=\"java/util/AbstractMap\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Map\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/util/AbstractMap$SimpleEntry\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/util/Map$Entry\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Map$Entry;)V\"/>\n\t</class>\n\t<class name=\"java/util/AbstractMap$SimpleImmutableEntry\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/util/Map$Entry\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Map$Entry;)V\"/>\n\t</class>\n\t<class name=\"java/util/AbstractQueue\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractCollection\"/>\n\t\t<implements name=\"java/util/Queue\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/util/AbstractSequentialList\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractList\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/util/AbstractSet\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractCollection\"/>\n\t\t<implements name=\"java/util/Set\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/util/ArrayDeque\" since=\"9\">\n\t\t<extends name=\"java/util/AbstractCollection\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"java/util/Deque\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Collection;)V\"/>\n\t\t<method name=\"clone()Ljava/util/ArrayDeque;\"/>\n\t</class>\n\t<class name=\"java/util/ArrayList\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractList\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"java/util/RandomAccess\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Collection;)V\"/>\n\t\t<method name=\"ensureCapacity(I)V\"/>\n\t\t<method name=\"trimToSize()V\"/>\n\t</class>\n\t<class name=\"java/util/Arrays\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"asList([Ljava/lang/Object;)Ljava/util/List;\"/>\n\t\t<method name=\"binarySearch([BB)I\"/>\n\t\t<method name=\"binarySearch([BIIB)I\" since=\"9\"/>\n\t\t<method name=\"binarySearch([CC)I\"/>\n\t\t<method name=\"binarySearch([CIIC)I\" since=\"9\"/>\n\t\t<method name=\"binarySearch([DD)I\"/>\n\t\t<method name=\"binarySearch([DIID)I\" since=\"9\"/>\n\t\t<method name=\"binarySearch([FF)I\"/>\n\t\t<method name=\"binarySearch([FIIF)I\" since=\"9\"/>\n\t\t<method name=\"binarySearch([II)I\"/>\n\t\t<method name=\"binarySearch([IIII)I\" since=\"9\"/>\n\t\t<method name=\"binarySearch([JIIJ)I\" since=\"9\"/>\n\t\t<method name=\"binarySearch([JJ)I\"/>\n\t\t<method name=\"binarySearch([Ljava/lang/Object;IILjava/lang/Object;)I\" since=\"9\"/>\n\t\t<method name=\"binarySearch([Ljava/lang/Object;IILjava/lang/Object;Ljava/util/Comparator;)I\" since=\"9\"/>\n\t\t<method name=\"binarySearch([Ljava/lang/Object;Ljava/lang/Object;)I\"/>\n\t\t<method name=\"binarySearch([Ljava/lang/Object;Ljava/lang/Object;Ljava/util/Comparator;)I\"/>\n\t\t<method name=\"binarySearch([SIIS)I\" since=\"9\"/>\n\t\t<method name=\"binarySearch([SS)I\"/>\n\t\t<method name=\"copyOf([BI)[B\" since=\"9\"/>\n\t\t<method name=\"copyOf([CI)[C\" since=\"9\"/>\n\t\t<method name=\"copyOf([DI)[D\" since=\"9\"/>\n\t\t<method name=\"copyOf([FI)[F\" since=\"9\"/>\n\t\t<method name=\"copyOf([II)[I\" since=\"9\"/>\n\t\t<method name=\"copyOf([JI)[J\" since=\"9\"/>\n\t\t<method name=\"copyOf([Ljava/lang/Object;I)[Ljava/lang/Object;\" since=\"9\"/>\n\t\t<method name=\"copyOf([Ljava/lang/Object;ILjava/lang/Class;)[Ljava/lang/Object;\" since=\"9\"/>\n\t\t<method name=\"copyOf([SI)[S\" since=\"9\"/>\n\t\t<method name=\"copyOf([ZI)[Z\" since=\"9\"/>\n\t\t<method name=\"copyOfRange([BII)[B\" since=\"9\"/>\n\t\t<method name=\"copyOfRange([CII)[C\" since=\"9\"/>\n\t\t<method name=\"copyOfRange([DII)[D\" since=\"9\"/>\n\t\t<method name=\"copyOfRange([FII)[F\" since=\"9\"/>\n\t\t<method name=\"copyOfRange([III)[I\" since=\"9\"/>\n\t\t<method name=\"copyOfRange([JII)[J\" since=\"9\"/>\n\t\t<method name=\"copyOfRange([Ljava/lang/Object;II)[Ljava/lang/Object;\" since=\"9\"/>\n\t\t<method name=\"copyOfRange([Ljava/lang/Object;IILjava/lang/Class;)[Ljava/lang/Object;\" since=\"9\"/>\n\t\t<method name=\"copyOfRange([SII)[S\" since=\"9\"/>\n\t\t<method name=\"copyOfRange([ZII)[Z\" since=\"9\"/>\n\t\t<method name=\"deepEquals([Ljava/lang/Object;[Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"deepHashCode([Ljava/lang/Object;)I\"/>\n\t\t<method name=\"deepToString([Ljava/lang/Object;)Ljava/lang/String;\"/>\n\t\t<method name=\"equals([B[B)Z\"/>\n\t\t<method name=\"equals([C[C)Z\"/>\n\t\t<method name=\"equals([D[D)Z\"/>\n\t\t<method name=\"equals([F[F)Z\"/>\n\t\t<method name=\"equals([I[I)Z\"/>\n\t\t<method name=\"equals([J[J)Z\"/>\n\t\t<method name=\"equals([Ljava/lang/Object;[Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"equals([S[S)Z\"/>\n\t\t<method name=\"equals([Z[Z)Z\"/>\n\t\t<method name=\"fill([BB)V\"/>\n\t\t<method name=\"fill([BIIB)V\"/>\n\t\t<method name=\"fill([CC)V\"/>\n\t\t<method name=\"fill([CIIC)V\"/>\n\t\t<method name=\"fill([DD)V\"/>\n\t\t<method name=\"fill([DIID)V\"/>\n\t\t<method name=\"fill([FF)V\"/>\n\t\t<method name=\"fill([FIIF)V\"/>\n\t\t<method name=\"fill([II)V\"/>\n\t\t<method name=\"fill([IIII)V\"/>\n\t\t<method name=\"fill([JIIJ)V\"/>\n\t\t<method name=\"fill([JJ)V\"/>\n\t\t<method name=\"fill([Ljava/lang/Object;IILjava/lang/Object;)V\"/>\n\t\t<method name=\"fill([Ljava/lang/Object;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"fill([SIIS)V\"/>\n\t\t<method name=\"fill([SS)V\"/>\n\t\t<method name=\"fill([ZIIZ)V\"/>\n\t\t<method name=\"fill([ZZ)V\"/>\n\t\t<method name=\"hashCode([B)I\"/>\n\t\t<method name=\"hashCode([C)I\"/>\n\t\t<method name=\"hashCode([D)I\"/>\n\t\t<method name=\"hashCode([F)I\"/>\n\t\t<method name=\"hashCode([I)I\"/>\n\t\t<method name=\"hashCode([J)I\"/>\n\t\t<method name=\"hashCode([Ljava/lang/Object;)I\"/>\n\t\t<method name=\"hashCode([S)I\"/>\n\t\t<method name=\"hashCode([Z)I\"/>\n\t\t<method name=\"parallelPrefix([DIILjava/util/function/DoubleBinaryOperator;)V\" since=\"24\"/>\n\t\t<method name=\"parallelPrefix([DLjava/util/function/DoubleBinaryOperator;)V\" since=\"24\"/>\n\t\t<method name=\"parallelPrefix([IIILjava/util/function/IntBinaryOperator;)V\" since=\"24\"/>\n\t\t<method name=\"parallelPrefix([ILjava/util/function/IntBinaryOperator;)V\" since=\"24\"/>\n\t\t<method name=\"parallelPrefix([JIILjava/util/function/LongBinaryOperator;)V\" since=\"24\"/>\n\t\t<method name=\"parallelPrefix([JLjava/util/function/LongBinaryOperator;)V\" since=\"24\"/>\n\t\t<method name=\"parallelPrefix([Ljava/lang/Object;IILjava/util/function/BinaryOperator;)V\" since=\"24\"/>\n\t\t<method name=\"parallelPrefix([Ljava/lang/Object;Ljava/util/function/BinaryOperator;)V\" since=\"24\"/>\n\t\t<method name=\"parallelSetAll([DLjava/util/function/IntToDoubleFunction;)V\" since=\"24\"/>\n\t\t<method name=\"parallelSetAll([ILjava/util/function/IntUnaryOperator;)V\" since=\"24\"/>\n\t\t<method name=\"parallelSetAll([JLjava/util/function/IntToLongFunction;)V\" since=\"24\"/>\n\t\t<method name=\"parallelSetAll([Ljava/lang/Object;Ljava/util/function/IntFunction;)V\" since=\"24\"/>\n\t\t<method name=\"parallelSort([B)V\" since=\"24\"/>\n\t\t<method name=\"parallelSort([BII)V\" since=\"24\"/>\n\t\t<method name=\"parallelSort([C)V\" since=\"24\"/>\n\t\t<method name=\"parallelSort([CII)V\" since=\"24\"/>\n\t\t<method name=\"parallelSort([D)V\" since=\"24\"/>\n\t\t<method name=\"parallelSort([DII)V\" since=\"24\"/>\n\t\t<method name=\"parallelSort([F)V\" since=\"24\"/>\n\t\t<method name=\"parallelSort([FII)V\" since=\"24\"/>\n\t\t<method name=\"parallelSort([I)V\" since=\"24\"/>\n\t\t<method name=\"parallelSort([III)V\" since=\"24\"/>\n\t\t<method name=\"parallelSort([J)V\" since=\"24\"/>\n\t\t<method name=\"parallelSort([JII)V\" since=\"24\"/>\n\t\t<method name=\"parallelSort([Ljava/lang/Comparable;)V\" since=\"24\"/>\n\t\t<method name=\"parallelSort([Ljava/lang/Comparable;II)V\" since=\"24\"/>\n\t\t<method name=\"parallelSort([Ljava/lang/Object;IILjava/util/Comparator;)V\" since=\"24\"/>\n\t\t<method name=\"parallelSort([Ljava/lang/Object;Ljava/util/Comparator;)V\" since=\"24\"/>\n\t\t<method name=\"parallelSort([S)V\" since=\"24\"/>\n\t\t<method name=\"parallelSort([SII)V\" since=\"24\"/>\n\t\t<method name=\"setAll([DLjava/util/function/IntToDoubleFunction;)V\" since=\"24\"/>\n\t\t<method name=\"setAll([ILjava/util/function/IntUnaryOperator;)V\" since=\"24\"/>\n\t\t<method name=\"setAll([JLjava/util/function/IntToLongFunction;)V\" since=\"24\"/>\n\t\t<method name=\"setAll([Ljava/lang/Object;Ljava/util/function/IntFunction;)V\" since=\"24\"/>\n\t\t<method name=\"sort([B)V\"/>\n\t\t<method name=\"sort([BII)V\"/>\n\t\t<method name=\"sort([C)V\"/>\n\t\t<method name=\"sort([CII)V\"/>\n\t\t<method name=\"sort([D)V\"/>\n\t\t<method name=\"sort([DII)V\"/>\n\t\t<method name=\"sort([F)V\"/>\n\t\t<method name=\"sort([FII)V\"/>\n\t\t<method name=\"sort([I)V\"/>\n\t\t<method name=\"sort([III)V\"/>\n\t\t<method name=\"sort([J)V\"/>\n\t\t<method name=\"sort([JII)V\"/>\n\t\t<method name=\"sort([Ljava/lang/Object;)V\"/>\n\t\t<method name=\"sort([Ljava/lang/Object;II)V\"/>\n\t\t<method name=\"sort([Ljava/lang/Object;IILjava/util/Comparator;)V\"/>\n\t\t<method name=\"sort([Ljava/lang/Object;Ljava/util/Comparator;)V\"/>\n\t\t<method name=\"sort([S)V\"/>\n\t\t<method name=\"sort([SII)V\"/>\n\t\t<method name=\"spliterator([D)Ljava/util/Spliterator$OfDouble;\" since=\"24\"/>\n\t\t<method name=\"spliterator([DII)Ljava/util/Spliterator$OfDouble;\" since=\"24\"/>\n\t\t<method name=\"spliterator([I)Ljava/util/Spliterator$OfInt;\" since=\"24\"/>\n\t\t<method name=\"spliterator([III)Ljava/util/Spliterator$OfInt;\" since=\"24\"/>\n\t\t<method name=\"spliterator([J)Ljava/util/Spliterator$OfLong;\" since=\"24\"/>\n\t\t<method name=\"spliterator([JII)Ljava/util/Spliterator$OfLong;\" since=\"24\"/>\n\t\t<method name=\"spliterator([Ljava/lang/Object;)Ljava/util/Spliterator;\" since=\"24\"/>\n\t\t<method name=\"spliterator([Ljava/lang/Object;II)Ljava/util/Spliterator;\" since=\"24\"/>\n\t\t<method name=\"stream([D)Ljava/util/stream/DoubleStream;\" since=\"24\"/>\n\t\t<method name=\"stream([DII)Ljava/util/stream/DoubleStream;\" since=\"24\"/>\n\t\t<method name=\"stream([I)Ljava/util/stream/IntStream;\" since=\"24\"/>\n\t\t<method name=\"stream([III)Ljava/util/stream/IntStream;\" since=\"24\"/>\n\t\t<method name=\"stream([J)Ljava/util/stream/LongStream;\" since=\"24\"/>\n\t\t<method name=\"stream([JII)Ljava/util/stream/LongStream;\" since=\"24\"/>\n\t\t<method name=\"stream([Ljava/lang/Object;)Ljava/util/stream/Stream;\" since=\"24\"/>\n\t\t<method name=\"stream([Ljava/lang/Object;II)Ljava/util/stream/Stream;\" since=\"24\"/>\n\t\t<method name=\"toString([B)Ljava/lang/String;\"/>\n\t\t<method name=\"toString([C)Ljava/lang/String;\"/>\n\t\t<method name=\"toString([D)Ljava/lang/String;\"/>\n\t\t<method name=\"toString([F)Ljava/lang/String;\"/>\n\t\t<method name=\"toString([I)Ljava/lang/String;\"/>\n\t\t<method name=\"toString([J)Ljava/lang/String;\"/>\n\t\t<method name=\"toString([Ljava/lang/Object;)Ljava/lang/String;\"/>\n\t\t<method name=\"toString([S)Ljava/lang/String;\"/>\n\t\t<method name=\"toString([Z)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/util/Base64\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getDecoder()Ljava/util/Base64$Decoder;\"/>\n\t\t<method name=\"getEncoder()Ljava/util/Base64$Encoder;\"/>\n\t\t<method name=\"getMimeDecoder()Ljava/util/Base64$Decoder;\"/>\n\t\t<method name=\"getMimeEncoder()Ljava/util/Base64$Encoder;\"/>\n\t\t<method name=\"getMimeEncoder(I[B)Ljava/util/Base64$Encoder;\"/>\n\t\t<method name=\"getUrlDecoder()Ljava/util/Base64$Decoder;\"/>\n\t\t<method name=\"getUrlEncoder()Ljava/util/Base64$Encoder;\"/>\n\t</class>\n\t<class name=\"java/util/Base64$Decoder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"decode(Ljava/lang/String;)[B\"/>\n\t\t<method name=\"decode(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"decode([B)[B\"/>\n\t\t<method name=\"decode([B[B)I\"/>\n\t\t<method name=\"wrap(Ljava/io/InputStream;)Ljava/io/InputStream;\"/>\n\t</class>\n\t<class name=\"java/util/Base64$Encoder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"encode(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;\"/>\n\t\t<method name=\"encode([B)[B\"/>\n\t\t<method name=\"encode([B[B)I\"/>\n\t\t<method name=\"encodeToString([B)Ljava/lang/String;\"/>\n\t\t<method name=\"withoutPadding()Ljava/util/Base64$Encoder;\"/>\n\t\t<method name=\"wrap(Ljava/io/OutputStream;)Ljava/io/OutputStream;\"/>\n\t</class>\n\t<class name=\"java/util/BitSet\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"and(Ljava/util/BitSet;)V\"/>\n\t\t<method name=\"andNot(Ljava/util/BitSet;)V\"/>\n\t\t<method name=\"cardinality()I\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"clear(I)V\"/>\n\t\t<method name=\"clear(II)V\"/>\n\t\t<method name=\"flip(I)V\"/>\n\t\t<method name=\"flip(II)V\"/>\n\t\t<method name=\"get(I)Z\"/>\n\t\t<method name=\"get(II)Ljava/util/BitSet;\"/>\n\t\t<method name=\"intersects(Ljava/util/BitSet;)Z\"/>\n\t\t<method name=\"isEmpty()Z\"/>\n\t\t<method name=\"length()I\"/>\n\t\t<method name=\"nextClearBit(I)I\"/>\n\t\t<method name=\"nextSetBit(I)I\"/>\n\t\t<method name=\"or(Ljava/util/BitSet;)V\"/>\n\t\t<method name=\"previousClearBit(I)I\" since=\"19\"/>\n\t\t<method name=\"previousSetBit(I)I\" since=\"19\"/>\n\t\t<method name=\"set(I)V\"/>\n\t\t<method name=\"set(II)V\"/>\n\t\t<method name=\"set(IIZ)V\"/>\n\t\t<method name=\"set(IZ)V\"/>\n\t\t<method name=\"size()I\"/>\n\t\t<method name=\"stream()Ljava/util/stream/IntStream;\" since=\"24\"/>\n\t\t<method name=\"toByteArray()[B\" since=\"19\"/>\n\t\t<method name=\"toLongArray()[J\" since=\"19\"/>\n\t\t<method name=\"valueOf(Ljava/nio/ByteBuffer;)Ljava/util/BitSet;\" since=\"19\"/>\n\t\t<method name=\"valueOf(Ljava/nio/LongBuffer;)Ljava/util/BitSet;\" since=\"19\"/>\n\t\t<method name=\"valueOf([B)Ljava/util/BitSet;\" since=\"19\"/>\n\t\t<method name=\"valueOf([J)Ljava/util/BitSet;\" since=\"19\"/>\n\t\t<method name=\"xor(Ljava/util/BitSet;)V\"/>\n\t</class>\n\t<class name=\"java/util/Calendar\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/TimeZone;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"add(II)V\"/>\n\t\t<method name=\"after(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"before(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"clear(I)V\"/>\n\t\t<method name=\"compareTo(Ljava/util/Calendar;)I\"/>\n\t\t<method name=\"complete()V\"/>\n\t\t<method name=\"computeFields()V\"/>\n\t\t<method name=\"computeTime()V\"/>\n\t\t<method name=\"get(I)I\"/>\n\t\t<method name=\"getActualMaximum(I)I\"/>\n\t\t<method name=\"getActualMinimum(I)I\"/>\n\t\t<method name=\"getAvailableCalendarTypes()Ljava/util/Set;\" since=\"26\"/>\n\t\t<method name=\"getAvailableLocales()[Ljava/util/Locale;\"/>\n\t\t<method name=\"getCalendarType()Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getDisplayName(IILjava/util/Locale;)Ljava/lang/String;\" since=\"9\"/>\n\t\t<method name=\"getDisplayNames(IILjava/util/Locale;)Ljava/util/Map;\" since=\"9\"/>\n\t\t<method name=\"getFirstDayOfWeek()I\"/>\n\t\t<method name=\"getGreatestMinimum(I)I\"/>\n\t\t<method name=\"getInstance()Ljava/util/Calendar;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Ljava/util/Calendar;\"/>\n\t\t<method name=\"getInstance(Ljava/util/TimeZone;)Ljava/util/Calendar;\"/>\n\t\t<method name=\"getInstance(Ljava/util/TimeZone;Ljava/util/Locale;)Ljava/util/Calendar;\"/>\n\t\t<method name=\"getLeastMaximum(I)I\"/>\n\t\t<method name=\"getMaximum(I)I\"/>\n\t\t<method name=\"getMinimalDaysInFirstWeek()I\"/>\n\t\t<method name=\"getMinimum(I)I\"/>\n\t\t<method name=\"getTime()Ljava/util/Date;\"/>\n\t\t<method name=\"getTimeInMillis()J\"/>\n\t\t<method name=\"getTimeZone()Ljava/util/TimeZone;\"/>\n\t\t<method name=\"getWeekYear()I\" since=\"24\"/>\n\t\t<method name=\"getWeeksInWeekYear()I\" since=\"24\"/>\n\t\t<method name=\"internalGet(I)I\"/>\n\t\t<method name=\"isLenient()Z\"/>\n\t\t<method name=\"isSet(I)Z\"/>\n\t\t<method name=\"isWeekDateSupported()Z\" since=\"24\"/>\n\t\t<method name=\"roll(II)V\"/>\n\t\t<method name=\"roll(IZ)V\"/>\n\t\t<method name=\"set(II)V\"/>\n\t\t<method name=\"set(III)V\"/>\n\t\t<method name=\"set(IIIII)V\"/>\n\t\t<method name=\"set(IIIIII)V\"/>\n\t\t<method name=\"setFirstDayOfWeek(I)V\"/>\n\t\t<method name=\"setLenient(Z)V\"/>\n\t\t<method name=\"setMinimalDaysInFirstWeek(I)V\"/>\n\t\t<method name=\"setTime(Ljava/util/Date;)V\"/>\n\t\t<method name=\"setTimeInMillis(J)V\"/>\n\t\t<method name=\"setTimeZone(Ljava/util/TimeZone;)V\"/>\n\t\t<method name=\"setWeekDate(III)V\" since=\"24\"/>\n\t\t<method name=\"toInstant()Ljava/time/Instant;\" since=\"26\"/>\n\t\t<field name=\"ALL_STYLES\" since=\"9\"/>\n\t\t<field name=\"AM\"/>\n\t\t<field name=\"AM_PM\"/>\n\t\t<field name=\"APRIL\"/>\n\t\t<field name=\"AUGUST\"/>\n\t\t<field name=\"DATE\"/>\n\t\t<field name=\"DAY_OF_MONTH\"/>\n\t\t<field name=\"DAY_OF_WEEK\"/>\n\t\t<field name=\"DAY_OF_WEEK_IN_MONTH\"/>\n\t\t<field name=\"DAY_OF_YEAR\"/>\n\t\t<field name=\"DECEMBER\"/>\n\t\t<field name=\"DST_OFFSET\"/>\n\t\t<field name=\"ERA\"/>\n\t\t<field name=\"FEBRUARY\"/>\n\t\t<field name=\"FIELD_COUNT\"/>\n\t\t<field name=\"FRIDAY\"/>\n\t\t<field name=\"HOUR\"/>\n\t\t<field name=\"HOUR_OF_DAY\"/>\n\t\t<field name=\"JANUARY\"/>\n\t\t<field name=\"JULY\"/>\n\t\t<field name=\"JUNE\"/>\n\t\t<field name=\"LONG\" since=\"9\"/>\n\t\t<field name=\"LONG_FORMAT\" since=\"26\"/>\n\t\t<field name=\"LONG_STANDALONE\" since=\"26\"/>\n\t\t<field name=\"MARCH\"/>\n\t\t<field name=\"MAY\"/>\n\t\t<field name=\"MILLISECOND\"/>\n\t\t<field name=\"MINUTE\"/>\n\t\t<field name=\"MONDAY\"/>\n\t\t<field name=\"MONTH\"/>\n\t\t<field name=\"NARROW_FORMAT\" since=\"26\"/>\n\t\t<field name=\"NARROW_STANDALONE\" since=\"26\"/>\n\t\t<field name=\"NOVEMBER\"/>\n\t\t<field name=\"OCTOBER\"/>\n\t\t<field name=\"PM\"/>\n\t\t<field name=\"SATURDAY\"/>\n\t\t<field name=\"SECOND\"/>\n\t\t<field name=\"SEPTEMBER\"/>\n\t\t<field name=\"SHORT\" since=\"9\"/>\n\t\t<field name=\"SHORT_FORMAT\" since=\"26\"/>\n\t\t<field name=\"SHORT_STANDALONE\" since=\"26\"/>\n\t\t<field name=\"SUNDAY\"/>\n\t\t<field name=\"THURSDAY\"/>\n\t\t<field name=\"TUESDAY\"/>\n\t\t<field name=\"UNDECIMBER\"/>\n\t\t<field name=\"WEDNESDAY\"/>\n\t\t<field name=\"WEEK_OF_MONTH\"/>\n\t\t<field name=\"WEEK_OF_YEAR\"/>\n\t\t<field name=\"YEAR\"/>\n\t\t<field name=\"ZONE_OFFSET\"/>\n\t\t<field name=\"areFieldsSet\"/>\n\t\t<field name=\"fields\"/>\n\t\t<field name=\"isSet\"/>\n\t\t<field name=\"isTimeSet\"/>\n\t\t<field name=\"time\"/>\n\t</class>\n\t<class name=\"java/util/Calendar$Builder\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"build()Ljava/util/Calendar;\"/>\n\t\t<method name=\"set(II)Ljava/util/Calendar$Builder;\"/>\n\t\t<method name=\"setCalendarType(Ljava/lang/String;)Ljava/util/Calendar$Builder;\"/>\n\t\t<method name=\"setDate(III)Ljava/util/Calendar$Builder;\"/>\n\t\t<method name=\"setFields([I)Ljava/util/Calendar$Builder;\"/>\n\t\t<method name=\"setInstant(J)Ljava/util/Calendar$Builder;\"/>\n\t\t<method name=\"setInstant(Ljava/util/Date;)Ljava/util/Calendar$Builder;\"/>\n\t\t<method name=\"setLenient(Z)Ljava/util/Calendar$Builder;\"/>\n\t\t<method name=\"setLocale(Ljava/util/Locale;)Ljava/util/Calendar$Builder;\"/>\n\t\t<method name=\"setTimeOfDay(III)Ljava/util/Calendar$Builder;\"/>\n\t\t<method name=\"setTimeOfDay(IIII)Ljava/util/Calendar$Builder;\"/>\n\t\t<method name=\"setTimeZone(Ljava/util/TimeZone;)Ljava/util/Calendar$Builder;\"/>\n\t\t<method name=\"setWeekDate(III)Ljava/util/Calendar$Builder;\"/>\n\t\t<method name=\"setWeekDefinition(II)Ljava/util/Calendar$Builder;\"/>\n\t</class>\n\t<class name=\"java/util/Collection\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Iterable\"/>\n\t\t<method name=\"add(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"addAll(Ljava/util/Collection;)Z\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"contains(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"containsAll(Ljava/util/Collection;)Z\"/>\n\t\t<method name=\"isEmpty()Z\"/>\n\t\t<method name=\"parallelStream()Ljava/util/stream/Stream;\" since=\"24\"/>\n\t\t<method name=\"remove(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"removeAll(Ljava/util/Collection;)Z\"/>\n\t\t<method name=\"removeIf(Ljava/util/function/Predicate;)Z\" since=\"24\"/>\n\t\t<method name=\"retainAll(Ljava/util/Collection;)Z\"/>\n\t\t<method name=\"size()I\"/>\n\t\t<method name=\"stream()Ljava/util/stream/Stream;\" since=\"24\"/>\n\t\t<method name=\"toArray()[Ljava/lang/Object;\"/>\n\t\t<method name=\"toArray([Ljava/lang/Object;)[Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/util/Collections\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addAll(Ljava/util/Collection;[Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"asLifoQueue(Ljava/util/Deque;)Ljava/util/Queue;\" since=\"9\"/>\n\t\t<method name=\"binarySearch(Ljava/util/List;Ljava/lang/Object;)I\"/>\n\t\t<method name=\"binarySearch(Ljava/util/List;Ljava/lang/Object;Ljava/util/Comparator;)I\"/>\n\t\t<method name=\"checkedCollection(Ljava/util/Collection;Ljava/lang/Class;)Ljava/util/Collection;\"/>\n\t\t<method name=\"checkedList(Ljava/util/List;Ljava/lang/Class;)Ljava/util/List;\"/>\n\t\t<method name=\"checkedMap(Ljava/util/Map;Ljava/lang/Class;Ljava/lang/Class;)Ljava/util/Map;\"/>\n\t\t<method name=\"checkedNavigableMap(Ljava/util/NavigableMap;Ljava/lang/Class;Ljava/lang/Class;)Ljava/util/NavigableMap;\" since=\"26\"/>\n\t\t<method name=\"checkedNavigableSet(Ljava/util/NavigableSet;Ljava/lang/Class;)Ljava/util/NavigableSet;\" since=\"26\"/>\n\t\t<method name=\"checkedQueue(Ljava/util/Queue;Ljava/lang/Class;)Ljava/util/Queue;\" since=\"26\"/>\n\t\t<method name=\"checkedSet(Ljava/util/Set;Ljava/lang/Class;)Ljava/util/Set;\"/>\n\t\t<method name=\"checkedSortedMap(Ljava/util/SortedMap;Ljava/lang/Class;Ljava/lang/Class;)Ljava/util/SortedMap;\"/>\n\t\t<method name=\"checkedSortedSet(Ljava/util/SortedSet;Ljava/lang/Class;)Ljava/util/SortedSet;\"/>\n\t\t<method name=\"copy(Ljava/util/List;Ljava/util/List;)V\"/>\n\t\t<method name=\"disjoint(Ljava/util/Collection;Ljava/util/Collection;)Z\"/>\n\t\t<method name=\"emptyEnumeration()Ljava/util/Enumeration;\" since=\"19\"/>\n\t\t<method name=\"emptyIterator()Ljava/util/Iterator;\" since=\"19\"/>\n\t\t<method name=\"emptyList()Ljava/util/List;\"/>\n\t\t<method name=\"emptyListIterator()Ljava/util/ListIterator;\" since=\"19\"/>\n\t\t<method name=\"emptyMap()Ljava/util/Map;\"/>\n\t\t<method name=\"emptyNavigableMap()Ljava/util/NavigableMap;\" since=\"26\"/>\n\t\t<method name=\"emptyNavigableSet()Ljava/util/NavigableSet;\" since=\"26\"/>\n\t\t<method name=\"emptySet()Ljava/util/Set;\"/>\n\t\t<method name=\"emptySortedMap()Ljava/util/SortedMap;\" since=\"26\"/>\n\t\t<method name=\"emptySortedSet()Ljava/util/SortedSet;\" since=\"26\"/>\n\t\t<method name=\"enumeration(Ljava/util/Collection;)Ljava/util/Enumeration;\"/>\n\t\t<method name=\"fill(Ljava/util/List;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"frequency(Ljava/util/Collection;Ljava/lang/Object;)I\"/>\n\t\t<method name=\"indexOfSubList(Ljava/util/List;Ljava/util/List;)I\"/>\n\t\t<method name=\"lastIndexOfSubList(Ljava/util/List;Ljava/util/List;)I\"/>\n\t\t<method name=\"list(Ljava/util/Enumeration;)Ljava/util/ArrayList;\"/>\n\t\t<method name=\"max(Ljava/util/Collection;)Ljava/lang/Object;\"/>\n\t\t<method name=\"max(Ljava/util/Collection;Ljava/util/Comparator;)Ljava/lang/Object;\"/>\n\t\t<method name=\"min(Ljava/util/Collection;)Ljava/lang/Object;\"/>\n\t\t<method name=\"min(Ljava/util/Collection;Ljava/util/Comparator;)Ljava/lang/Object;\"/>\n\t\t<method name=\"nCopies(ILjava/lang/Object;)Ljava/util/List;\"/>\n\t\t<method name=\"newSetFromMap(Ljava/util/Map;)Ljava/util/Set;\" since=\"9\"/>\n\t\t<method name=\"replaceAll(Ljava/util/List;Ljava/lang/Object;Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"reverse(Ljava/util/List;)V\"/>\n\t\t<method name=\"reverseOrder()Ljava/util/Comparator;\"/>\n\t\t<method name=\"reverseOrder(Ljava/util/Comparator;)Ljava/util/Comparator;\"/>\n\t\t<method name=\"rotate(Ljava/util/List;I)V\"/>\n\t\t<method name=\"shuffle(Ljava/util/List;)V\"/>\n\t\t<method name=\"shuffle(Ljava/util/List;Ljava/util/Random;)V\"/>\n\t\t<method name=\"singleton(Ljava/lang/Object;)Ljava/util/Set;\"/>\n\t\t<method name=\"singletonList(Ljava/lang/Object;)Ljava/util/List;\"/>\n\t\t<method name=\"singletonMap(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;\"/>\n\t\t<method name=\"sort(Ljava/util/List;)V\"/>\n\t\t<method name=\"sort(Ljava/util/List;Ljava/util/Comparator;)V\"/>\n\t\t<method name=\"swap(Ljava/util/List;II)V\"/>\n\t\t<method name=\"synchronizedCollection(Ljava/util/Collection;)Ljava/util/Collection;\"/>\n\t\t<method name=\"synchronizedList(Ljava/util/List;)Ljava/util/List;\"/>\n\t\t<method name=\"synchronizedMap(Ljava/util/Map;)Ljava/util/Map;\"/>\n\t\t<method name=\"synchronizedNavigableMap(Ljava/util/NavigableMap;)Ljava/util/NavigableMap;\" since=\"26\"/>\n\t\t<method name=\"synchronizedNavigableSet(Ljava/util/NavigableSet;)Ljava/util/NavigableSet;\" since=\"26\"/>\n\t\t<method name=\"synchronizedSet(Ljava/util/Set;)Ljava/util/Set;\"/>\n\t\t<method name=\"synchronizedSortedMap(Ljava/util/SortedMap;)Ljava/util/SortedMap;\"/>\n\t\t<method name=\"synchronizedSortedSet(Ljava/util/SortedSet;)Ljava/util/SortedSet;\"/>\n\t\t<method name=\"unmodifiableCollection(Ljava/util/Collection;)Ljava/util/Collection;\"/>\n\t\t<method name=\"unmodifiableList(Ljava/util/List;)Ljava/util/List;\"/>\n\t\t<method name=\"unmodifiableMap(Ljava/util/Map;)Ljava/util/Map;\"/>\n\t\t<method name=\"unmodifiableNavigableMap(Ljava/util/NavigableMap;)Ljava/util/NavigableMap;\" since=\"26\"/>\n\t\t<method name=\"unmodifiableNavigableSet(Ljava/util/NavigableSet;)Ljava/util/NavigableSet;\" since=\"26\"/>\n\t\t<method name=\"unmodifiableSet(Ljava/util/Set;)Ljava/util/Set;\"/>\n\t\t<method name=\"unmodifiableSortedMap(Ljava/util/SortedMap;)Ljava/util/SortedMap;\"/>\n\t\t<method name=\"unmodifiableSortedSet(Ljava/util/SortedSet;)Ljava/util/SortedSet;\"/>\n\t\t<field name=\"EMPTY_LIST\"/>\n\t\t<field name=\"EMPTY_MAP\"/>\n\t\t<field name=\"EMPTY_SET\"/>\n\t</class>\n\t<class name=\"java/util/Comparator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"compare(Ljava/lang/Object;Ljava/lang/Object;)I\"/>\n\t\t<method name=\"comparing(Ljava/util/function/Function;)Ljava/util/Comparator;\" since=\"24\"/>\n\t\t<method name=\"comparing(Ljava/util/function/Function;Ljava/util/Comparator;)Ljava/util/Comparator;\" since=\"24\"/>\n\t\t<method name=\"comparingDouble(Ljava/util/function/ToDoubleFunction;)Ljava/util/Comparator;\" since=\"24\"/>\n\t\t<method name=\"comparingInt(Ljava/util/function/ToIntFunction;)Ljava/util/Comparator;\" since=\"24\"/>\n\t\t<method name=\"comparingLong(Ljava/util/function/ToLongFunction;)Ljava/util/Comparator;\" since=\"24\"/>\n\t\t<method name=\"naturalOrder()Ljava/util/Comparator;\" since=\"24\"/>\n\t\t<method name=\"nullsFirst(Ljava/util/Comparator;)Ljava/util/Comparator;\" since=\"24\"/>\n\t\t<method name=\"nullsLast(Ljava/util/Comparator;)Ljava/util/Comparator;\" since=\"24\"/>\n\t\t<method name=\"reverseOrder()Ljava/util/Comparator;\" since=\"24\"/>\n\t\t<method name=\"reversed()Ljava/util/Comparator;\" since=\"24\"/>\n\t\t<method name=\"thenComparing(Ljava/util/Comparator;)Ljava/util/Comparator;\" since=\"24\"/>\n\t\t<method name=\"thenComparing(Ljava/util/function/Function;)Ljava/util/Comparator;\" since=\"24\"/>\n\t\t<method name=\"thenComparing(Ljava/util/function/Function;Ljava/util/Comparator;)Ljava/util/Comparator;\" since=\"24\"/>\n\t\t<method name=\"thenComparingDouble(Ljava/util/function/ToDoubleFunction;)Ljava/util/Comparator;\" since=\"24\"/>\n\t\t<method name=\"thenComparingInt(Ljava/util/function/ToIntFunction;)Ljava/util/Comparator;\" since=\"24\"/>\n\t\t<method name=\"thenComparingLong(Ljava/util/function/ToLongFunction;)Ljava/util/Comparator;\" since=\"24\"/>\n\t</class>\n\t<class name=\"java/util/ConcurrentModificationException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\" since=\"19\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\" since=\"19\"/>\n\t</class>\n\t<class name=\"java/util/Currency\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"getAvailableCurrencies()Ljava/util/Set;\" since=\"19\"/>\n\t\t<method name=\"getCurrencyCode()Ljava/lang/String;\"/>\n\t\t<method name=\"getDefaultFractionDigits()I\"/>\n\t\t<method name=\"getDisplayName()Ljava/lang/String;\" since=\"19\"/>\n\t\t<method name=\"getDisplayName(Ljava/util/Locale;)Ljava/lang/String;\" since=\"19\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Ljava/util/Currency;\"/>\n\t\t<method name=\"getInstance(Ljava/util/Locale;)Ljava/util/Currency;\"/>\n\t\t<method name=\"getNumericCode()I\" since=\"24\"/>\n\t\t<method name=\"getSymbol()Ljava/lang/String;\"/>\n\t\t<method name=\"getSymbol(Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/util/Date\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(III)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(IIIII)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(IIIIII)V\" deprecated=\"15\"/>\n\t\t<method name=\"&lt;init>(J)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" deprecated=\"15\"/>\n\t\t<method name=\"UTC(IIIIII)J\" deprecated=\"15\"/>\n\t\t<method name=\"after(Ljava/util/Date;)Z\"/>\n\t\t<method name=\"before(Ljava/util/Date;)Z\"/>\n\t\t<method name=\"compareTo(Ljava/util/Date;)I\"/>\n\t\t<method name=\"from(Ljava/time/Instant;)Ljava/util/Date;\" since=\"26\"/>\n\t\t<method name=\"getDate()I\" deprecated=\"15\"/>\n\t\t<method name=\"getDay()I\" deprecated=\"15\"/>\n\t\t<method name=\"getHours()I\" deprecated=\"15\"/>\n\t\t<method name=\"getMinutes()I\" deprecated=\"15\"/>\n\t\t<method name=\"getMonth()I\" deprecated=\"15\"/>\n\t\t<method name=\"getSeconds()I\" deprecated=\"15\"/>\n\t\t<method name=\"getTime()J\"/>\n\t\t<method name=\"getTimezoneOffset()I\" deprecated=\"15\"/>\n\t\t<method name=\"getYear()I\" deprecated=\"15\"/>\n\t\t<method name=\"parse(Ljava/lang/String;)J\" deprecated=\"15\"/>\n\t\t<method name=\"setDate(I)V\" deprecated=\"15\"/>\n\t\t<method name=\"setHours(I)V\" deprecated=\"15\"/>\n\t\t<method name=\"setMinutes(I)V\" deprecated=\"15\"/>\n\t\t<method name=\"setMonth(I)V\" deprecated=\"15\"/>\n\t\t<method name=\"setSeconds(I)V\" deprecated=\"15\"/>\n\t\t<method name=\"setTime(J)V\"/>\n\t\t<method name=\"setYear(I)V\" deprecated=\"15\"/>\n\t\t<method name=\"toGMTString()Ljava/lang/String;\" deprecated=\"15\"/>\n\t\t<method name=\"toInstant()Ljava/time/Instant;\" since=\"26\"/>\n\t\t<method name=\"toLocaleString()Ljava/lang/String;\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"java/util/Deque\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Queue\"/>\n\t\t<method name=\"addFirst(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"addLast(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"descendingIterator()Ljava/util/Iterator;\"/>\n\t\t<method name=\"getFirst()Ljava/lang/Object;\"/>\n\t\t<method name=\"getLast()Ljava/lang/Object;\"/>\n\t\t<method name=\"offerFirst(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"offerLast(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"peekFirst()Ljava/lang/Object;\"/>\n\t\t<method name=\"peekLast()Ljava/lang/Object;\"/>\n\t\t<method name=\"pollFirst()Ljava/lang/Object;\"/>\n\t\t<method name=\"pollLast()Ljava/lang/Object;\"/>\n\t\t<method name=\"pop()Ljava/lang/Object;\"/>\n\t\t<method name=\"push(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"removeFirst()Ljava/lang/Object;\"/>\n\t\t<method name=\"removeFirstOccurrence(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"removeLast()Ljava/lang/Object;\"/>\n\t\t<method name=\"removeLastOccurrence(Ljava/lang/Object;)Z\"/>\n\t</class>\n\t<class name=\"java/util/Dictionary\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"elements()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"get(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"isEmpty()Z\"/>\n\t\t<method name=\"keys()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"remove(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"size()I\"/>\n\t</class>\n\t<class name=\"java/util/DoubleSummaryStatistics\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/function/DoubleConsumer\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"combine(Ljava/util/DoubleSummaryStatistics;)V\"/>\n\t\t<method name=\"getAverage()D\"/>\n\t\t<method name=\"getCount()J\"/>\n\t\t<method name=\"getMax()D\"/>\n\t\t<method name=\"getMin()D\"/>\n\t\t<method name=\"getSum()D\"/>\n\t</class>\n\t<class name=\"java/util/DuplicateFormatFlagsException\" since=\"1\">\n\t\t<extends name=\"java/util/IllegalFormatException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getFlags()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/util/EmptyStackException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/util/EnumMap\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractMap\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Class;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/EnumMap;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Map;)V\"/>\n\t\t<method name=\"clone()Ljava/util/EnumMap;\"/>\n\t\t<method name=\"put(Ljava/lang/Enum;Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/util/EnumSet\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractSet\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"allOf(Ljava/lang/Class;)Ljava/util/EnumSet;\"/>\n\t\t<method name=\"clone()Ljava/util/EnumSet;\"/>\n\t\t<method name=\"complementOf(Ljava/util/EnumSet;)Ljava/util/EnumSet;\"/>\n\t\t<method name=\"copyOf(Ljava/util/Collection;)Ljava/util/EnumSet;\"/>\n\t\t<method name=\"copyOf(Ljava/util/EnumSet;)Ljava/util/EnumSet;\"/>\n\t\t<method name=\"noneOf(Ljava/lang/Class;)Ljava/util/EnumSet;\"/>\n\t\t<method name=\"of(Ljava/lang/Enum;)Ljava/util/EnumSet;\"/>\n\t\t<method name=\"of(Ljava/lang/Enum;Ljava/lang/Enum;)Ljava/util/EnumSet;\"/>\n\t\t<method name=\"of(Ljava/lang/Enum;Ljava/lang/Enum;Ljava/lang/Enum;)Ljava/util/EnumSet;\"/>\n\t\t<method name=\"of(Ljava/lang/Enum;Ljava/lang/Enum;Ljava/lang/Enum;Ljava/lang/Enum;)Ljava/util/EnumSet;\"/>\n\t\t<method name=\"of(Ljava/lang/Enum;Ljava/lang/Enum;Ljava/lang/Enum;Ljava/lang/Enum;Ljava/lang/Enum;)Ljava/util/EnumSet;\"/>\n\t\t<method name=\"of(Ljava/lang/Enum;[Ljava/lang/Enum;)Ljava/util/EnumSet;\"/>\n\t\t<method name=\"range(Ljava/lang/Enum;Ljava/lang/Enum;)Ljava/util/EnumSet;\"/>\n\t</class>\n\t<class name=\"java/util/Enumeration\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"hasMoreElements()Z\"/>\n\t\t<method name=\"nextElement()Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/util/EventListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"java/util/EventListenerProxy\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/EventListener\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/EventListener;)V\"/>\n\t\t<method name=\"getListener()Ljava/util/EventListener;\"/>\n\t</class>\n\t<class name=\"java/util/EventObject\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"getSource()Ljava/lang/Object;\"/>\n\t\t<field name=\"source\"/>\n\t</class>\n\t<class name=\"java/util/FormatFlagsConversionMismatchException\" since=\"1\">\n\t\t<extends name=\"java/util/IllegalFormatException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;C)V\"/>\n\t\t<method name=\"getConversion()C\"/>\n\t\t<method name=\"getFlags()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/util/Formattable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"formatTo(Ljava/util/Formatter;III)V\"/>\n\t</class>\n\t<class name=\"java/util/FormattableFlags\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ALTERNATE\"/>\n\t\t<field name=\"LEFT_JUSTIFY\"/>\n\t\t<field name=\"UPPERCASE\"/>\n\t</class>\n\t<class name=\"java/util/Formatter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\"/>\n\t\t<implements name=\"java/io/Flushable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;Ljava/lang/String;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;Ljava/lang/String;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/PrintStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Appendable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Appendable;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/util/Formatter;\"/>\n\t\t<method name=\"format(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/util/Formatter;\"/>\n\t\t<method name=\"ioException()Ljava/io/IOException;\"/>\n\t\t<method name=\"locale()Ljava/util/Locale;\"/>\n\t\t<method name=\"out()Ljava/lang/Appendable;\"/>\n\t</class>\n\t<class name=\"java/util/Formatter$BigDecimalLayoutForm\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/util/Formatter$BigDecimalLayoutForm;\"/>\n\t\t<method name=\"values()[Ljava/util/Formatter$BigDecimalLayoutForm;\"/>\n\t\t<field name=\"DECIMAL_FLOAT\"/>\n\t\t<field name=\"SCIENTIFIC\"/>\n\t</class>\n\t<class name=\"java/util/FormatterClosedException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/util/GregorianCalendar\" since=\"1\">\n\t\t<extends name=\"java/util/Calendar\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"&lt;init>(IIIII)V\"/>\n\t\t<method name=\"&lt;init>(IIIIII)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/TimeZone;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/TimeZone;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"from(Ljava/time/ZonedDateTime;)Ljava/util/GregorianCalendar;\" since=\"26\"/>\n\t\t<method name=\"getGregorianChange()Ljava/util/Date;\"/>\n\t\t<method name=\"isLeapYear(I)Z\"/>\n\t\t<method name=\"setGregorianChange(Ljava/util/Date;)V\"/>\n\t\t<method name=\"toZonedDateTime()Ljava/time/ZonedDateTime;\" since=\"26\"/>\n\t\t<field name=\"AD\"/>\n\t\t<field name=\"BC\"/>\n\t</class>\n\t<class name=\"java/util/HashMap\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractMap\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(IF)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Map;)V\"/>\n\t</class>\n\t<class name=\"java/util/HashSet\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractSet\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(IF)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Collection;)V\"/>\n\t</class>\n\t<class name=\"java/util/Hashtable\" since=\"1\">\n\t\t<extends name=\"java/util/Dictionary\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"java/util/Map\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(IF)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Map;)V\"/>\n\t\t<method name=\"contains(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"rehash()V\"/>\n\t</class>\n\t<class name=\"java/util/IdentityHashMap\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractMap\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Map;)V\"/>\n\t</class>\n\t<class name=\"java/util/IllegalFormatCodePointException\" since=\"1\">\n\t\t<extends name=\"java/util/IllegalFormatException\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"getCodePoint()I\"/>\n\t</class>\n\t<class name=\"java/util/IllegalFormatConversionException\" since=\"1\">\n\t\t<extends name=\"java/util/IllegalFormatException\"/>\n\t\t<method name=\"&lt;init>(CLjava/lang/Class;)V\"/>\n\t\t<method name=\"getArgumentClass()Ljava/lang/Class;\"/>\n\t\t<method name=\"getConversion()C\"/>\n\t</class>\n\t<class name=\"java/util/IllegalFormatException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalArgumentException\"/>\n\t</class>\n\t<class name=\"java/util/IllegalFormatFlagsException\" since=\"1\">\n\t\t<extends name=\"java/util/IllegalFormatException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getFlags()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/util/IllegalFormatPrecisionException\" since=\"1\">\n\t\t<extends name=\"java/util/IllegalFormatException\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"getPrecision()I\"/>\n\t</class>\n\t<class name=\"java/util/IllegalFormatWidthException\" since=\"1\">\n\t\t<extends name=\"java/util/IllegalFormatException\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"getWidth()I\"/>\n\t</class>\n\t<class name=\"java/util/IllformedLocaleException\" since=\"21\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"getErrorIndex()I\"/>\n\t</class>\n\t<class name=\"java/util/InputMismatchException\" since=\"1\">\n\t\t<extends name=\"java/util/NoSuchElementException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/util/IntSummaryStatistics\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/function/IntConsumer\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"combine(Ljava/util/IntSummaryStatistics;)V\"/>\n\t\t<method name=\"getAverage()D\"/>\n\t\t<method name=\"getCount()J\"/>\n\t\t<method name=\"getMax()I\"/>\n\t\t<method name=\"getMin()I\"/>\n\t\t<method name=\"getSum()J\"/>\n\t</class>\n\t<class name=\"java/util/InvalidPropertiesFormatException\" since=\"1\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/util/Iterator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"forEachRemaining(Ljava/util/function/Consumer;)V\" since=\"24\"/>\n\t\t<method name=\"hasNext()Z\"/>\n\t\t<method name=\"next()Ljava/lang/Object;\"/>\n\t\t<method name=\"remove()V\"/>\n\t</class>\n\t<class name=\"java/util/LinkedHashMap\" since=\"1\">\n\t\t<extends name=\"java/util/HashMap\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(IF)V\"/>\n\t\t<method name=\"&lt;init>(IFZ)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Map;)V\"/>\n\t\t<method name=\"removeEldestEntry(Ljava/util/Map$Entry;)Z\"/>\n\t</class>\n\t<class name=\"java/util/LinkedHashSet\" since=\"1\">\n\t\t<extends name=\"java/util/HashSet\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(IF)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Collection;)V\"/>\n\t</class>\n\t<class name=\"java/util/LinkedList\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractSequentialList\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"java/util/Deque\" since=\"9\"/>\n\t\t<implements name=\"java/util/Queue\" removed=\"24\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Collection;)V\"/>\n\t\t<method name=\"addFirst(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"addLast(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"getFirst()Ljava/lang/Object;\"/>\n\t\t<method name=\"getLast()Ljava/lang/Object;\"/>\n\t\t<method name=\"removeFirst()Ljava/lang/Object;\"/>\n\t\t<method name=\"removeLast()Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/util/List\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Collection\"/>\n\t\t<method name=\"add(ILjava/lang/Object;)V\"/>\n\t\t<method name=\"addAll(ILjava/util/Collection;)Z\"/>\n\t\t<method name=\"get(I)Ljava/lang/Object;\"/>\n\t\t<method name=\"indexOf(Ljava/lang/Object;)I\"/>\n\t\t<method name=\"lastIndexOf(Ljava/lang/Object;)I\"/>\n\t\t<method name=\"listIterator()Ljava/util/ListIterator;\"/>\n\t\t<method name=\"listIterator(I)Ljava/util/ListIterator;\"/>\n\t\t<method name=\"of()Ljava/util/List;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;)Ljava/util/List;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;\" since=\"30\"/>\n\t\t<method name=\"of([Ljava/lang/Object;)Ljava/util/List;\" since=\"30\"/>\n\t\t<method name=\"remove(I)Ljava/lang/Object;\"/>\n\t\t<method name=\"replaceAll(Ljava/util/function/UnaryOperator;)V\" since=\"24\"/>\n\t\t<method name=\"set(ILjava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"sort(Ljava/util/Comparator;)V\" since=\"24\"/>\n\t\t<method name=\"subList(II)Ljava/util/List;\"/>\n\t</class>\n\t<class name=\"java/util/ListIterator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Iterator\"/>\n\t\t<method name=\"add(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"hasPrevious()Z\"/>\n\t\t<method name=\"nextIndex()I\"/>\n\t\t<method name=\"previous()Ljava/lang/Object;\"/>\n\t\t<method name=\"previousIndex()I\"/>\n\t\t<method name=\"set(Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"java/util/ListResourceBundle\" since=\"1\">\n\t\t<extends name=\"java/util/ResourceBundle\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getContents()[[Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/util/Locale\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"filter(Ljava/util/List;Ljava/util/Collection;)Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"filter(Ljava/util/List;Ljava/util/Collection;Ljava/util/Locale$FilteringMode;)Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"filterTags(Ljava/util/List;Ljava/util/Collection;)Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"filterTags(Ljava/util/List;Ljava/util/Collection;Ljava/util/Locale$FilteringMode;)Ljava/util/List;\" since=\"26\"/>\n\t\t<method name=\"forLanguageTag(Ljava/lang/String;)Ljava/util/Locale;\" since=\"21\"/>\n\t\t<method name=\"getAvailableLocales()[Ljava/util/Locale;\"/>\n\t\t<method name=\"getCountry()Ljava/lang/String;\"/>\n\t\t<method name=\"getDefault()Ljava/util/Locale;\"/>\n\t\t<method name=\"getDefault(Ljava/util/Locale$Category;)Ljava/util/Locale;\" since=\"24\"/>\n\t\t<method name=\"getDisplayCountry()Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayCountry(Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayLanguage()Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayLanguage(Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName()Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName(Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayScript()Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"getDisplayScript(Ljava/util/Locale;)Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"getDisplayVariant()Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayVariant(Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getExtension(C)Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"getExtensionKeys()Ljava/util/Set;\" since=\"21\"/>\n\t\t<method name=\"getISO3Country()Ljava/lang/String;\"/>\n\t\t<method name=\"getISO3Language()Ljava/lang/String;\"/>\n\t\t<method name=\"getISOCountries()[Ljava/lang/String;\"/>\n\t\t<method name=\"getISOLanguages()[Ljava/lang/String;\"/>\n\t\t<method name=\"getLanguage()Ljava/lang/String;\"/>\n\t\t<method name=\"getScript()Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"getUnicodeLocaleAttributes()Ljava/util/Set;\" since=\"21\"/>\n\t\t<method name=\"getUnicodeLocaleKeys()Ljava/util/Set;\" since=\"21\"/>\n\t\t<method name=\"getUnicodeLocaleType(Ljava/lang/String;)Ljava/lang/String;\" since=\"21\"/>\n\t\t<method name=\"getVariant()Ljava/lang/String;\"/>\n\t\t<method name=\"hasExtensions()Z\" since=\"26\"/>\n\t\t<method name=\"lookup(Ljava/util/List;Ljava/util/Collection;)Ljava/util/Locale;\" since=\"26\"/>\n\t\t<method name=\"lookupTag(Ljava/util/List;Ljava/util/Collection;)Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"setDefault(Ljava/util/Locale$Category;Ljava/util/Locale;)V\" since=\"24\"/>\n\t\t<method name=\"setDefault(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"stripExtensions()Ljava/util/Locale;\" since=\"26\"/>\n\t\t<method name=\"toLanguageTag()Ljava/lang/String;\" since=\"21\"/>\n\t\t<field name=\"CANADA\"/>\n\t\t<field name=\"CANADA_FRENCH\"/>\n\t\t<field name=\"CHINA\"/>\n\t\t<field name=\"CHINESE\"/>\n\t\t<field name=\"ENGLISH\"/>\n\t\t<field name=\"FRANCE\"/>\n\t\t<field name=\"FRENCH\"/>\n\t\t<field name=\"GERMAN\"/>\n\t\t<field name=\"GERMANY\"/>\n\t\t<field name=\"ITALIAN\"/>\n\t\t<field name=\"ITALY\"/>\n\t\t<field name=\"JAPAN\"/>\n\t\t<field name=\"JAPANESE\"/>\n\t\t<field name=\"KOREA\"/>\n\t\t<field name=\"KOREAN\"/>\n\t\t<field name=\"PRC\"/>\n\t\t<field name=\"PRIVATE_USE_EXTENSION\" since=\"21\"/>\n\t\t<field name=\"ROOT\" since=\"9\"/>\n\t\t<field name=\"SIMPLIFIED_CHINESE\"/>\n\t\t<field name=\"TAIWAN\"/>\n\t\t<field name=\"TRADITIONAL_CHINESE\"/>\n\t\t<field name=\"UK\"/>\n\t\t<field name=\"UNICODE_LOCALE_EXTENSION\" since=\"21\"/>\n\t\t<field name=\"US\"/>\n\t</class>\n\t<class name=\"java/util/Locale$Builder\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addUnicodeLocaleAttribute(Ljava/lang/String;)Ljava/util/Locale$Builder;\"/>\n\t\t<method name=\"build()Ljava/util/Locale;\"/>\n\t\t<method name=\"clear()Ljava/util/Locale$Builder;\"/>\n\t\t<method name=\"clearExtensions()Ljava/util/Locale$Builder;\"/>\n\t\t<method name=\"removeUnicodeLocaleAttribute(Ljava/lang/String;)Ljava/util/Locale$Builder;\"/>\n\t\t<method name=\"setExtension(CLjava/lang/String;)Ljava/util/Locale$Builder;\"/>\n\t\t<method name=\"setLanguage(Ljava/lang/String;)Ljava/util/Locale$Builder;\"/>\n\t\t<method name=\"setLanguageTag(Ljava/lang/String;)Ljava/util/Locale$Builder;\"/>\n\t\t<method name=\"setLocale(Ljava/util/Locale;)Ljava/util/Locale$Builder;\"/>\n\t\t<method name=\"setRegion(Ljava/lang/String;)Ljava/util/Locale$Builder;\"/>\n\t\t<method name=\"setScript(Ljava/lang/String;)Ljava/util/Locale$Builder;\"/>\n\t\t<method name=\"setUnicodeLocaleKeyword(Ljava/lang/String;Ljava/lang/String;)Ljava/util/Locale$Builder;\"/>\n\t\t<method name=\"setVariant(Ljava/lang/String;)Ljava/util/Locale$Builder;\"/>\n\t</class>\n\t<class name=\"java/util/Locale$Category\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/util/Locale$Category;\"/>\n\t\t<method name=\"values()[Ljava/util/Locale$Category;\"/>\n\t\t<field name=\"DISPLAY\"/>\n\t\t<field name=\"FORMAT\"/>\n\t</class>\n\t<class name=\"java/util/Locale$FilteringMode\" since=\"26\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/util/Locale$FilteringMode;\"/>\n\t\t<method name=\"values()[Ljava/util/Locale$FilteringMode;\"/>\n\t\t<field name=\"AUTOSELECT_FILTERING\"/>\n\t\t<field name=\"EXTENDED_FILTERING\"/>\n\t\t<field name=\"IGNORE_EXTENDED_RANGES\"/>\n\t\t<field name=\"MAP_EXTENDED_RANGES\"/>\n\t\t<field name=\"REJECT_EXTENDED_RANGES\"/>\n\t</class>\n\t<class name=\"java/util/Locale$LanguageRange\" since=\"26\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;D)V\"/>\n\t\t<method name=\"getRange()Ljava/lang/String;\"/>\n\t\t<method name=\"getWeight()D\"/>\n\t\t<method name=\"mapEquivalents(Ljava/util/List;Ljava/util/Map;)Ljava/util/List;\"/>\n\t\t<method name=\"parse(Ljava/lang/String;)Ljava/util/List;\"/>\n\t\t<method name=\"parse(Ljava/lang/String;Ljava/util/Map;)Ljava/util/List;\"/>\n\t\t<field name=\"MAX_WEIGHT\"/>\n\t\t<field name=\"MIN_WEIGHT\"/>\n\t</class>\n\t<class name=\"java/util/LongSummaryStatistics\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/function/IntConsumer\"/>\n\t\t<implements name=\"java/util/function/LongConsumer\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"combine(Ljava/util/LongSummaryStatistics;)V\"/>\n\t\t<method name=\"getAverage()D\"/>\n\t\t<method name=\"getCount()J\"/>\n\t\t<method name=\"getMax()J\"/>\n\t\t<method name=\"getMin()J\"/>\n\t\t<method name=\"getSum()J\"/>\n\t</class>\n\t<class name=\"java/util/Map\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"compute(Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"computeIfPresent(Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"containsKey(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"containsValue(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"entry(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map$Entry;\" since=\"30\"/>\n\t\t<method name=\"entrySet()Ljava/util/Set;\"/>\n\t\t<method name=\"forEach(Ljava/util/function/BiConsumer;)V\" since=\"24\"/>\n\t\t<method name=\"get(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"isEmpty()Z\"/>\n\t\t<method name=\"keySet()Ljava/util/Set;\"/>\n\t\t<method name=\"merge(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"of()Ljava/util/Map;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;\" since=\"30\"/>\n\t\t<method name=\"ofEntries([Ljava/util/Map$Entry;)Ljava/util/Map;\" since=\"30\"/>\n\t\t<method name=\"put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"putAll(Ljava/util/Map;)V\"/>\n\t\t<method name=\"putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"remove(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"remove(Ljava/lang/Object;Ljava/lang/Object;)Z\" since=\"24\"/>\n\t\t<method name=\"replace(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"replace(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z\" since=\"24\"/>\n\t\t<method name=\"replaceAll(Ljava/util/function/BiFunction;)V\" since=\"24\"/>\n\t\t<method name=\"size()I\"/>\n\t\t<method name=\"values()Ljava/util/Collection;\"/>\n\t</class>\n\t<class name=\"java/util/Map$Entry\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"comparingByKey()Ljava/util/Comparator;\" since=\"24\"/>\n\t\t<method name=\"comparingByKey(Ljava/util/Comparator;)Ljava/util/Comparator;\" since=\"24\"/>\n\t\t<method name=\"comparingByValue()Ljava/util/Comparator;\" since=\"24\"/>\n\t\t<method name=\"comparingByValue(Ljava/util/Comparator;)Ljava/util/Comparator;\" since=\"24\"/>\n\t\t<method name=\"getKey()Ljava/lang/Object;\"/>\n\t\t<method name=\"getValue()Ljava/lang/Object;\"/>\n\t\t<method name=\"setValue(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/util/MissingFormatArgumentException\" since=\"1\">\n\t\t<extends name=\"java/util/IllegalFormatException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getFormatSpecifier()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/util/MissingFormatWidthException\" since=\"1\">\n\t\t<extends name=\"java/util/IllegalFormatException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getFormatSpecifier()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/util/MissingResourceException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getClassName()Ljava/lang/String;\"/>\n\t\t<method name=\"getKey()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/util/NavigableMap\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/SortedMap\"/>\n\t\t<method name=\"ceilingEntry(Ljava/lang/Object;)Ljava/util/Map$Entry;\"/>\n\t\t<method name=\"ceilingKey(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"descendingKeySet()Ljava/util/NavigableSet;\"/>\n\t\t<method name=\"descendingMap()Ljava/util/NavigableMap;\"/>\n\t\t<method name=\"firstEntry()Ljava/util/Map$Entry;\"/>\n\t\t<method name=\"floorEntry(Ljava/lang/Object;)Ljava/util/Map$Entry;\"/>\n\t\t<method name=\"floorKey(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"headMap(Ljava/lang/Object;Z)Ljava/util/NavigableMap;\"/>\n\t\t<method name=\"higherEntry(Ljava/lang/Object;)Ljava/util/Map$Entry;\"/>\n\t\t<method name=\"higherKey(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"lastEntry()Ljava/util/Map$Entry;\"/>\n\t\t<method name=\"lowerEntry(Ljava/lang/Object;)Ljava/util/Map$Entry;\"/>\n\t\t<method name=\"lowerKey(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"navigableKeySet()Ljava/util/NavigableSet;\"/>\n\t\t<method name=\"pollFirstEntry()Ljava/util/Map$Entry;\"/>\n\t\t<method name=\"pollLastEntry()Ljava/util/Map$Entry;\"/>\n\t\t<method name=\"subMap(Ljava/lang/Object;ZLjava/lang/Object;Z)Ljava/util/NavigableMap;\"/>\n\t\t<method name=\"tailMap(Ljava/lang/Object;Z)Ljava/util/NavigableMap;\"/>\n\t</class>\n\t<class name=\"java/util/NavigableSet\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/SortedSet\"/>\n\t\t<method name=\"ceiling(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"descendingIterator()Ljava/util/Iterator;\"/>\n\t\t<method name=\"descendingSet()Ljava/util/NavigableSet;\"/>\n\t\t<method name=\"floor(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"headSet(Ljava/lang/Object;Z)Ljava/util/NavigableSet;\"/>\n\t\t<method name=\"higher(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"lower(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"pollFirst()Ljava/lang/Object;\"/>\n\t\t<method name=\"pollLast()Ljava/lang/Object;\"/>\n\t\t<method name=\"subSet(Ljava/lang/Object;ZLjava/lang/Object;Z)Ljava/util/NavigableSet;\"/>\n\t\t<method name=\"tailSet(Ljava/lang/Object;Z)Ljava/util/NavigableSet;\"/>\n\t</class>\n\t<class name=\"java/util/NoSuchElementException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/util/Objects\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"checkFromIndexSize(III)I\" since=\"30\"/>\n\t\t<method name=\"checkFromToIndex(III)I\" since=\"30\"/>\n\t\t<method name=\"checkIndex(II)I\" since=\"30\"/>\n\t\t<method name=\"compare(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/Comparator;)I\"/>\n\t\t<method name=\"deepEquals(Ljava/lang/Object;Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"equals(Ljava/lang/Object;Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"hash([Ljava/lang/Object;)I\"/>\n\t\t<method name=\"hashCode(Ljava/lang/Object;)I\"/>\n\t\t<method name=\"isNull(Ljava/lang/Object;)Z\" since=\"24\"/>\n\t\t<method name=\"nonNull(Ljava/lang/Object;)Z\" since=\"24\"/>\n\t\t<method name=\"requireNonNull(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"requireNonNull(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"requireNonNull(Ljava/lang/Object;Ljava/util/function/Supplier;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"requireNonNullElse(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\" since=\"30\"/>\n\t\t<method name=\"requireNonNullElseGet(Ljava/lang/Object;Ljava/util/function/Supplier;)Ljava/lang/Object;\" since=\"30\"/>\n\t\t<method name=\"toString(Ljava/lang/Object;)Ljava/lang/String;\"/>\n\t\t<method name=\"toString(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/util/Observable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addObserver(Ljava/util/Observer;)V\"/>\n\t\t<method name=\"clearChanged()V\"/>\n\t\t<method name=\"countObservers()I\"/>\n\t\t<method name=\"deleteObserver(Ljava/util/Observer;)V\"/>\n\t\t<method name=\"deleteObservers()V\"/>\n\t\t<method name=\"hasChanged()Z\"/>\n\t\t<method name=\"notifyObservers()V\"/>\n\t\t<method name=\"notifyObservers(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"setChanged()V\"/>\n\t</class>\n\t<class name=\"java/util/Observer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"update(Ljava/util/Observable;Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"java/util/Optional\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"empty()Ljava/util/Optional;\"/>\n\t\t<method name=\"filter(Ljava/util/function/Predicate;)Ljava/util/Optional;\"/>\n\t\t<method name=\"flatMap(Ljava/util/function/Function;)Ljava/util/Optional;\"/>\n\t\t<method name=\"get()Ljava/lang/Object;\"/>\n\t\t<method name=\"ifPresent(Ljava/util/function/Consumer;)V\"/>\n\t\t<method name=\"isPresent()Z\"/>\n\t\t<method name=\"map(Ljava/util/function/Function;)Ljava/util/Optional;\"/>\n\t\t<method name=\"of(Ljava/lang/Object;)Ljava/util/Optional;\"/>\n\t\t<method name=\"ofNullable(Ljava/lang/Object;)Ljava/util/Optional;\"/>\n\t\t<method name=\"orElse(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"orElseGet(Ljava/util/function/Supplier;)Ljava/lang/Object;\"/>\n\t\t<method name=\"orElseThrow(Ljava/util/function/Supplier;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/util/OptionalDouble\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"empty()Ljava/util/OptionalDouble;\"/>\n\t\t<method name=\"getAsDouble()D\"/>\n\t\t<method name=\"ifPresent(Ljava/util/function/DoubleConsumer;)V\"/>\n\t\t<method name=\"isPresent()Z\"/>\n\t\t<method name=\"of(D)Ljava/util/OptionalDouble;\"/>\n\t\t<method name=\"orElse(D)D\"/>\n\t\t<method name=\"orElseGet(Ljava/util/function/DoubleSupplier;)D\"/>\n\t\t<method name=\"orElseThrow(Ljava/util/function/Supplier;)D\"/>\n\t</class>\n\t<class name=\"java/util/OptionalInt\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"empty()Ljava/util/OptionalInt;\"/>\n\t\t<method name=\"getAsInt()I\"/>\n\t\t<method name=\"ifPresent(Ljava/util/function/IntConsumer;)V\"/>\n\t\t<method name=\"isPresent()Z\"/>\n\t\t<method name=\"of(I)Ljava/util/OptionalInt;\"/>\n\t\t<method name=\"orElse(I)I\"/>\n\t\t<method name=\"orElseGet(Ljava/util/function/IntSupplier;)I\"/>\n\t\t<method name=\"orElseThrow(Ljava/util/function/Supplier;)I\"/>\n\t</class>\n\t<class name=\"java/util/OptionalLong\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"empty()Ljava/util/OptionalLong;\"/>\n\t\t<method name=\"getAsLong()J\"/>\n\t\t<method name=\"ifPresent(Ljava/util/function/LongConsumer;)V\"/>\n\t\t<method name=\"isPresent()Z\"/>\n\t\t<method name=\"of(J)Ljava/util/OptionalLong;\"/>\n\t\t<method name=\"orElse(J)J\"/>\n\t\t<method name=\"orElseGet(Ljava/util/function/LongSupplier;)J\"/>\n\t\t<method name=\"orElseThrow(Ljava/util/function/Supplier;)J\"/>\n\t</class>\n\t<class name=\"java/util/PrimitiveIterator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Iterator\"/>\n\t\t<method name=\"forEachRemaining(Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"java/util/PrimitiveIterator$OfDouble\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/PrimitiveIterator\"/>\n\t\t<method name=\"forEachRemaining(Ljava/util/function/DoubleConsumer;)V\"/>\n\t\t<method name=\"next()Ljava/lang/Double;\"/>\n\t\t<method name=\"nextDouble()D\"/>\n\t</class>\n\t<class name=\"java/util/PrimitiveIterator$OfInt\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/PrimitiveIterator\"/>\n\t\t<method name=\"forEachRemaining(Ljava/util/function/IntConsumer;)V\"/>\n\t\t<method name=\"next()Ljava/lang/Integer;\"/>\n\t\t<method name=\"nextInt()I\"/>\n\t</class>\n\t<class name=\"java/util/PrimitiveIterator$OfLong\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/PrimitiveIterator\"/>\n\t\t<method name=\"forEachRemaining(Ljava/util/function/LongConsumer;)V\"/>\n\t\t<method name=\"next()Ljava/lang/Long;\"/>\n\t\t<method name=\"nextLong()J\"/>\n\t</class>\n\t<class name=\"java/util/PriorityQueue\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractQueue\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/util/Comparator;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Collection;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Comparator;)V\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/PriorityQueue;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/SortedSet;)V\"/>\n\t\t<method name=\"comparator()Ljava/util/Comparator;\"/>\n\t</class>\n\t<class name=\"java/util/Properties\" since=\"1\">\n\t\t<extends name=\"java/util/Hashtable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Properties;)V\"/>\n\t\t<method name=\"getProperty(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"list(Ljava/io/PrintStream;)V\"/>\n\t\t<method name=\"list(Ljava/io/PrintWriter;)V\"/>\n\t\t<method name=\"load(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"load(Ljava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"loadFromXML(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"propertyNames()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"save(Ljava/io/OutputStream;Ljava/lang/String;)V\" deprecated=\"15\"/>\n\t\t<method name=\"setProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"store(Ljava/io/OutputStream;Ljava/lang/String;)V\"/>\n\t\t<method name=\"store(Ljava/io/Writer;Ljava/lang/String;)V\" since=\"9\"/>\n\t\t<method name=\"storeToXML(Ljava/io/OutputStream;Ljava/lang/String;)V\"/>\n\t\t<method name=\"storeToXML(Ljava/io/OutputStream;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"stringPropertyNames()Ljava/util/Set;\" since=\"9\"/>\n\t\t<field name=\"defaults\"/>\n\t</class>\n\t<class name=\"java/util/PropertyPermission\" since=\"1\">\n\t\t<extends name=\"java/security/BasicPermission\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/util/PropertyResourceBundle\" since=\"1\">\n\t\t<extends name=\"java/util/ResourceBundle\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Reader;)V\" since=\"9\"/>\n\t</class>\n\t<class name=\"java/util/Queue\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Collection\"/>\n\t\t<method name=\"element()Ljava/lang/Object;\"/>\n\t\t<method name=\"offer(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"peek()Ljava/lang/Object;\"/>\n\t\t<method name=\"poll()Ljava/lang/Object;\"/>\n\t\t<method name=\"remove()Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/util/Random\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(J)V\"/>\n\t\t<method name=\"doubles()Ljava/util/stream/DoubleStream;\" since=\"24\"/>\n\t\t<method name=\"doubles(DD)Ljava/util/stream/DoubleStream;\" since=\"24\"/>\n\t\t<method name=\"doubles(J)Ljava/util/stream/DoubleStream;\" since=\"24\"/>\n\t\t<method name=\"doubles(JDD)Ljava/util/stream/DoubleStream;\" since=\"24\"/>\n\t\t<method name=\"ints()Ljava/util/stream/IntStream;\" since=\"24\"/>\n\t\t<method name=\"ints(II)Ljava/util/stream/IntStream;\" since=\"24\"/>\n\t\t<method name=\"ints(J)Ljava/util/stream/IntStream;\" since=\"24\"/>\n\t\t<method name=\"ints(JII)Ljava/util/stream/IntStream;\" since=\"24\"/>\n\t\t<method name=\"longs()Ljava/util/stream/LongStream;\" since=\"24\"/>\n\t\t<method name=\"longs(J)Ljava/util/stream/LongStream;\" since=\"24\"/>\n\t\t<method name=\"longs(JJ)Ljava/util/stream/LongStream;\" since=\"24\"/>\n\t\t<method name=\"longs(JJJ)Ljava/util/stream/LongStream;\" since=\"24\"/>\n\t\t<method name=\"next(I)I\"/>\n\t\t<method name=\"nextBoolean()Z\"/>\n\t\t<method name=\"nextBytes([B)V\"/>\n\t\t<method name=\"nextDouble()D\"/>\n\t\t<method name=\"nextFloat()F\"/>\n\t\t<method name=\"nextGaussian()D\"/>\n\t\t<method name=\"nextInt()I\"/>\n\t\t<method name=\"nextInt(I)I\"/>\n\t\t<method name=\"nextLong()J\"/>\n\t\t<method name=\"setSeed(J)V\"/>\n\t</class>\n\t<class name=\"java/util/RandomAccess\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"java/util/ResourceBundle\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"clearCache()V\" since=\"9\"/>\n\t\t<method name=\"clearCache(Ljava/lang/ClassLoader;)V\" since=\"9\"/>\n\t\t<method name=\"containsKey(Ljava/lang/String;)Z\" since=\"9\"/>\n\t\t<method name=\"getBaseBundleName()Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"getBundle(Ljava/lang/String;)Ljava/util/ResourceBundle;\"/>\n\t\t<method name=\"getBundle(Ljava/lang/String;Ljava/util/Locale;)Ljava/util/ResourceBundle;\"/>\n\t\t<method name=\"getBundle(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/ClassLoader;)Ljava/util/ResourceBundle;\"/>\n\t\t<method name=\"getBundle(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/ClassLoader;Ljava/util/ResourceBundle$Control;)Ljava/util/ResourceBundle;\" since=\"9\"/>\n\t\t<method name=\"getBundle(Ljava/lang/String;Ljava/util/Locale;Ljava/util/ResourceBundle$Control;)Ljava/util/ResourceBundle;\" since=\"9\"/>\n\t\t<method name=\"getBundle(Ljava/lang/String;Ljava/util/ResourceBundle$Control;)Ljava/util/ResourceBundle;\" since=\"9\"/>\n\t\t<method name=\"getKeys()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"getLocale()Ljava/util/Locale;\"/>\n\t\t<method name=\"getObject(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getString(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getStringArray(Ljava/lang/String;)[Ljava/lang/String;\"/>\n\t\t<method name=\"handleGetObject(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"handleKeySet()Ljava/util/Set;\" since=\"9\"/>\n\t\t<method name=\"keySet()Ljava/util/Set;\" since=\"9\"/>\n\t\t<method name=\"setParent(Ljava/util/ResourceBundle;)V\"/>\n\t\t<field name=\"parent\"/>\n\t</class>\n\t<class name=\"java/util/ResourceBundle$Control\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getCandidateLocales(Ljava/lang/String;Ljava/util/Locale;)Ljava/util/List;\"/>\n\t\t<method name=\"getControl(Ljava/util/List;)Ljava/util/ResourceBundle$Control;\"/>\n\t\t<method name=\"getFallbackLocale(Ljava/lang/String;Ljava/util/Locale;)Ljava/util/Locale;\"/>\n\t\t<method name=\"getFormats(Ljava/lang/String;)Ljava/util/List;\"/>\n\t\t<method name=\"getNoFallbackControl(Ljava/util/List;)Ljava/util/ResourceBundle$Control;\"/>\n\t\t<method name=\"getTimeToLive(Ljava/lang/String;Ljava/util/Locale;)J\"/>\n\t\t<method name=\"needsReload(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/util/ResourceBundle;J)Z\"/>\n\t\t<method name=\"newBundle(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/String;Ljava/lang/ClassLoader;Z)Ljava/util/ResourceBundle;\"/>\n\t\t<method name=\"toBundleName(Ljava/lang/String;Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"toResourceName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<field name=\"FORMAT_CLASS\"/>\n\t\t<field name=\"FORMAT_DEFAULT\"/>\n\t\t<field name=\"FORMAT_PROPERTIES\"/>\n\t\t<field name=\"TTL_DONT_CACHE\"/>\n\t\t<field name=\"TTL_NO_EXPIRATION_CONTROL\"/>\n\t</class>\n\t<class name=\"java/util/Scanner\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\" since=\"19\"/>\n\t\t<implements name=\"java/util/Iterator\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Readable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/nio/channels/ReadableByteChannel;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/nio/channels/ReadableByteChannel;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/nio/file/Path;)V\" since=\"26\"/>\n\t\t<method name=\"&lt;init>(Ljava/nio/file/Path;Ljava/lang/String;)V\" since=\"26\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"delimiter()Ljava/util/regex/Pattern;\"/>\n\t\t<method name=\"findInLine(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"findInLine(Ljava/util/regex/Pattern;)Ljava/lang/String;\"/>\n\t\t<method name=\"findWithinHorizon(Ljava/lang/String;I)Ljava/lang/String;\"/>\n\t\t<method name=\"findWithinHorizon(Ljava/util/regex/Pattern;I)Ljava/lang/String;\"/>\n\t\t<method name=\"hasNext(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"hasNext(Ljava/util/regex/Pattern;)Z\"/>\n\t\t<method name=\"hasNextBigDecimal()Z\"/>\n\t\t<method name=\"hasNextBigInteger()Z\"/>\n\t\t<method name=\"hasNextBigInteger(I)Z\"/>\n\t\t<method name=\"hasNextBoolean()Z\"/>\n\t\t<method name=\"hasNextByte()Z\"/>\n\t\t<method name=\"hasNextByte(I)Z\"/>\n\t\t<method name=\"hasNextDouble()Z\"/>\n\t\t<method name=\"hasNextFloat()Z\"/>\n\t\t<method name=\"hasNextInt()Z\"/>\n\t\t<method name=\"hasNextInt(I)Z\"/>\n\t\t<method name=\"hasNextLine()Z\"/>\n\t\t<method name=\"hasNextLong()Z\"/>\n\t\t<method name=\"hasNextLong(I)Z\"/>\n\t\t<method name=\"hasNextShort()Z\"/>\n\t\t<method name=\"hasNextShort(I)Z\"/>\n\t\t<method name=\"ioException()Ljava/io/IOException;\"/>\n\t\t<method name=\"locale()Ljava/util/Locale;\"/>\n\t\t<method name=\"match()Ljava/util/regex/MatchResult;\"/>\n\t\t<method name=\"next()Ljava/lang/String;\"/>\n\t\t<method name=\"next(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"next(Ljava/util/regex/Pattern;)Ljava/lang/String;\"/>\n\t\t<method name=\"nextBigDecimal()Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"nextBigInteger()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"nextBigInteger(I)Ljava/math/BigInteger;\"/>\n\t\t<method name=\"nextBoolean()Z\"/>\n\t\t<method name=\"nextByte()B\"/>\n\t\t<method name=\"nextByte(I)B\"/>\n\t\t<method name=\"nextDouble()D\"/>\n\t\t<method name=\"nextFloat()F\"/>\n\t\t<method name=\"nextInt()I\"/>\n\t\t<method name=\"nextInt(I)I\"/>\n\t\t<method name=\"nextLine()Ljava/lang/String;\"/>\n\t\t<method name=\"nextLong()J\"/>\n\t\t<method name=\"nextLong(I)J\"/>\n\t\t<method name=\"nextShort()S\"/>\n\t\t<method name=\"nextShort(I)S\"/>\n\t\t<method name=\"radix()I\"/>\n\t\t<method name=\"reset()Ljava/util/Scanner;\" since=\"9\"/>\n\t\t<method name=\"skip(Ljava/lang/String;)Ljava/util/Scanner;\"/>\n\t\t<method name=\"skip(Ljava/util/regex/Pattern;)Ljava/util/Scanner;\"/>\n\t\t<method name=\"useDelimiter(Ljava/lang/String;)Ljava/util/Scanner;\"/>\n\t\t<method name=\"useDelimiter(Ljava/util/regex/Pattern;)Ljava/util/Scanner;\"/>\n\t\t<method name=\"useLocale(Ljava/util/Locale;)Ljava/util/Scanner;\"/>\n\t\t<method name=\"useRadix(I)Ljava/util/Scanner;\"/>\n\t</class>\n\t<class name=\"java/util/ServiceConfigurationError\" since=\"9\">\n\t\t<extends name=\"java/lang/Error\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/util/ServiceLoader\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Iterable\"/>\n\t\t<method name=\"load(Ljava/lang/Class;)Ljava/util/ServiceLoader;\"/>\n\t\t<method name=\"load(Ljava/lang/Class;Ljava/lang/ClassLoader;)Ljava/util/ServiceLoader;\"/>\n\t\t<method name=\"loadInstalled(Ljava/lang/Class;)Ljava/util/ServiceLoader;\"/>\n\t\t<method name=\"reload()V\"/>\n\t</class>\n\t<class name=\"java/util/Set\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Collection\"/>\n\t\t<method name=\"of()Ljava/util/Set;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;)Ljava/util/Set;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;\" since=\"30\"/>\n\t\t<method name=\"of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;\" since=\"30\"/>\n\t\t<method name=\"of([Ljava/lang/Object;)Ljava/util/Set;\" since=\"30\"/>\n\t</class>\n\t<class name=\"java/util/SimpleTimeZone\" since=\"1\">\n\t\t<extends name=\"java/util/TimeZone\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/String;IIIIIIII)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/String;IIIIIIIII)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/String;IIIIIIIIIII)V\"/>\n\t\t<method name=\"setDSTSavings(I)V\"/>\n\t\t<method name=\"setEndRule(III)V\"/>\n\t\t<method name=\"setEndRule(IIII)V\"/>\n\t\t<method name=\"setEndRule(IIIIZ)V\"/>\n\t\t<method name=\"setStartRule(III)V\"/>\n\t\t<method name=\"setStartRule(IIII)V\"/>\n\t\t<method name=\"setStartRule(IIIIZ)V\"/>\n\t\t<method name=\"setStartYear(I)V\"/>\n\t\t<field name=\"STANDARD_TIME\"/>\n\t\t<field name=\"UTC_TIME\"/>\n\t\t<field name=\"WALL_TIME\"/>\n\t</class>\n\t<class name=\"java/util/SortedMap\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Map\"/>\n\t\t<method name=\"comparator()Ljava/util/Comparator;\"/>\n\t\t<method name=\"firstKey()Ljava/lang/Object;\"/>\n\t\t<method name=\"headMap(Ljava/lang/Object;)Ljava/util/SortedMap;\"/>\n\t\t<method name=\"lastKey()Ljava/lang/Object;\"/>\n\t\t<method name=\"subMap(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/SortedMap;\"/>\n\t\t<method name=\"tailMap(Ljava/lang/Object;)Ljava/util/SortedMap;\"/>\n\t</class>\n\t<class name=\"java/util/SortedSet\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Set\"/>\n\t\t<method name=\"comparator()Ljava/util/Comparator;\"/>\n\t\t<method name=\"first()Ljava/lang/Object;\"/>\n\t\t<method name=\"headSet(Ljava/lang/Object;)Ljava/util/SortedSet;\"/>\n\t\t<method name=\"last()Ljava/lang/Object;\"/>\n\t\t<method name=\"subSet(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/SortedSet;\"/>\n\t\t<method name=\"tailSet(Ljava/lang/Object;)Ljava/util/SortedSet;\"/>\n\t</class>\n\t<class name=\"java/util/Spliterator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"characteristics()I\"/>\n\t\t<method name=\"estimateSize()J\"/>\n\t\t<method name=\"forEachRemaining(Ljava/util/function/Consumer;)V\"/>\n\t\t<method name=\"getComparator()Ljava/util/Comparator;\"/>\n\t\t<method name=\"getExactSizeIfKnown()J\"/>\n\t\t<method name=\"hasCharacteristics(I)Z\"/>\n\t\t<method name=\"tryAdvance(Ljava/util/function/Consumer;)Z\"/>\n\t\t<method name=\"trySplit()Ljava/util/Spliterator;\"/>\n\t\t<field name=\"CONCURRENT\"/>\n\t\t<field name=\"DISTINCT\"/>\n\t\t<field name=\"IMMUTABLE\"/>\n\t\t<field name=\"NONNULL\"/>\n\t\t<field name=\"ORDERED\"/>\n\t\t<field name=\"SIZED\"/>\n\t\t<field name=\"SORTED\"/>\n\t\t<field name=\"SUBSIZED\"/>\n\t</class>\n\t<class name=\"java/util/Spliterator$OfDouble\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Spliterator$OfPrimitive\"/>\n\t\t<method name=\"forEachRemaining(Ljava/util/function/DoubleConsumer;)V\"/>\n\t\t<method name=\"tryAdvance(Ljava/util/function/DoubleConsumer;)Z\"/>\n\t\t<method name=\"trySplit()Ljava/util/Spliterator$OfDouble;\"/>\n\t</class>\n\t<class name=\"java/util/Spliterator$OfInt\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Spliterator$OfPrimitive\"/>\n\t\t<method name=\"forEachRemaining(Ljava/util/function/IntConsumer;)V\"/>\n\t\t<method name=\"tryAdvance(Ljava/util/function/IntConsumer;)Z\"/>\n\t\t<method name=\"trySplit()Ljava/util/Spliterator$OfInt;\"/>\n\t</class>\n\t<class name=\"java/util/Spliterator$OfLong\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Spliterator$OfPrimitive\"/>\n\t\t<method name=\"forEachRemaining(Ljava/util/function/LongConsumer;)V\"/>\n\t\t<method name=\"tryAdvance(Ljava/util/function/LongConsumer;)Z\"/>\n\t\t<method name=\"trySplit()Ljava/util/Spliterator$OfLong;\"/>\n\t</class>\n\t<class name=\"java/util/Spliterator$OfPrimitive\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Spliterator\"/>\n\t\t<method name=\"forEachRemaining(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"tryAdvance(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"trySplit()Ljava/util/Spliterator$OfPrimitive;\"/>\n\t</class>\n\t<class name=\"java/util/Spliterators\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"emptyDoubleSpliterator()Ljava/util/Spliterator$OfDouble;\"/>\n\t\t<method name=\"emptyIntSpliterator()Ljava/util/Spliterator$OfInt;\"/>\n\t\t<method name=\"emptyLongSpliterator()Ljava/util/Spliterator$OfLong;\"/>\n\t\t<method name=\"emptySpliterator()Ljava/util/Spliterator;\"/>\n\t\t<method name=\"iterator(Ljava/util/Spliterator$OfDouble;)Ljava/util/PrimitiveIterator$OfDouble;\"/>\n\t\t<method name=\"iterator(Ljava/util/Spliterator$OfInt;)Ljava/util/PrimitiveIterator$OfInt;\"/>\n\t\t<method name=\"iterator(Ljava/util/Spliterator$OfLong;)Ljava/util/PrimitiveIterator$OfLong;\"/>\n\t\t<method name=\"iterator(Ljava/util/Spliterator;)Ljava/util/Iterator;\"/>\n\t\t<method name=\"spliterator(Ljava/util/Collection;I)Ljava/util/Spliterator;\"/>\n\t\t<method name=\"spliterator(Ljava/util/Iterator;JI)Ljava/util/Spliterator;\"/>\n\t\t<method name=\"spliterator(Ljava/util/PrimitiveIterator$OfDouble;JI)Ljava/util/Spliterator$OfDouble;\"/>\n\t\t<method name=\"spliterator(Ljava/util/PrimitiveIterator$OfInt;JI)Ljava/util/Spliterator$OfInt;\"/>\n\t\t<method name=\"spliterator(Ljava/util/PrimitiveIterator$OfLong;JI)Ljava/util/Spliterator$OfLong;\"/>\n\t\t<method name=\"spliterator([DI)Ljava/util/Spliterator$OfDouble;\"/>\n\t\t<method name=\"spliterator([DIII)Ljava/util/Spliterator$OfDouble;\"/>\n\t\t<method name=\"spliterator([II)Ljava/util/Spliterator$OfInt;\"/>\n\t\t<method name=\"spliterator([IIII)Ljava/util/Spliterator$OfInt;\"/>\n\t\t<method name=\"spliterator([JI)Ljava/util/Spliterator$OfLong;\"/>\n\t\t<method name=\"spliterator([JIII)Ljava/util/Spliterator$OfLong;\"/>\n\t\t<method name=\"spliterator([Ljava/lang/Object;I)Ljava/util/Spliterator;\"/>\n\t\t<method name=\"spliterator([Ljava/lang/Object;III)Ljava/util/Spliterator;\"/>\n\t\t<method name=\"spliteratorUnknownSize(Ljava/util/Iterator;I)Ljava/util/Spliterator;\"/>\n\t\t<method name=\"spliteratorUnknownSize(Ljava/util/PrimitiveIterator$OfDouble;I)Ljava/util/Spliterator$OfDouble;\"/>\n\t\t<method name=\"spliteratorUnknownSize(Ljava/util/PrimitiveIterator$OfInt;I)Ljava/util/Spliterator$OfInt;\"/>\n\t\t<method name=\"spliteratorUnknownSize(Ljava/util/PrimitiveIterator$OfLong;I)Ljava/util/Spliterator$OfLong;\"/>\n\t</class>\n\t<class name=\"java/util/Spliterators$AbstractDoubleSpliterator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Spliterator$OfDouble\"/>\n\t\t<method name=\"&lt;init>(JI)V\"/>\n\t</class>\n\t<class name=\"java/util/Spliterators$AbstractIntSpliterator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Spliterator$OfInt\"/>\n\t\t<method name=\"&lt;init>(JI)V\"/>\n\t</class>\n\t<class name=\"java/util/Spliterators$AbstractLongSpliterator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Spliterator$OfLong\"/>\n\t\t<method name=\"&lt;init>(JI)V\"/>\n\t</class>\n\t<class name=\"java/util/Spliterators$AbstractSpliterator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Spliterator\"/>\n\t\t<method name=\"&lt;init>(JI)V\"/>\n\t</class>\n\t<class name=\"java/util/SplittableRandom\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(J)V\"/>\n\t\t<method name=\"doubles()Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"doubles(DD)Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"doubles(J)Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"doubles(JDD)Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"ints()Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"ints(II)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"ints(J)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"ints(JII)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"longs()Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"longs(J)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"longs(JJ)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"longs(JJJ)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"nextBoolean()Z\"/>\n\t\t<method name=\"nextDouble()D\"/>\n\t\t<method name=\"nextDouble(D)D\"/>\n\t\t<method name=\"nextDouble(DD)D\"/>\n\t\t<method name=\"nextInt()I\"/>\n\t\t<method name=\"nextInt(I)I\"/>\n\t\t<method name=\"nextInt(II)I\"/>\n\t\t<method name=\"nextLong()J\"/>\n\t\t<method name=\"nextLong(J)J\"/>\n\t\t<method name=\"nextLong(JJ)J\"/>\n\t\t<method name=\"split()Ljava/util/SplittableRandom;\"/>\n\t</class>\n\t<class name=\"java/util/Stack\" since=\"1\">\n\t\t<extends name=\"java/util/Vector\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"empty()Z\"/>\n\t\t<method name=\"peek()Ljava/lang/Object;\"/>\n\t\t<method name=\"pop()Ljava/lang/Object;\"/>\n\t\t<method name=\"push(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"search(Ljava/lang/Object;)I\"/>\n\t</class>\n\t<class name=\"java/util/StringJoiner\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;)V\"/>\n\t\t<method name=\"add(Ljava/lang/CharSequence;)Ljava/util/StringJoiner;\"/>\n\t\t<method name=\"length()I\"/>\n\t\t<method name=\"merge(Ljava/util/StringJoiner;)Ljava/util/StringJoiner;\"/>\n\t\t<method name=\"setEmptyValue(Ljava/lang/CharSequence;)Ljava/util/StringJoiner;\"/>\n\t</class>\n\t<class name=\"java/util/StringTokenizer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Enumeration\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"countTokens()I\"/>\n\t\t<method name=\"hasMoreTokens()Z\"/>\n\t\t<method name=\"nextToken()Ljava/lang/String;\"/>\n\t\t<method name=\"nextToken(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/util/TimeZone\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getAvailableIDs()[Ljava/lang/String;\"/>\n\t\t<method name=\"getAvailableIDs(I)[Ljava/lang/String;\"/>\n\t\t<method name=\"getDSTSavings()I\"/>\n\t\t<method name=\"getDefault()Ljava/util/TimeZone;\"/>\n\t\t<method name=\"getDisplayName()Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName(Ljava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName(ZI)Ljava/lang/String;\"/>\n\t\t<method name=\"getDisplayName(ZILjava/util/Locale;)Ljava/lang/String;\"/>\n\t\t<method name=\"getID()Ljava/lang/String;\"/>\n\t\t<method name=\"getOffset(IIIIII)I\"/>\n\t\t<method name=\"getOffset(J)I\"/>\n\t\t<method name=\"getRawOffset()I\"/>\n\t\t<method name=\"getTimeZone(Ljava/lang/String;)Ljava/util/TimeZone;\"/>\n\t\t<method name=\"getTimeZone(Ljava/time/ZoneId;)Ljava/util/TimeZone;\" since=\"26\"/>\n\t\t<method name=\"hasSameRules(Ljava/util/TimeZone;)Z\"/>\n\t\t<method name=\"inDaylightTime(Ljava/util/Date;)Z\"/>\n\t\t<method name=\"observesDaylightTime()Z\" since=\"24\"/>\n\t\t<method name=\"setDefault(Ljava/util/TimeZone;)V\"/>\n\t\t<method name=\"setID(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setRawOffset(I)V\"/>\n\t\t<method name=\"toZoneId()Ljava/time/ZoneId;\" since=\"26\"/>\n\t\t<method name=\"useDaylightTime()Z\"/>\n\t\t<field name=\"LONG\"/>\n\t\t<field name=\"SHORT\"/>\n\t</class>\n\t<class name=\"java/util/Timer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"&lt;init>(Z)V\"/>\n\t\t<method name=\"cancel()V\"/>\n\t\t<method name=\"purge()I\"/>\n\t\t<method name=\"schedule(Ljava/util/TimerTask;J)V\"/>\n\t\t<method name=\"schedule(Ljava/util/TimerTask;JJ)V\"/>\n\t\t<method name=\"schedule(Ljava/util/TimerTask;Ljava/util/Date;)V\"/>\n\t\t<method name=\"schedule(Ljava/util/TimerTask;Ljava/util/Date;J)V\"/>\n\t\t<method name=\"scheduleAtFixedRate(Ljava/util/TimerTask;JJ)V\"/>\n\t\t<method name=\"scheduleAtFixedRate(Ljava/util/TimerTask;Ljava/util/Date;J)V\"/>\n\t</class>\n\t<class name=\"java/util/TimerTask\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Runnable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"cancel()Z\"/>\n\t\t<method name=\"scheduledExecutionTime()J\"/>\n\t</class>\n\t<class name=\"java/util/TooManyListenersException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/util/TreeMap\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractMap\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"java/util/NavigableMap\" since=\"9\"/>\n\t\t<implements name=\"java/util/SortedMap\" removed=\"24\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Comparator;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Map;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/SortedMap;)V\"/>\n\t</class>\n\t<class name=\"java/util/TreeSet\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractSet\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"java/util/NavigableSet\" since=\"9\"/>\n\t\t<implements name=\"java/util/SortedSet\" removed=\"9\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Collection;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Comparator;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/SortedSet;)V\"/>\n\t</class>\n\t<class name=\"java/util/UUID\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"&lt;init>(JJ)V\"/>\n\t\t<method name=\"clockSequence()I\"/>\n\t\t<method name=\"compareTo(Ljava/util/UUID;)I\"/>\n\t\t<method name=\"fromString(Ljava/lang/String;)Ljava/util/UUID;\"/>\n\t\t<method name=\"getLeastSignificantBits()J\"/>\n\t\t<method name=\"getMostSignificantBits()J\"/>\n\t\t<method name=\"nameUUIDFromBytes([B)Ljava/util/UUID;\"/>\n\t\t<method name=\"node()J\"/>\n\t\t<method name=\"randomUUID()Ljava/util/UUID;\"/>\n\t\t<method name=\"timestamp()J\"/>\n\t\t<method name=\"variant()I\"/>\n\t\t<method name=\"version()I\"/>\n\t</class>\n\t<class name=\"java/util/UnknownFormatConversionException\" since=\"1\">\n\t\t<extends name=\"java/util/IllegalFormatException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getConversion()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/util/UnknownFormatFlagsException\" since=\"1\">\n\t\t<extends name=\"java/util/IllegalFormatException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getFlags()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/util/Vector\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractList\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"java/util/RandomAccess\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Collection;)V\"/>\n\t\t<method name=\"addElement(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"capacity()I\"/>\n\t\t<method name=\"copyInto([Ljava/lang/Object;)V\"/>\n\t\t<method name=\"elementAt(I)Ljava/lang/Object;\"/>\n\t\t<method name=\"elements()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"ensureCapacity(I)V\"/>\n\t\t<method name=\"firstElement()Ljava/lang/Object;\"/>\n\t\t<method name=\"indexOf(Ljava/lang/Object;I)I\"/>\n\t\t<method name=\"insertElementAt(Ljava/lang/Object;I)V\"/>\n\t\t<method name=\"lastElement()Ljava/lang/Object;\"/>\n\t\t<method name=\"lastIndexOf(Ljava/lang/Object;I)I\"/>\n\t\t<method name=\"removeAllElements()V\"/>\n\t\t<method name=\"removeElement(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"removeElementAt(I)V\"/>\n\t\t<method name=\"setElementAt(Ljava/lang/Object;I)V\"/>\n\t\t<method name=\"setSize(I)V\"/>\n\t\t<method name=\"trimToSize()V\"/>\n\t\t<field name=\"capacityIncrement\"/>\n\t\t<field name=\"elementCount\"/>\n\t\t<field name=\"elementData\"/>\n\t</class>\n\t<class name=\"java/util/WeakHashMap\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractMap\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(IF)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Map;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/AbstractExecutorService\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/concurrent/ExecutorService\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"newTaskFor(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/RunnableFuture;\" since=\"9\"/>\n\t\t<method name=\"newTaskFor(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/RunnableFuture;\" since=\"9\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ArrayBlockingQueue\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractQueue\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/util/concurrent/BlockingQueue\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(IZ)V\"/>\n\t\t<method name=\"&lt;init>(IZLjava/util/Collection;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/BlockingDeque\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Deque\"/>\n\t\t<implements name=\"java/util/concurrent/BlockingQueue\"/>\n\t\t<method name=\"offerFirst(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Z\"/>\n\t\t<method name=\"offerLast(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Z\"/>\n\t\t<method name=\"pollFirst(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;\"/>\n\t\t<method name=\"pollLast(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;\"/>\n\t\t<method name=\"putFirst(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"putLast(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"takeFirst()Ljava/lang/Object;\"/>\n\t\t<method name=\"takeLast()Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/BlockingQueue\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Queue\"/>\n\t\t<method name=\"drainTo(Ljava/util/Collection;)I\"/>\n\t\t<method name=\"drainTo(Ljava/util/Collection;I)I\"/>\n\t\t<method name=\"offer(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Z\"/>\n\t\t<method name=\"poll(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;\"/>\n\t\t<method name=\"put(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"remainingCapacity()I\"/>\n\t\t<method name=\"take()Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/BrokenBarrierException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/Callable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"call()Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/CancellationException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalStateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/CompletableFuture\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/concurrent/CompletionStage\"/>\n\t\t<implements name=\"java/util/concurrent/Future\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"acceptEither(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"acceptEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"acceptEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Consumer;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"allOf([Ljava/util/concurrent/CompletableFuture;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"anyOf([Ljava/util/concurrent/CompletableFuture;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"applyToEither(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Function;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"applyToEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Function;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"applyToEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Function;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"complete(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"completeExceptionally(Ljava/lang/Throwable;)Z\"/>\n\t\t<method name=\"completedFuture(Ljava/lang/Object;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"exceptionally(Ljava/util/function/Function;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"getNow(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getNumberOfDependents()I\"/>\n\t\t<method name=\"handle(Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"handleAsync(Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"handleAsync(Ljava/util/function/BiFunction;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"isCompletedExceptionally()Z\"/>\n\t\t<method name=\"join()Ljava/lang/Object;\"/>\n\t\t<method name=\"obtrudeException(Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"obtrudeValue(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"runAfterBoth(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"runAfterBothAsync(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"runAfterBothAsync(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"runAfterEither(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"runAfterEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"runAfterEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"runAsync(Ljava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"runAsync(Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"supplyAsync(Ljava/util/function/Supplier;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"supplyAsync(Ljava/util/function/Supplier;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"thenAccept(Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"thenAcceptAsync(Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"thenAcceptAsync(Ljava/util/function/Consumer;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"thenAcceptBoth(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"thenAcceptBothAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"thenAcceptBothAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiConsumer;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"thenApply(Ljava/util/function/Function;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"thenApplyAsync(Ljava/util/function/Function;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"thenApplyAsync(Ljava/util/function/Function;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"thenCombine(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"thenCombineAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"thenCombineAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiFunction;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"thenCompose(Ljava/util/function/Function;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"thenComposeAsync(Ljava/util/function/Function;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"thenComposeAsync(Ljava/util/function/Function;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"thenRun(Ljava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"thenRunAsync(Ljava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"thenRunAsync(Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"whenComplete(Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"whenCompleteAsync(Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"whenCompleteAsync(Ljava/util/function/BiConsumer;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/CompletableFuture$AsynchronousCompletionTask\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/CompletionException\" since=\"24\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/CompletionService\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"poll()Ljava/util/concurrent/Future;\"/>\n\t\t<method name=\"poll(JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/Future;\"/>\n\t\t<method name=\"submit(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/Future;\"/>\n\t\t<method name=\"submit(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Future;\"/>\n\t\t<method name=\"take()Ljava/util/concurrent/Future;\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/CompletionStage\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"acceptEither(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"acceptEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"acceptEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Consumer;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"applyToEither(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Function;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"applyToEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Function;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"applyToEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Function;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"exceptionally(Ljava/util/function/Function;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"handle(Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"handleAsync(Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"handleAsync(Ljava/util/function/BiFunction;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"runAfterBoth(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"runAfterBothAsync(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"runAfterBothAsync(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"runAfterEither(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"runAfterEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"runAfterEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"thenAccept(Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"thenAcceptAsync(Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"thenAcceptAsync(Ljava/util/function/Consumer;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"thenAcceptBoth(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"thenAcceptBothAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"thenAcceptBothAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiConsumer;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"thenApply(Ljava/util/function/Function;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"thenApplyAsync(Ljava/util/function/Function;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"thenApplyAsync(Ljava/util/function/Function;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"thenCombine(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"thenCombineAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"thenCombineAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiFunction;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"thenCompose(Ljava/util/function/Function;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"thenComposeAsync(Ljava/util/function/Function;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"thenComposeAsync(Ljava/util/function/Function;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"thenRun(Ljava/lang/Runnable;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"thenRunAsync(Ljava/lang/Runnable;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"thenRunAsync(Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"toCompletableFuture()Ljava/util/concurrent/CompletableFuture;\"/>\n\t\t<method name=\"whenComplete(Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"whenCompleteAsync(Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletionStage;\"/>\n\t\t<method name=\"whenCompleteAsync(Ljava/util/function/BiConsumer;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ConcurrentHashMap\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractMap\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/util/concurrent/ConcurrentMap\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(IF)V\" since=\"9\"/>\n\t\t<method name=\"&lt;init>(IFI)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Map;)V\"/>\n\t\t<method name=\"contains(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"elements()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"forEach(JLjava/util/function/BiConsumer;)V\" since=\"24\"/>\n\t\t<method name=\"forEach(JLjava/util/function/BiFunction;Ljava/util/function/Consumer;)V\" since=\"24\"/>\n\t\t<method name=\"forEachEntry(JLjava/util/function/Consumer;)V\" since=\"24\"/>\n\t\t<method name=\"forEachEntry(JLjava/util/function/Function;Ljava/util/function/Consumer;)V\" since=\"24\"/>\n\t\t<method name=\"forEachKey(JLjava/util/function/Consumer;)V\" since=\"24\"/>\n\t\t<method name=\"forEachKey(JLjava/util/function/Function;Ljava/util/function/Consumer;)V\" since=\"24\"/>\n\t\t<method name=\"forEachValue(JLjava/util/function/Consumer;)V\" since=\"24\"/>\n\t\t<method name=\"forEachValue(JLjava/util/function/Function;Ljava/util/function/Consumer;)V\" since=\"24\"/>\n\t\t<method name=\"keySet(Ljava/lang/Object;)Ljava/util/concurrent/ConcurrentHashMap$KeySetView;\" since=\"24\"/>\n\t\t<method name=\"keys()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"mappingCount()J\" since=\"24\"/>\n\t\t<method name=\"newKeySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView;\" since=\"24\"/>\n\t\t<method name=\"newKeySet(I)Ljava/util/concurrent/ConcurrentHashMap$KeySetView;\" since=\"24\"/>\n\t\t<method name=\"reduce(JLjava/util/function/BiFunction;Ljava/util/function/BiFunction;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"reduceEntries(JLjava/util/function/BiFunction;)Ljava/util/Map$Entry;\" since=\"24\"/>\n\t\t<method name=\"reduceEntries(JLjava/util/function/Function;Ljava/util/function/BiFunction;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"reduceEntriesToDouble(JLjava/util/function/ToDoubleFunction;DLjava/util/function/DoubleBinaryOperator;)D\" since=\"24\"/>\n\t\t<method name=\"reduceEntriesToInt(JLjava/util/function/ToIntFunction;ILjava/util/function/IntBinaryOperator;)I\" since=\"24\"/>\n\t\t<method name=\"reduceEntriesToLong(JLjava/util/function/ToLongFunction;JLjava/util/function/LongBinaryOperator;)J\" since=\"24\"/>\n\t\t<method name=\"reduceKeys(JLjava/util/function/BiFunction;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"reduceKeys(JLjava/util/function/Function;Ljava/util/function/BiFunction;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"reduceKeysToDouble(JLjava/util/function/ToDoubleFunction;DLjava/util/function/DoubleBinaryOperator;)D\" since=\"24\"/>\n\t\t<method name=\"reduceKeysToInt(JLjava/util/function/ToIntFunction;ILjava/util/function/IntBinaryOperator;)I\" since=\"24\"/>\n\t\t<method name=\"reduceKeysToLong(JLjava/util/function/ToLongFunction;JLjava/util/function/LongBinaryOperator;)J\" since=\"24\"/>\n\t\t<method name=\"reduceToDouble(JLjava/util/function/ToDoubleBiFunction;DLjava/util/function/DoubleBinaryOperator;)D\" since=\"24\"/>\n\t\t<method name=\"reduceToInt(JLjava/util/function/ToIntBiFunction;ILjava/util/function/IntBinaryOperator;)I\" since=\"24\"/>\n\t\t<method name=\"reduceToLong(JLjava/util/function/ToLongBiFunction;JLjava/util/function/LongBinaryOperator;)J\" since=\"24\"/>\n\t\t<method name=\"reduceValues(JLjava/util/function/BiFunction;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"reduceValues(JLjava/util/function/Function;Ljava/util/function/BiFunction;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"reduceValuesToDouble(JLjava/util/function/ToDoubleFunction;DLjava/util/function/DoubleBinaryOperator;)D\" since=\"24\"/>\n\t\t<method name=\"reduceValuesToInt(JLjava/util/function/ToIntFunction;ILjava/util/function/IntBinaryOperator;)I\" since=\"24\"/>\n\t\t<method name=\"reduceValuesToLong(JLjava/util/function/ToLongFunction;JLjava/util/function/LongBinaryOperator;)J\" since=\"24\"/>\n\t\t<method name=\"search(JLjava/util/function/BiFunction;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"searchEntries(JLjava/util/function/Function;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"searchKeys(JLjava/util/function/Function;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"searchValues(JLjava/util/function/Function;)Ljava/lang/Object;\" since=\"24\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ConcurrentHashMap$KeySetView\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Set\"/>\n\t\t<method name=\"getMappedValue()Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ConcurrentLinkedDeque\" since=\"21\">\n\t\t<extends name=\"java/util/AbstractCollection\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/util/Deque\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Collection;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ConcurrentLinkedQueue\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractQueue\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Collection;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ConcurrentMap\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Map\"/>\n\t\t<method name=\"putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"remove(Ljava/lang/Object;Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"replace(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"replace(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ConcurrentNavigableMap\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/NavigableMap\"/>\n\t\t<implements name=\"java/util/concurrent/ConcurrentMap\"/>\n\t\t<method name=\"descendingMap()Ljava/util/concurrent/ConcurrentNavigableMap;\"/>\n\t\t<method name=\"headMap(Ljava/lang/Object;)Ljava/util/concurrent/ConcurrentNavigableMap;\"/>\n\t\t<method name=\"headMap(Ljava/lang/Object;Z)Ljava/util/concurrent/ConcurrentNavigableMap;\"/>\n\t\t<method name=\"keySet()Ljava/util/NavigableSet;\"/>\n\t\t<method name=\"subMap(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/concurrent/ConcurrentNavigableMap;\"/>\n\t\t<method name=\"subMap(Ljava/lang/Object;ZLjava/lang/Object;Z)Ljava/util/concurrent/ConcurrentNavigableMap;\"/>\n\t\t<method name=\"tailMap(Ljava/lang/Object;)Ljava/util/concurrent/ConcurrentNavigableMap;\"/>\n\t\t<method name=\"tailMap(Ljava/lang/Object;Z)Ljava/util/concurrent/ConcurrentNavigableMap;\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ConcurrentSkipListMap\" since=\"9\">\n\t\t<extends name=\"java/util/AbstractMap\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"java/util/concurrent/ConcurrentNavigableMap\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Comparator;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Map;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/SortedMap;)V\"/>\n\t\t<method name=\"clone()Ljava/util/concurrent/ConcurrentSkipListMap;\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ConcurrentSkipListSet\" since=\"9\">\n\t\t<extends name=\"java/util/AbstractSet\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"java/util/NavigableSet\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Collection;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Comparator;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/SortedSet;)V\"/>\n\t\t<method name=\"clone()Ljava/util/concurrent/ConcurrentSkipListSet;\"/>\n\t\t<method name=\"headSet(Ljava/lang/Object;)Ljava/util/NavigableSet;\"/>\n\t\t<method name=\"subSet(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/NavigableSet;\"/>\n\t\t<method name=\"tailSet(Ljava/lang/Object;)Ljava/util/NavigableSet;\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/CopyOnWriteArrayList\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"java/util/List\"/>\n\t\t<implements name=\"java/util/RandomAccess\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Collection;)V\"/>\n\t\t<method name=\"&lt;init>([Ljava/lang/Object;)V\"/>\n\t\t<method name=\"addAllAbsent(Ljava/util/Collection;)I\"/>\n\t\t<method name=\"addIfAbsent(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"indexOf(Ljava/lang/Object;I)I\"/>\n\t\t<method name=\"lastIndexOf(Ljava/lang/Object;I)I\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/CopyOnWriteArraySet\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractSet\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Collection;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/CountDownLatch\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"await()V\"/>\n\t\t<method name=\"await(JLjava/util/concurrent/TimeUnit;)Z\"/>\n\t\t<method name=\"countDown()V\"/>\n\t\t<method name=\"getCount()J\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/CountedCompleter\" since=\"24\">\n\t\t<extends name=\"java/util/concurrent/ForkJoinTask\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/concurrent/CountedCompleter;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/concurrent/CountedCompleter;I)V\"/>\n\t\t<method name=\"addToPendingCount(I)V\"/>\n\t\t<method name=\"compareAndSetPendingCount(II)Z\"/>\n\t\t<method name=\"compute()V\"/>\n\t\t<method name=\"decrementPendingCountUnlessZero()I\"/>\n\t\t<method name=\"firstComplete()Ljava/util/concurrent/CountedCompleter;\"/>\n\t\t<method name=\"getCompleter()Ljava/util/concurrent/CountedCompleter;\"/>\n\t\t<method name=\"getPendingCount()I\"/>\n\t\t<method name=\"getRoot()Ljava/util/concurrent/CountedCompleter;\"/>\n\t\t<method name=\"helpComplete(I)V\"/>\n\t\t<method name=\"nextComplete()Ljava/util/concurrent/CountedCompleter;\"/>\n\t\t<method name=\"onCompletion(Ljava/util/concurrent/CountedCompleter;)V\"/>\n\t\t<method name=\"onExceptionalCompletion(Ljava/lang/Throwable;Ljava/util/concurrent/CountedCompleter;)Z\"/>\n\t\t<method name=\"propagateCompletion()V\"/>\n\t\t<method name=\"quietlyCompleteRoot()V\"/>\n\t\t<method name=\"setPendingCount(I)V\"/>\n\t\t<method name=\"tryComplete()V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/CyclicBarrier\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/Runnable;)V\"/>\n\t\t<method name=\"await()I\"/>\n\t\t<method name=\"await(JLjava/util/concurrent/TimeUnit;)I\"/>\n\t\t<method name=\"getNumberWaiting()I\"/>\n\t\t<method name=\"getParties()I\"/>\n\t\t<method name=\"isBroken()Z\"/>\n\t\t<method name=\"reset()V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/DelayQueue\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractQueue\"/>\n\t\t<implements name=\"java/util/concurrent/BlockingQueue\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Collection;)V\"/>\n\t\t<method name=\"add(Ljava/util/concurrent/Delayed;)Z\"/>\n\t\t<method name=\"offer(Ljava/util/concurrent/Delayed;)Z\"/>\n\t\t<method name=\"offer(Ljava/util/concurrent/Delayed;JLjava/util/concurrent/TimeUnit;)Z\"/>\n\t\t<method name=\"peek()Ljava/util/concurrent/Delayed;\"/>\n\t\t<method name=\"poll()Ljava/util/concurrent/Delayed;\"/>\n\t\t<method name=\"poll(JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/Delayed;\"/>\n\t\t<method name=\"put(Ljava/util/concurrent/Delayed;)V\"/>\n\t\t<method name=\"take()Ljava/util/concurrent/Delayed;\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/Delayed\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Comparable\"/>\n\t\t<method name=\"getDelay(Ljava/util/concurrent/TimeUnit;)J\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/Exchanger\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"exchange(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"exchange(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ExecutionException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/Executor\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"execute(Ljava/lang/Runnable;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ExecutorCompletionService\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/concurrent/CompletionService\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/concurrent/Executor;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/concurrent/Executor;Ljava/util/concurrent/BlockingQueue;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ExecutorService\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/concurrent/Executor\"/>\n\t\t<method name=\"awaitTermination(JLjava/util/concurrent/TimeUnit;)Z\"/>\n\t\t<method name=\"invokeAll(Ljava/util/Collection;)Ljava/util/List;\"/>\n\t\t<method name=\"invokeAll(Ljava/util/Collection;JLjava/util/concurrent/TimeUnit;)Ljava/util/List;\"/>\n\t\t<method name=\"invokeAny(Ljava/util/Collection;)Ljava/lang/Object;\"/>\n\t\t<method name=\"invokeAny(Ljava/util/Collection;JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;\"/>\n\t\t<method name=\"isShutdown()Z\"/>\n\t\t<method name=\"isTerminated()Z\"/>\n\t\t<method name=\"shutdown()V\"/>\n\t\t<method name=\"shutdownNow()Ljava/util/List;\"/>\n\t\t<method name=\"submit(Ljava/lang/Runnable;)Ljava/util/concurrent/Future;\"/>\n\t\t<method name=\"submit(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/Future;\"/>\n\t\t<method name=\"submit(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Future;\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/Executors\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"callable(Ljava/lang/Runnable;)Ljava/util/concurrent/Callable;\"/>\n\t\t<method name=\"callable(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/Callable;\"/>\n\t\t<method name=\"callable(Ljava/security/PrivilegedAction;)Ljava/util/concurrent/Callable;\"/>\n\t\t<method name=\"callable(Ljava/security/PrivilegedExceptionAction;)Ljava/util/concurrent/Callable;\"/>\n\t\t<method name=\"defaultThreadFactory()Ljava/util/concurrent/ThreadFactory;\"/>\n\t\t<method name=\"newCachedThreadPool()Ljava/util/concurrent/ExecutorService;\"/>\n\t\t<method name=\"newCachedThreadPool(Ljava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ExecutorService;\"/>\n\t\t<method name=\"newFixedThreadPool(I)Ljava/util/concurrent/ExecutorService;\"/>\n\t\t<method name=\"newFixedThreadPool(ILjava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ExecutorService;\"/>\n\t\t<method name=\"newScheduledThreadPool(I)Ljava/util/concurrent/ScheduledExecutorService;\"/>\n\t\t<method name=\"newScheduledThreadPool(ILjava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ScheduledExecutorService;\"/>\n\t\t<method name=\"newSingleThreadExecutor()Ljava/util/concurrent/ExecutorService;\"/>\n\t\t<method name=\"newSingleThreadExecutor(Ljava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ExecutorService;\"/>\n\t\t<method name=\"newSingleThreadScheduledExecutor()Ljava/util/concurrent/ScheduledExecutorService;\"/>\n\t\t<method name=\"newSingleThreadScheduledExecutor(Ljava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ScheduledExecutorService;\"/>\n\t\t<method name=\"newWorkStealingPool()Ljava/util/concurrent/ExecutorService;\" since=\"24\"/>\n\t\t<method name=\"newWorkStealingPool(I)Ljava/util/concurrent/ExecutorService;\" since=\"24\"/>\n\t\t<method name=\"privilegedCallable(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Callable;\"/>\n\t\t<method name=\"privilegedCallableUsingCurrentClassLoader(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Callable;\"/>\n\t\t<method name=\"privilegedThreadFactory()Ljava/util/concurrent/ThreadFactory;\"/>\n\t\t<method name=\"unconfigurableExecutorService(Ljava/util/concurrent/ExecutorService;)Ljava/util/concurrent/ExecutorService;\"/>\n\t\t<method name=\"unconfigurableScheduledExecutorService(Ljava/util/concurrent/ScheduledExecutorService;)Ljava/util/concurrent/ScheduledExecutorService;\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/Flow\" since=\"30\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"defaultBufferSize()I\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/Flow$Processor\" since=\"30\">\n\t\t<implements name=\"java/util/concurrent/Flow$Publisher\"/>\n\t\t<implements name=\"java/util/concurrent/Flow$Subscriber\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/Flow$Publisher\" since=\"30\">\n\t\t<method name=\"subscribe(Ljava/util/concurrent/Flow$Subscriber;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/Flow$Subscriber\" since=\"30\">\n\t\t<method name=\"onComplete()V\"/>\n\t\t<method name=\"onError(Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"onNext(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"onSubscribe(Ljava/util/concurrent/Flow$Subscription;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/Flow$Subscription\" since=\"30\">\n\t\t<method name=\"cancel()V\"/>\n\t\t<method name=\"request(J)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ForkJoinPool\" since=\"21\">\n\t\t<extends name=\"java/util/concurrent/AbstractExecutorService\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/util/concurrent/ForkJoinPool$ForkJoinWorkerThreadFactory;Ljava/lang/Thread$UncaughtExceptionHandler;Z)V\"/>\n\t\t<method name=\"awaitQuiescence(JLjava/util/concurrent/TimeUnit;)Z\"/>\n\t\t<method name=\"commonPool()Ljava/util/concurrent/ForkJoinPool;\" since=\"24\"/>\n\t\t<method name=\"drainTasksTo(Ljava/util/Collection;)I\"/>\n\t\t<method name=\"execute(Ljava/util/concurrent/ForkJoinTask;)V\"/>\n\t\t<method name=\"getActiveThreadCount()I\"/>\n\t\t<method name=\"getAsyncMode()Z\"/>\n\t\t<method name=\"getCommonPoolParallelism()I\" since=\"24\"/>\n\t\t<method name=\"getFactory()Ljava/util/concurrent/ForkJoinPool$ForkJoinWorkerThreadFactory;\"/>\n\t\t<method name=\"getParallelism()I\"/>\n\t\t<method name=\"getPoolSize()I\"/>\n\t\t<method name=\"getQueuedSubmissionCount()I\"/>\n\t\t<method name=\"getQueuedTaskCount()J\"/>\n\t\t<method name=\"getRunningThreadCount()I\"/>\n\t\t<method name=\"getStealCount()J\"/>\n\t\t<method name=\"getUncaughtExceptionHandler()Ljava/lang/Thread$UncaughtExceptionHandler;\"/>\n\t\t<method name=\"hasQueuedSubmissions()Z\"/>\n\t\t<method name=\"invoke(Ljava/util/concurrent/ForkJoinTask;)Ljava/lang/Object;\"/>\n\t\t<method name=\"isQuiescent()Z\"/>\n\t\t<method name=\"isTerminating()Z\"/>\n\t\t<method name=\"managedBlock(Ljava/util/concurrent/ForkJoinPool$ManagedBlocker;)V\"/>\n\t\t<method name=\"pollSubmission()Ljava/util/concurrent/ForkJoinTask;\"/>\n\t\t<method name=\"submit(Ljava/lang/Runnable;)Ljava/util/concurrent/ForkJoinTask;\"/>\n\t\t<method name=\"submit(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/ForkJoinTask;\"/>\n\t\t<method name=\"submit(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/ForkJoinTask;\"/>\n\t\t<method name=\"submit(Ljava/util/concurrent/ForkJoinTask;)Ljava/util/concurrent/ForkJoinTask;\"/>\n\t\t<field name=\"defaultForkJoinWorkerThreadFactory\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ForkJoinPool$ForkJoinWorkerThreadFactory\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"newThread(Ljava/util/concurrent/ForkJoinPool;)Ljava/util/concurrent/ForkJoinWorkerThread;\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ForkJoinPool$ManagedBlocker\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"block()Z\"/>\n\t\t<method name=\"isReleasable()Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ForkJoinTask\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/util/concurrent/Future\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"adapt(Ljava/lang/Runnable;)Ljava/util/concurrent/ForkJoinTask;\"/>\n\t\t<method name=\"adapt(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/ForkJoinTask;\"/>\n\t\t<method name=\"adapt(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/ForkJoinTask;\"/>\n\t\t<method name=\"compareAndSetForkJoinTaskTag(SS)Z\" since=\"24\"/>\n\t\t<method name=\"complete(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"completeExceptionally(Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"exec()Z\"/>\n\t\t<method name=\"fork()Ljava/util/concurrent/ForkJoinTask;\"/>\n\t\t<method name=\"getException()Ljava/lang/Throwable;\"/>\n\t\t<method name=\"getForkJoinTaskTag()S\" since=\"24\"/>\n\t\t<method name=\"getPool()Ljava/util/concurrent/ForkJoinPool;\"/>\n\t\t<method name=\"getQueuedTaskCount()I\"/>\n\t\t<method name=\"getRawResult()Ljava/lang/Object;\"/>\n\t\t<method name=\"getSurplusQueuedTaskCount()I\"/>\n\t\t<method name=\"helpQuiesce()V\"/>\n\t\t<method name=\"inForkJoinPool()Z\"/>\n\t\t<method name=\"invoke()Ljava/lang/Object;\"/>\n\t\t<method name=\"invokeAll(Ljava/util/Collection;)Ljava/util/Collection;\"/>\n\t\t<method name=\"invokeAll(Ljava/util/concurrent/ForkJoinTask;Ljava/util/concurrent/ForkJoinTask;)V\"/>\n\t\t<method name=\"invokeAll([Ljava/util/concurrent/ForkJoinTask;)V\"/>\n\t\t<method name=\"isCompletedAbnormally()Z\"/>\n\t\t<method name=\"isCompletedNormally()Z\"/>\n\t\t<method name=\"join()Ljava/lang/Object;\"/>\n\t\t<method name=\"peekNextLocalTask()Ljava/util/concurrent/ForkJoinTask;\"/>\n\t\t<method name=\"pollNextLocalTask()Ljava/util/concurrent/ForkJoinTask;\"/>\n\t\t<method name=\"pollTask()Ljava/util/concurrent/ForkJoinTask;\"/>\n\t\t<method name=\"quietlyComplete()V\" since=\"24\"/>\n\t\t<method name=\"quietlyInvoke()V\"/>\n\t\t<method name=\"quietlyJoin()V\"/>\n\t\t<method name=\"reinitialize()V\"/>\n\t\t<method name=\"setForkJoinTaskTag(S)S\" since=\"24\"/>\n\t\t<method name=\"setRawResult(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"tryUnfork()Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ForkJoinWorkerThread\" since=\"21\">\n\t\t<extends name=\"java/lang/Thread\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/concurrent/ForkJoinPool;)V\"/>\n\t\t<method name=\"getPool()Ljava/util/concurrent/ForkJoinPool;\"/>\n\t\t<method name=\"getPoolIndex()I\"/>\n\t\t<method name=\"onStart()V\"/>\n\t\t<method name=\"onTermination(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/Future\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"cancel(Z)Z\"/>\n\t\t<method name=\"get()Ljava/lang/Object;\"/>\n\t\t<method name=\"get(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;\"/>\n\t\t<method name=\"isCancelled()Z\"/>\n\t\t<method name=\"isDone()Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/FutureTask\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Runnable\" removed=\"9\"/>\n\t\t<implements name=\"java/util/concurrent/Future\" removed=\"9\"/>\n\t\t<implements name=\"java/util/concurrent/RunnableFuture\" since=\"9\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Runnable;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/concurrent/Callable;)V\"/>\n\t\t<method name=\"done()V\"/>\n\t\t<method name=\"runAndReset()Z\"/>\n\t\t<method name=\"set(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"setException(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/LinkedBlockingDeque\" since=\"9\">\n\t\t<extends name=\"java/util/AbstractQueue\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/util/concurrent/BlockingDeque\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Collection;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/LinkedBlockingQueue\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractQueue\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/util/concurrent/BlockingQueue\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Collection;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/LinkedTransferQueue\" since=\"21\">\n\t\t<extends name=\"java/util/AbstractQueue\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/util/concurrent/TransferQueue\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Collection;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/Phaser\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/concurrent/Phaser;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/concurrent/Phaser;I)V\"/>\n\t\t<method name=\"arrive()I\"/>\n\t\t<method name=\"arriveAndAwaitAdvance()I\"/>\n\t\t<method name=\"arriveAndDeregister()I\"/>\n\t\t<method name=\"awaitAdvance(I)I\"/>\n\t\t<method name=\"awaitAdvanceInterruptibly(I)I\"/>\n\t\t<method name=\"awaitAdvanceInterruptibly(IJLjava/util/concurrent/TimeUnit;)I\"/>\n\t\t<method name=\"bulkRegister(I)I\"/>\n\t\t<method name=\"forceTermination()V\"/>\n\t\t<method name=\"getArrivedParties()I\"/>\n\t\t<method name=\"getParent()Ljava/util/concurrent/Phaser;\"/>\n\t\t<method name=\"getPhase()I\"/>\n\t\t<method name=\"getRegisteredParties()I\"/>\n\t\t<method name=\"getRoot()Ljava/util/concurrent/Phaser;\"/>\n\t\t<method name=\"getUnarrivedParties()I\"/>\n\t\t<method name=\"isTerminated()Z\"/>\n\t\t<method name=\"onAdvance(II)Z\"/>\n\t\t<method name=\"register()I\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/PriorityBlockingQueue\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractQueue\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/util/concurrent/BlockingQueue\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/util/Comparator;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Collection;)V\"/>\n\t\t<method name=\"comparator()Ljava/util/Comparator;\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/RecursiveAction\" since=\"21\">\n\t\t<extends name=\"java/util/concurrent/ForkJoinTask\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"compute()V\"/>\n\t\t<method name=\"getRawResult()Ljava/lang/Void;\"/>\n\t\t<method name=\"setRawResult(Ljava/lang/Void;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/RecursiveTask\" since=\"21\">\n\t\t<extends name=\"java/util/concurrent/ForkJoinTask\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"compute()Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/RejectedExecutionException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/RejectedExecutionHandler\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"rejectedExecution(Ljava/lang/Runnable;Ljava/util/concurrent/ThreadPoolExecutor;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/RunnableFuture\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Runnable\"/>\n\t\t<implements name=\"java/util/concurrent/Future\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/RunnableScheduledFuture\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/concurrent/RunnableFuture\"/>\n\t\t<implements name=\"java/util/concurrent/ScheduledFuture\"/>\n\t\t<method name=\"isPeriodic()Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ScheduledExecutorService\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/concurrent/ExecutorService\"/>\n\t\t<method name=\"schedule(Ljava/lang/Runnable;JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;\"/>\n\t\t<method name=\"schedule(Ljava/util/concurrent/Callable;JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;\"/>\n\t\t<method name=\"scheduleAtFixedRate(Ljava/lang/Runnable;JJLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;\"/>\n\t\t<method name=\"scheduleWithFixedDelay(Ljava/lang/Runnable;JJLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ScheduledFuture\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/concurrent/Delayed\"/>\n\t\t<implements name=\"java/util/concurrent/Future\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ScheduledThreadPoolExecutor\" since=\"1\">\n\t\t<extends name=\"java/util/concurrent/ThreadPoolExecutor\"/>\n\t\t<implements name=\"java/util/concurrent/ScheduledExecutorService\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/util/concurrent/RejectedExecutionHandler;)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/util/concurrent/ThreadFactory;)V\"/>\n\t\t<method name=\"&lt;init>(ILjava/util/concurrent/ThreadFactory;Ljava/util/concurrent/RejectedExecutionHandler;)V\"/>\n\t\t<method name=\"decorateTask(Ljava/lang/Runnable;Ljava/util/concurrent/RunnableScheduledFuture;)Ljava/util/concurrent/RunnableScheduledFuture;\" since=\"9\"/>\n\t\t<method name=\"decorateTask(Ljava/util/concurrent/Callable;Ljava/util/concurrent/RunnableScheduledFuture;)Ljava/util/concurrent/RunnableScheduledFuture;\" since=\"9\"/>\n\t\t<method name=\"getContinueExistingPeriodicTasksAfterShutdownPolicy()Z\"/>\n\t\t<method name=\"getExecuteExistingDelayedTasksAfterShutdownPolicy()Z\"/>\n\t\t<method name=\"getRemoveOnCancelPolicy()Z\" since=\"21\"/>\n\t\t<method name=\"setContinueExistingPeriodicTasksAfterShutdownPolicy(Z)V\"/>\n\t\t<method name=\"setExecuteExistingDelayedTasksAfterShutdownPolicy(Z)V\"/>\n\t\t<method name=\"setRemoveOnCancelPolicy(Z)V\" since=\"21\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/Semaphore\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(IZ)V\"/>\n\t\t<method name=\"acquire()V\"/>\n\t\t<method name=\"acquire(I)V\"/>\n\t\t<method name=\"acquireUninterruptibly()V\"/>\n\t\t<method name=\"acquireUninterruptibly(I)V\"/>\n\t\t<method name=\"availablePermits()I\"/>\n\t\t<method name=\"drainPermits()I\"/>\n\t\t<method name=\"getQueueLength()I\"/>\n\t\t<method name=\"getQueuedThreads()Ljava/util/Collection;\"/>\n\t\t<method name=\"hasQueuedThreads()Z\"/>\n\t\t<method name=\"isFair()Z\"/>\n\t\t<method name=\"reducePermits(I)V\"/>\n\t\t<method name=\"release()V\"/>\n\t\t<method name=\"release(I)V\"/>\n\t\t<method name=\"tryAcquire()Z\"/>\n\t\t<method name=\"tryAcquire(I)Z\"/>\n\t\t<method name=\"tryAcquire(IJLjava/util/concurrent/TimeUnit;)Z\"/>\n\t\t<method name=\"tryAcquire(JLjava/util/concurrent/TimeUnit;)Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/SynchronousQueue\" since=\"1\">\n\t\t<extends name=\"java/util/AbstractQueue\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/util/concurrent/BlockingQueue\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Z)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ThreadFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ThreadLocalRandom\" since=\"21\">\n\t\t<extends name=\"java/util/Random\"/>\n\t\t<method name=\"current()Ljava/util/concurrent/ThreadLocalRandom;\"/>\n\t\t<method name=\"nextDouble(D)D\"/>\n\t\t<method name=\"nextDouble(DD)D\"/>\n\t\t<method name=\"nextInt(II)I\"/>\n\t\t<method name=\"nextLong(J)J\"/>\n\t\t<method name=\"nextLong(JJ)J\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ThreadPoolExecutor\" since=\"1\">\n\t\t<extends name=\"java/util/concurrent/AbstractExecutorService\"/>\n\t\t<method name=\"&lt;init>(IIJLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/BlockingQueue;)V\"/>\n\t\t<method name=\"&lt;init>(IIJLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/BlockingQueue;Ljava/util/concurrent/RejectedExecutionHandler;)V\"/>\n\t\t<method name=\"&lt;init>(IIJLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/BlockingQueue;Ljava/util/concurrent/ThreadFactory;)V\"/>\n\t\t<method name=\"&lt;init>(IIJLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/BlockingQueue;Ljava/util/concurrent/ThreadFactory;Ljava/util/concurrent/RejectedExecutionHandler;)V\"/>\n\t\t<method name=\"afterExecute(Ljava/lang/Runnable;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"allowCoreThreadTimeOut(Z)V\" since=\"9\"/>\n\t\t<method name=\"allowsCoreThreadTimeOut()Z\" since=\"9\"/>\n\t\t<method name=\"beforeExecute(Ljava/lang/Thread;Ljava/lang/Runnable;)V\"/>\n\t\t<method name=\"getActiveCount()I\"/>\n\t\t<method name=\"getCompletedTaskCount()J\"/>\n\t\t<method name=\"getCorePoolSize()I\"/>\n\t\t<method name=\"getKeepAliveTime(Ljava/util/concurrent/TimeUnit;)J\"/>\n\t\t<method name=\"getLargestPoolSize()I\"/>\n\t\t<method name=\"getMaximumPoolSize()I\"/>\n\t\t<method name=\"getPoolSize()I\"/>\n\t\t<method name=\"getQueue()Ljava/util/concurrent/BlockingQueue;\"/>\n\t\t<method name=\"getRejectedExecutionHandler()Ljava/util/concurrent/RejectedExecutionHandler;\"/>\n\t\t<method name=\"getTaskCount()J\"/>\n\t\t<method name=\"getThreadFactory()Ljava/util/concurrent/ThreadFactory;\"/>\n\t\t<method name=\"isTerminating()Z\"/>\n\t\t<method name=\"prestartAllCoreThreads()I\"/>\n\t\t<method name=\"prestartCoreThread()Z\"/>\n\t\t<method name=\"purge()V\"/>\n\t\t<method name=\"remove(Ljava/lang/Runnable;)Z\"/>\n\t\t<method name=\"setCorePoolSize(I)V\"/>\n\t\t<method name=\"setKeepAliveTime(JLjava/util/concurrent/TimeUnit;)V\"/>\n\t\t<method name=\"setMaximumPoolSize(I)V\"/>\n\t\t<method name=\"setRejectedExecutionHandler(Ljava/util/concurrent/RejectedExecutionHandler;)V\"/>\n\t\t<method name=\"setThreadFactory(Ljava/util/concurrent/ThreadFactory;)V\"/>\n\t\t<method name=\"terminated()V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ThreadPoolExecutor$AbortPolicy\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/concurrent/RejectedExecutionHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ThreadPoolExecutor$CallerRunsPolicy\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/concurrent/RejectedExecutionHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ThreadPoolExecutor$DiscardOldestPolicy\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/concurrent/RejectedExecutionHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/ThreadPoolExecutor$DiscardPolicy\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/concurrent/RejectedExecutionHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/TimeUnit\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"convert(JLjava/util/concurrent/TimeUnit;)J\"/>\n\t\t<method name=\"sleep(J)V\"/>\n\t\t<method name=\"timedJoin(Ljava/lang/Thread;J)V\"/>\n\t\t<method name=\"timedWait(Ljava/lang/Object;J)V\"/>\n\t\t<method name=\"toDays(J)J\" since=\"9\"/>\n\t\t<method name=\"toHours(J)J\" since=\"9\"/>\n\t\t<method name=\"toMicros(J)J\"/>\n\t\t<method name=\"toMillis(J)J\"/>\n\t\t<method name=\"toMinutes(J)J\" since=\"9\"/>\n\t\t<method name=\"toNanos(J)J\"/>\n\t\t<method name=\"toSeconds(J)J\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/util/concurrent/TimeUnit;\"/>\n\t\t<method name=\"values()[Ljava/util/concurrent/TimeUnit;\"/>\n\t\t<field name=\"DAYS\" since=\"9\"/>\n\t\t<field name=\"HOURS\" since=\"9\"/>\n\t\t<field name=\"MICROSECONDS\"/>\n\t\t<field name=\"MILLISECONDS\"/>\n\t\t<field name=\"MINUTES\" since=\"9\"/>\n\t\t<field name=\"NANOSECONDS\"/>\n\t\t<field name=\"SECONDS\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/TimeoutException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/TransferQueue\" since=\"21\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/concurrent/BlockingQueue\"/>\n\t\t<method name=\"getWaitingConsumerCount()I\"/>\n\t\t<method name=\"hasWaitingConsumer()Z\"/>\n\t\t<method name=\"transfer(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"tryTransfer(Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"tryTransfer(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/atomic/AtomicBoolean\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Z)V\"/>\n\t\t<method name=\"compareAndSet(ZZ)Z\"/>\n\t\t<method name=\"get()Z\"/>\n\t\t<method name=\"getAndSet(Z)Z\"/>\n\t\t<method name=\"lazySet(Z)V\" since=\"9\"/>\n\t\t<method name=\"set(Z)V\"/>\n\t\t<method name=\"weakCompareAndSet(ZZ)Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/atomic/AtomicInteger\" since=\"1\">\n\t\t<extends name=\"java/lang/Number\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"accumulateAndGet(ILjava/util/function/IntBinaryOperator;)I\" since=\"24\"/>\n\t\t<method name=\"addAndGet(I)I\"/>\n\t\t<method name=\"compareAndSet(II)Z\"/>\n\t\t<method name=\"decrementAndGet()I\"/>\n\t\t<method name=\"get()I\"/>\n\t\t<method name=\"getAndAccumulate(ILjava/util/function/IntBinaryOperator;)I\" since=\"24\"/>\n\t\t<method name=\"getAndAdd(I)I\"/>\n\t\t<method name=\"getAndDecrement()I\"/>\n\t\t<method name=\"getAndIncrement()I\"/>\n\t\t<method name=\"getAndSet(I)I\"/>\n\t\t<method name=\"getAndUpdate(Ljava/util/function/IntUnaryOperator;)I\" since=\"24\"/>\n\t\t<method name=\"incrementAndGet()I\"/>\n\t\t<method name=\"lazySet(I)V\" since=\"9\"/>\n\t\t<method name=\"set(I)V\"/>\n\t\t<method name=\"updateAndGet(Ljava/util/function/IntUnaryOperator;)I\" since=\"24\"/>\n\t\t<method name=\"weakCompareAndSet(II)Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/atomic/AtomicIntegerArray\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>([I)V\"/>\n\t\t<method name=\"accumulateAndGet(IILjava/util/function/IntBinaryOperator;)I\" since=\"24\"/>\n\t\t<method name=\"addAndGet(II)I\"/>\n\t\t<method name=\"compareAndSet(III)Z\"/>\n\t\t<method name=\"decrementAndGet(I)I\"/>\n\t\t<method name=\"get(I)I\"/>\n\t\t<method name=\"getAndAccumulate(IILjava/util/function/IntBinaryOperator;)I\" since=\"24\"/>\n\t\t<method name=\"getAndAdd(II)I\"/>\n\t\t<method name=\"getAndDecrement(I)I\"/>\n\t\t<method name=\"getAndIncrement(I)I\"/>\n\t\t<method name=\"getAndSet(II)I\"/>\n\t\t<method name=\"getAndUpdate(ILjava/util/function/IntUnaryOperator;)I\" since=\"24\"/>\n\t\t<method name=\"incrementAndGet(I)I\"/>\n\t\t<method name=\"lazySet(II)V\" since=\"9\"/>\n\t\t<method name=\"length()I\"/>\n\t\t<method name=\"set(II)V\"/>\n\t\t<method name=\"updateAndGet(ILjava/util/function/IntUnaryOperator;)I\" since=\"24\"/>\n\t\t<method name=\"weakCompareAndSet(III)Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/atomic/AtomicIntegerFieldUpdater\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"accumulateAndGet(Ljava/lang/Object;ILjava/util/function/IntBinaryOperator;)I\" since=\"24\"/>\n\t\t<method name=\"addAndGet(Ljava/lang/Object;I)I\"/>\n\t\t<method name=\"compareAndSet(Ljava/lang/Object;II)Z\"/>\n\t\t<method name=\"decrementAndGet(Ljava/lang/Object;)I\"/>\n\t\t<method name=\"get(Ljava/lang/Object;)I\"/>\n\t\t<method name=\"getAndAccumulate(Ljava/lang/Object;ILjava/util/function/IntBinaryOperator;)I\" since=\"24\"/>\n\t\t<method name=\"getAndAdd(Ljava/lang/Object;I)I\"/>\n\t\t<method name=\"getAndDecrement(Ljava/lang/Object;)I\"/>\n\t\t<method name=\"getAndIncrement(Ljava/lang/Object;)I\"/>\n\t\t<method name=\"getAndSet(Ljava/lang/Object;I)I\"/>\n\t\t<method name=\"getAndUpdate(Ljava/lang/Object;Ljava/util/function/IntUnaryOperator;)I\" since=\"24\"/>\n\t\t<method name=\"incrementAndGet(Ljava/lang/Object;)I\"/>\n\t\t<method name=\"lazySet(Ljava/lang/Object;I)V\" since=\"9\"/>\n\t\t<method name=\"newUpdater(Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater;\"/>\n\t\t<method name=\"set(Ljava/lang/Object;I)V\"/>\n\t\t<method name=\"updateAndGet(Ljava/lang/Object;Ljava/util/function/IntUnaryOperator;)I\" since=\"24\"/>\n\t\t<method name=\"weakCompareAndSet(Ljava/lang/Object;II)Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/atomic/AtomicLong\" since=\"1\">\n\t\t<extends name=\"java/lang/Number\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(J)V\"/>\n\t\t<method name=\"accumulateAndGet(JLjava/util/function/LongBinaryOperator;)J\" since=\"24\"/>\n\t\t<method name=\"addAndGet(J)J\"/>\n\t\t<method name=\"compareAndSet(JJ)Z\"/>\n\t\t<method name=\"decrementAndGet()J\"/>\n\t\t<method name=\"get()J\"/>\n\t\t<method name=\"getAndAccumulate(JLjava/util/function/LongBinaryOperator;)J\" since=\"24\"/>\n\t\t<method name=\"getAndAdd(J)J\"/>\n\t\t<method name=\"getAndDecrement()J\"/>\n\t\t<method name=\"getAndIncrement()J\"/>\n\t\t<method name=\"getAndSet(J)J\"/>\n\t\t<method name=\"getAndUpdate(Ljava/util/function/LongUnaryOperator;)J\" since=\"24\"/>\n\t\t<method name=\"incrementAndGet()J\"/>\n\t\t<method name=\"lazySet(J)V\" since=\"9\"/>\n\t\t<method name=\"set(J)V\"/>\n\t\t<method name=\"updateAndGet(Ljava/util/function/LongUnaryOperator;)J\" since=\"24\"/>\n\t\t<method name=\"weakCompareAndSet(JJ)Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/atomic/AtomicLongArray\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>([J)V\"/>\n\t\t<method name=\"accumulateAndGet(IJLjava/util/function/LongBinaryOperator;)J\" since=\"24\"/>\n\t\t<method name=\"addAndGet(IJ)J\"/>\n\t\t<method name=\"compareAndSet(IJJ)Z\"/>\n\t\t<method name=\"decrementAndGet(I)J\"/>\n\t\t<method name=\"get(I)J\"/>\n\t\t<method name=\"getAndAccumulate(IJLjava/util/function/LongBinaryOperator;)J\" since=\"24\"/>\n\t\t<method name=\"getAndAdd(IJ)J\"/>\n\t\t<method name=\"getAndDecrement(I)J\"/>\n\t\t<method name=\"getAndIncrement(I)J\"/>\n\t\t<method name=\"getAndSet(IJ)J\"/>\n\t\t<method name=\"getAndUpdate(ILjava/util/function/LongUnaryOperator;)J\" since=\"24\"/>\n\t\t<method name=\"incrementAndGet(I)J\"/>\n\t\t<method name=\"lazySet(IJ)V\" since=\"9\"/>\n\t\t<method name=\"length()I\"/>\n\t\t<method name=\"set(IJ)V\"/>\n\t\t<method name=\"updateAndGet(ILjava/util/function/LongUnaryOperator;)J\" since=\"24\"/>\n\t\t<method name=\"weakCompareAndSet(IJJ)Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/atomic/AtomicLongFieldUpdater\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"accumulateAndGet(Ljava/lang/Object;JLjava/util/function/LongBinaryOperator;)J\" since=\"24\"/>\n\t\t<method name=\"addAndGet(Ljava/lang/Object;J)J\"/>\n\t\t<method name=\"compareAndSet(Ljava/lang/Object;JJ)Z\"/>\n\t\t<method name=\"decrementAndGet(Ljava/lang/Object;)J\"/>\n\t\t<method name=\"get(Ljava/lang/Object;)J\"/>\n\t\t<method name=\"getAndAccumulate(Ljava/lang/Object;JLjava/util/function/LongBinaryOperator;)J\" since=\"24\"/>\n\t\t<method name=\"getAndAdd(Ljava/lang/Object;J)J\"/>\n\t\t<method name=\"getAndDecrement(Ljava/lang/Object;)J\"/>\n\t\t<method name=\"getAndIncrement(Ljava/lang/Object;)J\"/>\n\t\t<method name=\"getAndSet(Ljava/lang/Object;J)J\"/>\n\t\t<method name=\"getAndUpdate(Ljava/lang/Object;Ljava/util/function/LongUnaryOperator;)J\" since=\"24\"/>\n\t\t<method name=\"incrementAndGet(Ljava/lang/Object;)J\"/>\n\t\t<method name=\"lazySet(Ljava/lang/Object;J)V\" since=\"9\"/>\n\t\t<method name=\"newUpdater(Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicLongFieldUpdater;\"/>\n\t\t<method name=\"set(Ljava/lang/Object;J)V\"/>\n\t\t<method name=\"updateAndGet(Ljava/lang/Object;Ljava/util/function/LongUnaryOperator;)J\" since=\"24\"/>\n\t\t<method name=\"weakCompareAndSet(Ljava/lang/Object;JJ)Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/atomic/AtomicMarkableReference\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;Z)V\"/>\n\t\t<method name=\"attemptMark(Ljava/lang/Object;Z)Z\"/>\n\t\t<method name=\"compareAndSet(Ljava/lang/Object;Ljava/lang/Object;ZZ)Z\"/>\n\t\t<method name=\"get([Z)Ljava/lang/Object;\"/>\n\t\t<method name=\"getReference()Ljava/lang/Object;\"/>\n\t\t<method name=\"isMarked()Z\"/>\n\t\t<method name=\"set(Ljava/lang/Object;Z)V\"/>\n\t\t<method name=\"weakCompareAndSet(Ljava/lang/Object;Ljava/lang/Object;ZZ)Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/atomic/AtomicReference\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"accumulateAndGet(Ljava/lang/Object;Ljava/util/function/BinaryOperator;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"compareAndSet(Ljava/lang/Object;Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"get()Ljava/lang/Object;\"/>\n\t\t<method name=\"getAndAccumulate(Ljava/lang/Object;Ljava/util/function/BinaryOperator;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"getAndSet(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getAndUpdate(Ljava/util/function/UnaryOperator;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"lazySet(Ljava/lang/Object;)V\" since=\"9\"/>\n\t\t<method name=\"set(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"updateAndGet(Ljava/util/function/UnaryOperator;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"weakCompareAndSet(Ljava/lang/Object;Ljava/lang/Object;)Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/atomic/AtomicReferenceArray\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>([Ljava/lang/Object;)V\"/>\n\t\t<method name=\"accumulateAndGet(ILjava/lang/Object;Ljava/util/function/BinaryOperator;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"compareAndSet(ILjava/lang/Object;Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"get(I)Ljava/lang/Object;\"/>\n\t\t<method name=\"getAndAccumulate(ILjava/lang/Object;Ljava/util/function/BinaryOperator;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"getAndSet(ILjava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getAndUpdate(ILjava/util/function/UnaryOperator;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"lazySet(ILjava/lang/Object;)V\" since=\"9\"/>\n\t\t<method name=\"length()I\"/>\n\t\t<method name=\"set(ILjava/lang/Object;)V\"/>\n\t\t<method name=\"updateAndGet(ILjava/util/function/UnaryOperator;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"weakCompareAndSet(ILjava/lang/Object;Ljava/lang/Object;)Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/atomic/AtomicReferenceFieldUpdater\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"accumulateAndGet(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BinaryOperator;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"compareAndSet(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"get(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getAndAccumulate(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BinaryOperator;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"getAndSet(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getAndUpdate(Ljava/lang/Object;Ljava/util/function/UnaryOperator;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"lazySet(Ljava/lang/Object;Ljava/lang/Object;)V\" since=\"9\"/>\n\t\t<method name=\"newUpdater(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;\"/>\n\t\t<method name=\"set(Ljava/lang/Object;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"updateAndGet(Ljava/lang/Object;Ljava/util/function/UnaryOperator;)Ljava/lang/Object;\" since=\"24\"/>\n\t\t<method name=\"weakCompareAndSet(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/atomic/AtomicStampedReference\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;I)V\"/>\n\t\t<method name=\"attemptStamp(Ljava/lang/Object;I)Z\"/>\n\t\t<method name=\"compareAndSet(Ljava/lang/Object;Ljava/lang/Object;II)Z\"/>\n\t\t<method name=\"get([I)Ljava/lang/Object;\"/>\n\t\t<method name=\"getReference()Ljava/lang/Object;\"/>\n\t\t<method name=\"getStamp()I\"/>\n\t\t<method name=\"set(Ljava/lang/Object;I)V\"/>\n\t\t<method name=\"weakCompareAndSet(Ljava/lang/Object;Ljava/lang/Object;II)Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/atomic/DoubleAccumulator\" since=\"24\">\n\t\t<extends name=\"java/lang/Number\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/function/DoubleBinaryOperator;D)V\"/>\n\t\t<method name=\"accumulate(D)V\"/>\n\t\t<method name=\"get()D\"/>\n\t\t<method name=\"getThenReset()D\"/>\n\t\t<method name=\"reset()V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/atomic/DoubleAdder\" since=\"24\">\n\t\t<extends name=\"java/lang/Number\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"add(D)V\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"sum()D\"/>\n\t\t<method name=\"sumThenReset()D\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/atomic/LongAccumulator\" since=\"24\">\n\t\t<extends name=\"java/lang/Number\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/function/LongBinaryOperator;J)V\"/>\n\t\t<method name=\"accumulate(J)V\"/>\n\t\t<method name=\"get()J\"/>\n\t\t<method name=\"getThenReset()J\"/>\n\t\t<method name=\"reset()V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/atomic/LongAdder\" since=\"24\">\n\t\t<extends name=\"java/lang/Number\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"add(J)V\"/>\n\t\t<method name=\"decrement()V\"/>\n\t\t<method name=\"increment()V\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"sum()J\"/>\n\t\t<method name=\"sumThenReset()J\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/locks/AbstractOwnableSynchronizer\" since=\"5\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getExclusiveOwnerThread()Ljava/lang/Thread;\"/>\n\t\t<method name=\"setExclusiveOwnerThread(Ljava/lang/Thread;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/locks/AbstractQueuedLongSynchronizer\" since=\"9\">\n\t\t<extends name=\"java/util/concurrent/locks/AbstractOwnableSynchronizer\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"acquire(J)V\"/>\n\t\t<method name=\"acquireInterruptibly(J)V\"/>\n\t\t<method name=\"acquireShared(J)V\"/>\n\t\t<method name=\"acquireSharedInterruptibly(J)V\"/>\n\t\t<method name=\"compareAndSetState(JJ)Z\"/>\n\t\t<method name=\"getExclusiveQueuedThreads()Ljava/util/Collection;\"/>\n\t\t<method name=\"getFirstQueuedThread()Ljava/lang/Thread;\"/>\n\t\t<method name=\"getQueueLength()I\"/>\n\t\t<method name=\"getQueuedThreads()Ljava/util/Collection;\"/>\n\t\t<method name=\"getSharedQueuedThreads()Ljava/util/Collection;\"/>\n\t\t<method name=\"getState()J\"/>\n\t\t<method name=\"getWaitQueueLength(Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;)I\"/>\n\t\t<method name=\"getWaitingThreads(Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;)Ljava/util/Collection;\"/>\n\t\t<method name=\"hasContended()Z\"/>\n\t\t<method name=\"hasQueuedPredecessors()Z\" since=\"21\"/>\n\t\t<method name=\"hasQueuedThreads()Z\"/>\n\t\t<method name=\"hasWaiters(Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;)Z\"/>\n\t\t<method name=\"isHeldExclusively()Z\"/>\n\t\t<method name=\"isQueued(Ljava/lang/Thread;)Z\"/>\n\t\t<method name=\"owns(Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;)Z\"/>\n\t\t<method name=\"release(J)Z\"/>\n\t\t<method name=\"releaseShared(J)Z\"/>\n\t\t<method name=\"setState(J)V\"/>\n\t\t<method name=\"tryAcquire(J)Z\"/>\n\t\t<method name=\"tryAcquireNanos(JJ)Z\"/>\n\t\t<method name=\"tryAcquireShared(J)J\"/>\n\t\t<method name=\"tryAcquireSharedNanos(JJ)Z\"/>\n\t\t<method name=\"tryRelease(J)Z\"/>\n\t\t<method name=\"tryReleaseShared(J)Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/util/concurrent/locks/Condition\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;)V\"/>\n\t\t<method name=\"getWaitQueueLength()I\"/>\n\t\t<method name=\"getWaitingThreads()Ljava/util/Collection;\"/>\n\t\t<method name=\"hasWaiters()Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/locks/AbstractQueuedSynchronizer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\" removed=\"5\"/>\n\t\t<extends name=\"java/util/concurrent/locks/AbstractOwnableSynchronizer\" since=\"5\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"acquire(I)V\"/>\n\t\t<method name=\"acquireInterruptibly(I)V\"/>\n\t\t<method name=\"acquireShared(I)V\"/>\n\t\t<method name=\"acquireSharedInterruptibly(I)V\"/>\n\t\t<method name=\"compareAndSetState(II)Z\"/>\n\t\t<method name=\"getExclusiveQueuedThreads()Ljava/util/Collection;\"/>\n\t\t<method name=\"getFirstQueuedThread()Ljava/lang/Thread;\"/>\n\t\t<method name=\"getQueueLength()I\"/>\n\t\t<method name=\"getQueuedThreads()Ljava/util/Collection;\"/>\n\t\t<method name=\"getSharedQueuedThreads()Ljava/util/Collection;\"/>\n\t\t<method name=\"getState()I\"/>\n\t\t<method name=\"getWaitQueueLength(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;)I\"/>\n\t\t<method name=\"getWaitingThreads(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;)Ljava/util/Collection;\"/>\n\t\t<method name=\"hasContended()Z\"/>\n\t\t<method name=\"hasQueuedPredecessors()Z\" since=\"21\"/>\n\t\t<method name=\"hasQueuedThreads()Z\"/>\n\t\t<method name=\"hasWaiters(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;)Z\"/>\n\t\t<method name=\"isHeldExclusively()Z\"/>\n\t\t<method name=\"isQueued(Ljava/lang/Thread;)Z\"/>\n\t\t<method name=\"owns(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;)Z\"/>\n\t\t<method name=\"release(I)Z\"/>\n\t\t<method name=\"releaseShared(I)Z\"/>\n\t\t<method name=\"setState(I)V\"/>\n\t\t<method name=\"tryAcquire(I)Z\"/>\n\t\t<method name=\"tryAcquireNanos(IJ)Z\"/>\n\t\t<method name=\"tryAcquireShared(I)I\"/>\n\t\t<method name=\"tryAcquireSharedNanos(IJ)Z\"/>\n\t\t<method name=\"tryRelease(I)Z\"/>\n\t\t<method name=\"tryReleaseShared(I)Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/util/concurrent/locks/Condition\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;)V\"/>\n\t\t<method name=\"getWaitQueueLength()I\"/>\n\t\t<method name=\"getWaitingThreads()Ljava/util/Collection;\"/>\n\t\t<method name=\"hasWaiters()Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/locks/Condition\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"await()V\"/>\n\t\t<method name=\"await(JLjava/util/concurrent/TimeUnit;)Z\"/>\n\t\t<method name=\"awaitNanos(J)J\"/>\n\t\t<method name=\"awaitUninterruptibly()V\"/>\n\t\t<method name=\"awaitUntil(Ljava/util/Date;)Z\"/>\n\t\t<method name=\"signal()V\"/>\n\t\t<method name=\"signalAll()V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/locks/Lock\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"lock()V\"/>\n\t\t<method name=\"lockInterruptibly()V\"/>\n\t\t<method name=\"newCondition()Ljava/util/concurrent/locks/Condition;\"/>\n\t\t<method name=\"tryLock()Z\"/>\n\t\t<method name=\"tryLock(JLjava/util/concurrent/TimeUnit;)Z\"/>\n\t\t<method name=\"unlock()V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/locks/LockSupport\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getBlocker(Ljava/lang/Thread;)Ljava/lang/Object;\" since=\"9\"/>\n\t\t<method name=\"park()V\"/>\n\t\t<method name=\"park(Ljava/lang/Object;)V\" since=\"9\"/>\n\t\t<method name=\"parkNanos(J)V\"/>\n\t\t<method name=\"parkNanos(Ljava/lang/Object;J)V\" since=\"9\"/>\n\t\t<method name=\"parkUntil(J)V\"/>\n\t\t<method name=\"parkUntil(Ljava/lang/Object;J)V\" since=\"9\"/>\n\t\t<method name=\"unpark(Ljava/lang/Thread;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/locks/ReadWriteLock\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"readLock()Ljava/util/concurrent/locks/Lock;\"/>\n\t\t<method name=\"writeLock()Ljava/util/concurrent/locks/Lock;\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/locks/ReentrantLock\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/util/concurrent/locks/Lock\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Z)V\"/>\n\t\t<method name=\"getHoldCount()I\"/>\n\t\t<method name=\"getOwner()Ljava/lang/Thread;\"/>\n\t\t<method name=\"getQueueLength()I\"/>\n\t\t<method name=\"getQueuedThreads()Ljava/util/Collection;\"/>\n\t\t<method name=\"getWaitQueueLength(Ljava/util/concurrent/locks/Condition;)I\"/>\n\t\t<method name=\"getWaitingThreads(Ljava/util/concurrent/locks/Condition;)Ljava/util/Collection;\"/>\n\t\t<method name=\"hasQueuedThread(Ljava/lang/Thread;)Z\"/>\n\t\t<method name=\"hasQueuedThreads()Z\"/>\n\t\t<method name=\"hasWaiters(Ljava/util/concurrent/locks/Condition;)Z\"/>\n\t\t<method name=\"isFair()Z\"/>\n\t\t<method name=\"isHeldByCurrentThread()Z\"/>\n\t\t<method name=\"isLocked()Z\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/locks/ReentrantReadWriteLock\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/util/concurrent/locks/ReadWriteLock\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Z)V\"/>\n\t\t<method name=\"getOwner()Ljava/lang/Thread;\"/>\n\t\t<method name=\"getQueueLength()I\"/>\n\t\t<method name=\"getQueuedReaderThreads()Ljava/util/Collection;\"/>\n\t\t<method name=\"getQueuedThreads()Ljava/util/Collection;\"/>\n\t\t<method name=\"getQueuedWriterThreads()Ljava/util/Collection;\"/>\n\t\t<method name=\"getReadHoldCount()I\" since=\"9\"/>\n\t\t<method name=\"getReadLockCount()I\"/>\n\t\t<method name=\"getWaitQueueLength(Ljava/util/concurrent/locks/Condition;)I\"/>\n\t\t<method name=\"getWaitingThreads(Ljava/util/concurrent/locks/Condition;)Ljava/util/Collection;\"/>\n\t\t<method name=\"getWriteHoldCount()I\"/>\n\t\t<method name=\"hasQueuedThread(Ljava/lang/Thread;)Z\"/>\n\t\t<method name=\"hasQueuedThreads()Z\"/>\n\t\t<method name=\"hasWaiters(Ljava/util/concurrent/locks/Condition;)Z\"/>\n\t\t<method name=\"isFair()Z\"/>\n\t\t<method name=\"isWriteLocked()Z\"/>\n\t\t<method name=\"isWriteLockedByCurrentThread()Z\"/>\n\t\t<method name=\"readLock()Ljava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock;\"/>\n\t\t<method name=\"writeLock()Ljava/util/concurrent/locks/ReentrantReadWriteLock$WriteLock;\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/locks/ReentrantReadWriteLock$ReadLock\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/util/concurrent/locks/Lock\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/concurrent/locks/ReentrantReadWriteLock;)V\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/locks/ReentrantReadWriteLock$WriteLock\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/util/concurrent/locks/Lock\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/concurrent/locks/ReentrantReadWriteLock;)V\"/>\n\t\t<method name=\"getHoldCount()I\" since=\"9\"/>\n\t\t<method name=\"isHeldByCurrentThread()Z\" since=\"9\"/>\n\t</class>\n\t<class name=\"java/util/concurrent/locks/StampedLock\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"asReadLock()Ljava/util/concurrent/locks/Lock;\"/>\n\t\t<method name=\"asReadWriteLock()Ljava/util/concurrent/locks/ReadWriteLock;\"/>\n\t\t<method name=\"asWriteLock()Ljava/util/concurrent/locks/Lock;\"/>\n\t\t<method name=\"getReadLockCount()I\"/>\n\t\t<method name=\"isReadLocked()Z\"/>\n\t\t<method name=\"isWriteLocked()Z\"/>\n\t\t<method name=\"readLock()J\"/>\n\t\t<method name=\"readLockInterruptibly()J\"/>\n\t\t<method name=\"tryConvertToOptimisticRead(J)J\"/>\n\t\t<method name=\"tryConvertToReadLock(J)J\"/>\n\t\t<method name=\"tryConvertToWriteLock(J)J\"/>\n\t\t<method name=\"tryOptimisticRead()J\"/>\n\t\t<method name=\"tryReadLock()J\"/>\n\t\t<method name=\"tryReadLock(JLjava/util/concurrent/TimeUnit;)J\"/>\n\t\t<method name=\"tryUnlockRead()Z\"/>\n\t\t<method name=\"tryUnlockWrite()Z\"/>\n\t\t<method name=\"tryWriteLock()J\"/>\n\t\t<method name=\"tryWriteLock(JLjava/util/concurrent/TimeUnit;)J\"/>\n\t\t<method name=\"unlock(J)V\"/>\n\t\t<method name=\"unlockRead(J)V\"/>\n\t\t<method name=\"unlockWrite(J)V\"/>\n\t\t<method name=\"validate(J)Z\"/>\n\t\t<method name=\"writeLock()J\"/>\n\t\t<method name=\"writeLockInterruptibly()J\"/>\n\t</class>\n\t<class name=\"java/util/function/BiConsumer\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"accept(Ljava/lang/Object;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"andThen(Ljava/util/function/BiConsumer;)Ljava/util/function/BiConsumer;\"/>\n\t</class>\n\t<class name=\"java/util/function/BiFunction\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"andThen(Ljava/util/function/Function;)Ljava/util/function/BiFunction;\"/>\n\t\t<method name=\"apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/util/function/BiPredicate\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"and(Ljava/util/function/BiPredicate;)Ljava/util/function/BiPredicate;\"/>\n\t\t<method name=\"negate()Ljava/util/function/BiPredicate;\"/>\n\t\t<method name=\"or(Ljava/util/function/BiPredicate;)Ljava/util/function/BiPredicate;\"/>\n\t\t<method name=\"test(Ljava/lang/Object;Ljava/lang/Object;)Z\"/>\n\t</class>\n\t<class name=\"java/util/function/BinaryOperator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/function/BiFunction\"/>\n\t\t<method name=\"maxBy(Ljava/util/Comparator;)Ljava/util/function/BinaryOperator;\"/>\n\t\t<method name=\"minBy(Ljava/util/Comparator;)Ljava/util/function/BinaryOperator;\"/>\n\t</class>\n\t<class name=\"java/util/function/BooleanSupplier\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAsBoolean()Z\"/>\n\t</class>\n\t<class name=\"java/util/function/Consumer\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"accept(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"andThen(Ljava/util/function/Consumer;)Ljava/util/function/Consumer;\"/>\n\t</class>\n\t<class name=\"java/util/function/DoubleBinaryOperator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"applyAsDouble(DD)D\"/>\n\t</class>\n\t<class name=\"java/util/function/DoubleConsumer\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"accept(D)V\"/>\n\t\t<method name=\"andThen(Ljava/util/function/DoubleConsumer;)Ljava/util/function/DoubleConsumer;\"/>\n\t</class>\n\t<class name=\"java/util/function/DoubleFunction\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"apply(D)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/util/function/DoublePredicate\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"and(Ljava/util/function/DoublePredicate;)Ljava/util/function/DoublePredicate;\"/>\n\t\t<method name=\"negate()Ljava/util/function/DoublePredicate;\"/>\n\t\t<method name=\"or(Ljava/util/function/DoublePredicate;)Ljava/util/function/DoublePredicate;\"/>\n\t\t<method name=\"test(D)Z\"/>\n\t</class>\n\t<class name=\"java/util/function/DoubleSupplier\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAsDouble()D\"/>\n\t</class>\n\t<class name=\"java/util/function/DoubleToIntFunction\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"applyAsInt(D)I\"/>\n\t</class>\n\t<class name=\"java/util/function/DoubleToLongFunction\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"applyAsLong(D)J\"/>\n\t</class>\n\t<class name=\"java/util/function/DoubleUnaryOperator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"andThen(Ljava/util/function/DoubleUnaryOperator;)Ljava/util/function/DoubleUnaryOperator;\"/>\n\t\t<method name=\"applyAsDouble(D)D\"/>\n\t\t<method name=\"compose(Ljava/util/function/DoubleUnaryOperator;)Ljava/util/function/DoubleUnaryOperator;\"/>\n\t\t<method name=\"identity()Ljava/util/function/DoubleUnaryOperator;\"/>\n\t</class>\n\t<class name=\"java/util/function/Function\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"andThen(Ljava/util/function/Function;)Ljava/util/function/Function;\"/>\n\t\t<method name=\"apply(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t\t<method name=\"compose(Ljava/util/function/Function;)Ljava/util/function/Function;\"/>\n\t\t<method name=\"identity()Ljava/util/function/Function;\"/>\n\t</class>\n\t<class name=\"java/util/function/IntBinaryOperator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"applyAsInt(II)I\"/>\n\t</class>\n\t<class name=\"java/util/function/IntConsumer\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"accept(I)V\"/>\n\t\t<method name=\"andThen(Ljava/util/function/IntConsumer;)Ljava/util/function/IntConsumer;\"/>\n\t</class>\n\t<class name=\"java/util/function/IntFunction\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"apply(I)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/util/function/IntPredicate\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"and(Ljava/util/function/IntPredicate;)Ljava/util/function/IntPredicate;\"/>\n\t\t<method name=\"negate()Ljava/util/function/IntPredicate;\"/>\n\t\t<method name=\"or(Ljava/util/function/IntPredicate;)Ljava/util/function/IntPredicate;\"/>\n\t\t<method name=\"test(I)Z\"/>\n\t</class>\n\t<class name=\"java/util/function/IntSupplier\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAsInt()I\"/>\n\t</class>\n\t<class name=\"java/util/function/IntToDoubleFunction\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"applyAsDouble(I)D\"/>\n\t</class>\n\t<class name=\"java/util/function/IntToLongFunction\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"applyAsLong(I)J\"/>\n\t</class>\n\t<class name=\"java/util/function/IntUnaryOperator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"andThen(Ljava/util/function/IntUnaryOperator;)Ljava/util/function/IntUnaryOperator;\"/>\n\t\t<method name=\"applyAsInt(I)I\"/>\n\t\t<method name=\"compose(Ljava/util/function/IntUnaryOperator;)Ljava/util/function/IntUnaryOperator;\"/>\n\t\t<method name=\"identity()Ljava/util/function/IntUnaryOperator;\"/>\n\t</class>\n\t<class name=\"java/util/function/LongBinaryOperator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"applyAsLong(JJ)J\"/>\n\t</class>\n\t<class name=\"java/util/function/LongConsumer\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"accept(J)V\"/>\n\t\t<method name=\"andThen(Ljava/util/function/LongConsumer;)Ljava/util/function/LongConsumer;\"/>\n\t</class>\n\t<class name=\"java/util/function/LongFunction\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"apply(J)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/util/function/LongPredicate\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"and(Ljava/util/function/LongPredicate;)Ljava/util/function/LongPredicate;\"/>\n\t\t<method name=\"negate()Ljava/util/function/LongPredicate;\"/>\n\t\t<method name=\"or(Ljava/util/function/LongPredicate;)Ljava/util/function/LongPredicate;\"/>\n\t\t<method name=\"test(J)Z\"/>\n\t</class>\n\t<class name=\"java/util/function/LongSupplier\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAsLong()J\"/>\n\t</class>\n\t<class name=\"java/util/function/LongToDoubleFunction\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"applyAsDouble(J)D\"/>\n\t</class>\n\t<class name=\"java/util/function/LongToIntFunction\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"applyAsInt(J)I\"/>\n\t</class>\n\t<class name=\"java/util/function/LongUnaryOperator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"andThen(Ljava/util/function/LongUnaryOperator;)Ljava/util/function/LongUnaryOperator;\"/>\n\t\t<method name=\"applyAsLong(J)J\"/>\n\t\t<method name=\"compose(Ljava/util/function/LongUnaryOperator;)Ljava/util/function/LongUnaryOperator;\"/>\n\t\t<method name=\"identity()Ljava/util/function/LongUnaryOperator;\"/>\n\t</class>\n\t<class name=\"java/util/function/ObjDoubleConsumer\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"accept(Ljava/lang/Object;D)V\"/>\n\t</class>\n\t<class name=\"java/util/function/ObjIntConsumer\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"accept(Ljava/lang/Object;I)V\"/>\n\t</class>\n\t<class name=\"java/util/function/ObjLongConsumer\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"accept(Ljava/lang/Object;J)V\"/>\n\t</class>\n\t<class name=\"java/util/function/Predicate\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"and(Ljava/util/function/Predicate;)Ljava/util/function/Predicate;\"/>\n\t\t<method name=\"isEqual(Ljava/lang/Object;)Ljava/util/function/Predicate;\"/>\n\t\t<method name=\"negate()Ljava/util/function/Predicate;\"/>\n\t\t<method name=\"or(Ljava/util/function/Predicate;)Ljava/util/function/Predicate;\"/>\n\t\t<method name=\"test(Ljava/lang/Object;)Z\"/>\n\t</class>\n\t<class name=\"java/util/function/Supplier\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"get()Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/util/function/ToDoubleBiFunction\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"applyAsDouble(Ljava/lang/Object;Ljava/lang/Object;)D\"/>\n\t</class>\n\t<class name=\"java/util/function/ToDoubleFunction\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"applyAsDouble(Ljava/lang/Object;)D\"/>\n\t</class>\n\t<class name=\"java/util/function/ToIntBiFunction\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"applyAsInt(Ljava/lang/Object;Ljava/lang/Object;)I\"/>\n\t</class>\n\t<class name=\"java/util/function/ToIntFunction\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"applyAsInt(Ljava/lang/Object;)I\"/>\n\t</class>\n\t<class name=\"java/util/function/ToLongBiFunction\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"applyAsLong(Ljava/lang/Object;Ljava/lang/Object;)J\"/>\n\t</class>\n\t<class name=\"java/util/function/ToLongFunction\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"applyAsLong(Ljava/lang/Object;)J\"/>\n\t</class>\n\t<class name=\"java/util/function/UnaryOperator\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/function/Function\"/>\n\t\t<method name=\"identity()Ljava/util/function/UnaryOperator;\"/>\n\t</class>\n\t<class name=\"java/util/jar/Attributes\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"java/util/Map\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/jar/Attributes;)V\"/>\n\t\t<method name=\"getValue(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getValue(Ljava/util/jar/Attributes$Name;)Ljava/lang/String;\"/>\n\t\t<method name=\"putValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<field name=\"map\"/>\n\t</class>\n\t<class name=\"java/util/jar/Attributes$Name\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<field name=\"CLASS_PATH\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"EXTENSION_INSTALLATION\" deprecated=\"26\"/>\n\t\t<field name=\"EXTENSION_LIST\"/>\n\t\t<field name=\"EXTENSION_NAME\"/>\n\t\t<field name=\"IMPLEMENTATION_TITLE\"/>\n\t\t<field name=\"IMPLEMENTATION_URL\" deprecated=\"26\"/>\n\t\t<field name=\"IMPLEMENTATION_VENDOR\"/>\n\t\t<field name=\"IMPLEMENTATION_VENDOR_ID\" deprecated=\"26\"/>\n\t\t<field name=\"IMPLEMENTATION_VERSION\"/>\n\t\t<field name=\"MAIN_CLASS\"/>\n\t\t<field name=\"MANIFEST_VERSION\"/>\n\t\t<field name=\"SEALED\"/>\n\t\t<field name=\"SIGNATURE_VERSION\"/>\n\t\t<field name=\"SPECIFICATION_TITLE\"/>\n\t\t<field name=\"SPECIFICATION_VENDOR\"/>\n\t\t<field name=\"SPECIFICATION_VERSION\"/>\n\t</class>\n\t<class name=\"java/util/jar/JarEntry\" since=\"1\">\n\t\t<extends name=\"java/util/zip/ZipEntry\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/jar/JarEntry;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/zip/ZipEntry;)V\"/>\n\t\t<method name=\"getAttributes()Ljava/util/jar/Attributes;\"/>\n\t\t<method name=\"getCertificates()[Ljava/security/cert/Certificate;\"/>\n\t\t<method name=\"getCodeSigners()[Ljava/security/CodeSigner;\"/>\n\t\t<field name=\"CENATT\" since=\"28\"/>\n\t\t<field name=\"CENATX\" since=\"28\"/>\n\t\t<field name=\"CENCOM\" since=\"28\"/>\n\t\t<field name=\"CENCRC\" since=\"28\"/>\n\t\t<field name=\"CENDSK\" since=\"28\"/>\n\t\t<field name=\"CENEXT\" since=\"28\"/>\n\t\t<field name=\"CENFLG\" since=\"28\"/>\n\t\t<field name=\"CENHDR\" since=\"28\"/>\n\t\t<field name=\"CENHOW\" since=\"28\"/>\n\t\t<field name=\"CENLEN\" since=\"28\"/>\n\t\t<field name=\"CENNAM\" since=\"28\"/>\n\t\t<field name=\"CENOFF\" since=\"28\"/>\n\t\t<field name=\"CENSIG\" since=\"28\"/>\n\t\t<field name=\"CENSIZ\" since=\"28\"/>\n\t\t<field name=\"CENTIM\" since=\"28\"/>\n\t\t<field name=\"CENVEM\" since=\"28\"/>\n\t\t<field name=\"CENVER\" since=\"28\"/>\n\t\t<field name=\"ENDCOM\" since=\"28\"/>\n\t\t<field name=\"ENDHDR\" since=\"28\"/>\n\t\t<field name=\"ENDOFF\" since=\"28\"/>\n\t\t<field name=\"ENDSIG\" since=\"28\"/>\n\t\t<field name=\"ENDSIZ\" since=\"28\"/>\n\t\t<field name=\"ENDSUB\" since=\"28\"/>\n\t\t<field name=\"ENDTOT\" since=\"28\"/>\n\t\t<field name=\"EXTCRC\" since=\"28\"/>\n\t\t<field name=\"EXTHDR\" since=\"28\"/>\n\t\t<field name=\"EXTLEN\" since=\"28\"/>\n\t\t<field name=\"EXTSIG\" since=\"28\"/>\n\t\t<field name=\"EXTSIZ\" since=\"28\"/>\n\t\t<field name=\"LOCCRC\" since=\"28\"/>\n\t\t<field name=\"LOCEXT\" since=\"28\"/>\n\t\t<field name=\"LOCFLG\" since=\"28\"/>\n\t\t<field name=\"LOCHDR\" since=\"28\"/>\n\t\t<field name=\"LOCHOW\" since=\"28\"/>\n\t\t<field name=\"LOCLEN\" since=\"28\"/>\n\t\t<field name=\"LOCNAM\" since=\"28\"/>\n\t\t<field name=\"LOCSIG\" since=\"28\"/>\n\t\t<field name=\"LOCSIZ\" since=\"28\"/>\n\t\t<field name=\"LOCTIM\" since=\"28\"/>\n\t\t<field name=\"LOCVER\" since=\"28\"/>\n\t</class>\n\t<class name=\"java/util/jar/JarException\" since=\"1\">\n\t\t<extends name=\"java/util/zip/ZipException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/util/jar/JarFile\" since=\"1\">\n\t\t<extends name=\"java/util/zip/ZipFile\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;Z)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;ZI)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"getJarEntry(Ljava/lang/String;)Ljava/util/jar/JarEntry;\"/>\n\t\t<method name=\"getManifest()Ljava/util/jar/Manifest;\"/>\n\t\t<field name=\"CENATT\" since=\"28\"/>\n\t\t<field name=\"CENATX\" since=\"28\"/>\n\t\t<field name=\"CENCOM\" since=\"28\"/>\n\t\t<field name=\"CENCRC\" since=\"28\"/>\n\t\t<field name=\"CENDSK\" since=\"28\"/>\n\t\t<field name=\"CENEXT\" since=\"28\"/>\n\t\t<field name=\"CENFLG\" since=\"28\"/>\n\t\t<field name=\"CENHDR\" since=\"28\"/>\n\t\t<field name=\"CENHOW\" since=\"28\"/>\n\t\t<field name=\"CENLEN\" since=\"28\"/>\n\t\t<field name=\"CENNAM\" since=\"28\"/>\n\t\t<field name=\"CENOFF\" since=\"28\"/>\n\t\t<field name=\"CENSIG\" since=\"28\"/>\n\t\t<field name=\"CENSIZ\" since=\"28\"/>\n\t\t<field name=\"CENTIM\" since=\"28\"/>\n\t\t<field name=\"CENVEM\" since=\"28\"/>\n\t\t<field name=\"CENVER\" since=\"28\"/>\n\t\t<field name=\"ENDCOM\" since=\"28\"/>\n\t\t<field name=\"ENDHDR\" since=\"28\"/>\n\t\t<field name=\"ENDOFF\" since=\"28\"/>\n\t\t<field name=\"ENDSIG\" since=\"28\"/>\n\t\t<field name=\"ENDSIZ\" since=\"28\"/>\n\t\t<field name=\"ENDSUB\" since=\"28\"/>\n\t\t<field name=\"ENDTOT\" since=\"28\"/>\n\t\t<field name=\"EXTCRC\" since=\"28\"/>\n\t\t<field name=\"EXTHDR\" since=\"28\"/>\n\t\t<field name=\"EXTLEN\" since=\"28\"/>\n\t\t<field name=\"EXTSIG\" since=\"28\"/>\n\t\t<field name=\"EXTSIZ\" since=\"28\"/>\n\t\t<field name=\"LOCCRC\" since=\"28\"/>\n\t\t<field name=\"LOCEXT\" since=\"28\"/>\n\t\t<field name=\"LOCFLG\" since=\"28\"/>\n\t\t<field name=\"LOCHDR\" since=\"28\"/>\n\t\t<field name=\"LOCHOW\" since=\"28\"/>\n\t\t<field name=\"LOCLEN\" since=\"28\"/>\n\t\t<field name=\"LOCNAM\" since=\"28\"/>\n\t\t<field name=\"LOCSIG\" since=\"28\"/>\n\t\t<field name=\"LOCSIZ\" since=\"28\"/>\n\t\t<field name=\"LOCTIM\" since=\"28\"/>\n\t\t<field name=\"LOCVER\" since=\"28\"/>\n\t\t<field name=\"MANIFEST_NAME\"/>\n\t</class>\n\t<class name=\"java/util/jar/JarInputStream\" since=\"1\">\n\t\t<extends name=\"java/util/zip/ZipInputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;Z)V\"/>\n\t\t<method name=\"getManifest()Ljava/util/jar/Manifest;\"/>\n\t\t<method name=\"getNextJarEntry()Ljava/util/jar/JarEntry;\"/>\n\t\t<field name=\"CENATT\" since=\"28\"/>\n\t\t<field name=\"CENATX\" since=\"28\"/>\n\t\t<field name=\"CENCOM\" since=\"28\"/>\n\t\t<field name=\"CENCRC\" since=\"28\"/>\n\t\t<field name=\"CENDSK\" since=\"28\"/>\n\t\t<field name=\"CENEXT\" since=\"28\"/>\n\t\t<field name=\"CENFLG\" since=\"28\"/>\n\t\t<field name=\"CENHDR\" since=\"28\"/>\n\t\t<field name=\"CENHOW\" since=\"28\"/>\n\t\t<field name=\"CENLEN\" since=\"28\"/>\n\t\t<field name=\"CENNAM\" since=\"28\"/>\n\t\t<field name=\"CENOFF\" since=\"28\"/>\n\t\t<field name=\"CENSIG\" since=\"28\"/>\n\t\t<field name=\"CENSIZ\" since=\"28\"/>\n\t\t<field name=\"CENTIM\" since=\"28\"/>\n\t\t<field name=\"CENVEM\" since=\"28\"/>\n\t\t<field name=\"CENVER\" since=\"28\"/>\n\t\t<field name=\"ENDCOM\" since=\"28\"/>\n\t\t<field name=\"ENDHDR\" since=\"28\"/>\n\t\t<field name=\"ENDOFF\" since=\"28\"/>\n\t\t<field name=\"ENDSIG\" since=\"28\"/>\n\t\t<field name=\"ENDSIZ\" since=\"28\"/>\n\t\t<field name=\"ENDSUB\" since=\"28\"/>\n\t\t<field name=\"ENDTOT\" since=\"28\"/>\n\t\t<field name=\"EXTCRC\" since=\"28\"/>\n\t\t<field name=\"EXTHDR\" since=\"28\"/>\n\t\t<field name=\"EXTLEN\" since=\"28\"/>\n\t\t<field name=\"EXTSIG\" since=\"28\"/>\n\t\t<field name=\"EXTSIZ\" since=\"28\"/>\n\t\t<field name=\"LOCCRC\" since=\"28\"/>\n\t\t<field name=\"LOCEXT\" since=\"28\"/>\n\t\t<field name=\"LOCFLG\" since=\"28\"/>\n\t\t<field name=\"LOCHDR\" since=\"28\"/>\n\t\t<field name=\"LOCHOW\" since=\"28\"/>\n\t\t<field name=\"LOCLEN\" since=\"28\"/>\n\t\t<field name=\"LOCNAM\" since=\"28\"/>\n\t\t<field name=\"LOCSIG\" since=\"28\"/>\n\t\t<field name=\"LOCSIZ\" since=\"28\"/>\n\t\t<field name=\"LOCTIM\" since=\"28\"/>\n\t\t<field name=\"LOCVER\" since=\"28\"/>\n\t</class>\n\t<class name=\"java/util/jar/JarOutputStream\" since=\"1\">\n\t\t<extends name=\"java/util/zip/ZipOutputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;Ljava/util/jar/Manifest;)V\"/>\n\t\t<field name=\"CENATT\" since=\"28\"/>\n\t\t<field name=\"CENATX\" since=\"28\"/>\n\t\t<field name=\"CENCOM\" since=\"28\"/>\n\t\t<field name=\"CENCRC\" since=\"28\"/>\n\t\t<field name=\"CENDSK\" since=\"28\"/>\n\t\t<field name=\"CENEXT\" since=\"28\"/>\n\t\t<field name=\"CENFLG\" since=\"28\"/>\n\t\t<field name=\"CENHDR\" since=\"28\"/>\n\t\t<field name=\"CENHOW\" since=\"28\"/>\n\t\t<field name=\"CENLEN\" since=\"28\"/>\n\t\t<field name=\"CENNAM\" since=\"28\"/>\n\t\t<field name=\"CENOFF\" since=\"28\"/>\n\t\t<field name=\"CENSIG\" since=\"28\"/>\n\t\t<field name=\"CENSIZ\" since=\"28\"/>\n\t\t<field name=\"CENTIM\" since=\"28\"/>\n\t\t<field name=\"CENVEM\" since=\"28\"/>\n\t\t<field name=\"CENVER\" since=\"28\"/>\n\t\t<field name=\"ENDCOM\" since=\"28\"/>\n\t\t<field name=\"ENDHDR\" since=\"28\"/>\n\t\t<field name=\"ENDOFF\" since=\"28\"/>\n\t\t<field name=\"ENDSIG\" since=\"28\"/>\n\t\t<field name=\"ENDSIZ\" since=\"28\"/>\n\t\t<field name=\"ENDSUB\" since=\"28\"/>\n\t\t<field name=\"ENDTOT\" since=\"28\"/>\n\t\t<field name=\"EXTCRC\" since=\"28\"/>\n\t\t<field name=\"EXTHDR\" since=\"28\"/>\n\t\t<field name=\"EXTLEN\" since=\"28\"/>\n\t\t<field name=\"EXTSIG\" since=\"28\"/>\n\t\t<field name=\"EXTSIZ\" since=\"28\"/>\n\t\t<field name=\"LOCCRC\" since=\"28\"/>\n\t\t<field name=\"LOCEXT\" since=\"28\"/>\n\t\t<field name=\"LOCFLG\" since=\"28\"/>\n\t\t<field name=\"LOCHDR\" since=\"28\"/>\n\t\t<field name=\"LOCHOW\" since=\"28\"/>\n\t\t<field name=\"LOCLEN\" since=\"28\"/>\n\t\t<field name=\"LOCNAM\" since=\"28\"/>\n\t\t<field name=\"LOCSIG\" since=\"28\"/>\n\t\t<field name=\"LOCSIZ\" since=\"28\"/>\n\t\t<field name=\"LOCTIM\" since=\"28\"/>\n\t\t<field name=\"LOCVER\" since=\"28\"/>\n\t</class>\n\t<class name=\"java/util/jar/Manifest\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/jar/Manifest;)V\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"getAttributes(Ljava/lang/String;)Ljava/util/jar/Attributes;\"/>\n\t\t<method name=\"getEntries()Ljava/util/Map;\"/>\n\t\t<method name=\"getMainAttributes()Ljava/util/jar/Attributes;\"/>\n\t\t<method name=\"read(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"write(Ljava/io/OutputStream;)V\"/>\n\t</class>\n\t<class name=\"java/util/jar/Pack200\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"newPacker()Ljava/util/jar/Pack200$Packer;\"/>\n\t\t<method name=\"newUnpacker()Ljava/util/jar/Pack200$Unpacker;\"/>\n\t</class>\n\t<class name=\"java/util/jar/Pack200$Packer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addPropertyChangeListener(Ljava/beans/PropertyChangeListener;)V\" since=\"3\" deprecated=\"26\"/>\n\t\t<method name=\"pack(Ljava/util/jar/JarFile;Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"pack(Ljava/util/jar/JarInputStream;Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"properties()Ljava/util/SortedMap;\"/>\n\t\t<method name=\"removePropertyChangeListener(Ljava/beans/PropertyChangeListener;)V\" since=\"3\" deprecated=\"26\"/>\n\t\t<field name=\"CLASS_ATTRIBUTE_PFX\"/>\n\t\t<field name=\"CODE_ATTRIBUTE_PFX\"/>\n\t\t<field name=\"DEFLATE_HINT\"/>\n\t\t<field name=\"EFFORT\"/>\n\t\t<field name=\"ERROR\"/>\n\t\t<field name=\"FALSE\"/>\n\t\t<field name=\"FIELD_ATTRIBUTE_PFX\"/>\n\t\t<field name=\"KEEP\"/>\n\t\t<field name=\"KEEP_FILE_ORDER\"/>\n\t\t<field name=\"LATEST\"/>\n\t\t<field name=\"METHOD_ATTRIBUTE_PFX\"/>\n\t\t<field name=\"MODIFICATION_TIME\"/>\n\t\t<field name=\"PASS\"/>\n\t\t<field name=\"PASS_FILE_PFX\"/>\n\t\t<field name=\"PROGRESS\"/>\n\t\t<field name=\"SEGMENT_LIMIT\"/>\n\t\t<field name=\"STRIP\"/>\n\t\t<field name=\"TRUE\"/>\n\t\t<field name=\"UNKNOWN_ATTRIBUTE\"/>\n\t</class>\n\t<class name=\"java/util/jar/Pack200$Unpacker\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addPropertyChangeListener(Ljava/beans/PropertyChangeListener;)V\" since=\"3\" deprecated=\"26\"/>\n\t\t<method name=\"properties()Ljava/util/SortedMap;\"/>\n\t\t<method name=\"removePropertyChangeListener(Ljava/beans/PropertyChangeListener;)V\" since=\"3\" deprecated=\"26\"/>\n\t\t<method name=\"unpack(Ljava/io/File;Ljava/util/jar/JarOutputStream;)V\"/>\n\t\t<method name=\"unpack(Ljava/io/InputStream;Ljava/util/jar/JarOutputStream;)V\"/>\n\t\t<field name=\"DEFLATE_HINT\"/>\n\t\t<field name=\"FALSE\"/>\n\t\t<field name=\"KEEP\"/>\n\t\t<field name=\"PROGRESS\"/>\n\t\t<field name=\"TRUE\"/>\n\t</class>\n\t<class name=\"java/util/logging/ConsoleHandler\" since=\"1\">\n\t\t<extends name=\"java/util/logging/StreamHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/util/logging/ErrorManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"error(Ljava/lang/String;Ljava/lang/Exception;I)V\"/>\n\t\t<field name=\"CLOSE_FAILURE\"/>\n\t\t<field name=\"FLUSH_FAILURE\"/>\n\t\t<field name=\"FORMAT_FAILURE\"/>\n\t\t<field name=\"GENERIC_FAILURE\"/>\n\t\t<field name=\"OPEN_FAILURE\"/>\n\t\t<field name=\"WRITE_FAILURE\"/>\n\t</class>\n\t<class name=\"java/util/logging/FileHandler\" since=\"1\">\n\t\t<extends name=\"java/util/logging/StreamHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;II)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;IIZ)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Z)V\"/>\n\t</class>\n\t<class name=\"java/util/logging/Filter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"isLoggable(Ljava/util/logging/LogRecord;)Z\"/>\n\t</class>\n\t<class name=\"java/util/logging/Formatter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"format(Ljava/util/logging/LogRecord;)Ljava/lang/String;\"/>\n\t\t<method name=\"formatMessage(Ljava/util/logging/LogRecord;)Ljava/lang/String;\"/>\n\t\t<method name=\"getHead(Ljava/util/logging/Handler;)Ljava/lang/String;\"/>\n\t\t<method name=\"getTail(Ljava/util/logging/Handler;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/util/logging/Handler\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"flush()V\"/>\n\t\t<method name=\"getEncoding()Ljava/lang/String;\"/>\n\t\t<method name=\"getErrorManager()Ljava/util/logging/ErrorManager;\"/>\n\t\t<method name=\"getFilter()Ljava/util/logging/Filter;\"/>\n\t\t<method name=\"getFormatter()Ljava/util/logging/Formatter;\"/>\n\t\t<method name=\"getLevel()Ljava/util/logging/Level;\"/>\n\t\t<method name=\"isLoggable(Ljava/util/logging/LogRecord;)Z\"/>\n\t\t<method name=\"publish(Ljava/util/logging/LogRecord;)V\"/>\n\t\t<method name=\"reportError(Ljava/lang/String;Ljava/lang/Exception;I)V\"/>\n\t\t<method name=\"setEncoding(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setErrorManager(Ljava/util/logging/ErrorManager;)V\"/>\n\t\t<method name=\"setFilter(Ljava/util/logging/Filter;)V\"/>\n\t\t<method name=\"setFormatter(Ljava/util/logging/Formatter;)V\"/>\n\t\t<method name=\"setLevel(Ljava/util/logging/Level;)V\"/>\n\t</class>\n\t<class name=\"java/util/logging/Level\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;ILjava/lang/String;)V\"/>\n\t\t<method name=\"getLocalizedName()Ljava/lang/String;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getResourceBundleName()Ljava/lang/String;\"/>\n\t\t<method name=\"intValue()I\"/>\n\t\t<method name=\"parse(Ljava/lang/String;)Ljava/util/logging/Level;\"/>\n\t\t<field name=\"ALL\"/>\n\t\t<field name=\"CONFIG\"/>\n\t\t<field name=\"FINE\"/>\n\t\t<field name=\"FINER\"/>\n\t\t<field name=\"FINEST\"/>\n\t\t<field name=\"INFO\"/>\n\t\t<field name=\"OFF\"/>\n\t\t<field name=\"SEVERE\"/>\n\t\t<field name=\"WARNING\"/>\n\t</class>\n\t<class name=\"java/util/logging/LogManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addLogger(Ljava/util/logging/Logger;)Z\"/>\n\t\t<method name=\"addPropertyChangeListener(Ljava/beans/PropertyChangeListener;)V\" since=\"3\" deprecated=\"26\"/>\n\t\t<method name=\"checkAccess()V\"/>\n\t\t<method name=\"getLogManager()Ljava/util/logging/LogManager;\"/>\n\t\t<method name=\"getLogger(Ljava/lang/String;)Ljava/util/logging/Logger;\"/>\n\t\t<method name=\"getLoggerNames()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"getLoggingMXBean()Ljava/util/logging/LoggingMXBean;\" since=\"3\"/>\n\t\t<method name=\"getProperty(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"readConfiguration()V\"/>\n\t\t<method name=\"readConfiguration(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"removePropertyChangeListener(Ljava/beans/PropertyChangeListener;)V\" since=\"3\" deprecated=\"26\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<field name=\"LOGGING_MXBEAN_NAME\"/>\n\t</class>\n\t<class name=\"java/util/logging/LogRecord\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/logging/Level;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getLevel()Ljava/util/logging/Level;\"/>\n\t\t<method name=\"getLoggerName()Ljava/lang/String;\"/>\n\t\t<method name=\"getMessage()Ljava/lang/String;\"/>\n\t\t<method name=\"getMillis()J\"/>\n\t\t<method name=\"getParameters()[Ljava/lang/Object;\"/>\n\t\t<method name=\"getResourceBundle()Ljava/util/ResourceBundle;\"/>\n\t\t<method name=\"getResourceBundleName()Ljava/lang/String;\"/>\n\t\t<method name=\"getSequenceNumber()J\"/>\n\t\t<method name=\"getSourceClassName()Ljava/lang/String;\"/>\n\t\t<method name=\"getSourceMethodName()Ljava/lang/String;\"/>\n\t\t<method name=\"getThreadID()I\"/>\n\t\t<method name=\"getThrown()Ljava/lang/Throwable;\"/>\n\t\t<method name=\"setLevel(Ljava/util/logging/Level;)V\"/>\n\t\t<method name=\"setLoggerName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setMessage(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setMillis(J)V\"/>\n\t\t<method name=\"setParameters([Ljava/lang/Object;)V\"/>\n\t\t<method name=\"setResourceBundle(Ljava/util/ResourceBundle;)V\"/>\n\t\t<method name=\"setResourceBundleName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setSequenceNumber(J)V\"/>\n\t\t<method name=\"setSourceClassName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setSourceMethodName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setThreadID(I)V\"/>\n\t\t<method name=\"setThrown(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/util/logging/Logger\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"addHandler(Ljava/util/logging/Handler;)V\"/>\n\t\t<method name=\"config(Ljava/lang/String;)V\"/>\n\t\t<method name=\"config(Ljava/util/function/Supplier;)V\" since=\"26\"/>\n\t\t<method name=\"entering(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"entering(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"entering(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V\"/>\n\t\t<method name=\"exiting(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"exiting(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"fine(Ljava/lang/String;)V\"/>\n\t\t<method name=\"fine(Ljava/util/function/Supplier;)V\" since=\"26\"/>\n\t\t<method name=\"finer(Ljava/lang/String;)V\"/>\n\t\t<method name=\"finer(Ljava/util/function/Supplier;)V\" since=\"26\"/>\n\t\t<method name=\"finest(Ljava/lang/String;)V\"/>\n\t\t<method name=\"finest(Ljava/util/function/Supplier;)V\" since=\"26\"/>\n\t\t<method name=\"getAnonymousLogger()Ljava/util/logging/Logger;\"/>\n\t\t<method name=\"getAnonymousLogger(Ljava/lang/String;)Ljava/util/logging/Logger;\"/>\n\t\t<method name=\"getFilter()Ljava/util/logging/Filter;\"/>\n\t\t<method name=\"getGlobal()Ljava/util/logging/Logger;\" since=\"19\"/>\n\t\t<method name=\"getHandlers()[Ljava/util/logging/Handler;\"/>\n\t\t<method name=\"getLevel()Ljava/util/logging/Level;\"/>\n\t\t<method name=\"getLogger(Ljava/lang/String;)Ljava/util/logging/Logger;\"/>\n\t\t<method name=\"getLogger(Ljava/lang/String;Ljava/lang/String;)Ljava/util/logging/Logger;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getParent()Ljava/util/logging/Logger;\"/>\n\t\t<method name=\"getResourceBundle()Ljava/util/ResourceBundle;\"/>\n\t\t<method name=\"getResourceBundleName()Ljava/lang/String;\"/>\n\t\t<method name=\"getUseParentHandlers()Z\"/>\n\t\t<method name=\"info(Ljava/lang/String;)V\"/>\n\t\t<method name=\"info(Ljava/util/function/Supplier;)V\" since=\"26\"/>\n\t\t<method name=\"isLoggable(Ljava/util/logging/Level;)Z\"/>\n\t\t<method name=\"log(Ljava/util/logging/Level;Ljava/lang/String;)V\"/>\n\t\t<method name=\"log(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"log(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"log(Ljava/util/logging/Level;Ljava/lang/String;[Ljava/lang/Object;)V\"/>\n\t\t<method name=\"log(Ljava/util/logging/Level;Ljava/lang/Throwable;Ljava/util/function/Supplier;)V\" since=\"26\"/>\n\t\t<method name=\"log(Ljava/util/logging/Level;Ljava/util/function/Supplier;)V\" since=\"26\"/>\n\t\t<method name=\"log(Ljava/util/logging/LogRecord;)V\"/>\n\t\t<method name=\"logp(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"logp(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"logp(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"logp(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V\"/>\n\t\t<method name=\"logp(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Ljava/util/function/Supplier;)V\" since=\"26\"/>\n\t\t<method name=\"logp(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/util/function/Supplier;)V\" since=\"26\"/>\n\t\t<method name=\"logrb(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"26\"/>\n\t\t<method name=\"logrb(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V\" deprecated=\"26\"/>\n\t\t<method name=\"logrb(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V\" deprecated=\"26\"/>\n\t\t<method name=\"logrb(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V\" deprecated=\"26\"/>\n\t\t<method name=\"logrb(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/util/ResourceBundle;Ljava/lang/String;Ljava/lang/Throwable;)V\" since=\"26\"/>\n\t\t<method name=\"logrb(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/util/ResourceBundle;Ljava/lang/String;[Ljava/lang/Object;)V\" since=\"26\"/>\n\t\t<method name=\"removeHandler(Ljava/util/logging/Handler;)V\"/>\n\t\t<method name=\"setFilter(Ljava/util/logging/Filter;)V\"/>\n\t\t<method name=\"setLevel(Ljava/util/logging/Level;)V\"/>\n\t\t<method name=\"setParent(Ljava/util/logging/Logger;)V\"/>\n\t\t<method name=\"setResourceBundle(Ljava/util/ResourceBundle;)V\" since=\"26\"/>\n\t\t<method name=\"setUseParentHandlers(Z)V\"/>\n\t\t<method name=\"severe(Ljava/lang/String;)V\"/>\n\t\t<method name=\"severe(Ljava/util/function/Supplier;)V\" since=\"26\"/>\n\t\t<method name=\"throwing(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"warning(Ljava/lang/String;)V\"/>\n\t\t<method name=\"warning(Ljava/util/function/Supplier;)V\" since=\"26\"/>\n\t\t<field name=\"GLOBAL_LOGGER_NAME\" since=\"9\"/>\n\t\t<field name=\"global\" deprecated=\"15\"/>\n\t</class>\n\t<class name=\"java/util/logging/LoggingMXBean\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getLoggerLevel(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getLoggerNames()Ljava/util/List;\"/>\n\t\t<method name=\"getParentLoggerName(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"setLoggerLevel(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/util/logging/LoggingPermission\" since=\"1\">\n\t\t<extends name=\"java/security/BasicPermission\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/util/logging/MemoryHandler\" since=\"1\">\n\t\t<extends name=\"java/util/logging/Handler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/logging/Handler;ILjava/util/logging/Level;)V\"/>\n\t\t<method name=\"getPushLevel()Ljava/util/logging/Level;\"/>\n\t\t<method name=\"push()V\"/>\n\t\t<method name=\"setPushLevel(Ljava/util/logging/Level;)V\"/>\n\t</class>\n\t<class name=\"java/util/logging/SimpleFormatter\" since=\"1\">\n\t\t<extends name=\"java/util/logging/Formatter\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/util/logging/SocketHandler\" since=\"1\">\n\t\t<extends name=\"java/util/logging/StreamHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t</class>\n\t<class name=\"java/util/logging/StreamHandler\" since=\"1\">\n\t\t<extends name=\"java/util/logging/Handler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;Ljava/util/logging/Formatter;)V\"/>\n\t\t<method name=\"setOutputStream(Ljava/io/OutputStream;)V\"/>\n\t</class>\n\t<class name=\"java/util/logging/XMLFormatter\" since=\"1\">\n\t\t<extends name=\"java/util/logging/Formatter\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"java/util/prefs/AbstractPreferences\" since=\"1\">\n\t\t<extends name=\"java/util/prefs/Preferences\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/prefs/AbstractPreferences;Ljava/lang/String;)V\"/>\n\t\t<method name=\"cachedChildren()[Ljava/util/prefs/AbstractPreferences;\"/>\n\t\t<method name=\"childSpi(Ljava/lang/String;)Ljava/util/prefs/AbstractPreferences;\"/>\n\t\t<method name=\"childrenNamesSpi()[Ljava/lang/String;\"/>\n\t\t<method name=\"flushSpi()V\"/>\n\t\t<method name=\"getChild(Ljava/lang/String;)Ljava/util/prefs/AbstractPreferences;\"/>\n\t\t<method name=\"getSpi(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"isRemoved()Z\"/>\n\t\t<method name=\"keysSpi()[Ljava/lang/String;\"/>\n\t\t<method name=\"putSpi(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"removeNodeSpi()V\"/>\n\t\t<method name=\"removeSpi(Ljava/lang/String;)V\"/>\n\t\t<method name=\"syncSpi()V\"/>\n\t\t<field name=\"lock\"/>\n\t\t<field name=\"newNode\"/>\n\t</class>\n\t<class name=\"java/util/prefs/BackingStoreException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/util/prefs/InvalidPreferencesFormatException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"java/util/prefs/NodeChangeEvent\" since=\"1\">\n\t\t<extends name=\"java/util/EventObject\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/prefs/Preferences;Ljava/util/prefs/Preferences;)V\"/>\n\t\t<method name=\"getChild()Ljava/util/prefs/Preferences;\"/>\n\t\t<method name=\"getParent()Ljava/util/prefs/Preferences;\"/>\n\t</class>\n\t<class name=\"java/util/prefs/NodeChangeListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/EventListener\"/>\n\t\t<method name=\"childAdded(Ljava/util/prefs/NodeChangeEvent;)V\"/>\n\t\t<method name=\"childRemoved(Ljava/util/prefs/NodeChangeEvent;)V\"/>\n\t</class>\n\t<class name=\"java/util/prefs/PreferenceChangeEvent\" since=\"1\">\n\t\t<extends name=\"java/util/EventObject\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/prefs/Preferences;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getKey()Ljava/lang/String;\"/>\n\t\t<method name=\"getNewValue()Ljava/lang/String;\"/>\n\t\t<method name=\"getNode()Ljava/util/prefs/Preferences;\"/>\n\t</class>\n\t<class name=\"java/util/prefs/PreferenceChangeListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/EventListener\"/>\n\t\t<method name=\"preferenceChange(Ljava/util/prefs/PreferenceChangeEvent;)V\"/>\n\t</class>\n\t<class name=\"java/util/prefs/Preferences\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"absolutePath()Ljava/lang/String;\"/>\n\t\t<method name=\"addNodeChangeListener(Ljava/util/prefs/NodeChangeListener;)V\"/>\n\t\t<method name=\"addPreferenceChangeListener(Ljava/util/prefs/PreferenceChangeListener;)V\"/>\n\t\t<method name=\"childrenNames()[Ljava/lang/String;\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"exportNode(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"exportSubtree(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"flush()V\"/>\n\t\t<method name=\"get(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getBoolean(Ljava/lang/String;Z)Z\"/>\n\t\t<method name=\"getByteArray(Ljava/lang/String;[B)[B\"/>\n\t\t<method name=\"getDouble(Ljava/lang/String;D)D\"/>\n\t\t<method name=\"getFloat(Ljava/lang/String;F)F\"/>\n\t\t<method name=\"getInt(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"getLong(Ljava/lang/String;J)J\"/>\n\t\t<method name=\"importPreferences(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"isUserNode()Z\"/>\n\t\t<method name=\"keys()[Ljava/lang/String;\"/>\n\t\t<method name=\"name()Ljava/lang/String;\"/>\n\t\t<method name=\"node(Ljava/lang/String;)Ljava/util/prefs/Preferences;\"/>\n\t\t<method name=\"nodeExists(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"parent()Ljava/util/prefs/Preferences;\"/>\n\t\t<method name=\"put(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"putBoolean(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"putByteArray(Ljava/lang/String;[B)V\"/>\n\t\t<method name=\"putDouble(Ljava/lang/String;D)V\"/>\n\t\t<method name=\"putFloat(Ljava/lang/String;F)V\"/>\n\t\t<method name=\"putInt(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"putLong(Ljava/lang/String;J)V\"/>\n\t\t<method name=\"remove(Ljava/lang/String;)V\"/>\n\t\t<method name=\"removeNode()V\"/>\n\t\t<method name=\"removeNodeChangeListener(Ljava/util/prefs/NodeChangeListener;)V\"/>\n\t\t<method name=\"removePreferenceChangeListener(Ljava/util/prefs/PreferenceChangeListener;)V\"/>\n\t\t<method name=\"sync()V\"/>\n\t\t<method name=\"systemNodeForPackage(Ljava/lang/Class;)Ljava/util/prefs/Preferences;\"/>\n\t\t<method name=\"systemRoot()Ljava/util/prefs/Preferences;\"/>\n\t\t<method name=\"userNodeForPackage(Ljava/lang/Class;)Ljava/util/prefs/Preferences;\"/>\n\t\t<method name=\"userRoot()Ljava/util/prefs/Preferences;\"/>\n\t\t<field name=\"MAX_KEY_LENGTH\"/>\n\t\t<field name=\"MAX_NAME_LENGTH\"/>\n\t\t<field name=\"MAX_VALUE_LENGTH\"/>\n\t</class>\n\t<class name=\"java/util/prefs/PreferencesFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"systemRoot()Ljava/util/prefs/Preferences;\"/>\n\t\t<method name=\"userRoot()Ljava/util/prefs/Preferences;\"/>\n\t</class>\n\t<class name=\"java/util/regex/MatchResult\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"end()I\"/>\n\t\t<method name=\"end(I)I\"/>\n\t\t<method name=\"group()Ljava/lang/String;\"/>\n\t\t<method name=\"group(I)Ljava/lang/String;\"/>\n\t\t<method name=\"groupCount()I\"/>\n\t\t<method name=\"start()I\"/>\n\t\t<method name=\"start(I)I\"/>\n\t</class>\n\t<class name=\"java/util/regex/Matcher\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/regex/MatchResult\"/>\n\t\t<method name=\"appendReplacement(Ljava/lang/StringBuffer;Ljava/lang/String;)Ljava/util/regex/Matcher;\"/>\n\t\t<method name=\"appendTail(Ljava/lang/StringBuffer;)Ljava/lang/StringBuffer;\"/>\n\t\t<method name=\"end(Ljava/lang/String;)I\" since=\"26\"/>\n\t\t<method name=\"find()Z\"/>\n\t\t<method name=\"find(I)Z\"/>\n\t\t<method name=\"group(Ljava/lang/String;)Ljava/lang/String;\" since=\"26\"/>\n\t\t<method name=\"hasAnchoringBounds()Z\"/>\n\t\t<method name=\"hasTransparentBounds()Z\"/>\n\t\t<method name=\"hitEnd()Z\"/>\n\t\t<method name=\"lookingAt()Z\"/>\n\t\t<method name=\"matches()Z\"/>\n\t\t<method name=\"pattern()Ljava/util/regex/Pattern;\"/>\n\t\t<method name=\"quoteReplacement(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"region(II)Ljava/util/regex/Matcher;\"/>\n\t\t<method name=\"regionEnd()I\"/>\n\t\t<method name=\"regionStart()I\"/>\n\t\t<method name=\"replaceAll(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"replaceFirst(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"requireEnd()Z\"/>\n\t\t<method name=\"reset()Ljava/util/regex/Matcher;\"/>\n\t\t<method name=\"reset(Ljava/lang/CharSequence;)Ljava/util/regex/Matcher;\"/>\n\t\t<method name=\"start(Ljava/lang/String;)I\" since=\"26\"/>\n\t\t<method name=\"toMatchResult()Ljava/util/regex/MatchResult;\"/>\n\t\t<method name=\"useAnchoringBounds(Z)Ljava/util/regex/Matcher;\"/>\n\t\t<method name=\"usePattern(Ljava/util/regex/Pattern;)Ljava/util/regex/Matcher;\"/>\n\t\t<method name=\"useTransparentBounds(Z)Ljava/util/regex/Matcher;\"/>\n\t</class>\n\t<class name=\"java/util/regex/Pattern\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"asPredicate()Ljava/util/function/Predicate;\" since=\"24\"/>\n\t\t<method name=\"compile(Ljava/lang/String;)Ljava/util/regex/Pattern;\"/>\n\t\t<method name=\"compile(Ljava/lang/String;I)Ljava/util/regex/Pattern;\"/>\n\t\t<method name=\"flags()I\"/>\n\t\t<method name=\"matcher(Ljava/lang/CharSequence;)Ljava/util/regex/Matcher;\"/>\n\t\t<method name=\"matches(Ljava/lang/String;Ljava/lang/CharSequence;)Z\"/>\n\t\t<method name=\"pattern()Ljava/lang/String;\"/>\n\t\t<method name=\"quote(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"split(Ljava/lang/CharSequence;)[Ljava/lang/String;\"/>\n\t\t<method name=\"split(Ljava/lang/CharSequence;I)[Ljava/lang/String;\"/>\n\t\t<method name=\"splitAsStream(Ljava/lang/CharSequence;)Ljava/util/stream/Stream;\" since=\"24\"/>\n\t\t<field name=\"CANON_EQ\"/>\n\t\t<field name=\"CASE_INSENSITIVE\"/>\n\t\t<field name=\"COMMENTS\"/>\n\t\t<field name=\"DOTALL\"/>\n\t\t<field name=\"LITERAL\"/>\n\t\t<field name=\"MULTILINE\"/>\n\t\t<field name=\"UNICODE_CASE\"/>\n\t\t<field name=\"UNICODE_CHARACTER_CLASS\" since=\"24\"/>\n\t\t<field name=\"UNIX_LINES\"/>\n\t</class>\n\t<class name=\"java/util/regex/PatternSyntaxException\" since=\"1\">\n\t\t<extends name=\"java/lang/IllegalArgumentException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V\"/>\n\t\t<method name=\"getDescription()Ljava/lang/String;\"/>\n\t\t<method name=\"getIndex()I\"/>\n\t\t<method name=\"getPattern()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"java/util/stream/BaseStream\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/AutoCloseable\"/>\n\t\t<method name=\"isParallel()Z\"/>\n\t\t<method name=\"iterator()Ljava/util/Iterator;\"/>\n\t\t<method name=\"onClose(Ljava/lang/Runnable;)Ljava/util/stream/BaseStream;\"/>\n\t\t<method name=\"parallel()Ljava/util/stream/BaseStream;\"/>\n\t\t<method name=\"sequential()Ljava/util/stream/BaseStream;\"/>\n\t\t<method name=\"spliterator()Ljava/util/Spliterator;\"/>\n\t\t<method name=\"unordered()Ljava/util/stream/BaseStream;\"/>\n\t</class>\n\t<class name=\"java/util/stream/Collector\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"accumulator()Ljava/util/function/BiConsumer;\"/>\n\t\t<method name=\"characteristics()Ljava/util/Set;\"/>\n\t\t<method name=\"combiner()Ljava/util/function/BinaryOperator;\"/>\n\t\t<method name=\"finisher()Ljava/util/function/Function;\"/>\n\t\t<method name=\"of(Ljava/util/function/Supplier;Ljava/util/function/BiConsumer;Ljava/util/function/BinaryOperator;Ljava/util/function/Function;[Ljava/util/stream/Collector$Characteristics;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"of(Ljava/util/function/Supplier;Ljava/util/function/BiConsumer;Ljava/util/function/BinaryOperator;[Ljava/util/stream/Collector$Characteristics;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"supplier()Ljava/util/function/Supplier;\"/>\n\t</class>\n\t<class name=\"java/util/stream/Collector$Characteristics\" since=\"24\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljava/util/stream/Collector$Characteristics;\"/>\n\t\t<method name=\"values()[Ljava/util/stream/Collector$Characteristics;\"/>\n\t\t<field name=\"CONCURRENT\"/>\n\t\t<field name=\"IDENTITY_FINISH\"/>\n\t\t<field name=\"UNORDERED\"/>\n\t</class>\n\t<class name=\"java/util/stream/Collectors\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"averagingDouble(Ljava/util/function/ToDoubleFunction;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"averagingInt(Ljava/util/function/ToIntFunction;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"averagingLong(Ljava/util/function/ToLongFunction;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"collectingAndThen(Ljava/util/stream/Collector;Ljava/util/function/Function;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"counting()Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"groupingBy(Ljava/util/function/Function;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"groupingBy(Ljava/util/function/Function;Ljava/util/function/Supplier;Ljava/util/stream/Collector;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"groupingBy(Ljava/util/function/Function;Ljava/util/stream/Collector;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"groupingByConcurrent(Ljava/util/function/Function;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"groupingByConcurrent(Ljava/util/function/Function;Ljava/util/function/Supplier;Ljava/util/stream/Collector;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"groupingByConcurrent(Ljava/util/function/Function;Ljava/util/stream/Collector;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"joining()Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"joining(Ljava/lang/CharSequence;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"joining(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"mapping(Ljava/util/function/Function;Ljava/util/stream/Collector;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"maxBy(Ljava/util/Comparator;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"minBy(Ljava/util/Comparator;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"partitioningBy(Ljava/util/function/Predicate;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"partitioningBy(Ljava/util/function/Predicate;Ljava/util/stream/Collector;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"reducing(Ljava/lang/Object;Ljava/util/function/BinaryOperator;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"reducing(Ljava/lang/Object;Ljava/util/function/Function;Ljava/util/function/BinaryOperator;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"reducing(Ljava/util/function/BinaryOperator;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"summarizingDouble(Ljava/util/function/ToDoubleFunction;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"summarizingInt(Ljava/util/function/ToIntFunction;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"summarizingLong(Ljava/util/function/ToLongFunction;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"summingDouble(Ljava/util/function/ToDoubleFunction;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"summingInt(Ljava/util/function/ToIntFunction;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"summingLong(Ljava/util/function/ToLongFunction;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"toCollection(Ljava/util/function/Supplier;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"toConcurrentMap(Ljava/util/function/Function;Ljava/util/function/Function;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"toConcurrentMap(Ljava/util/function/Function;Ljava/util/function/Function;Ljava/util/function/BinaryOperator;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"toConcurrentMap(Ljava/util/function/Function;Ljava/util/function/Function;Ljava/util/function/BinaryOperator;Ljava/util/function/Supplier;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"toList()Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"toMap(Ljava/util/function/Function;Ljava/util/function/Function;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"toMap(Ljava/util/function/Function;Ljava/util/function/Function;Ljava/util/function/BinaryOperator;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"toMap(Ljava/util/function/Function;Ljava/util/function/Function;Ljava/util/function/BinaryOperator;Ljava/util/function/Supplier;)Ljava/util/stream/Collector;\"/>\n\t\t<method name=\"toSet()Ljava/util/stream/Collector;\"/>\n\t</class>\n\t<class name=\"java/util/stream/DoubleStream\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/stream/BaseStream\"/>\n\t\t<method name=\"allMatch(Ljava/util/function/DoublePredicate;)Z\"/>\n\t\t<method name=\"anyMatch(Ljava/util/function/DoublePredicate;)Z\"/>\n\t\t<method name=\"average()Ljava/util/OptionalDouble;\"/>\n\t\t<method name=\"boxed()Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"builder()Ljava/util/stream/DoubleStream$Builder;\"/>\n\t\t<method name=\"collect(Ljava/util/function/Supplier;Ljava/util/function/ObjDoubleConsumer;Ljava/util/function/BiConsumer;)Ljava/lang/Object;\"/>\n\t\t<method name=\"concat(Ljava/util/stream/DoubleStream;Ljava/util/stream/DoubleStream;)Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"count()J\"/>\n\t\t<method name=\"distinct()Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"empty()Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"filter(Ljava/util/function/DoublePredicate;)Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"findAny()Ljava/util/OptionalDouble;\"/>\n\t\t<method name=\"findFirst()Ljava/util/OptionalDouble;\"/>\n\t\t<method name=\"flatMap(Ljava/util/function/DoubleFunction;)Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"forEach(Ljava/util/function/DoubleConsumer;)V\"/>\n\t\t<method name=\"forEachOrdered(Ljava/util/function/DoubleConsumer;)V\"/>\n\t\t<method name=\"generate(Ljava/util/function/DoubleSupplier;)Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"iterate(DLjava/util/function/DoubleUnaryOperator;)Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"iterator()Ljava/util/PrimitiveIterator$OfDouble;\"/>\n\t\t<method name=\"limit(J)Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"map(Ljava/util/function/DoubleUnaryOperator;)Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"mapToInt(Ljava/util/function/DoubleToIntFunction;)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"mapToLong(Ljava/util/function/DoubleToLongFunction;)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"mapToObj(Ljava/util/function/DoubleFunction;)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"max()Ljava/util/OptionalDouble;\"/>\n\t\t<method name=\"min()Ljava/util/OptionalDouble;\"/>\n\t\t<method name=\"noneMatch(Ljava/util/function/DoublePredicate;)Z\"/>\n\t\t<method name=\"of(D)Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"of([D)Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"parallel()Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"peek(Ljava/util/function/DoubleConsumer;)Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"reduce(DLjava/util/function/DoubleBinaryOperator;)D\"/>\n\t\t<method name=\"reduce(Ljava/util/function/DoubleBinaryOperator;)Ljava/util/OptionalDouble;\"/>\n\t\t<method name=\"sequential()Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"skip(J)Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"sorted()Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"spliterator()Ljava/util/Spliterator$OfDouble;\"/>\n\t\t<method name=\"sum()D\"/>\n\t\t<method name=\"summaryStatistics()Ljava/util/DoubleSummaryStatistics;\"/>\n\t\t<method name=\"toArray()[D\"/>\n\t</class>\n\t<class name=\"java/util/stream/DoubleStream$Builder\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/function/DoubleConsumer\"/>\n\t\t<method name=\"add(D)Ljava/util/stream/DoubleStream$Builder;\"/>\n\t\t<method name=\"build()Ljava/util/stream/DoubleStream;\"/>\n\t</class>\n\t<class name=\"java/util/stream/IntStream\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/stream/BaseStream\"/>\n\t\t<method name=\"allMatch(Ljava/util/function/IntPredicate;)Z\"/>\n\t\t<method name=\"anyMatch(Ljava/util/function/IntPredicate;)Z\"/>\n\t\t<method name=\"asDoubleStream()Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"asLongStream()Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"average()Ljava/util/OptionalDouble;\"/>\n\t\t<method name=\"boxed()Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"builder()Ljava/util/stream/IntStream$Builder;\"/>\n\t\t<method name=\"collect(Ljava/util/function/Supplier;Ljava/util/function/ObjIntConsumer;Ljava/util/function/BiConsumer;)Ljava/lang/Object;\"/>\n\t\t<method name=\"concat(Ljava/util/stream/IntStream;Ljava/util/stream/IntStream;)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"count()J\"/>\n\t\t<method name=\"distinct()Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"empty()Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"filter(Ljava/util/function/IntPredicate;)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"findAny()Ljava/util/OptionalInt;\"/>\n\t\t<method name=\"findFirst()Ljava/util/OptionalInt;\"/>\n\t\t<method name=\"flatMap(Ljava/util/function/IntFunction;)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"forEach(Ljava/util/function/IntConsumer;)V\"/>\n\t\t<method name=\"forEachOrdered(Ljava/util/function/IntConsumer;)V\"/>\n\t\t<method name=\"generate(Ljava/util/function/IntSupplier;)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"iterate(ILjava/util/function/IntUnaryOperator;)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"iterator()Ljava/util/PrimitiveIterator$OfInt;\"/>\n\t\t<method name=\"limit(J)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"map(Ljava/util/function/IntUnaryOperator;)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"mapToDouble(Ljava/util/function/IntToDoubleFunction;)Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"mapToLong(Ljava/util/function/IntToLongFunction;)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"mapToObj(Ljava/util/function/IntFunction;)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"max()Ljava/util/OptionalInt;\"/>\n\t\t<method name=\"min()Ljava/util/OptionalInt;\"/>\n\t\t<method name=\"noneMatch(Ljava/util/function/IntPredicate;)Z\"/>\n\t\t<method name=\"of(I)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"of([I)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"parallel()Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"peek(Ljava/util/function/IntConsumer;)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"range(II)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"rangeClosed(II)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"reduce(ILjava/util/function/IntBinaryOperator;)I\"/>\n\t\t<method name=\"reduce(Ljava/util/function/IntBinaryOperator;)Ljava/util/OptionalInt;\"/>\n\t\t<method name=\"sequential()Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"skip(J)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"sorted()Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"spliterator()Ljava/util/Spliterator$OfInt;\"/>\n\t\t<method name=\"sum()I\"/>\n\t\t<method name=\"summaryStatistics()Ljava/util/IntSummaryStatistics;\"/>\n\t\t<method name=\"toArray()[I\"/>\n\t</class>\n\t<class name=\"java/util/stream/IntStream$Builder\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/function/IntConsumer\"/>\n\t\t<method name=\"add(I)Ljava/util/stream/IntStream$Builder;\"/>\n\t\t<method name=\"build()Ljava/util/stream/IntStream;\"/>\n\t</class>\n\t<class name=\"java/util/stream/LongStream\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/stream/BaseStream\"/>\n\t\t<method name=\"allMatch(Ljava/util/function/LongPredicate;)Z\"/>\n\t\t<method name=\"anyMatch(Ljava/util/function/LongPredicate;)Z\"/>\n\t\t<method name=\"asDoubleStream()Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"average()Ljava/util/OptionalDouble;\"/>\n\t\t<method name=\"boxed()Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"builder()Ljava/util/stream/LongStream$Builder;\"/>\n\t\t<method name=\"collect(Ljava/util/function/Supplier;Ljava/util/function/ObjLongConsumer;Ljava/util/function/BiConsumer;)Ljava/lang/Object;\"/>\n\t\t<method name=\"concat(Ljava/util/stream/LongStream;Ljava/util/stream/LongStream;)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"count()J\"/>\n\t\t<method name=\"distinct()Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"empty()Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"filter(Ljava/util/function/LongPredicate;)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"findAny()Ljava/util/OptionalLong;\"/>\n\t\t<method name=\"findFirst()Ljava/util/OptionalLong;\"/>\n\t\t<method name=\"flatMap(Ljava/util/function/LongFunction;)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"forEach(Ljava/util/function/LongConsumer;)V\"/>\n\t\t<method name=\"forEachOrdered(Ljava/util/function/LongConsumer;)V\"/>\n\t\t<method name=\"generate(Ljava/util/function/LongSupplier;)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"iterate(JLjava/util/function/LongUnaryOperator;)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"iterator()Ljava/util/PrimitiveIterator$OfLong;\"/>\n\t\t<method name=\"limit(J)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"map(Ljava/util/function/LongUnaryOperator;)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"mapToDouble(Ljava/util/function/LongToDoubleFunction;)Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"mapToInt(Ljava/util/function/LongToIntFunction;)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"mapToObj(Ljava/util/function/LongFunction;)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"max()Ljava/util/OptionalLong;\"/>\n\t\t<method name=\"min()Ljava/util/OptionalLong;\"/>\n\t\t<method name=\"noneMatch(Ljava/util/function/LongPredicate;)Z\"/>\n\t\t<method name=\"of(J)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"of([J)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"parallel()Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"peek(Ljava/util/function/LongConsumer;)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"range(JJ)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"rangeClosed(JJ)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"reduce(JLjava/util/function/LongBinaryOperator;)J\"/>\n\t\t<method name=\"reduce(Ljava/util/function/LongBinaryOperator;)Ljava/util/OptionalLong;\"/>\n\t\t<method name=\"sequential()Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"skip(J)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"sorted()Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"spliterator()Ljava/util/Spliterator$OfLong;\"/>\n\t\t<method name=\"sum()J\"/>\n\t\t<method name=\"summaryStatistics()Ljava/util/LongSummaryStatistics;\"/>\n\t\t<method name=\"toArray()[J\"/>\n\t</class>\n\t<class name=\"java/util/stream/LongStream$Builder\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/function/LongConsumer\"/>\n\t\t<method name=\"add(J)Ljava/util/stream/LongStream$Builder;\"/>\n\t\t<method name=\"build()Ljava/util/stream/LongStream;\"/>\n\t</class>\n\t<class name=\"java/util/stream/Stream\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/stream/BaseStream\"/>\n\t\t<method name=\"allMatch(Ljava/util/function/Predicate;)Z\"/>\n\t\t<method name=\"anyMatch(Ljava/util/function/Predicate;)Z\"/>\n\t\t<method name=\"builder()Ljava/util/stream/Stream$Builder;\"/>\n\t\t<method name=\"collect(Ljava/util/function/Supplier;Ljava/util/function/BiConsumer;Ljava/util/function/BiConsumer;)Ljava/lang/Object;\"/>\n\t\t<method name=\"collect(Ljava/util/stream/Collector;)Ljava/lang/Object;\"/>\n\t\t<method name=\"concat(Ljava/util/stream/Stream;Ljava/util/stream/Stream;)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"count()J\"/>\n\t\t<method name=\"distinct()Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"empty()Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"filter(Ljava/util/function/Predicate;)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"findAny()Ljava/util/Optional;\"/>\n\t\t<method name=\"findFirst()Ljava/util/Optional;\"/>\n\t\t<method name=\"flatMap(Ljava/util/function/Function;)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"flatMapToDouble(Ljava/util/function/Function;)Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"flatMapToInt(Ljava/util/function/Function;)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"flatMapToLong(Ljava/util/function/Function;)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"forEach(Ljava/util/function/Consumer;)V\"/>\n\t\t<method name=\"forEachOrdered(Ljava/util/function/Consumer;)V\"/>\n\t\t<method name=\"generate(Ljava/util/function/Supplier;)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"iterate(Ljava/lang/Object;Ljava/util/function/UnaryOperator;)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"limit(J)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"map(Ljava/util/function/Function;)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"mapToDouble(Ljava/util/function/ToDoubleFunction;)Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"mapToInt(Ljava/util/function/ToIntFunction;)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"mapToLong(Ljava/util/function/ToLongFunction;)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"max(Ljava/util/Comparator;)Ljava/util/Optional;\"/>\n\t\t<method name=\"min(Ljava/util/Comparator;)Ljava/util/Optional;\"/>\n\t\t<method name=\"noneMatch(Ljava/util/function/Predicate;)Z\"/>\n\t\t<method name=\"of(Ljava/lang/Object;)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"of([Ljava/lang/Object;)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"peek(Ljava/util/function/Consumer;)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"reduce(Ljava/lang/Object;Ljava/util/function/BiFunction;Ljava/util/function/BinaryOperator;)Ljava/lang/Object;\"/>\n\t\t<method name=\"reduce(Ljava/lang/Object;Ljava/util/function/BinaryOperator;)Ljava/lang/Object;\"/>\n\t\t<method name=\"reduce(Ljava/util/function/BinaryOperator;)Ljava/util/Optional;\"/>\n\t\t<method name=\"skip(J)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"sorted()Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"sorted(Ljava/util/Comparator;)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"toArray()[Ljava/lang/Object;\"/>\n\t\t<method name=\"toArray(Ljava/util/function/IntFunction;)[Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"java/util/stream/Stream$Builder\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/function/Consumer\"/>\n\t\t<method name=\"add(Ljava/lang/Object;)Ljava/util/stream/Stream$Builder;\"/>\n\t\t<method name=\"build()Ljava/util/stream/Stream;\"/>\n\t</class>\n\t<class name=\"java/util/stream/StreamSupport\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"doubleStream(Ljava/util/Spliterator$OfDouble;Z)Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"doubleStream(Ljava/util/function/Supplier;IZ)Ljava/util/stream/DoubleStream;\"/>\n\t\t<method name=\"intStream(Ljava/util/Spliterator$OfInt;Z)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"intStream(Ljava/util/function/Supplier;IZ)Ljava/util/stream/IntStream;\"/>\n\t\t<method name=\"longStream(Ljava/util/Spliterator$OfLong;Z)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"longStream(Ljava/util/function/Supplier;IZ)Ljava/util/stream/LongStream;\"/>\n\t\t<method name=\"stream(Ljava/util/Spliterator;Z)Ljava/util/stream/Stream;\"/>\n\t\t<method name=\"stream(Ljava/util/function/Supplier;IZ)Ljava/util/stream/Stream;\"/>\n\t</class>\n\t<class name=\"java/util/zip/Adler32\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/zip/Checksum\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"update(Ljava/nio/ByteBuffer;)V\" since=\"26\"/>\n\t\t<method name=\"update([B)V\"/>\n\t</class>\n\t<class name=\"java/util/zip/CRC32\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/zip/Checksum\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"update(Ljava/nio/ByteBuffer;)V\" since=\"26\"/>\n\t\t<method name=\"update([B)V\"/>\n\t</class>\n\t<class name=\"java/util/zip/CheckedInputStream\" since=\"1\">\n\t\t<extends name=\"java/io/FilterInputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;Ljava/util/zip/Checksum;)V\"/>\n\t\t<method name=\"getChecksum()Ljava/util/zip/Checksum;\"/>\n\t</class>\n\t<class name=\"java/util/zip/CheckedOutputStream\" since=\"1\">\n\t\t<extends name=\"java/io/FilterOutputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;Ljava/util/zip/Checksum;)V\"/>\n\t\t<method name=\"getChecksum()Ljava/util/zip/Checksum;\"/>\n\t</class>\n\t<class name=\"java/util/zip/Checksum\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getValue()J\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"update(I)V\"/>\n\t\t<method name=\"update([BII)V\"/>\n\t</class>\n\t<class name=\"java/util/zip/DataFormatException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/util/zip/Deflater\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(IZ)V\"/>\n\t\t<method name=\"deflate([B)I\"/>\n\t\t<method name=\"deflate([BII)I\"/>\n\t\t<method name=\"deflate([BIII)I\" since=\"19\"/>\n\t\t<method name=\"end()V\"/>\n\t\t<method name=\"finish()V\"/>\n\t\t<method name=\"finished()Z\"/>\n\t\t<method name=\"getAdler()I\"/>\n\t\t<method name=\"getBytesRead()J\"/>\n\t\t<method name=\"getBytesWritten()J\"/>\n\t\t<method name=\"getTotalIn()I\"/>\n\t\t<method name=\"getTotalOut()I\"/>\n\t\t<method name=\"needsInput()Z\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"setDictionary([B)V\"/>\n\t\t<method name=\"setDictionary([BII)V\"/>\n\t\t<method name=\"setInput([B)V\"/>\n\t\t<method name=\"setInput([BII)V\"/>\n\t\t<method name=\"setLevel(I)V\"/>\n\t\t<method name=\"setStrategy(I)V\"/>\n\t\t<field name=\"BEST_COMPRESSION\"/>\n\t\t<field name=\"BEST_SPEED\"/>\n\t\t<field name=\"DEFAULT_COMPRESSION\"/>\n\t\t<field name=\"DEFAULT_STRATEGY\"/>\n\t\t<field name=\"DEFLATED\"/>\n\t\t<field name=\"FILTERED\"/>\n\t\t<field name=\"FULL_FLUSH\" since=\"19\"/>\n\t\t<field name=\"HUFFMAN_ONLY\"/>\n\t\t<field name=\"NO_COMPRESSION\"/>\n\t\t<field name=\"NO_FLUSH\" since=\"19\"/>\n\t\t<field name=\"SYNC_FLUSH\" since=\"19\"/>\n\t</class>\n\t<class name=\"java/util/zip/DeflaterInputStream\" since=\"9\">\n\t\t<extends name=\"java/io/FilterInputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;Ljava/util/zip/Deflater;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;Ljava/util/zip/Deflater;I)V\"/>\n\t\t<field name=\"buf\"/>\n\t\t<field name=\"def\"/>\n\t</class>\n\t<class name=\"java/util/zip/DeflaterOutputStream\" since=\"1\">\n\t\t<extends name=\"java/io/FilterOutputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;Ljava/util/zip/Deflater;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;Ljava/util/zip/Deflater;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;Ljava/util/zip/Deflater;IZ)V\" since=\"19\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;Ljava/util/zip/Deflater;Z)V\" since=\"19\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;Z)V\" since=\"19\"/>\n\t\t<method name=\"deflate()V\"/>\n\t\t<method name=\"finish()V\"/>\n\t\t<field name=\"buf\"/>\n\t\t<field name=\"def\"/>\n\t</class>\n\t<class name=\"java/util/zip/GZIPInputStream\" since=\"1\">\n\t\t<extends name=\"java/util/zip/InflaterInputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;I)V\"/>\n\t\t<field name=\"GZIP_MAGIC\"/>\n\t\t<field name=\"crc\"/>\n\t\t<field name=\"eos\"/>\n\t</class>\n\t<class name=\"java/util/zip/GZIPOutputStream\" since=\"1\">\n\t\t<extends name=\"java/util/zip/DeflaterOutputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;IZ)V\" since=\"19\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;Z)V\" since=\"19\"/>\n\t\t<field name=\"crc\"/>\n\t</class>\n\t<class name=\"java/util/zip/Inflater\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Z)V\"/>\n\t\t<method name=\"end()V\"/>\n\t\t<method name=\"finished()Z\"/>\n\t\t<method name=\"getAdler()I\"/>\n\t\t<method name=\"getBytesRead()J\"/>\n\t\t<method name=\"getBytesWritten()J\"/>\n\t\t<method name=\"getRemaining()I\"/>\n\t\t<method name=\"getTotalIn()I\"/>\n\t\t<method name=\"getTotalOut()I\"/>\n\t\t<method name=\"inflate([B)I\"/>\n\t\t<method name=\"inflate([BII)I\"/>\n\t\t<method name=\"needsDictionary()Z\"/>\n\t\t<method name=\"needsInput()Z\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"setDictionary([B)V\"/>\n\t\t<method name=\"setDictionary([BII)V\"/>\n\t\t<method name=\"setInput([B)V\"/>\n\t\t<method name=\"setInput([BII)V\"/>\n\t</class>\n\t<class name=\"java/util/zip/InflaterInputStream\" since=\"1\">\n\t\t<extends name=\"java/io/FilterInputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;Ljava/util/zip/Inflater;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;Ljava/util/zip/Inflater;I)V\"/>\n\t\t<method name=\"fill()V\"/>\n\t\t<field name=\"buf\"/>\n\t\t<field name=\"closed\" since=\"24\" deprecated=\"29\"/>\n\t\t<field name=\"inf\"/>\n\t\t<field name=\"len\"/>\n\t</class>\n\t<class name=\"java/util/zip/InflaterOutputStream\" since=\"9\">\n\t\t<extends name=\"java/io/FilterOutputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;Ljava/util/zip/Inflater;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;Ljava/util/zip/Inflater;I)V\"/>\n\t\t<method name=\"finish()V\"/>\n\t\t<field name=\"buf\"/>\n\t\t<field name=\"inf\"/>\n\t</class>\n\t<class name=\"java/util/zip/ZipEntry\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/zip/ZipEntry;)V\"/>\n\t\t<method name=\"getComment()Ljava/lang/String;\"/>\n\t\t<method name=\"getCompressedSize()J\"/>\n\t\t<method name=\"getCrc()J\"/>\n\t\t<method name=\"getCreationTime()Ljava/nio/file/attribute/FileTime;\" since=\"26\"/>\n\t\t<method name=\"getExtra()[B\"/>\n\t\t<method name=\"getLastAccessTime()Ljava/nio/file/attribute/FileTime;\" since=\"26\"/>\n\t\t<method name=\"getLastModifiedTime()Ljava/nio/file/attribute/FileTime;\" since=\"26\"/>\n\t\t<method name=\"getMethod()I\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getSize()J\"/>\n\t\t<method name=\"getTime()J\"/>\n\t\t<method name=\"isDirectory()Z\"/>\n\t\t<method name=\"setComment(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setCompressedSize(J)V\"/>\n\t\t<method name=\"setCrc(J)V\"/>\n\t\t<method name=\"setCreationTime(Ljava/nio/file/attribute/FileTime;)Ljava/util/zip/ZipEntry;\" since=\"26\"/>\n\t\t<method name=\"setExtra([B)V\"/>\n\t\t<method name=\"setLastAccessTime(Ljava/nio/file/attribute/FileTime;)Ljava/util/zip/ZipEntry;\" since=\"26\"/>\n\t\t<method name=\"setLastModifiedTime(Ljava/nio/file/attribute/FileTime;)Ljava/util/zip/ZipEntry;\" since=\"26\"/>\n\t\t<method name=\"setMethod(I)V\"/>\n\t\t<method name=\"setSize(J)V\"/>\n\t\t<method name=\"setTime(J)V\"/>\n\t\t<field name=\"CENATT\" since=\"21\"/>\n\t\t<field name=\"CENATX\" since=\"21\"/>\n\t\t<field name=\"CENCOM\" since=\"21\"/>\n\t\t<field name=\"CENCRC\" since=\"21\"/>\n\t\t<field name=\"CENDSK\" since=\"21\"/>\n\t\t<field name=\"CENEXT\" since=\"21\"/>\n\t\t<field name=\"CENFLG\" since=\"21\"/>\n\t\t<field name=\"CENHDR\" since=\"21\"/>\n\t\t<field name=\"CENHOW\" since=\"21\"/>\n\t\t<field name=\"CENLEN\" since=\"21\"/>\n\t\t<field name=\"CENNAM\" since=\"21\"/>\n\t\t<field name=\"CENOFF\" since=\"21\"/>\n\t\t<field name=\"CENSIG\" since=\"21\"/>\n\t\t<field name=\"CENSIZ\" since=\"21\"/>\n\t\t<field name=\"CENTIM\" since=\"21\"/>\n\t\t<field name=\"CENVEM\" since=\"21\"/>\n\t\t<field name=\"CENVER\" since=\"21\"/>\n\t\t<field name=\"DEFLATED\"/>\n\t\t<field name=\"ENDCOM\" since=\"21\"/>\n\t\t<field name=\"ENDHDR\" since=\"21\"/>\n\t\t<field name=\"ENDOFF\" since=\"21\"/>\n\t\t<field name=\"ENDSIG\" since=\"21\"/>\n\t\t<field name=\"ENDSIZ\" since=\"21\"/>\n\t\t<field name=\"ENDSUB\" since=\"21\"/>\n\t\t<field name=\"ENDTOT\" since=\"21\"/>\n\t\t<field name=\"EXTCRC\" since=\"21\"/>\n\t\t<field name=\"EXTHDR\" since=\"21\"/>\n\t\t<field name=\"EXTLEN\" since=\"21\"/>\n\t\t<field name=\"EXTSIG\" since=\"21\"/>\n\t\t<field name=\"EXTSIZ\" since=\"21\"/>\n\t\t<field name=\"LOCCRC\" since=\"21\"/>\n\t\t<field name=\"LOCEXT\" since=\"21\"/>\n\t\t<field name=\"LOCFLG\" since=\"21\"/>\n\t\t<field name=\"LOCHDR\" since=\"21\"/>\n\t\t<field name=\"LOCHOW\" since=\"21\"/>\n\t\t<field name=\"LOCLEN\" since=\"21\"/>\n\t\t<field name=\"LOCNAM\" since=\"21\"/>\n\t\t<field name=\"LOCSIG\" since=\"21\"/>\n\t\t<field name=\"LOCSIZ\" since=\"21\"/>\n\t\t<field name=\"LOCTIM\" since=\"21\"/>\n\t\t<field name=\"LOCVER\" since=\"21\"/>\n\t\t<field name=\"STORED\"/>\n\t</class>\n\t<class name=\"java/util/zip/ZipError\" since=\"9\">\n\t\t<extends name=\"java/lang/InternalError\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/util/zip/ZipException\" since=\"1\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"java/util/zip/ZipFile\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Closeable\" since=\"19\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;ILjava/nio/charset/Charset;)V\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;Ljava/nio/charset/Charset;)V\" since=\"24\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/nio/charset/Charset;)V\" since=\"24\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"entries()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"getComment()Ljava/lang/String;\" since=\"19\"/>\n\t\t<method name=\"getEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;\"/>\n\t\t<method name=\"getInputStream(Ljava/util/zip/ZipEntry;)Ljava/io/InputStream;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"size()I\"/>\n\t\t<method name=\"stream()Ljava/util/stream/Stream;\" since=\"26\"/>\n\t\t<field name=\"CENATT\" since=\"21\"/>\n\t\t<field name=\"CENATX\" since=\"21\"/>\n\t\t<field name=\"CENCOM\" since=\"21\"/>\n\t\t<field name=\"CENCRC\" since=\"21\"/>\n\t\t<field name=\"CENDSK\" since=\"21\"/>\n\t\t<field name=\"CENEXT\" since=\"21\"/>\n\t\t<field name=\"CENFLG\" since=\"21\"/>\n\t\t<field name=\"CENHDR\" since=\"21\"/>\n\t\t<field name=\"CENHOW\" since=\"21\"/>\n\t\t<field name=\"CENLEN\" since=\"21\"/>\n\t\t<field name=\"CENNAM\" since=\"21\"/>\n\t\t<field name=\"CENOFF\" since=\"21\"/>\n\t\t<field name=\"CENSIG\" since=\"21\"/>\n\t\t<field name=\"CENSIZ\" since=\"21\"/>\n\t\t<field name=\"CENTIM\" since=\"21\"/>\n\t\t<field name=\"CENVEM\" since=\"21\"/>\n\t\t<field name=\"CENVER\" since=\"21\"/>\n\t\t<field name=\"ENDCOM\" since=\"21\"/>\n\t\t<field name=\"ENDHDR\" since=\"21\"/>\n\t\t<field name=\"ENDOFF\" since=\"21\"/>\n\t\t<field name=\"ENDSIG\" since=\"21\"/>\n\t\t<field name=\"ENDSIZ\" since=\"21\"/>\n\t\t<field name=\"ENDSUB\" since=\"21\"/>\n\t\t<field name=\"ENDTOT\" since=\"21\"/>\n\t\t<field name=\"EXTCRC\" since=\"21\"/>\n\t\t<field name=\"EXTHDR\" since=\"21\"/>\n\t\t<field name=\"EXTLEN\" since=\"21\"/>\n\t\t<field name=\"EXTSIG\" since=\"21\"/>\n\t\t<field name=\"EXTSIZ\" since=\"21\"/>\n\t\t<field name=\"LOCCRC\" since=\"21\"/>\n\t\t<field name=\"LOCEXT\" since=\"21\"/>\n\t\t<field name=\"LOCFLG\" since=\"21\"/>\n\t\t<field name=\"LOCHDR\" since=\"21\"/>\n\t\t<field name=\"LOCHOW\" since=\"21\"/>\n\t\t<field name=\"LOCLEN\" since=\"21\"/>\n\t\t<field name=\"LOCNAM\" since=\"21\"/>\n\t\t<field name=\"LOCSIG\" since=\"21\"/>\n\t\t<field name=\"LOCSIZ\" since=\"21\"/>\n\t\t<field name=\"LOCTIM\" since=\"21\"/>\n\t\t<field name=\"LOCVER\" since=\"21\"/>\n\t\t<field name=\"OPEN_DELETE\"/>\n\t\t<field name=\"OPEN_READ\"/>\n\t</class>\n\t<class name=\"java/util/zip/ZipInputStream\" since=\"1\">\n\t\t<extends name=\"java/util/zip/InflaterInputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;Ljava/nio/charset/Charset;)V\" since=\"24\"/>\n\t\t<method name=\"closeEntry()V\"/>\n\t\t<method name=\"createZipEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;\"/>\n\t\t<method name=\"getNextEntry()Ljava/util/zip/ZipEntry;\"/>\n\t\t<field name=\"CENATT\" since=\"21\"/>\n\t\t<field name=\"CENATX\" since=\"21\"/>\n\t\t<field name=\"CENCOM\" since=\"21\"/>\n\t\t<field name=\"CENCRC\" since=\"21\"/>\n\t\t<field name=\"CENDSK\" since=\"21\"/>\n\t\t<field name=\"CENEXT\" since=\"21\"/>\n\t\t<field name=\"CENFLG\" since=\"21\"/>\n\t\t<field name=\"CENHDR\" since=\"21\"/>\n\t\t<field name=\"CENHOW\" since=\"21\"/>\n\t\t<field name=\"CENLEN\" since=\"21\"/>\n\t\t<field name=\"CENNAM\" since=\"21\"/>\n\t\t<field name=\"CENOFF\" since=\"21\"/>\n\t\t<field name=\"CENSIG\" since=\"21\"/>\n\t\t<field name=\"CENSIZ\" since=\"21\"/>\n\t\t<field name=\"CENTIM\" since=\"21\"/>\n\t\t<field name=\"CENVEM\" since=\"21\"/>\n\t\t<field name=\"CENVER\" since=\"21\"/>\n\t\t<field name=\"ENDCOM\" since=\"21\"/>\n\t\t<field name=\"ENDHDR\" since=\"21\"/>\n\t\t<field name=\"ENDOFF\" since=\"21\"/>\n\t\t<field name=\"ENDSIG\" since=\"21\"/>\n\t\t<field name=\"ENDSIZ\" since=\"21\"/>\n\t\t<field name=\"ENDSUB\" since=\"21\"/>\n\t\t<field name=\"ENDTOT\" since=\"21\"/>\n\t\t<field name=\"EXTCRC\" since=\"21\"/>\n\t\t<field name=\"EXTHDR\" since=\"21\"/>\n\t\t<field name=\"EXTLEN\" since=\"21\"/>\n\t\t<field name=\"EXTSIG\" since=\"21\"/>\n\t\t<field name=\"EXTSIZ\" since=\"21\"/>\n\t\t<field name=\"LOCCRC\" since=\"21\"/>\n\t\t<field name=\"LOCEXT\" since=\"21\"/>\n\t\t<field name=\"LOCFLG\" since=\"21\"/>\n\t\t<field name=\"LOCHDR\" since=\"21\"/>\n\t\t<field name=\"LOCHOW\" since=\"21\"/>\n\t\t<field name=\"LOCLEN\" since=\"21\"/>\n\t\t<field name=\"LOCNAM\" since=\"21\"/>\n\t\t<field name=\"LOCSIG\" since=\"21\"/>\n\t\t<field name=\"LOCSIZ\" since=\"21\"/>\n\t\t<field name=\"LOCTIM\" since=\"21\"/>\n\t\t<field name=\"LOCVER\" since=\"21\"/>\n\t</class>\n\t<class name=\"java/util/zip/ZipOutputStream\" since=\"1\">\n\t\t<extends name=\"java/util/zip/DeflaterOutputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;Ljava/nio/charset/Charset;)V\" since=\"24\"/>\n\t\t<method name=\"closeEntry()V\"/>\n\t\t<method name=\"putNextEntry(Ljava/util/zip/ZipEntry;)V\"/>\n\t\t<method name=\"setComment(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setLevel(I)V\"/>\n\t\t<method name=\"setMethod(I)V\"/>\n\t\t<field name=\"CENATT\" since=\"21\"/>\n\t\t<field name=\"CENATX\" since=\"21\"/>\n\t\t<field name=\"CENCOM\" since=\"21\"/>\n\t\t<field name=\"CENCRC\" since=\"21\"/>\n\t\t<field name=\"CENDSK\" since=\"21\"/>\n\t\t<field name=\"CENEXT\" since=\"21\"/>\n\t\t<field name=\"CENFLG\" since=\"21\"/>\n\t\t<field name=\"CENHDR\" since=\"21\"/>\n\t\t<field name=\"CENHOW\" since=\"21\"/>\n\t\t<field name=\"CENLEN\" since=\"21\"/>\n\t\t<field name=\"CENNAM\" since=\"21\"/>\n\t\t<field name=\"CENOFF\" since=\"21\"/>\n\t\t<field name=\"CENSIG\" since=\"21\"/>\n\t\t<field name=\"CENSIZ\" since=\"21\"/>\n\t\t<field name=\"CENTIM\" since=\"21\"/>\n\t\t<field name=\"CENVEM\" since=\"21\"/>\n\t\t<field name=\"CENVER\" since=\"21\"/>\n\t\t<field name=\"DEFLATED\"/>\n\t\t<field name=\"ENDCOM\" since=\"21\"/>\n\t\t<field name=\"ENDHDR\" since=\"21\"/>\n\t\t<field name=\"ENDOFF\" since=\"21\"/>\n\t\t<field name=\"ENDSIG\" since=\"21\"/>\n\t\t<field name=\"ENDSIZ\" since=\"21\"/>\n\t\t<field name=\"ENDSUB\" since=\"21\"/>\n\t\t<field name=\"ENDTOT\" since=\"21\"/>\n\t\t<field name=\"EXTCRC\" since=\"21\"/>\n\t\t<field name=\"EXTHDR\" since=\"21\"/>\n\t\t<field name=\"EXTLEN\" since=\"21\"/>\n\t\t<field name=\"EXTSIG\" since=\"21\"/>\n\t\t<field name=\"EXTSIZ\" since=\"21\"/>\n\t\t<field name=\"LOCCRC\" since=\"21\"/>\n\t\t<field name=\"LOCEXT\" since=\"21\"/>\n\t\t<field name=\"LOCFLG\" since=\"21\"/>\n\t\t<field name=\"LOCHDR\" since=\"21\"/>\n\t\t<field name=\"LOCHOW\" since=\"21\"/>\n\t\t<field name=\"LOCLEN\" since=\"21\"/>\n\t\t<field name=\"LOCNAM\" since=\"21\"/>\n\t\t<field name=\"LOCSIG\" since=\"21\"/>\n\t\t<field name=\"LOCSIZ\" since=\"21\"/>\n\t\t<field name=\"LOCTIM\" since=\"21\"/>\n\t\t<field name=\"LOCVER\" since=\"21\"/>\n\t\t<field name=\"STORED\"/>\n\t</class>\n\t<class name=\"javax/crypto/AEADBadTagException\" since=\"19\">\n\t\t<extends name=\"javax/crypto/BadPaddingException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/crypto/BadPaddingException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/crypto/Cipher\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljavax/crypto/CipherSpi;Ljava/security/Provider;Ljava/lang/String;)V\"/>\n\t\t<method name=\"doFinal()[B\"/>\n\t\t<method name=\"doFinal(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)I\"/>\n\t\t<method name=\"doFinal([B)[B\"/>\n\t\t<method name=\"doFinal([BI)I\"/>\n\t\t<method name=\"doFinal([BII)[B\"/>\n\t\t<method name=\"doFinal([BII[B)I\"/>\n\t\t<method name=\"doFinal([BII[BI)I\"/>\n\t\t<method name=\"getAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getBlockSize()I\"/>\n\t\t<method name=\"getExemptionMechanism()Ljavax/crypto/ExemptionMechanism;\"/>\n\t\t<method name=\"getIV()[B\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Ljavax/crypto/Cipher;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/crypto/Cipher;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/Cipher;\"/>\n\t\t<method name=\"getMaxAllowedKeyLength(Ljava/lang/String;)I\"/>\n\t\t<method name=\"getMaxAllowedParameterSpec(Ljava/lang/String;)Ljava/security/spec/AlgorithmParameterSpec;\"/>\n\t\t<method name=\"getOutputSize(I)I\"/>\n\t\t<method name=\"getParameters()Ljava/security/AlgorithmParameters;\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"init(ILjava/security/Key;)V\"/>\n\t\t<method name=\"init(ILjava/security/Key;Ljava/security/AlgorithmParameters;)V\"/>\n\t\t<method name=\"init(ILjava/security/Key;Ljava/security/AlgorithmParameters;Ljava/security/SecureRandom;)V\"/>\n\t\t<method name=\"init(ILjava/security/Key;Ljava/security/SecureRandom;)V\"/>\n\t\t<method name=\"init(ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V\"/>\n\t\t<method name=\"init(ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V\"/>\n\t\t<method name=\"init(ILjava/security/cert/Certificate;)V\"/>\n\t\t<method name=\"init(ILjava/security/cert/Certificate;Ljava/security/SecureRandom;)V\"/>\n\t\t<method name=\"unwrap([BLjava/lang/String;I)Ljava/security/Key;\"/>\n\t\t<method name=\"update(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)I\"/>\n\t\t<method name=\"update([B)[B\"/>\n\t\t<method name=\"update([BII)[B\"/>\n\t\t<method name=\"update([BII[B)I\"/>\n\t\t<method name=\"update([BII[BI)I\"/>\n\t\t<method name=\"updateAAD(Ljava/nio/ByteBuffer;)V\" since=\"19\"/>\n\t\t<method name=\"updateAAD([B)V\" since=\"19\"/>\n\t\t<method name=\"updateAAD([BII)V\" since=\"19\"/>\n\t\t<method name=\"wrap(Ljava/security/Key;)[B\"/>\n\t\t<field name=\"DECRYPT_MODE\"/>\n\t\t<field name=\"ENCRYPT_MODE\"/>\n\t\t<field name=\"PRIVATE_KEY\"/>\n\t\t<field name=\"PUBLIC_KEY\"/>\n\t\t<field name=\"SECRET_KEY\"/>\n\t\t<field name=\"UNWRAP_MODE\"/>\n\t\t<field name=\"WRAP_MODE\"/>\n\t</class>\n\t<class name=\"javax/crypto/CipherInputStream\" since=\"1\">\n\t\t<extends name=\"java/io/FilterInputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;Ljavax/crypto/Cipher;)V\"/>\n\t</class>\n\t<class name=\"javax/crypto/CipherOutputStream\" since=\"1\">\n\t\t<extends name=\"java/io/FilterOutputStream\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;Ljavax/crypto/Cipher;)V\"/>\n\t</class>\n\t<class name=\"javax/crypto/CipherSpi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"engineDoFinal(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)I\"/>\n\t\t<method name=\"engineDoFinal([BII)[B\"/>\n\t\t<method name=\"engineDoFinal([BII[BI)I\"/>\n\t\t<method name=\"engineGetBlockSize()I\"/>\n\t\t<method name=\"engineGetIV()[B\"/>\n\t\t<method name=\"engineGetKeySize(Ljava/security/Key;)I\"/>\n\t\t<method name=\"engineGetOutputSize(I)I\"/>\n\t\t<method name=\"engineGetParameters()Ljava/security/AlgorithmParameters;\"/>\n\t\t<method name=\"engineInit(ILjava/security/Key;Ljava/security/AlgorithmParameters;Ljava/security/SecureRandom;)V\"/>\n\t\t<method name=\"engineInit(ILjava/security/Key;Ljava/security/SecureRandom;)V\"/>\n\t\t<method name=\"engineInit(ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V\"/>\n\t\t<method name=\"engineSetMode(Ljava/lang/String;)V\"/>\n\t\t<method name=\"engineSetPadding(Ljava/lang/String;)V\"/>\n\t\t<method name=\"engineUnwrap([BLjava/lang/String;I)Ljava/security/Key;\"/>\n\t\t<method name=\"engineUpdate(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)I\"/>\n\t\t<method name=\"engineUpdate([BII)[B\"/>\n\t\t<method name=\"engineUpdate([BII[BI)I\"/>\n\t\t<method name=\"engineUpdateAAD(Ljava/nio/ByteBuffer;)V\" since=\"19\"/>\n\t\t<method name=\"engineUpdateAAD([BII)V\" since=\"19\"/>\n\t\t<method name=\"engineWrap(Ljava/security/Key;)[B\"/>\n\t</class>\n\t<class name=\"javax/crypto/EncryptedPrivateKeyInfo\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;[B)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/AlgorithmParameters;[B)V\"/>\n\t\t<method name=\"&lt;init>([B)V\"/>\n\t\t<method name=\"getAlgName()Ljava/lang/String;\"/>\n\t\t<method name=\"getAlgParameters()Ljava/security/AlgorithmParameters;\"/>\n\t\t<method name=\"getEncoded()[B\"/>\n\t\t<method name=\"getEncryptedData()[B\"/>\n\t\t<method name=\"getKeySpec(Ljava/security/Key;)Ljava/security/spec/PKCS8EncodedKeySpec;\"/>\n\t\t<method name=\"getKeySpec(Ljava/security/Key;Ljava/lang/String;)Ljava/security/spec/PKCS8EncodedKeySpec;\"/>\n\t\t<method name=\"getKeySpec(Ljava/security/Key;Ljava/security/Provider;)Ljava/security/spec/PKCS8EncodedKeySpec;\"/>\n\t\t<method name=\"getKeySpec(Ljavax/crypto/Cipher;)Ljava/security/spec/PKCS8EncodedKeySpec;\"/>\n\t</class>\n\t<class name=\"javax/crypto/ExemptionMechanism\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljavax/crypto/ExemptionMechanismSpi;Ljava/security/Provider;Ljava/lang/String;)V\"/>\n\t\t<method name=\"genExemptionBlob()[B\"/>\n\t\t<method name=\"genExemptionBlob([B)I\"/>\n\t\t<method name=\"genExemptionBlob([BI)I\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Ljavax/crypto/ExemptionMechanism;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/crypto/ExemptionMechanism;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/ExemptionMechanism;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getOutputSize(I)I\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"init(Ljava/security/Key;)V\"/>\n\t\t<method name=\"init(Ljava/security/Key;Ljava/security/AlgorithmParameters;)V\"/>\n\t\t<method name=\"init(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V\"/>\n\t\t<method name=\"isCryptoAllowed(Ljava/security/Key;)Z\"/>\n\t</class>\n\t<class name=\"javax/crypto/ExemptionMechanismException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/crypto/ExemptionMechanismSpi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"engineGenExemptionBlob()[B\"/>\n\t\t<method name=\"engineGenExemptionBlob([BI)I\"/>\n\t\t<method name=\"engineGetOutputSize(I)I\"/>\n\t\t<method name=\"engineInit(Ljava/security/Key;)V\"/>\n\t\t<method name=\"engineInit(Ljava/security/Key;Ljava/security/AlgorithmParameters;)V\"/>\n\t\t<method name=\"engineInit(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V\"/>\n\t</class>\n\t<class name=\"javax/crypto/IllegalBlockSizeException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/crypto/KeyAgreement\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljavax/crypto/KeyAgreementSpi;Ljava/security/Provider;Ljava/lang/String;)V\"/>\n\t\t<method name=\"doPhase(Ljava/security/Key;Z)Ljava/security/Key;\"/>\n\t\t<method name=\"generateSecret()[B\"/>\n\t\t<method name=\"generateSecret(Ljava/lang/String;)Ljavax/crypto/SecretKey;\"/>\n\t\t<method name=\"generateSecret([BI)I\"/>\n\t\t<method name=\"getAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Ljavax/crypto/KeyAgreement;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/crypto/KeyAgreement;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/KeyAgreement;\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"init(Ljava/security/Key;)V\"/>\n\t\t<method name=\"init(Ljava/security/Key;Ljava/security/SecureRandom;)V\"/>\n\t\t<method name=\"init(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V\"/>\n\t\t<method name=\"init(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V\"/>\n\t</class>\n\t<class name=\"javax/crypto/KeyAgreementSpi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"engineDoPhase(Ljava/security/Key;Z)Ljava/security/Key;\"/>\n\t\t<method name=\"engineGenerateSecret()[B\"/>\n\t\t<method name=\"engineGenerateSecret(Ljava/lang/String;)Ljavax/crypto/SecretKey;\"/>\n\t\t<method name=\"engineGenerateSecret([BI)I\"/>\n\t\t<method name=\"engineInit(Ljava/security/Key;Ljava/security/SecureRandom;)V\"/>\n\t\t<method name=\"engineInit(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V\"/>\n\t</class>\n\t<class name=\"javax/crypto/KeyGenerator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljavax/crypto/KeyGeneratorSpi;Ljava/security/Provider;Ljava/lang/String;)V\"/>\n\t\t<method name=\"generateKey()Ljavax/crypto/SecretKey;\"/>\n\t\t<method name=\"getAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Ljavax/crypto/KeyGenerator;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/crypto/KeyGenerator;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/KeyGenerator;\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"init(I)V\"/>\n\t\t<method name=\"init(ILjava/security/SecureRandom;)V\"/>\n\t\t<method name=\"init(Ljava/security/SecureRandom;)V\"/>\n\t\t<method name=\"init(Ljava/security/spec/AlgorithmParameterSpec;)V\"/>\n\t\t<method name=\"init(Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V\"/>\n\t</class>\n\t<class name=\"javax/crypto/KeyGeneratorSpi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"engineGenerateKey()Ljavax/crypto/SecretKey;\"/>\n\t\t<method name=\"engineInit(ILjava/security/SecureRandom;)V\"/>\n\t\t<method name=\"engineInit(Ljava/security/SecureRandom;)V\"/>\n\t\t<method name=\"engineInit(Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V\"/>\n\t</class>\n\t<class name=\"javax/crypto/Mac\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>(Ljavax/crypto/MacSpi;Ljava/security/Provider;Ljava/lang/String;)V\"/>\n\t\t<method name=\"doFinal()[B\"/>\n\t\t<method name=\"doFinal([B)[B\"/>\n\t\t<method name=\"doFinal([BI)V\"/>\n\t\t<method name=\"getAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Ljavax/crypto/Mac;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/crypto/Mac;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/Mac;\"/>\n\t\t<method name=\"getMacLength()I\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"init(Ljava/security/Key;)V\"/>\n\t\t<method name=\"init(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"update(B)V\"/>\n\t\t<method name=\"update(Ljava/nio/ByteBuffer;)V\"/>\n\t\t<method name=\"update([B)V\"/>\n\t\t<method name=\"update([BII)V\"/>\n\t</class>\n\t<class name=\"javax/crypto/MacSpi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"engineDoFinal()[B\"/>\n\t\t<method name=\"engineGetMacLength()I\"/>\n\t\t<method name=\"engineInit(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V\"/>\n\t\t<method name=\"engineReset()V\"/>\n\t\t<method name=\"engineUpdate(B)V\"/>\n\t\t<method name=\"engineUpdate(Ljava/nio/ByteBuffer;)V\"/>\n\t\t<method name=\"engineUpdate([BII)V\"/>\n\t</class>\n\t<class name=\"javax/crypto/NoSuchPaddingException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/crypto/NullCipher\" since=\"1\">\n\t\t<extends name=\"javax/crypto/Cipher\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"javax/crypto/SealedObject\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Serializable;Ljavax/crypto/Cipher;)V\"/>\n\t\t<method name=\"&lt;init>(Ljavax/crypto/SealedObject;)V\"/>\n\t\t<method name=\"getAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getObject(Ljava/security/Key;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getObject(Ljava/security/Key;Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getObject(Ljavax/crypto/Cipher;)Ljava/lang/Object;\"/>\n\t\t<field name=\"encodedParams\"/>\n\t</class>\n\t<class name=\"javax/crypto/SecretKey\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/Key\"/>\n\t\t<implements name=\"javax/security/auth/Destroyable\" since=\"26\"/>\n\t\t<field name=\"serialVersionUID\"/>\n\t</class>\n\t<class name=\"javax/crypto/SecretKeyFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljavax/crypto/SecretKeyFactorySpi;Ljava/security/Provider;Ljava/lang/String;)V\"/>\n\t\t<method name=\"generateSecret(Ljava/security/spec/KeySpec;)Ljavax/crypto/SecretKey;\"/>\n\t\t<method name=\"getAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Ljavax/crypto/SecretKeyFactory;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/crypto/SecretKeyFactory;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/SecretKeyFactory;\"/>\n\t\t<method name=\"getKeySpec(Ljavax/crypto/SecretKey;Ljava/lang/Class;)Ljava/security/spec/KeySpec;\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"translateKey(Ljavax/crypto/SecretKey;)Ljavax/crypto/SecretKey;\"/>\n\t</class>\n\t<class name=\"javax/crypto/SecretKeyFactorySpi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"engineGenerateSecret(Ljava/security/spec/KeySpec;)Ljavax/crypto/SecretKey;\"/>\n\t\t<method name=\"engineGetKeySpec(Ljavax/crypto/SecretKey;Ljava/lang/Class;)Ljava/security/spec/KeySpec;\"/>\n\t\t<method name=\"engineTranslateKey(Ljavax/crypto/SecretKey;)Ljavax/crypto/SecretKey;\"/>\n\t</class>\n\t<class name=\"javax/crypto/ShortBufferException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/crypto/interfaces/DHKey\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getParams()Ljavax/crypto/spec/DHParameterSpec;\"/>\n\t</class>\n\t<class name=\"javax/crypto/interfaces/DHPrivateKey\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/PrivateKey\"/>\n\t\t<implements name=\"javax/crypto/interfaces/DHKey\"/>\n\t\t<method name=\"getX()Ljava/math/BigInteger;\"/>\n\t\t<field name=\"serialVersionUID\"/>\n\t</class>\n\t<class name=\"javax/crypto/interfaces/DHPublicKey\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/PublicKey\"/>\n\t\t<implements name=\"javax/crypto/interfaces/DHKey\"/>\n\t\t<method name=\"getY()Ljava/math/BigInteger;\"/>\n\t\t<field name=\"serialVersionUID\"/>\n\t</class>\n\t<class name=\"javax/crypto/interfaces/PBEKey\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/crypto/SecretKey\"/>\n\t\t<method name=\"getIterationCount()I\"/>\n\t\t<method name=\"getPassword()[C\"/>\n\t\t<method name=\"getSalt()[B\"/>\n\t\t<field name=\"serialVersionUID\"/>\n\t</class>\n\t<class name=\"javax/crypto/spec/DESKeySpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/KeySpec\"/>\n\t\t<method name=\"&lt;init>([B)V\"/>\n\t\t<method name=\"&lt;init>([BI)V\"/>\n\t\t<method name=\"getKey()[B\"/>\n\t\t<method name=\"isParityAdjusted([BI)Z\"/>\n\t\t<method name=\"isWeak([BI)Z\"/>\n\t\t<field name=\"DES_KEY_LEN\"/>\n\t</class>\n\t<class name=\"javax/crypto/spec/DESedeKeySpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/KeySpec\"/>\n\t\t<method name=\"&lt;init>([B)V\"/>\n\t\t<method name=\"&lt;init>([BI)V\"/>\n\t\t<method name=\"getKey()[B\"/>\n\t\t<method name=\"isParityAdjusted([BI)Z\"/>\n\t\t<field name=\"DES_EDE_KEY_LEN\"/>\n\t</class>\n\t<class name=\"javax/crypto/spec/DHGenParameterSpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/AlgorithmParameterSpec\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"getExponentSize()I\"/>\n\t\t<method name=\"getPrimeSize()I\"/>\n\t</class>\n\t<class name=\"javax/crypto/spec/DHParameterSpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/AlgorithmParameterSpec\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;I)V\"/>\n\t\t<method name=\"getG()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getL()I\"/>\n\t\t<method name=\"getP()Ljava/math/BigInteger;\"/>\n\t</class>\n\t<class name=\"javax/crypto/spec/DHPrivateKeySpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/KeySpec\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V\"/>\n\t\t<method name=\"getG()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getP()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getX()Ljava/math/BigInteger;\"/>\n\t</class>\n\t<class name=\"javax/crypto/spec/DHPublicKeySpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/KeySpec\"/>\n\t\t<method name=\"&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V\"/>\n\t\t<method name=\"getG()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getP()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getY()Ljava/math/BigInteger;\"/>\n\t</class>\n\t<class name=\"javax/crypto/spec/GCMParameterSpec\" since=\"19\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/AlgorithmParameterSpec\"/>\n\t\t<method name=\"&lt;init>(I[B)V\"/>\n\t\t<method name=\"&lt;init>(I[BII)V\"/>\n\t\t<method name=\"getIV()[B\"/>\n\t\t<method name=\"getTLen()I\"/>\n\t</class>\n\t<class name=\"javax/crypto/spec/IvParameterSpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/AlgorithmParameterSpec\"/>\n\t\t<method name=\"&lt;init>([B)V\"/>\n\t\t<method name=\"&lt;init>([BII)V\"/>\n\t\t<method name=\"getIV()[B\"/>\n\t</class>\n\t<class name=\"javax/crypto/spec/OAEPParameterSpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/AlgorithmParameterSpec\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/security/spec/AlgorithmParameterSpec;Ljavax/crypto/spec/PSource;)V\"/>\n\t\t<method name=\"getDigestAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getMGFAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getMGFParameters()Ljava/security/spec/AlgorithmParameterSpec;\"/>\n\t\t<method name=\"getPSource()Ljavax/crypto/spec/PSource;\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t</class>\n\t<class name=\"javax/crypto/spec/PBEKeySpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/KeySpec\"/>\n\t\t<method name=\"&lt;init>([C)V\"/>\n\t\t<method name=\"&lt;init>([C[BI)V\"/>\n\t\t<method name=\"&lt;init>([C[BII)V\"/>\n\t\t<method name=\"clearPassword()V\"/>\n\t\t<method name=\"getIterationCount()I\"/>\n\t\t<method name=\"getKeyLength()I\"/>\n\t\t<method name=\"getPassword()[C\"/>\n\t\t<method name=\"getSalt()[B\"/>\n\t</class>\n\t<class name=\"javax/crypto/spec/PBEParameterSpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/AlgorithmParameterSpec\"/>\n\t\t<method name=\"&lt;init>([BI)V\"/>\n\t\t<method name=\"&lt;init>([BILjava/security/spec/AlgorithmParameterSpec;)V\" since=\"26\"/>\n\t\t<method name=\"getIterationCount()I\"/>\n\t\t<method name=\"getParameterSpec()Ljava/security/spec/AlgorithmParameterSpec;\" since=\"26\"/>\n\t\t<method name=\"getSalt()[B\"/>\n\t</class>\n\t<class name=\"javax/crypto/spec/PSource\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getAlgorithm()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"javax/crypto/spec/PSource$PSpecified\" since=\"1\">\n\t\t<extends name=\"javax/crypto/spec/PSource\"/>\n\t\t<method name=\"&lt;init>([B)V\"/>\n\t\t<method name=\"getValue()[B\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t</class>\n\t<class name=\"javax/crypto/spec/RC2ParameterSpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/AlgorithmParameterSpec\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(I[B)V\"/>\n\t\t<method name=\"&lt;init>(I[BI)V\"/>\n\t\t<method name=\"getEffectiveKeyBits()I\"/>\n\t\t<method name=\"getIV()[B\"/>\n\t</class>\n\t<class name=\"javax/crypto/spec/RC5ParameterSpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/spec/AlgorithmParameterSpec\"/>\n\t\t<method name=\"&lt;init>(III)V\"/>\n\t\t<method name=\"&lt;init>(III[B)V\"/>\n\t\t<method name=\"&lt;init>(III[BI)V\"/>\n\t\t<method name=\"getIV()[B\"/>\n\t\t<method name=\"getRounds()I\"/>\n\t\t<method name=\"getVersion()I\"/>\n\t\t<method name=\"getWordSize()I\"/>\n\t</class>\n\t<class name=\"javax/crypto/spec/SecretKeySpec\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\" removed=\"24\"/>\n\t\t<implements name=\"java/security/spec/KeySpec\"/>\n\t\t<implements name=\"javax/crypto/SecretKey\"/>\n\t\t<method name=\"&lt;init>([BIILjava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>([BLjava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/microedition/khronos/egl/EGL\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"javax/microedition/khronos/egl/EGL10\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/microedition/khronos/egl/EGL\"/>\n\t\t<method name=\"eglChooseConfig(Ljavax/microedition/khronos/egl/EGLDisplay;[I[Ljavax/microedition/khronos/egl/EGLConfig;I[I)Z\"/>\n\t\t<method name=\"eglCopyBuffers(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLSurface;Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"eglCreateContext(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;Ljavax/microedition/khronos/egl/EGLContext;[I)Ljavax/microedition/khronos/egl/EGLContext;\"/>\n\t\t<method name=\"eglCreatePbufferSurface(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;[I)Ljavax/microedition/khronos/egl/EGLSurface;\"/>\n\t\t<method name=\"eglCreatePixmapSurface(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;Ljava/lang/Object;[I)Ljavax/microedition/khronos/egl/EGLSurface;\" deprecated=\"26\"/>\n\t\t<method name=\"eglCreateWindowSurface(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;Ljava/lang/Object;[I)Ljavax/microedition/khronos/egl/EGLSurface;\"/>\n\t\t<method name=\"eglDestroyContext(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLContext;)Z\"/>\n\t\t<method name=\"eglDestroySurface(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLSurface;)Z\"/>\n\t\t<method name=\"eglGetConfigAttrib(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;I[I)Z\"/>\n\t\t<method name=\"eglGetConfigs(Ljavax/microedition/khronos/egl/EGLDisplay;[Ljavax/microedition/khronos/egl/EGLConfig;I[I)Z\"/>\n\t\t<method name=\"eglGetCurrentContext()Ljavax/microedition/khronos/egl/EGLContext;\"/>\n\t\t<method name=\"eglGetCurrentDisplay()Ljavax/microedition/khronos/egl/EGLDisplay;\"/>\n\t\t<method name=\"eglGetCurrentSurface(I)Ljavax/microedition/khronos/egl/EGLSurface;\"/>\n\t\t<method name=\"eglGetDisplay(Ljava/lang/Object;)Ljavax/microedition/khronos/egl/EGLDisplay;\"/>\n\t\t<method name=\"eglGetError()I\"/>\n\t\t<method name=\"eglInitialize(Ljavax/microedition/khronos/egl/EGLDisplay;[I)Z\"/>\n\t\t<method name=\"eglMakeCurrent(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLSurface;Ljavax/microedition/khronos/egl/EGLSurface;Ljavax/microedition/khronos/egl/EGLContext;)Z\"/>\n\t\t<method name=\"eglQueryContext(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLContext;I[I)Z\"/>\n\t\t<method name=\"eglQueryString(Ljavax/microedition/khronos/egl/EGLDisplay;I)Ljava/lang/String;\"/>\n\t\t<method name=\"eglQuerySurface(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLSurface;I[I)Z\"/>\n\t\t<method name=\"eglSwapBuffers(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLSurface;)Z\"/>\n\t\t<method name=\"eglTerminate(Ljavax/microedition/khronos/egl/EGLDisplay;)Z\"/>\n\t\t<method name=\"eglWaitGL()Z\"/>\n\t\t<method name=\"eglWaitNative(ILjava/lang/Object;)Z\"/>\n\t\t<field name=\"EGL_ALPHA_FORMAT\"/>\n\t\t<field name=\"EGL_ALPHA_MASK_SIZE\"/>\n\t\t<field name=\"EGL_ALPHA_SIZE\"/>\n\t\t<field name=\"EGL_BAD_ACCESS\"/>\n\t\t<field name=\"EGL_BAD_ALLOC\"/>\n\t\t<field name=\"EGL_BAD_ATTRIBUTE\"/>\n\t\t<field name=\"EGL_BAD_CONFIG\"/>\n\t\t<field name=\"EGL_BAD_CONTEXT\"/>\n\t\t<field name=\"EGL_BAD_CURRENT_SURFACE\"/>\n\t\t<field name=\"EGL_BAD_DISPLAY\"/>\n\t\t<field name=\"EGL_BAD_MATCH\"/>\n\t\t<field name=\"EGL_BAD_NATIVE_PIXMAP\"/>\n\t\t<field name=\"EGL_BAD_NATIVE_WINDOW\"/>\n\t\t<field name=\"EGL_BAD_PARAMETER\"/>\n\t\t<field name=\"EGL_BAD_SURFACE\"/>\n\t\t<field name=\"EGL_BLUE_SIZE\"/>\n\t\t<field name=\"EGL_BUFFER_SIZE\"/>\n\t\t<field name=\"EGL_COLORSPACE\"/>\n\t\t<field name=\"EGL_COLOR_BUFFER_TYPE\"/>\n\t\t<field name=\"EGL_CONFIG_CAVEAT\"/>\n\t\t<field name=\"EGL_CONFIG_ID\"/>\n\t\t<field name=\"EGL_CORE_NATIVE_ENGINE\"/>\n\t\t<field name=\"EGL_DEFAULT_DISPLAY\"/>\n\t\t<field name=\"EGL_DEPTH_SIZE\"/>\n\t\t<field name=\"EGL_DONT_CARE\"/>\n\t\t<field name=\"EGL_DRAW\"/>\n\t\t<field name=\"EGL_EXTENSIONS\"/>\n\t\t<field name=\"EGL_GREEN_SIZE\"/>\n\t\t<field name=\"EGL_HEIGHT\"/>\n\t\t<field name=\"EGL_HORIZONTAL_RESOLUTION\"/>\n\t\t<field name=\"EGL_LARGEST_PBUFFER\"/>\n\t\t<field name=\"EGL_LEVEL\"/>\n\t\t<field name=\"EGL_LUMINANCE_BUFFER\"/>\n\t\t<field name=\"EGL_LUMINANCE_SIZE\"/>\n\t\t<field name=\"EGL_MAX_PBUFFER_HEIGHT\"/>\n\t\t<field name=\"EGL_MAX_PBUFFER_PIXELS\"/>\n\t\t<field name=\"EGL_MAX_PBUFFER_WIDTH\"/>\n\t\t<field name=\"EGL_NATIVE_RENDERABLE\"/>\n\t\t<field name=\"EGL_NATIVE_VISUAL_ID\"/>\n\t\t<field name=\"EGL_NATIVE_VISUAL_TYPE\"/>\n\t\t<field name=\"EGL_NONE\"/>\n\t\t<field name=\"EGL_NON_CONFORMANT_CONFIG\"/>\n\t\t<field name=\"EGL_NOT_INITIALIZED\"/>\n\t\t<field name=\"EGL_NO_CONTEXT\"/>\n\t\t<field name=\"EGL_NO_DISPLAY\"/>\n\t\t<field name=\"EGL_NO_SURFACE\"/>\n\t\t<field name=\"EGL_PBUFFER_BIT\"/>\n\t\t<field name=\"EGL_PIXEL_ASPECT_RATIO\"/>\n\t\t<field name=\"EGL_PIXMAP_BIT\"/>\n\t\t<field name=\"EGL_READ\"/>\n\t\t<field name=\"EGL_RED_SIZE\"/>\n\t\t<field name=\"EGL_RENDERABLE_TYPE\"/>\n\t\t<field name=\"EGL_RENDER_BUFFER\"/>\n\t\t<field name=\"EGL_RGB_BUFFER\"/>\n\t\t<field name=\"EGL_SAMPLES\"/>\n\t\t<field name=\"EGL_SAMPLE_BUFFERS\"/>\n\t\t<field name=\"EGL_SINGLE_BUFFER\"/>\n\t\t<field name=\"EGL_SLOW_CONFIG\"/>\n\t\t<field name=\"EGL_STENCIL_SIZE\"/>\n\t\t<field name=\"EGL_SUCCESS\"/>\n\t\t<field name=\"EGL_SURFACE_TYPE\"/>\n\t\t<field name=\"EGL_TRANSPARENT_BLUE_VALUE\"/>\n\t\t<field name=\"EGL_TRANSPARENT_GREEN_VALUE\"/>\n\t\t<field name=\"EGL_TRANSPARENT_RED_VALUE\"/>\n\t\t<field name=\"EGL_TRANSPARENT_RGB\"/>\n\t\t<field name=\"EGL_TRANSPARENT_TYPE\"/>\n\t\t<field name=\"EGL_VENDOR\"/>\n\t\t<field name=\"EGL_VERSION\"/>\n\t\t<field name=\"EGL_VERTICAL_RESOLUTION\"/>\n\t\t<field name=\"EGL_WIDTH\"/>\n\t\t<field name=\"EGL_WINDOW_BIT\"/>\n\t</class>\n\t<class name=\"javax/microedition/khronos/egl/EGL11\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/microedition/khronos/egl/EGL10\"/>\n\t\t<field name=\"EGL_CONTEXT_LOST\"/>\n\t</class>\n\t<class name=\"javax/microedition/khronos/egl/EGLConfig\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"javax/microedition/khronos/egl/EGLContext\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getEGL()Ljavax/microedition/khronos/egl/EGL;\"/>\n\t\t<method name=\"getGL()Ljavax/microedition/khronos/opengles/GL;\"/>\n\t</class>\n\t<class name=\"javax/microedition/khronos/egl/EGLDisplay\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"javax/microedition/khronos/egl/EGLSurface\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"javax/microedition/khronos/opengles/GL\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"javax/microedition/khronos/opengles/GL10\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/microedition/khronos/opengles/GL\"/>\n\t\t<method name=\"glActiveTexture(I)V\"/>\n\t\t<method name=\"glAlphaFunc(IF)V\"/>\n\t\t<method name=\"glAlphaFuncx(II)V\"/>\n\t\t<method name=\"glBindTexture(II)V\"/>\n\t\t<method name=\"glBlendFunc(II)V\"/>\n\t\t<method name=\"glClear(I)V\"/>\n\t\t<method name=\"glClearColor(FFFF)V\"/>\n\t\t<method name=\"glClearColorx(IIII)V\"/>\n\t\t<method name=\"glClearDepthf(F)V\"/>\n\t\t<method name=\"glClearDepthx(I)V\"/>\n\t\t<method name=\"glClearStencil(I)V\"/>\n\t\t<method name=\"glClientActiveTexture(I)V\"/>\n\t\t<method name=\"glColor4f(FFFF)V\"/>\n\t\t<method name=\"glColor4x(IIII)V\"/>\n\t\t<method name=\"glColorMask(ZZZZ)V\"/>\n\t\t<method name=\"glColorPointer(IIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glCompressedTexImage2D(IIIIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glCompressedTexSubImage2D(IIIIIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glCopyTexImage2D(IIIIIIII)V\"/>\n\t\t<method name=\"glCopyTexSubImage2D(IIIIIIII)V\"/>\n\t\t<method name=\"glCullFace(I)V\"/>\n\t\t<method name=\"glDeleteTextures(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDeleteTextures(I[II)V\"/>\n\t\t<method name=\"glDepthFunc(I)V\"/>\n\t\t<method name=\"glDepthMask(Z)V\"/>\n\t\t<method name=\"glDepthRangef(FF)V\"/>\n\t\t<method name=\"glDepthRangex(II)V\"/>\n\t\t<method name=\"glDisable(I)V\"/>\n\t\t<method name=\"glDisableClientState(I)V\"/>\n\t\t<method name=\"glDrawArrays(III)V\"/>\n\t\t<method name=\"glDrawElements(IIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glEnable(I)V\"/>\n\t\t<method name=\"glEnableClientState(I)V\"/>\n\t\t<method name=\"glFinish()V\"/>\n\t\t<method name=\"glFlush()V\"/>\n\t\t<method name=\"glFogf(IF)V\"/>\n\t\t<method name=\"glFogfv(ILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glFogfv(I[FI)V\"/>\n\t\t<method name=\"glFogx(II)V\"/>\n\t\t<method name=\"glFogxv(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glFogxv(I[II)V\"/>\n\t\t<method name=\"glFrontFace(I)V\"/>\n\t\t<method name=\"glFrustumf(FFFFFF)V\"/>\n\t\t<method name=\"glFrustumx(IIIIII)V\"/>\n\t\t<method name=\"glGenTextures(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGenTextures(I[II)V\"/>\n\t\t<method name=\"glGetError()I\"/>\n\t\t<method name=\"glGetIntegerv(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetIntegerv(I[II)V\"/>\n\t\t<method name=\"glGetString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"glHint(II)V\"/>\n\t\t<method name=\"glLightModelf(IF)V\"/>\n\t\t<method name=\"glLightModelfv(ILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glLightModelfv(I[FI)V\"/>\n\t\t<method name=\"glLightModelx(II)V\"/>\n\t\t<method name=\"glLightModelxv(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glLightModelxv(I[II)V\"/>\n\t\t<method name=\"glLightf(IIF)V\"/>\n\t\t<method name=\"glLightfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glLightfv(II[FI)V\"/>\n\t\t<method name=\"glLightx(III)V\"/>\n\t\t<method name=\"glLightxv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glLightxv(II[II)V\"/>\n\t\t<method name=\"glLineWidth(F)V\"/>\n\t\t<method name=\"glLineWidthx(I)V\"/>\n\t\t<method name=\"glLoadIdentity()V\"/>\n\t\t<method name=\"glLoadMatrixf(Ljava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glLoadMatrixf([FI)V\"/>\n\t\t<method name=\"glLoadMatrixx(Ljava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glLoadMatrixx([II)V\"/>\n\t\t<method name=\"glLogicOp(I)V\"/>\n\t\t<method name=\"glMaterialf(IIF)V\"/>\n\t\t<method name=\"glMaterialfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glMaterialfv(II[FI)V\"/>\n\t\t<method name=\"glMaterialx(III)V\"/>\n\t\t<method name=\"glMaterialxv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glMaterialxv(II[II)V\"/>\n\t\t<method name=\"glMatrixMode(I)V\"/>\n\t\t<method name=\"glMultMatrixf(Ljava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glMultMatrixf([FI)V\"/>\n\t\t<method name=\"glMultMatrixx(Ljava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glMultMatrixx([II)V\"/>\n\t\t<method name=\"glMultiTexCoord4f(IFFFF)V\"/>\n\t\t<method name=\"glMultiTexCoord4x(IIIII)V\"/>\n\t\t<method name=\"glNormal3f(FFF)V\"/>\n\t\t<method name=\"glNormal3x(III)V\"/>\n\t\t<method name=\"glNormalPointer(IILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glOrthof(FFFFFF)V\"/>\n\t\t<method name=\"glOrthox(IIIIII)V\"/>\n\t\t<method name=\"glPixelStorei(II)V\"/>\n\t\t<method name=\"glPointSize(F)V\"/>\n\t\t<method name=\"glPointSizex(I)V\"/>\n\t\t<method name=\"glPolygonOffset(FF)V\"/>\n\t\t<method name=\"glPolygonOffsetx(II)V\"/>\n\t\t<method name=\"glPopMatrix()V\"/>\n\t\t<method name=\"glPushMatrix()V\"/>\n\t\t<method name=\"glReadPixels(IIIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glRotatef(FFFF)V\"/>\n\t\t<method name=\"glRotatex(IIII)V\"/>\n\t\t<method name=\"glSampleCoverage(FZ)V\"/>\n\t\t<method name=\"glSampleCoveragex(IZ)V\"/>\n\t\t<method name=\"glScalef(FFF)V\"/>\n\t\t<method name=\"glScalex(III)V\"/>\n\t\t<method name=\"glScissor(IIII)V\"/>\n\t\t<method name=\"glShadeModel(I)V\"/>\n\t\t<method name=\"glStencilFunc(III)V\"/>\n\t\t<method name=\"glStencilMask(I)V\"/>\n\t\t<method name=\"glStencilOp(III)V\"/>\n\t\t<method name=\"glTexCoordPointer(IIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glTexEnvf(IIF)V\"/>\n\t\t<method name=\"glTexEnvfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glTexEnvfv(II[FI)V\"/>\n\t\t<method name=\"glTexEnvx(III)V\"/>\n\t\t<method name=\"glTexEnvxv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glTexEnvxv(II[II)V\"/>\n\t\t<method name=\"glTexImage2D(IIIIIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glTexParameterf(IIF)V\"/>\n\t\t<method name=\"glTexParameterx(III)V\"/>\n\t\t<method name=\"glTexSubImage2D(IIIIIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glTranslatef(FFF)V\"/>\n\t\t<method name=\"glTranslatex(III)V\"/>\n\t\t<method name=\"glVertexPointer(IIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glViewport(IIII)V\"/>\n\t\t<field name=\"GL_ADD\"/>\n\t\t<field name=\"GL_ALIASED_LINE_WIDTH_RANGE\"/>\n\t\t<field name=\"GL_ALIASED_POINT_SIZE_RANGE\"/>\n\t\t<field name=\"GL_ALPHA\"/>\n\t\t<field name=\"GL_ALPHA_BITS\"/>\n\t\t<field name=\"GL_ALPHA_TEST\"/>\n\t\t<field name=\"GL_ALWAYS\"/>\n\t\t<field name=\"GL_AMBIENT\"/>\n\t\t<field name=\"GL_AMBIENT_AND_DIFFUSE\"/>\n\t\t<field name=\"GL_AND\"/>\n\t\t<field name=\"GL_AND_INVERTED\"/>\n\t\t<field name=\"GL_AND_REVERSE\"/>\n\t\t<field name=\"GL_BACK\"/>\n\t\t<field name=\"GL_BLEND\"/>\n\t\t<field name=\"GL_BLUE_BITS\"/>\n\t\t<field name=\"GL_BYTE\"/>\n\t\t<field name=\"GL_CCW\"/>\n\t\t<field name=\"GL_CLAMP_TO_EDGE\"/>\n\t\t<field name=\"GL_CLEAR\"/>\n\t\t<field name=\"GL_COLOR_ARRAY\"/>\n\t\t<field name=\"GL_COLOR_BUFFER_BIT\"/>\n\t\t<field name=\"GL_COLOR_LOGIC_OP\"/>\n\t\t<field name=\"GL_COLOR_MATERIAL\"/>\n\t\t<field name=\"GL_COMPRESSED_TEXTURE_FORMATS\"/>\n\t\t<field name=\"GL_CONSTANT_ATTENUATION\"/>\n\t\t<field name=\"GL_COPY\"/>\n\t\t<field name=\"GL_COPY_INVERTED\"/>\n\t\t<field name=\"GL_CULL_FACE\"/>\n\t\t<field name=\"GL_CW\"/>\n\t\t<field name=\"GL_DECAL\"/>\n\t\t<field name=\"GL_DECR\"/>\n\t\t<field name=\"GL_DEPTH_BITS\"/>\n\t\t<field name=\"GL_DEPTH_BUFFER_BIT\"/>\n\t\t<field name=\"GL_DEPTH_TEST\"/>\n\t\t<field name=\"GL_DIFFUSE\"/>\n\t\t<field name=\"GL_DITHER\"/>\n\t\t<field name=\"GL_DONT_CARE\"/>\n\t\t<field name=\"GL_DST_ALPHA\"/>\n\t\t<field name=\"GL_DST_COLOR\"/>\n\t\t<field name=\"GL_EMISSION\"/>\n\t\t<field name=\"GL_EQUAL\"/>\n\t\t<field name=\"GL_EQUIV\"/>\n\t\t<field name=\"GL_EXP\"/>\n\t\t<field name=\"GL_EXP2\"/>\n\t\t<field name=\"GL_EXTENSIONS\"/>\n\t\t<field name=\"GL_FALSE\"/>\n\t\t<field name=\"GL_FASTEST\"/>\n\t\t<field name=\"GL_FIXED\"/>\n\t\t<field name=\"GL_FLAT\"/>\n\t\t<field name=\"GL_FLOAT\"/>\n\t\t<field name=\"GL_FOG\"/>\n\t\t<field name=\"GL_FOG_COLOR\"/>\n\t\t<field name=\"GL_FOG_DENSITY\"/>\n\t\t<field name=\"GL_FOG_END\"/>\n\t\t<field name=\"GL_FOG_HINT\"/>\n\t\t<field name=\"GL_FOG_MODE\"/>\n\t\t<field name=\"GL_FOG_START\"/>\n\t\t<field name=\"GL_FRONT\"/>\n\t\t<field name=\"GL_FRONT_AND_BACK\"/>\n\t\t<field name=\"GL_GEQUAL\"/>\n\t\t<field name=\"GL_GREATER\"/>\n\t\t<field name=\"GL_GREEN_BITS\"/>\n\t\t<field name=\"GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES\"/>\n\t\t<field name=\"GL_IMPLEMENTATION_COLOR_READ_TYPE_OES\"/>\n\t\t<field name=\"GL_INCR\"/>\n\t\t<field name=\"GL_INVALID_ENUM\"/>\n\t\t<field name=\"GL_INVALID_OPERATION\"/>\n\t\t<field name=\"GL_INVALID_VALUE\"/>\n\t\t<field name=\"GL_INVERT\"/>\n\t\t<field name=\"GL_KEEP\"/>\n\t\t<field name=\"GL_LEQUAL\"/>\n\t\t<field name=\"GL_LESS\"/>\n\t\t<field name=\"GL_LIGHT0\"/>\n\t\t<field name=\"GL_LIGHT1\"/>\n\t\t<field name=\"GL_LIGHT2\"/>\n\t\t<field name=\"GL_LIGHT3\"/>\n\t\t<field name=\"GL_LIGHT4\"/>\n\t\t<field name=\"GL_LIGHT5\"/>\n\t\t<field name=\"GL_LIGHT6\"/>\n\t\t<field name=\"GL_LIGHT7\"/>\n\t\t<field name=\"GL_LIGHTING\"/>\n\t\t<field name=\"GL_LIGHT_MODEL_AMBIENT\"/>\n\t\t<field name=\"GL_LIGHT_MODEL_TWO_SIDE\"/>\n\t\t<field name=\"GL_LINEAR\"/>\n\t\t<field name=\"GL_LINEAR_ATTENUATION\"/>\n\t\t<field name=\"GL_LINEAR_MIPMAP_LINEAR\"/>\n\t\t<field name=\"GL_LINEAR_MIPMAP_NEAREST\"/>\n\t\t<field name=\"GL_LINES\"/>\n\t\t<field name=\"GL_LINE_LOOP\"/>\n\t\t<field name=\"GL_LINE_SMOOTH\"/>\n\t\t<field name=\"GL_LINE_SMOOTH_HINT\"/>\n\t\t<field name=\"GL_LINE_STRIP\"/>\n\t\t<field name=\"GL_LUMINANCE\"/>\n\t\t<field name=\"GL_LUMINANCE_ALPHA\"/>\n\t\t<field name=\"GL_MAX_ELEMENTS_INDICES\"/>\n\t\t<field name=\"GL_MAX_ELEMENTS_VERTICES\"/>\n\t\t<field name=\"GL_MAX_LIGHTS\"/>\n\t\t<field name=\"GL_MAX_MODELVIEW_STACK_DEPTH\"/>\n\t\t<field name=\"GL_MAX_PROJECTION_STACK_DEPTH\"/>\n\t\t<field name=\"GL_MAX_TEXTURE_SIZE\"/>\n\t\t<field name=\"GL_MAX_TEXTURE_STACK_DEPTH\"/>\n\t\t<field name=\"GL_MAX_TEXTURE_UNITS\"/>\n\t\t<field name=\"GL_MAX_VIEWPORT_DIMS\"/>\n\t\t<field name=\"GL_MODELVIEW\"/>\n\t\t<field name=\"GL_MODULATE\"/>\n\t\t<field name=\"GL_MULTISAMPLE\"/>\n\t\t<field name=\"GL_NAND\"/>\n\t\t<field name=\"GL_NEAREST\"/>\n\t\t<field name=\"GL_NEAREST_MIPMAP_LINEAR\"/>\n\t\t<field name=\"GL_NEAREST_MIPMAP_NEAREST\"/>\n\t\t<field name=\"GL_NEVER\"/>\n\t\t<field name=\"GL_NICEST\"/>\n\t\t<field name=\"GL_NOOP\"/>\n\t\t<field name=\"GL_NOR\"/>\n\t\t<field name=\"GL_NORMALIZE\"/>\n\t\t<field name=\"GL_NORMAL_ARRAY\"/>\n\t\t<field name=\"GL_NOTEQUAL\"/>\n\t\t<field name=\"GL_NO_ERROR\"/>\n\t\t<field name=\"GL_NUM_COMPRESSED_TEXTURE_FORMATS\"/>\n\t\t<field name=\"GL_ONE\"/>\n\t\t<field name=\"GL_ONE_MINUS_DST_ALPHA\"/>\n\t\t<field name=\"GL_ONE_MINUS_DST_COLOR\"/>\n\t\t<field name=\"GL_ONE_MINUS_SRC_ALPHA\"/>\n\t\t<field name=\"GL_ONE_MINUS_SRC_COLOR\"/>\n\t\t<field name=\"GL_OR\"/>\n\t\t<field name=\"GL_OR_INVERTED\"/>\n\t\t<field name=\"GL_OR_REVERSE\"/>\n\t\t<field name=\"GL_OUT_OF_MEMORY\"/>\n\t\t<field name=\"GL_PACK_ALIGNMENT\"/>\n\t\t<field name=\"GL_PALETTE4_R5_G6_B5_OES\"/>\n\t\t<field name=\"GL_PALETTE4_RGB5_A1_OES\"/>\n\t\t<field name=\"GL_PALETTE4_RGB8_OES\"/>\n\t\t<field name=\"GL_PALETTE4_RGBA4_OES\"/>\n\t\t<field name=\"GL_PALETTE4_RGBA8_OES\"/>\n\t\t<field name=\"GL_PALETTE8_R5_G6_B5_OES\"/>\n\t\t<field name=\"GL_PALETTE8_RGB5_A1_OES\"/>\n\t\t<field name=\"GL_PALETTE8_RGB8_OES\"/>\n\t\t<field name=\"GL_PALETTE8_RGBA4_OES\"/>\n\t\t<field name=\"GL_PALETTE8_RGBA8_OES\"/>\n\t\t<field name=\"GL_PERSPECTIVE_CORRECTION_HINT\"/>\n\t\t<field name=\"GL_POINTS\"/>\n\t\t<field name=\"GL_POINT_FADE_THRESHOLD_SIZE\"/>\n\t\t<field name=\"GL_POINT_SIZE\"/>\n\t\t<field name=\"GL_POINT_SMOOTH\"/>\n\t\t<field name=\"GL_POINT_SMOOTH_HINT\"/>\n\t\t<field name=\"GL_POLYGON_OFFSET_FILL\"/>\n\t\t<field name=\"GL_POLYGON_SMOOTH_HINT\"/>\n\t\t<field name=\"GL_POSITION\"/>\n\t\t<field name=\"GL_PROJECTION\"/>\n\t\t<field name=\"GL_QUADRATIC_ATTENUATION\"/>\n\t\t<field name=\"GL_RED_BITS\"/>\n\t\t<field name=\"GL_RENDERER\"/>\n\t\t<field name=\"GL_REPEAT\"/>\n\t\t<field name=\"GL_REPLACE\"/>\n\t\t<field name=\"GL_RESCALE_NORMAL\"/>\n\t\t<field name=\"GL_RGB\"/>\n\t\t<field name=\"GL_RGBA\"/>\n\t\t<field name=\"GL_SAMPLE_ALPHA_TO_COVERAGE\"/>\n\t\t<field name=\"GL_SAMPLE_ALPHA_TO_ONE\"/>\n\t\t<field name=\"GL_SAMPLE_COVERAGE\"/>\n\t\t<field name=\"GL_SCISSOR_TEST\"/>\n\t\t<field name=\"GL_SET\"/>\n\t\t<field name=\"GL_SHININESS\"/>\n\t\t<field name=\"GL_SHORT\"/>\n\t\t<field name=\"GL_SMOOTH\"/>\n\t\t<field name=\"GL_SMOOTH_LINE_WIDTH_RANGE\"/>\n\t\t<field name=\"GL_SMOOTH_POINT_SIZE_RANGE\"/>\n\t\t<field name=\"GL_SPECULAR\"/>\n\t\t<field name=\"GL_SPOT_CUTOFF\"/>\n\t\t<field name=\"GL_SPOT_DIRECTION\"/>\n\t\t<field name=\"GL_SPOT_EXPONENT\"/>\n\t\t<field name=\"GL_SRC_ALPHA\"/>\n\t\t<field name=\"GL_SRC_ALPHA_SATURATE\"/>\n\t\t<field name=\"GL_SRC_COLOR\"/>\n\t\t<field name=\"GL_STACK_OVERFLOW\"/>\n\t\t<field name=\"GL_STACK_UNDERFLOW\"/>\n\t\t<field name=\"GL_STENCIL_BITS\"/>\n\t\t<field name=\"GL_STENCIL_BUFFER_BIT\"/>\n\t\t<field name=\"GL_STENCIL_TEST\"/>\n\t\t<field name=\"GL_SUBPIXEL_BITS\"/>\n\t\t<field name=\"GL_TEXTURE\"/>\n\t\t<field name=\"GL_TEXTURE0\"/>\n\t\t<field name=\"GL_TEXTURE1\"/>\n\t\t<field name=\"GL_TEXTURE10\"/>\n\t\t<field name=\"GL_TEXTURE11\"/>\n\t\t<field name=\"GL_TEXTURE12\"/>\n\t\t<field name=\"GL_TEXTURE13\"/>\n\t\t<field name=\"GL_TEXTURE14\"/>\n\t\t<field name=\"GL_TEXTURE15\"/>\n\t\t<field name=\"GL_TEXTURE16\"/>\n\t\t<field name=\"GL_TEXTURE17\"/>\n\t\t<field name=\"GL_TEXTURE18\"/>\n\t\t<field name=\"GL_TEXTURE19\"/>\n\t\t<field name=\"GL_TEXTURE2\"/>\n\t\t<field name=\"GL_TEXTURE20\"/>\n\t\t<field name=\"GL_TEXTURE21\"/>\n\t\t<field name=\"GL_TEXTURE22\"/>\n\t\t<field name=\"GL_TEXTURE23\"/>\n\t\t<field name=\"GL_TEXTURE24\"/>\n\t\t<field name=\"GL_TEXTURE25\"/>\n\t\t<field name=\"GL_TEXTURE26\"/>\n\t\t<field name=\"GL_TEXTURE27\"/>\n\t\t<field name=\"GL_TEXTURE28\"/>\n\t\t<field name=\"GL_TEXTURE29\"/>\n\t\t<field name=\"GL_TEXTURE3\"/>\n\t\t<field name=\"GL_TEXTURE30\"/>\n\t\t<field name=\"GL_TEXTURE31\"/>\n\t\t<field name=\"GL_TEXTURE4\"/>\n\t\t<field name=\"GL_TEXTURE5\"/>\n\t\t<field name=\"GL_TEXTURE6\"/>\n\t\t<field name=\"GL_TEXTURE7\"/>\n\t\t<field name=\"GL_TEXTURE8\"/>\n\t\t<field name=\"GL_TEXTURE9\"/>\n\t\t<field name=\"GL_TEXTURE_2D\"/>\n\t\t<field name=\"GL_TEXTURE_COORD_ARRAY\"/>\n\t\t<field name=\"GL_TEXTURE_ENV\"/>\n\t\t<field name=\"GL_TEXTURE_ENV_COLOR\"/>\n\t\t<field name=\"GL_TEXTURE_ENV_MODE\"/>\n\t\t<field name=\"GL_TEXTURE_MAG_FILTER\"/>\n\t\t<field name=\"GL_TEXTURE_MIN_FILTER\"/>\n\t\t<field name=\"GL_TEXTURE_WRAP_S\"/>\n\t\t<field name=\"GL_TEXTURE_WRAP_T\"/>\n\t\t<field name=\"GL_TRIANGLES\"/>\n\t\t<field name=\"GL_TRIANGLE_FAN\"/>\n\t\t<field name=\"GL_TRIANGLE_STRIP\"/>\n\t\t<field name=\"GL_TRUE\"/>\n\t\t<field name=\"GL_UNPACK_ALIGNMENT\"/>\n\t\t<field name=\"GL_UNSIGNED_BYTE\"/>\n\t\t<field name=\"GL_UNSIGNED_SHORT\"/>\n\t\t<field name=\"GL_UNSIGNED_SHORT_4_4_4_4\"/>\n\t\t<field name=\"GL_UNSIGNED_SHORT_5_5_5_1\"/>\n\t\t<field name=\"GL_UNSIGNED_SHORT_5_6_5\"/>\n\t\t<field name=\"GL_VENDOR\"/>\n\t\t<field name=\"GL_VERSION\"/>\n\t\t<field name=\"GL_VERTEX_ARRAY\"/>\n\t\t<field name=\"GL_XOR\"/>\n\t\t<field name=\"GL_ZERO\"/>\n\t</class>\n\t<class name=\"javax/microedition/khronos/opengles/GL10Ext\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/microedition/khronos/opengles/GL\"/>\n\t\t<method name=\"glQueryMatrixxOES(Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;)I\"/>\n\t\t<method name=\"glQueryMatrixxOES([II[II)I\"/>\n\t</class>\n\t<class name=\"javax/microedition/khronos/opengles/GL11\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/microedition/khronos/opengles/GL10\"/>\n\t\t<method name=\"glBindBuffer(II)V\"/>\n\t\t<method name=\"glBufferData(IILjava/nio/Buffer;I)V\"/>\n\t\t<method name=\"glBufferSubData(IIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glClipPlanef(ILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glClipPlanef(I[FI)V\"/>\n\t\t<method name=\"glClipPlanex(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glClipPlanex(I[II)V\"/>\n\t\t<method name=\"glColor4ub(BBBB)V\"/>\n\t\t<method name=\"glColorPointer(IIII)V\"/>\n\t\t<method name=\"glDeleteBuffers(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDeleteBuffers(I[II)V\"/>\n\t\t<method name=\"glDrawElements(IIII)V\"/>\n\t\t<method name=\"glGenBuffers(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGenBuffers(I[II)V\"/>\n\t\t<method name=\"glGetBooleanv(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetBooleanv(I[ZI)V\"/>\n\t\t<method name=\"glGetBufferParameteriv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetBufferParameteriv(II[II)V\"/>\n\t\t<method name=\"glGetClipPlanef(ILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetClipPlanef(I[FI)V\"/>\n\t\t<method name=\"glGetClipPlanex(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetClipPlanex(I[II)V\"/>\n\t\t<method name=\"glGetFixedv(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetFixedv(I[II)V\"/>\n\t\t<method name=\"glGetFloatv(ILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetFloatv(I[FI)V\"/>\n\t\t<method name=\"glGetLightfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetLightfv(II[FI)V\"/>\n\t\t<method name=\"glGetLightxv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetLightxv(II[II)V\"/>\n\t\t<method name=\"glGetMaterialfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetMaterialfv(II[FI)V\"/>\n\t\t<method name=\"glGetMaterialxv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetMaterialxv(II[II)V\"/>\n\t\t<method name=\"glGetPointerv(I[Ljava/nio/Buffer;)V\"/>\n\t\t<method name=\"glGetTexEnviv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetTexEnviv(II[II)V\"/>\n\t\t<method name=\"glGetTexEnvxv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetTexEnvxv(II[II)V\"/>\n\t\t<method name=\"glGetTexParameterfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetTexParameterfv(II[FI)V\"/>\n\t\t<method name=\"glGetTexParameteriv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetTexParameteriv(II[II)V\"/>\n\t\t<method name=\"glGetTexParameterxv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetTexParameterxv(II[II)V\"/>\n\t\t<method name=\"glIsBuffer(I)Z\"/>\n\t\t<method name=\"glIsEnabled(I)Z\"/>\n\t\t<method name=\"glIsTexture(I)Z\"/>\n\t\t<method name=\"glNormalPointer(III)V\"/>\n\t\t<method name=\"glPointParameterf(IF)V\"/>\n\t\t<method name=\"glPointParameterfv(ILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glPointParameterfv(I[FI)V\"/>\n\t\t<method name=\"glPointParameterx(II)V\"/>\n\t\t<method name=\"glPointParameterxv(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glPointParameterxv(I[II)V\"/>\n\t\t<method name=\"glPointSizePointerOES(IILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glTexCoordPointer(IIII)V\"/>\n\t\t<method name=\"glTexEnvi(III)V\"/>\n\t\t<method name=\"glTexEnviv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glTexEnviv(II[II)V\"/>\n\t\t<method name=\"glTexParameterfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glTexParameterfv(II[FI)V\"/>\n\t\t<method name=\"glTexParameteri(III)V\"/>\n\t\t<method name=\"glTexParameteriv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glTexParameteriv(II[II)V\"/>\n\t\t<method name=\"glTexParameterxv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glTexParameterxv(II[II)V\"/>\n\t\t<method name=\"glVertexPointer(IIII)V\"/>\n\t\t<field name=\"GL_ACTIVE_TEXTURE\"/>\n\t\t<field name=\"GL_ADD_SIGNED\"/>\n\t\t<field name=\"GL_ALPHA_SCALE\"/>\n\t\t<field name=\"GL_ALPHA_TEST_FUNC\"/>\n\t\t<field name=\"GL_ALPHA_TEST_REF\"/>\n\t\t<field name=\"GL_ARRAY_BUFFER\"/>\n\t\t<field name=\"GL_ARRAY_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_BLEND_DST\"/>\n\t\t<field name=\"GL_BLEND_SRC\"/>\n\t\t<field name=\"GL_BUFFER_ACCESS\"/>\n\t\t<field name=\"GL_BUFFER_SIZE\"/>\n\t\t<field name=\"GL_BUFFER_USAGE\"/>\n\t\t<field name=\"GL_CLIENT_ACTIVE_TEXTURE\"/>\n\t\t<field name=\"GL_CLIP_PLANE0\"/>\n\t\t<field name=\"GL_CLIP_PLANE1\"/>\n\t\t<field name=\"GL_CLIP_PLANE2\"/>\n\t\t<field name=\"GL_CLIP_PLANE3\"/>\n\t\t<field name=\"GL_CLIP_PLANE4\"/>\n\t\t<field name=\"GL_CLIP_PLANE5\"/>\n\t\t<field name=\"GL_COLOR_ARRAY_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_COLOR_ARRAY_POINTER\"/>\n\t\t<field name=\"GL_COLOR_ARRAY_SIZE\"/>\n\t\t<field name=\"GL_COLOR_ARRAY_STRIDE\"/>\n\t\t<field name=\"GL_COLOR_ARRAY_TYPE\"/>\n\t\t<field name=\"GL_COLOR_CLEAR_VALUE\"/>\n\t\t<field name=\"GL_COLOR_WRITEMASK\"/>\n\t\t<field name=\"GL_COMBINE\"/>\n\t\t<field name=\"GL_COMBINE_ALPHA\"/>\n\t\t<field name=\"GL_COMBINE_RGB\"/>\n\t\t<field name=\"GL_CONSTANT\"/>\n\t\t<field name=\"GL_COORD_REPLACE_OES\"/>\n\t\t<field name=\"GL_CULL_FACE_MODE\"/>\n\t\t<field name=\"GL_CURRENT_COLOR\"/>\n\t\t<field name=\"GL_CURRENT_NORMAL\"/>\n\t\t<field name=\"GL_CURRENT_TEXTURE_COORDS\"/>\n\t\t<field name=\"GL_DEPTH_CLEAR_VALUE\"/>\n\t\t<field name=\"GL_DEPTH_FUNC\"/>\n\t\t<field name=\"GL_DEPTH_RANGE\"/>\n\t\t<field name=\"GL_DEPTH_WRITEMASK\"/>\n\t\t<field name=\"GL_DOT3_RGB\"/>\n\t\t<field name=\"GL_DOT3_RGBA\"/>\n\t\t<field name=\"GL_DYNAMIC_DRAW\"/>\n\t\t<field name=\"GL_ELEMENT_ARRAY_BUFFER\"/>\n\t\t<field name=\"GL_ELEMENT_ARRAY_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_FRONT_FACE\"/>\n\t\t<field name=\"GL_GENERATE_MIPMAP\"/>\n\t\t<field name=\"GL_GENERATE_MIPMAP_HINT\"/>\n\t\t<field name=\"GL_INTERPOLATE\"/>\n\t\t<field name=\"GL_LINE_WIDTH\"/>\n\t\t<field name=\"GL_LOGIC_OP_MODE\"/>\n\t\t<field name=\"GL_MATRIX_MODE\"/>\n\t\t<field name=\"GL_MAX_CLIP_PLANES\"/>\n\t\t<field name=\"GL_MODELVIEW_MATRIX\"/>\n\t\t<field name=\"GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES\"/>\n\t\t<field name=\"GL_MODELVIEW_STACK_DEPTH\"/>\n\t\t<field name=\"GL_NORMAL_ARRAY_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_NORMAL_ARRAY_POINTER\"/>\n\t\t<field name=\"GL_NORMAL_ARRAY_STRIDE\"/>\n\t\t<field name=\"GL_NORMAL_ARRAY_TYPE\"/>\n\t\t<field name=\"GL_OPERAND0_ALPHA\"/>\n\t\t<field name=\"GL_OPERAND0_RGB\"/>\n\t\t<field name=\"GL_OPERAND1_ALPHA\"/>\n\t\t<field name=\"GL_OPERAND1_RGB\"/>\n\t\t<field name=\"GL_OPERAND2_ALPHA\"/>\n\t\t<field name=\"GL_OPERAND2_RGB\"/>\n\t\t<field name=\"GL_POINT_DISTANCE_ATTENUATION\"/>\n\t\t<field name=\"GL_POINT_FADE_THRESHOLD_SIZE\"/>\n\t\t<field name=\"GL_POINT_SIZE\"/>\n\t\t<field name=\"GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES\"/>\n\t\t<field name=\"GL_POINT_SIZE_ARRAY_OES\"/>\n\t\t<field name=\"GL_POINT_SIZE_ARRAY_POINTER_OES\"/>\n\t\t<field name=\"GL_POINT_SIZE_ARRAY_STRIDE_OES\"/>\n\t\t<field name=\"GL_POINT_SIZE_ARRAY_TYPE_OES\"/>\n\t\t<field name=\"GL_POINT_SIZE_MAX\"/>\n\t\t<field name=\"GL_POINT_SIZE_MIN\"/>\n\t\t<field name=\"GL_POINT_SPRITE_OES\"/>\n\t\t<field name=\"GL_POLYGON_OFFSET_FACTOR\"/>\n\t\t<field name=\"GL_POLYGON_OFFSET_UNITS\"/>\n\t\t<field name=\"GL_PREVIOUS\"/>\n\t\t<field name=\"GL_PRIMARY_COLOR\"/>\n\t\t<field name=\"GL_PROJECTION_MATRIX\"/>\n\t\t<field name=\"GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES\"/>\n\t\t<field name=\"GL_PROJECTION_STACK_DEPTH\"/>\n\t\t<field name=\"GL_RGB_SCALE\"/>\n\t\t<field name=\"GL_SAMPLES\"/>\n\t\t<field name=\"GL_SAMPLE_BUFFERS\"/>\n\t\t<field name=\"GL_SAMPLE_COVERAGE_INVERT\"/>\n\t\t<field name=\"GL_SAMPLE_COVERAGE_VALUE\"/>\n\t\t<field name=\"GL_SCISSOR_BOX\"/>\n\t\t<field name=\"GL_SHADE_MODEL\"/>\n\t\t<field name=\"GL_SRC0_ALPHA\"/>\n\t\t<field name=\"GL_SRC0_RGB\"/>\n\t\t<field name=\"GL_SRC1_ALPHA\"/>\n\t\t<field name=\"GL_SRC1_RGB\"/>\n\t\t<field name=\"GL_SRC2_ALPHA\"/>\n\t\t<field name=\"GL_SRC2_RGB\"/>\n\t\t<field name=\"GL_STATIC_DRAW\"/>\n\t\t<field name=\"GL_STENCIL_CLEAR_VALUE\"/>\n\t\t<field name=\"GL_STENCIL_FAIL\"/>\n\t\t<field name=\"GL_STENCIL_FUNC\"/>\n\t\t<field name=\"GL_STENCIL_PASS_DEPTH_FAIL\"/>\n\t\t<field name=\"GL_STENCIL_PASS_DEPTH_PASS\"/>\n\t\t<field name=\"GL_STENCIL_REF\"/>\n\t\t<field name=\"GL_STENCIL_VALUE_MASK\"/>\n\t\t<field name=\"GL_STENCIL_WRITEMASK\"/>\n\t\t<field name=\"GL_SUBTRACT\"/>\n\t\t<field name=\"GL_TEXTURE_BINDING_2D\"/>\n\t\t<field name=\"GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_TEXTURE_COORD_ARRAY_POINTER\"/>\n\t\t<field name=\"GL_TEXTURE_COORD_ARRAY_SIZE\"/>\n\t\t<field name=\"GL_TEXTURE_COORD_ARRAY_STRIDE\"/>\n\t\t<field name=\"GL_TEXTURE_COORD_ARRAY_TYPE\"/>\n\t\t<field name=\"GL_TEXTURE_MATRIX\"/>\n\t\t<field name=\"GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES\"/>\n\t\t<field name=\"GL_TEXTURE_STACK_DEPTH\"/>\n\t\t<field name=\"GL_VERTEX_ARRAY_BUFFER_BINDING\"/>\n\t\t<field name=\"GL_VERTEX_ARRAY_POINTER\"/>\n\t\t<field name=\"GL_VERTEX_ARRAY_SIZE\"/>\n\t\t<field name=\"GL_VERTEX_ARRAY_STRIDE\"/>\n\t\t<field name=\"GL_VERTEX_ARRAY_TYPE\"/>\n\t\t<field name=\"GL_VIEWPORT\"/>\n\t\t<field name=\"GL_WRITE_ONLY\"/>\n\t</class>\n\t<class name=\"javax/microedition/khronos/opengles/GL11Ext\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/microedition/khronos/opengles/GL\"/>\n\t\t<method name=\"glCurrentPaletteMatrixOES(I)V\"/>\n\t\t<method name=\"glDrawTexfOES(FFFFF)V\"/>\n\t\t<method name=\"glDrawTexfvOES(Ljava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glDrawTexfvOES([FI)V\"/>\n\t\t<method name=\"glDrawTexiOES(IIIII)V\"/>\n\t\t<method name=\"glDrawTexivOES(Ljava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDrawTexivOES([II)V\"/>\n\t\t<method name=\"glDrawTexsOES(SSSSS)V\"/>\n\t\t<method name=\"glDrawTexsvOES(Ljava/nio/ShortBuffer;)V\"/>\n\t\t<method name=\"glDrawTexsvOES([SI)V\"/>\n\t\t<method name=\"glDrawTexxOES(IIIII)V\"/>\n\t\t<method name=\"glDrawTexxvOES(Ljava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDrawTexxvOES([II)V\"/>\n\t\t<method name=\"glEnable(I)V\"/>\n\t\t<method name=\"glEnableClientState(I)V\"/>\n\t\t<method name=\"glLoadPaletteFromModelViewMatrixOES()V\"/>\n\t\t<method name=\"glMatrixIndexPointerOES(IIII)V\"/>\n\t\t<method name=\"glMatrixIndexPointerOES(IIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glTexParameterfv(II[FI)V\"/>\n\t\t<method name=\"glWeightPointerOES(IIII)V\"/>\n\t\t<method name=\"glWeightPointerOES(IIILjava/nio/Buffer;)V\"/>\n\t\t<field name=\"GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES\"/>\n\t\t<field name=\"GL_MATRIX_INDEX_ARRAY_OES\"/>\n\t\t<field name=\"GL_MATRIX_INDEX_ARRAY_POINTER_OES\"/>\n\t\t<field name=\"GL_MATRIX_INDEX_ARRAY_SIZE_OES\"/>\n\t\t<field name=\"GL_MATRIX_INDEX_ARRAY_STRIDE_OES\"/>\n\t\t<field name=\"GL_MATRIX_INDEX_ARRAY_TYPE_OES\"/>\n\t\t<field name=\"GL_MATRIX_PALETTE_OES\"/>\n\t\t<field name=\"GL_MAX_PALETTE_MATRICES_OES\"/>\n\t\t<field name=\"GL_MAX_VERTEX_UNITS_OES\"/>\n\t\t<field name=\"GL_TEXTURE_CROP_RECT_OES\"/>\n\t\t<field name=\"GL_WEIGHT_ARRAY_BUFFER_BINDING_OES\"/>\n\t\t<field name=\"GL_WEIGHT_ARRAY_OES\"/>\n\t\t<field name=\"GL_WEIGHT_ARRAY_POINTER_OES\"/>\n\t\t<field name=\"GL_WEIGHT_ARRAY_SIZE_OES\"/>\n\t\t<field name=\"GL_WEIGHT_ARRAY_STRIDE_OES\"/>\n\t\t<field name=\"GL_WEIGHT_ARRAY_TYPE_OES\"/>\n\t</class>\n\t<class name=\"javax/microedition/khronos/opengles/GL11ExtensionPack\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/microedition/khronos/opengles/GL\"/>\n\t\t<method name=\"glBindFramebufferOES(II)V\"/>\n\t\t<method name=\"glBindRenderbufferOES(II)V\"/>\n\t\t<method name=\"glBindTexture(II)V\"/>\n\t\t<method name=\"glBlendEquation(I)V\"/>\n\t\t<method name=\"glBlendEquationSeparate(II)V\"/>\n\t\t<method name=\"glBlendFuncSeparate(IIII)V\"/>\n\t\t<method name=\"glCheckFramebufferStatusOES(I)I\"/>\n\t\t<method name=\"glCompressedTexImage2D(IIIIIIILjava/nio/Buffer;)V\"/>\n\t\t<method name=\"glCopyTexImage2D(IIIIIIII)V\"/>\n\t\t<method name=\"glDeleteFramebuffersOES(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDeleteFramebuffersOES(I[II)V\"/>\n\t\t<method name=\"glDeleteRenderbuffersOES(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glDeleteRenderbuffersOES(I[II)V\"/>\n\t\t<method name=\"glEnable(I)V\"/>\n\t\t<method name=\"glFramebufferRenderbufferOES(IIII)V\"/>\n\t\t<method name=\"glFramebufferTexture2DOES(IIIII)V\"/>\n\t\t<method name=\"glGenFramebuffersOES(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGenFramebuffersOES(I[II)V\"/>\n\t\t<method name=\"glGenRenderbuffersOES(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGenRenderbuffersOES(I[II)V\"/>\n\t\t<method name=\"glGenerateMipmapOES(I)V\"/>\n\t\t<method name=\"glGetFramebufferAttachmentParameterivOES(IIILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetFramebufferAttachmentParameterivOES(III[II)V\"/>\n\t\t<method name=\"glGetIntegerv(ILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetIntegerv(I[II)V\"/>\n\t\t<method name=\"glGetRenderbufferParameterivOES(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetRenderbufferParameterivOES(II[II)V\"/>\n\t\t<method name=\"glGetTexGenfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glGetTexGenfv(II[FI)V\"/>\n\t\t<method name=\"glGetTexGeniv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetTexGeniv(II[II)V\"/>\n\t\t<method name=\"glGetTexGenxv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glGetTexGenxv(II[II)V\"/>\n\t\t<method name=\"glIsFramebufferOES(I)Z\"/>\n\t\t<method name=\"glIsRenderbufferOES(I)Z\"/>\n\t\t<method name=\"glRenderbufferStorageOES(IIII)V\"/>\n\t\t<method name=\"glStencilOp(III)V\"/>\n\t\t<method name=\"glTexEnvf(IIF)V\"/>\n\t\t<method name=\"glTexEnvfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glTexEnvfv(II[FI)V\"/>\n\t\t<method name=\"glTexEnvx(III)V\"/>\n\t\t<method name=\"glTexEnvxv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glTexEnvxv(II[II)V\"/>\n\t\t<method name=\"glTexGenf(IIF)V\"/>\n\t\t<method name=\"glTexGenfv(IILjava/nio/FloatBuffer;)V\"/>\n\t\t<method name=\"glTexGenfv(II[FI)V\"/>\n\t\t<method name=\"glTexGeni(III)V\"/>\n\t\t<method name=\"glTexGeniv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glTexGeniv(II[II)V\"/>\n\t\t<method name=\"glTexGenx(III)V\"/>\n\t\t<method name=\"glTexGenxv(IILjava/nio/IntBuffer;)V\"/>\n\t\t<method name=\"glTexGenxv(II[II)V\"/>\n\t\t<method name=\"glTexParameterf(IIF)V\"/>\n\t\t<field name=\"GL_BLEND_DST_ALPHA\"/>\n\t\t<field name=\"GL_BLEND_DST_RGB\"/>\n\t\t<field name=\"GL_BLEND_EQUATION\"/>\n\t\t<field name=\"GL_BLEND_EQUATION_ALPHA\"/>\n\t\t<field name=\"GL_BLEND_EQUATION_RGB\"/>\n\t\t<field name=\"GL_BLEND_SRC_ALPHA\"/>\n\t\t<field name=\"GL_BLEND_SRC_RGB\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT0_OES\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT10_OES\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT11_OES\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT12_OES\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT13_OES\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT14_OES\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT15_OES\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT1_OES\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT2_OES\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT3_OES\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT4_OES\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT5_OES\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT6_OES\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT7_OES\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT8_OES\"/>\n\t\t<field name=\"GL_COLOR_ATTACHMENT9_OES\"/>\n\t\t<field name=\"GL_DECR_WRAP\"/>\n\t\t<field name=\"GL_DEPTH_ATTACHMENT_OES\"/>\n\t\t<field name=\"GL_DEPTH_COMPONENT\"/>\n\t\t<field name=\"GL_DEPTH_COMPONENT16\"/>\n\t\t<field name=\"GL_DEPTH_COMPONENT24\"/>\n\t\t<field name=\"GL_DEPTH_COMPONENT32\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_BINDING_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_COMPLETE_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_OES\"/>\n\t\t<field name=\"GL_FRAMEBUFFER_UNSUPPORTED_OES\"/>\n\t\t<field name=\"GL_FUNC_ADD\"/>\n\t\t<field name=\"GL_FUNC_REVERSE_SUBTRACT\"/>\n\t\t<field name=\"GL_FUNC_SUBTRACT\"/>\n\t\t<field name=\"GL_INCR_WRAP\"/>\n\t\t<field name=\"GL_INVALID_FRAMEBUFFER_OPERATION_OES\"/>\n\t\t<field name=\"GL_MAX_COLOR_ATTACHMENTS_OES\"/>\n\t\t<field name=\"GL_MAX_CUBE_MAP_TEXTURE_SIZE\"/>\n\t\t<field name=\"GL_MAX_RENDERBUFFER_SIZE_OES\"/>\n\t\t<field name=\"GL_MIRRORED_REPEAT\"/>\n\t\t<field name=\"GL_NORMAL_MAP\"/>\n\t\t<field name=\"GL_REFLECTION_MAP\"/>\n\t\t<field name=\"GL_RENDERBUFFER_ALPHA_SIZE_OES\"/>\n\t\t<field name=\"GL_RENDERBUFFER_BINDING_OES\"/>\n\t\t<field name=\"GL_RENDERBUFFER_BLUE_SIZE_OES\"/>\n\t\t<field name=\"GL_RENDERBUFFER_DEPTH_SIZE_OES\"/>\n\t\t<field name=\"GL_RENDERBUFFER_GREEN_SIZE_OES\"/>\n\t\t<field name=\"GL_RENDERBUFFER_HEIGHT_OES\"/>\n\t\t<field name=\"GL_RENDERBUFFER_INTERNAL_FORMAT_OES\"/>\n\t\t<field name=\"GL_RENDERBUFFER_OES\"/>\n\t\t<field name=\"GL_RENDERBUFFER_RED_SIZE_OES\"/>\n\t\t<field name=\"GL_RENDERBUFFER_STENCIL_SIZE_OES\"/>\n\t\t<field name=\"GL_RENDERBUFFER_WIDTH_OES\"/>\n\t\t<field name=\"GL_RGB565_OES\"/>\n\t\t<field name=\"GL_RGB5_A1\"/>\n\t\t<field name=\"GL_RGB8\"/>\n\t\t<field name=\"GL_RGBA4\"/>\n\t\t<field name=\"GL_RGBA8\"/>\n\t\t<field name=\"GL_STENCIL_ATTACHMENT_OES\"/>\n\t\t<field name=\"GL_STENCIL_INDEX\"/>\n\t\t<field name=\"GL_STENCIL_INDEX1_OES\"/>\n\t\t<field name=\"GL_STENCIL_INDEX4_OES\"/>\n\t\t<field name=\"GL_STENCIL_INDEX8_OES\"/>\n\t\t<field name=\"GL_STR\"/>\n\t\t<field name=\"GL_TEXTURE_BINDING_CUBE_MAP\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP_NEGATIVE_X\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP_NEGATIVE_Y\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP_NEGATIVE_Z\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP_POSITIVE_X\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP_POSITIVE_Y\"/>\n\t\t<field name=\"GL_TEXTURE_CUBE_MAP_POSITIVE_Z\"/>\n\t\t<field name=\"GL_TEXTURE_GEN_MODE\"/>\n\t\t<field name=\"GL_TEXTURE_GEN_STR\"/>\n\t</class>\n\t<class name=\"javax/net/ServerSocketFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"createServerSocket()Ljava/net/ServerSocket;\"/>\n\t\t<method name=\"createServerSocket(I)Ljava/net/ServerSocket;\"/>\n\t\t<method name=\"createServerSocket(II)Ljava/net/ServerSocket;\"/>\n\t\t<method name=\"createServerSocket(IILjava/net/InetAddress;)Ljava/net/ServerSocket;\"/>\n\t\t<method name=\"getDefault()Ljavax/net/ServerSocketFactory;\"/>\n\t</class>\n\t<class name=\"javax/net/SocketFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"createSocket()Ljava/net/Socket;\"/>\n\t\t<method name=\"createSocket(Ljava/lang/String;I)Ljava/net/Socket;\"/>\n\t\t<method name=\"createSocket(Ljava/lang/String;ILjava/net/InetAddress;I)Ljava/net/Socket;\"/>\n\t\t<method name=\"createSocket(Ljava/net/InetAddress;I)Ljava/net/Socket;\"/>\n\t\t<method name=\"createSocket(Ljava/net/InetAddress;ILjava/net/InetAddress;I)Ljava/net/Socket;\"/>\n\t\t<method name=\"getDefault()Ljavax/net/SocketFactory;\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/CertPathTrustManagerParameters\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/net/ssl/ManagerFactoryParameters\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/cert/CertPathParameters;)V\"/>\n\t\t<method name=\"getParameters()Ljava/security/cert/CertPathParameters;\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/ExtendedSSLSession\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/net/ssl/SSLSession\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getLocalSupportedSignatureAlgorithms()[Ljava/lang/String;\"/>\n\t\t<method name=\"getPeerSupportedSignatureAlgorithms()[Ljava/lang/String;\"/>\n\t\t<method name=\"getRequestedServerNames()Ljava/util/List;\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/HandshakeCompletedEvent\" since=\"1\">\n\t\t<extends name=\"java/util/EventObject\"/>\n\t\t<method name=\"&lt;init>(Ljavax/net/ssl/SSLSocket;Ljavax/net/ssl/SSLSession;)V\"/>\n\t\t<method name=\"getCipherSuite()Ljava/lang/String;\"/>\n\t\t<method name=\"getLocalCertificates()[Ljava/security/cert/Certificate;\"/>\n\t\t<method name=\"getLocalPrincipal()Ljava/security/Principal;\"/>\n\t\t<method name=\"getPeerCertificateChain()[Ljavax/security/cert/X509Certificate;\"/>\n\t\t<method name=\"getPeerCertificates()[Ljava/security/cert/Certificate;\"/>\n\t\t<method name=\"getPeerPrincipal()Ljava/security/Principal;\"/>\n\t\t<method name=\"getSession()Ljavax/net/ssl/SSLSession;\"/>\n\t\t<method name=\"getSocket()Ljavax/net/ssl/SSLSocket;\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/HandshakeCompletedListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/EventListener\"/>\n\t\t<method name=\"handshakeCompleted(Ljavax/net/ssl/HandshakeCompletedEvent;)V\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/HostnameVerifier\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"verify(Ljava/lang/String;Ljavax/net/ssl/SSLSession;)Z\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/HttpsURLConnection\" since=\"1\">\n\t\t<extends name=\"java/net/HttpURLConnection\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/URL;)V\"/>\n\t\t<method name=\"getCipherSuite()Ljava/lang/String;\"/>\n\t\t<method name=\"getDefaultHostnameVerifier()Ljavax/net/ssl/HostnameVerifier;\"/>\n\t\t<method name=\"getDefaultSSLSocketFactory()Ljavax/net/ssl/SSLSocketFactory;\"/>\n\t\t<method name=\"getHostnameVerifier()Ljavax/net/ssl/HostnameVerifier;\"/>\n\t\t<method name=\"getLocalCertificates()[Ljava/security/cert/Certificate;\"/>\n\t\t<method name=\"getLocalPrincipal()Ljava/security/Principal;\"/>\n\t\t<method name=\"getPeerPrincipal()Ljava/security/Principal;\"/>\n\t\t<method name=\"getSSLSocketFactory()Ljavax/net/ssl/SSLSocketFactory;\"/>\n\t\t<method name=\"getServerCertificates()[Ljava/security/cert/Certificate;\"/>\n\t\t<method name=\"setDefaultHostnameVerifier(Ljavax/net/ssl/HostnameVerifier;)V\"/>\n\t\t<method name=\"setDefaultSSLSocketFactory(Ljavax/net/ssl/SSLSocketFactory;)V\"/>\n\t\t<method name=\"setHostnameVerifier(Ljavax/net/ssl/HostnameVerifier;)V\"/>\n\t\t<method name=\"setSSLSocketFactory(Ljavax/net/ssl/SSLSocketFactory;)V\"/>\n\t\t<field name=\"hostnameVerifier\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/KeyManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/KeyManagerFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljavax/net/ssl/KeyManagerFactorySpi;Ljava/security/Provider;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getDefaultAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Ljavax/net/ssl/KeyManagerFactory;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/net/ssl/KeyManagerFactory;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/net/ssl/KeyManagerFactory;\"/>\n\t\t<method name=\"getKeyManagers()[Ljavax/net/ssl/KeyManager;\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"init(Ljava/security/KeyStore;[C)V\"/>\n\t\t<method name=\"init(Ljavax/net/ssl/ManagerFactoryParameters;)V\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/KeyManagerFactorySpi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"engineGetKeyManagers()[Ljavax/net/ssl/KeyManager;\"/>\n\t\t<method name=\"engineInit(Ljava/security/KeyStore;[C)V\"/>\n\t\t<method name=\"engineInit(Ljavax/net/ssl/ManagerFactoryParameters;)V\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/KeyStoreBuilderParameters\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/net/ssl/ManagerFactoryParameters\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/KeyStore$Builder;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/List;)V\"/>\n\t\t<method name=\"getParameters()Ljava/util/List;\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/ManagerFactoryParameters\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SNIHostName\" since=\"24\">\n\t\t<extends name=\"javax/net/ssl/SNIServerName\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>([B)V\"/>\n\t\t<method name=\"createSNIMatcher(Ljava/lang/String;)Ljavax/net/ssl/SNIMatcher;\"/>\n\t\t<method name=\"getAsciiName()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SNIMatcher\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"getType()I\"/>\n\t\t<method name=\"matches(Ljavax/net/ssl/SNIServerName;)Z\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SNIServerName\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I[B)V\"/>\n\t\t<method name=\"getEncoded()[B\"/>\n\t\t<method name=\"getType()I\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SSLContext\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljavax/net/ssl/SSLContextSpi;Ljava/security/Provider;Ljava/lang/String;)V\"/>\n\t\t<method name=\"createSSLEngine()Ljavax/net/ssl/SSLEngine;\"/>\n\t\t<method name=\"createSSLEngine(Ljava/lang/String;I)Ljavax/net/ssl/SSLEngine;\"/>\n\t\t<method name=\"getClientSessionContext()Ljavax/net/ssl/SSLSessionContext;\"/>\n\t\t<method name=\"getDefault()Ljavax/net/ssl/SSLContext;\" since=\"9\"/>\n\t\t<method name=\"getDefaultSSLParameters()Ljavax/net/ssl/SSLParameters;\" since=\"9\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Ljavax/net/ssl/SSLContext;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/net/ssl/SSLContext;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/net/ssl/SSLContext;\"/>\n\t\t<method name=\"getProtocol()Ljava/lang/String;\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"getServerSessionContext()Ljavax/net/ssl/SSLSessionContext;\"/>\n\t\t<method name=\"getServerSocketFactory()Ljavax/net/ssl/SSLServerSocketFactory;\"/>\n\t\t<method name=\"getSocketFactory()Ljavax/net/ssl/SSLSocketFactory;\"/>\n\t\t<method name=\"getSupportedSSLParameters()Ljavax/net/ssl/SSLParameters;\" since=\"9\"/>\n\t\t<method name=\"init([Ljavax/net/ssl/KeyManager;[Ljavax/net/ssl/TrustManager;Ljava/security/SecureRandom;)V\"/>\n\t\t<method name=\"setDefault(Ljavax/net/ssl/SSLContext;)V\" since=\"9\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SSLContextSpi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"engineCreateSSLEngine()Ljavax/net/ssl/SSLEngine;\"/>\n\t\t<method name=\"engineCreateSSLEngine(Ljava/lang/String;I)Ljavax/net/ssl/SSLEngine;\"/>\n\t\t<method name=\"engineGetClientSessionContext()Ljavax/net/ssl/SSLSessionContext;\"/>\n\t\t<method name=\"engineGetDefaultSSLParameters()Ljavax/net/ssl/SSLParameters;\" since=\"9\"/>\n\t\t<method name=\"engineGetServerSessionContext()Ljavax/net/ssl/SSLSessionContext;\"/>\n\t\t<method name=\"engineGetServerSocketFactory()Ljavax/net/ssl/SSLServerSocketFactory;\"/>\n\t\t<method name=\"engineGetSocketFactory()Ljavax/net/ssl/SSLSocketFactory;\"/>\n\t\t<method name=\"engineGetSupportedSSLParameters()Ljavax/net/ssl/SSLParameters;\" since=\"9\"/>\n\t\t<method name=\"engineInit([Ljavax/net/ssl/KeyManager;[Ljavax/net/ssl/TrustManager;Ljava/security/SecureRandom;)V\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SSLEngine\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"beginHandshake()V\"/>\n\t\t<method name=\"closeInbound()V\"/>\n\t\t<method name=\"closeOutbound()V\"/>\n\t\t<method name=\"getApplicationProtocol()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getDelegatedTask()Ljava/lang/Runnable;\"/>\n\t\t<method name=\"getEnableSessionCreation()Z\"/>\n\t\t<method name=\"getEnabledCipherSuites()[Ljava/lang/String;\"/>\n\t\t<method name=\"getEnabledProtocols()[Ljava/lang/String;\"/>\n\t\t<method name=\"getHandshakeApplicationProtocol()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getHandshakeApplicationProtocolSelector()Ljava/util/function/BiFunction;\" since=\"29\"/>\n\t\t<method name=\"getHandshakeSession()Ljavax/net/ssl/SSLSession;\" since=\"24\"/>\n\t\t<method name=\"getHandshakeStatus()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;\"/>\n\t\t<method name=\"getNeedClientAuth()Z\"/>\n\t\t<method name=\"getPeerHost()Ljava/lang/String;\"/>\n\t\t<method name=\"getPeerPort()I\"/>\n\t\t<method name=\"getSSLParameters()Ljavax/net/ssl/SSLParameters;\" since=\"9\"/>\n\t\t<method name=\"getSession()Ljavax/net/ssl/SSLSession;\"/>\n\t\t<method name=\"getSupportedCipherSuites()[Ljava/lang/String;\"/>\n\t\t<method name=\"getSupportedProtocols()[Ljava/lang/String;\"/>\n\t\t<method name=\"getUseClientMode()Z\"/>\n\t\t<method name=\"getWantClientAuth()Z\"/>\n\t\t<method name=\"isInboundDone()Z\"/>\n\t\t<method name=\"isOutboundDone()Z\"/>\n\t\t<method name=\"setEnableSessionCreation(Z)V\"/>\n\t\t<method name=\"setEnabledCipherSuites([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setEnabledProtocols([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setHandshakeApplicationProtocolSelector(Ljava/util/function/BiFunction;)V\" since=\"29\"/>\n\t\t<method name=\"setNeedClientAuth(Z)V\"/>\n\t\t<method name=\"setSSLParameters(Ljavax/net/ssl/SSLParameters;)V\" since=\"9\"/>\n\t\t<method name=\"setUseClientMode(Z)V\"/>\n\t\t<method name=\"setWantClientAuth(Z)V\"/>\n\t\t<method name=\"unwrap(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;\"/>\n\t\t<method name=\"unwrap(Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;\"/>\n\t\t<method name=\"unwrap(Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;II)Ljavax/net/ssl/SSLEngineResult;\"/>\n\t\t<method name=\"wrap(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;\"/>\n\t\t<method name=\"wrap([Ljava/nio/ByteBuffer;IILjava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;\"/>\n\t\t<method name=\"wrap([Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SSLEngineResult\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V\"/>\n\t\t<method name=\"bytesConsumed()I\"/>\n\t\t<method name=\"bytesProduced()I\"/>\n\t\t<method name=\"getHandshakeStatus()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;\"/>\n\t\t<method name=\"getStatus()Ljavax/net/ssl/SSLEngineResult$Status;\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SSLEngineResult$HandshakeStatus\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;\"/>\n\t\t<method name=\"values()[Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;\"/>\n\t\t<field name=\"FINISHED\"/>\n\t\t<field name=\"NEED_TASK\"/>\n\t\t<field name=\"NEED_UNWRAP\"/>\n\t\t<field name=\"NEED_WRAP\"/>\n\t\t<field name=\"NOT_HANDSHAKING\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SSLEngineResult$Status\" since=\"1\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljavax/net/ssl/SSLEngineResult$Status;\"/>\n\t\t<method name=\"values()[Ljavax/net/ssl/SSLEngineResult$Status;\"/>\n\t\t<field name=\"BUFFER_OVERFLOW\"/>\n\t\t<field name=\"BUFFER_UNDERFLOW\"/>\n\t\t<field name=\"CLOSED\"/>\n\t\t<field name=\"OK\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SSLException\" since=\"1\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SSLHandshakeException\" since=\"1\">\n\t\t<extends name=\"javax/net/ssl/SSLException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SSLKeyException\" since=\"1\">\n\t\t<extends name=\"javax/net/ssl/SSLException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SSLParameters\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>([Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>([Ljava/lang/String;[Ljava/lang/String;)V\"/>\n\t\t<method name=\"getAlgorithmConstraints()Ljava/security/AlgorithmConstraints;\" since=\"24\"/>\n\t\t<method name=\"getApplicationProtocols()[Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getCipherSuites()[Ljava/lang/String;\"/>\n\t\t<method name=\"getEndpointIdentificationAlgorithm()Ljava/lang/String;\" since=\"24\"/>\n\t\t<method name=\"getNeedClientAuth()Z\"/>\n\t\t<method name=\"getProtocols()[Ljava/lang/String;\"/>\n\t\t<method name=\"getSNIMatchers()Ljava/util/Collection;\" since=\"24\"/>\n\t\t<method name=\"getServerNames()Ljava/util/List;\" since=\"24\"/>\n\t\t<method name=\"getUseCipherSuitesOrder()Z\" since=\"24\"/>\n\t\t<method name=\"getWantClientAuth()Z\"/>\n\t\t<method name=\"setAlgorithmConstraints(Ljava/security/AlgorithmConstraints;)V\" since=\"24\"/>\n\t\t<method name=\"setApplicationProtocols([Ljava/lang/String;)V\" since=\"29\"/>\n\t\t<method name=\"setCipherSuites([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setEndpointIdentificationAlgorithm(Ljava/lang/String;)V\" since=\"24\"/>\n\t\t<method name=\"setNeedClientAuth(Z)V\"/>\n\t\t<method name=\"setProtocols([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setSNIMatchers(Ljava/util/Collection;)V\" since=\"24\"/>\n\t\t<method name=\"setServerNames(Ljava/util/List;)V\" since=\"24\"/>\n\t\t<method name=\"setUseCipherSuitesOrder(Z)V\" since=\"24\"/>\n\t\t<method name=\"setWantClientAuth(Z)V\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SSLPeerUnverifiedException\" since=\"1\">\n\t\t<extends name=\"javax/net/ssl/SSLException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SSLPermission\" since=\"1\">\n\t\t<extends name=\"java/security/BasicPermission\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SSLProtocolException\" since=\"1\">\n\t\t<extends name=\"javax/net/ssl/SSLException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SSLServerSocket\" since=\"1\">\n\t\t<extends name=\"java/net/ServerSocket\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"&lt;init>(IILjava/net/InetAddress;)V\"/>\n\t\t<method name=\"getEnableSessionCreation()Z\"/>\n\t\t<method name=\"getEnabledCipherSuites()[Ljava/lang/String;\"/>\n\t\t<method name=\"getEnabledProtocols()[Ljava/lang/String;\"/>\n\t\t<method name=\"getNeedClientAuth()Z\"/>\n\t\t<method name=\"getSSLParameters()Ljavax/net/ssl/SSLParameters;\" since=\"24\"/>\n\t\t<method name=\"getSupportedCipherSuites()[Ljava/lang/String;\"/>\n\t\t<method name=\"getSupportedProtocols()[Ljava/lang/String;\"/>\n\t\t<method name=\"getUseClientMode()Z\"/>\n\t\t<method name=\"getWantClientAuth()Z\"/>\n\t\t<method name=\"setEnableSessionCreation(Z)V\"/>\n\t\t<method name=\"setEnabledCipherSuites([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setEnabledProtocols([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setNeedClientAuth(Z)V\"/>\n\t\t<method name=\"setSSLParameters(Ljavax/net/ssl/SSLParameters;)V\" since=\"24\"/>\n\t\t<method name=\"setUseClientMode(Z)V\"/>\n\t\t<method name=\"setWantClientAuth(Z)V\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SSLServerSocketFactory\" since=\"1\">\n\t\t<extends name=\"javax/net/ServerSocketFactory\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getDefaultCipherSuites()[Ljava/lang/String;\"/>\n\t\t<method name=\"getSupportedCipherSuites()[Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SSLSession\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getApplicationBufferSize()I\"/>\n\t\t<method name=\"getCipherSuite()Ljava/lang/String;\"/>\n\t\t<method name=\"getCreationTime()J\"/>\n\t\t<method name=\"getId()[B\"/>\n\t\t<method name=\"getLastAccessedTime()J\"/>\n\t\t<method name=\"getLocalCertificates()[Ljava/security/cert/Certificate;\"/>\n\t\t<method name=\"getLocalPrincipal()Ljava/security/Principal;\"/>\n\t\t<method name=\"getPacketBufferSize()I\"/>\n\t\t<method name=\"getPeerCertificateChain()[Ljavax/security/cert/X509Certificate;\"/>\n\t\t<method name=\"getPeerCertificates()[Ljava/security/cert/Certificate;\"/>\n\t\t<method name=\"getPeerHost()Ljava/lang/String;\"/>\n\t\t<method name=\"getPeerPort()I\"/>\n\t\t<method name=\"getPeerPrincipal()Ljava/security/Principal;\"/>\n\t\t<method name=\"getProtocol()Ljava/lang/String;\"/>\n\t\t<method name=\"getSessionContext()Ljavax/net/ssl/SSLSessionContext;\"/>\n\t\t<method name=\"getValue(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getValueNames()[Ljava/lang/String;\"/>\n\t\t<method name=\"invalidate()V\"/>\n\t\t<method name=\"isValid()Z\"/>\n\t\t<method name=\"putValue(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"removeValue(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SSLSessionBindingEvent\" since=\"1\">\n\t\t<extends name=\"java/util/EventObject\"/>\n\t\t<method name=\"&lt;init>(Ljavax/net/ssl/SSLSession;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getSession()Ljavax/net/ssl/SSLSession;\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SSLSessionBindingListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/EventListener\"/>\n\t\t<method name=\"valueBound(Ljavax/net/ssl/SSLSessionBindingEvent;)V\"/>\n\t\t<method name=\"valueUnbound(Ljavax/net/ssl/SSLSessionBindingEvent;)V\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SSLSessionContext\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getIds()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"getSession([B)Ljavax/net/ssl/SSLSession;\"/>\n\t\t<method name=\"getSessionCacheSize()I\"/>\n\t\t<method name=\"getSessionTimeout()I\"/>\n\t\t<method name=\"setSessionCacheSize(I)V\"/>\n\t\t<method name=\"setSessionTimeout(I)V\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SSLSocket\" since=\"1\">\n\t\t<extends name=\"java/net/Socket\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;ILjava/net/InetAddress;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/InetAddress;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/InetAddress;ILjava/net/InetAddress;I)V\"/>\n\t\t<method name=\"addHandshakeCompletedListener(Ljavax/net/ssl/HandshakeCompletedListener;)V\"/>\n\t\t<method name=\"getApplicationProtocol()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getEnableSessionCreation()Z\"/>\n\t\t<method name=\"getEnabledCipherSuites()[Ljava/lang/String;\"/>\n\t\t<method name=\"getEnabledProtocols()[Ljava/lang/String;\"/>\n\t\t<method name=\"getHandshakeApplicationProtocol()Ljava/lang/String;\" since=\"29\"/>\n\t\t<method name=\"getHandshakeApplicationProtocolSelector()Ljava/util/function/BiFunction;\" since=\"29\"/>\n\t\t<method name=\"getHandshakeSession()Ljavax/net/ssl/SSLSession;\" since=\"24\"/>\n\t\t<method name=\"getNeedClientAuth()Z\"/>\n\t\t<method name=\"getSSLParameters()Ljavax/net/ssl/SSLParameters;\" since=\"9\"/>\n\t\t<method name=\"getSession()Ljavax/net/ssl/SSLSession;\"/>\n\t\t<method name=\"getSupportedCipherSuites()[Ljava/lang/String;\"/>\n\t\t<method name=\"getSupportedProtocols()[Ljava/lang/String;\"/>\n\t\t<method name=\"getUseClientMode()Z\"/>\n\t\t<method name=\"getWantClientAuth()Z\"/>\n\t\t<method name=\"removeHandshakeCompletedListener(Ljavax/net/ssl/HandshakeCompletedListener;)V\"/>\n\t\t<method name=\"setEnableSessionCreation(Z)V\"/>\n\t\t<method name=\"setEnabledCipherSuites([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setEnabledProtocols([Ljava/lang/String;)V\"/>\n\t\t<method name=\"setHandshakeApplicationProtocolSelector(Ljava/util/function/BiFunction;)V\" since=\"29\"/>\n\t\t<method name=\"setNeedClientAuth(Z)V\"/>\n\t\t<method name=\"setSSLParameters(Ljavax/net/ssl/SSLParameters;)V\" since=\"9\"/>\n\t\t<method name=\"setUseClientMode(Z)V\"/>\n\t\t<method name=\"setWantClientAuth(Z)V\"/>\n\t\t<method name=\"startHandshake()V\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/SSLSocketFactory\" since=\"1\">\n\t\t<extends name=\"javax/net/SocketFactory\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"createSocket(Ljava/net/Socket;Ljava/lang/String;IZ)Ljava/net/Socket;\"/>\n\t\t<method name=\"getDefaultCipherSuites()[Ljava/lang/String;\"/>\n\t\t<method name=\"getSupportedCipherSuites()[Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/StandardConstants\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"SNI_HOST_NAME\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/TrustManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/TrustManagerFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljavax/net/ssl/TrustManagerFactorySpi;Ljava/security/Provider;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getDefaultAlgorithm()Ljava/lang/String;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;)Ljavax/net/ssl/TrustManagerFactory;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/net/ssl/TrustManagerFactory;\"/>\n\t\t<method name=\"getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/net/ssl/TrustManagerFactory;\"/>\n\t\t<method name=\"getProvider()Ljava/security/Provider;\"/>\n\t\t<method name=\"getTrustManagers()[Ljavax/net/ssl/TrustManager;\"/>\n\t\t<method name=\"init(Ljava/security/KeyStore;)V\"/>\n\t\t<method name=\"init(Ljavax/net/ssl/ManagerFactoryParameters;)V\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/TrustManagerFactorySpi\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"engineGetTrustManagers()[Ljavax/net/ssl/TrustManager;\"/>\n\t\t<method name=\"engineInit(Ljava/security/KeyStore;)V\"/>\n\t\t<method name=\"engineInit(Ljavax/net/ssl/ManagerFactoryParameters;)V\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/X509ExtendedKeyManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/net/ssl/X509KeyManager\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"chooseEngineClientAlias([Ljava/lang/String;[Ljava/security/Principal;Ljavax/net/ssl/SSLEngine;)Ljava/lang/String;\"/>\n\t\t<method name=\"chooseEngineServerAlias(Ljava/lang/String;[Ljava/security/Principal;Ljavax/net/ssl/SSLEngine;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/X509ExtendedTrustManager\" since=\"24\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/net/ssl/X509TrustManager\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"checkClientTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/net/Socket;)V\"/>\n\t\t<method name=\"checkClientTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljavax/net/ssl/SSLEngine;)V\"/>\n\t\t<method name=\"checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/net/Socket;)V\"/>\n\t\t<method name=\"checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljavax/net/ssl/SSLEngine;)V\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/X509KeyManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/net/ssl/KeyManager\"/>\n\t\t<method name=\"chooseClientAlias([Ljava/lang/String;[Ljava/security/Principal;Ljava/net/Socket;)Ljava/lang/String;\"/>\n\t\t<method name=\"chooseServerAlias(Ljava/lang/String;[Ljava/security/Principal;Ljava/net/Socket;)Ljava/lang/String;\"/>\n\t\t<method name=\"getCertificateChain(Ljava/lang/String;)[Ljava/security/cert/X509Certificate;\"/>\n\t\t<method name=\"getClientAliases(Ljava/lang/String;[Ljava/security/Principal;)[Ljava/lang/String;\"/>\n\t\t<method name=\"getPrivateKey(Ljava/lang/String;)Ljava/security/PrivateKey;\"/>\n\t\t<method name=\"getServerAliases(Ljava/lang/String;[Ljava/security/Principal;)[Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"javax/net/ssl/X509TrustManager\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/net/ssl/TrustManager\"/>\n\t\t<method name=\"checkClientTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V\"/>\n\t\t<method name=\"checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getAcceptedIssuers()[Ljava/security/cert/X509Certificate;\"/>\n\t</class>\n\t<class name=\"javax/security/auth/AuthPermission\" since=\"1\">\n\t\t<extends name=\"java/security/BasicPermission\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/security/auth/DestroyFailedException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/security/auth/Destroyable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"destroy()V\"/>\n\t\t<method name=\"isDestroyed()Z\"/>\n\t</class>\n\t<class name=\"javax/security/auth/PrivateCredentialPermission\" since=\"1\">\n\t\t<extends name=\"java/security/Permission\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getCredentialClass()Ljava/lang/String;\"/>\n\t\t<method name=\"getPrincipals()[[Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"javax/security/auth/Subject\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(ZLjava/util/Set;Ljava/util/Set;Ljava/util/Set;)V\"/>\n\t\t<method name=\"doAs(Ljavax/security/auth/Subject;Ljava/security/PrivilegedAction;)Ljava/lang/Object;\"/>\n\t\t<method name=\"doAs(Ljavax/security/auth/Subject;Ljava/security/PrivilegedExceptionAction;)Ljava/lang/Object;\"/>\n\t\t<method name=\"doAsPrivileged(Ljavax/security/auth/Subject;Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;\"/>\n\t\t<method name=\"doAsPrivileged(Ljavax/security/auth/Subject;Ljava/security/PrivilegedExceptionAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getPrincipals()Ljava/util/Set;\"/>\n\t\t<method name=\"getPrincipals(Ljava/lang/Class;)Ljava/util/Set;\"/>\n\t\t<method name=\"getPrivateCredentials()Ljava/util/Set;\"/>\n\t\t<method name=\"getPrivateCredentials(Ljava/lang/Class;)Ljava/util/Set;\"/>\n\t\t<method name=\"getPublicCredentials()Ljava/util/Set;\"/>\n\t\t<method name=\"getPublicCredentials(Ljava/lang/Class;)Ljava/util/Set;\"/>\n\t\t<method name=\"getSubject(Ljava/security/AccessControlContext;)Ljavax/security/auth/Subject;\"/>\n\t\t<method name=\"isReadOnly()Z\"/>\n\t\t<method name=\"setReadOnly()V\"/>\n\t</class>\n\t<class name=\"javax/security/auth/SubjectDomainCombiner\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/DomainCombiner\"/>\n\t\t<method name=\"&lt;init>(Ljavax/security/auth/Subject;)V\"/>\n\t\t<method name=\"getSubject()Ljavax/security/auth/Subject;\"/>\n\t</class>\n\t<class name=\"javax/security/auth/callback/Callback\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t</class>\n\t<class name=\"javax/security/auth/callback/CallbackHandler\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"handle([Ljavax/security/auth/callback/Callback;)V\"/>\n\t</class>\n\t<class name=\"javax/security/auth/callback/PasswordCallback\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"javax/security/auth/callback/Callback\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"clearPassword()V\"/>\n\t\t<method name=\"getPassword()[C\"/>\n\t\t<method name=\"getPrompt()Ljava/lang/String;\"/>\n\t\t<method name=\"isEchoOn()Z\"/>\n\t\t<method name=\"setPassword([C)V\"/>\n\t</class>\n\t<class name=\"javax/security/auth/callback/UnsupportedCallbackException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>(Ljavax/security/auth/callback/Callback;)V\"/>\n\t\t<method name=\"&lt;init>(Ljavax/security/auth/callback/Callback;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getCallback()Ljavax/security/auth/callback/Callback;\"/>\n\t</class>\n\t<class name=\"javax/security/auth/login/LoginException\" since=\"1\">\n\t\t<extends name=\"java/security/GeneralSecurityException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/security/auth/x500/X500Principal\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/security/Principal\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/util/Map;)V\" since=\"9\"/>\n\t\t<method name=\"&lt;init>([B)V\"/>\n\t\t<method name=\"getEncoded()[B\"/>\n\t\t<method name=\"getName(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getName(Ljava/lang/String;Ljava/util/Map;)Ljava/lang/String;\" since=\"9\"/>\n\t\t<field name=\"CANONICAL\"/>\n\t\t<field name=\"RFC1779\"/>\n\t\t<field name=\"RFC2253\"/>\n\t</class>\n\t<class name=\"javax/security/cert/Certificate\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getEncoded()[B\"/>\n\t\t<method name=\"getPublicKey()Ljava/security/PublicKey;\"/>\n\t\t<method name=\"verify(Ljava/security/PublicKey;)V\"/>\n\t\t<method name=\"verify(Ljava/security/PublicKey;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/security/cert/CertificateEncodingException\" since=\"1\">\n\t\t<extends name=\"javax/security/cert/CertificateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/security/cert/CertificateException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/security/cert/CertificateExpiredException\" since=\"1\">\n\t\t<extends name=\"javax/security/cert/CertificateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/security/cert/CertificateNotYetValidException\" since=\"1\">\n\t\t<extends name=\"javax/security/cert/CertificateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/security/cert/CertificateParsingException\" since=\"1\">\n\t\t<extends name=\"javax/security/cert/CertificateException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/security/cert/X509Certificate\" since=\"1\">\n\t\t<extends name=\"javax/security/cert/Certificate\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"checkValidity()V\"/>\n\t\t<method name=\"checkValidity(Ljava/util/Date;)V\"/>\n\t\t<method name=\"getInstance(Ljava/io/InputStream;)Ljavax/security/cert/X509Certificate;\"/>\n\t\t<method name=\"getInstance([B)Ljavax/security/cert/X509Certificate;\"/>\n\t\t<method name=\"getIssuerDN()Ljava/security/Principal;\"/>\n\t\t<method name=\"getNotAfter()Ljava/util/Date;\"/>\n\t\t<method name=\"getNotBefore()Ljava/util/Date;\"/>\n\t\t<method name=\"getSerialNumber()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getSigAlgName()Ljava/lang/String;\"/>\n\t\t<method name=\"getSigAlgOID()Ljava/lang/String;\"/>\n\t\t<method name=\"getSigAlgParams()[B\"/>\n\t\t<method name=\"getSubjectDN()Ljava/security/Principal;\"/>\n\t\t<method name=\"getVersion()I\"/>\n\t</class>\n\t<class name=\"javax/sql/CommonDataSource\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getLogWriter()Ljava/io/PrintWriter;\"/>\n\t\t<method name=\"getLoginTimeout()I\"/>\n\t\t<method name=\"getParentLogger()Ljava/util/logging/Logger;\" since=\"24\"/>\n\t\t<method name=\"setLogWriter(Ljava/io/PrintWriter;)V\"/>\n\t\t<method name=\"setLoginTimeout(I)V\"/>\n\t</class>\n\t<class name=\"javax/sql/ConnectionEvent\" since=\"1\">\n\t\t<extends name=\"java/util/EventObject\"/>\n\t\t<method name=\"&lt;init>(Ljavax/sql/PooledConnection;)V\"/>\n\t\t<method name=\"&lt;init>(Ljavax/sql/PooledConnection;Ljava/sql/SQLException;)V\"/>\n\t\t<method name=\"getSQLException()Ljava/sql/SQLException;\"/>\n\t</class>\n\t<class name=\"javax/sql/ConnectionEventListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/EventListener\"/>\n\t\t<method name=\"connectionClosed(Ljavax/sql/ConnectionEvent;)V\"/>\n\t\t<method name=\"connectionErrorOccurred(Ljavax/sql/ConnectionEvent;)V\"/>\n\t</class>\n\t<class name=\"javax/sql/ConnectionPoolDataSource\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/sql/CommonDataSource\" since=\"9\"/>\n\t\t<method name=\"getLogWriter()Ljava/io/PrintWriter;\" removed=\"9\"/>\n\t\t<method name=\"getLoginTimeout()I\" removed=\"9\"/>\n\t\t<method name=\"getPooledConnection()Ljavax/sql/PooledConnection;\"/>\n\t\t<method name=\"getPooledConnection(Ljava/lang/String;Ljava/lang/String;)Ljavax/sql/PooledConnection;\"/>\n\t\t<method name=\"setLogWriter(Ljava/io/PrintWriter;)V\" removed=\"9\"/>\n\t\t<method name=\"setLoginTimeout(I)V\" removed=\"9\"/>\n\t</class>\n\t<class name=\"javax/sql/DataSource\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/sql/Wrapper\" since=\"9\"/>\n\t\t<implements name=\"javax/sql/CommonDataSource\" since=\"9\"/>\n\t\t<method name=\"getConnection()Ljava/sql/Connection;\"/>\n\t\t<method name=\"getConnection(Ljava/lang/String;Ljava/lang/String;)Ljava/sql/Connection;\"/>\n\t\t<method name=\"getLogWriter()Ljava/io/PrintWriter;\" removed=\"9\"/>\n\t\t<method name=\"getLoginTimeout()I\" removed=\"9\"/>\n\t\t<method name=\"setLogWriter(Ljava/io/PrintWriter;)V\" removed=\"9\"/>\n\t\t<method name=\"setLoginTimeout(I)V\" removed=\"9\"/>\n\t</class>\n\t<class name=\"javax/sql/PooledConnection\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addConnectionEventListener(Ljavax/sql/ConnectionEventListener;)V\"/>\n\t\t<method name=\"addStatementEventListener(Ljavax/sql/StatementEventListener;)V\" since=\"9\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"getConnection()Ljava/sql/Connection;\"/>\n\t\t<method name=\"removeConnectionEventListener(Ljavax/sql/ConnectionEventListener;)V\"/>\n\t\t<method name=\"removeStatementEventListener(Ljavax/sql/StatementEventListener;)V\" since=\"9\"/>\n\t</class>\n\t<class name=\"javax/sql/RowSet\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/sql/ResultSet\"/>\n\t\t<method name=\"addRowSetListener(Ljavax/sql/RowSetListener;)V\"/>\n\t\t<method name=\"clearParameters()V\"/>\n\t\t<method name=\"execute()V\"/>\n\t\t<method name=\"getCommand()Ljava/lang/String;\"/>\n\t\t<method name=\"getDataSourceName()Ljava/lang/String;\"/>\n\t\t<method name=\"getEscapeProcessing()Z\"/>\n\t\t<method name=\"getMaxFieldSize()I\"/>\n\t\t<method name=\"getMaxRows()I\"/>\n\t\t<method name=\"getPassword()Ljava/lang/String;\"/>\n\t\t<method name=\"getQueryTimeout()I\"/>\n\t\t<method name=\"getTransactionIsolation()I\"/>\n\t\t<method name=\"getTypeMap()Ljava/util/Map;\"/>\n\t\t<method name=\"getUrl()Ljava/lang/String;\"/>\n\t\t<method name=\"getUsername()Ljava/lang/String;\"/>\n\t\t<method name=\"isReadOnly()Z\"/>\n\t\t<method name=\"removeRowSetListener(Ljavax/sql/RowSetListener;)V\"/>\n\t\t<method name=\"setArray(ILjava/sql/Array;)V\"/>\n\t\t<method name=\"setAsciiStream(ILjava/io/InputStream;)V\" since=\"9\"/>\n\t\t<method name=\"setAsciiStream(ILjava/io/InputStream;I)V\"/>\n\t\t<method name=\"setAsciiStream(Ljava/lang/String;Ljava/io/InputStream;)V\" since=\"9\"/>\n\t\t<method name=\"setAsciiStream(Ljava/lang/String;Ljava/io/InputStream;I)V\" since=\"9\"/>\n\t\t<method name=\"setBigDecimal(ILjava/math/BigDecimal;)V\"/>\n\t\t<method name=\"setBigDecimal(Ljava/lang/String;Ljava/math/BigDecimal;)V\" since=\"9\"/>\n\t\t<method name=\"setBinaryStream(ILjava/io/InputStream;)V\" since=\"9\"/>\n\t\t<method name=\"setBinaryStream(ILjava/io/InputStream;I)V\"/>\n\t\t<method name=\"setBinaryStream(Ljava/lang/String;Ljava/io/InputStream;)V\" since=\"9\"/>\n\t\t<method name=\"setBinaryStream(Ljava/lang/String;Ljava/io/InputStream;I)V\" since=\"9\"/>\n\t\t<method name=\"setBlob(ILjava/io/InputStream;)V\" since=\"9\"/>\n\t\t<method name=\"setBlob(ILjava/io/InputStream;J)V\" since=\"9\"/>\n\t\t<method name=\"setBlob(ILjava/sql/Blob;)V\"/>\n\t\t<method name=\"setBlob(Ljava/lang/String;Ljava/io/InputStream;)V\" since=\"9\"/>\n\t\t<method name=\"setBlob(Ljava/lang/String;Ljava/io/InputStream;J)V\" since=\"9\"/>\n\t\t<method name=\"setBlob(Ljava/lang/String;Ljava/sql/Blob;)V\" since=\"9\"/>\n\t\t<method name=\"setBoolean(IZ)V\"/>\n\t\t<method name=\"setBoolean(Ljava/lang/String;Z)V\" since=\"9\"/>\n\t\t<method name=\"setByte(IB)V\"/>\n\t\t<method name=\"setByte(Ljava/lang/String;B)V\" since=\"9\"/>\n\t\t<method name=\"setBytes(I[B)V\"/>\n\t\t<method name=\"setBytes(Ljava/lang/String;[B)V\" since=\"9\"/>\n\t\t<method name=\"setCharacterStream(ILjava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"setCharacterStream(ILjava/io/Reader;I)V\"/>\n\t\t<method name=\"setCharacterStream(Ljava/lang/String;Ljava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"setCharacterStream(Ljava/lang/String;Ljava/io/Reader;I)V\" since=\"9\"/>\n\t\t<method name=\"setClob(ILjava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"setClob(ILjava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"setClob(ILjava/sql/Clob;)V\"/>\n\t\t<method name=\"setClob(Ljava/lang/String;Ljava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"setClob(Ljava/lang/String;Ljava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"setClob(Ljava/lang/String;Ljava/sql/Clob;)V\" since=\"9\"/>\n\t\t<method name=\"setCommand(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setConcurrency(I)V\"/>\n\t\t<method name=\"setDataSourceName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setDate(ILjava/sql/Date;)V\"/>\n\t\t<method name=\"setDate(ILjava/sql/Date;Ljava/util/Calendar;)V\"/>\n\t\t<method name=\"setDate(Ljava/lang/String;Ljava/sql/Date;)V\" since=\"9\"/>\n\t\t<method name=\"setDate(Ljava/lang/String;Ljava/sql/Date;Ljava/util/Calendar;)V\" since=\"9\"/>\n\t\t<method name=\"setDouble(ID)V\"/>\n\t\t<method name=\"setDouble(Ljava/lang/String;D)V\" since=\"9\"/>\n\t\t<method name=\"setEscapeProcessing(Z)V\"/>\n\t\t<method name=\"setFloat(IF)V\"/>\n\t\t<method name=\"setFloat(Ljava/lang/String;F)V\" since=\"9\"/>\n\t\t<method name=\"setInt(II)V\"/>\n\t\t<method name=\"setInt(Ljava/lang/String;I)V\" since=\"9\"/>\n\t\t<method name=\"setLong(IJ)V\"/>\n\t\t<method name=\"setLong(Ljava/lang/String;J)V\" since=\"9\"/>\n\t\t<method name=\"setMaxFieldSize(I)V\"/>\n\t\t<method name=\"setMaxRows(I)V\"/>\n\t\t<method name=\"setNCharacterStream(ILjava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"setNCharacterStream(ILjava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"setNCharacterStream(Ljava/lang/String;Ljava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"setNCharacterStream(Ljava/lang/String;Ljava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"setNClob(ILjava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"setNClob(ILjava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"setNClob(ILjava/sql/NClob;)V\" since=\"9\"/>\n\t\t<method name=\"setNClob(Ljava/lang/String;Ljava/io/Reader;)V\" since=\"9\"/>\n\t\t<method name=\"setNClob(Ljava/lang/String;Ljava/io/Reader;J)V\" since=\"9\"/>\n\t\t<method name=\"setNClob(Ljava/lang/String;Ljava/sql/NClob;)V\" since=\"9\"/>\n\t\t<method name=\"setNString(ILjava/lang/String;)V\" since=\"9\"/>\n\t\t<method name=\"setNString(Ljava/lang/String;Ljava/lang/String;)V\" since=\"9\"/>\n\t\t<method name=\"setNull(II)V\"/>\n\t\t<method name=\"setNull(IILjava/lang/String;)V\"/>\n\t\t<method name=\"setNull(Ljava/lang/String;I)V\" since=\"9\"/>\n\t\t<method name=\"setNull(Ljava/lang/String;ILjava/lang/String;)V\" since=\"9\"/>\n\t\t<method name=\"setObject(ILjava/lang/Object;)V\"/>\n\t\t<method name=\"setObject(ILjava/lang/Object;I)V\"/>\n\t\t<method name=\"setObject(ILjava/lang/Object;II)V\"/>\n\t\t<method name=\"setObject(Ljava/lang/String;Ljava/lang/Object;)V\" since=\"9\"/>\n\t\t<method name=\"setObject(Ljava/lang/String;Ljava/lang/Object;I)V\" since=\"9\"/>\n\t\t<method name=\"setObject(Ljava/lang/String;Ljava/lang/Object;II)V\" since=\"9\"/>\n\t\t<method name=\"setPassword(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setQueryTimeout(I)V\"/>\n\t\t<method name=\"setReadOnly(Z)V\"/>\n\t\t<method name=\"setRef(ILjava/sql/Ref;)V\"/>\n\t\t<method name=\"setRowId(ILjava/sql/RowId;)V\" since=\"9\"/>\n\t\t<method name=\"setRowId(Ljava/lang/String;Ljava/sql/RowId;)V\" since=\"9\"/>\n\t\t<method name=\"setSQLXML(ILjava/sql/SQLXML;)V\" since=\"9\"/>\n\t\t<method name=\"setSQLXML(Ljava/lang/String;Ljava/sql/SQLXML;)V\" since=\"9\"/>\n\t\t<method name=\"setShort(IS)V\"/>\n\t\t<method name=\"setShort(Ljava/lang/String;S)V\" since=\"9\"/>\n\t\t<method name=\"setString(ILjava/lang/String;)V\"/>\n\t\t<method name=\"setString(Ljava/lang/String;Ljava/lang/String;)V\" since=\"9\"/>\n\t\t<method name=\"setTime(ILjava/sql/Time;)V\"/>\n\t\t<method name=\"setTime(ILjava/sql/Time;Ljava/util/Calendar;)V\"/>\n\t\t<method name=\"setTime(Ljava/lang/String;Ljava/sql/Time;)V\" since=\"9\"/>\n\t\t<method name=\"setTime(Ljava/lang/String;Ljava/sql/Time;Ljava/util/Calendar;)V\" since=\"9\"/>\n\t\t<method name=\"setTimestamp(ILjava/sql/Timestamp;)V\"/>\n\t\t<method name=\"setTimestamp(ILjava/sql/Timestamp;Ljava/util/Calendar;)V\"/>\n\t\t<method name=\"setTimestamp(Ljava/lang/String;Ljava/sql/Timestamp;)V\" since=\"9\"/>\n\t\t<method name=\"setTimestamp(Ljava/lang/String;Ljava/sql/Timestamp;Ljava/util/Calendar;)V\" since=\"9\"/>\n\t\t<method name=\"setTransactionIsolation(I)V\"/>\n\t\t<method name=\"setType(I)V\"/>\n\t\t<method name=\"setTypeMap(Ljava/util/Map;)V\"/>\n\t\t<method name=\"setURL(ILjava/net/URL;)V\" since=\"9\"/>\n\t\t<method name=\"setUrl(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setUsername(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/sql/RowSetEvent\" since=\"1\">\n\t\t<extends name=\"java/util/EventObject\"/>\n\t\t<method name=\"&lt;init>(Ljavax/sql/RowSet;)V\"/>\n\t</class>\n\t<class name=\"javax/sql/RowSetInternal\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getConnection()Ljava/sql/Connection;\"/>\n\t\t<method name=\"getOriginal()Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getOriginalRow()Ljava/sql/ResultSet;\"/>\n\t\t<method name=\"getParams()[Ljava/lang/Object;\"/>\n\t\t<method name=\"setMetaData(Ljavax/sql/RowSetMetaData;)V\"/>\n\t</class>\n\t<class name=\"javax/sql/RowSetListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/EventListener\"/>\n\t\t<method name=\"cursorMoved(Ljavax/sql/RowSetEvent;)V\"/>\n\t\t<method name=\"rowChanged(Ljavax/sql/RowSetEvent;)V\"/>\n\t\t<method name=\"rowSetChanged(Ljavax/sql/RowSetEvent;)V\"/>\n\t</class>\n\t<class name=\"javax/sql/RowSetMetaData\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/sql/ResultSetMetaData\"/>\n\t\t<method name=\"setAutoIncrement(IZ)V\"/>\n\t\t<method name=\"setCaseSensitive(IZ)V\"/>\n\t\t<method name=\"setCatalogName(ILjava/lang/String;)V\"/>\n\t\t<method name=\"setColumnCount(I)V\"/>\n\t\t<method name=\"setColumnDisplaySize(II)V\"/>\n\t\t<method name=\"setColumnLabel(ILjava/lang/String;)V\"/>\n\t\t<method name=\"setColumnName(ILjava/lang/String;)V\"/>\n\t\t<method name=\"setColumnType(II)V\"/>\n\t\t<method name=\"setColumnTypeName(ILjava/lang/String;)V\"/>\n\t\t<method name=\"setCurrency(IZ)V\"/>\n\t\t<method name=\"setNullable(II)V\"/>\n\t\t<method name=\"setPrecision(II)V\"/>\n\t\t<method name=\"setScale(II)V\"/>\n\t\t<method name=\"setSchemaName(ILjava/lang/String;)V\"/>\n\t\t<method name=\"setSearchable(IZ)V\"/>\n\t\t<method name=\"setSigned(IZ)V\"/>\n\t\t<method name=\"setTableName(ILjava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/sql/RowSetReader\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"readData(Ljavax/sql/RowSetInternal;)V\"/>\n\t</class>\n\t<class name=\"javax/sql/RowSetWriter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"writeData(Ljavax/sql/RowSetInternal;)Z\"/>\n\t</class>\n\t<class name=\"javax/sql/StatementEvent\" since=\"9\">\n\t\t<extends name=\"java/util/EventObject\"/>\n\t\t<method name=\"&lt;init>(Ljavax/sql/PooledConnection;Ljava/sql/PreparedStatement;)V\"/>\n\t\t<method name=\"&lt;init>(Ljavax/sql/PooledConnection;Ljava/sql/PreparedStatement;Ljava/sql/SQLException;)V\"/>\n\t\t<method name=\"getSQLException()Ljava/sql/SQLException;\"/>\n\t\t<method name=\"getStatement()Ljava/sql/PreparedStatement;\"/>\n\t</class>\n\t<class name=\"javax/sql/StatementEventListener\" since=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/EventListener\"/>\n\t\t<method name=\"statementClosed(Ljavax/sql/StatementEvent;)V\"/>\n\t\t<method name=\"statementErrorOccurred(Ljavax/sql/StatementEvent;)V\"/>\n\t</class>\n\t<class name=\"javax/xml/XMLConstants\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\" removed=\"8\"/>\n\t\t<field name=\"DEFAULT_NS_PREFIX\"/>\n\t\t<field name=\"FEATURE_SECURE_PROCESSING\"/>\n\t\t<field name=\"NULL_NS_URI\"/>\n\t\t<field name=\"RELAXNG_NS_URI\"/>\n\t\t<field name=\"W3C_XML_SCHEMA_INSTANCE_NS_URI\"/>\n\t\t<field name=\"W3C_XML_SCHEMA_NS_URI\"/>\n\t\t<field name=\"W3C_XPATH_DATATYPE_NS_URI\"/>\n\t\t<field name=\"XMLNS_ATTRIBUTE\"/>\n\t\t<field name=\"XMLNS_ATTRIBUTE_NS_URI\"/>\n\t\t<field name=\"XML_DTD_NS_URI\"/>\n\t\t<field name=\"XML_NS_PREFIX\"/>\n\t\t<field name=\"XML_NS_URI\"/>\n\t</class>\n\t<class name=\"javax/xml/datatype/DatatypeConfigurationException\" since=\"8\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"javax/xml/datatype/DatatypeConstants\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"APRIL\"/>\n\t\t<field name=\"AUGUST\"/>\n\t\t<field name=\"DATE\"/>\n\t\t<field name=\"DATETIME\"/>\n\t\t<field name=\"DAYS\"/>\n\t\t<field name=\"DECEMBER\"/>\n\t\t<field name=\"DURATION\"/>\n\t\t<field name=\"DURATION_DAYTIME\"/>\n\t\t<field name=\"DURATION_YEARMONTH\"/>\n\t\t<field name=\"EQUAL\"/>\n\t\t<field name=\"FEBRUARY\"/>\n\t\t<field name=\"FIELD_UNDEFINED\"/>\n\t\t<field name=\"GDAY\"/>\n\t\t<field name=\"GMONTH\"/>\n\t\t<field name=\"GMONTHDAY\"/>\n\t\t<field name=\"GREATER\"/>\n\t\t<field name=\"GYEAR\"/>\n\t\t<field name=\"GYEARMONTH\"/>\n\t\t<field name=\"HOURS\"/>\n\t\t<field name=\"INDETERMINATE\"/>\n\t\t<field name=\"JANUARY\"/>\n\t\t<field name=\"JULY\"/>\n\t\t<field name=\"JUNE\"/>\n\t\t<field name=\"LESSER\"/>\n\t\t<field name=\"MARCH\"/>\n\t\t<field name=\"MAX_TIMEZONE_OFFSET\"/>\n\t\t<field name=\"MAY\"/>\n\t\t<field name=\"MINUTES\"/>\n\t\t<field name=\"MIN_TIMEZONE_OFFSET\"/>\n\t\t<field name=\"MONTHS\"/>\n\t\t<field name=\"NOVEMBER\"/>\n\t\t<field name=\"OCTOBER\"/>\n\t\t<field name=\"SECONDS\"/>\n\t\t<field name=\"SEPTEMBER\"/>\n\t\t<field name=\"TIME\"/>\n\t\t<field name=\"YEARS\"/>\n\t</class>\n\t<class name=\"javax/xml/datatype/DatatypeConstants$Field\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getId()I\"/>\n\t</class>\n\t<class name=\"javax/xml/datatype/DatatypeFactory\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"newDuration(J)Ljavax/xml/datatype/Duration;\"/>\n\t\t<method name=\"newDuration(Ljava/lang/String;)Ljavax/xml/datatype/Duration;\"/>\n\t\t<method name=\"newDuration(ZIIIIII)Ljavax/xml/datatype/Duration;\"/>\n\t\t<method name=\"newDuration(ZLjava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigDecimal;)Ljavax/xml/datatype/Duration;\"/>\n\t\t<method name=\"newDurationDayTime(J)Ljavax/xml/datatype/Duration;\"/>\n\t\t<method name=\"newDurationDayTime(Ljava/lang/String;)Ljavax/xml/datatype/Duration;\"/>\n\t\t<method name=\"newDurationDayTime(ZIIII)Ljavax/xml/datatype/Duration;\"/>\n\t\t<method name=\"newDurationDayTime(ZLjava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljavax/xml/datatype/Duration;\"/>\n\t\t<method name=\"newDurationYearMonth(J)Ljavax/xml/datatype/Duration;\"/>\n\t\t<method name=\"newDurationYearMonth(Ljava/lang/String;)Ljavax/xml/datatype/Duration;\"/>\n\t\t<method name=\"newDurationYearMonth(ZII)Ljavax/xml/datatype/Duration;\"/>\n\t\t<method name=\"newDurationYearMonth(ZLjava/math/BigInteger;Ljava/math/BigInteger;)Ljavax/xml/datatype/Duration;\"/>\n\t\t<method name=\"newInstance()Ljavax/xml/datatype/DatatypeFactory;\"/>\n\t\t<method name=\"newInstance(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljavax/xml/datatype/DatatypeFactory;\" since=\"9\"/>\n\t\t<method name=\"newXMLGregorianCalendar()Ljavax/xml/datatype/XMLGregorianCalendar;\"/>\n\t\t<method name=\"newXMLGregorianCalendar(IIIIIIII)Ljavax/xml/datatype/XMLGregorianCalendar;\"/>\n\t\t<method name=\"newXMLGregorianCalendar(Ljava/lang/String;)Ljavax/xml/datatype/XMLGregorianCalendar;\"/>\n\t\t<method name=\"newXMLGregorianCalendar(Ljava/math/BigInteger;IIIIILjava/math/BigDecimal;I)Ljavax/xml/datatype/XMLGregorianCalendar;\"/>\n\t\t<method name=\"newXMLGregorianCalendar(Ljava/util/GregorianCalendar;)Ljavax/xml/datatype/XMLGregorianCalendar;\"/>\n\t\t<method name=\"newXMLGregorianCalendarDate(IIII)Ljavax/xml/datatype/XMLGregorianCalendar;\"/>\n\t\t<method name=\"newXMLGregorianCalendarTime(IIII)Ljavax/xml/datatype/XMLGregorianCalendar;\"/>\n\t\t<method name=\"newXMLGregorianCalendarTime(IIIII)Ljavax/xml/datatype/XMLGregorianCalendar;\"/>\n\t\t<method name=\"newXMLGregorianCalendarTime(IIILjava/math/BigDecimal;I)Ljavax/xml/datatype/XMLGregorianCalendar;\"/>\n\t\t<field name=\"DATATYPEFACTORY_IMPLEMENTATION_CLASS\"/>\n\t\t<field name=\"DATATYPEFACTORY_PROPERTY\"/>\n\t</class>\n\t<class name=\"javax/xml/datatype/Duration\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"add(Ljavax/xml/datatype/Duration;)Ljavax/xml/datatype/Duration;\"/>\n\t\t<method name=\"addTo(Ljava/util/Calendar;)V\"/>\n\t\t<method name=\"addTo(Ljava/util/Date;)V\"/>\n\t\t<method name=\"compare(Ljavax/xml/datatype/Duration;)I\"/>\n\t\t<method name=\"getDays()I\"/>\n\t\t<method name=\"getField(Ljavax/xml/datatype/DatatypeConstants$Field;)Ljava/lang/Number;\"/>\n\t\t<method name=\"getHours()I\"/>\n\t\t<method name=\"getMinutes()I\"/>\n\t\t<method name=\"getMonths()I\"/>\n\t\t<method name=\"getSeconds()I\"/>\n\t\t<method name=\"getSign()I\"/>\n\t\t<method name=\"getTimeInMillis(Ljava/util/Calendar;)J\"/>\n\t\t<method name=\"getTimeInMillis(Ljava/util/Date;)J\"/>\n\t\t<method name=\"getXMLSchemaType()Ljavax/xml/namespace/QName;\"/>\n\t\t<method name=\"getYears()I\"/>\n\t\t<method name=\"isLongerThan(Ljavax/xml/datatype/Duration;)Z\"/>\n\t\t<method name=\"isSet(Ljavax/xml/datatype/DatatypeConstants$Field;)Z\"/>\n\t\t<method name=\"isShorterThan(Ljavax/xml/datatype/Duration;)Z\"/>\n\t\t<method name=\"multiply(I)Ljavax/xml/datatype/Duration;\"/>\n\t\t<method name=\"multiply(Ljava/math/BigDecimal;)Ljavax/xml/datatype/Duration;\"/>\n\t\t<method name=\"negate()Ljavax/xml/datatype/Duration;\"/>\n\t\t<method name=\"normalizeWith(Ljava/util/Calendar;)Ljavax/xml/datatype/Duration;\"/>\n\t\t<method name=\"subtract(Ljavax/xml/datatype/Duration;)Ljavax/xml/datatype/Duration;\"/>\n\t</class>\n\t<class name=\"javax/xml/datatype/XMLGregorianCalendar\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"add(Ljavax/xml/datatype/Duration;)V\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"compare(Ljavax/xml/datatype/XMLGregorianCalendar;)I\"/>\n\t\t<method name=\"getDay()I\"/>\n\t\t<method name=\"getEon()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getEonAndYear()Ljava/math/BigInteger;\"/>\n\t\t<method name=\"getFractionalSecond()Ljava/math/BigDecimal;\"/>\n\t\t<method name=\"getHour()I\"/>\n\t\t<method name=\"getMillisecond()I\"/>\n\t\t<method name=\"getMinute()I\"/>\n\t\t<method name=\"getMonth()I\"/>\n\t\t<method name=\"getSecond()I\"/>\n\t\t<method name=\"getTimeZone(I)Ljava/util/TimeZone;\"/>\n\t\t<method name=\"getTimezone()I\"/>\n\t\t<method name=\"getXMLSchemaType()Ljavax/xml/namespace/QName;\"/>\n\t\t<method name=\"getYear()I\"/>\n\t\t<method name=\"isValid()Z\"/>\n\t\t<method name=\"normalize()Ljavax/xml/datatype/XMLGregorianCalendar;\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"setDay(I)V\"/>\n\t\t<method name=\"setFractionalSecond(Ljava/math/BigDecimal;)V\"/>\n\t\t<method name=\"setHour(I)V\"/>\n\t\t<method name=\"setMillisecond(I)V\"/>\n\t\t<method name=\"setMinute(I)V\"/>\n\t\t<method name=\"setMonth(I)V\"/>\n\t\t<method name=\"setSecond(I)V\"/>\n\t\t<method name=\"setTime(III)V\"/>\n\t\t<method name=\"setTime(IIII)V\"/>\n\t\t<method name=\"setTime(IIILjava/math/BigDecimal;)V\"/>\n\t\t<method name=\"setTimezone(I)V\"/>\n\t\t<method name=\"setYear(I)V\"/>\n\t\t<method name=\"setYear(Ljava/math/BigInteger;)V\"/>\n\t\t<method name=\"toGregorianCalendar()Ljava/util/GregorianCalendar;\"/>\n\t\t<method name=\"toGregorianCalendar(Ljava/util/TimeZone;Ljava/util/Locale;Ljavax/xml/datatype/XMLGregorianCalendar;)Ljava/util/GregorianCalendar;\"/>\n\t\t<method name=\"toXMLFormat()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"javax/xml/namespace/NamespaceContext\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getNamespaceURI(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getPrefix(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getPrefixes(Ljava/lang/String;)Ljava/util/Iterator;\"/>\n\t</class>\n\t<class name=\"javax/xml/namespace/QName\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getLocalPart()Ljava/lang/String;\"/>\n\t\t<method name=\"getNamespaceURI()Ljava/lang/String;\"/>\n\t\t<method name=\"getPrefix()Ljava/lang/String;\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Ljavax/xml/namespace/QName;\"/>\n\t</class>\n\t<class name=\"javax/xml/parsers/DocumentBuilder\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getDOMImplementation()Lorg/w3c/dom/DOMImplementation;\"/>\n\t\t<method name=\"getSchema()Ljavax/xml/validation/Schema;\" since=\"8\"/>\n\t\t<method name=\"isNamespaceAware()Z\"/>\n\t\t<method name=\"isValidating()Z\"/>\n\t\t<method name=\"isXIncludeAware()Z\"/>\n\t\t<method name=\"newDocument()Lorg/w3c/dom/Document;\"/>\n\t\t<method name=\"parse(Ljava/io/File;)Lorg/w3c/dom/Document;\"/>\n\t\t<method name=\"parse(Ljava/io/InputStream;)Lorg/w3c/dom/Document;\"/>\n\t\t<method name=\"parse(Ljava/io/InputStream;Ljava/lang/String;)Lorg/w3c/dom/Document;\"/>\n\t\t<method name=\"parse(Ljava/lang/String;)Lorg/w3c/dom/Document;\"/>\n\t\t<method name=\"parse(Lorg/xml/sax/InputSource;)Lorg/w3c/dom/Document;\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"setEntityResolver(Lorg/xml/sax/EntityResolver;)V\"/>\n\t\t<method name=\"setErrorHandler(Lorg/xml/sax/ErrorHandler;)V\"/>\n\t</class>\n\t<class name=\"javax/xml/parsers/DocumentBuilderFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getAttribute(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getFeature(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"getSchema()Ljavax/xml/validation/Schema;\" since=\"8\"/>\n\t\t<method name=\"isCoalescing()Z\"/>\n\t\t<method name=\"isExpandEntityReferences()Z\"/>\n\t\t<method name=\"isIgnoringComments()Z\"/>\n\t\t<method name=\"isIgnoringElementContentWhitespace()Z\"/>\n\t\t<method name=\"isNamespaceAware()Z\"/>\n\t\t<method name=\"isValidating()Z\"/>\n\t\t<method name=\"isXIncludeAware()Z\"/>\n\t\t<method name=\"newDocumentBuilder()Ljavax/xml/parsers/DocumentBuilder;\"/>\n\t\t<method name=\"newInstance()Ljavax/xml/parsers/DocumentBuilderFactory;\"/>\n\t\t<method name=\"newInstance(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljavax/xml/parsers/DocumentBuilderFactory;\" since=\"9\"/>\n\t\t<method name=\"setAttribute(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"setCoalescing(Z)V\"/>\n\t\t<method name=\"setExpandEntityReferences(Z)V\"/>\n\t\t<method name=\"setFeature(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"setIgnoringComments(Z)V\"/>\n\t\t<method name=\"setIgnoringElementContentWhitespace(Z)V\"/>\n\t\t<method name=\"setNamespaceAware(Z)V\"/>\n\t\t<method name=\"setSchema(Ljavax/xml/validation/Schema;)V\" since=\"8\"/>\n\t\t<method name=\"setValidating(Z)V\"/>\n\t\t<method name=\"setXIncludeAware(Z)V\"/>\n\t</class>\n\t<class name=\"javax/xml/parsers/FactoryConfigurationError\" since=\"1\">\n\t\t<extends name=\"java/lang/Error\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Exception;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Exception;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getException()Ljava/lang/Exception;\"/>\n\t</class>\n\t<class name=\"javax/xml/parsers/ParserConfigurationException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/xml/parsers/SAXParser\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getParser()Lorg/xml/sax/Parser;\"/>\n\t\t<method name=\"getProperty(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getSchema()Ljavax/xml/validation/Schema;\" since=\"8\"/>\n\t\t<method name=\"getXMLReader()Lorg/xml/sax/XMLReader;\"/>\n\t\t<method name=\"isNamespaceAware()Z\"/>\n\t\t<method name=\"isValidating()Z\"/>\n\t\t<method name=\"isXIncludeAware()Z\"/>\n\t\t<method name=\"parse(Ljava/io/File;Lorg/xml/sax/HandlerBase;)V\"/>\n\t\t<method name=\"parse(Ljava/io/File;Lorg/xml/sax/helpers/DefaultHandler;)V\"/>\n\t\t<method name=\"parse(Ljava/io/InputStream;Lorg/xml/sax/HandlerBase;)V\"/>\n\t\t<method name=\"parse(Ljava/io/InputStream;Lorg/xml/sax/HandlerBase;Ljava/lang/String;)V\"/>\n\t\t<method name=\"parse(Ljava/io/InputStream;Lorg/xml/sax/helpers/DefaultHandler;)V\"/>\n\t\t<method name=\"parse(Ljava/io/InputStream;Lorg/xml/sax/helpers/DefaultHandler;Ljava/lang/String;)V\"/>\n\t\t<method name=\"parse(Ljava/lang/String;Lorg/xml/sax/HandlerBase;)V\"/>\n\t\t<method name=\"parse(Ljava/lang/String;Lorg/xml/sax/helpers/DefaultHandler;)V\"/>\n\t\t<method name=\"parse(Lorg/xml/sax/InputSource;Lorg/xml/sax/HandlerBase;)V\"/>\n\t\t<method name=\"parse(Lorg/xml/sax/InputSource;Lorg/xml/sax/helpers/DefaultHandler;)V\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"setProperty(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"javax/xml/parsers/SAXParserFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getFeature(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"getSchema()Ljavax/xml/validation/Schema;\" since=\"8\"/>\n\t\t<method name=\"isNamespaceAware()Z\"/>\n\t\t<method name=\"isValidating()Z\"/>\n\t\t<method name=\"isXIncludeAware()Z\"/>\n\t\t<method name=\"newInstance()Ljavax/xml/parsers/SAXParserFactory;\"/>\n\t\t<method name=\"newInstance(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljavax/xml/parsers/SAXParserFactory;\" since=\"9\"/>\n\t\t<method name=\"newSAXParser()Ljavax/xml/parsers/SAXParser;\"/>\n\t\t<method name=\"setFeature(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"setNamespaceAware(Z)V\"/>\n\t\t<method name=\"setSchema(Ljavax/xml/validation/Schema;)V\" since=\"8\"/>\n\t\t<method name=\"setValidating(Z)V\"/>\n\t\t<method name=\"setXIncludeAware(Z)V\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/ErrorListener\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"error(Ljavax/xml/transform/TransformerException;)V\"/>\n\t\t<method name=\"fatalError(Ljavax/xml/transform/TransformerException;)V\"/>\n\t\t<method name=\"warning(Ljavax/xml/transform/TransformerException;)V\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/OutputKeys\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CDATA_SECTION_ELEMENTS\"/>\n\t\t<field name=\"DOCTYPE_PUBLIC\"/>\n\t\t<field name=\"DOCTYPE_SYSTEM\"/>\n\t\t<field name=\"ENCODING\"/>\n\t\t<field name=\"INDENT\"/>\n\t\t<field name=\"MEDIA_TYPE\"/>\n\t\t<field name=\"METHOD\"/>\n\t\t<field name=\"OMIT_XML_DECLARATION\"/>\n\t\t<field name=\"STANDALONE\"/>\n\t\t<field name=\"VERSION\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/Result\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getSystemId()Ljava/lang/String;\"/>\n\t\t<method name=\"setSystemId(Ljava/lang/String;)V\"/>\n\t\t<field name=\"PI_DISABLE_OUTPUT_ESCAPING\"/>\n\t\t<field name=\"PI_ENABLE_OUTPUT_ESCAPING\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/Source\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getSystemId()Ljava/lang/String;\"/>\n\t\t<method name=\"setSystemId(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/SourceLocator\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getColumnNumber()I\"/>\n\t\t<method name=\"getLineNumber()I\"/>\n\t\t<method name=\"getPublicId()Ljava/lang/String;\"/>\n\t\t<method name=\"getSystemId()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/Templates\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getOutputProperties()Ljava/util/Properties;\"/>\n\t\t<method name=\"newTransformer()Ljavax/xml/transform/Transformer;\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/Transformer\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"clearParameters()V\"/>\n\t\t<method name=\"getErrorListener()Ljavax/xml/transform/ErrorListener;\"/>\n\t\t<method name=\"getOutputProperties()Ljava/util/Properties;\"/>\n\t\t<method name=\"getOutputProperty(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getParameter(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getURIResolver()Ljavax/xml/transform/URIResolver;\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"setErrorListener(Ljavax/xml/transform/ErrorListener;)V\"/>\n\t\t<method name=\"setOutputProperties(Ljava/util/Properties;)V\"/>\n\t\t<method name=\"setOutputProperty(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setParameter(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"setURIResolver(Ljavax/xml/transform/URIResolver;)V\"/>\n\t\t<method name=\"transform(Ljavax/xml/transform/Source;Ljavax/xml/transform/Result;)V\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/TransformerConfigurationException\" since=\"8\">\n\t\t<extends name=\"javax/xml/transform/TransformerException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljavax/xml/transform/SourceLocator;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljavax/xml/transform/SourceLocator;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/TransformerException\" since=\"8\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljavax/xml/transform/SourceLocator;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljavax/xml/transform/SourceLocator;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"getException()Ljava/lang/Throwable;\"/>\n\t\t<method name=\"getLocationAsString()Ljava/lang/String;\"/>\n\t\t<method name=\"getLocator()Ljavax/xml/transform/SourceLocator;\"/>\n\t\t<method name=\"getMessageAndLocation()Ljava/lang/String;\"/>\n\t\t<method name=\"setLocator(Ljavax/xml/transform/SourceLocator;)V\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/TransformerFactory\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getAssociatedStylesheet(Ljavax/xml/transform/Source;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljavax/xml/transform/Source;\"/>\n\t\t<method name=\"getAttribute(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getErrorListener()Ljavax/xml/transform/ErrorListener;\"/>\n\t\t<method name=\"getFeature(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"getURIResolver()Ljavax/xml/transform/URIResolver;\"/>\n\t\t<method name=\"newInstance()Ljavax/xml/transform/TransformerFactory;\"/>\n\t\t<method name=\"newInstance(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljavax/xml/transform/TransformerFactory;\" since=\"9\"/>\n\t\t<method name=\"newTemplates(Ljavax/xml/transform/Source;)Ljavax/xml/transform/Templates;\"/>\n\t\t<method name=\"newTransformer()Ljavax/xml/transform/Transformer;\"/>\n\t\t<method name=\"newTransformer(Ljavax/xml/transform/Source;)Ljavax/xml/transform/Transformer;\"/>\n\t\t<method name=\"setAttribute(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"setErrorListener(Ljavax/xml/transform/ErrorListener;)V\"/>\n\t\t<method name=\"setFeature(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"setURIResolver(Ljavax/xml/transform/URIResolver;)V\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/TransformerFactoryConfigurationError\" since=\"8\">\n\t\t<extends name=\"java/lang/Error\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Exception;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Exception;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getException()Ljava/lang/Exception;\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/URIResolver\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"resolve(Ljava/lang/String;Ljava/lang/String;)Ljavax/xml/transform/Source;\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/dom/DOMLocator\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/xml/transform/SourceLocator\"/>\n\t\t<method name=\"getOriginatingNode()Lorg/w3c/dom/Node;\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/dom/DOMResult\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/xml/transform/Result\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Lorg/w3c/dom/Node;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/w3c/dom/Node;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/w3c/dom/Node;Lorg/w3c/dom/Node;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/w3c/dom/Node;Lorg/w3c/dom/Node;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getNextSibling()Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"getNode()Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"setNextSibling(Lorg/w3c/dom/Node;)V\"/>\n\t\t<method name=\"setNode(Lorg/w3c/dom/Node;)V\"/>\n\t\t<field name=\"FEATURE\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/dom/DOMSource\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/xml/transform/Source\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Lorg/w3c/dom/Node;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/w3c/dom/Node;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getNode()Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"setNode(Lorg/w3c/dom/Node;)V\"/>\n\t\t<field name=\"FEATURE\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/sax/SAXResult\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/xml/transform/Result\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Lorg/xml/sax/ContentHandler;)V\"/>\n\t\t<method name=\"getHandler()Lorg/xml/sax/ContentHandler;\"/>\n\t\t<method name=\"getLexicalHandler()Lorg/xml/sax/ext/LexicalHandler;\"/>\n\t\t<method name=\"setHandler(Lorg/xml/sax/ContentHandler;)V\"/>\n\t\t<method name=\"setLexicalHandler(Lorg/xml/sax/ext/LexicalHandler;)V\"/>\n\t\t<field name=\"FEATURE\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/sax/SAXSource\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/xml/transform/Source\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Lorg/xml/sax/InputSource;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/xml/sax/XMLReader;Lorg/xml/sax/InputSource;)V\"/>\n\t\t<method name=\"getInputSource()Lorg/xml/sax/InputSource;\"/>\n\t\t<method name=\"getXMLReader()Lorg/xml/sax/XMLReader;\"/>\n\t\t<method name=\"setInputSource(Lorg/xml/sax/InputSource;)V\"/>\n\t\t<method name=\"setXMLReader(Lorg/xml/sax/XMLReader;)V\"/>\n\t\t<method name=\"sourceToInputSource(Ljavax/xml/transform/Source;)Lorg/xml/sax/InputSource;\"/>\n\t\t<field name=\"FEATURE\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/sax/SAXTransformerFactory\" since=\"8\">\n\t\t<extends name=\"javax/xml/transform/TransformerFactory\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"newTemplatesHandler()Ljavax/xml/transform/sax/TemplatesHandler;\"/>\n\t\t<method name=\"newTransformerHandler()Ljavax/xml/transform/sax/TransformerHandler;\"/>\n\t\t<method name=\"newTransformerHandler(Ljavax/xml/transform/Source;)Ljavax/xml/transform/sax/TransformerHandler;\"/>\n\t\t<method name=\"newTransformerHandler(Ljavax/xml/transform/Templates;)Ljavax/xml/transform/sax/TransformerHandler;\"/>\n\t\t<method name=\"newXMLFilter(Ljavax/xml/transform/Source;)Lorg/xml/sax/XMLFilter;\"/>\n\t\t<method name=\"newXMLFilter(Ljavax/xml/transform/Templates;)Lorg/xml/sax/XMLFilter;\"/>\n\t\t<field name=\"FEATURE\"/>\n\t\t<field name=\"FEATURE_XMLFILTER\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/sax/TemplatesHandler\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/xml/sax/ContentHandler\"/>\n\t\t<method name=\"getSystemId()Ljava/lang/String;\"/>\n\t\t<method name=\"getTemplates()Ljavax/xml/transform/Templates;\"/>\n\t\t<method name=\"setSystemId(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/sax/TransformerHandler\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/xml/sax/ContentHandler\"/>\n\t\t<implements name=\"org/xml/sax/DTDHandler\"/>\n\t\t<implements name=\"org/xml/sax/ext/LexicalHandler\"/>\n\t\t<method name=\"getSystemId()Ljava/lang/String;\"/>\n\t\t<method name=\"getTransformer()Ljavax/xml/transform/Transformer;\"/>\n\t\t<method name=\"setResult(Ljavax/xml/transform/Result;)V\"/>\n\t\t<method name=\"setSystemId(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/stream/StreamResult\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/xml/transform/Result\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Writer;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getOutputStream()Ljava/io/OutputStream;\"/>\n\t\t<method name=\"getWriter()Ljava/io/Writer;\"/>\n\t\t<method name=\"setOutputStream(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"setSystemId(Ljava/io/File;)V\"/>\n\t\t<method name=\"setWriter(Ljava/io/Writer;)V\"/>\n\t\t<field name=\"FEATURE\"/>\n\t</class>\n\t<class name=\"javax/xml/transform/stream/StreamSource\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/xml/transform/Source\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Reader;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Reader;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getInputStream()Ljava/io/InputStream;\"/>\n\t\t<method name=\"getPublicId()Ljava/lang/String;\"/>\n\t\t<method name=\"getReader()Ljava/io/Reader;\"/>\n\t\t<method name=\"setInputStream(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"setPublicId(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setReader(Ljava/io/Reader;)V\"/>\n\t\t<method name=\"setSystemId(Ljava/io/File;)V\"/>\n\t\t<field name=\"FEATURE\"/>\n\t</class>\n\t<class name=\"javax/xml/validation/Schema\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"newValidator()Ljavax/xml/validation/Validator;\"/>\n\t\t<method name=\"newValidatorHandler()Ljavax/xml/validation/ValidatorHandler;\"/>\n\t</class>\n\t<class name=\"javax/xml/validation/SchemaFactory\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getErrorHandler()Lorg/xml/sax/ErrorHandler;\"/>\n\t\t<method name=\"getFeature(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"getProperty(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getResourceResolver()Lorg/w3c/dom/ls/LSResourceResolver;\"/>\n\t\t<method name=\"isSchemaLanguageSupported(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"newInstance(Ljava/lang/String;)Ljavax/xml/validation/SchemaFactory;\"/>\n\t\t<method name=\"newInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)Ljavax/xml/validation/SchemaFactory;\" since=\"9\"/>\n\t\t<method name=\"newSchema()Ljavax/xml/validation/Schema;\"/>\n\t\t<method name=\"newSchema(Ljava/io/File;)Ljavax/xml/validation/Schema;\"/>\n\t\t<method name=\"newSchema(Ljava/net/URL;)Ljavax/xml/validation/Schema;\"/>\n\t\t<method name=\"newSchema(Ljavax/xml/transform/Source;)Ljavax/xml/validation/Schema;\"/>\n\t\t<method name=\"newSchema([Ljavax/xml/transform/Source;)Ljavax/xml/validation/Schema;\"/>\n\t\t<method name=\"setErrorHandler(Lorg/xml/sax/ErrorHandler;)V\"/>\n\t\t<method name=\"setFeature(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"setProperty(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"setResourceResolver(Lorg/w3c/dom/ls/LSResourceResolver;)V\"/>\n\t</class>\n\t<class name=\"javax/xml/validation/SchemaFactoryLoader\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"newFactory(Ljava/lang/String;)Ljavax/xml/validation/SchemaFactory;\"/>\n\t</class>\n\t<class name=\"javax/xml/validation/TypeInfoProvider\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getAttributeTypeInfo(I)Lorg/w3c/dom/TypeInfo;\"/>\n\t\t<method name=\"getElementTypeInfo()Lorg/w3c/dom/TypeInfo;\"/>\n\t\t<method name=\"isIdAttribute(I)Z\"/>\n\t\t<method name=\"isSpecified(I)Z\"/>\n\t</class>\n\t<class name=\"javax/xml/validation/Validator\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getErrorHandler()Lorg/xml/sax/ErrorHandler;\"/>\n\t\t<method name=\"getFeature(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"getProperty(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getResourceResolver()Lorg/w3c/dom/ls/LSResourceResolver;\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"setErrorHandler(Lorg/xml/sax/ErrorHandler;)V\"/>\n\t\t<method name=\"setFeature(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"setProperty(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"setResourceResolver(Lorg/w3c/dom/ls/LSResourceResolver;)V\"/>\n\t\t<method name=\"validate(Ljavax/xml/transform/Source;)V\"/>\n\t\t<method name=\"validate(Ljavax/xml/transform/Source;Ljavax/xml/transform/Result;)V\"/>\n\t</class>\n\t<class name=\"javax/xml/validation/ValidatorHandler\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/xml/sax/ContentHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getContentHandler()Lorg/xml/sax/ContentHandler;\"/>\n\t\t<method name=\"getErrorHandler()Lorg/xml/sax/ErrorHandler;\"/>\n\t\t<method name=\"getFeature(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"getProperty(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getResourceResolver()Lorg/w3c/dom/ls/LSResourceResolver;\"/>\n\t\t<method name=\"getTypeInfoProvider()Ljavax/xml/validation/TypeInfoProvider;\"/>\n\t\t<method name=\"setContentHandler(Lorg/xml/sax/ContentHandler;)V\"/>\n\t\t<method name=\"setErrorHandler(Lorg/xml/sax/ErrorHandler;)V\"/>\n\t\t<method name=\"setFeature(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"setProperty(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"setResourceResolver(Lorg/w3c/dom/ls/LSResourceResolver;)V\"/>\n\t</class>\n\t<class name=\"javax/xml/xpath/XPath\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"compile(Ljava/lang/String;)Ljavax/xml/xpath/XPathExpression;\"/>\n\t\t<method name=\"evaluate(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;\"/>\n\t\t<method name=\"evaluate(Ljava/lang/String;Ljava/lang/Object;Ljavax/xml/namespace/QName;)Ljava/lang/Object;\"/>\n\t\t<method name=\"evaluate(Ljava/lang/String;Lorg/xml/sax/InputSource;)Ljava/lang/String;\"/>\n\t\t<method name=\"evaluate(Ljava/lang/String;Lorg/xml/sax/InputSource;Ljavax/xml/namespace/QName;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getNamespaceContext()Ljavax/xml/namespace/NamespaceContext;\"/>\n\t\t<method name=\"getXPathFunctionResolver()Ljavax/xml/xpath/XPathFunctionResolver;\"/>\n\t\t<method name=\"getXPathVariableResolver()Ljavax/xml/xpath/XPathVariableResolver;\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"setNamespaceContext(Ljavax/xml/namespace/NamespaceContext;)V\"/>\n\t\t<method name=\"setXPathFunctionResolver(Ljavax/xml/xpath/XPathFunctionResolver;)V\"/>\n\t\t<method name=\"setXPathVariableResolver(Ljavax/xml/xpath/XPathVariableResolver;)V\"/>\n\t</class>\n\t<class name=\"javax/xml/xpath/XPathConstants\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"BOOLEAN\"/>\n\t\t<field name=\"DOM_OBJECT_MODEL\"/>\n\t\t<field name=\"NODE\"/>\n\t\t<field name=\"NODESET\"/>\n\t\t<field name=\"NUMBER\"/>\n\t\t<field name=\"STRING\"/>\n\t</class>\n\t<class name=\"javax/xml/xpath/XPathException\" since=\"8\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"javax/xml/xpath/XPathExpression\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"evaluate(Ljava/lang/Object;)Ljava/lang/String;\"/>\n\t\t<method name=\"evaluate(Ljava/lang/Object;Ljavax/xml/namespace/QName;)Ljava/lang/Object;\"/>\n\t\t<method name=\"evaluate(Lorg/xml/sax/InputSource;)Ljava/lang/String;\"/>\n\t\t<method name=\"evaluate(Lorg/xml/sax/InputSource;Ljavax/xml/namespace/QName;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"javax/xml/xpath/XPathExpressionException\" since=\"8\">\n\t\t<extends name=\"javax/xml/xpath/XPathException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"javax/xml/xpath/XPathFactory\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getFeature(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isObjectModelSupported(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"newInstance()Ljavax/xml/xpath/XPathFactory;\"/>\n\t\t<method name=\"newInstance(Ljava/lang/String;)Ljavax/xml/xpath/XPathFactory;\"/>\n\t\t<method name=\"newInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)Ljavax/xml/xpath/XPathFactory;\"/>\n\t\t<method name=\"newXPath()Ljavax/xml/xpath/XPath;\"/>\n\t\t<method name=\"setFeature(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"setXPathFunctionResolver(Ljavax/xml/xpath/XPathFunctionResolver;)V\"/>\n\t\t<method name=\"setXPathVariableResolver(Ljavax/xml/xpath/XPathVariableResolver;)V\"/>\n\t\t<field name=\"DEFAULT_OBJECT_MODEL_URI\"/>\n\t\t<field name=\"DEFAULT_PROPERTY_NAME\"/>\n\t</class>\n\t<class name=\"javax/xml/xpath/XPathFactoryConfigurationException\" since=\"8\">\n\t\t<extends name=\"javax/xml/xpath/XPathException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"javax/xml/xpath/XPathFunction\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"evaluate(Ljava/util/List;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"javax/xml/xpath/XPathFunctionException\" since=\"8\">\n\t\t<extends name=\"javax/xml/xpath/XPathExpressionException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"javax/xml/xpath/XPathFunctionResolver\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"resolveFunction(Ljavax/xml/namespace/QName;I)Ljavax/xml/xpath/XPathFunction;\"/>\n\t</class>\n\t<class name=\"javax/xml/xpath/XPathVariableResolver\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"resolveVariable(Ljavax/xml/namespace/QName;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"junit/framework/Assert\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"assertEquals(BB)V\"/>\n\t\t<method name=\"assertEquals(CC)V\"/>\n\t\t<method name=\"assertEquals(DDD)V\"/>\n\t\t<method name=\"assertEquals(FFF)V\"/>\n\t\t<method name=\"assertEquals(II)V\"/>\n\t\t<method name=\"assertEquals(JJ)V\"/>\n\t\t<method name=\"assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"assertEquals(Ljava/lang/String;BB)V\"/>\n\t\t<method name=\"assertEquals(Ljava/lang/String;CC)V\"/>\n\t\t<method name=\"assertEquals(Ljava/lang/String;DDD)V\"/>\n\t\t<method name=\"assertEquals(Ljava/lang/String;FFF)V\"/>\n\t\t<method name=\"assertEquals(Ljava/lang/String;II)V\"/>\n\t\t<method name=\"assertEquals(Ljava/lang/String;JJ)V\"/>\n\t\t<method name=\"assertEquals(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"assertEquals(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"assertEquals(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"assertEquals(Ljava/lang/String;SS)V\"/>\n\t\t<method name=\"assertEquals(Ljava/lang/String;ZZ)V\"/>\n\t\t<method name=\"assertEquals(SS)V\"/>\n\t\t<method name=\"assertEquals(ZZ)V\"/>\n\t\t<method name=\"assertFalse(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"assertFalse(Z)V\"/>\n\t\t<method name=\"assertNotNull(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"assertNotNull(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"assertNotSame(Ljava/lang/Object;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"assertNotSame(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"assertNull(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"assertNull(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"assertSame(Ljava/lang/Object;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"assertSame(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"assertTrue(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"assertTrue(Z)V\"/>\n\t\t<method name=\"fail()V\"/>\n\t\t<method name=\"fail(Ljava/lang/String;)V\"/>\n\t\t<method name=\"failNotEquals(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V\" since=\"16\"/>\n\t\t<method name=\"failNotSame(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V\" since=\"16\"/>\n\t\t<method name=\"failSame(Ljava/lang/String;)V\" since=\"16\"/>\n\t\t<method name=\"format(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/String;\" since=\"16\"/>\n\t</class>\n\t<class name=\"junit/framework/AssertionFailedError\" since=\"1\">\n\t\t<extends name=\"java/lang/AssertionError\" since=\"16\"/>\n\t\t<extends name=\"java/lang/Error\" removed=\"16\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"junit/framework/ComparisonFailure\" since=\"1\">\n\t\t<extends name=\"junit/framework/AssertionFailedError\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getActual()Ljava/lang/String;\" since=\"16\"/>\n\t\t<method name=\"getExpected()Ljava/lang/String;\" since=\"16\"/>\n\t</class>\n\t<class name=\"junit/framework/Protectable\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"protect()V\"/>\n\t</class>\n\t<class name=\"junit/framework/Test\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"countTestCases()I\"/>\n\t\t<method name=\"run(Ljunit/framework/TestResult;)V\"/>\n\t</class>\n\t<class name=\"junit/framework/TestCase\" since=\"1\">\n\t\t<extends name=\"junit/framework/Assert\"/>\n\t\t<implements name=\"junit/framework/Test\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"createResult()Ljunit/framework/TestResult;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"run()Ljunit/framework/TestResult;\"/>\n\t\t<method name=\"runBare()V\"/>\n\t\t<method name=\"runTest()V\"/>\n\t\t<method name=\"setName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setUp()V\"/>\n\t\t<method name=\"tearDown()V\"/>\n\t</class>\n\t<class name=\"junit/framework/TestFailure\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljunit/framework/Test;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"exceptionMessage()Ljava/lang/String;\"/>\n\t\t<method name=\"failedTest()Ljunit/framework/Test;\"/>\n\t\t<method name=\"isFailure()Z\"/>\n\t\t<method name=\"thrownException()Ljava/lang/Throwable;\"/>\n\t\t<method name=\"trace()Ljava/lang/String;\"/>\n\t\t<field name=\"fFailedTest\"/>\n\t\t<field name=\"fThrownException\"/>\n\t</class>\n\t<class name=\"junit/framework/TestListener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addError(Ljunit/framework/Test;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"addFailure(Ljunit/framework/Test;Ljunit/framework/AssertionFailedError;)V\"/>\n\t\t<method name=\"endTest(Ljunit/framework/Test;)V\"/>\n\t\t<method name=\"startTest(Ljunit/framework/Test;)V\"/>\n\t</class>\n\t<class name=\"junit/framework/TestResult\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addError(Ljunit/framework/Test;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"addFailure(Ljunit/framework/Test;Ljunit/framework/AssertionFailedError;)V\"/>\n\t\t<method name=\"addListener(Ljunit/framework/TestListener;)V\"/>\n\t\t<method name=\"endTest(Ljunit/framework/Test;)V\"/>\n\t\t<method name=\"errorCount()I\"/>\n\t\t<method name=\"errors()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"failureCount()I\"/>\n\t\t<method name=\"failures()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"removeListener(Ljunit/framework/TestListener;)V\"/>\n\t\t<method name=\"run(Ljunit/framework/TestCase;)V\"/>\n\t\t<method name=\"runCount()I\"/>\n\t\t<method name=\"runProtected(Ljunit/framework/Test;Ljunit/framework/Protectable;)V\"/>\n\t\t<method name=\"shouldStop()Z\"/>\n\t\t<method name=\"startTest(Ljunit/framework/Test;)V\"/>\n\t\t<method name=\"stop()V\"/>\n\t\t<method name=\"wasSuccessful()Z\"/>\n\t\t<field name=\"fErrors\"/>\n\t\t<field name=\"fFailures\"/>\n\t\t<field name=\"fListeners\"/>\n\t\t<field name=\"fRunTests\"/>\n\t</class>\n\t<class name=\"junit/framework/TestSuite\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"junit/framework/Test\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Class;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Class;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>([Ljava/lang/Class;)V\" since=\"16\"/>\n\t\t<method name=\"&lt;init>([Ljava/lang/Class;Ljava/lang/String;)V\" since=\"16\"/>\n\t\t<method name=\"addTest(Ljunit/framework/Test;)V\"/>\n\t\t<method name=\"addTestSuite(Ljava/lang/Class;)V\"/>\n\t\t<method name=\"createTest(Ljava/lang/Class;Ljava/lang/String;)Ljunit/framework/Test;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getTestConstructor(Ljava/lang/Class;)Ljava/lang/reflect/Constructor;\"/>\n\t\t<method name=\"runTest(Ljunit/framework/Test;Ljunit/framework/TestResult;)V\"/>\n\t\t<method name=\"setName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"testAt(I)Ljunit/framework/Test;\"/>\n\t\t<method name=\"testCount()I\"/>\n\t\t<method name=\"tests()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"warning(Ljava/lang/String;)Ljunit/framework/Test;\" since=\"16\"/>\n\t</class>\n\t<class name=\"junit/runner/BaseTestRunner\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"junit/framework/TestListener\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"clearStatus()V\"/>\n\t\t<method name=\"elapsedTimeAsString(J)Ljava/lang/String;\"/>\n\t\t<method name=\"extractClassName(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getFilteredTrace(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getFilteredTrace(Ljava/lang/Throwable;)Ljava/lang/String;\"/>\n\t\t<method name=\"getLoader()Ljunit/runner/TestSuiteLoader;\" deprecated=\"16\"/>\n\t\t<method name=\"getPreference(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getPreference(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"getPreferences()Ljava/util/Properties;\"/>\n\t\t<method name=\"getTest(Ljava/lang/String;)Ljunit/framework/Test;\"/>\n\t\t<method name=\"inVAJava()Z\" deprecated=\"16\"/>\n\t\t<method name=\"loadSuiteClass(Ljava/lang/String;)Ljava/lang/Class;\"/>\n\t\t<method name=\"processArguments([Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"runFailed(Ljava/lang/String;)V\"/>\n\t\t<method name=\"savePreferences()V\"/>\n\t\t<method name=\"setLoading(Z)V\"/>\n\t\t<method name=\"setPreference(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setPreferences(Ljava/util/Properties;)V\"/>\n\t\t<method name=\"showStackRaw()Z\"/>\n\t\t<method name=\"testEnded(Ljava/lang/String;)V\"/>\n\t\t<method name=\"testFailed(ILjunit/framework/Test;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"testStarted(Ljava/lang/String;)V\"/>\n\t\t<method name=\"truncate(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"useReloadingTestSuiteLoader()Z\"/>\n\t\t<field name=\"SUITE_METHODNAME\"/>\n\t</class>\n\t<class name=\"junit/runner/TestSuiteLoader\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"load(Ljava/lang/String;)Ljava/lang/Class;\"/>\n\t\t<method name=\"reload(Ljava/lang/Class;)Ljava/lang/Class;\"/>\n\t</class>\n\t<class name=\"junit/runner/Version\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"id()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/apache/commons/logging/Log\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"debug(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"debug(Ljava/lang/Object;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"error(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"error(Ljava/lang/Object;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"fatal(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"fatal(Ljava/lang/Object;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"info(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"info(Ljava/lang/Object;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"isDebugEnabled()Z\"/>\n\t\t<method name=\"isErrorEnabled()Z\"/>\n\t\t<method name=\"isFatalEnabled()Z\"/>\n\t\t<method name=\"isInfoEnabled()Z\"/>\n\t\t<method name=\"isTraceEnabled()Z\"/>\n\t\t<method name=\"isWarnEnabled()Z\"/>\n\t\t<method name=\"trace(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"trace(Ljava/lang/Object;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"warn(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"warn(Ljava/lang/Object;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/ConnectionClosedException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/ConnectionReuseStrategy\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"keepAlive(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)Z\"/>\n\t</class>\n\t<class name=\"org/apache/http/FormattedHeader\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/Header\"/>\n\t\t<method name=\"getBuffer()Lorg/apache/http/util/CharArrayBuffer;\"/>\n\t\t<method name=\"getValuePos()I\"/>\n\t</class>\n\t<class name=\"org/apache/http/Header\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getElements()[Lorg/apache/http/HeaderElement;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getValue()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/apache/http/HeaderElement\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getParameter(I)Lorg/apache/http/NameValuePair;\"/>\n\t\t<method name=\"getParameterByName(Ljava/lang/String;)Lorg/apache/http/NameValuePair;\"/>\n\t\t<method name=\"getParameterCount()I\"/>\n\t\t<method name=\"getParameters()[Lorg/apache/http/NameValuePair;\"/>\n\t\t<method name=\"getValue()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/apache/http/HeaderElementIterator\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Iterator\"/>\n\t\t<method name=\"nextElement()Lorg/apache/http/HeaderElement;\"/>\n\t</class>\n\t<class name=\"org/apache/http/HeaderIterator\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Iterator\"/>\n\t\t<method name=\"nextHeader()Lorg/apache/http/Header;\"/>\n\t</class>\n\t<class name=\"org/apache/http/HttpClientConnection\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpConnection\"/>\n\t\t<method name=\"flush()V\"/>\n\t\t<method name=\"isResponseAvailable(I)Z\"/>\n\t\t<method name=\"receiveResponseEntity(Lorg/apache/http/HttpResponse;)V\"/>\n\t\t<method name=\"receiveResponseHeader()Lorg/apache/http/HttpResponse;\"/>\n\t\t<method name=\"sendRequestEntity(Lorg/apache/http/HttpEntityEnclosingRequest;)V\"/>\n\t\t<method name=\"sendRequestHeader(Lorg/apache/http/HttpRequest;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/HttpConnection\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"getMetrics()Lorg/apache/http/HttpConnectionMetrics;\"/>\n\t\t<method name=\"getSocketTimeout()I\"/>\n\t\t<method name=\"isOpen()Z\"/>\n\t\t<method name=\"isStale()Z\"/>\n\t\t<method name=\"setSocketTimeout(I)V\"/>\n\t\t<method name=\"shutdown()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/HttpConnectionMetrics\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getMetric(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getReceivedBytesCount()J\"/>\n\t\t<method name=\"getRequestCount()J\"/>\n\t\t<method name=\"getResponseCount()J\"/>\n\t\t<method name=\"getSentBytesCount()J\"/>\n\t\t<method name=\"reset()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/HttpEntity\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"consumeContent()V\"/>\n\t\t<method name=\"getContent()Ljava/io/InputStream;\"/>\n\t\t<method name=\"getContentEncoding()Lorg/apache/http/Header;\"/>\n\t\t<method name=\"getContentLength()J\"/>\n\t\t<method name=\"getContentType()Lorg/apache/http/Header;\"/>\n\t\t<method name=\"isChunked()Z\"/>\n\t\t<method name=\"isRepeatable()Z\"/>\n\t\t<method name=\"isStreaming()Z\"/>\n\t\t<method name=\"writeTo(Ljava/io/OutputStream;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/HttpEntityEnclosingRequest\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpRequest\"/>\n\t\t<method name=\"expectContinue()Z\"/>\n\t\t<method name=\"getEntity()Lorg/apache/http/HttpEntity;\"/>\n\t\t<method name=\"setEntity(Lorg/apache/http/HttpEntity;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/HttpException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/HttpHost\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;ILjava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/HttpHost;)V\"/>\n\t\t<method name=\"getHostName()Ljava/lang/String;\"/>\n\t\t<method name=\"getPort()I\"/>\n\t\t<method name=\"getSchemeName()Ljava/lang/String;\"/>\n\t\t<method name=\"toHostString()Ljava/lang/String;\"/>\n\t\t<method name=\"toURI()Ljava/lang/String;\"/>\n\t\t<field name=\"DEFAULT_SCHEME_NAME\"/>\n\t\t<field name=\"hostname\"/>\n\t\t<field name=\"lcHostname\"/>\n\t\t<field name=\"port\"/>\n\t\t<field name=\"schemeName\"/>\n\t</class>\n\t<class name=\"org/apache/http/HttpInetConnection\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpConnection\"/>\n\t\t<method name=\"getLocalAddress()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getLocalPort()I\"/>\n\t\t<method name=\"getRemoteAddress()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getRemotePort()I\"/>\n\t</class>\n\t<class name=\"org/apache/http/HttpMessage\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addHeader(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"addHeader(Lorg/apache/http/Header;)V\"/>\n\t\t<method name=\"containsHeader(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"getAllHeaders()[Lorg/apache/http/Header;\"/>\n\t\t<method name=\"getFirstHeader(Ljava/lang/String;)Lorg/apache/http/Header;\"/>\n\t\t<method name=\"getHeaders(Ljava/lang/String;)[Lorg/apache/http/Header;\"/>\n\t\t<method name=\"getLastHeader(Ljava/lang/String;)Lorg/apache/http/Header;\"/>\n\t\t<method name=\"getParams()Lorg/apache/http/params/HttpParams;\"/>\n\t\t<method name=\"getProtocolVersion()Lorg/apache/http/ProtocolVersion;\"/>\n\t\t<method name=\"headerIterator()Lorg/apache/http/HeaderIterator;\"/>\n\t\t<method name=\"headerIterator(Ljava/lang/String;)Lorg/apache/http/HeaderIterator;\"/>\n\t\t<method name=\"removeHeader(Lorg/apache/http/Header;)V\"/>\n\t\t<method name=\"removeHeaders(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setHeader(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setHeader(Lorg/apache/http/Header;)V\"/>\n\t\t<method name=\"setHeaders([Lorg/apache/http/Header;)V\"/>\n\t\t<method name=\"setParams(Lorg/apache/http/params/HttpParams;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/HttpRequest\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpMessage\"/>\n\t\t<method name=\"getRequestLine()Lorg/apache/http/RequestLine;\"/>\n\t</class>\n\t<class name=\"org/apache/http/HttpRequestFactory\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"newHttpRequest(Ljava/lang/String;Ljava/lang/String;)Lorg/apache/http/HttpRequest;\"/>\n\t\t<method name=\"newHttpRequest(Lorg/apache/http/RequestLine;)Lorg/apache/http/HttpRequest;\"/>\n\t</class>\n\t<class name=\"org/apache/http/HttpRequestInterceptor\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"process(Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/HttpResponse\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpMessage\"/>\n\t\t<method name=\"getEntity()Lorg/apache/http/HttpEntity;\"/>\n\t\t<method name=\"getLocale()Ljava/util/Locale;\"/>\n\t\t<method name=\"getStatusLine()Lorg/apache/http/StatusLine;\"/>\n\t\t<method name=\"setEntity(Lorg/apache/http/HttpEntity;)V\"/>\n\t\t<method name=\"setLocale(Ljava/util/Locale;)V\"/>\n\t\t<method name=\"setReasonPhrase(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setStatusCode(I)V\"/>\n\t\t<method name=\"setStatusLine(Lorg/apache/http/ProtocolVersion;I)V\"/>\n\t\t<method name=\"setStatusLine(Lorg/apache/http/ProtocolVersion;ILjava/lang/String;)V\"/>\n\t\t<method name=\"setStatusLine(Lorg/apache/http/StatusLine;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/HttpResponseFactory\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"newHttpResponse(Lorg/apache/http/ProtocolVersion;ILorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;\"/>\n\t\t<method name=\"newHttpResponse(Lorg/apache/http/StatusLine;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;\"/>\n\t</class>\n\t<class name=\"org/apache/http/HttpResponseInterceptor\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"process(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/HttpServerConnection\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpConnection\"/>\n\t\t<method name=\"flush()V\"/>\n\t\t<method name=\"receiveRequestEntity(Lorg/apache/http/HttpEntityEnclosingRequest;)V\"/>\n\t\t<method name=\"receiveRequestHeader()Lorg/apache/http/HttpRequest;\"/>\n\t\t<method name=\"sendResponseEntity(Lorg/apache/http/HttpResponse;)V\"/>\n\t\t<method name=\"sendResponseHeader(Lorg/apache/http/HttpResponse;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/HttpStatus\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"SC_ACCEPTED\"/>\n\t\t<field name=\"SC_BAD_GATEWAY\"/>\n\t\t<field name=\"SC_BAD_REQUEST\"/>\n\t\t<field name=\"SC_CONFLICT\"/>\n\t\t<field name=\"SC_CONTINUE\"/>\n\t\t<field name=\"SC_CREATED\"/>\n\t\t<field name=\"SC_EXPECTATION_FAILED\"/>\n\t\t<field name=\"SC_FAILED_DEPENDENCY\"/>\n\t\t<field name=\"SC_FORBIDDEN\"/>\n\t\t<field name=\"SC_GATEWAY_TIMEOUT\"/>\n\t\t<field name=\"SC_GONE\"/>\n\t\t<field name=\"SC_HTTP_VERSION_NOT_SUPPORTED\"/>\n\t\t<field name=\"SC_INSUFFICIENT_SPACE_ON_RESOURCE\"/>\n\t\t<field name=\"SC_INSUFFICIENT_STORAGE\"/>\n\t\t<field name=\"SC_INTERNAL_SERVER_ERROR\"/>\n\t\t<field name=\"SC_LENGTH_REQUIRED\"/>\n\t\t<field name=\"SC_LOCKED\"/>\n\t\t<field name=\"SC_METHOD_FAILURE\"/>\n\t\t<field name=\"SC_METHOD_NOT_ALLOWED\"/>\n\t\t<field name=\"SC_MOVED_PERMANENTLY\"/>\n\t\t<field name=\"SC_MOVED_TEMPORARILY\"/>\n\t\t<field name=\"SC_MULTIPLE_CHOICES\"/>\n\t\t<field name=\"SC_MULTI_STATUS\"/>\n\t\t<field name=\"SC_NON_AUTHORITATIVE_INFORMATION\"/>\n\t\t<field name=\"SC_NOT_ACCEPTABLE\"/>\n\t\t<field name=\"SC_NOT_FOUND\"/>\n\t\t<field name=\"SC_NOT_IMPLEMENTED\"/>\n\t\t<field name=\"SC_NOT_MODIFIED\"/>\n\t\t<field name=\"SC_NO_CONTENT\"/>\n\t\t<field name=\"SC_OK\"/>\n\t\t<field name=\"SC_PARTIAL_CONTENT\"/>\n\t\t<field name=\"SC_PAYMENT_REQUIRED\"/>\n\t\t<field name=\"SC_PRECONDITION_FAILED\"/>\n\t\t<field name=\"SC_PROCESSING\"/>\n\t\t<field name=\"SC_PROXY_AUTHENTICATION_REQUIRED\"/>\n\t\t<field name=\"SC_REQUESTED_RANGE_NOT_SATISFIABLE\"/>\n\t\t<field name=\"SC_REQUEST_TIMEOUT\"/>\n\t\t<field name=\"SC_REQUEST_TOO_LONG\"/>\n\t\t<field name=\"SC_REQUEST_URI_TOO_LONG\"/>\n\t\t<field name=\"SC_RESET_CONTENT\"/>\n\t\t<field name=\"SC_SEE_OTHER\"/>\n\t\t<field name=\"SC_SERVICE_UNAVAILABLE\"/>\n\t\t<field name=\"SC_SWITCHING_PROTOCOLS\"/>\n\t\t<field name=\"SC_TEMPORARY_REDIRECT\"/>\n\t\t<field name=\"SC_UNAUTHORIZED\"/>\n\t\t<field name=\"SC_UNPROCESSABLE_ENTITY\"/>\n\t\t<field name=\"SC_UNSUPPORTED_MEDIA_TYPE\"/>\n\t\t<field name=\"SC_USE_PROXY\"/>\n\t</class>\n\t<class name=\"org/apache/http/HttpVersion\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/ProtocolVersion\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<field name=\"HTTP\"/>\n\t\t<field name=\"HTTP_0_9\"/>\n\t\t<field name=\"HTTP_1_0\"/>\n\t\t<field name=\"HTTP_1_1\"/>\n\t</class>\n\t<class name=\"org/apache/http/MalformedChunkCodingException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/MethodNotSupportedException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/HttpException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/NameValuePair\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getValue()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/apache/http/NoHttpResponseException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/ParseException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/ProtocolException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/HttpException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/ProtocolVersion\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;II)V\"/>\n\t\t<method name=\"compareToVersion(Lorg/apache/http/ProtocolVersion;)I\"/>\n\t\t<method name=\"forVersion(II)Lorg/apache/http/ProtocolVersion;\"/>\n\t\t<method name=\"getMajor()I\"/>\n\t\t<method name=\"getMinor()I\"/>\n\t\t<method name=\"getProtocol()Ljava/lang/String;\"/>\n\t\t<method name=\"greaterEquals(Lorg/apache/http/ProtocolVersion;)Z\"/>\n\t\t<method name=\"isComparable(Lorg/apache/http/ProtocolVersion;)Z\"/>\n\t\t<method name=\"lessEquals(Lorg/apache/http/ProtocolVersion;)Z\"/>\n\t\t<field name=\"major\"/>\n\t\t<field name=\"minor\"/>\n\t\t<field name=\"protocol\"/>\n\t</class>\n\t<class name=\"org/apache/http/ReasonPhraseCatalog\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getReason(ILjava/util/Locale;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/apache/http/RequestLine\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getMethod()Ljava/lang/String;\"/>\n\t\t<method name=\"getProtocolVersion()Lorg/apache/http/ProtocolVersion;\"/>\n\t\t<method name=\"getUri()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/apache/http/StatusLine\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getProtocolVersion()Lorg/apache/http/ProtocolVersion;\"/>\n\t\t<method name=\"getReasonPhrase()Ljava/lang/String;\"/>\n\t\t<method name=\"getStatusCode()I\"/>\n\t</class>\n\t<class name=\"org/apache/http/TokenIterator\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/util/Iterator\"/>\n\t\t<method name=\"nextToken()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/apache/http/UnsupportedHttpVersionException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/ProtocolException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/auth/AUTH\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"PROXY_AUTH\"/>\n\t\t<field name=\"PROXY_AUTH_RESP\"/>\n\t\t<field name=\"WWW_AUTH\"/>\n\t\t<field name=\"WWW_AUTH_RESP\"/>\n\t</class>\n\t<class name=\"org/apache/http/auth/AuthScheme\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"authenticate(Lorg/apache/http/auth/Credentials;Lorg/apache/http/HttpRequest;)Lorg/apache/http/Header;\"/>\n\t\t<method name=\"getParameter(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getRealm()Ljava/lang/String;\"/>\n\t\t<method name=\"getSchemeName()Ljava/lang/String;\"/>\n\t\t<method name=\"isComplete()Z\"/>\n\t\t<method name=\"isConnectionBased()Z\"/>\n\t\t<method name=\"processChallenge(Lorg/apache/http/Header;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/auth/AuthSchemeFactory\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"newInstance(Lorg/apache/http/params/HttpParams;)Lorg/apache/http/auth/AuthScheme;\"/>\n\t</class>\n\t<class name=\"org/apache/http/auth/AuthSchemeRegistry\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getAuthScheme(Ljava/lang/String;Lorg/apache/http/params/HttpParams;)Lorg/apache/http/auth/AuthScheme;\"/>\n\t\t<method name=\"getSchemeNames()Ljava/util/List;\"/>\n\t\t<method name=\"register(Ljava/lang/String;Lorg/apache/http/auth/AuthSchemeFactory;)V\"/>\n\t\t<method name=\"setItems(Ljava/util/Map;)V\"/>\n\t\t<method name=\"unregister(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/auth/AuthScope\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;I)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;ILjava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/auth/AuthScope;)V\"/>\n\t\t<method name=\"getHost()Ljava/lang/String;\"/>\n\t\t<method name=\"getPort()I\"/>\n\t\t<method name=\"getRealm()Ljava/lang/String;\"/>\n\t\t<method name=\"getScheme()Ljava/lang/String;\"/>\n\t\t<method name=\"match(Lorg/apache/http/auth/AuthScope;)I\"/>\n\t\t<field name=\"ANY\"/>\n\t\t<field name=\"ANY_HOST\"/>\n\t\t<field name=\"ANY_PORT\"/>\n\t\t<field name=\"ANY_REALM\"/>\n\t\t<field name=\"ANY_SCHEME\"/>\n\t</class>\n\t<class name=\"org/apache/http/auth/AuthState\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getAuthScheme()Lorg/apache/http/auth/AuthScheme;\"/>\n\t\t<method name=\"getAuthScope()Lorg/apache/http/auth/AuthScope;\"/>\n\t\t<method name=\"getCredentials()Lorg/apache/http/auth/Credentials;\"/>\n\t\t<method name=\"invalidate()V\"/>\n\t\t<method name=\"isValid()Z\"/>\n\t\t<method name=\"setAuthScheme(Lorg/apache/http/auth/AuthScheme;)V\"/>\n\t\t<method name=\"setAuthScope(Lorg/apache/http/auth/AuthScope;)V\"/>\n\t\t<method name=\"setCredentials(Lorg/apache/http/auth/Credentials;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/auth/AuthenticationException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/ProtocolException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/auth/BasicUserPrincipal\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/Principal\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/auth/Credentials\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getPassword()Ljava/lang/String;\"/>\n\t\t<method name=\"getUserPrincipal()Ljava/security/Principal;\"/>\n\t</class>\n\t<class name=\"org/apache/http/auth/InvalidCredentialsException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/auth/AuthenticationException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/auth/MalformedChallengeException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/ProtocolException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/auth/NTCredentials\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/auth/Credentials\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getDomain()Ljava/lang/String;\"/>\n\t\t<method name=\"getUserName()Ljava/lang/String;\"/>\n\t\t<method name=\"getWorkstation()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/apache/http/auth/NTUserPrincipal\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/security/Principal\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getDomain()Ljava/lang/String;\"/>\n\t\t<method name=\"getUsername()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/apache/http/auth/UsernamePasswordCredentials\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/auth/Credentials\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getUserName()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/apache/http/auth/params/AuthPNames\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CREDENTIAL_CHARSET\"/>\n\t</class>\n\t<class name=\"org/apache/http/auth/params/AuthParamBean\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/params/HttpAbstractParamBean\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"setCredentialCharset(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/auth/params/AuthParams\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getCredentialCharset(Lorg/apache/http/params/HttpParams;)Ljava/lang/String;\"/>\n\t\t<method name=\"setCredentialCharset(Lorg/apache/http/params/HttpParams;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/AuthenticationHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getChallenges(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)Ljava/util/Map;\"/>\n\t\t<method name=\"isAuthenticationRequested(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)Z\"/>\n\t\t<method name=\"selectScheme(Ljava/util/Map;Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/auth/AuthScheme;\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/CircularRedirectException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/client/RedirectException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/ClientProtocolException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/io/IOException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/CookieStore\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addCookie(Lorg/apache/http/cookie/Cookie;)V\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"clearExpired(Ljava/util/Date;)Z\"/>\n\t\t<method name=\"getCookies()Ljava/util/List;\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/CredentialsProvider\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"getCredentials(Lorg/apache/http/auth/AuthScope;)Lorg/apache/http/auth/Credentials;\"/>\n\t\t<method name=\"setCredentials(Lorg/apache/http/auth/AuthScope;Lorg/apache/http/auth/Credentials;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/HttpClient\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"execute(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;)Lorg/apache/http/HttpResponse;\"/>\n\t\t<method name=\"execute(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/client/ResponseHandler;)Ljava/lang/Object;\"/>\n\t\t<method name=\"execute(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/client/ResponseHandler;Lorg/apache/http/protocol/HttpContext;)Ljava/lang/Object;\"/>\n\t\t<method name=\"execute(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;\"/>\n\t\t<method name=\"execute(Lorg/apache/http/client/methods/HttpUriRequest;)Lorg/apache/http/HttpResponse;\"/>\n\t\t<method name=\"execute(Lorg/apache/http/client/methods/HttpUriRequest;Lorg/apache/http/client/ResponseHandler;)Ljava/lang/Object;\"/>\n\t\t<method name=\"execute(Lorg/apache/http/client/methods/HttpUriRequest;Lorg/apache/http/client/ResponseHandler;Lorg/apache/http/protocol/HttpContext;)Ljava/lang/Object;\"/>\n\t\t<method name=\"execute(Lorg/apache/http/client/methods/HttpUriRequest;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;\"/>\n\t\t<method name=\"getConnectionManager()Lorg/apache/http/conn/ClientConnectionManager;\"/>\n\t\t<method name=\"getParams()Lorg/apache/http/params/HttpParams;\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/HttpRequestRetryHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"retryRequest(Ljava/io/IOException;ILorg/apache/http/protocol/HttpContext;)Z\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/HttpResponseException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/client/ClientProtocolException\"/>\n\t\t<method name=\"&lt;init>(ILjava/lang/String;)V\"/>\n\t\t<method name=\"getStatusCode()I\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/NonRepeatableRequestException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/ProtocolException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/RedirectException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/ProtocolException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/RedirectHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getLocationURI(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)Ljava/net/URI;\"/>\n\t\t<method name=\"isRedirectRequested(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)Z\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/RequestDirector\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"execute(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/ResponseHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"handleResponse(Lorg/apache/http/HttpResponse;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/UserTokenHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getUserToken(Lorg/apache/http/protocol/HttpContext;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/entity/UrlEncodedFormEntity\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/entity/StringEntity\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/List;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/List;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/methods/AbortableHttpRequest\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"abort()V\"/>\n\t\t<method name=\"setConnectionRequest(Lorg/apache/http/conn/ClientConnectionRequest;)V\"/>\n\t\t<method name=\"setReleaseTrigger(Lorg/apache/http/conn/ConnectionReleaseTrigger;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/methods/HttpDelete\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/client/methods/HttpRequestBase\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/URI;)V\"/>\n\t\t<field name=\"METHOD_NAME\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/methods/HttpEntityEnclosingRequestBase\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/client/methods/HttpRequestBase\"/>\n\t\t<implements name=\"org/apache/http/HttpEntityEnclosingRequest\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/methods/HttpGet\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/client/methods/HttpRequestBase\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/URI;)V\"/>\n\t\t<field name=\"METHOD_NAME\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/methods/HttpHead\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/client/methods/HttpRequestBase\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/URI;)V\"/>\n\t\t<field name=\"METHOD_NAME\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/methods/HttpOptions\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/client/methods/HttpRequestBase\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/URI;)V\"/>\n\t\t<method name=\"getAllowedMethods(Lorg/apache/http/HttpResponse;)Ljava/util/Set;\"/>\n\t\t<field name=\"METHOD_NAME\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/methods/HttpPost\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/client/methods/HttpEntityEnclosingRequestBase\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/URI;)V\"/>\n\t\t<field name=\"METHOD_NAME\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/methods/HttpPut\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/client/methods/HttpEntityEnclosingRequestBase\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/URI;)V\"/>\n\t\t<field name=\"METHOD_NAME\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/methods/HttpRequestBase\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/message/AbstractHttpMessage\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"org/apache/http/client/methods/AbortableHttpRequest\"/>\n\t\t<implements name=\"org/apache/http/client/methods/HttpUriRequest\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"setURI(Ljava/net/URI;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/methods/HttpTrace\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/client/methods/HttpRequestBase\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/URI;)V\"/>\n\t\t<field name=\"METHOD_NAME\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/methods/HttpUriRequest\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpRequest\"/>\n\t\t<method name=\"abort()V\"/>\n\t\t<method name=\"getMethod()Ljava/lang/String;\"/>\n\t\t<method name=\"getURI()Ljava/net/URI;\"/>\n\t\t<method name=\"isAborted()Z\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/params/AllClientPNames\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/auth/params/AuthPNames\"/>\n\t\t<implements name=\"org/apache/http/client/params/ClientPNames\"/>\n\t\t<implements name=\"org/apache/http/conn/params/ConnConnectionPNames\"/>\n\t\t<implements name=\"org/apache/http/conn/params/ConnManagerPNames\"/>\n\t\t<implements name=\"org/apache/http/conn/params/ConnRoutePNames\"/>\n\t\t<implements name=\"org/apache/http/cookie/params/CookieSpecPNames\"/>\n\t\t<implements name=\"org/apache/http/params/CoreConnectionPNames\"/>\n\t\t<implements name=\"org/apache/http/params/CoreProtocolPNames\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/params/AuthPolicy\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"BASIC\"/>\n\t\t<field name=\"DIGEST\"/>\n\t\t<field name=\"NTLM\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/params/ClientPNames\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"ALLOW_CIRCULAR_REDIRECTS\"/>\n\t\t<field name=\"CONNECTION_MANAGER_FACTORY\"/>\n\t\t<field name=\"CONNECTION_MANAGER_FACTORY_CLASS_NAME\"/>\n\t\t<field name=\"COOKIE_POLICY\"/>\n\t\t<field name=\"DEFAULT_HEADERS\"/>\n\t\t<field name=\"DEFAULT_HOST\"/>\n\t\t<field name=\"HANDLE_AUTHENTICATION\"/>\n\t\t<field name=\"HANDLE_REDIRECTS\"/>\n\t\t<field name=\"MAX_REDIRECTS\"/>\n\t\t<field name=\"REJECT_RELATIVE_REDIRECT\"/>\n\t\t<field name=\"VIRTUAL_HOST\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/params/ClientParamBean\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/params/HttpAbstractParamBean\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"setAllowCircularRedirects(Z)V\"/>\n\t\t<method name=\"setConnectionManagerFactory(Lorg/apache/http/conn/ClientConnectionManagerFactory;)V\"/>\n\t\t<method name=\"setConnectionManagerFactoryClassName(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setCookiePolicy(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setDefaultHeaders(Ljava/util/Collection;)V\"/>\n\t\t<method name=\"setDefaultHost(Lorg/apache/http/HttpHost;)V\"/>\n\t\t<method name=\"setHandleAuthentication(Z)V\"/>\n\t\t<method name=\"setHandleRedirects(Z)V\"/>\n\t\t<method name=\"setMaxRedirects(I)V\"/>\n\t\t<method name=\"setRejectRelativeRedirect(Z)V\"/>\n\t\t<method name=\"setVirtualHost(Lorg/apache/http/HttpHost;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/params/CookiePolicy\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"BEST_MATCH\"/>\n\t\t<field name=\"BROWSER_COMPATIBILITY\"/>\n\t\t<field name=\"NETSCAPE\"/>\n\t\t<field name=\"RFC_2109\"/>\n\t\t<field name=\"RFC_2965\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/params/HttpClientParams\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getCookiePolicy(Lorg/apache/http/params/HttpParams;)Ljava/lang/String;\"/>\n\t\t<method name=\"isAuthenticating(Lorg/apache/http/params/HttpParams;)Z\"/>\n\t\t<method name=\"isRedirecting(Lorg/apache/http/params/HttpParams;)Z\"/>\n\t\t<method name=\"setAuthenticating(Lorg/apache/http/params/HttpParams;Z)V\"/>\n\t\t<method name=\"setCookiePolicy(Lorg/apache/http/params/HttpParams;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setRedirecting(Lorg/apache/http/params/HttpParams;Z)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/protocol/ClientContext\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"AUTHSCHEME_REGISTRY\"/>\n\t\t<field name=\"AUTH_SCHEME_PREF\"/>\n\t\t<field name=\"COOKIESPEC_REGISTRY\"/>\n\t\t<field name=\"COOKIE_ORIGIN\"/>\n\t\t<field name=\"COOKIE_SPEC\"/>\n\t\t<field name=\"COOKIE_STORE\"/>\n\t\t<field name=\"CREDS_PROVIDER\"/>\n\t\t<field name=\"PROXY_AUTH_STATE\"/>\n\t\t<field name=\"TARGET_AUTH_STATE\"/>\n\t\t<field name=\"USER_TOKEN\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/protocol/ClientContextConfigurer\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/client/protocol/ClientContext\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/protocol/HttpContext;)V\"/>\n\t\t<method name=\"setAuthSchemePref(Ljava/util/List;)V\"/>\n\t\t<method name=\"setAuthSchemeRegistry(Lorg/apache/http/auth/AuthSchemeRegistry;)V\"/>\n\t\t<method name=\"setCookieSpecRegistry(Lorg/apache/http/cookie/CookieSpecRegistry;)V\"/>\n\t\t<method name=\"setCookieStore(Lorg/apache/http/client/CookieStore;)V\"/>\n\t\t<method name=\"setCredentialsProvider(Lorg/apache/http/client/CredentialsProvider;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/protocol/RequestAddCookies\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpRequestInterceptor\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/protocol/RequestDefaultHeaders\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpRequestInterceptor\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/protocol/RequestProxyAuthentication\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpRequestInterceptor\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/protocol/RequestTargetAuthentication\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpRequestInterceptor\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/protocol/ResponseProcessCookies\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpResponseInterceptor\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/utils/CloneUtils\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"clone(Ljava/lang/Object;)Ljava/lang/Object;\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/utils/URIUtils\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createURI(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/net/URI;\"/>\n\t\t<method name=\"resolve(Ljava/net/URI;Ljava/lang/String;)Ljava/net/URI;\"/>\n\t\t<method name=\"resolve(Ljava/net/URI;Ljava/net/URI;)Ljava/net/URI;\"/>\n\t\t<method name=\"rewriteURI(Ljava/net/URI;Lorg/apache/http/HttpHost;)Ljava/net/URI;\"/>\n\t\t<method name=\"rewriteURI(Ljava/net/URI;Lorg/apache/http/HttpHost;Z)Ljava/net/URI;\"/>\n\t</class>\n\t<class name=\"org/apache/http/client/utils/URLEncodedUtils\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"format(Ljava/util/List;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"isEncoded(Lorg/apache/http/HttpEntity;)Z\"/>\n\t\t<method name=\"parse(Ljava/net/URI;Ljava/lang/String;)Ljava/util/List;\"/>\n\t\t<method name=\"parse(Ljava/util/List;Ljava/util/Scanner;Ljava/lang/String;)V\"/>\n\t\t<method name=\"parse(Lorg/apache/http/HttpEntity;)Ljava/util/List;\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/BasicEofSensorWatcher\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/conn/EofSensorWatcher\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/conn/ManagedClientConnection;Z)V\"/>\n\t\t<field name=\"attemptReuse\"/>\n\t\t<field name=\"managedConn\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/BasicManagedEntity\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/entity/HttpEntityWrapper\"/>\n\t\t<implements name=\"org/apache/http/conn/ConnectionReleaseTrigger\"/>\n\t\t<implements name=\"org/apache/http/conn/EofSensorWatcher\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/HttpEntity;Lorg/apache/http/conn/ManagedClientConnection;Z)V\"/>\n\t\t<method name=\"releaseManagedConnection()V\"/>\n\t\t<field name=\"attemptReuse\"/>\n\t\t<field name=\"managedConn\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/ClientConnectionManager\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"closeExpiredConnections()V\"/>\n\t\t<method name=\"closeIdleConnections(JLjava/util/concurrent/TimeUnit;)V\"/>\n\t\t<method name=\"getSchemeRegistry()Lorg/apache/http/conn/scheme/SchemeRegistry;\"/>\n\t\t<method name=\"releaseConnection(Lorg/apache/http/conn/ManagedClientConnection;JLjava/util/concurrent/TimeUnit;)V\"/>\n\t\t<method name=\"requestConnection(Lorg/apache/http/conn/routing/HttpRoute;Ljava/lang/Object;)Lorg/apache/http/conn/ClientConnectionRequest;\"/>\n\t\t<method name=\"shutdown()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/ClientConnectionManagerFactory\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"newInstance(Lorg/apache/http/params/HttpParams;Lorg/apache/http/conn/scheme/SchemeRegistry;)Lorg/apache/http/conn/ClientConnectionManager;\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/ClientConnectionOperator\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createConnection()Lorg/apache/http/conn/OperatedClientConnection;\"/>\n\t\t<method name=\"openConnection(Lorg/apache/http/conn/OperatedClientConnection;Lorg/apache/http/HttpHost;Ljava/net/InetAddress;Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"updateSecureConnection(Lorg/apache/http/conn/OperatedClientConnection;Lorg/apache/http/HttpHost;Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/params/HttpParams;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/ClientConnectionRequest\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"abortRequest()V\"/>\n\t\t<method name=\"getConnection(JLjava/util/concurrent/TimeUnit;)Lorg/apache/http/conn/ManagedClientConnection;\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/ConnectTimeoutException\" since=\"1\" deprecated=\"22\">\n\t\t<extends name=\"java/io/InterruptedIOException\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/ConnectionKeepAliveStrategy\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getKeepAliveDuration(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)J\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/ConnectionPoolTimeoutException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/conn/ConnectTimeoutException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/ConnectionReleaseTrigger\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"abortConnection()V\"/>\n\t\t<method name=\"releaseConnection()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/EofSensorInputStream\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/io/InputStream\"/>\n\t\t<implements name=\"org/apache/http/conn/ConnectionReleaseTrigger\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;Lorg/apache/http/conn/EofSensorWatcher;)V\"/>\n\t\t<method name=\"checkAbort()V\"/>\n\t\t<method name=\"checkClose()V\"/>\n\t\t<method name=\"checkEOF(I)V\"/>\n\t\t<method name=\"isReadAllowed()Z\"/>\n\t\t<field name=\"wrappedStream\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/EofSensorWatcher\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"eofDetected(Ljava/io/InputStream;)Z\"/>\n\t\t<method name=\"streamAbort(Ljava/io/InputStream;)Z\"/>\n\t\t<method name=\"streamClosed(Ljava/io/InputStream;)Z\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/HttpHostConnectException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/net/ConnectException\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/HttpHost;Ljava/net/ConnectException;)V\"/>\n\t\t<method name=\"getHost()Lorg/apache/http/HttpHost;\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/ManagedClientConnection\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpClientConnection\"/>\n\t\t<implements name=\"org/apache/http/HttpInetConnection\"/>\n\t\t<implements name=\"org/apache/http/conn/ConnectionReleaseTrigger\"/>\n\t\t<method name=\"getRoute()Lorg/apache/http/conn/routing/HttpRoute;\"/>\n\t\t<method name=\"getSSLSession()Ljavax/net/ssl/SSLSession;\"/>\n\t\t<method name=\"getState()Ljava/lang/Object;\"/>\n\t\t<method name=\"isMarkedReusable()Z\"/>\n\t\t<method name=\"isSecure()Z\"/>\n\t\t<method name=\"layerProtocol(Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"markReusable()V\"/>\n\t\t<method name=\"open(Lorg/apache/http/conn/routing/HttpRoute;Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"setIdleDuration(JLjava/util/concurrent/TimeUnit;)V\"/>\n\t\t<method name=\"setState(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"tunnelProxy(Lorg/apache/http/HttpHost;ZLorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"tunnelTarget(ZLorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"unmarkReusable()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/MultihomePlainSocketFactory\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/conn/scheme/SocketFactory\"/>\n\t\t<method name=\"getSocketFactory()Lorg/apache/http/conn/MultihomePlainSocketFactory;\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/OperatedClientConnection\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpClientConnection\"/>\n\t\t<implements name=\"org/apache/http/HttpInetConnection\"/>\n\t\t<method name=\"getSocket()Ljava/net/Socket;\"/>\n\t\t<method name=\"getTargetHost()Lorg/apache/http/HttpHost;\"/>\n\t\t<method name=\"isSecure()Z\"/>\n\t\t<method name=\"openCompleted(ZLorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"opening(Ljava/net/Socket;Lorg/apache/http/HttpHost;)V\"/>\n\t\t<method name=\"update(Ljava/net/Socket;Lorg/apache/http/HttpHost;ZLorg/apache/http/params/HttpParams;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/params/ConnConnectionPNames\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"MAX_STATUS_LINE_GARBAGE\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/params/ConnConnectionParamBean\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/params/HttpAbstractParamBean\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"setMaxStatusLineGarbage(I)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/params/ConnManagerPNames\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"MAX_CONNECTIONS_PER_ROUTE\"/>\n\t\t<field name=\"MAX_TOTAL_CONNECTIONS\"/>\n\t\t<field name=\"TIMEOUT\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/params/ConnManagerParamBean\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/params/HttpAbstractParamBean\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"setConnectionsPerRoute(Lorg/apache/http/conn/params/ConnPerRouteBean;)V\"/>\n\t\t<method name=\"setMaxTotalConnections(I)V\"/>\n\t\t<method name=\"setTimeout(J)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/params/ConnManagerParams\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/conn/params/ConnManagerPNames\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getMaxConnectionsPerRoute(Lorg/apache/http/params/HttpParams;)Lorg/apache/http/conn/params/ConnPerRoute;\"/>\n\t\t<method name=\"getMaxTotalConnections(Lorg/apache/http/params/HttpParams;)I\"/>\n\t\t<method name=\"getTimeout(Lorg/apache/http/params/HttpParams;)J\"/>\n\t\t<method name=\"setMaxConnectionsPerRoute(Lorg/apache/http/params/HttpParams;Lorg/apache/http/conn/params/ConnPerRoute;)V\"/>\n\t\t<method name=\"setMaxTotalConnections(Lorg/apache/http/params/HttpParams;I)V\"/>\n\t\t<method name=\"setTimeout(Lorg/apache/http/params/HttpParams;J)V\"/>\n\t\t<field name=\"DEFAULT_MAX_TOTAL_CONNECTIONS\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/params/ConnPerRoute\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getMaxForRoute(Lorg/apache/http/conn/routing/HttpRoute;)I\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/params/ConnPerRouteBean\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/conn/params/ConnPerRoute\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"getDefaultMax()I\"/>\n\t\t<method name=\"setDefaultMaxPerRoute(I)V\"/>\n\t\t<method name=\"setMaxForRoute(Lorg/apache/http/conn/routing/HttpRoute;I)V\"/>\n\t\t<method name=\"setMaxForRoutes(Ljava/util/Map;)V\"/>\n\t\t<field name=\"DEFAULT_MAX_CONNECTIONS_PER_ROUTE\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/params/ConnRoutePNames\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"DEFAULT_PROXY\"/>\n\t\t<field name=\"FORCED_ROUTE\"/>\n\t\t<field name=\"LOCAL_ADDRESS\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/params/ConnRouteParamBean\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/params/HttpAbstractParamBean\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"setDefaultProxy(Lorg/apache/http/HttpHost;)V\"/>\n\t\t<method name=\"setForcedRoute(Lorg/apache/http/conn/routing/HttpRoute;)V\"/>\n\t\t<method name=\"setLocalAddress(Ljava/net/InetAddress;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/params/ConnRouteParams\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/conn/params/ConnRoutePNames\"/>\n\t\t<method name=\"getDefaultProxy(Lorg/apache/http/params/HttpParams;)Lorg/apache/http/HttpHost;\"/>\n\t\t<method name=\"getForcedRoute(Lorg/apache/http/params/HttpParams;)Lorg/apache/http/conn/routing/HttpRoute;\"/>\n\t\t<method name=\"getLocalAddress(Lorg/apache/http/params/HttpParams;)Ljava/net/InetAddress;\"/>\n\t\t<method name=\"setDefaultProxy(Lorg/apache/http/params/HttpParams;Lorg/apache/http/HttpHost;)V\"/>\n\t\t<method name=\"setForcedRoute(Lorg/apache/http/params/HttpParams;Lorg/apache/http/conn/routing/HttpRoute;)V\"/>\n\t\t<method name=\"setLocalAddress(Lorg/apache/http/params/HttpParams;Ljava/net/InetAddress;)V\"/>\n\t\t<field name=\"NO_HOST\"/>\n\t\t<field name=\"NO_ROUTE\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/routing/BasicRouteDirector\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/conn/routing/HttpRouteDirector\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"directStep(Lorg/apache/http/conn/routing/RouteInfo;Lorg/apache/http/conn/routing/RouteInfo;)I\"/>\n\t\t<method name=\"firstStep(Lorg/apache/http/conn/routing/RouteInfo;)I\"/>\n\t\t<method name=\"proxiedStep(Lorg/apache/http/conn/routing/RouteInfo;Lorg/apache/http/conn/routing/RouteInfo;)I\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/routing/HttpRoute\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"org/apache/http/conn/routing/RouteInfo\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/HttpHost;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/HttpHost;Ljava/net/InetAddress;Lorg/apache/http/HttpHost;Z)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/HttpHost;Ljava/net/InetAddress;Lorg/apache/http/HttpHost;ZLorg/apache/http/conn/routing/RouteInfo$TunnelType;Lorg/apache/http/conn/routing/RouteInfo$LayerType;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/HttpHost;Ljava/net/InetAddress;Z)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/HttpHost;Ljava/net/InetAddress;[Lorg/apache/http/HttpHost;ZLorg/apache/http/conn/routing/RouteInfo$TunnelType;Lorg/apache/http/conn/routing/RouteInfo$LayerType;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/routing/HttpRouteDirector\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"nextStep(Lorg/apache/http/conn/routing/RouteInfo;Lorg/apache/http/conn/routing/RouteInfo;)I\"/>\n\t\t<field name=\"COMPLETE\"/>\n\t\t<field name=\"CONNECT_PROXY\"/>\n\t\t<field name=\"CONNECT_TARGET\"/>\n\t\t<field name=\"LAYER_PROTOCOL\"/>\n\t\t<field name=\"TUNNEL_PROXY\"/>\n\t\t<field name=\"TUNNEL_TARGET\"/>\n\t\t<field name=\"UNREACHABLE\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/routing/HttpRoutePlanner\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"determineRoute(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/conn/routing/HttpRoute;\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/routing/RouteInfo\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getHopCount()I\"/>\n\t\t<method name=\"getHopTarget(I)Lorg/apache/http/HttpHost;\"/>\n\t\t<method name=\"getLayerType()Lorg/apache/http/conn/routing/RouteInfo$LayerType;\"/>\n\t\t<method name=\"getLocalAddress()Ljava/net/InetAddress;\"/>\n\t\t<method name=\"getProxyHost()Lorg/apache/http/HttpHost;\"/>\n\t\t<method name=\"getTargetHost()Lorg/apache/http/HttpHost;\"/>\n\t\t<method name=\"getTunnelType()Lorg/apache/http/conn/routing/RouteInfo$TunnelType;\"/>\n\t\t<method name=\"isLayered()Z\"/>\n\t\t<method name=\"isSecure()Z\"/>\n\t\t<method name=\"isTunnelled()Z\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/routing/RouteInfo$LayerType\" since=\"1\" removed=\"23\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Lorg/apache/http/conn/routing/RouteInfo$LayerType;\"/>\n\t\t<method name=\"values()[Lorg/apache/http/conn/routing/RouteInfo$LayerType;\"/>\n\t\t<field name=\"LAYERED\"/>\n\t\t<field name=\"PLAIN\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/routing/RouteInfo$TunnelType\" since=\"1\" removed=\"23\">\n\t\t<extends name=\"java/lang/Enum\"/>\n\t\t<method name=\"valueOf(Ljava/lang/String;)Lorg/apache/http/conn/routing/RouteInfo$TunnelType;\"/>\n\t\t<method name=\"values()[Lorg/apache/http/conn/routing/RouteInfo$TunnelType;\"/>\n\t\t<field name=\"PLAIN\"/>\n\t\t<field name=\"TUNNELLED\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/routing/RouteTracker\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"org/apache/http/conn/routing/RouteInfo\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/HttpHost;Ljava/net/InetAddress;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/conn/routing/HttpRoute;)V\"/>\n\t\t<method name=\"connectProxy(Lorg/apache/http/HttpHost;Z)V\"/>\n\t\t<method name=\"connectTarget(Z)V\"/>\n\t\t<method name=\"isConnected()Z\"/>\n\t\t<method name=\"layerProtocol(Z)V\"/>\n\t\t<method name=\"toRoute()Lorg/apache/http/conn/routing/HttpRoute;\"/>\n\t\t<method name=\"tunnelProxy(Lorg/apache/http/HttpHost;Z)V\"/>\n\t\t<method name=\"tunnelTarget(Z)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/scheme/HostNameResolver\" since=\"1\" deprecated=\"22\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"resolve(Ljava/lang/String;)Ljava/net/InetAddress;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/scheme/LayeredSocketFactory\" since=\"1\" deprecated=\"22\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/conn/scheme/SocketFactory\"/>\n\t\t<method name=\"createSocket(Ljava/net/Socket;Ljava/lang/String;IZ)Ljava/net/Socket;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/scheme/PlainSocketFactory\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/conn/scheme/SocketFactory\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/conn/scheme/HostNameResolver;)V\"/>\n\t\t<method name=\"getSocketFactory()Lorg/apache/http/conn/scheme/PlainSocketFactory;\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/scheme/Scheme\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Lorg/apache/http/conn/scheme/SocketFactory;I)V\"/>\n\t\t<method name=\"getDefaultPort()I\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getSocketFactory()Lorg/apache/http/conn/scheme/SocketFactory;\"/>\n\t\t<method name=\"isLayered()Z\"/>\n\t\t<method name=\"resolvePort(I)I\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/scheme/SchemeRegistry\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"get(Ljava/lang/String;)Lorg/apache/http/conn/scheme/Scheme;\"/>\n\t\t<method name=\"getScheme(Ljava/lang/String;)Lorg/apache/http/conn/scheme/Scheme;\"/>\n\t\t<method name=\"getScheme(Lorg/apache/http/HttpHost;)Lorg/apache/http/conn/scheme/Scheme;\"/>\n\t\t<method name=\"getSchemeNames()Ljava/util/List;\"/>\n\t\t<method name=\"register(Lorg/apache/http/conn/scheme/Scheme;)Lorg/apache/http/conn/scheme/Scheme;\"/>\n\t\t<method name=\"setItems(Ljava/util/Map;)V\"/>\n\t\t<method name=\"unregister(Ljava/lang/String;)Lorg/apache/http/conn/scheme/Scheme;\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/scheme/SocketFactory\" since=\"1\" deprecated=\"22\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"connectSocket(Ljava/net/Socket;Ljava/lang/String;ILjava/net/InetAddress;ILorg/apache/http/params/HttpParams;)Ljava/net/Socket;\" deprecated=\"29\"/>\n\t\t<method name=\"createSocket()Ljava/net/Socket;\" deprecated=\"29\"/>\n\t\t<method name=\"isSecure(Ljava/net/Socket;)Z\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/ssl/AbstractVerifier\" since=\"1\" deprecated=\"22\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/conn/ssl/X509HostnameVerifier\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"acceptableCountryWildcard(Ljava/lang/String;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"countDots(Ljava/lang/String;)I\" deprecated=\"29\"/>\n\t\t<method name=\"getCNs(Ljava/security/cert/X509Certificate;)[Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getDNSSubjectAlts(Ljava/security/cert/X509Certificate;)[Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"verify(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;Z)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/ssl/AllowAllHostnameVerifier\" since=\"1\" deprecated=\"22\">\n\t\t<extends name=\"org/apache/http/conn/ssl/AbstractVerifier\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/ssl/BrowserCompatHostnameVerifier\" since=\"1\" deprecated=\"22\">\n\t\t<extends name=\"org/apache/http/conn/ssl/AbstractVerifier\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/ssl/SSLSocketFactory\" since=\"1\" deprecated=\"22\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/conn/scheme/LayeredSocketFactory\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/security/KeyStore;Ljava/lang/String;Ljava/security/KeyStore;Ljava/security/SecureRandom;Lorg/apache/http/conn/scheme/HostNameResolver;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/KeyStore;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/KeyStore;Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Ljava/security/KeyStore;Ljava/lang/String;Ljava/security/KeyStore;)V\" deprecated=\"29\"/>\n\t\t<method name=\"getHostnameVerifier()Lorg/apache/http/conn/ssl/X509HostnameVerifier;\" deprecated=\"29\"/>\n\t\t<method name=\"getSocketFactory()Lorg/apache/http/conn/ssl/SSLSocketFactory;\" deprecated=\"29\"/>\n\t\t<method name=\"setHostnameVerifier(Lorg/apache/http/conn/ssl/X509HostnameVerifier;)V\" deprecated=\"29\"/>\n\t\t<field name=\"ALLOW_ALL_HOSTNAME_VERIFIER\" deprecated=\"29\"/>\n\t\t<field name=\"BROWSER_COMPATIBLE_HOSTNAME_VERIFIER\" deprecated=\"29\"/>\n\t\t<field name=\"SSL\" deprecated=\"29\"/>\n\t\t<field name=\"SSLV2\" deprecated=\"29\"/>\n\t\t<field name=\"STRICT_HOSTNAME_VERIFIER\" deprecated=\"29\"/>\n\t\t<field name=\"TLS\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/ssl/StrictHostnameVerifier\" since=\"1\" deprecated=\"22\">\n\t\t<extends name=\"org/apache/http/conn/ssl/AbstractVerifier\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/ssl/X509HostnameVerifier\" since=\"1\" deprecated=\"22\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"javax/net/ssl/HostnameVerifier\"/>\n\t\t<method name=\"verify(Ljava/lang/String;Ljava/security/cert/X509Certificate;)V\" deprecated=\"29\"/>\n\t\t<method name=\"verify(Ljava/lang/String;Ljavax/net/ssl/SSLSocket;)V\" deprecated=\"29\"/>\n\t\t<method name=\"verify(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"org/apache/http/conn/util/InetAddressUtils\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"isIPv4Address(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isIPv6Address(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isIPv6HexCompressedAddress(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isIPv6StdAddress(Ljava/lang/String;)Z\"/>\n\t</class>\n\t<class name=\"org/apache/http/cookie/ClientCookie\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/cookie/Cookie\"/>\n\t\t<method name=\"containsAttribute(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"getAttribute(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<field name=\"COMMENTURL_ATTR\"/>\n\t\t<field name=\"COMMENT_ATTR\"/>\n\t\t<field name=\"DISCARD_ATTR\"/>\n\t\t<field name=\"DOMAIN_ATTR\"/>\n\t\t<field name=\"EXPIRES_ATTR\"/>\n\t\t<field name=\"MAX_AGE_ATTR\"/>\n\t\t<field name=\"PATH_ATTR\"/>\n\t\t<field name=\"PORT_ATTR\"/>\n\t\t<field name=\"SECURE_ATTR\"/>\n\t\t<field name=\"VERSION_ATTR\"/>\n\t</class>\n\t<class name=\"org/apache/http/cookie/Cookie\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getComment()Ljava/lang/String;\"/>\n\t\t<method name=\"getCommentURL()Ljava/lang/String;\"/>\n\t\t<method name=\"getDomain()Ljava/lang/String;\"/>\n\t\t<method name=\"getExpiryDate()Ljava/util/Date;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getPath()Ljava/lang/String;\"/>\n\t\t<method name=\"getPorts()[I\"/>\n\t\t<method name=\"getValue()Ljava/lang/String;\"/>\n\t\t<method name=\"getVersion()I\"/>\n\t\t<method name=\"isExpired(Ljava/util/Date;)Z\"/>\n\t\t<method name=\"isPersistent()Z\"/>\n\t\t<method name=\"isSecure()Z\"/>\n\t</class>\n\t<class name=\"org/apache/http/cookie/CookieAttributeHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"match(Lorg/apache/http/cookie/Cookie;Lorg/apache/http/cookie/CookieOrigin;)Z\"/>\n\t\t<method name=\"parse(Lorg/apache/http/cookie/SetCookie;Ljava/lang/String;)V\"/>\n\t\t<method name=\"validate(Lorg/apache/http/cookie/Cookie;Lorg/apache/http/cookie/CookieOrigin;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/cookie/CookieIdentityComparator\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/util/Comparator\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"compare(Lorg/apache/http/cookie/Cookie;Lorg/apache/http/cookie/Cookie;)I\"/>\n\t</class>\n\t<class name=\"org/apache/http/cookie/CookieOrigin\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;ILjava/lang/String;Z)V\"/>\n\t\t<method name=\"getHost()Ljava/lang/String;\"/>\n\t\t<method name=\"getPath()Ljava/lang/String;\"/>\n\t\t<method name=\"getPort()I\"/>\n\t\t<method name=\"isSecure()Z\"/>\n\t</class>\n\t<class name=\"org/apache/http/cookie/CookiePathComparator\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/util/Comparator\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"compare(Lorg/apache/http/cookie/Cookie;Lorg/apache/http/cookie/Cookie;)I\"/>\n\t</class>\n\t<class name=\"org/apache/http/cookie/CookieSpec\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"formatCookies(Ljava/util/List;)Ljava/util/List;\"/>\n\t\t<method name=\"getVersion()I\"/>\n\t\t<method name=\"getVersionHeader()Lorg/apache/http/Header;\"/>\n\t\t<method name=\"match(Lorg/apache/http/cookie/Cookie;Lorg/apache/http/cookie/CookieOrigin;)Z\"/>\n\t\t<method name=\"parse(Lorg/apache/http/Header;Lorg/apache/http/cookie/CookieOrigin;)Ljava/util/List;\"/>\n\t\t<method name=\"validate(Lorg/apache/http/cookie/Cookie;Lorg/apache/http/cookie/CookieOrigin;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/cookie/CookieSpecFactory\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"newInstance(Lorg/apache/http/params/HttpParams;)Lorg/apache/http/cookie/CookieSpec;\"/>\n\t</class>\n\t<class name=\"org/apache/http/cookie/CookieSpecRegistry\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getCookieSpec(Ljava/lang/String;)Lorg/apache/http/cookie/CookieSpec;\"/>\n\t\t<method name=\"getCookieSpec(Ljava/lang/String;Lorg/apache/http/params/HttpParams;)Lorg/apache/http/cookie/CookieSpec;\"/>\n\t\t<method name=\"getSpecNames()Ljava/util/List;\"/>\n\t\t<method name=\"register(Ljava/lang/String;Lorg/apache/http/cookie/CookieSpecFactory;)V\"/>\n\t\t<method name=\"setItems(Ljava/util/Map;)V\"/>\n\t\t<method name=\"unregister(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/cookie/MalformedCookieException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/ProtocolException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/cookie/SM\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"COOKIE\"/>\n\t\t<field name=\"COOKIE2\"/>\n\t\t<field name=\"SET_COOKIE\"/>\n\t\t<field name=\"SET_COOKIE2\"/>\n\t</class>\n\t<class name=\"org/apache/http/cookie/SetCookie\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/cookie/Cookie\"/>\n\t\t<method name=\"setComment(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setDomain(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setExpiryDate(Ljava/util/Date;)V\"/>\n\t\t<method name=\"setPath(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setSecure(Z)V\"/>\n\t\t<method name=\"setValue(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setVersion(I)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/cookie/SetCookie2\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/cookie/SetCookie\"/>\n\t\t<method name=\"setCommentURL(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setDiscard(Z)V\"/>\n\t\t<method name=\"setPorts([I)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/cookie/params/CookieSpecPNames\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"DATE_PATTERNS\"/>\n\t\t<field name=\"SINGLE_COOKIE_HEADER\"/>\n\t</class>\n\t<class name=\"org/apache/http/cookie/params/CookieSpecParamBean\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/params/HttpAbstractParamBean\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"setDatePatterns(Ljava/util/Collection;)V\"/>\n\t\t<method name=\"setSingleHeader(Z)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/entity/AbstractHttpEntity\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpEntity\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"setChunked(Z)V\"/>\n\t\t<method name=\"setContentEncoding(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setContentEncoding(Lorg/apache/http/Header;)V\"/>\n\t\t<method name=\"setContentType(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setContentType(Lorg/apache/http/Header;)V\"/>\n\t\t<field name=\"chunked\"/>\n\t\t<field name=\"contentEncoding\"/>\n\t\t<field name=\"contentType\"/>\n\t</class>\n\t<class name=\"org/apache/http/entity/BasicHttpEntity\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/entity/AbstractHttpEntity\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"setContent(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"setContentLength(J)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/entity/BufferedHttpEntity\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/entity/HttpEntityWrapper\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/HttpEntity;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/entity/ByteArrayEntity\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/entity/AbstractHttpEntity\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>([B)V\"/>\n\t\t<field name=\"content\"/>\n\t</class>\n\t<class name=\"org/apache/http/entity/ContentLengthStrategy\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"determineLength(Lorg/apache/http/HttpMessage;)J\"/>\n\t\t<field name=\"CHUNKED\"/>\n\t\t<field name=\"IDENTITY\"/>\n\t</class>\n\t<class name=\"org/apache/http/entity/ContentProducer\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"writeTo(Ljava/io/OutputStream;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/entity/EntityTemplate\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/entity/AbstractHttpEntity\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/entity/ContentProducer;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/entity/FileEntity\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/entity/AbstractHttpEntity\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/File;Ljava/lang/String;)V\"/>\n\t\t<field name=\"file\"/>\n\t</class>\n\t<class name=\"org/apache/http/entity/HttpEntityWrapper\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpEntity\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/HttpEntity;)V\"/>\n\t\t<field name=\"wrappedEntity\"/>\n\t</class>\n\t<class name=\"org/apache/http/entity/InputStreamEntity\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/entity/AbstractHttpEntity\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;J)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/entity/SerializableEntity\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/entity/AbstractHttpEntity\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Serializable;Z)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/entity/StringEntity\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/entity/AbstractHttpEntity\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<field name=\"content\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/AbstractHttpClientConnection\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpClientConnection\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"assertOpen()V\"/>\n\t\t<method name=\"createEntityDeserializer()Lorg/apache/http/impl/entity/EntityDeserializer;\"/>\n\t\t<method name=\"createEntitySerializer()Lorg/apache/http/impl/entity/EntitySerializer;\"/>\n\t\t<method name=\"createHttpResponseFactory()Lorg/apache/http/HttpResponseFactory;\"/>\n\t\t<method name=\"createRequestWriter(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/params/HttpParams;)Lorg/apache/http/io/HttpMessageWriter;\"/>\n\t\t<method name=\"createResponseParser(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/HttpResponseFactory;Lorg/apache/http/params/HttpParams;)Lorg/apache/http/io/HttpMessageParser;\"/>\n\t\t<method name=\"doFlush()V\"/>\n\t\t<method name=\"init(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/params/HttpParams;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/AbstractHttpServerConnection\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpServerConnection\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"assertOpen()V\"/>\n\t\t<method name=\"createEntityDeserializer()Lorg/apache/http/impl/entity/EntityDeserializer;\"/>\n\t\t<method name=\"createEntitySerializer()Lorg/apache/http/impl/entity/EntitySerializer;\"/>\n\t\t<method name=\"createHttpRequestFactory()Lorg/apache/http/HttpRequestFactory;\"/>\n\t\t<method name=\"createRequestParser(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/HttpRequestFactory;Lorg/apache/http/params/HttpParams;)Lorg/apache/http/io/HttpMessageParser;\"/>\n\t\t<method name=\"createResponseWriter(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/params/HttpParams;)Lorg/apache/http/io/HttpMessageWriter;\"/>\n\t\t<method name=\"doFlush()V\"/>\n\t\t<method name=\"init(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/params/HttpParams;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/DefaultConnectionReuseStrategy\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/ConnectionReuseStrategy\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"createTokenIterator(Lorg/apache/http/HeaderIterator;)Lorg/apache/http/TokenIterator;\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/DefaultHttpClientConnection\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/SocketHttpClientConnection\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/DefaultHttpRequestFactory\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpRequestFactory\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/DefaultHttpResponseFactory\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpResponseFactory\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/ReasonPhraseCatalog;)V\"/>\n\t\t<method name=\"determineLocale(Lorg/apache/http/protocol/HttpContext;)Ljava/util/Locale;\"/>\n\t\t<field name=\"reasonCatalog\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/DefaultHttpServerConnection\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/SocketHttpServerConnection\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/EnglishReasonPhraseCatalog\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/ReasonPhraseCatalog\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<field name=\"INSTANCE\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/HttpConnectionMetricsImpl\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpConnectionMetrics\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/io/HttpTransportMetrics;Lorg/apache/http/io/HttpTransportMetrics;)V\"/>\n\t\t<method name=\"incrementRequestCount()V\"/>\n\t\t<method name=\"incrementResponseCount()V\"/>\n\t\t<method name=\"setMetric(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<field name=\"RECEIVED_BYTES_COUNT\"/>\n\t\t<field name=\"REQUEST_COUNT\"/>\n\t\t<field name=\"RESPONSE_COUNT\"/>\n\t\t<field name=\"SENT_BYTES_COUNT\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/NoConnectionReuseStrategy\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/ConnectionReuseStrategy\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/SocketHttpClientConnection\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/AbstractHttpClientConnection\"/>\n\t\t<implements name=\"org/apache/http/HttpInetConnection\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"assertNotOpen()V\"/>\n\t\t<method name=\"bind(Ljava/net/Socket;Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"createSessionInputBuffer(Ljava/net/Socket;ILorg/apache/http/params/HttpParams;)Lorg/apache/http/io/SessionInputBuffer;\"/>\n\t\t<method name=\"createSessionOutputBuffer(Ljava/net/Socket;ILorg/apache/http/params/HttpParams;)Lorg/apache/http/io/SessionOutputBuffer;\"/>\n\t\t<method name=\"getSocket()Ljava/net/Socket;\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/SocketHttpServerConnection\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/AbstractHttpServerConnection\"/>\n\t\t<implements name=\"org/apache/http/HttpInetConnection\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"assertNotOpen()V\"/>\n\t\t<method name=\"bind(Ljava/net/Socket;Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"createHttpDataReceiver(Ljava/net/Socket;ILorg/apache/http/params/HttpParams;)Lorg/apache/http/io/SessionInputBuffer;\"/>\n\t\t<method name=\"createHttpDataTransmitter(Ljava/net/Socket;ILorg/apache/http/params/HttpParams;)Lorg/apache/http/io/SessionOutputBuffer;\"/>\n\t\t<method name=\"getSocket()Ljava/net/Socket;\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/auth/AuthSchemeBase\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/auth/AuthScheme\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"isProxy()Z\"/>\n\t\t<method name=\"parseChallenge(Lorg/apache/http/util/CharArrayBuffer;II)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/auth/BasicScheme\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/auth/RFC2617Scheme\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"authenticate(Lorg/apache/http/auth/Credentials;Ljava/lang/String;Z)Lorg/apache/http/Header;\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/auth/BasicSchemeFactory\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/auth/AuthSchemeFactory\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/auth/DigestScheme\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/auth/RFC2617Scheme\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"createCnonce()Ljava/lang/String;\"/>\n\t\t<method name=\"overrideParamter(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/auth/DigestSchemeFactory\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/auth/AuthSchemeFactory\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/auth/NTLMEngine\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"generateType1Msg(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"generateType3Msg(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/auth/NTLMEngineException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/auth/AuthenticationException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/auth/NTLMScheme\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/auth/AuthSchemeBase\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/impl/auth/NTLMEngine;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/auth/RFC2617Scheme\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/auth/AuthSchemeBase\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getParameters()Ljava/util/Map;\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/auth/UnsupportedDigestAlgorithmException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/client/AbstractAuthenticationHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/client/AuthenticationHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getAuthPreferences()Ljava/util/List;\"/>\n\t\t<method name=\"parseChallenges([Lorg/apache/http/Header;)Ljava/util/Map;\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/client/AbstractHttpClient\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/client/HttpClient\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/conn/ClientConnectionManager;Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"addRequestInterceptor(Lorg/apache/http/HttpRequestInterceptor;)V\"/>\n\t\t<method name=\"addRequestInterceptor(Lorg/apache/http/HttpRequestInterceptor;I)V\"/>\n\t\t<method name=\"addResponseInterceptor(Lorg/apache/http/HttpResponseInterceptor;)V\"/>\n\t\t<method name=\"addResponseInterceptor(Lorg/apache/http/HttpResponseInterceptor;I)V\"/>\n\t\t<method name=\"clearRequestInterceptors()V\"/>\n\t\t<method name=\"clearResponseInterceptors()V\"/>\n\t\t<method name=\"createAuthSchemeRegistry()Lorg/apache/http/auth/AuthSchemeRegistry;\"/>\n\t\t<method name=\"createClientConnectionManager()Lorg/apache/http/conn/ClientConnectionManager;\"/>\n\t\t<method name=\"createClientRequestDirector(Lorg/apache/http/protocol/HttpRequestExecutor;Lorg/apache/http/conn/ClientConnectionManager;Lorg/apache/http/ConnectionReuseStrategy;Lorg/apache/http/conn/ConnectionKeepAliveStrategy;Lorg/apache/http/conn/routing/HttpRoutePlanner;Lorg/apache/http/protocol/HttpProcessor;Lorg/apache/http/client/HttpRequestRetryHandler;Lorg/apache/http/client/RedirectHandler;Lorg/apache/http/client/AuthenticationHandler;Lorg/apache/http/client/AuthenticationHandler;Lorg/apache/http/client/UserTokenHandler;Lorg/apache/http/params/HttpParams;)Lorg/apache/http/client/RequestDirector;\"/>\n\t\t<method name=\"createConnectionKeepAliveStrategy()Lorg/apache/http/conn/ConnectionKeepAliveStrategy;\"/>\n\t\t<method name=\"createConnectionReuseStrategy()Lorg/apache/http/ConnectionReuseStrategy;\"/>\n\t\t<method name=\"createCookieSpecRegistry()Lorg/apache/http/cookie/CookieSpecRegistry;\"/>\n\t\t<method name=\"createCookieStore()Lorg/apache/http/client/CookieStore;\"/>\n\t\t<method name=\"createCredentialsProvider()Lorg/apache/http/client/CredentialsProvider;\"/>\n\t\t<method name=\"createHttpContext()Lorg/apache/http/protocol/HttpContext;\"/>\n\t\t<method name=\"createHttpParams()Lorg/apache/http/params/HttpParams;\"/>\n\t\t<method name=\"createHttpProcessor()Lorg/apache/http/protocol/BasicHttpProcessor;\"/>\n\t\t<method name=\"createHttpRequestRetryHandler()Lorg/apache/http/client/HttpRequestRetryHandler;\"/>\n\t\t<method name=\"createHttpRoutePlanner()Lorg/apache/http/conn/routing/HttpRoutePlanner;\"/>\n\t\t<method name=\"createProxyAuthenticationHandler()Lorg/apache/http/client/AuthenticationHandler;\"/>\n\t\t<method name=\"createRedirectHandler()Lorg/apache/http/client/RedirectHandler;\"/>\n\t\t<method name=\"createRequestExecutor()Lorg/apache/http/protocol/HttpRequestExecutor;\"/>\n\t\t<method name=\"createTargetAuthenticationHandler()Lorg/apache/http/client/AuthenticationHandler;\"/>\n\t\t<method name=\"createUserTokenHandler()Lorg/apache/http/client/UserTokenHandler;\"/>\n\t\t<method name=\"determineParams(Lorg/apache/http/HttpRequest;)Lorg/apache/http/params/HttpParams;\"/>\n\t\t<method name=\"getAuthSchemes()Lorg/apache/http/auth/AuthSchemeRegistry;\"/>\n\t\t<method name=\"getConnectionKeepAliveStrategy()Lorg/apache/http/conn/ConnectionKeepAliveStrategy;\"/>\n\t\t<method name=\"getConnectionReuseStrategy()Lorg/apache/http/ConnectionReuseStrategy;\"/>\n\t\t<method name=\"getCookieSpecs()Lorg/apache/http/cookie/CookieSpecRegistry;\"/>\n\t\t<method name=\"getCookieStore()Lorg/apache/http/client/CookieStore;\"/>\n\t\t<method name=\"getCredentialsProvider()Lorg/apache/http/client/CredentialsProvider;\"/>\n\t\t<method name=\"getHttpProcessor()Lorg/apache/http/protocol/BasicHttpProcessor;\"/>\n\t\t<method name=\"getHttpRequestRetryHandler()Lorg/apache/http/client/HttpRequestRetryHandler;\"/>\n\t\t<method name=\"getProxyAuthenticationHandler()Lorg/apache/http/client/AuthenticationHandler;\"/>\n\t\t<method name=\"getRedirectHandler()Lorg/apache/http/client/RedirectHandler;\"/>\n\t\t<method name=\"getRequestExecutor()Lorg/apache/http/protocol/HttpRequestExecutor;\"/>\n\t\t<method name=\"getRequestInterceptor(I)Lorg/apache/http/HttpRequestInterceptor;\"/>\n\t\t<method name=\"getRequestInterceptorCount()I\"/>\n\t\t<method name=\"getResponseInterceptor(I)Lorg/apache/http/HttpResponseInterceptor;\"/>\n\t\t<method name=\"getResponseInterceptorCount()I\"/>\n\t\t<method name=\"getRoutePlanner()Lorg/apache/http/conn/routing/HttpRoutePlanner;\"/>\n\t\t<method name=\"getTargetAuthenticationHandler()Lorg/apache/http/client/AuthenticationHandler;\"/>\n\t\t<method name=\"getUserTokenHandler()Lorg/apache/http/client/UserTokenHandler;\"/>\n\t\t<method name=\"removeRequestInterceptorByClass(Ljava/lang/Class;)V\"/>\n\t\t<method name=\"removeResponseInterceptorByClass(Ljava/lang/Class;)V\"/>\n\t\t<method name=\"setAuthSchemes(Lorg/apache/http/auth/AuthSchemeRegistry;)V\"/>\n\t\t<method name=\"setCookieSpecs(Lorg/apache/http/cookie/CookieSpecRegistry;)V\"/>\n\t\t<method name=\"setCookieStore(Lorg/apache/http/client/CookieStore;)V\"/>\n\t\t<method name=\"setCredentialsProvider(Lorg/apache/http/client/CredentialsProvider;)V\"/>\n\t\t<method name=\"setHttpRequestRetryHandler(Lorg/apache/http/client/HttpRequestRetryHandler;)V\"/>\n\t\t<method name=\"setKeepAliveStrategy(Lorg/apache/http/conn/ConnectionKeepAliveStrategy;)V\"/>\n\t\t<method name=\"setParams(Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"setProxyAuthenticationHandler(Lorg/apache/http/client/AuthenticationHandler;)V\"/>\n\t\t<method name=\"setRedirectHandler(Lorg/apache/http/client/RedirectHandler;)V\"/>\n\t\t<method name=\"setReuseStrategy(Lorg/apache/http/ConnectionReuseStrategy;)V\"/>\n\t\t<method name=\"setRoutePlanner(Lorg/apache/http/conn/routing/HttpRoutePlanner;)V\"/>\n\t\t<method name=\"setTargetAuthenticationHandler(Lorg/apache/http/client/AuthenticationHandler;)V\"/>\n\t\t<method name=\"setUserTokenHandler(Lorg/apache/http/client/UserTokenHandler;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/client/BasicCookieStore\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/client/CookieStore\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addCookies([Lorg/apache/http/cookie/Cookie;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/client/BasicCredentialsProvider\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/client/CredentialsProvider\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/client/BasicResponseHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/client/ResponseHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"handleResponse(Lorg/apache/http/HttpResponse;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/client/ClientParamsStack\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/params/AbstractHttpParams\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/impl/client/ClientParamsStack;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/impl/client/ClientParamsStack;Lorg/apache/http/params/HttpParams;Lorg/apache/http/params/HttpParams;Lorg/apache/http/params/HttpParams;Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/params/HttpParams;Lorg/apache/http/params/HttpParams;Lorg/apache/http/params/HttpParams;Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"getApplicationParams()Lorg/apache/http/params/HttpParams;\"/>\n\t\t<method name=\"getClientParams()Lorg/apache/http/params/HttpParams;\"/>\n\t\t<method name=\"getOverrideParams()Lorg/apache/http/params/HttpParams;\"/>\n\t\t<method name=\"getRequestParams()Lorg/apache/http/params/HttpParams;\"/>\n\t\t<field name=\"applicationParams\"/>\n\t\t<field name=\"clientParams\"/>\n\t\t<field name=\"overrideParams\"/>\n\t\t<field name=\"requestParams\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/client/DefaultConnectionKeepAliveStrategy\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/conn/ConnectionKeepAliveStrategy\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/client/DefaultHttpClient\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/client/AbstractHttpClient\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/conn/ClientConnectionManager;Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/params/HttpParams;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/client/DefaultHttpRequestRetryHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/client/HttpRequestRetryHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(IZ)V\"/>\n\t\t<method name=\"getRetryCount()I\"/>\n\t\t<method name=\"isRequestSentRetryEnabled()Z\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/client/DefaultProxyAuthenticationHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/client/AbstractAuthenticationHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/client/DefaultRedirectHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/client/RedirectHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/client/DefaultRequestDirector\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/client/RequestDirector\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/protocol/HttpRequestExecutor;Lorg/apache/http/conn/ClientConnectionManager;Lorg/apache/http/ConnectionReuseStrategy;Lorg/apache/http/conn/ConnectionKeepAliveStrategy;Lorg/apache/http/conn/routing/HttpRoutePlanner;Lorg/apache/http/protocol/HttpProcessor;Lorg/apache/http/client/HttpRequestRetryHandler;Lorg/apache/http/client/RedirectHandler;Lorg/apache/http/client/AuthenticationHandler;Lorg/apache/http/client/AuthenticationHandler;Lorg/apache/http/client/UserTokenHandler;Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"createConnectRequest(Lorg/apache/http/conn/routing/HttpRoute;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpRequest;\"/>\n\t\t<method name=\"createTunnelToProxy(Lorg/apache/http/conn/routing/HttpRoute;ILorg/apache/http/protocol/HttpContext;)Z\"/>\n\t\t<method name=\"createTunnelToTarget(Lorg/apache/http/conn/routing/HttpRoute;Lorg/apache/http/protocol/HttpContext;)Z\"/>\n\t\t<method name=\"determineRoute(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/conn/routing/HttpRoute;\"/>\n\t\t<method name=\"establishRoute(Lorg/apache/http/conn/routing/HttpRoute;Lorg/apache/http/protocol/HttpContext;)V\"/>\n\t\t<method name=\"handleResponse(Lorg/apache/http/impl/client/RoutedRequest;Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/impl/client/RoutedRequest;\"/>\n\t\t<method name=\"releaseConnection()V\"/>\n\t\t<method name=\"rewriteRequestURI(Lorg/apache/http/impl/client/RequestWrapper;Lorg/apache/http/conn/routing/HttpRoute;)V\"/>\n\t\t<field name=\"connManager\"/>\n\t\t<field name=\"httpProcessor\"/>\n\t\t<field name=\"keepAliveStrategy\"/>\n\t\t<field name=\"managedConn\"/>\n\t\t<field name=\"params\"/>\n\t\t<field name=\"redirectHandler\"/>\n\t\t<field name=\"requestExec\"/>\n\t\t<field name=\"retryHandler\"/>\n\t\t<field name=\"reuseStrategy\"/>\n\t\t<field name=\"routePlanner\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/client/DefaultTargetAuthenticationHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/client/AbstractAuthenticationHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/client/DefaultUserTokenHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/client/UserTokenHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/client/EntityEnclosingRequestWrapper\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/client/RequestWrapper\"/>\n\t\t<implements name=\"org/apache/http/HttpEntityEnclosingRequest\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/HttpEntityEnclosingRequest;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/client/RedirectLocations\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"add(Ljava/net/URI;)V\"/>\n\t\t<method name=\"contains(Ljava/net/URI;)Z\"/>\n\t\t<method name=\"remove(Ljava/net/URI;)Z\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/client/RequestWrapper\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/message/AbstractHttpMessage\"/>\n\t\t<implements name=\"org/apache/http/client/methods/HttpUriRequest\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/HttpRequest;)V\"/>\n\t\t<method name=\"getExecCount()I\"/>\n\t\t<method name=\"getOriginal()Lorg/apache/http/HttpRequest;\"/>\n\t\t<method name=\"incrementExecCount()V\"/>\n\t\t<method name=\"isRepeatable()Z\"/>\n\t\t<method name=\"resetHeaders()V\"/>\n\t\t<method name=\"setMethod(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setProtocolVersion(Lorg/apache/http/ProtocolVersion;)V\"/>\n\t\t<method name=\"setURI(Ljava/net/URI;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/client/RoutedRequest\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/impl/client/RequestWrapper;Lorg/apache/http/conn/routing/HttpRoute;)V\"/>\n\t\t<method name=\"getRequest()Lorg/apache/http/impl/client/RequestWrapper;\"/>\n\t\t<method name=\"getRoute()Lorg/apache/http/conn/routing/HttpRoute;\"/>\n\t\t<field name=\"request\"/>\n\t\t<field name=\"route\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/client/TunnelRefusedException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/HttpException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Lorg/apache/http/HttpResponse;)V\"/>\n\t\t<method name=\"getResponse()Lorg/apache/http/HttpResponse;\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/AbstractClientConnAdapter\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/conn/ManagedClientConnection\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/conn/ClientConnectionManager;Lorg/apache/http/conn/OperatedClientConnection;)V\"/>\n\t\t<method name=\"assertNotAborted()V\"/>\n\t\t<method name=\"assertValid(Lorg/apache/http/conn/OperatedClientConnection;)V\"/>\n\t\t<method name=\"detach()V\"/>\n\t\t<method name=\"getManager()Lorg/apache/http/conn/ClientConnectionManager;\"/>\n\t\t<method name=\"getWrappedConnection()Lorg/apache/http/conn/OperatedClientConnection;\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/AbstractPoolEntry\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/conn/ClientConnectionOperator;Lorg/apache/http/conn/routing/HttpRoute;)V\"/>\n\t\t<method name=\"getState()Ljava/lang/Object;\"/>\n\t\t<method name=\"layerProtocol(Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"open(Lorg/apache/http/conn/routing/HttpRoute;Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"setState(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"shutdownEntry()V\"/>\n\t\t<method name=\"tunnelProxy(Lorg/apache/http/HttpHost;ZLorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"tunnelTarget(ZLorg/apache/http/params/HttpParams;)V\"/>\n\t\t<field name=\"connOperator\"/>\n\t\t<field name=\"connection\"/>\n\t\t<field name=\"route\"/>\n\t\t<field name=\"state\"/>\n\t\t<field name=\"tracker\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/AbstractPooledConnAdapter\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/conn/AbstractClientConnAdapter\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/conn/ClientConnectionManager;Lorg/apache/http/impl/conn/AbstractPoolEntry;)V\"/>\n\t\t<method name=\"assertAttached()V\"/>\n\t\t<field name=\"poolEntry\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/DefaultClientConnection\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/SocketHttpClientConnection\"/>\n\t\t<implements name=\"org/apache/http/conn/OperatedClientConnection\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/DefaultClientConnectionOperator\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/conn/ClientConnectionOperator\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/conn/scheme/SchemeRegistry;)V\"/>\n\t\t<method name=\"prepareSocket(Ljava/net/Socket;Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<field name=\"schemeRegistry\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/DefaultHttpRoutePlanner\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/conn/routing/HttpRoutePlanner\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/conn/scheme/SchemeRegistry;)V\"/>\n\t\t<field name=\"schemeRegistry\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/DefaultResponseParser\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/io/AbstractMessageParser\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/message/LineParser;Lorg/apache/http/HttpResponseFactory;Lorg/apache/http/params/HttpParams;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/IdleConnectionHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"add(Lorg/apache/http/HttpConnection;JLjava/util/concurrent/TimeUnit;)V\"/>\n\t\t<method name=\"closeExpiredConnections()V\"/>\n\t\t<method name=\"closeIdleConnections(J)V\"/>\n\t\t<method name=\"remove(Lorg/apache/http/HttpConnection;)Z\"/>\n\t\t<method name=\"removeAll()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/LoggingSessionInputBuffer\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/io/SessionInputBuffer\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/impl/conn/Wire;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/LoggingSessionOutputBuffer\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/io/SessionOutputBuffer\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/impl/conn/Wire;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/ProxySelectorRoutePlanner\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/conn/routing/HttpRoutePlanner\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/conn/scheme/SchemeRegistry;Ljava/net/ProxySelector;)V\"/>\n\t\t<method name=\"chooseProxy(Ljava/util/List;Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)Ljava/net/Proxy;\"/>\n\t\t<method name=\"determineProxy(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpHost;\"/>\n\t\t<method name=\"getHost(Ljava/net/InetSocketAddress;)Ljava/lang/String;\"/>\n\t\t<method name=\"getProxySelector()Ljava/net/ProxySelector;\"/>\n\t\t<method name=\"setProxySelector(Ljava/net/ProxySelector;)V\"/>\n\t\t<field name=\"proxySelector\"/>\n\t\t<field name=\"schemeRegistry\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/SingleClientConnManager\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/conn/ClientConnectionManager\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/params/HttpParams;Lorg/apache/http/conn/scheme/SchemeRegistry;)V\"/>\n\t\t<method name=\"assertStillUp()V\"/>\n\t\t<method name=\"createConnectionOperator(Lorg/apache/http/conn/scheme/SchemeRegistry;)Lorg/apache/http/conn/ClientConnectionOperator;\"/>\n\t\t<method name=\"getConnection(Lorg/apache/http/conn/routing/HttpRoute;Ljava/lang/Object;)Lorg/apache/http/conn/ManagedClientConnection;\"/>\n\t\t<method name=\"revokeConnection()V\"/>\n\t\t<field name=\"MISUSE_MESSAGE\"/>\n\t\t<field name=\"alwaysShutDown\"/>\n\t\t<field name=\"connOperator\"/>\n\t\t<field name=\"connectionExpiresTime\"/>\n\t\t<field name=\"isShutDown\"/>\n\t\t<field name=\"lastReleaseTime\"/>\n\t\t<field name=\"managedConn\"/>\n\t\t<field name=\"schemeRegistry\"/>\n\t\t<field name=\"uniquePoolEntry\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/SingleClientConnManager$ConnAdapter\" since=\"1\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/conn/AbstractPooledConnAdapter\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/impl/conn/SingleClientConnManager;Lorg/apache/http/impl/conn/SingleClientConnManager$PoolEntry;Lorg/apache/http/conn/routing/HttpRoute;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/SingleClientConnManager$PoolEntry\" since=\"1\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/conn/AbstractPoolEntry\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/impl/conn/SingleClientConnManager;)V\"/>\n\t\t<method name=\"close()V\"/>\n\t\t<method name=\"shutdown()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/Wire\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/commons/logging/Log;)V\"/>\n\t\t<method name=\"enabled()Z\"/>\n\t\t<method name=\"input(I)V\"/>\n\t\t<method name=\"input(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"input(Ljava/lang/String;)V\"/>\n\t\t<method name=\"input([B)V\"/>\n\t\t<method name=\"input([BII)V\"/>\n\t\t<method name=\"output(I)V\"/>\n\t\t<method name=\"output(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"output(Ljava/lang/String;)V\"/>\n\t\t<method name=\"output([B)V\"/>\n\t\t<method name=\"output([BII)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/tsccm/AbstractConnPool\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/impl/conn/tsccm/RefQueueHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"closeConnection(Lorg/apache/http/conn/OperatedClientConnection;)V\"/>\n\t\t<method name=\"closeExpiredConnections()V\"/>\n\t\t<method name=\"closeIdleConnections(JLjava/util/concurrent/TimeUnit;)V\"/>\n\t\t<method name=\"deleteClosedConnections()V\"/>\n\t\t<method name=\"enableConnectionGC()V\"/>\n\t\t<method name=\"freeEntry(Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;ZJLjava/util/concurrent/TimeUnit;)V\"/>\n\t\t<method name=\"getEntry(Lorg/apache/http/conn/routing/HttpRoute;Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;\"/>\n\t\t<method name=\"handleLostEntry(Lorg/apache/http/conn/routing/HttpRoute;)V\"/>\n\t\t<method name=\"requestPoolEntry(Lorg/apache/http/conn/routing/HttpRoute;Ljava/lang/Object;)Lorg/apache/http/impl/conn/tsccm/PoolEntryRequest;\"/>\n\t\t<method name=\"shutdown()V\"/>\n\t\t<field name=\"idleConnHandler\"/>\n\t\t<field name=\"isShutDown\"/>\n\t\t<field name=\"issuedConnections\"/>\n\t\t<field name=\"numConnections\"/>\n\t\t<field name=\"poolLock\"/>\n\t\t<field name=\"refQueue\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/tsccm/BasicPoolEntry\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/conn/AbstractPoolEntry\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/conn/ClientConnectionOperator;Lorg/apache/http/conn/routing/HttpRoute;Ljava/lang/ref/ReferenceQueue;)V\"/>\n\t\t<method name=\"getConnection()Lorg/apache/http/conn/OperatedClientConnection;\"/>\n\t\t<method name=\"getPlannedRoute()Lorg/apache/http/conn/routing/HttpRoute;\"/>\n\t\t<method name=\"getWeakRef()Lorg/apache/http/impl/conn/tsccm/BasicPoolEntryRef;\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/tsccm/BasicPoolEntryRef\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/ref/WeakReference\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;Ljava/lang/ref/ReferenceQueue;)V\"/>\n\t\t<method name=\"getRoute()Lorg/apache/http/conn/routing/HttpRoute;\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/tsccm/BasicPooledConnAdapter\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/conn/AbstractPooledConnAdapter\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/impl/conn/tsccm/ThreadSafeClientConnManager;Lorg/apache/http/impl/conn/AbstractPoolEntry;)V\"/>\n\t\t<method name=\"getPoolEntry()Lorg/apache/http/impl/conn/AbstractPoolEntry;\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/tsccm/ConnPoolByRoute\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/conn/tsccm/AbstractConnPool\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/conn/ClientConnectionOperator;Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"createEntry(Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;Lorg/apache/http/conn/ClientConnectionOperator;)Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;\"/>\n\t\t<method name=\"createFreeConnQueue()Ljava/util/Queue;\"/>\n\t\t<method name=\"createRouteToPoolMap()Ljava/util/Map;\"/>\n\t\t<method name=\"createWaitingThreadQueue()Ljava/util/Queue;\"/>\n\t\t<method name=\"deleteEntry(Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;)V\"/>\n\t\t<method name=\"deleteLeastUsedEntry()V\"/>\n\t\t<method name=\"getConnectionsInPool(Lorg/apache/http/conn/routing/HttpRoute;)I\"/>\n\t\t<method name=\"getEntryBlocking(Lorg/apache/http/conn/routing/HttpRoute;Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;Lorg/apache/http/impl/conn/tsccm/WaitingThreadAborter;)Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;\"/>\n\t\t<method name=\"getFreeEntry(Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;Ljava/lang/Object;)Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;\"/>\n\t\t<method name=\"getRoutePool(Lorg/apache/http/conn/routing/HttpRoute;Z)Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;\"/>\n\t\t<method name=\"newRouteSpecificPool(Lorg/apache/http/conn/routing/HttpRoute;)Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;\"/>\n\t\t<method name=\"newWaitingThread(Ljava/util/concurrent/locks/Condition;Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;)Lorg/apache/http/impl/conn/tsccm/WaitingThread;\"/>\n\t\t<method name=\"notifyWaitingThread(Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;)V\"/>\n\t\t<field name=\"freeConnections\"/>\n\t\t<field name=\"maxTotalConnections\"/>\n\t\t<field name=\"operator\"/>\n\t\t<field name=\"routeToPool\"/>\n\t\t<field name=\"waitingThreads\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/tsccm/PoolEntryRequest\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"abortRequest()V\"/>\n\t\t<method name=\"getPoolEntry(JLjava/util/concurrent/TimeUnit;)Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/tsccm/RefQueueHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"handleReference(Ljava/lang/ref/Reference;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/tsccm/RefQueueWorker\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Runnable\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/ref/ReferenceQueue;Lorg/apache/http/impl/conn/tsccm/RefQueueHandler;)V\"/>\n\t\t<method name=\"shutdown()V\"/>\n\t\t<field name=\"refHandler\"/>\n\t\t<field name=\"refQueue\"/>\n\t\t<field name=\"workerThread\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/tsccm/RouteSpecificPool\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/conn/routing/HttpRoute;I)V\"/>\n\t\t<method name=\"allocEntry(Ljava/lang/Object;)Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;\"/>\n\t\t<method name=\"createdEntry(Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;)V\"/>\n\t\t<method name=\"deleteEntry(Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;)Z\"/>\n\t\t<method name=\"dropEntry()V\"/>\n\t\t<method name=\"freeEntry(Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;)V\"/>\n\t\t<method name=\"getCapacity()I\"/>\n\t\t<method name=\"getEntryCount()I\"/>\n\t\t<method name=\"getMaxEntries()I\"/>\n\t\t<method name=\"getRoute()Lorg/apache/http/conn/routing/HttpRoute;\"/>\n\t\t<method name=\"hasThread()Z\"/>\n\t\t<method name=\"isUnused()Z\"/>\n\t\t<method name=\"nextThread()Lorg/apache/http/impl/conn/tsccm/WaitingThread;\"/>\n\t\t<method name=\"queueThread(Lorg/apache/http/impl/conn/tsccm/WaitingThread;)V\"/>\n\t\t<method name=\"removeThread(Lorg/apache/http/impl/conn/tsccm/WaitingThread;)V\"/>\n\t\t<field name=\"freeEntries\"/>\n\t\t<field name=\"maxEntries\"/>\n\t\t<field name=\"numEntries\"/>\n\t\t<field name=\"route\"/>\n\t\t<field name=\"waitingThreads\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/tsccm/ThreadSafeClientConnManager\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/conn/ClientConnectionManager\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/params/HttpParams;Lorg/apache/http/conn/scheme/SchemeRegistry;)V\"/>\n\t\t<method name=\"createConnectionOperator(Lorg/apache/http/conn/scheme/SchemeRegistry;)Lorg/apache/http/conn/ClientConnectionOperator;\"/>\n\t\t<method name=\"createConnectionPool(Lorg/apache/http/params/HttpParams;)Lorg/apache/http/impl/conn/tsccm/AbstractConnPool;\"/>\n\t\t<method name=\"getConnectionsInPool()I\"/>\n\t\t<method name=\"getConnectionsInPool(Lorg/apache/http/conn/routing/HttpRoute;)I\"/>\n\t\t<field name=\"connOperator\"/>\n\t\t<field name=\"connectionPool\"/>\n\t\t<field name=\"schemeRegistry\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/tsccm/WaitingThread\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/concurrent/locks/Condition;Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;)V\"/>\n\t\t<method name=\"await(Ljava/util/Date;)Z\"/>\n\t\t<method name=\"getCondition()Ljava/util/concurrent/locks/Condition;\"/>\n\t\t<method name=\"getPool()Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;\"/>\n\t\t<method name=\"getThread()Ljava/lang/Thread;\"/>\n\t\t<method name=\"interrupt()V\"/>\n\t\t<method name=\"wakeup()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/conn/tsccm/WaitingThreadAborter\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"abort()V\"/>\n\t\t<method name=\"setWaitingThread(Lorg/apache/http/impl/conn/tsccm/WaitingThread;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/AbstractCookieAttributeHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/cookie/CookieAttributeHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/AbstractCookieSpec\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/cookie/CookieSpec\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"findAttribHandler(Ljava/lang/String;)Lorg/apache/http/cookie/CookieAttributeHandler;\"/>\n\t\t<method name=\"getAttribHandler(Ljava/lang/String;)Lorg/apache/http/cookie/CookieAttributeHandler;\"/>\n\t\t<method name=\"getAttribHandlers()Ljava/util/Collection;\"/>\n\t\t<method name=\"registerAttribHandler(Ljava/lang/String;Lorg/apache/http/cookie/CookieAttributeHandler;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/BasicClientCookie\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"org/apache/http/cookie/ClientCookie\"/>\n\t\t<implements name=\"org/apache/http/cookie/SetCookie\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setAttribute(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/BasicClientCookie2\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/cookie/BasicClientCookie\"/>\n\t\t<implements name=\"org/apache/http/cookie/SetCookie2\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/BasicCommentHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/cookie/AbstractCookieAttributeHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/BasicDomainHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/cookie/CookieAttributeHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/BasicExpiresHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/cookie/AbstractCookieAttributeHandler\"/>\n\t\t<method name=\"&lt;init>([Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/BasicMaxAgeHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/cookie/AbstractCookieAttributeHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/BasicPathHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/cookie/CookieAttributeHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/BasicSecureHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/cookie/AbstractCookieAttributeHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/BestMatchSpec\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/cookie/CookieSpec\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>([Ljava/lang/String;Z)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/BestMatchSpecFactory\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/cookie/CookieSpecFactory\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/BrowserCompatSpec\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/cookie/CookieSpecBase\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>([Ljava/lang/String;)V\"/>\n\t\t<field name=\"DATE_PATTERNS\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/BrowserCompatSpecFactory\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/cookie/CookieSpecFactory\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/CookieSpecBase\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/cookie/AbstractCookieSpec\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getDefaultDomain(Lorg/apache/http/cookie/CookieOrigin;)Ljava/lang/String;\"/>\n\t\t<method name=\"getDefaultPath(Lorg/apache/http/cookie/CookieOrigin;)Ljava/lang/String;\"/>\n\t\t<method name=\"parse([Lorg/apache/http/HeaderElement;Lorg/apache/http/cookie/CookieOrigin;)Ljava/util/List;\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/DateParseException\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/DateUtils\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"formatDate(Ljava/util/Date;)Ljava/lang/String;\"/>\n\t\t<method name=\"formatDate(Ljava/util/Date;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"parseDate(Ljava/lang/String;)Ljava/util/Date;\"/>\n\t\t<method name=\"parseDate(Ljava/lang/String;[Ljava/lang/String;)Ljava/util/Date;\"/>\n\t\t<method name=\"parseDate(Ljava/lang/String;[Ljava/lang/String;Ljava/util/Date;)Ljava/util/Date;\"/>\n\t\t<field name=\"GMT\"/>\n\t\t<field name=\"PATTERN_ASCTIME\"/>\n\t\t<field name=\"PATTERN_RFC1036\"/>\n\t\t<field name=\"PATTERN_RFC1123\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/NetscapeDomainHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/cookie/BasicDomainHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/NetscapeDraftHeaderParser\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"parseHeader(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)Lorg/apache/http/HeaderElement;\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/NetscapeDraftSpec\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/cookie/CookieSpecBase\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>([Ljava/lang/String;)V\"/>\n\t\t<field name=\"EXPIRES_PATTERN\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/NetscapeDraftSpecFactory\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/cookie/CookieSpecFactory\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/RFC2109DomainHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/cookie/CookieAttributeHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/RFC2109Spec\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/cookie/CookieSpecBase\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>([Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"formatCookieAsVer(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/cookie/Cookie;I)V\"/>\n\t\t<method name=\"formatParamAsVer(Lorg/apache/http/util/CharArrayBuffer;Ljava/lang/String;Ljava/lang/String;I)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/RFC2109SpecFactory\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/cookie/CookieSpecFactory\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/RFC2109VersionHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/cookie/AbstractCookieAttributeHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/RFC2965CommentUrlAttributeHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/cookie/CookieAttributeHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/RFC2965DiscardAttributeHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/cookie/CookieAttributeHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/RFC2965DomainAttributeHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/cookie/CookieAttributeHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"domainMatch(Ljava/lang/String;Ljava/lang/String;)Z\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/RFC2965PortAttributeHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/cookie/CookieAttributeHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/RFC2965Spec\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/cookie/RFC2109Spec\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>([Ljava/lang/String;Z)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/RFC2965SpecFactory\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/cookie/CookieSpecFactory\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/cookie/RFC2965VersionAttributeHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/cookie/CookieAttributeHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/entity/EntityDeserializer\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/entity/ContentLengthStrategy;)V\"/>\n\t\t<method name=\"deserialize(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/HttpMessage;)Lorg/apache/http/HttpEntity;\"/>\n\t\t<method name=\"doDeserialize(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/HttpMessage;)Lorg/apache/http/entity/BasicHttpEntity;\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/entity/EntitySerializer\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/entity/ContentLengthStrategy;)V\"/>\n\t\t<method name=\"doSerialize(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/HttpMessage;)Ljava/io/OutputStream;\"/>\n\t\t<method name=\"serialize(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/HttpMessage;Lorg/apache/http/HttpEntity;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/entity/LaxContentLengthStrategy\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/entity/ContentLengthStrategy\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/entity/StrictContentLengthStrategy\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/entity/ContentLengthStrategy\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/io/AbstractMessageParser\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/io/HttpMessageParser\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/message/LineParser;Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"parseHead(Lorg/apache/http/io/SessionInputBuffer;)Lorg/apache/http/HttpMessage;\"/>\n\t\t<method name=\"parseHeaders(Lorg/apache/http/io/SessionInputBuffer;IILorg/apache/http/message/LineParser;)[Lorg/apache/http/Header;\"/>\n\t\t<field name=\"lineParser\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/io/AbstractMessageWriter\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/io/HttpMessageWriter\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/message/LineFormatter;Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"writeHeadLine(Lorg/apache/http/HttpMessage;)V\"/>\n\t\t<field name=\"lineBuf\"/>\n\t\t<field name=\"lineFormatter\"/>\n\t\t<field name=\"sessionBuffer\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/io/AbstractSessionInputBuffer\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/io/SessionInputBuffer\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"fillBuffer()I\"/>\n\t\t<method name=\"hasBufferedData()Z\"/>\n\t\t<method name=\"init(Ljava/io/InputStream;ILorg/apache/http/params/HttpParams;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/io/AbstractSessionOutputBuffer\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/io/SessionOutputBuffer\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"flushBuffer()V\"/>\n\t\t<method name=\"init(Ljava/io/OutputStream;ILorg/apache/http/params/HttpParams;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/io/ChunkedInputStream\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/io/InputStream\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/io/SessionInputBuffer;)V\"/>\n\t\t<method name=\"getFooters()[Lorg/apache/http/Header;\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/io/ChunkedOutputStream\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/io/OutputStream\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;I)V\"/>\n\t\t<method name=\"finish()V\"/>\n\t\t<method name=\"flushCache()V\"/>\n\t\t<method name=\"flushCacheWithAppend([BII)V\"/>\n\t\t<method name=\"writeClosingChunk()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/io/ContentLengthInputStream\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/io/InputStream\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/io/SessionInputBuffer;J)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/io/ContentLengthOutputStream\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/io/OutputStream\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;J)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/io/HttpRequestParser\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/io/AbstractMessageParser\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/message/LineParser;Lorg/apache/http/HttpRequestFactory;Lorg/apache/http/params/HttpParams;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/io/HttpRequestWriter\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/io/AbstractMessageWriter\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/message/LineFormatter;Lorg/apache/http/params/HttpParams;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/io/HttpResponseParser\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/io/AbstractMessageParser\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/message/LineParser;Lorg/apache/http/HttpResponseFactory;Lorg/apache/http/params/HttpParams;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/io/HttpResponseWriter\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/io/AbstractMessageWriter\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/message/LineFormatter;Lorg/apache/http/params/HttpParams;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/io/HttpTransportMetricsImpl\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/io/HttpTransportMetrics\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"incrementBytesTransferred(J)V\"/>\n\t\t<method name=\"setBytesTransferred(J)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/io/IdentityInputStream\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/io/InputStream\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/io/SessionInputBuffer;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/io/IdentityOutputStream\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/io/OutputStream\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/io/SocketInputBuffer\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/io/AbstractSessionInputBuffer\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/Socket;ILorg/apache/http/params/HttpParams;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/impl/io/SocketOutputBuffer\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/impl/io/AbstractSessionOutputBuffer\"/>\n\t\t<method name=\"&lt;init>(Ljava/net/Socket;ILorg/apache/http/params/HttpParams;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/io/HttpMessageParser\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"parse()Lorg/apache/http/HttpMessage;\"/>\n\t</class>\n\t<class name=\"org/apache/http/io/HttpMessageWriter\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"write(Lorg/apache/http/HttpMessage;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/io/HttpTransportMetrics\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getBytesTransferred()J\"/>\n\t\t<method name=\"reset()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/io/SessionInputBuffer\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getMetrics()Lorg/apache/http/io/HttpTransportMetrics;\"/>\n\t\t<method name=\"isDataAvailable(I)Z\"/>\n\t\t<method name=\"read()I\"/>\n\t\t<method name=\"read([B)I\"/>\n\t\t<method name=\"read([BII)I\"/>\n\t\t<method name=\"readLine()Ljava/lang/String;\"/>\n\t\t<method name=\"readLine(Lorg/apache/http/util/CharArrayBuffer;)I\"/>\n\t</class>\n\t<class name=\"org/apache/http/io/SessionOutputBuffer\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"flush()V\"/>\n\t\t<method name=\"getMetrics()Lorg/apache/http/io/HttpTransportMetrics;\"/>\n\t\t<method name=\"write(I)V\"/>\n\t\t<method name=\"write([B)V\"/>\n\t\t<method name=\"write([BII)V\"/>\n\t\t<method name=\"writeLine(Ljava/lang/String;)V\"/>\n\t\t<method name=\"writeLine(Lorg/apache/http/util/CharArrayBuffer;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/AbstractHttpMessage\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpMessage\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<field name=\"headergroup\"/>\n\t\t<field name=\"params\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/BasicHeader\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"org/apache/http/Header\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/BasicHeaderElement\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"org/apache/http/HeaderElement\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;[Lorg/apache/http/NameValuePair;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/BasicHeaderElementIterator\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HeaderElementIterator\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/HeaderIterator;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/HeaderIterator;Lorg/apache/http/message/HeaderValueParser;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/BasicHeaderIterator\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HeaderIterator\"/>\n\t\t<method name=\"&lt;init>([Lorg/apache/http/Header;Ljava/lang/String;)V\"/>\n\t\t<method name=\"filterHeader(I)Z\"/>\n\t\t<method name=\"findNext(I)I\"/>\n\t\t<field name=\"allHeaders\"/>\n\t\t<field name=\"currentIndex\"/>\n\t\t<field name=\"headerName\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/BasicHeaderValueFormatter\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/message/HeaderValueFormatter\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"doFormatValue(Lorg/apache/http/util/CharArrayBuffer;Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"estimateElementsLen([Lorg/apache/http/HeaderElement;)I\"/>\n\t\t<method name=\"estimateHeaderElementLen(Lorg/apache/http/HeaderElement;)I\"/>\n\t\t<method name=\"estimateNameValuePairLen(Lorg/apache/http/NameValuePair;)I\"/>\n\t\t<method name=\"estimateParametersLen([Lorg/apache/http/NameValuePair;)I\"/>\n\t\t<method name=\"formatElements([Lorg/apache/http/HeaderElement;ZLorg/apache/http/message/HeaderValueFormatter;)Ljava/lang/String;\"/>\n\t\t<method name=\"formatHeaderElement(Lorg/apache/http/HeaderElement;ZLorg/apache/http/message/HeaderValueFormatter;)Ljava/lang/String;\"/>\n\t\t<method name=\"formatNameValuePair(Lorg/apache/http/NameValuePair;ZLorg/apache/http/message/HeaderValueFormatter;)Ljava/lang/String;\"/>\n\t\t<method name=\"formatParameters([Lorg/apache/http/NameValuePair;ZLorg/apache/http/message/HeaderValueFormatter;)Ljava/lang/String;\"/>\n\t\t<method name=\"isSeparator(C)Z\"/>\n\t\t<method name=\"isUnsafe(C)Z\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t\t<field name=\"SEPARATORS\"/>\n\t\t<field name=\"UNSAFE_CHARS\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/BasicHeaderValueParser\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/message/HeaderValueParser\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"createHeaderElement(Ljava/lang/String;Ljava/lang/String;[Lorg/apache/http/NameValuePair;)Lorg/apache/http/HeaderElement;\"/>\n\t\t<method name=\"createNameValuePair(Ljava/lang/String;Ljava/lang/String;)Lorg/apache/http/NameValuePair;\"/>\n\t\t<method name=\"parseElements(Ljava/lang/String;Lorg/apache/http/message/HeaderValueParser;)[Lorg/apache/http/HeaderElement;\"/>\n\t\t<method name=\"parseHeaderElement(Ljava/lang/String;Lorg/apache/http/message/HeaderValueParser;)Lorg/apache/http/HeaderElement;\"/>\n\t\t<method name=\"parseNameValuePair(Ljava/lang/String;Lorg/apache/http/message/HeaderValueParser;)Lorg/apache/http/NameValuePair;\"/>\n\t\t<method name=\"parseNameValuePair(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;[C)Lorg/apache/http/NameValuePair;\"/>\n\t\t<method name=\"parseParameters(Ljava/lang/String;Lorg/apache/http/message/HeaderValueParser;)[Lorg/apache/http/NameValuePair;\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/BasicHttpEntityEnclosingRequest\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/message/BasicHttpRequest\"/>\n\t\t<implements name=\"org/apache/http/HttpEntityEnclosingRequest\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Lorg/apache/http/ProtocolVersion;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/RequestLine;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/BasicHttpRequest\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/message/AbstractHttpMessage\"/>\n\t\t<implements name=\"org/apache/http/HttpRequest\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Lorg/apache/http/ProtocolVersion;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/RequestLine;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/BasicHttpResponse\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/message/AbstractHttpMessage\"/>\n\t\t<implements name=\"org/apache/http/HttpResponse\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/ProtocolVersion;ILjava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/StatusLine;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/StatusLine;Lorg/apache/http/ReasonPhraseCatalog;Ljava/util/Locale;)V\"/>\n\t\t<method name=\"getReason(I)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/BasicLineFormatter\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/message/LineFormatter\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"doFormatHeader(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/Header;)V\"/>\n\t\t<method name=\"doFormatRequestLine(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/RequestLine;)V\"/>\n\t\t<method name=\"doFormatStatusLine(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/StatusLine;)V\"/>\n\t\t<method name=\"estimateProtocolVersionLen(Lorg/apache/http/ProtocolVersion;)I\"/>\n\t\t<method name=\"formatHeader(Lorg/apache/http/Header;Lorg/apache/http/message/LineFormatter;)Ljava/lang/String;\"/>\n\t\t<method name=\"formatProtocolVersion(Lorg/apache/http/ProtocolVersion;Lorg/apache/http/message/LineFormatter;)Ljava/lang/String;\"/>\n\t\t<method name=\"formatRequestLine(Lorg/apache/http/RequestLine;Lorg/apache/http/message/LineFormatter;)Ljava/lang/String;\"/>\n\t\t<method name=\"formatStatusLine(Lorg/apache/http/StatusLine;Lorg/apache/http/message/LineFormatter;)Ljava/lang/String;\"/>\n\t\t<method name=\"initBuffer(Lorg/apache/http/util/CharArrayBuffer;)Lorg/apache/http/util/CharArrayBuffer;\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/BasicLineParser\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/message/LineParser\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/ProtocolVersion;)V\"/>\n\t\t<method name=\"createProtocolVersion(II)Lorg/apache/http/ProtocolVersion;\"/>\n\t\t<method name=\"createRequestLine(Ljava/lang/String;Ljava/lang/String;Lorg/apache/http/ProtocolVersion;)Lorg/apache/http/RequestLine;\"/>\n\t\t<method name=\"createStatusLine(Lorg/apache/http/ProtocolVersion;ILjava/lang/String;)Lorg/apache/http/StatusLine;\"/>\n\t\t<method name=\"parseHeader(Ljava/lang/String;Lorg/apache/http/message/LineParser;)Lorg/apache/http/Header;\"/>\n\t\t<method name=\"parseProtocolVersion(Ljava/lang/String;Lorg/apache/http/message/LineParser;)Lorg/apache/http/ProtocolVersion;\"/>\n\t\t<method name=\"parseRequestLine(Ljava/lang/String;Lorg/apache/http/message/LineParser;)Lorg/apache/http/RequestLine;\"/>\n\t\t<method name=\"parseStatusLine(Ljava/lang/String;Lorg/apache/http/message/LineParser;)Lorg/apache/http/StatusLine;\"/>\n\t\t<method name=\"skipWhitespace(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)V\"/>\n\t\t<field name=\"DEFAULT\"/>\n\t\t<field name=\"protocol\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/BasicListHeaderIterator\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HeaderIterator\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/List;Ljava/lang/String;)V\"/>\n\t\t<method name=\"filterHeader(I)Z\"/>\n\t\t<method name=\"findNext(I)I\"/>\n\t\t<field name=\"allHeaders\"/>\n\t\t<field name=\"currentIndex\"/>\n\t\t<field name=\"headerName\"/>\n\t\t<field name=\"lastIndex\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/BasicNameValuePair\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"org/apache/http/NameValuePair\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/BasicRequestLine\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"org/apache/http/RequestLine\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Lorg/apache/http/ProtocolVersion;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/BasicStatusLine\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"org/apache/http/StatusLine\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/ProtocolVersion;ILjava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/BasicTokenIterator\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/TokenIterator\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/HeaderIterator;)V\"/>\n\t\t<method name=\"createToken(Ljava/lang/String;II)Ljava/lang/String;\"/>\n\t\t<method name=\"findNext(I)I\"/>\n\t\t<method name=\"findTokenEnd(I)I\"/>\n\t\t<method name=\"findTokenSeparator(I)I\"/>\n\t\t<method name=\"findTokenStart(I)I\"/>\n\t\t<method name=\"isHttpSeparator(C)Z\"/>\n\t\t<method name=\"isTokenChar(C)Z\"/>\n\t\t<method name=\"isTokenSeparator(C)Z\"/>\n\t\t<method name=\"isWhitespace(C)Z\"/>\n\t\t<field name=\"HTTP_SEPARATORS\"/>\n\t\t<field name=\"currentHeader\"/>\n\t\t<field name=\"currentToken\"/>\n\t\t<field name=\"headerIt\"/>\n\t\t<field name=\"searchPos\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/BufferedHeader\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"org/apache/http/FormattedHeader\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/util/CharArrayBuffer;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/HeaderGroup\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addHeader(Lorg/apache/http/Header;)V\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"containsHeader(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"copy()Lorg/apache/http/message/HeaderGroup;\"/>\n\t\t<method name=\"getAllHeaders()[Lorg/apache/http/Header;\"/>\n\t\t<method name=\"getCondensedHeader(Ljava/lang/String;)Lorg/apache/http/Header;\"/>\n\t\t<method name=\"getFirstHeader(Ljava/lang/String;)Lorg/apache/http/Header;\"/>\n\t\t<method name=\"getHeaders(Ljava/lang/String;)[Lorg/apache/http/Header;\"/>\n\t\t<method name=\"getLastHeader(Ljava/lang/String;)Lorg/apache/http/Header;\"/>\n\t\t<method name=\"iterator()Lorg/apache/http/HeaderIterator;\"/>\n\t\t<method name=\"iterator(Ljava/lang/String;)Lorg/apache/http/HeaderIterator;\"/>\n\t\t<method name=\"removeHeader(Lorg/apache/http/Header;)V\"/>\n\t\t<method name=\"setHeaders([Lorg/apache/http/Header;)V\"/>\n\t\t<method name=\"updateHeader(Lorg/apache/http/Header;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/HeaderValueFormatter\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"formatElements(Lorg/apache/http/util/CharArrayBuffer;[Lorg/apache/http/HeaderElement;Z)Lorg/apache/http/util/CharArrayBuffer;\"/>\n\t\t<method name=\"formatHeaderElement(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/HeaderElement;Z)Lorg/apache/http/util/CharArrayBuffer;\"/>\n\t\t<method name=\"formatNameValuePair(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/NameValuePair;Z)Lorg/apache/http/util/CharArrayBuffer;\"/>\n\t\t<method name=\"formatParameters(Lorg/apache/http/util/CharArrayBuffer;[Lorg/apache/http/NameValuePair;Z)Lorg/apache/http/util/CharArrayBuffer;\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/HeaderValueParser\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"parseElements(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)[Lorg/apache/http/HeaderElement;\"/>\n\t\t<method name=\"parseHeaderElement(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)Lorg/apache/http/HeaderElement;\"/>\n\t\t<method name=\"parseNameValuePair(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)Lorg/apache/http/NameValuePair;\"/>\n\t\t<method name=\"parseParameters(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)[Lorg/apache/http/NameValuePair;\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/LineFormatter\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"appendProtocolVersion(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/ProtocolVersion;)Lorg/apache/http/util/CharArrayBuffer;\"/>\n\t\t<method name=\"formatHeader(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/Header;)Lorg/apache/http/util/CharArrayBuffer;\"/>\n\t\t<method name=\"formatRequestLine(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/RequestLine;)Lorg/apache/http/util/CharArrayBuffer;\"/>\n\t\t<method name=\"formatStatusLine(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/StatusLine;)Lorg/apache/http/util/CharArrayBuffer;\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/LineParser\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"hasProtocolVersion(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)Z\"/>\n\t\t<method name=\"parseHeader(Lorg/apache/http/util/CharArrayBuffer;)Lorg/apache/http/Header;\"/>\n\t\t<method name=\"parseProtocolVersion(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)Lorg/apache/http/ProtocolVersion;\"/>\n\t\t<method name=\"parseRequestLine(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)Lorg/apache/http/RequestLine;\"/>\n\t\t<method name=\"parseStatusLine(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)Lorg/apache/http/StatusLine;\"/>\n\t</class>\n\t<class name=\"org/apache/http/message/ParserCursor\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(II)V\"/>\n\t\t<method name=\"atEnd()Z\"/>\n\t\t<method name=\"getLowerBound()I\"/>\n\t\t<method name=\"getPos()I\"/>\n\t\t<method name=\"getUpperBound()I\"/>\n\t\t<method name=\"updatePos(I)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/params/AbstractHttpParams\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/params/HttpParams\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/params/BasicHttpParams\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/params/AbstractHttpParams\"/>\n\t\t<implements name=\"java/io/Serializable\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"copyParams(Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"isParameterSet(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isParameterSetLocally(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"setParameters([Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/params/CoreConnectionPNames\" since=\"1\" deprecated=\"22\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"CONNECTION_TIMEOUT\" deprecated=\"29\"/>\n\t\t<field name=\"MAX_HEADER_COUNT\" deprecated=\"29\"/>\n\t\t<field name=\"MAX_LINE_LENGTH\" deprecated=\"29\"/>\n\t\t<field name=\"SOCKET_BUFFER_SIZE\" deprecated=\"29\"/>\n\t\t<field name=\"SO_LINGER\" deprecated=\"29\"/>\n\t\t<field name=\"SO_TIMEOUT\" deprecated=\"29\"/>\n\t\t<field name=\"STALE_CONNECTION_CHECK\" deprecated=\"29\"/>\n\t\t<field name=\"TCP_NODELAY\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"org/apache/http/params/CoreProtocolPNames\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"HTTP_CONTENT_CHARSET\"/>\n\t\t<field name=\"HTTP_ELEMENT_CHARSET\"/>\n\t\t<field name=\"ORIGIN_SERVER\"/>\n\t\t<field name=\"PROTOCOL_VERSION\"/>\n\t\t<field name=\"STRICT_TRANSFER_ENCODING\"/>\n\t\t<field name=\"USER_AGENT\"/>\n\t\t<field name=\"USE_EXPECT_CONTINUE\"/>\n\t\t<field name=\"WAIT_FOR_CONTINUE\"/>\n\t</class>\n\t<class name=\"org/apache/http/params/DefaultedHttpParams\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/params/AbstractHttpParams\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/params/HttpParams;Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"getDefaults()Lorg/apache/http/params/HttpParams;\"/>\n\t</class>\n\t<class name=\"org/apache/http/params/HttpAbstractParamBean\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<field name=\"params\"/>\n\t</class>\n\t<class name=\"org/apache/http/params/HttpConnectionParamBean\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/params/HttpAbstractParamBean\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"setConnectionTimeout(I)V\"/>\n\t\t<method name=\"setLinger(I)V\"/>\n\t\t<method name=\"setSoTimeout(I)V\"/>\n\t\t<method name=\"setSocketBufferSize(I)V\"/>\n\t\t<method name=\"setStaleCheckingEnabled(Z)V\"/>\n\t\t<method name=\"setTcpNoDelay(Z)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/params/HttpConnectionParams\" since=\"1\" deprecated=\"22\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/params/CoreConnectionPNames\"/>\n\t\t<method name=\"getConnectionTimeout(Lorg/apache/http/params/HttpParams;)I\" deprecated=\"29\"/>\n\t\t<method name=\"getLinger(Lorg/apache/http/params/HttpParams;)I\" deprecated=\"29\"/>\n\t\t<method name=\"getSoTimeout(Lorg/apache/http/params/HttpParams;)I\" deprecated=\"29\"/>\n\t\t<method name=\"getSocketBufferSize(Lorg/apache/http/params/HttpParams;)I\" deprecated=\"29\"/>\n\t\t<method name=\"getTcpNoDelay(Lorg/apache/http/params/HttpParams;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"isStaleCheckingEnabled(Lorg/apache/http/params/HttpParams;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"setConnectionTimeout(Lorg/apache/http/params/HttpParams;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setLinger(Lorg/apache/http/params/HttpParams;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setSoTimeout(Lorg/apache/http/params/HttpParams;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setSocketBufferSize(Lorg/apache/http/params/HttpParams;I)V\" deprecated=\"29\"/>\n\t\t<method name=\"setStaleCheckingEnabled(Lorg/apache/http/params/HttpParams;Z)V\" deprecated=\"29\"/>\n\t\t<method name=\"setTcpNoDelay(Lorg/apache/http/params/HttpParams;Z)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"org/apache/http/params/HttpParams\" since=\"1\" deprecated=\"22\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"copy()Lorg/apache/http/params/HttpParams;\" deprecated=\"29\"/>\n\t\t<method name=\"getBooleanParameter(Ljava/lang/String;Z)Z\" deprecated=\"29\"/>\n\t\t<method name=\"getDoubleParameter(Ljava/lang/String;D)D\" deprecated=\"29\"/>\n\t\t<method name=\"getIntParameter(Ljava/lang/String;I)I\" deprecated=\"29\"/>\n\t\t<method name=\"getLongParameter(Ljava/lang/String;J)J\" deprecated=\"29\"/>\n\t\t<method name=\"getParameter(Ljava/lang/String;)Ljava/lang/Object;\" deprecated=\"29\"/>\n\t\t<method name=\"isParameterFalse(Ljava/lang/String;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"isParameterTrue(Ljava/lang/String;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"removeParameter(Ljava/lang/String;)Z\" deprecated=\"29\"/>\n\t\t<method name=\"setBooleanParameter(Ljava/lang/String;Z)Lorg/apache/http/params/HttpParams;\" deprecated=\"29\"/>\n\t\t<method name=\"setDoubleParameter(Ljava/lang/String;D)Lorg/apache/http/params/HttpParams;\" deprecated=\"29\"/>\n\t\t<method name=\"setIntParameter(Ljava/lang/String;I)Lorg/apache/http/params/HttpParams;\" deprecated=\"29\"/>\n\t\t<method name=\"setLongParameter(Ljava/lang/String;J)Lorg/apache/http/params/HttpParams;\" deprecated=\"29\"/>\n\t\t<method name=\"setParameter(Ljava/lang/String;Ljava/lang/Object;)Lorg/apache/http/params/HttpParams;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"org/apache/http/params/HttpProtocolParamBean\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/params/HttpAbstractParamBean\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"setContentCharset(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setHttpElementCharset(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setUseExpectContinue(Z)V\"/>\n\t\t<method name=\"setUserAgent(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setVersion(Lorg/apache/http/HttpVersion;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/params/HttpProtocolParams\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/params/CoreProtocolPNames\"/>\n\t\t<method name=\"getContentCharset(Lorg/apache/http/params/HttpParams;)Ljava/lang/String;\"/>\n\t\t<method name=\"getHttpElementCharset(Lorg/apache/http/params/HttpParams;)Ljava/lang/String;\"/>\n\t\t<method name=\"getUserAgent(Lorg/apache/http/params/HttpParams;)Ljava/lang/String;\"/>\n\t\t<method name=\"getVersion(Lorg/apache/http/params/HttpParams;)Lorg/apache/http/ProtocolVersion;\"/>\n\t\t<method name=\"setContentCharset(Lorg/apache/http/params/HttpParams;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setHttpElementCharset(Lorg/apache/http/params/HttpParams;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setUseExpectContinue(Lorg/apache/http/params/HttpParams;Z)V\"/>\n\t\t<method name=\"setUserAgent(Lorg/apache/http/params/HttpParams;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setVersion(Lorg/apache/http/params/HttpParams;Lorg/apache/http/ProtocolVersion;)V\"/>\n\t\t<method name=\"useExpectContinue(Lorg/apache/http/params/HttpParams;)Z\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/BasicHttpContext\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/protocol/HttpContext\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/protocol/HttpContext;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/BasicHttpProcessor\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"java/lang/Cloneable\"/>\n\t\t<implements name=\"org/apache/http/protocol/HttpProcessor\"/>\n\t\t<implements name=\"org/apache/http/protocol/HttpRequestInterceptorList\"/>\n\t\t<implements name=\"org/apache/http/protocol/HttpResponseInterceptorList\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"addInterceptor(Lorg/apache/http/HttpRequestInterceptor;)V\"/>\n\t\t<method name=\"addInterceptor(Lorg/apache/http/HttpRequestInterceptor;I)V\"/>\n\t\t<method name=\"addInterceptor(Lorg/apache/http/HttpResponseInterceptor;)V\"/>\n\t\t<method name=\"addInterceptor(Lorg/apache/http/HttpResponseInterceptor;I)V\"/>\n\t\t<method name=\"clearInterceptors()V\"/>\n\t\t<method name=\"copy()Lorg/apache/http/protocol/BasicHttpProcessor;\"/>\n\t\t<method name=\"copyInterceptors(Lorg/apache/http/protocol/BasicHttpProcessor;)V\"/>\n\t\t<field name=\"requestInterceptors\"/>\n\t\t<field name=\"responseInterceptors\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/DefaultedHttpContext\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/protocol/HttpContext\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/protocol/HttpContext;)V\"/>\n\t\t<method name=\"getDefaults()Lorg/apache/http/protocol/HttpContext;\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/ExecutionContext\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<field name=\"HTTP_CONNECTION\"/>\n\t\t<field name=\"HTTP_PROXY_HOST\"/>\n\t\t<field name=\"HTTP_REQUEST\"/>\n\t\t<field name=\"HTTP_REQ_SENT\"/>\n\t\t<field name=\"HTTP_RESPONSE\"/>\n\t\t<field name=\"HTTP_TARGET_HOST\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/HTTP\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"isWhitespace(C)Z\"/>\n\t\t<field name=\"ASCII\"/>\n\t\t<field name=\"CHARSET_PARAM\"/>\n\t\t<field name=\"CHUNK_CODING\"/>\n\t\t<field name=\"CONN_CLOSE\"/>\n\t\t<field name=\"CONN_DIRECTIVE\"/>\n\t\t<field name=\"CONN_KEEP_ALIVE\"/>\n\t\t<field name=\"CONTENT_ENCODING\"/>\n\t\t<field name=\"CONTENT_LEN\"/>\n\t\t<field name=\"CONTENT_TYPE\"/>\n\t\t<field name=\"CR\"/>\n\t\t<field name=\"DATE_HEADER\"/>\n\t\t<field name=\"DEFAULT_CONTENT_CHARSET\"/>\n\t\t<field name=\"DEFAULT_CONTENT_TYPE\"/>\n\t\t<field name=\"DEFAULT_PROTOCOL_CHARSET\"/>\n\t\t<field name=\"EXPECT_CONTINUE\"/>\n\t\t<field name=\"EXPECT_DIRECTIVE\"/>\n\t\t<field name=\"HT\"/>\n\t\t<field name=\"IDENTITY_CODING\"/>\n\t\t<field name=\"ISO_8859_1\"/>\n\t\t<field name=\"LF\"/>\n\t\t<field name=\"OCTET_STREAM_TYPE\"/>\n\t\t<field name=\"PLAIN_TEXT_TYPE\"/>\n\t\t<field name=\"SERVER_HEADER\"/>\n\t\t<field name=\"SP\"/>\n\t\t<field name=\"TARGET_HOST\"/>\n\t\t<field name=\"TRANSFER_ENCODING\"/>\n\t\t<field name=\"USER_AGENT\"/>\n\t\t<field name=\"US_ASCII\"/>\n\t\t<field name=\"UTF_16\"/>\n\t\t<field name=\"UTF_8\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/HttpContext\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAttribute(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"removeAttribute(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"setAttribute(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<field name=\"RESERVED_PREFIX\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/HttpDateGenerator\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getCurrentDate()Ljava/lang/String;\"/>\n\t\t<field name=\"GMT\"/>\n\t\t<field name=\"PATTERN_RFC1123\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/HttpExpectationVerifier\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"verify(Lorg/apache/http/HttpRequest;Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/HttpProcessor\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpRequestInterceptor\"/>\n\t\t<implements name=\"org/apache/http/HttpResponseInterceptor\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/HttpRequestExecutor\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"canResponseHaveBody(Lorg/apache/http/HttpRequest;Lorg/apache/http/HttpResponse;)Z\"/>\n\t\t<method name=\"doReceiveResponse(Lorg/apache/http/HttpRequest;Lorg/apache/http/HttpClientConnection;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;\"/>\n\t\t<method name=\"doSendRequest(Lorg/apache/http/HttpRequest;Lorg/apache/http/HttpClientConnection;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;\"/>\n\t\t<method name=\"execute(Lorg/apache/http/HttpRequest;Lorg/apache/http/HttpClientConnection;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;\"/>\n\t\t<method name=\"postProcess(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpProcessor;Lorg/apache/http/protocol/HttpContext;)V\"/>\n\t\t<method name=\"preProcess(Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpProcessor;Lorg/apache/http/protocol/HttpContext;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/HttpRequestHandler\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"handle(Lorg/apache/http/HttpRequest;Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/HttpRequestHandlerRegistry\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/protocol/HttpRequestHandlerResolver\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"matchUriRequestPattern(Ljava/lang/String;Ljava/lang/String;)Z\" deprecated=\"15\"/>\n\t\t<method name=\"register(Ljava/lang/String;Lorg/apache/http/protocol/HttpRequestHandler;)V\"/>\n\t\t<method name=\"setHandlers(Ljava/util/Map;)V\"/>\n\t\t<method name=\"unregister(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/HttpRequestHandlerResolver\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"lookup(Ljava/lang/String;)Lorg/apache/http/protocol/HttpRequestHandler;\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/HttpRequestInterceptorList\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addRequestInterceptor(Lorg/apache/http/HttpRequestInterceptor;)V\"/>\n\t\t<method name=\"addRequestInterceptor(Lorg/apache/http/HttpRequestInterceptor;I)V\"/>\n\t\t<method name=\"clearRequestInterceptors()V\"/>\n\t\t<method name=\"getRequestInterceptor(I)Lorg/apache/http/HttpRequestInterceptor;\"/>\n\t\t<method name=\"getRequestInterceptorCount()I\"/>\n\t\t<method name=\"removeRequestInterceptorByClass(Ljava/lang/Class;)V\"/>\n\t\t<method name=\"setInterceptors(Ljava/util/List;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/HttpResponseInterceptorList\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"addResponseInterceptor(Lorg/apache/http/HttpResponseInterceptor;)V\"/>\n\t\t<method name=\"addResponseInterceptor(Lorg/apache/http/HttpResponseInterceptor;I)V\"/>\n\t\t<method name=\"clearResponseInterceptors()V\"/>\n\t\t<method name=\"getResponseInterceptor(I)Lorg/apache/http/HttpResponseInterceptor;\"/>\n\t\t<method name=\"getResponseInterceptorCount()I\"/>\n\t\t<method name=\"removeResponseInterceptorByClass(Ljava/lang/Class;)V\"/>\n\t\t<method name=\"setInterceptors(Ljava/util/List;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/HttpService\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/protocol/HttpProcessor;Lorg/apache/http/ConnectionReuseStrategy;Lorg/apache/http/HttpResponseFactory;)V\"/>\n\t\t<method name=\"doService(Lorg/apache/http/HttpRequest;Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)V\"/>\n\t\t<method name=\"getParams()Lorg/apache/http/params/HttpParams;\"/>\n\t\t<method name=\"handleException(Lorg/apache/http/HttpException;Lorg/apache/http/HttpResponse;)V\"/>\n\t\t<method name=\"handleRequest(Lorg/apache/http/HttpServerConnection;Lorg/apache/http/protocol/HttpContext;)V\"/>\n\t\t<method name=\"setConnReuseStrategy(Lorg/apache/http/ConnectionReuseStrategy;)V\"/>\n\t\t<method name=\"setExpectationVerifier(Lorg/apache/http/protocol/HttpExpectationVerifier;)V\"/>\n\t\t<method name=\"setHandlerResolver(Lorg/apache/http/protocol/HttpRequestHandlerResolver;)V\"/>\n\t\t<method name=\"setHttpProcessor(Lorg/apache/http/protocol/HttpProcessor;)V\"/>\n\t\t<method name=\"setParams(Lorg/apache/http/params/HttpParams;)V\"/>\n\t\t<method name=\"setResponseFactory(Lorg/apache/http/HttpResponseFactory;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/RequestConnControl\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpRequestInterceptor\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/RequestContent\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpRequestInterceptor\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/RequestDate\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpRequestInterceptor\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/RequestExpectContinue\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpRequestInterceptor\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/RequestTargetHost\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpRequestInterceptor\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/RequestUserAgent\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpRequestInterceptor\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/ResponseConnControl\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpResponseInterceptor\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/ResponseContent\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpResponseInterceptor\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/ResponseDate\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpResponseInterceptor\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/ResponseServer\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/apache/http/HttpResponseInterceptor\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/SyncBasicHttpContext\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"org/apache/http/protocol/BasicHttpContext\"/>\n\t\t<method name=\"&lt;init>(Lorg/apache/http/protocol/HttpContext;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/protocol/UriPatternMatcher\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"lookup(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"matchUriRequestPattern(Ljava/lang/String;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"register(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"setHandlers(Ljava/util/Map;)V\"/>\n\t\t<method name=\"unregister(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/util/ByteArrayBuffer\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"append(I)V\"/>\n\t\t<method name=\"append(Lorg/apache/http/util/CharArrayBuffer;II)V\"/>\n\t\t<method name=\"append([BII)V\"/>\n\t\t<method name=\"append([CII)V\"/>\n\t\t<method name=\"buffer()[B\"/>\n\t\t<method name=\"byteAt(I)I\"/>\n\t\t<method name=\"capacity()I\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"isEmpty()Z\"/>\n\t\t<method name=\"isFull()Z\"/>\n\t\t<method name=\"length()I\"/>\n\t\t<method name=\"setLength(I)V\"/>\n\t\t<method name=\"toByteArray()[B\"/>\n\t</class>\n\t<class name=\"org/apache/http/util/CharArrayBuffer\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(I)V\"/>\n\t\t<method name=\"append(C)V\"/>\n\t\t<method name=\"append(Ljava/lang/Object;)V\"/>\n\t\t<method name=\"append(Ljava/lang/String;)V\"/>\n\t\t<method name=\"append(Lorg/apache/http/util/ByteArrayBuffer;II)V\"/>\n\t\t<method name=\"append(Lorg/apache/http/util/CharArrayBuffer;)V\"/>\n\t\t<method name=\"append(Lorg/apache/http/util/CharArrayBuffer;II)V\"/>\n\t\t<method name=\"append([BII)V\"/>\n\t\t<method name=\"append([CII)V\"/>\n\t\t<method name=\"buffer()[C\"/>\n\t\t<method name=\"capacity()I\"/>\n\t\t<method name=\"charAt(I)C\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"ensureCapacity(I)V\"/>\n\t\t<method name=\"indexOf(I)I\"/>\n\t\t<method name=\"indexOf(III)I\"/>\n\t\t<method name=\"isEmpty()Z\"/>\n\t\t<method name=\"isFull()Z\"/>\n\t\t<method name=\"length()I\"/>\n\t\t<method name=\"setLength(I)V\"/>\n\t\t<method name=\"substring(II)Ljava/lang/String;\"/>\n\t\t<method name=\"substringTrimmed(II)Ljava/lang/String;\"/>\n\t\t<method name=\"toCharArray()[C\"/>\n\t</class>\n\t<class name=\"org/apache/http/util/EncodingUtils\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getAsciiBytes(Ljava/lang/String;)[B\"/>\n\t\t<method name=\"getAsciiString([B)Ljava/lang/String;\"/>\n\t\t<method name=\"getAsciiString([BII)Ljava/lang/String;\"/>\n\t\t<method name=\"getBytes(Ljava/lang/String;Ljava/lang/String;)[B\"/>\n\t\t<method name=\"getString([BIILjava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getString([BLjava/lang/String;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/apache/http/util/EntityUtils\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getContentCharSet(Lorg/apache/http/HttpEntity;)Ljava/lang/String;\"/>\n\t\t<method name=\"toByteArray(Lorg/apache/http/HttpEntity;)[B\"/>\n\t\t<method name=\"toString(Lorg/apache/http/HttpEntity;)Ljava/lang/String;\"/>\n\t\t<method name=\"toString(Lorg/apache/http/HttpEntity;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/apache/http/util/ExceptionUtils\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"initCause(Ljava/lang/Throwable;Ljava/lang/Throwable;)V\"/>\n\t</class>\n\t<class name=\"org/apache/http/util/LangUtils\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"equals(Ljava/lang/Object;Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"equals([Ljava/lang/Object;[Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"hashCode(II)I\"/>\n\t\t<method name=\"hashCode(ILjava/lang/Object;)I\"/>\n\t\t<method name=\"hashCode(IZ)I\"/>\n\t\t<field name=\"HASH_OFFSET\"/>\n\t\t<field name=\"HASH_SEED\"/>\n\t</class>\n\t<class name=\"org/apache/http/util/VersionInfo\" since=\"1\" deprecated=\"22\" removed=\"23\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"fromMap(Ljava/lang/String;Ljava/util/Map;Ljava/lang/ClassLoader;)Lorg/apache/http/util/VersionInfo;\"/>\n\t\t<method name=\"getClassloader()Ljava/lang/String;\"/>\n\t\t<method name=\"getModule()Ljava/lang/String;\"/>\n\t\t<method name=\"getPackage()Ljava/lang/String;\"/>\n\t\t<method name=\"getRelease()Ljava/lang/String;\"/>\n\t\t<method name=\"getTimestamp()Ljava/lang/String;\"/>\n\t\t<method name=\"loadVersionInfo(Ljava/lang/String;Ljava/lang/ClassLoader;)Lorg/apache/http/util/VersionInfo;\"/>\n\t\t<method name=\"loadVersionInfo([Ljava/lang/String;Ljava/lang/ClassLoader;)[Lorg/apache/http/util/VersionInfo;\"/>\n\t\t<field name=\"PROPERTY_MODULE\"/>\n\t\t<field name=\"PROPERTY_RELEASE\"/>\n\t\t<field name=\"PROPERTY_TIMESTAMP\"/>\n\t\t<field name=\"UNAVAILABLE\"/>\n\t\t<field name=\"VERSION_PROPERTY_FILE\"/>\n\t</class>\n\t<class name=\"org/json/JSONArray\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Object;)V\" since=\"19\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Collection;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/json/JSONTokener;)V\"/>\n\t\t<method name=\"get(I)Ljava/lang/Object;\"/>\n\t\t<method name=\"getBoolean(I)Z\"/>\n\t\t<method name=\"getDouble(I)D\"/>\n\t\t<method name=\"getInt(I)I\"/>\n\t\t<method name=\"getJSONArray(I)Lorg/json/JSONArray;\"/>\n\t\t<method name=\"getJSONObject(I)Lorg/json/JSONObject;\"/>\n\t\t<method name=\"getLong(I)J\"/>\n\t\t<method name=\"getString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"isNull(I)Z\"/>\n\t\t<method name=\"join(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"length()I\"/>\n\t\t<method name=\"opt(I)Ljava/lang/Object;\"/>\n\t\t<method name=\"optBoolean(I)Z\"/>\n\t\t<method name=\"optBoolean(IZ)Z\"/>\n\t\t<method name=\"optDouble(I)D\"/>\n\t\t<method name=\"optDouble(ID)D\"/>\n\t\t<method name=\"optInt(I)I\"/>\n\t\t<method name=\"optInt(II)I\"/>\n\t\t<method name=\"optJSONArray(I)Lorg/json/JSONArray;\"/>\n\t\t<method name=\"optJSONObject(I)Lorg/json/JSONObject;\"/>\n\t\t<method name=\"optLong(I)J\"/>\n\t\t<method name=\"optLong(IJ)J\"/>\n\t\t<method name=\"optString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"optString(ILjava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"put(D)Lorg/json/JSONArray;\"/>\n\t\t<method name=\"put(I)Lorg/json/JSONArray;\"/>\n\t\t<method name=\"put(ID)Lorg/json/JSONArray;\"/>\n\t\t<method name=\"put(II)Lorg/json/JSONArray;\"/>\n\t\t<method name=\"put(IJ)Lorg/json/JSONArray;\"/>\n\t\t<method name=\"put(ILjava/lang/Object;)Lorg/json/JSONArray;\"/>\n\t\t<method name=\"put(IZ)Lorg/json/JSONArray;\"/>\n\t\t<method name=\"put(J)Lorg/json/JSONArray;\"/>\n\t\t<method name=\"put(Ljava/lang/Object;)Lorg/json/JSONArray;\"/>\n\t\t<method name=\"put(Z)Lorg/json/JSONArray;\"/>\n\t\t<method name=\"remove(I)Ljava/lang/Object;\" since=\"19\"/>\n\t\t<method name=\"toJSONObject(Lorg/json/JSONArray;)Lorg/json/JSONObject;\"/>\n\t\t<method name=\"toString(I)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/json/JSONException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V\" since=\"27\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Throwable;)V\" since=\"27\"/>\n\t</class>\n\t<class name=\"org/json/JSONObject\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/util/Map;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/json/JSONObject;[Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Lorg/json/JSONTokener;)V\"/>\n\t\t<method name=\"accumulate(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\"/>\n\t\t<method name=\"get(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getBoolean(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"getDouble(Ljava/lang/String;)D\"/>\n\t\t<method name=\"getInt(Ljava/lang/String;)I\"/>\n\t\t<method name=\"getJSONArray(Ljava/lang/String;)Lorg/json/JSONArray;\"/>\n\t\t<method name=\"getJSONObject(Ljava/lang/String;)Lorg/json/JSONObject;\"/>\n\t\t<method name=\"getLong(Ljava/lang/String;)J\"/>\n\t\t<method name=\"getString(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"has(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isNull(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"keys()Ljava/util/Iterator;\"/>\n\t\t<method name=\"length()I\"/>\n\t\t<method name=\"names()Lorg/json/JSONArray;\"/>\n\t\t<method name=\"numberToString(Ljava/lang/Number;)Ljava/lang/String;\"/>\n\t\t<method name=\"opt(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"optBoolean(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"optBoolean(Ljava/lang/String;Z)Z\"/>\n\t\t<method name=\"optDouble(Ljava/lang/String;)D\"/>\n\t\t<method name=\"optDouble(Ljava/lang/String;D)D\"/>\n\t\t<method name=\"optInt(Ljava/lang/String;)I\"/>\n\t\t<method name=\"optInt(Ljava/lang/String;I)I\"/>\n\t\t<method name=\"optJSONArray(Ljava/lang/String;)Lorg/json/JSONArray;\"/>\n\t\t<method name=\"optJSONObject(Ljava/lang/String;)Lorg/json/JSONObject;\"/>\n\t\t<method name=\"optLong(Ljava/lang/String;)J\"/>\n\t\t<method name=\"optLong(Ljava/lang/String;J)J\"/>\n\t\t<method name=\"optString(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"optString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"put(Ljava/lang/String;D)Lorg/json/JSONObject;\"/>\n\t\t<method name=\"put(Ljava/lang/String;I)Lorg/json/JSONObject;\"/>\n\t\t<method name=\"put(Ljava/lang/String;J)Lorg/json/JSONObject;\"/>\n\t\t<method name=\"put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\"/>\n\t\t<method name=\"put(Ljava/lang/String;Z)Lorg/json/JSONObject;\"/>\n\t\t<method name=\"putOpt(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;\"/>\n\t\t<method name=\"quote(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"remove(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"toJSONArray(Lorg/json/JSONArray;)Lorg/json/JSONArray;\"/>\n\t\t<method name=\"toString(I)Ljava/lang/String;\"/>\n\t\t<method name=\"wrap(Ljava/lang/Object;)Ljava/lang/Object;\" since=\"19\"/>\n\t\t<field name=\"NULL\"/>\n\t</class>\n\t<class name=\"org/json/JSONStringer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"array()Lorg/json/JSONStringer;\"/>\n\t\t<method name=\"endArray()Lorg/json/JSONStringer;\"/>\n\t\t<method name=\"endObject()Lorg/json/JSONStringer;\"/>\n\t\t<method name=\"key(Ljava/lang/String;)Lorg/json/JSONStringer;\"/>\n\t\t<method name=\"object()Lorg/json/JSONStringer;\"/>\n\t\t<method name=\"value(D)Lorg/json/JSONStringer;\"/>\n\t\t<method name=\"value(J)Lorg/json/JSONStringer;\"/>\n\t\t<method name=\"value(Ljava/lang/Object;)Lorg/json/JSONStringer;\"/>\n\t\t<method name=\"value(Z)Lorg/json/JSONStringer;\"/>\n\t</class>\n\t<class name=\"org/json/JSONTokener\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"back()V\"/>\n\t\t<method name=\"dehexchar(C)I\"/>\n\t\t<method name=\"more()Z\"/>\n\t\t<method name=\"next()C\"/>\n\t\t<method name=\"next(C)C\"/>\n\t\t<method name=\"next(I)Ljava/lang/String;\"/>\n\t\t<method name=\"nextClean()C\"/>\n\t\t<method name=\"nextString(C)Ljava/lang/String;\"/>\n\t\t<method name=\"nextTo(C)Ljava/lang/String;\"/>\n\t\t<method name=\"nextTo(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"nextValue()Ljava/lang/Object;\"/>\n\t\t<method name=\"skipPast(Ljava/lang/String;)V\"/>\n\t\t<method name=\"skipTo(C)C\"/>\n\t\t<method name=\"syntaxError(Ljava/lang/String;)Lorg/json/JSONException;\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/Attr\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/w3c/dom/Node\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getOwnerElement()Lorg/w3c/dom/Element;\"/>\n\t\t<method name=\"getSchemaTypeInfo()Lorg/w3c/dom/TypeInfo;\" since=\"8\"/>\n\t\t<method name=\"getSpecified()Z\"/>\n\t\t<method name=\"getValue()Ljava/lang/String;\"/>\n\t\t<method name=\"isId()Z\" since=\"8\"/>\n\t\t<method name=\"setValue(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/CDATASection\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/w3c/dom/Text\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/CharacterData\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/w3c/dom/Node\"/>\n\t\t<method name=\"appendData(Ljava/lang/String;)V\"/>\n\t\t<method name=\"deleteData(II)V\"/>\n\t\t<method name=\"getData()Ljava/lang/String;\"/>\n\t\t<method name=\"getLength()I\"/>\n\t\t<method name=\"insertData(ILjava/lang/String;)V\"/>\n\t\t<method name=\"replaceData(IILjava/lang/String;)V\"/>\n\t\t<method name=\"setData(Ljava/lang/String;)V\"/>\n\t\t<method name=\"substringData(II)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/Comment\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/w3c/dom/CharacterData\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/DOMConfiguration\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"canSetParameter(Ljava/lang/String;Ljava/lang/Object;)Z\"/>\n\t\t<method name=\"getParameter(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getParameterNames()Lorg/w3c/dom/DOMStringList;\"/>\n\t\t<method name=\"setParameter(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/DOMError\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getLocation()Lorg/w3c/dom/DOMLocator;\"/>\n\t\t<method name=\"getMessage()Ljava/lang/String;\"/>\n\t\t<method name=\"getRelatedData()Ljava/lang/Object;\"/>\n\t\t<method name=\"getRelatedException()Ljava/lang/Object;\"/>\n\t\t<method name=\"getSeverity()S\"/>\n\t\t<method name=\"getType()Ljava/lang/String;\"/>\n\t\t<field name=\"SEVERITY_ERROR\"/>\n\t\t<field name=\"SEVERITY_FATAL_ERROR\"/>\n\t\t<field name=\"SEVERITY_WARNING\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/DOMErrorHandler\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"handleError(Lorg/w3c/dom/DOMError;)Z\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/DOMException\" since=\"1\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>(SLjava/lang/String;)V\"/>\n\t\t<field name=\"DOMSTRING_SIZE_ERR\"/>\n\t\t<field name=\"HIERARCHY_REQUEST_ERR\"/>\n\t\t<field name=\"INDEX_SIZE_ERR\"/>\n\t\t<field name=\"INUSE_ATTRIBUTE_ERR\"/>\n\t\t<field name=\"INVALID_ACCESS_ERR\"/>\n\t\t<field name=\"INVALID_CHARACTER_ERR\"/>\n\t\t<field name=\"INVALID_MODIFICATION_ERR\"/>\n\t\t<field name=\"INVALID_STATE_ERR\"/>\n\t\t<field name=\"NAMESPACE_ERR\"/>\n\t\t<field name=\"NOT_FOUND_ERR\"/>\n\t\t<field name=\"NOT_SUPPORTED_ERR\"/>\n\t\t<field name=\"NO_DATA_ALLOWED_ERR\"/>\n\t\t<field name=\"NO_MODIFICATION_ALLOWED_ERR\"/>\n\t\t<field name=\"SYNTAX_ERR\"/>\n\t\t<field name=\"TYPE_MISMATCH_ERR\" since=\"8\"/>\n\t\t<field name=\"VALIDATION_ERR\" since=\"8\"/>\n\t\t<field name=\"WRONG_DOCUMENT_ERR\"/>\n\t\t<field name=\"code\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/DOMImplementation\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createDocument(Ljava/lang/String;Ljava/lang/String;Lorg/w3c/dom/DocumentType;)Lorg/w3c/dom/Document;\"/>\n\t\t<method name=\"createDocumentType(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/DocumentType;\"/>\n\t\t<method name=\"getFeature(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;\" since=\"8\"/>\n\t\t<method name=\"hasFeature(Ljava/lang/String;Ljava/lang/String;)Z\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/DOMImplementationList\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getLength()I\"/>\n\t\t<method name=\"item(I)Lorg/w3c/dom/DOMImplementation;\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/DOMImplementationSource\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getDOMImplementation(Ljava/lang/String;)Lorg/w3c/dom/DOMImplementation;\"/>\n\t\t<method name=\"getDOMImplementationList(Ljava/lang/String;)Lorg/w3c/dom/DOMImplementationList;\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/DOMLocator\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getByteOffset()I\"/>\n\t\t<method name=\"getColumnNumber()I\"/>\n\t\t<method name=\"getLineNumber()I\"/>\n\t\t<method name=\"getRelatedNode()Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"getUri()Ljava/lang/String;\"/>\n\t\t<method name=\"getUtf16Offset()I\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/DOMStringList\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"contains(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"getLength()I\"/>\n\t\t<method name=\"item(I)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/Document\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/w3c/dom/Node\"/>\n\t\t<method name=\"adoptNode(Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;\" since=\"8\"/>\n\t\t<method name=\"createAttribute(Ljava/lang/String;)Lorg/w3c/dom/Attr;\"/>\n\t\t<method name=\"createAttributeNS(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/Attr;\"/>\n\t\t<method name=\"createCDATASection(Ljava/lang/String;)Lorg/w3c/dom/CDATASection;\"/>\n\t\t<method name=\"createComment(Ljava/lang/String;)Lorg/w3c/dom/Comment;\"/>\n\t\t<method name=\"createDocumentFragment()Lorg/w3c/dom/DocumentFragment;\"/>\n\t\t<method name=\"createElement(Ljava/lang/String;)Lorg/w3c/dom/Element;\"/>\n\t\t<method name=\"createElementNS(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/Element;\"/>\n\t\t<method name=\"createEntityReference(Ljava/lang/String;)Lorg/w3c/dom/EntityReference;\"/>\n\t\t<method name=\"createProcessingInstruction(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/ProcessingInstruction;\"/>\n\t\t<method name=\"createTextNode(Ljava/lang/String;)Lorg/w3c/dom/Text;\"/>\n\t\t<method name=\"getDoctype()Lorg/w3c/dom/DocumentType;\"/>\n\t\t<method name=\"getDocumentElement()Lorg/w3c/dom/Element;\"/>\n\t\t<method name=\"getDocumentURI()Ljava/lang/String;\" since=\"8\"/>\n\t\t<method name=\"getDomConfig()Lorg/w3c/dom/DOMConfiguration;\" since=\"8\"/>\n\t\t<method name=\"getElementById(Ljava/lang/String;)Lorg/w3c/dom/Element;\"/>\n\t\t<method name=\"getElementsByTagName(Ljava/lang/String;)Lorg/w3c/dom/NodeList;\"/>\n\t\t<method name=\"getElementsByTagNameNS(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/NodeList;\"/>\n\t\t<method name=\"getImplementation()Lorg/w3c/dom/DOMImplementation;\"/>\n\t\t<method name=\"getInputEncoding()Ljava/lang/String;\" since=\"8\"/>\n\t\t<method name=\"getStrictErrorChecking()Z\" since=\"8\"/>\n\t\t<method name=\"getXmlEncoding()Ljava/lang/String;\" since=\"8\"/>\n\t\t<method name=\"getXmlStandalone()Z\" since=\"8\"/>\n\t\t<method name=\"getXmlVersion()Ljava/lang/String;\" since=\"8\"/>\n\t\t<method name=\"importNode(Lorg/w3c/dom/Node;Z)Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"normalizeDocument()V\" since=\"8\"/>\n\t\t<method name=\"renameNode(Lorg/w3c/dom/Node;Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/Node;\" since=\"8\"/>\n\t\t<method name=\"setDocumentURI(Ljava/lang/String;)V\" since=\"8\"/>\n\t\t<method name=\"setStrictErrorChecking(Z)V\" since=\"8\"/>\n\t\t<method name=\"setXmlStandalone(Z)V\" since=\"8\"/>\n\t\t<method name=\"setXmlVersion(Ljava/lang/String;)V\" since=\"8\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/DocumentFragment\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/w3c/dom/Node\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/DocumentType\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/w3c/dom/Node\"/>\n\t\t<method name=\"getEntities()Lorg/w3c/dom/NamedNodeMap;\"/>\n\t\t<method name=\"getInternalSubset()Ljava/lang/String;\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getNotations()Lorg/w3c/dom/NamedNodeMap;\"/>\n\t\t<method name=\"getPublicId()Ljava/lang/String;\"/>\n\t\t<method name=\"getSystemId()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/Element\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/w3c/dom/Node\"/>\n\t\t<method name=\"getAttribute(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getAttributeNS(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getAttributeNode(Ljava/lang/String;)Lorg/w3c/dom/Attr;\"/>\n\t\t<method name=\"getAttributeNodeNS(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/Attr;\"/>\n\t\t<method name=\"getElementsByTagName(Ljava/lang/String;)Lorg/w3c/dom/NodeList;\"/>\n\t\t<method name=\"getElementsByTagNameNS(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/NodeList;\"/>\n\t\t<method name=\"getSchemaTypeInfo()Lorg/w3c/dom/TypeInfo;\" since=\"8\"/>\n\t\t<method name=\"getTagName()Ljava/lang/String;\"/>\n\t\t<method name=\"hasAttribute(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"hasAttributeNS(Ljava/lang/String;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"removeAttribute(Ljava/lang/String;)V\"/>\n\t\t<method name=\"removeAttributeNS(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"removeAttributeNode(Lorg/w3c/dom/Attr;)Lorg/w3c/dom/Attr;\"/>\n\t\t<method name=\"setAttribute(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setAttributeNS(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setAttributeNode(Lorg/w3c/dom/Attr;)Lorg/w3c/dom/Attr;\"/>\n\t\t<method name=\"setAttributeNodeNS(Lorg/w3c/dom/Attr;)Lorg/w3c/dom/Attr;\"/>\n\t\t<method name=\"setIdAttribute(Ljava/lang/String;Z)V\" since=\"8\"/>\n\t\t<method name=\"setIdAttributeNS(Ljava/lang/String;Ljava/lang/String;Z)V\" since=\"8\"/>\n\t\t<method name=\"setIdAttributeNode(Lorg/w3c/dom/Attr;Z)V\" since=\"8\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/Entity\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/w3c/dom/Node\"/>\n\t\t<method name=\"getInputEncoding()Ljava/lang/String;\" since=\"8\"/>\n\t\t<method name=\"getNotationName()Ljava/lang/String;\"/>\n\t\t<method name=\"getPublicId()Ljava/lang/String;\"/>\n\t\t<method name=\"getSystemId()Ljava/lang/String;\"/>\n\t\t<method name=\"getXmlEncoding()Ljava/lang/String;\" since=\"8\"/>\n\t\t<method name=\"getXmlVersion()Ljava/lang/String;\" since=\"8\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/EntityReference\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/w3c/dom/Node\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/NameList\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"contains(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"containsNS(Ljava/lang/String;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"getLength()I\"/>\n\t\t<method name=\"getName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getNamespaceURI(I)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/NamedNodeMap\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getLength()I\"/>\n\t\t<method name=\"getNamedItem(Ljava/lang/String;)Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"getNamedItemNS(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"item(I)Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"removeNamedItem(Ljava/lang/String;)Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"removeNamedItemNS(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"setNamedItem(Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"setNamedItemNS(Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/Node\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"appendChild(Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"cloneNode(Z)Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"compareDocumentPosition(Lorg/w3c/dom/Node;)S\" since=\"8\"/>\n\t\t<method name=\"getAttributes()Lorg/w3c/dom/NamedNodeMap;\"/>\n\t\t<method name=\"getBaseURI()Ljava/lang/String;\" since=\"8\"/>\n\t\t<method name=\"getChildNodes()Lorg/w3c/dom/NodeList;\"/>\n\t\t<method name=\"getFeature(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;\" since=\"8\"/>\n\t\t<method name=\"getFirstChild()Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"getLastChild()Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"getLocalName()Ljava/lang/String;\"/>\n\t\t<method name=\"getNamespaceURI()Ljava/lang/String;\"/>\n\t\t<method name=\"getNextSibling()Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"getNodeName()Ljava/lang/String;\"/>\n\t\t<method name=\"getNodeType()S\"/>\n\t\t<method name=\"getNodeValue()Ljava/lang/String;\"/>\n\t\t<method name=\"getOwnerDocument()Lorg/w3c/dom/Document;\"/>\n\t\t<method name=\"getParentNode()Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"getPrefix()Ljava/lang/String;\"/>\n\t\t<method name=\"getPreviousSibling()Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"getTextContent()Ljava/lang/String;\" since=\"8\"/>\n\t\t<method name=\"getUserData(Ljava/lang/String;)Ljava/lang/Object;\" since=\"8\"/>\n\t\t<method name=\"hasAttributes()Z\"/>\n\t\t<method name=\"hasChildNodes()Z\"/>\n\t\t<method name=\"insertBefore(Lorg/w3c/dom/Node;Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"isDefaultNamespace(Ljava/lang/String;)Z\" since=\"8\"/>\n\t\t<method name=\"isEqualNode(Lorg/w3c/dom/Node;)Z\" since=\"8\"/>\n\t\t<method name=\"isSameNode(Lorg/w3c/dom/Node;)Z\" since=\"8\"/>\n\t\t<method name=\"isSupported(Ljava/lang/String;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"lookupNamespaceURI(Ljava/lang/String;)Ljava/lang/String;\" since=\"8\"/>\n\t\t<method name=\"lookupPrefix(Ljava/lang/String;)Ljava/lang/String;\" since=\"8\"/>\n\t\t<method name=\"normalize()V\"/>\n\t\t<method name=\"removeChild(Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"replaceChild(Lorg/w3c/dom/Node;Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"setNodeValue(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setPrefix(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setTextContent(Ljava/lang/String;)V\" since=\"8\"/>\n\t\t<method name=\"setUserData(Ljava/lang/String;Ljava/lang/Object;Lorg/w3c/dom/UserDataHandler;)Ljava/lang/Object;\" since=\"8\"/>\n\t\t<field name=\"ATTRIBUTE_NODE\"/>\n\t\t<field name=\"CDATA_SECTION_NODE\"/>\n\t\t<field name=\"COMMENT_NODE\"/>\n\t\t<field name=\"DOCUMENT_FRAGMENT_NODE\"/>\n\t\t<field name=\"DOCUMENT_NODE\"/>\n\t\t<field name=\"DOCUMENT_POSITION_CONTAINED_BY\" since=\"8\"/>\n\t\t<field name=\"DOCUMENT_POSITION_CONTAINS\" since=\"8\"/>\n\t\t<field name=\"DOCUMENT_POSITION_DISCONNECTED\" since=\"8\"/>\n\t\t<field name=\"DOCUMENT_POSITION_FOLLOWING\" since=\"8\"/>\n\t\t<field name=\"DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC\" since=\"8\"/>\n\t\t<field name=\"DOCUMENT_POSITION_PRECEDING\" since=\"8\"/>\n\t\t<field name=\"DOCUMENT_TYPE_NODE\"/>\n\t\t<field name=\"ELEMENT_NODE\"/>\n\t\t<field name=\"ENTITY_NODE\"/>\n\t\t<field name=\"ENTITY_REFERENCE_NODE\"/>\n\t\t<field name=\"NOTATION_NODE\"/>\n\t\t<field name=\"PROCESSING_INSTRUCTION_NODE\"/>\n\t\t<field name=\"TEXT_NODE\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/NodeList\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getLength()I\"/>\n\t\t<method name=\"item(I)Lorg/w3c/dom/Node;\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/Notation\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/w3c/dom/Node\"/>\n\t\t<method name=\"getPublicId()Ljava/lang/String;\"/>\n\t\t<method name=\"getSystemId()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/ProcessingInstruction\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/w3c/dom/Node\"/>\n\t\t<method name=\"getData()Ljava/lang/String;\"/>\n\t\t<method name=\"getTarget()Ljava/lang/String;\"/>\n\t\t<method name=\"setData(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/Text\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/w3c/dom/CharacterData\"/>\n\t\t<method name=\"getWholeText()Ljava/lang/String;\" since=\"8\"/>\n\t\t<method name=\"isElementContentWhitespace()Z\" since=\"8\"/>\n\t\t<method name=\"replaceWholeText(Ljava/lang/String;)Lorg/w3c/dom/Text;\" since=\"8\"/>\n\t\t<method name=\"splitText(I)Lorg/w3c/dom/Text;\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/TypeInfo\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getTypeName()Ljava/lang/String;\"/>\n\t\t<method name=\"getTypeNamespace()Ljava/lang/String;\"/>\n\t\t<method name=\"isDerivedFrom(Ljava/lang/String;Ljava/lang/String;I)Z\"/>\n\t\t<field name=\"DERIVATION_EXTENSION\"/>\n\t\t<field name=\"DERIVATION_LIST\"/>\n\t\t<field name=\"DERIVATION_RESTRICTION\"/>\n\t\t<field name=\"DERIVATION_UNION\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/UserDataHandler\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"handle(SLjava/lang/String;Ljava/lang/Object;Lorg/w3c/dom/Node;Lorg/w3c/dom/Node;)V\"/>\n\t\t<field name=\"NODE_ADOPTED\"/>\n\t\t<field name=\"NODE_CLONED\"/>\n\t\t<field name=\"NODE_DELETED\"/>\n\t\t<field name=\"NODE_IMPORTED\"/>\n\t\t<field name=\"NODE_RENAMED\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/ls/DOMImplementationLS\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createLSInput()Lorg/w3c/dom/ls/LSInput;\"/>\n\t\t<method name=\"createLSOutput()Lorg/w3c/dom/ls/LSOutput;\"/>\n\t\t<method name=\"createLSParser(SLjava/lang/String;)Lorg/w3c/dom/ls/LSParser;\"/>\n\t\t<method name=\"createLSSerializer()Lorg/w3c/dom/ls/LSSerializer;\"/>\n\t\t<field name=\"MODE_ASYNCHRONOUS\"/>\n\t\t<field name=\"MODE_SYNCHRONOUS\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/ls/LSException\" since=\"8\">\n\t\t<extends name=\"java/lang/RuntimeException\"/>\n\t\t<method name=\"&lt;init>(SLjava/lang/String;)V\"/>\n\t\t<field name=\"PARSE_ERR\"/>\n\t\t<field name=\"SERIALIZE_ERR\"/>\n\t\t<field name=\"code\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/ls/LSInput\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getBaseURI()Ljava/lang/String;\"/>\n\t\t<method name=\"getByteStream()Ljava/io/InputStream;\"/>\n\t\t<method name=\"getCertifiedText()Z\"/>\n\t\t<method name=\"getCharacterStream()Ljava/io/Reader;\"/>\n\t\t<method name=\"getEncoding()Ljava/lang/String;\"/>\n\t\t<method name=\"getPublicId()Ljava/lang/String;\"/>\n\t\t<method name=\"getStringData()Ljava/lang/String;\"/>\n\t\t<method name=\"getSystemId()Ljava/lang/String;\"/>\n\t\t<method name=\"setBaseURI(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setByteStream(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"setCertifiedText(Z)V\"/>\n\t\t<method name=\"setCharacterStream(Ljava/io/Reader;)V\"/>\n\t\t<method name=\"setEncoding(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setPublicId(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setStringData(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setSystemId(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/ls/LSOutput\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getByteStream()Ljava/io/OutputStream;\"/>\n\t\t<method name=\"getCharacterStream()Ljava/io/Writer;\"/>\n\t\t<method name=\"getEncoding()Ljava/lang/String;\"/>\n\t\t<method name=\"getSystemId()Ljava/lang/String;\"/>\n\t\t<method name=\"setByteStream(Ljava/io/OutputStream;)V\"/>\n\t\t<method name=\"setCharacterStream(Ljava/io/Writer;)V\"/>\n\t\t<method name=\"setEncoding(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setSystemId(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/ls/LSParser\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"abort()V\"/>\n\t\t<method name=\"getAsync()Z\"/>\n\t\t<method name=\"getBusy()Z\"/>\n\t\t<method name=\"getDomConfig()Lorg/w3c/dom/DOMConfiguration;\"/>\n\t\t<method name=\"getFilter()Lorg/w3c/dom/ls/LSParserFilter;\"/>\n\t\t<method name=\"parse(Lorg/w3c/dom/ls/LSInput;)Lorg/w3c/dom/Document;\"/>\n\t\t<method name=\"parseURI(Ljava/lang/String;)Lorg/w3c/dom/Document;\"/>\n\t\t<method name=\"parseWithContext(Lorg/w3c/dom/ls/LSInput;Lorg/w3c/dom/Node;S)Lorg/w3c/dom/Node;\"/>\n\t\t<method name=\"setFilter(Lorg/w3c/dom/ls/LSParserFilter;)V\"/>\n\t\t<field name=\"ACTION_APPEND_AS_CHILDREN\"/>\n\t\t<field name=\"ACTION_INSERT_AFTER\"/>\n\t\t<field name=\"ACTION_INSERT_BEFORE\"/>\n\t\t<field name=\"ACTION_REPLACE\"/>\n\t\t<field name=\"ACTION_REPLACE_CHILDREN\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/ls/LSParserFilter\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"acceptNode(Lorg/w3c/dom/Node;)S\"/>\n\t\t<method name=\"getWhatToShow()I\"/>\n\t\t<method name=\"startElement(Lorg/w3c/dom/Element;)S\"/>\n\t\t<field name=\"FILTER_ACCEPT\"/>\n\t\t<field name=\"FILTER_INTERRUPT\"/>\n\t\t<field name=\"FILTER_REJECT\"/>\n\t\t<field name=\"FILTER_SKIP\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/ls/LSResourceResolver\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"resolveResource(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/ls/LSInput;\"/>\n\t</class>\n\t<class name=\"org/w3c/dom/ls/LSSerializer\" since=\"8\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getDomConfig()Lorg/w3c/dom/DOMConfiguration;\"/>\n\t\t<method name=\"getNewLine()Ljava/lang/String;\"/>\n\t\t<method name=\"setNewLine(Ljava/lang/String;)V\"/>\n\t\t<method name=\"write(Lorg/w3c/dom/Node;Lorg/w3c/dom/ls/LSOutput;)Z\"/>\n\t\t<method name=\"writeToString(Lorg/w3c/dom/Node;)Ljava/lang/String;\"/>\n\t\t<method name=\"writeToURI(Lorg/w3c/dom/Node;Ljava/lang/String;)Z\"/>\n\t</class>\n\t<class name=\"org/xml/sax/AttributeList\" since=\"1\" deprecated=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getLength()I\" deprecated=\"29\"/>\n\t\t<method name=\"getName(I)Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getType(I)Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getType(Ljava/lang/String;)Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getValue(I)Ljava/lang/String;\" deprecated=\"29\"/>\n\t\t<method name=\"getValue(Ljava/lang/String;)Ljava/lang/String;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"org/xml/sax/Attributes\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getIndex(Ljava/lang/String;)I\"/>\n\t\t<method name=\"getIndex(Ljava/lang/String;Ljava/lang/String;)I\"/>\n\t\t<method name=\"getLength()I\"/>\n\t\t<method name=\"getLocalName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getQName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getType(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getType(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getType(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getURI(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getValue(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getValue(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/xml/sax/ContentHandler\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"characters([CII)V\"/>\n\t\t<method name=\"endDocument()V\"/>\n\t\t<method name=\"endElement(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"endPrefixMapping(Ljava/lang/String;)V\"/>\n\t\t<method name=\"ignorableWhitespace([CII)V\"/>\n\t\t<method name=\"processingInstruction(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setDocumentLocator(Lorg/xml/sax/Locator;)V\"/>\n\t\t<method name=\"skippedEntity(Ljava/lang/String;)V\"/>\n\t\t<method name=\"startDocument()V\"/>\n\t\t<method name=\"startElement(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/xml/sax/Attributes;)V\"/>\n\t\t<method name=\"startPrefixMapping(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/xml/sax/DTDHandler\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"notationDecl(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"unparsedEntityDecl(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/xml/sax/DocumentHandler\" since=\"1\" deprecated=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"characters([CII)V\" deprecated=\"29\"/>\n\t\t<method name=\"endDocument()V\" deprecated=\"29\"/>\n\t\t<method name=\"endElement(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"ignorableWhitespace([CII)V\" deprecated=\"29\"/>\n\t\t<method name=\"processingInstruction(Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setDocumentLocator(Lorg/xml/sax/Locator;)V\" deprecated=\"29\"/>\n\t\t<method name=\"startDocument()V\" deprecated=\"29\"/>\n\t\t<method name=\"startElement(Ljava/lang/String;Lorg/xml/sax/AttributeList;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"org/xml/sax/EntityResolver\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"resolveEntity(Ljava/lang/String;Ljava/lang/String;)Lorg/xml/sax/InputSource;\"/>\n\t</class>\n\t<class name=\"org/xml/sax/ErrorHandler\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"error(Lorg/xml/sax/SAXParseException;)V\"/>\n\t\t<method name=\"fatalError(Lorg/xml/sax/SAXParseException;)V\"/>\n\t\t<method name=\"warning(Lorg/xml/sax/SAXParseException;)V\"/>\n\t</class>\n\t<class name=\"org/xml/sax/HandlerBase\" since=\"1\" deprecated=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/xml/sax/DTDHandler\"/>\n\t\t<implements name=\"org/xml/sax/DocumentHandler\"/>\n\t\t<implements name=\"org/xml/sax/EntityResolver\"/>\n\t\t<implements name=\"org/xml/sax/ErrorHandler\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"org/xml/sax/InputSource\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/io/Reader;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"getByteStream()Ljava/io/InputStream;\"/>\n\t\t<method name=\"getCharacterStream()Ljava/io/Reader;\"/>\n\t\t<method name=\"getEncoding()Ljava/lang/String;\"/>\n\t\t<method name=\"getPublicId()Ljava/lang/String;\"/>\n\t\t<method name=\"getSystemId()Ljava/lang/String;\"/>\n\t\t<method name=\"setByteStream(Ljava/io/InputStream;)V\"/>\n\t\t<method name=\"setCharacterStream(Ljava/io/Reader;)V\"/>\n\t\t<method name=\"setEncoding(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setPublicId(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setSystemId(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/xml/sax/Locator\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getColumnNumber()I\"/>\n\t\t<method name=\"getLineNumber()I\"/>\n\t\t<method name=\"getPublicId()Ljava/lang/String;\"/>\n\t\t<method name=\"getSystemId()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/xml/sax/Parser\" since=\"1\" deprecated=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"parse(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"parse(Lorg/xml/sax/InputSource;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setDTDHandler(Lorg/xml/sax/DTDHandler;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setDocumentHandler(Lorg/xml/sax/DocumentHandler;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setEntityResolver(Lorg/xml/sax/EntityResolver;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setErrorHandler(Lorg/xml/sax/ErrorHandler;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setLocale(Ljava/util/Locale;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"org/xml/sax/SAXException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/Exception;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/Exception;)V\"/>\n\t\t<method name=\"getException()Ljava/lang/Exception;\"/>\n\t</class>\n\t<class name=\"org/xml/sax/SAXNotRecognizedException\" since=\"1\">\n\t\t<extends name=\"org/xml/sax/SAXException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/xml/sax/SAXNotSupportedException\" since=\"1\">\n\t\t<extends name=\"org/xml/sax/SAXException\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/xml/sax/SAXParseException\" since=\"1\">\n\t\t<extends name=\"org/xml/sax/SAXException\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILjava/lang/Exception;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Lorg/xml/sax/Locator;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Lorg/xml/sax/Locator;Ljava/lang/Exception;)V\"/>\n\t\t<method name=\"getColumnNumber()I\"/>\n\t\t<method name=\"getLineNumber()I\"/>\n\t\t<method name=\"getPublicId()Ljava/lang/String;\"/>\n\t\t<method name=\"getSystemId()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/xml/sax/XMLFilter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/xml/sax/XMLReader\"/>\n\t\t<method name=\"getParent()Lorg/xml/sax/XMLReader;\"/>\n\t\t<method name=\"setParent(Lorg/xml/sax/XMLReader;)V\"/>\n\t</class>\n\t<class name=\"org/xml/sax/XMLReader\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"getContentHandler()Lorg/xml/sax/ContentHandler;\"/>\n\t\t<method name=\"getDTDHandler()Lorg/xml/sax/DTDHandler;\"/>\n\t\t<method name=\"getEntityResolver()Lorg/xml/sax/EntityResolver;\"/>\n\t\t<method name=\"getErrorHandler()Lorg/xml/sax/ErrorHandler;\"/>\n\t\t<method name=\"getFeature(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"getProperty(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"parse(Ljava/lang/String;)V\"/>\n\t\t<method name=\"parse(Lorg/xml/sax/InputSource;)V\"/>\n\t\t<method name=\"setContentHandler(Lorg/xml/sax/ContentHandler;)V\"/>\n\t\t<method name=\"setDTDHandler(Lorg/xml/sax/DTDHandler;)V\"/>\n\t\t<method name=\"setEntityResolver(Lorg/xml/sax/EntityResolver;)V\"/>\n\t\t<method name=\"setErrorHandler(Lorg/xml/sax/ErrorHandler;)V\"/>\n\t\t<method name=\"setFeature(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"setProperty(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t</class>\n\t<class name=\"org/xml/sax/ext/Attributes2\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/xml/sax/Attributes\"/>\n\t\t<method name=\"isDeclared(I)Z\"/>\n\t\t<method name=\"isDeclared(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isDeclared(Ljava/lang/String;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isSpecified(I)Z\"/>\n\t\t<method name=\"isSpecified(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isSpecified(Ljava/lang/String;Ljava/lang/String;)Z\"/>\n\t</class>\n\t<class name=\"org/xml/sax/ext/Attributes2Impl\" since=\"1\">\n\t\t<extends name=\"org/xml/sax/helpers/AttributesImpl\"/>\n\t\t<implements name=\"org/xml/sax/ext/Attributes2\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Lorg/xml/sax/Attributes;)V\"/>\n\t\t<method name=\"setDeclared(IZ)V\"/>\n\t\t<method name=\"setSpecified(IZ)V\"/>\n\t</class>\n\t<class name=\"org/xml/sax/ext/DeclHandler\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"attributeDecl(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"elementDecl(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"externalEntityDecl(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"internalEntityDecl(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/xml/sax/ext/DefaultHandler2\" since=\"1\">\n\t\t<extends name=\"org/xml/sax/helpers/DefaultHandler\"/>\n\t\t<implements name=\"org/xml/sax/ext/DeclHandler\"/>\n\t\t<implements name=\"org/xml/sax/ext/EntityResolver2\"/>\n\t\t<implements name=\"org/xml/sax/ext/LexicalHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/xml/sax/ext/EntityResolver2\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/xml/sax/EntityResolver\"/>\n\t\t<method name=\"getExternalSubset(Ljava/lang/String;Ljava/lang/String;)Lorg/xml/sax/InputSource;\"/>\n\t\t<method name=\"resolveEntity(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xml/sax/InputSource;\"/>\n\t</class>\n\t<class name=\"org/xml/sax/ext/LexicalHandler\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"comment([CII)V\"/>\n\t\t<method name=\"endCDATA()V\"/>\n\t\t<method name=\"endDTD()V\"/>\n\t\t<method name=\"endEntity(Ljava/lang/String;)V\"/>\n\t\t<method name=\"startCDATA()V\"/>\n\t\t<method name=\"startDTD(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"startEntity(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/xml/sax/ext/Locator2\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/xml/sax/Locator\"/>\n\t\t<method name=\"getEncoding()Ljava/lang/String;\"/>\n\t\t<method name=\"getXMLVersion()Ljava/lang/String;\"/>\n\t</class>\n\t<class name=\"org/xml/sax/ext/Locator2Impl\" since=\"1\">\n\t\t<extends name=\"org/xml/sax/helpers/LocatorImpl\"/>\n\t\t<implements name=\"org/xml/sax/ext/Locator2\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Lorg/xml/sax/Locator;)V\"/>\n\t\t<method name=\"setEncoding(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setXMLVersion(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/xml/sax/helpers/AttributeListImpl\" since=\"1\" deprecated=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/xml/sax/AttributeList\"/>\n\t\t<method name=\"&lt;init>()V\" deprecated=\"29\"/>\n\t\t<method name=\"&lt;init>(Lorg/xml/sax/AttributeList;)V\" deprecated=\"29\"/>\n\t\t<method name=\"addAttribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"clear()V\" deprecated=\"29\"/>\n\t\t<method name=\"removeAttribute(Ljava/lang/String;)V\" deprecated=\"29\"/>\n\t\t<method name=\"setAttributeList(Lorg/xml/sax/AttributeList;)V\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"org/xml/sax/helpers/AttributesImpl\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/xml/sax/Attributes\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Lorg/xml/sax/Attributes;)V\"/>\n\t\t<method name=\"addAttribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"clear()V\"/>\n\t\t<method name=\"removeAttribute(I)V\"/>\n\t\t<method name=\"setAttribute(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setAttributes(Lorg/xml/sax/Attributes;)V\"/>\n\t\t<method name=\"setLocalName(ILjava/lang/String;)V\"/>\n\t\t<method name=\"setQName(ILjava/lang/String;)V\"/>\n\t\t<method name=\"setType(ILjava/lang/String;)V\"/>\n\t\t<method name=\"setURI(ILjava/lang/String;)V\"/>\n\t\t<method name=\"setValue(ILjava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/xml/sax/helpers/DefaultHandler\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/xml/sax/ContentHandler\"/>\n\t\t<implements name=\"org/xml/sax/DTDHandler\"/>\n\t\t<implements name=\"org/xml/sax/EntityResolver\"/>\n\t\t<implements name=\"org/xml/sax/ErrorHandler\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t</class>\n\t<class name=\"org/xml/sax/helpers/LocatorImpl\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/xml/sax/Locator\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Lorg/xml/sax/Locator;)V\"/>\n\t\t<method name=\"setColumnNumber(I)V\"/>\n\t\t<method name=\"setLineNumber(I)V\"/>\n\t\t<method name=\"setPublicId(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setSystemId(Ljava/lang/String;)V\"/>\n\t</class>\n\t<class name=\"org/xml/sax/helpers/NamespaceSupport\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"declarePrefix(Ljava/lang/String;Ljava/lang/String;)Z\"/>\n\t\t<method name=\"getDeclaredPrefixes()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"getPrefix(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getPrefixes()Ljava/util/Enumeration;\"/>\n\t\t<method name=\"getPrefixes(Ljava/lang/String;)Ljava/util/Enumeration;\"/>\n\t\t<method name=\"getURI(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"isNamespaceDeclUris()Z\"/>\n\t\t<method name=\"popContext()V\"/>\n\t\t<method name=\"processName(Ljava/lang/String;[Ljava/lang/String;Z)[Ljava/lang/String;\"/>\n\t\t<method name=\"pushContext()V\"/>\n\t\t<method name=\"reset()V\"/>\n\t\t<method name=\"setNamespaceDeclUris(Z)V\"/>\n\t\t<field name=\"NSDECL\"/>\n\t\t<field name=\"XMLNS\"/>\n\t</class>\n\t<class name=\"org/xml/sax/helpers/ParserAdapter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/xml/sax/DocumentHandler\"/>\n\t\t<implements name=\"org/xml/sax/XMLReader\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Lorg/xml/sax/Parser;)V\"/>\n\t</class>\n\t<class name=\"org/xml/sax/helpers/ParserFactory\" since=\"1\" deprecated=\"9\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"makeParser()Lorg/xml/sax/Parser;\" deprecated=\"29\"/>\n\t\t<method name=\"makeParser(Ljava/lang/String;)Lorg/xml/sax/Parser;\" deprecated=\"29\"/>\n\t</class>\n\t<class name=\"org/xml/sax/helpers/XMLFilterImpl\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/xml/sax/ContentHandler\"/>\n\t\t<implements name=\"org/xml/sax/DTDHandler\"/>\n\t\t<implements name=\"org/xml/sax/EntityResolver\"/>\n\t\t<implements name=\"org/xml/sax/ErrorHandler\"/>\n\t\t<implements name=\"org/xml/sax/XMLFilter\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Lorg/xml/sax/XMLReader;)V\"/>\n\t</class>\n\t<class name=\"org/xml/sax/helpers/XMLReaderAdapter\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/xml/sax/ContentHandler\"/>\n\t\t<implements name=\"org/xml/sax/Parser\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Lorg/xml/sax/XMLReader;)V\"/>\n\t</class>\n\t<class name=\"org/xml/sax/helpers/XMLReaderFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"createXMLReader()Lorg/xml/sax/XMLReader;\"/>\n\t\t<method name=\"createXMLReader(Ljava/lang/String;)Lorg/xml/sax/XMLReader;\"/>\n\t</class>\n\t<class name=\"org/xmlpull/v1/XmlPullParser\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"defineEntityReplacementText(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"getAttributeCount()I\"/>\n\t\t<method name=\"getAttributeName(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getAttributeNamespace(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getAttributePrefix(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getAttributeType(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getAttributeValue(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getAttributeValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getColumnNumber()I\"/>\n\t\t<method name=\"getDepth()I\"/>\n\t\t<method name=\"getEventType()I\"/>\n\t\t<method name=\"getFeature(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"getInputEncoding()Ljava/lang/String;\"/>\n\t\t<method name=\"getLineNumber()I\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getNamespace()Ljava/lang/String;\"/>\n\t\t<method name=\"getNamespace(Ljava/lang/String;)Ljava/lang/String;\"/>\n\t\t<method name=\"getNamespaceCount(I)I\"/>\n\t\t<method name=\"getNamespacePrefix(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getNamespaceUri(I)Ljava/lang/String;\"/>\n\t\t<method name=\"getPositionDescription()Ljava/lang/String;\"/>\n\t\t<method name=\"getPrefix()Ljava/lang/String;\"/>\n\t\t<method name=\"getProperty(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"getText()Ljava/lang/String;\"/>\n\t\t<method name=\"getTextCharacters([I)[C\"/>\n\t\t<method name=\"isAttributeDefault(I)Z\"/>\n\t\t<method name=\"isEmptyElementTag()Z\"/>\n\t\t<method name=\"isWhitespace()Z\"/>\n\t\t<method name=\"next()I\"/>\n\t\t<method name=\"nextTag()I\"/>\n\t\t<method name=\"nextText()Ljava/lang/String;\"/>\n\t\t<method name=\"nextToken()I\"/>\n\t\t<method name=\"require(ILjava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setFeature(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"setInput(Ljava/io/InputStream;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setInput(Ljava/io/Reader;)V\"/>\n\t\t<method name=\"setProperty(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<field name=\"CDSECT\"/>\n\t\t<field name=\"COMMENT\"/>\n\t\t<field name=\"DOCDECL\"/>\n\t\t<field name=\"END_DOCUMENT\"/>\n\t\t<field name=\"END_TAG\"/>\n\t\t<field name=\"ENTITY_REF\"/>\n\t\t<field name=\"FEATURE_PROCESS_DOCDECL\"/>\n\t\t<field name=\"FEATURE_PROCESS_NAMESPACES\"/>\n\t\t<field name=\"FEATURE_REPORT_NAMESPACE_ATTRIBUTES\"/>\n\t\t<field name=\"FEATURE_VALIDATION\"/>\n\t\t<field name=\"IGNORABLE_WHITESPACE\"/>\n\t\t<field name=\"NO_NAMESPACE\"/>\n\t\t<field name=\"PROCESSING_INSTRUCTION\"/>\n\t\t<field name=\"START_DOCUMENT\"/>\n\t\t<field name=\"START_TAG\"/>\n\t\t<field name=\"TEXT\"/>\n\t\t<field name=\"TYPES\"/>\n\t</class>\n\t<class name=\"org/xmlpull/v1/XmlPullParserException\" since=\"1\">\n\t\t<extends name=\"java/lang/Exception\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;)V\"/>\n\t\t<method name=\"&lt;init>(Ljava/lang/String;Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/Throwable;)V\"/>\n\t\t<method name=\"getColumnNumber()I\"/>\n\t\t<method name=\"getDetail()Ljava/lang/Throwable;\"/>\n\t\t<method name=\"getLineNumber()I\"/>\n\t\t<field name=\"column\"/>\n\t\t<field name=\"detail\"/>\n\t\t<field name=\"row\"/>\n\t</class>\n\t<class name=\"org/xmlpull/v1/XmlPullParserFactory\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"getFeature(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"isNamespaceAware()Z\"/>\n\t\t<method name=\"isValidating()Z\"/>\n\t\t<method name=\"newInstance()Lorg/xmlpull/v1/XmlPullParserFactory;\"/>\n\t\t<method name=\"newInstance(Ljava/lang/String;Ljava/lang/Class;)Lorg/xmlpull/v1/XmlPullParserFactory;\"/>\n\t\t<method name=\"newPullParser()Lorg/xmlpull/v1/XmlPullParser;\"/>\n\t\t<method name=\"newSerializer()Lorg/xmlpull/v1/XmlSerializer;\"/>\n\t\t<method name=\"setFeature(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"setNamespaceAware(Z)V\"/>\n\t\t<method name=\"setValidating(Z)V\"/>\n\t\t<field name=\"PROPERTY_NAME\"/>\n\t\t<field name=\"classNamesLocation\"/>\n\t\t<field name=\"features\"/>\n\t\t<field name=\"parserClasses\"/>\n\t\t<field name=\"serializerClasses\"/>\n\t</class>\n\t<class name=\"org/xmlpull/v1/XmlSerializer\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<method name=\"attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;\"/>\n\t\t<method name=\"cdsect(Ljava/lang/String;)V\"/>\n\t\t<method name=\"comment(Ljava/lang/String;)V\"/>\n\t\t<method name=\"docdecl(Ljava/lang/String;)V\"/>\n\t\t<method name=\"endDocument()V\"/>\n\t\t<method name=\"endTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;\"/>\n\t\t<method name=\"entityRef(Ljava/lang/String;)V\"/>\n\t\t<method name=\"flush()V\"/>\n\t\t<method name=\"getDepth()I\"/>\n\t\t<method name=\"getFeature(Ljava/lang/String;)Z\"/>\n\t\t<method name=\"getName()Ljava/lang/String;\"/>\n\t\t<method name=\"getNamespace()Ljava/lang/String;\"/>\n\t\t<method name=\"getPrefix(Ljava/lang/String;Z)Ljava/lang/String;\"/>\n\t\t<method name=\"getProperty(Ljava/lang/String;)Ljava/lang/Object;\"/>\n\t\t<method name=\"ignorableWhitespace(Ljava/lang/String;)V\"/>\n\t\t<method name=\"processingInstruction(Ljava/lang/String;)V\"/>\n\t\t<method name=\"setFeature(Ljava/lang/String;Z)V\"/>\n\t\t<method name=\"setOutput(Ljava/io/OutputStream;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setOutput(Ljava/io/Writer;)V\"/>\n\t\t<method name=\"setPrefix(Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<method name=\"setProperty(Ljava/lang/String;Ljava/lang/Object;)V\"/>\n\t\t<method name=\"startDocument(Ljava/lang/String;Ljava/lang/Boolean;)V\"/>\n\t\t<method name=\"startTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;\"/>\n\t\t<method name=\"text(Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;\"/>\n\t\t<method name=\"text([CII)Lorg/xmlpull/v1/XmlSerializer;\"/>\n\t</class>\n\t<class name=\"org/xmlpull/v1/sax2/Driver\" since=\"1\">\n\t\t<extends name=\"java/lang/Object\"/>\n\t\t<implements name=\"org/xml/sax/Attributes\"/>\n\t\t<implements name=\"org/xml/sax/Locator\"/>\n\t\t<implements name=\"org/xml/sax/XMLReader\"/>\n\t\t<method name=\"&lt;init>()V\"/>\n\t\t<method name=\"&lt;init>(Lorg/xmlpull/v1/XmlPullParser;)V\"/>\n\t\t<method name=\"parseSubTree(Lorg/xmlpull/v1/XmlPullParser;)V\"/>\n\t\t<method name=\"startElement(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\"/>\n\t\t<field name=\"APACHE_DYNAMIC_VALIDATION_FEATURE\"/>\n\t\t<field name=\"APACHE_SCHEMA_VALIDATION_FEATURE\"/>\n\t\t<field name=\"DECLARATION_HANDLER_PROPERTY\"/>\n\t\t<field name=\"LEXICAL_HANDLER_PROPERTY\"/>\n\t\t<field name=\"NAMESPACES_FEATURE\"/>\n\t\t<field name=\"NAMESPACE_PREFIXES_FEATURE\"/>\n\t\t<field name=\"VALIDATION_FEATURE\"/>\n\t\t<field name=\"contentHandler\"/>\n\t\t<field name=\"errorHandler\"/>\n\t\t<field name=\"pp\"/>\n\t\t<field name=\"systemId\"/>\n\t</class>\n</api>\n"
  },
  {
    "path": "buildSrc/src/main/resources/binary-compatibility-validator-build.txt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\nplugins {\n    kotlin(\"jvm\")\n    id(\"org.jetbrains.kotlinx.binary-compatibility-validator\")\n}\n\ndescription = \"Binary compatibility validator for project $$PROJECT_PATH$$\"\n\ntasks.withType(kotlinx.validation.KotlinApiBuildTask::class) {\n    val paths = \"\"\"\n        $$BUILD_DIR$$\n        \"\"\"\n        .lines().filter { it.isNotBlank() }.map { project(\"$$PROJECT_PATH$$\").buildDir.resolve(it.trim()) }\n    inputClassesDirs =\n        files(inputClassesDirs.files, *paths.toTypedArray())\n}\n\napiValidation {\n    ignoredPackages.add(\"net.mamoe.mirai.internal\")\n    ignoredPackages.add(\"net.mamoe.mirai.console.internal\")\n    nonPublicMarkers.add(\"net.mamoe.mirai.utils.MiraiInternalApi\")\n    nonPublicMarkers.add(\"net.mamoe.mirai.utils.MiraiInternalFile\")\n    nonPublicMarkers.add(\"net.mamoe.mirai.console.util.ConsoleInternalApi\")\n    nonPublicMarkers.add(\"net.mamoe.mirai.console.ConsoleFrontEndImplementation\") // added on 2.11\n    nonPublicMarkers.add(\"net.mamoe.mirai.console.util.ConsoleExperimentalApi\")\n    nonPublicMarkers.add(\"net.mamoe.mirai.utils.MiraiExperimentalApi\")\n    nonPublicMarkers.add(\"net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors\") // added on 2.14\n}"
  },
  {
    "path": "buildSrc/src/main/resources/binary-compatibility-validator-ignore.txt",
    "content": "build.gradle.kts\n.gitignore"
  },
  {
    "path": "ci-release-helper/.gitignore",
    "content": "/stage-repo\n/stage-*\n"
  },
  {
    "path": "ci-release-helper/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\nimport keys.SecretKeys\nimport kotlinx.validation.sourceSets\nimport java.io.ByteArrayOutputStream\n\nplugins {\n    id(\"io.codearte.nexus-staging\") version \"0.22.0\"\n    kotlin(\"jvm\")\n    kotlin(\"plugin.serialization\")\n}\n\ntasks.register<JavaExec>(\"runcihelper\") {\n    this.classpath = sourceSets[\"main\"].runtimeClasspath\n    this.mainClass.set(\"cihelper.CiHelperKt\")\n    this.workingDir = rootProject.projectDir\n\n    fun Project.findPublishingExt(): PublishingExtension? {\n        val exts = (this@findPublishingExt as ExtensionAware).extensions\n        return exts.findByName(\"publishing\") as PublishingExtension?\n    }\n\n\n    doFirst {\n        @Suppress(\"USELESS_CAST\")\n        environment(\"PROJ_VERSION\", (project.version as Any?).toString())\n        rootProject.allprojects.asSequence()\n            .mapNotNull { it.findPublishingExt() }\n            .flatMap { it.publications.asSequence() }\n            .mapNotNull { it as? MavenPublication }\n            .map { it.artifactId }\n            .joinToString(\"|\")\n            .let { environment(\"PROJ_ARTIFACTS\", it) }\n\n        rootProject.allprojects.asSequence()\n            .mapNotNull { it.findPublishingExt() }\n            .flatMap { it.repositories.asSequence() }\n            .mapNotNull { it as? MavenArtifactRepository }\n            .filter { it.name == \"MiraiStageRepo\" }\n            .first().url\n            .let { environment(\"PROJ_MiraiStageRepo\", it.toString()) }\n\n        val additionProperties = rootProject.properties.asSequence()\n            .filter { (k, _) -> k.startsWith(\"cihelper.\") }\n            .map { (k, v) -> \"-D$k=$v\" }\n            .toList()\n        if (additionProperties.isNotEmpty()) {\n            val currentJvmArgs = jvmArgs ?: emptyList()\n            jvmArgs = currentJvmArgs + additionProperties\n        }\n    }\n}\n\ndescription = \"Mirai CI Methods for Releasing\"\n\nnexusStaging {\n    packageGroup = rootProject.group.toString()\n    val keys = SecretKeys.getCache(project).loadKey(\"sonatype\")\n    username = keys.user\n    password = keys.password\n}\n\ndependencies {\n    implementation(`ktor-client-okhttp`)\n    implementation(`kotlinx-serialization-json`)\n    implementation(\"org.jetbrains.kotlinx\", \"kotlinx-datetime-jvm\", \"0.4.0\")\n}\n\ntasks.register(\"updateSnapshotVersion\") {\n    group = \"mirai\"\n\n    dependsOn(tasks.compileKotlin)\n    dependsOn(tasks.compileJava)\n\n    doLast {\n        val out = ByteArrayOutputStream()\n\n        val sha = getSha()\n        val branch = getCurrentGitBranch()\n\n        val result = javaexec {\n            standardOutput = out\n            classpath(sourceSets.main.get().runtimeClasspath)\n            mainClass.set(\"cihelper.buildIndex.GetNextSnapshotIndex\")\n            args(branch, sha)\n            environment(\n                \"mirai.build.index.auth.username\",\n                System.getenv(\"MIRAI_BUILD_INDEX_AUTH_USERNAME\")\n                    ?: project.property(\"mirai.build.index.auth.username\")\n\n            )\n            environment(\n                \"mirai.build.index.auth.password\",\n                System.getenv(\"MIRAI_BUILD_INDEX_AUTH_PASSWORD\")\n                    ?: project.property(\"mirai.build.index.auth.password\")\n            )\n        }\n        result.assertNormalExitValue()\n\n        val resultString = out.toByteArray().decodeToString()\n        val branchAndIndex = resultString\n            .substringAfter(\"<SNAPSHOT_VERSION_START>\", \"\")\n            .substringBefore(\"<SNAPSHOT_VERSION_END>\", \"\")\n\n        logger.info(\"Exec result:\")\n        logger.info(resultString)\n\n        if (branchAndIndex.isEmpty()) {\n            throw GradleException(\"Failed to find version.\")\n        }\n\n        logger.info(\"Snapshot version index is '$branchAndIndex'\")\n        val versionName = \"${Versions.project}-${branchAndIndex}\"\n\n        // Add annotation on GitHub Actions build\n        // https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-a-notice-message\n        println(\"::notice ::本 commit 的预览版本号: $versionName    在 https://github.com/mamoe/mirai/blob/dev/docs/UsingSnapshots.md 查看如何使用预览版本\")\n\n        setProjectVersionForFutureBuilds(versionName)\n    }\n}\n\ntasks.register(\"publishSnapshotPage\") {\n    doLast {\n        val sha = getSha()\n        logger.info(\"CommitRef is $sha\")\n        UpdateSnapshotPage.run(project, sha)\n    }\n}\n\nfun getSnapshotVersionImpl(): String {\n    val branch = getCurrentGitBranch()\n    logger.info(\"Current branch name is '$branch'\")\n    val sha = getSha().trim().take(8)\n    return \"${Versions.project}-$branch-${sha}\".also {\n        logger.info(\"Snapshot version is '$it'\")\n    }\n}\n\n//tasks.register(\"createTagOnGitHub\") {\n//    group = \"mirai\"\n//    dependsOn(gradle.includedBuild(\"snapshots-publishing\").task(\":check\"))\n//\n//    doLast {\n//        val token = System.getenv(\"MAMOE_TOKEN\")\n//        require(!token.isNullOrBlank()) { \"\" }\n//\n//        val out = ByteArrayOutputStream()\n//        exec {\n//            commandLine(\"git\")\n//            args(\"rev-parse\", \"HEAD\")\n//            standardOutput = out\n//            workingDir = rootProject.projectDir\n//        }\n//        val sha = out.toString()\n//        logger.info(\"Current sha is $sha\")\n//\n//        runBlocking {\n//            val resp = HttpClient().post<String>(\"https://api.github.com/repos/mamoe/mirai/git/refs\") {\n//                header(\"Authorization\", \"token $token\")\n//                header(\"Accept\", \"application/vnd.github.v3+json\")\n//                body = Gson().toJson(\n//                    mapOf(\n//                        \"ref\" to \"refs/tags/build-$nextVersion\",\n//                        \"sha\" to sha,\n//                    )\n//                )\n//            }\n//            logger.info(resp)\n//        }\n//    }\n//}\n\nfun getSha(): String {\n    val out = ByteArrayOutputStream()\n    exec {\n        commandLine(\"git\")\n        args(\"rev-parse\", \"HEAD\")\n        standardOutput = out\n        workingDir = rootProject.projectDir\n    }\n    val sha = out.toString().trim()\n    logger.info(\"Current commit sha is '$sha'\")\n    return sha\n}\n\nfun getCurrentGitBranch(): String {\n    val out = ByteArrayOutputStream()\n    exec {\n        commandLine(\"git\")\n        args(\"rev-parse\", \"--abbrev-ref\", \"HEAD\")\n        standardOutput = out\n        workingDir = rootProject.projectDir\n    }\n    val sha = out.toString().trim()\n    logger.info(\"Current branch is '$sha'\")\n    return sha\n}"
  },
  {
    "path": "ci-release-helper/changelogs/2.10.1.md",
    "content": "## mirai-core\n\n### 优化和修复\n\n- 修复取消发送 `FriendMessage` 却显示 'cancelled by\n  GroupMessagePreSendEvent'\n  的问题 (#1851)\n- 优化日志性能 (#1880 by @AdoptOSS)\n- 完善 `RoamingMessages` 文档\n- 修复文档错别字 (#1902 by @Moyulingjiu)\n- 补充文档错别字 (#1908 by @LaoLittle)\n\n## mirai-console\n\n### 优化和修复\n\n- 仅在 Console 实例已经初始化之后才在 JVM 关闭时停止 Console 实例\n- 修复权限取消, 并在取消权限指令中给出更多提示 (#1843 by @cssxsh)\n- 优化在指令匹配群成员时的性能\n- 修复文档错别字 (#1912 by @Colerar)\n- 补全 AutoLogin 配置中对 `protocol` 的注释 (#1891 by @Stardust-minus)\n"
  },
  {
    "path": "ci-release-helper/changelogs/2.10.2.md",
    "content": "## mirai-core\n\n### 优化和修复\n\n- 修复登录时遇到 'Timeout waiting for ConfigPush' 等 ConfigPush\n  有关问题 (#1899, #1991)\n- 修复 `Image.size` 文档错别字 (#1978)"
  },
  {
    "path": "ci-release-helper/changelogs/2.11.0-M1.md",
    "content": "## mirai-core\n\n### 优化和修复\n\n- 修复取消发送 `FriendMessage` 却显示 'cancelled by\n  GroupMessagePreSendEvent'\n  的问题 (#1851)\n- 优化日志性能 (#1880 by @AdoptOSS)\n- 为生产的 IMEI 增加校验位 (#1855 by @cssxsh)\n- 完善 `RoamingMessages` 文档\n- 修复文档错别字 (#1902 by @Moyulingjiu)\n- 补充文档错别字 (#1908 by @LaoLittle)\n\n## mirai-console\n\n### 不兼容变更\n\n- (仅影响前端实现) 调整了 `MiraiConsoleImplementation`\n  内部实现策略. `MiraiConsoleImplementation.Companion.getInstance`\n  现在不会返回前端实现的对象, 而会返回\n  MiraiConsoleImplementationBridge. (https://github.com/mamoe/mirai/commit/2ebd017786cdb912715821f9fd4ba193829089b1)\n\n### 重大变更\n\n- 重写扩展组件系统 (#1888, #1889):\n    - 现在注册的 `Extension` 会通过其 `priority` 属性排序, 越高越先弃用.\n    - 在遇到 `priority` 相同时将会选用最先提供的, 而不会再询问用户选择.\n    - 移除一些 `ExtensionPoint` 的 `builtinImplementations`, 在 Console\n      启动第一时间初始化内置实现.\n    - Console 内置的 `Extension` 的 `priority` 为 `-1`.\n      用户自定义的 `Extension`\n      的默认为 `0`.\n    - 弃用了 `SingletonExtension`, `SingletonExtensionPoint`\n      , `AbstractSingletonExtensionPoint`.\n    - 部分扩展的 companion object\n      的父类由 `AbstractSingletonExtensionPoint`\n      变为 `AbstractInstanceExtensionPoint`. (ABI 不兼容变更,\n      但对用户的影响应该极小)\n    - 修复 `contributeCommandCallParser` 无效的问题 (#1860)\n\n- 重写插件加载系统 (#1842)\n    - 修复插件没有隔离导致 class 冲突的问题 (#1815)\n    - 修复 mirai-console-gradle 插件打包排除默认依赖不完全的问题 (#1814)\n    - 支持不打包单独 JAR 的 JVM 插件加载方式 (#1809)\n    - 自动从仓库下载插件的依赖并自动共享依赖以减小体积\n    - 修复使用第三方依赖后，插件报错 `java.lang.ClassNotFoundException`\n      的问题 (#1802)\n    - 调整插件类加载策略: 优先加载自己 JAR, 再从全局搜索; 让插件 JAR 携带除\n      mirai 外所有运行时依赖 (#1800)\n    - 以前插件 class 没有隔离, 不定义依赖也可以引用外部 class.\n      但这种行为在隔离后将不再允许. 目前会通过日志警告,\n      将来会禁止.\n\n### 新特性\n\n- 将控制台日志完整保存到文件 (#1844, #1874)\n- 为默认的指令解析器支持转义和带空格的参数 (#1897 by @strear)\n- 在 AutoLogin 配置中增加 `heartbeatStrategy`, 可选值与 mirai-core\n  一致 (`\"STAT_HB\" / \"REGISTER\" / \"NONE\"`). (#1867, #1903 by @Nambers)\n\n### 优化和修复\n\n- 修复插件依赖检查 (#1859 by @cssxsh)\n- 仅在 Console 实例已经初始化之后才在 JVM 关闭时停止 Console 实例\n- 在取消权限指令中给出更多提示 (#1843 by @cssxsh)\n- 优化在指令匹配群成员时的性能\n- 修复文档错别字 (#1912 by @Colerar)\n- 补全 AutoLogin 配置中对 `protocol` 的注释 (#1891 by @Stardust-minus)\n\n## miria-console-terminal\n\n### 新特性\n\n- 新增启动参数 `--no-logging`, 用于关闭日志"
  },
  {
    "path": "ci-release-helper/changelogs/2.11.0-RC.md",
    "content": "## mirai-core\n\n### 不兼容变更\n\n- 弃用 `IMirai.Http`\n- 弃用 `BotConfiguration.json`\n\n### 新特性\n\n- 在达到 `AtAll` 每日使用上限后以新的 `reason` `AT_ALL_LIMITED`\n  抛出 `SendMessageFailedException` (#1948)\n  > 在 2.10 说明了该行为, 但实际上并没有支持\n- 在首次登录遇到任何错误时终止登录而不会重试,\n  修复日志提示 `NettyChannelException` 且长时间不结束的问题 (#1963)\n- 新增获取多种规格的群和用户头像, 修复群成员头像为 GIF\n  时获取的头像链接错误的问题 (#1557, #1721 by @cssxsh)\n\n### 优化和修复\n\n- 修复因网络波动原因, 出现反复掉线重连或产生大量日志的问题 (#1907)\n- 修复收到 `IllegalStateException: returnCode = -10106`\n  导致停止工作的问题 (#1840, #1957)\n- 修复登录时遇到 'Timeout waiting for ConfigPush' 等 ConfigPush\n  有关问题 (#1899, #1991)\n- 修复 `Image.size` 文档错别字 (#1978 by @zj713300)\n- 提升在以前版本弃用的 API 的弃用等级 (#1837)\n- 修复运行时产生大量错误日志的问题 (正确处理在心跳过程中遇到的错误) (\n  #1893)\n- 在心跳任务协程名称中包括 Bot ID\n- 更新依赖:\n    - Kotlin: 1.6.21\n    - kotlinx.serialization: 1.3.2\n    - kotlinx.coroutines: 1.6.1\n    - ktor: 1.6.7\n    - log4j: 2.17.2 (#1969)\n\n## mirai-console\n\n### 不兼容变更\n\n- 弃用 `JAutoSavePluginData` 和 `JAutoSavePluginConfig` (替换见下文) (\n  #1988)\n\n### 新特性\n\n- `PluginData`:\n  支持 `serializersModule` (`PluginData.serializersModule`) (#1796,\n  #1987)\n- `PluginData`: 在定义 `value` 时使用精确的返回值,\n  解决一些需要手动定义类型的情况 (#1987)\n- `PluginData`: 支持 `MessageChain` 等所有 mirai 内置消息数据类型 (\n  #1922)\n- `PluginData`: 支持原生数组类型和引用数组类型 (#1801)\n- 新增 `JavaAutoSavePluginData` 和 `JavaAutoSavePluginConfig`\n  作为 `PluginData` 等的 Java 支持 (#1747, #1803, #1988)\n\n### 优化和修复\n\n- 修复 `AbstractPluginData.findBackingFieldValueNode`\n- 修复依赖 `isOptional=true` 的插件时无法正确处理依赖的问题 (自 2.0) (\n  #1949, #1968)\n- 修复取消权限时的错误信息 (#1918 by @cssxh)\n- 修复新版插件依赖在 init 块内调用依赖时会导致找不到的问题 (自 2.11) (\n  #1965)\n- 修复在下载依赖时试图下载并不存在的 JAR 的问题 (自 2.11) (#1975)\n- 修复指令文档的 Java 示例 (#1970 by @hundun000)\n- 补全 Java 示例文档 (#1970 by @hundun000)\n- 修复 `PluginDescription.isOptional` 的文档 (#1869)\n- 修复文档拼写错误 (#)\n\n## mirai-console-gradle\n\n### 优化和修复\n\n- 在配置项目时优先使用 `optIn` 而不是 `useExperimentalAnnotation` (\n  #1986)\n- `buildPlugin` 打包的插件将会输出到 `build/mirai`, 与 2.11\n  以前保持一致 (自 2.11)\n- 修复 `buildPlugin` 会把子项目依赖也打包的问题 (自 2.11) (#1973)\n\n## mirai-console-intellij\n\n### 新特性\n\n-\n新的插件项目生成器 ([查看图片](https://github.com/mamoe/mirai/pull/1979)) (\n#1976, #1979)\n- 新增 Run Configuration: RunTerminal, 默认使用项目目录下 debug-sandbox\n  作为运行目录\n- 支持中文和英文\n\n> 由于新项目生成器是 2022.1 的新功能, 新版本 v221-2.11.0-162-1 仅支持\n> IntelliJ IDEA 2022.1 (和 Android Studio 等同版本)."
  },
  {
    "path": "ci-release-helper/changelogs/2.11.0.md",
    "content": "## mirai-core\n\n### 优化和修复\n\n- 修复 `AbsoluteFolder.resolveFileById` 在一些情况下会找不到文件的问题 (\n  #2033)\n- 修复一些情况下心跳超时后不会重连的问题 (#2024)\n- 修复一些情况下发送数据包出错的问题 (#2006)\n- 修复文档错别字 (#2019 by @hundun000, )\n\n## mirai-console\n\n### 优化和修复\n\n- 修复一些情况下找不到 `java.*` 或 `javax.*` 的问题 (#2009)\n- 修复 `ContactUtils` 中 `ContactOrBot.render` 不支持 `Stranger`\n  的问题 (#2010)\n- 增加在 Java 注册扩展的文档 (#2021 by @MrXiaoM)\n\n## mirai-console-gradle\n\n### 优化和修复\n\n- 修复 console 下载依赖时试图下载并不存在 JAR 的问题 (#1975)\n- 修复 buildPlugin 未打包子项目间依赖的问题 (#2038)\n"
  },
  {
    "path": "ci-release-helper/changelogs/2.12.0-RC.md",
    "content": "## mirai-core\n\n2.12 带来以下主要更新：\n\n- `EventChannel` 到协程 `Flow` 的对接；\n- 消息链性能优化；\n- 针对开发易用性的优化；\n- 对调试插件的更好支持；\n- 大量文档更新；\n- 以及一些问题修复。\n\n### 不兼容变更\n\n- 弃用 `EmptyMessageChain`，以 `emptyMessageChain()` 函数替换 (#1997)\n  > 因为内部结构有变更，见下文。Java\n  可以 `MessageUtils.emptyMessageChain()` 替换。\n\n- `MarketFace.contentToString`\n  现在在原本会返回空字符串的情况下会返回 `\"[商城表情]\"` (#2030 by\n  @cssxsh)\n  > 原本会返回空字符串是因为服务器提供的表情名称可能为空。\n\n- 修复 `FileMessage` 的序列化名称 (#2041 by @cssxsh)\n  > 以前错误地使用了 `Image`，现在改为 `FileMessage`\n  。以前序列化的 `FileMessage` 可能会无法反序列化。\n\n- `Image.equals` 现在会比较全部属性\n  > 而不是只比较 `imageId`。因为现在图片没有一些详细属性时可能无法发送。\n\n- 弃用 `EventDisabled` 属性 (#1911)\n  > 它可以关闭事件功能，但这并不是明智的做法。\n\n- 弃用 `GroupEntranceAnnouncementChangeEvent` (#1873)\n  > 这个事件在 2.7 增加 `Announcements` 时就已经无效了。\n\n### 新特性\n\n- 优化 `MessageChain` 实现的性能，现在在大量调用 `Message.plus`\n  构造消息链也能获得与 `MessageChainBuilder` 相当的性能。(#1997)\n  > 只修改了内部实现，API 及行为都没有变化。\n- 优化处理合并转发消息的效率\n- 新增 `EventChannel.asFlow` 获得事件通道的 `Flow<...>` (#1911)\n  > 协程 `Flow` 很适合承载事件广播功能，拥有更高的通用性和扩展性。（mirai\n  未使用是因为在\n  mirai `EventChannel` 设计之时 `Flow` 还未稳定）\n- 新增 Java 友好的 `EventChannel.exceptionHandler()` (#1953)\n- 新增 `BotConfiguration.disableAccountSecretes` 关闭 `account.secrets`\n  > account.secrets 保存账号的会话信息。\n  它可加速登录过程，也可能可以减少出现验证码的次数。如果遇到一段时间后无法接收消息通知等同步问题时可尝试禁用。\n\n### 优化和修复\n\n#### 消息\n\n- 部分的消息类型的 `toString` 将包含更多属性，涉及：\n    - `Image`\n      > 现在图片没有一些详细属性时可能无法发送，因此属性也与 imageId\n      一样重要。更多的信息将帮助调试。\n    - `MessageSource`\n    - `QuoteReply`\n    - `FileMessage`\n\n- `Image.toString` 现在将包含全部属性\n\n- 重写消息协议层与发送消息流程 (#1997)\n  > 可扩展，易于测试，为将来支持频道和模块化等做准备。这不会影响现有的功能。\n- 为 `ForwardMessage.BuilderNode` 实现 `toString`\n\n#### 事件\n\n- 优化 `EventChannel` 事件异常处理机制 (#1911)\n  > 现在广播方不会收到来自监听方的事件，监听方有全部责任处理自己的异常，未处理的异常会通过默认日志输出。\n- 优化 `nextEvent` 和 `syncFromEvent`：\n    - 完善文档\n    - 在遇到异常时正确停止监听器\n- 针对异常处理机制完善事件相关文档：`Event`、`EventChannel`、`Listener`\n- 增加事件追踪日志，可由 `-Dmirai.event.trace=true` 启用\n  > 这将会在遇到异常时输出注册事件监听器时的 stacktrace，以及记录每一个事件的广播。\n- 修复官方 macOS 客户端发送给机器人的图片后缀均为 `.mirai` 的问题 (\n  #1111)\n\n#### 其他\n\n- 更新开发文档索引\n  > 现在在开发介绍文档中能访问 mirai-console 相关文档，在《准备工作》中也能了解启动\n  console 的方式。\n- 为 `Bot.close` 的自动登出增加超时\n\n## mirai-console\n\n[指令文档]: https://github.com/mamoe/mirai/blob/dev/mirai-console/docs/Commands.md\n\n### 新特性\n\n- 新增 `CommandContext`，支持在指令中获得原消息链 (#2099)\n  > 三种内置指令 `RawCommand`、`SimpleCommand` 和 `CompositeCommand` 的\n  Kotlin 以及\n  Java 版（`J` 前缀）都支持。参考[文档][指令文档]。\n  > 能获得原消息链也就能获得 `MessageMetadata` (#1835)。\n- 支持在 `JSimpleCommand` 和 `JCompositeCommand`\n  修改 `CommandArgumentContext`\n  > 参考[文档][指令文档]。\n- 增加 `PluginCustomCommandSender` 可供插件实现 `CommandSender` (#1964)\n- 新增 `MiraiConsole.shutdown` 来*优雅*地关闭 Console (#1959, #2016)\n    - 修复收到 SIGINT Console 不退出的问题 (#2042)\n    - 关闭时有一分钟限时，超时后强制结束\n  > *优雅*指的是会禁用插件，依次停止各种服务并保存数据。\n- 在加载配置和数据文件失败时自动备份原文件 (#2089 by @cssxsh)\n- 当插件加载失败时标记其为加载失败而不关闭 Console (#2022 by @Nambers)\n  > 当有插件依赖这个失败的插件时，也会禁用相关插件。\n  > 实际上该功能可由前端选择是否开启。mirai 官方的终端前端以及 Mirai\n  Android 都会启用该功能。\n- 相反于加载顺序卸载插件 (#1994)\n  > 若 A 依赖 B，现在会先卸载 A 再卸载 B。\n\n### 优化和修复\n\n#### 插件\n\n- 修复插件无法使用更高版本的 Ktor 等 mirai-core 也使用的依赖的问题 (\n  #2051)\n  > 现在可以使用 Ktor 2.0\n- 修复插件在引用了相同的库时，在某些的情况下会产生冲突的问题 (#2054)\n- 修复在插件配置的路径中使用子路径出现的异常的问题 (#2088 by @MrXiaoM)\n\n#### 文档\n\n[指令参数智能解析\n]: https://github.com/mamoe/mirai/blob/dev/docs/ConsoleTerminal.md#%E6%8C%87%E4%BB%A4%E5%8F%82%E6%95%B0%E6%99%BA%E8%83%BD%E8%A7%A3%E6%9E%90\n\n[ConsoleTerminal]: https://github.com/mamoe/mirai/blob/dev/docs/ConsoleTerminal.md\n\n- 增加关于使用日志的文档 (#2003)\n- 现在 `PluginManager.getPluginDescription` 不再需要插件已被加载 (#2052)\n  > 这可能帮助实现 `PluginLoader`。\n- 重写[指令文档]\n  > 增加大量示例、覆盖更多内容、用语更简单。  \n  > 增加关于智能参数解析的文档 ([面向用户][ConsoleTerminal]\n  和[面向开发者][指令参数智能解析\n  ]的都有) (#1952)\n- 优化事件文档\n  > 警告在插件中使用 `GlobalEventChannel` 的危险性。\n- 优化文档细节 (#2078 by @xtyuns, #2067 by @CauchyDOOM, #2095 by\n  @Hugozys)\n\n## mirai-console-gradle\n\n### 新特性\n\n[调试文档]: https://github.com/mamoe/mirai/blob/155e4a6ec4cd7ede2ed5bf6d947fbc9d7f4e1aa6/mirai-console/docs/plugin/JVMPlugin.md#%E8%B0%83%E8%AF%95\n\n- 新增任务 `runConsole` 启动模拟 `Mirai Console` 实例 (#2056, #2058)\n  > 解决了在 IDEA 直接运行 RunTerminal 时出现 `NoClassDefError`\n  等错误的问题 (#2055)。现在在\n  IDEA 新生成的项目可以选择 Mirai 文件夹中的 `Run Mirai Console`\n  来启动测试。详见 [文档][调试文档]。\n\n### 优化和修复\n\n- 修复 `shadowLink` 打包的依赖在其他依赖也引用时无效的问题 (#2070)\n"
  },
  {
    "path": "ci-release-helper/changelogs/2.12.0.md",
    "content": "## mirai-core\n\n### 优化和修复\n\n- 修复部分情况下发送图片无法显示和发送 GIF 后图片不播放的问题 (#2114 by\n  @sandtechnology)\n  > 此问题并非 2.12.0-RC 引入\n\n## mirai-console\n\n### 优化和修复\n\n- 修复前置插件存在私有依赖时, 插件无法链接相同依赖的问题 (#2108)\n  > 此问题于 2.11 引入"
  },
  {
    "path": "ci-release-helper/changelogs/2.12.1.md",
    "content": "## mirai-core\n\n### 优化和修复\n\n- 修复合并转发消息显示昵称错误的问题 (#2114)\n\n## mirai-console\n\n### 优化和修复\n\n- 修复前置插件存在私有依赖时, 插件无法链接相同依赖的问题 (#2108)\n- 修复插件使用内置依赖错误 (#2126)\n- 修复加载插件时，若插件 JAR 包含 JVM\n  内置依赖，会导致其他插件直接链接到该插件内依赖并重复加载报错 (#2141)\n\n## IDEA\n\n### 优化和修复\n\n- 支持 2022.2 (#2124)\n  > 新插件版本号为 `221-2.13.0-171-1`"
  },
  {
    "path": "ci-release-helper/changelogs/2.12.2.md",
    "content": "## mirai-core\n\n### 优化和修复\n\n- 修复上传文件时没有发送文件消息的问题 (#2195)\n  > 自 2.12.0"
  },
  {
    "path": "ci-release-helper/changelogs/2.12.3.md",
    "content": "## mirai-core\n\n### 优化和修复\n\n- 修复合并转发内容中用户昵称错误的问题 (#2187)"
  },
  {
    "path": "ci-release-helper/changelogs/2.13.0-M1.md",
    "content": "2.13.0-M1 包含:\n\n[贡献相关文档]: ../../docs/contributing/README.md\n\n- Core 新的 native 编译目标\n- 支持修改好友备注\n- Console 指令参数支持 vararg 和原生类型数组\n- 大量[贡献相关文档]更新\n- 一些问题修复\n\n以下内容正在进行中, 将发布在 2.13.0-RC:\n\n- Core 模拟测试框架\n- 支持查看和修改好友分组\n- Console 下载进度条\n\n## mirai-core\n\n### 不兼容变更\n\n- 将 Ktor 嵌入 mirai-core 并且不公开 (#2096, #2084)\n  > mirai 内部现在使用 Ktor 2.0 并且不公开.  \n  > 所有曾经借由 mirai-core-api 获得 Ktor 依赖的用户都将需要显式定义 Ktor 依赖.\n  > 但是这将会解决版本兼容问题. 用户可以任选 Ktor 1 或者 Ktor 2\n\n- `Audio` 现在继承 `ConstrainSingle` (#2093)\n  > 所以它将会只能单独作为内容存在于消息链中  \n  > 这不会影响现在以正确逻辑编写的代码, 但可能影响一些边界情况\n\n### 新特性\n\n- mirai-core 新增 native 编译目标, 可编译为动态链接库或可执行文件 (#2048)\n  > native 编译目标是 Kotlin/Native, 不依赖 JVM. 支持 macOS, Windows, Linux.  \n  > 目前只可以使用 Kotlin/Native 开发. C API 的导出正计划中.\n\n  特别感谢 @AdoptOSS 的帮助:\n    - 优化 CI 配置 (#2110)\n    - 实现 Windows 平台的 socket 请求 (#2121)\n    - ECDH 的 OpenSSL 实现 (#2123, #2161)\n- 支持修改好友备注 (#554, #2112)\n  > `friend.remark` 由 `val` 变为 `var`, 修改时会触发 `FriendRemarkChangeEvent`.\n- 在 `Image` 序列化时支持全部属性 (#2036 by @cssxsh)\n  > 以前只会输出 `imageId`, 现在还会输出 `width` 等全部必要属性. 兼容旧版本, 在读取时会使用默认 `0` 值.\n\n### 优化和修复\n\n- 重写并检查了消息序列化的正确性 (#2159)\n  > 它现在完全支持全平台.  \n  > 修复了一些元素的序列化可能有不期望行为的问题, 例如在不应该有 `type` (`classDiscriminator`) 的时候有或相反.   \n  > 正确支持并验证了 `@Contextual`.\n  >\n  > **这可能导致新的问题, 建议在试用本测试版时测试是否还能正常工作并及时反馈问题以避免正式版本仍有问题**\n- 修复合并转发消息在 iOS 移动端显示错位的问题 (#2071)\n- 更新贡献相关文档, 包括\n    - mirai 项目组成\n    - 构建多平台的 Core\n    - 构建其他 JVM 项目\n    - 基于新架构实现新消息协议支持\n- 优化文档细节 (#2182 @2938137849)\n- 更新依赖\n    - Kotlin 1.7.10\n    - kotlinx-serialization 1.3.3\n    - kotlinx-coroutines 1.6.4\n    - kotlinx-atomicfu 0.17.3\n    - Ktor 2.1.0\n\n## mirai-console\n\n### 不兼容变更\n\n- 新增 `CommandSenderOnMessage`, 修正 `CommandSender` 的部分扩展的行为 (#2105)\n\n### 新特性\n\n- 指令支持 vararg 和原生数组类型参数 (#1799, #1760 by @cssxsh)\n- 新增其他客户端消息同步事件的指令发送者 `OtherClientCommandSenderOnMessageSync` (#1878, #1879 by @cssxsh, #2085)\n"
  },
  {
    "path": "ci-release-helper/changelogs/2.13.0-RC.md",
    "content": "2.13.0-RC 包含:\n\n- 支持使用短信验证码进行设备锁验证\n- 支持查看和修改好友分组\n- 支持查询和修改群员头衔等活跃数据\n- Core 模拟测试框架\n- Console 下载进度条\n- 一些问题修复\n\n## mirai-core\n\n### 不兼容变更\n\n- `mirai-core-api` 去除了对 `kotlinx-coroutines-jdk8` 的依赖.\n\n### 新特性\n\n- 支持使用短信验证码进行设备锁验证 (#717, #2109, #2216)\n- `nextEvent` 和 `nextEventOrNull` 新增 `intercept` 参数, 可在满足条件时拦截事件 (#1668, #2177 by @Nambers)\n- 支持查看和修改好友分组 (#1390, #1243, #2113 by @Nambers)\n  > 好友分组定名为 `FriendGroup`.\n    - 新增 `Friend.friendGroup` 获取该好友所属分组.\n    - 新增 `Bot.friendGroups` 获取好友分组列表并操作分组.\n- 支持查询和修改群员头衔等活跃数据 (#2204, #2086, #2115 by @cssxsh)\n    - 新增 `Group.active` 获取群的活跃数据.\n    - 新增 `Member.active` 获取该成员的活跃数据.\n- 新增 `AbstractExternalResource.input` 的默认实现\n  > 在实现自定义 `ExternalResource` 时可能有帮助\n\n### 优化和修复\n\n- 更新 `ANDROID_WATCH` 和 `MACOS` 的协议信息 (#2228 by @cssxsh)\n- 修复网络层的异常处理流程, 优化重连逻辑\n    - 修复断线重连时, 日志快速不断输出同一个异常, 之后无法恢复连接的问题 (#2148)\n    - 修复离线时大量打印 `HeartbeatFailedException` 的问题 (#2175)\n- 优化由网络层抛出的异常的堆栈信息\n  > 现在不再有循环引用, 而且更简洁  \n  > `CancellationException` 将会被替换为真实原因\n- 修复在 Android 上遇到 'Duplicate class' 的问题 (#2248)\n- 修复合并转发内容中用户昵称错误的问题 (#2187)\n  > 此修复也包含在 2.12.3\n- 优化各平台的 ECDH 实现 (#2161 by @AdoptOSS)\n- 修复使用静态序列化器时无法编译的问题 (#2230)\n  > 自 2.13.0-M1\n- 在发送群公告失败时抛出有正确信息的异常而不是序列化错误 (#2069)\n- 修复日志中无法获得调试信息的问题 (#2097)\n- 提升一些已弃用的 API 的弃用等级 (#2213)\n\n## mirai-console\n\n### 新特性\n\n- 在下载时展示进度条 (2133, #2140)\n  > 也公开了进度条 API 供插件使用. 见 `MiraiConsole.newProcessProgress()`.\n- 在 `/login` 登录时使用可用的自动登录配置 (#2209 by @cssxsh)\n- 增加了 Console 前端实现的基础模块 `mirai-console-frontend-base`\n\n### 优化和修复\n\n- 优化文档细节 (#2207)\n- 优化日志系统 (#2196)\n    - Console 现在总是使用 core 的 `MiraiLogger.Factory` API 创建日志\n    - 禁止插件修改日志系统\n    - 允许通过 classpath 修改日志系统\n    - 在保存日志到文件时不包含颜色符号 (#2218)\n- 在欢迎时打印 Mirai Console 字符画\n  > 以帮助区分 mirai-console 和 mirai-console-loader\n\n## mirai-core-mock\n\n新增 Core 模拟测试框架 `mirai-core-mock`. 版本号与 `mirai-core` 相同. [相关文档](https://github.com/mamoe/mirai/blob/dev/docs/mocking/Mocking.md) (#1304, #1521)\n\n使用模拟测试框架可以构造虚拟 Bot, 模拟收到各种事件.\n\n## IDEA\n\n- 在创建插件项目时自动从 Maven Central 获取 mirai 使用的 Kotlin 版本 (#2240, #2244 by @MrXiaoM)"
  },
  {
    "path": "ci-release-helper/changelogs/2.13.0-RC2.md",
    "content": "2.13.0-RC2 包含对 2.13 的补充和对 2.13.0-RC 的修复.\n\n## mirai-core\n\n### 优化和修复\n\n- 修复无法加载 2.9.0 以前版本生成的设备信息的问题 (#2280)\n- 修复因好友分组列表加载失败而造成好友列表加载失败的问题 (#2274)\n- 修复网络断开时无法重连的错误\n- 修复重连后 `Invalid number format: 'msfwifi'` 导致的立刻断开连接\n- 修复 `Bot.close` 时出现 `StackOverflowError` 的问题 (#2266)\n- 修复非 snapshots 版本无法在 MPP 项目依赖的问题 (`Could not resolve net.mamoe:mirai-core-api:2.13.0-RC`) (#2270)\n- 修复使用 HTTP API 相关功能报错 `java.lang.NoClassDefFoundError: okhttp3/Request$Builder` 的问题 (#2263)\n- 修复获取群语音下载链接失败的问题 (#2269)\n  > 此问题非 2.13 引入\n- 在使用不支持滑动验证的验证码处理器的错误中附带所使用的验证器的具体信息\n\n## mirai-core-mock\n\n### 优化和修复\n\n- 修复在模拟环境时的信息序列化相关问题"
  },
  {
    "path": "ci-release-helper/changelogs/2.13.0.md",
    "content": "2.13.0 包含对 2.13 前几个预览版本的修复和一些优化\n\n## mirai-core\n\n### 优化和修复\n\n[81a09549]: https://github.com/mamoe/mirai/commit/81a09549e7aba454af7516f146856b3589f1b547\n\n- 修复使用 `ANDROID_PHONE` 登录时提示 \"当前QQ版本过低，请升级至最新版本后再登录。\" 的问题 (#2298, #2312 by @cssxsh)\n  > 已知 `ANDROID_WATCH` 可能仍然无法登录\n- 修复在 Android 平台遇到 \"Duplicate class\" 的问题 (#2291)\n  > 此问题由 2.13.O-M1 引入, 在 2.13.0-RC 尝试过修复但没有成功解决. 本次修复已被验证可用.\n- 为 2.13.0-RC 弃用的 `LoginSolver.onSolveUnsafeDeviceLoginVerify` 增加了默认实现\n  > 所以在实现 `LoginSolver` 就不需要覆盖这个已经被弃用的方法了. 请覆盖新增的支持短信验证的 `onSolveDeviceVerification` 替代.\n- 优化一些潜在的内存泄露问题\n  > 如果你好奇, commit 为 [81a09549]. 实际上它只会在很少的情况下有影响.\n- 优化了在发送消息失败时的堆栈信息\n- 优化了与群文件相关的源码内文档\n  > 在 `Group` 类增加了引导等\n\n## mirai-console\n\n### 新特性\n\n- 在自动登录时展示正在使用的协议类型和心跳策略 (#2304 by @cssxsh)\n- 增加了 Maven Central 仓库 <https://repo1.maven.org/maven2> 作为备用解决插件依赖的仓库\n  > 因为阿里云代理不太稳定. 目前仍然优先尝试速度更快的阿里云代理, 在失败时会使用 Central 仓库.\n\n### 优化和修复\n\n- 插件如果没有显示指定 Ktor 依赖, 则为其使用 Ktor 1.6.7 (#2297)\n  > 以解决在 2.13 以前编译的插件的兼容性问题\n- 修复在启动过程中调整窗口大小导致报错 `kotlin.UninitializedPropertyAccessException` 的问题 (#2317)\n  > 此问题非 2.13 引入\n\n## mirai-core-mock\n\n### 不兼容变更\n\n- 为 `broadcastMsgSyncEvent` 增加了 `OtherClient` 参数\n  > 不兼容旧版 (2.13.0-RC, 2.13.0-RC2) 代码"
  },
  {
    "path": "ci-release-helper/changelogs/2.13.1.md",
    "content": "## mirai-core\n\n### 优化和修复\n\n- 修复找不到 OkHttp 等问题 (#2324, #2331)\n- 优化 `UnsupportedSliderCaptchaException` 的错误提示 <!--(85bf607b)-->\n- 修复验证码解决器报错时没有按照预期停止 bot 的错误逻辑 <!--(90f2fee2, b38687a3)-->\n- 修复 `java.lang.ArrayIndexOutOfBoundsException: arraycopy: last destination index 4132 out of bounds for byte[4096]` (#2309) <!--(372c2502) -->\n\n<!-- #2367: 重写 publishing -->\n\n## mirai-console\n\n### 优化修复\n\n- 修复 console 显示进度条的时候出现死锁 (#2322) <!--(07000456, 9e7fd792, 7cbff5a8)-->\n- 修复 console 中 Gradle 缓存路径检查不正确的问题 (#2357) <!--(841f6e53)-->\n- 修复 console 中指定多个远程仓库地址时未按照预期工作的错误 (#2358 by @cssxsh) <!--(5618333a)-->\n"
  },
  {
    "path": "ci-release-helper/changelogs/2.13.2.md",
    "content": "## mirai-core\n\n### 优化和修复\n\n- 修复发送图片时发生 `java.lang.NoSuchMethodError` 的问题 (#2381)\n  > 自 2.13.0"
  },
  {
    "path": "ci-release-helper/changelogs/2.13.3.md",
    "content": "## mirai-core\n\n### 优化和修复\n\n- 修复登录时出现 `DecryptionFailedException` 的问题  (#2167, #2419 by @sandtechnology)\n- 修复使用 `ANDROID_PHONE` 或 `ANDROID_PAD` 登录时出现错误 \"版本过低\" 的问题 (#2405, #2423 by @sandtechnology)\n- 为 `friendGroupId` 增加默认值 `0`, 以兼容旧缓存 (#2403 by @cssxsh)"
  },
  {
    "path": "ci-release-helper/changelogs/2.13.4.md",
    "content": "## mirai-core\n\n### 优化和修复\n\n- 修复无法登录的问题 (#2433 by @sandtechnology)\n\n> 此修复也在 2.14.0-RC 包含"
  },
  {
    "path": "ci-release-helper/changelogs/2.14.0-RC.md",
    "content": "## mirai-core\n\n### 不兼容变更\n\n- 删除 SwingLoginSolver (#2410)\n\n> 它以前是设计给解决图形验证码, 而现在基本不会遇到图形验证码了。现在将默认使用命令行版本 LoginSolver。\n> 以前使用 \"-Dno-desktop\" 可以禁用 SwingLoginSolver，现在这个选项将没有效果，不会报错。\n\n- 现在使用 RemoteFile 将会得到编译错误\n\n> RemoteFile 早在 2.8 就弃用了, 使用时会得到警告. 现在起使用将会得到编译错误.\n\n### 新特性\n\n- 群聊获取历史消息 (`Group` 实现 `RoamingSupported`) (#1866, #2332 by @StageGuard )\n\n> 可使用 `group.roamingMessages` / `group.getRoamingMessages()`\n\n- 商城表情: 石头剪刀布 (#2220 by @cssxsh )\n\n> 类型名称为 `RockPaperScissors`\n\n- 群打卡事件支持 (#1663, #2217 by @cssxsh )\n\n> 类型名称为 `SignEvent`\n\n- `Announcement` 现在可以获取 已确认/未确认 的群成员 (#2255 by @cssxsh )\n\n### 优化和修复\n\n- 修复无法登录的问题 (#2433 by @sandtechnology )\n\n> 此修复也会在 2.13.4 包含\n\n- 修复群员列表缓存文件不完整时会导致 bot init 失败的错误 (#2399)\n- 当设备信息等变更的时候清除缓存 (#2346, #2388)\n\n> 不清除会导致登录失败等问题\n\n- 修复 iOS 无法查看私聊转发消息的问题 (#1575)\n- 修复转发消息存在特殊字符时无法加载的问题 (#2241)\n- 修正 `contentToString()` 注释不严谨处 (#2373, #2374 by @MrXiaoM )\n- 修正 PokeMessage.id (#2170)\n- 修复 QuoteReply 无法引用 bot 发出的 ForwardMessage (#2342)\n- 修改日志等级的颜色 (#2336)\n  > 现在 WARN 是金黄色，而不是红色\n\n## mirai-core-mock\n\n### 优化和修复\n\n- 避免 MockAbsoluteFile.md5/sha1 可能为空 (#2436 by @Nambers )\n- 修复部分信息撤回逻辑不正确的错误 (#2421 by @Nambers )\n- 修复 `MockNormalMember.modiyAdmin()` 逻辑错误 (#2420 by @Nambers )\n- 修复 uploadMockImage 上传相同文件时触发 java.nio.file.FileAlreadyExistsException (#2401)\n- 引入 AvatarGenerator\n- 修复联系人头像等信息更新同步的问题\n\n## mirai-console\n\n### 新特性\n\n- JvmPlugin 中现在可以调用 mirai console 所使用的针对 Kotlin object 优化后的 SPI Service Loader (#2247 by @cssxsh)\n\n### 优化和修复\n\n- 修复 `JvmPlugin.onDisable` 被多次执行的错误 (#2015, #2397)\n- 修复低版本 Android 系统报错 `java.lang.NoSuchMethodError: No virtual method getDeclaredAnnotation(Ljava/lang/Class;)L` (#2354 by @zhaodice)\n- 在命令的报错中去除不必要的 `InvocationTargetException` 包装 (#2258 by @cssxsh )\n- 优化 MiraiLogger (在 mirai-console) 性能 (#2341)\n- SLF4J 支持 (#2341)\n\n## IDEA\n\n- 支持 2022.3 (#2372)\n  > - 新插件版本号为 `223-2.14.0-172-1`\n  > - 新版本只支持 2022.3 + Kotlin 1.7.20 (因为 2022.3 捆绑 1.7.20)\n\n---------------\n\n## 关于 mirai-console SLF4J 支持 (#2341)\n\n### 配置文件修改\n\n> 修改均为默认配置, 先前已经生成的配置不会进行修改\n\n### `Logger.yml`\n\n```diff\n # 默认日志输出等级\n # 可选值: ALL, VERBOSE, DEBUG, INFO, WARNING, ERROR, NONE\n defaultPriority: INFO\n # 特定日志记录器输出等级\n loggers: \n   example.logger: NONE\n   console.debug: NONE\n   Bot: ALL\n+  org.eclipse.aether.internal: INFO\n+  org.apache.http.wire: INFO\n\n+# 是否启动外部日志框架桥接\n+binding: \n+  slf4j: true\n```\n\n### ABI 变更\n\n> 注: 实际上 console 没有直接的 ABI 变更\n\n依赖更新: `org.slf4j:slf4j-api:1.7.32` -> `2.0.3`\n\n此依赖的更新只会影响 `slf4j-api` 的对接, 并不会影响 `slf4j-api` 的单纯使用\n\n> 即不会对插件有任何影响, 只会对部分对 console 进行高度自定义的会有少许影响\n\n### 其他 API 变更\n\n- mirai-logging-log4j2 现在使用 `org.apache.logging.log4j:log4j-slf4j2-impl`\n- mirai-logging-slf4j-logback 现在使用 1.3.4\n- mirai-core-all 现在携带的是 slf4j 2.0.x\n\n-------\n\n新年快乐! 🎆🎉\n\n\n\n\n"
  },
  {
    "path": "ci-release-helper/changelogs/2.14.0.md",
    "content": "## mirai-core\n\n### 不兼容变更\n\n- 删除 SwingLoginSolver (#2410)\n> 它以前是设计给解决图形验证码, 而现在基本不会遇到图形验证码了。现在将默认使用命令行版本 LoginSolver。\n> 以前使用 \"-Dno-desktop\" 可以禁用 SwingLoginSolver，现在这个选项将没有效果，不会报错。\n- 现在使用 RemoteFile 将会得到编译错误\n> RemoteFile 早在 2.8 就弃用了, 使用时会得到警告. 现在起使用将会得到编译错误.\n\n### 新特性\n\n- 群聊获取历史消息 (`Group` 实现 `RoamingSupported`) (#1866, #2332 by @StageGuard )\n> 可使用 `group.roamingMessages` / `group.getRoamingMessages()`\n- 商城表情: 石头剪刀布 (#2220 by @cssxsh )\n> 类型名称为 `RockPaperScissors`\n- 群打卡事件支持 (#1663, #2217 by @cssxsh )\n> 类型名称为 `SignEvent`\n- `Announcement` 现在可以获取 已确认/未确认 的群成员 (#2255 by @cssxsh )\n\n### 优化和修复\n\n- 修复无法登录的问题 (#2433 by @sandtechnology )\n> 此修复也会在 2.13.4 包含\n- 修复群员列表缓存文件不完整时会导致 bot init 失败的错误 (#2399)\n- 当设备信息等变更的时候清除缓存 (#2346, #2388)\n> 不清除会导致登录失败等问题\n- 修复 iOS 无法查看私聊转发消息的问题 (#1575)\n- 修复转发消息存在特殊字符时无法加载的问题 (#2241)\n- 修正 `contentToString()` 注释不严谨处 (#2373, #2374 by @MrXiaoM )\n- 修正 PokeMessage.id (#2170)\n- 修复 QuoteReply 无法引用 bot 发出的 ForwardMessage (#2342)\n- 修改日志等级的颜色 (#2336)\n  > 现在 WARN 是金黄色，而不是红色\n\n\n\n## mirai-core-mock\n\n### 优化和修复\n\n- 避免 MockAbsoluteFile.md5/sha1 可能为空 (#2436 by @Nambers )\n- 修复部分信息撤回逻辑不正确的错误 (#2421 by @Nambers )\n- 修复 `MockNormalMember.modiyAdmin()` 逻辑错误 (#2420 by @Nambers )\n- 修复 uploadMockImage 上传相同文件时触发 java.nio.file.FileAlreadyExistsException (#2401)\n- 引入 AvatarGenerator\n- 修复联系人头像等信息更新同步的问题\n\n## mirai-console\n\n### 新特性\n\n- JvmPlugin 中现在可以调用 mirai console 所使用的针对 Kotlin object 优化后的 SPI Service Loader (#2247 by @cssxsh)\n\n### 优化和修复\n\n- 修复 `JvmPlugin.onDisable` 被多次执行的错误 (#2015, #2397)\n- 修复低版本 Android 系统报错 `java.lang.NoSuchMethodError: No virtual method getDeclaredAnnotation(Ljava/lang/Class;)L` (#2354 by @zhaodice)\n- 在命令的报错中去除不必要的 `InvocationTargetException` 包装 (#2258 by @cssxsh )\n- 优化 MiraiLogger (在 mirai-console) 性能 (#2341)\n- SLF4J 支持 (#2341)\n- 修复 Plugin.onLoad 抛出错误时没有终止 console 的错误\n  > 此错误在 2.14.0-RC 引入\n\n## IDEA\n\n- 支持 2022.3 (#2372)\n  > - 新插件版本号为 `223-2.14.0-172-1`\n  > - 新版本只支持 2022.3 + Kotlin 1.7.20 (因为 2022.3 捆绑 1.7.20)\n\n---------------\n\n## 关于 mirai-console SLF4J 支持 (#2341)\n\n### 配置文件修改\n\n> 修改均为默认配置, 先前已经生成的配置不会进行修改\n\n### `Logger.yml`\n\n```diff\n # 默认日志输出等级\n # 可选值: ALL, VERBOSE, DEBUG, INFO, WARNING, ERROR, NONE\n defaultPriority: INFO\n # 特定日志记录器输出等级\n loggers: \n   example.logger: NONE\n   console.debug: NONE\n   Bot: ALL\n+  org.eclipse.aether.internal: INFO\n+  org.apache.http.wire: INFO\n\n+# 是否启动外部日志框架桥接\n+binding: \n+  slf4j: true\n```\n\n### ABI 变更\n\n> 注: 实际上 console 没有直接的 ABI 变更\n\n依赖更新: `org.slf4j:slf4j-api:1.7.32` -> `2.0.3`\n\n此依赖的更新只会影响 `slf4j-api` 的对接, 并不会影响 `slf4j-api` 的单纯使用\n\n> 即不会对插件有任何影响, 只会对部分对 console 进行高度自定义的会有少许影响\n\n### 其他 API 变更\n\n- mirai-logging-log4j2 现在使用 `org.apache.logging.log4j:log4j-slf4j2-impl`\n- mirai-logging-slf4j-logback 现在使用 1.3.4\n- mirai-core-all 现在携带的是 slf4j 2.0.x\n\n\n"
  },
  {
    "path": "ci-release-helper/changelogs/2.15.0-M1.md",
    "content": "## mirai-core\n\n### 不兼容变更\n\n- 删除了旧版的为兼容 Java 生成的阻塞式方法桥\n  > 这只会导致依赖 mirai [2.1.0](https://github.com/mamoe/mirai/releases/tag/2.1.0) (发布于 2 年前) 编译的 Java 代码现在无法使用 mirai 2.15.0-M1 级以上版本运行. 将它们使用 2.15.0-M1 及以上重新编译即可运行.\n  >\n  > 这是因为 KJBB 以前有 bug, 会生成返回值为 `Unit` 的方法桥. mirai 为了兼容, 一直让 KJBB 既生成返回 `Unit` 的, 也生成返回 `void` 的. 但自 Kotiln 编译器 1.8.0 起, 其 IR lowering 会把 `companion object` 中的静态函数 `@JvmStatic` 的返回值由 `Unit` 变更为 `void`, 导致编译器插件 KJBB 不再能做兼容.\n\n### 新特性\n\n- 支持扫码登录 (#2502 with @StageGuard, #1281)\n\n新的登录方法通过 `BotAuthorization` & `BotFactory.newBot(id: Long, authorization: BotAuthorization)` 登录\n\n关于详细的使用方法请参考 `BotAuthorization` 的注释\n\n扫码登录的实现不一定稳定 (因为涉及修改了大量内部登录和维护在线逻辑), 文档也还在正在准备中.   \n**在 2.15.0-RC 可能会修改扫码登录的 API**.\n\n> mirai-console **尚未支持\n**在命令中指定扫码登录, 但是提供了 `MiraiConsole.addBot(id: Long, authorization: BotAuthorization)` 用于扫码登录\n\n### 优化和修复\n\n- 更新 Kotlin 到 1.8.10, kotlinx-serialization 到 1.5.0 (#2578)\n- 修复特殊情况可能无法加载 services 的问题 (#2268, #2511 by @Nambers, #2428 by @cssxsh)\n  > 例如在 Minecraft 插件中\n- 增加 TxCaptchaHelper 可用性无法保证的警告 (#2564 by @MrXiaoM)\n- 修正消息多态序列化, 输出的 JSON 不再包含多余的 \"type\" 字段 (#2414)\n- 修正群公告发送失败报错 `no login` (#2069, #2512 by @cssxsh)\n- 修正使用 `Announcements.get(fid)` 出现 `kotlinx.serialization.MissingFieldException: Field 'msg'` (#2509, #2512 by @cssxsh)\n- 修正短暂断网时不能成功重连 (#2488, #2504, #2505 by @sandtechnology)\n- 修复 `OfflineMessageSource` 回复时, 引用回复的 At 变空白的问题 (#2501)\n- 在无法连接服务器时在报错信息中携带尝试连接的服务器 (#2576 by @cssxsh)\n- 修正 dumpTlvMap 返回值不正确的问题 (内部) (#2557 by @MrXiaoM)\n- 修正文档细节 (#2547 by @7aGiven)\n\n## mirai-core-mock\n- 在 upload 后的 MockImage 中提供 size 属性 (#2515)\n\n## mirai-console\n\n### 新特性\n- JvmPlugin 以 `getResource` 方法获取全局资源文件 (#2536 by @ArgonarioD)\n- 添加新事件 `StartupEvent`, `AutoLoginEvent` (#2446 by @cssxsh)\n  > 分别在 Console 启动完成后, 和自动登录后触发\n\n### 优化和修复\n- 文档修正(#2503 by @7aGiven, #2506 by @7aGiven, #2457 by @char-46, #2577 by @cssxsh, #2491 by @EnchStudio)\n- 修复在Android系统运行时，被杀后台时抛出的 InterruptedException 导致崩溃 (#2474 by @zhaodice)\n- 修复使用 Console 扩展时，对于扩展的函数返回非 null 值报错的情况 (#2528 by @NoMathExpectation)\n"
  },
  {
    "path": "ci-release-helper/changelogs/README.md",
    "content": "# Changelogs\n\n本目录存档历史版本的变更记录"
  },
  {
    "path": "ci-release-helper/scripts/kill-java.js",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\nlet ostype = require('os').type();\nlet child_process = require('child_process');\n\nif (ostype.toLowerCase().indexOf('windows') !== -1) {\n    child_process.spawnSync('taskkill',\n        ['/f', '/im', 'java*'],\n        {\n            stdio: \"inherit\"\n        }\n    );\n} else {\n    child_process.spawnSync('pkill',\n        ['-9', 'java'],\n        {\n            stdio: \"inherit\"\n        }\n    );\n}\n"
  },
  {
    "path": "ci-release-helper/src/CiHelper.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n@file:JvmName(\"CiHelperKt\")\n\npackage cihelper\n\nimport kotlinx.serialization.json.Json\nimport kotlinx.serialization.json.JsonObject\nimport kotlinx.serialization.json.jsonObject\nimport kotlinx.serialization.json.jsonPrimitive\nimport java.io.File\nimport java.io.OutputStream\nimport java.net.URI\nimport java.net.http.HttpClient\nimport java.net.http.HttpRequest\nimport java.net.http.HttpResponse\nimport java.nio.charset.Charset\nimport java.nio.file.FileSystems\nimport java.nio.file.Files\nimport java.nio.file.Paths\nimport java.nio.file.attribute.PosixFilePermission\nimport java.nio.file.attribute.PosixFilePermissions\nimport java.security.MessageDigest\nimport java.util.*\nimport java.util.stream.Collectors\nimport kotlin.io.path.*\n\nprivate val hexTemplate: CharArray = \"0123456789abcdef\".toCharArray()\nprivate const val useragent = \"Gradle/7.3.1 (Windows 10;10.0;amd64) (Azul Systems, Inc.;18.0.2.1;18.0.2.1+1)\"\n\nfun ByteArray.hexToString(): String {\n    val sb = StringBuilder(this.size * 2)\n    forEach { sbyte ->\n        sb.append(hexTemplate[sbyte.toInt().shr(4).and(0xF)])\n        sb.append(hexTemplate[sbyte.toInt().and(0xF)])\n    }\n    return sb.toString()\n}\n\nprivate fun getAuth(): String {\n\n    val cert_username =\n        System.getenv(\"CERT_USERNAME\") ?: System.getProperty(\"cihelper.cert.username\") ?: error(\"CERT_USERNAME\")\n    val cert_password =\n        System.getenv(\"CERT_PASSWORD\") ?: System.getProperty(\"cihelper.cert.password\") ?: error(\"CERT_PASSWORD\")\n\n    return \"Basic \" + Base64.getEncoder().encodeToString(\n        (\"$cert_username:$cert_password\").toByteArray()\n    )\n}\n\n@Suppress(\"Since15\")\nfun main(args: Array<String>) {\n    val projVer = System.getenv(\"PROJ_VERSION\") ?: error(\"Please use `./gradlew runcihelper --args XXXX`\")\n    val projArtifacts = System.getenv(\"PROJ_ARTIFACTS\")!!.split(\"|\")\n    val repoLoc = System.getenv(\"PROJ_MiraiStageRepo\")!!.let { Paths.get(URI.create(it)) }\n\n    if (args.isEmpty()) error(\"no action\")\n\n    val relatedRepoLoc = repoLoc.resolve(\"net/mamoe\")\n\n    val httpc = HttpClient.newBuilder().build()\n\n    when (args[0]) {\n\n        \"sync-maven-metadata\" -> {\n            // https://repo1.maven.org/maven2/net/mamoe/mirai-core-all/maven-metadata.xml\n\n            projArtifacts.forEach { projArtifact ->\n                val savedLoc = relatedRepoLoc.resolve(projArtifact)\n                    .createDirectories()\n                    .resolve(\"maven-metadata.xml\")\n\n                println(\"[metadata.xml] Syncing $projArtifact\")\n\n                val verPath = relatedRepoLoc.resolve(projArtifact).resolve(projVer)\n\n                val isNotEmpty = if (verPath.exists()) {\n                    Files.newDirectoryStream(verPath).use { it.iterator().hasNext() }\n                } else false\n\n                if (isNotEmpty) {\n                    println(\"[metadata.xml] Skipped $projArtifact because it was published to stage.\")\n                    return@forEach\n                }\n\n\n                val rsp = httpc.send(\n                    HttpRequest.newBuilder(\n                        URI.create(\"https://repo1.maven.org/maven2/net/mamoe/$projArtifact/maven-metadata.xml\")\n                    ).GET().build(),\n                    HttpResponse.BodyHandlers.ofFile(savedLoc)\n                )\n                if (rsp.statusCode() != 200) {\n                    if (rsp.statusCode() == 404) {\n                        savedLoc.deleteIfExists()\n                        return@forEach\n                    }\n                    error(\"$rsp -> \" + savedLoc.takeIf { it.isRegularFile() }?.readText())\n                }\n            }\n        }\n\n        \"create-stage-repo\" -> {\n            val rsp = httpc.send(\n                HttpRequest.newBuilder(\n                    URI.create(\n                        \"https://oss.sonatype.org/service/local/staging/profiles/${\n                            System.getProperty(\n                                \"cihelper.cert.profileid\"\n                            )\n                        }/start\"\n                    )\n                )\n                    .header(\"User-Agent\", useragent)\n                    .header(\"Authorization\", getAuth())\n                    .header(\"Content-Type\", \"application/json;charset=utf-8\")\n                    .POST(HttpRequest.BodyPublishers.ofString(\"{\\\"data\\\":{\\\"description\\\": \\\"mamoe/mirai release $projVer\\\"}}\"))\n                    .build(),\n                HttpResponse.BodyHandlers.ofString()\n            )\n            if (rsp.statusCode() != 201) {\n                error(rsp.toString())\n            }\n            val rspx = Json.decodeFromString(JsonObject.serializer(), rsp.body())\n            val stagedRepositoryId = rspx[\"data\"]!!.jsonObject[\"stagedRepositoryId\"]!!.jsonPrimitive.content\n\n            File(\"ci-release-helper\").also { it.mkdirs() }\n                .resolve(\"repoid\").writeText(stagedRepositoryId)\n        }\n\n        \"publish-to-maven-central\" -> {\n            // https://oss.sonatype.org/service/local/staging/deploy/maven2\n            relatedRepoLoc.listDirectoryEntries().forEach { subdir ->\n                val verpath = subdir.resolve(projVer)\n                val doDelete = if (!verpath.isDirectory()) {\n                    true\n                } else {\n                    verpath.listDirectoryEntries().isEmpty()\n                }\n                if (doDelete) {\n                    subdir.toFile().deleteRecursively()\n                }\n            }\n            val pendingFiles = Files.walk(relatedRepoLoc)\n                .filter { it.isRegularFile() }\n                .filter { !it.name.endsWith(\".md5\") && !it.name.endsWith(\".sha1\") }\n                .filter { !it.name.endsWith(\".asc\") }\n                .use { stream -> stream.collect(Collectors.toList()) }\n\n            run `sign artifacts`@{\n                // build-gpg-sign/keys.gpg\n                // build-gpg-sign/keys.gpg.pub\n                val bgs = Paths.get(\"build-gpg-sign\").toAbsolutePath()\n                if (!bgs.isDirectory()) return@`sign artifacts`\n                val gpgHomeDir = bgs.resolve(\"homedir\")\n                val bgsFile = bgs.toFile()\n\n                fun execGpg(vararg cmd: String) {\n                    println(\"::group::${cmd.joinToString(\" \")}\")\n                    try {\n                        val exitcode = ProcessBuilder(\"gpg\", \"--homedir\", \"homedir\", \"--batch\", \"--no-tty\", *cmd)\n                            .directory(bgsFile)\n                            .inheritIO()\n                            .start()\n                            .waitFor()\n                        if (exitcode != 0) {\n                            error(\"Exit code $exitcode != 0\")\n                        }\n                    } finally {\n                        println(\"::endgroup::\")\n                    }\n                }\n\n\n                if (!gpgHomeDir.resolve(\"pubring.kbx\").exists()) {\n\n                    val keys = arrayOf(\"keys.gpg\", \"keys.gpg.pub\")\n                    if (!keys.all { bgs.resolve(it).isRegularFile() }) return@`sign artifacts`\n\n                    val isPosix = FileSystems.getDefault().supportedFileAttributeViews().contains(\"posix\")\n                    val dirPermissions = PosixFilePermissions.asFileAttribute(\n                        EnumSet.of(\n                            PosixFilePermission.OWNER_READ,\n                            PosixFilePermission.OWNER_WRITE,\n                            PosixFilePermission.OWNER_EXECUTE\n                        )\n                    )\n\n                    Files.createDirectories(\n                        gpgHomeDir,\n                        *if (isPosix) arrayOf(dirPermissions) else arrayOf(),\n                    )\n\n                    keys.forEach { execGpg(\"--import\", it) }\n                }\n\n\n                println(\"::group::Signing artifacts\")\n                pendingFiles.toList().asSequence().filterNot { it.name == \"maven-metadata.xml\" }\n                    .forEach { pendingFile ->\n                        val pt = pendingFile.absolutePathString()\n                        val ascFile = pendingFile.resolveSibling(pendingFile.name + \".asc\")\n                        ascFile.deleteIfExists()\n                        execGpg(\"-a\", \"--detach-sig\", \"--sign\", pt)\n\n                        pendingFiles.add(ascFile)\n                    }\n                println(\"::endgroup::\")\n            }\n\n            run `calc msg digest`@{\n                pendingFiles.toList().forEach { pendingFile ->\n                    val sha1MD = MessageDigest.getInstance(\"SHA-1\")\n                    val md5MD = MessageDigest.getInstance(\"MD5\")\n\n                    pendingFile.inputStream().use { content ->\n                        content.copyTo(object : OutputStream() {\n                            override fun write(b: Int) {\n                                sha1MD.update(b.toByte())\n                                md5MD.update(b.toByte())\n                            }\n\n                            override fun write(b: ByteArray, off: Int, len: Int) {\n                                sha1MD.update(b, off, len)\n                                md5MD.update(b, off, len)\n                            }\n                        })\n                    }\n\n                    val sha1 = sha1MD.digest().hexToString()\n                    val mg5 = md5MD.digest().hexToString()\n\n                    val pfname = pendingFile.name\n                    val sha1File = pendingFile.resolveSibling(\"$pfname.sha1\")\n                    val md5File = pendingFile.resolveSibling(\"$pfname.md5\")\n\n                    sha1File.writeText(sha1)\n                    md5File.writeText(mg5)\n\n                    pendingFiles.add(sha1File)\n                    pendingFiles.add(md5File)\n                }\n            }\n\n            pendingFiles.sort()\n\n            println(\"::group::Publishing to Maven Central\")\n\n            val authorization = getAuth()\n            val errors = mutableListOf<String>()\n\n            fun resolveSonatypeRepoLoc(): String {\n                val repoIdPath = Paths.get(\"ci-release-helper/repoid\")\n\n                var repoId = \"\"\n                if (repoIdPath.isRegularFile()) {\n                    repoId = repoIdPath.readText().trim()\n                } else if (repoIdPath.isDirectory()) {\n                    val files = repoIdPath.listDirectoryEntries().filter { it.isRegularFile() }\n                    if (files.size == 1) {\n                        repoId = files.first().readText().trim()\n                    }\n                }\n                if (repoId.isNotBlank()) {\n                    return \"https://oss.sonatype.org/service/local/staging/deployByRepositoryId/$repoId/\"\n                }\n\n                return \"https://oss.sonatype.org/service/local/staging/deploy/maven2/\"\n            }\n\n            val repoServerLocation = resolveSonatypeRepoLoc()\n\n            pendingFiles.forEach { pending ->\n                val netpath = repoLoc.relativize(pending)\n\n                val uri = repoServerLocation + (netpath.toString().replace(\"\\\\\", \"/\"))\n\n                println(\"Processing $uri\")\n\n                val rsp = httpc.send(\n                    HttpRequest.newBuilder(\n                        URI.create(uri)\n                    ).PUT(HttpRequest.BodyPublishers.ofFile(pending))\n                        .header(\"Authorization\", authorization)\n                        .header(\"User-Agent\", useragent)\n                        .build(),\n                    HttpResponse.BodyHandlers.ofByteArray()\n                )\n                if (rsp.statusCode() / 100 != 2) {\n                    val errmsg = \"$rsp -> \" + String(rsp.body(), Charset.defaultCharset())\n                    errors.add(errmsg)\n                    println(errmsg)\n                }\n            }\n\n            println(\"::endgroup::\")\n            if (errors.isNotEmpty()) {\n                error(errors.joinToString(\"\\n\\n\", prefix = \"\\n\"))\n            }\n        }\n\n        else -> error(\"Unknown command: \" + args.joinToString(\" \"))\n    }\n}\n"
  },
  {
    "path": "ci-release-helper/src/buildIndex/Index.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:UseSerializers(UuidAsStringSerializer::class)\n\npackage cihelper.buildIndex\n\nimport kotlinx.datetime.LocalDateTime\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.UseSerializers\nimport kotlinx.serialization.builtins.serializer\nimport kotlinx.serialization.descriptors.SerialDescriptor\nimport kotlinx.serialization.encoding.Decoder\nimport kotlinx.serialization.encoding.Encoder\nimport java.util.*\n\n@Serializable\ndata class NextIndexResp(\n    val moduleId: UUID,\n    val branchId: UUID,\n    val previousIndexId: UUID?,\n    val previousIndexValue: UInt?,\n    val newIndex: Index\n)\n\n@Serializable\ndata class Index(\n    val id: UUID,\n    val branchId: UUID,\n    val commitRef: String,\n    val value: UInt,\n    val date: LocalDateTime\n) {\n    init {\n        require(commitRef.length == 40) { \"Invalid commit ref: '$commitRef'\" }\n    }\n}\n\n\nobject UuidAsStringSerializer : KSerializer<UUID> {\n    override val descriptor: SerialDescriptor = String.serializer().descriptor\n    override fun deserialize(decoder: Decoder): UUID {\n        return UUID.fromString(String.serializer().deserialize(decoder))\n    }\n\n    override fun serialize(encoder: Encoder, value: UUID) {\n        String.serializer().serialize(encoder, value.toString())\n    }\n}"
  },
  {
    "path": "ci-release-helper/src/buildIndex/SnapshotVersions.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage cihelper.buildIndex\n\nimport io.ktor.client.*\nimport io.ktor.client.request.*\nimport io.ktor.client.statement.*\nimport io.ktor.http.*\nimport kotlinx.coroutines.runBlocking\nimport kotlinx.serialization.builtins.ListSerializer\nimport kotlinx.serialization.json.Json\n\nobject GetNextSnapshotIndex {\n    @JvmStatic\n    fun main(args: Array<String>) {\n        val branch = args.getOrNull(0)?.replace(Regex(\"\"\"[/\\\\.,`~!@#$%^&*(){}\\[\\]|;]\"\"\"), \"-\")\n            ?: error(\"Missing branch argument\")\n        val commitRef = args.getOrNull(1) ?: error(\"Missing commitRef argument\")\n\n\n        println(\"Commit ref is: $commitRef\")\n        println(\"Making request...\")\n        HttpClient().use { client ->\n            runBlocking {\n                kotlin.runCatching { client.createBranch(branch = branch) }\n\n                var index = client.getExistingIndex(branch = branch, commitRef = commitRef)\n                if (index == null) {\n                    print(\"No existing index found. \")\n                    index = client.postNextIndex(branch = branch, commitRef = commitRef)\n                    println(\"Got new index: $index\")\n                } else {\n                    print(\"Existing index: $index\")\n                }\n                println()\n\n                println(\"<SNAPSHOT_VERSION_START>$branch-${index.value}<SNAPSHOT_VERSION_END>\")\n            }\n        }\n    }\n}\n\nsuspend fun HttpClient.getExistingIndex(\n    module: String = \"mirai-core\",\n    branch: String,\n    commitRef: String,\n): Index? {\n    // https://build.mirai.mamoe.net/v1/mirai-core/dev/indexes/?commitRef=29121565132bed6e996f3de32faaf49106ae8e39\n    val resp =\n        get(\"https://build.mirai.mamoe.net/v1/${module.encodeURLPathPart()}/${branch.encodeURLPathPart()}/indexes/\") {\n            basicAuth(\n                System.getenv(\"mirai.build.index.auth.username\"),\n                System.getenv(\"mirai.build.index.auth.password\")\n            )\n            parameter(\"commitRef\", commitRef)\n        }\n    if (!resp.status.isSuccess()) {\n        val body = runCatching { resp.bodyAsText() }.getOrNull()\n        throw IllegalStateException(\"Request failed: ${resp.status}  $body\")\n    }\n\n    val body = resp.bodyAsText()\n    if (body.isBlank()) return null\n    return Json.decodeFromString(ListSerializer(Index.serializer()), body).lastOrNull()\n}\n\nsuspend fun HttpClient.createBranch(\n    module: String = \"mirai-core\",\n    branch: String,\n): Boolean {\n    // https://build.mirai.mamoe.net/v1/mirai-core/dev/indexes/?commitRef=29121565132bed6e996f3de32faaf49106ae8e39\n    val resp = put(\"https://build.mirai.mamoe.net/v1/${module.encodeURLPathPart()}/${branch.encodeURLPathPart()}\") {\n        basicAuth(\n            System.getenv(\"mirai.build.index.auth.username\"),\n            System.getenv(\"mirai.build.index.auth.password\")\n        )\n    }\n    return resp.status.isSuccess()\n}\n\nsuspend fun HttpClient.postNextIndex(\n    module: String = \"mirai-core\",\n    branch: String,\n    commitRef: String,\n): Index {\n    val resp =\n        post(\"https://build.mirai.mamoe.net/v1/${module.encodeURLPathPart()}/${branch.encodeURLPathPart()}/indexes/next\") {\n            basicAuth(\n                System.getenv(\"mirai.build.index.auth.username\"),\n                System.getenv(\"mirai.build.index.auth.password\")\n            )\n            parameter(\"commitRef\", commitRef)\n        }\n    if (!resp.status.isSuccess()) {\n        val body = runCatching { resp.bodyAsText() }.getOrNull()\n        throw IllegalStateException(\"Request failed: ${resp.status}  $body\")\n    }\n\n    val body = resp.bodyAsText()\n    return Json.decodeFromString(NextIndexResp.serializer(), body).newIndex\n}"
  },
  {
    "path": "ci-release-helper/src/package.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage cihelper\n\n"
  },
  {
    "path": "docs/.conf/nav.js",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nmodule.exports = {\n    text: \"mirai-core\",\n    link: \"/\",\n    items: [\n        {text: \"Index\", link: \"/\"},\n        {text: \"Mirai 生态概览\", link: \"/mirai-ecology.html\"},\n        {text: \"从 1.x 迁移\", link: \"/MigrationFrom1x.html\"},\n        {text: '用户手册', link: '/UserManual.html'},\n        {text: '用户手册 - 控制台', link: '/ConsoleTerminal.html'},\n        {text: 'JVM 环境和开发准备工作', link: '/Preparations.html'},\n        {text: \"配置项目\", link: \"/ConfiguringProjects.html\"},\n        {text: \"常见问题\", link: \"/Questions.html\"},\n        {\n            text: \"CoreAPI\", items: [\n                {text: \"CoreAPI\", link: \"/CoreAPI.html\"},\n                {text: \"机器人\", link: \"/Bots.html\"},\n                {text: \"联系人\", link: \"/Contacts.html\"},\n                {text: \"事件\", link: \"/Events.html\"},\n                {text: \"消息\", link: \"/Messages.html\"},\n            ]\n        },\n        {\n            text: \"Misc\", items: [\n                {text: '主要API', link: '/ConciseAPI.html'},\n                {text: 'Mirai - Evolution', link: '/Evolution.html'},\n                {text: 'Kotlin & Java', link: '/KotlinAndJava.html'},\n                {text: \"事件列表\", link: \"/EventList.html\"},\n                {text: \"Debugging Network\", link: \"/DebuggingNetwork.html\"},\n                {text: \"Using Dev Snapshots\", link: \"/UsingSnapshots.html\"},\n                {text: \"mirai 模拟测试框架\", link: \"/mocking/Mocking.md\"},\n            ]\n        },\n    ],\n};"
  },
  {
    "path": "docs/Bots.md",
    "content": "# Mirai - Bots\n\n**目录**\n\n- [1. 创建和配置 `Bot`](#1-创建和配置-bot)\n  - [配置 Bot](#配置-bot)\n  - [重要配置](#重要配置)\n    - [切换心跳策略](#切换心跳策略)\n    - [切换登录协议](#切换登录协议)\n    - [覆盖登录解决器](#覆盖登录解决器)\n  - [常用配置](#常用配置)\n    - [修改运行目录](#修改运行目录)\n    - [修改 Bot 缓存目录](#修改-bot-缓存目录)\n    - [设备信息](#设备信息)\n    - [使用其他日志库接管 mirai 日志系统](#使用其他日志库接管-mirai-日志系统)\n    - [重定向日志](#重定向日志)\n    - [启用列表缓存](#启用列表缓存)\n    - [更多配置](#更多配置)\n  - [获取当前所有 `Bot` 实例](#获取当前所有-bot-实例)\n- [2. 登录](#2-登录)\n  - [处理滑动验证码](#处理滑动验证码)\n  - [常见登录失败原因](#常见登录失败原因)\n- [附录: 调试网络层](#附录-调试网络层)\n- [附录: 模拟测试框架](#附录-模拟测试框架)\n\n## 1. 创建和配置 `Bot`\n\n一个机器人被以 `Bot` 对象描述。mirai 的交互入口点是 `Bot`。`Bot` 只可通过 [`BotFactory`](../mirai-core-api/src/commonMain/kotlin/BotFactory.kt#L22-L87) 内的 `newBot` 方法获得：\n\n```kotlin\ninterface BotFactory {\n    fun newBot(qq: Long, password: String, configuration: BotConfiguration): Bot\n    fun newBot(qq: Long, password: String): Bot\n    fun newBot(qq: Long, passwordMd5: ByteArray, configuration: BotConfiguration): Bot\n    fun newBot(qq: Long, passwordMd5: ByteArray): Bot\n    // 在 2.15.0 中加入\n    fun newBot(qq: Long, authorization: BotAuthorization)\n    fun newBot(qq: Long, authorization: BotAuthorization, configuration: BotConfiguration)\n    \n    companion object : BotFactory by BotFactoryImpl\n}\n```\n\n通常的调用方法为：\n```\n// Kotlin\nval bot = BotFactory.newBot(    )\n\n// Java\nBot bot = BotFactory.INSTANCE.newBot(    );\n```\n\n> Scala 使用者请查看 [#834](https://github.com/mamoe/mirai/issues/834)\n\n### 配置 Bot\n可以切换使用的协议、控制日志输出等。\n\n仅能在构造 Bot 时修改其配置：\n```\n// Kotlin\n// 使用密码登录\nval bot = BotFactory.newBot(qq, password) {\n    // 配置，例如：\n    fileBasedDeviceInfo()\n}\n// 在 2.15.0 中加入, 使用二维码登录\nval bot = BotFactory.newBot(qq, BotAuthorization.byQRCode()) {\n    protocol = BotConfiguration.MiraiProtocol.ANDROID_WATCH\n}\n\n// Java\n// 使用密码登录\nBot bot = BotFactory.INSTANCE.newBot(qq, password, new BotConfiguration() {{\n    // 配置，例如：\n    fileBasedDeviceInfo()\n}});\nBot bot = BotFactory.INSTANCE.newBot(qq, password, configuration -> {})\n// 在 2.15.0 中加入, 使用二维码登录\nBot bot = BotFactory.INSTANCE.newBot(qq, BotAuthorization.byQRCode(), configuration -> {\n    configuration.setProtocol(BotConfiguration.MiraiProtocol.ANDROID_WATCH);\n});\n```\n\n下文示例代码都要放入 `// 配置` 中。\n\n> 可在 [BotConfiguration.kt](../mirai-core-api/src/commonMain/kotlin/utils/BotConfiguration.kt#L23) 查看完整配置列表\n\n### 重要配置\n\n#### 切换心跳策略\n\n心跳策略默认为最佳的 `STAT_HB`，但不适用于一些账号。\n\n如果遇到 Bot **闲置一段时间后**，发消息返回成功但群内收不到的情况，请切换心跳策略，依次尝试 `STAT_HB`、`REGISTER` 和 `NONE`。\n\n```\n// Kotlin\nheartbeatStrategy = BotConfiguration.HeartbeatStrategy.REGISTER\n\n// Java\nsetHeartbeatStrategy(BotConfiguration.HeartbeatStrategy.REGISTER)\n```\n\n#### 切换登录协议\nMirai 支持多种登录协议：`ANDROID_PHONE`，`ANDROID_PAD`，`ANDROID_WATCH`，`IPAD`，`MACOS` 默认使用 `ANDROID_PHONE`。\n\n若登录失败，可尝试切换协议。**但注意部分功能在部分协议上不受支持**，详见源码内注释。\n\n要切换协议：\n```\n// Kotlin\nprotocol = BotConfiguration.MiraiProtocol.ANDROID_PAD\n\n// Java\nsetProtocol(MiraiProtocol.ANDROID_PAD)\n```\n\n#### 覆盖登录解决器\n\n在登录时可能遇到图形验证码或滑动验证码，Mirai 会使用 `LoginSolver` 解决验证码。\n\n- 在 JVM, Mirai 提供默认的命令行实现\n- 在 Android 需要手动实现 `LoginSolver`\n\n若要覆盖默认的 `LoginSolver` （通常不需要）：\n```\n// Kotlin\nloginSolver = YourLoginSolver\n\n// Java\nsetLoginSolver(new YourLoginSolver())\n```\n\n> 要获取更多有关 `LoginSolver` 的信息，查看 [LoginSolver.kt](../mirai-core-api/src/commonMain/kotlin/utils/LoginSolver.kt#L32)\n\n### 常用配置\n\n#### 修改运行目录\n默认为 `File(\".\")`\n\n```\n// Kotlin\nworkingDir = File(\"C:/mirai\")\n\n// Java\nsetWorkingDir(new File(\"C:/mirai\"))\n```\n\n#### 修改 Bot 缓存目录\n\n缓存目录会相对于 `workingDir` 解析。如 `File(\"cache\")` 将会解析为 `workingDir` 内的 `cache` 目录。而 `File(\"C:/cache\")` 将会解析为绝对的 `C:/cache` 目录。\n\n默认为 `File(\"cache\")`\n\n要修改缓存目录（自 mirai 2.4.0）：\n```\n// Kotlin\ncacheDir = File(\"cache\") // 最终为 workingDir 目录中的 cache 目录\ncacheDir = File(\"C:/cache\") // 最终为 C:/cache\n\n// Java\nsetCacheDir(new File(\"cache\")) // 最终为 workingDir 目录中的 cache 目录\nsetCacheDir(new File(\"C:/cache\")) // 最终为 C:/cache\n```\n\n目前缓存目录会存储列表缓存、登录服务器、资源会话秘钥等。这些数据的存储方式有可能变化，请不要修改缓存目录中的文件。\n\n[FileCacheStrategy]: ../mirai-core-api/src/commonMain/kotlin/utils/FileCacheStrategy.kt#L55\n\n注意，`cacheDir` 仅存储与 Bot 相关的上述信息。其他的如 `InputStream` 的缓存由 [FileCacheStrategy] 管理，默认使用系统临时文件。\n\n#### 设备信息\nBot 默认使用全随机的设备信息。**在更换账号地点时候使用随机设备信息可能会导致无法登录**，当然，**成功登录时使用的设备信息也可以保存后在新的设备使用**。\n\n若要在服务器部署，可以先在本地完成登录，再将设备信息上传到服务器。一个设备信息可以一直使用。\n\n要使用 `device.json` 存储设备信息：\n```\nfileBasedDeviceInfo() // 存储为 \"device.json\" \n// 或\nfileBasedDeviceInfo(\"myDeviceInfo.json\") // 存储为 \"myDeviceInfo.json\"\n```\n\n要自定义设备信息：\n```\n// Kotlin\ndeviceInfo = { bot ->  /* create device info */   }\n\n// Java\nsetDeviceInfo(bot -> /* create device info */)\n```\n\n在线生成自定义设备信息的 `device.json`: https://ryoii.github.io/mirai-devicejs-generator/  \n更加仿真的设备信息的 `device.json`: https://github.com/cssxsh/mirai-device-generator\n\n#### 使用其他日志库接管 mirai 日志系统\n*mirai 2.7 起支持*\n\n使用 Log4J, SLF4J 等接管 mirai 日志系统后则可使用它们的过滤等高级功能。参阅 [mirai-logging](../logging/README.md) 以获取更多信息。\n\n#### 重定向日志\nBot 有两个日志类别，`Bot` 或 `Net`。`Bot` 为通常日志，如收到事件。`Net` 为网络日志，包含收到和发出的每一个包和网络层解析时遇到的错误。\n\n重定向日志到文件：\n```\nredirectBotLogToFile()\nredirectBotLogToDirectory()\n\nredirectNetworkLogToFile()\nredirectNetworkLogToDirectory()\n```\n\n关闭日志(将会完全禁用日志功能, 无论是否已经通过第三方日志库接管日志系统)：\n```\nnoNetworkLog()\nnoBotLog()\n```\n\n手动覆盖日志(不建议[(?)](../logging/README.md))：\n```\n// Kotlin\nnetworkLoggerSupplier = { bot -> /* create logger */ }\nbotLoggerSupplier = { bot -> /* create logger */ }\n\n// Java\nsetNetworkLoggerSupplier(bot -> /* create logger */)\nsetBotLoggerSupplier(bot -> /* create logger */)\n```\n\n#### 启用列表缓存\nMirai 在启动时会拉取全部好友列表和群成员列表。当账号拥有过多群时登录可能缓慢，开启列表缓存会大幅加速登录过程。\n\nMirai 自动根据事件更新列表，并在每次登录时与服务器校验缓存有效性，**但有时候可能发生意外情况导致列表没有同步。如果出现找不到群员或好友等不同步情况，请关闭缓存并[提交 Bug](https://github.com/mamoe/mirai/issues/new?assignees=&labels=question&template=bug.md)**\n\n建议在测试环境使用缓存，而在正式环境关闭缓存（默认关闭缓存）。\n\n要开启列表缓存（自 mirai 2.4.0）：\n```\n// 开启所有列表缓存\nenableContactCache()\n```\n\n也可以只开启部分缓存：\n```\n// Kotlin\ncontactListCache {\n    friendListCacheEnabled = true // 开启好友列表缓存\n    groupMemberListCacheEnabled = true // 开启群成员列表缓存\n    \n    saveIntervalMillis = 60_000 // 可选设置有更新时的保存时间间隔, 默认 60 秒\n}\n\n// Java\ncontactListCache.setFriendListCacheEnabled(true) // 开启好友列表缓存\ncontactListCache.setGroupMemberListCacheEnabled(true) // 开启群成员列表缓存\ncontactListCache.setSaveIntervalMillis(60000) // 可选设置有更新时的保存时间间隔, 默认 60 秒\n```\n\n#### 更多配置\n\n参阅 `BotConfiguration` 源码内注释。\n\n### 获取当前所有 `Bot` 实例\n\n在登录后 `Bot` 实例会被自动记录。可在 `Bot.instances` 获取到当前**在线**的所有 `Bot` 列表。\n\n## 2. 登录\n\n创建 `Bot` 后不会自动登录，需要手动调用其 `login()` 方法。只需要调用一次 `login()` 即可，`Bot` 掉线时会自动重连。\n\n### 处理滑动验证码\n\n[mirai-login-solver-sakura]: https://github.com/KasukuSakura/mirai-login-solver-sakura\n\n服务器正在大力推广滑块验证码。\n\n部分账号可以跳过滑块验证码，Mirai 会自动尝试。  \n若你的账号无法跳过验证，可尝试使用 [mirai-login-solver-sakura] 处理。\n\n**若遇到滑块验证问题无法解决，可以参考[论坛帮助页面](https://mirai.mamoe.net/topic/223)。**\n\n### 常见登录失败原因\n\n[#993]: https://github.com/mamoe/mirai/discussions/993\n\n| 错误信息       | 可能的原因                | 可能的解决方案                                     |\n|:-----------|:---------------------|:--------------------------------------------|\n| 密码错误       | 密码错误或过长              | 手机协议最大支持 16 位密码 ([#993]). 在官方 PC 客户端登录后修改密码 |\n| `code=45`  | 协议版本过低或设备信息被拉黑       | 删除 device.json, 让其重新生成                      |\n| `code=235` | 协议版本过低或设备信息被拉黑       | 删除 device.json, 让其重新生成                      |\n| `code=237` | 滑块验证处理过慢或者提交ticket有误 | 尝试使用 [mirai-login-solver-sakura] 处理滑块验证     |\n| `code=238` | 当前协议已禁止密码登录          | 使用扫码登录                                      |\n\n若以上方案无法解决问题，请尝试 [切换登录协议](#切换登录协议) 和 **[处理滑动验证码](#处理滑动验证码)**。\n\n> 下一步，[Contacts](Contacts.md)\n>\n> [回到 Mirai 文档索引](CoreAPI.md)\n\n## 附录: 调试网络层\n\n参阅 [DebuggingNetwork.md](DebuggingNetwork.md)\n\n## 附录: 模拟测试框架\n\n参阅 [Mocking.md](mocking/Mocking.md)\n\n> 下一步，[Contacts](Contacts.md)\n>\n> [回到 Mirai 文档索引](CoreAPI.md)\n\n\n<!-- BEGIN DROP A\n\n## 附录\n\n[Ktor]: https://github.com/ktor.io/ktor\n\n### 使用 Log4J2 接管 mirai 日志系统\n\n添加依赖:\n\n|         Group ID         |   Artifact ID    | 最低版本号 | 说明                                          |\n|:------------------------:|:----------------:|:--------:|:---------------------------------------------|\n| org.apache.logging.log4j |    log4j-api     |  2.14.1  | Log4J2 API 模块, 将会覆盖 mirai 依赖的 log4j-api |\n| org.apache.logging.log4j |    log4j-core    |  2.14.1  | Log4J2 核心实现模块, 所有相关模块版本必须相同        |\n| org.apache.logging.log4j | log4j-slf4j-impl |  2.14.1  | 用于将对 SLF4J 的调用转换为对 Log4J 的调用         |\n\n要添加 `log4j-slf4j-impl` 是因为 [Ktor] 使用了 SLF4J. 添加该模块可以让整个应用统一使用同一个日志库.\n\n#### Gradle 示例\n\n*`build.gradle.kts`*\n```kotlin\ndependencies {\n    val log4jVersion = \"2.14.1\"\n    implementation(\"org.apache.logging.log4j:log4j-api:$log4jVersion\")\n    implementation(\"org.apache.logging.log4j:log4j-core:$log4jVersion\")\n    implementation(\"org.apache.logging.log4j:log4j-slf4j-impl:$log4jVersion\")\n\n    implementation(\"net.mamoe:mirai-core:2.7.0\") // 示例版本号\n}\n```\n\n#### Maven 示例\n\n*`pom.xml`*\n```xml\n<dependencies>\n    <dependency>\n        <groupId>org.apache.logging.log4j</groupId>\n        <artifactId>log4j-api</artifactId>\n        <version>2.14.1</version>\n    </dependency>\n    <dependency>\n        <groupId>org.apache.logging.log4j</groupId>\n        <artifactId>log4j-core</artifactId>\n        <version>2.14.1</version>\n    </dependency>\n    <dependency>\n        <groupId>org.apache.logging.log4j</groupId>\n        <artifactId>log4j-slf4j-impl</artifactId>\n        <version>2.14.1</version>\n    </dependency>\n    <dependency>\n        <groupId>net.mamoe</groupId>\n        <artifactId>mirai-core</artifactId>\n        <version>2.7.0</version>\n    </dependency>\n</dependencies>\n```\n\n### 使用 SLF4J 接管 mirai 日志系统\n\n添加依赖:\n\n|         Group ID         |  Artifact ID   | 最低版本号 | 说明                                          |\n|:------------------------:|:--------------:|:--------:|:---------------------------------------------|\n| org.apache.logging.log4j |   log4j-api    |  2.14.1  | Log4J2 API 模块, 将会覆盖 mirai 依赖的 log4j-api |\n| org.apache.logging.log4j | log4j-to-slf4j |  2.14.1  | 用于将对 Log4J 的调用转换为对 SLF4J 的调用         |\n|        org.slf4j         |   slf4j-api    |  1.7.32  | SLF4J API 模块, 将会覆盖 [Ktor] 依赖的 slf4j-api |\n\n除上以外, 还要添加一个 SLF4J 的实现, 例如 `slf4j-simple` 或 `logback-classic`.\n这与通常的操作方式相同.\n\n#### Gradle 示例\n\n*`build.gradle.kts`*\n```kotlin\ndependencies {\n    implementation(\"org.apache.logging.log4j:log4j-api:2.14.1\")\n    implementation(\"org.apache.logging.log4j:log4j-to-slf4j:2.14.1\")\n    implementation(\"org.slf4j:slf4j-api:1.7.32\")\n\n    implementation(\"org.slf4j:slf4j-simple:1.7.32\") // 若要使用 slf4j-simple\n    implementation(\"ch.qos.logback:logback-classic:1.2.5\") // 若要使用 logback\n\n\n    implementation(\"net.mamoe:mirai-core:2.7.0\") // 示例版本号\n}\n```\n\n#### Maven 示例\n\n*`pom.xml`*\n```xml\n<dependencies>\n    <dependency>\n        <groupId>org.apache.logging.log4j</groupId>\n        <artifactId>log4j-api</artifactId>\n        <version>2.14.1</version>\n    </dependency>\n    <dependency>\n        <groupId>org.apache.logging.log4j</groupId>\n        <artifactId>log4j-to-slf4j</artifactId>\n        <version>2.14.1</version>\n    </dependency>\n    <dependency>\n        <groupId>org.slf4j</groupId>\n        <artifactId>slf4j-api</artifactId>\n        <version>1.7.32</version>\n    </dependency>\n\n    <dependency> <!-- 若要使用 slf4j-simple --\n        <groupId>org.slf4j</groupId>\n        <artifactId>slf4j-simple</artifactId>\n        <version>1.7.32</version>\n    </dependency>\n\n    <dependency> <!-- 若要使用 logback --\n        <groupId>ch.qos.logback</groupId>\n        <artifactId>logback-classic</artifactId>\n        <version>1.2.5</version>\n    </dependency>\n\n    <dependency>\n        <groupId>net.mamoe</groupId>\n        <artifactId>mirai-core</artifactId>\n        <version>2.7.0</version> <!--示例版本号--\n    </dependency>\n</dependencies>\n```\n\nEND DROP A -->\n"
  },
  {
    "path": "docs/ConciseAPI.md",
    "content": "# Mirai - Concise API\n\n> 注:\n> - 本章节展示关于 `mirai-core-api` 比较常用的 API 示例\n> - 请配合 `mirai-core-api` 源码查看\n> - 本章仅提供 API 粗略介绍\n\n----------------------\n\n# Bots\n\n## BotFactory\n\n`BotFactory` 用于创建一个新的 `Bot`, 详情请看 [Bots.md](Bots.md)\n\n```kotlin\nval bot = BotFactory.newBot(/*....*/)\n\n// Java\nBot bot = BotFactory.INSTANCE.newBot(/*....*/);\nBot bot = Mirai.getInstance().getBotFactory().newBot(/*....*/);\n```\n\n# Misc utils\n\n## Logger\n\nMirai 全部的日志都通过 `MiraiLogger` 输出, 查看 `MiraiLogger` 源码注释获得更多信息\n\n## ExternalResource\n\n`ExternalResource` 代表一个外部文件, 可用于 文件上传, 图片发送, etc.\n\n构造 `ExternalResource` 可以通过以下方法构造\n\n```kotlin\n// kotlin\nFile(\"foo.txt\").toExternalResource()\n\n// java\nExternalResource.create(new File(\"foo.txt\"))\n```\n\n`ExternalResource.create()` 内置支持的数据类型有 `java.io.File`, `java.io.RandomAccessFile`,\n`byte[]`, `java.io.InputStream`\n\n> 注: \n> - `ExternalResource` 和 `java.io.InputStream` 等资源一样, 需要手动关闭 `close()`\n> - 使用 `java.io.InputStream` 构造 `ExternalResource` 时, 需要关闭 `java.io.InputStream`\n> - 使用 `java.io.RandomAccessFile` 构造 `ExternalResource` 时, 请不要关闭 `RandomAccessFile`,\n>   否则会间接关闭 `ExternalResource`\n\n\n```kotlin\n// Example\n\n// kotlin\nval inputStream: InputStream = TODO()\nval resource = inputStream.use { it.toExternalResource() }\n\n// java\nExternalResource resource;\ntry (InputStream inputStream = TODO()) {\n    resource = ExternalResource.create(inputStream);\n} catch (IOException exception) {\n    // on Exception catch\n    throw new RuntimeException(\"Can't create a new external resource\", exception);\n}\n\n```\n\n### 自行实现 ExternalResource\n\n从 2.9.0 开始，可以很容易实现自定义 `ExternalResource`\n\n`@see` `AbstractExternalResource` 源码注释\n\n# Contact & Message\n\n## Send Image\n\n### Origin send image\n\n最原始的发送图片的方法，就是先 `uploadImage` 然后 `sendMessage`\n\nKotlin 可以使用自动补全得到相关方法\n\n> `contact.uploadImage // IDEA 补全`\n\nJava 可以使用 `contact.uploadImage(ExternalResource)` 来得到一个图片对象\n(~~这也是为啥 ExternalResource 在前面~~)\n也可以使用 `Contact` 内的静态方法\n\n```java\nImage i = Contact.uploadImage(/*....*/);\nImage i = ExternalResource.uploadAsImage(/*...*/);\n```\n\n### sendImage\n\n`sendImage` 相当于先进行 `uploadImage` 然后再 `sendMessage`\n\nKotlin 可以使用自动补全得到相关方法\n\n> `contact.sendImage // IDEA 补全`\n\n由于 `sendImage` 是 `Contact` 和 `ExternalResource` 内的静态方法,\nJava 可以使用下述方法调用\n\n```java\nContact.sendImage(/**/);\nExternalResource.sendAsImage(/*...*/);\n```\n\n## Send Audio\n\n发送语音与发送图片的区别不大，都是先 `upload` 然后 `send`\n\n> - 在 2.7.0 之前，只有群聊 (`Group`) 支持语音（使用 `Voice`）, 2.7.0 之后支持私聊语音（使用 `Audio`）\n> - 每次发送新语音前最好重新 `upload`, 避免复用 `Audio` 对象\n> - **只支持 `amr` 和 `silk` 格式**\n\n要得到一个语音对象, 需要先 `uploadAudio`\n\nKotlin 可以使用自动补全得到相关方法\n\n> `contact.uploadAudio // IDEA 补全`\n\nJava 可以使用 `contact.uploadAudio(ExternalResource)` 来得到一个语音对象\n(~~这也是为啥 ExternalResource 在前面~~)\n也可以使用 `ExternalResource` 定义的扩展方法：\n\n```java\ncontact.sendMessage(ExternalResource.uploadAsAudio(/*...*/));\n```\n\n## Members\n\n`Member` 对象分为 `NormalMember`(正常的群成员) 和 `AnonymousMember`(匿名)\n\n对 `Member` 操作时需要具体操作时应该先判断是否为 `NormalMember` 然后强转\n\n```kotlin\n// kotlin\nif (member is NormalMember) { // kotlin smart cast\n}\n```\n```java\n// java\nif (member instanceof NormalMember) {\n    NormalMember nMember = (NormalMember) member;\n}\n```\n\n## Recall Message\n\n撤回信息可以通过 `MessageChain` 或者 `MessageSource` 撤回。\n\n```kotlin\nsubscribeAlways<MessageEvent> {// this: MessageEvent\n    this.message.recall()\n\n    this.message.source.recall()\n    \n    // Java\n    MessageSource.recall(event.getMessage());\n    MessageSource.recall(event.getMessage().getOrFail(MessageSource.Key));\n}\n```\n\n# Events\n\n常用事件\n\n| Name                              | Desc                   |\n| :----------------                 | :------------          |\n| MessageEvent                      | Bot 收到一条新消息        |\n| NewFriendRequestEvent             | 你有一条新的好友申请        |\n| MemberJoinEvent                   | 有新群成员加入群           |\n| MemberLeaveEvent                  | 群成员离开群聊            |\n| BotInvitedJoinGroupRequestEvent   | Bot 收到了一个加群邀请     |\n| BotJoinGroupEvent                 | Bot 加入了一个群聊         |\n| MemberJoinRequestEvent            | 新的入群申请              |\n\n### MessageEvent\n\n当直接监听 `MessageEvent` 时，可以考虑排除 Bot 信息同步事件 `MessageSyncEvent`\n\n`MessageSyncEvent` 是 `Bot` 账号在其他客户端发送消息时同步到 mirai 的事件\n\n```kotlin\neventChannel.subscribeAlways<MessageEvent> { // this: MessageEvent\n    if (this is MessageSyncEvent) return@subscribeAlways\n}\n```\n\n# IMirai\n\n`Mirai API` 接口. 是 `Mirai API` 与 Mirai 协议实现对接的接口.\n\n`IMirai` 内定义的接口都是较底层的 API, 如果无必要, 尽量避免使用 `IMirai` 相关的方法\n\n最底层的方法位于 `LowLevelApiAccessor` 内, 其方法都使用 `@LowLeveApi` 标注,\n`IMirai` 接口继承 `LowLevelApiAccessor`\n\n使用 `IMirai` 的标准 API 有稳定性保障, 但是由 `@LowLevelApi` 标注的方法无保障\n"
  },
  {
    "path": "docs/ConfiguringMultiplatformProjects.md",
    "content": "# Mirai - Configuring Projects\n\n本文介绍如何在一个 Kotlin 多平台项目中使用 mirai。\n\n### 选择版本\n\n可参考 [ConfiguringProjects](ConfiguringProjects.md#选择版本) 选择合适的版本。\n\n## 支持的编译目标平台\n\nmirai 上传到 Maven Central 的预编译模块列表如下表所示。在表中列举的平台即为你的项目可以使用的平台。\n如果你使用了一个不受支持的平台，在构建项目时将会得到来自 Gradle 的依赖解决错误。\n\nmirai 曾在 2.13.0 ~ 2.15.0-RC（不包含）支持编译到 macOS、Window、Linux 平台。自 2.15.0-RC 已完全删除对这些平台的支持。\n\n| 发布平台名称  | 描述               |\n|---------|------------------|\n| jvm     | JVM              |\n| android | Android (Dalvik) |\n\n## 添加依赖\n\n仅需为 `commonMain` 添加依赖，Kotlin 会自动为其他源集配置依赖。\n\nKotlin 编译器版本必须至少为 1.7.0，Gradle 版本建议使用高于 7.3。\n\n额外添加 `net.mamoe:mirai-core-utils` 是为了临时解决 [#2275](https://github.com/mamoe/mirai/issues/2275)。\n\n```kotlin\nplugins {\n    kotlin(\"multiplatform\") version \"1.7.20\"\n}\n\nkotlin {\n    sourceSets {\n        val commonMain by getting {\n            dependencies {\n                implementation(\"net.mamoe:mirai-core:2.13.0\")\n                implementation(\"net.mamoe:mirai-core-utils:2.13.0\")\n            }\n        }\n    }\n}\n```\n\n## 解决问题\n\n如果你在使用多平台项目时遇到问题，那应该是正常的。Kotlin 多平台项目在 1.7 仍然是一个测试版功能。欢迎在 issues 提交多平台相关问题。\n\n> 依赖配置完成，\n> - [回到 Mirai 文档索引](README.md#使用-mirai)"
  },
  {
    "path": "docs/ConfiguringProjects.md",
    "content": "# Mirai - Configuring Projects\n\n本文介绍如何在一个 JVM 项目中使用 mirai。\n\n具体项目可参考 [mirai-hello-world](https://github.com/project-mirai/mirai-hello-world)。\n\n### 选择版本\n\n有关各类版本的区别，参考 [版本规范](Evolution.md#版本规范)。通常建议选择最新稳定版本。\n\n[Maven Central Version]: https://img.shields.io/maven-central/v/net.mamoe/mirai-core-api.svg?label=Maven%20Central\n[Maven Central]: https://search.maven.org/search?q=net.mamoe%20mirai\n[GitHub Releases]: https://github.com/mamoe/mirai/releases/latest\n[GR all]: https://github.com/mamoe/mirai/releases/\n\n| 版本类型 |              版本号链接              |\n|:------:|:-----------------------------------:|\n|  稳定   |          [GitHub Releases]          |\n|  预览   |     [GitHub Releases][GR all]       |\n|  开发   | [UsingSnapshots](UsingSnapshots.md) |\n\n### 配置项目\n\n本文提供如下三种配置方法。推荐使用 Gradle 构建。\n\n**注意，下文版本号可能过旧，请自行参照上述表格更新版本号**\n\n- [A. 使用 Gradle](#a-使用-gradle)\n- [B. 使用 Maven](#b-使用-maven)\n- [C. 下载 JAR 包](#c-下载-jar-包)\n\n\n## A. 使用 Gradle\n\n### Gradle Kotlin DSL\n\n在 `build.gradle.kts` 添加：\n\n```kotlin\nplugins {\n    kotlin(\"jvm\") version \"1.5.30\" // 确保添加 Kotlin\n}\n\ndependencies {\n    api(\"net.mamoe\", \"mirai-core\", \"2.9.1\")\n}\n```\n\n**注意，必须添加 Kotlin 插件才能正确获取 mirai 软件包。**\n\n> 依赖配置完成，请选择：\n> - [分离 API 和实现（可选）](#分离-api-和实现可选)\n> - [回到 Mirai 文档索引](README.md#使用-mirai)\n\n### Gradle Groovy DSL\n\n在 `build.gradle` 添加\n\n```groovy\nplugins {\n    id 'org.jetbrains.kotlin.jvm' version '1.5.30' // 确保添加 Kotlin\n}\n\ndependencies {\n    implementation 'net.mamoe:mirai-core:2.9.1'\n}\n```\n\n> 依赖配置完成，请选择：\n> - [分离 API 和实现（可选）](#分离-api-和实现可选)\n> - [回到 Mirai 文档索引](README.md#使用-mirai)\n\n### 分离 API 和实现（可选）\n\nMirai 在开发时需要 `net.mamoe:mirai-core-api`, 在运行时需要 `net.mamoe:mirai-core`。可以在开发和编译时只依赖 `mirai-core-api`，会减轻对 IDE 的负担。  \n在 2.8.0 起 Mirai 提供 `mirai-bom` 用于自动协调 Mirai 不同组件的版本信息，这是引用 Mirai 平台的首选方式。\n使用 `mirai-bom` 也会对 Dependabot 等自动化依赖管理程序更加友好。\n```kotlin\ndependencies {\n    api(platform(\"net.mamoe:mirai-bom:2.9.1\"))\n    api(\"net.mamoe:mirai-core-api\")     // 编译代码使用\n    runtimeOnly(\"net.mamoe:mirai-core\") // 运行时使用\n}\n```\n也可以继续使用如下传统方式，但务必保证 `mirai-core-api` 和 `mirai-core` 的版本号相一致，以避免潜在的异常。  \n尤其注意 Dependabot 等依赖管理程序可能会导致模块版本不同。\n```kotlin\ndependencies {\n    val miraiVersion = \"2.9.1\"\n    api(\"net.mamoe\", \"mirai-core-api\", miraiVersion)     // 编译代码使用\n    runtimeOnly(\"net.mamoe\", \"mirai-core\", miraiVersion) // 运行时使用\n}\n```\n\n## B. 使用 Maven\n\n> 推荐使用 gradle, 使用 maven 您可能会遇到各种奇怪的依赖错乱问题\n\n在 `pom.xml` 中添加 mirai 依赖：\n\n```xml\n<dependencies>\n    <dependency>\n        <groupId>net.mamoe</groupId>\n        <artifactId>mirai-core-jvm</artifactId>\n        <version>2.9.1</version> \n    </dependency>\n</dependencies>\n```\n\n> 注意在 Maven，artifactId 要使用带 `-jvm` 后缀的\n\n\n通常 mirai 可以直接使用。但 mirai 使用的 Kotlin 1.5 可能与你的项目使用的其他库依赖的 Kotlin 版本冲突，Maven 有时候无法正确处理这种冲突。此时请手动添加 Kotlin 标准库依赖。\n\n```xml\n<properties>\n    <kotlin.version>1.5.10</kotlin.version>\n</properties>\n```\n```xml\n<dependencies>\n    <dependency>\n        <groupId>org.jetbrains.kotlin</groupId>\n        <artifactId>kotlin-stdlib-jdk8</artifactId>\n        <version>${kotlin.version}</version>\n    </dependency>\n</dependencies>\n```\n\n> 可以在 [Kotlin 官方文档](https://www.kotlincn.net/docs/reference/using-maven.html) 获取更多有关配置 Kotlin 的信息。\n\n\n> 依赖配置完成，[回到 Mirai 文档索引](README.md#使用-mirai)\n\n## C. 下载 JAR 包\n\n非常不推荐这种方法，请尽可能使用构建工具。\n\n在 [Maven Central](https://repo.maven.apache.org/maven2/net/mamoe/mirai-core-all/) 或 [阿里云代理仓库](https://maven.aliyun.com/repository/central/net/mamoe/mirai-core-all/) 下载指定版本的 `-all.jar` 文件，即包含 `mirai-core`，`mirai-core-api`，`mirai-core-utils` 和其他依赖。\n\n> [回到 Mirai 文档索引](README.md#使用-mirai)\n"
  },
  {
    "path": "docs/ConsoleTerminal.md",
    "content": "# Mirai - Console Terminal\n\n本文介绍如何使用 Mirai Console 的纯控制台前端，即 `mirai-console-terminal`\n。本文部分内容实际上对所有前端都通用。\n\n本文面向用户，若要开发 Mirai\nConsole，可参考 [Console 开发文档](../mirai-console/docs/README.md)。\n\n本文假设你使用 Windows 操作系统。但 Mirai Console 并不仅限于 Windows\n平台使用，在其他操作系统上的使用方法应当是类似的。\n\n**重要**：关闭 Mirai Console 需要通过 `stop` 命令关闭。  \n直接关闭窗口会导致数据损坏、数据丢失、系统崩溃等错误。\n\n安装\n----\n\n可以使用 [脚本](https://mirai.mamoe.net/assets/uploads/files/1618372079496-install-20210412.cmd)\n自动安装 32 位带 HTTP 插件的版本，也可以使用安装器个性化安装：\n\n[iTXTech/mcl-installer]: https://github.com/iTXTech/mcl-installer/releases\n\n1. 访问 [iTXTech/mcl-installer]；\n2. 下载适合你的系统的可执行文件；\n3. 在一个新文件夹存放这个文件，运行它；\n4. 通常可以一路回车使用默认设置完成安装，安装完成后程序自动退出；\n5. 运行 `mcl.cmd` 启动，成功后会看到绿色的 `mirai-console started successfully`。\n\n了解运行环境\n----\n\n\n安装时自动下载了 Mirai Console\n启动器（简称 [MCL](https://github.com/iTXTech/mirai-console-loader)）。\n\n启动器会帮你准备运行环境，下载和更新 Mirai 核心。你也可以使用启动器下载一些插件（见下文）。\n\n第一次运行 `mcl.cmd` 时会初始化运行环境。下表说明了各个文件夹的用途。\n\nMCL 只是启动器，没有机器人功能。MCL 支持从远程仓库下载插件，并启动 Mirai Console\n终端版（`mirai-console-terminal`）。\n\n如果遇到启动器问题，请提交至 [iTXTech/mirai-console-loader](https://github.com/iTXTech/mirai-console-loader)\n。\n\n|           文件夹名称           | 用途                   |\n|:-------------------------:|:---------------------|\n|          `data`           | 存放插件的数据，一般不需要在意它们    |\n|         `config`          | 存放插件的配置，可以打开并修改配置    |\n|          `logs`           | 存放运行时的日志，日志默认保留 7 天  |\n|          `libs`           | 存放 mirai-core 等核心库文件 |\n|         `plugins`         | 存放插件                 |\n|    `plugin-libraries`     | 存放插件的库缓存             |\n| `plugin-shared-libraries` | 存放插件的公共库             |\n|         `modules`         | 存放启动器的拓展模块           |\n\n> 可以在[这里](https://github.com/iTXTech/mirai-console-loader)查看 MCL 详细用法\n\n\n了解插件\n----\n\nMirai Console 原生支持 JAR 文件插件。一般插件的后缀为 `.mirai2.jar`（新版本）或 `.mirai.jar`\n（旧版本）。\n\n将插件 JAR 放在 `plugins` 目录中，重启 Mirai Console 就会自动扫描并加载。\n\nMirai Console\n\n下载和安装插件\n----\n\n刚刚装好的 Mirai Console 没有功能，功能将由插件提供。\n\n### 使用 MCL 自动安装插件\n\n### 如何安装官方插件\n\nMirai 官方提供两个插件：\n\n- [chat-command](https://github.com/project-mirai/chat-command):\n  允许在聊天环境通过以 \"/\" 起始的消息执行指令（也可以配置前缀）\n- [mirai-api-http](https://github.com/project-mirai/mirai-api-http)：提供\n  HTTP 支持，允许使用其他编程语言的插件\n\n打开命令行 (Windows 系统在文件夹按住 Shift 单击鼠标右键，点击 \"在此处打开 PowerShell\")，\n可以使用 MCL 自动安装这些插件，例如：\n\n安装 mirai-api-http 的 2.x 版本：\n\n```powershell\n./mcl --update-package net.mamoe:mirai-api-http --type plugin --channel maven-stable\n```\n\n安装 chat-command：\n\n```powershell\n./mcl --update-package net.mamoe:chat-command --type plugin --channel maven-stable\n```\n\n注意：插件有多个频道，`--channel maven-stable` 表示使用从 `maven` 更新的 `stable`（稳定）的频道。不同的插件可能会设置不同的频道，\n具体需要使用哪个频道可参考特定插件的说明 (很多插件会单独说明要如何安装它们, 因此不必过多考虑)。\n\n详细文档：[MCL 命令行参数](https://github.com/iTXTech/mirai-console-loader/blob/master/cli.md)\n\n### 在哪找社区插件\n\n- Mirai\n  官方论坛 [Mirai Forum](https://mirai.mamoe.net/category/11/%E6%8F%92%E4%BB%B6%E5%8F%91%E5%B8%83)\n\n> *我们还正在建设插件中心，完成后将会简化寻找插件的工作*\n\n### 如何安装社区插件\n\n如果是 JAR 文件的插件，放入 `plugins` 即可。其他插件一般都有特殊说明如何使用，请参考它们的说明。\n\n注意，mirai 在 2.11 时修改了加载策略。请尽量使用 `mirai2.jar` 后缀版本的插件\n\n### 常用的插件\n\n- [chat-command](https://github.com/project-mirai/chat-command):\n  不安装此插件不能在聊天环境中执行命令\n\n- [mirai-api-http](https://github.com/project-mirai/mirai-api-http): \n  提供 HTTP 支持，允许使用其他编程语言的插件\n\n- [mirai-silk-converter](https://github.com/project-mirai/mirai-silk-converter):\n  可以自动将 `wav`, `mp3` 等格式转换为语音所需格式 `silk`\n\n- [LuckPerms-Mirai](https://github.com/Karlatemp/LuckPerms-Mirai): \n  高级权限组插件，适合权限分配模型比较复杂的情况，并且可以提供网页UI的权限编辑器 (指令 `lp editor`)\n\n- [mirai-login-solver-sakura](https://github.com/KasukuSakura/mirai-login-solver-sakura):\n  验证处理工具，主要是为了优化和方便处理各种验证码\n\n使用控制台指令\n-----\n\n启动 `mcl.cmd` 就会看到控制台。在控制台可以输入指令，按回车执行这条指令。\n\nMirai Console 内置一些指令，输入 `?` 并回车可以查看指令列表。\n\n一些常用指令介绍在[这里](/mirai-console/docs/BuiltInCommands.md#mirai-console---builtin-commands)\n。\n\n### 在聊天框中使用命令 (权限授予)\n\n要允许从 QQ 聊天环境中使用各种命令, 你 **必须** 完成以下的配置：\n\n1. 安装 [chat-command](https://github.com/project-mirai/chat-command)\n2. 完成命令执行权限授予\n\n> 关于不同的权限系统，授予权限的方式或者授予权限的命令格式可能有所不一样。\n>\n> 当使用非内置权限系统时，具体的权限管理相关命令以相关的权限系统的文档为准\n> > 如 `LuckPerms-Mirai` 插件的权限管理命令为 `/lp` 而不是 `/permission`\n\n要完成权限授予，你必须通过在控制台执行\n[`/permission permit [target] [permission]`](/mirai-console/docs/BuiltInCommands.md#permissioncommand)\n来授予其他人执行相关命令的权限，需要执行的权限一般情况在插件的介绍页都会给明。\n\n详见 [`PermissionCommand`](/mirai-console/docs/BuiltInCommands.md#permissioncommand)\n。\n\n### 指令参数智能解析\n\nConsole 会自动根据语境推断指令参数的含义。\n\n假设一条禁言指令：\n\n```\n/mute <target> <duration>    # 为 target 设置 duration 秒的禁言\n```\n\n`<target>` 为目标群成员，`<duration>` 为禁言时间秒数。\n\n若在群内发送消息执行指令 `/mute 123 60`，`123` 将会被首先看作是群员 QQ 号码寻找群员。\n若未找到，则会将 `123` 看作是群员的名片重新寻找。\n\n群名片和昵称搜索是模糊匹配的，优先取用不会产生歧义的最相似的匹配。\n例如 `hello` 能匹配 `hella`，匹配率 80%；`hello` 匹配 `hel` 匹配率 60%。由于这两个匹配率都超过\n60%，它们都会成为候选；由于它们之间相差超过 10%，Mirai 会认为这没有歧义，选用 `hella`。\n\n在一个群内也可以引用另一个群内的成员，使用 `群号码.群员号码` 格式。若没有 `群号码` 则会使用指令执行人所在的群。\n\n在有多个机器人账号登录的情况下，可以使用 `机器人号码.群员号码` 的格式来指定某个机器人的群员。如果只有一个机器人则只需要使用 `群员号码`。\n\n在控制台执行指令时，需要提供群号码才能引用到群员。\n\n下面将列举智能解析支持的格式列表。\n\n#### 好友\n\n| 格式         | 示例              | 说明                   |\n|------------|-----------------|----------------------|\n| 机器人号码.好友号码 | `123456.987654` | 一个机器人的一个好友           |\n| 好友号码       | `987654`        | 当前唯一在线机器人的一个好友       |\n| `~`        | `~`             | 仅聊天环境下，指代指令调用人自己作为好友 |\n\n#### 群员\n\n| 格式             | 示例                     | 说明                   |\n|----------------|------------------------|----------------------|\n| 机器人号码.群号码.群员号码 | `123456.123456.987654` | 一个机器人的一个群中的一个群员      |\n| 机器人号码.群号码.群员名片 | `123456.123456.Alice`  | 一个机器人的一个群中的一个群员      |\n| 提及群员           | `@Cinnamon`            | 一个机器人的一个群中的一个群员      |\n| 机器人号码.群号码.$    | `123456.123456.$`      | 一个机器人的一个群中的随机群员      |\n| 群号码.群员号码       | `123456.987654`        | 当前唯一在线机器人的一个群的一个群员   |\n| 群号码.群员名片       | `123456.Alice`         | 当前唯一在线机器人的一个群的一个群员   |\n| 群号码.$          | `123456.$`             | 当前唯一在线机器人的一个群的随机群员   |\n| 群员号码           | `987654`               | 仅聊天环境下，当前群的一个群成员     |\n| 群员名片           | `Alice`                | 仅聊天环境下，当前群的一个群成员     |\n| `$`            | `$`                    | 仅聊天环境下，当前群的随机群成员     |\n| `~`            | `~`                    | 仅聊天环境下，指代指令调用人自己作为群员 |\n\n#### 群\n\n| 格式        | 示例              | 说明            |\n|-----------|-----------------|---------------|\n| 机器人号码.群号码 | `123456.987654` | 一个机器人的一个群     |\n| 群号码       | `987654`        | 当前唯一在线机器人的一个群 |\n| `~`       | `~`             | 仅聊天环境下，指代当前群聊 |\n\n配置\n----\n\nMirai Console 支持一些自定义配置。各项配置可以在 `config` 目录中找到。\n\n### 自动登录\n\n修改 `AutoLogin.yml` 可配置自动登录。也可以使用 `/autologin` 指令。\n\n### 指令前缀\n\n可以在 `Command.yml` 配置指令前缀，默认为 `/`。注意，部分指令可不需要前缀也能使用，这取决于插件开发者的选择。\n\n### 管理日志\n\nMirai Console 会记录运行时的日志并保存到 `logs` 目录中。\n\n可以参考[日志文档](../mirai-console/docs/Logging.md)了解如何配置日志的详略程度。\n\n若要向插件开发者提交问题，建议将日志等级调整为 `ALL` 并复现问题后将当天日志一并提交。\n\n### 配置权限\n\n`PermissionService.yml` 包含权限授予信息。通常建议使用指令 `/perm` 来修改权限，而不建议直接修改配置。\n\n### 远程仓库\n\n`PluginDependencies.yml` 包含对远程仓库的配置，通常不需要修改，除非某个插件要求。\n\n\n\n帮助改善文档\n-----\n\n如果你认为本文档还需要覆盖一些内容，请在 [issues](https://github.com/mamoe/mirai/issues/new/choose)\n提交建议。\n"
  },
  {
    "path": "docs/Contacts.md",
    "content": "# Mirai - Contacts\n\n[![](https://mermaid.ink/img/eyJjb2RlIjoiY2xhc3NEaWFncmFtXG5cbmNsYXNzIEJvdCB7XG4gICAgK2ZyaWVuZHM6IENvbnRhY3RMaXN0XG4gICAgK2dyb3VwczogQ29udGFjdExpc3RcbiAgICArZ2V0RnJpZW5kKExvbmcpIEZyaWVuZD9cbiAgICArZ2V0RnJpZW5kT3JOdWxsKExvbmcpIEZyaWVuZFxuICAgICtnZXRHcm91cChMb25nKSBHcm91cD9cbiAgICArZ2V0R3JvdXBPckZhaWwoTG9uZykgR3JvdXBcbiAgICArbG9naW4oKVxuICAgICtjbG9zZSgpXG59XG5cbmNsYXNzIENvbnRhY3RPckJvdCB7XG4gICAgK2lkOiBJbnRcbiAgICArYXZhdGFyVXJsOiBTdHJpbmdcbn1cblxuY2xhc3MgVXNlck9yQm90IHtcbiAgICArbnVkZ2UoKSBOdWRnZVxufVxuXG5jbGFzcyBDb250YWN0IHtcbiAgICArYm90OiBCb3RcbiAgICArc2VuZE1lc3NhZ2UoTWVzc2FnZSkgTWVzc2FnZVJlY2VpcHRcbiAgICArc2VuZE1lc3NhZ2UoU3RyaW5nKSBNZXNzYWdlUmVjZWlwdFxuICAgICt1cGxvYWRJbWFnZShFeHRlcm5hbEltYWdlKSBJbWFnZVxufVxuXG5jbGFzcyBVc2VyIHtcbiAgICArbmljazogU3RyaW5nXG4gICAgK3JlbWFyazogU3RyaW5nXG4gICAgK3F1ZXJ5UHJvZmlsZSgpIFVzZXJQcm9maWxlXG59XG5cbmNsYXNzIEdyb3VwIHtcbiAgICArbWVtYmVyczogQ29udGFjdExpc3RcbiAgICArbmFtZTogU3RyaW5nXG4gICAgK3NldHRpbmdzOiBHcm91cFNldHRpbmdzXG4gICAgK293bmVyOiBOb3JtYWxNZW1iZXJcbiAgICArYm90TXV0ZVJlbWFpbmluZzogTG9uZ1xuICAgICtib3RQZXJtaXNzaW9uOiBNZW1iZXJQZXJtaXNzaW9uXG4gICAgK3F1aXQoKSBCb29sZWFuXG4gICAgK3VwbG9hZFZvaWNlKCkgVm9pY2Vcbn1cblxuY2xhc3MgTm9ybWFsTWVtYmVyIHtcbiAgICArbXV0ZSgpXG4gICAgK2tpY2soKVxufVxuXG5jbGFzcyBBbm9ueW1vdXNNZW1iZXIge1xuICAgICthbm9ueW1vdXNJZDogU3RyaW5nXG59XG5cbmNsYXNzIE1lbWJlciB7XG4gICAgK2dyb3VwOiBHcm91cFxufVxuXG5jbGFzcyBPdGhlckNsaWVudCB7XG4gICAgK2luZm9cbn1cblxuQ29udGFjdE9yQm90PHwtLUNvbnRhY3RcbkNvbnRhY3RPckJvdDx8LS1Vc2VyT3JCb3RcblxuVXNlck9yQm90PHwtLUJvdFxuVXNlck9yQm90PHwtLVVzZXJcblxuQ29udGFjdDx8LS1Vc2VyXG5Db250YWN0PHwtLUdyb3VwXG5Db250YWN0PHwtLU90aGVyQ2xpZW50XG5cblVzZXI8fC0tTWVtYmVyXG5Vc2VyPHwtLUZyaWVuZFxuXG5NZW1iZXI8fC0tTm9ybWFsTWVtYmVyXG5NZW1iZXI8fC0tQW5vbnltb3VzTWVtYmVyIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifSwidXBkYXRlRWRpdG9yIjpmYWxzZX0)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoiY2xhc3NEaWFncmFtXG5cbmNsYXNzIEJvdCB7XG4gICAgK2ZyaWVuZHM6IENvbnRhY3RMaXN0XG4gICAgK2dyb3VwczogQ29udGFjdExpc3RcbiAgICArZ2V0RnJpZW5kKExvbmcpIEZyaWVuZD9cbiAgICArZ2V0RnJpZW5kT3JOdWxsKExvbmcpIEZyaWVuZFxuICAgICtnZXRHcm91cChMb25nKSBHcm91cD9cbiAgICArZ2V0R3JvdXBPckZhaWwoTG9uZykgR3JvdXBcbiAgICArbG9naW4oKVxuICAgICtjbG9zZSgpXG59XG5cbmNsYXNzIENvbnRhY3RPckJvdCB7XG4gICAgK2lkOiBJbnRcbiAgICArYXZhdGFyVXJsOiBTdHJpbmdcbn1cblxuY2xhc3MgVXNlck9yQm90IHtcbiAgICArbnVkZ2UoKSBOdWRnZVxufVxuXG5jbGFzcyBDb250YWN0IHtcbiAgICArYm90OiBCb3RcbiAgICArc2VuZE1lc3NhZ2UoTWVzc2FnZSkgTWVzc2FnZVJlY2VpcHRcbiAgICArc2VuZE1lc3NhZ2UoU3RyaW5nKSBNZXNzYWdlUmVjZWlwdFxuICAgICt1cGxvYWRJbWFnZShFeHRlcm5hbEltYWdlKSBJbWFnZVxufVxuXG5jbGFzcyBVc2VyIHtcbiAgICArbmljazogU3RyaW5nXG4gICAgK3JlbWFyazogU3RyaW5nXG4gICAgK3F1ZXJ5UHJvZmlsZSgpIFVzZXJQcm9maWxlXG59XG5cbmNsYXNzIEdyb3VwIHtcbiAgICArbWVtYmVyczogQ29udGFjdExpc3RcbiAgICArbmFtZTogU3RyaW5nXG4gICAgK3NldHRpbmdzOiBHcm91cFNldHRpbmdzXG4gICAgK293bmVyOiBOb3JtYWxNZW1iZXJcbiAgICArYm90TXV0ZVJlbWFpbmluZzogTG9uZ1xuICAgICtib3RQZXJtaXNzaW9uOiBNZW1iZXJQZXJtaXNzaW9uXG4gICAgK3F1aXQoKSBCb29sZWFuXG4gICAgK3VwbG9hZFZvaWNlKCkgVm9pY2Vcbn1cblxuY2xhc3MgTm9ybWFsTWVtYmVyIHtcbiAgICArbXV0ZSgpXG4gICAgK2tpY2soKVxufVxuXG5jbGFzcyBBbm9ueW1vdXNNZW1iZXIge1xuICAgICthbm9ueW1vdXNJZDogU3RyaW5nXG59XG5cbmNsYXNzIE1lbWJlciB7XG4gICAgK2dyb3VwOiBHcm91cFxufVxuXG5jbGFzcyBPdGhlckNsaWVudCB7XG4gICAgK2luZm9cbn1cblxuQ29udGFjdE9yQm90PHwtLUNvbnRhY3RcbkNvbnRhY3RPckJvdDx8LS1Vc2VyT3JCb3RcblxuVXNlck9yQm90PHwtLUJvdFxuVXNlck9yQm90PHwtLVVzZXJcblxuQ29udGFjdDx8LS1Vc2VyXG5Db250YWN0PHwtLUdyb3VwXG5Db250YWN0PHwtLU90aGVyQ2xpZW50XG5cblVzZXI8fC0tTWVtYmVyXG5Vc2VyPHwtLUZyaWVuZFxuXG5NZW1iZXI8fC0tTm9ybWFsTWVtYmVyXG5NZW1iZXI8fC0tQW5vbnltb3VzTWVtYmVyIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifSwidXBkYXRlRWRpdG9yIjpmYWxzZX0)\n\n|        类型        | 描述                                              | 最低支持的版本 |\n|:-----------------:|:-------------------------------------------------|:-----------:|\n|  `ContactOrBot`   | `Contact` 和 `Bot` 的公共接口                       |     2.0     |\n|   `OtherClient`   | Bot 的*其他客户端*，如 \"我的 iPad\"，\"我的电脑\"         |     2.0     |\n|       `Bot`       | 机器人对象                                         |     2.0     |\n|     `Contact`     | 联系人对象，即所有的群，好友，陌生人，群成员等            |     2.0      |\n|      `Group`      | 群对象                                            |     2.0      |\n|      `User`       | 用户对象，即 \"个人\". 包含好友，陌生人，群成员，临时会话用户 |     2.0     |\n|     `Friend`      | 好友对象                                           |     2.0     |\n|    `Stranger`     | 陌生人对象                                         |     2.0     |\n|     `Member`      | 群成员对象，属于一个 `Group`.                        |     2.0     |\n|  `NormalMember`   | 普通群成员对象.                                     |     2.0     |\n| `AnonymousMember` | 匿名群成员对象.                                     |     2.0     |\n\n\n我们称 `Contact` 为 _联系人_，它表示一个 `Bot` 可以联系的对象。如上图所示，`Contact` 的子类不仅有好友和群成员，还包括群和其他客户端。因此请不要因“联系人”中的“人”就认为它只代表一个用户。\n\n## 获取联系人对象\n\n`Bot.getFriends()`，`Bot.getGroups()` 等方法可以获取到对象列表。\n\n可通过 `Bot.getFriend`， `Bot.getGroup`，`Bot.getStranger` 以 QQ 号或群号主动获取某个对象。\n\n可以通过事件被动获取 *（后文介绍）*。\n\n## 联系人对象唯一且属于 Bot\n\n每个联系人对象都属于一个 `Bot`。可以通过 `Contact.bot` 获取到它们所属的 `Bot`。\n\n对于同一个 `Bot`，不会有 `id` 相同的两个 `Group` 对象。通过 `Bot.getGroup` 得到的和在群消息事件得到的相同 `id` 的 `Group` 对象是同一个。\n\n若应用同时登录多个 `Bot`，不同 `Bot` 的 `id` 相同的 `Group` 也是互相独立的。\n\n## 常用功能\n\n基于面向对象的设计，可直接获取 `Contact` 的属性如 `nick`，`permission`。请在实践时在接口源码内查看更清晰的说明。\n\n### 接收消息\n\n消息通过事件被动接收。事件将在下一章节 [Events](Events.md) 讲解。\n\n### 主动发送消息\n\n获取到目标对象并调用 `Contact.sendMessage(message)`。如要向某个群发送消息，则需要对应的 `Group` 对象，并调用 `Group.sendMessage(message)`。\n\n注意，由于对象代表意义不同，发送的消息类型也可能不同。`NormalMember` 是普通群成员，`NormalMember.sendMessage` 是对群成员发送临时会话消息，而 `Friend.sendMessage` 是发送好友消息。（备注：在实际情况下，如果机器人与群成员有好友关系，`NormalMember.sendMessage` 也会自动转换为发送好友消息，以保证消息送达）\n\n### 联系其他客户端\n\n一个 QQ 账号可以在多个客户端登录，mirai 支持向其他客户端收发消息. 其他客户端被抽象为 `OtherClient`。\n\n可以通过 `Bot.getOtherClients()` 获取到所有在线的其他客户端列表，并使用 `OtherClient.sendMessage` 来发送消息，这与操作普通好友类似。\n\n### 使用戳一戳\n\n戳一戳的被动接收与消息的接收相同，也是以事件的形式（`NudgeEvent`）。\n\n要发起戳一戳，使用 `Contact.nudge()` 创建一个戳一戳动作（`Nudge`）然后将其发送到目标用户或群（`Nudge.sendTo`）。\n\n### 操作群成员禁言和移除\n\n使用 `Member.mute`, `Member.unmute`, `Member.kick`。\n\n### 提及群成员\n\n提及（`@`）群成员在 mirai 属于 _消息_ 的范畴。将在后面章节介绍。\n\n### 其他功能\n\n其他功能与上述类似，都作为成员方法位于目标对象中。未在成员方法或类注释中出现的其他功能即为目前还没有支持的功能。\n\n----\n\n> 下一步，[Events](Events.md)\n>\n> [回到 Mirai 文档索引](CoreAPI.md)"
  },
  {
    "path": "docs/CoreAPI.md",
    "content": "# Mirai - Core API\n\n> 本文档适用于 mirai 2.x 版本  \n> 要由 mirai 1.x 迁移到 2.x，请阅读 [MigrationFrom1x.md](MigrationFrom1x.md)\n\n> 在 GitHub 和 `docs.mirai.mamoe.net` 默认看到的是最新版本的文档，可能不适用于旧版本。  \n> 可以将 URL `https://github.com/mamoe/mirai/blob/2.4.2/docs/README.md` 中的 `2.4.2` 替换为其他版本来查看对应文档。\n\n- 机器人 [Bots](Bots.md)\n- 联系人 [Contacts](Contacts.md)\n- 事件  [Events](Events.md)\n- 消息  [Messages](Messages.md)\n\n*附录*\n\n- 常用 API [ConciseAPI](ConciseAPI.md)\n\n> 希望改进文档? 请在 [#848](https://github.com/mamoe/mirai/discussions/848) 提出建议\n"
  },
  {
    "path": "docs/DebuggingNetwork.md",
    "content": "# Mirai - DebuggingNetwork\n\n本章节介绍调试网络层的方法。\n\n## 环境变量\n\n可通过 JVM 环境变量改变网络层的行为。一般用户通常不需要手动变更这些功能。\n\n[launch-undispatched]: https://github.com/mamoe/mirai/blob/6eff4bdf40815598a2d987e08d89df6b97663967/mirai-core-api/src/commonMain/kotlin/internal/event/InternalEventListeners.kt#L141\n\n[#1715]: https://github.com/mamoe/mirai/issues/1715\n\n| 环境变量名称                                              | 可选值                              | 解释                                                                                     |\n|:----------------------------------------------------|:---------------------------------|:---------------------------------------------------------------------------------------|\n| `mirai.network.handler.selector.max.attempts`       | `[1, 2147483647]`                | 最大重连尝试次数                                                                               |\n| `mirai.network.reconnect.delay`                     | `[0, 9223372036854775807]`       | 两次重连尝试的间隔毫秒数                                                                           |\n| `mirai.network.handler.selector.logging`            | `true`/`false`                   | 启用执行重连时的详细日志                                                                           |\n| `mirai.network.handler.cancellation.trace`          | `true`/`false`                   | 让网络层的异常时包含详细原因                                                                         |\n| `mirai.network.state.observer.logging`              | `true`/`on`/`false`/`off`/`full` | 启用网络层状态变更的日志                                                                           |\n| `mirai.network.auth.logging`                        | `true`/`false`                   | 启用进行登录验证时的内部日志                                                                         |\n| `mirai.event.launch.undispatched`                   | `true`/`false`                   | 详见 [源码内注释][launch-undispatched]                                                        |\n| `mirai.resource.creation.stack.enabled`             | `true`/`false`                   | 启用 `ExternalResource` 创建时的 stacktrace 记录 (影响性能), 在资源泄露时展示                              |\n| `mirai.unknown.image.type.logging`                  | `true`/`false`                   | 启用遇到未知图片格式时的日志                                                                         |\n| `mirai.network.show.all.components`                 | `true`/`false`                   | 在网络层异常中附加当前所有组件 (components) 内容                                                        |\n| `mirai.network.show.components.creation.stacktrace` | `true`/`false`                   | 在网络层异常中附加当前组件容器创建时的 stacktrace                                                         |\n| `mirai.network.packet.logger`                       | `true`/`false`                   | 启用数据包日志 (将为展示所有接收的数据包的 id, sequenceId, extraData 以及内容 hex)                             |\n| `mirai.network.show.verbose.packets`                | `true`/`false`                   | 在日志记录数据包时包含冗长的数据包 (如 `MessageSvc.PbGetMsg`, `OnlinePush.ReqPush`, `StatSvc.SimpleGet`) |\n| `mirai.network.show.packet.details`                 | `true`/`false`                   | 在日志记录数据包时包含 mirai 解析结果                                                                 |\n| `mirai.event.show.verbose.events`                   | `true`/`false`                   | 在日志记录事件时包含冗长的事件 (如 `GroupMessagePreSendEvent`, `GroupMessagePostSendEvent`)            |\n| `mirai.event.trace`                                 | `true`/`false`                   | 在日志记录事件监听器创建及使用的信息                                                                     |\n| `mirai.message.allow.sending.file.message`          | `true`/`false`                   | 允许发送 `FileMessage`, 用于兼容旧代码 ([#1715])                                                  |\n| `mirai.jce.deserializer.debug`                      | `true`/`false`                   | 启用数据包解析错误的详细信息显示                                                                       |\n\n修改示例：\n\n在启动 JVM 时添加参数 `-Dmirai.network.handler.selector.logging=true`\n则启用执行重连时的详细日志\n"
  },
  {
    "path": "docs/EventList.md",
    "content": "# 事件\n\n## 事件列表一览\n\n提示:\n- 在 IntelliJ 平台双击 shift 可输入类名进行全局搜索\n- 在 IntelliJ 平台, 按 alt + 7 可打开文件的结构, [效果图](/.github/EZSLAB`K@YFFOW47{090W8B.png)\n\n<!--注释:--> <!--目前还没有这些修改, 因此不展示注释-->\n<!--- 此列表自 mirai `2.0.0` 起开始维护, 故在 `2.0.0` 前的变更将不做记录.-->\n<!--- 支持某事件的 mirai 版本号将会显式标注, 通过数学区间形式表示, 如 `[1.1.0, 1.3.0)`, 但有简便表示方法:-->\n<!--  - (`1.1.0+`) 等注释表示在 `1.1.0` 及更新版本才支持, 区间表示为 `[1.1.0, +∞)`-->\n<!--  - (`1.1.0-`) 等注释表示在早于 `1.1.0` 的版本才支持, 区间表示为 `[1.0.0, 1.1.0)`-->\n\n### Bot\n- Bot 登录完成: BotOnlineEvent\n- Bot 离线: BotOfflineEvent\n  - 主动: Active\n  - 被挤下线: Force\n  - 被服务器断开或因网络问题而掉线: Dropped\n  - 服务器主动要求更换另一个服务器: RequireReconnect\n- Bot 重新登录: BotReloginEvent\n- Bot 头像改变: BotAvatarChangedEvent\n- Bot 昵称改变: BotNickChangedEvent\n- Bot 被戳: NudgeEvent\n\n### 消息\n- 被动收到消息：MessageEvent\n  - 群消息：GroupMessageEvent\n  - 好友消息：FriendMessageEvent\n  - 群临时会话消息：GroupTempMessageEvent\n  - 陌生人消息：StrangerMessageEvent\n  - 其他客户端消息：OtherClientMessageEvent\n- 主动发送消息前: MessagePreSendEvent\n  - 群消息: GroupMessagePreSendEvent\n  - 好友消息: FriendMessagePreSendEvent\n  - 群临时会话消息: GroupTempMessagePreSendEvent\n  - 陌生人消息：StrangerMessagePreSendEvent\n- 从其他客户端同步消息 MessageSyncEvent\n  - 群消息: GroupMessageSyncEvent\n  - 好友消息: FriendMessageSyncEvent\n  - 群临时会话消息: GroupTempMessageSyncEvent\n  - 陌生人消息: StrangerMessageSyncEvent\n- 主动发送消息后: MessagePostSendEvent\n  - 群消息: GroupMessagePostSendEvent\n  - 好友消息: FriendMessagePostSendEvent\n  - 群临时会话消息: GroupTempMessagePostSendEvent\n  - 陌生人消息：StrangerMessagePostSendEvent\n  - 其他客户端消息：OtherClientMessagePostSendEvent\n- 消息撤回: MessageRecallEvent\n  - 好友撤回: FriendRecall\n  - 群撤回: GroupRecall\n  - 群临时会话撤回: TempRecall\n- 图片上传前: BeforeImageUploadEvent\n- 图片上传完成: ImageUploadEvent\n  - 图片上传成功: Succeed\n  - 图片上传失败: Failed\n- 戳一戳: NudgeEvent\n\n### 群\n- 机器人被踢出群或在其他客户端主动退出一个群: BotLeaveEvent\n  - 机器人主动退出一个群: Active\n  - 机器人被管理员或群主踢出群: Kick\n- 机器人在群里的权限被改变: BotGroupPermissionChangeEvent\n- 机器人被禁言: BotMuteEvent\n- 机器人被取消禁言: BotUnmuteEvent\n- 机器人成功加入了一个新群: BotJoinGroupEvent\n\n#### 群设置\n- 群设置改变: GroupSettingChangeEvent\n  - 群名改变: GroupNameChangeEvent\n  - 入群公告改变: GroupEntranceAnnouncementChangeEvent\n  - 全员禁言状态改变: GroupMuteAllEvent\n  - 匿名聊天状态改变: GroupAllowAnonymousChatEvent\n  - 允许群员邀请好友加群状态改变: GroupAllowMemberInviteEvent\n\n#### 群成员\n##### 成员列表变更\n- 成员已经加入群: MemberJoinEvent\n  - 成员被邀请加入群: Invite\n  - 成员主动加入群: Active\n\n- 成员已经离开群: MemberLeaveEvent\n  - 成员被踢出群: Kick\n  - 成员主动离开群: Quit\n\n- 一个账号请求加入群: MemberJoinRequestEvent\n- 机器人被邀请加入群: BotInvitedJoinGroupRequestEvent\n\n##### 名片和头衔\n- 成员群名片改动: MemberCardChangeEvent\n- 成员群特殊头衔改动: MemberSpecialTitleChangeEvent\n- 成员群荣誉改变: MemberHonorChangeEvent\n\n##### 成员权限\n- 成员权限改变: MemberPermissionChangeEvent\n\n##### 动作\n- 群成员被禁言: MemberMuteEvent\n- 群成员被取消禁言: MemberUnmuteEvent\n\n### 好友\n- 好友昵称改变: FriendRemarkChangeEvent\n- 成功添加了一个新好友: FriendAddEvent\n- 好友已被删除: FriendDeleteEvent\n- 一个账号请求添加机器人为好友: NewFriendRequestEvent\n- 好友头像改变: FriendAvatarChangedEvent\n- 好友昵称改变: FriendNickChangedEvent\n- 好友输入状态改变: FriendInputStatusChangedEvent\n\n### 控制台\n- 自动登录执行后: AutoLoginEvent [2.15.0, +∞)\n- 控制台启动完成: StartupEvent [2.15.0, +∞)\n"
  },
  {
    "path": "docs/Events.md",
    "content": "# Mirai - Events\n\n## 目录\n\n- [事件系统](#事件系统)\n- [快速指导](#快速指导)\n- [事件通道](#事件通道)\n- [通道操作](#通道操作)\n  - [过滤](#过滤)\n  - [添加 `CoroutineContext`](#添加-coroutinecontext)\n  - [限制作用域](#限制作用域)\n  - [链式调用](#链式调用)\n- [在 `EventChannel` 监听事件](#在-eventchannel-监听事件)\n- [监听事件的其他方法](#监听事件的其他方法)\n  - [使用 `ListenerHost` 监听事件](#使用-eventhandler-注解标注的方法监听事件)\n  - [在 Kotlin 使用 DSL 监听事件](#在-kotlin-使用-dsl-监听事件)\n- [实现事件](#实现事件)\n  * [新建事件](#新建事件)\n  * [广播自定义事件](#广播自定义事件)\n  * [监听自定义事件](#监听自定义事件)\n  * [在 Console 中自定义事件](../mirai-console/docs/plugin/JVMPlugin-DataExchange.md)\n- [工具函数（Kotlin）](#工具函数kotlin)\n  - [线性同步（`syncFromEvent`）](#线性同步syncfromevent)\n  - [线性同步（`nextEvent`）](#线性同步nextevent)\n  - [条件选择（`selectMessages`）](#条件选择selectmessages)\n  - [循环条件选择（`whileSelectMessages`）](#循环条件选择whileselectmessages)\n\n## 事件系统\n\nMirai 许多功能都依赖事件。\n\n[`Event`]: ../mirai-core-api/src/commonMain/kotlin/event/Event.kt#L21-L62\n\n每个事件都实现接口 [`Event`]，且继承 `AbstractEvent`。  \n实现 `CancellableEvent` 的事件可以被取消（`CancellableEvent.cancel`）。\n\n**[事件列表](EventList.md)**\n\n> 回到 [目录](#目录)\n\n\n## 快速指导\n\n如果你了解事件且不希望详细阅读，可以立即仿照下面示例创建事件监听并跳过本章节。\n\n注意，**`GlobalEventChannel` 会监听到来自所有 `Bot` 的事件，如果只希望监听某一个 `Bot` 的事件，请使用 `bot.eventChannel`。**\n\n有关消息 `Message`、`MessageChain` 将会在后文 _消息系统_ 章节解释。\n\n### Kotlin\n\n```kotlin\n// 事件监听器是协程任务。如果你有 CoroutineScope，可从 scope 继承生命周期管理和 coroutineContext\nGlobalEventChannel.parentScope(coroutineScope).subscribeAlways<GroupMessageEvent> { event ->\n    // this: GroupMessageEvent\n    // event: GroupMessageEvent\n    \n    // `event.message` 是接收到的消息内容, 可自行处理. 由于 `this` 也是 `GroupMessageEvent`, 可以通过 `message` 直接获取. 详细查阅 `GroupMessageEvent`.\n    \n    subject.sendMessage(\"Hello!\")\n}\n// `GlobalEventChannel.parentScope(coroutineScope)` 也可以替换为使用扩展 `coroutineScope.globalEventChannel()`, 根据个人习惯选择\n\n\n\n// 如果不想限制生命周期，可获取 listener 处理\nval listener: CompletableJob =\n    GlobalEventChannel.subscribeAlways<GroupMessageEvent> { event -> }\n\nlistener.complete() // 停止监听\n```\n\n异常默认会被相关 `Bot` 日志记录。可以在 `subscribeAlways` 之前添加如下内容来处理异常。\n\n```\n.exceptionHandler { e -> e.printStackTrace() }\n```\n\n**注意**：如果要在 Mirai Console 插件中监听事件，请不要使用使用无作用域控制的 `GlobalEventChannel`\n，如 `GlobalEventChannel.subscribeAlways`\n。请使用插件主类的扩展函数 `globalEventChannel()`\n或者 `GlobalEventChannel.parentScope(scope)` 等方式控制监听器协程作用域。\n\n### Java\n\n```java\n// 创建监听\nListener listener=GlobalEventChannel.INSTANCE.parentScope(scope).subscribeAlways(GroupMessageEvent.class,event->{\n        MessageChain chain=event.getMessage(); // 可获取到消息内容等, 详细查阅 `GroupMessageEvent`\n\n        event.getSubject().sendMessage(\"Hello!\"); // 回复消息\n        })\n\n        listener.complete(); // 停止监听 \n```\n\n异常默认会被相关 `Bot` 日志记录。可以在 `subscribeAlways` 之前添加如下内容来处理异常。\n\n```java\n.exceptionHandler(e->e.printStackTrace())\n```\n\n**注意**：如果要在 Mirai Console 插件中监听事件，请不要使用使用无作用域控制的 `GlobalEventChannel`\n，如 `GlobalEventChannel.subscribeAlways`\n。请使用 `GlobalEventChannel.parentScope(PluginMain.INSTANCE)`\n等方式控制监听器协程作用域。\n\n> 你已经了解了基本事件操作。现在你可以继续阅读通道处理和扩展等内容，或：\n>\n> - 跳到下一章 [Messages](Messages.md)\n> - [查看事件列表](EventList.md)\n> - [回到事件文档目录](#目录)\n> - [回到 Mirai 文档索引](CoreAPI.md)\n\n## 事件通道\n\n[`EventChannel`]: ../mirai-core-api/src/commonMain/kotlin/event/EventChannel.kt\n\n[事件通道][`EventChannel`]是监听事件的入口。 **在不同的事件通道中可以监听到不同类型的事件**。\n\n### 获取事件通道\n\n[`GlobalEventChannel`]: ../mirai-core-api/src/commonMain/kotlin/event/GlobalEventChannel.kt\n\n[`GlobalEventChannel`] 是最大的通道：所有的事件都可以在 [`GlobalEventChannel`] 监听到。**因此，[`GlobalEventChannel`] 会包含来自所有 `Bot` 实例的事件。**\n\n通常不会直接使用 [`GlobalEventChannel`]，而是使用经过 [通道操作](#通道操作) 操作的子通道。\n\n> 回到 [目录](#目录)\n\n## 通道操作\n\n`EventChannel` 可以通过一些操作转换。\n\n**一个通道的属性都是*不变的*：每个转换操作都会创建一个新的通道而不会修改原通道。**\n\n### 过滤\n\n`GlobalEventChannel` 包含任何 `Event`，可以通过 `EventChannel.filter` 过滤得到一个只包含期望的事件的 `EventChannel`。\n\n```kotlin\nvar channel = GlobalEventChannel.filter { it is BotEvent && it.bot.id == 123456L } // 筛选来自某一个 Bot 的事件\n```\n```java\nEventChannel channel = GlobalEventChannel.INSTANCE.filter(ev -> ev instanceof BotEvent && ((BotEvent) ev).bot.id == 123456); // 筛选来自某一个 Bot 的事件\n```\n\n> 回到 [通道操作](#通道操作)\n\n> 你可以选择跳过下文介绍的协程属性和作用域，直接阅读 [在 `EventChannel` 监听事件](#在-eventchannel-监听事件)\n\n### 添加 `CoroutineContext`\n\n一个通道持有属性 `defaultCoroutineContext`，将会自动添加给每个事件监听器（见后文）。\n\n可以为通道添加一些 `CoroutineContext`，如 `CoroutineExceptionHandler`（用于处理监听时产生的异常）。\n```kotlin\nchannel.exceptionHandler { exception ->\n    logger.error(exception)\n} \n```\n\n```java\nchannel.exceptionHandler(exception ->\n    logger.error(exception);\n);\n```\n\n这本质上是添加了一个 `CoroutineExceptionHandler`。之后当事件监听器出现异常，异常就会被传递到这个 `CoroutineExceptionHandler` 处理。\n\n> 回到 [通道操作](#通道操作)\n\n\n### 限制作用域\n\n在监听时会创建一些*事件监听器*。*事件监听器*本质上是一个协程 *`Job`*，因此可以有父 `Job`。\n\n要指定父 `Job`，请使用 `parentJob` 或 `parentScope` 操作。\n```kotlin\n// parentScope\nchannel = channel.parentScope(MyApplicationScope)\n\n// parentJob\nval job = SupervisorJob()\nchannel = channel.parentJob(job)\n```\n\n在 Kotlin，可以使用如下扩展快速在 GlobalEventChannel 创建一个指定协程作用域下的事件通道。\n> ```kotlin\n>  fun CoroutineScope.globalEventChannel(coroutineContext: CoroutineContext = EmptyCoroutineContext): EventChannel<Event> = GlobalEventChannel.parentScope(this, coroutineContext)\n> ```\n\n```kotlin\nval channel = MyApplicationScope.globalEventChannel()\n```\n\n\n作用域限制对于应用生命周期管理会很有用。请看如下 Mirai Console 插件示例。\n```kotlin\nobject MyPluginMain : KotlinPlugin() { // KotlinPlugin 实现了 CoroutineScope\n\n    // 插件被启用时调用\n    override fun onEnable() {\n    \n        // `this` 是插件的协程作用域\n        // 在插件协程作用域里创建事件监听。当插件被停用时，插件的协程作用域也会被关闭，事件监听就会被同步停止。\n        this.globalEventChannel().subscribeAlways<MessageEvent> { event ->\n            // 处理事件 \n        }\n    }\n}\n```\n\n> 有关限制作用域的实现细节，可在使用时阅读源码内文档。\n\n### 链式调用\n\n对通道的操作都会返回 `this`，因此可以链式调用。\n```kotlin\nval channel = GlobalEventChannel\n    .filterIsInstance<BotEvent>()\n    .filter { it.bot.id == 123456L }\n    .filter { /* some other conditions */ }\n    .parentScope(MyApplicationScope)\n    .exceptionHandler { exception ->\n        exception.printStacktrace()\n    }\n```\n\n> 回到 [通道操作](#通道操作)\n> 回到 [目录](#目录)\n\n## 在 `EventChannel` 监听事件\n\n使用：\n- `EventChannel.subscribe`：监听事件并自行决定何时停止\n- `EventChannel.subscribeAlways`：一直监听事件\n- `EventChannel.subscribeOnce`：只监听一次事件\n\n```kotlin\nbot.eventChannel.subscribeAlways<GroupMessageEvent> { event ->\n    // this: GroupMessageEvent\n    // event: GroupMessageEvent\n    \n    subject.sendMessage(\"Hello from mirai!\")\n}\n```\n\n```java\nbot.eventChannel.subscribeAlways(GroupMessageEvent.class, event -> {\n    event.getSubject().sendMessage(\"Hello from mirai!\");\n})\n```\n\n> 实现细节可查看源码内注释。\n\n\n> 回到 [目录](#目录)\n\n## 监听事件的其他方法\n\n监听都需要在*事件通道*中进行。如下几种方法都本质上会调用上述 `EventChannel.subscribe` 等方法。\n\n- [使用 `@EventHandler` 注解标注的方法监听事件](#使用-eventhandler-注解标注的方法监听事件)\n- [在 Kotlin 使用 DSL 监听事件](#在-kotlin-使用-dsl-监听事件)\n\n### 使用 `@EventHandler` 注解标注的方法监听事件\n\n标注一个函数（方法）为事件监听器。mirai 通过反射获取他们并为之注册事件。\n\n- [Kotlin 函数](#kotlin-函数)\n- [Java 方法](#java-方法)\n\n#### Kotlin 函数\n\nKotlin 函数要求:\n- 接收者和函数参数: 所标注的 Kotlin 函数必须至少拥有一个接收者或一个函数参数, 或二者都具有. 接收者和函数参数的类型必须相同 (如果二者都存在)\n  接收者或函数参数的类型都必须为 `Event` 或其子类.\n\n所有 Kotlin 非 `suspend` 的函数都将会在 `Dispatchers.IO` 中调用\n\n支持的函数类型:\n```kotlin\n// 所有函数参数, 函数返回值都不允许标记为可空 (带有 '?' 符号)\n// T 表示任何 Event 类型.\nsuspend fun T.onEvent(T)\nsuspend fun T.onEvent(T): ListeningStatus\nsuspend fun T.onEvent(T): Nothing\nsuspend fun onEvent(T)\nsuspend fun onEvent(T): ListeningStatus\nsuspend fun onEvent(T): Nothing\nsuspend fun T.onEvent()\nsuspend fun T.onEvent(): ListeningStatus\nsuspend fun T.onEvent(): Nothing\nfun T.onEvent(T)\nfun T.onEvent(T): ListeningStatus\nfun T.onEvent(T): Nothing\nfun onEvent(T)\nfun onEvent(T): ListeningStatus\nfun onEvent(T): Nothing\nfun T.onEvent()\nfun T.onEvent(): ListeningStatus\nfun T.onEvent(): Nothing\n```\n\nKotlin 使用示例:\n\n- 独立 `CoroutineScope` 和 `ListenerHost`\n```kotlin\nobject MyEvents : ListenerHost {\n    override val coroutineContext = SupervisorJob()\n    // 可以抛出任何异常, 将在 this.coroutineContext 或 registerEvents 时提供的 CoroutineScope.coroutineContext 中的 CoroutineExceptionHandler 处理.\n    @EventHandler\n    suspend fun MessageEvent.onMessage() {\n        reply(\"received\")\n    }\n}\neventChannel.registerListenerHost(MyEvents)\n```\n`onMessage` 抛出的异常将会交给 `myCoroutineScope` 处理\n\n- 合并 `CoroutineScope` 和 `ListenerHost`: 使用 `SimpleListenerHost`\n```kotlin\nobject MyEvents : SimpleListenerHost( /* override coroutineContext here */ ) {\n    override fun handleException(context: CoroutineContext, exception: Throwable) {\n        // 处理 onMessage 中未捕获的异常\n    }\n    @EventHandler\n    suspend fun MessageEvent.onMessage() { // 可以抛出任何异常, 将在 handleException 处理\n        reply(\"received\")\n        // 无返回值 (或者返回 Unit), 表示一直监听事件.\n    }\n    @EventHandler\n    suspend fun MessageEvent.onMessage(): ListeningStatus { // 可以抛出任何异常, 将在 handleException 处理\n        reply(\"received\")\n        return ListeningStatus.LISTENING // 表示继续监听事件\n        // return ListeningStatus.STOPPED // 表示停止监听事件\n    }\n}\neventChannel.registerListenerHost(MyEvents)\n```\n\n\n#### Java 方法\n\n所有 Java 方法都会在 `Dispatchers.IO` 中调用，因此在 Java 也可以调用阻塞方法。\n\n支持的方法类型：\n```\n// T 表示任何 Event 类型.\nvoid onEvent(T)\nVoid onEvent(T)\nListeningStatus onEvent(T) // 禁止返回 null\n```\n\nJava 使用示例:\n\n```java\npublic class MyEventHandlers extends SimpleListenerHost {\n    @Override\n    public void handleException(@NotNull CoroutineContext context, @NotNull Throwable exception){\n        // 处理事件处理时抛出的异常\n    }\n    @EventHandler\n    public void onMessage(@NotNull MessageEvent event) throws Exception { // 可以抛出任何异常, 将在 handleException 处理\n        event.getSubject().sendMessage(\"received\");\n        // 无返回值, 表示一直监听事件.\n    }\n    @NotNull\n    @EventHandler\n    public ListeningStatus onMessage(@NotNull MessageEvent event) throws Exception { // 可以抛出任何异常, 将在 handleException 处理\n        event.getSubject().sendMessage(\"received\");\n        return ListeningStatus.LISTENING; // 表示继续监听事件\n        // return ListeningStatus.STOPPED; // 表示停止监听事件\n    }\n}\n\n// 注册：\n// eventChannel.registerListenerHost(new MyEventHandlers())\n```\n\n> 回到 [监听事件的其他方法](#监听事件的其他方法)\n\n### 在 Kotlin 使用 DSL 监听事件\n> **警告：此节内容需要坚实的 Kotlin 技能，盲目使用会导致问题**\n\n[subscribeMessages](../mirai-core-api/src/commonMain/kotlin/event/subscribeMessages.kt#L37-L64)\n\n示例：\n```kotlin\neventChannel.subscribeMessages {\n    \"test\" {\n        // 当消息内容为 \"test\" 时执行\n        // this: MessageEvent\n        reply(\"test!\")\n    }\n    \n    \"Hello\" reply \"Hi\" // 当消息内容为 \"Hello\" 时回复 \"Hi\"\n    \"quote me\" quoteReply \"ok\" // 当消息内容为 \"quote me\" 时引用该消息并回复 \"ok\"\n    \"quote me2\" quoteReply {\n        // lambda 也是允许的：\n        // 返回值接受 Any? \n        // 为 Unit 时不发送任何内容；\n        // 为 Message 时直接发送；\n        // 为 String 时发送为 PlainText；\n        // 否则 toString 并发送为 PlainText\n        \n        \"ok\" \n    } \n    \n    case(\"iGNorECase\", ignoreCase=true) reply \"OK\" // 忽略大小写\n    startsWith(\"-\") reply { cmd ->\n        // 当消息内容以 \"-\" 开头时执行\n        // cmd 为消息去除开头 \"-\" 的内容\n    }\n    \n    \n    val listener: Listener<MessageEvent> = \"1\" reply \"2\"\n    // 每个语句都会被注册为事件监听器，可以这样获取监听器\n    \n    listener.complete() // 停止 \"1\" reply \"2\" 这个事件监听\n}\n```\n\n> 回到 [目录](#目录)\n\n## 实现事件\n\n相信你在使用 mirai 自带的事件时已经感到受益匪浅了，这种机制也可以作用在你的程序上，让其他人的程序也能像监听 mirai 自带的事件一样，对你程序的行为作出反应。\n\n### 新建事件\n\n新建一个类，让类实现接口 `Event` 并继承 `AbstractEvent` 即可。根据内部实现，事件必须继承 `AbstractEvent`，如下示例。\n```kotlin\n// kotlin:\nclass ExampleEvent(\n    var action: String\n) : AbstractEvent()\n```\n```java\n// java:\npublic class ExampleEvent extends AbstractEvent {\n    String action;\n    public ExampleEvent(String action) {\n        this.action = action;\n    }\n    public String getAction() {\n        return action;\n    }\n    public void setAction(String action) {\n        this.action = action;\n    }\n}\n```\n### 广播自定义事件\n\n事件需要被广播，才会被监听器接收到，使已监听事件的程序作出响应。以上文的 `ExampleEvent` 为例，\n\nkotlin：`event.broadcast()`\n\njava：`EventKt.broadcast(Event)`\n\n> 注: 在 kotlin 中进行事件的广播需要在协程上下文执行\n\n```kotlin\n// kotlin:\nvar event = ExampleEvent(\"some action\")\nvar finalAction = event.broadcast().action\nprintln(\"action = $finalAction\")\n```\n```java\n// java:\nExampleEvent event = new ExampleEvent(\"some action\");\nString finalAction = EventKt.broadcast(event).getAction();\nSystem.out.println(\"action = \" + finalAction);\n```\n### 监听自定义事件\n\n同上文监听事件的方式几乎一样。不过需要注意的是，从 bot 获取的消息通道 (`bot.eventChannel`)，只能监听 `BotEvent`，如果你的事件类没有实现 `BotEvent`，将无法通过这个通道来监听此事件。因此你可能需要使用 `GlobalEventChannel` 来代替 `bot.eventChannel`。\n\n以下的示例是 监听事件以影响上一个部分 `广播自定义事件` 中的变量 `action` 的值。\n\n```kotlin\n// kotlin:\nGlobalEventChannel.subscribeAlways<ExampleEvent> { event ->\n    // 处理事件\n    if (event.action == \"some action\") {\n        event.action = \"another action\"\n    }\n}\n```\n```java\n// java:\nGlobalEventChannel.INSTANCE.subscribeAlways(ExampleEvent.class, event -> { \n    // 处理事件\n    if (event.getAction().equals(\"some action\")) {\n        event.setAction(\"another action\");\n    }\n});\n```\n\n### 在 Console 中自定义事件\n\n请参考 [Console - JVMPlugin - Data Exchange](../mirai-console/docs/plugin/JVMPlugin-DataExchange.md)\n\n> 回到 [目录](#目录)\n\n## 工具函数（Kotlin）\n> *可能需要较好的 Kotlin 技能才能理解以下内容。*\n> **可以[跳过本节](#　)**\n\n基于 Kotlin 协程特性，mirai 提供 `\n\n### 线性同步（`syncFromEvent`）\n[syncFromEvent.kt](../mirai-core-api/src/commonMain/kotlin/event/syncFromEvent.kt)\n\n挂起协程并获取下一个戳 Bot 的对象：\n```kotlin\nval target: UserOrBot = syncFromEvent<BotNudgedEvent> { sender }\n```\n\n带超时版本：\n```kotlin\nval target: UserOrBot = syncFromEvent<BotNudgedEvent>(5000) { sender } // 5000ms\n```\n\n异步 `async` 版本：\n\n```kotlin\nval target: Deferred<UserOrBot> = coroutineScope.asyncFromEvent<BotNudgedEvent> { sender }\n```\n\n### 线性同步（`nextEvent`）\n[nextEvent.kt](../mirai-core-api/src/commonMain/kotlin/event/nextEvent.kt)\n\n挂起协程并获取下一个指定事件：\n\n```kotlin\nval event: BotNudgedEvent = nextEvent<BotNudgedEvent>()\n```\n\n带超时和过滤器版本：\n\n```kotlin\nval event: BotNudgedEvent = nextEvent<BotNudgedEvent>(5000) { it.bot.id == 123456L }\n```\n\n### 条件选择（`selectMessages`）\n> **警告：此节内容需要坚实的 Kotlin 技能，盲目使用会导致问题**\n\n[select.kt](../mirai-core-api/src/commonMain/kotlin/event/select.kt)\n\n类似于 Kotlin 协程 `select`，mirai 也提供类似的功能。\n\n`selectMessages`：挂起当前协程，等待任意一个事件监听器触发后返回其返回值。\n\n```kotlin\nMyCoroutineScope.subscribeAlways<GroupMessageEvent> {\n    if (message.contentEquals(\"ocr\")) {\n        subject.sendMessage(\"请发送你要进行 OCR 的图片或图片链接\")\n        val image: InputStream = selectMessages {\n            has<Image> { URL(it.queryUrl()).openStream() }\n            has<PlainText> { URL(it.content).openStream() }\n            defaultReply { \"请发送图片或图片链接\" }\n            timeout(30_000) { event.quoteReply(\"请在 30 秒内发送图片或图片链接\"); null }\n        } ?: return@subscribeAlways\n        \n        val result = ocr(image)\n        subject.sendMessage(message.quote() + result)\n    }\n}\n```\n\n这种语法就相当于（伪代码）：\n```\nval image = when (下一条消息) {\n   包含图片 { 查询图片链接() } \n   包含纯文本URL { 下载图片() }\n   其他情况 { 引用回复() }\n   超时 { 引用回复() }\n}\n```\n\n### 循环条件选择（`whileSelectMessages`）\n> **警告：此节内容需要坚实的 Kotlin 技能，盲目使用会导致问题**\n\n[select.kt](../mirai-core-api/src/commonMain/kotlin/event/select.kt)\n\n类似于 Kotlin 协程 `whileSelect`，mirai 也提供类似的功能。\n\n`whileSelectMessages`：挂起当前协程，等待任意一个事件监听器返回 `false` 后返回。\n\n```kotlin\nsubject.sendMessage(\"开启复读模式\")\nwhileSelectMessages {\n    \"stop\" {\n        subject.sendMessage(\"已关闭复读\")\n        false // 停止循环\n    }\n    // 也可以使用 startsWith(\"\") { ... } 等 DSL\n    default {\n        subject.sendMessage(message)\n        true // 继续循环\n    }\n    timeout(3000) {\n        // on\n        true\n    }\n} // 等待直到 `false`\nsubject.sendMessage(\"复读模式结束\")\n```\n\n> 回到 [目录](#目录)\n\n###### 　\n\n----\n\n> 下一步，[Messages](Messages.md)\n>\n> [回到 Mirai 文档索引](CoreAPI.md)\n"
  },
  {
    "path": "docs/Evolution.md",
    "content": "# Mirai - Evolution\n\n### Mirai 演进\n\nMirai 是不断前进的库，目标是提供稳定且高效的 API。  \n维护者会严谨地推进每一项修改，并提供迁移周期（至少 2 个次版本）。\n\n### 版本规范\n\nMirai 的版本号遵循 [语义化版本 2.0.0](https://semver.org/lang/zh-CN/#spec-item-9) 规范。\n\n在日常开发中, Mirai 会以 `-dev-1`，`-dev-2` 等版本后缀发布开发预览版本。这些版本仅用于兼容性测试等目的，无稳定性保证。\n\n在大版本开发过程中，Mirai 会以 `-M1`, `-M2` 等版本后缀发布里程碑预览版本。代表一系列功能的完成，但还不稳定。  \n这些版本里新增的 API 仍可能还会在下一个 Milestone 版本变化，因此请按需使用。\n\n在大版本即将发布前，Mirai 会以 `-RC` 版本后缀发布最终的预览版本。  \n`RC` 表示新版本 API 已经确定，离稳定版发布只差最后的一些内部优化或 bug 修复。\n\n### 版本选择\n\n**稳定性**：稳定 (`x.y.z`) > 发布预览 (`-RC`) > 里程碑预览 (`-M`) > 开发 (`-dev`)。\n\n|        目的        | 推荐至少更新到版本 |\n|:------------------:|:--------------:|\n|      生产环境       |     `x.y.z`     |\n| 希望尽早体验稳定新特性 |     `-RC`      |\n| 无论如何都想体验新特性 |      `-M`      |\n|  为 Mirai 提交 PR   |     `-dev`     |\n\n## 更新兼容性\n\n对于 `x.y.z` 版本号:\n- 当 `z` 增加时，只会有 bug 修复，和必要的新函数添加（为了解决某一个问题），不会有破坏性变化。\n- 当 `y` 增加时，可能有新 API 的引入，和旧 API 的弃用。但这些弃用会经过一个弃用周期后才被删除（隐藏）。向下兼容得到保证。\n- 当 `x` 增加时，任何 API 都可能会有变化。无兼容性保证。\n\n## 弃用周期\n\n一个计划被删除的 API，将会在下一个次版本开始经历弃用周期。\n\n如一个 API 在 `1.1.0` 起被弃用，它首先会是 `WARNING` (使用时会得到一个编译警告）弃用级别。  \n在 `1.2.0` 上升为 `ERROR`（使用时会得到一个编译错误）；  \n在 `1.3.0` 上升为 `HIDDEN`（使用者无法看到这些 API)。\n\n`HIDDEN` 的 API 仍然会保留在代码中并正常编译，以提供二进制兼容性，直到下一个主版本更新。\n\n\n\n----\n\n> [回到 Mirai 文档索引](README.md#jvm-平台-mirai-开发)"
  },
  {
    "path": "docs/KotlinAndJava.md",
    "content": "# Mirai - Kotlin And Java\n\n\n本章介绍部分 Kotlin 定义对应的 Java 定义，以帮助 Java 使用者理解 Mirai 的源代码。\n\n每部分第一个代码块为 Kotlin 代码，第二个代码块为 Java 代码。\n\n预计阅读时间：5 分钟\n\n#### 通用\n- Kotlin 的定义都默认是 `public` 和 `final`\n- Kotlin 不需要句末分号，通常以换行作为一个语句的结束\n\n#### `class`\n```kotlin\nclass A\n```\n```java\npublic final class A {\n}\n```\n\n#### 构造器定义\n\n以下几种 Kotlin 定义是等价的。\n\n```kotlin\nclass A {\n    private val value: String\n    \n    constructor(value: String) {\n        this.value = value\n    }\n    \n    constructor(integer: Int) {\n        this.value = integer.toString()\n    }\n}\n```\n\n```kotlin\nclass A(val value: String) { // 类定义后面的括号表示主构造器\n    constructor(integer: Int) : this(integer.toString())\n}\n```\n\n对应的 Java 定义为：\n```java\npublic final class A {\n    private final String value;\n    \n    public A(String value) {\n        this.value = value;\n    }\n    \n    public A(int integer) {\n        this.value = String.valueOf(integer);\n    }\n}\n```\n\n通常 Kotlin class 都会有一个主构造器。\n\n#### 构造器调用\n\nKotlin 不需要 `new` 关键字。\n\n```kotlin\nval a = A(\"test\")\n```\n\n```java\nA a = new A(\"test\");\n```\n\n#### 函数\n```kotlin\nclass A {\n    fun test(string: String): Int = 1\n}\n```\n\n```java\npublic final class A {\n    public int test(String string) {\n        return 1;\n    }\n}\n```\n\n#### 属性 `val`\n- Kotlin 的 `val` 是不可变的，只能被赋值一次\n- 编译器为 `val` 创建 `getter`\n\n```kotlin\nclass A {\n    val value: String = \"test\"\n}\n```\n\n```java\npublic final class A {\n    private final String value = \"test\";\n    public final String getValue() {\n        return value;\n    }\n}\n```\n\n#### 属性 `var`\n- Kotlin 的 `var` 相较于 `val` 是可变的，可以被多次赋值。\n- 编译器为 `var` 创建 `getter` 和 `setter`\n\n```kotlin\nclass A {\n    var value: String = \"test\"\n}\n```\n\n```java\npublic final class A {\n    private String value = \"test\";\n    public final String getValue() {\n        return value;\n    }\n    public final String setValue(String value) {\n        this.value = value;\n    }\n}\n```\n\n#### 顶层定义和 `const`\n- Kotlin 的定义不一定需要在 `class` 中，允许直接存在于文件中的「顶层函数」和「顶层属性」\n- `XXX.kt` 中的顶层定义会被编译为名为 `XXXKt` 的 `class`\n- 顶层定义会被编译为 `static`\n- `const` 可以修饰一个属性，编译器会把它编译为 Java 静态字段。\n\n```kotlin\n// Test.kt\nval x: String = \"xx\"\n\nconst val CONST_VALUE: String = \"cc\"\n\nfun foo() { }\n```\n\n```java\n// TestKt.java\npublic final class TestKt {\n    public static final String CONST_VALUE = \"cc\"; // const val 没有 getter\n    \n    private static final String x = \"xx\";\n    public static String getX(){\n        return x; \n    }\n    \n    public static void foo() { }\n}\n```\n\n#### 单例对象\n- Kotlin `object` 定义一个单例对象\n\n```kotlin\nobject Test\n```\n\n```java\npublic final class Test {\n    public static final Test INSTANCE = new Test();\n\n    private Test() {}\n}\n```\n\n#### 静态\n\n```kotlin\nobject Test {\n    val x = \"x\"             // public String getX()\n    @JvmField val y = \"y\"   // public static final String y;\n    @JvmStatic val z = \"z\"  // public static String getZ()\n} \n```\n\n```java\npublic final class Test {\n    public static final Test INSTANCE = new Test();\n    private Test() {}\n\n    private final String x = \"x\";       // val\n    public String getX() {\n        return x;\n    }\n    \n    public static final String y = \"y\"; // @JvmField val\n    \n    private final String z = \"z\";       // @JvmStatic val\n    public static String getZ() {\n        return z;\n    }\n} \n```\n\n\n#### 静态\n\n- Kotlin 没有 `static` 关键字，但可以通过 `@JvmStatic` 将一个函数编译为 `static`\n\n```kotlin\nobject Test {\n    fun a() { }\n    @JvmStatic\n    fun b() { }\n} \n```\n\n```java\npublic final class Test {\n    public static final Test INSTANCE = new Test();\n    private Test() {}\n    \n    public void a() { }\n    public static void b() { }\n} \n```\n\n#### 伴生对象\n\n- `class` 可以拥有 `companion object`\n- 伴生对象内的 `@JvmField` 定义将会被编译到外部 `class`\n- 伴生对象内的 `@JvmStatic` 函数以成员方法编译到伴生对象，然后以静态方法编译到外部 `class`\n\n```kotlin\nclass Test {\n    companion object {\n        @JvmField\n        val CONST: String = \"\"\n    \n        fun a() { }\n        @JvmStatic\n        fun b() { }\n    }\n} \n```\n\n```java\npublic final class Test {\n    public static final Companion Companion = new Companion();\n    public static final String CONST = \"\";\n    \n    public static void b() { \n        Companion.b();\n    }\n\n    public static final class Companion {\n        public void a() { }\n        public void b() { }\n    }\n} \n```\n\n#### 协程\n\nKotlin 协程是语言级特性，`suspend` 修饰的函数会在编译期被处理。\n\n```kotlin\nclass A {\n    suspend fun getValue(): String { /* ... */ } \n}\n```\n\n```java\npublic final class A {\n    public Object getValue(Continuation<? super String> $completion) {\n        // 由 Kotlin 编译器生成非常复杂的方法体\n    }\n}\n```\n\n`$completion` 参数类似于一个回调。需要熟悉 Kotlin 协程原理才能实现。为帮助 Java 用户，mirai 使用编译器插件处理 `suspend` 函数。\n\n```kotlin\nclass A {\n    @JvmBlockingBridge\n    suspend fun getValue(): String { /* ... */ } \n}\n```\n\n```java\npublic final class A {\n    public Object getValue(Continuation<? super String> $completion) {\n        // 由 Kotlin 编译器生成非常复杂的方法体\n    }\n    \n    // 通过 @JvmBlockingBridge 生成的方法\n    public String getValue() {\n        // 由 @JvmBlockingBridge 的编译器生成方法体，调用 getValue(Continuation)\n    }\n}\n```\n\nJava 使用者可以认为 `@JvmBlockingBridge suspend fun getValue(): String` 相当于 `fun getValue(): String`。\n\n\n----\n\n> [回到 Mirai 文档索引](README.md#jvm-平台-mirai-开发)"
  },
  {
    "path": "docs/Messages.md",
    "content": "# Mirai - Messages\n\n## 目录\n- [消息系统](#消息系统)\n- [消息类型](#消息类型)\n- [消息元素](#消息元素)\n- [消息链](#消息链)\n  - [发送消息](#发送消息)\n  - [构造消息链](#构造消息链)\n  - [元素唯一性](#元素唯一性)\n  - [获取消息链中的消息元素](#获取消息链中的消息元素)\n  - [序列化](#序列化)\n  - [消息的其他常用功能](#消息的其他常用功能)\n- [Mirai 码](#mirai-码)\n  - [转义规则](#转义规则)\n  - [消息链的 mirai 码](#消息链的-mirai-码)\n  - [由 `CodableMessage` 取得 mirai 码字符串](#由-codablemessage-取得-mirai-码字符串)\n  - [由 mirai 码字符串取得 `MessageChain` 实例](#由-mirai-码字符串取得-messagechain-实例)\n  - [`serializeToMiraiCode` 与 `toString` 的区别](#serializetomiraicode-与-tostring-的区别)\n\n---\n\n## 消息系统\n\n在[Contacts 章节](Contacts.md)提到，要发送消息，使用 `Contact.sendMessage(Message)`。`Message` 架构如下图所示。\n\n[![](https://mermaid.ink/img/eyJjb2RlIjoiY2xhc3NEaWFncmFtXG5cbmNsYXNzIE1lc3NhZ2VDaGFpblxuTWVzc2FnZUNoYWluIDogTGlzdH5TaW5nbGVNZXNzYWdlflxuXG5NZXNzYWdlPHwtLU1lc3NhZ2VDaGFpblxuTWVzc2FnZTx8LS1TaW5nbGVNZXNzYWdlXG5cbk1lc3NhZ2VDaGFpbiBvLS0gU2luZ2xlTWVzc2FnZVxuXG5TaW5nbGVNZXNzYWdlPHwtLU1lc3NhZ2VDb250ZW50XG5TaW5nbGVNZXNzYWdlPHwtLU1lc3NhZ2VNZXRhZGF0YVxuXG4iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9LCJ1cGRhdGVFZGl0b3IiOmZhbHNlfQ)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoiY2xhc3NEaWFncmFtXG5cbmNsYXNzIE1lc3NhZ2VDaGFpblxuTWVzc2FnZUNoYWluIDogTGlzdH5TaW5nbGVNZXNzYWdlflxuXG5NZXNzYWdlPHwtLU1lc3NhZ2VDaGFpblxuTWVzc2FnZTx8LS1TaW5nbGVNZXNzYWdlXG5cbk1lc3NhZ2VDaGFpbiBvLS0gU2luZ2xlTWVzc2FnZVxuXG5TaW5nbGVNZXNzYWdlPHwtLU1lc3NhZ2VDb250ZW50XG5TaW5nbGVNZXNzYWdlPHwtLU1lc3NhZ2VNZXRhZGF0YVxuXG4iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9LCJ1cGRhdGVFZGl0b3IiOmZhbHNlfQ)\n\n`SingleMessage` 表示单个消息元素。  \n`MessageChain`（消息链） 是 `List<SingleMessage>`。主动发送的消息和从服务器接收消息都是 `MessageChain`。\n\n\n> 回到 [目录](#目录)\n\n## 消息类型\n\nMirai 支持富文本消息。\n\n*单个消息元素（`SingleMessage`）* 分为 *内容（`MessageContent`）* 和 *元数据（`MessageMetadata`）*。\n\n实践中，消息内容和消息元数据会混合存在于消息链中。\n\n### 内容\n\n*内容（`MessageContent`）* 即为 *纯文本*、*提及某人*、*图片*、*语音* 和 *音乐分享* 等**有内容**的数据，一条消息中必须包含内容才能发送。\n\n### 元数据\n\n*元数据（`MessageMetadata`）* 包含 *来源*、*引用回复* 和 *秀图标识* 等。\n\n- *消息来源*（`MessageSource`）存在于每条消息中，包含唯一识别信息，用于撤回和引用回复的定位。\n- *引用回复*（`QuoteReply`）若存在，则会在客户端中解析为本条消息引用了另一条消息。\n- *秀图标识*（`ShowImageFlag`）若存在，则表明这条消息中的图片是以秀图发送（QQ 的一个功能）。\n\n元数据与内容的区分就在于，一条消息没有元数据也能显示，但一条消息不能没有内容。**元数据是消息的属性**。\n\n后文会介绍如何获取元数据。\n\n> 回到 [目录](#目录)\n\n---\n\n## 消息元素\n\nMirai 支持多种消息类型。\n\n消息拥有三种转换到字符串的表示方式。\n\n| 方法                      | 解释                                                                                          |\n|:-------------------------|:---------------------------------------------------------------------------------------------|\n| `serializeToMiraiCode()` | 对应的 Mirai 码. 消息的一种序列化方式，格式为 `[mirai:TYPE:PROP]`，其中 `TYPE` 为消息类型, `PROP` 为属性 |\n| `contentToString()`       | QQ 对话框中以纯文本方式会显示的消息内容。无法用纯文字表示的消息会丢失信息，如任何图片都是 `[图片]`             |\n| `toString()`             | Java 对象的 `toString()`，会尽可能包含多的信息用于调试作用，**行为可能不确定**                           |\n\n各类型消息元素及其 `contentToString()` 如下表格所示。\n\n[`MessageContent`]: ../mirai-core-api/src/commonMain/kotlin/message/data/SingleMessage.kt\n[`MessageMetadata`]: ../mirai-core-api/src/commonMain/kotlin/message/data/SingleMessage.kt\n\n[`PlainText`]: ../mirai-core-api/src/commonMain/kotlin/message/data/PlainText.kt\n[`At`]: ../mirai-core-api/src/commonMain/kotlin/message/data/At.kt\n[`AtAll`]: ../mirai-core-api/src/commonMain/kotlin/message/data/AtAll.kt\n[`Face`]: ../mirai-core-api/src/commonMain/kotlin/message/data/Face.kt\n[`PokeMessage`]: ../mirai-core-api/src/commonMain/kotlin/message/data/PokeMessage.kt\n[`VipFace`]: ../mirai-core-api/src/commonMain/kotlin/message/data/VipFace.kt\n[`Image`]: ../mirai-core-api/src/commonMain/kotlin/message/data/Image.kt\n[`FlashImage`]: ../mirai-core-api/src/commonMain/kotlin/message/data/FlashImage.kt\n[`MarketFace`]: ../mirai-core-api/src/commonMain/kotlin/message/data/MarketFace.kt\n[`MusicShare`]: ../mirai-core-api/src/commonMain/kotlin/message/data/MusicShare.kt\n[`Dice`]: ../mirai-core-api/src/commonMain/kotlin/message/data/Dice.kt\n[`FileMessage`]: ../mirai-core-api/src/commonMain/kotlin/message/data/FileMessage.kt\n[`RockPaperScissors`]: ../mirai-core-api/src/commonMain/kotlin/message/data/RockPaperScissors.kt\n\n[`MessageSource`]: ../mirai-core-api/src/commonMain/kotlin/message/data/MessageSource.kt\n[`QuoteReply`]: ../mirai-core-api/src/commonMain/kotlin/message/data/QuoteReply.kt\n[`LightApp`]: ../mirai-core-api/src/commonMain/kotlin/message/data/RichMessage.kt\n[`SimpleServiceMessage`]: ../mirai-core-api/src/commonMain/kotlin/message/data/RichMessage.kt\n[`Voice`]: ../mirai-core-api/src/commonMain/kotlin/message/data/Voice.kt\n[`Audio`]: ../mirai-core-api/src/commonMain/kotlin/message/data/Audio.kt\n[`ForwardMessage`]: ../mirai-core-api/src/commonMain/kotlin/message/data/ForwardMessage.kt\n[`ShowImageFlag`]: ../mirai-core-api/src/commonMain/kotlin/message/data/ShowImageFlag.kt\n[`RichMessageOrigin`]: ../mirai-core-api/src/commonMain/kotlin/message/data/MessageOrigin.kt\n[`MessageOrigin`]: ../mirai-core-api/src/commonMain/kotlin/message/data/MessageOrigin.kt\n\n\n|  [`MessageContent`] 类型  | 解释                 | `contentToString()`     |      最低支持的版本      |\n|:------------------------:|:--------------------|:------------------------|:---------------------:|\n|      [`PlainText`]       | 纯文本               | `$content`              |          2.0          |\n|        [`Image`]         | 自定义图片            | `[图片]`                 |          2.0          |\n|          [`At`]          | 提及某人              | `@$target`              |          2.0          |\n|        [`AtAll`]         | 提及全体成员           | `@全体成员`              |          2.0          |\n|         [`Face`]         | 原生表情              | `[表情对应的中文名]`       |          2.0          |\n|      [`FlashImage`]      | 闪照                 | `[闪照]`                 |          2.0          |\n|     [`PokeMessage`]      | 戳一戳消息（消息非动作） | `[戳一戳]`               |          2.0          |\n|       [`VipFace`]        | VIP 表情             | `[${kind.name}]x$count` |          2.0          |\n|       [`LightApp`]       | 小程序               | `$content`              |          2.0          |\n|        [`Voice`]         | 语音（已弃用）         | `[语音消息]`              | 2.0  *<sup>(3)</sup>* |\n|      [`MarketFace`]      | 商城表情              | `[表情对应的中文名]`       |          2.0          |\n|    [`ForwardMessage`]    | 合并转发              | `[转发消息]`             | 2.0  *<sup>(1)</sup>* |\n| [`SimpleServiceMessage`] | （不稳定）服务消息      | `$content`              |          2.0          |\n|      [`MusicShare`]      | 音乐分享              | `[分享]曲名`             |          2.1          |\n|         [`Dice`]         | 魔法表情骰子           | `[骰子:$value]`         |          2.5          |\n| [`RockPaperScissors`]    | 魔法表情猜拳           | `[石头]`/`[剪刀]`/`[布]` |         2.14          |\n|     [`FileMessage`]      | 文件消息              | `[文件]文件名称`          |          2.5          |\n|        [`Audio`]         | 语音                 | `[语音消息]`              |          2.7          |\n\n\n\n\n| [`MessageMetadata`] 类型 | 解释         |     最低支持的版本     |\n|:-----------------------:|:------------|:-------------------:|\n|    [`MessageSource`]    | 消息来源元数据 |         2.0         |\n|     [`QuoteReply`]      | 引用回复      |         2.0         |\n|    [`ShowImageFlag`]    | 秀图标识      |         2.2         |\n|  [`RichMessageOrigin`]  | 富文本消息源   | 2.3 *<sup>(2)</sup>* |\n|    [`MessageOrigin`]    | 富文本消息源   |         2.6         |\n\n> *(1):* [`ForwardMessage`] 在 2.0 支持发送, 在 2.3 支持接收  \n> *(2):* [`RichMessageOrigin`] 在 2.3 增加, 在 2.6 弃用并以 [`MessageOrigin`] 替换  \n> *(3):* [`Voice`] 在 2.0 增加, 在 2.7 弃用并以 [`Audio`] 替换\n\n\n### 用法\n\n只需要得到各种类型 `Message` 的实例就可以使用，可以直接发送（`Contact.sendMessage`）也可以连接到消息链中（`Message.plus`）。\n\n可在上文表格中找到需要的类型并在源码内文档获取更多实践上的帮助。\n\n> 回到 [目录](#目录)\n\n## 消息链\n\n[`MessageChain`]: ../mirai-core-api/src/commonMain/kotlin/message/data/MessageChain.kt\n[`SingleMessage`]: ../mirai-core-api/src/commonMain/kotlin/message/data/SingleMessage.kt\n[`CodableMessage`]: ../mirai-core-api/src/commonMain/kotlin/message/code/CodableMessage.kt\n\n前文已经介绍消息链，这里简略介绍消息链的使用。详细的使用请查看源码内注释。\n\n### 发送消息\n\n在 [Contacts 章节](Contacts.md) 提到，要发送消息使用 `Contact.sendMessage`。`Contact.sendMessage` 的定义是：\n```kotlin\n suspend fun sendMessage(message: Message): MessageReceipt<Contact>\n```\n\n要发送字符串消息，使用：（第一部分是 Kotlin，随后是 Java，下同）\n```kotlin\ncontact.sendMessage(\"Hello!\")\n```\n```java\ncontact.sendMessage(\"Hello!\");\n```\n\n发送字符串实际上是在发送纯文本消息。上面的代码相当于：\n```kotlin\ncontact.sendMessage(PlainText(\"Hello!\"))\n```\n```java\ncontact.sendMessage(new PlainText(\"Hello!\"));\n```\n\n要发送多元素消息，可将消息使用 `plus` 操作连接：\n```kotlin\ncontact.sendMessage(PlainText(\"你要的图片是\") + Image(\"{f8f1ab55-bf8e-4236-b55e-955848d7069f}.png\")) // 一个纯文本加一个图片\n```\n```java\ncontact.sendMessage(new PlainText(\"你要的图片是：\").plus(Image.fromId(\"{f8f1ab55-bf8e-4236-b55e-955848d7069f}.png\"))); // 一个纯文本加一个图片\n```\n\n注当需要拼接的消息元素较多时，建议[使用构建器](#构造消息链)。\n\n在 mirai 2.12 起，`plus` 在不同时涉及消息链以及元数据时，速度与构建器相当。而在这以前 `plus` 在很多情况下都比使用构建器慢。（备注：只要不是要连接数百个或更多元素，这个性能差距实际上也可以忽略）\n\n### 构造消息链\n\n多个消息元素可以作为消息链组合。\n\n#### 在 Kotlin 构造消息链\n\n| 定义                                                     |\n|:--------------------------------------------------------|\n| `fun Iterable<Messaged>.toMessageChain(): MessageChain` |\n| `fun Sequence<Messaged>.toMessageChain(): MessageChain` |\n| `fun Array<Message>.toMessageChain(): MessageChain`     |\n| `fun Message.toMessageChain(): MessageChain`            |\n| `fun messageChainOf(vararg Message): MessageChain`      |\n| `fun Message.plus(tail: Message): MessageChain`         |\n\n可以使用如上表格所示的方法构造，或使用 DSL 构建器。构建器的简单定义如下：\n```kotlin\nclass MessageChainBuilder : MutableList<SingleMessage>, Appendable {\n    operator fun Message.unaryPlus()\n    operator fun String.unaryPlus()\n    fun add(vararg messages: Message)\n}\n```\n\n在 Kotlin 的使用示例：\n\n```kotlin\nval chain = buildMessageChain {\n    +PlainText(\"a\")\n    +AtAll\n    +Image(\"/f8f1ab55-bf8e-4236-b55e-955848d7069f\")\n    add(At(123456)) // `+` 和 `add` 作用相同\n}\n\n// chain 结果是包含 PlainText, AtAll, Image, At 的 MessageChain\n```\n\n该示例中 `+` 是位于 `MessageChainBuilder` 的 `Message.unaryPlus` 扩展。使用 `+` 和使用 `add` 是相等的。\n\n#### 在 Java 构造消息链\n\n| 定义                                                                  |\n|:---------------------------------------------------------------------|\n| `public static MessageChain newChain(Iterable<Message> iterable)`    |\n| `public static MessageChain newChain(Message iterable...)`           |\n| `public static MessageChain newChain(Iterator<Message> iterable...)` |\n\n方法都位于 `net.mamoe.mirai.message.data.MessageUtils`。\n\n使用 `newChain`：\n```java\nMessageChain chain = MessageUtils.newChain(new PlainText(\"Hello\"), Image.fromId(\"{f8f1ab55-bf8e-4236-b55e-955848d7069f}.png\"));\n```\n\n使用 `MessageChainBuilder`:\n```java\nMessageChain chain = new MessageChainBuilder()\n    .append(new PlainText(\"string\"))\n    .append(\"string\") // 会被构造成 PlainText 再添加, 相当于上一行\n    .append(AtAll.INSTANCE)\n    .append(Image.fromId(\"{f8f1ab55-bf8e-4236-b55e-955848d7069f}.png\"))\n    .build();\n```\n\n### 作为字符串处理消息\n\n通常要把消息作为字符串处理，可在 Kotlin 使用 `message.content` 或在 Java 使用 `message.contentToString()`。\n获取到的字符串表示只包含各 [`MessageContent`] 以官方风格显示的消息内容。如 `\"你本次测试的成绩是[图片]\"`、`[语音]`、`[微笑]`。\n\n\n使用 `toString()` 对某些元素可以获得与 `contentToString()` 相似的结果，但 **`toString` 是不稳定**的，可能在未来版本变更。\n`contentToString()` 实际上也**没有**对所有元素都作出稳定性承诺，在开发时应尽可能避免基于复杂消息类型的字符串表示处理。\n\n### 处理富文本消息\n\nMirai 不内置富文本消息的处理工具类。`MessageChain` 实现接口 `List<SingleMessage>`，一个思路是遍历 list 并判断类型处理：\n```java\nfor (element : messageChain) {\n    if (element instanceof Image) {\n        // 处理一个 Image\n    }\n}\n```\n也可以像数组一样按下标随机访问：\n```java\nSingleMessage element = messageChain.get(0);\nif (element instanceof Image) {\n    // 处理一个 Image\n}\n```\n\n\n### 元素唯一性\n\n[`MessageKey`]: ../mirai-core-api/src/commonMain/kotlin/message/data/MessageKey.kt\n[`ConstrainSingle`]: ../mirai-core-api/src/commonMain/kotlin/message/data/ConstrainSingle.kt\n[`HummerMessage`]: ../mirai-core-api/src/commonMain/kotlin/message/data/HummerMessage.kt\n\n部分元素只能单一存在于消息链中。这样的元素实现接口 [`ConstrainSingle`]。\n\n唯一的元素例如 *消息元数据* [`MessageSource`]，在连接时，新的（右侧）元素会替换旧的（左侧）元素。如：\n```kotlin\nval source1: MessageSource\nval source2: MessageSource\n\nval chain: MessageChain = source1 + source2\n// 结果 chain 只包含一个元素，即右侧的 source2。\n```\n\n元素唯一性的识别基于 [`MessageKey`]。有些 [`MessageKey`] 拥有多态机制。例如 [`HummerMessage`] 的继承关系\n```\n              MessageContent\n                    ↑\n              HummerMessage\n                    ↑\n       +------------+-------------+------------+\n       |            |             |            |\n PokeMessage     VipFace      FlashImage      ...\n```\n\n当连接一个 [`VipFace`] 到一个 [`MessageChain`] 时，由于 [`VipFace`] 最远父类为 `MessageContent`，消息链中第一个 `MessageContent` 会被（保留顺序地）替换为 [`VipFace`]，其他所有 `MessageContent` 都会被删除。\n```kotlin\n// Kotlin\n\nval face = VipFace(VipFace.AiXin, 1) // VipFace 是 ConstrainSingle\nval chain = messageChainOf(plainText, quoteReply, at, atAll) // quoteReply 是 MessageMetadata, 其他三个都是 MessageContent\nval result = chain + face // 右侧的 VipFace 替换掉所有的 MessageContent. 它会存在于第一个 MessageContent 位置.\n// 结果为 [VipFace, QuoteReply]\n```\n\n```java\n// Java\n\nVipFace face = new VipFace(VipFace.AiXin, 1); // VipFace 是 ConstrainSingle\nMessageChain chain = MessageChain.newChain(plainText, quoteReply, at, atAll); // quoteReply 是 MessageMetadata, 其他三个都是 MessageContent\nMessageChain result = chain.plus(face); // 右侧的 VipFace 替换掉所有的 MessageContent. 它会存在于第一个 MessageContent 位置.\n// 结果为 [VipFace, QuoteReply]\n```\n\n简单来说，这符合现实的逻辑：一条消息如果包含了语音，就不能同时包含群文件、提及全体成员、文字内容等元素。进行 `chain.plus(audio)` 时，如果消息内容冲突则会发生替换，且总是右侧元素替换左侧元素。  \n而如果消息可以同时存在，比如一个纯文本和一个或多个图片相连 `plainText.plus(image1).plus(image2)` 时没有冲突，不会发生替换。结果将会是 `[PlainText, Image, Image]` 的 `MessageChain`。\n\n### 获取消息链中的消息元素\n\n#### A. 筛选 List\n[`MessageChain`] 继承接口 `List<SingleMessage>`。\n```kotlin\nval image: Image? = chain.findIsInstance<Image>()\n```\n```java\nImage image = (Image) chain.stream().filter(Image.class::isInstance).findFirst().orElse(null);\n```\n\n在 Kotlin 要获取第一个指定类型实例还可以使用快捷扩展。\n```kotlin\nval image: Image? = chain.findIsInstance<Image>()\nval image: Image = chain.firstIsInstance<Image>() // 不存在时 NoSuchElementException\n```\n\n#### B. 获取唯一元素\n如果要获取 `ConstrainSingle` 的消息元素，可以快速通过键获得。\n\n```kotlin\nval quote: QuoteReply? = chain[QuoteReply] // 类似 Map.get\nval quote: QuoteReply = chain.getOrFail(QuoteReply) // 不存在时 NoSuchElementException\n```\n```java\nQuoteReply quote = chain.get(QuoteReply.Key);\n```\n\n一些元数据就可以通过这个方法获得。如上述示例就是在获取引用回复（`QuoteReply`）。如果获取不为 `null` 则表明这条消息包含对其他某条消息的引用。\n\n> 这是因为 `MessageKey` 一般都以消息元素的 `companion object` 实现\n\n#### C. 使用属性委托\n\n可在 Kotlin 使用属性委托。这样的方法与上述方法在性能上等价。\n\n```kotlin\nval image: Image by chain // 不存在时 NoSuchElementException\nval image: Image? by chain.orNull()\nval image: Image? by chain.orElse { /* 返回一个 Image */ }\n```\n\n#### D. 遍历 List\n```java\nfor (SingleMessage message : messageChain) {\n    // ...    \n}\n```\n\n也可以使用 `messageChain.iterator()`、 `messageChain.stream()` 等。\n\n### 序列化\n\n> 简单地讲，序列化指的是将内存中的对象转换为其他易于存储等的表示方式。如对象变 JSON 字符串、对象变 MiraiCode 字符串。\n\n消息可以序列化为 JSON 字符串，使用 `MessageChain.serializeToJsonString` 和 `MessageChain.deserializeFromJsonString`。\n\n```java\n\nString json = MessageChain.serializeToJsonString(message);\n\nMessageChain chain = MessageChain.deserializeFromJsonString(message);\n\n```\n\n#### 使用 kotlinx.serialization\n\n若要将消息类型使用在其他类型中，如\n```kotlin\ndata class Foo(\n    val image: Image\n)\n```\n\n则需要在序列化时为 format 添加 `serializersModule`：\n```kotlin\nval json = Json {\n    serializersModule = MessageSerializers.serializersModule\n}\n```\n\n如果遇到 [`Encountered unknown key 'type'.`](https://github.com/mamoe/mirai/issues/1273#issuecomment-850997979) 等序列化错误，请添加：\n```kotlin\nJson {\n    serializersModule = MessageSerializers.serializersModule\n    ignoreUnknownKeys = true // 添加这一行\n}\n```\n\n#### 元素类型不一定被保留\n\n如 _消息源 `MessageSource`_ 有 _在线消息源 `OnlineMessageSource`_ 和 _离线消息源 `OfflineMessageSource`_ 之分。`OnlineMessageSource` 在序列化并反序列化后会变为 `OfflineMessageSource`，因为在线消息源只能从消息回执和消息事件中的 `MessageChain` 得到。\n\n但在 API 使用上不会有区别（共有属性获取到的值不会变化）。只是可能需要注意 `equals` 等方法的使用。\n\n所有 `Message` 反序列化的结果都是 `MessageChain`，即使原消息可能是 `SingleMessage`。如果原消息是 `SingleMessage`，可在反序列化后通过 `chian.get(0)` 下标访问并强转类型（或者其他更好的方法）。\n\n#### 序列化稳定性\n\n在旧版本产生的 JSON 字符串在绝大多数情况下可以由新版本 Mirai 读取并反序列化成原 `MessageChain`。如果更新时放弃了对某个旧版本消息元素的支持，将会在更新日志中说明。\n\n但这个规则不适用于 _实验性特性_（带有 `@MiraiExperimentalApi` 注解）。任何使用了实验性特性的消息元素都随时可变。\n\n### 消息的其他常用功能\n\n#### 撤回自己或群员的消息\n\n撤回的核心操作是 `MessageSource.recall`。 如果操作目标 `MessageSource` 指代的是自己的消息，那么就撤回该消息，操作群员消息同理。\n\n来自 `GroupMessageEvent` 等消息事件的属性 `message` 的 `MessageChain` 都包含 `MessageSource` 元素，指代这条消息本身。那么就可以用来撤回这条消息。\n\n```kotlin\n// Kotlin\nmessageSource.recall()\nmessageChain.recall() // 获取其中 MessageSource 元素并操作 recall \n\nmessageSource.recallIn(3000) // 启动协程, 3 秒后撤回消息. 返回的 AsyncRecallResult 可以获取结果\nmessageChain.recallIn(3000)\n```\n\n```java\n// Java\nMessageSource.recall(messageSource);\nMessageSource.recall(messageChain); // 获取其中 MessageSource 元素并操作 recall \n\nMessageSource.recallIn(messageSource, 3000) // 启动异步任务, 3 秒后撤回消息. 返回的 AsyncRecallResult 可以获取结果\nMessageSource.recallIn(messageChain, 3000)\n```\n\n#### 发送带有引用回复的消息\n\n引用回复 `QuoteReply` 是一个元数据 `MessageMetadata`。将 `QuoteReply` 实例连接到消息链中，发送后的消息就会引用一条其他消息。\n\n例如监听事件并回复一条群消息：\n\n```kotlin\n// Kotlin\nbot.eventChannel.subscribeAlways<GroupMessageEvent> { // this: GroupMessageEvent\n    subject.sendMessage(message.quote() + \"Hi!\") // 引用收到的消息并回复 \"Hi!\", 也可以添加图片等更多元素.\n}\n```\n\n```java\n// Java\nbot.getEventChannel().subscribeAlways<GroupMessageEvent>(event -> {\n    MessageChain chain = new MessageChainBuilder() // 引用收到的消息并回复 \"Hi!\", 也可以添加图片等更多元素.\n        .append(new QuoteReply(event.getMessage()))\n        .append(\"Hi!\")\n        .build();\n    event.getSubject().sendMessage(chain);\n});\n```\n\n#### 更多消息类型\n\n在 [消息元素](#消息元素) 表格中找到你需要的消息元素，然后到源码内注释查看相应的用法说明。\n\n> 回到 [目录](#目录)\n\n---\n\n## Mirai 码\n\n实现了接口 `CodableMessage` 的消息类型支持 mirai 码表示。可以在[下文](#由-codablemessage-取得-mirai-码字符串)找到这些消息类型的列表。\n\n### 转义规则\n\nmirai 码内的属性字符串会被转义。\n\n|   原字符    | 转义结果字符 |\n|:----------:|:---------:|\n|    `[`     |   `\\[`    |\n|    `]`     |   `\\]`    |\n|    `:`     |   `\\:`    |\n|    `,`     |   `\\,`    |\n|    `\\`     |   `\\\\`    |\n| *换行符 \\n* |    `\\n`    |\n| *换行符 \\r* |    `\\r`    |\n\n### 组成约定\n\n一个有效的 mirai 码 (如 `[mirai:atall]` (无参数), `[mirai:at:123]` (有参数)) 可分为以下几个组成部分\n\n- `[mirai:` 固定开头\n- 消息类型， 如 `at`\n- 消息参数\n  - `:` 固定分隔符\n  - 参数内容 **(需要进行转义)**\n- `]` 固定结尾\n\n#### 为何需要进行转义\n\n为了 mirai 码的正确解析, 不转义无法正确解析原本意义\n\n假如有以下参数\n\n```\n{\"msg\": [1, 2, 3]}\n```\n\n如果不进行转义直接进行 mirai 码拼接 (如: `[mirai:msg:{\"msg\": [1, 2, 3]}]`), 那么 mirai 码会被错误解析\n\n> 解析结果如下:\n>\n> - mirai 码 `[mirai:msg:{\"msg\": [1, 2, 3]`\n> - 纯文本 `}]`\n\n### 消息链的 mirai 码\n\n消息链 [`MessageChain`] 是多个 [`SingleMessage`] 的集合。[`MessageChain`] 也实现 [`CodableMessage`]。在转换为 mirai 码时所有 [`CodableMessage`] 直接相连：\n```\nval chain = messageChainOf(PlainText(\"plain\"), At(123), AtAll)\n\nchain.serializeToMiraiCode() // \"plain[mirai:at:123][mirai:atall]\"\n```\n\n### 由 `CodableMessage` 取得 mirai 码字符串\n\n通过 `CodableMessage.serializeToMiraiCode()`。\n\n```\nval at = At(123)\n\nat.serializeToMiraiCode() // 结果为 `[mirai:at:123]`\n```\n\n|          消息类型          | `serializeToMiraiCode()`                         |\n|:------------------------:|:-------------------------------------------------|\n|      [`PlainText`]       | `$content`                                       |\n|        [`Image`]         | `[mirai:image:$imageId]`                         |\n|          [`At`]          | `[mirai:at:$target]`                             |\n|        [`AtAll`]         | `[mirai:atall]`                                  |\n|         [`Face`]         | `[mirai:face:id]`                                |\n|      [`FlashImage`]      | `[mirai:flash:${image.imageId}]`                 |\n|     [`PokeMessage`]      | `[mirai:poke:$name,$pokeType,$id]`               |\n|       [`VipFace`]        | `[mirai:vipface:${kind.id},${kind.name},$count]` |\n|       [`LightApp`]       | `[mirai:app:$content]`                           |\n| [`SimpleServiceMessage`] | `[mirai:service:$serviceId,$content]`            |\n|         [`Dice`]         | `[mirai:dice:$value]`                            |\n|      [`MusicShare`]      | `[mirai:musicshare:$args]`                       |\n|     [`FileMessage`]      | `[mirai:file:$id,$internalId,$name,$size]`       |\n| [`RockPaperScissors`]    | `[mirai:rps:$name]`                              |\n\n### 由 mirai 码字符串取得 `MessageChain` 实例\n\n```kotlin\nval chain = \"[mirai:atall]\".deserializeMiraiCode()\n```\n```java\nMessageChain chain = MiraiCode.deserializeFromMiraiCode(\"[mirai:atall]\");\n```\n\n### 转义字符串\n\n若要执行转义（一般没有必要手动这么做）：\n\n```kotlin\nPlainText(\"[mirai:atall]\").serializeToMiraiCode() // \\[mirai\\:atall\\]\n```\n```java\nMiraiCode.serializeToMiraiCode(new PlainText(\"[mirai:atall]\")) // \\[mirai\\:atall\\]\n```\n\n### `serializeToMiraiCode` 与 `toString` 的区别\n\n\n- 如 [消息元素](#消息元素) 所示, `toString()` 会尽可能包含多的信息用于调试作用，**行为可能不确定**\n- `toString()` 偏人类可读, `serializeToMiraiCode()` 偏机器可读\n- `toString()` **没有转义**, `serializeToMiraiCode()` 有正确转义\n- `serializeToMiraiCode()` 会跳过 `不支持 mirai 码处理` 的元素\n- `toString()` 基本不可用于 `deserializeMiraiCode`/`MiraiCode.deserializeFromMiraiCode`\n\n\n---------\n\n到这里，你已经完成了 Mirai 所有文档的阅读。现在你已经熟悉了 Mirai，并可以开始使用了。\n\n你可以首先构造 Bot，登录，然后从监听事件起开始创建你的机器人，或从 Bot 获取到指定群主动发送消息。在使用中遇到问题可以参考 Mirai 源码内注释，该注释会包含更多实践上的帮助。\n\n如果你仍然对 Mirai 架构有不明确的地方，欢迎在 [#848](https://github.com/mamoe/mirai/discussions/848) 提出建议，或者直接在 PR 提交你的修改。\n\n> 回到 [目录](#目录)\n>\n> [回到 Mirai 文档索引](CoreAPI.md)\n"
  },
  {
    "path": "docs/MigrationFrom1x.md",
    "content": "# Mirai - Migration From 1.x\n\n本文介绍如何从 1.x 升级到 2.x。\n\n根据你的语言选择：[Kotlin](#使用-kotlin) | [Java](#使用-java)\n\n## 使用 Kotlin\n\n### 如何自动完成 Kotlin 的错误替换\n\n仅 IntelliJ IDEA 和 Android Studio 支持这个功能。\n\n把光标放在一个错误中间（或者按 F2 自动跳转到错误），在 Windows 使用 `Alt + Enter` 快捷键，macOS 使用 `Option + Enter`，会得到弹窗如下图。\n\n![YBP47V_Z640J_YU5WZ_JVPW.png](https://i.loli.net/2020/12/18/CiX9qApu5BnVPch.png)\n\n第一项为仅替换这一个错误，第二项为替换项目中的所有这个错误。一般推荐选择第二项并回车即可。\n\n**Mirai 的修改都尽可能地提供了这样的替换，请依次按如下步骤更新以下几个版本，才能使用这些替换。**  \n部分无法提供自动替换的修改会在下文说明。\n\n### `1.x` -> `2.0-M1-1`\n\n替换依赖（可以直接全局搜索替换）:\n- `net.mamoe:mirai-core` -> `net.mamoe:mirai-core-api`\n- `net.mamoe:mirai-core-qqandroid` -> `net.mamoe:mirai-core`\n\n**Kotlin**:\n\n1. 将 `MessageChain[Image]` 等 IDE 会提示错误的调用调整为:\n   - `.findIsInstance<Image>()` （`Image` 不存在时返回 `null`）\n   - `.firstIsInstance<Image>()`  （`Image` 不存在时抛出异常）\n\n   **提示**: 如果你是想获取消息的内容，可以使用 `messageChain.content` 扩展，而不需要使用 `MessageChain[PlainText]`\n\n2. `Bot.getFriend` 等函数以前在找不到好友时会抛出异常，现在它们会返回 `null`。  \n   请替换 `Bot.getFriend` 为 `Bot.getFriendOrFail`。\n\n\n只要能通过编译就可以适配下一个版本。\n\n### `2.0-M1` -> `2.0-M2`\n\n修改都可以自动替换完成。**但请不要跳过 `2.0-M2` 这一步骤。**\n\n### `2.0-M2` -> `2.0-RC`\n\n1. 戳一戳事件由以前的多个事件变为了统一的单个 `NudgeEvent`。若有使用请直接参考 `NudgeEvent` 源码修改。\n\n2. `Listener.ConcurrencyKind` 和 `Listener.EventPriority` 由嵌套类移动到顶层，请执行全局替换：\n   - `Listener.ConcurrencyKind` -> `ConcurrencyKind`\n   - `Listener.EventPriority` -> `EventPriority`\n\n3. `IMirai` 低级 API 函数名现在不再带有 `_lowLevel` 前缀, 直接删除前缀即可。\n\n\n其他修改都可以自动替换完成。\n\n\n### `2.0-RC` -> `2.0.0`\n\n直接把版本号更改为 `2.0.0`。\n\n至此你已经成功升级到了 mirai 2.0。[回到 Mirai 文档索引](README.md#jvm-平台-mirai-开发)\n\n----\n\n## 使用 Java\n\n**请依次按如下步骤更新以下几个版本**\n\n### `1.x` -> `2.0-M1`\n\n- 消息事件包名有调整, 请根据 IDE 提示自动导入引用失效的包.\n- Bot 构造方法调整, 将原 `BotFactoryKt.newBot(...)` 替换为 `BotFactory.INSTANCE.newBot(...)`\n- 如果有调用 `Utils.getDefaultLogger().invoke(...)`，替换为 `MiraiLogger.create(...)`\n- `Bot.getFriend` 等方法以前在找不到好友时会抛出异常，现在它们会返回 `null`。  \n  请替换为 `Bot.getFriendOrFail`。\n\n### `2.0-M1` -> `2.0-M2`\n\n图片和语音上传的 API 有更改。\n\n新增了资源 API，可以统一缓存文件。\n```\nExternalResource.create(file);\nExternalResource.create(inputStream);\n```\n\n上传一个资源为图片或语音：\n```\ncontact.uploadImage(resource);\ncontact.uploadVoice(resource);\n```\n\n或者使用工具方法直接发送一个 `File` 或 `InputStream` 为图片：\n```\nContact.sendImage(contact, inputStream); // 返回 MessageReceipt\nContact.sendImage(contact, file);        // 返回 MessageReceipt\n\nContact.uploadImage(contact, inputStream); // 返回 Image 消息\nContact.uploadImage(contact, file);        // 返回 Image 消息\n```\n\n### `2.0-M2` -> `2.0-RC`\n\n1. 戳一戳事件由以前的多个事件变为了统一的单个 `NudgeEvent`。若有使用请直接参考 `NudgeEvent` 源码修改。\n\n2. `Listener.ConcurrencyKind` 和 `Listener.EventPriority` 由嵌套类移动到顶层，请执行全局替换：\n   - `Listener.ConcurrencyKind` -> `ConcurrencyKind`\n   - `Listener.EventPriority` -> `EventPriority`\n\n3. `IMirai` 低级 API 方法名现在不再带有 `_lowLevel` 前缀, 直接删除前缀即可。\n\n\n### `2.0-RC` -> `2.0.0`\n\n直接把版本号更改为 `2.0.0`。\n\n至此你已经成功升级到了 mirai 2.0。[回到 Mirai 文档索引](README.md#jvm-平台-mirai-开发)\n"
  },
  {
    "path": "docs/Preparations.md",
    "content": "# Mirai - Preparations\n\n本章节介绍 Mirai 的 JVM 环境和开发准备工作。\n\n## JVM 环境要求\n\n- 桌面 JVM：最低 Java 8，但推荐 Java 17（要使用一键启动器，需要 11 及以上）\n- Android：\n    - mirai 2.15.0 起: API 等级 21 （Android 5.0，LOLLIPOP)\n    - mirai 2.15.0 前: API 等级 26 （Android 8.0，O)\n\n目前主要使用的自动启动器，[Mirai Console Loader](https://github.com/iTXTech/mirai-console-loader)\n，（MCL） 默认安装 JRE 17。\n\n**但注意不要使用 Oracle JDK**\n（[原因](https://github.com/mamoe/mirai/discussions/779)），可以使用其他任何 JDK。\n\n> 要下载 JDK：\n> - 手动下载安装如 [AdoptOpenJDK](https://adoptopenjdk.net/)\n> - 自动在 IntelliJ IDEA `Project Structure`(`Ctrl+Shift+Alt+S`) -> `SDKs` -> `+` -> `Download JDK` 下载安装\n\n## 开发的准备工作\n\n### 安装 IDE 插件\n\n[Mirai Console IntelliJ]: /mirai-console/tools/intellij-plugin\n\n[Mirai Console IntelliJ-JB]: https://plugins.jetbrains.com/plugin/15094-mirai-console\n\n[Mirai Console IntelliJ-OK]: https://plugins.jetbrains.com/embeddable/install/15094\n\n<!--[Kotlin Jvm Blocking Bridge]: https://github.com/mamoe/kotlin-jvm-blocking-bridge-->\n<!--[Kotlin Jvm Blocking Bridge-JB]: https://plugins.jetbrains.com/plugin/14816-kotlin-jvm-blocking-bridge-->\n<!--[Kotlin Jvm Blocking Bridge-OK]: https://plugins.jetbrains.com/embeddable/install/14816-->\n\n推荐使用 [IntelliJ IDEA](https://www.jetbrains.com/idea/)\n或 [Android Studio](https://developer.android.com/studio)。Mirai 提供 IDE\n插件来提升开发体验。\n\n|           插件名            |                     描述                     |               一键安装                |          JetBrains 插件仓库          |\n|:------------------------:|:------------------------------------------:|:---------------------------------:|:--------------------------------:|\n| [Mirai Console IntelliJ] | 提供 mirai-core 的错误检查和 mirai-console 的插件开发辅助 | [一键安装][Mirai Console IntelliJ-OK] | [说明页][Mirai Console IntelliJ-JB] |\n\n<!--| [Kotlin Jvm Blocking Bridge] |         帮助 Java 用户调用 Kotlin suspend 函数         | [Kotlin Jvm Blocking Bridge-OK] | [Kotlin Jvm Blocking Bridge-JB] |-->\n\n使用 Kotlin 建议安装 Mirai Console IntelliJ。同时请确保 Kotlin 插件是最新版本（在 `Settings -> Plugins` 启用并更新 Kotlin 到最新）。\n\n### Kotlin\n\n[Kotlin](https://kotl.in) 是让开发人员更快乐的一门现代编程语言，由 [IntelliJ IDEA](https://www.jetbrains.com/idea/) 的开发公司 [JetBrains](https://www.jetbrains.com/) 维护，被 Google 推举为 Android 首选编程语言。\n\n使用 Mirai 是一个不错的学习 Kotlin 机会，使用者有兴趣可以在 [官方中文文档](https://www.kotlincn.net/docs/reference/) 学习 Kotlin。\n\nJava 开发者如果只希望使用 Mirai 而不学习 Kotlin，也请阅读 [Kotlin 定义对应的 Java 定义](KotlinAndJava.md)（5 分钟）。\n\n\n----\n\n> [回到 Mirai 文档索引](README.md#jvm-平台-mirai-开发)\n"
  },
  {
    "path": "docs/Questions.md",
    "content": "# Mirai - Questions\n\n## 用户常见问题\n\n> 'java' 不是内部或外部命令，也不是可运行的程序\n\n没有安装 Java。\n\n> `Failed to fetch announcement for ...`\n\n[MCL](https://github.com/iTXTech/mirai-console-loader) 查询更新信息失败，可以尝试编辑 `config.json`，\n更换 [mirai repo](https://github.com/project-mirai/mirai-repo-mirror#%E4%BB%93%E5%BA%93%E9%95%9C%E5%83%8F)。\n\n> Login failed: Error(bot=..., code=..., title=....\n\n这些是服务器返回的信息，它表示你的账号被登录风控了。  \n风控没有 100% 稳定的解决方法，你可以关注 [论坛公告帖 - 无法登录的临时处理方案](https://mirai.mamoe.net/topic/223)。  \n密码登录中是否出现滑块验证或短信验证都是不可控的，这取决于腾讯的服务器要求你完成什么验证，没有办法自由选择。\n\n> 登录协议如何修改\n\n对于手动密码登录，第三个参数就是协议, 例如 `login 12345 114514 MACOS`  \n\n对于自动密码登录，可以使用指令修改，例如 `autoLogin setConfig 12345 protocol MACOS`，  \n也可以在 Mirai Console 关闭的情况下, 编辑 `config/Console/AutoLogin.yml` 文件。\n\n注意，文件中有一个账号为 `12345` 的示例，请注意确认修改的配置对应的账号，不要修改错了示例。\n\n> 聊天框无法使用指令(使用指令后没效果)\n\n1. 确认机器人收到消息  \n   日志里会有消息记录，没有就是没收到，如果是群聊消息，注意是否已 `收入群助手`，这可能会导致收不到消息\n\n2. 确认是否已经安装 [chat-command](https://github.com/project-mirai/chat-command/releases/latest)  \n   如果插件的指令是对接的 `Mirai Console` 的指令接口，那它就需要 `chat-command`\n\n3. 确认是否已经授权给目标用户  \n   默认情况下所有用户都是没有权限的，聊天框下无法使用指令  \n   备注：如果使用了 LuckPerms-Mirai，可通过在控制台执行 /lp verbose on 查看权限检测情况\n\n4. 确认日志中没有相关报错  \n   如果插件指令执行出错，也有可能无法提供回复，请联系插件作者\n\n> 如何确认 `Mirai 版本` 或 `插件版本` 等信息\n\n可以启动 Mirai Console 的情况下:  \n使用指令 `/status` 。\n\n无法启动的情况下:  \nMirai Console 的组件在 `libs` 文件夹下, 文件名包含 `版本信息`。  \n\n> 找不到 `http api` 的相关配置文件\n\n可能需要安装插件 <https://github.com/project-mirai/mirai-api-http>。\n\n> 如何添加 jvm 参数，例如 `-Dmirai.no-desktop=true`\n\n编辑启动脚本 `mcl.cmd`，在 `-jar` 前面加上 `-D...`，例如 `-Dmirai.no-desktop=true -jar mcl...`。\n\nLinux 和 macOS 的启动脚本是 `mcl` (没有后缀的那个文件)。\n\n> MCL 不能更新到最新版 Mirai\n\n编辑 `config.json`  \n修改 `maven_repo` 为 `https://repo.huaweicloud.com/repository/maven` (默认是阿里云，更新很不及时)  \n将 `packages` 中 `net.mamoe:` 开头的项的 `channel` 改为 `maven` (最新版) 或 `maven-stable` (最新稳定版)  \n\n## 开发者常见问题\n\n> 如何自定义登录验证处理\n\n扫码登陆，滑块处理等  \n\n[覆盖登录解决器](Bots.md#覆盖登录解决器)\n\n> IDEA 下 `import` 爆红，mirai 相关依赖全部无法解析\n\nIDEA 版本过于老旧，无法分析新版本的 Kotlin 依赖，请尝试升级 IDEA 后重试。\n\n> 有些事件收到不到\n\n`SignEvent` 或者 `NudgeEvent`：\n\n总的来说 `MACOS` 和 `ANDROID_WATCH` 相对其他协议会缺少一些事件的接收。  \n对于这些协议来说是不会收到的，因为这在他们对应官方客户端版本里本来就没有这些功能。\n\n`GroupMessageEvent`：\n\n群事件收不到可能是因为你将群设置为 `屏蔽群` 或者 `收入了群助手`。  \n另外如果消息是 `转发消息` 或 `卡片消息` 等特殊消息, 也有可能因为风控无法接收和发出。\n\n> 发送语音之后播放没有声音\n\n你可能需要安装插件或引入依赖 <https://github.com/project-mirai/mirai-silk-converter>。\n\n> Mirai Console 插件找不到类\n\n1. 使用了私有的第三方库  \n   你需要使用 `shadowLink` \n   参照 [打包依赖](../mirai-console/tools/gradle-plugin/README.md#打包依赖)\n\n2. 使用 数据库框架/反射框架 但找不到 驱动类/实体类  \n   你需要将**上下文**切换到插件中，或者指定 `ClassLoader`，  \n   相关内容请参考 [JVM Plugins - Debug](../mirai-console/docs/plugin/JVMPlugin-Debug.md)  \n   下面只列出部分例子，请根据你所使用的框架的文档进行修整。  \n   切换上下文：  \n   ```java\n   import java.util.ServiceLoader;\n   \n   public class SQL {\n       void load() {\n           Thread current = Thread.currentThread();\n           ClassLoader context = current.getContextClassLoader();\n           ClassLoader plugin = this.getClass().getClassLoader();\n           try {\n               current.setContextClassLoader(plugin);\n               ServiceLoader.load(java.sql.Driver.class).reload();\n   \n               // database load ...\n   \n           } finally {\n               current.setContextClassLoader(context);\n           }\n       }\n   }\n   ```\n   指定 `ClassLoader`  \n   ```java\n   import jakarta.persistence.Embeddable;\n   import jakarta.persistence.Entity;\n   import jakarta.persistence.MappedSuperclass;\n   import org.reflections.Reflections;\n   import org.reflections.util.ConfigurationBuilder;\n\n   import java.util.Set;\n   \n   public class SQL {\n       Set<Class<?>> load() {\n           ClassLoader plugin = this.getClass().getClassLoader();\n           ConfigurationBuilder builder = new ConfigurationBuilder()\n                   .forPackage(\"org.example\", plugin)\n                   .addClassLoaders(plugin); // 指定从插件的类加载器中检索类\n           Reflections reflections = new Reflections(builder);\n           Set<Class<?>> query = org.reflections.scanners.Scanners.TypesAnnotated\n                   .of(Entity.class, Embeddable.class, MappedSuperclass.class)\n                   .asClass(plugin) // 指定从插件的类加载器中提取类\n                   .apply(reflections.getStore());\n           return query;\n       }\n   }\n   ```"
  },
  {
    "path": "docs/README.md",
    "content": "# Mirai\n\n欢迎来到 mirai 开发文档。\n\n本文面向要进行开发的用户。对于只使用现成插件的用户，请阅读 [用户手册](UserManual.md)。\n\n[Mirai 生态概览](mirai-ecology.md)\n\n[Mirai VuePress 文档](https://docs.mirai.mamoe.net/)\n\n## 社区 SDK\n\n**mirai 官方提供 [Kotlin/Java 等 JVM 平台语言开发支持](#使用-mirai)\n。如果不熟悉这些语言，请使用以下社区 SDK：**\n\n要使用这些社区 SDK 需要先配置 Mirai\nConsole，可以使用 [一键安装](https://mirai.mamoe.net/assets/uploads/files/1618372079496-install-20210412.cmd)\n（32位，带\nHTTP 插件），也可以阅读 [用户手册](UserManual.md) 进行个性化安装。\n\n你可以使用一个或多个语言来开发插件，而且在自己开发的同时也可以[使用下载的插件](UserManual.md#下载和安装插件)。\n\n[`mirai-console`]: ../mirai-console\n\n[mamoe/mirai-api-http]: https://github.com/mamoe/mirai-api-http\n\n[iTXTech/mirai-native]: https://github.com/iTXTech/mirai-native\n\n[iTXTech/mirai-js]: https://github.com/iTXTech/mirai-js\n\n[iTXTech/mirai-kts]: https://github.com/iTXTech/mirai-kts\n\n[AliceBot]: https://github.com/AliceBotProject/alicebot\n\n[GraiaProject/Ariadne]: https://github.com/GraiaProject/Ariadne\n\n[GraiaProject/Avilla]: https://github.com/GraiaProject/Avilla\n\n[Elaina]: https://github.com/wyapx/Elaina\n\n[ArcletProject/Edoves]: https://github.com/ArcletProject/Edoves\n\n[NoneBot]: https://github.com/nonebot/nonebot2\n\n[RedBeanN/node-mirai]: https://github.com/RedBeanN/node-mirai\n\n[Logiase/gomirai]: https://github.com/Logiase/gomirai\n\n[cyanray/mirai-cpp]: https://github.com/cyanray/mirai-cpp\n\n[Chlorie/miraipp]: https://github.com/Chlorie/miraipp-template\n\n[Numendacil/cpp-mirai-client]: https://github.com/Numendacil/cpp-mirai-client\n\n[Executor-Cheng/mirai-CSharp]: https://github.com/Executor-Cheng/mirai-CSharp\n\n[HoshinoTented/mirai-rs]: https://github.com/HoshinoTented/mirai-rs\n\n[YunYouJun/mirai-ts]: https://github.com/YunYouJun/mirai-ts\n\n[nepsyn/miraipie]: https://github.com/nepsyn/miraipie\n\n[only52607/e-mirai]: https://github.com/only52607/e-mirai\n\n[theGravityLab/ProjHyperai]: https://github.com/theGravityLab/ProjHyperai\n\n[yyuueexxiinngg/onebot-kotlin]: https://github.com/yyuueexxiinngg/onebot-kotlin\n\n[Nambers/MiraiCP]:https://github.com/Nambers/MiraiCP\n\n[drinkal/Mirai-js]:https://github.com/drinkal/Mirai-js\n\n[Coloryr/ColorMirai]: https://github.com/Coloryr/ColorMirai\n\n[AHpxChina/Mirai.Net]: https://github.com/AHpxChina/Mirai.Net\n\n[Cyl18/Chaldene]: https://github.com/Cyl18/Chaldene\n\n[Miyakowww/CocoaFramework2]: https://github.com/Miyakowww/CocoaFramework2\n\n[Shimogawa/rubirai]: https://github.com/Shimogawa/rubirai\n\n[Excaive/miraicle]: https://github.com/Excaive/miraicle\n\n[nkxingxh/miraiez]: https://github.com/nkxingxh/miraiez\n\n[Xwdit/RainyBot-Core]: https://github.com/Xwdit/RainyBot-Core\n\n[OneBot]: https://github.com/howmanybots/onebot\n\n[Mirai HTTP]: https://github.com/project-mirai/mirai-api-http\n\n[jerrita/saaya]: https://github.com/jerrita/saaya\n\n[YiriMirai]: https://github.com/YiriMiraiProject/YiriMirai\n\n[MiraiBots.jl]: https://github.com/melonedo/MiraiBots.jl\n\n[Novices666/mirai-epl]:https://github.com/Novices666/mirai-epl\n\n[easyMirai]:https://github.com/easyMirais/easyMirai\n\n[MR-XieXuan/MiraiTravel]:https://github.com/MR-XieXuan/MiraiTravel\n\n[yuansicloud/Abp.Mirai]:https://github.com/yuansicloud/Abp.Mirai\n### 原生接口\n\n这些接口直接在 JVM 上实现，不需要中间件，拥有更佳的性能。\n\n| 技术                 | 维护者及项目地址               |\n|:-------------------|:-----------------------|\n| `Kotlin Scripting` | [iTXTech/mirai-kts]    |\n| `C++`              | [Nambers/MiraiCP]      |\n| `JavaScript`       | [iTXTech/mirai-js]     |\n| *酷 Q DLL 插件*       | [iTXTech/mirai-native] |\n\n### HTTP 接口\n\n目前有两个 HTTP 协议插件。使用 HTTP 协议插件可以支持更多编程语言和技术。\n\n- [***Mirai HTTP***][Mirai HTTP] 由 Mirai 开发团队提供第一级支持，目前多数 SDK 都基于它；\n- [OneBot] 标准则兼容酷Q协议，可以让基于酷Q HTTP 插件的项目在 Mirai 平台运行。\n\n| 名称               | 实现          | 维护者及项目地址                       |\n|:-----------------|:------------|:-------------------------------|\n| ***Mirai Http*** | Mirai 标准    | [mamoe/mirai-api-http]         |\n| *OneBot Http*    | [OneBot] 标准 | [yyuueexxiinngg/onebot-kotlin] |\n\n下表列举基于 Mirai HTTP\n插件实现对一些编程语言支持的项目列表。要使用它们，你需要[在 Mirai Console 安装 `mirai-api-http`](https://github.com/project-mirai/mirai-api-http#%E5%AE%89%E8%A3%85mirai-api-http)（如果使用上面的一键安装则不需要额外操作）。\n\n| 语言和技术                     | 维护者及项目地址                             |\n|:--------------------------|:-------------------------------------|\n| `C#`                      | [Executor-Cheng/mirai-CSharp]        |\n| `C#`                      | [Hyperai][theGravityLab/ProjHyperai] |\n| `C#`                      | [Coloryr/ColorMirai]                 |\n| `C#`                      | [AhpxChina/Mirai.Net]                |\n| `C#`                      | [Cyl18/Chaldene]                     |\n| `C#`                      | [Miyakowww/CocoaFramework2]          |\n| `C#`                      | [yuansicloud/Abp.Mirai]              |\n| `C++`                     | [cyanray/mirai-cpp]                  |\n| `C++`                     | [Chlorie/miraipp]                    |\n| `C++`                     | [Numendacil/cpp-mirai-client]        |\n| `GDScript`                | [Xwdit/RainyBot-Core]                |\n| `Go`                      | [Logiase/gomirai]                    |\n| `JavaScript` / Node.js    | [RedBeanN/node-mirai]                |\n| `JavaScript` / Node.js    | [drinkal/Mirai-js]                   |\n| `JavaScript` / TypeScript | [YunYouJun/mirai-ts]                 |\n| `JavaScript` / TypeScript | [nepsyn/miraipie]                    |\n| `Julia`                   | [MiraiBots.jl]                       |\n| `PHP`                     | [MiraiEz][nkxingxh/MiraiEz]          |\n| `PHP`                     | [MR-XieXuan/MiraiTravel]             |\n| `Python`                  | [AliceBot]                           |\n| `Python`                  | [Ariadne][GraiaProject/Ariadne]      |\n| `Python`                  | [Avilla][GraiaProject/Avilla]        |\n| `Python`                  | [easyMirai]                          |\n| `Python`                  | [Edoves][ArcletProject/Edoves]       |\n| `Python`                  | [Elaina]                             |\n| `Python`                  | [NoneBot]                            |\n| `Python`                  | [jerrita/saaya]                      |\n| `Python`                  | [YiriMirai]                          |\n| `Python`                  | [Excaive/miraicle]                   |\n| `Ruby`                    | [Shimogawa/rubirai]                  |\n| `Rust`                    | [HoshinoTented/mirai-rs]             |\n| `易语言`                     | [only52607/e-mirai]                  |\n| `易语言`                     | [Novices666/mirai-epl]                  |\n> 按字母顺序排序，排序不代表排名  \n> *\n想在这里添加你的项目？欢迎[提交 PR](https://github.com/mamoe/mirai/edit/dev/docs/README.md)\n。*\n\n特别地，有一些 SDK 直接基于 mirai-core 开发，不需要 [`mirai-console`]：\n\n- `Lua`: [lua-mirai](https://github.com/only52607/lua-mirai)\n\n## 使用 Mirai\n\nMirai 原生支持 Java、Kotlin 等 JVM 平台编程语言。\n\n要使用 Mirai，可以使用 mirai-core 作为一个依赖库获得机器人功能，也可以为 mirai-console 开发插件。\n\n生态详情可阅读：[Mirai 生态概览](mirai-ecology.md)。\n\n### JVM 平台 mirai-core 开发\n\n本节介绍使用 Java、Kotlin 等 JVM 平台编程语言使用 mirai-core 作为一个依赖库获得机器人功能。\n这通常适用于你在开发一个其他应用程序而需要使用机器人功能的情况。\n\n1. [JVM 环境和开发准备工作](Preparations.md#mirai---preparations)\n2. [配置 mirai-core 项目依赖](ConfiguringProjects.md)\n3. [阅读 mirai-core 文档](CoreAPI.md)\n\n> 如果你希望先体验 mirai\n> 的机器人功能，可克隆 [mirai-hello-world](https://github.com/project-mirai/mirai-hello-world)\n> 并在 IDE 内运行其中 Kotlin 或 Java 入口点 `main`。\n\n### JVM 平台 mirai-console 插件开发\n\n本节介绍使用 Java、Kotlin 等 JVM 平台编程语言基于 mirai-core，开发可于 mirai-console\n加载的插件来提供机器人功能。\n这通常适用于你为了开发一个机器人程序的情况。开发 mirai-console\n插件既可以[单独使用](../mirai-console/docs/Run.md)，也可以使用来自社区的其他插件。\n\n1. [JVM 环境和开发准备工作](Preparations.md#mirai---preparations)\n\n2. [配置 mirai-console 插件项目](../mirai-console/docs/ConfiguringProjects.md)\n\n3. [阅读 mirai-core 文档](CoreAPI.md)  \n   mirai-core 文档可让你了解如何使用 Bot 功能。\n\n4. [阅读 mirai-console 文档](../mirai-console/docs/README.md)\n   mirai-console 文档可让你了解 mirai-console 的一些系统。\n\n### 多平台 mirai-core 开发\n\n[Kotlin 多平台]: https://kotlinlang.org/docs/multiplatform.html\n\n本节介绍使用 Kotlin 使用 mirai-core 开发 [Kotlin 多平台] 应用程序。\n\n1. [JVM 环境和开发准备工作](Preparations.md#mirai---preparations)\n2. [配置 mirai-core 多平台项目依赖](ConfiguringMultiplatformProjects.md)\n3. [阅读 mirai-core 文档](CoreAPI.md)\n\n## 发布项目\n\n欢迎各类基于 mirai 开发的开源项目在论坛发布。\n\n- [在论坛发布](https://mirai.mamoe.net/category/6/%E9%A1%B9%E7%9B%AE%E5%8F%91%E5%B8%83)\n\n## 文档\n\nmirai 在 GitHub 托管的文档可让你简要了解各个系统。\n\nmirai 的源码内注释十分详细，包含各种实践示例。\n\n### mirai-core 文档\n\n请在 [CoreAPI.md](CoreAPI.md) 阅读 JVM 平台的 mirai-core 开发文档。\n\n### mirai-core API KDoc\n\n可在 <https://kdoc.mirai.mamoe.net/> 查看基于源码内注释生成的 KDoc（类似 JavaDoc）。\n但更建议使用 IntelliJ IDEA 等 IDE 在开发时查询源码内注释。\n\n### mirai-console 文档\n\n请在 [mirai-console/docs](../mirai-console/docs/README.md) 阅读\nmirai-console 开发文档。\n"
  },
  {
    "path": "docs/UserManual.md",
    "content": "# Mirai - UserManual\n\n这里是 Mirai 用户手册。本文面向对开发并不熟悉，但希望使用 Mirai 提供的 QQ 机器人服务支持的用户。\n如果你要开发 Mirai 插件或参与贡献 Mirai 项目，请先阅读 [开发文档](README.md)。  \n\n## 启动 Mirai\n\n想要部署并使用 Mirai QQ机器人框架，只需要启动 Mirai 控制台（即 Mirai Console），\n它自带一些基础功能，也可以加载社区提供的插件。\n\nMirai 控制台现在有两个版本，Mirai 插件在这两个版本的 Mirai Console 上都可以运行:\n\n[MCLI-1.png]: .UserManual_images/MCLI-1.png\n\n[MCPS-1.png]: .UserManual_images/MCPS-1.png\n\n| 类型   | 长啥样?         | 好用吗?      | 怎么装?                  |\n|:-----|:-------------|:----------|:----------------------|\n| 纯控制台 | [MCLI-1.png] | 稳定，也适合服务器 | [使用纯控制台版本](#使用纯控制台版本) |\n| 图形界面 | [MCPS-1.png] | 测试版，不推荐使用 | [使用图形界面版本](#使用图形界面版本) |\n\n## 使用纯控制台版本\n\n详细教程请查看 [ConsoleTerminal.md](ConsoleTerminal.md)。\n\n以 Windows 系统为例，以下为简要安装步骤：  \n\n1. 前往 [iTXTech/mcl-installer](https://github.com/iTXTech/mcl-installer/releases) 下载适合您系统的最新版本的 MCL 安装器\n2. 创建好文件夹之后，将 MCL 安装器移动到其中\n3. 双击 `mcl-installer.exe` 过程中只需要按几次回车键，即可安装完毕\n4. 运行 `mcl.cmd` 即可启动 MCL 控制台\n\n安装插件只需要将下载好的插件置于 plugins 目录，然后重启 MCL 控制台即可。  \n\n## ~~使用图形界面版本~~\n\n开发者已停止更新，且有许多历史问题，故不推荐使用  \n前往 [sonder-joker/mirai-compose](https://github.com/sonder-joker/mirai-compose/releases)\n下载适合你的系统的压缩包，\n>  MAC 系统下载 .dmg 后缀的文件  \n>  Windows 系统下载 .msi 后缀的文件  \n>  Linux 系统下载 .deb 后缀的文件\n\n以 Windows 系统为例，以下为简要安装步骤：\n\n1. 下载 `mirai-compose-<版本>.msi`\n2. 双击运行安装程序，选择一个合适的文件夹，然后点击安装\n3. 安装完毕后打开刚才指定的文件夹\n4. 双击启动其中的 `mirai-compose.exe` 即可开始运行\n5. 运行后点击左上角可以添加 QQ bot 账号\n\n安装插件只需要将下载好的插件置于 plugins 目录，安装完毕后重启 mirai-compose 以生效。\n\n## 解决问题\n\n请先阅读 [常见问题](Questions.md)  。\n\n如果遇到使用问题或想提建议，可以在 [issues](https://github.com/mamoe/mirai/issues)\n发表。也可以在[论坛](https://mirai.mamoe.net/)交流想法。\n\n"
  },
  {
    "path": "docs/UsingSnapshots.md",
    "content": "# Mirai - Using Snapshots\n\n每个 commit 在构建成功后都会发布一个开发测试版本到 mirai 仓库。如有需要，可添加仓库并使用。开发测试版本非常不稳定，仅用于测试某 commit 对一个问题的修复情况，而不建议在生产或开发环境使用。\n\n每个开发测试版本只保留一个月。\n\n- [在 Maven 使用](#在-maven-使用)\n- [在 Gradle 使用](#在-gradle-使用)\n\n## 在 Maven 使用\n\n### 1. 添加 Maven 仓库\n\n```xml\n\n<repositories>\n    <repository>\n        <id>miraisnapshots</id>\n        <name>mirai snapshots</name>\n        <url>https://repo.mirai.mamoe.net/snapshots</url>\n    </repository>\n</repositories>\n```\n\n### 2. 修改依赖版本\n\n1. 选择需要测试的 commit, 在 GitHub 查看其构建状态, 如图所示:  \n   ![](images/snapshots-find-actions.png)\n2. 点击 \"Build / JVM\" 右侧的 \"Details\":  \n   ![](images/snapshots-build-jvm.png)\n3. 在打开的页面中点击 \"Summary\", 然后在 \"Annotations\" 栏目中找到类似 \"本 commit 的预览版本号: 2.15.0-build-index-1\" 的提示, 得到开发测试版本号 `2.15.0-build-index-1`. 其中, `build-index` 为此 commit 所属分支名, `2.15.0` 意为当前分支的主版本号, `1` 为此分支下的第 1 次成功构建.\n   通常在 `dev` 分支构建的预览版本号类似为 `2.15.0-dev-102`\n\n```xml\n\n<dependencies>\n    <dependency>\n        <groupId>net.mamoe</groupId>\n        <artifactId>mirai-core-jvm</artifactId>\n        <version>2.15.0-build-index-1</version>\n    </dependency>\n</dependencies>\n```\n\n## 在 Gradle 使用\n\n### 1. 添加 Maven 仓库\n\nbuild.gradle(.kts)\n\n```\nrepositories {\n   maven(\"https://repo.mirai.mamoe.net/snapshots\") \n}\n```\n\n### 2. 修改依赖版本\n\n1. 选择需要测试的 commit, 在 GitHub 查看其构建状态, 如图所示:  \n   ![](images/snapshots-find-actions.png)\n2. 点击 \"Build / JVM\" 右侧的 \"Details\":  \n   ![](images/snapshots-build-jvm.png)\n3. 在打开的页面中点击 \"Summary\", 然后在 \"Annotations\" 栏目中找到类似 \"本 commit 的预览版本号: 2.15.0-build-index-1\" 的提示, 得到开发测试版本号 `2.15.0-build-index-1`. 其中, `build-index` 为此 commit 所属分支名, `2.15.0` 意为当前分支的主版本号, `1` 为此分支下的第 1 次成功构建.\n   通常在 `dev` 分支构建的预览版本号类似为 `2.15.0-dev-102`\n\nbuild.gradle(.kts)\n\n```\ndependencies {\n    implementation(\"net.mamoe:mirai-core:2.15.0-build-index-1\")\n}\n```\n\n## 使用测试版本 Mirai Console Gradle 插件\n\nsettings.gradle(.kts)\n\n```\npluginManagement {\n    repositories {\n        gradlePluginPortal()\n        maven(\"https://repo.mirai.mamoe.net/snapshots\")\n    }\n}\n```\n\nplugin.gradle(.kts)\n\n```\nplugins {\n    // ...\n    id(\"net.mamoe.mirai-console\") version \"2.15.0-build-index-1\"\n}\n```\n\n## 附录\n\n### 获取 dev 分支的最新版本号\n\n1. 访问 Mirai Build Index API: <https://build.mirai.mamoe.net/v1/mirai-core/dev/indexes/latest> 获取 \"value\" 的值, 例如 `127`\n2. 访问 <https://github.com/mamoe/mirai/blob/dev/buildSrc/src/main/kotlin/Versions.kt> 获取由 `/*PROJECT_VERSION_START*/` 和 `/*PROJECT_VERSION_END*/` 包围的主分支版本号, 例如 `2.16.0`\n3. 组合得到版本号 `2.16.0-dev-127`"
  },
  {
    "path": "docs/contributing/ImplementingProtocol.md",
    "content": "# 实现协议\n\n本文将说明实现一些协议的通常步骤，并以示例逐步演示。本文还将介绍 mirai 的消息处理流程。\n\n通常请于 `commonMain` 编写代码。`commonMain` 的 Kotlin\n代码将可以用于全平台，即同时（自动）支持 JVM 和 Native 目标。\n\n## 添加一个消息类型\n\n### 1. 抽象接口\n\n在 `mirai-core-api` 的 `message.data` 中添加新类型接口（消息元素），如 `Audio`\n，`FileMessage`。\n\n在设计消息元素时应使其继承 `MessageMetadata`（元数据） 或 `MessageContent`\n（内容）。若该消息在官方客户端中只能单独出现，那么还应该让它继承 `ConstrainSingle` 来维持这一性质。\n\n消息元素应是不可变的，即不允许出现 `var` 或可变类型。\n\n作为示例，假设现在要支持视频消息，在 `mirai-core-api` 定义接口 `Video`：\n\n```kotlin\npublic interface Video : MessageContent, ConstrainSingle {\n    override val key: Key get() = Key\n\n    public companion object Key :\n        AbstractPolymorphicMessageKey<MessageContent, Video>(\n            MessageContent,\n            { it.safeCast() })\n\n    /**\n     * 文件名\n     */\n    val filename: String\n\n    /**\n     * 长度, 单位为秒.\n     */\n    val length: Long\n}\n```\n\n由于视频不可与文字等其他消息内容元素同时出现，`Video` 需要实现 `ConstrainSingle`\n，并提供 `companion object Key`。\n\n为了实现最好的协议支持，我们将 `Video` 分为 `OnlineVideo` 和 `OfflineVideo`。`OnlineVideo`\n表示从服务器接收的，而 `OfflineVideo` 本地构造的。之后在实现时 `OnlineVideo`\n可以存储来自服务器的原数据，以实现快速转发等优化。\n\n```kotlin\npublic sealed interface Video : MessageContent, ConstrainSingle {\n    override val key: Key get() = Key\n\n    public companion object Key :\n        AbstractPolymorphicMessageKey<MessageContent, Video>(\n            MessageContent,\n            { it.safeCast() })\n\n    /**\n     * 文件名\n     */\n    val filename: String\n\n    /**\n     * 长度, 单位为秒.\n     */\n    val length: Long\n}\n\n@NotStableForInheritance // 表示此 API 不可由用户自行实现\npublic interface OnlineVideo : Video {\n    override val key: Key get() = Key\n\n    /**\n     * 获取下载链接 URL\n     */\n    val urlForDownload: String\n\n    // 需要覆盖 Key\n    public companion object Key :\n        AbstractPolymorphicMessageKey<Video, OnlineVideo>(\n            Video, { it.safeCast() }\n        ) {\n        // SERIAL_NAME为之后支持序列化做准备\n        public const val SERIAL_NAME: String = \"OnlineVideo\"\n    }\n}\n\n@NotStableForInheritance // 表示此 API 不可由用户自行实现\npublic interface OfflineVideo : Video {\n    override val key: Key get() = Key\n\n    // 需要覆盖 Key\n    public companion object Key :\n        AbstractPolymorphicMessageKey<Video, OfflineVideo>(\n            Video, { it.safeCast() }\n        ) {\n        // SERIAL_NAME为之后支持序列化做准备\n        public const val SERIAL_NAME: String = \"OfflineVideo\"\n    }\n}\n```\n\n这样设计接口的好处包括未来很容易修改。例如 mirai 2.0 设计的 `Image`\n接口一直维护到现在（2.13）也没有遇到问题，其内部结构也变更了多次，但用户的使用方法没有改变。\n\n### 2. 提供工厂或构建器\n\n考虑添加相应的 `Factory`（抽象工厂）或 `Builder`（生成器）来提供构造消息实例的方式，而避免直接提供构造器。\n直接提供公开构造器是一种沉重的承诺，将增加维护难度（现在已有的部分公开构造器是历史遗留）。\n\n在 `Video` 示例中，由于 `OnlineVideo` 是来自服务器的，我们无序提供构造方式。可为 `OfflineVideo`\n增加构建工厂：\n\n```kotlin\n// ...\npublic interface OfflineVideo : Video {\n    // ...\n\n    public interface Factory {\n        /** 构建一个 [OfflineVideo] 实例 */\n        public fun create(filename: String, length: Long): OfflineVideo\n\n        companion object INSTANCE : Factory by loadService()\n        // `loadService` 是 mirai 实现的全平台服务加载方式，类似于 JDK `ServiceLoader`。\n    }\n}\n```\n\n用户在 Kotlin 可通过 `OfflineVideo.Factory.create(filename, length)`，或在 Java\n通过 `OfflineVideo.Factory.INSTANCE.create(filename, length)`\n取得 `OfflineVideo` 实例。\n\n注意，示例中 `OnlineVideo` 用的属性并不多（只有两个），使用工厂会比使用生成器（`Builder`）方便。但对于 `Image`\n等拥有众多属性的类型，建议提供 `Builder`。一种实现方式可参见 `Image.Builder`。\n\n### 3. 实现接口\n\n接口和工厂准备就绪，现在在 `mirai-core` 的 `net.mamoe.mirai.internal.message.data.`\n包下实现接口。\n\n请一般使用 `...Impl`\n的命名方式，并为抽象类（`abstract class`）增加 `Abstract` 前缀。\n如本示例中我们将实现：\n\n- `abstract class AbstractVideo : Video` — 实现基本的 `Video` 类\n- `class OnlineVideoImpl : OnlineVideo` — 实现 `OnlineVideo` 的特殊内容\n- `class OfflineVideoImpl : OfflineVideo` — 实现 `OfflineVideo` 的特殊内容\n\n```kotlin\ninternal sealed class AbstractVideo(\n    override val filename: String,\n    override val length: Long,\n) : Video {\n    private val toStringTemp by lazy { \"[mirai:video:$filename, length=$length]\" } // 这不是标准 mirai code，只是为了提供易读的表示方式\n    override fun toString(): String = toStringTemp\n\n    override fun contentToString(): String = \"[视频]\"\n\n    override fun equals(other: Any?): Boolean {\n        if (other == null) return false\n        // isSameType 是适用于全平台的类型判断方式\n        if (!isSameType(this, other)) return false\n        if (this.filename != other.filename) return false\n        if (this.length != other.length) return false\n        return true\n    }\n\n    override fun hashCode(): Int {\n        var result = filename.hashCode()\n        result = 31 * result + length.hashCode()\n        return result\n    }\n\n    abstract fun toVideoFile(): ImMsgBody.VideoFile\n}\n\ninternal class OnlineVideoImpl(\n    override val filename: String,\n    override val length: Long,\n    private val original: ImMsgBody.VideoFile? // 协议数据结构\n) : OnlineVideo, AbstractVideo() {\n    override fun toVideoFile(): ImMsgBody.VideoFile = original\n}\n\ninternal class OfflineVideoImpl(\n    override val filename: String,\n    override val length: Long,\n) : OfflineVideo, AbstractVideo() {\n    override fun toVideoFile(): ImMsgBody.VideoFile = /* ... */\n}\n```\n\n### 4. 实现工厂\n\n因为 mirai 在 JVM 使用 `ServiceLoader`，需要定义工厂实现类为 `class` 而不是 `object`。\n\n对于 `Video` 示例：\n\n```kotlin\ninternal class OfflineVideoFactoryImpl : OfflineVideo.Factory {\n    override fun create(filename: String, length: Long): OfflineVideo =\n        OfflineVideoImpl(filename, length)\n}\n```\n\n实现后需要同时为 JVM 和 Native 注册工厂：\n\n- JVM：在 jvmBaseMain/resources/META-INF/services/\n  新建一个文件名为 `net.mamoe.mirai.message.data.OfflineVideo$Factory`\n  ，文件内容为 `net.mamoe.mirai.internal.message.data.OfflineVideoFactoryImpl`\n  ；\n- Native：\n  在 `net.mamoe.mirai.internal.utils.MiraiCoreServices.registerAll`\n  末尾增加。如对于 `Video` 示例：\n\n  ```kotlin\n  Services.register(\n      \"net.mamoe.mirai.message.data.OfflineVideo.Factory\",\n      \"net.mamoe.mirai.internal.message.data.OfflineVideoFactoryImpl\"\n  ) { net.mamoe.mirai.internal.message.data.OfflineVideoFactoryImpl() }\n  ```\n\n### 5. 测试接口和实现\n\n请在 `commonTest/kotlin/message/data` 添加新增消息类型的测试。\n需要测试的内容可能包含：\n\n- `equals`、`hashCode`\n- `toString`、`contentToString`\n- 检验参数有效性\n\n语音消息的测试 `net.mamoe.mirai.internal.message.data.AudioTest` 可供参考。\n\n### 6. 实现收发协议\n\n#### 多流水线系统\n\nmirai 的多套系统都使用了\"流水线\"（pipeline）设计模式。\n\n服务器消息实际上是数种通知中的一种（mirai 称之为 `notice`）。\n加密的通知经过*网络层*解密处理后成为二进制数据包 `IncomingPacket`，网络层会分类该 `IncomingPacket`给合适的*\n数据包工厂*（`PacketFactory`）处理。\n数据包工厂会解析二进制数据包，产生结构数据类型。\n结构数据类型将被发送至*通知流水线*（`NoticeProcessorPipeline`），经由负责的*流水线处理员*\n（`NoticeProcessor`）处理后最终成为一个 mirai\n事件。而负责处理消息事件的处理员会将消息原数据发送至消息流水线处理得到 `MessageChain`。\n\n#### 群消息处理流程\n\n一条群消息的完整处理流程如下图所示：\n\n[![](https://mermaid.ink/img/pako:eNpVkctKw0AUQH9lmFWEth8QqNCmqbgoFnSZzZjcJoPJTEkmgjQFK_hYaNGFIiK6kOLOVvABivg1mehfOElTxdUdzj1zuY8BtrkDWMduSPoe2mhZDKGGlk4P5MWhPJ_Jk4f0eH8pp03NwqvM5gFlbpfYWyA0eTn-r-HCNJTZidw15lMG3Tjyat3NPCimMS6oDQuzpcyVkMf9DkQRccHcBibKnDmvYvAgqKlY0nZO57LhEcpK3EDV6nKSfZxl79fp497X_Z0aIUHNovEi99tl-jpJx7khb04TZBQNF8b37lV2O5HPIzl7yt4-E7NeV99ejuRo-gfbykRqS7iCAwgDQh21vEFexMLCgwAsrKunAz0S-2oUiw2VGvcdIsB0qOAh1nvEj6CCSSz4-g6zsS7CGBZSixJ1i6C0hj_Pm6rs)](https://mermaid-js.github.io/mermaid-live-editor/edit#pako:eNpVkctKw0AUQH9lmFWEth8QqNCmqbgoFnSZzZjcJoPJTEkmgjQFK_hYaNGFIiK6kOLOVvABivg1mehfOElTxdUdzj1zuY8BtrkDWMduSPoe2mhZDKGGlk4P5MWhPJ_Jk4f0eH8pp03NwqvM5gFlbpfYWyA0eTn-r-HCNJTZidw15lMG3Tjyat3NPCimMS6oDQuzpcyVkMf9DkQRccHcBibKnDmvYvAgqKlY0nZO57LhEcpK3EDV6nKSfZxl79fp497X_Z0aIUHNovEi99tl-jpJx7khb04TZBQNF8b37lV2O5HPIzl7yt4-E7NeV99ejuRo-gfbykRqS7iCAwgDQh21vEFexMLCgwAsrKunAz0S-2oUiw2VGvcdIsB0qOAh1nvEj6CCSSz4-g6zsS7CGBZSixJ1i6C0hj_Pm6rs)\n\n#### 消息流水线\n\n**要增加新的消息类型支持，我们需要扩展 *消息流水线*（`MessagePipeline`）**。\n\n事实上为了支持复杂的富文本消息以及多样的消息类型，消息流水线也分有多个子部门。\n\n- `MessageEncoderPipeline`：包含一系列消息编码器（`MessageEncoder`），将 mirai-core-api\n  的结构编码为协议数据；\n- `MessageDecoderPipeline`：包含一系列消息解码器（`MessageDecoder`），将协议数据解码为\n  mirai-core-api 的结构；\n- `OutgoingMessagePipeline`：包含一系列消息预处理器（`OutgoingMessagePreprocessor`\n  ）、转换器（`OutgoingMessageTransformer`）、发送器（`OutgoingMessageSender`\n  ）和后处理器（`OutgoingMessagePostprocessor`\n  ）。预处理器可校验消息长度等、转换器可根据情况把普通消息转为长消息或分片消息、发送器则处理非常规类型的消息（如音乐分享）。\n\n通常来说，一个协议上就是\"消息\"的消息元素，如 mirai `PlainText` 和 `At` 对应协议 `Elem.Text`\n、mirai `Face` 对应协议 `Elem.Face`。要支持这样的消息元素，只需要增加一个 `MessageEncoder`\n用于编码和一个 `MessageDecoder` 用于解码即可。\n\n[//]: # (> 实际上 `Dice` 的处理还涉及*消息细化*（Message Refinement）机制，该机制将在之后解释。 )\n\n而对于协议上有独立通道，而 mirai 为了易用性将他们设计为消息的消息元素，需要实现 `MessageSender`\n并以高于一般消息发送器 `GeneralMessageSender` 的优先级注册。 如（`MusicShare`\n）实际上通过独立的音乐分享通道发送；又如文件消息（`FileMessage`）需要通过 `FileManagement.Feed`\n通道发送。\n\n#### `MessageProtocol`\n\n无论是协议上就是消息的消息元素，还是协议上有独立通道的消息元素，它们的实现的方式都是类似的 ——\n通过 `MessageProtocol.collectProcessors`。\n`MessageProtocol` 是对*协议实现*的抽象。一个 `MessageProtocol` 包含了它负责的消息类型的所有处理器。\n\n继续使用 `Video` 示例，我们假设 `Video` 功能在协议上就是\"消息\"，因此只需要增加 `MessageEncoder`\n与 `MessageDecoder`：\n\n```kotlin\npackage net.mamoe.mirai.internal.message.protocol.impl\n\ninternal class VideoProtocol : MessageProtocol() {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        add(Encoder()) // 添加 Encoder 到消息流水线\n        add(Decoder())\n    }\n\n    private class Encoder : MessageEncoder<Video> {\n        override suspend fun MessageEncoderContext.process(data: Video) {\n            markAsConsumed() // 表示本 `MessageEncoder` 将会完成对输入的 `Video` 的全部处理\n\n            if (data is AbstractVideo) {\n                // `collect` 收集一个协议结构\n                collect(ImMsgBody.Elem(videoFile = data.toVideoFile()))\n            }\n        }\n    }\n\n    private class Decoder : MessageDecoder {\n        override suspend fun MessageDecoderContext.process(data: ImMsgBody.Elem) {\n            if (data.videoFile == null) return\n            markAsConsumed() // 表示本 `MessageDecoder` 将完成对输入的 `ImMsgBody.Elem` 的全部处理\n\n            collect(\n                OnlineVideoImpl(\n                    data.videoFile.fileName,\n                    data.videoFile.fileTime.toLong(),\n                    data.videoFile\n                )\n            )\n        }\n    }\n}\n```\n\n假如 `Video` 功能在协议上不是\"消息\"，就需要实现 `MessageSender`。`MessageSender`\n将直接涉及发送合适的数据包，可参考 `net.mamoe.mirai.internal.message.protocol.impl.MusicShareProtocol.Sender`\n实现。\n\n最后需要注册 `VideoProtocol`，这与之前注册 `Factory`\n的方式一样，只是需要基于 `net.mamoe.mirai.internal.message.protocol.MessageProtocol`\n：\n\n- JVM：在 jvmBaseMain/resources/META-INF/services/\n  新建一个文件名为 `net.mamoe.mirai.internal.message.protocol.MessageProtocol`\n  ，文件内容为 `net.mamoe.mirai.internal.message.protocol.impl.VideoProtocol`\n- Native：\n  在 `net.mamoe.mirai.internal.utils.MiraiCoreServices.registerAll`\n  末尾增加：\n\n  ```kotlin\n  Services.register(\n      \"net.mamoe.mirai.internal.message.protocol.MessageProtocol\",\n      \"net.mamoe.mirai.internal.message.protocol.impl.VideoProtocol\"\n  ) { net.mamoe.mirai.internal.message.protocol.impl.VideoProtocol() }\n  ```\n\n### 7. 添加收发消息测试\n\nmirai\n拥有对消息流水线的测试框架，位于 `commonTest/kotlin/message/protocol/impl/AbstractMessageProtocolTest`\n。\n\n请为你的 `...Protocol` 在 `commonTest/kotlin/message/protocol/impl`\n增加一个 `...ProtocolTest`。可以参考 `TextProtocolTest`\n（协议上的消息）和 `MusicShareProtocolTest`（独立通道）。\n\n在单元测试通过之后，也请登录测试账号在本地环境进行收发消息测试。\n提示：要运行 `main` 函数，可在 `jvmTest/kotlin/local` 中编写。该目录已被忽略\nGit 跟踪。\n\n### 8. 实现序列化\n\nmirai\n使用 [kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)\n。\nmirai 提供 `MessageSerializers` 来支持消息元素的多态序列化。\n\n序列化器（`KSerializer`）在 `MessageProtocol` 中收集。\n\n对于 `Video` 示例，我们首先为 `OnlineVideoImpl` 和 `OfflineVideoImpl` 实现序列化。\n\n`OfflineVideoImpl` 的序列化很简单，只需要添加两个注解：\n\n```kotlin\n@SerialName(OfflineVideo.SERIAL_NAME)\n@Serializable // 编译器将会自动生成序列化器\ninternal class OfflineVideoImpl(\n    override val filename: String,\n    override val length: Long,\n) : OfflineVideo, AbstractVideo() {\n    // ...\n}\n\ninternal class VideoProtocol : MessageProtocol() {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        // ...\n\n        // `superclassesScope` 的参数为 `OfflineVideo` 的父类。\n        // 这么做是因为反射在 Native 平台不可用。\n        MessageSerializer.superclassesScope(\n            MessageContent::class,\n            SingleMessage::class\n        ) {\n            add(\n                MessageSerializer(\n                    OfflineVideoImpl::class,\n                    OfflineVideoImpl.serializer()\n                )\n            ) // 绑定序列化器\n        }\n    }\n}\n```\n\n由于 `OnlineVideoImpl` 拥有 `ImMsgBody.VideoFile?` 属性，\n\n```kotlin\n@SerialName(OnlineVideo.SERIAL_NAME)\n@Serializable // 编译器将会自动生成序列化器\ninternal class OnlineVideoImpl(\n    override val filename: String,\n    override val length: Long,\n    private val original: @Serializable(VideoFileAsByteArraySerializer::class) ImMsgBody.VideoFile? // 协议数据结构\n) : OnlineVideo, AbstractVideo() {\n    override fun toVideoFile(): ImMsgBody.VideoFile = original\n}\n\n// 将 `VideoFile` 作为十六进制字符串序列化，这样输出的 JSON 字符串更易读。\ninternal object VideoFileAsHexSerializer :\n    KSerializer<ImMsgBody.VideoFile> by String.serializer()\n        .map( // 使用 String.serializer() 作为代理序列化器\n            resultantDescriptor = ImMsgBody.VideoFile.serializer().descriptor,\n            deserialize = { // 反序列化：即字符串到 ImMsgBody.VideoFile\n                it.hexToBytes() // 转换为字符串\n                    .loadAs(ImMsgBody.VideoFile.serializer()) // 解析 ByteArray 到结构\n            },\n            serialize = { // 序列化：即 ImMsgBody.VideoFile 到字符串\n                it.toByteArray(ImMsgBody.VideoFile.serializer()) // 导出结构数据为 ByteArray\n                    .toUHexString() // 转换为十六进制字符串表示\n            }\n        )\n\ninternal class VideoProtocol : MessageProtocol() {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        // ...\n        MessageSerializer.superclassesScope(\n            MessageContent::class,\n            SingleMessage::class\n        ) {\n            // ...\n            add(\n                MessageSerializer(\n                    OnlineVideoImpl::class,\n                    OnlineVideoImpl.serializer()\n                )\n            ) // 绑定序列化器\n        }\n    }\n}\n```\n\n### 9. 添加序列化测试\n\n请在第 7 步实现的你的 `MessageProtocolTest` 中添加\n添加序列化测试。\n\n你可以仿照已有的测试如 `TextProtocolTest`\n等编写你的序列化测试。通常只需要添加一个类似于 `TextProtocolTest`\n的 `test serialization for AtAll` 的函数即可。\n\n### 10. 提交 PR\n\n恭喜，到这一步你已经实现了高质量的新消息类型的支持。请在 `https://github.com/mamoe/mirai/compare` 提交\nPR，让你的修改能进入 mirai 主分支。感谢你对 mirai 的贡献。\n"
  },
  {
    "path": "docs/contributing/README.md",
    "content": "# 贡献\n\n本文是关于向 mirai 贡献的指南。mirai 欢迎并感谢一切形式的贡献。\n\n[mirai-core-api]: ../../mirai-core-api\n\n[mirai-core-utils]: ../../mirai-core-utils\n\n[mirai-core]: ../../mirai-core\n\n[mirai-console]: ../../mirai-console/backend/mirai-console\n\n[mirai-console-integration-test]: ../../mirai-console/backend/integration-test\n\n[mirai-console-codegen]: ../../mirai-console/backend/codegen\n\n[mirai-console-terminal]: ../../mirai-console/frontend/mirai-console-terminal\n\n[mirai-conosle-compiler-annotations]: ../../mirai-console/tools/compiler-annotations\n\n[mirai-conosle-compiler-common]: ../../mirai-console/tools/compiler-common\n\n[mirai-conosle-intellij]: ../../mirai-console/tools/intellij-plugin\n\n[mirai-conosle-gradle]: ../../mirai-console/tools/gradle-plugin\n\n[mirai-bom]: ../../mirai-bom\n\n[mirai-dokka]: ../../mirai-dokka\n\n[mirai-core-all]: ../../mirai-core-all\n\n[mirai-logging]: ../../logging\n\n[mirai-logging-log4j2]: ../../logging/mirai-logging-log4j2\n\n[mirai-logging-slf4j]: ../../logging/mirai-logging-slf4j\n\n[mirai-logging-slf4j-simple]: ../../logging/mirai-logging-slf4j-simple\n\n[mirai-logging-slf4j-logback]: ../../logging/mirai-logging-slf4j-logback\n\n当前仓库 mamoe/mirai 包含 mirai 核心模块：\n\n| 名称                     | 描述                  |\n|------------------------|---------------------|\n| mirai-core-utils       | 一些工具类，供其他模块使用       |\n| mirai-core-api         | mirai 机器人核心 API     |\n| mirai-core             | mirai 机器人核心实现       |\n| mirai-core-all         | 上述三个模块的集合，用于启动器     |\n| mirai-console          | 插件模式机器人框架后端         |\n| mirai-console-terminal | mirai-console 的终端前端 |\n| mirai-console-intellij | IntelliJ IDEA 插件    |\n| mirai-console-gradle   | Gradle 插件           |\n| mirai-bom              | Maven BOM           |\n| mirai-logging          | 常用日志库转接器            |\n\n若你想以非提交代码方式帮助 mirai，可以为 [mirai-console](/mirai-console)\n编写插件并发布到[论坛](https://mirai.mamoe.net/)，或在论坛帮助新入门的朋友使用\nmirai 等。\n\n若希望提交代码，请继续阅读。\n\n## Git 分支\n\n- `1.x`：1.x 版本的开发 (已停止)；\n- `dev`：2.x 版本的开发（主分支）；\n- `-release` 后缀：某个版本的小更新分支。如 `2.10-release`\n  会包含 `2.10.x` 小版本的更新；\n- 其他分支：正在开发中或留档的开发进度。\n\n通常请基于 `dev` 分支进行修改。\n\n基于[版本规范](../Evolution.md#版本规范)\n，若一个修改适合发布为小版本更新，mirai 会从 `dev`\n中提取该修复到目标 `-release` 分支。\n\n## 安装 JDK\n\n需要安装 JDK 才能编译 mirai。mirai 主分支最新提交在如下环境测试可以编译:\n\n| 操作系统         | JDK                | 架构      |\n|--------------|--------------------|---------|\n| macOS 12.0.1 | AdoptOpenJDK 17    | aarch64 |\n| macOS 12.0.1 | Amazon Corretto 11 | amd64   |\n| Windows 10   | OpenJDK 17         | amd64   |\n| Ubuntu 20.04 | AdoptOpenJDK 17    | amd64   |\n\n若在其他环境下无法正常编译, 请尝试选择上述一个环境配置。\n\n## 我不熟悉 Gradle 或 Kotlin / 我赶时间\n\n在 [SimpleInstructions](SimpleInstructions.md) 查看你可能想做的事情的简单命令。\n\n## `mirai-core` 术语\n\n根据语境，mirai-core 有时候可能指 `mirai-core`\n这个模块，有时候可能指 `mirai-core-utils`\n、`mirai-core-api`、 `mirai-core` 这三个模块的整体。\n本文中，`mirai-core` 将特指 `mirai-core` 模块，而用 'core' 或者 'mirai\ncore'\n指相关三个模块的整体。\n\n## core 多平台架构\n\n[HMPP]: https://kotlinlang.org/docs/multiplatform-discover-project.html\n\ncore 三个模块都使用 Kotlin [HMPP] 功能，同时支持 JVM 和 Android\n两种平台。你可以在 [Kotlin 官方文档][HMPP] 了解 HMPP 模式。\n\ncore 的编译目标层级结构如图所示：\n\n```\n    common\n    /    \\      \n  jvm   android \n```\n\n| 发布平台名称  | 描述               |\n|---------|------------------|\n| jvm     | JVM              |\n| android | Android (Dalvik) |\n\n备注：\n\n- common 包含全平台通用代码，绝大部分代码都位于 common；\n- jvmBase 包含针对 JVM 平台的通用代码；\n\n## 开发提示\n\n建议使用 IntelliJ IDEA 或 Android Studio，并安装最新的 Kotlin 插件。\n\n建议设置 IntelliJ 的内存为至少 6GB，否则 IDE 可能会频繁冻结编辑器收集垃圾。（可在 `Help -> Edit Custom VM Options` 中添加 `-Xmx6000m`）\n\n### 关闭部分项目以提升速度\n\n你可以在项目根目录创建 `local.properties`，中按照如下配置，关闭部分项目来提升开发速度。在关闭后，请终止所有 Gradle 后台进程，以保证更改正确应用。\n\n```properties\n# 关闭 IntelliJ IDEA 插件模块，这可以避免下载 1~2GB 的依赖\nprojects.mirai-console-intellij.enabled=false\n# 关闭 Gradle 插件模块\nprojects.mirai-console-gradle.enabled=false\n# 关闭 mirai 依赖测试模块\nprojects.mirai-deps-test.enabled=false\n# 也可以用其他模块的路径替换 module-path，可关闭该模块\nprojects.module-path.enabled=false\n# 特殊配置，关闭 mirai-console 后端，这同时也会关闭全部 console 相关的项目\nprojects.mirai-console.enabled=false\n# 特殊配置，关闭 mirai-logging，这会关闭所有日志转接模块\nprojects.mirai-logging.enabled=false\n# 特殊配置，是否取消指定 jvmToolchain，在本地 jvmTest 中需要访问 JDK 9+ 的内容时需要携带此配置\nmirai.enable.jvmtoolchain.special=false\n```\n\n通常关闭 IDEA 插件和 Gradle 插件可以显著提高初始化速度（IDEA 插件项目在初始化时需要下载 1G 左右编译依赖）。\n\n### 关闭 core 的部分构建目标\n\n可以在上述 `local.properties` 中，配置 `projects.mirai-core.targets=` 使用以下配置语法关闭部分构建目标。关闭后可以减轻 IDE 负担，也可以避免下载工具链而加快初始化速度。\n\n所有目标默认都启用。\n\n**注意**，在关闭一个目标后，将无法编辑该目标的相关源集的源码。\n因此若非主机性能太差或在 CI 机器运行，**不建议**关闭目标。\n\n[//]: # (备注: 如果要发版, 必须开启全部目标, 否则会导致 metadata 中的平台不全)\n\n- `xxx`：显式启用 `xxx` 目标\n- `!xxx`：显式禁用 `xxx` 目标\n- `others`：显式启用其他所有所有目标\n- `!others`：禁用没有显式启用的所有目标\n\n其中 xxx 表示构建目标名称。可用的目标名称有（区分大小写）：`jvm`、`android`\n\n```\n# 只启用 `jvm` 目标，禁用其他所有目标 (Android)\nprojects.mirai-core.targets=jvm;!others\n\n# 启用 `jvm` 和 `android` 目标\nprojects.mirai-core.targets=jvm;android\n```\n\n### 直接启动 mirai-core 本地测试\n\n一般情况下, 只要 JVM 平台测试通过其他平台也能测试通过。\n\n在 JVM 平台直接启动 mirai-core, 见 [mirai-core/jvmTest](/mirai-core/src/jvmTest/README.md)\n\n## 构建 mirai 项目 JAR\n\n查看 [Building](building/README.md)\n\n## 部署 mirai 到本地仓库\n\n[bignum]: https://github.com/ionspin/kotlin-multiplatform-bignum\n\n要部署 mirai 项目到本地 Maven 仓库（Maven Local），只需使用如下命令，其中 `2.99.0-local` 可为任意想在本地仓库发布的版本号。\n\n```shell\n./gradlew publishMiraiArtifactsToMavenLocal \"-Dmirai.build.project.version=2.99.0-local\"\n```\n\n注意，因为构建默认启用多线程，此操作可能会占用约 32GB 内存。如果主机条件不足，或希望减少内存占用，可以如下方式禁用多线程加速：\n\n```shell\n./gradlew publishMiraiArtifactsToMavenLocal \"-Dmirai.build.project.version=2.99.0-local\" \"-Porg.gradle.parallel=false\"\n```\n\n随后可通过 `implementation(\"net.mamoe:mirai-core:2.99.0-local\")` 引入项目。\n\n由于 mirai 项目结构复杂，构建可能由于各种原因失败，mirai 提供依赖可用性测试。\n部署一份版本为 `2.99.0-deps-test` 的 mirai 到本地仓库，执行 `./gradlew :mirai-deps-test:test` 即可运行相关测试。若测试通过，则代表部署的项目可通过各种方式正常引入到其他项目。\n\n## 通过 Gradle Composite Build 引入 mirai\n\n若在 Gradle 通过 Composite Build 引入 mirai，则在编译时可能遇到依赖冲突问题。\nmirai 使用特定版本的 Ktor 2、[kt-bignum][bignum] 等库，会将它们的包名增加前缀 `net.mamoe.mirai.internal.deps.` 来避免产生冲突。\n但这个操作仅对部署的版本有效，在 Gradle 中构建时，仍然可能会有依赖冲突。但若在测试中没遇到问题，一般不用担心。\n\n要详细了解这个过程以及实现原理，请查看 [源码](../../buildSrc/src/main/kotlin/shadow/Relocation.kt)（含注释）。\n\n## 寻找待解决的问题\n\n可以在 [issues](https://github.com/mamoe/mirai/issues) 查看 mirai\n遇到的所有问题，或在里程碑查看版本计划.\n\n[里程碑](https://github.com/mamoe/mirai/milestones) 为各版本的开发计划.\n在完成所有任务后就会发布该版本.\n\n`Backlog` 为没有设定目标版本的计划. 如果有相关 PR, 这些计划就可能会被确定到一个最近的版本.\n\n## 开发文档\n\n本节列举为了帮助开发某些模块的文档。\n\n- [添加新协议支持](ImplementingProtocol.md)。\n\n## 提交高质量的 commit 以及 PR\n\nmirai 由社区驱动，审核者在业余时间审核 PR。这些规范性建议将帮助你提交高质量的\ncommit 和 PR，同时节约你和审核者的时间，最大程度地帮助\nmirai，也能帮助你在其他项目提交同样高质量的 PR。\n\n如果你不太保证自己能达到这些要求也没关系，mirai 感谢你花费的每一分钟，维护者会审核\nPR 并尽可能帮助你。\n\n### 代码规范\n\n- 请在 Kotlin 模块使用纯 Kotlin 实现。\n- 尽量不要引用新的库\n- 遵守 Kotlin 官方代码规范（提交前使用 IDE 格式化代码即可 (commit\n  时勾选 'Reformat code')）\n\n### 为 Java 做兼容\n\nmirai 使用 Kotlin 编写，大量使用 Kotlin 协程等语言级特性。为了能兼容\nJava，mirai 使用 Kotlin\n编译器插件 [KJBB](https://github.com/him188/kotlin-jvm-blocking-bridge)\n。KJBB 会为 Kotlin 挂起函数生成一个辅助方法来允许 Java 调用。在开发时只需要：\n\n- 安装 IDE\n  插件 [kotlin-jvm-blocking-bridge](https://github.com/Him188/kotlin-jvm-blocking-bridge/blob/master/README-chs.md#%E5%AE%89%E8%A3%85-intellij-idea-%E6%88%96-android-studio-%E6%8F%92%E4%BB%B6)\n\n- 若要添加一个 suspend 函数, 为它添加 `@JvmBlockingBridge` 注解即可允许\n  Java 调用\n\n### 确保二进制兼容性\n\n请在提交前进行 [ABI 验证](VerifyingABI.md)。\n\n### 代码注释语言\n\n内部实现的注释可以使用英文或中文（无变体要求）。公开 API\n的注释（KDoc）请只使用简体中文，且无需提供翻译。\n\n### 编写高质量的文档\n\nmirai 在乎质量，这也包括文档质量。根据 mirai 的历史 PR，许多贡献者容易忽视下列问题：\n\n- 汉字与英文或数字之间需要有空格\n- KDoc 语法衍生于 Markdown 语法，没有空行的换行会被压缩为一行，因此需要有正确的标点符号结束一句话\n\n可以阅读 [中文技术文档的写作规范](https://github.com/ruanyf/document-style-guide/blob/master/docs/title.md)\n了解如何编写高质量的中文文档。为了方便，在 mirai 代码文档和注释中可以使用英文标点符号。但在编写\ndocs 目录中等的 `.md` 正式文档时，请遵守写作规范。\n\n### PR 标题\n\n编写 PR 标题时，可以使用英文或中文。正确描述 PR 的修改，避免 \"修复了一个\nbug\" 这类模糊标题即可。\n\n### 会如何合并 PR\n\n由于仓库庞大，mirai 主分支（`dev`）维护线性提交历史来确保历史的可读性。这意味着主分支不允许有\nmerge 操作，只允许基于分支最新提交的提交。\n\n一般 PR 会以 squash 方式合并，即 PR 的所有 commit 都会被合并为一个\ncommit，并由审核者拟定标题。这个标题通常会直接采用 PR 标题（如果符合规范）。\n\n若提交的 PR 需要以多个步骤完成，且 PR 的提交概述符合约定，审核者通常会以\nrebase 方式合并 PR，即 PR 的 commit 会被重置到基于最新 `dev` 分支并按顺序并入。\n\n### commit message\n\n由于很多 PR 会以 squash 方式合并，可以不需要遵守本节的提交概述（commit\nmessage）的约定。\n\n编写提交概述以及 PR 的标题时，可以使用英文或中文。\n\n由于代码量庞大，请在提交概述包含涉及模块名称。模块名称可以是 `[core]`\n、`[console]`、`[idea]`、`[gradle]` 或 `[build]`\n。如有必要，还可以添加子模块名称如 `[core/native]` 表示 mirai-core 中的\nnative 部分。\n\nmirai 不要求将 commit 为了区分新功能或修复 bug 而*特地*使用 `fix:`\n或 `feat:`\n等前缀（允许你认为的合理的使用，或是你更喜欢这样区分）。只需要用最合适的语言描述修改。如 `Optimize gradle properties`\n。\n\n请以标准英文句子语法编写提交概述，可省略末尾标点符号。如 `Configure shadow relocation, and add checks for multiplatform publishing.`\n或 `Optimize gradle properties`。\n\n### 确保 PR 只解决一类问题\n\n一个 PR 只能解决一个（类）问题，比如 \"支持视频消息\"、\"\n修复无法发送图片的问题\"、\"修复一些消息类型无法序列化的问题\"。\n等。当解决一类问题时，请规范 commit 来区分解决这类问题的步骤（如果有必要）。\n\n### 确保 commit 的可阅读性\n\n一个 PR 只能包含能通过 commit message\n描述的对一个部分的修改。比如 \"更新 console 文档\"\n、\"Add logger for NetworkHandler\" 等。\n\ncommit 必须不带有或指明必要的副作用。例如名称为 \"修复无法发送图片的问题\"\n的 commit 却修改了对消息长度的限制是不好的。此时一个恰当的概述为 \"\n调整消息长度限制, 修复无法发送图片的问题\" (修改内容 + 修改带来的影响)。\n\n若要修复某一个 issue，请不要仅提交 \"fix #123\"。请附带具体修复内容，把修复\nissue 作为\"修改带来的影响\"。例如 \"调整消息长度限制, 修复无法发送图片的问题,\nfix #123\"。（\"fix #123\" 会触发 GitHub 自动链接 issue 到 PR）\n\n### PR 在有审核后避免 force push\n\nPR 在有人审核（review）后，请不要进行 force push（`git push -f`\n），否则将可能会导致审核人需要重新审核你的全部代码——这会浪费大量时间。请在收到\napprove 的 review 并且 PR 被标记 `ready-to-merge` 之后再进行 force push\n优化提交历史。当然，即使不优化提交历史，PR 也会在合适的时机使用 squash\n方式合并。\n\n在有审核之前可任意 force push。\n\n[//]: # (### 加入开发组)\n\n[//]: # ()\n\n[//]: # (你可以随时提交 PR 解决任何问题。而若有兴趣，我们也欢迎你加入开发组，请联系 support@mamoe.net)\n\n[//]: # ()\n\n[//]: # ([mirai-compose]: https://github.com/sonder-joker/mirai-compose)\n\n[//]: # ()\n\n[//]: # ([plugin-center 服务端]: https://github.com/project-mirai/mirai-plugin-center)\n\n[//]: # ()\n\n[//]: # ([mirai-api-http]: https://github.com/project-mirai/mirai-api-http)\n\n[//]: # ()\n\n[//]: # ([project-mirai/docs]: https://github.com/project-mirai/docs)\n\n[//]: # ()\n\n[//]: # ([docs.mirai.mamoe.net]: https://docs.mirai.mamoe.net)\n\n[//]: # ()\n\n[//]: # (|           名称            |                                      描述                                      |)\n\n[//]: # (|:-----------------------:|:----------------------------------------------------------------------------:|)\n\n[//]: # (|   core 和 console 日常更新   |          在 milestone 安排的日常更新。我们目前版本速度是一个月到两个月发布一个次版本（2.x&#41;。需要日常的开发。           |)\n\n[//]: # (|       console 后端        |                    架构稳定，现在格外需要在易用性上的提升，首先需要一个优化方案，再实现它们。                     |)\n\n[//]: # (|       console 文档        |                根据用户反馈，现在文档十分缺少。需要以用户的身份体验过 console 的人编写用户文档。                 |)\n\n[//]: # (|  图形前端 [mirai-compose]   |                各功能都缺目前尤其缺少对接 console PluginConfig 的图形化配置的实现。                 |)\n\n[//]: # (|   [plugin-center 服务端]   |                插件中心正在建设中。后端 Spring，前端 Vuetify。由于开发人员学业繁忙，暂搁置。                |)\n\n[//]: # (|    plugin-center 社区     | 插件中心计划支持所有语言的插件，因此需要与社区 SDK 作者沟通并帮助它们接入 Console 的 PluginLoader API 和插件中心的要求。 |)\n\n[//]: # (| plugin-center console 端 |              需要评估现在 console 架构是否足够支持插件中心及所有语言插件的管理，实现与插件中心的对接。               |)\n\n[//]: # (|  plugin-center gradle   |                        对接插件中心，实现通过 Task 上传插件。还没有开始做。                         |)\n\n[//]: # (|  mirai-console-loader   |               console 启动器。对接插件中心的 API，支持下载和更新插件等。不确定之后是否会有人实现。               |)\n\n[//]: # (|         IDE 插件          |            IntelliJ IDEA 的插件的工作。可以为 mirai 框架添加检查等功能。这个部分目前基本满足需求。            |)\n\n[//]: # (|   [mirai-api-http] v2   |                                    日常维护。                                     |)\n\n[//]: # (|  [project-mirai/docs]   |     用户友好文档自动部署，使用 VuePress , 部署于 [docs.mirai.mamoe.net]，目前还有部分超链接错误的问题。      |)\n"
  },
  {
    "path": "docs/contributing/SimpleInstructions.md",
    "content": "# 简单命令\n\n以下为你可能想做的事情的示例命令：\n\n1. clone 项目\n2. 在项目根目录创建 local.properties，并加入如下内容：\n   ```properties\n   projects.mirai-console-intellij.enabled=false\n   projects.mirai-deps-test.enabled=false\n   ```\n3. 执行以下命令：\n\n- 我只是 JDK/Java/Kotlin JVM 用户（或者我不知道这什么什么意思）：\n    - 编译并打包 mirai-core-all JAR，成品将存放在 `mirai-core-all/build/libs/`：\n      ```shell\n      ./gradlew :mirai-core-all:shadowJar \"-Dprojects.mirai-core.targets=jvm;!others\"\n      ```\n    - 编译并打包 mirai-console JAR，成品将存放在 `mirai-console/build/libs/`:\n      ```shell\n      ./gradlew :mirai-console:shadowJar \"-Dprojects.mirai-core.targets=jvm;!others\"\n      ```\n    - 将 mirai 发布到 mavenLocal 以便本地引入，发布后的版本为 `2.99.0-local`：\n      ```shell\n      ./gradlew publishMiraiArtifactsToMavenLocal \"-Dprojects.mirai-core.targets=jvm;!others\" \"-Dmirai.build.project.version=2.99.0-local\"\n      ```\n- 我是 Android 用户：\n    - 将 mirai 发布到 mavenLocal 以便本地引入，发布后的版本为 `2.99.0-local`：\n      ```shell\n      ./gradlew publishMiraiArtifactsToMavenLocal \"-Dprojects.mirai-core.targets=jvm;android;!others\"\n      ```\n      若上述命令不工作，尝试在 Android Studio 中打开项目并在 Studio 的终端中执行命令。\n"
  },
  {
    "path": "docs/contributing/VerifyingABI.md",
    "content": "# 进行 ABI 验证\n\nmirai\n通过 [binary-compatibility-validator](https://github.com/Kotlin/binary-compatibility-validator))\n维护 [ABI](https://zh.wikipedia.org/zh-cn/%E5%BA%94%E7%94%A8%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%8E%A5%E5%8F%A3)\n稳定性。\n\n若要修改 mirai-core-api，可执行 Gradle 任务 `apiCheckAll` 来检验 ABI\n兼容性，也可以在 IDEA 双击 Control 键运行 `Check Binary Compatiblity`。\n\n若正在添加一个新功能，可以执行 Gradle 任务 `apiDumpAll` 或在 IDEA 双击\nControl 键运行 `Dump API Changes for ...` 来更新记录。这将会生成 `*.api`\n文件，文件的变化反映了你的修改情况。请人工审核该文件以确保向下兼容。"
  },
  {
    "path": "docs/contributing/building/BuildingCoreAndroid.md",
    "content": "# 构建 mirai-core Android 目标\n\nmirai 项目支持两种方式构建 Android 目标。\n\n若主机在 `local.properties` 中配置了 `sdk.dir` 为 Android SDK 路径（就像普通 Android 项目一样），\n并且 mirai 的 Android 目标为启用状态（见 [关闭部分项目以提升速度](../README.md#关闭部分项目以提升速度)），则会使用 Android SDK 方式构建 android 目标，否则使用 JDK 方式。\n\n## Android 源集结构\n\n以 \"ADK\" 指代 \"Android SDK\"，下表展示 mirai core 项目中与 Android 相关的 Kotlin 源集、其依赖的源集列表、以及可用性。\n\n| sourceSet               | dependsOn   | 可用性       |\n|-------------------------|-------------|-----------|\n| androidMain             | jvmBaseMain | ADK 和 JDK |\n| androidInstrumentedTest | jvmBaseTest | ADK       |\n| androidUnitTest         | jvmBaseTest | ADK 和 JDK |\n\n## Android SDK 构建方式\n\n就像一个普通的 Android 库一样，mirai 可使用 Android SDK 编译，并拥有在 JVM 的单元测试和在 Dalvik 上运行的 instrumented tests。\n这是最推荐的构建方式，能保证 mirai 在真实 Android 环境通过测试，且能获得针对 Android 的 IDEA 代码检查。\n\n注意，`androidInstrumentedTest` 将会使用 Android 模拟器运行。\n\n## JDK 构建方式\n\n若 `sdk.dir` 未配置，则不会配置使用 Android SDK，而会使用桌面 JDK。`androidInstrumentedTest` 将会被禁用。\n"
  },
  {
    "path": "docs/contributing/building/README.md",
    "content": "# 构建\n\n本文介绍如何构建 mirai 的各模块。\n\n## 构建 JVM 目标\n\n要构建只有 JVM 目标的项目（如 `mirai-console`，只需在项目根目录使用如下命令执行\nGradle 任务：\n\n```shell\n./gradlew :mirai-console:assemble # 编译\n./gradlew :mirai-console:check # 测试\n./gradlew :mirai-console:build # 编译和测试\n```\n\n其中 `:mirai-console` 是目标项目的路径（path）。\n\n你也可以在 IDEA 等有 Gradle 支持的 IDE 中在通过侧边栏等方式选择项目的 `assemble` 等任务：\n\n![](images/run-gradle-tasks-in-idea.png)\n\n类似，但需要使用 `:mirai-core:compileKotlinJvm` 和 `:mirai-core:jvmTest`\n分别用于编译和测试。提示：直接执行测试时也会自动先完成编译。\n\n在 IDEA 开发中无需特殊考虑，一般直接通过点击单元测试行号处的运行按钮即可选择 JVM 平台运行。\n要批量运行测试，可使用 `./gradlew :mirai-core:check` 运行 mirai-core 模块的所有目标的所有测试。\n\n不建议在日常使用 `./gradlew check` 运行所有项目的测试，因为这可能会消耗时间和主机运行资源。但也值得在即将提交 PR 或喝咖啡休息时这么做。\n\n### 构建 core 的 Android 目标\n\n查看 [BuildingCoreAndroid](BuildingCoreAndroid.md)。\n\n## 构建 IntelliJ 插件\n\n可通过如下命令构建 IntelliJ 平台 IDE 的插件。构建成功的插件将可以在 `mirai-console/tools/intellij-plugin/build/distribution` 中找到。\n\n```shell\n./graldew :mirai-console-intellij:buidlPlugin\n```\n\n## 获得 mirai-console JAR\n\n在项目根目录执行如下命令可以获得包含依赖的 mirai-console JAR。其他模块也类似。\n\n```shell\n./gradlew :mirai-console:shadowJar\n```\n"
  },
  {
    "path": "docs/contributing/mock/SpaceAllocation.md",
    "content": "# TmpFsServer\n\n> 此文件是关于 `mirai-core-mock` 是如何分配文件资源路径的具体说明\n> \n> 所有的临时资源的路径 (包括: 图片, 语音, 群文件, etc.)\n>\n> 注:\n> - 此文档说明只适用于默认实现\n\n## 通用资源\n\nTmpFsServer 会为每一个上传的文件分配一个 ResourceID, 规则如下\n\n```text\n${resource.size}-${resource.sha1.hex()}-${resource.md5.hex()}\n```\n\n数据资源会直接拷贝至 `/storage/$resourceId`\n\n## 图片资源\n\n图片资源除了 ResourceID 外, 还拥有一个 `ImageID`,\nmirai-core-api 中 ImageID 的格式为 `{XXXXXX}.yyy`, 而 TmpFsServer 仅截取其中 `XXXX` 部分作为 `ImageID`\n\n在完成资源上传后, TmpFsServer 会额外将 `/images/$imgId` 链接到 `/storage/$resourceId`\n\n# ServerFileDisk / ServerFileSystem (群文件管理系统)\n\n每一个群都有一个自己的 `ServerFileSystem`, 每一个 `ServerFileSystem` 都会分配一块区域存储自己的数据, 路径为\n\n`/fs-disk/${UUID.randomUUID()}` (下文简记为 `/sfs`)\n\n由于群文件的特殊性, 群文件采用随机 UUID 作为文件名\n\n> 特殊性: 群文件允许同名文件的存在\n\n群文件数据结构如下\n\n```text\n/sfs/details/root/....\n/sfs/details/fileN/....\n/sfs/details/dirN/....\n/sfs/root/fileN....\n/sfs/dirN/fileN....\n/sfs/fileN.....\n```\n\n## 普通文件\n\n对于普通文件, ServerFileSystem 会随机分配一个 ID, 并将数据拷贝至 `/sfs/$id`,\n然后在此文件所在的文件夹创建一个同名空文件, 并生成相关的 details 信息\n\n> 如: 如果是在根目录, 则会创建 `/sfs/root/$id`,\n>\n> 如果是在目录 `testdir`(实际是随机 UUID), 则会创建 `/sfs/testdir/$id`\n\n## 目录\n\n对于目录, 相关的行为与普通文件一样。\n唯一的区别是， `/sfs/$id` 是一个目录而不是一个文件\n\n## details 信息\n\n`/sfs/details/$id/....` 存有每一个文件的详细信息 (对于根目录, `/sfs/details/root/...`)\n\n其中的文件意义为:\n\n- `~/parent` 此文件所在的文件夹\n- `~/name` 此 文件/文件夹 的名字, 对于根目录永远为 `\"\"`\n- `~/creator` 此 文件/文集夹 的创建者, 编码为 二进制 big-endian int64\n- `~/createTime` 此 文件/文件夹 的创建时间, 编码为 二进制 big-endian int64\n"
  },
  {
    "path": "docs/files/install-20210412.cmd",
    "content": "@echo off\npowershell (new-object System.Net.WebClient).DownloadFile( 'https://github.com/iTXTech/mcl-installer/releases/download/2827601/mcl-installer-2827601-windows-amd64.exe','mcl-installer.exe')\ndel input.txt\nREM װ Java\necho Y >> input.txt\nREM ʹ Java 11\necho 11 >> input.txt\nREM ʹ JRE\necho 1 >> input.txt\nREM ʹ 32 λ JRE ļϵͳ, ҲҪ mirai-native\necho x32 >> input.txt\necho Y >> input.txt\necho Y >> input.txt\necho Y >> input.txt\necho Y >> input.txt\necho Y >> input.txt\necho Y >> input.txt\nmcl-installer.exe < input.txt\ndel input.txt\ndel mcl-installer.exe\ncmd /c mcl.cmd --update-package net.mamoe:mirai-api-http --channel stable --type plugin\necho\necho\necho װɹ, Ժִ mcl.cmd  Mirai Console\necho Installation succeed. Run mcl.cmd to start Mirai Console.\npause"
  },
  {
    "path": "docs/mirai-ecology.md",
    "content": "# A brief introduction of Mirai Ecosystem\n\nMirai是一个免费开源的QQ机器人框架，由于其开源和易拓展的优势，现在已经有很多基于Mirai的官方和非官方衍生框架和应用(下文统一称为**项目**)，其关系错综复杂。这里将简单为你介绍整个 **Mirai 生态中各个框架和应用的关系**。\n\n> 强烈建议你从头并按照**文章顺序和思路**阅读，即使你对 Mirai 生态有一定的了解。\n\n## 目录：\n\n1. [Mirai](#mirai-使用-kotlin-编写的高效率-qq-机器人框架)\n\n2. [mirai-console](#mirai-console-mirai-官方的可拓展式-qq-机器人管理控制台)\n\n   - [chat-command](#chat-command-mirai-console-的官方的聊天命令插件)\n   - [mirai-api-http](#mirai-api-http-mirai-console-的官方-http-api-插件)\n   - [mirai-native](#mirai-native-与-coolq-对接的一个通道)\n\n3. [mirai-console-loader](#mirai-console-loader-mirai-console-的官方一键启动器)\n\n\n\n\n## [Mirai](https://github.com/mamoe/mirai): 使用 [Kotlin](https://www.kotlincn.net/) 编写的高效率 QQ 机器人框架\n\nMirai，正如你所见，这个名字不带任何的前缀或后缀，它是**整个生态的中心**，在这个生态中，所有的项目都直接或间接与 Mirai 有密不可分的关系，Mirai为用户提供了最<u>基础</u>且<u>核心</u>的功能：**接收消息**与**发送消息**。\n\n你需要明确了解的是，Mirai 的定位是<u> QQ 机器人**框架**</u>，或者说它是一个**库(Library)**。<u>如果你觉得理解起来有点困难，你可以把它类比为**建筑的骨架**，一栋只有建筑骨架的建筑是不能住人的，你需要根据这个骨架来盖好这栋楼，它才能住人。同样地，Mirai 是不能直接启动的，需要使用这个框架并按照你的想法来编写QQ机器人程序</u>。\n\n通常来说，Mirai 就是一个 <u>QQ 机器人框架</u>，但是它的内部并不是一个单一的结构：\n\n- [mirai-core-api](https://github.com/mamoe/mirai/tree/dev/mirai-core-api)：提供了使用 Mirai 的接口。它抽象了核心协议的接口，如**收发消息**，**群操作**等，但不承担具体工作。\n- [mirai-core](https://github.com/mamoe/mirai/tree/dev/mirai-core)：是 Mirai 对 QQ 的具体协议实现，它承担具体且核心的工作。\n\n它们的关系如下：\n\n[![](https://mermaid.ink/img/eyJjb2RlIjoiZmxvd2NoYXJ0IExSXG4gICAgY2xhc3NEZWYgY29yZWhpZ2hsaWdodCBmaWxsOiNmOTYsc3Ryb2tlOiMzMzMsc3Ryb2tlLXdpZHRoOjNweDtcbiAgICBzdWJncmFwaCBtaXJhaSBbXCJNaXJhaSDmoYbmnrZcIl1cbiAgICAgICAgbWlyYWljb3JlYXBpKG1pcmFpLWNvcmUtYXBpKTo6OmNvcmVoaWdobGlnaHRcbiAgICAgICAgbWlyYWljb3JlcXFhbmRyb2lkKFwibWlyYWktY29yZTxici8-KFFRQW5kcm9pZCDljY_orq4pXCIpXG4gICAgICAgIG1pcmFpY29yZXFxYW5kcm9pZCAtLT4gfOaPkOS-m-WNj-iurnxtaXJhaWNvcmVhcGlcbiAgICBlbmRcbiAgICBtaXJhaWludGVyZmFjZShcIuS9oOe8luWGmeeahDxici8-5py65Zmo5Lq656iL5bqPXCIpXG4gICAgbWlyYWljb3JlYXBpIC0tPiB85o-Q5L6b5Z-656GA5Yqf6IO9fG1pcmFpaW50ZXJmYWNlIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifSwidXBkYXRlRWRpdG9yIjpmYWxzZX0)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoiZmxvd2NoYXJ0IExSXG4gICAgY2xhc3NEZWYgY29yZWhpZ2hsaWdodCBmaWxsOiNmOTYsc3Ryb2tlOiMzMzMsc3Ryb2tlLXdpZHRoOjNweDtcbiAgICBzdWJncmFwaCBtaXJhaSBbXCJNaXJhaSDmoYbmnrZcIl1cbiAgICAgICAgbWlyYWljb3JlYXBpKG1pcmFpLWNvcmUtYXBpKTo6OmNvcmVoaWdobGlnaHRcbiAgICAgICAgbWlyYWljb3JlcXFhbmRyb2lkKFwibWlyYWktY29yZTxici8-KFFRQW5kcm9pZCDljY_orq4pXCIpXG4gICAgICAgIG1pcmFpY29yZXFxYW5kcm9pZCAtLT4gfOaPkOS-m-WNj-iurnxtaXJhaWNvcmVhcGlcbiAgICBlbmRcbiAgICBtaXJhaWludGVyZmFjZShcIuS9oOe8luWGmeeahDxici8-5py65Zmo5Lq656iL5bqPXCIpXG4gICAgbWlyYWljb3JlYXBpIC0tPiB85o-Q5L6b5Z-656GA5Yqf6IO9fG1pcmFpaW50ZXJmYWNlIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifSwidXBkYXRlRWRpdG9yIjpmYWxzZX0)\n\n可以看到，协议内容只在 Mirai 内部使用，只有 mirai-core-api 对外提供了功能。\n\nMirai 运行在 JVM，你需要使用 Kotlin 语言或 Java 语言来编写你的 QQ 机器人程序。在运行时需要有 mirai-core，在开发时只需要有 mirai-core-api。\n\n> 有关 JVM 平台项目配置可以在[之后](ConfiguringProjects.md#mirai---configuring-projects)了解到。\n\n## [mirai-console](/mirai-console): Mirai 官方的可拓展式 QQ 机器人管理控制台\n\n前面我们提到，你可以使用 Mirai 框架提供的对外开放接口来编写个性化QQ机器人程序，而 mirai-console 就是 Mirai 官方开发组编写的 QQ 机器人程序，它**在 Mirai 框架提供的基础功能的基础上进行了封装**并**进一步提供了更方便的开放接口**。\n\n比如，console 提供了**配置自动登录**，**自动配置/数据存储**功能，这样你就不需要自己考虑写配置登录或者数据存储了，减少了代码工作量。<u>承接上面的例子，mirai-console 就相当于为你在建筑骨架上砌好了墙，分好了房间，这样你就能更容易地盖好这栋楼了</u>。\n\n**重要的是，mirai-console 有命令行界面，可以直接在终端运行它，并实时看到你的机器人状态、插件的运行情况，或者通过 console 提供的命令管理指令权限或者执行插件提供的指令等。**\n\n你可以使用 Kotlin 语言或 Java 语言来编写基于 mirai-console 的 QQ机器人程序，在 mirai-console 中，你编写的程序被称作**插件(Plugin)**，它将被打包为 jar 文件，这样可以很方便发布你的机器人功能程序给其他人使用，把插件 mirai-console 指定的文件夹下，启动 mirai-console 就可以加载你的程序了。  \n\n> 你一定玩过 Minecraft， 这里的插件就像 Minecraft 的 mod 一样！\n\n当然，在编写 console 插件时，你**不仅能使用 console 提供的简便接口**，你**还可以同时使用 mirai-core-api 提供的基础接口**。\n\nmirai-console 的内部也不是单一的结构，它分为**前端**和**后端**具体如下：\n\n- [后端](/mirai-console/backend)：后端就是做了上述工作，即提供**指令**，**权限**，**自动数据**\n  等开放接口。\n- [前端](/mirai-console/frontend)：前端就是启动 mirai-console\n  并监控后端运行状态的端口，上述命令行界面是前端的一种，即 [**\n  mirai-console-terminal**](/mirai-console/frontend/mirai-console-terminal)\n  ，在终端启动的前端。另外还有其他可用的前端如运行在 Android\n  的 **[MiraiAndroid](https://github.com/mzdluo123/MiraiAndroid)**。\n\n后端就像是“**电脑主机**”，执行着核心工作，前端就像是“**显示器**”、“**鼠标**”和“**键盘**”，可以控制后端。\n\n将 mirai-console 放入上述关系图：\n\n[![](https://mermaid.ink/img/eyJjb2RlIjoiZmxvd2NoYXJ0IExSXG4gICAgY2xhc3NEZWYgY29yZWhpZ2hsaWdodCBmaWxsOiNmOTYsc3Ryb2tlOiMzMzMsc3Ryb2tlLXdpZHRoOjNweDtcbiAgICBjbGFzc0RlZiBoaWdobGlnaHQgZmlsbDojZjg4LHN0cm9rZTojMzMzLHN0cm9rZS13aWR0aDozcHhcbiAgICBzdWJncmFwaCBtaXJhaSBbXCJNaXJhaSDmoYbmnrZcIl1cbiAgICAgICAgbWlyYWljb3JlYXBpKG1pcmFpLWNvcmUtYXBpKTo6OmNvcmVoaWdobGlnaHRcbiAgICAgICAgbWlyYWljb3JlcXFhbmRyb2lkKFwibWlyYWktY29yZTxici8-KFFRQW5kcm9pZCDljY_orq4pXCIpXG4gICAgICAgIG1pcmFpY29yZXFxYW5kcm9pZCAtLT4gfOaPkOS-m-WNj-iurnxtaXJhaWNvcmVhcGlcbiAgICBlbmRcbiAgICBtaXJhaWludGVyZmFjZShcIuS9oOe8luWGmeeahDxici8-5py65Zmo5Lq656iL5bqPXCIpXG4gICAgbWlyYWljb3JlYXBpIC0tPiB85o-Q5L6b5Z-656GA5Yqf6IO9fG1pcmFpaW50ZXJmYWNlXG4gICAgbWlyYWljb3JlYXBpIC0tPiB85bCB6KOF5Z-656GA5Yqf6IO9fG1pcmFpY29uc29sZWJhY2tlbmRcbiAgICBzdWJncmFwaCBtaXJhaWNvbnNvbGUgW1wiTWlyYWkgQ29uc29sZVwiXVxuICAgICAgICBtaXJhaWNvbnNvbGViYWNrZW5kKFwiQmFja0VuZFwiKTo6OmhpZ2hsaWdodFxuICAgICAgICBtaXJhaWNvbnNvbGVmcm9udGVuZC10ZXJtaW5hbChcIkZyb250RW5kOiB0ZXJtaW5hbFwiKVxuICAgICAgICBtaXJhaWNvbnNvbGVmcm9udGVuZC1hbmRyb2lkKFwiRnJvbnRFbmQ6IEFuZHJvaWRcIilcbiAgICAgICAgbWlyYWljb25zb2xlYmFja2VuZCAtLT4gbWlyYWljb25zb2xlZnJvbnRlbmQtdGVybWluYWxcbiAgICAgICAgbWlyYWljb25zb2xlYmFja2VuZCAtLT4gbWlyYWljb25zb2xlZnJvbnRlbmQtYW5kcm9pZFxuICAgIGVuZFxuICAgIHN1YmdyYXBoIGNvbnNvbGVwbHVnaW5zIFtcIk1pcmFpIENvbnNvbGUg5o-S5Lu2XCJdXG4gICAgICAgIHlvdXJtaXJhaXBsdWdpbihcIuS9oOe8luWGmeeahCBDb25zb2xlIOaPkuS7tlwiKVxuICAgIGVuZFxuICAgIHlvdXJtaXJhaXBsdWdpbiAtLT4gbWlyYWljb25zb2xlYmFja2VuZCIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0In0sInVwZGF0ZUVkaXRvciI6ZmFsc2V9)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoiZmxvd2NoYXJ0IExSXG4gICAgY2xhc3NEZWYgY29yZWhpZ2hsaWdodCBmaWxsOiNmOTYsc3Ryb2tlOiMzMzMsc3Ryb2tlLXdpZHRoOjNweDtcbiAgICBjbGFzc0RlZiBoaWdobGlnaHQgZmlsbDojZjg4LHN0cm9rZTojMzMzLHN0cm9rZS13aWR0aDozcHhcbiAgICBzdWJncmFwaCBtaXJhaSBbXCJNaXJhaSDmoYbmnrZcIl1cbiAgICAgICAgbWlyYWljb3JlYXBpKG1pcmFpLWNvcmUtYXBpKTo6OmNvcmVoaWdobGlnaHRcbiAgICAgICAgbWlyYWljb3JlcXFhbmRyb2lkKFwibWlyYWktY29yZTxici8-KFFRQW5kcm9pZCDljY_orq4pXCIpXG4gICAgICAgIG1pcmFpY29yZXFxYW5kcm9pZCAtLT4gfOaPkOS-m-WNj-iurnxtaXJhaWNvcmVhcGlcbiAgICBlbmRcbiAgICBtaXJhaWludGVyZmFjZShcIuS9oOe8luWGmeeahDxici8-5py65Zmo5Lq656iL5bqPXCIpXG4gICAgbWlyYWljb3JlYXBpIC0tPiB85o-Q5L6b5Z-656GA5Yqf6IO9fG1pcmFpaW50ZXJmYWNlXG4gICAgbWlyYWljb3JlYXBpIC0tPiB85bCB6KOF5Z-656GA5Yqf6IO9fG1pcmFpY29uc29sZWJhY2tlbmRcbiAgICBzdWJncmFwaCBtaXJhaWNvbnNvbGUgW1wiTWlyYWkgQ29uc29sZVwiXVxuICAgICAgICBtaXJhaWNvbnNvbGViYWNrZW5kKFwiQmFja0VuZFwiKTo6OmhpZ2hsaWdodFxuICAgICAgICBtaXJhaWNvbnNvbGVmcm9udGVuZC10ZXJtaW5hbChcIkZyb250RW5kOiB0ZXJtaW5hbFwiKVxuICAgICAgICBtaXJhaWNvbnNvbGVmcm9udGVuZC1hbmRyb2lkKFwiRnJvbnRFbmQ6IEFuZHJvaWRcIilcbiAgICAgICAgbWlyYWljb25zb2xlYmFja2VuZCAtLT4gbWlyYWljb25zb2xlZnJvbnRlbmQtdGVybWluYWxcbiAgICAgICAgbWlyYWljb25zb2xlYmFja2VuZCAtLT4gbWlyYWljb25zb2xlZnJvbnRlbmQtYW5kcm9pZFxuICAgIGVuZFxuICAgIHN1YmdyYXBoIGNvbnNvbGVwbHVnaW5zIFtcIk1pcmFpIENvbnNvbGUg5o-S5Lu2XCJdXG4gICAgICAgIHlvdXJtaXJhaXBsdWdpbihcIuS9oOe8luWGmeeahCBDb25zb2xlIOaPkuS7tlwiKVxuICAgIGVuZFxuICAgIHlvdXJtaXJhaXBsdWdpbiAtLT4gbWlyYWljb25zb2xlYmFja2VuZCIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0In0sInVwZGF0ZUVkaXRvciI6ZmFsc2V9)\n\n> 要获取有关 mirai-console 的更多信息，请前往 [mirai-console](https://github.com/mamoe/mirai-console)\n\n## [chat-command](https://github.com/project-mirai/chat-command): Mirai Console 的官方的聊天命令插件\n\n在 mirai-console 的前端中，我们提到可以在前端执行 console 内置和插件提供的**命令**，如果我们想在聊天环境(好友聊天/群聊天/临时会话)执行 console 命令，我们就需要官方提供的 chat-command，并且，console 中的权限管理正是管理**聊天环境中用户执行权限**的。\n\n将 chat-command 放入上述关系图：\n\n[![](https://mermaid.ink/img/eyJjb2RlIjoiZmxvd2NoYXJ0IExSXG4gICAgY2xhc3NEZWYgY29yZWhpZ2hsaWdodCBmaWxsOiNmOTYsc3Ryb2tlOiMzMzMsc3Ryb2tlLXdpZHRoOjNweDtcbiAgICBjbGFzc0RlZiBoaWdobGlnaHQgZmlsbDojZjg4LHN0cm9rZTojMzMzLHN0cm9rZS13aWR0aDozcHhcbiAgICBzdWJncmFwaCBtaXJhaSBbXCJNaXJhaSDmoYbmnrZcIl1cbiAgICAgICAgbWlyYWljb3JlYXBpKG1pcmFpLWNvcmUtYXBpKTo6OmNvcmVoaWdobGlnaHRcbiAgICAgICAgbWlyYWljb3JlcXFhbmRyb2lkKFwibWlyYWktY29yZTxici8-KFFRQW5kcm9pZCDljY_orq4pXCIpXG4gICAgICAgIG1pcmFpY29yZXFxYW5kcm9pZCAtLT4gfOaPkOS-m-WNj-iurnxtaXJhaWNvcmVhcGlcbiAgICBlbmRcbiAgICBtaXJhaWludGVyZmFjZShcIuS9oOe8luWGmeeahDxici8-5py65Zmo5Lq656iL5bqPXCIpXG4gICAgbWlyYWljb3JlYXBpIC0tPiB85o-Q5L6b5Z-656GA5Yqf6IO9fG1pcmFpaW50ZXJmYWNlXG4gICAgbWlyYWljb3JlYXBpIC0tPiB85bCB6KOF5Z-656GA5Yqf6IO9fG1pcmFpY29uc29sZWJhY2tlbmRcbiAgICBzdWJncmFwaCBtaXJhaWNvbnNvbGUgW1wiTWlyYWkgQ29uc29sZVwiXVxuICAgICAgICBtaXJhaWNvbnNvbGViYWNrZW5kKFwiQmFja0VuZFwiKVxuICAgICAgICBtaXJhaWNvbnNvbGVmcm9udGVuZC10ZXJtaW5hbChcIkZyb250RW5kOiB0ZXJtaW5hbFwiKVxuICAgICAgICBtaXJhaWNvbnNvbGVmcm9udGVuZC1hbmRyb2lkKFwiRnJvbnRFbmQ6IEFuZHJvaWRcIilcbiAgICAgICAgbWlyYWljb25zb2xlYmFja2VuZCAtLT4gbWlyYWljb25zb2xlZnJvbnRlbmQtdGVybWluYWxcbiAgICAgICAgbWlyYWljb25zb2xlYmFja2VuZCAtLT4gbWlyYWljb25zb2xlZnJvbnRlbmQtYW5kcm9pZFxuICAgIGVuZFxuICAgIHN1YmdyYXBoIGNvbnNvbGVwbHVnaW5zIFtcIk1pcmFpIENvbnNvbGUg5o-S5Lu2XCJdXG4gICAgICAgIHlvdXJtaXJhaXBsdWdpbihcIuS9oOe8luWGmeeahCBDb25zb2xlIOaPkuS7tlwiKVxuICAgICAgICBjaGF0Y29tbWFuZChcImNoYXQtY29tbWFuZCDmj5Lku7ZcIik6OjpoaWdobGlnaHRcbiAgICBlbmRcbiAgICB5b3VybWlyYWlwbHVnaW4gLS0-IG1pcmFpY29uc29sZWJhY2tlbmRcbiAgICBjaGF0Y29tbWFuZCAtLT4gbWlyYWljb25zb2xlYmFja2VuZCIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0In0sInVwZGF0ZUVkaXRvciI6ZmFsc2V9)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoiZmxvd2NoYXJ0IExSXG4gICAgY2xhc3NEZWYgY29yZWhpZ2hsaWdodCBmaWxsOiNmOTYsc3Ryb2tlOiMzMzMsc3Ryb2tlLXdpZHRoOjNweDtcbiAgICBjbGFzc0RlZiBoaWdobGlnaHQgZmlsbDojZjg4LHN0cm9rZTojMzMzLHN0cm9rZS13aWR0aDozcHhcbiAgICBzdWJncmFwaCBtaXJhaSBbXCJNaXJhaSDmoYbmnrZcIl1cbiAgICAgICAgbWlyYWljb3JlYXBpKG1pcmFpLWNvcmUtYXBpKTo6OmNvcmVoaWdobGlnaHRcbiAgICAgICAgbWlyYWljb3JlcXFhbmRyb2lkKFwibWlyYWktY29yZTxici8-KFFRQW5kcm9pZCDljY_orq4pXCIpXG4gICAgICAgIG1pcmFpY29yZXFxYW5kcm9pZCAtLT4gfOaPkOS-m-WNj-iurnxtaXJhaWNvcmVhcGlcbiAgICBlbmRcbiAgICBtaXJhaWludGVyZmFjZShcIuS9oOe8luWGmeeahDxici8-5py65Zmo5Lq656iL5bqPXCIpXG4gICAgbWlyYWljb3JlYXBpIC0tPiB85o-Q5L6b5Z-656GA5Yqf6IO9fG1pcmFpaW50ZXJmYWNlXG4gICAgbWlyYWljb3JlYXBpIC0tPiB85bCB6KOF5Z-656GA5Yqf6IO9fG1pcmFpY29uc29sZWJhY2tlbmRcbiAgICBzdWJncmFwaCBtaXJhaWNvbnNvbGUgW1wiTWlyYWkgQ29uc29sZVwiXVxuICAgICAgICBtaXJhaWNvbnNvbGViYWNrZW5kKFwiQmFja0VuZFwiKVxuICAgICAgICBtaXJhaWNvbnNvbGVmcm9udGVuZC10ZXJtaW5hbChcIkZyb250RW5kOiB0ZXJtaW5hbFwiKVxuICAgICAgICBtaXJhaWNvbnNvbGVmcm9udGVuZC1hbmRyb2lkKFwiRnJvbnRFbmQ6IEFuZHJvaWRcIilcbiAgICAgICAgbWlyYWljb25zb2xlYmFja2VuZCAtLT4gbWlyYWljb25zb2xlZnJvbnRlbmQtdGVybWluYWxcbiAgICAgICAgbWlyYWljb25zb2xlYmFja2VuZCAtLT4gbWlyYWljb25zb2xlZnJvbnRlbmQtYW5kcm9pZFxuICAgIGVuZFxuICAgIHN1YmdyYXBoIGNvbnNvbGVwbHVnaW5zIFtcIk1pcmFpIENvbnNvbGUg5o-S5Lu2XCJdXG4gICAgICAgIHlvdXJtaXJhaXBsdWdpbihcIuS9oOe8luWGmeeahCBDb25zb2xlIOaPkuS7tlwiKVxuICAgICAgICBjaGF0Y29tbWFuZChcImNoYXQtY29tbWFuZCDmj5Lku7ZcIik6OjpoaWdobGlnaHRcbiAgICBlbmRcbiAgICB5b3VybWlyYWlwbHVnaW4gLS0-IG1pcmFpY29uc29sZWJhY2tlbmRcbiAgICBjaGF0Y29tbWFuZCAtLT4gbWlyYWljb25zb2xlYmFja2VuZCIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0In0sInVwZGF0ZUVkaXRvciI6ZmFsc2V9)\n\n## [mirai-api-http](https://github.com/mamoe/mirai-api-http): Mirai Console 的官方 HTTP API 插件\n\n在 console 中提到，插件也可以使用 mirai-core-api 提供的基础接口， 而 mirai-api-http 插件就是一个将 mirai-core-api 的所有功能封装为 http 服务的插件，同时也提供了 WebSocket 服务。\n\n这样即使你不懂 Java 或 Kotlin，使用 mirai-api-http 插件，你也可以与 Mirai 交互，极大地增加了语言拓展性，也因此衍生出了许多基于 mirai-api-http 的社区 SDK。\n\n这些社区 SDK 封装了 mirai-api-http 提供的接口，且使用了其他语言的良好特性，使编写QQ机器人程序变得更加容易，高效。\n\n将 mirai-api-http 和部分 [社区 SDK](README.md#社区-sdk) 放入上述关系图：\n\n[![](https://mermaid.ink/img/eyJjb2RlIjoiZmxvd2NoYXJ0IExSXG4gICAgY2xhc3NEZWYgY29yZWhpZ2hsaWdodCBmaWxsOiNmOTYsc3Ryb2tlOiMzMzMsc3Ryb2tlLXdpZHRoOjNweDtcbiAgICBjbGFzc0RlZiBoaWdobGlnaHQgZmlsbDojZjg4LHN0cm9rZTojMzMzLHN0cm9rZS13aWR0aDozcHhcbiAgICBzdWJncmFwaCBtaXJhaSBbXCJNaXJhaSDmoYbmnrZcIl1cbiAgICAgICAgbWlyYWljb3JlYXBpKG1pcmFpLWNvcmUtYXBpKTo6OmNvcmVoaWdobGlnaHRcbiAgICAgICAgbWlyYWljb3JlcXFhbmRyb2lkKFwibWlyYWktY29yZTxici8-KFFRQW5kcm9pZCDljY_orq4pXCIpXG4gICAgICAgIG1pcmFpY29yZXFxYW5kcm9pZCAtLT4gfOaPkOS-m-WNj-iurnxtaXJhaWNvcmVhcGlcbiAgICBlbmRcbiAgICBtaXJhaWludGVyZmFjZShcIuS9oOe8luWGmeeahDxici8-5py65Zmo5Lq656iL5bqPXCIpXG4gICAgbWlyYWljb3JlYXBpIC0tPiB85o-Q5L6b5Z-656GA5Yqf6IO9fG1pcmFpaW50ZXJmYWNlXG4gICAgbWlyYWljb3JlYXBpIC0tPiB85bCB6KOF5Z-656GA5Yqf6IO9fG1pcmFpY29uc29sZWJhY2tlbmRcbiAgICBzdWJncmFwaCBtaXJhaWNvbnNvbGUgW1wiTWlyYWkgQ29uc29sZVwiXVxuICAgICAgICBtaXJhaWNvbnNvbGViYWNrZW5kKFwiQmFja0VuZFwiKVxuICAgICAgICBtaXJhaWNvbnNvbGVmcm9udGVuZC10ZXJtaW5hbChcIkZyb250RW5kOiB0ZXJtaW5hbFwiKVxuICAgICAgICBtaXJhaWNvbnNvbGVmcm9udGVuZC1hbmRyb2lkKFwiRnJvbnRFbmQ6IEFuZHJvaWRcIilcbiAgICAgICAgbWlyYWljb25zb2xlYmFja2VuZCAtLT4gbWlyYWljb25zb2xlZnJvbnRlbmQtdGVybWluYWxcbiAgICAgICAgbWlyYWljb25zb2xlYmFja2VuZCAtLT4gbWlyYWljb25zb2xlZnJvbnRlbmQtYW5kcm9pZFxuICAgIGVuZFxuICAgIHN1YmdyYXBoIGNvbnNvbGVwbHVnaW5zIFtcIk1pcmFpIENvbnNvbGUg5o-S5Lu2XCJdXG4gICAgICAgIHlvdXJtaXJhaXBsdWdpbihcIuS9oOe8luWGmeeahCBDb25zb2xlIOaPkuS7tlwiKSAtLT4gbWlyYWljb25zb2xlYmFja2VuZFxuICAgICAgICBjaGF0Y29tbWFuZChcImNoYXQtY29tbWFuZCDmj5Lku7ZcIikgLS0-IG1pcmFpY29uc29sZWJhY2tlbmRcbiAgICAgICAgbWlyYWlhcGlodHRwKFwibWlyYWktYXBpLWh0dHAg5o-S5Lu2XCIpOjo6aGlnaGxpZ2h0ICAtLT4gbWlyYWljb25zb2xlYmFja2VuZFxuICAgIGVuZFxuICAgIHN1YmdyYXBoIGNvbW11bml0eXNkayBbXCLnpL7ljLogU0RLXCJdXG4gICAgICAgIG1vcmUoXCIuLi5cIik6OjpoaWdobGlnaHQgLS0-IG1pcmFpYXBpaHR0cFxuICAgICAgICBqcyhcIm1pcmFpLWpzXCIpOjo6aGlnaGxpZ2h0IC0tPiBtaXJhaWFwaWh0dHBcbiAgICAgICAga3RzKFwibWlyYWkta3RzXCIpOjo6aGlnaGxpZ2h0IC0tPiBtaXJhaWFwaWh0dHBcbiAgICAgICAgcnMoXCJtaXJhaS1yc1wiKTo6OmhpZ2hsaWdodCAtLT4gbWlyYWlhcGlodHRwXG4gICAgZW5kIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifSwidXBkYXRlRWRpdG9yIjpmYWxzZX0)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoiZmxvd2NoYXJ0IExSXG4gICAgY2xhc3NEZWYgY29yZWhpZ2hsaWdodCBmaWxsOiNmOTYsc3Ryb2tlOiMzMzMsc3Ryb2tlLXdpZHRoOjNweDtcbiAgICBjbGFzc0RlZiBoaWdobGlnaHQgZmlsbDojZjg4LHN0cm9rZTojMzMzLHN0cm9rZS13aWR0aDozcHhcbiAgICBzdWJncmFwaCBtaXJhaSBbXCJNaXJhaSDmoYbmnrZcIl1cbiAgICAgICAgbWlyYWljb3JlYXBpKG1pcmFpLWNvcmUtYXBpKTo6OmNvcmVoaWdobGlnaHRcbiAgICAgICAgbWlyYWljb3JlcXFhbmRyb2lkKFwibWlyYWktY29yZTxici8-KFFRQW5kcm9pZCDljY_orq4pXCIpXG4gICAgICAgIG1pcmFpY29yZXFxYW5kcm9pZCAtLT4gfOaPkOS-m-WNj-iurnxtaXJhaWNvcmVhcGlcbiAgICBlbmRcbiAgICBtaXJhaWludGVyZmFjZShcIuS9oOe8luWGmeeahDxici8-5py65Zmo5Lq656iL5bqPXCIpXG4gICAgbWlyYWljb3JlYXBpIC0tPiB85o-Q5L6b5Z-656GA5Yqf6IO9fG1pcmFpaW50ZXJmYWNlXG4gICAgbWlyYWljb3JlYXBpIC0tPiB85bCB6KOF5Z-656GA5Yqf6IO9fG1pcmFpY29uc29sZWJhY2tlbmRcbiAgICBzdWJncmFwaCBtaXJhaWNvbnNvbGUgW1wiTWlyYWkgQ29uc29sZVwiXVxuICAgICAgICBtaXJhaWNvbnNvbGViYWNrZW5kKFwiQmFja0VuZFwiKVxuICAgICAgICBtaXJhaWNvbnNvbGVmcm9udGVuZC10ZXJtaW5hbChcIkZyb250RW5kOiB0ZXJtaW5hbFwiKVxuICAgICAgICBtaXJhaWNvbnNvbGVmcm9udGVuZC1hbmRyb2lkKFwiRnJvbnRFbmQ6IEFuZHJvaWRcIilcbiAgICAgICAgbWlyYWljb25zb2xlYmFja2VuZCAtLT4gbWlyYWljb25zb2xlZnJvbnRlbmQtdGVybWluYWxcbiAgICAgICAgbWlyYWljb25zb2xlYmFja2VuZCAtLT4gbWlyYWljb25zb2xlZnJvbnRlbmQtYW5kcm9pZFxuICAgIGVuZFxuICAgIHN1YmdyYXBoIGNvbnNvbGVwbHVnaW5zIFtcIk1pcmFpIENvbnNvbGUg5o-S5Lu2XCJdXG4gICAgICAgIHlvdXJtaXJhaXBsdWdpbihcIuS9oOe8luWGmeeahCBDb25zb2xlIOaPkuS7tlwiKSAtLT4gbWlyYWljb25zb2xlYmFja2VuZFxuICAgICAgICBjaGF0Y29tbWFuZChcImNoYXQtY29tbWFuZCDmj5Lku7ZcIikgLS0-IG1pcmFpY29uc29sZWJhY2tlbmRcbiAgICAgICAgbWlyYWlhcGlodHRwKFwibWlyYWktYXBpLWh0dHAg5o-S5Lu2XCIpOjo6aGlnaGxpZ2h0ICAtLT4gbWlyYWljb25zb2xlYmFja2VuZFxuICAgIGVuZFxuICAgIHN1YmdyYXBoIGNvbW11bml0eXNkayBbXCLnpL7ljLogU0RLXCJdXG4gICAgICAgIG1vcmUoXCIuLi5cIik6OjpoaWdobGlnaHQgLS0-IG1pcmFpYXBpaHR0cFxuICAgICAgICBqcyhcIm1pcmFpLWpzXCIpOjo6aGlnaGxpZ2h0IC0tPiBtaXJhaWFwaWh0dHBcbiAgICAgICAga3RzKFwibWlyYWkta3RzXCIpOjo6aGlnaGxpZ2h0IC0tPiBtaXJhaWFwaWh0dHBcbiAgICAgICAgcnMoXCJtaXJhaS1yc1wiKTo6OmhpZ2hsaWdodCAtLT4gbWlyYWlhcGlodHRwXG4gICAgZW5kIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifSwidXBkYXRlRWRpdG9yIjpmYWxzZX0)\n\n## [mirai-native](https://github.com/iTXTech/mirai-native): 与 CoolQ 对接的一个通道\n\n如果你是 酷Q 用户，想在 Mirai 中使用 酷Q 插件，你可以使用 mirai-native 插件，它可以加载 CQP.dll 并兼容**大部分**酷Q 插件，但**不支持** CPK 和解包的 DLL。\n\n不过 酷Q 已经停止提供服务，我们也不再建议使用 酷Q 的插件。\n\n将 mirai-native 放入上述关系图：\n\n[![](https://mermaid.ink/img/eyJjb2RlIjoiZmxvd2NoYXJ0IExSXG4gICAgY2xhc3NEZWYgY29yZWhpZ2hsaWdodCBmaWxsOiNmOTYsc3Ryb2tlOiMzMzMsc3Ryb2tlLXdpZHRoOjNweDtcbiAgICBjbGFzc0RlZiBoaWdobGlnaHQgZmlsbDojZjg4LHN0cm9rZTojMzMzLHN0cm9rZS13aWR0aDozcHhcbiAgICBzdWJncmFwaCBtaXJhaSBbXCJNaXJhaSDmoYbmnrZcIl1cbiAgICAgICAgbWlyYWljb3JlYXBpKFwibWlyYWktY29yZS1hcGlcIik6Ojpjb3JlaGlnaGxpZ2h0XG4gICAgICAgIG1pcmFpY29yZXFxYW5kcm9pZChcIm1pcmFpLWNvcmU8YnIvPihRUUFuZHJvaWQg5Y2P6K6uKVwiKVxuICAgICAgICBtaXJhaWNvcmVxcWFuZHJvaWQgLS0-IHzmj5DkvpvljY_orq58bWlyYWljb3JlYXBpXG4gICAgZW5kXG4gICAgbWlyYWlpbnRlcmZhY2UoXCLkvaDnvJblhpnnmoQ8YnIvPuacuuWZqOS6uueoi-W6j1wiKVxuICAgIG1pcmFpY29yZWFwaSAtLT4gfOaPkOS-m-WfuuehgOWKn-iDvXxtaXJhaWludGVyZmFjZVxuICAgIG1pcmFpY29yZWFwaSAtLT4gfOWwgeijheWfuuehgOWKn-iDvXxtaXJhaWNvbnNvbGViYWNrZW5kXG4gICAgc3ViZ3JhcGggbWlyYWljb25zb2xlIFtcIk1pcmFpIENvbnNvbGVcIl1cbiAgICAgICAgbWlyYWljb25zb2xlYmFja2VuZChcIkJhY2tFbmRcIilcbiAgICAgICAgbWlyYWljb25zb2xlZnJvbnRlbmQtdGVybWluYWwoXCJGcm9udEVuZDogdGVybWluYWxcIilcbiAgICAgICAgbWlyYWljb25zb2xlZnJvbnRlbmQtYW5kcm9pZChcIkZyb250RW5kOiBBbmRyb2lkXCIpXG4gICAgICAgIG1pcmFpY29uc29sZWJhY2tlbmQgLS0-IG1pcmFpY29uc29sZWZyb250ZW5kLXRlcm1pbmFsXG4gICAgICAgIG1pcmFpY29uc29sZWJhY2tlbmQgLS0-IG1pcmFpY29uc29sZWZyb250ZW5kLWFuZHJvaWRcbiAgICBlbmRcbiAgICBzdWJncmFwaCBjb25zb2xlcGx1Z2lucyBbXCJNaXJhaSBDb25zb2xlIOaPkuS7tlwiXVxuICAgICAgICB5b3VybWlyYWljb25zb2xlcGx1Z2luKFwi5L2g57yW5YaZ55qEIENvbnNvbGUg5o-S5Lu2XCIpIC0tPiBtaXJhaWNvbnNvbGViYWNrZW5kXG4gICAgICAgIG1pcmFpYXBpaHR0cChcIm1pcmFpLWFwaS1odHRwIOaPkuS7tlwiKSAgLS0-IG1pcmFpY29uc29sZWJhY2tlbmRcbiAgICAgICAgb3RoZXJzbWlyYWlwbHVnaW4oXCLlhbbku5YgQ29uc29sZSDmj5Lku7ZcIikgLS0-IG1pcmFpY29uc29sZWJhY2tlbmRcbiAgICAgICAgbWlyYWluYXRpdmUoXCJtaXJhaS1uYXRpdmUg5o-S5Lu2XCIpOjo6aGlnaGxpZ2h0IC0tPiBtaXJhaWNvbnNvbGViYWNrZW5kXG4gICAgZW5kXG4gICAgc3ViZ3JhcGggY29tbXVuaXR5c2RrIFtcIuekvuWMuiBTREtcIl1cbiAgICAgICAgY29tbXVuaXR5c2RrYmFzZWVkb25taXJhaWFwaWh0dHAoXCLln7rkuo4gbWlyYWktYXBpLWh0dHAg55qE56S-5Yy6IFNES1wiKSAtLT4gbWlyYWlhcGlodHRwXG4gICAgZW5kXG4gICAgY29vbHFwbHVnaW5zKFwi6YW3UeaPkuS7tlwiKTo6OmhpZ2hsaWdodCAtLT4gbWlyYWluYXRpdmUiLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9LCJ1cGRhdGVFZGl0b3IiOmZhbHNlfQ)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoiZmxvd2NoYXJ0IExSXG4gICAgY2xhc3NEZWYgY29yZWhpZ2hsaWdodCBmaWxsOiNmOTYsc3Ryb2tlOiMzMzMsc3Ryb2tlLXdpZHRoOjNweDtcbiAgICBjbGFzc0RlZiBoaWdobGlnaHQgZmlsbDojZjg4LHN0cm9rZTojMzMzLHN0cm9rZS13aWR0aDozcHhcbiAgICBzdWJncmFwaCBtaXJhaSBbXCJNaXJhaSDmoYbmnrZcIl1cbiAgICAgICAgbWlyYWljb3JlYXBpKFwibWlyYWktY29yZS1hcGlcIik6Ojpjb3JlaGlnaGxpZ2h0XG4gICAgICAgIG1pcmFpY29yZXFxYW5kcm9pZChcIm1pcmFpLWNvcmU8YnIvPihRUUFuZHJvaWQg5Y2P6K6uKVwiKVxuICAgICAgICBtaXJhaWNvcmVxcWFuZHJvaWQgLS0-IHzmj5DkvpvljY_orq58bWlyYWljb3JlYXBpXG4gICAgZW5kXG4gICAgbWlyYWlpbnRlcmZhY2UoXCLkvaDnvJblhpnnmoQ8YnIvPuacuuWZqOS6uueoi-W6j1wiKVxuICAgIG1pcmFpY29yZWFwaSAtLT4gfOaPkOS-m-WfuuehgOWKn-iDvXxtaXJhaWludGVyZmFjZVxuICAgIG1pcmFpY29yZWFwaSAtLT4gfOWwgeijheWfuuehgOWKn-iDvXxtaXJhaWNvbnNvbGViYWNrZW5kXG4gICAgc3ViZ3JhcGggbWlyYWljb25zb2xlIFtcIk1pcmFpIENvbnNvbGVcIl1cbiAgICAgICAgbWlyYWljb25zb2xlYmFja2VuZChcIkJhY2tFbmRcIilcbiAgICAgICAgbWlyYWljb25zb2xlZnJvbnRlbmQtdGVybWluYWwoXCJGcm9udEVuZDogdGVybWluYWxcIilcbiAgICAgICAgbWlyYWljb25zb2xlZnJvbnRlbmQtYW5kcm9pZChcIkZyb250RW5kOiBBbmRyb2lkXCIpXG4gICAgICAgIG1pcmFpY29uc29sZWJhY2tlbmQgLS0-IG1pcmFpY29uc29sZWZyb250ZW5kLXRlcm1pbmFsXG4gICAgICAgIG1pcmFpY29uc29sZWJhY2tlbmQgLS0-IG1pcmFpY29uc29sZWZyb250ZW5kLWFuZHJvaWRcbiAgICBlbmRcbiAgICBzdWJncmFwaCBjb25zb2xlcGx1Z2lucyBbXCJNaXJhaSBDb25zb2xlIOaPkuS7tlwiXVxuICAgICAgICB5b3VybWlyYWljb25zb2xlcGx1Z2luKFwi5L2g57yW5YaZ55qEIENvbnNvbGUg5o-S5Lu2XCIpIC0tPiBtaXJhaWNvbnNvbGViYWNrZW5kXG4gICAgICAgIG1pcmFpYXBpaHR0cChcIm1pcmFpLWFwaS1odHRwIOaPkuS7tlwiKSAgLS0-IG1pcmFpY29uc29sZWJhY2tlbmRcbiAgICAgICAgb3RoZXJzbWlyYWlwbHVnaW4oXCLlhbbku5YgQ29uc29sZSDmj5Lku7ZcIikgLS0-IG1pcmFpY29uc29sZWJhY2tlbmRcbiAgICAgICAgbWlyYWluYXRpdmUoXCJtaXJhaS1uYXRpdmUg5o-S5Lu2XCIpOjo6aGlnaGxpZ2h0IC0tPiBtaXJhaWNvbnNvbGViYWNrZW5kXG4gICAgZW5kXG4gICAgc3ViZ3JhcGggY29tbXVuaXR5c2RrIFtcIuekvuWMuiBTREtcIl1cbiAgICAgICAgY29tbXVuaXR5c2RrYmFzZWVkb25taXJhaWFwaWh0dHAoXCLln7rkuo4gbWlyYWktYXBpLWh0dHAg55qE56S-5Yy6IFNES1wiKSAtLT4gbWlyYWlhcGlodHRwXG4gICAgZW5kXG4gICAgY29vbHFwbHVnaW5zKFwi6YW3UeaPkuS7tlwiKTo6OmhpZ2hsaWdodCAtLT4gbWlyYWluYXRpdmUiLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9LCJ1cGRhdGVFZGl0b3IiOmZhbHNlfQ)\n\n## [**mirai-console-loader**](https://github.com/iTXTech/mirai-console-loader): Mirai Console 的官方一键启动器\n\n前面说道我们可以直接在终端运行 mirai-console 的前端 mirai-console-terminal，然而想运行起来 mirai-console-terminal 却不是很容易的事情：你需要下载好 Mirai 官方发布的 mirai-core，mirai-console 和 mirai-console-terminal 的 jar 文件，你还需要知道 terminal 前端的入口是 **net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader**，然后你还需要通过一大串指令启动它。\n\n```bash\njava -cp \"上述jar文件路径\" net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader\n```\n\n这种复杂的启动方式劝退了许多新手，尤其是未曾听说过 JVM 的新手。\n\nmirai-console-loader 应运而生，它的工作就是简化 console 启动流程，一键帮你下载 jar 文件，自动更新，文件损坏检查...... 你能在手动启动时担心的问题 mirai-console-loader 都帮你想到了！你只需要：\n\n```bash\n./mcl\n```\n\n即可快速启动 mirai-console 的 terminal 前端。同时 mirai-console-loader 还有一些拓展功能，可以自定义你的启动流程。\n\n将 mirai-console-loader 放入上述关系图：\n\n[![](https://mermaid.ink/img/eyJjb2RlIjoiZmxvd2NoYXJ0IExSXG4gICAgY2xhc3NEZWYgY29yZWhpZ2hsaWdodCBmaWxsOiNmOTYsc3Ryb2tlOiMzMzMsc3Ryb2tlLXdpZHRoOjNweDtcbiAgICBjbGFzc0RlZiBoaWdobGlnaHQgZmlsbDojZjg4LHN0cm9rZTojMzMzLHN0cm9rZS13aWR0aDozcHhcbiAgICBzdWJncmFwaCBtaXJhaSBbXCJNaXJhaSDmoYbmnrZcIl1cbiAgICAgICAgbWlyYWljb3JlYXBpKFwibWlyYWktY29yZS1hcGlcIik6Ojpjb3JlaGlnaGxpZ2h0XG4gICAgICAgIG1pcmFpY29yZXFxYW5kcm9pZChcIm1pcmFpLWNvcmU8YnIvPihRUUFuZHJvaWQg5Y2P6K6uKVwiKVxuICAgICAgICBtaXJhaWNvcmVxcWFuZHJvaWQgLS0-IHzmj5DkvpvljY_orq58bWlyYWljb3JlYXBpXG4gICAgZW5kXG4gICAgbWlyYWlpbnRlcmZhY2UoXCLkvaDnvJblhpnnmoQ8YnIvPuacuuWZqOS6uueoi-W6j1wiKVxuICAgIG1pcmFpY29yZWFwaSAtLT4gfOaPkOS-m-WfuuehgOWKn-iDvXxtaXJhaWludGVyZmFjZVxuICAgIG1pcmFpY29yZWFwaSAtLT4gfOWwgeijheWfuuehgOWKn-iDvXxtaXJhaWNvbnNvbGViYWNrZW5kXG4gICAgc3ViZ3JhcGggbWlyYWljb25zb2xlIFtcIk1pcmFpIENvbnNvbGVcIl1cbiAgICAgICAgbWlyYWljb25zb2xlYmFja2VuZChcIkJhY2tFbmRcIilcbiAgICAgICAgbWlyYWljb25zb2xlZnJvbnRlbmQtdGVybWluYWwoXCJGcm9udEVuZDogdGVybWluYWxcIilcbiAgICAgICAgbWlyYWljb25zb2xlZnJvbnRlbmQtYW5kcm9pZChcIkZyb250RW5kOiBBbmRyb2lkXCIpXG4gICAgICAgIG1pcmFpY29uc29sZWJhY2tlbmQgLS0-IG1pcmFpY29uc29sZWZyb250ZW5kLXRlcm1pbmFsXG4gICAgICAgIG1pcmFpY29uc29sZWJhY2tlbmQgLS0-IG1pcmFpY29uc29sZWZyb250ZW5kLWFuZHJvaWRcbiAgICBlbmRcbiAgICBzdWJncmFwaCBjb25zb2xlcGx1Z2lucyBbXCJNaXJhaSBDb25zb2xlIOaPkuS7tlwiXVxuICAgICAgICB5b3VybWlyYWljb25zb2xlcGx1Z2luKFwi5L2g57yW5YaZ55qEIENvbnNvbGUg5o-S5Lu2XCIpIC0tPiBtaXJhaWNvbnNvbGViYWNrZW5kXG4gICAgICAgIG1pcmFpYXBpaHR0cChcIm1pcmFpLWFwaS1odHRwIOaPkuS7tlwiKSAgLS0-IG1pcmFpY29uc29sZWJhY2tlbmRcbiAgICAgICAgb3RoZXJzbWlyYWlwbHVnaW4oXCLlhbbku5YgQ29uc29sZSDmj5Lku7ZcIikgLS0-IG1pcmFpY29uc29sZWJhY2tlbmRcbiAgICAgICAgbWlyYWluYXRpdmUoXCJtaXJhaS1uYXRpdmUg5o-S5Lu2XCIpIC0tPiBtaXJhaWNvbnNvbGViYWNrZW5kXG4gICAgZW5kXG4gICAgc3ViZ3JhcGggY29tbXVuaXR5c2RrIFtcIuekvuWMuiBTREtcIl1cbiAgICAgICAgY29tbXVuaXR5c2RrYmFzZWVkb25taXJhaWFwaWh0dHAoXCLln7rkuo4gbWlyYWktYXBpLWh0dHAg55qE56S-5Yy6IFNES1wiKSAtLT4gbWlyYWlhcGlodHRwXG4gICAgZW5kXG4gICAgY29vbHFwbHVnaW5zKFwi6YW3UeaPkuS7tlwiKSAtLT4gbWlyYWluYXRpdmVcbiAgICBtaXJhaWNvbnNvbGVsb2FkZXIoXCJtaXJhaS1jb25zb2xlLWxvYWRlclwiKTo6OmhpZ2hsaWdodCAtLS0-IHzlkK_liqh8bWlyYWljb25zb2xlZnJvbnRlbmQtdGVybWluYWxcbiIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0In0sInVwZGF0ZUVkaXRvciI6ZmFsc2V9)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoiZmxvd2NoYXJ0IExSXG4gICAgY2xhc3NEZWYgY29yZWhpZ2hsaWdodCBmaWxsOiNmOTYsc3Ryb2tlOiMzMzMsc3Ryb2tlLXdpZHRoOjNweDtcbiAgICBjbGFzc0RlZiBoaWdobGlnaHQgZmlsbDojZjg4LHN0cm9rZTojMzMzLHN0cm9rZS13aWR0aDozcHhcbiAgICBzdWJncmFwaCBtaXJhaSBbXCJNaXJhaSDmoYbmnrZcIl1cbiAgICAgICAgbWlyYWljb3JlYXBpKFwibWlyYWktY29yZS1hcGlcIik6Ojpjb3JlaGlnaGxpZ2h0XG4gICAgICAgIG1pcmFpY29yZXFxYW5kcm9pZChcIm1pcmFpLWNvcmU8YnIvPihRUUFuZHJvaWQg5Y2P6K6uKVwiKVxuICAgICAgICBtaXJhaWNvcmVxcWFuZHJvaWQgLS0-IHzmj5DkvpvljY_orq58bWlyYWljb3JlYXBpXG4gICAgZW5kXG4gICAgbWlyYWlpbnRlcmZhY2UoXCLkvaDnvJblhpnnmoQ8YnIvPuacuuWZqOS6uueoi-W6j1wiKVxuICAgIG1pcmFpY29yZWFwaSAtLT4gfOaPkOS-m-WfuuehgOWKn-iDvXxtaXJhaWludGVyZmFjZVxuICAgIG1pcmFpY29yZWFwaSAtLT4gfOWwgeijheWfuuehgOWKn-iDvXxtaXJhaWNvbnNvbGViYWNrZW5kXG4gICAgc3ViZ3JhcGggbWlyYWljb25zb2xlIFtcIk1pcmFpIENvbnNvbGVcIl1cbiAgICAgICAgbWlyYWljb25zb2xlYmFja2VuZChcIkJhY2tFbmRcIilcbiAgICAgICAgbWlyYWljb25zb2xlZnJvbnRlbmQtdGVybWluYWwoXCJGcm9udEVuZDogdGVybWluYWxcIilcbiAgICAgICAgbWlyYWljb25zb2xlZnJvbnRlbmQtYW5kcm9pZChcIkZyb250RW5kOiBBbmRyb2lkXCIpXG4gICAgICAgIG1pcmFpY29uc29sZWJhY2tlbmQgLS0-IG1pcmFpY29uc29sZWZyb250ZW5kLXRlcm1pbmFsXG4gICAgICAgIG1pcmFpY29uc29sZWJhY2tlbmQgLS0-IG1pcmFpY29uc29sZWZyb250ZW5kLWFuZHJvaWRcbiAgICBlbmRcbiAgICBzdWJncmFwaCBjb25zb2xlcGx1Z2lucyBbXCJNaXJhaSBDb25zb2xlIOaPkuS7tlwiXVxuICAgICAgICB5b3VybWlyYWljb25zb2xlcGx1Z2luKFwi5L2g57yW5YaZ55qEIENvbnNvbGUg5o-S5Lu2XCIpIC0tPiBtaXJhaWNvbnNvbGViYWNrZW5kXG4gICAgICAgIG1pcmFpYXBpaHR0cChcIm1pcmFpLWFwaS1odHRwIOaPkuS7tlwiKSAgLS0-IG1pcmFpY29uc29sZWJhY2tlbmRcbiAgICAgICAgb3RoZXJzbWlyYWlwbHVnaW4oXCLlhbbku5YgQ29uc29sZSDmj5Lku7ZcIikgLS0-IG1pcmFpY29uc29sZWJhY2tlbmRcbiAgICAgICAgbWlyYWluYXRpdmUoXCJtaXJhaS1uYXRpdmUg5o-S5Lu2XCIpIC0tPiBtaXJhaWNvbnNvbGViYWNrZW5kXG4gICAgZW5kXG4gICAgc3ViZ3JhcGggY29tbXVuaXR5c2RrIFtcIuekvuWMuiBTREtcIl1cbiAgICAgICAgY29tbXVuaXR5c2RrYmFzZWVkb25taXJhaWFwaWh0dHAoXCLln7rkuo4gbWlyYWktYXBpLWh0dHAg55qE56S-5Yy6IFNES1wiKSAtLT4gbWlyYWlhcGlodHRwXG4gICAgZW5kXG4gICAgY29vbHFwbHVnaW5zKFwi6YW3UeaPkuS7tlwiKSAtLT4gbWlyYWluYXRpdmVcbiAgICBtaXJhaWNvbnNvbGVsb2FkZXIoXCJtaXJhaS1jb25zb2xlLWxvYWRlclwiKTo6OmhpZ2hsaWdodCAtLS0-IHzlkK_liqh8bWlyYWljb25zb2xlZnJvbnRlbmQtdGVybWluYWxcbiIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0In0sInVwZGF0ZUVkaXRvciI6ZmFsc2V9)\n\n------\n\n本文作者 [@StageGuard](https://github.com/StageGuard)。如有疏漏或错误，欢迎[提出 Issue](https://github.com/mamoe/mirai/issues/new) 修正。\n\n实体关系图采用 [Mermaid](https://github.com/mermaid-js/mermaid) 绘制。\n\n> [回到 Mirai 文档索引](README.md)\n\n### 变更记录\n\n当前版本：`1.2.0` (2021/1/24)\n\n- `1.0.0`: 2020/12/13\n  - [PR 初始版本](https://github.com/mamoe/mirai/pull/710)\n- `1.1.0`: 2021/1/13\n  - 增加了作者信息\n- `1.2.0`: 2021/1/24\n  - 进行了语言精简, 简化关系图\n"
  },
  {
    "path": "docs/mocking/Mocking.md",
    "content": "# Mirai - Mocking\n\n本章节介绍 mirai 模拟环境\n\n> mirai 模拟环境从 `2.13` 开始支持\n>\n> 注:\n> - **不支持**同时运行模拟环境和真实环境\n> - **不支持**从模拟环境切换回真实环境\n\n-----------------------------------\n\n# 在非 console 中进行模拟\n\n## 环境准备\n\n要使用 mirai 模拟环境测试框架, 首先需要额外添加一项依赖\n\n```kotlin\ndependencies {\n    testImplementation(\"net.mamoe:mirai-core-mock:$VERSION\")\n}\n```\n\n并在本地的测试入口添加以下的代码\n\n```kotlin\ninternal fun main() {\n    MockBotFactory.initialize()\n    // .....\n}\n```\n\n## 创建 Bot\n\n对于创建 `MockBot`, 更好的方法是使用 `MockBotFactory.newMockBotBuilder()`\n\n也可以使用原始的 `BotFactory` 来创建一个新的 `MockBot`, 系统会使用默认值填充相关的信息\n\n## 使用\n\n关于 `MockBot` 可以在 [这里](https://github.com/mamoe/mirai/tree/dev/mirai-core-mock/test/mock)\n找到 mirai-core-mock 的相关用法\n\n可以在 [DslTest.kt](https://github.com/mamoe/mirai/blob/dev/mirai-core-mock/test/DslTest.kt)\n中找到关于 mirai-core-mock DSL 的用法\n\n----------------\n\n# 在 console 中进行模拟\n\nWork In Progress...\n"
  },
  {
    "path": "docs/src/Contacts.mermaid.md",
    "content": "```mermaid\nclassDiagram\n\nclass Bot {\n    +friends: ContactList\n    +groups: ContactList\n    +getFriend(Long) Friend?\n    +getFriendOrNull(Long) Friend\n    +getGroup(Long) Group?\n    +getGroupOrFail(Long) Group\n    +login()\n    +close()\n}\n\nclass ContactOrBot {\n    +id: Int\n    +avatarUrl: String\n}\n\nclass UserOrBot {\n    +nudge() Nudge\n}\n\nclass Contact {\n    +bot: Bot\n    +sendMessage(Message) MessageReceipt\n    +sendMessage(String) MessageReceipt\n    +uploadImage(ExternalImage) Image\n}\n\nclass User {\n    +nick: String\n    +remark: String\n    +queryProfile() UserProfile\n}\n\nclass Group {\n    +members: ContactList\n    +name: String\n    +settings: GroupSettings\n    +owner: NormalMember\n    +botMuteRemaining: Long\n    +botPermission: MemberPermission\n    +quit() Boolean\n    +uploadVoice() Voice\n}\n\nclass NormalMember {\n    +mute()\n    +kick()\n}\n\nclass AnonymousMember {\n    +anonymousId: String\n}\n\nclass Member {\n    +group: Group\n}\n\nclass OtherClient {\n    +info\n}\n\nContactOrBot<|--Contact\nContactOrBot<|--UserOrBot\n\nUserOrBot<|--Bot\nUserOrBot<|--User\n\nContact<|--User\nContact<|--Group\nContact<|--OtherClient\n\nUser<|--Member\nUser<|--Friend\n\nMember<|--NormalMember\nMember<|--AnonymousMember\n```"
  },
  {
    "path": "docs/src/Messages.mermaid.md",
    "content": "```mermaid\nclassDiagram\n\nclass MessageChain\nMessageChain : List~SingleMessage~\n\nMessage<|--MessageChain\nMessage<|--SingleMessage\n\nMessageChain o-- SingleMessage\n\nSingleMessage<|--MessageContent\nSingleMessage<|--MessageMetadata\n\n\n%%%\n\n\nMessageMetadata<|--QuoteReply\nMessageMetadata<|--MessageSource\n\n\n%%\n\nMessageSource<|--OnlineMessageSource\nMessageSource<|--OfflineMessageSource\n\nMessageContent<|--PlainText\nMessageContent<|--Image\nMessageContent<|--At\nMessageContent<|--AtAll\nMessageContent<|--Face\nMessageContent<|--ForwardMessage\n\nMessageContent<|--HummerMessage\nHummerMessage<|--PokeMessage\nHummerMessage<|--VipFace\nHummerMessage<|--FlashImage\n\nMessageContent<|--RichMessage\nRichMessage<|--ServiceMessage\nRichMessage<|--LightApp\n\n\nMessageContent<|--PttMessage\nPttMessage<|--Voice\n```"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#\n# Copyright 2019-2023 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.0-bin.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "gradle.properties",
    "content": "#\n# Copyright 2019-2023 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\nkotlin.code.style=official\n# config\nkotlin.incremental.multiplatform=true\norg.gradle.jvmargs=-Xmx7000m -Dfile.encoding=UTF-8 --illegal-access=permit -Dkotlin.daemon.jvm.options=--illegal-access=permit --add-opens java.base/java.util=ALL-UNNAMED\norg.gradle.parallel=true\norg.gradle.vfs.watch=true\n#kotlin.mpp.enableCompatibilityMetadataVariant=true\nsystemProp.org.gradle.internal.publish.checksums.insecure=true\ngnsp.disableApplyOnlyOnRootProjectEnforcement=true\nmirai.android.target.api.level=21\n# Enable if you want to use mavenLocal for both Gradle plugin and project dependencies resolutions.\nsystemProp.use.maven.local=false\norg.gradle.caching=true\nkotlin.mpp.enableCInteropCommonization=true\nkotlin.mpp.stability.nowarn=true\nkotlin.mpp.androidSourceSetLayoutVersion=2\nandroid.disableAutomaticComponentCreation=true\nandroid.useAndroidX=true"
  },
  {
    "path": "gradlew",
    "content": "#!/bin/sh\n\n#\n# Copyright 2019-2023 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\n##############################################################################\n#\n#   Gradle start up script for POSIX generated by Gradle.\n#\n#   Important for running:\n#\n#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is\n#       noncompliant, but you have some other compliant shell such as ksh or\n#       bash, then to run this script, type that shell name before the whole\n#       command line, like:\n#\n#           ksh Gradle\n#\n#       Busybox and similar reduced shells will NOT work, because this script\n#       requires all of these POSIX shell features:\n#         * functions;\n#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,\n#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;\n#         * compound commands having a testable exit status, especially «case»;\n#         * various built-in commands including «command», «set», and «ulimit».\n#\n#   Important for patching:\n#\n#   (2) This script targets any POSIX shell, so it avoids extensions provided\n#       by Bash, Ksh, etc; in particular arrays are avoided.\n#\n#       The \"traditional\" practice of packing multiple parameters into a\n#       space-separated string is a well documented source of bugs and security\n#       problems, so this is (mostly) avoided, by progressively accumulating\n#       options in \"$@\", and eventually passing that to Java.\n#\n#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,\n#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;\n#       see the in-line comments for details.\n#\n#       There are tweaks for specific operating systems such as AIX, CygWin,\n#       Darwin, MinGW, and NonStop.\n#\n#   (3) This script is generated from the Groovy template\n#       https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt\n#       within the Gradle project.\n#\n#       You can find Gradle at https://github.com/gradle/gradle/.\n#\n##############################################################################\n\n# Attempt to set APP_HOME\n\n# Resolve links: $0 may be a link\napp_path=$0\n\n# Need this for daisy-chained symlinks.\nwhile\n    APP_HOME=${app_path%\"${app_path##*/}\"}  # leaves a trailing /; empty if no leading path\n    [ -h \"$app_path\" ]\ndo\n    ls=$( ls -ld \"$app_path\" )\n    link=${ls#*' -> '}\n    case $link in             #(\n      /*)   app_path=$link ;; #(\n      *)    app_path=$APP_HOME$link ;;\n    esac\ndone\n\nAPP_HOME=$( cd \"${APP_HOME:-./}\" && pwd -P ) || exit\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=${0##*/}\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=maximum\n\nwarn () {\n    echo \"$*\"\n} >&2\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n} >&2\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"$( uname )\" in                #(\n  CYGWIN* )         cygwin=true  ;; #(\n  Darwin* )         darwin=true  ;; #(\n  MSYS* | MINGW* )  msys=true    ;; #(\n  NONSTOP* )        nonstop=true ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=$JAVA_HOME/jre/sh/java\n    else\n        JAVACMD=$JAVA_HOME/bin/java\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=java\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif ! \"$cygwin\" && ! \"$darwin\" && ! \"$nonstop\" ; then\n    case $MAX_FD in #(\n      max*)\n        MAX_FD=$( ulimit -H -n ) ||\n            warn \"Could not query maximum file descriptor limit\"\n    esac\n    case $MAX_FD in  #(\n      '' | soft) :;; #(\n      *)\n        ulimit -n \"$MAX_FD\" ||\n            warn \"Could not set maximum file descriptor limit to $MAX_FD\"\n    esac\nfi\n\n# Collect all arguments for the java command, stacking in reverse order:\n#   * args from the command line\n#   * the main class name\n#   * -classpath\n#   * -D...appname settings\n#   * --module-path (only if needed)\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif \"$cygwin\" || \"$msys\" ; then\n    APP_HOME=$( cygpath --path --mixed \"$APP_HOME\" )\n    CLASSPATH=$( cygpath --path --mixed \"$CLASSPATH\" )\n\n    JAVACMD=$( cygpath --unix \"$JAVACMD\" )\n\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    for arg do\n        if\n            case $arg in                                #(\n              -*)   false ;;                            # don't mess with options #(\n              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath\n                    [ -e \"$t\" ] ;;                      #(\n              *)    false ;;\n            esac\n        then\n            arg=$( cygpath --path --ignore --mixed \"$arg\" )\n        fi\n        # Roll the args list around exactly as many times as the number of\n        # args, so each arg winds up back in the position where it started, but\n        # possibly modified.\n        #\n        # NB: a `for` loop captures its iteration list before it begins, so\n        # changing the positional parameters here affects neither the number of\n        # iterations, nor the values presented in `arg`.\n        shift                   # remove old arg\n        set -- \"$@\" \"$arg\"      # push replacement arg\n    done\nfi\n\n# Collect all arguments for the java command;\n#   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of\n#     shell script including quotes and variable substitutions, so put them in\n#     double quotes to make sure that they get re-expanded; and\n#   * put everything else in single quotes, so that it's not re-expanded.\n\nset -- \\\n        \"-Dorg.gradle.appname=$APP_BASE_NAME\" \\\n        -classpath \"$CLASSPATH\" \\\n        org.gradle.wrapper.GradleWrapperMain \\\n        \"$@\"\n\n# Use \"xargs\" to parse quoted args.\n#\n# With -n1 it outputs one arg per line, with the quotes and backslashes removed.\n#\n# In Bash we could simply go:\n#\n#   readarray ARGS < <( xargs -n1 <<<\"$var\" ) &&\n#   set -- \"${ARGS[@]}\" \"$@\"\n#\n# but POSIX shell has neither arrays nor command substitution, so instead we\n# post-process each arg (as a line of input to sed) to backslash-escape any\n# character that might be a shell metacharacter, then use eval to reverse\n# that process (while maintaining the separation between arguments), and wrap\n# the whole thing up as a single \"set\" statement.\n#\n# This will of course break if any of these variables contains a newline or\n# an unmatched quote.\n#\n\neval \"set -- $(\n        printf '%s\\n' \"$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\" |\n        xargs -n1 |\n        sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |\n        tr '\\n' ' '\n    )\" '\"$@\"'\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@rem\n@rem Copyright 2015 the original author or authors.\n@rem\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\n@rem you may not use this file except in compliance with the License.\n@rem You may obtain a copy of the License at\n@rem\n@rem      https://www.apache.org/licenses/LICENSE-2.0\n@rem\n@rem Unless required by applicable law or agreed to in writing, software\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n@rem See the License for the specific language governing permissions and\n@rem limitations under the License.\n@rem\n\n@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto execute\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto execute\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %*\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "install.sh",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\ncargo install --force cbindgen\ncargo install bindgen"
  },
  {
    "path": "logging/README.md",
    "content": "# mirai-logging\n\nMirai 日志转接模块，用于使用各大主流日志库接管 Mirai 日志系统以实现统一管理。\n\n请注意，该接管不会影响通过 `redirectBotLogToFile()` 将 Bot 日志重定向到文件以及其他依赖于 mirai 内建日志系统的功能。在接管日志后，需要在目标日志库以配置等方式实现重定向等功能。\n\n仅在 mirai 2.7 起提供。\n\n## 模块列表\n\n[Log4j2]: https://logging.apache.org/log4j/\n[SLF4J]: http://www.slf4j.org/\n[Logback]: http://logback.qos.ch/\n\n若使用 SLF4J 的转接器，则会同时将对 Log4J2 的调用转向 SLF4J。同样地，若使用 Log4J2 的转接器，同时将对 SLF4J 的调用转向 Log4J2。因此可使用单一日志库。\n\n|   groupId   |          artifactId           | 对接日志库  | 备注                            | 最低 mirai 版本 |\n|:-----------:|:-----------------------------:|:---------:|:-------------------------------|:--------------:|\n| `net.mamoe` |    `mirai-logging-log4j2`     | [Log4J2]  | 使用 log4j2-core.               |     2.7.0      |\n| `net.mamoe` | `mirai-logging-slf4j-logback` | [Logback] | 使用 logback-classic.           |     2.7.0      |\n| `net.mamoe` | `mirai-logging-slf4j-simple`  |  [SLF4J]  | 使用 slf4j-simple.              |     2.7.0      |\n| `net.mamoe` |     `mirai-logging-slf4j`     |  [SLF4J]  | 需要自定义添加 SLF4J 的任意实现模块. |     2.7.0     |\n\n## 使用方法\n\n选择上述模块中的其中一个，在运行时 classpath 包含即可。\n\n若使用构建工具，可将其作为类似 mirai-core 的依赖添加，版本号与 mirai-core 相同。\n\n### Gradle Kotlin DSL\n\n在 `build.gradle.kts` 添加：\n\n```kotlin\ndependencies {\n    api(\"net.mamoe\", \"mirai-core\", \"2.7.0\")\n    api(\"net.mamoe\", \"mirai-logging-log4j2\", \"2.7.0\") // 在依赖 mirai-core 或 mirai-core-api 的前提下额外添加日志转接模块. 版本号相同\n}\n```\n\n### Gradle Groovy DSL\n\n在 `build.gradle.kts` 添加：\n\n```groovy\ndependencies {\n    api 'net.mamoe:mirai-core:2.7.0'\n    api 'net.mamoe:mirai-logging-log4j2:2.7.0' // 在依赖 mirai-core 或 mirai-core-api 的前提下额外添加日志转接模块. 版本号相同\n}\n```\n\n### Maven\n\n在 `pom.xml` 添加：\n\n```xml\n<dependencies>\n    <dependency>\n        <groupId>net.mamoe</groupId>\n        <artifactId>mirai-core-jvm</artifactId>\n        <version>2.7.0</version>\n    </dependency>\n    \n    <!--在依赖 mirai-core 或 mirai-core-api 的前提下额外添加日志转接模块. 版本号相同-->\n    <dependency>\n        <groupId>net.mamoe</groupId>\n        <artifactId>mirai-logging-log4j2</artifactId>\n        <version>2.7.0</version>\n    </dependency>\n</dependencies>\n```\n\n## 自行实现日志转接\n\nMirai 通过 Java `ServiceLoader` 加载 `MiraiLogger.Factory`。只需要实现该类型并以标准 service 方式提供即可（如 `resources` 中 `META-INF/services`）。\n\n但**更推荐**使用上述转接模块先转接到 Log4J2 或 SLF4J，然后再基于 log4j-api 或 slf4j-api 转接。这样更稳定，也可以获取到 `Marker` 的支持。"
  },
  {
    "path": "logging/mirai-logging-log4j2/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"UnusedImport\")\n\nplugins {\n    kotlin(\"jvm\")\n    id(\"java\")\n    `maven-publish`\n}\n\nversion = Versions.core\ndescription = \"Mirai Log4J Adapter\"\n\nkotlin {\n    explicitApi()\n}\n\ndependencies {\n    api(project(\":mirai-core-api\"))\n    api(`log4j-api`)\n    api(`log4j-core`)\n    api(`log4j-slf4j2-impl`)\n\n\n    testImplementation(`slf4j-api`)\n    testImplementation(project(\":mirai-core\"))\n    testImplementation(project(\":mirai-core-utils\"))\n    testImplementation(`ktor-client-okhttp`)\n}\n\nconfigurePublishing(\"mirai-logging-log4j2\")"
  },
  {
    "path": "logging/mirai-logging-log4j2/resources/META-INF/services/net.mamoe.mirai.utils.MiraiLogger$Factory",
    "content": "#\n# Copyright 2019-2021 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nnet.mamoe.mirai.utils.logging.MiraiLog4JFactory"
  },
  {
    "path": "logging/mirai-logging-log4j2/src/MiraiLog4JFactory.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils.logging\n\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.MiraiLogger\nimport org.apache.logging.log4j.LogManager\nimport org.apache.logging.log4j.MarkerManager\n\n/**\n * 使用 Log4J 接管 mirai 日志系统.\n */\n@MiraiInternalApi\npublic class MiraiLog4JFactory : MiraiLogger.Factory {\n    override fun create(requester: Class<*>, identity: String?): MiraiLogger {\n        val logger = LogManager.getLogger(requester)\n        @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n        return net.mamoe.mirai.internal.utils.Log4jLoggerAdapter(\n            logger,\n            MarkerManager.getMarker(identity ?: logger.name).addParents(net.mamoe.mirai.internal.utils.MARKER_MIRAI)\n        )\n    }\n}"
  },
  {
    "path": "logging/mirai-logging-log4j2/test/MiraiLog4JAdapterTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n\npackage net.mamoe.mirai.utils.logging\n\nimport io.ktor.client.*\nimport io.ktor.client.engine.okhttp.*\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.loadService\nimport java.io.ByteArrayOutputStream\nimport java.io.PrintStream\nimport kotlin.test.Test\nimport kotlin.test.assertFalse\nimport kotlin.test.assertIs\n\ninternal class MiraiLog4JAdapterTest {\n    @Test\n    fun `using log4j`() {\n        assertIs<MiraiLog4JFactory>(loadService(MiraiLogger.Factory::class))\n        val logger = MiraiLogger.Factory.create(this::class)\n        @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n        assertIs<net.mamoe.mirai.internal.utils.Log4jLoggerAdapter>(logger)\n    }\n\n    @Test\n    fun `print test`() {\n        val out = ByteArrayOutputStream()\n        System.setOut(PrintStream(out, true))\n        System.setErr(PrintStream(out, true))\n        HttpClient(OkHttp)\n        val logger = MiraiLogger.Factory.create(this::class)\n        logger.error(\"Hi\")\n        /*\n        SLF4J: Failed to load class \"org.slf4j.impl.StaticLoggerBinder\".\nSLF4J: Defaulting to no-operation (NOP) logger implementation\nSLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.\nERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...\n\n         */\n        out.flush()\n        println(out.toString())\n        assertFalse { out.toString().contains(\"slf4j\", ignoreCase = true) }\n        assertFalse { out.toString().contains(\"Log4j2 could not find a logging implementation\", ignoreCase = true) }\n    }\n}\n"
  },
  {
    "path": "logging/mirai-logging-slf4j/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"UnusedImport\")\n\nplugins {\n    kotlin(\"jvm\")\n    id(\"java\")\n    `maven-publish`\n}\n\nversion = Versions.core\ndescription = \"Mirai SLF4J Adapter\"\n\nkotlin {\n    explicitApi()\n}\n\ndependencies {\n    api(project(\":mirai-core-api\"))\n    implementation(project(\":mirai-logging-log4j2\")) {\n        exclude(\"org.apache.logging.log4j\", \"log4j-slf4j2-impl\")\n    } // mirai -> log4j2\n    implementation(`log4j-to-slf4j`) // log4j2 -> slf4j\n    api(`slf4j-api`)\n\n    testImplementation(project(\":mirai-core\"))\n    testImplementation(project(\":mirai-core-utils\"))\n    testImplementation(`ktor-client-okhttp`)\n}\n\nconfigurePublishing(\"mirai-logging-slf4j\")"
  },
  {
    "path": "logging/mirai-logging-slf4j/test/MiraiSlf4JAdapterTest.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils.logging\n\nimport io.ktor.client.*\nimport io.ktor.client.engine.okhttp.*\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.loadService\nimport org.junit.jupiter.api.Order\nimport org.slf4j.LoggerFactory\nimport org.slf4j.helpers.NOPLogger\nimport java.io.ByteArrayOutputStream\nimport java.io.PrintStream\nimport kotlin.test.Test\nimport kotlin.test.assertFalse\nimport kotlin.test.assertIs\n\ninternal class MiraiSlf4JAdapterTest {\n\n    @Order(1)\n    @Test\n    fun `using log4j`() {\n        assertIs<MiraiLog4JFactory>(loadService(MiraiLogger.Factory::class))\n        val logger = MiraiLogger.Factory.create(this::class)\n        @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n        assertIs<net.mamoe.mirai.internal.utils.Log4jLoggerAdapter>(logger)\n    }\n\n    @Order(0)\n    @Test\n    fun `print test`() {\n        val out = ByteArrayOutputStream()\n        System.setOut(PrintStream(out, true))\n        System.setErr(PrintStream(out, true))\n\n        assertIs<NOPLogger>(LoggerFactory.getLogger(\"s\"))\n        HttpClient(OkHttp)\n\n        val logger = MiraiLogger.Factory.create(this::class)\n        logger.error(\"Hi\")\n        /*\n        SLF4J: Failed to load class \"org.slf4j.impl.StaticLoggerBinder\".\nSLF4J: Defaulting to no-operation (NOP) logger implementation\nSLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.\nERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...\n\n         */\n        out.flush()\n        println(out.toString())\n        assertFalse { out.toString().contains(\"Log4j2 could not find a logging implementation\", ignoreCase = true) }\n//        assertTrue {\n//            out.toString().contains(\"SLF4J: Defaulting to no-operation (NOP) logger implementation\", ignoreCase = true)\n//        }\n    }\n}\n"
  },
  {
    "path": "logging/mirai-logging-slf4j-logback/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"UnusedImport\")\n\nplugins {\n    kotlin(\"jvm\")\n    id(\"java\")\n    `maven-publish`\n}\n\nversion = Versions.core\ndescription = \"Mirai SLF4J Adapter with logback-classic\"\n\nkotlin {\n    explicitApi()\n}\n\ndependencies {\n    api(project(\":mirai-core-api\"))\n    api(project(\":mirai-logging-slf4j\")) // mirai -> slf4j\n    implementation(project(\":mirai-logging-log4j2\")) {\n        exclude(\"org.apache.logging.log4j\", \"log4j-slf4j2-impl\")\n    } // mirai -> log4j2\n    api(`slf4j-api`)\n    api(`logback-classic`)\n\n    testImplementation(project(\":mirai-core\"))\n    testImplementation(project(\":mirai-core-utils\"))\n    testImplementation(`ktor-client-okhttp`)\n}\n\nconfigurePublishing(\"mirai-logging-slf4j-logback\")"
  },
  {
    "path": "logging/mirai-logging-slf4j-logback/test/MiraiSlf4JLogbackAdapterTest.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils.logging\n\nimport io.ktor.client.*\nimport io.ktor.client.engine.okhttp.*\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.loadService\nimport org.junit.jupiter.api.Order\nimport org.slf4j.LoggerFactory\nimport org.slf4j.helpers.NOPLogger\nimport java.io.ByteArrayOutputStream\nimport java.io.PrintStream\nimport kotlin.test.Test\nimport kotlin.test.assertFalse\nimport kotlin.test.assertIs\nimport kotlin.test.assertIsNot\n\ninternal class MiraiSlf4JLogbackAdapterTest {\n\n    @Order(1)\n    @Test\n    fun `using log4j`() {\n        assertIs<MiraiLog4JFactory>(loadService(MiraiLogger.Factory::class))\n        val logger = MiraiLogger.Factory.create(this::class)\n        @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n        assertIs<net.mamoe.mirai.internal.utils.Log4jLoggerAdapter>(logger)\n    }\n\n    @Order(0)\n    @Test\n    fun `print test`() {\n        val out = ByteArrayOutputStream()\n        System.setOut(PrintStream(out, true))\n        System.setErr(PrintStream(out, true))\n\n        assertIsNot<NOPLogger>(LoggerFactory.getLogger(\"s\"))\n        HttpClient(OkHttp)\n\n        val logger = MiraiLogger.Factory.create(this::class)\n        logger.error(\"Hi\")\n        /*\n        SLF4J: Failed to load class \"org.slf4j.impl.StaticLoggerBinder\".\nSLF4J: Defaulting to no-operation (NOP) logger implementation\nSLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.\nERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...\n\n         */\n        out.flush()\n        println(out.toString())\n        assertFalse { out.toString().contains(\"Log4j2 could not find a logging implementation\", ignoreCase = true) }\n        assertFalse {\n            out.toString().contains(\"SLF4J: Defaulting to no-operation (NOP) logger implementation\", ignoreCase = true)\n        }\n    }\n}\n"
  },
  {
    "path": "logging/mirai-logging-slf4j-simple/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"UnusedImport\")\n\nplugins {\n    kotlin(\"jvm\")\n    id(\"java\")\n    `maven-publish`\n}\n\nversion = Versions.core\ndescription = \"Mirai SLF4J Adapter with slf4j-simple\"\n\nkotlin {\n    explicitApi()\n}\n\ndependencies {\n    api(project(\":mirai-core-api\"))\n    api(project(\":mirai-logging-slf4j\")) // mirai -> slf4j\n    implementation(project(\":mirai-logging-log4j2\")) {\n        exclude(\"org.apache.logging.log4j\", \"log4j-slf4j-impl\")\n    } // mirai -> log4j2\n    api(`slf4j-api`)\n    api(`slf4j-simple`)\n\n    testImplementation(project(\":mirai-core\"))\n    testImplementation(project(\":mirai-core-utils\"))\n    testImplementation(`ktor-client-okhttp`)\n}\n\nconfigurePublishing(\"mirai-logging-slf4j-simple\")"
  },
  {
    "path": "logging/mirai-logging-slf4j-simple/test/MiraiSlf4JSimpleAdapterTest.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils.logging\n\nimport io.ktor.client.*\nimport io.ktor.client.engine.okhttp.*\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.loadService\nimport org.junit.jupiter.api.Order\nimport org.slf4j.LoggerFactory\nimport org.slf4j.helpers.NOPLogger\nimport java.io.ByteArrayOutputStream\nimport java.io.PrintStream\nimport kotlin.test.Test\nimport kotlin.test.assertFalse\nimport kotlin.test.assertIs\nimport kotlin.test.assertIsNot\n\ninternal class MiraiSlf4JSimpleAdapterTest {\n\n    @Order(1)\n    @Test\n    fun `using log4j`() {\n        assertIs<MiraiLog4JFactory>(loadService(MiraiLogger.Factory::class))\n        val logger = MiraiLogger.Factory.create(this::class)\n        @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n        assertIs<net.mamoe.mirai.internal.utils.Log4jLoggerAdapter>(logger)\n    }\n\n    @Order(0)\n    @Test\n    fun `print test`() {\n        val out = ByteArrayOutputStream()\n        System.setOut(PrintStream(out, true))\n        System.setErr(PrintStream(out, true))\n\n        assertIsNot<NOPLogger>(LoggerFactory.getLogger(\"s\"))\n        HttpClient(OkHttp)\n\n        val logger = MiraiLogger.Factory.create(this::class)\n        logger.error(\"Hi\")\n        /*\n        SLF4J: Failed to load class \"org.slf4j.impl.StaticLoggerBinder\".\nSLF4J: Defaulting to no-operation (NOP) logger implementation\nSLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.\nERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...\n\n         */\n        out.flush()\n        println(out.toString())\n        assertFalse { out.toString().contains(\"Log4j2 could not find a logging implementation\", ignoreCase = true) }\n        assertFalse {\n            out.toString().contains(\"SLF4J: Defaulting to no-operation (NOP) logger implementation\", ignoreCase = true)\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-bom/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nplugins {\n    `java-platform`\n    `maven-publish`\n}\n\ndescription = \"Mirai BOM\"\n\nrootProject.subprojects\n    .filter { it.path != project.path }\n    .forEach { project.evaluationDependsOn(it.path) }\n\ndependencies {\n    constraints {\n        rootProject.subprojects\n            .filter { it.path != project.path }\n            .filter { it.extensions.findByName(\"publishing\") != null }\n            .forEach { subProject ->\n                subProject.publishing.publications\n                    .withType<MavenPublication>()\n                    .forEach {\n                        this@constraints.api(\"${it.groupId}:${it.artifactId}:${it.version}\")\n                    }\n            }\n    }\n}\n\nconfigurePublishing(\n    \"mirai-bom\",\n    addProjectComponents = false,\n)\n\npublishing.publications.getByName<MavenPublication>(\"mavenJava\") {\n    from(components[\"javaPlatform\"])\n}\n"
  },
  {
    "path": "mirai-console/.gitignore",
    "content": "# Compiled class file\n*.class\n\n# Log file\n*.log\n\n# BlueJ files\n*.ctxt\n\n# Mobile Tools for Java (J2ME)\n.mtj.tmp/\n\n# Package Files #\n*.war\n*.nar\n*.ear\n*.zip\n*.tar.gz\n*.rar\n\n# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml\nhs_err_pid*\n\ntarget/\nbuild/\n\n.idea/\n*.iml\n/.idea/\n.idea/*\n/.idea/*\n\n/test\n\n\n.gradle/\n\n\nlocal.properties\n\n# Maven publishing credits\nkeys.properties\n/plugins/\n\nbintray.user.txt\nbintray.key.txt\n\ntoken.txt\n/*/token.txt"
  },
  {
    "path": "mirai-console/.gitmodules",
    "content": "[submodule \"frontend/mirai-android\"]\n\tpath = frontend/mirai-android\n\turl = https://github.com/mzdluo123/MiraiAndroid\n"
  },
  {
    "path": "mirai-console/README.md",
    "content": "# mirai-console\n\n高效率 QQ 机器人框架\n\n## 使用\n\n- **[启动 Console](docs/Run.md)**\n\n### 安装 JAR 插件\n\n将 `jar` 文件放入 `plugins` 并重启 Mirai Console。\n\n### 执行指令\n\n在控制台输入 `?` 查看可用指令列表。**\n注意，请先为用户授予执行某些指令的权限，详见 [示例](docs/BuiltInCommands.md#授予一个用户执行所有指令的权限)**。\n\n### 内置指令\n\n[BuiltInCommands](docs/BuiltInCommands.md#mirai-console---builtin-commands)\n\n## 开发\n\n[开发文档](docs/README.md#mirai-console)\n\n## 实用链接\n\n- [社区 SDK](https://github.com/mamoe/mirai#%E4%BD%BF%E7%94%A8-mirai-console-%E6%9C%8D%E5%8A%A1%E7%AB%AF%E4%B8%BA-mirai-console-%E5%BC%80%E5%8F%91%E6%8F%92%E4%BB%B6)\n- [论坛](https://mirai.mamoe.net)\n- [Mirai 项目组](https://github.com/project-mirai)\n- [在 Android 平台使用](https://github.com/mzdluo123/MiraiAndroid)\n- Mirai 官方维护的插件:\n    - [chat-command](https://github.com/project-mirai/chat-command)\n    - [mirai-api-http](https://github.com/project-mirai/mirai-api-http)\n"
  },
  {
    "path": "mirai-console/backend/codegen/README.md",
    "content": "# Mirai Console - Backend.codegen\n\n后端代码生成模块，用于最小化重复代码的人工成本。\n\n- `MessageScope` 代码生成: [MessageScopeCodegen.kt: Line 33](src/MessageScopeCodegen.kt#L33)\n- `Value` 和 `PluginData` 相关代码生成: [ValueSettingCodegen.kt: Line 18](src/ValuePluginDataCodegen.kt#L18)\n"
  },
  {
    "path": "mirai-console/backend/codegen/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\nplugins {\n    kotlin(\"jvm\")\n    kotlin(\"plugin.serialization\")\n    id(\"java\")\n}\n\nkotlin {\n    sourceSets {\n        all {\n            languageSettings.optIn(\"kotlin.Experimental\")\n            languageSettings.optIn(\"kotlin.RequiresOptIn\")\n            languageSettings.progressiveMode = true\n            languageSettings.optIn(\"net.mamoe.mirai.utils.MiraiInternalAPI\")\n            languageSettings.optIn(\"kotlin.ExperimentalUnsignedTypes\")\n            languageSettings.optIn(\"kotlin.experimental.ExperimentalTypeInference\")\n            languageSettings.optIn(\"kotlin.contracts.ExperimentalContracts\")\n        }\n    }\n}\n\ndependencies {\n    api(kotlin(\"stdlib-jdk8\"))\n    implementation(kotlin(\"reflect\"))\n    api(project(\":mirai-core-utils\"))\n}"
  },
  {
    "path": "mirai-console/backend/codegen/src/Codegen.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"FunctionName\", \"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"PRE_RELEASE_CLASS\", \"unused\")\n\npackage net.mamoe.mirai.console.codegen\n\nimport org.intellij.lang.annotations.Language\nimport kotlin.reflect.KClass\nimport kotlin.reflect.full.functions\nimport kotlin.reflect.full.hasAnnotation\nimport kotlin.reflect.full.isSubclassOf\n\ninline fun <reified T> runCodegenInObject() = runCodegenInObject(T::class)\n\nfun runCodegenInObject(clazz: KClass<*>) {\n    clazz.nestedClasses\n        .filter { it.isSubclassOf(RegionCodegen::class) }\n        .associateWith { kClass -> kClass.functions.find { it.name == \"main\" && it.hasAnnotation<JvmStatic>() } }\n        .filter { it.value != null }\n        .forEach { (kClass, entryPoint) ->\n            println(\"---------------------------------------------\")\n            println(\"Running Codegen: ${kClass.simpleName}\")\n            entryPoint!!.call(kClass.objectInstance, arrayOf<String>())\n            println(\"---------------------------------------------\")\n        }\n}\n\nabstract class Replacer(private val name: String) : (String) -> String {\n    override fun toString(): String {\n        return name\n    }\n}\n\nfun Codegen.Replacer(block: (String) -> String): Replacer {\n    return object : Replacer(this@Replacer::class.simpleName ?: \"<unnamed>\") {\n        override fun invoke(p1: String): String = block(p1)\n    }\n}\n\nclass CodegenScope : MutableList<Replacer> by mutableListOf() {\n    fun applyTo(fileContent: String): String {\n        return this.fold(fileContent) { acc, replacer -> replacer(acc) }\n    }\n\n    @CodegenDsl\n    operator fun Codegen.invoke(vararg ktTypes: KtType) {\n        if (ktTypes.isEmpty() && this is DefaultInvoke) {\n            invoke(defaultInvokeArgs)\n        }\n        invoke(ktTypes.toList())\n    }\n\n    @CodegenDsl\n    operator fun Codegen.invoke(ktTypes: Collection<KtType>) {\n        add(Replacer { str ->\n            str + buildString {\n                ktTypes.forEach { ktType -> applyTo(this, ktType) }\n            }\n        })\n    }\n\n    @RegionCodegenDsl\n    operator fun RegionCodegen.invoke(vararg ktTypes: KtType) = invoke(ktTypes.toList())\n\n    @RegionCodegenDsl\n    operator fun RegionCodegen.invoke(ktTypes: Collection<KtType>) {\n        add(Replacer { content ->\n            content.replace(Regex(\"\"\"//// region $regionName CODEGEN ////([\\s\\S]*?)( *)//// endregion $regionName CODEGEN ////\"\"\")) { result ->\n                val indent = result.groups[2]!!.value\n                val indentedCode = CodegenScope()\n                    .apply { (this@invoke as Codegen).invoke(*ktTypes.toTypedArray()) } // add codegen task\n                    .applyTo(\"\") // perform codegen\n                    .lines().dropLastWhile(String::isBlank).joinToString(\"\\n\") // remove blank following lines\n                    .mapLine { \"${indent}$it\" } // indent\n                \"\"\"\n                        |//// region $regionName CODEGEN ////\n                        |\n                        |${indentedCode}\n                        |\n                        |${indent}//// endregion $regionName CODEGEN ////\n                    \"\"\".trimMargin()\n            }\n        })\n    }\n\n    @DslMarker\n    annotation class CodegenDsl\n}\n\ninternal fun String.mapLine(mapper: (String) -> CharSequence) = this.lines().joinToString(\"\\n\", transform = mapper)\n\n@DslMarker\nannotation class RegionCodegenDsl\n\ninterface DefaultInvoke {\n    val defaultInvokeArgs: List<KtType>\n}\n\nabstract class Codegen {\n    fun applyTo(stringBuilder: StringBuilder, ktType: KtType) = this.run { stringBuilder.apply(ktType) }\n\n    protected abstract fun StringBuilder.apply(ktType: KtType)\n}\n\nabstract class RegionCodegen(private val targetFile: String, regionName: String? = null) : Codegen() {\n    val regionName: String by lazy {\n        regionName ?: this::class.simpleName!!.substringBefore(\"Codegen\")\n    }\n\n    fun startIndependently() {\n        codegen(targetFile) {\n            this@RegionCodegen.invoke()\n        }\n    }\n}\n\nabstract class PrimitiveCodegen : Codegen() {\n    protected abstract fun StringBuilder.apply(ktType: KtPrimitive)\n\n    fun StringBuilder.apply(ktType: List<KtPrimitive>) = ktType.forEach { apply(it) }\n}\n\nfun StringBuilder.appendKCode(@Language(\"kt\") ktCode: String): StringBuilder = append(kCode(ktCode)).appendLine()\n"
  },
  {
    "path": "mirai-console/backend/codegen/src/MessageScopeCodegen.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.codegen\n\nimport net.mamoe.mirai.utils.capitalize\n\ninternal val TypeCandidatesForMessageScope = arrayOf(\n    KtType(\"Contact\"),\n    KtType(\"CommandSender\"),\n)\n\ninternal val KtMessageScope = KtType(\"MessageScope\")\n\ninternal fun <A> Array<A>.arrangements(): List<Pair<A, A>> {\n    val result = mutableListOf<Pair<A, A>>()\n    for (a in this) {\n        for (b in this) {\n            result.add(a to b)\n        }\n    }\n    return result\n}\n\ninternal object MessageScopeCodegen {\n    object IterableMessageScopeBuildersCodegen : RegionCodegen(\"MessageScope.kt\"), DefaultInvoke {\n        @JvmStatic\n        fun main(args: Array<String>) = super.startIndependently()\n        override val defaultInvokeArgs: List<KtType> = listOf(KtString) // invoke once\n\n        @Suppress(\n            \"RedundantVisibilityModifier\", \"ClassName\", \"KDocUnresolvedReference\", \"RedundantSuspendModifier\",\n            \"SpellCheckingInspection\"\n        )\n        override fun StringBuilder.apply(ktType: KtType) {\n            for (collectionName in arrayOf(\"Iterable\", \"Sequence\", \"Array\")) {\n                for (candidate in (TypeCandidatesForMessageScope + KtMessageScope)) {\n                    appendKCode(\n                        \"\"\"\n                                @JvmName(\"toMessageScope${candidate.standardName.capitalize()}${collectionName.capitalize()}\")\n                                public fun $collectionName<$candidate?>.toMessageScope(): MessageScope {\n                                    return this.fold(this.firstOrNull().asMessageScopeOrNoop()) { acc, messageScope -> CombinedScope(acc, messageScope.asMessageScopeOrNoop()) }\n                                }\n                                \"\"\"\n                    )\n                    appendLine()\n                }\n            }\n            for (candidate in (TypeCandidatesForMessageScope + KtMessageScope)) {\n                appendKCode(\n                    \"\"\"\n                    @JvmSynthetic\n                    @JvmName(\"toMessageScope${candidate.standardName.capitalize()}Flow\")\n                    public suspend fun Flow<$candidate>.toMessageScope(): MessageScope { // Flow<Any?>.firstOrNull isn't yet supported\n                        return this.fold(this.firstOrNull().asMessageScopeOrNoop()) { acc, messageScope -> CombinedScope(acc, messageScope.asMessageScope()) }\n                    }\n                    \"\"\"\n                )\n                appendLine()\n            }\n        }\n    }\n\n    object MessageScopeBuildersCodegen : RegionCodegen(\"MessageScope.kt\"), DefaultInvoke {\n        @JvmStatic\n        fun main(args: Array<String>) = super.startIndependently()\n        override val defaultInvokeArgs: List<KtType> = listOf(KtString) // invoke once\n\n        @Suppress(\"RedundantVisibilityModifier\", \"ClassName\", \"KDocUnresolvedReference\", \"unused\")\n        override fun StringBuilder.apply(ktType: KtType) {\n            for (candidate in TypeCandidatesForMessageScope) {\n                appendKCode(\n                    \"\"\"\n                       public fun ${candidate}.asMessageScope(): MessageScope = createScopeDelegate(this)\n                    \"\"\"\n                )\n                appendLine()\n            }\n//\n//            for ((a, b) in (TypeCandidatesForMessageScope + KtMessageScope).arrangements()) {\n//                appendKCode(\n//                    \"\"\"\n//                    @LowPriorityInOverloadResolution\n//                    public fun ${a}.scopeWith(vararg others: ${b}): MessageScope {\n//                        return others.fold(this.asMessageScope()) { acc, other -> CombinedScope(acc, other.asMessageScope()) }\n//                    }\n//                \"\"\"\n//                )\n//                appendLine()\n//            }\n\n            for ((a, b) in (TypeCandidatesForMessageScope + KtMessageScope).arrangements()) {\n                appendKCode(\n                    \"\"\"\n                    @LowPriorityInOverloadResolution\n                    public fun ${a}?.scopeWith(vararg others: ${b}?): MessageScope {\n                        return others.fold(this.asMessageScopeOrNoop()) { acc, other -> acc.scopeWith(other?.asMessageScope()) }\n                    }\n                \"\"\"\n                )\n                appendLine()\n            }\n//\n//            for ((a, b) in (TypeCandidatesForMessageScope + KtMessageScope).arrangements()) {\n//                appendKCode(\n//                    \"\"\"\n//                    public fun ${a}.scopeWith(other: ${b}): MessageScope {\n//                        return CombinedScope(asMessageScope(), other.asMessageScope())\n//                    }\n//                \"\"\"\n//                )\n//                appendLine()\n//            }\n\n            for ((a, b) in (TypeCandidatesForMessageScope + KtMessageScope).arrangements()) {\n                appendKCode(\n                    \"\"\"\n                    public fun ${a}?.scopeWith(other: ${b}?): MessageScope {\n                        @Suppress(\"DuplicatedCode\")\n                        return when {\n                            this == null && other == null -> NoopMessageScope\n                            this == null && other != null -> other.asMessageScope()\n                            this != null && other == null -> this.asMessageScope()\n                            this != null && other != null -> CombinedScope(asMessageScope(), other.asMessageScope())\n                            else -> null!!\n                        }\n                    }\n                \"\"\"\n                )\n                appendLine()\n            }\n//\n//            for ((a, b) in (TypeCandidatesForMessageScope + KtMessageScope).arrangements()) {\n//                appendKCode(\n//                    \"\"\"\n//                    public inline fun <R> ${a}.scopeWith(vararg others: ${b}, action: MessageScope.() -> R): R {\n//                        return scopeWith(*others).invoke(action)\n//                    }\n//                \"\"\"\n//                )\n//                appendLine()\n//            }\n\n            for ((a, b) in (TypeCandidatesForMessageScope + KtMessageScope).arrangements()) {\n                appendKCode(\n                    \"\"\"\n                    public inline fun <R> ${a}?.scopeWith(vararg others: ${b}?, action: MessageScope.() -> R): R {\n                        contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }\n                        return scopeWith(*others).invoke(action)\n                    }\n                \"\"\"\n                )\n                appendLine()\n            }\n\n            for (a in (TypeCandidatesForMessageScope + KtMessageScope)) {\n                appendKCode(\n                    \"\"\"\n                    @Deprecated(\n                        \"Senseless scopeWith. Use asMessageScope.\",\n                        ReplaceWith(\"this.asMessageScope()\", \"net.mamoe.mirai.console.util.asMessageScope\")\n                    ) // diagnostic deprecation\n                    public inline fun ${a}.scopeWith(): MessageScope = asMessageScope()\n                \"\"\"\n                )\n                appendLine()\n            }\n\n            for (a in (TypeCandidatesForMessageScope + KtMessageScope)) {\n                appendKCode(\n                    \"\"\"\n                    @Deprecated(\n                        \"Senseless scopeWith. Use .asMessageScope().invoke.\",\n                        ReplaceWith(\n                            \"this.asMessageScope()(action)\",\n                            \"net.mamoe.mirai.console.util.asMessageScope\", \n                            \"net.mamoe.mirai.console.util.invoke\",\n                        )\n                    ) // diagnostic deprecation\n                    public inline fun <R> ${a}.scopeWith(action: MessageScope.() -> R): R {\n                        contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }\n                        return asMessageScope()(action)\n                    }\n\"\"\"\n                )\n                appendLine()\n            }\n\n        }\n    }\n\n\n    /**\n     * 运行本 object 中所有嵌套 object Codegen\n     */\n    @OptIn(ExperimentalStdlibApi::class)\n    @JvmStatic\n    fun main(args: Array<String>) {\n        runCodegenInObject(this::class)\n    }\n}"
  },
  {
    "path": "mirai-console/backend/codegen/src/ValuePluginDataCodegen.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"PRE_RELEASE_CLASS\", \"ClassName\", \"RedundantVisibilityModifier\", \"KDocUnresolvedReference\")\n\npackage net.mamoe.mirai.console.codegen\n\nimport kotlin.reflect.full.functions\nimport kotlin.reflect.full.hasAnnotation\nimport kotlin.reflect.full.isSubclassOf\n\ninternal object ValuePluginDataCodegen {\n    /**\n     * The interface\n     */\n    object PrimitiveValuesCodegen : RegionCodegen(\"Value.kt\"), DefaultInvoke {\n        @JvmStatic\n        fun main(args: Array<String>) = super.startIndependently()\n        override val defaultInvokeArgs: List<KtType> = KtPrimitives + KtString\n\n        override fun StringBuilder.apply(ktType: KtType) {\n            @Suppress(\"ClassName\")\n            appendKCode(\n                \"\"\"\n                    /**\n                     * 表示一个不可空 [$ktType] [Value].\n                     */\n                    public interface ${ktType}Value : PrimitiveValue<$ktType>\n                \"\"\"\n            )\n        }\n    }\n\n    object BuiltInSerializerConstantsPrimitivesCodegen : RegionCodegen(\"_PluginData.value.kt\"), DefaultInvoke {\n        @JvmStatic\n        fun main(args: Array<String>) = super.startIndependently()\n        override val defaultInvokeArgs: List<KtType> = KtPrimitives + KtString\n\n        override fun StringBuilder.apply(ktType: KtType) {\n            appendLine(\n                kCode(\n                    \"\"\"\n                @JvmStatic\n                internal val ${ktType.standardName}SerializerDescriptor = ${ktType.standardName}.serializer().descriptor \n            \"\"\"\n                ).lines().joinToString(\"\\n\") { \"    $it\" }\n            )\n        }\n    }\n\n    object PrimitiveValuesImplCodegen : RegionCodegen(\"_PrimitiveValueDeclarations.kt\"), DefaultInvoke {\n        @JvmStatic\n        fun main(args: Array<String>) = super.startIndependently()\n        override val defaultInvokeArgs: List<KtType> = KtPrimitives + KtString\n\n        override fun StringBuilder.apply(ktType: KtType) {\n            appendKCode(\n                \"\"\"\ninternal abstract class ${ktType.standardName}ValueImpl : ${ktType.standardName}Value, SerializerAwareValue<${ktType.standardName}>, KSerializer<Unit>, AbstractValueImpl<${ktType.standardName}> {\n    constructor()\n    constructor(default: ${ktType.standardName}) {\n        _value = default\n    }\n\n    private var _value: ${ktType.standardName}? = null\n\n    final override var value: ${ktType.standardName}\n        get() = _value ?: error(\"${ktType.standardName}Value.value should be initialized before get.\")\n        set(v) {\n            if (v != this._value) {\n                if (this._value == null) {\n                    this._value = v\n                } else {\n                    this._value = v\n                    onChanged()\n                }\n            }\n        }\n\n    protected abstract fun onChanged()\n\n    final override val serializer: KSerializer<Unit> get() = this\n    final override val descriptor: SerialDescriptor get() = BuiltInSerializerConstants.${ktType.standardName}SerializerDescriptor\n    final override fun serialize(encoder: Encoder, value: Unit) = ${ktType.standardName}.serializer().serialize(encoder, this.value)\n    final override fun deserialize(decoder: Decoder) = setValueBySerializer(${ktType.standardName}.serializer().deserialize(decoder))\n    override fun toString(): String = _value${if (ktType != KtString) \"?.toString()\" else \"\"} ?: \"${ktType.standardName}Value.value not yet initialized.\"\n    override fun equals(other: Any?): Boolean = other is ${ktType.standardName}ValueImpl && other::class.java == this::class.java && other._value == this._value\n    override fun hashCode(): Int {\n        val value = _value\n        return if (value == null) 1\n        else value.hashCode() * 31\n    }\n}\n                \"\"\"\n            )\n        }\n\n    }\n\n    object PluginData_value_PrimitivesImplCodegen : RegionCodegen(\"_PluginData.value.kt\"), DefaultInvoke {\n        @JvmStatic\n        fun main(args: Array<String>) = super.startIndependently()\n        override val defaultInvokeArgs: List<KtType> = KtPrimitives + KtString\n\n        override fun StringBuilder.apply(ktType: KtType) {\n            appendKCode(\n                \"\"\"\ninternal fun PluginData.valueImpl(default: ${ktType.standardName}): SerializerAwareValue<${ktType.standardName}> {\n    return object : ${ktType.standardName}ValueImpl(default) {\n        override fun onChanged() = this@valueImpl.onValueChanged(this)\n    }\n}\ninternal fun PluginData.${ktType.lowerCaseName}ValueImpl(): SerializerAwareValue<${ktType.standardName}> {\n    return object : ${ktType.standardName}ValueImpl() {\n        override fun onChanged() = this@${ktType.lowerCaseName}ValueImpl.onValueChanged(this)\n    }\n}\n                \"\"\"\n            )\n        }\n    }\n\n    object PluginData_valueImplPrimitiveCodegen : RegionCodegen(\"_PluginData.value.kt\"), DefaultInvoke {\n        @JvmStatic\n        fun main(args: Array<String>) = super.startIndependently()\n        override val defaultInvokeArgs: List<KtType> = KtPrimitives + KtString\n\n        override fun StringBuilder.apply(ktType: KtType) {\n            appendKCode(\n                \"\"\"\n                ${ktType.standardName}::class -> ${ktType.lowerCaseName}ValueImpl()\n                \"\"\".trimIndent()\n            )\n        }\n    }\n\n    object PluginData_value_primitivesCodegen : RegionCodegen(\"PluginData.kt\"), DefaultInvoke {\n        @JvmStatic\n        fun main(args: Array<String>) = super.startIndependently()\n        override val defaultInvokeArgs: List<KtType> = KtPrimitives + KtString\n\n        override fun StringBuilder.apply(ktType: KtType) {\n            @Suppress(\"unused\")\n            appendKCode(\n                \"\"\"\n                /**\n                 * 创建一个 [${ktType.standardName}] 类型的 [Value], 并设置初始值为 [default]\n                 */\n                public fun PluginData.value(default: ${ktType.standardName}): SerializerAwareValue<${ktType.standardName}> = valueImpl(default)\n                \"\"\"\n            )\n            appendLine()\n        }\n\n    }\n\n    object JPluginData_value_primitivesCodegen : RegionCodegen(\"JAutoSavePluginData.kt\"), DefaultInvoke {\n        @JvmStatic\n        fun main(args: Array<String>) = super.startIndependently()\n        override val defaultInvokeArgs: List<KtType> = KtPrimitives + KtString\n\n        override fun StringBuilder.apply(ktType: KtType) {\n            @Suppress(\"unused\")\n            appendKCode(\n                \"\"\"\n                /**\n                 * 创建一个 [${ktType.standardName}] 类型的 [Value], 并设置初始值为 [default]\n                 */\n                public fun value(default: ${ktType.standardName}): SerializerAwareValue<${ktType.standardName}> = valueImpl(default)\n                \"\"\"\n            )\n            appendLine()\n        }\n\n    }\n\n    /**\n     * @since 2.11\n     */\n    object JavaAutoSavePluginData_value_primitivesCodegen : RegionCodegen(\"JavaAutoSavePluginData.kt\"), DefaultInvoke {\n        @JvmStatic\n        fun main(args: Array<String>) = super.startIndependently()\n        override val defaultInvokeArgs: List<KtType> = KtPrimitives + KtString\n\n        override fun StringBuilder.apply(ktType: KtType) {\n            @Suppress(\"unused\")\n            appendKCode(\n                \"\"\"\n                /**\n                 * 创建一个名称为 [name], 类型为 [${ktType.standardName}] 的 [Value], 并设置初始值为 [default].\n                 */\n                public fun value(name: String, default: ${ktType.standardName}): SerializerAwareValue<${ktType.standardName}> = valueImpl(default).apply { track(this, name, emptyList()) }\n                \"\"\"\n            )\n            appendLine()\n        }\n\n    }\n\n\n    /**\n     * 运行本 object 中所有嵌套 object Codegen\n     */\n    @OptIn(ExperimentalStdlibApi::class)\n    @JvmStatic\n    fun main(args: Array<String>) {\n        ValuePluginDataCodegen::class.nestedClasses\n            .filter { it.isSubclassOf(RegionCodegen::class) }\n            .associateWith { kClass -> kClass.functions.find { it.name == \"main\" && it.hasAnnotation<JvmStatic>() } }\n            .filter { it.value != null }\n            .forEach { (kClass, entryPoint) ->\n                println(\"---------------------------------------------\")\n                println(\"Running Codegen: ${kClass.simpleName}\")\n                entryPoint!!.call(kClass.objectInstance, arrayOf<String>())\n                println(\"---------------------------------------------\")\n            }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/codegen/src/old/JSettingCodegen.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:Suppress(\"PRE_RELEASE_CLASS\")\n\npackage net.mamoe.mirai.console.codegen.old\n\n/**\n * used to generate Java PluginData\n */\n\n\nopen class JClazz(val primitiveName: String, val packageName: String) {\n    open val funName: String = \"value\"\n}\n\nclass JListClazz(item: JClazz) : JClazz(\"List<${item.packageName}>\", \"List<${item.packageName}>\") {\n    override val funName = item.primitiveName.lowercase() + \"List\"\n}\n\nclass JArrayClazz(item: JClazz) : JClazz(item.primitiveName + \"[]\", item.primitiveName + \"[]\")\n\nclass JMapClazz(key: JClazz, value: JClazz) :\n    JClazz(\"Map<${key.packageName},${value.packageName}>\", \"Map<${key.packageName},${value.packageName}>\")\n\n\ninternal val J_NUMBERS = listOf(\n    JClazz(\"int\", \"Integer\"),\n    JClazz(\"short\", \"Short\"),\n    JClazz(\"byte\", \"Byte\"),\n    JClazz(\"long\", \"Long\"),\n    JClazz(\"float\", \"Float\"),\n    JClazz(\"double\", \"Double\")\n)\n\ninternal val J_EXTRA = listOf(\n    JClazz(\"String\", \"String\"),\n    JClazz(\"boolean\", \"Boolean\"),\n    JClazz(\"char\", \"Char\")\n)\n\n\nfun JClazz.getTemplate(): String = \"\"\"\n        @NotNull default Value<${this.packageName}> $funName(${this.primitiveName} defaultValue){\n            return _PluginDataKt.value(this,defaultValue);\n        }\n    \"\"\"\n\n\nfun main() {\n    println(buildString {\n        appendLine(COPYRIGHT)\n        appendLine()\n        appendLine(FILE_SUPPRESS)\n        appendLine()\n        appendLine(\n            \"/**\\n\" +\n                    \" * !!! This file is auto-generated by backend/codegen/src/kotlin/net.mamoe.mirai.console.codegen.JPluginDataCodegen.kt\\n\" +\n                    \" * !!! DO NOT MODIFY THIS FILE MANUALLY\\n\" +\n                    \" */\\n\" +\n                    \"\\\"\\\"\\\"\"\n        )\n        appendLine()\n        appendLine()\n\n\n        //do simplest\n        (J_EXTRA + J_NUMBERS).forEach {\n            appendLine(it.getTemplate())\n        }\n\n        (J_EXTRA + J_NUMBERS).forEach {\n            appendLine(JListClazz(it).getTemplate())\n        }\n\n        (J_EXTRA + J_NUMBERS).forEach {\n            appendLine(JArrayClazz(it).getTemplate())\n        }\n\n        (J_EXTRA + J_NUMBERS).forEach { key ->\n            (J_EXTRA + J_NUMBERS).forEach { value ->\n                appendLine(JMapClazz(key, value).getTemplate())\n            }\n        }\n    })\n}"
  },
  {
    "path": "mirai-console/backend/codegen/src/old/SettingValueUseSiteCodegen.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"PRE_RELEASE_CLASS\")\n\npackage net.mamoe.mirai.console.codegen.old\n\nimport org.intellij.lang.annotations.Language\nimport java.io.File\n\n\nfun main() {\n    println(File(\"\").absolutePath) // default project base dir\n\n    File(\"backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/data/_PluginData.kt\").apply {\n        createNewFile()\n    }.writeText(buildString {\n        appendLine(COPYRIGHT)\n        appendLine()\n        appendLine(FILE_SUPPRESS)\n        appendLine()\n        appendLine(PACKAGE)\n        appendLine()\n        appendLine(IMPORTS)\n        appendLine()\n        appendLine()\n        appendLine(DO_NOT_MODIFY)\n        appendLine()\n        appendLine()\n        appendLine(genAllValueUseSite())\n    })\n}\n\nprivate val DO_NOT_MODIFY = \"\"\"\n/**\n * !!! This file is auto-generated by backend/codegen/src/kotlin/net.mamoe.mirai.console.codegen.PluginDataValueUseSiteCodegen.kt\n * !!! DO NOT MODIFY THIS FILE MANUALLY\n */\n\"\"\".trimIndent()\n\nprivate val PACKAGE = \"\"\"\npackage net.mamoe.mirai.console.data\n\"\"\".trimIndent()\n\ninternal val FILE_SUPPRESS = \"\"\"\n@file:Suppress(\"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\", \"unused\")\n\"\"\".trimIndent()\nprivate val IMPORTS = \"\"\"\nimport net.mamoe.mirai.console.data.internal.valueImpl\nimport kotlin.internal.LowPriorityInOverloadResolution\n\"\"\".trimIndent()\n\nfun genAllValueUseSite(): String = buildString {\n    @Suppress(\"SpellCheckingInspection\")\n    fun appendln(@Language(\"kt\") code: String) {\n        this.appendLine(code.trimIndent())\n    }\n    // PRIMITIVE\n    for (number in NUMBERS + OTHER_PRIMITIVES) {\n        appendln(genValueUseSite(number, number))\n    }\n\n    // PRIMITIVE ARRAYS\n    for (number in NUMBERS + OTHER_PRIMITIVES.filterNot { it == \"String\" }) {\n        appendln(\n            genValueUseSite(\n                \"${number}Array\",\n                \"${number}Array\"\n            )\n        )\n    }\n\n    // TYPED ARRAYS\n    for (number in NUMBERS + OTHER_PRIMITIVES) {\n        appendln(\n            genValueUseSite(\n                \"Array<${number}>\",\n                \"Typed${number}Array\"\n            )\n        )\n    }\n\n    // PRIMITIVE LISTS / PRIMITIVE SETS\n    for (collectionName in listOf(\"List\", \"Set\")) {\n        for (number in NUMBERS + OTHER_PRIMITIVES) {\n            appendln(\n                genValueUseSite(\n                    \"${collectionName}<${number}>\",\n                    \"${number}${collectionName}\"\n                )\n            )\n        }\n    }\n\n    // MUTABLE LIST / MUTABLE SET\n    for (collectionName in listOf(\"List\", \"Set\")) {\n        for (number in NUMBERS + OTHER_PRIMITIVES) {\n            appendLine()\n            appendln(\n                \"\"\"\n                @JvmName(\"valueMutable\")\n                fun PluginData.value(default: Mutable${collectionName}<${number}>): Mutable${number}${collectionName}Value = valueImpl(default)\n            \"\"\".trimIndent()\n            )\n        }\n    }\n\n    // SPECIAL\n    appendLine()\n    @Suppress(\"unused\", \"SpellCheckingInspection\", \"KDocUnresolvedReference\")\n    appendln(\n        \"\"\"\n            fun <T : PluginData> PluginData.value(default: T): Value<T> {\n                require(this::class != default::class) {\n                    \"Recursive nesting is prohibited\"\n                }\n                return valueImpl(default).also {\n                    if (default is PluginData.NestedPluginData) {\n                        default.attachedValue = it\n                    }\n                }\n            }\n\n            inline fun <T : PluginData> PluginData.value(default: T, crossinline initializer: T.() -> Unit): Value<T> =\n                value(default).also { it.value.apply(initializer) }\n\n            inline fun <reified T : PluginData> PluginData.value(default: List<T>): PluginDataListValue<T> = valueImpl(default)\n\n            @JvmName(\"valueMutable\")\n            inline fun <reified T : PluginData> PluginData.value(default: MutableList<T>): MutablePluginDataListValue<T> = valueImpl(default)\n\n\n            inline fun <reified T : PluginData> PluginData.value(default: Set<T>): PluginDataSetValue<T> = valueImpl(default)\n\n            @JvmName(\"valueMutable\")\n            inline fun <reified T : PluginData> PluginData.value(default: MutableSet<T>): MutablePluginDataSetValue<T> = valueImpl(default)\n            \n            /**\n             * 创建一个只引用对象而不跟踪其属性的值.\n             *\n             * @param T 类型. 必须拥有 [kotlinx.serialization.Serializable] 注解 (因此编译器会自动生成序列化器)\n             */\n            @DangerousReferenceOnlyValue\n            @JvmName(\"valueDynamic\")\n            @LowPriorityInOverloadResolution\n            inline fun <reified T : Any> PluginData.value(default: T): Value<T> = valueImpl(default)\n            \n            @RequiresOptIn(\n                \"\"${'\"'}\n                这种只保存引用的 Value 可能会导致意料之外的结果, 在使用时须保持谨慎.\n                对值的改变不会触发自动保存, 也不会同步到 UI 中. 在 UI 中只能编辑序列化之后的值.\n            \"\"${'\"'}, level = RequiresOptIn.Level.WARNING,\n            )\n            @Retention(AnnotationRetention.BINARY)\n            @Target(AnnotationTarget.FUNCTION)\n            annotation class DangerousReferenceOnlyValue\n        \"\"\"\n    )\n}\n\nfun genValueUseSite(kotlinTypeName: String, miraiValueName: String): String =\n    \"\"\"\n        fun PluginData.value(default: $kotlinTypeName): ${miraiValueName}Value = valueImpl(default)\n    \"\"\".trimIndent()\n\n"
  },
  {
    "path": "mirai-console/backend/codegen/src/old/ValueImplCodegen.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"PRE_RELEASE_CLASS\")\n\npackage net.mamoe.mirai.console.codegen.old\n\nimport org.intellij.lang.annotations.Language\nimport java.io.File\n\n\nfun main() {\n    println(File(\"\").absolutePath) // default project base dir\n\n    File(\"backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/data/internal/_ValueImpl.kt\").apply {\n        createNewFile()\n    }.writeText(buildString {\n        appendLine(COPYRIGHT)\n        appendLine()\n        appendLine(PACKAGE)\n        appendLine()\n        appendLine(IMPORTS)\n        appendLine()\n        appendLine()\n        appendLine(DO_NOT_MODIFY)\n        appendLine()\n        appendLine()\n        appendLine(genAllValueImpl())\n    })\n}\n\nprivate val DO_NOT_MODIFY = \"\"\"\n/**\n * !!! This file is auto-generated by backend/codegen/src/kotlin/net.mamoe.mirai.console.codegen.ValueImplCodegen.kt\n * !!! DO NOT MODIFY THIS FILE MANUALLY\n */\n\"\"\".trimIndent()\n\nprivate val PACKAGE = \"\"\"\npackage net.mamoe.mirai.console.data.internal\n\"\"\".trimIndent()\n\nprivate val IMPORTS = \"\"\"\nimport kotlinx.serialization.*\nimport kotlinx.serialization.builtins.*\nimport net.mamoe.mirai.console.data.*\n\"\"\".trimIndent()\n\n@Suppress(\"SpellCheckingInspection\")\nfun genAllValueImpl(): String = buildString {\n    fun appendln(@Language(\"kt\") code: String) {\n        this.appendLine(code.trimIndent())\n    }\n\n    // PRIMITIVE\n    for (number in NUMBERS + OTHER_PRIMITIVES) {\n        appendln(\n            genPrimitiveValueImpl(\n                number,\n                number,\n                \"$number.serializer()\",\n                false\n            )\n        )\n        appendLine()\n    }\n\n    // PRIMITIVE ARRAYS\n    for (number in NUMBERS + OTHER_PRIMITIVES.filterNot { it == \"String\" }) {\n        appendln(\n            genPrimitiveValueImpl(\n                \"${number}Array\",\n                \"${number}Array\",\n                \"${number}ArraySerializer()\",\n                true\n            )\n        )\n        appendLine()\n    }\n\n    // TYPED ARRAYS\n    for (number in NUMBERS + OTHER_PRIMITIVES) {\n        appendln(\n            genPrimitiveValueImpl(\n                \"Array<${number}>\",\n                \"Typed${number}Array\",\n                \"ArraySerializer(${number}.serializer())\",\n                true\n            )\n        )\n        appendLine()\n    }\n\n    // PRIMITIVE LISTS / SETS\n    for (collectionName in listOf(\"List\", \"Set\")) {\n        for (number in NUMBERS + OTHER_PRIMITIVES) {\n            appendln(\n                genCollectionValueImpl(\n                    collectionName,\n                    \"${collectionName}<${number}>\",\n                    \"${number}${collectionName}\",\n                    \"${collectionName}Serializer(${number}.serializer())\",\n                    false\n                )\n            )\n            appendLine()\n        }\n    }\n\n    appendLine()\n\n    // MUTABLE LIST / MUTABLE SET\n\n    for (collectionName in listOf(\"List\", \"Set\")) {\n        for (number in NUMBERS + OTHER_PRIMITIVES) {\n            @Suppress(\"unused\")\n            appendln(\n                \"\"\"\n                @JvmName(\"valueImplMutable${number}${collectionName}\")\n                internal fun PluginData.valueImpl(\n                    default: Mutable${collectionName}<${number}>\n                ): Mutable${number}${collectionName}Value {\n                    var internalValue: Mutable${collectionName}<${number}> = default\n\n                    val delegt = dynamicMutable${collectionName} { internalValue }\n                    return object : Mutable${number}${collectionName}Value(), Mutable${collectionName}<${number}> by delegt {\n                        override var value: Mutable${collectionName}<${number}>\n                            get() = internalValue\n                            set(new) {\n                                if (new != internalValue) {\n                                    internalValue = new\n                                    onElementChanged(this)\n                                }\n                            }\n                        \n                        private val outerThis get() = this\n                        \n                        override val serializer: KSerializer<Mutable${collectionName}<${number}>> = object : KSerializer<Mutable${collectionName}<${number}>> {\n                            private val delegate = ${collectionName}Serializer(${number}.serializer())\n                            override val descriptor: SerialDescriptor get() = delegate.descriptor\n\n                            override fun deserialize(decoder: Decoder): Mutable${collectionName}<${number}> {\n                                return delegate.deserialize(decoder).toMutable${collectionName}().observable {\n                                    onElementChanged(outerThis)\n                                }\n                            }\n\n                            override fun serialize(encoder: Encoder, value: Mutable${collectionName}<${number}>) {\n                                delegate.serialize(encoder, value)\n                            }\n                        }\n                    }\n                }\n        \"\"\"\n            )\n            appendLine()\n        }\n    }\n\n    appendLine()\n\n\n    @Suppress(\"unused\")\n    appendln(\n        \"\"\"\n            internal fun <T : PluginData> PluginData.valueImpl(default: T): Value<T> {\n                return object : PluginDataValue<T>() {\n                    private var internalValue: T = default\n                    override var value: T\n                        get() = internalValue\n                        set(new) {\n                            if (new != internalValue) {\n                                internalValue = new\n                                onElementChanged(this)\n                            }\n                        }\n                    override val serializer = object : KSerializer<T>{\n                        override val descriptor: SerialDescriptor\n                            get() = internalValue.updaterSerializer.descriptor\n\n                        override fun deserialize(decoder: Decoder): T {\n                            internalValue.updaterSerializer.deserialize(decoder)\n                            return internalValue\n                        }\n\n                        override fun serialize(encoder: Encoder, value: T) {\n                            internalValue.updaterSerializer.serialize(encoder, PluginDataSerializerMark)\n                        }\n                    }\n                }\n            }\n        \"\"\"\n    )\n}\n\nfun genPrimitiveValueImpl(\n    kotlinTypeName: String,\n    miraiValueName: String,\n    serializer: String,\n    isArray: Boolean\n): String =\n    \"\"\"\n        internal fun PluginData.valueImpl(default: ${kotlinTypeName}): ${miraiValueName}Value {\n            return object : ${miraiValueName}Value() {\n                private var internalValue: $kotlinTypeName = default\n                override var value: $kotlinTypeName\n                    get() = internalValue\n                    set(new) {\n                        ${\n        if (isArray) \"\"\"\n                        if (!new.contentEquals(internalValue)) {\n                            internalValue = new\n                            onElementChanged(this)\n                        }\n    \"\"\".trim()\n        else \"\"\"\n                        if (new != internalValue) {\n                            internalValue = new\n                            onElementChanged(this)\n                        }\n    \"\"\".trim()\n    }\n                    }\n                override val serializer get() = $serializer\n            }\n        }\n    \"\"\".trimIndent() + \"\\n\"\n\n\n@Suppress(\"SpellCheckingInspection\")\nfun genCollectionValueImpl(\n    collectionName: String,\n    kotlinTypeName: String,\n    miraiValueName: String,\n    serializer: String,\n    isArray: Boolean\n): String =\n    \"\"\"\n        internal fun PluginData.valueImpl(default: ${kotlinTypeName}): ${miraiValueName}Value {\n            var internalValue: $kotlinTypeName = default\n            val delegt = dynamic$collectionName { internalValue }\n            return object : ${miraiValueName}Value(), $kotlinTypeName by delegt {\n                override var value: $kotlinTypeName\n                    get() = internalValue\n                    set(new) {\n                        ${\n        if (isArray) \"\"\"\n                        if (!new.contentEquals(internalValue)) {\n                            internalValue = new\n                            onElementChanged(this)\n                        }\n    \"\"\".trim()\n        else \"\"\"\n                        if (new != internalValue) {\n                            internalValue = new\n                            onElementChanged(this)\n                        }\n    \"\"\".trim()\n    }\n                    }\n                override val serializer get() = $serializer\n            }\n        }\n    \"\"\".trimIndent() + \"\\n\"\n\n"
  },
  {
    "path": "mirai-console/backend/codegen/src/old/ValuesCodegen.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"ClassName\", \"unused\", \"PRE_RELEASE_CLASS\")\n\npackage net.mamoe.mirai.console.codegen.old\n\nimport org.intellij.lang.annotations.Language\nimport java.io.File\n\nfun main() {\n    println(File(\"\").absolutePath) // default project base dir\n\n    File(\"backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/data/_Value.kt\").apply {\n        createNewFile()\n    }.writeText(genPublicApi())\n}\n\ninternal val COPYRIGHT = \"\"\"\n/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\"\"\".trim()\n\ninternal val NUMBERS = listOf(\n    \"Int\",\n    \"Short\",\n    \"Byte\",\n    \"Long\",\n    \"Float\",\n    \"Double\"\n)\n\ninternal val UNSIGNED_NUMBERS = listOf(\n    \"UInt\",\n    \"UShort\",\n    \"UByte\",\n    \"ULong\"\n)\n\ninternal val OTHER_PRIMITIVES = listOf(\n    \"Boolean\",\n    \"Char\",\n    \"String\"\n)\n\nfun genPublicApi() = buildString {\n    fun appendln(@Language(\"kt\") code: String) {\n        this.appendLine(code.trimIndent())\n    }\n\n    appendln(COPYRIGHT.trim())\n    appendLine()\n    appendln(\n        \"\"\"\n            package net.mamoe.mirai.console.data\n\n            import kotlinx.serialization.KSerializer\n            import kotlin.properties.ReadWriteProperty\n            import kotlin.reflect.KProperty\n        \"\"\"\n    )\n    appendLine()\n    appendln(\n        \"\"\"\n            /**\n             * !!! This file is auto-generated by backend/codegen/src/main/kotlin/net.mamoe.mirai.console.codegen.ValuesCodegen.kt \n             * !!! for better performance\n             * !!! DO NOT MODIFY THIS FILE MANUALLY\n             */\n        \"\"\"\n    )\n    appendLine()\n\n    appendln(\n        \"\"\"\nsealed class Value<T : Any> : ReadWriteProperty<PluginData, T> {\n    abstract var value: T\n\n    /**\n     * 用于更新 [value] 的序列化器\n     */\n    abstract val serializer: KSerializer<T>\n    override fun getValue(thisRef: PluginData, property: KProperty<*>): T = value\n    override fun setValue(thisRef: PluginData, property: KProperty<*>, value: T) {\n        this.value = value\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (other==null)return false\n        if (other::class != this::class) return  false\n        other as Value<*>\n        return other.value == this.value\n    }\n\n    override fun hashCode(): Int = value.hashCode()\n}\n        \"\"\"\n    )\n    appendLine()\n\n    // PRIMITIVES\n\n    appendln(\n        \"\"\"\n            sealed class PrimitiveValue<T : Any> : Value<T>()\n\n            sealed class NumberValue<T : Number> : Value<T>()\n        \"\"\"\n    )\n\n    for (number in NUMBERS) {\n        val template = \"\"\"\n        abstract class ${number}Value internal constructor() : NumberValue<${number}>()\n    \"\"\"\n\n        appendln(template)\n    }\n\n    appendLine()\n\n    for (number in OTHER_PRIMITIVES) {\n        val template = \"\"\"\n        abstract class ${number}Value internal constructor() : PrimitiveValue<${number}>()\n    \"\"\"\n\n        appendln(template)\n    }\n\n    appendLine()\n\n    // ARRAYS\n\n    appendln(\n        \"\"\"\n            // T can be primitive array or typed Array \n            sealed class ArrayValue<T : Any> : Value<T>()\n    \"\"\"\n    )\n\n    //   PRIMITIVE ARRAYS\n    appendln(\n        \"\"\"\n            sealed class PrimitiveArrayValue<T : Any> : ArrayValue<T>()\n        \"\"\"\n    )\n    appendLine()\n\n    for (number in (NUMBERS + OTHER_PRIMITIVES).filterNot { it == \"String\" }) {\n        appendln(\n            \"\"\"\n            abstract class ${number}ArrayValue internal constructor() : PrimitiveArrayValue<${number}Array>(), Iterable<${number}> {\n                override fun iterator(): Iterator<${number}> = this.value.iterator()\n            }\n    \"\"\"\n        )\n        appendLine()\n    }\n\n    appendLine()\n\n    //   TYPED ARRAYS\n\n    appendln(\n        \"\"\"\n            sealed class TypedPrimitiveArrayValue<E> : ArrayValue<Array<E>>() , Iterable<E>{\n                override fun iterator() = this.value.iterator()\n            }\n    \"\"\"\n    )\n    appendLine()\n\n    for (number in (NUMBERS + OTHER_PRIMITIVES)) {\n        appendln(\n            \"\"\"\n            abstract class Typed${number}ArrayValue internal constructor() : TypedPrimitiveArrayValue<${number}>()\n    \"\"\"\n        )\n    }\n\n    appendLine()\n\n    //   TYPED LISTS / SETS\n    for (collectionName in listOf(\"List\", \"Set\")) {\n\n        appendln(\n            \"\"\"\n            sealed class ${collectionName}Value<E> : Value<${collectionName}<E>>(), ${collectionName}<E>\n    \"\"\"\n        )\n\n        for (number in (NUMBERS + OTHER_PRIMITIVES)) {\n            val template = \"\"\"\n            abstract class ${number}${collectionName}Value internal constructor() : ${collectionName}Value<${number}>()\n    \"\"\"\n\n            appendln(template)\n        }\n\n        appendLine()\n        // SETTING\n        appendln(\n            \"\"\"\n        abstract class PluginData${collectionName}Value<T: PluginData> internal constructor() : Value<${collectionName}<T>>(), ${collectionName}<T>\n    \"\"\"\n        )\n        appendLine()\n    }\n\n    // SETTING VALUE\n\n    appendln(\n        \"\"\"\n            abstract class PluginDataValue<T : PluginData> internal constructor() : Value<T>()\n        \"\"\"\n    )\n\n    appendLine()\n\n    // MUTABLE LIST / MUTABLE SET\n    for (collectionName in listOf(\"List\", \"Set\")) {\n        appendln(\n            \"\"\"\n        abstract class Mutable${collectionName}Value<T : Any> internal constructor() : Value<Mutable${collectionName}<Value<T>>>(), Mutable${collectionName}<T>\n    \"\"\"\n        )\n\n        appendLine()\n\n        for (number in (NUMBERS + OTHER_PRIMITIVES)) {\n            appendln(\n                \"\"\"\n        abstract class Mutable${number}${collectionName}Value internal constructor() : Value<Mutable${collectionName}<${number}>>(), Mutable${collectionName}<${number}>\n    \"\"\"\n            )\n        }\n\n        appendLine()\n        // SETTING\n        appendln(\n            \"\"\"\n        abstract class MutablePluginData${collectionName}Value<T: PluginData> internal constructor() : Value<Mutable${collectionName}<T>>(), Mutable${collectionName}<T>\n    \"\"\"\n        )\n        appendLine()\n    }\n\n    appendLine()\n    // DYNAMIC\n\n    appendln(\n        \"\"\"\n        /**\n         * 只引用这个对象, 而不跟踪其成员.\n         * 仅适用于基础类型, 用于 mutable list/map 等情况; 或标注了 [Serializable] 的类.\n         */\n        abstract class DynamicReferenceValue<T : Any> : Value<T>()\n    \"\"\"\n    )\n}"
  },
  {
    "path": "mirai-console/backend/codegen/src/util.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\", \"MemberVisibilityCanBePrivate\", \"unused\", \"PRE_RELEASE_CLASS\")\n\npackage net.mamoe.mirai.console.codegen\n\nimport org.intellij.lang.annotations.Language\nimport java.io.File\n\n\ntypealias KtByte = KtType.KtPrimitive.KtByte\ntypealias KtShort = KtType.KtPrimitive.KtShort\ntypealias KtInt = KtType.KtPrimitive.KtInt\ntypealias KtLong = KtType.KtPrimitive.KtLong\ntypealias KtFloat = KtType.KtPrimitive.KtFloat\ntypealias KtDouble = KtType.KtPrimitive.KtDouble\ntypealias KtChar = KtType.KtPrimitive.KtChar\ntypealias KtBoolean = KtType.KtPrimitive.KtBoolean\n\ntypealias KtString = KtType.KtString\n\ntypealias KtCollection = KtType.KtCollection\ntypealias KtMap = KtType.KtMap\n\ntypealias KtPrimitive = KtType.KtPrimitive\n\n\nsealed class KtType {\n    /**\n     * Its classname in standard library\n     */\n    abstract val standardName: String\n    override fun toString(): String = standardName\n\n    /**\n     * Not Including [String]\n     */\n    sealed class KtPrimitive(\n        override val standardName: String,\n        val jPrimitiveName: String = standardName.lowercase(),\n        val jObjectName: String = standardName\n    ) : KtType() {\n        object KtByte : KtPrimitive(\"Byte\")\n        object KtShort : KtPrimitive(\"Short\")\n        object KtInt : KtPrimitive(\"Int\", jObjectName = \"Integer\")\n        object KtLong : KtPrimitive(\"Long\")\n\n        object KtFloat : KtPrimitive(\"Float\")\n        object KtDouble : KtPrimitive(\"Double\")\n\n        object KtChar : KtPrimitive(\"Char\", jObjectName = \"Character\")\n        object KtBoolean : KtPrimitive(\"Boolean\")\n    }\n\n    object KtString : KtType() {\n        override val standardName: String get() = \"String\"\n    }\n\n    /**\n     * [List], [Set]\n     */\n    data class KtCollection(override val standardName: String) : KtType()\n\n    object KtMap : KtType() {\n        override val standardName: String get() = \"Map\"\n    }\n\n    data class Custom(override val standardName: String) : KtType() {\n        override fun toString(): String {\n            return standardName\n        }\n    }\n\n    companion object {\n        operator fun invoke(standardName: String): KtType = Custom(standardName)\n    }\n}\n\nval KtPrimitiveIntegers = listOf(KtByte, KtShort, KtInt, KtLong)\nval KtPrimitiveFloatings = listOf(KtFloat, KtDouble)\n\nval KtPrimitiveNumbers = KtPrimitiveIntegers + KtPrimitiveFloatings\nval KtPrimitiveNonNumbers = listOf(KtChar, KtBoolean)\n\nval KtPrimitives = KtPrimitiveNumbers + KtPrimitiveNonNumbers\n\noperator fun KtType.plus(type: KtType): List<KtType> {\n    return listOf(this, type)\n}\n\nval KtType.lowerCaseName: String get() = this.standardName.lowercase()\n\ninline fun kCode(@Language(\"kt\") source: String) = source.trimIndent()\n\nfun codegen(targetFile: String, block: CodegenScope.() -> Unit) {\n    //// region PrimitiveValue CODEGEN ////\n    //// region PrimitiveValue CODEGEN ////\n\n    targetFile.findFileSmart().also {\n        println(\"Codegen target: ${it.absolutePath}\")\n    }.apply {\n        writeText(\n            CodegenScope().apply(block).onEach {\n                println(\"Applying replacement: $it\")\n            }.applyTo(readText())\n        )\n    }\n}\n\nfun String.findFileSmart(): File = kotlin.run {\n    if (contains(\"/\")) { // absolute\n        File(this)\n    } else {\n        val list = File(\".\").walk().filter { it.name == this }.toList()\n        if (list.isNotEmpty()) return list.single()\n\n        File(\".\").walk().filter { it.name.contains(this) }.single()\n    }\n}.also {\n    require(it.exists()) { \"file doesn't exist\" }\n}"
  },
  {
    "path": "mirai-console/backend/integration-test/README.md",
    "content": "# Console - Integration Test\n\nMirai Console 一体化测试单元 (目前仅内部测试)\n\n---\n\n## 使用 Integration Test Framework\n\nTODO\n\n### 添加一个新测试\n\n#### 创建 Integration Test 测试点\n\n创建一个新的子测试单元并继承 `AbstractTestPoint`\n\n- 在其 `beforeConsoleStartup()` 准备测试环境 (如写入配置文件, etc)\n- 在其 `onConsoleStartSuccessfully()` 检查插件相关行为是否正确\n\n然后在 `MiraiConsoleIntegrationTestLauncher.points` 添加新单元的完整类路径\n\n----\n\n## Mirai Console Internal Testing\n\n### 添加一个新测试 (CONSOLE 内部测试)\n\n在 `test/testpoints` 添加新测试点,\n然后在 [`MiraiConsoleIntegrationTestBootstrap.kt`](test/MiraiConsoleIntegrationTestBootstrap.kt)\n添加相关单元\n\n### 创建配套子插件\n\n在 `testers` 创建新的文件夹, 刷新 Gradle 即可获得生成的 build.gradle.kts.\n即可创建新的配套插件, 可用于测试插件依赖, etc\n\n只有在修改 build.gradle.kts 后才需要将其添加 git, 其他情况下会自动生成."
  },
  {
    "path": "mirai-console/backend/integration-test/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"UnusedImport\")\n\nimport java.util.*\n\nplugins {\n    kotlin(\"jvm\")\n    kotlin(\"plugin.serialization\")\n    id(\"java\")\n}\n\nversion = Versions.console\ndescription = \"Mirai Console Backend Real-Time Testing Unit\"\n\nkotlin {\n    explicitApiWarning()\n}\n\ndependencies {\n    api(project(\":mirai-core-api\"))\n    api(project(\":mirai-core-utils\"))\n    testRuntimeOnly(project(\":mirai-core\"))\n    api(project(\":mirai-console-compiler-annotations\"))\n    api(project(\":mirai-console\"))\n    api(project(\":mirai-console-frontend-base\"))\n    api(project(\":mirai-console-terminal\"))\n\n    api(`kotlin-stdlib-jdk8`)\n    api(`kotlinx-atomicfu`)\n    api(`kotlinx-coroutines-core`)\n    api(`kotlinx-serialization-core`)\n    api(`kotlinx-serialization-json`)\n    api(`kotlin-reflect`)\n    api(`kotlin-test-junit5`)\n\n\n    api(`yamlkt`)\n    api(`jetbrains-annotations`)\n    api(`caller-finder`)\n    api(`kotlinx-coroutines-jdk8`)\n\n\n    val asmVersion = Versions.asm\n    fun asm(module: String) = \"org.ow2.asm:asm-$module:$asmVersion\"\n\n    api(asm(\"tree\"))\n    api(asm(\"util\"))\n    api(asm(\"commons\"))\n\n}\n\n// requires manual run\nval deleteSandbox = tasks.register(\"deleteSandbox\", Delete::class.java) {\n    group = \"mirai\"\n    delete(\"build/IntegrationTest\")\n}\n//tasks.getByName(\"clean\").dependsOn(deleteSandbox)\n\nval subplugins = mutableListOf<TaskProvider<Jar>>()\n\nval mcit_test = tasks.named<Test>(\"test\")\nmcit_test.configure {\n    val test0 = this\n    doFirst {\n        // For IDEA Debugging\n        @Suppress(\"UNNECESSARY_NOT_NULL_ASSERTION\")\n        val extArgs = test0.jvmArgs!!.asSequence().map { extArg ->\n            Base64.getEncoder().encodeToString(extArg.toByteArray())\n        }.joinToString(\",\")\n        test0.jvmArgs = mutableListOf()\n        test0.environment(\"IT_ARGS\", extArgs)\n\n        // For plugins coping\n        val jars = subplugins.asSequence()\n            .map { it.get() }\n            .flatMap { it.outputs.files.files.asSequence() }\n            .toList()\n\n        test0.environment(\"IT_PLUGINS\", jars.size)\n        jars.forEachIndexed { index, jar ->\n            test0.environment(\"IT_PLUGINS_$index\", jar.absolutePath)\n        }\n\n    }\n}\n\nval crtProject = project\nallprojects {\n    if (project != crtProject) {\n        if (project.file(\".module-group.txt\").exists()) return@allprojects\n        project.afterEvaluate {\n            runCatching {\n                val tk = tasks.named<Jar>(\"jar\")\n                subplugins.add(tk)\n                mcit_test.configure {\n                    dependsOn(tk)\n                    inputs.files(tk)\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/src/AbstractTestPoint.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.console.integrationtest\n\n/**\n * IntegrationTest 测试单元\n *\n * 每个被注册的单元都会在 console 启动的各个阶段调用相关的函数, 可以在相关函数执行测试代码\n *\n * ## 注册单元\n *\n * 每个单元都需要被注册, 即被添加进 [MiraiConsoleIntegrationTestLauncher.points]\n *\n * @see MiraiConsoleIntegrationTestLauncher\n * @see AbstractTestPointAsPlugin\n */\npublic abstract class AbstractTestPoint {\n    /**\n     * 本函数会在 console 启动前调用, 可以在此处进行环境配置\n     */\n    protected open fun beforeConsoleStartup() {}\n\n    /**\n     * 本函数会在 console 启动成功后立即调用, 可进行环境检查, 命令执行测试, 或更多\n     */\n    protected open fun onConsoleStartSuccessfully() {}\n\n    // access\n    internal companion object {\n        internal fun AbstractTestPoint.internalOSS() {\n            onConsoleStartSuccessfully()\n        }\n\n        internal fun AbstractTestPoint.internalBCS() {\n            beforeConsoleStartup()\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/src/AbstractTestPointAsPlugin.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.console.integrationtest\n\nimport net.mamoe.mirai.console.extension.PluginComponentStorage\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport net.mamoe.mirai.utils.createInstanceOrNull\n\n/**\n * IntegrationTest 测试单元 (Plugin mode)\n *\n * 该单元除了拥有 [AbstractTestPoint] 具有的功能之外, 还可以直接模拟一个插件的行为.\n *\n * 在此单元里, 可以像写正常的 console 插件一样在此写测试时插件\n */\npublic abstract class AbstractTestPointAsPlugin : AbstractTestPoint() {\n    protected abstract fun newPluginDescription(): JvmPluginDescription\n\n    protected open fun KotlinPlugin.onInit() {}\n    protected open fun KotlinPlugin.onLoad0(storage: PluginComponentStorage) {}\n    protected open fun KotlinPlugin.onEnable0() {}\n    protected open fun KotlinPlugin.onDisable0() {}\n\n    protected open fun exceptionHandler(exception: Throwable, step: JvmPluginExecutionStep, instance: KotlinPlugin) {\n        IntegrationTestBootstrapContext.failures.add(this.javaClass)\n    }\n\n    private fun callEH(exception: Throwable, step: JvmPluginExecutionStep, instance: KotlinPlugin) {\n        try {\n            exceptionHandler(exception, step, instance)\n        } catch (e: Throwable) {\n            forceFail(cause = e)\n        }\n    }\n\n    protected enum class JvmPluginExecutionStep {\n        OnEnable, OnDisable, OnLoad\n    }\n\n\n    @Suppress(\"unused\")\n    @PublishedApi\n    internal abstract class TestPointPluginImpl(\n        private val impl: AbstractTestPointAsPlugin\n    ) : KotlinPlugin(impl.newPluginDescription()) {\n\n        init {\n            impl.apply { onInit() }\n        }\n\n        @PublishedApi\n        internal constructor(\n            impl: Class<out AbstractTestPointAsPlugin>\n        ) : this(\n            impl.kotlin.createInstanceOrNull() ?: impl.getConstructor().newInstance()\n        )\n\n        override fun onDisable() {\n            try {\n                impl.apply { onDisable0() }\n            } catch (e: Throwable) {\n                impl.callEH(e, JvmPluginExecutionStep.OnDisable, this)\n                throw e\n            }\n        }\n\n        override fun onEnable() {\n            try {\n                impl.apply { onEnable0() }\n            } catch (e: Throwable) {\n                impl.callEH(e, JvmPluginExecutionStep.OnEnable, this)\n                throw e\n            }\n        }\n\n        override fun PluginComponentStorage.onLoad() {\n            try {\n                impl.apply { onLoad0(this@onLoad) }\n            } catch (e: Throwable) {\n                impl.callEH(e, JvmPluginExecutionStep.OnLoad, this@TestPointPluginImpl)\n                throw e\n            }\n        }\n    }\n\n}\n\n"
  },
  {
    "path": "mirai-console/backend/integration-test/src/IntegrationTestBootstrap.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmName(\"IntegrationTestBootstrap\")\n@file:OptIn(ConsoleFrontEndImplementation::class, ConsoleExperimentalApi::class, ConsoleInternalApi::class)\n\npackage net.mamoe.console.integrationtest\n\nimport kotlinx.coroutines.cancelAndJoin\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.console.integrationtest.AbstractTestPoint.Companion.internalBCS\nimport net.mamoe.console.integrationtest.AbstractTestPoint.Companion.internalOSS\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.terminal.ConsoleTerminalExperimentalApi\nimport net.mamoe.mirai.console.terminal.ConsoleTerminalSettings\nimport net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.console.util.ConsoleInternalApi\nimport net.mamoe.mirai.utils.cast\nimport net.mamoe.mirai.utils.sha1\nimport net.mamoe.mirai.utils.toUHexString\nimport org.objectweb.asm.*\nimport java.io.File\nimport java.io.FileDescriptor\nimport java.io.FileOutputStream\nimport java.io.PrintStream\nimport java.util.concurrent.ConcurrentLinkedDeque\nimport java.util.zip.ZipEntry\nimport java.util.zip.ZipFile\nimport java.util.zip.ZipOutputStream\nimport kotlin.system.exitProcess\n\ninternal object IntegrationTestBootstrapContext {\n    val failures = ConcurrentLinkedDeque<Class<*>>()\n}\n\n/**\n * 入口点为 /test/MiraiConsoleIntegrationTestBootstrap.kt 并非此函数(文件),\n * 不要直接执行此函数\n */\n@OptIn(ConsoleTerminalExperimentalApi::class)\n@PublishedApi\ninternal fun main() {\n    // PRE CHECK\n    run {\n        if (!System.getenv(\"MIRAI_CONSOLE_INTEGRATION_TEST\").orEmpty().toBoolean()) {\n            error(\"Don't launch IntegrationTestBootstrap directly. See /test/MiraiConsoleIntegrationTestBootstrap.kt\")\n        }\n    }\n    System.setProperty(\"mirai.console.skip-end-user-readme\", \"\")\n    // @context: env.testunit = true\n    // @context: env.inJUnitProcess = false\n    // @context: env.exitProcessSafety = true\n    // @context: process.type = sandbox\n    // @context: process.cwd = /mirai-console/backend/build/rttu\n    // @context: process.timeout = 5min\n\n    ConsoleTerminalSettings.setupAnsi = false\n    ConsoleTerminalSettings.noConsole = true\n    ConsoleTerminalSettings.launchOptions.crashWhenPluginLoadFailed = true\n\n    val testUnits: List<AbstractTestPoint> = readStringListFromEnv(\"IT_POINTS\").asSequence()\n        .onEach { println(\"[MCIT] Loading test point: $it\") }\n        .map { Class.forName(it) }\n        .map {\n            @Suppress(\"DEPRECATION\")\n            it.kotlin.objectInstance ?: it.newInstance()\n        }\n        .map { it.cast<AbstractTestPoint>() }\n        .toList()\n\n    File(\"plugins\").mkdirs()\n    File(\"modules\").mkdirs()\n    prepareConsole()\n\n    testUnits.forEach { (it as? AbstractTestPointAsPlugin)?.generatePluginJar() }\n    testUnits.forEach { it.internalBCS() }\n\n    Thread.sleep(2000L)\n\n    try {\n        MiraiConsoleTerminalLoader.startAsDaemon()\n    } catch (e: Throwable) {\n        val ps = PrintStream(FileOutputStream(FileDescriptor.out))\n        e.printStackTrace(ps)\n        ps.flush()\n        exitProcess(1)\n    }\n    if (!MiraiConsole.isActive) {\n        error(\"Failed to start console\")\n    }\n    if (IntegrationTestBootstrapContext.failures.isNotEmpty()) {\n        val logger = MiraiConsole.mainLogger\n        logger.error(\"Failed tests: \")\n        IntegrationTestBootstrapContext.failures.toSet().forEach {\n            logger.error(\"  `- $it\")\n        }\n        error(\"Failed tests: ${IntegrationTestBootstrapContext.failures.toSet()}\")\n    }\n\n    // I/main: mirai-console started successfully.\n\n    testUnits.forEach { it.internalOSS() }\n\n    runBlocking {\n        MiraiConsole.job.cancelAndJoin()\n    }\n    exitProcess(0)\n}\n\nprivate fun File.mkparents(): File = apply { parentFile?.mkdirs() }\nprivate fun prepareConsole() {\n    File(\"config/Console/Logger.yml\").mkparents().writeText(\n        \"\"\"\ndefaultPriority: ALL\nloggers: \n  Bot: ALL\n  org.eclipse.aether.internal: INFO\n  org.apache.http.wire: INFO\n\"\"\"\n    )\n    fun saveSha1(t: File) {\n        val sfile = File(t.path + \".sha1\")\n        sfile.writeText(t.readBytes().sha1().toUHexString(separator = \"\").lowercase())\n    }\n\n    readStringListFromEnv(\"IT_PLUGINS\").forEach plLoop@{ path ->\n        val jarFile = File(path)\n        ZipFile(jarFile).use { zipFile ->\n            zipFile.getEntry(\"mvn.txt\")?.let { zipFile.getInputStream(it) }?.bufferedReader()?.useLines { lines ->\n                val libName = lines.filterNot { it.isBlank() }.filterNot { it[0] == '#' }.first()\n                // net.mamoe:test:1.0.0\n                val (gid, art, ver) = libName.split(':')\n                val targetDir = File(\"plugin-libraries\").resolve(gid.replace('.', '/'))\n                    .resolve(art).resolve(ver).also { it.mkdirs() }\n                val fname = \"$art-$ver\"\n                val pom = \"\"\"\n                    <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n                    <project>\n                    <modelVersion>4.0.0</modelVersion>\n                    <groupId>$gid</groupId>\n                    <artifactId>$art</artifactId>\n                    <version>$ver</version>\n                    </project>\n                \"\"\".trimIndent()\n                targetDir.resolve(\"$fname.pom\").let { it.writeText(pom); saveSha1(it) }\n                targetDir.resolve(\"$fname.jar\").let {\n                    jarFile.copyTo(it, overwrite = true)\n                    saveSha1(it)\n                }\n                targetDir.resolve(\"_remote.repositories\").writeText(\n                    \"\"\"\n                        $fname.pom>=\n                        $fname.jar>=\n                    \"\"\".trimIndent()\n                )\n                println(\"[MCIT] Copied module: $libName $jarFile -> $targetDir\")\n                return@plLoop\n            }\n            if (zipFile.getEntry(\"module.txt\") == null) {\n                if (zipFile.entries().asSequence().any {\n                        it.name.contains(\"services/net.mamoe.mirai.console.plugin.jvm\")\n                    }\n                ) {\n                    var target = File(\"plugins/${jarFile.name}\").mkparents()\n                    var counter = 0\n                    while (target.exists()) {\n                        target = File(\"plugins/${jarFile.nameWithoutExtension}${counter}.${jarFile.extension}\")\n                        counter++\n                    }\n                    jarFile.copyTo(target, overwrite = true)\n                    println(\"[MCIT] Copied external plugin: $jarFile -> $target\")\n                    return@plLoop\n                }\n            }\n            // DYN MODULE\n            val target = File(\"modules/${jarFile.name}\").mkparents()\n            jarFile.copyTo(target, overwrite = true)\n            println(\"[MCIT] Copied module: $jarFile\")\n        }\n    }\n}\n\nprivate fun AbstractTestPointAsPlugin.generatePluginJar() {\n    val simpleName = this.javaClass.simpleName\n    val point = this\n    val jarFile = File(\"plugins\").resolve(\"$simpleName.jar\")\n    // PluginMainPoint: net.mamoe.console.integrationtestAbstractTestPointAsPlugin$TestPointPluginImpl\n    jarFile.mkparents()\n    ZipOutputStream(\n        FileOutputStream(jarFile).buffered()\n    ).use { zipOutputStream ->\n\n        // META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin\n        zipOutputStream.putNextEntry(\n            ZipEntry(\n                \"META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin\"\n            )\n        )\n        val delegateClassName = \"net.mamoe.console.integrationtest.tpd.$simpleName\"\n        zipOutputStream.write(delegateClassName.toByteArray())\n\n        // MainClass\n        val internalClassName = delegateClassName.replace('.', '/')\n        zipOutputStream.putNextEntry(ZipEntry(\"$internalClassName.class\"))\n        val classWriter = ClassWriter(ClassWriter.COMPUTE_MAXS)\n        val superName = \"net/mamoe/console/integrationtest/AbstractTestPointAsPlugin\\$TestPointPluginImpl\"\n        classWriter.visit(\n            Opcodes.V1_8,\n            Opcodes.ACC_PUBLIC,\n            internalClassName,\n            null,\n            superName,\n            null\n        )\n\n        // region Copy class annotations\n        this.javaClass.getResourceAsStream(javaClass.simpleName + \".class\")!!.use {\n            ClassReader(it)\n        }.accept(object : ClassVisitor(Opcodes.ASM9) {\n            override fun visitAnnotation(descriptor: String, visible: Boolean): AnnotationVisitor? {\n                if (\"kotlin/Metadata\" in descriptor) return null\n                return classWriter.visitAnnotation(descriptor, visible)\n            }\n\n            override fun visitTypeAnnotation(\n                typeRef: Int,\n                typePath: TypePath,\n                descriptor: String,\n                visible: Boolean\n            ): AnnotationVisitor? {\n                if (\"kotlin/Metadata\" in descriptor) return null\n                return classWriter.visitTypeAnnotation(typeRef, typePath, descriptor, visible)\n            }\n        }, ClassReader.SKIP_CODE)\n        // endregion\n\n        classWriter.visitMethod(\n            Opcodes.ACC_PUBLIC,\n            \"<init>\", \"()V\", null, null\n        )!!.let { initMethod ->\n            initMethod.visitVarInsn(Opcodes.ALOAD, 0)\n            initMethod.visitLdcInsn(Type.getType(point.javaClass))\n            initMethod.visitMethodInsn(Opcodes.INVOKESPECIAL, superName, \"<init>\", \"(Ljava/lang/Class;)V\", false)\n            initMethod.visitInsn(Opcodes.RETURN)\n            initMethod.visitMaxs(0, 0)\n            initMethod.visitEnd()\n        }\n\n        zipOutputStream.write(classWriter.toByteArray())\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/src/MiraiConsoleIntegrationTestLauncher.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.console.integrationtest\n\nimport net.mamoe.mirai.utils.lateinitMutableProperty\nimport java.io.File\nimport java.io.OutputStream\nimport java.io.PrintStream\nimport java.lang.management.ManagementFactory\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.atomic.AtomicBoolean\nimport kotlin.concurrent.thread\n\n// TODO: 不完整, 还无法完全公开, 目前仅允许 console 内部使用\n/**\n * MiraiConsoleIntegrationTest 启动器\n */\npublic class MiraiConsoleIntegrationTestLauncher {\n    /** java.exe 路径 */\n    public var javaexec: String by lateinitMutableProperty { findJavaExec() }\n\n    /**\n     * 测试环境运行目录, **每次启动前会直接删除该文件夹的内容**(IMPORTANT)\n     */\n    public var workingDir: File = File(\"mirai-console-integration-test\")\n\n    /** 额外 JVM 参数 */\n    public var vmoptions: MutableList<String> = mutableListOf()\n\n    /** 额外环境变量 */\n    public var extraEnvironment: MutableMap<String, String> = mutableMapOf()\n\n    /** 类路径, 需要包含 MiraiConsoleIntegrationTest Framework */\n    public var classpath: String by lateinitMutableProperty { ManagementFactory.getRuntimeMXBean().classPath }\n\n    /** 标准输出重定向位置 */\n    public var output: OutputStream = System.out\n    /** 标准错误重定向位置 */\n    public var error: OutputStream = System.err\n    /** [MiraiConsoleIntegrationTestLauncher] 启动日志的输出 */\n    public var log: PrintStream = System.out\n\n    /** 测试单元完整类名, 需要可以在 [classpath] 中找到 */\n    public var points: MutableCollection<String> = mutableListOf()\n    /** 测试环境的额外插件, 为文件路径, 相对于 [workingDir] */\n    public var plugins: MutableCollection<String> = mutableListOf()\n\n    public fun launch() {\n        workingDir.listFiles()?.filterNot { it.name.contains(\"libraries\") }\n            ?.forEach { it.deleteRecursively() } // do not download repeatedly\n        workingDir.mkdirs()\n        val isDebugging = vmoptions.any { it.startsWith(\"-agentlib:\") }\n\n        val builder = ProcessBuilder(\n            javaexec,\n            *vmoptions.toTypedArray(),\n            \"-cp\", classpath,\n            \"net.mamoe.console.integrationtest.IntegrationTestBootstrap\",\n        )\n            .directory(workingDir)\n        // .inheritIO() // No output in idea\n        val env = builder.environment()\n        env.putAll(extraEnvironment)\n        env[\"MIRAI_CONSOLE_INTEGRATION_TEST\"] = \"true\"\n        saveStringListToEnv(\"IT_PLUGINS\", plugins, env)\n        saveStringListToEnv(\"IT_POINTS\", points, env)\n\n        log.println(\"[MCIT] Launching IntegrationTest\")\n        log.println(\"[MCIT]    `- Arguments: ${builder.command().joinToString(\" \")}\")\n        log.println(\"[MCIT]    `- Directory: ${builder.directory().absoluteFile}\")\n        log.println(\"[MCIT]    `- Debugging: $isDebugging\")\n        if (isDebugging) {\n            log.println(\"[MCIT] Running in debug mode. Watchdog thread will not start\")\n        }\n\n        val process = builder.start()\n\n        val timedOut = AtomicBoolean(false)\n        val watchdog = thread {\n            if (isDebugging) return@thread\n            try {\n                Thread.sleep(TimeUnit.MINUTES.toMillis(5))\n                timedOut.set(true)\n                process.destroyForcibly()\n            } catch (ignored: InterruptedException) {\n            }\n        }\n\n        thread { process.inputStream.copyTo(output) }\n        thread { process.errorStream.copyTo(error) }\n\n        val rsp = process.waitFor()\n        if (timedOut.get()) {\n            error(\"Mirai console daemon timed out\")\n        }\n        watchdog.interrupt()\n        if (rsp != 0) error(\"Rsp $rsp\")\n    }\n}\n\nprivate fun findJavaExec(): String {\n    findJavaExec0()?.let { return it.absolutePath }\n    System.err.println(\"[MCIT] WARNING: Unable to determine the current runtime executable path.\")\n    System.err.println(\"[MCIT] WARNING: Using default executable to launch test unit\")\n    return \"java\"\n}\n\nprivate fun findJavaExec0(): File? {\n    val ext = if (\"windows\" in System.getProperty(\"os.name\").lowercase()) {\n        \".exe\"\n    } else \"\"\n\n    val javaHome = File(System.getProperty(\"java.home\"))\n    javaHome.resolve(\"bin/java$ext\").takeIf { it.exists() }?.let { return it }\n    javaHome.resolve(\"java$ext\").takeIf { it.exists() }?.let { return it }\n\n\n    javaHome.resolve(\"jre/bin/java$ext\").takeIf { it.exists() }?.let { return it }\n    javaHome.resolve(\"jre/java$ext\").takeIf { it.exists() }?.let { return it }\n\n    return null\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/src/utils.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.console.integrationtest\n\nimport net.mamoe.mirai.console.internal.plugin.ConsoleJvmPluginTestFailedError\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport org.junit.jupiter.api.fail\nimport org.objectweb.asm.ClassReader\nimport org.objectweb.asm.ClassWriter\nimport org.objectweb.asm.Opcodes\nimport org.objectweb.asm.tree.ClassNode\nimport java.io.File\nimport java.util.*\n\ninternal fun readStringListFromEnv(key: String): MutableList<String> {\n    val size = System.getenv(key)?.toInt() ?: 0\n    val rsp = mutableListOf<String>()\n    for (i in 0 until size) {\n        rsp.add(System.getenv(\"${key}_$i\")!!)\n    }\n    return rsp\n}\n\ninternal fun saveStringListToEnv(key: String, value: Collection<String>, env: MutableMap<String, String>) {\n    env[key] = value.size.toString()\n    value.forEachIndexed { index, v ->\n        env[\"${key}_$index\"] = v\n    }\n}\n\n// region assertion kits\npublic fun File.assertNotExists() {\n    if (exists()) {\n        fail { \"Except ${this.absolutePath} not exists but this file exists in disk\" }\n    }\n}\n\npublic fun assertClassSame(expected: Class<*>?, actually: Class<*>?) {\n    fun vt(c: Class<*>?): String {\n        if (c == null) return \"<null>\"\n        return \"$c from ${c.classLoader}\"\n    }\n    if (expected === actually) return\n    fail {\n        \"Class not same:\\n\" +\n                \"Class excepted: ${vt(expected)}\\n\" +\n                \"Class actually: ${vt(actually)}\"\n    }\n}\n\n@OptIn(MiraiInternalApi::class)\npublic fun forceFail(\n    msg: String? = null,\n    cause: Throwable? = null,\n): Nothing {\n    throw ConsoleJvmPluginTestFailedError(msg, cause)\n}\n// endregion\n\n// region JVM Utils\npublic val vmClassfileVersion: Int = runCatching {\n    val obj = ClassReader(\"java.lang.Object\")\n    val classobj = ClassNode().also { obj.accept(it, ClassReader.SKIP_CODE) }\n    classobj.version\n}.recoverCatching {\n    val ccl = object : ClassLoader(null) {\n        fun canLoad(ver: Int): Boolean {\n            val klass = ClassWriter(ClassWriter.COMPUTE_MAXS)\n            val cname =\n                \"net/mamoe/console/integrationtest/vtest/C${ver}_${System.currentTimeMillis()}_${UUID.randomUUID()}\"\n                    .replace('-', '_')\n\n            klass.visit(\n                ver,\n                Opcodes.ACC_PUBLIC or Opcodes.ACC_FINAL,\n                cname,\n                null, \"java/lang/Object\", null\n            )\n            klass.visitMethod(Opcodes.ACC_PRIVATE, \"<init>\", \"()V\", null, null)!!.also { cinit ->\n                cinit.visitVarInsn(Opcodes.ALOAD, 0)\n                cinit.visitMethodInsn(Opcodes.INVOKESPECIAL, \"java/lang/Object\", \"<init>\", \"()V\", false)\n                cinit.visitInsn(Opcodes.RETURN)\n                cinit.visitMaxs(0, 0)\n            }\n            val code = klass.toByteArray()\n            return kotlin.runCatching {\n                val k = defineClass(null, code, 0, code.size)\n                Class.forName(k.name, true, this)\n            }.isSuccess\n        }\n    }\n    if (ccl.canLoad(Opcodes.V17)) return@recoverCatching Opcodes.V17\n    if (ccl.canLoad(Opcodes.V16)) return@recoverCatching Opcodes.V16\n    if (ccl.canLoad(Opcodes.V15)) return@recoverCatching Opcodes.V15\n    if (ccl.canLoad(Opcodes.V14)) return@recoverCatching Opcodes.V14\n    if (ccl.canLoad(Opcodes.V13)) return@recoverCatching Opcodes.V13\n    if (ccl.canLoad(Opcodes.V12)) return@recoverCatching Opcodes.V12\n    if (ccl.canLoad(Opcodes.V11)) return@recoverCatching Opcodes.V11\n    if (ccl.canLoad(Opcodes.V10)) return@recoverCatching Opcodes.V10\n    if (ccl.canLoad(Opcodes.V9)) return@recoverCatching Opcodes.V9\n    Opcodes.V1_8\n}.getOrElse { Opcodes.V1_8 } // Fallback\n\npublic fun canVmLoad(opversion: Int): Boolean = opversion <= vmClassfileVersion\n\n// endregion\n"
  },
  {
    "path": "mirai-console/backend/integration-test/test/MiraiConsoleIntegrationTestBootstrap.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.console.integrationtest\n\nimport net.mamoe.console.integrationtest.testpoints.MCITBSelfAssertions\nimport org.objectweb.asm.ClassReader\nimport java.io.File\nimport java.lang.management.ManagementFactory\nimport java.nio.file.Files\nimport java.nio.file.Paths\nimport java.util.*\nimport java.util.stream.Collectors\nimport kotlin.io.path.inputStream\nimport kotlin.io.path.isDirectory\nimport kotlin.io.path.name\nimport kotlin.reflect.KClass\nimport kotlin.test.Test\nimport kotlin.test.assertTrue\n\n\nclass MiraiConsoleIntegrationTestBootstrap {\n    @Test\n    fun bootstrap() {\n        /*\n        implementation note:\n        不使用 @TempDir 是为了保存最后一次失败快照, 便于 debug\n         */\n        val workingDir = File(\"build/IntegrationTest\") // mirai-console/backend/integration-test/build/IntegrationTest\n        // 注意: 如果更改 workingDir, 还要更改 mirai-console/backend/integration-test/build.gradle.kts:60 (clean task 的依赖)\n        val launcher = MiraiConsoleIntegrationTestLauncher()\n        launcher.workingDir = workingDir\n        launcher.plugins = readStringListFromEnv(\"IT_PLUGINS\")\n        launcher.points = resolveTestPoints().also { points ->\n            // Avoid error in resolving points\n            assertTrue { points.contains(\"net.mamoe.console.integrationtest.testpoints.MCITBSelfAssertions\") }\n            assertTrue { points.contains(\"net.mamoe.console.integrationtest.testpoints.DoNothingPoint\") }\n            assertTrue { points.contains(\"net.mamoe.console.integrationtest.testpoints.plugin.PluginDataRenameToIdTest\") }\n        }.asSequence().map { v ->\n            when (v) {\n                is Class<*> -> v.name\n                is KClass<*> -> v.java.name\n                is String -> v\n                else -> v.javaClass.name\n            }\n        }.map { it.replace('/', '.') }.toMutableList()\n        launcher.vmoptions = mutableListOf(\n            *ManagementFactory.getRuntimeMXBean().inputArguments.filterNot {\n                it.startsWith(\"-Djava.security.manager=\")\n            }.filterNot {\n                it.startsWith(\"-Xmx\")\n            }.toTypedArray(),\n            *System.getenv(\"IT_ARGS\")!!.splitToSequence(\",\").map {\n                Base64.getDecoder().decode(it).decodeToString()\n            }.filter { it.isNotEmpty() }.toList().toTypedArray()\n        )\n        launcher.launch()\n    }\n\n    private fun resolveTestPoints(): Collection<Any> {\n        val ptloc = MCITBSelfAssertions.javaClass.getResource(MCITBSelfAssertions.javaClass.simpleName + \".class\")\n        ptloc ?: error(\"Failed to resolve test points\")\n        val path = Paths.get(ptloc.toURI()).parent\n        return Files.walk(path)\n            .filter { !it.isDirectory() }\n            .filter { it.name.endsWith(\".class\") }\n            .map { pt ->\n                pt.inputStream().use {\n                    ClassReader(it).className\n                }\n            }\n            .map { it.replace('/', '.') }\n            .filter { AbstractTestPoint::class.java.isAssignableFrom(Class.forName(it)) }\n            .use { it.collect(Collectors.toList()) }\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/test/testpoints/DoNothingPoint.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.console.integrationtest.testpoints\n\nimport net.mamoe.console.integrationtest.AbstractTestPointAsPlugin\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport net.mamoe.mirai.utils.info\n\n/*\nDoNothingPoint: Example\n */\ninternal object DoNothingPoint : AbstractTestPointAsPlugin() {\n    var enableCalled = false\n    override fun newPluginDescription(): JvmPluginDescription {\n        return JvmPluginDescription(\n            id = \"net.mamoe.testpoint.do-nothing\",\n            version = \"1.1.0\",\n            name = \"DoNothing\",\n        )\n    }\n\n    override fun KotlinPlugin.onEnable0() {\n        logger.info { \"DoNothing.onEnable()  called\" }\n        enableCalled = true\n    }\n\n    override fun KotlinPlugin.onDisable0() {\n        logger.info { \"DoNothing.onDisable() called\" }\n    }\n\n    override fun onConsoleStartSuccessfully() {\n        assert(enableCalled) {\n            \"DoNothing.onEnable() not called.\"\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/integration-test/test/testpoints/MCITBSelfAssertions.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.console.integrationtest.testpoints\n\nimport net.mamoe.console.integrationtest.AbstractTestPointAsPlugin\nimport net.mamoe.mirai.console.plugin.PluginManager\nimport net.mamoe.mirai.console.plugin.PluginManager.INSTANCE.description\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport kotlin.test.*\n\n/*\nMCITBSelfAssertions: 用于检查 Integration Test 可以正常加载 AbstractTestPointAsPlugin 与 外部测试插件\n */\ninternal object MCITBSelfAssertions : AbstractTestPointAsPlugin() {\n    override fun newPluginDescription(): JvmPluginDescription {\n        return JvmPluginDescription(\n            id = \"net.mamoe.testpoint.mirai-console-self-assertions\",\n            version = \"1.0.0\",\n            name = \"MCITBSelfAssertions\",\n        )\n    }\n\n    var called = false\n\n    override fun KotlinPlugin.onEnable0() {\n        called = true\n        assertFails { error(\"\") }\n        assertTrue { true }\n        assertFalse { false }\n        assertFailsWith<InternalError> { throw InternalError(\"\") }\n        assertEquals(\"\", \"\")\n        assertSame(this, this)\n    }\n\n    override fun onConsoleStartSuccessfully() {\n        assertTrue(called, \"Mirai Console IntegrationTestBootstrap Internal Error\")\n\n        assertTrue(\"MCITSelfTestPlugin not found\") {\n            PluginManager.plugins.any { it.description.id == \"net.mamoe.tester.mirai-console-self-test\" }\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/integration-test/test/testpoints/PluginSharedLibraries.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.console.integrationtest.testpoints\n\nimport net.mamoe.console.integrationtest.AbstractTestPoint\nimport org.objectweb.asm.ClassWriter\nimport org.objectweb.asm.Opcodes\nimport java.io.File\nimport java.util.zip.ZipEntry\nimport java.util.zip.ZipOutputStream\n\ninternal object PluginSharedLibraries : AbstractTestPoint() {\n    override fun beforeConsoleStartup() {\n        if (System.getenv(\"CI\").orEmpty().toBoolean()) {\n            println(\"CI env\")\n            File(\"config/Console/PluginDependencies.yml\").writeText(\n                \"repoLoc: ['https://repo.maven.apache.org/maven2']\"\n            )\n        }\n        File(\"plugin-shared-libraries\").mkdirs()\n        File(\"plugin-shared-libraries/libraries.txt\").writeText(\n            \"\"\"\n                io.github.karlatemp:unsafe-accessor:1.6.2\n            \"\"\".trimIndent()\n        )\n        ZipOutputStream(File(\"plugin-shared-libraries/test.jar\").outputStream().buffered()).use { zipOutput ->\n            zipOutput.putNextEntry(ZipEntry(\"net/mamoe/console/it/psl/PluginSharedLib.class\"))\n            ClassWriter(0).also { writer ->\n                writer.visit(\n                    Opcodes.V1_8,\n                    0,\n                    \"net/mamoe/console/it/psl/PluginSharedLib\",\n                    null,\n                    \"java/lang/Object\",\n                    null\n                )\n            }.toByteArray().let { zipOutput.write(it) }\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/integration-test/test/testpoints/plugin/PluginDataRenameToIdTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.console.integrationtest.testpoints.plugin\n\nimport net.mamoe.console.integrationtest.AbstractTestPointAsPlugin\nimport net.mamoe.console.integrationtest.assertNotExists\nimport net.mamoe.mirai.console.data.AutoSavePluginConfig\nimport net.mamoe.mirai.console.data.AutoSavePluginData\nimport net.mamoe.mirai.console.data.value\nimport net.mamoe.mirai.console.extension.PluginComponentStorage\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport java.io.File\nimport kotlin.test.assertEquals\n\ninternal object PluginDataRenameToIdTest : AbstractTestPointAsPlugin() {\n\n    object TestData : AutoSavePluginData(\"testdata\") {\n        public val test: String by value(\"\")\n    }\n\n    object TestConf : AutoSavePluginConfig(\"testconf\") {\n        public val test: String by value(\"\")\n    }\n\n    override fun newPluginDescription(): JvmPluginDescription {\n        return JvmPluginDescription(\n            id = \"net.mamoe.testpoint.plugin-data-rename-to-id-test\",\n            version = \"1.0.0\",\n            name = \"PluginDataRenameToIdTest\",\n        )\n    }\n\n    override fun beforeConsoleStartup() {\n        File(\"config/PluginDataRenameToIdTest\").mkdirs()\n        File(\"config/PluginDataRenameToIdTest/test.txt\").createNewFile()\n        File(\"config/PluginDataRenameToIdTest/testconf.yml\").writeText(\n            \"\"\"\n            test: a\n            \"\"\".trimIndent()\n        )\n        File(\"data/PluginDataRenameToIdTest\").mkdirs()\n        File(\"data/PluginDataRenameToIdTest/test.txt\").createNewFile()\n        File(\"data/PluginDataRenameToIdTest/testdata.yml\").writeText(\n            \"\"\"\n            test: a\n            \"\"\".trimIndent()\n        )\n    }\n\n    override fun KotlinPlugin.onLoad0(storage: PluginComponentStorage) {\n\n        File(\"config/PluginDataRenameToIdTest\").assertNotExists()\n        File(\"data/PluginDataRenameToIdTest\").assertNotExists()\n\n    }\n\n    override fun KotlinPlugin.onEnable0() {\n        TestData.reload()\n        TestConf.reload()\n        TestData.save()\n        TestConf.save()\n\n        assertEquals(\"a\", TestConf.test)\n        assertEquals(\"a\", TestData.test)\n    }\n\n    override fun onConsoleStartSuccessfully() {\n        File(\"config/PluginDataRenameToIdTest/test.txt\").assertNotExists()\n        File(\"data/PluginDataRenameToIdTest/test.txt\").assertNotExists()\n\n\n        File(\"config/PluginDataRenameToIdTest/testconf.yml\").assertNotExists()\n        File(\"data/PluginDataRenameToIdTest/testdata.yml\").assertNotExists()\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/test/testpoints/plugin/PluginDependOnErrorPlugin.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.console.integrationtest.testpoints.plugin\n\nimport net.mamoe.console.integrationtest.AbstractTestPointAsPlugin\nimport net.mamoe.mirai.console.extension.PluginComponentStorage\nimport net.mamoe.mirai.console.internal.plugin.ConsoleJvmPluginFuncCallbackStatus\nimport net.mamoe.mirai.console.internal.plugin.ConsoleJvmPluginFuncCallbackStatusExcept\nimport net.mamoe.mirai.console.plugin.PluginManager\nimport net.mamoe.mirai.console.plugin.id\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport org.junit.jupiter.api.Assertions.assertFalse\nimport kotlin.test.fail\n\n@ConsoleJvmPluginFuncCallbackStatusExcept.OnEnable(ConsoleJvmPluginFuncCallbackStatus.FAILED)\ninternal object PluginDependOnErrorPlugin : AbstractTestPointAsPlugin() {\n    private var isOnEnabledExecuted: Boolean = false\n\n    override fun newPluginDescription(): JvmPluginDescription {\n        return JvmPluginDescription(\n            id = \"net.mamoe.testpoint.plugin-depend-on-error-plugin\",\n            version = \"1.0.0\",\n            name = \"PluginDependOnErrorPlugin\",\n        ) {\n            dependsOn(\"net.mamoe.testpoint.plugin-with-exception-test\")\n        }\n    }\n\n    override fun beforeConsoleStartup() {\n        isOnEnabledExecuted = false\n    }\n\n    override fun KotlinPlugin.onLoad0(storage: PluginComponentStorage) {\n\n    }\n\n    override fun KotlinPlugin.onEnable0() {\n        // unreachable\n        isOnEnabledExecuted = true\n        fail(\"net.mamoe.testpoint.plugin-depend-on-error-plugin enabled\")\n    }\n\n    override fun onConsoleStartSuccessfully() {\n        assertFalse { isOnEnabledExecuted }\n        assertFalse {\n            PluginManager\n                .plugins\n                .first { it.id == \"net.mamoe.testpoint.plugin-with-exception-test\" }\n                .isEnabled\n        }\n        assertFalse {\n            PluginManager\n                .plugins\n                .first { it.id == \"net.mamoe.testpoint.plugin-depend-on-error-plugin\" }\n                .isEnabled\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/test/testpoints/plugin/PluginOnDisableCalledOnlyOnceTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.console.integrationtest.testpoints.plugin\n\nimport kotlinx.atomicfu.atomic\nimport net.mamoe.console.integrationtest.AbstractTestPointAsPlugin\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\n\ninternal object PluginOnDisableCalledOnlyOnceTest : AbstractTestPointAsPlugin() {\n    override fun newPluginDescription(): JvmPluginDescription {\n        return JvmPluginDescription(\n            id = \"net.mamoe.testpoint.plugin-on-disable-called-only-once\",\n            version = \"1.0.0\",\n            name = \"PluginOnDisableCalledOnlyOnce\",\n        ) {}\n    }\n\n    private val onDisableCalled = atomic(false)\n\n    override fun KotlinPlugin.onDisable0() {\n        if (!onDisableCalled.compareAndSet(expect = false, update = true)) {\n            error(\"onDisable called multiple times!!\")\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/integration-test/test/testpoints/plugin/PluginWithExceptionTest.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.console.integrationtest.testpoints.plugin\n\nimport net.mamoe.console.integrationtest.AbstractTestPointAsPlugin\nimport net.mamoe.mirai.console.extension.PluginComponentStorage\nimport net.mamoe.mirai.console.internal.plugin.ConsoleJvmPluginFuncCallbackStatus\nimport net.mamoe.mirai.console.internal.plugin.ConsoleJvmPluginFuncCallbackStatusExcept\nimport net.mamoe.mirai.console.plugin.PluginManager\nimport net.mamoe.mirai.console.plugin.id\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport net.mamoe.mirai.utils.debug\nimport org.junit.jupiter.api.Assertions.assertFalse\nimport kotlin.test.assertEquals\nimport kotlin.test.assertIs\n\n@ConsoleJvmPluginFuncCallbackStatusExcept.OnEnable(ConsoleJvmPluginFuncCallbackStatus.FAILED)\ninternal object PluginWithExceptionTest : AbstractTestPointAsPlugin() {\n\n    override fun newPluginDescription(): JvmPluginDescription {\n        return JvmPluginDescription(\n            id = \"net.mamoe.testpoint.plugin-with-exception-test\",\n            version = \"1.0.0\",\n            name = \"PluginWithExceptionTest\",\n        )\n    }\n\n    override fun exceptionHandler(exception: Throwable, step: JvmPluginExecutionStep, instance: KotlinPlugin) {\n        instance.logger.debug { \"PluginWithExceptionTestExceptionTest\" }\n        assertIs<Exception>(exception)\n        assertEquals(\"PluginWithExceptionTestExceptionTest\", exception.message)\n\n    }\n\n    override fun KotlinPlugin.onLoad0(storage: PluginComponentStorage) {\n\n    }\n\n    override fun KotlinPlugin.onEnable0() {\n        throw Exception(\"PluginWithExceptionTestExceptionTest\")\n    }\n\n    override fun onConsoleStartSuccessfully() {\n        assertFalse {\n            PluginManager\n                .plugins\n                .first { it.id == \"net.mamoe.testpoint.plugin-with-exception-test\" }\n                .isEnabled\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/.gitignore",
    "content": "build.gradle.kts\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/MCITSelfTestPlugin/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin",
    "content": "net.mamoe.console.integrationtest.ep.mcitselftest.MCITSelfTestPlugin\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/MCITSelfTestPlugin/src/MCITSelfTestPlugin.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.console.integrationtest.ep.mcitselftest\n\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport net.mamoe.mirai.utils.info\nimport kotlin.test.assertTrue\n\n/*\nMCITSelfTestPlugin: 用于测试 Integration-test 可正常加载\n@see /test/testpoints/MCITBSelfAssertions\n */\npublic object MCITSelfTestPlugin : KotlinPlugin(\n    JvmPluginDescription(\n        id = \"net.mamoe.tester.mirai-console-self-test\",\n        version = \"1.0.0\",\n        name = \"MCITSelfTestPlugin\",\n    )\n) {\n    override fun onEnable() {\n        logger.info { \"MCITSelfTestPlugin.onEnable() called\" }\n\n        assertTrue { true }\n    }\n\n    public fun someAction() {\n        logger.info { \"Called!\" }\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/README.md",
    "content": "# Integration Test - Sub Testers\n\nIntegration Test 的测试插件, 放置在本文件夹内的全部插件均为 console 内部测试用插件\n\n如果您不是正在修改 mirai-console, 则不需要阅读此文件及此模块\n\n---\n\n创建新测试插件只需要在本文件夹创建新的目录, 然后重载 (Reimport gradle projects)\n\n如果需要添加新的依赖, 请在 [`IntegrationTest/build.gradle.kts`](../build.gradle.kts) 添加相关依赖 (使用 `testApi`) 并标注哪个测试框架使用此依赖, 为何使用此依赖\n\n如果需要自定义 `build.gradle.kts`, 请在 IDEA 右键 `build.gradle.kts` 并选择 `Git > Add File`\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/mirai-plugin-compatibility/.module-group.txt",
    "content": ""
  },
  {
    "path": "mirai-console/backend/integration-test/testers/mirai-plugin-compatibility/mirai-jar-after-2_11/.nested-module.txt",
    "content": ""
  },
  {
    "path": "mirai-console/backend/integration-test/testers/mirai-plugin-compatibility/mirai-jar-after-2_11/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nmirai.jar.after211.After211"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/mirai-plugin-compatibility/mirai-jar-after-2_11/src/After211.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage mirai.jar.after211\n\nimport net.mamoe.mirai.console.plugin.PluginManager\nimport net.mamoe.mirai.console.plugin.id\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport kotlin.test.assertFalse\nimport kotlin.test.assertTrue\n\n/*\n * 2.11 及以后打包的插件, 有 net.mamoe.tester.after211 替代\n */\ninternal object After211 : KotlinPlugin(\n    JvmPluginDescription(\n        id = \"net.mamoe.tester.after211\",\n        version = \"1.0.0\",\n        name = \"Test Plugin\",\n    )\n) {\n    override fun onEnable() {\n        assertFalse(\"net.mamoe.tester.before211 is loaded\") { PluginManager.plugins.any { it.id == \"net.mamoe.tester.before211\" } }\n        assertTrue(\"net.mamoe.tester.before211.nonew is not loaded\") { PluginManager.plugins.any { it.id == \"net.mamoe.tester.before211.nonew\" } }\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/mirai-plugin-compatibility/mirai-jar-after-2_11-without-new/.nested-module.txt",
    "content": ""
  },
  {
    "path": "mirai-console/backend/integration-test/testers/mirai-plugin-compatibility/mirai-jar-after-2_11-without-new/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nmirai.jar.before211.nonew.After211NoNew"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/mirai-plugin-compatibility/mirai-jar-after-2_11-without-new/src/After211NoNew.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage mirai.jar.before211.nonew\n\nimport net.mamoe.mirai.console.plugin.PluginManager\nimport net.mamoe.mirai.console.plugin.id\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport kotlin.test.assertTrue\n\n/*\n * 2.11 及以后打包的插件, 无新插件替代\n */\ninternal object After211NoNew : KotlinPlugin(\n    JvmPluginDescription(\n        id = \"net.mamoe.tester.before211.nonew\",\n        version = \"1.0.0\",\n        name = \"Test Plugin\",\n    )\n) {\n    override fun onEnable() {\n        assertTrue(\"net.mamoe.tester.after211 is not loaded\") { PluginManager.plugins.any { it.id == \"net.mamoe.tester.after211\" } }\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/mirai-plugin-compatibility/mirai-jar-before-2_11/.nested-module.txt",
    "content": ""
  },
  {
    "path": "mirai-console/backend/integration-test/testers/mirai-plugin-compatibility/mirai-jar-before-2_11/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nmirai.jar.before211.Before211"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/mirai-plugin-compatibility/mirai-jar-before-2_11/src/Before211.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage mirai.jar.before211\n\nimport net.mamoe.mirai.console.plugin.PluginManager\nimport net.mamoe.mirai.console.plugin.id\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport kotlin.test.assertFalse\n\n/*\n * 2.11 以前打包的插件\n */\ninternal object Before211 : KotlinPlugin(\n    JvmPluginDescription(\n        id = \"net.mamoe.tester.before211\",\n        version = \"1.0.0\",\n        name = \"Test Plugin\",\n    )\n) {\n    override fun onEnable() {\n        assertFalse(\"Both before211 and after211 are loaded.\") { PluginManager.plugins.any { it.id == \"net.mamoe.tester.after211\" } }\n        throw AssertionError(\"Only net.mamoe.tester.before211 is loaded.\")\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/mirai-plugin-compatibility/same-pkg-1/.nested-module.txt",
    "content": ""
  },
  {
    "path": "mirai-console/backend/integration-test/testers/mirai-plugin-compatibility/same-pkg-1/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nsamepkg.P"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/mirai-plugin-compatibility/same-pkg-1/src/P.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage samepkg\n\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\n\n/*\nsame-pkg-1: 测试包名一样时插件可以正常加载\n */\ninternal object P : KotlinPlugin(\n    JvmPluginDescription(\n        id = \"net.mamoe.tester.samepkg-1\",\n        version = \"1.0.0\",\n        name = \"SamePkg 1\",\n    )\n) {}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/mirai-plugin-compatibility/same-pkg-2/.nested-module.txt",
    "content": ""
  },
  {
    "path": "mirai-console/backend/integration-test/testers/mirai-plugin-compatibility/same-pkg-2/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nsamepkg.P"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/mirai-plugin-compatibility/same-pkg-2/src/P.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage samepkg\n\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\n\n/*\nsame-pkg-2: 测试包名一样时插件可以正常加载\n */\ninternal object P : KotlinPlugin(\n    JvmPluginDescription(\n        id = \"net.mamoe.tester.samepkg-2\",\n        version = \"1.0.0\",\n        name = \"SamePkg 2\",\n    )\n) {}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/never-override-jdk-modules/module-jdk-module/.nested-module.txt",
    "content": ""
  },
  {
    "path": "mirai-console/backend/integration-test/testers/never-override-jdk-modules/module-jdk-module/resources/mvn.txt",
    "content": "net.mamoe.consoleit.issue2141:javax-xml:1.0.0\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/never-override-jdk-modules/module-jdk-module/src/javax/xml/parsers/SAXParser.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage javax.xml.parsers\n\npublic class SAXParser\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/never-override-jdk-modules/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nneveroverridejdkmodules.NeverOverrideJdkModules"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/never-override-jdk-modules/src/NeverOverrideJdkModules.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage neveroverridejdkmodules\n\nimport net.mamoe.console.integrationtest.assertClassSame\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\n\npublic object NeverOverrideJdkModules : KotlinPlugin(\n    JvmPluginDescription(\"net.mamoe.console.itest.never-override-jdk-modules\", \"0.0.0\")\n) {\n    init {\n        jvmPluginClasspath.downloadAndAddToPath(\n            jvmPluginClasspath.pluginSharedLibrariesClassLoader,\n            listOf(\"net.mamoe.consoleit.issue2141:javax-xml:1.0.0\")\n        )\n    }\n\n    @Suppress(\"Since15\")\n    override fun onEnable() {\n        val platformC = ClassLoader.getSystemClassLoader().loadClass(\"javax.xml.parsers.SAXParser\")\n        assertClassSame(\n            platformC,\n            Class.forName(\"javax.xml.parsers.SAXParser\"),\n        )\n        assertClassSame(\n            platformC,\n            jvmPluginClasspath.pluginClassLoader.loadClass(\"javax.xml.parsers.SAXParser\"),\n        )\n        assertClassSame(\n            platformC,\n            jvmPluginClasspath.pluginIndependentLibrariesClassLoader.loadClass(\"javax.xml.parsers.SAXParser\"),\n        )\n        assertClassSame(\n            platformC,\n            jvmPluginClasspath.pluginSharedLibrariesClassLoader.loadClass(\"javax.xml.parsers.SAXParser\"),\n        )\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/options-properties/independent-plugin/.nested-module.txt",
    "content": ""
  },
  {
    "path": "mirai-console/backend/integration-test/testers/options-properties/independent-plugin/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin",
    "content": "consoleittest.optionproperties.independent.Independent"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/options-properties/independent-plugin/src/Independent.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage consoleittest.optionproperties.independent\n\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport kotlin.test.assertFails\n\npublic object Independent : KotlinPlugin(\n    JvmPluginDescription(\"net.mamoe.console.itest.options_properties.independent_plugin\", \"0.0.0\")\n) {\n    override fun onEnable() {\n        assertFails {\n            // parent's class.loading.be-resolvable-to-independent = false\n            Class.forName(\"consoleittest.optionproperties.main.OptionsProperties\")\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/options-properties/resources/META-INF/mirai-console-plugin/options.properties",
    "content": "# suppress inspection \"UnusedProperty\" for whole file\n\nresources.resolve-console-system-resources=true\n\n\nclass.loading.be-resolvable-to-independent=false\nclass.loading.resolve-independent=false\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/options-properties/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin",
    "content": "consoleittest.optionproperties.main.OptionsProperties"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/options-properties/src/OptionsProperties.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage consoleittest.optionproperties.main\n\nimport net.mamoe.mirai.console.extension.PluginComponentStorage\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport kotlin.test.assertFails\nimport kotlin.test.assertFalse\nimport kotlin.test.assertTrue\n\npublic object OptionsProperties : KotlinPlugin(\n    JvmPluginDescription(\"net.mamoe.console.itest.options_properties.main\", \"0.0.0\")\n) {\n    override fun PluginComponentStorage.onLoad() {\n        assertTrue { jvmPluginClasspath.shouldResolveConsoleSystemResource }\n        assertFalse { jvmPluginClasspath.shouldBeResolvableToIndependent }\n        assertFalse { jvmPluginClasspath.shouldResolveIndependent }\n    }\n\n    override fun onEnable() {\n        assertFails {\n            // class.loading.load-independent = false\n            Class.forName(\"consoleittest.optionproperties.independent.Independent\")\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-can-depends-on-mirai-console/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin",
    "content": "#\n# Copyright 2019-2023 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nnet.mamoe.console.itest.plugincandependsonmiraiconsole.PluginCanDependsOnMiraiConsole\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-can-depends-on-mirai-console/src/PluginCanDependsOnMiraiConsole.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.console.itest.plugincandependsonmiraiconsole\n\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\n\ninternal object PluginCanDependsOnMiraiConsole : KotlinPlugin(\n    JvmPluginDescription(\"net.mamoe.tester.plugin-can-depends-mirai-console\", \"1.0.0\") {\n        dependsOn(\"net.mamoe.mirai-console\")\n    }\n) {\n\n}"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-dep-dependon-dep-issue-2054/module-moda/.nested-module.txt",
    "content": ""
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-dep-dependon-dep-issue-2054/module-moda/resources/mvn.txt",
    "content": "net.mamoe.consoleit.issue2054:moda:1.0.0\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-dep-dependon-dep-issue-2054/module-moda/src/ModuleA.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage issue2054.modulea\n\npublic object ModuleA {\n    public fun act(b: () -> Unit) {\n        b()\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-dep-dependon-dep-issue-2054/module-modb/.nested-module.txt",
    "content": ""
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-dep-dependon-dep-issue-2054/module-modb/resources/mvn.txt",
    "content": "net.mamoe.consoleit.issue2054:modb:1.0.0\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-dep-dependon-dep-issue-2054/module-modb/src/ModuleB.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage issue2054.moduleb\n\nimport issue2054.modulea.ModuleA\n\n\npublic object ModuleB {\n    public val getModuleA: Any get() = ModuleA\n    public fun act(b: () -> Unit) {\n        b()\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-dep-dependon-dep-issue-2054/module-private-issue2108/.nested-module.txt",
    "content": ""
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-dep-dependon-dep-issue-2054/module-private-issue2108/resources/mvn.txt",
    "content": "net.mamoe.consoleit.issue2108:private-module:1.0.0\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-dep-dependon-dep-issue-2054/module-private-issue2108/src/PrivateModule.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\npackage issue2108\n\npublic object PrivateModule {\n    public fun stack(): Throwable = Throwable(\"Stack trace\")\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-dep-dependon-dep-issue-2054/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\npdepdep2054.PDepDependOnDep\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-dep-dependon-dep-issue-2054/second-plugin/.nested-module.txt",
    "content": ""
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-dep-dependon-dep-issue-2054/second-plugin/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\npdepdep2054sec.PDepDependOnDepSec\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-dep-dependon-dep-issue-2054/second-plugin/src/PDepDependOnDepSec.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage pdepdep2054sec\n\nimport issue2054.modulea.ModuleA\nimport issue2054.moduleb.ModuleB\nimport issue2108.PrivateModule\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport net.mamoe.mirai.utils.info\nimport kotlin.test.assertSame\n\npublic object PDepDependOnDepSec : KotlinPlugin(\n    JvmPluginDescription(\"net.mamoe.console.itest.plugin-dep-dependon-dep-sec\", \"0.0.0\") {\n        dependsOn(\"net.mamoe.console.itest.plugin-dep-dependon-dep\")\n    }\n) {\n    override fun onEnable() {\n        jvmPluginClasspath.downloadAndAddToPath(\n            jvmPluginClasspath.pluginIndependentLibrariesClassLoader,\n            listOf(\"net.mamoe.consoleit.issue2054:modb:1.0.0\")\n        )\n        jvmPluginClasspath.downloadAndAddToPath(\n            jvmPluginClasspath.pluginIndependentLibrariesClassLoader,\n            listOf(\"net.mamoe.consoleit.issue2108:private-module:1.0.0\")\n        )\n\n        assertSame(ModuleA, ModuleB.getModuleA)\n        logger.info { \"issue 2054\" }\n\n        ModuleB.act { ModuleA.act { logger.info(Throwable(\"Stack trace\")) } }\n\n        logger.info(\"issue 2108\", PrivateModule.stack())\n        assertSame(\n            jvmPluginClasspath.pluginIndependentLibrariesClassLoader,\n            PrivateModule.javaClass.classLoader,\n            \"Failed to load private module from \" + jvmPluginClasspath.pluginIndependentLibrariesClassLoader\n        )\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-dep-dependon-dep-issue-2054/src/PDepDependOnDep.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage pdepdep2054\n\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\n\npublic object PDepDependOnDep : KotlinPlugin(\n    JvmPluginDescription(\"net.mamoe.console.itest.plugin-dep-dependon-dep\", \"0.0.0\")\n) {\n    init {\n        jvmPluginClasspath.downloadAndAddToPath(\n            jvmPluginClasspath.pluginSharedLibrariesClassLoader,\n            listOf(\"net.mamoe.consoleit.issue2054:moda:1.0.0\")\n        )\n        jvmPluginClasspath.downloadAndAddToPath(\n            jvmPluginClasspath.pluginIndependentLibrariesClassLoader,\n            listOf(\"net.mamoe.consoleit.issue2108:private-module:1.0.0\")\n        )\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-depend-on-other/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nnet.mamoe.console.integrationtest.ep.dependonother.PluginDependOnOther"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-depend-on-other/src/PluginDependOnOther.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.console.integrationtest.ep.dependonother\n\nimport net.mamoe.console.integrationtest.ep.mcitselftest.MCITSelfTestPlugin\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport net.mamoe.mirai.utils.error\nimport net.mamoe.mirai.utils.info\nimport kotlin.test.assertFailsWith\nimport kotlin.test.assertNotEquals\nimport kotlin.test.assertSame\n\n/*\nPluginDependOnOther: 测试插件依赖其他插件的情况\n */\npublic object PluginDependOnOther : KotlinPlugin(\n    JvmPluginDescription(\n        id = \"net.mamoe.tester.plugin-depend-on-other\",\n        version = \"1.0.0\",\n        name = \"Plugin Depend On Other\",\n    ) {\n        dependsOn(\"net.mamoe.tester.mirai-console-self-test\")\n        dependsOn(\"net.mamoe.tester.plugin-dynamic-dependencies-download\")\n    }\n) {\n    override fun onEnable() {\n        logger.info { \"Do dependency call: \" + MCITSelfTestPlugin::class.java }\n        logger.info { \"No Depends on: \" + Class.forName(\"samepkg.P\") }\n        logger.info(Throwable(\"Stack trace\"))\n        MCITSelfTestPlugin.someAction()\n        logger.info { \"Shared library: \" + Class.forName(\"net.mamoe.console.it.psl.PluginSharedLib\") }\n        assertNotEquals(javaClass.classLoader, Class.forName(\"net.mamoe.console.it.psl.PluginSharedLib\").classLoader)\n\n        // dependencies-shared\n        kotlin.run {\n            val pluginDepDynDownload = Class.forName(\"net.mamoe.console.integrationtest.ep.pddd.P\")\n            val gsonC = Class.forName(\"com.google.gson.Gson\")\n            logger.info { \"Gson located $gsonC <${gsonC.classLoader}>\" }\n            assertSame(gsonC, Class.forName(gsonC.name, false, pluginDepDynDownload.classLoader))\n            assertFailsWith<ClassNotFoundException> {\n                val c = Class.forName(\"com.zaxxer.sparsebits.SparseBitSet\") // private in dynamic-dep-download\n                logger.error { \"C: $c, from: ${c.classLoader}\" }\n            }\n            assertFailsWith<ClassNotFoundException> {\n                Class.forName(\"net.mamoe.assertion.something.not.existing\")\n            }\n        }\n\n        // region https://github.com/mamoe/mirai/issues/1920\n        Class.forName(\"net.mamoe.console.integrationtest.ep.pddd.p2.PDOO_OtherClass\")\n        Class.forName(\"net.mamoe.console.integrationtest.ep.pddd.PDOO_OtherClass\")\n        // endregion\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-depend-on-other/src/issue1920/OtherClass1.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"PackageDirectoryMismatch\", \"ClassName\")\n\npackage net.mamoe.console.integrationtest.ep.pddd\n\n// https://github.com/mamoe/mirai/issues/1920\n@PublishedApi\ninternal class PDOO_OtherClass {\n    companion object {\n        init {\n            Thread.dumpStack()\n            println(\"OC Loaded\")\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-depend-on-other/src/issue1920/OtherClass2.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"PackageDirectoryMismatch\", \"ClassName\")\n\npackage net.mamoe.console.integrationtest.ep.pddd.p2\n\n// https://github.com/mamoe/mirai/issues/1920\n@PublishedApi\ninternal class PDOO_OtherClass {\n    companion object {\n        init {\n            Thread.dumpStack()\n            println(\"OC Loaded\")\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-dynamic-dependencies-download/resources/META-INF/mirai-console-plugin/dependencies-private.txt",
    "content": "com.zaxxer:SparseBitSet:1.2\n\n## Test console non-hard-link override\norg.bouncycastle:bcprov-jdk15on:1.63\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-dynamic-dependencies-download/resources/META-INF/mirai-console-plugin/dependencies-shared.txt",
    "content": "com.google.code.gson:gson:2.8.9\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-dynamic-dependencies-download/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin",
    "content": "net.mamoe.console.integrationtest.ep.pddd.P"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-dynamic-dependencies-download/src/P.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.console.integrationtest.ep.pddd\n\nimport net.mamoe.console.integrationtest.canVmLoad\nimport net.mamoe.mirai.console.extension.PluginComponentStorage\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport net.mamoe.mirai.utils.info\nimport org.objectweb.asm.Opcodes\nimport kotlin.test.assertEquals\n\n/*\nPluginDynamicDependenciesDownload: 测试动态运行时下载\n */\ninternal object P : KotlinPlugin(\n    JvmPluginDescription(\n        id = \"net.mamoe.tester.plugin-dynamic-dependencies-download\",\n        version = \"1.0.0\",\n        name = \"Plugin Dynamic Dependencies Download\",\n    )\n) {\n    init {\n        Class.forName(\"com.google.gson.Gson\") // shared\n        Class.forName(\"com.zaxxer.sparsebits.SparseBitSet\") // private\n    }\n\n    override fun PluginComponentStorage.onLoad() {\n        Class.forName(\"com.google.gson.Gson\") // shared\n        Class.forName(\"com.zaxxer.sparsebits.SparseBitSet\") // private\n\n        // console-non-hard-link dependency\n        // mirai-core used 1.64 current\n        val bc = Class.forName(\"org.bouncycastle.LICENSE\")\n        assertEquals(\n            \"1.63.0\",\n            bc.`package`.implementationVersion,\n            message = \"$bc <- ${bc.classLoader}\"\n        )\n        // #2009\n        if (canVmLoad(Opcodes.V11)) {\n            logger.info { \"V11\" }\n            Class.forName(\"java.net.http.HttpClient\")\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-resolve-self-dependencies-over-console-ones/resources/META-INF/mirai-console-plugin/dependencies-private.txt",
    "content": "io.ktor:ktor-client-core-jvm:2.0.0\nio.ktor:ktor-client-java-jvm:2.0.0\nio.ktor:ktor-client-resources-jvm:2.0.0\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-resolve-self-dependencies-over-console-ones/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin",
    "content": "pluginresolveselfdepoverconsoleones.PluginResolveSelfDependenciesOverConsoleOnes\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-resolve-self-dependencies-over-console-ones/src/PluginResolveSelfDependenciesOverConsoleOnes.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage pluginresolveselfdepoverconsoleones\n\nimport io.ktor.client.*\nimport io.ktor.client.engine.java.*\nimport io.ktor.client.plugins.resources.*\nimport net.mamoe.console.integrationtest.assertClassSame\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport net.mamoe.mirai.utils.info\n\n// 若插件定义依赖, 则使用插件依赖而不要使用 mirai-console 依赖\npublic class PluginResolveSelfDependenciesOverConsoleOnes :\n    KotlinPlugin(JvmPluginDescription(\"net.mamoe.tester.plugin-resolve-self-dependencies-over-console-ones\", \"1.0.0\")) {\n\n    override fun onEnable() {\n        logger.info { \"Plugin loaded\" }\n        logger.info {\n            HttpClient(Java) {\n                install(Resources)\n            }.toString()\n        }\n        val hcC = Class.forName(\"io.ktor.client.HttpClient\")\n        assertClassSame(hcC, jvmPluginClasspath.pluginIndependentLibrariesClassLoader.loadClass(hcC.name))\n    }\n}"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-use-console-deps-fallback/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin",
    "content": "pluginuseconsoledepsfallback.PluginUseConsoleDepsFallback\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-use-console-deps-fallback/src/PluginUseConsoleDepsFallback.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage pluginuseconsoledepsfallback\n\nimport io.ktor.client.*\nimport io.ktor.client.engine.okhttp.*\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport net.mamoe.mirai.utils.info\n\n// 若插件未定义依赖, 则使用 mirai-console 内置依赖\npublic class PluginUseConsoleDepsFallback :\n    KotlinPlugin(JvmPluginDescription(\"net.mamoe.tester.plugin-use-console-deps-fallback\", \"1.0.0\")) {\n\n    override fun onEnable() {\n        logger.info { \"Plugin loaded\" }\n        logger.info {\n            HttpClient(OkHttp).toString() // dependency is compileOnly\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-with-pluginyml/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin",
    "content": "#\n# Copyright 2019-2023 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nnet.mamoe.console.itest.pluginwithpluginyml.PluginWithPluginYml\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-with-pluginyml/resources/plugin.yml",
    "content": "id: net.mamoe.console.itest.plugin-with-yml\nversion: 0.0.0\n\ndependencies:\n  - net.mamoe.console.itest.serviceloader\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-with-pluginyml/src/PluginWithPluginYml.kt",
    "content": "package net.mamoe.console.itest.pluginwithpluginyml\n\nimport net.mamoe.mirai.console.plugin.PluginManager\nimport net.mamoe.mirai.console.plugin.PluginManager.INSTANCE.description\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport kotlin.test.assertTrue\n\n/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\ninternal object PluginWithPluginYml : KotlinPlugin() {\n    override fun onEnable() {\n        println(description)\n        println(description.id)\n        val pluginId = description.id\n\n        assertTrue {\n            PluginManager.plugins.first { it.description.id == pluginId } === PluginWithPluginYml\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-with-pluginyml-can-use-libraries-while-clinit/clinit-library/.nested-module.txt",
    "content": ""
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-with-pluginyml-can-use-libraries-while-clinit/clinit-library/resources/mvn.txt",
    "content": "net.mamoe.consoleit.plugin-with-yml:plugin-library:0.0.0\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-with-pluginyml-can-use-libraries-while-clinit/clinit-library/src/PluginLibrary.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.console.itest.pluginwithpluginyml.library\n\npublic object PluginLibrary {\n    @JvmStatic\n    public fun ok() {\n        println(\"Plugin with plugin.yml using libraries under clinit ok\")\n    }\n}"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-with-pluginyml-can-use-libraries-while-clinit/resources/META-INF/mirai-console-plugin/dependencies-private.txt",
    "content": "net.mamoe.consoleit.plugin-with-yml:plugin-library:0.0.0\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-with-pluginyml-can-use-libraries-while-clinit/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin",
    "content": "#\n# Copyright 2019-2023 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nnet.mamoe.console.itest.pluginwithpluginyml.clinit.PluginWithPluginYmlClinitTest\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-with-pluginyml-can-use-libraries-while-clinit/resources/plugin.yml",
    "content": "id: net.mamoe.console.itest.plugin-with-yml-can-use-library-while-clinit\nversion: 0.0.0\n\ndependencies:\n  - net.mamoe.console.itest.plugin-with-yml\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/plugin-with-pluginyml-can-use-libraries-while-clinit/src/PluginWithPluginYmlClinitTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.console.itest.pluginwithpluginyml.clinit\n\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\n\ninternal class PluginWithPluginYmlClinitTest : KotlinPlugin() {\n\n    companion object {\n        init {\n            // this is <clinit>\n\n            Thread.dumpStack()\n            Class.forName(\"net.mamoe.console.itest.pluginwithpluginyml.library.PluginLibrary\")\n                .getMethod(\"ok\").invoke(null)\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/service-loader/module-service-loader-impl/.nested-module.txt",
    "content": ""
  },
  {
    "path": "mirai-console/backend/integration-test/testers/service-loader/module-service-loader-impl/resources/META-INF/services/net.mamoe.console.integrationtest.mod.servicetypedef.ServiceTypedef",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nnet.mamoe.console.integrationtest.mod.serviceimpl.ServiceImpl"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/service-loader/module-service-loader-impl/resources/test-res.txt",
    "content": "service-loader-impl\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/service-loader/module-service-loader-impl/src/ServiceImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\npackage net.mamoe.console.integrationtest.mod.serviceimpl\n\nimport net.mamoe.console.integrationtest.mod.servicetypedef.ServiceTypedef\n\npublic class ServiceImpl : ServiceTypedef {\n    override fun act() {\n        Throwable(\"Stacktrace\").printStackTrace(System.out)\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/service-loader/module-service-loader-typedef/.nested-module.txt",
    "content": ""
  },
  {
    "path": "mirai-console/backend/integration-test/testers/service-loader/module-service-loader-typedef/resources/test-res.txt",
    "content": "service-loader-typedef\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/service-loader/module-service-loader-typedef/src/ServiceTypedef.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.console.integrationtest.mod.servicetypedef\n\npublic interface ServiceTypedef {\n    public fun act() {}\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/service-loader/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nnet.mamoe.console.itest.serviceloader.PMain\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/service-loader/resources/test-res.txt",
    "content": "from plugin\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/service-loader/service-loader-2dep-plugin/.nested-module.txt",
    "content": ""
  },
  {
    "path": "mirai-console/backend/integration-test/testers/service-loader/service-loader-2dep-plugin/resources/META-INF/services/net.mamoe.console.integrationtest.mod.servicetypedef.ServiceTypedef",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nnet.mamoe.console.itest.serviceloader.ndep.PS"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/service-loader/service-loader-2dep-plugin/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nnet.mamoe.console.itest.serviceloader.ndep.PMain"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/service-loader/service-loader-2dep-plugin/resources/test-res.txt",
    "content": "from 2nd plugin\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/service-loader/service-loader-2dep-plugin/src/PMain.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.console.itest.serviceloader.ndep\n\nimport net.mamoe.console.integrationtest.mod.servicetypedef.ServiceTypedef\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport net.mamoe.mirai.utils.info\nimport java.util.*\nimport kotlin.test.assertEquals\nimport kotlin.test.assertNotNull\nimport kotlin.test.assertNull\nimport kotlin.test.assertTrue\n\n\ninternal class PS : ServiceTypedef\n\ninternal object PMain : KotlinPlugin(JvmPluginDescription(\"net.mamoe.console.itest.serviceloader-ndp\", \"0.0.0\") {\n    dependsOn(\"net.mamoe.console.itest.serviceloader\")\n}) {\n    override fun onEnable() {\n        val loader = ServiceLoader.load(\n            Class.forName(\"net.mamoe.console.integrationtest.mod.servicetypedef.ServiceTypedef\"),\n            javaClass.classLoader,\n        )\n        val services = loader.asSequence().map { it.javaClass.name }.toMutableList()\n        services.sort()\n        services.forEach { service ->\n            logger.info { \"Service: $service\" }\n        }\n        assertEquals(\n            mutableListOf(\n                \"net.mamoe.console.integrationtest.mod.serviceimpl.ServiceImpl\",\n                \"net.mamoe.console.itest.serviceloader.ndep.PS\",\n            ), services\n        )\n        assertEquals(\n            \"from 2nd plugin\",\n            javaClass.getResourceAsStream(\"/test-res.txt\")!!.reader().use { it.readText() }.trim(),\n        )\n        val tstRes = javaClass.classLoader.getResources(\"test-res.txt\").asSequence().onEach {\n            println(it)\n        }.toMutableList()\n        // /service-loader-2dep-plugin-0.0.0.jar!/test-res.txt\n        // /service-loader-0.0.0.jar!/test-res.txt\n        // /module-service-loader-typedef-0.0.0.jar!/test-res.txt\n        // /module-service-loader-impl-0.0.0.jar!/test-res.txt\n        assertEquals(4, tstRes.size)\n\n        assertNotNull(javaClass.getResource(\"/net/mamoe/console/it/psl/PluginSharedLib.class\").also {\n            println(it)\n        })\n        assertEquals(\n            1,\n            javaClass.classLoader.getResources(\"net/mamoe/console/it/psl/PluginSharedLib.class\")\n                .asSequence().toList()\n                .also {\n                    println(it)\n                }.size\n        )\n\n        // ************************* resources loading tests *************************\n\n        val miraiConsoleClassPath = \"net/mamoe/mirai/console/MiraiConsole.class\"\n        val miraiBotClassPath = \"net/mamoe/mirai/Bot.class\"\n        val allClassesPath = \"META-INF/mirai-console/allclasses.txt\"\n\n        fun ClassLoader.getSizeOfResources(path: String): Int {\n            return this.getResources(path).toList().size\n        }\n\n        assertNull(javaClass.getResource(\"/$miraiConsoleClassPath\"))\n        assertNull(javaClass.classLoader.getResource(miraiConsoleClassPath))\n        val miraiConsoleClassResourceCount = javaClass.classLoader.getSizeOfResources(miraiConsoleClassPath)\n            .also { assertEquals(0, it) }\n\n        assertNull(javaClass.getResource(\"/$miraiBotClassPath\"))\n        assertNull(javaClass.classLoader.getResource(miraiBotClassPath))\n\n        val allClassesResourceCount = javaClass.classLoader.getSizeOfResources(allClassesPath)\n            .also { assertEquals(0, it) }\n\n        jvmPluginClasspath.shouldResolveConsoleSystemResource = true\n\n        assertNotNull(javaClass.classLoader.getResource(miraiConsoleClassPath))\n        assertNotNull(javaClass.classLoader.getResource(miraiBotClassPath))\n\n        assertTrue(javaClass.classLoader.getSizeOfResources(miraiConsoleClassPath) > miraiConsoleClassResourceCount)\n        assertTrue(javaClass.classLoader.getSizeOfResources(allClassesPath) > allClassesResourceCount)\n\n        jvmPluginClasspath.shouldResolveConsoleSystemResource = false\n\n        assertNull(javaClass.getResource(\"/$miraiConsoleClassPath\"))\n        assertNull(javaClass.classLoader.getResource(miraiConsoleClassPath))\n        assertEquals(0, javaClass.classLoader.getSizeOfResources(miraiConsoleClassPath))\n\n        assertNull(javaClass.getResource(\"/$miraiBotClassPath\"))\n        assertNull(javaClass.classLoader.getResource(miraiBotClassPath))\n\n        assertEquals(0, javaClass.classLoader.getSizeOfResources(allClassesPath))\n    }\n}"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/service-loader/src/PMain.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n\npackage net.mamoe.console.itest.serviceloader\n\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport net.mamoe.mirai.utils.info\nimport java.io.File\nimport java.util.*\nimport kotlin.test.assertEquals\n\ninternal object PMain : KotlinPlugin(JvmPluginDescription(\"net.mamoe.console.itest.serviceloader\", \"0.0.0\")) {\n    init {\n        val access = jvmPluginClasspath\n        val sharedCL = access.pluginSharedLibrariesClassLoader\n        access.addToPath(sharedCL, File(\"modules/module-service-loader-typedef-0.0.0.jar\"))\n        access.addToPath(sharedCL, File(\"modules/module-service-loader-impl-0.0.0.jar\"))\n    }\n\n    override fun onEnable() {\n        @Suppress(\"LocalVariableName\")\n        val ServiceTypedef = Class.forName(\"net.mamoe.console.integrationtest.mod.servicetypedef.ServiceTypedef\")\n        val loader = ServiceLoader.load(\n            ServiceTypedef,\n            javaClass.classLoader,\n        ).toList()\n        val services = loader.asSequence().map { it.javaClass.name }.toMutableList()\n        services.forEach { service ->\n            logger.info { \"Service: $service\" }\n        }\n        assertEquals(mutableListOf(\"net.mamoe.console.integrationtest.mod.serviceimpl.ServiceImpl\"), services)\n        ServiceTypedef.getMethod(\"act\").invoke(loader.first())\n\n        assertEquals(\n            \"from plugin\",\n            javaClass.getResourceAsStream(\"/test-res.txt\")!!.reader().use { it.readText() }.trim(),\n        )\n        val tstRes = javaClass.classLoader.getResources(\"test-res.txt\").asSequence().onEach {\n            println(it)\n        }.toMutableList()\n        // /service-loader-0.0.0.jar!/test-res.txt\n        // /module-service-loader-typedef-0.0.0.jar!/test-res.txt\n        // /module-service-loader-impl-0.0.0.jar!/test-res.txt\n        assertEquals(3, tstRes.size)\n\n        assertEquals(\n            mutableListOf(),\n            javaClass.classLoader.getResources(\"something/not/exists.bin\").asSequence().toMutableList()\n        )\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/integration-test/testers/tester.template.gradle.kts",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"UnusedImport\")\n\nplugins {\n    kotlin(\"jvm\")\n    kotlin(\"plugin.serialization\")\n    id(\"java\")\n}\n\nversion = \"0.0.0\"\n\nkotlin {\n    explicitApiWarning()\n}\n\ndependencies {\n    api(project(\":mirai-console.integration-test\"))\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/.gitignore",
    "content": "src/internal/MiraiConsoleBuildConstants.kt\nsrc/internal/MiraiConsoleBuildDependencies.kt"
  },
  {
    "path": "mirai-console/backend/mirai-console/README.md",
    "content": "# Mirai Console - Backend\n\nMirai Console 后端模块. 发布为 `net.mamoe:mirai-console`."
  },
  {
    "path": "mirai-console/backend/mirai-console/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"UnusedImport\")\n\nimport BinaryCompatibilityConfigurator.configureBinaryValidator\nimport org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType\nimport java.time.Instant\nimport java.time.ZoneId\nimport java.time.format.DateTimeFormatter\n\nplugins {\n    kotlin(\"jvm\")\n    kotlin(\"plugin.serialization\")\n    id(\"java\")\n    `maven-publish`\n    id(\"me.him188.kotlin-jvm-blocking-bridge\")\n    id(\"me.him188.kotlin-dynamic-delegation\")\n}\n\nversion = Versions.console\ndescription = \"Mirai Console Backend\"\n\nkotlin {\n    explicitApiWarning()\n    optInForAllSourceSets(\"kotlinx.serialization.ExperimentalSerializationApi\")\n\n    optInForTestSourceSets(\"net.mamoe.mirai.console.ConsoleFrontEndImplementation\")\n    optInForTestSourceSets(\"net.mamoe.mirai.console.ConsoleExperimentalApi\")\n    optInForTestSourceSets(\"net.mamoe.mirai.console.ConsoleInternalApi\")\n}\n\n\n// 搜索 mirai-console (包括 core) 直接使用并对外公开的类 (api)\nconfigurations.create(\"consoleRuntimeClasspath\").attributes {\n    attribute(\n        Usage.USAGE_ATTRIBUTE,\n        project.objects.named(Usage::class.java, Usage.JAVA_API)\n    )\n    attribute(KotlinPlatformType.attribute, KotlinPlatformType.jvm)\n}.also { consoleRuntimeClasspath ->\n    consoleRuntimeClasspath.exclude(group = \"io.ktor\")\n}\n\ndependencies {\n    compileAndTestRuntime(project(\":mirai-core-api\"))\n    compileAndTestRuntime(project(\":mirai-core-utils\"))\n    compileAndTestRuntime(`kotlin-stdlib-jdk8`)\n\n    compileAndTestRuntime(`kotlinx-atomicfu`)\n    compileAndTestRuntime(`kotlinx-coroutines-core`)\n    compileAndTestRuntime(`kotlinx-serialization-core`)\n    compileAndTestRuntime(`kotlinx-serialization-json`)\n    compileAndTestRuntime(`kotlin-reflect`)\n\n    implementation(project(\":mirai-console-compiler-annotations\"))\n\n    smartImplementation(`yamlkt`)\n    smartImplementation(`jetbrains-annotations`)\n    smartImplementation(`caller-finder`)\n    smartImplementation(`maven-resolver-api`)\n    smartImplementation(`maven-resolver-provider`)\n    smartImplementation(`maven-resolver-impl`)\n    smartImplementation(`maven-resolver-connector-basic`)\n    smartImplementation(`maven-resolver-transport-http`)\n    smartImplementation(`slf4j-api`)\n    smartImplementation(`kotlin-jvm-blocking-bridge`)\n    smartImplementation(`kotlin-dynamic-delegation`)\n    smartApi(`kotlinx-coroutines-jdk8`)\n\n    testApi(project(\":mirai-core\"))\n    testApi(`kotlin-stdlib-jdk8`)\n    testApi(`kotlinx-coroutines-test`)\n\n    \"consoleRuntimeClasspath\"(project)\n    \"consoleRuntimeClasspath\"(project(\":mirai-core-utils\"))\n    \"consoleRuntimeClasspath\"(project(\":mirai-core-api\"))\n    \"consoleRuntimeClasspath\"(project(\":mirai-core\"))\n}\n\ntasks {\n    val task = register(\"generateBuildConstants\") {\n        group = \"mirai\"\n        doLast {\n            val now = Instant.now()\n            project.file(\"src/internal/MiraiConsoleBuildConstants.kt\").writeText(\n                project.file(\"src/internal/MiraiConsoleBuildConstants.kt.template\").readText()\n                    .replace(\"GENERATION_DATE\", now.atZone(ZoneId.systemDefault()).format(DateTimeFormatter.ISO_LOCAL_DATE_TIME))\n                    .replace(\"BUILD_DATE\", now.epochSecond.toString())\n                    .replace(\"VERSION_CONSTANT\", project.version.toString())\n            )\n        }\n    }\n\n    afterEvaluate {\n        getByName(\"compileKotlin\").dependsOn(task)\n    }\n}\n\ntasks.withType<Test> {\n    this.jvmArgs(\"-Dmirai.console.skip-end-user-readme\")\n}\n\ntasks.getByName(\"compileKotlin\").dependsOn(\n    DependencyDumper.registerDumpTaskKtSrc(\n        project,\n        \"consoleRuntimeClasspath\",\n        project.file(\"src/internal/MiraiConsoleBuildDependencies.kt\"),\n        \"net.mamoe.mirai.console.internal.MiraiConsoleBuildDependencies\"\n    )\n)\n\nval graphDump = DependencyDumper.registerDumpClassGraph(project, \"consoleRuntimeClasspath\", \"allclasses.txt\")\ntasks.named<Copy>(\"processResources\").configure {\n    from(graphDump) {\n        into(\"META-INF/mirai-console\")\n    }\n}\n\nconfigurePublishing(\"mirai-console\")\nconfigureBinaryValidator(null)"
  },
  {
    "path": "mirai-console/backend/mirai-console/compatibility-validation/jvm/api/jvm.api",
    "content": "public final class net/mamoe/mirai/console/MalformedMiraiConsoleImplementationError : java/lang/Error {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun <init> (Ljava/lang/Throwable;)V\n}\n\npublic abstract interface class net/mamoe/mirai/console/MiraiConsole : kotlinx/coroutines/CoroutineScope {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/MiraiConsole$INSTANCE;\n\tpublic abstract fun getBuildDate ()Ljava/time/Instant;\n\tpublic abstract fun getBuiltInPluginLoaders ()Ljava/util/List;\n\tpublic abstract fun getMainLogger ()Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic fun getPluginCenter ()Lnet/mamoe/mirai/console/plugin/center/PluginCenter;\n\tpublic abstract fun getPluginManager ()Lnet/mamoe/mirai/console/plugin/PluginManager;\n\tpublic abstract fun getRootPath ()Ljava/nio/file/Path;\n\tpublic abstract fun getVersion ()Lnet/mamoe/mirai/console/util/SemVersion;\n\tpublic abstract fun isAnsiSupported ()Z\n}\n\npublic final class net/mamoe/mirai/console/MiraiConsole$INSTANCE : net/mamoe/mirai/console/MiraiConsole {\n\tpublic static synthetic fun addBot$default (Lnet/mamoe/mirai/console/MiraiConsole$INSTANCE;JLjava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lnet/mamoe/mirai/Bot;\n\tpublic static synthetic fun addBot$default (Lnet/mamoe/mirai/console/MiraiConsole$INSTANCE;JLnet/mamoe/mirai/auth/BotAuthorization;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lnet/mamoe/mirai/Bot;\n\tpublic static synthetic fun addBot$default (Lnet/mamoe/mirai/console/MiraiConsole$INSTANCE;J[BLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lnet/mamoe/mirai/Bot;\n\tpublic fun getBuildDate ()Ljava/time/Instant;\n\tpublic fun getBuiltInPluginLoaders ()Ljava/util/List;\n\tpublic fun getCoroutineContext ()Lkotlin/coroutines/CoroutineContext;\n\tpublic final fun getJob ()Lkotlinx/coroutines/Job;\n\tpublic fun getMainLogger ()Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic fun getPluginCenter ()Lnet/mamoe/mirai/console/plugin/center/PluginCenter;\n\tpublic fun getPluginManager ()Lnet/mamoe/mirai/console/plugin/PluginManager;\n\tpublic fun getRootPath ()Ljava/nio/file/Path;\n\tpublic fun getVersion ()Lnet/mamoe/mirai/console/util/SemVersion;\n\tpublic final fun isActive ()Z\n\tpublic fun isAnsiSupported ()Z\n}\n\npublic abstract interface class net/mamoe/mirai/console/MiraiConsoleFrontEndDescription {\n\tpublic fun getCompatibleBackendVersion ()Lnet/mamoe/mirai/console/util/SemVersion;\n\tpublic abstract fun getName ()Ljava/lang/String;\n\tpublic abstract fun getVendor ()Ljava/lang/String;\n\tpublic abstract fun getVersion ()Lnet/mamoe/mirai/console/util/SemVersion;\n\tpublic fun render ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/MiraiConsoleImplementation$ConsoleLaunchOptions {\n\tpublic field crashWhenPluginLoadFailed Z\n\tpublic fun <init> ()V\n}\n\npublic final class net/mamoe/mirai/console/MiraiConsoleKt {\n\tpublic static final fun getRootDir (Lnet/mamoe/mirai/console/MiraiConsole;)Ljava/io/File;\n}\n\npublic abstract class net/mamoe/mirai/console/command/AbstractCommand : net/mamoe/mirai/console/command/Command {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/CommandOwner;Ljava/lang/String;[Ljava/lang/String;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/CommandOwner;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/CommandOwner;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/console/permission/Permission;)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/console/command/CommandOwner;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/console/permission/Permission;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getDescription ()Ljava/lang/String;\n\tpublic final fun getOwner ()Lnet/mamoe/mirai/console/command/CommandOwner;\n\tpublic fun getPermission ()Lnet/mamoe/mirai/console/permission/Permission;\n\tpublic fun getPrefixOptional ()Z\n\tpublic final fun getPrimaryName ()Ljava/lang/String;\n\tpublic final fun getSecondaryNames ()[Ljava/lang/String;\n\tpublic fun getUsage ()Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/console/command/AbstractCommandSender : kotlinx/coroutines/CoroutineScope, net/mamoe/mirai/console/command/CommandSender {\n\tpublic abstract fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic abstract fun getUser ()Lnet/mamoe/mirai/contact/User;\n\tpublic abstract fun toString ()Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/console/command/AbstractPluginCustomCommandSender : net/mamoe/mirai/console/command/AbstractCommandSender, net/mamoe/mirai/console/command/PluginCustomCommandSender {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/plugin/Plugin;)V\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getCoroutineContext ()Lkotlin/coroutines/CoroutineContext;\n\tpublic fun getName ()Ljava/lang/String;\n\tpublic final fun getOwner ()Lnet/mamoe/mirai/console/plugin/Plugin;\n\tpublic fun getPermitteeId ()Lnet/mamoe/mirai/console/permission/PermitteeId;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getUser ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun isAnsiSupported ()Z\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tprotected abstract fun sendMessage0 (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/console/command/AbstractPluginCustomCommandSenderJ : net/mamoe/mirai/console/command/AbstractPluginCustomCommandSender {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/plugin/Plugin;)V\n\tpublic final fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tprotected final fun sendMessage0 (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tprotected abstract fun sendMessageImpl (Ljava/lang/String;)V\n}\n\npublic abstract class net/mamoe/mirai/console/command/AbstractUserCommandSender : net/mamoe/mirai/console/command/AbstractCommandSender, net/mamoe/mirai/console/command/UserCommandSender {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getName ()Ljava/lang/String;\n\tpublic fun sendMessage (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/console/command/BuiltInCommands {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/BuiltInCommands;\n\tpublic final fun getParentPermission ()Lnet/mamoe/mirai/console/permission/Permission;\n}\n\npublic final class net/mamoe/mirai/console/command/BuiltInCommands$AutoLoginCommand : net/mamoe/mirai/console/command/CompositeCommand, net/mamoe/mirai/console/command/BuiltInCommandInternal {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/BuiltInCommands$AutoLoginCommand;\n\tpublic static synthetic fun add$default (Lnet/mamoe/mirai/console/command/BuiltInCommands$AutoLoginCommand;Lnet/mamoe/mirai/console/command/CommandSender;JLjava/lang/String;Lnet/mamoe/mirai/console/internal/data/builtins/AutoLoginConfig$Account$PasswordKind;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun clear (Lnet/mamoe/mirai/console/command/CommandSender;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun list (Lnet/mamoe/mirai/console/command/CommandSender;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun remove (Lnet/mamoe/mirai/console/command/CommandSender;JLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/console/command/BuiltInCommands$HelpCommand : net/mamoe/mirai/console/command/SimpleCommand, net/mamoe/mirai/console/command/BuiltInCommandInternal {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/BuiltInCommands$HelpCommand;\n\tpublic static final fun generateDefaultHelp (Lnet/mamoe/mirai/console/permission/PermitteeId;)Ljava/lang/String;\n\tpublic final fun handle (Lnet/mamoe/mirai/console/command/CommandSender;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/console/command/BuiltInCommands$LoginCommand : net/mamoe/mirai/console/command/SimpleCommand, net/mamoe/mirai/console/command/BuiltInCommandInternal {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/BuiltInCommands$LoginCommand;\n\tpublic final fun handle (Lnet/mamoe/mirai/console/command/CommandSender;JLjava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun handle (Lnet/mamoe/mirai/console/command/CommandSender;JLjava/lang/String;Lnet/mamoe/mirai/utils/BotConfiguration$MiraiProtocol;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun handle (Lnet/mamoe/mirai/console/command/CommandSender;JLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun handle$default (Lnet/mamoe/mirai/console/command/BuiltInCommands$LoginCommand;Lnet/mamoe/mirai/console/command/CommandSender;JLjava/lang/String;Lnet/mamoe/mirai/utils/BotConfiguration$MiraiProtocol;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/console/command/BuiltInCommands$LogoutCommand : net/mamoe/mirai/console/command/SimpleCommand, net/mamoe/mirai/console/command/BuiltInCommandInternal {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/BuiltInCommands$LogoutCommand;\n\tpublic final fun handle (Lnet/mamoe/mirai/console/command/CommandSender;JLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/console/command/BuiltInCommands$PermissionCommand : net/mamoe/mirai/console/command/CompositeCommand, net/mamoe/mirai/console/command/BuiltInCommandInternal {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/BuiltInCommands$PermissionCommand;\n\tpublic final fun cancel (Lnet/mamoe/mirai/console/command/CommandSender;Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/Permission;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun cancelAll (Lnet/mamoe/mirai/console/command/CommandSender;Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/Permission;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun listPermissions (Lnet/mamoe/mirai/console/command/CommandSender;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun permit (Lnet/mamoe/mirai/console/command/CommandSender;Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/Permission;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun permittedPermissions (Lnet/mamoe/mirai/console/command/CommandSender;Lnet/mamoe/mirai/console/permission/PermitteeId;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun permittedPermissions$default (Lnet/mamoe/mirai/console/command/BuiltInCommands$PermissionCommand;Lnet/mamoe/mirai/console/command/CommandSender;Lnet/mamoe/mirai/console/permission/PermitteeId;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/console/command/BuiltInCommands$StatusCommand : net/mamoe/mirai/console/command/SimpleCommand, net/mamoe/mirai/console/command/BuiltInCommandInternal {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/BuiltInCommands$StatusCommand;\n\tpublic final fun handle (Lnet/mamoe/mirai/console/command/CommandSender;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/console/command/BuiltInCommands$StopCommand : net/mamoe/mirai/console/command/SimpleCommand, net/mamoe/mirai/console/command/BuiltInCommandInternal {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/BuiltInCommands$StopCommand;\n\tpublic final fun handle (Lnet/mamoe/mirai/console/command/CommandSender;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/console/command/Command {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/command/Command$Companion;\n\tpublic static fun checkCommandName (Ljava/lang/String;)V\n\tpublic static fun getAllNames (Lnet/mamoe/mirai/console/command/Command;)[Ljava/lang/String;\n\tpublic abstract fun getDescription ()Ljava/lang/String;\n\tpublic abstract fun getOverloads ()Ljava/util/List;\n\tpublic abstract fun getOwner ()Lnet/mamoe/mirai/console/command/CommandOwner;\n\tpublic abstract fun getPermission ()Lnet/mamoe/mirai/console/permission/Permission;\n\tpublic abstract fun getPrefixOptional ()Z\n\tpublic abstract fun getPrimaryName ()Ljava/lang/String;\n\tpublic abstract fun getSecondaryNames ()[Ljava/lang/String;\n\tpublic abstract fun getUsage ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/command/Command$Companion {\n\tpublic final fun checkCommandName (Ljava/lang/String;)V\n\tpublic final fun getAllNames (Lnet/mamoe/mirai/console/command/Command;)[Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/console/command/CommandContext {\n\tpublic abstract fun getOriginalMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic abstract fun getSender ()Lnet/mamoe/mirai/console/command/CommandSender;\n}\n\npublic final class net/mamoe/mirai/console/command/CommandExecuteResult$ExecutionFailed : net/mamoe/mirai/console/command/CommandExecuteResult$Failure {\n\tpublic fun <init> (Ljava/lang/Throwable;Lnet/mamoe/mirai/console/command/Command;Lnet/mamoe/mirai/console/command/parse/CommandCall;Lnet/mamoe/mirai/console/command/resolve/ResolvedCommandCall;)V\n\tpublic fun getCall ()Lnet/mamoe/mirai/console/command/parse/CommandCall;\n\tpublic fun getCommand ()Lnet/mamoe/mirai/console/command/Command;\n\tpublic fun getException ()Ljava/lang/Throwable;\n\tpublic fun getResolvedCall ()Lnet/mamoe/mirai/console/command/resolve/ResolvedCommandCall;\n}\n\npublic abstract class net/mamoe/mirai/console/command/CommandExecuteResult$Failure : net/mamoe/mirai/console/command/CommandExecuteResult {\n\tpublic fun <init> ()V\n}\n\npublic final class net/mamoe/mirai/console/command/CommandExecuteResult$IllegalArgument : net/mamoe/mirai/console/command/CommandExecuteResult$Failure {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/IllegalCommandArgumentException;Lnet/mamoe/mirai/console/command/Command;Lnet/mamoe/mirai/console/command/parse/CommandCall;Lnet/mamoe/mirai/console/command/resolve/ResolvedCommandCall;)V\n\tpublic fun getCall ()Lnet/mamoe/mirai/console/command/parse/CommandCall;\n\tpublic fun getCommand ()Lnet/mamoe/mirai/console/command/Command;\n\tpublic synthetic fun getException ()Ljava/lang/Throwable;\n\tpublic fun getException ()Lnet/mamoe/mirai/console/command/IllegalCommandArgumentException;\n\tpublic fun getResolvedCall ()Lnet/mamoe/mirai/console/command/resolve/ResolvedCommandCall;\n}\n\npublic final class net/mamoe/mirai/console/command/CommandExecuteResult$Intercepted : net/mamoe/mirai/console/command/CommandExecuteResult$Failure {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/parse/CommandCall;Lnet/mamoe/mirai/console/command/resolve/ResolvedCommandCall;Lnet/mamoe/mirai/console/command/Command;Lnet/mamoe/mirai/console/command/resolve/InterceptedReason;)V\n\tpublic fun getCall ()Lnet/mamoe/mirai/console/command/parse/CommandCall;\n\tpublic fun getCommand ()Lnet/mamoe/mirai/console/command/Command;\n\tpublic synthetic fun getException ()Ljava/lang/Throwable;\n\tpublic fun getException ()Ljava/lang/Void;\n\tpublic final fun getReason ()Lnet/mamoe/mirai/console/command/resolve/InterceptedReason;\n\tpublic fun getResolvedCall ()Lnet/mamoe/mirai/console/command/resolve/ResolvedCommandCall;\n}\n\npublic final class net/mamoe/mirai/console/command/CommandExecuteResult$PermissionDenied : net/mamoe/mirai/console/command/CommandExecuteResult$Failure {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/Command;Lnet/mamoe/mirai/console/command/parse/CommandCall;Lnet/mamoe/mirai/console/command/resolve/ResolvedCommandCall;)V\n\tpublic fun getCall ()Lnet/mamoe/mirai/console/command/parse/CommandCall;\n\tpublic fun getCommand ()Lnet/mamoe/mirai/console/command/Command;\n\tpublic synthetic fun getException ()Ljava/lang/Throwable;\n\tpublic fun getException ()Ljava/lang/Void;\n\tpublic fun getResolvedCall ()Lnet/mamoe/mirai/console/command/resolve/ResolvedCommandCall;\n}\n\npublic final class net/mamoe/mirai/console/command/CommandExecuteResult$Success : net/mamoe/mirai/console/command/CommandExecuteResult {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/Command;Lnet/mamoe/mirai/console/command/parse/CommandCall;Lnet/mamoe/mirai/console/command/resolve/ResolvedCommandCall;)V\n\tpublic fun getCall ()Lnet/mamoe/mirai/console/command/parse/CommandCall;\n\tpublic fun getCommand ()Lnet/mamoe/mirai/console/command/Command;\n\tpublic synthetic fun getException ()Ljava/lang/Throwable;\n\tpublic fun getException ()Ljava/lang/Void;\n\tpublic fun getResolvedCall ()Lnet/mamoe/mirai/console/command/resolve/ResolvedCommandCall;\n}\n\npublic final class net/mamoe/mirai/console/command/CommandExecuteResult$UnmatchedSignature : net/mamoe/mirai/console/command/CommandExecuteResult$Failure {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/Command;Lnet/mamoe/mirai/console/command/parse/CommandCall;Ljava/util/List;)V\n\tpublic fun getCall ()Lnet/mamoe/mirai/console/command/parse/CommandCall;\n\tpublic fun getCommand ()Lnet/mamoe/mirai/console/command/Command;\n\tpublic synthetic fun getException ()Ljava/lang/Throwable;\n\tpublic fun getException ()Ljava/lang/Void;\n\tpublic final fun getFailureReasons ()Ljava/util/List;\n\tpublic fun getResolvedCall ()Lnet/mamoe/mirai/console/command/resolve/ResolvedCommandCall;\n}\n\npublic final class net/mamoe/mirai/console/command/CommandExecuteResult$UnresolvedCommand : net/mamoe/mirai/console/command/CommandExecuteResult$Failure {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/parse/CommandCall;)V\n\tpublic fun getCall ()Lnet/mamoe/mirai/console/command/parse/CommandCall;\n\tpublic fun getCommand ()Ljava/lang/Void;\n\tpublic synthetic fun getCommand ()Lnet/mamoe/mirai/console/command/Command;\n\tpublic synthetic fun getException ()Ljava/lang/Throwable;\n\tpublic fun getException ()Ljava/lang/Void;\n\tpublic fun getResolvedCall ()Lnet/mamoe/mirai/console/command/resolve/ResolvedCommandCall;\n}\n\npublic final class net/mamoe/mirai/console/command/CommandExecuteResultKt {\n}\n\npublic final class net/mamoe/mirai/console/command/CommandExecutionException : java/lang/RuntimeException {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/CommandSender;Lnet/mamoe/mirai/console/command/Command;Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic final fun getCommand ()Lnet/mamoe/mirai/console/command/Command;\n\tpublic final fun getName ()Ljava/lang/String;\n\tpublic final fun getSender ()Lnet/mamoe/mirai/console/command/CommandSender;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/console/command/CommandManager {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/CommandManager$INSTANCE;\n\tpublic static synthetic fun executeCommand$default (Lnet/mamoe/mirai/console/command/CommandManager;Lnet/mamoe/mirai/console/command/CommandSender;Lnet/mamoe/mirai/console/command/Command;Lnet/mamoe/mirai/message/data/Message;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun executeCommand$default (Lnet/mamoe/mirai/console/command/CommandManager;Lnet/mamoe/mirai/console/command/CommandSender;Lnet/mamoe/mirai/message/data/Message;ZILjava/lang/Object;)Lnet/mamoe/mirai/console/command/CommandExecuteResult;\n\tpublic static synthetic fun executeCommand$default (Lnet/mamoe/mirai/console/command/CommandManager;Lnet/mamoe/mirai/console/command/CommandSender;Lnet/mamoe/mirai/message/data/Message;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic abstract fun findDuplicateCommand (Lnet/mamoe/mirai/console/command/Command;)Lnet/mamoe/mirai/console/command/Command;\n\tpublic abstract fun getAllRegisteredCommands ()Ljava/util/List;\n\tpublic abstract fun getCommandPrefix ()Ljava/lang/String;\n\tpublic abstract fun getRegisteredCommands (Lnet/mamoe/mirai/console/command/CommandOwner;)Ljava/util/List;\n\tpublic abstract fun isCommandRegistered (Lnet/mamoe/mirai/console/command/Command;)Z\n\tpublic abstract fun matchCommand (Ljava/lang/String;)Lnet/mamoe/mirai/console/command/Command;\n\tpublic abstract fun registerCommand (Lnet/mamoe/mirai/console/command/Command;Z)Z\n\tpublic static synthetic fun registerCommand$default (Lnet/mamoe/mirai/console/command/CommandManager;Lnet/mamoe/mirai/console/command/Command;ZILjava/lang/Object;)Z\n\tpublic abstract fun unregisterAllCommands (Lnet/mamoe/mirai/console/command/CommandOwner;)V\n\tpublic abstract fun unregisterCommand (Lnet/mamoe/mirai/console/command/Command;)Z\n}\n\npublic final class net/mamoe/mirai/console/command/CommandManager$INSTANCE : net/mamoe/mirai/console/command/CommandManager {\n\tpublic final synthetic fun findDuplicate (Lnet/mamoe/mirai/console/command/Command;)Lnet/mamoe/mirai/console/command/Command;\n\tpublic fun findDuplicateCommand (Lnet/mamoe/mirai/console/command/Command;)Lnet/mamoe/mirai/console/command/Command;\n\tpublic fun getAllRegisteredCommands ()Ljava/util/List;\n\tpublic fun getCommandPrefix ()Ljava/lang/String;\n\tpublic fun getRegisteredCommands (Lnet/mamoe/mirai/console/command/CommandOwner;)Ljava/util/List;\n\tpublic fun isCommandRegistered (Lnet/mamoe/mirai/console/command/Command;)Z\n\tpublic final synthetic fun isRegistered (Lnet/mamoe/mirai/console/command/Command;)Z\n\tpublic fun matchCommand (Ljava/lang/String;)Lnet/mamoe/mirai/console/command/Command;\n\tpublic final synthetic fun register (Lnet/mamoe/mirai/console/command/Command;Z)Z\n\tpublic static synthetic fun register$default (Lnet/mamoe/mirai/console/command/CommandManager$INSTANCE;Lnet/mamoe/mirai/console/command/Command;ZILjava/lang/Object;)Z\n\tpublic fun registerCommand (Lnet/mamoe/mirai/console/command/Command;Z)Z\n\tpublic final synthetic fun registeredCommands0 (Lnet/mamoe/mirai/console/command/CommandOwner;)Ljava/util/List;\n\tpublic final synthetic fun unregister (Lnet/mamoe/mirai/console/command/Command;)Z\n\tpublic final synthetic fun unregisterAll (Lnet/mamoe/mirai/console/command/CommandOwner;)V\n\tpublic fun unregisterAllCommands (Lnet/mamoe/mirai/console/command/CommandOwner;)V\n\tpublic fun unregisterCommand (Lnet/mamoe/mirai/console/command/Command;)Z\n}\n\npublic final class net/mamoe/mirai/console/command/CommandManagerKt {\n\tpublic static synthetic fun execute0$default (Lnet/mamoe/mirai/console/command/Command;Lnet/mamoe/mirai/console/command/CommandSender;Ljava/lang/String;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun execute0$default (Lnet/mamoe/mirai/console/command/Command;Lnet/mamoe/mirai/console/command/CommandSender;[Lnet/mamoe/mirai/message/data/Message;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun execute0$default (Lnet/mamoe/mirai/console/command/CommandSender;Ljava/lang/String;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/console/command/CommandOwner : net/mamoe/mirai/console/permission/PermissionIdNamespace {\n\tpublic abstract fun getParentPermission ()Lnet/mamoe/mirai/console/permission/Permission;\n}\n\npublic final class net/mamoe/mirai/console/command/CommandPermissionDeniedException : java/lang/RuntimeException {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/CommandSender;Lnet/mamoe/mirai/console/command/Command;)V\n\tpublic final fun getCommand ()Lnet/mamoe/mirai/console/command/Command;\n\tpublic final fun getCommandSender ()Lnet/mamoe/mirai/console/command/CommandSender;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/console/command/CommandSender : kotlinx/coroutines/CoroutineScope, net/mamoe/mirai/console/permission/Permittee {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/command/CommandSender$Companion;\n\tpublic static fun from (Lnet/mamoe/mirai/event/events/FriendMessageEvent;)Lnet/mamoe/mirai/console/command/FriendCommandSenderOnMessage;\n\tpublic static fun from (Lnet/mamoe/mirai/event/events/GroupMessageEvent;)Lnet/mamoe/mirai/console/command/MemberCommandSenderOnMessage;\n\tpublic static fun from (Lnet/mamoe/mirai/event/events/GroupTempMessageEvent;)Lnet/mamoe/mirai/console/command/GroupTempCommandSenderOnMessage;\n\tpublic static fun from (Lnet/mamoe/mirai/event/events/MessageEvent;)Lnet/mamoe/mirai/console/command/CommandSenderOnMessage;\n\tpublic static fun from (Lnet/mamoe/mirai/event/events/MessageSyncEvent;)Lnet/mamoe/mirai/console/command/OtherClientCommandSenderOnMessageSync;\n\tpublic static fun from (Lnet/mamoe/mirai/event/events/OtherClientMessageEvent;)Lnet/mamoe/mirai/console/command/OtherClientCommandSenderOnMessage;\n\tpublic static fun from (Lnet/mamoe/mirai/event/events/StrangerMessageEvent;)Lnet/mamoe/mirai/console/command/StrangerCommandSenderOnMessage;\n\tpublic abstract fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getName ()Ljava/lang/String;\n\tpublic abstract fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic abstract fun getUser ()Lnet/mamoe/mirai/contact/User;\n\tpublic static fun of (Lnet/mamoe/mirai/contact/Friend;)Lnet/mamoe/mirai/console/command/FriendCommandSender;\n\tpublic static fun of (Lnet/mamoe/mirai/contact/Member;)Lnet/mamoe/mirai/console/command/MemberCommandSender;\n\tpublic static fun of (Lnet/mamoe/mirai/contact/Member;Z)Lnet/mamoe/mirai/console/command/UserCommandSender;\n\tpublic static fun of (Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/console/command/GroupTempCommandSender;\n\tpublic static fun of (Lnet/mamoe/mirai/contact/OtherClient;)Lnet/mamoe/mirai/console/command/OtherClientCommandSender;\n\tpublic static fun of (Lnet/mamoe/mirai/contact/Stranger;)Lnet/mamoe/mirai/console/command/StrangerCommandSender;\n\tpublic static fun of (Lnet/mamoe/mirai/contact/User;Z)Lnet/mamoe/mirai/console/command/UserCommandSender;\n\tpublic fun sendMessage (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic abstract fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic abstract fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/console/command/CommandSender$Companion {\n\tpublic final fun from (Lnet/mamoe/mirai/event/events/FriendMessageEvent;)Lnet/mamoe/mirai/console/command/FriendCommandSenderOnMessage;\n\tpublic final fun from (Lnet/mamoe/mirai/event/events/GroupMessageEvent;)Lnet/mamoe/mirai/console/command/MemberCommandSenderOnMessage;\n\tpublic final fun from (Lnet/mamoe/mirai/event/events/GroupTempMessageEvent;)Lnet/mamoe/mirai/console/command/GroupTempCommandSenderOnMessage;\n\tpublic final fun from (Lnet/mamoe/mirai/event/events/MessageEvent;)Lnet/mamoe/mirai/console/command/CommandSenderOnMessage;\n\tpublic final fun from (Lnet/mamoe/mirai/event/events/MessageSyncEvent;)Lnet/mamoe/mirai/console/command/OtherClientCommandSenderOnMessageSync;\n\tpublic final fun from (Lnet/mamoe/mirai/event/events/OtherClientMessageEvent;)Lnet/mamoe/mirai/console/command/OtherClientCommandSenderOnMessage;\n\tpublic final fun from (Lnet/mamoe/mirai/event/events/StrangerMessageEvent;)Lnet/mamoe/mirai/console/command/StrangerCommandSenderOnMessage;\n\tpublic final fun of (Lnet/mamoe/mirai/contact/Friend;)Lnet/mamoe/mirai/console/command/FriendCommandSender;\n\tpublic final fun of (Lnet/mamoe/mirai/contact/Member;)Lnet/mamoe/mirai/console/command/MemberCommandSender;\n\tpublic final fun of (Lnet/mamoe/mirai/contact/Member;Z)Lnet/mamoe/mirai/console/command/UserCommandSender;\n\tpublic final fun of (Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/console/command/GroupTempCommandSender;\n\tpublic final fun of (Lnet/mamoe/mirai/contact/OtherClient;)Lnet/mamoe/mirai/console/command/OtherClientCommandSender;\n\tpublic final fun of (Lnet/mamoe/mirai/contact/Stranger;)Lnet/mamoe/mirai/console/command/StrangerCommandSender;\n\tpublic final fun of (Lnet/mamoe/mirai/contact/User;Z)Lnet/mamoe/mirai/console/command/UserCommandSender;\n}\n\npublic final class net/mamoe/mirai/console/command/CommandSenderKt {\n\tpublic static final synthetic fun fold (Lnet/mamoe/mirai/console/command/CommandSender;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static synthetic fun fold$default (Lnet/mamoe/mirai/console/command/CommandSender;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static final fun getBotOrNull (Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/Bot;\n\tpublic static final fun getGroupOrNull (Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/contact/Group;\n\tpublic static final fun isConsole (Lnet/mamoe/mirai/console/command/CommandSender;)Z\n\tpublic static final fun isNotConsole (Lnet/mamoe/mirai/console/command/CommandSender;)Z\n\tpublic static final fun isNotUser (Lnet/mamoe/mirai/console/command/CommandSender;)Z\n\tpublic static final fun isSystem (Lnet/mamoe/mirai/console/command/CommandSender;)Z\n\tpublic static final fun isUser (Lnet/mamoe/mirai/console/command/CommandSender;)Z\n}\n\npublic abstract interface class net/mamoe/mirai/console/command/CommandSenderOnMessage : net/mamoe/mirai/console/command/CommandSender {\n\tpublic abstract fun getFromEvent ()Lnet/mamoe/mirai/event/events/MessageEvent;\n}\n\npublic abstract class net/mamoe/mirai/console/command/CompositeCommand : net/mamoe/mirai/console/command/AbstractCommand, net/mamoe/mirai/console/command/Command, net/mamoe/mirai/console/command/descriptor/CommandArgumentContextAware {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/CommandOwner;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/console/permission/Permission;Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext;)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/console/command/CommandOwner;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/console/permission/Permission;Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getContext ()Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext;\n\tpublic final fun getOverloads ()Ljava/util/List;\n\tpublic fun getUsage ()Ljava/lang/String;\n}\n\nprotected abstract interface annotation class net/mamoe/mirai/console/command/CompositeCommand$Description : java/lang/annotation/Annotation {\n\tpublic abstract fun value ()Ljava/lang/String;\n}\n\nprotected abstract interface annotation class net/mamoe/mirai/console/command/CompositeCommand$SubCommand : java/lang/annotation/Annotation {\n\tpublic abstract fun value ()[Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/command/ConsoleCommandOwner : net/mamoe/mirai/console/command/CommandOwner {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/ConsoleCommandOwner;\n\tpublic fun getParentPermission ()Lnet/mamoe/mirai/console/permission/Permission;\n\tpublic fun permissionId (Ljava/lang/String;)Lnet/mamoe/mirai/console/permission/PermissionId;\n}\n\npublic final class net/mamoe/mirai/console/command/ConsoleCommandSender : net/mamoe/mirai/console/command/AbstractCommandSender, net/mamoe/mirai/console/command/SystemCommandSender {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/ConsoleCommandSender;\n\tpublic static final field NAME Ljava/lang/String;\n\tpublic fun getBot ()Ljava/lang/Void;\n\tpublic synthetic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getCoroutineContext ()Lkotlin/coroutines/CoroutineContext;\n\tpublic fun getName ()Ljava/lang/String;\n\tpublic fun getPermitteeId ()Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$Console;\n\tpublic synthetic fun getPermitteeId ()Lnet/mamoe/mirai/console/permission/PermitteeId;\n\tpublic fun getSubject ()Ljava/lang/Void;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getUser ()Ljava/lang/Void;\n\tpublic synthetic fun getUser ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun isAnsiSupported ()Z\n\tpublic final fun sendMessage (Ljava/lang/String;)Ljava/lang/Void;\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/Void;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/console/command/FailureReason$ArgumentLengthMismatch : net/mamoe/mirai/console/command/FailureReason {\n\tpublic fun <init> ()V\n}\n\npublic abstract class net/mamoe/mirai/console/command/FailureReason$InapplicableArgument : net/mamoe/mirai/console/command/FailureReason {\n\tpublic fun <init> ()V\n\tpublic abstract fun getParameter ()Lnet/mamoe/mirai/console/command/descriptor/CommandParameter;\n}\n\npublic final class net/mamoe/mirai/console/command/FailureReason$InapplicableReceiverArgument : net/mamoe/mirai/console/command/FailureReason$InapplicableArgument {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/descriptor/CommandReceiverParameter;Lnet/mamoe/mirai/console/command/CommandSender;)V\n\tpublic final fun getArgument ()Lnet/mamoe/mirai/console/command/CommandSender;\n\tpublic synthetic fun getParameter ()Lnet/mamoe/mirai/console/command/descriptor/CommandParameter;\n\tpublic fun getParameter ()Lnet/mamoe/mirai/console/command/descriptor/CommandReceiverParameter;\n}\n\npublic final class net/mamoe/mirai/console/command/FailureReason$InapplicableValueArgument : net/mamoe/mirai/console/command/FailureReason$InapplicableArgument {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/descriptor/CommandValueParameter;Lnet/mamoe/mirai/console/command/parse/CommandValueArgument;)V\n\tpublic final fun getArgument ()Lnet/mamoe/mirai/console/command/parse/CommandValueArgument;\n\tpublic synthetic fun getParameter ()Lnet/mamoe/mirai/console/command/descriptor/CommandParameter;\n\tpublic fun getParameter ()Lnet/mamoe/mirai/console/command/descriptor/CommandValueParameter;\n}\n\npublic final class net/mamoe/mirai/console/command/FailureReason$NotEnoughArguments : net/mamoe/mirai/console/command/FailureReason$ArgumentLengthMismatch {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/FailureReason$NotEnoughArguments;\n}\n\npublic final class net/mamoe/mirai/console/command/FailureReason$ResolutionAmbiguity : net/mamoe/mirai/console/command/FailureReason {\n\tpublic fun <init> (Ljava/util/List;)V\n\tpublic final fun component1 ()Ljava/util/List;\n\tpublic final fun copy (Ljava/util/List;)Lnet/mamoe/mirai/console/command/FailureReason$ResolutionAmbiguity;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/console/command/FailureReason$ResolutionAmbiguity;Ljava/util/List;ILjava/lang/Object;)Lnet/mamoe/mirai/console/command/FailureReason$ResolutionAmbiguity;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getAllCandidates ()Ljava/util/List;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/command/FailureReason$TooManyArguments : net/mamoe/mirai/console/command/FailureReason$ArgumentLengthMismatch {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/FailureReason$TooManyArguments;\n}\n\npublic class net/mamoe/mirai/console/command/FriendCommandSender : net/mamoe/mirai/console/command/AbstractUserCommandSender, kotlinx/coroutines/CoroutineScope {\n\tpublic fun getCoroutineContext ()Lkotlin/coroutines/CoroutineContext;\n\tpublic fun getPermitteeId ()Lnet/mamoe/mirai/console/permission/PermitteeId;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun getUser ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic synthetic fun getUser ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun sendMessage (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/command/FriendCommandSenderOnMessage : net/mamoe/mirai/console/command/FriendCommandSender, net/mamoe/mirai/console/command/CommandSenderOnMessage {\n\tpublic fun getFromEvent ()Lnet/mamoe/mirai/event/events/FriendMessageEvent;\n\tpublic synthetic fun getFromEvent ()Lnet/mamoe/mirai/event/events/MessageEvent;\n}\n\npublic abstract interface class net/mamoe/mirai/console/command/GroupAwareCommandSender : net/mamoe/mirai/console/command/UserCommandSender {\n\tpublic abstract fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n}\n\npublic class net/mamoe/mirai/console/command/GroupTempCommandSender : net/mamoe/mirai/console/command/TempCommandSender, kotlinx/coroutines/CoroutineScope {\n\tpublic fun getCoroutineContext ()Lkotlin/coroutines/CoroutineContext;\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getPermitteeId ()Lnet/mamoe/mirai/console/permission/PermitteeId;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getUser ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getUser ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun sendMessage (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/command/GroupTempCommandSenderOnMessage : net/mamoe/mirai/console/command/TempCommandSenderOnMessage, net/mamoe/mirai/console/command/CommandSenderOnMessage {\n\tpublic fun getFromEvent ()Lnet/mamoe/mirai/event/events/GroupTempMessageEvent;\n\tpublic synthetic fun getFromEvent ()Lnet/mamoe/mirai/event/events/MessageEvent;\n}\n\npublic class net/mamoe/mirai/console/command/IllegalCommandArgumentException : java/lang/IllegalArgumentException {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n}\n\npublic class net/mamoe/mirai/console/command/MemberCommandSender : net/mamoe/mirai/console/command/AbstractUserCommandSender, kotlinx/coroutines/CoroutineScope, net/mamoe/mirai/console/command/GroupAwareCommandSender {\n\tpublic fun getCoroutineContext ()Lkotlin/coroutines/CoroutineContext;\n\tpublic final fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getPermitteeId ()Lnet/mamoe/mirai/console/permission/PermitteeId;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun getUser ()Lnet/mamoe/mirai/contact/Member;\n\tpublic synthetic fun getUser ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun sendMessage (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/command/MemberCommandSenderOnMessage : net/mamoe/mirai/console/command/MemberCommandSender, net/mamoe/mirai/console/command/CommandSenderOnMessage {\n\tpublic fun getFromEvent ()Lnet/mamoe/mirai/event/events/GroupMessageEvent;\n\tpublic synthetic fun getFromEvent ()Lnet/mamoe/mirai/event/events/MessageEvent;\n}\n\npublic class net/mamoe/mirai/console/command/OtherClientCommandSender : net/mamoe/mirai/console/command/AbstractCommandSender, kotlinx/coroutines/CoroutineScope {\n\tpublic final fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getClient ()Lnet/mamoe/mirai/contact/OtherClient;\n\tpublic fun getCoroutineContext ()Lkotlin/coroutines/CoroutineContext;\n\tpublic final fun getName ()Ljava/lang/String;\n\tpublic fun getPermitteeId ()Lnet/mamoe/mirai/console/permission/PermitteeId;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun getUser ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic synthetic fun getUser ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun sendMessage (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/command/OtherClientCommandSenderOnMessage : net/mamoe/mirai/console/command/OtherClientCommandSender, net/mamoe/mirai/console/command/CommandSenderOnMessage {\n\tpublic synthetic fun getFromEvent ()Lnet/mamoe/mirai/event/events/MessageEvent;\n\tpublic fun getFromEvent ()Lnet/mamoe/mirai/event/events/OtherClientMessageEvent;\n}\n\npublic final class net/mamoe/mirai/console/command/OtherClientCommandSenderOnMessageSync : net/mamoe/mirai/console/command/OtherClientCommandSender, net/mamoe/mirai/console/command/CommandSenderOnMessage {\n\tpublic synthetic fun getFromEvent ()Lnet/mamoe/mirai/event/events/MessageEvent;\n\tpublic fun getFromEvent ()Lnet/mamoe/mirai/event/events/MessageSyncEvent;\n}\n\npublic abstract interface class net/mamoe/mirai/console/command/PluginCustomCommandSender : net/mamoe/mirai/console/command/CommandSender, net/mamoe/mirai/console/command/SystemCommandSender {\n\tpublic abstract fun getOwner ()Lnet/mamoe/mirai/console/plugin/Plugin;\n\tpublic fun getPermitteeId ()Lnet/mamoe/mirai/console/permission/PermitteeId;\n\tpublic fun isAnsiSupported ()Z\n\tpublic abstract fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendMessage$suspendImpl (Lnet/mamoe/mirai/console/command/PluginCustomCommandSender;Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract class net/mamoe/mirai/console/command/RawCommand : net/mamoe/mirai/console/command/Command {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/CommandOwner;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/console/permission/Permission;Z)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/console/command/CommandOwner;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/console/permission/Permission;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getDescription ()Ljava/lang/String;\n\tpublic fun getOverloads ()Ljava/util/List;\n\tpublic fun getOwner ()Lnet/mamoe/mirai/console/command/CommandOwner;\n\tpublic fun getPermission ()Lnet/mamoe/mirai/console/permission/Permission;\n\tpublic fun getPrefixOptional ()Z\n\tpublic fun getPrimaryName ()Ljava/lang/String;\n\tpublic fun getSecondaryNames ()[Ljava/lang/String;\n\tpublic fun getUsage ()Ljava/lang/String;\n\tpublic fun onCommand (Lnet/mamoe/mirai/console/command/CommandContext;Lnet/mamoe/mirai/message/data/MessageChain;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun onCommand (Lnet/mamoe/mirai/console/command/CommandSender;Lnet/mamoe/mirai/message/data/MessageChain;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract class net/mamoe/mirai/console/command/SimpleCommand : net/mamoe/mirai/console/command/AbstractCommand, net/mamoe/mirai/console/command/Command, net/mamoe/mirai/console/command/descriptor/CommandArgumentContextAware {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/CommandOwner;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/console/permission/Permission;Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext;)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/console/command/CommandOwner;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/console/permission/Permission;Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getContext ()Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext;\n\tpublic final fun getOverloads ()Ljava/util/List;\n\tpublic fun getUsage ()Ljava/lang/String;\n}\n\nprotected abstract interface annotation class net/mamoe/mirai/console/command/SimpleCommand$Handler : java/lang/annotation/Annotation {\n}\n\npublic class net/mamoe/mirai/console/command/StrangerCommandSender : net/mamoe/mirai/console/command/AbstractUserCommandSender, kotlinx/coroutines/CoroutineScope {\n\tpublic fun getCoroutineContext ()Lkotlin/coroutines/CoroutineContext;\n\tpublic fun getPermitteeId ()Lnet/mamoe/mirai/console/permission/PermitteeId;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic final fun getUser ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic synthetic fun getUser ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun sendMessage (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/command/StrangerCommandSenderOnMessage : net/mamoe/mirai/console/command/StrangerCommandSender, net/mamoe/mirai/console/command/CommandSenderOnMessage {\n\tpublic synthetic fun getFromEvent ()Lnet/mamoe/mirai/event/events/MessageEvent;\n\tpublic fun getFromEvent ()Lnet/mamoe/mirai/event/events/StrangerMessageEvent;\n}\n\npublic abstract interface class net/mamoe/mirai/console/command/SystemCommandSender : net/mamoe/mirai/console/command/CommandSender {\n\tpublic abstract fun isAnsiSupported ()Z\n}\n\npublic abstract class net/mamoe/mirai/console/command/TempCommandSender : net/mamoe/mirai/console/command/AbstractUserCommandSender, kotlinx/coroutines/CoroutineScope, net/mamoe/mirai/console/command/GroupAwareCommandSender {\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/contact/NormalMember;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getCoroutineContext ()Lkotlin/coroutines/CoroutineContext;\n\tpublic fun getUser ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getUser ()Lnet/mamoe/mirai/contact/User;\n}\n\npublic abstract class net/mamoe/mirai/console/command/TempCommandSenderOnMessage : net/mamoe/mirai/console/command/GroupTempCommandSender, net/mamoe/mirai/console/command/CommandSenderOnMessage {\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/event/events/GroupTempMessageEvent;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getFromEvent ()Lnet/mamoe/mirai/event/events/GroupTempMessageEvent;\n\tpublic synthetic fun getFromEvent ()Lnet/mamoe/mirai/event/events/MessageEvent;\n}\n\npublic abstract interface class net/mamoe/mirai/console/command/UserCommandSender : net/mamoe/mirai/console/command/CommandSender {\n\tpublic abstract fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic abstract fun getUser ()Lnet/mamoe/mirai/contact/User;\n}\n\npublic abstract class net/mamoe/mirai/console/command/descriptor/AbstractCommandValueArgumentParser : net/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/command/descriptor/AbstractCommandValueArgumentParser$Companion;\n\tpublic fun <init> ()V\n\tprotected static final synthetic fun checkArgument (Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;ZLkotlin/jvm/functions/Function0;)V\n\tprotected static final synthetic fun illegalArgument (Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;Ljava/lang/String;Ljava/lang/Throwable;)Ljava/lang/Void;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/AbstractCommandValueArgumentParser$Companion {\n\tpublic static synthetic fun checkArgument$default (Lnet/mamoe/mirai/console/command/descriptor/AbstractCommandValueArgumentParser$Companion;Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;ZLkotlin/jvm/functions/Function0;ILjava/lang/Object;)V\n\tpublic static synthetic fun illegalArgument$default (Lnet/mamoe/mirai/console/command/descriptor/AbstractCommandValueArgumentParser$Companion;Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;Ljava/lang/String;Ljava/lang/Throwable;ILjava/lang/Object;)Ljava/lang/Void;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/AbstractCommandValueParameter$UserDefinedType : net/mamoe/mirai/console/command/descriptor/AbstractCommandValueParameter {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/command/descriptor/AbstractCommandValueParameter$UserDefinedType$Companion;\n\tpublic fun <init> (Ljava/lang/String;ZZLkotlin/reflect/KType;)V\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun component2 ()Z\n\tpublic final fun component3 ()Z\n\tpublic final fun component4 ()Lkotlin/reflect/KType;\n\tpublic final fun copy (Ljava/lang/String;ZZLkotlin/reflect/KType;)Lnet/mamoe/mirai/console/command/descriptor/AbstractCommandValueParameter$UserDefinedType;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/console/command/descriptor/AbstractCommandValueParameter$UserDefinedType;Ljava/lang/String;ZZLkotlin/reflect/KType;ILjava/lang/Object;)Lnet/mamoe/mirai/console/command/descriptor/AbstractCommandValueParameter$UserDefinedType;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getName ()Ljava/lang/String;\n\tpublic fun getType ()Lkotlin/reflect/KType;\n\tpublic fun hashCode ()I\n\tpublic fun isOptional ()Z\n\tpublic fun isVararg ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/AbstractCommandValueParameter$UserDefinedType$Companion {\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/ArgumentAcceptance$Companion {\n\tpublic final fun isAcceptable (Lnet/mamoe/mirai/console/command/descriptor/ArgumentAcceptance;)Z\n\tpublic final fun isNotAcceptable (Lnet/mamoe/mirai/console/command/descriptor/ArgumentAcceptance;)Z\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/ArgumentAcceptance$Direct : net/mamoe/mirai/console/command/descriptor/ArgumentAcceptance {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/ArgumentAcceptance$Direct;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/ArgumentAcceptance$Impossible : net/mamoe/mirai/console/command/descriptor/ArgumentAcceptance {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/ArgumentAcceptance$Impossible;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/ArgumentAcceptance$ResolutionAmbiguity : net/mamoe/mirai/console/command/descriptor/ArgumentAcceptance {\n\tpublic fun <init> (Ljava/util/List;)V\n\tpublic final fun component1 ()Ljava/util/List;\n\tpublic final fun copy (Ljava/util/List;)Lnet/mamoe/mirai/console/command/descriptor/ArgumentAcceptance$ResolutionAmbiguity;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/console/command/descriptor/ArgumentAcceptance$ResolutionAmbiguity;Ljava/util/List;ILjava/lang/Object;)Lnet/mamoe/mirai/console/command/descriptor/ArgumentAcceptance$ResolutionAmbiguity;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getCandidates ()Ljava/util/List;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/ArgumentAcceptance$WithContextualConversion : net/mamoe/mirai/console/command/descriptor/ArgumentAcceptance {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;\n\tpublic final fun copy (Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;)Lnet/mamoe/mirai/console/command/descriptor/ArgumentAcceptance$WithContextualConversion;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/console/command/descriptor/ArgumentAcceptance$WithContextualConversion;Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;ILjava/lang/Object;)Lnet/mamoe/mirai/console/command/descriptor/ArgumentAcceptance$WithContextualConversion;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getParser ()Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/ArgumentAcceptance$WithTypeConversion : net/mamoe/mirai/console/command/descriptor/ArgumentAcceptance {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/descriptor/TypeVariant;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/console/command/descriptor/TypeVariant;\n\tpublic final fun copy (Lnet/mamoe/mirai/console/command/descriptor/TypeVariant;)Lnet/mamoe/mirai/console/command/descriptor/ArgumentAcceptance$WithTypeConversion;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/console/command/descriptor/ArgumentAcceptance$WithTypeConversion;Lnet/mamoe/mirai/console/command/descriptor/TypeVariant;ILjava/lang/Object;)Lnet/mamoe/mirai/console/command/descriptor/ArgumentAcceptance$WithTypeConversion;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getTypeVariant ()Lnet/mamoe/mirai/console/command/descriptor/TypeVariant;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/BooleanValueArgumentParser {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/BooleanValueArgumentParser;\n\tpublic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Boolean;\n\tpublic synthetic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/ByteValueArgumentParser {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/ByteValueArgumentParser;\n\tpublic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Byte;\n\tpublic synthetic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/console/command/descriptor/CommandArgumentContext {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext$Companion;\n\tpublic static final field EMPTY Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext;\n\tpublic abstract fun get (Lkotlin/reflect/KClass;)Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;\n\tpublic abstract fun toList ()Ljava/util/List;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/CommandArgumentContext$Builtins : net/mamoe/mirai/console/command/descriptor/CommandArgumentContext {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext$Builtins;\n\tpublic fun get (Lkotlin/reflect/KClass;)Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;\n\tpublic fun toList ()Ljava/util/List;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/CommandArgumentContext$Companion {\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/CommandArgumentContext$ParserPair {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext$ParserPair$Companion;\n\tpublic fun <init> (Lkotlin/reflect/KClass;Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;)V\n\tpublic final fun component1 ()Lkotlin/reflect/KClass;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;\n\tpublic final fun copy (Lkotlin/reflect/KClass;Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;)Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext$ParserPair;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext$ParserPair;Lkotlin/reflect/KClass;Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;ILjava/lang/Object;)Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext$ParserPair;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getKlass ()Lkotlin/reflect/KClass;\n\tpublic final fun getParser ()Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;\n\tpublic fun hashCode ()I\n\tpublic static final fun toPair (Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext$ParserPair;)Lkotlin/Pair;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/CommandArgumentContext$ParserPair$Companion {\n\tpublic final fun toPair (Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext$ParserPair;)Lkotlin/Pair;\n}\n\npublic abstract interface class net/mamoe/mirai/console/command/descriptor/CommandArgumentContextAware {\n\tpublic abstract fun getContext ()Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/CommandArgumentContextBuilder : java/util/List, kotlin/jvm/internal/markers/KMutableList {\n\tpublic fun <init> ()V\n\tpublic synthetic fun add (ILjava/lang/Object;)V\n\tpublic fun add (ILnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext$ParserPair;)V\n\tpublic final fun add (Ljava/lang/Class;Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;)Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContextBuilder;\n\tpublic synthetic fun add (Ljava/lang/Object;)Z\n\tpublic final fun add (Lkotlin/reflect/KClass;Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;)Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContextBuilder;\n\tpublic fun add (Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext$ParserPair;)Z\n\tpublic fun addAll (ILjava/util/Collection;)Z\n\tpublic fun addAll (Ljava/util/Collection;)Z\n\tpublic final fun build ()Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext;\n\tpublic fun clear ()V\n\tpublic final fun contains (Ljava/lang/Object;)Z\n\tpublic fun contains (Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext$ParserPair;)Z\n\tpublic fun containsAll (Ljava/util/Collection;)Z\n\tpublic synthetic fun get (I)Ljava/lang/Object;\n\tpublic fun get (I)Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext$ParserPair;\n\tpublic fun getSize ()I\n\tpublic final fun indexOf (Ljava/lang/Object;)I\n\tpublic fun indexOf (Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext$ParserPair;)I\n\tpublic fun isEmpty ()Z\n\tpublic fun iterator ()Ljava/util/Iterator;\n\tpublic final fun lastIndexOf (Ljava/lang/Object;)I\n\tpublic fun lastIndexOf (Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext$ParserPair;)I\n\tpublic fun listIterator ()Ljava/util/ListIterator;\n\tpublic fun listIterator (I)Ljava/util/ListIterator;\n\tpublic synthetic fun remove (I)Ljava/lang/Object;\n\tpublic final fun remove (I)Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext$ParserPair;\n\tpublic final fun remove (Ljava/lang/Object;)Z\n\tpublic fun remove (Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext$ParserPair;)Z\n\tpublic fun removeAll (Ljava/util/Collection;)Z\n\tpublic fun removeAt (I)Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext$ParserPair;\n\tpublic fun retainAll (Ljava/util/Collection;)Z\n\tpublic synthetic fun set (ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun set (ILnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext$ParserPair;)Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext$ParserPair;\n\tpublic final fun size ()I\n\tpublic fun subList (II)Ljava/util/List;\n\tpublic fun toArray ()[Ljava/lang/Object;\n\tpublic fun toArray ([Ljava/lang/Object;)[Ljava/lang/Object;\n\tpublic final synthetic fun with (Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function2;)Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContextBuilder;\n\tpublic final synthetic fun with (Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function3;)Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContextBuilder;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/CommandArgumentContextKt {\n\tpublic static final synthetic fun buildCommandArgumentContext (Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext;\n\tpublic static final fun plus (Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext;Ljava/util/List;)Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext;\n\tpublic static final fun plus (Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext;Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext;)Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/CommandArgumentParserException : net/mamoe/mirai/console/command/IllegalCommandArgumentException {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n}\n\npublic class net/mamoe/mirai/console/command/descriptor/CommandDeclarationException : java/lang/RuntimeException {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun <init> (Ljava/lang/Throwable;)V\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/CommandReceiverParameter$Companion {\n}\n\npublic class net/mamoe/mirai/console/command/descriptor/CommandResolutionException : java/lang/RuntimeException {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun <init> (Ljava/lang/Throwable;)V\n}\n\npublic abstract interface class net/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser$Companion;\n\tpublic static fun map (Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;Lkotlin/jvm/functions/Function2;)Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;\n\tpublic abstract fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic static fun parse (Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;Lnet/mamoe/mirai/message/data/Message;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Lnet/mamoe/mirai/message/data/MessageContent;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser$Companion {\n\tpublic final fun map (Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;Lkotlin/jvm/functions/Function2;)Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;\n\tpublic final fun parse (Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;Lnet/mamoe/mirai/message/data/Message;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/DoubleValueArgumentParser {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/DoubleValueArgumentParser;\n\tpublic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Double;\n\tpublic synthetic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/EmptyCommandArgumentContext : net/mamoe/mirai/console/command/descriptor/CommandArgumentContext {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/EmptyCommandArgumentContext;\n\tpublic fun get (Lkotlin/reflect/KClass;)Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;\n\tpublic fun toList ()Ljava/util/List;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/EnumValueArgumentParser {\n\tpublic fun <init> (Ljava/lang/Class;)V\n\tpublic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Enum;\n\tpublic synthetic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/ExistingBotValueArgumentParser {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/ExistingBotValueArgumentParser;\n\tpublic synthetic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/Bot;\n\tpublic synthetic fun parse (Lnet/mamoe/mirai/message/data/MessageContent;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Lnet/mamoe/mirai/message/data/MessageContent;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/Bot;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/ExistingContactValueArgumentParser {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/ExistingContactValueArgumentParser;\n\tpublic synthetic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/contact/Contact;\n\tpublic synthetic fun parse (Lnet/mamoe/mirai/message/data/MessageContent;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Lnet/mamoe/mirai/message/data/MessageContent;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/contact/Contact;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/ExistingFriendValueArgumentParser {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/ExistingFriendValueArgumentParser;\n\tpublic synthetic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/contact/Friend;\n\tpublic synthetic fun parse (Lnet/mamoe/mirai/message/data/MessageContent;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Lnet/mamoe/mirai/message/data/MessageContent;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/contact/Friend;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/ExistingGroupValueArgumentParser {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/ExistingGroupValueArgumentParser;\n\tpublic synthetic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/contact/Group;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/ExistingMemberValueArgumentParser {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/ExistingMemberValueArgumentParser;\n\tpublic synthetic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/contact/Member;\n\tpublic synthetic fun parse (Lnet/mamoe/mirai/message/data/MessageContent;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Lnet/mamoe/mirai/message/data/MessageContent;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/contact/Member;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/ExistingUserValueArgumentParser {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/ExistingUserValueArgumentParser;\n\tpublic synthetic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/contact/User;\n\tpublic synthetic fun parse (Lnet/mamoe/mirai/message/data/MessageContent;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Lnet/mamoe/mirai/message/data/MessageContent;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/contact/User;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/FloatValueArgumentParser {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/FloatValueArgumentParser;\n\tpublic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Float;\n\tpublic synthetic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/ImageValueArgumentParser {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/ImageValueArgumentParser;\n\tpublic synthetic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic synthetic fun parse (Lnet/mamoe/mirai/message/data/MessageContent;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Lnet/mamoe/mirai/message/data/MessageContent;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/message/data/Image;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/IntValueArgumentParser {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/IntValueArgumentParser;\n\tpublic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Integer;\n\tpublic synthetic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/LongValueArgumentParser {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/LongValueArgumentParser;\n\tpublic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Long;\n\tpublic synthetic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/MappingCommandValueArgumentParser : net/mamoe/mirai/console/command/descriptor/AbstractCommandValueArgumentParser {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;Lkotlin/jvm/functions/Function2;)V\n\tpublic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Lnet/mamoe/mirai/message/data/MessageContent;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/PermissionIdValueArgumentParser {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/PermissionIdValueArgumentParser;\n\tpublic synthetic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/console/permission/PermissionId;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/PermitteeIdValueArgumentParser {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/PermitteeIdValueArgumentParser;\n\tpublic synthetic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/console/permission/PermitteeId;\n\tpublic synthetic fun parse (Lnet/mamoe/mirai/message/data/MessageContent;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Lnet/mamoe/mirai/message/data/MessageContent;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/console/permission/PermitteeId;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/PlainTextValueArgumentParser {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/PlainTextValueArgumentParser;\n\tpublic synthetic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/message/data/PlainText;\n\tpublic synthetic fun parse (Lnet/mamoe/mirai/message/data/MessageContent;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Lnet/mamoe/mirai/message/data/MessageContent;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/message/data/PlainText;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/RawContentValueArgumentParser : net/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/RawContentValueArgumentParser;\n\tpublic synthetic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/message/data/MessageContent;\n\tpublic synthetic fun parse (Lnet/mamoe/mirai/message/data/MessageContent;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Lnet/mamoe/mirai/message/data/MessageContent;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/message/data/MessageContent;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/ShortValueArgumentParser {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/ShortValueArgumentParser;\n\tpublic synthetic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Short;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/SimpleCommandArgumentContext : net/mamoe/mirai/console/command/descriptor/CommandArgumentContext {\n\tpublic fun <init> (Ljava/util/List;)V\n\tpublic fun get (Lkotlin/reflect/KClass;)Lnet/mamoe/mirai/console/command/descriptor/CommandValueArgumentParser;\n\tpublic final fun getList ()Ljava/util/List;\n\tpublic fun toList ()Ljava/util/List;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/StringValueArgumentParser {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/command/descriptor/StringValueArgumentParser;\n\tpublic synthetic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/Object;\n\tpublic fun parse (Ljava/lang/String;Lnet/mamoe/mirai/console/command/CommandSender;)Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/command/descriptor/TypeVariant$Companion {\n}\n\npublic abstract class net/mamoe/mirai/console/command/java/JCompositeCommand : net/mamoe/mirai/console/command/CompositeCommand {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/CommandOwner;Ljava/lang/String;[Ljava/lang/String;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/CommandOwner;Ljava/lang/String;[Ljava/lang/String;Lnet/mamoe/mirai/console/permission/Permission;)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/console/command/CommandOwner;Ljava/lang/String;[Ljava/lang/String;Lnet/mamoe/mirai/console/permission/Permission;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tprotected final fun addArgumentContext (Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext;)V\n\tpublic final fun getContext ()Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext;\n\tpublic final fun getDescription ()Ljava/lang/String;\n\tpublic final fun getPermission ()Lnet/mamoe/mirai/console/permission/Permission;\n\tpublic final fun getPrefixOptional ()Z\n\tprotected final fun setDescription (Ljava/lang/String;)V\n\tprotected final fun setPermission (Lnet/mamoe/mirai/console/permission/Permission;)V\n\tprotected final fun setPrefixOptional (Z)V\n}\n\npublic abstract class net/mamoe/mirai/console/command/java/JRawCommand : net/mamoe/mirai/console/command/Command {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/CommandOwner;Ljava/lang/String;[Ljava/lang/String;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/CommandOwner;Ljava/lang/String;[Ljava/lang/String;Lnet/mamoe/mirai/console/permission/Permission;)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/console/command/CommandOwner;Ljava/lang/String;[Ljava/lang/String;Lnet/mamoe/mirai/console/permission/Permission;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun getDescription ()Ljava/lang/String;\n\tpublic fun getOverloads ()Ljava/util/List;\n\tpublic fun getOwner ()Lnet/mamoe/mirai/console/command/CommandOwner;\n\tpublic final fun getPermission ()Lnet/mamoe/mirai/console/permission/Permission;\n\tpublic final fun getPrefixOptional ()Z\n\tpublic fun getPrimaryName ()Ljava/lang/String;\n\tpublic fun getSecondaryNames ()[Ljava/lang/String;\n\tpublic fun getUsage ()Ljava/lang/String;\n\tpublic fun onCommand (Lnet/mamoe/mirai/console/command/CommandContext;Lnet/mamoe/mirai/message/data/MessageChain;)V\n\tpublic fun onCommand (Lnet/mamoe/mirai/console/command/CommandSender;Lnet/mamoe/mirai/message/data/MessageChain;)V\n\tprotected final fun setDescription (Ljava/lang/String;)V\n\tprotected final fun setPermission (Lnet/mamoe/mirai/console/permission/Permission;)V\n\tprotected final fun setPrefixOptional (Z)V\n\tprotected fun setUsage (Ljava/lang/String;)V\n}\n\npublic abstract class net/mamoe/mirai/console/command/java/JSimpleCommand : net/mamoe/mirai/console/command/SimpleCommand {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/CommandOwner;Ljava/lang/String;[Ljava/lang/String;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/console/command/CommandOwner;Ljava/lang/String;[Ljava/lang/String;Lnet/mamoe/mirai/console/permission/Permission;)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/console/command/CommandOwner;Ljava/lang/String;[Ljava/lang/String;Lnet/mamoe/mirai/console/permission/Permission;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tprotected final fun addArgumentContext (Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext;)V\n\tpublic fun getContext ()Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext;\n\tpublic fun getDescription ()Ljava/lang/String;\n\tpublic fun getPermission ()Lnet/mamoe/mirai/console/permission/Permission;\n\tpublic fun getPrefixOptional ()Z\n\tprotected fun setContext (Lnet/mamoe/mirai/console/command/descriptor/CommandArgumentContext;)V\n\tprotected fun setDescription (Ljava/lang/String;)V\n\tprotected fun setPermission (Lnet/mamoe/mirai/console/permission/Permission;)V\n\tprotected fun setPrefixOptional (Z)V\n}\n\npublic final class net/mamoe/mirai/console/command/parse/CommandCallParser$Companion {\n\tpublic final fun parseCommandCall (Lnet/mamoe/mirai/message/data/MessageChain;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/console/command/parse/CommandCall;\n}\n\npublic final class net/mamoe/mirai/console/command/parse/CommandValueArgumentKt {\n}\n\npublic final class net/mamoe/mirai/console/command/resolve/CommandCallInterceptor$Companion {\n\tpublic final fun intercepted (Lnet/mamoe/mirai/console/command/parse/CommandCall;)Lnet/mamoe/mirai/console/command/resolve/InterceptResult;\n\tpublic final fun intercepted (Lnet/mamoe/mirai/console/command/resolve/ResolvedCommandCall;)Lnet/mamoe/mirai/console/command/resolve/InterceptResult;\n\tpublic final fun intercepted (Lnet/mamoe/mirai/message/data/Message;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/console/command/resolve/InterceptResult;\n}\n\npublic final class net/mamoe/mirai/console/command/resolve/CommandCallInterceptorKt {\n}\n\npublic final class net/mamoe/mirai/console/command/resolve/CommandCallResolver$Companion {\n}\n\npublic final class net/mamoe/mirai/console/command/resolve/CommandCallResolverKt {\n}\n\npublic final class net/mamoe/mirai/console/command/resolve/InterceptedReason$Companion {\n\tpublic final fun create (Ljava/lang/String;)Lnet/mamoe/mirai/console/command/resolve/InterceptedReason;\n}\n\npublic final class net/mamoe/mirai/console/command/resolve/ResolvedCommandCall$Companion {\n}\n\npublic final class net/mamoe/mirai/console/command/resolve/ResolvedCommandCallKt {\n}\n\npublic abstract class net/mamoe/mirai/console/data/AbstractPluginData : net/mamoe/mirai/console/data/PluginData {\n\tpublic fun <init> ()V\n\tpublic abstract fun getSaveName ()Ljava/lang/String;\n\tpublic fun getSerializersModule ()Lkotlinx/serialization/modules/SerializersModule;\n\tpublic final fun getUpdaterSerializer ()Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun getUpdaterSerializer$mirai_console ()Lkotlinx/serialization/KSerializer;\n\tpublic final fun getValueNodes ()Ljava/util/List;\n\tpublic final fun provideDelegate (Lnet/mamoe/mirai/console/data/SerializerAwareValue;Ljava/lang/Object;Lkotlin/reflect/KProperty;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n}\n\npublic final class net/mamoe/mirai/console/data/AbstractPluginDataKt {\n}\n\npublic class net/mamoe/mirai/console/data/AutoSavePluginConfig : net/mamoe/mirai/console/data/AutoSavePluginData, net/mamoe/mirai/console/data/PluginConfig {\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic class net/mamoe/mirai/console/data/AutoSavePluginData : net/mamoe/mirai/console/data/AbstractPluginData {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun getSaveName ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/console/data/ListValue : net/mamoe/mirai/console/data/CompositeValue {\n}\n\npublic final class net/mamoe/mirai/console/data/MemoryPluginDataStorage$Companion {\n\tpublic final fun create ()Lnet/mamoe/mirai/console/data/MemoryPluginDataStorage;\n}\n\npublic final class net/mamoe/mirai/console/data/MultiFilePluginDataStorage$Companion {\n\tpublic final fun create (Ljava/nio/file/Path;)Lnet/mamoe/mirai/console/data/MultiFilePluginDataStorage;\n}\n\npublic abstract interface class net/mamoe/mirai/console/data/PluginConfig : net/mamoe/mirai/console/data/PluginData {\n}\n\npublic abstract interface class net/mamoe/mirai/console/data/PluginData {\n\tpublic abstract fun getSaveName ()Ljava/lang/String;\n\tpublic fun getSaveType ()Lnet/mamoe/mirai/console/data/PluginData$SaveType;\n\tpublic abstract fun getSerializersModule ()Lkotlinx/serialization/modules/SerializersModule;\n\tpublic abstract fun getUpdaterSerializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/console/data/PluginDataExtensions {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/data/PluginDataExtensions;\n\tpublic static final fun mapKeys (Lnet/mamoe/mirai/console/data/SerializerAwareValue;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun mapKeysImmutable (Lnet/mamoe/mirai/console/data/SerializerAwareValue;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun mapKeysImmutableNotNull (Lnet/mamoe/mirai/console/data/SerializerAwareValue;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun mapKeysNotNull (Lnet/mamoe/mirai/console/data/SerializerAwareValue;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun withDefaultMap (Lnet/mamoe/mirai/console/data/SerializerAwareValue;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun withDefaultMapImmutable (Lnet/mamoe/mirai/console/data/SerializerAwareValue;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun withDefaultMapImmutableNotNull (Lnet/mamoe/mirai/console/data/SerializerAwareValue;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun withDefaultMapNotNull (Lnet/mamoe/mirai/console/data/SerializerAwareValue;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun withEmptyDefaultList (Lnet/mamoe/mirai/console/data/SerializerAwareValue;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun withEmptyDefaultListImmutable (Lnet/mamoe/mirai/console/data/SerializerAwareValue;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun withEmptyDefaultMap (Lnet/mamoe/mirai/console/data/SerializerAwareValue;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun withEmptyDefaultMapImmutable (Lnet/mamoe/mirai/console/data/SerializerAwareValue;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun withEmptyDefaultSet (Lnet/mamoe/mirai/console/data/SerializerAwareValue;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun withEmptyDefaultSetImmutable (Lnet/mamoe/mirai/console/data/SerializerAwareValue;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n}\n\npublic final class net/mamoe/mirai/console/data/PluginDataExtensions$NotNullMutableMap : net/mamoe/mirai/console/data/PluginDataExtensions$NotNullMap, java/util/Map, kotlin/jvm/internal/markers/KMutableMap {\n\tpublic fun clear ()V\n\tpublic fun containsKey (Ljava/lang/Object;)Z\n\tpublic fun containsValue (Ljava/lang/Object;)Z\n\tpublic fun get (Ljava/lang/Object;)Ljava/lang/Object;\n\tpublic fun getEntries ()Ljava/util/Set;\n\tpublic fun getKeys ()Ljava/util/Set;\n\tpublic fun getOrDefault (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\n\tpublic fun getSize ()I\n\tpublic fun getValues ()Ljava/util/Collection;\n\tpublic fun isEmpty ()Z\n\tpublic fun put (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\n\tpublic fun putAll (Ljava/util/Map;)V\n\tpublic synthetic fun putIfAbsent (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\n\tpublic fun putIfAbsent (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Void;\n\tpublic fun remove (Ljava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/console/data/PluginDataKt {\n\tpublic static final fun value (Lnet/mamoe/mirai/console/data/PluginData;B)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun value (Lnet/mamoe/mirai/console/data/PluginData;C)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun value (Lnet/mamoe/mirai/console/data/PluginData;D)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun value (Lnet/mamoe/mirai/console/data/PluginData;F)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun value (Lnet/mamoe/mirai/console/data/PluginData;I)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun value (Lnet/mamoe/mirai/console/data/PluginData;J)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun value (Lnet/mamoe/mirai/console/data/PluginData;Ljava/lang/String;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun value (Lnet/mamoe/mirai/console/data/PluginData;S)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun value (Lnet/mamoe/mirai/console/data/PluginData;Z)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static final fun valueImpl (Lnet/mamoe/mirai/console/data/PluginData;Lkotlin/reflect/KType;Lkotlin/reflect/KClass;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n}\n\npublic final class net/mamoe/mirai/console/data/PluginDataStorageKt {\n\tpublic static final synthetic fun getDirectory (Lnet/mamoe/mirai/console/data/MultiFilePluginDataStorage;)Ljava/io/File;\n}\n\npublic class net/mamoe/mirai/console/data/ReadOnlyPluginConfig : net/mamoe/mirai/console/data/ReadOnlyPluginData, net/mamoe/mirai/console/data/PluginConfig {\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic class net/mamoe/mirai/console/data/ReadOnlyPluginData : net/mamoe/mirai/console/data/AbstractPluginData {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun getSaveName ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/data/SerializableValue : net/mamoe/mirai/console/data/SerializerAwareValue, net/mamoe/mirai/console/data/Value {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/data/SerializableValue$Companion;\n\tpublic fun <init> (Lnet/mamoe/mirai/console/data/Value;Lkotlinx/serialization/KSerializer;)V\n\tpublic static final fun create (Lnet/mamoe/mirai/console/data/Value;Lkotlinx/serialization/KSerializer;)Lnet/mamoe/mirai/console/data/SerializableValue;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun get ()Ljava/lang/Object;\n\tpublic fun getSerializer ()Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun getValue (Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object;\n\tpublic fun hashCode ()I\n\tpublic fun set (Ljava/lang/Object;)V\n\tpublic synthetic fun setValue (Ljava/lang/Object;Lkotlin/reflect/KProperty;Ljava/lang/Object;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/data/SerializableValue$Companion {\n\tpublic final fun create (Lnet/mamoe/mirai/console/data/Value;Lkotlinx/serialization/KSerializer;)Lnet/mamoe/mirai/console/data/SerializableValue;\n}\n\npublic abstract interface class net/mamoe/mirai/console/data/SerializerAwareValue : net/mamoe/mirai/console/data/Value {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/data/SerializerAwareValue$Companion;\n\tpublic static fun deserialize (Lnet/mamoe/mirai/console/data/SerializerAwareValue;Lkotlinx/serialization/BinaryFormat;[B)V\n\tpublic static fun deserialize (Lnet/mamoe/mirai/console/data/SerializerAwareValue;Lkotlinx/serialization/StringFormat;Ljava/lang/String;)V\n\tpublic abstract fun getSerializer ()Lkotlinx/serialization/KSerializer;\n\tpublic static fun serialize (Lnet/mamoe/mirai/console/data/SerializerAwareValue;Lkotlinx/serialization/BinaryFormat;)[B\n\tpublic static fun serialize (Lnet/mamoe/mirai/console/data/SerializerAwareValue;Lkotlinx/serialization/StringFormat;)Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/data/SerializerAwareValue$Companion {\n\tpublic final fun deserialize (Lnet/mamoe/mirai/console/data/SerializerAwareValue;Lkotlinx/serialization/BinaryFormat;[B)V\n\tpublic final fun deserialize (Lnet/mamoe/mirai/console/data/SerializerAwareValue;Lkotlinx/serialization/StringFormat;Ljava/lang/String;)V\n\tpublic final fun serialize (Lnet/mamoe/mirai/console/data/SerializerAwareValue;Lkotlinx/serialization/BinaryFormat;)[B\n\tpublic final fun serialize (Lnet/mamoe/mirai/console/data/SerializerAwareValue;Lkotlinx/serialization/StringFormat;)Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/console/data/Value : kotlin/properties/ReadWriteProperty {\n\tpublic abstract fun get ()Ljava/lang/Object;\n\tpublic synthetic fun getValue (Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object;\n\tpublic abstract fun set (Ljava/lang/Object;)V\n\tpublic synthetic fun setValue (Ljava/lang/Object;Lkotlin/reflect/KProperty;Ljava/lang/Object;)V\n}\n\npublic abstract interface annotation class net/mamoe/mirai/console/data/ValueDescription : java/lang/annotation/Annotation {\n\tpublic abstract fun value ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/data/ValueDescription$Impl : net/mamoe/mirai/console/data/ValueDescription {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final synthetic fun value ()Ljava/lang/String;\n}\n\npublic abstract interface annotation class net/mamoe/mirai/console/data/ValueName : java/lang/annotation/Annotation {\n\tpublic abstract fun value ()Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/console/data/java/JAutoSavePluginConfig : net/mamoe/mirai/console/data/AutoSavePluginConfig, net/mamoe/mirai/console/data/PluginConfig {\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic abstract class net/mamoe/mirai/console/data/java/JAutoSavePluginData : net/mamoe/mirai/console/data/AutoSavePluginData, net/mamoe/mirai/console/data/PluginConfig {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/data/java/JAutoSavePluginData$Companion;\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic static final fun createKType (Ljava/lang/Class;Z[Lkotlin/reflect/KType;)Lkotlin/reflect/KType;\n\tpublic static final fun createKType (Ljava/lang/Class;[Lkotlin/reflect/KType;)Lkotlin/reflect/KType;\n\tpublic final fun typedValue (Lkotlin/reflect/KType;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic final fun typedValue (Lkotlin/reflect/KType;Ljava/lang/Object;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static synthetic fun typedValue$default (Lnet/mamoe/mirai/console/data/java/JAutoSavePluginData;Lkotlin/reflect/KType;Ljava/lang/Object;ILjava/lang/Object;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic final fun value (B)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic final fun value (C)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic final fun value (D)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic final fun value (F)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic final fun value (I)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic final fun value (J)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic final fun value (Ljava/lang/String;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic final fun value (S)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic final fun value (Z)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n}\n\npublic final class net/mamoe/mirai/console/data/java/JAutoSavePluginData$Companion {\n\tpublic final fun createKType (Ljava/lang/Class;Z[Lkotlin/reflect/KType;)Lkotlin/reflect/KType;\n\tpublic final fun createKType (Ljava/lang/Class;[Lkotlin/reflect/KType;)Lkotlin/reflect/KType;\n}\n\npublic abstract class net/mamoe/mirai/console/data/java/JavaAutoSavePluginConfig : net/mamoe/mirai/console/data/java/JavaAutoSavePluginData, net/mamoe/mirai/console/data/PluginConfig {\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic abstract class net/mamoe/mirai/console/data/java/JavaAutoSavePluginData : net/mamoe/mirai/console/data/AutoSavePluginData, net/mamoe/mirai/console/data/PluginConfig {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/data/java/JavaAutoSavePluginData$Companion;\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic static final fun createKType (Ljava/lang/Class;Z[Lkotlin/reflect/KType;)Lkotlin/reflect/KType;\n\tpublic static final fun createKType (Ljava/lang/Class;[Lkotlin/reflect/KType;)Lkotlin/reflect/KType;\n\tpublic final fun typedValue (Ljava/lang/String;Lkotlin/reflect/KType;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic final fun typedValue (Ljava/lang/String;Lkotlin/reflect/KType;Ljava/lang/Object;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic static synthetic fun typedValue$default (Lnet/mamoe/mirai/console/data/java/JavaAutoSavePluginData;Ljava/lang/String;Lkotlin/reflect/KType;Ljava/lang/Object;ILjava/lang/Object;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic final fun value (Ljava/lang/String;B)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic final fun value (Ljava/lang/String;C)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic final fun value (Ljava/lang/String;D)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic final fun value (Ljava/lang/String;F)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic final fun value (Ljava/lang/String;I)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic final fun value (Ljava/lang/String;J)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic final fun value (Ljava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic final fun value (Ljava/lang/String;S)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n\tpublic final fun value (Ljava/lang/String;Z)Lnet/mamoe/mirai/console/data/SerializerAwareValue;\n}\n\npublic final class net/mamoe/mirai/console/data/java/JavaAutoSavePluginData$Companion {\n\tpublic final fun createKType (Ljava/lang/Class;Z[Lkotlin/reflect/KType;)Lkotlin/reflect/KType;\n\tpublic final fun createKType (Ljava/lang/Class;[Lkotlin/reflect/KType;)Lkotlin/reflect/KType;\n}\n\npublic final class net/mamoe/mirai/console/enduserreadme/EndUserReadme {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/enduserreadme/EndUserReadme$Companion;\n\tpublic static final field DELAY Ljava/lang/String;\n\tpublic static final field PAUSE Ljava/lang/String;\n\tpublic fun <init> ()V\n\tpublic final fun put (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V\n\tpublic final fun putAll (Ljava/lang/String;)V\n}\n\npublic final class net/mamoe/mirai/console/enduserreadme/EndUserReadme$Companion {\n}\n\npublic final class net/mamoe/mirai/console/enduserreadme/EndUserReadme$Render {\n\tpublic fun <init> ()V\n\tpublic final fun delay ()V\n\tpublic final fun delay (I)V\n\tpublic final fun msg (Ljava/lang/String;)V\n\tpublic final fun pause ()V\n\tpublic final fun plusAssign (Ljava/lang/String;)V\n\tpublic final fun render ()Ljava/lang/String;\n\tpublic final fun unaryPlus (Ljava/lang/String;)V\n}\n\npublic abstract class net/mamoe/mirai/console/events/AutoLoginEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/console/events/ConsoleEvent, net/mamoe/mirai/event/events/BotEvent {\n}\n\npublic final class net/mamoe/mirai/console/events/AutoLoginEvent$Failure : net/mamoe/mirai/console/events/AutoLoginEvent {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getCause ()Ljava/lang/Throwable;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/events/AutoLoginEvent$Success : net/mamoe/mirai/console/events/AutoLoginEvent {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/console/events/ConsoleEvent : net/mamoe/mirai/event/Event {\n}\n\npublic final class net/mamoe/mirai/console/events/EndUserReadmeInitializeEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/console/events/ConsoleEvent {\n\tpublic final fun getReadme ()Lnet/mamoe/mirai/console/enduserreadme/EndUserReadme;\n}\n\npublic final class net/mamoe/mirai/console/events/StartupEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/console/events/ConsoleEvent {\n\tpublic final fun getTimestamp ()J\n}\n\npublic abstract class net/mamoe/mirai/console/extension/AbstractExtensionPoint : net/mamoe/mirai/console/extension/ExtensionPoint {\n\tpublic fun <init> (Lkotlin/reflect/KClass;)V\n\tpublic fun getExtensionType ()Lkotlin/reflect/KClass;\n}\n\npublic abstract class net/mamoe/mirai/console/extension/AbstractInstanceExtensionPoint : net/mamoe/mirai/console/extension/AbstractExtensionPoint {\n}\n\npublic abstract class net/mamoe/mirai/console/extension/AbstractSingletonExtensionPoint : net/mamoe/mirai/console/extension/AbstractExtensionPoint, net/mamoe/mirai/console/extension/SingletonExtensionPoint {\n\tpublic final fun getBuiltinImplementation ()Lkotlin/jvm/functions/Function0;\n\tpublic fun getSelectedInstance ()Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/console/extension/ComponentStorage {\n\tpublic abstract fun contribute (Lnet/mamoe/mirai/console/extension/ExtensionPoint;Lnet/mamoe/mirai/console/plugin/Plugin;Lkotlin/jvm/functions/Function0;)V\n\tpublic abstract fun contribute (Lnet/mamoe/mirai/console/extension/ExtensionPoint;Lnet/mamoe/mirai/console/plugin/Plugin;Lnet/mamoe/mirai/console/extension/Extension;)V\n\tpublic abstract fun getExtensions (Lnet/mamoe/mirai/console/extension/ExtensionPoint;)Lkotlin/sequences/Sequence;\n\tpublic abstract fun getExtensionsStream (Lnet/mamoe/mirai/console/extension/ExtensionPoint;)Ljava/util/stream/Stream;\n}\n\npublic abstract interface class net/mamoe/mirai/console/extension/Extension {\n\tpublic fun getPriority ()I\n}\n\npublic class net/mamoe/mirai/console/extension/ExtensionException : java/lang/RuntimeException {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun <init> (Ljava/lang/Throwable;)V\n}\n\npublic abstract interface class net/mamoe/mirai/console/extension/ExtensionPoint {\n\tpublic abstract fun getExtensionType ()Lkotlin/reflect/KClass;\n}\n\npublic abstract interface class net/mamoe/mirai/console/extension/ExtensionRegistry {\n\tpublic abstract fun getExtension ()Lnet/mamoe/mirai/console/extension/Extension;\n\tpublic abstract fun getPlugin ()Lnet/mamoe/mirai/console/plugin/Plugin;\n}\n\npublic abstract interface class net/mamoe/mirai/console/extension/FunctionExtension : net/mamoe/mirai/console/extension/Extension {\n}\n\npublic abstract interface class net/mamoe/mirai/console/extension/FunctionExtensionPoint : net/mamoe/mirai/console/extension/ExtensionPoint {\n}\n\npublic abstract interface class net/mamoe/mirai/console/extension/InstanceExtension : net/mamoe/mirai/console/extension/Extension {\n\tpublic abstract fun getInstance ()Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/console/extension/InstanceExtensionPoint : net/mamoe/mirai/console/extension/ExtensionPoint {\n}\n\npublic final class net/mamoe/mirai/console/extension/PluginComponentStorage {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/plugin/Plugin;)V\n\tpublic final fun contribute (Lnet/mamoe/mirai/console/extension/ExtensionPoint;Lkotlin/jvm/functions/Function0;)V\n\tpublic final fun contributeBotConfigurationAlterer (Lnet/mamoe/mirai/console/extensions/BotConfigurationAlterer;)V\n\tpublic final fun contributePermissionServiceProvider (Lkotlin/jvm/functions/Function0;)V\n\tpublic final fun contributePluginLoaderProvider (Lkotlin/jvm/functions/Function0;)V\n\tpublic final fun contributePostStartupExtension (Lnet/mamoe/mirai/console/extensions/PostStartupExtension;)V\n\tpublic final synthetic fun contributeSingletonExtensionSelector (Lkotlin/jvm/functions/Function0;)V\n\tpublic final fun runAfterStartup (Lkotlin/jvm/functions/Function0;)V\n}\n\npublic abstract interface class net/mamoe/mirai/console/extension/SingletonExtension : net/mamoe/mirai/console/extension/Extension {\n\tpublic abstract fun getInstance ()Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/console/extension/SingletonExtensionPoint : net/mamoe/mirai/console/extension/ExtensionPoint {\n}\n\npublic abstract interface class net/mamoe/mirai/console/extensions/BotConfigurationAlterer : net/mamoe/mirai/console/extension/FunctionExtension {\n\tpublic static final field ExtensionPoint Lnet/mamoe/mirai/console/extensions/BotConfigurationAlterer$ExtensionPoint;\n\tpublic abstract fun alterConfiguration (JLnet/mamoe/mirai/utils/BotConfiguration;)Lnet/mamoe/mirai/utils/BotConfiguration;\n}\n\npublic final class net/mamoe/mirai/console/extensions/BotConfigurationAlterer$ExtensionPoint : net/mamoe/mirai/console/extension/AbstractExtensionPoint {\n}\n\npublic abstract interface class net/mamoe/mirai/console/extensions/PermissionServiceProvider : net/mamoe/mirai/console/extension/InstanceExtension {\n\tpublic static final field ExtensionPoint Lnet/mamoe/mirai/console/extensions/PermissionServiceProvider$ExtensionPoint;\n}\n\npublic final class net/mamoe/mirai/console/extensions/PermissionServiceProvider$ExtensionPoint : net/mamoe/mirai/console/extension/AbstractInstanceExtensionPoint {\n}\n\npublic final class net/mamoe/mirai/console/extensions/PermissionServiceProviderImpl : net/mamoe/mirai/console/extensions/PermissionServiceProvider {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/permission/PermissionService;)V\n\tpublic synthetic fun getInstance ()Ljava/lang/Object;\n\tpublic fun getInstance ()Lnet/mamoe/mirai/console/permission/PermissionService;\n}\n\npublic final class net/mamoe/mirai/console/extensions/PermissionServiceProviderImplLazy : net/mamoe/mirai/console/extensions/PermissionServiceProvider {\n\tpublic fun <init> (Lkotlin/jvm/functions/Function0;)V\n\tpublic synthetic fun getInstance ()Ljava/lang/Object;\n\tpublic fun getInstance ()Lnet/mamoe/mirai/console/permission/PermissionService;\n}\n\npublic abstract interface class net/mamoe/mirai/console/extensions/PluginLoaderProvider : net/mamoe/mirai/console/extension/InstanceExtension {\n\tpublic static final field ExtensionPoint Lnet/mamoe/mirai/console/extensions/PluginLoaderProvider$ExtensionPoint;\n}\n\npublic final class net/mamoe/mirai/console/extensions/PluginLoaderProvider$ExtensionPoint : net/mamoe/mirai/console/extension/AbstractExtensionPoint {\n}\n\npublic final class net/mamoe/mirai/console/extensions/PluginLoaderProviderImpl : net/mamoe/mirai/console/extensions/PluginLoaderProvider {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/plugin/loader/PluginLoader;)V\n\tpublic synthetic fun getInstance ()Ljava/lang/Object;\n\tpublic fun getInstance ()Lnet/mamoe/mirai/console/plugin/loader/PluginLoader;\n}\n\npublic final class net/mamoe/mirai/console/extensions/PluginLoaderProviderImplLazy : net/mamoe/mirai/console/extensions/PluginLoaderProvider {\n\tpublic fun <init> (Lkotlin/jvm/functions/Function0;)V\n\tpublic synthetic fun getInstance ()Ljava/lang/Object;\n\tpublic fun getInstance ()Lnet/mamoe/mirai/console/plugin/loader/PluginLoader;\n}\n\npublic abstract interface class net/mamoe/mirai/console/extensions/PostStartupExtension : net/mamoe/mirai/console/extension/FunctionExtension {\n\tpublic static final field ExtensionPoint Lnet/mamoe/mirai/console/extensions/PostStartupExtension$ExtensionPoint;\n\tpublic abstract fun invoke ()V\n}\n\npublic final class net/mamoe/mirai/console/extensions/PostStartupExtension$ExtensionPoint : net/mamoe/mirai/console/extension/AbstractExtensionPoint {\n}\n\npublic abstract interface class net/mamoe/mirai/console/extensions/SingletonExtensionSelector : net/mamoe/mirai/console/extension/FunctionExtension {\n\tpublic static final field ExtensionPoint Lnet/mamoe/mirai/console/extensions/SingletonExtensionSelector$ExtensionPoint;\n\tpublic abstract fun selectSingleton (Lkotlin/reflect/KClass;Ljava/util/Collection;)Lnet/mamoe/mirai/console/extension/Extension;\n}\n\npublic final class net/mamoe/mirai/console/extensions/SingletonExtensionSelector$ExtensionPoint : net/mamoe/mirai/console/extension/AbstractExtensionPoint {\n}\n\npublic final class net/mamoe/mirai/console/extensions/SingletonExtensionSelector$Registry {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/plugin/Plugin;Lnet/mamoe/mirai/console/extension/Extension;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/console/plugin/Plugin;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/console/extension/Extension;\n\tpublic final fun copy (Lnet/mamoe/mirai/console/plugin/Plugin;Lnet/mamoe/mirai/console/extension/Extension;)Lnet/mamoe/mirai/console/extensions/SingletonExtensionSelector$Registry;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/console/extensions/SingletonExtensionSelector$Registry;Lnet/mamoe/mirai/console/plugin/Plugin;Lnet/mamoe/mirai/console/extension/Extension;ILjava/lang/Object;)Lnet/mamoe/mirai/console/extensions/SingletonExtensionSelector$Registry;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getExtension ()Lnet/mamoe/mirai/console/extension/Extension;\n\tpublic final fun getPlugin ()Lnet/mamoe/mirai/console/plugin/Plugin;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/console/fontend/ProcessProgress : java/io/Closeable {\n\tpublic abstract fun close ()V\n\tpublic abstract fun markFailed ()V\n\tpublic abstract fun rerender ()V\n\tpublic abstract fun setTotalSize (J)V\n\tpublic abstract fun update (J)V\n\tpublic abstract fun update (JJ)V\n\tpublic fun updateText (Ljava/lang/CharSequence;)V\n\tpublic abstract fun updateText (Ljava/lang/String;)V\n}\n\npublic final class net/mamoe/mirai/console/logging/AbstractLoggerController$LogPriority$Companion {\n\tpublic final fun by (Lnet/mamoe/mirai/utils/SimpleLogger$LogPriority;)Lnet/mamoe/mirai/console/logging/AbstractLoggerController$LogPriority;\n}\n\npublic abstract class net/mamoe/mirai/console/permission/AbstractPermitteeId : net/mamoe/mirai/console/permission/PermitteeId {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$Companion;\n\tpublic synthetic fun <init> ([Lnet/mamoe/mirai/console/permission/PermitteeId;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun getDirectParents ()[Lnet/mamoe/mirai/console/permission/PermitteeId;\n\tpublic static final fun parseFromString (Ljava/lang/String;)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId;\n\tpublic final fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/permission/AbstractPermitteeId$AnyContact : net/mamoe/mirai/console/permission/AbstractPermitteeId {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$AnyContact;\n\tpublic fun asString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/permission/AbstractPermitteeId$AnyFriend : net/mamoe/mirai/console/permission/AbstractPermitteeId {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$AnyFriend;\n\tpublic fun asString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/permission/AbstractPermitteeId$AnyGroup : net/mamoe/mirai/console/permission/AbstractPermitteeId {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$AnyGroup;\n\tpublic fun asString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/permission/AbstractPermitteeId$AnyGroupTemp : net/mamoe/mirai/console/permission/AbstractPermitteeId$AnyTemp {\n\tpublic fun <init> (J)V\n\tpublic fun asString ()Ljava/lang/String;\n\tpublic final fun component1 ()J\n\tpublic final fun copy (J)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$AnyGroupTemp;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$AnyGroupTemp;JILjava/lang/Object;)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$AnyGroupTemp;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getGroupId ()J\n\tpublic fun hashCode ()I\n}\n\npublic final class net/mamoe/mirai/console/permission/AbstractPermitteeId$AnyMember : net/mamoe/mirai/console/permission/AbstractPermitteeId {\n\tpublic fun <init> (J)V\n\tpublic fun asString ()Ljava/lang/String;\n\tpublic final fun component1 ()J\n\tpublic final fun copy (J)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$AnyMember;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$AnyMember;JILjava/lang/Object;)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$AnyMember;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getGroupId ()J\n\tpublic fun hashCode ()I\n}\n\npublic final class net/mamoe/mirai/console/permission/AbstractPermitteeId$AnyMemberFromAnyGroup : net/mamoe/mirai/console/permission/AbstractPermitteeId {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$AnyMemberFromAnyGroup;\n\tpublic fun asString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/permission/AbstractPermitteeId$AnyOtherClient : net/mamoe/mirai/console/permission/AbstractPermitteeId {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$AnyOtherClient;\n\tpublic fun asString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/permission/AbstractPermitteeId$AnyStranger : net/mamoe/mirai/console/permission/AbstractPermitteeId {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$AnyStranger;\n\tpublic fun asString ()Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/console/permission/AbstractPermitteeId$AnyTemp : net/mamoe/mirai/console/permission/AbstractPermitteeId {\n\tpublic fun <init> (J)V\n}\n\npublic final class net/mamoe/mirai/console/permission/AbstractPermitteeId$AnyTempFromAnyGroup : net/mamoe/mirai/console/permission/AbstractPermitteeId {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$AnyTempFromAnyGroup;\n\tpublic fun asString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/permission/AbstractPermitteeId$AnyUser : net/mamoe/mirai/console/permission/AbstractPermitteeId {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$AnyUser;\n\tpublic fun asString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/permission/AbstractPermitteeId$Companion {\n\tpublic final fun parseFromString (Ljava/lang/String;)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/console/permission/AbstractPermitteeId$Console : net/mamoe/mirai/console/permission/AbstractPermitteeId {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$Console;\n\tpublic fun asString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/permission/AbstractPermitteeId$ExactFriend : net/mamoe/mirai/console/permission/AbstractPermitteeId {\n\tpublic fun <init> (J)V\n\tpublic fun asString ()Ljava/lang/String;\n\tpublic final fun component1 ()J\n\tpublic final fun copy (J)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactFriend;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactFriend;JILjava/lang/Object;)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactFriend;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getId ()J\n\tpublic fun hashCode ()I\n}\n\npublic final class net/mamoe/mirai/console/permission/AbstractPermitteeId$ExactGroup : net/mamoe/mirai/console/permission/AbstractPermitteeId {\n\tpublic fun <init> (J)V\n\tpublic fun asString ()Ljava/lang/String;\n\tpublic final fun component1 ()J\n\tpublic final fun copy (J)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactGroup;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactGroup;JILjava/lang/Object;)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactGroup;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getGroupId ()J\n\tpublic fun hashCode ()I\n}\n\npublic final class net/mamoe/mirai/console/permission/AbstractPermitteeId$ExactGroupTemp : net/mamoe/mirai/console/permission/AbstractPermitteeId$ExactTemp {\n\tpublic fun <init> (JJ)V\n\tpublic fun asString ()Ljava/lang/String;\n\tpublic final fun component1 ()J\n\tpublic final fun component2 ()J\n\tpublic final fun copy (JJ)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactGroupTemp;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactGroupTemp;JJILjava/lang/Object;)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactGroupTemp;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getGroupId ()J\n\tpublic final fun getMemberId ()J\n\tpublic fun hashCode ()I\n}\n\npublic final class net/mamoe/mirai/console/permission/AbstractPermitteeId$ExactMember : net/mamoe/mirai/console/permission/AbstractPermitteeId {\n\tpublic fun <init> (JJ)V\n\tpublic fun asString ()Ljava/lang/String;\n\tpublic final fun component1 ()J\n\tpublic final fun component2 ()J\n\tpublic final fun copy (JJ)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactMember;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactMember;JJILjava/lang/Object;)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactMember;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getGroupId ()J\n\tpublic final fun getMemberId ()J\n\tpublic fun hashCode ()I\n}\n\npublic final class net/mamoe/mirai/console/permission/AbstractPermitteeId$ExactStranger : net/mamoe/mirai/console/permission/AbstractPermitteeId {\n\tpublic fun <init> (J)V\n\tpublic fun asString ()Ljava/lang/String;\n\tpublic final fun component1 ()J\n\tpublic final fun copy (J)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactStranger;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactStranger;JILjava/lang/Object;)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactStranger;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getId ()J\n\tpublic fun hashCode ()I\n}\n\npublic abstract class net/mamoe/mirai/console/permission/AbstractPermitteeId$ExactTemp : net/mamoe/mirai/console/permission/AbstractPermitteeId {\n}\n\npublic final class net/mamoe/mirai/console/permission/AbstractPermitteeId$ExactUser : net/mamoe/mirai/console/permission/AbstractPermitteeId {\n\tpublic fun <init> (J)V\n\tpublic fun asString ()Ljava/lang/String;\n\tpublic final fun component1 ()J\n\tpublic final fun copy (J)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactUser;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactUser;JILjava/lang/Object;)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactUser;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getId ()J\n\tpublic fun hashCode ()I\n}\n\npublic abstract interface class net/mamoe/mirai/console/permission/Permission {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/permission/Permission$Companion;\n\tpublic abstract fun getDescription ()Ljava/lang/String;\n\tpublic abstract fun getId ()Lnet/mamoe/mirai/console/permission/PermissionId;\n\tpublic abstract fun getParent ()Lnet/mamoe/mirai/console/permission/Permission;\n\tpublic static fun getParentsWithSelf (Lnet/mamoe/mirai/console/permission/Permission;)Lkotlin/sequences/Sequence;\n\tpublic static fun getRootPermission ()Lnet/mamoe/mirai/console/permission/Permission;\n}\n\npublic final class net/mamoe/mirai/console/permission/Permission$Companion {\n\tpublic final fun getParentsWithSelf (Lnet/mamoe/mirai/console/permission/Permission;)Lkotlin/sequences/Sequence;\n\tpublic final fun getRootPermission ()Lnet/mamoe/mirai/console/permission/Permission;\n}\n\npublic final class net/mamoe/mirai/console/permission/PermissionId {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/permission/PermissionId$Companion;\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic static final fun checkPermissionIdName (Ljava/lang/String;)V\n\tpublic static final fun checkPermissionIdNamespace (Ljava/lang/String;)V\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun copy (Ljava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/console/permission/PermissionId;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/console/permission/PermissionId;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/console/permission/PermissionId;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getName ()Ljava/lang/String;\n\tpublic final fun getNamespace ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic static final fun parseFromString (Ljava/lang/String;)Lnet/mamoe/mirai/console/permission/PermissionId;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/permission/PermissionId$Companion {\n\tpublic final fun checkPermissionIdName (Ljava/lang/String;)V\n\tpublic final fun checkPermissionIdNamespace (Ljava/lang/String;)V\n\tpublic final fun parseFromString (Ljava/lang/String;)Lnet/mamoe/mirai/console/permission/PermissionId;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/console/permission/PermissionId$PermissionIdAsStringSerializer : kotlinx/serialization/KSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/permission/PermissionId$PermissionIdAsStringSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/console/permission/PermissionId;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/console/permission/PermissionId;)V\n}\n\npublic abstract interface class net/mamoe/mirai/console/permission/PermissionIdNamespace {\n\tpublic abstract fun permissionId (Ljava/lang/String;)Lnet/mamoe/mirai/console/permission/PermissionId;\n}\n\npublic final class net/mamoe/mirai/console/permission/PermissionKt {\n\tpublic static final synthetic fun getRootPermission ()Lnet/mamoe/mirai/console/permission/Permission;\n}\n\npublic final class net/mamoe/mirai/console/permission/PermissionRegistryConflictException : java/lang/Exception {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/permission/Permission;Lnet/mamoe/mirai/console/permission/Permission;)V\n\tpublic final fun getExistingInstance ()Lnet/mamoe/mirai/console/permission/Permission;\n\tpublic final fun getNewInstance ()Lnet/mamoe/mirai/console/permission/Permission;\n}\n\npublic abstract interface class net/mamoe/mirai/console/permission/PermissionService {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/permission/PermissionService$Companion;\n\tpublic static fun cancel (Lnet/mamoe/mirai/console/permission/Permittee;[Lnet/mamoe/mirai/console/permission/Permission;Z)V\n\tpublic abstract fun cancel (Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/Permission;Z)V\n\tpublic static fun cancel (Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/PermissionId;Z)V\n\tpublic static synthetic fun cancel0 (Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/Permission;Z)V\n\tpublic static fun findCorrespondingPermission (Lnet/mamoe/mirai/console/permission/PermissionId;)Lnet/mamoe/mirai/console/permission/Permission;\n\tpublic static fun findCorrespondingPermissionOrFail (Lnet/mamoe/mirai/console/permission/PermissionId;)Lnet/mamoe/mirai/console/permission/Permission;\n\tpublic abstract fun get (Lnet/mamoe/mirai/console/permission/PermissionId;)Lnet/mamoe/mirai/console/permission/Permission;\n\tpublic static fun getCorrespondingPermission (Lnet/mamoe/mirai/console/permission/PermissionId;)Lnet/mamoe/mirai/console/permission/Permission;\n\tpublic static fun getInstance ()Lnet/mamoe/mirai/console/permission/PermissionService;\n\tpublic static fun getOrFail (Lnet/mamoe/mirai/console/permission/PermissionService;Lnet/mamoe/mirai/console/permission/PermissionId;)Lnet/mamoe/mirai/console/permission/Permission;\n\tpublic abstract fun getPermissionType ()Lkotlin/reflect/KClass;\n\tpublic static fun getPermittedPermissions (Lnet/mamoe/mirai/console/permission/Permittee;)Lkotlin/sequences/Sequence;\n\tpublic abstract fun getPermittedPermissions (Lnet/mamoe/mirai/console/permission/PermitteeId;)Lkotlin/sequences/Sequence;\n\tpublic static synthetic fun getPermittedPermissions0 (Lnet/mamoe/mirai/console/permission/PermitteeId;)Lkotlin/sequences/Sequence;\n\tpublic abstract fun getRegisteredPermissions ()Lkotlin/sequences/Sequence;\n\tpublic abstract fun getRootPermission ()Lnet/mamoe/mirai/console/permission/Permission;\n\tpublic static fun hasPermission (Lnet/mamoe/mirai/console/permission/Permittee;Lnet/mamoe/mirai/console/permission/Permission;)Z\n\tpublic static fun hasPermission (Lnet/mamoe/mirai/console/permission/Permittee;Lnet/mamoe/mirai/console/permission/PermissionId;)Z\n\tpublic static fun hasPermission (Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/Permission;)Z\n\tpublic static fun hasPermission (Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/PermissionId;)Z\n\tpublic static fun permit (Lnet/mamoe/mirai/console/permission/Permittee;[Lnet/mamoe/mirai/console/permission/Permission;)V\n\tpublic abstract fun permit (Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/Permission;)V\n\tpublic static fun permit (Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/PermissionId;)V\n\tpublic static fun permit0 (Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/Permission;)V\n\tpublic abstract fun register (Lnet/mamoe/mirai/console/permission/PermissionId;Ljava/lang/String;Lnet/mamoe/mirai/console/permission/Permission;)Lnet/mamoe/mirai/console/permission/Permission;\n\tpublic static synthetic fun register$default (Lnet/mamoe/mirai/console/permission/PermissionService;Lnet/mamoe/mirai/console/permission/PermissionId;Ljava/lang/String;Lnet/mamoe/mirai/console/permission/Permission;ILjava/lang/Object;)Lnet/mamoe/mirai/console/permission/Permission;\n\tpublic static fun testPermission (Lnet/mamoe/mirai/console/permission/Permission;Lnet/mamoe/mirai/console/permission/Permittee;)Z\n\tpublic static fun testPermission (Lnet/mamoe/mirai/console/permission/Permission;Lnet/mamoe/mirai/console/permission/PermitteeId;)Z\n\tpublic static fun testPermission (Lnet/mamoe/mirai/console/permission/PermissionId;Lnet/mamoe/mirai/console/permission/Permittee;)Z\n\tpublic static fun testPermission (Lnet/mamoe/mirai/console/permission/PermissionId;Lnet/mamoe/mirai/console/permission/PermitteeId;)Z\n\tpublic fun testPermission (Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/Permission;)Z\n}\n\npublic final class net/mamoe/mirai/console/permission/PermissionService$Companion {\n\tpublic final fun cancel (Lnet/mamoe/mirai/console/permission/Permittee;[Lnet/mamoe/mirai/console/permission/Permission;Z)V\n\tpublic final fun cancel (Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/PermissionId;Z)V\n\tpublic final synthetic fun cancel0 (Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/Permission;Z)V\n\tpublic final fun findCorrespondingPermission (Lnet/mamoe/mirai/console/permission/PermissionId;)Lnet/mamoe/mirai/console/permission/Permission;\n\tpublic final fun findCorrespondingPermissionOrFail (Lnet/mamoe/mirai/console/permission/PermissionId;)Lnet/mamoe/mirai/console/permission/Permission;\n\tpublic final fun getCorrespondingPermission (Lnet/mamoe/mirai/console/permission/PermissionId;)Lnet/mamoe/mirai/console/permission/Permission;\n\tpublic final fun getInstance ()Lnet/mamoe/mirai/console/permission/PermissionService;\n\tpublic final fun getOrFail (Lnet/mamoe/mirai/console/permission/PermissionService;Lnet/mamoe/mirai/console/permission/PermissionId;)Lnet/mamoe/mirai/console/permission/Permission;\n\tpublic final fun getPermittedPermissions (Lnet/mamoe/mirai/console/permission/Permittee;)Lkotlin/sequences/Sequence;\n\tpublic final synthetic fun getPermittedPermissions0 (Lnet/mamoe/mirai/console/permission/PermitteeId;)Lkotlin/sequences/Sequence;\n\tpublic final fun hasPermission (Lnet/mamoe/mirai/console/permission/Permittee;Lnet/mamoe/mirai/console/permission/Permission;)Z\n\tpublic final fun hasPermission (Lnet/mamoe/mirai/console/permission/Permittee;Lnet/mamoe/mirai/console/permission/PermissionId;)Z\n\tpublic final fun hasPermission (Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/Permission;)Z\n\tpublic final fun hasPermission (Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/PermissionId;)Z\n\tpublic final fun permit (Lnet/mamoe/mirai/console/permission/Permittee;[Lnet/mamoe/mirai/console/permission/Permission;)V\n\tpublic final fun permit (Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/PermissionId;)V\n\tpublic final fun permit0 (Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/Permission;)V\n\tpublic final fun testPermission (Lnet/mamoe/mirai/console/permission/Permission;Lnet/mamoe/mirai/console/permission/Permittee;)Z\n\tpublic final fun testPermission (Lnet/mamoe/mirai/console/permission/Permission;Lnet/mamoe/mirai/console/permission/PermitteeId;)Z\n\tpublic final fun testPermission (Lnet/mamoe/mirai/console/permission/PermissionId;Lnet/mamoe/mirai/console/permission/Permittee;)Z\n\tpublic final fun testPermission (Lnet/mamoe/mirai/console/permission/PermissionId;Lnet/mamoe/mirai/console/permission/PermitteeId;)Z\n}\n\npublic abstract interface class net/mamoe/mirai/console/permission/Permittee {\n\tpublic abstract fun getPermitteeId ()Lnet/mamoe/mirai/console/permission/PermitteeId;\n}\n\npublic abstract interface class net/mamoe/mirai/console/permission/PermitteeId {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/permission/PermitteeId$Companion;\n\tpublic abstract fun asString ()Ljava/lang/String;\n\tpublic static fun getAllParents (Lnet/mamoe/mirai/console/permission/PermitteeId;)Lkotlin/sequences/Sequence;\n\tpublic static fun getAllParentsWithSelf (Lnet/mamoe/mirai/console/permission/PermitteeId;)Lkotlin/sequences/Sequence;\n\tpublic abstract fun getDirectParents ()[Lnet/mamoe/mirai/console/permission/PermitteeId;\n\tpublic static fun hasChild (Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/PermitteeId;)Z\n\tpublic static fun isChildOf (Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/PermitteeId;)Z\n}\n\npublic final class net/mamoe/mirai/console/permission/PermitteeId$Companion {\n\tpublic final fun getAllParents (Lnet/mamoe/mirai/console/permission/PermitteeId;)Lkotlin/sequences/Sequence;\n\tpublic final fun getAllParentsWithSelf (Lnet/mamoe/mirai/console/permission/PermitteeId;)Lkotlin/sequences/Sequence;\n\tpublic final synthetic fun getPermitteeId (Lnet/mamoe/mirai/contact/Group;)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactGroup;\n\tpublic final synthetic fun getPermitteeId (Lnet/mamoe/mirai/contact/Member;)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactMember;\n\tpublic final synthetic fun getPermitteeId (Lnet/mamoe/mirai/contact/OtherClient;)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$AnyOtherClient;\n\tpublic final synthetic fun getPermitteeId (Lnet/mamoe/mirai/contact/Stranger;)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactStranger;\n\tpublic final synthetic fun getPermitteeId (Lnet/mamoe/mirai/contact/User;)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactUser;\n\tpublic final synthetic fun getPermitteeIdOnTemp (Lnet/mamoe/mirai/contact/Member;)Lnet/mamoe/mirai/console/permission/AbstractPermitteeId$ExactGroupTemp;\n\tpublic final fun hasChild (Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/PermitteeId;)Z\n\tpublic final fun isChildOf (Lnet/mamoe/mirai/console/permission/PermitteeId;Lnet/mamoe/mirai/console/permission/PermitteeId;)Z\n}\n\npublic abstract interface class net/mamoe/mirai/console/plugin/NotYetLoadedPlugin : net/mamoe/mirai/console/plugin/Plugin {\n\tpublic abstract fun resolve ()Lnet/mamoe/mirai/console/plugin/Plugin;\n}\n\npublic abstract interface class net/mamoe/mirai/console/plugin/Plugin : net/mamoe/mirai/console/command/CommandOwner {\n\tpublic abstract fun getLoader ()Lnet/mamoe/mirai/console/plugin/loader/PluginLoader;\n\tpublic abstract fun isEnabled ()Z\n}\n\npublic abstract interface class net/mamoe/mirai/console/plugin/PluginFileExtensions {\n\tpublic abstract fun getConfigFolder ()Ljava/io/File;\n\tpublic abstract fun getConfigFolderPath ()Ljava/nio/file/Path;\n\tpublic abstract fun getDataFolder ()Ljava/io/File;\n\tpublic abstract fun getDataFolderPath ()Ljava/nio/file/Path;\n\tpublic fun resolveConfigFile (Ljava/lang/String;)Ljava/io/File;\n\tpublic fun resolveConfigFile (Ljava/nio/file/Path;)Ljava/io/File;\n\tpublic fun resolveConfigPath (Ljava/lang/String;)Ljava/nio/file/Path;\n\tpublic fun resolveConfigPath (Ljava/nio/file/Path;)Ljava/nio/file/Path;\n\tpublic fun resolveDataFile (Ljava/lang/String;)Ljava/io/File;\n\tpublic fun resolveDataFile (Ljava/nio/file/Path;)Ljava/io/File;\n\tpublic fun resolveDataPath (Ljava/lang/String;)Ljava/nio/file/Path;\n\tpublic fun resolveDataPath (Ljava/nio/file/Path;)Ljava/nio/file/Path;\n}\n\npublic final class net/mamoe/mirai/console/plugin/PluginKt {\n\tpublic static final fun getAuthor (Lnet/mamoe/mirai/console/plugin/Plugin;)Ljava/lang/String;\n\tpublic static final fun getDependencies (Lnet/mamoe/mirai/console/plugin/Plugin;)Ljava/util/Set;\n\tpublic static final synthetic fun getDescription (Lnet/mamoe/mirai/console/plugin/Plugin;)Lnet/mamoe/mirai/console/plugin/description/PluginDescription;\n\tpublic static final fun getId (Lnet/mamoe/mirai/console/plugin/Plugin;)Ljava/lang/String;\n\tpublic static final fun getInfo (Lnet/mamoe/mirai/console/plugin/Plugin;)Ljava/lang/String;\n\tpublic static final fun getName (Lnet/mamoe/mirai/console/plugin/Plugin;)Ljava/lang/String;\n\tpublic static final fun getVersion (Lnet/mamoe/mirai/console/plugin/Plugin;)Lnet/mamoe/mirai/console/util/SemVersion;\n}\n\npublic abstract interface class net/mamoe/mirai/console/plugin/PluginManager {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/plugin/PluginManager$INSTANCE;\n\tpublic fun disablePlugin (Lnet/mamoe/mirai/console/plugin/Plugin;)V\n\tpublic fun enablePlugin (Lnet/mamoe/mirai/console/plugin/Plugin;)V\n\tpublic abstract fun getBuiltInLoaders ()Ljava/util/List;\n\tpublic abstract fun getPluginDescription (Lnet/mamoe/mirai/console/plugin/Plugin;)Lnet/mamoe/mirai/console/plugin/description/PluginDescription;\n\tpublic abstract fun getPluginLibrariesFolder ()Ljava/io/File;\n\tpublic abstract fun getPluginLibrariesPath ()Ljava/nio/file/Path;\n\tpublic abstract fun getPluginLoaders ()Ljava/util/List;\n\tpublic abstract fun getPluginSharedLibrariesFolder ()Ljava/io/File;\n\tpublic abstract fun getPluginSharedLibrariesPath ()Ljava/nio/file/Path;\n\tpublic abstract fun getPlugins ()Ljava/util/List;\n\tpublic abstract fun getPluginsConfigFolder ()Ljava/io/File;\n\tpublic abstract fun getPluginsConfigPath ()Ljava/nio/file/Path;\n\tpublic abstract fun getPluginsDataFolder ()Ljava/io/File;\n\tpublic abstract fun getPluginsDataPath ()Ljava/nio/file/Path;\n\tpublic abstract fun getPluginsFolder ()Ljava/io/File;\n\tpublic abstract fun getPluginsPath ()Ljava/nio/file/Path;\n\tpublic fun loadPlugin (Lnet/mamoe/mirai/console/plugin/Plugin;)V\n}\n\npublic final class net/mamoe/mirai/console/plugin/PluginManager$INSTANCE : net/mamoe/mirai/console/plugin/PluginManager {\n\tpublic final synthetic fun disable (Lnet/mamoe/mirai/console/plugin/Plugin;)V\n\tpublic fun disablePlugin (Lnet/mamoe/mirai/console/plugin/Plugin;)V\n\tpublic final synthetic fun enable (Lnet/mamoe/mirai/console/plugin/Plugin;)V\n\tpublic fun enablePlugin (Lnet/mamoe/mirai/console/plugin/Plugin;)V\n\tpublic fun getBuiltInLoaders ()Ljava/util/List;\n\tpublic final synthetic fun getDescription (Lnet/mamoe/mirai/console/plugin/Plugin;)Lnet/mamoe/mirai/console/plugin/description/PluginDescription;\n\tpublic fun getPluginDescription (Lnet/mamoe/mirai/console/plugin/Plugin;)Lnet/mamoe/mirai/console/plugin/description/PluginDescription;\n\tpublic fun getPluginLibrariesFolder ()Ljava/io/File;\n\tpublic fun getPluginLibrariesPath ()Ljava/nio/file/Path;\n\tpublic fun getPluginLoaders ()Ljava/util/List;\n\tpublic fun getPluginSharedLibrariesFolder ()Ljava/io/File;\n\tpublic fun getPluginSharedLibrariesPath ()Ljava/nio/file/Path;\n\tpublic fun getPlugins ()Ljava/util/List;\n\tpublic fun getPluginsConfigFolder ()Ljava/io/File;\n\tpublic fun getPluginsConfigPath ()Ljava/nio/file/Path;\n\tpublic fun getPluginsDataFolder ()Ljava/io/File;\n\tpublic fun getPluginsDataPath ()Ljava/nio/file/Path;\n\tpublic fun getPluginsFolder ()Ljava/io/File;\n\tpublic fun getPluginsPath ()Ljava/nio/file/Path;\n\tpublic final synthetic fun getSafeLoader (Lnet/mamoe/mirai/console/plugin/Plugin;)Lnet/mamoe/mirai/console/plugin/loader/PluginLoader;\n\tpublic final synthetic fun load (Lnet/mamoe/mirai/console/plugin/Plugin;)V\n\tpublic fun loadPlugin (Lnet/mamoe/mirai/console/plugin/Plugin;)V\n}\n\npublic abstract interface class net/mamoe/mirai/console/plugin/ResourceContainer {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/plugin/ResourceContainer$Companion;\n\tpublic static fun create (Ljava/lang/Class;)Lnet/mamoe/mirai/console/plugin/ResourceContainer;\n\tpublic static fun create (Ljava/lang/ClassLoader;)Lnet/mamoe/mirai/console/plugin/ResourceContainer;\n\tpublic static fun create (Lkotlin/reflect/KClass;)Lnet/mamoe/mirai/console/plugin/ResourceContainer;\n\tpublic fun getResource (Ljava/lang/String;)Ljava/lang/String;\n\tpublic fun getResource (Ljava/lang/String;Ljava/nio/charset/Charset;)Ljava/lang/String;\n\tpublic abstract fun getResourceAsStream (Ljava/lang/String;)Ljava/io/InputStream;\n}\n\npublic final class net/mamoe/mirai/console/plugin/ResourceContainer$Companion {\n\tpublic final fun create (Ljava/lang/Class;)Lnet/mamoe/mirai/console/plugin/ResourceContainer;\n\tpublic final fun create (Ljava/lang/ClassLoader;)Lnet/mamoe/mirai/console/plugin/ResourceContainer;\n\tpublic final fun create (Lkotlin/reflect/KClass;)Lnet/mamoe/mirai/console/plugin/ResourceContainer;\n}\n\npublic final class net/mamoe/mirai/console/plugin/center/PluginCenter$PluginInfo$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/plugin/center/PluginCenter$PluginInfo$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/console/plugin/center/PluginCenter$PluginInfo;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/console/plugin/center/PluginCenter$PluginInfo;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/console/plugin/center/PluginCenter$PluginInfo$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/console/plugin/center/PluginCenter$PluginInsight$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/plugin/center/PluginCenter$PluginInsight$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/console/plugin/center/PluginCenter$PluginInsight;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/console/plugin/center/PluginCenter$PluginInsight;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/console/plugin/center/PluginCenter$PluginInsight$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/console/plugin/description/IllegalPluginDescriptionException : java/lang/RuntimeException {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun <init> (Ljava/lang/Throwable;)V\n}\n\npublic final class net/mamoe/mirai/console/plugin/description/PluginDependency {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/plugin/description/PluginDependency$Companion;\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;Z)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun <init> (Ljava/lang/String;Z)V\n\tpublic synthetic fun <init> (Ljava/lang/String;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Z\n\tpublic final fun copy (Ljava/lang/String;Ljava/lang/String;Z)Lnet/mamoe/mirai/console/plugin/description/PluginDependency;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/console/plugin/description/PluginDependency;Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Lnet/mamoe/mirai/console/plugin/description/PluginDependency;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getId ()Ljava/lang/String;\n\tpublic final fun getVersionRequirement ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic final fun isOptional ()Z\n\tpublic static final fun parseFromString (Ljava/lang/String;)Lnet/mamoe/mirai/console/plugin/description/PluginDependency;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/plugin/description/PluginDependency$Companion {\n\tpublic final fun parseFromString (Ljava/lang/String;)Lnet/mamoe/mirai/console/plugin/description/PluginDependency;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/console/plugin/description/PluginDependency$PluginDependencyAsStringSerializer : kotlinx/serialization/KSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/plugin/description/PluginDependency$PluginDependencyAsStringSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/console/plugin/description/PluginDependency;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/console/plugin/description/PluginDependency;)V\n}\n\npublic abstract interface class net/mamoe/mirai/console/plugin/description/PluginDescription {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/plugin/description/PluginDescription$Companion;\n\tpublic abstract fun getAuthor ()Ljava/lang/String;\n\tpublic abstract fun getDependencies ()Ljava/util/Set;\n\tpublic abstract fun getId ()Ljava/lang/String;\n\tpublic abstract fun getInfo ()Ljava/lang/String;\n\tpublic abstract fun getName ()Ljava/lang/String;\n\tpublic abstract fun getVersion ()Lnet/mamoe/mirai/console/util/SemVersion;\n}\n\npublic final class net/mamoe/mirai/console/plugin/description/PluginDescription$Companion {\n\tpublic final fun checkDependencies (Ljava/lang/String;Ljava/util/Set;)V\n\tpublic final fun checkPluginDescription (Lnet/mamoe/mirai/console/plugin/description/PluginDescription;)V\n\tpublic final fun checkPluginId (Ljava/lang/String;)V\n\tpublic final fun checkPluginName (Ljava/lang/String;)V\n\tpublic final fun getFORBIDDEN_ID_NAMES ()[Ljava/lang/String;\n\tpublic final fun getID_REGEX ()Lkotlin/text/Regex;\n}\n\npublic abstract class net/mamoe/mirai/console/plugin/jvm/AbstractJvmPlugin : net/mamoe/mirai/console/internal/plugin/JvmPluginInternal, net/mamoe/mirai/console/data/AutoSavePluginDataHolder, net/mamoe/mirai/console/plugin/jvm/JvmPlugin {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Lkotlin/coroutines/CoroutineContext;)V\n\tpublic synthetic fun <init> (Lkotlin/coroutines/CoroutineContext;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;Lkotlin/coroutines/CoroutineContext;)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;Lkotlin/coroutines/CoroutineContext;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getAutoSaveIntervalMillis ()Lkotlin/ranges/LongRange;\n\tpublic final fun getDataHolderName ()Ljava/lang/String;\n\tpublic final fun getDescription ()Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;\n\tprotected final fun getJvmPluginClasspath ()Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginClasspath;\n\tpublic final fun getLoader ()Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginLoader;\n\tpublic synthetic fun getLoader ()Lnet/mamoe/mirai/console/plugin/loader/PluginLoader;\n\tpublic final fun permissionId (Ljava/lang/String;)Lnet/mamoe/mirai/console/permission/PermissionId;\n\tpublic final fun reloadPluginConfig (Lnet/mamoe/mirai/console/data/PluginConfig;)V\n\tpublic final fun reloadPluginData (Lnet/mamoe/mirai/console/data/PluginData;)V\n\tpublic final fun savePluginConfig (Lnet/mamoe/mirai/console/data/PluginConfig;)V\n\tpublic final fun savePluginData (Lnet/mamoe/mirai/console/data/PluginData;)V\n\tprotected final fun services (Ljava/lang/Class;)Lkotlin/Lazy;\n\tprotected final synthetic fun services (Lkotlin/reflect/KClass;)Lkotlin/Lazy;\n}\n\npublic final class net/mamoe/mirai/console/plugin/jvm/AbstractJvmPluginKt {\n\tpublic static final synthetic fun reloadPluginConfig (Lnet/mamoe/mirai/console/plugin/jvm/AbstractJvmPlugin;Lnet/mamoe/mirai/console/data/PluginConfig;)V\n\tpublic static final synthetic fun reloadPluginData (Lnet/mamoe/mirai/console/plugin/jvm/AbstractJvmPlugin;Lnet/mamoe/mirai/console/data/PluginData;)V\n\tpublic static final synthetic fun savePluginConfig (Lnet/mamoe/mirai/console/plugin/jvm/AbstractJvmPlugin;Lnet/mamoe/mirai/console/data/PluginConfig;)V\n\tpublic static final synthetic fun savePluginData (Lnet/mamoe/mirai/console/plugin/jvm/AbstractJvmPlugin;Lnet/mamoe/mirai/console/data/PluginData;)V\n}\n\npublic abstract class net/mamoe/mirai/console/plugin/jvm/JavaPlugin : net/mamoe/mirai/console/plugin/jvm/AbstractJvmPlugin, net/mamoe/mirai/console/plugin/jvm/JvmPlugin {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Lkotlin/coroutines/CoroutineContext;)V\n\tpublic synthetic fun <init> (Lkotlin/coroutines/CoroutineContext;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;Lkotlin/coroutines/CoroutineContext;)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;Lkotlin/coroutines/CoroutineContext;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun getScheduler ()Lnet/mamoe/mirai/console/plugin/jvm/JavaPluginScheduler;\n}\n\npublic abstract interface class net/mamoe/mirai/console/plugin/jvm/JavaPluginScheduler : kotlinx/coroutines/CoroutineScope {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/plugin/jvm/JavaPluginScheduler$Companion;\n\tpublic abstract fun async (Ljava/lang/Runnable;)Ljava/util/concurrent/Future;\n\tpublic abstract fun async (Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Future;\n\tpublic static fun create ()Lnet/mamoe/mirai/console/plugin/jvm/JavaPluginScheduler;\n\tpublic static fun create (Lkotlin/coroutines/CoroutineContext;)Lnet/mamoe/mirai/console/plugin/jvm/JavaPluginScheduler;\n\tpublic abstract fun delayed (JLjava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture;\n\tpublic abstract fun delayed (JLjava/util/concurrent/Callable;)Ljava/util/concurrent/CompletableFuture;\n\tpublic abstract fun repeating (JLjava/lang/Runnable;)Ljava/util/concurrent/Future;\n}\n\npublic final class net/mamoe/mirai/console/plugin/jvm/JavaPluginScheduler$Companion {\n\tpublic final fun create ()Lnet/mamoe/mirai/console/plugin/jvm/JavaPluginScheduler;\n\tpublic final fun create (Lkotlin/coroutines/CoroutineContext;)Lnet/mamoe/mirai/console/plugin/jvm/JavaPluginScheduler;\n\tpublic static synthetic fun create$default (Lnet/mamoe/mirai/console/plugin/jvm/JavaPluginScheduler$Companion;Lkotlin/coroutines/CoroutineContext;ILjava/lang/Object;)Lnet/mamoe/mirai/console/plugin/jvm/JavaPluginScheduler;\n}\n\npublic abstract interface class net/mamoe/mirai/console/plugin/jvm/JvmPlugin : kotlinx/coroutines/CoroutineScope, net/mamoe/mirai/console/permission/PermissionIdNamespace, net/mamoe/mirai/console/plugin/Plugin, net/mamoe/mirai/console/plugin/PluginFileExtensions, net/mamoe/mirai/console/plugin/ResourceContainer {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/plugin/jvm/JvmPlugin$Companion;\n\tpublic abstract fun getDescription ()Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;\n\tpublic fun getLoader ()Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginLoader;\n\tpublic synthetic fun getLoader ()Lnet/mamoe/mirai/console/plugin/loader/PluginLoader;\n\tpublic abstract fun getLogger ()Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic fun onDisable ()V\n\tpublic fun onEnable ()V\n\tpublic fun onLoad (Lnet/mamoe/mirai/console/extension/PluginComponentStorage;)V\n}\n\npublic final class net/mamoe/mirai/console/plugin/jvm/JvmPlugin$Companion {\n\tpublic final synthetic fun onLoad (Lnet/mamoe/mirai/console/plugin/jvm/JvmPlugin;Lnet/mamoe/mirai/console/extension/PluginComponentStorage;)V\n}\n\npublic abstract interface class net/mamoe/mirai/console/plugin/jvm/JvmPluginClasspath {\n\tpublic abstract fun addToPath (Ljava/lang/ClassLoader;Ljava/io/File;)V\n\tpublic abstract fun downloadAndAddToPath (Ljava/lang/ClassLoader;Ljava/util/Collection;)V\n\tpublic abstract fun getPluginClassLoader ()Ljava/lang/ClassLoader;\n\tpublic abstract fun getPluginFile ()Ljava/io/File;\n\tpublic abstract fun getPluginIndependentLibrariesClassLoader ()Ljava/lang/ClassLoader;\n\tpublic abstract fun getPluginSharedLibrariesClassLoader ()Ljava/lang/ClassLoader;\n\tpublic abstract fun getShouldBeResolvableToIndependent ()Z\n\tpublic abstract fun getShouldResolveConsoleSystemResource ()Z\n\tpublic abstract fun getShouldResolveIndependent ()Z\n\tpublic abstract fun setShouldBeResolvableToIndependent (Z)V\n\tpublic abstract fun setShouldResolveConsoleSystemResource (Z)V\n\tpublic abstract fun setShouldResolveIndependent (Z)V\n}\n\npublic abstract interface class net/mamoe/mirai/console/plugin/jvm/JvmPluginDescription : net/mamoe/mirai/console/plugin/description/PluginDescription {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription$Companion;\n\tpublic static fun loadFromResource ()Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;\n\tpublic static fun loadFromResource (Ljava/lang/String;)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;\n\tpublic static fun loadFromResource (Ljava/lang/String;Ljava/lang/ClassLoader;)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;\n}\n\npublic final class net/mamoe/mirai/console/plugin/jvm/JvmPluginDescription$Companion {\n\tpublic final fun loadFromResource ()Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;\n\tpublic final fun loadFromResource (Ljava/lang/String;)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;\n\tpublic final fun loadFromResource (Ljava/lang/String;Ljava/lang/ClassLoader;)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;\n\tpublic static synthetic fun loadFromResource$default (Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription$Companion;Ljava/lang/String;Ljava/lang/ClassLoader;ILjava/lang/Object;)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;\n}\n\npublic final class net/mamoe/mirai/console/plugin/jvm/JvmPluginDescriptionBuilder {\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Lnet/mamoe/mirai/console/util/SemVersion;)V\n\tpublic final fun author (Ljava/lang/String;)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescriptionBuilder;\n\tpublic final fun build ()Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;\n\tpublic final fun dependsOn (Ljava/lang/String;Ljava/lang/String;Z)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescriptionBuilder;\n\tpublic final fun dependsOn (Ljava/lang/String;Z)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescriptionBuilder;\n\tpublic final fun dependsOn ([Lnet/mamoe/mirai/console/plugin/description/PluginDependency;)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescriptionBuilder;\n\tpublic static synthetic fun dependsOn$default (Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescriptionBuilder;Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescriptionBuilder;\n\tpublic static synthetic fun dependsOn$default (Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescriptionBuilder;Ljava/lang/String;ZILjava/lang/Object;)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescriptionBuilder;\n\tpublic final fun id (Ljava/lang/String;)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescriptionBuilder;\n\tpublic final fun info (Ljava/lang/String;)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescriptionBuilder;\n\tpublic final fun name (Ljava/lang/String;)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescriptionBuilder;\n\tpublic final fun setDependencies (Ljava/util/Set;)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescriptionBuilder;\n\tpublic final fun version (Ljava/lang/String;)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescriptionBuilder;\n\tpublic final fun version (Lnet/mamoe/mirai/console/util/SemVersion;)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescriptionBuilder;\n}\n\npublic final class net/mamoe/mirai/console/plugin/jvm/JvmPluginDescriptionKt {\n\tpublic static final synthetic fun JvmPluginDescription (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;\n\tpublic static final synthetic fun JvmPluginDescription (Ljava/lang/String;Lnet/mamoe/mirai/console/util/SemVersion;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;\n\tpublic static synthetic fun JvmPluginDescription$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;\n\tpublic static synthetic fun JvmPluginDescription$default (Ljava/lang/String;Lnet/mamoe/mirai/console/util/SemVersion;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;\n}\n\npublic abstract interface class net/mamoe/mirai/console/plugin/jvm/JvmPluginLoader : kotlinx/coroutines/CoroutineScope, net/mamoe/mirai/console/plugin/loader/FilePluginLoader {\n\tpublic static final field BuiltIn Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginLoader$BuiltIn;\n\tpublic abstract fun getClassLoaders ()Ljava/util/List;\n\tpublic abstract fun getConfigStorage ()Lnet/mamoe/mirai/console/data/PluginDataStorage;\n\tpublic abstract fun getDataStorage ()Lnet/mamoe/mirai/console/data/PluginDataStorage;\n\tpublic abstract fun getFileSuffix ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/plugin/jvm/JvmPluginLoader$BuiltIn : net/mamoe/mirai/console/plugin/jvm/JvmPluginLoader {\n\tpublic synthetic fun disable (Lnet/mamoe/mirai/console/plugin/Plugin;)V\n\tpublic fun disable (Lnet/mamoe/mirai/console/plugin/jvm/JvmPlugin;)V\n\tpublic synthetic fun enable (Lnet/mamoe/mirai/console/plugin/Plugin;)V\n\tpublic fun enable (Lnet/mamoe/mirai/console/plugin/jvm/JvmPlugin;)V\n\tpublic fun getClassLoaders ()Ljava/util/List;\n\tpublic fun getConfigStorage ()Lnet/mamoe/mirai/console/data/PluginDataStorage;\n\tpublic fun getCoroutineContext ()Lkotlin/coroutines/CoroutineContext;\n\tpublic fun getDataStorage ()Lnet/mamoe/mirai/console/data/PluginDataStorage;\n\tpublic fun getFileSuffix ()Ljava/lang/String;\n\tpublic synthetic fun getPluginDescription (Lnet/mamoe/mirai/console/plugin/Plugin;)Lnet/mamoe/mirai/console/plugin/description/PluginDescription;\n\tpublic fun getPluginDescription (Lnet/mamoe/mirai/console/plugin/jvm/JvmPlugin;)Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;\n\tpublic fun listPlugins ()Ljava/util/List;\n\tpublic synthetic fun load (Lnet/mamoe/mirai/console/plugin/Plugin;)V\n\tpublic fun load (Lnet/mamoe/mirai/console/plugin/jvm/JvmPlugin;)V\n}\n\npublic abstract class net/mamoe/mirai/console/plugin/jvm/KotlinPlugin : net/mamoe/mirai/console/plugin/jvm/AbstractJvmPlugin, net/mamoe/mirai/console/plugin/jvm/JvmPlugin {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Lkotlin/coroutines/CoroutineContext;)V\n\tpublic synthetic fun <init> (Lkotlin/coroutines/CoroutineContext;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;Lkotlin/coroutines/CoroutineContext;)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginDescription;Lkotlin/coroutines/CoroutineContext;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n}\n\npublic abstract class net/mamoe/mirai/console/plugin/loader/AbstractFilePluginLoader : net/mamoe/mirai/console/plugin/loader/FilePluginLoader {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tprotected abstract fun extractPlugins (Lkotlin/sequences/Sequence;)Ljava/util/List;\n\tpublic fun getFileSuffix ()Ljava/lang/String;\n\tpublic fun listPlugins ()Ljava/util/List;\n}\n\npublic abstract interface class net/mamoe/mirai/console/plugin/loader/FilePluginLoader : net/mamoe/mirai/console/plugin/loader/PluginLoader {\n\tpublic abstract fun getFileSuffix ()Ljava/lang/String;\n}\n\npublic class net/mamoe/mirai/console/plugin/loader/PluginLoadException : java/lang/RuntimeException {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun <init> (Ljava/lang/Throwable;)V\n}\n\npublic abstract interface class net/mamoe/mirai/console/plugin/loader/PluginLoader {\n\tpublic abstract fun disable (Lnet/mamoe/mirai/console/plugin/Plugin;)V\n\tpublic abstract fun enable (Lnet/mamoe/mirai/console/plugin/Plugin;)V\n\tpublic abstract fun getPluginDescription (Lnet/mamoe/mirai/console/plugin/Plugin;)Lnet/mamoe/mirai/console/plugin/description/PluginDescription;\n\tpublic abstract fun listPlugins ()Ljava/util/List;\n\tpublic abstract fun load (Lnet/mamoe/mirai/console/plugin/Plugin;)V\n}\n\npublic class net/mamoe/mirai/console/util/AnsiMessageBuilder : java/io/Serializable, java/lang/Appendable {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/util/AnsiMessageBuilder$Companion;\n\tpublic fun <init> (Ljava/lang/StringBuilder;)V\n\tpublic fun ansi (Ljava/lang/String;)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic synthetic fun append (C)Ljava/lang/Appendable;\n\tpublic fun append (C)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic final fun append (D)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic final fun append (F)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic final fun append (I)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic final fun append (J)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic synthetic fun append (Ljava/lang/CharSequence;)Ljava/lang/Appendable;\n\tpublic fun append (Ljava/lang/CharSequence;)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic synthetic fun append (Ljava/lang/CharSequence;II)Ljava/lang/Appendable;\n\tpublic fun append (Ljava/lang/CharSequence;II)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic final fun append (Ljava/lang/Object;)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic final fun append (Ljava/lang/String;)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic final fun append (Ljava/lang/String;II)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic final fun append (S)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic final fun append (Z)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic fun blue ()Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic static final fun create ()Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic static final fun create (I)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic static final fun create (IZ)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic static final fun dropAnsi (Ljava/lang/String;)Ljava/lang/String;\n\tpublic fun emeraldGreen ()Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic static final fun from (Ljava/lang/StringBuilder;)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic static final fun from (Ljava/lang/StringBuilder;Z)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic final fun getDelegate ()Ljava/lang/StringBuilder;\n\tpublic fun gold ()Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic fun gray ()Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic fun green ()Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic fun hashCode ()I\n\tpublic static final fun isAnsiSupported (Lnet/mamoe/mirai/console/command/CommandSender;)Z\n\tpublic fun lightBlue ()Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic fun lightCyan ()Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic fun lightGreen ()Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic fun lightPurple ()Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic fun lightRed ()Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic fun lightYellow ()Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic fun purple ()Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic fun red ()Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic fun reset ()Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic fun white ()Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n}\n\npublic final class net/mamoe/mirai/console/util/AnsiMessageBuilder$Companion {\n\tpublic final fun appendAnsi (Ljava/lang/StringBuilder;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic final fun create ()Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic final fun create (I)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic final fun create (IZ)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic static synthetic fun create$default (Lnet/mamoe/mirai/console/util/AnsiMessageBuilder$Companion;IZILjava/lang/Object;)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic final fun dropAnsi (Ljava/lang/String;)Ljava/lang/String;\n\tpublic final fun from (Ljava/lang/StringBuilder;)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic final fun from (Ljava/lang/StringBuilder;Z)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic static synthetic fun from$default (Lnet/mamoe/mirai/console/util/AnsiMessageBuilder$Companion;Ljava/lang/StringBuilder;ZILjava/lang/Object;)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic final fun isAnsiSupported (Lnet/mamoe/mirai/console/command/CommandSender;)Z\n}\n\npublic final class net/mamoe/mirai/console/util/AnsiMessageBuilderKt {\n\tpublic static final synthetic fun AnsiMessageBuilder (I)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic static synthetic fun AnsiMessageBuilder$default (IILjava/lang/Object;)Lnet/mamoe/mirai/console/util/AnsiMessageBuilder;\n\tpublic static final synthetic fun buildAnsiMessage (ILkotlin/jvm/functions/Function1;)Ljava/lang/String;\n\tpublic static synthetic fun buildAnsiMessage$default (ILkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/String;\n\tpublic static final synthetic fun sendAnsiMessage (Lnet/mamoe/mirai/console/command/CommandSender;ILkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun sendAnsiMessage (Lnet/mamoe/mirai/console/command/CommandSender;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendAnsiMessage$default (Lnet/mamoe/mirai/console/command/CommandSender;ILkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic abstract interface annotation class net/mamoe/mirai/console/util/ConsoleExperimentalApi : java/lang/annotation/Annotation {\n\tpublic abstract fun message ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/console/util/ConsoleInput {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/util/ConsoleInput$INSTANCE;\n\tpublic fun requestInput (Ljava/lang/String;)Ljava/lang/String;\n\tpublic abstract fun requestInput (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/console/util/ConsoleInput$INSTANCE : net/mamoe/mirai/console/util/ConsoleInput {\n\tpublic fun requestInput (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface annotation class net/mamoe/mirai/console/util/ConsoleInternalApi : java/lang/annotation/Annotation {\n\tpublic abstract fun message ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/util/ConsoleUtils {\n\tpublic static final synthetic fun requestInput (Lnet/mamoe/mirai/console/MiraiConsole;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/console/util/MessageScope {\n\tpublic abstract fun getRealTarget ()Ljava/lang/Object;\n\tpublic fun sendMessage (Ljava/lang/String;)V\n\tpublic abstract fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)V\n\tpublic abstract fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/console/util/MessageScopeKt {\n\tpublic static final fun asMessageScope (Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun asMessageScope (Lnet/mamoe/mirai/console/util/MessageScope;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun asMessageScope (Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final synthetic fun invoke (Lnet/mamoe/mirai/console/util/MessageScope;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/command/CommandSender;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/command/CommandSender;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/command/CommandSender;Lnet/mamoe/mirai/console/util/MessageScope;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/command/CommandSender;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/command/CommandSender;[Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/command/CommandSender;[Lnet/mamoe/mirai/console/command/CommandSender;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/command/CommandSender;[Lnet/mamoe/mirai/console/util/MessageScope;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/command/CommandSender;[Lnet/mamoe/mirai/console/util/MessageScope;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/command/CommandSender;[Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/command/CommandSender;[Lnet/mamoe/mirai/contact/Contact;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/util/MessageScope;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/util/MessageScope;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/util/MessageScope;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/util/MessageScope;Lnet/mamoe/mirai/console/util/MessageScope;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/util/MessageScope;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/util/MessageScope;[Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/util/MessageScope;[Lnet/mamoe/mirai/console/command/CommandSender;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/util/MessageScope;[Lnet/mamoe/mirai/console/util/MessageScope;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/util/MessageScope;[Lnet/mamoe/mirai/console/util/MessageScope;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/util/MessageScope;[Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/console/util/MessageScope;[Lnet/mamoe/mirai/contact/Contact;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/contact/Contact;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/console/util/MessageScope;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/contact/Contact;[Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/contact/Contact;[Lnet/mamoe/mirai/console/command/CommandSender;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/contact/Contact;[Lnet/mamoe/mirai/console/util/MessageScope;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/contact/Contact;[Lnet/mamoe/mirai/console/util/MessageScope;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/contact/Contact;[Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun scopeWith (Lnet/mamoe/mirai/contact/Contact;[Lnet/mamoe/mirai/contact/Contact;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static final fun toMessageScopeCommandSenderArray ([Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final synthetic fun toMessageScopeCommandSenderFlow (Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final fun toMessageScopeCommandSenderIterable (Ljava/lang/Iterable;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun toMessageScopeCommandSenderSequence (Lkotlin/sequences/Sequence;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun toMessageScopeContactArray ([Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final synthetic fun toMessageScopeContactFlow (Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final fun toMessageScopeContactIterable (Ljava/lang/Iterable;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun toMessageScopeContactSequence (Lkotlin/sequences/Sequence;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun toMessageScopeMessageScopeArray ([Lnet/mamoe/mirai/console/util/MessageScope;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final synthetic fun toMessageScopeMessageScopeFlow (Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final fun toMessageScopeMessageScopeIterable (Ljava/lang/Iterable;)Lnet/mamoe/mirai/console/util/MessageScope;\n\tpublic static final fun toMessageScopeMessageScopeSequence (Lkotlin/sequences/Sequence;)Lnet/mamoe/mirai/console/util/MessageScope;\n}\n\npublic final class net/mamoe/mirai/console/util/SemVersion : java/lang/Comparable {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/util/SemVersion$Companion;\n\tpublic synthetic fun compareTo (Ljava/lang/Object;)I\n\tpublic fun compareTo (Lnet/mamoe/mirai/console/util/SemVersion;)I\n\tpublic final fun component1 ()I\n\tpublic final fun component2 ()I\n\tpublic final fun component3 ()Ljava/lang/Integer;\n\tpublic final fun component4 ()Ljava/lang/String;\n\tpublic final fun component5 ()Ljava/lang/String;\n\tpublic static final synthetic fun contains (Lnet/mamoe/mirai/console/util/SemVersion$Requirement;Ljava/lang/String;)Z\n\tpublic static final synthetic fun contains (Lnet/mamoe/mirai/console/util/SemVersion$Requirement;Lnet/mamoe/mirai/console/util/SemVersion;)Z\n\tpublic final fun copy (IILjava/lang/Integer;Ljava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/console/util/SemVersion;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/console/util/SemVersion;IILjava/lang/Integer;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/console/util/SemVersion;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun equals (Lnet/mamoe/mirai/console/util/SemVersion;Z)Z\n\tpublic final fun getIdentifier ()Ljava/lang/String;\n\tpublic final fun getMajor ()I\n\tpublic final fun getMetadata ()Ljava/lang/String;\n\tpublic final fun getMinor ()I\n\tpublic final fun getPatch ()Ljava/lang/Integer;\n\tpublic fun hashCode ()I\n\tpublic static final fun parse (Ljava/lang/String;)Lnet/mamoe/mirai/console/util/SemVersion;\n\tpublic static final fun parseRangeRequirement (Ljava/lang/String;)Lnet/mamoe/mirai/console/util/SemVersion$Requirement;\n\tpublic static final fun satisfies (Lnet/mamoe/mirai/console/util/SemVersion;Ljava/lang/String;)Z\n\tpublic static final fun satisfies (Lnet/mamoe/mirai/console/util/SemVersion;Lnet/mamoe/mirai/console/util/SemVersion$Requirement;)Z\n\tpublic static final fun test (Lnet/mamoe/mirai/console/util/SemVersion$Requirement;Ljava/lang/String;)Z\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic final fun toStructuredString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/util/SemVersion$Companion {\n\tpublic final synthetic fun contains (Lnet/mamoe/mirai/console/util/SemVersion$Requirement;Ljava/lang/String;)Z\n\tpublic final synthetic fun contains (Lnet/mamoe/mirai/console/util/SemVersion$Requirement;Lnet/mamoe/mirai/console/util/SemVersion;)Z\n\tpublic final fun parse (Ljava/lang/String;)Lnet/mamoe/mirai/console/util/SemVersion;\n\tpublic final fun parseRangeRequirement (Ljava/lang/String;)Lnet/mamoe/mirai/console/util/SemVersion$Requirement;\n\tpublic final fun satisfies (Lnet/mamoe/mirai/console/util/SemVersion;Ljava/lang/String;)Z\n\tpublic final fun satisfies (Lnet/mamoe/mirai/console/util/SemVersion;Lnet/mamoe/mirai/console/util/SemVersion$Requirement;)Z\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n\tpublic final fun test (Lnet/mamoe/mirai/console/util/SemVersion$Requirement;Ljava/lang/String;)Z\n}\n\npublic final class net/mamoe/mirai/console/util/SemVersion$Requirement {\n\tpublic static final field Companion Lnet/mamoe/mirai/console/util/SemVersion$Requirement$Companion;\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun copy (Ljava/lang/String;)Lnet/mamoe/mirai/console/util/SemVersion$Requirement;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/console/util/SemVersion$Requirement;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/console/util/SemVersion$Requirement;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getRule ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic final fun test (Lnet/mamoe/mirai/console/util/SemVersion;)Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/console/util/SemVersion$Requirement$Companion {\n\tpublic final synthetic fun invoke (Ljava/lang/String;)Lnet/mamoe/mirai/console/util/SemVersion$Requirement;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/console/util/SemVersion$Requirement$RequirementAsStringSerializer : kotlinx/serialization/KSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/util/SemVersion$Requirement$RequirementAsStringSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/console/util/SemVersion$Requirement;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/console/util/SemVersion$Requirement;)V\n}\n\npublic final class net/mamoe/mirai/console/util/SemVersion$SemVersionAsStringSerializer : kotlinx/serialization/KSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/util/SemVersion$SemVersionAsStringSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/console/util/SemVersion;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/console/util/SemVersion;)V\n}\n\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/resources/net/mamoe/mirai/console/internal/enduserreadme/readme.txt",
    "content": "::mirai-console.greeting\n\n欢迎使用 mirai-console。\n在您正式开始使用 mirai-console 前，您需要完整阅读此用户须知。\n\n此用户须知包含 mirai-console 本体及其所安装的插件的用户须知。\n当相关的最终用户须知更新时，mirai-console 只会显示已更新部分，而不会重新完整显示整个用户须知。\n\n::mirai-console.usage\n\n在使用 mirai-console 前，您需要完整阅读用户手册。\n<delay>2\n用户手册地址:\n    GitHub:   https://github.com/mamoe/mirai/blob/dev/docs/UserManual.md\n    VuePress: https://docs.mirai.mamoe.net/UserManual.html\n<delay>3\n当您遇到问题前，请先查阅\n<delay>2\n    常见问题参考: https://docs.mirai.mamoe.net/Questions.html\n<delay>1\n    mirai 历史问题提问: https://github.com/mamoe/mirai/issues?q=is%3Aissue\n<delay>3\n\n如果您使用的 mirai-console 来自一个单独整合包，您需要参考该整合包内的 `readme` 文件\n\n::mirai-console.issuing\n\n在使用 mirai-console 的过程中，您可能会遇到各种问题。\n在您向他人咨询前，您需要做好以下准备。\n<delay>2\n无论是\n<delay>2\n`- 在 mirai 主仓库发起 issue\n<delay>1\n`- 在 mirai 论坛发起帖子\n<delay>1\n`- 在群聊向他人咨询\n<delay>1\n`- 在私聊向他人咨询\n<delay>1\n`- 或者更多\n<delay>1\n您都需要做好以下准备。\n<delay>1\n这不仅能让您更快解决问题，也是对被询问者的尊重。\n<delay>1\n\n1. 说明您正在使用的版本\n<delay>2\n版本号是确定问题的关键信息，\n<delay>1\nmirai-console 的版本号会在 mirai-console 运行时就打印至控制台。\n其他组件版本可以通过执行 /status 命令获取\n\n<delay>3\n2. 携带报错信息 / 携带日志\n<delay>3\n报错信息是分析问题的关键，没有日志相当于闭眼开车。\n<delay>3\n当您咨询时，一定要携带当时的日志\n<delay>3\n「没有日志我能做的事只有帮你算一卦」\n<delay>3\n\n标准的咨询模板参考：\nhttps://github.com/mamoe/mirai/issues/new?template=bug.yml\n\n::mirai-core.EncryptService.alert\n\nReference: https://github.com/mamoe/mirai/releases/tag/v2.15.0\n\n关于包数据加密 / 签名 （Internal）(#2716)\n<delay>2\nmirai 不会内置任何第三方 签名/加密 服务，而是提供 SPI 让用户自行实现。\n<delay>2\nmirai 已经提供了外部 EncryptService SPI 供用户对接。如果您没有能力自行对接，您可以考虑到论坛寻找社区对接。\n<delay>2\n在使用社区服务前，您需要了解并理解以下内容\n<delay>2\n<pause>\n\n1. 确认服务来源\n<delay>2\n   当您安装此服务后，所有的信息都会经过此消息服务。\n   <delay>2\n   这其中包括\n     Bot 的登录请求（包含密码，登录凭证等）\n     <delay>2\n     Bot 发出去的所有信息\n     <delay>2\n     更多.....\n<delay>2\n<pause>\n2. 保护好网络，建立通讯防火墙\n<delay>2\n部分服务通讯链路是无加密的\n<delay>1\n如果您访问的服务位于公开网络，您的数据有被窃取、拦截的风险。\n\n<delay>2\n<pause>\n3. 保护好日志。\n<delay>2\n并非所有日志都能直接传递给他人\n<pause>\n\n在您公开您的日志前，请先对日志中的关键信息进行抹除。\n<pause>\n\n部分相关服务使用 HTTP GET 请求传递数据体，\n当远程服务出错时，服务对接可能会直接将此次请求的连接直接输出到日志中，\n此日志可能包含了此次尝试 签名/加密 的内容，\n而此内容可能包含关键信息。\n<pause>\n\n如果您无法分辨哪些请求需要被抹除时，您可以参考以下规则：\n<pause>\n\n    请求连接包含大量 Hex 文本，抹除 （Hex: 由 0-9 和 ABCDEF 组成的序列 ）\n    <delay>2\n    <pause>\n    请求包含大量 Base64 文本，抹除 （如您不知道什么是 Base64 文本，您可以简单当做是超长的英文与符号组合）\n    <delay>2\n    <pause>\n    请求连接过长，抹除（如连接日志换行了三次都还没有显示完全）\n    <delay>2\n    <pause>\n\n\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/MiraiConsole.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"WRONG_MODIFIER_CONTAINING_DECLARATION\", \"unused\")\n@file:OptIn(ConsoleInternalApi::class)\n\npackage net.mamoe.mirai.console\n\nimport kotlinx.coroutines.*\nimport me.him188.kotlin.dynamic.delegation.dynamicDelegation\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.BotFactory\nimport net.mamoe.mirai.auth.BotAuthorization\nimport net.mamoe.mirai.console.MiraiConsole.INSTANCE\nimport net.mamoe.mirai.console.MiraiConsoleImplementation.Companion.start\nimport net.mamoe.mirai.console.extensions.BotConfigurationAlterer\nimport net.mamoe.mirai.console.fontend.ProcessProgress\nimport net.mamoe.mirai.console.internal.MiraiConsoleImplementationBridge\nimport net.mamoe.mirai.console.internal.extension.GlobalComponentStorage\nimport net.mamoe.mirai.console.plugin.PluginManager\nimport net.mamoe.mirai.console.plugin.center.PluginCenter\nimport net.mamoe.mirai.console.plugin.jvm.JvmPlugin\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader\nimport net.mamoe.mirai.console.plugin.loader.PluginLoader\nimport net.mamoe.mirai.console.util.AnsiMessageBuilder\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.console.util.ConsoleInternalApi\nimport net.mamoe.mirai.console.util.SemVersion\nimport net.mamoe.mirai.utils.*\nimport java.io.File\nimport java.nio.file.Path\nimport java.time.Instant\n\n/**\n * Mirai Console 后端功能入口.\n *\n * # 使用 Mirai Console\n *\n * ## 获取 Mirai Console 后端实例\n *\n * 一般插件开发者只能通过 [MiraiConsole.INSTANCE] 获得 [MiraiConsole] 实例.\n *\n * ## Mirai Console 生命周期\n *\n * [MiraiConsole] 实现[协程作用域][CoroutineScope]. [MiraiConsole] 生命周期与该[协程作用域][CoroutineScope]的相同.\n *\n * 在 [MiraiConsole] 实例构造后就视为*已开始[生存][Job.isActive]*. 随后才会[正式启动][MiraiConsoleImplementation.start] (初始化和加载插件等).\n *\n * [取消 Job][Job.cancel] 时会同时停止 [MiraiConsole], 并进行清理工作 (例如调用 [JvmPlugin.onDisable].\n *\n * ## 获取插件管理器等功能实例\n *\n * [MiraiConsole] 是后端功能入口, 可调用其 [MiraiConsole.pluginManager] 获取到 [PluginManager] 等实例.\n *\n * # 实现 Mirai Console\n *\n * ## 实现 Mirai Console 后端\n *\n * [MiraiConsole] 不可直接实现.\n *\n * 要实现 Mirai Console 后端, 需实现接口 [MiraiConsoleImplementation] 为一个 `class` 切勿实现为 `object`(单例或静态).\n *\n * ## 启动 Mirai Console 后端\n *\n * Mirai Console 后端 (即本 [MiraiConsole] 类实例) 不可单独 (直接) 启动, 需要配合一个任意的前端实现.\n *\n * Mirai Console 的启动时机由前端决定. 前端可在恰当的时机调用 [MiraiConsoleImplementation.start] 来启动一个 [MiraiConsoleImplementation].\n *\n * [MiraiConsoleImplementation] 将会由 [bridge][MiraiConsoleImplementationBridge] 转接为 [MiraiConsole] 实现. 对 [MiraiConsole] 的调用都会被转发到前端实现的 [MiraiConsoleImplementation].\n *\n * @see INSTANCE\n * @see MiraiConsoleImplementation\n */\n@NotStableForInheritance\npublic interface MiraiConsole : CoroutineScope {\n    /**\n     * Console 运行根目录, 由前端决定确切路径.\n     *\n     * 所有子模块都会在这个目录之下创建子目录.\n     *\n     * @see PluginManager.pluginsPath\n     * @see PluginManager.pluginsDataPath\n     * @see PluginManager.pluginsConfigPath\n     */\n    public val rootPath: Path\n\n    /**\n     * Console 主日志.\n     *\n     * **实现细节**: 这个 [MiraiLogger] 的 [MiraiLogger.identity] 通常为 `main`\n     *\n     * **注意**: 插件不应该在任何时刻使用它.\n     */\n    @ConsoleInternalApi\n    public val mainLogger: MiraiLogger\n\n    /**\n     * 内建加载器列表, 一般需要包含 [JvmPluginLoader].\n     *\n     * @return 不可变 [List] ([java.util.Collections.unmodifiableList])\n     */\n    public val builtInPluginLoaders: List<Lazy<PluginLoader<*, *>>>\n\n    /**\n     * 此 Console 后端构建时间\n     */\n    public val buildDate: Instant\n\n    /**\n     * 此 Console 后端版本号\n     */\n    public val version: SemVersion\n\n    /**\n     * [PluginManager] 实例. 在 [MiraiConsole] 生命周期内应保持不变.\n     *\n     * @since 2.10\n     */\n    public val pluginManager: PluginManager\n\n    @ConsoleExperimentalApi\n    public val pluginCenter: PluginCenter\n        get() = throw UnsupportedOperationException(\"PluginCenter is not supported yet\")\n\n    /**\n     * 创建一个 logger. 已弃用. 请使用 [MiraiLogger.Factory.create].\n     */\n    @Deprecated(\n        \"Please use the standard way in mirai-core to create loggers, i.e. MiraiLogger.Factory.INSTANCE.create()\",\n        level = DeprecationLevel.ERROR,\n        replaceWith = ReplaceWith(\n            \"MiraiLogger.Factory.create(yourClass::class, identity)\",\n            \"net.mamoe.mirai.utils.MiraiLogger\"\n        ),\n    )\n    @DeprecatedSinceMirai(warningSince = \"2.13\", errorSince = \"2.14\") // for removal\n    @ConsoleExperimentalApi\n    public fun createLogger(identity: String?): MiraiLogger\n\n    /**\n     * 是否支持使用 Ansi 输出彩色信息\n     *\n     * 注: 不是每个前端都可能提供 `org.fusesource.jansi:jansi` 库支持,\n     * 请不要直接使用 `org.fusesource.jansi:jansi`\n     *\n     * @see [AnsiMessageBuilder]\n     */\n    @ConsoleExperimentalApi\n    public val isAnsiSupported: Boolean\n\n    /**\n     * [MiraiConsole] 唯一实例. 一般插件开发者只能通过 [MiraiConsole.INSTANCE] 获得 [MiraiConsole] 实例.\n     *\n     * 对象以 [bridge][MiraiConsoleImplementationBridge] 实现, 将会桥接特定前端实现的 [MiraiConsoleImplementation] 到 [MiraiConsole].\n     */\n    public companion object INSTANCE : MiraiConsole by dynamicDelegation({\n        @OptIn(ConsoleFrontEndImplementation::class)\n        MiraiConsoleImplementation.getBridge()\n    }) {\n        /**\n         * 获取 [MiraiConsole] 的 [Job]\n         */ // MiraiConsole.INSTANCE.getJob()\n        public val job: Job\n            get() = MiraiConsole.coroutineContext[Job]\n                ?: throw MalformedMiraiConsoleImplementationError(\"Internal error: Job not found in MiraiConsole.coroutineContext\")\n\n        /**\n         * 添加一个 [Bot] 实例到全局 Bot 列表, 但不登录.\n         *\n         * 调用 [Bot.login] 可登录.\n         *\n         * @see Bot.instances 获取现有 [Bot] 实例列表\n         * @see BotConfigurationAlterer ExtensionPoint\n         */\n        // don't static\n        @ConsoleExperimentalApi(\"This is a low-level API and might be removed in the future.\")\n        public fun addBot(id: Long, password: String, configuration: BotConfiguration.() -> Unit = {}): Bot =\n            addBotImpl(id, password, configuration)\n\n        /**\n         * 添加一个 [Bot] 实例到全局 Bot 列表, 但不登录.\n         *\n         * 调用 [Bot.login] 可登录.\n         *\n         * @see Bot.instances 获取现有 [Bot] 实例列表\n         * @see BotConfigurationAlterer ExtensionPoint\n         */\n        @ConsoleExperimentalApi(\"This is a low-level API and might be removed in the future.\")\n        public fun addBot(id: Long, password: ByteArray, configuration: BotConfiguration.() -> Unit = {}): Bot =\n            addBotImpl(id, password, configuration)\n\n        /**\n         * 添加一个 [Bot] 实例到全局 Bot 列表, 但不登录.\n         *\n         * 调用 [Bot.login] 可登录.\n         *\n         * @see Bot.instances 获取现有 [Bot] 实例列表\n         * @see BotConfigurationAlterer ExtensionPoint\n         */\n        @ConsoleExperimentalApi(\"This is a low-level API and might be removed in the future.\")\n        public fun addBot(\n            id: Long,\n            authorization: BotAuthorization,\n            configuration: BotConfiguration.() -> Unit = {}\n        ): Bot = addBotImpl(id, authorization, configuration)\n\n        @OptIn(ConsoleFrontEndImplementation::class)\n        private fun addBotImpl(id: Long, authorization: Any, configuration: BotConfiguration.() -> Unit = {}): Bot {\n            when (authorization) {\n                is String -> {}\n                is ByteArray -> {}\n                is BotAuthorization -> {}\n\n                else -> throw IllegalArgumentException(\"Bad authorization type: `${authorization.javaClass.name}`. Require String, ByteArray or BotAuthorization\")\n            }\n\n            var config = BotConfiguration().apply {\n\n                workingDir = MiraiConsole.rootDir\n                    .resolve(\"bots\")\n                    .resolve(id.toString())\n                    .also { it.mkdirs() }\n\n                mainLogger.verbose { \"Bot $id working in $workingDir\" }\n\n                val deviceInRoot = MiraiConsole.rootDir.resolve(\"device.json\")\n                val deviceInWorkingDir = workingDir.resolve(\"device.json\")\n\n                val deviceInfoInWorkingDir = workingDir.resolve(\"deviceInfo.json\")\n                if (!deviceInWorkingDir.exists()) {\n                    when {\n                        deviceInfoInWorkingDir.exists() -> {\n                            // rename bots/id/deviceInfo.json to bots/id/device.json\n                            mainLogger.verbose { \"Renaming $deviceInfoInWorkingDir to $deviceInWorkingDir\" }\n                            deviceInfoInWorkingDir.renameTo(deviceInWorkingDir)\n                        }\n\n                        deviceInRoot.exists() -> {\n                            // copy root/device.json to bots/id/device.json\n                            mainLogger.verbose { \"Coping $deviceInRoot to $deviceInWorkingDir\" }\n                            deviceInRoot.copyTo(deviceInWorkingDir)\n                        }\n                    }\n                }\n\n                fileBasedDeviceInfo(\"device.json\")\n\n                redirectNetworkLogToDirectory()\n                this.botLoggerSupplier = {\n                    MiraiLogger.Factory.create(Bot::class, \"Bot.${it.id}\")\n                }\n                parentCoroutineContext = MiraiConsole.childScopeContext(\"Bot $id\")\n                autoReconnectOnForceOffline()\n\n                this.loginSolver = MiraiConsoleImplementation.getInstance().createLoginSolver(id, this)\n                configuration()\n            }\n\n            config = GlobalComponentStorage.foldExtensions(BotConfigurationAlterer, config) { acc, extension ->\n                extension.alterConfiguration(id, acc)\n            }\n\n            return when (authorization) {\n                is ByteArray -> BotFactory.newBot(id, authorization, config)            // pwd md5\n                is String -> BotFactory.newBot(id, authorization, config)               // pwd\n                is BotAuthorization -> BotFactory.newBot(id, authorization, config)     // authorization\n                else -> error(\"assert\")\n            }\n        }\n\n        @ConsoleExperimentalApi(\"This is a low-level API and might be removed in the future.\")\n        public val isActive: Boolean\n            get() = job.isActive\n\n        /**\n         * 停止 Console 运行\n         *\n         * Console 会在一个合适的时间进行关闭, 并不是调用马上关闭 Console\n         */\n        @ConsoleExperimentalApi\n        @JvmStatic\n        public fun shutdown() {\n            val consoleJob = job\n            if (!consoleJob.isActive) return\n            @OptIn(DelicateCoroutinesApi::class, ConsoleFrontEndImplementation::class)\n            GlobalScope.launch {\n                MiraiConsoleImplementation.shutdown()\n            }\n        }\n\n        /**\n         * 创建一个新的处理进度, 此进度将会在前端显示, 并且此进度需要[手动关闭][ProcessProgress.close]\n         *\n         * 注: 此 API 应该只在以下情况使用\n         *\n         * - 插件初始化 (包括 onLoad, onEnable)\n         * - 命令执行中 (控制台)\n         *\n         * 在其他情况使用可能会导致意外的情况\n         *\n         * // implementation note:\n         * 在 Terminal 前端中, 有处理进度存在时会停止命令输入 (即停止命令执行)\n         */\n        @ConsoleExperimentalApi\n        @JvmStatic\n        public fun newProcessProgress(): ProcessProgress {\n            @OptIn(ConsoleFrontEndImplementation::class)\n            return MiraiConsoleImplementation.getInstance().createNewProcessProgress()\n        }\n    }\n\n\n}\n\n/**\n * @see MiraiConsole.rootPath\n */\npublic val MiraiConsole.rootDir: File get() = rootPath.toFile()\n\n/**\n * [MiraiConsoleImplementation] 实现有误时抛出.\n *\n * @see MiraiConsoleImplementation.start\n */\npublic class MalformedMiraiConsoleImplementationError : Error {\n    public constructor() : super()\n    public constructor(message: String?) : super(message)\n    public constructor(message: String?, cause: Throwable?) : super(message, cause)\n    public constructor(cause: Throwable?) : super(cause)\n}\n\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/MiraiConsoleFrontEndDescription.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console\n\nimport net.mamoe.mirai.console.util.SemVersion\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\n\n\n/**\n * 有关前端实现的信息\n */\npublic interface MiraiConsoleFrontEndDescription {\n    /**\n     * 此前端实现的名称\n     */\n    public val name: String\n\n    /**\n     * 此前端实现的提供者\n     */\n    public val vendor: String\n\n    /**\n     * 此前端实现的名称\n     */\n    public val version: SemVersion\n\n    /**\n     * 兼容的 [MiraiConsole] 后端版本号\n     *\n     * 如 `Semver(\"[1.0.0, 2.0.0)\", Semver.SemverType.IVY)`\n     *\n     * 返回 `null` 表示禁止 [MiraiConsole] 后端检查版本兼容性.\n     */\n    @MiraiExperimentalApi\n    public val compatibleBackendVersion: SemVersion?\n        get() = null\n\n    /**\n     * 返回显示在 [MiraiConsole] 启动时的信息\n     */\n    public fun render(): String = \"Frontend ${name}: version ${version}, provided by $vendor\"\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/MiraiConsoleImplementation.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console\n\nimport kotlinx.atomicfu.locks.withLock\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.console.MiraiConsoleImplementation.Companion.start\nimport net.mamoe.mirai.console.command.CommandManager\nimport net.mamoe.mirai.console.command.ConsoleCommandSender\nimport net.mamoe.mirai.console.data.AutoSavePluginDataHolder\nimport net.mamoe.mirai.console.data.PluginConfig\nimport net.mamoe.mirai.console.data.PluginData\nimport net.mamoe.mirai.console.data.PluginDataStorage\nimport net.mamoe.mirai.console.extension.ComponentStorage\nimport net.mamoe.mirai.console.fontend.DefaultLoggingProcessProgress\nimport net.mamoe.mirai.console.fontend.ProcessProgress\nimport net.mamoe.mirai.console.internal.MiraiConsoleImplementationBridge\nimport net.mamoe.mirai.console.internal.command.CommandManagerImpl\nimport net.mamoe.mirai.console.internal.data.builtins.ConsoleDataScopeImpl\nimport net.mamoe.mirai.console.internal.logging.LoggerControllerImpl\nimport net.mamoe.mirai.console.internal.plugin.BuiltInJvmPluginLoaderImpl\nimport net.mamoe.mirai.console.internal.plugin.impl\nimport net.mamoe.mirai.console.internal.pluginManagerImpl\nimport net.mamoe.mirai.console.logging.LoggerController\nimport net.mamoe.mirai.console.plugin.Plugin\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader\nimport net.mamoe.mirai.console.plugin.loader.PluginLoader\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.console.util.ConsoleInput\nimport net.mamoe.mirai.console.util.ConsoleInternalApi\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.utils.*\nimport java.nio.file.Path\nimport java.util.*\nimport java.util.concurrent.locks.ReentrantLock\nimport kotlin.annotation.AnnotationTarget.*\nimport kotlin.concurrent.thread\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.reflect.KClass\n\n\n/**\n * 标记一个仅用于 [MiraiConsole] 前端实现的 API.\n *\n * 这些 API 只应由前端实现者使用, 而不应该被插件或其他调用者使用.\n */\n@Retention(AnnotationRetention.BINARY)\n@RequiresOptIn(level = RequiresOptIn.Level.ERROR)\n@Target(CLASS, TYPEALIAS, FUNCTION, PROPERTY, FIELD, CONSTRUCTOR)\n@MustBeDocumented\n@ConsoleFrontEndImplementation\npublic annotation class ConsoleFrontEndImplementation\n\n/**\n * 实现 [MiraiConsole] 的接口\n *\n * **注意**: 随着 Console 的更新, 在版本号 `x.y.z` 的 `y` 修改时此接口可能就会发生 ABI 变动. 意味着前端实现着需要跟随 Console 更新.\n *\n * @see MiraiConsoleImplementation.start 启动\n */\n@ConsoleFrontEndImplementation\npublic interface MiraiConsoleImplementation : CoroutineScope {\n    /**\n     * 获取原始 [MiraiConsoleImplementation] 实例.\n     *\n     * [MiraiConsoleImplementation.start] 实际上会创建 [MiraiConsoleImplementationBridge] 并启动该 bridge, 不会直接使用提供的 [MiraiConsoleImplementation] 实例.\n     * [MiraiConsoleImplementation.getInstance] 获取到的将会是 bridge. 可通过 `bridge.origin` 获取原始在 [start] 传递的实例.\n     *\n     * @since 2.11.0-RC\n     */\n    public val origin: MiraiConsoleImplementation get() = this\n\n    /**\n     * [MiraiConsole] 的 [CoroutineScope.coroutineContext], 必须拥有如下元素\n     *\n     * - [Job]: 用于管理整个 [MiraiConsole] 的生命周期. 当此 [Job] 被 [Job.cancel] 后, [MiraiConsole] 就会结束.\n     * - [CoroutineExceptionHandler]: 用于处理 [MiraiConsole] 所有协程抛出的 **未被捕捉** 的异常. 不是所有异常都会被传递到这里.\n     */\n    public override val coroutineContext: CoroutineContext\n\n    /**\n     * Console 运行根目录绝对路径 (否则可能会被一些 native 插件覆盖相对路径)\n     * @see MiraiConsole.rootPath 获取更多信息\n     */\n    public val rootPath: Path\n\n    /**\n     * 本前端实现的描述信息\n     */\n    public val frontEndDescription: MiraiConsoleFrontEndDescription\n\n    /**\n     * 内建加载器列表, 一般需要包含 [JvmPluginLoader].\n     *\n     * @return 不可变的 [List], [Collections.unmodifiableList]\n     */\n    public val builtInPluginLoaders: List<Lazy<PluginLoader<*, *>>>\n\n    /**\n     * [JvmPluginLoader] 实例. 建议实现为 lazy:\n     *\n     * ```\n     * override val jvmPluginLoader: JvmPluginLoader by lazy { backendAccess.createDefaultJvmPluginLoader(coroutineContext) }\n     * ```\n     *\n     * @see BackendAccess.createDefaultJvmPluginLoader\n     * @since 2.10.0-RC\n     */\n    public val jvmPluginLoader: JvmPluginLoader\n\n    /**\n     * 由 Kotlin 用户实现\n     *\n     * @see [ConsoleCommandSender]\n     */\n    @ConsoleFrontEndImplementation\n    public interface ConsoleCommandSenderImpl {\n        @JvmSynthetic\n        public suspend fun sendMessage(message: Message)\n\n        @JvmSynthetic\n        public suspend fun sendMessage(message: String)\n    }\n\n    /**\n     * 由 Java 用户实现\n     *\n     * @see [ConsoleCommandSender]\n     */\n    @Suppress(\"INAPPLICABLE_JVM_NAME\")\n    @ConsoleFrontEndImplementation\n    public interface JConsoleCommandSenderImpl : ConsoleCommandSenderImpl {\n        @JvmName(\"sendMessage\")\n        public fun sendMessageJ(message: Message)\n\n        @JvmName(\"sendMessage\")\n        public fun sendMessageJ(message: String)\n\n\n        @JvmSynthetic\n        public override suspend fun sendMessage(message: Message): Unit =\n            withContext(Dispatchers.IO) { sendMessageJ(message) }\n\n        @JvmSynthetic\n        public override suspend fun sendMessage(message: String): Unit =\n            withContext(Dispatchers.IO) { sendMessageJ(message) }\n    }\n\n    /**\n     * [ConsoleCommandSender]\n     */\n    public val consoleCommandSender: ConsoleCommandSenderImpl\n\n    /**\n     * [CommandManager] 实现, 建议实现为 lazy:\n     * ```\n     * override val commandManager: CommandManager by lazy { backendAccess.createDefaultCommandManager(coroutineContext) }\n     * ```\n     *\n     * @since 2.10.0-RC\n     * @see BackendAccess.createDefaultCommandManager\n     */\n    public val commandManager: CommandManager\n\n    @ConsoleExperimentalApi\n    public val dataStorageForJvmPluginLoader: PluginDataStorage\n\n    @ConsoleExperimentalApi\n    public val configStorageForJvmPluginLoader: PluginDataStorage\n\n    @ConsoleExperimentalApi\n    public val dataStorageForBuiltIns: PluginDataStorage\n\n    @ConsoleExperimentalApi\n    public val configStorageForBuiltIns: PluginDataStorage\n\n    /**\n     * @see ConsoleInput 的实现\n     * @see JConsoleInput\n     */\n    public val consoleInput: ConsoleInput\n\n    /**\n     * 供 Java 用户实现 [ConsoleInput]\n     */\n    @Suppress(\"INAPPLICABLE_JVM_NAME\")\n    @ConsoleFrontEndImplementation\n    public interface JConsoleInput : ConsoleInput {\n        /**\n         * @see ConsoleInput.requestInput\n         */\n        @JvmName(\"requestInput\")\n        public fun requestInputJ(hint: String): String\n\n        override suspend fun requestInput(hint: String): String {\n            return runInterruptible(Dispatchers.IO) { requestInputJ(hint) }\n        }\n    }\n\n    /**\n     * 创建一个 [LoginSolver]\n     *\n     * **备注**: 此函数通常在构造 [Bot] 实例, 即 [MiraiConsole.addBot] 时调用.\n     *\n     * @param requesterBot 请求者 [Bot.id]\n     * @param configuration 请求者 [Bot.configuration]\n     *\n     * @see LoginSolver.Default\n     */\n    public fun createLoginSolver(requesterBot: Long, configuration: BotConfiguration): LoginSolver\n\n    /** @see [MiraiConsole.newProcessProgress] */\n    public fun createNewProcessProgress(): ProcessProgress {\n        return DefaultLoggingProcessProgress()\n    }\n\n\n    /**\n     * 该前端是否支持使用 Ansi 输出彩色信息\n     *\n     * 注: 若为 `true`, 建议携带 `org.fusesource.jansi:jansi`\n     */\n    public val isAnsiSupported: Boolean get() = false\n\n    /**\n     * 前端预先定义的 [LoggerController], 以允许前端使用自己的配置系统\n     */\n    @ConsoleExperimentalApi\n    public val loggerController: LoggerController get() = LoggerControllerImpl()\n\n    ///////////////////////////////////////////////////////////////////////////\n    // ConsoleDataScope\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * Mirai Console 内置的一些 [PluginConfig] 和 [PluginData] 的管理器.\n     *\n     * 建议实现为 lazy:\n     * ```\n     * override val consoleDataScope: MiraiConsoleImplementation.ConsoleDataScope by lazy {\n     *     MiraiConsoleImplementation.ConsoleDataScope.createDefault(\n     *         coroutineContext,\n     *         dataStorageForBuiltIns,\n     *         configStorageForBuiltIns\n     *     )\n     * }\n     * ```\n     *\n     * @since 2.10.0-RC\n     */\n    public val consoleDataScope: ConsoleDataScope\n\n    /**\n     * Mirai Console 内置的一些 [PluginConfig] 和 [PluginData] 的管理器.\n     *\n     * @since 2.10.0-RC\n     */\n    @ConsoleFrontEndImplementation\n    @NotStableForInheritance\n    public interface ConsoleDataScope {\n        @ConsoleExperimentalApi\n        public val dataHolder: AutoSavePluginDataHolder\n\n        @ConsoleExperimentalApi\n        public val configHolder: AutoSavePluginDataHolder\n        public fun addAndReloadConfig(config: PluginConfig)\n\n        /**\n         * @since 2.11.0-RC\n         */\n        public fun <T : PluginData> find(type: KClass<T>): T?\n\n        /**\n         * @since 2.11.0-RC\n         */\n        public fun <T : PluginData> get(type: KClass<T>): T =\n            find(type) ?: throw NoSuchElementException(type.qualifiedName)\n\n        public fun reloadAll()\n\n        /**\n         * @since 2.10.0-RC\n         */\n        @ConsoleFrontEndImplementation\n        public companion object {\n            /**\n             * @since 2.11.0-RC\n             */\n            public inline fun <reified T : PluginData> ConsoleDataScope.find(): T? = find(T::class)\n\n            /**\n             * @since 2.11.0-RC\n             */\n            public inline fun <reified T : PluginData> ConsoleDataScope.get(): T = get(T::class)\n\n            @ConsoleExperimentalApi\n            @JvmStatic\n            public fun createDefault(\n                coroutineContext: CoroutineContext,\n                dataStorage: PluginDataStorage,\n                configStorage: PluginDataStorage\n            ): ConsoleDataScope = ConsoleDataScopeImpl(coroutineContext, dataStorage, configStorage)\n        }\n    }\n\n\n    /// Hooks & Backend Access\n    /**\n     * 后端 在 [phase] 阶段执行前会调用此方法, 如果此方法抛出了一个错误会直接中断 console 初始化\n     *\n     * @since 2.5.0-dev-2\n     */\n    public fun prePhase(phase: String) {}\n\n    /**\n     * 后端 在 [phase] 阶段执行后会调用此方法, 如果此方法抛出了一个错误会直接中断 console 初始化\n     *\n     * @since 2.5.0-dev-2\n     */\n    public fun postPhase(phase: String) {}\n\n    /**\n     * 后端在 [start] 前会调用此方法\n     *\n     * @since 2.5.0-dev-2\n     */\n    public fun preStart() {}\n\n    /**\n     * 后端在 [start] 后会调用此方法\n     *\n     * @since 2.5.0-dev-2\n     */\n    public fun postStart() {}\n\n    /**\n     * 前端访问后端内部实现的桥\n     *\n     * @see backendAccess\n     * @since 2.5.0-dev-2\n     */\n    @ConsoleFrontEndImplementation\n    public interface BackendAccess {\n        // GlobalComponentStorage\n        /**\n         * 在 Mirai Console 第一个 phase 之后会包含内建 storages.\n         */\n        public val globalComponentStorage: ComponentStorage\n\n        // PluginManagerImpl.resolvedPlugins\n        public val resolvedPlugins: MutableList<Plugin>\n\n        /**\n         * @since 2.10.0-RC\n         */\n        public fun createDefaultJvmPluginLoader(coroutineContext: CoroutineContext): JvmPluginLoader =\n            BuiltInJvmPluginLoaderImpl(coroutineContext + MiraiConsole.pluginManager.impl.coroutineContext.job)\n\n        /**\n         * @since 2.10.0-RC\n         */\n        public fun createDefaultCommandManager(coroutineContext: CoroutineContext): CommandManager =\n            CommandManagerImpl(coroutineContext)\n    }\n\n    /**\n     * @see BackendAccess\n     * @since 2.5.0-dev-2\n     * @throws IllegalStateException 当前端实例不是 `this` 时抛出\n     */\n    public val backendAccess: BackendAccess\n        get() = backendAccessInstance\n\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Logging\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 创建一个 [MiraiLogger.Factory].\n     *\n     * @since 2.13\n     */\n    public fun createLoggerFactory(context: FrontendLoggingInitContext): MiraiLogger.Factory\n\n    /**\n     * 前端 [MiraiLogger.Factory] 加载的上下文\n     *\n     * 全局的日志工厂的初始化可以分为如下几步\n     *\n     * 1. 接管 stdout (见 [System.setOut]), 将 stdout 重定向至屏幕.\n     *    之后平台日志实现会将日志通过被接管的 stdout 输出至屏幕\n     * 2. 前端返回 [platformImplementation][acquirePlatformImplementation] 或者返回适配的 [MiraiLogger.Factory]\n     */\n    @ConsoleFrontEndImplementation\n    public interface FrontendLoggingInitContext {\n        /**\n         * 平台的日志实现, 这可能是使用 SLF4J 等日志框架转接的实例.\n         *\n         * 调用此函数会立即初始化平台日志实现. 在未完成准备工作前切勿使用此方法\n         */\n        public fun acquirePlatformImplementation(): MiraiLogger.Factory\n\n        /**\n         * 在完成 [MiraiLogger.Factory] 接管后马上执行 [action]\n         */\n        public fun invokeAfterInitialization(action: () -> Unit)\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // ConsoleLaunchOptions\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * Console 启动参数, 修改参数会改变默认行为\n     * @since 2.10.0-RC\n     */\n    public class ConsoleLaunchOptions {\n        @JvmField\n        public var crashWhenPluginLoadFailed: Boolean = false\n    }\n\n    public val consoleLaunchOptions: ConsoleLaunchOptions\n        get() = ConsoleLaunchOptions()\n\n    @ConsoleFrontEndImplementation\n    public companion object {\n        private val backendAccessInstance = object : BackendAccess {\n            override val globalComponentStorage: ComponentStorage get() = getBridge().globalComponentStorage\n            override val resolvedPlugins: MutableList<Plugin> get() = MiraiConsole.pluginManagerImpl.resolvedPlugins\n        }\n\n        internal suspend fun shutdown() {\n            val bridge = currentBridge ?: return\n            if (!bridge.isActive) return\n            bridge.shutdownDaemon.tryStart()\n\n            Bot.instances.forEach { bot ->\n                lateinit var logger: MiraiLogger\n                kotlin.runCatching {\n                    logger = bot.logger\n                    bot.closeAndJoin()\n                }.onFailure { t ->\n                    kotlin.runCatching { logger.error(\"Error in closing bot\", t) }\n                }\n            }\n            MiraiConsole.job.cancelAndJoin()\n        }\n\n        init {\n            Runtime.getRuntime().addShutdownHook(thread(false, name = \"Mirai Console Shutdown Hook\") {\n                if (instanceInitialized) {\n                    try {\n                        runBlocking {\n                            shutdown()\n                        }\n                    } catch (_: InterruptedException) {\n\n                    }\n                }\n            })\n        }\n\n        @Volatile\n        internal var currentBridge: MiraiConsoleImplementationBridge? = null\n        internal val instanceInitialized: Boolean get() = currentBridge != null\n\n        private val initLock = ReentrantLock()\n\n        /**\n         * 可由前端调用, 获取当前的 [MiraiConsoleImplementation] 实例. 注意该实例不是 [start] 时传递的实例, 而会是 [MiraiConsoleImplementationBridge].\n         *\n         * 必须在 [start] 之后才能使用, 否则抛出 [UninitializedPropertyAccessException].\n         */\n        @JvmStatic\n        @ConsoleFrontEndImplementation\n        public fun getInstance(): MiraiConsoleImplementation =\n            currentBridge ?: throw UninitializedPropertyAccessException()\n\n        /**\n         * @since 2.11\n         */\n        internal fun getBridge(): MiraiConsoleImplementationBridge =\n            currentBridge ?: throw UninitializedPropertyAccessException()\n\n        /** 由前端调用, 初始化 [MiraiConsole] 实例并启动 */\n        @OptIn(ConsoleInternalApi::class)\n        @JvmStatic\n        @ConsoleFrontEndImplementation\n        @Throws(MalformedMiraiConsoleImplementationError::class)\n        public fun MiraiConsoleImplementation.start(): Unit = initLock.withLock {\n            val currentBridge = currentBridge\n            if (currentBridge != null && currentBridge.isActive) {\n                error(\n                    \"Mirai Console is already initialized and is currently running. \" +\n                            \"Run MiraiConsole.cancel to kill old instance before starting another instance.\"\n                )\n            }\n            val newBridge = MiraiConsoleImplementationBridge(this)\n            this@Companion.currentBridge = newBridge\n            kotlin.runCatching {\n                newBridge.doStart()\n            }.onFailure { e ->\n                kotlin.runCatching {\n                    MiraiConsole.mainLogger.error(\"Failed to init MiraiConsole.\", e)\n                }.onFailure {\n                    e.printStackTrace()\n                }\n\n                kotlin.runCatching {\n                    MiraiConsole.cancel()\n                }.onFailure {\n                    it.printStackTrace()\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/AbstractCommand.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.command\n\nimport net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors\nimport net.mamoe.mirai.console.internal.command.findOrCreateCommandPermission\nimport net.mamoe.mirai.console.permission.Permission\n\n/**\n * [Command] 的基础实现\n *\n * @see SimpleCommand\n * @see CompositeCommand\n * @see RawCommand\n */\npublic abstract class AbstractCommand\n@JvmOverloads constructor(\n    public final override val owner: CommandOwner,\n    public final override val primaryName: String,\n    public final override val secondaryNames: Array<out String>,\n    public override val description: String = \"<no description available>\",\n    parentPermission: Permission = owner.parentPermission,\n) : Command {\n\n    @ExperimentalCommandDescriptors\n    override val prefixOptional: Boolean\n        get() = false\n\n    init {\n        Command.checkCommandName(primaryName)\n        secondaryNames.forEach(Command.Companion::checkCommandName)\n    }\n\n    public override val usage: String get() = description\n    public override val permission: Permission by lazy { findOrCreateCommandPermission(parentPermission) }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/BuiltInCommands.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ConsoleFrontEndImplementation::class)\n\npackage net.mamoe.mirai.console.command\n\nimport kotlinx.coroutines.DelicateCoroutinesApi\nimport kotlinx.coroutines.GlobalScope\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport net.mamoe.mirai.console.MiraiConsoleImplementation.ConsoleDataScope.Companion.get\nimport net.mamoe.mirai.console.command.CommandManager.INSTANCE.allRegisteredCommands\nimport net.mamoe.mirai.console.command.CommandManager.INSTANCE.register\nimport net.mamoe.mirai.console.command.descriptor.CommandArgumentParserException\nimport net.mamoe.mirai.console.command.descriptor.CommandValueArgumentParser.Companion.map\nimport net.mamoe.mirai.console.command.descriptor.PermissionIdValueArgumentParser\nimport net.mamoe.mirai.console.command.descriptor.PermitteeIdValueArgumentParser\nimport net.mamoe.mirai.console.command.descriptor.buildCommandArgumentContext\nimport net.mamoe.mirai.console.extensions.PermissionServiceProvider\nimport net.mamoe.mirai.console.internal.MiraiConsoleBuildConstants\nimport net.mamoe.mirai.console.internal.command.builtin.LoginCommandImpl\nimport net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig\nimport net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.*\nimport net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.PasswordKind.PLAIN\nimport net.mamoe.mirai.console.internal.data.builtins.DataScope\nimport net.mamoe.mirai.console.internal.extension.GlobalComponentStorage\nimport net.mamoe.mirai.console.internal.permission.BuiltInPermissionService\nimport net.mamoe.mirai.console.internal.permission.getPermittedPermissionsAndSource\nimport net.mamoe.mirai.console.internal.plugin.JvmPluginInternal\nimport net.mamoe.mirai.console.internal.plugin.MiraiConsoleAsPlugin\nimport net.mamoe.mirai.console.internal.pluginManagerImpl\nimport net.mamoe.mirai.console.internal.util.runIgnoreException\nimport net.mamoe.mirai.console.permission.Permission\nimport net.mamoe.mirai.console.permission.PermissionId\nimport net.mamoe.mirai.console.permission.PermissionService\nimport net.mamoe.mirai.console.permission.PermissionService.Companion.cancel\nimport net.mamoe.mirai.console.permission.PermissionService.Companion.findCorrespondingPermissionOrFail\nimport net.mamoe.mirai.console.permission.PermissionService.Companion.hasPermission\nimport net.mamoe.mirai.console.permission.PermissionService.Companion.permit\nimport net.mamoe.mirai.console.permission.PermitteeId\nimport net.mamoe.mirai.console.plugin.name\nimport net.mamoe.mirai.console.plugin.version\nimport net.mamoe.mirai.console.util.*\nimport net.mamoe.mirai.event.events.EventCancelledException\nimport net.mamoe.mirai.utils.BotConfiguration\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport java.lang.management.ManagementFactory\nimport java.lang.management.MemoryMXBean\nimport java.lang.management.MemoryUsage\nimport java.time.ZoneId\nimport java.time.format.DateTimeFormatter\nimport kotlin.system.exitProcess\n\n\n@ConsoleExperimentalApi\n@Suppress(\"EXPOSED_SUPER_INTERFACE\")\npublic interface BuiltInCommand : Command\n\n// for identification\n@OptIn(ConsoleExperimentalApi::class)\ninternal interface BuiltInCommandInternal : Command, BuiltInCommand\n\n/**\n * 内建指令列表\n *\n * [查看文档](https://github.com/mamoe/mirai-console/docs/BuiltInCommands.md)\n */\n@Suppress(\"unused\", \"RESTRICTED_CONSOLE_COMMAND_OWNER\")\npublic object BuiltInCommands {\n    @ConsoleExperimentalApi\n    public val parentPermission: Permission by lazy {\n        PermissionService.INSTANCE.register(\n            ConsoleCommandOwner.permissionId(\"*\"),\n            \"The parent of any built-in commands\"\n        )\n    }\n\n    internal val all: Array<out Command> by lazy {\n        this::class.nestedClasses.mapNotNull { it.objectInstance as? Command }.toTypedArray()\n    }\n\n    internal fun registerAll() {\n        BuiltInCommands::class.nestedClasses.forEach {\n            (it.objectInstance as? Command)?.register()\n        }\n    }\n\n    public object HelpCommand : SimpleCommand(\n        ConsoleCommandOwner, \"help\",\n        description = \"查看指令帮助\",\n    ), BuiltInCommandInternal {\n\n        /**\n         * @since 2.8.0\n         */\n        // for https://github.com/mamoe/mirai-console/issues/416\n        @JvmStatic\n        public fun generateDefaultHelp(permitteeId: PermitteeId): String {\n            return allRegisteredCommands\n                .asSequence()\n                .filter { permitteeId.hasPermission(it.permission) }\n                .joinToString(\"\\n\\n\") { command ->\n                    val lines = command.usage.lines()\n                    if (lines.isEmpty()) \"/${command.primaryName} ${command.description}\"\n                    else\n                        \"◆ \" + lines.first() + \"\\n\" + lines.drop(1).joinToString(\"\\n\") { \"  $it\" }\n                }.lines().filterNot(String::isBlank).joinToString(\"\\n\")\n        }\n\n        @Handler\n        public suspend fun CommandSender.handle() {\n            sendMessage(generateDefaultHelp(this.permitteeId))\n        }\n    }\n\n    public object StopCommand : SimpleCommand(\n        ConsoleCommandOwner, \"stop\", \"shutdown\", \"exit\",\n        description = \"关闭 Mirai Console\",\n    ), BuiltInCommandInternal {\n\n        private val closingLock = Mutex()\n\n        @OptIn(\n            DelicateCoroutinesApi::class, ConsoleFrontEndImplementation::class, ConsoleExperimentalApi::class,\n            ConsoleInternalApi::class\n        )\n        @Handler\n        public suspend fun CommandSender.handle() {\n            GlobalScope.launch {\n                kotlin.runCatching {\n                    closingLock.withLock {\n                        if (!MiraiConsole.isActive) return@withLock\n                        sendMessage(\"Stopping mirai-console\")\n                        kotlin.runCatching {\n                            MiraiConsoleImplementation.shutdown()\n                        }.fold(\n                            onSuccess = {\n                                runIgnoreException<EventCancelledException> { sendMessage(\"mirai-console stopped successfully.\") }\n                            },\n                            onFailure = {\n                                @OptIn(ConsoleInternalApi::class)\n                                MiraiConsole.mainLogger.error(\"Exception in stop\", it)\n                                runIgnoreException<EventCancelledException> {\n                                    sendMessage(\n                                        it.localizedMessage ?: it.message ?: it.toString()\n                                    )\n                                }\n                            }\n                        )\n                    }\n                }.exceptionOrNull()?.let(MiraiConsole.mainLogger::error)\n                exitProcess(0)\n            }\n        }\n    }\n\n    public object LogoutCommand : SimpleCommand(\n        ConsoleCommandOwner, \"logout\", \"登出\",\n        description = \"登出一个账号\",\n    ), BuiltInCommandInternal {\n\n        @OptIn(ConsoleExperimentalApi::class)\n        @Handler\n        public suspend fun CommandSender.handle(\n            @Name(\"qq\") id: Long\n        ) {\n            if (Bot.getInstanceOrNull(id)?.close() == null) {\n                sendMessage(\"$id 未登录\")\n            } else {\n                sendMessage(\"$id 已登出\")\n            }\n        }\n    }\n\n    private val loginCommandInstance = LoginCommandImpl()\n\n    public object LoginCommand : SimpleCommand(\n        ConsoleCommandOwner, loginCommandInstance.primaryName, * loginCommandInstance.secondaryNames,\n        description = loginCommandInstance.description,\n    ), BuiltInCommandInternal {\n\n        @OptIn(ConsoleExperimentalApi::class)\n        @Handler\n        @JvmOverloads\n        public suspend fun CommandSender.handle(\n            @Name(\"qq\") id: Long,\n            password: String? = null,\n            protocol: BotConfiguration.MiraiProtocol? = null,\n        ) {\n            loginCommandInstance.run {\n                handle(id, password, protocol)\n            }\n        }\n    }\n\n    public object PermissionCommand : CompositeCommand(\n        ConsoleCommandOwner, \"permission\", \"权限\", \"perm\",\n        description = \"管理权限\",\n        overrideContext = buildCommandArgumentContext {\n            PermitteeId::class with PermitteeIdValueArgumentParser\n            Permission::class with PermissionIdValueArgumentParser.map { id ->\n                kotlin.runCatching {\n                    id.findCorrespondingPermissionOrFail()\n                }.getOrElse { throw CommandArgumentParserException(\"指令不存在: $id\", it) }\n            }\n        },\n    ), BuiltInCommandInternal {\n        // TODO: 2020/9/10 improve Permission command\n\n        /* 用于解析权限继承关系 */\n        private class PermTree(\n            val perm: Permission,\n            val sub: MutableList<PermissionId> = mutableListOf(),\n            var linked: Boolean = false,\n            var implicit: Boolean = false,\n            val source: MutableList<PermitteeId> = mutableListOf(),\n        ) {\n            companion object {\n                fun sortView(view: PermTree) {\n                    view.sub.sortWith { p1, p2 ->\n                        val namespaceCompare = p1.namespace compareTo p2.namespace\n                        if (namespaceCompare != 0) return@sortWith namespaceCompare\n\n                        if (p1.name == p2.name) return@sortWith 0 // ?\n                        if (p1.name == \"*\") return@sortWith -1\n                        if (p2.name == \"*\") return@sortWith 1\n\n                        return@sortWith p1.name compareTo p2.name\n                    }\n                }\n            }\n        }\n\n        private fun renderDepth(depth: Int, sb: AnsiMessageBuilder) {\n            repeat(depth) { sb.append(\" | \") }\n        }\n\n\n        @OptIn(ConsoleExperimentalApi::class)\n        @Description(\"授权一个权限\")\n        @SubCommand(\"permit\", \"grant\", \"add\")\n        public suspend fun CommandSender.permit(\n            @Name(\"被许可人 ID\") target: PermitteeId,\n            @Name(\"权限 ID\") permission: Permission,\n        ) {\n            target.permit(permission)\n            sendMessage(\"OK\")\n        }\n\n        @OptIn(ConsoleExperimentalApi::class)\n        @Description(\"撤销一个权限\")\n        @SubCommand(\"cancel\", \"deny\", \"remove\")\n        public suspend fun CommandSender.cancel(\n            @Name(\"被许可人 ID\") target: PermitteeId,\n            @Name(\"权限 ID\") permission: Permission,\n        ) {\n            target.cancel(permission, false)\n            sendMessage(\"OK\")\n        }\n\n        @OptIn(ConsoleExperimentalApi::class)\n        @Description(\"撤销一个权限及其所有子权限\")\n        @SubCommand(\"cancelAll\", \"denyAll\", \"removeAll\")\n        public suspend fun CommandSender.cancelAll(\n            @Name(\"被许可人 ID\") target: PermitteeId,\n            @Name(\"权限 ID\") permission: Permission,\n        ) {\n            target.cancel(permission, true)\n            sendMessage(\"OK\")\n        }\n\n        @OptIn(ConsoleExperimentalApi::class)\n        @Description(\"查看被授权权限列表\")\n        @SubCommand(\"permittedPermissions\", \"pp\", \"grantedPermissions\", \"gp\")\n        public suspend fun CommandSender.permittedPermissions(\n            @Name(\"被许可人 ID\") target: PermitteeId,\n            @Name(\"显示全部\") all: Boolean = true,\n        ) {\n            val grantedPermissions = target.getPermittedPermissionsAndSource().toList()\n            if (grantedPermissions.isEmpty()) {\n                sendMessage(\"${target.asString()} 未被授予任何权限. 使用 `${CommandManager.commandPrefix}permission grant` 给予权限.\")\n            } else if (all) {\n                val allPermissions = PermissionService.INSTANCE.getRegisteredPermissions().toList()\n                val permMapping = mutableMapOf<PermissionId, PermTree>()\n                grantedPermissions.forEach { (source, granted) ->\n                    val m = permMapping[granted.id] ?: kotlin.run {\n                        PermTree(granted).also { it.implicit = false; permMapping[granted.id] = it }\n                    }\n                    m.source.add(source)\n                }\n                val root = PermissionService.INSTANCE.rootPermission\n                fun linkPmTree(permTree: PermTree) {\n                    allPermissions.forEach { perm ->\n                        if (perm.id == root.id) return@forEach\n                        if (perm.parent.id == permTree.perm.id) {\n                            permTree.sub.add(perm.id)\n                            val subp = permMapping[perm.id] ?: kotlin.run {\n                                val p = PermTree(perm)\n                                p.implicit = true\n                                permMapping[perm.id] = p\n                                linkPmTree(p)\n                                p\n                            }\n                            subp.linked = true\n                        }\n                    }\n                }\n                permMapping.values.toList().forEach { linkPmTree(it) }\n                permMapping.values.forEach { PermTree.sortView(it) }\n\n                @Suppress(\"LocalVariableName\")\n                val BG_BLACK = \"\\u001B[40m\"\n                fun render(depth: Int, view: PermTree, sb: AnsiMessageBuilder) {\n                    if (view.implicit) {\n                        sb.gray()\n                        sb.append(view.perm.id)\n                        sb.append(\" (implicit)\\n\")\n                        sb.reset().white().ansi(BG_BLACK)\n                    } else {\n                        sb.append(view.perm.id)\n                        if (view.source.isNotEmpty()) {\n                            sb.append(' ').gray().append('(')\n                            sb.append(\"from \")\n                            view.source.joinTo(sb)\n                            sb.append(')').reset().white().ansi(BG_BLACK)\n                        }\n                        sb.append('\\n')\n                    }\n                    view.sub.forEach { sub ->\n                        val subView = permMapping[sub] ?: error(\"Error in resolving $sub\")\n                        renderDepth(depth, sb)\n                        sb.append(\" |- \")\n                        render(depth + 1, subView, sb)\n                    }\n                }\n                sendAnsiMessage {\n                    ansi(BG_BLACK).white()\n                    permMapping.forEach { (_, tree) ->\n                        if (!tree.linked) {\n                            render(0, tree, this)\n                        }\n                    }\n                }\n            } else {\n                sendMessage(grantedPermissions.map { it.second.id }.toSet().joinToString(\"\\n\"))\n            }\n        }\n\n        @Description(\"查看所有权限列表\")\n        @SubCommand(\"listPermissions\", \"lp\")\n        public suspend fun CommandSender.listPermissions() {\n\n            val rootView = PermTree(PermissionService.INSTANCE.rootPermission)\n            val mappings = mutableMapOf<PermissionId, PermTree>()\n            val permListSnapshot = PermissionService.INSTANCE.getRegisteredPermissions().toList()\n\n            permListSnapshot.forEach { perm ->\n                mappings[perm.id] = PermTree(perm)\n            }\n            mappings[rootView.perm.id] = rootView\n\n            permListSnapshot.forEach { perm ->\n                if (perm.id == rootView.perm.id) return@forEach\n\n                val parentView = mappings[perm.parent.id] ?: error(\"Can't find parent of ${perm.id}: ${perm.parent.id}\")\n                parentView.sub.add(perm.id)\n            }\n\n            mappings.values.forEach { PermTree.sortView(it) }\n\n            //*:*\n            // |  `-\n            // |- .....\n            // |  |  `-\n            // |  |- ......\n            // |  |  |  `-\n            // |  |  |-\n            val prefixed = 50\n\n            fun render(depth: Int, view: PermTree, sb: AnsiMessageBuilder) {\n                kotlin.run { // render perm id\n                    var doReset = false\n                    val permId = view.perm.id\n                    if (permId == rootView.perm.id || permId.name.endsWith(\"*\")) {\n                        doReset = true\n                        sb.red()\n                    }\n                    sb.append(permId)\n                    if (doReset) {\n                        sb.reset()\n                    }\n                }\n\n                val linePrefixLen =\n                    (depth * 3) + 1 + view.perm.id.let { it.name.length + it.namespace.length } + (if (depth == 0) 0 else 1)\n                val descFlatten = view.perm.description.replace(\"\\r\\n\", \"\\n\").replace(\"\\r\", \"\\n\")\n                if (!descFlatten.contains('\\n') && linePrefixLen < prefixed) {\n                    if (descFlatten.isNotBlank()) {\n                        repeat(prefixed - linePrefixLen) { sb.append(' ') }\n                        sb.append(\"    \").append(descFlatten)\n                    }\n                } else {\n                    descFlatten.splitToSequence('\\n').forEach { line ->\n                        sb.append('\\n')\n                        renderDepth(depth, sb)\n                        sb.append(\" |  `- \").append(line)\n                    }\n                }\n                sb.append('\\n')\n\n                view.sub.forEach { sub ->\n                    val subView = mappings[sub] ?: return@forEach\n                    renderDepth(depth, sb)\n                    sb.append(\" |- \")\n                    render(depth + 1, subView, sb)\n                }\n            }\n            sendAnsiMessage {\n                render(0, rootView, this)\n            }\n        }\n    }\n\n\n    public object AutoLoginCommand : CompositeCommand(\n        ConsoleCommandOwner, \"autoLogin\", \"自动登录\",\n        description = \"自动登录设置\",\n        overrideContext = buildCommandArgumentContext {\n            @OptIn(ConsoleExperimentalApi::class)\n            ConfigurationKey::class with ConfigurationKey.Parser\n        }\n    ), BuiltInCommandInternal {\n        @Description(\"查看自动登录账号列表\")\n        @SubCommand\n        @OptIn(ConsoleExperimentalApi::class)\n        public suspend fun CommandSender.list() {\n            val config = DataScope.get<AutoLoginConfig>()\n            sendMessage(buildString {\n                for (account in config.accounts) {\n                    if (account.account == \"123456\") continue\n                    append(\"- \")\n                    append(\"账号: \")\n                    append(account.account)\n                    appendLine()\n                    append(\"  密码: \")\n                    append(account.password.value)\n                    appendLine()\n\n                    if (account.configuration.isNotEmpty()) {\n                        appendLine(\"  配置:\")\n                        for ((key, value) in account.configuration) {\n                            append(\"    $key = $value\")\n                        }\n                        appendLine()\n                    }\n                }\n            })\n        }\n\n        @Description(\"添加自动登录, passwordKind 可选 PLAIN 或 MD5\")\n        @SubCommand\n        @ConsoleExperimentalApi\n        public suspend fun CommandSender.add(account: Long, password: String, passwordKind: PasswordKind = PLAIN) {\n            val config = DataScope.get<AutoLoginConfig>()\n            val accountStr = account.toString()\n            if (config.accounts.any { it.account == accountStr }) {\n                sendMessage(\"已有相同账号在自动登录配置中. 请先删除该账号.\")\n                return\n            }\n            config.accounts.add(AutoLoginConfig.Account(accountStr, Password(passwordKind, password)))\n            sendMessage(\"已成功添加 '$account'.\")\n        }\n\n        @OptIn(ConsoleExperimentalApi::class)\n        @Description(\"清除所有配置\")\n        @SubCommand\n        public suspend fun CommandSender.clear() {\n            val config = DataScope.get<AutoLoginConfig>()\n            config.accounts.clear()\n            sendMessage(\"已清除所有自动登录配置.\")\n        }\n\n        @OptIn(ConsoleExperimentalApi::class)\n        @Description(\"删除一个账号\")\n        @SubCommand\n        public suspend fun CommandSender.remove(account: Long) {\n            val config = DataScope.get<AutoLoginConfig>()\n            val accountStr = account.toString()\n            if (config.accounts.removeIf { it.account == accountStr }) {\n                sendMessage(\"已成功删除 '$account'.\")\n                return\n            }\n            sendMessage(\"账号 '$account' 未配置自动登录.\")\n        }\n\n        @ConsoleExperimentalApi\n        @Description(\"设置一个账号的一个配置项\")\n        @SubCommand\n        public suspend fun CommandSender.setConfig(account: Long, configKey: ConfigurationKey, value: String) {\n            val config = DataScope.get<AutoLoginConfig>()\n            val accountStr = account.toString()\n\n            val oldAccount = config.accounts.find { it.account == accountStr } ?: kotlin.run {\n                sendMessage(\"未找到账号 $account.\")\n                return\n            }\n\n            if (value.isEmpty()) return removeConfig(account, configKey)\n\n            val newAccount = oldAccount.copy(configuration = oldAccount.configuration.toMutableMap().apply {\n                put(configKey, value)\n            })\n\n            config.accounts.remove(oldAccount)\n            config.accounts.add(newAccount)\n\n            sendMessage(\"成功修改 '$account' 的配置 '$configKey' 为 '$value'\")\n        }\n\n        @Description(\"删除一个账号的一个配置项\")\n        @ConsoleExperimentalApi\n        @SubCommand\n        public suspend fun CommandSender.removeConfig(account: Long, configKey: ConfigurationKey) {\n            val config = DataScope.get<AutoLoginConfig>()\n            val accountStr = account.toString()\n\n            val oldAccount = config.accounts.find { it.account == accountStr } ?: kotlin.run {\n                sendMessage(\"未找到账号 $account.\")\n                return\n            }\n\n            val newAccount = oldAccount.copy(configuration = oldAccount.configuration.toMutableMap().apply {\n                remove(configKey)\n            })\n\n            config.accounts.remove(oldAccount)\n            config.accounts.add(newAccount)\n\n            sendMessage(\"成功删除 '$account' 的配置 '$configKey'.\")\n        }\n    }\n\n    public object StatusCommand : SimpleCommand(\n        ConsoleCommandOwner, \"status\", \"states\", \"状态\",\n        description = \"获取 Mirai Console 运行状态\"\n    ), BuiltInCommandInternal {\n\n        internal interface MemoryUsageGet {\n            val heapMemoryUsage: MUsage\n            val nonHeapMemoryUsage: MUsage\n            val objectPendingFinalizationCount: Int\n        }\n\n        private val memoryUsageGet: MemoryUsageGet = kotlin.runCatching {\n            ByMemoryMXBean\n        }.getOrElse { ByRuntime }\n\n        internal object ByMemoryMXBean : MemoryUsageGet {\n            private val memoryMXBean: MemoryMXBean = ManagementFactory.getMemoryMXBean()\n            private val MemoryUsage.m: MUsage\n                get() = MUsage(\n                    committed, init, used, max\n                )\n            override val heapMemoryUsage: MUsage\n                get() = memoryMXBean.heapMemoryUsage.m\n            override val nonHeapMemoryUsage: MUsage\n                get() = memoryMXBean.nonHeapMemoryUsage.m\n            override val objectPendingFinalizationCount: Int\n                get() = memoryMXBean.objectPendingFinalizationCount\n        }\n\n        internal object ByRuntime : MemoryUsageGet {\n            override val heapMemoryUsage: MUsage\n                get() {\n                    val runtime = Runtime.getRuntime()\n                    return MUsage(\n                        committed = 0,\n                        init = 0,\n                        used = runtime.maxMemory() - runtime.freeMemory(),\n                        max = runtime.maxMemory()\n                    )\n                }\n            override val nonHeapMemoryUsage: MUsage\n                get() = MUsage(-1, -1, -1, -1)\n            override val objectPendingFinalizationCount: Int\n                get() = -1\n        }\n\n        internal data class MUsage(\n            val committed: Long,\n            val init: Long,\n            val used: Long,\n            val max: Long,\n        )\n\n        @OptIn(MiraiExperimentalApi::class)\n        @Handler\n        public suspend fun CommandSender.handle() {\n            sendAnsiMessage {\n                val buildDateFormatted =\n                    MiraiConsoleBuildConstants.buildDate.atZone(ZoneId.systemDefault())\n                        .format(DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\"))\n                append(\"Running MiraiConsole v\")\n                gold().append(MiraiConsoleBuildConstants.versionConst)\n                reset().append(\", built on \")\n                lightBlue().append(buildDateFormatted).reset().append(\".\\n\")\n                append(MiraiConsoleImplementation.getInstance().frontEndDescription.render()).append(\"\\n\\n\")\n                append(\"Permission Service: \").append(\n                    if (PermissionService.INSTANCE is BuiltInPermissionService) {\n                        lightYellow()\n                        \"Built In Permission Service\"\n                    } else {\n                        val plugin = GlobalComponentStorage.getPreferredExtension(PermissionServiceProvider).plugin\n                        if (plugin == null) {\n                            PermissionService.INSTANCE.toString()\n                        } else {\n                            green().append(plugin.name).reset().append(\" v\").gold()\n                            plugin.version.toString()\n                        }\n                    }\n                )\n                reset().append(\"\\n\\n\")\n\n                append(\"Plugins: \")\n\n                val resolvedPlugins = MiraiConsole.pluginManagerImpl.resolvedPlugins.asSequence()\n                    .filter { it !is MiraiConsoleAsPlugin } // skip mirai-console in status\n                    .toList()\n\n                if (resolvedPlugins.isEmpty()) {\n                    gray().append(\"<none>\")\n                } else {\n                    resolvedPlugins.joinTo(this) { plugin ->\n                        if (plugin.isEnabled) {\n                            green().append(plugin.name).reset().append(\" v\").gold()\n                        } else {\n                            red().append(plugin.name)\n                            if (plugin is JvmPluginInternal) {\n                                append(\"(\").append(plugin.currentPluginStatus.name.lowercase()).append(\")\")\n                            } else {\n                                append(\"(disabled)\")\n                            }\n                            reset().append(\" v\").gold()\n                        }\n                        plugin.version.toString()\n                    }\n                }\n                reset().append(\"\\n\\n\")\n\n                append(\"Object Pending Finalization Count: \")\n                    .emeraldGreen()\n                    .append(memoryUsageGet.objectPendingFinalizationCount)\n                    .reset()\n                    .append(\"\\n\")\n                val l1 = arrayOf(\"committed\", \"init\", \"used\", \"max\")\n                val l2 = renderMemoryUsage(memoryUsageGet.heapMemoryUsage)\n                val l3 = renderMemoryUsage(memoryUsageGet.nonHeapMemoryUsage)\n                val lmax = calculateMax(l1, l2.first, l3.first)\n\n                append(\"                 \")\n                l1.forEachIndexed { index, s ->\n                    if (index != 0) append(\" | \")\n                    renderMUNum(lmax[index], s.length) { append(s); reset() }\n                }\n                reset()\n                append(\"\\n\")\n\n                fun rendMU(l: Pair<Array<String>, LongArray>) {\n                    val max = l.second[3]\n                    val e50 = max / 2\n                    val e90 = max * 90 / 100\n                    l.first.forEachIndexed { index, s ->\n                        if (index != 0) append(\" | \")\n                        renderMUNum(lmax[index], s.length) {\n                            if (index == 3) {\n                                // MAX\n                                append(s)\n                            } else {\n                                if (max < 0L) {\n                                    append(s)\n                                } else {\n                                    val v = l.second[index]\n                                    when {\n                                        v < e50 -> {\n                                            green()\n                                        }\n\n                                        v < e90 -> {\n                                            lightRed()\n                                        }\n\n                                        else -> {\n                                            red()\n                                        }\n                                    }\n                                    append(s)\n                                    reset()\n                                }\n                            }\n                        }\n                    }\n                }\n\n                append(\"    Heap Memory: \")\n                rendMU(l2)\n                append(\"\\nNon-Heap Memory: \")\n                rendMU(l3)\n            }\n        }\n\n        private fun AnsiMessageBuilder.renderMemoryUsage(usage: MUsage) = arrayOf(\n            renderMemoryUsageNumber(usage.committed),\n            renderMemoryUsageNumber(usage.init),\n            renderMemoryUsageNumber(usage.used),\n            renderMemoryUsageNumber(usage.max),\n        ) to longArrayOf(\n            usage.committed,\n            usage.init,\n            usage.used,\n            usage.max,\n        )\n\n        private fun calculateMax(\n            vararg lines: Array<String>\n        ): IntArray = IntArray(lines[0].size) { r ->\n            lines.maxOf { it[r].length }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/Command.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\", \"MemberVisibilityCanBePrivate\")\n\npackage net.mamoe.mirai.console.command\n\nimport net.mamoe.mirai.console.command.descriptor.CommandArgumentContextAware\nimport net.mamoe.mirai.console.command.descriptor.CommandSignature\nimport net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors\nimport net.mamoe.mirai.console.compiler.common.ResolveContext\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.COMMAND_NAME\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.RESTRICTED_CONSOLE_COMMAND_OWNER\nimport net.mamoe.mirai.console.permission.Permission\nimport net.mamoe.mirai.console.permission.PermissionId\n\n/**\n * 指令\n *\n * ### 权限\n * 每个指令都会被分配一个权限 [permission]. 默认没有人拥有这个权限. 请通过 [BuiltInCommands.PermissionCommand] 赋予权限.\n *\n * @see CommandManager.registerCommand 注册这个指令\n *\n * @see RawCommand 无参数解析, 接收原生参数的指令\n * @see CompositeCommand 复合指令\n * @see SimpleCommand 简单的, 支持参数自动解析的指令\n *\n * @see CommandArgumentContextAware\n */\npublic interface Command {\n    /**\n     * 主指令名. 将会参与构成 [Permission.id].\n     *\n     * 不允许包含 [空格][Char.isWhitespace], '.', ':'.\n     */\n    @ResolveContext(COMMAND_NAME)\n    public val primaryName: String\n\n    /**\n     * 次要指令名\n     * @see Command.primaryName 获取主指令名\n     */\n    @ResolveContext(COMMAND_NAME)\n    public val secondaryNames: Array<out String>\n\n    /**\n     * 指令可能的参数列表.\n     */\n    @ExperimentalCommandDescriptors\n    public val overloads: List<@JvmWildcard CommandSignature>\n\n    /**\n     * 用法说明, 用于发送给用户. [usage] 一般包含 [description].\n     */\n    public val usage: String\n\n    /**\n     * 描述, 用于显示在 [BuiltInCommands.HelpCommand]\n     */\n    public val description: String\n\n    /**\n     * 为此指令分配的权限.\n     *\n     * ### 实现约束\n     * - [Permission.id] 应由 [CommandOwner.permissionId] 创建. 因此保证相同的 [PermissionId.namespace]\n     * - [PermissionId.name] 应为 [主指令名][primaryName]\n     */\n    public val permission: Permission\n\n    /**\n     * 为 `true` 时表示 [指令前缀][CommandManager.commandPrefix] 可选.\n     *\n     * 会影响聊天语境中的解析.\n     *\n     * #### 实验性 API\n     * 由于指令解析允许被扩展, 此属性可能不适用所有解析器, 因此还未决定是否保留.\n     */\n    @ExperimentalCommandDescriptors\n    public val prefixOptional: Boolean\n\n    /**\n     * 指令拥有者.\n     * @see CommandOwner\n     */\n    @ResolveContext(RESTRICTED_CONSOLE_COMMAND_OWNER)\n    public val owner: CommandOwner\n\n    public companion object {\n\n        /**\n         * 获取所有指令名称 (包含 [primaryName] 和 [secondaryNames]).\n         *\n         * @return 数组大小至少为 1. 第一个元素总是 [primaryName]. 随后是保持原顺序的 [secondaryNames]\n         */\n        @JvmStatic\n        public val Command.allNames: Array<String>\n            get() = arrayOf(primaryName, *secondaryNames)\n\n        /**\n         * 检查指令名的合法性. 在非法时抛出 [IllegalArgumentException]\n         */\n        @JvmStatic\n        @Throws(IllegalArgumentException::class)\n        public fun checkCommandName(@ResolveContext(COMMAND_NAME) name: String) {\n            when {\n                name.isBlank() -> throw IllegalArgumentException(\"Command name should not be blank.\")\n                name.any { it.isWhitespace() } -> throw IllegalArgumentException(\"Spaces are not yet allowed in command name.\")\n                name.contains(':') -> throw IllegalArgumentException(\"':' is forbidden in command name.\")\n                name.contains('.') -> throw IllegalArgumentException(\"'.' is forbidden in command name.\")\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/CommandContext.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.command\n\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.utils.NotStableForInheritance\n\n/**\n * 指令执行环境\n * @since 2.12\n */\n@NotStableForInheritance\npublic interface CommandContext {\n    /**\n     * 指令发送者\n     */\n    public val sender: CommandSender\n\n    /**\n     * 触发指令的原消息链，包含元数据，也包含指令名。\n     *\n     * 示例内容：`messageChainOf(MessageSource(...), PlainText(\"/test\"), PlainText(\"arg1\"))`\n     */\n    public val originalMessage: MessageChain\n}\n\ninternal class CommandContextImpl(\n    override val sender: CommandSender,\n    override val originalMessage: MessageChain\n) : CommandContext"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/CommandExecuteResult.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.command\n\nimport net.mamoe.mirai.console.command.descriptor.*\nimport net.mamoe.mirai.console.command.parse.CommandCall\nimport net.mamoe.mirai.console.command.parse.CommandValueArgument\nimport net.mamoe.mirai.console.command.resolve.InterceptedReason\nimport net.mamoe.mirai.console.command.resolve.ResolvedCommandCall\nimport kotlin.contracts.contract\n\n/**\n * 指令的执行返回\n */\n@ExperimentalCommandDescriptors\npublic sealed class CommandExecuteResult {\n    /** 指令执行时发生的错误 (如果有) */\n    public abstract val exception: Throwable?\n\n    /** 尝试执行的指令 (如果匹配到) */\n    public abstract val command: Command?\n\n    /** 解析的 [CommandCall] (如果匹配到) */\n    public abstract val call: CommandCall?\n\n    /** 解析的 [ResolvedCommandCall] (如果匹配到) */\n    public abstract val resolvedCall: ResolvedCommandCall?\n\n    // abstract val to allow smart casting\n\n    /** 指令执行成功 */\n    public class Success(\n        /** 尝试执行的指令 */\n        public override val command: Command,\n        /** 解析的 [CommandCall] (如果匹配到) */\n        public override val call: CommandCall,\n        /** 解析的 [ResolvedCommandCall] (如果匹配到) */\n        public override val resolvedCall: ResolvedCommandCall,\n    ) : CommandExecuteResult() {\n        /** 指令执行时发生的错误, 总是 `null` */\n        public override val exception: Nothing? get() = null\n    }\n\n    /** 指令执行失败 */\n    public abstract class Failure : CommandExecuteResult()\n\n    /** 执行执行时发生了一个非法参数错误 */\n    public class IllegalArgument(\n        /** 指令执行时发生的错误 */\n        public override val exception: IllegalCommandArgumentException,\n        /** 尝试执行的指令 */\n        public override val command: Command,\n        /** 解析的 [CommandCall] (如果匹配到) */\n        public override val call: CommandCall,\n        /** 解析的 [ResolvedCommandCall] (如果匹配到) */\n        public override val resolvedCall: ResolvedCommandCall,\n    ) : Failure()\n\n    /** 指令方法调用过程出现了错误 */\n    public class ExecutionFailed(\n        /** 指令执行时发生的错误 */\n        public override val exception: Throwable,\n        /** 尝试执行的指令 */\n        public override val command: Command,\n        /** 解析的 [CommandCall] (如果匹配到) */\n        public override val call: CommandCall,\n        /** 解析的 [ResolvedCommandCall] (如果匹配到) */\n        public override val resolvedCall: ResolvedCommandCall,\n    ) : Failure()\n\n    /** 没有匹配的指令 */\n    public class UnresolvedCommand(\n        /** 解析的 [CommandCall] (如果匹配到) */\n        public override val call: CommandCall?,\n    ) : Failure() {\n        /** 指令执行时发生的错误, 总是 `null` */\n        public override val exception: Nothing? get() = null\n\n        /** 尝试执行的指令, 总是 `null` */\n        public override val command: Nothing? get() = null\n\n        /** 解析的 [ResolvedCommandCall] (如果匹配到) */\n        public override val resolvedCall: ResolvedCommandCall? get() = null\n    }\n\n    /** 没有匹配的指令 */\n    public class Intercepted(\n        /** 解析的 [CommandCall] (如果匹配到) */\n        public override val call: CommandCall?,\n        /** 解析的 [ResolvedCommandCall] (如果匹配到) */\n        public override val resolvedCall: ResolvedCommandCall?,\n        /** 尝试执行的指令 (如果匹配到) */\n        public override val command: Command?,\n        /** 拦截原因 */\n        public val reason: InterceptedReason,\n    ) : Failure() {\n        /** 指令执行时发生的错误, 总是 `null` */\n        public override val exception: Nothing? get() = null\n    }\n\n    /** 权限不足 */\n    public class PermissionDenied(\n        /** 尝试执行的指令 */\n        public override val command: Command,\n        /** 解析的 [CommandCall] (如果匹配到) */\n        public override val call: CommandCall,\n        /** 解析的 [ResolvedCommandCall] (如果匹配到) */\n        public override val resolvedCall: ResolvedCommandCall,\n    ) : Failure() {\n        /** 指令执行时发生的错误, 总是 `null` */\n        public override val exception: Nothing? get() = null\n    }\n\n    /** 没有匹配的指令 */\n    public class UnmatchedSignature(\n        /** 尝试执行的指令 */\n        public override val command: Command,\n        /** 解析的 [CommandCall] (如果匹配到) */\n        public override val call: CommandCall,\n        /** 尝试执行的指令 */\n        @ExperimentalCommandDescriptors\n        public val failureReasons: List<UnmatchedCommandSignature>,\n    ) : Failure() {\n        /** 指令执行时发生的错误, 总是 `null` */\n        public override val exception: Nothing? get() = null\n\n        /** 解析的 [ResolvedCommandCall] (如果匹配到) */\n        public override val resolvedCall: ResolvedCommandCall? get() = null\n    }\n}\n\n@ExperimentalCommandDescriptors\npublic class UnmatchedCommandSignature(\n    public val signature: CommandSignature,\n    public val failureReason: FailureReason,\n)\n\n@ExperimentalCommandDescriptors\npublic sealed class FailureReason {\n    public class InapplicableReceiverArgument(\n        public override val parameter: CommandReceiverParameter<*>,\n        public val argument: CommandSender,\n    ) : InapplicableArgument()\n\n    public class InapplicableValueArgument(\n        public override val parameter: CommandValueParameter<*>,\n        public val argument: CommandValueArgument,\n    ) : InapplicableArgument()\n\n    public abstract class InapplicableArgument : FailureReason() {\n        public abstract val parameter: CommandParameter<*>\n    }\n\n    public abstract class ArgumentLengthMismatch : FailureReason()\n\n    public data class ResolutionAmbiguity(\n        /**\n         * Including [self][UnmatchedCommandSignature.signature].\n         */\n        public val allCandidates: List<CommandSignature>,\n    ) : FailureReason()\n\n    public object TooManyArguments : ArgumentLengthMismatch()\n    public object NotEnoughArguments : ArgumentLengthMismatch()\n}\n\n/**\n * 当 [this] 为 [CommandExecuteResult.Success] 时返回 `true`\n */\n@ExperimentalCommandDescriptors\n@JvmSynthetic\npublic fun CommandExecuteResult.isSuccess(): Boolean {\n    contract {\n        returns(true) implies (this@isSuccess is CommandExecuteResult.Success)\n        returns(false) implies (this@isSuccess !is CommandExecuteResult.Success)\n    }\n    return this is CommandExecuteResult.Success\n}\n\n/**\n * 当 [this] 为 [CommandExecuteResult.ExecutionFailed], [CommandExecuteResult.IllegalArgument] , [CommandExecuteResult.UnmatchedSignature] 或 [CommandExecuteResult.UnresolvedCommand] 时返回 `true`\n */\n@ExperimentalCommandDescriptors\n@JvmSynthetic\npublic fun CommandExecuteResult.isFailure(): Boolean {\n    contract {\n        returns(true) implies (this@isFailure !is CommandExecuteResult.Success)\n        returns(false) implies (this@isFailure is CommandExecuteResult.Success)\n    }\n    return this !is CommandExecuteResult.Success\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/CommandExecutionException.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"MemberVisibilityCanBePrivate\")\n\npackage net.mamoe.mirai.console.command\n\n/**\n * 在 [CommandManager.executeCommand] 中抛出异常时包装的异常.\n */\npublic class CommandExecutionException(\n    /**\n     * 执行者\n     */\n    public val sender: CommandSender,\n    /**\n     * 执行过程发生异常的指令\n     */\n    public val command: Command,\n    /**\n     * 匹配到的指令名\n     */\n    public val name: String,\n    cause: Throwable,\n) : RuntimeException(\n    \"Exception while executing command '${command.primaryName}'\",\n    cause\n) {\n    public override fun toString(): String =\n        \"CommandExecutionException(command=$command, name='$name')\"\n}\n\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/CommandManager.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\n    \"NOTHING_TO_INLINE\", \"unused\",\n    \"MemberVisibilityCanBePrivate\", \"INAPPLICABLE_JVM_NAME\"\n)\n@file:JvmName(\"CommandManagerKt\")\n\npackage net.mamoe.mirai.console.command\n\nimport me.him188.kotlin.dynamic.delegation.dynamicDelegation\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport net.mamoe.mirai.console.command.CommandManager.INSTANCE.executeCommand\nimport net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors\nimport net.mamoe.mirai.console.command.parse.CommandCall\nimport net.mamoe.mirai.console.command.parse.CommandCallParser\nimport net.mamoe.mirai.console.command.resolve.CommandCallResolver\nimport net.mamoe.mirai.console.command.resolve.ResolvedCommandCall\nimport net.mamoe.mirai.console.internal.command.executeCommandImpl\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.message.data.*\n\n/**\n * 指令管理器\n */\npublic interface CommandManager {\n    /**\n     * 获取所有已经注册了指令列表.\n     *\n     * @return 这一时刻的浅拷贝.\n     */\n    public val allRegisteredCommands: List<Command>\n\n    /**\n     * 指令前缀, 如 '/'\n     */\n    public val commandPrefix: String\n\n    /**\n     * 获取已经注册了的属于这个 [CommandOwner] 的指令列表.\n     *\n     * @return 这一时刻的浅拷贝.\n     */\n    public fun getRegisteredCommands(owner: CommandOwner): List<Command>\n\n\n    /**\n     * 取消注册所有属于 [owner] 的指令\n     */\n    public fun unregisterAllCommands(owner: CommandOwner)\n\n    /**\n     * 注册一个指令.\n     *\n     * @param override 是否覆盖重名指令.\n     *\n     * 若原有指令 P, 其 [Command.secondaryNames] 为 'a', 'b', 'c'.\n     * 新指令 Q, 其 [Command.secondaryNames] 为 'b', 将会覆盖原指令 A 注册的 'b'.\n     *\n     * 即注册完成后, 'a' 和 'c' 将会解析到指令 P, 而 'b' 会解析到指令 Q.\n     *\n     * @return\n     * 若已有重名指令, 且 [override] 为 `false`, 返回 `false`;\n     * 若已有重名指令, 但 [override] 为 `true`, 覆盖原有指令并返回 `true`.\n     *\n     *\n     * 注意: [内建指令][BuiltInCommands] 也可以被覆盖.\n     */\n    public fun registerCommand(command: Command, override: Boolean = false): Boolean\n\n    /**\n     * 查找并返回重名的指令. 返回重名指令.\n     */\n    public fun findDuplicateCommand(command: Command): Command?\n\n    /**\n     * 取消注册这个指令.\n     *\n     * 若指令未注册, 返回 `false`.\n     */\n    public fun unregisterCommand(command: Command): Boolean\n\n    /**\n     * 当 [command] 已经 [注册][registerCommand] 时返回 `true`\n     */\n    public fun isCommandRegistered(command: Command): Boolean\n\n    /**\n     * 解析并执行一个指令.\n     *\n     * ### 指令解析流程\n     * 1. [CommandCallParser] 将 [MessageChain] 解析为 [CommandCall]\n     * 2. [CommandCallResolver] 将 [CommandCall] 解析为 [ResolvedCommandCall]\n     * 1. [message] 的第一个消息元素的 [内容][Message.contentToString] 被作为指令名, 在已注册指令列表中搜索. (包含 [Command.prefixOptional] 相关的处理)\n     * 2. 参数语法分析.\n     *   在当前的实现下, [message] 被以空格和 [SingleMessage] 分割.\n     *   如 \"MessageChain(\"foo bar\", [Image], \" test\")\" 被分割为 \"foo\", \"bar\", [Image], \"test\".\n     *   注意: 字符串与消息元素之间不需要空格, 会被强制分割. 如 \"bar[mirai:image:]\" 会被分割为 \"bar\" 和 [Image] 类型的消息元素.\n     * 3. 参数解析. 各类型指令实现不同. 详见 [RawCommand], [CompositeCommand], [SimpleCommand]\n     *\n     * ### 扩展\n     * 参数语法分析过程可能会被扩展, 插件可以自定义处理方式 ([CommandCallParser]), 因此可能不会简单地使用空格分隔.\n     *\n     * @param message 一条完整的指令. 如 \"/managers add 123456.123456\"\n     * @param checkPermission 为 `true` 时检查权限\n     *\n     * @see CommandCallParser\n     * @see CommandCallResolver\n     *\n     * @see CommandSender.executeCommand\n     * @see Command.execute\n     *\n     * @return 执行结果\n     */\n    @ExperimentalCommandDescriptors\n    @JvmBlockingBridge\n    public suspend fun executeCommand(\n        caller: CommandSender,\n        message: Message,\n        checkPermission: Boolean = true,\n    ): CommandExecuteResult {\n        return executeCommandImpl(message, caller, checkPermission)\n    }\n\n    /**\n     * 执行一个确切的指令\n     *\n     * @param command 目标指令\n     * @param arguments 参数列表\n     *\n     * @see executeCommand 获取更多信息\n     * @see Command.execute\n     */\n    @ConsoleExperimentalApi\n    @JvmName(\"executeCommand\")\n    @ExperimentalCommandDescriptors\n    @JvmSynthetic\n    public suspend fun executeCommand(\n        sender: CommandSender,\n        command: Command,\n        arguments: Message = emptyMessageChain(),\n        checkPermission: Boolean = true,\n    ): CommandExecuteResult {\n        // TODO: 2020/10/18  net.mamoe.mirai.console.command.CommandManager.execute\n        val chain = buildMessageChain {\n            append(CommandManager.commandPrefix)\n            append(command.primaryName)\n            append(' ')\n            append(arguments)\n        }\n        return CommandManager.executeCommand(sender, chain, checkPermission)\n    }\n\n    /**\n     * 从 [指令名称][commandName] 匹配对应的 [Command].\n     *\n     * #### 实现细节\n     * - [commandName] 带有 [commandPrefix] 时可以匹配到所有指令\n     * - [commandName] 不带有 [commandPrefix] 时只能匹配到 [Command.prefixOptional] 的指令\n     *\n     * @param commandName 可能带有或不带有 [commandPrefix].\n     */\n    public fun matchCommand(commandName: String): Command?\n\n    /**\n     * [CommandManager] 实例. 转发所有调用到 [MiraiConsoleImplementation.commandManager].\n     */\n\n    public companion object INSTANCE :\n        CommandManager by (dynamicDelegation {\n            @OptIn(ConsoleFrontEndImplementation::class)\n            MiraiConsoleImplementation.getInstance().commandManager\n        }) {\n\n        /**\n         * @see CommandManager.getRegisteredCommands\n         */\n        @get:JvmName(\"registeredCommands0\")\n        @get:JvmSynthetic\n        public inline val CommandOwner.registeredCommands: List<Command>\n            get() = getRegisteredCommands(this)\n\n        /**\n         * @see CommandManager.registerCommand\n         */\n        @JvmSynthetic\n        public inline fun Command.register(override: Boolean = false): Boolean = registerCommand(this, override)\n\n        /**\n         * @see CommandManager.unregisterCommand\n         */\n        @JvmSynthetic\n        public inline fun Command.unregister(): Boolean = unregisterCommand(this)\n\n        /**\n         * @see CommandManager.isCommandRegistered\n         */\n        @get:JvmSynthetic\n        public inline val Command.isRegistered: Boolean\n            get() = isCommandRegistered(this)\n\n        /**\n         * @see CommandManager.unregisterAll\n         */\n        @JvmSynthetic\n        public inline fun CommandOwner.unregisterAll(): Unit = unregisterAllCommands(this)\n\n        /**\n         * @see CommandManager.findDuplicate\n         */\n        @JvmSynthetic\n        public inline fun Command.findDuplicate(): Command? = findDuplicateCommand(this)\n\n    }\n}\n\n/**\n * 解析并执行一个指令\n *\n * @param message 一条完整的指令. 如 \"/managers add 123456.123456\"\n * @param checkPermission 为 `true` 时检查权限\n *\n * @return 执行结果\n * @see executeCommand\n */\n@JvmName(\"execute0\")\n@ExperimentalCommandDescriptors\n@JvmSynthetic\npublic suspend inline fun CommandSender.executeCommand(\n    message: String,\n    checkPermission: Boolean = true,\n): CommandExecuteResult = CommandManager.executeCommand(this, PlainText(message).toMessageChain(), checkPermission)\n\n\n/**\n * 执行一个确切的指令\n * @see executeCommand 获取更多信息\n */\n@JvmName(\"execute0\")\n@ExperimentalCommandDescriptors\n@JvmSynthetic\npublic suspend inline fun Command.execute(\n    sender: CommandSender,\n    vararg arguments: Message = emptyArray(),\n    checkPermission: Boolean = true,\n): CommandExecuteResult =\n    @OptIn(ConsoleExperimentalApi::class)\n    CommandManager.executeCommand(sender, this, arguments.toMessageChain(), checkPermission)\n\n/**\n * 执行一个确切的指令\n * @see executeCommand 获取更多信息\n */\n@JvmName(\"execute0\")\n@ExperimentalCommandDescriptors\n@JvmSynthetic\npublic suspend inline fun Command.execute(\n    sender: CommandSender,\n    arguments: String = \"\",\n    checkPermission: Boolean = true,\n): CommandExecuteResult = execute(sender, PlainText(arguments), checkPermission = checkPermission)\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/CommandOwner.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.command\n\nimport net.mamoe.mirai.console.compiler.common.ResolveContext\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.PERMISSION_NAME\nimport net.mamoe.mirai.console.permission.Permission\nimport net.mamoe.mirai.console.permission.PermissionId\nimport net.mamoe.mirai.console.permission.PermissionIdNamespace\nimport net.mamoe.mirai.console.plugin.jvm.JvmPlugin\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\n\n/**\n * 指令的所有者. [JvmPlugin] 是一个 [CommandOwner].\n *\n * @see CommandManager.unregisterAllCommands 取消注册所有属于一个 [CommandOwner] 的指令\n * @see CommandManager.registeredCommands 获取已经注册了的属于一个 [CommandOwner] 的指令列表.\n */\npublic interface CommandOwner : PermissionIdNamespace {\n    /**\n     * 在构造指令时, [Command.permission] 默认会使用 [parentPermission] 作为 [Permission.parent]\n     */\n    public val parentPermission: Permission\n}\n\n/**\n * 代表控制台所有者. 所有的 mirai-console 内建的指令都属于 [ConsoleCommandOwner].\n *\n * 插件注册指令时不应该使用 [ConsoleCommandOwner].\n */\npublic object ConsoleCommandOwner : CommandOwner {\n    @OptIn(ConsoleExperimentalApi::class)\n    public override val parentPermission: Permission get() = BuiltInCommands.parentPermission\n\n    public override fun permissionId(\n        @ResolveContext(PERMISSION_NAME) name: String,\n    ): PermissionId = PermissionId(\"console\", name)\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/CommandPermissionDeniedException.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.command\n\n/**\n * 在 [CommandManager.executeCommand] 中, [CommandSender] 未拥有 [Command.permission] 所要求的权限时抛出的异常.\n *\n * 总是作为 [CommandExecutionException.cause].\n */\npublic class CommandPermissionDeniedException(\n    /**\n     * 执行者\n     */\n    public val commandSender: CommandSender,\n    /**\n     * 执行过程发生异常的指令\n     */\n    public val command: Command,\n) : RuntimeException(\"Permission denied while executing command '${command.primaryName}'\") {\n    public override fun toString(): String =\n        \"CommandPermissionDeniedException(command=$command)\"\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/CommandSender.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\n    \"NOTHING_TO_INLINE\", \"FunctionName\",\n    \"unused\", \"MemberVisibilityCanBePrivate\"\n)\n\npackage net.mamoe.mirai.console.command\n\nimport kotlinx.coroutines.CoroutineScope\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport net.mamoe.mirai.console.command.CommandSender.Companion.asCommandSender\nimport net.mamoe.mirai.console.command.CommandSender.Companion.asMemberCommandSender\nimport net.mamoe.mirai.console.command.CommandSender.Companion.asTempCommandSender\nimport net.mamoe.mirai.console.command.CommandSender.Companion.toCommandSender\nimport net.mamoe.mirai.console.internal.data.castOrNull\nimport net.mamoe.mirai.console.internal.data.qualifiedNameOrTip\nimport net.mamoe.mirai.console.permission.AbstractPermitteeId\nimport net.mamoe.mirai.console.permission.Permittee\nimport net.mamoe.mirai.console.permission.PermitteeId\nimport net.mamoe.mirai.console.plugin.Plugin\nimport net.mamoe.mirai.console.plugin.name\nimport net.mamoe.mirai.console.util.*\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.data.PlainText\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport net.mamoe.mirai.utils.childScope\nimport net.mamoe.mirai.utils.childScopeContext\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.coroutines.CoroutineContext\n\n// region base interface define\n\n/**\n * 指令发送者.\n *\n * 只有 [CommandSender] 才能 [执行指令][CommandManager.executeCommand]\n *\n * ## 获得指令发送者\n * - [MessageEvent.toCommandSender]\n * - [FriendMessageEvent.toCommandSender]\n * - [GroupMessageEvent.toCommandSender]\n * - [StrangerMessageEvent.toCommandSender]\n * - [OtherClientMessageEvent.toCommandSender]\n * - [MessageSyncEvent.toCommandSender]\n *\n * - [Member.asCommandSender]\n * - [NormalMember.asTempCommandSender]\n * - [Member.asMemberCommandSender]\n * - [Friend.asCommandSender]\n * - [User.asCommandSender]\n * - [Stranger.asCommandSender]\n * - [OtherClient.asCommandSender]\n *\n * ## 实现 [CommandSender]\n * 在任何时候都不要实现 [CommandSender] (包括使用委托). 必须使用上述扩展获取 [CommandSender] 实例.\n *\n * 除了以下情况:\n * - Console 前端可实现 [ConsoleCommandSender]\n * - 插件可继承 [AbstractPluginCustomCommandSender]\n *\n * ## 子类型\n *\n * 所有 [CommandSender] 都应继承 [AbstractCommandSender].\n *\n * [AbstractCommandSender] 是密封类, 一级子类为:\n * - [AbstractUserCommandSender] 代表用户\n * - [AbstractPluginCustomCommandSender] 代表插件\n * - [ConsoleCommandSender] 代表控制台\n *\n * 二级子类, 当指令由插件 [主动执行][CommandManager.executeCommand] 时, 插件应使用 [toCommandSender] 或 [asCommandSender], 因此,\n * - 若在群聊环境, 对应 [CommandSender] 为 [MemberCommandSender]\n * - 若在私聊环境, 对应 [CommandSender] 为 [FriendCommandSender]\n * - 若在临时会话环境, 对应 [CommandSender] 为 [TempCommandSender]\n * - 若在陌生人会话环境, 对应 [CommandSender] 为 [StrangerCommandSender]\n * - 若在其他客户端会话环境, 对应 [CommandSender] 为 [OtherClientCommandSender]\n *\n * 三级子类, 当真实收到由用户执行的指令时:\n * - 若在群聊环境, 对应 [CommandSender] 为 [MemberCommandSenderOnMessage]\n * - 若在私聊环境, 对应 [CommandSender] 为 [FriendCommandSenderOnMessage]\n * - 若在临时会话环境, 对应 [CommandSender] 为 [TempCommandSenderOnMessage]\n * - 若在陌生人会话环境, 对应 [CommandSender] 为 [StrangerCommandSenderOnMessage]\n * - 若在其他客户端会话环境, 对应 [CommandSender] 为 [OtherClientCommandSenderOnMessage]\n *\n *\n * 类型关系如图. 箭头指向的是父类.\n *\n * ```\n *                 CoroutineScope\n *                        ↑\n *                        |\n *     +----------> CommandSender <---------+---------------------+---------------------------------------------------+\n *     |                                      ↑                 |                     |                               |\n *     |                                      |                 |                     |                               |\n *  SystemCommandSender <-------+             |     UserCommandSender   GroupAwareCommandSender     CommandSenderOnMessage\n *     ↑                        |             |                 ↑                     ↑                               ↑\n *  PluginCustomCommandSender   |             |                 |                     |                               |\n *     ↑                        |             |                 |                     |                               |\n *     |          +-------------+    AbstractCommandSender      |                     |                               |\n *     |          |                           ↑                 |                     |                               |\n *     |          |                           | sealed          |                     |                               |\n *     |          |           +---------------+-------------+   |                     |                               |\n *     |          |           |               |             |   |                     |                               |\n *     |          |           |               |             |   |                     |                               |\n *     |          |           |               |             |   |                     |                               |\n *     |          |           |               |             |   |                     |                               |\n *     |          |           |               |             |   |                     |                               |\n *     |          |           |               |             |   |                     |                               |\n *     |          |           |               |             |   |                     |                               |      }\n *     |     ConsoleCommandSender             |          AbstractUserCommandSender    |                               |      }\n *     |                                      |             ↑                         |                               |      } 一级子类\n *   AbstractPluginCustomCommandSender -------+             |                         |                               |      }\n *                                                          |                         |                               |      }\n *                                                          |                         |                               |\n *                                                          |                         |                               |\n *                                                          | sealed                  |                               |\n *                                                          |                         |                               |\n *                                   +----------------------+                         |                               |\n *                                   |                      |                         |                               |\n *                                   |                      +------+------------+---------------+                     |\n *                                   |                             |                            |                     |\n *                                   |                             |                            |                     |      }\n *                           FriendCommandSender          MemberCommandSender         GroupTempCommandSender          |      } 二级子类\n *                                   ↑                             ↑                            ↑                     |      }\n *                                   |                             |                            |                     |\n *                                   |                             |                            |                     |      }\n *                      FriendCommandSenderOnMessage  MemberCommandSenderOnMessage  GroupTempCommandSenderOnMessage   |      } 三级子类\n *                                   |                             |                            |                     |      }\n *                                   |                             |                            |                     |\n *                                   +-----------------------------+----------------------------+---------------------+\n * ```\n *\n * ## Scoping: [MessageScope]\n * 在处理多个消息对象时, 可通过 [MessageScope] 简化操作.\n *\n * 查看 [MessageScope] 以获取更多信息.\n *\n * @see ConsoleCommandSender 控制台\n * @see UserCommandSender  [User] ([群成员][Member], [好友][Friend])\n * @see toCommandSender\n * @see asCommandSender\n * @see PluginCustomCommandSender 自定义 CommandSender\n */\npublic interface CommandSender : CoroutineScope, Permittee {\n    /**\n     * 与这个 [CommandSender] 相关的 [Bot].\n     * 当通过控制台执行时为 `null`.\n     */\n    public val bot: Bot?\n\n    /**\n     * 与这个 [CommandSender] 相关的 [Contact].\n     *\n     * - 当一个群员执行指令时, [subject] 为所在 [群][Group]\n     * - 当通过控制台执行时为 `null`.\n     */\n    public val subject: Contact?\n\n    /**\n     * 指令原始发送*人*.\n     * - 当通过控制台执行时为 `null`.\n     */\n    public val user: User?\n\n    /**\n     * [User.nameCardOrNick] 或 [ConsoleCommandSender.NAME]\n     */\n    public val name: String\n\n    /**\n     * 立刻发送一条消息.\n     *\n     * 对于 [MemberCommandSender], 这个函数总是发送给所在群\n     */\n    @JvmBlockingBridge\n    public suspend fun sendMessage(message: Message): MessageReceipt<Contact>?\n\n    /**\n     * 立刻发送一条消息.\n     *\n     * 对于 [MemberCommandSender], 这个函数总是发送给所在群\n     */\n    @JvmBlockingBridge\n    public suspend fun sendMessage(message: String): MessageReceipt<Contact>?\n\n    public companion object {\n\n        ///////////////////////////////////////////////////////////////////////////\n        // Constructors\n        ///////////////////////////////////////////////////////////////////////////\n\n        /**\n         * 构造 [FriendCommandSenderOnMessage]\n         */\n        @JvmName(\"from\")\n        @JvmStatic\n        public fun FriendMessageEvent.toCommandSender(): FriendCommandSenderOnMessage =\n            FriendCommandSenderOnMessage(this)\n\n        /**\n         * 构造 [MemberCommandSenderOnMessage]\n         */\n        @JvmName(\"from\")\n        @JvmStatic\n        public fun GroupMessageEvent.toCommandSender(): MemberCommandSenderOnMessage =\n            MemberCommandSenderOnMessage(this)\n\n        /**\n         * 构造 [TempCommandSenderOnMessage]\n         */\n        @JvmStatic\n        @JvmName(\"from\")\n        public fun GroupTempMessageEvent.toCommandSender(): GroupTempCommandSenderOnMessage =\n            GroupTempCommandSenderOnMessage(this)\n\n        /**\n         * 构造 [StrangerCommandSenderOnMessage]\n         */\n        @JvmStatic\n        @JvmName(\"from\")\n        public fun StrangerMessageEvent.toCommandSender(): StrangerCommandSenderOnMessage =\n            StrangerCommandSenderOnMessage(this)\n\n        /**\n         * 构造 [OtherClientCommandSenderOnMessage]\n         */\n        @JvmStatic\n        @JvmName(\"from\")\n        public fun OtherClientMessageEvent.toCommandSender(): OtherClientCommandSenderOnMessage =\n            OtherClientCommandSenderOnMessage(this)\n\n        /**\n         * 构造 [OtherClientCommandSenderOnMessageSync]\n         * @since 2.13\n         */\n        @JvmStatic\n        @JvmName(\"from\")\n        public fun MessageSyncEvent.toCommandSender(): OtherClientCommandSenderOnMessageSync =\n            OtherClientCommandSenderOnMessageSync(this)\n\n        /**\n         * 构造 [CommandSenderOnMessage]\n         */\n        @JvmStatic\n        @JvmName(\"from\")\n        @Suppress(\"UNCHECKED_CAST\")\n        public fun <T : MessageEvent> T.toCommandSender(): CommandSenderOnMessage<T> = when (this) {\n            is FriendMessageEvent -> toCommandSender()\n            is GroupMessageEvent -> toCommandSender()\n            is GroupTempMessageEvent -> toCommandSender()\n            is StrangerMessageEvent -> toCommandSender()\n            is OtherClientMessageEvent -> toCommandSender()\n            is MessageSyncEvent -> toCommandSender()\n            else -> throw IllegalArgumentException(\"Unsupported MessageEvent: ${this::class.qualifiedNameOrTip}\")\n        } as CommandSenderOnMessage<T>\n\n        /**\n         * 得到 [TempCommandSender]\n         */\n        @JvmStatic\n        @JvmName(\"of\")\n        public fun NormalMember.asTempCommandSender(): GroupTempCommandSender = GroupTempCommandSender(this)\n\n        /**\n         * 得到 [MemberCommandSender]\n         */\n        @JvmStatic\n        @JvmName(\"of\")\n        public fun Member.asMemberCommandSender(): MemberCommandSender = MemberCommandSender(this)\n\n        /**\n         * 得到 [MemberCommandSender] 或 [TempCommandSender]\n         * @see asTempCommandSender\n         * @see asMemberCommandSender\n         */\n        @JvmStatic\n        @JvmName(\"of\")\n        public fun Member.asCommandSender(isTemp: Boolean): UserCommandSender {\n            return if (isTemp && this is NormalMember) asTempCommandSender() else asMemberCommandSender()\n        }\n\n        /**\n         * 得到 [FriendCommandSender]\n         */\n        @JvmStatic\n        @JvmName(\"of\")\n        public fun Friend.asCommandSender(): FriendCommandSender = FriendCommandSender(this)\n\n        /**\n         * 得到 [StrangerCommandSender]\n         */\n        @JvmStatic\n        @JvmName(\"of\")\n        public fun Stranger.asCommandSender(): StrangerCommandSender = StrangerCommandSender(this)\n\n        /**\n         * 得到 [OtherClientCommandSender]\n         */\n        @JvmStatic\n        @JvmName(\"of\")\n        public fun OtherClient.asCommandSender(): OtherClientCommandSender = OtherClientCommandSender(this)\n\n        /**\n         * 得到 [UserCommandSender]\n         *\n         * @param isTemp\n         */\n        @JvmStatic\n        @JvmName(\"of\")\n        public fun User.asCommandSender(isTemp: Boolean): UserCommandSender = when (this) {\n            is Friend -> this.asCommandSender()\n            is Member -> if (isTemp && this is NormalMember) GroupTempCommandSender(this) else MemberCommandSender(this)\n            is Stranger -> this.asCommandSender()\n            else -> error(\"stub\")\n        }\n    }\n}\n\n/**\n * 一个来自内部系统的命令执行者.\n *\n * 包括\n * - [PluginCustomCommandSender] - 来自插件的命令执行者\n * - [ConsoleCommandSender] - 控制台\n */\npublic sealed interface SystemCommandSender : CommandSender {\n    /**\n     * 当前 [SystemCommandSender] 是否支持 Ansi 信息\n     *\n     * @see AnsiMessageBuilder\n     * @see CommandSender.sendAnsiMessage\n     */\n    public val isAnsiSupported: Boolean\n}\n\n/**\n * 一个来自插件自行实现的 [CommandSender].\n *\n * [PluginCustomCommandSender] 不一定拥有全部的权限. [PluginCustomCommandSender] 可以以其他身份执行命令.\n * 默认情况下 [PluginCustomCommandSender] 以 [ConsoleCommandSender] 的身份执行命令\n *\n * @see PermitteeId\n * @see AbstractPluginCustomCommandSender\n */\npublic interface PluginCustomCommandSender : CommandSender, SystemCommandSender {\n    override val isAnsiSupported: Boolean get() = false\n    override val permitteeId: PermitteeId get() = AbstractPermitteeId.Console\n    public val owner: Plugin\n\n    override suspend fun sendMessage(message: Message): Nothing? {\n        return sendMessage(message.toString())\n    }\n\n    override suspend fun sendMessage(message: String): Nothing?\n}\n\n/**\n * 控制台指令执行者. 代表由控制台执行指令\n *\n * 控制台拥有一切指令的执行权限.\n *\n * 不建议在 [CompositeCommand] 中使用 [ConsoleCommandSender],\n * 使用 [SystemCommandSender] 以允许其他插件执行\n *\n */\npublic object ConsoleCommandSender : AbstractCommandSender(), SystemCommandSender {\n    public const val NAME: String = \"ConsoleCommandSender\"\n\n    public override val bot: Nothing? get() = null\n    public override val subject: Nothing? get() = null\n    public override val user: Nothing? get() = null\n    public override val name: String get() = NAME\n    public override fun toString(): String = NAME\n\n    public override val permitteeId: AbstractPermitteeId.Console = AbstractPermitteeId.Console\n\n    public override val coroutineContext: CoroutineContext by lazy { MiraiConsole.childScopeContext(NAME) }\n\n    @OptIn(ConsoleFrontEndImplementation::class)\n    override val isAnsiSupported: Boolean\n        get() = MiraiConsoleImplementation.getInstance().isAnsiSupported\n\n    @OptIn(ConsoleFrontEndImplementation::class)\n    @JvmBlockingBridge\n    public override suspend fun sendMessage(message: Message): Nothing? {\n        MiraiConsoleImplementation.getInstance().consoleCommandSender.sendMessage(message)\n        return null\n    }\n\n    @OptIn(ConsoleFrontEndImplementation::class)\n    @JvmBlockingBridge\n    public override suspend fun sendMessage(message: String): Nothing? {\n        MiraiConsoleImplementation.getInstance().consoleCommandSender.sendMessage(message)\n        return null\n    }\n}\n\n/**\n * 知道 [Group] 环境的 [UserCommandSender]\n *\n * 可能的子类:\n *\n * - [MemberCommandSender] 代表一个 [群员][Member] 执行指令\n * - [TempCommandSender] 代表一个 [群员][Member] 通过临时会话执行指令\n */\npublic interface GroupAwareCommandSender : UserCommandSender {\n    public val group: Group\n}\n\n/**\n * 代表一个用户执行指令\n *\n * @see MemberCommandSender 代表一个 [群员][Member] 执行指令\n * @see FriendCommandSender 代表一个 [好友][Friend] 执行指令\n * @see TempCommandSender 代表一个 [群员][Member] 通过临时会话执行指令\n * @see StrangerCommandSender 代表一个 [陌生人][Stranger] 执行指令\n *\n * @see CommandSenderOnMessage\n */\npublic interface UserCommandSender : CommandSender {\n    /**\n     * @see MessageEvent.sender\n     */\n    public override val user: User // override nullability\n\n    /**\n     * @see MessageEvent.subject\n     */\n    public override val subject: Contact // override nullability\n    public override val bot: Bot // override nullability\n}\n\n/**\n * 代表一个真实 [用户][User] 主动私聊机器人或在群内发送消息而执行指令\n *\n * @see MemberCommandSenderOnMessage 代表一个真实的 [群员][Member] 主动在群内发送消息执行指令.\n * @see FriendCommandSenderOnMessage 代表一个真实的 [好友][Friend] 主动在私聊消息执行指令\n * @see TempCommandSenderOnMessage 代表一个 [群员][Member] 主动在临时会话发送消息执行指令\n */\npublic interface CommandSenderOnMessage<T : MessageEvent> : CommandSender {\n\n    /**\n     * 消息源 [MessageEvent]\n     */\n    public val fromEvent: T\n}\n\n/**\n * 所有 [CommandSender] 都必须继承自此对象.\n * @see CommandSender 查看更多信息\n */\npublic sealed class AbstractCommandSender : CommandSender, CoroutineScope {\n    public abstract override val bot: Bot?\n    public abstract override val subject: Contact?\n    public abstract override val user: User?\n    public abstract override fun toString(): String\n}\n// endregion\n\n// region extension functions\n\n/**\n * 当 [this] 为 [ConsoleCommandSender] 时返回 `true`\n */\npublic fun CommandSender.isConsole(): Boolean {\n    contract {\n        returns(true) implies (this@isConsole is ConsoleCommandSender)\n    }\n    return this is ConsoleCommandSender\n}\n\n/**\n * 当 [this] 为 [SystemCommandSender] 时返回 `true`\n */\npublic fun CommandSender.isSystem(): Boolean {\n    contract {\n        returns(true) implies (this@isSystem is SystemCommandSender)\n    }\n    return this is SystemCommandSender\n}\n\n/**\n * 当 [this] 不为 [ConsoleCommandSender] 时返回 `true`\n */\npublic fun CommandSender.isNotConsole(): Boolean {\n    contract {\n        returns(true) implies (this@isNotConsole !is ConsoleCommandSender)\n    }\n    return this !is ConsoleCommandSender\n}\n\n/**\n * 当 [this] 为 [UserCommandSender] 时返回 `true`\n */\npublic fun CommandSender.isUser(): Boolean {\n    contract {\n        returns(true) implies (this@isUser is UserCommandSender)\n    }\n    return this is UserCommandSender\n}\n\n/**\n * 当 [this] 不为 [UserCommandSender], 即为 [SystemCommandSender] 时返回 `true`\n */\npublic fun CommandSender.isNotUser(): Boolean {\n    contract {\n        returns(true) implies (this@isNotUser is SystemCommandSender)\n    }\n    return this !is UserCommandSender\n}\n\n/**\n * 折叠 [CommandSender] 的可能性.\n *\n * - 当 [this] 为 [SystemCommandSender] 时执行 [ifIsSystem]\n * - 当 [this] 为 [UserCommandSender] 时执行 [ifIsUser]\n * - 否则执行 [otherwise]\n *\n * ### 示例\n * ```\n * // 当一个指令执行过程出错\n * val exception: Exception = ...\n *\n * sender.fold(\n *     ifIsSystem = { // this: SystemCommandSender\n *         sendMessage(exception.stackTraceToString()) // 展示整个 stacktrace\n *     },\n *     ifIsUser = { // this: UserCommandSender\n *         sendMessage(exception.message.toString()) // 只展示 Exception.message\n *     }\n * )\n * ```\n *\n * @return [ifIsSystem], [ifIsUser] 或 [otherwise] 执行结果.\n */\n@JvmSynthetic\npublic inline fun <R> CommandSender.fold(\n    ifIsSystem: SystemCommandSender.() -> R,\n    ifIsUser: UserCommandSender.() -> R,\n    otherwise: CommandSender.() -> R = { error(\"CommandSender ${this::class.qualifiedName} is not supported\") },\n): R {\n    contract {\n        callsInPlace(ifIsSystem, InvocationKind.AT_MOST_ONCE)\n        callsInPlace(ifIsUser, InvocationKind.AT_MOST_ONCE)\n        callsInPlace(otherwise, InvocationKind.AT_MOST_ONCE)\n    }\n    return when (val sender = this) {\n        is SystemCommandSender -> ifIsSystem(sender)\n        is UserCommandSender -> ifIsUser(sender)\n        else -> otherwise(sender)\n    }\n}\n\n/**\n * 折叠 [UserCommandSender] 的两种可能性, 即在群内发送或在私聊环境发送.\n *\n * - 当 [this] 为 [MemberCommandSender] 时执行 [inGroup]\n * - 当 [this] 为 [TempCommandSender] 或 [FriendCommandSender] 时执行 [inPrivate]\n *\n * ### 实验性 API\n *\n * 这是预览版本 API. 如果你对 [UserCommandSender.foldContext] 有建议, 请在 [mamoe/mirai-console/issues](https://github.com/mamoe/mirai-console/issues/new) 提交.\n *\n * @return [inGroup] 或 [inPrivate] 执行结果.\n */\n@JvmSynthetic\n@ConsoleExperimentalApi\npublic inline fun <R> UserCommandSender.foldContext(\n    inGroup: MemberCommandSender.() -> R,\n    inPrivate: UserCommandSender.() -> R,\n): R {\n    contract {\n        callsInPlace(inGroup, InvocationKind.AT_MOST_ONCE)\n        callsInPlace(inPrivate, InvocationKind.AT_MOST_ONCE)\n    }\n    return when (val sender = this) {\n        is MemberCommandSender -> inGroup(sender)\n        else -> inPrivate(sender)\n    }\n}\n\n/**\n * 尝试获取 [Bot].\n *\n * 当 [UserCommandSender] 时返回 [UserCommandSender.bot], 否则返回 `null`\n *\n * ### 契约\n * 本函数定义契约,\n * - 若返回非 `null` 实例, Kotlin 编译器认为 [this] 是 [UserCommandSender] 实例并执行智能类型转换.\n * - 若返回 `null`, Kotlin 编译器认为 [this] 是 [SystemCommandSender] 实例并执行智能类型转换.\n */\npublic fun CommandSender.getBotOrNull(): Bot? {\n    contract {\n        returns(null) implies (this@getBotOrNull is SystemCommandSender)\n        returnsNotNull() implies (this@getBotOrNull is UserCommandSender)\n    }\n    return this.castOrNull<UserCommandSender>()?.bot\n}\n\n/**\n * 尝试获取 [Group].\n *\n * 当 [GroupAwareCommandSender] 时返回 [GroupAwareCommandSender.group], 否则返回 `null`\n *\n * ### 契约\n * 本函数定义契约,\n * - 若返回非 `null` 实例, Kotlin 编译器认为 [this] 是 [GroupAwareCommandSender] 实例并执行智能类型转换.\n * - 若返回 `null`, Kotlin 编译器认为 [this] 是 [FriendCommandSender] 实例并执行智能类型转换.\n */\npublic fun CommandSender.getGroupOrNull(): Group? {\n    contract {\n        returns(null) implies (this@getGroupOrNull is FriendCommandSender)\n        returnsNotNull() implies (this@getGroupOrNull is GroupAwareCommandSender)\n    }\n    return this.castOrNull<GroupAwareCommandSender>()?.group\n}\n\n// endregion\n\n// region implementations\n\n///////////////////////////////////////////////////////////////////////////\n// UserCommandSender\n///////////////////////////////////////////////////////////////////////////\n\n/**\n * [UserCommandSender] 的实现\n */\npublic sealed class AbstractUserCommandSender : UserCommandSender, AbstractCommandSender() {\n    public override val bot: Bot get() = user.bot // don't final\n    public final override val name: String get() = user.nameCardOrNick\n\n    @JvmBlockingBridge\n    public override suspend fun sendMessage(message: String): MessageReceipt<Contact> = sendMessage(PlainText(message))\n\n    @JvmBlockingBridge\n    public override suspend fun sendMessage(message: Message): MessageReceipt<Contact> = user.sendMessage(message)\n}\n\n/**\n * 代表一个 [好友][Friend] 执行指令, 但不一定是通过私聊方式, 也有可能是由插件在代码直接执行 ([CommandManager.executeCommand])\n * @see FriendCommandSenderOnMessage 代表一个真实的 [好友][Friend] 主动在私聊消息执行指令\n */\npublic open class FriendCommandSender internal constructor(\n    public final override val user: Friend,\n) : AbstractUserCommandSender(), CoroutineScope by user.childScope(\"FriendCommandSender\") {\n    public override val subject: Contact get() = user\n    public override fun toString(): String = \"FriendCommandSender($user)\"\n\n    public override val permitteeId: PermitteeId = AbstractPermitteeId.ExactFriend(user.id)\n\n    @JvmBlockingBridge\n    public override suspend fun sendMessage(message: String): MessageReceipt<Friend> = sendMessage(PlainText(message))\n\n    @JvmBlockingBridge\n    public override suspend fun sendMessage(message: Message): MessageReceipt<Friend> = user.sendMessage(message)\n}\n\n/**\n * 代表一个 [群员][Member] 执行指令, 但不一定是通过群内发消息方式, 也有可能是由插件在代码直接执行 ([CommandManager.executeCommand])\n * @see MemberCommandSenderOnMessage 代表一个真实的 [群员][Member] 主动在群内发送消息执行指令.\n */\npublic open class MemberCommandSender internal constructor(\n    public final override val user: Member,\n) : AbstractUserCommandSender(), GroupAwareCommandSender, CoroutineScope by user.childScope(\"MemberCommandSender\") {\n    public final override val group: Group get() = user.group\n    public override val subject: Group get() = group\n    public override fun toString(): String = \"MemberCommandSender($user)\"\n\n    public override val permitteeId: PermitteeId = AbstractPermitteeId.ExactMember(group.id, user.id)\n\n    @JvmBlockingBridge\n    public override suspend fun sendMessage(message: String): MessageReceipt<Group> = sendMessage(PlainText(message))\n\n    @JvmBlockingBridge\n    public override suspend fun sendMessage(message: Message): MessageReceipt<Group> = subject.sendMessage(message)\n}\n\n/**\n * 代表一个 [群员][Member] 通过临时会话执行指令, 但不一定是通过私聊方式, 也有可能是由插件在代码直接执行 ([CommandManager.executeCommand])\n * @see TempCommandSenderOnMessage 代表一个 [群员][Member] 主动在临时会话发送消息执行指令\n */\n@Deprecated(\n    \"mirai 正计划支持其他渠道发起的临时会话, 届时此事件会变动. 原 TempCommandSender 已更改为 GroupTempCommandSender\",\n    replaceWith = ReplaceWith(\"GroupTempCommandSender\", \"net.mamoe.mirai.console.command.GroupTempCommandSender\"),\n    DeprecationLevel.HIDDEN\n)\n@DeprecatedSinceMirai(errorSince = \"2.0\", hiddenSince = \"2.10\")\npublic sealed class TempCommandSender(\n    public override val user: NormalMember,\n) : AbstractUserCommandSender(), GroupAwareCommandSender, CoroutineScope by user.childScope(\"TempCommandSender\")\n\n/**\n * 代表一个 [群员][Member] 通过临时会话执行指令, 但不一定是通过私聊方式, 也有可能是由插件在代码直接执行 ([CommandManager.executeCommand])\n * @see TempCommandSenderOnMessage 代表一个 [群员][Member] 主动在临时会话发送消息执行指令\n */\n@Suppress(\"DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE\")\npublic open class GroupTempCommandSender internal constructor(\n    public final override val user: NormalMember,\n) : @Suppress(\"DEPRECATION_ERROR\") TempCommandSender(user),\n    CoroutineScope by user.childScope(\"GroupTempCommandSender\") {\n    public override val group: Group get() = user.group\n    public override val subject: NormalMember get() = user\n    public override fun toString(): String = \"GroupTempCommandSender($user)\"\n\n    public override val permitteeId: PermitteeId =\n        AbstractPermitteeId.ExactGroupTemp(user.group.id, user.id)\n\n    @JvmBlockingBridge\n    public override suspend fun sendMessage(message: String): MessageReceipt<Member> = sendMessage(PlainText(message))\n\n    @JvmBlockingBridge\n    public override suspend fun sendMessage(message: Message): MessageReceipt<Member> = user.sendMessage(message)\n}\n\n/**\n * 代表一个 [陌生人][Stranger] 通过私聊执行指令, 但不一定是通过私聊方式, 也有可能是由插件在代码直接执行 ([CommandManager.executeCommand])\n * @see StrangerCommandSenderOnMessage 代表一个 [陌生人][Stranger] 主动在私聊发送消息执行指令\n */\npublic open class StrangerCommandSender internal constructor(\n    public final override val user: Stranger,\n) : AbstractUserCommandSender(), CoroutineScope by user.childScope(\"StrangerCommandSender\") {\n    public override val subject: Stranger get() = user\n    public override fun toString(): String = \"StrangerCommandSender($user)\"\n\n    public override val permitteeId: PermitteeId = AbstractPermitteeId.ExactStranger(user.id)\n\n    @JvmBlockingBridge\n    public override suspend fun sendMessage(message: String): MessageReceipt<Stranger> = sendMessage(PlainText(message))\n\n    @JvmBlockingBridge\n    public override suspend fun sendMessage(message: Message): MessageReceipt<Stranger> = user.sendMessage(message)\n}\n\n/**\n * 代表一个 [其他客户端][OtherClient] 通过私聊执行指令, 但不一定是通过私聊方式, 也有可能是由插件在代码直接执行 ([CommandManager.executeCommand])\n * @see OtherClientCommandSenderOnMessage 代表一个[其他客户端][OtherClient] 主动在私聊发送消息执行指令\n */\npublic open class OtherClientCommandSender internal constructor(\n    public val client: OtherClient,\n) : AbstractCommandSender(), CoroutineScope by client.childScope(\"OtherClientCommandSender\") {\n    public final override val user: Friend get() = client.bot.asFriend\n    public final override val bot: Bot get() = client.bot\n    public final override val name: String get() = client.bot.nick\n    public override val subject: Friend get() = user\n    public override fun toString(): String = \"OtherClientCommandSender($user)\"\n\n    public override val permitteeId: PermitteeId = AbstractPermitteeId.AnyOtherClient\n\n    @JvmBlockingBridge\n    public override suspend fun sendMessage(message: String): MessageReceipt<OtherClient> =\n        sendMessage(PlainText(message))\n\n    @JvmBlockingBridge\n    public override suspend fun sendMessage(message: Message): MessageReceipt<OtherClient> = client.sendMessage(message)\n}\n\n///////////////////////////////////////////////////////////////////////////\n// CommandSenderOnMessage\n///////////////////////////////////////////////////////////////////////////\n\n/**\n * 代表一个真实的 [好友][Friend] 主动在私聊消息执行指令\n * @see FriendCommandSender 代表一个 [好友][Friend] 执行指令, 但不一定是通过私聊方式\n */\npublic class FriendCommandSenderOnMessage internal constructor(\n    public override val fromEvent: FriendMessageEvent,\n) : FriendCommandSender(fromEvent.sender), CommandSenderOnMessage<FriendMessageEvent>\n\n/**\n * 代表一个真实的 [群员][Member] 主动在群内发送消息执行指令.\n * @see MemberCommandSender 代表一个 [群员][Member] 执行指令, 但不一定是通过群内发消息方式\n */\npublic class MemberCommandSenderOnMessage internal constructor(\n    public override val fromEvent: GroupMessageEvent,\n) : MemberCommandSender(fromEvent.sender), CommandSenderOnMessage<GroupMessageEvent>\n\n/**\n * 代表一个 [群员][Member] 主动在临时会话发送消息执行指令\n * @see TempCommandSender 代表一个 [群员][Member] 执行指令, 但不一定是通过私聊方式\n */\n@Deprecated(\n    \"mirai 正计划支持其他渠道发起的临时会话, 届时此事件会变动. 原 TempCommandSenderOnMessage 已更改为 GroupTempCommandSenderOnMessage\",\n    replaceWith = ReplaceWith(\n        \"GroupTempCommandSenderOnMessage\",\n        \"net.mamoe.mirai.console.command.GroupTempCommandSenderOnMessage\"\n    ),\n    DeprecationLevel.HIDDEN\n)\n@DeprecatedSinceMirai(errorSince = \"2.0\", hiddenSince = \"2.10\")\npublic sealed class TempCommandSenderOnMessage(\n    public override val fromEvent: GroupTempMessageEvent,\n) : GroupTempCommandSender(fromEvent.sender), CommandSenderOnMessage<GroupTempMessageEvent>\n\n/**\n * 代表一个 [群员][Member] 主动在临时会话发送消息执行指令\n * @see TempCommandSender 代表一个 [群员][Member] 执行指令, 但不一定是通过私聊方式\n */\npublic class GroupTempCommandSenderOnMessage internal constructor(\n    public override val fromEvent: GroupTempMessageEvent,\n) : @Suppress(\"DEPRECATION_ERROR\") TempCommandSenderOnMessage(fromEvent), CommandSenderOnMessage<GroupTempMessageEvent>\n\n/**\n * 代表一个 [陌生人][Stranger] 主动在私聊发送消息执行指令\n * @see StrangerCommandSender 代表一个 [陌生人][Stranger] 执行指令, 但不一定是通过私聊方式\n */\npublic class StrangerCommandSenderOnMessage internal constructor(\n    public override val fromEvent: StrangerMessageEvent,\n) : StrangerCommandSender(fromEvent.sender), CommandSenderOnMessage<StrangerMessageEvent>\n\n/**\n * 代表一个 [其他客户端][OtherClient] 主动在私聊发送消息执行指令\n * @see OtherClientCommandSender 代表一个 [其他客户端][OtherClient] 执行指令, 但不一定是通过私聊方式\n */\npublic class OtherClientCommandSenderOnMessage internal constructor(\n    public override val fromEvent: OtherClientMessageEvent,\n) : OtherClientCommandSender(fromEvent.client), CommandSenderOnMessage<OtherClientMessageEvent>\n\n/**\n * 代表一个 [其他客户端][OtherClient] 主动在群内、好友聊天等发送消息执行指令\n * @see OtherClientCommandSender 代表一个 [其他客户端][OtherClient] 执行指令, 但不一定是通过私聊方式\n * @since 2.13\n */\npublic class OtherClientCommandSenderOnMessageSync internal constructor(\n    public override val fromEvent: MessageSyncEvent,\n) : OtherClientCommandSender(fromEvent.client), CommandSenderOnMessage<MessageSyncEvent>\n\n// endregion\n\n// region PluginCustomCommandSender implementations\n/**\n * 所有 [PluginCustomCommandSender] 的父类\n *\n * Java 见 [AbstractPluginCustomCommandSenderJ]\n */\npublic abstract class AbstractPluginCustomCommandSender(\n    final override val owner: Plugin,\n) : AbstractCommandSender(), PluginCustomCommandSender {\n    override val coroutineContext: CoroutineContext by lazy {\n        if (owner is CoroutineScope) {\n            return@lazy owner.childScopeContext(name)\n        }\n        // Fallback\n        return@lazy MiraiConsole.childScopeContext(\"PluginCustomCommandSender-$name\")\n    }\n    override val name: String get() = owner.name\n    override fun toString(): String = name\n\n    override val isAnsiSupported: Boolean get() = false\n    override val permitteeId: PermitteeId get() = AbstractPermitteeId.Console\n\n    override val bot: Bot? get() = null\n    override val subject: Contact? get() = null\n    override val user: User? get() = null\n\n    override suspend fun sendMessage(message: String): Nothing? {\n        sendMessage0(message)\n        return null\n    }\n\n    protected abstract suspend fun sendMessage0(message: String)\n}\n\n@JavaFriendlyApi\npublic abstract class AbstractPluginCustomCommandSenderJ(\n    owner: Plugin\n) : AbstractPluginCustomCommandSender(owner) {\n    protected abstract fun sendMessageImpl(message: String)\n\n    final override suspend fun sendMessage(message: String): Nothing? {\n        sendMessageImpl(message)\n        return null\n    }\n\n    final override suspend fun sendMessage0(message: String) {\n        sendMessageImpl(message)\n    }\n}\n// endregion\n\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/CompositeCommand.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.command\n\nimport net.mamoe.mirai.console.command.descriptor.*\nimport net.mamoe.mirai.console.command.java.JCompositeCommand\nimport net.mamoe.mirai.console.compiler.common.ResolveContext\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.COMMAND_NAME\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.RESTRICTED_CONSOLE_COMMAND_OWNER\nimport net.mamoe.mirai.console.internal.command.CommandReflector\nimport net.mamoe.mirai.console.internal.command.CompositeCommandSubCommandAnnotationResolver\nimport net.mamoe.mirai.console.permission.Permission\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport kotlin.annotation.AnnotationRetention.RUNTIME\nimport kotlin.annotation.AnnotationTarget.FUNCTION\n\n\n/**\n * 复合指令. 指令注册时候会通过反射构造指令解析器.\n *\n * Java 示例查看 [JCompositeCommand].\n *\n * Kotlin 示例:\n * ```\n * @OptIn(ConsoleExperimentalAPI::class)\n * object MyCompositeCommand : CompositeCommand(\n *     MyPluginMain, \"manage\", // \"manage\" 是主指令名\n *     description = \"示例指令\", permission = MyCustomPermission,\n *     // prefixOptional = true // 还有更多参数可填, 此处忽略\n * ) {\n *\n *     // [参数智能解析]\n *     //\n *     // 在控制台执行 \"/manage <群号>.<群员> <持续时间>\",\n *     // 或在聊天群内发送 \"/manage <@一个群员> <持续时间>\",\n *     // 或在聊天群内发送 \"/manage <目标群员的群名> <持续时间>\",\n *     // 或在聊天群内发送 \"/manage <目标群员的账号> <持续时间>\"\n *     // 时调用这个函数\n *     @SubCommand // 表示这是一个子指令，使用函数名作为子指令名称\n *     suspend fun CommandSender.mute(target: Member, duration: Int) { // 通过 /manage mute <target> <duration> 调用\n *         sendMessage(\"/manage mute 被调用了, 参数为: $target, $duration\")\n *\n *         val result = kotlin.runCatching {\n *             target.mute(duration).toString()\n *         }.getOrElse {\n *             it.stackTraceToString()\n *         } // 失败时返回堆栈信息\n *\n *         sendMessage(\"结果: $result\")\n *     }\n *\n *     @SubCommand\n *     suspend fun SystemCommandSender.foo() {\n *         // 使用 SystemCommandSender 作为接收者，表示指令只能由系统(控制台或其他插件)执行。\n *         // 当用户尝试在聊天环境执行时将会收到错误提示。\n *     }\n *\n *     @SubCommand(\"list\", \"查看列表\") // 可以设置多个子指令名。此时函数名会被忽略。\n *     suspend fun CommandSender.list() { // 执行 \"/manage list\" 时调用这个函数\n *         sendMessage(\"/manage list 被调用了\")\n *     }\n *\n *     @SubCommand\n *     suspend fun CommandContext.repeat() {\n *         // 使用 CommandContext 作为参数，可以获得触发指令的原消息链 originalMessage，其中包含 MessageMetadata。\n *         sender.sendMessage(originalMessage)\n *     }\n *\n *     // 支持 Image 类型, 需在聊天中执行此指令.\n *     @SubCommand\n *     suspend fun UserCommandSender.test(image: Image) { // 执行 \"/manage test <一张图片>\" 时调用这个函数\n *         // 由于 Image 类型消息只可能在聊天环境，可以直接使用 UserCommandSender。\n *         sendMessage(\"/manage image 被调用了, 图片是 ${image.imageId}\")\n *     }\n * }\n * ```\n *\n * @see buildCommandArgumentContext\n */\npublic abstract class CompositeCommand(\n    @ResolveContext(RESTRICTED_CONSOLE_COMMAND_OWNER) owner: CommandOwner,\n    @ResolveContext(COMMAND_NAME) primaryName: String,\n    @ResolveContext(COMMAND_NAME) vararg secondaryNames: String,\n    description: String = \"no description available\",\n    parentPermission: Permission = owner.parentPermission,\n    overrideContext: CommandArgumentContext = EmptyCommandArgumentContext,\n) : Command, AbstractCommand(owner, primaryName, secondaryNames = secondaryNames, description, parentPermission),\n    CommandArgumentContextAware {\n\n    private val reflector by lazy { CommandReflector(this, CompositeCommandSubCommandAnnotationResolver) }\n\n    @ExperimentalCommandDescriptors\n    public final override val overloads: List<@JvmWildcard CommandSignatureFromKFunction> by lazy {\n        reflector.findSubCommands().also {\n            reflector.validate(it)\n        }\n    }\n\n    /**\n     * 自动根据带有 [SubCommand] 注解的函数签名生成 [usage]. 也可以被覆盖.\n     */\n    public override val usage: String by lazy {\n        @OptIn(ExperimentalCommandDescriptors::class)\n        reflector.generateUsage(overloads)\n    }\n\n    /**\n     * 智能参数解析环境\n     */ // open since 2.12\n    public override val context: CommandArgumentContext = CommandArgumentContext.Builtins + overrideContext\n\n    /**\n     * 标记一个函数为子指令, 当 [value] 为空时使用函数名.\n     * @param value 子指令名\n     */\n    @Retention(RUNTIME)\n    @Target(FUNCTION)\n    protected annotation class SubCommand(\n        @ResolveContext(COMMAND_NAME) vararg val value: String = [],\n    )\n\n    /** 指令描述 */\n    @Retention(RUNTIME)\n    @Target(FUNCTION)\n    protected annotation class Description(val value: String)\n\n    /** 参数名, 将参与构成 [usage] */\n    @ConsoleExperimentalApi(\"Classname might change\")\n    @Retention(RUNTIME)\n    @Target(AnnotationTarget.VALUE_PARAMETER)\n    protected annotation class Name(val value: String)\n}\n\n\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/IllegalCommandArgumentException.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.command\n\nimport net.mamoe.mirai.console.command.descriptor.CommandArgumentParserException\n\n/**\n * 在处理参数时遇到的 _正常_ 错误. 如参数不符合规范, 参数值越界等.\n *\n * [message] 将会发送给指令调用方.\n *\n * 如果指令调用方是 [ConsoleCommandSender],\n * 还会将 [cause], [suppressedExceptions] 发送给 [ConsoleCommandSender] (如果存在)\n *\n * @see CommandArgumentParserException\n */\npublic open class IllegalCommandArgumentException @JvmOverloads constructor(\n    message: String,\n    cause: Throwable? = null,\n) : IllegalArgumentException(message, cause)"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/RawCommand.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.command\n\nimport net.mamoe.mirai.console.command.descriptor.*\nimport net.mamoe.mirai.console.command.java.JRawCommand\nimport net.mamoe.mirai.console.compiler.common.ResolveContext\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.COMMAND_NAME\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.RESTRICTED_CONSOLE_COMMAND_OWNER\nimport net.mamoe.mirai.console.internal.command.findOrCreateCommandPermission\nimport net.mamoe.mirai.console.permission.Permission\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.buildMessageChain\n\n/**\n * 无参数解析, 只会接收原消息链的指令. Java 查看 [JRawCommand].\n *\n * ```kotlin\n * object MyCommand : RawCommand(\n *     MyPluginMain, \"name\", // 使用插件主类对象作为指令拥有者；设置主指令名为 \"name\"\n *     // 可选：\n *     \"name2\", \"name3\", // 增加两个次要名称\n *     usage = \"/name arg1 arg2\", // 设置用法，将会在 /help 展示\n *     description = \"这是一个测试指令\", // 设置描述，将会在 /help 展示\n *     prefixOptional = true, // 设置指令前缀是可选的，即使用 `test` 也能执行指令而不需要 `/test`\n * ) {\n *     override suspend fun CommandContext.onCommand(args: MessageChain) {\n *     }\n * }\n * ```\n *\n * @see JRawCommand 供 Java 用户继承.\n *\n * @see SimpleCommand 简单指令\n * @see CompositeCommand 复合指令\n */\npublic abstract class RawCommand(\n    /**\n     * 指令拥有者. 通常建议使用插件主类.\n     * @see CommandOwner\n     */\n    @ResolveContext(RESTRICTED_CONSOLE_COMMAND_OWNER)\n    public override val owner: CommandOwner,\n    /** 主指令名. */\n    @ResolveContext(COMMAND_NAME)\n    public override val primaryName: String,\n    /** 次要指令名. */\n    @ResolveContext(COMMAND_NAME)\n    public override vararg val secondaryNames: String,\n    /** 用法说明, 用于发送给用户 */\n    public override val usage: String = \"<no usages given>\",\n    /** 指令描述, 用于显示在 [BuiltInCommands.HelpCommand] */\n    public override val description: String = \"<no descriptions given>\",\n    /** 指令父权限 */\n    parentPermission: Permission = owner.parentPermission,\n    /** 为 `true` 时表示 [指令前缀][CommandManager.commandPrefix] 可选 */\n    @OptIn(ExperimentalCommandDescriptors::class)\n    public override val prefixOptional: Boolean = false,\n) : Command {\n    public override val permission: Permission by lazy { findOrCreateCommandPermission(parentPermission) }\n\n    @ExperimentalCommandDescriptors\n    override val overloads: List<@JvmWildcard CommandSignature> = listOf(\n        CommandSignatureImpl(\n            receiverParameter = CommandReceiverParameter.Context(false),\n            valueParameters = listOf(\n                AbstractCommandValueParameter.UserDefinedType.createRequired<Array<out Message>>(\n                    \"args\",\n                    true\n                )\n            )\n        ) { call ->\n            val sender = call.caller\n            val arguments = call.rawValueArguments\n            val context = CommandContextImpl(sender, call.originalMessage)\n            context.onCommand(buildMessageChain { arguments.forEach { +it.value } })\n        }\n    )\n\n    /**\n     * 在指令被执行时调用.\n     *\n     * @param args 指令参数.\n     *\n     * @see CommandManager.executeCommand 查看更多信息\n     */\n    public open suspend fun CommandSender.onCommand(args: MessageChain) {\n\n    }\n\n    /**\n     * 在指令被执行时调用.\n     *\n     * @param args 指令参数.\n     * @see CommandManager.executeCommand 查看更多信息\n     *\n     * @since 2.12\n     */\n    public open suspend fun CommandContext.onCommand(args: MessageChain) {\n        return sender.onCommand(args)\n    }\n}\n\n\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/SimpleCommand.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.command\n\nimport net.mamoe.mirai.console.command.descriptor.*\nimport net.mamoe.mirai.console.command.java.JSimpleCommand\nimport net.mamoe.mirai.console.compiler.common.ResolveContext\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.COMMAND_NAME\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.RESTRICTED_CONSOLE_COMMAND_OWNER\nimport net.mamoe.mirai.console.internal.command.CommandReflector\nimport net.mamoe.mirai.console.internal.command.IllegalCommandDeclarationException\nimport net.mamoe.mirai.console.internal.command.SimpleCommandSubCommandAnnotationResolver\nimport net.mamoe.mirai.console.permission.Permission\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport kotlin.annotation.AnnotationTarget.FUNCTION\nimport kotlin.annotation.AnnotationTarget.VALUE_PARAMETER\n\n/**\n * 简单的, 支持参数自动解析的指令.\n *\n * 要查看指令解析流程, 参考 [CommandManager.executeCommand].\n * 要查看参数解析方式, 参考 [CommandValueArgumentParser].\n *\n * Java 示例查看 [JSimpleCommand].\n *\n * Kotlin 示例:\n * ```\n * object MySimpleCommand : SimpleCommand(\n *     MyPlugin, \"tell\",\n *     description = \"Message somebody\"\n * ) {\n *     @Handler\n *     suspend fun CommandSender.onCommand(target: User, message: String) {\n *         target.sendMessage(message)\n *     }\n * }\n * ```\n *\n * 其中 `CommandSender` 也可以替换为 `CommandContext`，可通过 [CommandContext.originalMessage] 获得触发指令的原消息链。\n *\n * @see JSimpleCommand Java 实现\n * @see [CommandManager.executeCommand]\n */\npublic abstract class SimpleCommand(\n    @ResolveContext(RESTRICTED_CONSOLE_COMMAND_OWNER) owner: CommandOwner,\n    @ResolveContext(COMMAND_NAME) primaryName: String,\n    @ResolveContext(COMMAND_NAME) vararg secondaryNames: String,\n    description: String = \"no description available\",\n    parentPermission: Permission = owner.parentPermission,\n    overrideContext: CommandArgumentContext = EmptyCommandArgumentContext,\n) : Command, AbstractCommand(owner, primaryName, secondaryNames = secondaryNames, description, parentPermission),\n    CommandArgumentContextAware {\n\n    private val reflector by lazy { CommandReflector(this, SimpleCommandSubCommandAnnotationResolver) }\n\n    @OptIn(ConsoleExperimentalApi::class)\n    @ExperimentalCommandDescriptors\n    public final override val overloads: List<@JvmWildcard CommandSignatureFromKFunction> by lazy {\n        reflector.findSubCommands().also {\n            reflector.validate(it)\n            if (it.isEmpty())\n                throw IllegalCommandDeclarationException(\n                    this,\n                    \"SimpleCommand must have at least one subcommand, whereas zero present.\"\n                )\n        }\n    }\n\n    /**\n     * 自动根据带有 [Handler] 注解的函数签名生成 [usage]. 也可以被覆盖.\n     */\n    public override val usage: String by lazy {\n        @OptIn(ExperimentalCommandDescriptors::class)\n        reflector.generateUsage(overloads)\n    }\n\n    /**\n     * 标注指令处理器\n     */\n    @Target(FUNCTION)\n    protected annotation class Handler\n\n    /** 参数名, 将参与构成 [usage] */\n    @ConsoleExperimentalApi(\"Classname might change\")\n    @Target(VALUE_PARAMETER)\n    protected annotation class Name(val value: String)\n\n    /**\n     * 指令参数环境. 默认为 [CommandArgumentContext.Builtins] `+` `overrideContext`\n     */\n    public override val context: CommandArgumentContext = CommandArgumentContext.Builtins + overrideContext\n}\n\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/descriptor/CommandArgumentContext.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\", \"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"unused\", \"MemberVisibilityCanBePrivate\")\n\npackage net.mamoe.mirai.console.command.descriptor\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.console.command.CommandSender\nimport net.mamoe.mirai.console.command.CompositeCommand\nimport net.mamoe.mirai.console.command.SimpleCommand\nimport net.mamoe.mirai.console.command.descriptor.CommandArgumentContext.ParserPair\nimport net.mamoe.mirai.console.permission.PermissionId\nimport net.mamoe.mirai.console.permission.PermitteeId\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.message.data.MessageContent\nimport net.mamoe.mirai.message.data.PlainText\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport java.time.*\nimport java.time.temporal.TemporalAccessor\nimport java.util.*\nimport kotlin.contracts.InvocationKind.EXACTLY_ONCE\nimport kotlin.contracts.contract\nimport kotlin.internal.LowPriorityInOverloadResolution\nimport kotlin.reflect.KClass\nimport kotlin.reflect.full.isSubclassOf\n\n\n/**\n * 指令参数环境, 即 [CommandValueArgumentParser] 的集合, 用于 [CompositeCommand] 和 [SimpleCommand].\n *\n * 在指令解析时, 总是从 [CommandArgumentContextAware.context] 搜索相关解析器\n *\n * 要构造 [CommandArgumentContext], 参考 [buildCommandArgumentContext]\n *\n * @see SimpleCommandArgumentContext 简单实现\n * @see EmptyCommandArgumentContext 空实现, 类似 [emptyList]\n *\n * @see CommandArgumentContext.Builtins 内建 [CommandValueArgumentParser]\n *\n * @see buildCommandArgumentContext DSL 构造\n */\npublic interface CommandArgumentContext {\n    /**\n     * [KClass] 到 [CommandValueArgumentParser] 的匹配\n     */\n    public data class ParserPair<T : Any>(\n        val klass: KClass<T>,\n        val parser: CommandValueArgumentParser<T>,\n    ) {\n        public companion object {\n            @JvmStatic\n            public fun <T : Any> ParserPair<T>.toPair(): Pair<KClass<T>, CommandValueArgumentParser<T>> =\n                klass to parser\n        }\n    }\n\n    /**\n     * 获取一个 [kClass] 类型的解析器.\n     */\n    public operator fun <T : Any> get(kClass: KClass<T>): CommandValueArgumentParser<T>?\n\n    public fun toList(): List<ParserPair<*>>\n\n    public companion object {\n        /**\n         * For Java callers.\n         *\n         * @see EmptyCommandArgumentContext\n         */\n        @JvmField // public static final CommandArgumentContext EMPTY;\n        public val EMPTY: CommandArgumentContext = EmptyCommandArgumentContext\n    }\n\n    private object EnumCommandArgumentContext : CommandArgumentContext {\n        private val cache = WeakHashMap<Class<*>, CommandValueArgumentParser<*>>()\n        private val enumKlass = Enum::class\n        override fun <T : Any> get(kClass: KClass<T>): CommandValueArgumentParser<T>? {\n            return if (kClass.isSubclassOf(enumKlass)) {\n                val jclass = kClass.java.asSubclass(Enum::class.java)\n                @Suppress(\"UNCHECKED_CAST\")\n                (cache[jclass] ?: kotlin.run {\n                    EnumValueArgumentParser(jclass).also { cache[jclass] = it }\n                }) as CommandValueArgumentParser<T>\n            } else null\n        }\n\n        override fun toList(): List<ParserPair<*>> = emptyList()\n    }\n\n    private object TemporalCommandArgumentContext : CommandArgumentContext {\n        private val cache = HashMap<KClass<*>, CommandValueArgumentParser<*>>()\n\n        @OptIn(MiraiExperimentalApi::class)\n        private fun <T : TemporalAccessor> put(kClass: KClass<T>, now: () -> T, parse: (CharSequence) -> T) {\n            cache[kClass] = TemporalArgumentParser(kClass.java, now, parse)\n        }\n\n        init {\n            put(Instant::class, Instant::now, Instant::parse)\n            put(Year::class, Year::now, Year::parse)\n            put(YearMonth::class, YearMonth::now, YearMonth::parse)\n            put(LocalDate::class, LocalDate::now, LocalDate::parse)\n            put(LocalTime::class, LocalTime::now, LocalTime::parse)\n            put(LocalDateTime::class, LocalDateTime::now, LocalDateTime::parse)\n            put(OffsetTime::class, OffsetTime::now, OffsetTime::parse)\n            put(OffsetDateTime::class, OffsetDateTime::now, OffsetDateTime::parse)\n            put(ZonedDateTime::class, ZonedDateTime::now, ZonedDateTime::parse)\n            put(MonthDay::class, MonthDay::now, MonthDay::parse)\n            put(ZoneOffset::class, { OffsetDateTime.now().offset }, { ZoneOffset.of(it.toString()) })\n        }\n\n        @Suppress(\"UNCHECKED_CAST\")\n        override fun <T : Any> get(kClass: KClass<T>): CommandValueArgumentParser<T>? {\n            return cache[kClass] as CommandValueArgumentParser<T>?\n        }\n\n        override fun toList(): List<ParserPair<*>> = emptyList()\n    }\n\n    /**\n     * 内建的默认 [CommandValueArgumentParser]\n     */\n    public object Builtins : CommandArgumentContext by listOf(\n        EnumCommandArgumentContext,\n        buildCommandArgumentContext {\n            Int::class with IntValueArgumentParser\n            Byte::class with ByteValueArgumentParser\n            Short::class with ShortValueArgumentParser\n            Boolean::class with BooleanValueArgumentParser\n            String::class with StringValueArgumentParser\n            Long::class with LongValueArgumentParser\n            Double::class with DoubleValueArgumentParser\n            Float::class with FloatValueArgumentParser\n\n            Image::class with ImageValueArgumentParser\n            PlainText::class with PlainTextValueArgumentParser\n\n            Contact::class with ExistingContactValueArgumentParser\n            User::class with ExistingUserValueArgumentParser\n            Member::class with ExistingMemberValueArgumentParser\n            Group::class with ExistingGroupValueArgumentParser\n            Friend::class with ExistingFriendValueArgumentParser\n            Bot::class with ExistingBotValueArgumentParser\n\n            PermissionId::class with PermissionIdValueArgumentParser\n            PermitteeId::class with PermitteeIdValueArgumentParser\n\n            MessageContent::class with RawContentValueArgumentParser\n        },\n        TemporalCommandArgumentContext,\n    ).fold(EmptyCommandArgumentContext, CommandArgumentContext::plus)\n}\n\n/**\n * 拥有 [buildCommandArgumentContext] 的类\n *\n * @see SimpleCommand\n * @see CompositeCommand\n */\npublic interface CommandArgumentContextAware {\n    /**\n     * [CommandValueArgumentParser] 的集合\n     */\n    public val context: CommandArgumentContext\n}\n\n/**\n * @see CommandArgumentContext.EMPTY\n */\npublic object EmptyCommandArgumentContext : CommandArgumentContext by SimpleCommandArgumentContext(listOf())\n\n/**\n * 合并两个 [buildCommandArgumentContext], [replacer] 将会替换 [this] 中重复的 parser.\n */\npublic operator fun CommandArgumentContext.plus(replacer: CommandArgumentContext): CommandArgumentContext {\n    if (replacer === EmptyCommandArgumentContext) return this\n    if (this == EmptyCommandArgumentContext) return replacer\n    return object : CommandArgumentContext {\n        override fun <T : Any> get(kClass: KClass<T>): CommandValueArgumentParser<T>? =\n            replacer[kClass] ?: this@plus[kClass]\n\n        override fun toList(): List<ParserPair<*>> = replacer.toList() + this@plus.toList()\n    }\n}\n\n/**\n * 合并 [this] 与 [replacer], [replacer] 将会替换 [this] 中重复的 parser.\n */\npublic operator fun CommandArgumentContext.plus(replacer: List<ParserPair<*>>): CommandArgumentContext {\n    if (replacer.isEmpty()) return this\n    if (this === EmptyCommandArgumentContext) return SimpleCommandArgumentContext(replacer)\n    return object : CommandArgumentContext {\n        @Suppress(\"UNCHECKED_CAST\")\n        override fun <T : Any> get(kClass: KClass<T>): CommandValueArgumentParser<T>? =\n            replacer.firstOrNull { kClass.isSubclassOf(it.klass) }?.parser as CommandValueArgumentParser<T>?\n                ?: this@plus[kClass]\n\n        override fun toList(): List<ParserPair<*>> = replacer.toList() + this@plus.toList()\n    }\n}\n\n/**\n * 自定义 [buildCommandArgumentContext]\n *\n * @see buildCommandArgumentContext\n */\n@Suppress(\"UNCHECKED_CAST\")\npublic class SimpleCommandArgumentContext(\n    public val list: List<ParserPair<*>>,\n) : CommandArgumentContext {\n    override fun <T : Any> get(kClass: KClass<T>): CommandValueArgumentParser<T>? =\n        (this.list.firstOrNull { kClass == it.klass }?.parser\n            ?: this.list.firstOrNull { kClass.isSubclassOf(it.klass) }?.parser) as CommandValueArgumentParser<T>?\n\n    override fun toList(): List<ParserPair<*>> = list\n}\n\n/**\n * 构建一个 [buildCommandArgumentContext].\n *\n * Kotlin 实现:\n * ```\n * val context = buildCommandArgumentContext {\n *     Int::class with IntArgParser\n *     Member::class with ExistingMemberArgParser\n *     Group::class with { s: String, sender: CommandSender ->\n *          Bot.getInstance(s.toLong()).getGroup(s.toLong())\n *     }\n *     Bot::class with { s: String ->\n *          Bot.getInstance(s.toLong())\n *     }\n * }\n * ```\n *\n * Java 实现:\n * ```java\n * CommandArgumentContext context =\n *     new CommandArgumentContextBuilder()\n *         .add(clazz1, parser1)\n *         .add(String.class, new CommandArgumentParser<String>() {\n *              public String parse(String raw, CommandSender sender) {\n *                  // ...\n *              }\n *         })\n *         // 更多 add\n *         .build()\n * ```\n *\n * @see CommandArgumentContextBuilder\n * @see buildCommandArgumentContext\n */\n@JvmSynthetic\npublic fun buildCommandArgumentContext(block: CommandArgumentContextBuilder.() -> Unit): CommandArgumentContext {\n    contract {\n        callsInPlace(block, EXACTLY_ONCE)\n    }\n    return CommandArgumentContextBuilder().apply(block).build()\n}\n\n/**\n * 参考 [buildCommandArgumentContext]\n */\npublic class CommandArgumentContextBuilder : MutableList<ParserPair<*>> by mutableListOf() {\n    /**\n     * 添加一个指令解析器.\n     */\n    @JvmName(\"add\")\n    public infix fun <T : Any> Class<T>.with(parser: CommandValueArgumentParser<T>): CommandArgumentContextBuilder =\n        this.kotlin with parser\n\n    /**\n     * 添加一个指令解析器\n     */\n    @JvmName(\"add\")\n    public inline infix fun <T : Any> KClass<T>.with(parser: CommandValueArgumentParser<T>): CommandArgumentContextBuilder {\n        add(ParserPair(this, parser))\n        return this@CommandArgumentContextBuilder\n    }\n\n    /**\n     * 添加一个指令解析器\n     */\n    @JvmSynthetic\n    @LowPriorityInOverloadResolution\n    public inline infix fun <T : Any> KClass<T>.with(\n        crossinline parser: CommandValueArgumentParser<T>.(s: String, sender: CommandSender) -> T,\n    ): CommandArgumentContextBuilder {\n        add(ParserPair(this, object : CommandValueArgumentParser<T> {\n            override fun parse(raw: String, sender: CommandSender): T = parser(raw, sender)\n        }))\n        return this@CommandArgumentContextBuilder\n    }\n\n    /**\n     * 添加一个指令解析器\n     */\n    @JvmSynthetic\n    public inline infix fun <T : Any> KClass<T>.with(\n        crossinline parser: CommandValueArgumentParser<T>.(s: String) -> T,\n    ): CommandArgumentContextBuilder {\n        add(ParserPair(this, object : CommandValueArgumentParser<T> {\n            override fun parse(raw: String, sender: CommandSender): T = parser(raw)\n        }))\n        return this@CommandArgumentContextBuilder\n    }\n\n    @JvmSynthetic\n    public inline fun <reified T : Any> add(parser: CommandValueArgumentParser<T>): CommandArgumentContextBuilder {\n        add(ParserPair(T::class, parser))\n        return this@CommandArgumentContextBuilder\n    }\n\n    /**\n     * 添加一个指令解析器\n     */\n    @ConsoleExperimentalApi\n    @JvmSynthetic\n    public inline infix fun <reified T : Any> add(\n        crossinline parser: CommandValueArgumentParser<*>.(s: String) -> T,\n    ): CommandArgumentContextBuilder = T::class with object : CommandValueArgumentParser<T> {\n        override fun parse(raw: String, sender: CommandSender): T = parser(raw)\n    }\n\n    /**\n     * 添加一个指令解析器\n     */\n    @ConsoleExperimentalApi\n    @JvmSynthetic\n    @LowPriorityInOverloadResolution\n    public inline infix fun <reified T : Any> add(\n        crossinline parser: CommandValueArgumentParser<*>.(s: String, sender: CommandSender) -> T,\n    ): CommandArgumentContextBuilder = T::class with object : CommandValueArgumentParser<T> {\n        override fun parse(raw: String, sender: CommandSender): T = parser(raw, sender)\n    }\n\n    /**\n     * 完成构建, 得到 [CommandArgumentContext]\n     */\n    public fun build(): CommandArgumentContext = SimpleCommandArgumentContext(this.distinctByReversed { it.klass })\n}\n\ninternal inline fun <T, K> List<T>.distinctByReversed(selector: (T) -> K): List<T> {\n    val set = HashSet<K>()\n    val list = ArrayList<T>()\n    for (i in this.indices.reversed()) {\n        val element = this[i]\n        if (set.add(element.let(selector))) {\n            list.add(element)\n        }\n    }\n    return list\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/descriptor/CommandArgumentParserBuiltins.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"EXPOSED_SUPER_CLASS\")\n\npackage net.mamoe.mirai.console.command.descriptor\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.console.command.*\nimport net.mamoe.mirai.console.command.CommandSender.Companion.asCommandSender\nimport net.mamoe.mirai.console.internal.command.fuzzySearchMember\nimport net.mamoe.mirai.console.permission.AbstractPermitteeId\nimport net.mamoe.mirai.console.permission.PermissionId\nimport net.mamoe.mirai.console.permission.PermitteeId\nimport net.mamoe.mirai.console.permission.RootPermission\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.chineseLength\nimport java.time.temporal.TemporalAccessor\n\n\n/**\n * 使用 [String.toInt] 解析\n */\npublic object IntValueArgumentParser : InternalCommandValueArgumentParserExtensions<Int>() {\n    public override fun parse(raw: String, sender: CommandSender): Int =\n        raw.toIntOrNull() ?: illegalArgument(\"无法解析 $raw 为整数\")\n}\n\n/**\n * 使用 [String.toLong] 解析\n */\npublic object LongValueArgumentParser : InternalCommandValueArgumentParserExtensions<Long>() {\n    public override fun parse(raw: String, sender: CommandSender): Long =\n        raw.toLongOrNull() ?: illegalArgument(\"无法解析 $raw 为长整数\")\n}\n\n/**\n * 使用 [String.toShort] 解析\n */\npublic object ShortValueArgumentParser : InternalCommandValueArgumentParserExtensions<Short>() {\n    public override fun parse(raw: String, sender: CommandSender): Short =\n        raw.toShortOrNull() ?: illegalArgument(\"无法解析 $raw 为短整数\")\n}\n\n/**\n * 使用 [String.toByte] 解析\n */\npublic object ByteValueArgumentParser : InternalCommandValueArgumentParserExtensions<Byte>() {\n    public override fun parse(raw: String, sender: CommandSender): Byte =\n        raw.toByteOrNull() ?: illegalArgument(\"无法解析 $raw 为字节\")\n}\n\n/**\n * 使用 [String.toDouble] 解析\n */\npublic object DoubleValueArgumentParser : InternalCommandValueArgumentParserExtensions<Double>() {\n    public override fun parse(raw: String, sender: CommandSender): Double =\n        raw.toDoubleOrNull() ?: illegalArgument(\"无法解析 $raw 为小数\")\n}\n\n/**\n * 使用 [String.toFloat] 解析\n */\npublic object FloatValueArgumentParser : InternalCommandValueArgumentParserExtensions<Float>() {\n    public override fun parse(raw: String, sender: CommandSender): Float =\n        raw.toFloatOrNull() ?: illegalArgument(\"无法解析 $raw 为小数\")\n}\n\n/**\n * 直接返回 [String], 或取用 [SingleMessage.contentToString]\n */\npublic object StringValueArgumentParser : InternalCommandValueArgumentParserExtensions<String>() {\n    public override fun parse(raw: String, sender: CommandSender): String = raw\n}\n\n/**\n * 解析 [String] 通过 [Image].\n */\npublic object ImageValueArgumentParser : InternalCommandValueArgumentParserExtensions<Image>() {\n    public override fun parse(raw: String, sender: CommandSender): Image {\n        return kotlin.runCatching {\n            Image(raw)\n        }.getOrElse {\n            illegalArgument(\"无法解析 $raw 为图片.\")\n        }\n    }\n\n    override fun parse(raw: MessageContent, sender: CommandSender): Image {\n        if (raw is Image) return raw\n        return super.parse(raw, sender)\n    }\n}\n\npublic object PlainTextValueArgumentParser : InternalCommandValueArgumentParserExtensions<PlainText>() {\n    public override fun parse(raw: String, sender: CommandSender): PlainText {\n        return PlainText(raw)\n    }\n\n    override fun parse(raw: MessageContent, sender: CommandSender): PlainText {\n        if (raw is PlainText) return raw\n        return super.parse(raw, sender)\n    }\n}\n\n/**\n * 当字符串内容为(不区分大小写) \"true\", \"yes\", \"enabled\", \"on\", \"1\"\n */\npublic object BooleanValueArgumentParser : InternalCommandValueArgumentParserExtensions<Boolean>() {\n    public override fun parse(raw: String, sender: CommandSender): Boolean = raw.trim().let { str ->\n        str.equals(\"true\", ignoreCase = true)\n                || str.equals(\"yes\", ignoreCase = true)\n                || str.equals(\"enabled\", ignoreCase = true)\n                || str.equals(\"on\", ignoreCase = true)\n                || str.equals(\"1\", ignoreCase = true)\n    }\n}\n\n/**\n * 根据 [Bot.id] 解析一个登录后的 [Bot]\n */\npublic object ExistingBotValueArgumentParser : InternalCommandValueArgumentParserExtensions<Bot>() {\n    public override fun parse(raw: String, sender: CommandSender): Bot =\n        if (raw == \"~\") sender.inferBotOrFail()\n        else raw.findBotOrFail()\n\n    public override fun parse(raw: MessageContent, sender: CommandSender): Bot =\n        if (raw is At) {\n            Bot.getInstanceOrNull(raw.target)\n                ?: illegalArgument(\"@ 的对象不是一个 Bot\")\n        } else super.parse(raw, sender)\n}\n\n/**\n * 解析任意一个存在的好友.\n */\npublic object ExistingFriendValueArgumentParser : InternalCommandValueArgumentParserExtensions<Friend>() {\n    private val syntax = \"\"\"\n        - 机器人号码.好友号码\n        - ~ (指代指令调用人自己作为好友. 仅聊天环境下)\n        \n        当只登录了一个机器人时，机器人号码可省略\n    \"\"\".trimIndent()\n\n    public override fun parse(raw: String, sender: CommandSender): Friend {\n        if (raw == \"~\") return sender.inferFriendOrFail()\n\n        val components = raw.split(\".\")\n\n        return when (components.size) {\n            2 -> components.let { (botId, groupId) ->\n                botId.findBotOrFail().findFriendOrFail(groupId)\n            }\n            1 -> components.let { (groupId) ->\n                sender.inferBotOrFail().findFriendOrFail(groupId)\n            }\n            else -> illegalArgument(\"好友语法错误. \\n${syntax}\")\n        }\n    }\n\n    public override fun parse(raw: MessageContent, sender: CommandSender): Friend {\n        if (raw is At) {\n            checkArgument(sender is MemberCommandSender)\n            return sender.inferBotOrFail().getFriend(raw.target)\n                ?: illegalArgument(\"At 的对象 ${raw.target} 非 Bot 好友\")\n        } else {\n            illegalArgument(\"无法解析 $raw 为好友\")\n        }\n    }\n}\n\n/**\n * 解析任意一个存在的群.\n */\npublic object ExistingGroupValueArgumentParser : InternalCommandValueArgumentParserExtensions<Group>() {\n    private val syntax = \"\"\"\n        - 机器人号码.群号码\n        - ~    (指代指令调用人自己所在群. 仅群聊天环境下)\n        \n        当只登录了一个机器人时，机器人号码可省略\n    \"\"\".trimIndent()\n\n    public override fun parse(raw: String, sender: CommandSender): Group {\n        if (raw == \"~\") return sender.inferGroupOrFail()\n\n        val components = raw.split(\".\")\n\n        return when (components.size) {\n            2 -> components.let { (botId, groupId) ->\n                botId.findBotOrFail().findGroupOrFail(groupId)\n            }\n            1 -> components.let { (groupId) ->\n                sender.inferBotOrFail().findGroupOrFail(groupId)\n            }\n            0 -> components.let {\n                sender.inferGroupOrFail()\n            }\n            else -> illegalArgument(\"群语法错误. \\n${syntax}\")\n        }\n    }\n}\n\npublic object ExistingUserValueArgumentParser : InternalCommandValueArgumentParserExtensions<User>() {\n    private val syntax: String = \"\"\"\n         - 机器人号码.群号码.群员号码\n         - 机器人号码.群号码.群员名片   (模糊搜索)\n         - ~   (指代指令调用人自己. 仅聊天环境下)\n         - 机器人号码.群号码.$   (随机成员)\n         - 机器人号码.好友号码\n         \n         当处于一个群内时，机器人号码和群号码参数都可省略\n         当只登录了一个机器人时，机器人号码可省略\n    \"\"\".trimIndent()\n\n    override fun parse(raw: String, sender: CommandSender): User {\n        return parseImpl(\n            sender,\n            raw,\n            ExistingMemberValueArgumentParser::parse,\n            ExistingFriendValueArgumentParser::parse\n        )\n    }\n\n    override fun parse(raw: MessageContent, sender: CommandSender): User {\n        return parseImpl(\n            sender,\n            raw,\n            ExistingMemberValueArgumentParser::parse,\n            ExistingFriendValueArgumentParser::parse\n        )\n    }\n\n    private fun <T> parseImpl(\n        sender: CommandSender,\n        raw: T,\n        parseFunction: (T, CommandSender) -> User,\n        parseFunction2: (T, CommandSender) -> User,\n    ): User {\n        if (sender.inferGroup() != null) {\n            kotlin.runCatching {\n                return parseFunction(raw, sender)\n            }.recoverCatching {\n                return parseFunction2(raw, sender)\n            }.getOrElse {\n                illegalArgument(\"无法推断目标好友或群员. \\n$syntax\")\n            }\n        }\n        kotlin.runCatching {\n            return parseFunction2(raw, sender)\n        }.getOrElse {\n            illegalArgument(\"无法推断目标好友或群员. \\n$syntax\")\n        }\n    }\n}\n\n\npublic object ExistingContactValueArgumentParser : InternalCommandValueArgumentParserExtensions<Contact>() {\n    private val syntax: String = \"\"\"\n         - 机器人号码.群号码.群员号码\n         - 机器人号码.群号码.群员名片    (模糊搜索)\n         - ~    (指代指令调用人自己. 仅聊天环境下)\n         - 机器人号码.群号码.$    (随机成员)\n         - 机器人号码.好友号码\n         - 机器人号码.群号码\n         \n         当处于一个群内时，机器人号码和群号码参数都可省略\n         当只登录了一个机器人时，机器人号码可省略\n    \"\"\".trimIndent()\n\n    override fun parse(raw: String, sender: CommandSender): Contact {\n        return parseImpl(sender, raw, ExistingUserValueArgumentParser::parse, ExistingGroupValueArgumentParser::parse)\n    }\n\n    override fun parse(raw: MessageContent, sender: CommandSender): Contact {\n        return parseImpl(sender, raw, ExistingUserValueArgumentParser::parse, ExistingGroupValueArgumentParser::parse)\n    }\n\n    private fun <T> parseImpl(\n        sender: CommandSender,\n        raw: T,\n        parseFunction: (T, CommandSender) -> Contact,\n        parseFunction2: (T, CommandSender) -> Contact,\n    ): Contact {\n        kotlin.runCatching {\n            return parseFunction(raw, sender)\n        }.recoverCatching {\n            return parseFunction2(raw, sender)\n        }.getOrElse {\n            illegalArgument(\"无法推断目标好友、群或群员。 \\n$syntax\")\n        }\n    }\n}\n\n\n/**\n * 解析任意一个群成员.\n */\npublic object ExistingMemberValueArgumentParser : InternalCommandValueArgumentParserExtensions<Member>() {\n    private val syntax: String = \"\"\"\n         - 机器人号码.群号码.群员号码\n         - 机器人号码.群号码.群员名片    (模糊搜索)\n         - ~    (指代指令调用人自己. 仅聊天环境下)\n         - 机器人号码.群号码.${'$'}    (随机成员)\n         \n         当处于一个群内时，机器人号码和群号码参数都可省略\n         当只登录了一个机器人时，机器人号码可省略\n    \"\"\".trimIndent()\n\n    public override fun parse(raw: String, sender: CommandSender): Member {\n        if (raw == \"~\") return (sender as? MemberCommandSender)?.user ?: illegalArgument(\"当前语境下无法推断自身作为群员\")\n        if (raw == \"\\$\") return (sender as? MemberCommandSender)?.group?.members?.randomOrNull()\n            ?: illegalArgument(\"当前语境下无法推断随机群员\")\n\n        val components = raw.split(\".\")\n\n        return when (components.size) {\n            3 -> components.let { (botId, groupId, memberIdOrCard) ->\n                botId.findBotOrFail().findGroupOrFail(groupId).findMemberOrFail(memberIdOrCard)\n            }\n            2 -> components.let { (groupId, memberIdOrCard) ->\n                sender.inferBotOrFail().findGroupOrFail(groupId).findMemberOrFail(memberIdOrCard)\n            }\n            1 -> components.let { (memberIdOrCard) ->\n                sender.inferGroupOrFail().findMemberOrFail(memberIdOrCard)\n            }\n            else -> illegalArgument(\"群成员语法错误. \\n$syntax\")\n        }\n    }\n\n    public override fun parse(raw: MessageContent, sender: CommandSender): Member {\n        return if (raw is At) {\n            checkArgument(sender is MemberCommandSender)\n            val bot = sender.inferBotOrFail()\n            val group = sender.inferGroupOrFail()\n            if (raw.target == bot.id) {\n                return group.botAsMember\n            }\n            group[raw.target] ?: illegalArgument(\"无法找到群员 ${raw.target}\")\n        } else {\n            parse(raw.content, sender)\n        }\n    }\n}\n\npublic object PermissionIdValueArgumentParser : InternalCommandValueArgumentParserExtensions<PermissionId>() {\n    override fun parse(raw: String, sender: CommandSender): PermissionId {\n        return kotlin.runCatching { PermissionId.parseFromString(raw) }.getOrElse {\n            if (raw == \"*\") return RootPermission.id // for convenience\n            illegalArgument(\"无法解析 $raw 为权限 ID.\")\n        }\n    }\n}\n\npublic object PermitteeIdValueArgumentParser : InternalCommandValueArgumentParserExtensions<PermitteeId>() {\n    override fun parse(raw: String, sender: CommandSender): PermitteeId {\n        return if (raw == \"~\") sender.permitteeId\n        else {\n            kotlin.runCatching { AbstractPermitteeId.parseFromString(raw) }.getOrElse {\n                val long = raw.toLongOrNull()\n                if (long != null) {\n                    return AbstractPermitteeId.ExactUser(long)// for convenience\n                }\n\n                illegalArgument(\"无法解析 $raw 为被许可人 ID.\")\n            }\n        }\n    }\n\n    override fun parse(raw: MessageContent, sender: CommandSender): PermitteeId {\n        if (raw is At) {\n            return ExistingUserValueArgumentParser.parse(raw, sender).asCommandSender(false).permitteeId\n        }\n        return super.parse(raw, sender)\n    }\n}\n\n/** 直接返回原始参数 [MessageContent] */\npublic object RawContentValueArgumentParser : CommandValueArgumentParser<MessageContent> {\n    override fun parse(raw: String, sender: CommandSender): MessageContent = PlainText(raw)\n    override fun parse(raw: MessageContent, sender: CommandSender): MessageContent = raw\n}\n\n/**\n * 解析参数为枚举 [T]\n *\n * 注:\n * - 当枚举值大小写无冲突时会尝试忽略大小写\n * - 当大小写驼峰可用时会尝试使用大小写驼峰\n *\n * 例如:\n * ```\n * enum class StdType { STD_IN, STD_OUT, STD_ERR }\n * ```\n * 对于 StdType 有以下值可用:\n * - `STD_IN`, `STD_OUT`, `STD_ERR`  (忽视大小写)\n * - `stdIn`,  `stdOut`,  `stdErr`   (不忽视大小写)\n *\n * @since 2.2\n */\npublic class EnumValueArgumentParser<T : Enum<T>>(\n    private val type: Class<T>,\n) : InternalCommandValueArgumentParserExtensions<T>() {\n    // 此 Exception 仅用于中断 enum 搜索, 不需要使用堆栈信息\n    private object NoEnumException : RuntimeException()\n\n\n    init {\n        check(Enum::class.java.isAssignableFrom(type)) {\n            \"$type not a enum class\"\n        }\n    }\n\n    private fun <T> Sequence<T>.hasDuplicates(): Boolean = iterator().hasDuplicates()\n    private fun <T> Iterator<T>.hasDuplicates(): Boolean {\n        val observed = HashSet<T>()\n        for (elem in this) {\n            if (!observed.add(elem))\n                return true\n        }\n        return false\n    }\n\n    @Suppress(\"NOTHING_TO_INLINE\")\n    private inline fun noConstant(): Nothing {\n        throw NoEnumException\n    }\n\n    private val delegate: (String) -> T = kotlin.run {\n        val enums = type.enumConstants.asSequence()\n        // step 1: 分析是否能够忽略大小写\n        if (enums.map { it.name.lowercase() }.hasDuplicates()) {\n            ({ java.lang.Enum.valueOf(type, it) })\n        } else { // step 2: 分析是否能使用小驼峰命名\n            val lowerCaseEnumDirection = enums.map { it.name.lowercase() to it }.toList().toMap()\n\n            val camelCase = enums.mapNotNull { elm ->\n                val name = elm.name.split('_')\n                if (name.size == 1) { // No splitter\n                    null\n                } else {\n                    buildString {\n                        val iterator = name.iterator()\n                        append(iterator.next().lowercase())\n                        for (v in iterator) {\n                            if (v.isEmpty()) continue\n                            append(v[0].uppercase())\n                            append(v.substring(1, v.length).lowercase())\n                        }\n                    } to elm\n                }\n            }\n\n            val camelCaseDirection = if ((\n                        enums.map { it.name.lowercase() } + camelCase.map { it.first.lowercase() }\n                        ).hasDuplicates()\n            ) { // 确认驼峰命名与源没有冲突\n                emptyMap()\n            } else {\n                camelCase.toList().toMap()\n            }\n\n            ({\n                camelCaseDirection[it]\n                    ?: lowerCaseEnumDirection[it.lowercase()]\n                    ?: noConstant()\n            })\n        }\n    }\n\n    override fun parse(raw: String, sender: CommandSender): T {\n        return try {\n            delegate(raw)\n        } catch (e: Throwable) {\n            illegalArgument(\"无法解析 $raw 为 ${type.simpleName}\")\n        }\n    }\n}\n\n/**\n * 解析参数为时间 [T]\n * @param now 返回当前时间\n * @param parse 从字符串解析时间\n * @since 2.10\n */\n@MiraiExperimentalApi\npublic class TemporalArgumentParser<T : TemporalAccessor>(\n    private val type: Class<T>,\n    private val now: () -> T,\n    private val parse: (CharSequence) -> T,\n) : InternalCommandValueArgumentParserExtensions<T>() {\n\n    override fun parse(raw: String, sender: CommandSender): T {\n        return try {\n            if (raw.equals(other = \"now\", ignoreCase = true)) {\n                now.invoke()\n            } else {\n                parse.invoke(raw)\n            }\n        } catch (e: Throwable) {\n            illegalArgument(\"无法解析 $raw 为 ${type.javaClass}\")\n        }\n    }\n}\n\ninternal abstract class InternalCommandValueArgumentParserExtensions<T : Any> :\n    AbstractCommandValueArgumentParser<T>() {\n    private fun String.parseToLongOrFail(): Long = toLongOrNull() ?: illegalArgument(\"无法解析 $this 为整数\")\n\n    protected fun Long.findBotOrFail(): Bot = Bot.getInstanceOrNull(this) ?: illegalArgument(\"无法找到 Bot: $this\")\n\n    protected fun String.findBotOrFail(): Bot =\n        Bot.getInstanceOrNull(this.parseToLongOrFail()) ?: illegalArgument(\"无法找到 Bot: $this\")\n\n    protected fun Bot.findGroupOrFail(id: Long): Group = getGroup(id) ?: illegalArgument(\"无法找到群: $this\")\n\n    protected fun Bot.findGroupOrFail(id: String): Group =\n        getGroup(id.parseToLongOrFail()) ?: illegalArgument(\"无法找到群: $this\")\n\n    protected fun Bot.findFriendOrFail(id: String): Friend =\n        getFriend(id.parseToLongOrFail()) ?: illegalArgument(\"无法找到好友: $this\")\n\n    protected fun Bot.findMemberOrFail(id: String): Friend =\n        getFriend(id.parseToLongOrFail()) ?: illegalArgument(\"无法找到群员: $this\")\n\n    protected fun Group.findMemberOrFail(idOrCard: String): Member {\n        if (idOrCard == \"\\$\") return members.randomOrNull() ?: illegalArgument(\"当前语境下无法推断随机群员\")\n        idOrCard.toLongOrNull()?.let { get(it) }?.let { return it }\n        this.members.singleOrNull { it.nameCardOrNick.contains(idOrCard) }?.let { return it }\n        this.members.singleOrNull { it.nameCardOrNick.contains(idOrCard, ignoreCase = true) }?.let { return it }\n\n        val candidates = this.fuzzySearchMember(idOrCard)\n        candidates.singleOrNull()?.let {\n            if (it.second == 1.0) return it.first // single match\n        }\n        if (candidates.isEmpty()) {\n            illegalArgument(\"无法找到成员 $idOrCard\")\n        } else {\n            var index = 1\n            illegalArgument(\n                \"无法找到成员 $idOrCard。 多个成员满足搜索结果或匹配度不足: \\n\\n\" +\n                        candidates.joinToString(\"\\n\", limit = 6) {\n                            val percentage = (it.second * 100).toDecimalPlace(0)\n                            \"#${index++}(${percentage}%)${it.first.nameCardOrNick.truncate(10)}(${it.first.id})\" // #1 15.4%\n                        }\n            )\n        }\n    }\n\n    protected fun CommandSender.inferBotOrFail(): Bot =\n        (this as? UserCommandSender)?.bot\n            ?: Bot.instancesSequence.singleOrNull()\n            ?: illegalArgument(\"当前语境下无法推断目标 Bot, 因为目前有多个 Bot 在线.\")\n\n    protected fun CommandSender.inferGroupOrFail(): Group =\n        inferGroup() ?: illegalArgument(\"当前语境下无法推断目标群\")\n\n    protected fun CommandSender.inferGroup(): Group? = (this as? GroupAwareCommandSender)?.group\n\n    protected fun CommandSender.inferFriendOrFail(): Friend =\n        (this as? FriendCommandSender)?.user ?: illegalArgument(\"当前语境下无法推断目标好友\")\n}\n\ninternal fun Double.toDecimalPlace(n: Int): String = \"%.${n}f\".format(this)\n\ninternal fun String.truncate(lengthLimit: Int, replacement: String = \"...\"): String = buildString {\n    var lengthSum = 0\n    for (char in this@truncate) {\n        lengthSum += char.chineseLength\n        if (lengthSum > lengthLimit) {\n            append(replacement)\n            return toString()\n        } else append(char)\n    }\n    return toString()\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/descriptor/CommandParameter.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.command.descriptor\n\nimport net.mamoe.mirai.console.command.CommandContext\nimport net.mamoe.mirai.console.command.CommandSender\nimport net.mamoe.mirai.console.command.descriptor.AbstractCommandValueParameter.UserDefinedType.Companion.createOptional\nimport net.mamoe.mirai.console.command.descriptor.AbstractCommandValueParameter.UserDefinedType.Companion.createRequired\nimport net.mamoe.mirai.console.command.descriptor.ArgumentAcceptance.Companion.isAcceptable\nimport net.mamoe.mirai.console.command.parse.CommandValueArgument\nimport net.mamoe.mirai.console.command.resolve.ResolvedCommandValueArgument\nimport net.mamoe.mirai.console.internal.data.classifierAsKClass\nimport net.mamoe.mirai.console.internal.data.classifierAsKClassOrNull\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.message.data.content\nimport kotlin.reflect.KClass\nimport kotlin.reflect.KType\nimport kotlin.reflect.full.isSubclassOf\nimport kotlin.reflect.full.isSubtypeOf\nimport kotlin.reflect.typeOf\n\n\n/**\n * Inherited instances must be [CommandValueParameter] or [CommandReceiverParameter]\n */\n@ExperimentalCommandDescriptors\npublic sealed interface CommandParameter<T : Any?> {\n    public val name: String?\n\n    public val isOptional: Boolean\n\n    /**\n     * Reified type of [T]\n     */\n    public val type: KType\n}\n\n@ExperimentalCommandDescriptors\npublic abstract class AbstractCommandParameter<T> : CommandParameter<T> {\n    override fun toString(): String = buildString {\n        append(name)\n        append(\": \")\n        append(type.classifierAsKClass().simpleName)\n        append(if (type.isMarkedNullable) \"?\" else \"\")\n    }\n}\n\n/**\n * Inherited instances must be [AbstractCommandValueParameter].\n *\n * ### Implementation details\n *\n * [CommandValueParameter] should:\n * - implement [equals], [hashCode] since used in [ResolvedCommandValueArgument].\n * - implement [toString] to produce user-friendly textual representation of this parameter with type info.\n *\n */\n@ExperimentalCommandDescriptors\npublic interface CommandValueParameter<T : Any?> : CommandParameter<T> {\n\n    public val isVararg: Boolean\n\n    /**\n     * Checks whether this [CommandValueParameter] accepts [argument].\n     *\n     * An [argument] can be accepted if:\n     * - [CommandValueArgument.type] is subtype of, or equals to [CommandValueParameter.type] (nullability considered), or\n     * - [CommandValueArgument.typeVariants] produces\n     *\n     * @return `true` if [argument] may be accepted through any approach mentioned above.\n     *\n     * @see accepting\n     */\n    public fun accepts(argument: CommandValueArgument, commandArgumentContext: CommandArgumentContext?): Boolean =\n        accepting(argument, commandArgumentContext).isAcceptable\n\n    public fun accepting(\n        argument: CommandValueArgument,\n        commandArgumentContext: CommandArgumentContext?\n    ): ArgumentAcceptance\n}\n\n@ExperimentalCommandDescriptors\npublic sealed class ArgumentAcceptance(\n    /**\n     * Higher means more acceptable\n     */\n    @ConsoleExperimentalApi\n    public val acceptanceLevel: Int,\n) {\n    public object Direct : ArgumentAcceptance(Int.MAX_VALUE)\n\n    public data class WithTypeConversion(\n        public val typeVariant: TypeVariant<*>,\n    ) : ArgumentAcceptance(20)\n\n    public data class WithContextualConversion(\n        public val parser: CommandValueArgumentParser<*>,\n    ) : ArgumentAcceptance(10)\n\n    public data class ResolutionAmbiguity(\n        public val candidates: List<TypeVariant<*>>,\n    ) : ArgumentAcceptance(0)\n\n    public object Impossible : ArgumentAcceptance(-1)\n\n    public companion object {\n        @OptIn(ConsoleExperimentalApi::class)\n        @JvmStatic\n        public val ArgumentAcceptance.isAcceptable: Boolean\n            get() = acceptanceLevel > 0\n\n        @OptIn(ConsoleExperimentalApi::class)\n        @JvmStatic\n        public val ArgumentAcceptance.isNotAcceptable: Boolean\n            get() = acceptanceLevel <= 0\n    }\n}\n\n@ExperimentalCommandDescriptors\npublic sealed class CommandReceiverParameter<T> : CommandParameter<T>, AbstractCommandParameter<T>() {\n\n    /**\n     * @since 2.12\n     */\n    @ExperimentalCommandDescriptors\n    public class Sender(\n        override val isOptional: Boolean,\n        override val type: KType,\n    ) : CommandReceiverParameter<CommandSender>() {\n        init {\n            val classifier = type.classifier\n            require(classifier is KClass<*>) {\n                \"CommandReceiverParameter.Sender.type.classifier must be KClass.\"\n            }\n            require(classifier.isSubclassOf(CommandSender::class)) {\n                \"CommandReceiverParameter.Sender.type.classifier must be subclass of CommandSender.\"\n            }\n        }\n    }\n\n    /**\n     * @since 2.12\n     */\n    @ExperimentalCommandDescriptors\n    public class Context(\n        override val isOptional: Boolean,\n        override val type: KType = typeOf<CommandContext>(),\n    ) : CommandReceiverParameter<CommandContext>() {\n        init {\n            val classifier = type.classifier\n            require(classifier is KClass<*>) {\n                \"CommandReceiverParameter.Context.type.classifier must be KClass.\"\n            }\n            require(classifier.isSubclassOf(CommandContext::class)) {\n                \"CommandReceiverParameter.Context.type.classifier must be subclass of CommandContext.\"\n            }\n        }\n    }\n\n    override val name: String get() = NAME\n\n\n    public companion object {\n        public const val NAME: String = \"<receiver>\"\n    }\n}\n\n\ninternal val ANY_TYPE = typeOf<Any>()\ninternal val ARRAY_OUT_ANY_TYPE = typeOf<Array<out Any?>>()\ninternal val BASE_ARRAY_TYPES = mapOf(\n    typeOf<ByteArray>() to typeOf<Byte>(),\n    typeOf<CharArray>() to typeOf<Char>(),\n    typeOf<ShortArray>() to typeOf<Short>(),\n    typeOf<IntArray>() to typeOf<Int>(),\n    typeOf<LongArray>() to typeOf<Long>(),\n    typeOf<FloatArray>() to typeOf<Float>(),\n    typeOf<DoubleArray>() to typeOf<Double>()\n)\n\n@ExperimentalCommandDescriptors\npublic sealed class AbstractCommandValueParameter<T> : CommandValueParameter<T>, AbstractCommandParameter<T>() {\n    override fun toString(): String = buildString {\n        if (isVararg) append(\"vararg \")\n        append(super.toString())\n        if (isOptional) {\n            append(\" = ...\")\n        }\n    }\n\n    public override fun accepting(\n        argument: CommandValueArgument,\n        commandArgumentContext: CommandArgumentContext?\n    ): ArgumentAcceptance {\n        if (isVararg) {\n            // BaseArray or Array<T>\n            val arrayElementType = BASE_ARRAY_TYPES[this.type] ?: this.type.arguments.single().type\n            return acceptingImpl(arrayElementType ?: ANY_TYPE, argument, commandArgumentContext)\n        }\n\n        return acceptingImpl(this.type, argument, commandArgumentContext)\n    }\n\n    protected open fun acceptingImpl(\n        expectingType: KType,\n        argument: CommandValueArgument,\n        commandArgumentContext: CommandArgumentContext?,\n    ): ArgumentAcceptance {\n        if (argument.type.isSubtypeOf(expectingType)) return ArgumentAcceptance.Direct\n\n        argument.typeVariants.associateWith { typeVariant ->\n            if (typeVariant.outType.isSubtypeOf(expectingType)) {\n                // TODO: 2020/10/11 resolution ambiguity\n                return ArgumentAcceptance.WithTypeConversion(typeVariant)\n            }\n        }\n        expectingType.classifierAsKClassOrNull()?.let { commandArgumentContext?.get(it) }?.let { parser ->\n            return ArgumentAcceptance.WithContextualConversion(parser)\n        }\n        return ArgumentAcceptance.Impossible\n    }\n\n    @ConsoleExperimentalApi\n    public data class StringConstant(\n        @ConsoleExperimentalApi\n        public override val name: String?,\n        public val expectingValue: String,\n        public val ignoreCase: Boolean,\n    ) : AbstractCommandValueParameter<String>() {\n        public override val type: KType get() = STRING_TYPE\n        public override val isOptional: Boolean get() = false\n        public override val isVararg: Boolean get() = false\n\n        init {\n            require(expectingValue.isNotBlank()) {\n                \"expectingValue must not be blank\"\n            }\n            require(expectingValue.none(Char::isWhitespace)) {\n                \"expectingValue must not contain whitespace\"\n            }\n        }\n\n        override fun toString(): String = \"<$expectingValue>\"\n\n        override fun acceptingImpl(\n            expectingType: KType,\n            argument: CommandValueArgument,\n            commandArgumentContext: CommandArgumentContext?\n        ): ArgumentAcceptance {\n            return if (argument.value.content.equals(expectingValue, ignoreCase)) {\n                ArgumentAcceptance.Direct\n            } else ArgumentAcceptance.Impossible\n        }\n\n        private companion object {\n            val STRING_TYPE = typeOf<String>()\n        }\n    }\n\n    /**\n     * @see createOptional\n     * @see createRequired\n     */\n    public data class UserDefinedType<T>(\n        public override val name: String?,\n        public override val isOptional: Boolean,\n        public override val isVararg: Boolean,\n        public override val type: KType,\n    ) : AbstractCommandValueParameter<T>() {\n        override fun toString(): String = super.toString()\n\n        init {\n            requireNotNull(type.classifierAsKClassOrNull()) {\n                \"type.classifier must be KClass.\"\n            }\n            if (isVararg)\n                check(type.isSubtypeOf(ARRAY_OUT_ANY_TYPE) || type in BASE_ARRAY_TYPES) {\n                    \"type must be subtype of Array if vararg. Given $type.\"\n                }\n        }\n\n        public companion object {\n            @JvmStatic\n            public inline fun <reified T : Any> createOptional(name: String, isVararg: Boolean): UserDefinedType<T> {\n                return UserDefinedType(name, true, isVararg, typeOf<T>())\n            }\n\n            @JvmStatic\n            public inline fun <reified T : Any> createRequired(name: String, isVararg: Boolean): UserDefinedType<T> {\n                return UserDefinedType(name, false, isVararg, typeOf<T>())\n            }\n        }\n    }\n\n    /**\n     * Extended by [CommandValueArgumentParser]\n     */\n    @ConsoleExperimentalApi\n    public abstract class Extended<T> : AbstractCommandValueParameter<T>() // For implementer: take care of toString()\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/descriptor/CommandSignature.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.command.descriptor\n\nimport net.mamoe.mirai.console.command.CommandSender\nimport net.mamoe.mirai.console.command.resolve.ResolvedCommandCall\nimport kotlin.reflect.KFunction\n\n/**\n * 指令签名. 表示指令定义的需要的参数.\n *\n * @see AbstractCommandSignature\n */\n@ExperimentalCommandDescriptors\npublic interface CommandSignature {\n    /**\n     * 接收者参数, 为 [CommandSender] 子类\n     */\n    public val receiverParameter: CommandReceiverParameter<*>?\n\n    /**\n     * 形式 值参数.\n     */\n    public val valueParameters: List<AbstractCommandValueParameter<*>>\n\n    /**\n     * 调用这个指令.\n     */\n    public suspend fun call(resolvedCommandCall: ResolvedCommandCall)\n}\n\n/**\n * 来自 [KFunction] 反射得到的 [CommandSignature]\n *\n * @see CommandSignatureFromKFunctionImpl\n */\n@ExperimentalCommandDescriptors\npublic interface CommandSignatureFromKFunction : CommandSignature {\n    public val originFunction: KFunction<*>\n}\n\n/**\n * @see CommandSignatureImpl\n * @see CommandSignatureFromKFunctionImpl\n */\n@ExperimentalCommandDescriptors\npublic abstract class AbstractCommandSignature : CommandSignature {\n    override fun toString(): String {\n        val receiverParameter = receiverParameter\n        return if (receiverParameter == null) {\n            \"CommandSignature(${valueParameters.joinToString()})\"\n        } else {\n            \"CommandSignature($receiverParameter, ${valueParameters.joinToString()})\"\n        }\n    }\n}\n\n@ExperimentalCommandDescriptors\npublic open class CommandSignatureImpl(\n    override val receiverParameter: CommandReceiverParameter<*>?,\n    override val valueParameters: List<AbstractCommandValueParameter<*>>,\n    private val onCall: suspend CommandSignatureImpl.(resolvedCommandCall: ResolvedCommandCall) -> Unit,\n) : CommandSignature, AbstractCommandSignature() {\n    override suspend fun call(resolvedCommandCall: ResolvedCommandCall) {\n        return onCall(resolvedCommandCall)\n    }\n}\n\n@ExperimentalCommandDescriptors\npublic open class CommandSignatureFromKFunctionImpl(\n    override val receiverParameter: CommandReceiverParameter<*>?,\n    override val valueParameters: List<AbstractCommandValueParameter<*>>,\n    override val originFunction: KFunction<*>,\n    private val onCall: suspend CommandSignatureFromKFunctionImpl.(resolvedCommandCall: ResolvedCommandCall) -> Unit,\n) : CommandSignatureFromKFunction, AbstractCommandSignature() {\n    override suspend fun call(resolvedCommandCall: ResolvedCommandCall) {\n        return onCall(resolvedCommandCall)\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/descriptor/CommandValueArgumentParser.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\", \"unused\")\n\npackage net.mamoe.mirai.console.command.descriptor\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.console.command.CommandManager\nimport net.mamoe.mirai.console.command.CommandSender\nimport net.mamoe.mirai.console.command.CompositeCommand\nimport net.mamoe.mirai.console.command.SimpleCommand\nimport net.mamoe.mirai.console.command.descriptor.CommandValueArgumentParser.Companion.map\nimport net.mamoe.mirai.console.command.descriptor.CommandValueArgumentParser.Companion.parse\nimport net.mamoe.mirai.console.permission.PermissionId\nimport net.mamoe.mirai.console.permission.PermitteeId\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.message.data.*\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\n\n/**\n * 指令参数解析器. 用于解析字符串或 [SingleMessage] 到特定参数类型.\n *\n * ### 参数解析\n *\n * 如 [SimpleCommand] 中的示例:\n * ```\n * suspend fun CommandSender.mute(target: Member, duration: Int)\n * ```\n * [CommandManager] 总是从 [SimpleCommand.context] 搜索一个 [T] 为 [Member] 的 [CommandValueArgumentParser], 并调用其 [CommandValueArgumentParser.parse]\n *\n * ### 内建指令解析器\n * - 基础类型: [ByteValueArgumentParser], [ShortValueArgumentParser], [IntValueArgumentParser], [LongValueArgumentParser]\n * [FloatValueArgumentParser], [DoubleValueArgumentParser],\n * [BooleanValueArgumentParser], [StringValueArgumentParser]\n *\n * - [Bot]: [ExistingBotValueArgumentParser]\n * - [Friend]: [ExistingFriendValueArgumentParser]\n * - [Group]: [ExistingGroupValueArgumentParser]\n * - [Member]: [ExistingMemberValueArgumentParser]\n * - [User]: [ExistingUserValueArgumentParser]\n * - [Contact]: [ExistingContactValueArgumentParser]\n *\n * - [PermitteeId]: [PermitteeIdValueArgumentParser]\n * - [PermissionId]: [PermissionIdValueArgumentParser]\n *\n *\n * @see SimpleCommand 简单指令\n * @see CompositeCommand 复合指令\n *\n * @see buildCommandArgumentContext 指令参数环境, 即 [CommandValueArgumentParser] 的集合\n */\npublic interface CommandValueArgumentParser<out T : Any> {\n    /**\n     * 解析一个字符串为 [T] 类型参数\n     *\n     * **实现提示**: 在解析时遇到意料之中的问题, 如无法找到目标群员, 可抛出 [CommandArgumentParserException].\n     * 此异常将会被特殊处理, 不会引发一个错误, 而是作为指令调用成功的情况, 将错误信息发送给用户.\n     *\n     * @throws CommandArgumentParserException 当解析时遇到*意料之中*的问题时抛出.\n     *\n     * @see CommandArgumentParserException\n     */\n    @Throws(CommandArgumentParserException::class)\n    public fun parse(raw: String, sender: CommandSender): T\n\n    /**\n     * 解析一个消息内容元素为 [T] 类型参数\n     *\n     * **实现提示**: 在解析时遇到意料之中的问题, 如无法找到目标群员, 可抛出 [CommandArgumentParserException].\n     * 此异常将会被特殊处理, 不会引发一个错误, 而是作为指令调用成功的情况, 将错误信息发送给用户.\n     *\n     * @throws CommandArgumentParserException 当解析时遇到*意料之中*的问题时抛出.\n     *\n     * @see CommandArgumentParserException\n     */\n    @Throws(CommandArgumentParserException::class)\n    public fun parse(raw: MessageContent, sender: CommandSender): T = parse(raw.content, sender)\n\n    public companion object {\n        /**\n         * 解析一个字符串或 [SingleMessage] 为 [T] 类型参数\n         *\n         * @throws IllegalArgumentException 当 [raw] 既不是 [SingleMessage], 也不是 [String] 时抛出.\n         *\n         * @see CommandValueArgumentParser.parse\n         */\n        @JvmStatic\n        @Throws(IllegalArgumentException::class)\n        public fun <T : Any> CommandValueArgumentParser<T>.parse(raw: Message, sender: CommandSender): T {\n            return when (raw) {\n                is PlainText -> parse(raw.content, sender)\n                is MessageContent -> parse(raw, sender)\n                else -> throw IllegalArgumentException(\"Illegal raw argument type: ${raw::class.qualifiedName}\")\n            }\n        }\n\n        /**\n         * 使用原 [this] 解析, 成功后使用 [mapper] 映射为另一个类型.\n         */\n        @JvmStatic\n        public fun <Original : Any, Result : Any> CommandValueArgumentParser<Original>.map(\n            mapper: MappingCommandValueArgumentParser<Original, Result>.(Original) -> Result,\n        ): CommandValueArgumentParser<Result> = MappingCommandValueArgumentParser(this, mapper)\n    }\n}\n\n/**\n * @see CommandValueArgumentParser 的基础实现.\n */\npublic abstract class AbstractCommandValueArgumentParser<T : Any> : CommandValueArgumentParser<T> {\n    public companion object {\n        /**\n         * 抛出一个 [CommandArgumentParserException] 的捷径\n         *\n         * @throws CommandArgumentParserException\n         */\n        @JvmStatic\n        @JvmSynthetic\n        @Throws(CommandArgumentParserException::class)\n        protected inline fun CommandValueArgumentParser<*>.illegalArgument(\n            message: String,\n            cause: Throwable? = null\n        ): Nothing =\n            throw CommandArgumentParserException(message, cause)\n\n        /**\n         * 检查参数 [condition]. 当它为 `false` 时调用 [message] 并以其返回值作为消息, 抛出异常 [CommandArgumentParserException]\n         *\n         * @throws CommandArgumentParserException\n         */\n        @JvmStatic\n        @Throws(CommandArgumentParserException::class)\n        @JvmSynthetic\n        protected inline fun CommandValueArgumentParser<*>.checkArgument(\n            condition: Boolean,\n            crossinline message: () -> String = { \"Check failed.\" },\n        ) {\n            contract {\n                returns() implies condition\n                callsInPlace(message, InvocationKind.AT_MOST_ONCE)\n            }\n            if (!condition) illegalArgument(message())\n        }\n    }\n}\n\n/**\n * @see CommandValueArgumentParser.map\n */\npublic class MappingCommandValueArgumentParser<T : Any, R : Any>(\n    private val original: CommandValueArgumentParser<T>,\n    private val mapper: MappingCommandValueArgumentParser<T, R>.(T) -> R,\n) : AbstractCommandValueArgumentParser<R>() {\n    override fun parse(raw: String, sender: CommandSender): R = mapper(original.parse(raw, sender))\n    override fun parse(raw: MessageContent, sender: CommandSender): R = mapper(original.parse(raw, sender))\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/descriptor/Exceptions.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"MemberVisibilityCanBePrivate\", \"unused\")\n\npackage net.mamoe.mirai.console.command.descriptor\n\nimport net.mamoe.mirai.console.command.Command\nimport net.mamoe.mirai.console.command.IllegalCommandArgumentException\nimport net.mamoe.mirai.console.command.descriptor.AbstractCommandValueArgumentParser.Companion.illegalArgument\nimport net.mamoe.mirai.console.command.parse.CommandValueArgument\nimport net.mamoe.mirai.console.internal.data.classifierAsKClassOrNull\nimport net.mamoe.mirai.console.internal.data.qualifiedNameOrTip\nimport kotlin.reflect.KType\n\n\ninternal val KType.qualifiedName: String\n    get() = this.classifierAsKClassOrNull()?.qualifiedNameOrTip ?: classifier.toString()\n\n@ExperimentalCommandDescriptors\npublic open class NoValueArgumentMappingException(\n    public val argument: CommandValueArgument,\n    public val forType: KType,\n) : CommandResolutionException(\"Cannot find a CommandArgument mapping for ${forType.qualifiedName}\")\n\npublic open class CommandResolutionException : RuntimeException {\n    public constructor() : super()\n    public constructor(message: String?) : super(message)\n    public constructor(message: String?, cause: Throwable?) : super(message, cause)\n    public constructor(cause: Throwable?) : super(cause)\n}\n\n@ExperimentalCommandDescriptors\npublic open class CommandDeclarationClashException(\n    public val command: Command,\n    public val signatures: List<CommandSignature>,\n) : CommandDeclarationException(\"Declaration clash for command '${command.primaryName}': \\n${signatures.joinToString(\"\\n\")}\")\n\npublic open class CommandDeclarationException : RuntimeException {\n    public constructor() : super()\n    public constructor(message: String?) : super(message)\n    public constructor(message: String?, cause: Throwable?) : super(message, cause)\n    public constructor(cause: Throwable?) : super(cause)\n}\n\n/**\n * 在解析参数时遇到的 _正常_ 错误. 如参数不符合规范等.\n *\n * [message] 将会发送给指令调用方.\n *\n * @see IllegalCommandArgumentException\n * @see CommandValueArgumentParser\n * @see AbstractCommandValueArgumentParser.illegalArgument\n */\npublic class CommandArgumentParserException @JvmOverloads constructor(\n    message: String,\n    cause: Throwable? = null,\n) : IllegalCommandArgumentException(message, cause)"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/descriptor/ExperimentalCommandDescriptors.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.command.descriptor\n\nimport kotlin.annotation.AnnotationTarget.*\n\n/**\n * 标记一个实验性的指令解释器 API.\n *\n * 这些 API 不具有稳定性, 且可能会在任意时刻更改.\n * 不建议在发行版本中使用这些 API.\n *\n * @since 1.0-RC\n */\n@Retention(AnnotationRetention.BINARY)\n@RequiresOptIn(level = RequiresOptIn.Level.WARNING)\n@Target(CLASS, TYPEALIAS, FUNCTION, PROPERTY, FIELD, CONSTRUCTOR)\n@MustBeDocumented\n@ExperimentalCommandDescriptors\npublic annotation class ExperimentalCommandDescriptors(\n    val message: String = \"Command descriptors are an experimental API.\",\n)"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/descriptor/TypeVariant.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.command.descriptor\n\nimport net.mamoe.mirai.console.command.parse.CommandValueArgument\nimport net.mamoe.mirai.console.internal.data.castOrNull\nimport net.mamoe.mirai.console.internal.data.kClassQualifiedName\nimport net.mamoe.mirai.message.data.*\nimport kotlin.reflect.KType\nimport kotlin.reflect.typeOf\n\n/**\n * Intrinsic variant of an [CommandValueArgument].\n *\n * The *intrinsic* reveals the independent conversion property of this type.\n * Conversion with [TypeVariant] is out of any contextual resource,\n * except the [output type][TypeVariant.outType] declared by the [TypeVariant] itself.\n *\n *\n * [TypeVariant] is not necessary for all [CommandValueArgument]s.\n *\n * @param OutType the type this [TypeVariant] can map a argument [Message] to .\n *\n * @see CommandValueArgument.typeVariants\n */\n@ExperimentalCommandDescriptors\npublic interface TypeVariant<out OutType> {\n    /**\n     * The reified type of [OutType]\n     */\n    public val outType: KType\n\n    /**\n     * Maps an [valueArgument] to [outType]\n     *\n     * @see CommandValueArgument.value\n     */\n    public fun mapValue(valueArgument: Message): OutType\n\n    public companion object {\n        /**\n         * Creates a [TypeVariant] with reified [OutType].\n         */\n        @OptIn(ExperimentalStdlibApi::class)\n        @JvmSynthetic\n        public inline operator fun <reified OutType> invoke(crossinline block: (valueParameter: Message) -> OutType): TypeVariant<OutType> {\n            return object : TypeVariant<OutType> {\n                override val outType: KType = typeOf<OutType>()\n                override fun mapValue(valueArgument: Message): OutType = block(valueArgument)\n            }\n        }\n    }\n}\n\n@ExperimentalCommandDescriptors\npublic object MessageContentTypeVariant : TypeVariant<MessageContent> {\n    @OptIn(ExperimentalStdlibApi::class)\n    override val outType: KType = typeOf<MessageContent>()\n    override fun mapValue(valueArgument: Message): MessageContent =\n        valueArgument.castOrNull<MessageContent>()\n            ?: error(\"Accepts MessageContent only but given ${valueArgument.kClassQualifiedName}\")\n}\n\n@ExperimentalCommandDescriptors\npublic object MessageChainTypeVariant : TypeVariant<MessageChain> {\n    @OptIn(ExperimentalStdlibApi::class)\n    override val outType: KType = typeOf<MessageChain>()\n    override fun mapValue(valueArgument: Message): MessageChain = valueArgument.toMessageChain()\n}\n\n@ExperimentalCommandDescriptors\npublic object ContentStringTypeVariant : TypeVariant<String> {\n    @OptIn(ExperimentalStdlibApi::class)\n    override val outType: KType = typeOf<String>()\n    override fun mapValue(valueArgument: Message): String = valueArgument.content\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/java/JCompositeCommand.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.command.java\n\nimport net.mamoe.mirai.console.command.BuiltInCommands\nimport net.mamoe.mirai.console.command.CommandManager\nimport net.mamoe.mirai.console.command.CommandOwner\nimport net.mamoe.mirai.console.command.CompositeCommand\nimport net.mamoe.mirai.console.command.descriptor.CommandArgumentContext\nimport net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors\nimport net.mamoe.mirai.console.command.descriptor.buildCommandArgumentContext\nimport net.mamoe.mirai.console.command.descriptor.plus\nimport net.mamoe.mirai.console.compiler.common.ResolveContext\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.COMMAND_NAME\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.RESTRICTED_CONSOLE_COMMAND_OWNER\nimport net.mamoe.mirai.console.permission.Permission\n\n/**\n * 复合指令. 指令注册时候会通过反射构造指令解析器.\n *\n * 示例:\n * ```java\n * public final class MyCompositeCommand extends CompositeCommand {\n *     public static final MyCompositeCommand INSTANCE = new MyCompositeCommand();\n *\n *     private MyCompositeCommand() {\n *         super(MyPluginMain.INSTANCE, \"manage\") // \"manage\" 是主指令名\n *     }\n *\n *     // [参数智能解析]\n *     //\n *     //\n *     // 在控制台执行 \"/manage <群号>.<群员> <持续时间>\",\n *     // 或在聊天群内发送 \"/manage <@一个群员> <持续时间>\",\n *     // 或在聊天群内发送 \"/manage <目标群员的群名> <持续时间>\",\n *     // 或在聊天群内发送 \"/manage <目标群员的账号> <持续时间>\"\n *     // 时调用这个函数\n *     @SubCommand\n *     public void mute(CommandSender sender, Member target, int duration) { // 通过 /manage mute <target> <duration> 调用.\n *         sender.sendMessage(\"/manage mute 被调用了, 参数为: \" + target + \", \" + duration);\n *\n *\n *         String result;\n *         try {\n *             result = target.mute(duration).toString();\n *         } catch(Exception e) {\n *             result = ExceptionsKt.stackTraceToString(e);\n *         }\n *\n *         sender.sendMessage(\"结果: \" + result);\n *     }\n *\n *     @SubCommand\n *     public void list(CommandSender sender) { // 执行 \"/manage list\" 时调用这个方法\n *         sender.sendMessage(\"/manage list 被调用了\");\n *     }\n *\n *     @SubCommand\n *     public void repeat(CommandContext context) {\n *         // 使用 CommandContext 作为参数，可以获得触发指令的原消息链 originalMessage，其中包含 MessageMetadata。\n *         context.getSender().sendMessage(context.getOriginalMessage());\n *     }\n *\n *     // 支持 Image 类型, 需在聊天中执行此指令.\n *     @SubCommand\n *     public void test(CommandSender sender, Image image) { // 执行 \"/manage test <一张图片>\" 时调用这个方法\n *         sender.sendMessage(\"/manage image 被调用了, 图片是 \" + image.imageId)\n *     }\n * }\n * ```\n *\n * Kotlin 示例查看 [CompositeCommand]\n *\n * @see buildCommandArgumentContext\n */\npublic abstract class JCompositeCommand\n@JvmOverloads constructor(\n    @ResolveContext(RESTRICTED_CONSOLE_COMMAND_OWNER) owner: CommandOwner,\n    @ResolveContext(COMMAND_NAME) primaryName: String,\n    @ResolveContext(COMMAND_NAME) vararg secondaryNames: String,\n    parentPermission: Permission = owner.parentPermission,\n) : CompositeCommand(owner, primaryName, secondaryNames = secondaryNames, parentPermission = parentPermission) {\n    /** 指令描述, 用于显示在 [BuiltInCommands.HelpCommand] */\n    public final override var description: String = super.description\n        protected set\n\n    public final override var permission: Permission = super.permission\n        protected set\n\n    /** 为 `true` 时表示 [指令前缀][CommandManager.commandPrefix] 可选 */\n    @ExperimentalCommandDescriptors\n    public final override var prefixOptional: Boolean = false\n        protected set\n\n    /**\n     * 智能参数解析环境\n     * @since 2.12\n     */\n    public final override var context: CommandArgumentContext = super.context\n        private set\n\n    /**\n     * 增加智能参数解析环境\n     * @since 2.12\n     */\n    protected fun addArgumentContext(context: CommandArgumentContext) {\n        this.context += context\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/java/JRawCommand.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.command.java\n\nimport net.mamoe.mirai.console.command.*\nimport net.mamoe.mirai.console.command.descriptor.*\nimport net.mamoe.mirai.console.compiler.common.ResolveContext\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.COMMAND_NAME\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.RESTRICTED_CONSOLE_COMMAND_OWNER\nimport net.mamoe.mirai.console.internal.command.findOrCreateCommandPermission\nimport net.mamoe.mirai.console.permission.Permission\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.buildMessageChain\nimport net.mamoe.mirai.utils.runBIO\n\n/**\n * 供 Java 用户继承\n *\n * 请在构造时设置相关属性.\n *\n * ```java\n * public final class MyCommand extends JRawCommand {\n *     public static final MyCommand INSTANCE = new MyCommand();\n *     private MyCommand() {\n *         super(MyPluginMain.INSTANCE, \"test\"); // 使用插件主类对象作为指令拥有者；设置主指令名为 \"test\"\n *         // 可选设置如下属性\n *         setUsage(\"/test\"); // 设置用法，这将会在 /help 中展示\n *         setDescription(\"这是一个测试指令\"); // 设置描述，也会在 /help 中展示\n *         setPrefixOptional(true); // 设置指令前缀是可选的，即使用 `test` 也能执行指令而不需要 `/test`\n *     }\n *\n *     @Override\n *     public void onCommand(@NotNull CommandSender sender, @NotNull MessageChain args) {\n *         // 处理指令\n *     }\n * }\n * ```\n *\n * @see JRawCommand\n */\npublic abstract class JRawCommand\n@JvmOverloads constructor(\n    /**\n     * 指令拥有者.\n     * @see CommandOwner\n     */\n    @ResolveContext(RESTRICTED_CONSOLE_COMMAND_OWNER)\n    public override val owner: CommandOwner,\n    @ResolveContext(COMMAND_NAME)\n    public override val primaryName: String,\n    @ResolveContext(COMMAND_NAME)\n    public override vararg val secondaryNames: String,\n    parentPermission: Permission = owner.parentPermission,\n) : Command {\n    /** 用法说明, 用于发送给用户 */\n    public override var usage: String = \"<no usages given>\"\n        protected set\n\n    /** 指令描述, 用于显示在 [BuiltInCommands.HelpCommand] */\n    public final override var description: String = \"<no descriptions given>\"\n        protected set\n\n    /** 指令权限 */\n    public final override var permission: Permission = findOrCreateCommandPermission(parentPermission)\n        protected set\n\n    /** 为 `true` 时表示 [指令前缀][CommandManager.commandPrefix] 可选 */\n    @ExperimentalCommandDescriptors\n    public final override var prefixOptional: Boolean = false\n        protected set\n\n    @ExperimentalCommandDescriptors\n    override val overloads: List<@JvmWildcard CommandSignature> = listOf(\n        CommandSignatureImpl(\n            receiverParameter = CommandReceiverParameter.Context(false),\n            valueParameters = listOf(\n                AbstractCommandValueParameter.UserDefinedType.createRequired<Array<out Message>>(\n                    \"args\",\n                    true\n                )\n            )\n        ) { call ->\n            val sender = call.caller\n            val arguments = call.rawValueArguments\n            runBIO {\n                onCommand(\n                    CommandContextImpl(sender, call.originalMessage),\n                    buildMessageChain { arguments.forEach { +it.value } }\n                )\n            }\n        }\n    )\n\n    /**\n     * 在指令被执行时调用.\n     *\n     * @param args 指令参数.\n     *\n     * @see CommandManager.executeCommand 查看更多信息\n     * @since 2.8\n     */\n    public open fun onCommand(sender: CommandSender, args: MessageChain) {}\n\n    /**\n     * 在指令被执行时调用.\n     *\n     * @param args 指令参数.\n     *\n     * @see CommandManager.executeCommand 查看更多信息\n     * @since 2.12\n     */\n    public open fun onCommand(context: CommandContext, args: MessageChain) {\n        onCommand(context.sender, args)\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/java/JSimpleCommand.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.command.java\n\nimport net.mamoe.mirai.console.command.CommandContext\nimport net.mamoe.mirai.console.command.CommandManager\nimport net.mamoe.mirai.console.command.CommandOwner\nimport net.mamoe.mirai.console.command.SimpleCommand\nimport net.mamoe.mirai.console.command.descriptor.CommandArgumentContext\nimport net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors\nimport net.mamoe.mirai.console.command.descriptor.plus\nimport net.mamoe.mirai.console.compiler.common.ResolveContext\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.COMMAND_NAME\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.RESTRICTED_CONSOLE_COMMAND_OWNER\nimport net.mamoe.mirai.console.permission.Permission\n\n/**\n * Java 实现:\n * ```java\n * public final class MySimpleCommand extends JSimpleCommand {\n *     public static final MySimpleCommand INSTANCE = new MySimpleCommand();\n *     private MySimpleCommand() {\n *         super(MyPlugin.INSTANCE, \"tell\");\n *         // 可选设置如下属性\n *         setDescription(\"这是一个测试指令\");\n *         setUsage(\"/tell <target> <message>\"); // 如不设置则自动根据带有 @Handler 的方法生成\n *         setPermission(CommandPermission.Operator.INSTANCE);\n *         setPrefixOptional(true);\n *     }\n *\n *     @Handler\n *     public void onCommand(CommandSender sender, User target, String message) {\n *         target.sendMessage(message);\n *     }\n * }\n * ```\n *\n * 其中 `CommandSender` 也可以替换为 `CommandContext`，可通过 [CommandContext.originalMessage] 获得触发指令的原消息链。\n *\n * @see SimpleCommand\n * @see [CommandManager.executeCommand]\n */\npublic abstract class JSimpleCommand @JvmOverloads constructor(\n    @ResolveContext(RESTRICTED_CONSOLE_COMMAND_OWNER) owner: CommandOwner,\n    @ResolveContext(COMMAND_NAME) primaryName: String,\n    @ResolveContext(COMMAND_NAME) vararg secondaryNames: String,\n    basePermission: Permission = owner.parentPermission,\n) : SimpleCommand(owner, primaryName, secondaryNames = secondaryNames, parentPermission = basePermission) {\n    public override var description: String = super.description\n        protected set\n    public override var permission: Permission = super.permission\n        protected set\n\n    @ExperimentalCommandDescriptors\n    public override var prefixOptional: Boolean = super.prefixOptional\n        protected set\n\n    /**\n     * 指令参数环境.\n     */\n    public override var context: CommandArgumentContext = super.context\n        protected set\n\n    /**\n     * 增加智能参数解析环境\n     * @since 2.12\n     */\n    protected fun addArgumentContext(context: CommandArgumentContext) {\n        this.context += context\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/parse/CommandCall.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ExperimentalStdlibApi::class)\n\npackage net.mamoe.mirai.console.command.parse\n\nimport net.mamoe.mirai.console.command.Command\nimport net.mamoe.mirai.console.command.CommandManager\nimport net.mamoe.mirai.console.command.CommandSender\nimport net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors\nimport net.mamoe.mirai.console.command.resolve.CommandCallResolver\nimport net.mamoe.mirai.console.command.resolve.ResolvedCommandCall\nimport net.mamoe.mirai.message.data.MessageChain\n\n/**\n * Unresolved [CommandCall].\n *\n * ### Implementation details\n * [CommandCall] should be _immutable_,\n * meaning all of its properties must be *pure* and should be implemented as an immutable property, or delegated by a lazy initializer.\n *\n * @see CommandCallParser\n * @see CommandCallResolver\n *\n * @see ResolvedCommandCall\n */\n@ExperimentalCommandDescriptors\npublic interface CommandCall {\n    /**\n     * The [CommandSender] responsible to this call.\n     */\n    public val caller: CommandSender\n\n    /**\n     * One of callee [Command]'s [Command.allNames].\n     *\n     * Generally [CommandCallResolver] use [calleeName] to find target [Command] registered in [CommandManager]\n     */\n    public val calleeName: String\n\n    /**\n     * Explicit value arguments parsed from raw [MessageChain] or implicit ones deduced by the [CommandCallResolver].\n     */\n    public val valueArguments: List<CommandValueArgument>\n\n    /**\n     * Original message\n     * @since 2.12\n     */\n    public val originalMessage: MessageChain\n\n    // maybe add contextual arguments, i.e. from MessageMetadata\n}\n\n@ExperimentalCommandDescriptors\npublic class CommandCallImpl(\n    override val caller: CommandSender,\n    override val calleeName: String,\n    override val valueArguments: List<CommandValueArgument>,\n    override val originalMessage: MessageChain,\n) : CommandCall"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/parse/CommandCallParser.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.command.parse\n\nimport net.mamoe.mirai.console.command.CommandSender\nimport net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors\nimport net.mamoe.mirai.console.command.resolve.CommandCallResolver\nimport net.mamoe.mirai.console.command.resolve.ResolvedCommandCall\nimport net.mamoe.mirai.console.extensions.CommandCallParserProvider\nimport net.mamoe.mirai.console.internal.extension.GlobalComponentStorage\nimport net.mamoe.mirai.message.data.MessageChain\n\n/**\n * Lexical and syntactical parser for transforming a [MessageChain] into [CommandCall]\n *\n * @see CommandCallResolver The call resolver for [CommandCall] to become [ResolvedCommandCall]\n * @see CommandCallParserProvider The extension point\n *\n * @see SpaceSeparatedCommandCallParser\n */\n@ExperimentalCommandDescriptors\npublic interface CommandCallParser {\n\n    /**\n     * Lexically and syntactically parse a [message] into [CommandCall], but performs nothing about resolving a call.\n     *\n     * @return `null` if unable to parse (i.e. due to syntax errors).\n     */\n    public fun parse(caller: CommandSender, message: MessageChain): CommandCall?\n\n    public companion object {\n        /**\n         * Calls [CommandCallParser]s provided by [CommandCallParserProvider] in [GlobalComponentStorage] sequentially,\n         * returning the first non-null result, `null` otherwise.\n         */\n        @JvmStatic\n        public fun MessageChain.parseCommandCall(sender: CommandSender): CommandCall? {\n            GlobalComponentStorage.useEachExtensions(CommandCallParserProvider) { provider ->\n                provider.instance.parse(sender, this@parseCommandCall)?.let { return it }\n            }\n            return null\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/parse/CommandValueArgument.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.command.parse\n\nimport net.mamoe.mirai.console.command.descriptor.*\nimport net.mamoe.mirai.console.internal.data.castOrInternalError\nimport net.mamoe.mirai.console.internal.data.classifierAsKClass\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.MessageContent\nimport net.mamoe.mirai.message.data.SingleMessage\nimport kotlin.reflect.KType\nimport kotlin.reflect.full.isSubtypeOf\nimport kotlin.reflect.typeOf\n\n\n/**\n * @see CommandValueArgument\n */\n@ExperimentalCommandDescriptors\npublic interface CommandArgument\n\n/**\n * @see DefaultCommandValueArgument\n */\n@ExperimentalCommandDescriptors\npublic interface CommandValueArgument : CommandArgument {\n    public val type: KType\n\n    /**\n     * [MessageContent] if single argument\n     * [MessageChain] is vararg\n     */\n    public val value: Message\n\n    /**\n     * Intrinsic variants of this argument.\n     *\n     * @see TypeVariant\n     */\n    public val typeVariants: List<TypeVariant<*>>\n}\n\n/**\n * The [CommandValueArgument] that doesn't vary in type (remaining [MessageContent]).\n */\n@ConsoleExperimentalApi\n@ExperimentalCommandDescriptors\npublic data class DefaultCommandValueArgument(\n    public override val value: Message,\n) : CommandValueArgument {\n    @OptIn(ExperimentalStdlibApi::class)\n    override val type: KType = typeOf<MessageContent>()\n    override val typeVariants: List<TypeVariant<*>> = listOf(\n        MessageContentTypeVariant,\n        MessageChainTypeVariant,\n        ContentStringTypeVariant,\n    )\n}\n\n@ExperimentalCommandDescriptors\npublic fun <T> CommandValueArgument.mapValue(typeVariant: TypeVariant<T>): T = typeVariant.mapValue(this.value)\n\n\n//@OptIn(ExperimentalStdlibApi::class)\n//@ExperimentalCommandDescriptors\n//public inline fun <reified T> CommandValueArgument.mapToType(): T =\n//    mapToTypeOrNull() ?: throw  NoValueArgumentMappingException(this, typeOf<T>())\n//\n//@OptIn(ExperimentalStdlibApi::class)\n//@ExperimentalCommandDescriptors\n//public fun <T> CommandValueArgument.mapToType(type: KType): T =\n//    mapToTypeOrNull(type) ?: throw  NoValueArgumentMappingException(this, type)\n\n@ExperimentalCommandDescriptors\npublic fun <T> CommandValueArgument.mapToTypeOrNull(expectingType: KType, context: (KType, Message) -> T?): T? {\n    if (expectingType.isSubtypeOf(ARRAY_OUT_ANY_TYPE) || expectingType in BASE_ARRAY_TYPES) {\n        val arrayElementType = BASE_ARRAY_TYPES[expectingType] ?: expectingType.arguments.single().type ?: ANY_TYPE\n\n        val result = ArrayList<Any?>()\n\n        when (val value = value) {\n            is MessageChain -> {\n                for (message in value) {\n                    result.add(mapToTypeOrNullImpl(arrayElementType, message) ?: context(arrayElementType, message))\n                }\n            }\n            else -> { // single\n                value.castOrInternalError<SingleMessage>()\n                result.add(mapToTypeOrNullImpl(arrayElementType, value) ?: context(arrayElementType, value))\n            }\n        }\n\n        @Suppress(\"UNCHECKED_CAST\")\n        return when (expectingType) {\n            typeOf<ByteArray>() -> (result as List<Byte>).toByteArray()\n            typeOf<CharArray>() -> (result as List<Char>).toCharArray()\n            typeOf<ShortArray>() -> (result as List<Short>).toShortArray()\n            typeOf<IntArray>() -> (result as List<Int>).toIntArray()\n            typeOf<LongArray>() -> (result as List<Long>).toLongArray()\n            typeOf<FloatArray>() -> (result as List<Float>).toFloatArray()\n            typeOf<DoubleArray>() -> (result as List<Double>).toDoubleArray()\n            else -> result.toArray(arrayElementType.createArray(result.size))\n        } as T?\n    }\n\n    @Suppress(\"UNCHECKED_CAST\")\n    return (mapToTypeOrNullImpl(expectingType, value) ?: context(expectingType, value)) as T?\n}\n\nprivate fun KType.createArray(size: Int): Array<Any?> {\n    return java.lang.reflect.Array.newInstance(this.classifierAsKClass().javaObjectType, size).castOrInternalError()\n}\n\n@OptIn(ExperimentalCommandDescriptors::class)\nprivate fun CommandValueArgument.mapToTypeOrNullImpl(expectingType: KType, value: Message): Any? {\n    @OptIn(ExperimentalStdlibApi::class)\n    val result = typeVariants\n        .filter { it.outType.isSubtypeOf(expectingType) }\n        .ifEmpty {\n            return null\n        }\n        .reduce { acc, typeVariant ->\n            if (acc.outType.isSubtypeOf(typeVariant.outType))\n                acc\n            else typeVariant\n        }\n    @Suppress(\"UNCHECKED_CAST\")\n    return result.mapValue(value)\n}\n\n//@ExperimentalCommandDescriptors\n//public inline fun <reified T> CommandValueArgument.mapToTypeOrNull(): T? {\n//    @OptIn(ExperimentalStdlibApi::class)\n//    return mapToTypeOrNull(typeOf<T>())\n//}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/parse/SpaceSeparatedCommandCallParser.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.command.parse\n\nimport net.mamoe.mirai.console.command.CommandSender\nimport net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors\nimport net.mamoe.mirai.console.extensions.CommandCallParserProvider\nimport net.mamoe.mirai.console.internal.command.flattenCommandComponents\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.MessageContent\nimport net.mamoe.mirai.message.data.content\n\n@ConsoleExperimentalApi\n@ExperimentalCommandDescriptors\npublic object SpaceSeparatedCommandCallParser : CommandCallParser {\n\n    @ConsoleExperimentalApi\n    @ExperimentalCommandDescriptors\n    public object Provider : CommandCallParserProvider {\n        override val instance: CommandCallParser get() = SpaceSeparatedCommandCallParser\n        override val priority: Int get() = -1\n    }\n\n    override fun parse(caller: CommandSender, message: MessageChain): CommandCall? {\n        val flatten = message.flattenCommandComponents().filterIsInstance<MessageContent>()\n        if (flatten.isEmpty()) return null\n        return CommandCallImpl(\n            caller = caller,\n            calleeName = flatten.first().content,\n            valueArguments = flatten.drop(1).map(::DefaultCommandValueArgument),\n            originalMessage = message\n        )\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/resolve/BuiltInCommandCallResolver.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.command.resolve\n\nimport net.mamoe.mirai.console.command.*\nimport net.mamoe.mirai.console.command.descriptor.*\nimport net.mamoe.mirai.console.command.descriptor.ArgumentAcceptance.Companion.isNotAcceptable\nimport net.mamoe.mirai.console.command.parse.CommandCall\nimport net.mamoe.mirai.console.command.parse.CommandValueArgument\nimport net.mamoe.mirai.console.command.parse.DefaultCommandValueArgument\nimport net.mamoe.mirai.console.extensions.CommandCallResolverProvider\nimport net.mamoe.mirai.console.internal.data.classifierAsKClass\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.console.util.safeCast\nimport net.mamoe.mirai.message.data.emptyMessageChain\nimport net.mamoe.mirai.message.data.toMessageChain\n\n/**\n * Builtin implementation of [CommandCallResolver]\n */\n@ConsoleExperimentalApi\n@ExperimentalCommandDescriptors\npublic object BuiltInCommandCallResolver : CommandCallResolver {\n\n    internal object Provider : CommandCallResolverProvider {\n        override val instance: CommandCallResolver = BuiltInCommandCallResolver\n        override val priority: Int get() = -1\n    }\n\n    override fun resolve(call: CommandCall): CommandResolveResult {\n        val callee = CommandManager.matchCommand(call.calleeName)\n            ?: return CommandResolveResult(CommandExecuteResult.UnresolvedCommand(call))\n\n        val valueArguments = call.valueArguments\n        val context = callee.safeCast<CommandArgumentContextAware>()?.context\n\n        val errorSink = ErrorSink()\n        val signature = resolveImpl(call.caller, callee, valueArguments, context, errorSink) ?: kotlin.run {\n            return CommandResolveResult(errorSink.createFailure(call, callee))\n        }\n\n        return CommandResolveResult(\n            ResolvedCommandCallImpl(\n                call.caller,\n                callee,\n                signature.signature,\n                signature.zippedArguments.map { it.second },\n                context ?: EmptyCommandArgumentContext,\n                call.originalMessage,\n            )\n        )\n    }\n\n    private data class ResolveData(\n        val signature: CommandSignature,\n        val zippedArguments: List<Pair<AbstractCommandValueParameter<*>, CommandValueArgument>>,\n        val argumentAcceptances: List<ArgumentAcceptanceWithIndex>,\n        val remainingParameters: List<AbstractCommandValueParameter<*>>,\n    ) {\n        val remainingOptionalCount: Int = remainingParameters.count { it.isOptional }\n    }\n\n    private data class ArgumentAcceptanceWithIndex(\n        val index: Int,\n        val acceptance: ArgumentAcceptance,\n    )\n\n    private class ErrorSink {\n        private val unmatchedCommandSignatures = mutableListOf<UnmatchedCommandSignature>()\n        private val resolutionAmbiguities = mutableListOf<CommandSignature>()\n\n        fun reportUnmatched(failure: UnmatchedCommandSignature) {\n            unmatchedCommandSignatures.add(failure)\n        }\n\n        fun reportAmbiguity(resolutionAmbiguity: CommandSignature) {\n            resolutionAmbiguities.add(resolutionAmbiguity)\n        }\n\n        fun createFailure(call: CommandCall, command: Command): CommandExecuteResult.Failure {\n            val failureReasons = unmatchedCommandSignatures.toMutableList()\n            val rA = FailureReason.ResolutionAmbiguity(resolutionAmbiguities)\n            failureReasons.addAll(resolutionAmbiguities.map { UnmatchedCommandSignature(it, rA) })\n            return CommandExecuteResult.UnmatchedSignature(command, call, unmatchedCommandSignatures)\n        }\n\n    }\n\n    private\n    fun CommandSignature.toResolveData(\n        caller: CommandSender,\n        valueArguments: List<CommandValueArgument>,\n        context: CommandArgumentContext?,\n        errorSink: ErrorSink,\n    ): ResolveData? {\n        val signature = this\n        val receiverParameter = signature.receiverParameter\n\n        if (receiverParameter != null) {\n            when (receiverParameter) {\n                is CommandReceiverParameter.Context -> {\n                    // accepts any sender\n                }\n                is CommandReceiverParameter.Sender -> {\n                    if (!receiverParameter.type.classifierAsKClass().isInstance(caller)) {\n                        errorSink.reportUnmatched(\n                            UnmatchedCommandSignature(\n                                signature,\n                                FailureReason.InapplicableReceiverArgument(receiverParameter, caller)\n                            )\n                        )// not compatible receiver\n                        return null\n                    }\n                }\n            }\n        }\n\n        val valueParameters = signature.valueParameters\n\n        val zipped = valueParameters.zip(valueArguments).toMutableList()\n\n        val remainingParameters = valueParameters.drop(zipped.size).toMutableList()\n\n        if (remainingParameters.any { !it.isOptional && !it.isVararg }) {\n            errorSink.reportUnmatched(\n                UnmatchedCommandSignature(\n                    signature,\n                    FailureReason.NotEnoughArguments\n                )\n            )// not enough args. // vararg can be empty.\n            return null\n        }\n\n        return if (zipped.isEmpty()) {\n            ResolveData(\n                signature = signature,\n                zippedArguments = emptyList(),\n                argumentAcceptances = emptyList(),\n                remainingParameters = remainingParameters,\n            )\n        } else {\n            if (valueArguments.size > valueParameters.size && zipped.last().first.isVararg) {\n                // merge vararg arguments\n                val (varargParameter, _)\n                        = zipped.removeLast()\n\n                zipped.add(\n                    varargParameter to DefaultCommandValueArgument(\n                        valueArguments.drop(zipped.size).map { it.value }.toMessageChain()\n                    )\n                )\n            } else {\n                // add default empty vararg argument\n                val remainingVararg = remainingParameters.find { it.isVararg }\n                if (remainingVararg != null) {\n                    zipped.add(remainingVararg to DefaultCommandValueArgument(emptyMessageChain()))\n                    remainingParameters.remove(remainingVararg)\n                }\n            }\n\n            ResolveData(\n                signature = signature,\n                zippedArguments = zipped,\n                argumentAcceptances = zipped.mapIndexed { index, (parameter, argument) ->\n                    val accepting = parameter.accepting(argument, context)\n                    if (accepting.isNotAcceptable) {\n                        errorSink.reportUnmatched(\n                            UnmatchedCommandSignature(\n                                signature,\n                                FailureReason.InapplicableValueArgument(parameter, argument)\n                            )\n                        )// argument type not assignable\n                        return null\n                    }\n                    ArgumentAcceptanceWithIndex(index, accepting)\n                },\n                remainingParameters = remainingParameters\n            )\n        }\n    }\n\n    private fun resolveImpl(\n        caller: CommandSender,\n        callee: Command,\n        valueArguments: List<CommandValueArgument>,\n        context: CommandArgumentContext?,\n        errorSink: ErrorSink,\n    ): ResolveData? {\n\n        callee.overloads\n            .mapNotNull l@{ signature ->\n                signature.toResolveData(caller, valueArguments, context, errorSink)\n            }\n            .also { result -> result.takeSingleResolveData()?.let { return it } }\n            .takeLongestMatches()\n            .ifEmpty { return null }\n            .also { result -> result.takeSingleResolveData()?.let { return it } }\n            // take single ArgumentAcceptance.Direct\n            .also { list ->\n\n                val candidates = list\n                    .asSequence()\n                    .flatMap { phase ->\n                        phase.argumentAcceptances.filter { it.acceptance is ArgumentAcceptance.Direct }\n                            .map { phase to it }\n                    }.toList()\n\n                candidates.singleOrNull()?.let { return it.first } // single Direct\n\n                if (candidates.distinctBy { it.second.index }.size != candidates.size) {\n                    // Resolution ambiguity\n                    /*\n                    open class A\n                    open class AA: A()\n\n                    open class C\n                    open class CC: C()\n\n                    fun foo(a: A, c: CC) = 1\n                    fun foo(a: AA, c: C) = 1\n                     */\n                    // The call is foo(AA(), C()) or foo(A(), CC())\n\n                    candidates.forEach { candidate -> errorSink.reportAmbiguity(candidate.first.signature) }\n\n                }\n            }\n\n        return null\n    }\n\n    private fun Collection<Any>.takeSingleResolveData() = asSequence().filterIsInstance<ResolveData>().singleOrNull()\n\n    /*\n\n\nopen class A\nopen class B : A()\nopen class C : A()\nopen class D : C()\nopen class BB : B()\n\nfun foo(a: A, c: C) = 1\n//fun foo(a: A, c: A) = 1\n//fun foo(a: A, c: C, def: Int = 0) = 1\nfun foo(a: B, c: C, d: D) = \"\"\n\nfun foo(b: BB, a: A, d: C) = 1.0\n\n\nfun main() {\n    val a = foo(D(), D()) // int\n    val b = foo(A(), C()) // int\n    val d = foo(BB(), c = C(), D()) // string\n}\n     */\n\n    private fun List<ResolveData>.takeLongestMatches(): Collection<ResolveData> {\n        if (isEmpty()) return emptyList()\n        return associateWith {\n            it.signature.valueParameters.size - it.remainingOptionalCount * 1.001 // slightly lower priority with optional defaults.\n        }.let { m ->\n            val maxMatch = m.values.maxByOrNull { it }\n            m.filter { it.value == maxMatch }.keys\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/resolve/CommandCallInterceptor.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:Suppress(\"unused\", \"NOTHING_TO_INLINE\")\n\npackage net.mamoe.mirai.console.command.resolve\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.console.command.CommandSender\nimport net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors\nimport net.mamoe.mirai.console.command.parse.CommandCall\nimport net.mamoe.mirai.console.command.parse.CommandCallParser\nimport net.mamoe.mirai.console.extensions.CommandCallInterceptorProvider\nimport net.mamoe.mirai.console.internal.extension.GlobalComponentStorage\nimport net.mamoe.mirai.console.internal.util.UNREACHABLE_CLAUSE\nimport net.mamoe.mirai.console.util.safeCast\nimport net.mamoe.mirai.message.data.Message\nimport org.jetbrains.annotations.Contract\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\n\n\n/**\n * 指令解析和调用拦截器. 用于在指令各解析阶段拦截或转换调用.\n */\n@ExperimentalCommandDescriptors\npublic interface CommandCallInterceptor {\n    /**\n     * 在指令[语法解析][CommandCallParser]前调用.\n     *\n     * @return `null` 表示未处理\n     */\n    public fun interceptBeforeCall(\n        message: Message,\n        caller: CommandSender,\n    ): InterceptResult<Message>? = null\n\n    /**\n     * 在指令[语法解析][CommandCallParser]后调用.\n     *\n     * @return `null` 表示未处理\n     */\n    public fun interceptCall(\n        call: CommandCall,\n    ): InterceptResult<CommandCall>? = null\n\n    /**\n     * 在指令[调用解析][CommandCallResolver]后调用.\n     *\n     * @return `null` 表示未处理\n     */\n    public fun interceptResolvedCall(\n        call: ResolvedCommandCall,\n    ): InterceptResult<ResolvedCommandCall>? = null\n\n    public companion object {\n        /**\n         * 使用 [CommandCallInterceptor] 依次调用 [interceptBeforeCall].\n         * 在第一个拦截时返回拦截原因, 在所有 [CommandCallInterceptor] 都处理完成后返回结果 [Message]\n         */\n        @JvmStatic\n        public fun Message.intercepted(caller: CommandSender): InterceptResult<Message> {\n            return GlobalComponentStorage.foldExtensions(CommandCallInterceptorProvider, this@intercepted) { acc, ext ->\n                val intercepted = ext.instance.interceptBeforeCall(acc, caller)\n                intercepted?.fold(\n                    onIntercepted = { return intercepted },\n                    otherwise = { it }\n                ) ?: acc\n            }.let { InterceptResult(it) }\n        }\n\n        /**\n         * 使用 [CommandCallInterceptor] 依次调用 [interceptBeforeCall].\n         * 在第一个拦截时返回拦截原因, 在所有 [CommandCallInterceptor] 都处理完成后返回结果 [CommandCall]\n         */\n        @JvmStatic\n        public fun CommandCall.intercepted(): InterceptResult<CommandCall> {\n            return GlobalComponentStorage.foldExtensions(CommandCallInterceptorProvider, this@intercepted) { acc, ext ->\n                val intercepted = ext.instance.interceptCall(acc)\n                intercepted?.fold(\n                    onIntercepted = { return intercepted },\n                    otherwise = { it }\n                ) ?: acc\n            }.let { InterceptResult(it) }\n        }\n\n        /**\n         * 使用 [CommandCallInterceptor] 依次调用 [interceptBeforeCall].\n         * 在第一个拦截时返回拦截原因, 在所有 [CommandCallInterceptor] 都处理完成后返回结果 [ResolvedCommandCall]\n         */\n        @JvmStatic\n        public fun ResolvedCommandCall.intercepted(): InterceptResult<ResolvedCommandCall> {\n            return GlobalComponentStorage.foldExtensions(CommandCallInterceptorProvider, this@intercepted) { acc, ext ->\n                val intercepted = ext.instance.interceptResolvedCall(acc)\n                intercepted?.fold(\n                    onIntercepted = { return intercepted },\n                    otherwise = { it }\n                ) ?: acc\n            }.let { InterceptResult(it) }\n        }\n    }\n}\n\n/**\n * [CommandCallInterceptor] 拦截结果\n */\n@ExperimentalCommandDescriptors\npublic class InterceptResult<T> internal constructor(\n    private val _value: Any?,\n    @Suppress(\"UNUSED_PARAMETER\") primaryConstructorMark: Any?,\n) {\n    /**\n     * 构造一个 [InterceptResult], 以 [value] 继续处理后续指令执行.\n     */\n    public constructor(value: T) : this(value as Any?, null)\n\n    /**\n     * 构造一个 [InterceptResult], 以 [原因][reason] 中断指令执行.\n     */\n    public constructor(reason: InterceptedReason) : this(reason as Any?, null)\n\n    @get:Contract(pure = true)\n    public val value: T?\n        @Suppress(\"UNCHECKED_CAST\")\n        get() {\n            val value = this._value\n            return if (value is InterceptedReason) null else value as T\n        }\n\n    @get:Contract(pure = true)\n    public val reason: InterceptedReason?\n        get() = this._value.safeCast()\n}\n\n@ExperimentalCommandDescriptors\npublic inline fun <T, R> InterceptResult<T>.fold(\n    onIntercepted: (reason: InterceptedReason) -> R,\n    otherwise: (call: T) -> R,\n): R {\n    contract {\n        callsInPlace(onIntercepted, InvocationKind.AT_MOST_ONCE)\n        callsInPlace(otherwise, InvocationKind.AT_MOST_ONCE)\n    }\n    value?.let { return otherwise(it) }\n    reason?.let { return onIntercepted(it) }\n    UNREACHABLE_CLAUSE\n}\n\n@ExperimentalCommandDescriptors\npublic inline fun <T : R, R> InterceptResult<T>.getOrElse(onIntercepted: (reason: InterceptedReason) -> R): R {\n    contract { callsInPlace(onIntercepted, InvocationKind.AT_MOST_ONCE) }\n    reason?.let(onIntercepted)\n    return value!!\n}\n\n/**\n * 创建一个 [InterceptedReason]\n *\n * @see InterceptedReason.create\n */\n@ExperimentalCommandDescriptors\n@JvmSynthetic\npublic inline fun InterceptedReason(message: String): InterceptedReason = InterceptedReason.create(message)\n\n/**\n * 拦截原因\n */\n@ExperimentalCommandDescriptors\npublic interface InterceptedReason {\n    public val message: String\n\n    public companion object {\n        /**\n         * 创建一个 [InterceptedReason]\n         */\n        public fun create(message: String): InterceptedReason = InterceptedReasonData(message)\n    }\n}\n\n@OptIn(ExperimentalCommandDescriptors::class)\n@Serializable\nprivate data class InterceptedReasonData(override val message: String) : InterceptedReason\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/resolve/CommandCallResolver.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.command.resolve\n\nimport net.mamoe.mirai.console.command.CommandExecuteResult\nimport net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors\nimport net.mamoe.mirai.console.command.parse.CommandCall\nimport net.mamoe.mirai.console.extensions.CommandCallResolverProvider\nimport net.mamoe.mirai.console.internal.extension.GlobalComponentStorage\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.console.util.safeCast\nimport org.jetbrains.annotations.Contract\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\n\n@ExperimentalCommandDescriptors\npublic class CommandResolveResult private constructor(\n    internal val value: Any?,\n) {\n    @get:Contract(pure = true)\n    public val call: ResolvedCommandCall?\n        get() = value.safeCast()\n\n    @get:Contract(pure = true)\n    public val failure: CommandExecuteResult.Failure?\n        get() = value.safeCast()\n\n    public constructor(call: ResolvedCommandCall) : this(call as Any?)\n    public constructor(failure: CommandExecuteResult.Failure) : this(failure as Any)\n}\n\n@ExperimentalCommandDescriptors\npublic inline fun <R> CommandResolveResult.fold(\n    onSuccess: (ResolvedCommandCall?) -> R,\n    onFailure: (CommandExecuteResult.Failure) -> R,\n): R {\n    contract {\n        callsInPlace(onSuccess, InvocationKind.AT_MOST_ONCE)\n        callsInPlace(onFailure, InvocationKind.AT_MOST_ONCE)\n    }\n    failure?.let(onFailure)?.let { return it }\n    return call.let(onSuccess)\n}\n\n\n@ExperimentalCommandDescriptors\npublic inline fun CommandResolveResult.getOrElse(\n    onFailure: (CommandExecuteResult.Failure) -> ResolvedCommandCall?,\n): ResolvedCommandCall {\n    contract {\n        callsInPlace(onFailure, InvocationKind.AT_MOST_ONCE)\n    }\n    failure?.let(onFailure)?.let { return it }\n    return call!!\n}\n\n/**\n * The resolver converting a [CommandCall] into [ResolvedCommandCall] based on registered []\n *\n * @see CommandCallResolverProvider The provider to instances of this class\n * @see BuiltInCommandCallResolver The builtin implementation\n */\n@ExperimentalCommandDescriptors\npublic interface CommandCallResolver {\n    public fun resolve(call: CommandCall): CommandResolveResult\n\n    public companion object {\n        @JvmName(\"resolveCall\")\n        @ConsoleExperimentalApi\n        @ExperimentalCommandDescriptors\n        public fun CommandCall.resolve(): CommandResolveResult {\n            return GlobalComponentStorage.getExtensions(CommandCallResolverProvider).first()\n                .extension.instance\n                .resolve(this@resolve)\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/command/resolve/ResolvedCommandCall.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.command.resolve\n\nimport net.mamoe.mirai.console.command.Command\nimport net.mamoe.mirai.console.command.CommandSender\nimport net.mamoe.mirai.console.command.CompositeCommand\nimport net.mamoe.mirai.console.command.descriptor.*\nimport net.mamoe.mirai.console.command.descriptor.CommandValueArgumentParser.Companion.parse\nimport net.mamoe.mirai.console.command.parse.CommandCall\nimport net.mamoe.mirai.console.command.parse.CommandValueArgument\nimport net.mamoe.mirai.console.command.parse.mapToTypeOrNull\nimport net.mamoe.mirai.console.internal.data.classifierAsKClass\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.console.util.cast\nimport net.mamoe.mirai.message.data.MessageChain\n\n/**\n * The resolved [CommandCall].\n *\n * ### Implementation details\n * [ResolvedCommandCall] should be _immutable_,\n * meaning all of its properties must be *pure* and should be implemented as an immutable property, or delegated by a lazy initializer.\n *\n * @see ResolvedCommandCallImpl\n */\n@ExperimentalCommandDescriptors\npublic interface ResolvedCommandCall {\n    /**\n     * The [CommandSender] responsible to this call.\n     */\n    public val caller: CommandSender\n\n    /**\n     * The callee [Command]\n     */\n    public val callee: Command\n\n    /**\n     * The callee [CommandSignature], specifically a sub command from [CompositeCommand]\n     */\n    public val calleeSignature: CommandSignature\n\n    /**\n     * Original arguments\n     */\n    public val rawValueArguments: List<CommandValueArgument>\n\n    /**\n     * Resolved value arguments arranged mapping the [CommandSignature.valueParameters] by index.\n     *\n     * **Default implementation details**: Lazy calculation.\n     */\n    @ConsoleExperimentalApi\n    public val resolvedValueArguments: List<ResolvedCommandValueArgument<*>>\n\n    /**\n     * @since 2.12\n     */\n    public val originalMessage: MessageChain\n\n    public companion object\n}\n\n/**\n * Resolved [CommandValueParameter] for [ResolvedCommandCall.resolvedValueArguments]\n */\n@ExperimentalCommandDescriptors\npublic data class ResolvedCommandValueArgument<T>(\n    val parameter: CommandValueParameter<T>,\n    /**\n     * Argument value expected by the [parameter]\n     */\n    val value: T,\n)\n\n// Don't move into companion, compilation error\n/**\n * Invoke this resolved call.\n */\n@ExperimentalCommandDescriptors\npublic suspend inline fun ResolvedCommandCall.call() {\n    return this@call.calleeSignature.call(this@call)\n}\n\n/**\n * Default implementation.\n */\n@ExperimentalCommandDescriptors\npublic class ResolvedCommandCallImpl(\n    override val caller: CommandSender,\n    override val callee: Command,\n    override val calleeSignature: CommandSignature,\n    override val rawValueArguments: List<CommandValueArgument>,\n    private val context: CommandArgumentContext,\n    override val originalMessage: MessageChain,\n) : ResolvedCommandCall {\n    @ConsoleExperimentalApi\n    override val resolvedValueArguments: List<ResolvedCommandValueArgument<*>> by lazy {\n        calleeSignature.valueParameters.zip(rawValueArguments).map { (parameter, argument) ->\n            val value = argument.mapToTypeOrNull(parameter.type) { type, message ->\n                context[type.classifierAsKClass()]?.parse(message, caller)\n            } ?: throw NoValueArgumentMappingException(argument, parameter.type)\n\n            ResolvedCommandValueArgument(parameter.cast(), value)\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/data/AbstractPluginData.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\", \"EXPOSED_SUPER_CLASS\", \"NOTHING_TO_INLINE\", \"unused\")\n\npackage net.mamoe.mirai.console.data\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.modules.EmptySerializersModule\nimport kotlinx.serialization.modules.SerializersModule\nimport net.mamoe.mirai.console.internal.data.PluginDataImpl\nimport net.mamoe.mirai.console.internal.data.getAnnotationListForValueSerialization\nimport net.mamoe.mirai.console.internal.data.valueName\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport kotlin.reflect.KProperty\n\n/**\n * [PluginData] 的默认实现. 支持使用 `by value()` 等委托方法创建 [Value] 并跟踪其改动.\n *\n * ### 实现注意\n * 此类型处于实验性阶段. 使用其中定义的属性和函数是安全的, 但将来可能会新增成员抽象函数.\n *\n * @see PluginData\n */\npublic abstract class AbstractPluginData : PluginData, PluginDataImpl() {\n    /**\n     * 这个 [PluginData] 保存时使用的名称.\n     */\n    @ConsoleExperimentalApi\n    public abstract override val saveName: String\n\n    /**\n     * 添加了追踪的 [ValueNode] 列表, 即通过 `by value` 初始化的属性列表.\n     *\n     * 它们的修改会被跟踪, 并触发 [onValueChanged].\n     *\n     * @see provideDelegate\n     */\n    @ConsoleExperimentalApi\n    public val valueNodes: MutableList<ValueNode<*>> = mutableListOf()\n\n    /**\n     * 供手动实现时值跟踪使用 (如 Java 用户). 一般 Kotlin 用户需使用 [provideDelegate]\n     */\n    @ConsoleExperimentalApi\n    public open fun <T : SerializerAwareValue<*>> track(\n        value: T,\n        /**\n         * 值名称.\n         *\n         * 如果属性带有 [ValueName], 则使用 [ValueName.value],\n         * 否则使用 [属性名称][KProperty.name]\n         *\n         * @see [ValueNode.value]\n         */\n        valueName: String,\n        annotations: List<Annotation>,\n    ): T =\n        value.apply { this@AbstractPluginData.valueNodes.add(ValueNode(valueName, this, annotations, this.serializer)) }\n\n    /**\n     * 使用 `by value()` 时自动调用此方法, 添加对 [Value] 的值修改的跟踪, 并创建 [ValueNode] 加入 [valueNodes]\n     */\n    @OptIn(ConsoleExperimentalApi::class)\n    public operator fun <T : SerializerAwareValue<*>> T.provideDelegate(\n        thisRef: Any?,\n        property: KProperty<*>,\n    ): T = track(this, property.valueName, property.getAnnotationListForValueSerialization())\n\n    /**\n     * 所有 [valueNodes] 更新和保存序列化器.\n     */\n    @ConsoleExperimentalApi\n    public final override val updaterSerializer: KSerializer<Unit>\n        get() = super.updaterSerializer\n\n    public override val serializersModule: SerializersModule get() = EmptySerializersModule()\n    /**\n     * 当所属于这个 [PluginData] 的 [Value] 的 [值][Value.value] 被修改时被调用.\n     */\n    @ConsoleExperimentalApi\n    public override fun onValueChanged(value: Value<*>) {\n        // no-op by default\n    }\n\n    /**\n     * 当这个 [PluginData] 被放入一个 [PluginDataStorage] 时调用\n     */\n    @ConsoleExperimentalApi\n    public override fun onInit(owner: PluginDataHolder, storage: PluginDataStorage) {\n        // no-op by default\n    }\n\n    /**\n     * 由 [track] 创建, 来自一个通过 `by value` 初始化的属性节点.\n     */\n    @ConsoleExperimentalApi\n    public data class ValueNode<T>(\n        /**\n         * 节点名称.\n         *\n         * 如果属性带有 [ValueName], 则使用 [ValueName.value],\n         * 否则使用 [属性名称][KProperty.name]\n         */\n        val valueName: String,\n        /**\n         * 属性值代理\n         */\n        val value: Value<out T>,\n        /**\n         * 注解列表\n         */\n        val annotations: List<Annotation>,\n        /**\n         * 属性值更新器\n         */\n        val updaterSerializer: KSerializer<Unit>,\n    )\n}\n\n/**\n * 获取这个 [KProperty] 委托的 [Value]\n *\n * 示例:\n * ```\n * object MyData : AutoSavePluginData(PluginMain) {\n *     val list: List<String> by value()\n * }\n *\n * val value: Value<List<String>> = MyData.findBackingFieldValue(MyData::list)\n * ```\n *\n * @see PluginData\n */\n@ConsoleExperimentalApi\npublic fun <T> AbstractPluginData.findBackingFieldValue(property: KProperty<T>): Value<out T>? =\n    findBackingFieldValue(property.valueName)\n\n/**\n * 获取这个 [KProperty] 委托的 [Value]\n *\n * 示例:\n * ```\n * object MyData : AutoSavePluginData(PluginMain) {\n *     @ValueName(\"theList\")\n *     val list: List<String> by value()\n *     val int: Int by value()\n * }\n *\n * val value: Value<List<String>> = MyData.findBackingFieldValue(\"theList\") // 需使用 @ValueName 标注的名称\n * val intValue: Value<Int> = MyData.findBackingFieldValue(\"int\")\n * ```\n *\n * @see PluginData\n */\n@ConsoleExperimentalApi\npublic fun <T> AbstractPluginData.findBackingFieldValue(propertyValueName: String): Value<out T>? {\n    @Suppress(\"UNCHECKED_CAST\")\n    return this.valueNodes.find { it.valueName == propertyValueName }?.value as Value<out T>?\n}\n\n/**\n * 获取这个 [KProperty] 委托的 [Value]\n *\n * 示例:\n * ```\n * object MyData : AutoSavePluginData(PluginMain) {\n *     val list: List<String> by value()\n * }\n *\n * val value: PluginData.ValueNode<List<String>> = MyData.findBackingFieldValueNode(MyData::list)\n * ```\n *\n * @see PluginData\n */\n@ConsoleExperimentalApi\npublic fun <T> AbstractPluginData.findBackingFieldValueNode(property: KProperty<T>): AbstractPluginData.ValueNode<out T>? {\n    @Suppress(\"UNCHECKED_CAST\")\n    return this.valueNodes.find { it.valueName == property.name } as AbstractPluginData.ValueNode<out T>?\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/data/AutoSavePluginConfig.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.data\n\nimport kotlinx.coroutines.Job\n\n/**\n * 链接自动保存的 [PluginConfig].\n *\n * 当任一相关 [Value] 的值被修改时, 将在一段时间无其他修改时保存\n *\n * 若 [AutoSavePluginDataHolder.coroutineContext] 含有 [Job], 则 [AutoSavePluginData] 会通过 [Job.invokeOnCompletion] 在 Job 完结时触发自动保存.\n *\n * @see PluginConfig\n * @see AutoSavePluginData\n */\npublic open class AutoSavePluginConfig public constructor(saveName: String) : AutoSavePluginData(saveName), PluginConfig"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/data/AutoSavePluginData.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"PropertyName\", \"PrivatePropertyName\")\n\npackage net.mamoe.mirai.console.data\n\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.internal.data.qualifiedNameOrTip\nimport net.mamoe.mirai.console.internal.util.runIgnoreException\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.console.util.ConsoleInternalApi\nimport net.mamoe.mirai.console.util.TimedTask\nimport net.mamoe.mirai.console.util.launchTimedTask\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.error\nimport net.mamoe.mirai.utils.withSwitch\n\n/**\n * 链接自动保存的 [PluginData].\n *\n * 当任一相关 [Value] 的值被修改时, 将在一段时间无其他修改时保存\n *\n * 若 [AutoSavePluginDataHolder.coroutineContext] 含有 [Job], 则 [AutoSavePluginData] 会通过 [Job.invokeOnCompletion] 在 Job 完结时触发自动保存.\n *\n * @see PluginData\n */\npublic open class AutoSavePluginData private constructor(\n    // KEEP THIS PRIMARY CONSTRUCTOR FOR FUTURE USE: WE'LL SUPPORT SERIALIZERS_MODULE FOR POLYMORPHISM\n    @Suppress(\"UNUSED_PARAMETER\") primaryConstructorMark: Any?,\n) : AbstractPluginData() {\n    @OptIn(ConsoleExperimentalApi::class)\n    private lateinit var owner_: AutoSavePluginDataHolder\n\n    @OptIn(ConsoleExperimentalApi::class)\n    private val autoSaveIntervalMillis_: LongRange get() = owner_.autoSaveIntervalMillis\n\n    @OptIn(ConsoleExperimentalApi::class)\n    private lateinit var storage_: PluginDataStorage\n\n    @ConsoleExperimentalApi\n    public final override val saveName: String\n        get() = _saveName\n\n    // bug\n    private lateinit var _saveName: String\n\n    public constructor(saveName: String) : this(null) {\n        _saveName = saveName\n    }\n\n    @OptIn(ConsoleInternalApi::class, ConsoleExperimentalApi::class)\n    private fun logException(e: Throwable) {\n        owner_.coroutineContext[CoroutineExceptionHandler]?.handleException(owner_.coroutineContext, e)\n            ?.let { return }\n        MiraiConsole.mainLogger.error(\n            \"An exception occurred when saving config ${this@AutoSavePluginData::class.qualifiedNameOrTip} \" +\n                    \"but CoroutineExceptionHandler not found in PluginDataHolder.coroutineContext for ${owner_::class.qualifiedNameOrTip}\",\n            e\n        )\n    }\n\n    @ConsoleExperimentalApi\n    override fun onInit(owner: PluginDataHolder, storage: PluginDataStorage) {\n        check(owner is AutoSavePluginDataHolder) { \"owner must be AutoSavePluginDataHolder for AutoSavePluginData\" }\n\n        if (this::storage_.isInitialized) {\n            check(storage == this.storage_) { \"AutoSavePluginData is already initialized with one storage and cannot be reinitialized with another.\" }\n        }\n\n        this.storage_ = storage\n        this.owner_ = owner\n\n        owner_.coroutineContext[Job]?.invokeOnCompletion { save() }\n\n        saverTask = owner_.launchTimedTask(\n            intervalMillis = autoSaveIntervalMillis_.first,\n            coroutineContext = CoroutineName(\"AutoSavePluginData.saver: ${this::class.qualifiedNameOrTip}\")\n        ) { save() }\n\n        if (shouldPerformAutoSaveWheneverChanged()) {\n            // 定时自动保存, 用于 kts 序列化的对象\n            owner_.launch(CoroutineName(\"AutoSavePluginData.timedAutoSave: ${this::class.qualifiedNameOrTip}\")) {\n                while (isActive) {\n                    runIgnoreException<CancellationException> { delay(autoSaveIntervalMillis_.last) } ?: return@launch\n                    doSave()\n                }\n            }\n        }\n    }\n\n    private var saverTask: TimedTask? = null\n\n    /**\n     * @return `true` 时, 一段时间后, 即使无属性改变, 也会进行保存.\n     */\n    @ConsoleExperimentalApi\n    protected open fun shouldPerformAutoSaveWheneverChanged(): Boolean {\n        return true\n    }\n\n    @ConsoleExperimentalApi\n    public final override fun onValueChanged(value: Value<*>) {\n        debuggingLogger1.error { \"onValueChanged: $value\" }\n        saverTask?.setChanged()\n    }\n\n    private fun save() {\n        kotlin.runCatching {\n            doSave()\n        }.onFailure { e ->\n            logException(e)\n        }\n    }\n\n    @OptIn(ConsoleExperimentalApi::class)\n    private fun doSave() {\n        debuggingLogger1.error { \"doSave: ${this::class.qualifiedName}\" }\n        storage_.store(owner_, this)\n    }\n}\n\ninternal val debuggingLogger1 by lazy {\n    MiraiLogger.Factory.create(AutoSavePluginData::class, \"console.debug\").withSwitch(false)\n}\n\n@Suppress(\"RESULT_CLASS_IN_RETURN_TYPE\")\ninternal inline fun <R> MiraiLogger.runCatchingLog(message: String? = null, block: () -> R): Result<R> {\n    return kotlin.runCatching {\n        block()\n    }.onFailure {\n        if (message != null) {\n            error(message, it)\n        } else error(it)\n    }\n}\n\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n@kotlin.internal.LowPriorityInOverloadResolution\ninternal inline fun <R> MiraiLogger.runCatchingLog(message: (Throwable) -> String, block: () -> R): R? {\n    return kotlin.runCatching {\n        block()\n    }.onFailure {\n        error(message(it), it)\n    }.getOrNull()\n}\n\n@Suppress(\"SpellCheckingInspection\")\nprivate const val MAGIC_NUMBER_CFST_INIT: Long = Long.MAX_VALUE\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/data/AutoSavePluginDataHolder.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.data\n\nimport kotlinx.coroutines.CoroutineExceptionHandler\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Job\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\n\n/**\n * 可以持有相关 [AutoSavePluginData] 的对象.\n *\n * ### 实现 [AutoSavePluginDataHolder]\n * [CoroutineScope.coroutineContext] 中应用 [CoroutineExceptionHandler]\n *\n * @see net.mamoe.mirai.console.plugin.jvm.JvmPlugin\n */\n@ConsoleExperimentalApi\npublic interface AutoSavePluginDataHolder : PluginDataHolder, CoroutineScope {\n    /**\n     * [AutoSavePluginData] 每次自动保存时间间隔\n     *\n     * - 区间的左端点为最小间隔, 一个 [Value] 被修改后, 若此时间段后无其他修改, 将触发自动保存; 若有, 将重新开始计时.\n     * - 区间的右端点为最大间隔, 一个 [Value] 被修改后, 最多不超过这个时间段后就会被保存.\n     *\n     * 若 [AutoSavePluginDataHolder.coroutineContext] 含有 [Job],\n     * 则 [AutoSavePluginData] 会通过 [Job.invokeOnCompletion] 在 Job 完结时触发自动保存.\n     *\n     * @see LongRange Java 用户使用 [LongRange] 的构造器创建\n     * @see Long.rangeTo Kotlin 用户使用 [Long.rangeTo] 创建, 如 `3000..50000`\n     */\n    @ConsoleExperimentalApi\n    public val autoSaveIntervalMillis: LongRange\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/data/PluginConfig.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.data\n\nimport net.mamoe.mirai.console.data.java.JavaAutoSavePluginConfig\n\n/**\n * 一个插件的配置数据, 用于和用户交互.\n *\n * 用户可通过 mirai-console 前端 (如在 Android 中可视化实现) 修改这些配置, 修改会自动写入这个对象中.\n *\n * **提示**:\n * 插件内部的数据应用 [PluginData] 存储, 而不能使用 [PluginConfig].\n *\n * ## 实现\n * 对使用者来说, [PluginConfig] 与 [PluginData] 实现几乎相同. 目前仅需在 [PluginData] 使用的基础上添加接口实现即可.\n *\n * ### Kotlin\n * 在 [PluginData] 的示例基础上, 修改对象定义\n * ```\n * // 原\n * object MyPluginData : AutoSavePluginData()\n * // 修改为\n * object MyPluginConfig : AutoSavePluginConfig()\n * ```\n * 即可将一个 [PluginData] 变更为 [PluginConfig].\n *\n * ### Java\n * 见 [JavaAutoSavePluginConfig]\n *\n * @see PluginData\n */\npublic interface PluginConfig : PluginData {\n    /**\n     * 警告: [PluginConfig] 的实现处于实验性阶段.\n     *\n     * 自主实现 [PluginConfig] 将得不到兼容性保障. 请仅考虑使用 [AutoSavePluginConfig]\n     */\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/data/PluginData.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\n    \"INVISIBLE_REFERENCE\",\n    \"INVISIBLE_MEMBER\",\n)\n@file:JvmName(\"PluginDataKt\")\n\npackage net.mamoe.mirai.console.data\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.modules.SerializersModule\nimport net.mamoe.mirai.console.compiler.common.ResolveContext\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.RESTRICTED_NO_ARG_CONSTRUCTOR\nimport net.mamoe.mirai.console.data.java.JavaAutoSavePluginData\nimport net.mamoe.mirai.console.internal.data.createInstanceSmart\nimport net.mamoe.mirai.console.internal.data.valueFromKTypeImpl\nimport net.mamoe.mirai.console.internal.data.valueImpl\nimport net.mamoe.mirai.console.plugin.jvm.AbstractJvmPlugin\nimport net.mamoe.mirai.console.plugin.jvm.JvmPlugin\nimport net.mamoe.mirai.console.plugin.jvm.reloadPluginData\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.message.MessageSerializers\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport kotlin.internal.LowPriorityInOverloadResolution\nimport kotlin.reflect.KClass\nimport kotlin.reflect.KType\nimport kotlin.reflect.typeOf\n\n/**\n * 一个插件内部的, 对用户隐藏的数据对象. 可包含对多个 [Value] 的值变更的跟踪. 典型的实现为 [AbstractPluginData].\n *\n * [AbstractPluginData] 不涉及有关数据的存储, 而是只维护数据结构: [属性节点列表][AbstractPluginData.valueNodes].\n *\n * 有关存储方案, 请查看 [PluginDataStorage].\n *\n * **注意**: [PluginData] 总应该是单例的.\n *\n * ## [JvmPlugin] 的实现方案\n *\n * 要修改保存时的名称, 请参考 [ValueName]\n *\n * ### 使用 Kotlin\n *\n * 在 [JvmPlugin] 的典型实现方式:\n * ```\n * object PluginMain : KotlinPlugin()\n *\n * object MyPluginData : AutoSavePluginData() {\n *    var list: MutableList<String> by value(mutableListOf(\"a\", \"b\")) // mutableListOf(\"a\", \"b\") 是初始值, 可以省略\n *    val custom: Map<Long, CustomData> by value() // 使用 kotlinx-serialization 序列化的类型.\n *    var long: Long by value(0) // 允许 var\n *    var int by value(0) // 可以使用类型推断, 但更推荐使用 `var long: Long by value(0)` 这种定义方式.\n *\n *    // 将 MutableMap<Long, Long> 映射到 MutableMap<Bot, Long>.\n *    val botToLongMap: MutableMap<Bot, Long> by value<MutableMap<Long, Long>>().mapKeys(Bot::getInstance, Bot::id)\n * }\n *\n * @Serializable // kotlinx.serialization: https://github.com/Kotlin/kotlinx.serialization\n * data class CustomData(\n *     // ...\n * )\n * ```\n *\n * 使用时, 可以方便地直接调用, 如:\n * ```\n * val theList: MutableList<String> = AccountPluginData.list\n * ```\n *\n * 但也注意, 不要存储 `AccountPluginData.list`. 它可能受不到值跟踪. 若必要存储, 请使用 [AbstractPluginData.findBackingFieldValue]\n *\n * ### 使用 Java\n *\n * 参考 [JavaAutoSavePluginData]\n *\n * ## 非引用赋值\n *\n * 由于实现特殊, 赋值时不会写其引用. 即:\n * ```\n * val list = ArrayList<String>(\"A\")\n * MyPluginData.list = list // 赋值给 PluginData 的委托属性是非引用的\n * println(MyPluginData.list) // \"[A]\"\n *\n * list.add(\"B\")\n * println(list) // \"[A, B]\"\n * println(MyPluginData.list) // \"[A]\"  // !! 由于 `list` 的引用并未赋值给 `MyPluginData.list`.\n * ```\n *\n * 另一个更容易出错的示例:\n * ```\n * // MyPluginData.nestedMap: MutableMap<Long, List<Long>> by value()\n * val newList = MyPluginData.map.getOrPut(1, ::mutableListOf)\n * newList.add(1) // 不会添加到 MyPluginData.nestedMap 中, 因为 `mutableListOf` 创建的 MutableList 被非引用 (浅拷贝) 地添加进了 MyPluginData.nestedMap\n * ```\n *\n * 一个解决方案是对 [SerializerAwareValue] 做映射或相关修改. 如 [PluginDataExtensions].\n *\n * 要查看详细的解释，请查看 [docs/PluginData.md](/mirai-console/docs/PluginData.md)\n *\n * ## 实现注意\n * 此类型处于实验性阶段. 使用其中定义的属性和函数是安全的, 但将来可能会新增成员抽象函数.\n *\n * 继承 [AbstractPluginData] 比继承 [PluginData] 更安全, 尽管 [AbstractPluginData] 也不稳定.\n *\n * @see AbstractJvmPlugin.reloadPluginData 通过 [JvmPlugin] 获取指定 [PluginData] 实例.\n * @see PluginDataStorage [PluginData] 存储仓库\n * @see PluginDataExtensions 相关 [SerializerAwareValue] 映射函数\n */\n@NotStableForInheritance\npublic interface PluginData {\n    /**\n     * 这个 [PluginData] 保存时使用的名称.\n     */\n    @ConsoleExperimentalApi\n    public val saveName: String\n\n    /**\n     * [PluginData] 序列化时使用的格式的枚举.\n     */\n    @ConsoleExperimentalApi\n    public enum class SaveType(@ConsoleExperimentalApi public val extension: String) {\n        YAML(\"yml\"), JSON(\"json\")\n    }\n\n    /**\n     * 决定这个 [PluginData] 序列化时使用的格式, 默认为 YAML.\n     * 具体实现格式由 [PluginDataStorage] 决定.\n     */\n    @ConsoleExperimentalApi\n    public val saveType: SaveType get() = SaveType.YAML\n\n    @ConsoleExperimentalApi\n    public val updaterSerializer: KSerializer<Unit>\n\n    /**\n     * 当所属于这个 [PluginData] 的 [Value] 的 [值][Value.value] 被修改时被调用.\n     * 调用者为 [Value] 的实现.\n     */\n    @ConsoleExperimentalApi\n    public fun onValueChanged(value: Value<*>)\n\n    /**\n     * 序列化本对象数据时使用的 [SerializersModule]. 用于支持多态序列化等.\n     * 在序列化时会先使用 [PluginData.serializersModule], 再对无法找到 serializer 的类型使用 [MessageSerializers.serializersModule].\n     *\n     * ### 使用示例\n     *\n     * 假设你编写了一个类型 `ChatHistory` 用来存储一个群的消息记录:\n     * ```\n     * data class ChatHistory(\n     *     val groupId: Long,\n     *     val chain: List<MessageChain>,\n     * )\n     * ```\n     *\n     * 要在 [PluginData] 中支持它, 需要首先为 `ChatHistory` 编写 [KSerializer].\n     *\n     * 一种方式是为其添加 [kotlinx.serialization.Serializable]:\n     *\n     * ```\n     * @Serializable\n     * data class ChatHistory(\n     *     val groupId: Long,\n     *     val chain: List<MessageChain>,\n     * )\n     * ```\n     *\n     * 编译器将会自动生成一个 [KSerializer], 可通过 `ChatHistory.Companion.serializer()` 获取.\n     *\n     * 然后在 [PluginData] 定义中添加该 [KSerializer]:\n     * ```\n     * object MyData : AutoSavePluginData(\"save\") {\n     *     // 注意, serializersModule 需要早于其他属性定义初始化\n     *     override val serializersModule = SerializersModule {\n     *         contextual(ChatHistory::class, ChatHistory.serializers()) // 为 ChatHistory 指定 KSerializer\n     *     }\n     *\n     *     val histories: Map<Long, ChatHistory> by value()\n     * }\n     * ```\n     *\n     * 然而, 即使不覆盖 `serializersModule` 提供 [KSerializer], mirai 也会通过反射尝试获取.\n     *\n     * 但对于不是使用 `@Serializable` 注解方式, 或者是 `interface`, `abstract class` 等的抽象类型, 则必须覆盖 `serializersModule` 并提供其 [KSerializer].\n     *\n     *\n     *\n     * @see SerializersModule\n     *\n     * @since 2.11\n     */\n    public val serializersModule: SerializersModule // 该属性在 2.0 增加, 但在 2.11 才正式支持并删除 @MiraiExperimentalApi\n\n    /**\n     * 当这个 [PluginData] 被放入一个 [PluginDataStorage] 时调用\n     */\n    @ConsoleExperimentalApi\n    public fun onInit(owner: PluginDataHolder, storage: PluginDataStorage)\n}\n\n\n// don't default = 0, cause ambiguity\n//// region PluginData_value_primitives CODEGEN ////\n\n/**\n * 创建一个 [Byte] 类型的 [Value], 并设置初始值为 [default]\n */\npublic fun PluginData.value(default: Byte): SerializerAwareValue<Byte> = valueImpl(default)\n\n/**\n * 创建一个 [Short] 类型的 [Value], 并设置初始值为 [default]\n */\npublic fun PluginData.value(default: Short): SerializerAwareValue<Short> = valueImpl(default)\n\n/**\n * 创建一个 [Int] 类型的 [Value], 并设置初始值为 [default]\n */\npublic fun PluginData.value(default: Int): SerializerAwareValue<Int> = valueImpl(default)\n\n/**\n * 创建一个 [Long] 类型的 [Value], 并设置初始值为 [default]\n */\npublic fun PluginData.value(default: Long): SerializerAwareValue<Long> = valueImpl(default)\n\n/**\n * 创建一个 [Float] 类型的 [Value], 并设置初始值为 [default]\n */\npublic fun PluginData.value(default: Float): SerializerAwareValue<Float> = valueImpl(default)\n\n/**\n * 创建一个 [Double] 类型的 [Value], 并设置初始值为 [default]\n */\npublic fun PluginData.value(default: Double): SerializerAwareValue<Double> = valueImpl(default)\n\n/**\n * 创建一个 [Char] 类型的 [Value], 并设置初始值为 [default]\n */\npublic fun PluginData.value(default: Char): SerializerAwareValue<Char> = valueImpl(default)\n\n/**\n * 创建一个 [Boolean] 类型的 [Value], 并设置初始值为 [default]\n */\npublic fun PluginData.value(default: Boolean): SerializerAwareValue<Boolean> = valueImpl(default)\n\n/**\n * 创建一个 [String] 类型的 [Value], 并设置初始值为 [default]\n */\npublic fun PluginData.value(default: String): SerializerAwareValue<String> = valueImpl(default)\n\n//// endregion PluginData_value_primitives CODEGEN ////\n\n\n/**\n * 通过具体化类型创建一个 [SerializerAwareValue], 并设置初始值.\n *\n * 2.11 起, 本函数会优先根据返回值推断类型. 如下示例:\n * ```\n * var singleMessage: SingleMessage by value(PlainText(\"str\")) // value 的类型为 SerializerAwareValue<SingleMessage>\n * ```\n * 这符合正常的类型定义逻辑.\n *\n * @param T 具体化参数类型 T. 在 2.11 以前, 支持:\n * - 基础数据类型\n * - 标准库集合类型 ([List], [Map], [Set])\n * - 标准库数据类型 ([Map.Entry], [Pair], [Triple])\n * - 使用 [kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization) 的 [Serializable] 标记的, 可以通过反射获取 [KSerializer] 的类型\n *\n * 2.11 起, 还支持:\n * - [MessageSerializers] 支持的所有类型, 如 [MessageChain].\n * - 在 [PluginData.serializersModule] 自定义支持的类型\n */\n@OptIn(ConsoleExperimentalApi::class)\n@LowPriorityInOverloadResolution\npublic inline fun <reified T> PluginData.value(\n    default: T,\n    crossinline apply: T.() -> Unit = {},\n): SerializerAwareValue<@kotlin.internal.Exact T> {\n    /*\n     * 使用 `@Exact` 的 trick (自 2.11.0-RC)\n     *\n     * 使用前:\n     *\n     * ```\n     * var singleMessage: SingleMessage by value(PlainText(\"str\"))\n     * ```\n     *\n     * `value` 的 reified [T] 根据其参数推断为 [PlainText], 则会使用 `PlainText.serializer()`.\n     *\n     * 可以通过序列化后的 YAML 文本直观地感受问题:\n     * ```yaml\n     * singleMessage:\n     *   content: str\n     * ```\n     * 那么将来若 `singleMessage` 的值变更为非 [PlainText] 类型, 将会无法序列化.\n     *\n     * 附使用 `@Exact` 时的正确结果 (使用 [SingleMessage] 的序列化器 (来自 [MessageSerializers.serializersModule])):\n     *\n     * ```yaml\n     * singleMessage:\n     *   type: PlainText\n     *   value:\n     *     content: str\n     * ```\n     *\n     * 相关测试: [net.mamoe.mirai.console.data.PluginDataTest.supports message chain]\n     */\n    return valueFromKType(typeOf<T>(), default).also { it.value.apply() }\n}\n\n/**\n * 通过具体化类型创建一个 [SerializerAwareValue].\n */\n@ResolveContext(RESTRICTED_NO_ARG_CONSTRUCTOR)\n@LowPriorityInOverloadResolution\npublic inline fun <@ResolveContext(RESTRICTED_NO_ARG_CONSTRUCTOR) reified T>\n        PluginData.value(apply: T.() -> Unit = {}): SerializerAwareValue<@kotlin.internal.Exact T> =\n    valueImpl<T>(typeOf<T>(), T::class).also { it.value.apply() }\n\n@OptIn(ConsoleExperimentalApi::class)\n@Suppress(\"UNCHECKED_CAST\")\n@PublishedApi\ninternal fun <T> PluginData.valueImpl(type: KType, classifier: KClass<*>): SerializerAwareValue<T> =\n    valueFromKType(type, classifier.run { objectInstance ?: createInstanceSmart() } as T)\n\n/**\n * 通过一个特定的 [KType] 创建 [Value], 并设置初始值.\n *\n * 对于 [Map], [Set], [List] 等标准库类型, 这个函数会尝试构造 [LinkedHashMap], [LinkedHashSet], [ArrayList] 等相关类型.\n * 而对于自定义数据类型, 本函数只会反射获取 [objectInstance][KClass.objectInstance] 或使用*无参构造器*构造实例.\n *\n * @param T 具体化参数类型 T. 仅支持:\n * - 基础数据类型, [String]\n * - 标准库集合类型 ([List], [Map], [Set])\n * - 标准库数据类型 ([Map.Entry], [Pair], [Triple])\n * - 使用 [kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization) 的 [Serializable] 标记的类\n */\n@Suppress(\"UNCHECKED_CAST\")\n@ConsoleExperimentalApi\npublic fun <T> PluginData.valueFromKType(type: KType, default: T): SerializerAwareValue<T> =\n    (valueFromKTypeImpl(type) as SerializerAwareValue<Any?>).apply { this.value = default } as SerializerAwareValue<T>\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/data/PluginDataExtensions.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"INAPPLICABLE_JVM_NAME\", \"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\")\n\npackage net.mamoe.mirai.console.data\n\nimport net.mamoe.mirai.console.data.PluginDataExtensions.withDefault\nimport net.mamoe.mirai.console.internal.data.ShadowMap\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport kotlin.internal.LowPriorityInOverloadResolution\n\n/**\n * [PluginData] 相关一些扩展\n */\npublic object PluginDataExtensions {\n\n    @ConsoleExperimentalApi\n    public open class NotNullMap<K, V> internal constructor(\n        private val delegate: Map<K, V>\n    ) : Map<K, V> by delegate {\n        override fun get(key: K): V =\n            delegate[key] ?: error(\"Internal error: delegate[key] returned null for NotNullMap.get\")\n\n        @Deprecated(\n            \"getOrDefault on NotNullMap always returns the value in the map, and defaultValue will never be returned.\",\n            level = DeprecationLevel.WARNING,\n            replaceWith = ReplaceWith(\"this.get(key)\")\n        ) // diagnostic deprecation\n        override fun getOrDefault(key: K, defaultValue: V): V {\n            return super.getOrDefault(key, defaultValue)\n        }\n    }\n\n    @OptIn(ConsoleExperimentalApi::class)\n    @Suppress(\"DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE\") // as designed\n    public class NotNullMutableMap<K, V> internal constructor(\n        private val delegate: MutableMap<K, V>\n    ) : MutableMap<K, V> by delegate, NotNullMap<K, V>(delegate) {\n        override fun get(key: K): V =\n            delegate[key] ?: error(\"Internal error: delegate[key] returned null for NotNullMutableMap.get\")\n\n        @Deprecated(\n            \"getOrDefault on NotNullMutableMap always returns the value in the map, and defaultValue will never be returned.\",\n            level = DeprecationLevel.WARNING,\n            replaceWith = ReplaceWith(\"this.get(key)\")\n        ) // diagnostic deprecation\n        override fun getOrDefault(key: K, defaultValue: V): V {\n            return super<MutableMap>.getOrDefault(key, defaultValue)\n        }\n\n        @Deprecated(\n            \"putIfAbsent on NotNullMutableMap always does nothing.\",\n            level = DeprecationLevel.WARNING,\n            replaceWith = ReplaceWith(\"\")\n        ) // diagnostic deprecation\n        override fun putIfAbsent(key: K, value: V): Nothing? = null\n    }\n\n    /**\n     * 创建一个代理对象, 当 [Map.get] 返回 `null` 时先放入一个 [LinkedHashMap], 再从 [this] 中取出链接自动保存的 [LinkedHashMap]. ([MutableMap.getOrPut] 的替代)\n     *\n     * @see withDefault\n     */\n    @JvmName(\"withEmptyDefaultMapImmutable\")\n    @JvmStatic\n    public fun <K, InnerE, InnerV> SerializerAwareValue<MutableMap<K, Map<InnerE, InnerV>>>.withEmptyDefault(): SerializerAwareValue<NotNullMutableMap<K, Map<InnerE, InnerV>>> {\n        return this.withDefault { LinkedHashMap() }\n    }\n\n    /**\n     * 创建一个代理对象, 当 [Map.get] 返回 `null` 时先放入一个 [LinkedHashMap], 再从 [this] 中取出链接自动保存的 [LinkedHashMap]. ([MutableMap.getOrPut] 的替代)\n     * @see withDefault\n     */\n    @JvmName(\"withEmptyDefaultMap\")\n    @JvmStatic\n    public fun <K, InnerE, InnerV> SerializerAwareValue<MutableMap<K, MutableMap<InnerE, InnerV>>>.withEmptyDefault(): SerializerAwareValue<NotNullMutableMap<K, MutableMap<InnerE, InnerV>>> {\n        return this.withDefault { LinkedHashMap() }\n    }\n\n\n    /**\n     * 创建一个代理对象, 当 [Map.get] 返回 `null` 时先放入一个 [ArrayList], 再从 [this] 中取出链接自动保存的 [ArrayList].\n     * @see withDefault\n     */\n    @JvmName(\"withEmptyDefaultListImmutable\")\n    @JvmStatic\n    public fun <K, E> SerializerAwareValue<MutableMap<K, List<E>>>.withEmptyDefault(): SerializerAwareValue<NotNullMutableMap<K, List<E>>> {\n        return this.withDefault { ArrayList() }\n    }\n\n    /**\n     * 创建一个代理对象, 当 [Map.get] 返回 `null` 时先放入一个 [ArrayList], 再从 [this] 中取出链接自动保存的 [ArrayList].\n     * @see withDefault\n     */\n    @JvmName(\"withEmptyDefaultList\")\n    @JvmStatic\n    public fun <K, E> SerializerAwareValue<MutableMap<K, MutableList<E>>>.withEmptyDefault(): SerializerAwareValue<NotNullMutableMap<K, MutableList<E>>> {\n        return this.withDefault { ArrayList() }\n    }\n\n\n    /**\n     * 创建一个代理对象, 当 [Map.get] 返回 `null` 时先放入一个 [LinkedHashSet], 再从 [this] 中取出链接自动保存的 [LinkedHashSet].\n     * @see withDefault\n     */\n    @JvmName(\"withEmptyDefaultSetImmutable\")\n    @JvmStatic\n    public fun <K, E> SerializerAwareValue<MutableMap<K, Set<E>>>.withEmptyDefault(): SerializerAwareValue<NotNullMutableMap<K, Set<E>>> {\n        return this.withDefault { LinkedHashSet() }\n    }\n\n    /**\n     * 创建一个代理对象, 当 [Map.get] 返回 `null` 时先放入一个 [LinkedHashSet], 再从 [this] 中取出链接自动保存的 [LinkedHashSet].\n     * @see withDefault\n     */\n    @JvmName(\"withEmptyDefaultSet\")\n    @JvmStatic\n    public fun <K, E> SerializerAwareValue<MutableMap<K, MutableSet<E>>>.withEmptyDefault(): SerializerAwareValue<NotNullMutableMap<K, MutableSet<E>>> {\n        return this.withDefault { LinkedHashSet() }\n    }\n\n\n    /**\n     * 创建一个代理对象, 当 [Map.get] 返回 `null` 时先调用 [defaultValueComputer] 并放入 [Map], 再返回调用的返回值\n     */\n    @OptIn(ConsoleExperimentalApi::class)\n    @JvmStatic\n    @JvmName(\"withDefaultMapImmutableNotNull\")\n    public fun <K, V : Any> SerializerAwareValue<Map<K, V>>.withDefault(defaultValueComputer: (K) -> V): SerializerAwareValue<NotNullMap<K, V>> {\n        @Suppress(\"UNCHECKED_CAST\") // magic\n        return (this as SerializerAwareValue<MutableMap<K, V>>).withDefault(defaultValueComputer) as SerializerAwareValue<NotNullMap<K, V>>\n    }\n\n    /**\n     * 创建一个代理对象, 当 [Map.get] 返回 `null` 时先调用 [defaultValueComputer] 并放入 [Map], 再返回调用的返回值\n     */\n    @JvmStatic\n    @LowPriorityInOverloadResolution\n    @JvmName(\"withDefaultMapImmutable\")\n    public fun <K, V> SerializerAwareValue<Map<K, V>>.withDefault(defaultValueComputer: (K) -> V): SerializerAwareValue<Map<K, V>> {\n        @Suppress(\"UNCHECKED_CAST\") // magic\n        return (this as SerializerAwareValue<MutableMap<K, V>>).withDefault(defaultValueComputer) as SerializerAwareValue<Map<K, V>>\n    }\n\n    @OptIn(ConsoleExperimentalApi::class)\n    @JvmStatic\n    @JvmName(\"withDefaultMapNotNull\")\n    public fun <K, V : Any> SerializerAwareValue<MutableMap<K, V>>.withDefault(defaultValueComputer: (K) -> V): SerializerAwareValue<NotNullMutableMap<K, V>> {\n        val origin = this\n\n        @Suppress(\"UNCHECKED_CAST\")\n        return SerializableValue(\n            object : CompositeMapValue<K, V> {\n                private val instance = NotNullMutableMap(createDelegateInstance(origin, defaultValueComputer))\n\n                override var value: Map<K, V>\n                    get() = instance\n                    set(value) {\n                        origin.value = value as MutableMap<K, V> // erased cast\n                    }\n            } as Value<NotNullMutableMap<K, V>>, // erased cast\n            this.serializer\n        )\n    }\n\n    /**\n     * 创建一个代理对象, 当 [Map.get] 返回 `null` 时先调用 [defaultValueComputer] 并放入 [Map], 再返回调用的返回值\n     */\n    @OptIn(ConsoleExperimentalApi::class)\n    @LowPriorityInOverloadResolution\n    @JvmStatic\n    @JvmName(\"withDefaultMap\")\n    public fun <K, V> SerializerAwareValue<MutableMap<K, V>>.withDefault(defaultValueComputer: (K) -> V): SerializerAwareValue<MutableMap<K, V>> {\n        val origin = this\n\n        @Suppress(\"UNCHECKED_CAST\")\n        return SerializableValue(\n            object : CompositeMapValue<K, V> {\n                private val instance = createDelegateInstance(origin, defaultValueComputer)\n                override var value: Map<K, V>\n                    get() = instance\n                    set(value) {\n                        origin.value = value as MutableMap<K, V> // erased cast\n                    }\n            } as Value<MutableMap<K, V>>, // erased cast\n            this.serializer\n        )\n    }\n\n    private fun <K, V> createDelegateInstance(\n        origin: SerializerAwareValue<MutableMap<K, V>>,\n        defaultValueComputer: (K) -> V,\n    ): MutableMap<K, V> {\n        return object : MutableMap<K, V>, AbstractMap<K, V>() {\n            override val entries: MutableSet<MutableMap.MutableEntry<K, V>> get() = origin.value.entries\n            override val keys: MutableSet<K> get() = origin.value.keys\n            override val values: MutableCollection<V> get() = origin.value.values\n            override fun clear() = origin.value.clear()\n            override fun putAll(from: Map<out K, V>) = origin.value.putAll(from)\n            override fun remove(key: K): V? = origin.value.remove(key)\n            override fun put(key: K, value: V): V? = origin.value.put(key, value)\n\n            override fun get(key: K): V? {\n                // the only difference\n                val result = origin.value[key]\n                if (result != null) return result\n                put(key, defaultValueComputer(key))\n                return origin.value[key]\n            }\n        }\n    }\n\n\n    /**\n     * 替换 [MutableMap] 的 key\n     */\n    @OptIn(ConsoleExperimentalApi::class)\n    @JvmName(\"mapKeysNotNull\")\n    @JvmStatic\n    public fun <OldK, NewK, V : Any> SerializerAwareValue<NotNullMutableMap<OldK, V>>.mapKeys(\n        oldToNew: (OldK) -> NewK,\n        newToOld: (NewK) -> OldK,\n    ): SerializerAwareValue<NotNullMutableMap<NewK, V>> {\n        val origin = this\n\n        @Suppress(\"UNCHECKED_CAST\")\n        return SerializableValue(\n            object : CompositeMapValue<NewK, V> {\n                private val instance =\n                    NotNullMutableMap(ShadowMap({ origin.value }, oldToNew, newToOld, { it }, { it }))\n\n                override var value: Map<NewK, V>\n                    get() = instance\n                    set(value) {\n                        origin.value =\n                            value.mapKeysTo(NotNullMutableMap(LinkedHashMap())) { it.key.let(newToOld) } // erased cast\n                    }\n            } as Value<NotNullMutableMap<NewK, V>>, // erased cast\n            this.serializer\n        )\n    }\n\n    /**\n     * 替换 [MutableMap] 的 key\n     */\n    @OptIn(ConsoleExperimentalApi::class)\n    @JvmName(\"mapKeys\")\n    @JvmStatic\n    public fun <OldK, NewK, V> SerializerAwareValue<MutableMap<OldK, V>>.mapKeys(\n        oldToNew: (OldK) -> NewK,\n        newToOld: (NewK) -> OldK,\n    ): SerializerAwareValue<MutableMap<NewK, V>> {\n        val origin = this\n\n        @Suppress(\"UNCHECKED_CAST\")\n        return SerializableValue(\n            object : CompositeMapValue<NewK, V> {\n                private val instance = ShadowMap({ origin.value }, oldToNew, newToOld, { it }, { it })\n\n                override var value: Map<NewK, V>\n                    get() = instance\n                    set(value) {\n                        origin.value = value.mapKeysTo(LinkedHashMap()) { it.key.let(newToOld) } // erased cast\n                    }\n            } as Value<MutableMap<NewK, V>>, // erased cast\n            this.serializer\n        )\n    }\n\n    /**\n     * 替换 [Map] 的 key\n     */\n    @OptIn(ConsoleExperimentalApi::class)\n    @JvmName(\"mapKeysImmutable\")\n    @JvmStatic\n    public fun <OldK, NewK, V> SerializerAwareValue<Map<OldK, V>>.mapKeys(\n        oldToNew: (OldK) -> NewK,\n        newToOld: (NewK) -> OldK,\n    ): SerializerAwareValue<Map<NewK, V>> {\n        val origin = this\n\n        @Suppress(\"UNCHECKED_CAST\")\n        return SerializableValue(\n            object : CompositeMapValue<NewK, V> {\n                // casting Map to MutableMap is OK here, as we don't call mutable functions\n                private val instance =\n                    ShadowMap({ origin.value as MutableMap<OldK, V> }, oldToNew, newToOld, { it }, { it })\n\n                override var value: Map<NewK, V>\n                    get() = instance\n                    set(value) {\n                        origin.value = value.mapKeysTo(LinkedHashMap()) { it.key.let(newToOld) } // erased cast\n                    }\n            } as Value<Map<NewK, V>>, // erased cast\n            this.serializer\n        )\n    }\n\n    /**\n     * 替换 [Map] 的 key\n     */\n    @OptIn(ConsoleExperimentalApi::class)\n    @JvmName(\"mapKeysImmutableNotNull\")\n    @JvmStatic\n    public fun <OldK, NewK, V : Any> SerializerAwareValue<NotNullMap<OldK, V>>.mapKeys(\n        oldToNew: (OldK) -> NewK,\n        newToOld: (NewK) -> OldK,\n    ): SerializerAwareValue<NotNullMap<NewK, V>> {\n        val origin = this\n\n        @Suppress(\"UNCHECKED_CAST\")\n        return SerializableValue(\n            object : CompositeMapValue<NewK, V> {\n                // casting Map to MutableMap is OK here, as we don't call mutable functions\n                private val instance =\n                    NotNullMap(ShadowMap({ origin.value as MutableMap<OldK, V> }, oldToNew, newToOld, { it }, { it }))\n\n                override var value: Map<NewK, V>\n                    get() = instance\n                    set(value) {\n                        origin.value =\n                            value.mapKeysTo(NotNullMutableMap(LinkedHashMap())) { it.key.let(newToOld) } // erased cast\n                    }\n            } as Value<NotNullMap<NewK, V>>, // erased cast\n            this.serializer\n        )\n    }\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/data/PluginDataHolder.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\", \"UNCHECKED_CAST\", \"unused\")\n\npackage net.mamoe.mirai.console.data\n\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\n\n/**\n * 可以持有相关 [PluginData] 实例的对象, 作为 [PluginData] 实例的拥有者.\n *\n * @see PluginDataStorage.load\n * @see PluginDataStorage.store\n *\n * @see AutoSavePluginDataHolder 支持自动保存\n */\n@ConsoleExperimentalApi\npublic interface PluginDataHolder {\n    /**\n     * 保存时使用的分类名\n     */\n    @ConsoleExperimentalApi\n    public val dataHolderName: String\n}\n\n/*\npublic interface PluginDataHolder {\n\n    /**\n     * 创建一个 [PluginData] 实例.\n     *\n     * 注意, 此时的 [PluginData] 并没有绑定 [PluginDataStorage], 因此无法进行保存等操作.\n     *\n     * @see Companion.newPluginDataInstance\n     * @see KClass.createType\n     */\n    public fun <T : PluginData> newPluginDataInstance(type: KType): T =\n        newPluginDataInstanceUsingReflection<PluginData>(type) as T\n\n    public companion object {\n        /**\n         * 创建一个 [PluginData] 实例.\n         *\n         * @see PluginDataHolder.newPluginDataInstance\n         */\n        @JvmSynthetic\n        public inline fun <reified T : PluginData> PluginDataHolder.newPluginDataInstance(): T {\n            return this.newPluginDataInstance(typeOf0<T>())\n        }\n    }\n */\n\n/*\npublic interface AutoSavePluginDataHolder : PluginDataHolder, CoroutineScope {\n\n    /**\n     * 仅支持确切的 [PluginData] 类型\n     */\n    public override fun <T : PluginData> newPluginDataInstance(type: KType): T {\n        val classifier = type.classifier?.cast<KClass<PluginData>>()\n        require(classifier != null && classifier.java == PluginData::class.java) {\n            \"Cannot create PluginData instance. AutoSavePluginDataHolder supports only PluginData type.\"\n        }\n        return AutoSavePluginData(this, classifier) as T // T is always PluginData\n    }\n */"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/data/PluginDataStorage.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\", \"UNCHECKED_CAST\", \"unused\")\n\npackage net.mamoe.mirai.console.data\n\nimport net.mamoe.mirai.console.internal.data.MemoryPluginDataStorageImpl\nimport net.mamoe.mirai.console.internal.data.MultiFilePluginDataStorageImpl\nimport net.mamoe.mirai.console.plugin.jvm.JvmPlugin\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport java.io.File\nimport java.nio.file.Path\n\n/**\n * [数据对象][PluginData] 存储仓库.\n *\n * ## 职责\n * [PluginDataStorage] 类似于一个数据库, 它只承担将序列化之后的数据保存到数据库中, 和从数据库取出这个对象的任务.\n *\n *\n * 此为较低层的 API, 一般插件开发者不会接触.\n *\n * [JvmPluginLoader] 实现一个 [PluginDataStorage], 用于管理所有 [JvmPlugin] 的 [PluginData] 实例.\n *\n * ### 实现 [PluginDataStorage]\n * 无特殊需求. 实现两个成员函数即可. 可参考内建 [MultiFilePluginDataStorageImpl]\n *\n * @see PluginDataHolder\n * @see JvmPluginLoader.dataStorage\n */\n@ConsoleExperimentalApi\npublic interface PluginDataStorage {\n    /**\n     * 读取一个实例. 并为 [instance] [设置 [PluginDataStorage]][PluginData.onInit]\n     */\n    @ConsoleExperimentalApi\n    public fun load(holder: PluginDataHolder, instance: PluginData)\n\n    /**\n     * 保存一个实例.\n     *\n     * **实现细节**: 调用 [PluginData.updaterSerializer]\n     */\n    @ConsoleExperimentalApi\n    public fun store(holder: PluginDataHolder, instance: PluginData)\n\n    /*\npublic companion object {\n   /**\n    * 通过反射\n    * 读取一个实例.\n    *\n    * 在 [T] 实例创建后 [设置 [PluginDataStorage]][PluginData.setStorage]\n    */\n   @ConsoleExperimentalAPI\n   @JvmStatic\n   public fun <T : PluginData> PluginDataStorage.load(holder: PluginDataHolder, dataClass: KClass<T>): T {\n       @Suppress(\"UNCHECKED_CAST\")\n       val instance = with(dataClass){\n           objectInstance\n               ?: createInstanceOrNull()\n               ?: throw IllegalArgumentException(\n                   \"Cannot create PluginData instance. Make sure dataClass is PluginData::class.java or a Kotlin's object, \" +\n                           \"or has a constructor which either has no parameters or all parameters of which are optional\"\n               )\n       }\n\n       load(holder, instance)\n       return instance\n   }\n\n   /**\n    * 读取一个实例. 在 [T] 实例创建后 [设置 [PluginDataStorage]][PluginData.setStorage]\n    */\n   @JvmStatic\n   public fun <T : PluginData> PluginDataStorage.load(holder: PluginDataHolder, dataClass: Class<T>): T =\n       this.load(holder, dataClass.java)\n\n   /**\n    * 读取一个实例. 在 [T] 实例创建后 [设置 [PluginDataStorage]][PluginData.setStorage]\n    */\n   @JvmSynthetic\n   public inline fun <reified T : PluginData> PluginDataStorage.load(holder: PluginDataHolder): T =\n       this.load(holder, T::class)\n\n    }\n    */\n}\n\n/**\n * 在内存存储所有 [PluginData] 实例的 [PluginDataStorage]. 在内存数据丢失后相关 [PluginData] 实例也会丢失.\n * @see PluginDataStorage\n */\n@ConsoleExperimentalApi\npublic interface MemoryPluginDataStorage : PluginDataStorage {\n    public companion object {\n        /**\n         * 创建一个 [MemoryPluginDataStorage] 实例.\n         */\n        @JvmStatic\n        @JvmName(\"create\")\n        // @JvmOverloads\n        public operator fun invoke(): MemoryPluginDataStorage = MemoryPluginDataStorageImpl()\n    }\n}\n\n/**\n * 用多个文件存储 [PluginData] 实例的 [PluginDataStorage].\n */\n@ConsoleExperimentalApi\npublic interface MultiFilePluginDataStorage : PluginDataStorage {\n    /**\n     * 存放 [PluginData] 的目录.\n     */\n    public val directoryPath: Path\n\n    public companion object {\n        /**\n         * 创建一个 [MultiFilePluginDataStorage] 实例.\n         *\n         * @see directory 存放 [PluginData] 的目录.\n         */\n        @JvmStatic\n        @JvmName(\"create\")\n        public operator fun invoke(directory: Path): MultiFilePluginDataStorage =\n            MultiFilePluginDataStorageImpl(directory)\n    }\n}\n\n@ConsoleExperimentalApi\n@get:JvmSynthetic\npublic inline val MultiFilePluginDataStorage.directory: File\n    get() = this.directoryPath.toFile()"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/data/ReadOnlyPluginConfig.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.data\n\n/**\n * 只读的 [PluginConfig]. 插件只能读取其值, 但值可能在后台被前端 (用户) 修改.\n *\n * @see PluginConfig\n * @see AutoSavePluginData\n * @since 1.1\n */\npublic open class ReadOnlyPluginConfig public constructor(saveName: String) : ReadOnlyPluginData(saveName), PluginConfig"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/data/ReadOnlyPluginData.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.data\n\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.utils.error\n\n/**\n * 只读的 [PluginData]. 插件只能读取其值, 但值可能在后台被前端 (用户) 修改.\n *\n * @see PluginData\n * @see AutoSavePluginData\n * @since 1.1\n */\npublic open class ReadOnlyPluginData private constructor(\n    // KEEP THIS PRIMARY CONSTRUCTOR FOR FUTURE USE: WE'LL SUPPORT SERIALIZERS_MODULE FOR POLYMORPHISM\n    @Suppress(\"UNUSED_PARAMETER\") primaryConstructorMark: Any?,\n) : AbstractPluginData() {\n    @ConsoleExperimentalApi\n    public final override val saveName: String\n        get() = _saveName\n\n    private lateinit var _saveName: String\n\n    public constructor(saveName: String) : this(null) {\n        _saveName = saveName\n    }\n\n    @ConsoleExperimentalApi\n    override fun onInit(owner: PluginDataHolder, storage: PluginDataStorage) {\n    }\n\n    @ConsoleExperimentalApi\n    public final override fun onValueChanged(value: Value<*>) {\n        debuggingLogger1.error { \"onValueChanged: $value\" }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/data/Value.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\", \"unused\", \"NOTHING_TO_INLINE\", \"INAPPLICABLE_JVM_NAME\")\n\npackage net.mamoe.mirai.console.data\n\nimport kotlinx.serialization.BinaryFormat\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.StringFormat\nimport net.mamoe.mirai.console.internal.data.map\nimport net.mamoe.mirai.console.internal.data.setValueBySerializer\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport kotlin.properties.ReadWriteProperty\nimport kotlin.reflect.KProperty\n\n/**\n * 表示一个值代理.\n *\n * [Value.value] 可以像 Kotlin 的 `var` 一样被修改, 然而它也可能被用户修改, 如通过 UI 前端, 或通过自动重载.\n *\n * 一些常用的基础类型实现由代码生成创建特性的优化.\n *\n * @see PluginData 容纳 [Value] 的数据对象\n *\n * @see PrimitiveValue 基础数据类型实现\n * @see CompositeValue 复合数据类型实现\n */\npublic interface Value<T> : ReadWriteProperty<Any?, T> {\n    @get:JvmName(\"get\")\n    @set:JvmName(\"set\")\n    public var value: T\n\n    @JvmSynthetic // avoid ambiguity with property `value`\n    public override operator fun getValue(thisRef: Any?, property: KProperty<*>): T = value\n\n    @JvmSynthetic\n    public override operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {\n        this.value = value\n    }\n}\n\n/**\n * 可被序列化的 [Value].\n */\npublic class SerializableValue<T>(\n    @JvmField internal val delegate: Value<T>,\n    /**\n     * 用于更新和保存 [delegate] 的序列化器\n     */\n    public override val serializer: KSerializer<Unit>\n) : Value<T> by delegate, SerializerAwareValue<T> {\n    public override fun toString(): String = delegate.toString()\n\n    public override fun equals(other: Any?): Boolean {\n        if (other === this) return true\n        if (other?.javaClass != this.javaClass) return false\n\n        @Suppress(\"UNCHECKED_CAST\")\n        other as SerializableValue<T>\n        if (other.delegate != this.delegate) return false\n        // if (other.serializer != this.serializer) return false\n        // TODO: 2020/9/9 serializers should be checked here, but it will cause incomparable issue when putting a SerializableValue as a Key\n        return true\n    }\n\n    override fun hashCode(): Int {\n        @Suppress(\"UnnecessaryVariable\", \"CanBeVal\")\n        var result = delegate.hashCode()\n        // result = 31 * result + serializer.hashCode()\n        // TODO: 2020/9/9 serializers should be checked here, but it will cause incomparable issue when putting a SerializableValue as a Key\n        return result\n    }\n\n    public companion object {\n        @JvmStatic\n        @JvmName(\"create\")\n        public fun <T> Value<T>.serializableValueWith(\n            serializer: KSerializer<T>\n        ): SerializableValue<T> {\n            return SerializableValue(\n                this,\n                serializer.map(serializer = {\n                    this.value\n                }, deserializer = { this.setValueBySerializer(it) })\n            )\n        }\n    }\n}\n\n/**\n * 带有显式 [序列化器][serializer] 的 [Value].\n *\n * @see SerializableValue 简单实现\n * @see PluginData.value 创建一个这样的 [SerializerAwareValue]\n */\npublic interface SerializerAwareValue<T> : Value<T> {\n    /**\n     * 用于更新 [value] 的序列化器. 在反序列化时不会创建新的 [T] 对象实例.\n     *\n     * - 序列化: `val text: String = Yaml.default.encodeToString(serializer, Unit)`\n     * - 反序列化 (本质上是更新 [value], 不创建新的 [T] 实例): `Yaml.default.decodeFromString(serializer, text)`\n     */\n    public val serializer: KSerializer<Unit>\n\n    public companion object {\n        /**\n         * 使用 [指定格式格式][format] 序列化一个 [SerializerAwareValue]\n         */\n        @JvmStatic\n        public fun <T> SerializerAwareValue<T>.serialize(format: StringFormat): String {\n            return format.encodeToString(this.serializer, Unit)\n        }\n\n        /**\n         * 使用 [指定格式格式][format] 序列化一个 [SerializerAwareValue]\n         */\n        @JvmStatic\n        public fun <T> SerializerAwareValue<T>.serialize(format: BinaryFormat): ByteArray {\n            return format.encodeToByteArray(this.serializer, Unit)\n        }\n\n        /**\n         * 使用 [指定格式格式][format] 反序列化 (更新) 一个 [SerializerAwareValue]\n         */\n        @JvmStatic\n        public fun <T> SerializerAwareValue<T>.deserialize(format: StringFormat, string: String) {\n            format.decodeFromString(this.serializer, string)\n        }\n\n        /**\n         * 使用 [指定格式格式][format] 反序列化 (更新) 一个 [SerializerAwareValue]\n         */\n        @JvmStatic\n        public fun <T> SerializerAwareValue<T>.deserialize(format: BinaryFormat, bytes: ByteArray) {\n            format.decodeFromByteArray(this.serializer, bytes)\n        }\n    }\n}\n\n/**\n * 基础数据类型 [Value]\n *\n * 9 个被认为是 *基础类型* 的类型:\n * - 整数: [Byte], [Short], [Int], [Long]\n * - 浮点: [Float], [Double]\n * - [Boolean]\n * - [Char], [String]\n *\n * 注意: 目前这些类型都会被装箱, 由于泛型 T. 在将来可能会有优化处理.\n * *Primitive* 仅表示一个类型是上面 9 种类型之一.\n */\n@ConsoleExperimentalApi\npublic interface PrimitiveValue<T> : Value<T>\n\n\n//// region PrimitiveValues CODEGEN ////\n\n/**\n * 表示一个不可空 [Byte] [Value].\n */\n@ConsoleExperimentalApi\npublic interface ByteValue : PrimitiveValue<Byte>\n\n/**\n * 表示一个不可空 [Short] [Value].\n */\n@ConsoleExperimentalApi\npublic interface ShortValue : PrimitiveValue<Short>\n\n/**\n * 表示一个不可空 [Int] [Value].\n */\n@ConsoleExperimentalApi\npublic interface IntValue : PrimitiveValue<Int>\n\n/**\n * 表示一个不可空 [Long] [Value].\n */\n@ConsoleExperimentalApi\npublic interface LongValue : PrimitiveValue<Long>\n\n/**\n * 表示一个不可空 [Float] [Value].\n */\n@ConsoleExperimentalApi\npublic interface FloatValue : PrimitiveValue<Float>\n\n/**\n * 表示一个不可空 [Double] [Value].\n */\n@ConsoleExperimentalApi\npublic interface DoubleValue : PrimitiveValue<Double>\n\n/**\n * 表示一个不可空 [Char] [Value].\n */\n@ConsoleExperimentalApi\npublic interface CharValue : PrimitiveValue<Char>\n\n/**\n * 表示一个不可空 [Boolean] [Value].\n */\n@ConsoleExperimentalApi\npublic interface BooleanValue : PrimitiveValue<Boolean>\n\n/**\n * 表示一个不可空 [String] [Value].\n */\n@ConsoleExperimentalApi\npublic interface StringValue : PrimitiveValue<String>\n\n//// endregion PrimitiveValues CODEGEN ////\n\n\n/**\n * 复合数据类型实现\n */\n@ConsoleExperimentalApi\npublic interface CompositeValue<T> : Value<T>\n\n\n/**\n * @see [CompositeListValue]\n * @see [PrimitiveListValue]\n */\n@OptIn(ConsoleExperimentalApi::class)\npublic interface ListValue<E> : CompositeValue<List<E>>\n\n/**\n * 复合数据类型的 [List]\n *\n * @param E 不是基础数据类型\n */\n@ConsoleExperimentalApi\npublic interface CompositeListValue<E> : ListValue<E>\n\n/**\n * 针对基础类型优化的 [List]\n *\n * @param E 是基础类型\n */\n@ConsoleExperimentalApi\npublic interface PrimitiveListValue<E> : ListValue<E>\n\n\n//// region PrimitiveListValue CODEGEN ////\n\n@ConsoleExperimentalApi\npublic interface PrimitiveIntListValue : PrimitiveListValue<Int>\n\n@ConsoleExperimentalApi\npublic interface PrimitiveLongListValue : PrimitiveListValue<Long>\n// TODO + codegen\n\n//// endregion PrimitiveListValue CODEGEN ////\n\n\n/**\n * @see [CompositeSetValue]\n * @see [PrimitiveSetValue]\n */\n@ConsoleExperimentalApi\npublic interface SetValue<E> : CompositeValue<Set<E>>\n\n/**\n * 复合数据类型 [Set]\n * @param E 是基础数据类型\n */\n@ConsoleExperimentalApi\npublic interface CompositeSetValue<E> : SetValue<E>\n\n/**\n * 基础数据类型 [Set]\n * @param E 是基础数据类型\n */\n@ConsoleExperimentalApi\npublic interface PrimitiveSetValue<E> : SetValue<E>\n\n\n//// region PrimitiveSetValue CODEGEN ////\n\n@ConsoleExperimentalApi\npublic interface PrimitiveIntSetValue : PrimitiveSetValue<Int>\n\n@ConsoleExperimentalApi\npublic interface PrimitiveLongSetValue : PrimitiveSetValue<Long>\n// TODO + codegen\n\n//// endregion PrimitiveSetValue CODEGEN ////\n\n\n/**\n * @see [CompositeMapValue]\n * @see [PrimitiveMapValue]\n */\n@ConsoleExperimentalApi\npublic interface MapValue<K, V> : CompositeValue<Map<K, V>>\n\n@ConsoleExperimentalApi\npublic interface CompositeMapValue<K, V> : MapValue<K, V>\n\n@ConsoleExperimentalApi\npublic interface PrimitiveMapValue<K, V> : MapValue<K, V>\n\n\n//// region PrimitiveMapValue CODEGEN ////\n\n@ConsoleExperimentalApi\npublic interface PrimitiveIntIntMapValue : PrimitiveMapValue<Int, Int>\n\n@ConsoleExperimentalApi\npublic interface PrimitiveIntLongMapValue : PrimitiveMapValue<Int, Long>\n// TODO + codegen\n\n//// endregion PrimitiveSetValue CODEGEN ////\n\n\n@ConsoleExperimentalApi\npublic interface ReferenceValue<T> : Value<T>"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/data/ValueDescription.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.data\n\nimport kotlinx.serialization.SerialInfo\n\n/**\n * 序列化之后的注释.\n *\n * 例:\n * ```\n * object AccountPluginData : PluginData by ... {\n *    @ValueDescription(\"\"\"\n *        一个 map\n *    \"\"\")\n *    val map: Map<String, String> by value(\"a\" to \"b\")\n * }\n * ```\n *\n * 将被保存为配置 (YAML 作为示例):\n * ```yaml\n * AccountPluginData:\n *   # 一个 map\n *   map:\n *     a: b\n * ```\n *\n * @see net.mamoe.yamlkt.Comment\n */\n@SerialInfo\n@Target(AnnotationTarget.PROPERTY, AnnotationTarget.CLASS)\n@Retention(AnnotationRetention.RUNTIME)\npublic annotation class ValueDescription(\n    /**\n     * 将会被 [String.trimIndent] 处理\n     */\n    val value: String,\n)"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/data/ValueName.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.data\n\n/**\n * 序列化之后的名称.\n *\n * 例:\n * ```\n * object AccountPluginData : AutoSavePluginData() {\n *    @ValueName(\"info\")\n *    val map: Map<String, String> by value(\"a\" to \"b\")\n * }\n * ```\n *\n * 将被保存为配置 (YAML 作为示例):\n * ```yaml\n * AccountPluginData:\n *   info:\n *     a: b\n * ```\n *\n * @see PluginData\n * @see Value\n */\n@Target(AnnotationTarget.PROPERTY, AnnotationTarget.CLASS)\n@Retention(AnnotationRetention.RUNTIME)\npublic annotation class ValueName(val value: String)\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/data/java/JAutoSavePluginConfig.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"EXPOSED_SUPER_CLASS\")\n\npackage net.mamoe.mirai.console.data.java\n\nimport net.mamoe.mirai.console.data.AutoSavePluginConfig\nimport net.mamoe.mirai.console.data.PluginConfig\nimport net.mamoe.mirai.console.data.PluginData\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\n\n/**\n * 一个插件的配置数据, 用于和用户交互.\n *\n * 用户可通过 mirai-console 前端 (如在 Android 中可视化实现) 修改这些配置, 修改会自动写入这个对象中.\n *\n * **提示**:\n * 插件内部的数据应用 [PluginData] 存储, 而不能使用 [PluginConfig].\n *\n * ### 实现\n *\n * 在 [JAutoSavePluginData] 的示例基础上, 修改类定义\n * ```java\n * // 原\n * public class AccountPluginData extends JAutoSavePluginData {\n * // 修改为\n * public class AccountPluginConfig extends JAutoSavePluginConfig {\n * ```\n * 即可将一个 [PluginData] 变更为 [PluginConfig].\n *\n * @see JAutoSavePluginData\n * @see PluginConfig\n */\n@Deprecated(\n    \"请使用 JavaAutoSavePluginConfig\",\n    replaceWith = ReplaceWith(\"JavaAutoSavePluginConfig\", \"net.mamoe.mirai.console.data.java.JavaAutoSavePluginConfig\"),\n    level = DeprecationLevel.HIDDEN\n)\n@DeprecatedSinceMirai(warningSince = \"2.11\", errorSince = \"2.13\", hiddenSince = \"2.14\")\npublic abstract class JAutoSavePluginConfig public constructor(saveName: String) : AutoSavePluginConfig(saveName),\n    PluginConfig"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/data/java/JAutoSavePluginData.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"EXPOSED_SUPER_CLASS\")\n\npackage net.mamoe.mirai.console.data.java\n\nimport net.mamoe.mirai.console.data.*\nimport net.mamoe.mirai.console.internal.data.cast\nimport net.mamoe.mirai.console.internal.data.setValueBySerializer\nimport net.mamoe.mirai.console.internal.data.valueImpl\nimport net.mamoe.mirai.console.plugin.jvm.JvmPlugin\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport java.util.concurrent.ConcurrentHashMap\nimport java.util.concurrent.ConcurrentMap\nimport kotlin.reflect.KClass\nimport kotlin.reflect.KType\nimport kotlin.reflect.KTypeProjection\nimport kotlin.reflect.KVariance\nimport kotlin.reflect.full.createType\n\n/**\n * 供 Java 用户使用的 [PluginData]. 参考 [PluginData] 以获取更多信息.\n *\n * 在 [JvmPlugin] 的典型实现方式:\n * ```\n * // PluginMain.java\n * public final class PluginMain extends JavaPlugin {\n *     public static PluginMain INSTANCE;\n *     public PluginMain() {\n *          INSTANCE = this;\n *     }\n *     @Override\n *     public onLoad() {\n *          this.reloadPluginData(MyPluginData.INSTANCE); // 读取文件等\n *     }\n * }\n *\n * // MyPluginData.java\n * public class MyPluginData extends JAutoSavePluginData {\n *     public static final MyPluginData INSTANCE = new MyPluginData();\n *\n *     public final Value<String> string = value(\"test\"); // 默认值 \"test\"\n *\n *     public final Value<List<String>> list = typedValue(createKType(List.class, createKType(String.class))); // 无默认值, 自动创建空 List\n *\n *     public final Value<Map<Long, Object>> custom = typedValue(\n *             createKType(Map.class, createKType(Long.class), createKType(Object.class)),\n *             new HashMap<Long, Object>() {{ // 带默认值\n *                 put(123L, \"ok\");\n *             }}\n *     );\n * }\n * ```\n *\n * 使用时, 需要使用 `.get()`, 如:\n * ```\n * Value<List<String>> theList = MyPluginData.INSTANCE.list; // 获取 Value 实例. Value 代表一个追踪自动保存的值.\n * List<String> actualList = theList.get();\n * theList.set();\n * ```\n *\n * **注意**: 由于实现特殊, 请不要在初始化 Value 时就使用 `.get()`. 这可能会导致自动保存追踪失效. 必须在使用时才调用 `.get()` 获取真实数据对象.\n *\n * @see PluginData\n */\n@Deprecated(\n    \"请使用 JavaAutoSavePluginData\",\n    replaceWith = ReplaceWith(\"JavaAutoSavePluginData\", \"net.mamoe.mirai.console.data.java.JavaAutoSavePluginData\"),\n    level = DeprecationLevel.HIDDEN\n)\n@DeprecatedSinceMirai(warningSince = \"2.11\", errorSince = \"2.13\", hiddenSince = \"2.14\")\npublic abstract class JAutoSavePluginData public constructor(saveName: String) : AutoSavePluginData(saveName),\n    PluginConfig {\n\n    //// region JAutoSavePluginData_value_primitives CODEGEN ////\n\n    /**\n     * 创建一个 [Byte] 类型的 [Value], 并设置初始值为 [default]\n     */\n    public fun value(default: Byte): SerializerAwareValue<Byte> = valueImpl(default)\n\n    /**\n     * 创建一个 [Short] 类型的 [Value], 并设置初始值为 [default]\n     */\n    public fun value(default: Short): SerializerAwareValue<Short> = valueImpl(default)\n\n    /**\n     * 创建一个 [Int] 类型的 [Value], 并设置初始值为 [default]\n     */\n    public fun value(default: Int): SerializerAwareValue<Int> = valueImpl(default)\n\n    /**\n     * 创建一个 [Long] 类型的 [Value], 并设置初始值为 [default]\n     */\n    public fun value(default: Long): SerializerAwareValue<Long> = valueImpl(default)\n\n    /**\n     * 创建一个 [Float] 类型的 [Value], 并设置初始值为 [default]\n     */\n    public fun value(default: Float): SerializerAwareValue<Float> = valueImpl(default)\n\n    /**\n     * 创建一个 [Double] 类型的 [Value], 并设置初始值为 [default]\n     */\n    public fun value(default: Double): SerializerAwareValue<Double> = valueImpl(default)\n\n    /**\n     * 创建一个 [Char] 类型的 [Value], 并设置初始值为 [default]\n     */\n    public fun value(default: Char): SerializerAwareValue<Char> = valueImpl(default)\n\n    /**\n     * 创建一个 [Boolean] 类型的 [Value], 并设置初始值为 [default]\n     */\n    public fun value(default: Boolean): SerializerAwareValue<Boolean> = valueImpl(default)\n\n    /**\n     * 创建一个 [String] 类型的 [Value], 并设置初始值为 [default]\n     */\n    public fun value(default: String): SerializerAwareValue<String> = valueImpl(default)\n\n    //// endregion JAutoSavePluginData_value_primitives CODEGEN ////\n\n    /**\n     * 构造一个支持泛型的 [Value].\n     *\n     * 对于 [Map], [Set], [List], [ConcurrentMap] 等标准库类型, 这个函数会尝试构造 [LinkedHashMap], [LinkedHashSet], [ArrayList], [ConcurrentHashMap] 等相关类型.\n     * 而对于自定义数据类型, 本函数只会反射获取 [objectInstance][KClass.objectInstance] 或使用*无参构造器*构造实例.\n     *\n     * @param type Kotlin 类型. 可通过 [createKType] 获得\n     *\n     * @param T 类型 T. 仅支持:\n     * - 基础数据类型, [String]\n     * - 标准库集合类型 ([List], [Map], [Set], [ConcurrentMap])\n     * - 标准库数据类型 ([Map.Entry], [Pair], [Triple])\n     * - 使用 [kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization) 的 [Serializable] 标记的 **Kotlin** 类\n     */\n    @JvmOverloads\n    public fun <T : Any> typedValue(type: KType, default: T? = null): SerializerAwareValue<T> {\n        val value = valueImpl<T>(type, type.classifier!!.cast())\n        if (default != null) value.setValueBySerializer(default)\n        return value\n    }\n\n    public companion object {\n        /**\n         * 根据 [Class] 及泛型参数获得一个类型\n         *\n         * 如要获得一个 `Map<String, Long>` 的类型,\n         * ```java\n         * KType type = JPluginDataHelper.createKType(Map.java, createKType(String.java), createKType(Long.java))\n         * ```\n         *\n         * @param genericArguments 带有顺序的泛型参数\n         */\n        @JvmStatic\n        public fun <T : Any> createKType(clazz: Class<T>, nullable: Boolean, vararg genericArguments: KType): KType {\n            return clazz.kotlin.createType(genericArguments.map { KTypeProjection(KVariance.INVARIANT, it) }, nullable)\n        }\n\n        /**\n         * 根据 [Class] 及泛型参数获得一个不可为 `null` 的类型\n         *\n         * @see createKType\n         */\n        @JvmStatic\n        public fun <T : Any> createKType(clazz: Class<T>, vararg genericArguments: KType): KType {\n            return createKType(clazz, false, *genericArguments)\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/data/java/JavaAutoSavePluginConfig.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"EXPOSED_SUPER_CLASS\")\n\npackage net.mamoe.mirai.console.data.java\n\nimport net.mamoe.mirai.console.data.PluginConfig\nimport net.mamoe.mirai.console.data.PluginData\nimport net.mamoe.mirai.console.util.JavaFriendlyApi\n\n/**\n * 一个插件的配置数据, 用于和用户交互.\n *\n * 用户可通过 mirai-console 前端 (如在 Android 中可视化实现) 修改这些配置, 修改会自动写入这个对象中.\n *\n * **提示**:\n * 插件内部的数据应用 [PluginData] 存储, 而不能使用 [PluginConfig].\n *\n * ### 实现\n *\n * 在 [JavaAutoSavePluginData] 的示例基础上, 修改类定义\n * ```java\n * // 原\n * public class AccountPluginData extends JavaAutoSavePluginData {\n * // 修改为\n * public class AccountPluginConfig extends JavaAutoSavePluginConfig {\n * ```\n * 即可将一个 [PluginData] 变更为 [PluginConfig].\n *\n * @see JavaAutoSavePluginData\n * @see PluginConfig\n *\n * @since 2.11\n */\n@JavaFriendlyApi\npublic abstract class JavaAutoSavePluginConfig public constructor(saveName: String) :\n    JavaAutoSavePluginData(saveName),\n    PluginConfig"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/data/java/JavaAutoSavePluginData.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"EXPOSED_SUPER_CLASS\")\n@file:OptIn(ConsoleExperimentalApi::class)\n\npackage net.mamoe.mirai.console.data.java\n\nimport net.mamoe.mirai.console.data.*\nimport net.mamoe.mirai.console.internal.data.cast\nimport net.mamoe.mirai.console.internal.data.setValueBySerializer\nimport net.mamoe.mirai.console.internal.data.valueImpl\nimport net.mamoe.mirai.console.plugin.jvm.JvmPlugin\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.console.util.JavaFriendlyApi\nimport java.util.concurrent.ConcurrentHashMap\nimport java.util.concurrent.ConcurrentMap\nimport kotlin.reflect.KClass\nimport kotlin.reflect.KType\nimport kotlin.reflect.KTypeProjection\nimport kotlin.reflect.KVariance\nimport kotlin.reflect.full.createType\n\n/**\n * 供 Java 用户使用的 [PluginData]. 参考 [PluginData] 以获取更多信息.\n *\n * 仍然更推荐在项目中混用 Java 和 Kotlin, 使用 Kotlin 编写 [PluginData].\n * 也可以使用其他持久化库替代 [PluginData].\n *\n * 在 [JvmPlugin] 的典型实现方式:\n * ```\n * // PluginMain.java\n * public final class PluginMain extends JavaPlugin {\n *     public static PluginMain INSTANCE;\n *     public PluginMain() {\n *          INSTANCE = this;\n *     }\n *     @Override\n *     public onLoad() {\n *          this.reloadPluginData(MyPluginData.INSTANCE); // 读取文件等\n *     }\n * }\n *\n * // MyPluginData.java\n * public class MyPluginData extends JavaAutoSavePluginData {\n *     public static final MyPluginData INSTANCE = new MyPluginData();\n *\n *     public final Value<String> string = value(\"test\"); // 默认值 \"test\"\n *\n *     public final Value<List<String>> list = typedValue(createKType(List.class, createKType(String.class))); // 无默认值, 自动创建空 List\n *\n *     public final Value<Map<Long, Object>> custom = typedValue(\n *             createKType(Map.class, createKType(Long.class), createKType(Object.class)),\n *             new HashMap<Long, Object>() {{ // 带默认值\n *                 put(123L, \"ok\");\n *             }}\n *     );\n * }\n * ```\n *\n * 使用时, 需要使用 `.get()`, 如:\n * ```\n * Value<List<String>> theList = MyPluginData.INSTANCE.list; // 获取 Value 实例. Value 代表一个追踪自动保存的值.\n * List<String> actualList = theList.get();\n * theList.set();\n * ```\n *\n * **注意**: 由于实现特殊, 请不要在初始化 Value 时就使用 `.get()`. 这可能会导致自动保存追踪失效. 必须在使用时才调用 `.get()` 获取真实数据对象.\n *\n * @see PluginData\n * @since 2.11\n */\n@JavaFriendlyApi\npublic abstract class JavaAutoSavePluginData public constructor(saveName: String) : AutoSavePluginData(saveName),\n    PluginConfig {\n\n    //// region JavaAutoSavePluginData_value_primitives CODEGEN ////\n\n    /**\n     * 创建一个名称为 [name], 类型为 [Byte] 的 [Value], 并设置初始值为 [default].\n     */\n    public fun value(name: String, default: Byte): SerializerAwareValue<Byte> =\n        valueImpl(default).apply { track(this, name, emptyList()) }\n\n    /**\n     * 创建一个名称为 [name], 类型为 [Short] 的 [Value], 并设置初始值为 [default].\n     */\n    public fun value(name: String, default: Short): SerializerAwareValue<Short> =\n        valueImpl(default).apply { track(this, name, emptyList()) }\n\n    /**\n     * 创建一个名称为 [name], 类型为 [Int] 的 [Value], 并设置初始值为 [default].\n     */\n    public fun value(name: String, default: Int): SerializerAwareValue<Int> =\n        valueImpl(default).apply { track(this, name, emptyList()) }\n\n    /**\n     * 创建一个名称为 [name], 类型为 [Long] 的 [Value], 并设置初始值为 [default].\n     */\n    public fun value(name: String, default: Long): SerializerAwareValue<Long> =\n        valueImpl(default).apply { track(this, name, emptyList()) }\n\n    /**\n     * 创建一个名称为 [name], 类型为 [Float] 的 [Value], 并设置初始值为 [default].\n     */\n    public fun value(name: String, default: Float): SerializerAwareValue<Float> =\n        valueImpl(default).apply { track(this, name, emptyList()) }\n\n    /**\n     * 创建一个名称为 [name], 类型为 [Double] 的 [Value], 并设置初始值为 [default].\n     */\n    public fun value(name: String, default: Double): SerializerAwareValue<Double> =\n        valueImpl(default).apply { track(this, name, emptyList()) }\n\n    /**\n     * 创建一个名称为 [name], 类型为 [Char] 的 [Value], 并设置初始值为 [default].\n     */\n    public fun value(name: String, default: Char): SerializerAwareValue<Char> =\n        valueImpl(default).apply { track(this, name, emptyList()) }\n\n    /**\n     * 创建一个名称为 [name], 类型为 [Boolean] 的 [Value], 并设置初始值为 [default].\n     */\n    public fun value(name: String, default: Boolean): SerializerAwareValue<Boolean> =\n        valueImpl(default).apply { track(this, name, emptyList()) }\n\n    /**\n     * 创建一个名称为 [name], 类型为 [String] 的 [Value], 并设置初始值为 [default].\n     */\n    public fun value(name: String, default: String): SerializerAwareValue<String> =\n        valueImpl(default).apply { track(this, name, emptyList()) }\n\n    //// endregion JavaAutoSavePluginData_value_primitives CODEGEN ////\n\n    /**\n     * 创建一个支持泛型的 [Value].\n     *\n     * 对于 [Map], [Set], [List], [ConcurrentMap] 等标准库类型, 这个函数会尝试构造 [LinkedHashMap], [LinkedHashSet], [ArrayList], [ConcurrentHashMap] 等相关类型.\n     * 而对于自定义数据类型, 本函数只会反射获取 [objectInstance][KClass.objectInstance] 或使用*无参构造器*构造实例.\n     *\n     * @param type Kotlin 类型. 可通过 [createKType] 获得\n     *\n     * @param T 类型 T. 仅支持:\n     * - 基础数据类型, [String]\n     * - 标准库集合类型 ([List], [Map], [Set], [ConcurrentMap])\n     * - 标准库数据类型 ([Map.Entry], [Pair], [Triple])\n     * - 使用 [kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization) 的 [Serializable] 标记的 **Kotlin** 类\n     */\n    @JvmOverloads\n    public fun <T : Any> typedValue(name: String, type: KType, default: T? = null): SerializerAwareValue<T> {\n        val value = valueImpl<T>(type, type.classifier!!.cast())\n        if (default != null) value.setValueBySerializer(default)\n        track(value, name, emptyList())\n        return value\n    }\n\n    /**\n     * @since 2.11\n     */\n    @JavaFriendlyApi\n    public companion object {\n        /**\n         * 根据 [Class] 及泛型参数获得一个类型\n         *\n         * 如要获得一个 `Map<String, Long>` 的类型,\n         * ```java\n         * KType type = JPluginDataHelper.createKType(Map.java, createKType(String.java), createKType(Long.java))\n         * ```\n         *\n         * @param genericArguments 带有顺序的泛型参数\n         */\n        @JvmStatic\n        public fun <T : Any> createKType(clazz: Class<T>, nullable: Boolean, vararg genericArguments: KType): KType {\n            return clazz.kotlin.createType(genericArguments.map { KTypeProjection(KVariance.INVARIANT, it) }, nullable)\n        }\n\n        /**\n         * 根据 [Class] 及泛型参数获得一个不可为 `null` 的类型\n         *\n         * @see createKType\n         */\n        @JvmStatic\n        public fun <T : Any> createKType(clazz: Class<T>, vararg genericArguments: KType): KType {\n            return createKType(clazz, false, *genericArguments)\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/enduserreadme/EndUserReadme.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.enduserreadme\n\nimport java.util.*\n\n/**\n * 最终用户须知\n *\n * @since 2.16.0\n */\npublic class EndUserReadme {\n    public companion object {\n        public const val PAUSE: String = \"<pause>\"\n        public const val DELAY: String = \"<delay>\"\n    }\n\n    internal val pages: MutableMap<String, String> = linkedMapOf()\n\n    public class Render {\n        private val msgs = mutableListOf<String>()\n\n        @KeepDetermination\n        public operator fun String.unaryPlus() {\n            msg(this)\n        }\n\n        @KeepDetermination\n        public operator fun plusAssign(s: String) {\n            msg(s)\n        }\n\n        @KeepDetermination\n        public fun pause() {\n            msg(PAUSE)\n        }\n\n        @KeepDetermination\n        public fun delay() {\n            msg(DELAY)\n        }\n\n        /**\n         * 延迟一段时间\n         *\n         * @param time 单位：秒\n         */\n        @KeepDetermination\n        public fun delay(time: Int) {\n            msg(DELAY + time)\n        }\n\n        @KeepDetermination\n        public fun msg(message: String) {\n            msgs.add(message)\n        }\n\n        public fun render(): String = msgs.joinToString(separator = \"\\n\")\n    }\n\n    @KeepDetermination\n    public fun put(category: String, render: Render.() -> Unit) {\n        pages[category] = Render().also(render).render()\n    }\n\n    /**\n     * 同时添加多个须知定义\n     *\n     * 格式:\n     * ```text\n     *\n     * ::category.c1\n     *\n     * Here is c1\n     *\n     * delay 2s\n     * <delay>2\n     *\n     * paused\n     * <pause>\n     *\n     * ::category.c1\n     *\n     * Here is c2\n     *\n     * ```\n     */\n    @KeepDetermination\n    public fun putAll(fullText: String) {\n        if (fullText.isBlank()) return\n        val lines = LinkedList(fullText.lines())\n\n        var category: String\n        val buffer = mutableListOf<String>()\n\n        while (true) {\n            if (lines.isEmpty()) return\n            val rm = lines.removeFirst()\n\n            if (rm.isBlank()) continue\n            if (rm.startsWith(\"::\")) {\n                category = rm.substring(2)\n                break\n            }\n            throw IllegalArgumentException(\"First non-empty line must be category define: $rm\")\n        }\n\n        fun flush() {\n            while (buffer.isNotEmpty()) {\n                if (buffer.first().isBlank()) {\n                    buffer.removeAt(0)\n                    continue\n                }\n                break\n            }\n\n\n            while (buffer.isNotEmpty()) {\n                if (buffer.last().isBlank()) {\n                    buffer.removeAt(buffer.lastIndex)\n                    continue\n                }\n                break\n            }\n\n            pages[category] = buffer.joinToString(separator = \"\\n\")\n            buffer.clear()\n        }\n\n        while (lines.isNotEmpty()) {\n            val rm = lines.removeFirst()\n            if (rm.startsWith(\"::\")) {\n                flush()\n                category = rm.substring(2)\n                continue\n            }\n            buffer.add(rm)\n        }\n\n        flush()\n    }\n\n    @DslMarker\n    private annotation class KeepDetermination\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/events/AutoLoginEvent.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.events\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.console.internal.*\nimport net.mamoe.mirai.event.events.BotEvent\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n/**\n * 自动登录执行后广播的事件\n * @property bot 登录的BOT\n * @see MiraiConsoleImplementationBridge.doStart\n * @since 2.15\n */\npublic sealed class AutoLoginEvent : BotEvent, ConsoleEvent, AbstractEvent() {\n    /**\n     * 登录成功\n     */\n    public class Success @MiraiInternalApi constructor(\n        override val bot: Bot\n    ) : AutoLoginEvent() {\n        override fun toString(): String {\n            return \"AutoLoginEvent.Success(bot=${bot.id}, protocol=${bot.configuration.protocol}, heartbeatStrategy=${bot.configuration.heartbeatStrategy})\"\n        }\n    }\n\n    /**\n     * 登录失败\n     */\n    public class Failure @MiraiInternalApi constructor(\n        override val bot: Bot,\n        public val cause: Throwable\n    ) : AutoLoginEvent() {\n        override fun toString(): String {\n            return \"AutoLoginEvent.Failure(bot=${bot.id}, protocol=${bot.configuration.protocol}, cause=${cause})\"\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/events/CommandExecutionEvent.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.events\n\n/*\ndata class CommandExecutionEvent( // TODO: 2020/6/26  impl CommandExecutionEvent\n    val sender: CommandSender,\n    val command: Command,\n    val rawArgs: Array<Any>\n) : CancellableEvent, ConsoleEvent, AbstractEvent() {\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (javaClass != other?.javaClass) return false\n\n        other as CommandExecutionEvent\n\n        if (sender != other.sender) return false\n        if (command != other.command) return false\n        if (!rawArgs.contentEquals(other.rawArgs)) return false\n\n        return true\n    }\n\n    override fun hashCode(): Int {\n        var result = sender.hashCode()\n        result = 31 * result + command.hashCode()\n        result = 31 * result + rawArgs.contentHashCode()\n        return result\n    }\n}\n*/"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/events/ConsoleEvent.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.events\n\nimport net.mamoe.mirai.event.Event\n\n/**\n * 表示来自 mirai-console 的事件\n */\npublic interface ConsoleEvent : Event"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/events/EndUserReadmeInitializeEvent.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.events\n\nimport net.mamoe.mirai.console.enduserreadme.EndUserReadme\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\npublic class EndUserReadmeInitializeEvent @MiraiInternalApi constructor(\n    public val readme: EndUserReadme,\n) : ConsoleEvent, AbstractEvent()\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/events/StartupEvent.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.events\n\nimport net.mamoe.mirai.console.extensions.PostStartupExtension\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.console.internal.*\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n/**\n * 在 Console 启动完成后广播的事件\n * @property timestamp 启动完成的时间戳\n * @see MiraiConsoleImplementationBridge.doStart\n * @see PostStartupExtension\n * @since 2.15\n */\npublic class StartupEvent @MiraiInternalApi constructor(\n    public val timestamp: Long\n) : ConsoleEvent, AbstractEvent()"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/extension/ComponentStorage.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.extension\n\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport net.mamoe.mirai.console.plugin.Plugin\nimport net.mamoe.mirai.console.plugin.jvm.JvmPlugin\nimport net.mamoe.mirai.console.plugin.jvm.JvmPlugin.Companion.onLoad\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport java.util.stream.Stream\n\n/**\n * 组件容器, 容纳 [Plugin] 注册的 [Extension].\n *\n * 插件可在 [JvmPlugin.onLoad] 时提供扩展. 前端可在 [MiraiConsoleImplementation.BackendAccess.globalComponentStorage] 获取全局组件容器.\n * 目前未允许获取全局组件容器. 如有需求请 [提交 issues](https://github.com/mamoe/mirai/issues/new/choose).\n *\n * 实现细节: 线程安全.\n *\n * @see Extension\n * @see JvmPlugin.onLoad\n */\npublic interface ComponentStorage {\n\n    /**\n     * 注册一个扩展\n     */\n    public fun <E : Extension> contribute(\n        extensionPoint: ExtensionPoint<E>,\n        plugin: Plugin,\n        extensionInstance: E,\n    ) // 2.11: E changed to T (only naming)\n\n    /**\n     * 注册一个扩展. [lazyInstance] 将会在 [getExtensions] 时才会计算.\n     */\n    public fun <E : Extension> contribute(\n        extensionPoint: ExtensionPoint<E>,\n        plugin: Plugin,\n        lazyInstance: () -> E,\n    ) // 2.11: E changed to T (only naming)\n\n    /**\n     * 获取优先级最高的 [ExtensionPoint] 扩展实例. 在未找到任何注册的实例时抛出 [NoSuchElementException].\n     *\n     * @since 2.11\n     */\n    @MiraiExperimentalApi\n    public fun <E : Extension> getPreferredExtension(\n        extensionPoint: ExtensionPoint<E>,\n    ): ExtensionRegistry<E> {\n        return getExtensions(extensionPoint).firstOrNull()\n            ?: throw NoSuchElementException(\"No extension registered for $extensionPoint\")\n    }\n\n    /**\n     * 获取注册的 [ExtensionPoint] 扩展实例列表. 返回的 [Sequence] 以 [Extension.priority] 倒序排序.\n     *\n     * @since 2.11\n     */\n    public fun <E : Extension> getExtensions(\n        extensionPoint: ExtensionPoint<E>,\n    ): Sequence<ExtensionRegistry<E>>\n\n    /**\n     * 获取注册的 [ExtensionPoint] 扩展实例列表. 返回的 [Stream] 以 [Extension.priority] 倒序排序.\n     *\n     * @since 2.11\n     */\n    public fun <E : Extension> getExtensionsStream(\n        extensionPoint: ExtensionPoint<E>,\n    ): Stream<ExtensionRegistry<E>>\n}\n\n/**\n * 仅前端实现可用\n */\n@ConsoleFrontEndImplementation\npublic interface ComponentStorageInternal : ComponentStorage {\n\n    /**\n     * 注册一个由 Mirai Console 实现的扩展 (因此没有相关 [Plugin]). [lazyInstance] 将会在 [getExtensions] 时才会计算.\n     */\n    public fun <E : Extension> contributeConsole(\n        extensionPoint: ExtensionPoint<E>,\n        lazyInstance: () -> E,\n    )\n\n    /**\n     * 注册一个由 Mirai Console 实现的扩展 (因此没有相关 [Plugin]).\n     */\n    public fun <E : Extension> contributeConsole(\n        extensionPoint: ExtensionPoint<E>,\n        instance: E,\n    ) {\n        @Suppress(\"USELESS_CAST\") // bug\n        contributeConsole(extensionPoint, { instance } as () -> E)\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/extension/Extension.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.extension\n\nimport net.mamoe.mirai.console.command.parse.SpaceSeparatedCommandCallParser\nimport net.mamoe.mirai.console.extensions.PermissionServiceProvider\nimport net.mamoe.mirai.console.extensions.PluginLoaderProvider\nimport net.mamoe.mirai.console.plugin.jvm.JvmPlugin\nimport net.mamoe.mirai.console.plugin.jvm.JvmPlugin.Companion.onLoad\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\n\n/**\n * 表示一个扩展.\n *\n * ### 获取扩展\n * Console 不允许插件获取自己或其他插件注册的扩展\n *\n * ### 注册扩展\n * 插件仅能在 [JvmPlugin.onLoad] 阶段注册扩展\n *\n * ```kotlin\n * object MyPlugin : KotlinPlugin( /* ... */ ) {\n *     fun PluginComponentStorage.onLoad() {\n *         contributePermissionService { /* ... */ }\n *         contributePluginLoader { /* ... */ }\n *         contribute(ExtensionPoint) { /* ... */ }\n *     }\n * }\n * ```\n *\n * @see ComponentStorage\n */\npublic interface Extension {\n    /**\n     * 优先级. 越高越先使用. 内嵌的 [SpaceSeparatedCommandCallParser] 拥有优先级 0.\n     *\n     * 若两个 [InstanceExtension] 有相同的优先级, 将会优先使用内嵌的实现, 再按 [ComponentStorage.contribute] 顺序依次使用.\n     *\n     * @since 2.11\n     */ // https://github.com/mamoe/mirai/issues/1860\n    @ConsoleExperimentalApi\n    public val priority: Int\n        get() = 0\n}\n\n/**\n * 增加一些函数 (方法)的扩展\n */\npublic interface FunctionExtension : Extension\n\n/**\n * 为某单例服务注册的 [Extension].\n *\n * 若同时有多个实例可用, 将会使用 [net.mamoe.mirai.console.extensions.SingletonExtensionSelector.selectSingleton] 选择\n *\n * @see PermissionServiceProvider\n */\n@Deprecated(\n    \"Please use InstanceExtension instead.\",\n    replaceWith = ReplaceWith(\"InstanceExtension\"),\n    level = DeprecationLevel.HIDDEN\n)\n@DeprecatedSinceMirai(warningSince = \"2.11\", errorSince = \"2.13\", hiddenSince = \"2.14\")\npublic interface SingletonExtension<T> : Extension {\n    public val instance: T\n}\n\n/**\n * 为一些实例注册的 [Extension].\n *\n * @see PluginLoaderProvider\n */\npublic interface InstanceExtension<T> : Extension {\n    public val instance: T\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/extension/ExtensionException.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.extension\n\n/**\n * 在调用一个 extension 时遇到的异常.\n */\npublic open class ExtensionException : RuntimeException {\n    public constructor() : super()\n    public constructor(message: String?) : super(message)\n    public constructor(message: String?, cause: Throwable?) : super(message, cause)\n    public constructor(cause: Throwable?) : super(cause)\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/extension/ExtensionPoint.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"MemberVisibilityCanBePrivate\")\n\npackage net.mamoe.mirai.console.extension\n\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport kotlin.reflect.KClass\n\n\n/**\n * 表示一个扩展接入点(扩展类型). 在 Kotlin 由 [Extension] 的伴生对象实现, 在 Java 可通过静态字段提供.\n *\n * 在[注册扩展][ComponentStorage.contribute]时需要提供其 [ExtensionPoint], [ExtensionPoint] 也可以用于获取所有注册的扩展 ([ComponentStorage.getExtensions]).\n *\n * @see AbstractExtensionPoint\n */\npublic interface ExtensionPoint<T : Extension> {\n    /**\n     * 扩展实例 [T] 的类型\n     */\n    public val extensionType: KClass<T>\n}\n\npublic abstract class AbstractExtensionPoint<T : Extension>(\n    public override val extensionType: KClass<T>,\n) : ExtensionPoint<T>\n\n\n/**\n * 表示一个 [SingletonExtension] 的 [ExtensionPoint]\n */\n@Suppress(\"DEPRECATION_ERROR\")\n@Deprecated(\n    \"Please use InstanceExtensionPoint instead.\",\n    replaceWith = ReplaceWith(\"InstanceExtensionPoint\"),\n    level = DeprecationLevel.HIDDEN\n)\n@DeprecatedSinceMirai(warningSince = \"2.11\", errorSince = \"2.13\", hiddenSince = \"2.14\")\npublic interface SingletonExtensionPoint<T : SingletonExtension<*>> : ExtensionPoint<T>\n\n/**\n * 表示一个 [InstanceExtension] 的 [ExtensionPoint]\n */\npublic interface InstanceExtensionPoint<T : InstanceExtension<*>> : ExtensionPoint<T>\n\n/**\n * 表示一个 [FunctionExtension] 的 [ExtensionPoint]\n */\npublic interface FunctionExtensionPoint<T : FunctionExtension> : ExtensionPoint<T>\n\n\npublic abstract class AbstractInstanceExtensionPoint<E : InstanceExtension<T>, T>\n/**\n * @since 2.10\n */\n@ConsoleExperimentalApi\npublic constructor(\n    extensionType: KClass<E>\n) : AbstractExtensionPoint<E>(extensionType)\n\n@Deprecated(\n    \"Please use AbstractInstanceExtensionPoint instead.\",\n    replaceWith = ReplaceWith(\n        \"AbstractInstanceExtension\",\n        \"net.mamoe.mirai.console.extension.AbstractInstanceExtensionPoint\"\n    ),\n    level = DeprecationLevel.HIDDEN\n)\n@DeprecatedSinceMirai(warningSince = \"2.11\", errorSince = \"2.13\", hiddenSince = \"2.14\")\n@Suppress(\"DEPRECATION\", \"DEPRECATION_ERROR\")\npublic abstract class AbstractSingletonExtensionPoint<E : SingletonExtension<T>, T>\n/**\n * @since 2.10\n */\n@ConsoleExperimentalApi\nconstructor(\n    extensionType: KClass<E>,\n    /**\n     * 内建的实现.\n     */\n    @ConsoleExperimentalApi\n    public val builtinImplementation: () -> T,\n) : AbstractExtensionPoint<E>(extensionType), SingletonExtensionPoint<E> {\n\n    /**\n     * @since 2.0\n     */\n    @Suppress(\"USELESS_CAST\") // compiler bug\n    @ConsoleExperimentalApi\n    public constructor(extensionType: KClass<E>, builtinImplementation: T) : this(\n        extensionType,\n        { builtinImplementation } as () -> T\n    )\n\n    /**\n     * 由 [net.mamoe.mirai.console.extensions.SingletonExtensionSelector] 选择后的实例.\n     */\n    @ConsoleExperimentalApi\n    public open val selectedInstance: T\n        get() = throw UnsupportedOperationException(\"SingletonExtension has been deprecated.\")\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/extension/ExtensionRegistry.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.extension\n\nimport net.mamoe.mirai.console.plugin.Plugin\nimport net.mamoe.mirai.utils.NotStableForInheritance\n\n/**\n * 一个已经注册的 [Extension]. 可通过 [ComponentStorage.getExtensions] 获得.\n *\n * @since 2.11\n */\n@NotStableForInheritance\npublic interface ExtensionRegistry<E : Extension> {\n    /**\n     * 提供该 [ExtensionRegistry] 的插件. 若为 `null` 则表示由 Mirai Console 内置或者由前端实现.\n     */\n    public val plugin: Plugin?\n\n    /**\n     * [Extension] 实例.\n     */\n    public val extension: E\n}\n\ninternal inline val <T> ExtensionRegistry<out InstanceExtension<T>>.instance get() = extension.instance\n\ninternal class ExtensionRegistryImpl<E : Extension> internal constructor(\n    /**\n     * 提供该 [ExtensionRegistry] 的插件. 若为 `null` 则表示由 Mirai Console 内置或者由前端实现.\n     */\n    override val plugin: Plugin?,\n    /**\n     * [Extension] 实例.\n     */\n    extensionInitializer: () -> E,\n) : ExtensionRegistry<E> {\n    override val extension: E by lazy(extensionInitializer)\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/extension/PluginComponentStorage.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.extension\n\nimport net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors\nimport net.mamoe.mirai.console.extensions.*\nimport net.mamoe.mirai.console.internal.extension.AbstractConcurrentComponentStorage\nimport net.mamoe.mirai.console.plugin.Plugin\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport kotlin.reflect.full.companionObjectInstance\n\n/**\n * 添加一些扩展给 [Plugin] 的 [ComponentStorage].\n *\n * 所有扩展都会以 'lazy' 形式注册, 由 Console 在不同的启动阶段分别初始化各类扩展.\n */\n@Suppress(\"EXPOSED_SUPER_CLASS\", \"unused\", \"MemberVisibilityCanBePrivate\")\npublic class PluginComponentStorage(\n    @JvmField\n    internal val plugin: Plugin,\n) : AbstractConcurrentComponentStorage() {\n    /**\n     * 注册一个扩展\n     */\n    public fun <E : Extension> contribute(\n        extensionPoint: ExtensionPoint<E>,\n        lazyInstance: () -> E,\n    ): Unit = contribute(extensionPoint, plugin, lazyInstance)\n\n    /**\n     * 注册一个扩展. [E] 必须拥有伴生对象为 [ExtensionPoint].\n     */\n    public inline fun <reified E : Extension> contribute(\n        noinline lazyInstance: () -> E,\n    ) {\n        @Suppress(\"UNCHECKED_CAST\")\n        (contribute(\n            (E::class.companionObjectInstance as? ExtensionPoint<E>\n                ?: error(\"Companion object of ${E::class.qualifiedName} is not an ExtensionPoint\")),\n            lazyInstance\n        ))\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // FunctionExtension\n    ///////////////////////////////////////////////////////////////////////////\n\n    /** 注册一个 [net.mamoe.mirai.console.extensions.SingletonExtensionSelector] */\n    @Suppress(\"DeprecatedCallableAddReplaceWith\", \"DEPRECATION_ERROR\", \"DEPRECATION\")\n    @Deprecated(\n        \"Order of extensions is now determined by its priority property since 2.11. SingletonExtensionSelector is not needed anymore. \",\n        level = DeprecationLevel.HIDDEN\n    )\n    @DeprecatedSinceMirai(warningSince = \"2.11\", errorSince = \"2.13\", hiddenSince = \"2.14\")\n    public fun contributeSingletonExtensionSelector(lazyInstance: () -> net.mamoe.mirai.console.extensions.SingletonExtensionSelector): Unit =\n        contribute(net.mamoe.mirai.console.extensions.SingletonExtensionSelector.ExtensionPoint, plugin, lazyInstance)\n\n    /** 注册一个 [BotConfigurationAlterer] */\n    public fun contributeBotConfigurationAlterer(instance: BotConfigurationAlterer): Unit =\n        contribute(BotConfigurationAlterer, plugin, lazyInstance = { instance })\n\n    /** 注册一个 [PostStartupExtension] */\n    public fun contributePostStartupExtension(instance: PostStartupExtension): Unit =\n        contribute(PostStartupExtension, plugin, lazyInstance = { instance })\n\n    /** 注册一个 [PostStartupExtension] */\n    public fun runAfterStartup(block: () -> Unit): Unit = contributePostStartupExtension(block)\n\n    ///////////////////////////////////////////////////////////////////////////\n    // InstanceExtensions & SingletonExtensions\n    ///////////////////////////////////////////////////////////////////////////\n\n    /** 注册一个 [PermissionServiceProvider] */\n    @JvmName(\"contributePermissionServiceProvider\")\n    @OverloadResolutionByLambdaReturnType\n    public fun contributePermissionService(lazyProvider: () -> PermissionServiceProvider): Unit =\n        contribute(PermissionServiceProvider, plugin, lazyProvider)\n\n    /////////////////////////////////////\n\n    /** 注册一个 [PluginLoaderProvider] */\n    @JvmName(\"contributePluginLoaderProvider\")\n    @OverloadResolutionByLambdaReturnType\n    public fun contributePluginLoader(lazyProvider: () -> PluginLoaderProvider): Unit =\n        contribute(PluginLoaderProvider, plugin, lazyProvider) // lazy for safety\n\n    /////////////////////////////////////\n\n\n    /** 注册一个 [CommandCallParserProvider] */\n    @ExperimentalCommandDescriptors\n    @JvmName(\"contributeCommandCallParserProvider\")\n    @OverloadResolutionByLambdaReturnType\n    public fun contributeCommandCallParser(provider: CommandCallParserProvider): Unit =\n        contribute(CommandCallParserProvider, plugin, provider)\n\n    /////////////////////////////////////\n\n\n    /** 注册一个 [CommandCallResolverProvider] */\n    @ExperimentalCommandDescriptors\n    @JvmName(\"contributeCommandCallResolverProvider\")\n    @OverloadResolutionByLambdaReturnType\n    public fun contributeCommandCallParser(provider: CommandCallResolverProvider): Unit =\n        contribute(CommandCallResolverProvider, plugin, provider)\n\n    /////////////////////////////////////\n\n    /** 注册一个 [CommandCallInterceptorProvider] */\n    @ExperimentalCommandDescriptors\n    @JvmName(\"contributeCommandCallInterceptorProvider\")\n    @OverloadResolutionByLambdaReturnType\n    public fun contributeCommandCallParser(provider: CommandCallInterceptorProvider): Unit =\n        contribute(CommandCallInterceptorProvider, plugin, provider)\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/extensions/BotConfigurationAlterer.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.extensions\n\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.extension.AbstractExtensionPoint\nimport net.mamoe.mirai.console.extension.FunctionExtension\nimport net.mamoe.mirai.utils.BotConfiguration\n\n/**\n * [MiraiConsole.addBot] 时的 [BotConfiguration] 修改扩展\n *\n * @see MiraiConsole.addBot\n */\n@Suppress(\"SpellCheckingInspection\") // alterer\npublic fun interface BotConfigurationAlterer : FunctionExtension {\n\n    /**\n     * 修改 [configuration], 返回修改完成的 [BotConfiguration]\n     */\n    public fun alterConfiguration(\n        botId: Long,\n        configuration: BotConfiguration,\n    ): BotConfiguration\n\n    public companion object ExtensionPoint :\n        AbstractExtensionPoint<BotConfigurationAlterer>(BotConfigurationAlterer::class)\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/extensions/CommandCallInterceptorProvider.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.extensions\n\nimport net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors\nimport net.mamoe.mirai.console.command.resolve.CommandCallInterceptor\nimport net.mamoe.mirai.console.extension.AbstractInstanceExtensionPoint\nimport net.mamoe.mirai.console.extension.InstanceExtension\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\n\n@ExperimentalCommandDescriptors\npublic interface CommandCallInterceptorProvider : InstanceExtension<CommandCallInterceptor> {\n    @OptIn(ConsoleExperimentalApi::class)\n    @ExperimentalCommandDescriptors\n    public companion object ExtensionPoint :\n        AbstractInstanceExtensionPoint<CommandCallInterceptorProvider, CommandCallInterceptor>(\n            CommandCallInterceptorProvider::class\n        )\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/extensions/CommandCallParserProvider.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.extensions\n\nimport net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors\nimport net.mamoe.mirai.console.command.parse.CommandCallParser\nimport net.mamoe.mirai.console.extension.AbstractInstanceExtensionPoint\nimport net.mamoe.mirai.console.extension.InstanceExtension\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\n\n/**\n * The provider of [CommandCallParser]\n */\n@ExperimentalCommandDescriptors\npublic interface CommandCallParserProvider : InstanceExtension<CommandCallParser> {\n    @OptIn(ConsoleExperimentalApi::class)\n    @ExperimentalCommandDescriptors\n    public companion object ExtensionPoint :\n        AbstractInstanceExtensionPoint<CommandCallParserProvider, CommandCallParser>(CommandCallParserProvider::class)\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/extensions/CommandCallResolverProvider.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.extensions\n\nimport net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors\nimport net.mamoe.mirai.console.command.resolve.CommandCallResolver\nimport net.mamoe.mirai.console.extension.AbstractInstanceExtensionPoint\nimport net.mamoe.mirai.console.extension.InstanceExtension\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\n\n@ExperimentalCommandDescriptors\npublic interface CommandCallResolverProvider : InstanceExtension<CommandCallResolver> {\n\n    @OptIn(ConsoleExperimentalApi::class)\n    @ExperimentalCommandDescriptors\n    public companion object ExtensionPoint :\n        AbstractInstanceExtensionPoint<CommandCallResolverProvider, CommandCallResolver>(CommandCallResolverProvider::class)\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/extensions/PermissionServiceProvider.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.extensions\n\nimport net.mamoe.mirai.console.extension.AbstractInstanceExtensionPoint\nimport net.mamoe.mirai.console.extension.InstanceExtension\nimport net.mamoe.mirai.console.permission.PermissionService\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\n\n/**\n * [权限服务][PermissionService] 提供器.\n *\n * 当插件注册 [PermissionService] 后, 默认会使用插件的 [PermissionService].\n */\npublic interface PermissionServiceProvider : InstanceExtension<PermissionService<*>> {\n\n    @OptIn(ConsoleExperimentalApi::class)\n    public companion object ExtensionPoint :\n        AbstractInstanceExtensionPoint<PermissionServiceProvider, PermissionService<*>>(PermissionServiceProvider::class)\n    // ! BREAKING CHANGE MADE IN 2.11: supertype changed from AbstractSingletonExtensionPoint to AbstractInstanceExtensionPoint\n}\n\n/**\n * @see PermissionServiceProvider\n */\n@Deprecated(\"Please implement your own PermissionServiceProvider.\", level = DeprecationLevel.HIDDEN)\n@DeprecatedSinceMirai(warningSince = \"2.11\", errorSince = \"2.13\", hiddenSince = \"2.14\") // for hidden.\npublic class PermissionServiceProviderImpl(override val instance: PermissionService<*>) : PermissionServiceProvider\n\n/**\n * @see PermissionServiceProvider\n */\n@Deprecated(\"Please implement your own PermissionServiceProvider.\", level = DeprecationLevel.HIDDEN)\n@DeprecatedSinceMirai(warningSince = \"2.11\", errorSince = \"2.13\", hiddenSince = \"2.14\") // for hidden.\npublic class PermissionServiceProviderImplLazy(initializer: () -> PermissionService<*>) : PermissionServiceProvider {\n    override val instance: PermissionService<*> by lazy(initializer)\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/extensions/PluginLoaderProvider.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.extensions\n\nimport net.mamoe.mirai.console.extension.AbstractExtensionPoint\nimport net.mamoe.mirai.console.extension.Extension\nimport net.mamoe.mirai.console.extension.InstanceExtension\nimport net.mamoe.mirai.console.extension.PluginComponentStorage\nimport net.mamoe.mirai.console.plugin.loader.PluginLoader\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\n\n/**\n * 提供扩展 [PluginLoader]\n *\n * @see PluginComponentStorage.contributePluginLoader\n *\n *\n * @see Extension\n * @see PluginLoader\n *\n * @see PluginLoaderProviderImplLazy\n */\npublic interface PluginLoaderProvider : InstanceExtension<PluginLoader<*, *>> {\n    public companion object ExtensionPoint : AbstractExtensionPoint<PluginLoaderProvider>(PluginLoaderProvider::class)\n}\n\n@Deprecated(\"Please implement your own PluginLoaderProvider.\", level = DeprecationLevel.HIDDEN)\n@DeprecatedSinceMirai(warningSince = \"2.11\", errorSince = \"2.13\", hiddenSince = \"2.14\") // for hidden.\npublic class PluginLoaderProviderImpl(override val instance: PluginLoader<*, *>) : PluginLoaderProvider\n\n@Deprecated(\"Please implement your own PluginLoaderProvider.\", level = DeprecationLevel.HIDDEN)\n@DeprecatedSinceMirai(warningSince = \"2.11\", errorSince = \"2.13\", hiddenSince = \"2.14\") // for hidden.\npublic class PluginLoaderProviderImplLazy(initializer: () -> PluginLoader<*, *>) : PluginLoaderProvider {\n    override val instance: PluginLoader<*, *> by lazy(initializer)\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/extensions/PostStartupExtension.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.extensions\n\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.extension.AbstractExtensionPoint\nimport net.mamoe.mirai.console.extension.ExtensionException\nimport net.mamoe.mirai.console.extension.FunctionExtension\nimport net.mamoe.mirai.console.internal.MiraiConsoleImplementationBridge\n\n/**\n * 在 Console 启动完成后立即在主线程调用的扩展. 用于进行一些必要的延迟初始化.\n *\n * 这些扩展只会, 且一定会被调用正好一次.\n */\npublic fun interface PostStartupExtension : FunctionExtension {\n    /**\n     * 将在 Console 主线程执行.\n     *\n     * #### 内部实现细节\n     * 在 [MiraiConsoleImplementationBridge.doStart] 所有 [MiraiConsoleImplementationBridge.phase] 执行完成后顺序调用.\n     *\n     * @throws Exception 所有抛出的 [Exception] 都会被捕获并包装为 [ExtensionException] 抛出, 并停止 [MiraiConsole]\n     */\n    @Throws(Exception::class)\n    public operator fun invoke()\n\n    public companion object ExtensionPoint : AbstractExtensionPoint<PostStartupExtension>(PostStartupExtension::class)\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/extensions/SingletonExtensionSelector.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"DEPRECATION_ERROR\")\n\npackage net.mamoe.mirai.console.extensions\n\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.extension.*\nimport net.mamoe.mirai.console.internal.extension.GlobalComponentStorage\nimport net.mamoe.mirai.console.internal.extension.SingletonExtensionSelectorImpl\nimport net.mamoe.mirai.console.plugin.Plugin\nimport net.mamoe.mirai.console.plugin.name\nimport net.mamoe.mirai.console.util.ConsoleInternalApi\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport net.mamoe.mirai.utils.info\nimport kotlin.reflect.KClass\n\n/**\n * 用于同时拥有多个 [SingletonExtension] 时选择一个实例.\n *\n * 如有多个 [SingletonExtensionSelector] 注册, 将会停止服务器.\n */\n@Deprecated(\n    \"Order of extensions is now determined by its priority property since 2.11. SingletonExtensionSelector is not needed anymore. \",\n    level = DeprecationLevel.HIDDEN\n)\n@DeprecatedSinceMirai(warningSince = \"2.11\", errorSince = \"2.13\", hiddenSince = \"2.14\")\n@Suppress(\"DEPRECATION_ERROR\")\npublic interface SingletonExtensionSelector : FunctionExtension {\n    /**\n     * 表示一个插件注册的 [Extension]\n     */\n    @Deprecated(\n        \"Order of extensions is now determined by its priority property since 2.11. SingletonExtensionSelector is not needed anymore. \",\n        level = DeprecationLevel.HIDDEN\n    )\n    @DeprecatedSinceMirai(warningSince = \"2.11\", errorSince = \"2.13\", hiddenSince = \"2.14\")\n    public data class Registry<T : Extension>(\n        val plugin: Plugin?,\n        val extension: T,\n    )\n\n    /**\n     * @return `null` 表示使用 Console 内置的 [SingletonExtensionSelector]\n     */\n    public fun <T : Extension> selectSingleton(\n        extensionType: KClass<T>,\n        candidates: Collection<Registry<T>>,\n    ): T?\n\n    @Deprecated(\n        \"Order of extensions is now determined by its priority property since 2.11. SingletonExtensionSelector is not needed anymore. \",\n        level = DeprecationLevel.HIDDEN\n    )\n    @DeprecatedSinceMirai(warningSince = \"2.11\", errorSince = \"2.13\", hiddenSince = \"2.14\")\n    public companion object ExtensionPoint :\n        AbstractExtensionPoint<SingletonExtensionSelector>(SingletonExtensionSelector::class) {\n\n        private var instanceField: SingletonExtensionSelector? = null\n\n        internal val instance: SingletonExtensionSelector get() = instanceField ?: error(\"\")\n\n        @OptIn(ConsoleInternalApi::class)\n        internal fun init() {\n            check(instanceField == null) { \"Internal error: reinitialize SingletonExtensionSelector\" }\n            val instances = GlobalComponentStorage.getExtensions<SingletonExtensionSelector>(ExtensionPoint).toList()\n            instanceField = when {\n                instances.isEmpty() -> SingletonExtensionSelectorImpl\n                instances.size == 1 -> {\n                    instances.single().also { registry ->\n                        MiraiConsole.mainLogger.info { \"Loaded SingletonExtensionSelector: ${registry.extension} from ${registry.plugin?.name ?: \"<builtin>\"}\" }\n                    }.extension\n                }\n\n                else -> {\n                    val hint = instances.joinToString { reg ->\n                        \"'${reg.extension}' from '${reg.plugin?.name ?: \"<builtin>\"}'\"\n                    }\n                    error(\n                        \"Found too many SingletonExtensionSelectors: $hint. \" +\n                                \"Check your plugins and ensure there is only one external SingletonExtensionSelectors\"\n                    )\n                }\n            }\n        }\n\n        internal fun <T : Extension> selectSingleton(\n            extensionType: KClass<T>,\n            candidates: Collection<ExtensionRegistry<T>>,\n        ): T? =\n            instance.selectSingleton(extensionType, candidates.map { Registry(it.plugin, it.extension) })\n\n\n        internal fun <T : Extension> SingletonExtensionSelector.selectSingleton(\n            extensionType: KClass<T>,\n            candidates: Collection<ExtensionRegistry<T>>,\n        ): T? = selectSingleton(extensionType, candidates.map { Registry(it.plugin, it.extension) })\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/fontend/DefaultLoggingProcessProgress.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.fontend\n\nimport net.mamoe.mirai.utils.MiraiLogger\n\n/**\n * [ProcessProgress] 的简单实现, 前端应该自行实现 [ProcessProgress]\n *\n * 此类为前端未实现 [ProcessProgress] 时的缺省实现\n */\ninternal class DefaultLoggingProcessProgress : ProcessProgress {\n    private var message: String = \"\"\n    private var lastDisplay = 0L\n    private var changed: Boolean = false\n    private var failed: Boolean = false\n\n    private companion object {\n        private val logger by lazy {\n            MiraiLogger.Factory.create(\n                DefaultLoggingProcessProgress::class,\n                \"ProcessProgress\"\n            )\n        }\n    }\n\n    override fun updateText(txt: String) {\n        this.message = txt\n        changed = true\n    }\n\n    override fun setTotalSize(totalSize: Long) {\n    }\n\n    override fun update(processed: Long) {\n    }\n\n    override fun update(processed: Long, totalSize: Long) {\n    }\n\n    override fun markFailed() {\n        failed = true\n    }\n\n    override fun rerender() {\n        if (!changed) return\n        changed = false\n        val crtTime = System.currentTimeMillis()\n        if (crtTime - lastDisplay < 1000) {\n            return\n        }\n        lastDisplay = crtTime\n        if (failed) {\n            logger.error(message)\n        } else {\n            logger.info(message)\n        }\n    }\n\n    override fun close() {\n        if (failed) {\n            logger.error(message)\n        } else {\n            logger.info(message)\n        }\n        changed = false\n        message = \"\"\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/fontend/ProcessProgress.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.fontend\n\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport java.io.Closeable\n\n/**\n * 一个下载进度\n *\n * @see MiraiConsole.newProcessProgress\n */\n// @ConsoleFrontEndImplementation\npublic interface ProcessProgress : Closeable {\n    /**\n     * 更新当前下载进度的文本\n     */\n    public fun updateText(txt: String)\n\n    /**\n     * 更新当前下载进度的文本\n     */\n    public fun updateText(txt: CharSequence) {\n        updateText(txt.toString())\n    }\n\n    /**\n     * 设置此进度的最终大小\n     */\n    public fun setTotalSize(totalSize: Long)\n\n    /**\n     * 更新下载进度的进度\n     *\n     * 在更新进度后需要[刷新显示][rerender]\n     */\n    public fun update(processed: Long)\n\n    /**\n     * 更新下载进度的进度\n     *\n     * 在更新进度后需要[刷新显示][rerender]\n     */\n    public fun update(processed: Long, totalSize: Long)\n\n    /**\n     * 将该进度标记为 已失败 / 出错\n     *\n     * 注: 即使此进度被标记为失败, 也需要[手动释放][close]\n     */\n    public fun markFailed()\n\n    /**\n     * 立即重新渲染此进度\n     */\n    public fun rerender()\n\n    /**\n     * 释放此进度, 相关资源和 UI 将会更新\n     */\n    override fun close()\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/MiraiConsoleBuildConstants.kt.template",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n/*\n * Important: This file is generated on build by Gradle task 'generateBuildConstants', on GENERATION_DATE\n */\n\npackage net.mamoe.mirai.console.internal\n\nimport net.mamoe.mirai.console.util.SemVersion\nimport java.time.Instant\n\ninternal object MiraiConsoleBuildConstants {\n    @JvmStatic\n    val buildDate: Instant = Instant.ofEpochSecond(BUILD_DATE)\n    const val versionConst: String = \"VERSION_CONSTANT\"\n\n    @JvmStatic\n    val version: SemVersion = SemVersion(versionConst)\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(\n    ConsoleExperimentalApi::class, ConsoleFrontEndImplementation::class, ConsoleInternalApi::class,\n    MiraiInternalApi::class, MiraiExperimentalApi::class\n)\n\npackage net.mamoe.mirai.console.internal\n\nimport kotlinx.coroutines.CoroutineExceptionHandler\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.runBlocking\nimport me.him188.kotlin.dynamic.delegation.dynamicDelegation\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MalformedMiraiConsoleImplementationError\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport net.mamoe.mirai.console.MiraiConsoleImplementation.ConsoleDataScope.Companion.get\nimport net.mamoe.mirai.console.command.BuiltInCommands\nimport net.mamoe.mirai.console.command.CommandManager\nimport net.mamoe.mirai.console.command.ConsoleCommandSender\nimport net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors\nimport net.mamoe.mirai.console.command.parse.SpaceSeparatedCommandCallParser\nimport net.mamoe.mirai.console.command.resolve.BuiltInCommandCallResolver\nimport net.mamoe.mirai.console.events.AutoLoginEvent\nimport net.mamoe.mirai.console.events.StartupEvent\nimport net.mamoe.mirai.console.extensions.CommandCallParserProvider\nimport net.mamoe.mirai.console.extensions.CommandCallResolverProvider\nimport net.mamoe.mirai.console.extensions.PermissionServiceProvider\nimport net.mamoe.mirai.console.extensions.PostStartupExtension\nimport net.mamoe.mirai.console.internal.auth.ConsoleSecretsCalculator\nimport net.mamoe.mirai.console.internal.command.CommandConfig\nimport net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig\nimport net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.ConfigurationKey\nimport net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.PasswordKind.MD5\nimport net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.PasswordKind.PLAIN\nimport net.mamoe.mirai.console.internal.data.builtins.DataScope\nimport net.mamoe.mirai.console.internal.data.builtins.LoggerConfig\nimport net.mamoe.mirai.console.internal.data.builtins.PluginDependenciesConfig\nimport net.mamoe.mirai.console.internal.enduserreadme.EndUserReadmeProcessor\nimport net.mamoe.mirai.console.internal.extension.GlobalComponentStorage\nimport net.mamoe.mirai.console.internal.extension.GlobalComponentStorageImpl\nimport net.mamoe.mirai.console.internal.logging.LoggerControllerImpl\nimport net.mamoe.mirai.console.internal.logging.MiraiConsoleLogger\nimport net.mamoe.mirai.console.internal.logging.externalbind.slf4j.MiraiConsoleSLF4JAdapter\nimport net.mamoe.mirai.console.internal.permission.BuiltInPermissionService\nimport net.mamoe.mirai.console.internal.plugin.PluginManagerImpl\nimport net.mamoe.mirai.console.internal.shutdown.ShutdownDaemon\nimport net.mamoe.mirai.console.internal.util.runIgnoreException\nimport net.mamoe.mirai.console.logging.LoggerController\nimport net.mamoe.mirai.console.permission.PermissionService\nimport net.mamoe.mirai.console.permission.PermissionService.Companion.permit\nimport net.mamoe.mirai.console.permission.RootPermission\nimport net.mamoe.mirai.console.plugin.PluginManager\nimport net.mamoe.mirai.console.plugin.name\nimport net.mamoe.mirai.console.util.*\nimport net.mamoe.mirai.console.util.cast\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.utils.*\nimport java.time.Instant\nimport java.time.ZoneId\nimport java.time.format.DateTimeFormatter\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.reflect.KClass\nimport kotlin.reflect.KProperty\nimport kotlin.reflect.KProperty0\n\ninternal val MiraiConsole.pluginManagerImpl: PluginManagerImpl get() = this.pluginManager.cast()\n\n/**\n * [MiraiConsole] 公开 API 与前端实现的连接桥.\n */\n@Suppress(\"SpellCheckingInspection\")\ninternal class MiraiConsoleImplementationBridge(\n    private val externalImplementation: MiraiConsoleImplementation,\n) : MiraiConsole,\n    MiraiConsoleImplementation by (dynamicDelegation(MiraiConsoleImplementationBridge::externalImplementation)) {\n    override val origin: MiraiConsoleImplementation\n        get() = externalImplementation\n\n    // FIXME: 12/12/2021 Workaround for compiler regression, should remove when using Kotlin compiller 1.6.20\n    private operator fun <V> KProperty0<V>.getValue(thisRef: Any?, property: KProperty<*>): V = this.get()\n\n    override val buildDate: Instant by MiraiConsoleBuildConstants::buildDate\n    override val version: SemVersion by MiraiConsoleBuildConstants::version\n    override val pluginManager: PluginManagerImpl by lazy { PluginManagerImpl(coroutineContext) }\n\n    // used internally\n    val globalComponentStorage: GlobalComponentStorageImpl by lazy { GlobalComponentStorageImpl() }\n    val shutdownDaemon = ShutdownDaemon.DaemonStarter(this)\n\n    // tentative workaround for https://github.com/mamoe/mirai/pull/1889#pullrequestreview-887903183\n    @Volatile\n    var permissionSeviceLoaded: Boolean = false\n\n    // For protect account.secrets in console with non-password login\n    lateinit var consoleSecretsCalculator: ConsoleSecretsCalculator\n\n    // MiraiConsoleImplementation define: get() = LoggerControllerImpl()\n    // Need to cache it or else created every call.\n    //      It caused config/Console/Logger.yml ignored.\n    override val loggerController: LoggerController by lazy {\n        externalImplementation.loggerController\n    }\n\n    override val mainLogger: MiraiLogger by lazy { MiraiLogger.Factory.create(MiraiConsole::class, \"main\") }\n\n    /**\n     * Delegates the [platformImplementation] with [loggerController].\n     */\n    private inner class ControlledLoggerFactory(\n        private val platformImplementation: MiraiLogger.Factory,\n    ) : MiraiLogger.Factory {\n        override fun create(requester: KClass<*>, identity: String?): MiraiLogger {\n            return MiraiConsoleLogger(loggerController, platformImplementation.create(requester, identity))\n        }\n\n        override fun create(requester: Class<*>, identity: String?): MiraiLogger {\n            return MiraiConsoleLogger(loggerController, platformImplementation.create(requester, identity))\n        }\n    }\n\n    override fun createLoggerFactory(context: MiraiConsoleImplementation.FrontendLoggingInitContext): MiraiLogger.Factory {\n        error(\"Duplicated logger factory initalization is not allowed. Use MiraiLogger.Factory instead.\")\n    }\n\n    init {\n        // When writing a log:\n        // 1. ControlledLoggerFactory checks if that log level is enabled\n        // 2. ... if enabled, goto 3\n        //    ... if not, return\n        // 3. [externalImplementation] decides how to log the message\n        // 4. [externalImplementation] outputs by using [platform]\n        val context = object : MiraiConsoleImplementation.FrontendLoggingInitContext {\n            val pendingActions = mutableListOf<() -> Unit>()\n            override fun acquirePlatformImplementation(): MiraiLogger.Factory {\n                @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n                return MiraiLoggerFactoryImplementationBridge.instance\n            }\n\n            override fun invokeAfterInitialization(action: () -> Unit) {\n                pendingActions.add(action)\n            }\n        }\n\n        val response = externalImplementation.createLoggerFactory(context)\n        @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n        MiraiLoggerFactoryImplementationBridge.setInstance(ControlledLoggerFactory(response))\n\n        @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n        MiraiLoggerFactoryImplementationBridge.freeze() // forbid any further overrides\n\n        context.pendingActions.forEach { it.invoke() }\n    }\n\n\n    @Deprecated(\n        \"Please use the standard way in mirai-core to create loggers, i.e. MiraiLogger.Factory.INSTANCE.create()\",\n        replaceWith = ReplaceWith(\n            \"MiraiLogger.Factory.create(yourClass::class, identity)\",\n            \"net.mamoe.mirai.utils.MiraiLogger\"\n        ),\n        level = DeprecationLevel.ERROR\n    )\n    override fun createLogger(identity: String?): MiraiLogger {\n        return MiraiLogger.Factory.create(MiraiConsole::class, identity)\n    }\n\n    internal fun doStart() {\n        externalImplementation.preStart()\n\n        @OptIn(ExperimentalCommandDescriptors::class)\n        phase(\"register builtin componenets\") {\n            GlobalComponentStorage.run {\n                contributeConsole(CommandCallParserProvider, SpaceSeparatedCommandCallParser.Provider)\n                contributeConsole(CommandCallResolverProvider, BuiltInCommandCallResolver.Provider)\n                contributeConsole(PermissionServiceProvider, BuiltInPermissionService.Provider())\n            }\n        }\n\n        phase(\"greeting\") {\n            val buildDateFormatted =\n                buildDate.atZone(ZoneId.systemDefault()).format(DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\"))\n\n            mainLogger.info { \"Starting mirai-console...\" }\n\n            val printLogo = true // TODO\n            if (printLogo) {\n                mainLogger.info {\n                    AnsiMessageBuilder.create(noAnsi = !isAnsiSupported).apply {\n                        /*\n\n___  ____           _   _____                       _\n|  \\/  (_)         (_) /  __ \\                     | |\n| .  . |_ _ __ __ _ _  | /  \\/ ___  _ __  ___  ___ | | ___\n| |\\/| | | '__/ _` | | | |    / _ \\| '_ \\/ __|/ _ \\| |/ _ \\\n| |  | | | | | (_| | | | \\__/\\ (_) | | | \\__ \\ (_) | |  __/\n\\_|  |_/_|_|  \\__,_|_|  \\____/\\___/|_| |_|___/\\___/|_|\\___|\n\n __       __ __                   __  ______                                      __\n|  \\     /  \\  \\                 |  \\/      \\                                    |  \\\n| ▓▓\\   /  ▓▓\\▓▓ ______   ______  \\▓▓  ▓▓▓▓▓▓\\ ______  _______   _______  ______ | ▓▓ ______\n| ▓▓▓\\ /  ▓▓▓  \\/      \\ |      \\|  \\ ▓▓   \\▓▓/      \\|       \\ /       \\/      \\| ▓▓/      \\\n| ▓▓▓▓\\  ▓▓▓▓ ▓▓  ▓▓▓▓▓▓\\ \\▓▓▓▓▓▓\\ ▓▓ ▓▓     |  ▓▓▓▓▓▓\\ ▓▓▓▓▓▓▓\\  ▓▓▓▓▓▓▓  ▓▓▓▓▓▓\\ ▓▓  ▓▓▓▓▓▓\\\n| ▓▓\\▓▓ ▓▓ ▓▓ ▓▓ ▓▓   \\▓▓/      ▓▓ ▓▓ ▓▓   __| ▓▓  | ▓▓ ▓▓  | ▓▓\\▓▓    \\| ▓▓  | ▓▓ ▓▓ ▓▓    ▓▓\n| ▓▓ \\▓▓▓| ▓▓ ▓▓ ▓▓     |  ▓▓▓▓▓▓▓ ▓▓ ▓▓__/  \\ ▓▓__/ ▓▓ ▓▓  | ▓▓_\\▓▓▓▓▓▓\\ ▓▓__/ ▓▓ ▓▓ ▓▓▓▓▓▓▓▓\n| ▓▓  \\▓ | ▓▓ ▓▓ ▓▓      \\▓▓    ▓▓ ▓▓\\▓▓    ▓▓\\▓▓    ▓▓ ▓▓  | ▓▓       ▓▓\\▓▓    ▓▓ ▓▓\\▓▓     \\\n \\▓▓      \\▓▓\\▓▓\\▓▓       \\▓▓▓▓▓▓▓\\▓▓ \\▓▓▓▓▓▓  \\▓▓▓▓▓▓ \\▓▓   \\▓▓\\▓▓▓▓▓▓▓  \\▓▓▓▓▓▓ \\▓▓ \\▓▓▓▓▓▓▓\n\n                        */\n                        append(\"\\n\\n\")\n\n                        val textA = \"\"\"[ Mirai console $version ]\"\"\"\n                        val logoLength = 94\n                        lightBlue()\n                        val barlength = logoLength - textA.length\n                        val leftWidth = barlength / 2\n                        repeat(leftWidth) {\n                            append('=')\n                        }\n                        append(textA)\n                        repeat(barlength - leftWidth) {\n                            append('=')\n                        }\n                        append('\\n')\n\n                        lightYellow().appendLine(\"\"\" __       __ __                   __  ______                                      __\"\"\")\n                        lightYellow().appendLine(\"\"\"|  \\     /  \\  \\                 |  \\/      \\                                    |  \\\"\"\")\n                        lightYellow().appendLine(\"\"\"| ▓▓\\   /  ▓▓\\▓▓ ______   ______  \\▓▓  ▓▓▓▓▓▓\\ ______  _______   _______  ______ | ▓▓ ______\"\"\")\n                        lightYellow().appendLine(\"\"\"| ▓▓▓\\ /  ▓▓▓  \\/      \\ |      \\|  \\ ▓▓   \\▓▓/      \\|       \\ /       \\/      \\| ▓▓/      \\\"\"\")\n                        lightYellow().appendLine(\"\"\"| ▓▓▓▓\\  ▓▓▓▓ ▓▓  ▓▓▓▓▓▓\\ \\▓▓▓▓▓▓\\ ▓▓ ▓▓     |  ▓▓▓▓▓▓\\ ▓▓▓▓▓▓▓\\  ▓▓▓▓▓▓▓  ▓▓▓▓▓▓\\ ▓▓  ▓▓▓▓▓▓\\\"\"\")\n                        lightYellow().appendLine(\"\"\"| ▓▓\\▓▓ ▓▓ ▓▓ ▓▓ ▓▓   \\▓▓/      ▓▓ ▓▓ ▓▓   __| ▓▓  | ▓▓ ▓▓  | ▓▓\\▓▓    \\| ▓▓  | ▓▓ ▓▓ ▓▓    ▓▓\"\"\")\n                        lightYellow().appendLine(\"\"\"| ▓▓ \\▓▓▓| ▓▓ ▓▓ ▓▓     |  ▓▓▓▓▓▓▓ ▓▓ ▓▓__/  \\ ▓▓__/ ▓▓ ▓▓  | ▓▓_\\▓▓▓▓▓▓\\ ▓▓__/ ▓▓ ▓▓ ▓▓▓▓▓▓▓▓\"\"\")\n                        lightYellow().appendLine(\"\"\"| ▓▓  \\▓ | ▓▓ ▓▓ ▓▓      \\▓▓    ▓▓ ▓▓\\▓▓    ▓▓\\▓▓    ▓▓ ▓▓  | ▓▓       ▓▓\\▓▓    ▓▓ ▓▓\\▓▓     \\\"\"\")\n                        lightYellow().appendLine(\"\"\" \\▓▓      \\▓▓\\▓▓\\▓▓       \\▓▓▓▓▓▓▓\\▓▓ \\▓▓▓▓▓▓  \\▓▓▓▓▓▓ \\▓▓   \\▓▓\\▓▓▓▓▓▓▓  \\▓▓▓▓▓▓ \\▓▓ \\▓▓▓▓▓▓▓\"\"\")\n                        append(\"\\n\")\n                    }.toString()\n                }\n            }\n\n            mainLogger.info { \"Backend: version $version, built on $buildDateFormatted.\" }\n            mainLogger.info { frontEndDescription.render() }\n            mainLogger.info { \"Welcome to visit https://mirai.mamoe.net/\" }\n        }\n\n        phase(\"check coroutineContext\") {\n            if (coroutineContext[Job] == null) {\n                throw MalformedMiraiConsoleImplementationError(\"The coroutineContext given to MiraiConsole must have a Job in it.\")\n            }\n            if (coroutineContext[CoroutineExceptionHandler] == null) {\n                throw MalformedMiraiConsoleImplementationError(\"The coroutineContext given to MiraiConsole must have a CoroutineExceptionHandler in it.\")\n            }\n\n            MiraiConsole.job.invokeOnCompletion {\n                shutdownDaemon.tryStart()\n                Bot.instances.forEach { kotlin.runCatching { it.close() }.exceptionOrNull()?.let(mainLogger::error) }\n            }\n        }\n\n        ConsoleInput\n\n        // start\n\n        phase(\"load configurations\") {\n            mainLogger.verbose { \"Loading configurations...\" }\n            consoleDataScope.addAndReloadConfig(AutoLoginConfig())\n            consoleDataScope.addAndReloadConfig(CommandConfig())\n            consoleDataScope.addAndReloadConfig(PluginDependenciesConfig())\n            val loggerController = loggerController\n            if (loggerController is LoggerControllerImpl) {\n                consoleDataScope.addAndReloadConfig(loggerController.loggerConfig)\n            } else {\n                consoleDataScope.addAndReloadConfig(LoggerConfig())\n            }\n            consoleDataScope.reloadAll()\n            if (loggerController is LoggerControllerImpl) {\n                loggerController.onReload()\n            }\n        }\n\n        phase(\"initialize logging bridges\") {\n            MiraiConsoleSLF4JAdapter.doSlf4JInit()\n        }\n\n        phase(\"initialize all plugins\") {\n            pluginManager // init\n\n            consoleSecretsCalculator = ConsoleSecretsCalculator(\n                pluginManager.pluginsDataPath.resolve(\"Console/console-secrets.key\")\n            ).also { it.consoleKey }\n\n            mainLogger.verbose { \"Loading JVM plugins...\" }\n            pluginManager.loadAllPluginsUsingBuiltInLoaders()\n            pluginManager.initExternalPluginLoaders().let { count ->\n                mainLogger.verbose { \"$count external PluginLoader(s) found. \" }\n                if (count != 0) {\n                    mainLogger.verbose { \"Loading external plugins...\" }\n                }\n            }\n        }\n\n        phase(\"load all plugins\") {\n            pluginManager.loadPlugins(pluginManager.scanPluginsUsingPluginLoadersIncludingThoseFromPluginLoaderProvider())\n\n            mainLogger.verbose { \"${PluginManager.plugins.size} plugin(s) loaded.\" }\n        }\n\n//        phase(\"load SingletonExtensionSelector\") {\n//            SingletonExtensionSelector.init()\n//            val instance = SingletonExtensionSelector.instance\n//            if (instance is SingletonExtensionSelectorImpl) {\n//                consoleDataScope.addAndReloadConfig(instance.config)\n//            }\n//        }\n\n\n        phase(\"load PermissionService\") {\n            mainLogger.verbose { \"Loading PermissionService...\" }\n\n            permissionSeviceLoaded = true\n            PermissionService.INSTANCE.let { ps ->\n                if (ps is BuiltInPermissionService) {\n                    consoleDataScope.addAndReloadConfig(ps.config)\n                    mainLogger.verbose { \"Reloaded PermissionService settings.\" }\n                } else {\n                    mainLogger.info {\n                        \"Loaded PermissionService from plugin ${\n                            GlobalComponentStorage.getPreferredExtension(\n                                PermissionServiceProvider\n                            ).plugin?.name\n                        }\"\n                    }\n                }\n            }\n\n            runIgnoreException<UnsupportedOperationException> { ConsoleCommandSender.permit(RootPermission) }\n        }\n\n        phase(\"prepare commands\") {\n            mainLogger.verbose { \"Loading built-in commands...\" }\n            BuiltInCommands.registerAll()\n            mainLogger.info { \"Prepared built-in commands: ${BuiltInCommands.all.joinToString { it.primaryName }}\" }\n            CommandManager\n            // CommandManagerImpl.commandListener // start\n        }\n\n        phase(\"enable plugins\") {\n            mainLogger.verbose { \"Enabling plugins...\" }\n\n            pluginManager.enableAllLoadedPlugins()\n\n            for (registeredCommand in CommandManager.allRegisteredCommands) {\n                registeredCommand.permission // init\n            }\n\n            mainLogger.info { \"${pluginManager.plugins.count { it.isEnabled }} plugin(s) enabled.\" }\n        }\n\n        phase(\"end-user-readme\") {\n            EndUserReadmeProcessor.process(this)\n        }\n\n        phase(\"auto-login bots\") {\n            runBlocking {\n                val config = DataScope.get<AutoLoginConfig>()\n                val accounts = config.accounts.toList()\n                for (account in accounts.filter {\n                    it.configuration[ConfigurationKey.enable]?.toString()?.equals(\"true\", true) ?: true\n                }) {\n                    val id = kotlin.runCatching {\n                        account.account.toLong()\n                    }.getOrElse {\n                        error(\"Bad auto-login account: '${account.account}'\")\n                    }\n                    if (id == 123456L) continue\n                    fun BotConfiguration.configBot() {\n\n                        account.configuration[ConfigurationKey.protocol]?.let { protocol ->\n                            this.protocol = runCatching {\n                                BotConfiguration.MiraiProtocol.valueOf(protocol.toString())\n                            }.getOrElse {\n                                throw IllegalArgumentException(\n                                    \"Bad auto-login config value for `protocol` for account $id\",\n                                    it\n                                )\n                            }\n                        }\n                        account.configuration[ConfigurationKey.heartbeatStrategy]?.let { heartStrate ->\n                            this.heartbeatStrategy = runCatching {\n                                BotConfiguration.HeartbeatStrategy.valueOf(heartStrate.toString())\n                            }.getOrElse {\n                                throw IllegalArgumentException(\n                                    \"Bad auto-login config value for `heartbeatStrategy` for account $id\",\n                                    it\n                                )\n                            }\n                        }\n                        account.configuration[ConfigurationKey.device]?.let { device ->\n                            fileBasedDeviceInfo(device.toString())\n                        }\n\n                        mainLogger.info { \"Auto-login ${account.account}, protocol: ${this.protocol}, heartbeatStrategy: ${this.heartbeatStrategy}\" }\n                    }\n\n                    val bot = when (account.password.kind) {\n                        PLAIN -> {\n                            MiraiConsole.addBot(id, account.password.value, BotConfiguration::configBot)\n                        }\n\n                        MD5 -> {\n                            val md5 = kotlin.runCatching {\n                                account.password.value.hexToBytes()\n                            }.getOrElse {\n                                error(\"Bad auto-login md5: '${account.password.value}' for account $id\")\n                            }\n                            MiraiConsole.addBot(id, md5, BotConfiguration::configBot)\n                        }\n                    }\n\n                    runCatching {\n                        bot.login()\n                    }.onSuccess {\n                        launch {\n                            AutoLoginEvent.Success(bot = bot).broadcast()\n                        }\n                    }.onFailure {\n                        mainLogger.error(it)\n\n                        runCatching {\n                            bot.close()\n                        }.onFailure { err ->\n                            mainLogger.error(\"Error in closing bot\", err)\n                        }\n\n                        launch {\n                            AutoLoginEvent.Failure(bot = bot, cause = it).broadcast()\n                        }\n                    }\n                }\n\n            }\n        }\n\n        val startuped = currentTimeSeconds()\n        phase(\"finally post\") {\n            launch {\n                StartupEvent(timestamp = startuped).broadcast()\n            }\n            globalComponentStorage.useEachExtensions(PostStartupExtension) { it.invoke() }\n        }\n\n        externalImplementation.postStart()\n\n        mainLogger.info { \"mirai-console started successfully.\" }\n    }\n\n    @Suppress(\"SpellCheckingInspection\")\n    @Retention(AnnotationRetention.BINARY)\n    @DslMarker\n    internal annotation class ILoveOmaeKumikoForever\n\n    /**\n     * 表示一个初始化阶段, 无实际作用.\n     */\n    @ILoveOmaeKumikoForever\n    private inline fun phase(phase: String, block: () -> Unit) {\n        contract {\n            callsInPlace(block, InvocationKind.EXACTLY_ONCE)\n        }\n        prePhase(phase)\n        block()\n        postPhase(phase)\n    }\n\n    override fun prePhase(phase: String) {\n        externalImplementation.prePhase(phase)\n    }\n\n    override fun postPhase(phase: String) {\n        externalImplementation.postPhase(phase)\n    }\n}\n\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/auth/ConsoleBotAuthorization.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.internal.auth\n\nimport net.mamoe.mirai.auth.BotAuthInfo\nimport net.mamoe.mirai.auth.BotAuthResult\nimport net.mamoe.mirai.auth.BotAuthSession\nimport net.mamoe.mirai.auth.BotAuthorization\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport java.io.ByteArrayOutputStream\n\ninternal class ConsoleBotAuthorization(\n    private val delegate: suspend (BotAuthSession, BotAuthInfo) -> BotAuthResult,\n) : BotAuthorization {\n\n    override suspend fun authorize(session: BotAuthSession, info: BotAuthInfo): BotAuthResult {\n        return delegate.invoke(session, info)\n    }\n\n    @OptIn(ConsoleFrontEndImplementation::class)\n    override fun calculateSecretsKey(bot: BotAuthInfo): ByteArray {\n        val calc = MiraiConsoleImplementation.getBridge().consoleSecretsCalculator\n\n        val writer = ByteArrayOutputStream()\n\n        writer += calc.consoleKey.asByteArray\n\n        writer += bot.deviceInfo.apn\n        writer += bot.deviceInfo.device\n        writer += bot.deviceInfo.bootId\n        writer += bot.deviceInfo.imsiMd5\n\n        return writer.toByteArray()\n    }\n\n\n    private operator fun ByteArrayOutputStream.plusAssign(data: ByteArray) {\n        write(data)\n    }\n\n    companion object {\n        fun byQRCode(): ConsoleBotAuthorization = ConsoleBotAuthorization { session, _ ->\n            session.authByQRCode()\n        }\n    }\n}\n\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/auth/ConsoleSecretsCalculator.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.internal.auth\n\nimport net.mamoe.mirai.utils.SecretsProtection\nimport net.mamoe.mirai.utils.lateinitMutableProperty\nimport java.io.ByteArrayOutputStream\nimport java.io.DataOutputStream\nimport java.nio.file.Path\nimport java.util.*\nimport kotlin.io.path.createDirectories\nimport kotlin.io.path.isRegularFile\nimport kotlin.io.path.readBytes\nimport kotlin.io.path.writeBytes\n\ninternal class ConsoleSecretsCalculator(\n    private val file: Path,\n) {\n    internal val consoleKey: SecretsProtection.EscapedByteBuffer get() = _consoleKey\n\n    private var _consoleKey: SecretsProtection.EscapedByteBuffer by lateinitMutableProperty {\n        loadOrCreate()\n    }\n\n    fun loadOrCreate(): SecretsProtection.EscapedByteBuffer {\n        if (file.isRegularFile()) {\n            return SecretsProtection.EscapedByteBuffer(file.readBytes())\n        }\n\n        file.parent?.createDirectories()\n        val dataStream = ByteArrayOutputStream()\n        val dataWriter = DataOutputStream(dataStream)\n\n        repeat(3) {\n            dataWriter.writeUTF(UUID.randomUUID().toString())\n        }\n\n        val data = dataStream.toByteArray()\n        file.writeBytes(data)\n        return SecretsProtection.EscapedByteBuffer(data)\n    }\n\n    fun reloadOrCreate() {\n        _consoleKey = loadOrCreate()\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/command/CommandManagerImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ConsoleFrontEndImplementation::class, ConsoleExperimentalApi::class)\n\npackage net.mamoe.mirai.console.internal.command\n\nimport kotlinx.atomicfu.locks.withLock\nimport kotlinx.coroutines.CoroutineScope\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MiraiConsoleImplementation.ConsoleDataScope.Companion.get\nimport net.mamoe.mirai.console.command.*\nimport net.mamoe.mirai.console.command.Command.Companion.allNames\nimport net.mamoe.mirai.console.command.CommandManager.INSTANCE.findDuplicate\nimport net.mamoe.mirai.console.command.descriptor.CommandArgumentParserException\nimport net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors\nimport net.mamoe.mirai.console.command.parse.CommandCallParser.Companion.parseCommandCall\nimport net.mamoe.mirai.console.command.resolve.CommandCallInterceptor.Companion.intercepted\nimport net.mamoe.mirai.console.command.resolve.CommandCallResolver.Companion.resolve\nimport net.mamoe.mirai.console.command.resolve.getOrElse\nimport net.mamoe.mirai.console.internal.data.builtins.DataScope\nimport net.mamoe.mirai.console.internal.util.ifNull\nimport net.mamoe.mirai.console.permission.PermissionService.Companion.testPermission\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.data.toMessageChain\nimport net.mamoe.mirai.utils.childScope\nimport java.lang.reflect.InvocationTargetException\nimport java.util.concurrent.locks.ReentrantLock\nimport kotlin.coroutines.CoroutineContext\n\n@OptIn(ExperimentalCommandDescriptors::class)\ninternal class CommandManagerImpl(\n    parentCoroutineContext: CoroutineContext\n) : CommandManager, CoroutineScope by parentCoroutineContext.childScope(\"CommandManagerImpl\") {\n\n    @Suppress(\"PropertyName\")\n    @JvmField\n    internal val _registeredCommands: MutableList<Command> = mutableListOf()\n\n    @JvmField\n    internal val requiredPrefixCommandMap: MutableMap<String, Command> = mutableMapOf()\n\n    @JvmField\n    internal val optionalPrefixCommandMap: MutableMap<String, Command> = mutableMapOf()\n\n    @JvmField\n    internal val modifyLock = ReentrantLock()\n\n\n    /**\n     * 从原始的 command 中解析出 Command 对象\n     */\n    override fun matchCommand(commandName: String): Command? {\n        if (commandName.startsWith(commandPrefix)) {\n            return requiredPrefixCommandMap[commandName.substringAfter(commandPrefix).lowercase()]\n        }\n        return optionalPrefixCommandMap[commandName.lowercase()]\n    }\n    ///// IMPL\n\n\n    override fun getRegisteredCommands(owner: CommandOwner): List<Command> =\n        _registeredCommands.filter { it.owner == owner }\n\n    override val allRegisteredCommands: List<Command> get() = _registeredCommands.toList() // copy\n    override val commandPrefix: String get() = DataScope.get<CommandConfig>().commandPrefix\n    override fun unregisterAllCommands(owner: CommandOwner) {\n        for (registeredCommand in getRegisteredCommands(owner)) {\n            unregisterCommand(registeredCommand)\n        }\n    }\n\n    override fun registerCommand(command: Command, override: Boolean): Boolean {\n        if (command is CompositeCommand) {\n            command.overloads  // init lazy\n        }\n        kotlin.runCatching {\n            command.permission // init lazy\n            command.secondaryNames // init lazy\n            command.description // init lazy\n            command.usage // init lazy\n        }.onFailure {\n            throw IllegalStateException(\"Failed to init command ${command}.\", it)\n        }\n\n        modifyLock.withLock {\n            if (!override) {\n                if (command.findDuplicate() != null) return false\n            }\n            _registeredCommands.add(command)\n            if (command.prefixOptional) {\n                for (name in command.allNames) {\n                    val lowerCaseName = name.lowercase()\n                    optionalPrefixCommandMap[lowerCaseName] = command\n                    requiredPrefixCommandMap[lowerCaseName] = command\n                }\n            } else {\n                for (name in command.allNames) {\n                    val lowerCaseName = name.lowercase()\n                    optionalPrefixCommandMap.remove(lowerCaseName) // ensure resolution consistency\n                    requiredPrefixCommandMap[lowerCaseName] = command\n                }\n            }\n            return true\n        }\n    }\n\n    override fun findDuplicateCommand(command: Command): Command? =\n        _registeredCommands.firstOrNull { it.allNames intersectsIgnoringCase command.allNames }\n\n    override fun unregisterCommand(command: Command): Boolean = modifyLock.withLock {\n        if (command.prefixOptional) {\n            command.allNames.forEach {\n                optionalPrefixCommandMap.remove(it.lowercase())\n            }\n        }\n        command.allNames.forEach {\n            requiredPrefixCommandMap.remove(it.lowercase())\n        }\n        _registeredCommands.remove(command)\n    }\n\n    override fun isCommandRegistered(command: Command): Boolean = command in _registeredCommands\n}\n\n\n// Don't move into CommandManager, compilation error / VerifyError\n@OptIn(ExperimentalCommandDescriptors::class)\ninternal suspend fun executeCommandImpl(\n    message0: Message,\n    caller: CommandSender,\n    checkPermission: Boolean,\n): CommandExecuteResult {\n    val message = message0\n        .intercepted(caller)\n        .getOrElse { return CommandExecuteResult.Intercepted(null, null, null, it) }\n\n    val call = message.toMessageChain()\n        .parseCommandCall(caller)\n        .ifNull { return CommandExecuteResult.UnresolvedCommand(null) }\n        .let { raw ->\n            raw.intercepted()\n                .getOrElse { return CommandExecuteResult.Intercepted(raw, null, null, it) }\n        }\n\n    val resolved = call\n        .resolve()\n        .getOrElse { return it }\n        .let { raw ->\n            raw.intercepted()\n                .getOrElse { return CommandExecuteResult.Intercepted(call, raw, null, it) }\n        }\n\n    val command = resolved.callee\n\n    if (checkPermission && !command.permission.testPermission(caller)) {\n        return CommandExecuteResult.PermissionDenied(command, call, resolved)\n    }\n\n    return try {\n        resolved.calleeSignature.call(resolved)\n        CommandExecuteResult.Success(resolved.callee, call, resolved)\n    } catch (e: CommandArgumentParserException) {\n        CommandExecuteResult.IllegalArgument(e, resolved.callee, call, resolved)\n    } catch (e: InvocationTargetException) {\n        when (val target = e.cause) {\n            is CommandArgumentParserException -> CommandExecuteResult.IllegalArgument(target, resolved.callee, call, resolved)\n            null -> CommandExecuteResult.ExecutionFailed(e, resolved.callee, call, resolved)\n            else -> CommandExecuteResult.ExecutionFailed(target, resolved.callee, call, resolved)\n        }\n    } catch (e: Throwable) {\n        CommandExecuteResult.ExecutionFailed(e, resolved.callee, call, resolved)\n    }\n}\n\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/command/CommandReflector.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ConsoleExperimentalApi::class)\n\npackage net.mamoe.mirai.console.internal.command\n\nimport net.mamoe.mirai.console.command.*\nimport net.mamoe.mirai.console.command.descriptor.*\nimport net.mamoe.mirai.console.internal.data.classifierAsKClass\nimport net.mamoe.mirai.console.internal.data.classifierAsKClassOrNull\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.PlainText\nimport net.mamoe.mirai.message.data.SingleMessage\nimport net.mamoe.mirai.message.data.buildMessageChain\nimport net.mamoe.mirai.utils.runBIO\nimport kotlin.reflect.*\nimport kotlin.reflect.full.*\n\n\ninternal val ILLEGAL_SUB_NAME_CHARS = \"\\\\/!@#$%^&*()_+-={}[];':\\\",.<>?`~\".toCharArray()\n\ninternal val WORD_DIVIDER = Regex(\"\"\"(?<!\\\\)\\s+\"\"\")                     // 分词的空格\ninternal val ESCAPE_PATTERN = Regex(\"\"\"\\\\(.)\"\"\")                        // 转义符和被转义的符号\ninternal val STOP_PARSE_INDICATOR = Regex(\"\"\"(?<!\\\\)\\s+--\\s+|^--\\s+\"\"\") // 暂停解析符号，前后都有空格，或前为字符串开始\ninternal val QUOTE_BEGIN = Regex(\"\"\"(?<!\\\\)\\s\"|^\\s\"|^\"\"\"\")              // 左双引号，前有一个未转义的空格，或前为字符串开始\ninternal val QUOTE_END = Regex(\"\"\"(?<!\\\\)\"\\s|(?<!\\\\)\"$\"\"\")              // 右双引号，前无转义符，后为空格或字符串结束\n\n// 提取引号包围的原始文本，用空格分割剩余部分，并还原被转义的符号\ninternal fun String.parseParameterTextToList(): List<CharSequence> =\n    if (this.isBlank()) emptyList()\n    else this.split(QUOTE_BEGIN, 2)\n        .flatMapIndexed { index, part -> if (index > 0) part.split(QUOTE_END, 2) else listOf(part) }\n        .let { unquotedTexts ->\n            return if (unquotedTexts.size == 3)\n                unquotedTexts[0].parseParameterTextToList() + listOf(unquotedTexts[1]) +\n                        unquotedTexts[2].parseParameterTextToList()\n            else\n                this@parseParameterTextToList.split(WORD_DIVIDER).filterNot { it.isBlank() }\n                    .map { it.replace(ESCAPE_PATTERN, \"$1\") }.toList()\n        }\n\ninternal fun CharSequence.flattenCommandTextParts(addCallback: (CharSequence) -> Unit) =\n    this.split(STOP_PARSE_INDICATOR, 2).filterNot { it.isBlank() }.let { stopParseParts ->\n        stopParseParts.getOrNull(0)?.parseParameterTextToList()?.forEach(addCallback)\n        stopParseParts.getOrNull(1)?.let(addCallback)\n    }\n\ninternal fun Any.flattenCommandComponents(): MessageChain = buildMessageChain {\n    when (this@flattenCommandComponents) {\n        is PlainText -> this@flattenCommandComponents.content.flattenCommandTextParts { +PlainText(it) }\n        is CharSequence -> this@flattenCommandComponents.flattenCommandTextParts { +PlainText(it) }\n        is SingleMessage -> add(this@flattenCommandComponents)\n        is Array<*> -> this@flattenCommandComponents.forEach { if (it != null) addAll(it.flattenCommandComponents()) }\n        is Iterable<*> -> this@flattenCommandComponents.forEach { if (it != null) addAll(it.flattenCommandComponents()) }\n        else -> add(this@flattenCommandComponents.toString())\n    }\n}\n\n@Suppress(\"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\")\ninternal object CompositeCommandSubCommandAnnotationResolver :\n    SubCommandAnnotationResolver {\n    override fun hasAnnotation(ownerCommand: Command, function: KFunction<*>) =\n        function.hasAnnotation<CompositeCommand.SubCommand>()\n\n    override fun getSubCommandNames(ownerCommand: Command, function: KFunction<*>): Array<out String> {\n        val annotated = function.findAnnotation<CompositeCommand.SubCommand>()!!.value\n        return if (annotated.isEmpty()) arrayOf(function.name)\n        else annotated\n    }\n\n    override fun getAnnotatedName(ownerCommand: Command, parameter: KParameter): String? =\n        parameter.findAnnotation<CompositeCommand.Name>()?.value\n\n    override fun getDescription(ownerCommand: Command, function: KFunction<*>): String? =\n        function.findAnnotation<CompositeCommand.Description>()?.value\n}\n\n@Suppress(\"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\")\ninternal object SimpleCommandSubCommandAnnotationResolver :\n    SubCommandAnnotationResolver {\n    override fun hasAnnotation(ownerCommand: Command, function: KFunction<*>) =\n        function.hasAnnotation<SimpleCommand.Handler>()\n\n    override fun getSubCommandNames(ownerCommand: Command, function: KFunction<*>): Array<out String> =\n        emptyArray()\n\n    override fun getAnnotatedName(ownerCommand: Command, parameter: KParameter): String? =\n        parameter.findAnnotation<SimpleCommand.Name>()?.value\n\n    override fun getDescription(ownerCommand: Command, function: KFunction<*>): String =\n        ownerCommand.description\n}\n\ninternal interface SubCommandAnnotationResolver {\n    fun hasAnnotation(ownerCommand: Command, function: KFunction<*>): Boolean\n    fun getSubCommandNames(ownerCommand: Command, function: KFunction<*>): Array<out String>\n    fun getAnnotatedName(ownerCommand: Command, parameter: KParameter): String?\n    fun getDescription(ownerCommand: Command, function: KFunction<*>): String?\n}\n\n@ConsoleExperimentalApi\npublic class IllegalCommandDeclarationException : Exception {\n    public override val message: String?\n\n    public constructor(\n        ownerCommand: Command,\n        correspondingFunction: KFunction<*>,\n        message: String?,\n    ) : super(\"Illegal command declaration: ${correspondingFunction.name} declared in ${ownerCommand::class.qualifiedName}\") {\n        this.message = message\n    }\n\n    public constructor(\n        ownerCommand: Command,\n        message: String?,\n    ) : super(\"Illegal command declaration: ${ownerCommand::class.qualifiedName}\") {\n        this.message = message\n    }\n}\n\n@OptIn(ExperimentalCommandDescriptors::class)\ninternal class CommandReflector(\n    val command: Command,\n    private val annotationResolver: SubCommandAnnotationResolver,\n) {\n\n    @Suppress(\"NOTHING_TO_INLINE\")\n    private inline fun KFunction<*>.illegalDeclaration(\n        message: String,\n    ): Nothing {\n        throw IllegalCommandDeclarationException(command, this, message)\n    }\n\n    private fun KFunction<*>.isSubCommandFunction(): Boolean = annotationResolver.hasAnnotation(command, this)\n    private fun KFunction<*>.checkExtensionReceiver() {\n        this.extensionReceiverParameter?.let { receiver ->\n            val classifier = receiver.type.classifierAsKClassOrNull()\n            if (classifier != null) {\n                if (!classifier.isSubclassOf(CommandSender::class) && !classifier.isSubclassOf(CommandContext::class)) {\n                    illegalDeclaration(\"Extension receiver parameter type is not subclass of CommandSender nor CommandContext.\")\n                }\n            }\n        }\n    }\n\n    private fun KFunction<*>.checkNames() {\n        val names = annotationResolver.getSubCommandNames(command, this)\n        for (name in names) {\n            ILLEGAL_SUB_NAME_CHARS.find { it in name }?.let {\n                illegalDeclaration(\"'$it' is forbidden in command name.\")\n            }\n        }\n    }\n\n    private fun KFunction<*>.checkModifiers() {\n        if (isInline) illegalDeclaration(\"Command function cannot be inline\")\n        if (visibility == KVisibility.PRIVATE) illegalDeclaration(\"Command function must be accessible from Mirai Console, that is, effectively public.\")\n        if (this.hasAnnotation<JvmStatic>()) illegalDeclaration(\"Command function must not be static.\")\n\n        // should we allow abstract?\n\n        // if (isAbstract) illegalDeclaration(\"Command function cannot be abstract\")\n    }\n\n    fun generateUsage(overloads: Iterable<CommandSignatureFromKFunction>): String {\n        return generateUsage(command, annotationResolver, overloads)\n    }\n\n    companion object {\n        fun generateUsage(\n            command: Command,\n            annotationResolver: SubCommandAnnotationResolver?,\n            overloads: Iterable<CommandSignature>\n        ): String {\n            return overloads.joinToString(\"\\n\") { subcommand ->\n                buildString {\n                    if (command.prefixOptional) {\n                        append(\"(\")\n                        append(CommandManager.commandPrefix)\n                        append(\")\")\n                    } else {\n                        append(CommandManager.commandPrefix)\n                    }\n                    //if (command is CompositeCommand) {\n                    append(command.primaryName)\n                    append(\" \")\n                    //}\n                    append(subcommand.valueParameters.joinToString(\" \") { it.render() })\n                    if (annotationResolver != null && subcommand is CommandSignatureFromKFunction) {\n                        annotationResolver.getDescription(command, subcommand.originFunction)?.let { description ->\n                            append(\"    # \")\n                            append(description)\n                        }\n                    }\n                }\n            }\n        }\n\n        private fun <T> AbstractCommandValueParameter<T>.render(): String {\n            return when (this) {\n                is AbstractCommandValueParameter.Extended,\n                is AbstractCommandValueParameter.UserDefinedType<*>,\n                -> {\n                    val nameToRender = this.name ?: this.type.classifierAsKClass().simpleName\n                    if (isOptional) \"[$nameToRender]\" else \"<$nameToRender>\"\n                }\n                is AbstractCommandValueParameter.StringConstant -> {\n                    this.expectingValue\n                }\n            }\n        }\n    }\n\n    fun validate(signatures: List<CommandSignatureFromKFunctionImpl>) {\n\n        data class ErasedParameterInfo(\n            val index: Int,\n            val name: String?,\n            val type: KType, // ignore nullability\n            val additional: String?,\n        )\n\n        data class ErasedVariantInfo(\n            val receiver: ErasedParameterInfo?,\n            val valueParameters: List<ErasedParameterInfo>,\n        )\n\n        fun CommandParameter<*>.toErasedParameterInfo(index: Int): ErasedParameterInfo {\n            return ErasedParameterInfo(\n                index,\n                this.name,\n                this.type.withNullability(false),\n                if (this is AbstractCommandValueParameter.StringConstant) this.expectingValue else null\n            )\n        }\n\n        val candidates = signatures.map { variant ->\n            variant to ErasedVariantInfo(\n                variant.receiverParameter?.toErasedParameterInfo(0),\n                variant.valueParameters.mapIndexed { index, parameter -> parameter.toErasedParameterInfo(index) }\n            )\n        }\n\n        val groups = candidates.groupBy { it.second }\n\n        val clashes = groups.entries.find { (_, value) ->\n            value.size > 1\n        } ?: return\n\n        throw CommandDeclarationClashException(command, clashes.value.map { it.first })\n    }\n\n    @Throws(IllegalCommandDeclarationException::class)\n    fun findSubCommands(): List<CommandSignatureFromKFunctionImpl> {\n        return command::class.functions // exclude static later\n            .asSequence()\n            .filter { it.isSubCommandFunction() }\n            .onEach { it.checkExtensionReceiver() }\n            .onEach { it.checkModifiers() }\n            .onEach { it.checkNames() }\n            .flatMap { function ->\n                val names = annotationResolver.getSubCommandNames(command, function)\n                if (names.isEmpty()) sequenceOf(createMapEntry(null, function))\n                else names.associateWith { function }.asSequence()\n            }\n            .map { (name, function) ->\n\n                val functionNameAsValueParameter =\n                    name?.split(' ')?.mapIndexed { index, s -> createStringConstantParameterForName(index, s) }\n                        .orEmpty()\n\n                val valueParameters = function.valueParameters.toMutableList()\n                var receiverParameter = function.extensionReceiverParameter\n                if (receiverParameter == null && valueParameters.isNotEmpty()) {\n                    val valueFirstParameter = valueParameters[0]\n                    val classifier = valueFirstParameter.type.classifierAsKClassOrNull()\n                    if (classifier != null && isAcceptableReceiverType(classifier)\n                    ) {\n                        receiverParameter = valueFirstParameter\n                        valueParameters.removeAt(0)\n                    }\n                }\n\n                val functionValueParameters =\n                    valueParameters.associateBy { it.toUserDefinedCommandParameter() }\n\n                CommandSignatureFromKFunctionImpl(\n                    receiverParameter = receiverParameter?.toCommandReceiverParameter(),\n                    valueParameters = functionNameAsValueParameter + functionValueParameters.keys,\n                    originFunction = function\n                ) { call ->\n                    val args = LinkedHashMap<KParameter, Any?>()\n\n                    for ((commandParameter, value) in call.resolvedValueArguments) {\n                        if (commandParameter is AbstractCommandValueParameter.StringConstant) {\n                            continue\n                        }\n                        val functionParameter =\n                            functionValueParameters[commandParameter]\n                                ?: error(\"Could not find a corresponding function parameter '${commandParameter.name}'\")\n                        args[functionParameter] = value\n                    }\n\n                    val instanceParameter = function.instanceParameter\n                    if (instanceParameter != null) {\n                        check(instanceParameter.type.classifierAsKClass().isInstance(command)) {\n                            \"Bad command call resolved. \" +\n                                    \"Function expects instance parameter ${instanceParameter.type} whereas actual instance is ${command::class}.\"\n                        }\n                        args[instanceParameter] = command\n                    }\n\n                    if (receiverParameter != null) {\n\n                        val receiverType = receiverParameter.type.classifierAsKClass()\n\n                        if (receiverType.isSubclassOf(CommandContext::class)) {\n                            args[receiverParameter] = CommandContextImpl(call.caller, call.originalMessage)\n                        } else {\n                            check(receiverType.isInstance(call.caller)) {\n                                \"Bad command call resolved. \" +\n                                        \"Function expects receiver parameter ${receiverParameter.type} whereas actual is ${call.caller::class}.\"\n                            }\n                            args[receiverParameter] = call.caller\n                        }\n\n                    }\n\n                    // mirai-console#341\n                    if (function.isSuspend) {\n                        function.callSuspendBy(args)\n                    } else {\n                        runBIO { function.callBy(args) }\n                    }\n                }\n            }.toList()\n    }\n\n    private fun isAcceptableReceiverType(classifier: KClass<Any>) =\n        classifier.isSubclassOf(CommandSender::class) || classifier.isSubclassOf(CommandContext::class)\n\n    @Suppress(\"SameParameterValue\")\n    private fun <K, V> createMapEntry(key: K, value: V) = object : Map.Entry<K, V> {\n        override val key: K get() = key\n        override val value: V get() = value\n    }\n\n    private fun KParameter.toCommandReceiverParameter(): CommandReceiverParameter<*> {\n        check(!this.isVararg) { \"Receiver cannot be vararg.\" }\n        val classifier = type.classifierAsKClass()\n        return when {\n            classifier.isSubclassOf(CommandSender::class) -> {\n                CommandReceiverParameter.Sender(this.type.isMarkedNullable, this.type)\n            }\n            classifier.isSubclassOf(CommandContext::class) -> {\n                CommandReceiverParameter.Context(this.type.isMarkedNullable, this.type)\n            }\n            else -> {\n                throw IllegalArgumentException(\"Receiver must be subclass of CommandSender or CommandContext\")\n            }\n        }\n    }\n\n    private fun createStringConstantParameterForName(\n        index: Int,\n        expectingValue: String\n    ): AbstractCommandValueParameter.StringConstant {\n        return AbstractCommandValueParameter.StringConstant(\"#$index\", expectingValue, true)\n    }\n\n    private fun KParameter.toUserDefinedCommandParameter(): AbstractCommandValueParameter.UserDefinedType<*> {\n        return AbstractCommandValueParameter.UserDefinedType<Any?>(\n            nameForCommandParameter(),\n            this.isOptional,\n            this.isVararg,\n            this.type\n        ) // Any? is erased\n    }\n\n    private fun KParameter.nameForCommandParameter(): String? =\n        annotationResolver.getAnnotatedName(command, this) ?: this.name\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/command/CommnadConfig.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.internal.command\n\nimport net.mamoe.mirai.console.data.ReadOnlyPluginConfig\nimport net.mamoe.mirai.console.data.ValueDescription\nimport net.mamoe.mirai.console.data.ValueName\nimport net.mamoe.mirai.console.data.value\n\n@ValueDescription(\n    \"\"\"\n    内置指令系统配置\n\"\"\"\n)\ninternal class CommandConfig : ReadOnlyPluginConfig(\"Command\") {\n    @ValueDescription(\n        \"\"\"\n        指令前缀, 默认 \"/\"\n    \"\"\"\n    )\n    @ValueName(\"commandPrefix\")\n    val commandPrefix: String by value(\"/\")\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/command/builtin/LoginCommandImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ConsoleFrontEndImplementation::class, ConsoleExperimentalApi::class)\n\npackage net.mamoe.mirai.console.internal.command.builtin\n\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.launch\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.MiraiConsoleImplementation.ConsoleDataScope.Companion.get\nimport net.mamoe.mirai.console.command.*\nimport net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig\nimport net.mamoe.mirai.console.internal.data.builtins.DataScope\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.console.util.scopeWith\nimport net.mamoe.mirai.message.nextMessageOrNull\nimport net.mamoe.mirai.utils.BotConfiguration\nimport net.mamoe.mirai.utils.Either\nimport net.mamoe.mirai.utils.Either.Companion.flatMapNull\nimport net.mamoe.mirai.utils.Either.Companion.fold\nimport net.mamoe.mirai.utils.hexToBytes\nimport net.mamoe.mirai.utils.secondsToMillis\n\n@Suppress(\"RESTRICTED_CONSOLE_COMMAND_OWNER\") // IDE plugin\ninternal open class LoginCommandImpl : SimpleCommand(\n    ConsoleCommandOwner, \"login\", \"登录\",\n    description = \"登录一个账号\",\n), BuiltInCommandInternal {\n    internal open suspend fun doLogin(bot: Bot) {\n        kotlin.runCatching {\n            bot.login()\n            this\n        }.onFailure { bot.close() }.getOrThrow()\n    } // workaround since LoginCommand is an object\n\n    @Handler\n    suspend fun CommandSender.handle(\n        id: Long,\n        password: String? = null,\n        protocol: BotConfiguration.MiraiProtocol? = null,\n    ) {\n        fun BotConfiguration.setup(protocol: BotConfiguration.MiraiProtocol?): BotConfiguration {\n            val config = DataScope.get<AutoLoginConfig>()\n            val account = config.accounts.firstOrNull { it.account == id.toString() }\n            if (account != null) {\n                account.configuration[AutoLoginConfig.Account.ConfigurationKey.protocol]?.let { proto ->\n                    try {\n                        this.protocol = BotConfiguration.MiraiProtocol.valueOf(proto.toString())\n                    } catch (_: Throwable) {\n                        //\n                    }\n                }\n                account.configuration[AutoLoginConfig.Account.ConfigurationKey.heartbeatStrategy]?.let { heartStrate ->\n                    try {\n                        this.heartbeatStrategy = BotConfiguration.HeartbeatStrategy.valueOf(heartStrate.toString())\n                    } catch (_: Throwable) {\n                        //\n                    }\n                }\n                account.configuration[AutoLoginConfig.Account.ConfigurationKey.device]?.let { device ->\n                    fileBasedDeviceInfo(device.toString())\n                }\n            }\n            if (protocol != null) {\n                this.protocol = protocol\n            }\n            return this\n        }\n\n        fun getPassword(id: Long): Either<ByteArray, String?> {\n            val config = DataScope.get<AutoLoginConfig>()\n            val acc = config.accounts.firstOrNull { it.account == id.toString() } ?: return Either.right(null)\n            val strv = acc.password.value\n            return if (acc.password.kind == AutoLoginConfig.Account.PasswordKind.MD5) Either.left(strv.hexToBytes()) else Either.right(\n                strv\n            )\n        }\n\n        val pwd = Either.right<ByteArray, String?>(password).flatMapNull { getPassword(id) }\n        kotlin.runCatching {\n            pwd.fold(\n                onLeft = { pass ->\n                    MiraiConsole.addBot(id, pass) { setup(protocol) }.also { doLogin(it) }\n                },\n                onRight = { pass ->\n                    if (pass == null) {\n                        sendMessage(\"Could not find '$id' in AutoLogin config. Please specify password.\")\n                        return\n                    }\n                    MiraiConsole.addBot(id, pass) { setup(protocol) }.also { doLogin(it) }\n                }\n            )\n        }.fold(\n            onSuccess = { scopeWith(ConsoleCommandSender).sendMessage(\"${it.nick} ($id) Login successful\") },\n            onFailure = { throwable ->\n                scopeWith(ConsoleCommandSender).sendMessage(\n                    \"Login failed: ${throwable.localizedMessage ?: throwable.message ?: throwable.toString()}\" +\n                            if (this is CommandSenderOnMessage<*>) {\n                                MiraiConsole.launch(CoroutineName(\"stacktrace delayer from Login\")) {\n                                    fromEvent.nextMessageOrNull(60.secondsToMillis) { it.message.contentEquals(\"stacktrace\") }\n                                }\n                                \"\\n 1 分钟内发送 stacktrace 以获取堆栈信息\"\n                            } else \"\"\n                )\n\n                throw throwable\n            }\n        )\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/command/internal.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.internal.command\n\nimport net.mamoe.mirai.console.command.Command\nimport net.mamoe.mirai.console.permission.Permission\nimport net.mamoe.mirai.console.permission.PermissionService\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.Member\nimport kotlin.math.max\nimport kotlin.math.min\n\n\ninternal infix fun Array<out String>.intersectsIgnoringCase(other: Array<out String>): Boolean {\n    val max = this.size.coerceAtMost(other.size)\n    for (i in 0 until max) {\n        if (this[i].equals(other[i], ignoreCase = true)) return true\n    }\n    return false\n}\n\ninternal fun String.fuzzyMatchWith(target: String): Double {\n    if (this == target) {\n        return 1.0\n    }\n    var match = 0\n    for (i in 0..(max(this.lastIndex, target.lastIndex))) {\n        val t = target.getOrNull(match) ?: break\n        if (t == this.getOrNull(i)) {\n            match++\n        }\n    }\n\n    val longerLength = max(this.length, target.length)\n    val shorterLength = min(this.length, target.length)\n\n    return match.toDouble() / (longerLength + (shorterLength - match))\n}\n\n\n/**\n * @return candidates\n */\ninternal fun Group.fuzzySearchMember(\n    nameCardTarget: String,\n    minRate: Double = 0.2, // 参与判断, 用于提示可能的解\n    matchRate: Double = 0.6,// 最终选择的最少需要的匹配率, 减少歧义\n    /**\n     * 如果有多个值超过 [matchRate], 并相互差距小于等于 [disambiguationRate], 则认为有较大歧义风险, 返回可能的解的列表.\n     */\n    disambiguationRate: Double = 0.1,\n): List<Pair<Member, Double>> {\n    val candidates = (this.members.asSequence() + botAsMember)\n        .associateWith { it.nameCard.fuzzyMatchWith(nameCardTarget) }\n        .filter { it.value >= minRate }\n        .toList()\n        .sortedByDescending { it.second }\n\n    val bestMatches = candidates.filter { it.second >= matchRate }\n\n    return when {\n        bestMatches.isEmpty() -> candidates\n        bestMatches.size == 1 -> listOf(bestMatches.single().first to 1.0)\n        else -> {\n            if (bestMatches.first().second - bestMatches.last().second <= disambiguationRate) {\n                // resolution ambiguity\n                candidates\n            } else {\n                listOf(bestMatches.first().first to 1.0)\n            }\n        }\n    }\n}\n\ninternal fun Command.findOrCreateCommandPermission(parent: Permission): Permission {\n    val id = owner.permissionId(\"command.$primaryName\")\n    return PermissionService.INSTANCE[id] ?: PermissionService.INSTANCE.register(id, description, parent)\n}\n\n//// internal\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/data/CompositeValueImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n@file:OptIn(ConsoleExperimentalApi::class)\n\npackage net.mamoe.mirai.console.internal.data\n\nimport net.mamoe.mirai.console.data.*\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\n\n\n// type inference bug\ninternal fun <T> PluginData.createCompositeSetValueImpl(tToValue: (T) -> Value<T>): CompositeSetValueImpl<T> {\n    return object : CompositeSetValueImpl<T>(tToValue) {\n        override fun onChanged() {\n            this@createCompositeSetValueImpl.onValueChanged(this)\n        }\n    }\n}\n\ninternal abstract class CompositeSetValueImpl<T>(\n    tToValue: (T) -> Value<T> // should override onChanged\n) : CompositeSetValue<T>, AbstractValueImpl<Set<T>>() {\n    private val internalSet: MutableSet<Value<T>> = mutableSetOf()\n\n    private var _value: Set<T> = internalSet.shadowMap({ it.value }, tToValue).observable { onChanged() }\n\n    override var value: Set<T>\n        get() = _value\n        set(v) {\n            if (_value != v) {\n                @Suppress(\"LocalVariableName\")\n                val _value = _value as MutableSet<T>\n                _value.clear()\n                _value.addAll(v)\n                onChanged()\n            }\n        }\n\n    override fun setValueBySerializer(value: Set<T>) {\n        val thisValue = this.value\n        if (!thisValue.tryPatch(value)) {\n            this.value = value // deep set\n        }\n    }\n\n    protected abstract fun onChanged()\n    override fun toString(): String = _value.toString()\n    override fun equals(other: Any?): Boolean =\n        other is CompositeSetValueImpl<*> && other::class.java == this::class.java && other._value == this._value\n\n    override fun hashCode(): Int {\n        val value = _value\n        return value.hashCode() * 31 + super.hashCode()\n    }\n}\n\n\n// type inference bug\ninternal fun <T> PluginData.createCompositeListValueImpl(tToValue: (T) -> Value<T>): CompositeListValueImpl<T> {\n    return object : CompositeListValueImpl<T>(tToValue) {\n        override fun onChanged() {\n            this@createCompositeListValueImpl.onValueChanged(this)\n        }\n    }\n}\n\ninternal abstract class CompositeListValueImpl<T>(\n    tToValue: (T) -> Value<T> // should override onChanged\n) : CompositeListValue<T>, AbstractValueImpl<List<T>>() {\n    private val internalList: MutableList<Value<T>> = mutableListOf()\n\n    private val _value: List<T> = internalList.shadowMap({ it.value }, tToValue).observable { onChanged() }\n\n    override var value: List<T>\n        get() = _value\n        set(v) {\n            if (_value != v) {\n                @Suppress(\"LocalVariableName\")\n                val _value = _value as MutableList<T>\n                _value.clear()\n                _value.addAll(v)\n                onChanged()\n            }\n        }\n\n    override fun setValueBySerializer(value: List<T>) {\n        val thisValue = this.value\n        if (!thisValue.tryPatch(value)) {\n            this.value = value // deep set\n        }\n    }\n\n    protected abstract fun onChanged()\n    override fun toString(): String = _value.toString()\n    override fun equals(other: Any?): Boolean =\n        other is CompositeListValueImpl<*> && other::class.java == this::class.java && other._value == this._value\n\n    override fun hashCode(): Int {\n        val value = _value\n        return value.hashCode() * 31 + super.hashCode()\n    }\n}\n\n// workaround to a type inference bug\ninternal fun <K, V> PluginData.createCompositeMapValueImpl(\n    mapInitializer: (() -> MutableMap<Value<K>, Value<V>>?)? = null,\n    kToValue: (K) -> Value<K>,\n    vToValue: (V) -> Value<V>,\n    valueToK: (Value<K>) -> K = Value<K>::value,\n    valueToV: (Value<V>) -> V = Value<V>::value,\n    applyToShadowedMap: ((MutableMap<K, V>) -> (MutableMap<K, V>))? = null\n): CompositeMapValueImpl<K, V> {\n    return object :\n        CompositeMapValueImpl<K, V>(mapInitializer, kToValue, vToValue, valueToK, valueToV, applyToShadowedMap) {\n        override fun onChanged() = this@createCompositeMapValueImpl.onValueChanged(this)\n    }\n}\n\n// TODO: 2020/6/24 在一个 Value 被删除后停止追踪其更新.\n\ninternal abstract class CompositeMapValueImpl<K, V>(\n    mapInitializer: (() -> MutableMap<Value<K>, Value<V>>?)? = null,\n    @JvmField internal val kToValue: (K) -> Value<K>, // should override onChanged\n    @JvmField internal val vToValue: (V) -> Value<V>, // should override onChanged\n    @JvmField internal val valueToK: (Value<K>) -> K = Value<K>::value,\n    @JvmField internal val valueToV: (Value<V>) -> V = Value<V>::value,\n    applyToShadowedMap: ((MutableMap<K, V>) -> (MutableMap<K, V>))? = null\n) : CompositeMapValue<K, V>, AbstractValueImpl<Map<K, V>>() {\n    @JvmField\n    internal val internalList: MutableMap<Value<K>, Value<V>> = mapInitializer?.invoke() ?: mutableMapOf()\n\n    private var _value: MutableMap<K, V> =\n        internalList.shadowMap(valueToK, kToValue, valueToV, vToValue).let {\n            applyToShadowedMap?.invoke(it) ?: it\n        }.observable { onChanged() }\n\n    override var value: Map<K, V>\n        get() = _value\n        set(v) {\n            if (_value != v) {\n                @Suppress(\"LocalVariableName\")\n                val _value = _value\n                _value.clear()\n                _value.putAll(v)\n                onChanged()\n            }\n        }\n\n    override fun setValueBySerializer(value: Map<K, V>) {\n        val thisValue = this.value as MutableMap<K, V>\n        if (!thisValue.tryPatch(value)) {\n            this.value = value // deep set\n        }\n    }\n\n    protected abstract fun onChanged()\n    override fun toString(): String = _value.toString()\n    override fun equals(other: Any?): Boolean =\n        other is CompositeMapValueImpl<*, *> && other::class.java == this::class.java && other._value == this._value\n\n    override fun hashCode(): Int {\n        val value = _value\n        return value.hashCode() * 31 + super.hashCode()\n    }\n}\n\ninternal fun <K, V> MutableMap<K, V>.patchImpl(_new: Map<K, V>) {\n    val new = _new.toMutableMap()\n    val iterator = this.iterator()\n    for (entry in iterator) {\n        val newValue = new.remove(entry.key)\n\n        if (newValue != null) {\n            // has replacer\n            if (entry.value?.tryPatch(newValue) != true) {\n                // patch not supported, or old value is null\n                entry.setValue(newValue)\n            } // else: patched, no remove\n        } else {\n            // no replacer\n            iterator.remove()\n        }\n    }\n    putAll(new)\n}\n\ninternal fun <C : MutableCollection<E>, E> C.patchImpl(_new: Collection<E>) {\n    this.clear()\n    this.addAll(_new)\n}\n\n/**\n * True if successfully patched\n */\n@Suppress(\"UNCHECKED_CAST\")\ninternal fun Any.tryPatch(any: Any): Boolean = when {\n    this is MutableCollection<*> && any is Collection<*> -> {\n        (this as MutableCollection<Any?>).patchImpl(any as Collection<Any?>)\n        true\n    }\n    this is MutableMap<*, *> && any is Map<*, *> -> {\n        (this as MutableMap<Any?, Any?>).patchImpl(any as Map<Any?, Any?>)\n        true\n    }\n    this is Value<*> && any is Value<*> -> any.value?.let { otherValue -> this.value?.tryPatch(otherValue) } == true\n    else -> false\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/data/MemoryPluginDataStorageImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ConsoleExperimentalApi::class)\n\npackage net.mamoe.mirai.console.internal.data\n\nimport net.mamoe.mirai.console.data.MemoryPluginDataStorage\nimport net.mamoe.mirai.console.data.PluginData\nimport net.mamoe.mirai.console.data.PluginDataHolder\nimport net.mamoe.mirai.console.data.PluginDataStorage\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\n\ninternal class MemoryPluginDataStorageImpl : PluginDataStorage, MemoryPluginDataStorage,\n    MutableMap<Class<out PluginData>, PluginData> by mutableMapOf() {\n\n    @Suppress(\"UNCHECKED_CAST\")\n    override fun load(holder: PluginDataHolder, instance: PluginData) {\n        instance.onInit(holder, this)\n    }\n\n    override fun store(holder: PluginDataHolder, instance: PluginData) {\n        // no-op\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/data/MultiFilePluginDataStorageImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ConsoleExperimentalApi::class)\n\npackage net.mamoe.mirai.console.internal.data\n\nimport kotlinx.serialization.json.Json\nimport kotlinx.serialization.modules.plus\nimport net.mamoe.mirai.console.data.MultiFilePluginDataStorage\nimport net.mamoe.mirai.console.data.PluginData\nimport net.mamoe.mirai.console.data.PluginDataHolder\nimport net.mamoe.mirai.console.data.PluginDataStorage\nimport net.mamoe.mirai.console.internal.logging.lazyInitMiraiLogger\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.message.MessageSerializers\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.currentTimeMillis\nimport net.mamoe.yamlkt.Yaml\nimport java.io.File\nimport java.nio.file.Path\n\n@Suppress(\"RedundantVisibilityModifier\") // might be public in the future\ninternal open class MultiFilePluginDataStorageImpl(\n    public final override val directoryPath: Path,\n    private val logger: MiraiLogger = lazyInitMiraiLogger { MiraiLogger.Factory.create(MultiFilePluginDataStorageImpl::class) },\n) : PluginDataStorage, MultiFilePluginDataStorage {\n    init {\n        directoryPath.mkdir()\n    }\n\n    public override fun load(holder: PluginDataHolder, instance: PluginData) {\n        instance.onInit(holder, this)\n\n        // 0xFEFF is BOM, handle UTF8-BOM\n        val file = getPluginDataFile(holder, instance)\n        val text = file.readText().removePrefix(\"\\uFEFF\")\n        if (text.isNotBlank()) {\n            try {\n                when (instance.saveType) {\n                    PluginData.SaveType.YAML -> {\n                        val yaml = createYaml(instance)\n                        yaml.decodeFromString(instance.updaterSerializer, text)\n                    }\n\n                    PluginData.SaveType.JSON -> {\n                        val json = createJson(instance)\n                        json.decodeFromString(instance.updaterSerializer, text)\n                    }\n                }\n            } catch (cause: Throwable) {\n                // backup data file\n                file.copyTo(file.resolveSibling(\"${file.name}.${currentTimeMillis()}.bak\"))\n                throw cause\n            }\n        } else {\n            this.store(holder, instance) // save an initial copy\n        }\n//        logger.verbose { \"Successfully loaded PluginData: ${instance.saveName} (containing ${instance.castOrNull<AbstractPluginData>()?.valueNodes?.size} properties)\" }\n    }\n\n    internal fun getPluginDataFileInternal(holder: PluginDataHolder, instance: PluginData): File {\n        return getPluginDataFile(holder, instance)\n    }\n\n    protected open fun getPluginDataFile(holder: PluginDataHolder, instance: PluginData): File {\n        val name = instance.saveName\n\n        val dir = directoryPath.resolve(holder.dataHolderName)\n        if (dir.isFile) {\n            error(\"Target directory $dir for holder $holder is occupied by a file therefore data ${instance::class.qualifiedNameOrTip} can't be saved.\")\n        }\n        dir.mkdir()\n\n        val file = dir.resolve(\"$name.${instance.saveType.extension}\")\n        if (file.isDirectory) {\n            error(\"Target File $file is occupied by a directory therefore data ${instance::class.qualifiedNameOrTip} can't be saved.\")\n        }\n//        logger.verbose { \"File allocated for ${instance.saveName}: $file\" }\n        return file.toFile().also {\n            it.parentFile?.mkdirs()\n            it.createNewFile()\n        }\n    }\n\n    @ConsoleExperimentalApi\n    public override fun store(holder: PluginDataHolder, instance: PluginData) {\n        getPluginDataFile(holder, instance).writeText(\n            kotlin.runCatching {\n                when (instance.saveType) {\n                    PluginData.SaveType.YAML -> {\n                        val yaml = createYaml(instance)\n                        yaml.encodeToString(instance.updaterSerializer, Unit).also {\n                            yaml.decodeAnyFromString(it) // test yaml\n                        }\n                    }\n\n                    PluginData.SaveType.JSON -> {\n                        val json = createJson(instance)\n                        json.encodeToString(instance.updaterSerializer, Unit).also {\n                            json.decodeFromString(instance.updaterSerializer, it) // test json\n                        }\n                    }\n                }\n            }.recoverCatching {\n                logger.warning(\n                    \"Could not save ${instance.saveName} in ${instance.saveType.name} format due to exception in ${instance.saveType.name} encoder. \" +\n                            \"Please report this exception and relevant configurations to https://github.com/mamoe/mirai/issues/new/choose\",\n                    it\n                )\n\n                if (instance.saveType == PluginData.SaveType.JSON) {\n                    throw it\n                }\n\n                val json = createJson(instance)\n                json.encodeToString(instance.updaterSerializer, Unit).also { string ->\n                    json.decodeFromString(instance.updaterSerializer, string) // test json\n                }\n            }.getOrElse {\n                throw IllegalStateException(\n                    \"Exception while saving $instance, saveName=${instance.saveName} in json format\",\n                    it\n                )\n            }\n        )\n//        logger.verbose { \"Successfully saved PluginData: ${instance.saveName} (containing ${instance.castOrNull<AbstractPluginData>()?.valueNodes?.size} properties)\" }\n    }\n\n    private fun createYaml(instance: PluginData): Yaml {\n        return Yaml {\n            this.serializersModule =\n                MessageSerializers.serializersModule + instance.serializersModule // MessageSerializers.serializersModule is dynamic\n        }\n    }\n\n    private fun createJson(instance: PluginData): Json {\n        return Json {\n            serializersModule =\n                MessageSerializers.serializersModule + instance.serializersModule // MessageSerializers.serializersModule is dynamic\n\n            prettyPrint = true\n            ignoreUnknownKeys = true\n            isLenient = true\n            allowStructuredMapKeys = true\n            encodeDefaults = true\n\n            classDiscriminator = \"#class\"\n        }\n    }\n}\n\ninternal fun Path.mkdir(): Boolean = this.toFile().mkdir()\ninternal val Path.isFile: Boolean get() = this.toFile().isFile\ninternal val Path.isDirectory: Boolean get() = this.toFile().isDirectory"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/data/PluginDataImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\", \"EXPOSED_SUPER_CLASS\")\n@file:OptIn(ConsoleExperimentalApi::class)\n\npackage net.mamoe.mirai.console.internal.data\n\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.builtins.serializer\nimport kotlinx.serialization.descriptors.SerialDescriptor\nimport kotlinx.serialization.encoding.CompositeDecoder\nimport kotlinx.serialization.encoding.Decoder\nimport kotlinx.serialization.encoding.Encoder\nimport net.mamoe.mirai.console.data.AbstractPluginData\nimport net.mamoe.mirai.console.data.AbstractPluginData.ValueNode\nimport net.mamoe.mirai.console.data.PluginData\nimport net.mamoe.mirai.console.data.ValueDescription\nimport net.mamoe.mirai.console.data.ValueName\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.yamlkt.Comment\nimport net.mamoe.yamlkt.YamlNullableDynamicSerializer\nimport java.lang.reflect.Constructor\nimport kotlin.reflect.KAnnotatedElement\n\n/**\n * Internal implementation for [PluginData] including:\n * - Reflection on Kotlin properties and Java fields\n * - Auto-saving\n */\ninternal abstract class PluginDataImpl {\n    init {\n        @Suppress(\"LeakingThis\")\n        check(this is AbstractPluginData)\n    }\n\n    private fun findNodeInstance(name: String): ValueNode<*>? {\n        check(this is AbstractPluginData)\n        return valueNodes.firstOrNull { it.valueName == name }\n    }\n\n    @OptIn(ExperimentalSerializationApi::class)\n    internal open val updaterSerializer: KSerializer<Unit> = object : KSerializer<Unit> {\n        override val descriptor: SerialDescriptor by lazy {\n            check(this@PluginDataImpl is AbstractPluginData)\n            kotlinx.serialization.descriptors.buildClassSerialDescriptor((this@PluginDataImpl as PluginData).saveName) {\n                for (valueNode in valueNodes) valueNode.run {\n                    element(valueName, updaterSerializer.descriptor, annotations = annotations, isOptional = true)\n                }\n            }\n        }\n\n        override fun deserialize(decoder: Decoder) {\n            val descriptor = descriptor\n            with(decoder.beginStructure(descriptor)) {\n                if (runCatching { decodeSequentially() }.getOrElse { false }) {\n                    var index = 0\n                    repeat(decodeCollectionSize(descriptor)) {\n                        val valueName = decodeSerializableElement(descriptor, index++, String.serializer())\n                        val node = findNodeInstance(valueName)\n                        if (node == null) {\n                            decodeSerializableElement(descriptor, index++, YamlNullableDynamicSerializer)\n                        } else {\n                            decodeSerializableElement(descriptor, index++, node.updaterSerializer)\n                        }\n                    }\n                } else {\n                    outerLoop@ while (true) {\n                        innerLoop@ while (true) {\n                            val index = decodeElementIndex(descriptor)\n                            if (index == CompositeDecoder.DECODE_DONE) {\n                                //check(valueName == null) { \"name must be null at this moment.\" }\n                                break@outerLoop\n                            }\n\n                            val node = findNodeInstance(descriptor.getElementName(index))\n                            if (node == null) {\n                                decodeSerializableElement(descriptor, index, YamlNullableDynamicSerializer)\n                            } else {\n                                decodeSerializableElement(descriptor, index, node.updaterSerializer)\n                            }\n\n\n                            break@innerLoop\n                        }\n\n                    }\n                }\n                endStructure(descriptor)\n            }\n        }\n\n        override fun serialize(encoder: Encoder, value: Unit) {\n            check(this@PluginDataImpl is AbstractPluginData)\n\n            val descriptor = descriptor\n            with(encoder.beginStructure(descriptor)) {\n                repeat(descriptor.elementsCount) { index ->\n                    encodeSerializableElement(\n                        descriptor,\n                        index,\n                        valueNodes.find { it.valueName == descriptor.getElementName(index) }?.updaterSerializer\n                            ?: error(\"Cannot find a serializer for ${descriptor.getElementName(index)}\"),\n                        Unit\n                    )\n                }\n                endStructure(descriptor)\n            }\n        }\n\n    }\n}\n\ninternal fun KAnnotatedElement.getAnnotationListForValueSerialization(): List<Annotation> {\n    return this.annotations.mapNotNull {\n        when (it) {\n            is SerialName -> error(\"@SerialName is not supported on Value. Please use @ValueName instead\")\n            is ValueName -> null\n            is ValueDescription -> COMMENT_CONSTRUCTOR(it.value)\n            else -> it\n        }\n    }\n}\n\n\nprivate val COMMENT_CONSTRUCTOR = findAnnotationImplementationClassConstructor<Comment>()!!\n\n@Suppress(\"NOTHING_TO_INLINE\")\ninternal inline operator fun <T : Any?> Constructor<T>.invoke(vararg args: Any?): T = this.newInstance(*args)\n\ninternal inline fun <reified T : Any> findAnnotationImplementationClassConstructor(): Constructor<out T>? {\n    @Suppress(\"UNCHECKED_CAST\")\n    return T::class.nestedClasses\n        .find { it.simpleName?.endsWith(\"Impl\") == true }?.java?.run {\n            constructors.singleOrNull()\n        } as Constructor<out T>?\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/data/_PluginData.value.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ConsoleExperimentalApi::class)\n\npackage net.mamoe.mirai.console.internal.data\n\nimport kotlinx.serialization.builtins.serializer\nimport net.mamoe.mirai.console.data.PluginData\nimport net.mamoe.mirai.console.data.ReferenceValue\nimport net.mamoe.mirai.console.data.SerializerAwareValue\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport kotlin.reflect.KClass\n\n\ninternal object BuiltInSerializerConstants {\n    //// region BuiltInSerializerConstantsPrimitives CODEGEN ////\n\n    @JvmStatic\n    internal val ByteSerializerDescriptor = Byte.serializer().descriptor\n\n    @JvmStatic\n    internal val ShortSerializerDescriptor = Short.serializer().descriptor\n\n    @JvmStatic\n    internal val IntSerializerDescriptor = Int.serializer().descriptor\n\n    @JvmStatic\n    internal val LongSerializerDescriptor = Long.serializer().descriptor\n\n    @JvmStatic\n    internal val FloatSerializerDescriptor = Float.serializer().descriptor\n\n    @JvmStatic\n    internal val DoubleSerializerDescriptor = Double.serializer().descriptor\n\n    @JvmStatic\n    internal val CharSerializerDescriptor = Char.serializer().descriptor\n\n    @JvmStatic\n    internal val BooleanSerializerDescriptor = Boolean.serializer().descriptor\n\n    @JvmStatic\n    internal val StringSerializerDescriptor = String.serializer().descriptor\n\n    //// endregion BuiltInSerializerConstantsPrimitives CODEGEN ////\n}\n\n@Suppress(\"UNCHECKED_CAST\")\ninternal fun <T : Any> PluginData.valueImplPrimitive(kClass: KClass<T>): SerializerAwareValue<T>? {\n    return when (kClass) {\n        //// region PluginData_valueImplPrimitive CODEGEN ////\n\n        Byte::class -> byteValueImpl()\n        Short::class -> shortValueImpl()\n        Int::class -> intValueImpl()\n        Long::class -> longValueImpl()\n        Float::class -> floatValueImpl()\n        Double::class -> doubleValueImpl()\n        Char::class -> charValueImpl()\n        Boolean::class -> booleanValueImpl()\n        String::class -> stringValueImpl()\n\n        //// endregion PluginData_valueImplPrimitive CODEGEN ////\n        else -> error(\"Internal error: unexpected type passed: ${kClass.qualifiedName}\")\n    } as SerializerAwareValue<T>?\n}\n\n\n//// region PluginData_value_PrimitivesImpl CODEGEN ////\n\ninternal fun PluginData.valueImpl(default: Byte): SerializerAwareValue<Byte> {\n    return object : ByteValueImpl(default) {\n        override fun onChanged() = this@valueImpl.onValueChanged(this)\n    }\n}\n\ninternal fun PluginData.byteValueImpl(): SerializerAwareValue<Byte> {\n    return object : ByteValueImpl() {\n        override fun onChanged() = this@byteValueImpl.onValueChanged(this)\n    }\n}\n\ninternal fun PluginData.valueImpl(default: Short): SerializerAwareValue<Short> {\n    return object : ShortValueImpl(default) {\n        override fun onChanged() = this@valueImpl.onValueChanged(this)\n    }\n}\n\ninternal fun PluginData.shortValueImpl(): SerializerAwareValue<Short> {\n    return object : ShortValueImpl() {\n        override fun onChanged() = this@shortValueImpl.onValueChanged(this)\n    }\n}\n\ninternal fun PluginData.valueImpl(default: Int): SerializerAwareValue<Int> {\n    return object : IntValueImpl(default) {\n        override fun onChanged() = this@valueImpl.onValueChanged(this)\n    }\n}\n\ninternal fun PluginData.intValueImpl(): SerializerAwareValue<Int> {\n    return object : IntValueImpl() {\n        override fun onChanged() = this@intValueImpl.onValueChanged(this)\n    }\n}\n\ninternal fun PluginData.valueImpl(default: Long): SerializerAwareValue<Long> {\n    return object : LongValueImpl(default) {\n        override fun onChanged() = this@valueImpl.onValueChanged(this)\n    }\n}\n\ninternal fun PluginData.longValueImpl(): SerializerAwareValue<Long> {\n    return object : LongValueImpl() {\n        override fun onChanged() = this@longValueImpl.onValueChanged(this)\n    }\n}\n\ninternal fun PluginData.valueImpl(default: Float): SerializerAwareValue<Float> {\n    return object : FloatValueImpl(default) {\n        override fun onChanged() = this@valueImpl.onValueChanged(this)\n    }\n}\n\ninternal fun PluginData.floatValueImpl(): SerializerAwareValue<Float> {\n    return object : FloatValueImpl() {\n        override fun onChanged() = this@floatValueImpl.onValueChanged(this)\n    }\n}\n\ninternal fun PluginData.valueImpl(default: Double): SerializerAwareValue<Double> {\n    return object : DoubleValueImpl(default) {\n        override fun onChanged() = this@valueImpl.onValueChanged(this)\n    }\n}\n\ninternal fun PluginData.doubleValueImpl(): SerializerAwareValue<Double> {\n    return object : DoubleValueImpl() {\n        override fun onChanged() = this@doubleValueImpl.onValueChanged(this)\n    }\n}\n\ninternal fun PluginData.valueImpl(default: Char): SerializerAwareValue<Char> {\n    return object : CharValueImpl(default) {\n        override fun onChanged() = this@valueImpl.onValueChanged(this)\n    }\n}\n\ninternal fun PluginData.charValueImpl(): SerializerAwareValue<Char> {\n    return object : CharValueImpl() {\n        override fun onChanged() = this@charValueImpl.onValueChanged(this)\n    }\n}\n\ninternal fun PluginData.valueImpl(default: Boolean): SerializerAwareValue<Boolean> {\n    return object : BooleanValueImpl(default) {\n        override fun onChanged() = this@valueImpl.onValueChanged(this)\n    }\n}\n\ninternal fun PluginData.booleanValueImpl(): SerializerAwareValue<Boolean> {\n    return object : BooleanValueImpl() {\n        override fun onChanged() = this@booleanValueImpl.onValueChanged(this)\n    }\n}\n\ninternal fun PluginData.valueImpl(default: String): SerializerAwareValue<String> {\n    return object : StringValueImpl(default) {\n        override fun onChanged() = this@valueImpl.onValueChanged(this)\n    }\n}\n\ninternal fun PluginData.stringValueImpl(): SerializerAwareValue<String> {\n    return object : StringValueImpl() {\n        override fun onChanged() = this@stringValueImpl.onValueChanged(this)\n    }\n}\n\n//// endregion PluginData_value_PrimitivesImpl CODEGEN ////\n\ninternal class LazyReferenceValueImpl<T> : ReferenceValue<T>, AbstractValueImpl<T>() {\n    private var initialied: Boolean = false\n    private var valueField: T? = null\n\n    @Suppress(\"UNCHECKED_CAST\")\n    override var value: T\n        get() {\n            check(initialied) { \"Internal error: LazyReferenceValueImpl.valueField isn't initialized\" }\n            return valueField as T\n        }\n        set(value) {\n            initialied = true\n            valueField = value\n        }\n\n    override fun toString(): String {\n        return valueField.toString()\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (other === this) return true\n        if (other?.javaClass != this.javaClass) return false\n\n        other as LazyReferenceValueImpl<*>\n        if (other.valueField != valueField) return false\n        return true\n    }\n\n    override fun hashCode(): Int {\n        return valueField?.hashCode() ?: 0\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/data/_PrimitiveValueDeclarations.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ConsoleExperimentalApi::class)\n\npackage net.mamoe.mirai.console.internal.data\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.builtins.serializer\nimport kotlinx.serialization.descriptors.SerialDescriptor\nimport kotlinx.serialization.encoding.Decoder\nimport kotlinx.serialization.encoding.Encoder\nimport net.mamoe.mirai.console.data.*\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\n\n/**\n * The super class to all ValueImpl\n */\ninternal abstract class AbstractValueImpl<T> : Value<T> {\n    open fun setValueBySerializer(value: T) {\n        this.value = value\n    }\n}\n\ninternal fun <T> Value<T>.setValueBySerializer(value: T) {\n    if (this is SerializableValue<T>) {\n        return this.delegate.setValueBySerializer(value)\n    }\n    this.castOrInternalError<AbstractValueImpl<T>>().setValueBySerializer(value)\n}\n\n//// region PrimitiveValuesImpl CODEGEN ////\n\ninternal abstract class ByteValueImpl : ByteValue, SerializerAwareValue<Byte>, KSerializer<Unit>,\n    AbstractValueImpl<Byte> {\n    constructor()\n    constructor(default: Byte) {\n        _value = default\n    }\n\n    private var _value: Byte? = null\n\n    final override var value: Byte\n        get() = _value ?: error(\"ByteValue.value should be initialized before get.\")\n        set(v) {\n            if (v != this._value) {\n                if (this._value == null) {\n                    this._value = v\n                } else {\n                    this._value = v\n                    onChanged()\n                }\n            }\n        }\n\n    protected abstract fun onChanged()\n\n    final override val serializer: KSerializer<Unit> get() = this\n    final override val descriptor: SerialDescriptor get() = BuiltInSerializerConstants.ByteSerializerDescriptor\n    final override fun serialize(encoder: Encoder, value: Unit) = Byte.serializer().serialize(encoder, this.value)\n    final override fun deserialize(decoder: Decoder) = setValueBySerializer(Byte.serializer().deserialize(decoder))\n    override fun toString(): String = _value?.toString() ?: \"ByteValue.value not yet initialized.\"\n    override fun equals(other: Any?): Boolean =\n        other is ByteValueImpl && other::class.java == this::class.java && other._value == this._value\n\n    override fun hashCode(): Int {\n        val value = _value\n        return if (value == null) 1\n        else value.hashCode() * 31\n    }\n}\n\ninternal abstract class ShortValueImpl : ShortValue, SerializerAwareValue<Short>, KSerializer<Unit>,\n    AbstractValueImpl<Short> {\n    constructor()\n    constructor(default: Short) {\n        _value = default\n    }\n\n    private var _value: Short? = null\n\n    final override var value: Short\n        get() = _value ?: error(\"ShortValue.value should be initialized before get.\")\n        set(v) {\n            if (v != this._value) {\n                if (this._value == null) {\n                    this._value = v\n                } else {\n                    this._value = v\n                    onChanged()\n                }\n            }\n        }\n\n    protected abstract fun onChanged()\n\n    final override val serializer: KSerializer<Unit> get() = this\n    final override val descriptor: SerialDescriptor get() = BuiltInSerializerConstants.ShortSerializerDescriptor\n    final override fun serialize(encoder: Encoder, value: Unit) = Short.serializer().serialize(encoder, this.value)\n    final override fun deserialize(decoder: Decoder) = setValueBySerializer(Short.serializer().deserialize(decoder))\n    override fun toString(): String = _value?.toString() ?: \"ShortValue.value not yet initialized.\"\n    override fun equals(other: Any?): Boolean =\n        other is ShortValueImpl && other::class.java == this::class.java && other._value == this._value\n\n    override fun hashCode(): Int {\n        val value = _value\n        return if (value == null) 1\n        else value.hashCode() * 31\n    }\n}\n\ninternal abstract class IntValueImpl : IntValue, SerializerAwareValue<Int>, KSerializer<Unit>, AbstractValueImpl<Int> {\n    constructor()\n    constructor(default: Int) {\n        _value = default\n    }\n\n    private var _value: Int? = null\n\n    final override var value: Int\n        get() = _value ?: error(\"IntValue.value should be initialized before get.\")\n        set(v) {\n            if (v != this._value) {\n                if (this._value == null) {\n                    this._value = v\n                } else {\n                    this._value = v\n                    onChanged()\n                }\n            }\n        }\n\n    protected abstract fun onChanged()\n\n    final override val serializer: KSerializer<Unit> get() = this\n    final override val descriptor: SerialDescriptor get() = BuiltInSerializerConstants.IntSerializerDescriptor\n    final override fun serialize(encoder: Encoder, value: Unit) = Int.serializer().serialize(encoder, this.value)\n    final override fun deserialize(decoder: Decoder) = setValueBySerializer(Int.serializer().deserialize(decoder))\n    override fun toString(): String = _value?.toString() ?: \"IntValue.value not yet initialized.\"\n    override fun equals(other: Any?): Boolean =\n        other is IntValueImpl && other::class.java == this::class.java && other._value == this._value\n\n    override fun hashCode(): Int {\n        val value = _value\n        return if (value == null) 1\n        else value.hashCode() * 31\n    }\n}\n\ninternal abstract class LongValueImpl : LongValue, SerializerAwareValue<Long>, KSerializer<Unit>,\n    AbstractValueImpl<Long> {\n    constructor()\n    constructor(default: Long) {\n        _value = default\n    }\n\n    private var _value: Long? = null\n\n    final override var value: Long\n        get() = _value ?: error(\"LongValue.value should be initialized before get.\")\n        set(v) {\n            if (v != this._value) {\n                if (this._value == null) {\n                    this._value = v\n                } else {\n                    this._value = v\n                    onChanged()\n                }\n            }\n        }\n\n    protected abstract fun onChanged()\n\n    final override val serializer: KSerializer<Unit> get() = this\n    final override val descriptor: SerialDescriptor get() = BuiltInSerializerConstants.LongSerializerDescriptor\n    final override fun serialize(encoder: Encoder, value: Unit) = Long.serializer().serialize(encoder, this.value)\n    final override fun deserialize(decoder: Decoder) = setValueBySerializer(Long.serializer().deserialize(decoder))\n    override fun toString(): String = _value?.toString() ?: \"LongValue.value not yet initialized.\"\n    override fun equals(other: Any?): Boolean =\n        other is LongValueImpl && other::class.java == this::class.java && other._value == this._value\n\n    override fun hashCode(): Int {\n        val value = _value\n        return if (value == null) 1\n        else value.hashCode() * 31\n    }\n}\n\ninternal abstract class FloatValueImpl : FloatValue, SerializerAwareValue<Float>, KSerializer<Unit>,\n    AbstractValueImpl<Float> {\n    constructor()\n    constructor(default: Float) {\n        _value = default\n    }\n\n    private var _value: Float? = null\n\n    final override var value: Float\n        get() = _value ?: error(\"FloatValue.value should be initialized before get.\")\n        set(v) {\n            if (v != this._value) {\n                if (this._value == null) {\n                    this._value = v\n                } else {\n                    this._value = v\n                    onChanged()\n                }\n            }\n        }\n\n    protected abstract fun onChanged()\n\n    final override val serializer: KSerializer<Unit> get() = this\n    final override val descriptor: SerialDescriptor get() = BuiltInSerializerConstants.FloatSerializerDescriptor\n    final override fun serialize(encoder: Encoder, value: Unit) = Float.serializer().serialize(encoder, this.value)\n    final override fun deserialize(decoder: Decoder) = setValueBySerializer(Float.serializer().deserialize(decoder))\n    override fun toString(): String = _value?.toString() ?: \"FloatValue.value not yet initialized.\"\n    override fun equals(other: Any?): Boolean =\n        other is FloatValueImpl && other::class.java == this::class.java && other._value == this._value\n\n    override fun hashCode(): Int {\n        val value = _value\n        return if (value == null) 1\n        else value.hashCode() * 31\n    }\n}\n\ninternal abstract class DoubleValueImpl : DoubleValue, SerializerAwareValue<Double>, KSerializer<Unit>,\n    AbstractValueImpl<Double> {\n    constructor()\n    constructor(default: Double) {\n        _value = default\n    }\n\n    private var _value: Double? = null\n\n    final override var value: Double\n        get() = _value ?: error(\"DoubleValue.value should be initialized before get.\")\n        set(v) {\n            if (v != this._value) {\n                if (this._value == null) {\n                    this._value = v\n                } else {\n                    this._value = v\n                    onChanged()\n                }\n            }\n        }\n\n    protected abstract fun onChanged()\n\n    final override val serializer: KSerializer<Unit> get() = this\n    final override val descriptor: SerialDescriptor get() = BuiltInSerializerConstants.DoubleSerializerDescriptor\n    final override fun serialize(encoder: Encoder, value: Unit) = Double.serializer().serialize(encoder, this.value)\n    final override fun deserialize(decoder: Decoder) = setValueBySerializer(Double.serializer().deserialize(decoder))\n    override fun toString(): String = _value?.toString() ?: \"DoubleValue.value not yet initialized.\"\n    override fun equals(other: Any?): Boolean =\n        other is DoubleValueImpl && other::class.java == this::class.java && other._value == this._value\n\n    override fun hashCode(): Int {\n        val value = _value\n        return if (value == null) 1\n        else value.hashCode() * 31\n    }\n}\n\ninternal abstract class CharValueImpl : CharValue, SerializerAwareValue<Char>, KSerializer<Unit>,\n    AbstractValueImpl<Char> {\n    constructor()\n    constructor(default: Char) {\n        _value = default\n    }\n\n    private var _value: Char? = null\n\n    final override var value: Char\n        get() = _value ?: error(\"CharValue.value should be initialized before get.\")\n        set(v) {\n            if (v != this._value) {\n                if (this._value == null) {\n                    this._value = v\n                } else {\n                    this._value = v\n                    onChanged()\n                }\n            }\n        }\n\n    protected abstract fun onChanged()\n\n    final override val serializer: KSerializer<Unit> get() = this\n    final override val descriptor: SerialDescriptor get() = BuiltInSerializerConstants.CharSerializerDescriptor\n    final override fun serialize(encoder: Encoder, value: Unit) = Char.serializer().serialize(encoder, this.value)\n    final override fun deserialize(decoder: Decoder) = setValueBySerializer(Char.serializer().deserialize(decoder))\n    override fun toString(): String = _value?.toString() ?: \"CharValue.value not yet initialized.\"\n    override fun equals(other: Any?): Boolean =\n        other is CharValueImpl && other::class.java == this::class.java && other._value == this._value\n\n    override fun hashCode(): Int {\n        val value = _value\n        return if (value == null) 1\n        else value.hashCode() * 31\n    }\n}\n\ninternal abstract class BooleanValueImpl : BooleanValue, SerializerAwareValue<Boolean>, KSerializer<Unit>,\n    AbstractValueImpl<Boolean> {\n    constructor()\n    constructor(default: Boolean) {\n        _value = default\n    }\n\n    private var _value: Boolean? = null\n\n    final override var value: Boolean\n        get() = _value ?: error(\"BooleanValue.value should be initialized before get.\")\n        set(v) {\n            if (v != this._value) {\n                if (this._value == null) {\n                    this._value = v\n                } else {\n                    this._value = v\n                    onChanged()\n                }\n            }\n        }\n\n    protected abstract fun onChanged()\n\n    final override val serializer: KSerializer<Unit> get() = this\n    final override val descriptor: SerialDescriptor get() = BuiltInSerializerConstants.BooleanSerializerDescriptor\n    final override fun serialize(encoder: Encoder, value: Unit) = Boolean.serializer().serialize(encoder, this.value)\n    final override fun deserialize(decoder: Decoder) = setValueBySerializer(Boolean.serializer().deserialize(decoder))\n    override fun toString(): String = _value?.toString() ?: \"BooleanValue.value not yet initialized.\"\n    override fun equals(other: Any?): Boolean =\n        other is BooleanValueImpl && other::class.java == this::class.java && other._value == this._value\n\n    override fun hashCode(): Int {\n        val value = _value\n        return if (value == null) 1\n        else value.hashCode() * 31\n    }\n}\n\ninternal abstract class StringValueImpl : StringValue, SerializerAwareValue<String>, KSerializer<Unit>,\n    AbstractValueImpl<String> {\n    constructor()\n    constructor(default: String) {\n        _value = default\n    }\n\n    private var _value: String? = null\n\n    final override var value: String\n        get() = _value ?: error(\"StringValue.value should be initialized before get.\")\n        set(v) {\n            if (v != this._value) {\n                if (this._value == null) {\n                    this._value = v\n                } else {\n                    this._value = v\n                    onChanged()\n                }\n            }\n        }\n\n    protected abstract fun onChanged()\n\n    final override val serializer: KSerializer<Unit> get() = this\n    final override val descriptor: SerialDescriptor get() = BuiltInSerializerConstants.StringSerializerDescriptor\n    final override fun serialize(encoder: Encoder, value: Unit) = String.serializer().serialize(encoder, this.value)\n    final override fun deserialize(decoder: Decoder) = setValueBySerializer(String.serializer().deserialize(decoder))\n    override fun toString(): String = _value ?: \"StringValue.value not yet initialized.\"\n    override fun equals(other: Any?): Boolean =\n        other is StringValueImpl && other::class.java == this::class.java && other._value == this._value\n\n    override fun hashCode(): Int {\n        val value = _value\n        return if (value == null) 1\n        else value.hashCode() * 31\n    }\n}\n\n//// endregion PrimitiveValuesImpl CODEGEN ////\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/data/builtins/AutoLoginConfig.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"EXPOSED_SUPER_CLASS\")\n\npackage net.mamoe.mirai.console.internal.data.builtins\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.console.command.CommandSender\nimport net.mamoe.mirai.console.command.descriptor.CommandValueArgumentParser\nimport net.mamoe.mirai.console.command.descriptor.InternalCommandValueArgumentParserExtensions\nimport net.mamoe.mirai.console.data.AutoSavePluginConfig\nimport net.mamoe.mirai.console.data.ValueDescription\nimport net.mamoe.mirai.console.data.value\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.utils.SecretsProtection\nimport net.mamoe.yamlkt.Comment\nimport net.mamoe.yamlkt.YamlDynamicSerializer\n\n@ConsoleExperimentalApi\n@ValueDescription(\"自动登录配置\")\npublic class AutoLoginConfig : AutoSavePluginConfig(\"AutoLogin\") {\n\n    @Serializable\n    public data class Account(\n        @Comment(\"账号, 现只支持 QQ 数字账号\")\n        val account: String,\n        val password: Password,\n        @Comment(\n            \"\"\"\n            账号配置. 可用配置列表 (注意大小写):\n            protocol: ANDROID_PHONE / ANDROID_PAD / ANDROID_WATCH / MACOS / IPAD\n            device: device.json \n            enable: true\n            heartbeatStrategy: STAT_HB / REGISTER / NONE\n        \"\"\"\n        )\n        val configuration: Map<ConfigurationKey, @Serializable(with = YamlDynamicSerializer::class) Any> = mapOf(),\n    ) {\n        @Serializable\n        public data class Password\n        /** @since 2.10.0 */\n        public constructor(\n            @Comment(\"密码种类, 可选 PLAIN 或 MD5\")\n            val kind: PasswordKind,\n            /** @since 2.10.0 */\n            @SerialName(\"value\")\n            @Comment(\"密码内容, PLAIN 时为密码文本, MD5 时为 16 进制\")\n            val value0: SecretsProtection.EscapedString,\n        ) {\n            public constructor(kind: PasswordKind, value: String) : this(\n                kind,\n                SecretsProtection.EscapedString(SecretsProtection.escape(value.toByteArray())),\n            )\n\n            internal val value: String\n                get() = value0.asString\n        }\n\n        @Suppress(\"EnumEntryName\")\n        @Serializable\n        public enum class ConfigurationKey {\n            protocol,\n            device,\n            enable,\n            heartbeatStrategy,\n\n            ;\n\n            public object Parser : CommandValueArgumentParser<ConfigurationKey>,\n                InternalCommandValueArgumentParserExtensions<ConfigurationKey>() {\n                override fun parse(raw: String, sender: CommandSender): ConfigurationKey {\n                    val key = values().find { it.name.equals(raw, ignoreCase = true) }\n                    if (key != null) return key\n                    illegalArgument(\"未知配置项, 可选值: ${values().joinToString()}\")\n                }\n            }\n        }\n\n        @Serializable\n        public enum class PasswordKind {\n            PLAIN,\n            MD5;\n\n            public object Parser : CommandValueArgumentParser<ConfigurationKey>,\n                InternalCommandValueArgumentParserExtensions<ConfigurationKey>() {\n                override fun parse(raw: String, sender: CommandSender): ConfigurationKey {\n                    val key = ConfigurationKey.values().find { it.name.equals(raw, ignoreCase = true) }\n                    if (key != null) return key\n                    illegalArgument(\"未知配置项, 可选值: ${ConfigurationKey.values().joinToString()}\")\n                }\n            }\n        }\n    }\n\n    public val accounts: MutableList<Account> by value(\n        mutableListOf(\n            Account(\n                account = \"123456\",\n                password = Account.Password(Account.PasswordKind.PLAIN, \"pwd\"),\n                configuration = mapOf(\n                    Account.ConfigurationKey.protocol to \"ANDROID_PHONE\",\n                    Account.ConfigurationKey.device to \"device.json\",\n                    Account.ConfigurationKey.enable to true,\n                    Account.ConfigurationKey.heartbeatStrategy to \"STAT_HB\"\n                )\n            )\n        )\n    )\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/data/builtins/ConsoleDataScopeImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ConsoleFrontEndImplementation::class, ConsoleExperimentalApi::class)\n\npackage net.mamoe.mirai.console.internal.data.builtins\n\nimport kotlinx.coroutines.CoroutineScope\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport net.mamoe.mirai.console.data.AutoSavePluginDataHolder\nimport net.mamoe.mirai.console.data.PluginConfig\nimport net.mamoe.mirai.console.data.PluginData\nimport net.mamoe.mirai.console.data.PluginDataStorage\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.utils.TestOnly\nimport net.mamoe.mirai.utils.childScope\nimport net.mamoe.mirai.utils.minutesToMillis\nimport java.util.concurrent.ConcurrentLinkedQueue\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.reflect.KClass\n\ninternal val DataScope get() = MiraiConsoleImplementation.getBridge().consoleDataScope\n\ninternal class ConsoleDataScopeImpl(\n    parentCoroutineContext: CoroutineContext,\n    private val dataStorage: PluginDataStorage,\n    private val configStorage: PluginDataStorage,\n) : CoroutineScope by parentCoroutineContext.childScope(\"ConsoleDataScope\"),\n    MiraiConsoleImplementation.ConsoleDataScope {\n    override val dataHolder: AutoSavePluginDataHolder = ConsoleBuiltInPluginDataHolder(this.coroutineContext)\n    override val configHolder: AutoSavePluginDataHolder = ConsoleBuiltInPluginConfigHolder(this.coroutineContext)\n\n    private val data: MutableCollection<PluginData> = ConcurrentLinkedQueue() // tentatively make it thread-safe\n    private val configs: MutableCollection<PluginConfig> = ConcurrentLinkedQueue()\n\n    override fun addAndReloadConfig(config: PluginConfig) {\n        configs.add(config)\n        configStorage.load(configHolder, config)\n    }\n\n    override fun <T : PluginData> find(type: KClass<T>): T? {\n        @Suppress(\"UNCHECKED_CAST\")\n        return (data.find { type.isInstance(it) } ?: configs.find { type.isInstance(it) }) as T?\n    }\n\n    /**\n     * Set and override, for tests only.\n     */\n    @TestOnly\n    inline fun <reified T : PluginData> set(value: T) {\n        data.removeIf { value::class.isInstance(it) }\n        data.add(value)\n    }\n\n    override fun reloadAll() {\n        data.forEach { dt ->\n            dataStorage.load(dataHolder, dt)\n        }\n        configs.forEach { config ->\n            configStorage.load(dataHolder, config)\n        }\n    }\n}\n\nprivate class ConsoleBuiltInPluginDataHolder(\n    parentCoroutineContext: CoroutineContext\n) : AutoSavePluginDataHolder,\n    CoroutineScope by parentCoroutineContext.childScope(\"ConsoleBuiltInPluginDataHolder\") {\n    override val autoSaveIntervalMillis: LongRange = 1.minutesToMillis..10.minutesToMillis\n    override val dataHolderName: String get() = \"Console\"\n}\n\nprivate class ConsoleBuiltInPluginConfigHolder(\n    parentCoroutineContext: CoroutineContext\n) : AutoSavePluginDataHolder,\n    CoroutineScope by parentCoroutineContext.childScope(\"ConsoleBuiltInPluginConfigHolder\") {\n    override val autoSaveIntervalMillis: LongRange = 1.minutesToMillis..10.minutesToMillis\n    override val dataHolderName: String get() = \"Console\"\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/data/builtins/EndUserReadmeData.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.internal.data.builtins\n\nimport net.mamoe.mirai.console.data.PluginDataHolder\nimport net.mamoe.mirai.console.data.PluginDataStorage\nimport net.mamoe.mirai.console.data.ReadOnlyPluginConfig\nimport net.mamoe.mirai.console.data.value\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\n\n@OptIn(ConsoleExperimentalApi::class)\ninternal class EndUserReadmeData : ReadOnlyPluginConfig(\"EndUserReadme\") {\n    val data: MutableMap<String, String> by value()\n\n    private lateinit var storage_: PluginDataStorage\n    private lateinit var owner_: PluginDataHolder\n    override fun onInit(owner: PluginDataHolder, storage: PluginDataStorage) {\n        this.storage_ = storage\n        this.owner_ = owner\n    }\n\n    internal fun saveNow() {\n        storage_.store(owner_, this)\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/data/builtins/LoggerConfig.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.internal.data.builtins\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.data.ReadOnlyPluginConfig\nimport net.mamoe.mirai.console.data.ValueDescription\nimport net.mamoe.mirai.console.data.value\nimport net.mamoe.mirai.console.logging.AbstractLoggerController\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\n\n@ConsoleFrontEndImplementation\n@MiraiExperimentalApi\npublic class LoggerConfig : ReadOnlyPluginConfig(\"Logger\") {\n    @ConsoleExperimentalApi\n    @ValueDescription(\n        \"\"\"\n        默认日志输出等级\n        可选值: ALL, VERBOSE, DEBUG, INFO, WARNING, ERROR, NONE\n    \"\"\"\n    )\n    public val defaultPriority: AbstractLoggerController.LogPriority by value(AbstractLoggerController.LogPriority.INFO)\n\n    @ConsoleExperimentalApi\n    @ValueDescription(\n        \"\"\"\n        特定日志记录器输出等级\n    \"\"\"\n    )\n    public val loggers: Map<String, AbstractLoggerController.LogPriority> by value(\n        mapOf(\n            \"example.logger\" to AbstractLoggerController.LogPriority.NONE,\n            \"console.debug\" to AbstractLoggerController.LogPriority.NONE,\n            \"Bot\" to AbstractLoggerController.LogPriority.ALL,\n            \"org.eclipse.aether.internal\" to AbstractLoggerController.LogPriority.INFO,\n            \"org.apache.http.wire\" to AbstractLoggerController.LogPriority.INFO,\n        )\n    )\n\n    @Serializable\n    public class Binding @MiraiExperimentalApi public constructor(\n        public val slf4j: Boolean = true,\n    )\n\n    @ValueDescription(\n        \"\"\"\n            是否启动外部日志框架桥接\n        \"\"\"\n    )\n    public val binding: Binding by value { Binding() }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/data/builtins/PluginDependenciesConfig.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.internal.data.builtins\n\nimport net.mamoe.mirai.console.data.ReadOnlyPluginConfig\nimport net.mamoe.mirai.console.data.ValueDescription\nimport net.mamoe.mirai.console.data.value\n\n@Suppress(\"RemoveExplicitTypeArguments\")\ninternal class PluginDependenciesConfig : ReadOnlyPluginConfig(\"PluginDependencies\") {\n    @ValueDescription(\"远程仓库, 如无必要无需修改\")\n    val repoLoc: List<String> by value(\n        listOf<String>(\n            \"https://maven.aliyun.com/repository/central\",\n            \"https://repo1.maven.org/maven2/\",\n        )\n    )\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/data/collectionUtil.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"DuplicatedCode\")\n\npackage net.mamoe.mirai.console.internal.data\n\nimport java.util.function.BiConsumer\nimport java.util.function.BiFunction\nimport java.util.function.Function\n\n// TODO: 2020/6/24 优化性能: 引入一个 comparator 之类来替代将 Int 包装为 Value<Int> 后进行 containsKey 比较的方法\n\n// java.util.function was used in mirai-core\n// direct improve apis of java.util.function\n\n\n@Suppress(\n    \"MANY_IMPL_MEMBER_NOT_IMPLEMENTED\", \"MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED\",\n    \"UNCHECKED_CAST\", \"USELESS_CAST\", \"ACCIDENTAL_OVERRIDE\", \"TYPE_MISMATCH\",\n    \"NOTHING_TO_OVERRIDE\", \"EXPLICIT_OVERRIDE_REQUIRED_IN_MIXED_MODE\", \"CONFLICTING_INHERITED_JVM_DECLARATIONS\",\n) // for improve java.util.function apis\ninternal open class ShadowMap<K, V, KR, VR>(\n    @JvmField protected val originMapComputer: () -> MutableMap<K, V>,\n    @JvmField protected val kTransform: (K) -> KR,\n    @JvmField protected val kTransformBack: (KR) -> K,\n    @JvmField protected val vTransform: (V) -> VR,\n    @JvmField protected val vTransformBack: (VR) -> V\n) : MutableMap<KR, VR> {\n    override val size: Int get() = originMapComputer().size\n    override fun containsKey(key: KR): Boolean = originMapComputer().containsKey(key.let(kTransformBack))\n    override fun containsValue(value: VR): Boolean = originMapComputer().containsValue(value.let(vTransformBack))\n    override fun get(key: KR): VR? = originMapComputer()[key.let(kTransformBack)]?.let(vTransform)\n    override fun isEmpty(): Boolean = originMapComputer().isEmpty()\n\n    override val entries: MutableSet<MutableMap.MutableEntry<KR, VR>>\n        get() = originMapComputer().entries.shadowMap(\n            transform = { entry: MutableMap.MutableEntry<K, V> ->\n                object : MutableMap.MutableEntry<KR, VR> {\n                    override val key: KR get() = entry.key.let(kTransform)\n                    override val value: VR get() = entry.value.let(vTransform)\n                    override fun setValue(newValue: VR): VR =\n                        entry.setValue(newValue.let(vTransformBack)).let(vTransform)\n\n                    override fun hashCode(): Int = 17 * 31 + (key?.hashCode() ?: 0) + (value?.hashCode() ?: 0)\n                    override fun toString(): String = \"$key=$value\"\n                    override fun equals(other: Any?): Boolean {\n                        if (other == null || other !is Map.Entry<*, *>) return false\n                        return other.key == key && other.value == value\n                    }\n                }\n            } as ((MutableMap.MutableEntry<K, V>) -> MutableMap.MutableEntry<KR, VR>), // type inference bug\n            transformBack = { entry ->\n                object : MutableMap.MutableEntry<K, V> {\n                    override val key: K get() = entry.key.let(kTransformBack)\n                    override val value: V get() = entry.value.let(vTransformBack)\n                    override fun setValue(newValue: V): V =\n                        entry.setValue(newValue.let(vTransform)).let(vTransformBack)\n\n                    override fun hashCode(): Int = 17 * 31 + (key?.hashCode() ?: 0) + (value?.hashCode() ?: 0)\n                    override fun toString(): String = \"$key=$value\"\n                    override fun equals(other: Any?): Boolean {\n                        if (other == null || other !is Map.Entry<*, *>) return false\n                        return other.key == key && other.value == value\n                    }\n                }\n            }\n        )\n    override val keys: MutableSet<KR>\n        get() = originMapComputer().keys.shadowMap(kTransform, kTransformBack)\n    override val values: MutableCollection<VR>\n        get() = originMapComputer().values.shadowMap(vTransform, vTransformBack)\n\n    override fun clear() = originMapComputer().clear()\n    override fun put(key: KR, value: VR): VR? =\n        originMapComputer().put(key.let(kTransformBack), value.let(vTransformBack))?.let(vTransform)\n\n    override fun putAll(from: Map<out KR, VR>) {\n        from.forEach { (kr, vr) ->\n            originMapComputer()[kr.let(kTransformBack)] = vr.let(vTransformBack)\n        }\n    }\n\n    override fun remove(key: KR): VR? = originMapComputer().remove(key.let(kTransformBack))?.let(vTransform)\n    override fun remove(key: KR, value: VR): Boolean =\n        originMapComputer().remove(key.let(kTransformBack), value?.let(vTransformBack))\n\n\n    override fun toString(): String = originMapComputer().toString()\n    override fun hashCode(): Int = originMapComputer().hashCode()\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (javaClass != other?.javaClass) return false\n\n        other as ShadowMap<*, *, *, *>\n\n        if (originMapComputer != other.originMapComputer) return false\n        if (kTransform != other.kTransform) return false\n        if (kTransformBack != other.kTransformBack) return false\n        if (vTransform != other.vTransform) return false\n        if (vTransformBack != other.vTransformBack) return false\n\n        return true\n    }\n\n    override fun putIfAbsent(key: KR, value: VR): VR? =\n        originMapComputer().putIfAbsent(key.let(kTransformBack), value.let(vTransformBack))?.let(vTransform)\n\n    override fun replace(key: KR, oldValue: VR, newValue: VR): Boolean =\n        originMapComputer().replace(key.let(kTransformBack), oldValue.let(vTransformBack), newValue.let(vTransformBack))\n\n    override fun replace(key: KR, value: VR): VR? =\n        originMapComputer().replace(key.let(kTransformBack), value.let(vTransformBack))?.let(vTransform)\n\n    override fun compute(key: KR, remappingFunction: BiFunction<in KR, in VR?, out VR?>): VR? =\n        originMapComputer().compute(key.let(kTransformBack)) { k1, v1 ->\n            remappingFunction.apply(k1.let(kTransform), v1?.let(vTransform))?.let(vTransformBack)\n        }?.let(vTransform)\n\n    override fun computeIfAbsent(key: KR, mappingFunction: Function<in KR, out VR>): VR =\n        originMapComputer().computeIfAbsent(key.let(kTransformBack)) { k ->\n            mappingFunction.apply(k.let(kTransform)).let(vTransformBack)\n        }.let(vTransform)\n\n    @Suppress(\"WRONG_TYPE_PARAMETER_NULLABILITY_FOR_JAVA_OVERRIDE\")\n    override fun computeIfPresent(key: KR, remappingFunction: BiFunction<in KR, in VR, out VR?>): VR? =\n        originMapComputer().computeIfPresent(key.let(kTransformBack)) { k, v ->\n            remappingFunction.apply(k.let(kTransform), v.let(vTransform))?.let(vTransformBack)\n        }?.let(vTransform)\n\n    @Suppress(\"WRONG_TYPE_PARAMETER_NULLABILITY_FOR_JAVA_OVERRIDE\")\n    override fun merge(key: KR, value: VR, remappingFunction: BiFunction<in VR, in VR, out VR?>): VR? {\n        @Suppress(\"NULLABLE_TYPE_PARAMETER_AGAINST_NOT_NULL_TYPE_PARAMETER\")\n        return originMapComputer().merge(key.let(kTransformBack), value.let(vTransformBack)) { k, v ->\n            remappingFunction.apply(k.let(vTransform), v.let(vTransform))?.let(vTransformBack)\n        }?.let(vTransform)\n    }\n\n    override fun forEach(action: BiConsumer<in KR, in VR>) {\n        @Suppress(\"JavaMapForEach\")\n        originMapComputer().forEach { t, u ->\n            action.accept(t.let(kTransform), u.let(vTransform))\n        }\n    }\n\n    override fun replaceAll(function: BiFunction<in KR, in VR, out VR>) {\n        originMapComputer().replaceAll { t, u ->\n            function.apply(t.let(kTransform), u.let(vTransform))?.let(vTransformBack)\n        }\n    }\n}\n\ninternal fun <K, V, KR, VR> MutableMap<K, V>.shadowMap(\n    kTransform: (K) -> KR,\n    kTransformBack: (KR) -> K,\n    vTransform: (V) -> VR,\n    vTransformBack: (VR) -> V\n): MutableMap<KR, VR> = ShadowMap({ this }, kTransform, kTransformBack, vTransform, vTransformBack)\n\n\ninternal inline fun <E, R> MutableCollection<E>.shadowMap(\n    crossinline transform: (E) -> R,\n    crossinline transformBack: (R) -> E\n): MutableCollection<R> {\n    return object : MutableCollection<R> {\n        override val size: Int get() = this@shadowMap.size\n\n        override fun contains(element: R): Boolean = this@shadowMap.any { it.let(transform) == element }\n        override fun containsAll(elements: Collection<R>): Boolean = elements.all(::contains)\n        override fun isEmpty(): Boolean = this@shadowMap.isEmpty()\n        override fun iterator(): MutableIterator<R> = object : MutableIterator<R> {\n            private val delegate = this@shadowMap.iterator()\n            override fun hasNext(): Boolean = delegate.hasNext()\n            override fun next(): R = delegate.next().let(transform)\n            override fun remove() = delegate.remove()\n            override fun toString(): String = delegate.toString()\n            override fun hashCode(): Int = delegate.hashCode()\n        }\n\n        override fun add(element: R): Boolean = this@shadowMap.add(element.let(transformBack))\n\n        override fun addAll(elements: Collection<R>): Boolean = this@shadowMap.addAll(elements.map(transformBack))\n        override fun clear() = this@shadowMap.clear()\n\n        override fun remove(element: R): Boolean = this@shadowMap.removeIf { it.let(transform) == element }\n        override fun removeAll(elements: Collection<R>): Boolean = elements.all(::remove)\n        override fun retainAll(elements: Collection<R>): Boolean =\n            this@shadowMap.retainAll(elements.mapTo(HashSet(elements.size), transformBack))\n\n        override fun toString(): String = this@shadowMap.toString()\n        override fun hashCode(): Int = this@shadowMap.hashCode()\n    }\n}\n\ninternal inline fun <E, R> MutableList<E>.shadowMap(\n    crossinline transform: (E) -> R,\n    crossinline transformBack: (R) -> E\n): MutableList<R> {\n    return object : MutableList<R> {\n        override val size: Int get() = this@shadowMap.size\n\n        override fun contains(element: R): Boolean = this@shadowMap.any { it.let(transform) == element }\n        override fun containsAll(elements: Collection<R>): Boolean = elements.all(::contains)\n        override fun get(index: Int): R = this@shadowMap[index].let(transform)\n        override fun indexOf(element: R): Int = this@shadowMap.indexOfFirst { it.let(transform) == element }\n        override fun isEmpty(): Boolean = this@shadowMap.isEmpty()\n        override fun iterator(): MutableIterator<R> = object : MutableIterator<R> {\n            private val delegate = this@shadowMap.iterator()\n            override fun hasNext(): Boolean = delegate.hasNext()\n            override fun next(): R = delegate.next().let(transform)\n            override fun remove() = delegate.remove()\n            override fun toString(): String = delegate.toString()\n            override fun hashCode(): Int = delegate.hashCode()\n        }\n\n        override fun lastIndexOf(element: R): Int = this@shadowMap.indexOfLast { it.let(transform) == element }\n        override fun add(element: R): Boolean = this@shadowMap.add(element.let(transformBack))\n        override fun add(index: Int, element: R) = this@shadowMap.add(index, element.let(transformBack))\n        override fun addAll(index: Int, elements: Collection<R>): Boolean =\n            this@shadowMap.addAll(index, elements.map(transformBack))\n\n        override fun addAll(elements: Collection<R>): Boolean = this@shadowMap.addAll(elements.map(transformBack))\n        override fun clear() = this@shadowMap.clear()\n\n        override fun listIterator(): MutableListIterator<R> = object : MutableListIterator<R> {\n            private val delegate = this@shadowMap.listIterator()\n            override fun hasPrevious(): Boolean = delegate.hasPrevious()\n            override fun nextIndex(): Int = delegate.nextIndex()\n            override fun previous(): R = delegate.previous().let(transform)\n            override fun previousIndex(): Int = delegate.previousIndex()\n            override fun add(element: R) = delegate.add(element.let(transformBack))\n            override fun hasNext(): Boolean = delegate.hasNext()\n            override fun next(): R = delegate.next().let(transform)\n            override fun remove() = delegate.remove()\n            override fun set(element: R) = delegate.set(element.let(transformBack))\n            override fun toString(): String = delegate.toString()\n            override fun hashCode(): Int = delegate.hashCode()\n        }\n\n        override fun listIterator(index: Int): MutableListIterator<R> = object : MutableListIterator<R> {\n            private val delegate = this@shadowMap.listIterator(index)\n            override fun hasPrevious(): Boolean = delegate.hasPrevious()\n            override fun nextIndex(): Int = delegate.nextIndex()\n            override fun previous(): R = delegate.previous().let(transform)\n            override fun previousIndex(): Int = delegate.previousIndex()\n            override fun add(element: R) = delegate.add(element.let(transformBack))\n            override fun hasNext(): Boolean = delegate.hasNext()\n            override fun next(): R = delegate.next().let(transform)\n            override fun remove() = delegate.remove()\n            override fun set(element: R) = delegate.set(element.let(transformBack))\n            override fun toString(): String = delegate.toString()\n            override fun hashCode(): Int = delegate.hashCode()\n        }\n\n        override fun remove(element: R): Boolean = this@shadowMap.removeIf { it.let(transform) == element }\n        override fun removeAll(elements: Collection<R>): Boolean = elements.all(::remove)\n        override fun removeAt(index: Int): R = this@shadowMap.removeAt(index).let(transform)\n        override fun retainAll(elements: Collection<R>): Boolean = this@shadowMap.retainAll(elements.map(transformBack))\n        override fun set(index: Int, element: R): R =\n            this@shadowMap.set(index, element.let(transformBack)).let(transform)\n\n        override fun subList(fromIndex: Int, toIndex: Int): MutableList<R> =\n            this@shadowMap.subList(fromIndex, toIndex).map(transform).toMutableList()\n\n        override fun toString(): String = this@shadowMap.toString()\n        override fun hashCode(): Int = this@shadowMap.hashCode()\n    }\n}\n\n\ninternal inline fun <E, R> MutableSet<E>.shadowMap(\n    crossinline transform: (E) -> R,\n    crossinline transformBack: (R) -> E\n): MutableSet<R> {\n    return object : MutableSet<R> {\n        override val size: Int get() = this@shadowMap.size\n\n        override fun contains(element: R): Boolean = this@shadowMap.any { it.let(transform) == element }\n        override fun containsAll(elements: Collection<R>): Boolean = elements.all(::contains)\n        override fun isEmpty(): Boolean = this@shadowMap.isEmpty()\n        override fun iterator(): MutableIterator<R> = object : MutableIterator<R> {\n            private val delegate = this@shadowMap.iterator()\n            override fun hasNext(): Boolean = delegate.hasNext()\n            override fun next(): R = delegate.next().let(transform)\n            override fun remove() = delegate.remove()\n            override fun toString(): String = delegate.toString()\n            override fun hashCode(): Int = delegate.hashCode()\n        }\n\n        override fun add(element: R): Boolean = this@shadowMap.add(element.let(transformBack))\n        override fun addAll(elements: Collection<R>): Boolean = this@shadowMap.addAll(elements.map(transformBack))\n        override fun clear() = this@shadowMap.clear()\n\n        override fun remove(element: R): Boolean = this@shadowMap.removeIf { it.let(transform) == element }\n        override fun removeAll(elements: Collection<R>): Boolean = elements.all(::remove)\n        override fun retainAll(elements: Collection<R>): Boolean =\n            this@shadowMap.retainAll(elements.mapTo(HashSet(elements.size), transformBack))\n\n        override fun toString(): String = this@shadowMap.toString()\n        override fun hashCode(): Int = this@shadowMap.hashCode()\n    }\n}\n\n/*\n\ninternal inline fun <T> dynamicList(crossinline supplier: () -> List<T>): List<T> {\n    return object : List<T> {\n        override val size: Int get() = supplier().size\n        override fun contains(element: T): Boolean = supplier().contains(element)\n        override fun containsAll(elements: Collection<T>): Boolean = supplier().containsAll(elements)\n        override fun get(index: Int): T = supplier()[index]\n        override fun indexOf(element: T): Int = supplier().indexOf(element)\n        override fun isEmpty(): Boolean = supplier().isEmpty()\n        override fun iterator(): Iterator<T> = supplier().iterator()\n        override fun lastIndexOf(element: T): Int = supplier().lastIndexOf(element)\n        override fun listIterator(): ListIterator<T> = supplier().listIterator()\n        override fun listIterator(index: Int): ListIterator<T> = supplier().listIterator(index)\n        override fun subList(fromIndex: Int, toIndex: Int): List<T> = supplier().subList(fromIndex, toIndex)\n        override fun toString(): String = supplier().toString()\n        override fun hashCode(): Int = supplier().hashCode()\n    }\n}\n\ninternal inline fun <T> dynamicSet(crossinline supplier: () -> Set<T>): Set<T> {\n    return object : Set<T> {\n        override val size: Int get() = supplier().size\n        override fun contains(element: T): Boolean = supplier().contains(element)\n        override fun containsAll(elements: Collection<T>): Boolean = supplier().containsAll(elements)\n        override fun isEmpty(): Boolean = supplier().isEmpty()\n        override fun iterator(): Iterator<T> = supplier().iterator()\n        override fun toString(): String = supplier().toString()\n        override fun hashCode(): Int = supplier().hashCode()\n    }\n}\n\n\ninternal inline fun <T> dynamicMutableList(crossinline supplier: () -> MutableList<T>): MutableList<T> {\n    return object : MutableList<T> {\n        override val size: Int get() = supplier().size\n        override fun contains(element: T): Boolean = supplier().contains(element)\n        override fun containsAll(elements: Collection<T>): Boolean = supplier().containsAll(elements)\n        override fun get(index: Int): T = supplier()[index]\n        override fun indexOf(element: T): Int = supplier().indexOf(element)\n        override fun isEmpty(): Boolean = supplier().isEmpty()\n        override fun iterator(): MutableIterator<T> = supplier().iterator()\n        override fun lastIndexOf(element: T): Int = supplier().lastIndexOf(element)\n        override fun add(element: T): Boolean = supplier().add(element)\n        override fun add(index: Int, element: T) = supplier().add(index, element)\n        override fun addAll(index: Int, elements: Collection<T>): Boolean = supplier().addAll(index, elements)\n        override fun addAll(elements: Collection<T>): Boolean = supplier().addAll(elements)\n        override fun clear() = supplier().clear()\n        override fun listIterator(): MutableListIterator<T> = supplier().listIterator()\n        override fun listIterator(index: Int): MutableListIterator<T> = supplier().listIterator(index)\n        override fun remove(element: T): Boolean = supplier().remove(element)\n        override fun removeAll(elements: Collection<T>): Boolean = supplier().removeAll(elements)\n        override fun removeAt(index: Int): T = supplier().removeAt(index)\n        override fun retainAll(elements: Collection<T>): Boolean = supplier().retainAll(elements)\n        override fun set(index: Int, element: T): T = supplier().set(index, element)\n        override fun subList(fromIndex: Int, toIndex: Int): MutableList<T> = supplier().subList(fromIndex, toIndex)\n        override fun toString(): String = supplier().toString()\n        override fun hashCode(): Int = supplier().hashCode()\n    }\n}\n\ninternal inline fun <T> dynamicMutableSet(crossinline supplier: () -> MutableSet<T>): MutableSet<T> {\n    return object : MutableSet<T> {\n        override val size: Int get() = supplier().size\n        override fun contains(element: T): Boolean = supplier().contains(element)\n        override fun containsAll(elements: Collection<T>): Boolean = supplier().containsAll(elements)\n        override fun isEmpty(): Boolean = supplier().isEmpty()\n        override fun iterator(): MutableIterator<T> = supplier().iterator()\n        override fun add(element: T): Boolean = supplier().add(element)\n        override fun addAll(elements: Collection<T>): Boolean = supplier().addAll(elements)\n        override fun clear() = supplier().clear()\n        override fun remove(element: T): Boolean = supplier().remove(element)\n        override fun removeAll(elements: Collection<T>): Boolean = supplier().removeAll(elements)\n        override fun retainAll(elements: Collection<T>): Boolean = supplier().retainAll(elements)\n        override fun toString(): String = supplier().toString()\n        override fun hashCode(): Int = supplier().hashCode()\n    }\n}\n*/\n\n@Suppress(\n    \"UNCHECKED_CAST\", \"USELESS_CAST\",\n    \"ACCIDENTAL_OVERRIDE\", \"TYPE_MISMATCH\", \"NOTHING_TO_OVERRIDE\",\n    \"MANY_IMPL_MEMBER_NOT_IMPLEMENTED\", \"MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED\",\n    \"UNCHECKED_CAST\", \"USELESS_CAST\", \"ACCIDENTAL_OVERRIDE\",\n    \"EXPLICIT_OVERRIDE_REQUIRED_IN_MIXED_MODE\", \"CONFLICTING_INHERITED_JVM_DECLARATIONS\",\n    \"WRONG_TYPE_PARAMETER_NULLABILITY_FOR_JAVA_OVERRIDE\", \"NULLABLE_TYPE_PARAMETER_AGAINST_NOT_NULL_TYPE_PARAMETER\"\n) // type inference bug\ninternal fun <K, V> MutableMap<K, V>.observable(onChanged: () -> Unit): MutableMap<K, V> {\n    open class ObservableMap : MutableMap<K, V> by (this as MutableMap<K, V>) {\n        override val keys: MutableSet<K>\n            get() = this@observable.keys.observable(onChanged)\n        override val values: MutableCollection<V>\n            get() = this@observable.values.observable(onChanged)\n        override val entries: MutableSet<MutableMap.MutableEntry<K, V>>\n            get() = this@observable.entries.observable(onChanged)\n\n        override fun clear() = this@observable.clear().also { onChanged() }\n        override fun put(key: K, value: V): V? = this@observable.put(key, value).also { onChanged() }\n        override fun putAll(from: Map<out K, V>) = this@observable.putAll(from).also { onChanged() }\n        override fun remove(key: K): V? = this@observable.remove(key).also { onChanged() }\n        override fun toString(): String = this@observable.toString()\n        override fun hashCode(): Int = this@observable.hashCode()\n        override fun equals(other: Any?): Boolean {\n            if (other == null) return false\n            if (other === this) return true\n            return this@observable == other\n        }\n\n        override fun remove(key: K, value: V): Boolean = this@observable.remove(key, value).also { onChanged() }\n\n        override fun putIfAbsent(key: K, value: V): V? =\n            this@observable.putIfAbsent(key, value).also { onChanged() }\n\n        override fun replace(key: K, oldValue: V, newValue: V): Boolean =\n            this@observable.replace(key, oldValue, newValue).also { onChanged() }\n\n        override fun replace(key: K, value: V): V? =\n            this@observable.replace(key, value).also { onChanged() }\n\n        override fun computeIfAbsent(key: K, mappingFunction: Function<in K, out V>): V =\n            this@observable.computeIfAbsent(key, mappingFunction).also { onChanged() }\n\n        override fun replaceAll(function: BiFunction<in K, in V, out V>) =\n            this@observable.replaceAll(function).also { onChanged() }\n\n        override fun compute(key: K, remappingFunction: BiFunction<in K, in V?, out V?>): V? =\n            this@observable.compute(key, remappingFunction).also { onChanged() }\n\n        override fun computeIfPresent(key: K, remappingFunction: BiFunction<in K, in V, out V?>): V? =\n            this@observable.computeIfPresent(key, remappingFunction).also { onChanged() }\n\n        override fun merge(key: K, value: V, remappingFunction: BiFunction<in V, in V, out V?>): V? =\n            this@observable.merge(key, value, remappingFunction).also { onChanged() }\n    }\n\n    return ObservableMap()\n}\n\ninternal inline fun <T> MutableList<T>.observable(crossinline onChanged: () -> Unit): MutableList<T> {\n    return object : MutableList<T> {\n        override val size: Int get() = this@observable.size\n        override fun contains(element: T): Boolean = this@observable.contains(element)\n        override fun containsAll(elements: Collection<T>): Boolean = this@observable.containsAll(elements)\n        override fun get(index: Int): T = this@observable[index]\n        override fun indexOf(element: T): Int = this@observable.indexOf(element)\n        override fun isEmpty(): Boolean = this@observable.isEmpty()\n        override fun iterator(): MutableIterator<T> = object : MutableIterator<T> {\n            private val delegate = this@observable.iterator()\n            override fun hasNext(): Boolean = delegate.hasNext()\n            override fun next(): T = delegate.next()\n            override fun remove() = delegate.remove().also { onChanged() }\n            override fun toString(): String = delegate.toString()\n            override fun hashCode(): Int = delegate.hashCode()\n        }\n\n        override fun lastIndexOf(element: T): Int = this@observable.lastIndexOf(element)\n        override fun add(element: T): Boolean = this@observable.add(element).also { onChanged() }\n        override fun add(index: Int, element: T) = this@observable.add(index, element).also { onChanged() }\n        override fun addAll(index: Int, elements: Collection<T>): Boolean =\n            this@observable.addAll(index, elements).also { onChanged() }\n\n        override fun addAll(elements: Collection<T>): Boolean = this@observable.addAll(elements).also { onChanged() }\n        override fun clear() = this@observable.clear().also { onChanged() }\n        override fun listIterator(): MutableListIterator<T> = object : MutableListIterator<T> {\n            private val delegate = this@observable.listIterator()\n            override fun hasPrevious(): Boolean = delegate.hasPrevious()\n            override fun nextIndex(): Int = delegate.nextIndex()\n            override fun previous(): T = delegate.previous()\n            override fun previousIndex(): Int = delegate.previousIndex()\n            override fun add(element: T) = delegate.add(element).also { onChanged() }\n            override fun hasNext(): Boolean = delegate.hasNext()\n            override fun next(): T = delegate.next()\n            override fun remove() = delegate.remove().also { onChanged() }\n            override fun set(element: T) = delegate.set(element).also { onChanged() }\n            override fun toString(): String = delegate.toString()\n            override fun hashCode(): Int = delegate.hashCode()\n        }\n\n        override fun listIterator(index: Int): MutableListIterator<T> = object : MutableListIterator<T> {\n            private val delegate = this@observable.listIterator(index)\n            override fun hasPrevious(): Boolean = delegate.hasPrevious()\n            override fun nextIndex(): Int = delegate.nextIndex()\n            override fun previous(): T = delegate.previous()\n            override fun previousIndex(): Int = delegate.previousIndex()\n            override fun add(element: T) = delegate.add(element).also { onChanged() }\n            override fun hasNext(): Boolean = delegate.hasNext()\n            override fun next(): T = delegate.next()\n            override fun remove() = delegate.remove().also { onChanged() }\n            override fun set(element: T) = delegate.set(element).also { onChanged() }\n            override fun toString(): String = delegate.toString()\n            override fun hashCode(): Int = delegate.hashCode()\n        }\n\n        override fun remove(element: T): Boolean = this@observable.remove(element).also { onChanged() }\n        override fun removeAll(elements: Collection<T>): Boolean =\n            this@observable.removeAll(elements).also { onChanged() }\n\n        override fun removeAt(index: Int): T = this@observable.removeAt(index).also { onChanged() }\n        override fun retainAll(elements: Collection<T>): Boolean =\n            this@observable.retainAll(elements).also { onChanged() }\n\n        override fun set(index: Int, element: T): T = this@observable.set(index, element).also { onChanged() }\n        override fun subList(fromIndex: Int, toIndex: Int): MutableList<T> = this@observable.subList(fromIndex, toIndex)\n        override fun toString(): String = this@observable.toString()\n        override fun hashCode(): Int = this@observable.hashCode()\n    }\n}\n\ninternal inline fun <T> MutableCollection<T>.observable(crossinline onChanged: () -> Unit): MutableCollection<T> {\n    return object : MutableCollection<T> {\n        override val size: Int get() = this@observable.size\n        override fun contains(element: T): Boolean = this@observable.contains(element)\n        override fun containsAll(elements: Collection<T>): Boolean = this@observable.containsAll(elements)\n        override fun isEmpty(): Boolean = this@observable.isEmpty()\n        override fun iterator(): MutableIterator<T> = object : MutableIterator<T> {\n            private val delegate = this@observable.iterator()\n            override fun hasNext(): Boolean = delegate.hasNext()\n            override fun next(): T = delegate.next()\n            override fun remove() = delegate.remove().also { onChanged() }\n            override fun toString(): String = delegate.toString()\n            override fun hashCode(): Int = delegate.hashCode()\n        }\n\n        override fun add(element: T): Boolean = this@observable.add(element).also { onChanged() }\n        override fun addAll(elements: Collection<T>): Boolean = this@observable.addAll(elements).also { onChanged() }\n        override fun clear() = this@observable.clear().also { onChanged() }\n        override fun remove(element: T): Boolean = this@observable.remove(element).also { onChanged() }\n        override fun removeAll(elements: Collection<T>): Boolean =\n            this@observable.removeAll(elements.toSet()).also { onChanged() }\n\n        override fun retainAll(elements: Collection<T>): Boolean =\n            this@observable.retainAll(elements.toSet()).also { onChanged() }\n\n        override fun toString(): String = this@observable.toString()\n        override fun hashCode(): Int = this@observable.hashCode()\n    }\n}\n\ninternal inline fun <T> MutableSet<T>.observable(crossinline onChanged: () -> Unit): MutableSet<T> {\n    return object : MutableSet<T> {\n        override val size: Int get() = this@observable.size\n        override fun contains(element: T): Boolean = this@observable.contains(element)\n        override fun containsAll(elements: Collection<T>): Boolean = this@observable.containsAll(elements)\n        override fun isEmpty(): Boolean = this@observable.isEmpty()\n        override fun iterator(): MutableIterator<T> = object : MutableIterator<T> {\n            private val delegate = this@observable.iterator()\n            override fun hasNext(): Boolean = delegate.hasNext()\n            override fun next(): T = delegate.next()\n            override fun remove() = delegate.remove().also { onChanged() }\n            override fun toString(): String = delegate.toString()\n            override fun hashCode(): Int = delegate.hashCode()\n        }\n\n        override fun add(element: T): Boolean = this@observable.add(element).also { onChanged() }\n        override fun addAll(elements: Collection<T>): Boolean = this@observable.addAll(elements).also { onChanged() }\n        override fun clear() = this@observable.clear().also { onChanged() }\n        override fun remove(element: T): Boolean = this@observable.remove(element).also { onChanged() }\n        override fun removeAll(elements: Collection<T>): Boolean =\n            this@observable.removeAll(elements.toSet()).also { onChanged() }\n\n        override fun retainAll(elements: Collection<T>): Boolean =\n            this@observable.retainAll(elements.toSet()).also { onChanged() }\n\n        override fun toString(): String = this@observable.toString()\n        override fun hashCode(): Int = this@observable.hashCode()\n    }\n}\n\n/*\n@OptIn(InternalSerializationApi::class)\ninternal fun <R : Any> Any.smartCastPrimitive(clazz: KClass<R>): R {\n    kotlin.runCatching {\n        return Yaml.default.decodeFromString(clazz.serializer(), this.toString())\n    }.getOrElse {\n        throw IllegalArgumentException(\"Cannot cast '$this' to ${clazz.qualifiedName}\", it)\n    }\n}\n\n*/"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/data/reflectionUtils.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.internal.data\n\nimport net.mamoe.mirai.console.data.PluginData\nimport net.mamoe.mirai.console.data.ValueName\nimport net.mamoe.mirai.utils.createInstanceOrNull\nimport kotlin.reflect.*\nimport kotlin.reflect.full.findAnnotation\nimport kotlin.reflect.full.isSubclassOf\n\ninternal val KClass<*>.qualifiedNameOrTip: String get() = this.qualifiedName ?: \"<anonymous class>\"\n\ninternal inline fun <reified T : Annotation> KAnnotatedElement.hasAnnotation(): Boolean =\n    findAnnotation<T>() != null\n\n@Suppress(\"UNCHECKED_CAST\")\ninternal inline fun <reified T : Any> KType.toKClass(): KClass<out T> {\n    val clazz = requireNotNull(classifier as? KClass<T>) { \"Unsupported classifier: $classifier\" }\n\n    val fromClass = arguments[0].type?.classifier as? KClass<*> ?: Any::class\n    val toClass = T::class\n\n    require(toClass.isSubclassOf(fromClass)) {\n        \"Cannot cast KClass<${fromClass.qualifiedNameOrTip}> to KClass<${toClass.qualifiedNameOrTip}>\"\n    }\n\n    return clazz\n}\n\ninternal inline fun <reified T : PluginData> newPluginDataInstanceUsingReflection(type: KType): T {\n    val classifier = type.toKClass<T>()\n\n    return with(classifier) {\n        objectInstance\n            ?: createInstanceOrNull()\n            ?: throw IllegalArgumentException(\n                \"Cannot create PluginData instance. \" +\n                        \"PluginDataHolder supports PluginData implemented as an object \" +\n                        \"or the ones with a constructor which either has no parameters or all parameters of which are optional, by default newPluginDataInstance implementation.\"\n            )\n    }\n}\n\n\n@Suppress(\"UNCHECKED_CAST\")\ninternal fun KType.classifierAsKClass() = when (val t = classifier) {\n    is KClass<*> -> t\n    else -> error(\"Only KClass supported as classifier, got $t\")\n} as KClass<Any>\n\n@Suppress(\"UNCHECKED_CAST\")\ninternal fun KType.classifierAsKClassOrNull() = when (val t = classifier) {\n    is KClass<*> -> t\n    else -> null\n} as KClass<Any>?\n\n@JvmSynthetic\ninternal fun KClass<*>.findValueName(): String =\n    findAnnotation<ValueName>()?.value\n        ?: qualifiedName\n        ?: throw IllegalArgumentException(\"Cannot find a serial name for $this\")\n\n\ninternal fun Int.isOdd() = this and 0b1 != 0\n\ninternal val KProperty<*>.valueName: String get() = this.findAnnotation<ValueName>()?.value ?: this.name\n\ninternal inline val Any.kClassQualifiedName: String? get() = this::class.qualifiedName\ninternal inline val Any.kClassQualifiedNameOrTip: String get() = this::class.qualifiedNameOrTip"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/data/serializerHelper.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.internal.data\n\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.builtins.*\nimport kotlinx.serialization.descriptors.SerialDescriptor\nimport kotlinx.serialization.encoding.Decoder\nimport kotlinx.serialization.encoding.Encoder\nimport kotlinx.serialization.modules.SerializersModule\nimport kotlinx.serialization.serializer\nimport kotlinx.serialization.serializerOrNull\nimport net.mamoe.mirai.message.MessageSerializers\nimport net.mamoe.yamlkt.YamlDynamicSerializer\nimport net.mamoe.yamlkt.YamlNullableDynamicSerializer\nimport java.lang.reflect.Modifier\nimport kotlin.reflect.KClass\nimport kotlin.reflect.KType\n\n\n@OptIn(ExperimentalSerializationApi::class)\n@Suppress(\"UNCHECKED_CAST\")\ninternal fun SerializersModule.serializerMirai(type: KType): KSerializer<Any?> {\n    fun serializerByKTypeImpl(type: KType): KSerializer<*> {\n        val rootClass = type.classifierAsKClass()\n\n        // In Kotlin 1.6.20, `typeOf<Array<Long>>?.classifier` surprisingly gives kotlin.LongArray\n        // https://youtrack.jetbrains.com/issue/KT-52170/\n        if (type.arguments.size == 1) { // can be typeOf<Array<...>>, so cannot be typeOf<IntArray>\n            val result: KSerializer<Any?>? = when (rootClass) {\n                ByteArray::class -> ArraySerializer(Byte.serializer()).cast()\n                ShortArray::class -> ArraySerializer(Short.serializer()).cast()\n                IntArray::class -> ArraySerializer(Int.serializer()).cast()\n                LongArray::class -> ArraySerializer(Long.serializer()).cast()\n                FloatArray::class -> ArraySerializer(Float.serializer()).cast()\n                DoubleArray::class -> ArraySerializer(Double.serializer()).cast()\n                CharArray::class -> ArraySerializer(Char.serializer()).cast()\n                BooleanArray::class -> ArraySerializer(Boolean.serializer()).cast()\n                else -> null\n            }\n\n            if (result != null) return result\n        }\n\n        this.serializerOrNull(type)?.let { return it } // Kotlin builtin and user-defined\n        MessageSerializers.serializersModule.serializerOrNull(type)?.let { return it } // Mirai Messages\n        if (type.classifier == Any::class) return if (type.isMarkedNullable) YamlNullableDynamicSerializer else YamlDynamicSerializer as KSerializer<Any?>\n\n        val typeArguments = type.arguments\n            .map { requireNotNull(it.type) { \"Star projections in type arguments are not allowed, but had $type\" } }\n        return when {\n            typeArguments.isEmpty() -> this.serializer(type)\n            else -> {\n                val serializers = typeArguments.map(::serializerMirai)\n                when (rootClass) {\n                    Collection::class, List::class, MutableList::class, ArrayList::class -> ListSerializer(serializers[0])\n                    HashSet::class -> SetSerializer(serializers[0])\n                    Set::class, MutableSet::class, LinkedHashSet::class -> SetSerializer(serializers[0])\n                    HashMap::class -> MapSerializer(serializers[0], serializers[1])\n                    Map::class, MutableMap::class, LinkedHashMap::class -> MapSerializer(\n                        serializers[0],\n                        serializers[1]\n                    )\n\n                    Map.Entry::class -> MapEntrySerializer(serializers[0], serializers[1])\n                    Pair::class -> PairSerializer(serializers[0], serializers[1])\n                    Triple::class -> TripleSerializer(serializers[0], serializers[1], serializers[2])\n\n                    Any::class -> if (type.isMarkedNullable) YamlNullableDynamicSerializer else YamlDynamicSerializer\n                    else -> {\n                        if (rootClass.java.isArray) {\n                            return ArraySerializer(\n                                typeArguments[0].classifier as KClass<Any>,\n                                serializers[0]\n                            ).cast()\n                        }\n                        requireNotNull(rootClass.constructSerializerForGivenTypeArgs(*serializers.toTypedArray())) {\n                            \"Can't find a method to construct serializer for type ${rootClass.simpleName}. \" +\n                                    \"Make sure this class is marked as @Serializable or provide serializer explicitly.\"\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    val result = serializerByKTypeImpl(type) as KSerializer<Any>\n    return if (type.isMarkedNullable) result.nullable else result.cast()\n}\n\n\n/**\n * Copied from kotlinx.serialization, modifications are marked with \"/* mamoe modify */\"\n * Copyright 2017-2020 JetBrains s.r.o.\n */\n@Suppress(\n    \"UNCHECKED_CAST\",\n    \"UNSUPPORTED\",\n    \"INVISIBLE_MEMBER\",\n    \"INVISIBLE_REFERENCE\",\n)\nprivate fun <T : Any> KClass<T>.constructSerializerForGivenTypeArgs(vararg args: KSerializer<Any?>): KSerializer<T>? {\n    val jClass = this.java\n    // Search for serializer defined on companion object.\n    val companion =\n        jClass.declaredFields.singleOrNull { it.name == \"Companion\" }?.apply { isAccessible = true }?.get(null)\n    if (companion != null) {\n        val serializer = companion.javaClass.methods\n            .find { method ->\n                method.name == \"serializer\" && method.parameterTypes.size == args.size && method.parameterTypes.all { it == KSerializer::class.java }\n            }\n            ?.invoke(companion, *args) as? KSerializer<T>\n        if (serializer != null) return serializer\n    }\n    // Check whether it's serializable object\n    findObjectSerializer(jClass)?.let { return it }\n    // Search for default serializer if no serializer is defined in companion object.\n    return try {\n        jClass.declaredClasses.singleOrNull { it.simpleName == (\"\\$serializer\") }\n            ?.getField(\"INSTANCE\")?.get(null) as? KSerializer<T>\n    } catch (e: NoSuchFieldException) {\n        null\n    }\n}\n\nprivate fun <T : Any> findObjectSerializer(jClass: Class<T>): KSerializer<T>? {\n    // Check it is an object without using kotlin-reflect\n    val field =\n        jClass.declaredFields.singleOrNull { it.name == \"INSTANCE\" && it.type == jClass && Modifier.isStatic(it.modifiers) }\n            ?: return null\n    // Retrieve its instance and call serializer()\n    val instance = field.get(null)\n    val method =\n        jClass.methods.singleOrNull { it.name == \"serializer\" && it.parameters.isEmpty() && it.returnType == KSerializer::class.java }\n            ?: return null\n    val result = method.invoke(instance)\n    @Suppress(\"UNCHECKED_CAST\")\n    return result as? KSerializer<T>\n}\n\ninternal inline fun <E> KSerializer<E>.bind(\n    crossinline setter: (E) -> Unit,\n    crossinline getter: () -> E\n): KSerializer<E> {\n    return object : KSerializer<E> {\n        override val descriptor: SerialDescriptor get() = this@bind.descriptor\n        override fun deserialize(decoder: Decoder): E = this@bind.deserialize(decoder).also { setter(it) }\n\n        @Suppress(\"UNCHECKED_CAST\")\n        override fun serialize(encoder: Encoder, value: E) =\n            this@bind.serialize(encoder, getter())\n    }\n}\n\ninternal inline fun <E, R> KSerializer<E>.map(\n    crossinline serializer: (R) -> E,\n    crossinline deserializer: (E) -> R\n): KSerializer<R> {\n    return object : KSerializer<R> {\n        override val descriptor: SerialDescriptor get() = this@map.descriptor\n        override fun deserialize(decoder: Decoder): R = this@map.deserialize(decoder).let(deserializer)\n        override fun serialize(encoder: Encoder, value: R) = this@map.serialize(encoder, value.let(serializer))\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/data/valueFromKTypeImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\", \"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\")\n@file:OptIn(ConsoleExperimentalApi::class)\n\npackage net.mamoe.mirai.console.internal.data\n\nimport kotlinx.serialization.KSerializer\nimport net.mamoe.mirai.console.data.PluginData\nimport net.mamoe.mirai.console.data.SerializableValue.Companion.serializableValueWith\nimport net.mamoe.mirai.console.data.SerializerAwareValue\nimport net.mamoe.mirai.console.data.valueFromKType\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.utils.createInstanceOrNull\nimport java.util.concurrent.ConcurrentHashMap\nimport java.util.concurrent.ConcurrentMap\nimport kotlin.contracts.contract\nimport kotlin.reflect.KClass\nimport kotlin.reflect.KType\nimport kotlin.reflect.full.isSubclassOf\n\nprivate val primitiveCollectionsImplemented by lazy {\n    false\n}\n\n@Suppress(\"UnsafeCall\", \"SMARTCAST_IMPOSSIBLE\", \"UNCHECKED_CAST\")\ninternal fun PluginData.valueFromKTypeImpl(type: KType): SerializerAwareValue<*> {\n    val classifier = type.classifier\n    require(classifier is KClass<*>)\n\n    if (classifier.isPrimitiveOrBuiltInSerializableValue()) {\n        return valueImplPrimitive(classifier) as SerializerAwareValue<*>\n    }\n\n    // TODO: 2020/6/24 优化性能: 预先根据类型生成 V -> Value<V> 的 mapper\n\n    when (classifier) {\n        MutableMap::class,\n        Map::class,\n        LinkedHashMap::class,\n        HashMap::class,\n        ConcurrentMap::class,\n        ConcurrentHashMap::class,\n        -> {\n            val keyClass = type.arguments[0].type?.classifier\n            require(keyClass is KClass<*>)\n\n            val valueClass = type.arguments[1].type?.classifier\n            require(valueClass is KClass<*>)\n\n            if (primitiveCollectionsImplemented && keyClass.isPrimitiveOrBuiltInSerializableValue() && valueClass.isPrimitiveOrBuiltInSerializableValue()) {\n                // PrimitiveIntIntMap\n                // ...\n                TODO()\n            } else {\n                return createCompositeMapValueImpl<Any?, Any?>(\n                    mapInitializer = {\n                        if (classifier.cast<KClass<*>>().isSubclassOf(ConcurrentMap::class)) {\n                            ConcurrentHashMap()\n                        } else {\n                            null\n                        }\n                    },\n                    kToValue = { k -> valueFromKType(type.arguments[0].type!!, k) },\n                    vToValue = { v -> valueFromKType(type.arguments[1].type!!, v) }\n                ).serializableValueWith(serializersModule.serializerMirai(type) as KSerializer<Map<Any?, Any?>>) // erased\n            }\n        }\n        MutableList::class,\n        List::class,\n        ArrayList::class\n        -> {\n            val elementClass = type.arguments[0].type?.classifier\n            require(elementClass is KClass<*>)\n\n            if (primitiveCollectionsImplemented && elementClass.isPrimitiveOrBuiltInSerializableValue()) {\n                // PrimitiveIntList\n                // ...\n                TODO()\n            } else {\n                return createCompositeListValueImpl<Any?> { v -> valueFromKType(type.arguments[0].type!!, v) }\n                    .serializableValueWith(serializersModule.serializerMirai(type) as KSerializer<List<Any?>>)\n            }\n        }\n        MutableSet::class,\n        Set::class,\n        LinkedHashSet::class,\n        HashSet::class\n        -> {\n            val elementClass = type.arguments[0].type?.classifier\n            require(elementClass is KClass<*>)\n\n            if (primitiveCollectionsImplemented && elementClass.isPrimitiveOrBuiltInSerializableValue()) {\n                // PrimitiveIntSet\n                // ...\n                TODO()\n            } else {\n                return createCompositeSetValueImpl<Any?> { v -> valueFromKType(type.arguments[0].type!!, v) }\n                    .serializableValueWith(serializersModule.serializerMirai(type) as KSerializer<Set<Any?>>)\n            }\n        }\n        else -> {\n            val serializer = serializersModule.serializerMirai(type)\n            return LazyReferenceValueImpl<Any?>().serializableValueWith(serializer)\n        }\n    }\n}\n\nprivate fun KClass<*>.isReferencingSamePlatformClass(other: KClass<*>): Boolean {\n    return this.qualifiedName == other.qualifiedName // not using .java for\n}\n\ninternal fun KClass<*>.createInstanceSmart(): Any {\n    when {\n        isReferencingSamePlatformClass(Array::class) -> return emptyArray<Any?>()\n    }\n\n    return when (this) {\n        Byte::class -> 0.toByte()\n        Short::class -> 0.toShort()\n        Int::class -> 0\n        Long::class -> 0L\n        Float::class -> 0.toFloat()\n        Double::class -> 0.0\n\n        Boolean::class -> false\n\n        String::class -> \"\"\n\n        MutableMap::class,\n        Map::class,\n        LinkedHashMap::class,\n        HashMap::class\n        -> LinkedHashMap<Any?, Any?>()\n\n        MutableList::class,\n        List::class,\n        ArrayList::class\n        -> ArrayList<Any?>()\n\n        MutableSet::class,\n        Set::class,\n        LinkedHashSet::class,\n        HashSet::class\n        -> LinkedHashSet<Any?>()\n\n        ConcurrentHashMap::class,\n        ConcurrentMap::class,\n        -> ConcurrentHashMap<Any?, Any?>()\n\n        ByteArray::class -> byteArrayOf()\n        BooleanArray::class -> booleanArrayOf()\n        ShortArray::class -> shortArrayOf()\n        IntArray::class -> intArrayOf()\n        LongArray::class -> longArrayOf()\n        FloatArray::class -> floatArrayOf()\n        DoubleArray::class -> doubleArrayOf()\n        CharArray::class -> charArrayOf()\n\n        else -> createInstanceOrNull()\n            ?: error(\"Cannot create instance or find a initial value for ${this.qualifiedNameOrTip}\")\n    }\n}\n\ninternal fun KClass<*>.isPrimitiveOrBuiltInSerializableValue(): Boolean {\n    when (this) {\n        Byte::class, Short::class, Int::class, Long::class,\n        Boolean::class,\n        Char::class, String::class,\n            //Pair::class, Triple::class // TODO: 2020/6/24 支持 PairValue, TripleValue\n        -> return true\n    }\n\n    return false\n}\n\n@PublishedApi\n@Suppress(\"UNCHECKED_CAST\")\ninternal inline fun <reified R> Any.cast(): R {\n    contract {\n        returns() implies (this@cast is R)\n    }\n    return this as R\n}\n\n@PublishedApi\n@Suppress(\"UNCHECKED_CAST\")\ninternal inline fun <reified R> Any.castOrNull(): R? {\n    contract {\n        returnsNotNull() implies (this@castOrNull is R)\n    }\n    return this as? R\n}\n\n@Suppress(\"UNCHECKED_CAST\")\ninternal inline fun <reified R> Any.castOrInternalError(): R {\n    contract {\n        returns() implies (this@castOrInternalError is R)\n    }\n    return (this as? R) ?: error(\"Internal error: ${this::class} cannot be casted to ${R::class}\")\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/enduserreadme/EndUserReadmeProcessor.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.internal.enduserreadme\n\nimport kotlinx.coroutines.runBlocking\nimport kotlinx.coroutines.withTimeoutOrNull\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.command.ConsoleCommandSender\nimport net.mamoe.mirai.console.enduserreadme.EndUserReadme\nimport net.mamoe.mirai.console.events.EndUserReadmeInitializeEvent\nimport net.mamoe.mirai.console.internal.MiraiConsoleImplementationBridge\nimport net.mamoe.mirai.console.internal.data.builtins.EndUserReadmeData\nimport net.mamoe.mirai.console.util.ConsoleInput\nimport net.mamoe.mirai.console.util.sendAnsiMessage\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.sha256\nimport net.mamoe.mirai.utils.toUHexString\nimport java.io.File\nimport java.net.InetAddress\n\ninternal object EndUserReadmeProcessor {\n    private val PADDING = \"=\".repeat(100)\n    private fun StringBuilder.pad(size: Int) {\n        var size0 = size\n\n        while (size0 > 0) {\n            val padded = size0.coerceAtMost(PADDING.length)\n            append(PADDING, 0, padded)\n            size0 -= padded\n        }\n    }\n\n    private fun header(title: String): String {\n        val padding = 100 - title.length\n\n        val lpadding = padding / 2\n        val rpadding = padding - lpadding\n\n        return buildString {\n            pad(lpadding)\n            append(\" [ \").append(title).append(\" ] \")\n            pad(rpadding)\n        }\n    }\n\n    private val systemDefaultNames = hashSetOf<String>(\n        \"ubuntu\", \"debian\", \"arch\",\n        \"centos\", \"fedora\", \"localhost\",\n    )\n\n    private fun getComputerName(): String {\n        System.getenv(\"COMPUTERNAME\")?.takeUnless(String::isBlank)?.let { return it }\n        System.getenv(\"HOSTNAME\")?.takeUnless(String::isBlank)?.let { return it }\n\n        runCatching {\n            InetAddress.getLocalHost().hostName\n                ?.takeIf { it.lowercase() !in systemDefaultNames }\n                ?.takeUnless(String::isBlank)\n                ?.let { return it }\n        }\n\n        runCatching {\n            File(\"/etc/machine-id\").readText().takeUnless(String::isBlank)?.let { return it.trim() }\n        }\n        return \"Unknown Computer\"\n    }\n\n    @OptIn(MiraiInternalApi::class, ConsoleFrontEndImplementation::class)\n    fun process(console: MiraiConsoleImplementationBridge) {\n        if (System.getenv(\"CI\") == \"true\") return\n        if (System.getProperty(\"mirai.console.skip-end-user-readme\") in listOf<String?>(\"\", \"true\", \"yes\")) return\n\n        val pcName = getComputerName()\n        val dataObject = EndUserReadmeData()\n        console.consoleDataScope.addAndReloadConfig(dataObject)\n\n\n        runBlocking {\n            val readme = EndUserReadme()\n            runCatching {\n                EndUserReadmeProcessor::class.java.getResourceAsStream(\"readme.txt\")?.bufferedReader()?.use {\n                    readme.putAll(it.readText())\n                }\n            }.onFailure { console.mainLogger.error(it) }\n\n            EndUserReadmeInitializeEvent(readme).broadcast()\n\n            // region Remove already read\n\n            val pcNameBCode = pcName.toByteArray()\n            var changed = false\n\n            readme.pages.asSequence().map { (key, value) ->\n                return@map key to value.sha256()\n            }.onEach { (_, hash) ->\n                for (i in hash.indices) {\n                    hash[i] = hash[i].toInt().xor(pcNameBCode[i % pcNameBCode.size].toInt()).toByte()\n                }\n            }.map { (k, v) ->\n                return@map k to v.toUHexString()\n            }.toList().forEach { (key, hash) ->\n                if (dataObject.data[key] == hash) {\n                    readme.pages.remove(key)\n                } else {\n                    dataObject.data[key] = hash\n                    changed = true\n                }\n            }\n            // endregion\n\n            suspend fun wait(seconds: Int) {\n                if (seconds < 1) return\n\n                var printWaiting = true\n\n                repeat(seconds) { counter ->\n                    val suffix = (seconds - counter).toString() + \"s\"\n                    withTimeoutOrNull(1000L) {\n                        if (printWaiting) {\n                            ConsoleInput.requestInput(\"Please wait $suffix...\")\n                            printWaiting = false\n                        }\n                        while (true) {\n                            ConsoleInput.requestInput(\"Please read before continuing ($suffix)\")\n                        }\n                    }\n                }\n\n            }\n\n            suspend fun pause() {\n                ConsoleInput.requestInput(\"Enter to continue\")\n            }\n\n            if (readme.pages.isNotEmpty()) {\n                listOf(\n                    header(\"End User Readme\"),\n                    \"最终用户须知有更新，在您继续使用前，您必须完整阅读新的用户须知。\",\n                ).forEach { ConsoleCommandSender.sendMessage(it) }\n            }\n\n            readme.pages.forEach { (category, message) ->\n                ConsoleCommandSender.sendMessage(header(category))\n                message.lines().forEach { command ->\n                    val ctrim = command.trim()\n                    if (ctrim == EndUserReadme.PAUSE) {\n                        pause()\n                    } else if (ctrim == EndUserReadme.DELAY) {\n                        wait(3)\n                    } else if (ctrim.startsWith(EndUserReadme.DELAY)) {\n                        wait(ctrim.removePrefix(EndUserReadme.DELAY).trim().toIntOrNull() ?: 3)\n                    } else {\n                        ConsoleCommandSender.sendAnsiMessage(command)\n                    }\n                }\n                wait(3)\n                pause()\n            }\n\n\n            if (changed) {\n                dataObject.saveNow()\n            }\n\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/extension/ComponentStorageInternal.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ConsoleFrontEndImplementation::class, ConsoleExperimentalApi::class)\n\npackage net.mamoe.mirai.console.internal.extension\n\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport net.mamoe.mirai.console.extension.*\nimport net.mamoe.mirai.console.internal.data.kClassQualifiedNameOrTip\nimport net.mamoe.mirai.console.plugin.Plugin\nimport net.mamoe.mirai.console.plugin.name\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport java.util.*\nimport java.util.concurrent.ConcurrentHashMap\nimport java.util.stream.Stream\nimport kotlin.contracts.contract\n\ninternal class GlobalComponentStorageImpl : AbstractConcurrentComponentStorage()\n\n// source compatibility for <2.11\ninternal val GlobalComponentStorage get() = MiraiConsoleImplementation.getBridge().globalComponentStorage\n\n/**\n * thread-safe.\n */\ninternal abstract class AbstractConcurrentComponentStorage : ComponentStorage, ComponentStorageInternal {\n    ///////////////////////////////////////////////////////////////////////////\n    // registry implementation\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * For each [ExtensionPoint]. thread-safe.\n     */\n    internal class Registries<T : Extension> {\n        @Volatile\n        private var data: MutableCollection<ExtensionRegistry<T>> = ArrayList()\n        private val lock = Any()\n\n        fun register(registry: ExtensionRegistry<T>) {\n            synchronized(lock) {\n                val list = PriorityQueue(\n                    data.size + 1,\n                    Comparator.comparing<ExtensionRegistry<T>, Int> { it.extension.priority }.reversed()\n                )\n                list.addAll(data)\n                list.add(registry)\n                data = list\n            }\n        }\n\n        /**\n         * @return thread-safe Sequence\n         */\n        fun asSequence(): Sequence<ExtensionRegistry<T>> = data.asSequence()\n\n        /**\n         * @return thread-safe Sequence\n         */\n        fun asStream(): Stream<ExtensionRegistry<T>> = data.stream()\n    }\n\n    private val registries: MutableMap<ExtensionPoint<*>, Registries<*>> = ConcurrentHashMap()\n\n    private fun <T : Extension> getRegistries(ep: ExtensionPoint<T>): Registries<T> {\n        @Suppress(\"UNCHECKED_CAST\")\n        return registries.getOrPut(ep) { Registries<T>() } as Registries<T>\n    }\n\n    private fun <T : Extension> registerExtension(ep: ExtensionPoint<T>, registry: ExtensionRegistry<T>) {\n        getRegistries(ep).register(registry)\n    }\n\n\n    ///////////////////////////////////////////////////////////////////////////\n    // public API implementation\n    ///////////////////////////////////////////////////////////////////////////\n\n\n    internal fun mergeWith(another: AbstractConcurrentComponentStorage) {\n        another.registries.forEach { (ep, registries) ->\n            for (extensionRegistry in registries.asSequence()) {\n                @Suppress(\"UNCHECKED_CAST\")\n                ep as ExtensionPoint<Extension>\n                registerExtension(ep, ExtensionRegistryImpl(extensionRegistry.plugin) { extensionRegistry.extension })\n            }\n        }\n    }\n\n    internal inline fun <T : Extension> useEachExtensions(\n        extensionPoint: ExtensionPoint<T>,\n        block: ExtensionRegistry<T>.(instance: T) -> Unit\n    ) {\n        contract { callsInPlace(block) }\n        getExtensions(extensionPoint).forEach { registry ->\n            val plugin = registry.plugin\n            val extension = registry.extension\n            kotlin.runCatching {\n                block.invoke(registry, registry.extension)\n            }.getOrElse { throwable ->\n                extensionPoint.throwExtensionException(extension, plugin, throwable)\n            }\n        }\n    }\n\n    internal inline fun <T : Extension, E> foldExtensions(\n        extensionPoint: ExtensionPoint<T>,\n        initial: E,\n        block: (acc: E, extension: T) -> E,\n    ): E {\n        contract { callsInPlace(block) }\n        var e: E = initial\n        getExtensions(extensionPoint).forEach { registry ->\n            val plugin = registry.plugin\n            val extension = registry.extension\n            kotlin.runCatching {\n                e = block.invoke(e, extension)\n            }.getOrElse { throwable ->\n                extensionPoint.throwExtensionException(extension, plugin, throwable)\n            }\n        }\n        return e\n    }\n\n    internal fun <T : Extension> ExtensionPoint<out T>.throwExtensionException(\n        extension: T,\n        plugin: Plugin?,\n        throwable: Throwable,\n    ): Nothing {\n        throw ExtensionException(\n            \"Exception while executing extension '${extension.kClassQualifiedNameOrTip}' provided by plugin '${plugin?.name ?: \"<builtin>\"}', registered for '${this.extensionType.qualifiedName}'\",\n            throwable\n        )\n    }\n\n    override fun <E : Extension> contribute(\n        extensionPoint: ExtensionPoint<E>,\n        plugin: Plugin,\n        extensionInstance: E,\n    ) {\n        registerExtension(extensionPoint, ExtensionRegistryImpl(plugin) { extensionInstance })\n    }\n\n    override fun <E : Extension> contributeConsole(extensionPoint: ExtensionPoint<E>, lazyInstance: () -> E) {\n        registerExtension(extensionPoint, ExtensionRegistryImpl(null, lazyInstance))\n    }\n\n    override fun <E : Extension> contribute(\n        extensionPoint: ExtensionPoint<E>,\n        plugin: Plugin,\n        lazyInstance: () -> E,\n    ) {\n        registerExtension(extensionPoint, ExtensionRegistryImpl(plugin, lazyInstance))\n    }\n\n    override fun <E : Extension> getExtensions(extensionPoint: ExtensionPoint<E>): Sequence<ExtensionRegistry<E>> {\n        return getRegistries(extensionPoint).asSequence()\n    }\n\n    override fun <E : Extension> getExtensionsStream(extensionPoint: ExtensionPoint<E>): Stream<ExtensionRegistry<E>> {\n        return getRegistries(extensionPoint).asStream()\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/extension/SingletonExtensionSelectorImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"DEPRECATION_ERROR\")\n@file:OptIn(ConsoleInternalApi::class)\n\npackage net.mamoe.mirai.console.internal.extension\n\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.data.AutoSavePluginConfig\nimport net.mamoe.mirai.console.data.value\nimport net.mamoe.mirai.console.extension.Extension\nimport net.mamoe.mirai.console.extensions.SingletonExtensionSelector\nimport net.mamoe.mirai.console.internal.data.kClassQualifiedName\nimport net.mamoe.mirai.console.plugin.name\nimport net.mamoe.mirai.console.util.ConsoleInput\nimport net.mamoe.mirai.console.util.ConsoleInternalApi\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport net.mamoe.mirai.utils.info\nimport kotlin.reflect.KClass\n\n@Deprecated(\n    \"Order of extensions is not determined by its priority property since 2.11. SingletonExtensionSelector is not needed anymore. \",\n    level = DeprecationLevel.HIDDEN\n)\n@DeprecatedSinceMirai(warningSince = \"2.11\", errorSince = \"2.13\", hiddenSince = \"2.14\")\ninternal object SingletonExtensionSelectorImpl : SingletonExtensionSelector {\n\n    internal val config: SaveData = SaveData()\n\n    internal class SaveData : AutoSavePluginConfig(\"ExtensionSelector\") {\n        val value: MutableMap<String, String> by value()\n    }\n\n    override fun <T : Extension> selectSingleton(\n        extensionType: KClass<T>,\n        candidates: Collection<SingletonExtensionSelector.Registry<T>>,\n    ): T? = when {\n        candidates.isEmpty() -> null\n        candidates.size == 1 -> candidates.single().extension\n        else -> kotlin.run {\n            val target = config.value[extensionType.qualifiedName!!]\n                ?: return promptForSelectionAndSave(extensionType, candidates)\n\n            val found = candidates.firstOrNull { it.extension::class.qualifiedName == target }?.extension\n                ?: return promptForSelectionAndSave(extensionType, candidates)\n\n            found\n        }\n    }\n\n    private fun <T : Extension> promptForSelectionAndSave(\n        extensionType: KClass<T>,\n        candidates: Collection<SingletonExtensionSelector.Registry<T>>,\n    ) = promptForManualSelection(extensionType, candidates)\n        .also { config.value[extensionType.qualifiedName!!] = it.extension.kClassQualifiedName!! }.extension\n\n    private fun <T : Extension> promptForManualSelection(\n        extensionType: KClass<T>,\n        candidates: Collection<SingletonExtensionSelector.Registry<T>>,\n    ): SingletonExtensionSelector.Registry<T> {\n        MiraiConsole.mainLogger.info { \"There are multiple ${extensionType.simpleName}s, please select one:\" }\n\n        val candidatesList = candidates.toList()\n\n        for ((index, candidate) in candidatesList.withIndex()) {\n            MiraiConsole.mainLogger.info { \"${index + 1}. '${candidate.extension}' from '${candidate.plugin?.name ?: \"<builtin>\"}'\" }\n        }\n\n        MiraiConsole.mainLogger.info { \"Please choose a number from 1 to ${candidatesList.count()}\" }\n\n        val choiceStr = runBlocking { ConsoleInput.requestInput(\"Your choice: \") }\n\n        val choice = choiceStr.toIntOrNull() ?: error(\"Bad choice\")\n\n        return candidatesList[choice - 1]\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/logging/LazyInitMiraiLogger.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.internal.logging\n\nimport me.him188.kotlin.dynamic.delegation.dynamicDelegation\nimport net.mamoe.mirai.utils.MiraiLogger\n\n\ninternal fun lazyInitMiraiLogger(block: () -> MiraiLogger): MiraiLogger {\n    return LazyInitMiraiLogger(lazy(block))\n}\n\ninternal fun lazyInitMiraiLogger(block: Lazy<MiraiLogger>): MiraiLogger {\n    return LazyInitMiraiLogger(block)\n}\n\ninternal class LazyInitMiraiLogger(\n    private val theLazy: Lazy<MiraiLogger>,\n) : MiraiLogger by (dynamicDelegation(LazyInitMiraiLogger::logger)) {\n    private inline val logger: MiraiLogger get() = theLazy.value\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/logging/LoggerControllerImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ConsoleFrontEndImplementation::class, MiraiExperimentalApi::class, ConsoleExperimentalApi::class)\n\npackage net.mamoe.mirai.console.internal.logging\n\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.internal.data.builtins.LoggerConfig\nimport net.mamoe.mirai.console.logging.AbstractLoggerController\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\n\ninternal class LoggerControllerImpl : AbstractLoggerController.PathBased() {\n    // 防止 stack overflow (使用 logger 要加载 LoggerController, LoggerConfig 可能会使用 logger)\n    // 在 console init 阶段 register\n    internal val loggerConfig: LoggerConfig by lazy {\n        LoggerConfig()\n    }\n    override val isLoggerControlStateSupported: Boolean get() = true\n\n    internal fun onReload() {\n        this.loggerConfigUpdateTime++\n    }\n\n    override fun findPriority(identity: String?): LogPriority? {\n        return if (identity == null) {\n            loggerConfig.defaultPriority\n        } else {\n            loggerConfig.loggers[identity]\n        }\n    }\n\n    override val defaultPriority: LogPriority\n        get() = loggerConfig.defaultPriority\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/logging/MiraiConsoleLogger.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ConsoleExperimentalApi::class)\n\npackage net.mamoe.mirai.console.internal.logging\n\nimport net.mamoe.mirai.console.logging.LoggerController\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.MiraiLoggerPlatformBase\nimport net.mamoe.mirai.utils.SimpleLogger\n\ninternal class MiraiConsoleLogger(\n    controller: LoggerController,\n    val logger: MiraiLogger\n) : MiraiLoggerPlatformBase() {\n    override val identity: String? get() = logger.identity\n    override val isEnabled: Boolean get() = logger.isEnabled\n\n    private val logState = controller.getLoggerControlState(identity)\n\n    override val isInfoEnabled: Boolean\n        get() = logState.shouldLog(SimpleLogger.LogPriority.INFO)\n    override val isWarningEnabled: Boolean\n        get() = logState.shouldLog(SimpleLogger.LogPriority.WARNING)\n    override val isDebugEnabled: Boolean\n        get() = logState.shouldLog(SimpleLogger.LogPriority.DEBUG)\n    override val isErrorEnabled: Boolean\n        get() = logState.shouldLog(SimpleLogger.LogPriority.ERROR)\n    override val isVerboseEnabled: Boolean\n        get() = logState.shouldLog(SimpleLogger.LogPriority.VERBOSE)\n\n    override fun info0(message: String?, e: Throwable?) {\n        if (logState.shouldLog(SimpleLogger.LogPriority.INFO))\n            logger.info(message, e)\n    }\n\n    override fun warning0(message: String?, e: Throwable?) {\n        if (logState.shouldLog(SimpleLogger.LogPriority.WARNING))\n            logger.warning(message, e)\n    }\n\n    override fun debug0(message: String?, e: Throwable?) {\n        if (logState.shouldLog(SimpleLogger.LogPriority.DEBUG))\n            logger.debug(message, e)\n    }\n\n    override fun error0(message: String?, e: Throwable?) {\n        if (logState.shouldLog(SimpleLogger.LogPriority.ERROR))\n            logger.error(message, e)\n    }\n\n    override fun verbose0(message: String?, e: Throwable?) {\n        if (logState.shouldLog(SimpleLogger.LogPriority.VERBOSE))\n            logger.verbose(message, e)\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/logging/externalbind/slf4j/MiraiConsoleSLF4JService.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ConsoleFrontEndImplementation::class, MiraiExperimentalApi::class)\n\npackage net.mamoe.mirai.console.internal.logging.externalbind.slf4j\n\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MiraiConsoleImplementation.ConsoleDataScope.Companion.get\nimport net.mamoe.mirai.console.internal.data.builtins.DataScope\nimport net.mamoe.mirai.console.internal.data.builtins.LoggerConfig\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.safeCast\nimport org.slf4j.ILoggerFactory\nimport org.slf4j.IMarkerFactory\nimport org.slf4j.event.SubstituteLoggingEvent\nimport org.slf4j.helpers.BasicMarkerFactory\nimport org.slf4j.helpers.NOPLoggerFactory\nimport org.slf4j.helpers.NOPMDCAdapter\nimport org.slf4j.helpers.SubstituteLoggerFactory\nimport org.slf4j.spi.MDCAdapter\nimport org.slf4j.spi.SLF4JServiceProvider\n\n@PublishedApi\ninternal class MiraiConsoleSLF4JService : SLF4JServiceProvider {\n    private val basicMarkerFactory = BasicMarkerFactory()\n    private val nopMDCAdapter = NOPMDCAdapter()\n    private val dfactory = ILoggerFactory { MiraiConsoleSLF4JAdapter.getCurrentLogFactory().getLogger(it) }\n\n    override fun getMarkerFactory(): IMarkerFactory = basicMarkerFactory\n    override fun getMDCAdapter(): MDCAdapter = nopMDCAdapter\n    override fun getRequestedApiVersion(): String = \"2.0\"\n    override fun getLoggerFactory(): ILoggerFactory = dfactory\n    override fun initialize() {}\n}\n\ninternal object MiraiConsoleSLF4JAdapter {\n    /**\n     * Used before mirai-console start\n     */\n    private val substituteServiceFactory = SubstituteLoggerFactory()\n\n    @Volatile\n    private var initialized: Boolean = false\n\n    @Volatile\n    private var currentLoggerFactory: ILoggerFactory = substituteServiceFactory\n\n    internal fun getCurrentLogFactory(): ILoggerFactory {\n        if (initialized) return currentLoggerFactory\n\n        synchronized(MiraiConsoleSLF4JAdapter::class.java) {\n            return currentLoggerFactory\n        }\n    }\n\n    internal fun doSlf4JInit() {\n        synchronized(MiraiConsoleSLF4JAdapter::class.java) {\n            val logConfig = DataScope.get<LoggerConfig>()\n\n            currentLoggerFactory = if (logConfig.binding.slf4j) {\n                ILoggerFactory { ident ->\n                    SLF4JAdapterLogger(MiraiLogger.Factory.create(MiraiConsoleSLF4JAdapter::class.java, ident))\n                }\n            } else {\n                NOPLoggerFactory()\n            }\n            initialized = true\n\n            // region replay events\n\n            substituteServiceFactory.postInitialization()\n            substituteServiceFactory.loggers.forEach { slog ->\n                slog.setDelegate(currentLoggerFactory.getLogger(slog.name))\n            }\n\n            substituteServiceFactory.eventQueue.let { queue ->\n                for (event in queue) {\n                    replaySingleEvent(event)\n                }\n            }\n            substituteServiceFactory.clear()\n            // endregion\n        }\n    }\n\n\n    private fun replaySingleEvent(event: SubstituteLoggingEvent?) {\n        if (event == null) return\n        val substLogger = event.logger\n\n        substLogger.delegate().safeCast<SLF4JAdapterLogger>()?.process(event)\n    }\n\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/logging/externalbind/slf4j/SLF4JAdapterLogger.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.internal.logging.externalbind.slf4j\n\nimport net.mamoe.mirai.utils.MiraiLogger\nimport org.slf4j.Logger\nimport org.slf4j.Marker\nimport org.slf4j.event.SubstituteLoggingEvent\nimport java.lang.invoke.MethodHandle\nimport java.lang.invoke.MethodHandles\nimport java.lang.invoke.MethodType\nimport java.nio.CharBuffer\nimport java.text.MessageFormat\nimport java.util.regex.Pattern\nimport org.slf4j.event.Level as SLF4JEventLevel\n\n@Suppress(\"RegExpRedundantEscape\")\ninternal class SLF4JAdapterLogger(\n    private val logger: MiraiLogger\n) : Logger {\n    // Copied from Log4J\n    internal companion object {\n        private const val FORMAT_SPECIFIER = \"%(\\\\d+\\\\$)?([-#+ 0,(\\\\<]*)?(\\\\d+)?(\\\\.\\\\d+)?([tT])?([a-zA-Z%])\"\n\n        private val MSG_PATTERN = Pattern.compile(FORMAT_SPECIFIER)\n        private const val DELIM_START = '{'\n        private const val DELIM_STOP = '}'\n        private const val ESCAPE_CHAR = '\\\\'\n\n        @JvmStatic\n        internal fun String.simpleFormat(args: Array<out Any?>): String {\n            val buffer = StringBuilder()\n            val reader = CharBuffer.wrap(this)\n            var isEscape = false\n            var index = 0\n            while (reader.hasRemaining()) {\n                when (val next = reader.get()) {\n                    ESCAPE_CHAR -> {\n                        if (isEscape) {\n                            buffer.append(ESCAPE_CHAR)\n                        }\n                        isEscape = !isEscape\n                    }\n                    DELIM_START -> {\n                        if (isEscape) {\n                            buffer.append(next)\n                        } else {\n                            if (reader.hasRemaining()) {\n                                if (reader.get(reader.position()) == DELIM_STOP) {\n                                    reader.get()\n                                    buffer.append(args.getOrNull(index))\n                                    index++\n                                } else {\n                                    buffer.append(DELIM_START)\n                                }\n                            } else {\n                                buffer.append(DELIM_START)\n                            }\n                        }\n                        isEscape = false\n                    }\n                    else -> buffer.append(next).also { isEscape = false }\n                }\n            }\n            return buffer.toString()\n        }\n\n        internal fun String.format1(vararg arguments: Any?): String = format2(arguments)\n\n        // (java.lang.String, java.lang.Object[]): java.lang.String\n        @Suppress(\"LocalVariableName\")\n        private val formatWithLog4JMH: MethodHandle? = kotlin.runCatching {\n            val c_ParameterizedMessage = Class.forName(\"org.apache.logging.log4j.message.ParameterizedMessage\")\n\n            val mhLookup = MethodHandles.lookup()\n            val mh_newParameterizedMessage = mhLookup.findConstructor(\n                c_ParameterizedMessage, MethodType.methodType(Void.TYPE, String::class.java, Array<Any>::class.java)\n            ).asFixedArity()\n\n            val mh_getFormattedMessage = mhLookup.findVirtual(\n                c_ParameterizedMessage, \"getFormattedMessage\", MethodType.methodType(String::class.java)\n            )\n\n            MethodHandles.filterReturnValue(mh_newParameterizedMessage, mh_getFormattedMessage)\n\n        }.getOrNull()\n\n        @JvmStatic\n        internal fun String.format2(args: Array<out Any?>): String {\n            kotlin.runCatching {\n                val formatter = MessageFormat(this)\n                val formats = formatter.formats\n                if (formats.isNotEmpty()) {\n                    return formatter.format(args)\n                }\n            }\n            kotlin.runCatching {\n                if (MSG_PATTERN.matcher(this).find()) {\n                    return String.format(this, *args)\n                }\n            }\n            kotlin.runCatching {\n                // Try format with Log4J\n                formatWithLog4JMH?.let { formatWithLog4JMH ->\n                    return formatWithLog4JMH.invoke(this@format2, args) as String\n                }\n            }\n            return simpleFormat(args)\n        }\n    }\n\n    //////////////////////////////////////////////////////////////////\n    override fun isTraceEnabled(): Boolean = logger.isVerboseEnabled\n    override fun isTraceEnabled(marker: Marker?): Boolean = logger.isVerboseEnabled\n    override fun isDebugEnabled(): Boolean = logger.isDebugEnabled\n    override fun isDebugEnabled(marker: Marker?): Boolean = logger.isDebugEnabled\n    override fun isInfoEnabled(): Boolean = logger.isInfoEnabled\n    override fun isInfoEnabled(marker: Marker?): Boolean = logger.isInfoEnabled\n    override fun isWarnEnabled(): Boolean = logger.isWarningEnabled\n    override fun isWarnEnabled(marker: Marker?): Boolean = logger.isWarningEnabled\n    override fun isErrorEnabled(): Boolean = logger.isErrorEnabled\n    override fun isErrorEnabled(marker: Marker?): Boolean = logger.isErrorEnabled\n    //////////////////////////////////////////////////////////////////\n\n    override fun getName(): String = logger.identity ?: \"<unknown>\"\n\n    @Suppress(\"DuplicatedCode\")\n    internal fun process(event: SubstituteLoggingEvent) {\n        val msg = event.message\n        val argx = event.argumentArray\n        val throwx = event.throwable\n\n        val evtlv = event.level ?: return\n\n        val isEnabled = when (evtlv) {\n            SLF4JEventLevel.ERROR -> isErrorEnabled\n            SLF4JEventLevel.WARN -> isWarnEnabled\n            SLF4JEventLevel.INFO -> isInfoEnabled\n            SLF4JEventLevel.DEBUG -> isDebugEnabled\n            SLF4JEventLevel.TRACE -> isTraceEnabled\n        }\n        if (!isEnabled) return\n\n        if (argx == null) {\n            when (evtlv) {\n                SLF4JEventLevel.ERROR -> error(msg, t = throwx)\n                SLF4JEventLevel.WARN -> warn(msg, t = throwx)\n                SLF4JEventLevel.INFO -> info(msg, t = throwx)\n                SLF4JEventLevel.DEBUG -> debug(msg, t = throwx)\n                SLF4JEventLevel.TRACE -> trace(msg, t = throwx)\n            }\n            return\n        }\n\n        if (throwx == null) {\n            when (evtlv) {\n                SLF4JEventLevel.ERROR -> error(msg, arguments = argx)\n                SLF4JEventLevel.WARN -> warn(msg, arguments = argx)\n                SLF4JEventLevel.INFO -> info(msg, arguments = argx)\n                SLF4JEventLevel.DEBUG -> debug(msg, arguments = argx)\n                SLF4JEventLevel.TRACE -> trace(msg, arguments = argx)\n            }\n            return\n        }\n\n        val msg2 = msg.format2(argx)\n        when (evtlv) {\n            SLF4JEventLevel.ERROR -> error(msg2, t = throwx)\n            SLF4JEventLevel.WARN -> warn(msg2, t = throwx)\n            SLF4JEventLevel.INFO -> info(msg2, t = throwx)\n            SLF4JEventLevel.DEBUG -> debug(msg2, t = throwx)\n            SLF4JEventLevel.TRACE -> trace(msg2, t = throwx)\n        }\n    }\n\n    //////////////////////////////////////////////////////////////////\n\n    private inline fun iT(a: () -> Unit) {\n        if (isTraceEnabled) a()\n    }\n\n    private inline fun iD(a: () -> Unit) {\n        if (isDebugEnabled) a()\n    }\n\n    private inline fun iI(a: () -> Unit) {\n        if (isInfoEnabled) a()\n    }\n\n    private inline fun iW(a: () -> Unit) {\n        if (isWarnEnabled) a()\n    }\n\n    private inline fun iE(a: () -> Unit) {\n        if (isErrorEnabled) a()\n    }\n\n    //////////////////////////////////////////////////////////////////\n\n    override fun trace(msg: String?) {\n        logger.verbose(msg)\n    }\n\n    override fun trace(msg: String?, t: Throwable?) {\n        logger.verbose(msg, t)\n    }\n\n    override fun trace(format: String, arg: Any?) = iT { trace(format.format1(arg)) }\n    override fun trace(format: String, arg1: Any?, arg2: Any?) = iT { trace(format.format1(arg1, arg2)) }\n    override fun trace(format: String, arguments: Array<out Any?>) = iT { trace(format.format2(arguments)) }\n\n    override fun trace(marker: Marker?, msg: String?) = trace(msg)\n    override fun trace(marker: Marker?, format: String, arg: Any?) = trace(format, arg)\n    override fun trace(marker: Marker?, format: String, arg1: Any?, arg2: Any?) = trace(format, arg1, arg2)\n    override fun trace(marker: Marker?, format: String, argArray: Array<out Any?>) = trace(format, argArray)\n    override fun trace(marker: Marker?, msg: String?, t: Throwable?) = trace(msg, t)\n\n    //////////////////////////////////////////////////////////////////\n\n    override fun debug(msg: String?) {\n        logger.debug(msg)\n    }\n\n    override fun debug(msg: String?, t: Throwable?) {\n        logger.debug(msg, t)\n    }\n\n    override fun debug(format: String, arg: Any?) = iD { debug(format.format1(arg)) }\n    override fun debug(format: String, arg1: Any?, arg2: Any?) = iD { debug(format.format1(arg1, arg2)) }\n    override fun debug(format: String, arguments: Array<out Any?>) = iD { debug(format.format2(arguments)) }\n\n    override fun debug(marker: Marker?, msg: String?) = debug(msg)\n    override fun debug(marker: Marker?, format: String, arg: Any?) = debug(format, arg)\n    override fun debug(marker: Marker?, format: String, arg1: Any?, arg2: Any?) = debug(format, arg1, arg2)\n    override fun debug(marker: Marker?, format: String, arguments: Array<out Any?>) = debug(format, arguments)\n    override fun debug(marker: Marker?, msg: String?, t: Throwable?) = debug(msg, t)\n\n    //////////////////////////////////////////////////////////////////\n\n    override fun info(msg: String?) {\n        logger.info(msg)\n    }\n\n    override fun info(msg: String?, t: Throwable?) {\n        logger.info(msg, t)\n    }\n\n    override fun info(format: String, arg: Any?) = iI { info(format.format1(arg)) }\n    override fun info(format: String, arg1: Any?, arg2: Any?) = iI { info(format.format1(arg1, arg2)) }\n    override fun info(format: String, arguments: Array<out Any?>) = iI { info(format.format2(arguments)) }\n\n    override fun info(marker: Marker?, msg: String?) = info(msg)\n    override fun info(marker: Marker?, format: String, arg: Any?) = info(format, arg)\n    override fun info(marker: Marker?, format: String, arg1: Any?, arg2: Any?) = info(format, arg1, arg2)\n    override fun info(marker: Marker?, format: String, arguments: Array<out Any?>) = info(format, arguments)\n    override fun info(marker: Marker?, msg: String?, t: Throwable?) = info(msg, t)\n\n    //////////////////////////////////////////////////////////////////\n\n    override fun warn(msg: String?) {\n        logger.warning(msg)\n    }\n\n    override fun warn(msg: String?, t: Throwable?) {\n        logger.warning(msg, t)\n    }\n\n    override fun warn(format: String, arg: Any?) = iW { warn(format.format1(arg)) }\n    override fun warn(format: String, arguments: Array<out Any?>) = iW { warn(format.format2(arguments)) }\n    override fun warn(format: String, arg1: Any?, arg2: Any?) = iW { warn(format.format1(arg1, arg2)) }\n\n    override fun warn(marker: Marker?, msg: String?) = warn(msg)\n    override fun warn(marker: Marker?, format: String, arg: Any?) = warn(format, arg)\n    override fun warn(marker: Marker?, format: String, arg1: Any?, arg2: Any?) = warn(format, arg1, arg2)\n    override fun warn(marker: Marker?, format: String, arguments: Array<out Any?>) = warn(format, arguments)\n    override fun warn(marker: Marker?, msg: String?, t: Throwable?) = warn(msg, t)\n\n    //////////////////////////////////////////////////////////////////\n\n    override fun error(msg: String?) {\n        logger.error(msg)\n    }\n\n    override fun error(msg: String?, t: Throwable?) {\n        logger.error(msg, t)\n    }\n\n    override fun error(format: String, arg: Any?) = iE { error(format.format1(arg)) }\n    override fun error(format: String, arg1: Any?, arg2: Any?) = iE { error(format.format1(arg1, arg2)) }\n    override fun error(format: String, arguments: Array<out Any?>) = iE { error(format.format2(arguments)) }\n\n    override fun error(marker: Marker?, msg: String?) = error(msg)\n    override fun error(marker: Marker?, format: String, arg: Any?) = error(format, arg)\n    override fun error(marker: Marker?, format: String, arg1: Any?, arg2: Any?) = error(format, arg1, arg2)\n    override fun error(marker: Marker?, format: String, arguments: Array<out Any?>) = error(format, arguments)\n    override fun error(marker: Marker?, msg: String?, t: Throwable?) = error(msg, t)\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/permission/AbstractConcurrentPermissionService.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.internal.permission\n\nimport net.mamoe.mirai.console.data.PluginDataExtensions\nimport net.mamoe.mirai.console.permission.*\nimport net.mamoe.mirai.console.permission.Permission.Companion.parentsWithSelf\nimport net.mamoe.mirai.console.permission.PermitteeId.Companion.allParentsWithSelf\nimport net.mamoe.mirai.console.permission.PermitteeId.Companion.isChildOf\n\ninternal abstract class AbstractConcurrentPermissionService<P : Permission> : PermissionService<P> {\n    protected abstract val permissions: MutableMap<PermissionId, P>\n    protected abstract val grantedPermissionsMap: PluginDataExtensions.NotNullMutableMap<PermissionId, MutableCollection<PermitteeId>>\n\n    protected abstract fun createPermission(id: PermissionId, description: String, parent: Permission): P\n\n    override fun get(id: PermissionId): P? = permissions[id]\n\n    override fun register(id: PermissionId, description: String, parent: Permission): P {\n        val instance = createPermission(id, description, parent)\n        val old = permissions.putIfAbsent(id, instance)\n        if (old != null) throw PermissionRegistryConflictException(instance, old)\n        return instance\n    }\n\n    override fun permit(permitteeId: PermitteeId, permission: P) {\n        grantedPermissionsMap[permission.id].add(permitteeId)\n    }\n\n    override fun cancel(permitteeId: PermitteeId, permission: P, recursive: Boolean) {\n        val success = if (recursive) {\n            getPermittedPermissions(permitteeId).any { permitted ->\n                (permission in permitted.parentsWithSelf) && grantedPermissionsMap[permitted.id].remove(permitteeId)\n            }\n        } else {\n            grantedPermissionsMap[permission.id].remove(permitteeId)\n        }\n        if (!success) {\n            val about = buildList {\n                for ((permissionIdentifier, permissibleIdentifiers) in grantedPermissionsMap) {\n                    val parent = get(permissionIdentifier) ?: continue\n                    if (parent !in permission.parentsWithSelf) continue\n                    for (permissibleId in permissibleIdentifiers) {\n                        if (permissibleId in permitteeId.allParentsWithSelf) {\n                            add(parent to permissibleId)\n                        }\n                    }\n                }\n            }\n            val message = if (about.isEmpty()) {\n                \"${permitteeId.asString()} 不拥有权限 ${permission.id}\"\n            } else {\n                buildString {\n                    appendLine(\"${permitteeId.asString()} 的 ${permission.id} 权限来自\")\n                    about.forEach { (parent, permitted) ->\n                        appendLine(\"${permitted.asString()} ${parent.id}\")\n                    }\n                    appendLine(\"Mirai Console 内置权限系统目前不支持单独禁用继承得到的权限. 可取消继承来源再为其分别分配.\")\n                }\n            }\n\n            throw UnsupportedOperationException(message)\n        }\n    }\n\n    override fun getRegisteredPermissions(): Sequence<P> = permissions.values.asSequence()\n\n    override fun getPermittedPermissions(permitteeId: PermitteeId): Sequence<P> = sequence {\n        for ((permissionIdentifier, permissibleIdentifiers) in grantedPermissionsMap) {\n\n            val granted = permissibleIdentifiers.any { permitteeId.isChildOf(it) }\n\n            if (granted) get(permissionIdentifier)?.let { yield(it) }\n        }\n    }\n\n    internal fun getPermittedPermissionsAndSource(permitteeId: PermitteeId): Sequence<Pair<PermitteeId, P>> = sequence {\n        for ((permissionIdentifier, permissibleIdentifiers) in grantedPermissionsMap) {\n            permissibleIdentifiers.forEach { pid ->\n                if (permitteeId.isChildOf(pid)) {\n                    get(permissionIdentifier)?.let { yield(pid to it) }\n                }\n            }\n        }\n    }\n}\n\ninternal fun PermitteeId.getPermittedPermissionsAndSource(): Sequence<Pair<PermitteeId, Permission>> {\n    return when (val ps = PermissionService.INSTANCE) {\n        is AbstractConcurrentPermissionService -> ps.getPermittedPermissionsAndSource(this)\n        else -> ps.getPermittedPermissions(this).map { this to it }\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/permission/BuiltInPermissionServices.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ConsoleExperimentalApi::class)\n\npackage net.mamoe.mirai.console.internal.permission\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.console.data.AutoSavePluginConfig\nimport net.mamoe.mirai.console.data.PluginDataExtensions\nimport net.mamoe.mirai.console.data.PluginDataExtensions.withDefault\nimport net.mamoe.mirai.console.data.value\nimport net.mamoe.mirai.console.extensions.PermissionServiceProvider\nimport net.mamoe.mirai.console.permission.*\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport java.util.concurrent.ConcurrentHashMap\nimport java.util.concurrent.CopyOnWriteArraySet\nimport kotlin.reflect.KClass\nimport kotlin.reflect.full.isSuperclassOf\n\n@Suppress(\"unused\") // don't pollute top-level\ninternal fun PermissionService<*>.checkType(permissionType: KClass<out Permission>): PermissionService<Permission> {\n    require(this.permissionType.isSuperclassOf(permissionType)) {\n        \"Custom-constructed Permission instance is not allowed (Required ${this.permissionType}, found ${permissionType}. \" +\n                \"Please obtain Permission from PermissionService.INSTANCE.register or PermissionService.INSTANCE.get\"\n    }\n\n    @Suppress(\"UNCHECKED_CAST\")\n    return this as PermissionService<Permission>\n}\n\ninternal class AllPermitPermissionService : PermissionService<PermissionImpl> {\n    private val all = ConcurrentHashMap<PermissionId, PermissionImpl>()\n    override val permissionType: KClass<PermissionImpl> get() = PermissionImpl::class\n    override val rootPermission: PermissionImpl get() = RootPermissionImpl.also { all[it.id] = it }\n\n    override fun register(\n        id: PermissionId,\n        description: String,\n        parent: Permission,\n    ): PermissionImpl {\n        val new = PermissionImpl(id, description, parent)\n        val old = all.putIfAbsent(id, new)\n        if (old != null) throw PermissionRegistryConflictException(new, old)\n        return new\n    }\n\n    override fun get(id: PermissionId): PermissionImpl? = all[id]\n    override fun getRegisteredPermissions(): Sequence<PermissionImpl> = all.values.asSequence()\n    override fun getPermittedPermissions(permitteeId: PermitteeId): Sequence<PermissionImpl> =\n        all.values.asSequence()\n\n    override fun permit(permitteeId: PermitteeId, permission: PermissionImpl) {\n    }\n\n    override fun testPermission(permitteeId: PermitteeId, permission: PermissionImpl): Boolean =\n        true\n\n    override fun cancel(permitteeId: PermitteeId, permission: PermissionImpl, recursive: Boolean) {\n    }\n}\n\n@Suppress(\"DEPRECATION\")\nprivate val RootPermissionImpl = PermissionImpl(PermissionId(\"*\", \"*\"), \"The root permission\").also { it.parent = it }\n\ninternal class AllDenyPermissionService : PermissionService<PermissionImpl> {\n    private val all = ConcurrentHashMap<PermissionId, PermissionImpl>()\n    override val permissionType: KClass<PermissionImpl>\n        get() = PermissionImpl::class\n    override val rootPermission: PermissionImpl = RootPermissionImpl.also { all[it.id] = it }\n\n    override fun register(\n        id: PermissionId,\n        description: String,\n        parent: Permission,\n    ): PermissionImpl {\n        val new = PermissionImpl(id, description, parent)\n        val old = all.putIfAbsent(id, new)\n        if (old != null) throw PermissionRegistryConflictException(new, old)\n        return new\n    }\n\n    override fun get(id: PermissionId): PermissionImpl? = all[id]\n    override fun getRegisteredPermissions(): Sequence<PermissionImpl> = all.values.asSequence()\n    override fun getPermittedPermissions(permitteeId: PermitteeId): Sequence<PermissionImpl> =\n        emptySequence()\n\n    override fun permit(permitteeId: PermitteeId, permission: PermissionImpl) {\n    }\n\n    override fun testPermission(permitteeId: PermitteeId, permission: PermissionImpl): Boolean =\n        false\n\n    override fun cancel(permitteeId: PermitteeId, permission: PermissionImpl, recursive: Boolean) {\n    }\n}\n\ninternal class BuiltInPermissionService : AbstractConcurrentPermissionService<PermissionImpl>(),\n    PermissionService<PermissionImpl> {\n\n    class Provider : PermissionServiceProvider {\n        override val instance: PermissionService<*> by lazy { BuiltInPermissionService() }\n        override val priority: Int get() = -1\n    }\n\n    override val permissionType: KClass<PermissionImpl>\n        get() = PermissionImpl::class\n    override val permissions: ConcurrentHashMap<PermissionId, PermissionImpl> = ConcurrentHashMap()\n    override val rootPermission: PermissionImpl = RootPermissionImpl.also { permissions[it.id] = it }\n\n    @Suppress(\"UNCHECKED_CAST\")\n    override val grantedPermissionsMap: PluginDataExtensions.NotNullMutableMap<PermissionId, MutableCollection<PermitteeId>>\n        get() = config.grantedPermissionMap as PluginDataExtensions.NotNullMutableMap<PermissionId, MutableCollection<PermitteeId>>\n\n    override fun createPermission(id: PermissionId, description: String, parent: Permission): PermissionImpl =\n        PermissionImpl(id, description, parent)\n\n    internal val config: ConcurrentSaveData =\n        ConcurrentSaveData(\"PermissionService\")\n\n    @Suppress(\"RedundantVisibilityModifier\")\n    internal class ConcurrentSaveData private constructor(\n        saveName: String,\n        @Suppress(\"UNUSED_PARAMETER\") primaryConstructorMark: Any?,\n    ) : AutoSavePluginConfig(saveName) {\n        public val grantedPermissionMap: PluginDataExtensions.NotNullMutableMap<PermissionId, MutableSet<AbstractPermitteeId>>\n                by value<MutableMap<PermissionId, MutableSet<AbstractPermitteeId>>>(ConcurrentHashMap())\n                    .withDefault { CopyOnWriteArraySet() }\n\n        public companion object {\n            @JvmStatic\n            public operator fun invoke(\n                saveName: String,\n                // delegate: PluginConfig,\n            ): ConcurrentSaveData = ConcurrentSaveData(saveName, null)\n        }\n    }\n}\n\n/**\n * [Permission] 的简单实现\n */\n@Serializable\ninternal data class PermissionImpl @Deprecated(\"Only for Root\") constructor(\n    override val id: PermissionId,\n    override val description: String,\n) : Permission {\n    override lateinit var parent: Permission\n\n    @Suppress(\"DEPRECATION\")\n    constructor(id: PermissionId, description: String, parent: Permission) : this(id, description) {\n        this.parent = parent\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (javaClass != other?.javaClass) return false\n\n        other as PermissionImpl\n\n        if (id != other.id) return false\n        if (description != other.description) return false\n        if (parent !== other.parent) return false\n\n        return true\n    }\n\n    override fun hashCode(): Int {\n        var result = id.hashCode()\n        result = 31 * result + description.hashCode()\n        result = 31 * result + if (parent == this) 1 else parent.hashCode()\n        return result\n    }\n\n    override fun toString(): String =\n        \"PermissionImpl(id=$id, description='$description', parent=${if (parent === this) \"<self>\" else parent.toString()})\"\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/permission/parseFromStringImpl.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.internal.permission\n\nimport net.mamoe.mirai.console.permission.AbstractPermitteeId\nimport net.mamoe.mirai.console.permission.AbstractPermitteeId.*\n\ninternal fun parseFromStringImpl(string: String): AbstractPermitteeId {\n    val str = string.trim { it.isWhitespace() }.lowercase()\n    if (str == \"*\") return AnyContact\n    if (str == \"console\") return Console\n    if (str == \"client*\") return AnyOtherClient\n    if (str.isNotEmpty()) {\n        when (str[0]) {\n            'g' -> {\n                val arg = str.substring(1)\n                if (arg == \"*\") return AnyGroup\n                else arg.toLongOrNull()?.let(::ExactGroup)?.let { return it }\n            }\n            'f' -> {\n                val arg = str.substring(1)\n                if (arg == \"*\") return AnyFriend\n                else arg.toLongOrNull()?.let(::ExactFriend)?.let { return it }\n            }\n            'u' -> {\n                val arg = str.substring(1)\n                if (arg == \"*\") return AnyUser\n                else arg.toLongOrNull()?.let(::ExactUser)?.let { return it }\n            }\n            's' -> {\n                val arg = str.substring(1)\n                if (arg == \"*\") return AnyStranger\n                else arg.toLongOrNull()?.let(::ExactStranger)?.let { return it }\n            }\n            'c' -> {\n                val arg = str.substring(1)\n                if (arg == \"*\") return AnyContact\n            }\n            'm' -> run {\n                val arg = str.substring(1)\n                if (arg == \"*\") return AnyMemberFromAnyGroup\n                else {\n                    val components = arg.split('.')\n\n                    if (components.size == 2) {\n                        val groupId = components[0].toLongOrNull() ?: return@run\n\n                        if (components[1] == \"*\") return AnyMember(groupId)\n                        else {\n                            val memberId = components[1].toLongOrNull() ?: return@run\n                            return ExactMember(groupId, memberId)\n                        }\n                    }\n                }\n            }\n            't' -> run {\n                val arg = str.substring(1)\n                if (arg == \"*\") return AnyTempFromAnyGroup\n                else {\n                    val components = arg.split('.')\n\n                    if (components.size == 2) {\n                        val groupId = components[0].toLongOrNull() ?: return@run\n\n                        if (components[1] == \"*\") return AnyGroupTemp(groupId)\n                        else {\n                            val memberId = components[1].toLongOrNull() ?: return@run\n                            return ExactGroupTemp(groupId, memberId)\n                        }\n                    }\n                }\n            }\n        }\n    }\n    error(\"Cannot deserialize '$str' as AbstractPermissibleIdentifier\")\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/plugin/AllDependenciesClassesHolder.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.internal.plugin\n\n// Same as LazyLoad\ninternal object AllDependenciesClassesHolder {\n    @JvmField\n    internal val allclasses = AllDependenciesClassesHolder::class.java\n        .getResourceAsStream(\"/META-INF/mirai-console/allclasses.txt\")!!\n        .bufferedReader().use { reader ->\n            reader.useLines { lines ->\n                lines.filterNot { it.isBlank() }\n                    .toHashSet()\n            }\n        }\n\n    @JvmField\n    internal val appClassLoader: ClassLoader = AllDependenciesClassesHolder::class.java.classLoader\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/plugin/BuiltInJvmPluginLoaderImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ConsoleFrontEndImplementation::class, ConsoleExperimentalApi::class, MiraiInternalApi::class)\n\npackage net.mamoe.mirai.console.internal.plugin\n\nimport kotlinx.coroutines.CoroutineExceptionHandler\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.ensureActive\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport net.mamoe.mirai.console.data.PluginDataStorage\nimport net.mamoe.mirai.console.internal.util.PluginServiceHelper.findServices\nimport net.mamoe.mirai.console.internal.util.PluginServiceHelper.loadAllServices\nimport net.mamoe.mirai.console.plugin.PluginManager\nimport net.mamoe.mirai.console.plugin.dependencies\nimport net.mamoe.mirai.console.plugin.id\nimport net.mamoe.mirai.console.plugin.jvm.*\nimport net.mamoe.mirai.console.plugin.loader.AbstractFilePluginLoader\nimport net.mamoe.mirai.console.plugin.loader.PluginLoadException\nimport net.mamoe.mirai.console.plugin.name\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.utils.*\nimport net.mamoe.yamlkt.Yaml\nimport java.io.File\nimport java.nio.file.Path\nimport java.util.concurrent.ConcurrentHashMap\nimport kotlin.coroutines.CoroutineContext\n\ninternal val JvmPluginLoader.implOrNull get() = this.castOrNull<BuiltInJvmPluginLoaderImpl>()\n\ninternal class BuiltInJvmPluginLoaderImpl(\n    parentCoroutineContext: CoroutineContext\n) : AbstractFilePluginLoader<JvmPlugin, JvmPluginDescription>(\".jar\"),\n    CoroutineScope by parentCoroutineContext.childScope(\"JvmPluginLoader\", CoroutineExceptionHandler { _, throwable ->\n        logger.error(\"Unhandled Jar plugin exception: ${throwable.message}\", throwable)\n    }),\n    JvmPluginLoader {\n\n    companion object {\n        internal val logger: MiraiLogger =\n            MiraiLogger.Factory.create(JvmPluginLoader::class)\n    }\n\n    private fun pluginsFilesSequence(\n        files: Sequence<File> = PluginManager.pluginsFolder.listFiles().orEmpty().asSequence()\n    ): Sequence<File> {\n        val raw = files\n            .filter { it.isFile && it.name.endsWith(fileSuffix, ignoreCase = true) }\n            .toMutableList()\n\n        val mirai2List = raw.filter { it.name.endsWith(\".mirai2.jar\", ignoreCase = true) }\n        for (mirai2Plugin in mirai2List) {\n            val name = mirai2Plugin.name.substringBeforeLast('.').substringBeforeLast('.') // without ext.\n            raw.removeAll {\n                it !== mirai2Plugin && it.name.substringBeforeLast('.').substringBeforeLast('.') == name\n            } // remove those with .mirai.jar\n        }\n\n        return raw.asSequence()\n    }\n\n    override fun listPlugins(): List<JvmPlugin> {\n        return pluginsFilesSequence().extractPlugins()\n    }\n\n    override val configStorage: PluginDataStorage\n        get() = MiraiConsoleImplementation.getInstance().configStorageForJvmPluginLoader\n\n    override val dataStorage: PluginDataStorage\n        get() = MiraiConsoleImplementation.getInstance().dataStorageForJvmPluginLoader\n\n\n    private val jvmPluginLoadingCtx: JvmPluginsLoadingCtx by lazy {\n        val legacyCompatibilityLayerClassLoader = LegacyCompatibilityLayerClassLoader.newInstance(\n            BuiltInJvmPluginLoaderImpl::class.java.classLoader,\n        )\n\n        val classLoader = DynLibClassLoader.newInstance(\n            legacyCompatibilityLayerClassLoader, \"GlobalShared\", \"global-shared\"\n        )\n        val ctx = JvmPluginsLoadingCtx(\n            legacyCompatibilityLayerClassLoader,\n            classLoader,\n            mutableListOf(),\n            JvmPluginDependencyDownloader(logger),\n        )\n        logger.debug { \"Downloading legacy compatibility modules.....\" }\n        ctx.downloader.resolveDependencies(\n            sequenceOf(\n                \"client-core\",\n                \"client-core-jvm\",\n                \"client-okhttp\",\n                \"utils\",\n                \"utils-jvm\",\n            ).map { \"io.ktor:ktor-$it:1.6.8\" }.asIterable()\n        ).let { rsp ->\n            rsp.artifactResults.forEach {\n                legacyCompatibilityLayerClassLoader.addLib(it.artifact.file)\n            }\n            if (logger.isVerboseEnabled) {\n                logger.verbose(\"Legacy compatibility modules:\")\n                rsp.artifactResults.forEach { art ->\n                    logger.verbose(\" `- ${art.artifact}  -> ${art.artifact.file}\")\n                }\n            }\n        }\n\n        logger.verbose { \"Plugin shared libraries: \" + PluginManager.pluginSharedLibrariesFolder }\n        PluginManager.pluginSharedLibrariesFolder.listFiles()?.asSequence().orEmpty()\n            .onEach { logger.debug { \"Peek $it in shared libraries\" } }\n            .filter { file ->\n                if (file.isDirectory) {\n                    return@filter true\n                }\n                if (!file.exists()) {\n                    logger.debug { \"Skipped $file because file not exists\" }\n                    return@filter false\n                }\n                if (file.isFile) {\n                    if (file.extension == \"jar\") {\n                        return@filter true\n                    }\n                    logger.debug { \"Skipped $file because extension <${file.extension}> != jar\" }\n                    return@filter false\n                }\n                logger.debug { \"Skipped $file because unknown error\" }\n                return@filter false\n            }\n            .filter { it.isDirectory || (it.isFile && it.extension == \"jar\") }\n            .forEach { pt ->\n                classLoader.addLib(pt)\n                logger.debug { \"Linked static shared library: $pt\" }\n            }\n        val libraries = PluginManager.pluginSharedLibrariesFolder.resolve(\"libraries.txt\")\n        if (libraries.isFile) {\n            logger.verbose { \"Linking static shared libraries....\" }\n            val libs = libraries.useLines { lines ->\n                lines.filter { it.isNotBlank() }\n                    .filterNot { it.startsWith(\"#\") }\n                    .onEach { logger.verbose { \"static lib queued: $it\" } }\n                    .toMutableList()\n            }\n            val staticLibs = ctx.downloader.resolveDependencies(libs)\n            staticLibs.artifactResults.forEach { artifactResult ->\n                if (artifactResult.isResolved) {\n                    ctx.sharedLibrariesLoader.addLib(artifactResult.artifact.file)\n                    ctx.sharedLibrariesDependencies.add(artifactResult.artifact.depId())\n                    logger.debug { \"Linked static shared library: ${artifactResult.artifact}\" }\n                    logger.verbose { \"Linked static shared library: ${artifactResult.artifact.file}\" }\n                }\n            }\n        } else {\n            libraries.createNewFile()\n        }\n        ctx\n    }\n\n    override val classLoaders: MutableList<JvmPluginClassLoaderN> get() = jvmPluginLoadingCtx.pluginClassLoaders\n\n    override fun findLoadedClass(name: String): Class<*>? {\n        return classLoaders.firstNotNullOfOrNull { it.loadedClass(name) }\n    }\n\n\n    override fun getPluginDescription(plugin: JvmPlugin): JvmPluginDescription = plugin.description\n\n    private val pluginFileToInstanceMap: MutableMap<File, JvmPlugin> = ConcurrentHashMap()\n\n    override fun Sequence<File>.extractPlugins(): List<JvmPlugin> {\n        ensureActive()\n\n        fun Sequence<Map.Entry<File, JvmPluginClassLoaderN>>.initialize(): Sequence<Map.Entry<File, JvmPluginClassLoaderN>> {\n            return onEach { (_, pluginClassLoader) ->\n                val exportManagers = pluginClassLoader.findServices(\n                    ExportManager::class\n                ).loadAllServices()\n                if (exportManagers.isEmpty()) {\n                    val rules = pluginClassLoader.getResourceAsStream(\"export-rules.txt\")\n                    if (rules == null)\n                        pluginClassLoader.declaredFilter = StandardExportManagers.AllExported\n                    else rules.bufferedReader(Charsets.UTF_8).useLines {\n                        pluginClassLoader.declaredFilter = ExportManagerImpl.parse(it.iterator())\n                    }\n                } else {\n                    pluginClassLoader.declaredFilter = exportManagers[0]\n                }\n            }\n        }\n\n        fun Sequence<Map.Entry<File, JvmPluginClassLoaderN>>.findAllInstances(): Sequence<Map.Entry<File, JvmPlugin>> {\n            return map { (f, pluginClassLoader) ->\n                f to pluginClassLoader.findServices(\n                    JvmPlugin::class,\n                    KotlinPlugin::class,\n                    JavaPlugin::class\n                ).loadAllServices().also { plugins ->\n                    plugins.firstOrNull()?.logger?.let { pluginClassLoader.linkedLogger = it }\n                }\n            }.flatMap { (f, list) ->\n\n                list.associateBy { f }.asSequence()\n            }\n        }\n\n        fun Map.Entry<File, JvmPluginClassLoaderN>.loadWithoutPluginDescription(): Sequence<Pair<File, JvmPlugin>> {\n            return sequenceOf(this).initialize().findAllInstances().map { (k, v) -> k to v }\n        }\n\n        fun Map.Entry<File, JvmPluginClassLoaderN>.loadWithPluginDescription(description: JvmPluginDescription): Sequence<Pair<File, JvmPlugin>> {\n            val pluginClassLoader = this.value\n            val pluginFile = this.key\n            pluginClassLoader.pluginDescriptionFromPluginResource = description\n\n            val pendingPlugin = object : NotYetLoadedJvmPlugin(\n                description = description,\n                classLoaderN = pluginClassLoader,\n            ) {\n                private val plugin by lazy {\n                    val services = pluginClassLoader.findServices(\n                        JvmPlugin::class,\n                        KotlinPlugin::class,\n                        JavaPlugin::class\n                    ).loadAllServices()\n                    if (services.isEmpty()) {\n                        error(\"No plugin instance found in $pluginFile\")\n                    }\n                    if (services.size > 1) {\n                        error(\n                            \"Only one plugin can exist at the same time when using plugin.yml:\\n\\nPlugins found:\\n\" + services.joinToString(\n                                separator = \"\\n\"\n                            ) { it.javaClass.name + \" (from \" + it.javaClass.classLoader + \")\" }\n                        )\n                    }\n\n                    return@lazy services[0]\n                }\n\n                override fun resolve(): JvmPlugin = plugin\n            }\n            pluginClassLoader.linkedLogger = pendingPlugin.logger\n\n\n            return sequenceOf(pluginFile to pendingPlugin)\n        }\n\n        val filePlugins = this.filterNot {\n            pluginFileToInstanceMap.containsKey(it)\n        }.associateWith {\n            JvmPluginClassLoaderN.newLoader(it, jvmPluginLoadingCtx)\n        }.onEach { (_, classLoader) ->\n            classLoaders.add(classLoader)\n        }.asSequence().flatMap { entry ->\n            val (file, pluginClassLoader) = entry\n\n            val pluginDescriptionDefine = pluginClassLoader.getResourceAsStream(\"plugin.yml\")\n            if (pluginDescriptionDefine == null) {\n                entry.loadWithoutPluginDescription()\n            } else {\n                val desc = kotlin.runCatching {\n                    pluginDescriptionDefine.bufferedReader().use { resource ->\n                        Yaml.decodeFromString(\n                            SimpleJvmPluginDescription.SerialData.serializer(),\n                            resource.readText()\n                        ).toJvmPluginDescription()\n                    }\n                }.onFailure { err ->\n                    throw PluginLoadException(\"Invalid plugin.yml in \" + file.absolutePath, err)\n                }.getOrThrow()\n\n                entry.loadWithPluginDescription(desc)\n            }\n        }.onEach {\n            logger.verbose { \"Successfully initialized JvmPlugin ${it.second}.\" }\n        }.onEach { (file, plugin) ->\n            pluginFileToInstanceMap[file] = plugin\n        }\n\n        return filePlugins.toSet().map { it.second }\n    }\n\n    private val loadedPlugins = ConcurrentHashMap<String, JvmPlugin>()\n\n    private fun Path.moveNameFolder(plugin: JvmPlugin) {\n        val nameFolder = this.resolve(plugin.description.name).toFile()\n        if (plugin.description.name != plugin.description.id && nameFolder.exists()) {\n            // need move\n            val idFolder = this.resolve(plugin.description.id).toFile()\n            val moveDescription =\n                \"移动 ${plugin.description.smartToString()} 的数据文件目录(${nameFolder.path})到 ${idFolder.path}\"\n            if (idFolder.exists()) {\n                if (idFolder.listFiles()?.size != 0) {\n                    logger.error(\"$moveDescription 失败, 原因:数据文件目录(${idFolder.path})被占用\")\n                    logger.error(\"Mirai Console 将自动关闭, 请删除或移动该目录后再启动\")\n                    MiraiConsole.job.cancel()\n                } else\n                    idFolder.delete()\n            }\n            kotlin.runCatching {\n                logger.info(moveDescription)\n                if (!nameFolder.renameTo(idFolder)) {\n                    logger.error(\"$moveDescription 失败\")\n                    logger.error(\"Mirai Console 将自动关闭, 请手动移动该文件夹后再启动\")\n                    MiraiConsole.job.cancel()\n                }\n            }.onFailure {\n                logger.error(\"$moveDescription 失败, 原因:\\n\", it)\n                logger.error(\"Mirai Console 将自动关闭, 请解决该错误后再启动\")\n                MiraiConsole.job.cancel()\n            }\n            logger.info(\"$moveDescription 完成\")\n        }\n    }\n\n    @Throws(PluginLoadException::class)\n    override fun load(plugin: JvmPlugin) {\n        ensureActive()\n\n        if (loadedPlugins.put(plugin.id, plugin) != null) {\n            error(\"Plugin '${plugin.id}' is already loaded and cannot be reloaded.\")\n        }\n        logger.verbose { \"Loading plugin ${plugin.description.smartToString()}\" }\n        runCatching {\n            // move nameFolder in config and data to idFolder\n            PluginManager.pluginsDataPath.moveNameFolder(plugin)\n            PluginManager.pluginsConfigPath.moveNameFolder(plugin)\n\n            check(plugin is JvmPluginInternal || plugin is NotYetLoadedJvmPlugin) {\n                \"A JvmPlugin must extend AbstractJvmPlugin to be loaded by JvmPluginLoader.BuiltIn\"\n            }\n\n\n            // region Link dependencies\n            when (plugin) {\n                is NotYetLoadedJvmPlugin -> plugin.classLoaderN\n                else -> plugin.javaClass.classLoader\n            }.safeCast<JvmPluginClassLoaderN>()?.let { jvmPluginClassLoaderN ->\n                // Link plugin dependencies\n                plugin.description.dependencies.asSequence().mapNotNull { dependency ->\n                    plugin.logger.verbose { \"Linking dependency: ${dependency.id}\" }\n                    PluginManager.plugins.firstOrNull { it.id == dependency.id }\n                }.mapNotNull { it.javaClass.classLoader.safeCast<JvmPluginClassLoaderN>() }.forEach { dependency ->\n                    plugin.logger.debug { \"Linked  dependency: $dependency\" }\n                    jvmPluginClassLoaderN.dependencies.add(dependency)\n                    jvmPluginClassLoaderN.pluginSharedCL.dependencies.cast<MutableList<DynLibClassLoader>>().add(\n                        dependency.pluginSharedCL\n                    )\n                }\n                jvmPluginClassLoaderN.linkPluginLibraries(plugin.logger)\n            }\n\n            val realPlugin = when (plugin) {\n                is NotYetLoadedJvmPlugin -> plugin.resolve().also { realPlugin ->\n                    check(plugin.description === realPlugin.description) {\n                        \"A JvmPlugin loaded by plugin.yml must has same description reference\"\n                    }\n                }\n                else -> plugin\n            }\n\n            check(realPlugin is JvmPluginInternal) { \"A JvmPlugin must extend AbstractJvmPlugin to be loaded by JvmPluginLoader.BuiltIn\" }\n            // endregion\n            realPlugin.internalOnLoad()\n        }.getOrElse {\n            throw PluginLoadException(\"Exception while loading ${plugin.description.smartToString()}\", it)\n        }\n    }\n\n    override fun enable(plugin: JvmPlugin) {\n        if (plugin.isEnabled) error(\"Plugin '${plugin.name}' is already enabled and cannot be re-enabled.\")\n        ensureActive()\n        runCatching {\n            logger.verbose { \"Enabling plugin ${plugin.description.smartToString()}\" }\n\n            val loadedPlugins = PluginManager.plugins\n            val failedDependencies = plugin.dependencies.asSequence().mapNotNull { dep ->\n                loadedPlugins.firstOrNull { it.id == dep.id }\n            }.filterNot { it.isEnabled }.toList()\n            if (failedDependencies.isNotEmpty()) {\n                logger.error(\"Failed to enable '${plugin.name}' because dependencies not enabled: \" + failedDependencies.joinToString { \"'${it.name}'\" })\n                return\n            }\n\n            if (plugin is JvmPluginInternal) {\n                plugin.internalOnEnable()\n            } else plugin.onEnable()\n\n            // Extra space for logging align\n            logger.verbose { \"Enabled  plugin ${plugin.description.smartToString()}\" }\n        }.getOrElse {\n            throw PluginLoadException(\"Exception while enabling ${plugin.description.name}\", it)\n        }\n    }\n\n    override fun disable(plugin: JvmPlugin) {\n        if (!plugin.isEnabled) error(\"Plugin '${plugin.name}' is not already disabled and cannot be re-disabled.\")\n\n        if (MiraiConsole.isActive)\n            ensureActive()\n\n        if (plugin is JvmPluginInternal) {\n            plugin.internalOnDisable()\n        } else plugin.onDisable()\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/plugin/Exceptions.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"RedundantVisibilityModifier\")\n\npackage net.mamoe.mirai.console.internal.plugin\n\ninternal class PluginMissingDependencyException : PluginResolutionException {\n    public constructor() : super()\n    public constructor(message: String?) : super(message)\n    public constructor(message: String?, cause: Throwable?) : super(message, cause)\n    public constructor(cause: Throwable?) : super(cause)\n}\n\ninternal class PluginInfiniteCircularDependencyReferenceException: PluginResolutionException {\n    public constructor() : super()\n    public constructor(message: String?) : super(message)\n    public constructor(message: String?, cause: Throwable?) : super(message, cause)\n    public constructor(cause: Throwable?) : super(cause)\n}\n\ninternal open class PluginResolutionException : Exception {\n    public constructor() : super()\n    public constructor(message: String?) : super(message)\n    public constructor(message: String?, cause: Throwable?) : super(message, cause)\n    public constructor(cause: Throwable?) : super(cause)\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/plugin/ExportManagerImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ConsoleExperimentalApi::class)\n\npackage net.mamoe.mirai.console.internal.plugin\n\nimport net.mamoe.mirai.console.plugin.jvm.ExportManager\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\n\ninternal class ExportManagerImpl(\n    private val rules: List<(String) -> Boolean?>\n) : ExportManager {\n\n    override fun isExported(className: String): Boolean {\n        rules.forEach {\n            val result = it(className)\n            if (result != null) return@isExported result\n        }\n        return true\n    }\n\n    companion object {\n        @JvmStatic\n        fun parse(lines: Iterator<String>): ExportManagerImpl {\n            fun Boolean.without(value: Boolean) = if (this == value) null else this\n\n            val rules = ArrayList<(String) -> Boolean?>()\n            lines.asSequence().map { it.trim() }.filter { it.isNotBlank() }.filterNot {\n                it[0] == '#'\n            }.forEach { line ->\n                val command = line.substringBefore(' ')\n                val argument = line.substringAfter(' ', missingDelimiterValue = \"\").trim()\n                val argumentPackage = \"$argument.\"\n\n                when (command) {\n                    \"exports\" -> rules.add {\n                        (it == argument || it.startsWith(argumentPackage)).without(false)\n                    }\n                    \"protects\" -> rules.add {\n                        if (it == argument || it.startsWith(argumentPackage))\n                            false\n                        else null\n                    }\n                    \"export-all\", \"export-plugin\", \"export-system\" -> rules.add { true }\n                    \"protect-all\", \"protect-plugin\", \"protect-system\" -> rules.add { false }\n                }\n            }\n            return ExportManagerImpl(rules)\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/plugin/JvmPluginClassLoader.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n@file:Suppress(\"MemberVisibilityCanBePrivate\")\n@file:OptIn(ConsoleExperimentalApi::class)\n\npackage net.mamoe.mirai.console.internal.plugin\n\nimport net.mamoe.mirai.console.plugin.jvm.ExportManager\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginClasspath\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.utils.*\nimport org.eclipse.aether.artifact.Artifact\nimport org.eclipse.aether.graph.DependencyFilter\nimport java.io.File\nimport java.io.InputStream\nimport java.net.URL\nimport java.net.URLClassLoader\nimport java.util.*\nimport java.util.concurrent.atomic.AtomicBoolean\nimport java.util.zip.ZipFile\n\n/*\nClass resolving:\n\n|\n`- Resolve standard classes: hard linked by console (@see AllDependenciesClassesHolder)\n`- Resolve classes in shared libraries (Shared in all plugins)\n|\n|-===== SANDBOX =====\n|\n`- Resolve classes in plugin dependency shared libraries (Shared by depend-ed plugins)\n`- Resolve classes in independent libraries (Can only be loaded by current plugin)\n`- Resolve classes in current jar.\n`- Resolve classes from other plugin jar\n`- Resolve by AppClassLoader\n\n */\n\ninternal class JvmPluginsLoadingCtx(\n    val consoleClassLoader: ClassLoader, // plugin system -> mirai-console classloader WRAPPER\n    val sharedLibrariesLoader: DynLibClassLoader,\n    val pluginClassLoaders: MutableList<JvmPluginClassLoaderN>,\n    val downloader: JvmPluginDependencyDownloader,\n) {\n    val sharedLibrariesDependencies = HashSet<String>()\n    val sharedLibrariesFilter: DependencyFilter = DependencyFilter { node, _ ->\n        return@DependencyFilter node.artifact.depId() !in sharedLibrariesDependencies\n    }\n}\n\ninternal open class DynamicClasspathClassLoader : URLClassLoader {\n    internal constructor(urls: Array<URL>, parent: ClassLoader?) : super(urls, parent)\n\n    @Suppress(\"Since15\")\n    internal constructor(urls: Array<URL>, parent: ClassLoader?, vmName: String?) : super(vmName, urls, parent)\n\n    internal fun addLib(url: URL) {\n        addURL(url)\n    }\n\n    internal fun addLib(file: File) {\n        addURL(file.toURI().toURL())\n    }\n\n\n    companion object {\n        internal val java9: Boolean\n\n        init {\n            ClassLoader.registerAsParallelCapable()\n            java9 = kotlin.runCatching { Class.forName(\"java.lang.Module\") }.isSuccess\n        }\n    }\n}\n\ninternal class LegacyCompatibilityLayerClassLoader : DynamicClasspathClassLoader {\n    private constructor(parent: ClassLoader?) : super(arrayOf(), parent)\n    private constructor(parent: ClassLoader?, vmName: String?) : super(arrayOf(), parent, vmName)\n\n    override fun toString(): String {\n        return \"LegacyCompatibilityLayerClassLoader@\" + hashCode()\n    }\n\n    companion object {\n        init {\n            ClassLoader.registerAsParallelCapable()\n        }\n\n        fun newInstance(parent: ClassLoader?): LegacyCompatibilityLayerClassLoader {\n            return if (java9) {\n                LegacyCompatibilityLayerClassLoader(parent, \"legacy-compatibility-layer\")\n            } else {\n                LegacyCompatibilityLayerClassLoader(parent)\n            }\n        }\n    }\n}\n\n\ninternal class DynLibClassLoader : DynamicClasspathClassLoader {\n    private val clName: String?\n    internal var dependencies: List<DynLibClassLoader> = emptyList()\n\n    private constructor(parent: ClassLoader?, clName: String?) : super(arrayOf(), parent) {\n        this.clName = clName\n    }\n\n    private constructor(parent: ClassLoader?, clName: String?, vmName: String?) : super(arrayOf(), parent, vmName) {\n        this.clName = clName\n    }\n\n\n    companion object {\n        fun newInstance(parent: ClassLoader?, clName: String?, vmName: String?): DynLibClassLoader {\n            return when {\n                java9 -> DynLibClassLoader(parent, clName, vmName)\n                else -> DynLibClassLoader(parent, clName)\n            }\n        }\n\n        fun tryFastOrStrictResolve(name: String): Class<*>? {\n            if (name.startsWith(\"java.\")) return Class.forName(name, false, JavaSystemPlatformClassLoader)\n\n            // All mirai-core hard-linked should use same version to avoid errors (ClassCastException).\n            if (name in AllDependenciesClassesHolder.allclasses) {\n                return AllDependenciesClassesHolder.appClassLoader.loadClass(name)\n            }\n            if (\n                name.startsWith(\"net.mamoe.mirai.\")\n                || name.startsWith(\"kotlin.\")\n                || name.startsWith(\"kotlinx.\")\n                || name.startsWith(\"org.slf4j.\")\n            ) { // Avoid plugin classing cheating\n                try {\n                    return AllDependenciesClassesHolder.appClassLoader.loadClass(name)\n                } catch (ignored: ClassNotFoundException) {\n                }\n            }\n            try {\n                return Class.forName(name, false, JavaSystemPlatformClassLoader)\n            } catch (ignored: ClassNotFoundException) {\n            }\n            return null\n        }\n\n        fun tryFastOrStrictResolveResources(name: String): Enumeration<URL> {\n            if (name.startsWith(\"java/\")) return JavaSystemPlatformClassLoader.getResources(name)\n\n            // All mirai-core hard-linked should use same version to avoid errors (ClassCastException).\n            val fromDependencies = AllDependenciesClassesHolder.appClassLoader.getResources(name)\n\n            return if (\n                name.startsWith(\"net/mamoe/mirai/\")\n                || name.startsWith(\"kotlin/\")\n                || name.startsWith(\"kotlinx/\")\n                || name.startsWith(\"org/slf4j/\")\n            ) { // Avoid plugin classing cheating\n                fromDependencies\n            } else {\n                LinkedHashSet<URL>().apply {\n                    addAll(fromDependencies)\n                    addAll(JavaSystemPlatformClassLoader.getResources(name))\n                }.let {\n                    Collections.enumeration(it)\n                }\n            }\n        }\n    }\n\n    internal fun loadClassInThisClassLoader(name: String): Class<*>? {\n        synchronized(getClassLoadingLock(name)) {\n            findLoadedClass(name)?.let { return it }\n            try {\n                return findClass(name)\n            } catch (ignored: ClassNotFoundException) {\n            }\n        }\n        return null\n    }\n\n    override fun toString(): String {\n        clName?.let { return \"DynLibClassLoader{$it}\" }\n        return \"DynLibClassLoader@\" + hashCode()\n    }\n\n    override fun getResource(name: String?): URL? {\n        if (name == null) return null\n        findResource(name)?.let { return it }\n        if (parent is DynLibClassLoader) {\n            return parent.getResource(name)\n        }\n        return null\n    }\n\n    override fun getResources(name: String?): Enumeration<URL> {\n        if (name == null) return Collections.emptyEnumeration()\n        val res = findResources(name)\n        return if (parent is DynLibClassLoader) {\n            res + parent.getResources(name)\n        } else {\n            res\n        }\n    }\n\n    internal fun findButNoSystem(name: String): Class<*>? = findButNoSystem(name, mutableListOf())\n    private fun findButNoSystem(name: String, track: MutableList<DynLibClassLoader>): Class<*>? {\n        if (name.startsWith(\"java.\")) return null\n\n        // Skip duplicated searching, for faster speed.\n        if (this in track) return null\n        track.add(this)\n\n        val pt = this.parent\n        if (pt is DynLibClassLoader) {\n            pt.findButNoSystem(name, track)?.let { return it }\n        }\n        dependencies.forEach { dep ->\n            dep.findButNoSystem(name, track)?.let { return it }\n        }\n\n        synchronized(getClassLoadingLock(name)) {\n            findLoadedClass(name)?.let { return it }\n            try {\n                findClass(name)?.let { return it }\n            } catch (ignored: ClassNotFoundException) {\n            }\n        }\n        return null\n    }\n\n    override fun loadClass(name: String, resolve: Boolean): Class<*> {\n        tryFastOrStrictResolve(name)?.let { return it }\n\n        findButNoSystem(name)?.let { return it }\n\n        val topParent = generateSequence<ClassLoader>(this) { it.parent }.firstOrNull { it !is DynLibClassLoader }\n        return Class.forName(name, false, topParent)\n    }\n}\n\ninternal class JvmPluginClassLoaderN : URLClassLoader {\n    var pluginDescriptionFromPluginResource: JvmPluginDescription? = null\n\n    val openaccess: JvmPluginClasspath = OpenAccess()\n    val file: File\n    val ctx: JvmPluginsLoadingCtx\n    val sharedLibrariesLogger: DynLibClassLoader\n\n    val dependencies: MutableCollection<JvmPluginClassLoaderN> = hashSetOf()\n\n    lateinit var pluginSharedCL: DynLibClassLoader\n    lateinit var pluginIndependentCL: DynLibClassLoader\n\n    @Suppress(\"PrivatePropertyName\")\n    private val file_: File\n        get() = file\n\n    var linkedLogger by lateinitMutableProperty {\n        MiraiLogger.Factory.create(\n            JvmPluginClassLoaderN::class,\n            \"JvmPlugin[\" + file_.name + \"]\"\n        )\n    }\n    val undefinedDependencies = mutableSetOf<String>()\n\n    @Suppress(\"UNUSED_PARAMETER\")\n    private constructor(file: File, ctx: JvmPluginsLoadingCtx, unused: Unit) : super(\n        arrayOf(), ctx.sharedLibrariesLoader\n    ) {\n        this.sharedLibrariesLogger = ctx.sharedLibrariesLoader\n        this.file = file\n        this.ctx = ctx\n        init1()\n    }\n\n    @Suppress(\"Since15\")\n    private constructor(file: File, ctx: JvmPluginsLoadingCtx) : super(\n        file.name,\n        arrayOf(), ctx.sharedLibrariesLoader\n    ) {\n        this.sharedLibrariesLogger = ctx.sharedLibrariesLoader\n        this.file = file\n        this.ctx = ctx\n        init1()\n    }\n\n    private fun init1() {\n        try {\n            init0()\n        } catch (e: Throwable) {\n            e.addSuppressed(RuntimeException(\"Failed to initialize new JvmPluginClassLoader, file=$file\"))\n            throw e\n        }\n    }\n\n    private fun init0() {\n        ZipFile(file).use { zipFile ->\n            zipFile.entries().asSequence()\n                .filter { it.name.endsWith(\".class\") }\n                .map { it.name.substringBeforeLast('.') }\n                .map { it.removePrefix(\"/\").replace('/', '.') }\n                .map { it.substringBeforeLast('.') }\n                .forEach { pkg ->\n                    pluginMainPackages.add(pkg)\n                }\n\n            zipFile.getEntry(\"META-INF/mirai-console-plugin/options.properties\")?.let { optionsEntry ->\n                runCatching {\n                    val options = Properties()\n                    zipFile.getInputStream(optionsEntry).bufferedReader().use { reader ->\n                        options.load(reader)\n                    }\n\n                    openaccess.shouldBeResolvableToIndependent = options.prop(\n                        \"class.loading.be-resolvable-to-independent\", \"true\"\n                    ) { it.toBooleanStrict() }\n\n                    openaccess.shouldResolveIndependent = options.prop(\n                        \"class.loading.resolve-independent\", \"true\"\n                    ) { it.toBooleanStrict() }\n\n                    openaccess.shouldResolveConsoleSystemResource = options.prop(\n                        \"resources.resolve-console-system-resources\", \"false\"\n                    ) { it.toBooleanStrict() }\n\n                }.onFailure { err ->\n                    throw IllegalStateException(\n                        \"Exception while reading META-INF/mirai-console-plugin/options.properties\",\n                        err\n                    )\n                }\n            }\n        }\n        pluginSharedCL = DynLibClassLoader.newInstance(\n            ctx.sharedLibrariesLoader, \"SharedCL{${file.name}}\", \"${file.name}[shared]\"\n        )\n        pluginIndependentCL = DynLibClassLoader.newInstance(\n            pluginSharedCL, \"IndependentCL{${file.name}}\", \"${file.name}[private]\"\n        )\n        pluginSharedCL.dependencies = mutableListOf()\n        addURL(file.toURI().toURL())\n    }\n\n    private val pluginMainPackages: MutableSet<String> = HashSet()\n    internal var declaredFilter: ExportManager? = null\n\n    val sharedClLoadedDependencies = mutableSetOf<String>()\n    val privateClLoadedDependencies = mutableSetOf<String>()\n    internal fun containsSharedDependency(\n        dependency: String\n    ): Boolean {\n        if (dependency in sharedClLoadedDependencies) return true\n        return dependencies.any { it.containsSharedDependency(dependency) }\n    }\n\n    internal fun linkPluginSharedLibraries(logger: MiraiLogger, dependencies: Collection<String>) {\n        linkLibraries(logger, dependencies, true)\n    }\n\n    internal fun linkPluginPrivateLibraries(logger: MiraiLogger, dependencies: Collection<String>) {\n        linkLibraries(logger, dependencies, false)\n    }\n\n    private val isPluginLibrariesLinked = AtomicBoolean(false)\n\n    fun linkPluginLibraries(logger: MiraiLogger) {\n        if (!isPluginLibrariesLinked.compareAndSet(false, true)) return\n\n        // Link jar dependencies\n        fun InputStream?.readDependencies(): Collection<String> {\n            if (this == null) return emptyList()\n            return bufferedReader().useLines { lines ->\n                lines.filterNot { it.isBlank() }\n                    .filterNot { it.startsWith('#') }\n                    .map { it.trim() }\n                    .toMutableList()\n            }\n        }\n        linkPluginSharedLibraries(\n            logger,\n            getResourceAsStream(\"META-INF/mirai-console-plugin/dependencies-shared.txt\").readDependencies()\n        )\n        linkPluginPrivateLibraries(\n            logger,\n            getResourceAsStream(\"META-INF/mirai-console-plugin/dependencies-private.txt\").readDependencies()\n        )\n    }\n\n    private fun linkLibraries(logger: MiraiLogger, dependencies: Collection<String>, shared: Boolean) {\n        if (dependencies.isEmpty()) return\n        val results = ctx.downloader.resolveDependencies(\n            dependencies, ctx.sharedLibrariesFilter,\n            DependencyFilter filter@{ node, _ ->\n                val depid = node.artifact.depId()\n                if (containsSharedDependency(depid)) return@filter false\n                if (depid in privateClLoadedDependencies) return@filter false\n                return@filter true\n            })\n        val files = results.artifactResults.mapNotNull { result ->\n            result.artifact?.let { it to it.file }\n        }\n        val linkType = if (shared) \"(shared)\" else \"(private)\"\n        files.forEach { (artifact, lib) ->\n            logger.verbose { \"Linking $lib $linkType\" }\n            if (shared) {\n                pluginSharedCL.addLib(lib)\n                sharedClLoadedDependencies.add(artifact.depId())\n            } else {\n                pluginIndependentCL.addLib(lib)\n                privateClLoadedDependencies.add(artifact.depId())\n            }\n            logger.debug { \"Linked $artifact $linkType <${if (shared) pluginSharedCL else pluginIndependentCL}>\" }\n        }\n    }\n\n    companion object {\n\n        init {\n            ClassLoader.registerAsParallelCapable()\n        }\n\n        fun newLoader(file: File, ctx: JvmPluginsLoadingCtx): JvmPluginClassLoaderN {\n            return when {\n                DynamicClasspathClassLoader.java9 -> JvmPluginClassLoaderN(file, ctx)\n                else -> JvmPluginClassLoaderN(file, ctx, Unit)\n            }\n        }\n    }\n\n    internal fun resolvePluginSharedLibAndPluginClass(name: String): Class<*>? {\n        return try {\n            pluginSharedCL.findButNoSystem(name)\n        } catch (e: ClassNotFoundException) {\n            null\n        } ?: resolvePluginPublicClass(name)\n    }\n\n    internal fun resolvePluginPublicClass(name: String): Class<*>? {\n        if (pluginMainPackages.contains(name.pkgName())) {\n            if (declaredFilter?.isExported(name) == false) return null\n            synchronized(getClassLoadingLock(name)) {\n                findLoadedClass(name)?.let { return it }\n                try {\n                    return super.findClass(name)\n                } catch (ignored: ClassNotFoundException) {\n                }\n            }\n        }\n        return null\n    }\n\n    override fun loadClass(name: String, resolve: Boolean): Class<*> = loadClass(name)\n\n    override fun loadClass(name: String): Class<*> {\n        DynLibClassLoader.tryFastOrStrictResolve(name)?.let { return it }\n\n        sharedLibrariesLogger.loadClassInThisClassLoader(name)?.let { return it }\n\n        // Search dependencies first\n        dependencies.forEach { dependency ->\n            dependency.resolvePluginSharedLibAndPluginClass(name)?.let { return it }\n        }\n        // Search in independent class loader\n        // @context: pluginIndependentCL.parent = pluinSharedCL\n        try {\n            pluginIndependentCL.findButNoSystem(name)?.let { return it }\n        } catch (ignored: ClassNotFoundException) {\n        }\n\n        try {\n            synchronized(getClassLoadingLock(name)) {\n                findLoadedClass(name)?.let { return it }\n                return super.findClass(name)\n            }\n        } catch (error: ClassNotFoundException) {\n            if (!openaccess.shouldResolveIndependent) {\n                return ctx.consoleClassLoader.loadClass(name)\n            }\n\n            // Finally, try search from other plugins and console system\n            ctx.pluginClassLoaders.forEach { other ->\n                if (other !== this && other !in dependencies) {\n\n                    if (!other.openaccess.shouldBeResolvableToIndependent)\n                        return@forEach\n\n                    other.resolvePluginPublicClass(name)?.let {\n                        if (undefinedDependencies.add(other.file.name)) {\n                            linkedLogger.warning { \"Linked class $name in ${other.file.name} but plugin not depend on it.\" }\n                            linkedLogger.warning { \"Class loading logic may change in feature.\" }\n                        }\n                        return it\n                    }\n                }\n            }\n            return ctx.consoleClassLoader.loadClass(name)\n        }\n    }\n\n    internal fun loadedClass(name: String): Class<*>? = super.findLoadedClass(name)\n\n    private fun getRes(name: String, shared: Boolean): Enumeration<URL> {\n        val src = mutableListOf<Enumeration<URL>>(\n            findResources(name),\n        )\n        if (dependencies.isEmpty()) {\n            if (shared) {\n                src.add(sharedLibrariesLogger.getResources(name))\n            }\n        } else {\n            dependencies.forEach { dep ->\n                src.add(dep.getRes(name, false))\n            }\n        }\n        src.add(pluginIndependentCL.getResources(name))\n\n        val resolved = LinkedHashSet<URL>()\n\n        if (openaccess.shouldResolveConsoleSystemResource) {\n            DynLibClassLoader.tryFastOrStrictResolveResources(name).let { resolved.addAll(it) }\n        }\n        src.forEach { nested -> resolved.addAll(nested) }\n\n        return Collections.enumeration(resolved)\n    }\n\n    override fun getResources(name: String?): Enumeration<URL> {\n        name ?: return Collections.emptyEnumeration()\n\n        if (name.startsWith(\"META-INF/mirai-console-plugin/\"))\n            return findResources(name)\n        // Avoid loading duplicated mirai-console plugins\n        if (name.startsWith(\"META-INF/services/net.mamoe.mirai.console.plugin.\"))\n            return findResources(name)\n\n        return getRes(name, true)\n    }\n\n    override fun getResource(name: String?): URL? {\n        name ?: return null\n        if (name.startsWith(\"META-INF/mirai-console-plugin/\"))\n            return findResource(name)\n        // Avoid loading duplicated mirai-console plugins\n        if (name.startsWith(\"META-INF/services/net.mamoe.mirai.console.plugin.\"))\n            return findResource(name)\n\n        if (openaccess.shouldResolveConsoleSystemResource) {\n            DynLibClassLoader.tryFastOrStrictResolveResources(name)\n                .takeIf { it.hasMoreElements() }\n                ?.let { return it.nextElement() }\n        }\n\n        findResource(name)?.let { return it }\n        // parent: ctx.sharedLibrariesLoader\n        sharedLibrariesLogger.getResource(name)?.let { return it }\n        dependencies.forEach { dep ->\n            dep.getResource(name)?.let { return it }\n        }\n        return pluginIndependentCL.getResource(name)\n    }\n\n    override fun toString(): String {\n        return \"JvmPluginClassLoader{${file.name}}\"\n    }\n\n    inner class OpenAccess : JvmPluginClasspath {\n        override val pluginFile: File\n            get() = this@JvmPluginClassLoaderN.file\n\n        override val pluginClassLoader: ClassLoader\n            get() = this@JvmPluginClassLoaderN\n\n        override val pluginSharedLibrariesClassLoader: ClassLoader\n            get() = pluginSharedCL\n        override val pluginIndependentLibrariesClassLoader: ClassLoader\n            get() = pluginIndependentCL\n\n        override var shouldResolveConsoleSystemResource: Boolean = false\n        override var shouldBeResolvableToIndependent: Boolean = true\n        override var shouldResolveIndependent: Boolean = true\n\n        private val permitted by lazy {\n            arrayOf(\n                this@JvmPluginClassLoaderN,\n                pluginSharedCL,\n                pluginIndependentCL,\n            )\n        }\n\n        override fun addToPath(classLoader: ClassLoader, file: File) {\n            if (classLoader !in permitted) {\n                throw IllegalArgumentException(\"Unsupported classloader or cross plugin accessing: $classLoader\")\n            }\n            if (classLoader == this@JvmPluginClassLoaderN) {\n                this@JvmPluginClassLoaderN.addURL(file.toURI().toURL())\n                return\n            }\n            classLoader as DynLibClassLoader\n            classLoader.addLib(file)\n        }\n\n        override fun downloadAndAddToPath(classLoader: ClassLoader, dependencies: Collection<String>) {\n            if (classLoader !in permitted) {\n                throw IllegalArgumentException(\"Unsupported classloader or cross plugin accessing: $classLoader\")\n            }\n            if (classLoader === this@JvmPluginClassLoaderN) {\n                throw IllegalArgumentException(\"Only support download dependencies to `plugin[Shared/Independent]LibrariesClassLoader`\")\n            }\n            this@JvmPluginClassLoaderN.linkLibraries(\n                linkedLogger, dependencies, classLoader === pluginSharedCL\n            )\n        }\n    }\n}\n\nprivate val JavaSystemPlatformClassLoader: ClassLoader by lazy {\n    kotlin.runCatching {\n        ClassLoader::class.java.methods.asSequence().filter {\n            it.name == \"getPlatformClassLoader\"\n        }.filter {\n            java.lang.reflect.Modifier.isStatic(it.modifiers)\n        }.firstOrNull()?.invoke(null) as ClassLoader?\n    }.getOrNull() ?: ClassLoader.getSystemClassLoader().parent\n}\n\nprivate fun String.pkgName(): String = substringBeforeLast('.', \"\")\ninternal fun Artifact.depId(): String = \"$groupId:$artifactId\"\n\nprivate operator fun <E> Enumeration<E>.plus(next: Enumeration<E>): Enumeration<E> {\n    return compoundEnumerations(listOf(this, next).iterator())\n}\n\nprivate fun <E> compoundEnumerations(iter: Iterator<Enumeration<E>>): Enumeration<E> {\n    return object : Enumeration<E> {\n        private lateinit var crt: Enumeration<E>\n\n        private var hasMore: Boolean = false\n        private var fetched: Boolean = false\n\n        override tailrec fun hasMoreElements(): Boolean {\n            if (fetched) return hasMore\n            if (::crt.isInitialized) {\n                hasMore = crt.hasMoreElements()\n                if (hasMore) {\n                    fetched = true\n                    return true\n                }\n            }\n            if (!iter.hasNext()) {\n                fetched = true\n                hasMore = false\n                return false\n            }\n            crt = iter.next()\n            return hasMoreElements()\n        }\n\n        override fun nextElement(): E {\n            if (hasMoreElements()) {\n                return crt.nextElement().also {\n                    fetched = false\n                }\n            }\n            throw NoSuchElementException()\n        }\n    }\n}\n\nprivate fun Properties.prop(key: String, def: String): String {\n    try {\n        return getProperty(key, def)\n    } catch (err: Throwable) {\n        throw IllegalStateException(\"Exception while reading `$key`\", err)\n    }\n}\n\nprivate inline fun <T> Properties.prop(key: String, def: String, dec: (String) -> T): T {\n    try {\n        return getProperty(key, def).let(dec)\n    } catch (err: Throwable) {\n        throw IllegalStateException(\"Exception while reading `$key`\", err)\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/plugin/JvmPluginDependencyDownload.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ConsoleFrontEndImplementation::class)\n\npackage net.mamoe.mirai.console.internal.plugin\n\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport net.mamoe.mirai.console.MiraiConsoleImplementation.ConsoleDataScope.Companion.get\nimport net.mamoe.mirai.console.fontend.ProcessProgress\nimport net.mamoe.mirai.console.internal.MiraiConsoleBuildDependencies\nimport net.mamoe.mirai.console.internal.data.builtins.DataScope\nimport net.mamoe.mirai.console.internal.data.builtins.PluginDependenciesConfig\nimport net.mamoe.mirai.console.plugin.PluginManager\nimport net.mamoe.mirai.console.util.renderMemoryUsageNumber\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.debug\nimport net.mamoe.mirai.utils.verbose\nimport org.apache.maven.repository.internal.MavenRepositorySystemUtils\nimport org.codehaus.plexus.util.ReaderFactory\nimport org.codehaus.plexus.util.xml.pull.MXParser\nimport org.codehaus.plexus.util.xml.pull.XmlPullParser\nimport org.eclipse.aether.RepositorySystem\nimport org.eclipse.aether.RepositorySystemSession\nimport org.eclipse.aether.artifact.Artifact\nimport org.eclipse.aether.artifact.DefaultArtifact\nimport org.eclipse.aether.collection.CollectRequest\nimport org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory\nimport org.eclipse.aether.graph.Dependency\nimport org.eclipse.aether.graph.DependencyFilter\nimport org.eclipse.aether.repository.LocalRepository\nimport org.eclipse.aether.repository.RemoteRepository\nimport org.eclipse.aether.repository.WorkspaceReader\nimport org.eclipse.aether.repository.WorkspaceRepository\nimport org.eclipse.aether.resolution.DependencyRequest\nimport org.eclipse.aether.resolution.DependencyResult\nimport org.eclipse.aether.spi.connector.RepositoryConnectorFactory\nimport org.eclipse.aether.spi.connector.transport.TransporterFactory\nimport org.eclipse.aether.transfer.AbstractTransferListener\nimport org.eclipse.aether.transfer.TransferEvent\nimport org.eclipse.aether.transport.http.HttpTransporterFactory\nimport java.io.File\nimport java.util.concurrent.ConcurrentHashMap\n\n\n@Suppress(\"DEPRECATION\", \"MemberVisibilityCanBePrivate\")\ninternal class JvmPluginDependencyDownloader(\n    val logger: MiraiLogger,\n) {\n    val repositories: MutableList<RemoteRepository>\n    val session: RepositorySystemSession\n    val locator: org.eclipse.aether.spi.locator.ServiceLocator\n    val repository: RepositorySystem\n    val dependencyFilter: DependencyFilter = DependencyFilter { node, _ ->\n        if (node == null || node.artifact == null) return@DependencyFilter true\n\n        val artGroup = node.artifact.groupId\n        val artId = node.artifact.artifactId\n\n\n        if (artGroup == \"net.mamoe\") {\n            if (artId in listOf(\n                    \"mirai-core\",\n                    \"mirai-core-jvm\",\n                    \"mirai-core-android\",\n                    \"mirai-core-api\",\n                    \"mirai-core-api-jvm\",\n                    \"mirai-core-api-android\",\n                    \"mirai-core-utils\",\n                    \"mirai-core-utils-jvm\",\n                    \"mirai-core-utils-android\",\n                    \"mirai-console\",\n                    \"mirai-console-terminal\",\n                    \"mirai-console-frontend-base\",\n                    \"mirai-console-compiler-annotations\",\n                    \"mirai-console-compiler-annotations-jvm\",\n                )\n            ) return@DependencyFilter false\n        }\n\n        // Re-download slf4j-api is unnecessary since slf4j-api was bound by console\n        if (artGroup == \"org.slf4j\" && artId == \"slf4j-api\") {\n            return@DependencyFilter false\n        }\n\n        // Loaded by console system\n        if (\"$artGroup:$artId\" in MiraiConsoleBuildDependencies.dependencies)\n            return@DependencyFilter false\n\n        // println(\"  `- filter: $node\")\n        true\n    }\n\n    init {\n        locator = MavenRepositorySystemUtils.newServiceLocator()\n        locator.addService(RepositoryConnectorFactory::class.java, BasicRepositoryConnectorFactory::class.java)\n        locator.addService(TransporterFactory::class.java, HttpTransporterFactory::class.java)\n        repository = locator.getService(RepositorySystem::class.java)\n        session = MavenRepositorySystemUtils.newSession()\n        session.checksumPolicy = \"fail\"\n        session.localRepositoryManager = repository.newLocalRepositoryManager(\n            session, LocalRepository(PluginManager.pluginLibrariesFolder)\n        )\n        session.transferListener = object : AbstractTransferListener() {\n            private val dwnProgresses: MutableMap<File, ProcessProgress> = ConcurrentHashMap()\n\n            override fun transferStarted(event: TransferEvent) {\n                logger.verbose {\n                    \"Downloading ${event.resource?.repositoryUrl}${event.resource?.resourceName}\"\n                }\n                val nw = MiraiConsoleImplementation.getInstance().createNewProcessProgress()\n                dwnProgresses.put(\n                    event.resource.file, nw\n                )?.close()\n                nw.setTotalSize(event.resource.contentLength)\n                nw.updateText(\"Downloading ${event.resource.resourceName}....\")\n            }\n\n            override fun transferSucceeded(event: TransferEvent) {\n                dwnProgresses.remove(event.resource.file)?.let { dp ->\n                    dp.updateText(buildString {\n                        append(\"Downloaded  \")\n                        append(event.resource.resourceName)\n                        append(\" (\")\n                        renderMemoryUsageNumber(this@buildString, event.resource.contentLength)\n                        append(\")\")\n                    })\n                    dp.close()\n                }\n            }\n\n            override fun transferProgressed(event: TransferEvent) {\n                dwnProgresses[event.resource.file]?.let { pg ->\n                    pg.update(event.transferredBytes)\n                    pg.updateText(buildString bs@{\n                        append(\"Downloading \")\n                        append(event.resource.resourceName)\n                        append(\" (\")\n                        val sz = this@bs.length\n                        renderMemoryUsageNumber(this@bs, event.transferredBytes)\n                        repeat(kotlin.math.max(0, 7 - (this@bs.length - sz))) {\n                            append(' ')\n                        }\n\n                        append(\" / \")\n                        renderMemoryUsageNumber(this@bs, event.resource.contentLength)\n                        append(\")\")\n                    })\n                    pg.rerender()\n                }\n            }\n\n            override fun transferFailed(event: TransferEvent) {\n                logger.warning(event.exception)\n                dwnProgresses.remove(event.resource.file)?.let {\n                    it.markFailed()\n                    it.close()\n                }\n            }\n        }\n        val userHome = System.getProperty(\"user.home\")\n        fun findMavenLocal(): File {\n            val mavenHome = File(userHome, \".m2\")\n            fun findFromSettingsXml(): File? {\n                val settings = File(mavenHome, \"settings.xml\")\n                if (!settings.isFile) return null\n                ReaderFactory.newXmlReader(settings).use { reader ->\n                    val parser = MXParser()\n                    parser.setInput(reader)\n\n                    var eventType = parser.eventType\n                    var joinedSettings = false\n                    while (eventType != XmlPullParser.END_DOCUMENT) {\n                        when (eventType) {\n                            XmlPullParser.START_TAG -> {\n                                if (!joinedSettings) {\n                                    if (parser.name != \"settings\") {\n                                        return null\n                                    }\n                                    joinedSettings = true\n                                } else {\n                                    if (parser.name == \"localRepository\") {\n                                        val loc = File(parser.nextText())\n                                        if (loc.isDirectory) return loc\n                                        return null\n                                    } else {\n                                        parser.skipSubTree()\n                                    }\n                                }\n                            }\n                            // else -> parser.skipSubTree()\n                        }\n                        eventType = parser.next()\n                    }\n                }\n                return null\n            }\n            return kotlin.runCatching {\n                findFromSettingsXml()\n            }.onFailure { error ->\n                logger.warning(error)\n            }.getOrNull() ?: File(mavenHome, \"repository\")\n        }\n\n        fun findGradleDepCache(): File {\n            var gradleHome = File(userHome, \".gradle\")\n            val gradleEnvHome = System.getenv(\"GRADLE_USER_HOME\").orEmpty()\n            if (gradleEnvHome.isNotBlank()) {\n                gradleHome = File(gradleEnvHome)\n            }\n            return File(gradleHome, \"caches/modules-2/files-2.1\")\n        }\n\n        val mavenLocRepo = findMavenLocal()\n        val gradleLocRepo = findGradleDepCache()\n        logger.debug { \"Maven        local: $mavenLocRepo\" }\n        logger.debug { \"Gradle cache local: $gradleLocRepo\" }\n        session.workspaceReader = object : WorkspaceReader {\n            private val repository: WorkspaceRepository = WorkspaceRepository(\"default\")\n            override fun getRepository(): WorkspaceRepository = repository\n\n            override fun findArtifact(artifact: Artifact): File? {\n                // logger.debug { \"Try resolve $artifact\" }\n                val path = session.localRepositoryManager.getPathForLocalArtifact(artifact)\n                File(mavenLocRepo, path).takeIf { it.isFile }?.let { return it }\n                val gradleDep = gradleLocRepo\n                    .resolve(artifact.groupId)\n                    .resolve(artifact.artifactId)\n                    .resolve(artifact.baseVersion)\n                if (gradleDep.isDirectory) {\n                    val fileName = buildString {\n                        append(artifact.artifactId)\n                        append('-')\n                        append(artifact.baseVersion)\n                        artifact.classifier?.takeIf { it.isNotEmpty() }?.let { c ->\n                            append('-').append(c)\n                        }\n                        append('.').append(artifact.extension)\n                    }\n                    gradleDep.walk().maxDepth(2)\n                        .filter { it.isFile }\n                        .firstOrNull { it.name == fileName }\n                        ?.let { return it }\n                }\n                return null\n            }\n\n            override fun findVersions(artifact: Artifact?): MutableList<String> {\n                return mutableListOf()\n            }\n\n        }\n        session.setReadOnly()\n        val config = DataScope.get<PluginDependenciesConfig>()\n        repositories = repository.newResolutionRepositories(\n            session,\n            config.repoLoc.map { url ->\n                RemoteRepository.Builder(url, \"default\", url).build()\n            }\n        )\n        logger.debug { \"Remote server: \" + config.repoLoc }\n    }\n\n    fun resolveDependencies(deps: Iterable<String>, vararg filters: DependencyFilter): DependencyResult {\n\n        val dependencies: MutableList<Dependency> = ArrayList()\n        for (library in deps) {\n            val defaultArtifact = DefaultArtifact(library)\n            val dependency = Dependency(defaultArtifact, null)\n            dependencies.add(dependency)\n        }\n        return repository.resolveDependencies(\n            session, DependencyRequest(\n                CollectRequest(\n                    null as Dependency?, dependencies,\n                    repositories\n                ),\n                when {\n                    filters.isEmpty() -> dependencyFilter\n                    else -> DependencyFilter { node, parents ->\n                        if (node == null || node.artifact == null) return@DependencyFilter true\n                        if (!dependencyFilter.accept(node, parents)) return@DependencyFilter false\n                        filters.forEach { filter ->\n                            if (!filter.accept(node, parents)) return@DependencyFilter false\n                        }\n                        return@DependencyFilter true\n                    }\n                }\n            )\n        )\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/plugin/JvmPluginInternal.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(MiraiInternalApi::class, ConsoleFrontEndImplementation::class, ConsoleExperimentalApi::class)\n\npackage net.mamoe.mirai.console.internal.plugin\n\nimport kotlinx.atomicfu.AtomicLong\nimport kotlinx.atomicfu.atomic\nimport kotlinx.atomicfu.locks.withLock\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport net.mamoe.mirai.console.data.runCatchingLog\nimport net.mamoe.mirai.console.extension.PluginComponentStorage\nimport net.mamoe.mirai.console.internal.data.mkdir\nimport net.mamoe.mirai.console.internal.extension.GlobalComponentStorage\nimport net.mamoe.mirai.console.internal.shutdown.ShutdownDaemon\nimport net.mamoe.mirai.console.permission.Permission\nimport net.mamoe.mirai.console.permission.PermissionService\nimport net.mamoe.mirai.console.plugin.Plugin\nimport net.mamoe.mirai.console.plugin.PluginManager\nimport net.mamoe.mirai.console.plugin.PluginManager.INSTANCE.safeLoader\nimport net.mamoe.mirai.console.plugin.ResourceContainer.Companion.asResourceContainer\nimport net.mamoe.mirai.console.plugin.id\nimport net.mamoe.mirai.console.plugin.jvm.AbstractJvmPlugin\nimport net.mamoe.mirai.console.plugin.jvm.JvmPlugin\nimport net.mamoe.mirai.console.plugin.jvm.JvmPlugin.Companion.onLoad\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.safeCast\nimport java.io.File\nimport java.io.InputStream\nimport java.nio.file.Path\nimport java.util.*\nimport java.util.concurrent.locks.ReentrantLock\nimport kotlin.coroutines.CoroutineContext\n\ninternal val <T> T.job: Job where T : CoroutineScope, T : Plugin get() = this.coroutineContext[Job]!!\n\n/**\n * Hides implementations from [JvmPlugin]\n */\n@PublishedApi\ninternal abstract class JvmPluginInternal(\n    parentCoroutineContext: CoroutineContext,\n) : JvmPlugin, CoroutineScope {\n    internal enum class PluginStatus {\n        ALLOCATED,\n\n        CRASHED_LOAD_ERROR(Flags.ALLOW_SWITCH_TO_DISABLE),\n        CRASHED_ENABLE_ERROR(Flags.ALLOW_SWITCH_TO_DISABLE),\n        CRASHED_DISABLE_ERROR,\n\n        LOAD_PENDING,\n        LOAD_LOADING,\n        LOAD_LOAD_DONE,\n\n        ENABLE_PENDING,\n        ENABLE_ENABLING,\n        ENABLED(Flags.ALLOW_SWITCH_TO_DISABLE),\n\n        DISABLE_PENDING,\n        DISABLE_DISABLING,\n        DISABLED,\n\n        ;\n\n        private val flags: Int\n\n        constructor() : this(0)\n        constructor(flags: Int) {\n            this.flags = flags\n        }\n\n        internal object Flags { // compiler bug: [UNINITIALIZED_VARIABLE] Variable 'FLAG_ALLOW_SWITCH_TO_DISABLE' must be initialized\n            internal const val ALLOW_SWITCH_TO_DISABLE = 1 shl 0\n        }\n\n        fun hasFlag(flag: Int): Boolean = flags.and(flag) != 0\n    }\n\n    private val pluginStatus = atomic(PluginStatus.ALLOCATED)\n\n    @get:JvmSynthetic\n    internal val currentPluginStatus: PluginStatus get() = pluginStatus.value\n\n    final override val isEnabled: Boolean\n        get() = pluginStatus.value === PluginStatus.ENABLED\n\n    @JvmSynthetic\n    internal fun switchStatusOrFail(expectFlag: Int, update: PluginStatus) {\n        val nowStatus = pluginStatus.value\n        if (nowStatus.hasFlag(expectFlag)) {\n            if (pluginStatus.compareAndSet(expect = nowStatus, update = update)) {\n                return\n            }\n            error(\"Failed to switch plugin '$id' status from $nowStatus to $update, current status = ${pluginStatus.value}\")\n        }\n        error(\n            \"Failed to switch plugin '$id' status to $update because current status $nowStatus doesn't contain flag ${\n                Integer.toBinaryString(\n                    expectFlag\n                )\n            }\"\n        )\n    }\n\n    @JvmSynthetic\n    internal fun switchStatusOrFail(expect: PluginStatus, update: PluginStatus) {\n        val nowStatus = pluginStatus.value\n        if (nowStatus === expect) {\n            if (pluginStatus.compareAndSet(expect = expect, update = update)) {\n                return\n            }\n            error(\"Failed to switch plugin '$id' status from $expect to $update, current status=${pluginStatus.value}\")\n        }\n        error(\"Failed to switch plugin '$id' status from $expect to $update, current status = $nowStatus\")\n    }\n\n\n    final override val parentPermission: Permission by lazy {\n        PermissionService.INSTANCE.register(\n            PermissionService.INSTANCE.allocatePermissionIdForPlugin(this, \"*\"),\n            \"The base permission\"\n        )\n    }\n\n\n    private val resourceContainerDelegate by lazy { this::class.java.classLoader.asResourceContainer() }\n    final override fun getResourceAsStream(path: String): InputStream? =\n        resourceContainerDelegate.getResourceAsStream(path)\n\n    // region JvmPlugin\n    final override val logger: MiraiLogger by lazy {\n        BuiltInJvmPluginLoaderImpl.logger.runCatchingLog {\n            MiraiLogger.Factory.create(this@JvmPluginInternal::class, this.description.name)\n        }.getOrThrow()\n    }\n\n    private var firstRun = true\n\n    final override val dataFolderPath: Path by lazy {\n        PluginManager.pluginsDataPath.resolve(description.id).apply { mkdir() }\n    }\n\n    final override val dataFolder: File by lazy {\n        dataFolderPath.toFile()\n    }\n\n    final override val configFolderPath: Path by lazy {\n        PluginManager.pluginsConfigPath.resolve(description.id).apply { mkdir() }\n    }\n\n    final override val configFolder: File by lazy {\n        configFolderPath.toFile()\n    }\n\n    internal fun internalOnDisable() {\n\n        switchStatusOrFail(\n            expectFlag = PluginStatus.Flags.ALLOW_SWITCH_TO_DISABLE,\n            update = PluginStatus.DISABLE_PENDING,\n        )\n\n        firstRun = false\n        kotlin.runCatching {\n            val crtThread = Thread.currentThread()\n            ShutdownDaemon.pluginDisablingThreads.add(crtThread)\n            try {\n                pluginStatus.value = PluginStatus.DISABLE_DISABLING\n                onDisable()\n            } finally {\n                ShutdownDaemon.pluginDisablingThreads.remove(crtThread)\n            }\n        }.fold(\n            onSuccess = {\n                pluginStatus.value = PluginStatus.DISABLED\n\n                cancel(CancellationException(\"plugin disabled\"))\n            },\n            onFailure = { err ->\n                pluginStatus.value = PluginStatus.CRASHED_DISABLE_ERROR\n\n                cancel(CancellationException(\"Exception while disabling plugin\", err))\n\n                // @TestOnly\n                if (err is ConsoleJvmPluginTestFailedError) throw err\n\n                if (MiraiConsoleImplementation.getInstance().consoleLaunchOptions.crashWhenPluginLoadFailed) {\n                    throw err\n                }\n            }\n        )\n    }\n\n    @Throws(Throwable::class)\n    internal fun internalOnLoad() {\n        switchStatusOrFail(PluginStatus.ALLOCATED, PluginStatus.LOAD_PENDING)\n\n        try {\n            pluginStatus.value = PluginStatus.LOAD_LOADING\n\n            val componentStorage = PluginComponentStorage(this)\n            onLoad(componentStorage)\n\n            pluginStatus.value = PluginStatus.LOAD_LOAD_DONE\n            GlobalComponentStorage.mergeWith(componentStorage)\n\n        } catch (e: Throwable) {\n            pluginStatus.value = PluginStatus.CRASHED_LOAD_ERROR\n\n            cancel(CancellationException(\"Exception while loading plugin\", e))\n\n            throw e\n        }\n    }\n\n\n    internal fun internalOnEnable(): Boolean {\n        switchStatusOrFail(PluginStatus.LOAD_LOAD_DONE, PluginStatus.ENABLE_PENDING)\n\n        parentPermission\n        if (!firstRun) refreshCoroutineContext()\n\n        val except = try {\n            javaClass.getDeclaredAnnotation(ConsoleJvmPluginFuncCallbackStatusExcept.OnEnable::class.java)\n        } catch (e: Throwable) {\n            null\n        }\n\n        kotlin.runCatching {\n            pluginStatus.value = PluginStatus.ENABLE_ENABLING\n            onEnable()\n        }.fold(\n            onSuccess = {\n                if (except?.excepted == ConsoleJvmPluginFuncCallbackStatus.FAILED) {\n                    val msg = \"Test point '${javaClass.name}' assets failed but onEnable() invoked successfully\"\n                    cancel(msg)\n                    logger.error(msg)\n                    throw AssertionError(msg)\n                }\n                pluginStatus.value = PluginStatus.ENABLED\n                return true\n            },\n            onFailure = { err ->\n                pluginStatus.value = PluginStatus.CRASHED_ENABLE_ERROR\n\n                cancel(CancellationException(\"Exception while enabling plugin\", err))\n                logger.error(err)\n\n                // @TestOnly\n                if (err is ConsoleJvmPluginTestFailedError) throw err\n\n                when (except?.excepted) {\n                    ConsoleJvmPluginFuncCallbackStatus.SUCCESS -> throw err\n                    ConsoleJvmPluginFuncCallbackStatus.FAILED -> return false\n                    else -> {}\n                }\n\n                if (MiraiConsoleImplementation.getInstance().consoleLaunchOptions.crashWhenPluginLoadFailed) {\n                    throw err\n                }\n                return false\n            }\n        )\n    }\n\n    // region JvmPlugin - Single Module Dependencies\n    @Suppress(\"FunctionName\")\n    @JvmSynthetic\n    internal fun __jpi_try_to_init_dependencies() {\n        val classloader = javaClass.classLoader.safeCast<JvmPluginClassLoaderN>() ?: return\n        val desc = try {\n            Objects.requireNonNull(description)\n        } catch (ignored: NullPointerException) {\n            return\n        }\n        if (desc.dependencies.isEmpty()) {\n            classloader.linkPluginLibraries(logger)\n        }\n\n    }\n    // endregion\n\n    // endregion\n\n    // region CoroutineScope\n\n    // for future use\n    @Suppress(\"PropertyName\")\n    @get:JvmSynthetic\n    internal val _intrinsicCoroutineContext: CoroutineContext by lazy {\n        this as AbstractJvmPlugin\n        CoroutineName(\"Plugin $dataHolderName\")\n    }\n\n    private val pluginParentJob: Job = run {\n        val job = parentCoroutineContext[Job] ?: JvmPluginLoader.coroutineContext[Job]!!\n\n        val pluginManagerJob = MiraiConsole.pluginManager.impl.coroutineContext.job\n\n        val allJobs = generateSequence(sequenceOf(pluginManagerJob)) { parentSeqs ->\n            parentSeqs.flatMap { it.children }\n        }.flatten()\n\n        check(allJobs.contains(job)) {\n            \"The parent job of plugin `$id' not a child of PluginManager\"\n        }\n\n        job\n    }\n\n    @JvmField\n    @JvmSynthetic\n    internal val coroutineContextInitializer = {\n        CoroutineExceptionHandler { context, throwable ->\n            if (throwable.rootCauseOrSelf !is CancellationException) logger.error(\n                \"Exception in coroutine ${context[CoroutineName]?.name ?: \"<unnamed>\"} of ${description.name}\",\n                throwable\n            )\n        }\n            .plus(parentCoroutineContext)\n            .plus(SupervisorJob(pluginParentJob))\n            .plus(_intrinsicCoroutineContext)\n    }\n\n    private fun refreshCoroutineContext(): CoroutineContext {\n        return coroutineContextInitializer().also { _coroutineContext = it }.also {\n            job.invokeOnCompletion { e ->\n                if (e != null) {\n                    if (e !is CancellationException) logger.error(e)\n                    if (pluginStatus.value == PluginStatus.ENABLED) {\n                        safeLoader.disable(this)\n                    }\n                }\n            }\n        }\n    }\n\n    private val contextUpdateLock: ReentrantLock =\n        ReentrantLock()\n    private var _coroutineContext: CoroutineContext? = null\n    final override val coroutineContext: CoroutineContext\n        get() = _coroutineContext\n            ?: contextUpdateLock.withLock { _coroutineContext ?: refreshCoroutineContext() }\n\n    // endregion\n}\n\ninternal inline fun AtomicLong.updateWhen(condition: (Long) -> Boolean, update: (Long) -> Long): Boolean {\n    while (true) {\n        val current = value\n        if (condition(current)) {\n            if (compareAndSet(current, update(current))) {\n                return true\n            } else continue\n        }\n        return false\n    }\n}\n\ninternal val Throwable.rootCauseOrSelf: Throwable get() = generateSequence(this) { it.cause }.lastOrNull() ?: this\n\ninternal fun Class<out JvmPluginInternal>.loadPluginDescriptionFromClassLoader(): JvmPluginDescription {\n    val classLoader =\n        this.classLoader as? JvmPluginClassLoaderN ?: error(\"Plugin $this is not loaded by JvmPluginClassLoader\")\n\n    return classLoader.pluginDescriptionFromPluginResource ?: error(\"Missing `plugin.yml`\")\n}\n\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/plugin/JvmPluginTesting.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.internal.plugin\n\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n/**\n * 仅用于 Console 测试, 标记期望方法执行结果应该是 success 还是 failed\n */\n@MiraiInternalApi\npublic annotation class ConsoleJvmPluginFuncCallbackStatusExcept {\n    @MiraiInternalApi\n    @Target(AnnotationTarget.CLASS)\n    public annotation class OnEnable(\n        val excepted: ConsoleJvmPluginFuncCallbackStatus,\n    )\n}\n\n@MiraiInternalApi\npublic enum class ConsoleJvmPluginFuncCallbackStatus {\n    SUCCESS, FAILED\n}\n\n@MiraiInternalApi\npublic class ConsoleJvmPluginTestFailedError : Error {\n    public constructor() : super()\n    public constructor(cause: Throwable?) : super(cause)\n    public constructor(msg: String?, cause: Throwable?) : super(msg, cause)\n    public constructor(msg: String?) : super(msg)\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/plugin/MiraiConsoleAsPlugin.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.internal.plugin\n\nimport net.mamoe.mirai.console.command.ConsoleCommandOwner\nimport net.mamoe.mirai.console.internal.MiraiConsoleBuildConstants\nimport net.mamoe.mirai.console.permission.Permission\nimport net.mamoe.mirai.console.permission.PermissionId\nimport net.mamoe.mirai.console.plugin.Plugin\nimport net.mamoe.mirai.console.plugin.PluginManager.INSTANCE.description\nimport net.mamoe.mirai.console.plugin.description.PluginDependency\nimport net.mamoe.mirai.console.plugin.description.PluginDescription\nimport net.mamoe.mirai.console.plugin.loader.PluginLoader\nimport net.mamoe.mirai.console.util.SemVersion\n\ninternal object MiraiConsoleAsPlugin : Plugin {\n    // MiraiConsole always enabled\n    override val isEnabled: Boolean get() = true\n\n    override val loader: PluginLoader<*, *> get() = TheLoader\n\n    override val parentPermission: Permission\n        get() = ConsoleCommandOwner.parentPermission\n\n    override fun permissionId(name: String): PermissionId {\n        return ConsoleCommandOwner.permissionId(name)\n    }\n\n    internal object TheLoader : PluginLoader<Plugin, PluginDescription> {\n        override fun listPlugins(): List<Plugin> = listOf(MiraiConsoleAsPlugin)\n\n        override fun disable(plugin: Plugin) {\n            // noop\n        }\n\n        override fun enable(plugin: Plugin) {\n            // noop\n        }\n\n        override fun load(plugin: Plugin) {\n            // noop\n        }\n\n        override fun getPluginDescription(plugin: Plugin): PluginDescription {\n            if (plugin !== MiraiConsoleAsPlugin) {\n                error(\"loader not match with \" + plugin.description.id)\n            }\n            return TheDescription\n        }\n    }\n\n    internal object TheDescription : PluginDescription {\n        override val id: String get() = \"net.mamoe.mirai-console\"\n        override val name: String get() = \"Console\"\n        override val author: String get() = \"Mamoe Technologies\"\n        override val version: SemVersion get() = MiraiConsoleBuildConstants.version\n        override val info: String get() = \"\"\n        override val dependencies: Set<PluginDependency> get() = setOf()\n\n\n        override fun toString(): String {\n            return \"PluginDescription[ mirai-console ]\"\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/plugin/NotYetLoadedJvmPlugin.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.internal.plugin\n\nimport net.mamoe.mirai.console.data.runCatchingLog\nimport net.mamoe.mirai.console.permission.Permission\nimport net.mamoe.mirai.console.permission.PermissionId\nimport net.mamoe.mirai.console.permission.PermissionService\nimport net.mamoe.mirai.console.plugin.NotYetLoadedPlugin\nimport net.mamoe.mirai.console.plugin.jvm.JvmPlugin\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.utils.MiraiLogger\nimport java.io.File\nimport java.io.InputStream\nimport java.nio.file.Path\nimport kotlin.coroutines.CoroutineContext\n\ninternal abstract class NotYetLoadedJvmPlugin(\n    override val description: JvmPluginDescription,\n    val classLoaderN: JvmPluginClassLoaderN,\n) : JvmPlugin, NotYetLoadedPlugin<JvmPlugin> {\n    abstract override fun resolve(): JvmPlugin\n\n    override val logger: MiraiLogger by lazy {\n        BuiltInJvmPluginLoaderImpl.logger.runCatchingLog {\n            MiraiLogger.Factory.create(NotYetLoadedJvmPlugin::class, this.description.name)\n        }.getOrThrow()\n    }\n\n    override val isEnabled: Boolean get() = false\n    override val parentPermission: Permission\n        get() = error(\"Not yet loaded\")\n\n    override fun permissionId(name: String): PermissionId {\n        return PermissionService.INSTANCE.allocatePermissionIdForPlugin(this, name)\n    }\n\n    override val coroutineContext: CoroutineContext\n        get() = error(\"Not yet loaded\")\n    override val dataFolderPath: Path\n        get() = error(\"Not yet loaded\")\n    override val dataFolder: File\n        get() = error(\"Not yet loaded\")\n    override val configFolderPath: Path\n        get() = error(\"Not yet loaded\")\n    override val configFolder: File\n        get() = error(\"Not yet loaded\")\n\n    override fun getResourceAsStream(path: String): InputStream? {\n        return classLoaderN.getResourceAsStream(path)\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/plugin/PluginDescriptionUtil.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.internal.plugin\n\nimport net.mamoe.mirai.console.plugin.description.PluginDescription\n\ninternal fun PluginDescription.smartToString(): String {\n    return \"$name v$version\"\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/plugin/PluginManagerImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\", \"unused\")\n\npackage net.mamoe.mirai.console.internal.plugin\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.job\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.extensions.PluginLoaderProvider\nimport net.mamoe.mirai.console.internal.data.mkdir\nimport net.mamoe.mirai.console.internal.extension.GlobalComponentStorage\nimport net.mamoe.mirai.console.plugin.NotYetLoadedPlugin\nimport net.mamoe.mirai.console.plugin.Plugin\nimport net.mamoe.mirai.console.plugin.PluginManager\nimport net.mamoe.mirai.console.plugin.PluginManager.INSTANCE.description\nimport net.mamoe.mirai.console.plugin.PluginManager.INSTANCE.safeLoader\nimport net.mamoe.mirai.console.plugin.description.PluginDependency\nimport net.mamoe.mirai.console.plugin.description.PluginDescription\nimport net.mamoe.mirai.console.plugin.loader.PluginLoadException\nimport net.mamoe.mirai.console.plugin.loader.PluginLoader\nimport net.mamoe.mirai.console.plugin.name\nimport net.mamoe.mirai.console.util.SemVersion\nimport net.mamoe.mirai.utils.*\nimport java.io.File\nimport java.nio.file.Path\nimport java.util.concurrent.CopyOnWriteArrayList\nimport kotlin.coroutines.CoroutineContext\n\ninternal val PluginManager.impl: PluginManagerImpl get() = this.cast()\n\ninternal class PluginManagerImpl(\n    private val parentCoroutineContext: CoroutineContext\n) : PluginManager, CoroutineScope by parentCoroutineContext.childScope(\"PluginManager\") {\n\n    override val pluginsPath: Path = MiraiConsole.rootPath.resolve(\"plugins\").apply { mkdir() }\n    override val pluginsFolder: File = pluginsPath.toFile()\n    override val pluginsDataPath: Path = MiraiConsole.rootPath.resolve(\"data\").apply { mkdir() }\n    override val pluginsDataFolder: File = pluginsDataPath.toFile()\n    override val pluginsConfigPath: Path = MiraiConsole.rootPath.resolve(\"config\").apply { mkdir() }\n    override val pluginsConfigFolder: File = pluginsConfigPath.toFile()\n\n    override val pluginLibrariesPath: Path = MiraiConsole.rootPath.resolve(\"plugin-libraries\").apply { mkdir() }\n    override val pluginLibrariesFolder: File = pluginLibrariesPath.toFile()\n\n    override val pluginSharedLibrariesPath: Path =\n        MiraiConsole.rootPath.resolve(\"plugin-shared-libraries\").apply { mkdir() }\n    override val pluginSharedLibrariesFolder: File = pluginSharedLibrariesPath.toFile()\n\n    @Suppress(\"ObjectPropertyName\")\n    private val _pluginLoaders: MutableList<PluginLoader<*, *>> by lazy {\n        builtInLoaders.toMutableList()\n    }\n\n    private val logger = MiraiLogger.Factory.create(PluginManager::class, \"plugin\")\n\n    @JvmField\n    internal val resolvedPlugins: MutableList<Plugin> =\n        CopyOnWriteArrayList() // write operations are mostly performed on init\n    override val plugins: List<Plugin>\n        get() = resolvedPlugins.toList()\n    override val builtInLoaders: List<PluginLoader<*, *>> by lazy {\n        MiraiConsole.builtInPluginLoaders.map { it.value }\n    }\n    override val pluginLoaders: List<PluginLoader<*, *>>\n        get() = _pluginLoaders.toList()\n\n    override fun getPluginDescription(plugin: Plugin): PluginDescription =\n        plugin.safeLoader.getPluginDescription(plugin)\n\n    init {\n        // Kotlin coroutine job cancelling ordering:\n        // - sub job 0 invokeOnCompletion called\n        // - sub job 1 invokeOnCompletion called\n        // - sub job N invokeOnCompletion called\n        // - parent    invokeOnCompletion called\n        // So we need register a child job to control plugins' disabling order\n        this.childScopeContext(\"PluginManager shutdown monitor\").job.invokeOnCompletion {\n            plugins.asReversed().forEach { plugin ->\n                if (plugin.isEnabled) {\n                    disablePlugin(plugin)\n                }\n            }\n        }\n\n        resolvedPlugins.add(MiraiConsoleAsPlugin)\n    }\n\n    // region LOADING\n\n    private fun <P : Plugin, D : PluginDescription> PluginLoader<P, D>.loadPluginNoEnable(plugin: P) {\n        kotlin.runCatching {\n            this.load(plugin)\n\n            resolvedPlugins.add(\n                when (plugin) {\n                    is NotYetLoadedPlugin<*> -> plugin.resolve()\n\n                    else -> plugin\n                }\n            )\n\n        }.fold(\n            onSuccess = {\n                logger.info { \"Successfully loaded plugin ${getPluginDescription(plugin).smartToString()}\" }\n            },\n            onFailure = {\n                logger.info { \"Cannot load plugin ${getPluginDescription(plugin).smartToString()}\" }\n                throw it\n            }\n        )\n    }\n\n    private fun <P : Plugin, D : PluginDescription> PluginLoader<P, D>.enablePlugin(plugin: Plugin) {\n        kotlin.runCatching {\n            @Suppress(\"UNCHECKED_CAST\")\n            this.enable(plugin as P)\n        }.fold(\n            onSuccess = {\n                logger.info { \"Successfully enabled plugin ${getPluginDescription(plugin).smartToString()}\" }\n            },\n            onFailure = {\n                logger.info { \"Cannot enable plugin ${getPluginDescription(plugin).smartToString()}\" }\n                throw it\n            }\n        )\n    }\n\n    internal class PluginLoadSession(\n        val allKindsOfPlugins: List<PluginDescriptionWithLoader>,\n    )\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Phase #0:\n    // - initialize all plugins using builtin loaders\n    // - sort by dependencies\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 使用 [builtInLoaders] 寻找所有插件, 并初始化其主类.\n     */\n    @Suppress(\"UNCHECKED_CAST\")\n    @Throws(PluginResolutionException::class)\n    private fun findAndSortAllPluginsUsingBuiltInLoaders(): List<PluginDescriptionWithLoader> {\n        val allDescriptions =\n            builtInLoaders.listAndSortAllPlugins()\n                .asSequence()\n                .onEach { (_, descriptions) ->\n                    descriptions.let(::checkPluginDescription)\n                }\n\n        return allDescriptions.toList().sortByDependencies()\n    }\n\n    internal fun loadAllPluginsUsingBuiltInLoaders() {\n        for ((l, _, p) in findAndSortAllPluginsUsingBuiltInLoaders()) {\n            l.loadPluginNoEnable(p)\n        }\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Phase #1:\n    // - load PluginLoaderProvider\n    ///////////////////////////////////////////////////////////////////////////\n\n    internal fun initExternalPluginLoaders(): Int {\n        var count = 0\n        GlobalComponentStorage.useEachExtensions(PluginLoaderProvider) {\n            logger.info { \"Loaded PluginLoader ${extension.instance} from ${plugin?.name ?: \"<builtin>\"}\" }\n            _pluginLoaders.add(extension.instance)\n            count++\n        }\n        return count\n    }\n\n    // Phase #2\n    internal fun scanPluginsUsingPluginLoadersIncludingThoseFromPluginLoaderProvider(): PluginLoadSession {\n        return PluginLoadSession(_pluginLoaders.filterNot { builtInLoaders.contains(it) }.listAndSortAllPlugins())\n    }\n\n    internal fun loadPlugins(session: PluginLoadSession) {\n        session.allKindsOfPlugins.forEach { it.loader.load(it.plugin) }\n    }\n\n    internal fun enableAllLoadedPlugins() {\n        resolvedPlugins.forEach { enablePlugin(it) }\n    }\n\n    @kotlin.jvm.Throws(PluginLoadException::class)\n    internal fun checkPluginDescription(description: PluginDescription) {\n        kotlin.runCatching {\n            PluginDescription.checkPluginDescription(description)\n        }.getOrElse {\n            throw PluginLoadException(\"PluginDescription check failed.\", it)\n        }\n    }\n\n    private fun List<PluginLoader<*, *>>.listAndSortAllPlugins(): List<PluginDescriptionWithLoader> {\n        return flatMap { loader ->\n            loader.listPlugins().map { plugin -> getPluginDescription(plugin).wrapWith(loader, plugin) }\n        }.sortByDependencies()\n    }\n\n    @Throws(PluginResolutionException::class)\n    private fun <D : PluginDescription> List<D>.sortByDependencies(): List<D> {\n        val alreadyLoadedPlugins = resolvedPlugins.asSequence().map { it.description }.toList() // snapshot\n\n        val originPluginDescriptions = this@sortByDependencies\n        val pending2BeResolved = originPluginDescriptions.toMutableList()\n        val resolved = ArrayList<D>(pending2BeResolved.size)\n\n        fun <T> MutableCollection<T>.filterAndRemove(output: MutableCollection<T>, filter: (T) -> Boolean) {\n            this.removeAll { item ->\n                if (filter(item)) {\n                    output.add(item)\n                    true\n                } else false\n            }\n        }\n\n        // Step0. Check non contains death-locked dependencies graph.\n        kotlin.run deathLockDependenciesCheck@{\n            fun D.checkDependencyLink(list: MutableList<D>) {\n                if (this in list) {\n                    list.add(this)\n                    throw PluginInfiniteCircularDependencyReferenceException(\n                        \"Found circular plugin dependency: \" + list.joinToString(\" -> \") { it.id }\n                    )\n                }\n                list.add(this)\n                this.dependencies.forEach { dependency ->\n                    // In this step not care about dependency missing.\n                    val dep0 = pending2BeResolved.findDependency(dependency) ?: return@forEach\n                    dep0.checkDependencyLink(list)\n                }\n                list.removeLast()\n            }\n\n            pending2BeResolved.forEach { dependency ->\n                dependency.checkDependencyLink(mutableListOf())\n            }\n        }\n\n        // Step1. Fast process no-depended plugins\n        pending2BeResolved.filterAndRemove(resolved) { it.dependencies.isEmpty() }\n\n        // Step2. Check plugin dependencies graph\n        kotlin.run checkDependenciesMissing@{\n            val errorMsgs = mutableListOf<String>()\n            pending2BeResolved.forEach { pluginDesc ->\n                val missed = pluginDesc.dependencies.filter { dependency ->\n                    val resolvedDep = originPluginDescriptions.findDependency(dependency)\n                        ?: alreadyLoadedPlugins.findDependency(dependency)\n\n                    if (resolvedDep != null) {\n                        resolvedDep.checkSatisfies(dependency, pluginDesc)\n                        false\n                    } else !dependency.isOptional\n                }\n                if (missed.isNotEmpty()) {\n                    errorMsgs.add(\n                        \"Cannot load plugin '${pluginDesc.name}', missing dependencies: ${\n                            missed.joinToString(\n                                \", \"\n                            ) { \"'$it'\" }\n                        }\"\n                    )\n                }\n            }\n            if (errorMsgs.isNotEmpty()) {\n                throw PluginMissingDependencyException(errorMsgs.joinToString(\"\\n\"))\n            }\n        }\n\n        // Step3. Sort plugins with dependencies\n        var loopStart = 0 // For faster performance\n        sortWithOptionalDependencies@\n        while (true) {\n            fun searchRemainingDependencies(start: Int, dependency: PluginDependency): Int {\n                for (i in (start + 1) until pending2BeResolved.size) {\n                    val dep0 = pending2BeResolved[i]\n                    if (dep0.id.equals(dependency.id, ignoreCase = true)) {\n                        dep0.checkSatisfies(dependency, pending2BeResolved[i])\n                        return i\n                    }\n                }\n                return -1\n            }\n\n            for (index in loopStart until pending2BeResolved.size) {\n                // Ensure load after all depended plugins\n                val dep = pending2BeResolved[index]\n                for (pluginDependency in dep.dependencies) {\n                    val dependencyIndex = searchRemainingDependencies(index, pluginDependency)\n                    if (dependencyIndex != -1) {\n                        pending2BeResolved.removeAt(index)\n                        pending2BeResolved.add(dependencyIndex, dep)\n                        continue@sortWithOptionalDependencies\n                    }\n                }\n                loopStart = index + 1\n            }\n\n            resolved.addAll(pending2BeResolved)\n            pending2BeResolved.clear()\n            break@sortWithOptionalDependencies\n        }\n\n        return resolved\n    }\n\n\n    @Suppress(\"FunctionName\")\n    @TestOnly\n    internal fun <D : PluginDescription> __sortPluginDescription(list: List<D>): List<D> {\n        return list.sortByDependencies()\n    }\n}\n\ninternal data class PluginDescriptionWithLoader(\n    @JvmField val loader: PluginLoader<Plugin, PluginDescription>, // easier type\n    @JvmField val delegate: PluginDescription,\n    @JvmField val plugin: Plugin,\n) : PluginDescription by delegate\n\n@Suppress(\"UNCHECKED_CAST\")\ninternal fun <D : PluginDescription> PluginDescription.unwrap(): D =\n    if (this is PluginDescriptionWithLoader) this.delegate as D else this as D\n\n@Suppress(\"UNCHECKED_CAST\")\ninternal fun PluginDescription.wrapWith(loader: PluginLoader<*, *>, plugin: Plugin): PluginDescriptionWithLoader =\n    PluginDescriptionWithLoader(\n        loader as PluginLoader<Plugin, PluginDescription>, this, plugin\n    )\n\ninternal fun <T : PluginDescription> List<T>.findDependency(dependency: PluginDependency): T? {\n    return find { it.id.equals(dependency.id, ignoreCase = true) }\n}\n\ninternal fun PluginDescription.checkSatisfies(dependency: PluginDependency, plugin: PluginDescription) {\n    val requirement = dependency.versionRequirement ?: return\n    if (!SemVersion.parseRangeRequirement(requirement).test(this.version)) {\n        throw PluginLoadException(\"Plugin '${plugin.id}' ('${plugin.id}') requires '${dependency.id}' with version $requirement while the resolved is ${this.version}\")\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/shutdown/ShutdownDaemon.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ConsoleInternalApi::class)\n\npackage net.mamoe.mirai.console.internal.shutdown\n\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.internal.MiraiConsoleImplementationBridge\nimport net.mamoe.mirai.console.internal.pluginManagerImpl\nimport net.mamoe.mirai.console.plugin.PluginManager.INSTANCE.description\nimport net.mamoe.mirai.console.util.ConsoleInternalApi\nimport net.mamoe.mirai.utils.debug\nimport java.io.File\nimport java.io.FileDescriptor\nimport java.io.FileOutputStream\nimport java.io.PrintStream\nimport java.lang.management.ManagementFactory\nimport java.lang.reflect.Method\nimport java.nio.file.Paths\nimport java.time.Instant\nimport java.time.ZoneOffset\nimport java.util.*\nimport java.util.concurrent.ConcurrentLinkedDeque\nimport java.util.concurrent.Executors\nimport java.util.concurrent.ThreadFactory\nimport java.util.concurrent.atomic.AtomicBoolean\nimport java.util.concurrent.atomic.AtomicInteger\nimport kotlin.io.path.writeText\n\ninternal object ShutdownDaemon {\n    @Suppress(\"RemoveRedundantQualifierName\")\n    internal class DaemonStarter(\n        private val consoleImplementationBridge: MiraiConsoleImplementationBridge\n    ) {\n        private val started = AtomicBoolean(false)\n        fun tryStart() {\n            if (started.compareAndSet(false, true)) {\n                ShutdownDaemon.start(consoleImplementationBridge)\n            }\n        }\n    }\n\n    private object ThreadInfoJava9Access {\n        private val isDaemonM: Method?\n        private val getPriorityM: Method?\n\n        init {\n            var idm: Method? = null\n            var gpm: Method? = null\n            kotlin.runCatching {\n                val klass = Class.forName(\"java.lang.management.ThreadInfo\")\n                val mts = klass.methods.asSequence()\n                idm = mts.firstOrNull { it.name == \"isDaemon\" }\n                gpm = mts.firstOrNull { it.name == \"getPriority\" }\n            }\n            isDaemonM = idm\n            getPriorityM = gpm\n        }\n\n        fun isDaemon(inf: Any): Boolean {\n            isDaemonM?.invoke(inf)?.let { return it as Boolean }\n            return false\n        }\n\n        fun getPriority(inf: Any): Int {\n            getPriorityM?.invoke(inf)?.let { return it as Int }\n            return -1\n        }\n\n        val canGetPri: Boolean get() = getPriorityM != null\n    }\n\n    val pluginDisablingThreads = ConcurrentLinkedDeque<Thread>()\n\n\n    private val Thread.State.isWaiting: Boolean\n        get() = this == Thread.State.WAITING || this == Thread.State.TIMED_WAITING\n\n    @OptIn(DelicateCoroutinesApi::class)\n    private fun start(bridge: MiraiConsoleImplementationBridge) {\n        val crtThread = Thread.currentThread()\n        val isConsoleRunning = AtomicBoolean(true)\n        // 1 thread to run main daemon\n        // 1 thread to listen console shutdown running\n        // 1 thread reserved\n        val executor = Executors.newFixedThreadPool(3, object : ThreadFactory {\n            private val counter = AtomicInteger(0)\n            override fun newThread(r: Runnable): Thread {\n                return Thread(r, \"Mirai Console Shutdown Daemon #\" + counter.getAndIncrement()).also {\n                    it.isDaemon = true\n                }\n            }\n        })\n        executor.execute {\n            listen(crtThread, isConsoleRunning)\n            executor.shutdown()\n        }\n        GlobalScope.launch(executor.asCoroutineDispatcher()) {\n            bridge.coroutineContext.job.join()\n            isConsoleRunning.set(false)\n        }\n        bridge.mainLogger.debug { \"SHUTDOWN DAEMON STARTED.........\" }\n    }\n\n    @Suppress(\"MemberVisibilityCanBePrivate\")\n    fun dumpCrashReport(saveError: Boolean) {\n        val isAndroidSystem = kotlin.runCatching { Class.forName(\"android.util.Log\") }.isSuccess\n        val sb = StringBuilder(1024).append(\"\\n\\n\")\n        val now = System.currentTimeMillis()\n        sb.append(\"=============================================================\\n\")\n        sb.append(\"MIRAI CONSOLE CRASH REPORT.\\n\")\n        sb.append(\"Console has take too long to shutdown.\\n\\n\")\n        sb.append(\"TIME: \").append(now).append(\" <\")\n\n        fun msgAfterTimeDump() {\n            sb.append(\">\\nSYSTEM: \").append(System.getProperty(\"os.name\")).append(\" \")\n                .append(System.getProperty(\"os.arch\")).append(\" \").append(System.getProperty(\"os.version\"))\n\n            sb.append(\"\\nJRT:\\n  \")\n            sb.append(System.getProperty(\"java.runtime.name\"))\n            sb.append(\"  \").append(System.getProperty(\"java.version\"))\n            sb.append(\"\\n    by \").append(System.getProperty(\"java.vendor\"))\n            sb.append(\"\\nSPEC:\\n  \").append(System.getProperty(\"java.specification.name\")).append(\" \")\n                .append(System.getProperty(\"java.specification.version\"))\n            sb.append(\"\\n    by \").append(System.getProperty(\"java.specification.vendor\"))\n            sb.append(\"\\nVM:\\n  \").append(System.getProperty(\"java.vm.name\")).append(\" \")\n                .append(System.getProperty(\"java.vm.version\"))\n            sb.append(\"\\n    by \").append(System.getProperty(\"java.vm.vendor\"))\n\n            sb.append(\"\\n\\n\")\n            kotlin.runCatching {\n                sb.append(\"\\nPROCESS Working dir: \").append(File(\"a\").absoluteFile.parent ?: File(\".\").absoluteFile)\n                sb.append(\"\\nConsole Working Dir: \").append(MiraiConsole.rootPath.toAbsolutePath())\n            }\n            sb.append(\"\\nLoaded plugins:\\n\")\n            kotlin.runCatching {\n                MiraiConsole.pluginManagerImpl.resolvedPlugins.forEach { plugin ->\n                    val desc = plugin.description\n                    sb.append(\"|- \").append(desc.name).append(\" v\").append(desc.version).append('\\n')\n                    sb.append(\"|   `- ID: \").append(desc.id).append('\\n')\n                    desc.author.takeUnless { it.isBlank() }?.let {\n                        sb.append(\"|   `- AUTHOR: \").append(it).append('\\n')\n                    }\n                    sb.append(\"|   `- MAIN: \").append(plugin.javaClass).append('\\n')\n                    plugin.javaClass.protectionDomain?.codeSource?.location?.let { from ->\n                        @Suppress(\"IntroduceWhenSubject\")\n                        val f: Any = when {\n                            from.protocol == \"file\" -> Paths.get(from.toURI())\n                            else -> from\n                        }\n                        sb.append(\"|   `- FROM: \").append(f).append('\\n')\n                    }\n                }\n            }\n            sb.append(\"\\n\\n\\n\")\n        }\n\n        if (isAndroidSystem) {\n            sb.append(Date(now))\n            msgAfterTimeDump()\n            sb.append(\"\\n\\nTHREADS:\\n\\n\")\n            val threads = Thread.getAllStackTraces()\n            threads.forEach { (thread, stackTrace) ->\n                sb.append(\"\\n\\n\\n\").append(thread).append('\\n')\n                stackTrace.forEach { stack ->\n                    sb.append('\\t').append(stack).append('\\n')\n                }\n            }\n        } else {\n            object { // Android doesn't contain management system & classing boxing\n                fun a() {\n                    sb.append(Instant.ofEpochMilli(now).atOffset(ZoneOffset.UTC))\n                    msgAfterTimeDump()\n\n                    val rtMxBean = ManagementFactory.getRuntimeMXBean()\n                    sb.append(\"PROCESS: \").append(rtMxBean.name)\n                    sb.append(\"\\nVM OPTIONS:\\n\")\n                    rtMxBean.inputArguments.forEach { cmd ->\n                        sb.append(\"  \").append(cmd).append(\"\\n\")\n                    }\n                    sb.append(\"\\n\\nTHREADS:\\n\\n\")\n\n                    val threadMxBean = ManagementFactory.getThreadMXBean()\n                    val infs = threadMxBean.dumpAllThreads(true, true)\n                    infs.forEach { inf ->\n                        sb.append(\"\\n\\n\").append('\"')\n                        sb.append(inf.threadName)\n                        sb.append('\"')\n                        if (ThreadInfoJava9Access.isDaemon(inf)) {\n                            sb.append(\" daemon\")\n                        }\n                        if (ThreadInfoJava9Access.canGetPri) {\n                            sb.append(\" prio=\").append(ThreadInfoJava9Access.getPriority(inf))\n                        }\n                        sb.append(\" Id=\").append(inf.threadId)\n                        inf.lockName?.let { sb.append(\" on \").append(it) }\n                        inf.lockOwnerName?.let { lon ->\n                            sb.append(\" owned by \\\"\").append(lon)\n                            sb.append(\"\\\" Id=\").append(inf.lockOwnerId)\n                        }\n                        if (inf.isSuspended) sb.append(\" (suspended)\")\n                        if (inf.isInNative) sb.append(\" (in native)\")\n                        sb.append('\\n')\n                        val lockInf = inf.lockInfo\n                        val lockedMonitors = inf.lockedMonitors\n\n                        inf.stackTrace.forEachIndexed { index, stackTraceElement ->\n                            sb.append(\"\\tat \").append(stackTraceElement).append('\\n')\n                            if (index == 0 && lockInf != null) {\n                                when (inf.threadState!!) {\n                                    Thread.State.BLOCKED -> {\n                                        sb.append(\"\\t-  blocked on \").append(lockInf).append('\\n')\n                                    }\n                                    Thread.State.WAITING,\n                                    Thread.State.TIMED_WAITING -> {\n                                        sb.append(\"\\t-  waiting on \").append(lockInf).append('\\n')\n                                    }\n                                    else -> {}\n                                }\n                            }\n                            lockedMonitors.forEach { mi ->\n                                if (mi.lockedStackDepth == index) {\n                                    sb.append(\"\\t-  locked \").append(mi).append('\\n')\n                                }\n                            }\n                        }\n                        sb.append(\"\\n\\n\")\n                    }\n                }\n            }.a()\n        }\n        sb.append(\"\\n\\n\")\n        val report = sb.toString()\n        if (!isAndroidSystem && saveError) {\n            kotlin.runCatching {\n                PrintStream(FileOutputStream(FileDescriptor.err)).println(report)\n            }\n        }\n        if (saveError) {\n            val fileName = \"CONSOLE_CRASH_REPORT_${now}.log\"\n            kotlin.runCatching {\n                MiraiConsole.rootPath.resolve(fileName).writeText(report)\n            }.recoverCatching {\n                if (!isAndroidSystem) {\n                    File(\"CONSOLE_CRASH_REPORT_${now}.log\").writeText(report)\n                }\n            }\n        }\n        kotlin.runCatching {\n            MiraiConsole.mainLogger.error(report)\n        }\n    }\n\n    private fun listen(thread: Thread, consoleRunning: AtomicBoolean) {\n        val startTime = System.currentTimeMillis()\n        val timeout = 1000L * 60\n        while (consoleRunning.get()) {\n            val crtTime = System.currentTimeMillis()\n            if (crtTime - startTime >= timeout) {\n                kotlin.runCatching {\n                    dumpCrashReport(saveError = true)\n                }\n                pluginDisablingThreads.forEach { threadKill(it) }\n                threadKill(thread)\n                pluginDisablingThreads.clear()\n                return\n            }\n            Thread.sleep(1000)\n\n            // Force intercept known death codes\n            pluginDisablingThreads.forEach { pluginCrtThread ->\n                val stackTraces by lazy { pluginCrtThread.stackTrace }\n\n                if (pluginCrtThread.state.isWaiting) {\n                    /// java.desktop:\n                    //      WToolkit 关闭后执行 java.awt.Window.dispose() 会堵死在 native code\n                    for (i in 0 until stackTraces.size.coerceAtMost(10)) {\n                        val stack = stackTraces[i]\n                        if (stack.className.startsWith(\"java.awt.\") && stack.methodName.contains(\n                                \"dispose\",\n                                ignoreCase = true\n                            )\n                        ) {\n                            pluginCrtThread.interrupt()\n                            break\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    private fun threadKill(thread: Thread) {\n        thread.interrupt()\n        Thread.sleep(10)\n        if (!thread.isAlive) return\n        Thread.sleep(100)\n        if (!thread.isAlive) return\n        Thread.sleep(500)\n\n        @Suppress(\"DEPRECATION\")\n        if (thread.isAlive) thread.stop()\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/util/CommonUtils.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:JvmName(\"CommonUtils\") // maintain binary compatibility\n\npackage net.mamoe.mirai.console.internal.util\n\nimport io.github.karlatemp.caller.StackFrame\nimport net.mamoe.mirai.console.internal.plugin.implOrNull\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\n\ninternal inline fun <reified E : Throwable, R> runIgnoreException(block: () -> R): R? {\n    try {\n        return block()\n    } catch (e: Throwable) {\n        if (e is E) return null\n        throw e\n    }\n}\n\ninternal inline fun <reified E : Throwable> runIgnoreException(block: () -> Unit): Unit? {\n    try {\n        return block()\n    } catch (e: Throwable) {\n        if (e is E) return null\n        throw e\n    }\n}\n\ninternal fun StackFrame.findLoader(): ClassLoader? {\n    classInstance?.let { return it.classLoader }\n    return runCatching {\n        JvmPluginLoader.implOrNull?.findLoadedClass(className)?.classLoader\n    }.getOrNull()\n}\n\n@Suppress(\"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\", \"UnusedParameter\")\n@kotlin.internal.LowPriorityInOverloadResolution\ninternal inline fun <T : Any> T?.ifNull(block: () -> T): T {\n    contract { callsInPlace(block, InvocationKind.AT_MOST_ONCE) }\n    return this ?: block()\n}\n\n@Suppress(\"DeprecatedCallableAddReplaceWith\", \"UnusedParameter\", \"UNUSED_PARAMETER\")\n@Deprecated(\"Useless ifNull on not null value.\") // diagnostic deprecation\n@JvmName(\"ifNull1\")\ninternal inline fun <T : Any> T.ifNull(block: () -> T): T = this\n\n@PublishedApi\ninternal inline fun assertionError(message: () -> String = { \"Reached an unexpected branch.\" }): Nothing {\n    contract { callsInPlace(message, InvocationKind.EXACTLY_ONCE) }\n    throw AssertionError(message())\n}\n\n@PublishedApi\ninternal inline fun assertUnreachable(message: () -> String = { \"Reached an unexpected branch.\" }): Nothing {\n    contract { callsInPlace(message, InvocationKind.EXACTLY_ONCE) }\n    throw AssertionError(message())\n}\n\n@MarkerUnreachableClause\n@PublishedApi\ninternal inline val UNREACHABLE_CLAUSE: Nothing\n    get() = assertUnreachable()\n\n@DslMarker\nprivate annotation class MarkerUnreachableClause"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/util/ConsoleInputImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ConsoleFrontEndImplementation::class)\n\npackage net.mamoe.mirai.console.internal.util\n\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport net.mamoe.mirai.console.util.ConsoleInput\n\n@Suppress(\"unused\")\ninternal object ConsoleInputImpl : ConsoleInput {\n    private val inputLock = Mutex()\n\n    override suspend fun requestInput(hint: String): String =\n        inputLock.withLock { MiraiConsoleImplementation.getInstance().consoleInput.requestInput(hint) }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/util/JavaPluginSchedulerImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.internal.util\n\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.future.future\nimport net.mamoe.mirai.console.plugin.jvm.JavaPluginScheduler\nimport net.mamoe.mirai.utils.newCoroutineContextWithSupervisorJob\nimport java.util.concurrent.Callable\nimport java.util.concurrent.CompletableFuture\nimport java.util.concurrent.Future\nimport kotlin.coroutines.CoroutineContext\n\ninternal class JavaPluginSchedulerImpl internal constructor(parentCoroutineContext: CoroutineContext) : CoroutineScope,\n    JavaPluginScheduler {\n    override val coroutineContext: CoroutineContext =\n        parentCoroutineContext.newCoroutineContextWithSupervisorJob(this.toString())\n\n    override fun repeating(intervalMs: Long, runnable: Runnable): Future<Void?> {\n        return this.future {\n            while (isActive) {\n                runInterruptible(Dispatchers.IO) { runnable.run() }\n                delay(intervalMs)\n            }\n            null\n        }\n    }\n\n    override fun delayed(delayMillis: Long, runnable: Runnable): CompletableFuture<Void?> {\n        return future {\n            delay(delayMillis)\n            runInterruptible(Dispatchers.IO) {\n                runnable.run()\n            }\n            null\n        }\n    }\n\n    override fun <R> delayed(delayMillis: Long, callable: Callable<R>): CompletableFuture<R> {\n        return future {\n            delay(delayMillis)\n            runInterruptible(Dispatchers.IO) { callable.call() }\n        }\n    }\n\n    override fun <R> async(supplier: Callable<R>): Future<R> {\n        return future {\n            runInterruptible(Dispatchers.IO) { supplier.call() }\n        }\n    }\n\n    override fun async(runnable: Runnable): Future<Void?> {\n        return future {\n            runInterruptible(Dispatchers.IO) { runnable.run() }\n            null\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/util/PluginServiceHelper.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n@file:OptIn(MiraiInternalApi::class)\n\npackage net.mamoe.mirai.console.internal.util\n\nimport net.mamoe.mirai.console.internal.data.cast\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.createInstanceOrNull\nimport java.lang.reflect.Modifier\nimport java.util.*\nimport kotlin.reflect.KClass\nimport java.lang.reflect.Member as JReflectionMember\n\ninternal class ServiceList<T>(\n    internal val classLoader: ClassLoader,\n    internal val delegate: List<String>\n)\n\ninternal object PluginServiceHelper {\n    inline fun <reified T : Any> ClassLoader.findServices(): ServiceList<T> = findServices(T::class)\n\n    fun <T : Any> ClassLoader.findServices(vararg serviceTypes: KClass<out T>): ServiceList<T> =\n        serviceTypes.flatMap { serviceType ->\n            getResourceAsStream(\"META-INF/services/\" + serviceType.qualifiedName!!)?.let { stream ->\n                stream.bufferedReader().useLines { lines ->\n                    lines.filter(String::isNotBlank)\n                        .filter { it[0] != '#' }\n                        .toList()\n                }\n            }.orEmpty()\n        }.let { ServiceList(this, it) }\n\n    fun <T : Any> ServiceList<T>.loadAllServices(): List<T> {\n        return delegate.mapNotNull { classLoader.loadService(it) }\n    }\n\n    private fun <T : Any> ClassLoader.loadService(\n        classname: String,\n    ): T? {\n        @Suppress(\"UNCHECKED_CAST\")\n        return kotlin.runCatching {\n            val clazz =\n                Class.forName(classname, true, this).cast<Class<out T>>()\n            clazz.kotlin.objectInstance\n                ?: kotlin.runCatching {\n                    clazz.declaredFields.firstOrNull { it.isStatic() && it.name == \"INSTANCE\" }?.get(null)\n                }.getOrNull()\n                ?: clazz.kotlin.createInstanceOrNull()\n                ?: clazz.constructors.firstOrNull { it.parameterCount == 0 }?.newInstance()\n                ?: error(\"Cannot find a no-arg constructor\")\n        }.getOrElse {\n            throw ServiceLoadException(\"Could not load service ${classname}.\", it)\n\n            /*\n            logger.error(\n                { \"Could not load PluginLoader ${pluginQualifiedName}.\" },\n                PluginLoadException(\"Could not load PluginLoader ${pluginQualifiedName}.\", it)\n            )*/\n        } as T?\n    }\n\n    fun <T : Any> loadAllServicesFromMemoryAndPluginClassLoaders(service: KClass<T>): List<T> {\n        val list = ServiceLoader.load(service.java, this::class.java.classLoader).toList()\n        return list + JvmPluginLoader.classLoaders.flatMap { it.findServices(service).loadAllServices() }\n    }\n}\n\ninternal fun JReflectionMember.isStatic(): Boolean = this.modifiers.and(Modifier.STATIC) != 0\n\n@Suppress(\"unused\", \"RedundantVisibilityModifier\")\ninternal open class ServiceLoadException : RuntimeException {\n    public constructor() : super()\n    public constructor(message: String?) : super(message)\n    public constructor(message: String?, cause: Throwable?) : super(message, cause)\n    public constructor(cause: Throwable?) : super(cause)\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/util/semver/RequirementInternal.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.internal.util.semver\n\nimport net.mamoe.mirai.console.util.SemVersion\n\ninternal interface RequirementInternal {\n    fun test(version: SemVersion): Boolean\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/util/semver/RequirementParser.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.internal.util.semver\n\nimport kotlin.math.max\nimport kotlin.math.min\n\ninternal class RequirementParser {\n    sealed class Token {\n        open var line: Int = -1\n        open var pos: Int = -1\n        open var sourcePos: Int = -1\n        open lateinit var content: String\n\n        sealed class GroupBod : Token() {\n            class Left : GroupBod() {\n                override var content: String\n                    get() = \"{\"\n                    set(_) {}\n            }\n\n            class Right : GroupBod() {\n                override var content: String\n                    get() = \"}\"\n                    set(_) {}\n            }\n        }\n\n        sealed class Logic : Token() {\n            class And : Logic() {\n                override var content: String\n                    get() = \"&&\"\n                    set(_) {}\n            }\n\n            class Or : Logic() {\n                override var content: String\n                    get() = \"||\"\n                    set(_) {}\n            }\n        }\n\n        class Content : Token()\n        class Ending : Token() {\n            override var content: String\n                get() = \"\"\n                set(_) {}\n        }\n\n        object Begin : Token() {\n            override var content: String\n                get() = \"\"\n                set(_) {}\n            override var line: Int\n                get() = 0\n                set(_) {}\n            override var pos: Int\n                get() = 0\n                set(_) {}\n            override var sourcePos: Int\n                get() = 0\n                set(_) {}\n        }\n\n        override fun toString(): String {\n            return javaClass.canonicalName.substringAfterLast('.') + \" - $content [$line, $pos]\"\n        }\n    }\n\n    companion object {\n        const val END = '\\u0000'\n    }\n\n    class TokenReader(\n        @JvmField val content: String\n    ) {\n        @JvmField\n        var pos: Int = 0\n\n        @JvmField\n        var line: Int = 0\n\n        @JvmField\n        var posi: Int = 0\n\n        @JvmField\n        var latestToken: Token = Token.Begin\n\n        @JvmField\n        var insertToken: Token? = Token.Begin\n        fun peekChar(): Char {\n            if (pos < content.length)\n                return content[pos]\n            return END\n        }\n\n        fun peekNextChar(): Char {\n            if (pos + 1 < content.length)\n                return content[pos + 1]\n            return END\n        }\n\n        fun nextChar(): Char {\n            val char = peekChar()\n            pos++\n            if (char == '\\n') {\n                line++\n                posi = 0\n            } else {\n                posi++\n            }\n            return char\n        }\n\n        fun nextToken(): Token {\n            insertToken?.let { insertToken = null; return it }\n            return nextToken0().also { latestToken = it }\n        }\n\n        private fun nextToken0(): Token {\n            if (pos < content.length) {\n                while (peekChar().isWhitespace()) {\n                    nextChar()\n                }\n                val startIndex = pos\n                if (startIndex >= content.length) {\n                    return Token.Ending().also {\n                        it.line = line\n                        it.pos = posi\n                        it.sourcePos = content.length\n                    }\n                }\n                val pline = line\n                val ppos = posi\n                nextChar()\n                when (content[startIndex]) {\n                    '&' -> {\n                        if (peekChar() == '&') {\n                            return Token.Logic.And().also {\n                                it.pos = ppos\n                                it.line = pline\n                                it.sourcePos = startIndex\n                                nextChar()\n                            }\n                        }\n                    }\n                    '|' -> {\n                        if (peekChar() == '|') {\n                            return Token.Logic.Or().also {\n                                nextChar()\n                                it.pos = ppos\n                                it.line = pline\n                                it.sourcePos = startIndex\n                            }\n                        }\n                    }\n                    '{' -> {\n                        return Token.GroupBod.Left().also {\n                            it.pos = ppos\n                            it.line = pline\n                            it.sourcePos = startIndex\n                        }\n                    }\n                    '}' -> {\n                        return Token.GroupBod.Right().also {\n                            it.pos = ppos\n                            it.line = pline\n                            it.sourcePos = startIndex\n                        }\n                    }\n                }\n                while (true) {\n                    when (val c = peekChar()) {\n                        '&', '|' -> {\n                            if (c == peekNextChar()) {\n                                break\n                            }\n                            nextChar()\n                        }\n                        '{', '}' -> {\n                            break\n                        }\n                        END -> break\n                        else -> nextChar()\n                    }\n                }\n                val endIndex = pos\n                return Token.Content().also {\n                    it.content = content.substring(startIndex, endIndex)\n                    it.pos = ppos\n                    it.line = pline\n                    it.sourcePos = startIndex\n                }\n            }\n            return Token.Ending().also {\n                it.line = line\n                it.pos = posi\n                it.sourcePos = content.length\n            }\n        }\n    }\n\n    interface TokensProcessor<R> {\n        fun process(reader: TokenReader): R\n        fun processLine(reader: TokenReader): R\n        fun processLogic(isAnd: Boolean, chunks: Iterable<R>): R\n    }\n\n    abstract class ProcessorBase<R> : TokensProcessor<R> {\n        fun Token.ia(reader: TokenReader, msg: String, cause: Throwable? = null): Nothing {\n            throw IllegalArgumentException(\"$msg (at [$line, $pos], ${cutSource(reader, sourcePos)})\", cause)\n        }\n\n        fun cutSource(reader: TokenReader, index: Int): String {\n            val content = reader.content\n            val s = max(0, index - 10)\n            val e = min(content.length, index + 10)\n            return content.substring(s, e)\n        }\n\n        override fun process(reader: TokenReader): R {\n            return when (val nextToken = reader.nextToken()) {\n                is Token.Begin,\n                is Token.GroupBod.Left -> {\n                    val first = when (val next = reader.nextToken()) {\n                        is Token.Content -> {\n                            processString(reader, next)\n                        }\n                        is Token.GroupBod.Right -> {\n                            nextToken.ia(\n                                reader, if (nextToken is Token.Begin)\n                                    \"Invalid token `}`\"\n                                else \"The first token cannot be Group Ending\"\n                            )\n                        }\n                        is Token.Logic -> {\n                            nextToken.ia(reader, \"The first token cannot be Token.Logic\")\n                        }\n                        is Token.Ending -> {\n                            nextToken.ia(\n                                reader, if (nextToken is Token.Begin)\n                                    \"Requirement cannot be blank\"\n                                else \"Except more tokens\"\n                            )\n                        }\n                        is Token.GroupBod.Left -> {\n                            reader.insertToken = next\n                            process(reader)\n                        }\n                        else -> {\n                            next.ia(reader, \"Bad token $next\")\n                        }\n                    }\n                    // null -> not set\n                    // true -> AND mode\n                    // false-> OR mode\n                    var mode: Boolean? = null\n                    val chunks = arrayListOf(first)\n                    while (true) {\n                        when (val next = reader.nextToken()) {\n                            is Token.Ending,\n                            is Token.GroupBod.Right -> {\n                                val isEndingOfGroup = next is Token.GroupBod.Right\n                                val isStartingOfGroup = nextToken is Token.GroupBod.Left\n                                if (isStartingOfGroup != isEndingOfGroup) {\n                                    fun getType(type: Boolean) = if (type) \"`}`\" else \"<EOF>\"\n                                    next.ia(\n                                        reader,\n                                        \"Except ${getType(isStartingOfGroup)} but got ${getType(isEndingOfGroup)}\"\n                                    )\n                                } else {\n                                    // reader.insertToken = next\n                                    break\n                                }\n                            }\n                            is Token.Logic -> {\n                                val stx = next is Token.Logic.And\n                                if (mode == null) mode = stx\n                                else if (mode != stx) {\n                                    fun getMode(type: Boolean) = if (type) \"`&&`\" else \"`||`\"\n                                    next.ia(\n                                        reader, \"Cannot change logic mode after setting. \" +\n                                                \"Except ${getMode(mode)} but got ${getMode(stx)}\"\n                                    )\n                                }\n                                chunks.add(process(reader))\n                            }\n                            else -> {\n                                next.ia(\n                                    reader, \"Except ${\n                                        when (mode) {\n                                            null -> \"`&&` or `||`\"\n                                            true -> \"`&&`\"\n                                            false -> \"`||`\"\n                                        }\n                                    } but get `${next.content}`\"\n                                )\n                            }\n                        }\n                    }\n                    if (mode == null) {\n                        first\n                    } else {\n                        processLogic(mode, chunks)\n                    }\n                }\n                is Token.Content -> {\n                    processString(reader, nextToken)\n                }\n                is Token.Ending -> {\n                    nextToken.ia(reader, \"Except more values.\")\n                }\n                else -> {\n                    nextToken.ia(reader, \"Assert Error: $nextToken\")\n                }\n            }\n        }\n\n        abstract fun processString(reader: TokenReader, token: Token.Content): R\n\n\n        override fun processLine(reader: TokenReader): R {\n            return process(reader).also {\n                val tok = reader.nextToken()\n                if (reader.nextToken() !is Token.Ending) {\n                    tok.ia(reader, \"Token reader stream not done\")\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/internal/util/semver/SemVersionInternal.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.internal.util.semver\n\nimport net.mamoe.mirai.console.util.SemVersion\nimport kotlin.math.max\nimport kotlin.math.min\n\n@Suppress(\"RegExpRedundantEscape\")\ninternal object SemVersionInternal {\n    private val directVersion = \"\"\"^[0-9]+(\\.[0-9]+)+(|[\\-+].+)$\"\"\".toRegex()\n    private val versionSelect = \"\"\"^[0-9]+(\\.[0-9]+)*\\.x$\"\"\".toRegex()\n    private val versionMathRange =\n        \"\"\"([\\[\\(])([0-9]+(\\.[0-9]+)+(|[\\-+].+))\\s*\\,\\s*([0-9]+(\\.[0-9]+)+(|[\\-+].+))([\\]\\)])\"\"\".toRegex()\n    private val versionRule = \"\"\"^((\\>\\=)|(\\<\\=)|(\\=)|(\\!\\=)|(\\>)|(\\<))\\s*([0-9]+(\\.[0-9]+)+(|[\\-+].+))$\"\"\".toRegex()\n\n    private val SEM_VERSION_REGEX =\n        \"\"\"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:\\.(0|[1-9]\\d*))?(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$\"\"\".toRegex()\n\n    /** 解析核心版本号, eg: `1.0.0` -> IntArray[1, 0, 0] */\n    @JvmStatic\n    private fun String.parseMainVersion(): IntArray =\n        split('.').map { it.toInt() }.toIntArray()\n\n\n    fun parse(version: String): SemVersion {\n        if (!SEM_VERSION_REGEX.matches(version)) {\n            throw IllegalArgumentException(\"`$version` not a valid version\")\n        }\n        var mainVersionEnd = 0\n        kotlin.run {\n            val iterator = version.iterator()\n            while (iterator.hasNext()) {\n                val next = iterator.next()\n                if (next == '-' || next == '+') {\n                    break\n                }\n                mainVersionEnd++\n            }\n        }\n        var identifier: String? = null\n        var metadata: String? = null\n        if (mainVersionEnd != version.length) {\n            when (version[mainVersionEnd]) {\n                '-' -> {\n                    val metadataSplitter = version.indexOf('+', startIndex = mainVersionEnd)\n                    if (metadataSplitter == -1) {\n                        identifier = version.substring(mainVersionEnd + 1)\n                    } else {\n                        identifier = version.substring(mainVersionEnd + 1, metadataSplitter)\n                        metadata = version.substring(metadataSplitter + 1)\n                    }\n                }\n                '+' -> {\n                    metadata = version.substring(mainVersionEnd + 1)\n                }\n            }\n        }\n        val mainVersion = version.substring(0, mainVersionEnd).parseMainVersion()\n        return SemVersion(\n            major = mainVersion[0],\n            minor = mainVersion[1],\n            patch = mainVersion.getOrNull(2),\n            identifier = identifier,\n            metadata = metadata\n        )\n    }\n\n    @JvmStatic\n    internal fun parseRule(rule: String): RequirementInternal {\n        val trimmed = rule.trim()\n        if (directVersion.matches(trimmed)) {\n            val parsed = SemVersion.invoke(trimmed)\n            return object : RequirementInternal {\n                override fun test(version: SemVersion): Boolean = version.compareTo(parsed) == 0\n            }\n        }\n        if (versionSelect.matches(trimmed)) {\n            val regex = (\"^\" +\n                    trimmed.replace(\".\", \"\\\\.\")\n                        .replace(\"x\", \".+\") +\n                    \"$\"\n                    ).toRegex()\n            return object : RequirementInternal {\n                override fun test(version: SemVersion): Boolean = regex.matches(version.toString())\n            }\n        }\n        versionMathRange.matchEntire(trimmed)?.let { range ->\n            // 1 mode\n            // 2 first\n            // 5 sec\n            // 8 type\n            var typeStart = range.groupValues[1][0]\n            var typeEnd = range.groupValues[8][0]\n            var start = SemVersion.invoke(range.groupValues[2])\n            var end = SemVersion.invoke(range.groupValues[5])\n            if (start > end) {\n                val c = end\n                end = start\n                start = c\n                val x = typeEnd\n                typeEnd = typeStart\n                typeStart = x\n            }\n            val a: (SemVersion) -> Boolean = when (typeStart) {\n                '[', ']' -> ({ start <= it })\n                '(', ')' -> ({ start < it })\n                else -> throw AssertionError()\n            }\n            val b: (SemVersion) -> Boolean = when (typeEnd) {\n                '[', ']' -> ({ it <= end })\n                '(', ')' -> ({ it < end })\n                else -> throw AssertionError()\n            }\n            return object : RequirementInternal {\n                override fun test(version: SemVersion): Boolean = a(version) && b(version)\n            }\n        }\n        versionRule.matchEntire(trimmed)?.let { result ->\n            val operator = result.groupValues[1]\n            val version1 = SemVersion.invoke(result.groupValues[8])\n            return when (operator) {\n                \">=\" -> {\n                    object : RequirementInternal {\n                        override fun test(version: SemVersion): Boolean = version >= version1\n                    }\n                }\n                \">\" -> {\n                    object : RequirementInternal {\n                        override fun test(version: SemVersion): Boolean = version > version1\n                    }\n                }\n                \"<=\" -> {\n                    object : RequirementInternal {\n                        override fun test(version: SemVersion): Boolean = version <= version1\n                    }\n                }\n                \"<\" -> {\n                    object : RequirementInternal {\n                        override fun test(version: SemVersion): Boolean = version < version1\n                    }\n                }\n                \"=\" -> {\n                    object : RequirementInternal {\n                        override fun test(version: SemVersion): Boolean = version.compareTo(version1) == 0\n                    }\n                }\n                \"!=\" -> {\n                    object : RequirementInternal {\n                        override fun test(version: SemVersion): Boolean = version.compareTo(version1) != 0\n                    }\n                }\n                else -> error(\"operator=$operator, version=$version1\")\n            }\n        }\n        throw IllegalArgumentException(\"Cannot parse $rule\")\n    }\n\n\n    @JvmStatic\n    fun parseRangeRequirement(requirement: String): RequirementInternal =\n        object : RequirementParser.ProcessorBase<RequirementInternal>() {\n            override fun processLogic(isAnd: Boolean, chunks: Iterable<RequirementInternal>): RequirementInternal {\n                return if (isAnd) object : RequirementInternal {\n                    override fun test(version: SemVersion): Boolean {\n                        return chunks.all { it.test(version) }\n                    }\n                } else object : RequirementInternal {\n                    override fun test(version: SemVersion): Boolean {\n                        return chunks.any { it.test(version) }\n                    }\n                }\n            }\n\n            override fun processString(\n                reader: RequirementParser.TokenReader,\n                token: RequirementParser.Token.Content\n            ): RequirementInternal = kotlin.runCatching {\n                parseRule(token.content)\n            }.getOrElse { token.ia(reader, \"Error in parsing rule `${token.content}`\", it) }\n        }.processLine(RequirementParser.TokenReader(requirement))\n\n    @JvmStatic\n    fun compareInternal(source: SemVersion, other: SemVersion): Int {\n        // ignored metadata in comparing\n\n        // If $this equals $other (without metadata),\n        // return same.\n        // Compare main-version\n\n        source.major.compareTo(other.major).takeUnless { it == 0 }?.let { return it }\n        source.minor.compareTo(other.minor).takeUnless { it == 0 }?.let { return it }\n        (source.patch ?: 0).compareTo(other.patch ?: 0).takeUnless { it == 0 }?.let { return it }\n\n        // If main-versions are same.\n        var identifier0 = source.identifier\n        var identifier1 = other.identifier\n        // If anyone doesn't have the identifier...\n        if (identifier0 == null || identifier1 == null) {\n            return when (identifier0) {\n                identifier1 -> { // null == null\n                    // Nobody has identifier\n                    0\n                }\n                null -> {\n                    // $other has identifier, but $this don't have identifier\n                    // E.g:\n                    //   this    = 1.0.0\n                    //   other   = 1.0.0-dev\n                    1\n                }\n                // It is the opposite of the above.\n                else -> -1\n            }\n        }\n        fun String.getSafe(index: Int) = getOrElse(index) { ' ' }\n\n        // ignored same prefix\n        fun getSameSize(s1: String, s2: String): Int {\n            val size = min(s1.length, s2.length)\n            //   1.0-RC19  -> 19\n            //   1.0-RC107 -> 107\n            var realSameSize = 0\n            for (index in 0 until size) {\n                if (s1[index] != s2[index]) {\n                    return realSameSize\n                } else {\n                    if (!s1[index].isDigit()) {\n                        realSameSize = index + 1\n                    }\n                }\n            }\n            return realSameSize\n        }\n\n        // We ignore the same parts. Because we only care about the differences.\n        // E.g:\n        //  1.0-RC1 -> 1\n        //  1.0-RC2 -> 2\n        val ignoredSize = getSameSize(identifier0, identifier1)\n        identifier0 = identifier0.substring(ignoredSize)\n        identifier1 = identifier1.substring(ignoredSize)\n        // Multi-chunk comparing\n        val chunks0 = identifier0.split('-', '.')\n        val chunks1 = identifier1.split('-', '.')\n        chunkLoop@ for (index in 0 until (max(chunks0.size, chunks1.size))) {\n            val value0 = chunks0.getOrNull(index)\n            val value1 = chunks1.getOrNull(index)\n            // Any chunk is null\n            if (value0 == null || value1 == null) {\n                // value0 == null && value1 == null is impossible\n                return if (value0 == null) {\n                    // E.g:\n                    //  value0 = 1.0-RC-dev\n                    //  value1 = 1.0-RC-dev-1\n                    -1\n                } else {\n                    // E.g:\n                    //  value0 = 1.0-RC-dev-1\n                    //  value1 = 1.0-RC-dev\n                    1\n                }\n            }\n            try {\n                val result = value0.toInt().compareTo(value1.toInt())\n                if (result != 0) {\n                    return result\n                }\n                continue@chunkLoop\n            } catch (ignored: NumberFormatException) {\n            }\n            // compare chars\n            for (index0 in 0 until (max(value0.length, value1.length))) {\n                val result = value0.getSafe(index0).compareTo(value1.getSafe(index0))\n                if (result != 0)\n                    return result\n            }\n        }\n        return 0\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/logging/AbstractLoggerController.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.logging\n\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.utils.SimpleLogger\nimport java.util.*\n\n/**\n * 日志控制器的基本实现\n */\n@ConsoleExperimentalApi\npublic abstract class AbstractLoggerController : LoggerController {\n\n    /**\n     * @param priority 尝试判断的日志等级\n     * @param settings 配置中的日志等级 (see [getPriority])\n     */\n    protected open fun shouldLog(\n        priority: LogPriority,\n        settings: LogPriority,\n    ): Boolean = settings <= priority\n\n    /**\n     * 获取配置中与 [identity] 对应的 [LogPriority]\n     */\n    protected abstract fun getPriority(identity: String?): LogPriority\n\n    override fun shouldLog(identity: String?, priority: SimpleLogger.LogPriority): Boolean =\n        shouldLog(LogPriority.by(priority), getPriority(identity))\n\n    // region LoggerControlState support\n    protected open val isLoggerControlStateSupported: Boolean get() = false\n\n    @Volatile\n    @Transient\n    @JvmField\n    protected var loggerConfigUpdateTime: Long = 0L\n\n    override fun getLoggerControlState(identity: String?): LoggerController.LoggerControlState {\n        if (isLoggerControlStateSupported) {\n            return object : LoggerController.LoggerControlState {\n                private val status = BitSet(SimpleLogger.LogPriority.values().size)\n\n                @Volatile\n                @Transient\n                private var lastUpdateTime = -1L\n\n                override fun shouldLog(priority: SimpleLogger.LogPriority): Boolean {\n                    if (lastUpdateTime != loggerConfigUpdateTime) {\n                        updateProperties()\n                    }\n                    return status[priority.ordinal]\n                }\n\n                @Synchronized\n                private fun updateProperties() {\n                    lastUpdateTime = loggerConfigUpdateTime\n                    SimpleLogger.LogPriority.values().forEach { prio ->\n                        status.set(prio.ordinal, shouldLog(identity, prio))\n                    }\n                }\n\n            }\n        }\n        return super.getLoggerControlState(identity)\n    }\n    // endregion\n\n    /**\n     * 便于进行配置存储的 [LogPriority],\n     * 等级优先级与 [SimpleLogger.LogPriority] 对应\n     */\n    @Suppress(\"unused\")\n    @ConsoleExperimentalApi\n    public enum class LogPriority {\n        ALL(null),\n        VERBOSE,\n        DEBUG,\n        INFO,\n        WARNING,\n        ERROR,\n        NONE(null);\n\n        private var mapped: SimpleLogger.LogPriority? = null\n\n        public companion object {\n            private val mapping = EnumMap<SimpleLogger.LogPriority, LogPriority>(SimpleLogger.LogPriority::class.java)\n\n            public fun by(priority: SimpleLogger.LogPriority): LogPriority = mapping[priority]!!\n\n            init {\n                values().forEach { priority ->\n                    mapping[priority.mapped ?: return@forEach] = priority\n                }\n            }\n        }\n\n        @Suppress(\"UNUSED_PARAMETER\")\n        constructor(void: Nothing?)\n        constructor() {\n            mapped = SimpleLogger.LogPriority.valueOf(name)\n        }\n\n    }\n\n    /**\n     * 路径形式实现的基本日志控制器\n     *\n     * Example:\n     * 配置文件:\n     * ```\n     * defaultPriority: ALL\n     * loggers:\n     *  t: NONE\n     *  t.sub: VERBOSE\n     *  t.sub.1: NONE\n     * ```\n     *\n     * ```\n     * \"logger.1\"\n     *      -> \"logger.1\" << null\n     *      -> \"logger\" << null\n     *      -> defaultPriority << ALL\n     *\n     * \"t.sub.1\"\n     *      -> \"t.sub.1\" << NONE\n     *\n     * \"t.sub.2\"\n     *      -> \"t.sub.2\" << null\n     *      -> \"t.sub\" << VERBOSE\n     *\n     * ......\n     * ```\n     */\n    @ConsoleExperimentalApi\n    public abstract class PathBased\n    @JvmOverloads public constructor(\n        protected open val spliterator: Char = '.'\n    ) : AbstractLoggerController() {\n        protected abstract val defaultPriority: LogPriority\n        protected abstract fun findPriority(identity: String?): LogPriority?\n\n        /**\n         * 从 [path] 析出下一次应该进行搜索的二次 path (@see [getPriority])\n         *\n         * @return 如果返回了 `null`, 会令 [getPriority] 返回 `findPriority(null) ?: defaultPriority`)\n         */\n        protected open fun nextPath(path: String): String? {\n            val lastIndex = path.lastIndexOf(spliterator)\n            if (lastIndex == -1) return null\n            return path.substring(0, lastIndex)\n        }\n\n        override fun getPriority(identity: String?): LogPriority {\n            if (identity == null) {\n                return findPriority(null) ?: defaultPriority\n            } else {\n                var path: String = identity\n                while (true) {\n                    findPriority(path)?.let { return it }\n                    path = nextPath(path) ?: return (findPriority(null) ?: defaultPriority)\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/logging/LoggerController.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.logging\n\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport net.mamoe.mirai.console.internal.logging.MiraiConsoleLogger\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.SimpleLogger\n\n/**\n * 日志控制系统\n *\n * @see [AbstractLoggerController]\n * @see [MiraiConsoleImplementation.loggerController]\n * @see [MiraiConsoleLogger]\n */\n@ConsoleExperimentalApi\npublic interface LoggerController {\n    /** 是否应该记录该等级的日志 */\n    public fun shouldLog(identity: String?, priority: SimpleLogger.LogPriority): Boolean\n\n    public fun getLoggerControlState(identity: String?): LoggerControlState {\n        return object : LoggerControlState {\n            override fun shouldLog(priority: SimpleLogger.LogPriority): Boolean {\n                return shouldLog(identity, priority)\n            }\n        }\n    }\n\n    /**\n     * 一个 [MiraiLogger] 的日志开关状态\n     *\n     * 这个类可以缓存 [LoggerController.shouldLog] 的结果, 避免多次查询\n     *\n     * 在需要的时候会自动更新, 所以不需要手动更换 [LoggerControlState]\n     */\n    @ConsoleExperimentalApi\n    public interface LoggerControlState {\n        public fun shouldLog(priority: SimpleLogger.LogPriority): Boolean\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/permission/Permission.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.permission\n\nimport net.mamoe.mirai.console.command.BuiltInCommands\nimport net.mamoe.mirai.console.command.Command\n\n/**\n * 一个抽象的「权限」. 由 [PermissionService] 实现不同, [Permission] 可能会有多种实例. 但一个权限总是拥有确定的 [id].\n *\n * 在匹配权限时, 应使用唯一的 [id] 作为依据. 而不应该使用 [Permission] 实例. 同时, [Permission] 也不适合存储.\n *\n * **注意**: 请不要手动实现这个接口. 总是从 [PermissionService.register] 获得实例.\n *\n * ### 获取 [Permission]\n *\n * #### 根权限\n * [RootPermission] 是所有权限的父权限.\n *\n * #### 指令的权限\n * 每个指令都拥有一个 [Command.permission].\n *\n * [BuiltInCommands.parentPermission] 为所有内建指令的权限.\n *\n * #### 手动申请权限\n * [PermissionService.register]\n */\n@PermissionImplementation\npublic interface Permission {\n    /**\n     * 唯一识别 ID. 所有权限的 [id] 都互不相同.\n     *\n     * @see PermissionService.get 由 [id] 获取已注册的 [Permission]\n     * @see PermissionId\n     */\n    public val id: PermissionId\n\n    /**\n     * 描述信息. 描述信息在注册权限时强制提供.\n     */\n    public val description: String\n\n    /**\n     * 父权限.\n     *\n     * 在检查权限时, 若一个 [Permittee] 拥有父\n     *\n     * [RootPermission] 的 parent 为自身\n     */\n    public val parent: Permission\n\n    public companion object {\n        /**\n         * 根权限. 是所有权限的父权限.\n         *\n         * 供 Java 用户使用.\n         *\n         * @see RootPermission 推荐 Kotlin 用户使用.\n         */\n        @JvmStatic\n        public fun getRootPermission(): Permission = RootPermission\n\n        /**\n         * 递归获取 [Permission.parent], `permission.parent.parent`, permission.parent.parent.parent` ... 直到 [Permission.parent] 为它自己.\n         */\n        @get:JvmStatic\n        public val Permission.parentsWithSelf: Sequence<Permission>\n            get() = generateSequence(this) { p ->\n                p.parent.takeIf { parent -> parent != p }\n            }\n    }\n}\n\n/**\n * 根权限. 是所有权限的父权限. 权限 ID 为 \"*:*\"\n */\n@get:JvmSynthetic\npublic inline val RootPermission: Permission // It might be removed in the future, so make it inline to avoid ABI changes.\n    get() = PermissionService.INSTANCE.rootPermission"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/permission/PermissionId.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.permission\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.builtins.serializer\nimport net.mamoe.mirai.console.compiler.common.ResolveContext\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.*\nimport net.mamoe.mirai.console.internal.data.map\n\n\n/**\n * 表示一个 [权限][Permission] 的唯一 ID.\n *\n * [PermissionId] 与 [Permission] 唯一对应.\n *\n * ### 字符串表示\n * `\"$namespace:$name\"`. 如 \"console:command.stop\", \"*:*\"\n */\n@Serializable(with = PermissionId.PermissionIdAsStringSerializer::class)\npublic data class PermissionId(\n    @ResolveContext(PERMISSION_NAMESPACE) public val namespace: String,\n    @ResolveContext(PERMISSION_NAME) public val name: String,\n) {\n    init {\n        checkPermissionIdName(name)\n        checkPermissionIdName(namespace)\n    }\n\n    public object PermissionIdAsStringSerializer : KSerializer<PermissionId> by String.serializer().map(\n        serializer = { it.namespace + \":\" + it.name },\n        deserializer = ::parseFromString\n    )\n\n    /**\n     * 返回 `$namespace:$id`\n     */\n    public override fun toString(): String = \"$namespace:$name\"\n\n    public companion object {\n        /**\n         * 由 `$namespace:$id` 解析 [PermissionId].\n         *\n         * @throws IllegalArgumentException 在解析失败时抛出.\n         */\n        @JvmStatic\n        public fun parseFromString(@ResolveContext(PERMISSION_ID) string: String): PermissionId {\n            return kotlin.runCatching {\n                string.split(':').let { (namespace, id) -> PermissionId(namespace, id) }\n            }.getOrElse {\n                throw IllegalArgumentException(\"Could not parse PermissionId from '$string'\", it)\n            }\n        }\n\n        /**\n         * 检查 [PermissionId.name] 的合法性. 在非法时抛出 [IllegalArgumentException]\n         */\n        @JvmStatic\n        @Throws(IllegalArgumentException::class)\n        public fun checkPermissionIdName(@ResolveContext(PERMISSION_NAME) name: String) {\n            when {\n                name.isBlank() -> throw IllegalArgumentException(\"PermissionId.name should not be blank.\")\n                name.any(Char::isWhitespace) -> throw IllegalArgumentException(\"Spaces are not yet allowed in PermissionId.name.\")\n                name.contains(':') -> throw IllegalArgumentException(\"':' is forbidden in PermissionId.name.\")\n            }\n        }\n\n        /**\n         * 检查 [PermissionId.namespace] 的合法性. 在非法时抛出 [IllegalArgumentException]\n         */\n        @JvmStatic\n        @Throws(IllegalArgumentException::class)\n        public fun checkPermissionIdNamespace(@ResolveContext(PERMISSION_NAME) namespace: String) {\n            when {\n                namespace.isBlank() -> throw IllegalArgumentException(\"PermissionId.namespace should not be blank.\")\n                namespace.any(Char::isWhitespace) -> throw IllegalArgumentException(\"Spaces are not yet allowed in PermissionId.namespace.\")\n                namespace.contains(':') -> throw IllegalArgumentException(\"':' is forbidden in PermissionId.namespace.\")\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/permission/PermissionIdNamespace.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.permission\n\nimport net.mamoe.mirai.console.command.Command\nimport net.mamoe.mirai.console.compiler.common.ResolveContext\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.PERMISSION_NAME\n\n/**\n * [PermissionId] 的命名空间. 用于提供 [PermissionId.namespace].\n */\npublic interface PermissionIdNamespace {\n    /**\n     * 创建一个此命名空间下的 [PermitteeId].\n     *\n     * 在指令初始化时, 会申请对应权限. 此时 [name] 为 `command.$primaryName` 其中 [primaryName][Command.primaryName].\n     */\n    public fun permissionId(@ResolveContext(PERMISSION_NAME) name: String): PermissionId\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/permission/PermissionImplementation.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.permission\n\nimport kotlin.annotation.AnnotationTarget.*\n\n/**\n * 表示一个应该由专有的权限插件 (提供 [PermissionService] 的插件) 实现的类.\n *\n *\n * 这样的类不能被用户手动实现或者继承, 也不能使用属性委托或者类委托, 或者其他任意直接或间接实现他们的手段 (否则会导致 [PermissionService] 处理异常).\n *\n * 普通插件仅应该使用从 [PermissionService] 或其他途径获取这些对象.\n */\n@Retention(AnnotationRetention.BINARY)\n@Target(CLASS, TYPEALIAS, FUNCTION, PROPERTY, FIELD, CONSTRUCTOR)\n@MustBeDocumented\ninternal annotation class PermissionImplementation"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/permission/PermissionRegistryConflictException.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"MemberVisibilityCanBePrivate\", \"CanBeParameter\")\n\npackage net.mamoe.mirai.console.permission\n\n/**\n * @see PermissionService.register\n */\npublic class PermissionRegistryConflictException(\n    public val newInstance: Permission,\n    public val existingInstance: Permission,\n) : Exception(\"Conflicting Permission registry. new: $newInstance, existing: $existingInstance\")"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/permission/PermissionService.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"MemberVisibilityCanBePrivate\")\n\npackage net.mamoe.mirai.console.permission\n\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport net.mamoe.mirai.console.compiler.common.ResolveContext\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.COMMAND_NAME\nimport net.mamoe.mirai.console.extension.instance\nimport net.mamoe.mirai.console.extensions.PermissionServiceProvider\nimport net.mamoe.mirai.console.internal.extension.GlobalComponentStorage\nimport net.mamoe.mirai.console.internal.permission.checkType\nimport net.mamoe.mirai.console.permission.Permission.Companion.parentsWithSelf\nimport net.mamoe.mirai.console.plugin.Plugin\nimport net.mamoe.mirai.console.plugin.PluginManager.INSTANCE.description\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport kotlin.reflect.KClass\n\n/**\n * 权限服务. 用于承载 Console 的权限系统.\n *\n * ### 可扩展\n * 权限服务可由插件扩展并覆盖默认实现.\n *\n * @see PermissionServiceProvider 相应扩展\n */\n@PermissionImplementation\npublic interface PermissionService<P : Permission> {\n    /**\n     * [P] 的类型\n     */\n    public val permissionType: KClass<P>\n\n    /**\n     * [RootPermission] 的实现\n     */\n    public val rootPermission: P\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 获取一个已经 [注册][register] 了的 [P]\n     */\n    public operator fun get(id: PermissionId): P?\n\n    /**\n     * 获取所有已注册的指令列表. 应保证线程安全.\n     *\n     * 备注: Java 实现者使用 `CollectionsKt.asSequence(Collection)` 构造 [Sequence]\n     */\n    public fun getRegisteredPermissions(): Sequence<P>\n\n    /**\n     * 获取 [PermitteeId] 和其父标识的所有被授予的所有直接和间接的权限列表\n     *\n     * 备注: Java 实现者使用 `CollectionsKt.asSequence(Collection)` 构造 [Sequence]\n     */\n    public fun getPermittedPermissions(permitteeId: PermitteeId): Sequence<P>\n\n    /**\n     * 判断 [permission] 对 [permission] 的权限.\n     *\n     * 返回 `true` 的意义:\n     * - 通常意义: [permitteeId] 拥有 [permission] 的 '能力'\n     * - 实现意义: [permitteeId] 自身或任意父标识 [PermissionService] 被授予高于或等于 [permission] 的权限\n     *\n     * @see Companion.testPermission 接收 [Permittee] 参数的扩展\n     */\n    public fun testPermission(permitteeId: PermitteeId, permission: P): Boolean {\n        val permissionId = permission.id\n        val all = this[permissionId]?.parentsWithSelf ?: return false\n        return getPermittedPermissions(permitteeId).any { p ->\n            all.any { p.id == it.id }\n        }\n    }\n\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 申请并注册一个权限 [Permission].\n     *\n     * @throws PermissionRegistryConflictException 当已存在一个 [PermissionId] 时抛出.\n     *\n     * @param description 描述. 将会展示给用户.\n     *\n     * @return 申请到的 [Permission] 实例\n     *\n     * @see get 获取一个已注册的权限\n     * @see getOrFail 获取一个已注册的权限\n     */\n    @Throws(PermissionRegistryConflictException::class)\n    public fun register(\n        id: PermissionId,\n        description: String,\n        parent: Permission = RootPermission,\n    ): P\n\n    /** 为 [Plugin] 分配一个 [PermissionId] */\n    @ConsoleExperimentalApi\n    public fun allocatePermissionIdForPlugin(\n        plugin: Plugin,\n        @ResolveContext(COMMAND_NAME) permissionName: String,\n    ): PermissionId = PermissionId(\n        plugin.description.id.lowercase(),\n        permissionName.lowercase()\n    )\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 授予 [permitteeId] 以 [permission] 权限\n     *\n     * Console 内建的权限服务支持此操作. 但插件扩展的权限服务可能不支持.\n     *\n     * @throws UnsupportedOperationException 当插件扩展的 [PermissionService] 不支持这样的操作时抛出.\n     */\n    @Throws(UnsupportedOperationException::class)\n    public fun permit(permitteeId: PermitteeId, permission: P)\n\n    /**\n     * 撤销 [permitteeId] 的 [permission] 授权\n     *\n     * Console 内建的权限服务支持此操作. 但插件扩展的权限服务可能不支持.\n     *\n     * @param recursive `true` 时递归撤销所有子权限.\n     * 例如, 若 [permission] 为 \"*:*\",\n     * recursive 为 `true` 时撤销全部权限 (因为所有权限都是 \"*:*\" 的子权限);\n     * 而为 `false` 时仅撤销 \"*:*\" 本身, 而不会影响子权限.\n     *\n     * @throws UnsupportedOperationException 当插件扩展的 [PermissionService] 不支持这样的操作时抛出.\n     */\n    @Throws(UnsupportedOperationException::class)\n    public fun cancel(permitteeId: PermitteeId, permission: P, recursive: Boolean)\n\n    public companion object {\n        /**\n         * 选用的 [PermissionService] 实例.\n         */\n        @get:JvmName(\"getInstance\")\n        @JvmStatic\n        @OptIn(ConsoleFrontEndImplementation::class, MiraiExperimentalApi::class)\n        public val INSTANCE: PermissionService<out Permission>\n            get() {\n                if (!MiraiConsoleImplementation.getBridge().permissionSeviceLoaded) {\n                    error(\"PermissionService is not yet ready.\")\n                }\n                return GlobalComponentStorage.getPreferredExtension(PermissionServiceProvider).instance\n            }\n\n        /**\n         * 获取一个权限, 失败时抛出 [NoSuchElementException]\n         *\n         * @see register 申请并注册一个权限\n         */\n        @JvmStatic\n        @Throws(NoSuchElementException::class)\n        public fun <P : Permission> PermissionService<P>.getOrFail(id: PermissionId): P =\n            get(id) ?: throw NoSuchElementException(\"Permission not found: $id\")\n\n        /**\n         * @see findCorrespondingPermission\n         */\n        @JvmStatic\n        public val PermissionId.correspondingPermission: Permission?\n            get() = findCorrespondingPermission()\n\n        /**\n         * @see get\n         */\n        @JvmStatic\n        public fun PermissionId.findCorrespondingPermission(): Permission? = INSTANCE[this]\n\n        /**\n         * @see getOrFail\n         * @throws NoSuchElementException\n         */\n        @Throws(NoSuchElementException::class)\n        @JvmStatic\n        public fun PermissionId.findCorrespondingPermissionOrFail(): Permission = INSTANCE.getOrFail(this)\n\n        /**\n         * @see PermissionService.permit\n         */\n        @JvmStatic\n        @JvmName(\"permit0\") // clash, not JvmSynthetic to allow possible calls from Java.\n        public fun PermitteeId.permit(permission: Permission) {\n            INSTANCE.checkType(permission::class).permit(this, permission)\n        }\n\n        /**\n         * @see PermissionService.permit\n         * @throws NoSuchElementException\n         */\n        @JvmStatic\n        @Throws(NoSuchElementException::class)\n        public fun PermitteeId.permit(permissionId: PermissionId) {\n            permit(permissionId.findCorrespondingPermissionOrFail())\n        }\n\n        /**\n         * @see PermissionService.cancel\n         */\n        @JvmSynthetic\n        @JvmStatic\n        @JvmName(\"cancel0\") // clash, not JvmSynthetic to allow possible calls from Java.\n        public fun PermitteeId.cancel(permission: Permission, recursive: Boolean) {\n            INSTANCE.checkType(permission::class).cancel(this, permission, recursive)\n        }\n\n        /**\n         * @see PermissionService.cancel\n         * @throws NoSuchElementException\n         */\n        @JvmStatic\n        @Throws(NoSuchElementException::class)\n        public fun PermitteeId.cancel(permissionId: PermissionId, recursive: Boolean) {\n            cancel(permissionId.findCorrespondingPermissionOrFail(), recursive)\n        }\n\n        /**\n         * @see PermissionService.testPermission\n         */\n        @JvmStatic\n        public fun Permittee.hasPermission(permission: Permission): Boolean =\n            permission.testPermission(this@hasPermission)\n\n        /**\n         * @see PermissionService.testPermission\n         */\n        @JvmStatic\n        public fun PermitteeId.hasPermission(permission: Permission): Boolean =\n            permission.testPermission(this@hasPermission)\n\n        /**\n         * @see PermissionService.testPermission\n         * @throws NoSuchElementException\n         */\n        @JvmStatic\n        @Throws(NoSuchElementException::class)\n        public fun PermitteeId.hasPermission(permissionId: PermissionId): Boolean {\n            val instance = permissionId.findCorrespondingPermissionOrFail()\n            return INSTANCE.checkType(instance::class).testPermission(this@hasPermission, instance)\n        }\n\n        /**\n         * @see PermissionService.testPermission\n         */\n        @JvmStatic\n        public fun Permittee.hasPermission(permissionId: PermissionId): Boolean =\n            permissionId.testPermission(this@hasPermission)\n\n\n        /**\n         * @see PermissionService.getPermittedPermissions\n         */\n        @JvmStatic\n        public fun Permittee.getPermittedPermissions(): Sequence<Permission> =\n            INSTANCE.getPermittedPermissions(this@getPermittedPermissions.permitteeId)\n\n\n        /**\n         * @see PermissionService.permit\n         */\n        @JvmStatic\n        public fun Permittee.permit(vararg permissions: Permission) {\n            for (permission in permissions) {\n                INSTANCE.checkType(permission::class).permit(this.permitteeId, permission)\n            }\n        }\n\n        /**\n         * @see PermissionService.cancel\n         */\n        @JvmStatic\n        public fun Permittee.cancel(vararg permissions: Permission, recursive: Boolean) {\n            for (permission in permissions) {\n                INSTANCE.checkType(permission::class).cancel(this.permitteeId, permission, recursive)\n            }\n        }\n\n        /**\n         * @see PermissionService.getPermittedPermissions\n         */\n        @JvmSynthetic\n        @JvmStatic\n        @JvmName(\"getPermittedPermissions0\") // clash, not JvmSynthetic to allow possible calls from Java.\n        public fun PermitteeId.getPermittedPermissions(): Sequence<Permission> =\n            INSTANCE.getPermittedPermissions(this@getPermittedPermissions)\n\n        /**\n         * @see PermissionService.testPermission\n         */\n        @JvmStatic\n        public fun Permission.testPermission(permittee: Permittee): Boolean =\n            INSTANCE.checkType(this::class).testPermission(permittee.permitteeId, this@testPermission)\n\n        /**\n         * @see PermissionService.testPermission\n         */\n        @JvmStatic\n        public fun Permission.testPermission(permitteeId: PermitteeId): Boolean =\n            INSTANCE.checkType(this::class).testPermission(permitteeId, this@testPermission)\n\n        /**\n         * @see PermissionService.testPermission\n         */\n        @JvmStatic\n        public fun PermissionId.testPermission(permittee: Permittee): Boolean {\n            val p = INSTANCE[this] ?: return false\n            return p.testPermission(permittee)\n        }\n\n        /**\n         * @see PermissionService.testPermission\n         */\n        @JvmStatic\n        public fun PermissionId.testPermission(permissible: PermitteeId): Boolean {\n            val p = INSTANCE[this] ?: return false\n            return p.testPermission(permissible)\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/permission/Permittee.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\", \"unused\", \"MemberVisibilityCanBePrivate\")\n\npackage net.mamoe.mirai.console.permission\n\nimport net.mamoe.mirai.console.command.CommandSender\n\n/**\n * 可被赋予权限的对象, 即 '被许可人'.\n *\n * 被许可人自身不持有拥有的权限列表, 而是拥有 [PermitteeId], 标识自己的身份, 供 [权限服务][PermissionService] 处理.\n *\n * **注意**: 请不要自主实现 [Permittee]\n *\n * @see CommandSender\n */\n@PermissionImplementation\npublic interface Permittee {\n    public val permitteeId: PermitteeId\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/permission/PermitteeId.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.permission\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.builtins.serializer\nimport net.mamoe.mirai.console.command.BuiltInCommands\nimport net.mamoe.mirai.console.internal.data.map\nimport net.mamoe.mirai.console.internal.permission.parseFromStringImpl\nimport net.mamoe.mirai.console.permission.AbstractPermitteeId.*\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\n\n/**\n * [被许可人][Permittee] 的标识符\n *\n * 一个这样的标识符即可代表特定的单个 [Permittee], 也可以表示多个同类 [Permittee].\n *\n * ### 获取 [PermitteeId]\n * 总是通过 [Permittee.permitteeId].\n */\n@PermissionImplementation\npublic interface PermitteeId {\n    /**\n     * 直接父 [PermitteeId]. 在检查权限时会首先检查自己, 再递归检查父类.\n     *\n     * @see allParentsWithSelf\n     * @see allParents\n     */\n    public val directParents: Array<out PermitteeId>\n\n    /**\n     * 转换为字符串表示. 用于权限服务识别和指令的解析.\n     */\n    public fun asString(): String\n\n    public companion object {\n        /**\n         * 当 [this] 或 [this] 的任意一个直接或间接父 [PermitteeId.asString] 与 `parent.asString` 相同时返回 `true`\n         *\n         * @since 2.16\n         */\n        @JvmStatic\n        public fun PermitteeId.isChildOf(parent: PermitteeId): Boolean {\n            return allParentsWithSelf.any { it.asString() == parent.asString() } // asString is for compatibility issue with external implementations\n        }\n\n        @JvmStatic\n        @DeprecatedSinceMirai(warningSince = \"2.16\")\n        public fun PermitteeId.hasChild(child: PermitteeId): Boolean = isChildOf(child)\n\n        /**\n         * 获取所有直接或间接父类的 [PermitteeId].\n         */\n        @get:JvmStatic\n        public val PermitteeId.allParentsWithSelf: Sequence<PermitteeId>\n            get() = sequence {\n                yield(this@allParentsWithSelf)\n                yieldAll(allParents)\n            }\n\n        /**\n         * 获取所有直接或间接父类的 [PermitteeId], 返回包含 `this` + 这些父类 的 [Sequence]\n         */\n        @get:JvmStatic\n        public val PermitteeId.allParents: Sequence<PermitteeId>\n            get() = directParents.asSequence().flatMap { it.allParentsWithSelf }\n\n        /**\n         * 创建 [AbstractPermitteeId.ExactUser]\n         */\n        @get:JvmSynthetic\n        public val User.permitteeId: ExactUser\n            get() = ExactUser(id)\n\n        /**\n         * 创建 [AbstractPermitteeId.ExactMember]\n         */\n        @get:JvmSynthetic\n        public val Member.permitteeId: ExactMember\n            get() = ExactMember(group.id, id)\n\n        /**\n         * 创建 [AbstractPermitteeId.ExactGroup]\n         */\n        @get:JvmSynthetic\n        public val Group.permitteeId: ExactGroup\n            get() = ExactGroup(id)\n\n        /**\n         * 创建 [AbstractPermitteeId.ExactGroupTemp]\n         */\n        @get:JvmSynthetic\n        public val Member.permitteeIdOnTemp: ExactGroupTemp\n            get() = ExactGroupTemp(group.id, id)\n\n        /**\n         * 创建 [AbstractPermitteeId.ExactStranger]\n         */\n        @get:JvmSynthetic\n        public val Stranger.permitteeId: ExactStranger\n            get() = ExactStranger(id)\n\n        /**\n         * 创建 [AbstractPermitteeId.ExactStranger]\n         */\n        @MiraiExperimentalApi\n        @get:JvmSynthetic\n        public inline val OtherClient.permitteeId: AnyOtherClient\n            get() = AnyOtherClient\n    }\n}\n\n/**\n * 内建的 [PermitteeId].\n *\n * - 若指令 A 的权限被授予给 [AnyMember], 那么一个 [ExactMember] 可以执行这个指令.\n *\n * #### 字符串表示\n *\n * 当使用 [PermitteeId.asString] 时, 不同的类型的返回值如下表所示. 这些格式也适用于 [BuiltInCommands.PermissionCommand].\n *\n * (不区分大小写. 不区分 Bot).\n *\n * [查看字符串表示列表](https://github.com/mamoe/mirai-console/docs/Permissions.md#字符串表示)\n *\n * #### 关系图\n *\n * ```\n *          Console                               AnyContact\n *                                                     ↑\n *                                                     |\n *                         +---------------------------+------------------------+---------------------+\n *                         |                                                    |                     |\n *                      AnyUser                                             AnyGroup            AnyOtherClient\n *                         ↑                                                    ↑                     ↑\n *                         |                                                    |                     |\n *          +--------------+---------------------+                              |                     |\n *          |              |                     |                              |                     |\n *     AnyFriend           |            AnyMemberFromAnyGroup                   |                     |\n *          ↑              |                     ↑                              |                     |\n *          |              |                     |                              |                     |\n *          |              |            +--------+--------------+               |                     |\n *          |              |            |                       |               |                     |\n *          |              |            |              AnyTempFromAnyGroup      |                     |\n *          |              |            |                       ↑               |                     |\n *          |              |        AnyMember                   |               |                     |\n *          |              |            ↑                       |               |                     |\n *          |          ExactUser        |                       |           ExactGroup         ExactOtherClient\n *          |            ↑   ↑          |                       |\n *          |            |   |          |                       |\n *          +------------+   +----------+                       |\n *          |                           |                       |\n *     ExactFriend                 ExactMember                  |\n *                                      ↑                       |\n *                                      |                       |\n *                                      +-----------------------+\n *                                                              |\n *                                                              |\n *                                                          ExactTemp\n * ```\n */\n@OptIn(ConsoleExperimentalApi::class)\n@Serializable(with = AsStringSerializer::class)\npublic sealed class AbstractPermitteeId(\n    public final override vararg val directParents: PermitteeId,\n) : PermitteeId {\n    public final override fun toString(): String = asString()\n\n    public companion object {\n        /**\n         * 由 [AbstractPermitteeId.asString] 解析 [AbstractPermitteeId]\n         */\n        @JvmStatic\n        public fun parseFromString(string: String): AbstractPermitteeId = parseFromStringImpl(string)\n    }\n\n    /**\n     * 使用 [asString] 序列化 [AbstractPermitteeId]\n     */\n    @ConsoleExperimentalApi\n    public object AsStringSerializer : KSerializer<AbstractPermitteeId> by String.serializer().map(\n        serializer = AbstractPermitteeId::asString,\n        deserializer = ::parseFromString\n    )\n\n    /**\n     * 表示任何群对象. (不是指群成员, 而是指这个 '群')\n     *\n     * - **直接父标识符**: [AnyContact]\n     * - **间接父标识符**: 无\n     * - 字符串表示: \"g*\"\n     *\n     * @see AnyMember\n     */\n    public object AnyGroup : AbstractPermitteeId(AnyContact) {\n        override fun asString(): String = \"g*\"\n    }\n\n    /**\n     * 表示一个群\n     *\n     * - **直接父标识符**: [AnyGroup]\n     * - **间接父标识符**: [AnyContact]\n     * - 字符串表示: \"g$groupId\"\n     */\n    public data class ExactGroup(public val groupId: Long) : AbstractPermitteeId(AnyGroup) {\n        override fun asString(): String = \"g$groupId\"\n    }\n\n    /**\n     * 表示来自一个群的任意一个成员\n     *\n     * - **直接父标识符**: [AnyMemberFromAnyGroup]\n     * - **间接父标识符**: [AnyUser], [AnyContact]\n     * - 字符串表示: \"m$groupId.*\"\n     */\n    public data class AnyMember(public val groupId: Long) : AbstractPermitteeId(AnyMemberFromAnyGroup) {\n        override fun asString(): String = \"m$groupId.*\"\n    }\n\n    /**\n     * 表示来自任意群的任意一个成员\n     *\n     * - **直接父标识符**: [AnyUser]\n     * - **间接父标识符**: [AnyContact]\n     * - 字符串表示: \"m*\"\n     */\n    public object AnyMemberFromAnyGroup : AbstractPermitteeId(AnyUser) {\n        override fun asString(): String = \"m*\"\n    }\n\n    /**\n     * 表示唯一的一个群成员\n     *\n     * - **直接父标识符**: [AnyMember], [ExactUser]\n     * - **间接父标识符**: [AnyMemberFromAnyGroup], [AnyUser], [AnyContact]\n     * - 字符串表示: \"m$groupId.$memberId\"\n     */\n    public data class ExactMember(\n        public val groupId: Long,\n        public val memberId: Long,\n    ) : AbstractPermitteeId(AnyMember(groupId), ExactUser(memberId)) {\n        override fun asString(): String = \"m$groupId.$memberId\"\n    }\n\n    /**\n     * 表示任何好友\n     *\n     * - **直接父标识符**: [AnyUser]\n     * - **间接父标识符**: [AnyContact]\n     * - 字符串表示: \"f*\"\n     */\n    public object AnyFriend : AbstractPermitteeId(AnyUser) {\n        override fun asString(): String = \"f*\"\n    }\n\n    /**\n     * 表示唯一的一个好友\n     *\n     * - **直接父标识符**: [ExactUser], [AnyFriend]\n     * - **间接父标识符**: [AnyUser], [AnyContact]\n     * - 字符串表示: \"f$id\"\n     */\n    public data class ExactFriend(\n        public val id: Long,\n    ) : AbstractPermitteeId(ExactUser(id), AnyFriend) {\n        override fun asString(): String = \"f$id\"\n    }\n\n    @Deprecated(\n        \"use AnyGroupTemp\",\n        ReplaceWith(\"AnyGroupTemp\", \"net.mamoe.mirai.console.permission.AbstractPermitteeId.AnyGroupTemp\"),\n        DeprecationLevel.HIDDEN\n    )\n    @DeprecatedSinceMirai(errorSince = \"2.0\", hiddenSince = \"2.10\")\n    public abstract class AnyTemp(\n        groupId: Long,\n    ) : AbstractPermitteeId(AnyMember(groupId), AnyTempFromAnyGroup)\n\n    /**\n     * 表示任何一个通过一个群 *在临时会话发送消息的* [群成员][Member]\n     *\n     * - **直接父标识符**: [AnyMember], [AnyTempFromAnyGroup]\n     * - **间接父标识符**: [AnyMemberFromAnyGroup], [AnyUser], [AnyContact]\n     * - 字符串表示: \"t$groupId.*\"\n     */\n    public data class AnyGroupTemp(\n        public val groupId: Long,\n    ) : @Suppress(\"DEPRECATION_ERROR\") AnyTemp(groupId) {\n        override fun asString(): String = \"t$groupId.*\"\n    }\n\n    /**\n     * 表示任何一个 *在临时会话发送消息的* [群成员][Member]\n     *\n     * - **直接父标识符**: [AnyUser]\n     * - **间接父标识符**: [AnyContact]\n     * - 字符串表示: \"t*\"\n     */\n    public object AnyTempFromAnyGroup : AbstractPermitteeId(AnyUser) {\n        override fun asString(): String = \"t*\"\n    }\n\n    @Deprecated(\n        \"use ExactGroupTemp\",\n        ReplaceWith(\"ExactGroupTemp\", \"net.mamoe.mirai.console.permission.AbstractPermitteeId.ExactGroupTemp\"),\n        DeprecationLevel.HIDDEN\n    )\n    @DeprecatedSinceMirai(errorSince = \"2.0\", hiddenSince = \"2.10\")\n    public abstract class ExactTemp internal constructor(\n        groupId: Long,\n        memberId: Long,\n    ) : AbstractPermitteeId(ExactMember(groupId, memberId))\n\n    /**\n     * 表示唯一的一个 *在临时会话发送消息的* [群成员][Member]\n     *\n     * - **直接父标识符**: [ExactMember]\n     * - **间接父标识符**: [AnyUser], [AnyMember], [ExactUser], [AnyContact], [AnyMemberFromAnyGroup]\n     * - 字符串表示: \"t$groupId.$memberId\"\n     */\n    public data class ExactGroupTemp(\n        public val groupId: Long,\n        public val memberId: Long,\n    ) : @Suppress(\"DEPRECATION_ERROR\") ExactTemp(groupId, memberId) {\n        override fun asString(): String = \"t$groupId.$memberId\"\n    }\n\n    /**\n     * 表示唯一的一个 [陌生人][Stranger]\n     *\n     * - **直接父标识符**: [ExactUser], [AnyStranger]\n     * - **间接父标识符**: [AnyUser], [AnyContact]\n     * - 字符串表示: \"s$id\"\n     */\n    public data class ExactStranger(\n        public val id: Long,\n    ) : AbstractPermitteeId(ExactUser(id), AnyStranger) {\n        override fun asString(): String = \"s$id\"\n    }\n\n\n    /**\n     * 表示任何 [用户][User]\n     *\n     * - **直接父标识符**: [AnyContact]\n     * - **间接父标识符**: 无\n     * - 字符串表示: \"u*\"\n     */\n    public object AnyUser : AbstractPermitteeId(AnyContact) {\n        override fun asString(): String = \"u*\"\n    }\n\n    /**\n     * 表示任何 [陌生人][Stranger]\n     *\n     * - **直接父标识符**: [AnyUser]\n     * - **间接父标识符**: [AnyContact]\n     * - 字符串表示: \"s*\"\n     */\n    public object AnyStranger : AbstractPermitteeId(AnyUser) {\n        override fun asString(): String = \"s*\"\n    }\n\n    /**\n     * 表示精确 [用户][User]\n     *\n     * - **直接父标识符**: [AnyUser]\n     * - **间接父标识符**: [AnyContact]\n     * - 字符串表示: \"u$id\"\n     */\n    public data class ExactUser(\n        public val id: Long,\n    ) : AbstractPermitteeId(AnyUser) {\n        override fun asString(): String = \"u$id\"\n    }\n\n    /**\n     * 表示任何 [联系对象][Contact]\n     *\n     * - **直接父标识符**: 无\n     * - **间接父标识符**: 无\n     * - 字符串表示: \"*\"\n     */\n    public object AnyContact : AbstractPermitteeId() {\n        override fun asString(): String = \"*\"\n    }\n\n    /**\n     * 表示控制台\n     *\n     * - **直接父标识符**: 无\n     * - **间接父标识符**: 无\n     * - 字符串表示: \"console\"\n     */\n    public object Console : AbstractPermitteeId() {\n        override fun asString(): String = \"console\"\n    }\n\n    /**\n     * 表示任何其他客户端\n     *\n     * - **直接父标识符**: [AnyContact]\n     * - **间接父标识符**: 无\n     * - 字符串表示: \"client*\"\n     */\n    public object AnyOtherClient : AbstractPermitteeId(AnyContact) {\n        override fun asString(): String = \"client*\"\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/plugin/NotYetLoadedPlugin.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.plugin\n\nimport net.mamoe.mirai.console.plugin.loader.PluginLoader\n\n/**\n * 代表一个 未完成加载/延迟加载 的插件\n *\n * 此实例仅用于插件加载系统, 当 [PluginManager] 加载插件时会自动调用 [resolve] 解析真正的插件实例\n *\n * @see PluginLoader.listPlugins\n * @see PluginManager\n *\n * @since 2.16.0\n */\npublic interface NotYetLoadedPlugin<T : Plugin> : Plugin {\n    public fun resolve(): T\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/plugin/Plugin.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.plugin\n\nimport net.mamoe.mirai.console.command.CommandOwner\nimport net.mamoe.mirai.console.plugin.PluginManager.INSTANCE.getPluginDescription\nimport net.mamoe.mirai.console.plugin.description.PluginDependency\nimport net.mamoe.mirai.console.plugin.description.PluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.JvmPlugin\nimport net.mamoe.mirai.console.plugin.loader.PluginLoader\nimport net.mamoe.mirai.console.util.SemVersion\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport kotlin.DeprecationLevel.ERROR\nimport kotlin.DeprecationLevel.HIDDEN\n\n/**\n * 表示一个 mirai-console 插件.\n *\n * @see PluginManager.enablePlugin 启用一个插件\n * @see PluginManager.disablePlugin 禁用一个插件\n * @see PluginManager.description 获取一个插件的 [描述][PluginDescription]\n *\n * @see PluginDescription 插件描述， 需由 [PluginLoader] 帮助提供（[PluginLoader.getPluginDescription]）\n * @see JvmPlugin Java, Kotlin 或其他 JVM 平台插件\n * @see PluginFileExtensions 支持文件系统存储的扩展\n *\n * @see PluginLoader 插件加载器\n */\npublic interface Plugin : CommandOwner {\n    /**\n     * 当插件已启用时返回 `true`, 否则表示插件未启用.\n     *\n     * @see PluginManager.enablePlugin 启用一个插件\n     * @see PluginManager.disablePlugin 禁用一个插件\n     */\n    public val isEnabled: Boolean\n\n    /**\n     * 所属插件加载器实例, 此加载器必须能加载这个 [Plugin].\n     */\n    public val loader: PluginLoader<*, *>\n}\n\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n@kotlin.internal.LowPriorityInOverloadResolution\n@Deprecated(\n    \"Moved to companion for a better Java API. \",\n    ReplaceWith(\"this.description\", \"net.mamoe.mirai.console.plugin.PluginManager.INSTANCE.description\"),\n    level = HIDDEN\n)\n@DeprecatedSinceMirai(errorSince = \"2.0\", hiddenSince = \"2.10\")\npublic inline val Plugin.description: PluginDescription\n    get() = getPluginDescription(this) // resolved to net.mamoe.mirai.console.plugin.PluginManager.INSTANCE.getDescription\n\n/**\n * 获取 [PluginDescription.name]\n */\npublic inline val Plugin.name: String get() = getPluginDescription(this).name\n\n/**\n * 获取 [PluginDescription.id]\n */\npublic inline val Plugin.id: String get() = getPluginDescription(this).id\n\n/**\n * 获取 [PluginDescription.version]\n */\npublic inline val Plugin.version: SemVersion get() = getPluginDescription(this).version\n\n/**\n * 获取 [PluginDescription.info]\n */\npublic inline val Plugin.info: String get() = getPluginDescription(this).info\n\n/**\n * 获取 [PluginDescription.author]\n */\npublic inline val Plugin.author: String get() = getPluginDescription(this).author\n\n/**\n * 获取 [PluginDescription.dependencies]\n */\npublic inline val Plugin.dependencies: Set<PluginDependency> get() = getPluginDescription(this).dependencies\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/plugin/PluginFileExtensions.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.plugin\n\nimport net.mamoe.mirai.console.data.PluginConfig\nimport net.mamoe.mirai.console.data.PluginData\nimport net.mamoe.mirai.console.plugin.jvm.JvmPlugin\nimport java.io.File\nimport java.nio.file.Path\n\n\n/**\n * 支持文件系统存储的扩展.\n *\n * @suppress 此接口只应由 [JvmPlugin] 继承\n *\n * @see JvmPlugin\n */\npublic interface PluginFileExtensions {\n    /**\n     * 数据目录路径\n     * @see PluginData\n     */\n    public val dataFolderPath: Path\n\n    /**\n     * 数据目录. `dataFolderPath.toFile()`\n     * @see PluginData\n     */\n    public val dataFolder: File\n\n\n    /**\n     * 从数据目录获取一个文件.\n     * @see dataFolderPath\n     */\n    public fun resolveDataFile(relativePath: String): File = dataFolderPath.resolve(relativePath).toFile()\n\n    /**\n     * 从数据目录获取一个文件.\n     * @see dataFolderPath\n     */\n    public fun resolveDataPath(relativePath: String): Path = dataFolderPath.resolve(relativePath)\n\n    /**\n     * 从数据目录获取一个文件.\n     * @see dataFolderPath\n     */\n    public fun resolveDataFile(relativePath: Path): File = dataFolderPath.resolve(relativePath).toFile()\n\n    /**\n     * 从数据目录获取一个文件路径.\n     * @see dataFolderPath\n     */\n    public fun resolveDataPath(relativePath: Path): Path = dataFolderPath.resolve(relativePath)\n\n\n    /**\n     * 插件配置保存路径\n     * @see PluginConfig\n     */\n    public val configFolderPath: Path\n\n    /**\n     * 插件配置保存路径\n     * @see PluginConfig\n     */\n    public val configFolder: File\n\n\n    /**\n     * 从配置目录获取一个文件.\n     * @see configFolderPath\n     */\n    public fun resolveConfigFile(relativePath: String): File = configFolderPath.resolve(relativePath).toFile()\n\n    /**\n     * 从配置目录获取一个文件.\n     * @see configFolderPath\n     */\n    public fun resolveConfigPath(relativePath: String): Path = configFolderPath.resolve(relativePath)\n\n    /**\n     * 从配置目录获取一个文件.\n     * @see configFolderPath\n     */\n    public fun resolveConfigFile(relativePath: Path): File = configFolderPath.resolve(relativePath).toFile()\n\n    /**\n     * 从配置目录获取一个文件路径.\n     * @see configFolderPath\n     */\n    public fun resolveConfigPath(relativePath: Path): Path = configFolderPath.resolve(relativePath)\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/plugin/PluginManager.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\", \"unused\")\n\npackage net.mamoe.mirai.console.plugin\n\nimport me.him188.kotlin.dynamic.delegation.dynamicDelegation\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.plugin.description.PluginDescription\nimport net.mamoe.mirai.console.plugin.loader.PluginLoader\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport java.io.File\nimport java.nio.file.Path\n\n/**\n * 插件管理器.\n *\n * [PluginManager] 管理所有 [插件加载器][PluginLoader], 储存对所有插件的引用 ([plugins]), 通过 [PluginLoader] 间接与 [插件实例][Plugin] 交互.\n *\n * [插件加载][PluginLoader.load] 和 [插件启用][PluginLoader.enable] 等操作都由 [PluginLoader] 完成.\n * [PluginManager] 仅作为一个联系所有 [插件加载器][PluginLoader], 使它们互相合作的桥梁.\n *\n * 若要主动加载一个插件, 请获取能加载该插件的 [PluginLoader], 然后使用 [PluginLoader.enable]\n *\n * ## 获取插件管理器实例\n *\n * 可通过 [MiraiConsole.pluginManager] 或 [PluginManager.INSTANCE] 获取 [PluginManager] 实例.\n *\n * @see Plugin 插件\n * @see PluginLoader 插件加载器\n */\n@NotStableForInheritance\npublic interface PluginManager {\n    // region paths\n\n    /**\n     * 插件自身存放路径 [Path]. 由前端决定具体路径.\n     *\n     * **实现细节**: 在 terminal 前端实现为 `$rootPath/plugins`\n     */\n    public val pluginsPath: Path\n\n    /**\n     * 插件自身存放路径 [File]. 由前端决定具体路径.\n     *\n     * **实现细节**: 在 terminal 前端实现为 `$rootPath/plugins`\n     */\n    public val pluginsFolder: File\n\n    /**\n     * 插件内部数据存放路径 [Path]\n     *\n     * **实现细节**: 在 terminal 前端实现为 `$rootPath/data`\n     */\n    public val pluginsDataPath: Path\n\n    /**\n     * 插件内部数据存放路径 [File]\n     *\n     * **实现细节**: 在 terminal 前端实现为 `$rootPath/data`\n     */\n    public val pluginsDataFolder: File\n\n    /**\n     * 插件配置存放路径 [Path]\n     *\n     * **实现细节**: 在 terminal 前端实现为 `$rootPath/config`\n     */\n    public val pluginsConfigPath: Path\n\n    /**\n     * 插件配置存放路径 [File]\n     *\n     * **实现细节**: 在 terminal 前端实现为 `$rootPath/config`\n     */\n    public val pluginsConfigFolder: File\n\n    /**\n     * 插件运行时依赖存放路径 [Path], 插件自动下载的依赖都会存放于此目录\n     *\n     * **实现细节**: 在 terminal 前端实现为 `$rootPath/plugin-libraries`,\n     * 依赖 jar 文件由插件共享, 但是运行时插件加载的类是互相隔离的\n     *\n     * @since 2.11\n     */\n    public val pluginLibrariesPath: Path\n\n    /**\n     * 插件运行时依赖存放路径 [File], 插件自动下载的依赖都会存放于此目录\n     *\n     * **实现细节**: 在 terminal 前端实现为 `$rootPath/plugin-libraries`,\n     * 依赖 jar 文件由插件共享, 但是运行时插件加载的类是互相隔离的\n     *\n     * @since 2.11\n     */\n    public val pluginLibrariesFolder: File\n\n    /**\n     * 插件运行时依赖存放路径 [Path], 该路径下的依赖由全部插件共享\n     *\n     * **实现细节**: 在 terminal 前端实现为 `$rootPath/plugin-shared-libraries`\n     *\n     * @since 2.11\n     */\n    public val pluginSharedLibrariesPath: Path\n\n    /**\n     * 插件运行时依赖存放路径 [File], 该路径下的依赖由全部插件共享\n     *\n     * **实现细节**: 在 terminal 前端实现为 `$rootPath/plugin-shared-libraries`\n     *\n     * @since 2.11\n     */\n    public val pluginSharedLibrariesFolder: File\n\n    // endregion\n\n\n    // region plugins & loaders\n\n    /**\n     * 已加载的插件列表\n     *\n     * @return 只读列表\n     */\n    public val plugins: List<Plugin>\n\n    /**\n     * 内建的插件加载器列表. 由 [MiraiConsole] 初始化.\n     *\n     * @return 只读列表\n     */\n    public val builtInLoaders: List<PluginLoader<*, *>>\n\n    /**\n     * 由插件创建的 [PluginLoader]\n     *\n     * @return 只读列表\n     */\n    public val pluginLoaders: List<PluginLoader<*, *>>\n\n    /**\n     * 获取插件的 [描述][PluginDescription], 通过 [PluginLoader.getPluginDescription]\n     */\n    public fun getPluginDescription(plugin: Plugin): PluginDescription\n\n    /**\n     * 禁用这个插件\n     *\n     * @see PluginLoader.disable\n     */\n    public fun disablePlugin(plugin: Plugin): Unit = plugin.safeLoader.disable(plugin)\n\n    /**\n     * 加载这个插件\n     *\n     * @see PluginLoader.load\n     */\n    public fun loadPlugin(plugin: Plugin): Unit = plugin.safeLoader.load(plugin)\n\n    /**\n     * 启用这个插件\n     *\n     * @see PluginLoader.enable\n     */\n    public fun enablePlugin(plugin: Plugin): Unit = plugin.safeLoader.enable(plugin)\n\n    // endregion\n\n    /**\n     * [PluginManager] 实例. 转发所有调用到 [MiraiConsole.pluginManager].\n     */\n    public companion object INSTANCE : PluginManager by (dynamicDelegation { MiraiConsole.pluginManager }) {\n        /**\n         * 经过泛型类型转换的 [Plugin.loader]\n         */\n        @get:JvmSynthetic\n        @Suppress(\"UNCHECKED_CAST\")\n        public inline val <P : Plugin> P.safeLoader: PluginLoader<P, PluginDescription>\n            get() = this.loader as PluginLoader<P, PluginDescription>\n\n\n        /**\n         * @see getPluginDescription\n         */\n        @get:JvmSynthetic\n        public inline val Plugin.description: PluginDescription\n            get() = getPluginDescription(this)\n\n        /**\n         * @see disablePlugin\n         */\n        @JvmSynthetic\n        public inline fun Plugin.disable(): Unit = disablePlugin(this)\n\n        /**\n         * @see enablePlugin\n         */\n        @JvmSynthetic\n        public inline fun Plugin.enable(): Unit = enablePlugin(this)\n\n        /**\n         * @see loadPlugin\n         */\n        @JvmSynthetic\n        public inline fun Plugin.load(): Unit = loadPlugin(this)\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/plugin/ResourceContainer.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.plugin\n\nimport net.mamoe.mirai.console.plugin.ResourceContainer.Companion.asResourceContainer\nimport net.mamoe.mirai.console.plugin.jvm.JvmPlugin\nimport java.io.InputStream\nimport java.nio.charset.Charset\nimport kotlin.reflect.KClass\n\n/**\n * 资源容器.\n *\n * 资源容器可能使用 [Class.getResourceAsStream], [ClassLoader.getResourceAsStream], 也可能使用其他方式, 取决于实现方式.\n *\n * @see JvmPlugin [JvmPlugin] 通过 [ClassLoader.getResourceAsStream] 实现 [ResourceContainer], 使用 [ResourceContainer.asResourceContainer]\n */\npublic interface ResourceContainer {\n    /**\n     * 获取一个资源文件.\n     *\n     * @return 资源文件内容. 在未找到文件时返回 `null`.\n     */\n    public fun getResourceAsStream(path: String): InputStream?\n\n    /**\n     * 读取一个资源文件并以 [Charsets.UTF_8] 解码为 [String].\n     *\n     * @return 资源文件内容. 在未找到文件时返回 `null`.\n     */\n    public fun getResource(path: String): String? = getResource(path, Charsets.UTF_8)\n\n    /**\n     * 读取一个资源文件并以 [charset] 解码为 [String].\n     *\n     * @return 资源文件内容. 在未找到文件时返回 `null`.\n     */\n    public fun getResource(path: String, charset: Charset): String? =\n        this.getResourceAsStream(path)?.use(InputStream::readBytes)?.let(::String)\n\n    public companion object {\n        /**\n         * 使用 [Class.getResourceAsStream] 读取资源文件.\n         *\n         * @see ClassLoader.asResourceContainer\n         */\n        @JvmStatic\n        @JvmName(\"create\")\n        public fun KClass<*>.asResourceContainer(): ResourceContainer = this.java.asResourceContainer()\n\n        /**\n         * 使用 [ClassLoader.getResourceAsStream] 读取资源文件.\n         */\n        @JvmStatic\n        @JvmName(\"create\")\n        public fun ClassLoader.asResourceContainer(): ResourceContainer = ClassLoaderAsResourceContainer(this)\n\n        /**\n         * 使用 [Class.getResourceAsStream] 读取资源文件.\n         */\n        @JvmStatic\n        @JvmName(\"create\")\n        public fun Class<*>.asResourceContainer(): ResourceContainer = ClassAsResourceContainer(this)\n    }\n}\n\nprivate class ClassAsResourceContainer(\n    private val clazz: Class<*>\n) : ResourceContainer {\n    override fun getResourceAsStream(path: String): InputStream? = clazz.getResourceAsStream(path)\n}\n\nprivate class ClassLoaderAsResourceContainer(\n    private val clazz: ClassLoader\n) : ResourceContainer {\n    override fun getResourceAsStream(path: String): InputStream? = clazz.getResourceAsStream(path)\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/plugin/center/PluginCenter.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.plugin.center\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport java.io.File\n\n/**\n * 插件中心, 计划实现中\n */\n@ConsoleExperimentalApi\npublic interface PluginCenter {\n\n    @Serializable\n    @ConsoleExperimentalApi\n    public data class PluginInsight(\n        val name: String,\n        val version: String,\n        @SerialName(\"core\")\n        val coreVersion: String,\n        @SerialName(\"console\")\n        val consoleVersion: String,\n        val author: String,\n        val description: String,\n        val tags: List<String>,\n        val commands: List<String>,\n    )\n\n    @ConsoleExperimentalApi\n    @Serializable\n    public data class PluginInfo(\n        val name: String,\n        val version: String,\n        @SerialName(\"core\")\n        val coreVersion: String,\n        @SerialName(\"console\")\n        val consoleVersion: String,\n        val tags: List<String>,\n        val author: String,\n        val contact: String,\n        val description: String,\n        val usage: String,\n        val vcs: String,\n        val commands: List<String>,\n        val changeLog: List<String>,\n    )\n\n    /**\n     * 获取一些中心的插件基本信息,\n     * 能获取到多少由实际的 [PluginCenter] 决定\n     * 返回 插件名->Insight\n     */\n    public suspend fun fetchPlugin(page: Int): Map<String, PluginInsight>\n\n    /**\n     * 尝试获取到某个插件 by 全名, case sensitive\n     * null 则没有\n     */\n    public suspend fun findPlugin(name: String): PluginInfo?\n\n\n    public suspend fun <T : Any> T.downloadPlugin(name: String, progressListener: T.(Float) -> Unit): File\n\n    public suspend fun downloadPlugin(name: String, progressListener: PluginCenter.(Float) -> Unit): File =\n        downloadPlugin<PluginCenter>(name, progressListener)\n\n    /**\n     * 刷新\n     */\n    public suspend fun refresh()\n\n    public val name: String\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/plugin/description/IllegalPluginDescriptionException.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.plugin.description\n\n/**\n * 在检查到非法 [PluginDescription] 时抛出.\n *\n * @see PluginDescription.checkPluginDescription\n */\npublic class IllegalPluginDescriptionException : RuntimeException {\n    public constructor() : super()\n    public constructor(message: String?) : super(message)\n    public constructor(message: String?, cause: Throwable?) : super(message, cause)\n    public constructor(cause: Throwable?) : super(cause)\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/plugin/description/PluginDependency.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.plugin.description\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.builtins.serializer\nimport net.mamoe.mirai.console.compiler.common.ResolveContext\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.PLUGIN_ID\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.VERSION_REQUIREMENT\nimport net.mamoe.mirai.console.internal.data.map\nimport net.mamoe.mirai.console.util.SemVersion\n\n/**\n * 插件的一个依赖的信息.\n *\n * 只有添加依赖后才能使用依赖插件的 API.\n *\n * 被依赖的插件将会在依赖方之前加载. 即若 A 依赖 B, 那么 B 总是会在 A 之前加载.\n *\n * 注意, 若发现循环依赖, 将会拒绝所有参与循环的插件的加载.\n *\n * @see PluginDescription.dependencies\n */\n@Serializable(with = PluginDependency.PluginDependencyAsStringSerializer::class)\npublic data class PluginDependency @JvmOverloads constructor(\n    /**\n     * 依赖插件 ID, [PluginDescription.id]\n     */\n    @ResolveContext(PLUGIN_ID) public val id: String,\n    /**\n     * 依赖版本号. 为 null 时则为不限制版本. 通常建议至少限制使用同一个主版本号.\n     * 如开发时依赖该插件版本 1.5.0, 则将版本限制设置为 `[1.5.0, 2.0.0)`, 表示大于等于 `1.5.0`, 小于 `2.0.0`.\n     *\n     * 版本遵循 [语义化版本 2.0 规范](https://semver.org/lang/zh-CN/),\n     *\n     * @see SemVersion.Requirement\n     */\n    @ResolveContext(VERSION_REQUIREMENT) public val versionRequirement: String? = null,\n    /**\n     * 若为 `false`, 在找不到此依赖时将会拒绝插件加载.\n     * 若为 `true`, 在找不到此依赖时也能正常加载.\n     */\n    public val isOptional: Boolean = false,\n) {\n    init {\n        kotlin.runCatching {\n            PluginDescription.checkPluginId(id)\n            if (versionRequirement != null) SemVersion.parseRangeRequirement(versionRequirement)\n        }.getOrElse {\n            throw IllegalArgumentException(it)\n        }\n    }\n\n    /**\n     * @see PluginDependency\n     */\n    public constructor(\n        @ResolveContext(PLUGIN_ID) id: String,\n        isOptional: Boolean = false,\n    ) : this(\n        id, null, isOptional\n    )\n\n    public override fun toString(): String = buildString {\n        append(id)\n        versionRequirement?.let {\n            append(':')\n            append(it)\n        }\n        if (isOptional) {\n            append('?')\n        }\n    }\n\n    public companion object {\n        /**\n         * 解析 \"$id:$versionRequirement?\"\n         */\n        @JvmStatic\n        @Throws(IllegalArgumentException::class)\n        public fun parseFromString(string: String): PluginDependency {\n            require(string.isNotEmpty()) { \"string is empty.\" }\n            val optional = string.endsWith('?')\n            val (id, version) = string.removeSuffix(\"?\").let { rule ->\n                if (rule.contains(':')) {\n                    rule.substringBeforeLast(':') to rule.substringAfterLast(':')\n                } else {\n                    rule to null\n                }\n            }\n            return PluginDependency(id, version, optional)\n        }\n    }\n\n    public object PluginDependencyAsStringSerializer : KSerializer<PluginDependency> by String.serializer().map(\n        serializer = { it.toString() },\n        deserializer = { parseFromString(it) }\n    )\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/plugin/description/PluginDescription.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.console.plugin.description\n\nimport net.mamoe.mirai.console.compiler.common.CheckerConstants\nimport net.mamoe.mirai.console.compiler.common.ResolveContext\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.*\nimport net.mamoe.mirai.console.plugin.Plugin\nimport net.mamoe.mirai.console.util.SemVersion\n\n\n/**\n * 插件描述.\n *\n * @see Plugin\n */\npublic interface PluginDescription {\n    /**\n     * 插件 ID. 用于指令权限等一些内部处理\n     *\n     * - 仅允许英文字母, '-', '_', '.'. 在内部操作处理时不区分大小写.\n     * - 类似于 Java 包名, 插件 ID 需要 '域名.名称' 格式, 如 `net.mamoe.mirai.example-plugin`\n     * - 域名和名称都是必须的\n     * - 数字和符号都不允许位于首位\n     * - '-' 和 '_' 仅允许存在于两个英文字母之间. 不推荐使用 '_'. 请参照 `org.example.mirai.plugin.my-example-plugin` 格式.\n     *\n     * 可使用 [ID_REGEX] 检验格式合法性.\n     *\n     * ID 在插件发布后就应该保持不变, 以便其他插件添加依赖.\n     *\n     * 插件 ID 的域名和名称都不能完全是以下其中一个 ([FORBIDDEN_ID_NAMES]).\n     * - \"console\"\n     * - \"main\"\n     * - \"plugin\"\n     * - \"config\"\n     * - \"data\"\n     *\n     * ### 示例\n     * - 合法 `net.mamoe.mirai.example-plugin`\n     * - 非法 `.example-plugin`\n     *\n     * @see ID_REGEX\n     * @see FORBIDDEN_ID_NAMES\n     */\n    @ResolveContext(PLUGIN_ID)\n    public val id: String\n\n    /**\n     * 插件名称用于展示给用户，仅取决于 `PluginDescription` 提供的 `name`，与主类类名等其他信息无关.\n     *\n     * 名称允许中文, 允许各类符号，但不能完全是以下其中一种（忽略大小写）([FORBIDDEN_ID_NAMES]):\n     * - console\n     * - main\n     * - plugin\n     * - config\n     * - data\n     *\n     * @see FORBIDDEN_ID_NAMES\n     */\n    @ResolveContext(PLUGIN_NAME)\n    public val name: String\n\n    /**\n     * 插件作者, 允许为空\n     */\n    public val author: String\n\n    /**\n     * 插件版本.\n     *\n     * 语法参考: ([语义化版本 2.0.0](https://semver.org/lang/zh-CN/)).\n     *\n     * 合法的版本号示例:\n     * - `1.0.0`\n     * - `1.0`\n     * - `1.0-M1`\n     * - `1.0.0-M1`\n     * - `1.0.0-M2-1`\n     * - `1`  (尽管非常不建议这么做)\n     *\n     * 非法版本号示例:\n     * - `DEBUG-1`\n     * - `-1.0`\n     * - `v1.0` (不允许 \"v\")\n     * - `V1.0` (不允许 \"V\")\n     *\n     * @see SemVersion 语义化版本.\n     */\n    @ResolveContext(SEMANTIC_VERSION)\n    public val version: SemVersion\n\n    /**\n     * 插件信息, 允许为空\n     */\n    public val info: String\n\n    /**\n     * 此插件依赖的其他插件, 将会在这些插件加载之后加载此插件\n     *\n     * 特别的, 可以使用 `net.mamoe.mirai-console` 作为插件 id 限制 mirai-console 版本 (自 2.16.0 后)\n     *\n     * @see PluginDependency\n     */\n    public val dependencies: Set<PluginDependency>\n\n    public companion object {\n        /**\n         * [PluginDescription.id] 的合法 [Regex].\n         *\n         * - Group 1: 域名\n         * - Group 2: 名称\n         *\n         * ```regex\n         * ([a-zA-Z]\\w*(?:\\.[a-zA-Z]\\w*)*)\\.([a-zA-Z]\\w*(?:-\\w+)*)\n         * ```\n         *\n         * @see PluginDescription.id\n         */\n        public val ID_REGEX: Regex = CheckerConstants.PLUGIN_ID_REGEX\n\n        /**\n         * 在 [PluginDescription.id] 和 [PluginDescription.name] 中禁止用的完全匹配名称列表.\n         *\n         * @see PluginDescription.id\n         */\n        public val FORBIDDEN_ID_NAMES: Array<String> = CheckerConstants.PLUGIN_FORBIDDEN_NAMES\n\n        /**\n         * 依次检查 [PluginDescription] 的 [PluginDescription.id], [PluginDescription.name], [PluginDescription.dependencies] 的合法性\n         *\n         * @throws IllegalPluginDescriptionException 当不合法时抛出.\n         */\n        @Throws(IllegalPluginDescriptionException::class)\n        public fun checkPluginDescription(instance: PluginDescription) {\n            kotlin.runCatching {\n                checkPluginId(instance.id)\n                checkPluginName(instance.name)\n                checkDependencies(instance.id, instance.dependencies)\n            }.getOrElse {\n                throw IllegalPluginDescriptionException(\n                    \"Illegal PluginDescription. Plugin ${instance.name} (${instance.id})\",\n                    it\n                )\n            }\n        }\n\n        /**\n         * 检查 [PluginDescription.id] 的合法性. 忽略大小写.\n         *\n         * @throws IllegalPluginDescriptionException 当不合法时抛出.\n         */\n        @Throws(IllegalPluginDescriptionException::class)\n        public fun checkPluginId(id: String) {\n            if (id.isBlank()) throw IllegalPluginDescriptionException(\"Plugin id cannot be blank\")\n            if (id.none { it == '.' }) throw IllegalPluginDescriptionException(\"'$id' is illegal. Plugin id must consist of both domain and name. \")\n\n            val lowercaseId = id.lowercase()\n\n            if (ID_REGEX.matchEntire(id) == null) {\n                throw IllegalPluginDescriptionException(\"Plugin does not match regex '${ID_REGEX.pattern}'.\")\n            }\n\n            FORBIDDEN_ID_NAMES.firstOrNull { it == lowercaseId }?.let { illegal ->\n                throw IllegalPluginDescriptionException(\"Plugin id contains illegal word: '$illegal'.\")\n            }\n        }\n\n        /**\n         * 检查 [PluginDescription.name] 的合法性. 忽略大小写.\n         *\n         * @throws IllegalPluginDescriptionException 当不合法时抛出.\n         */\n        @Throws(IllegalPluginDescriptionException::class)\n        public fun checkPluginName(name: String) {\n            if (name.isBlank()) throw IllegalPluginDescriptionException(\"Plugin name cannot be blank\")\n            val lowercaseName = name.lowercase()\n            FORBIDDEN_ID_NAMES.firstOrNull { it == lowercaseName }?.let { illegal ->\n                throw IllegalPluginDescriptionException(\"Plugin name is illegal: '$illegal'.\")\n            }\n        }\n\n        /**\n         * 检查 [PluginDescription.dependencies] 的合法性. 忽略大小写.\n         *\n         * @throws IllegalPluginDescriptionException 当不合法时抛出.\n         */\n        @Throws(IllegalPluginDescriptionException::class)\n        public fun checkDependencies(pluginId: String, dependencies: Set<PluginDependency>) {\n            val lowercaseId = pluginId.lowercase()\n            val lowercaseDependencies = dependencies.mapTo(LinkedHashSet(dependencies.size)) { it.id.lowercase() }\n\n            if (lowercaseDependencies.size != dependencies.size)\n                throw IllegalPluginDescriptionException(\"Duplicated dependency detected: A plugin cannot depend on different versions of dependencies of the same id\")\n\n            if (lowercaseDependencies.any { it == lowercaseId })\n                throw IllegalPluginDescriptionException(\"Recursive dependency detected: A plugin cannot depend on itself\")\n        }\n    }\n}\n\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/plugin/jvm/AbstractJvmPlugin.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"EXPOSED_SUPER_CLASS\", \"NOTHING_TO_INLINE\")\n\npackage net.mamoe.mirai.console.plugin.jvm\n\nimport net.mamoe.mirai.console.data.AutoSavePluginDataHolder\nimport net.mamoe.mirai.console.data.PluginConfig\nimport net.mamoe.mirai.console.data.PluginData\nimport net.mamoe.mirai.console.internal.plugin.JvmPluginClassLoaderN\nimport net.mamoe.mirai.console.internal.plugin.JvmPluginInternal\nimport net.mamoe.mirai.console.internal.plugin.loadPluginDescriptionFromClassLoader\nimport net.mamoe.mirai.console.internal.util.PluginServiceHelper\nimport net.mamoe.mirai.console.permission.PermissionId\nimport net.mamoe.mirai.console.permission.PermissionService\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.utils.minutesToMillis\nimport net.mamoe.mirai.utils.secondsToMillis\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\nimport kotlin.reflect.KClass\n\n/**\n * [JavaPlugin] 和 [KotlinPlugin] 的父类. 所有 [JvmPlugin] 都应该拥有此类作为直接或间接父类.\n *\n * @see JavaPlugin\n * @see KotlinPlugin\n */\n@OptIn(ConsoleExperimentalApi::class)\npublic abstract class AbstractJvmPlugin : JvmPluginInternal, JvmPlugin, AutoSavePluginDataHolder {\n    @JvmOverloads\n    public constructor(\n        description: JvmPluginDescription,\n        parentCoroutineContext: CoroutineContext = EmptyCoroutineContext,\n    ) : super(parentCoroutineContext) {\n        this.description = description\n    }\n\n    @JvmOverloads\n    public constructor(parentCoroutineContext: CoroutineContext = EmptyCoroutineContext) : super(parentCoroutineContext) {\n        this.description = javaClass.loadPluginDescriptionFromClassLoader()\n    }\n\n\n    final override val description: JvmPluginDescription\n\n    @ConsoleExperimentalApi\n    public final override val dataHolderName: String\n        get() = this.description.id\n\n    public final override val loader: JvmPluginLoader get() = super<JvmPluginInternal>.loader\n\n    public final override fun permissionId(name: String): PermissionId =\n        PermissionService.INSTANCE.allocatePermissionIdForPlugin(this, name)\n\n    /**\n     * 重载 [PluginData]\n     *\n     * @see reloadPluginData\n     */\n    @JvmName(\"reloadPluginData\")\n    public fun <T : PluginData> T.reload(): Unit = loader.dataStorage.load(this@AbstractJvmPlugin, this)\n\n    /**\n     * 重载 [PluginConfig]\n     *\n     * @see reloadPluginConfig\n     */\n    @JvmName(\"reloadPluginConfig\")\n    public fun <T : PluginConfig> T.reload(): Unit = loader.configStorage.load(this@AbstractJvmPlugin, this)\n\n    /**\n     * 立即保存 [PluginData]\n     *\n     * @see reloadPluginData\n     * @since 2.9\n     */\n    @JvmName(\"savePluginData\")\n    public fun <T : PluginData> T.save(): Unit = loader.dataStorage.store(this@AbstractJvmPlugin, this)\n\n    /**\n     * 立即保存 [PluginConfig]\n     *\n     * @see reloadPluginConfig\n     * @since 2.9\n     */\n    @JvmName(\"savePluginConfig\")\n    public fun <T : PluginConfig> T.save(): Unit = loader.configStorage.store(this@AbstractJvmPlugin, this)\n\n    @ConsoleExperimentalApi\n    public override val autoSaveIntervalMillis: LongRange = 30.secondsToMillis..10.minutesToMillis\n\n    /**\n     * 获取 [JvmPluginClasspath]\n     *\n     * 注: 仅插件通过 console 内置插件加载器加载时可用\n     *\n     * @since 2.12\n     */\n    protected val jvmPluginClasspath: JvmPluginClasspath by lazy {\n        val classLoader = this@AbstractJvmPlugin.javaClass.classLoader\n        if (classLoader is JvmPluginClassLoaderN) {\n            return@lazy classLoader.openaccess\n        }\n        error(\"jvmPluginClasspath not available for $classLoader\")\n    }\n\n    /**\n     * 获取 指定类的 SPI Service\n     *\n     * 为了兼容 Kotlin object 单例类，此方法没有直接使用 java 原生的 API,\n     * 而是 手动读取 `META-INF/services/` 的内容, 并尝试构造或获取实例\n     *\n     * 注: 仅包括当前插件 JAR 的 Service\n     */\n    @JvmSynthetic\n    protected fun <T : Any> services(kClass: KClass<out T>): Lazy<List<T>> = lazy {\n        val classLoader = try {\n            jvmPluginClasspath.pluginClassLoader\n        } catch (_: IllegalStateException) {\n            this::class.java.classLoader\n        }\n        with(PluginServiceHelper) {\n            classLoader\n                .findServices(kClass)\n                .loadAllServices()\n        }\n    }\n\n    /**\n     * 获取 指定类的 SPI Service\n     *\n     * 为了兼容 Kotlin object 单例类，此方法没有直接使用 java 原生的 API,\n     * 而是 手动读取 `META-INF/services/` 的内容, 并尝试构造或获取实例\n     *\n     * 注: 仅包括当前插件 JAR 的 Service\n     */\n    protected fun <T : Any> services(clazz: Class<out T>): Lazy<List<T>> = services(kClass = clazz.kotlin)\n\n    /**\n     * 获取 指定类的 SPI Service\n     *\n     * 为了兼容 Kotlin object 单例类，此方法没有直接使用 java 原生的 API,\n     * 而是 手动读取 `META-INF/services/` 的内容, 并尝试构造或获取实例\n     *\n     * 注: 仅包括当前插件 JAR 的 Service\n     */\n    protected inline fun <reified T : Any> services(): Lazy<List<T>> = services(kClass = T::class)\n}\n\n/**\n * 重载一个 [PluginData]\n *\n * @see AbstractJvmPlugin.reload\n */\n@JvmSynthetic\npublic inline fun AbstractJvmPlugin.reloadPluginData(instance: PluginData): Unit = this.run { instance.reload() }\n\n/**\n * 重载一个 [PluginConfig]\n *\n * @see AbstractJvmPlugin.reload\n */\n@JvmSynthetic\npublic inline fun AbstractJvmPlugin.reloadPluginConfig(instance: PluginConfig): Unit = this.run { instance.reload() }\n\n/**\n * 立即保存 [PluginData]\n *\n * @see AbstractJvmPlugin.save\n * @since 2.9\n */\n@JvmSynthetic\npublic inline fun AbstractJvmPlugin.savePluginData(instance: PluginData): Unit = this.run { instance.save() }\n\n/**\n * 立即保存 [PluginConfig]\n *\n * @see AbstractJvmPlugin.save\n * @since 2.9\n */\n@JvmSynthetic\npublic inline fun AbstractJvmPlugin.savePluginConfig(instance: PluginConfig): Unit = this.run { instance.save() }\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/plugin/jvm/ExportManager.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.plugin.jvm\n\nimport net.mamoe.mirai.console.internal.plugin.ExportManagerImpl\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\n\n/**\n * 插件的类导出管理器\n *\n *\n * 允许插件将一些内部实现保护起来， 避免其他插件调用， 要启动这个特性，\n * 只需要创建名为 `export-rules.txt` 的规则文件，便可以控制插件的类的公开规则。\n *\n * 如果正在使用 `Gradle` 项目, 该规则文件一般位于 `src/main/resources` 下\n *\n * Example:\n * ```text\n *\n * # #开头的行全部识别为注释\n *\n * # exports, 允许其他插件直接使用某个类\n *\n * # 导出了一个internal包的一个类\n * #\n * exports org.example.miraiconsole.myplugin.internal.OpenInternal\n *\n * # 导出了整个 api 包\n * #\n * exports org.example.miraiconsole.myplugin.api\n *\n * # 保护 org.example.miraiconsole.myplugin.api2.Internal, 不允许其他插件直接使用\n * #\n * protects org.example.miraiconsole.myplugin.api2.Internal\n *\n * # 保护整个包\n * #\n * # 别名: protect-package\n * protects org.example.miraiconsole.myplugin.internal\n *\n * # 此规则不会生效, 因为在此条规则之前,\n * # org.example.miraiconsole.myplugin.internal 已经被加入到保护域中\n * exports org.example.miraiconsole.myplugin.internal.NotOpenInternal\n *\n *\n * # export-plugin, 允许其他插件使用除了已经被保护的全部类\n * # 使用此规则会同时让此规则后的所有规则全部失效\n * # 别名: export-all, export-system\n * # export-plugin\n *\n *\n * # 将整个插件放入保护域中\n * # 除了此规则之前显式 export 的类, 其他插件将不允许直接使用被保护的插件的任何类\n * # 别名: protect-all, protect-system\n * protect-plugin\n *\n * ```\n *\n * 插件也可以通过 Service 来自定义导出控制\n *\n * Example:\n * ```kotlin\n * @AutoService(ExportManager::class)\n * object MyExportManager: ExportManager {\n * override fun isExported(className: String): Boolean {\n * println(\"  <== $className\")\n * return true\n * }\n * }\n * ```\n *\n * @see StandardExportManagers\n */\n@ConsoleExperimentalApi\npublic interface ExportManager {\n    /**\n     *  如果 [className] 能够通过 [ExportManager] 的规则, 返回 true\n     *\n     *  @param className [className] 是一个合法的满足 [ClassLoader] 的加载规则 的全限定名.\n     *  [className] 不应该是数组的全限定名或者JVM基本类型的名字.\n     *  See also: [ClassLoader.loadClass]\n     *  [ClassLoader#name](https://docs.oracle.com/javase/8/docs/api/java/lang/ClassLoader.html#name)\n     */\n    public fun isExported(className: String): Boolean\n}\n\n@ConsoleExperimentalApi\npublic object StandardExportManagers {\n    @ConsoleExperimentalApi\n    public object AllExported : ExportManager {\n        override fun isExported(className: String): Boolean = true\n    }\n\n    @ConsoleExperimentalApi\n    public object AllDenied : ExportManager {\n        override fun isExported(className: String): Boolean = false\n    }\n\n    @ConsoleExperimentalApi\n    @JvmStatic\n    public fun parse(lines: Iterator<String>): ExportManager {\n        return ExportManagerImpl.parse(lines)\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/plugin/jvm/JavaPlugin.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"EXPOSED_SUPER_CLASS\")\n\npackage net.mamoe.mirai.console.plugin.jvm\n\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\n\n/**\n * Java 插件的父类\n */\npublic abstract class JavaPlugin : JvmPlugin, AbstractJvmPlugin {\n\n    /**\n     * 通过一个指定的 [JvmPluginDescription] 构造插件示例\n     *\n     * 当使用 `plugin.yml` 加载插件示例时不能使用此构造器\n     */\n    @JvmOverloads\n    public constructor(\n        description: JvmPluginDescription,\n        parentCoroutineContext: CoroutineContext = EmptyCoroutineContext,\n    ) : super(description, parentCoroutineContext)\n\n    /**\n     * 通过插件内置的 `plugin.yml` 构造插件实例\n     *\n     * @since 2.16.0\n     */\n    @JvmOverloads\n    public constructor(\n        parentCoroutineContext: CoroutineContext = EmptyCoroutineContext,\n    ) : super(parentCoroutineContext)\n\n\n    init {\n        __jpi_try_to_init_dependencies()\n    }\n\n    /**\n     * Java API Scheduler\n     */\n    public val scheduler: JavaPluginScheduler = JavaPluginScheduler(this.coroutineContext)\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/plugin/jvm/JavaPluginScheduler.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"ConsoleUtils\")\n\npackage net.mamoe.mirai.console.plugin.jvm\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Runnable\nimport net.mamoe.mirai.console.internal.util.JavaPluginSchedulerImpl\nimport java.util.concurrent.Callable\nimport java.util.concurrent.CompletableFuture\nimport java.util.concurrent.Future\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\n\n\n/**\n * 拥有生命周期管理的简单 Java 线程池.\n *\n * 在插件被 [卸载][JavaPlugin.onDisable] 时将会自动停止.\n *\n * @see JavaPlugin.scheduler 获取实例\n */\npublic interface JavaPluginScheduler : CoroutineScope {\n    /**\n     * 新增一个 Repeating Task (定时任务)\n     *\n     * 这个 Runnable 会被每 [intervalMs] 调用一次(不包含 [runnable] 执行时间)\n     *\n     * @see Future.cancel 取消这个任务\n     */\n    public fun repeating(intervalMs: Long, runnable: Runnable): Future<Void?>\n\n    /**\n     * 新增一个 Delayed Task (延迟任务)\n     *\n     * 在延迟 [delayMillis] 后执行 [runnable]\n     */\n    public fun delayed(delayMillis: Long, runnable: Runnable): CompletableFuture<Void?>\n\n    /**\n     * 新增一个 Delayed Task (延迟任务)\n     *\n     * 在延迟 [delayMillis] 后执行 [callable]\n     */\n    public fun <R> delayed(delayMillis: Long, callable: Callable<R>): CompletableFuture<R>\n\n    /**\n     * 异步执行一个任务, 最终返回 [Future], 与 Java 使用方法无异, 但效率更高且可以在插件关闭时停止\n     */\n    public fun <R> async(supplier: Callable<R>): Future<R>\n\n    /**\n     * 异步执行一个任务, 没有返回\n     */\n    public fun async(runnable: Runnable): Future<Void?>\n\n    public companion object {\n        /**\n         * 创建一个 [JavaPluginScheduler]\n         */\n        @JvmStatic\n        @JvmName(\"create\")\n        @JvmOverloads\n        public operator fun invoke(parentCoroutineContext: CoroutineContext = EmptyCoroutineContext): JavaPluginScheduler =\n            JavaPluginSchedulerImpl(parentCoroutineContext)\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/plugin/jvm/JvmPlugin.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\n    \"INVISIBLE_MEMBER\",\n    \"INVISIBLE_REFERENCE\",\n    \"EXPOSED_SUPER_CLASS\",\n    \"NOTHING_TO_INLINE\",\n    \"INAPPLICABLE_JVM_NAME\"\n)\n\npackage net.mamoe.mirai.console.plugin.jvm\n\nimport kotlinx.coroutines.CoroutineScope\nimport net.mamoe.mirai.console.compiler.common.RestrictedScope\nimport net.mamoe.mirai.console.compiler.common.RestrictedScope.Kind.COMMAND_REGISTER\nimport net.mamoe.mirai.console.compiler.common.RestrictedScope.Kind.PERMISSION_REGISTER\nimport net.mamoe.mirai.console.extension.PluginComponentStorage\nimport net.mamoe.mirai.console.permission.PermissionIdNamespace\nimport net.mamoe.mirai.console.plugin.Plugin\nimport net.mamoe.mirai.console.plugin.PluginFileExtensions\nimport net.mamoe.mirai.console.plugin.ResourceContainer\nimport net.mamoe.mirai.utils.MiraiLogger\n\n\n/**\n * Java, Kotlin 或其他 JVM 平台插件\n *\n * @see AbstractJvmPlugin 默认实现\n *\n * @see JavaPlugin Java 插件\n * @see KotlinPlugin Kotlin 插件\n *\n * @see JvmPlugin 支持文件系统扩展\n * @see ResourceContainer 支持资源获取 (如 Jar 中的资源文件)\n */\npublic interface JvmPlugin : Plugin, CoroutineScope,\n    PluginFileExtensions, ResourceContainer, PermissionIdNamespace {\n\n    /** 日志 */\n    public val logger: MiraiLogger\n\n    /** 插件描述 */\n    public val description: JvmPluginDescription\n\n    /** 所属插件加载器实例 */\n    // `final` in AbstractJvmPlugin\n    public override val loader: JvmPluginLoader get() = JvmPluginLoader\n\n    /**\n     * 在插件被加载时调用. 只会被调用一次.\n     *\n     * 在 [onLoad] 时可注册扩展 [PluginComponentStorage.contribute]\n     *\n     * @see PluginComponentStorage 查看更多信息\n     *\n     * @receiver 组件容器\n     */\n    @RestrictedScope(COMMAND_REGISTER, PERMISSION_REGISTER)\n    public fun PluginComponentStorage.onLoad() {\n    }\n\n    /**\n     * 在插件被启用时调用, 可能会被调用多次\n     */\n    public fun onEnable() {}\n\n    /**\n     * 在插件被关闭时调用, 可能会被调用多次\n     */\n    public fun onDisable() {}\n\n    public companion object {\n        @JvmSynthetic\n        public inline fun JvmPlugin.onLoad(storage: PluginComponentStorage): Unit = storage.onLoad()\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/plugin/jvm/JvmPluginClasspath.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.plugin.jvm\n\nimport java.io.File\n\n/**\n * [JvmPlugin] 的类路径\n *\n * @since 2.12\n * @see AbstractJvmPlugin.jvmPluginClasspath\n */\npublic interface JvmPluginClasspath {\n    public val pluginFile: File\n\n    /**\n     * 插件本体的 [ClassLoader], 负责加载插件本身的类数据\n     *\n     * JVM NAME: `${pluginFile.name}`\n     */\n    public val pluginClassLoader: ClassLoader\n\n    /**\n     * 插件所使用的依赖, 可共享, 当其他插件依赖于当前插件时, 其他插件可以从此 [ClassLoader] 搜索类引用\n     *\n     * JVM NAME: ${pluginFile.name}&#91;shared]\n     */\n    public val pluginSharedLibrariesClassLoader: ClassLoader\n\n    /**\n     * 插件内部使用的依赖, 不公开给其他插件, 其他插件搜索时不会搜索到此插件的依赖\n     *\n     * JVM NAME: ${pluginFile.name}&#91;private]\n     */\n    public val pluginIndependentLibrariesClassLoader: ClassLoader\n\n    /**\n     * [pluginClassLoader] 是否可以通过 [ClassLoader.getResource] 获取 Mirai Console (包括依赖) 的相关资源\n     *\n     * 默认为 `false`\n     *\n     * @since 2.15.0\n     */\n    @SettingProperty(\"resources.resolve-console-system-resources\", defaultValue = \"false\")\n    public var shouldResolveConsoleSystemResource: Boolean\n\n    /**\n     * 当前插件是否可以被没有依赖此插件的插件使用\n     *\n     * 默认为 `true`\n     *\n     * @since 2.15.0\n     */\n    @SettingProperty(\"class.loading.be-resolvable-to-independent\", defaultValue = \"true\")\n    public var shouldBeResolvableToIndependent: Boolean\n\n    /**\n     * 当前插件是否应该搜索未依赖的插件的类路径\n     *\n     * 默认为 `true`\n     *\n     * @since 2.15.0\n     */\n    @SettingProperty(\"class.loading.resolve-independent\", defaultValue = \"true\")\n    public var shouldResolveIndependent: Boolean\n\n    /**\n     * 将 [file] 加入 [classLoader] 的搜索路径内\n     *\n     * @throws IllegalArgumentException 当 [classLoader] 不是 [pluginClassLoader],\n     * [pluginIndependentLibrariesClassLoader], [pluginSharedLibrariesClassLoader] 时抛出\n     */\n    @kotlin.jvm.Throws(IllegalArgumentException::class)\n    public fun addToPath(classLoader: ClassLoader, file: File)\n\n    /**\n     * 下载依赖, 并注册进 [classLoader]\n     *\n     * 注: 如果需要同时修改 [pluginSharedLibrariesClassLoader] 和 [pluginIndependentLibrariesClassLoader],\n     * 请先对 [pluginSharedLibrariesClassLoader] 以避免出现不和预期的问题\n     *\n     * @throws IllegalArgumentException 当 [classLoader] 不是\n     * [pluginSharedLibrariesClassLoader], [pluginIndependentLibrariesClassLoader]\n     * 时抛出\n     * @throws Exception 网络错误 / 依赖未找到\n     */\n    @kotlin.jvm.Throws(IllegalArgumentException::class, Exception::class)\n    public fun downloadAndAddToPath(classLoader: ClassLoader, dependencies: Collection<String>)\n\n\n    /**\n     * 此注解仅用于注释 `options.properties` 的键值\n     *\n     * Note: `META-INF/mirai-console-plugin/options.properties`\n     *\n     * @since 2.15.0\n     */\n    @Retention(AnnotationRetention.SOURCE)\n    private annotation class SettingProperty(\n        val name: String,\n        val defaultValue: String = \"\",\n    )\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/plugin/jvm/JvmPluginDescription.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:Suppress(\"unused\", \"INVISIBLE_REFERENCE\", \"INVISIBLE_member\", \"DeprecatedCallableAddReplaceWith\")\n\npackage net.mamoe.mirai.console.plugin.jvm\n\nimport io.github.karlatemp.caller.CallerFinder\nimport io.github.karlatemp.caller.StackFrame\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.console.compiler.common.ResolveContext\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.*\nimport net.mamoe.mirai.console.internal.plugin.JvmPluginClassLoaderN\nimport net.mamoe.mirai.console.internal.util.findLoader\nimport net.mamoe.mirai.console.plugin.description.PluginDependency\nimport net.mamoe.mirai.console.plugin.description.PluginDescription\nimport net.mamoe.mirai.console.util.SemVersion\nimport net.mamoe.yamlkt.Yaml\n\n/**\n * JVM 插件的描述. 通常作为 `plugin.yml`\n *\n * 请不要自行实现 [JvmPluginDescription] 接口. 它不具有继承稳定性.\n *\n * 要查看相关约束, 参考 [PluginDescription]\n *\n * @see SimpleJvmPluginDescription\n * @see JvmPluginDescriptionBuilder\n */\npublic interface JvmPluginDescription : PluginDescription {\n    public companion object {\n        /**\n         * 从 [pluginClassloader] 读取资源文件 [filename] 并以 YAML 格式解析为 [SimpleJvmPluginDescription]\n         *\n         * @param filename [ClassLoader.getResourceAsStream] 的参数 `name`\n         * @param pluginClassloader 默认通过 [CallerFinder.getCaller] 获取调用方 [StackFrame] 然后获取其 [Class.getClassLoader].\n         */\n        @JvmOverloads\n        @JvmStatic\n        public fun loadFromResource(\n            filename: String = \"plugin.yml\",\n            pluginClassloader: ClassLoader = CallerFinder.getCaller()?.findLoader()\n                ?: error(\"Cannot find caller classloader, please specify manually.\"),\n        ): JvmPluginDescription {\n            if (filename == \"plugin.yml\") {\n                val cache = (pluginClassloader as? JvmPluginClassLoaderN)?.pluginDescriptionFromPluginResource\n                if (cache != null) return cache\n            }\n\n            val stream = pluginClassloader.getResourceAsStream(filename)\n                ?: error(\"Cannot find plugin description resource '$filename'\")\n\n            val bytes = stream.use { it.readBytes() }\n\n            return Yaml.decodeFromString(SimpleJvmPluginDescription.SerialData.serializer(), String(bytes))\n                .toJvmPluginDescription()\n        }\n    }\n}\n\n/**\n * 构建 [JvmPluginDescription]\n * @see JvmPluginDescriptionBuilder\n */\n@JvmSynthetic\npublic inline fun JvmPluginDescription(\n    /**\n     * @see [PluginDescription.id]\n     */\n    @ResolveContext(PLUGIN_ID) id: String,\n    /**\n     * @see [PluginDescription.version]\n     */\n    @ResolveContext(SEMANTIC_VERSION) version: String,\n    /**\n     * @see [PluginDescription.name]\n     */\n    @ResolveContext(PLUGIN_NAME) name: String = id,\n    block: JvmPluginDescriptionBuilder.() -> Unit = {},\n): JvmPluginDescription = JvmPluginDescriptionBuilder(id, version).apply { name(name) }.apply(block).build()\n\n/**\n * 构建 [JvmPluginDescription]\n * @see JvmPluginDescriptionBuilder\n */\n@JvmSynthetic\npublic inline fun JvmPluginDescription(\n    /**\n     * @see [PluginDescription.id]\n     */\n    @ResolveContext(PLUGIN_ID) id: String,\n    /**\n     * @see [PluginDescription.version]\n     */\n    version: SemVersion,\n    /**\n     * @see [PluginDescription.name]\n     */\n    @ResolveContext(PLUGIN_NAME) name: String = id,\n    block: JvmPluginDescriptionBuilder.() -> Unit = {},\n): JvmPluginDescription = JvmPluginDescriptionBuilder(id, version).apply { name(name) }.apply(block).build()\n\n/**\n * [JvmPluginDescription] 构建器.\n *\n * #### Kotlin Example\n * ```\n * val desc = JvmPluginDescription(\"org.example.example-plugin\", \"1.0.0\") {\n *    info(\"This is an example plugin\")\n *    dependsOn(\"org.example.another-plugin\")\n * }\n * ```\n *\n * #### Java Example\n * ```java\n * JvmPluginDescription desc = new JvmPluginDescriptionBuilder(\"org.example.example-plugin\", \"1.0.0\")\n *    .info(\"This is an example plugin\")\n *    .dependsOn(\"org.example.another-plugin\")\n *    .build();\n * ```\n *\n * @see [JvmPluginDescription]\n */\npublic class JvmPluginDescriptionBuilder(\n    @ResolveContext(PLUGIN_ID) private var id: String,\n    private var version: SemVersion,\n) {\n    public constructor(\n        @ResolveContext(PLUGIN_ID) id: String,\n        @ResolveContext(SEMANTIC_VERSION) version: String,\n    ) : this(id, SemVersion(version))\n\n    private var name: String = id\n    private var author: String = \"\"\n    private var info: String = \"\"\n    private var dependencies: MutableSet<PluginDependency> = mutableSetOf()\n\n    @ILoveKuriyamaMiraiForever\n    public fun name(@ResolveContext(PLUGIN_NAME) value: String): JvmPluginDescriptionBuilder =\n        apply { this.name = value.trim() }\n\n    @ILoveKuriyamaMiraiForever\n    public fun version(@ResolveContext(SEMANTIC_VERSION) value: String): JvmPluginDescriptionBuilder =\n        apply { this.version = SemVersion(value) }\n\n    @ILoveKuriyamaMiraiForever\n    public fun version(value: SemVersion): JvmPluginDescriptionBuilder =\n        apply { this.version = value }\n\n    @ILoveKuriyamaMiraiForever\n    public fun id(@ResolveContext(PLUGIN_ID) value: String): JvmPluginDescriptionBuilder =\n        apply { this.id = value.trim() }\n\n    @ILoveKuriyamaMiraiForever\n    public fun author(value: String): JvmPluginDescriptionBuilder = apply { this.author = value.trim() }\n\n    @ILoveKuriyamaMiraiForever\n    public fun info(value: String): JvmPluginDescriptionBuilder = apply { this.info = value.trimIndent() }\n\n    @ILoveKuriyamaMiraiForever\n    public fun setDependencies(\n        value: Set<PluginDependency>,\n    ): JvmPluginDescriptionBuilder = apply {\n        this.dependencies = value.toMutableSet()\n    }\n\n    @ILoveKuriyamaMiraiForever\n    public fun dependsOn(\n        vararg dependencies: PluginDependency,\n    ): JvmPluginDescriptionBuilder = apply {\n        for (dependency in dependencies) {\n            this.dependencies.add(dependency)\n        }\n    }\n\n    /**\n     * @see PluginDependency\n     */\n    @ILoveKuriyamaMiraiForever\n    public fun dependsOn(\n        @ResolveContext(PLUGIN_ID) pluginId: String,\n        @ResolveContext(VERSION_REQUIREMENT) versionRequirement: String,\n        isOptional: Boolean = false,\n    ): JvmPluginDescriptionBuilder = apply {\n        this.dependencies.add(PluginDependency(pluginId, versionRequirement, isOptional))\n    }\n\n    /**\n     * 无版本要求\n     *\n     * @param isOptional [PluginDependency.isOptional]\n     *\n     * @see PluginDependency\n     */\n    @ILoveKuriyamaMiraiForever\n    public fun dependsOn(\n        @ResolveContext(PLUGIN_ID) pluginId: String,\n        isOptional: Boolean = false,\n    ): JvmPluginDescriptionBuilder = apply {\n        this.dependencies.add(PluginDependency(pluginId, null, isOptional))\n    }\n\n\n    public fun build(): JvmPluginDescription =\n        @Suppress(\"DEPRECATION_ERROR\")\n        SimpleJvmPluginDescription(id, name, version, author, info, dependencies)\n\n    /**\n     * 标注一个 [JvmPluginDescription] DSL\n     */\n    @Suppress(\"SpellCheckingInspection\")\n    @Retention(AnnotationRetention.BINARY)\n    @DslMarker\n    internal annotation class ILoveKuriyamaMiraiForever // https://zh.moegirl.org.cn/zh-cn/%E6%A0%97%E5%B1%B1%E6%9C%AA%E6%9D%A5\n}\n\n/**\n * @constructor 推荐使用带名称的参数, 而不要按位置摆放.\n *\n * @see JvmPluginDescription\n */\n// @Serializable // Keep this file in public API files. Might turn to `public` in the future.\ninternal data class SimpleJvmPluginDescription\n@JvmOverloads constructor(\n    override val id: String,\n    override val name: String,\n    override val version: SemVersion,\n    override val author: String = \"\",\n    override val info: String = \"\",\n    override val dependencies: Set<PluginDependency> = setOf(),\n) : JvmPluginDescription {\n\n    @Suppress(\"DEPRECATION_ERROR\")\n    @JvmOverloads\n    constructor(\n        id: String,\n        name: String = id,\n        version: String,\n        author: String = \"\",\n        info: String = \"\",\n        dependencies: Set<PluginDependency> = setOf(),\n    ) : this(id, name, SemVersion(version), author, info, dependencies)\n\n    init {\n        PluginDescription.checkPluginDescription(this)\n    }\n\n    @Serializable // Keep this file in public API files. Might turn to `public` in the future.\n    internal data class SerialData\n    @JvmOverloads constructor(\n        val id: String,\n        val name: String? = null, // workaround to ktx-serialization bug\n        val version: SemVersion,\n        val author: String = \"\",\n        val info: String = \"\",\n        val dependencies: Set<PluginDependency> = setOf(),\n    ) {\n        fun toJvmPluginDescription(): JvmPluginDescription {\n            return SimpleJvmPluginDescription(\n                id,\n                name ?: id,\n                version, author, info, dependencies\n            )\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/plugin/jvm/JvmPluginLoader.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.plugin.jvm\n\nimport kotlinx.coroutines.CoroutineScope\nimport me.him188.kotlin.dynamic.delegation.dynamicDelegation\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport net.mamoe.mirai.console.data.PluginDataStorage\nimport net.mamoe.mirai.console.internal.plugin.BuiltInJvmPluginLoaderImpl\nimport net.mamoe.mirai.console.plugin.loader.FilePluginLoader\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.NotStableForInheritance\n\n/**\n * JVM 插件加载器\n */\n@NotStableForInheritance\npublic interface JvmPluginLoader : CoroutineScope, FilePluginLoader<JvmPlugin, JvmPluginDescription> {\n    /**\n     * \".jar\"\n     */\n    public override val fileSuffix: String\n\n    /**\n     * [AbstractJvmPlugin.reloadPluginData] 默认使用的实例\n     */\n    @ConsoleExperimentalApi\n    public val dataStorage: PluginDataStorage\n\n    /**\n     * [AbstractJvmPlugin.reloadPluginData] 默认使用的实例\n     */\n    @ConsoleExperimentalApi\n    public val configStorage: PluginDataStorage\n\n    /**\n     * @since 2.10\n     */\n    @MiraiInternalApi\n    public val classLoaders: List<ClassLoader>\n\n    @MiraiInternalApi\n    public fun findLoadedClass(name: String): Class<*>?\n\n    public companion object BuiltIn :\n        JvmPluginLoader by (dynamicDelegation {\n            @OptIn(ConsoleFrontEndImplementation::class)\n            MiraiConsoleImplementation.getInstance().jvmPluginLoader\n        }) {\n\n        override fun getPluginDescription(plugin: JvmPlugin): JvmPluginDescription =\n            BuiltInJvmPluginLoaderImpl.run { plugin.description }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/plugin/jvm/KotlinPlugin.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"EXPOSED_SUPER_CLASS\", \"RedundantVisibilityModifier\")\n\npackage net.mamoe.mirai.console.plugin.jvm\n\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\n\n/**\n * Kotlin 插件的父类.\n */\npublic abstract class KotlinPlugin : JvmPlugin, AbstractJvmPlugin {\n    /**\n     * 通过一个指定的 [JvmPluginDescription] 构造插件示例\n     *\n     * 当使用 `plugin.yml` 加载插件示例时不能使用此构造器\n     */\n    @JvmOverloads\n    public constructor(\n        description: JvmPluginDescription,\n        parentCoroutineContext: CoroutineContext = EmptyCoroutineContext,\n    ) : super(description, parentCoroutineContext)\n\n\n    /**\n     * 通过插件内置的 `plugin.yml` 构造插件实例\n     *\n     * @since 2.16.0\n     */\n    @JvmOverloads\n    public constructor(\n        parentCoroutineContext: CoroutineContext = EmptyCoroutineContext,\n    ) : super(parentCoroutineContext)\n\n\n    init {\n        __jpi_try_to_init_dependencies()\n    }\n}\n\n/*\n\npublic object MyPlugin : KotlinPlugin()\n\npublic object AccountPluginData : PluginData by MyPlugin.getPluginData() {\n    public val s by value(1)\n}\n*/"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/plugin/loader/FilePluginLoader.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.plugin.loader\n\nimport net.mamoe.mirai.console.plugin.Plugin\nimport net.mamoe.mirai.console.plugin.PluginManager\nimport net.mamoe.mirai.console.plugin.description.PluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport java.io.File\n\n/**\n * ['/plugins'][PluginManager.pluginsPath] 目录中的插件的加载器. 每个加载器需绑定一个后缀.\n *\n * @see AbstractFilePluginLoader 默认基础实现\n * @see JvmPluginLoader 内建的 Jar (JVM) 插件加载器.\n */\npublic interface FilePluginLoader<P : Plugin, D : PluginDescription> : PluginLoader<P, D> {\n    /**\n     * 所支持的插件文件后缀, 含 '.', 不区分大小写. 如 [JvmPluginLoader] 为 \".jar\"\n     */\n    public val fileSuffix: String\n}\n\n/**\n * [FilePluginLoader] 的默认基础实现.\n *\n * @see FilePluginLoader\n */\npublic abstract class AbstractFilePluginLoader<P : Plugin, D : PluginDescription>(\n    /**\n     * 所支持的插件文件后缀, 含 '.', 不区分大小写. 如 [JvmPluginLoader] 为 \".jar\"\n     */\n    public override val fileSuffix: String,\n) : FilePluginLoader<P, D> {\n    private fun pluginsFilesSequence(): Sequence<File> =\n        PluginManager.pluginsFolder.listFiles().orEmpty().asSequence()\n            .filter { it.isFile && it.name.endsWith(fileSuffix, ignoreCase = true) }\n\n    /**\n     * 读取扫描到的后缀与 [fileSuffix] 相同的文件中的插件实例, 但不 [加载][PluginLoader.load]\n     */\n    protected abstract fun Sequence<File>.extractPlugins(): List<P>\n\n    @NotStableForInheritance // made non-final in 2.11\n    public override fun listPlugins(): List<P> = pluginsFilesSequence().extractPlugins()\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/plugin/loader/PluginLoadException.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.plugin.loader\n\n/**\n * 在加载插件过程中遇到的意料之中的问题.\n *\n * @see PluginLoader.load\n * @see PluginLoader.enable\n * @see PluginLoader.disable\n * @see PluginLoader.getPluginDescription\n */\npublic open class PluginLoadException : RuntimeException {\n    public constructor() : super()\n    public constructor(message: String?) : super(message)\n    public constructor(message: String?, cause: Throwable?) : super(message, cause)\n    public constructor(cause: Throwable?) : super(cause)\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/plugin/loader/PluginLoader.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"INAPPLICABLE_JVM_NAME\", \"NOTHING_TO_INLINE\")\n\npackage net.mamoe.mirai.console.plugin.loader\n\nimport net.mamoe.mirai.console.extensions.PluginLoaderProvider\nimport net.mamoe.mirai.console.plugin.Plugin\nimport net.mamoe.mirai.console.plugin.PluginManager\nimport net.mamoe.mirai.console.plugin.PluginManager.INSTANCE.enablePlugin\nimport net.mamoe.mirai.console.plugin.description.PluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader\n\n/**\n * 插件加载器.\n *\n * 插件加载器只实现寻找插件列表, 加载插件, 启用插件, 关闭插件这四个功能.\n *\n * 一个插件要在何时被加载，依赖如何处理，[PluginLoader] 都无需关心.\n *\n * 有关插件的依赖和已加载的插件列表由 [PluginManager] 维护.\n *\n * ## 内建加载器\n * - [JvmPluginLoader] Jar 插件加载器\n *\n * ## 扩展加载器\n * 插件被允许扩展一个加载器.\n *\n * ### 实现扩展加载器\n * 直接实现接口 [PluginLoader] 或 [FilePluginLoader], 并注册 [PluginLoaderProvider]\n *\n * @see JvmPluginLoader Jar 插件加载器\n * @see PluginLoaderProvider 扩展\n */\npublic interface PluginLoader<P : Plugin, D : PluginDescription> {\n    /**\n     * 扫描并返回可以被加载的插件的列表.\n     *\n     * 这些插件都应处于还未被加载的状态.\n     *\n     * 在 Console 启动时, [PluginManager] 会获取所有 [PluginDescription], 分析依赖关系, 确认插件加载顺序.\n     *\n     * **实现细节:** 此函数*只应该*在 Console 启动时被调用一次. 但取决于前端实现不同, 或由于被一些插件需要, 此函数也可能会被多次调用.\n     */\n    public fun listPlugins(): List<P>\n\n    /**\n     * 获取此插件的描述.\n     *\n     * **实现细节**: 此函数只允许抛出 [PluginLoadException] 作为正常失败原因, 其他任意异常都属于意外错误.\n     *\n     * 若在 Console 启动并加载所有插件的过程中, 本函数抛出异常, 则会放弃此插件的加载, 并影响依赖它的其他插件.\n     *\n     * @throws PluginLoadException 在加载插件遇到意料之中的错误时抛出 (如无法读取插件信息等).\n     *\n     * @see PluginDescription 插件描述\n     */\n    @Throws(PluginLoadException::class)\n    public fun getPluginDescription(plugin: P): D\n\n    /**\n     * 主动加载一个插件 (实例), 但不 [启用][enablePlugin] 它. 返回加载成功的主类实例\n     *\n     * **实现注意**: Console 不会把一个已经启用了的插件再次调用 [load] 或 [enablePlugin], 但不排除意外情况. 实现本函数时应在这种情况时立即抛出异常 [IllegalStateException].\n     *\n     * **实现细节**: 此函数只允许抛出 [PluginLoadException] 作为正常失败原因, 其他任意异常都属于意外错误.\n     * 当异常发生时, 插件将会直接被放弃加载, 并影响依赖它的其他插件.\n     *\n     * @throws PluginLoadException 在加载插件遇到意料之中的错误时抛出 (如找不到主类等).\n     * @throws IllegalStateException 在插件已经被加载时抛出. 这属于意料之外的情况.\n     */\n    @Throws(IllegalStateException::class, PluginLoadException::class)\n    public fun load(plugin: P)\n\n    /**\n     * 主动启用这个插件.\n     *\n     * **实现注意**: Console 不会把一个已经启用了的插件再次调用 [load] 或 [enablePlugin], 但不排除意外情况. 实现本函数时应在这种情况时立即抛出异常 [IllegalStateException].\n     *\n     * **实现细节**: 此函数可抛出 [PluginLoadException] 作为正常失败原因, 其他任意异常都属于意外错误.\n     * 当异常发生时, 插件将会直接被放弃加载, 并影响依赖它的其他插件.\n     *\n     * @throws PluginLoadException 在加载插件遇到意料之中的错误时抛出 (如找不到主类等).\n     * @throws IllegalStateException 在插件已经被加载时抛出. 这属于意料之外的情况.\n     *\n     * @see PluginManager.enablePlugin\n     */\n    @Throws(IllegalStateException::class, PluginLoadException::class)\n    public fun enable(plugin: P)\n\n    /**\n     * 主动禁用这个插件.\n     *\n     * **实现细节**: 此函数可抛出 [PluginLoadException] 作为正常失败原因, 其他任意异常都属于意外错误.\n     * 当异常发生时, 插件将会直接被放弃加载, 并影响依赖它的其他插件.\n     *\n     * @throws PluginLoadException 在加载插件遇到意料之中的错误时抛出 (如找不到主类等).\n     *\n     * @see PluginManager.disablePlugin\n     */\n    @Throws(IllegalStateException::class, PluginLoadException::class)\n    public fun disable(plugin: P)\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/util/Annotations.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"ConsoleUtils\")\n\npackage net.mamoe.mirai.console.util\n\nimport kotlin.annotation.AnnotationTarget.*\n\n/**\n * 表明这个 API 是为了让 Java 使用者调用更方便. Kotlin 使用者不应该使用这些 API.\n */\n@RequiresOptIn(level = RequiresOptIn.Level.ERROR)\n@Target(PROPERTY, FUNCTION, CLASS)\ninternal annotation class JavaFriendlyApi\n\n/**\n * 标记为一个仅供 mirai-console 内部使用的 API.\n *\n * 这些 API 可能会在任意时刻更改, 且不会发布任何预警.\n * 非常不建议在发行版本中使用这些 API.\n */\n@Retention(AnnotationRetention.BINARY)\n@RequiresOptIn(level = RequiresOptIn.Level.ERROR)\n@Target(CLASS, TYPEALIAS, FUNCTION, PROPERTY, FIELD, CONSTRUCTOR, CLASS, FUNCTION, PROPERTY)\n@MustBeDocumented\npublic annotation class ConsoleInternalApi(\n    val message: String = \"\",\n)\n\n/**\n * 标记一个实验性的 API.\n *\n * 这些 API 不具有稳定性, 且可能会在任意时刻更改.\n * 不建议在发行版本中使用这些 API.\n */\n@Retention(AnnotationRetention.BINARY)\n@RequiresOptIn(level = RequiresOptIn.Level.WARNING)\n@Target(CLASS, TYPEALIAS, FUNCTION, PROPERTY, FIELD, CONSTRUCTOR)\n@MustBeDocumented\npublic annotation class ConsoleExperimentalApi(\n    val message: String = \"\",\n)"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/util/AnsiMessageBuilder.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n@file:Suppress(\"unused\", \"MemberVisibilityCanBePrivate\", \"FunctionName\")\n\npackage net.mamoe.mirai.console.util\n\nimport net.mamoe.mirai.console.command.CommandSender\nimport net.mamoe.mirai.console.command.SystemCommandSender\nimport net.mamoe.mirai.console.util.AnsiMessageBuilder.Companion.asAnsiMessageBuilder\nimport net.mamoe.mirai.console.util.AnsiMessageBuilder.Companion.dropAnsi\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.message.MessageReceipt\nimport java.io.Serializable\n\n/**\n * @see buildAnsiMessage\n * @see sendAnsiMessage\n * @see AnsiMessageBuilder\n * @see AnsiMessageBuilder.create\n * @see asAnsiMessageBuilder\n * @since 1.1\n */\npublic open class AnsiMessageBuilder public constructor(\n    public val delegate: StringBuilder,\n) : Appendable, Serializable {\n    override fun toString(): String = delegate.toString()\n\n    /**\n     * 同 [append] 方法, 在 `noAnsi=true` 的时候会忽略此函数的调用\n     *\n     * 参考资料:\n     * - [ANSI转义序列](https://zh.wikipedia.org/wiki/ANSI%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97)\n     * - [ANSI转义序列#颜色](https://zh.wikipedia.org/wiki/ANSI%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97#%E9%A2%9C%E8%89%B2)\n     *\n     * @param code Ansi 操作码\n     *\n     * @see asAnsiMessageBuilder\n     * @see create\n     */\n    public open fun ansi(code: String): AnsiMessageBuilder = append(code)\n\n    public open fun reset(): AnsiMessageBuilder = append(Color.RESET)\n    public open fun white(): AnsiMessageBuilder = append(Color.WHITE)\n    public open fun red(): AnsiMessageBuilder = append(Color.RED)\n    public open fun emeraldGreen(): AnsiMessageBuilder = append(Color.EMERALD_GREEN)\n    public open fun gold(): AnsiMessageBuilder = append(Color.GOLD)\n    public open fun blue(): AnsiMessageBuilder = append(Color.BLUE)\n    public open fun purple(): AnsiMessageBuilder = append(Color.PURPLE)\n    public open fun green(): AnsiMessageBuilder = append(Color.GREEN)\n    public open fun gray(): AnsiMessageBuilder = append(Color.GRAY)\n    public open fun lightRed(): AnsiMessageBuilder = append(Color.LIGHT_RED)\n    public open fun lightGreen(): AnsiMessageBuilder = append(Color.LIGHT_GREEN)\n    public open fun lightYellow(): AnsiMessageBuilder = append(Color.LIGHT_YELLOW)\n    public open fun lightBlue(): AnsiMessageBuilder = append(Color.LIGHT_BLUE)\n    public open fun lightPurple(): AnsiMessageBuilder = append(Color.LIGHT_PURPLE)\n    public open fun lightCyan(): AnsiMessageBuilder = append(Color.LIGHT_CYAN)\n\n    public companion object {\n        /**\n         * 从 [String] 中剔除 ansi 控制符\n         */\n        @JvmStatic\n        public fun String.dropAnsi(): String = this\n            .replace(DROP_CSI_PATTERN, \"\") // 先进行 CSI 剔除后进行 ANSI 剔除\n            .replace(DROP_ANSI_PATTERN, \"\")\n\n        /**\n         * 使用 [this] 封装一个 [AnsiMessageBuilder]\n         *\n         * @param noAnsi 为 `true` 时忽略全部与 ansi 有关的方法的调用\n         */\n        @JvmStatic\n        @JvmOverloads\n        @JvmName(\"from\")\n        public fun StringBuilder.asAnsiMessageBuilder(noAnsi: Boolean = false): AnsiMessageBuilder =\n            if (noAnsi) NoAnsiMessageBuilder(this) else AnsiMessageBuilder(this)\n\n        /**\n         * @param capacity [StringBuilder] 的初始化大小\n         *\n         * @param noAnsi 为 `true` 时忽略全部与 ansi 有关的方法的调用\n         * @see AnsiMessageBuilder\n         */\n        @JvmStatic\n        @JvmOverloads\n        public fun create(\n            capacity: Int = 16,\n            noAnsi: Boolean = false,\n        ): AnsiMessageBuilder = StringBuilder(capacity).asAnsiMessageBuilder(noAnsi)\n\n        /**\n         * 判断 [sender] 是否支持带 ansi 控制符的正确显示\n         */\n        @JvmStatic\n        public fun isAnsiSupported(sender: CommandSender): Boolean =\n            if (sender is SystemCommandSender) {\n                sender.isAnsiSupported\n            } else false\n\n        /**\n         * 往 [StringBuilder] 追加 ansi 控制符\n         */\n        public inline fun StringBuilder.appendAnsi(\n            action: AnsiMessageBuilder.() -> Unit,\n        ): AnsiMessageBuilder = this.asAnsiMessageBuilder().apply(action)\n    }\n\n    override fun hashCode(): Int = this.delegate.hashCode()\n    override fun equals(other: Any?): Boolean {\n        if (other == null) return false\n        if (other::class.java != this::class.java) return false\n        other as AnsiMessageBuilder\n        return other.delegate == this.delegate\n    }\n\n    /////////////////////////////////////////////////////////////////////////////////\n    override fun append(c: Char): AnsiMessageBuilder = apply { delegate.append(c) }\n    override fun append(csq: CharSequence?): AnsiMessageBuilder = apply { delegate.append(csq) }\n    override fun append(csq: CharSequence?, start: Int, end: Int): AnsiMessageBuilder =\n        apply { delegate.append(csq, start, end) }\n\n    public fun append(any: Any?): AnsiMessageBuilder = apply { delegate.append(any) }\n    public fun append(value: String): AnsiMessageBuilder = apply { delegate.append(value) }\n    public fun append(value: String, start: Int, end: Int): AnsiMessageBuilder =\n        apply { delegate.append(value, start, end) }\n\n    public fun append(value: Boolean): AnsiMessageBuilder = apply { delegate.append(value) }\n    public fun append(value: Float): AnsiMessageBuilder = apply { delegate.append(value) }\n    public fun append(value: Double): AnsiMessageBuilder = apply { delegate.append(value) }\n    public fun append(value: Int): AnsiMessageBuilder = apply { delegate.append(value) }\n    public fun append(value: Long): AnsiMessageBuilder = apply { delegate.append(value) }\n    public fun append(value: Short): AnsiMessageBuilder = apply { delegate.append(value) }\n    /////////////////////////////////////////////////////////////////////////////////\n}\n\n/**\n * @param capacity [StringBuilder] 初始化大小\n * @see AnsiMessageBuilder.create\n * @since 1.1\n */\n@JvmSynthetic\npublic fun AnsiMessageBuilder(capacity: Int = 16): AnsiMessageBuilder = AnsiMessageBuilder(StringBuilder(capacity))\n\n/**\n * 构建一条 ANSI 信息\n *\n * @see AnsiMessageBuilder\n * @since 1.1\n */\n@JvmSynthetic\npublic inline fun buildAnsiMessage(\n    capacity: Int = 16,\n    action: AnsiMessageBuilder.() -> Unit,\n): String = AnsiMessageBuilder.create(capacity, false).apply(action).toString()\n\n// 不在 top-level 使用者会得到 Internal error: Couldn't inline sendAnsiMessage\n\n/**\n * 向 [CommandSender] 发送一条带有 ANSI 控制符的信息\n *\n * @see AnsiMessageBuilder\n * @since 1.1\n */\n@JvmSynthetic\npublic suspend inline fun CommandSender.sendAnsiMessage(\n    capacity: Int = 16,\n    builder: AnsiMessageBuilder.() -> Unit,\n): MessageReceipt<Contact>? {\n    return sendMessage(\n        AnsiMessageBuilder.create(capacity, noAnsi = !AnsiMessageBuilder.isAnsiSupported(this))\n            .apply(builder)\n            .toString()\n    )\n}\n\n/**\n * 向 [CommandSender] 发送一条带有 ANSI 控制符的信息\n *\n * @see AnsiMessageBuilder.Companion.dropAnsi\n * @since 1.1\n */\n@JvmSynthetic\npublic suspend inline fun CommandSender.sendAnsiMessage(message: String): MessageReceipt<Contact>? {\n    return sendMessage(\n        if (AnsiMessageBuilder.isAnsiSupported(this)) message\n        else message.dropAnsi()\n    )\n}\n\n\n// internals\n\n\n// CSI序列由ESC [、若干个（包括0个）“参数字节”、若干个“中间字节”，以及一个“最终字节”组成。各部分的字符范围如下：\n//\n// CSI序列在ESC [之后各个组成部分的字符范围[12]:5.4\n// 组成部分\t字符范围\tASCII\n// 参数字节\t0x30–0x3F\t0–9:;<=>?\n// 中间字节\t0x20–0x2F\t空格、!\"#$%&'()*+,-./\n// 最终字节\t0x40–0x7E\t@A–Z[\\]^_`a–z{|}~\n//\n// @see https://zh.wikipedia.org/wiki/ANSI%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97#CSI%E5%BA%8F%E5%88%97\n@Suppress(\"RegExpRedundantEscape\")\nprivate val DROP_CSI_PATTERN = \"\"\"\\u001b\\[([\\u0030-\\u003F])*?([\\u0020-\\u002F])*?[\\u0040-\\u007E]\"\"\".toRegex()\n\n// 序列具有不同的长度。所有序列都以ASCII字符ESC（27 / 十六进制 0x1B）开头，\n// 第二个字节则是0x40–0x5F（ASCII @A–Z[\\]^_）范围内的字符。[12]:5.3.a\n//\n// 标准规定，在8位环境中，这两个字节的序列可以合并为0x80-0x9F范围内的单个字节（详情请参阅C1控制字符集）。\n// 但是，在现代设备上，这些代码通常用于其他目的，例如UTF-8的一部分或CP-1252字符，因此并不使用这种合并的方式。\n//\n// 除ESC之外的其他C0代码（通常是BEL，BS，CR，LF，FF，TAB，VT，SO和SI）在输出时也可能会产生与某些控制序列相似或相同的效果。\n//\n// @see https://zh.wikipedia.org/wiki/ANSI%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97#%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97\n//\n// 注: 缺少详细资料, 只能认定 ansi 长度固定为二字节 (CSI除外)\nprivate val DROP_ANSI_PATTERN = \"\"\"\\u001b[\\u0040–\\u005F]\"\"\".toRegex()\n\nprivate object Color {\n    const val RESET = \"\\u001b[0m\"\n    const val WHITE = \"\\u001b[97m\"\n    const val RED = \"\\u001b[31m\"\n    const val EMERALD_GREEN = \"\\u001b[32m\"\n    const val GOLD = \"\\u001b[33m\"\n    const val BLUE = \"\\u001b[34m\"\n    const val PURPLE = \"\\u001b[35m\"\n    const val GREEN = \"\\u001b[36m\"\n    const val GRAY = \"\\u001b[90m\"\n    const val LIGHT_RED = \"\\u001b[91m\"\n    const val LIGHT_GREEN = \"\\u001b[92m\"\n    const val LIGHT_YELLOW = \"\\u001b[93m\"\n    const val LIGHT_BLUE = \"\\u001b[94m\"\n    const val LIGHT_PURPLE = \"\\u001b[95m\"\n    const val LIGHT_CYAN = \"\\u001b[96m\"\n}\n\nprivate class NoAnsiMessageBuilder(builder: StringBuilder) : AnsiMessageBuilder(builder) {\n    override fun reset(): AnsiMessageBuilder = this\n    override fun white(): AnsiMessageBuilder = this\n    override fun red(): AnsiMessageBuilder = this\n    override fun emeraldGreen(): AnsiMessageBuilder = this\n    override fun gold(): AnsiMessageBuilder = this\n    override fun blue(): AnsiMessageBuilder = this\n    override fun purple(): AnsiMessageBuilder = this\n    override fun green(): AnsiMessageBuilder = this\n    override fun gray(): AnsiMessageBuilder = this\n    override fun lightRed(): AnsiMessageBuilder = this\n    override fun lightGreen(): AnsiMessageBuilder = this\n    override fun lightYellow(): AnsiMessageBuilder = this\n    override fun lightBlue(): AnsiMessageBuilder = this\n    override fun lightPurple(): AnsiMessageBuilder = this\n    override fun lightCyan(): AnsiMessageBuilder = this\n    override fun ansi(code: String): AnsiMessageBuilder = this\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/util/ConsoleInput.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:Suppress(\"INAPPLICABLE_JVM_NAME\", \"unused\")\n@file:JvmMultifileClass\n@file:JvmName(\"ConsoleUtils\")\n\npackage net.mamoe.mirai.console.util\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.internal.util.ConsoleInputImpl\n\n/**\n * Console 输入. 由于 console 接管了 [标准输入][System. in], [readLine] 等操作需要在这里进行.\n */\npublic interface ConsoleInput {\n    /**\n     * 挂起当前协程, 以 [提示][hint] 向用户索要一个输入, 在用户完成输入时返回输入结果.\n     */\n    @JvmBlockingBridge\n    public suspend fun requestInput(hint: String): String\n\n    public companion object INSTANCE : ConsoleInput by ConsoleInputImpl\n}\n\n// don't move into INSTANCE, Compilation error\n@JvmSynthetic\npublic suspend inline fun MiraiConsole.requestInput(hint: String): String = ConsoleInput.requestInput(hint)"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/util/ContactUtils.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.util\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.console.internal.data.qualifiedNameOrTip\nimport net.mamoe.mirai.contact.*\n\n/**\n * 为简化操作提供的一些工具\n */\n@ConsoleExperimentalApi\npublic object ContactUtils {\n    /**\n     * 获取一个 [Bot] 的好友, 群, 或群员.\n     *\n     * 访问顺序为 [Bot.friends] -> [Bot.groups] -> 各群的群员\n     *\n     * **注意**: 若目标用户存在于多个群, 可能返回任意一个群的 [Member].\n     *\n     * @see includeMembers 为 `false` 时不查找群成员\n     */\n    @JvmOverloads\n    @JvmStatic\n    @ConsoleExperimentalApi\n    public fun Bot.getContact(id: Long, includeMembers: Boolean = true): Contact {\n        return getContactOrNull(id, includeMembers)\n            ?: throw NoSuchElementException(\"Contact $id not found for bot ${this.id}\")\n    }\n\n    /**\n     * 获取一个 [Bot] 的好友, 群, 或群员.\n     *\n     * 访问顺序为 [Bot.friends] -> [Bot.groups] -> 各群的群员\n     */\n    @JvmOverloads\n    @JvmStatic\n    @ConsoleExperimentalApi\n    public fun Bot.getContactOrNull(id: Long, includeMembers: Boolean = true): Contact? {\n        return getFriendOrGroupOrNull(id) ?: kotlin.run {\n            if (includeMembers) {\n                groups.asSequence().flatMap { it.members.asSequence() }.firstOrNull { it.id == id }\n            } else null\n        }\n    }\n\n\n    /**\n     * 获取一个 [Bot] 的好友, 或群对象.\n     *\n     * 访问顺序为 [Bot.friends] -> [Bot.groups]\n     */\n    @JvmStatic\n    @ConsoleExperimentalApi\n    public fun Bot.getFriendOrGroup(id: Long): Contact {\n        return getFriendOrGroupOrNull(id)\n            ?: throw NoSuchElementException(\"Friend or Group $id not found for bot ${this.id}\")\n    }\n\n    /**\n     * 获取一个 [Bot] 的好友, 或群对象.\n     *\n     * 访问顺序为 [Bot.friends] -> [Bot.groups]\n     */\n    @JvmStatic\n    @ConsoleExperimentalApi\n    public fun Bot.getFriendOrGroupOrNull(id: Long): Contact? {\n        return this.friends[id] ?: this.groups[id]\n    }\n\n    /**\n     * 将 [ContactOrBot] 输出为字符串表示.\n     */\n    @JvmName(\"renderContactOrName\")\n    @JvmStatic\n    public fun ContactOrBot.render(): String {\n        return when (this) {\n            is Bot -> \"Bot $nick($id)\"\n            is Group -> \"Group $name($id)\"\n            is Friend -> \"Friend $nick($id)\"\n            is Member -> \"Member $nameCardOrNick(${group.id}.$id)\"\n            is Stranger -> \"Stranger $nick($id)\"\n            else -> error(\"Illegal type for ContactOrBot: ${this::class.qualifiedNameOrTip}\")\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/util/CoroutineScopeUtils.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.util\n\nimport kotlinx.atomicfu.atomic\nimport kotlinx.atomicfu.loop\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.console.internal.util.runIgnoreException\nimport net.mamoe.mirai.utils.currentTimeMillis\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\n\n/**\n * Runs `action` every `intervalMillis` since each time [setChanged] is called, ignoring subsequent calls during the interval.\n */\ninternal class TimedTask(\n    scope: CoroutineScope,\n    coroutineContext: CoroutineContext = EmptyCoroutineContext,\n    intervalMillis: Long,\n    action: suspend CoroutineScope.() -> Unit,\n) {\n    companion object {\n        private const val UNCHANGED = 0L\n    }\n\n    private val lastChangedTime = atomic(UNCHANGED)\n\n    fun setChanged() {\n        lastChangedTime.value = currentTimeMillis()\n    }\n\n    val job: Job = scope.launch(coroutineContext) {\n        // `delay` always checks for cancellation\n        lastChangedTime.loop { last ->\n            val current = currentTimeMillis()\n            if (last == UNCHANGED) {\n                runIgnoreException<CancellationException> {\n                    delay(3000) // accuracy not necessary\n                } ?: return@launch\n            } else {\n                if (current - last > intervalMillis) {\n                    if (!lastChangedTime.compareAndSet(last, UNCHANGED)) return@loop\n                    action()\n                }\n                runIgnoreException<CancellationException> {\n                    delay(3000) // accuracy not necessary\n                } ?: return@launch\n            }\n        }\n    }\n}\n\ninternal fun CoroutineScope.launchTimedTask(\n    intervalMillis: Long,\n    coroutineContext: CoroutineContext = EmptyCoroutineContext,\n    action: suspend CoroutineScope.() -> Unit,\n) = TimedTask(this, coroutineContext, intervalMillis, action)\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/util/MemoryFormat.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.util\n\nimport kotlin.math.floor\n\n\nprivate const val MEM_B = 1024L\nprivate const val MEM_KB = 1024L shl 10\nprivate const val MEM_MB = 1024L shl 20\nprivate const val MEM_GB = 1024L shl 30\n\n@Suppress(\"NOTHING_TO_INLINE\")\nprivate inline fun StringBuilder.appendDouble(number: Double): StringBuilder =\n    append(floor(number * 100) / 100)\n\ninternal fun renderMemoryUsageNumber(num: Long) = buildString {\n    renderMemoryUsageNumber(this, num)\n}\n\ninternal fun renderMemoryUsageNumber(builder: StringBuilder, num: Long) {\n    when {\n        num == -1L -> {\n            builder.append(num)\n        }\n        num < MEM_B -> {\n            builder.append(num).append(\"B\")\n        }\n        num < MEM_KB -> {\n            builder.appendDouble(num / 1024.0).append(\"KB\")\n        }\n        num < MEM_MB -> {\n            builder.appendDouble((num ushr 10) / 1024.0).append(\"MB\")\n        }\n        else -> {\n            builder.appendDouble((num ushr 20) / 1024.0).append(\"GB\")\n        }\n    }\n}\n\nprivate var emptyLine = \"    \".repeat(10)\ninternal fun Appendable.emptyLine(size: Int) {\n    if (emptyLine.length <= size) {\n        emptyLine = String(CharArray(size) { ' ' })\n    }\n    append(emptyLine, 0, size)\n}\n\ninternal inline fun AnsiMessageBuilder.renderMUNum(size: Int, contentLength: Int, code: () -> Unit) {\n    val s = size - contentLength\n    val left = s / 2\n    val right = s - left\n    emptyLine(left)\n    code()\n    emptyLine(right)\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/util/MessageScope.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\n    \"NOTHING_TO_INLINE\", \"INAPPLICABLE_JVM_NAME\", \"FunctionName\", \"SuspendFunctionOnCoroutineScope\",\n    \"unused\", \"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\"\n)\n\npackage net.mamoe.mirai.console.util\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.firstOrNull\nimport kotlinx.coroutines.flow.fold\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.console.command.CommandSender\nimport net.mamoe.mirai.console.command.SystemCommandSender\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.contact.User\nimport net.mamoe.mirai.message.data.Message\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.internal.LowPriorityInOverloadResolution\n\n/**\n * 表示几个消息对象的 '域', 即消息对象的集合. 用于最小化将同一条消息发送给多个类型不同的目标的付出.\n *\n * ## 支持的消息对象类型\n * [Contact], [CommandSender], [MessageScope] (递归).\n *\n * 在下文, `A` 或 `B` 指代这三种类型的其中两种, 允许排列组合. 如 `A.scopeWith(B)` 可能表示 `Contact.scopeWith(MessageScope)`.\n *\n * ## 获得 [MessageScope]\n * - `A.asMessageScope()`.\n * - `C<A>.toMessageScope()`. 其中 `C` 表示 `Iterable`, `Sequence`, `Flow`, `Array` 其中任一.\n *\n * ## 连接 [MessageScope]\n * - `A?.scopeWith(vararg B?)`.\n * - `A?.scopeWith(vararg A?)`.\n *\n * `null` 项将会被过滤.\n *\n * ## 自动去重\n * 在连接时, [MessageScope] 会自动根据真实的 [收信对象][CommandSender.subject] 去重.\n *\n * 如 `member.asCommandSender().scopeWith(member.group)`,\n * 返回的 [MessageScope] 实际上只包含 `member.group`. 因为 `member.asCommandSender()` 的最终收信对象就是 `member.group`.\n *\n * 因此在使用 [scopeWith] 时, 无需考虑重复性, 只需要把希望发送的目标全部列入.\n *\n * ## 使用 [MessageScope]\n * 在 `scopeWith` 或 `scopeWithNotNull` 后加 `lambda` 参数即可表示使用 [MessageScope].\n * 如:\n * ```\n * A.scopeWith(B) { // this: MessageScope\n *     sendMessage(...)\n * }\n * ```\n *\n * ## 典例\n * 在处理指令时, 目标群对象可能与发件人群对象不同, 如用户在 A 群发指令, 以禁言 B 群的成员.\n * 此时机器人可能需要同时广播通知到 A 群和 B 群.\n *\n * 由于 [CommandSender] 与 [Contact] 无公共接口, 无法使用 [listOfNotNull] 遍历处理. [MessageScope] 就是设计为解决这样的问题.\n *\n * *Kotlin*\n * ```\n * // 在一个 SimpleCommand 内\n * @Handler\n * suspend fun CommandSender.handle(target: Member) {\n *     val duration = Random.nextInt(1, 15)\n *     target.mute(duration)\n *\n *\n *     // 不使用 MessageScope\n *     val thisGroup = this.getGroupOrNull()\n *     val message = \"${this.name} 禁言 ${target.nameCardOrNick} $duration 秒\"\n *     if (target.group != thisGroup) {\n *         target.group.sendMessage(message)\n *     }\n *     sendMessage(message)\n *\n *\n *     // 使用 MessageScope\n *     // 表示至少发送给 `this`, 当 `this` 的真实发信对象与 `target.group` 不同时, 还额外发送给 `target.group`\n *     this.scopeWith(target.group) {\n *         sendMessage(\"${name} 禁言了 ${target.nameCardOrNick} $duration 秒\")\n *     }\n *\n *\n *     // 同样地, 可以扩展用法, 同时私聊指令执行者:\n *     // this.scopeWith(\n *     //    target,\n *     //    target.group\n *     // ) { ... }\n * }\n * ```\n *\n * *Java*\n * ```java\n * // 在一个 SimpleCommand 内\n * @Handler\n * public void handle(sender: CommandSender, target: Member) {\n *     int duration = Random.nextInt(1, 15);\n *     target.mute(duration);\n *\n *\n *     // 不使用 MessageScope\n *     Group thisGroup = this.getGroupOrNull();\n *     String message = \"${this.name} 禁言 ${target.nameCardOrNick} $duration 秒\";\n *     if (!target.group.equals(thisGroup)) {\n *         target.group.sendMessage(message);\n *     }\n *     sender.sendMessage(message);\n *\n *\n *     // 使用 MessageScope\n *     // 表示至少发送给 `this`, 当 `this` 的真实发信对象与 `target.group` 不同时, 还额外发送给 `target.group`\n *     MessageScope scope = MessageScopeKt.scopeWith(sender, target);\n *     scope.sendMessage(\"${name} 禁言了 ${target.nameCardOrNick} $duration 秒\");\n *\n *     // 或是只用一行：\n *     MessageScopeKt.scopeWith(sender, target).sendMessage(\"${name} 禁言了 ${target.nameCardOrNick} $duration 秒\");\n * }\n * ```\n */\npublic sealed interface MessageScope {\n    /**\n     * 如果此 [MessageScope] 仅包含一个消息对象, 则 [realTarget] 指向这个对象. 否则 [realTarget] 为 `null`.\n     *\n     * 对于 [CommandSender] 作为 [MessageScope], [realTarget] 总是指令执行者 [User], 即 [CommandSender.user]\n     *\n     * [realTarget] 用于 [MessageScope.invoke] 时的去重.\n     *\n     * @suppress 此 API 不稳定, 可能在任何时间被修改\n     */\n    @ConsoleExperimentalApi\n    public val realTarget: Any?\n\n    /**\n     * 立刻以此发送消息给所有在此 [MessageScope] 下的消息对象\n     */\n    @JvmBlockingBridge\n    public suspend fun sendMessage(message: Message)\n\n    /**\n     * 立刻以此发送消息给所有在此 [MessageScope] 下的消息对象\n     */\n    @JvmBlockingBridge\n    public suspend fun sendMessage(message: String)\n}\n\n/**\n * 使用 [MessageScope] 里的所有消息对象. 与 [kotlin.run] 相同.\n */\n@JvmSynthetic\npublic inline operator fun <R, MS : MessageScope> MS.invoke(action: MS.() -> R): R = this.action()\n\n///////////////////////////////////////////////////////////////////////////\n// Builders\n///////////////////////////////////////////////////////////////////////////\n\n/*\n * 实现提示: 以下所有代码都通过 codegen 模块中 net.mamoe.mirai.console.codegen.MessageScopeCodegen 生成. 请不要手动修改它们.\n *\n * 建议阅读 [MessageScope] 的文档.\n */\n\n//// region MessageScopeBuilders CODEGEN ////\n\npublic fun Contact.asMessageScope(): MessageScope = createScopeDelegate(this)\n\npublic fun CommandSender.asMessageScope(): MessageScope = createScopeDelegate(this)\n\n@LowPriorityInOverloadResolution\npublic fun Contact?.scopeWith(vararg others: Contact?): MessageScope {\n    return others.fold(this.asMessageScopeOrNoop()) { acc, other -> acc.scopeWith(other?.asMessageScope()) }\n}\n\n@LowPriorityInOverloadResolution\npublic fun Contact?.scopeWith(vararg others: CommandSender?): MessageScope {\n    return others.fold(this.asMessageScopeOrNoop()) { acc, other -> acc.scopeWith(other?.asMessageScope()) }\n}\n\n@LowPriorityInOverloadResolution\npublic fun Contact?.scopeWith(vararg others: MessageScope?): MessageScope {\n    return others.fold(this.asMessageScopeOrNoop()) { acc, other -> acc.scopeWith(other?.asMessageScope()) }\n}\n\n@LowPriorityInOverloadResolution\npublic fun CommandSender?.scopeWith(vararg others: Contact?): MessageScope {\n    return others.fold(this.asMessageScopeOrNoop()) { acc, other -> acc.scopeWith(other?.asMessageScope()) }\n}\n\n@LowPriorityInOverloadResolution\npublic fun CommandSender?.scopeWith(vararg others: CommandSender?): MessageScope {\n    return others.fold(this.asMessageScopeOrNoop()) { acc, other -> acc.scopeWith(other?.asMessageScope()) }\n}\n\n@LowPriorityInOverloadResolution\npublic fun CommandSender?.scopeWith(vararg others: MessageScope?): MessageScope {\n    return others.fold(this.asMessageScopeOrNoop()) { acc, other -> acc.scopeWith(other?.asMessageScope()) }\n}\n\n@LowPriorityInOverloadResolution\npublic fun MessageScope?.scopeWith(vararg others: Contact?): MessageScope {\n    return others.fold(this.asMessageScopeOrNoop()) { acc, other -> acc.scopeWith(other?.asMessageScope()) }\n}\n\n@LowPriorityInOverloadResolution\npublic fun MessageScope?.scopeWith(vararg others: CommandSender?): MessageScope {\n    return others.fold(this.asMessageScopeOrNoop()) { acc, other -> acc.scopeWith(other?.asMessageScope()) }\n}\n\n@LowPriorityInOverloadResolution\npublic fun MessageScope?.scopeWith(vararg others: MessageScope?): MessageScope {\n    return others.fold(this.asMessageScopeOrNoop()) { acc, other -> acc.scopeWith(other?.asMessageScope()) }\n}\n\npublic fun Contact?.scopeWith(other: Contact?): MessageScope {\n    @Suppress(\"DuplicatedCode\")\n    return when {\n        this == null && other == null -> NoopMessageScope\n        this == null && other != null -> other.asMessageScope()\n        this != null && other == null -> this.asMessageScope()\n        this != null && other != null -> CombinedScope(asMessageScope(), other.asMessageScope())\n        else -> null!!\n    }\n}\n\npublic fun Contact?.scopeWith(other: CommandSender?): MessageScope {\n    @Suppress(\"DuplicatedCode\")\n    return when {\n        this == null && other == null -> NoopMessageScope\n        this == null && other != null -> other.asMessageScope()\n        this != null && other == null -> this.asMessageScope()\n        this != null && other != null -> CombinedScope(asMessageScope(), other.asMessageScope())\n        else -> null!!\n    }\n}\n\npublic fun Contact?.scopeWith(other: MessageScope?): MessageScope {\n    @Suppress(\"DuplicatedCode\")\n    return when {\n        this == null && other == null -> NoopMessageScope\n        this == null && other != null -> other.asMessageScope()\n        this != null && other == null -> this.asMessageScope()\n        this != null && other != null -> CombinedScope(asMessageScope(), other.asMessageScope())\n        else -> null!!\n    }\n}\n\npublic fun CommandSender?.scopeWith(other: Contact?): MessageScope {\n    @Suppress(\"DuplicatedCode\")\n    return when {\n        this == null && other == null -> NoopMessageScope\n        this == null && other != null -> other.asMessageScope()\n        this != null && other == null -> this.asMessageScope()\n        this != null && other != null -> CombinedScope(asMessageScope(), other.asMessageScope())\n        else -> null!!\n    }\n}\n\npublic fun CommandSender?.scopeWith(other: CommandSender?): MessageScope {\n    @Suppress(\"DuplicatedCode\")\n    return when {\n        this == null && other == null -> NoopMessageScope\n        this == null && other != null -> other.asMessageScope()\n        this != null && other == null -> this.asMessageScope()\n        this != null && other != null -> CombinedScope(asMessageScope(), other.asMessageScope())\n        else -> null!!\n    }\n}\n\npublic fun CommandSender?.scopeWith(other: MessageScope?): MessageScope {\n    @Suppress(\"DuplicatedCode\")\n    return when {\n        this == null && other == null -> NoopMessageScope\n        this == null && other != null -> other.asMessageScope()\n        this != null && other == null -> this.asMessageScope()\n        this != null && other != null -> CombinedScope(asMessageScope(), other.asMessageScope())\n        else -> null!!\n    }\n}\n\npublic fun MessageScope?.scopeWith(other: Contact?): MessageScope {\n    @Suppress(\"DuplicatedCode\")\n    return when {\n        this == null && other == null -> NoopMessageScope\n        this == null && other != null -> other.asMessageScope()\n        this != null && other == null -> this.asMessageScope()\n        this != null && other != null -> CombinedScope(asMessageScope(), other.asMessageScope())\n        else -> null!!\n    }\n}\n\npublic fun MessageScope?.scopeWith(other: CommandSender?): MessageScope {\n    @Suppress(\"DuplicatedCode\")\n    return when {\n        this == null && other == null -> NoopMessageScope\n        this == null && other != null -> other.asMessageScope()\n        this != null && other == null -> this.asMessageScope()\n        this != null && other != null -> CombinedScope(asMessageScope(), other.asMessageScope())\n        else -> null!!\n    }\n}\n\npublic fun MessageScope?.scopeWith(other: MessageScope?): MessageScope {\n    @Suppress(\"DuplicatedCode\")\n    return when {\n        this == null && other == null -> NoopMessageScope\n        this == null && other != null -> other.asMessageScope()\n        this != null && other == null -> this.asMessageScope()\n        this != null && other != null -> CombinedScope(asMessageScope(), other.asMessageScope())\n        else -> null!!\n    }\n}\n\npublic inline fun <R> Contact?.scopeWith(vararg others: Contact?, action: MessageScope.() -> R): R {\n    contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }\n    return scopeWith(*others).invoke(action)\n}\n\npublic inline fun <R> Contact?.scopeWith(vararg others: CommandSender?, action: MessageScope.() -> R): R {\n    contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }\n    return scopeWith(*others).invoke(action)\n}\n\npublic inline fun <R> Contact?.scopeWith(vararg others: MessageScope?, action: MessageScope.() -> R): R {\n    contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }\n    return scopeWith(*others).invoke(action)\n}\n\npublic inline fun <R> CommandSender?.scopeWith(vararg others: Contact?, action: MessageScope.() -> R): R {\n    contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }\n    return scopeWith(*others).invoke(action)\n}\n\npublic inline fun <R> CommandSender?.scopeWith(vararg others: CommandSender?, action: MessageScope.() -> R): R {\n    contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }\n    return scopeWith(*others).invoke(action)\n}\n\npublic inline fun <R> CommandSender?.scopeWith(vararg others: MessageScope?, action: MessageScope.() -> R): R {\n    contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }\n    return scopeWith(*others).invoke(action)\n}\n\npublic inline fun <R> MessageScope?.scopeWith(vararg others: Contact?, action: MessageScope.() -> R): R {\n    contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }\n    return scopeWith(*others).invoke(action)\n}\n\npublic inline fun <R> MessageScope?.scopeWith(vararg others: CommandSender?, action: MessageScope.() -> R): R {\n    contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }\n    return scopeWith(*others).invoke(action)\n}\n\npublic inline fun <R> MessageScope?.scopeWith(vararg others: MessageScope?, action: MessageScope.() -> R): R {\n    contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }\n    return scopeWith(*others).invoke(action)\n}\n\n@Deprecated(\n    \"Senseless scopeWith. Use asMessageScope.\",\n    ReplaceWith(\"this.asMessageScope()\", \"net.mamoe.mirai.console.util.asMessageScope\")\n) // diagnostic deprecation\npublic inline fun Contact.scopeWith(): MessageScope = asMessageScope()\n\n@Deprecated(\n    \"Senseless scopeWith. Use asMessageScope.\",\n    ReplaceWith(\"this.asMessageScope()\", \"net.mamoe.mirai.console.util.asMessageScope\")\n) // diagnostic deprecation\npublic inline fun CommandSender.scopeWith(): MessageScope = asMessageScope()\n\n@Deprecated(\n    \"Senseless scopeWith. Use asMessageScope.\",\n    ReplaceWith(\"this.asMessageScope()\", \"net.mamoe.mirai.console.util.asMessageScope\")\n) // diagnostic deprecation\npublic inline fun MessageScope.scopeWith(): MessageScope = asMessageScope()\n\n@Deprecated(\n    \"Senseless scopeWith. Use .asMessageScope().invoke.\",\n    ReplaceWith(\n        \"this.asMessageScope()(action)\",\n        \"net.mamoe.mirai.console.util.asMessageScope\",\n        \"net.mamoe.mirai.console.util.invoke\",\n    )\n) // diagnostic deprecation\npublic inline fun <R> Contact.scopeWith(action: MessageScope.() -> R): R {\n    contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }\n    return asMessageScope()(action)\n}\n\n@Deprecated(\n    \"Senseless scopeWith. Use .asMessageScope().invoke.\",\n    ReplaceWith(\n        \"this.asMessageScope()(action)\",\n        \"net.mamoe.mirai.console.util.asMessageScope\",\n        \"net.mamoe.mirai.console.util.invoke\",\n    )\n) // diagnostic deprecation\npublic inline fun <R> CommandSender.scopeWith(action: MessageScope.() -> R): R {\n    contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }\n    return asMessageScope()(action)\n}\n\n@Deprecated(\n    \"Senseless scopeWith. Use .asMessageScope().invoke.\",\n    ReplaceWith(\n        \"this.asMessageScope()(action)\",\n        \"net.mamoe.mirai.console.util.asMessageScope\",\n        \"net.mamoe.mirai.console.util.invoke\",\n    )\n) // diagnostic deprecation\npublic inline fun <R> MessageScope.scopeWith(action: MessageScope.() -> R): R {\n    contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }\n    return asMessageScope()(action)\n}\n\n//// endregion MessageScopeBuilders CODEGEN ////\n\n//// region IterableMessageScopeBuilders CODEGEN ////\n\n@JvmName(\"toMessageScopeContactIterable\")\npublic fun Iterable<Contact?>.toMessageScope(): MessageScope {\n    return this.fold(this.firstOrNull().asMessageScopeOrNoop()) { acc, messageScope ->\n        CombinedScope(\n            acc,\n            messageScope.asMessageScopeOrNoop()\n        )\n    }\n}\n\n@JvmName(\"toMessageScopeCommandSenderIterable\")\npublic fun Iterable<CommandSender?>.toMessageScope(): MessageScope {\n    return this.fold(this.firstOrNull().asMessageScopeOrNoop()) { acc, messageScope ->\n        CombinedScope(\n            acc,\n            messageScope.asMessageScopeOrNoop()\n        )\n    }\n}\n\n@JvmName(\"toMessageScopeMessageScopeIterable\")\npublic fun Iterable<MessageScope?>.toMessageScope(): MessageScope {\n    return this.fold(this.firstOrNull().asMessageScopeOrNoop()) { acc, messageScope ->\n        CombinedScope(\n            acc,\n            messageScope.asMessageScopeOrNoop()\n        )\n    }\n}\n\n@JvmName(\"toMessageScopeContactSequence\")\npublic fun Sequence<Contact?>.toMessageScope(): MessageScope {\n    return this.fold(this.firstOrNull().asMessageScopeOrNoop()) { acc, messageScope ->\n        CombinedScope(\n            acc,\n            messageScope.asMessageScopeOrNoop()\n        )\n    }\n}\n\n@JvmName(\"toMessageScopeCommandSenderSequence\")\npublic fun Sequence<CommandSender?>.toMessageScope(): MessageScope {\n    return this.fold(this.firstOrNull().asMessageScopeOrNoop()) { acc, messageScope ->\n        CombinedScope(\n            acc,\n            messageScope.asMessageScopeOrNoop()\n        )\n    }\n}\n\n@JvmName(\"toMessageScopeMessageScopeSequence\")\npublic fun Sequence<MessageScope?>.toMessageScope(): MessageScope {\n    return this.fold(this.firstOrNull().asMessageScopeOrNoop()) { acc, messageScope ->\n        CombinedScope(\n            acc,\n            messageScope.asMessageScopeOrNoop()\n        )\n    }\n}\n\n@JvmName(\"toMessageScopeContactArray\")\npublic fun Array<Contact?>.toMessageScope(): MessageScope {\n    return this.fold(this.firstOrNull().asMessageScopeOrNoop()) { acc, messageScope ->\n        CombinedScope(\n            acc,\n            messageScope.asMessageScopeOrNoop()\n        )\n    }\n}\n\n@JvmName(\"toMessageScopeCommandSenderArray\")\npublic fun Array<CommandSender?>.toMessageScope(): MessageScope {\n    return this.fold(this.firstOrNull().asMessageScopeOrNoop()) { acc, messageScope ->\n        CombinedScope(\n            acc,\n            messageScope.asMessageScopeOrNoop()\n        )\n    }\n}\n\n@JvmName(\"toMessageScopeMessageScopeArray\")\npublic fun Array<MessageScope?>.toMessageScope(): MessageScope {\n    return this.fold(this.firstOrNull().asMessageScopeOrNoop()) { acc, messageScope ->\n        CombinedScope(\n            acc,\n            messageScope.asMessageScopeOrNoop()\n        )\n    }\n}\n\n@JvmSynthetic\n@JvmName(\"toMessageScopeContactFlow\")\npublic suspend fun Flow<Contact>.toMessageScope(): MessageScope { // Flow<Any?>.firstOrNull isn't yet supported\n    return this.fold(this.firstOrNull().asMessageScopeOrNoop()) { acc, messageScope ->\n        CombinedScope(\n            acc,\n            messageScope.asMessageScope()\n        )\n    }\n}\n\n@JvmSynthetic\n@JvmName(\"toMessageScopeCommandSenderFlow\")\npublic suspend fun Flow<CommandSender>.toMessageScope(): MessageScope { // Flow<Any?>.firstOrNull isn't yet supported\n    return this.fold(this.firstOrNull().asMessageScopeOrNoop()) { acc, messageScope ->\n        CombinedScope(\n            acc,\n            messageScope.asMessageScope()\n        )\n    }\n}\n\n@JvmSynthetic\n@JvmName(\"toMessageScopeMessageScopeFlow\")\npublic suspend fun Flow<MessageScope>.toMessageScope(): MessageScope { // Flow<Any?>.firstOrNull isn't yet supported\n    return this.fold(this.firstOrNull().asMessageScopeOrNoop()) { acc, messageScope ->\n        CombinedScope(\n            acc,\n            messageScope.asMessageScope()\n        )\n    }\n}\n\n//// endregion IterableMessageScopeBuilders CODEGEN ////\n\n///////////////////////////////////////////////////////////////////////////\n// Internals\n///////////////////////////////////////////////////////////////////////////\n\n// [MessageScope] 实现\n\n@PublishedApi\ninternal inline fun MessageScope.asMessageScope(): MessageScope = this\n\nprivate inline fun MessageScope?.asMessageScopeOrNoop(): MessageScope = this?.asMessageScope() ?: NoopMessageScope\n\nprivate inline fun Contact?.asMessageScopeOrNoop(): MessageScope = this?.asMessageScope() ?: NoopMessageScope\n\nprivate inline fun CommandSender?.asMessageScopeOrNoop(): MessageScope = this?.asMessageScope() ?: NoopMessageScope\n\nprivate inline fun createScopeDelegate(o: CommandSender) = CommandSenderAsMessageScope(o)\n\nprivate inline fun createScopeDelegate(o: Contact) = ContactAsMessageScope(o)\n\ninternal fun MessageScope.asSequence(): Sequence<MessageScope> {\n    return if (this is CombinedScope) {\n        val a = this.first.asSequence()\n        val b = this.second.asSequence() // don't inline. fuck compilers\n        sequenceOf(a, b).flatten()\n    } else sequenceOf(this)\n}\n\n@OptIn(ConsoleExperimentalApi::class)\nprivate class CombinedScope(\n    val first: MessageScope,\n    val second: MessageScope,\n) : MessageScope {\n    override val realTarget: Any? get() = null\n\n    private val targets: List<MessageScope> by lazy {\n        this.asSequence().distinctBy { it.realTarget }.toList()\n    }\n\n    override suspend fun sendMessage(message: Message) {\n        for (target in targets) {\n            target.sendMessage(message)\n        }\n    }\n\n    override suspend fun sendMessage(message: String) {\n        for (target in targets) {\n            target.sendMessage(message)\n        }\n    }\n}\n\n@OptIn(ConsoleExperimentalApi::class)\nprivate class CommandSenderAsMessageScope(\n    private val sender: CommandSender,\n) : MessageScope {\n    override val realTarget: Any\n        get() {\n            val sender = this.sender\n            if (sender is SystemCommandSender) return sender\n            return sender.user ?: sender\n        }\n\n    override suspend fun sendMessage(message: Message) {\n        sender.sendMessage(message)\n    }\n\n    override suspend fun sendMessage(message: String) {\n        sender.sendMessage(message)\n    }\n}\n\n@OptIn(ConsoleExperimentalApi::class)\nprivate class ContactAsMessageScope(\n    private val sender: Contact,\n) : MessageScope {\n    override val realTarget: Any\n        get() = sender\n\n    override suspend fun sendMessage(message: Message) {\n        sender.sendMessage(message)\n    }\n\n    override suspend fun sendMessage(message: String) {\n        sender.sendMessage(message)\n    }\n}\n\n@OptIn(ConsoleExperimentalApi::class)\nprivate object NoopMessageScope : MessageScope {\n    override val realTarget: Any?\n        get() = null\n\n    override suspend fun sendMessage(message: Message) {\n    }\n\n    override suspend fun sendMessage(message: String) {\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/util/MessageUtils.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.util\n\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.MessageContent\n\n@ConsoleExperimentalApi\npublic object MessageUtils {\n    @JvmStatic\n    public fun MessageChain.messageContentsSequence(): Sequence<MessageContent> =\n        asSequence().filterIsInstance<MessageContent>()\n\n    @JvmStatic\n    public fun MessageChain.firstContent(): MessageContent = messageContentsSequence().first()\n\n    @JvmStatic\n    public fun MessageChain.firstContentOrNull(): MessageContent? = messageContentsSequence().firstOrNull()\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/util/SemVersion.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n/*\n * @author Karlatemp <karlatemp@vip.qq.com> <https://github.com/Karlatemp>\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.util\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.Transient\nimport kotlinx.serialization.builtins.serializer\nimport net.mamoe.mirai.console.compiler.common.ResolveContext\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.SEMANTIC_VERSION\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.VERSION_REQUIREMENT\nimport net.mamoe.mirai.console.internal.data.map\nimport net.mamoe.mirai.console.internal.util.semver.SemVersionInternal\nimport net.mamoe.mirai.console.util.SemVersion.Companion.equals\nimport net.mamoe.mirai.console.util.SemVersion.Requirement\nimport net.mamoe.mirai.console.util.SemVersion.SemVersionAsStringSerializer\nimport kotlin.LazyThreadSafetyMode.PUBLICATION\n\n/**\n * [语义化版本](https://semver.org/lang/zh-CN/) 支持\n *\n * ### 解析示例\n *\n * `1.0.0-M4+c25733b8` 将会解析出下面的内容,\n * [major] (主本号), [minor] (次版本号), [patch] (修订号), [identifier] (先行版本号) 和 [metadata] (元数据).\n * ```\n * SemVersion(\n *   major = 1,\n *   minor = 0,\n *   patch = 0,\n *   identifier  = \"M4\"\n *   metadata    = \"c25733b8\"\n * )\n * ```\n * 其中 identifier 和 metadata 都是可选的.\n *\n * 对于核心版本号, 此实现稍微比语义化版本规范宽松一些, 允许 x.y 的存在.\n *\n * ### 序列化\n * 使用 [SemVersionAsStringSerializer], [SemVersion] 被序列化为 [toString] 的字符串.\n *\n * @see Requirement 版本号要修\n * @see SemVersion.invoke 由字符串解析\n */\n@Serializable(with = SemVersionAsStringSerializer::class)\npublic data class SemVersion\n/**\n * @see SemVersion.invoke 字符串解析\n */\ninternal constructor(\n    /** 主版本号 */\n    public val major: Int,\n    /** 次版本号 */\n    public val minor: Int,\n    /** 修订号 */\n    public val patch: Int?,\n    /** 先行版本号识别符 */\n    public val identifier: String? = null,\n    /** 版本号元数据, 不参与版本号对比([compareTo]), 但是参与版本号严格对比([equals]) */\n    public val metadata: String? = null,\n) : Comparable<SemVersion> {\n\n    init {\n        require(major >= 0) { \"major must >= 0\" }\n        require(minor >= 0) { \"minor must >= 0\" }\n        if (patch != null) require(patch >= 0) { \"patch must >= 0\" }\n        if (identifier != null) require(identifier.none(Char::isWhitespace)) { \"identifier must not contain whitespace\" }\n        if (metadata != null) require(metadata.none(Char::isWhitespace)) { \"metadata must not contain whitespace\" }\n    }\n\n    /**\n     * 一条依赖规则\n     * @see [parseRangeRequirement]\n     */\n    @Serializable(Requirement.RequirementAsStringSerializer::class)\n    public data class Requirement internal constructor(\n        /**\n         * 规则的字符串表示方式\n         *\n         * @see [SemVersion.parseRangeRequirement]\n         */\n        val rule: String,\n    ) {\n\n        @Transient\n        internal val impl = kotlin.runCatching {\n            SemVersionInternal.parseRangeRequirement(rule)\n        }.getOrElse {\n            throw java.lang.IllegalArgumentException(\"Syntax error: $rule\", it)\n        }\n\n        /** 在 [version] 满足此要求时返回 true */\n        public fun test(version: SemVersion): Boolean = impl.test(version)\n\n        /**\n         * 序列化为字符串, [rule]. 从字符串反序列化, [parseRangeRequirement].\n         */\n        public object RequirementAsStringSerializer : KSerializer<Requirement> by String.serializer().map(\n            serializer = { it.rule },\n            deserializer = { parseRangeRequirement(it) }\n        )\n\n        public companion object {\n            /**\n             * @see parseRangeRequirement\n             */\n            @JvmSynthetic\n            public operator fun invoke(@ResolveContext(VERSION_REQUIREMENT) requirement: String): Requirement =\n                parseRangeRequirement(requirement)\n        }\n    }\n\n    /**\n     * 使用 [SemVersion.toString] 序列化, 使用 [SemVersion.invoke] 反序列化.\n     */\n    public object SemVersionAsStringSerializer : KSerializer<SemVersion> by String.serializer().map(\n        serializer = { it.toString() },\n        deserializer = { SemVersion(it) }\n    )\n\n    public companion object {\n        /**\n         * 解析一个版本号, 将会返回一个 [SemVersion],\n         * 如果发生解析错误将会抛出一个 [IllegalArgumentException] 或者 [NumberFormatException]\n         *\n         * 对于版本号的组成, 有以下规定:\n         * - 必须包含主版本号和次版本号\n         * - 存在 先行版本号 的时候 先行版本号 不能为空\n         * - 存在 元数据 的时候 元数据 不能为空\n         * - 核心版本号只允许 `x.y` 和 `x.y.z` 的存在\n         *     - `1.0-RC` 是合法的\n         *     - `1.0.0-RC` 也是合法的, 与 `1.0-RC` 一样\n         *     - `1.0.0.0-RC` 是不合法的, 将会抛出一个 [IllegalArgumentException]\n         *\n         * 注意情况:\n         * - 第一个 `+` 之后的所有内容全部识别为元数据\n         *     - `1.0+METADATA-M4`, metadata=\"METADATA-M4\"\n         * - 如果不确定版本号是否合法, 可以使用 [regex101.com](https://regex101.com/r/vkijKf/1/) 进行检查\n         *     - 此实现使用的正则表达式为 `^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:\\.(0|[1-9]\\d*))?(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$`\n         */\n        @JvmStatic\n        @JvmName(\"parse\")\n        @Throws(IllegalArgumentException::class, NumberFormatException::class)\n        public operator fun invoke(@ResolveContext(SEMANTIC_VERSION) version: String): SemVersion =\n            SemVersionInternal.parse(version)\n\n        /**\n         * 解析一条依赖需求描述, 在无法解析的时候抛出 [IllegalArgumentException]\n         *\n         * 对于一条规则, 有以下方式可选\n         *\n         * - `1.0.0-M4`       要求 1.0.0-M4 版本, 且只能是 1.0.0-M4 版本\n         * - `1.x`            要求 1.x 版本\n         * - `> 1.0.0-RC`     要求 1.0.0-RC 之后的版本, 不能是 1.0.0-RC\n         * - `>= 1.0.0-RC`    要求 1.0.0-RC 或之后的版本, 可以是 1.0.0-RC\n         * - `< 1.0.0-RC`     要求 1.0.0-RC 之前的版本, 不能是 1.0.0-RC\n         * - `<= 1.0.0-RC`    要求 1.0.0-RC 或之前的版本, 可以是 1.0.0-RC\n         * - `!= 1.0.0-RC`    要求 除了1.0.0-RC 的任何版本\n         *     - `[1.0.0, 1.2.0]`\n         *     - `(1.0.0, 1.2.0]`\n         *     - `[1.0.0, 1.2.0)`\n         *     - `(1.0.0, 1.2.0)` [数学区间](https://baike.baidu.com/item/%E5%8C%BA%E9%97%B4/1273117)\n         *\n         * 对于多个规则, 允许使用逻辑符号 `{}`, `||`, `&&`\n         * 例如:\n         * - `1.x || 2.x || 3.0.0`\n         * - `<= 0.5.3 || >= 1.0.0`\n         * - `{> 1.0 && < 1.5} || {> 1.8}`\n         * - `{> 1.0 && < 1.5} || {> 1.8}`\n         * - `> 1.0.0 && != 1.2.0`\n         *\n         * 特别注意:\n         * - 依赖规则版本号不需要携带版本号元数据, 元数据不参与依赖需求的检查\n         * - 如果目标版本号携带有先行版本号, 请不要忘记先行版本号\n         * - 因为 `()` 已经用于数学区间, 使用 `{}` 替代 `()`\n         */\n        @JvmStatic\n        @Throws(IllegalArgumentException::class)\n        public fun parseRangeRequirement(@ResolveContext(VERSION_REQUIREMENT) rule: String): Requirement =\n            Requirement(rule)\n\n        /** @see [Requirement.test] */\n        @JvmStatic\n        @Throws(IllegalArgumentException::class, NumberFormatException::class)\n        public fun Requirement.test(@ResolveContext(SEMANTIC_VERSION) version: String): Boolean = test(invoke(version))\n\n        /**\n         * 当满足 [requirement] 时返回 true, 否则返回 false\n         */\n        @JvmStatic\n        public fun SemVersion.satisfies(requirement: Requirement): Boolean = requirement.test(this)\n\n        /**\n         * 当满足 [requirement] 时返回 true, 否则返回 false\n         */\n        @JvmStatic\n        @Throws(IllegalArgumentException::class)\n        public fun SemVersion.satisfies(@ResolveContext(VERSION_REQUIREMENT) requirement: String): Boolean =\n            parseRangeRequirement(requirement).test(this)\n\n        /** for Kotlin only */\n        @JvmStatic\n        @JvmSynthetic\n        public operator fun Requirement.contains(version: SemVersion): Boolean = test(version)\n\n        /** for Kotlin only */\n        @JvmStatic\n        @JvmSynthetic\n        public operator fun Requirement.contains(@ResolveContext(SEMANTIC_VERSION) version: String): Boolean =\n            test(version)\n    }\n\n    @Transient\n    private val toString: String by lazy(PUBLICATION) {\n        buildString {\n            append(major)\n            append('.').append(minor)\n            patch?.let { append('.').append(it) }\n            identifier?.let { identifier ->\n                append('-').append(identifier)\n            }\n            metadata?.let { metadata ->\n                append('+').append(metadata)\n            }\n        }\n    }\n\n    /**\n     * 返回类似 `1.0.0-M4+c25733b8` 的字符串.\n     */\n    public override fun toString(): String = toString\n\n    /**\n     * 将 [SemVersion] 转为 Kotlin data class 风格的 [String].\n     *\n     * ```\n     * return \"SemVersion(major=$major, minor=$minor, patch=$patch, identifier=$identifier, metadata=$metadata)\"\n     * ```\n     */\n    public fun toStructuredString(): String {\n        return \"SemVersion(major=$major, minor=$minor, patch=$patch, identifier=$identifier, metadata=$metadata)\"\n    }\n\n    /**\n     * 比较 `this` 和 [other].\n     *\n     * @param deep 为 `true` 时进行深度比较, 相当于 [equals]. 为 `false` 时相当于 `compareTo(other) == 0`\n     * @see compareTo\n     */\n    public fun equals(other: SemVersion, deep: Boolean): Boolean {\n        return if (deep) {\n            (other.major == major\n                    && other.minor == minor\n                    && other.patch == patch\n                    && other.identifier == identifier\n                    && other.metadata == metadata)\n        } else {\n            this.compareTo(other) == 0\n        }\n    }\n\n    /**\n     * 深度比较 `this` 和 [other], 当且仅当 [major], [patch], [minor], [identifier], [metadata] 完全相同时返回 `true`.\n     *\n     * 如: `1.0.0-RC` != `1.0-RC`\n     *\n     * @see compareTo\n     */\n    public override fun equals(other: Any?): Boolean {\n        if (other === null) return false\n        if (this === other) return true\n        if (javaClass != other.javaClass) return false\n        return equals(other as SemVersion, deep = true)\n    }\n\n    public override fun hashCode(): Int {\n        var result = major.hashCode()\n        result = 31 * result + minor.hashCode()\n        result = 31 * result + (patch?.hashCode() ?: 0)\n        result = 31 * result + (identifier?.hashCode() ?: 0)\n        result = 31 * result + (metadata?.hashCode() ?: 0)\n        return result\n    }\n\n    /**\n     * 比较 `this` 和 [other] 的实际版本大小.\n     *\n     * 如:\n     * - `SemVersion(\"1.0.0-RC\").compareTo(SemVersion(\"1.0-RC\")) == 0` (然而对他们进行 [equals] 判断会返回 `false`)\n     * - `SemVersion(\"1.3.0\") > SemVersion(\"1.1.0\") == true` (因为 1.3.0 比 1.1.0 更高)\n     *\n     *\n     * @return 当 `this` 比 [other] 更高时返回一个正数.\n     * 当 `this` 比 [other] 更低时返回一个负数.\n     * 当 `this` 与 [other] 版本大小相等时返回 0.\n     *\n     * @see equals\n     */\n    public override operator fun compareTo(other: SemVersion): Int {\n        return SemVersionInternal.run { compareInternal(this@SemVersion, other) }\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/util/StandardUtils.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.util\n\nimport kotlin.contracts.contract\n\n/**\n * Perform `this as? T`.\n */\n@JvmSynthetic\npublic inline fun <reified T : Any> Any?.safeCast(): T? {\n    contract {\n        returnsNotNull() implies (this@safeCast is T)\n    }\n    return this as? T\n}\n\n/**\n * Perform `this as T`.\n */\n@JvmSynthetic\npublic inline fun <reified T : Any> Any?.cast(): T {\n    contract {\n        returns() implies (this@cast is T)\n    }\n    return this as T\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/src/util/retryCatching.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"RESULT_CLASS_IN_RETURN_TYPE\", \"unused\")\n@file:JvmMultifileClass\n@file:JvmName(\"ConsoleUtils\")\n\npackage net.mamoe.mirai.console.util\n\nimport org.jetbrains.annotations.Range\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.internal.InlineOnly\n\n/**\n * 执行 [n] 次 [block], 在第一次成功时返回执行结果, 在捕获到异常时返回异常.\n */\n@InlineOnly\npublic inline fun <R> retryCatching(n: @Range(from = 1, to = Int.MAX_VALUE.toLong()) Int, block: () -> R): Result<R> {\n    contract {\n        callsInPlace(block, InvocationKind.AT_LEAST_ONCE)\n    }\n    require(n >= 1) { \"param n for retryCatching must not be negative\" }\n    var exception: Throwable? = null\n    repeat(n) {\n        try {\n            return Result.success(block())\n        } catch (e: Throwable) {\n            exception?.addSuppressed(e)\n            exception = e\n        }\n    }\n    return Result.failure(exception!!)\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/TestMiraiConosle.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console\n\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.console.MiraiConsoleImplementation.Companion.start\nimport net.mamoe.mirai.console.command.CommandManager\nimport net.mamoe.mirai.console.data.MemoryPluginDataStorage\nimport net.mamoe.mirai.console.data.PluginDataStorage\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader\nimport net.mamoe.mirai.console.plugin.loader.PluginLoader\nimport net.mamoe.mirai.console.util.ConsoleInput\nimport net.mamoe.mirai.console.util.ConsoleInternalApi\nimport net.mamoe.mirai.console.util.SemVersion\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.utils.BotConfiguration\nimport net.mamoe.mirai.utils.LoginSolver\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.PlatformLogger\nimport java.nio.file.Path\nimport kotlin.coroutines.Continuation\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.resume\nimport kotlin.io.path.createTempDirectory\nimport kotlin.test.assertNotNull\n\ninternal object Testing {\n    @Volatile\n    internal var cont: Continuation<Any?>? = null\n\n    @Suppress(\"UNCHECKED_CAST\")\n    suspend fun <R> withTesting(timeout: Long = 50000L, block: suspend () -> Unit): R {\n        @Suppress(\"RemoveExplicitTypeArguments\") // bug\n        return if (timeout != -1L) {\n            withTimeout<R>(timeout) {\n                suspendCancellableCoroutine<R> { ct ->\n                    this@Testing.cont = ct as Continuation<Any?>\n                    runBlocking { block() }\n                }\n            }\n        } else {\n            suspendCancellableCoroutine<R> { ct ->\n                this.cont = ct as Continuation<Any?>\n                runBlocking { block() }\n            }\n        }\n    }\n\n    fun ok(result: Any? = Unit) {\n        val cont = cont\n        assertNotNull(cont)\n        cont.resume(result)\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/command/AbstractCommandTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.command\n\nimport net.mamoe.mirai.console.internal.data.builtins.ConsoleDataScopeImpl\nimport net.mamoe.mirai.console.internal.data.builtins.DataScope\nimport net.mamoe.mirai.console.testFramework.AbstractConsoleInstanceTest\n\ninternal abstract class AbstractCommandTest : AbstractConsoleInstanceTest() {\n    val dataScope get() = DataScope as ConsoleDataScopeImpl\n    val consoleSender get() = ConsoleCommandSender\n\n\n    open val sender: CommandSender get() = ConsoleCommandSender\n    open val owner: CommandOwner get() = ConsoleCommandOwner\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/command/CommandContextTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ExperimentalCommandDescriptors::class)\n@file:Suppress(\"unused\", \"UNUSED_PARAMETER\")\n\npackage net.mamoe.mirai.console.command\n\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.mirai.console.Testing\nimport net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors\nimport net.mamoe.mirai.console.command.java.JCompositeCommand\nimport net.mamoe.mirai.console.command.java.JRawCommand\nimport net.mamoe.mirai.console.command.java.JSimpleCommand\nimport net.mamoe.mirai.console.internal.data.classifierAsKClass\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.safeCast\nimport org.apache.commons.lang3.ArrayUtils.isSameType\nimport org.junit.jupiter.api.DynamicTest\nimport org.junit.jupiter.api.TestFactory\nimport kotlin.test.assertEquals\n\ninternal class CommandContextTest : AbstractCommandTest() {\n    private class MyMetadata : MessageMetadata {\n        override fun hashCode(): Int = javaClass.hashCode()\n        override fun equals(other: Any?): Boolean = isSameType(this, other)\n\n        override fun toString(): String = \"MyMetadata\"\n\n        companion object Key : AbstractMessageKey<MyMetadata>({ it.safeCast() })\n    }\n\n\n    ///////////////////////////////////////////////////////////////////////////\n    // RawCommand\n    ///////////////////////////////////////////////////////////////////////////\n\n    @TestFactory\n    fun `can execute with sender`(): List<DynamicTest> {\n        return listOf(\n            object : RawCommand(owner, \"test\") {\n                override suspend fun CommandContext.onCommand(args: MessageChain) {\n                    Testing.ok(args)\n                }\n            } to \"/test foo\",\n            object : SimpleCommand(owner, \"test\") {\n                @Handler\n                fun CommandContext.foo(arg: MessageChain) {\n                    Testing.ok(arg)\n                }\n            } to \"/test foo\",\n            object : CompositeCommand(owner, \"test\") {\n                @SubCommand\n                fun CommandContext.sub(arg: MessageChain) {\n                    Testing.ok(arg)\n                }\n            } to \"/test sub foo\",\n\n            object : JRawCommand(owner, \"test\") {\n                override fun onCommand(context: CommandContext, args: MessageChain) {\n                    Testing.ok(args)\n                }\n            } to \"/test foo\",\n            object : JSimpleCommand(owner, \"test\") {\n                @Handler\n                fun foo(context: CommandContext, arg: MessageChain) {\n                    Testing.ok(arg)\n                }\n            } to \"/test foo\",\n            object : JCompositeCommand(owner, \"test\") {\n                @SubCommand\n                fun sub(context: CommandContext, arg: MessageChain) {\n                    Testing.ok(arg)\n                }\n            } to \"/test sub foo\",\n        ).map { (instance, cmd) ->\n            DynamicTest.dynamicTest(instance::class.supertypes.first().classifierAsKClass().simpleName) {\n                runBlocking {\n                    instance.withRegistration {\n                        assertEquals(\n                            messageChainOf(PlainText(\"foo\")),\n                            Testing.withTesting {\n                                assertSuccess(sender.executeCommand(cmd, checkPermission = false))\n                            }\n                        )\n                    }\n                }\n            }\n        }\n    }\n\n    @TestFactory\n    fun `RawCommand can execute and get original chain`(): List<DynamicTest> {\n        return listOf(\n            object : RawCommand(owner, \"test\") {\n                override suspend fun CommandContext.onCommand(args: MessageChain) {\n                    Testing.ok(originalMessage)\n                }\n            } to \"/test foo\",\n            object : SimpleCommand(owner, \"test\") {\n                @Handler\n                fun CommandContext.foo(arg: MessageChain) {\n                    Testing.ok(originalMessage)\n                }\n            } to \"/test foo\",\n            object : CompositeCommand(owner, \"test\") {\n                @SubCommand\n                fun CommandContext.sub(arg: MessageChain) {\n                    Testing.ok(originalMessage)\n                }\n            } to \"/test sub foo\",\n\n            object : JRawCommand(owner, \"test\") {\n                override fun onCommand(context: CommandContext, args: MessageChain) {\n                    Testing.ok(context.originalMessage)\n                }\n            } to \"/test foo\",\n            object : JSimpleCommand(owner, \"test\") {\n                @Handler\n                fun foo(context: CommandContext, arg: MessageChain) {\n                    Testing.ok(context.originalMessage)\n                }\n            } to \"/test foo\",\n            object : JCompositeCommand(owner, \"test\") {\n                @SubCommand\n                fun sub(context: CommandContext, arg: MessageChain) {\n                    Testing.ok(context.originalMessage)\n                }\n            } to \"/test sub foo\",\n        ).map { (instance, cmd) ->\n            DynamicTest.dynamicTest(instance::class.supertypes.first().classifierAsKClass().simpleName) {\n                runBlocking {\n                    instance.withRegistration {\n                        assertEquals(\n                            cmd,\n                            Testing.withTesting<MessageChain> {\n                                assertSuccess(sender.executeCommand(cmd, checkPermission = false))\n                            }.contentToString()\n                        )\n                    }\n                }\n            }\n        }\n    }\n\n    @TestFactory\n    fun `can execute and get metadata`(): List<DynamicTest> {\n        val metadata = MyMetadata()\n        return listOf(\n            object : RawCommand(owner, \"test\") {\n                override suspend fun CommandContext.onCommand(args: MessageChain) {\n                    Testing.ok(originalMessage[MyMetadata])\n                }\n            } to messageChainOf(PlainText(\"/test\"), metadata, PlainText(\"foo\")),\n            object : SimpleCommand(owner, \"test\") {\n                @Handler\n                fun CommandContext.foo(arg: MessageChain) {\n                    Testing.ok(originalMessage[MyMetadata])\n                }\n            } to messageChainOf(PlainText(\"/test\"), metadata, PlainText(\"foo\")),\n            object : CompositeCommand(owner, \"test\") {\n                @SubCommand\n                fun CommandContext.sub(arg: MessageChain) {\n                    Testing.ok(originalMessage[MyMetadata])\n                }\n            } to messageChainOf(PlainText(\"/test\"), PlainText(\"sub\"), metadata, PlainText(\"foo\")),\n\n\n            object : JRawCommand(owner, \"test\") {\n                override fun onCommand(context: CommandContext, args: MessageChain) {\n                    Testing.ok(context.originalMessage[MyMetadata])\n                }\n            } to messageChainOf(PlainText(\"/test\"), metadata, PlainText(\"foo\")),\n            object : JSimpleCommand(owner, \"test\") {\n                @Handler\n                fun foo(context: CommandContext, arg: MessageChain) {\n                    Testing.ok(context.originalMessage[MyMetadata])\n                }\n            } to messageChainOf(PlainText(\"/test\"), metadata, PlainText(\"foo\")),\n            object : JCompositeCommand(owner, \"test\") {\n                @SubCommand\n                fun sub(context: CommandContext, arg: MessageChain) {\n                    Testing.ok(context.originalMessage[MyMetadata])\n                }\n            } to messageChainOf(PlainText(\"/test\"), PlainText(\"sub\"), metadata, PlainText(\"foo\")),\n        ).map { (instance, cmd) ->\n            DynamicTest.dynamicTest(instance::class.supertypes.first().classifierAsKClass().simpleName) {\n                runBlocking {\n                    instance.withRegistration {\n                        assertEquals(\n                            metadata,\n                            Testing.withTesting {\n                                assertSuccess(CommandManager.executeCommand(sender, cmd, checkPermission = false))\n                            }\n                        )\n                    }\n                }\n            }\n        }\n    }\n\n    @TestFactory\n    fun `RawCommand can execute and get chain including metadata`(): List<DynamicTest> {\n        val metadata = MyMetadata()\n        return listOf(\n            object : RawCommand(owner, \"test\") {\n                override suspend fun CommandContext.onCommand(args: MessageChain) {\n                    Testing.ok(originalMessage)\n                }\n            } to messageChainOf(PlainText(\"/test\"), metadata, PlainText(\"foo\")),\n            object : SimpleCommand(owner, \"test\") {\n                @Handler\n                fun CommandContext.foo(arg: MessageChain) {\n                    Testing.ok(originalMessage)\n                }\n            } to messageChainOf(PlainText(\"/test\"), metadata, PlainText(\"foo\")),\n            object : CompositeCommand(owner, \"test\") {\n                @SubCommand\n                fun CommandContext.sub(arg: MessageChain) {\n                    Testing.ok(originalMessage)\n                }\n            } to messageChainOf(PlainText(\"/test\"), PlainText(\"sub\"), metadata, PlainText(\"foo\")),\n\n\n            object : JRawCommand(owner, \"test\") {\n                override fun onCommand(context: CommandContext, args: MessageChain) {\n                    Testing.ok(context.originalMessage)\n                }\n            } to messageChainOf(PlainText(\"/test\"), metadata, PlainText(\"foo\")),\n            object : JSimpleCommand(owner, \"test\") {\n                @Handler\n                fun foo(context: CommandContext, arg: MessageChain) {\n                    Testing.ok(context.originalMessage)\n                }\n            } to messageChainOf(PlainText(\"/test\"), metadata, PlainText(\"foo\")),\n            object : JCompositeCommand(owner, \"test\") {\n                @SubCommand\n                fun sub(context: CommandContext, arg: MessageChain) {\n                    Testing.ok(context.originalMessage)\n                }\n            } to messageChainOf(PlainText(\"/test\"), PlainText(\"sub\"), metadata, PlainText(\"foo\")),\n        ).map { (instance, cmd) ->\n            DynamicTest.dynamicTest(instance::class.supertypes.first().classifierAsKClass().simpleName) {\n                runBlocking {\n                    instance.withRegistration {\n                        assertEquals(\n                            cmd,\n                            Testing.withTesting {\n                                assertSuccess(CommandManager.executeCommand(sender, cmd, checkPermission = false))\n                            }\n                        )\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/command/CommandValueArgumentContextTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ExperimentalCommandDescriptors::class)\n\npackage net.mamoe.mirai.console.command\n\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.mirai.console.Testing\nimport net.mamoe.mirai.console.command.descriptor.CommandArgumentParserException\nimport net.mamoe.mirai.console.command.descriptor.CommandValueArgumentParser\nimport net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors\nimport net.mamoe.mirai.console.command.descriptor.buildCommandArgumentContext\nimport net.mamoe.mirai.console.command.java.JCompositeCommand\nimport net.mamoe.mirai.console.command.java.JSimpleCommand\nimport net.mamoe.mirai.console.internal.data.classifierAsKClass\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.message.data.MessageContent\nimport net.mamoe.mirai.message.data.PlainText\nimport net.mamoe.mirai.message.data.messageChainOf\nimport org.junit.jupiter.api.DynamicTest\nimport org.junit.jupiter.api.TestFactory\nimport kotlin.test.assertEquals\n\n@Suppress(\"UNUSED_PARAMETER\", \"unused\")\ninternal class CommandValueArgumentContextTest : AbstractCommandTest() {\n\n    inner class CustomBooleanParser : CommandValueArgumentParser<Boolean> {\n        @Throws(CommandArgumentParserException::class)\n        override fun parse(raw: String, sender: CommandSender): Boolean {\n            return raw == \"TRUE!\"\n        }\n\n        @Throws(CommandArgumentParserException::class)\n        override fun parse(raw: MessageContent, sender: CommandSender): Boolean {\n            // 将一个图片认为是 'true'\n            return if (raw is Image && raw.imageId == \"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\") {\n                true\n            } else super.parse(raw, sender)\n        }\n    }\n\n    inner class JavaComposite : JCompositeCommand(mockPlugin, \"main\") {\n        init {\n            addArgumentContext(\n                buildCommandArgumentContext { java.lang.Boolean.TYPE with CustomBooleanParser() }\n            )\n        }\n\n        @SubCommand(\"name\")\n        fun foo(context: CommandContext, arg: String, b: Boolean) {\n            Testing.ok(b)\n        }\n    }\n\n    inner class JavaSimple : JSimpleCommand(mockPlugin, \"main\") {\n        init {\n            addArgumentContext(\n                buildCommandArgumentContext { java.lang.Boolean.TYPE with CustomBooleanParser() }\n            )\n        }\n\n        @Handler\n        fun foo(context: CommandContext, arg: String, b: Boolean) {\n            Testing.ok(b)\n        }\n    }\n\n    @TestFactory\n    fun test(): List<DynamicTest> {\n        return listOf(\n            JavaComposite() to listOf(\n                messageChainOf(PlainText(\"/main\"), PlainText(\"name\"), PlainText(\"aaa\"), PlainText(\"TRUE!\")),\n                messageChainOf(\n                    PlainText(\"/main\"),\n                    PlainText(\"name\"),\n                    PlainText(\"aaa\"),\n                    Image(\"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\")\n                )\n            ), JavaSimple() to listOf(\n                messageChainOf(PlainText(\"/main\"), PlainText(\"aaa\"), PlainText(\"TRUE!\")),\n                messageChainOf(\n                    PlainText(\"/main\"),\n                    PlainText(\"aaa\"),\n                    Image(\"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\")\n                )\n            )\n        ).flatMap { (instance, cmds) ->\n            cmds.map { message ->\n                DynamicTest.dynamicTest(instance::class.supertypes.first().classifierAsKClass().simpleName) {\n                    runBlocking {\n                        instance.withRegistration {\n                            assertEquals(\n                                true,\n                                Testing.withTesting {\n                                    assertSuccess(\n                                        CommandManager.executeCommand(sender, message, checkPermission = false)\n                                    )\n                                }\n                            )\n                        }\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/command/InstanceTestCommand.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"UNUSED_PARAMETER\")\n\npackage net.mamoe.mirai.console.command\n\nimport kotlinx.coroutines.runBlocking\nimport kotlinx.coroutines.test.runTest\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport net.mamoe.mirai.console.Testing\nimport net.mamoe.mirai.console.Testing.withTesting\nimport net.mamoe.mirai.console.command.CommandManager.INSTANCE.getRegisteredCommands\nimport net.mamoe.mirai.console.command.CommandManager.INSTANCE.register\nimport net.mamoe.mirai.console.command.CommandManager.INSTANCE.registerCommand\nimport net.mamoe.mirai.console.command.CommandManager.INSTANCE.unregisterAllCommands\nimport net.mamoe.mirai.console.command.CommandManager.INSTANCE.unregisterCommand\nimport net.mamoe.mirai.console.command.descriptor.CommandValueArgumentParser\nimport net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors\nimport net.mamoe.mirai.console.command.descriptor.buildCommandArgumentContext\nimport net.mamoe.mirai.console.internal.command.CommandManagerImpl\nimport net.mamoe.mirai.console.internal.command.flattenCommandComponents\nimport net.mamoe.mirai.console.permission.PermissionService.Companion.permit\nimport net.mamoe.mirai.console.testFramework.AbstractConsoleInstanceTest\nimport net.mamoe.mirai.message.data.*\nimport java.time.*\nimport java.time.temporal.TemporalAccessor\nimport kotlin.reflect.KClass\nimport kotlin.test.*\n\nclass TestCompositeCommand : CompositeCommand(\n    owner,\n    \"testComposite\", \"tsC\"\n) {\n    @SubCommand\n    fun mute(seconds: Int = 60) {\n        Testing.ok(seconds)\n    }\n\n    @SubCommand\n    fun mute(target: Long, seconds: Int) {\n        Testing.ok(seconds)\n    }\n}\n\nclass TestRawCommand : RawCommand(\n    owner,\n    \"testRaw\"\n) {\n    override suspend fun CommandSender.onCommand(args: MessageChain) {\n        Testing.ok(args)\n    }\n}\n\n\nclass TestSimpleCommand : RawCommand(owner, \"testSimple\", \"tsS\") {\n    override suspend fun CommandSender.onCommand(args: MessageChain) {\n        Testing.ok(args)\n    }\n}\n\n@Suppress(\"EnumEntryName\")\nclass TestEnumArgCommand : CompositeCommand(owner, \"testenum\") {\n    enum class TestEnum {\n        V1, V2, V3\n    }\n\n    enum class TestCase {\n        A, a\n    }\n\n    enum class TestCamelCase {\n        A, B, A_B\n    }\n\n    @SubCommand(\"tcc\")\n    fun CommandSender.testCamelCase(enum: TestCamelCase) {\n        Testing.ok(enum)\n    }\n\n    @SubCommand(\"tc\")\n    fun CommandSender.testCase(enum: TestCase) {\n        Testing.ok(enum)\n    }\n\n    @SubCommand\n    fun CommandSender.e1(enum: TestEnum) {\n        Testing.ok(enum)\n    }\n}\n\nclass TestTemporalArgCommand : CompositeCommand(owner, \"testtemporal\") {\n\n    @SubCommand\n    fun CommandSender.instant(temporal: Instant) {\n        Testing.ok(temporal)\n    }\n\n    @SubCommand\n    fun CommandSender.year(temporal: Year) {\n        Testing.ok(temporal)\n    }\n\n    @SubCommand\n    fun CommandSender.yearmonth(temporal: YearMonth) {\n        Testing.ok(temporal)\n    }\n\n    @SubCommand\n    fun CommandSender.localdate(temporal: LocalDate) {\n        Testing.ok(temporal)\n    }\n\n    @SubCommand\n    fun CommandSender.localtime(temporal: LocalTime) {\n        Testing.ok(temporal)\n    }\n\n    @SubCommand\n    fun CommandSender.localdatetime(temporal: LocalDateTime) {\n        Testing.ok(temporal)\n    }\n\n    @SubCommand\n    fun CommandSender.offsettime(temporal: OffsetTime) {\n        Testing.ok(temporal)\n    }\n\n    @SubCommand\n    fun CommandSender.offsetdatetime(temporal: OffsetDateTime) {\n        Testing.ok(temporal)\n    }\n\n    @SubCommand\n    fun CommandSender.zoneddatetime(temporal: ZonedDateTime) {\n        Testing.ok(temporal)\n    }\n\n    @SubCommand\n    fun CommandSender.monthday(temporal: MonthDay) {\n        Testing.ok(temporal)\n    }\n\n    @SubCommand\n    fun CommandSender.zoneoffset(temporal: ZoneOffset) {\n        Testing.ok(temporal)\n    }\n}\n\nprivate val sender get() = ConsoleCommandSender\nprivate val owner get() = ConsoleCommandOwner\n\n@OptIn(ExperimentalCommandDescriptors::class)\ninternal class InstanceTestCommand : AbstractConsoleInstanceTest() {\n    private val manager by lazy { MiraiConsoleImplementation.getBridge().commandManager as CommandManagerImpl }\n\n    private val simpleCommand by lazy { TestSimpleCommand() }\n    private val rawCommand by lazy { TestRawCommand() }\n    private val compositeCommand by lazy { TestCompositeCommand() }\n\n    @BeforeTest\n    fun grantPermission() {\n        ConsoleCommandSender.permit(simpleCommand.permission)\n        ConsoleCommandSender.permit(compositeCommand.permission)\n    }\n\n    @Test\n    fun testRegister() {\n        try {\n            unregisterAllCommands(ConsoleCommandOwner) // builtins\n            unregisterAllCommands(owner) // testing unit\n            unregisterCommand(simpleCommand)\n\n            assertTrue(compositeCommand.register())\n            assertFalse(compositeCommand.register())\n\n            assertEquals(1, getRegisteredCommands(owner).size)\n\n            assertEquals(1, manager._registeredCommands.size)\n            assertEquals(2,\n                manager.requiredPrefixCommandMap.size,\n                manager.requiredPrefixCommandMap.entries.joinToString { it.toString() })\n        } finally {\n            unregisterCommand(compositeCommand)\n        }\n    }\n\n    @Test\n    fun testSimpleExecute() = runTest {\n        simpleCommand.withRegistration {\n            assertEquals(\"test\", withTesting<MessageChain> {\n                assertSuccess(simpleCommand.execute(sender, \"test\"))\n            }.contentToString())\n        }\n    }\n\n    @Test\n    fun `test raw command`() = runTest {\n        rawCommand.withRegistration {\n            val result = withTesting<MessageChain> {\n                assertSuccess(rawCommand.execute(sender, PlainText(\"a1\"), PlainText(\"a2\"), PlainText(\"a3\")))\n            }\n            assertEquals(3, result.size)\n            assertEquals(\"a1, a2, a3\", result.joinToString())\n        }\n    }\n\n    @Test\n    fun `test flattenCommandArgs`() {\n        val result = arrayOf(\"test\", image).flattenCommandComponents().toTypedArray()\n\n        assertEquals(\"test\", result[0].content)\n        assertSame(image, result[1])\n\n        assertEquals(2, result.size)\n    }\n\n    @Test\n    fun `test enum argument`() = runTest {\n        val enum = TestEnumArgCommand()\n        enum.withRegistration {\n\n            assertEquals(TestEnumArgCommand.TestEnum.V1, withTesting {\n                assertSuccess(enum.execute(sender, PlainText(\"e1\"), PlainText(\"V1\")))\n            })\n            assertEquals(TestEnumArgCommand.TestEnum.V2, withTesting {\n                assertSuccess(enum.execute(sender, PlainText(\"e1\"), PlainText(\"V2\")))\n            })\n            assertEquals(TestEnumArgCommand.TestEnum.V3, withTesting {\n                assertSuccess(enum.execute(sender, PlainText(\"e1\"), PlainText(\"V3\")))\n            })\n            withTesting<Unit> {\n                assertFailure(enum.execute(sender, PlainText(\"e1\"), PlainText(\"ENUM_NOT_FOUND\")))\n                Testing.ok(Unit)\n            }\n            assertEquals(TestEnumArgCommand.TestEnum.V1, withTesting {\n                assertSuccess(enum.execute(sender, PlainText(\"e1\"), PlainText(\"v1\")))\n            })\n            assertEquals(TestEnumArgCommand.TestEnum.V2, withTesting {\n                assertSuccess(enum.execute(sender, PlainText(\"e1\"), PlainText(\"v2\")))\n            })\n            assertEquals(TestEnumArgCommand.TestEnum.V3, withTesting {\n                assertSuccess(enum.execute(sender, PlainText(\"e1\"), PlainText(\"v3\")))\n            })\n\n\n            assertEquals(TestEnumArgCommand.TestCase.A, withTesting {\n                assertSuccess(enum.execute(sender, PlainText(\"tc\"), PlainText(\"A\")))\n            })\n            assertEquals(TestEnumArgCommand.TestCase.a, withTesting {\n                assertSuccess(enum.execute(sender, PlainText(\"tc\"), PlainText(\"a\")))\n            })\n            withTesting<Unit> {\n                assertFailure(enum.execute(sender, PlainText(\"tc\"), PlainText(\"ENUM_NOT_FOUND\")))\n                Testing.ok(Unit)\n            }\n\n\n            assertEquals(TestEnumArgCommand.TestCamelCase.A, withTesting {\n                assertSuccess(enum.execute(sender, PlainText(\"tcc\"), PlainText(\"A\")))\n            })\n            assertEquals(TestEnumArgCommand.TestCamelCase.A, withTesting {\n                assertSuccess(enum.execute(sender, PlainText(\"tcc\"), PlainText(\"a\")))\n            })\n            assertEquals(TestEnumArgCommand.TestCamelCase.B, withTesting {\n                assertSuccess(enum.execute(sender, PlainText(\"tcc\"), PlainText(\"B\")))\n            })\n            assertEquals(TestEnumArgCommand.TestCamelCase.B, withTesting {\n                assertSuccess(enum.execute(sender, PlainText(\"tcc\"), PlainText(\"b\")))\n            })\n            assertEquals(TestEnumArgCommand.TestCamelCase.A_B, withTesting {\n                assertSuccess(enum.execute(sender, PlainText(\"tcc\"), PlainText(\"A_B\")))\n            })\n            assertEquals(TestEnumArgCommand.TestCamelCase.A_B, withTesting {\n                assertSuccess(enum.execute(sender, PlainText(\"tcc\"), PlainText(\"a_b\")))\n            })\n            assertEquals(TestEnumArgCommand.TestCamelCase.A_B, withTesting {\n                assertSuccess(enum.execute(sender, PlainText(\"tcc\"), PlainText(\"aB\")))\n            })\n            withTesting<Unit> {\n                assertFailure(enum.execute(sender, PlainText(\"tc\"), PlainText(\"ENUM_NOT_FOUND\")))\n                Testing.ok(Unit)\n            }\n\n        }\n    }\n\n    @Test\n    fun `test temporal argument`() = runTest {\n        val command = TestTemporalArgCommand()\n        command.withRegistration {\n            val temporal: List<KClass<out TemporalAccessor>> = listOf(\n                Instant::class,\n                Year::class,\n                YearMonth::class,\n                LocalDate::class,\n                LocalTime::class,\n                LocalDateTime::class,\n                OffsetTime::class,\n                OffsetDateTime::class,\n                ZonedDateTime::class,\n                MonthDay::class,\n                ZoneOffset::class\n            )\n\n            for (kClass in temporal) {\n                val subCommand = kClass.simpleName!!\n                val implement: TemporalAccessor = withTesting {\n                    assertSuccess(execute(sender, PlainText(subCommand), PlainText(\"now\")))\n                }\n                assertTrue { kClass.isInstance(implement) }\n                assertEquals(implement, withTesting {\n                    assertSuccess(execute(sender, PlainText(subCommand), PlainText(\"$implement\")))\n                })\n            }\n        }\n    }\n\n    @Test\n    fun testSimpleArgsSplitting() = runTest {\n        simpleCommand.withRegistration {\n            assertEquals(arrayOf(\"test\", \"ttt\", \"tt\").joinToString(), withTesting<MessageChain> {\n                assertSuccess(simpleCommand.execute(sender, PlainText(\"test ttt tt\")))\n            }.joinToString())\n        }\n    }\n\n    @Test\n    fun testSimpleArgsEscape() = runTest {\n        simpleCommand.withRegistration {\n            assertEquals(arrayOf(\"test\", \"esc ape\").joinToString(), withTesting<MessageChain> {\n                assertSuccess(simpleCommand.execute(sender, PlainText(\"test esc\\\\ ape\")))\n            }.joinToString())\n        }\n    }\n\n    @Test\n    fun testSimpleArgsQuote() = runTest {\n        simpleCommand.withRegistration {\n            assertEquals(arrayOf(\"test\", \"esc ape\").joinToString(), withTesting<MessageChain> {\n                assertSuccess(simpleCommand.execute(sender, PlainText(\"test \\\"esc ape\\\"\")))\n            }.joinToString())\n        }\n    }\n\n    @Test\n    fun testSimpleArgsQuoteReject() = runTest {\n        simpleCommand.withRegistration {\n            assertEquals(arrayOf(\"test\", \"es\\\"c\", \"ape\\\"\").joinToString(), withTesting<MessageChain> {\n                assertSuccess(simpleCommand.execute(sender, PlainText(\"test es\\\"c ape\\\"\")))\n            }.joinToString())\n        }\n    }\n\n    @Test\n    fun testSimpleArgsQuoteEscape() = runTest {\n        simpleCommand.withRegistration {\n            assertEquals(arrayOf(\"test\", \"\\\"esc\", \"ape\\\"\").joinToString(), withTesting<MessageChain> {\n                assertSuccess(simpleCommand.execute(sender, PlainText(\"test \\\\\\\"esc ape\\\"\")))\n            }.joinToString())\n        }\n    }\n\n    @Test\n    fun testSimpleArgsMultipleQuotes() = runTest {\n        simpleCommand.withRegistration {\n            assertEquals(arrayOf(\"test\", \"esc ape\", \"1 2\").joinToString(), withTesting<MessageChain> {\n                assertSuccess(simpleCommand.execute(sender, PlainText(\"test \\\"esc ape\\\" \\\"1 2\\\"\")))\n            }.joinToString())\n        }\n    }\n\n    @Test\n    fun testSimpleArgsMisplacedQuote() = runTest {\n        simpleCommand.withRegistration {\n            assertEquals(arrayOf(\"test\", \"esc ape\", \"1\\\"\", \"\\\"2\").joinToString(), withTesting<MessageChain> {\n                assertSuccess(simpleCommand.execute(sender, PlainText(\"test \\\"esc ape\\\" 1\\\" \\\"2 \")))\n            }.joinToString())\n        }\n    }\n\n    @Test\n    fun testSimpleArgsQuoteSpaceEscape() = runTest {\n        simpleCommand.withRegistration {\n            assertEquals(arrayOf(\"test \\\"esc\", \"ape\\\"\").joinToString(), withTesting<MessageChain> {\n                assertSuccess(simpleCommand.execute(sender, PlainText(\"test\\\\ \\\"esc ape\\\"\")))\n            }.joinToString())\n        }\n    }\n\n    @Test\n    fun testSimpleArgsStopParse() = runTest {\n        simpleCommand.withRegistration {\n            assertEquals(arrayOf(\"test\", \"esc ape  \").joinToString(), withTesting<MessageChain> {\n                assertSuccess(simpleCommand.execute(sender, PlainText(\"test -- esc ape  \")))\n            }.joinToString())\n        }\n    }\n\n    @Test\n    fun testSimpleArgsStopParse2() = runTest {\n        simpleCommand.withRegistration {\n            assertEquals(arrayOf(\"test\", \"esc ape  test\\\\12\\\"\\\"3\").joinToString(), withTesting<MessageChain> {\n                assertSuccess(simpleCommand.execute(sender, PlainText(\"test --  esc ape  test\\\\12\\\"\\\"3\")))\n            }.joinToString())\n        }\n    }\n\n    @Test\n    fun testSimpleArgsStopParseReject() = runTest {\n        simpleCommand.withRegistration {\n            assertEquals(arrayOf(\"test--\", \"esc\", \"ape\").joinToString(), withTesting<MessageChain> {\n                assertSuccess(simpleCommand.execute(sender, PlainText(\"test-- esc ape  \")))\n            }.joinToString())\n        }\n    }\n\n    @Test\n    fun testSimpleArgsStopParseEscape() = runTest {\n        simpleCommand.withRegistration {\n            assertEquals(arrayOf(\"test\", \"--\", \"esc\", \"ape\").joinToString(), withTesting<MessageChain> {\n                assertSuccess(simpleCommand.execute(sender, PlainText(\"test \\\\-- esc ape\")))\n            }.joinToString())\n        }\n    }\n\n    @Test\n    fun testSimpleArgsStopParseEscape2() = runTest {\n        simpleCommand.withRegistration {\n            assertEquals(arrayOf(\"test\", \" --\", \"esc\", \"ape\").joinToString(), withTesting<MessageChain> {\n                assertSuccess(simpleCommand.execute(sender, PlainText(\"test \\\\ -- esc ape\")))\n            }.joinToString())\n        }\n    }\n\n    @Test\n    fun testSimpleArgsStopParseQuote() = runTest {\n        simpleCommand.withRegistration {\n            assertEquals(arrayOf(\"test\", \"--\", \"esc\", \"ape\").joinToString(), withTesting<MessageChain> {\n                assertSuccess(simpleCommand.execute(sender, PlainText(\"test \\\"--\\\" esc ape\")))\n            }.joinToString())\n        }\n    }\n\n    val image = Image(\"/f8f1ab55-bf8e-4236-b55e-955848d7069f\")\n\n    @Test\n    fun `PlainText and Image args splitting`() = runTest {\n        simpleCommand.withRegistration {\n            val result = withTesting<MessageChain> {\n                assertSuccess(simpleCommand.execute(sender, buildMessageChain {\n                    +\"test\"\n                    +image\n                    +\"tt\"\n                }))\n            }\n            assertEquals<Any>(arrayOf(\"test\", image, \"tt\").joinToString(), result.toTypedArray().joinToString())\n            assertSame(image, result[1])\n        }\n    }\n\n    @Test\n    fun `test throw Exception`() {\n        runBlocking {\n            assertTrue(sender.executeCommand(\"\").isFailure())\n        }\n    }\n\n    @Test\n    fun `executing command by string command`() = runTest {\n        compositeCommand.withRegistration {\n            val result = withTesting<Int> {\n                assertSuccess(sender.executeCommand(\"/testComposite mute 1\"))\n            }\n\n            assertEquals(1, result)\n        }\n    }\n\n    @Test\n    fun `composite command descriptors`() {\n        val overloads = compositeCommand.overloads\n        assertEquals(\"CommandSignature(<mute>, seconds: Int = ...)\", overloads[0].toString())\n        assertEquals(\"CommandSignature(<mute>, target: Long, seconds: Int)\", overloads[1].toString())\n    }\n\n    @Test\n    fun `composite command executing`() = runTest {\n        compositeCommand.withRegistration {\n            assertEquals(1, withTesting {\n                assertSuccess(compositeCommand.execute(sender, \"mute 1\"))\n            })\n        }\n    }\n\n    @Test\n    fun `test first param command sender`() = runTest {\n        object : CompositeCommand(owner, \"cmd\") {\n            @SubCommand\n            fun handle(sender: CommandSender, arg: String) {\n                Testing.ok(arg)\n            }\n        }.withRegistration {\n            assertEquals(\"test\", withTesting { assertSuccess(execute(sender, \"handle test\")) })\n        }\n\n        object : SimpleCommand(owner, \"cmd\") {\n            @Handler\n            fun handle(sender: CommandSender, arg: String) {\n                Testing.ok(arg)\n            }\n        }.withRegistration {\n            assertEquals(\"hello\", withTesting { assertSuccess(execute(sender, \"hello\")) })\n        }\n\n        object : SimpleCommand(owner, \"cmd\") {\n            @Handler\n            fun handle(arg: String, sender: CommandSender) {\n                Testing.ok(arg)\n            }\n        }.withRegistration {\n            assertFailure(execute(sender, \"hello\"))\n        }\n    }\n\n    @Test\n    fun `composite sub command resolution conflict`() {\n        runBlocking {\n            val composite = object : CompositeCommand(\n                owner,\n                \"tr\"\n            ) {\n                @Suppress(\"UNUSED_PARAMETER\")\n                @SubCommand\n                fun mute(seconds: Int) {\n                    Testing.ok(1)\n                }\n\n                @Suppress(\"UNUSED_PARAMETER\")\n                @SubCommand\n                fun mute(seconds: Int, arg2: Int = 1) {\n                    Testing.ok(2)\n                }\n            }\n\n            registerCommand(composite)\n\n            println(composite.overloads.joinToString())\n\n            composite.withRegistration {\n                assertEquals(\n                    1,\n                    withTesting {\n                        assertSuccess(\n                            composite.execute(\n                                sender,\n                                \"mute 123\"\n                            )\n                        )\n                    }) // one arg, resolves to mute(Int)\n                assertEquals(\n                    2,\n                    withTesting {\n                        assertSuccess(\n                            composite.execute(\n                                sender,\n                                \"mute 123 1\"\n                            )\n                        )\n                    }) // two arg, resolved to mute(Int, Int)\n            }\n        }\n    }\n\n    @Test\n    fun `composite sub command parsing`() {\n        runBlocking {\n            class MyClass(\n                val value: Int,\n            )\n\n            val composite = object : CompositeCommand(\n                owner,\n                \"test22\",\n                overrideContext = buildCommandArgumentContext {\n                    add(object : CommandValueArgumentParser<MyClass> {\n                        override fun parse(raw: String, sender: CommandSender): MyClass {\n                            return MyClass(raw.toInt())\n                        }\n\n                        override fun parse(raw: MessageContent, sender: CommandSender): MyClass {\n                            if (raw is PlainText) return parse(raw.content, sender)\n                            assertSame(image, raw)\n                            return MyClass(2)\n                        }\n                    })\n                }\n            ) {\n                @SubCommand\n                fun mute(seconds: MyClass) {\n                    Testing.ok(seconds)\n                }\n            }\n\n            composite.withRegistration {\n                assertEquals(333, withTesting<MyClass> { assertSuccess(execute(sender, \"mute 333\")) }.value)\n                assertEquals(2, withTesting<MyClass> {\n                    assertSuccess(\n                        execute(sender, buildMessageChain {\n                            +\"mute\"\n                            +image\n                        })\n                    )\n                }.value)\n            }\n        }\n    }\n\n    @Test\n    fun `test simple command`() {\n        runBlocking {\n\n            val simple = object : SimpleCommand(owner, \"test\") {\n                @Handler\n                fun onCommand(string: String) {\n                    Testing.ok(string)\n                }\n            }\n\n            simple.withRegistration {\n                // assertEquals(\"xxx\", withTesting { simple.execute(sender, \"xxx\") })\n                assertEquals(\"xxx\", withTesting { assertSuccess(sender.executeCommand(\"/test xxx\")) })\n            }\n        }\n    }\n\n    @Test\n    fun `test optional argument command`() {\n        runBlocking {\n            val optionCommand = object : CompositeCommand(\n                owner,\n                \"testOptional\"\n            ) {\n                @SubCommand\n                fun optional(arg1: String, arg2: String = \"Here is optional\", arg3: String? = null) {\n                    println(arg1)\n                    println(arg2)\n                    println(arg3)\n//                    println(arg3)\n                    Testing.ok(Unit)\n                }\n            }\n            optionCommand.withRegistration {\n                withTesting<Unit> {\n                    assertSuccess(sender.executeCommand(\"/testOptional optional 1\"))\n                }\n            }\n        }\n    }\n\n    @Test\n    fun `test vararg`() {\n        runBlocking {\n            val optionCommand = object : CompositeCommand(\n                owner,\n                \"test\"\n            ) {\n                @SubCommand\n                fun vararg(arg1: Int, vararg x: String) {\n                    assertEquals(1, arg1)\n                    Testing.ok(x)\n                }\n\n                @SubCommand\n                fun enum(arg1: Int, vararg y: TestEnumArgCommand.TestEnum) {\n                    assertEquals(1, arg1)\n                    Testing.ok(y)\n                }\n\n                @SubCommand\n                fun long(arg1: String, vararg z: Long) {\n                    assertEquals(\"arg1\", arg1)\n                    Testing.ok(z)\n                }\n\n                @SubCommand\n                fun int(arg1: String, vararg z: Int) {\n                    assertEquals(\"arg1\", arg1)\n                    Testing.ok(z)\n                }\n\n                @SubCommand\n                fun byte(arg1: String, vararg z: Byte) {\n                    assertEquals(\"arg1\", arg1)\n                    Testing.ok(z)\n                }\n\n                @SubCommand\n                fun short(arg1: String, vararg z: Short) {\n                    assertEquals(\"arg1\", arg1)\n                    Testing.ok(z)\n                }\n\n                @SubCommand\n                fun float(arg1: String, vararg z: Float) {\n                    assertEquals(\"arg1\", arg1)\n                    Testing.ok(z)\n                }\n\n                @SubCommand\n                fun double(arg1: String, vararg z: Double) {\n                    assertEquals(\"arg1\", arg1)\n                    Testing.ok(z)\n                }\n\n                @SubCommand\n                fun char(arg1: String, vararg z: Char) {\n                    assertEquals(\"arg1\", arg1)\n                    Testing.ok(z)\n                }\n            }\n            optionCommand.withRegistration {\n                // Array<String>\n                assertContentEquals(\n                    emptyArray<String>(),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test vararg 1\"))\n                    }\n                )\n                assertContentEquals(\n                    arrayOf(\"s\"),\n                    withTesting<Array<String>> {\n                        assertSuccess(sender.executeCommand(\"/test vararg 1 s\"))\n                    }\n                )\n                assertContentEquals(\n                    arrayOf(\"s\", \"s\", \"s\"),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test vararg 1 s s s\"))\n                    }\n                )\n                // Array<TestEnum>\n                assertContentEquals(\n                    emptyArray<TestEnumArgCommand.TestEnum>(),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test enum 1\"))\n                    }\n                )\n                assertContentEquals(\n                    arrayOf(TestEnumArgCommand.TestEnum.V1),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test enum 1 ${TestEnumArgCommand.TestEnum.V1}\"))\n                    }\n                )\n                assertContentEquals(\n                    TestEnumArgCommand.TestEnum.values(),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test enum 1 ${TestEnumArgCommand.TestEnum.values().joinToString(\" \")}\"))\n                    }\n                )\n                // LongArray\n                assertContentEquals(\n                    longArrayOf(),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test long arg1\"))\n                    }\n                )\n                assertContentEquals(\n                    longArrayOf(1),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test long arg1 1\"))\n                    }\n                )\n                assertContentEquals(\n                    longArrayOf(1, 2, 3),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test long arg1 1 2 3\"))\n                    }\n                )\n                // IntArray\n                assertContentEquals(\n                    intArrayOf(),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test int arg1\"))\n                    }\n                )\n                assertContentEquals(\n                    intArrayOf(1),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test int arg1 1\"))\n                    }\n                )\n                assertContentEquals(\n                    intArrayOf(1, 2, 3),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test int arg1 1 2 3\"))\n                    }\n                )\n                // ByteArray\n                assertContentEquals(\n                    byteArrayOf(),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test byte arg1\"))\n                    }\n                )\n                assertContentEquals(\n                    byteArrayOf(1),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test byte arg1 1\"))\n                    }\n                )\n                assertContentEquals(\n                    byteArrayOf(1, 2, 3),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test byte arg1 1 2 3\"))\n                    }\n                )\n                // ShortArray\n                assertContentEquals(\n                    shortArrayOf(),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test short arg1\"))\n                    }\n                )\n                assertContentEquals(\n                    shortArrayOf(1),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test short arg1 1\"))\n                    }\n                )\n                assertContentEquals(\n                    shortArrayOf(1, 2, 3),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test short arg1 1 2 3\"))\n                    }\n                )\n                // FloatArray\n                assertContentEquals(\n                    floatArrayOf(),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test float arg1\"))\n                    }\n                )\n                assertContentEquals(\n                    floatArrayOf(1.0F),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test float arg1 1\"))\n                    }\n                )\n                assertContentEquals(\n                    floatArrayOf(1.0F, 1.5F, 2.0F),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test float arg1 1 1.5 2\"))\n                    }\n                )\n                // DoubleArray\n                assertContentEquals(\n                    doubleArrayOf(),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test double arg1\"))\n                    }\n                )\n                assertContentEquals(\n                    doubleArrayOf(1.0),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test double arg1 1\"))\n                    }\n                )\n                assertContentEquals(\n                    doubleArrayOf(1.0, 1.5, 2.0),\n                    withTesting {\n                        assertSuccess(sender.executeCommand(\"/test double arg1 1 1.5 2\"))\n                    }\n                )\n            }\n        }\n    }\n}\n\n@OptIn(ExperimentalCommandDescriptors::class)\ninternal fun assertSuccess(result: CommandExecuteResult) {\n    if (result.isFailure()) {\n        throw result.exception ?: AssertionError(result.toString())\n    }\n}\n\n@OptIn(ExperimentalCommandDescriptors::class)\ninternal fun assertFailure(result: CommandExecuteResult) {\n    if (!result.isFailure()) {\n        throw AssertionError(\"$result not a failure\")\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/command/JSimpleTest.java",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage command;\n\nimport net.mamoe.mirai.console.command.java.JSimpleCommand;\nimport net.mamoe.mirai.console.plugin.jvm.JavaPlugin;\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription;\n\npublic class JSimpleTest {\n    @SuppressWarnings(\"PluginMainServiceNotConfiguredJava\")\n    private static class Main extends JavaPlugin {\n        public Main(JvmPluginDescription description) {\n            super(description);\n        }\n    }\n\n    static class T extends JSimpleCommand {\n        public T() {\n            super(new Main(null), \"name\");\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/command/commanTestingUtil.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.command\n\nimport net.mamoe.mirai.console.command.CommandManager.INSTANCE.register\nimport net.mamoe.mirai.console.command.CommandManager.INSTANCE.unregisterCommand\n\ninline fun <T : Command, R> T.withRegistration(block: T.() -> R): R {\n    this.register()\n    try {\n        return block()\n    } finally {\n        unregisterCommand(this)\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/configuration/AutoLoginTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.configuration\n\nimport net.mamoe.mirai.console.MiraiConsoleImplementation.Companion.start\nimport net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig\nimport net.mamoe.mirai.console.testFramework.AbstractConsoleInstanceTest\nimport net.mamoe.mirai.console.testFramework.MockConsoleImplementation\nimport net.mamoe.mirai.event.events.BotOnlineEvent\nimport net.mamoe.mirai.event.globalEventChannel\nimport net.mamoe.mirai.utils.BotConfiguration\nimport org.junit.jupiter.api.Disabled\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\nclass AutoLoginTest : AbstractConsoleInstanceTest() {\n\n    @Disabled // no mock login\n    @Test\n    fun testHeartbeatStrategy() {\n        stopConsole() // stop previous console\n        val console = MockConsoleImplementation()\n        val config = AutoLoginConfig()\n        config.accounts.clear()\n        config.accounts.add(\n            AutoLoginConfig.Account(\n                \"111\",\n                AutoLoginConfig.Account.Password(AutoLoginConfig.Account.PasswordKind.PLAIN, \"pwd\"),\n                configuration = mapOf(AutoLoginConfig.Account.ConfigurationKey.heartbeatStrategy to \"REGISTER\")\n            )\n        )\n        console.consoleDataScope.addAndReloadConfig(config)\n        console.globalEventChannel().subscribeAlways<BotOnlineEvent> {\n            assertEquals(BotConfiguration.HeartbeatStrategy.REGISTER, this.bot.configuration.heartbeatStrategy)\n        }\n        console.start()\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/data/JAutoSavePluginDataTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.data\n\nimport net.mamoe.mirai.console.data.java.JavaAutoSavePluginData\nimport net.mamoe.mirai.console.plugin.jvm.reloadPluginData\nimport net.mamoe.mirai.console.testFramework.AbstractConsoleInstanceTest\nimport net.mamoe.mirai.console.util.JavaFriendlyApi\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\n\nclass JAutoSavePluginDataTest : AbstractConsoleInstanceTest() {\n    @OptIn(JavaFriendlyApi::class)\n    class MyData : JavaAutoSavePluginData(\"testSaveName\") {\n        val strMember: Value<String> = value(\"strMember\", \"str\")\n        val intMember: Value<Int> = value(\"intMember\", 1)\n\n        val typed: Value<List<String>> = typedValue(\n            \"typed\",\n            createKType(\n                List::class.java,\n                false,\n                createKType(String::class.java, false)\n            ),\n            listOf(\"aa\", \"bb\")\n        )\n    }\n\n    @Test\n    fun `can reload`() {\n        val instance = MyData()\n        mockPlugin.reloadPluginData(instance)\n        assertEquals(\"str\", instance.strMember.value)\n        assertEquals(Integer.valueOf(1), instance.intMember.value)\n        assertEquals(listOf(\"aa\", \"bb\"), instance.typed.value)\n\n        assertEquals(\n            \"\"\"\n            strMember: str\n            intMember: 1\n            typed: \n              - aa\n              - bb\n        \"\"\".trimIndent(), mockPlugin.dataFolder.resolve(\"testSaveName.yml\").readText()\n        )\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/data/JavaPluginDescriptionTests.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\npackage net.mamoe.mirai.console.data\n\nimport net.mamoe.mirai.console.testFramework.AbstractConsoleInstanceTest\n\n@Suppress(\"unused\")\nclass JavaPluginDescriptionTests : AbstractConsoleInstanceTest() {\n\n//    @Test\n//    fun testSimpleValue() {\n//        class MyJavaData : JAutoSavePluginData(\"data\") {\n//            val list: Value<String> = value(\"str\")\n//        }\n//\n//        val d = MyJavaData()\n//        mockPlugin.reloadPluginData(d)\n//        assertEquals(\"str\", d.list.value)\n//    }\n//\n//    @Test\n//    fun testValueSet() {\n//        class MyJavaData : JAutoSavePluginData(\"data\") {\n//            val list: Value<Set<String>> = typedValue(createKType(MutableSet::class.java, createKType(String::class.java)))\n//        }\n//\n//        mockPlugin.reloadPluginData(MyJavaData())\n//    }\n\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/data/MultiFilePluginDataStorageImplTests.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.data\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.JsonClassDiscriminator\nimport net.mamoe.mirai.console.internal.data.MultiFilePluginDataStorageImpl\nimport net.mamoe.mirai.console.testFramework.AbstractConsoleInstanceTest\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.io.TempDir\nimport java.nio.file.Path\nimport kotlin.test.assertEquals\n\ninternal class MultiFilePluginDataStorageImplTests : AbstractConsoleInstanceTest() {\n    @TempDir\n    internal lateinit var storePath: Path\n\n    @Serializable\n    @JsonClassDiscriminator(\"base_type\")\n    internal sealed class Base // not using interface, see https://github.com/Kotlin/kotlinx.serialization/issues/2181\n\n    @Serializable\n    @SerialName(\"DerivedA\")\n    internal data class DerivedA(val valueA: Double) : Base()\n\n    @Serializable\n    @SerialName(\"DerivedB\")\n    internal data class DerivedB(val valueB: String) : Base()\n\n    @Serializable\n    @SerialName(\"DerivedC\")\n    internal object DerivedC : Base() {\n        @Suppress(\"unused\")\n        const val valueC: Int = 42\n    }\n\n    private class YamlPluginData : AutoSavePluginData(\"test_yaml\") {\n        var int by value(1)\n        val map: MutableMap<String, String> by value()\n        val map2: MutableMap<String, MutableMap<String, String>> by value()\n\n        companion object {\n            val string = \"\"\"\n                int: 2\n                map: \n                  key1: value1\n                  key2: value2\n                map2: \n                  key1: \n                    key1: value1\n                    key2: value2\n                  key2: \n                    key1: value1\n                    key2: value2\n            \"\"\".trimIndent()\n        }\n    }\n\n    private class JsonPluginData : AutoSavePluginData(\"test_json\") {\n        override val saveType = PluginData.SaveType.JSON\n\n        val baseMap: MutableMap<String, Base> by value()\n\n        companion object {\n            val string = \"\"\"\n                {\n                    \"baseMap\": {\n                        \"A\": {\n                            \"base_type\": \"DerivedA\",\n                            \"valueA\": 11.4514\n                        },\n                        \"B\": {\n                            \"base_type\": \"DerivedB\",\n                            \"valueB\": \"mamoe.mirai\"\n                        },\n                        \"C\": {\n                            \"base_type\": \"DerivedC\"\n                        }\n                    }\n                }\n            \"\"\".trimIndent()\n        }\n    }\n\n    private val dataStorage by lazy { MultiFilePluginDataStorageImpl(storePath) }\n\n    @Test\n    fun testYamlLoad() {\n        val data = YamlPluginData()\n        dataStorage.load(mockPlugin, data)\n        dataStorage.getPluginDataFileInternal(mockPlugin, data).writeText(YamlPluginData.string)\n        dataStorage.load(mockPlugin, data)\n\n        assertEquals(2, data.int)\n        assertEquals(mapOf(\"key1\" to \"value1\", \"key2\" to \"value2\"), data.map)\n        assertEquals(\n            mapOf(\n                \"key1\" to mapOf(\"key1\" to \"value1\", \"key2\" to \"value2\"),\n                \"key2\" to mapOf(\"key1\" to \"value1\", \"key2\" to \"value2\")\n            ), data.map2\n        )\n    }\n\n    @Test\n    fun testYamlStore() {\n        val data = YamlPluginData()\n        dataStorage.load(mockPlugin, data)\n\n        data.int = 2\n        data.map[\"key1\"] = \"value1\"\n        data.map[\"key2\"] = \"value2\"\n        data.map2[\"key1\"] = mutableMapOf(\"key1\" to \"value1\", \"key2\" to \"value2\")\n        data.map2[\"key2\"] = mutableMapOf(\"key1\" to \"value1\", \"key2\" to \"value2\")\n\n        dataStorage.store(mockPlugin, data)\n\n        val file = dataStorage.getPluginDataFileInternal(mockPlugin, data)\n        assertEquals(YamlPluginData.string, file.readText())\n    }\n\n    @Test\n    fun testJsonLoad() {\n        val data = JsonPluginData()\n        dataStorage.load(mockPlugin, data)\n        dataStorage.getPluginDataFileInternal(mockPlugin, data).writeText(JsonPluginData.string)\n        dataStorage.load(mockPlugin, data)\n\n        assertEquals(\n            mapOf(\n                \"A\" to DerivedA(11.4514),\n                \"B\" to DerivedB(\"mamoe.mirai\"),\n                \"C\" to DerivedC\n            ), data.baseMap\n        )\n    }\n\n    @Test\n    fun testJsonStore() {\n        val data = JsonPluginData()\n        dataStorage.load(mockPlugin, data)\n\n        data.baseMap[\"A\"] = DerivedA(11.4514)\n        data.baseMap[\"B\"] = DerivedB(\"mamoe.mirai\")\n        data.baseMap[\"C\"] = DerivedC\n\n        dataStorage.store(mockPlugin, data)\n\n        val file = dataStorage.getPluginDataFileInternal(mockPlugin, data)\n        assertEquals(JsonPluginData.string, file.readText())\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/data/PluginDataTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.data\n\nimport kotlinx.serialization.builtins.serializer\nimport kotlinx.serialization.json.Json\nimport kotlinx.serialization.modules.SerializersModule\nimport net.mamoe.mirai.console.internal.data.MultiFilePluginDataStorageImpl\nimport net.mamoe.mirai.console.testFramework.AbstractConsoleInstanceTest\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.PlainText\nimport net.mamoe.mirai.message.data.SingleMessage\nimport net.mamoe.mirai.message.data.messageChainOf\nimport net.mamoe.mirai.utils.mapPrimitive\nimport org.junit.jupiter.api.io.TempDir\nimport java.nio.file.Path\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertSame\n\ninternal class PluginDataTest : AbstractConsoleInstanceTest() {\n    @TempDir\n    lateinit var tempDir: Path\n\n    class MyPluginData : AutoSavePluginData(\"test\") {\n        var int by value(1)\n        val map: MutableMap<String, String> by value()\n        val map2: MutableMap<String, MutableMap<String, String>> by value()\n    }\n\n    @Suppress(\"unused\")\n    private val jsonPrettyPrint = Json {\n        prettyPrint = true\n        encodeDefaults = true\n    }\n    private val json = Json { encodeDefaults = true }\n\n    @Test\n    fun testStringify() {\n        val data = MyPluginData()\n\n        var string = json.encodeToString(data.updaterSerializer, Unit)\n        assertEquals(\"\"\"{\"int\":1,\"map\":{},\"map2\":{}}\"\"\", string)\n\n        data.int = 2\n\n        string = json.encodeToString(data.updaterSerializer, Unit)\n        assertEquals(\"\"\"{\"int\":2,\"map\":{},\"map2\":{}}\"\"\", string)\n    }\n\n    @Test\n    fun testParseUpdate() {\n        val data = MyPluginData()\n\n        assertEquals(1, data.int)\n\n        json.decodeFromString(\n            data.updaterSerializer, \"\"\"\n                {\"int\":3,\"map\":{},\"map2\":{}}\n            \"\"\".trimIndent()\n        )\n\n        assertEquals(3, data.int)\n    }\n\n    @Test\n    fun testNestedParseUpdate() {\n        val data = MyPluginData()\n\n        fun delegation() = data.map\n\n        val refBefore = data.map\n        fun reference() = refBefore\n\n        assertEquals(mutableMapOf(), delegation()) // delegation\n\n        json.decodeFromString(\n            data.updaterSerializer, \"\"\"\n                {\"int\":1,\"map\":{\"t\":\"test\"},\"map2\":{}}\n            \"\"\".trimIndent()\n        )\n\n        assertEquals(mapOf(\"t\" to \"test\").toString(), delegation().toString())\n        assertEquals(mapOf(\"t\" to \"test\").toString(), reference().toString())\n\n        assertSame(reference(), delegation()) // check shadowing\n    }\n\n    @Test\n    fun testDeepNestedParseUpdate() {\n        val data = MyPluginData()\n\n        fun delegation() = data.map2\n\n        val refBefore = data.map2\n        fun reference() = refBefore\n\n        assertEquals(mutableMapOf(), delegation()) // delegation\n\n        json.decodeFromString(\n            data.updaterSerializer, \"\"\"\n                {\"int\":1,\"map\":{},\"map2\":{\"t\":{\"f\":\"test\"}}}\n            \"\"\".trimIndent()\n        )\n\n        assertEquals(mapOf(\"t\" to mapOf(\"f\" to \"test\")).toString(), delegation().toString())\n        assertEquals(mapOf(\"t\" to mapOf(\"f\" to \"test\")).toString(), reference().toString())\n\n        assertSame(reference(), delegation()) // check shadowing\n    }\n\n    @Test\n    fun testDeepNestedTrackingParseUpdate() {\n        val data = MyPluginData()\n\n        data.map2[\"t\"] = mutableMapOf()\n\n        fun delegation() = data.map2[\"t\"]!!\n\n        val refBefore = data.map2[\"t\"]!!\n        fun reference() = refBefore\n\n        assertEquals(mutableMapOf(), delegation()) // delegation\n\n        json.decodeFromString(\n            data.updaterSerializer, \"\"\"\n                {\"int\":1,\"map\":{},\"map2\":{\"t\":{\"f\":\"test\"}}}\n            \"\"\".trimIndent()\n        )\n\n        assertEquals(mapOf(\"f\" to \"test\").toString(), delegation().toString())\n        assertEquals(mapOf(\"f\" to \"test\").toString(), reference().toString())\n\n        assertSame(reference(), delegation()) // check shadowing\n    }\n\n\n    class SupportsMessageChain : AutoSavePluginData(\"test\") {\n        val chain: MessageChain by value(messageChainOf(PlainText(\"str\")))\n    }\n\n    @Test\n    fun `supports message chain`() {\n        assertEquals(\n            \"\"\"\n            chain: \n              - type: PlainText\n                value: \n                  content: str\n        \"\"\".trimIndent(), serializePluginData(SupportsMessageChain())\n        )\n        serializeAndRereadPluginData(SupportsMessageChain())\n    }\n\n    class SupportsPolymorphicCorrectly : AutoSavePluginData(\"test\") {\n        val singleMessage: SingleMessage by value(PlainText(\"str\"))\n        val plainText: PlainText by value(PlainText(\"str\"))\n    }\n\n    @Test\n    fun `supports polymorphic correctly`() {\n        assertEquals(\n            \"\"\"\n            singleMessage: \n              type: PlainText\n              value: \n                content: str\n            plainText: \n              content: str\n        \"\"\".trimIndent(), serializePluginData(SupportsPolymorphicCorrectly())\n        )\n        serializeAndRereadPluginData(SupportsPolymorphicCorrectly())\n    }\n\n    class SupportsSerializersModule : AutoSavePluginData(\"test\") {\n        override val serializersModule: SerializersModule = SerializersModule {\n            contextual(MyClass::class, myClassSerializer)\n        }\n\n        val v: MyClass by value(MyClass(\"test\"))\n\n        data class MyClass(\n            val str: String\n        )\n\n        companion object {\n            private val myClassSerializer = String.serializer().mapPrimitive(\"MyClass\",\n                { MyClass(it) },\n                { it.str }\n            )\n        }\n    }\n\n    @Test\n    fun `supports serializers module`() {\n        assertEquals(\n            \"\"\"\n            v: test\n        \"\"\".trimIndent(), serializePluginData(SupportsSerializersModule())\n        )\n        serializeAndRereadPluginData(SupportsSerializersModule())\n    }\n\n\n    private fun serializePluginData(data: PluginData): String {\n        val storage = MultiFilePluginDataStorageImpl(tempDir)\n        storage.store(mockPlugin, data)\n        return storage.getPluginDataFileInternal(mockPlugin, data).readText()\n    }\n\n    private fun serializeAndRereadPluginData(data: PluginData) {\n        val storage = MultiFilePluginDataStorageImpl(tempDir)\n        storage.store(mockPlugin, data)\n        val serialized = storage.getPluginDataFileInternal(mockPlugin, data).readText()\n        storage.load(mockPlugin, data)\n        assertEquals(serialized, storage.getPluginDataFileInternal(mockPlugin, data).readText())\n    }\n\n\n    class DefaultValueForArray : AutoSavePluginData(\"save\") {\n        val byteArray: ByteArray by value()\n        val booleanArray: BooleanArray by value()\n        var shortArray: ShortArray by value()\n        val intArray: IntArray by value()\n        val longArray: LongArray by value()\n        val floatArray: FloatArray by value()\n        val doubleArray: DoubleArray by value()\n        val charArray: CharArray by value()\n\n        var stringArray: Array<String> by value()\n        var longObjectArray: Array<Long> by value()\n    }\n\n    @Test\n    fun `default value for array`() {\n        val instance = DefaultValueForArray()\n        assertEquals(\n            \"\"\"\n                byteArray: []\n                booleanArray: []\n                shortArray: []\n                intArray: []\n                longArray: []\n                floatArray: []\n                doubleArray: []\n                charArray: []\n                stringArray: []\n                longObjectArray: []\n            \"\"\".trimIndent(),\n            serializePluginData(instance)\n        )\n        instance.shortArray = shortArrayOf(1)\n        instance.stringArray = arrayOf(\"1234\")\n        println(instance.findBackingFieldValueNode(instance::longObjectArray))\n        instance.longObjectArray = arrayOf(1234)\n        assertEquals(\n            \"\"\"\n                byteArray: []\n                booleanArray: []\n                shortArray: \n                  - 1\n                intArray: []\n                longArray: []\n                floatArray: []\n                doubleArray: []\n                charArray: []\n                stringArray: \n                  - 1234\n                longObjectArray: \n                  - 1234\n            \"\"\".trimIndent(),\n            serializePluginData(instance)\n        )\n        serializeAndRereadPluginData(instance)\n    }\n\n    class DefaultValueForCollections : AutoSavePluginData(\"save\") {\n        val map: Map<String, String> by value()\n        val mapAny: Map<String, Any> by value()\n        val hashMapAny: HashMap<String, Any> by value()\n        val linkedHashMapAny: LinkedHashMap<String, Any> by value()\n\n        val list: List<String> by value()\n        val listAny: List<Any> by value()\n\n        val set: Set<String> by value()\n        val setAny: Set<Any> by value()\n    }\n\n    @Test\n    fun `default value for collections`() {\n        val instance = DefaultValueForCollections()\n        assertEquals(\n            \"\"\"\n                map: {}\n\n                mapAny: {}\n\n                hashMapAny: {}\n\n                linkedHashMapAny: {}\n\n                list: []\n                listAny: []\n                set: []\n                setAny: []\n            \"\"\".trimIndent(),\n            serializePluginData(instance)\n        )\n        serializeAndRereadPluginData(instance)\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/data/PluginMovingTests.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.data\n\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.internal.data.mkdir\nimport net.mamoe.mirai.console.plugin.PluginManager\nimport net.mamoe.mirai.console.plugin.PluginManager.INSTANCE.load\nimport net.mamoe.mirai.console.plugin.id\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport net.mamoe.mirai.console.plugin.name\nimport net.mamoe.mirai.console.testFramework.AbstractConsoleInstanceTest\nimport kotlin.test.Test\n\nclass PluginMovingTests : AbstractConsoleInstanceTest() {\n    private val mockPluginWithName by lazy {\n        object : KotlinPlugin(JvmPluginDescription(\"org.test1.test1\", \"1.0.0\", \"test1\")) {}\n    }\n\n    private val mockPluginWithName2 by lazy {\n        object : KotlinPlugin(JvmPluginDescription(\"org.test2.test2\", \"1.0.0\", \"test2\")) {}\n    }\n\n    private val mockPluginWithName3 by lazy {\n        object : KotlinPlugin(JvmPluginDescription(\"org.test2.test3\", \"1.0.0\", \"test3\")) {}\n    }\n\n    private fun mkdir(abstractPath: String) = PluginManager.pluginsDataPath.resolve(abstractPath).mkdir()\n\n    //@Disabled // disabled since test framework fails\n    @Test\n    fun movingPluginPath() {\n        // Normal move\n        mkdir(mockPlugin.name)\n        assert(!MiraiConsole.job.isCancelled)\n        // when id == name\n        mkdir(mockPluginWithName.name)\n        mockPluginWithName.load()\n        assert(!MiraiConsole.job.isCancelled)\n        // move to empty folder\n        mkdir(mockPluginWithName2.name)\n        mkdir(mockPluginWithName2.id)\n        mockPluginWithName2.load()\n        assert(!MiraiConsole.job.isCancelled)\n        // fail move\n        mkdir(mockPluginWithName3.name)\n        mkdir(mockPluginWithName3.id)\n        PluginManager.pluginsDataPath.resolve(mockPluginWithName3.id).toFile().resolve(\"x\").createNewFile()\n        mockPluginWithName3.load()\n        assert(MiraiConsole.job.isCancelled)\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/extension/GlobalComponentStorageTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.extension\n\nimport net.mamoe.mirai.console.internal.extension.GlobalComponentStorage\nimport net.mamoe.mirai.console.internal.extension.GlobalComponentStorageImpl\nimport net.mamoe.mirai.console.testFramework.AbstractConsoleInstanceTest\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class GlobalComponentStorageTest : AbstractConsoleInstanceTest() {\n    class MyInstance\n\n    class MyExtension(override val instance: MyInstance, override val priority: Int) : InstanceExtension<MyInstance> {\n        companion object EP : AbstractInstanceExtensionPoint<MyExtension, MyInstance>(MyExtension::class)\n    }\n\n    @Test\n    fun `can register`() {\n        GlobalComponentStorage.contributeConsole(MyExtension, MyExtension(MyInstance(), 1))\n        GlobalComponentStorage.contributeConsole(MyExtension, MyExtension(MyInstance(), 2))\n        GlobalComponentStorage.getExtensionsList(MyExtension).run {\n            assertEquals(2, size)\n        }\n    }\n\n    @Test\n    fun `can contribute`() {\n        GlobalComponentStorage.contribute(MyExtension, mockPlugin, MyExtension(MyInstance(), 1))\n        GlobalComponentStorage.contribute(MyExtension, mockPlugin, MyExtension(MyInstance(), 2))\n        GlobalComponentStorage.getExtensionsList(MyExtension).run {\n            assertEquals(2, size)\n        }\n    }\n\n    @Test\n    fun `can sort by priority`() {\n        GlobalComponentStorage.contributeConsole(MyExtension, MyExtension(MyInstance(), 1))\n        GlobalComponentStorage.contributeConsole(MyExtension, MyExtension(MyInstance(), 2))\n        GlobalComponentStorage.getExtensionsList(MyExtension).run {\n            assertEquals(2, size)\n            assertEquals(2, first().extension.priority)\n            assertEquals(1, get(1).extension.priority)\n        }\n    }\n\n    @Test\n    fun `can sort by priority 2`() {\n        GlobalComponentStorage.contributeConsole(MyExtension, MyExtension(MyInstance(), 2))\n        GlobalComponentStorage.contributeConsole(MyExtension, MyExtension(MyInstance(), 1))\n        GlobalComponentStorage.getExtensionsList(MyExtension).run {\n            assertEquals(2, size)\n            assertEquals(2, first().extension.priority)\n            assertEquals(1, get(1).extension.priority)\n        }\n    }\n\n    @Test\n    fun `can fold`() {\n        GlobalComponentStorage.contributeConsole(MyExtension, MyExtension(MyInstance(), 2))\n        GlobalComponentStorage.contributeConsole(MyExtension, MyExtension(MyInstance(), 1))\n        val list = GlobalComponentStorage.foldExtensions(MyExtension, listOf<MyExtension>()) { acc, extension ->\n            acc + extension\n        }\n        assertEquals(2, list.size)\n        assertEquals(2, list.first().priority)\n        assertEquals(1, list[1].priority)\n    }\n}\n\nprivate fun <T : Extension> GlobalComponentStorageImpl.getExtensionsList(ep: ExtensionPoint<T>): List<ExtensionRegistry<T>> {\n    return getExtensions(ep).toList()\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/logging/TestAbstractLoggerController.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.logging\n\nimport net.mamoe.mirai.utils.SimpleLogger\nimport org.junit.jupiter.api.Test\nimport kotlin.test.assertEquals\n\ninternal class TestAbstractLoggerController {\n    private class TestController(\n        override val isLoggerControlStateSupported: Boolean,\n    ) : AbstractLoggerController() {\n        var callcount = 0\n\n\n        override fun getPriority(identity: String?): LogPriority {\n            return LogPriority.ALL\n        }\n\n        override fun shouldLog(identity: String?, priority: SimpleLogger.LogPriority): Boolean {\n            if (priority == SimpleLogger.LogPriority.INFO) {\n                callcount++\n            }\n            return super.shouldLog(identity, priority)\n        }\n    }\n\n    @Test\n    fun `test logger control state caching`() {\n        val controller = TestController(true)\n        assertEquals(0, controller.callcount)\n        val state = controller.getLoggerControlState(\"Test\")\n        assertEquals(0, controller.callcount) // lazy load\n\n        state.shouldLog(SimpleLogger.LogPriority.DEBUG)\n        assertEquals(1, controller.callcount)\n\n        state.shouldLog(SimpleLogger.LogPriority.INFO)\n        assertEquals(1, controller.callcount)\n\n        state.shouldLog(SimpleLogger.LogPriority.DEBUG)\n        state.shouldLog(SimpleLogger.LogPriority.INFO)\n        state.shouldLog(SimpleLogger.LogPriority.INFO)\n        assertEquals(1, controller.callcount)\n    }\n\n    @Test\n    fun `test keep binary compatibility`() {\n        val controller = TestController(false)\n        assertEquals(0, controller.callcount)\n        val state = controller.getLoggerControlState(\"Test\")\n        assertEquals(0, controller.callcount)\n\n        repeat(50) { count ->\n            state.shouldLog(SimpleLogger.LogPriority.INFO)\n            assertEquals(count + 1, controller.callcount)\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/logging/TestAbstractLoggerController_PathBased.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.logging\n\nimport kotlin.test.Test\n\n@Suppress(\"ClassName\")\ninternal class TestAbstractLoggerController_PathBased {\n    @Test\n    fun `test AbstractLoggerController$PathBased`() {\n        val config = mapOf(\n            \"test\" to \"ALL\",\n            \"test.test\" to \"VERBOSE\",\n            \"test.test.test\" to \"NONE\",\n        ).mapValues { AbstractLoggerController.LogPriority.valueOf(it.value) }\n\n        val c = object : AbstractLoggerController.PathBased() {\n            override val defaultPriority: LogPriority\n                get() = LogPriority.NONE\n\n            override fun findPriority(identity: String?): LogPriority? {\n                if (identity == null) return defaultPriority\n                return config[identity]\n            }\n\n            fun priority(i: String?): LogPriority = getPriority(i)\n        }\n\n        fun assertSame(path: String?, p: String) {\n            kotlin.test.assertSame(c.priority(path), AbstractLoggerController.LogPriority.valueOf(p))\n        }\n\n        assertSame(\"test.test.test\", \"NONE\")\n        assertSame(\"test.test.test.more.test\", \"NONE\")\n\n        assertSame(\"test.test.t1\", \"VERBOSE\")\n        assertSame(\"test.test.t15w\", \"VERBOSE\")\n        assertSame(\"test.test\", \"VERBOSE\")\n\n        assertSame(\"test\", \"ALL\")\n        assertSame(\"test.tes1ww\", \"ALL\")\n        assertSame(\"test.asldjawe.awej2oi3\", \"ALL\")\n\n        assertSame(\"AWawex\", \"NONE\")\n        assertSame(\"awpejaszx.aljewkz\", \"NONE\")\n        assertSame(\"test0.awekjo23xxxxx\", \"NONE\")\n    }\n}\n"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/permission/PermissionServiceTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.permission\n\nimport net.mamoe.mirai.console.internal.permission.BuiltInPermissionService\nimport net.mamoe.mirai.console.internal.permission.PermissionImpl\nimport kotlin.test.*\n\ninternal class PermissionServiceTest {\n\n    @Test\n    fun `test built in`() {\n        val builtIn: PermissionService<PermissionImpl> = BuiltInPermissionService()\n        assertEquals(PermissionId.parseFromString(\"*:*\"), builtIn.rootPermission.id)\n\n        val plugin = builtIn.register(PermissionId.parseFromString(\"plugin:*\"), \"\", builtIn.rootPermission)\n        assertEquals(builtIn[PermissionId.parseFromString(\"plugin:*\")], plugin)\n\n        val command = builtIn.register(PermissionId.parseFromString(\"plugin:command\"), \"\", plugin)\n        assertEquals(builtIn[PermissionId.parseFromString(\"plugin:command\")], command)\n\n        val any = AbstractPermitteeId.parseFromString(\"m12345.*\")\n        val member =  AbstractPermitteeId.parseFromString(\"m12345.6789\")\n\n        assertFalse { builtIn.testPermission(any, plugin) }\n\n        // test permit\n        builtIn.permit(any, plugin)\n        assertTrue { builtIn.testPermission(any, plugin) }\n        assertTrue { builtIn.testPermission(member, plugin) }\n        assertTrue { builtIn.testPermission(any, command) }\n        assertTrue { builtIn.testPermission(member, command) }\n\n        // test cancel fail (by parent)\n        val cause1 = assertFails { builtIn.cancel(member, command, false) }\n        assertTrue { cause1 is UnsupportedOperationException }\n        assertEquals(\"\"\"\n            m12345.6789 的 plugin:command 权限来自\n            m12345.* plugin:*\n            Mirai Console 内置权限系统目前不支持单独禁用继承得到的权限. 可取消继承来源再为其分别分配.\n            \n        \"\"\".trimIndent(), cause1.message)\n\n        // test recursive cancel\n        builtIn.cancel(any, builtIn.rootPermission, true)\n        assertFalse { builtIn.testPermission(any, plugin) }\n        assertFalse { builtIn.testPermission(member, plugin) }\n        assertFalse { builtIn.testPermission(any, command) }\n        assertFalse { builtIn.testPermission(member, command) }\n\n        // test cancel (no permit)\n        val cause2 = assertFails { builtIn.cancel(member, command, false) }\n        assertTrue { cause2 is UnsupportedOperationException }\n        assertEquals(\"${member.asString()} 不拥有权限 ${command.id}\", cause2.message)\n\n        // test not recursive cancel\n        builtIn.permit(any, plugin)\n        builtIn.permit(any, command)\n        builtIn.cancel(any, plugin, false)\n        assertFalse { builtIn.testPermission(any, plugin) }\n        assertFalse { builtIn.testPermission(member, plugin) }\n        assertTrue { builtIn.testPermission(any, command) }\n        assertTrue { builtIn.testPermission(member, command) }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/permission/PermissionsBasicsTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.permission\n\nimport kotlin.test.Test\nimport kotlin.test.assertFails\n\ninternal class PermissionsBasicsTest {\n    @Suppress(\"ILLEGAL_PERMISSION_NAMESPACE\", \"ILLEGAL_PERMISSION_NAME\") // inspection by mirai-console-intellij\n    @Test\n    fun testInvalidPermissionId() {\n        assertFails { PermissionId(\"space namespace\", \"name\") }\n        assertFails { PermissionId(\"namespace\", \"space name\") }\n        // assertFails { PermissionId(\"\", \"name\") }\n        // assertFails { PermissionId(\"namespace\", \"\") }\n        assertFails { PermissionId(\"namespace:name\", \"name\") }\n        assertFails { PermissionId(\"namespace\", \"namespace:name\") }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/plugin/BuiltInJvmPluginLoaderImplTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.plugin\n\nimport net.mamoe.mirai.console.testFramework.AbstractConsoleInstanceTest\n\ninternal class BuiltInJvmPluginLoaderImplTest : AbstractConsoleInstanceTest() {\n\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/plugin/PluginLoadingOrderTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.plugin\n\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.internal.plugin.PluginInfiniteCircularDependencyReferenceException\nimport net.mamoe.mirai.console.internal.plugin.PluginManagerImpl\nimport net.mamoe.mirai.console.internal.plugin.PluginMissingDependencyException\nimport net.mamoe.mirai.console.internal.plugin.impl\nimport net.mamoe.mirai.console.plugin.description.PluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.loader.PluginLoadException\nimport net.mamoe.mirai.console.testFramework.AbstractConsoleInstanceTest\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFailsWith\n\ninternal class PluginLoadingOrderTest : AbstractConsoleInstanceTest() {\n    private val pm: PluginManagerImpl get() = MiraiConsole.pluginManager.impl\n\n    private class Reorder<T>(val l: List<T>) {\n        operator fun get(vararg indexes: Int): List<T> {\n            return MutableList(indexes.size) { l[indexes[it]] }\n        }\n    }\n\n    private val <T> List<T>.reorder: Reorder<T> get() = Reorder(this)\n\n    @Test\n    fun singlePlugin() {\n        val descriptions = listOf<PluginDescription>(\n            JvmPluginDescription(\"a.a.a\", \"1.0.0\"),\n        )\n        assertEquals(\n            descriptions,\n            pm.__sortPluginDescription(descriptions)\n        )\n    }\n\n    @Test\n    fun successIfOptional() {\n        val descriptions = listOf<PluginDescription>(\n            JvmPluginDescription(\"a.a.a\", \"1.0.0\") {\n                dependsOn(\"a.a.a.opt\", isOptional = true)\n            },\n            JvmPluginDescription(\"c.c.c\", \"1.0.0\") {\n                dependsOn(\"c.c.c.opt\", isOptional = true)\n            },\n            JvmPluginDescription(\"b.b.b\", \"1.0.0\") {\n                dependsOn(\"b.b.b.opt\", isOptional = true)\n            },\n        )\n        assertEquals(\n            descriptions,\n            pm.__sortPluginDescription(descriptions)\n        )\n    }\n\n    @Test\n    fun failedIfDeathLock() {\n        assertFailsWith<PluginInfiniteCircularDependencyReferenceException> {\n            pm.__sortPluginDescription(\n                listOf(\n                    JvmPluginDescription(\"a.a.a\", \"1.0.0\") {\n                        dependsOn(\"b.b.b\")\n                    },\n                    JvmPluginDescription(\"b.b.b\", \"1.0.0\") {\n                        dependsOn(\"a.a.a\")\n                    },\n                )\n            )\n        }.let { assertEquals(\"Found circular plugin dependency: a.a.a -> b.b.b -> a.a.a\", it.message) }\n    }\n\n    @Test\n    fun failedIfMissing() {\n        assertFailsWith<PluginMissingDependencyException> {\n            pm.__sortPluginDescription(\n                listOf(\n                    JvmPluginDescription(\"a.a.a\", \"1.0.0\") { dependsOn(\"b.b.b\") }\n                )\n            )\n        }.let { assertEquals(\"Cannot load plugin 'a.a.a', missing dependencies: 'b.b.b'\", it.message) }\n    }\n\n    @Test\n    fun failedIfVersionNotMatch() {\n        assertFailsWith<PluginLoadException> {\n            pm.__sortPluginDescription(\n                listOf(\n                    JvmPluginDescription(\"a.a.a\", \"1.0.0\"),\n                    JvmPluginDescription(\"b.b.b\", \"1.0.0\") {\n                        dependsOn(\"a.a.a\", \"<0.9.9\")\n                    },\n                )\n            )\n        }.let {\n            assertEquals(\n                \"Plugin 'b.b.b' ('b.b.b') requires 'a.a.a' with version <0.9.9 while the resolved is 1.0.0\",\n                it.message\n            )\n        }\n        assertFailsWith<PluginLoadException> {\n            pm.__sortPluginDescription(\n                listOf(\n                    JvmPluginDescription(\"a.a.a\", \"1.0.0\"),\n                    JvmPluginDescription(\"b.b.b\", \"1.0.0\") {\n                        dependsOn(\"a.a.a\", \"<0.9.9\", isOptional = true)\n                    },\n                )\n            )\n        }.let {\n            assertEquals(\n                \"Plugin 'b.b.b' ('b.b.b') requires 'a.a.a' with version <0.9.9 while the resolved is 1.0.0\",\n                it.message\n            )\n        }\n    }\n\n\n    @Test\n    fun allNonDependencyPlugin() {\n        val descriptions = listOf<PluginDescription>(\n            JvmPluginDescription(\"a.a.a\", \"1.0.0\"),\n            JvmPluginDescription(\"a.a.b\", \"1.0.0\"),\n            JvmPluginDescription(\"a.c.w\", \"1.0.0\"),\n            JvmPluginDescription(\"a.z.x\", \"1.0.0\"),\n            JvmPluginDescription(\"a.w.q\", \"1.0.0\"),\n            JvmPluginDescription(\"w.z.a\", \"1.0.0\"),\n        )\n        assertEquals(\n            descriptions,\n            pm.__sortPluginDescription(descriptions)\n        )\n    }\n\n    @Test\n    fun pluginWithDependencies() {\n        val descriptions = listOf<PluginDescription>(\n            JvmPluginDescription(\"a.a.a\", \"1.0.0\") {\n                dependsOn(\"b.b.b\")\n            },\n            JvmPluginDescription(\"b.b.b\", \"1.0.0\"),\n        )\n        assertEquals(\n            descriptions.reorder[1, 0],\n            pm.__sortPluginDescription(descriptions)\n        )\n    }\n\n    @Test\n    fun pluginWithOptionalDependency() {\n        val desc = listOf<PluginDescription>(\n            JvmPluginDescription(\"a.a.a.opt\", \"1.0.0\") {\n                dependsOn(\"a.a.a\", isOptional = true)\n            },\n            JvmPluginDescription(\"a.a.a\", \"1.0.0\"),\n            JvmPluginDescription(\"b.b.b\", \"1.0.0\"),\n            JvmPluginDescription(\"b.b.b.opt\", \"1.0.0\") {\n                dependsOn(\"b.b.b\", isOptional = true)\n            },\n            JvmPluginDescription(\"c.c.c.opt\", \"1.0.0\") {\n                dependsOn(\"a.a.a\")\n            },\n        )\n        assertEquals(\n            desc.reorder[1, 2, 0, 3, 4],\n            pm.__sortPluginDescription(desc)\n        )\n    }\n\n    @Test\n    fun `2nd direct depend`() {\n        val descs = listOf(\n            JvmPluginDescription(\"c.c.c\", \"1.0.0\") {\n                dependsOn(\"b.b.b\", \"1.0.0\")\n            },\n            JvmPluginDescription(\"a.a.a\", \"1.0.0\"),\n            JvmPluginDescription(\"b.b.b\", \"1.0.0\") {\n                dependsOn(\"a.a.a\", \"1.0.0\")\n            },\n        )\n        assertEquals(\n            descs.reorder[1, 2, 0],\n            pm.__sortPluginDescription(descs)\n        )\n    }\n\n    @Test\n    fun `3nd optional depend`() {\n        val desc = listOf(\n            JvmPluginDescription(\"b.b.b\", \"1.0.0\") {\n                dependsOn(\"a.a.a\", isOptional = true)\n            },\n            JvmPluginDescription(\"a.a.a\", \"1.0.0\"),\n            JvmPluginDescription(\"d.d.d\", \"1.0.0\") {\n                dependsOn(\"a.a.a\")\n                dependsOn(\"c.c.c\")\n            },\n            JvmPluginDescription(\"c.c.c\", \"1.0.0\") {\n                dependsOn(\"b.b.b\", isOptional = true)\n            },\n            JvmPluginDescription(\"e.e.e\", \"1.0.0\") {\n                dependsOn(\"c.c.c\", isOptional = true)\n                dependsOn(\"d.d.d\")\n            },\n        )\n        assertEquals(\n            desc.reorder[1, 0, 3, 2, 4],\n            pm.__sortPluginDescription(desc)\n        )\n    }\n\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/testFramework/AbstractConsoleInstanceTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.testFramework\n\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.cancelAndJoin\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport net.mamoe.mirai.console.MiraiConsoleImplementation.Companion.start\nimport net.mamoe.mirai.console.command.CommandManager\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport org.junit.jupiter.api.AfterEach\nimport kotlin.test.BeforeTest\n\nabstract class AbstractConsoleInstanceTest {\n    init {\n        @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n        net.mamoe.mirai.utils.MiraiLoggerFactoryImplementationBridge.reinit()\n    }\n\n    val mockPlugin by lazy { mockKotlinPlugin() }\n    private lateinit var implementation: MiraiConsoleImplementation\n    val consoleImplementation: MiraiConsoleImplementation by ::implementation\n\n    @BeforeTest\n    protected open fun initializeConsole() {\n        this.implementation = MockConsoleImplementation().apply { start() }\n        CommandManager\n        consoleImplementation.jvmPluginLoader.load(mockPlugin)\n        consoleImplementation.jvmPluginLoader.enable(mockPlugin)\n    }\n\n    @AfterEach\n    protected open fun stopConsole() {\n        if (MiraiConsoleImplementation.instanceInitialized) {\n            try {\n                consoleImplementation.jvmPluginLoader.disable(mockPlugin)\n            } catch (e: Exception) {\n                e.printStackTrace()\n            }\n\n            try {\n                runBlocking { MiraiConsole.job.cancelAndJoin() }\n            } catch (e: CancellationException) {\n                // ignored\n            } catch (e: Exception) {\n                e.printStackTrace()\n            } finally {\n                MiraiConsoleImplementation.currentBridge = null\n            }\n        }\n        println(\"=========\".repeat(4) + \"CONSOLE STOPPED\" + \"=========\".repeat(4))\n    }\n\n    companion object {\n        fun mockKotlinPlugin(id: String = \"org.test.test\"): KotlinPlugin {\n            return object : KotlinPlugin(JvmPluginDescription(id, \"1.0.0\")) {}\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/testFramework/MockConsoleImplementation.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.testFramework\n\nimport kotlinx.coroutines.CoroutineExceptionHandler\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.cancel\nimport net.mamoe.mirai.console.MiraiConsoleFrontEndDescription\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport net.mamoe.mirai.console.MiraiConsoleImplementation.Companion.start\nimport net.mamoe.mirai.console.command.CommandManager\nimport net.mamoe.mirai.console.data.PluginDataStorage\nimport net.mamoe.mirai.console.internal.data.MultiFilePluginDataStorageImpl\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader\nimport net.mamoe.mirai.console.plugin.loader.PluginLoader\nimport net.mamoe.mirai.console.util.ConsoleInput\nimport net.mamoe.mirai.console.util.SemVersion\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.utils.BotConfiguration\nimport net.mamoe.mirai.utils.LoginSolver\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.PlatformLogger\nimport java.nio.file.Path\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.io.path.createTempDirectory\n\nopen class MockConsoleImplementation : MiraiConsoleImplementation {\n    final override val rootPath: Path = createTempDirectory()\n\n    override val frontEndDescription: MiraiConsoleFrontEndDescription\n        get() = object : MiraiConsoleFrontEndDescription {\n            override val name: String get() = \"Test\"\n            override val vendor: String get() = \"Test\"\n            override val version: SemVersion get() = SemVersion(\"1.0.0\")\n        }\n    override val builtInPluginLoaders: List<Lazy<PluginLoader<*, *>>> = listOf(lazy { JvmPluginLoader })\n    override val jvmPluginLoader: JvmPluginLoader by lazy {\n        backendAccess.createDefaultJvmPluginLoader(coroutineContext)\n    }\n    override val consoleCommandSender: MiraiConsoleImplementation.ConsoleCommandSenderImpl =\n        object : MiraiConsoleImplementation.ConsoleCommandSenderImpl {\n            override suspend fun sendMessage(message: Message) {\n                println(message)\n            }\n\n            override suspend fun sendMessage(message: String) {\n                println(message)\n            }\n        }\n    override val commandManager: CommandManager by lazy { backendAccess.createDefaultCommandManager(coroutineContext) }\n    override val dataStorageForJvmPluginLoader: PluginDataStorage =\n        MultiFilePluginDataStorageImpl(rootPath.resolve(\"data\"))\n    override val configStorageForJvmPluginLoader: PluginDataStorage =\n        MultiFilePluginDataStorageImpl(rootPath.resolve(\"config\"))\n    override val dataStorageForBuiltIns: PluginDataStorage = MultiFilePluginDataStorageImpl(rootPath.resolve(\"data\"))\n    override val configStorageForBuiltIns: PluginDataStorage =\n        MultiFilePluginDataStorageImpl(rootPath.resolve(\"config\"))\n\n    override val consoleInput: ConsoleInput = object : ConsoleInput {\n        override suspend fun requestInput(hint: String): String {\n            println(hint)\n            return readLine() ?: error(\"No stdin\")\n        }\n    }\n\n    override fun createLoginSolver(requesterBot: Long, configuration: BotConfiguration): LoginSolver =\n        LoginSolver.Default!!\n\n    override fun createLoggerFactory(context: MiraiConsoleImplementation.FrontendLoggingInitContext): MiraiLogger.Factory {\n        return object : MiraiLogger.Factory {\n            override fun create(requester: Class<*>, identity: String?): MiraiLogger {\n                return PlatformLogger(identity)\n            }\n        }\n    }\n\n    override val consoleDataScope: MiraiConsoleImplementation.ConsoleDataScope by lazy {\n        MiraiConsoleImplementation.ConsoleDataScope.createDefault(\n            coroutineContext,\n            dataStorageForBuiltIns,\n            configStorageForBuiltIns\n        )\n    }\n    override val coroutineContext: CoroutineContext =\n        CoroutineName(\"Console Main\") + SupervisorJob() + CoroutineExceptionHandler { _, throwable ->\n            throwable.printStackTrace()\n        }\n\n}\n\ninline fun <R> withConsoleImplementation(crossinline block: MockConsoleImplementation.() -> R): R {\n    contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }\n    MockConsoleImplementation().run {\n        start()\n        try {\n            return block()\n        } finally {\n            cancel()\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/testFramework/test/FrameworkInstanceTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.testFramework.test\n\nimport net.mamoe.mirai.console.plugin.PluginManager\nimport net.mamoe.mirai.console.testFramework.AbstractConsoleInstanceTest\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\nclass FrameworkInstanceTest : AbstractConsoleInstanceTest() {\n\n    @Test\n    fun testConsole1() {\n        assertEquals(1, PluginManager.plugins.size)\n    }\n\n    @Test\n    fun testConsole2() {\n        assertEquals(1, PluginManager.plugins.size)\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/util/TestCoroutineUtils.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.console.util\n\n//import kotlinx.coroutines.*\n//import kotlin.test.Test\n//import java.util.concurrent.atomic.AtomicInteger\n//import kotlin.coroutines.resume\n//import kotlin.test.assertEquals\n//import kotlin.time.milliseconds\n//import kotlin.time.seconds\n\ninternal class TestCoroutineUtils {\n\n    // TODO TestCoroutineUtils disabled manually: on CI real time measurement is not precise causing tests to fail.\n\n//    @Test\n//    fun `test launchTimedTask 0 time`() = runTest {\n//        val scope = CoroutineScope(SupervisorJob())\n//\n//        val result = withTimeoutOrNull(6000) {\n//            suspendCancellableCoroutine<Unit> { cont ->\n//                scope.launchTimedTask(5.seconds.toLongMilliseconds()) {\n//                    cont.resume(Unit)\n//                }\n//            }\n//        }\n//\n//        assertEquals(null, result)\n//        scope.cancel()\n//    }\n//\n//    @Test\n//    fun `test launchTimedTask finishes 1 time`() = runTest {\n//        val scope = CoroutineScope(SupervisorJob())\n//\n//        withTimeout(4000) {\n//            suspendCancellableCoroutine<Unit> { cont ->\n//                val task = scope.launchTimedTask(3.seconds.toLongMilliseconds()) {\n//                    cont.resume(Unit)\n//                }\n//                task.setChanged()\n//            }\n//        }\n//\n//        scope.cancel()\n//    }\n//\n//    @Test\n//    fun `test launchTimedTask finishes multiple times`() = runTest {\n//        val scope = CoroutineScope(SupervisorJob())\n//\n//        val resumedTimes = AtomicInteger(0)\n//        val task = scope.launchTimedTask(3000.milliseconds.toLongMilliseconds()) {\n//            resumedTimes.incrementAndGet()\n//        }\n//        task.setChanged()\n//        launch {\n//            delay(4000)\n//            task.setChanged()\n//        }\n//\n//        delay(6000)\n//        assertEquals(1, resumedTimes.get())\n//        delay(15000)\n//        assertEquals(2, resumedTimes.get())\n//\n//        scope.cancel()\n//    }\n//\n//    @Test\n//    fun `test launchTimedTask interval less than delay`() = runTest {\n//        val scope = CoroutineScope(SupervisorJob())\n//\n//        withTimeout(5000) {\n//            suspendCancellableCoroutine<Unit> { cont ->\n//                val task = scope.launchTimedTask(1.seconds.toLongMilliseconds()) {\n//                    cont.resume(Unit)\n//                }\n//                task.setChanged()\n//            }\n//        }\n//\n//        scope.cancel()\n//    }\n\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/test/util/TestSemVersion.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n/*\n * @author Karlatemp <karlatemp@vip.qq.com> <https://github.com/Karlatemp>\n */\n\npackage net.mamoe.mirai.console.util\n\nimport net.mamoe.mirai.console.util.SemVersion.Companion.test\nimport kotlin.test.Test\nimport kotlin.test.assertFails\n\ninternal class TestSemVersion {\n    @Test\n    internal fun testCompare() {\n        fun String.sem(): SemVersion = SemVersion.invoke(this)\n        assert(\"1.0\".sem() < \"1.0.1\".sem())\n        assert(\"1.0.0\".sem() != \"1.0\".sem())\n        assert(\"1.0.0\".sem().compareTo(\"1.0\".sem()) == 0)\n        assert(\"1.1\".sem() > \"1.0.0\".sem())\n        assert(\"1.0-M4\".sem() < \"1.0-M5\".sem())\n        assert(\"1.0-M5-dev-7\".sem() < \"1.0-M5-dev-15\".sem())\n        assert(\"1.0-M5-dev-79\".sem() < \"1.0-M5-dev-7001\".sem())\n        assert(\"1.0-M6\".sem() > \"1.0-M5-dev-15\".sem())\n        assert(\"1.0-RC\".sem() > \"1.0-M5-dev-15\".sem())\n        assert(\"1.0-RC2\".sem() > \"1.0-RC\".sem())\n        // example on semver\n        // 1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0\n        assert(\"1.0.0-alpha\".sem() < \"1.0.0-alpha.1\".sem())\n        assert(\"1.0.0-alpha.1\".sem() < \"1.0.0-alpha.beta\".sem())\n        assert(\"1.0.0-alpha.beta\".sem() < \"1.0.0-beta\".sem())\n        assert(\"1.0.0-beta\".sem() < \"1.0.0-beta.2\".sem())\n        assert(\"1.0.0-beta.2\".sem() < \"1.0.0-beta.11\".sem())\n        assert(\"1.0.0-beta.11\".sem() < \"1.0.0-rc.1\".sem())\n        assert(\"1.0.0-rc.1\".sem() < \"1.0.0\".sem())\n    }\n\n    @Test\n    internal fun testRequirementCopy() {\n        fun SemVersion.Requirement.check(a: SemVersion.Requirement.() -> SemVersion.Requirement) {\n            assert(a().impl !== this.impl)\n        }\n        SemVersion.parseRangeRequirement(\"1.0\").check { copy() }\n        SemVersion.parseRangeRequirement(\"1.0\").check { copy(\"2.0\") }\n        SemVersion.parseRangeRequirement(\"1.0\").check { copy(\"1.0\") }\n    }\n\n    @Test\n    internal fun testRequirement() {\n        fun SemVersion.Requirement.assert(version: String): SemVersion.Requirement {\n            assert(test(version)) { version }\n            return this\n        }\n\n        fun assertInvalid(requirement: String) {\n            assertFails(requirement) {\n                SemVersion.parseRangeRequirement(requirement)\n            }\n        }\n\n        fun SemVersion.Requirement.assertFalse(version: String): SemVersion.Requirement {\n            assert(!test(version)) { version }\n            return this\n        }\n        SemVersion.parseRangeRequirement(\"1.0\")\n            .assert(\"1.0\").assert(\"1.0.0\")\n            .assertFalse(\"1.1.0\").assertFalse(\"2.0.0\")\n        SemVersion.parseRangeRequirement(\"1.x\")\n            .assert(\"1.0\").assert(\"1.1\")\n            .assert(\"1.5\").assert(\"1.14514\")\n            .assertFalse(\"2.33\")\n        SemVersion.parseRangeRequirement(\"2.0||1.2.x\")\n        SemVersion.parseRangeRequirement(\"{2.0||1.2.x} && 1.1.0 &&1.2.3\")\n        SemVersion.parseRangeRequirement(\"2.0 || 1.2.x\")\n            .assert(\"2.0\").assert(\"2.0.0\")\n            .assertFalse(\"2.1\")\n            .assert(\"1.2.5\").assert(\"1.2.0\").assertFalse(\"1.2\")\n            .assertFalse(\"1.0.0\")\n        SemVersion.parseRangeRequirement(\"[1.0.0, 19190.0]\")\n            .assert(\"1.0.0\").assertFalse(\"0.1.0\")\n            .assert(\"19190.0\").assertFalse(\"19198.10\")\n        SemVersion.parseRangeRequirement(\"[1.0.0, 2.0.0)\")\n            .assert(\"1.0.0\").assert(\"1.2.3\").assertFalse(\"2.0.0\")\n        SemVersion.parseRangeRequirement(\"(2.0.0, 1.0.0]\")\n            .assert(\"1.0.0\").assert(\"1.2.3\").assertFalse(\"2.0.0\")\n        SemVersion.parseRangeRequirement(\"(2.0.0, 1.0.0)\")\n            .assertFalse(\"1.0.0\").assert(\"1.2.3\").assertFalse(\"2.0.0\")\n        SemVersion.parseRangeRequirement(\"(1.0.0, 2.0.0)\")\n            .assertFalse(\"1.0.0\").assert(\"1.2.3\").assertFalse(\"2.0.0\")\n        SemVersion.parseRangeRequirement(\" >= 1.0.0\")\n            .assert(\"1.0.0\")\n            .assert(\"114.514.1919\")\n            .assertFalse(\"0.0.0\")\n            .assertFalse(\"0.98774587\")\n        SemVersion.parseRangeRequirement(\"> 1.0.0\")\n            .assertFalse(\"1.0.0\")\n        SemVersion.parseRangeRequirement(\"!= 1.0.0 && != 2.0.0\")\n            .assert(\"1.2.3\").assert(\"2.1.1\")\n            .assertFalse(\"1.0\").assertFalse(\"1.0.0\")\n            .assertFalse(\"2.0\").assertFalse(\"2.0.0\")\n            .assert(\"2.0.1\").assert(\"1.0.1\")\n\n        SemVersion.parseRangeRequirement(\"> 1.0.0 || < 0.9.0\")\n            .assertFalse(\"1.0.0\")\n            .assert(\"0.8.0\")\n            .assertFalse(\"0.9.0\")\n        SemVersion.parseRangeRequirement(\"{>= 1.0.0 && <= 1.2.3} || {>= 2.0.0 && <= 2.2.3}\")\n            .assertFalse(\"1.3.0\")\n            .assert(\"1.0.0\").assert(\"1.2.3\")\n            .assertFalse(\"0.9.0\")\n            .assert(\"2.0.0\").assert(\"2.2.3\").assertFalse(\"2.3.4\")\n\n        assertInvalid(\"WPOXAXW\")\n        assertInvalid(\"1.0.0 || 1.0.0 && 1.0.0\")\n        assertInvalid(\"{\")\n        assertInvalid(\"}\")\n        assertInvalid(\"\")\n        assertInvalid(\"1.2.3 - 3.2.1\")\n        assertInvalid(\"1.5.78 &&\")\n        assertInvalid(\"|| 1.0.0\")\n    }\n\n    private fun String.check() {\n        val sem = SemVersion.invoke(this)\n        assert(this == sem.toString()) { \"$this != $sem\" }\n    }\n\n    private fun String.checkInvalid() {\n        kotlin.runCatching { SemVersion.invoke(this) }\n            .onSuccess { assert(false) { \"$this not a invalid sem-version\" } }\n    }\n\n    @Test\n    internal fun testSemVersionParsing() {\n        \"0.0\".check()\n        \"1.0.0\".check()\n        \"1.2.3.4.5.6.7.8\".checkInvalid()\n        \"5555.0-A\".check()\n        \"5555.0-A+METADATA\".check()\n        \"5555.0+METADATA\".check()\n        \"987.0+wwwxx-wk\".check()\n        \"NOT.NUMBER\".checkInvalid()\n        \"0\".checkInvalid()\n        \"\".checkInvalid()\n        \"1.\".checkInvalid()\n        \"0.1-\".checkInvalid()\n        \"1.9+\".checkInvalid()\n        \"5.1+68-7\".check()\n        \"5.1+68-\".check()\n    }\n\n    @Test\n    internal fun testSemVersionOfficial() {\n        \"\"\"\n            1.0-RC\n            0.0.4\n            1.2.3\n            10.20.30\n            1.1.2-prerelease+meta\n            1.1.2+meta\n            1.1.2+meta-valid\n            1.0.0-alpha\n            1.0.0-beta\n            1.0.0-alpha.beta\n            1.0.0-alpha.beta.1\n            1.0.0-alpha.1\n            1.0.0-alpha0.valid\n            1.0.0-alpha.0valid\n            1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okay\n            1.0.0-rc.1+build.1\n            2.0.0-rc.1+build.123\n            1.2.3-beta\n            10.2.3-DEV-SNAPSHOT\n            1.2.3-SNAPSHOT-123\n            1.0.0\n            2.0.0\n            1.1.7\n            2.0.0+build.1848\n            2.0.1-alpha.1227\n            1.0.0-alpha+beta\n            1.2.3----RC-SNAPSHOT.12.9.1--.12+788\n            1.2.3----R-S.12.9.1--.12+meta\n            1.2.3----RC-SNAPSHOT.12.9.1--.12\n            1.0.0+0.build.1-rc.10000aaa-kk-0.1\n            1.0.0-0A.is.legal\n        \"\"\".trimIndent().split('\\n').asSequence()\n            .filter { it.isNotBlank() }.map { it.trim() }.forEach { it.check() }\n        \"\"\"\n            1\n            1.2.3-0123\n            1.2.3-0123.0123\n            1.1.2+.123\n            +invalid\n            -invalid\n            -invalid+invalid\n            -invalid.01\n            alpha\n            alpha.beta\n            alpha.beta.1\n            alpha.1\n            alpha+beta\n            alpha_beta\n            alpha.\n            alpha..\n            beta\n            1.0.0-alpha_beta\n            -alpha.\n            1.0.0-alpha..\n            1.0.0-alpha..1\n            1.0.0-alpha...1\n            1.0.0-alpha....1\n            1.0.0-alpha.....1\n            1.0.0-alpha......1\n            1.0.0-alpha.......1\n            01.1.1\n            1.01.1\n            1.1.01\n            1.2.3.DEV\n            1.2.31.2.3----RC-SNAPSHOT.12.09.1--..12+788\n            1.2.31.2.3-RC\n            -1.0.3-gamma+b7718\n            +justmeta\n            9.8.7+meta+meta\n            9.8.7-whatever+meta+meta\n            99999999999999999999999.999999999999999999.99999999999999999----RC-SNAPSHOT.12.09.1--------------------------------..12\n        \"\"\".trimIndent().split('\\n').asSequence()\n            .filter { it.isNotBlank() }.map { it.trim() }.forEach { it.checkInvalid() }\n    }\n}"
  },
  {
    "path": "mirai-console/backend/mirai-console/testResources/META-INF/services/org.slf4j.spi.SLF4JServiceProvider",
    "content": "net.mamoe.mirai.console.internal.logging.externalbind.slf4j.MiraiConsoleSLF4JService\n"
  },
  {
    "path": "mirai-console/docs/.conf/nav.js",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nmodule.exports = {\n    text: \"mirai-console\",\n    link: \"/\",\n    items: [\n        {text: \"Index\", link: \"/\"},\n        {text: \"配置项目\", link: \"/ConfiguringProjects.html\"},\n        {text: \"启动 Console\", link: \"/Run.html\"},\n        {\n            text: \"后端插件开发基础\", items: [\n                {text: \"插件 - Plugin 模块\", link: \"/plugin/Plugins.html\"},\n                {text: \"插件 - JVM Plugin\", link: \"/plugin/JVMPlugin.html\"},\n                {text: \"指令 - Command 模块\", link: \"/Commands.html\"},\n                {text: \"存储 - PluginData 模块\", link: \"/PluginData.html\"},\n                {text: \"权限 - Permission 模块\", link: \"/Permissions.html\"},\n            ]\n        },\n        {\n            text: \"后端插件开发进阶\", items: [\n                {text: \"扩展 - Extension 模块和扩展点\", link: \"/Extensions.html\"},\n            ]\n        },\n        {\n            text: \"实现前端\", items: [\n                {text: \"FrontEnd\", link: \"/FrontEnd.html\"},\n            ]\n        },\n        {\n            text: \"Misc\", items: [\n                {text: 'Q & A', link: '/QA.html'},\n                {text: '日志配置', link: '/Logging.html'},\n                {text: '内置命令', link: '/BuiltInCommands.html'},\n                {text: 'Mirai Console 附录', link: '/Appendix.html'},\n                {text: \"插件 - JVM Plugin - 附录\", link: \"/plugin/JVMPlugin-Appendix.html\"},\n                {text: \"插件 - JVM Plugin - 多插件数据交换\", link: \"/plugin/JVMPlugin-DataExchange.html\"},\n                {text: \"插件 - JVM Plugin - 排错\", link: \"/plugin/JVMPlugin-Debug.html\"},\n            ]\n        },\n    ]\n}"
  },
  {
    "path": "mirai-console/docs/Appendix.md",
    "content": "# Mirai Console - Appendix\n\n### Mirai Console 演进\n\nMirai Console 是不断前进的框架，将来必定会发生 API 弃用和重构。  \n维护者会严谨地推进每一项修改，并提供迁移周期（至少 2 个次版本）。\n\n#### 版本规范\n\nMirai Console 的版本号遵循 [语义化版本 2.0.0](https://semver.org/lang/zh-CN/#spec-item-9) 规范。\n\n在日常开发中, Mirai Console 会以 `-dev-1`，`-dev-2` 等版本后缀发布开发预览版本。这些版本仅用于兼容性测试等目的，无稳定性保证。\n\n在大版本开发过程中，Mirai Console 会以 `-M1`, `-M2` 等版本后缀发布里程碑预览版本。代表一系列功能的完成，但还不稳定。  \n这些版本里新增的 API 仍可能还会在下一个 Milestone 版本变化，因此请按需使用。\n\n在大版本即将发布前，Mirai Console 会以 `-RC` 版本后缀发布最终的预览版本。  \n`RC` 表示新版本 API 已经确定，离稳定版发布只差最后的一些内部优化或 bug 修复。\n\n#### 版本选择\n\n**稳定性**：稳定 (`x.y.z`) > 发布预览 (`-RC`) > 里程碑预览 (`-M`) > 开发 (`-dev`)。\n\n|            目的            | 推荐至少更新到版本 |\n|:--------------------------:|:--------------:|\n|          生产环境           |     `x.y.z`     |\n| 希望尽早体验稳定新特性的插件作者 |     `-RC`      |\n| 无论如何都想体验新特性的插件作者 |      `-M`      |\n|    前端实现者, 底层插件作者    |      `-M`      |\n|  为 Mirai Console 提交 PR   |     `-dev`     |\n\n其中，‘底层插件’ 表示提供扩展等的插件。如权限系统，其他语言插件加载器等。\n\n#### 更新兼容性\n\n对于 `x.y.z` 版本号:\n- 当 `z` 增加时，只会有 bug 修复，和必要的新函数添加（为了解决某一个问题），不会有破坏性变化。\n- 当 `y` 增加时，可能有新 API 的引入，和旧 API 的弃用。但这些弃用会经过一个弃用周期后才被删除（隐藏）。向下兼容得到保证。\n- 当 `x` 增加时，任何 API 都可能会有变化。无兼容性保证。\n\n#### 弃用周期\n\n一个计划被删除的 API，将会在下一个次版本开始经历弃用周期。\n\n如一个 API 在 `1.1.0` 起被弃用，它首先会是 `WARNING` (使用时会得到一个编译警告）弃用级别。  \n在 `1.2.0` 上升为 `ERROR`（使用时会得到一个编译错误）；  \n在 `1.3.0` 上升为 `HIDDEN`（使用者无法看到这些 API)。\n\n`HIDDEN` 的 API 仍然会保留在代码中并正常编译，以提供二进制兼容性，直到下一个主版本更新。\n"
  },
  {
    "path": "mirai-console/docs/BuiltInCommands.md",
    "content": "# Mirai Console - BuiltIn Commands\n\nMirai Console 内置一些指令。\n\n下文中 `<A|B>` 表示可以是 A 或 B。`[ ]` 表示一个必须的参数, `[ ]?` 表示一个可选的参数。\n\n## HelpCommand\n\n`/help`\n\n查看指令帮助\n\n## StopCommand\n\n`/<stop|shutdown|exit>`\n\n关闭 Mirai Console\n\n## LoginCommand\n\n`/<login|登录> [qq] [password] [protocol]?`\n\n| 参数        | 可选值          | 描述                                                                  |\n|:----       | :----           | :-------------------------------------------------------------------  |\n| protocol   | ANDROID_PHONE   | Android 手机.  所有功能都支持.                                         |\n| protocol   | ANDROID_PAD     | Android 平板.                                                       |\n| protocol   | ANDROID_WATCH   | Android 手表.  注意: 不支持戳一戳事件解析                                 |\n\n\n临时登录一个账号\n\n## PermissionCommand\n\n主指令: `/<permission|perm|权限>`\n\n次指令:\n\n| 指令                                                                                         | 描述                   |\n|:--------------------------------------------------------------------------------------------|:----------------------|\n| `/<permission\\|perm\\|权限> <permit\\|grant\\|add> [target] [permission]`                        | 授权一个权限            |\n| `/<permission\\|perm\\|权限> <cancel\\|deny\\|remove> [target] [permission]`                      | 撤销一个权限            |\n| `/<permission\\|perm\\|权限> <cancelAll\\|denyAll\\|removeAll> [target] [permission]`             | 撤销一个权限及其所有子权限 |\n| `/<permission\\|perm\\|权限> <permittedPermissions\\|pp\\|grantedPermissions\\|gp> [target] [all]` | 查看被授权权限列表       |\n| `/<permission\\|perm\\|权限> <listPermissions\\|lp>`                                             | 查看所有权限列表         |\n\n### `[target]` 和 `[permission]` 示例\n\n`[target]` 是 [*被许可人 ID*](Permissions.md#被许可人-id)，可以查看[表示方法](Permissions.md#字符串表示) 。\n\n`[permission]` 是 [*权限 ID*](Permissions.md#权限-id)。每个指令都拥有一个权限 ID。请使用 `/perm list` 查看权限 ID 列表。\n\n示例：`/perm permit u123456 console:command.stop`\n\n### 授予一个用户执行所有指令的权限\n\n示例：\n- `/perm permit u123456 *:*` 允许用户 123456 执行任意指令\n- `/perm permit u123456 console:*` 允许用户 123456 执行任意 Console 内置指令\n- `/perm permit u123456 org.example.my-plugin:*` 允许用户 123456 执行插件 `org.example.my-plugin` 的任意指令\n\n### 授予所有用户执行某个指令的权限\n\n示例：\n- `/perm permit u* console:command.help` 允许所有用户执行 `console:command.help`（即 `/help`）\n- `/perm permit u* console:*` 允许所有用户执行任意 Console 内置指令\n- `/perm permit u* org.example.my-plugin:*` 允许所有用户执行插件 `org.example.my-plugin` 的任意指令\n\n## AutoLoginCommand\n\n主指令: `/autoLogin`\n\n次指令:\n\n| 指令                                                           | 描述                 |\n|:--------------------------------------------------------------|:---------------------|\n| `/<autoLogin\\|自动登录> list`                                    | 查看自动登录账号列表    |\n| `/<autoLogin\\|自动登录> add [account] [password] [passwordKind]` | 添加自动登录           |\n| `/<autoLogin\\|自动登录> clear`                                   | 清除所有配置           |\n| `/<autoLogin\\|自动登录> remove [account]`                        | 删除一个账号           |\n| `/<autoLogin\\|自动登录> setConfig [account] [configKey] [value]` | 设置一个账号的一个配置项 |\n| `/<autoLogin\\|自动登录> removeConfig [account] [configKey]`      | 删除一个账号的一个配置项 |\n\n\n| `configKey` |                       可选值                       |\n|:-----------:|:-------------------------------------------------:|\n| `protocol`  | `ANDROID_PHONE` / `ANDROID_PAD` / `ANDROID_WATCH` |\n\n示例：`/autoLogin setConfig 123456 protocol ANDROID_PHONE`\n\n## StatusCommand\n\n`/status`\n\n获取 Mirai Console 运行状态\n"
  },
  {
    "path": "mirai-console/docs/Commands.md",
    "content": "# Mirai Console Backend - Commands\n\n[`Plugin`]: ../backend/mirai-console/src/plugin/Plugin.kt\n\n[`PluginDescription`]: ../backend/mirai-console/src/plugin/description/PluginDescription.kt\n\n[`PluginLoader`]: ../backend/mirai-console/src/plugin/loader/PluginLoader.kt\n\n[`PluginManager`]: ../backend/mirai-console/src/plugin/PluginManager.kt\n\n[`JvmPluginLoader`]: ../backend/mirai-console/src/plugin/jvm/JvmPluginLoader.kt\n\n[`JvmPlugin`]: ../backend/mirai-console/src/plugin/jvm/JvmPlugin.kt\n\n[`JvmPluginDescription`]: ../backend/mirai-console/src/plugin/jvm/JvmPluginDescription.kt\n\n[`AbstractJvmPlugin`]: ../backend/mirai-console/src/plugin/jvm/AbstractJvmPlugin.kt\n\n[`KotlinPlugin`]: ../backend/mirai-console/src/plugin/jvm/KotlinPlugin.kt\n\n[`JavaPlugin`]: ../backend/mirai-console/src/plugin/jvm/JavaPlugin.kt\n\n\n[`Value`]: ../backend/mirai-console/src/data/Value.kt\n\n[`PluginData`]: ../backend/mirai-console/src/data/PluginData.kt\n\n[`AbstractPluginData`]: ../backend/mirai-console/src/data/AbstractPluginData.kt\n\n[`AutoSavePluginData`]: ../backend/mirai-console/src/data/AutoSavePluginData.kt\n\n[`AutoSavePluginConfig`]: ../backend/mirai-console/src/data/AutoSavePluginConfig.kt\n\n[`PluginConfig`]: ../backend/mirai-console/src/data/PluginConfig.kt\n\n[`PluginDataStorage`]: ../backend/mirai-console/src/data/PluginDataStorage.kt\n\n[`MultiFilePluginDataStorage`]: ../backend/mirai-console/src/data/PluginDataStorage.kt#L116\n\n[`MemoryPluginDataStorage`]: ../backend/mirai-console/src/data/PluginDataStorage.kt#L100\n\n[`AutoSavePluginDataHolder`]: ../backend/mirai-console/src/data/PluginDataHolder.kt#L45\n\n[`PluginDataHolder`]: ../backend/mirai-console/src/data/PluginDataHolder.kt\n\n[`PluginDataExtensions`]: ../backend/mirai-console/src/data/PluginDataExtensions.kt\n\n[`MiraiConsole`]: ../backend/mirai-console/src/MiraiConsole.kt\n\n[`MiraiConsoleImplementation`]: ../backend/mirai-console/src/MiraiConsoleImplementation.kt\n<!--[MiraiConsoleFrontEnd]: ../backend/mirai-console/src/MiraiConsoleFrontEnd.kt-->\n\n[`Command`]: ../backend/mirai-console/src/command/Command.kt\n\n[`Register`]: ../backend/mirai-console/src/command/CommandManager.kt#L77\n\n[`AbstractCommand`]: ../backend/mirai-console/src/command/Command.kt#L90\n\n[`CompositeCommand`]: ../backend/mirai-console/src/command/CompositeCommand.kt\n\n[`SimpleCommand`]: ../backend/mirai-console/src/command/SimpleCommand.kt\n\n[`RawCommand`]: ../backend/mirai-console/src/command/RawCommand.kt\n\n[`CommandManager`]: ../backend/mirai-console/src/command/CommandManager.kt\n\n[`CommandSender`]: ../backend/mirai-console/src/command/CommandSender.kt\n\n[`CommandValueArgumentParser`]: ../backend/mirai-console/src/command/descriptor/CommandValueArgumentParser.kt\n\n[`CommandArgumentContext`]: ../backend/mirai-console/src/command/descriptor/CommandArgumentContext.kt\n\n[`CommandArgumentContext.BuiltIns`]: ../backend/mirai-console/src/command/descriptor/CommandArgumentContext.kt#L66\n\n[`MessageScope`]: ../backend/mirai-console/src/util/MessageScope.kt\n\n\n\"指令\" 目前通常是 \"/commandName arg1 arg2 arg3\" 格式的消息。在将来可能会被扩展。\n\n指令拥有一个主要名称和任意个次要名称。使用任意名称都可以执行指令。\n\n定义指令\n------\n\n每个指令都是一个 `Command` 类型的对象。`Command` 是一个接口，定义了基本的指令的属性：\n\n```kotlin\ninterface Command {\n    val names: Array<out String> // 名称\n    val usage: String // 用法\n    val description: String // 描述\n    val permission: Permission // 权限\n    val prefixOptional: Boolean // 前缀可选\n    val owner: CommandOwner // 拥有者\n\n    val overloads: List<CommandSignature> // 指令的签名列表\n}\n```\n\n`AbstractCommand` 提供了对 `Command` 的基础实现。而要在插件定义指令，建议继承如下三种指令实现：\n\n（注意：所有指令都需要注册到指令管理器才能生效，详见 [注册指令](#注册指令)）\n\n### 原生指令\n\n原生指令即 [`RawCommand`]，它直接处理触发指令的原消息链。\n\n`RawCommand` 提供了两个抽象函数，在指令被执行时将会调用它们：\n\n*Kotlin*\n\n```kotlin\nopen override suspend fun CommandContext.onCommand(args: MessageChain)\nopen override suspend fun CommandSender.onCommand(args: MessageChain)\n```\n\n*Java*\n\n```java\npublic abstract class JRawCommand {\n    // ...\n    public void onCommand(CommandContext context, MessageChain args) {\n    }\n\n    public void onCommand(CommandSender sender, MessageChain args) {\n    }\n}\n```\n\n例如在聊天环境通过消息链 `/test 123 [图片]` 触发指令（`[图片]` 表示一个图片），`onCommand` 接收的 `args`\n为包含 2\n个元素的 `MessageChain`。第一个元素为 `PlainText(\"123\")`，第二个元素为 `Image`。\n\n注意，当 `onCommand(CommandSender, MessageChain)`\n和 `onCommand(CommandContext, MessageChain)` 被同时覆盖时,\n只有 `onCommand(CommandContext, MessageChain)` 会生效。\n\n`CommandContext` 是当前指令的执行环境，定义如下：\n\n```kotlin\ninterface CommandContext {\n    val sender: CommandSender\n    val originalMessage: MessageChain\n}\n```\n\n其中 `sender` 为指令执行者。它可能是控制台（`ConsoleCmomandSender`\n），也可能是用户（`UserCommandSender`）等；\n`originalMessage` 为触发指令的原消息链，包含元数据，也包含指令名。\n\n若在聊天环境触发指令，`originalMessage` 将会包含 `MessageSource`。\n\n注意，`MessageSource` 等 `MessageMetadata` 的位置是不确定的。取决于 mirai-core\n的版本，它可能会存在于消息链中的任意位置。因此请不要依赖于 `originalMessage` 的元素顺序。\n\n`args` 参数的顺序是稳定的，因为它只包含消息内容（`MessageContent`）。\n\n#### 使用 `RawCommand`\n\n只需要按需继承 `onCommand` 其中一个即可。如果需要使用原消息链，则继承 `CommandContext`\n的，否则继承 `CommandSender` 的可以使实现更简单。\n\n通常可以以单例形式实现指令，当然非单例模式也是支持的。\n\n下面分别为在 Kotlin 和 Java 的示例实现：\n\n*Kotlin*\n\n```kotlin\nobject MyCommand : RawCommand(\n    MyPluginMain, \"name\", // 使用插件主类对象作为指令拥有者；设置主指令名为 \"name\"\n    // 可选：\n    \"name2\", \"name3\", // 增加两个次要名称\n    usage = \"/name arg1 arg2\", // 设置用法，将会在 /help 展示\n    description = \"这是一个测试指令\", // 设置描述，将会在 /help 展示\n    prefixOptional = true, // 设置指令前缀是可选的，即使用 `test` 也能执行指令而不需要 `/test`\n) {\n    override suspend fun CommandContext.onCommand(args: MessageChain) {\n    }\n}\n```\n\n*Java*\n\n```java\npublic final class MyCommand extends JRawCommand {\n    public static final MyCommand INSTANCE = new MyCommand();\n\n    private MyCommand() {\n        super(MyPluginMain.INSTANCE, \"test\"); // 使用插件主类对象作为指令拥有者；设置主指令名为 \"test\"\n        // 可选设置如下属性\n        setUsage(\"/test\"); // 设置用法，这将会在 /help 中展示\n        setDescription(\"这是一个测试指令\"); // 设置描述，也会在 /help 中展示\n        setPrefixOptional(true); // 设置指令前缀是可选的，即使用 `test` 也能执行指令而不需要 `/test`\n    }\n\n    @Override\n    public void onCommand(@NotNull CommandSender sender, @NotNull MessageChain args) {\n        // 处理指令\n    }\n}\n```\n\n### 参数智能解析\n\nConsole\n提供参数智能解析功能，可以阅读用户手册的 [指令参数智能解析](../../docs/ConsoleTerminal.md#指令参数智能解析)\n了解这一功能。\n\n有两种指令实现支持这个功能，它们分别是简单指令 `SimpleCommand` 和复合指令 `CompositeCommand`。\n\n### 复合指令\n\n复合指令即 `CompositeCommand`，支持参数智能解析。\n\nConsole 通过反射实现参数类型识别。标注 `@SubCommand` 的函数（方法）都会被看作是子指令。\n\n一个简单的子指令定义如下：\n\n*Kotlin*\n\n```kotlin\nobject MyComposite : CompositeCommand() {\n    // ...\n\n    @SubCommand(\"name\")\n    suspend fun foo(context: CommandContext, arg: String) {\n        println(arg)\n    }\n}\n```\n\n*Java*\n\n```java\npublic final class MyComposite extends JCompositeCommand {\n    // ...\n    @SubCommand(\"name\")\n    public void foo(CommandContext context, String arg) {\n        System.out.println(arg);\n    }\n}\n```\n\nJava 使用者请了解 Kotlin 的 `fun foo(context: CommandContext, arg: String)` 相当于\nJava 的 `public void foo(CommandContext context, String arg)`。下面部分简单示例将只用\nKotlin 展示。\n\n#### 子指令\n\n用 `@SubCommand` 标注的函数就是子指令。子指令将隶属于其主指令。定义于主指令 `main` 的名称为 `child`\n的子指令在执行时需要使用 `/main child`，其中 `/` 表示指令前缀（如果需要）。`/main child arg1 arg2`\n中的 `arg1` 和 `arg2` 则分别表示传递给子指令的第一个和第二个参数。\n\n子指令可以拥有多个名称，即 `@SubCommand(\"child1\", \"child2\")` 可以由 `/main child1`\n或 `/main child2` 执行。\n\n#### 子指令名称\n\n`@SubCommand` 的参数为子指令的名称，可以有多个名称，即 `@SubCommand(\"name1\", \"name2\")`\n。若子指令名称与函数名称相同，可以省略 `@SubCommand`\n的参数。例如 `@SubCommand(\"foo\") suspend fun foo()`\n可以简写为 `@SubCommand suspend fun foo()`。\n\n#### 子指令参数\n\n子指令的第一个参数（在 Kotlin 也可以是接收者（`receiver`））可以是 `CommandContext`\n或 `CommandSender`，分别用来获取指令执行环境或发送人。与 `RawCommand`\n相同，如果需要使用原消息链，则使用 `CommandContext`，否则使用 `CommandSender` 的可以让实现更简单。\n\n在这个参数以外的就是是子指令的值参数。\n值参数将会对应消息链。例如定义于名称为 `comp` 的 `CompositeCommand` 中的子指令 `@SubCommand fun foo(context: CommandContext, arg1: String, arg2: Int)`\n在由 `/comp foo str 1` 执行时，`str` 将会传递给 `arg1`；`1` 将会传递给 `arg2`。将会在下文详细解释此内容。\n\n在 Kotlin，子指令既可以是 `suspend` 也可以不是。子指令在不是挂起函数时可以使用阻塞 IO（如 `File.readText`），因为子指令会在 IO 线程执行。\n\n#### 定义参数\n\n子指令函数（方法）定义的参数将按顺序成为指令的参数。如下示例中 `arg1` 将成为第一个参数，`arg2` 为第二个：\n\n*Kotlin*\n\n```kotlin\nobject MyComposite : CompositeCommand(MyPluginMain, \"main\") {\n    // ...\n\n    @SubCommand(\"name\")\n    suspend fun foo(context: CommandContext, arg: String, b: Boolean) {\n        println(arg)\n    }\n}\n```\n\n*Java*\n\n```java\npublic final class MyComposite extends JCompositeCommand {\n    public MyComposite() {\n        super(MyPluginMain.INSTANCE, \"main\");\n        // ...\n    }\n\n    // ...\n    @SubCommand(\"name\")\n    public void foo(CommandContext context, String arg, boolean b) {\n        System.out.println(arg);\n    }\n}\n```\n\n在执行时，`/main name 1 true` 中 `1` 将会被解析为 `String` 类型的参数 `arg`、`true`\n将会被解析为 `boolean` 参数的 `b`。\n\n#### 内置智能解析\n\n可参考 `CommandValueArgumentParser`，Console 内置支持以下类型的参数：\n\n- `Message`\n- `SingleMessage`\n- `MessageContent`\n- 原生数据类型\n- `PlainText`\n- `Image`\n- `String`\n- `Bot`\n- `Contact`\n- `User`\n- `Friend`\n- `Member`\n- `Group`\n- `PermissionId`\n- `PermitteeId`\n- `Enum`\n- `TemporalAccessor`\n\n#### 自定义智能解析\n\n可在 `CmopositeCommand` 继承 `context` 属性增加自定义解析器。下面示例中为 `Boolean`\n指定了自定义的解析器，子指令的 `b` 参数将会用此解析器解析。\n\n*Kotlin*\n\n```kotlin\nobject CustomBooleanParser : CommandValueArgumentParser<Boolean> {\n    override fun parse(raw: String, sender: CommandSender): Boolean {\n        return raw == \"TRUE!\"\n    }\n    override fun parse(\n        raw: MessageContent,\n        sender: CommandSender\n    ): Boolean {\n        // 将一个图片认为是 'true'\n        if (raw is Image && raw.imageId == \"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\") {\n            return true\n        }\n        return super.parse(raw, sender)\n    }\n}\n\nobject MyComposite : CompositeCommand(\n    MyPluginMain, \"main\",\n    overrideContext = buildCommandArgumentContext {\n        Boolean::class with CustomBooleanParser\n    }\n) {\n    // ...\n    @SubCommand(\"name\")\n    suspend fun foo(context: CommandContext, arg: String, b: Boolean) {\n        println(b)\n    }\n}\n```\n\n*Java*\n\n```java\n// CustomBooleanParser.java\npublic final class CustomBooleanParser implements CommandValueArgumentParser<Boolean> {\n    @NotNull\n    @Override\n    public Boolean parse(@NotNull String raw, @NotNull CommandSender sender) throws CommandArgumentParserException {\n        return raw.equals(\"TRUE!\");\n    }\n\n    @NotNull\n    @Override\n    public Boolean parse(@NotNull MessageContent raw, @NotNull CommandSender sender) throws CommandArgumentParserException {\n        // 将一个图片认为是 'true'\n        if (raw instanceof Image && ((Image) raw).getImageId().equals(\"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\")) {\n            return true;\n        }\n        return CommandValueArgumentParser.super.parse(raw, sender);\n    }\n}\n\n// MyComposite.java\npublic final class MyComposite extends JCompositeCommand {\n    public MyComposite() {\n        super(MyPluginMain.INSTANCE, \"main\");\n        // ...\n\n        addArgumentContext(new CommandArgumentContextBuilder()\n                .add(Boolean.TYPE, new CustomBooleanParser()) // 注册解析器\n                .build());\n    }\n\n    // ...\n    @SubCommand(\"name\")\n    public void foo(CommandContext context, String arg, boolean b) {\n        System.out.println(b);\n    }\n}\n```\n\n在 `parse` 时抛出 `CommandArgumentParserException`\n会被看作是正常退出，异常的内容会返回给指令调用人。在 `parse` 时抛出其他异常则会认为是插件错误。\n\n### 简单指令\n\n简单指令与复合指令拥有一样的智能参数解析功能。简单指令没有子指令，使用 `@Handler` 标注一个函数可以让它处理指令：\n\n*Kotlin*\n\n```kotlin\nobject MySimple : SimpleCommand(MyPluginMain, \"main\") {\n    // ...\n    @Handler\n    suspend fun foo(context: CommandContext, arg: String, b: Boolean) {\n        println(b)\n    }\n}\n```\n\n*Java*\n\n```java\n// MySimple.java\npublic final class MySimple extends JSimpleCommand {\n    public MySimple() {\n        super(MyPluginMain.INSTANCE, \"main\");\n        // ...\n    }\n\n    // ...\n    @Handler\n    public void foo(CommandContext context, String arg, boolean b) {\n        System.out.println(b);\n    }\n}\n```\n\n在执行时，`/main aaaa false` 将会调用 `foo` 函数（方法）。`aaaa` 匹配 `String` 类型的参数 `arg`\n，`false` 匹配 `boolean` 类型的参数 `b`。\n\n简单指令也可以使用自定义参数解析器，用法与复合指令一样。\n\n*Kotlin*\n\n```kotlin\nobject MySimple : SimpleCommand(\n    MyPluginMain, \"main\",\n    overrideContext = buildCommandArgumentContext {\n        Boolean::class with CustomBooleanParser\n    }\n) {\n    // ...\n    @Handler\n    suspend fun foo(context: CommandContext, arg: String, b: Boolean) {\n        println(b)\n    }\n}\n```\n\n*Java*\n\n```java\n// MySimple.java\npublic final class MySimple extends JSimpleCommand {\n    public MySimple() {\n        super(MyPluginMain.INSTANCE, \"main\");\n        // ...\n\n        addArgumentContext(new CommandArgumentContextBuilder()\n                .add(Boolean.TYPE, new CustomBooleanParser()) // 注册解析器\n                .build());\n    }\n\n    // ...\n    @Handler\n    public void foo(CommandContext context, String arg, boolean b) {\n        System.out.println(b);\n    }\n}\n```\n\n### 选择 [`RawCommand`], [`SimpleCommand`] 或 [`CompositeCommand`]\n\n若需要不限长度的，自由的参数列表，使用 [`RawCommand`]。\n\n若需要子指令，使用 [`CompositeCommand`]。否则使用 [`SimpleCommand`]。\n\n### 自行实现指令\n\nConsole 允许插件自行实现指令（不使用上述 `RawCommand`、`SimpleCommand`\n和 `CompositeCommand`）。但注意，在实现时难免会需要使用到抽象指令描述器（如 `CommandArgument`\n），而这些描述器是不稳定的。因此插件自行实现指令可能会导致不兼容未来的 Console 版本。\n\n\n注册指令\n-------\n\n所有指令都需要注册到指令管理器才能生效。要注册指令，在 `onEnable`\n使用 `CommandManager.registerCommand(command)`。\n\n### 查看已注册的所有指令\n\n使用 `PluginManager.INSTANCE.getAllRegisteredCommands()`\n。可以获得当前已经注册的所有 `Command` 实例列表。\n\n\n执行指令\n-------\n\n指令既可以由插件执行，也可以在消息环境中由用户执行（需要 [chat-command](https://github.com/project-mirai/chat-command)\n）。\n\n### 在插件执行指令\n\n若要通过字符串解析目标指令并执行，使用 `CommandManager.INSTANCE.executeCommand(CommandSender, Message)`\n，其中 `Message` 为包含前缀（如果有必要）、指令名称、以及指令参数列表的完整消息。\n\n若要通过字符串解析目标指令并执行，使用 `CommandManager.INSTANCE.executeCommand(CommandSender, Command, Message)`\n，其中 `Message` 传递给指令的参数列表，不包含前缀或指令名称。注意，若要执行复合指令，需要包含子指令名称。\n\n### 指令语法解析\n\n一条消息可以被解析为指令，如果它满足：\n\n```text\n<指令前缀><任一指令名> <指令参数列表>\n```\n\n指令参数列表由空格分隔。\n\n### 指令解析流程\n\n> 注意：该流程可能会变化，请不要依赖这个流程。\n\n对于\n\n```text\n@Handler suspend fun handle(context: CommandContext, target: User, message: String) \n```\n\n指令 `/tell 123456 Hello` 的解析流程:\n\n1. 被分割为 `/`, `\"tell\"`, `\"123456\"`, `\"Hello\"`\n2. 根据 `/` 和 `\"test\"`，确定 `MySimpleCommand` 作为目标指令。`\"123456\"`, `\"Hello\"`\n   作为指令的原生参数。\n3. 由于 `MySimpleCommand` 定义的 `handle` 需要两个参数, 即 `User` 和 `String`\n   ，`\"123456\"` 需要转换成 `User`，`\"Hello\"` 需要转换成 `String`。\n4. 指令寻找合适的解析器（`CommandValueArgumentParser`）\n5. `\"123456\"` 通过 `ExistingUserValueArgumentParser` 变为 `User` 类型的参数\n6. `\"Hello\"` 通过 `StringValueArgumentParser` 变为 `String` 类型的参数\n7. 解析完成的参数传入 `handle`\n\n文本参数转义\n-----\n\n不同的参数默认用空格分隔。有时用户希望在文字参数中包含空格本身，参数解析器可以接受三种表示方法。\n\n以上文中定义的 `MySimpleCommand` 为例：\n\n### 英文双引号\n\n表示将其中内容作为一个参数，可以包括空格。\n\n例如：用户输入 `/tell 123456 \"Hello world!\"` ，`message` 会收到 `Hello world!`。\n\n注意：双引号仅在参数的首尾部生效。例如，用户输入 `/tell 123456 He\"llo world!\"`，`message`\n只会得到 `He\"llo`。\n\n### 转义符\n\n即英文反斜杠 `\\`。表示忽略之后一个字符的特殊含义，仅看作字符本身。\n\n例如：\n\n- 用户输入 `/tell 123456 Hello\\ world!`，`message` 得到 `Hello world!`；\n- 用户输入 `/tell 123456 \\\"Hello world!\\\"`，`message` 得到 `\"Hello`。\n\n### 暂停解析标志\n\n即连续两个英文短横线 `--`。表示从此处开始，到**这段文字内容**结束为止，都作为一个完整参数。\n\n例如：\n\n- 用户输入 `/tell 123456 -- Hello:::test\\12\"\"3`，`message`\n  得到 `Hello:::test\\12\"\"3`（`:` 表示空格）；\n- 用户输入 `/tell 123456 -- Hello @全体成员 test1 test2`，那么暂停解析的作用范围到 `@`\n  为止，之后的 `test1` 和 `test2` 是不同的参数。\n- 用户输入 `/tell 123456 \\-- Hello` 或 `/tell 123456 \"--\" Hello`\n  ，这不是暂停解析标志，`message` 得到 `--` 本身。\n\n注意：\n\n`--` 的前后都应与其他参数有间隔，否则不认为这是暂停解析标志。\n\n例如，用户输入 `/tell 123456--Hello world!`，`123456--Hello` 会被试图转换为 `User`\n并出错。即使转换成功，`message` 也只会得到 `world!`。\n\n### 非文本参数的转义\n\n有时可能需要只用一个参数来接受各种消息内容，例如用户可以在 `/tell 123456` 后接图片、表情等，它们都是 `message`\n的一部分。\n\n对于这种定义方式，Mirai Console 的支持尚待实现，目前可以使用 [`RawCommand`] 替代。\n\n## 指令发送者\n\n指令可能在聊天环境执行，也可能在控制台执行。\n指令发送者即 `CommandSender`，是执行指令时的必须品之一。\n\n### 类型\n\n```text\n                 CommandSender <---------+---------------+-------------------------------+\n                       ↑                 |               |                               |\n                       |                 |               |                               |\n                       |     UserCommandSender   GroupAwareCommandSender     CommandSenderOnMessage\n                       |                 ↑               ↑                               ↑\n                       |                 |               |                               |\n              AbstractCommandSender      |               |                               |\n                       ↑                 |               |                               |\n                       | sealed          |               |                               |\n         +-------------+-------------+   |               |                               |\n         |                           |   |               |                               |\n         |                           |   |               |                               |      }\nConsoleCommandSender    AbstractUserCommandSender        |                               |      } 一级子类\n                                     ↑                   |                               |      }\n                                     | sealed            |                               |\n                                     |                   |                               |\n              +----------------------+                   |                               |\n              |                      |                   |                               |\n              |                      +------+------------+---------------+               |\n              |                             |                            |               |\n              |                             |                            |               |      }\n      FriendCommandSender          MemberCommandSender           TempCommandSender       |      } 二级子类\n              ↑                             ↑                            ↑               |      }\n              |                             |                            |               |\n              |                             |                            |               |      }\n FriendCommandSenderOnMessage  MemberCommandSenderOnMessage  TempCommandSenderOnMessage  |      } 三级子类\n              |                             |                            |               |      }\n              |                             |                            |               |\n              +-----------------------------+----------------------------+---------------+\n ```\n\n有关类型的详细信息，请查看 [CommandSender.kt](../backend/mirai-console/src/command/CommandSender.kt#L48-L135)\n\n### 获取控制台指令发送者\n\n`ConsoleCommandSender` 表示以控制台身份执行指令。它是一个单例对象，在 Kotlin 可以直接通过类型获得类名获得实例，在\nJava 可通过 `ConsoleCommandSender.INSTANCE` 获得。\n\n### 获取其他指令发送者\n\n在 Kotlin 可使用扩展函数：`Contact.asCommandSender()`\n或 `MessageEvent.toCommandSender()`\n。\n\n在 Java 可使用 `CommandSender.from` 和 `CommandSender.of`。\n\n\n\n[`MessageScope`]\n-----\n\n表示几个消息对象的'域'，即消息对象的集合。用于最小化将同一条消息发送给多个类型不同的目标的付出。示例：\n\n*Kotlin*\n\n```kotlin\n// 在一个 CompositeCommand 内\n@Handler\nsuspend fun CommandSender.handle(target: Member) {\n    val duration = Random.nextInt(1, 15)\n    target.mute(duration)\n\n\n    // 不使用 MessageScope, 无用的样板代码\n    val thisGroup = this.getGroupOrNull()\n    val message = \"${this.name} 禁言 ${target.nameCardOrNick} $duration 秒\"\n    if (target.group != thisGroup) {\n        target.group.sendMessage(message)\n    }\n    sendMessage(message)\n\n\n    // 使用 MessageScope, 清晰逻辑\n    // 表示至少发送给 `this`, 当 `this` 的真实发信对象与 `target.group` 不同时, 还额外发送给 `target.group`\n    this.scopeWith(target.group) {\n        sendMessage(\"${name} 禁言了 ${target.nameCardOrNick} $duration 秒\")\n    }\n\n\n    // 同样地, 可以扩展用法, 同时私聊指令执行者:\n    // this.scopeWith(\n    //    target,\n    //    target.group\n    // ) { ... }\n}\n```\n\n*Java*\n\n```java\npublic class MyCommand extends SimpleCommand {\n    @Handler\n    public void handle(sender: CommandSender, target: Member) {\n        int duration = Random.nextInt(1, 15);\n        target.mute(duration);\n\n\n        // 不使用 MessageScope\n        Group thisGroup = CommandSenderKt.getGroupOrNull(sender);\n        String message = \"${this.name} 禁言 ${target.nameCardOrNick} $duration 秒\";\n        if (!target.group.equals(thisGroup)) {\n            target.group.sendMessage(message);\n        }\n        sender.sendMessage(message);\n\n\n        // 使用 MessageScope\n        // 表示至少发送给 `this`, 当 `this` 的真实发信对象与 `target.group` 不同时, 还额外发送给 `target.group`\n        MessageScope scope = MessageScopeKt.scopeWith(sender, target);\n        scope.sendMessage(\"${name} 禁言了 ${target.nameCardOrNick} $duration 秒\");\n\n        // 或是只用一行：\n        MessageScopeKt.scopeWith(sender, target).sendMessage(\"${name} 禁言了 ${target.nameCardOrNick} $duration 秒\");\n    }\n}\n```\n\n----\n\n> 下一步，[PluginData](PluginData.md#mirai-console-backend---plugindata)\n>\n> 返回 [开发文档索引](README.md#mirai-console)\n\n"
  },
  {
    "path": "mirai-console/docs/ConfiguringProjects.md",
    "content": "# Mirai Console - Configuring Projects\n\n配置 Mirai Console 项目。\n\n## 模块说明\n\nMirai Console 分前后端模块实现。开发插件**只需要针对同一个后端开发**，便可以运行在所有前端。\n\n现有的前端如下所示。你不需要下载它们，因为插件的开发都是通用的。\n\n- `mirai-console-terminal`: JVM 终端前端，适合在测试环境或服务器运行。\n- [`MiraiAndroid`](https://github.com/mzdluo123/MiraiAndroid): Android 应用前端，可兼容大部分 Mirai Console 插件。\n- [`mirai-compose`](https://github.com/sonder-joker/mirai-compose): 跨平台桌面图形前端，拥有可视化管理。正处于测试阶段。\n\n## 选择版本\n\n`mirai-console` 与 `mirai-core` **同步版本**\n发布。版本号见 [mirai](/docs/ConfiguringProjects.md#%E9%80%89%E6%8B%A9%E7%89%88%E6%9C%AC)\n。\n\n通常使用最新版本的稳定版本即可。\n\n## 配置项目\n\n请选择以下四种方法之一。不推荐使用 Maven 构建 Mirai Console 插件。\n\n### A.使用项目创建工具\n\nMirai 为 IntelliJ IDEA 或 Android Studio\n提供插件: [安装方法](/docs/Preparations.md#%E5%AE%89%E8%A3%85-ide-%E6%8F%92%E4%BB%B6)\n\n之后便可在新建项目时选择 `Mirai`\n，将会自动套用 [模板项目](https://github.com/project-mirai/mirai-console-plugin-template)。\n\n![](.ConfiguringProjects_images/6d010b1a.png)\n\n![](.ConfiguringProjects_images/a6a3b24b.png)\n\n> 现在你已经配置好了项目，开始阅读 [Core 开发文档](/docs/CoreAPI.md) 或 [Console 开发文档](README.md#mirai-console)\n\n### B.使用模板项目\n\nMirai 鼓励插件开发者将自己的作品开源，并为此提供了模板项目。\n\n注意，模板项目依赖的版本号不一定是最新的。请自行替换。\n\n1. 访问 [mirai-console-plugin-template](https://github.com/project-mirai/mirai-console-plugin-template)\n\n2. 点击绿色按钮 \"Use this template\"，创建项目\n\n3. 克隆项目，检查并修改生成的属性\n\n> 现在你已经配置好了项目，开始阅读 [Core 开发文档](/docs/CoreAPI.md) 或 [Console 开发文档](README.md#mirai-console)\n\n### C.使用 Gradle 插件配置项目\n\n`VERSION`: [选择版本](#选择版本)\n\n若使用 `build.gradle.kts`:\n```kotlin\nplugins {\n    kotlin(\"jvm\") version \"1.5.10\"\n    kotlin(\"plugin.serialization\") version \"1.5.10\"\n    \n    id(\"net.mamoe.mirai-console\") version \"VERSION\"\n}\n```\n\n若使用 `build.gradle`:\n```groovy\nplugins {\n    id 'org.jetbrains.kotlin.jvm' version '1.5.10'\n    id 'org.jetbrains.kotlin.plugin.serialization' version '1.5.10'\n    \n    id 'net.mamoe.mirai-console' version 'VERSION'\n}\n```\n\n完成。Mirai Console Gradle 插件会为你配置依赖等所有编译环境。\n\n可以在 [README](../tools/gradle-plugin/README.md#mirai-console-gradle-plugin) 获取详细的 Gradle 插件使用方法。\n\n> 现在你已经配置好了项目，开始阅读 [Core 开发文档](/docs/CoreAPI.md) 或 [Console 开发文档](README.md#mirai-console)\n\n### D.手动配置项目\n\n不推荐这种方式，因为通常还需要配置一些不容易配置的编译器参数。\n\n添加依赖：\n\n`build.gradle.kts` 或 `build.gradle`：\n```kotlin\ndependencies {\n  compileOnly(\"net.mamoe:mirai-core:$CORE_VERSION\") // mirai-core 的 API\n  compileOnly(\"net.mamoe:mirai-console:$CONSOLE_VERSION\") // 后端\n  \n  testImplementation(\"net.mamoe:mirai-console-terminal:$CONSOLE_VERSION\") // 前端, 用于启动测试\n}\n```\n\n注意，在打包插件时必须将依赖一并打包进插件 JAR，且排除 `mirai-core`，`mirai-console` 和[它们的间接依赖](https://mvnrepository.com/artifact/net.mamoe/mirai-core-jvm/2.4.0)，否则可能导致兼容性问题。\n\n> 现在你已经配置好了项目，开始阅读 [Core 开发文档](/docs/CoreAPI.md) 或 [Console 开发文档](README.md#mirai-console)\n"
  },
  {
    "path": "mirai-console/docs/Contributing.md",
    "content": "# Mirai Console - Contributing\n\n感谢你来到这里，感谢你对 Mirai Console 做的一切贡献。\n\n## 开发 Mirai Console\n\n### 模块\n\nMirai Console 项目由四个模块组成：后端，前端，Gradle 插件，Intellij 插件。\n\n```\n/\n|--- backend                     后端\n|  |--- codegen                     后端代码生成工具\n|  `--- mirai-console               后端主模块, 发布为 net.mamoe:mirai-console\n|--- buildSrc                    项目构建\n|--- frontend                    前端\n|  `--- mirai-console-terminal      终端前端，发布为 net.mamoe:mirai-console-terminal\n`--- tools                       开发工具\n   |--- compiler-common             编译器通用模块\n   |--- gradle-plugin               Gradle 插件，发布为 net.mamoe.mirai-console\n   `--- intellij-plugin             IntelliJ 平台 IDE 插件，发布为 Mirai Console\n```\n\n请前往各模块内的 README.md 查看详细说明。\n\n### 构建\n```shell script\n./gradlew build\n```\n\n首次加载和构建 mirai-console 项目可能要花费数小时时间。\n\n## 贡献代码\n\n### 代码风格\n- 请优先使用 Kotlin\n- 请遵守 [Kotlin 官方代码风格](https://www.kotlincn.net/docs/reference/coding-conventions.html)\n\n\n<!--\n## 发布版本\n\n（以下内容针对拥有 Mirai Console write 权限的项目成员）\n\n若你要发布一个 Mirai Console dev release：\n\n1. 添加 Git 版本号 tag，格式为 `v1.0.1-dev-1`；\n2. `git push --tags` 推送 tag 更新，GitHub Actions 将会检测到 tag 更新并执行 JCenter 发布。\n\n\n若你要发布一个 Mirai Console 稳定版 release，请按顺序进行如下检查：\n\n\n1. 在 GitHub [milestones](https://github.com/mamoe/mirai-console/milestones) 确认目标版本的工作已经处理完毕；\n2. Close milestone；\n3. 更新 buildSrc/Versions.kt 中 `project` 版本号为目标版本；\n4. 在 [ConfiguringProjects](ConfiguringProjects.md#选择版本) 更新稳定版本号；\n5. 本地执行 `./gradlew fillBuildConstants`；\n6. Push 前几步的修改为同一个 commit，commit 备注为版本号名称，如 `1.1.0`；\n7. 在 GitHub release 根据 Git commit 记录编写更新记录：\n   - 描述所有来自社区的 PR 记录；\n   - 完整列举公开 API 的任何变动，简要描述或省略内部变动；\n   - 为更改按 “后端”，“前端”，“IDE 插件”，“Gradle 插件” 分类；\n8. 点击 `Publish`。GitHub Actions 将会检测到 tag 更新并执行 JCenter 发布。\n\n-->"
  },
  {
    "path": "mirai-console/docs/Extensions.md",
    "content": "# Mirai Console Backend - Extensions\n\nMirai Console 拥有灵活的 Extensions API，支持扩展 Console 的一些服务。\n\nExtensions 属于插件开发的进阶内容。\n\n[`Extension`]: ../backend/mirai-console/src/extension/Extension.kt\n[`ExtensionPoint`]: ../backend/mirai-console/src/extension/ExtensionPoint.kt\n[`PluginComponentStorage`]: ../backend/mirai-console/src/extension/PluginComponentStorage.kt\n[`ComponentStorage`]: ../backend/mirai-console/src/extension/ComponentStorage.kt\n\n## [扩展][`Extension`]\n\n### [组件容器][`ComponentStorage`]\n\n容纳插件注册的 [扩展][`Extension`]。\n\n### 注册扩展\n\n插件仅能在 [`onLoad`](Plugins.md#加载) 阶段注册扩展。\n\n示例：\n\n```kotlin\nobject MyPlugin : KotlinPlugin( /* ... */ ) {\n    fun PluginComponentStorage.onLoad() {\n        contributePermissionService { /* ... */ }\n        contributePluginLoader { /* ... */ }\n        contribute(ExtensionPoint) { /* ... */ }\n    }\n}\n\n```\n\n```java\n// java\npublic class MyPlugin extends JavaPlugin {\n    public MyPlugin() {\n        // ...\n    }\n\n    @Override\n    public void onLoad(PluginComponentStorage pcs) {\n        pcs.contributePermissionService(() -> { /* ... */ });\n        pcs.contributePluginLoader(() -> { /* ... */ });\n        pcs.contribute(ExtensionPoint, () -> { /* ... */ });\n    }\n}\n```\n\n\n\n### 可用扩展\n\n查看 [extensions](../backend/mirai-console/src/extensions)。每个文件对应一个扩展。"
  },
  {
    "path": "mirai-console/docs/FrontEnd.md",
    "content": "# Mirai Console Frontend\n\nMirai Console 前端开发文档。\n\n[`MiraiConsole`]: ../backend/mirai-console/src/MiraiConsole.kt\n\n## 实现前端\n\n### 添加编译器设置\n\n在 `build.gradle` 或 `build.gradle.kts` 添加：\n```kotlin\nkotlin.sourceSets.all {\n    languageSettings.optIn(\"net.mamoe.mirai.console.ConsoleFrontEndImplementation\")\n}\n```\n\n此后就可以使用 `net.mamoe.mirai.console.ConsoleFrontEndImplementation` 标记的所有 API。\n\n\n### 实现 Mirai Console\n\n[`MiraiConsole`] 是后端的公开对象，由 [MiraiConsoleImplementationBridge](../backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt) 代理，与前端链接。\n\n前端需要实现 [MiraiConsoleImplementation.kt](../backend/mirai-console/src/MiraiConsoleImplementation.kt)。\n\n由于实现前端需要一定的技术能力，相信实现者都能理解源码内注释。\n\n### 启动 Mirai Console\n\n通过 `public fun MiraiConsoleImplementation.start()`。\n\n[MiraiConsoleImplementation.kt: Line 161](../backend/mirai-console/src/MiraiConsoleImplementation.kt#L161)\n"
  },
  {
    "path": "mirai-console/docs/Logging.md",
    "content": "# Mirai Console Backend - Logging\n\nConsole 的日志一共有五个级别：\n\n|  级别（由高到低）  | 用途           |  默认启用  |\n|:----------:|--------------|:------:|\n|   ERROR    | 记录影响程序运行的错误  |   是    |\n|  WARNING   | 记录不影响程序运行的警告 |   是    |\n|    INFO    | 记录一条普通信息     |   是    |\n|   DEBUG    | 记录普通调试信息     |   否    |\n|  VERBOSE   | 记录详细调试信息     |   否    |\n\n`DEBUG` 和 `VERBOSE`\n作为调试信息，默认关闭。插件开发者可能会使用这两个级别来输出调试信息。如果你在使用中遇到问题，启用这个两个级别获得更多日志后再报告开发者可能更有帮助。\n\n特别地，`ALL` 表示启用全部日志，`NONE` 表示禁用全部日志。\n\n在终端前端（或 [MCL](https://github.com/iTXTech/mirai-console-loader)\n），日志配置文件默认路径为 `config/Console/Logger.yml`。示例内容为如下。\n\n```yaml\n# 默认日志输出等级 可选值: ALL, VERBOSE, DEBUG, INFO, WARNING, ERROR, NONE\ndefaultPriority: INFO\n# 特定日志记录器输出等级\nloggers:\n    example.logger: NONE\n    console.debug: NONE\n    Bot: ALL\n```\n\n## 调整全局默认日志等级\n\n修改 `defaultPriority` 即可修改全局默认日志等级。\n\n例如设置为 DEBUG，则启用上表中 DEBUG 及更高级别的日志，即\nDEBUG、INFO、WARNING、ERROR。\n\n## 调整特定日志等级\n\n每个插件被分配的日志的 ID 为插件的显示名称。\n\n提示：该 ID 也可以在日志中找到。如下面的日志中，`Bot 12345678` 就是其所属日志的 ID。（`V`\n代表等级为 VERBOSE，以首字母识别）\n\n```text\n2022-05-02 11:09:28 V/Bot 12345678: Event: BotOnlineEvent(bot=Bot(12345678))\n```\n\n如果在日志配置这样修改：\n\n```yaml\nloggers:\n    \"Bot 12345678\": NONE\n```\n\n那么将禁用来自该 Bot 的所有日志。\n\n假设要启用名为 `Chat Command` 的插件的 DEBUG 及更高级别的日志：\n\n```yaml\nloggers:\n    \"Chat Command\": DEBUG\n```\n"
  },
  {
    "path": "mirai-console/docs/Permissions.md",
    "content": "# Mirai Console Backend - Permissions\n\nMirai Console 权限系统。\n\n> 优先使用 Mirai Console 权限系统管理权限是最好的选择\n\n[`PermissionService`]: ../backend/mirai-console/src/permission/PermissionService.kt\n[`Permission`]: ../backend/mirai-console/src/permission/Permission.kt\n[`RootPermission`]: ../backend/mirai-console/src/permission/Permission.kt#L82\n[`PermissionId`]: ../backend/mirai-console/src/permission/PermissionId.kt\n[`PermissionIdNamespace`]: ../backend/mirai-console/src/permission/PermissionIdNamespace.kt\n[`Permittee`]: ../backend/mirai-console/src/permission/Permittee.kt\n[`PermitteeId`]: ../backend/mirai-console/src/permission/PermitteeId.kt\n[`AbstractPermitteeId`]: ../backend/mirai-console/src/permission/PermitteeId.kt#L77\n[`CommandSender`]: ../backend/mirai-console/src/command/CommandSender.kt\n\n## 权限\n\n每个权限都由 [`Permission`] 对象表示。\n\n一个 [`Permission`] 拥有这些信息：\n```kotlin\ninterface Permission {\n    val id: PermissionId // 唯一识别 ID\n    val description: String // 描述信息\n    val parent: Permission // 父权限\n}\n```\n\n「权限」表示的意义是 “做一项工作的能力”。如 “执行指令 /stop”，“操作数据库” 都能叫作权限。\n\n[`Permission`] 对象由 Console 内置或者由特定权限插件实现。其他插件不能实现 [`Permission`] 接口，只能从 `PermissionService` 注册并获取。\n\n### 权限 ID\n\n```kotlin\ndata class PermissionId(\n    val namespace: String, // 命名空间\n    val name: String, // 名称\n)\n```\n\n[`PermissionId`] 是 [`Permission`] 的唯一标识符。知道 [`PermissionId`] 就可以获取到对应的 [`Permission`]。\n\n字符串表示为 `$namespace:$name`，如 `console:command.stop`, `*:*`\n\n> 一般情况下使用位于插件对象(`JvmPlugin`) 的 `permissionId` 为插件分配一个 [`PermissionId`]\n\n#### 命名空间\n\n命名空间（`namespace`）用于限定权限的创建者，避免冲突。\n\n一些常见命名空间：\n\n| 用途          | 命名空间      |\n|:-------------|:------------|\n| 根权限         | `\"*\"`       |\n| Console 内置  | `\"console\"` |\n| ID 为 A 的插件 | `\"A\"`       |\n\n#### 名称\n\n名称则表示特定的含义。如一个指令，某一项操作等。\n\n一些常见名称：\n\n| 用途                       | 名称           |\n|:--------------------------|:--------------|\n| 根权限                     | `\"*\"`         |\n| Console 内置的名为 A 的指令  | `\"command.A\"` |\n| ID 为 A 的插件的名为 B 的指令 | `\"command.B\"` |\n\n#### 根权限\n\n[`RootPermission`] 是所有权限的父权限。其 ID 为 `*:*`\n\n> 如果 [`Permittee`] (见下文) 拥有根权限, 相当于 [`Permittee`] 拥有全部权限 (内置实现)\n\n## 被许可人\n\n```kotlin\ninterface Permittee {\n    val permitteeId: PermitteeId\n}\n```\n\n[`Permittee`] 表示一个可被赋予权限的对象，即 '被许可人'。\n\n[`CommandSender`] 实现 [`Permittee`]。\n\n被许可人自身不持有拥有的权限列表，而是拥有 [`PermitteeId`]，标识自己的身份，供 [权限服务][`PermissionService`] 处理。\n\n**注意**：请不要自主实现 [`Permittee`]。\n\n### 被许可人 ID\n\n```kotlin\ninterface PermitteeId {\n    val directParents: Array<out PermitteeId> // 直接父对象\n    fun asString(): String // 转换为字符串表示\n}\n````\n\n[`PermitteeId`] 是被许可人的标识符。\n\n一个这样的标识符既可代表特定的单个 [`Permittee`], 也可以表示多个同类 [`Permittee`].\n\n#### `directParents`\n[`PermitteeId`] 允许拥有多个父对象。在检查权限时会首先检查自己, 再递归检查父类。\n\n#### 衍生类型\n\n[`PermitteeId`] 的实现通常是 [`AbstractPermitteeId`]\n\n在 [`AbstractPermitteeId`] 查看其子类。\n\n**注意**: 对应 [权限服务][`PermissionService`] 没明确说明可以自行实现时, 不要轻易实现 [`PermitteeId`]\n\n#### 字符串表示\n\n当使用 `PermitteeId.asString` 时, 不同的类型的返回值如下表所示. 这些格式也适用于 [权限指令](#使用内置权限服务指令).  \n(不区分大小写. 不区分 Bot).\n\n|    被许可人类型    | 字符串表示示例 | 备注                                 |\n|:----------------:|:-----------:|:------------------------------------|\n|      控制台       |   console   |                                     |\n|   任意其他客户端    |   client*   | 即 Bot 自己发消息给自己                |\n|      精确群       |   g123456   | 表示群, **而不表示群成员, 不表示群成员** |\n|      精确好友      |   f123456   | 必须通过好友消息                       |\n|   精确群临时会话    | t123456.789 | 群 123456 内的成员 789. 必须通过临时会话 |\n|     精确群成员     | m123456.789 | 群 123456 内的成员 789. 同时包含临时会话 |\n|      精确用户      |   u123456   | 同时包含群成员, 好友, 临时会话           |\n|      任意群       |     g\\*     | g 意为 group, **不表示群成员**           |\n|  任意群的任意群员   |     m\\*     | m 意为 member                        |\n|  精确群的任意群员   | m123456.\\*  | 群 123456 内的任意成员. 同时包含临时会话  |\n|    任意临时会话    |     t\\*      | t 意为 temp. 必须通过临时会话          |\n| 精确群的任意临时会话 | t123456.\\*  | 群 123456 内的任意成员. 必须通过临时会话  |\n|      任意好友      |     f\\*     | f 意为 friend                       |\n|      任意用户      |     u\\*     | u 意为 user. 任何人在任何环境           |\n|     任意陌生人     |     s\\*     | s 意为 stranger. 任何人在任何环境       |\n|    任意联系对象    |      \\*      | 即任何人, 任何群. 不包括控制台           |\n\n### 获取被许可人\n\n在 Kotlin 通常使用 `CommandSender.permitteeId`，在 Java 使用 `CommandSender.getPermitteeId( )`。  \n也可以直接构造 [`AbstractPermitteeId`] 的子类。或者在 Kotlin 使用扩展 `User.permitteeId`。\n\n## 权限服务\n\n[`PermissionService`] 承载权限的授权和管理。 Console 的权限系统完全由 [`PermissionService`] 提供支持。\n权限服务可以由插件提供（见 [扩展](Extensions.md)）。\n在没有任何提供权限服务的插件时会使用 Console 内置实现。\n\n在整个运行时 Console 只会使用同一个权限服务，如果安装多个提供权限服务的插件很有可能导致崩溃。\n\n> 如果运行于 JVM 平台,\n> 可以使用 [Karlatemp/LuckPerms-Mirai](https://github.com/Karlatemp/LuckPerms-Mirai)\n> 以得到更好的使用体验 (支持权限组, 权限检查状态详细输出等)\n\n### 判断权限\n\n在 Kotlin，在该有扩展的对象上 Console 都为它们实现了扩展。可以使用：\n```kotlin\nfun Permittee.hasPermission(Permission): Boolean\nfun Permission.testPermission(Permittee): Boolean\nfun PermitteeId.hasPermission(Permission): Boolean\nfun PermissionId.testPermission(Permittee): Boolean\nfun Permittee.hasPermission(PermissionId): Boolean\nfun Permission.testPermission(PermitteeId): Boolean\n// ... \n```\n\n在 Java，请查看 [`PermissionService`] 中的伴生对象。\n\n\n> 查看使用示例: \n>\n> - [Him188/mirai-console-example-plugin](https://github.com/Him188/mirai-console-example-plugin/blob/master/src/main/kotlin/org/example/my/plugin/MyPluginMain.kt#L116)\n> - [Karlatemp/mirai-console-permission-service-example (gist)](https://gist.github.com/Karlatemp/38b1491dc033854755c0ec7367ba081b)\n\n### 注册权限\n\n每一条指令都会默认自动创建一个权限。\n\n如果希望手动注册一个其他用途的权限，使用 `PermissionService.register`。\n\n**注意**：\n- 权限只能在插件 [启用](Plugins.md#启用) 之后才能注册。否则会得到一个异常。\n- 使用 `PermissionService.register` 时对于同一个 [`PermissionId`] 只能注册一次, 如果多次注册会得到一个异常\n\n### 使用内置权限服务指令\n\n**指令**: \"/permission\", \"/perm\", \"/权限\"\n\n使用指令而不带参数可以获取如下用法：\n```\n/permission cancel <被许可人 ID> <权限 ID>   取消授权一个权限\n/permission cancelall <被许可人 ID> <权限 ID>   取消授权一个权限及其所有子权限\n/permission listpermissions    查看所有权限列表\n/permission permit <被许可人 ID> <权限 ID>   授权一个权限\n/permission permittedpermissions <被许可人 ID>   查看被授权权限列表\n```\n\n其中, 被许可人 ID 使用 [字符串表示](#字符串表示), 权限 ID 参见 [权限 ID](#权限-id)\n\n----\n\n> 这是文档的最后一个章节。\n>\n> 返回 [开发文档索引](README.md#mirai-console)\n\n"
  },
  {
    "path": "mirai-console/docs/PluginData.md",
    "content": "# Mirai Console Backend - PluginData\n\n[`Plugin`]: ../backend/mirai-console/src/plugin/Plugin.kt\n[`PluginDescription`]: ../backend/mirai-console/src/plugin/description/PluginDescription.kt\n[`PluginLoader`]: ../backend/mirai-console/src/plugin/loader/PluginLoader.kt\n[`PluginManager`]: ../backend/mirai-console/src/plugin/PluginManager.kt\n[`JvmPluginLoader`]: ../backend/mirai-console/src/plugin/jvm/JvmPluginLoader.kt\n[`JvmPlugin`]: ../backend/mirai-console/src/plugin/jvm/JvmPlugin.kt\n[`JvmPluginDescription`]: ../backend/mirai-console/src/plugin/jvm/JvmPluginDescription.kt\n[`AbstractJvmPlugin`]: ../backend/mirai-console/src/plugin/jvm/AbstractJvmPlugin.kt\n[`KotlinPlugin`]: ../backend/mirai-console/src/plugin/jvm/KotlinPlugin.kt\n[`JavaPlugin`]: ../backend/mirai-console/src/plugin/jvm/JavaPlugin.kt\n\n\n[`Value`]: ../backend/mirai-console/src/data/Value.kt\n[`PluginData`]: ../backend/mirai-console/src/data/PluginData.kt\n[`AbstractPluginData`]: ../backend/mirai-console/src/data/AbstractPluginData.kt\n[`AutoSavePluginData`]: ../backend/mirai-console/src/data/AutoSavePluginData.kt\n[`AutoSavePluginConfig`]: ../backend/mirai-console/src/data/AutoSavePluginConfig.kt\n[`PluginConfig`]: ../backend/mirai-console/src/data/PluginConfig.kt\n[`PluginDataStorage`]: ../backend/mirai-console/src/data/PluginDataStorage.kt\n[`MultiFilePluginDataStorage`]: ../backend/mirai-console/src/data/PluginDataStorage.kt#L116\n[`MemoryPluginDataStorage`]: ../backend/mirai-console/src/data/PluginDataStorage.kt#L100\n[`AutoSavePluginDataHolder`]: ../backend/mirai-console/src/data/PluginDataHolder.kt#L45\n[`PluginDataHolder`]: ../backend/mirai-console/src/data/PluginDataHolder.kt\n[`PluginDataExtensions`]: ../backend/mirai-console/src/data/PluginDataExtensions.kt\n\n[`MiraiConsole`]: ../backend/mirai-console/src/MiraiConsole.kt\n[`MiraiConsoleImplementation`]: ../backend/mirai-console/src/MiraiConsoleImplementation.kt\n<!--[MiraiConsoleFrontEnd]: ../backend/mirai-console/src/MiraiConsoleFrontEnd.kt-->\n\n[`Command`]: ../backend/mirai-console/src/command/Command.kt\n[`CompositeCommand`]: ../backend/mirai-console/src/command/CompositeCommand.kt\n[`SimpleCommand`]: ../backend/mirai-console/src/command/SimpleCommand.kt\n[`RawCommand`]: ../backend/mirai-console/src/command/RawCommand.kt\n[`CommandManager`]: ../backend/mirai-console/src/command/CommandManager.kt\n\n[`Annotations`]: ../backend/mirai-console/src/util/Annotations.kt\n[`ConsoleInput`]: ../backend/mirai-console/src/util/ConsoleInput.kt\n[`JavaPluginScheduler`]: ../backend/mirai-console/src/plugin/jvm/JavaPluginScheduler.kt\n[`ResourceContainer`]: ../backend/mirai-console/src/plugin/ResourceContainer.kt\n[`PluginFileExtensions`]: ../backend/mirai-console/src/plugin/PluginFileExtensions.kt\n\n[Kotlin]: https://www.kotlincn.net/\n[Java]: https://www.java.com/zh_CN/\n[JVM]: https://zh.wikipedia.org/zh-cn/Java%E8%99%9A%E6%8B%9F%E6%9C%BA\n[JAR]: https://zh.wikipedia.org/zh-cn/JAR_(%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F)\n\n[为什么不支持热加载和卸载插件？]: QA.md#为什么不支持热加载和卸载插件\n[使用 AutoService]: QA.md#使用-autoservice\n\nMirai Console 提供支持自动保存的，静态类型插件数据模型。\n\n### 设计目标\n\n- 源码级静态强类型：避免 `getString()`, `getList()`...\n- 全自动加载保存：插件仅需在启动时通过一行代码链接自动保存\n- 与前端同步修改：在 Android 等图形化前端实现中可以在内存动态同步修改\n- 存储扩展性：可使用多种方式存储，无论是文件还是数据库，插件层都使用同一种实现方式\n\n综上，**最小化插件作者在处理数据和配置做的付出**。\n\n*暂无数据库保存支持，但这已经被提上日程。*\n\n## [`Value`]\n```kotlin\ninterface Value<T> : ReadWriteProperty<Any?, T> {\n    @get:JvmName(\"get\")\n    @set:JvmName(\"set\")\n    var value: T\n}\n```\n\n表示一个值代理。在 [`PluginData`] 中，除简单数据类型外，值都经过 [`Value`] 包装。\n\n## [`PluginData`]\n\n一个插件内部的, 对用户隐藏的数据对象。类似于属性名作为键，对应 [`Value`] 作为值的 `Map`。\n\n[`PluginData`] 接口拥有一个基础实现类，[`AbstractPluginData`]，默认不支持自动保存，仅存储键值关系及其序列化器。\n\n插件可继承 [`AbstractPluginData`]，拥有高自由的实现细节访问权限，并扩展数据结构。  \n但通常，插件使用 [`AutoSavePluginData`]。\n\n[`AutoSavePluginData`] 监听保存在它之中的值的修改，并在合适的时机在提供的 [`AutoSavePluginDataHolder`] 协程作用域下启动协程保存数据。\n\n### 使用 `PluginData`\n示例在此时比理论更高效。\n\n1. 定义一个单例，继承 `AutoSavePluginData`\n```kotlin\nobject MyData : AutoSavePluginData(\"MyData\")\n```\n\n2. 使用委托添加属性。所有类型都可以使用同样的‘语法’。\n```kotlin\nobject MyData : AutoSavePluginData(\"MyData\") { // 文件名为 MyData, 会被保存为 MyData.yml\n    val value1 by value<Int>() // 推断为 Int\n    val value2 by value(0) // 默认值为 0， 推断为 Int\n    var value3 by value(0) // 支持 var，修改会自动保存\n    val value4: Int by value() // 显式类型和推断类型，你喜欢哪种？\n    val value5: List<String> by value() // 支持 List，Set\n    val value6: MutableList<String> by value() // 可按需使用 Mutable 类型\n    val value7: List<List<String>> by value() // 支持嵌套\n    val value8: Map<String, List<List<String>>> by value() // 支持 Map\n    \n    var value9: List<String> by value() // List、Set 或 Map 同样支持 var。但请注意这是非引用赋值（详见下文）。\n}\n```\n\n3. 建立自动保存链接\n使用 `PluginDataStorage.load(PluginDataHolder, PluginData)` 即可完成自动保存链接，并读取数据。  \n对于 [JVM 插件][`JvmPlugin`]，可简便地在 `onEnable()` 中使用 `MyData.reload()`（对于上例）。详见 [读取 `PluginData` 或 `PluginConfig`](plugin/JVMPlugin-Appendix.md#读取-plugindata-或-pluginconfig)\n\n### 定义数据模型（Java）\n*由于 Java 语法局限，为 Kotlin 而设计的 PluginData 在 Java 使用很复杂。*  \n*即使 Mirai Console 为 Java 提供适配器，也强烈推荐 Java 用户在项目中混用 Kotlin 代码来完成数据模型定义。*\n\n参考 [JAutoSavePluginData](../backend/mirai-console/src/data/java/JAutoSavePluginData.kt#L69)\n\n### 非引用赋值\n由于实现特殊, 赋值时不会写其引用. 即:\n```kotlin\nval list = ArrayList<String>(\"A\")\nMyPluginData.list = list // 赋值给 PluginData 的委托属性是非引用的\nprintln(MyPluginData.list) // \"[A]\"\nlist.add(\"B\")\nprintln(list) // \"[A, B]\"\nprintln(MyPluginData.list) // \"[A]\"  // !! 由于 `list` 的引用并未赋值给 `MyPluginData.list`.\n```\n\n另一个更容易出错的示例:\n```kotlin\n// MyPluginData.nestedMap: MutableMap<Long, List<Long>> by value()\nval newList = MyPluginData.map.getOrPut(1, ::mutableListOf)\nnewList.add(1) // 不会添加到 MyPluginData.nestedMap 中, 因为 `mutableListOf` 创建的 MutableList 被非引用地添加进了 MyPluginData.nestedMap\n```\n\n要解决这种无法自动初始化空集合的问题，请查看 [实验性扩展方法](#实验性扩展方法) 方法\n\n### 使用自定义可序列化数据类型\n在 Kotlin，支持使用 [kotlinx.serialization](https://github.com/kotlin/kotlinx.serialization) 序列化的自定义数据类型。\n\n**Console 使用反射构造自定义数据类型示例**。当自定义数据类型拥有公开无参构造器，或者一个构造器的所有参数都可选时，在使用委托 `by value()` 时可无需提供默认值。\n否则，需要提供默认值。（见如下示例）\n\n自定义数据类型定义：\n```kotlin\n@Serializable // kotlinx.serialization.Serializable\nclass CustomA(val str: String)\n\n@Serializable\nclass CustomB(val str: String = \"\") // 参数可选，CustomB 就可以直接被反射构造。\n```\n\n使用时：\n```kotlin\nobject MyData : AutoSavePluginData(\"MyData\") {\n    val value1 by value(CustomA(\"\")) // CustomA 不可以通过反射直接构造实例，因为必须提供参数 str。因此要在创建 value 时提供默认值。\n    val value2: CustomB by value() // CustomB 可以通过反射直接构造实例\n}\n```\n\n### （实验性）[扩展方法][`PluginDataExtensions`]\n由于非引用赋值特性，在 `PluginData` 中定义的 `Map` 无法使用 `map.getOrPut(..., ::mutableListOf)` 等方法。  \n为此，Console 提供一些 *映射方法*。\n\n（下文示例省略 `Value` 所在的 `PluginData` 定义）\n\n#### （实验性）`Map.withEmptyDefault`\n```kotlin\nfun <K, InnerE, InnerV> SerializerAwareValue<MutableMap<K, Map<InnerE, InnerV>>>.withEmptyDefault(): SerializerAwareValue<MutableMap<K, Map<InnerE, InnerV>>>\n```\n创建一个代理对象, 当 `Map.get` 返回 `null` 时先放入一个 `LinkedHashMap`, 再返回这个 `LinkedHashMap`。\n\n示例：\n```kotlin\nval value1 by value<MutableMap<Long, List<Int>>>().withEmptyDefault()\n```\n使用时\n```kotlin\nval v: MutableMap<Long, List<Int>> = MyData.value1[123456] // 此时 Map.get 返回非 null。因为若 MyData 中不存在 123456 对应的值，就先放入一个空 List。\n```\n\n**但是，这种方法不支持多层嵌套**：例如 `Map<Long, Map<Long, List<Int>>>` 内层的 Map 不会被这样处理。  \n因此此方法仍处于实验性状态。如果你有任何建议，请在 issues 中发起讨论。\n\n#### （实验性）`Map.withDefault`\n```kotlin\nfun <K, V> SerializerAwareValue<MutableMap<K, V>>.withDefault(defaultValueComputer: (K) -> V): SerializerAwareValue<MutableMap<K, V>>\n```\n\n与上述 `Map.withEmptyDefault` 类似。只是把默认值从 `mutableListOf` 换成了 `defaultValueComputer()`\n\n**但是，方法命名仍有待确认**：`withDefault` 可能不是最好的命名，因为可能与标准库的 `map.withDefault` 产生歧义（他们行为不同）\n\n#### （实验性）`Map.mapKeys`\n映射 `Map` 的键。\n```kotlin\nfun <OldK, NewK, V> SerializerAwareValue<MutableMap<OldK, V>>.mapKeys(\n    oldToNew: (OldK) -> NewK,\n    newToOld: (NewK) -> OldK,\n): SerializerAwareValue<MutableMap<NewK, V>>\n```\n\n可进一步简化配置的操作。\n\n示例：\n```kotlin\nval value by value<MutableMap<Long, List<Int>>>().withEmptyDefault().mapKeys(Bot::id, Bot::getInstance)\n```\n使用时：\n```kotlin\nval bot: Bot = getBot()\n\nval list: List<Int> = value[bot]\nvalue[bot] = listOf()\n```\n\n## [`PluginConfig`]\n\n### [`PluginData`] 与 [`PluginConfig`] 的区别\n- [`PluginData`] 表示插件内部的数据，不应该被用户看到。\n- [`PluginConfig`] 表示插件的配置，用户可以修改这些配置。\n\n### 使用 [`PluginConfig`]\n[`PluginConfig`] 与 [`PluginData`] 用法完全相同。\n\n在上述 [使用 `PluginData`](#使用-plugindata) 的示例中，\n将 [`AutoSavePluginData`] 换为 [`AutoSavePluginConfig`] 即可创建一个配置，而不是数据。\n\n在加载时使用 `configInstance.reload()` 或 `JvmPlugin.reloadPluginConfig(configInstance)`。\n\n## [`PluginDataHolder`]\n***注意：这是实验性 API。***\n\n[`PluginData`] 的拥有者。一般用于区分不同插件的不同 [`PluginData`]，避免命名冲突。\n\n[`JvmPlugin`] 实现 [`PluginDataHolder`]，使用插件名作为保存时的名称。\n\n## [`PluginDataStorage`]\n***注意：这是实验性 API。***\n\n[`PluginData`] 的存储仓库，将 [`PluginData`] 从内存序列化到文件或到数据库，或反之。\n\n内置的实现包含：[`MultiFilePluginDataStorage`], [`MemoryPluginDataStorage`]\n\n----\n\n> 下一步，[Permissions](Permissions.md#mirai-console-backend---permissions)\n>\n> 返回 [开发文档索引](README.md#mirai-console)\n\n"
  },
  {
    "path": "mirai-console/docs/QA.md",
    "content": "# Q&A\n\n## 插件\n\n\n### 使用 AutoService\n\n在 `build.gradle.kts` 添加:\n```kotlin\nplugins {\n  kotlin(\"kapt\")\n}\ndependencies {\n  val autoService = \"1.0-rc7\"\n  kapt(\"com.google.auto.service\", \"auto-service\", autoService)\n  compileOnly(\"com.google.auto.service\", \"auto-service-annotations\", autoService)\n}\n```\n*对于 `build.gradle` 用户, 请自行按照 Groovy DSL 语法翻译*\n\n### 为什么不支持热加载和卸载插件？\n\n在热加载过程容易产生冲突情况；  \n卸载时不容易完全卸载所有静态对象。\n\n为了避免这些麻烦，Mirai Console 认为没有支持热加载和热卸载的必要。\n"
  },
  {
    "path": "mirai-console/docs/README.md",
    "content": "# Mirai Console\n\n欢迎来到 mirai-console 开发文档!\n\n**Mirai Console 基于 mirai-core，因此建议先阅读 [Mirai 文档](/docs/CoreAPI.md)\n。**\n\n> 其他链接：\n> - **[如何配置 Mirai Console 项目](ConfiguringProjects.md)**\n> - **[如何启动 Mirai Console](Run.md)**\n\n### 后端插件开发基础\n\n- 插件 - [Plugin 模块](plugin/Plugins.md)\n- 指令 - [Command 模块](Commands.md)\n- 存储 - [PluginData 模块](PluginData.md)\n- 权限 - [Permission 模块](Permissions.md)\n\n\n**示例插件**：\n- [mirai-console-example-plugin (Kotlin DSL)](https://github.com/Him188/mirai-console-example-plugin)\n- [mirai-console-example-plugin (Groovy DSL)](https://github.com/Karlatemp/mirai-console-example-plugin)\n- [MAPluginTemplate (Groovy DSL)](https://github.com/project-mirai/MAPluginTemplate) Jvm和Android双平台通用模板\n\n### 后端插件开发进阶\n\n- 扩展 - [Extension 模块和扩展点](Extensions.md)\n\n### 实现前端\n- [FrontEnd](FrontEnd.md)\n"
  },
  {
    "path": "mirai-console/docs/Run.md",
    "content": "# Mirai Console - Run\n\nMirai Console 可以独立启动，也可以被嵌入到某个应用中。\n\n## 使用工具自动独立启动\n\n该部分文档已经转移到 [用户手册](/docs/UserManual.md)。\n\n## 嵌入应用启动（实验性）\n\n将 Mirai Console 作为一个依赖嵌入一个 JVM 应用启动，开发者主动加载插件。尤其适合在开发时启动真实环境的测试。\n\n### 环境\n\n- JDK 1.8+ / Android SDK 26+ (Android 8+)\n- Kotlin 1.4+\n\n### 添加依赖\n\n[选择版本](ConfiguringProjects.md#选择版本)\n\n`build.gradle.kts`:\n```kotlin\ndependencies {\n    api(\"net.mamoe:mirai-console-terminal:2.0.0\") // 自行替换版本\n    api(\"net.mamoe:mirai-core:2.0.0\")\n}\n```\n\n### 启动 Terminal 前端\n\n一行启动：\n```kotlin\nMiraiConsoleTerminalLoader.startAsDaemon()\n```\n\n注意, Mirai Console 将会以 '守护进程' 形式启动，不会阻止主线程退出。\n\n### 从内存加载 JVM 插件（实验性）\n\n在嵌入使用时，插件可以直接加载：\n\n```kotlin\nMiraiConsoleTerminalLoader.startAsDaemon()\n// 先启动 Mirai Console\n\n// Kotlin\nPlugin.load() // 扩展函数\nPlugin.enable() // 扩展函数 \n\n// Java\nPluginManager.INSTANCE.loadPlugin(Plugin.INSTANCE)\nPluginManager.INSTANCE.enablePlugin(Plugin.INSTANCE)\n```\n\n但注意：这种方法目前是实验性的——一些特定的功能如注册扩展可能不会正常工作。\n\n\n## 手动配置独立启动\n\n强烈建议使用自动启动工具，若无法使用，可以参考如下手动启动方式。\n\n### 环境\n- JRE 8+ / JDK 8+\n\n### 准备文件\n\n要启动 Mirai Console，你需要：\n- mirai-core\n- mirai-console 后端\n- mirai-console 任一前端\n- 相关依赖\n\n只有 mirai-console 前端才有入口点 `main` 方法。目前只有一个 terminal 前端可用。\n\n#### 从 JCenter 下载模块\n\n- mirai-core 会提供 [mirai-core-all]\n- mirai-console 与其各个模块都会提供 `-all` 的 Shadowed 构建\n\n```shell script\n# 注: 自行更换对应版本号\n\n# Download mirai-core-all\n\ncurl -L https://maven.aliyun.com/repository/central/net/mamoe/mirai-core-all/1.3.3/mirai-core-all-1.3.3-all.jar -o mirai-core-all-1.3.3.jar\n\n# Download mirai-console\n\ncurl -L https://maven.aliyun.com/repository/central/net/mamoe/mirai-console/1.0.0/mirai-console-1.0.0-all.jar -o mirai-console-1.0.0.jar\n\n# Download mirai-console-terminal\n\ncurl -L https://maven.aliyun.com/repository/central/net/mamoe/mirai-console-terminal/1.0.0/mirai-console-terminal-1.0.0-all.jar -o mirai-console-terminal-1.0.0.jar\n\n```\n\n### 启动 mirai-console-terminal 前端\n\n1. 下载如下三个模块的最新版本文件并放到一个文件夹内 (如 `libs`)(详见 [下载模块](#从-jcenter-下载模块))：\n   - mirai-core-all\n   - mirai-console\n   - mirai-console-terminal\n\n2. 创建一个新的文件, 名为 `start-mirai-console.bat`/`start-mirai-console.ps1`/`start-mirai-console.sh`\n\nWindows CMD:\n```shell script\n@echo off\ntitle Mirai Console\njava -cp \"./libs/*\" net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader %*\npause\n```\n\nWindows PowerShell:\n```shell script\n$Host.UI.RawUI.WindowTitle = \"Mirai Console\"\njava -cp \"./libs/*\" net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader $args\npause\n```\n\nLinux:\n```shell script\n#!/usr/bin/env bash\necho -e '\\033]2;Mirai Console\\007'\njava -cp \"./libs/*\" net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader $*\n```\n\n然后就可以开始使用 mirai-console 了。\n\n#### mirai-console-terminal 前端参数\n使用 `./start-mirai-console --help` 查看 mirai-console-terminal 支持的启动参数。\n\n[mirai-repo]: https://github.com/project-mirai/mirai-repo/tree/master/shadow\n[mirai-core-all]: https://repo.maven.apache.org/maven2/net/mamoe/mirai-core-all/\n"
  },
  {
    "path": "mirai-console/docs/plugin/JVMPlugin-Appendix.md",
    "content": "# Mirai Console Backend - JVM Plugins - Appendix\n\n本页包含一些 JVM 插件的附录。\n\n## 依赖管理\n\n### API 导出管理\n\n插件可能被其他插件依赖，插件可以将一些内部实现保护起来，避免其他插件调用。\n\n要启动这个特性， 只需要在资源目录创建名为 `export-rules.txt` 的规则文件，便可以控制插件的类的公开规则。\n\n如果正在使用 `Gradle` 项目, 该规则文件一般需要放置于 `src/main/resources` 下。\n\n示例：\n\n```text\n\n# #开头的行全部识别为注释\n\n# exports, 允许其他插件直接使用某个类\n\n# 导出了一个internal包的一个类\n#\nexports org.example.miraiconsole.myplugin.internal.OpenInternal\n\n# 导出了整个 api 包\n#\nexports org.example.miraiconsole.myplugin.api\n\n# 保护 org.example.miraiconsole.myplugin.api2.Internal, 不允许其他插件直接使用\n#\nprotects org.example.miraiconsole.myplugin.api2.Internal\n\n# 保护整个包\n#\n# 别名: protect-package\nprotects org.example.miraiconsole.myplugin.internal\n\n# 此规则不会生效, 因为在此条规则之前,\n# org.example.miraiconsole.myplugin.internal 已经被加入到保护域中\nexports org.example.miraiconsole.myplugin.internal.NotOpenInternal\n\n\n# export-plugin, 允许其他插件使用除了已经被保护的全部类\n# 使用此规则会同时让此规则后的所有规则全部失效\n# 别名: export-all, export-system\n# export-plugin\n\n\n# 将整个插件放入保护域中\n# 除了此规则之前显式 export 的类, 其他插件将不允许直接使用被保护的插件的任何类\n# 别名: protect-all, protect-system\nprotect-plugin\n\n```\n\n插件也可以通过 Service 来自定义导出控制\n\nExample:\n\n```kotlin\n@AutoService(ExportManager::class)\nobject MyExportManager : ExportManager {\n    override fun isExported(className: String): Boolean {\n        println(\"  <== $className\")\n        return true\n    }\n}\n```\n\n## 数据操作\n\n### 读取 [`PluginData`] 或 [`PluginConfig`]\n\n> 本节基于章节 [PluginData](../PluginData.md) 的内容。\n> 在阅读本节前建议先阅读上述基础章节。也可以先跳过本节。\n\n[`JvmPlugin`] 实现接口 [`AutoSavePluginDataHolder`]，提供:\n\nKotlin：\n\n- `public fun <T : PluginData> T.reload()`\n- `public fun <T : PluginConfig> T.reload()`\n\nJava：\n\n- `public fun reloadPluginData(PluginData)`\n- `public fun reloadPluginData(PluginConfig)`\n\n**仅可在插件 onEnable() 时及其之后才能使用这些方法。**  \n**在插件 onDisable() 之后不能使用这些方法。**\n\n#### 使用示例\n\n```kotlin\nobject SchedulePlugin : KotlinPlugin(\n    JvmPluginDescription(\n        id = \"org.example.my-schedule-plugin\",\n        version = \"1.0.0\",\n    ) {\n        name(\"Schedule\")\n\n        // author(\"...\")\n        // dependsOn(\"...\")\n    }\n) {\n    // ...\n\n    override fun onEnable() {\n        MyData.reload() // 仅需此行，保证启动时更新数据，在之后自动存储数据。\n    }\n}\n\nobject MyData : AutoSavePluginData() {\n    val value: Map<String, String> by value()\n}\n```\n"
  },
  {
    "path": "mirai-console/docs/plugin/JVMPlugin-DataExchange.md",
    "content": "# Mirai Console Backend - JVM Plugins - Data Exchange\n\n> 本章主要介绍如何在多个插件内直接交换数据\n>\n> 注: 多插件之间广播事件也是直接交换数据的一种方式\n\n--------------------------\n\n\n如果需要在插件之间直接交换数据, 则插件之间必须存在直接或间接的依赖关系。\n\n在 [Console - JvmPlugin](JVMPlugin.md#类加载隔离) 中有提到类加载隔离，没有依赖关系的插件之间是不能直接交换数据的。\n\n> 关于如何建立依赖关系, 见 [JVMPlugin - 有关插件依赖的说明](JVMPlugin.md#有关插件依赖的说明)\n\n## 在有依赖关系的插件中广播事件\n\n现在系统中存在有两个插件 `com.example.guide.baseplugin` 和 `com.example.guide.extplugin`, 其中 `extplugin` 依赖 `baseplugin`。\n\n在 `baseplugin` 中定义的类都可以在 `extplugin` 中访问\n\n## 在无依赖关系的两个插件中广播事件\n\n在两个没有依赖关系的插件中, 是不能直接交换数据的, 即使使用了相同的类名也是不能进行数据交换的。\n\n如果需要在两个没有任何关系的插件中交换数据, 需要最少三个模块: `data-typedef`, `plugin-a`, `plugin-b`, `plugin-....`\n\n### 多插件数据交换核心思路\n\n在多个插件间交换数据, 必须存在直接或者间接的关系, 只有建立了关系才能解析到相同的类。\n\n两个没有关系的插件 `A` 和 `B` 之间, 必须通过另外的模块 `data-typedef` 建立起间接的关系。\n\n比如在 `data-typedef` 中定义的事件 `MyEvent`, 即使该事件是在 A 广播的也可以在 B 监听到。\n\n\n### 通过修改插件全局类路径链接插件\n\n> 不推荐此方法, 仅适合于高度自定义\n>\n> - 使用此方法很可能会干扰到其他插件的执行导致其他插件报错。\n> - 使用此方法很可能会遇到库冲突的情况。\n\n将 `data-typedef.jar` 放入 `plugin-shared-libraries` 即可。\n\n模块间的关系如下图\n```text\n     plugin-a               plugin-b      others....      ......\n        |                      |             |            ......\n        |                      |             |            ......\n        |                      |             |            ......\n=================================================================\n## data-typedef\n## ........\n=================================================================\n                               |\n=================================================================\n##\n## MIRAI CONSOLE PLUGIN SYSTEM\n##\n```\n\n### 将 data-typedef 打包成中转插件\n\n将 `data-typedef` 也编写为一个 mirai-console 插件, \n并在 `plugin-a`, `plugin-b` 中定义对 `data-typedef` 的依赖定义即可。\n\n\n模块间的关系如下图\n```text\n     plugin-a               plugin-b      others....      ......\n        |                      |             |            ......\n        +---  data-typedef  ---+             |            ......\n                   |                         |            ......\n=================================================================\n## MIRAI CONSOLE PLUGIN SYSTEM\n##\n```\n\n## 排错\n\n见 [JVMPlugin Debug](JVMPlugin-Debug.md)\n\n----------------------\n\n> 返回 [JVMPlugin](JVMPlugin.md)\n>\n> 返回 [开发文档索引](../README.md#mirai-console)\n"
  },
  {
    "path": "mirai-console/docs/plugin/JVMPlugin-Debug.md",
    "content": "# Mirai Console Backend - JVM Plugins - Debug\n\n> 建议在 Java 9+ 的环境中进行排错, mirai-console 在 java 9+ 中的错误堆栈中报告了错误类来自哪个类加载器\n\n## 错误堆栈基本解析\n\n```log\njava.lang.Exception: Thread stack dump\n        at java.base/java.lang.Thread.dumpStack(Thread.java)\n        at example-plugin.mirai2.jar[shared]//com.example.exmapleplugin.sharedlib.SharedLib.handle(shared.kt:6)\n        at example-plugin.mirai2.jar[private]//com.example.exmapleplugin.privatelib.PrivLib.cmd(priv.kt:5)\n        at example-plugin.mirai2.jar//com.example.exmapleplugin.MyCommand.cmd(MyCommand.kt:63)\n        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n        at ......\n        at net.mamoe.mirai.console.command.CommandManager.executeCommand$default(CommandManager.kt:125)\n        at chat-command-0.5.1.jar//net.mamoe.mirai.console.plugins.chat.command.PluginMain.handleCommand(PluginMain.kt:86)\n        at chat-command-0.5.1.jar//net.mamoe.mirai.console.plugins.chat.command.PluginMain$onEnable$2$1.invokeSuspend(PluginMain.kt:69)\n        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)\n        at ......\n```\n\n来自 plugin 本身的类加载器的堆栈会以 插件文件名 开头, 其中 `...[private]` `....[shared]` 都是该插件使用的类库.\n\n- `[shared]` 代表是共享库, 其中的类可以被依赖此插件的其他插件解析到\n- `[private]` 代表是私有库, 仅该插件自己内部使用, 依赖此插件的其他插件将不能解析到此类加载器的类\n\n## 多插件间数据交换结果和预期不符合\n\n多插件间数据结果不一致 90% 是因为缺少依赖关系导致的未解析到相同的类导致结果不一致\n\n关于如何建立关系, 见 [JVMPlugin - Data Exchange](./JVMPlugin-DataExchange.md)\n\n可以使用以下代码确定是否是因为类链接错误导致的数据不一致\n\n```kotlin\nfun MiraiLogger.dumpClass(klass: Class<*>) {\n    info { \"Class name: $klass\" }\n    info { \"  |- loader: ${klass.classLoader}\" }\n    info { \"  |- module: ${klass.module}\" }\n}\n```\n\n```java\npublic static void dumpClass(MiraiLogger logger, Class<?> klass) {\n    logger.info(\"Class name: \" + klass);\n    logger.info(\"  |- loader: \" + klass.getClassLoader());\n    logger.info(\"  |- module: \" + klass.getModule());\n}\n```\n\n## 使用的第三方库报错没有模块实现\n\n在插件初始化的时候, 线程上下文类加载器依然还是 console 的系统类加载器 (`AppClassLoader`), 需要手动将其切换到插件的类加载器\n\n详见 [Issue Comment](https://github.com/mamoe/mirai/issues/2138#issuecomment-1179673302)\n\n```kotlin\nfun onEnable() {\n    val oThreadCtxLoader = Thread.currentThread().contextClassLoader\n    try {\n        Thread.currentThread().contextClassLoader = javaClass.classLoader\n        // .......\n    } finally {\n        Thread.currentThread().contextClassLoader = oThreadCtxLoader\n    }\n}\n```\n\n## 使用依赖库后无法加载插件 / clinit 无法使用依赖库\n\n错误类似\n\n```log\n2023-12-08 00:23:42 E/main: Failed to init MiraiConsole.\nnet.mamoe.mirai.console.internal.util.ServiceLoadException: Could not load service com.example.exmapleplugin.MyPlugin\n    at ....\nCaused by: java.lang.NoClassDefFoundError: com/example/somelibrary/ClassFromLibrary\n\tat java.base/java.lang.Class.forName0(Native Method)\n\tat java.base/java.lang.Class.forName(Class.java:467)\n\tat net.mamoe.mirai.console.internal.util.PluginServiceHelper.loadService(PluginServiceHelper.kt:51)\nCaused by: java.lang.NoClassDefFoundError: org/quartz/SchedulerException\n\t... 23 more\nCaused by: java.lang.ClassNotFoundException: com/example/somelibrary/ClassFromLibrary\n\tat java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)\n\tat java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)\nCaused by: java.lang.ClassNotFoundException: com.example.somelibrary.ClassFromLibrary\n\tat java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)\n\tat net.mamoe.mirai.console.internal.plugin.JvmPluginClassLoaderN.loadClass(JvmPluginClassLoader.kt:389)\n\t... 26 more\n```\n\n此原因是因为 clinit 阶段时 mirai-console 还未加载依赖库至插件类搜索路径中。\n\n如果您使用 mirai-console 2.16.0+\n\n请创建 `plugin.yml`, mirai-console 才能将依赖库在 clinit 阶段前加载到插件类搜索路径，见 [JVMPlugin - 通过资源文件提供静态信息](./JVMPlugin.md#%E9%80%9A%E8%BF%87%E8%B5%84%E6%BA%90%E6%96%87%E4%BB%B6%E6%8F%90%E4%BE%9B%E9%9D%99%E6%80%81%E4%BF%A1%E6%81%AF)\n\n如果您使用 mirai-console 2.160 之前的版本, 请创建一个新的类，此类不要包含依赖库的代码，然后将此类的代码转移到您的真正的逻辑代码\n\n示例\n```kotlin\nobject OuterPlugin: KotlinPlugin(...) {\n    override fun onEnable() {\n        ActuallyPluginClassLoader.onEnable()\n    }\n}\n\nobject ActuallyPluginClassLoader {\n    fun onEnable() {\n        // .....\n    }\n}\n```\n\n> 底层分析\n>\n> 为了实现插件之间的相互依赖，mirai-console 必须获取到插件的信息 (PluginDescription) 才能进行插件类路径链接操作\n>\n> 在 mirai-console 2.16.0 之前，插件加载顺序为\n>\n> - 加载插件主类 (即 clinit 阶段)\n> - 加载插件实例 (传递 PluginDescription 给 mirai-console)\n> - mirai-console 构建插件依赖关系，链接插件类路径\n> - 执行插件的 onEnable\n>\n> 在 2.16.0+, 存在 plugin.yml 时, 插件加载的顺序为\n>\n> - 加载 plugin.yml\n> - 构建插件依赖关系，链接插件类路径\n> - 加载插件主类\n> - 加载插件实例\n> - 执行 onEnable\n\n## java.lang.LinkageError: loader constraint violation\n\n```log\njava.lang.LinkageError: loader constraint violation: when resolving method 'void io.ktor.client.request.HttpRequestBuilder.setMethod(io.ktor.http.HttpMethod)' the class loader 'test-ktor-dev.mirai2.jar' @61dde151 of the current class, com/kasukusakura/testktor/TestKtor$getTailrec$$inlined$get$2, and the class loader 'app' for the method's defining class, io/ktor/client/request/HttpRequestBuilder, have different Class objects for the type io/ktor/http/HttpMethod used in the signature (com/kasukusakura/testktor/TestKtor$getTailrec$$inlined$get$2 is in unnamed module of loader 'test-ktor-dev.mirai2.jar' @61dde151, parent loader 'global-shared' @32b9bd12; io.ktor.client.request.HttpRequestBuilder is in unnamed module of loader 'app')\n\tat .................\n\njava.lang.LinkageError: loader constraint violation:\n    when resolving method 'void io.ktor.client.request.HttpRequestBuilder.setMethod(io.ktor.http.HttpMethod)'\n        the class loader 'test-ktor-dev.mirai2.jar' @61dde151 of the current class, com/kasukusakura/testktor/TestKtor$getTailrec$$inlined$get$2,\n        and\n        the class loader 'app' for the method's defining class, io/ktor/client/request/HttpRequestBuilder,\n\n    have different Class objects for the type io/ktor/http/HttpMethod used in the signature\n    \n    (\n        com/kasukusakura/testktor/TestKtor$getTailrec$$inlined$get$2 is in unnamed module of loader 'test-ktor-dev.mirai2.jar' @61dde151,\n            parent loader 'global-shared' @32b9bd12;\n\n        io.ktor.client.request.HttpRequestBuilder is in unnamed module of loader 'app'\n    )\n\n```\n\n翻译\n\n```log\nJVM 无法解析 com/kasukusakura/testktor/TestKtor$getTailrec$$inlined$get$2 中的方法引用\n    'void io.ktor.client.request.HttpRequestBuilder.setMethod(io.ktor.http.HttpMethod)'\n\n搜索到的 'io.ktor.client.request.HttpRequestBuilder' 位于系统类加载器 'app' 中\n\nHttpRequestBuilder 中的 HttpMethod 引用和\n    TestKtor$getTailrec$$inlined$get$2 得到的 HttpMethod 引用\n不一致, 无法连接\n```\n\n结论: 插件没有附带完整的 ktor 依赖导致部分类解析至插件库加载器, 部分类解析至系统类加载器\n"
  },
  {
    "path": "mirai-console/docs/plugin/JVMPlugin.md",
    "content": "# Mirai Console Backend - JVM Plugins\n\n[`Plugin`]: ../../backend/mirai-console/src/plugin/Plugin.kt\n\n[`PluginDescription`]: ../../backend/mirai-console/src/plugin/description/PluginDescription.kt\n\n[`PluginLoader`]: ../../backend/mirai-console/src/plugin/loader/PluginLoader.kt\n\n[`PluginManager`]: ../../backend/mirai-console/src/plugin/PluginManager.kt\n\n[`JvmPluginLoader`]: ../../backend/mirai-console/src/plugin/jvm/JvmPluginLoader.kt\n\n[`JvmPlugin`]: ../../backend/mirai-console/src/plugin/jvm/JvmPlugin.kt\n\n[`JvmPluginDescription`]: ../../backend/mirai-console/src/plugin/jvm/JvmPluginDescription.kt\n\n[`AbstractJvmPlugin`]: ../../backend/mirai-console/src/plugin/jvm/AbstractJvmPlugin.kt\n\n[`KotlinPlugin`]: ../../backend/mirai-console/src/plugin/jvm/KotlinPlugin.kt\n\n[`JavaPlugin`]: ../../backend/mirai-console/src/plugin/jvm/JavaPlugin.kt\n\n\n[`PluginData`]: ../../backend/mirai-console/src/data/PluginData.kt\n\n[`PluginConfig`]: ../../backend/mirai-console/src/data/PluginConfig.kt\n\n[`PluginDataStorage`]: ../../backend/mirai-console/src/data/PluginDataStorage.kt\n\n[`ExportManager`]: ../../backend/mirai-console/src/plugin/jvm/ExportManager.kt\n\n[`MiraiConsole`]: ../../backend/mirai-console/src/MiraiConsole.kt\n\n[`MiraiConsoleImplementation`]: ../../backend/mirai-console/src/MiraiConsoleImplementation.kt\n<!--[MiraiConsoleFrontEnd]: ../../backend/mirai-console/src/MiraiConsoleFrontEnd.kt-->\n\n[`Command`]: ../../backend/mirai-console/src/command/Command.kt\n\n[`CompositeCommand`]: ../../backend/mirai-console/src/command/CompositeCommand.kt\n\n[`SimpleCommand`]: ../../backend/mirai-console/src/command/SimpleCommand.kt\n\n[`RawCommand`]: ../../backend/mirai-console/src/command/RawCommand.kt\n\n[`CommandManager`]: ../../backend/mirai-console/src/command/CommandManager.kt\n\n[`Annotations`]: ../../backend/mirai-console/src/util/Annotations.kt\n\n[`ConsoleInput`]: ../../backend/mirai-console/src/util/ConsoleInput.kt\n\n[`JavaPluginScheduler`]: ../../backend/mirai-console/src/plugin/jvm/JavaPluginScheduler.kt\n\n[`ResourceContainer`]: ../../backend/mirai-console/src/plugin/ResourceContainer.kt\n\n[`PluginFileExtensions`]: ../../backend/mirai-console/src/plugin/PluginFileExtensions.kt\n\n[`AutoSavePluginDataHolder`]: ../../backend/mirai-console/src/data/PluginDataHolder.kt\n\n[MiraiLogger]: ../../../mirai-core-api/src/commonMain/kotlin/utils/MiraiLogger.kt\n\n[Kotlin]: https://www.kotlincn.net/\n\n[Java]: https://www.java.com/zh_CN/\n\n[JVM]: https://zh.wikipedia.org/zh-cn/Java%E8%99%9A%E6%8B%9F%E6%9C%BA\n\n[JAR]: https://zh.wikipedia.org/zh-cn/JAR_(%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F)\n\n[为什么不支持热加载和卸载插件？]: ../QA.md#为什么不支持热加载和卸载插件\n\n[使用 AutoService]: ../QA.md#使用-autoservice\n\n[MCI]: ../../tools/intellij-plugin/\n\n[MiraiPixel]: ../../tools/intellij-plugin/resources/icons/pluginMainDeclaration.png\n\n本章节介绍 JVM 平台的插件。\n\n## JVM 平台插件接口 - [`JvmPlugin`]\n\n所有的 JVM 插件（特别地，打包为 `JAR` 的）都必须实现 [`JvmPlugin`]，否则不会被 [`JvmPluginLoader`]\n识别和加载。\n\n[`JvmPlugin`] 派生为 [`KotlinPlugin`] 和 [`JavaPlugin`]，其关系图如下所示。\n\n![](JVMPlugin_images/75227ef5.png)\n\n其中 `AbstractJvmPlugin` 是 Console 提供的基础实现，如数据目录等。\n\n## 主类\n\nJVM 平台插件的主类应被实现为一个单例（Kotlin `object`，Java 静态初始化的类，详见下文示例）。\n\n**Kotlin 使用者的插件主类应继承 [`KotlinPlugin`]。**  \n**其他 JVM 语言（如 Java）使用者的插件主类应继承 [`JavaPlugin`]。**\n\n### 定义主类\n\nMirai Console 使用类似 Java `ServiceLoader` 但更灵活的机制加载插件。\n\n一个正确的主类定义可以是以下三种任一。注意 \"描述\" 将会在[下文](#描述)解释。\n\n1. Kotlin `object`\n\n```kotlin\nobject A : KotlinPlugin( /* 描述 */)\n```\n\n2. Java 静态初始化单例 `class`\n\n```java\npublic final class A extends JavaPlugin {\n    public static final A INSTANCE = new A(); // 必须 public static, 必须名为 INSTANCE\n\n    private A() {\n        super( /* 描述 */);\n    }\n}\n```\n\n3. Java `class`\n\n使用这种方法时，插件实例由 Console 在合适的时机创建。\n\n```java\npublic final class A extends JavaPlugin {\n    public A() { // 必须公开且无参\n        super( /* 描述 */);\n    }\n}\n```\n\n### 确认主类正确定义\n\n在 [IDE 插件][MCI] 的帮助下，一个正确的插件主类定义的行号处会显示 Mirai 像素风格形象图：![MiraiPixel]\n\n![PluginMainDeclaration](images/PluginMainDeclaration.png)\n\n### 配置主类服务\n\n#### 自动配置主类服务\n\n[IDE 插件][MCI] 会自动检查主类服务的配置。在没有正确配置时，IDE 将会警告并为你自动配置：  \n![PluginMainServiceNotConfigured](images/PluginMainServiceNotConfigured.png)\n\n#### 手动配置主类服务\n\n若无法使用 IntelliJ\n插件，可在资源目录 `META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin`\n文件内存放插件主类全名（以纯文本 UTF-8 存储，文件内容只包含一行插件主类全名或以 `#` 起始的注释）。\n\n也可以使用各种自动化工具配置 service 信息，如使用 Google\n的 [AutoService](https://github.com/google/auto/tree/master/service)\n。附[在 Kotlin 使用的方法][使用 AutoService]。\n\n> 备注：Console 虽然使用这种常用的 service 配置方式，但不使用 ServiceLoader 加载插件实例。Console\n> 的加载方式更灵活。\n\n## 描述\n\n插件主类需要提供一份描述信息。\n\n插件可以通过资源文件提供静态的信息，也可以通过构造器动态传递。\n\n描述拥有如下属性：\n\n[语义化版本 2.0.0]: https://semver.org/lang/zh-CN/\n\n| 属性           | 可空  | 备注                          |\n|--------------|-----|-----------------------------|\n| id           | 否   | 唯一识别标识符，仅能包含英文字母、数字、`.`、`-` |\n| version      | 否   | 版本号，见补充说明                   |\n| name         | 是   | 供用户阅读的名称，可包含任意字符            |\n| author       | 是   | 作者信息                        |\n| dependencies | 是   | 依赖其他插件的 ID 及版本范围            |\n| info         | 是   | 供用户阅读的描述信息                  |\n\n### 有关插件版本号的补充说明\n\n- 插件自身的版本要求遵循 [语义化版本 2.0.0](https://semver.org/lang/zh-CN/)\n  规范，合格的版本例如：`1.0.0`、`1.0`、`1.0-M1`、`1.0-pre-1`；\n\n### 有关插件依赖的说明\n\n- 插件依赖的版本遵循 [语义化版本 2.0.0](https://semver.org/lang/zh-CN/)\n  规范，同时支持 [Apache Ivy 风格表示方法](http://ant.apache.org/ivy/history/latest-milestone/settings/version-matchers.html)\n  。\n\n在定义时需使用 ID，因为 ID 是唯一的。不支持使用名称（name）。\n\n定义必须依赖 net.mamoe.chat-command：\n\n```yaml\ndependencies:\n    - \"net.mamoe.chat-command\"\n```\n\n定义可选依赖 net.mamoe.chat-command：\n\n```yaml\ndependencies:\n    - \"net.mamoe.chat-command?\"\n```\n\n定义必须依赖 1.0 及以上， 2.0 （不包含）以下的 net.mamoe.chat-command 插件：\n\n```yaml\ndependencies:\n    - \"net.mamoe.chat-command:[1.0, 2.0)\"\n```\n\n定义可选依赖 1.0 及以上， 2.0 （不包含）以下的 net.mamoe.chat-command 插件：\n\n```yaml\ndependencies:\n    - \"net.mamoe.chat-command:[1.0, 2.0)?\"\n```\n\n插件的依赖将在下文 [依赖其他插件][#依赖其他插件] 详细说明。\n\n### 通过资源文件提供静态信息\n\n在资源文件目录（如 `src/main/resources`）创建 `plugin.yml`，并填写上述属性，示例：\n\n```yaml\nid: net.mamoe.chat-command\nversion: 0.3.0\nname: Chat Command\nauthor: Mamoe Technologies\ndependencies: [ ] # 或者不写这行\ninfo: 允许在聊天环境执行指令。\n```\n\n然后在插件主类指定从资源加载：\n\n*Kotlin*\n\n```kotlin\nobject A : KotlinPlugin(JvmPluginDescription.loadFromResource())\n```\n\n*Java*\n\n```java\npublic final class JExample extends JavaPlugin {\n    public static final JExample INSTANCE = new JExample();\n\n    private JExample() {\n        super(JvmPluginDescription.loadFromResource());\n    }\n}\n```\n\n注意，尽管 `loadFromResource` 支持读取任意路径的文件，但也建议使用默认的 `plugin.yml`\n。因为目前有计划修改插件信息的读取方式，这种 `plugin.yml` 的读取方式很有可能会继续得到支持。\n\n### 在构造器动态提供\n\n*注意：由于目前有计划修改插件信息的读取方式，这种构造器动态提供的方法已不再推荐。*\n\n在构造器动态构造 `JvmPluginDescription`：\n\n*Kotlin*\n\n```kotlin\nobject MyPlugin : KotlinPlugin(\n    JvmPluginDescription(\n        // 必要属性\n        id = \"net.mamoe.chat-command\",\n        version = \"1.0.0\",\n    ) {\n        // 非必须属性\n        name(\"Chat Command\")\n        // author(\"...\")\n        // dependsOn(\"...\") // 与 YAML 方式类似，如 \"net.mamoe.chat-command:[1.0, 2.0)?\"\n    }\n)\n```\n\n*Java*\n\n```java\npublic final class JExample extends JavaPlugin {\n    public static final JExample INSTANCE = new JExample();\n\n    private JExample() {\n        super(new JvmPluginDescriptionBuilder( // 必要属性\n                        \"org.example.test-plugin\", // id\n                        \"1.0.0\" // version\n                ).author(\"...\") // 可选属性，可以不提供， 直接 build\n                        .info(\"...\")\n                        .build()\n        );\n    }\n}\n```\n\n## 使用日志\n\nConsole 为插件提供一个 [`MiraiLogger`][MiraiLogger]：\n\n*Kotlin*\n\n```kotlin\nobject MyPluginMain : KotlinPlugin( /* ... */) {\n    override fun onEnable() {\n        logger.info { \"一条 INFO 级别的日志\" } // 当日志被用户启用时才会执行 lambda 内代码并记录日志\n\n        logger.debug { \"一条 DEBUG 级别的日志\" } // DEBUG 级别\n    }\n}\n```\n\n*Java*\n\n```java\npublic final class JExample extends JavaPlugin {\n    public static final JExample INSTANCE = new JExample();\n\n    private JExample() {\n        // ...\n    }\n\n    @Override\n    public void onEnable() {\n        if (getLogger().isInfoEnabled()) {\n            getLogger().info(\"一条 INFO 级别的日志\"); // 当日志被用户启用时才会执行\n        }\n    }\n}\n```\n\n有关日志的配置方式可以参考 [Logging](../Logging.md)\n\n## 插件生命周期与依赖管理\n\n每个 JVM 插件有如下状态：初始化、加载、启用、禁用。\n\n[//]: # (预加载、)\n\n[//]: # (- 预加载：Console 识别插件的静态依赖信息。)\n\n- 初始化：插件主类由插件加载器识别并创建实例（如有必要）。插件的依赖将完成链接（**因此在初始化之后才允许调用依赖**）；\n- 加载：插件加载器已经识别了所有的插件并根据依赖关系确定了加载顺序。这时插件的 `onLoad()` 回调将会被调用，插件做一次性初始化工作；\n- 启用：插件加载器已经加载了所有的插件并调用它们的 `onLoad()`。这时插件的 `onEnable()`\n  回调将会被调用，插件开始正常工作；\n- 禁用：当用户要求关闭某个插件，或者 Console 正在关闭时插件会被禁用，`onDisable()`\n  回调将会被调用，插件停止一切在启用状态时创建的工作。\n\n每个插件一定会经历初始化和加载，但可能会经历零次到任意次启用和禁用。根据不同 Console\n前端的行为和用户的设置，插件可能只会加载不会启用，也有可能会在禁用后被重新启用。因此插件必须只在 `onEnable`\n时创建事件监听等任务，且在禁用时停止这些任务。\n\n多个插件的加载是*顺序的*，意味着若一个插件的 `onLoad`\n等回调处理缓慢，后续插件的加载也会被延后，即使它们可能没有依赖关系。因此需要让 `onLoad`，`onEnable`，`onDisable`\n快速返回。\n\n### 有依赖时的加载顺序\n\n若插件 A 需要调用另一个插件 B，那么就认为 A 依赖\nB。当存在依赖关系时，被依赖的插件（B）将总是会早于（A）加载。这适用于所有上述回调，即 B 的 `onLoad`、`onEnable` 会早于\nA 调用，而 `onDisable` 会晚于 A 调用。\n\n### 不支持热加载和热卸载\n\nMirai Console 不提供热加载和热卸载功能，所有插件只能在服务器启动前加载，在 Console\n停止时卸载。（[为什么不支持热加载和卸载插件？]）\n\n只有当插件 A 在其描述中定义了依赖时，才会被允许调用 B 的接口。要了解如何定义，可参考上文 [有关插件依赖的说明]。\n\n### Kotlin 协程生命周期管理\n\n[`JvmPlugin`] 实现 `CoroutineScope`，并由 Console 内部实现提供其 `coroutineContext`。\n\n**所有插件启动的协程都应该受 `JvmPlugin` 作用域的管理**，如要启动一个协程，正确的做法是：\n\n```kotlin\nobject MyPluginMain : KotlinPlugin( /* ... */) {\n    override fun onEnable() {\n        // 即 MyPluginMain.launch，在当前协程作用域创建任务。\n        launch {\n            delay(1000)\n            println(\"一秒钟过去了。\")\n        }\n\n        // globalEventChannel 在当前协程作用域创建事件通道，会在 onDisable 自动关闭。\n        globalEventChannel().subscribeAlways<MemberLeaveEvent> {\n            println(\"有人离开了群。\")\n        }\n    }\n}\n```\n\n### Java 线程生命周期管理\n\n插件创建的所有线程或异步任务都需要在 `onDisable()` 时关闭。\n\n[JavaPluginScheduler]: ../../backend/mirai-console/src/plugin/jvm/JavaPluginScheduler.kt\n\n若要执行简单的异步、延迟、重复任务，可使用 `getScheduler()` 获取到简单任务调度器。示例：\n\n```java\npublic final class JExample extends JavaPlugin {\n    public static final JExample INSTANCE = new JExample();\n\n    private JExample() {\n        // ...\n    }\n\n    @Override\n    public void onEnable() {\n        getScheduler().delayed(1000L, () -> System.out.println(\"一秒钟过去了。\"));\n    }\n}\n```\n\n详细查看 [JavaPluginScheduler]。\n\n### 控制插件类路径\n\n[JvmPluginClasspath]: ../../backend/mirai-console/src/plugin/jvm/JvmPluginClasspath.kt\n\nMirai Console 支持动态按需下载依赖和按需链接依赖 (通过 `JvmPluginClasspath.addToPath` 和 `JvmPluginClasspath.downloadAndAddToPath`)\n\n`JvmPluginClasspath` 还支持控制是否应该引用其他插件的类路径 & 是否允许其他非依赖此插件的插件使用此插件的类路径\n\n*Java* （Kotlin 类似）\n```java\n\npublic final class JExample extends JavaPlugin {\n    //......\n    @Override\n    public void onLoad(PluginComponentStorage storage) {\n        getLogger().info(String.valueOf(getJvmPluginClasspath().getShouldResolveIndependent()));\n        getJvmPluginClasspath().addToPath(\n                getJvmPluginClasspath().getPluginIndependentLibrariesClassLoader(),\n                resolveDataFile(\"mylib.jar\")\n        );\n    }\n}\n\n```\n\n\n详细查看 [JvmPluginClasspath]\n\n#### 通过配置文件控制类路径选项\n\n[JvmPluginClasspath] 中的部分选项可以通过配置文件指定, 虽然在代码中也可以修改, 但是通过配置文件指定是最好的。\n\n> 因为如果在代码中修改, 类链接会在选项修改之前完成，从而导致一些不正常的逻辑\n\n要使用配置文件控制 JvmPluginClasspath 中的选项, 需要创建名为 `META-INF/mirai-console-plugin/options.properties` 的资源文件\n\n> 通常情况这个文件的位置是 `src/main/resources/META-INF/mirai-console-plugin/options.properties`\n>\n> 如果没有资源文件夹, Intellij IDEA 在创建文件夹时会提示 resources 补全\n> \n> ![CreateResourcesDir](./images/CreateResourcesDir.png)\n\n选项的键值已经在 [JvmPluginClasspath] 源文件中使用 `@SettingProperty` 注明\n\n示例:\n\n```properties\n# suppress inspection \"UnusedProperty\" for whole file\n\nresources.resolve-console-system-resources=false\n\nclass.loading.be-resolvable-to-independent=false\nclass.loading.resolve-independent=false\n\n```\n\n## 访问数据目录和配置目录\n\n[`JvmPlugin`] 实现接口 [`PluginFileExtensions`]。插件可通过 `resolveDataFile`\n，`resolveConfigFile` 等方法取得数据目录或配置目录下的文件。\n\n- 数据目录（dataFolder）用来存放只供插件内部读取的数据；\n- 配置目录（configFolder）用来存放可由用户修改的配置。\n\n可以在任何时刻使用这些方法。\n\n详见 [`PluginFileExtensions`]。\n\n*Java* （Kotlin 类似）\n\n```java\npublic final class JExample extends JavaPlugin {\n    public static final JExample INSTANCE = new JExample();\n\n    private JExample() {\n        // ...\n    }\n\n    @Override\n    public void onEnable() {\n        File dataFile = resolveDataFile(\"myDataFile.txt\");\n        File configFile = resolveConfigFile(\"myConfigFile.txt\");\n    }\n}\n```\n\n### 物理目录路径\n\n用 `$root` 表示 Mirai Console 运行路径，`$name` 表示插件名，\n在终端前端（Terminal），插件数据目录一般在 `$root/data/$name`\n，插件配置目录一般在 `$root/config/$name`。**但是插件不应该依赖这些物理路径，因为在其他前端上没有保证。**\n\n### 访问 [JAR] 包内资源文件\n\n[`JvmPlugin`] 实现接口 [`ResourceContainer`]。插件可通过 `getResource`\n，`getResourceAsStream` 等取得插件 [JAR] 包内资源文件。\n\n可以在任何时刻使用这些方法。\n\n详见 [`ResourceContainer`]。\n\n## 构建\n\n构建 mirai-console\n插件推荐使用 [mirai-console-gradle](../../tools/gradle-plugin/README.md)\n（若使用推荐方式创建项目则默认使用）。\n\n> 要执行一个名为 `taskName` 的 Gradle 任务，可在项目目录使用 `./gradlew taskName`。\n\n### 打包和分发插件\n\n执行 Gradle 任务 [`buildPlugin`](../../tools/gradle-plugin/README.md#打包依赖)\n即可打包后缀为 `.mirai2.jar` 的插件\nJAR。打包结果输出在 `build/mirai/`。\n\n这个文件就是插件的可分发文件。可以放入 Console `plugins` 目录中使用。\n\n#### 自 2.11 的变更\n\n在 2.11 以前，插件文件后缀为 `.mirai.jar`，而在 2.11 时插件文件后缀修改为了 `.mirai2.jar`\n。这是因为依赖打包机制有修改。2.11 起不再打包全部的依赖，而是只打包必要和开发者强制指定的（详见 [插件依赖打包机制](#插件依赖打包机制)\n）。\n\n- Console 2.11 及以上在扫描插件时若同时发现 `.mirai.jar` 和 `.mirai2.jar`\n  ，只会加载 `.mirai2.jar`。\n- Console 2.11 以前则会都加载。\n\n由于 2.10 及以前版本编译的插件也能在 2.11 运行，用户可以顺利地从 2.10 升级到 2.11。但无法直接从 2.11 降级到\n2.10，降级时需要删除 `.mirai2.jar`。\n\n### 插件依赖打包机制\n\n在打包插件时, 所有使用的*外部依赖*<sup>(1)</sup>\n都将会存放于 JAR 内的一个*依赖列表*<sup>(2)</sup>中。\n\n依赖将会在用户侧 Console 启动时从[远程仓库](#默认的远程仓库列表)下载并加载。\n\n特别地，直接依赖的本地 JAR 和子项目依赖将会直接打包进插件 JAR。\n\n> 注释\n> - (1): 外部依赖, 即来自 Maven Central 的依赖, 如 `net.mamoe:mirai-core-api`\n> - (2): 具体文件路径 `META-INF/mirai-console-plugin/dependencies-private.txt`\n> - (3): 包括直接依赖的本地 JAR (如 `fileTree('libs')`),\n    子项目 (`project(':subproject')`)    \n    和其他显式声明直接打包的依赖,\n    更多见 [mirai-console-gradle](../../tools/gradle-plugin/README.md)\n\n#### 默认的远程仓库列表\n\n- Maven\n  Central：[repo.maven.apache.org](https://repo.maven.apache.org/maven2/)\n- 阿里云 Maven Central\n  中国代理：[maven.aliyun.com](https://maven.aliyun.com/repository/central)\n\n默认优先使用阿里云代理仓库，在失败时使用 Maven Central。注意，使用阿里云仓库是不受保证的 – 将来可能会换用其他仓库，但\nMaven\nCentral 官方仓库不会删除（除非用户在配置中删除，当然这不属于开发插件时的考虑范畴）。\n\n用户也可以在配置中自行定义代理仓库，但插件开发者不应该期望于用户自行添加包含插件使用的依赖的仓库。**所以插件只应该使用在 Maven\nCentral\n的依赖，且将使用的其他所有依赖[打包](#调整依赖打包策略)到插件 JAR。**\n\n### 类加载隔离\n\n插件仅能访问自身项目、依赖的库、Console、以及在描述中定义了的依赖的插件。每个插件依赖的库都会被隔离，不同插件可以使用不同版本的同一个库，互不冲突。**\n但不应该在依赖另一个插件时使用不同版本的依赖，这可能导致不确定的后果。**\n\n#### 优先加载插件自身及依赖\n\n在有潜在类冲突时，将优先选择插件内部实现以及定义的依赖。每个类的搜索顺序是：\n\n- 插件自身以及[强制打包](#调整依赖打包策略)的依赖\n- 插件定义的仓库依赖\n- 插件定义的其他插件依赖及它们的依赖（间接）\n- mirai-console 及 mirai-core 使用的公开依赖，包含：\n    - kotlin-reflect\n    - kotlinx-coroutines-jdk8\n    - kotlinx-serialization-json\n    - ktor-client-okhttp\n  > 这些依赖的版本可在 [buildSrc](../../../buildSrc/src/main/kotlin/Versions.kt)\n  查看\n\n### 调整依赖打包策略\n\n要强制打包或忽略某个依赖，请参阅 [Gradle 插件文档](../../tools/gradle-plugin/README.md#打包依赖)\n。  \n要了解什么情况下需要强制打包，请参阅 [插件依赖打包机制](#插件依赖打包机制)。\n\n## 调试\n\n[mirai-console-gradle](../../tools/gradle-plugin/README.md)\n提供了在 IDEA 等 IDE 中调试插件的功能, 运行 Gradle 任务 `runConsole` 即可启动完整的 mirai-console。\n\n> mirai-console 测试时默认在 `/debug-sandbox` 运行。\n>\n> 可在 `.gitignore` 中添加 `/debug-sandbox` 规则以避免测试环境被提交至 Git。\n\n使用 IDEA 创建的项目可在 `Run Configurations` 找到 `Run Mirai Console`。\n\n![PluginDebugRunConfiguration.png](images/PluginDebugRunConfiguration.png)\n\n可在 IDEA 右侧 `Gradle` 中找到 Gradle 任务 `runConsole`。\n\n![PluginDebugGradleTask.png](images/PluginDebugGradleTask.png)\n\n运行后即可看见如下图所示的 mirai-console:\n\n![PluginDebugWindowPreview](images/PluginDebugWindowPreview.webp)\n\n> 如需进行调试, 请使用运行 (绿色三角形) 旁边的 `Debug` 按钮.\n> 也可以在 Gradle 工具栏找到 `runConsole` 并右键选择 `Debug`。\n>\n> 如果没法输入命令, 请确认 Gradle 任务视图没有被聚焦至 `:runConsole`,\n> 必须选择整个 Gradle 任务视图才可执行命令。\n\n### 排错\n\n详见 [JVMPlugin Debug](JVMPlugin-Debug.md)\n\n## 发布插件到 mirai-console-loader\n\n插件中心仍在开发中。\n\n## 多插件间数据交换\n\n见 [JVMPlugin - Data Exchange](JVMPlugin-DataExchange.md)\n\n> 下一步，[Commands](../Commands.md#mirai-console-backend---commands)\n>\n> 返回 [开发文档索引](../README.md#mirai-console)\n\n"
  },
  {
    "path": "mirai-console/docs/plugin/Plugins.md",
    "content": "# Mirai Console Backend - Plugins\n\n[`Plugin`]: ../../backend/mirai-console/src/plugin/Plugin.kt\n\n[`PluginDescription`]: ../../backend/mirai-console/src/plugin/description/PluginDescription.kt\n\n[`PluginLoader`]: ../../backend/mirai-console/src/plugin/loader/PluginLoader.kt\n\n[`PluginManager`]: ../../backend/mirai-console/src/plugin/PluginManager.kt\n\n[`JvmPluginLoader`]: ../../backend/mirai-console/src/plugin/jvm/JvmPluginLoader.kt\n\n[`JvmPlugin`]: ../../backend/mirai-console/src/plugin/jvm/JvmPlugin.kt\n\n[`JvmPluginDescription`]: ../../backend/mirai-console/src/plugin/jvm/JvmPluginDescription.kt\n\n[`AbstractJvmPlugin`]: ../../backend/mirai-console/src/plugin/jvm/AbstractJvmPlugin.kt\n\n[`KotlinPlugin`]: ../../backend/mirai-console/src/plugin/jvm/KotlinPlugin.kt\n\n[`JavaPlugin`]: ../../backend/mirai-console/src/plugin/jvm/JavaPlugin.kt\n\n\n[`PluginData`]: ../../backend/mirai-console/src/data/PluginData.kt\n\n[`PluginConfig`]: ../../backend/mirai-console/src/data/PluginConfig.kt\n\n[`PluginDataStorage`]: ../../backend/mirai-console/src/data/PluginDataStorage.kt\n\n[`ExportManager`]: ../../backend/mirai-console/src/plugin/jvm/ExportManager.kt\n\n[`MiraiConsole`]: ../../backend/mirai-console/src/MiraiConsole.kt\n\n[`MiraiConsoleImplementation`]: ../../backend/mirai-console/src/MiraiConsoleImplementation.kt\n\n[`Command`]: ../../backend/mirai-console/src/command/Command.kt\n\n[`CompositeCommand`]: ../../backend/mirai-console/src/command/CompositeCommand.kt\n\n[`SimpleCommand`]: ../../backend/mirai-console/src/command/SimpleCommand.kt\n\n[`RawCommand`]: ../../backend/mirai-console/src/command/RawCommand.kt\n\n[`CommandManager`]: ../../backend/mirai-console/src/command/CommandManager.kt\n\n[`Annotations`]: ../../backend/mirai-console/src/util/Annotations.kt\n\n[`ConsoleInput`]: ../../backend/mirai-console/src/util/ConsoleInput.kt\n\n[`JavaPluginScheduler`]: ../../backend/mirai-console/src/plugin/jvm/JavaPluginScheduler.kt\n\n[`ResourceContainer`]: ../../backend/mirai-console/src/plugin/ResourceContainer.kt\n\n[`PluginFileExtensions`]: ../../backend/mirai-console/src/plugin/PluginFileExtensions.kt\n\n[`AutoSavePluginDataHolder`]: ../../backend/mirai-console/src/data/PluginDataHolder.kt#L45\n\n[Kotlin]: https://www.kotlincn.net/\n\n[Java]: https://www.java.com/zh_CN/\n\n[JVM]: https://zh.wikipedia.org/zh-cn/Java%E8%99%9A%E6%8B%9F%E6%9C%BA\n\n[JAR]: https://zh.wikipedia.org/zh-cn/JAR_(%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F)\n\n[使用 AutoService]: ../QA.md#使用-autoservice\n\n[JVMPlugin]: ./JVMPlugin.md\n\nMirai Console （简称 Console） 运行在 [JVM]，支持使用 [Kotlin] 或 [Java] 等 JVM\n语言编写的插件。\n\n本章节简要介绍 Console 插件架构（与平台无关的基础架构）。\n\n## 通用的插件接口 - [`Plugin`]\n\n所有 Console 插件都必须直接或间接地实现 [`Plugin`] 接口。\n\n> **解释 *插件***：只要实现了 [`Plugin`] 接口的对象都可以叫做「Mirai Console 插件」，简称 「插件」。  \n> 为了便捷，内含 [`Plugin`] 实现的一个 [JAR] 文件也可以被称为「插件」。\n\n基础的 [`Plugin`] 很通用，它只拥有很少的成员：\n\n```kotlin\ninterface Plugin : CommandOwner { // CommandOwner 表示该对象可以创建指令\n    val isEnabled: Boolean // 当插件已开启时返回 true\n    val loader: PluginLoader<*, *> // 能处理这个 Plugin 实例的 PluginLoader\n}\n```\n\n[`Plugin`] 接口拥有强扩展性，以支持 Mirai Console 统一管理使用其他编程语言编写的插件\n（详见进阶章节 [扩展 - PluginLoader](../Extensions.md)）。\n\n> 除非你是在实现新种类插件，否则不要直接实现 `Plugin` 接口。\n\n## 插件加载器 - [`PluginLoader`]\n\nMirai Console 支持使用多个插件加载器来加载多种类型插件。每个插件加载器都支持一种类型的插件。\n\nMirai Console 内置 [`JvmPluginLoader`] 以加载 JVM\n平台插件（见下文），并允许这些插件注册扩展的插件加载器（见章节 [扩展](../Extensions.md))\n，以支持读取其他语言编写的插件并接入\nConsole 插件管理系统。\n\n## 总结\n\nMirai Console 提供抽象的插件及其加载器接口，支持扩展。各类插件行为由其加载器确定。插件作者需要基于特定的插件平台实现，如\nConsole 内置的 [JVM 平台][JVMPlugin]。\n\n## 继续阅读\n\n- [JVM 平台插件详情][JVMPlugin]\n- [编写插件加载器](../Extensions.md)"
  },
  {
    "path": "mirai-console/frontend/mirai-android/.github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: 报告一个bug\ntitle: \"[BUG]\"\nlabels: bug\nassignees: ''\n\n---\n\n<!-- \n  请确认你已经做了下面这些事情，若问题还是未解决，那么请尽可详细地描述你的问题。\n  - 我已经对照 CHANGELOG ，相关问题未在近期更新中解决\n  - 我已经搜索了已有的 Issues 列表中有没相关的信息\n  - 我已经阅读了 MiraiAndroid 的相关文档\n  - 我使用的是最新release版本 MiraiAndroid\n  - 我确定这个问题不是Mirai协议支持库的问题\n-->\n\n<!--在下面空白处简略描述你遇到的问题-->\n\n\n\n\n<!--如果有控制台报错，请尽量在下面空白处附加全面的日志. (请使用右上角的分享日志功能)-->\n<!--如果程序崩溃，请使用上传日志功能-->\n```\n\n\n\n```\n\n\n#### 复现\n<!--在这里简略说明如何让这个问题再次发生-->\n<!--可使用 1.  2.  3.  的列表格式，或其他任意恰当的格式-->\n\n\n\n\n<!--如有必要，你可以在下文继续添加其他信息-->\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/.github/workflows/android.yml",
    "content": "name: Android Build\n\non:\n  pull_request:\n    branches:\n      - 'master'\n  push:\n    branches:\n      - 'master'\n\njobs:\n  build:\n    name: Run Build\n    runs-on: ubuntu-18.04\n\n    steps:\n      - uses: actions/checkout@v1\n      - name: set up JDK 1.8\n        uses: actions/setup-java@v1\n        with:\n          java-version: 1.8\n      - name: Unit tests\n        run: bash ./gradlew build\n\n#jobs:\n#  test:\n#    runs-on: macos-latest\n#    steps:\n#      - name: checkout\n#        uses: actions/checkout@v3\n#\n#      - name: run tests\n#        uses: reactivecircus/android-emulator-runner@v2\n#        with:\n#          api-level: 29\n#          script: bash ./gradlew connectedCheck\n\n# jobs:\n# #   test:\n# #     name: Run Unit Tests\n# #     runs-on: ubuntu-18.04\n\n# #     steps:\n# #       - uses: actions/checkout@v1\n# #       - name: set up JDK 1.8\n# #         uses: actions/setup-java@v1\n# #         with:\n# #           java-version: 1.8\n# #       - name: Unit tests\n# #         run: bash ./gradlew test --stacktrace\n\n#   apk:\n#     name: Generate APK\n#     runs-on: ubuntu-18.04\n\n#     steps:\n#       - uses: actions/checkout@v1\n#       - name: set up JDK 1.8\n#         uses: actions/setup-java@v1\n#         with:\n#           java-version: 1.8\n#       - name: Build debug APK\n#         run: bash ./gradlew assembleDebug --stacktrace\n#       - name: Upload APK\n#         uses: actions/upload-artifact@v1\n#         with:\n#           name: MiraiAndroid\n#           path: app/build/outputs/apk/debug/app-debug.apk\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/.gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/caches\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n/.idea/navEditor.xml\n/.idea/assetWizardSettings.xml\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n.cxx\napp/release"
  },
  {
    "path": "mirai-console/frontend/mirai-android/LICENSE",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  Developers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\n  A secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate.  Many developers of free software are heartened and\nencouraged by the resulting cooperation.  However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\n  The GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community.  It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server.  Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\n  An older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals.  This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Remote Network Interaction; Use with the GNU General Public License.\n\n  Notwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software.  This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time.  Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as published\n    by the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source.  For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code.  There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<https://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/README.md",
    "content": "<!--\n * @Descripttion: \n * @version: \n * @Author: sueRimn\n * @Date: 2020-05-08 16:45:00\n * @LastEditors: sueRimn\n * @LastEditTime: 2020-05-09 12:22:15\n -->\n \n <div align=\"center\">\n   <img width=\"160\" src=\"https://cdn.jsdelivr.net/gh/mzdluo123/blog_imgs/img/20200531205703.png\" alt=\"logo\"></br>\n\n   <img width=\"95\" src=\"https://cdn.jsdelivr.net/gh/mzdluo123/blog_imgs/img/20200531205726.png\" alt=\"title\">\n\n</div>\n\n\n# MiraiAndroid\n\n<img alt=\"GitHub Workflow Status\" src=\"https://img.shields.io/github/workflow/status/mzdluo123/MiraiAndroid/Android Build?style=flat-square\">\n\n<img alt=\"GitHub issues\" src=\"https://img.shields.io/github/issues/mzdluo123/MiraiAndroid?style=flat-square\">\n\n<img alt=\"GitHub pull requests\" src=\"https://img.shields.io/github/issues-pr/mzdluo123/MiraiAndroid?style=flat-square\">\n\nmirai-console的Android前端程序，可作为qq机器人使用，支持多种脚本接口\n\n关于mirai项目以及mirai-console的一切请点击[这里](https://github.com/mamoe/mirai)\n\n相比使用`Termux`或者是`Linux Deploy`等应用运行mirai的方案，该项目提供的方案具有更好的性能以及更少的资源占用，但可能存在兼容性问题\n\n最新的构建版本你可以到release或QQ群内找到\n\nMiraiAndroid交流群：`1131127734`但是请注意，如果您违反了群内相关规定或是有其他不当行为你可能会被无理由移出本群\n\n图标以及形象由画师<a href = \"https://github.com/DazeCake\">DazeCake</a>绘制\n\n## 声明\n\n### 一切开发旨在学习，请勿用于非法用途\n- MiraiAndroid 是完全免费且开放源代码的软件，仅供学习和娱乐用途使用\n- MiraiAndroid 不会通过任何方式强制收取费用，或对使用者提出物质条件\n- MiraiAndroid 由整个开源社区维护，并不是属于某个个体的作品，所有贡献者都享有其作品的著作权。\n\n### 许可证\n\n    Copyright (C) 2019-2020 Mamoe Technologies and contributors.\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as\n    published by the Free Software Foundation, either version 3 of the\n    License, or (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n`MiraiAndroid` 采用 `AGPLv3` 协议开源。为了整个社区的良性发展，我们**强烈建议**您做到以下几点：\n\n- **间接接触（包括但不限于使用 `httpapi` 或 跨进程技术）到 `mirai` 的软件使用 `AGPLv3` 开源**\n- **不鼓励，不支持一切商业使用**\n\n\n# 已实现的功能\n\n* 兼容mirai-console插件(实验性)\n* 带验证码的登录处理\n* 内置Google d8 dex编译器，可直接编译JVM的console插件在Android运行(实验性)\n* lua脚本接口（测试版）\n* 网络掉线提醒\n\n# 安装脚本\n\n目前MiraiAndroid已支持lua和JavaScript脚本，感谢[lua-mirai](https://github.com/only52607/lua-mirai)和[mirai-js](https://github.com/iTXTech/mirai-js)项目\n\n## lua脚本\n\n以下是一个简单的示例\n\n```lua\nEvent.onLoad = function (bot)\n    bot:subscribeGroupMsg(\n        function(bot, msg, group, sender)\n            group:sendMsg( msg )\n        end\n    )   \nend\n```\n\n这个脚本实现了最简单的\"复读机\"功能，更多API请看[lua-mirai android api](https://github.com/only52607/lua-mirai/blob/master/docs/miraiandroid.md)\n\n## JavaScript脚本\n\n以下是一个~~简单~~复杂的示例\n\n```JavaScript\n// 插件信息\npluginInfo = {\n    name: \"JsPluginExample\",\n    version: \"1.0.0\",\n    author: \"PeratX\",\n    website: \"https://github.com/iTXTech/mirai-js/blob/master/examples/reply.js\"\n};\n\nlet verbose = true;\n\n// onLoad 事件\nplugin.ev.onLoad = () => {\n    logger.info(\"插件已加载：\" + plugin.dataDir);\n\n    // 插件数据读写\n    let file = plugin.getDataFile(\"test.txt\")\n    // 第三个编码参数默认为 UTF-8，可空，同readText第二个参数\n    stor.writeText(file, \"真的很强。\", Charset.forName(\"GBK\"));\n    logger.info(\"读取文件：\" + file + \" 内容：\" + stor.readText(file, Charset.forName(\"GBK\")));\n\n    let config = new JsonConfig(plugin.getDataFile(\"test.json\"));\n    config.put(\"wow\", \"Hello World!\");\n    config.save();\n\n    let v = 0;\n    // 启动协程\n    core.launch(() => {\n        v++;\n        logger.info(\"正在等待：\" + v);\n        if (verbose) {\n            // 100ms执行一次\n            return 100;\n        }\n        // 停止协程，返回 -1\n        return -1;\n    });\n    // 延时1000ms执行一次\n    core.launch(() => {\n        verbose = false\n        return -1;\n    }, 1000);\n    // 命令名称，描述，帮助，别名，回调\n    core.registerCommand(\"test\", \"测试命令\", \"test\", null, (sender, args) => {\n        logger.info(\"发送者：\" + sender)\n        logger.info(\"参数：\" + args)\n        return true\n    });\n};\n\nplugin.ev.onEnable = () => {\n    logger.info(\"插件已启用。\" + (plugin.enabled ? \"是真的\" : \"是假的\"));\n    try {\n        // Http 基于 OkHttp，可使用 OkHttp 的 API 自行构造\n        let result = http.get(\"https://github.com/mamoe/mirai\");\n        if (result.isSuccessful()) {\n            logger.info(\"Mirai GitHub主页长度：\" + result.body().string().length());\n        } else {\n            logger.error(\"无法访问Mirai GitHub主页\");\n        }\n        // 手动调用 OkHttp\n        let client = http.newClient()\n            .connectTimeout(5000, TimeUnit.MILLISECONDS)\n            .readTimeout(5000, TimeUnit.MILLISECONDS)\n            .build()\n        let response = client.newCall(\n            http.newRequest()\n                .url(\"https://im.qq.com\")\n                .header(\"User-Agent\", \"NMSL Browser 1.0\")\n                .build()\n        ).execute();\n        if (response.isSuccessful()) {\n            logger.info(\"QQ主页长度：\" + response.body().string().length());\n        } else {\n            logger.error(\"无法访问QQ主页\");\n        }\n    } catch (e) {\n        logger.error(\"无法获取网页\", e)\n    }\n    regEv();\n};\n\nplugin.ev.onDisable = () => {\n    logger.info(\"插件已禁用。\");\n};\n\nplugin.ev.onUnload = () => {\n    logger.info(\"插件已卸载。\");\n};\n\nfunction regEv() {\n    core.subscribeAlways(BotOnlineEvent, ev => {\n        logger.info(ev);\n    });\n    core.subscribeAlways(GroupMessageEvent, ev => {\n        logger.info(ev);\n        ev.group.sendMessage(new PlainText(\"MiraiJs 收到消息：\").plus(ev.message));\n    })\n}\n```\n你可以在[这里](https://github.com/iTXTech/mirai-js/blob/master/examples/reply.js)找到它，更多内容请查看项目介绍\n\n在脚本管理界面点击右上角`+`可直接添加脚本到MiraiAndroid\n\n目前该功能仍在开发中\n\n\n# 安装插件\n\n你有两个办法安装插件\n\n## 使用app直接打开jar文件安装\n\n这是最简单的方式。app切换到插件管理点击右上角选择即可，你也可以使用系统文件选择器直接打开jar文件\n\n**如果你无法选择文件**，请使用第三方文件选择器选择（例如Mix）\n\n## 使用pc转换后导入\n\n请按照以下方法操作\n\n* 找到`d8`编译器的运行脚本\n\nd8工具已在新版`Android sdk`中自带，它就在`build-tools`中对应版本的文件夹下。在Windows平台他是一个bat文件\n\n如果没有可到上面的交流群内下载\n\n* 编译\n\n打开终端，使用以下命令编译\n\n```\nd8.bat --output 输出文件.jar 源文件\n```\n输出文件扩展名必须是jar或者是zip\n\n* 复制资源\n\n使用压缩软件打开源jar文件，将里面的`plugin.yml`，`META-INF`和其他资源文件(除存放class文件夹的其他文件)复制到新的jar文件内\n\n* 安装插件\n\n将上一步的新的jar文件复制到手机的`/sdcard/Android/data/io.github.mzdluo123.mirai.android/files/plugins/`\n\n重启即可使用插件，当然部分插件可能也会存在兼容性问题\n\n# FAQ\n\nQ: 后台运行被系统杀死<br>\nA：请手动将应用添加到系统后台白名单\n\nQ：应用崩溃或后台报错<br>\nA：如果是后台报错一般是插件或者是mirai-core的问题，是mirai-core的问题请在菜单内找到分享日志并到群内或开启issue反馈，插件的问题请联系对应开发者；如果是应用崩溃，请重启并按照上面的方法提交日志给我们\n\n# 兼容的Console插件列表\n\n以下插件由群友测试未发现问题，你可以到群内下载，或是到[插件中心](https://github.com/mamoe/mirai-plugins)手动下载jvm版并导入\n\n* mirai-api-http\n* HsoSe\n* keywordReply\n* forward\n* CQHTTPMirai\n\n对于其他插件请自行尝试；此外，如果你的插件使用了一些Android不支持的api(例如BufferedImage)那么使用了这个api的功能将绝对不能正常工作\n\n# 关于支持的Android版本\n\n我们尚不清楚MiraiAndroid究竟能在哪些Android版本上正常工作，需要大家进行测试\n\n我们已经测试无问题的Android版本：\n\n* Android 10\n* Android 8.1（无法在Android端编译插件）\n\n其他版本还未进行测试，以下是测试要求：\n\n* 程序不闪退，不报错，不出现无响应，通知显示正常，能正常完成登录\n* 能够在Android端编译jvm插件（可选）\n* 能够使用编译好的jvm插件发送消息，发送图片，处理事件和正确读写配置\n* 能够正常运行两个脚本引擎的demo\n\n从下一个release版本开始项目的minsdk版本将调整至21（Android 5.1），测试结果可以通过issue和交流群告诉我们，谢谢！（反馈时记得带上日志和Android版本，抓取日志可以在控制台右上角菜单内找到）\n\n\n# 消息推送(2.9新增)\n\n必须使用自动登录并在设置中开启才能使用该功能\n\n你可以发送广播来快速向指定群或联系人推送信息，这里是data的URI格式\n\n```\nma://sendGroupMsg?msg=消息&id=群号\nma://sendFriendMsg?msg=消息&id=账号\nma://sendFriendMsg?msg=消息&id=账号&at=要at的人\n```\n\n```kotlin\nsendBroadcast(Intent(\"io.github.mzdluo123.mirai.android.PushMsg\").apply {\n        data = Uri.parse(\"ma://sendGroupMsg?msg=HelloWorld&id=655057127\")\n    })\n```\n\n以下是auto.js的示例\n\n```js\napp.sendBroadcast({\n    action: \"io.github.mzdluo123.mirai.android.PushMsg\",\n    data: \"ma://sendGroupMsg?msg=来自autojs的消息&id=655057127\"\n})\n```\n\n以下是tasker的示例\n\n```yaml\n    ma (2)\n    \tA1: 发送意图 [ 操作:io.github.mzdluo123.mirai.android.PushMsg 类别:None Mime类型: 数据:ma://sendGroupMsg?msg=来自tasker的消息&id=655057127 额外: 额外: 额外: 包: 类: 目标:Broadcast Receiver ] \n```\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/build.gradle",
    "content": "apply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\napply plugin: 'kotlin-android-extensions'\napply plugin: 'kotlin-kapt'\napply plugin: 'org.jetbrains.kotlin.plugin.serialization'\n\n\ndef CORE_VERSION = \"1.2.1\"\ndef LUAMIRAI_VERSION = \"0.5.0\"\n\nandroid {\n    compileSdkVersion 29\n    buildToolsVersion \"29.0.2\"\n\n    defaultConfig {\n        applicationId \"io.github.mzdluo123.mirai.android\"\n        minSdkVersion 21\n        targetSdkVersion 29\n        versionCode 30\n        versionName \"2.10.3\"\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        buildConfigField(\"String\", \"COREVERSION\", \"\\\"$CORE_VERSION\\\"\")\n        buildConfigField(\"String\", \"LUAMIRAI_VERSION\", \"\\\"$LUAMIRAI_VERSION\\\"\")\n    }\n    buildFeatures {\n        dataBinding = true\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            shrinkResources false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n        debug{\n            minifyEnabled false\n            shrinkResources false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n\n// To inline the bytecode built with JVM target 1.8 into\n// bytecode that is being built with JVM target 1.6. (e.g. navArgs)\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n    kotlinOptions {\n        jvmTarget = \"1.8\"\n    }\n    packagingOptions {\n        exclude 'META-INF/DEPENDENCIES'\n        exclude 'META-INF/LICENSE'\n        exclude 'META-INF/LICENSE.txt'\n        exclude 'META-INF/license.txt'\n        exclude 'META-INF/NOTICE'\n        exclude 'META-INF/NOTICE.txt'\n        exclude 'META-INF/notice.txt'\n        exclude 'META-INF/ASL2.0'\n        exclude(\"META-INF/*.kotlin_module\")\n    }\n\n    lintOptions {\n        abortOnError false\n    }\n\n\n\n    testOptions {\n        animationsDisabled = true\n    }\n}\n\ndependencies {\n    implementation (fileTree(dir: 'libs', include: ['*.jar']))\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version\"\n    implementation 'com.google.android.material:material:1.2.0'\n\n    //androidx-core-ktx\n    implementation 'androidx.core:core-ktx:1.3.1'\n\n    //androidx-appcompat\n    implementation 'androidx.appcompat:appcompat:1.1.0'\n\n    //androidx-legacy\n    implementation 'androidx.legacy:legacy-support-v4:1.0.0'\n\n    //androidx-constraintlayout\n    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'\n\n    //androidx-navigation\n    implementation 'androidx.navigation:navigation-fragment:2.3.0'\n    implementation 'androidx.navigation:navigation-ui:2.3.0'\n    implementation 'androidx.navigation:navigation-fragment-ktx:2.3.0'\n    implementation 'androidx.navigation:navigation-ui-ktx:2.3.0'\n\n    //androidx-lifecycle\n    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'\n    implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'\n    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'\n\n    //androidx-preference\n    implementation 'androidx.preference:preference:1.1.1'\n\n    //kotlinx-coroutines\n    implementation \"org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9\"\n    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.4'\n\n    //zip\n    implementation 'net.lingala.zip4j:zip4j:2.5.2'\n\n    //BaseRecyclerViewAdapterHelper\n    implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.2'\n\n    //mirai-core\n    implementation \"net.mamoe:mirai-core-qqandroid:$CORE_VERSION\"\n\n    //mirai-lua\n    implementation \"com.ooooonly:luaMirai:$LUAMIRAI_VERSION\"\n    //noinspection DuplicatePlatformClasses\n    //implementation 'org.json:json:20160212'\n    //{\n        //exclude module: 'okio'\n        //exclude module: 'okhttp3'\n    //}\n    //implementation 'com.ooooonly:giteeman:0.1.1'\n\n    //splitties\n    implementation(\"com.louiscad.splitties:splitties-fun-pack-android-base:3.0.0-alpha06\")\n    implementation(\"com.louiscad.splitties:splitties-fun-pack-android-appcompat:3.0.0-alpha06\")\n\n    //acra\n    implementation \"ch.acra:acra-core:5.1.3\"\n    implementation \"ch.acra:acra-toast:5.1.3\"\n\n    //glide\n    implementation 'com.github.bumptech.glide:glide:4.11.0'\n    annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'\n\n    //yaml\n    implementation group: 'org.yaml', name: 'snakeyaml', version: '1.26'\n    implementation group: 'com.moandjiezana.toml', name: 'toml4j', version: '0.7.2'\n\n    //okhttp3\n    implementation 'com.squareup.okhttp3:okhttp:4.7.2'\n\n\n\n    //test\n    implementation 'androidx.test.espresso:espresso-idling-resource:3.2.0'\n\n\n    debugImplementation 'androidx.fragment:fragment-testing:1.2.4'\n\n    testImplementation 'junit:junit:4.12'\n    androidTestImplementation 'androidx.test.ext:junit:1.1.1'\n    androidTestImplementation 'androidx.test:runner:1.2.0'\n    androidTestImplementation 'androidx.test:rules:1.2.0'\n    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'\n    androidTestImplementation 'androidx.test.espresso:espresso-intents:3.2.0'\n    androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'\n\n\n\n//  https://mvnrepository.com/artifact/net.mamoe/mirai-console\n// implementation group: 'net.mamoe', name: 'mirai-console', version: '0.5.1'\n// implementation \"net.mamoe:mirai-core:0.39.1\"\n// https://mvnrepository.com/artifact/org.yaml/snakeyaml\n// https://mvnrepository.com/artifact/com.moandjiezana.toml/toml4j\n\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n# 配置目前还有点问题无法使用\n-keepattributes *Annotation*,Signature\n\n-keepclasseswithmembers class * extends java.lang.Exception { *;}\n\n#kotlin\n-keep class kotlin.** { *; }\n-keep class kotlin.Metadata { *; }\n-dontwarn kotlin.**\n-keepclassmembers class **$WhenMappings {\n    <fields>;\n}\n-keepclassmembers class kotlin.Metadata {\n    public <methods>;\n}\n-assumenosideeffects class kotlin.jvm.internal.Intrinsics {\n    static void checkParameterIsNotNull(java.lang.Object, java.lang.String);\n}\n\n-keepclasseswithmembernames class * {\n    native <methods>;\n}\n\n-keepclassmembers enum * { *;}\n-keep class kotlinx.coroutines.** {*;}\n\n# jvm平台的一些不存在的类\n\n-dontwarn java.awt.**\n-dontwarn javax.swing.**\n-dontwarn sun.misc.**\n-dontwarn org.jetbrains.kotlin.**\n\n# mirai 配置\n-keep class net.mamoe.mirai.qqandroid.QQAndroid.$Companion { *; }\n-keepclasseswithmembers class * extends net.mamoe.mirai.BotFactory{ *;}\n\n-keep class net.mamoe.mirai.console.** { *; }\n-keep class net.mamoe.mirai.contact.** { *; }\n-keep class net.mamoe.mirai.event.** { *; }\n-keep class net.mamoe.mirai.message.** { *; }\n-keep class net.mamoe.mirai.network.** { *; }\n-keep class net.mamoe.mirai.utils.** { *; }\n-keep class net.mamoe.mirai.* { *; }\n\n# ktor\n-keep class io.ktor.client.** { *; }\n\n-keepclassmembers class io.ktor.** {\n    volatile <fields>;\n}\n\n\n# json\n\n-keep class kotlinx.serialization.json.** {*;}\n-keep class kotlinx.serialization.* {*;}\n\n# yaml\n\n-keep class org.yaml.snakeyaml.* {*;}\n-keep class org.yaml.snakeyaml.util.* {*;}\n\n# okhttp\n-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase\n-dontwarn okhttp3.internal.platform.ConscryptPlatform"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/androidTest/java/io/github/mzdluo123/mirai/android/TestWithIdleResources.kt",
    "content": "package io.github.mzdluo123.mirai.android\n\nimport androidx.test.espresso.IdlingRegistry\nimport org.junit.After\nimport org.junit.Before\n\nopen class TestWithIdleResources {\n\n    /**\n     * 所有测试的基类\n     * 请将所有测试继承这个类防止在未完成操作时进行下一步点击\n     *\n     * 测试时请使用英文系统\n     *\n     * */\n\n    @Before\n    fun before() {\n        IdlingRegistry.getInstance().register(IdleResources.loadingData)\n        IdlingRegistry.getInstance().register(IdleResources.botServiceLoading)\n    }\n\n    @After\n    fun after() {\n        IdlingRegistry.getInstance().unregister(IdleResources.loadingData)\n        IdlingRegistry.getInstance().register(IdleResources.botServiceLoading)\n    }\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/androidTest/java/io/github/mzdluo123/mirai/android/activity/NavTest.kt",
    "content": "package io.github.mzdluo123.mirai.android.activity\n\n\nimport androidx.test.espresso.Espresso.onView\nimport androidx.test.espresso.action.ViewActions.click\nimport androidx.test.espresso.matcher.ViewMatchers.*\nimport androidx.test.filters.LargeTest\nimport androidx.test.rule.ActivityTestRule\nimport androidx.test.runner.AndroidJUnit4\nimport io.github.mzdluo123.mirai.android.R\nimport io.github.mzdluo123.mirai.android.TestWithIdleResources\nimport io.github.mzdluo123.mirai.android.childAtPosition\nimport org.hamcrest.Matchers.`is`\nimport org.hamcrest.Matchers.allOf\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n@LargeTest\n@RunWith(AndroidJUnit4::class)\nclass NavTest : TestWithIdleResources() {\n\n    @Rule\n    @JvmField\n    var mActivityTestRule = ActivityTestRule(MainActivity::class.java)\n\n    @Test\n    fun navTest() {\n        val appCompatImageButton = onView(\n            allOf(\n                childAtPosition(\n                    allOf(\n                        withId(R.id.toolbar),\n                        childAtPosition(\n                            withClassName(`is`(\"com.google.android.material.appbar.AppBarLayout\")),\n                            0\n                        )\n                    ),\n                    1\n                ),\n                isDisplayed()\n            )\n        )\n        appCompatImageButton.perform(click())\n\n        val navigationMenuItemView = onView(\n            allOf(\n                childAtPosition(\n                    allOf(\n                        withId(R.id.design_navigation_view),\n                        childAtPosition(\n                            withId(R.id.nav_view),\n                            0\n                        )\n                    ),\n                    2\n                ),\n                isDisplayed()\n            )\n        )\n        navigationMenuItemView.perform(click())\n\n        val appCompatImageButton2 = onView(\n            allOf(\n                childAtPosition(\n                    allOf(\n                        withId(R.id.toolbar),\n                        childAtPosition(\n                            withClassName(`is`(\"com.google.android.material.appbar.AppBarLayout\")),\n                            0\n                        )\n                    ),\n                    1\n                ),\n                isDisplayed()\n            )\n        )\n        appCompatImageButton2.perform(click())\n\n        val navigationMenuItemView2 = onView(\n            allOf(\n                childAtPosition(\n                    allOf(\n                        withId(R.id.design_navigation_view),\n                        childAtPosition(\n                            withId(R.id.nav_view),\n                            0\n                        )\n                    ),\n                    3\n                ),\n                isDisplayed()\n            )\n        )\n        navigationMenuItemView2.perform(click())\n\n        val actionMenuItemView = onView(\n            allOf(\n                withId(R.id.action_script_center),\n                childAtPosition(\n                    childAtPosition(\n                        withId(R.id.toolbar),\n                        2\n                    ),\n                    0\n                ),\n                isDisplayed()\n            )\n        )\n        actionMenuItemView.perform(click())\n\n        Thread.sleep(100)\n        val appCompatImageButton3 = onView(\n            allOf(\n                childAtPosition(\n                    allOf(\n                        withId(R.id.toolbar),\n                        childAtPosition(\n                            withClassName(`is`(\"com.google.android.material.appbar.AppBarLayout\")),\n                            0\n                        )\n                    ),\n                    1\n                ),\n                isDisplayed()\n            )\n        )\n        appCompatImageButton3.perform(click())\n\n        val appCompatImageButton4 = onView(\n            allOf(\n                childAtPosition(\n                    allOf(\n                        withId(R.id.toolbar),\n                        childAtPosition(\n                            withClassName(`is`(\"com.google.android.material.appbar.AppBarLayout\")),\n                            0\n                        )\n                    ),\n                    1\n                ),\n                isDisplayed()\n            )\n        )\n        appCompatImageButton4.perform(click())\n\n        val navigationMenuItemView3 = onView(\n            allOf(\n                childAtPosition(\n                    allOf(\n                        withId(R.id.design_navigation_view),\n                        childAtPosition(\n                            withId(R.id.nav_view),\n                            0\n                        )\n                    ),\n                    4\n                ),\n                isDisplayed()\n            )\n        )\n        navigationMenuItemView3.perform(click())\n\n        val appCompatImageButton5 = onView(\n            allOf(\n                childAtPosition(\n                    allOf(\n                        withId(R.id.toolbar),\n                        childAtPosition(\n                            withClassName(`is`(\"com.google.android.material.appbar.AppBarLayout\")),\n                            0\n                        )\n                    ),\n                    1\n                ),\n                isDisplayed()\n            )\n        )\n        appCompatImageButton5.perform(click())\n\n        val navigationMenuItemView4 = onView(\n            allOf(\n                childAtPosition(\n                    allOf(\n                        withId(R.id.design_navigation_view),\n                        childAtPosition(\n                            withId(R.id.nav_view),\n                            0\n                        )\n                    ),\n                    5\n                ),\n                isDisplayed()\n            )\n        )\n        navigationMenuItemView4.perform(click())\n\n        val appCompatImageButton6 = onView(\n            allOf(\n                childAtPosition(\n                    allOf(\n                        withId(R.id.toolbar),\n                        childAtPosition(\n                            withClassName(`is`(\"com.google.android.material.appbar.AppBarLayout\")),\n                            0\n                        )\n                    ),\n                    1\n                ),\n                isDisplayed()\n            )\n        )\n        appCompatImageButton6.perform(click())\n\n        val navigationMenuItemView5 = onView(\n            allOf(\n                childAtPosition(\n                    allOf(\n                        withId(R.id.design_navigation_view),\n                        childAtPosition(\n                            withId(R.id.nav_view),\n                            0\n                        )\n                    ),\n                    1\n                ),\n                isDisplayed()\n            )\n        )\n        navigationMenuItemView5.perform(click())\n\n        val appCompatImageButton7 = onView(\n            allOf(\n                childAtPosition(\n                    allOf(\n                        withId(R.id.toolbar),\n                        childAtPosition(\n                            withClassName(`is`(\"com.google.android.material.appbar.AppBarLayout\")),\n                            0\n                        )\n                    ),\n                    1\n                ),\n                isDisplayed()\n            )\n        )\n        appCompatImageButton7.perform(click())\n\n    }\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/androidTest/java/io/github/mzdluo123/mirai/android/console/ConsoleIntentTest.kt",
    "content": "package io.github.mzdluo123.mirai.android.console\n\nimport android.app.Instrumentation\nimport android.content.Intent\nimport androidx.test.espresso.Espresso.onView\nimport androidx.test.espresso.action.ViewActions.click\nimport androidx.test.espresso.intent.Intents.intending\nimport androidx.test.espresso.intent.matcher.IntentMatchers.hasAction\nimport androidx.test.espresso.intent.rule.IntentsTestRule\nimport androidx.test.espresso.matcher.ViewMatchers.*\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport androidx.test.platform.app.InstrumentationRegistry.getInstrumentation\nimport androidx.test.uiautomator.UiDevice\nimport io.github.mzdluo123.mirai.android.R\nimport io.github.mzdluo123.mirai.android.TestWithIdleResources\nimport io.github.mzdluo123.mirai.android.activity.MainActivity\nimport io.github.mzdluo123.mirai.android.childAtPosition\nimport org.hamcrest.CoreMatchers.allOf\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n\n@LargeTest\n@RunWith(AndroidJUnit4::class)\nclass ConsoleIntentTest : TestWithIdleResources() {\n\n\n    @Rule\n    @JvmField\n    var mActivityTestRule = IntentsTestRule(MainActivity::class.java)\n\n    private val device = UiDevice.getInstance(getInstrumentation())\n\n    @Test\n    fun uploadLogTest() {\n\n        val overflowMenuButton = onView(\n            allOf(\n                childAtPosition(\n                    childAtPosition(\n                        withId(R.id.toolbar),\n                        2\n                    ),\n                    0\n                ),\n                isDisplayed()\n            )\n        )\n        overflowMenuButton.perform(click())\n\n        val appCompatTextView = onView(\n            allOf(\n                withId(R.id.title), withText(\"分享日志\"),\n                childAtPosition(\n                    childAtPosition(\n                        withId(R.id.content),\n                        0\n                    ),\n                    0\n                ),\n                isDisplayed()\n            )\n        )\n        appCompatTextView.perform(click())\n\n        intending(hasAction(Intent.ACTION_CHOOSER)).respondWith(\n            Instrumentation.ActivityResult(\n                0,\n                null\n            )\n        )\n\n        device.pressBack()\n    }\n\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/androidTest/java/io/github/mzdluo123/mirai/android/console/ConsoleTest.kt",
    "content": "package io.github.mzdluo123.mirai.android.console\n\n\nimport androidx.test.espresso.Espresso.onView\nimport androidx.test.espresso.action.ViewActions.*\nimport androidx.test.espresso.assertion.ViewAssertions\nimport androidx.test.espresso.matcher.ViewMatchers.*\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport androidx.test.rule.ActivityTestRule\nimport io.github.mzdluo123.mirai.android.R\nimport io.github.mzdluo123.mirai.android.TestWithIdleResources\nimport io.github.mzdluo123.mirai.android.activity.MainActivity\nimport io.github.mzdluo123.mirai.android.childAtPosition\nimport org.hamcrest.CoreMatchers\nimport org.hamcrest.Matchers\nimport org.hamcrest.Matchers.allOf\nimport org.hamcrest.core.IsInstanceOf\nimport org.junit.FixMethodOrder\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.junit.runners.MethodSorters\n\n@LargeTest\n@RunWith(AndroidJUnit4::class)\n@FixMethodOrder(MethodSorters.JVM)\nclass ConsoleTest : TestWithIdleResources() {\n\n    @Rule\n    @JvmField\n    var mActivityTestRule = ActivityTestRule(MainActivity::class.java)\n\n\n    @Test\n    fun fastLoginAndFastRestartTest() {\n        val overflowMenuButton = onView(\n            allOf(\n                childAtPosition(\n                    childAtPosition(\n                        withId(R.id.toolbar),\n                        2\n                    ),\n                    0\n                ),\n                isDisplayed()\n            )\n        )\n        overflowMenuButton.perform(click())\n\n        val appCompatTextView = onView(\n            allOf(\n                withId(R.id.title), withText(\"设置自动登录\"),\n                childAtPosition(\n                    childAtPosition(\n                        withId(R.id.content),\n                        0\n                    ),\n                    0\n                ),\n                isDisplayed()\n            )\n        )\n        appCompatTextView.perform(click())\n\n        val appCompatEditText = onView(\n            allOf(\n                withId(R.id.qq_input),\n                childAtPosition(\n                    childAtPosition(\n                        withId(android.R.id.custom),\n                        0\n                    ),\n                    2\n                ),\n                isDisplayed()\n            )\n        )\n        appCompatEditText.perform(replaceText(\"1\"), closeSoftKeyboard())\n\n        val appCompatEditText2 = onView(\n            allOf(\n                withId(R.id.password_input),\n                childAtPosition(\n                    childAtPosition(\n                        withId(android.R.id.custom),\n                        0\n                    ),\n                    3\n                ),\n                isDisplayed()\n            )\n        )\n        appCompatEditText2.perform(replaceText(\"2\"), closeSoftKeyboard())\n\n        val appCompatButton = onView(\n            allOf(\n                withId(android.R.id.button1), withText(\"设置自动登录\")\n\n            )\n        )\n        appCompatButton.perform(scrollTo(), click())\n\n        val appCompatImageButton7 = onView(\n            allOf(\n                childAtPosition(\n                    allOf(\n                        withId(R.id.toolbar),\n                        childAtPosition(\n                            withClassName(Matchers.`is`(\"com.google.android.material.appbar.AppBarLayout\")),\n                            0\n                        )\n                    ),\n                    1\n                ),\n                isDisplayed()\n            )\n        )\n        appCompatImageButton7.perform(click())\n\n        onView(withText(\"快速重启\")).perform(click())\n\n        onView(withId(R.id.log_text)).check(ViewAssertions.matches(isDisplayed()))\n        Thread.sleep(2000)  //花两秒钟给控制台加载log\n\n        onView(withId(R.id.log_text)).check(\n            ViewAssertions.matches(\n                withText(\n                    CoreMatchers.containsString(\n                        \"自动登录\"\n                    )\n                )\n            )\n        )\n\n    }\n\n\n    @Test\n    fun commandInputTest() {\n        val appCompatEditText = onView(\n            allOf(\n                withId(R.id.command_input),\n                isDisplayed()\n            )\n        )\n        appCompatEditText.perform(replaceText(\"help\"), closeSoftKeyboard())\n\n        val appCompatImageButton = onView(withId(R.id.commandSend_btn))\n        appCompatImageButton.perform(click())\n\n        val textView = onView(\n            allOf(\n                withId(R.id.log_text),\n                childAtPosition(\n                    allOf(\n                        withId(R.id.main_scroll),\n                        childAtPosition(\n                            IsInstanceOf.instanceOf(android.view.ViewGroup::class.java),\n                            0\n                        )\n                    ),\n                    0\n                ),\n                isDisplayed()\n            )\n        )\n        textView.check(\n            ViewAssertions.matches(\n                withText(\n                    CoreMatchers.containsString(\n                        \"android\"\n                    )\n                )\n            )\n        )\n    }\n\n\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/androidTest/java/io/github/mzdluo123/mirai/android/script/ScriptManageTest.kt",
    "content": "package io.github.mzdluo123.mirai.android.script\n\n\nimport androidx.navigation.findNavController\nimport androidx.test.espresso.Espresso.onView\nimport androidx.test.espresso.action.ViewActions.click\nimport androidx.test.espresso.assertion.ViewAssertions.matches\nimport androidx.test.espresso.matcher.ViewMatchers.*\nimport androidx.test.filters.LargeTest\nimport androidx.test.rule.ActivityTestRule\nimport androidx.test.runner.AndroidJUnit4\nimport io.github.mzdluo123.mirai.android.R\nimport io.github.mzdluo123.mirai.android.TestWithIdleResources\nimport io.github.mzdluo123.mirai.android.ToastMatcher\nimport io.github.mzdluo123.mirai.android.activity.MainActivity\nimport io.github.mzdluo123.mirai.android.childAtPosition\nimport org.hamcrest.Matchers.allOf\nimport org.junit.FixMethodOrder\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.junit.runners.MethodSorters\n\n\n@ExperimentalStdlibApi\n@LargeTest\n@FixMethodOrder(MethodSorters.JVM)\n@RunWith(AndroidJUnit4::class)\nclass ScriptManageTest : TestWithIdleResources() {\n\n    @Rule\n    @JvmField\n    var mActivityTestRule = ActivityTestRule(MainActivity::class.java)\n\n    @Test\n    fun scriptCenterInstall() {\n        mActivityTestRule.runOnUiThread {\n            mActivityTestRule.activity.findNavController(R.id.nav_host_fragment)\n                .navigate(R.id.nav_scripts_center)\n        }\n        val cardView = onView(\n            allOf(\n                withId(R.id.cv_item),\n                childAtPosition(\n                    childAtPosition(\n                        withId(R.id.rcl_scripts),\n                        0\n                    ),\n                    0\n                ),\n                isDisplayed()\n            )\n        )\n        cardView.perform(click())\n\n        onView(withText(\"OK\")).perform(click())\n        onView(withText(\"导入成功！\")).inRoot(ToastMatcher()).check(matches(isDisplayed()))\n\n    }\n\n    @Test\n    fun scriptDelete() {\n        mActivityTestRule.runOnUiThread {\n            mActivityTestRule.activity.findNavController(R.id.nav_host_fragment)\n                .navigate(R.id.nav_scripts)\n        }\n        val cardView2 = onView(\n            allOf(\n                withId(R.id.cv_item),\n                childAtPosition(\n                    childAtPosition(\n                        withId(R.id.script_recycler),\n                        0\n                    ),\n                    0\n                ),\n                isDisplayed()\n            )\n        )\n        cardView2.perform(click())\n\n        val appCompatImageButton3 = onView(\n            allOf(\n                withId(R.id.btn_delete), withContentDescription(\"delete\"),\n                childAtPosition(\n                    childAtPosition(\n                        withId(R.id.custom),\n                        0\n                    ),\n                    1\n                ),\n                isDisplayed()\n            )\n        )\n        appCompatImageButton3.perform(click())\n\n        onView(withText(\"OK\")).perform(click())\n        onView(withText(\"当前无脚本\")).check(matches(isDisplayed()))\n    }\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/androidTest/java/io/github/mzdluo123/mirai/android/utils.kt",
    "content": "package io.github.mzdluo123.mirai.android;\n\nimport android.os.IBinder\nimport android.view.View\nimport android.view.ViewGroup\nimport android.view.WindowManager\nimport androidx.test.espresso.Root\nimport org.hamcrest.Description\nimport org.hamcrest.Matcher\nimport org.hamcrest.TypeSafeMatcher\n\n\ninternal fun childAtPosition(\n    parentMatcher: Matcher<View>, position: Int\n): Matcher<View> {\n\n    return object : TypeSafeMatcher<View>() {\n        override fun describeTo(description: Description) {\n            description.appendText(\"Child at position $position in parent \")\n            parentMatcher.describeTo(description)\n        }\n\n        public override fun matchesSafely(view: View): Boolean {\n            val parent = view.parent\n            return parent is ViewGroup && parentMatcher.matches(parent)\n                    && view == parent.getChildAt(position)\n        }\n    }\n}\n\n\nclass ToastMatcher : TypeSafeMatcher<Root>() {\n    override fun describeTo(description: Description) {\n        description.appendText(\"is toast\")\n    }\n\n    public override fun matchesSafely(root: Root): Boolean {\n        val type: Int = root.getWindowLayoutParams().get().type\n        if (type == WindowManager.LayoutParams.TYPE_TOAST) {\n            val windowToken: IBinder = root.getDecorView().getWindowToken()\n            val appToken: IBinder = root.getDecorView().getApplicationWindowToken()\n            if (windowToken === appToken) {\n                //means this window isn't contained by any other windows.\n                return true\n            }\n        }\n        return false\n    }\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    package=\"io.github.mzdluo123.mirai.android\">\n\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\" />\n    <uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\" />\n    <uses-permission android:name=\"android.permission.WAKE_LOCK\" />\n    <uses-permission android:name=\"android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS\" />\n\n    <application\n        android:name=\".BotApplication\"\n        android:icon=\"@mipmap/ic_new_launcher\"\n        android:label=\"@string/app_name\"\n        android:largeHeap=\"true\"\n        android:roundIcon=\"@mipmap/ic_new_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\"\n        android:usesCleartextTraffic=\"true\">\n<!--        <receiver-->\n<!--            android:name=\".receiver.PushMsgReceiver\"-->\n<!--            android:enabled=\"true\"-->\n<!--            android:exported=\"true\">-->\n<!--            <intent-filter>-->\n<!--                <action android:name=\"io.github.mzdluo123.mirai.android.PushMsg\"/>-->\n<!--            </intent-filter>-->\n<!--        </receiver>-->\n\n        <activity\n            android:name=\".activity.UnsafeLoginActivity\"\n            android:excludeFromRecents=\"true\"\n            android:label=\"请完成登录验证\"\n            android:launchMode=\"singleTask\" />\n        <activity android:name=\".activity.PluginImportActivity\">\n            <intent-filter tools:ignore=\"AppLinkUrlError\">\n                <action android:name=\"android.intent.action.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data android:mimeType=\"application/java-archive\" />\n            </intent-filter>\n        </activity>\n\n        <service\n            android:name=\".service.BotService\"\n            android:description=\"@string/service_description\"\n            android:enabled=\"true\"\n            android:exported=\"false\"\n            android:process=\":BotProcess\" />\n\n        <activity\n            android:name=\".activity.MainActivity\"\n            android:label=\"@string/app_name\"\n            android:theme=\"@style/StartTheme\"\n            android:windowSoftInputMode=\"stateVisible|adjustResize\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".activity.CaptchaActivity\"\n            android:excludeFromRecents=\"true\"\n            android:label=\"请输入验证码\"\n            android:launchMode=\"singleTask\"\n            android:taskAffinity=\"\" />\n\n        <receiver\n            android:name=\".receiver.BootReceiver\"\n            android:enabled=\"true\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.BOOT_COMPLETED\" />\n                <action android:name=\"android.intent.action.QUICKBOOT_POWERON\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n                <category android:name=\"android.intent.category.HOME\" />\n            </intent-filter>\n        </receiver>\n\n        <provider\n            android:name=\"androidx.core.content.FileProvider\"\n            android:authorities=\"io.github.mzdluo123.mirai.android.scriptprovider\"\n            android:exported=\"false\"\n            android:grantUriPermissions=\"true\">\n            <meta-data\n                android:name=\"android.support.FILE_PROVIDER_PATHS\"\n                android:resource=\"@xml/path_script\" />\n        </provider>\n    </application>\n\n</manifest>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/aidl/io/github/mzdluo123/mirai/android/IbotAidlInterface.aidl",
    "content": "// IbotAidlInterface.aidl\npackage io.github.mzdluo123.mirai.android;\n\n// Declare any non-default types here with import statements\ninterface IbotAidlInterface {\n    //Console\n    String[] getLog();\n    void clearLog();\n    void sendLog(String log);\n    void runCmd(String cmd);\n    byte[] getCaptcha();\n    String getUrl();\n    void submitVerificationResult(String result);\n    long getLogonId();\n\n    //Script\n    String[] getHostList();\n    boolean reloadScript(int index);\n    void setScriptConfig(String config);\n    void deleteScript(int index);\n    int getScriptSize();\n    void openScript(int index);\n    boolean createScript(String name,int type);\n    void enableScript(int index);\n    void disableScript(int index);\n    String getBotInfo();\n\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/AppSettings.kt",
    "content": "package io.github.mzdluo123.mirai.android\n\nimport splitties.experimental.ExperimentalSplittiesApi\nimport splitties.preferences.Preferences\nimport kotlin.reflect.KProperty\n\n@ExperimentalSplittiesApi\nobject AppSettings : Preferences(\"setting\") {\n\n    class IntPrefSaveAsStr(private val key: String, private val defaultValue: Int) {\n        operator fun getValue(thisRef: Preferences, prop: KProperty<*>): Int {\n            return prefs.getString(key, null)?.toInt() ?: defaultValue\n        }\n\n        operator fun setValue(thisRef: Preferences, prop: KProperty<*>, value: Int) {\n            editor.putString(key, value.toString()).commit()\n        }\n\n    }\n\n    var allowPushMsg by BoolPref(\"allow_push_msg_preference\", false)\n    var logBuffer by IntPrefSaveAsStr(\"log_buffer_preference\", 300)\n    var printToLogcat by BoolPref(\"print_to_logcat_preference\", false)\n    var refreshPerMinute by IntPrefSaveAsStr(\"status_refresh_count\", 15)\n    var startOnBoot by BoolPref(\"start_on_boot_preference\", false)\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/BotApplication.kt",
    "content": "package io.github.mzdluo123.mirai.android\n\nimport android.app.ActivityManager\nimport android.app.Application\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Build\nimport android.os.Process\nimport io.github.mzdluo123.mirai.android.NotificationFactory.initNotification\nimport io.github.mzdluo123.mirai.android.crash.MiraiAndroidReportSenderFactory\nimport io.github.mzdluo123.mirai.android.service.BotService\nimport io.ktor.client.HttpClient\nimport kotlinx.serialization.json.Json\nimport org.acra.ACRA\nimport org.acra.config.CoreConfigurationBuilder\nimport org.acra.config.ToastConfigurationBuilder\nimport org.acra.data.StringFormat\n\n@ExperimentalUnsignedTypes\nclass BotApplication : Application() {\n    companion object {\n\n        lateinit var context: BotApplication\n            private set\n\n        val httpClient = lazy { HttpClient() }\n        val json = lazy { Json { } }\n\n    }\n\n\n    override fun onCreate() {\n        super.onCreate()\n        context = this\n        val processName = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)\n            getProcessName()\n        else\n            myGetProcessName()\n\n        // 防止服务进程多次初始化\n        if (processName?.isEmpty() == false && processName == packageName) {\n            initNotification()\n        }\n    }\n\n\n    //崩溃事件注册\n    override fun attachBaseContext(base: Context?) {\n        super.attachBaseContext(base)\n        ACRA.init(this, CoreConfigurationBuilder(this).apply {\n            setBuildConfigClass(BuildConfig::class.java)\n                .setReportFormat(StringFormat.JSON)\n            setReportSenderFactoryClasses(MiraiAndroidReportSenderFactory::class.java)\n            getPluginConfigurationBuilder(ToastConfigurationBuilder::class.java)\n                .setResText(R.string.acra_toast_text)\n                .setEnabled(true)\n            //不知道为什么开启的时候总是显示这个，先暂时禁用\n        })\n    }\n\n    private fun myGetProcessName(): String? {\n        val pid = Process.myPid()\n        for (appProcess in (getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager).runningAppProcesses) {\n            if (appProcess.pid == pid) {\n                return appProcess.processName\n            }\n        }\n        return null\n    }\n\n    internal fun startBotService() {\n        val account = getSharedPreferences(\"account\", Context.MODE_PRIVATE)\n        this.startService(Intent(this, BotService::class.java).apply {\n            putExtra(\"action\", BotService.START_SERVICE)\n            putExtra(\"qq\", account.getLong(\"qq\", 0))\n            putExtra(\"pwd\", account.getString(\"pwd\", null))\n        })\n    }\n\n    internal fun stopBotService() {\n        startService(Intent(this, BotService::class.java).apply {\n            putExtra(\"action\", BotService.STOP_SERVICE)\n        })\n    }\n\n\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/IdleResources.kt",
    "content": "package io.github.mzdluo123.mirai.android\n\nimport androidx.test.espresso.idling.CountingIdlingResource\n\nobject IdleResources {\n\n    // Android单元测试所需要的东西\n\n    val loadingData by lazy { CountingIdlingResource(\"logUploadDialogIdleResources\") }\n\n    val botServiceLoading by lazy { CountingIdlingResource(\"botServiceLoading\") }\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/NotificationFactory.kt",
    "content": "package io.github.mzdluo123.mirai.android\n\nimport android.app.*\nimport android.content.Intent\nimport android.graphics.Bitmap\nimport android.os.Build\nimport androidx.core.app.NotificationCompat\nimport androidx.core.app.NotificationManagerCompat\nimport io.github.mzdluo123.mirai.android.activity.MainActivity\nimport io.github.mzdluo123.mirai.android.miraiconsole.AndroidLoginSolver\nimport io.github.mzdluo123.mirai.android.service.BotService\n\n@ExperimentalUnsignedTypes\nobject NotificationFactory {\n\n    const val SERVICE_NOTIFICATION = \"service\"\n    const val CAPTCHA_NOTIFICATION = \"captcha\"\n    const val OFFLINE_NOTIFICATION = \"offline\"\n\n    val context by lazy {\n        BotApplication.context\n    }\n\n    private val notifyIntent = Intent(context, MainActivity::class.java).apply {\n        flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK\n    }\n    private val launchMainActivity = PendingIntent.getActivity(\n        context, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT\n    )\n\n    internal fun initNotification() {\n        val notificationManager =\n            context.getSystemService(Application.NOTIFICATION_SERVICE) as NotificationManager\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            // 只在8.0系统上注册通知通道，防止程序崩溃\n            val statusChannel = NotificationChannel(\n                SERVICE_NOTIFICATION, \"状态通知\",\n                NotificationManager.IMPORTANCE_MIN\n            )\n\n            statusChannel.description = \"Mirai正在运行的通知\"\n\n            val captchaChannel = NotificationChannel(\n                CAPTCHA_NOTIFICATION, \"验证码通知\",\n                NotificationManager.IMPORTANCE_HIGH\n            )\n            captchaChannel.description = \"登录需要输入验证码时的通知\"\n\n            val offlineChannel = NotificationChannel(\n                OFFLINE_NOTIFICATION, \"离线通知\",\n                NotificationManager.IMPORTANCE_HIGH\n            )\n            offlineChannel.description = \"Mirai因各种原因离线的通知\"\n\n            if (BuildConfig.DEBUG) {\n                offlineChannel.importance = NotificationManager.IMPORTANCE_MIN\n                captchaChannel.importance = NotificationManager.IMPORTANCE_MIN\n            }\n\n            notificationManager.createNotificationChannel(statusChannel)\n            notificationManager.createNotificationChannel(captchaChannel)\n            notificationManager.createNotificationChannel(offlineChannel)\n        }\n    }\n\n    internal fun dismissAllNotification() {\n        NotificationManagerCompat.from(context).apply {\n            cancel(BotService.OFFLINE_NOTIFICATION_ID)\n            cancel(AndroidLoginSolver.CAPTCHA_NOTIFICATION_ID)\n\n        }\n    }\n\n\n    internal fun statusNotification(\n        content: String = \"请完成登录并将软件添加到系统后台运行白名单确保能及时处理消息\",\n        avatar: Bitmap? = null\n    ): Notification {\n\n        return NotificationCompat.Builder(\n            context,\n            SERVICE_NOTIFICATION\n        )\n            .setSmallIcon(R.drawable.ic_extension_black_24dp)//设置状态栏的通知图标\n            .setAutoCancel(false) //禁止用户点击删除按钮删除\n            .setOngoing(true) //禁止滑动删除\n            .setShowWhen(true) //右上角的时间显示\n            .setOnlyAlertOnce(true)\n            .setStyle(NotificationCompat.BigTextStyle())\n            .setContentIntent(launchMainActivity)\n            .setContentTitle(\"MiraiAndroid\") //创建通知\n            .setContentText(content)\n            .setLargeIcon(avatar)\n            .build()\n\n    }\n\n    internal fun offlineNotification(content: String, bigTheme: Boolean = false): Notification {\n\n        val builder = NotificationCompat.Builder(\n            context,\n            OFFLINE_NOTIFICATION\n        )\n            .setAutoCancel(false)\n            .setOngoing(false)\n            .setShowWhen(true)\n            .setSmallIcon(R.drawable.ic_info_black_24dp)\n            .setContentTitle(\"Mirai离线\")\n            .setContentText(content)\n\n        if (bigTheme) {\n            builder.setStyle(NotificationCompat.BigTextStyle())\n        }\n        return builder.build()\n\n    }\n\n    internal fun captchaNotification(activity: Class<*>): Notification {\n\n        val notifyIntent = Intent(context, activity).apply {\n            flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK\n        }\n        val notifyPendingIntent = PendingIntent.getActivity(\n            context, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT\n        )\n\n        return NotificationCompat.Builder(\n            context,\n            CAPTCHA_NOTIFICATION\n        )\n            .setContentIntent(notifyPendingIntent)\n            .setAutoCancel(false)\n            //禁止滑动删除\n            .setOngoing(false)\n            //右上角的时间显示\n            .setShowWhen(true)\n            .setSmallIcon(R.drawable.ic_info_black_24dp)\n            .setContentTitle(\"本次登录需要进行登录验证\")\n            .setContentText(\"点击这里开始验证\")\n            .build()\n    }\n\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/activity/CaptchaActivity.kt",
    "content": "package io.github.mzdluo123.mirai.android.activity\n\nimport android.app.NotificationManager\nimport android.content.Context\nimport android.content.Intent\nimport android.graphics.BitmapFactory\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.Observer\nimport androidx.lifecycle.lifecycleScope\nimport io.github.mzdluo123.mirai.android.R\nimport io.github.mzdluo123.mirai.android.miraiconsole.AndroidLoginSolver\nimport io.github.mzdluo123.mirai.android.service.BotService\nimport io.github.mzdluo123.mirai.android.service.ServiceConnector\nimport kotlinx.android.synthetic.main.activity_captcha.*\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\n\n@ExperimentalUnsignedTypes\nclass CaptchaActivity : AppCompatActivity() {\n    private lateinit var conn: ServiceConnector\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_captcha)\n        conn = ServiceConnector(this)\n        lifecycle.addObserver(conn)\n        conn.connectStatus.observe(this, Observer {\n            if (it) {\n                val data = conn.botService.captcha\n                lifecycleScope.launch(Dispatchers.Main) {\n                    val bitmap = BitmapFactory.decodeByteArray(data, 0, data.size)\n                    captcha_view.setImageBitmap(bitmap)\n                }\n            }\n        })\n    }\n\n\n    override fun onStart() {\n        super.onStart()\n        val intent = Intent(baseContext, BotService::class.java)\n        bindService(intent, conn, Context.BIND_AUTO_CREATE)\n        captchaConfirm_btn.setOnClickListener {\n            conn.botService.submitVerificationResult(captcha_input.text.toString())\n            // 删除通知\n            val notificationManager =\n                getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager\n            notificationManager.cancel(AndroidLoginSolver.CAPTCHA_NOTIFICATION_ID)\n            finish()\n        }\n    }\n\n\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/activity/MainActivity.kt",
    "content": "package io.github.mzdluo123.mirai.android.activity\n\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Bundle\nimport android.util.Log\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.lifecycleScope\nimport androidx.navigation.NavController\nimport androidx.navigation.findNavController\nimport androidx.navigation.ui.AppBarConfiguration\nimport androidx.navigation.ui.navigateUp\nimport androidx.navigation.ui.setupActionBarWithNavController\nimport androidx.navigation.ui.setupWithNavController\nimport io.github.mzdluo123.mirai.android.BotApplication\nimport io.github.mzdluo123.mirai.android.BuildConfig\nimport io.github.mzdluo123.mirai.android.NotificationFactory\nimport io.github.mzdluo123.mirai.android.R\nimport io.github.mzdluo123.mirai.android.utils.SafeDns\nimport io.github.mzdluo123.mirai.android.utils.shareText\nimport kotlinx.android.synthetic.main.activity_main.*\nimport kotlinx.android.synthetic.main.app_bar_main.*\nimport kotlinx.coroutines.*\nimport kotlinx.serialization.json.jsonObject\nimport kotlinx.serialization.json.jsonPrimitive\nimport okhttp3.OkHttpClient\nimport okhttp3.Request\nimport splitties.alertdialog.appcompat.alertDialog\nimport splitties.alertdialog.appcompat.cancelButton\nimport splitties.alertdialog.appcompat.message\nimport splitties.alertdialog.appcompat.okButton\nimport splitties.toast.toast\nimport java.io.File\nimport java.io.FileReader\n\n\n@ExperimentalUnsignedTypes\nclass MainActivity : AppCompatActivity(), CoroutineScope by MainScope() {\n    companion object {\n        const val TAG = \"MainActivity\"\n    }\n\n    private val appBarConfiguration: AppBarConfiguration by lazy {\n        AppBarConfiguration(\n            setOf(\n                R.id.nav_console,\n                R.id.nav_plugins,\n                R.id.nav_scripts,\n                R.id.nav_setting,\n                R.id.nav_about\n            ), drawer_layout\n        )\n    }\n    private val navController:NavController by lazy{\n        findNavController(R.id.nav_host_fragment)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setTheme(R.style.AppTheme_NoActionBar)\n        setContentView(R.layout.activity_main)\n        setSupportActionBar(toolbar)\n        setupActionBarWithNavController(navController, appBarConfiguration)\n        nav_view.setupWithNavController(navController)\n\n        BotApplication.context.startBotService()\n        btn_exit.setOnClickListener {\n            BotApplication.context.stopBotService()\n            NotificationFactory.dismissAllNotification()\n            finish()\n        }\n        btn_reboot.setOnClickListener {\n            NotificationFactory.dismissAllNotification()\n            launch {\n                BotApplication.context.stopBotService()\n                delay(200)\n                BotApplication.context.startBotService()\n                navController.popBackStack()\n                navController.navigate(R.id.nav_console)  // 重新启动console fragment，使其能够链接到服务\n                drawer_layout.closeDrawers()\n            }\n        }\n\n        checkCrash()\n        val exceptionHandler = CoroutineExceptionHandler { _, throwable ->\n            toast(\"检查更新失败\")\n            throwable.printStackTrace()\n            Log.e(TAG, throwable.message ?: return@CoroutineExceptionHandler)\n            finish()\n            BotApplication.context.stopBotService()\n        }\n\n        if (!BuildConfig.DEBUG) {\n            toast(\"跳过更新检查\")\n        } else {\n            lifecycleScope.launch(exceptionHandler) {\n                checkUpdate()\n            }\n        }\n        //throw Exception(\"测试异常\")\n    }\n\n\n    override fun onSupportNavigateUp(): Boolean =\n        navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()\n\n\n    private suspend fun checkUpdate() {\n        val rep = withContext(Dispatchers.IO) {\n            val client = OkHttpClient.Builder().dns(SafeDns()).build()\n            val res = client.newCall(\n                Request.Builder()\n                    .url(\"https://api.github.com/repos/mzdluo123/MiraiAndroid/releases/latest\")\n                    .build()\n            ).execute().body?.string()\n            client.dispatcher.executorService.shutdown();\n            client.connectionPool.evictAll();\n            client.cache?.close()\n            return@withContext res\n        }\n\n        val json =\n            BotApplication.json.value.parseToJsonElement(rep ?: throw IllegalStateException(\"返回为空\"))\n        if (json.jsonObject.containsKey(\"url\")) {\n            val body = json.jsonObject[\"body\"]?.jsonPrimitive?.content ?: \"暂无更新记录\"\n            val htmlUrl = json.jsonObject[\"html_url\"]!!.jsonPrimitive.content\n            val version = json.jsonObject[\"tag_name\"]!!.jsonPrimitive.content\n            if (version == BuildConfig.VERSION_NAME) {\n                return\n            }\n            withContext(Dispatchers.Main) {\n                alertDialog(title = \"发现新版本 $version\", message = body) {\n                    setPositiveButton(\"立即更新\") { _, _ ->\n                        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(htmlUrl)))\n                    }\n                }.show()\n            }\n        } else {\n            throw IllegalStateException(\"检查更新失败\")\n        }\n    }\n\n    private fun checkCrash() {\n        val crashDataFile = File(getExternalFilesDir(\"crash\"), \"crashdata\")\n        if (!crashDataFile.exists()) return\n        var crashData: String\n        FileReader(crashDataFile).also {\n            crashData = it.readText()\n        }.close()\n        alertDialog {\n            message = \"检测到你上一次异常退出，是否上传崩溃日志？\"\n            okButton {\n                shareText(crashData, lifecycleScope)\n            }\n            cancelButton { }\n        }.show()\n        crashDataFile.renameTo(\n            File(\n                getExternalFilesDir(\"crash\"),\n                \"crashdata${System.currentTimeMillis()}\"\n            )\n        )\n    }\n\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/activity/PluginImportActivity.kt",
    "content": "package io.github.mzdluo123.mirai.android.activity\n\nimport android.net.Uri\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.appcompat.app.AlertDialog\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.databinding.DataBindingUtil\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.lifecycle.lifecycleScope\nimport io.github.mzdluo123.mirai.android.R\nimport io.github.mzdluo123.mirai.android.databinding.ActivityPluginImportBinding\nimport io.github.mzdluo123.mirai.android.ui.plugin.PluginViewModel\nimport io.github.mzdluo123.mirai.android.utils.askFileName\nimport io.github.mzdluo123.mirai.android.utils.copyToFileDir\nimport kotlinx.android.synthetic.main.activity_plugin_import.*\nimport kotlinx.coroutines.CoroutineExceptionHandler\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport net.lingala.zip4j.ZipFile\nimport net.mamoe.mirai.console.plugins.PluginDescription\nimport org.yaml.snakeyaml.Yaml\nimport java.io.File\nimport java.io.FileReader\n\n\n@ExperimentalUnsignedTypes\nclass PluginImportActivity : AppCompatActivity() {\n\n    private lateinit var uri: Uri\n\n    private lateinit var pluginViewModel: PluginViewModel\n    private lateinit var dialog: AlertDialog\n    private lateinit var activityPluginImportBinding: ActivityPluginImportBinding\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_plugin_import)\n//        uri = Uri.parse(intent.getStringExtra(\"uri\"))\n\n        val errorHandel = CoroutineExceptionHandler { _, _ ->\n            Toast.makeText(this, \"无法打开这个文件，请检查这是不是一个合法的插件jar文件\", Toast.LENGTH_SHORT).show()\n            finish()\n\n        }\n        uri = intent.data ?: return\n        pluginViewModel = ViewModelProvider(this).get(PluginViewModel::class.java)\n        activityPluginImportBinding =\n            DataBindingUtil.setContentView(this, R.layout.activity_plugin_import)\n        lifecycleScope.launch(errorHandel) { loadPluginData() }\n        activityPluginImportBinding.importBtn.setOnClickListener {\n            startImport()\n        }\n\n    }\n\n    private fun createDialog() {\n        dialog = AlertDialog.Builder(this)\n            .setTitle(\"正在编译\")\n            .setMessage(\"这可能需要一些时间，请不要最小化\")\n            .setCancelable(false)\n            .create()\n    }\n\n    private fun startImport() {\n        createDialog()\n        val exceptionHandler = CoroutineExceptionHandler { _, throwable ->\n            lifecycleScope.launch(Dispatchers.Main) {\n                dialog.dismiss()\n                Toast.makeText(\n                    this@PluginImportActivity,\n                    \"无法编译插件 \\n${throwable}\",\n                    Toast.LENGTH_LONG\n                ).show()\n            }\n        }\n\n\n\n        dialog.show()\n        when (import_radioGroup.checkedRadioButtonId) {\n            R.id.compile_radioButton -> {\n                lifecycleScope.launch(exceptionHandler) {\n                    val name = withContext(Dispatchers.Main) {\n                        askFileName()\n                    } ?: return@launch\n                    withContext(Dispatchers.IO) {\n                        copyToFileDir(\n                            uri,\n                            name,\n                            this@PluginImportActivity.getExternalFilesDir(null)!!.absolutePath\n                        )\n                    }\n                    pluginViewModel.compilePlugin(\n                        File(baseContext.getExternalFilesDir(null), name),\n                        desugaring_checkBox.isChecked\n                    )\n                    withContext(Dispatchers.IO) {\n                        File(this@PluginImportActivity.getExternalFilesDir(null), name).delete()\n                    }\n                    dialog.dismiss()\n                    Toast.makeText(this@PluginImportActivity, \"安装成功,重启后即可加载\", Toast.LENGTH_SHORT)\n                        .show()\n                    finish()\n                }\n            }\n            R.id.copy_radioButton -> {\n                lifecycleScope.launch(exceptionHandler) {\n                    val name = withContext(Dispatchers.Main) {\n                        askFileName()\n                    } ?: return@launch\n                    withContext(Dispatchers.IO) {\n                        copyToFileDir(\n                            uri,\n                            name,\n                            this@PluginImportActivity.getExternalFilesDir(\"plugins\")!!.absolutePath\n                        )\n                    }\n                    dialog.dismiss()\n                    Toast.makeText(this@PluginImportActivity, \"安装成功,重启后即可加载\", Toast.LENGTH_SHORT)\n                        .show()\n                    finish()\n                }\n            }\n        }\n\n    }\n\n\n    private suspend fun loadPluginData() = withContext(Dispatchers.IO) {\n        val realFileName = \"tmpfile.jar\"\n        baseContext.copyToFileDir(uri, realFileName, cacheDir.absolutePath)\n        val cacheFile = File(cacheDir.absolutePath, realFileName)\n        val zipFile = ZipFile(cacheFile)\n        zipFile.extractFile(\"plugin.yml\", cacheDir.absolutePath)\n\n        val yml = Yaml()\n        lateinit var plugInfo: PluginDescription\n        FileReader(File(cacheDir.absolutePath, \"plugin.yml\")).use {\n            with(yml.load<LinkedHashMap<String, Any>>(it)) {\n                plugInfo = PluginDescription(\n                    file = File(cacheDir.absolutePath, \"tmpfile.jar\"),\n                    name = this.get(\"name\") as String,\n                    author = kotlin.runCatching {\n                        this.get(\"author\") as String\n                    }.getOrElse {\n                        \"unknown\"\n                    },\n                    basePath = kotlin.runCatching {\n                        this.get(\"path\") as String\n                    }.getOrElse {\n                        this.get(\"main\") as String\n                    },\n                    version = kotlin.runCatching {\n                        this.get(\"version\") as String\n                    }.getOrElse {\n                        \"unknown\"\n                    },\n                    info = kotlin.runCatching {\n                        this.get(\"info\") as String\n                    }.getOrElse {\n                        \"unknown\"\n                    },\n                    depends = kotlin.runCatching {\n                        this.get(\"depends\") as List<String>\n                    }.getOrElse {\n                        listOf()\n                    }\n                )\n\n            }\n            withContext(Dispatchers.Main) {\n                activityPluginImportBinding.pluginData = plugInfo\n            }\n\n        }\n\n\n    }\n}\n\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/activity/UnsafeLoginActivity.kt",
    "content": "package io.github.mzdluo123.mirai.android.activity\n\nimport android.annotation.SuppressLint\nimport android.app.NotificationManager\nimport android.content.Context\nimport android.os.Bundle\nimport android.view.KeyEvent\nimport android.webkit.ConsoleMessage\nimport android.webkit.WebChromeClient\nimport android.webkit.WebViewClient\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.Observer\nimport androidx.lifecycle.lifecycleScope\nimport io.github.mzdluo123.mirai.android.R\nimport io.github.mzdluo123.mirai.android.miraiconsole.AndroidLoginSolver\nimport io.github.mzdluo123.mirai.android.service.ServiceConnector\nimport kotlinx.android.synthetic.main.activity_unsafe_login.*\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\n\n@ExperimentalUnsignedTypes\nclass UnsafeLoginActivity : AppCompatActivity() {\n\n    private lateinit var conn: ServiceConnector\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        conn = ServiceConnector(this)\n        lifecycle.addObserver(conn)\n        setContentView(R.layout.activity_unsafe_login)\n        initWebView()\n        refresh_unsafe_web.setOnRefreshListener {\n            unsafe_login_web.reload()\n            lifecycleScope.launch {\n                delay(1000)\n                refresh_unsafe_web.isRefreshing = false\n            }\n        }\n        //  Toast.makeText(this, \"请在完成验证后点击右上角继续登录\", Toast.LENGTH_LONG).show()\n    }\n\n\n    @SuppressLint(\"SetJavaScriptEnabled\")\n    private fun initWebView() {\n        unsafe_login_web.webViewClient = object : WebViewClient() {\n//            override fun shouldInterceptRequest(\n//                view: WebView?,\n//                request: WebResourceRequest?\n//            ): WebResourceResponse? {\n//                if (request != null) {\n//                    if (\"https://report.qqweb.qq.com/report/compass/dc00898\" in request.url.toString()) {\n//                        authFinish()\n//                    }\n//                }\n//                return super.shouldInterceptRequest(view, request)\n//            }\n\n\n        }\n        unsafe_login_web.webChromeClient = object : WebChromeClient() {\n\n            override fun onConsoleMessage(consoleMessage: ConsoleMessage?): Boolean {\n                // 按下回到qq按钮之后会打印这句话，于是就用这个解决了。。。。\n                if (consoleMessage?.message()?.startsWith(\"手Q扫码验证\") == true) {\n                    authFinish()\n                }\n                return super.onConsoleMessage(consoleMessage)\n            }\n        }\n        unsafe_login_web.settings.apply {\n            javaScriptEnabled = true\n            domStorageEnabled = true\n        }\n        conn.connectStatus.observe(this, Observer {\n            if (it) {\n                unsafe_login_web.loadUrl(conn.botService.url)\n            }\n        })\n    }\n\n    private fun authFinish() {\n        conn.botService.submitVerificationResult(\"\")\n        val notificationManager =\n            getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager\n        notificationManager.cancel(AndroidLoginSolver.CAPTCHA_NOTIFICATION_ID)\n        finish()\n    }\n\n\n    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {\n        if (keyCode == KeyEvent.KEYCODE_BACK) {\n            if (unsafe_login_web.canGoBack()) {\n                unsafe_login_web.goBack()\n                return true\n            }\n        }\n        return false\n    }\n\n//    override fun onCreateOptionsMenu(menu: Menu?): Boolean {\n//        menuInflater.inflate(R.menu.unsafe_menu, menu)\n//        return true\n//    }\n//\n//    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n//        authFinish()\n//        return true\n//    }\n\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/crash/MiraiAndroidReportSender.kt",
    "content": "package io.github.mzdluo123.mirai.android.crash\n\nimport android.content.Context\nimport org.acra.data.CrashReportData\nimport org.acra.sender.ReportSender\nimport org.acra.sender.ReportSenderException\nimport java.io.File\nimport java.io.FileWriter\n\n//崩溃日志处理\nclass MiraiAndroidReportSender() : ReportSender {\n    @Throws(ReportSenderException::class)\n    override fun send(\n        context: Context,\n        report: CrashReportData\n    ) {\n        val outFile = File(context.getExternalFilesDir(\"crash\"), \"crashdata\")\n        FileWriter(outFile).also {\n            it.write(report.toJSON())\n        }.close()\n    }\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/crash/MiraiAndroidReportSenderFactory.kt",
    "content": "package io.github.mzdluo123.mirai.android.crash\n\nimport android.content.Context\nimport org.acra.config.CoreConfiguration\nimport org.acra.sender.ReportSender\nimport org.acra.sender.ReportSenderFactory\n\nclass MiraiAndroidReportSenderFactory : ReportSenderFactory {\n    override fun create(\n        context: Context,\n        config: CoreConfiguration\n    ): ReportSender = MiraiAndroidReportSender()\n\n    override fun enabled(config: CoreConfiguration): Boolean = true\n\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/miraiconsole/AndroidLoginSolver.kt",
    "content": "package io.github.mzdluo123.mirai.android.miraiconsole\n\nimport android.content.Context\nimport androidx.core.app.NotificationManagerCompat\nimport io.github.mzdluo123.mirai.android.NotificationFactory\nimport io.github.mzdluo123.mirai.android.activity.CaptchaActivity\nimport io.github.mzdluo123.mirai.android.activity.UnsafeLoginActivity\nimport kotlinx.coroutines.CompletableDeferred\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.utils.LoginSolver\n\n\n@ExperimentalUnsignedTypes\nclass AndroidLoginSolver(private val context: Context) : LoginSolver() {\n    lateinit var verificationResult: CompletableDeferred<String>\n    lateinit var captchaData: ByteArray\n    lateinit var url: String\n\n    companion object {\n        const val CAPTCHA_NOTIFICATION_ID = 2\n    }\n\n    override suspend fun onSolvePicCaptcha(bot: Bot, data: ByteArray): String? {\n        MiraiConsole.frontEnd.pushLog(0L,\"本次登录需要输入验证码，请在通知栏点击通知来输入\")\n        verificationResult = CompletableDeferred()\n        captchaData = data\n        NotificationManagerCompat.from(context).apply {\n            notify(\n                CAPTCHA_NOTIFICATION_ID,\n                NotificationFactory.captchaNotification(CaptchaActivity::class.java)\n            )\n        }\n        return verificationResult.await()\n    }\n\n    override suspend fun onSolveSliderCaptcha(bot: Bot, url: String): String? {\n        verificationResult = CompletableDeferred()\n        this.url = url\n        sendVerifyNotification()\n        return verificationResult.await()\n    }\n\n    override suspend fun onSolveUnsafeDeviceLoginVerify(bot: Bot, url: String): String? {\n        verificationResult = CompletableDeferred()\n        this.url = url\n        sendVerifyNotification()\n        return verificationResult.await()\n    }\n\n    private fun sendVerifyNotification() {\n        MiraiConsole.frontEnd.pushLog(0L,\"本次登录需要进行验证，请在通知栏点击通知进行验证\")\n\n        NotificationManagerCompat.from(context).apply {\n            notify(\n                CAPTCHA_NOTIFICATION_ID,\n                NotificationFactory.captchaNotification(UnsafeLoginActivity::class.java)\n            )\n        }\n    }\n\n}\n\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/miraiconsole/AndroidMiraiConsole.kt",
    "content": "package io.github.mzdluo123.mirai.android.miraiconsole\n\nimport android.content.Context\nimport android.graphics.Bitmap\nimport android.graphics.BitmapFactory\nimport android.util.Log\nimport androidx.core.app.NotificationManagerCompat\nimport io.github.mzdluo123.mirai.android.AppSettings\nimport io.github.mzdluo123.mirai.android.BotApplication\nimport io.github.mzdluo123.mirai.android.NotificationFactory\nimport io.github.mzdluo123.mirai.android.script.ScriptManager\nimport io.github.mzdluo123.mirai.android.service.BotService\nimport io.github.mzdluo123.mirai.android.utils.LoopQueue\nimport io.github.mzdluo123.mirai.android.utils.MiraiAndroidStatus\nimport io.ktor.client.HttpClient\nimport io.ktor.client.request.get\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.console.utils.MiraiConsoleUI\nimport net.mamoe.mirai.event.Listener\nimport net.mamoe.mirai.event.events.BotOfflineEvent\nimport net.mamoe.mirai.event.events.BotReloginEvent\nimport net.mamoe.mirai.event.subscribeAlways\nimport net.mamoe.mirai.event.subscribeMessages\nimport net.mamoe.mirai.utils.LoginSolver\nimport net.mamoe.mirai.utils.SimpleLogger\nimport splitties.experimental.ExperimentalSplittiesApi\n\n@ExperimentalSplittiesApi\n@ExperimentalUnsignedTypes\nclass AndroidMiraiConsole(context: Context) : MiraiConsoleUI {\n    private val logBuffer = AppSettings.logBuffer\n    private val printToLogcat = AppSettings.printToLogcat\n    val logStorage = LoopQueue<String>(logBuffer)\n    val loginSolver =\n        AndroidLoginSolver(context)\n\n    // 使用一个[60s/refreshPerMinute]的数组存放每4秒消息条数\n    // 读取时增加最新一分钟，减去最老一分钟\n    private val refreshPerMinute = AppSettings.refreshPerMinute\n    private val msgSpeeds = IntArray(refreshPerMinute)\n    private var refreshCurrentPos = 0\n\n    private var sendOfflineMsgJob: Job? = null\n\n    companion object {\n        const val TAG = \"MA\"\n    }\n\n    override fun createLoginSolver(): LoginSolver = loginSolver\n\n    override fun prePushBot(identity: Long) = Unit\n\n    override fun pushBot(bot: Bot) {\n        bot.pushToScriptManager(ScriptManager.instance)\n        bot.subscribeBotLifeEvent()\n        bot.startRefreshNotificationJob()\n    }\n\n    override fun pushBotAdminStatus(identity: Long, admins: List<Long>) = Unit\n\n    override fun pushLog(identity: Long, message: String) {\n        logStorage.add(message)\n        if (printToLogcat) {\n            Log.i(TAG, message)\n        }\n    }\n\n    override fun pushLog(\n        priority: SimpleLogger.LogPriority,\n        identityStr: String,\n        identity: Long,\n        message: String\n    ) {\n        logStorage.add(\"[${priority.name}] $message\")\n        if (printToLogcat) {\n            Log.i(TAG, \"[${priority.name}] $message\")\n        }\n\n    }\n\n    override fun pushVersion(consoleVersion: String, consoleBuild: String, coreVersion: String) {\n        logStorage.add(MiraiAndroidStatus.recentStatus().format())\n    }\n\n    override suspend fun requestInput(hint: String): String = \"\"\n\n    private fun Bot.startRefreshNotificationJob() {\n        subscribeMessages { always { msgSpeeds[refreshCurrentPos] += 1 } }\n        launch {\n            val avatar = downloadAvatar()  // 获取通知展示用的头像\n            var msgSpeed = 0\n            while (isActive) {\n                /*\n                * 总速度+=最新速度 [0] [1] ... [14]\n                * 总速度-=最老速度 [1] [2] ... [0]\n                */\n                msgSpeed += msgSpeeds[refreshCurrentPos]\n                if (refreshCurrentPos != refreshPerMinute - 1) {\n                    refreshCurrentPos += 1\n                } else {\n                    refreshCurrentPos = 0\n                }\n                msgSpeed -= msgSpeeds[refreshCurrentPos]\n                msgSpeeds[refreshCurrentPos] = 0\n                NotificationManagerCompat.from(BotApplication.context).apply {\n                    notify(\n                        BotService.NOTIFICATION_ID,\n                        NotificationFactory.statusNotification(\"消息速度 ${msgSpeed}/min\", avatar)\n                    )\n                }\n                delay(60L / refreshPerMinute * 1000)\n            }\n        }\n    }\n\n    private suspend fun Bot.downloadAvatar(): Bitmap =\n        try {\n            pushLog(0L, \"[INFO] 正在加载头像....\")\n            HttpClient().get<ByteArray>(selfQQ.avatarUrl).let { avatarData ->\n                BitmapFactory.decodeByteArray(avatarData, 0, avatarData.size)\n            }\n        } catch (e: Exception) {\n            delay(1000)\n            downloadAvatar()\n        }\n\n    private fun Bot.subscribeBotLifeEvent() {\n        subscribeAlways<BotOfflineEvent>(priority = Listener.EventPriority.HIGHEST) {\n            if (this is BotOfflineEvent.Force) {\n                NotificationManagerCompat.from(BotApplication.context).apply {\n                    notify(\n                        BotService.OFFLINE_NOTIFICATION_ID,\n                        NotificationFactory.offlineNotification(message, true)\n                    )\n                }\n                return@subscribeAlways\n            }\n            if (this is BotOfflineEvent.Dropped) {\n                sendOfflineMsgJob = GlobalScope.launch {\n                    delay(2000)\n                    if (!isActive) {\n                        return@launch\n                    }\n                    NotificationManagerCompat.from(BotApplication.context).apply {\n                        notify(\n                            BotService.OFFLINE_NOTIFICATION_ID,\n                            NotificationFactory.offlineNotification(\"请检查网络设置\")\n                        )\n                    }\n                }\n            }\n\n            pushLog(0L, \"[INFO] 发送离线通知....\")\n        }\n        subscribeAlways<BotReloginEvent>(priority = Listener.EventPriority.HIGHEST) {\n            pushLog(0L, \"[INFO] 发送上线通知....\")\n            if (sendOfflineMsgJob != null && sendOfflineMsgJob!!.isActive) {\n                sendOfflineMsgJob!!.cancel()\n            }\n            NotificationManagerCompat.from(BotApplication.context)\n                .cancel(BotService.OFFLINE_NOTIFICATION_ID)\n        }\n    }\n\n    private fun Bot.pushToScriptManager(manager: ScriptManager) {\n        launch { manager.addBot(this@pushToScriptManager) }\n    }\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/receiver/BootReceiver.kt",
    "content": "package io.github.mzdluo123.mirai.android.receiver\n\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Build\nimport io.github.mzdluo123.mirai.android.AppSettings\nimport io.github.mzdluo123.mirai.android.service.BotService\nimport splitties.experimental.ExperimentalSplittiesApi\n\n@ExperimentalSplittiesApi\nclass BootReceiver : BroadcastReceiver() {\n    //    companion object{\n//        const val TAG = \"BootReceiver\"\n//    }\n    private val ACTION = \"android.intent.action.BOOT_COMPLETED\"\n    override fun onReceive(context: Context, intent: Intent) {\n//        Log.e(TAG,\"收到广播\")\n        if (AppSettings.startOnBoot) {\n            return\n        }\n\n        if (intent.action == ACTION) {\n            val startIntent = Intent(context, BotService::class.java)\n            startIntent.putExtra(\n                \"action\",\n                BotService.START_SERVICE\n            )\n            val account =\n                context.getSharedPreferences(\"account\", Context.MODE_PRIVATE)\n            val qq = account.getLong(\"qq\", 0)\n            val pwd = account.getString(\"pwd\", null)\n            startIntent.putExtra(\"qq\", qq)\n            startIntent.putExtra(\"pwd\", pwd)\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n                context.startForegroundService(startIntent)\n            } else {\n                context.startService(startIntent)\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/receiver/PushMsgReceiver.kt",
    "content": "package io.github.mzdluo123.mirai.android.receiver\n\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\nimport android.util.Log\nimport io.github.mzdluo123.mirai.android.service.BotService\n\nclass PushMsgReceiver(private val botService: BotService) : BroadcastReceiver() {\n    companion object {\n        val TAG = PushMsgReceiver::class.java.name\n    }\n\n    override fun onReceive(context: Context, intent: Intent) {\n        try {\n            val data = intent.data ?: return\n            if (data.scheme != \"ma\") {\n                return\n            }\n            val id = data.getQueryParameter(\"id\")?.toLong() ?: return\n            val msg = data.getQueryParameter(\"msg\") ?: return\n            when (data.host) {\n                \"sendGroupMsg\" -> {\n                    val at = data.getQueryParameter(\"at\")?.toLong()\n                    if (at != null) {\n                        botService.sendGroupMsgWithAT(id, msg, at)\n                        return\n                    }\n                    botService.sendGroupMsg(id, msg)\n                }\n                \"sendFriendMsg\" -> botService.sendFriendMsg(id, msg)\n            }\n\n        } catch (e: Exception) {\n            e.printStackTrace()\n            Log.e(TAG, e.toString())\n        }\n\n    }\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/script/JavaScriptHost.kt",
    "content": "package io.github.mzdluo123.mirai.android.script\n\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.mirai.Bot\nimport org.itxtech.miraijs.coreadapter.IPluginLogger\nimport org.itxtech.miraijs.coreadapter.JsRuntime\nimport java.io.File\n\nclass JavaScriptHost(scriptFile: File, configFile: File) : ScriptHost(scriptFile, configFile) {\n\n    var JsLogger = object : IPluginLogger {\n        override fun debug(str: String) {\n            logger(str)\n        }\n\n        override fun error(str: String, e: Any?) {\n            logger(str)\n        }\n\n        override fun info(str: String) {\n            logger(str)\n        }\n\n        override fun verbose(str: String) {\n            logger(str)\n        }\n\n        override fun warning(str: String) {\n            logger(str)\n        }\n\n    }\n    var runtime = JsRuntime(scriptFile, JsLogger)\n\n    override fun onFetchBot(bot: Bot) {\n        if (!config.enable) return\n        runtime.attachBot(bot)\n    }\n\n    override fun onCreate(): ScriptInfo {\n        //只获取信息，enable时再创建运行时\n        runBlocking {\n            runtime.load().join()\n        }\n        val runtimeInfo = runtime.pluginInfo\n        return ScriptInfo(\n            runtimeInfo.name,\n            runtimeInfo.author,\n            runtimeInfo.version,\n            runtimeInfo.website,\n            scriptFile.length()\n        )\n    }\n\n    override fun onDisable() {\n        runtime.disable()\n    }\n\n    override fun onEnable() {\n        runtime.enable()\n    }\n\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/script/LuaScriptHost.kt",
    "content": "package io.github.mzdluo123.mirai.android.script\n\nimport android.util.Log\nimport com.ooooonly.luaMirai.lua.MiraiGlobals\nimport kotlinx.coroutines.launch\nimport net.mamoe.mirai.Bot\nimport org.luaj.vm2.LuaTable\nimport org.luaj.vm2.LuaValue\nimport java.io.File\n\n\nclass LuaScriptHost(scriptFile: File, configFile: File) : ScriptHost(scriptFile, configFile) {\n    private lateinit var globals : MiraiGlobals\n\n    override fun onCreate(): ScriptInfo {\n        globals = MiraiGlobals(logger)\n        globals.loadfile(scriptFile.absolutePath).call()\n        var name = scriptFile.name.split(\".\").first()\n        var author = \"MiraiAndroid\"\n        var version = \"0.1\"\n        var description = \"MiraiAndroid Lua脚本\"\n        globals.get(\"Info\").takeIf { it is LuaTable }?.let {\n            var table = it as LuaTable\n            name = table.get(\"name\").takeUnless { it == LuaValue.NIL }?.toString()?:name\n            author = table.get(\"author\").takeUnless { it == LuaValue.NIL }?.toString() ?: author\n            version = table.get(\"version\").takeUnless { it == LuaValue.NIL }?.toString() ?: version\n            description = table.get(\"description\").takeUnless { it == LuaValue.NIL }?.toString()\n                ?: description\n        }\n        return ScriptInfo(name, author, version, description, scriptFile.length())\n    }\n\n    override fun onFetchBot(bot: Bot) {\n        Log.i(\"fetchBot\", bot.id.toString())\n        if (!config.enable) return\n        bot.launch {\n            globals.onLoad(bot)\n        }\n    }\n\n    override fun onDisable() {\n        globals.onFinish()\n        globals.unSubsribeAll()\n        Log.i(\"uninstall\", info.name)\n    }\n\n    override fun onEnable() {\n\n    }\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/script/ScriptHost.kt",
    "content": "package io.github.mzdluo123.mirai.android.script\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.Json\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.console.MiraiConsole\nimport java.io.File\nimport java.io.FileReader\nimport java.io.FileWriter\n\nabstract class ScriptHost(val scriptFile: File, val configFile: File) {\n    @Serializable\n    data class ScriptConfig(\n        var type: Int,\n        var enable: Boolean = false,\n        var data: String = \"\"\n    )\n\n    @Serializable\n    data class ScriptInfo(\n        var name: String = \"\",\n        var author: String = \"\",\n        var version: String = \"\",\n        var description: String = \"\",\n        var fileLength: Long,\n        var scriptType: Int = ScriptHostFactory.UNKNOWN,\n        var enable: Boolean = true\n    )\n\n    protected val logger: (String) -> Unit =\n        { MiraiConsole.frontEnd.pushLog(0L, \"[${ScriptHostFactory.NAMES[config.type]}] $it\") }\n    lateinit var config: ScriptConfig\n    lateinit var info: ScriptInfo\n\n\n    fun load() {\n        info = onCreate()\n        if (configFile.exists()) {\n            val reader = FileReader(configFile)\n            val text = reader.readText()\n            reader.close()\n            config = Json.decodeFromString(ScriptConfig.serializer(), text)\n        }\n        info.scriptType = config.type\n        info.enable = config.enable\n        saveConfig()\n    }\n\n\n    fun getInfoString(): String {\n        return Json.encodeToString(ScriptInfo.serializer(), info)\n    }\n    fun disable() = onDisable()\n    fun enable() = onEnable()\n    fun enableIfPossible() {\n        if (config.enable) enable()\n    }\n\n    fun installBot(bot: Bot) = onFetchBot(bot)\n\n    protected abstract fun onFetchBot(bot: Bot)//传入bot事件\n    protected abstract fun onCreate(): ScriptInfo //载入事件，用于初始化环境，并读取脚本内信息到ScriptConfig\n    protected abstract fun onDisable() //脚本被禁用事件\n    protected abstract fun onEnable() //脚本被启用事件\n\n\n    fun saveConfig() {\n        val data = Json.encodeToString(ScriptConfig.serializer(), config)\n        if (!configFile.exists()) configFile.createNewFile()\n        val writer = FileWriter(configFile)\n        writer.write(data)\n        writer.flush()\n        writer.close()\n    }\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/script/ScriptHostFactory.kt",
    "content": "package io.github.mzdluo123.mirai.android.script\n\nimport kotlinx.serialization.json.Json\nimport java.io.File\nimport java.io.FileReader\n\nobject ScriptHostFactory {\n    const val UNKNOWN = 0\n    const val LUA = 1\n    const val JAVASCRIPT = 2\n    const val PYTHON = 3\n    const val KOTLINSCRIPT = 4\n    val NAMES = arrayOf(\"Unknown\", \"Lua\", \"JavaScript\", \"Python\", \"KotlinScript\")\n    fun getTypeFromSuffix(suffix: String) = when (suffix) {\n        \"lua\" -> LUA\n        \"js\" -> JAVASCRIPT\n        \"py\" -> PYTHON\n        \"kts\" -> KOTLINSCRIPT\n        else -> UNKNOWN\n    }\n\n    fun getScriptHost(scriptFile: File, configFile: File, type: Int): ScriptHost? {\n        var trueType: Int = type\n        if (trueType == UNKNOWN) {\n            if (configFile.exists()) {\n                FileReader(configFile).apply {\n                    trueType =\n                        Json.decodeFromString(ScriptHost.ScriptConfig.serializer(), readText()).type\n                }.close()\n                if (trueType == UNKNOWN) trueType = getTypeFromSuffix(scriptFile.getSuffix())\n            } else {\n                trueType = getTypeFromSuffix(scriptFile.getSuffix())\n            }\n        }\n        return when (trueType) {\n            LUA -> LuaScriptHost(scriptFile, configFile).also {\n                it.config = ScriptHost.ScriptConfig(trueType, false, \"\")\n            }\n            JAVASCRIPT -> JavaScriptHost(scriptFile, configFile).also {\n                it.config = ScriptHost.ScriptConfig(trueType, false, \"\")\n            }\n            else -> null\n        }\n    }\n\n    private fun File.getSuffix() = name.split(\".\").last()\n\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/script/ScriptManager.kt",
    "content": "package io.github.mzdluo123.mirai.android.script\n\nimport android.content.Context\nimport android.net.Uri\nimport android.util.Log\nimport io.github.mzdluo123.mirai.android.BotApplication\nimport io.github.mzdluo123.mirai.android.utils.copyToFileDir\nimport kotlinx.serialization.json.Json\nimport net.mamoe.mirai.Bot\nimport java.io.File\n\nclass ScriptManager(\n    private var context: Context,\n    private var scriptDir: File,\n    private var configDir: File\n) {\n    val hosts = mutableListOf<ScriptHost>()\n    private val bots = mutableListOf<Bot>()\n    val botsSize: Int\n        get() = bots.size\n\n    @ExperimentalUnsignedTypes\n    companion object {\n        val instance: ScriptManager by lazy {\n            val context: Context = BotApplication.context\n            val scriptDir = context.getExternalFilesDir(\"scripts\")\n            val configDir = context.getExternalFilesDir(\"data\")\n            ScriptManager(context, scriptDir!!, configDir!!)\n        }\n\n        fun unPackHostInfos(infoStrings: Array<String>): List<ScriptHost.ScriptInfo> =\n            List(infoStrings.size) {\n                Json.decodeFromString(ScriptHost.ScriptInfo.serializer(), infoStrings[it])\n            }\n\n        fun copyFileToScriptDir(context: Context, uri: Uri, name: String): File =\n            context.copyToFileDir(\n                uri,\n                name,\n                context.getExternalFilesDir(\"scripts\")!!.absolutePath\n            )\n\n    }\n\n    init {\n        if (!scriptDir.exists()) scriptDir.mkdirs()\n        if (!configDir.exists()) configDir.mkdirs()\n        loadScripts()\n    }\n\n    fun addBot(bot: Bot) {\n        bots.add(bot)\n        hosts.forEach {\n            it.installBot(bot)\n        }\n    }\n\n    fun editConfig(index: Int, editor: ScriptHost.ScriptConfig.() -> Unit) {\n        hosts[index].config.editor()\n    }\n\n    fun delete(index: Int) {\n        hosts[index].disable()\n        hosts[index].scriptFile.getConfigFile().delete()\n        hosts[index].scriptFile.delete()\n        hosts.removeAt(index)\n    }\n\n    private fun loadScripts() {\n        scriptDir.listFiles()?.forEach { scriptFile ->\n            //scriptFile.delete()\n            //scriptFile.getConfigFile().delete()\n            if (scriptFile.isFile)\n                hosts.addHost(scriptFile, scriptFile.getConfigFile(), ScriptHostFactory.UNKNOWN)\n        }\n    }\n\n//    fun createScriptFromUri(fromUri: Uri, type: Int): Boolean {\n//        fromUri.getName(context).let { name ->\n//            val scriptFile = context.copyToFileDir(\n//                fromUri,\n//                name!!,\n//                scriptDir.absolutePath\n//            )\n//\n//            hosts.addHost(scriptFile, scriptFile.getConfigFile(), type)?.let { host ->\n//                bots.forEach { bot -> host.installBot(bot) }\n//                return true\n//            } ?: return false\n//        }\n//    }\n\n    fun createScriptFromFile(scriptFile: File, type: Int): Boolean {\n        hosts.addHost(scriptFile, scriptFile.getConfigFile(), type)?.let { host ->\n            bots.forEach { bot -> host.installBot(bot) }\n            return true\n        } ?: return false\n    }\n\n    fun enable(index: Int) {\n        Log.i(\"enable\", index.toString())\n        if (hosts[index].config.enable) return\n        hosts[index].enable()\n        hosts[index].config.enable = true\n        hosts[index].info.enable = true\n        hosts[index].saveConfig()\n        bots.forEach { hosts[index].installBot(it) }\n    }\n\n    fun enableAll() = hosts.forEach { host -> host.enable() }\n\n    fun disable(index: Int) {\n        Log.i(\"disable\", index.toString())\n        if (!hosts[index].config.enable) return\n        hosts[index].disable()\n        hosts[index].config.enable = false\n        hosts[index].info.enable = false\n        hosts[index].saveConfig()\n    }\n\n    fun disableAll() = hosts.forEach { it.disable() }\n\n    fun reload(index: Int) {\n        hosts[index].disable()\n        hosts[index].load()\n        hosts[index].enableIfPossible()\n        bots.forEach {\n            hosts[index].installBot(it)\n        }\n    }\n\n    fun reloadAll() = hosts.forEach {\n        it.disable()\n        it.load()\n        it.enableIfPossible()\n        bots.forEach { bot ->\n            it.installBot(bot)\n        }\n    }\n\n    fun getHostInfoStrings(): Array<String> = List(hosts.size) {\n        hosts[it].getInfoString()\n    }.toTypedArray()\n\n    private fun MutableList<ScriptHost>.addHost(\n        scriptFile: File,\n        configFile: File,\n        type: Int\n    ): ScriptHost? {\n        try {\n            //Log.e(\"loading:\", \"${scriptFile.absolutePath}\")\n            val host = ScriptHostFactory.getScriptHost(scriptFile, scriptFile.getConfigFile(), type)\n            host ?: throw Exception(\"未知的脚本类型！${scriptFile.absolutePath}\")\n            host.load()\n            host.enableIfPossible()\n            add(host)\n            return host\n        } catch (e: Exception) {\n            Log.e(\"loadScriptError\", e.message ?: return null)\n        }\n        return null\n    }\n\n    private fun File.getConfigFile() = File(configDir, name)\n//    fun Uri.getName(context: Context) =\n//      context.askFileName()\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/service/BotService.kt",
    "content": "@file:Suppress(\"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\")\n\npackage io.github.mzdluo123.mirai.android.service\n\nimport android.annotation.SuppressLint\nimport android.app.Service\nimport android.content.Context\nimport android.content.Intent\nimport android.content.IntentFilter\nimport android.net.Uri\nimport android.os.Build\nimport android.os.IBinder\nimport android.os.PowerManager\nimport android.provider.MediaStore\nimport android.util.Log\nimport androidx.core.content.FileProvider\nimport io.github.mzdluo123.mirai.android.AppSettings\nimport io.github.mzdluo123.mirai.android.BuildConfig\nimport io.github.mzdluo123.mirai.android.IbotAidlInterface\nimport io.github.mzdluo123.mirai.android.NotificationFactory\nimport io.github.mzdluo123.mirai.android.miraiconsole.AndroidMiraiConsole\nimport io.github.mzdluo123.mirai.android.receiver.PushMsgReceiver\nimport io.github.mzdluo123.mirai.android.script.ScriptManager\nimport io.github.mzdluo123.mirai.android.utils.MiraiAndroidStatus\nimport io.github.mzdluo123.mirai.android.utils.register\nimport kotlinx.coroutines.CoroutineExceptionHandler\nimport kotlinx.coroutines.GlobalScope\nimport kotlinx.coroutines.launch\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.command.CommandManager\nimport net.mamoe.mirai.console.command.CommandOwner\nimport net.mamoe.mirai.console.command.ConsoleCommandSender\nimport net.mamoe.mirai.console.command.ConsoleCommandSender.sendMessage\nimport net.mamoe.mirai.console.command.ContactCommandSender\nimport net.mamoe.mirai.console.utils.checkManager\nimport net.mamoe.mirai.event.subscribeMessages\nimport net.mamoe.mirai.message.data.At\nimport net.mamoe.mirai.utils.SimpleLogger\nimport java.io.File\nimport kotlin.system.exitProcess\n\n\n@ExperimentalUnsignedTypes\nclass BotService : Service(), CommandOwner {\n    lateinit var consoleFrontEnd: AndroidMiraiConsole\n        private set\n    private val binder = BotBinder()\n    private var isStart = false\n    private lateinit var powerManager: PowerManager\n    private lateinit var wakeLock: PowerManager.WakeLock\n    private var bot: Bot? = null\n    private val msgReceiver = PushMsgReceiver(this)\n    private val allowPushMsg = AppSettings.allowPushMsg\n\n// 多进程调试辅助\n//  init {\n//        Debug.waitForDebugger()\n//    }\n\n    companion object {\n        const val START_SERVICE = 0\n        const val STOP_SERVICE = 1\n        const val NOTIFICATION_ID = 1\n        const val OFFLINE_NOTIFICATION_ID = 3\n        const val TAG = \"BOT_SERVICE\"\n    }\n\n    private fun createNotification() {\n        NotificationFactory.statusNotification().let {\n            startForeground(NOTIFICATION_ID, it) //设置为前台服务\n        }\n    }\n\n    override fun onBind(intent: Intent): IBinder = binder\n\n    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {\n        try {\n            intent?.getIntExtra(\n                \"action\",\n                START_SERVICE\n            ).let { action ->\n                when (action) {\n                    START_SERVICE -> startConsole(intent)\n                    STOP_SERVICE -> stopConsole()\n                }\n            }\n        } catch (e: Exception) {\n            Log.e(\"onStartCommand\", e.message ?: \"null\")\n            consoleFrontEnd.pushLog(0L, \"onStartCommand:发生错误 $e\")\n        }\n        return super.onStartCommand(intent, flags, startId)\n    }\n\n    @SuppressLint(\"InvalidWakeLockTag\")\n    override fun onCreate() {\n        super.onCreate()\n        consoleFrontEnd =\n            AndroidMiraiConsole(\n                baseContext\n            )\n        powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager\n        wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, \"BotWakeLock\")\n    }\n\n    private fun autoLogin(intent: Intent) {\n        val qq = intent.getLongExtra(\"qq\", 0)\n        val pwd = intent.getStringExtra(\"pwd\")\n        if (qq == 0L) return\n\n        //CommandManager.runCommand(ConsoleCommandSender, \"login $qq $pwd\")\n        consoleFrontEnd.pushLog(0L, \"[INFO] 自动登录....\")\n        val handler = CoroutineExceptionHandler { _, throwable ->\n            consoleFrontEnd.pushLog(0L, \"[ERROR] 自动登录失败 $throwable\")\n        }\n\n        val bot = Bot(qq, pwd!!.chunkedHexToBytes()) {\n            fileBasedDeviceInfo(getExternalFilesDir(null)!!.absolutePath + \"/device.json\")\n            this.loginSolver = MiraiConsole.frontEnd.createLoginSolver()\n            this.botLoggerSupplier = {\n                SimpleLogger(\"[BOT $qq]\") { _, message, e ->\n                    consoleFrontEnd.pushLog(0L, \"[INFO] $message\")\n                    e?.also {\n                        consoleFrontEnd.pushLog(0L, \"[BOT ERROR $qq] $it\")\n                    }?.printStackTrace()\n                }\n            }\n            this.networkLoggerSupplier = {\n                SimpleLogger(\"BOT $qq\") { _, message, e ->\n                    consoleFrontEnd.pushLog(0L, \"[NETWORK] $message\")\n                    e?.also {\n                        consoleFrontEnd.pushLog(0L, \"[NETWORK ERROR] $it\")\n                    }?.printStackTrace()\n                }\n            }\n        }\n        this.bot = bot\n        GlobalScope.launch(handler) { bot.login() }\n        bot.subscribeMessages {\n            startsWith(\"/\") { message ->\n                if (bot.checkManager(this.sender.id))\n                    CommandManager.runCommand(ContactCommandSender(bot, this.subject), message)\n            }\n        }\n\n        GlobalScope.launch(handler) { sendMessage(\"$qq login successes\") }\n        MiraiConsole.frontEnd.pushBot(bot)\n    }\n\n    private fun registerDefaultCommand() {\n        register(_description = \"显示MiraiAndroid运行状态\", _name = \"android\") { sender, _ ->\n            sender.sendMessage(MiraiAndroidStatus.recentStatus().format())\n            true\n        }\n        register(_description = \"查看已加载的脚本\", _name = \"script\", _usage = \"script\") { sender, _ ->\n            sender.sendMessage(buildString {\n                append(\"已加载${ScriptManager.instance.hosts.size}个脚本\\n\")\n                ScriptManager.instance.hosts.joinTo(\n                    this,\n                    \"\\n\"\n                ) { \"${it.info.name} ${it.info.version} by ${it.info.author}\" }\n                append(\"\\n已加载Bot数量：${ScriptManager.instance.botsSize}\")\n            })\n            true\n        }\n    }\n\n    @SuppressLint(\"WakelockTimeout\")\n    private fun startConsole(intent: Intent?) {\n        if (isStart) return\n        Log.e(TAG, \"启动服务\")\n        try {\n            wakeLock.acquire()\n        } catch (e: Exception) {\n            Log.e(\"wakeLockError\", e.message ?: \"null\")\n        }\n        MiraiAndroidStatus.startTime = System.currentTimeMillis()\n        MiraiConsole.start(\n            consoleFrontEnd,\n            consoleVersion = BuildConfig.COREVERSION,\n            path = getExternalFilesDir(null).toString()\n        )\n        registerReceiver()\n        isStart = true\n        createNotification()\n        registerDefaultCommand()\n        intent?.let { autoLogin(it) }\n    }\n\n    private fun stopConsole() {\n        if (!isStart) return\n        Log.e(TAG, \"停止服务\")\n        if (allowPushMsg) {\n            unregisterReceiver(msgReceiver)\n        }\n        ScriptManager.instance.disableAll()\n        if (wakeLock.isHeld) {\n            wakeLock.release()\n        }\n        MiraiConsole.stop()\n        stopForeground(true)\n        stopSelf()\n        exitProcess(0)\n    }\n\n    private fun registerReceiver() {\n        if (allowPushMsg) {\n            MiraiConsole.frontEnd.pushLog(0L, \"[MA] 正在启动消息推送广播监听器\")\n            val filter = IntentFilter().apply {\n                addAction(\"io.github.mzdluo123.mirai.android.PushMsg\")\n                priority = 999\n                addDataScheme(\"ma\")\n            }\n            registerReceiver(msgReceiver, filter)\n        }\n    }\n\n\n    internal fun sendFriendMsg(id: Long, msg: String?) {\n        bot?.launch {\n            MiraiConsole.frontEnd.pushLog(0L, \"[MA] 成功处理一个好友消息推送请求: $msg->$id\")\n            this@BotService.bot!!.getFriend(id).sendMessage(msg!!)\n        }\n    }\n\n\n    internal fun sendGroupMsg(id: Long, msg: String?) {\n        bot?.launch {\n            MiraiConsole.frontEnd.pushLog(0L, \"[MA] 成功处理一个群消息推送请求: $msg->$id\")\n            this@BotService.bot!!.getGroup(id).sendMessage(msg!!)\n        }\n    }\n\n    internal fun sendGroupMsgWithAT(id: Long, msg: String?, user: Long) {\n        bot?.launch {\n            MiraiConsole.frontEnd.pushLog(0L, \"[MA] 成功处理一个群消息推送请求: $msg->$id\")\n            val group = this@BotService.bot!!.getGroup(id)\n            group.sendMessage(At(group[user]) + msg!!)\n        }\n    }\n\n\n    @ExperimentalUnsignedTypes\n    private fun String.chunkedHexToBytes(): ByteArray =\n        this.asSequence().chunked(2).map { (it[0].toString() + it[1]).toUByte(16).toByte() }\n            .toList().toByteArray()\n\n    inner class BotBinder : IbotAidlInterface.Stub() {\n        override fun runCmd(cmd: String?) {\n            cmd?.let {\n                CommandManager.runCommand(ConsoleCommandSender, it)\n            }\n        }\n\n        override fun getLog(): Array<String> {\n            //防止\n            // ClassCastException: java.lang.Object[] cannot be cast to java.lang.String[]\n            // 不知道有没有更好的写法\n            return consoleFrontEnd.logStorage.toArray(\n                arrayOfNulls(consoleFrontEnd.logStorage.size)\n            )\n        }\n\n        override fun submitVerificationResult(result: String?) {\n            result?.let {\n                consoleFrontEnd.loginSolver.verificationResult.complete(it)\n            }\n        }\n\n        override fun setScriptConfig(config: String?) {\n\n        }\n\n        override fun createScript(name: String, type: Int): Boolean {\n            return ScriptManager.instance.createScriptFromFile(File(name), type)\n        }\n\n        override fun reloadScript(index: Int): Boolean {\n            ScriptManager.instance.reload(index)\n            return true\n        }\n\n        override fun clearLog() {\n            consoleFrontEnd.logStorage.clear()\n        }\n\n        override fun enableScript(index: Int) {\n            ScriptManager.instance.enable(index)\n        }\n\n        override fun disableScript(index: Int) {\n            ScriptManager.instance.disable(index)\n        }\n\n        override fun getUrl(): String = consoleFrontEnd.loginSolver.url\n\n        override fun getScriptSize(): Int = ScriptManager.instance.hosts.size\n\n        override fun getCaptcha(): ByteArray = consoleFrontEnd.loginSolver.captchaData\n        override fun getLogonId(): Long {\n            return try {\n                Bot.botInstances.first().id\n            } catch (e: NoSuchElementException) {\n                0\n            }\n        }\n\n\n        override fun sendLog(log: String?) {\n            consoleFrontEnd.logStorage.add(log)\n        }\n\n        override fun getBotInfo(): String = MiraiAndroidStatus.recentStatus().format()\n\n        override fun openScript(index: Int) {\n            val scriptFile = ScriptManager.instance.hosts[index].scriptFile\n            val provideUri: Uri\n            provideUri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {\n                FileProvider.getUriForFile(\n                    this@BotService,\n                    \"io.github.mzdluo123.mirai.android.scriptprovider\",\n                    scriptFile\n                )\n            } else {\n                Uri.fromFile(scriptFile)\n            }\n            startActivity(\n                Intent(\"android.intent.action.VIEW\").apply {\n                    addCategory(\"android.intent.category.DEFAULT\")\n                    addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)\n                    putExtra(MediaStore.EXTRA_OUTPUT, provideUri)\n                    addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)\n                    type = \"text/plain\"\n                    setDataAndType(provideUri, type)\n                })\n        }\n\n        override fun deleteScript(index: Int) {\n            ScriptManager.instance.delete(index)\n        }\n\n        override fun getHostList(): Array<String> = ScriptManager.instance.getHostInfoStrings()\n    }\n\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/service/ServiceConnector.kt",
    "content": "package io.github.mzdluo123.mirai.android.service\n\nimport android.content.ComponentName\nimport android.content.Context\nimport android.content.Intent\nimport android.content.ServiceConnection\nimport android.os.IBinder\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.LifecycleObserver\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.OnLifecycleEvent\nimport io.github.mzdluo123.mirai.android.IbotAidlInterface\nimport io.github.mzdluo123.mirai.android.IdleResources\n\n\nclass ServiceConnector(var context: Context) : ServiceConnection, LifecycleObserver {\n\n    lateinit var botService: IbotAidlInterface\n        private set\n\n    var connectStatus = MutableLiveData(false)\n        private set\n\n    override fun onServiceDisconnected(name: ComponentName?) {\n        connectStatus.value = false\n    }\n\n    override fun onServiceConnected(name: ComponentName?, service: IBinder?) {\n        botService = IbotAidlInterface.Stub.asInterface(service)\n        connectStatus.value = true\n        if (!IdleResources.botServiceLoading.isIdleNow) {\n            IdleResources.botServiceLoading.decrement()\n        }\n    }\n\n    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)\n    fun connect() {\n        if (!connectStatus.value!!) {\n            context.bindService(\n                Intent(context, BotService::class.java),\n                this,\n                Context.BIND_ABOVE_CLIENT\n            )\n            if (IdleResources.botServiceLoading.isIdleNow) {\n                IdleResources.botServiceLoading.increment()\n            }\n        }\n    }\n\n\n    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)\n    fun disconnect() {\n        if (connectStatus.value!!) {\n            context.unbindService(this)\n            connectStatus.value = false\n        }\n    }\n\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/ui/about/AboutFragment.kt",
    "content": "package io.github.mzdluo123.mirai.android.ui.about\n\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.databinding.DataBindingUtil\nimport androidx.fragment.app.Fragment\nimport io.github.mzdluo123.mirai.android.BuildConfig\nimport io.github.mzdluo123.mirai.android.R\nimport io.github.mzdluo123.mirai.android.databinding.FragmentAboutBinding\nimport kotlinx.android.synthetic.main.fragment_about.*\nimport splitties.toast.toast\n\nclass AboutFragment : Fragment() {\n    private lateinit var aboutBinding: FragmentAboutBinding\n    private var click = 0\n    override fun onCreateView(\n        inflater: LayoutInflater, container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        // Inflate the layout for this fragment\n        val aboutBinding = DataBindingUtil.inflate<FragmentAboutBinding>(\n            layoutInflater,\n            R.layout.fragment_about,\n            container,\n            false\n        )\n        aboutBinding.appVersion = requireContext().packageManager.getPackageInfo(\n            requireContext().packageName,\n            0\n        ).versionName\n        aboutBinding.coreVersion = BuildConfig.COREVERSION\n        return aboutBinding.root\n    }\n\n    override fun onActivityCreated(savedInstanceState: Bundle?) {\n        super.onActivityCreated(savedInstanceState)\n        github_btn.setOnClickListener {\n            openUrl(\"https://github.com/mamoe/mirai\")\n        }\n        github2_bth.setOnClickListener {\n            openUrl(\"https://github.com/mzdluo123/MiraiAndroid\")\n        }\n        imageView2.setOnClickListener {\n            if (click < 4) {\n                click++\n                return@setOnClickListener\n            }\n            imageView2.setImageResource(R.drawable.avatar)\n        }\n        btn_join_group.setOnClickListener {\n            if (!joinQQGroup(\"df6wSbKtDBo3cMJ9ULtYAZeln5ZZuA9d\")) {\n                toast(\"拉起QQ失败，请确认你是否安装了QQ\")\n            }\n        }\n    }\n\n\n    private fun openUrl(url: String) {\n        val uri = Uri.parse(url)\n        startActivity(Intent(Intent.ACTION_VIEW, uri))\n    }\n\n    /****************\n     *\n     * 发起添加群流程。群号：MiraiAndroid(1131127734) 的 key 为： df6wSbKtDBo3cMJ9ULtYAZeln5ZZuA9d\n     * 调用 joinQQGroup(df6wSbKtDBo3cMJ9ULtYAZeln5ZZuA9d) 即可发起手Q客户端申请加群 MiraiAndroid(1131127734)\n     *\n     * @param key 由官网生成的key\n     * @return 返回true表示呼起手Q成功，返回false表示呼起失败\n     */\n    private fun joinQQGroup(key: String): Boolean {\n        val intent = Intent()\n        intent.data =\n            Uri.parse(\"mqqopensdkapi://bizAgent/qm/qr?url=http%3A%2F%2Fqm.qq.com%2Fcgi-bin%2Fqm%2Fqr%3Ffrom%3Dapp%26p%3Dandroid%26jump_from%3Dwebapi%26k%3D$key\")\n        // 此Flag可根据具体产品需要自定义，如设置，则在加群界面按返回，返回手Q主界面，不设置，按返回会返回到呼起产品界面    //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)\n        return try {\n            startActivity(intent)\n            true\n        } catch (e: Exception) {\n            // 未安装手Q或安装的版本不支持\n            false\n        }\n    }\n\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/ui/console/ConsoleFragment.kt",
    "content": "package io.github.mzdluo123.mirai.android.ui.console\n\nimport android.app.AlertDialog\nimport android.content.Context\nimport android.os.Bundle\nimport android.os.DeadObjectException\nimport android.util.Log\nimport android.view.*\nimport android.view.inputmethod.EditorInfo\nimport android.widget.EditText\nimport android.widget.ScrollView\nimport android.widget.Toast\nimport androidx.fragment.app.Fragment\nimport androidx.lifecycle.Observer\nimport androidx.lifecycle.lifecycleScope\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.load.resource.bitmap.RoundedCorners\nimport com.bumptech.glide.request.RequestOptions\nimport io.github.mzdluo123.mirai.android.R\nimport io.github.mzdluo123.mirai.android.service.ServiceConnector\nimport io.github.mzdluo123.mirai.android.utils.shareText\nimport kotlinx.android.synthetic.main.fragment_home.*\nimport kotlinx.coroutines.*\nimport splitties.toast.toast\nimport java.security.MessageDigest\n\n\n@ExperimentalUnsignedTypes\nclass ConsoleFragment : Fragment() {\n    companion object {\n        const val TAG = \"ConsoleFragment\"\n    }\n\n    private var logRefreshJob: Job? = null\n\n    private lateinit var conn: ServiceConnector\n\n    private var autoScroll = true\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        conn = ServiceConnector(requireContext())\n        lifecycle.addObserver(conn)\n        val root = inflater.inflate(R.layout.fragment_home, container, false)\n        setHasOptionsMenu(true)\n        return root\n    }\n\n    override fun onStart() {\n        super.onStart()\n\n        commandSend_btn.setOnClickListener {\n            submitCmd()\n        }\n        shortcutBottom_btn.setOnClickListener {\n            viewLifecycleOwner.lifecycleScope.launch {\n                if (autoScroll) {\n                    autoScroll = false\n                    toast(\"自动滚动禁用\")\n                    shortcutBottom_btn.setImageResource(R.drawable.ic_keyboard_arrow_down_black_24dp)\n                } else {\n                    autoScroll = true\n                    toast(\"自动滚动启用\")\n                    shortcutBottom_btn.setImageResource(R.drawable.ic_baseline_keyboard_arrow_up_24)\n                }\n\n            }\n        }\n        command_input.setOnEditorActionListener { _, actionId, _ ->\n            if (actionId == EditorInfo.IME_ACTION_SEND) {\n                submitCmd()\n            }\n            return@setOnEditorActionListener false\n        }\n        conn.connectStatus.observe(this, Observer {\n            Log.d(TAG, \"service status $it\")\n            if (logRefreshJob != null && logRefreshJob!!.isActive) {\n                return@Observer\n            }\n            if (it) {\n                startRefreshLoop()\n            }\n        })\n    }\n\n    override fun onResume() {\n        super.onResume()\n        startLoadAvatar()\n        if (logRefreshJob != null && logRefreshJob!!.isActive) {\n            logRefreshJob!!.cancel()\n        }\n        startRefreshLoop()\n    }\n\n    override fun onPause() {\n        super.onPause()\n        if (logRefreshJob != null && logRefreshJob!!.isActive) {\n            logRefreshJob!!.cancel()\n        }\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {\n        inflater.inflate(R.menu.menu_console, menu)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        super.onOptionsItemSelected(item)\n        when (item.itemId) {\n            R.id.action_setAutoLogin -> {\n                setAutoLogin()\n            }\n            R.id.action_report -> context?.shareText(\n                buildString {\n                    append(conn.botService.botInfo)\n                    append(\"\\n\")\n                    append(\"========以下是控制台log=======\\n\")\n                    append(conn.botService.log.joinToString(separator = \"\\n\"))\n                }, lifecycleScope\n            )\n            /*\n            R.id.action_battery -> {\n                ignoreBatteryOptimization(requireActivity())\n            }\n\n            R.id.action_fast_restart -> {\n                NotificationFactory.dismissAllNotification()\n                restart()\n            }*/\n        }\n        return false\n    }\n\n//    @SuppressLint(\"BatteryLife\")\n//    private fun ignoreBatteryOptimization(activity: Activity) {\n//        val powerManager =\n//            getSystemService(requireContext(), PowerManager::class.java)\n//        //  判断当前APP是否有加入电池优化的白名单，如果没有，弹出加入电池优化的白名单的设置对话框。\n//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n//            val hasIgnored = powerManager!!.isIgnoringBatteryOptimizations(activity.packageName)\n//            if (!hasIgnored) {\n//                val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)\n//                intent.data = Uri.parse(\"package:\" + activity.packageName)\n//                startActivity(intent)\n//            } else {\n//                Toast.makeText(context, \"您已授权忽略电池优化\", Toast.LENGTH_SHORT).show()\n//            }\n//        } else {\n//            Toast.makeText(requireContext(), \"只有新版Android才需要这个操作哦\", Toast.LENGTH_SHORT).show()\n//\n//        }\n//    }\n\n    private fun submitCmd() {\n        var command = command_input.text.toString()\n        lifecycleScope.launch(Dispatchers.Default) {\n            if (command.startsWith(\"/\")) {\n                command = command.substring(1)\n            }\n            conn.botService.runCmd(command)\n        }\n        command_input.text.clear()\n    }\n\n    private fun setAutoLogin() {\n        val alertView = View.inflate(activity, R.layout.dialog_autologin, null)\n        val pwdInput = alertView.findViewById<EditText>(R.id.password_input)\n        val qqInput = alertView.findViewById<EditText>(R.id.qq_input)\n        val accountStore = requireActivity().getSharedPreferences(\"account\", Context.MODE_PRIVATE)\n        val dialog = AlertDialog.Builder(activity)\n            .setView(alertView)\n            .setCancelable(true)\n            .setTitle(\"设置自动登录\")\n            .setPositiveButton(\"设置自动登录\") { _, _ ->\n                accountStore.edit().putLong(\"qq\", qqInput.text.toString().toLong())\n                    .putString(\"pwd\", md5(pwdInput.text.toString())).apply()\n                Toast.makeText(activity, \"设置成功,重启后生效\", Toast.LENGTH_SHORT).show()\n            }\n\n            .setNegativeButton(\"取消自动登录\") { _, _ ->\n                accountStore.edit().putLong(\"qq\", 0L).putString(\"pwd\", \"\").apply()\n                Toast.makeText(activity, \"设置成功,重启后生效\", Toast.LENGTH_SHORT).show()\n            }\n            .setNeutralButton(\"取消\") { dialog, _ ->\n                dialog.dismiss()\n            }\n        dialog.show()\n    }\n\n    private fun startRefreshLoop() {\n        if (!conn.connectStatus.value!!) {\n            return\n        }\n        logRefreshJob = viewLifecycleOwner.lifecycleScope.launch(Dispatchers.Default) {\n            log_text?.clearComposingText()\n            try {\n                withContext(Dispatchers.Main) { Log.d(TAG, \"start loop\") }\n                while (isActive) {\n                    val text = conn.botService.log.joinToString(separator = \"\\n\")\n                    withContext(Dispatchers.Main) {\n                        log_text?.text = text\n                        if (autoScroll) {\n                            main_scroll.fullScroll(ScrollView.FOCUS_DOWN)\n                        }\n                    }\n                    delay(200)\n                }\n            } catch (e: DeadObjectException) {\n                // ignore\n            }\n            withContext(Dispatchers.Main) { log_text?.append(\"\\n无法连接到服务，可能是正在重启\") }\n        }\n    }\n\n    private fun startLoadAvatar() {\n        viewLifecycleOwner.lifecycleScope.launch {\n            while (true) {\n                try {\n                    val id = conn.botService.logonId\n                    if (id != 0L) {\n                        Glide.with(requireActivity())\n                            .load(\"http://q1.qlogo.cn/g?b=qq&nk=$id&s=640\")\n                            .apply(\n                                RequestOptions().error(R.mipmap.ic_new_launcher_round)\n                                    .transform(RoundedCorners(40))\n                            )\n                            .into(requireActivity().findViewById(R.id.head_imageVIew))\n                        return@launch\n                    }\n\n                } catch (e: UninitializedPropertyAccessException) {\n                    // pass\n                } catch (e: DeadObjectException) {\n                    //pass\n                }\n                delay(1000)\n            }\n        }\n    }\n\n\n    private fun md5(str: String): String {\n        val digest = MessageDigest.getInstance(\"MD5\")\n        val result = digest.digest(str.toByteArray())\n        //没转16进制之前是16位\n        println(\"result${result.size}\")\n        //转成16进制后是32字节\n        return toHex(result)\n    }\n\n    private fun toHex(byteArray: ByteArray): String {\n        //转成16进制后是32字节\n        return with(StringBuilder()) {\n            byteArray.forEach {\n                val hex = it.toInt() and (0xFF)\n                val hexStr = Integer.toHexString(hex)\n                if (hexStr.length == 1) {\n                    append(\"0\").append(hexStr)\n                } else {\n                    append(hexStr)\n                }\n            }\n            toString()\n        }\n    }\n\n//    private fun restart() = viewLifecycleOwner.lifecycleScope.launch {\n//        conn.disconnect()\n//        BotApplication.context.stopBotService()\n//        delay(200)\n//        BotApplication.context.startBotService()\n//        conn.connect()\n//    }\n\n}\n\n\n\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/ui/plugin/PluginFragment.kt",
    "content": "package io.github.mzdluo123.mirai.android.ui.plugin\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.os.Build\nimport android.os.Bundle\nimport android.view.*\n\nimport android.widget.Toast\nimport androidx.appcompat.widget.PopupMenu\n\nimport androidx.fragment.app.Fragment\nimport androidx.lifecycle.Observer\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.viewholder.BaseViewHolder\nimport io.github.mzdluo123.mirai.android.R\nimport kotlinx.android.synthetic.main.fragment_plugin.*\nimport java.io.File\n\n\nclass PluginFragment : Fragment() {\n\n    private lateinit var pluginViewModel: PluginViewModel\n    private lateinit var adapter: PluginsAdapter\n\n    companion object {\n        const val SELECT_RESULT_CODE = 1\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        pluginViewModel =\n            ViewModelProvider(this).get(PluginViewModel::class.java)\n        val root = inflater.inflate(R.layout.fragment_plugin, container, false)\n        setHasOptionsMenu(true)\n        adapter = PluginsAdapter()\n\n        adapter.setOnItemClickListener { _, view, position ->\n            val menu = PopupMenu(requireContext(), view)\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n                menu.gravity = Gravity.END\n            }\n            menu.menuInflater.inflate(R.menu.plugin_manage, menu.menu)\n            menu.setOnMenuItemClickListener { item ->\n                when (item.itemId) {\n                    R.id.action_delete -> {\n                        pluginViewModel.deletePlugin(position)\n                        Toast.makeText(activity, \"删除成功，重启后生效\", Toast.LENGTH_SHORT).show()\n                        return@setOnMenuItemClickListener true\n                    }\n\n                    else -> return@setOnMenuItemClickListener true\n                }\n            }\n            menu.show()\n        }\n\n        pluginViewModel.pluginList.observe(viewLifecycleOwner, Observer {\n            adapter.data = it.toMutableList()\n            adapter.notifyDataSetChanged()\n        })\n        return root\n    }\n\n    override fun onActivityCreated(savedInstanceState: Bundle?) {\n        super.onActivityCreated(savedInstanceState)\n        plugin_recycler.adapter = adapter\n        plugin_recycler.layoutManager = LinearLayoutManager(activity)\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {\n        inflater.inflate(R.menu.plugin_add, menu)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        if (item.itemId == android.R.id.home) {\n            return false\n        }\n\n        val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {\n            // Filter to only show results that can be \"opened\", such as a\n            // file (as opposed to a list of contacts or timezones)\n            addCategory(Intent.CATEGORY_OPENABLE)\n\n            // Filter to show only images, using the image MIME data type.\n            // If one wanted to search for ogg vorbis files, the type would be \"audio/ogg\".\n            // To search for all documents available via installed storage providers,\n            // it would be \"*/*\".\n            type = \"application/java-archive\"\n        }\n\n        startActivityForResult(intent, SELECT_RESULT_CODE)\n        return true\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {\n\n        // The ACTION_OPEN_DOCUMENT intent was sent with the request code\n        // READ_REQUEST_CODE. If the request code seen here doesn't match, it's the\n        // response to some other intent, and the code below shouldn't run at all.\n\n        if (requestCode == SELECT_RESULT_CODE && resultCode == Activity.RESULT_OK) {\n\n            // The document selected by the user won't be returned in the intent.\n            // Instead, a URI to that document will be contained in the return intent\n            // provided to this method as a parameter.\n            // Pull that URI using resultData.getData().\n\n\n            resultData?.data?.also { uri ->\n\n                startActivity(\n//                    Intent(activity, PluginImportActivity::class.java).putExtra(\n//                        \"uri\",\n//                        uri.toString()\n//                    )\n                    Intent(Intent.ACTION_VIEW, uri)\n                )\n\n            }\n        }\n    }\n\n    override fun onResume() {\n        super.onResume()\n        pluginViewModel.refreshPluginList()\n    }\n\n\n}\n\n\nclass PluginsAdapter() :\n    BaseQuickAdapter<File, BaseViewHolder>(R.layout.item_plugin) {\n    override fun convert(holder: BaseViewHolder, item: File) {\n        holder.setText(R.id.pluginName_text, item.name)\n        holder.setText(R.id.pluginSize_text, \"${item.length() / 1024}kb\")\n    }\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/ui/plugin/PluginViewModel.kt",
    "content": "package io.github.mzdluo123.mirai.android.ui.plugin\n\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport io.github.mzdluo123.mirai.android.BotApplication\nimport io.github.mzdluo123.mirai.android.utils.DexCompiler\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport java.io.File\n\n\n@ExperimentalUnsignedTypes\nclass PluginViewModel : ViewModel() {\n    val pluginList = MutableLiveData<List<File>>()\n\n    init {\n        refreshPluginList()\n    }\n\n    private fun loadPluginList(): List<File> {\n        val fileList = mutableListOf<File>()\n        BotApplication.context.getExternalFilesDir(\"plugins\")?.listFiles()?.forEach {\n            if (it.isFile) {\n                fileList.add(it)\n            }\n        }\n        return fileList\n    }\n\n    fun deletePlugin(pos: Int) {\n        val file = pluginList.value?.get(pos) ?: return\n        file.delete()\n        refreshPluginList()\n    }\n\n    fun refreshPluginList() {\n        viewModelScope.launch {\n            pluginList.postValue(loadPluginList())\n        }\n    }\n\n    suspend fun compilePlugin(file: File, desugaring: Boolean) {\n        val workDir = BotApplication.context.getExternalFilesDir(null) ?: return\n        val tempDir = BotApplication.context.cacheDir\n        val compiler = DexCompiler(workDir, tempDir)\n        withContext(Dispatchers.IO) {\n            if (tempDir.exists()) {\n                deleteDir(tempDir)\n            }\n            tempDir.mkdir()\n        }\n        withContext(Dispatchers.Default) {\n            val out = compiler.compile(file,desugaring)\n            compiler.copyResourcesAndMove(file, out)\n        }\n    }\n\n    private fun deleteDir(path: File) {\n        path.listFiles()?.forEach {\n            if (it.isFile) {\n                it.delete()\n            } else {\n                if (it.isDirectory) {\n                    deleteDir(it)\n                }\n            }\n        }\n        path.delete()\n    }\n\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/ui/script/ScriptCenterFragment.kt",
    "content": "package io.github.mzdluo123.mirai.android.ui.script\n\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Bundle\nimport android.view.*\nimport androidx.fragment.app.Fragment\nimport androidx.lifecycle.Observer\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.ooooonly.giteeman.GiteeFile\nimport io.github.mzdluo123.mirai.android.IdleResources\nimport io.github.mzdluo123.mirai.android.R\nimport io.github.mzdluo123.mirai.android.script.ScriptHostFactory\nimport io.github.mzdluo123.mirai.android.service.ServiceConnector\nimport kotlinx.android.synthetic.main.fragment_script_center.*\nimport kotlinx.coroutines.*\nimport splitties.alertdialog.appcompat.*\nimport splitties.toast.toast\n\n@ExperimentalStdlibApi\nclass ScriptCenterFragment : Fragment(), CoroutineScope by MainScope() {\n\n    private lateinit var scriptViewModel: ScriptCenterViewModel\n    private lateinit var adapter: ScriptCenterListAdapter\n    private lateinit var botServiceConnection: ServiceConnector\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        botServiceConnection = ServiceConnector(requireContext())\n        lifecycle.addObserver(botServiceConnection)\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? = inflater.inflate(R.layout.fragment_script_center, container, false).also {\n        setHasOptionsMenu(true)\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {\n        inflater.inflate(R.menu.menu_script_center, menu)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) {\n        android.R.id.home -> false\n        R.id.action_upload_script -> {\n            context?.alertDialog {\n                message = \"\"\"\n                你需要\n                1.注册gitee账号\n                2.向脚本仓库地址“https://gitee.com/ooooonly/lua-mirai-project/tree/master/ScriptCenter”提交你的“Pull Request”\n                3.等待审核即可上架\n            \"\"\".trimIndent()\n                title = \"如何上传脚本\"\n                setPositiveButton(\"前往仓库地址\") { _, _ ->\n                    context.startActivity(\n                        Intent(\n                            Intent.ACTION_VIEW,\n                            Uri.parse(\"https://gitee.com/ooooonly/lua-mirai-project/tree/master/ScriptCenter\")\n                        )\n                    )\n                }\n                setNegativeButton(\"取消\") { _, _ -> }\n            }?.show()\n            true\n        }\n        else -> true\n    }\n\n    override fun onActivityCreated(savedInstanceState: Bundle?) {\n        super.onActivityCreated(savedInstanceState)\n        adapter = ScriptCenterListAdapter { selectedFile ->\n            if (selectedFile.isFile) {\n                var alert: androidx.appcompat.app.AlertDialog? = null\n                alert = context?.alertDialog {\n                    message = \"是否导入${selectedFile.fileName}？\"\n                    okButton {\n\n                        val progressDialog =\n                            context.alertDialog {\n                                message = \"正在导入\"\n                                IdleResources.loadingData.increment()\n                            }\n                        progressDialog.show()\n\n                        val exceptionHandler = CoroutineExceptionHandler { _, throwable ->\n                            progressDialog.dismiss()\n                            IdleResources.loadingData.decrement()\n                            context.toast(\"导入失败！\\n$throwable\")\n                        }\n                        launch(exceptionHandler) {\n\n                            withContext(Dispatchers.IO) {\n                                val filePath =\n                                    requireContext().getExternalFilesDir(\"scripts\")!!.absolutePath + \"/\" + selectedFile.fileName\n                                selectedFile.saveToFile(filePath)\n                                val scriptType =\n                                    ScriptHostFactory.getTypeFromSuffix(filePath.split(\".\").last())\n                                val result = botServiceConnection.botService.createScript(\n                                    filePath,\n                                    scriptType\n                                )\n                                if (!result) throw Exception()\n                            }\n                            progressDialog?.dismiss()\n                            context.toast(\"导入成功！\")\n                            IdleResources.loadingData.decrement()\n                        }\n\n                    }\n                    cancelButton {}\n                }\n\n                alert?.show()\n            } else {\n                scriptViewModel.showFiles(selectedFile)\n            }\n        }\n        adapter.setEmptyView(layoutInflater.inflate(R.layout.fragment_script_center_empty, null))\n        rcl_scripts.adapter = adapter\n        rcl_scripts.layoutManager = LinearLayoutManager(activity)\n        /*\n        rcl_scripts.addItemDecoration(\n            DividerItemDecoration(\n                context,\n                DividerItemDecoration.HORIZONTAL\n            )\n        )*/\n\n    }\n\n    override fun onResume() {\n        super.onResume()\n        botServiceConnection.connectStatus.observe(this, Observer {\n            if (it) {\n                scriptViewModel = ScriptCenterViewModel()\n                scriptViewModel.fileList.observe(viewLifecycleOwner, Observer {\n                    adapter.data = it.toMutableList()\n                    adapter.notifyDataSetChanged()\n                })\n                IdleResources.loadingData.increment()\n                scriptViewModel.showFiles(\n                    GiteeFile(\n                        \"ooooonly\",\n                        \"lua-mirai-project\",\n                        \"ScriptCenter\",\n                        rootLevel = 2,\n                        showParent = true\n                    )\n                )\n            }\n        })\n    }\n\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/ui/script/ScriptCenterListAdapter.kt",
    "content": "package io.github.mzdluo123.mirai.android.ui.script\n\nimport androidx.cardview.widget.CardView\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.viewholder.BaseViewHolder\nimport com.ooooonly.giteeman.GiteeFile\nimport io.github.mzdluo123.mirai.android.R\n\n@ExperimentalStdlibApi\nclass ScriptCenterListAdapter(var listener: (GiteeFile) -> Unit) :\n    BaseQuickAdapter<GiteeFile, BaseViewHolder>(R.layout.item_script_center_list) {\n    override fun convert(holder: BaseViewHolder, item: GiteeFile) {\n        with(holder) {\n            setVisible(R.id.iv_file, item.isFile)\n            setVisible(R.id.iv_folder, item.isDictionary)\n            setText(R.id.tv_name, item.fileName)\n            holder.getView<CardView>(R.id.cv_item).setOnClickListener {\n                listener(item)\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/ui/script/ScriptCenterViewModel.kt",
    "content": "package io.github.mzdluo123.mirai.android.ui.script\n\n\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport com.ooooonly.giteeman.GiteeFile\nimport io.github.mzdluo123.mirai.android.IdleResources\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\n\n@ExperimentalStdlibApi\nclass ScriptCenterViewModel() : ViewModel() {\n    val fileList = MutableLiveData<List<GiteeFile>>()\n\n    fun showFiles(parent: GiteeFile) {\n        viewModelScope.launch {\n            withContext(\n                Dispatchers.IO\n            ) {\n                fileList.postValue(parent.listFiles())\n                IdleResources.loadingData.decrement()\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/ui/script/ScriptFragment.kt",
    "content": "package io.github.mzdluo123.mirai.android.ui.script\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Bundle\nimport android.view.*\nimport android.widget.Button\nimport androidx.fragment.app.Fragment\nimport androidx.lifecycle.Observer\nimport androidx.lifecycle.lifecycleScope\nimport androidx.navigation.fragment.findNavController\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport io.github.mzdluo123.mirai.android.R\nimport io.github.mzdluo123.mirai.android.script.ScriptHostFactory\nimport io.github.mzdluo123.mirai.android.script.ScriptManager\nimport io.github.mzdluo123.mirai.android.service.ServiceConnector\nimport io.github.mzdluo123.mirai.android.utils.askFileName\nimport kotlinx.android.synthetic.main.fragment_script.*\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport splitties.alertdialog.appcompat.*\nimport splitties.toast.toast\n\nclass ScriptFragment : Fragment(), ScriptInfoDialogFragment.ScriptInfoDialogFragmentListener {\n    companion object {\n        const val IMPORT_SCRIPT = 2\n    }\n\n    private lateinit var scriptViewModel: ScriptViewModel\n\n    private val adapter: ScriptListAdapter by lazy {\n        ScriptListAdapter(this)\n    }\n\n    private lateinit var botServiceConnection: ServiceConnector\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        botServiceConnection = ServiceConnector(requireContext())\n        lifecycle.addObserver(botServiceConnection)\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? = inflater.inflate(R.layout.fragment_script, container, false).also {\n        setHasOptionsMenu(true)\n        adapter.setEmptyView(inflater.inflate(R.layout.fragment_script_empty, null).apply {\n            findViewById<Button>(R.id.btn_script_center).setOnClickListener {\n                findNavController().navigate(R.id.action_nav_scripts_to_nav_scripts_center)\n            }\n        })\n    }\n\n\n    override fun onActivityCreated(savedInstanceState: Bundle?) {\n        super.onActivityCreated(savedInstanceState)\n        script_recycler.adapter = adapter\n        script_recycler.addItemDecoration(\n            DividerItemDecoration(\n                context,\n                DividerItemDecoration.HORIZONTAL\n            )\n        )\n        script_recycler.layoutManager = LinearLayoutManager(activity)\n    }\n\n    override fun onResume() {\n        super.onResume()\n        botServiceConnection.connectStatus.observe(this, Observer {\n            if (it) {\n                scriptViewModel = ScriptViewModel(botServiceConnection.botService)\n                scriptViewModel.observe(viewLifecycleOwner, Observer {\n                    adapter.data = it.toMutableList()\n                    adapter.notifyDataSetChanged()\n                })\n                scriptViewModel.refreshScriptList()\n            }\n        })\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {\n        inflater.inflate(R.menu.menu_script, menu)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) {\n        android.R.id.home -> false\n        R.id.action_add_script -> {\n            startActivityForResult(Intent(Intent.ACTION_OPEN_DOCUMENT).apply {\n                addCategory(Intent.CATEGORY_OPENABLE)\n                type = \"*/*\"\n            }, IMPORT_SCRIPT)\n            true\n        }\n        R.id.action_script_center -> {\n            findNavController().navigate(R.id.action_nav_scripts_to_nav_scripts_center)\n            true\n        }\n        else -> true\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {\n        super.onActivityResult(requestCode, resultCode, intent)\n        if (requestCode == IMPORT_SCRIPT && resultCode == Activity.RESULT_OK) {\n            intent?.data?.also { importScript(it) }\n        }\n    }\n\n    private fun importScript(uri: Uri) {\n        uri.path ?: return\n        val scriptType = ScriptHostFactory.getTypeFromSuffix(uri.path!!.split(\".\").last())\n        if (scriptType != ScriptHostFactory.UNKNOWN) {\n            importScript(uri, scriptType)\n            return\n        }\n        context?.alertDialog {\n            title = \"未知脚本的后缀名，请手动选择脚本类型\"\n            setItems(arrayOf(\"Lua\", \"JavaScript\", \"Python\", \"KotlinScript\")) { _, type ->\n                importScript(uri, type + 1)\n            }\n        }\n    }\n\n    private fun importScript(uri: Uri, type: Int) {\n        viewLifecycleOwner.lifecycleScope.launch {\n            val name = withContext(Dispatchers.Main) {\n                requireActivity().askFileName()\n            } ?: return@launch\n            val scriptFile = ScriptManager.copyFileToScriptDir(requireContext(), uri, name)\n            val result = scriptViewModel.createScriptFromFile(scriptFile, type)\n            if (result) {\n                context?.toast(\"导入成功，当前脚本数量：${scriptViewModel.hostSize}\")\n            } else {\n                context?.toast(\"导入失败，请检查脚本是否有误！\")\n            }\n        }\n\n    }\n\n    override fun onDeleteScript(index: Int) {\n        context?.alertDialog {\n            message = \"删除脚本后无法恢复，是否确定？\"\n            okButton {\n                scriptViewModel.deleteScript(index)\n            }\n            cancelButton { }\n        }?.show()\n    }\n\n    override fun onSaveScript(index: Int) {\n\n    }\n\n    override fun onReloadScript(index: Int) {\n        context?.alertDialog {\n            message = \"重新加载该脚本？\"\n            okButton {\n                scriptViewModel.reloadScript(index)\n                requireContext().toast(\"重载完毕\")\n            }\n            cancelButton { }\n        }?.show()\n    }\n\n    override fun onOpenScript(index: Int) {\n        scriptViewModel.openScript(index)\n    }\n\n    override fun onEnableScript(index: Int) {\n        scriptViewModel.enableScript(index)\n        requireContext().toast(\"已启用\")\n    }\n\n    override fun onDisableScript(index: Int) {\n        scriptViewModel.disableScript(index)\n        requireContext().toast(\"已禁用\")\n    }\n\n    fun showScriptInfo(index: Int) {\n        ScriptInfoDialogFragment(index, scriptViewModel, this).show(parentFragmentManager, \"script\")\n    }\n\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/ui/script/ScriptInfoDialogFragment.kt",
    "content": "package io.github.mzdluo123.mirai.android.ui.script\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport android.widget.ImageButton\nimport android.widget.TextView\nimport androidx.appcompat.app.AlertDialog\nimport androidx.fragment.app.DialogFragment\nimport io.github.mzdluo123.mirai.android.R\nimport io.github.mzdluo123.mirai.android.script.ScriptHostFactory\nimport io.github.mzdluo123.mirai.android.utils.formatFileLength\n\nclass ScriptInfoDialogFragment(\n    var scriptIndex: Int,\n    var scriptViewModel: ScriptViewModel,\n    var listener: ScriptInfoDialogFragmentListener\n) : DialogFragment() {\n    interface ScriptInfoDialogFragmentListener {\n        fun onDeleteScript(index: Int)\n        fun onSaveScript(index: Int)\n        fun onReloadScript(index: Int)\n        fun onOpenScript(index: Int)\n        fun onEnableScript(index: Int)\n        fun onDisableScript(index: Int)\n    }\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        return activity?.let {\n            scriptViewModel.hosts.value?.get(scriptIndex)?.let { info ->\n                val builder = AlertDialog.Builder(it)\n                val root =\n                    requireActivity().layoutInflater.inflate(R.layout.dialog_script_info, null)\n                builder.setTitle(info.name).setView(root)\n                root.findViewById<TextView>(R.id.tv_script_info).text = buildString {\n                    append(\"脚本类型：\")\n                    append(ScriptHostFactory.NAMES[info.scriptType])\n                    append(\"\\n大小：\")\n                    append(formatFileLength(info.fileLength))\n                    append(\"\\n作者：\")\n                    append(info.author)\n                    append(\"\\n版本：\")\n                    append(info.version)\n                    append(\"\\n说明：\")\n                    append(info.description)\n                }\n                val deleteBotton = root.findViewById<ImageButton>(R.id.btn_delete)\n                val openBotton = root.findViewById<ImageButton>(R.id.btn_edit)\n                val reloadBotton = root.findViewById<ImageButton>(R.id.btn_reload)\n                val saveBotton = root.findViewById<ImageButton>(R.id.btn_save)\n                val dialog = builder.create()\n                deleteBotton.setOnClickListener {\n                    listener.onDeleteScript(scriptIndex)\n                    dialog.dismiss()\n                }\n                openBotton.setOnClickListener {\n                    listener.onOpenScript(scriptIndex)\n                    dialog.dismiss()\n                }\n                reloadBotton.setOnClickListener {\n                    listener.onReloadScript(scriptIndex)\n                    dialog.dismiss()\n                }\n                saveBotton.setOnClickListener {\n                    listener.onSaveScript(scriptIndex)\n                    dialog.dismiss()\n                }\n                dialog\n            }\n\n        } ?: throw IllegalStateException(\"Activity cannot be null\")\n    }\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/ui/script/ScriptListAdapter.kt",
    "content": "package io.github.mzdluo123.mirai.android.ui.script\n\nimport android.util.Log\nimport android.widget.Switch\nimport androidx.cardview.widget.CardView\nimport com.chad.library.adapter.base.BaseQuickAdapter\nimport com.chad.library.adapter.base.viewholder.BaseViewHolder\nimport io.github.mzdluo123.mirai.android.R\nimport io.github.mzdluo123.mirai.android.script.ScriptHost\n\nclass ScriptListAdapter(var fragment: ScriptFragment) :\n    BaseQuickAdapter<ScriptHost.ScriptInfo, BaseViewHolder>(R.layout.item_script) {\n    override fun convert(holder: BaseViewHolder, item: ScriptHost.ScriptInfo) {\n        with(holder) {\n            setText(R.id.tv_script_alias, item.name)\n            setText(R.id.tv_script_author, item.author)\n            setText(R.id.tv_script_version, item.version)\n            holder.getView<CardView>(R.id.cv_item).setOnClickListener {\n                fragment.showScriptInfo(holder.layoutPosition)\n            }\n            holder.getView<Switch>(R.id.swt_enable).apply {\n                Log.i(\"item.enable\", item.enable.toString())\n                setOnCheckedChangeListener(null)\n                setChecked(item.enable)\n                setOnCheckedChangeListener { _, check ->\n                    Log.i(\"checkChange\", check.toString())\n                    if (check) fragment.onEnableScript(holder.layoutPosition)\n                    else fragment.onDisableScript(holder.layoutPosition)\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/ui/script/ScriptViewModel.kt",
    "content": "package io.github.mzdluo123.mirai.android.ui.script\n\n\nimport androidx.lifecycle.*\nimport io.github.mzdluo123.mirai.android.IbotAidlInterface\nimport io.github.mzdluo123.mirai.android.IdleResources\nimport io.github.mzdluo123.mirai.android.script.ScriptHost\nimport io.github.mzdluo123.mirai.android.script.ScriptManager\nimport kotlinx.coroutines.launch\nimport java.io.File\n\nclass ScriptViewModel(private val serviceHelper: IbotAidlInterface) : ViewModel() {\n    val hosts = MutableLiveData<List<ScriptHost.ScriptInfo>>()\n\n    val hostSize: Int\n        get() = serviceHelper.scriptSize\n\n    fun observe(owner: LifecycleOwner, observer: Observer<in List<ScriptHost.ScriptInfo>>) =\n        hosts.observe(owner, observer)\n\n    fun createScriptFromFile(scriptFile: File, type: Int): Boolean {\n        val result = serviceHelper.createScript(scriptFile.absolutePath, type)\n        if (!result) return false\n        refreshScriptList()\n        return true\n    }\n\n    fun refreshScriptList() = viewModelScope.launch {\n        hosts.postValue(ScriptManager.unPackHostInfos(serviceHelper.getHostList()))\n    }\n\n    fun withLoadingIdleResources(content: () -> Unit) {\n        IdleResources.loadingData.increment()\n        content()\n        IdleResources.loadingData.decrement()\n    }\n\n\n    fun reloadScript(index: Int) =\n        serviceHelper.reloadScript(index).also { refreshScriptList() }\n\n    fun deleteScript(index: Int) =\n        withLoadingIdleResources { serviceHelper.deleteScript(index).also { refreshScriptList() } }\n\n    fun openScript(index: Int) = withLoadingIdleResources { serviceHelper.openScript(index) }\n\n    fun enableScript(index: Int) =\n        withLoadingIdleResources { serviceHelper.enableScript(index).also { refreshScriptList() } }\n\n    fun disableScript(index: Int) =\n        withLoadingIdleResources { serviceHelper.disableScript(index).also { refreshScriptList() } }\n\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/ui/setting/SettingFragment.kt",
    "content": "package io.github.mzdluo123.mirai.android.ui.setting\n\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Build\nimport android.os.Bundle\nimport android.os.PowerManager\nimport android.provider.Settings\nimport android.text.InputType\nimport androidx.core.content.ContextCompat\nimport androidx.preference.EditTextPreference\nimport androidx.preference.PreferenceFragmentCompat\nimport androidx.preference.PreferenceManager\nimport androidx.preference.SwitchPreference\nimport io.github.mzdluo123.mirai.android.R\n\n\nclass SettingFragment : PreferenceFragmentCompat() {\n    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {\n        preferenceManager.sharedPreferencesName = \"setting\"\n        setPreferencesFromResource(R.xml.setting_screen, rootKey)\n\n        findPreference<EditTextPreference>(\"log_buffer_preference\")?.apply {\n            summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()\n            setOnBindEditTextListener {\n                it.inputType = InputType.TYPE_CLASS_NUMBER\n            }\n        }\n\n\n        findPreference<EditTextPreference>(\"status_refresh_count\")?.apply {\n            summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()\n            setOnBindEditTextListener {\n                it.inputType = InputType.TYPE_CLASS_NUMBER\n            }\n        }\n\n        findPreference<SwitchPreference>(\"ignore_battery_optimization\")?.apply {\n            /*\n            setOnPreferenceClickListener { preference ->\n                true\n            }\n            */\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n                intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply {\n                    data = Uri.parse(\"package:\" + requireActivity().packageName)\n                }\n            }\n\n        }\n    }\n\n    override fun onResume() {\n        super.onResume()\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n            val hasIgnored = ContextCompat.getSystemService(\n                requireContext(),\n                PowerManager::class.java\n            )!!.isIgnoringBatteryOptimizations(requireContext().packageName)\n\n            PreferenceManager.getDefaultSharedPreferences(requireContext()).apply {\n                edit().putBoolean(\"ignore_battery_optimization\", hasIgnored).apply()\n            }\n        }\n\n    }\n\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/utils/CommandFastRegister.kt",
    "content": "package io.github.mzdluo123.mirai.android.utils\n\nimport net.mamoe.mirai.console.command.Command\nimport net.mamoe.mirai.console.command.CommandManager\nimport net.mamoe.mirai.console.command.CommandOwner\nimport net.mamoe.mirai.console.command.CommandSender\n\nfun CommandOwner.register(\n    _alias: List<String> = listOf(),\n    _description: String,\n    _name: String,\n    _usage: String = \"/$_name\",\n    _block :suspend (CommandSender, List<String>) -> Boolean\n){\n    CommandManager.register(this, object : Command {\n        override val alias: List<String>\n            get() = _alias\n        override val description: String\n            get() = _description\n        override  val name: String\n            get() = _name\n        override val usage: String\n            get() = _usage\n        override suspend fun onCommand(sender: CommandSender, args: List<String>): Boolean {\n            return _block(sender,args)\n        }\n    })\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/utils/DeviceStatus.java",
    "content": "package io.github.mzdluo123.mirai.android.utils;\n\nimport android.app.ActivityManager;\nimport android.content.Context;\nimport android.net.ConnectivityManager;\nimport android.net.NetworkInfo;\nimport android.telephony.TelephonyManager;\nimport android.text.format.Formatter;\n\nimport java.io.BufferedReader;\nimport java.io.FileNotFoundException;\nimport java.io.FileReader;\nimport java.io.IOException;\nimport java.io.InputStream;\n\npublic class DeviceStatus {\n    public static String getSystemAvaialbeMemorySize(Context context) {\n        ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);\n        // 获得MemoryInfo对象\n        ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();\n        // 获得系统可用内存，保存在MemoryInfo对象上\n        mActivityManager.getMemoryInfo(memoryInfo);\n        long memSize = memoryInfo.availMem;\n        // 字符类型转换\n        String availMemStr = Formatter.formatFileSize(context, memSize);// 调用系统函数，字符串转换 long -String KB/MB\n        return availMemStr;\n    }\n\n    public static String getTotalMemory(Context context) {\n        String str1 = \"/proc/meminfo\";// 系统内存信息文件\n        String str2;\n        String[] arrayOfString;\n        String initial_memory = \"\";\n        try {\n            FileReader localFileReader = new FileReader(str1);\n            BufferedReader localBufferedReader = new BufferedReader(localFileReader, 8192);\n            str2 = localBufferedReader.readLine();// 读取meminfo第一行，系统总内存大小\n            arrayOfString = str2.split(\"//s+\");\n            String mom = arrayOfString[0].split(\":\")[1].split(\"kB\")[0];\n            initial_memory = Formatter.formatFileSize(context, Integer.valueOf(mom.trim()).intValue() * 1024); // 获得系统总内存，单位是MB，转换为GB\n            localBufferedReader.close();\n        } catch (IOException e) {\n        }\n        return initial_memory;// Byte转换为KB或者MB，内存大小规格化\n    }\n\n\n    enum NetState {\n        WIFI(\"wifi\", 1), CDMA(\"2G\", 2), UMTS(\"3G\", 3), LTE(\"4G\", 4), UNKOWN(\"unkonw\", 5);\n        private int state;\n        private String type;\n\n        NetState(String type, int state) {\n            this.state = state;\n            this.type = type;\n        }\n    }\n\n    public static String getCurrentNetType(Context context) {\n        // String type = \"unknown\";\n        int state = NetState.UNKOWN.state;\n        String type = NetState.UNKOWN.type;\n        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);\n        NetworkInfo info = cm.getActiveNetworkInfo();\n\n        if (info == null) {\n            // type = \"unknown\";\n            state = NetState.UNKOWN.state;\n            ;\n        } else if (info.getType() == ConnectivityManager.TYPE_WIFI) {\n            // type = \"wifi\";\n            state = NetState.WIFI.state;\n        } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) {\n            int subType = info.getSubtype();\n            if (subType == TelephonyManager.NETWORK_TYPE_CDMA || subType == TelephonyManager.NETWORK_TYPE_GPRS\n                    || subType == TelephonyManager.NETWORK_TYPE_EDGE) {\n                // type = \"2g\";\n                state = NetState.CDMA.state;\n            } else if (subType == TelephonyManager.NETWORK_TYPE_UMTS || subType == TelephonyManager.NETWORK_TYPE_HSDPA\n                    || subType == TelephonyManager.NETWORK_TYPE_EVDO_A\n                    || subType == TelephonyManager.NETWORK_TYPE_EVDO_0\n                    || subType == TelephonyManager.NETWORK_TYPE_EVDO_B) {\n                // type = \"3g\";\n                state = NetState.UMTS.state;\n            } else {// LTE是3g到4g的过渡，是3.9G的全球标准 if (subType ==\n                // TelephonyManager.NETWORK_TYPE_LTE)\n                // type = \"4g\";\n                state = NetState.LTE.state;\n            }\n        }\n        switch (state) {\n            case 1:\n                type = NetState.WIFI.type;\n                break;\n            case 2:\n                type = NetState.CDMA.type;\n                break;\n            case 3:\n                type = NetState.UMTS.type;\n                break;\n            case 4:\n                type = NetState.LTE.type;\n                break;\n            case 5:\n            default:\n                type = NetState.UNKOWN.type;\n                break;\n        }\n        return type;\n\n    }\n\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/utils/DexCompiler.java",
    "content": "package io.github.mzdluo123.mirai.android.utils;\n\nimport android.util.Log;\n\nimport com.android.tools.r8.CompilationFailedException;\nimport com.android.tools.r8.D8;\nimport com.android.tools.r8.D8Command;\nimport com.android.tools.r8.OutputMode;\n\nimport net.lingala.zip4j.ZipFile;\nimport net.lingala.zip4j.exception.ZipException;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.ArrayList;\n\n\npublic class DexCompiler {\n    private File tempDir, pluginDir;\n\n    public DexCompiler(File fileDir, File cache) {\n        tempDir = cache;\n        if (!tempDir.exists()){\n            tempDir.mkdir();\n        }\n        pluginDir = new File(fileDir.getAbsolutePath(), \"plugins\");\n    }\n\n    public File compile(File jarFile, Boolean desugaring) throws CompilationFailedException, IOException {\n        String outName = jarFile.getName().substring(0, jarFile.getName().length() - 4) +\n                \"-android.jar\";\n        File outFile = new File(tempDir, outName).getAbsoluteFile();\n//        if (!outFile.exists()) {\n//            outFile.createNewFile();\n//        }\n        Log.e(\"输出路径\", outFile.getAbsolutePath());\n        D8Command.Builder command = D8Command.builder()\n                .addProgramFiles(jarFile.getAbsoluteFile().toPath())\n                .setOutput(outFile.toPath(), OutputMode.DexIndexed)\n                .setMinApiLevel(26);\n\n        if (!desugaring) {\n            command.setDisableDesugaring(true);\n        }\n\n//        String[] cmd = new String[3];\n//        cmd[0] = \"--output\";\n//        cmd[1] = outFile.getAbsolutePath();\n//        cmd[2] = jarFile.getAbsolutePath();\n//        D8Command command = D8Command.parse(cmd, Origin.root()).build();\n        D8.run(command.build());\n        return outFile;\n    }\n\n    public void copyResourcesAndMove(File origin, File newFile) throws IOException {\n        ZipFile originZip = new ZipFile(origin);\n        ZipFile newZip = new ZipFile(newFile);\n        ArrayList<File> resources = new ArrayList<>();\n        originZip.getFileHeaders().forEach(i -> {\n            try {\n                originZip.extractFile(i, tempDir.getAbsolutePath());\n            } catch (ZipException e) {\n                e.printStackTrace();\n            }\n        });\n\n        for (File file : tempDir.listFiles()) {\n            if (file.isFile() && !file.getName().equals(newFile.getName())) {\n                resources.add(file);\n            }\n        }\n        newZip.addFiles(resources);\n        newZip.addFolder(new File(tempDir, \"META-INF\"));\n        newFile.renameTo(new File(pluginDir, newFile.getName()));\n    }\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/utils/LoopQueue.java",
    "content": "//--------------------------------------------------\n// Class LimitedLoopQueue\n//--------------------------------------------------\n// Written by Kenvix <i@kenvix.com>\n//--------------------------------------------------\n\npackage io.github.mzdluo123.mirai.android.utils;\n\nimport org.jetbrains.annotations.Contract;\nimport org.jetbrains.annotations.NotNull;\nimport org.jetbrains.annotations.Nullable;\n\nimport java.util.Collection;\nimport java.util.Iterator;\nimport java.util.NoSuchElementException;\nimport java.util.Queue;\n\n@SuppressWarnings(\"unchecked\")\npublic class LoopQueue<E> implements Queue<E> {\n    @Nullable\n    private Object[] container;\n\n    private int insertPos = 0;\n    private int headElementPos = 0;\n\n    public LoopQueue(int size) {\n        this.container = new Object[size];\n    }\n\n    @Override\n    public int size() {\n        if (insertPos >= headElementPos)\n            return insertPos - headElementPos;\n        else\n            return container.length - (headElementPos - insertPos);\n    }\n\n    @Override\n    public boolean isEmpty() {\n        return insertPos == headElementPos;\n    }\n\n    @Override\n    public boolean contains(@Nullable Object o) {\n        if (o == null)\n            return false;\n\n        for (int i = 0; i < size(); i++) {\n            int pos = elementIndexOf(i);\n            if (o.equals(container[pos]))\n                return true;\n        }\n\n        return false;\n    }\n\n    @NotNull\n    @Override\n    public Iterator<E> iterator() {\n        return new Iterator<E>() {\n            private int iterHeadElementPos = headElementPos;\n\n            @Override\n            public boolean hasNext() {\n                return insertPos != iterHeadElementPos;\n            }\n\n            @Override\n            public E next() {\n                E head = (E) container[iterHeadElementPos];\n                iterHeadElementPos = (iterHeadElementPos + 1) % container.length;\n\n                return head;\n            }\n        };\n    }\n\n    @NotNull\n    @Override\n    public E[] toArray() {\n        Object[] result = new Object[size()];\n\n        for (int i = 0; i < size(); i++) {\n            int pos = elementIndexOf(i);\n            result[i] = container[pos];\n        }\n\n        return (E[]) result;\n    }\n\n    @NotNull\n    @Override\n    public <T> T[] toArray(@NotNull T[] a) {\n        Object[] result;\n        int size = size();\n\n        if (a.length >= size)\n            result = a;\n        else\n            result = new Object[size()];\n\n        for (int i = 0; i < size(); i++) {\n            int pos = elementIndexOf(i);\n            result[i] = container[pos];\n        }\n\n        return (T[]) result;\n    }\n\n    private void nextElementPos() {\n        container[headElementPos] = null;\n        headElementPos = (headElementPos + 1) % container.length;\n    }\n\n    private void nextInsertPos() {\n        insertPos = (insertPos + 1) % container.length;\n    }\n\n    @Contract(value = \"null -> fail; !null -> param1\", pure = true)\n    private <T> T assertElementNotNull(T obj) {\n        if (obj == null)\n            throw new NoSuchElementException();\n        else\n            return obj;\n    }\n\n    private int elementIndexOf(int offset) {\n        return (headElementPos + offset) % container.length;\n    }\n\n    @Override\n    public boolean add(E e) {\n        container[insertPos] = e;\n\n        if (((insertPos + 1) % container.length) == headElementPos) {\n            nextElementPos();\n        }\n\n        nextInsertPos();\n        return true;\n    }\n\n    @Override\n    public boolean remove(Object o) {\n        return false;\n    }\n\n    @Override\n    public boolean containsAll(@NotNull Collection<?> c) {\n        return false; //TODO\n    }\n\n    @Override\n    public boolean addAll(@NotNull Collection<? extends E> c) {\n        return false; //TODO\n    }\n\n    @Override\n    public boolean removeAll(@NotNull Collection<?> c) {\n        return false; //TODO\n    }\n\n    @Override\n    public boolean retainAll(@NotNull Collection<?> c) {\n        return false; //TODO\n    }\n\n    @Override\n    public void clear() {\n        for (int i = 0; i < size(); i++) {\n            container[elementIndexOf(i)] = null;\n        }\n    }\n\n    @Override\n    public boolean offer(E e) {\n        return add(e);\n    }\n\n    @Override\n    public E remove() {\n        return assertElementNotNull(poll());\n    }\n\n    @Override\n    public E poll() {\n        E head = peek();\n        nextElementPos();\n\n        return head;\n    }\n\n    @Override\n    public E element() {\n        return assertElementNotNull(peek());\n    }\n\n    @Override\n    public E peek() {\n        return (E) container[headElementPos];\n    }\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/utils/MiraiAndroidStatus.kt",
    "content": "package io.github.mzdluo123.mirai.android.utils\n\nimport android.content.Context\nimport android.os.Build\nimport io.github.mzdluo123.mirai.android.AppSettings\nimport io.github.mzdluo123.mirai.android.BotApplication\nimport io.github.mzdluo123.mirai.android.BuildConfig\nimport splitties.experimental.ExperimentalSplittiesApi\nimport java.text.SimpleDateFormat\n\nclass MiraiAndroidStatus (\n    var miraiAndroidVersion:String,\n    var coreVersion:String,\n    var luaMiraiVersion:String,\n    var releaseVersion:String,\n    var sdkVersion:Int,\n    var memorySize:String,\n    var netType:String,\n    var startTime:String,\n    var logBuffer:Int\n) {\n    @ExperimentalSplittiesApi\n    @ExperimentalUnsignedTypes\n    companion object {\n        var startTime: Long = 0\n        fun recentStatus(context: Context = BotApplication.context): MiraiAndroidStatus =\n            MiraiAndroidStatus(\n                context.packageManager.getPackageInfo(context.packageName, 0).versionName,\n                BuildConfig.COREVERSION,\n                BuildConfig.LUAMIRAI_VERSION,\n                Build.VERSION.RELEASE,\n                Build.VERSION.SDK_INT,\n                DeviceStatus.getSystemAvaialbeMemorySize(context.applicationContext),\n                DeviceStatus.getCurrentNetType(context.applicationContext),\n                SimpleDateFormat.getDateTimeInstance().format(startTime),\n                AppSettings.logBuffer\n            )\n    }\n\n    fun format():String = buildString{\n        append(\"MiraiAndroid v\")\n        append(miraiAndroidVersion)\n        append(\"\\n\")\n\n        append(\"MiraiCore v\")\n        append(coreVersion)\n        append(\"\\n\")\n\n        append(\"LuaMirai v\")\n        append(luaMiraiVersion)\n        append(\"\\n\")\n\n        append(\"系统版本 \")\n        append(releaseVersion)\n        append(\" SDK \")\n        append(sdkVersion)\n        append(\"\\n\")\n\n        append(\"内存可用 \")\n        append(memorySize)\n        append(\"\\n\")\n\n        append(\"网络 \")\n        append(netType)\n        append(\"\\n\")\n\n        append(\"启动时间 \")\n        append(startTime)\n        append(\"\\n\")\n\n        append(\"日志缓存行数 \")\n        append(logBuffer)\n    }\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/utils/TextSharer.kt",
    "content": "package io.github.mzdluo123.mirai.android.utils\n\nimport android.content.Context\nimport android.content.Intent\nimport androidx.lifecycle.LifecycleCoroutineScope\nimport io.github.mzdluo123.mirai.android.IdleResources\nimport kotlinx.coroutines.*\nimport splitties.alertdialog.appcompat.alertDialog\nimport splitties.alertdialog.appcompat.message\nimport splitties.alertdialog.appcompat.title\nimport splitties.toast.toast\n\n\nfun Context.shareText(text: String, scope: LifecycleCoroutineScope) {\n    scope.launch {\n        val waitingDialog = alertDialog {\n            message = \"正在上传\"\n            title = \"请稍后\"\n            //setCancelable(false)\n        }\n        waitingDialog.show()\n        IdleResources.loadingData.increment()\n        val errorHandle = CoroutineExceptionHandler { _, _ ->\n            waitingDialog.dismiss()\n            toast(\"上传失败！\")\n        }\n        val url = async(errorHandle) { paste(text) }\n        withContext(Dispatchers.Main) {\n            val urlResult = url.await()\n            waitingDialog.dismiss()\n            IdleResources.loadingData.decrement()\n            startActivity(Intent.createChooser(Intent(Intent.ACTION_SEND).apply {\n                type = \"text/plain\"\n                putExtra(Intent.EXTRA_SUBJECT, \"MiraiAndroid日志分享\")\n                putExtra(Intent.EXTRA_TEXT, urlResult)\n                flags = Intent.FLAG_ACTIVITY_NEW_TASK\n            }, \"分享到\"))\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/utils/dnsQuery.kt",
    "content": "package io.github.mzdluo123.mirai.android.utils\n\nimport io.github.mzdluo123.mirai.android.BotApplication\nimport io.ktor.client.request.get\nimport kotlinx.coroutines.runBlocking\nimport kotlinx.serialization.json.jsonArray\nimport kotlinx.serialization.json.jsonObject\nimport kotlinx.serialization.json.jsonPrimitive\nimport okhttp3.Dns\nimport java.net.InetAddress\n\n@ExperimentalUnsignedTypes\nclass SafeDns : Dns {\n    override fun lookup(hostname: String): List<InetAddress> {\n        return runBlocking {\n            val res =\n                BotApplication.httpClient.value.get<String>(\"https://cloudflare-dns.com/dns-query?name=$hostname&type=A\") {\n                    headers.append(\"accept\", \"application/dns-json\")\n                }\n            val json = BotApplication.json.value.parseToJsonElement(res)\n            return@runBlocking listOf(\n                InetAddress.getByName(\n                    json.jsonObject[\"Answer\"]?.jsonArray?.get(\n                        0\n                    )?.jsonObject?.get(\"data\")?.jsonPrimitive?.content\n                )\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/utils/fileUtils.kt",
    "content": "package io.github.mzdluo123.mirai.android.utils\n\nimport android.content.Context\nimport android.content.DialogInterface\nimport android.net.Uri\nimport android.view.View\nimport android.widget.EditText\nimport androidx.appcompat.app.AlertDialog\nimport io.github.mzdluo123.mirai.android.R\nimport kotlinx.coroutines.CompletableDeferred\nimport java.io.File\nimport java.io.IOException\n\n@Throws(IOException::class)\nfun Context.copyToFileDir(uri: Uri, name: String, path: String): File {\n    val plugin = File(path, name)\n    plugin.createNewFile()\n    val output = plugin.outputStream()\n    this.contentResolver?.openInputStream(uri)?.use {\n        val buf = ByteArray(1024)\n        var bytesRead: Int\n        while (it.read(buf).also { bytesRead = it } > 0) {\n            output.write(buf, 0, bytesRead)\n        }\n    }\n    output.close()\n    return plugin\n}\n\nfun formatFileLength(length: Long): String? {\n    var length = length\n    val suffixs = arrayOf(\"B\", \"K\", \"M\", \"G\", \"T\", \"P\")\n    var suffixIndex = 0\n    var remain = 0f\n    while (length >= 1024) {\n        remain = (remain + length % 1024) / 1024\n        length /= 1024\n        suffixIndex++\n    }\n    return String.format(\"%.2f%s\", remain + length, suffixs[suffixIndex])\n}\n\nsuspend fun Context.askFileName(): String? {\n        val name = CompletableDeferred<String?>()\n        val view = View.inflate(this@askFileName, R.layout.dialog_ask_filename,null)\n        val editText = view.findViewById<EditText>(R.id.filename_input)\n        val dialog = AlertDialog.Builder(this@askFileName)\n            .setView(view)\n            .setPositiveButton(\"确定\", DialogInterface.OnClickListener { _, _ ->\n                name.complete(editText.text.toString())\n            })\n            .setNegativeButton(\n                \"取消\", DialogInterface.OnClickListener { _, _ ->\n                    name.complete(null)\n                })\n            .setCancelable(false)\n            .setTitle(\"请输入文件名称\")\n            .create()\n        dialog.show()\n        return name.await()?.trim()\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/io/github/mzdluo123/mirai/android/utils/pasteBin.kt",
    "content": "package io.github.mzdluo123.mirai.android.utils\n\nimport io.github.mzdluo123.mirai.android.BotApplication\nimport io.ktor.client.request.forms.MultiPartFormDataContent\nimport io.ktor.client.request.forms.formData\nimport io.ktor.client.request.post\nimport io.ktor.client.statement.HttpResponse\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.withContext\n\n@OptIn(ExperimentalUnsignedTypes::class)\n\nsuspend fun paste(text: String): String {\n    return withContext(Dispatchers.IO) {\n        val res = BotApplication.httpClient.value.post<HttpResponse>(\"https://paste.ubuntu.com/\") {\n            body = MultiPartFormDataContent(formData {\n                append(\"poster\", \"MiraiAndroid\")\n                append(\"syntax\", \"text\")\n                append(\"expiration\", \"\")\n                append(\"content\", text)\n            })\n        }\n        return@withContext \"https://paste.ubuntu.com\" + res.headers[\"Location\"].toString()\n    }\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/java/java/awt/image/BufferedImage.java",
    "content": "package java.awt.image;\n\n//防止崩溃\npublic class BufferedImage {\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/color/color_drawer_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:color=\"@color/colorMenuSelected\" android:state_checked=\"true\" />\n    <item android:color=\"@color/colorNavText\" />\n</selector>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_add_white_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:pathData=\"M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"/>\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_android_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:pathData=\"M17.6,11.48 L19.44,8.3a0.63,0.63 0,0 0,-1.09 -0.63l-1.88,3.24a11.43,11.43 0,0 0,-8.94 0L5.65,7.67a0.63,0.63 0,0 0,-1.09 0.63L6.4,11.48A10.81,10.81 0,0 0,1 20L23,20A10.81,10.81 0,0 0,17.6 11.48ZM7,17.25A1.25,1.25 0,1 1,8.25 16,1.25 1.25,0 0,1 7,17.25ZM17,17.25A1.25,1.25 0,1 1,18.25 16,1.25 1.25,0 0,1 17,17.25Z\"\n        android:fillColor=\"@android:color/white\" />\n</vector>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_baseline_folder_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M10,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8c0,-1.1 -0.9,-2 -2,-2h-8l-2,-2z\" />\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_baseline_insert_drive_file_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M6,2c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6L6,2zM13,9L13,3.5L18.5,9L13,9z\" />\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_baseline_keyboard_arrow_up_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M7.41,15.41L12,10.83l4.59,4.58L18,14l-6,-6 -6,6z\" />\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_baseline_publish_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M5,4v2h14L19,4L5,4zM5,14h4v6h6v-6h4l-7,-7 -7,7z\" />\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_battery_alert_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M15.67,4L14,4L14,2h-4v2L8.33,4C7.6,4 7,4.6 7,5.33v15.33C7,21.4 7.6,22 8.33,22h7.33c0.74,0 1.34,-0.6 1.34,-1.33L17,5.33C17,4.6 16.4,4 15.67,4zM13,18h-2v-2h2v2zM13,14h-2L11,9h2v5z\" />\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_chat_bubble_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,2H4c-1.1,0 -2,0.9 -2,2v18l4,-4h14c1.1,0 2,-0.9 2,-2V4c0,-1.1 -0.9,-2 -2,-2z\"/>\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_check_white_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:pathData=\"M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z\"/>\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_delete_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z\"/>\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_desktop_windows_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M21,2L3,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h7v2L8,20v2h8v-2h-2v-2h7c1.1,0 2,-0.9 2,-2L23,4c0,-1.1 -0.9,-2 -2,-2zM21,16L3,16L3,4h18v12z\"/>\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_edit_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z\" />\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_exit_to_app_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M10.09,15.59L11.5,17l5,-5 -5,-5 -1.41,1.41L12.67,11H3v2h9.67l-2.58,2.59zM19,3H5c-1.11,0 -2,0.9 -2,2v4h2V5h14v14H5v-4H3v4c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z\" />\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_extension_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20.5,11H19V7c0,-1.1 -0.9,-2 -2,-2h-4V3.5C13,2.12 11.88,1 10.5,1S8,2.12 8,3.5V5H4c-1.1,0 -1.99,0.9 -1.99,2v3.8H3.5c1.49,0 2.7,1.21 2.7,2.7s-1.21,2.7 -2.7,2.7H2V20c0,1.1 0.9,2 2,2h3.8v-1.5c0,-1.49 1.21,-2.7 2.7,-2.7 1.49,0 2.7,1.21 2.7,2.7V22H17c1.1,0 2,-0.9 2,-2v-4h1.5c1.38,0 2.5,-1.12 2.5,-2.5S21.88,11 20.5,11z\"/>\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_info_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-6h2v6zM13,9h-2L11,7h2v2z\"/>\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_insert_drive_file_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M6,2c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6L6,2zM13,9L13,3.5L18.5,9L13,9z\"/>\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_keyboard_arrow_down_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M7.41,7.84L12,12.42l4.59,-4.58L18,9.25l-6,6 -6,-6z\"/>\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_keyboard_return_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19,7v4H5.83l3.58,-3.59L8,6l-6,6 6,6 1.41,-1.41L5.83,13H21V7z\"/>\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillColor=\"#3DDC84\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_local_printshop_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M19,8L5,8c-1.66,0 -3,1.34 -3,3v6h4v4h12v-4h4v-6c0,-1.66 -1.34,-3 -3,-3zM16,19L8,19v-5h8v5zM19,12c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1zM18,3L6,3v4h12L18,3z\" />\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_new_launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <group\n        android:scaleX=\"0.16740224\"\n        android:scaleY=\"0.16740224\"\n        android:translateX=\"35.817326\"\n        android:translateY=\"35.817326\">\n        <path\n            android:pathData=\"M5.67,5.85l68.73,0l0,113.65l-68.73,92.54l0,-206.19z\"\n            android:fillColor=\"#0c3756\" />\n        <path\n            android:pathData=\"M74.4,5.85l137.46,0l-137.46,68.73l0,-68.73z\"\n            android:fillColor=\"#418fc3\" />\n        <path\n            android:pathData=\"M74.4,119.5l34.48,-44.92l102.98,137.46l0,-206.19l-137.46,68.73l0,44.92z\"\n            android:fillColor=\"#40a5dd\" />\n    </group>\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_refresh_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M17.65,6.35C16.2,4.9 14.21,4 12,4c-4.42,0 -7.99,3.58 -7.99,8s3.57,8 7.99,8c3.73,0 6.84,-2.55 7.73,-6h-2.08c-0.82,2.33 -3.04,4 -5.65,4 -3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6c1.66,0 3.14,0.69 4.22,1.78L13,11h7V4l-2.35,2.35z\" />\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_restore_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M13,3c-4.97,0 -9,4.03 -9,9L1,12l3.89,3.89 0.07,0.14L9,12L6,12c0,-3.87 3.13,-7 7,-7s7,3.13 7,7 -3.13,7 -7,7c-1.93,0 -3.68,-0.79 -4.94,-2.06l-1.42,1.42C8.27,19.99 10.51,21 13,21c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9zM12,8v5l4.28,2.54 0.72,-1.21 -3.5,-2.08L13.5,8L12,8z\" />\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_save_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M17,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,7l-4,-4zM12,19c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM15,9L5,9L5,5h10v4z\" />\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_settings_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24\"\n        android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19.1,12.9a2.8,2.8 0,0 0,0.1 -0.9,2.8 2.8,0 0,0 -0.1,-0.9l2.1,-1.6a0.7,0.7 0,0 0,0.1 -0.6L19.4,5.5a0.7,0.7 0,0 0,-0.6 -0.2l-2.4,1a6.5,6.5 0,0 0,-1.6 -0.9l-0.4,-2.6a0.5,0.5 0,0 0,-0.5 -0.4H10.1a0.5,0.5 0,0 0,-0.5 0.4L9.3,5.4a5.6,5.6 0,0 0,-1.7 0.9l-2.4,-1a0.4,0.4 0,0 0,-0.5 0.2l-2,3.4c-0.1,0.2 0,0.4 0.2,0.6l2,1.6a2.8,2.8 0,0 0,-0.1 0.9,2.8 2.8,0 0,0 0.1,0.9L2.8,14.5a0.7,0.7 0,0 0,-0.1 0.6l1.9,3.4a0.7,0.7 0,0 0,0.6 0.2l2.4,-1a6.5,6.5 0,0 0,1.6 0.9l0.4,2.6a0.5,0.5 0,0 0,0.5 0.4h3.8a0.5,0.5 0,0 0,0.5 -0.4l0.3,-2.6a5.6,5.6 0,0 0,1.7 -0.9l2.4,1a0.4,0.4 0,0 0,0.5 -0.2l2,-3.4c0.1,-0.2 0,-0.4 -0.2,-0.6ZM12,15.6A3.6,3.6 0,1 1,15.6 12,3.6 3.6,0 0,1 12,15.6Z\"/>\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_share_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z\" />\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/ic_store_white_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"#FFFFFF\"\n      android:pathData=\"M20,4L4,4v2h16L20,4zM21,14v-2l-1,-5L4,7l-1,5v2h1v6h10v-6h4v6h2v-6h1zM12,18L6,18v-4h6v4z\" />\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/icon.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"223.44dp\"\n    android:height=\"223.44dp\"\n    android:viewportWidth=\"223.44\"\n    android:viewportHeight=\"223.44\">\n    <path\n        android:pathData=\"M5.67,5.85l68.73,0l0,113.65l-68.73,92.54l0,-206.19z\"\n        android:fillColor=\"#0c3756\" />\n    <path\n        android:pathData=\"M74.4,5.85l137.46,0l-137.46,68.73l0,-68.73z\"\n        android:fillColor=\"#418fc3\" />\n    <path\n        android:pathData=\"M74.4,119.5l34.48,-44.92l102.98,137.46l0,-206.19l-137.46,68.73l0,44.92z\"\n        android:fillColor=\"#40a5dd\" />\n</vector>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/loading_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@color/colorStartBackground\" />\n    <item>\n        <bitmap\n            android:gravity=\"clip_horizontal|center\"\n            android:src=\"@drawable/mirai_b\" />\n    </item>\n</layer-list>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable/side_nav_bar.xml",
    "content": "<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n    <gradient\n        android:angle=\"135\"\n        android:endColor=\"#0C3756\"\n        android:startColor=\"#40A5DD\"\n        android:type=\"linear\" />\n</shape>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path android:pathData=\"M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"85.84757\"\n                android:endY=\"92.4963\"\n                android:startX=\"42.9492\"\n                android:startY=\"49.59793\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#44000000\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#00000000\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\" />\n</vector>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/layout/activity_captcha.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <ImageView\n        android:id=\"@+id/captcha_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"100dp\"\n        android:layout_weight=\"1\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintVertical_bias=\"0.13\" />\n\n    <EditText\n        android:id=\"@+id/captcha_input\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"24dp\"\n        android:layout_marginEnd=\"24dp\"\n        android:layout_weight=\"1\"\n        android:ems=\"10\"\n        android:hint=\"验证码\"\n        android:inputType=\"textPersonName\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/captcha_view\" />\n\n    <Button\n        android:id=\"@+id/captchaConfirm_btn\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:text=\"提交\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/captcha_input\" />\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.drawerlayout.widget.DrawerLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/drawer_layout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:fitsSystemWindows=\"true\"\n    tools:openDrawer=\"start\">\n\n    <include\n        layout=\"@layout/app_bar_main\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <com.google.android.material.navigation.NavigationView\n        android:id=\"@+id/nav_view\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"start\"\n        android:fitsSystemWindows=\"true\"\n        app:headerLayout=\"@layout/nav_header_main\"\n        app:menu=\"@menu/menu_activity_main_drawer\"\n        app:itemTextColor=\"@color/color_drawer_item\"\n        app:itemIconTint=\"@color/color_drawer_item\">\n\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:layout_gravity=\"bottom\"\n            android:layout_marginStart=\"8dp\"\n            android:layout_marginEnd=\"8dp\"\n            android:layout_marginBottom=\"8dp\">\n\n            <Button\n                android:id=\"@+id/btn_exit\"\n                style=\"@style/Widget.MaterialComponents.Button.TextButton\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"bottom\"\n                android:layout_weight=\"1\"\n                android:drawableLeft=\"@drawable/ic_exit_to_app_24dp\"\n                android:text=\"退出应用\"\n                android:textColor=\"@color/color_drawer_item\"\n                android:textSize=\"14sp\" />\n\n            <Button\n                android:id=\"@+id/btn_reboot\"\n                style=\"@style/Widget.MaterialComponents.Button.TextButton\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"bottom\"\n                android:layout_weight=\"1\"\n                android:drawableLeft=\"@drawable/ic_restore_24\"\n                android:text=\"快速重启\"\n                android:textColor=\"@color/color_drawer_item\"\n                android:textSize=\"14sp\" />\n\n        </LinearLayout>\n\n    </com.google.android.material.navigation.NavigationView>\n\n</androidx.drawerlayout.widget.DrawerLayout>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/layout/activity_plugin_import.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <data>\n\n        <variable\n            name=\"pluginData\"\n            type=\"net.mamoe.mirai.console.plugins.PluginDescription\" />\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        tools:context=\".activity.PluginImportActivity\">\n\n        <androidx.cardview.widget.CardView\n            android:id=\"@+id/cardView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"8dp\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_marginEnd=\"8dp\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\">\n\n            <androidx.constraintlayout.widget.ConstraintLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n\n                <TextView\n                    android:id=\"@+id/pluginName_text\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"16dp\"\n                    android:layout_marginTop=\"16dp\"\n                    android:text=\"@{pluginData.name}\"\n                    android:textSize=\"24sp\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    tools:text=\"插件名称\" />\n\n                <TextView\n                    android:id=\"@+id/pluginVersion_text\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"16dp\"\n                    android:text=\"@{pluginData.version}\"\n                    android:textSize=\"14sp\"\n                    app:layout_constraintBottom_toBottomOf=\"@+id/pluginName_text\"\n                    app:layout_constraintStart_toEndOf=\"@+id/pluginName_text\"\n                    tools:text=\"v1.0\" />\n\n                <TextView\n                    android:id=\"@+id/pluginMain_text\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"8dp\"\n                    android:text=\"@{pluginData.basePath}\"\n                    android:textSize=\"14sp\"\n                    app:layout_constraintStart_toStartOf=\"@+id/pluginName_text\"\n                    app:layout_constraintTop_toBottomOf=\"@+id/pluginVersion_text\"\n                    tools:text=\"com.example.xxxx\" />\n\n                <TextView\n                    android:id=\"@+id/pluginAuthor_text\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"8dp\"\n                    android:text=\"@{`BY: `+pluginData.author}\"\n                    android:textSize=\"14sp\"\n                    app:layout_constraintStart_toStartOf=\"@+id/pluginMain_text\"\n                    app:layout_constraintTop_toBottomOf=\"@+id/pluginMain_text\"\n                    tools:text=\"BY: HelloWorld\" />\n\n                <TextView\n                    android:id=\"@+id/pluginInfo_text\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"8dp\"\n                    android:layout_marginEnd=\"16dp\"\n                    android:layout_marginBottom=\"16dp\"\n                    android:maxLines=\"5\"\n\n                    android:singleLine=\"false\"\n                    android:text=\"@{pluginData.info}\"\n                    android:textSize=\"14sp\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"@+id/pluginName_text\"\n                    app:layout_constraintTop_toBottomOf=\"@+id/pluginAuthor_text\"\n                    tools:text=\"这里是插件info信息dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd\n\" />\n            </androidx.constraintlayout.widget.ConstraintLayout>\n        </androidx.cardview.widget.CardView>\n\n        <TextView\n            android:id=\"@+id/textView5\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:text=\"你要导入这个插件吗？\"\n            android:textSize=\"18sp\"\n            app:layout_constraintStart_toStartOf=\"@+id/cardView\"\n            app:layout_constraintTop_toBottomOf=\"@+id/cardView\" />\n\n        <TextView\n            android:id=\"@+id/textView4\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:text=\"请注意，导入未知来源的插件可能会存在未知的风险，如果你信任本插件请点击下面的按钮来完成导入\"\n            app:layout_constraintEnd_toEndOf=\"@+id/cardView\"\n            app:layout_constraintHorizontal_bias=\"1.0\"\n            app:layout_constraintStart_toStartOf=\"@+id/textView5\"\n            app:layout_constraintTop_toBottomOf=\"@+id/textView5\" />\n\n        <TextView\n            android:id=\"@+id/textView6\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"8dp\"\n            android:text=\"该功能为实验性功能，如在导入过程中出现错误请换一台设备重试，或是到群内或是GitHub寻找手动导入方法\"\n            app:layout_constraintEnd_toEndOf=\"@+id/cardView\"\n            app:layout_constraintHorizontal_bias=\"0.5\"\n            app:layout_constraintStart_toStartOf=\"@+id/cardView\"\n            app:layout_constraintTop_toBottomOf=\"@+id/textView4\" />\n\n        <Button\n            android:id=\"@+id/import_btn\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:text=\"导入\"\n            app:layout_constraintEnd_toEndOf=\"@+id/textView4\"\n            app:layout_constraintHorizontal_bias=\"0.498\"\n            app:layout_constraintStart_toStartOf=\"@+id/textView4\"\n            app:layout_constraintTop_toBottomOf=\"@+id/desugaring_checkBox\" />\n\n        <RadioGroup\n            android:id=\"@+id/import_radioGroup\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"24dp\"\n            android:layout_marginTop=\"8dp\"\n            android:layout_marginEnd=\"24dp\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@+id/textView6\">\n\n            <RadioButton\n                android:id=\"@+id/compile_radioButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:checked=\"true\"\n                android:text=\"编译并安装\" />\n\n            <RadioButton\n                android:id=\"@+id/copy_radioButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"仅安装\" />\n        </RadioGroup>\n\n        <CheckBox\n            android:id=\"@+id/desugaring_checkBox\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:checked=\"true\"\n            android:text=\"脱糖(desugaring)\"\n            app:layout_constraintEnd_toEndOf=\"@+id/import_radioGroup\"\n            app:layout_constraintStart_toStartOf=\"@+id/import_radioGroup\"\n            app:layout_constraintTop_toBottomOf=\"@+id/import_radioGroup\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/layout/activity_unsafe_login.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".activity.UnsafeLoginActivity\">\n\n    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout\n        android:id=\"@+id/refresh_unsafe_web\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\">\n\n        <WebView\n            android:id=\"@+id/unsafe_login_web\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/layout/app_bar_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".activity.MainActivity\">\n\n    <com.google.android.material.appbar.AppBarLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/AppTheme.AppBarOverlay\">\n\n        <androidx.appcompat.widget.Toolbar\n            android:id=\"@+id/toolbar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"?attr/actionBarSize\"\n            android:background=\"?attr/colorPrimary\"\n            app:popupTheme=\"@style/AppTheme.PopupOverlay\" />\n\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <include layout=\"@layout/content_main\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/layout/content_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n    tools:showIn=\"@layout/app_bar_main\">\n\n    <fragment\n        android:id=\"@+id/nav_host_fragment\"\n        android:name=\"androidx.navigation.fragment.NavHostFragment\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:defaultNavHost=\"true\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:navGraph=\"@navigation/mobile_navigation\" />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/layout/dialog_ask_filename.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <TextView\n        android:id=\"@+id/textView11\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"24dp\"\n        android:layout_marginTop=\"16dp\"\n        android:layout_marginEnd=\"24dp\"\n        android:text=\"请在此处设置导入的文件名称，文件名称将会作为导入后的插件名称并显示在这里\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <TextView\n        android:id=\"@+id/textView12\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:text=\"需包括扩展名，例如test.jar test.lua test.js等\"\n        app:layout_constraintEnd_toEndOf=\"@+id/textView11\"\n        app:layout_constraintStart_toStartOf=\"@+id/textView11\"\n        app:layout_constraintTop_toBottomOf=\"@+id/textView11\" />\n\n    <EditText\n        android:id=\"@+id/filename_input\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"24dp\"\n        android:layout_marginTop=\"16dp\"\n        android:layout_marginEnd=\"24dp\"\n        android:ems=\"10\"\n        android:hint=\"请输入\"\n        android:inputType=\"textPersonName\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/textView12\" />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/layout/dialog_autologin.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:padding=\"10dp\"\n    android:layout_margin=\"10dp\">\n\n    <TextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"在下面输入你的账号和密码，软件将会保存你的账号和密码并在应用启动时完成登录，你可以随时取消.\" />\n\n    <TextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"我们存储密码的md5值，请注意设备安全\" />\n\n    <EditText\n        android:id=\"@+id/qq_input\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:ems=\"10\"\n        android:hint=\"QQ号\"\n        android:inputType=\"number\" />\n\n    <EditText\n        android:id=\"@+id/password_input\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:ems=\"10\"\n        android:hint=\"密码\"\n        android:inputType=\"textPassword\" />\n</LinearLayout>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/layout/dialog_script_info.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <TextView\n        android:id=\"@+id/tv_script_info\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"10dp\"\n        android:paddingLeft=\"25dp\"\n        android:paddingRight=\"25dp\"\n        android:textAppearance=\"@style/TextAppearance.AppCompat.Medium\"\n        android:textSize=\"16sp\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <ImageButton\n        android:id=\"@+id/btn_delete\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"50dp\"\n        android:layout_marginTop=\"10dp\"\n        android:layout_marginBottom=\"10dp\"\n        android:background=\"#00FFFFFF\"\n        android:contentDescription=\"delete\"\n        android:foreground=\"?android:attr/selectableItemBackgroundBorderless\"\n        android:tint=\"@color/colorBtnImg\"\n        android:src=\"@drawable/ic_delete_black_24dp\"\n        app:layout_constraintDimensionRatio=\"w,1:1\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toLeftOf=\"@id/btn_reload\"\n        app:layout_constraintTop_toBottomOf=\"@id/tv_script_info\"\n        app:layout_constraintBottom_toBottomOf=\"parent\" />\n\n\n    <ImageButton\n        android:id=\"@+id/btn_reload\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"50dp\"\n        android:layout_marginTop=\"10dp\"\n        android:layout_marginBottom=\"10dp\"\n        android:background=\"#00FFFFFF\"\n        android:contentDescription=\"reload\"\n        android:foreground=\"?android:attr/selectableItemBackgroundBorderless\"\n        android:tint=\"@color/colorBtnImg\"\n        android:src=\"@drawable/ic_refresh_black_24dp\"\n        app:layout_constraintDimensionRatio=\"w,1:1\"\n        app:layout_constraintLeft_toRightOf=\"@id/btn_delete\"\n        app:layout_constraintRight_toLeftOf=\"@id/btn_edit\"\n        app:layout_constraintTop_toBottomOf=\"@id/tv_script_info\"\n        app:layout_constraintBottom_toBottomOf=\"parent\" />\n\n    <ImageButton\n        android:id=\"@+id/btn_edit\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"50dp\"\n        android:layout_marginTop=\"10dp\"\n        android:layout_marginBottom=\"10dp\"\n        android:background=\"#00FFFFFF\"\n        android:contentDescription=\"edit\"\n        android:foreground=\"?android:attr/selectableItemBackgroundBorderless\"\n        android:tint=\"@color/colorBtnImg\"\n        android:src=\"@drawable/ic_edit_black_24dp\"\n        app:layout_constraintDimensionRatio=\"w,1:1\"\n        app:layout_constraintRight_toLeftOf=\"@id/btn_save\"\n        app:layout_constraintTop_toBottomOf=\"@id/tv_script_info\"\n        app:layout_constraintLeft_toRightOf=\"@id/btn_reload\"\n        app:layout_constraintBottom_toBottomOf=\"parent\" />\n\n    <ImageButton\n        android:id=\"@+id/btn_save\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"50dp\"\n        android:layout_marginTop=\"10dp\"\n        android:layout_marginBottom=\"10dp\"\n        android:background=\"#00FFFFFF\"\n        android:contentDescription=\"save\"\n        android:foreground=\"?android:attr/selectableItemBackgroundBorderless\"\n        android:tint=\"@color/colorBtnImg\"\n        android:src=\"@drawable/ic_save_black_24dp\"\n        app:layout_constraintDimensionRatio=\"w,1:1\"\n        app:layout_constraintTop_toBottomOf=\"@id/tv_script_info\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintLeft_toRightOf=\"@id/btn_edit\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        android:visibility=\"gone\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/layout/fragment_about.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <data>\n\n        <variable\n            name=\"appVersion\"\n            type=\"String\" />\n\n        <variable\n            name=\"coreVersion\"\n            type=\"String\" />\n    </data>\n\n    <ScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        tools:context=\".ui.about.AboutFragment\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <ImageView\n                android:id=\"@+id/imageView2\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"150dp\"\n                android:src=\"@drawable/mirai_a\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n            <ImageView\n                android:id=\"@+id/imageView3\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"50dp\"\n                android:src=\"@drawable/mirai_b\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@+id/imageView2\" />\n\n            <TextView\n                android:id=\"@+id/textView2\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"24dp\"\n                android:text=\"关于Mirai\"\n                android:textSize=\"24sp\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@+id/btn_join_group\" />\n\n            <TextView\n                android:id=\"@+id/textView3\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"16dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"16dp\"\n                android:text=\"Mirai 是一个在全平台下运行，提供 QQ Android 和 TIM PC 协议支持的高效率机器人库\"\n                android:textAlignment=\"center\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@+id/textView2\" />\n\n            <TextView\n                android:id=\"@+id/textView7\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"16dp\"\n                android:text=\"一切开发旨在学习，请勿用于非法用途\"\n                android:textAlignment=\"center\"\n                android:textSize=\"20sp\"\n                android:textStyle=\"bold\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@+id/github2_bth\" />\n\n            <Button\n                android:id=\"@+id/github_btn\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"8dp\"\n                android:layout_marginTop=\"16dp\"\n                android:layout_marginEnd=\"8dp\"\n                android:text=\"Mirai的Github\"\n                android:textAllCaps=\"false\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@+id/textView3\" />\n\n            <TextView\n                android:id=\"@+id/textView8\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"24dp\"\n                android:text=\"关于MiraiAndroid\"\n                android:textAlignment=\"center\"\n                android:textSize=\"24sp\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@+id/github_btn\" />\n\n            <TextView\n                android:id=\"@+id/textView9\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"8dp\"\n                android:text=\"（实验性）在Android上运行Mirai-console\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@+id/textView8\" />\n\n            <TextView\n                android:id=\"@+id/textView10\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"16dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"16dp\"\n                android:text=\"相比使用Termux或者是Linux Deploy等应用运行mirai的方案，该项目提供的方案具有更好的性能以及更少的资源占用，但可能存在兼容性问题\"\n                android:textAlignment=\"center\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@+id/textView9\" />\n\n            <Button\n                android:id=\"@+id/github2_bth\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"8dp\"\n                android:layout_marginTop=\"16dp\"\n                android:layout_marginEnd=\"8dp\"\n                android:text=\"MiraiAndroid的Github\"\n                android:textAllCaps=\"false\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@+id/textView10\" />\n\n            <TextView\n                android:id=\"@+id/version_text\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"8dp\"\n                android:text=\"@{`MiraiAndroid v`+appVersion+`     MiraiCore v`+coreVersion}\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@+id/imageView3\"\n                tools:text=\"版本号\" />\n\n            <Button\n                android:id=\"@+id/btn_join_group\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"8dp\"\n                android:text=\"加入交流群\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@+id/version_text\" />\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n\n    </ScrollView>\n</layout>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/layout/fragment_home.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".ui.console.ConsoleFragment\">\n\n    <ScrollView\n        android:id=\"@+id/main_scroll\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n\n        app:layout_constraintBottom_toTopOf=\"@+id/command_input\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\">\n\n        <TextView\n            android:id=\"@+id/log_text\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_marginStart=\"8dp\"\n            android:layout_marginEnd=\"8dp\"\n            android:scrollbars=\"vertical\"\n            android:text=\"正在加载...\"\n            android:textIsSelectable=\"false\" />\n\n    </ScrollView>\n\n    <EditText\n        android:id=\"@+id/command_input\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:hint=\"请输入命令\"\n        android:imeOptions=\"actionSend\"\n        android:singleLine=\"true\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toStartOf=\"@+id/commandSend_btn\"\n        app:layout_constraintStart_toEndOf=\"@+id/shortcutBottom_btn\">\n\n    </EditText>\n\n    <ImageButton\n        android:id=\"@+id/commandSend_btn\"\n        android:layout_width=\"50dp\"\n        android:layout_height=\"wrap_content\"\n        android:scaleType=\"fitCenter\"\n        android:src=\"@drawable/ic_keyboard_return_black_24dp\"\n        android:tint=\"@color/colorBtnImg\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@+id/command_input\" />\n\n    <ImageButton\n        android:id=\"@+id/shortcutBottom_btn\"\n        android:layout_width=\"50dp\"\n        android:layout_height=\"wrap_content\"\n        android:src=\"@drawable/ic_baseline_keyboard_arrow_up_24\"\n        android:tint=\"@color/colorBtnImg\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@+id/command_input\">\n\n    </ImageButton>\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/layout/fragment_plugin.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".ui.plugin.PluginFragment\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/plugin_recycler\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/layout/fragment_script.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".ui.script.ScriptFragment\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/script_recycler\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/layout/fragment_script_center.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/rcl_scripts\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/layout/fragment_script_center_empty.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n\n    <ProgressBar\n        android:id=\"@+id/progressBar\"\n        style=\"?android:attr/progressBarStyle\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/layout/fragment_script_empty.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <TextView\n        android:id=\"@+id/textView14\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"当前无脚本\"\n        android:textSize=\"18sp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <Button\n        android:id=\"@+id/btn_script_center\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"前往脚本中心\"\n        android:layout_marginTop=\"20dp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/textView14\" />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/layout/item_plugin.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <androidx.cardview.widget.CardView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginBottom=\"4dp\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <TextView\n                android:id=\"@+id/pluginName_text\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"16dp\"\n                android:layout_marginTop=\"8dp\"\n                android:text=\"未知脚本\"\n                android:textSize=\"18sp\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n            <TextView\n                android:id=\"@+id/pluginSize_text\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginBottom=\"8dp\"\n                android:text=\"大小\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"@+id/pluginName_text\"\n                app:layout_constraintTop_toBottomOf=\"@+id/pluginName_text\" />\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n    </androidx.cardview.widget.CardView>\n</FrameLayout>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/layout/item_script.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <androidx.cardview.widget.CardView\n        android:id=\"@+id/cv_item\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        android:foreground=\"?android:attr/selectableItemBackgroundBorderless\"\n        app:cardElevation=\"0dp\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <TextView\n                android:id=\"@+id/tv_script_alias\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"16dp\"\n                android:layout_marginTop=\"8dp\"\n                android:text=\"未知脚本\"\n                android:textSize=\"18sp\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n            <TextView\n                android:id=\"@+id/tv_script_author\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginBottom=\"8dp\"\n                android:text=\"作者\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"@id/tv_script_alias\"\n                app:layout_constraintTop_toBottomOf=\"@id/tv_script_alias\" />\n\n            <TextView\n                android:id=\"@+id/tv_script_version\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginLeft=\"8dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginBottom=\"8dp\"\n                android:text=\"版本\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintStart_toEndOf=\"@id/tv_script_author\"\n                app:layout_constraintTop_toBottomOf=\"@id/tv_script_alias\" />\n\n\n            <Switch\n                android:id=\"@+id/swt_enable\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginRight=\"5dp\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n    </androidx.cardview.widget.CardView>\n</FrameLayout>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/layout/item_script_center_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <androidx.cardview.widget.CardView\n        android:id=\"@+id/cv_item\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        android:foreground=\"?android:attr/selectableItemBackgroundBorderless\"\n        app:cardElevation=\"0dp\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <ImageView\n                android:id=\"@+id/iv_file\"\n                android:layout_width=\"30dp\"\n                android:layout_height=\"30dp\"\n                android:layout_marginStart=\"10dp\"\n                android:visibility=\"visible\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:srcCompat=\"@drawable/ic_baseline_insert_drive_file_24\" />\n\n            <ImageView\n                android:id=\"@+id/iv_folder\"\n                android:layout_width=\"30dp\"\n                android:layout_height=\"30dp\"\n                android:layout_marginStart=\"10dp\"\n                android:layout_marginTop=\"10dp\"\n                android:layout_marginBottom=\"10dp\"\n                android:visibility=\"invisible\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:srcCompat=\"@drawable/ic_baseline_folder_24\" />\n\n            <TextView\n                android:id=\"@+id/tv_name\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"10dp\"\n                android:text=\"TextView\"\n                android:textSize=\"18sp\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintStart_toEndOf=\"@+id/iv_file\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n        </androidx.constraintlayout.widget.ConstraintLayout>\n    </androidx.cardview.widget.CardView>\n</FrameLayout>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/layout/nav_header_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"@dimen/nav_header_height\"\n    android:background=\"@drawable/side_nav_bar\"\n    android:gravity=\"bottom\"\n    android:orientation=\"vertical\"\n    android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n    android:paddingTop=\"@dimen/activity_vertical_margin\"\n    android:paddingRight=\"@dimen/activity_horizontal_margin\"\n    android:paddingBottom=\"@dimen/activity_vertical_margin\"\n    android:theme=\"@style/ThemeOverlay.AppCompat.Dark\">\n\n    <ImageView\n        android:id=\"@+id/head_imageVIew\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:contentDescription=\"@string/nav_header_desc\"\n        android:paddingTop=\"@dimen/nav_header_vertical_spacing\"\n        app:srcCompat=\"@mipmap/ic_new_launcher_round\" />\n\n    <TextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:paddingTop=\"@dimen/nav_header_vertical_spacing\"\n        android:text=\"MiraiAndroid\"\n        android:textAppearance=\"@style/TextAppearance.AppCompat.Body1\" />\n\n    <TextView\n        android:id=\"@+id/textView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"Mirai-console的Android应用,目前处于实验性阶段\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/menu/menu_activity_main_drawer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:showIn=\"navigation_view\">\n\n    <group android:checkableBehavior=\"single\">\n        <item\n            android:id=\"@+id/nav_console\"\n            android:icon=\"@drawable/ic_desktop_windows_black_24dp\"\n            android:title=\"控制台\" />\n        <item\n            android:id=\"@+id/nav_plugins\"\n            android:icon=\"@drawable/ic_extension_black_24dp\"\n            android:title=\"插件管理\" />\n        <item\n            android:id=\"@+id/nav_scripts\"\n            android:icon=\"@drawable/ic_insert_drive_file_black_24dp\"\n            android:title=\"脚本管理\" />\n\n        <item\n            android:id=\"@+id/nav_setting\"\n            android:icon=\"@drawable/ic_settings_black_24dp\"\n            android:title=\"设置\" />\n        <item\n            android:id=\"@+id/nav_about\"\n            android:icon=\"@drawable/ic_info_black_24dp\"\n            android:title=\"关于\" />\n    </group>\n</menu>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/menu/menu_console.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/action_setAutoLogin\"\n        android:title=\"设置自动登录\" />\n\n    <item\n        android:id=\"@+id/action_report\"\n        android:icon=\"@drawable/ic_share_24\"\n        android:title=\"分享日志\"\n        app:showAsAction=\"always\" />\n    <!--item\n        android:id=\"@+id/action_battery\"\n        android:title=\"忽略电池优化\" /-->\n    <!--item\n        android:id=\"@+id/action_fast_restart\"\n        android:title=\"快速重启\" /-->\n</menu>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/menu/menu_script.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item\n        android:id=\"@+id/action_script_center\"\n        android:icon=\"@drawable/ic_store_white_24\"\n        android:iconTint=\"#FFFFFF\"\n        android:title=\"脚本中心\"\n        app:showAsAction=\"always\" />\n\n    <item\n        android:id=\"@+id/action_add_script\"\n        android:icon=\"@drawable/ic_add_white_24dp\"\n        android:iconTint=\"#FFFFFF\"\n        android:title=\"添加脚本\"\n        app:showAsAction=\"always\" />\n</menu>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/menu/menu_script_center.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item\n        android:id=\"@+id/action_upload_script\"\n        android:icon=\"@drawable/ic_store_white_24\"\n        android:iconTint=\"#FFFFFF\"\n        android:title=\"如何上传脚本\" />\n\n</menu>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/menu/plugin_add.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item\n        android:id=\"@+id/action_add_plugin\"\n        android:icon=\"@drawable/ic_add_white_24dp\"\n        android:iconTint=\"#FFFFFF\"\n        android:title=\"添加插件\"\n        app:showAsAction=\"always\" />\n</menu>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/menu/plugin_manage.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item\n        android:id=\"@+id/action_delete\"\n        android:icon=\"@drawable/ic_delete_black_24dp\"\n        android:title=\"删除\" />\n</menu>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/menu/unsafe_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item\n        android:id=\"@+id/action_finish\"\n        android:icon=\"@drawable/ic_check_white_24dp\"\n        android:title=\"完成验证\"\n        android:visible=\"true\"\n        app:showAsAction=\"always\" />\n</menu>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/mipmap-anydpi-v26/ic_new_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/ic_new_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_new_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/mipmap-anydpi-v26/ic_new_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/ic_new_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_new_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/navigation/mobile_navigation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<navigation xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/mobile_navigation\"\n    app:startDestination=\"@+id/nav_console\">\n\n    <fragment\n        android:id=\"@+id/nav_console\"\n        android:name=\"io.github.mzdluo123.mirai.android.ui.console.ConsoleFragment\"\n        android:label=\"控制台\"\n        tools:layout=\"@layout/fragment_home\"/>\n    <!--fragment\n        android:id=\"@+id/nav_home_second\"\n        android:name=\"io.github.mzdluo123.mirai.android.ui.console.HomeSecondFragment\"\n        android:label=\"@string/home_second\"\n        tools:layout=\"@layout/fragment_home_second\">\n\n        <argument\n            android:name=\"myArg\"\n            app:argType=\"string\" />\n    </fragment-->\n\n    <fragment\n        android:id=\"@+id/nav_plugins\"\n        android:name=\"io.github.mzdluo123.mirai.android.ui.plugin.PluginFragment\"\n        android:label=\"插件管理\"\n        tools:layout=\"@layout/fragment_plugin\" />\n\n    <fragment\n        android:id=\"@+id/nav_scripts\"\n        android:name=\"io.github.mzdluo123.mirai.android.ui.script.ScriptFragment\"\n        android:label=\"脚本管理\"\n        tools:layout=\"@layout/fragment_script\">\n        <action\n            android:id=\"@+id/action_nav_scripts_to_nav_scripts_center\"\n            app:destination=\"@id/nav_scripts_center\" />\n    </fragment>\n\n    <fragment\n        android:id=\"@+id/nav_scripts_center\"\n        android:name=\"io.github.mzdluo123.mirai.android.ui.script.ScriptCenterFragment\"\n        android:label=\"脚本中心\"\n        tools:layout=\"@layout/fragment_script_center\" />\n\n    <fragment\n        android:id=\"@+id/nav_about\"\n        android:name=\"io.github.mzdluo123.mirai.android.ui.about.AboutFragment\"\n        android:label=\"关于\" />\n\n    <fragment\n        android:id=\"@+id/nav_setting\"\n        android:name=\"io.github.mzdluo123.mirai.android.ui.setting.SettingFragment\"\n        android:label=\"设置\" />\n</navigation>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#418FC3</color>\n    <color name=\"colorPrimaryDark\">#12517E</color>\n    <color name=\"colorAccent\">#56BBFF</color>\n    <color name=\"colorBtnImg\">#000000</color>\n    <color name=\"colorMenuSelected\">#1879BA</color>\n    <color name=\"colorNavText\">#000000</color>\n    <color name=\"colorStartBackground\">#FFFFFF</color>\n</resources>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n    <dimen name=\"nav_header_vertical_spacing\">8dp</dimen>\n    <dimen name=\"nav_header_height\">200dp</dimen>\n    <dimen name=\"fab_margin\">16dp</dimen>\n</resources>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/values/ic_new_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_new_launcher_background\">#FFFFFF</color>\n</resources>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">MiraiAndroid</string>\n    <string name=\"navigation_drawer_open\">Open navigation drawer</string>\n    <string name=\"navigation_drawer_close\">Close navigation drawer</string>\n    <string name=\"nav_header_title\">Android Studio</string>\n    <string name=\"nav_header_subtitle\">android.studio@android.com</string>\n    <string name=\"nav_header_desc\">Navigation header</string>\n    <string name=\"action_settings\">Settings</string>\n\n    <string name=\"menu_home\">Home</string>\n    <string name=\"menu_gallery\">Gallery</string>\n    <string name=\"menu_slideshow\">Slideshow</string>\n\n    <string name=\"home_second\">Home Second</string>\n    <string name=\"service_description\">MiraiAndroid用于运行Bot的服务</string>\n    <string name=\"acra_toast_text\">MiraiAndroid运行时发生异常！</string>\n    <string name=\"hello_blank_fragment\">Hello blank fragment</string>\n</resources>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.MaterialComponents.DayNight.DarkActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n\n    </style>\n\n    <style name=\"AppTheme.NoActionBar\">\n        <item name=\"windowActionBar\">false</item>\n        <item name=\"windowNoTitle\">true</item>\n    </style>\n\n    <style name=\"AppTheme.AppBarOverlay\" parent=\"ThemeOverlay.MaterialComponents.Dark.ActionBar\" />\n\n    <style name=\"AppTheme.PopupOverlay\" parent=\"ThemeOverlay.MaterialComponents.Light\" />\n\n    <style name=\"StartTheme\" parent=\"AppTheme\">\n        <item name=\"android:windowBackground\">@drawable/loading_background</item>\n        <item name=\"android:windowFullscreen\">true</item>\n    </style>\n\n\n</resources>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/values-night/colors-night.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <color name=\"colorAccent\">#FFFFFF</color>\n    <color name=\"colorBtnImg\">#FFFFFF</color>\n\n    <color name=\"colorNavText\">#FFFFFF</color>\n    <color name=\"colorStartBackground\">#000000</color>\n</resources>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/values-v21/styles.xml",
    "content": "<resources>\n\n    <style name=\"AppTheme.NoActionBar\">\n        <item name=\"windowActionBar\">false</item>\n        <item name=\"windowNoTitle\">true</item>\n        <item name=\"android:statusBarColor\">@android:color/transparent</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/values-v29/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.DayNight.DarkActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n        <item name=\"android:forceDarkAllowed\">true</item>\n    </style>\n    <style name=\"StartTheme\" parent=\"AppTheme\">\n        <item name=\"android:windowBackground\">@drawable/loading_background</item>\n        <item name=\"android:windowFullscreen\">true</item>\n    </style>\n</resources>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/xml/path_script.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<paths>\n    <external-files-path\n        name=\"script\"\n        path=\"scripts\" />\n</paths>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/app/src/main/res/xml/setting_screen.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <PreferenceCategory android:title=\"日志\">\n\n        <EditTextPreference\n            android:defaultValue=\"300\"\n            android:icon=\"@drawable/ic_local_printshop_24\"\n            android:key=\"log_buffer_preference\"\n            android:selectAllOnFocus=\"true\"\n            android:singleLine=\"true\"\n            android:title=\"日志缓存行数\"\n            app:useSimpleSummaryProvider=\"true\" />\n\n        <SwitchPreference\n            android:defaultValue=\"false\"\n            android:icon=\"@drawable/ic_local_printshop_24\"\n            android:key=\"print_to_logcat_preference\"\n            android:summary=\"你可以使用 TAG: MA 级别:INFO 来看到log\"\n            android:title=\"打印日志到logcat\" />\n\n\n    </PreferenceCategory>\n\n    <PreferenceCategory android:title=\"启动\">\n        <SwitchPreference\n            android:defaultValue=\"false\"\n            android:icon=\"@drawable/ic_android_24\"\n            android:key=\"start_on_boot_preference\"\n            android:summary=\"请加入开机自启白名单以确保能够正常开机启动\"\n            android:title=\"开机启动\" />\n        <SwitchPreference\n            android:defaultValue=\"false\"\n            android:icon=\"@drawable/ic_battery_alert_24\"\n            android:key=\"ignore_battery_optimization\"\n            android:title=\"忽略电池优化\" />\n    </PreferenceCategory>\n\n    <PreferenceCategory android:title=\"其他\">\n        <EditTextPreference\n            android:defaultValue=\"15\"\n            android:icon=\"@drawable/ic_restore_24\"\n            android:key=\"status_refresh_count\"\n            android:selectAllOnFocus=\"true\"\n            android:singleLine=\"true\"\n            android:title=\"状态栏每分钟刷新次数[1-60]\"\n            app:useSimpleSummaryProvider=\"true\" />\n        <SwitchPreference\n            android:defaultValue=\"false\"\n            android:icon=\"@drawable/ic_baseline_publish_24\"\n            android:key=\"allow_push_msg_preference\"\n            android:summary=\"使用方法请看项目GitHub\"\n            android:title=\"允许使用广播推送消息\" />\n    </PreferenceCategory>\n    <EditTextPreference\n        android:selectAllOnFocus=\"true\"\n        android:singleLine=\"true\"\n        android:enabled=\"false\"\n        android:title=\"部分设置重启后才会生效！\" />\n</PreferenceScreen>"
  },
  {
    "path": "mirai-console/frontend/mirai-android/build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    ext.kotlin_version = '1.4.0'\n    repositories {\n        google()\n        jcenter()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:4.0.1'\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n        classpath \"org.jetbrains.kotlin:kotlin-serialization:$kotlin_version\"\n        classpath \"org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version\"\n\n        // https://mvnrepository.com/artifact/com.jfrog.bintray/com.jfrog.bintray.gradle.plugin\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        jcenter()\n        maven { url 'https://jitpack.io' }\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/gradle/wrapper/gradle-wrapper.properties",
    "content": "#Sun Apr 26 21:31:38 CST 2020\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-6.1.1-all.zip\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/gradle.properties",
    "content": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx1536m\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n# AndroidX package structure to make it clearer which packages are bundled with the\n# Android operating system, and which are packaged with your app's APK\n# https://developer.android.com/topic/libraries/support-library/androidx-rn\nandroid.useAndroidX=true\n# Automatically convert third-party libraries to use AndroidX\nandroid.enableJetifier=true\n# Kotlin code style for this project: \"official\" or \"obsolete\":\nkotlin.code.style=official\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/gradlew",
    "content": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windows variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "mirai-console/frontend/mirai-android/settings.gradle",
    "content": "rootProject.name='MiraiAndroid'\ninclude ':app'\n\n"
  },
  {
    "path": "mirai-console/frontend/mirai-console-frontend-base/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nimport BinaryCompatibilityConfigurator.configureBinaryValidator\n\nplugins {\n    kotlin(\"jvm\")\n    kotlin(\"plugin.serialization\")\n    id(\"java\")\n    `maven-publish`\n}\n\nkotlin {\n    explicitApiWarning()\n}\n\ndependencies {\n    compileAndTestRuntime(project(\":mirai-core-utils\"))\n\n    compileAndTestRuntime(project(\":mirai-console\"))\n    compileAndTestRuntime(project(\":mirai-core-api\"))\n    compileAndTestRuntime(project(\":mirai-core-utils\"))\n    compileAndTestRuntime(`kotlin-jvm-blocking-bridge`)\n    compileAndTestRuntime(`kotlin-stdlib-jdk8`)\n}\n\nversion = Versions.consoleTerminal\n\ndescription = \"Console frontend abstract\"\n\nconfigurePublishing(\"mirai-console-frontend-base\")\nconfigureBinaryValidator(null)\n\n"
  },
  {
    "path": "mirai-console/frontend/mirai-console-frontend-base/compatibility-validation/jvm/api/jvm.api",
    "content": "public abstract class net/mamoe/mirai/console/frontendbase/AbstractMiraiConsoleFrontendImplementation : kotlinx/coroutines/CoroutineScope, net/mamoe/mirai/console/MiraiConsoleImplementation {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun createLoggerFactory (Lnet/mamoe/mirai/console/MiraiConsoleImplementation$FrontendLoggingInitContext;)Lnet/mamoe/mirai/utils/MiraiLogger$Factory;\n\tpublic fun getBuiltInPluginLoaders ()Ljava/util/List;\n\tpublic fun getCommandManager ()Lnet/mamoe/mirai/console/command/CommandManager;\n\tpublic fun getConfigStorageForBuiltIns ()Lnet/mamoe/mirai/console/data/PluginDataStorage;\n\tpublic fun getConfigStorageForJvmPluginLoader ()Lnet/mamoe/mirai/console/data/PluginDataStorage;\n\tpublic fun getConsoleDataScope ()Lnet/mamoe/mirai/console/MiraiConsoleImplementation$ConsoleDataScope;\n\tpublic fun getCoroutineContext ()Lkotlin/coroutines/CoroutineContext;\n\tpublic fun getDataStorageForBuiltIns ()Lnet/mamoe/mirai/console/data/PluginDataStorage;\n\tpublic fun getDataStorageForJvmPluginLoader ()Lnet/mamoe/mirai/console/data/PluginDataStorage;\n\tprotected abstract fun getFrontendBase ()Lnet/mamoe/mirai/console/frontendbase/FrontendBase;\n\tpublic fun getJvmPluginLoader ()Lnet/mamoe/mirai/console/plugin/jvm/JvmPluginLoader;\n}\n\npublic abstract class net/mamoe/mirai/console/frontendbase/FrontendBase {\n\tpublic fun <init> ()V\n\tpublic fun getDaemonThreadGroup ()Ljava/lang/ThreadGroup;\n\tpublic fun getLogDropAnsi ()Z\n\tpublic fun getLoggingDirectory ()Ljava/nio/file/Path;\n\tpublic fun getLoggingRecorder ()Lnet/mamoe/mirai/console/frontendbase/logging/LogRecorder;\n\tpublic abstract fun getScope ()Lkotlinx/coroutines/CoroutineScope;\n\tpublic fun getThreadGroup ()Ljava/lang/ThreadGroup;\n\tpublic abstract fun getWorkingDirectory ()Ljava/nio/file/Path;\n\tprotected fun initLogRecorder ()Lnet/mamoe/mirai/console/frontendbase/logging/LogRecorder;\n\tprotected fun initScreen_forwardStdToMiraiLogger ()V\n\tprotected fun initScreen_forwardStdToScreen ()V\n\tpublic fun newDaemon (Ljava/lang/String;Ljava/lang/Runnable;)Ljava/lang/Thread;\n\tpublic fun newThread (Ljava/lang/String;Ljava/lang/Runnable;)Ljava/lang/Thread;\n\tpublic fun newThreadFactory (Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)Ljava/util/concurrent/ThreadFactory;\n\tpublic static synthetic fun newThreadFactory$default (Lnet/mamoe/mirai/console/frontendbase/FrontendBase;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/util/concurrent/ThreadFactory;\n\tpublic abstract fun printToScreenDirectly (Ljava/lang/String;)V\n\tpublic fun recordToLogging (Ljava/lang/String;)V\n}\n\npublic final class net/mamoe/mirai/console/frontendbase/logging/AllDroppedLogRecorder : net/mamoe/mirai/console/frontendbase/logging/LogRecorder {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/console/frontendbase/logging/AllDroppedLogRecorder;\n\tpublic fun record (Ljava/lang/String;)V\n}\n\npublic abstract class net/mamoe/mirai/console/frontendbase/logging/AsyncLogRecorder : net/mamoe/mirai/console/frontendbase/logging/LogRecorder {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/frontendbase/FrontendBase;I)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/console/frontendbase/FrontendBase;IILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tprotected abstract fun asyncRecord (Ljava/lang/String;)V\n\tprotected final fun getChannel ()Lkotlinx/coroutines/channels/Channel;\n\tprotected final fun getDispatcher ()Lkotlinx/coroutines/CoroutineDispatcher;\n\tprotected final fun getSubscope ()Lkotlinx/coroutines/CoroutineScope;\n\tprotected final fun getThreadPool ()Ljava/util/concurrent/ScheduledExecutorService;\n\tpublic fun record (Ljava/lang/String;)V\n}\n\npublic class net/mamoe/mirai/console/frontendbase/logging/AsyncLogRecorderForwarded : net/mamoe/mirai/console/frontendbase/logging/AsyncLogRecorder {\n\tpublic fun <init> (Lnet/mamoe/mirai/console/frontendbase/logging/LogRecorder;Lnet/mamoe/mirai/console/frontendbase/FrontendBase;I)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/console/frontendbase/logging/LogRecorder;Lnet/mamoe/mirai/console/frontendbase/FrontendBase;IILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tprotected fun asyncRecord (Ljava/lang/String;)V\n\tprotected final fun getDelegate ()Lnet/mamoe/mirai/console/frontendbase/logging/LogRecorder;\n}\n\npublic class net/mamoe/mirai/console/frontendbase/logging/DailySplitLogRecorder : net/mamoe/mirai/console/frontendbase/logging/LogRecorder {\n\tprotected field lastDate I\n\tprotected field writer Ljava/io/Writer;\n\tpublic fun <init> (Ljava/nio/file/Path;Lnet/mamoe/mirai/console/frontendbase/FrontendBase;Ljava/time/format/DateTimeFormatter;)V\n\tpublic synthetic fun <init> (Ljava/nio/file/Path;Lnet/mamoe/mirai/console/frontendbase/FrontendBase;Ljava/time/format/DateTimeFormatter;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tprotected final fun acquireFileWriter ()V\n\tprotected final fun getBase ()Lnet/mamoe/mirai/console/frontendbase/FrontendBase;\n\tprotected final fun getDateFormatter ()Ljava/time/format/DateTimeFormatter;\n\tprotected final fun getDirectory ()Ljava/nio/file/Path;\n\tpublic fun record (Ljava/lang/String;)V\n}\n\npublic abstract class net/mamoe/mirai/console/frontendbase/logging/LogRecorder {\n\tpublic fun <init> ()V\n\tpublic abstract fun record (Ljava/lang/String;)V\n}\n\npublic class net/mamoe/mirai/console/frontendbase/logging/WriterLogRecorder : net/mamoe/mirai/console/frontendbase/logging/LogRecorder {\n\tpublic fun <init> (Ljava/io/Writer;Lnet/mamoe/mirai/console/frontendbase/FrontendBase;)V\n\tprotected final fun getBase ()Lnet/mamoe/mirai/console/frontendbase/FrontendBase;\n\tprotected final fun getWriter ()Ljava/io/Writer;\n\tpublic fun record (Ljava/lang/String;)V\n}\n\n"
  },
  {
    "path": "mirai-console/frontend/mirai-console-frontend-base/resources/META-INF/services/org.slf4j.spi.SLF4JServiceProvider",
    "content": "net.mamoe.mirai.console.internal.logging.externalbind.slf4j.MiraiConsoleSLF4JService\n"
  },
  {
    "path": "mirai-console/frontend/mirai-console-frontend-base/src/AbstractMiraiConsoleFrontendImplementation.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.frontendbase\n\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport net.mamoe.mirai.console.command.CommandManager\nimport net.mamoe.mirai.console.data.MultiFilePluginDataStorage\nimport net.mamoe.mirai.console.data.PluginDataStorage\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader\nimport net.mamoe.mirai.console.plugin.loader.PluginLoader\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.console.util.ConsoleInternalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.PlatformLogger\nimport kotlin.coroutines.CoroutineContext\n\n/**\n * [MiraiConsoleImplementation] 的基本抽象实现\n *\n * @param frontendCoroutineName 该前端的名字, 如 `\"MiraiConsoleImplementationTerminal\"`\n * @see FrontendBase\n */\n@OptIn(ConsoleFrontEndImplementation::class)\npublic abstract class AbstractMiraiConsoleFrontendImplementation(\n    frontendCoroutineName: String,\n) : MiraiConsoleImplementation, CoroutineScope {\n\n    // region 此 region 的 字段 / 方法 为 console 默认/内部 实现, 如无必要不建议修改\n    @OptIn(ConsoleInternalApi::class)\n    private val delegateCoroutineScope by lazy {\n        CoroutineScope(\n            SupervisorJob() +\n                    CoroutineName(frontendCoroutineName) +\n                    CoroutineExceptionHandler { coroutineContext, throwable ->\n                        if (throwable is CancellationException) {\n                            return@CoroutineExceptionHandler\n                        }\n                        val coroutineName = coroutineContext[CoroutineName]?.name ?: \"<unnamed>\"\n                        MiraiConsole.mainLogger.error(\"Exception in coroutine $coroutineName\", throwable)\n                    }\n        )\n    }\n    override val coroutineContext: CoroutineContext get() = delegateCoroutineScope.coroutineContext\n\n    override val builtInPluginLoaders: List<Lazy<PluginLoader<*, *>>> = listOf(lazy { JvmPluginLoader })\n    override val jvmPluginLoader: JvmPluginLoader by lazy { backendAccess.createDefaultJvmPluginLoader(coroutineContext) }\n    override val commandManager: CommandManager by lazy { backendAccess.createDefaultCommandManager(coroutineContext) }\n    override val consoleDataScope: MiraiConsoleImplementation.ConsoleDataScope by lazy {\n        @OptIn(ConsoleExperimentalApi::class)\n        MiraiConsoleImplementation.ConsoleDataScope.createDefault(\n            coroutineContext, dataStorageForBuiltIns, configStorageForBuiltIns\n        )\n    }\n\n    @ConsoleExperimentalApi\n    override val dataStorageForJvmPluginLoader: PluginDataStorage by lazy {\n        MultiFilePluginDataStorage(rootPath.resolve(\"data\"))\n    }\n\n    @ConsoleExperimentalApi\n    override val dataStorageForBuiltIns: PluginDataStorage by lazy {\n        MultiFilePluginDataStorage(rootPath.resolve(\"data\"))\n    }\n\n    @ConsoleExperimentalApi\n    override val configStorageForJvmPluginLoader: PluginDataStorage by lazy {\n        MultiFilePluginDataStorage(rootPath.resolve(\"config\"))\n    }\n\n    @ConsoleExperimentalApi\n    override val configStorageForBuiltIns: PluginDataStorage by lazy {\n        MultiFilePluginDataStorage(rootPath.resolve(\"config\"))\n    }\n    // endregion\n\n    // region\n    protected abstract val frontendBase: FrontendBase\n    // endregion\n\n\n    // region Logging\n    @OptIn(MiraiInternalApi::class)\n    override fun createLoggerFactory(context: MiraiConsoleImplementation.FrontendLoggingInitContext): MiraiLogger.Factory {\n        @Suppress(\"INVISIBLE_MEMBER\")\n        frontendBase.initScreen_forwardStdToScreen()\n\n        // region Default Fallback Implementation\n\n        @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n        net.mamoe.mirai.utils.MiraiLoggerFactoryImplementationBridge.defaultLoggerFactory = {\n\n            class DefaultMiraiConsoleFactory : MiraiLogger.Factory {\n                // Don't directly use ::println\n                // ::println will query System.out every time.\n                private val stdout: ((String) -> Unit) = System.out::println\n\n                override fun create(requester: Class<*>, identity: String?): MiraiLogger {\n                    return PlatformLogger(identity ?: requester.kotlin.simpleName ?: requester.simpleName, stdout)\n                }\n            }\n\n            DefaultMiraiConsoleFactory()\n        }\n        // endregion\n\n        val factoryImpl = context.acquirePlatformImplementation()\n        context.invokeAfterInitialization {\n            @Suppress(\"INVISIBLE_MEMBER\")\n            frontendBase.initScreen_forwardStdToMiraiLogger()\n        }\n        return factoryImpl\n    }\n    // endregion\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-console-frontend-base/src/FrontendBase.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.frontendbase\n\nimport kotlinx.coroutines.CoroutineScope\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport net.mamoe.mirai.console.frontendbase.logging.AsyncLogRecorderForwarded\nimport net.mamoe.mirai.console.frontendbase.logging.DailySplitLogRecorder\nimport net.mamoe.mirai.console.frontendbase.logging.LogRecorder\nimport net.mamoe.mirai.utils.MiraiLogger\nimport java.io.PrintStream\nimport java.nio.file.Path\nimport java.util.concurrent.ThreadFactory\nimport java.util.concurrent.atomic.AtomicInteger\n\n\n/**\n * 前端的基本实现\n *\n * @see AbstractMiraiConsoleFrontendImplementation\n */\npublic abstract class FrontendBase {\n    /**\n     * 所属前端的 [CoroutineScope]\n     *\n     * Implementation note: 直接返回前端实例\n     */\n    public abstract val scope: CoroutineScope\n\n    public open val threadGroup: ThreadGroup by lazy {\n        ThreadGroup(\"Mirai Console FrontEnd Threads\")\n    }\n    public open val daemonThreadGroup: ThreadGroup by lazy {\n        ThreadGroup(threadGroup, \"Mirai Console FrontEnd Daemon Threads\")\n    }\n    public open val loggingRecorder: LogRecorder by lazy { initLogRecorder() }\n\n    /**\n     * Console 的运行目录\n     *\n     * Implementation note: 返回 [MiraiConsoleImplementation.rootPath]\n     */\n    public abstract val workingDirectory: Path\n\n    /**\n     * 日志存放目录\n     */\n    public open val loggingDirectory: Path by lazy { workingDirectory.resolve(\"logs\") }\n\n    /**\n     * 存储的日志是否需要去除 ansi 标志\n     */\n    public open val logDropAnsi: Boolean get() = true\n\n    /**\n     * 创建一个新的非守护线程, 此线程不会预先启动\n     */\n    public open fun newThread(name: String, task: Runnable): Thread {\n        return Thread(threadGroup, task, name)\n    }\n\n    /**\n     * 创建一个新的守护线程, 此线程不会预先启动\n     */\n    public open fun newDaemon(name: String, task: Runnable): Thread {\n        return Thread(daemonThreadGroup, task, name).apply {\n            isDaemon = true\n        }\n    }\n\n    /**\n     * 创建一个新的 [ThreadFactory], 创建的线程的名字为 `$name#{counter}`\n     */\n    public open fun newThreadFactory(name: String, isDemon: Boolean, postSetup: (Thread) -> Unit = {}): ThreadFactory {\n        return object : ThreadFactory {\n            private val group = ThreadGroup(if (isDemon) daemonThreadGroup else threadGroup, name)\n            private val counter = AtomicInteger()\n\n            override fun newThread(r: Runnable): Thread {\n                return Thread(group, r, \"$name#${counter.getAndIncrement()}\").also {\n                    it.isDaemon = isDemon\n                }.also(postSetup)\n            }\n        }\n    }\n\n    /**\n     * 将一条信息直接打印到前端的屏幕上\n     *\n     * Implementation note: 打印时不需要添加任何修饰, [msg] 已经是格式化好的信息\n     */\n    public abstract fun printToScreenDirectly(msg: String)\n\n    @Suppress(\"FunctionName\")\n    protected open fun initScreen_forwardStdToScreen() {\n        val forwarder = RepipedMessageForward { msg ->\n            printToScreenDirectly(msg)\n            recordToLogging(msg)\n        }\n        val printer = PrintStream(forwarder.pipedOutputStream, true, \"UTF-8\")\n        System.setOut(printer)\n\n        // stderr is reserved for printing fatal errors when something crashed in logger factory initialization\n    }\n\n    @Suppress(\"FunctionName\")\n    protected open fun initScreen_forwardStdToMiraiLogger() {\n        val logStdout = MiraiLogger.Factory.create(javaClass, \"stdout\")\n        val logStderr = MiraiLogger.Factory.create(javaClass, \"stderr\")\n\n        val forwarderStdout = RepipedMessageForward(logStdout::info)\n        val forwarderStderr = RepipedMessageForward(logStderr::warning)\n\n\n        System.setOut(PrintStream(forwarderStdout.pipedOutputStream, true, \"UTF-8\"))\n        System.setErr(PrintStream(forwarderStderr.pipedOutputStream, true, \"UTF-8\"))\n    }\n\n    /**\n     * 将一条消息记录至日志 (不会显示至屏幕)\n     */\n    public open fun recordToLogging(msg: String) {\n        loggingRecorder.record(msg)\n    }\n\n    protected open fun initLogRecorder(): LogRecorder {\n        return AsyncLogRecorderForwarded(\n            DailySplitLogRecorder(\n                loggingDirectory,\n                this\n            ),\n            this\n        )\n    }\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-console-frontend-base/src/RepipedMessageForward.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.frontendbase\n\nimport java.io.ByteArrayOutputStream\nimport java.io.OutputStream\n\ninternal class RepipedMessageForward(\n    private val output: (String) -> Unit,\n) : ByteArrayOutputStream(1024 * 1024) {\n    internal val pipedOutputStream: OutputStream get() = this\n\n\n    private var lastCheckIndex = 0\n\n    @Synchronized\n    override fun write(b: ByteArray?, off: Int, len: Int) {\n        super.write(b, off, len)\n        flush()\n\n    }\n\n    @Synchronized\n    override fun write(b: Int) {\n        super.write(b)\n        flush()\n    }\n\n    @Synchronized\n    override fun write(b: ByteArray?) {\n        super.write(b)\n        flush()\n    }\n\n    @Synchronized\n    override fun flush() {\n        topLoop@\n        while (true) {\n\n            var index = lastCheckIndex\n            val end = this.count\n            var lastIsLr = false // last char is '\\r'\n            while (index < end) {\n                val c = buf[index].toInt() and 0xFF\n                when (c shr 4) {\n                    in 0..7 -> {\n                        /* 0xxxxxxx*/\n\n                        if (c == '\\r'.code) {\n                            lastIsLr = true\n                        } else if (c == 10) {\n                            // NEW LINE: \\n\n                            val strend = if (lastIsLr) {\n                                index - 1\n                            } else {\n                                index\n                            }\n                            val strx = String(buf, 0, strend, Charsets.UTF_8)\n\n\n                            index++\n                            System.arraycopy(\n                                buf, index, buf, 0, end - index\n                            )\n\n                            // A \\n\n\n                            // index = 1\n                            // string with ln = 2\n\n                            count -= index\n                            lastCheckIndex = 0\n                            output(strx)\n\n                            continue@topLoop // same as return flush()\n\n                        } else {\n                            lastIsLr = false\n                        }\n\n                        index++\n                    }\n                    12, 13 -> {\n                        /* 110x xxxx   10xx xxxx*/\n                        index += 2\n                        lastIsLr = false\n                    }\n                    14 -> {\n                        /* 1110 xxxx  10xx xxxx  10xx xxxx */\n                        index += 3\n                        lastIsLr = false\n                    }\n                    else -> {\n                        /* 10xx xxxx,  1111 xxxx */\n                        index++// Ignored\n                        lastIsLr = false\n                    }\n                }\n\n            }\n            lastCheckIndex = index\n\n            break\n        }\n    }\n\n}\n\n"
  },
  {
    "path": "mirai-console/frontend/mirai-console-frontend-base/src/logging/LogRecorder.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"MemberVisibilityCanBePrivate\")\n\npackage net.mamoe.mirai.console.frontendbase.logging\n\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.channels.onFailure\nimport net.mamoe.mirai.console.frontendbase.FrontendBase\nimport net.mamoe.mirai.console.util.AnsiMessageBuilder.Companion.dropAnsi\nimport net.mamoe.mirai.utils.childScope\nimport java.io.Writer\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport java.nio.file.StandardOpenOption\nimport java.time.Instant\nimport java.time.ZoneId\nimport java.time.format.DateTimeFormatter\nimport java.util.concurrent.Executors\nimport java.util.concurrent.ScheduledExecutorService\n\npublic abstract class LogRecorder {\n    public abstract fun record(msg: String)\n}\n\npublic object AllDroppedLogRecorder : LogRecorder() {\n    override fun record(msg: String) {\n    }\n}\n\npublic abstract class AsyncLogRecorder(\n    private val base: FrontendBase,\n    pipelineSize: Int = 2048,\n) : LogRecorder() {\n    protected val channel: Channel<String> = Channel(pipelineSize)\n    protected val threadPool: ScheduledExecutorService = Executors.newScheduledThreadPool(\n        3,\n        base.newThreadFactory(\"Mirai Console Logging\", true)\n    )\n    protected val dispatcher: CoroutineDispatcher = threadPool.asCoroutineDispatcher()\n\n    protected val subscope: CoroutineScope = base.scope.childScope(name = \"Mirai Console Async Logging\", dispatcher)\n\n    init {\n        base.scope.coroutineContext.job.invokeOnCompletion {\n            channel.close()\n            threadPool.shutdown()\n        }\n\n        subscope.launch {\n            while (isActive) {\n                val nextLine = channel.receive()\n                asyncRecord(nextLine)\n            }\n        }\n    }\n\n    override fun record(msg: String) {\n        if (!subscope.isActive) return // Died\n\n        channel.trySend(msg).onFailure {\n            base.scope.launch(start = CoroutineStart.UNDISPATCHED) {\n                channel.send(msg)\n            }\n        }\n    }\n\n    protected abstract fun asyncRecord(msg: String)\n}\n\npublic open class AsyncLogRecorderForwarded(\n    protected val delegate: LogRecorder,\n    base: FrontendBase,\n    pipelineSize: Int = 2048,\n) : AsyncLogRecorder(base, pipelineSize) {\n    override fun asyncRecord(msg: String) {\n        delegate.record(msg)\n    }\n}\n\npublic open class WriterLogRecorder(\n    protected val writer: Writer,\n    protected val base: FrontendBase,\n) : LogRecorder() {\n    override fun record(msg: String) {\n        try {\n            writer.append(\n                if (base.logDropAnsi) {\n                    msg.dropAnsi()\n                } else msg\n            ).append('\\n').flush()\n        } catch (e: Throwable) {\n            base.printToScreenDirectly(e.stackTraceToString())\n        }\n    }\n}\n\npublic open class DailySplitLogRecorder(\n    protected val directory: Path,\n    protected val base: FrontendBase,\n    protected val dateFormatter: DateTimeFormatter = DateTimeFormatter.ofPattern(\n        \"yyyy-MM-dd'.log'\"\n    ),\n) : LogRecorder() {\n    @JvmField\n    protected var writer: Writer? = null\n\n    @JvmField\n    protected var lastDate: Int = -1\n\n    protected fun acquireFileWriter() {\n        val instantNow = Instant.now()\n            .atZone(ZoneId.systemDefault())\n\n        val dayNow = instantNow.dayOfYear\n\n        if (dayNow != lastDate) {\n            lastDate = dayNow\n\n            writer?.close()\n\n            val logPath = directory.resolve(dateFormatter.format(instantNow))\n            logPath.parent?.let { pt ->\n                if (!Files.isDirectory(pt)) {\n                    Files.createDirectories(pt)\n                }\n            }\n\n            writer = Files.newBufferedWriter(\n                logPath, Charsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.APPEND\n            )\n        }\n    }\n\n    override fun record(msg: String) {\n        try {\n            acquireFileWriter()\n\n            (writer ?: error(\"Writer not setup\")).append(\n                if (base.logDropAnsi) {\n                    msg.dropAnsi()\n                } else msg\n            ).append('\\n').flush()\n        } catch (e: Throwable) {\n            base.printToScreenDirectly(e.stackTraceToString())\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-console-frontend-base/src/package.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.frontendbase\n"
  },
  {
    "path": "mirai-console/frontend/mirai-console-frontend-base/test/RepipedMessageForwardTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.frontendbase\n\nimport java.io.OutputStreamWriter\nimport java.io.PrintStream\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class RepipedMessageForwardTest {\n    private val pendingMsg = mutableListOf<String>()\n    private val ouptut = RepipedMessageForward(pendingMsg::add).pipedOutputStream\n\n    @Test\n    fun testPrintStream() {\n        val ps = PrintStream(ouptut)\n        ps.println(\"ABC\")\n        ps.append(\"D\").append(\"E\").append(\"F\").println(\"G\")\n        ps.println(\"LLOO\")\n\n        assertEquals(3, pendingMsg.size)\n        assertEquals(\"ABC\", pendingMsg.removeAt(0))\n        assertEquals(\"DEFG\", pendingMsg.removeAt(0))\n        assertEquals(\"LLOO\", pendingMsg.removeAt(0))\n    }\n\n    @Test\n    fun testCRLF() {\n        OutputStreamWriter(ouptut).use { writer ->\n\n            writer.append(\"LINE\").append(\"AAA\").append(\"OOOO\").append(\"\\r\\n\")\n            writer.append(\"Line1125744\\r\\n\")\n            writer.append(\"AFFXZ\\r\\n\")\n\n        }\n\n\n        assertEquals(3, pendingMsg.size)\n        assertEquals(\"LINEAAAOOOO\", pendingMsg.removeAt(0))\n        assertEquals(\"Line1125744\", pendingMsg.removeAt(0))\n        assertEquals(\"AFFXZ\", pendingMsg.removeAt(0))\n    }\n\n    @Test\n    fun testLF() {\n\n        OutputStreamWriter(ouptut).use { writer ->\n\n            writer.append(\"LINE\").append(\"\\n\")\n            writer.append(\"Line5\\n\")\n            writer.append(\"AFFXZ\\n\")\n            writer.append(\"NO\\rCR REMOVED\\n\")\n\n        }\n\n\n        assertEquals(4, pendingMsg.size)\n        assertEquals(\"LINE\", pendingMsg.removeAt(0))\n        assertEquals(\"Line5\", pendingMsg.removeAt(0))\n        assertEquals(\"AFFXZ\", pendingMsg.removeAt(0))\n        assertEquals(\"NO\\rCR REMOVED\", pendingMsg.removeAt(0))\n    }\n\n    @Test\n    fun testCRLFMixing() {\n\n        OutputStreamWriter(ouptut).use { writer ->\n            writer.append(\"LF\\n\")\n            writer.append(\"CRLF\\r\\n\")\n            writer.append(\"LFLF\\n\\n\")\n        }\n\n        assertEquals(4, pendingMsg.size)\n        assertEquals(\"LF\", pendingMsg.removeAt(0))\n        assertEquals(\"CRLF\", pendingMsg.removeAt(0))\n        assertEquals(\"LFLF\", pendingMsg.removeAt(0))\n        assertEquals(\"\", pendingMsg.removeAt(0))\n    }\n\n    @Test\n    fun testEmptyLines_LF() {\n        OutputStreamWriter(ouptut).use { writer ->\n            repeat(7) {\n                writer.append(\"\\n\")\n            }\n        }\n        assertEquals(7, pendingMsg.size)\n        repeat(7) {\n            assertEquals(\"\", pendingMsg.removeAt(0))\n        }\n    }\n\n    @Test\n    fun testEmptyLines_CRLF() {\n        OutputStreamWriter(ouptut).use { writer ->\n            repeat(7) {\n                writer.append(\"\\r\\n\")\n            }\n        }\n        assertEquals(7, pendingMsg.size)\n        repeat(7) {\n            assertEquals(\"\", pendingMsg.removeAt(0))\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-console-frontend-base/test/package.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.frontendbase\n"
  },
  {
    "path": "mirai-console/frontend/mirai-console-terminal/.gitignore",
    "content": "/run"
  },
  {
    "path": "mirai-console/frontend/mirai-console-terminal/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nimport shadow.registerRegularShadowTaskForJvmProject\nimport shadow.shadowImplementation\n\nplugins {\n    kotlin(\"jvm\")\n    kotlin(\"plugin.serialization\")\n    id(\"java\")\n    `maven-publish`\n}\n\nval shadow: Configuration = project.configurations.create(\"shadow\")\n\nkotlin {\n    optInForTestSourceSets(\"net.mamoe.mirai.console.util.ConsoleExperimentalApi\")\n    optInForTestSourceSets(\"net.mamoe.mirai.console.ConsoleFrontEndImplementation\")\n}\n\ndependencies {\n    api(project(\":mirai-core-api\"))\n    api(project(\":mirai-console\"))\n    implementation(project(\":mirai-core-utils\"))\n\n    shadowImplementation(jline)\n    shadowImplementation(jansi)\n    shadowImplementation(project(\":mirai-console-frontend-base\"))\n    implementation(`kotlin-jvm-blocking-bridge`)\n\n    testImplementation(project(\":mirai-core\"))\n}\n\nversion = Versions.consoleTerminal\n\ndescription = \"Console Terminal CLI frontend for mirai\"\n\nconfigurePublishing(\"mirai-console-terminal\", addShadowJar = false)\nval shadowJar = registerRegularShadowTaskForJvmProject(listOf(shadow))\npublishing {\n    publications.getByName(\"mavenJava\", MavenPublication::class) {\n        artifacts.artifact(shadowJar)\n    }\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-console-terminal/src/BufferedOutputStream.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.terminal\n\nimport java.io.ByteArrayOutputStream\nimport java.io.OutputStream\n\nprivate const val LN = 10.toByte()\n\ninternal class BufferedOutputStream @JvmOverloads constructor(\n    private val size: Int = 1024 * 1024,\n    private val logger: (String?) -> Unit\n) : ByteArrayOutputStream(size + 1) {\n    override fun write(b: Int) {\n        if (this.count >= size) {\n            flush()\n        }\n        if (b == 10) {\n            flush()\n        } else {\n            super.write(b)\n        }\n    }\n\n    override fun write(b: ByteArray) {\n        write(b, 0, b.size)\n    }\n\n    private fun ByteArray.findSplitter(off: Int, end: Int): Int {\n        var o = off\n        while (o < end) {\n            if (get(o) == LN) {\n                return o\n            }\n            o++\n        }\n        return -1\n    }\n\n    override fun write(b: ByteArray, off: Int, len: Int) {\n        val ed = off + len\n        if (ed > b.size || ed < 0) {\n            throw ArrayIndexOutOfBoundsException()\n        }\n        write0(b, off, ed)\n    }\n\n    private fun write0(b: ByteArray, off: Int, end: Int) {\n        val size = end - off\n        if (size < 1) return\n        val spl = b.findSplitter(off, end)\n        if (spl == -1) {\n            val over = this.size - (size + count)\n            if (over < 0) {\n                // cutting\n                write0(b, off, end + over)\n                flush()\n                write0(b, off - over, end)\n            } else {\n                super.write(b, off, size)\n            }\n        } else {\n            write0(b, off, spl)\n            flush()\n            write0(b, spl + 1, end)\n        }\n    }\n\n    override fun writeTo(out: OutputStream?) {\n        throw UnsupportedOperationException()\n    }\n\n    override fun flush() {\n        logger(String(buf, 0, count, Charsets.UTF_8))\n        count = 0\n    }\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-console-terminal/src/ConsoleInputImpl.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.terminal\n\nimport net.mamoe.mirai.console.util.ConsoleInput\n\n\ninternal object ConsoleInputImpl : ConsoleInput {\n    override suspend fun requestInput(hint: String): String {\n        return JLineInputDaemon.nextInput(hint)\n    }\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-console-terminal/src/ConsoleTerminalSettings.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n/*\n * @author Karlatemp <karlatemp@vip.qq.com> <https://github.com/Karlatemp>\n */\n\npackage net.mamoe.mirai.console.terminal\n\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\n\n@Retention(AnnotationRetention.BINARY)\n@RequiresOptIn(level = RequiresOptIn.Level.WARNING)\n@Target(\n    AnnotationTarget.CLASS,\n    AnnotationTarget.TYPEALIAS,\n    AnnotationTarget.FUNCTION,\n    AnnotationTarget.PROPERTY,\n    AnnotationTarget.FIELD,\n    AnnotationTarget.CONSTRUCTOR\n)\n@MustBeDocumented\nannotation class ConsoleTerminalExperimentalApi\n\n@ConsoleTerminalExperimentalApi\nobject ConsoleTerminalSettings {\n\n    @ConsoleFrontEndImplementation\n    @JvmField\n    var launchOptions: MiraiConsoleImplementation.ConsoleLaunchOptions =\n        MiraiConsoleImplementation.ConsoleLaunchOptions()\n\n    @JvmField\n    var setupAnsi: Boolean = System.getProperty(\"os.name\")\n        .lowercase()\n        .contains(\"windows\") // Just for Windows\n\n    @JvmField\n    var noConsole: Boolean = false\n\n    @JvmField\n    var noAnsi: Boolean = false\n\n    @JvmField\n    var noConsoleSafeReading: Boolean = false\n\n    @JvmField\n    var noConsoleReadingReplacement: String = \"\"\n\n    @JvmField\n    var noLogging = false\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-console-terminal/src/ConsoleThread.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ExperimentalCommandDescriptors::class, ConsoleExperimentalApi::class)\n\npackage net.mamoe.mirai.console.terminal\n\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.command.*\nimport net.mamoe.mirai.console.command.CommandExecuteResult.*\nimport net.mamoe.mirai.console.command.descriptor.AbstractCommandValueParameter.StringConstant\nimport net.mamoe.mirai.console.command.descriptor.CommandReceiverParameter\nimport net.mamoe.mirai.console.command.descriptor.CommandValueParameter\nimport net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors\nimport net.mamoe.mirai.console.command.parse.CommandCall\nimport net.mamoe.mirai.console.command.parse.CommandValueArgument\nimport net.mamoe.mirai.console.terminal.noconsole.NoConsole\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.console.util.cast\nimport net.mamoe.mirai.console.util.safeCast\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.warning\nimport org.jline.reader.EndOfFileException\nimport org.jline.reader.UserInterruptException\nimport kotlin.reflect.KClass\nimport kotlin.reflect.full.isSubclassOf\n\nval consoleLogger by lazy { MiraiLogger.Factory.create(MiraiConsole::class, \"console\") }\n\n@OptIn(ExperimentalCommandDescriptors::class)\ninternal fun startupConsoleThread() {\n    if (terminal is NoConsole) return\n\n    MiraiConsole.launch(CoroutineName(\"Input Cancelling Daemon\")) {\n        while (isActive) {\n            delay(2000)\n        }\n    }.invokeOnCompletion {\n        runCatching {\n            // 应该仅关闭用户输入\n            terminal.reader().shutdown()\n        }.exceptionOrNull()?.printStackTrace()\n    }\n    MiraiConsole.launch(CoroutineName(\"Console Command\")) {\n        while (true) {\n            val next = try {\n                JLineInputDaemon.nextCmd().let {\n                    when {\n                        it.isBlank() -> it\n                        it.startsWith(CommandManager.commandPrefix) -> it\n                        it == \"?\" -> CommandManager.commandPrefix + BuiltInCommands.HelpCommand.primaryName\n                        else -> CommandManager.commandPrefix + it\n                    }\n                }\n            } catch (e: InterruptedException) {\n                return@launch\n            } catch (e: CancellationException) {\n                return@launch\n            } catch (e: UserInterruptException) {\n                signalHandler(\"INT\")\n                return@launch\n            } catch (eof: EndOfFileException) {\n                consoleLogger.warning(\"Closing input service...\")\n                return@launch\n            } catch (e: Throwable) {\n                consoleLogger.error(\"Error in reading next command\", e)\n                consoleLogger.warning(\"Closing input service...\")\n                return@launch\n            }\n            if (next.isBlank()) {\n                continue\n            }\n            try {\n                // consoleLogger.debug(\"INPUT> $next\")\n                when (val result = ConsoleCommandSender.executeCommand(next)) {\n                    is Success -> {\n                    }\n                    is IllegalArgument -> { // user wouldn't want stacktrace for a parser error unless it is in debugging mode (to do).\n                        val message = result.exception.message\n                        if (message != null) {\n                            consoleLogger.warning(message)\n                        } else consoleLogger.warning(result.exception)\n                    }\n                    is ExecutionFailed -> {\n                        consoleLogger.error(result.exception)\n                    }\n                    is UnresolvedCommand -> {\n                        consoleLogger.warning { \"未知指令: ${next}, 输入 ? 获取帮助\" }\n                    }\n                    is PermissionDenied -> {\n                        consoleLogger.warning { \"权限不足.\" }\n                    }\n                    is UnmatchedSignature -> {\n                        consoleLogger.warning {\n                            \"参数不匹配, 你是否想执行: \\n\" + result.failureReasons.render(\n                                result.command,\n                                result.call\n                            )\n                        }\n                    }\n                    is Failure -> {\n                        consoleLogger.warning { result.toString() }\n                    }\n                }\n            } catch (e: InterruptedException) {\n                return@launch\n            } catch (e: CancellationException) {\n                return@launch\n            } catch (e: Throwable) {\n                consoleLogger.error(\"Unhandled exception\", e)\n            }\n        }\n    }\n}\n\n@OptIn(ExperimentalCommandDescriptors::class)\nprivate fun List<UnmatchedCommandSignature>.render(command: Command, call: CommandCall): String {\n    val list =\n        this.filter lambda@{ signature ->\n            if (signature.failureReason.safeCast<FailureReason.InapplicableValueArgument>()?.parameter is StringConstant) return@lambda false\n            if (signature.signature.valueParameters.anyStringConstantUnmatched(call.valueArguments)) return@lambda false\n            true\n        }\n    if (list.isEmpty()) {\n        return command.usage\n    }\n    return list.joinToString(\"\\n\") { it.render(command) }\n}\n\nprivate fun List<CommandValueParameter<*>>.anyStringConstantUnmatched(arguments: List<CommandValueArgument>): Boolean {\n    return this.zip(arguments).any { (parameter, argument) ->\n        parameter is StringConstant && !parameter.accepts(argument, null)\n    }\n}\n\n@OptIn(ExperimentalCommandDescriptors::class)\ninternal fun UnmatchedCommandSignature.render(command: Command): String {\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n    val usage =\n        net.mamoe.mirai.console.internal.command.CommandReflector.generateUsage(command, null, listOf(this.signature))\n    return usage.trim() + \"    (${failureReason.render()})\"\n}\n\n@OptIn(ExperimentalCommandDescriptors::class)\ninternal fun FailureReason.render(): String {\n    return when (this) {\n        is FailureReason.InapplicableReceiverArgument -> \"需要由 ${this.parameter.renderAsName()} 执行\"\n        is FailureReason.InapplicableArgument -> \"参数类型错误\"\n        is FailureReason.TooManyArguments -> \"参数过多\"\n        is FailureReason.NotEnoughArguments -> \"参数不足\"\n        is FailureReason.ResolutionAmbiguity -> \"调用歧义\"\n        is FailureReason.ArgumentLengthMismatch -> {\n            // should not happen, render it anyway.\n            \"参数长度不匹配\"\n        }\n    }\n}\n\n@OptIn(ExperimentalCommandDescriptors::class)\ninternal fun CommandReceiverParameter<*>.renderAsName(): String {\n    val classifier = this.type.classifier.cast<KClass<out CommandSender>>()\n    return when {\n        classifier.isSubclassOf(ConsoleCommandSender::class) -> \"控制台\"\n        // 只有 classifier 明确为 SystemCommandSender 才有系统的意思\n        // classifier 为子类时不满足 \"系统\" 的定义\n        classifier == SystemCommandSender::class -> \"系统\"\n        classifier.isSubclassOf(FriendCommandSenderOnMessage::class) -> \"好友私聊\"\n        classifier.isSubclassOf(FriendCommandSender::class) -> \"好友\"\n        classifier.isSubclassOf(MemberCommandSenderOnMessage::class) -> \"群内发言\"\n        classifier.isSubclassOf(MemberCommandSender::class) -> \"群成员\"\n        classifier.isSubclassOf(GroupTempCommandSenderOnMessage::class) -> \"群临时会话\"\n        classifier.isSubclassOf(GroupTempCommandSender::class) -> \"群临时好友\"\n        classifier.isSubclassOf(UserCommandSender::class) -> \"用户\"\n        else -> classifier.simpleName ?: classifier.toString()\n    }\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-console-terminal/src/JLineInputDaemon.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ConsoleExperimentalApi::class)\n\npackage net.mamoe.mirai.console.terminal\n\nimport kotlinx.coroutines.CancellableContinuation\nimport kotlinx.coroutines.Runnable\nimport kotlinx.coroutines.isActive\nimport kotlinx.coroutines.suspendCancellableCoroutine\nimport net.mamoe.mirai.console.terminal.noconsole.NoConsole\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.utils.ConcurrentLinkedDeque\nimport net.mamoe.mirai.utils.cast\nimport org.jline.reader.MaskingCallback\nimport org.jline.reader.impl.LineReaderImpl\nimport org.jline.utils.AttributedStringBuilder\nimport org.jline.utils.AttributedStyle\nimport java.util.*\nimport kotlin.concurrent.withLock\n\ninternal object JLineInputDaemon : Runnable {\n    lateinit var terminal0: MiraiConsoleImplementationTerminal\n    private val readerImpl: LineReaderImpl get() = lineReader.cast()\n\n    private var pausedByDaemon: Boolean = false\n    private var canResumeByNewRequest: Boolean = false\n\n    class Request(\n        val masked: Boolean = false,\n        val delayable: Boolean = false,\n        val coroutine: CancellableContinuation<String>,\n        val prompt: String? = null,\n    )\n\n    private val pwdMasker = object : MaskingCallback {\n        override fun display(line: String): String {\n            return buildString(line.length) { repeat(line.length) { append('*') } }\n        }\n\n        override fun history(line: String?): String? {\n            return null\n        }\n    }\n\n    val queue = ConcurrentLinkedDeque<Request>()\n    val queueDelayable = ConcurrentLinkedDeque<Request>()\n\n    val queueStateChangeNoticer = Object()\n    var processing: Request? = null\n\n    override fun run() {\n\n        while (terminal0.isActive) {\n            val nextTask = queue.poll() ?: queueDelayable.poll()\n\n            if (nextTask == null) {\n                synchronized(queueStateChangeNoticer) {\n                    if (queue.isEmpty() && queueDelayable.isEmpty()) {\n                        queueStateChangeNoticer.wait()\n                    }\n                }\n                continue\n            }\n            if (nextTask.coroutine.isCompleted) continue\n\n\n            synchronized(queueStateChangeNoticer) {\n                processing = nextTask\n                updateFlags(nextTask)\n            }\n\n            val rsp = kotlin.runCatching {\n                lineReader.readLine(\n                    nextTask.prompt ?: \"> \",\n                    null,\n                    if (nextTask.masked) pwdMasker else null,\n                    null\n                )\n            }\n\n            val crtProcessing: Request\n            synchronized(queueStateChangeNoticer) {\n                crtProcessing = processing ?: error(\"!processing lost\")\n                processing = null\n            }\n            crtProcessing.coroutine.resumeWith(rsp)\n        }\n    }\n\n    internal fun sendRequest(req: Request) {\n        if (terminal is NoConsole) {\n            req.coroutine.resumeWith(kotlin.runCatching {\n                lineReader.readLine()\n            })\n            return\n        }\n\n        req.coroutine.invokeOnCancellation {\n            if (req.delayable) {\n                queueDelayable\n            } else {\n                queue\n            }.remove(req)\n\n            synchronized(queueStateChangeNoticer) {\n                if (processing !== req) return@invokeOnCancellation\n\n                val nnextTask: Request\n                while (true) {\n                    val nnextTask2 = queue.poll() ?: queueDelayable.poll()\n                    if (nnextTask2 == null) {\n                        suspendReader(true)\n                        return@invokeOnCancellation\n                    }\n                    if (nnextTask2.coroutine.isCompleted) continue\n\n                    nnextTask = nnextTask2\n                    break\n                }\n\n                processing = nnextTask\n                updateFlags(nnextTask)\n                if (lineReader.isReading) {\n                    readerImpl.redisplay()\n                }\n            }\n        }\n\n        synchronized(queueStateChangeNoticer) {\n            val crtProcessing = processing\n            if (crtProcessing != null) {\n                if (crtProcessing.delayable) {\n                    processing = req\n                    queueDelayable.addLast(crtProcessing)\n\n                    updateFlags(req)\n                    if (lineReader.isReading) {\n                        readerImpl.redisplay()\n                    }\n                    return@synchronized\n                }\n            }\n\n            if (req.delayable) {\n                queueDelayable\n            } else {\n                queue\n            }.addLast(req)\n\n            queueStateChangeNoticer.notify()\n\n            if (crtProcessing != null && crtProcessing.coroutine.isCompleted) {\n                val nnextTask: Request\n                while (true) {\n                    val nnextTask2 = queue.poll() ?: queueDelayable.poll()\n                    if (nnextTask2 == null) {\n                        nnextTask = req\n                        break\n                    }\n                    if (nnextTask2.coroutine.isCompleted) continue\n\n                    nnextTask = nnextTask2\n                    break\n                }\n                processing = nnextTask\n                updateFlags(nnextTask)\n                if (lineReader.isReading) {\n                    readerImpl.redisplay()\n                }\n            }\n        }\n        tryResumeReader(true)\n    }\n\n    private fun updateFlags(req: Request) {\n        if (req.masked) {\n            lineReaderMaskingCallback[lineReader] = pwdMasker\n        } else {\n            lineReaderMaskingCallback[lineReader] = null\n        }\n        readerImpl.setPrompt(req.prompt ?: \"> \")\n    }\n\n\n    internal fun suspendReader(canResumeByNewRequest: Boolean): Unit = terminalExecuteLock.withLock {\n        if (!lineReader.isReading) return\n\n        terminal.pause()\n        pausedByDaemon = true\n        this.canResumeByNewRequest = canResumeByNewRequest\n        lineReaderReadingField.setBoolean(lineReader, false)\n        terminalDisplay.update(Collections.emptyList(), 0)\n    }\n\n    internal fun tryResumeReader(byNewReq: Boolean): Unit = terminalExecuteLock.withLock {\n        if (!pausedByDaemon) return\n        if (byNewReq && !canResumeByNewRequest) return\n\n        pausedByDaemon = false\n        terminal.resume()\n        lineReaderReadingField.setBoolean(lineReader, true)\n        readerImpl.redisplay()\n    }\n\n    suspend fun nextInput(hint: String): String = suspendCancellableCoroutine { cort ->\n        sendRequest(\n            Request(\n                masked = false,\n                delayable = false,\n                coroutine = cort,\n                prompt = \"$hint> \"\n            )\n        )\n    }\n\n    suspend fun nextCmd(): String = suspendCancellableCoroutine { cort ->\n        sendRequest(Request(masked = false, delayable = true, coroutine = cort))\n    }\n\n    suspend fun nextPwd(): String = suspendCancellableCoroutine { cort ->\n        sendRequest(\n            Request(\n                masked = true,\n                delayable = false,\n                coroutine = cort,\n                prompt = AttributedStringBuilder()\n                    .style(AttributedStyle.DEFAULT.background(AttributedStyle.CYAN).foreground(AttributedStyle.WHITE))\n                    .append(\"PASSWORD\")\n                    .style(AttributedStyle.DEFAULT)\n                    .append(\"> \")\n                    .toAnsi()\n            )\n        )\n    }\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-console-terminal/src/LoggingService.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.terminal\n\nimport net.mamoe.mirai.utils.TestOnly\n\n// Used by https://github.com/iTXTech/soyuz, change with care.\ninternal sealed class LoggingService {\n    @TestOnly\n    internal lateinit var switchLogFileNow: () -> Unit\n\n    internal abstract fun pushLine(line: String)\n}\n\ninternal class LoggingServiceNoop : LoggingService() {\n    override fun pushLine(line: String) {\n    }\n\n    init {\n        @OptIn(TestOnly::class)\n        switchLogFileNow = {}\n    }\n}\n\n"
  },
  {
    "path": "mirai-console/frontend/mirai-console-terminal/src/MiraiConsoleImplementationTerminal.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\n    \"INVISIBLE_MEMBER\",\n    \"INVISIBLE_REFERENCE\",\n    \"CANNOT_OVERRIDE_INVISIBLE_MEMBER\",\n    \"INVISIBLE_SETTER\",\n    \"INVISIBLE_GETTER\",\n    \"INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER\",\n    \"INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER_WARNING\",\n    \"EXPOSED_SUPER_CLASS\"\n)\n@file:OptIn(ConsoleInternalApi::class, ConsoleFrontEndImplementation::class, ConsoleTerminalExperimentalApi::class)\n\npackage net.mamoe.mirai.console.terminal\n\n\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.isActive\nimport kotlinx.coroutines.launch\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MiraiConsoleFrontEndDescription\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport net.mamoe.mirai.console.data.MultiFilePluginDataStorage\nimport net.mamoe.mirai.console.data.PluginDataStorage\nimport net.mamoe.mirai.console.fontend.ProcessProgress\nimport net.mamoe.mirai.console.frontendbase.AbstractMiraiConsoleFrontendImplementation\nimport net.mamoe.mirai.console.frontendbase.FrontendBase\nimport net.mamoe.mirai.console.frontendbase.logging.AllDroppedLogRecorder\nimport net.mamoe.mirai.console.frontendbase.logging.LogRecorder\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader\nimport net.mamoe.mirai.console.plugin.loader.PluginLoader\nimport net.mamoe.mirai.console.terminal.ConsoleInputImpl.requestInput\nimport net.mamoe.mirai.console.terminal.noconsole.AllEmptyLineReader\nimport net.mamoe.mirai.console.terminal.noconsole.NoConsole\nimport net.mamoe.mirai.console.terminal.noconsole.SystemOutputPrintStream\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.console.util.ConsoleInput\nimport net.mamoe.mirai.console.util.ConsoleInternalApi\nimport net.mamoe.mirai.console.util.SemVersion\nimport net.mamoe.mirai.utils.BotConfiguration\nimport net.mamoe.mirai.utils.LoginSolver\nimport net.mamoe.mirai.utils.StandardCharImageLoginSolver\nimport org.fusesource.jansi.Ansi\nimport org.jline.reader.LineReader\nimport org.jline.reader.LineReaderBuilder\nimport org.jline.reader.impl.completer.NullCompleter\nimport org.jline.terminal.Terminal\nimport org.jline.terminal.TerminalBuilder\nimport org.jline.terminal.impl.AbstractWindowsTerminal\nimport java.nio.file.Path\nimport java.nio.file.Paths\n\n/**\n * mirai-console-terminal 后端实现\n *\n * @see MiraiConsoleTerminalLoader CLI 入口点\n */\n@ConsoleExperimentalApi\nopen class MiraiConsoleImplementationTerminal\n@JvmOverloads constructor(\n    final override val rootPath: Path = Paths.get(System.getProperty(\"user.dir\", \".\")).toAbsolutePath(),\n    override val builtInPluginLoaders: List<Lazy<PluginLoader<*, *>>> = listOf(lazy { JvmPluginLoader }),\n    override val frontEndDescription: MiraiConsoleFrontEndDescription = ConsoleFrontEndDescImpl,\n    override val consoleCommandSender: MiraiConsoleImplementation.ConsoleCommandSenderImpl = ConsoleCommandSenderImplTerminal,\n    override val dataStorageForJvmPluginLoader: PluginDataStorage = MultiFilePluginDataStorage(rootPath.resolve(\"data\")),\n    override val dataStorageForBuiltIns: PluginDataStorage = MultiFilePluginDataStorage(rootPath.resolve(\"data\")),\n    override val configStorageForJvmPluginLoader: PluginDataStorage = MultiFilePluginDataStorage(rootPath.resolve(\"config\")),\n    override val configStorageForBuiltIns: PluginDataStorage = MultiFilePluginDataStorage(rootPath.resolve(\"config\")),\n) : AbstractMiraiConsoleFrontendImplementation(\"MiraiConsoleImplementationTerminal\") {\n\n    @Suppress(\"MemberVisibilityCanBePrivate\")\n    override val frontendBase = object : FrontendBase() {\n        override val scope: CoroutineScope\n            get() = this@MiraiConsoleImplementationTerminal\n\n        override val workingDirectory: Path\n            get() = this@MiraiConsoleImplementationTerminal.rootPath\n\n        override fun initLogRecorder(): LogRecorder {\n            if (ConsoleTerminalSettings.noLogging) {\n                return AllDroppedLogRecorder\n            }\n            return super.initLogRecorder()\n        }\n\n        override fun initScreen_forwardStdToScreen() {\n            lineReader\n            super.initScreen_forwardStdToScreen()\n        }\n\n        override fun printToScreenDirectly(msg: String) {\n            printToScreen(msg)\n\n            @Suppress(\"DEPRECATION\")\n            logService.pushLine(msg)\n        }\n    }\n\n    override val consoleInput: ConsoleInput get() = ConsoleInputImpl\n    override val isAnsiSupported: Boolean get() = true\n\n    @Deprecated(\"Used by iTXTech; for binary compatibility\")\n    internal val logService: LoggingService\n\n    override fun createLoginSolver(requesterBot: Long, configuration: BotConfiguration): LoginSolver {\n        LoginSolver.Default?.takeIf { it !is StandardCharImageLoginSolver }?.let { return it }\n        return StandardCharImageLoginSolver(input = { requestInput(\"LOGIN> \") })\n    }\n\n\n    init {\n        with(rootPath.toFile()) {\n            mkdir()\n            require(isDirectory) { \"rootDir $absolutePath is not a directory\" }\n\n            @Suppress(\"DEPRECATION\")\n            logService = LoggingServiceNoop()\n        }\n    }\n\n    override val consoleLaunchOptions: MiraiConsoleImplementation.ConsoleLaunchOptions\n        get() = ConsoleTerminalSettings.launchOptions\n\n    override fun preStart() {\n        registerSignalHandler()\n\n        JLineInputDaemon.terminal0 = this\n        if (terminal !is NoConsole) {\n            frontendBase.newDaemon(\"JLine Input Daemon\", JLineInputDaemon).start()\n        }\n\n        launch(CoroutineName(\"Mirai Console Terminal Downloading Progress Bar Updater\")) {\n            while (isActive) {\n                downloadingProgressDaemonStub()\n            }\n        }\n    }\n\n    override fun createNewProcessProgress(): ProcessProgress {\n        if (terminal is NoConsole) return super.createNewProcessProgress()\n\n        containDownloadingProgress = true\n        kotlin.runCatching {\n            downloadingProgressCoroutine?.resumeWith(Result.success(Unit))\n        }\n        return TerminalProcessProgress(lineReader).also {\n            terminalDownloadingProgresses.add(it)\n            terminal.writer().print(\"\\u001B[?25l\") // hide cursor\n        }\n    }\n}\n\nval lineReader: LineReader by lazy {\n    val terminal = terminal\n    if (terminal is NoConsole) return@lazy AllEmptyLineReader\n\n    LineReaderBuilder.builder()\n        .terminal(terminal)\n        .completer(NullCompleter())\n        .build()\n}\n\n\nval terminal: Terminal = run {\n    if (ConsoleTerminalSettings.noConsole) {\n        SystemOutputPrintStream // init value\n        return@run NoConsole\n    }\n\n    TerminalBuilder.builder()\n        .name(\"Mirai Console\")\n        .system(true)\n        .jansi(true)\n        .dumb(true)\n        .paused(true)\n        .signalHandler { signalHandler(it.name) }\n        .build()\n        .let { terminal ->\n            if (terminal is AbstractWindowsTerminal) {\n                val pumpField = runCatching {\n                    AbstractWindowsTerminal::class.java.getDeclaredField(\"pump\").also {\n                        it.isAccessible = true\n                    }\n                }.onFailure { err ->\n                    err.printStackTrace()\n                    return@let terminal.also { it.resume() }\n                }.getOrThrow()\n                var response = terminal\n                terminal.setOnClose {\n                    response = NoConsole\n                }\n                terminal.resume()\n                val pumpThread = pumpField[terminal] as? Thread ?: return@let NoConsole\n                @Suppress(\"ControlFlowWithEmptyBody\")\n                while (pumpThread.state == Thread.State.NEW);\n                Thread.sleep(1000)\n                terminal.setOnClose(null)\n                return@let response\n            }\n            terminal.resume()\n            terminal\n        }\n}\n\nprivate object ConsoleFrontEndDescImpl : MiraiConsoleFrontEndDescription {\n    override val name: String get() = \"Terminal\"\n    override val vendor: String get() = \"Mamoe Technologies\"\n\n    // net.mamoe.mirai.console.internal.MiraiConsoleBuildConstants.version\n    // is console's version not frontend's version\n    override val version: SemVersion =\n        SemVersion(net.mamoe.mirai.console.internal.MiraiConsoleBuildConstants.versionConst)\n}\n\ninternal val ANSI_RESET = Ansi().reset().toString()\n"
  },
  {
    "path": "mirai-console/frontend/mirai-console-terminal/src/MiraiConsoleTerminalLoader.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\n    \"INVISIBLE_MEMBER\",\n    \"INVISIBLE_REFERENCE\",\n    \"CANNOT_OVERRIDE_INVISIBLE_MEMBER\",\n    \"INVISIBLE_SETTER\",\n    \"INVISIBLE_GETTER\",\n    \"INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER\",\n)\n@file:OptIn(ConsoleInternalApi::class, ConsoleTerminalExperimentalApi::class, ConsoleFrontEndImplementation::class)\n\npackage net.mamoe.mirai.console.terminal\n\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.console.ConsoleFrontEndImplementation\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.MiraiConsoleImplementation\nimport net.mamoe.mirai.console.MiraiConsoleImplementation.Companion.start\nimport net.mamoe.mirai.console.data.AutoSavePluginDataHolder\nimport net.mamoe.mirai.console.terminal.noconsole.SystemOutputPrintStream\nimport net.mamoe.mirai.console.util.ConsoleExperimentalApi\nimport net.mamoe.mirai.console.util.ConsoleInternalApi\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.utils.childScope\nimport net.mamoe.mirai.utils.debug\nimport net.mamoe.mirai.utils.info\nimport net.mamoe.mirai.utils.verbose\nimport org.jline.utils.Signals\nimport java.io.FileDescriptor\nimport java.io.FileOutputStream\nimport java.io.PrintStream\nimport java.lang.Runnable\nimport java.util.concurrent.Executors\nimport java.util.concurrent.ThreadFactory\nimport java.util.concurrent.atomic.AtomicBoolean\nimport java.util.concurrent.atomic.AtomicInteger\nimport java.util.concurrent.atomic.AtomicLong\nimport kotlin.system.exitProcess\n\n/**\n * mirai-console-terminal CLI 入口点\n */\nobject MiraiConsoleTerminalLoader {\n\n    // Note: Do not run this in IDEA, as you will get invalid classpath and `java.lang.NoClassDefFoundError`.\n    // Run `RunTerminal.kt` under `test` source set instead.\n    @OptIn(ConsoleExperimentalApi::class)\n    @JvmStatic\n    fun main(args: Array<String>) {\n        parse(args, exitProcess = true)\n        startAsDaemon()\n        try {\n            runBlocking {\n                MiraiConsole.job.invokeOnCompletion { err ->\n                    if (err != null) {\n                        Thread.sleep(1000) // 保证错误信息打印完全\n                    }\n                }\n                MiraiConsole.job.join()\n            }\n        } catch (e: CancellationException) {\n            // ignored\n        }\n        // Avoid plugin started some non-daemon threads\n        exitProcessAndForceHalt(0)\n    }\n\n    @ConsoleTerminalExperimentalApi\n    fun printHelpMessage() {\n        val help = listOf(\n            \"\" to \"Mirai-Console[Terminal FrontEnd] v\" + net.mamoe.mirai.console.internal.MiraiConsoleBuildConstants.versionConst,\n            \"\" to \"             [          BackEnd] v\" + kotlin.runCatching {\n                net.mamoe.mirai.console.internal.MiraiConsoleBuildConstants.version\n            }.getOrElse { \"<unknown>\" },\n            \"\" to \"\",\n            \"--help\" to \"显示此帮助\",\n            \"\" to \"\",\n            \"--no-console\" to \"使用无终端操作环境\",\n            \"--no-logging\" to \"禁用 console 日志文件\",\n            \"--dont-setup-terminal-ansi\" to\n                    \"[NoConsole] [Windows Only] 不进行ansi console初始化工作\",\n            \"--no-ansi\" to \"[NoConsole] 禁用 ansi\",\n            \"--safe-reading\" to\n                    \"[NoConsole] 如果启动此选项, console在获取用户输入的时候会获得一个安全的替换符\\n\" +\n                    \"            如果不启动, 将会直接 error\",\n            \"--reading-replacement <string>\" to\n                    \"[NoConsole] Console尝试读取命令的替换符, 默认是空字符串\\n\" +\n                    \"            使用此选项会自动开启 --safe-reading\",\n        )\n        val prefixPlaceholder = String(CharArray(\n            help.maxOfOrNull { it.first.length }!! + 3\n        ) { ' ' })\n\n        fun printOption(optionName: String, value: String) {\n            if (optionName == \"\") {\n                println(value)\n                return\n            }\n            print(optionName)\n            print(prefixPlaceholder.substring(optionName.length))\n            val lines = value.split('\\n').iterator()\n            if (lines.hasNext()) println(lines.next())\n            lines.forEach { line ->\n                print(prefixPlaceholder)\n                println(line)\n            }\n        }\n        help.forEach { (optionName, value) ->\n            printOption(optionName, value)\n        }\n    }\n\n    @ConsoleTerminalExperimentalApi\n    fun parse(args: Array<String>, exitProcess: Boolean = false) {\n        val iterator = args.iterator()\n        while (iterator.hasNext()) {\n            when (val option = iterator.next()) {\n                \"--help\" -> {\n                    printHelpMessage()\n                    if (exitProcess) exitProcess(0)\n                    return\n                }\n\n                \"--no-console\" -> {\n                    ConsoleTerminalSettings.noConsole = true\n                }\n\n                \"--dont-setup-terminal-ansi\" -> {\n                    ConsoleTerminalSettings.setupAnsi = false\n                }\n\n                \"--no-logging\" -> {\n                    ConsoleTerminalSettings.noLogging = true\n                }\n\n                \"--no-ansi\" -> {\n                    ConsoleTerminalSettings.noAnsi = true\n                    ConsoleTerminalSettings.setupAnsi = false\n                }\n\n                \"--reading-replacement\" -> {\n                    ConsoleTerminalSettings.noConsoleSafeReading = true\n                    if (iterator.hasNext()) {\n                        ConsoleTerminalSettings.noConsoleReadingReplacement = iterator.next()\n                    } else {\n                        println(\"Bad option `--reading-replacement`\")\n                        println(\"Usage: --reading-replacement <string>\")\n                        if (exitProcess)\n                            exitProcess(1)\n                        return\n                    }\n                }\n\n                \"--safe-reading\" -> {\n                    ConsoleTerminalSettings.noConsoleSafeReading = true\n                }\n\n                else -> {\n                    println(\"Unknown option `$option`\")\n                    printHelpMessage()\n                    if (exitProcess)\n                        exitProcess(1)\n                    return\n                }\n            }\n        }\n        if (ConsoleTerminalSettings.noConsole)\n            SystemOutputPrintStream // Setup Output Channel\n    }\n\n    @Suppress(\"MemberVisibilityCanBePrivate\")\n    @ConsoleExperimentalApi\n    fun startAsDaemon(instance: MiraiConsoleImplementationTerminal = MiraiConsoleImplementationTerminal()) {\n        instance.start()\n        startupConsoleThread()\n    }\n}\n\n@OptIn(ConsoleExperimentalApi::class)\ninternal object ConsoleDataHolder : AutoSavePluginDataHolder,\n    CoroutineScope by MiraiConsole.childScope(\"ConsoleDataHolder\") {\n    @ConsoleExperimentalApi\n    override val autoSaveIntervalMillis: LongRange = 60_000L..10.times(60_000)\n\n    @ConsoleExperimentalApi\n    override val dataHolderName: String\n        get() = \"Terminal\"\n}\n\nprivate val shutdownSignals = arrayOf(\n    \"INT\", \"TERM\", \"QUIT\"\n)\n\ninternal val signalHandler: (String) -> Unit = initSignalHandler()\n\n@OptIn(ConsoleExperimentalApi::class)\nprivate fun initSignalHandler(): (String) -> Unit {\n    val shutdownMonitorLock = AtomicBoolean(false)\n    val lastSignalTimestamp = AtomicLong(0)\n    return handler@{ signalName ->\n        if (signalName == \"WINCH\") {\n            // Windows CMD.exe resized\n            return@handler\n        }\n        runCatching {\n            MiraiConsole.mainLogger\n        }.onFailure { // mirai-console not yet initialized\n            System.err.println(\"[TERMINAL] [WARNING] Received signal $signalName\")\n            System.err.println(\"[TERMINAL] [WARNING] This signal will be processed later because mirai-console not yet initialized.\")\n\n            // Try later\n            if (signalName in shutdownSignals) {\n                @OptIn(DelicateCoroutinesApi::class)\n                GlobalScope.launch {\n                    delay(500L)\n                    signalHandler(signalName)\n                }\n            }\n            return@handler\n        }\n        // JLine may process other signals\n        MiraiConsole.mainLogger.verbose { \"Received signal $signalName\" }\n        if (signalName !in shutdownSignals) return@handler\n\n        MiraiConsole.mainLogger.debug { \"Handled  signal $signalName\" }\n        run multiSignalHandler@{\n            val crtTime = System.currentTimeMillis()\n            val last = lastSignalTimestamp.getAndSet(crtTime)\n            if (crtTime - last < 1000L) {\n                MiraiConsole.mainLogger.debug { \"Multi    signal $signalName\" }\n                MiraiConsole.mainLogger.info { \"Process will be killed after 0.5s\" }\n\n                @OptIn(DelicateCoroutinesApi::class)\n                GlobalScope.launch {\n                    delay(500L)\n                    exitProcessAndForceHalt(-5)\n                }\n            }\n        }\n        MiraiConsole.shutdown()\n\n        // Shutdown by signal requires process be killed\n        if (shutdownMonitorLock.compareAndSet(false, true)) {\n            val pool = Executors.newFixedThreadPool(4, object : ThreadFactory {\n                private val counter = AtomicInteger()\n                override fun newThread(r: Runnable): Thread {\n                    return Thread(r, \"Mirai Console Signal-Shutdown Daemon #\" + counter.getAndIncrement()).also {\n                        it.isDaemon = true\n                    }\n                }\n            })\n            @OptIn(DelicateCoroutinesApi::class)\n            GlobalScope.launch(pool.asCoroutineDispatcher()) {\n                MiraiConsole.job.join()\n\n                delay(15000)\n                // Force kill process if plugins started non-daemon threads\n                exitProcessAndForceHalt(-5)\n            }\n            @OptIn(DelicateCoroutinesApi::class)\n            GlobalScope.launch(pool.asCoroutineDispatcher()) {\n                delay(1000L * 60) // timed out\n                // Force kill process if plugins started non-daemon threads\n                exitProcessAndForceHalt(-5)\n            }\n        }\n    }\n}\n\ninternal fun registerSignalHandler() {\n    fun reg(name: String) {\n        Signals.register(name) { signalHandler(name) }\n    }\n    shutdownSignals.forEach { reg(it) }\n}\n\ninternal fun exitProcessAndForceHalt(code: Int): Nothing {\n    MiraiConsole.mainLogger.debug { \"[exitProcessAndForceHalt] called with code $code\" }\n\n    val exitFuncName = arrayOf(\"exit\", \"halt\")\n    val shutdownClasses = arrayOf(\"java.lang.System\", \"java.lang.Runtime\", \"java.lang.Shutdown\")\n    val isShutdowning = Thread.getAllStackTraces().asSequence().flatMap {\n        it.value.asSequence()\n    }.any { stackTrace ->\n        stackTrace.className in shutdownClasses && stackTrace.methodName in exitFuncName\n    }\n    MiraiConsole.mainLogger.debug { \"[exitProcessAndForceHalt] isShutdowning = $isShutdowning\" }\n\n    val task = Runnable {\n        Thread.sleep(15000L)\n        runCatching { net.mamoe.mirai.console.internal.shutdown.ShutdownDaemon.dumpCrashReport(true) }\n        val fc = when (code) {\n            0 -> 5784171\n            else -> code\n        }\n\n        MiraiConsole.mainLogger.debug { \"[exitProcessAndForceHalt] timed out, force halt with code $fc\" }\n        Runtime.getRuntime().halt(fc)\n    }\n    if (isShutdowning) {\n        task.run()\n        error(\"Runtime.halt returned normally, while it was supposed to halt JVM.\")\n    } else {\n        Thread(task, \"Mirai Console Force Halt Daemon\").start()\n        exitProcess(code)\n    }\n}\n\n\ninternal object ConsoleCommandSenderImplTerminal : MiraiConsoleImplementation.ConsoleCommandSenderImpl {\n    override suspend fun sendMessage(message: String) {\n        kotlin.runCatching {\n            printToScreen(message + ANSI_RESET)\n        }.onFailure { exception ->\n            // If failed. It means JLine Terminal not working...\n            PrintStream(FileOutputStream(FileDescriptor.err)).use {\n                it.println(\"Exception while ConsoleCommandSenderImplTerminal.sendMessage\")\n                exception.printStackTrace(it)\n            }\n        }\n    }\n\n    override suspend fun sendMessage(message: Message) {\n        return sendMessage(message.toString())\n    }\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-console-terminal/src/TerminalProcessProgress.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.terminal\n\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.suspendCancellableCoroutine\nimport net.mamoe.mirai.console.fontend.ProcessProgress\nimport net.mamoe.mirai.console.terminal.noconsole.NoConsole\nimport net.mamoe.mirai.utils.ConcurrentLinkedQueue\nimport net.mamoe.mirai.utils.cast\nimport net.mamoe.mirai.utils.currentTimeMillis\nimport org.jline.reader.MaskingCallback\nimport org.jline.reader.impl.LineReaderImpl\nimport org.jline.utils.AttributedString\nimport org.jline.utils.AttributedStringBuilder\nimport org.jline.utils.AttributedStyle\nimport org.jline.utils.Display\nimport java.lang.reflect.Field\nimport kotlin.concurrent.withLock\nimport kotlin.coroutines.Continuation\nimport kotlin.reflect.KProperty\n\ninternal class TerminalProcessProgress(\n    private val reader: org.jline.reader.LineReader,\n) : ProcessProgress {\n    private var totalSize: Long = 1\n    private var processed: Long = 0\n    private val txt: StringBuilder = StringBuilder()\n    private val renderedTxt: StringBuilder = StringBuilder()\n    private var failed: Boolean = false\n    private var disposed: Boolean = false\n\n    @JvmField\n    var pendingErase: Boolean = false\n\n    @JvmField\n    var eraseTimestamp: Long = 0\n\n    @JvmField\n    var ansiMsg: AttributedString = AttributedString.EMPTY\n\n    private var lastTerminalWidth = 0\n    private var needRerender: Boolean = true\n    private var needUpdateTxt: Boolean = true\n\n    override fun updateText(txt: CharSequence) {\n        this.txt.setLength(0)\n        this.txt.append(txt)\n        needUpdateTxt = true\n        needRerender = true\n    }\n\n    override fun updateText(txt: String) {\n        updateText(txt as CharSequence)\n    }\n\n    override fun setTotalSize(totalSize: Long) {\n        this.totalSize = totalSize\n        needRerender = true\n    }\n\n    override fun update(processed: Long) {\n        this.processed = processed\n        needRerender = true\n    }\n\n    override fun update(processed: Long, totalSize: Long) {\n        this.processed = processed\n        this.totalSize = totalSize\n        needRerender = true\n    }\n\n    override fun markFailed() {\n        failed = true\n        needRerender = true\n    }\n\n    internal fun updateTxt(terminalWidth: Int) {\n\n        // region check need to update\n        if (needUpdateTxt || lastTerminalWidth != terminalWidth) {\n            // <text changed / screen width changed>\n            lastTerminalWidth = terminalWidth\n            synchronized(renderedTxt) {\n                renderedTxt.setLength(0)\n                renderedTxt.append(txt)\n                // paddings\n                if (renderedTxt.length < terminalWidth) {\n                    repeat(terminalWidth - renderedTxt.length) {\n                        renderedTxt.append(' ')\n                    }\n                }\n            }\n        } else if (!needRerender) {\n            // nothing changed\n            return\n        } /* else { <api require rerender> } */\n\n        lastTerminalWidth = terminalWidth\n        // endregion\n        synchronized(renderedTxt) {\n\n            val renderedTextWidth = when (terminalWidth) {\n                0 -> renderedTxt.length\n                else -> terminalWidth\n            }\n\n            val finalAnsiLineBuilder = AttributedStringBuilder()\n\n            if (failed) {\n                finalAnsiLineBuilder.style(\n                    AttributedStyle.DEFAULT\n                        .background(AttributedStyle.RED)\n                        .foreground(AttributedStyle.BLACK)\n                )\n                finalAnsiLineBuilder.append(renderedTxt, 0, renderedTextWidth)\n            } else {\n                val downpcent = (renderedTextWidth * processed / totalSize).toInt()\n                if (downpcent > 0) {\n                    finalAnsiLineBuilder.style(\n                        AttributedStyle.DEFAULT\n                            .background(AttributedStyle.GREEN)\n                            .foreground(AttributedStyle.BLACK)\n                    )\n                    finalAnsiLineBuilder.append(renderedTxt, 0, downpcent)\n                }\n                if (downpcent < renderedTextWidth) {\n                    finalAnsiLineBuilder.style(\n                        AttributedStyle.DEFAULT\n                            .background(AttributedStyle.WHITE)\n                            .foreground(AttributedStyle.BLACK)\n                    )\n                    finalAnsiLineBuilder.append(renderedTxt, downpcent, renderedTextWidth)\n                }\n            }\n            ansiMsg = finalAnsiLineBuilder.toAttributedString()\n            needUpdateTxt = false\n            needRerender = false\n        }\n    }\n\n    override fun rerender() {\n        updateTerminalDownloadingProgresses()\n    }\n\n    override fun close() {\n        if (disposed) return\n        disposed = true\n\n        totalSize = 1\n        processed = 1\n        needUpdateTxt = true\n        updateTxt(reader.terminal.width)\n        if (failed) {\n            terminalDownloadingProgresses.remove(this)\n            printToScreen(ansiMsg)\n            ansiMsg = AttributedString.EMPTY\n            return\n        }\n        // terminalDownloadingProgresses.remove(this)\n        pendingErase = true\n        eraseTimestamp = System.currentTimeMillis() + 1500L\n\n        updateTerminalDownloadingProgresses()\n\n        // prePrintNewLog()\n        // reader.printAbove(ansiMsg)\n        // ansiMsg = AttributedString.EMPTY\n    }\n}\n\n\ninternal val terminalDisplay: Display by object : kotlin.properties.ReadOnlyProperty<Any?, Display> {\n    val delegate: () -> Display by lazy {\n        val terminal = terminal\n        if (terminal is NoConsole) {\n            val display = Display(terminal, false)\n            return@lazy { display }\n        }\n\n        val lr = lineReader\n        val field = LineReaderImpl::class.java.declaredFields.first { it.type == Display::class.java }\n        field.isAccessible = true\n        return@lazy { field[lr] as Display }\n    }\n\n    override fun getValue(thisRef: Any?, property: KProperty<*>): Display {\n        return delegate()\n    }\n}\ninternal val lineReaderMaskingCallback: Field by lazy {\n    val field = LineReaderImpl::class.java.declaredFields.first {\n        MaskingCallback::class.java.isAssignableFrom(it.type)\n    }\n    field.isAccessible = true\n    field\n}\n\ninternal val lineReaderReadingField: Field by lazy {\n    val field = LineReaderImpl::class.java.getDeclaredField(\"reading\")\n    field.isAccessible = true\n    field\n}\n\ninternal val terminalExecuteLock: java.util.concurrent.locks.Lock by lazy {\n    val terminal = terminal\n    if (terminal is NoConsole) return@lazy java.util.concurrent.locks.ReentrantLock()\n    val lr = lineReader\n    val field = LineReaderImpl::class.java.declaredFields.first {\n        java.util.concurrent.locks.Lock::class.java.isAssignableFrom(it.type)\n    }\n    field.isAccessible = true\n    field[lr].cast()\n}\n\nprivate val terminalDownloadingProgressesNoticer = Object()\ninternal var containDownloadingProgress: Boolean = false\n    get() = field || terminalDownloadingProgresses.isNotEmpty()\n\ninternal val terminalDownloadingProgresses = ConcurrentLinkedQueue<TerminalProcessProgress>()\n\n\ninternal var downloadingProgressCoroutine: Continuation<Unit>? = null\ninternal suspend fun downloadingProgressDaemonStub() {\n    delay(500L)\n    if (containDownloadingProgress) {\n        updateTerminalDownloadingProgresses()\n    } else {\n        suspendCancellableCoroutine<Unit> { cp ->\n            downloadingProgressCoroutine = cp\n        }\n        downloadingProgressCoroutine = null\n    }\n}\n\ninternal fun updateTerminalDownloadingProgresses() {\n    if (!containDownloadingProgress) return\n\n    runCatching { downloadingProgressCoroutine?.resumeWith(Result.success(Unit)) }\n\n    terminalExecuteLock.withLock {\n        JLineInputDaemon.suspendReader(false)\n\n        if (terminalDownloadingProgresses.isNotEmpty()) {\n            val wid = terminal.width\n            if (wid == 0) { // Run in idea\n                if (terminalDownloadingProgresses.removeIf { it.pendingErase }) {\n                    updateTerminalDownloadingProgresses()\n                    return\n                }\n                terminalDisplay.update(listOf(AttributedString.EMPTY), 0, false)\n                // Error in idea when more than one bar displaying\n                terminalDisplay.update(listOf(terminalDownloadingProgresses.peek()?.let {\n                    it.updateTxt(0); it.ansiMsg\n                } ?: AttributedString.EMPTY), 0)\n            } else {\n                if (terminalDownloadingProgresses.size > 4) {\n                    // to mush. delete some completed status\n                    var allowToDelete = terminalDownloadingProgresses.size - 4\n                    terminalDownloadingProgresses.removeIf { pg ->\n                        if (allowToDelete == 0) {\n                            return@removeIf false\n                        }\n                        if (pg.pendingErase) {\n                            allowToDelete--\n                            return@removeIf true\n                        }\n                        return@removeIf false\n                    }\n                }\n                terminalDisplay.update(terminalDownloadingProgresses.map {\n                    it.updateTxt(wid); it.ansiMsg\n                }, 0)\n                cleanupErase()\n            }\n        } else {\n            terminalDisplay.update(emptyList(), 0)\n            (lineReader as LineReaderImpl).let { lr ->\n                if (lr.isReading) {\n                    lr.redisplay()\n                }\n            }\n            noticeDownloadingProgressEmpty()\n            terminal.writer().print(\"\\u001B[?25h\") // show cursor\n        }\n    }\n}\n\ninternal fun printToScreen(msg: String) {\n    if (!containDownloadingProgress) {\n        if (msg.endsWith(ANSI_RESET)) {\n            lineReader.printAbove(msg)\n        } else {\n            lineReader.printAbove(msg + ANSI_RESET)\n        }\n        return\n    }\n    terminalExecuteLock.withLock {\n        terminalDisplay.update(emptyList(), 0)\n\n        if (msg.endsWith(ANSI_RESET)) {\n            lineReader.printAbove(msg)\n        } else {\n            lineReader.printAbove(msg + ANSI_RESET)\n        }\n\n        updateTerminalDownloadingProgresses()\n        cleanupErase()\n    }\n}\n\ninternal fun printToScreen(msg: AttributedString) {\n    if (!containDownloadingProgress) {\n        return lineReader.printAbove(msg)\n    }\n    terminalExecuteLock.withLock {\n        terminalDisplay.update(emptyList(), 0)\n\n        lineReader.printAbove(msg)\n\n        updateTerminalDownloadingProgresses()\n        cleanupErase()\n    }\n}\n\n\ninternal fun cleanupErase() {\n    val now = currentTimeMillis()\n    terminalDownloadingProgresses.removeIf { pg ->\n        if (!pg.pendingErase) return@removeIf false\n        if (now > pg.eraseTimestamp) {\n            pg.ansiMsg = AttributedString.EMPTY\n            return@removeIf true\n        }\n        return@removeIf false\n    }\n}\n\n\nprivate fun noticeDownloadingProgressEmpty() {\n    synchronized(terminalDownloadingProgressesNoticer) {\n        containDownloadingProgress = false\n        if (terminalDownloadingProgresses.isEmpty()) {\n            terminalDownloadingProgressesNoticer.notifyAll()\n        }\n\n        JLineInputDaemon.tryResumeReader(false)\n    }\n}\n\ninternal fun waitDownloadingProgressEmpty() {\n    synchronized(terminalDownloadingProgressesNoticer) {\n        if (containDownloadingProgress) {\n            terminalDownloadingProgressesNoticer.wait()\n        }\n    }\n}\n\n"
  },
  {
    "path": "mirai-console/frontend/mirai-console-terminal/src/net/mamoe/mirai/console/pure/MiraiConsolePureLoader.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.terminal.net.mamoe.mirai.console.pure\n\nimport net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\n\n@Deprecated(\n    message = \"Please use MiraiConsoleTerminalLoader\",\n    level = DeprecationLevel.HIDDEN,\n    replaceWith = ReplaceWith(\n        \"MiraiConsoleTerminalLoader\",\n        \"net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader\"\n    )\n)\n@DeprecatedSinceMirai(errorSince = \"2.0\", hiddenSince = \"2.10\")\nobject MiraiConsolePureLoader {\n    @Deprecated(\n        message = \"for binary compatibility\",\n        level = DeprecationLevel.HIDDEN\n    )\n    @JvmStatic\n    @DeprecatedSinceMirai(errorSince = \"2.0\", hiddenSince = \"2.10\")\n    fun main(args: Array<String>) {\n        System.err.println(\"WARNING: Mirai Console Pure已经更名为 Mirai Console Terminal\")\n        System.err.println(\"请使用新的入口点 net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader\")\n        MiraiConsoleTerminalLoader.main(args)\n    }\n}\n"
  },
  {
    "path": "mirai-console/frontend/mirai-console-terminal/src/noconsole/NoConsole.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n/*\n * @author Karlatemp <karlatemp@vip.qq.com> <https://github.com/Karlatemp>\n */\n@file:OptIn(ConsoleTerminalExperimentalApi::class)\n\npackage net.mamoe.mirai.console.terminal.noconsole\n\nimport net.mamoe.mirai.console.terminal.ConsoleTerminalExperimentalApi\nimport net.mamoe.mirai.console.terminal.ConsoleTerminalSettings\nimport org.jline.keymap.KeyMap\nimport org.jline.reader.*\nimport org.jline.terminal.Attributes\nimport org.jline.terminal.MouseEvent\nimport org.jline.terminal.Size\nimport org.jline.terminal.Terminal\nimport org.jline.terminal.impl.AbstractTerminal\nimport org.jline.utils.AttributedString\nimport org.jline.utils.NonBlockingReader\nimport java.io.File\nimport java.io.InputStream\nimport java.io.OutputStream\nimport java.io.PrintWriter\n\nprivate const val LN_INT = '\\n'.code\nprivate const val LN_BYTE = '\\n'.code.toByte()\n\ninternal object NoConsoleNonBlockingReader : NonBlockingReader() {\n    override fun read(timeout: Long, isPeek: Boolean): Int {\n        return LN_INT\n    }\n\n    override fun close() {}\n\n    override fun readBuffered(b: CharArray?): Int {\n        return 0\n    }\n}\n\ninternal object AllNextLineInputStream : InputStream() {\n    override fun read(): Int = LN_INT\n\n    override fun available(): Int = 1\n\n    override fun read(b: ByteArray, off: Int, len: Int): Int {\n        for (i in off until (off + len)) {\n            b[i] = LN_BYTE\n        }\n        return len\n    }\n\n    override fun close() {}\n}\n\ninternal object AllIgnoredOutputStream : OutputStream() {\n    override fun close() {}\n    override fun write(b: ByteArray, off: Int, len: Int) {}\n    override fun write(b: ByteArray) {}\n    override fun write(b: Int) {}\n    override fun flush() {}\n}\n\ninternal val SystemOutputPrintStream by lazy {\n    @OptIn(ConsoleTerminalExperimentalApi::class)\n    if (ConsoleTerminalSettings.setupAnsi) {\n        org.fusesource.jansi.AnsiConsole.systemInstall()\n    }\n    System.out\n}\nprivate val ANSI_REGEX = \"\"\"\\u001b\\[[0-9a-zA-Z;]*?m\"\"\".toRegex()\n\ninternal object AllEmptyLineReader : LineReader {\n\n    override fun printAbove(str: String?) {\n        if (str == null) return\n        @OptIn(ConsoleTerminalExperimentalApi::class)\n        if (ConsoleTerminalSettings.noAnsi) {\n            SystemOutputPrintStream.println(ANSI_REGEX.replace(str, \"\"))\n        } else SystemOutputPrintStream.println(str)\n    }\n\n    @OptIn(ConsoleTerminalExperimentalApi::class)\n    override fun readLine(): String =\n        if (ConsoleTerminalSettings.noConsoleSafeReading) ConsoleTerminalSettings.noConsoleReadingReplacement\n        else throw EndOfFileException(\"Unsupported Reading line when console front-end closed.\")\n\n    // region\n    private fun <T> ignored(): T = error(\"Ignored\")\n    override fun readLine(mask: Char?): String = readLine()\n    override fun readLine(prompt: String?): String = readLine()\n    override fun readLine(prompt: String?, mask: Char?): String = readLine()\n    override fun readLine(prompt: String?, mask: Char?, buffer: String?): String = readLine()\n    override fun readLine(prompt: String?, rightPrompt: String?, mask: Char?, buffer: String?): String = readLine()\n    override fun readLine(\n        prompt: String?,\n        rightPrompt: String?,\n        maskingCallback: MaskingCallback?,\n        buffer: String?\n    ): String = readLine()\n\n    override fun printAbove(str: AttributedString?) {\n        str?.let { printAbove(it.toAnsi()) }\n    }\n\n    override fun defaultKeyMaps(): MutableMap<String, KeyMap<Binding>> = ignored()\n    override fun isReading(): Boolean = false\n    override fun variable(name: String?, value: Any?) = this\n    override fun option(option: LineReader.Option?, value: Boolean) = this\n    override fun callWidget(name: String?) {}\n    override fun getVariables(): MutableMap<String, Any> = ignored()\n    override fun getVariable(name: String?): Any = ignored()\n    override fun setVariable(name: String?, value: Any?) {}\n    override fun isSet(option: LineReader.Option?): Boolean = ignored()\n    override fun setOpt(option: LineReader.Option?) {}\n    override fun unsetOpt(option: LineReader.Option?) {}\n    override fun getTerminal(): Terminal = NoConsole\n    override fun getWidgets(): MutableMap<String, Widget> = ignored()\n    override fun getBuiltinWidgets(): MutableMap<String, Widget> = ignored()\n    override fun getBuffer(): Buffer = ignored()\n    override fun getAppName(): String = \"Mirai Console\"\n    override fun runMacro(macro: String?) {}\n    override fun readMouseEvent(): MouseEvent = ignored()\n    override fun getHistory(): History = ignored()\n    override fun getParser(): Parser = ignored()\n    override fun getHighlighter(): Highlighter = ignored()\n    override fun getExpander(): Expander = ignored()\n    override fun getKeyMaps(): MutableMap<String, KeyMap<Binding>> = ignored()\n    override fun getKeyMap(): String = ignored()\n    override fun setKeyMap(name: String?): Boolean = ignored()\n    override fun getKeys(): KeyMap<Binding> = ignored()\n    override fun getParsedLine(): ParsedLine = ignored()\n    override fun getSearchTerm(): String = ignored()\n    override fun getRegionActive(): LineReader.RegionType = ignored()\n    override fun getRegionMark(): Int = ignored()\n    override fun addCommandsInBuffer(commands: MutableCollection<String>?) {}\n    override fun editAndAddInBuffer(file: File?) {}\n    override fun getLastBinding(): String = ignored()\n    override fun getTailTip(): String = ignored()\n    override fun setTailTip(tailTip: String?) {}\n    override fun setAutosuggestion(type: LineReader.SuggestionType?) {}\n    override fun getAutosuggestion(): LineReader.SuggestionType = ignored()\n    // endregion\n}\n\ninternal object NoConsole : AbstractTerminal(\n    \"No Console\", \"No Console\"\n) {\n    override fun reader(): NonBlockingReader = NoConsoleNonBlockingReader\n\n    private val AllIgnoredPrintWriter = object : PrintWriter(AllIgnoredOutputStream) {\n        override fun close() {}\n        override fun flush() {}\n    }\n\n    // We don't need it. Mirai-Console using LineReader to print messages.\n    override fun writer(): PrintWriter = AllIgnoredPrintWriter\n\n    override fun input(): InputStream = AllNextLineInputStream\n\n    override fun output(): OutputStream = AllIgnoredOutputStream\n\n    private val attributes0 = Attributes()\n    override fun getAttributes(): Attributes {\n        return Attributes(attributes0)\n    }\n\n    override fun setAttributes(attr: Attributes?) {\n        attr?.let { attributes0.copy(it) }\n    }\n\n    private val size0 = Size(189, 53)\n    override fun getSize(): Size {\n        return Size().also { it.copy(size0) }\n    }\n\n    override fun setSize(size: Size?) {\n        size?.let { size0.copy(it) }\n    }\n}"
  },
  {
    "path": "mirai-console/frontend/mirai-console-terminal/test/RunTerminal.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.console.terminal\n\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.extensions.BotConfigurationAlterer\nimport net.mamoe.mirai.console.logging.LoggerController\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.SimpleLogger\nimport java.io.File\n\nfun main() {\n    configureUserDir()\n\n    val terminal = object : MiraiConsoleImplementationTerminal() {\n        override val loggerController: LoggerController = object : LoggerController {\n            override fun shouldLog(identity: String?, priority: SimpleLogger.LogPriority): Boolean = true\n        }\n    }\n\n    val mockPlugin = object : KotlinPlugin(JvmPluginDescription(\"org.test.test\", \"1.0.0\")) {}\n\n    MiraiConsoleTerminalLoader.startAsDaemon(terminal)\n\n    terminal.backendAccess.globalComponentStorage.contribute(\n        BotConfigurationAlterer,\n        mockPlugin,\n        BotConfigurationAlterer { _, configuration ->\n            configuration.networkLoggerSupplier = { MiraiLogger.Factory.create(Bot::class, \"Net.${it.id}\") } // deploy\n            configuration\n        }\n    )\n\n    runCatching { runBlocking { MiraiConsole.job.join() } }\n}\n\ninternal fun configureUserDir() {\n    val projectDir = runCatching {\n        File(\".\").resolve(\"frontend\").resolve(\"mirai-console-terminal\").takeIf { it.isDirectory }\n            ?: File(\".\").resolve(\"mirai-console/frontend\").resolve(\"mirai-console-terminal\")\n    }.getOrElse { return }\n    if (projectDir.isDirectory) {\n        val run = projectDir.resolve(\"run\")\n        run.mkdir()\n        System.setProperty(\"user.dir\", run.absolutePath)\n        println(\"[Mirai Console] Set user.dir = ${run.absolutePath}\")\n    }\n}"
  },
  {
    "path": "mirai-console/tools/compiler-annotations/README.md",
    "content": "# mirai-console-compiler-common\n\nMirai Console 编译器注解模块。\n\n提供 `ResolveContext` 和 `RestrictedScope`，帮助 [IntelliJ 插件](../intellij-plugin) 进行语境推断。"
  },
  {
    "path": "mirai-console/tools/compiler-annotations/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"UnusedImport\")\n\nplugins {\n    kotlin(\"multiplatform\")\n    `maven-publish`\n}\n\nversion = Versions.console\ndescription = \"Mirai Console compiler annotations\"\n\nkotlin {\n    explicitApi()\n    apply(plugin = \"explicit-api\")\n\n    configureJvmTargetsHierarchical(\"net.mamoe.mirai.compiler.annotations\")\n}\n\nconfigureMppPublishing()\n"
  },
  {
    "path": "mirai-console/tools/compiler-annotations/src/androidMain/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019-2023 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<manifest package=\"net.mamoe.mirai.console.compiler.common\">\n</manifest>"
  },
  {
    "path": "mirai-console/tools/compiler-annotations/src/commonMain/kotlin/CheckerConstants.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.console.compiler.common\n\nimport kotlin.jvm.JvmField\n\n/**\n * @suppress 这是内部 API. 可能在任意时刻变动\n */\npublic object CheckerConstants {\n    //    @Language(\"RegExp\")\n    public const val PLUGIN_ID_PATTERN: String = \"\"\"([a-zA-Z]\\w*(?:\\.[a-zA-Z]\\w*)*)\\.([a-zA-Z]\\w*(?:-\\w+)*)\"\"\"\n\n    @JvmField\n    public val PLUGIN_ID_REGEX: Regex = Regex(PLUGIN_ID_PATTERN)\n\n\n    @JvmField\n    public val PLUGIN_FORBIDDEN_NAMES: Array<String> = arrayOf(\"main\", \"console\", \"plugin\", \"config\", \"data\")\n}\n"
  },
  {
    "path": "mirai-console/tools/compiler-annotations/src/commonMain/kotlin/ResolveContext.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.compiler.common\n\nimport kotlin.annotation.AnnotationTarget.*\n\n/**\n * 标记一个参数的语境类型, 用于帮助编译器和 IntelliJ 插件进行语境推断.\n */\n@Target(VALUE_PARAMETER, PROPERTY, FIELD, FUNCTION, TYPE, TYPE_PARAMETER)\n@Retention(AnnotationRetention.BINARY)\npublic annotation class ResolveContext(\n    vararg val kinds: Kind,\n) {\n    /**\n     * 元素数量可能在任意时间被改动\n     */\n    public enum class Kind {\n        ///////////////////////////////////////////////////////////////////////////\n        // ConstantKind\n        ///////////////////////////////////////////////////////////////////////////\n\n        /*\n         * WARNING: IF YOU CHANGE NAMES HERE,\n         * YOU SHOULD ALSO CHANGE THEIR COUNTERPARTS AT net.mamoe.mirai.console.compiler.common.resolve.ResolveContextKind\n         */\n\n        /**\n         * PluginDescription.id\n         */\n        PLUGIN_ID, // ILLEGAL_PLUGIN_DESCRIPTION\n\n        /**\n         * PluginDescription.name\n         */\n        PLUGIN_NAME, // ILLEGAL_PLUGIN_DESCRIPTION\n\n        /**\n         * PluginDescription.version\n         * SemVersion.Companion.invoke\n         */\n        SEMANTIC_VERSION, // ILLEGAL_PLUGIN_DESCRIPTION\n\n        /**\n         * SemVersion.Companion.parseRangeRequirement\n         */\n        VERSION_REQUIREMENT, // ILLEGAL_VERSION_REQUIREMENT\n\n        /**\n         * Command.allNames\n         */\n        COMMAND_NAME, // ILLEGAL_COMMAND_NAME\n\n        /**\n         * PermissionId.name\n         */\n        PERMISSION_NAMESPACE, // ILLEGAL_PERMISSION_NAMESPACE\n\n        /**\n         * PermissionId.name\n         */\n        PERMISSION_NAME, // ILLEGAL_PERMISSION_NAME\n\n        /**\n         * PermissionId.parseFromString\n         */\n        PERMISSION_ID, // ILLEGAL_PERMISSION_ID\n\n        /**\n         * 标注一个泛型, 要求这个泛型必须拥有一个公开无参 (或所有参数都可选) 构造器.\n         *\n         * PluginData.value\n         */\n        RESTRICTED_NO_ARG_CONSTRUCTOR, // NOT_CONSTRUCTABLE_TYPE\n\n        RESTRICTED_CONSOLE_COMMAND_OWNER,\n\n        RESTRICTED_ABSTRACT_MESSAGE_KEYS;\n\n        public companion object\n    }\n\n    public companion object\n}"
  },
  {
    "path": "mirai-console/tools/compiler-annotations/src/commonMain/kotlin/RestrictedScope.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.console.compiler.common\n\nimport kotlin.annotation.AnnotationTarget.FUNCTION\n\n/**\n * 标记一个函数, 在其函数体内限制特定一些函数的使用.\n *\n * @suppress 这是实验性 API, 可能会在未来有不兼容变更\n */\n@Target(FUNCTION)\n@Retention(AnnotationRetention.BINARY)\npublic annotation class RestrictedScope(\n    vararg val kinds: Kind,\n) {\n    public enum class Kind {\n        PERMISSION_REGISTER, // ILLEGAL_PERMISSION_REGISTER_USE\n        COMMAND_REGISTER, // ILLEGAL_COMMAND_REGISTER_USE\n    }\n}"
  },
  {
    "path": "mirai-console/tools/compiler-common/README.md",
    "content": "# mirai-console-compiler-common\n\nMirai Console 编译器后端通用模块.\n\n##"
  },
  {
    "path": "mirai-console/tools/compiler-common/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"UnusedImport\")\n\nplugins {\n    kotlin(\"jvm\")\n    id(\"java\")\n    `maven-publish`\n}\n\nrepositories {\n    maven(\"https://maven.aliyun.com/repository/central\")\n}\n\nversion = Versions.console\ndescription = \"Mirai Console compiler resolve\"\n\ndependencies {\n    api(`jetbrains-annotations`)\n    // api(`kotlinx-coroutines-jdk8`)\n    api(project(\":mirai-console-compiler-annotations\"))\n\n    compileOnly(`kotlin-compiler_forIdea`)\n    testRuntimeOnly(`kotlin-compiler_forIdea`)\n}\n\nconfigurePublishing(\"mirai-console-compiler-common\")"
  },
  {
    "path": "mirai-console/tools/compiler-common/src/diagnostics/MiraiConsoleErrors.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\npackage net.mamoe.mirai.console.compiler.common.diagnostics\n\nimport com.intellij.psi.PsiElement\nimport org.jetbrains.kotlin.descriptors.ClassDescriptor\nimport org.jetbrains.kotlin.diagnostics.DiagnosticFactory0.create\nimport org.jetbrains.kotlin.diagnostics.DiagnosticFactory1.create\nimport org.jetbrains.kotlin.diagnostics.DiagnosticFactory2.create\nimport org.jetbrains.kotlin.diagnostics.Errors\nimport org.jetbrains.kotlin.diagnostics.Severity.ERROR\nimport org.jetbrains.kotlin.diagnostics.Severity.WARNING\nimport org.jetbrains.kotlin.psi.*\n\n/**\n * 如何增加一个错误:\n * 1. 在 [MiraiConsoleErrors] 添加\n * 2. 在 [MiraiConsoleErrorsRendering] 添加对应的 render\n */\nobject MiraiConsoleErrors {\n    // plugin desc\n\n    @JvmField\n    val ILLEGAL_PLUGIN_DESCRIPTION = create<PsiElement, String>(ERROR)\n\n    @JvmField\n    val ILLEGAL_VERSION_REQUIREMENT = create<PsiElement, String, String>(ERROR)\n\n    // plugin data\n\n    @JvmField\n    val NOT_CONSTRUCTABLE_TYPE = create<KtTypeProjection, KtCallExpression, String>(ERROR)\n\n    @JvmField\n    val USING_DERIVED_MUTABLE_MAP_TYPE = create<KtTypeProjection, KtCallExpression, String>(ERROR)\n\n    @JvmField\n    val USING_DERIVED_MAP_TYPE = create<KtTypeProjection, KtCallExpression, String>(ERROR)\n\n    @JvmField\n    val USING_DERIVED_LIST_TYPE = create<KtTypeProjection, KtCallExpression, String>(ERROR)\n\n    @JvmField\n    val USING_DERIVED_MUTABLE_LIST_TYPE = create<KtTypeProjection, KtCallExpression, String>(ERROR)\n\n    @JvmField\n    val USING_DERIVED_CONCURRENT_MAP_TYPE = create<KtTypeProjection, KtCallExpression, String>(ERROR)\n\n    @JvmField\n    val UNSERIALIZABLE_TYPE = create<PsiElement, ClassDescriptor>(ERROR)\n\n    @JvmField\n    val READ_ONLY_VALUE_CANNOT_BE_VAR = create<PsiElement>(ERROR)\n\n    // command\n\n    @JvmField\n    val ILLEGAL_COMMAND_NAME = create<PsiElement, String, String>(ERROR)\n\n    @JvmField\n    val ILLEGAL_COMMAND_REGISTER_USE = create<PsiElement, KtNamedDeclaration, String>(ERROR)\n\n    @JvmField\n    val RESTRICTED_CONSOLE_COMMAND_OWNER = create<PsiElement>(WARNING)\n\n    @JvmField\n    val PROHIBITED_ABSTRACT_MESSAGE_KEYS = create<PsiElement>(WARNING)\n\n    @JvmField\n    val ILLEGAL_COMMAND_DECLARATION_RECEIVER = create<KtTypeReference>(ERROR)\n\n    // permission\n\n    @JvmField\n    val ILLEGAL_PERMISSION_NAME = create<PsiElement, String, String>(ERROR)\n\n    @JvmField\n    val ILLEGAL_PERMISSION_ID = create<PsiElement, String, String>(ERROR)\n\n    @JvmField\n    val ILLEGAL_PERMISSION_NAMESPACE = create<PsiElement, String, String>(ERROR)\n\n    @JvmField\n    val ILLEGAL_PERMISSION_REGISTER_USE = create<PsiElement, KtNamedDeclaration, String>(ERROR)\n\n//    @JvmField\n//    val INAPPLICABLE_COMMAND_ANNOTATION = create<PsiElement, String>(ERROR)\n\n    @Suppress(\"ObjectPropertyName\", \"unused\")\n    @JvmField\n    @Deprecated(\"\", level = DeprecationLevel.ERROR)\n    val _init: Any = run {\n        Errors.Initializer.initializeFactoryNamesAndDefaultErrorMessages(\n            MiraiConsoleErrors::class.java,\n            MiraiConsoleErrorsRendering\n        )\n    }\n}"
  },
  {
    "path": "mirai-console/tools/compiler-common/src/diagnostics/MiraiConsoleErrorsRendering.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.compiler.common.diagnostics\n\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.ILLEGAL_COMMAND_DECLARATION_RECEIVER\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.ILLEGAL_COMMAND_NAME\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.ILLEGAL_COMMAND_REGISTER_USE\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.ILLEGAL_PERMISSION_ID\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.ILLEGAL_PERMISSION_NAME\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.ILLEGAL_PERMISSION_NAMESPACE\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.ILLEGAL_PERMISSION_REGISTER_USE\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.ILLEGAL_PLUGIN_DESCRIPTION\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.ILLEGAL_VERSION_REQUIREMENT\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.NOT_CONSTRUCTABLE_TYPE\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.PROHIBITED_ABSTRACT_MESSAGE_KEYS\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.READ_ONLY_VALUE_CANNOT_BE_VAR\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.RESTRICTED_CONSOLE_COMMAND_OWNER\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.UNSERIALIZABLE_TYPE\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.USING_DERIVED_CONCURRENT_MAP_TYPE\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.USING_DERIVED_LIST_TYPE\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.USING_DERIVED_MAP_TYPE\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.USING_DERIVED_MUTABLE_LIST_TYPE\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.USING_DERIVED_MUTABLE_MAP_TYPE\nimport org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages\nimport org.jetbrains.kotlin.diagnostics.rendering.DiagnosticFactoryToRendererMap\nimport org.jetbrains.kotlin.diagnostics.rendering.Renderers\n\n/**\n * @see MiraiConsoleErrors\n */\nobject MiraiConsoleErrorsRendering : DefaultErrorMessages.Extension {\n    private val MAP = DiagnosticFactoryToRendererMap(\"MiraiConsole\").apply {\n        put(\n            ILLEGAL_PLUGIN_DESCRIPTION,\n            \"{0}\",\n            Renderers.TO_STRING,\n        )\n\n        put(\n            NOT_CONSTRUCTABLE_TYPE,\n            \"类型 ''{1}'' 无法通过反射直接构造, 需要提供默认值.\",\n            Renderers.TO_STRING,\n            Renderers.TO_STRING,\n        )\n\n        put(\n            UNSERIALIZABLE_TYPE,\n            \"类型 ''{0}'' 无法被自动序列化, 需要添加序列化器\",\n            Renderers.FQ_NAMES_IN_TYPES,\n        )\n\n        put(\n            ILLEGAL_COMMAND_NAME,\n            \"指令名 ''{0}'' 无效: {1}\",\n            Renderers.TO_STRING,\n            Renderers.TO_STRING,\n        )\n\n        put(\n            ILLEGAL_PERMISSION_NAME,\n            \"权限名 ''{0}'' 无效: {1}\",\n            Renderers.TO_STRING,\n            Renderers.TO_STRING,\n        )\n\n        put(\n            ILLEGAL_PERMISSION_ID,\n            \"权限 Id ''{0}'' 无效: {1}\",\n            Renderers.TO_STRING,\n            Renderers.TO_STRING,\n        )\n\n        put(\n            ILLEGAL_PERMISSION_NAMESPACE,\n            \"权限命名空间 ''{0}'' 无效: {1}\",\n            Renderers.TO_STRING,\n            Renderers.TO_STRING,\n        )\n\n        put(\n            ILLEGAL_COMMAND_REGISTER_USE,\n            \"''{0}'' 无法使用在 ''{1}'' 环境下.\",\n            Renderers.DECLARATION_NAME,\n            Renderers.TO_STRING\n        )\n\n        put(\n            ILLEGAL_PERMISSION_REGISTER_USE,\n            \"''{0}'' 无法使用在 ''{1}'' 环境下.\",\n            Renderers.DECLARATION_NAME,\n            Renderers.TO_STRING\n        )\n\n        put(\n            ILLEGAL_VERSION_REQUIREMENT,\n            \"{1}\",\n            Renderers.TO_STRING,\n            Renderers.TO_STRING\n        )\n\n        put(\n            ILLEGAL_COMMAND_DECLARATION_RECEIVER,\n            \"指令函数的接收者参数必须为 CommandSender 及其子类或无接收者.\",\n        )\n\n        put(\n            RESTRICTED_CONSOLE_COMMAND_OWNER,\n            \"插件不允许使用 ConsoleCommandOwner 构造指令, 请使用插件主类作为 CommandOwner\",\n        )\n\n        put(\n            PROHIBITED_ABSTRACT_MESSAGE_KEYS,\n            \"使用 MessageContent.Key 等抽象消息类型的 Key 没有意义\",\n        )\n\n        put(\n            READ_ONLY_VALUE_CANNOT_BE_VAR,\n            \"在 ReadOnlyPluginData 中不可定义 'var' by value\",\n        )\n\n        put(\n            USING_DERIVED_MAP_TYPE,\n            \"使用 'Map' 的派生类型 {1}.\",\n            Renderers.TO_STRING,\n            Renderers.TO_STRING,\n        )\n\n        put(\n            USING_DERIVED_MUTABLE_MAP_TYPE,\n            \"使用 'MutableMap' 的派生类型 {1}.\",\n            Renderers.TO_STRING,\n            Renderers.TO_STRING,\n        )\n\n        put(\n            USING_DERIVED_LIST_TYPE,\n            \"使用 'List' 的派生类型 {1}.\",\n            Renderers.TO_STRING,\n            Renderers.TO_STRING,\n        )\n\n        put(\n            USING_DERIVED_MUTABLE_LIST_TYPE,\n            \"使用 'MutableList' 的派生类型 {1}.\",\n            Renderers.TO_STRING,\n            Renderers.TO_STRING,\n        )\n\n        put(\n            USING_DERIVED_CONCURRENT_MAP_TYPE,\n            \"使用 'ConcurrentMap' 的派生类型 {1}.\",\n            Renderers.TO_STRING,\n            Renderers.TO_STRING,\n        )\n\n//        put(\n//            INAPPLICABLE_COMMAND_ANNOTATION,\n//            \"''{0}'' 无法在顶层函数使用.\",\n//            Renderers.TO_STRING,\n//        )\n    }\n\n    override fun getMap() = MAP\n}\n"
  },
  {
    "path": "mirai-console/tools/compiler-common/src/resolve/resolveCommon.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.console.compiler.common.resolve\n\nimport com.intellij.psi.PsiElement\nimport com.intellij.psi.PsiFile\nimport org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor\nimport org.jetbrains.kotlin.descriptors.ClassDescriptor\nimport org.jetbrains.kotlin.descriptors.annotations.Annotated\nimport org.jetbrains.kotlin.name.FqName\nimport org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue\n\nfun Annotated.hasAnnotation(fqName: FqName) = this.annotations.hasAnnotation(fqName)\nfun Annotated.findAnnotation(fqName: FqName) = this.annotations.findAnnotation(fqName)\n\n\nval PsiElement.allChildrenWithSelfSequence: Sequence<PsiElement>\n    get() = sequence {\n        yield(this@allChildrenWithSelfSequence)\n        for (child in children) {\n            yieldAll(child.allChildrenWithSelfSequence)\n        }\n    }\n\n\nval PsiElement.childrenWithSelf: List<PsiElement>\n    get() = listOf(this, *children)\n\n\ninline fun <reified E> PsiElement.findParent(): E? = this.parents.filterIsInstance<E>().firstOrNull()\n\n\nval PsiElement.parents: Sequence<PsiElement>\n    get() {\n        val seed = if (this is PsiFile) null else parent\n        return generateSequence(seed) { if (it is PsiFile) null else it.parent }\n    }\n\n\nfun ClassDescriptor.findNoArgConstructor(): ClassConstructorDescriptor? {\n    return constructors.find { desc ->\n        desc.valueParameters.all { it.hasDefaultValue() }\n    }\n}\n\nfun ClassDescriptor.hasNoArgConstructor(): Boolean = this.findNoArgConstructor() != null"
  },
  {
    "path": "mirai-console/tools/compiler-common/src/resolve/resolveTypes.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.compiler.common.resolve\n\nimport net.mamoe.mirai.console.compiler.common.ResolveContext\nimport net.mamoe.mirai.console.compiler.common.castOrNull\nimport net.mamoe.mirai.console.compiler.common.firstValue\nimport org.jetbrains.kotlin.descriptors.annotations.Annotated\nimport org.jetbrains.kotlin.name.FqName\nimport org.jetbrains.kotlin.resolve.constants.ArrayValue\nimport org.jetbrains.kotlin.resolve.constants.EnumValue\n\n///////////////////////////////////////////////////////////////////////////\n// OTHERS\n///////////////////////////////////////////////////////////////////////////\n\nval SERIALIZABLE_FQ_NAME = FqName(\"kotlinx.serialization.Serializable\")\nval AUTO_SERVICE = FqName(\"com.google.auto.service.AutoService\")\n\n\n///////////////////////////////////////////////////////////////////////////\n// Command\n///////////////////////////////////////////////////////////////////////////\n\nval COMPOSITE_COMMAND_SUB_COMMAND_FQ_NAME = FqName(\"net.mamoe.mirai.console.command.CompositeCommand.SubCommand\")\nval SIMPLE_COMMAND_HANDLER_COMMAND_FQ_NAME = FqName(\"net.mamoe.mirai.console.command.SimpleCommand.Handler\")\nval COMMAND_SENDER_FQ_NAME = FqName(\"net.mamoe.mirai.console.command.CommandSender\")\nval CONSOLE_COMMAND_SENDER_FQ_NAME = FqName(\"net.mamoe.mirai.console.command.ConsoleCommandSender\")\nval CONSOLE_COMMAND_OWNER_FQ_NAME = FqName(\"net.mamoe.mirai.console.command.ConsoleCommandOwner\")\n\n///////////////////////////////////////////////////////////////////////////\n// Plugin\n///////////////////////////////////////////////////////////////////////////\n\nval PLUGIN_FQ_NAME = FqName(\"net.mamoe.mirai.console.plugin.Plugin\")\nval JVM_PLUGIN_DESCRIPTION_FQ_NAME = FqName(\"net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\")\nval SIMPLE_JVM_PLUGIN_DESCRIPTION_FQ_NAME = FqName(\"net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\")\n\n///////////////////////////////////////////////////////////////////////////\n// PluginData\n///////////////////////////////////////////////////////////////////////////\n\nval PLUGIN_DATA_VALUE_FUNCTIONS_FQ_FQ_NAME = FqName(\"net.mamoe.mirai.console.data.value\")\nval READ_ONLY_PLUGIN_DATA_FQ_NAME = FqName(\"net.mamoe.mirai.console.data.ReadOnlyPluginData\")\n\n///////////////////////////////////////////////////////////////////////////\n// Resolve\n///////////////////////////////////////////////////////////////////////////\n\nval RESOLVE_CONTEXT_FQ_NAME = FqName(\"net.mamoe.mirai.console.compiler.common.ResolveContext\")\n\nval PROHIBITED_MESSAGE_KEYS = arrayOf(\n    FqName(\"net.mamoe.mirai.message.data.MessageContent.Key\")\n)\n\n/**\n * net.mamoe.mirai.console.compiler.common.ResolveContext.Kind\n */\ntypealias ResolveContextKind = ResolveContext.Kind\n\nfun ResolveContext.Kind.Companion.valueOfOrNull(string: String) =\n    ResolveContext.Kind.values().find { it.name == string }\n\nval Annotated.resolveContextKinds: List<ResolveContextKind>?\n    get() {\n        val ann = this.findAnnotation(RESOLVE_CONTEXT_FQ_NAME) ?: return null\n\n        // https://github.com/mamoe/mirai-console/issues/363\n        if (ann.allValueArguments.isEmpty()) return null\n\n        return ann.allValueArguments\n            .firstValue()\n            .castOrNull<ArrayValue>()?.value\n            ?.mapNotNull { value ->\n                val (_, enumEntryName) = value.castOrNull<EnumValue>()?.value ?: return@mapNotNull null\n                ResolveContextKind.valueOfOrNull(enumEntryName.asString())\n            }\n            ?: return null // undetermined kind\n    }"
  },
  {
    "path": "mirai-console/tools/compiler-common/src/utilCommon.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.console.compiler.common\n\nimport org.jetbrains.kotlin.name.FqName\nimport kotlin.contracts.contract\n\nval SERIALIZABLE_FQ_NAME = FqName(\"kotlinx.serialization.Serializable\")\n\nfun <K, V> Map<K, V>.firstValue(): V = this.entries.first().value\nfun <K, V> Map<K, V>.firstKey(): K = this.entries.first().key\n\n\ninline fun <reified T : Any> Any?.castOrNull(): T? {\n    contract {\n        returnsNotNull() implies (this@castOrNull is T)\n    }\n    return this as? T\n}\n\ninline fun <reified T : Any> Any?.cast(): T {\n    contract {\n        returns() implies (this@cast is T)\n    }\n    return this as T\n}"
  },
  {
    "path": "mirai-console/tools/gradle-plugin/.gitignore",
    "content": "src/main/kotlin/VersionConstants.kt"
  },
  {
    "path": "mirai-console/tools/gradle-plugin/README.md",
    "content": "# Mirai Console Gradle Plugin\n\nMirai Console Gradle 插件。\n\n## 在构建中使用插件\n\n参考 [ConfiguringProjects](../../docs/ConfiguringProjects.md#b使用-gradle-插件配置项目)\n。\n\n## 功能\n\n- 为 `main` 源集配置 `mirai-core-api`，`mirai-console` 依赖\n- 为 `test` 源集配置 `mirai-core`, `mirai-console-terminal` 的依赖 （用于启动测试）\n- 配置 Kotlin 编译目标为 1.8\n- 配置 Kotlin 编译器 `jvm-default` 设置为 `all`, 即为所有接口中的默认实现生成 Java 1.8\n  起支持的 `default` 方法\n- 配置 Java 编译目标为 1.8\n- 配置 Java 编译编码为 UTF-8\n- 配置插件 JAR 打包构建任务 `buildPlugin`（带依赖, 成品 JAR 可以被 Mirai Console 加载）\n\n支持 Kotlin 多平台项目（Multiplatform Projects）。对于 MPP，每个 JVM 或 Android\n目标平台都会被如上配置，对应打包任务带有编译目标的名称，如 `buildPluginJvm`。\n\n### 任务 `buildPlugin`\n\n用于打包插件和依赖为可以放入 Mirai Console `plugins` 目录加载的插件 JAR。\n\n### 任务 `buildPluginLegacy`\n\n用于打包插件和依赖为可以放入 Mirai Console `plugins` 目录加载的插件 JAR。\n\n#### 执行 `buildPlugin`\n\n```shell script\n./gradlew buildPlugin\n```\n\n打包结果存放在 `build/mirai/` 目录下。\n\n## 配置\n\n若要修改 Mirai Console Gradle 插件的默认配置，在 `build.gradle.kts` 或 `build.gradle`\n内，使用 `mirai`：\n\n```kotlin\nmirai { // this: MiraiConsoleExtension\n    // 修改配置，如：\n    jvmTarget = JavaVersion.VERSION_1_8\n}\n```\n\n有关所有可修改的配置，参见 [MiraiConsoleExtension](src/main/kotlin/MiraiConsoleExtension.kt)\n。\n\n### 修改 Java 编译目标\n\nMirai Console Gradle 会覆盖 Java 编译目标为 `1.8`. 若要修改该值, 请通过:\n\n```kotlin\nmirai { // this: MiraiConsoleExtension\n    jvmTarget = JavaVersion.VERSION_16\n}\n```\n\n### 打包依赖\n\n使用任务 `buildPlugin` 即可打包插件 JAR。打包结果输出在 `build/mirai/`。\n\n自 2.11，Mirai Console Gradle 在打包 JAR（`buildPlugin`） 时默认不会携带外部依赖，\n而是会保存一份依赖列表，在加载插件时下载。如果您使用了不可在默认仓库搜索到的依赖, 请以如下配置将依赖打包进入 JAR。\n\n```kotlin\ndependencies {\n    implementation(\"org.example:test:1.0.0\") // 正常地添加一个普通依赖，用于编译\n    \"shadowLink\"(\"org.example:test\") // 告知 mirai-console 在打包插件时包含此依赖；无需包含版本号\n}\n```\n\n特别的, 如果使用了子项目，Mirai Console Gradle 默认也会打包进 JAR，通常这也是期望的行为。\n\n如果您希望 Mirai Console Gradle 像处理一般依赖一样处理 Gradle 子项目（不打包），请使用以下配置：\n\n```kotlin\ndependencies {\n    implementation(project(\":nested\")) // 正常地添加一个子项目依赖，用于编译\n    \"asNormalDep\"(project(\":nested\")) // 告知 mirai-console 在打包插件时将此子项目依赖作为普通依赖处理，即不打包\n}\n```\n\n> 要获取有关插件依赖的更多信息，可参考[插件文档](../../docs/plugin/JVMPlugin.md)。\n\n#### 如何确定是否需要打包依赖\n\n如果插件依赖的都是可在 Maven Central 找到的构建，则无需打包。\n\n[//]: # (### `publishPlugin`)\n\n[//]: # ()\n\n[//]: # (配置好 Bintray 参数，使用 `./gradlew publishPlugin` 可自动发布并上传插件到 Bintray。)\n\n[//]: # ()\n\n[//]: # (如果仓库是公开的，上传的插件在未来可以被 [mirai-console-loader]&#40;https://github.com/iTXTech/mirai-console-loader&#41;)\n\n[//]: # (自动识别并展示在社区插件列表中。)\n\n[//]: # ()\n\n[//]: # (```kotlin)\n\n[//]: # (mirai {)\n\n[//]: # (    publishing {)\n\n[//]: # (        repo = \"mirai\")\n\n[//]: # (        packageName = \"chat-command\")\n\n[//]: # (    })\n\n[//]: # (})\n\n[//]: # (```)\n\n[//]: # ()\n\n[//]: # (*2021/3/21 更新:* 由于 Bintray JCenter 即将关闭，随着论坛的发展，mirai)\n\n[//]: # (正在策划插件中心服务。待插件中心完成后将会提供更好的插件分发平台。)\n\n#### 排除依赖 (过时)\n\n在 2.11 以前，如果要在打包 JAR（`buildPluginLegacy`）时排除一些依赖，请使用如下配置：\n\n```kotlin\nmirai {\n    excludeDependency(\"com.google.code.gson\", \"gson\")\n}\n```\n\n**插件一般不需要手动排除依赖**。Mirai Console 已经包含的依赖都会自动在打包过程中被排除。"
  },
  {
    "path": "mirai-console/tools/gradle-plugin/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"UnusedImport\")\n\nplugins {\n    kotlin(\"jvm\")\n    id(\"java-gradle-plugin\")\n    id(\"com.gradle.plugin-publish\")\n    groovy\n    id(\"java\")\n    //signing\n    `maven-publish`\n}\n\nval integTest = sourceSets.create(\"integTest\")\n\n/**\n * Because we use [compileOnly] for `kotlin-gradle-plugin`, it would be missing\n * in `plugin-under-test-metadata.properties`. Here we inject the jar into TestKit plugin\n * classpath via [PluginUnderTestMetadata] to avoid [NoClassDefFoundError].\n */\nval kotlinVersionForIntegrationTest: Configuration by configurations.creating\n\ndependencies {\n    compileOnly(gradleApi())\n    compileOnly(gradleKotlinDsl())\n    compileOnly(kotlin(\"gradle-plugin-api\"))\n    compileOnly(kotlin(\"gradle-plugin\"))\n    compileOnly(kotlin(\"stdlib\"))\n\n    implementation(\"com.google.code.gson:gson:2.8.6\")\n\n    api(\"com.github.jengelman.gradle.plugins:shadow:6.0.0\")\n    api(`jetbrains-annotations`)\n\n    // override vulnerable Log4J version\n    // https://blog.gradle.org/log4j-vulnerability\n    implementation(`log4j-api`)\n    implementation(`log4j-core`)\n\n    testApi(kotlin(\"test-junit5\"))\n    testApi(`junit-jupiter-api`)\n    testApi(`junit-jupiter-params`)\n\n    \"integTestApi\"(kotlin(\"test-junit5\"))\n    \"integTestApi\"(`junit-jupiter-api`)\n    \"integTestApi\"(`junit-jupiter-params`)\n    \"integTestImplementation\"(`junit-jupiter-engine`)\n    \"integTestImplementation\"(gradleTestKit())\n\n    kotlinVersionForIntegrationTest(kotlin(\"gradle-plugin\", \"1.5.21\"))\n}\n\ntasks.named<PluginUnderTestMetadata>(\"pluginUnderTestMetadata\") {\n    pluginClasspath.from(kotlinVersionForIntegrationTest)\n}\n\nversion = Versions.console\ndescription = \"Gradle plugin for Mirai Console\"\n\nkotlin {\n    explicitApi()\n}\n\n@Suppress(\"UnstableApiUsage\")\ngradlePlugin {\n    testSourceSets(integTest)\n    website.set(\"https://github.com/mamoe/mirai\")\n    vcsUrl.set(\"https://github.com/mamoe/mirai\")\n    plugins {\n        create(\"miraiConsole\") {\n            id = \"net.mamoe.mirai-console\"\n            displayName = \"Mirai Console\"\n            description = project.description\n            implementationClass = \"net.mamoe.mirai.console.gradle.MiraiConsoleGradlePlugin\"\n            tags.set(listOf(\"framework\", \"kotlin\", \"mirai\"))\n        }\n    }\n}\n\n\nval integrationTestTask = tasks.register<Test>(\"integTest\") {\n    description = \"Runs the integration tests.\"\n    group = \"verification\"\n    testClassesDirs = integTest.output.classesDirs\n    classpath = integTest.runtimeClasspath\n    mustRunAfter(tasks.test)\n}\ntasks.check {\n    dependsOn(integrationTestTask)\n}\n\ntasks {\n    val generateBuildConstants by registering {\n        group = \"mirai\"\n        doLast {\n            projectDir.resolve(\"src/main/kotlin/VersionConstants.kt\").apply { createNewFile() }\n                .writeText(\n                    projectDir.resolve(\"src/main/kotlin/VersionConstants.kt.template\").readText()\n                        .replace(\"$\\$CONSOLE_VERSION$$\", Versions.console)\n                        .replace(\"$\\$CORE_VERSION$$\", Versions.core)\n                )\n        }\n    }\n\n    afterEvaluate {\n        getByName(\"compileKotlin\").dependsOn(generateBuildConstants)\n    }\n}\n\nif (System.getenv(\"MIRAI_IS_SNAPSHOTS_PUBLISHING\")?.toBoolean() == true) {\n    configurePublishing(\"mirai-console-gradle\", skipPublicationSetup = true)\n}"
  },
  {
    "path": "mirai-console/tools/gradle-plugin/gradle.properties",
    "content": "#\n# Copyright 2019-2021 Mamoe Technologies and contributors.\n#\n#  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n#  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n#  https://github.com/mamoe/mirai/blob/master/LICENSE\n#\nflatten.sourceset=false"
  },
  {
    "path": "mirai-console/tools/gradle-plugin/src/integTest/kotlin/AbstractTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.gradle\n\nimport org.gradle.testkit.runner.GradleRunner\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.extension.AfterEachCallback\nimport org.junit.jupiter.api.extension.RegisterExtension\nimport org.junit.jupiter.api.io.TempDir\nimport java.io.File\n\nabstract class AbstractTest {\n    @JvmField\n    @TempDir\n    var tempDirField: File? = null\n\n    val tempDir: File get() = tempDirField!!\n\n    lateinit var buildFile: File\n    lateinit var settingsFile: File\n    lateinit var propertiesFile: File\n\n\n    @OptIn(ExperimentalStdlibApi::class)\n    fun runGradle(vararg arguments: String) {\n        System.gc()\n        GradleRunner.create()\n            .withProjectDir(tempDir)\n            .withPluginClasspath()\n            .withGradleVersion(\"7.2\")\n            .forwardOutput()\n            .withEnvironment(System.getenv())\n            .withArguments(buildList {\n                addAll(arguments)\n                add(\"-P\")\n                add(\"kotlin.compiler.execution.strategy=in-process\")\n                add(\"-D\")\n                add(\"org.gradle.jvmargs=-Xmx512m\")\n                add(\"-D\")\n                add(\"file.encoding=UTF-8\")\n            })\n            .build()\n    }\n\n    @BeforeEach\n    fun setup() {\n        println(\"Temp path is \" + tempDir.absolutePath)\n\n        settingsFile = File(tempDir, \"settings.gradle\")\n        settingsFile.delete()\n        settingsFile.writeText(\n            \"\"\"\n            pluginManagement {\n                repositories {\n                    gradlePluginPortal()\n                    mavenCentral()\n                }\n            }\n        \"\"\"\n        )\n\n        File(tempDir, \"gradle.properties\").apply {\n            delete()\n            writeText(\n                \"\"\"\n                org.gradle.daemon=false\n                org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8\n            \"\"\".trimIndent()\n            )\n        }\n\n        buildFile = File(tempDir, \"build.gradle\")\n        buildFile.delete()\n        val ktVersion = \"1.6.0\"\n        val replacedMiraiVersion = \"2.11.0-RC2\"\n        buildFile.writeText(\n            \"\"\"\n            plugins {\n                id(\"org.jetbrains.kotlin.jvm\") version \"$ktVersion\"\n                id(\"net.mamoe.mirai-console\")\n            }\n            \n            repositories {\n                mavenCentral()\n            }\n            // Mirai dev versions not available in gradle test.\n            // So using a released version to run tests\n            ({\n            def modules = [\n            'mirai-core-api',\n            'mirai-core-api-jvm',\n            'mirai-core',\n            'mirai-core-jvm',\n            'mirai-core-utils',\n            'mirai-core-utils-jvm',\n            'mirai-console',\n            'mirai-console-terminal',\n            'mirai-console-compiler-annotations',\n            'mirai-console-compiler-common',\n            ];\n            allprojects { configurations.all { resolutionStrategy.eachDependency { DependencyResolveDetails details ->\n                if (details.requested.group == 'net.mamoe') {\n                    if (modules.contains(details.requested.name)) {\n                        details.useVersion '$replacedMiraiVersion'\n                    }\n                }\n                if (details.requested.group == 'org.jetbrains.kotlin') {\n                    details.useVersion '$ktVersion'\n                }\n            } } }\n            })();\n        \"\"\"\n        )\n\n\n//        buildFile = new File(tempDir, \"build.gradle.kts\")\n//        buildFile.delete()\n//        buildFile << \"\"\"\n//            plugins {\n//                kotlin(\"jvm\") version \"1.4.30\"\n//                id(\"net.mamoe.mirai-console\")\n//            }\n//            repositories {\n//                mavenCentral()\n//            }\n//        \"\"\"\n\n    }\n\n    @JvmField\n    @RegisterExtension\n    internal val after: AfterEachCallback = AfterEachCallback { context ->\n        if (context.executionException.isPresent) {\n            val inst = context.requiredTestInstance as AbstractTest\n            println(\"====================== build.gradle ===========================\")\n            println(inst.tempDir.resolve(\"build.gradle\").readText())\n            println(\"==================== settings.gradle ==========================\")\n            println(inst.tempDir.resolve(\"settings.gradle\").readText())\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/tools/gradle-plugin/src/integTest/kotlin/KotlinTransitiveDependenciesIntegrationTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.gradle\n\nimport org.gradle.testkit.runner.GradleRunner\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.io.TempDir\nimport java.io.ByteArrayOutputStream\nimport java.io.File\nimport java.io.PrintWriter\nimport kotlin.test.Test\n\nclass KotlinTransitiveDependenciesIntegrationTest {\n    @Test\n    fun `user can override Kotlin plugin version`(@TempDir dir: File) {\n        // We're packaging the plugin with kotlin transitive dependencies > 1.4.30\n        // This is testing that users are free to use different versions\n        val userSpecifiedKotlinPluginVersion = \"1.5.21\"\n        dir.resolve(\"settings.gradle\").writeText(\"\")\n        dir.resolve(\"build.gradle\").writeText(\n            \"\"\"\n            plugins {\n                id 'net.mamoe.mirai-console'\n                id 'org.jetbrains.kotlin.jvm' version '$userSpecifiedKotlinPluginVersion'\n            }\n        \"\"\".trimIndent()\n        )\n\n        val stdout = ByteArrayOutputStream()\n        val stderr = ByteArrayOutputStream()\n\n        GradleRunner.create()\n            .withProjectDir(dir)\n            .withGradleVersion(\"7.2\")\n            .withPluginClasspath()\n            .forwardStdOutput(PrintWriter(stdout))\n            .forwardStdError(PrintWriter(stderr))\n            .withArguments(listOf(\"dependencies\"))\n            .build()\n\n        System.out.println(stdout)\n        System.err.println(stderr)\n\n        Assertions.assertTrue(\n            stdout.toString()\n                .contains(\"org.jetbrains.kotlin:kotlin-compiler-embeddable:${userSpecifiedKotlinPluginVersion}\")\n        )\n    }\n}"
  },
  {
    "path": "mirai-console/tools/gradle-plugin/src/integTest/kotlin/TestBuildPlugin.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"DuplicatedCode\", \"FunctionName\")\n\npackage net.mamoe.mirai.console.gradle\n\nimport org.junit.jupiter.api.DisplayName\nimport java.io.File\nimport java.util.zip.ZipFile\nimport kotlin.test.Test\nimport kotlin.test.assertFalse\nimport kotlin.test.assertNotNull\nimport kotlin.test.assertNull\nimport kotlin.test.assertTrue\n\nclass TestBuildPlugin : AbstractTest() {\n    private fun File.wt(text: String) {\n        parentFile?.mkdirs()\n        writeText(text)\n    }\n\n    @Test\n    @DisplayName(\"project as normal dependency\")\n    fun buildWithMultiProjectsAsNormalDependency() {\n        settingsFile.appendText(\n            \"\"\"\n            include(\"nested1\")\n            include(\"nested0\")\n        \"\"\".trimIndent()\n        )\n        tempDir.resolve(\"nested1/build.gradle\").wt(\n            \"\"\"\n            plugins {\n                id(\"org.jetbrains.kotlin.jvm\")\n            }\n            repositories {\n                mavenCentral()\n            }\n        \"\"\".trimIndent()\n        )\n        tempDir.resolve(\"nested0/build.gradle\").wt(\n            \"\"\"\n            plugins {\n                id(\"org.jetbrains.kotlin.jvm\")\n                id(\"net.mamoe.mirai-console\")\n            }\n            dependencies {\n                api project(\":nested1\") \n                api \"com.zaxxer:SparseBitSet:1.2\"\n            }\n            repositories {\n                mavenCentral()\n            }\n        \"\"\".trimIndent()\n        )\n\n        tempDir.resolve(\"build.gradle\").appendText(\n            \"\"\"\n            dependencies {\n                implementation project(\":nested0\") \n                asNormalDep project(\":nested0\")\n            }\n        \"\"\".trimIndent()\n        )\n        tempDir.resolve(\"nested0/src/main/kotlin/test.kt\").wt(\n            \"\"\"\n            package nested\n            public class TestClass\n        \"\"\".trimIndent()\n        )\n        tempDir.resolve(\"nested1/src/main/kotlin/test.kt\").wt(\n            \"\"\"\n            package nested1\n            public class TestClass\n        \"\"\".trimIndent()\n        )\n        tempDir.resolve(\"src/main/kotlin/test.kt\").wt(\n            \"\"\"\n            package thetop\n            public class TestClass\n        \"\"\".trimIndent()\n        )\n\n        runGradle(\":buildPlugin\", \"--stacktrace\", \"--info\")\n\n\n        ZipFile(findJar()).use { zipFile ->\n\n            val dpPrivate = zipFile.getInputStream(\n                zipFile.getEntry(\"META-INF/mirai-console-plugin/dependencies-private.txt\")\n            ).use { it.readBytes().decodeToString() }\n            val dpShared = zipFile.getInputStream(\n                zipFile.getEntry(\"META-INF/mirai-console-plugin/dependencies-shared.txt\")\n            ).use { it.readBytes().decodeToString() }\n\n            assertFalse { dpShared.contains(\"com.zaxxer:SparseBitSet:1.2\") }\n            assertTrue { dpPrivate.contains(\"com.zaxxer:SparseBitSet:1.2\") }\n            assertTrue { dpPrivate.contains(\":nested0\") }\n            assertTrue { dpPrivate.contains(\":nested1\") }\n            assertNotNull(zipFile.getEntry(\"thetop/TestClass.class\"))\n            assertNull(zipFile.getEntry(\"nested/TestClass.class\"))\n            assertNull(zipFile.getEntry(\"nested1/TestClass.class\"))\n        }\n    }\n\n    @Test\n    @DisplayName(\"project as normal dependency 2\")\n    fun buildWithMultiProjectsAsNormalDependency2() {\n        settingsFile.appendText(\n            \"\"\"\n            include(\"nested1\")\n            include(\"nested0\")\n        \"\"\".trimIndent()\n        )\n        tempDir.resolve(\"nested1/build.gradle\").wt(\n            \"\"\"\n            plugins {\n                id(\"org.jetbrains.kotlin.jvm\")\n            }\n            repositories {\n                mavenCentral()\n            }\n        \"\"\".trimIndent()\n        )\n        tempDir.resolve(\"nested0/build.gradle\").wt(\n            \"\"\"\n            plugins {\n                id(\"org.jetbrains.kotlin.jvm\")\n                id(\"net.mamoe.mirai-console\")\n            }\n            dependencies {\n                api project(\":nested1\") \n                api \"com.zaxxer:SparseBitSet:1.2\"\n            }\n            repositories {\n                mavenCentral()\n            }\n        \"\"\".trimIndent()\n        )\n\n        tempDir.resolve(\"build.gradle\").appendText(\n            \"\"\"\n            dependencies {\n                implementation project(\":nested0\") \n                asNormalDep project(\":nested1\")\n            }\n        \"\"\".trimIndent()\n        )\n        tempDir.resolve(\"nested0/src/main/kotlin/test.kt\").wt(\n            \"\"\"\n            package nested\n            public class TestClass\n        \"\"\".trimIndent()\n        )\n        tempDir.resolve(\"nested1/src/main/kotlin/test.kt\").wt(\n            \"\"\"\n            package nested1\n            public class TestClass\n        \"\"\".trimIndent()\n        )\n        tempDir.resolve(\"src/main/kotlin/test.kt\").wt(\n            \"\"\"\n            package thetop\n            public class TestClass\n        \"\"\".trimIndent()\n        )\n\n        runGradle(\":buildPlugin\", \"--stacktrace\", \"--info\")\n\n\n        ZipFile(findJar()).use { zipFile ->\n\n            val dpPrivate = zipFile.getInputStream(\n                zipFile.getEntry(\"META-INF/mirai-console-plugin/dependencies-private.txt\")\n            ).use { it.readBytes().decodeToString() }\n            val dpShared = zipFile.getInputStream(\n                zipFile.getEntry(\"META-INF/mirai-console-plugin/dependencies-shared.txt\")\n            ).use { it.readBytes().decodeToString() }\n\n            assertFalse { dpShared.contains(\"com.zaxxer:SparseBitSet:1.2\") }\n            assertTrue { dpPrivate.contains(\"com.zaxxer:SparseBitSet:1.2\") }\n            assertFalse { dpPrivate.contains(\":nested0\") }\n            assertTrue { dpPrivate.contains(\":nested1\") }\n            assertNotNull(zipFile.getEntry(\"thetop/TestClass.class\"))\n            assertNotNull(zipFile.getEntry(\"nested/TestClass.class\"))\n            assertNull(zipFile.getEntry(\"nested1/TestClass.class\"))\n        }\n    }\n\n    @Test\n    @DisplayName(\"no api extends if using implementation\")\n    fun buildWithMultiProjectsWithoutApi() {\n        settingsFile.appendText(\n            \"\"\"\n            include(\"nested\")\n        \"\"\".trimIndent()\n        )\n        tempDir.resolve(\"nested/build.gradle\").wt(\n            \"\"\"\n            plugins {\n                id(\"org.jetbrains.kotlin.jvm\")\n                id(\"net.mamoe.mirai-console\")\n            }\n            dependencies {\n                api \"com.zaxxer:SparseBitSet:1.2\"\n            }\n            repositories {\n                mavenCentral()\n            }\n        \"\"\".trimIndent()\n        )\n\n        tempDir.resolve(\"build.gradle\").appendText(\n            \"\"\"\n            dependencies {\n                implementation project(\":nested\") \n            }\n        \"\"\".trimIndent()\n        )\n\n        tempDir.resolve(\"nested/src/main/kotlin/test.kt\").wt(\n            \"\"\"\n            package nested\n            public class TestClass\n        \"\"\".trimIndent()\n        )\n        tempDir.resolve(\"src/main/kotlin/test.kt\").wt(\n            \"\"\"\n            package thetop\n            public class TestClass\n        \"\"\".trimIndent()\n        )\n\n        runGradle(\":buildPlugin\", \"--stacktrace\", \"--info\")\n\n\n        ZipFile(findJar()).use { zipFile ->\n\n            val dpPrivate = zipFile.getInputStream(\n                zipFile.getEntry(\"META-INF/mirai-console-plugin/dependencies-private.txt\")\n            ).use { it.readBytes().decodeToString() }\n            val dpShared = zipFile.getInputStream(\n                zipFile.getEntry(\"META-INF/mirai-console-plugin/dependencies-shared.txt\")\n            ).use { it.readBytes().decodeToString() }\n\n            assertFalse { dpShared.contains(\"com.zaxxer:SparseBitSet:1.2\") }\n            assertTrue { dpPrivate.contains(\"com.zaxxer:SparseBitSet:1.2\") }\n\n            assertNotNull(zipFile.getEntry(\"thetop/TestClass.class\"))\n            assertNotNull(zipFile.getEntry(\"nested/TestClass.class\"))\n        }\n    }\n\n    @Test\n    @DisplayName(\"build with multi projects\")\n    fun buildWithMultiProjects() {\n        settingsFile.appendText(\n            \"\"\"\n            include(\"nested\")\n        \"\"\".trimIndent()\n        )\n        tempDir.resolve(\"nested/build.gradle\").wt(\n            \"\"\"\n            plugins {\n                id(\"org.jetbrains.kotlin.jvm\")\n                id(\"net.mamoe.mirai-console\")\n            }\n            dependencies {\n                api \"com.zaxxer:SparseBitSet:1.2\"\n                implementation \"com.google.code.gson:gson:2.8.9\"\n                api \"org.slf4j:slf4j-simple:1.7.32\"\n            }\n            repositories {\n                mavenCentral()\n            }\n        \"\"\".trimIndent()\n        )\n\n        tempDir.resolve(\"build.gradle\").appendText(\n            \"\"\"\n            dependencies {\n                api project(\":nested\") \n                shadowLink \"org.slf4j:slf4j-simple\"\n            }\n        \"\"\".trimIndent()\n        )\n\n        tempDir.resolve(\"nested/src/main/kotlin/test.kt\").wt(\n            \"\"\"\n            package nested\n            public class TestClass\n        \"\"\".trimIndent()\n        )\n        tempDir.resolve(\"src/main/kotlin/test.kt\").wt(\n            \"\"\"\n            package thetop\n            public class TestClass\n        \"\"\".trimIndent()\n        )\n\n        runGradle(\":buildPlugin\", \"dependencies\", \"--stacktrace\", \"--info\")\n        checkOutput()\n\n        ZipFile(findJar()).use { zipFile ->\n            assertNotNull(zipFile.getEntry(\"thetop/TestClass.class\"))\n            assertNotNull(zipFile.getEntry(\"nested/TestClass.class\"))\n        }\n    }\n\n    @Test\n    fun `can build plugin`() {\n        tempDir.resolve(\"build.gradle\").appendText(\n            \"\"\"\n            dependencies {\n                api \"com.zaxxer:SparseBitSet:1.2\"\n                implementation \"com.google.code.gson:gson:2.8.9\"\n                api \"org.slf4j:slf4j-simple:1.7.32\"\n                shadowLink \"org.slf4j:slf4j-simple\"\n            }\n        \"\"\".trimIndent()\n        )\n        runGradle(\"buildPlugin\", \"dependencies\", \"--stacktrace\", \"--info\")\n        checkOutput()\n    }\n\n    @Test\n    fun `can build with bom dependencies`() {\n        tempDir.resolve(\"build.gradle\").appendText(\n            \"\"\"\n            dependencies {\n                implementation platform(\"com.fasterxml.jackson:jackson-bom:2.12.4\")\n            }\n        \"\"\".trimIndent()\n        )\n        runGradle(\"buildPlugin\", \"dependencies\", \"--stacktrace\", \"--info\")\n\n        ZipFile(findJar()).use { zipFile ->\n\n            val dpPrivate = zipFile.getInputStream(\n                zipFile.getEntry(\"META-INF/mirai-console-plugin/dependencies-private.txt\")\n            ).use { it.readBytes().decodeToString() }\n\n            assertFalse { dpPrivate.contains(\"com.fasterxml.jackson:jackson-bom\") }\n        }\n    }\n\n    @Test\n    fun `can build with bom dependencies 2`() {\n        tempDir.resolve(\"build.gradle\").appendText(\n            \"\"\"\n            dependencies {\n                implementation \"com.fasterxml.jackson.core:jackson-annotations:2.12.4\"\n            }\n        \"\"\".trimIndent()\n        )\n        runGradle(\"buildPlugin\", \"dependencies\", \"--stacktrace\", \"--info\")\n\n        ZipFile(findJar()).use { zipFile ->\n\n            val dpPrivate = zipFile.getInputStream(\n                zipFile.getEntry(\"META-INF/mirai-console-plugin/dependencies-private.txt\")\n            ).use { it.readBytes().decodeToString() }\n\n            assertFalse { dpPrivate.contains(\"com.fasterxml.jackson:jackson-bom\") }\n            assertTrue { dpPrivate.contains(\"com.fasterxml.jackson.core:jackson-annotations\") }\n        }\n    }\n\n    @Test\n    @DisplayName(\"Ktor 2.x available\")\n    fun `ktor 2_x`() {\n        tempDir.resolve(\"build.gradle\").appendText(\n            \"\"\"\n            dependencies {\n                implementation \"io.ktor:ktor-client-core:2.0.0\"\n            }\n        \"\"\".trimIndent()\n        )\n        runGradle(\"buildPlugin\", \"dependencies\", \"--stacktrace\", \"--info\")\n\n        ZipFile(findJar()).use { zipFile ->\n\n            val dpPrivate = zipFile.getInputStream(\n                zipFile.getEntry(\"META-INF/mirai-console-plugin/dependencies-private.txt\")\n            ).use { it.readBytes().decodeToString() }\n\n            assertTrue { dpPrivate.contains(\"io.ktor:ktor-client-core:2.0.0\") }\n            assertTrue { dpPrivate.contains(\"io.ktor:ktor-client-core-jvm:2.0.0\") }\n        }\n    }\n\n    @Test\n    @DisplayName(\"can shadow special libraries that another used\")\n    fun issue2070() {\n        tempDir.resolve(\"build.gradle\").appendText(\n            \"\"\"\n            dependencies {\n                 implementation(\"cn.hutool:hutool-extra:5.8.2\")\n                 shadowLink(\"cn.hutool:hutool-core\")\n            }\n        \"\"\".trimIndent()\n        )\n        runGradle(\"buildPlugin\", \"dependencies\", \"--stacktrace\", \"--info\")\n        ZipFile(findJar()).use { zipFile ->\n            assertNotNull(zipFile.getEntry(\"cn/hutool/core/annotation/Alias.class\"))\n\n\n            val dpPrivate = zipFile.getInputStream(\n                zipFile.getEntry(\"META-INF/mirai-console-plugin/dependencies-private.txt\")\n            ).use { it.readBytes().decodeToString() }\n\n            assertFalse { dpPrivate.contains(\"hutool-core\") }\n        }\n\n    }\n\n    private fun findJar(): File = tempDir.resolve(\"build/mirai\").listFiles()!!.first { it.name.endsWith(\".mirai2.jar\") }\n\n    private fun checkOutput() {\n        val jar = findJar()\n        ZipFile(jar).use { zipFile ->\n\n            assertNotNull(zipFile.getEntry(\"org/slf4j/impl/SimpleLogger.class\"))\n\n            val dpPrivate = zipFile.getInputStream(\n                zipFile.getEntry(\"META-INF/mirai-console-plugin/dependencies-private.txt\")\n            ).use { it.readBytes().decodeToString() }\n            val dpShared = zipFile.getInputStream(\n                zipFile.getEntry(\"META-INF/mirai-console-plugin/dependencies-shared.txt\")\n            ).use { it.readBytes().decodeToString() }\n\n            assertTrue { dpShared.contains(\"com.zaxxer:SparseBitSet:1.2\") }\n            assertFalse { dpShared.contains(\"com.google.code.gson:gson\") }\n            assertFalse { dpShared.contains(\"org.slf4j:slf4j-simple\") }\n\n            assertTrue { dpPrivate.contains(\"com.zaxxer:SparseBitSet:1.2\") }\n            assertTrue { dpPrivate.contains(\"com.google.code.gson:gson:2.8.9\") }\n            assertFalse { dpPrivate.contains(\"org.slf4j:slf4j-simple\") }\n            assertFalse { dpPrivate.contains(\"io.ktor\") }\n        }\n\n    }\n\n}"
  },
  {
    "path": "mirai-console/tools/gradle-plugin/src/integTest/kotlin/TestPluginApply.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.gradle\n\nimport kotlin.test.Test\n\nclass TestPluginApply : AbstractTest() {\n\n    @Test\n    fun `can apply plugin`() {\n        runGradle(\"clean\", \"--stacktrace\")\n    }\n}"
  },
  {
    "path": "mirai-console/tools/gradle-plugin/src/main/kotlin/BuildMiraiPluginTask.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.console.gradle\n\nimport com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar\nimport org.gradle.api.tasks.CacheableTask\nimport org.gradle.api.tasks.Internal\nimport org.jetbrains.kotlin.gradle.plugin.KotlinTarget\nimport java.io.File\nimport javax.inject.Inject\n\n@CacheableTask\npublic open class BuildMiraiPluginTask @Inject constructor(\n    @JvmField internal val target: KotlinTarget\n) : ShadowJar() {\n    /**\n     * ShadowJar 打包结果\n     */\n    @get:Internal\n    public val output: File\n        get() = outputs.files.singleFile\n\n    public companion object {\n        /**\n         * Kotlin 单平台或 Java 时的默认 task 名.\n         */\n        public const val DEFAULT_NAME: String = \"buildPlugin\"\n    }\n}"
  },
  {
    "path": "mirai-console/tools/gradle-plugin/src/main/kotlin/BuildMiraiPluginV2.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.gradle\n\nimport org.gradle.api.DefaultTask\nimport org.gradle.api.Project\nimport org.gradle.api.artifacts.*\nimport org.gradle.api.artifacts.component.ProjectComponentIdentifier\nimport org.gradle.api.attributes.AttributeContainer\nimport org.gradle.api.capabilities.Capability\nimport org.gradle.api.file.DuplicatesStrategy\nimport org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration\nimport org.gradle.api.internal.artifacts.ivyservice.resolveengine.artifact.ArtifactVisitor\nimport org.gradle.api.internal.artifacts.ivyservice.resolveengine.artifact.ResolvableArtifact\nimport org.gradle.api.internal.file.FileCollectionInternal\nimport org.gradle.api.internal.file.FileCollectionStructureVisitor\nimport org.gradle.api.tasks.TaskAction\nimport org.gradle.api.tasks.TaskContainer\nimport org.gradle.internal.DisplayName\nimport org.gradle.internal.component.external.model.ModuleComponentArtifactIdentifier\nimport org.gradle.jvm.tasks.Jar\nimport org.gradle.kotlin.dsl.create\nimport org.gradle.kotlin.dsl.get\nimport org.jetbrains.kotlin.gradle.plugin.KotlinCompilation\nimport org.jetbrains.kotlin.gradle.plugin.KotlinTarget\nimport java.io.File\nimport javax.inject.Inject\n\n@Suppress(\"RedundantLambdaArrow\", \"RemoveExplicitTypeArguments\")\npublic open class BuildMiraiPluginV2 : Jar() {\n    public companion object {\n        public const val FILE_SUFFIX: String = \"mirai2.jar\"\n    }\n\n    // @get:Internal\n    private lateinit var metadataTask: GenMetadataTask\n\n    internal open class GenMetadataTask\n    @Inject internal constructor(\n        @JvmField internal val orgTask: BuildMiraiPluginV2,\n    ) : DefaultTask() {\n        companion object {\n            val miraiDependencies = mutableSetOf(\n                \"net.mamoe:mirai-core-api\",\n                \"net.mamoe:mirai-core-api-jvm\",\n                \"net.mamoe:mirai-core-api-android\",\n                \"net.mamoe:mirai-core\",\n                \"net.mamoe:mirai-core-jvm\",\n                \"net.mamoe:mirai-core-android\",\n                \"net.mamoe:mirai-core-utils\",\n                \"net.mamoe:mirai-core-utils-jvm\",\n                \"net.mamoe:mirai-core-utils-android\",\n                \"net.mamoe:mirai-console\",\n                \"net.mamoe:mirai-console-terminal\",\n            )\n        }\n\n        @Suppress(\"LocalVariableName\")\n        @TaskAction\n        internal fun run() {\n            val runtime = mutableSetOf<String>()\n            val api = mutableSetOf<String>()\n            val linkedDependencies = mutableSetOf<String>()\n            val linkToApi = mutableSetOf<String>()\n            val shadowedFiles = mutableSetOf<File>()\n            val shadowedDependencies = mutableSetOf<String>()\n            val subprojects = mutableSetOf<String>()\n            val subprojects_fullpath = mutableSetOf<String>()\n            // val subprojects_unlinked_fullpath = mutableSetOf<String>()\n            val subprojects_linked_fullpath = mutableSetOf<String>()\n\n            project.configurations.findByName(MiraiConsoleGradlePlugin.MIRAI_SHADOW_CONF_NAME)?.allDependencies?.forEach { dep ->\n                if (dep is ExternalModuleDependency) {\n                    val artId = \"${dep.group}:${dep.name}\"\n                    shadowedDependencies.add(artId)\n                }\n            }\n            project.configurations.findByName(MiraiConsoleGradlePlugin.MIRAI_AS_NORMAL_DEP_CONF_NAME)?.allDependencies?.forEach { dep1 ->\n                fun resolve0(dep: Dependency) {\n                    if (dep is ProjectDependency) {\n                        linkedDependencies.add(\"${dep.group}:${dep.name}\")\n                        subprojects_linked_fullpath.add(dep.dependencyProject.path)\n                        dep.dependencyProject.configurations.findByName(\"apiElements\")?.allDependencies?.forEach {\n                            resolve0(it)\n                        }\n                        dep.dependencyProject.configurations.findByName(\"implementation\")?.allDependencies?.forEach {\n                            resolve0(it)\n                        }\n                    }\n                }\n                resolve0(dep1)\n            }\n\n            fun deepForeachDependencies(conf: Configuration?, action: (Dependency) -> Unit) {\n                (conf ?: return).allDependencies.forEach { dep ->\n                    action(dep)\n                    if (dep is ProjectDependency) {\n                        subprojects.add(\"${dep.group}:${dep.name}\")\n                        deepForeachDependencies(dep.dependencyProject.configurations.findByName(conf.name), action)\n                    }\n                }\n\n            }\n\n            fun resolveProject(project: Project, doResolveApi: Boolean) {\n                deepForeachDependencies(project.configurations.findByName(\"apiElements\")) { dep ->\n                    if (dep is ExternalModuleDependency) {\n                        val artId = \"${dep.group}:${dep.name}\"\n                        linkedDependencies.add(artId)\n                        if (doResolveApi) {\n                            linkToApi.add(artId)\n                        }\n                    }\n                    if (dep is ProjectDependency) {\n                        subprojects_fullpath.add(dep.dependencyProject.path)\n                        subprojects.add(\"${dep.group}:${dep.name}\")\n                        resolveProject(dep.dependencyProject, doResolveApi)\n                    }\n                }\n\n                project.configurations.findByName(\"implementation\")?.allDependencies?.forEach { dep ->\n                    if (dep is ExternalModuleDependency) {\n                        linkedDependencies.add(\"${dep.group}:${dep.name}\")\n                    }\n                    if (dep is ProjectDependency) {\n                        subprojects_fullpath.add(dep.dependencyProject.path)\n                        subprojects.add(\"${dep.group}:${dep.name}\")\n                        resolveProject(dep.dependencyProject, false)\n                    }\n                }\n            }\n\n            resolveProject(project, true)\n            linkedDependencies.removeAll(shadowedDependencies)\n            linkToApi.removeAll(shadowedDependencies)\n            linkedDependencies.addAll(miraiDependencies)\n\n            fun ResolvedDependency.depId(): String = \"$moduleGroup:$moduleName\"\n\n            val runtimeClasspath = project.configurations[\"runtimeClasspath\"].resolvedConfiguration\n            fun markAsResolved(resolvedDependency: ResolvedDependency) {\n                val depId = resolvedDependency.depId()\n                if (depId !in shadowedDependencies) {\n                    linkedDependencies.add(depId)\n                }\n                resolvedDependency.children.forEach { markAsResolved(it) }\n            }\n\n            fun linkDependencyTo(resolvedDependency: ResolvedDependency, dependencies: MutableCollection<String>) {\n\n                // bom files\n                if (resolvedDependency.allModuleArtifacts.any { it.extension == \"jar\" }) kotlin.run link@{\n                    if (resolvedDependency.depId() in shadowedDependencies) return@link\n\n                    dependencies.add(resolvedDependency.module.toString())\n                }\n\n                resolvedDependency.children.forEach { linkDependencyTo(it, dependencies) }\n            }\n\n            fun resolveDependency(resolvedDependency: ResolvedDependency) {\n                val depId = resolvedDependency.depId()\n                logger.info { \"resolving         : $depId\" }\n                if (depId in linkedDependencies) {\n                    markAsResolved(resolvedDependency)\n\n                    linkDependencyTo(resolvedDependency, runtime)\n                    if (depId in linkToApi) {\n                        linkDependencyTo(resolvedDependency, api)\n                    }\n                    return\n                }\n                if (depId in subprojects) {\n                    resolvedDependency.children.forEach { resolveDependency(it) }\n                    return\n                }\n            }\n            runtimeClasspath.firstLevelModuleDependencies.forEach { resolveDependency(it) }\n\n            /*subprojects_fullpath.forEach { usedProject ->\n                val subProj = project.project(usedProject)\n                if (\"${subProj.group}:${subProj.name}\" !in linkedDependencies) {\n                    subprojects_unlinked_fullpath.add(usedProject)\n                }\n            }*/\n\n            logger.info { \"linkedDependencies: $linkedDependencies\" }\n            logger.info { \"linkToAPi         : $linkToApi\" }\n            logger.info { \"api               : $api\" }\n            logger.info { \"runtime           : $runtime\" }\n            logger.info { \"subprojects       : $subprojects\" }\n            logger.info { \"subprojects_linked: $subprojects_linked_fullpath\" }\n            // logger.info { \"subprojects_unlink: $subprojects_unlinked_fullpath\" }\n\n            val lenientConfiguration = runtimeClasspath.lenientConfiguration\n            if (lenientConfiguration is DefaultLenientConfiguration) {\n                val resolvedArtifacts = mutableSetOf<ResolvedArtifact>()\n                lenientConfiguration.select().visitArtifacts(object : ArtifactVisitor {\n                    override fun prepareForVisit(source: FileCollectionInternal.Source): FileCollectionStructureVisitor.VisitType {\n                        return FileCollectionStructureVisitor.VisitType.Visit\n                    }\n\n                    override fun visitArtifact(\n                        variantName: DisplayName,\n                        variantAttributes: AttributeContainer,\n                        capabilities: MutableList<out Capability>,\n                        artifact: ResolvableArtifact\n                    ) {\n                        resolvedArtifacts.add(artifact.toPublicView())\n                    }\n\n                    override fun requireArtifactFiles(): Boolean = false\n                    override fun visitFailure(failure: Throwable) {}\n                }, false)\n                resolvedArtifacts\n            } else {\n                runtimeClasspath.resolvedArtifacts\n            }.forEach { artifact ->\n                val artId = artifact.id\n                if (artId is ModuleComponentArtifactIdentifier) {\n                    val cid = artId.componentIdentifier\n                    if (\"${cid.group}:${cid.module}\" in linkedDependencies) {\n                        return@forEach\n                    }\n                }\n                val cid = artId.componentIdentifier\n                if (cid is ProjectComponentIdentifier) {\n                    if (cid.projectPath in subprojects_linked_fullpath) {\n                        return@forEach\n                    }\n                }\n                logger.info { \"  `- $artId - ${artId.javaClass}\" }\n                shadowedFiles.add(artifact.file)\n            }\n\n            shadowedFiles.forEach { file ->\n                if (file.isDirectory) {\n                    orgTask.from(file)\n                } else if (file.extension == \"jar\") {\n                    orgTask.from(project.zipTree(file))\n                } else {\n                    orgTask.from(file)\n                }\n            }\n\n            temporaryDir.also {\n                it.mkdirs()\n            }.let { tmpDir ->\n                tmpDir.resolve(\"api.txt\").writeText(api.sorted().joinToString(\"\\n\"))\n                tmpDir.resolve(\"runtime.txt\").writeText(runtime.sorted().joinToString(\"\\n\"))\n                orgTask.from(tmpDir.resolve(\"api.txt\")) { copy ->\n                    copy.into(\"META-INF/mirai-console-plugin\")\n                    copy.rename { \"dependencies-shared.txt\" }\n                }\n                orgTask.from(tmpDir.resolve(\"runtime.txt\")) { copy ->\n                    copy.into(\"META-INF/mirai-console-plugin\")\n                    copy.rename { \"dependencies-private.txt\" }\n                }\n            }\n        }\n    }\n\n    internal fun registerMetadataTask(tasks: TaskContainer, metadataTaskName: String) {\n        metadataTask = tasks.create<GenMetadataTask>(metadataTaskName, this)\n    }\n\n    internal fun init(target: KotlinTarget) {\n        dependsOn(metadataTask)\n        archiveExtension.set(FILE_SUFFIX)\n        duplicatesStrategy = DuplicatesStrategy.WARN\n\n        val compilations = target.compilations.filter { it.name == KotlinCompilation.MAIN_COMPILATION_NAME }\n        @Suppress(\"DEPRECATION\") // New API requires Kotlin 1.8.0, but we must support lower versions\n        compilations.forEach {\n            dependsOn(it.compileKotlinTask)\n            from(it.output.allOutputs)\n            metadataTask.dependsOn(it.compileKotlinTask)\n        }\n        exclude { elm ->\n            elm.path.startsWith(\"META-INF/\") && elm.name.endsWith(\".sf\", ignoreCase = true)\n        }\n    }\n\n}"
  },
  {
    "path": "mirai-console/tools/gradle-plugin/src/main/kotlin/IGNORED_DEPENDENCIES_IN_SHADOW.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MiraiConsoleGradlePluginKt\")\n\npackage net.mamoe.mirai.console.gradle\n\ninternal val IGNORED_DEPENDENCIES_IN_SHADOW = arrayOf(\n    \"org.jetbrains.kotlin:kotlin-stdlib\",\n    \"org.jetbrains.kotlin:kotlin-stdlib-common\",\n    \"org.jetbrains.kotlin:kotlin-stdlib-metadata\",\n    \"org.jetbrains.kotlin:kotlin-stdlib-jvm\",\n    \"org.jetbrains.kotlin:kotlin-stdlib-jdk7\",\n    \"org.jetbrains.kotlin:kotlin-stdlib-jdk8\",\n\n    \"org.jetbrains.kotlin:kotlin-reflect\",\n    \"org.jetbrains.kotlin:kotlin-reflect-common\",\n    \"org.jetbrains.kotlin:kotlin-reflect-metadata\",\n    \"org.jetbrains.kotlin:kotlin-reflect-jvm\",\n\n    \"org.jetbrains.kotlinx:kotlinx-serialization-core\",\n    \"org.jetbrains.kotlinx:kotlinx-serialization-core-common\",\n    \"org.jetbrains.kotlinx:kotlinx-serialization-core-metadata\",\n    \"org.jetbrains.kotlinx:kotlinx-serialization-core-jvm\",\n\n    \"org.jetbrains.kotlinx:kotlinx-serialization-runtime\",\n    \"org.jetbrains.kotlinx:kotlinx-serialization-runtime-common\",\n    \"org.jetbrains.kotlinx:kotlinx-serialization-runtime-metadata\",\n    \"org.jetbrains.kotlinx:kotlinx-serialization-runtime-jvm\",\n\n    \"org.jetbrains.kotlinx:kotlinx-serialization-protobuf\",\n    \"org.jetbrains.kotlinx:kotlinx-serialization-protobuf-common\",\n    \"org.jetbrains.kotlinx:kotlinx-serialization-protobuf-metadata\",\n    \"org.jetbrains.kotlinx:kotlinx-serialization-protobuf-jvm\",\n\n    \"org.jetbrains.kotlinx:kotlinx-coroutines-core\",\n    \"org.jetbrains.kotlinx:kotlinx-coroutines-core-common\",\n    \"org.jetbrains.kotlinx:kotlinx-coroutines-core-metadata\",\n    \"org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm\",\n\n    \"org.jetbrains.kotlinx:kotlinx-io\",\n    \"org.jetbrains.kotlinx:kotlinx-io-common\",\n    \"org.jetbrains.kotlinx:kotlinx-io-metadata\",\n    \"org.jetbrains.kotlinx:kotlinx-io-jvm\",\n\n    \"org.jetbrains.kotlinx:kotlinx-coroutines-io\",\n    \"org.jetbrains.kotlinx:kotlinx-coroutines-io-common\",\n    \"org.jetbrains.kotlinx:kotlinx-coroutines-io-metadata\",\n    \"org.jetbrains.kotlinx:kotlinx-coroutines-io-jvm\",\n\n    \"org.jetbrains.kotlinx:kotlinx-coroutines-core-jdk7\",\n    \"org.jetbrains.kotlinx:kotlinx-coroutines-core-jdk8\",\n\n    \"org.jetbrains.kotlinx:kotlinx-coroutines-jdk7\",\n    \"org.jetbrains.kotlinx:kotlinx-coroutines-jdk8\",\n\n    \"org.jetbrains.kotlinx:atomicFu\",\n    \"org.jetbrains.kotlinx:atomicFu-common\",\n    \"org.jetbrains.kotlinx:atomicFu-metadata\",\n    \"org.jetbrains.kotlinx:atomicFu-jvm\",\n\n    \"org.jetbrains:annotations:19.0.0\",\n\n    \"io.ktor:ktor-client\",\n    \"io.ktor:ktor-client-common\",\n    \"io.ktor:ktor-client-metadata\",\n    \"io.ktor:ktor-client-jvm\",\n\n    \"io.ktor:ktor-client-cio\",\n    \"io.ktor:ktor-client-cio-common\",\n    \"io.ktor:ktor-client-cio-metadata\",\n    \"io.ktor:ktor-client-cio-jvm\",\n\n    \"io.ktor:ktor-client-core\",\n    \"io.ktor:ktor-client-core-common\",\n    \"io.ktor:ktor-client-core-metadata\",\n    \"io.ktor:ktor-client-core-jvm\",\n\n    \"io.ktor:ktor-client-network\",\n    \"io.ktor:ktor-client-network-common\",\n    \"io.ktor:ktor-client-network-metadata\",\n    \"io.ktor:ktor-client-network-jvm\",\n\n    \"io.ktor:ktor-client-util\",\n    \"io.ktor:ktor-client-util-common\",\n    \"io.ktor:ktor-client-util-metadata\",\n    \"io.ktor:ktor-client-util-jvm\",\n\n    \"io.ktor:ktor-client-http\",\n    \"io.ktor:ktor-client-http-common\",\n    \"io.ktor:ktor-client-http-metadata\",\n    \"io.ktor:ktor-client-http-jvm\",\n\n    \"org.bouncyCastle:bcProv-jdk15on\",\n\n    \"net.mamoe:mirai-core\",\n    \"net.mamoe:mirai-core-metadata\",\n    \"net.mamoe:mirai-core-common\",\n    \"net.mamoe:mirai-core-jvm\",\n    \"net.mamoe:mirai-core-android\",\n    \"net.mamoe:mirai-core-jvmCommon\",\n    \"net.mamoe:mirai-core-commonJvm\",\n\n    \"net.mamoe:mirai-core-utils\",\n    \"net.mamoe:mirai-core-utils-metadata\",\n    \"net.mamoe:mirai-core-utils-common\",\n    \"net.mamoe:mirai-core-utils-jvm\",\n    \"net.mamoe:mirai-core-utils-android\",\n    \"net.mamoe:mirai-core-utils-jvmCommon\",\n    \"net.mamoe:mirai-core-utils-commonJvm\",\n\n    \"net.mamoe:mirai-core-api\",\n    \"net.mamoe:mirai-core-api-metadata\",\n    \"net.mamoe:mirai-core-api-common\",\n    \"net.mamoe:mirai-core-api-jvm\",\n    \"net.mamoe:mirai-core-api-android\",\n    \"net.mamoe:mirai-core-api-jvmCommon\",\n    \"net.mamoe:mirai-core-api-commonJvm\",\n\n    \"net.mamoe:mirai-core-qqAndroid\",\n    \"net.mamoe:mirai-core-qqAndroid-metadata\",\n    \"net.mamoe:mirai-core-qqAndroid-common\",\n    \"net.mamoe:mirai-core-qqAndroid-jvm\",\n\n    \"net.mamoe:mirai-console\",\n    \"net.mamoe:mirai-console-api\", // for future\n    \"net.mamoe:mirai-console-terminal\",\n    \"net.mamoe:mirai-console-graphical\",\n\n    \"net.mamoe.yamlKt:yamlKt\",\n    \"net.mamoe.yamlKt:yamlKt-common\",\n    \"net.mamoe.yamlKt:yamlKt-metadata\",\n    \"net.mamoe.yamlKt:yamlKt-jvm\",\n\n    \"net.mamoe:kotlin-jvm-blocking-bridge\",\n    \"net.mamoe:kotlin-jvm-blocking-bridge-common\",\n    \"net.mamoe:kotlin-jvm-blocking-bridge-metadata\",\n    \"net.mamoe:kotlin-jvm-blocking-bridge-jvm\"\n).map { it.lowercase() }\n    .map { MiraiConsoleExtension.ExcludedDependency(it.substringBefore(':'), it.substringAfterLast(':')) }\n    .toTypedArray()"
  },
  {
    "path": "mirai-console/tools/gradle-plugin/src/main/kotlin/MiraiConsoleExtension.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"MemberVisibilityCanBePrivate\")\n\npackage net.mamoe.mirai.console.gradle\n\nimport com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar\nimport org.gradle.api.JavaVersion\nimport org.gradle.api.XmlProvider\nimport org.gradle.api.plugins.PluginContainer\nimport org.gradle.api.publish.maven.MavenPublication\nimport org.gradle.api.tasks.JavaExec\n\n/**\n * ```\n * mirai {\n *   // 配置\n * }\n * ```\n */\n// must be open\npublic open class MiraiConsoleExtension {\n    /**\n     * 为 `true` 时不自动添加 mirai-core-api 的依赖\n     *\n     * 默认: `false`\n     */\n    public var noCoreApi: Boolean = false\n\n    /**\n     * 为 `true` 时不自动为 test 模块添加 mirai-core 的依赖.\n     *\n     * 默认: `false`\n     */\n    public var noTestCore: Boolean = false\n\n    /**\n     * 为 `true` 时不自动添加 mirai-console 的依赖.\n     *\n     * 默认: `false`\n     */\n    public var noConsole: Boolean = false\n\n    /**\n     * 自动添加的 mirai-core 和 mirai-core-api 的版本.\n     *\n     * 默认: 与本 Gradle 插件编译时的 mirai-core 版本相同. [VersionConstants.CORE_VERSION]\n     */\n    public var coreVersion: String = VersionConstants.CORE_VERSION\n\n    /**\n     * 自动添加的 mirai-console 后端和前端的版本.\n     *\n     * 默认: 与本 Gradle 插件版本相同. [VersionConstants.CONSOLE_VERSION]\n     */\n    public var consoleVersion: String = VersionConstants.CONSOLE_VERSION\n\n    /**\n     * 自动为 test 模块添加的前端依赖名称\n     *\n     * 为 `null` 时不自动为 test 模块添加前端依赖.\n     *\n     * 默认: [MiraiConsoleFrontEndKind.TERMINAL]\n     */\n    public var useTestConsoleFrontEnd: MiraiConsoleFrontEndKind? = MiraiConsoleFrontEndKind.TERMINAL\n\n    /**\n     * Java 和 Kotlin 编译目标. 至少为 [JavaVersion.VERSION_1_8].\n     *\n     * 一般人不需要修改此项.\n     *\n     * 默认: [JavaVersion.VERSION_1_8]\n     */\n    public var jvmTarget: JavaVersion = JavaVersion.VERSION_1_8\n\n    /**\n     * 默认会配置 Kotlin 编译器参数 \"-Xjvm-default=all\". 将此项设置为 `false` 可避免配置.\n     *\n     * 一般人不需要修改此项.\n     *\n     * 默认: `false`\n     */\n    public var dontConfigureKotlinJvmDefault: Boolean = false\n\n    /**\n     * 配置 gradle task runConsole. 将此项设置为 `false` 时不会配置测试环境\n     */\n    public var consoleTestRuntime: Boolean = true\n\n    internal val shadowConfigurations: MutableList<ShadowJar.() -> Unit> = mutableListOf()\n    internal val excludedDependencies: MutableSet<ExcludedDependency> = mutableSetOf()\n    internal val consoleTestRuntimeConf: MutableList<JavaExec.() -> Unit> = mutableListOf()\n\n    public fun setupConsoleTestRuntime(configure: JavaExec.() -> Unit) {\n        consoleTestRuntimeConf.add(configure)\n    }\n\n    internal data class ExcludedDependency(\n        val group: String,\n        val name: String\n    )\n\n    /**\n     * 配置 [ShadowJar] (即打包插件)\n     */\n    public fun configureShadow(configure: ShadowJar.() -> Unit) {\n        shadowConfigurations.add(configure)\n    }\n\n    /**\n     * 在插件打包时忽略一个依赖\n     *\n     * @param notation 格式为 \"groupId:name\". 如 \"org.jetbrains.kotlin:kotlin-stdlib\"\n     */\n    public fun excludeDependency(notation: String) {\n        requireNotNull(notation.count { it == ':' } == 1) { \"Invalid dependency notation $notation.\" }\n        excludedDependencies.add(ExcludedDependency(notation.substringBefore(':'), notation.substringAfter(':')))\n    }\n\n    /**\n     * 在插件打包时忽略一个依赖\n     *\n     * @param group 如 \"org.jetbrains.kotlin\"\n     * @param name 如 \"kotlin-stdlib\"\n     */\n    public fun excludeDependency(group: String, name: String) {\n        excludedDependencies.add(ExcludedDependency(group, name))\n    }\n\n    /**\n     * Bintray 插件成品 JAR 发布 配置.\n     *\n     * @see PluginPublishing\n     * @since 1.1\n     */\n    public val publishing: PluginPublishing = PluginPublishing()\n\n    /**\n     * 控制自动配置 Bintray 发布. 默认为 `false`, 表示不自动配置发布.\n     *\n     * 开启后将会:\n     * - 创建名为 \"mavenJava\" 的 [MavenPublication]\n     * - [应用][PluginContainer.apply] [BintrayPlugin], 配置 Bintray 相关参数\n     * - 创建 task \"publishPlugin\"\n     *\n     * @since 1.1\n     */\n    public var publishingEnabled: Boolean = false\n\n    /**\n     * 开启自动配置 Bintray 插件成品 JAR 发布, 并以 [configure] 配置 [PluginPublishing].\n     *\n     * @see [PluginPublishing]\n     * @see publishingEnabled\n     * @since 1.1\n     */\n    public inline fun publishing(crossinline configure: PluginPublishing.() -> Unit) {\n        publishingEnabled = true\n        publishing.run(configure)\n    }\n\n    /**\n     * 开启自动配置 Bintray 插件成品 JAR 发布.\n     *\n     * @see [PluginPublishing]\n     * @see publishingEnabled\n     * @since 1.1\n     */\n    public fun publishing() {\n        publishingEnabled = true\n    }\n\n    /**\n     * Bintray 插件成品 JAR 发布 配置.\n     *\n     * 对于一个属性 PROP, 会按以下顺序依次尝试读取:\n     * 1. Gradle 参数\n     *   - \"gradle.properties\"\n     *   - ext\n     *   - Gradle -P 启动参数\n     * 2. [System.getProperty] \"PROP\"\n     * 3. 当前和所有父 project 根目录下 \"PROP\" 文件的内容\n     * 4. [System.getenv] \"PROP\"\n     *\n     * @see publishing\n     * @see publishingEnabled\n     * @since 1.1\n     */\n    public class PluginPublishing internal constructor() {\n        ///////////////////////////////////////////////////////////////////////////\n        // Required arguments\n        ///////////////////////////////////////////////////////////////////////////\n\n        /**\n         * Bintray 账户名. 必须.\n         * 若为 `null`, 将会以 [PluginPublishing] 中描述的步骤获取 \"bintray.user\"\n         *\n         * @see [PluginPublishing]\n         */\n        public var user: String? = null\n\n        /**\n         * Bintray 账户 key. 必须.\n         * 若为 `null`, 将会以 [PluginPublishing] 中描述的步骤获取 \"bintray.key\"\n         */\n        public var key: String? = null\n\n        /**\n         * 目标仓库名称. 必须.\n         * 若为 `null`, 将会以 [PluginPublishing] 中描述的步骤获取 \"bintray.repo\"\n         */\n        public var repo: String? = null\n\n        /**\n         * 目标仓库名称. 必须.\n         * 若为 `null`, 将会以 [PluginPublishing] 中描述的步骤获取 \"bintray.package\"\n         */\n        public var packageName: String? = null\n\n\n        ///////////////////////////////////////////////////////////////////////////\n        // Optional arguments\n        ///////////////////////////////////////////////////////////////////////////\n\n        // Artifact\n\n        /**\n         * 发布的 artifact id. 默认为 `project.name`.\n         *\n         * artifact id 是类似于 \"net.mamoe:mirai-console:1.1.0\" 中的 \"mirai-console\"\n         */\n        public var artifactId: String? = null\n\n        /**\n         * 发布的 group id. 默认为 `project.group`.\n         *\n         * group id 是类似于 \"net.mamoe:mirai-console:1.1.0\" 中的 \"net.mamoe\"\n         */\n        public var groupId: String? = null\n\n        /**\n         * 发布的版本号, 默认为 `project.version`\n         *\n         * 版本号是类似于 \"net.mamoe:mirai-console:1.1.0\" 中的 \"1.1.0\"\n         */\n        public var version: String? = null\n\n        /**\n         * 发布的描述, 默认为 `project.description`\n         */\n        public var description: String? = null\n\n        // Bintray\n\n        /**\n         * Bintray organization 名. 可选.\n         * 若为 `null`, 将会以 [PluginPublishing] 中描述的步骤获取 \"bintray.org\".\n         * 仍然无法获取时发布到 [user] 账号下的仓库 [repo], 否则发布到指定 [org] 下的仓库 [repo].\n         */\n        public var org: String? = null\n\n        /**\n         * 上传后自动发布. 默认 `true`.\n         */\n        public var publish: Boolean = true\n\n        /**\n         * 当文件冲突时覆盖. 默认 `false`.\n         */\n        public var override: Boolean = false\n\n        // Custom configurations\n\n        internal val mavenPomConfigs = mutableListOf<XmlProvider.() -> Unit>()\n        internal val mavenPublicationConfigs = mutableListOf<MavenPublication.() -> Unit>()\n\n\n        /**\n         * 自定义配置 maven pom.xml [XmlProvider]\n         */\n        public fun mavenPom(configure: XmlProvider.() -> Unit) {\n            mavenPomConfigs.add(configure)\n        }\n\n        /**\n         * 自定义配置 [MavenPublication]\n         */\n        public fun mavenPublication(configure: MavenPublication.() -> Unit) {\n            mavenPublicationConfigs.add(configure)\n        }\n    }\n}\n\n/**\n * @see MiraiConsoleExtension.useTestConsoleFrontEnd\n */\npublic enum class MiraiConsoleFrontEndKind {\n    TERMINAL,\n}"
  },
  {
    "path": "mirai-console/tools/gradle-plugin/src/main/kotlin/MiraiConsoleGradlePlugin.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MiraiConsoleGradlePluginKt\")\n\npackage net.mamoe.mirai.console.gradle\n\nimport com.github.jengelman.gradle.plugins.shadow.ShadowPlugin\nimport org.gradle.api.Plugin\nimport org.gradle.api.Project\nimport org.gradle.api.Task\nimport org.gradle.api.attributes.Attribute\nimport org.gradle.api.attributes.Usage\nimport org.gradle.api.plugins.JavaPlugin\nimport org.gradle.api.plugins.JavaPluginExtension\nimport org.gradle.api.tasks.JavaExec\nimport org.gradle.api.tasks.compile.JavaCompile\nimport org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions\nimport org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension\nimport org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension\nimport org.jetbrains.kotlin.gradle.dsl.KotlinSingleTargetExtension\nimport org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.MAIN_COMPILATION_NAME\nimport org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler\nimport org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType\nimport org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet\nimport org.jetbrains.kotlin.gradle.plugin.KotlinTarget\n\npublic class MiraiConsoleGradlePlugin : Plugin<Project> {\n    public companion object {\n        internal const val MIRAI_SHADOW_CONF_NAME: String = \"shadowLink\"\n        internal const val MIRAI_AS_NORMAL_DEP_CONF_NAME: String = \"asNormalDep\"\n        internal const val MIRAI_DIRECT_RUN_CONSOLE_CONF_NAME: String = \"testConsoleRuntime\"\n\n        public const val FILE_SUFFIX: String = \"mirai.jar\"\n    }\n\n    private fun KotlinSourceSet.configureSourceSet(project: Project, target: KotlinTarget) {\n        try {\n            languageSettings.optIn(\"kotlin.RequiresOptIn\")\n        } catch (e: NoSuchMethodError) {\n            // User is using < 1.6\n            target.compilations.forEach { compilation ->\n                compilation.kotlinOptions.freeCompilerArgs += \"-Xopt-in=kotlin.RequiresOptIn\"\n            }\n        }\n        dependencies { configureDependencies(project, this@configureSourceSet, target) }\n    }\n\n    private fun Project.configureTarget(target: KotlinTarget) {\n        val miraiExtension = project.miraiExtension\n\n        for (compilation in target.compilations) with(compilation) {\n            kotlinOptions {\n                if (this !is KotlinJvmOptions) return@kotlinOptions\n                jvmTarget = miraiExtension.jvmTarget.toString()\n                if (!miraiExtension.dontConfigureKotlinJvmDefault) freeCompilerArgs =\n                    freeCompilerArgs + \"-Xjvm-default=all\"\n            }\n        }\n        when (target.platformType) {\n            KotlinPlatformType.jvm,\n            KotlinPlatformType.androidJvm,\n            KotlinPlatformType.common\n            -> {\n                target.compilations.flatMap { it.allKotlinSourceSets }.forEach { sourceSet ->\n                    sourceSet.configureSourceSet(project, target)\n                }\n            }\n            else -> {\n            }\n        }\n    }\n\n    @Suppress(\"SpellCheckingInspection\")\n    private fun KotlinDependencyHandler.configureDependencies(\n        project: Project,\n        sourceSet: KotlinSourceSet,\n        target: KotlinTarget\n    ) {\n        val miraiExtension = project.miraiExtension\n\n        val isJvm =\n            target.platformType == KotlinPlatformType.jvm || target.platformType == KotlinPlatformType.androidJvm\n\n        if (!miraiExtension.noCoreApi) compileOnly(\"net.mamoe:mirai-core-api:${miraiExtension.coreVersion}\")\n        if (!miraiExtension.noConsole && isJvm) compileOnly(\"net.mamoe:mirai-console:${miraiExtension.consoleVersion}\")\n\n        if (sourceSet.name.endsWith(\"test\", ignoreCase = true)) {\n            if (!miraiExtension.noCoreApi) api(\"net.mamoe:mirai-core-api:${miraiExtension.coreVersion}\")\n            if (!miraiExtension.noConsole && isJvm) api(\"net.mamoe:mirai-console:${miraiExtension.consoleVersion}\")\n            if (!miraiExtension.noTestCore) api(\"net.mamoe:mirai-core:${miraiExtension.coreVersion}\")\n            if (isJvm) {\n                when (miraiExtension.useTestConsoleFrontEnd) {\n                    MiraiConsoleFrontEndKind.TERMINAL -> api(\"net.mamoe:mirai-console-terminal:${miraiExtension.consoleVersion}\")\n                    null -> {\n                    }\n                }\n            }\n        }\n    }\n\n    private fun Project.configureCompileTarget() {\n        extensions.findByType(JavaPluginExtension::class.java)?.apply {\n            val miraiExtension = miraiExtension\n            sourceCompatibility = miraiExtension.jvmTarget\n            targetCompatibility = miraiExtension.jvmTarget\n        }\n\n        tasks.withType(JavaCompile::class.java) {\n            it.options.encoding = \"UTF8\"\n        }\n    }\n\n    private fun Project.registerGradleTasks() {\n        val miraiExtension = this.miraiExtension\n\n        // Array<String>: [jar name, jar extension]\n        val buildPluginTasks = mutableListOf<Pair<Task, Array<String>>>()\n        tasks.findByName(\"shadowJar\")?.enabled = false\n\n        fun registerBuildPluginTask(target: KotlinTarget, isSingleTarget: Boolean) {\n            tasks.create(\n                \"buildPlugin\".wrapNameWithPlatform(target, isSingleTarget),\n                BuildMiraiPluginV2::class.java\n            ).also { buildPluginV2 ->\n                buildPluginV2.group = \"mirai\"\n                buildPluginV2.registerMetadataTask(\n                    tasks,\n                    \"miraiPrepareMetadata\".wrapNameWithPlatform(target, isSingleTarget)\n                )\n                buildPluginV2.init(target)\n                buildPluginV2.destinationDirectory.value(\n                    project.layout.projectDirectory.dir(project.buildDir.name).dir(\"mirai\")\n                )\n                buildPluginTasks.add(buildPluginV2 to arrayOf(project.name + \"-dev\", BuildMiraiPluginV2.FILE_SUFFIX))\n            }\n            tasks.create(\n                \"buildPluginLegacy\".wrapNameWithPlatform(target, isSingleTarget),\n                BuildMiraiPluginTask::class.java,\n                target\n            ).apply shadow@{\n                group = \"mirai\"\n\n                archiveExtension.set(FILE_SUFFIX)\n\n                val compilations = target.compilations.filter { it.name == MAIN_COMPILATION_NAME }\n\n                compilations.forEach {\n                    @Suppress(\"DEPRECATION\") // We need to support older Kotlin versions\n                    dependsOn(it.compileKotlinTask)\n                    from(it.output.allOutputs)\n                }\n\n                from(project.configurations.getByName(\"runtimeClasspath\").copyRecursive { dependency ->\n                    for (excludedDependency in IGNORED_DEPENDENCIES_IN_SHADOW + miraiExtension.excludedDependencies) {\n                        if (excludedDependency.group.equals(dependency.group, ignoreCase = true)\n                            && excludedDependency.name.equals(dependency.name, ignoreCase = true)\n                        ) return@copyRecursive false\n                    }\n                    true\n                })\n\n                exclude { file ->\n                    file.name.endsWith(\".sf\", ignoreCase = true)\n                }\n\n                destinationDirectory.value(project.layout.projectDirectory.dir(project.buildDir.name).dir(\"mirai\"))\n\n                miraiExtension.shadowConfigurations.forEach { it.invoke(this@shadow) }\n            }\n        }\n\n        val targets = kotlinTargets\n        val isSingleTarget = targets.size == 1\n        targets.forEach { target ->\n            registerBuildPluginTask(target, isSingleTarget)\n        }\n\n        if (miraiExtension.consoleTestRuntime) {\n            dependencies.add(\n                MIRAI_DIRECT_RUN_CONSOLE_CONF_NAME,\n                \"net.mamoe:mirai-core-api:${miraiExtension.coreVersion}\"\n            )\n            dependencies.add(\n                MIRAI_DIRECT_RUN_CONSOLE_CONF_NAME,\n                \"net.mamoe:mirai-core:${miraiExtension.coreVersion}\"\n            )\n            dependencies.add(\n                MIRAI_DIRECT_RUN_CONSOLE_CONF_NAME,\n                \"net.mamoe:mirai-console:${miraiExtension.consoleVersion}\"\n            )\n            val frontendDep = when (miraiExtension.useTestConsoleFrontEnd) {\n                MiraiConsoleFrontEndKind.TERMINAL -> \"net.mamoe:mirai-console-terminal:${miraiExtension.consoleVersion}\"\n                null -> null\n            }\n            if (frontendDep != null) {\n                dependencies.add(MIRAI_DIRECT_RUN_CONSOLE_CONF_NAME, frontendDep)\n            }\n            tasks.register(\"runConsole\", JavaExec::class.java) { runConsole ->\n                runConsole.group = \"mirai\"\n                runConsole.classpath += configurations.getByName(MIRAI_DIRECT_RUN_CONSOLE_CONF_NAME)\n                runConsole.mainClass.set(\n                    when (miraiExtension.useTestConsoleFrontEnd) {\n                        MiraiConsoleFrontEndKind.TERMINAL -> \"net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader\"\n                        null -> \"ERROR_mirai_console_frontend_not_found\"\n                    }\n                )\n                // default runs on $projectDir/debug-sandbox\n                runConsole.workingDir = project.projectDir.resolve(\"debug-sandbox\")\n                runConsole.doFirst {\n                    // working dir can be changed by user\n                    val plugins = runConsole.workingDir.resolve(\"plugins\")\n                    plugins.mkdirs()\n                    buildPluginTasks.forEach { (buildPluginTask, jarNameMetadata) ->\n                        val (jarName, jarSuffix) = jarNameMetadata\n                        buildPluginTask.outputs.files.files.forEachIndexed { index, outFile ->\n                            val name = jarName + if (index == 0) {\n                                \"\"\n                            } else {\n                                \"-$index\"\n                            } + '.' + jarSuffix\n                            outFile.copyTo(plugins.resolve(name), overwrite = true)\n                        }\n                    }\n                }\n                runConsole.standardInput = System.`in`\n                runConsole.jvmArgs(\"-Dmirai.console.skip-end-user-readme\")\n\n                buildPluginTasks.forEach { runConsole.dependsOn(it.first) }\n                miraiExtension.consoleTestRuntimeConf.forEach { it.invoke(runConsole) }\n            }\n        }\n    }\n\n    private fun Project.setupConfigurations() {\n        configurations.create(MIRAI_SHADOW_CONF_NAME).isCanBeResolved = false\n        configurations.create(MIRAI_AS_NORMAL_DEP_CONF_NAME).isCanBeResolved = false\n        configurations.create(MIRAI_DIRECT_RUN_CONSOLE_CONF_NAME).let { runConsoleConf ->\n            runConsoleConf.attributes { ac ->\n                fun attribute(key: String, value: String) {\n                    ac.attribute(Attribute.of(key, String::class.java), value)\n                }\n                attribute(\"org.jetbrains.kotlin.platform.type\", \"jvm\")\n\n                ac.attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class.java, Usage.JAVA_RUNTIME))\n            }\n        }\n    }\n\n    override fun apply(target: Project): Unit = with(target) {\n        extensions.create(\"mirai\", MiraiConsoleExtension::class.java)\n\n        plugins.apply(JavaPlugin::class.java)\n        plugins.apply(\"org.gradle.maven-publish\")\n        // plugins.apply(\"org.gradle.maven\")\n        plugins.apply(ShadowPlugin::class.java)\n\n        project.setupConfigurations()\n\n        afterEvaluate {\n            configureCompileTarget()\n            kotlinTargets.forEach { configureTarget(it) }\n            registerGradleTasks()\n            configurePublishing()\n        }\n    }\n}\n\ninternal val Project.miraiExtension: MiraiConsoleExtension\n    get() = extensions.findByType(MiraiConsoleExtension::class.java)\n        ?: error(\"Cannot find MiraiConsoleExtension in project ${this.name}\")\n\ninternal val Project.kotlinTargets: Collection<KotlinTarget>\n    get() {\n        val kotlinExtension = extensions.findByType(KotlinProjectExtension::class.java)\n            ?: error(\"Kotlin plugin not applied. Please read https://www.kotlincn.net/docs/reference/using-gradle.html\")\n\n        return when (kotlinExtension) {\n            is KotlinMultiplatformExtension -> kotlinExtension.targets\n            is KotlinSingleTargetExtension<*> -> listOf(kotlinExtension.target)\n            else -> error(\"[MiraiConsole] Internal error: kotlinExtension is neither KotlinMultiplatformExtension nor KotlinSingleTargetExtension\")\n        }\n    }\n\ninternal val Project.kotlinJvmOrAndroidTargets: Collection<KotlinTarget>\n    get() = kotlinTargets.filter { it.platformType == KotlinPlatformType.jvm || it.platformType == KotlinPlatformType.androidJvm }\n"
  },
  {
    "path": "mirai-console/tools/gradle-plugin/src/main/kotlin/VersionConstants.kt.template",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.console.gradle\n\ninternal object VersionConstants {\n    const val CONSOLE_VERSION = \"$$CONSOLE_VERSION$$\" // value is written here automatically during build\n    const val CORE_VERSION = \"$$CORE_VERSION$$\" // value is written here automatically during build\n}"
  },
  {
    "path": "mirai-console/tools/gradle-plugin/src/main/kotlin/dsl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.gradle\n\nimport org.gradle.api.logging.Logger\n\ninternal inline fun Logger.info(msg: () -> String) {\n    if (isInfoEnabled) info(msg())\n}"
  },
  {
    "path": "mirai-console/tools/gradle-plugin/src/main/kotlin/publishing.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.console.gradle\n\nimport com.google.gson.Gson\nimport org.gradle.api.Project\nimport org.gradle.api.artifacts.Configuration\nimport org.gradle.api.publish.maven.MavenPublication\nimport org.gradle.api.tasks.bundling.Jar\nimport org.gradle.kotlin.dsl.get\nimport org.gradle.kotlin.dsl.getValue\nimport org.gradle.kotlin.dsl.provideDelegate\nimport org.gradle.kotlin.dsl.registering\nimport org.jetbrains.kotlin.gradle.plugin.KotlinTarget\nimport java.util.*\n\n//private val Project.selfAndParentProjects: Sequence<Project>\n//    get() = generateSequence(this) { it.parent }\n//\n//private fun Project.findPropertySmart(propName: String): String? {\n//    return findProperty(propName)?.toString()\n//        ?: System.getProperty(propName)\n//        ?: selfAndParentProjects.map { it.projectDir.resolve(propName) }.find { it.exists() }?.readText()\n//        ?: System.getenv(propName)\n//}\n//\n//private class PropertyNotFoundException(message: String) : RuntimeException(message)\n//\n//private fun Project.findPropertySmartOrFail(propName: String): String {\n//    return findPropertySmart(propName)\n//        ?: throw PropertyNotFoundException(\"[Mirai Console] Cannot find property for publication: '$propName'. Please check your 'mirai' configuration.\")\n//}\n\ninternal fun Project.configurePublishing() {\n    if (!miraiExtension.publishingEnabled) return\n    val isSingleTarget = kotlinJvmOrAndroidTargets.size == 1\n\n    kotlinJvmOrAndroidTargets.forEach {\n        registerPublishPluginTasks(it, isSingleTarget)\n        registerMavenPublications(it, isSingleTarget)\n    }\n}\n\n// effectively public\ninternal data class PluginMetadata(\n    val metadataVersion: Int,\n    val groupId: String,\n    val artifactId: String,\n    val version: String,\n    val description: String?,\n    val dependencies: List<String>\n)\n\ninternal fun String.wrapNameWithPlatform(target: KotlinTarget, isSingleTarget: Boolean): String {\n    return if (isSingleTarget) this else \"$this${\n        target.name.replaceFirstChar {\n            if (it.isLowerCase()) it.titlecase(\n                Locale.getDefault()\n            ) else it.toString()\n        }\n    }\"\n}\n\nprivate fun Project.registerPublishPluginTasks(target: KotlinTarget, isSingleTarget: Boolean) {\n    tasks.register(\"generatePluginMetadata\".wrapNameWithPlatform(target, isSingleTarget)).get().apply {\n        group = \"mirai\"\n\n        val metadataFile =\n            project.buildDir.resolve(\"mirai\")\n                .resolve(if (isSingleTarget) \"mirai-plugin.metadata\" else \"mirai-plugin-${target.name}.metadata\")\n        outputs.file(metadataFile)\n\n\n\n        doLast {\n            val mirai = miraiExtension\n\n            val output = outputs.files.singleFile\n            output.parentFile.mkdir()\n\n            fun getConfigurationsToInclude(): List<Configuration> {\n                val compilation = target.compilations[\"main\"]\n                return compilation.relatedConfigurationNames.map { configurations[it] }\n            }\n\n            val dependencies = getConfigurationsToInclude().flatMap { it.allDependencies }.map {\n                \"${it.group}:${it.name}:${it.version}\"\n            }.distinct()\n\n            val json = Gson().toJson(\n                PluginMetadata(\n                    metadataVersion = 1,\n                    groupId = mirai.publishing.groupId ?: project.group.toString(),\n                    artifactId = mirai.publishing.artifactId ?: project.name,\n                    version = mirai.publishing.version ?: project.version.toString(),\n                    description = mirai.publishing.description ?: project.description,\n                    dependencies = dependencies\n                )\n            )\n\n            logger.info(\"Generated mirai plugin metadata json: $json\")\n\n            output.writeText(json)\n        }\n\n        Unit\n    }\n\n//    val bintrayUpload = tasks.getByName(BintrayUploadTask.getTASK_NAME()).dependsOn(\n//        \"buildPlugin\".wrapNameWithPlatform(target, isSingleTarget),\n//        generateMetadataTask,\n//        // \"shadowJar\",\n//        tasks.filterIsInstance<BuildMiraiPluginTask>().single { it.target == target }\n//    )\n//    tasks.register(\"publishPlugin\".wrapNameWithPlatform(target, isSingleTarget)).get().apply {\n//        group = \"mirai\"\n//        dependsOn(bintrayUpload)\n//    }\n}\n\nprivate fun Project.registerMavenPublications(target: KotlinTarget, isSingleTarget: Boolean) {\n    val mirai = miraiExtension\n\n    @Suppress(\"DEPRECATION\")\n    val sourcesJar by tasks.registering(Jar::class) {\n        archiveClassifier.set(\"sources\")\n        from(sourceSets[\"main\"].allSource)\n    }\n\n    publishing {\n        /*\n        repositories {\n            maven {\n                // change to point to your repo, e.g. http://my.org/repo\n                url = uri(\"$buildDir/repo\")\n            }\n        }*/\n        publications.register(\n            \"mavenJava\".wrapNameWithPlatform(target, isSingleTarget),\n            MavenPublication::class.java\n        ) { publication ->\n            with(publication) {\n                from(components[\"java\"])\n\n                this.groupId = mirai.publishing.groupId ?: project.group.toString()\n                this.artifactId = mirai.publishing.artifactId ?: project.name\n                this.version = mirai.publishing.version ?: project.version.toString()\n\n                pom.withXml { xml ->\n                    val root = xml.asNode()\n                    root.appendNode(\"description\", project.description)\n                    root.appendNode(\"name\", project.name)\n                    // root.appendNode(\"url\", vcs)\n                    root.children().last()\n\n                    mirai.publishing.mavenPomConfigs.forEach { it.invoke(xml) }\n                }\n\n                artifact(sourcesJar.get())\n                artifact(tasks.filterIsInstance<BuildMiraiPluginTask>().single { it.target == target })\n                artifact(\n                    mapOf(\n                        \"source\" to tasks.getByName(\n                            \"generatePluginMetadata\".wrapNameWithPlatform(\n                                target,\n                                isSingleTarget\n                            )\n                        ).outputs.files.singleFile,\n                        \"extension\" to \"mirai.metadata\"\n                    )\n                )\n\n                mirai.publishing.mavenPublicationConfigs.forEach { it.invoke(this) }\n            }\n        }\n    }\n}\n\n\n@PublishedApi\ninternal val Project.sourceSets: org.gradle.api.tasks.SourceSetContainer\n    get() = (this as org.gradle.api.plugins.ExtensionAware).extensions.getByName(\"sourceSets\") as org.gradle.api.tasks.SourceSetContainer\n\n/**\n * Configures the [publishing][org.gradle.api.publish.PublishingExtension] extension.\n */\n@PublishedApi\ninternal fun Project.publishing(configure: org.gradle.api.publish.PublishingExtension.() -> Unit): Unit =\n    (this as org.gradle.api.plugins.ExtensionAware).extensions.configure(\"publishing\", configure)\n"
  },
  {
    "path": "mirai-console/tools/gradle-plugin/test/net/mamoe/mirai/console/gradle/AbstractTest.groovy",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.console.gradle\n\nimport kotlin.Pair\nimport org.gradle.testkit.runner.GradleRunner\nimport org.junit.jupiter.api.AfterEach\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.io.TempDir\n\nabstract class AbstractTest {\n    @TempDir\n    public File tempDir\n    File buildFile\n    File settingsFile\n    File propertiesFile\n\n    private static Pair<String, Integer> getProxy() {\n        if (System.getenv(\"user.name\") == \"Him188\") new Pair<String, Integer>(\"127.0.0.1\", 7890)\n        else null\n    }\n\n    def gradleRunner() {\n        GradleRunner.create()\n                .withProjectDir(tempDir)\n                .withPluginClasspath()\n                .forwardOutput()\n                .withEnvironment(System.getenv())\n    }\n\n    @BeforeEach\n    void setup() {\n        println('Temp path is ' + tempDir.absolutePath)\n\n        settingsFile = new File(tempDir, \"settings.gradle\")\n        settingsFile.delete()\n        settingsFile << \"\"\"\n            pluginManagement {\n                repositories {\n                    gradlePluginPortal()\n                    mavenCentral()\n                }\n            }\n        \"\"\"\n\n\n        propertiesFile = new File(tempDir, \"gradle.properties\")\n        propertiesFile.delete()\n        def proxy = getProxy()\n        if (proxy != null) propertiesFile << \"\"\"\n            |systemProp.http.proxyHost=${proxy.first}\n            |systemProp.http.proxyPort=${proxy.second}\n            |systemProp.https.proxyHost=${proxy.first}\n            |systemProp.https.proxyPort=${proxy.second}\n        \"\"\".stripMargin()\n\n\n//        buildFile = new File(tempDir, \"build.gradle\")\n//        buildFile.delete()\n//        buildFile << \"\"\"\n//            plugins {\n//                id 'org.jetbrains.kotlin.jvm' version '1.4.32'\n//                id 'net.mamoe.mirai-console'\n//            }\n//            repositories {\n//                mavenCentral()\n//            }\n//        \"\"\"\n\n\n        buildFile = new File(tempDir, \"build.gradle.kts\")\n        buildFile.delete()\n        buildFile << \"\"\"\n            plugins {\n                kotlin(\"jvm\") version \"1.4.30\"\n                id(\"net.mamoe.mirai-console\")\n            }\n            repositories {\n                mavenCentral()\n            }\n        \"\"\"\n    }\n\n    @AfterEach\n    void cleanup() {\n        tempDir.deleteDir()\n    }\n}\n"
  },
  {
    "path": "mirai-console/tools/gradle-plugin/test/net/mamoe/mirai/console/gradle/TestPluginApply.groovy",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.console.gradle\n\nimport org.junit.jupiter.api.Test\n\nimport static org.gradle.testkit.runner.TaskOutcome.SUCCESS\n\nclass TestPluginApply extends AbstractTest {\n\n    @Test\n    void \"can apply plugin\"() {\n        def result = gradleRunner()\n                .withArguments(\"clean\", \"--stacktrace\")\n                .build()\n\n        assert result.task('clean').outcome == SUCCESS\n    }\n}\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/.gitignore",
    "content": "run/idea-sandbox\n!src/creator/build"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/README.md",
    "content": "# mirai-console-intellij\n\n[IntelliJ](https://www.jetbrains.com/idea/) 平台的 Mirai 和 Mirai Console 开发辅助插件，支持 IntelliJ IDEA Community/Ultimate，Android Studio。\n\n主要提供一些编辑中的错误诊断。\n\n## mirai-core 诊断\n\n### `Message`\n\n#### [UsingStringPlusMessageInspection](src/diagnostics/UsingStringPlusMessageInspection.kt#L33)\n\n- 检查并报错 `String + Message` 的使用\n\n> `String + Message` 实际上是 `String + Message.toString()`，`Message` 会被转为 `String` 再与 `String` 相加。\n\n```kotlin\n    val str: String = \"\"\n    val plain: PlainText = PlainText(\"\")\n    str + plain\n//  ^^^\n//  使用 String + Message 会导致 Message 被转换为 String 再相加 \n```\n\n提供修复 [ConvertToPlainTextFix](src/diagnostics/fix/ConvertToPlainTextFix.kt#L26)\n\n```kotlin\n// before\nstr + plain\n// after\nPlainText(str) + plain\n```\n\n## mirai-console 诊断\n\n### `Plugin`\n\n#### [PluginMainServiceNotConfiguredInspection](src/diagnostics/PluginMainServiceNotConfiguredInspection.kt#L38)`PluginMainServiceNotConfiguredInspe\n\n检查插件主类服务（即 `META-INF/services`）配置。在未正确配置时报错并提供自动修复 [ConfigurePluginMainServiceFix](src/diagnostics/fix/ConfigurePluginMainServiceFix.kt#L26):\n\n```kotlin\nobject MyPluginMain : KotlinPlugin()\n//     ^^^^^^^^^^^^\n//     插件主类服务未配置\n```\n\n自动修复会在 `META-INF/services` 创建一个 `net.mamoe.mirai.console.plugin.jvm.JvmPlugin` 文件。\n\n### `PluginDescription`\n\n- ILLEGAL_PLUGIN_DESCRIPTION: 检查插件 ID, 名称等\n- ILLEGAL_VERSION_REQUIREMENT: 检查插件依赖版本号\n\n### `PluginData`\n\n检查 `PluginData.value` 的泛型，\n\n- NOT_CONSTRUCTABLE_TYPE: 在该类型无法被反射构造时报错\n- UNSERIALIZABLE_TYPE: 在该类型无法被序列化时报错\n- READ_ONLY_VALUE_CANNOT_BE_VAR: 检查 `ReadOnlyPluginData` 中的 `var` 并提供修复\n\n> 通常能被反射构造的类型需要有一个公开的所有参数都可选的构造器。在 Java 则需一个公开无参构造器。\n\n### `Command`\n\n- ILLEGAL_COMMAND_NAME: 检查指令名称\n- ILLEGAL_COMMAND_REGISTER_USE: 检查一些错误的 `CommandManager.registerCommand` 使用\n- RESTRICTED_CONSOLE_COMMAND_OWNER: 检查错误的 `ConsoleCommandOwner` 使用\n- ILLEGAL_COMMAND_DECLARATION_RECEIVER: 检查指令定义的接收者参数 (只允许 `CommandSender` 类型)\n\n### `Permission`\n\n- ILLEGAL_PERMISSION_NAME: 检查权限名称\n- ILLEGAL_PERMISSION_NAMESPACE: 检查权限命名空间\n- ILLEGAL_PERMISSION_REGISTER_USE: 检查一些错误的 `CommandManager.registerCommand` 使用\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"UnusedImport\")\n\nplugins {\n    kotlin(\"jvm\")\n    id(\"java\")\n    `maven-publish`\n\n    id(\"org.jetbrains.intellij\") version Versions.intellijGradlePlugin\n}\n\nrepositories {\n    maven(\"https://maven.aliyun.com/repository/central\") // IntelliJ dependencies are very large (>500MB)\n    mavenCentral()\n}\n\nversion = Versions.consoleIntellij\ndescription = \"IntelliJ plugin for Mirai Console\"\n\n// See https://github.com/JetBrains/gradle-intellij-plugin/\nintellij {\n    version.set(Versions.intellij)\n    downloadSources.set(IDEA_ACTIVE)\n    updateSinceUntilBuild.set(false)\n\n    sandboxDir.set(projectDir.resolve(\"run/idea-sandbox\").absolutePath)\n\n    plugins.set(\n        listOf(\n//            \"org.jetbrains.kotlin:${Versions.kotlinIntellijPlugin}\", // @eap\n            \"java\",\n            \"gradle\",\n            \"org.jetbrains.kotlin\"\n        )\n    )\n}\n\njava {\n    sourceCompatibility = JavaVersion.VERSION_17\n    targetCompatibility = JavaVersion.VERSION_17\n}\n\ntasks.getByName(\"publishPlugin\", org.jetbrains.intellij.tasks.PublishPluginTask::class) {\n    val pluginKey = project.findProperty(\"jetbrains.hub.key\")?.toString()\n    if (pluginKey != null) {\n        logger.info(\"Found jetbrains.hub.key\")\n        token.set(pluginKey)\n    } else {\n        logger.info(\"jetbrains.hub.key not found\")\n    }\n}\n\nfun File.resolveMkdir(relative: String): File {\n    return this.resolve(relative).apply { mkdirs() }\n}\n\nkotlin.target.compilations.all {\n    kotlinOptions {\n        jvmTarget = \"17\"\n        apiVersion = \"1.9\" // bundled Kotlin is 1.7.20\n        languageVersion = \"1.9\" //  idea requires 1.9\n    }\n}\n\n// https://plugins.jetbrains.com/docs/intellij/kotlin.html#kotlin-standard-library\ntasks.withType<org.jetbrains.intellij.tasks.PatchPluginXmlTask> {\n    sinceBuild.set(\"223\")\n    untilBuild.set(\"232.*\")\n    pluginDescription.set(\n        \"\"\"\n        Plugin development support for <a href='https://github.com/mamoe/mirai'>Mirai Console</a>\n        \n        <h3>Features</h3>\n        <ul>\n            <li>Inspections for plugin properties.</li>\n            <li>Inspections for illegal calls.</li>\n            <li>Intentions for resolving serialization problems.</li>\n        </ul>\n    \"\"\".trimIndent()\n    )\n    changeNotes.set(\n        \"\"\"\n        See <a href=\"https://github.com/mamoe/mirai/releases\">https://github.com/mamoe/mirai/releases</a>\n    \"\"\".trimIndent()\n    )\n}\n\ndependencies {\n    implementation(project(\":mirai-console-compiler-common\")) {\n        exclude(\"org.jetbrains.kotlin\", \"kotlin-stdlib\")\n        exclude(\"org.jetbrains.kotlin\", \"kotlin-stdlib-jdk7\")\n        exclude(\"org.jetbrains.kotlin\", \"kotlin-stdlib-jdk8\")\n    }\n//    implementation(project(\":mirai-console-compiler-common\")) {\n//        isTransitive = false\n//    }\n}\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/gradle.properties",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# ???????? GNU AFFERO GENERAL PUBLIC LICENSE version 3 ??????, ?????????????.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\nkotlin.stdlib.default.dependency=false"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/META-INF/plugin.xml",
    "content": "<!--\n  ~ Copyright 2019-2022 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<idea-plugin>\n    <id>net.mamoe.mirai-console</id>\n\n    <name>Mirai Console</name>\n\n    <vendor\n            email=\"support@mamoe.net\"\n            url=\"https://github.com/mamoe/\">\n        Mamoe Technologies\n    </vendor>\n\n    <depends>com.intellij.modules.java</depends>\n    <depends>com.intellij.modules.platform</depends>\n    <depends>org.jetbrains.kotlin</depends>\n\n    <depends>com.intellij.gradle</depends>\n\n    <extensions defaultExtensionNs=\"com.intellij\">\n        <moduleType id=\"MIRAI_CONSOLE_PLUGIN_MODULE\"\n                    implementationClass=\"net.mamoe.mirai.console.intellij.wizard.MiraiModuleType\"/>\n        <moduleBuilder id=\"MIRAI_MODULE\" builderClass=\"net.mamoe.mirai.console.intellij.wizard.MiraiModuleBuilder\"/>\n\n        <fileTemplateGroup implementation=\"net.mamoe.mirai.console.intellij.assets.FileTemplateRegistrar\"/>\n        <codeInsight.lineMarkerProvider language=\"JAVA\"\n                                        implementationClass=\"net.mamoe.mirai.console.intellij.line.marker.PluginMainLineMarkerProvider\"/>\n        <codeInsight.lineMarkerProvider language=\"kotlin\"\n                                        implementationClass=\"net.mamoe.mirai.console.intellij.line.marker.PluginMainLineMarkerProvider\"/>\n        <codeInsight.lineMarkerProvider language=\"JAVA\"\n                                        implementationClass=\"net.mamoe.mirai.console.intellij.line.marker.CommandDeclarationLineMarkerProvider\"/>\n        <codeInsight.lineMarkerProvider language=\"kotlin\"\n                                        implementationClass=\"net.mamoe.mirai.console.intellij.line.marker.CommandDeclarationLineMarkerProvider\"/>\n\n        <localInspection groupPath=\"Mirai console\" language=\"kotlin\" shortName=\"PluginMainServiceNotConfigured\"\n                         bundle=\"messages.InspectionGadgetsBundle\"\n                         key=\"plugin.service.not.configured.display.name\" groupBundle=\"messages.InspectionsBundle\"\n                         groupKey=\"group.names.plugin.service.issues\" enabledByDefault=\"true\" level=\"WARNING\"\n                         implementationClass=\"net.mamoe.mirai.console.intellij.diagnostics.PluginMainServiceNotConfiguredInspection\"/>\n\n        <localInspection groupPath=\"Mirai console\" language=\"JAVA\" shortName=\"PluginMainServiceNotConfiguredJava\"\n                         bundle=\"messages.InspectionGadgetsBundle\"\n                         key=\"plugin.service.not.configured.display.name\" groupBundle=\"messages.InspectionsBundle\"\n                         groupKey=\"group.names.plugin.service.issues\" enabledByDefault=\"true\" level=\"WARNING\"\n                         implementationClass=\"net.mamoe.mirai.console.intellij.diagnostics.PluginMainServiceNotConfiguredInspection\"/>\n\n        <localInspection groupPath=\"Mirai console\" language=\"kotlin\" shortName=\"ResourceNotClosed\"\n                         bundle=\"messages.InspectionGadgetsBundle\"\n                         key=\"resource.not.closed.display.name\" groupBundle=\"messages.InspectionsBundle\"\n                         groupKey=\"group.names.mirai.core.issues\" enabledByDefault=\"true\" level=\"WARNING\"\n                         implementationClass=\"net.mamoe.mirai.console.intellij.diagnostics.ResourceNotClosedInspection\"/>\n\n        <localInspection groupPath=\"Mirai console\" language=\"JAVA\" shortName=\"ResourceNotClosedJava\"\n                         bundle=\"messages.InspectionGadgetsBundle\"\n                         key=\"resource.not.closed.display.name\" groupBundle=\"messages.InspectionsBundle\"\n                         groupKey=\"group.names.mirai.core.issues\" enabledByDefault=\"true\" level=\"WARNING\"\n                         implementationClass=\"net.mamoe.mirai.console.intellij.diagnostics.ResourceNotClosedInspection\"/>\n\n        <localInspection groupPath=\"Mirai console\" language=\"kotlin\" shortName=\"UsingStringPlusMessage\"\n                         bundle=\"messages.InspectionGadgetsBundle\"\n                         key=\"using.string.plus.message.display.name\" groupBundle=\"messages.InspectionsBundle\"\n                         groupKey=\"group.names.message.issues\" enabledByDefault=\"true\" level=\"WARNING\"\n                         implementationClass=\"net.mamoe.mirai.console.intellij.diagnostics.UsingStringPlusMessageInspection\"/>\n\n        <intentionAction>\n            <className>net.mamoe.mirai.console.intellij.diagnostics.fix.WrapWithResourceUseCallIntention</className>\n            <category>Mirai console</category>\n        </intentionAction>\n\n        <intentionAction>\n            <className>net.mamoe.mirai.console.intellij.diagnostics.fix.WrapWithResourceUseCallJavaIntention</className>\n            <category>Mirai console</category>\n        </intentionAction>\n\n    </extensions>\n\n    <extensions defaultExtensionNs=\"org.jetbrains.kotlin\">\n        <storageComponentContainerContributor\n                implementation=\"net.mamoe.mirai.console.intellij.IDEContainerContributor\"/>\n        <quickFixContributor implementation=\"net.mamoe.mirai.console.intellij.QuickFixRegistrar\"/>\n    </extensions>\n</idea-plugin>"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/.gitignore.ft",
    "content": "# User-specific stuff\n.idea/\n\n*.iml\n*.ipr\n*.iws\n\n# IntelliJ\nout/\n# mpeltonen/sbt-idea plugin\n.idea_modules/\n\n# JIRA plugin\natlassian-ide-plugin.xml\n\n# Compiled class file\n*.class\n\n# Log file\n*.log\n\n# BlueJ files\n*.ctxt\n\n# Package Files #\n*.jar\n*.war\n*.nar\n*.ear\n*.zip\n*.tar.gz\n*.rar\n\n# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml\nhs_err_pid*\n\n### Linux ###\n*~\n\n# temporary files which can be created if a process still has a handle open of a deleted file\n.fuse_hidden*\n\n# KDE directory preferences\n.directory\n\n# Linux trash folder which might appear on any partition or disk\n.Trash-*\n\n# .nfs files are created when an open file is removed but is still being accessed\n.nfs*\n\n### macOS ###\n# General\n.DS_Store\n.AppleDouble\n.LSOverride\n\n# Icon must end with two \\r\nIcon\n\n# Thumbnails\n._*\n\n# Files that might appear in the root of a volume\n.DocumentRevisions-V100\n.fseventsd\n.Spotlight-V100\n.TemporaryItems\n.Trashes\n.VolumeIcon.icns\n.com.apple.timemachine.donotpresent\n\n# Directories potentially created on remote AFP share\n.AppleDB\n.AppleDesktop\nNetwork Trash Folder\nTemporary Items\n.apdisk\n\n### Windows ###\n# Windows thumbnail cache files\nThumbs.db\nThumbs.db:encryptable\nehthumbs.db\nehthumbs_vista.db\n\n# Dump file\n*.stackdump\n\n# Folder config file\n[Dd]esktop.ini\n\n# Recycle Bin used on file shares\n$RECYCLE.BIN/\n\n# Windows Installer files\n*.cab\n*.msi\n*.msix\n*.msm\n*.msp\n\n# Windows shortcuts\n*.lnk\n\n### Gradle ###\n.gradle\nbuild/\n\n# Ignore Gradle GUI config\ngradle-app.setting\n\n# Cache of project\n.gradletasknamecache\n\n### Gradle Patch ###\n**/build/\n\n# Common working directory\nrun/\n\n# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)\n!gradle-wrapper.jar\n\n### Mirai Console Files ###\n\n# Local Test Launch point\nsrc/test/kotlin/RunTerminal.kt\n\n# Mirai console files with direct bootstrap\n/config\n/data\n/plugins\n/bots\n\n# Local Test Launch Point working directory\n/debug-sandbox\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/.gitignore.html",
    "content": "<!--\n  ~ Copyright 2019-2022 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<html>\n<body>\n<p>This is a built-in file template used to create a new .gitignore for Gradle projects.</p>\n</body>\n</html>\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/Gradle gradle-wrapper.properties.ft",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-7.3.1-all.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/Gradle gradle-wrapper.properties.html",
    "content": "<!--\n  ~ Copyright 2019-2023 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<html>\n<body>\n<p>This is a built-in file template used to create a new gradle-wrapper.properties for Mirai Console Plugin projects.</p>\n</body>\n</html>\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/Gradle gradle.properties.ft",
    "content": "kotlin.code.style=official"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/Gradle gradle.properties.html",
    "content": "<!--\n  ~ Copyright 2019-2022 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<html>\n<body>\n<p>This is a built-in file template used to create a new gradle.properties for Mirai Console Plugin projects.</p>\n</body>\n</html>\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/Plugin build.gradle.ft",
    "content": "plugins {\n    id 'org.jetbrains.kotlin.jvm' version '$KOTLIN_VERSION'\n    id 'org.jetbrains.kotlin.plugin.serialization' version '$KOTLIN_VERSION'\n\n    id 'net.mamoe.mirai-console' version '$MIRAI_VERSION'\n}\n\ngroup = '$GROUP_ID'\nversion = '$VERSION'\n\nrepositories {\n#if($USE_PROXY_REPO)\n    maven { url 'https://maven.aliyun.com/repository/public' }\n#end\n    mavenCentral()\n}\n\nmirai {\n    jvmTarget JavaVersion.VERSION_1_8\n}\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/Plugin build.gradle.html",
    "content": "<!--\n  ~ Copyright 2019-2022 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<html>\n<body>\n<p>This is a built-in file template used to create a new build.gradle for Mirai Console Plugin projects.</p>\n</body>\n</html>\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/Plugin build.gradle.kts.ft",
    "content": "plugins {\n    val kotlinVersion = \"$KOTLIN_VERSION\"\n    kotlin(\"jvm\") version kotlinVersion\n    kotlin(\"plugin.serialization\") version kotlinVersion\n\n    id(\"net.mamoe.mirai-console\") version \"$MIRAI_VERSION\"\n}\n\ngroup = \"$GROUP_ID\"\nversion = \"$VERSION\"\n\nrepositories {\n#if($USE_PROXY_REPO)\n    maven(\"https://maven.aliyun.com/repository/public\")\n#end\n    mavenCentral()\n}\n\nmirai {\n    jvmTarget = JavaVersion.VERSION_1_8\n}\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/Plugin build.gradle.kts.html",
    "content": "<!--\n  ~ Copyright 2019-2022 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<html>\n<body>\n<p>This is a built-in file template used to create a new build.gradle.kts for Mirai Console Plugin projects.</p>\n</body>\n</html>\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/Plugin main class Java.java.ft",
    "content": "package $PACKAGE_NAME;\n\nimport net.mamoe.mirai.console.plugin.jvm.JavaPlugin;\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescriptionBuilder;\n\npublic final class ${CLASS_NAME} extends JavaPlugin{\npublic static final ${CLASS_NAME} INSTANCE=new ${CLASS_NAME}();\n\n#set($HAS_DETAILS = ${PLUGIN_AUTHOR} != \"\" || ${PLUGIN_DEPENDS_ON} != \"\" || ${PLUGIN_INFO} != \"\" || ${PLUGIN_NAME} !=\n    \"\")\nprivate ${CLASS_NAME}(){\n    #if($HAS_DETAILS == false)\n            super(new JvmPluginDescriptionBuilder(\"$PLUGIN_ID\",\"$PLUGIN_VERSION\").build());#end\n    #if($HAS_DETAILS)\n            super(new JvmPluginDescriptionBuilder(\"$PLUGIN_ID\",\"$PLUGIN_VERSION\")\n        #if($PLUGIN_NAME != \"\").name(\"$PLUGIN_NAME\")\n        #end#if($PLUGIN_INFO != \"\").info(\"$PLUGIN_INFO\")\n    #end#if($PLUGIN_AUTHOR != \"\").author(\"$PLUGIN_AUTHOR\")\n    #end#if($PLUGIN_DEPENDS_ON != \"\").dependsOn(\"$PLUGIN_DEPENDS_ON\")\n    #end\n            .build());#end\n        }\n\n@Override\npublic void onEnable(){\n        getLogger().info(\"Plugin loaded!\");\n        }\n        }"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/Plugin main class Java.java.ft.back",
    "content": "package $PACKAGE_NAME;\n\nimport net.mamoe.mirai.console.plugin.jvm.JavaPlugin;\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription;\n\npublic final class ${CLASS_NAME} extends JavaPlugin {\n    public static final ${CLASS_NAME} INSTANCE = new ${CLASS_NAME}();\n\n    private ${CLASS_NAME}() {\n        super(JvmPluginDescription.loadFromResource(\"plugin.yml\", ${CLASS_NAME}.class.getClassLoader()));\n    }\n\n    @Override\n    public void onEnable() {\n        getLogger().info(\"Plugin loaded!\");\n    }\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/Plugin main class Java.java.html",
    "content": "<!--\n  ~ Copyright 2019-2022 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<html>\n<body>\n<p>This is a built-in file template used to create a new plugin main class for Mirai Console Plugin projects.</p>\n</body>\n</html>\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/Plugin main class Kotlin.kt.ft",
    "content": "package $PACKAGE_NAME\n\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport net.mamoe.mirai.utils.info\n#set($HAS_DETAILS = ${PLUGIN_AUTHOR} != \"\" || ${PLUGIN_DEPENDS_ON} != \"\" || ${PLUGIN_INFO} != \"\")\nobject $CLASS_NAME : KotlinPlugin(\n    JvmPluginDescription(\n        id = \"${PLUGIN_ID}\",\n        #if(${PLUGIN_NAME} != \"\")name = \"${PLUGIN_NAME}\",\n#end\n        version = \"${PLUGIN_VERSION}\",\n    ) #if($HAS_DETAILS){\n#end\n#if(${PLUGIN_AUTHOR} != \"\")author(\"${PLUGIN_AUTHOR}\")\n#end\n#if(${PLUGIN_DEPENDS_ON} != \"\")dependsOn(\"${PLUGIN_DEPENDS_ON}\")\n#end\n#if(${PLUGIN_INFO} != \"\")info(\"\"\"${PLUGIN_INFO}\"\"\")\n#end\n#if($HAS_DETAILS)    }\n#end\n) {\n    override fun onEnable() {\n        logger.info { \"Plugin loaded\" }\n    }\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/Plugin main class Kotlin.kt.html",
    "content": "<!--\n  ~ Copyright 2019-2022 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<html>\n<body>\n<p>This is a built-in file template used to create a new plugin main class for Mirai Console Plugin projects.</p>\n</body>\n</html>\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/Plugin main service.txt.ft",
    "content": "${PACKAGE_NAME}.${CLASS_NAME}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/Plugin main service.txt.html",
    "content": "<!--\n  ~ Copyright 2019-2022 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<html>\n<body>\n<p>This is a built-in file template used to create a new plugin main class for Mirai Console Plugin projects.</p>\n</body>\n</html>\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/Plugin settings.gradle.ft",
    "content": "pluginManagement {\n    repositories {\n#if($USE_PROXY_REPO)\n        maven { url \"https://maven.aliyun.com/repository/gradle-plugin\" }\n#end\n        gradlePluginPortal()\n    }\n}\nrootProject.name = \"$ARTIFACT_ID\"\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/Plugin settings.gradle.html",
    "content": "<!--\n  ~ Copyright 2019-2023 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<html>\n<body>\n<p>This is a built-in file template used to create a new settings.gradle for Mirai Console Plugin projects.</p>\n</body>\n</html>\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/Plugin settings.gradle.kts.ft",
    "content": "pluginManagement {\n    repositories {\n#if($USE_PROXY_REPO)\n        maven(\"https://maven.aliyun.com/repository/gradle-plugin\")\n#end\n        gradlePluginPortal()\n    }\n}\nrootProject.name = \"$ARTIFACT_ID\""
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/Plugin settings.gradle.kts.html",
    "content": "<!--\n  ~ Copyright 2019-2022 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<html>\n<body>\n<p>This is a built-in file template used to create a new settings.gradle.kts for Mirai Console Plugin projects.</p>\n</body>\n</html>\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/RunTerminal.run.xml.ft",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n    <configuration default=\"false\" name=\"Run Mirai Console\" type=\"GradleRunConfiguration\" factoryName=\"Gradle\" folderName=\"Mirai\">\n        <ExternalSystemSettings>\n            <option name=\"executionName\" />\n            <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n            <option name=\"externalSystemIdString\" value=\"GRADLE\" />\n            <option name=\"scriptParameters\" value=\"\" />\n            <option name=\"taskDescriptions\">\n                <list />\n            </option>\n            <option name=\"taskNames\">\n                <list>\n                    <option value=\":runConsole\" />\n                </list>\n            </option>\n            <option name=\"vmOptions\" />\n        </ExternalSystemSettings>\n        <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>\n        <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>\n        <DebugAllEnabled>false</DebugAllEnabled>\n        <method v=\"2\" />\n    </configuration>\n</component>"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/RunTerminal.run.xml.html",
    "content": "<!--\n  ~ Copyright 2019-2022 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<html>\n<body>\n<p>This is a built-in file template used to create a new settings.gradle.kts for Mirai Console Plugin projects.</p>\n</body>\n</html>\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/account.properties.ft",
    "content": "id=123456\npassword=pwd"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/fileTemplates/code/account.properties.html",
    "content": "<!--\n  ~ Copyright 2019-2022 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<html>\n<body>\n<p>This is a built-in file template used to create a new gradle.properties for Mirai Console Plugin projects.</p>\n</body>\n</html>\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/inspectionDescriptions/PluginMainServiceNotConfigured.html",
    "content": "<!--\n  ~ Copyright 2019-2021 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<html>\n<body>\n<p>检查插件主类服务配置情况。\n</p>\n<!-- tooltip end -->\n<!--<p>Text after this comment will only be shown in the settings of the inspection.</p>-->\n</body>\n</html>"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/inspectionDescriptions/ResourceNotClosed.html",
    "content": "<!--\n  ~ Copyright 2019-2021 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<html>\n<body>\n<p>检查 ExternalResource 没有 close 的情况。\n</p>\n<!-- tooltip end -->\n<!--<p>Text after this comment will only be shown in the settings of the inspection.</p>-->\n</body>\n</html>"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/inspectionDescriptions/UsingStringPlusMessage.html",
    "content": "<!--\n  ~ Copyright 2019-2021 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<html>\n<body>\n<p>Detects `String + Message` calls.</p>\n<!-- tooltip end -->\n<p>Detects `String + Message` calls. `String + Message` is essentially `String + Message.toString()` and is different\n    from `Message + Message`. Such conversions are implicit and may lead to confusing behavior.</p>\n</body>\n</html>"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/intentionDescriptions/WrapWithResourceUseCallIntention/after.receiver.template",
    "content": "resource.use { it.uploadAsImage(contact) }"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/intentionDescriptions/WrapWithResourceUseCallIntention/before.receiver.template",
    "content": "resource.uploadAsImage(contact)"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/intentionDescriptions/WrapWithResourceUseCallIntention/description.html",
    "content": "<!--\n  ~ Copyright 2019-2021 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<html>\n<body>\n<p>将资源直接使用转换为 `.use { ... }`\n</p>\n<!-- tooltip end -->\n<p>将 `resource.sendAsImageTo(contact)` 转换为 `resource.use { it.sendAsImageTo(contact) }` </p>\n</body>\n</html>"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/intentionDescriptions/WrapWithResourceUseCallJavaIntention/after.action.template",
    "content": "ExternalResource resource;\nContact contact;\n\nresource.use { it.uploadAsImage(contact) }"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/intentionDescriptions/WrapWithResourceUseCallJavaIntention/before.action.template",
    "content": "ExternalResource resource;\nContact contact;\n\nresource.uploadAsImage(contact)"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/intentionDescriptions/WrapWithResourceUseCallJavaIntention/description.html",
    "content": "<!--\n  ~ Copyright 2019-2021 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<html>\n<body>\n<p>将资源直接使用转换为 `.use { ... }`\n</p>\n<!-- tooltip end -->\n<p>将 `resource.sendAsImageTo(contact)` 转换为 `resource.use { it.sendAsImageTo(contact) }` </p>\n</body>\n</html>"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/messages/InspectionGadgetsBundle.properties",
    "content": "#\n# Copyright 2019-2021 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\nplugin.service.not.configured.display.name=Plugin main not configured\nusing.string.plus.message.display.name=Using string plus message\nresource.not.closed.display.name=Resource not closed"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/messages/InspectionsBundle.properties",
    "content": "#\n# Copyright 2019-2021 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\ngroup.names.plugin.service.issues=Plugin service issues\ngroup.names.message.issues=Message issues\ngroup.names.mirai.core.issues=Mirai core issues"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/messages/MiraiProjectWizardBundle.properties",
    "content": "#\n# Copyright 2019-2023 Mamoe Technologies and contributors.\n#\n# ???????? GNU AFFERO GENERAL PUBLIC LICENSE version 3 ??????, ?????????????.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\nmodule.presentation.name=Mirai Console Plugin\nmodule.description=\"Template for building plugins for <b>Mirai Console</b>\"\ntitle.plugin.description=Plugin Description\nlabel.plugin.version=Plugin Version:\nlabel.version.stable=Stable\nlabel.version.prerelease=Prerelease\nlabel.version.nightly=Nightly\nlabel.plugin.id=Plugin ID:\nlabel.plugin.name=Plugin Name:\nlabel.mirai.version.loading=Loading...\nlabel.mirai.version=Mirai Version:\nerror.failed.to.download.mirai.version=Failed to download version list, please select a version manually\nerror.please.wait.for.mirai.version=Please wait for downloading version list\nlabel.plugin.author=Plugin Author:\ncomment.plugin.id=Should consist of English characters and/or numbers, '.', ':', '-'. Example: \"net.mamoe:chat-command\".\ncomment.plugin.name=Example: \"Chat Command\".\ncomment.plugin.version=Should comply <a href=\"https://semver.org/\">Semantic Versioning</a>, not including 'v'. Example: \"0.1.0\".\ncomment.mirai.version=Minimum version of Mirai Console this plugin requires on.\nlabel.plugin.dependencies=Plugin Dependencies:\nlabel.plugin.info=Plugin Info:\ncomment.plugin.dependencies=Each dependency is in format \"id:VersionRequirement\" (not including quotation marks). To declare optional dependency, add \"?\" at the end. \\\n  Example: \"net.mamoe.chat-command:[1.0.0, 2.0.0)?\" declares and optional dependency on \"net.mamoe.chat-command\", requiring its version to be greater or equal to 1.0.0 and smaller than 2.0.0. \\\n  Separate multiple dependencies into liens. \\\n  Syntax for \"VersionRequirement\" can be found at <a href=\"https://ant.apache.org/ivy/history/latest-milestone/settings/version-matchers.html\">Apache Ivy version-matchers</a>.\ncomment.plugin.info=Introductory information about this plugin.\ntext.hint.plugin.info=Optional\ntext.hint.plugin.dependencies=Optional\nvalidation.plugin.name.forbidden.character=\"{0}\" is forbidden in plugin name\nvalidation.illegal.plugin.id=Invalid plugin id \"{0}\"\nvalidation.illegal.version=Invalid version.\\n{0}\nno.error.message=No error message\ntext.use.proxy.repo=Use Aliyun Maven repository\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/resources/messages/MiraiProjectWizardBundle_zh.properties",
    "content": "#\n# Copyright 2019-2023 Mamoe Technologies and contributors.\n#\n# ???????? GNU AFFERO GENERAL PUBLIC LICENSE version 3 ??????, ?????????????.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\nmodule.presentation.name=Mirai Console 插件\nmodule.description=\"构建 <b>Mirai Console</b> 插件的模板\"\ntitle.plugin.description=插件信息\nlabel.plugin.version=插件版本号:\nlabel.version.stable=稳定版\nlabel.version.prerelease=预览版\nlabel.version.nightly=开发版\nlabel.plugin.id=插件 ID:\nlabel.plugin.name=插件名称:\nlabel.mirai.version.loading=加载中...\nlabel.mirai.version=Mirai 版本号:\nerror.failed.to.download.mirai.version=下载版本列表失败, 请手动选择版本号\nerror.please.wait.for.mirai.version=请等待下载版本列表\nlabel.plugin.author=插件作者:\ncomment.plugin.id=只能包含以下内容: 英文字母, 数字, '.', ':', '-'. 示例: \"net.mamoe.chat-command\".\ncomment.plugin.name=示例: \"Chat Command\".\ncomment.plugin.version=需遵循 <a href=\"https://semver.org/\">语义化版本</a>, 不包含 'v'. 示例: \"0.1.0\".\ncomment.mirai.version=插件依赖的最低 Mirai Console 版本号\nlabel.plugin.dependencies=插件依赖:\nlabel.plugin.info=插件描述:\ncomment.plugin.dependencies=每个依赖格式为 \"id:版本要求\" (不包括引号). 若要定义可选依赖, 请在末尾添加 \"?\". \\\n  示例: \"net.mamoe.chat-command:[1.0.0, 2.0.0)?\" 定义对 \"net.mamoe.chat-command\" 的可选依赖, 要求其版本大于或等于 1.0.0 且小于 2.0.0. \\\n  多个依赖以换行符分割. \\\n  \"版本要求\" 语法可在 <a href=\"https://ant.apache.org/ivy/history/latest-milestone/settings/version-matchers.html\">Apache Ivy version-matchers</a> 查看.\ncomment.plugin.info=对该插件的介绍信息.\ntext.hint.plugin.info=可留空\ntext.hint.plugin.dependencies=可留空\nvalidation.plugin.name.forbidden.character=插件名称中不允许存在 \"{0}\"\nvalidation.illegal.plugin.id=插件 ID 无效: \"{0}\"\nvalidation.illegal.version=插件版本无效\\n{0}\nno.error.message=无错误信息\ntext.use.proxy.repo=使用阿里云 Maven 镜像\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/run/projects/.gitignore",
    "content": "local.properties\nbuild/\nbuild\n.gradle\n.idea\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/run/projects/test-project/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nplugins {\n    kotlin(\"jvm\") version \"1.8.20\"\n    kotlin(\"plugin.serialization\") version \"1.8.20\"\n    id(\"net.mamoe.mirai-console\") version \"2.99.0-local\"\n    java\n}\n\ngroup = \"org.example\"\nversion = \"1.0-SNAPSHOT\"\n\ndependencies {\n\n}\n\nrepositories {\n    mavenCentral()\n    mavenLocal()\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/run/projects/test-project/gradle/wrapper/gradle-wrapper.properties",
    "content": "#\n# Copyright 2019-2023 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.0-bin.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/run/projects/test-project/gradle.properties",
    "content": "kotlin.code.style=official\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/run/projects/test-project/gradlew",
    "content": "#!/usr/bin/env sh\n\n#\n# Copyright 2015 the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif [ \"$cygwin\" = \"true\" -o \"$msys\" = \"true\" ] ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=`expr $i + 1`\n    done\n    case $i in\n        0) set -- ;;\n        1) set -- \"$args0\" ;;\n        2) set -- \"$args0\" \"$args1\" ;;\n        3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=`save \"$@\"`\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/run/projects/test-project/gradlew.bat",
    "content": "@rem\n@rem Copyright 2015 the original author or authors.\n@rem\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\n@rem you may not use this file except in compliance with the License.\n@rem You may obtain a copy of the License at\n@rem\n@rem      https://www.apache.org/licenses/LICENSE-2.0\n@rem\n@rem Unless required by applicable law or agreed to in writing, software\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n@rem See the License for the specific language governing permissions and\n@rem limitations under the License.\n@rem\n\n@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windows variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/run/projects/test-project/settings.gradle.kts",
    "content": "rootProject.name = \"test-project\"\n\npluginManagement {\n    repositories {\n        mavenLocal()\n        gradlePluginPortal()\n        jcenter()\n    }\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/run/projects/test-project/src/main/java/test/ResourceNotClosedInspectionTestJava.java",
    "content": "package test;\n\nimport net.mamoe.mirai.contact.Contact;\nimport net.mamoe.mirai.message.data.Image;\nimport net.mamoe.mirai.utils.ExternalResource;\nimport org.example.myplugin.ResourceNotClosedInspectionTestKt;\n\nimport java.io.File;\nimport java.io.IOException;\n\nimport static org.example.myplugin.ResourceNotClosedInspectionTestKt.magic;\n\npublic class ResourceNotClosedInspectionTestJava {\n\n    public static Object funA() {\n        return new Object();\n    }\n\n    public static void funB(Object obj) {\n        System.out.println(obj);\n    }\n\n    public static void main(String[] args) {\n        // https://github.com/mamoe/mirai-console/issues/294\n        funB(funA());\n\n        File file = magic();\n        Contact contact = magic();\n\n        //  useImage(contact.uploadImage(ExternalResource.create(file)));\n        useImage(Contact.uploadImage(contact, ExternalResource.create(file)));\n\n        useImage(Contact.uploadImage(contact, file));\n\n        try (final ExternalResource resource = ExternalResource.create(file)) {\n            useImage(contact.uploadImage(resource));\n        }\n    }\n\n    static void useImage(Image image) {\n\n    }\n}\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/run/projects/test-project/src/main/java/test/TestJavaPlugin.java",
    "content": "package test;\n\nimport net.mamoe.mirai.console.command.Command;\nimport net.mamoe.mirai.console.command.CommandOwner;\nimport net.mamoe.mirai.console.command.descriptor.CommandSignatureFromKFunction;\nimport net.mamoe.mirai.console.command.java.JCompositeCommand;\nimport net.mamoe.mirai.console.command.java.JSimpleCommand;\nimport net.mamoe.mirai.console.permission.Permission;\nimport net.mamoe.mirai.console.plugin.jvm.JavaPlugin;\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription;\nimport org.jetbrains.annotations.NotNull;\n\nimport java.util.List;\n\npublic class TestJavaPlugin extends JavaPlugin {\n    public TestJavaPlugin(@NotNull JvmPluginDescription description) {\n        super(description);\n    }\n}\n\nclass TestCommand extends JSimpleCommand {\n\n    public TestCommand(@NotNull CommandOwner owner, @NotNull String primaryName, @NotNull String[] secondaryNames, @NotNull Permission basePermission) {\n        super(owner, primaryName, secondaryNames, basePermission);\n    }\n\n    @Handler\n    public void test(String s) {\n\n    }\n}\n\nclass TestCommand2 extends JCompositeCommand {\n    public TestCommand2(@NotNull CommandOwner owner, @NotNull String primaryName, @NotNull String[] secondaryNames, @NotNull Permission parentPermission) {\n        super(owner, primaryName, secondaryNames, parentPermission);\n    }\n\n    @SubCommand(\"test\")\n    public void test() {}\n\n    @SubCommand({})\n    public void subCmd() {\n    }\n}\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/run/projects/test-project/src/main/kotlin/org/example/myplugin/AbstractMessageKeysUsages.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage org.example.myplugin\n\nimport net.mamoe.mirai.message.data.MessageContent\nimport net.mamoe.mirai.message.data.messageChainOf\n\nfun main() {\n    val chain = messageChainOf()\n    chain[MessageContent]\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/run/projects/test-project/src/main/kotlin/org/example/myplugin/ConsoleCommandOwnerCheck.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage org.example.myplugin\n\nimport net.mamoe.mirai.console.command.ConsoleCommandOwner\nimport net.mamoe.mirai.console.command.SimpleCommand\n\n\nobject MySimpleCommand0002 : SimpleCommand(\n    ConsoleCommandOwner, \"foo\",\n    description = \"示例指令\"\n) {}\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/run/projects/test-project/src/main/kotlin/org/example/myplugin/MyPluginMain.kt",
    "content": "package org.example.myplugin\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.console.data.AutoSavePluginConfig\nimport net.mamoe.mirai.console.data.AutoSavePluginData\nimport net.mamoe.mirai.console.data.value\nimport net.mamoe.mirai.console.permission.PermissionId\nimport net.mamoe.mirai.console.permission.PermissionService\nimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription\nimport net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\nimport net.mamoe.mirai.console.util.SemVersion\n\nconst val T = \"org.example\" // 编译期常量\n\nobject MyPluginMain : KotlinPlugin(\n    JvmPluginDescription(\n        T,\n        \"1.0-M4\",\n    ) {\n        name(\".\")\n    }\n) {\n    override fun onEnable() {\n        super.onEnable()\n        PermissionService.INSTANCE.register(permissionId(\"dvs\"), \"ok\")\n        PermissionService.INSTANCE.register(permissionId(\"perm with space\"), \"error\")\n        PermissionId(\"Namespace with space\", \"Name with space\")\n        SemVersion.parseRangeRequirement(\"1.0\")\n        SemVersion.parseRangeRequirement(\"<br/>\")\n        SemVersion.parseRangeRequirement(\"SB YELLOW\")\n        SemVersion.parseRangeRequirement(\"1.0.0 || 2.0.0 || \")\n        SemVersion.parseRangeRequirement(\"1.0.0 || 2.0.0\")\n        SemVersion.parseRangeRequirement(\"1.0.0 || 2.0.0 && 3.0.0\")\n        SemVersion.parseRangeRequirement(\"{}\")\n        SemVersion.parseRangeRequirement(\"||\")\n        SemVersion.parseRangeRequirement(\">= 114.514 || = 1919.810 || (1.1, 1.2)\")\n        SemVersion.parseRangeRequirement(\"0.0.0 || {90.48}\")\n        SemVersion.parseRangeRequirement(\"{114514.1919810}\")\n        SemVersion.parseRangeRequirement(\"}\")\n    }\n\n    fun test() {\n\n    }\n}\n\n\nval x = \"弱智黄色\"\n\n\nobject MyData : AutoSavePluginData(\"\") {\n    val value by value(\"\")\n    val value2 by value<Map<String, String>>()\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/run/projects/test-project/src/main/kotlin/org/example/myplugin/MySimpleCommand.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage org.example.myplugin\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.console.command.CommandSender\nimport net.mamoe.mirai.console.command.ConsoleCommandOwner\nimport net.mamoe.mirai.console.command.SimpleCommand\nimport net.mamoe.mirai.console.data.AutoSavePluginConfig\nimport net.mamoe.mirai.console.data.ReadOnlyPluginConfig\nimport net.mamoe.mirai.console.data.value\n\nobject MySimpleCommand0001 : SimpleCommand(\n    ConsoleCommandOwner, \"foo\",\n    description = \"示例指令\"\n) {}\n\nobject MySimpleCommand000 : SimpleCommand(\n    MyPluginMain, \"foo\",\n    description = \"示例指令\"\n) {\n    @Handler\n    suspend fun CommandSender.handle(int: Int, str: String) {\n\n    }\n\n    @Handler\n    suspend fun String.bad(int: Int, str: String) {\n\n    }\n}\n\nobject DataTest : AutoSavePluginConfig(\"data\") {\n    val pp by value(NoDefaultValue(1))\n}\n\nobject DataTest1 : ReadOnlyPluginConfig(\"data\") {\n    var pp by value<String>()\n    // var should be reported\n}\n\n@Serializable\ndata class HasDefaultValue(\n    val x: Int = 0,\n)\n\n@Serializable\ndata class NoDefaultValue(\n    val y: Int,\n)\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/run/projects/test-project/src/main/kotlin/org/example/myplugin/ReadOnlyPluginDataVar.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage org.example.myplugin\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.console.data.ReadOnlyPluginConfig\nimport net.mamoe.mirai.console.data.value\nimport org.example.myplugin.DataTest1.provideDelegate\n\n\nobject DataTest2 : ReadOnlyPluginConfig(\"data\") {\n    var pp by value<String>()\n    val x by value<V>(V(\"\"))\n    // var should be reported\n\n    class V  constructor(val s: String)\n}\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/run/projects/test-project/src/main/kotlin/org/example/myplugin/ResourceNotClosedInspectionTest.kt",
    "content": "package org.example.myplugin\n\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.contact.Contact.Companion.sendImage\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.message.data.Image.Key.queryUrl\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.ExternalResource.Companion.sendAsImageTo\nimport net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource\nimport net.mamoe.mirai.utils.ExternalResource.Companion.uploadAsImage\nimport java.io.File\n\nclass ResourceNotClosedInspectionTest {\n    suspend fun useResource() {\n        val file = magic<File>()\n        val contact = magic<Contact>()\n\n        contact.uploadImage(file.toExternalResource()) // should report warning\n        contact.sendImage(file) // should report warning\n\n        //file.toExternalResource().uploadAsImage(contact)\n\n        file.toExternalResource().uploadAsImage(contact)\n        file.toExternalResource().sendAsImageTo(contact)\n\n        // contact.uploadImage(file) // should ok\n\n        // replace to net.mamoe.mirai.contact.Contact.Companion.uploadImage\n    }\n}\n\nfun <T> magic(): T = null!!"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/run/projects/test-project/src/main/kotlin/org/example/myplugin/StringPlusMessageInspectionTest.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage org.example.myplugin\n\nimport net.mamoe.mirai.message.data.PlainText\nimport net.mamoe.mirai.message.data.toPlainText\n\nfun main() {\n    val x: String = \"\"\n    val plain: PlainText = PlainText(\"\")\n\n    x + plain\n\n    // x + plain\n    run { x } + plain\n\n    run { x.apply { x.let { also { x } } } } + plain\n    run { x.apply { x.let { also { x } } } }.plus(plain)\n\n    x + plain\n    1 + plain\n    x.plus(plain)\n    1.plus(plain)\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/run/projects/test-project/src/main/kotlin/org/example/myplugin/UsingDerivedMap.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage org.example.myplugin\n\nimport net.mamoe.mirai.console.data.AutoSavePluginConfig\nimport net.mamoe.mirai.console.data.ReadOnlyPluginConfig\nimport net.mamoe.mirai.console.data.value\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.messageChainOf\nimport org.example.myplugin.DataTest1.provideDelegate\nimport java.util.*\nimport java.util.concurrent.ConcurrentHashMap\n\n\nobject UsingDerivedMap : AutoSavePluginConfig(\"data\") {\n    var p1 by value<MutableMap<String, String>>()\n    var p2 by value<Map<String, String>>()\n\n    var p4 by value<HashMap<String, String>>()\n    var p3 by value<ConcurrentHashMap<String, String>>()\n\n    var p8 by value<List<String>>()\n    var p5 by value<ArrayList<String>>()\n    var p7 by value<AbstractList<String>>()\n\n    var p6 by value<MessageChain>(messageChainOf()) // no error\n}\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/run/projects/test-project/src/main/kotlin/org/example/myplugin/WrapWithResourceUseCallIntentionTest.kt",
    "content": "package org.example.myplugin\n\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.ExternalResource.Companion.sendAsImageTo\nimport java.io.File\n\nclass WrapWithResourceUseCallIntentionTest {\n    suspend fun test() {\n\n        val file = magic<File>()\n        val contact = magic<Contact>()\n        val resource = magic<ExternalResource>()\n\n        resource.sendAsImageTo(contact)\n        resource.run { sendAsImageTo(contact) }\n    }\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/run/projects/test-project/src/test/kotlin/RunConsole.kt",
    "content": "import net.mamoe.mirai.alsoLogin\nimport net.mamoe.mirai.console.MiraiConsole\nimport net.mamoe.mirai.console.plugin.PluginManager.INSTANCE.enable\nimport net.mamoe.mirai.console.plugin.PluginManager.INSTANCE.load\nimport net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader\nimport org.example.myplugin.MyPluginMain\n\nsuspend fun main() {\n    MiraiConsoleTerminalLoader.startAsDaemon()\n\n    MyPluginMain.load() // 主动加载插件, Console 会调用 MyPluginMain.onLoad\n    MyPluginMain.enable() // 主动启用插件, Console 会调用 MyPluginMain.onEnable\n\n    val bot = MiraiConsole.addBot(123456, \"\").alsoLogin() // 登录一个测试环境的 Bot\n\n    MiraiConsole.job.join()\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/IDEContainerContributor.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij\n\nimport com.intellij.psi.PsiElement\nimport net.mamoe.mirai.console.compiler.common.castOrNull\nimport net.mamoe.mirai.console.intellij.diagnostics.CommandDeclarationChecker\nimport net.mamoe.mirai.console.intellij.diagnostics.ContextualParametersChecker\nimport net.mamoe.mirai.console.intellij.diagnostics.PluginDataValuesChecker\nimport net.mamoe.mirai.console.intellij.util.DEBUG_ENABLED\nimport net.mamoe.mirai.console.intellij.util.runIgnoringErrors\nimport org.jetbrains.kotlin.analyzer.ModuleInfo\nimport org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments\nimport org.jetbrains.kotlin.container.StorageComponentContainer\nimport org.jetbrains.kotlin.container.useInstance\nimport org.jetbrains.kotlin.descriptors.DeclarationDescriptor\nimport org.jetbrains.kotlin.descriptors.ModuleDescriptor\nimport org.jetbrains.kotlin.extensions.StorageComponentContainerContributor\nimport org.jetbrains.kotlin.idea.base.projectStructure.unwrapModuleSourceInfo\nimport org.jetbrains.kotlin.idea.facet.KotlinFacet\nimport org.jetbrains.kotlin.psi.KtDeclaration\nimport org.jetbrains.kotlin.resolve.calls.checkers.CallChecker\nimport org.jetbrains.kotlin.resolve.calls.checkers.CallCheckerContext\nimport org.jetbrains.kotlin.resolve.calls.model.ResolvedCall\nimport org.jetbrains.kotlin.resolve.checkers.DeclarationChecker\nimport org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext\nimport java.io.File\n\nclass IDEContainerContributor : StorageComponentContainerContributor {\n    override fun registerModuleComponents(\n        container: StorageComponentContainer,\n        platform: org.jetbrains.kotlin.platform.TargetPlatform,\n        moduleDescriptor: ModuleDescriptor,\n    ) {\n        if (moduleDescriptor.hasMiraiConsoleDependency()) {\n            container.useInstance(ContextualParametersChecker().wrapIgnoringExceptionIfNotDebug())\n            container.useInstance((PluginDataValuesChecker() as CallChecker).wrapIgnoringExceptionIfNotDebug())\n            container.useInstance((PluginDataValuesChecker() as DeclarationChecker).wrapIgnoringExceptionIfNotDebug())\n            container.useInstance(CommandDeclarationChecker().wrapIgnoringExceptionIfNotDebug())\n        }\n    }\n\n    private fun DeclarationChecker.wrapIgnoringExceptionIfNotDebug(): DeclarationChecker {\n        if (DEBUG_ENABLED) {\n            return this\n        }\n        return DeclarationCheckerIgnoringExceptions(this)\n    }\n\n    private fun CallChecker.wrapIgnoringExceptionIfNotDebug(): CallChecker {\n        if (DEBUG_ENABLED) {\n            return this\n        }\n        return CallCheckerIgnoringExceptions(this)\n    }\n\n    class CallCheckerIgnoringExceptions(\n        private val delegate: CallChecker\n    ) : CallChecker {\n        override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) {\n            runIgnoringErrors { delegate.check(resolvedCall, reportOn, context) }\n        }\n\n    }\n\n    class DeclarationCheckerIgnoringExceptions(\n        private val delegate: DeclarationChecker\n    ) : DeclarationChecker {\n        override fun check(\n            declaration: KtDeclaration,\n            descriptor: DeclarationDescriptor,\n            context: DeclarationCheckerContext\n        ) {\n            runIgnoringErrors { delegate.check(declaration, descriptor, context) }\n        }\n\n    }\n}\n\nfun ModuleDescriptor.hasMiraiConsoleDependency(): Boolean {\n    // /.m2/repository/net/mamoe/kotlin-jvm-blocking-bridge-compiler-embeddable/1.4.0/kotlin-jvm-blocking-bridge-compiler-embeddable-1.4.0.jar\n    val pluginJpsJarName = \"mirai-console\"\n    val module =\n        getCapability(ModuleInfo.Capability)?.unwrapModuleSourceInfo()?.module\n            ?: return false\n    val facet = KotlinFacet.get(module) ?: return false\n    val pluginClasspath =\n        facet.configuration.settings.compilerArguments?.castOrNull<K2JVMCompilerArguments>()?.classpathAsList0\n            ?: return false\n\n    if (pluginClasspath.none { path -> path.name.contains(pluginJpsJarName) }) return false\n    return true\n}\n\nprivate var K2JVMCompilerArguments.classpathAsList0: List<File>\n    get() = classpath.orEmpty().split(File.pathSeparator).map(::File)\n    set(value) {\n        classpath = value.joinToString(separator = File.pathSeparator, transform = { it.path })\n    }\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/QuickFixRegistrar.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij\n\nimport com.intellij.codeInsight.intention.IntentionAction\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors\nimport net.mamoe.mirai.console.intellij.diagnostics.fix.*\nimport org.jetbrains.kotlin.diagnostics.DiagnosticFactory\nimport org.jetbrains.kotlin.idea.quickfix.KotlinIntentionActionsFactory\nimport org.jetbrains.kotlin.idea.quickfix.QuickFixContributor\nimport org.jetbrains.kotlin.idea.quickfix.QuickFixes\n\nclass QuickFixRegistrar : QuickFixContributor {\n    override fun registerQuickFixes(quickFixes: QuickFixes) {\n        fun DiagnosticFactory<*>.registerFactory(vararg factory: KotlinIntentionActionsFactory) {\n            quickFixes.register(this, *factory)\n        }\n\n        @Suppress(\"unused\")\n        fun DiagnosticFactory<*>.registerActions(vararg action: IntentionAction) {\n            quickFixes.register(this, *action)\n        }\n\n        MiraiConsoleErrors.UNSERIALIZABLE_TYPE.registerFactory(AddSerializerFix)\n        MiraiConsoleErrors.NOT_CONSTRUCTABLE_TYPE.registerFactory(ProvideDefaultValueFix)\n        MiraiConsoleErrors.READ_ONLY_VALUE_CANNOT_BE_VAR.registerFactory(ConvertToValFix)\n\n        MiraiConsoleErrors.USING_DERIVED_MAP_TYPE.registerFactory(ConvertToMapFix)\n        MiraiConsoleErrors.USING_DERIVED_MUTABLE_MAP_TYPE.registerFactory(ConvertToMutableMapFix)\n        MiraiConsoleErrors.USING_DERIVED_CONCURRENT_MAP_TYPE.registerFactory(ConvertToConcurrentMapFix)\n        MiraiConsoleErrors.USING_DERIVED_LIST_TYPE.registerFactory(ConvertToListFix)\n        MiraiConsoleErrors.USING_DERIVED_MUTABLE_LIST_TYPE.registerFactory(ConvertToMutableListFix)\n    }\n}\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/assets/Assets.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.assets\n\nimport com.intellij.openapi.util.IconLoader\nimport javax.swing.Icon\n\nobject Icons {\n    val CommandDeclaration: Icon = IconLoader.getIcon(\"/icons/commandDeclaration.svg\", Icons::class.java)\n    val PluginMainDeclaration: Icon = IconLoader.getIcon(\"/icons/pluginMainDeclaration.png\", Icons::class.java)\n\n    val MainIcon: Icon = PluginMainDeclaration\n}\n\nobject FT { // file template\n    const val BuildGradleKts = \"Plugin build.gradle.kts\"\n    const val BuildGradle = \"Plugin build.gradle\"\n\n    const val SettingsGradleKts = \"Plugin settings.gradle.kts\"\n    const val SettingsGradle = \"Plugin settings.gradle\"\n\n    const val GradleWrapperProperties = \"Gradle gradle-wrapper.properties\"\n    const val GradleProperties = \"Gradle gradle.properties\"\n\n    const val PluginMainKt = \"Plugin main class Kotlin.kt\"\n    const val PluginMainJava = \"Plugin main class Java.java\"\n\n    const val PluginMainService = \"Plugin main service.txt\"\n\n    const val Gitignore = \".gitignore\"\n\n    const val RunTerminalRun = \"RunTerminal.run.xml\"\n    const val AccountProperties = \"account.properties\"\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/assets/FileTemplateRegistrar.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.console.intellij.assets\n\nimport com.intellij.ide.fileTemplates.FileTemplateDescriptor\nimport com.intellij.ide.fileTemplates.FileTemplateGroupDescriptor\n\nclass FileTemplateRegistrar : com.intellij.ide.fileTemplates.FileTemplateGroupDescriptorFactory {\n    override fun getFileTemplatesDescriptor(): FileTemplateGroupDescriptor {\n        return FileTemplateGroupDescriptor(\"Mirai\", Icons.PluginMainDeclaration).apply {\n            addTemplate(FileTemplateDescriptor(FT.BuildGradleKts))\n            addTemplate(FileTemplateDescriptor(FT.BuildGradle))\n\n            addTemplate(FileTemplateDescriptor(FT.PluginMainKt))\n            addTemplate(FileTemplateDescriptor(FT.PluginMainJava))\n            addTemplate(FileTemplateDescriptor(FT.PluginMainService))\n\n            addTemplate(FileTemplateDescriptor(FT.GradleWrapperProperties))\n            addTemplate(FileTemplateDescriptor(FT.GradleProperties))\n\n            addTemplate(FileTemplateDescriptor(FT.SettingsGradleKts))\n            addTemplate(FileTemplateDescriptor(FT.SettingsGradle))\n\n            addTemplate(FileTemplateDescriptor(FT.Gitignore))\n\n            addTemplate(FileTemplateDescriptor(FT.RunTerminalRun))\n        }\n    }\n\n}\n\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/diagnostics/CommandDeclarationChecker.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.diagnostics\n\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.ILLEGAL_COMMAND_DECLARATION_RECEIVER\nimport net.mamoe.mirai.console.compiler.common.resolve.COMMAND_SENDER_FQ_NAME\nimport net.mamoe.mirai.console.compiler.common.resolve.COMPOSITE_COMMAND_SUB_COMMAND_FQ_NAME\nimport net.mamoe.mirai.console.compiler.common.resolve.SIMPLE_COMMAND_HANDLER_COMMAND_FQ_NAME\nimport net.mamoe.mirai.console.compiler.common.resolve.hasAnnotation\nimport net.mamoe.mirai.console.intellij.resolve.hasSuperType\nimport org.jetbrains.kotlin.descriptors.DeclarationDescriptor\nimport org.jetbrains.kotlin.diagnostics.Diagnostic\nimport org.jetbrains.kotlin.psi.KtDeclaration\nimport org.jetbrains.kotlin.psi.KtNamedFunction\nimport org.jetbrains.kotlin.resolve.checkers.DeclarationChecker\nimport org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext\n\nclass CommandDeclarationChecker : DeclarationChecker {\n    override fun check(\n        declaration: KtDeclaration,\n        descriptor: DeclarationDescriptor,\n        context: DeclarationCheckerContext\n    ) {\n        if (declaration !is KtNamedFunction) return\n\n        // exclusive checks or return\n        when {\n            descriptor.hasAnnotation(SIMPLE_COMMAND_HANDLER_COMMAND_FQ_NAME) -> {\n            }\n            descriptor.hasAnnotation(COMPOSITE_COMMAND_SUB_COMMAND_FQ_NAME) -> {\n            }\n            else -> return\n        }\n\n        // common checks\n        checkCommandReceiverParameter(declaration)?.let { context.report(it) }\n    }\n\n    companion object {\n        fun checkCommandReceiverParameter(declaration: KtNamedFunction): Diagnostic? {\n            val receiverTypeRef = declaration.receiverTypeReference ?: return null // no receiver, accept.\n            val receiver = receiverTypeRef.resolveReferencedType() ?: return null // unresolved type\n            if (!receiver.hasSuperType(COMMAND_SENDER_FQ_NAME)) {\n                return ILLEGAL_COMMAND_DECLARATION_RECEIVER.on(receiverTypeRef)\n            }\n\n            return null\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/diagnostics/ContextualParametersChecker.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.diagnostics\n\nimport com.intellij.psi.PsiElement\nimport net.mamoe.mirai.console.compiler.common.CheckerConstants\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.ILLEGAL_COMMAND_NAME\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.ILLEGAL_PERMISSION_ID\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.ILLEGAL_PERMISSION_NAME\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.ILLEGAL_PERMISSION_NAMESPACE\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.ILLEGAL_PLUGIN_DESCRIPTION\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.ILLEGAL_VERSION_REQUIREMENT\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.PROHIBITED_ABSTRACT_MESSAGE_KEYS\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.RESTRICTED_CONSOLE_COMMAND_OWNER\nimport net.mamoe.mirai.console.compiler.common.resolve.CONSOLE_COMMAND_OWNER_FQ_NAME\nimport net.mamoe.mirai.console.compiler.common.resolve.PROHIBITED_MESSAGE_KEYS\nimport net.mamoe.mirai.console.compiler.common.resolve.ResolveContextKind\nimport net.mamoe.mirai.console.compiler.common.resolve.resolveContextKinds\nimport net.mamoe.mirai.console.intellij.resolve.getResolvedCall\nimport net.mamoe.mirai.console.intellij.resolve.resolveStringConstantValues\nimport net.mamoe.mirai.console.intellij.util.RequirementHelper\nimport net.mamoe.mirai.console.intellij.util.RequirementParser\nimport org.jetbrains.kotlin.descriptors.ValueParameterDescriptor\nimport org.jetbrains.kotlin.diagnostics.Diagnostic\nimport org.jetbrains.kotlin.idea.inspections.collections.isCalling\nimport org.jetbrains.kotlin.psi.KtReferenceExpression\nimport org.jetbrains.kotlin.psi.ValueArgument\nimport org.jetbrains.kotlin.resolve.calls.checkers.CallChecker\nimport org.jetbrains.kotlin.resolve.calls.checkers.CallCheckerContext\nimport org.jetbrains.kotlin.resolve.calls.model.ResolvedCall\nimport java.util.*\nimport kotlin.reflect.KFunction2\n\nval CallCheckerContext.bindingContext get() = trace.bindingContext\n\n/**\n * Checks parameters with [ResolveContextKind]\n */\nclass ContextualParametersChecker : CallChecker {\n    override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) {\n        for ((parameter, resolvedArgument) in resolvedCall.valueArguments) {\n            for (valueArgument in resolvedArgument.arguments) {\n                checkArgument(parameter, valueArgument, context, valueArgument.asElement())\n            }\n        }\n    }\n//    \n//    override fun check(\n//        declaration: KtDeclaration,\n//        descriptor: DeclarationDescriptor,\n//        context: DeclarationCheckerContext,\n//    ) {\n//        val calls = declaration.bodyCalls(context.bindingContext) ?: return\n//\n//        for ((call, _) in calls) {\n//            for ((parameter, resolvedArgument) in call.valueArguments) {\n//                for (valueArgument in resolvedArgument.arguments) {\n//                    checkArgument(parameter, valueArgument, context)\n//                }\n//            }\n//        }\n//    }\n\n    private fun checkArgument(\n        parameter: ValueParameterDescriptor,\n        argument: ValueArgument,\n        context: CallCheckerContext,\n        inspectionTarget: PsiElement,\n    ) {\n        val elementCheckers = parameter.resolveContextKinds?.mapNotNull(checkersMap::get) ?: return\n        if (elementCheckers.isEmpty()) return\n\n        val resolvedConstants = argument.resolveStringConstantValues(context.bindingContext)?.toList() ?: return\n\n        for (elementChecker in elementCheckers) {\n            if (resolvedConstants.isEmpty()) {\n                elementChecker(context, inspectionTarget, argument, null)?.let { context.trace.report(it) }\n            } else {\n                for (resolvedConstant in resolvedConstants) {\n                    elementChecker(\n                        context,\n                        inspectionTarget,\n                        argument,\n                        resolvedConstant\n                    )?.let { context.trace.report(it) }\n                }\n            }\n        }\n    }\n\n    companion object {\n        private val ID_REGEX: Regex = CheckerConstants.PLUGIN_ID_REGEX\n        private val FORBIDDEN_ID_NAMES: Array<String> = CheckerConstants.PLUGIN_FORBIDDEN_NAMES\n\n        private const val syntax =\n            \"\"\"类似于 \"net.mamoe.mirai.example-plugin\", 其中 \"net.mamoe.mirai\" 为 groupId, \"example-plugin\" 为插件名\"\"\"\n\n        const val SEMANTIC_VERSIONING_PATTERN =\n            \"\"\"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:\\.(0|[1-9]\\d*))?(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?${'$'}\"\"\"\n\n        /**\n         * https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string\n         */\n        private val SEMANTIC_VERSIONING_REGEX = Regex(SEMANTIC_VERSIONING_PATTERN)\n\n        fun checkPluginId(inspectionTarget: PsiElement, value: String): Diagnostic? {\n            if (value.isBlank()) return ILLEGAL_PLUGIN_DESCRIPTION.on(inspectionTarget, \"插件 Id 不能为空. \\n插件 Id$syntax\")\n            if (value.none { it == '.' }) return ILLEGAL_PLUGIN_DESCRIPTION.on(\n                inspectionTarget,\n                \"插件 Id '$value' 无效. 插件 Id 必须同时包含 groupId 和插件名称. $syntax\"\n            )\n\n            val lowercaseId = value.lowercase()\n\n            if (ID_REGEX.matchEntire(value) == null) {\n                return ILLEGAL_PLUGIN_DESCRIPTION.on(\n                    inspectionTarget,\n                    \"插件 Id 无效. 正确的插件 Id 应该满足正则表达式 '${ID_REGEX.pattern}', \\n$syntax\"\n                )\n            }\n\n            FORBIDDEN_ID_NAMES.firstOrNull { it == lowercaseId }?.let { illegal ->\n                return ILLEGAL_PLUGIN_DESCRIPTION.on(inspectionTarget, \"'$illegal' 不允许作为插件 Id. 确保插件 Id 不完全是这个名称\")\n            }\n            return null\n        }\n\n        fun checkPluginName(inspectionTarget: PsiElement, value: String): Diagnostic? {\n            if (value.isBlank()) return ILLEGAL_PLUGIN_DESCRIPTION.on(inspectionTarget, \"插件名不能为空\")\n            val lowercaseName = value.lowercase()\n            FORBIDDEN_ID_NAMES.firstOrNull { it == lowercaseName }?.let { illegal ->\n                return ILLEGAL_PLUGIN_DESCRIPTION.on(inspectionTarget, \"'$illegal' 不允许作为插件名. 确保插件名不完全是这个名称\")\n            }\n            return null\n        }\n\n        fun checkPluginVersion(inspectionTarget: PsiElement, value: String): Diagnostic? {\n            if (!SEMANTIC_VERSIONING_REGEX.matches(value)) {\n                return ILLEGAL_PLUGIN_DESCRIPTION.on(\n                    inspectionTarget,\n                    \"版本号无效: '$value'. \\nhttps://semver.org/lang/zh-CN/\"\n                )\n            }\n            return null\n        }\n\n        fun checkCommandName(inspectionTarget: PsiElement, value: String): Diagnostic? {\n            return when {\n                value.isBlank() -> ILLEGAL_COMMAND_NAME.on(inspectionTarget, value, \"指令名不能为空\")\n                value.any { it.isWhitespace() } -> ILLEGAL_COMMAND_NAME.on(inspectionTarget, value, \"暂时不允许指令名中存在空格\")\n                value.contains(':') -> ILLEGAL_COMMAND_NAME.on(inspectionTarget, value, \"指令名不允许包含 ':'\")\n                value.contains('.') -> ILLEGAL_COMMAND_NAME.on(inspectionTarget, value, \"指令名不允许包含 '.'\")\n                else -> null\n            }\n        }\n\n        fun checkPermissionNamespace(inspectionTarget: PsiElement, value: String): Diagnostic? {\n            return when {\n                value.isBlank() -> ILLEGAL_PERMISSION_NAMESPACE.on(inspectionTarget, value, \"权限命名空间不能为空\")\n                value.any { it.isWhitespace() } -> ILLEGAL_PERMISSION_NAMESPACE.on(\n                    inspectionTarget,\n                    value,\n                    \"不允许权限命名空间中存在空格\"\n                )\n                value.contains(':') -> ILLEGAL_PERMISSION_NAMESPACE.on(inspectionTarget, value, \"权限命名空间不允许包含 ':'\")\n                else -> null\n            }\n        }\n\n        fun checkPermissionName(inspectionTarget: PsiElement, value: String): Diagnostic? {\n            return when {\n                value.isBlank() -> ILLEGAL_PERMISSION_NAME.on(inspectionTarget, value, \"权限名称不能为空\")\n                value.any { it.isWhitespace() } -> ILLEGAL_PERMISSION_NAME.on(inspectionTarget, value, \"不允许权限名称中存在空格\")\n                value.contains(':') -> ILLEGAL_PERMISSION_NAME.on(inspectionTarget, value, \"权限名称不允许包含 ':'\")\n                else -> null\n            }\n        }\n\n        fun checkPermissionId(inspectionTarget: PsiElement, value: String): Diagnostic? {\n            return when {\n                value.isBlank() -> ILLEGAL_PERMISSION_ID.on(inspectionTarget, value, \"权限 Id 不能为空\")\n                value.any { it.isWhitespace() } -> ILLEGAL_PERMISSION_ID.on(inspectionTarget, value, \"暂时不允许权限 Id 中存在空格\")\n                value.count { it == ':' } != 1 -> ILLEGAL_PERMISSION_ID.on(\n                    inspectionTarget,\n                    value,\n                    \"权限 Id 必须为 \\\"命名空间:名称\\\". 且命名空间和名称均不能包含 ':'\"\n                )\n                else -> null\n            }\n        }\n\n        @Suppress(\"UNUSED_PARAMETER\")\n        fun checkVersionRequirement(inspectionTarget: PsiElement, value: String): Diagnostic? {\n            return try {\n                RequirementHelper.RequirementChecker.processLine(RequirementParser.TokenReader(value))\n                null\n            } catch (err: Throwable) {\n                ILLEGAL_VERSION_REQUIREMENT.on(inspectionTarget, value, err.message ?: err.toString())\n            }\n        }\n\n        fun checkConsoleCommandOwner(\n            context: CallCheckerContext,\n            inspectionTarget: PsiElement,\n            argument: ValueArgument\n        ): Diagnostic? {\n            val expr = argument.getArgumentExpression() ?: return null\n\n            if (expr is KtReferenceExpression) {\n                if (expr.getResolvedCall(context.bindingContext)?.isCalling(CONSOLE_COMMAND_OWNER_FQ_NAME) == true) {\n                    return RESTRICTED_CONSOLE_COMMAND_OWNER.on(inspectionTarget)\n                }\n            }\n\n            return null\n        }\n\n        fun checkAbstractMessageKeys(\n            context: CallCheckerContext,\n            inspectionTarget: PsiElement,\n            argument: ValueArgument\n        ): Diagnostic? {\n            val expr = argument.getArgumentExpression() ?: return null\n\n            if (expr is KtReferenceExpression) {\n                val call = expr.getResolvedCall(context.bindingContext) ?: return null\n                if (PROHIBITED_MESSAGE_KEYS.any { call.isCalling(it) }) {\n                    return PROHIBITED_ABSTRACT_MESSAGE_KEYS.on(inspectionTarget)\n                }\n            }\n\n            return null\n        }\n    }\n\n    fun interface ElementChecker {\n        operator fun invoke(\n            context: CallCheckerContext,\n            declaration: PsiElement,\n            valueArgument: ValueArgument,\n            value: String?\n        ): Diagnostic?\n    }\n\n    @Suppress(\"unused\")\n    private val checkersMap: EnumMap<ResolveContextKind, ElementChecker> =\n        EnumMap<ResolveContextKind, ElementChecker>(ResolveContextKind::class.java).apply {\n\n            fun put(key: ResolveContextKind, value: KFunction2<PsiElement, String, Diagnostic?>): ElementChecker? {\n                return put(key) { _, d, _, v ->\n                    if (v != null) value(d, v)\n                    else null\n                }\n            }\n\n            fun put(\n                key: ResolveContextKind,\n                value: KFunction2<PsiElement, ValueArgument, Diagnostic?>\n            ): ElementChecker? {\n                return put(key) { _, d, v, _ ->\n                    value(d, v)\n                }\n            }\n\n            fun put(\n                key: ResolveContextKind,\n                value: (CallCheckerContext, PsiElement, ValueArgument) -> Diagnostic?\n            ): ElementChecker? {\n                return put(key) { c, d, v, _ ->\n                    value(c, d, v)\n                }\n            }\n\n            put(ResolveContextKind.PLUGIN_NAME, ::checkPluginName)\n            put(ResolveContextKind.PLUGIN_ID, ::checkPluginId)\n            put(ResolveContextKind.SEMANTIC_VERSION, ::checkPluginVersion)\n            put(ResolveContextKind.COMMAND_NAME, ::checkCommandName)\n            put(ResolveContextKind.PERMISSION_NAME, ::checkPermissionName)\n            put(ResolveContextKind.PERMISSION_NAMESPACE, ::checkPermissionNamespace)\n            put(ResolveContextKind.PERMISSION_ID, ::checkPermissionId)\n            put(ResolveContextKind.VERSION_REQUIREMENT, ::checkVersionRequirement)\n            put(ResolveContextKind.RESTRICTED_CONSOLE_COMMAND_OWNER, ::checkConsoleCommandOwner)\n            put(ResolveContextKind.RESTRICTED_ABSTRACT_MESSAGE_KEYS, ::checkAbstractMessageKeys)\n        }\n\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/diagnostics/MessageChainGetCallChecker.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.diagnostics\n\nimport com.intellij.psi.PsiElement\nimport org.jetbrains.kotlin.idea.inspections.collections.isCalling\nimport org.jetbrains.kotlin.resolve.calls.checkers.CallChecker\nimport org.jetbrains.kotlin.resolve.calls.checkers.CallCheckerContext\nimport org.jetbrains.kotlin.resolve.calls.model.ResolvedCall\n\nclass MessageChainGetCallChecker : CallChecker {\n    override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) {\n//        if (resolvedCall.isCalling())\n    }\n\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/diagnostics/PluginDataValuesChecker.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"MemberVisibilityCanBePrivate\")\n\npackage net.mamoe.mirai.console.intellij.diagnostics\n\nimport com.intellij.psi.PsiElement\nimport net.mamoe.mirai.console.compiler.common.SERIALIZABLE_FQ_NAME\nimport net.mamoe.mirai.console.compiler.common.castOrNull\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors\nimport net.mamoe.mirai.console.compiler.common.resolve.*\nimport net.mamoe.mirai.console.intellij.resolve.hasSuperType\nimport org.jetbrains.kotlin.descriptors.CallableDescriptor\nimport org.jetbrains.kotlin.descriptors.ClassDescriptor\nimport org.jetbrains.kotlin.descriptors.DeclarationDescriptor\nimport org.jetbrains.kotlin.idea.inspections.collections.isCalling\nimport org.jetbrains.kotlin.idea.project.builtIns\nimport org.jetbrains.kotlin.idea.refactoring.fqName.fqName\nimport org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName\nimport org.jetbrains.kotlin.js.descriptorUtils.getKotlinTypeFqName\nimport org.jetbrains.kotlin.psi.*\nimport org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject\nimport org.jetbrains.kotlin.resolve.calls.checkers.CallChecker\nimport org.jetbrains.kotlin.resolve.calls.checkers.CallCheckerContext\nimport org.jetbrains.kotlin.resolve.calls.model.ResolvedCall\nimport org.jetbrains.kotlin.resolve.checkers.DeclarationChecker\nimport org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext\nimport org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe\nimport org.jetbrains.kotlin.resolve.descriptorUtil.isSubclassOf\nimport org.jetbrains.kotlin.types.KotlinType\nimport org.jetbrains.kotlin.types.SimpleType\n\nclass PluginDataValuesChecker : CallChecker, DeclarationChecker {\n\n    override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) {\n        check(\n            resolvedCall as ResolvedCall<out CallableDescriptor>,\n            resolvedCall.call.callElement as? KtExpression ?: return,\n            context\n        )\n    }\n\n    override fun check(\n        declaration: KtDeclaration,\n        descriptor: DeclarationDescriptor,\n        context: DeclarationCheckerContext\n    ) {\n        if (declaration is KtProperty) {\n            checkReadOnly(declaration, context)\n        }\n    }\n\n    /**\n     * Check `PluginData.value` calls\n     */\n    fun check(call: ResolvedCall<out CallableDescriptor>, expr: KtExpression, context: CallCheckerContext) {\n        if (!call.isCalling(PLUGIN_DATA_VALUE_FUNCTIONS_FQ_FQ_NAME)) return\n\n        if (expr is KtCallExpression)\n            checkConstructableAndSerializable(call, expr, context)\n    }\n\n    private fun KtProperty.isInsideOrExtensionOfReadOnlyPluginData(): Boolean {\n        return containingClassOrObject?.hasSuperType(READ_ONLY_PLUGIN_DATA_FQ_NAME) == true // inside\n                || receiverTypeReference?.hasSuperType(READ_ONLY_PLUGIN_DATA_FQ_NAME) == true // extension\n    }\n\n    private fun checkReadOnly(property: KtProperty, context: DeclarationCheckerContext) {\n        // first parent is KtPropertyDelegate, next is KtProperty\n\n        if (property.isVar // var\n            && property.delegateExpression?.getResolvedCall(context)\n                ?.isCalling(PLUGIN_DATA_VALUE_FUNCTIONS_FQ_FQ_NAME) == true // by value()\n            && property.isInsideOrExtensionOfReadOnlyPluginData() // extensionReceiver is ReadOnlyPluginData or null\n        ) {\n            context.report(MiraiConsoleErrors.READ_ONLY_VALUE_CANNOT_BE_VAR.on(property.valOrVarKeyword))\n        }\n    }\n\n    private fun checkConstructableAndSerializable(\n        call: ResolvedCall<out CallableDescriptor>,\n        expr: KtCallExpression,\n        context: CallCheckerContext\n    ) {\n        if (call.resultingDescriptor.resolveContextKinds?.contains(ResolveContextKind.RESTRICTED_NO_ARG_CONSTRUCTOR) != true) return\n\n        for ((entry, argument) in call.typeArguments.entries.zip(expr.typeArguments)) {\n            val (parameter, kotlinType) = entry\n            if ((parameter.isReified\n                        || parameter.resolveContextKinds?.contains(ResolveContextKind.RESTRICTED_NO_ARG_CONSTRUCTOR) == true)\n                && kotlinType is SimpleType\n            ) {\n                checkConstructableAndSerializable(kotlinType, expr, argument, context)\n                checkFixType(kotlinType, expr, argument, context)\n            }\n        }\n    }\n\n    private fun checkFixType(\n        type: KotlinType,\n        callExpr: KtCallExpression,\n        inspectionTarget: KtTypeProjection,\n        context: CallCheckerContext\n    ) {\n        val classDescriptor = type.classDescriptor() ?: return\n        val jetTypeFqn = type.getKotlinTypeFqName(false)\n\n        val builtIns = callExpr.builtIns\n        val factory = when {\n            jetTypeFqn == \"java.util.concurrent.ConcurrentHashMap\" -> MiraiConsoleErrors.USING_DERIVED_CONCURRENT_MAP_TYPE\n\n            classDescriptor.fqNameSafe.asString()\n                .startsWith(\"net.mamoe.mirai.message.data.\") -> null // Don't report for MessageChain\n\n            classDescriptor.isSubclassOf(builtIns.list) && jetTypeFqn != \"kotlin.collections.List\" -> {\n                if (classDescriptor.isSubclassOf(builtIns.mutableList)) {\n                    if (jetTypeFqn != \"kotlin.collections.MutableList\" && jetTypeFqn != \"java.util.List\") {\n                        MiraiConsoleErrors.USING_DERIVED_MUTABLE_LIST_TYPE\n                    } else null\n                } else MiraiConsoleErrors.USING_DERIVED_LIST_TYPE\n            }\n\n            classDescriptor.isSubclassOf(builtIns.map) && jetTypeFqn != \"kotlin.collections.Map\" -> {\n                if (classDescriptor.isSubclassOf(builtIns.mutableMap)) {\n                    if (jetTypeFqn != \"kotlin.collections.MutableMap\" && jetTypeFqn != \"java.util.Map\") {\n                        MiraiConsoleErrors.USING_DERIVED_MUTABLE_MAP_TYPE\n                    } else null\n                } else MiraiConsoleErrors.USING_DERIVED_MAP_TYPE\n            }\n\n            else -> return\n        } ?: return\n\n        context.trace.report(factory.on(inspectionTarget, callExpr, jetTypeFqn.substringAfterLast('.')))\n    }\n\n    private fun checkConstructableAndSerializable(\n        type: KotlinType,\n        callExpr: KtCallExpression,\n        inspectionTarget: KtTypeProjection,\n        context: CallCheckerContext\n    ) {\n        val classDescriptor = type.classDescriptor() ?: return\n\n        if (canBeSerializedInternally(classDescriptor)) return\n\n        if (!classDescriptor.hasNoArgConstructor())\n            return context.trace.report(\n                MiraiConsoleErrors.NOT_CONSTRUCTABLE_TYPE.on(\n                    inspectionTarget,\n                    callExpr,\n                    type.fqName?.asString().toString()\n                )\n            )\n\n        if (!classDescriptor.hasAnnotation(SERIALIZABLE_FQ_NAME))\n            return context.trace.report(\n                MiraiConsoleErrors.UNSERIALIZABLE_TYPE.on(\n                    inspectionTarget,\n                    classDescriptor\n                )\n            )\n    }\n\n    private fun KotlinType.classDescriptor() = constructor.declarationDescriptor?.castOrNull<ClassDescriptor>()\n\n    private fun retrieveInspectionTarget(type: KotlinType, callExpr: KtCallExpression): KtTypeProjection? {\n        val fqName = type.fqName ?: return null\n        return callExpr.typeArguments.find { it.typeReference?.isReferencing(fqName) == true }\n    }\n}\n\nprivate fun canBeSerializedInternally(descriptor: ClassDescriptor): Boolean {\n    @Suppress(\"UNUSED_VARIABLE\")\n    val name = when (descriptor.defaultType.getKotlinTypeFqName(false)) {\n        // kotlinx.serialization\n        \"kotlin.Unit\" -> \"UnitSerializer\"\n        \"Z\", \"kotlin.Boolean\" -> \"BooleanSerializer\"\n        \"B\", \"kotlin.Byte\" -> \"ByteSerializer\"\n        \"S\", \"kotlin.Short\" -> \"ShortSerializer\"\n        \"I\", \"kotlin.Int\" -> \"IntSerializer\"\n        \"J\", \"kotlin.Long\" -> \"LongSerializer\"\n        \"F\", \"kotlin.Float\" -> \"FloatSerializer\"\n        \"D\", \"kotlin.Double\" -> \"DoubleSerializer\"\n        \"C\", \"kotlin.Char\" -> \"CharSerializer\"\n        \"kotlin.String\" -> \"StringSerializer\"\n        \"kotlin.Pair\" -> \"PairSerializer\"\n        \"kotlin.Triple\" -> \"TripleSerializer\"\n        \"kotlin.collections.Collection\", \"kotlin.collections.List\",\n        \"kotlin.collections.ArrayList\", \"kotlin.collections.MutableList\",\n        -> \"ArrayListSerializer\"\n\n        \"kotlin.collections.Set\", \"kotlin.collections.LinkedHashSet\", \"kotlin.collections.MutableSet\" -> \"LinkedHashSetSerializer\"\n        \"kotlin.collections.HashSet\" -> \"HashSetSerializer\"\n        \"kotlin.collections.Map\", \"kotlin.collections.LinkedHashMap\", \"kotlin.collections.MutableMap\" -> \"LinkedHashMapSerializer\"\n        \"kotlin.collections.HashMap\" -> \"HashMapSerializer\"\n        \"kotlin.collections.Map.Entry\" -> \"MapEntrySerializer\"\n        \"kotlin.ByteArray\" -> \"ByteArraySerializer\"\n        \"kotlin.ShortArray\" -> \"ShortArraySerializer\"\n        \"kotlin.IntArray\" -> \"IntArraySerializer\"\n        \"kotlin.LongArray\" -> \"LongArraySerializer\"\n        \"kotlin.CharArray\" -> \"CharArraySerializer\"\n        \"kotlin.FloatArray\" -> \"FloatArraySerializer\"\n        \"kotlin.DoubleArray\" -> \"DoubleArraySerializer\"\n        \"kotlin.BooleanArray\" -> \"BooleanArraySerializer\"\n        \"java.lang.Boolean\" -> \"BooleanSerializer\"\n        \"java.lang.Byte\" -> \"ByteSerializer\"\n        \"java.lang.Short\" -> \"ShortSerializer\"\n        \"java.lang.Integer\" -> \"IntSerializer\"\n        \"java.lang.Long\" -> \"LongSerializer\"\n        \"java.lang.Float\" -> \"FloatSerializer\"\n        \"java.lang.Double\" -> \"DoubleSerializer\"\n        \"java.lang.Character\" -> \"CharSerializer\"\n        \"java.lang.String\" -> \"StringSerializer\"\n        \"java.util.Collection\", \"java.util.List\", \"java.util.ArrayList\" -> \"ArrayListSerializer\"\n        \"java.util.Set\", \"java.util.LinkedHashSet\" -> \"LinkedHashSetSerializer\"\n        \"java.util.HashSet\" -> \"HashSetSerializer\"\n        \"java.util.Map\", \"java.util.LinkedHashMap\" -> \"LinkedHashMapSerializer\"\n        \"java.util.HashMap\" -> \"HashMapSerializer\"\n        \"java.util.Map.Entry\" -> \"MapEntrySerializer\"\n\n        // mirai\n        \"java.util.concurrent.ConcurrentMap\",\n        \"java.util.concurrent.ConcurrentHashMap\",\n        -> \"ConcurrentMap\" // dummy name\n        else -> return false\n    }\n    return true\n}\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/diagnostics/PluginMainServiceNotConfiguredInspection.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.diagnostics\n\nimport com.intellij.codeInspection.ProblemHighlightType\nimport com.intellij.codeInspection.ProblemsHolder\nimport com.intellij.openapi.application.runReadAction\nimport com.intellij.openapi.progress.impl.CancellationCheck.Companion.runWithCancellationCheck\nimport com.intellij.openapi.project.rootManager\nimport com.intellij.psi.PsiClass\nimport com.intellij.psi.PsiElement\nimport com.intellij.psi.PsiElementVisitor\nimport com.intellij.psi.PsiNameIdentifierOwner\nimport net.mamoe.mirai.console.compiler.common.resolve.AUTO_SERVICE\nimport net.mamoe.mirai.console.compiler.common.resolve.PLUGIN_FQ_NAME\nimport net.mamoe.mirai.console.intellij.diagnostics.fix.ConfigurePluginMainServiceFix\nimport net.mamoe.mirai.console.intellij.resolve.allSuperNames\nimport net.mamoe.mirai.console.intellij.resolve.hasAnnotation\nimport org.jetbrains.kotlin.idea.base.util.module\nimport org.jetbrains.kotlin.idea.codeinsight.api.classic.inspections.AbstractKotlinInspection\nimport org.jetbrains.kotlin.psi.KtClassOrObject\nimport org.jetbrains.kotlin.psi.KtObjectDeclaration\nimport org.jetbrains.kotlin.psi.classOrObjectVisitor\n\n/*\nprivate val bundle by lazy {\n    BundleUtil.loadLanguageBundle(PluginMainServiceNotConfiguredInspection::class.java.classLoader, \"messages.InspectionGadgetsBundle\")!!\n}*/\n\nclass PluginMainServiceNotConfiguredInspection : AbstractKotlinInspection() {\n    companion object {\n        private val SERVICE_FILE_NAMES = arrayOf(\n            \"net.mamoe.mirai.console.plugin.jvm.JvmPlugin\",\n            \"net.mamoe.mirai.console.plugin.jvm.KotlinPlugin\",\n            \"net.mamoe.mirai.console.plugin.jvm.JavaPlugin\",\n        )\n    }\n\n    override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {\n        val ktVisitor = classOrObjectVisitor visitor@{ element ->\n            if (element !is KtObjectDeclaration) return@visitor\n            if (element.allSuperNames.none { it == PLUGIN_FQ_NAME }) return@visitor\n            val fqName = element.fqName?.asString() ?: return@visitor\n\n            val found = isServiceConfiguredWithAutoService(element)\n                    || isServiceConfiguredWithResource(element, fqName)\n\n            if (!found) {\n                registerProblemImpl(holder, element, fqName)\n            }\n        }\n\n        val javaVisitor = object : PsiElementVisitor() {\n            override fun visitElement(element: PsiElement) {\n                if (element !is PsiClass) return\n                if (element.allSuperNames.none { it == PLUGIN_FQ_NAME }) return\n\n                if (element.hasAnnotation(AUTO_SERVICE.asString())) return\n                val fqName = element.qualifiedName ?: return\n                if (isServiceConfiguredWithResource(element, fqName)) return\n\n                registerProblemImpl(holder, element, fqName)\n            }\n        }\n\n        return object : PsiElementVisitor() {\n            override fun visitElement(element: PsiElement) {\n                super.visitElement(element)\n                if (element is KtClassOrObject) ktVisitor.visitClassOrObject(element)\n                else javaVisitor.visitElement(element)\n            }\n        }\n    }\n\n    private fun registerProblemImpl(holder: ProblemsHolder, element: PsiNameIdentifierOwner, fqName: String) {\n        holder.registerProblem(\n            element.nameIdentifier ?: element.identifyingElement ?: element,\n            @Suppress(\"DialogTitleCapitalization\") \"插件主类服务未配置\",\n            ProblemHighlightType.WARNING,\n            ConfigurePluginMainServiceFix(element, fqName)\n        )\n    }\n\n    private fun isServiceConfiguredWithAutoService(\n        ktClass: KtClassOrObject,\n    ): Boolean {\n        return ktClass.hasAnnotation(AUTO_SERVICE)\n    }\n\n    private fun isServiceConfiguredWithResource(\n        psiOrKtClass: PsiElement,\n        fqName: String,\n    ): Boolean {\n        return runWithCancellationCheck {\n            val sourceRoots: Array<com.intellij.openapi.vfs.VirtualFile> =\n                psiOrKtClass.module?.rootManager?.sourceRoots ?: return@runWithCancellationCheck false\n            val services = sourceRoots.asSequence().flatMap { file ->\n                SERVICE_FILE_NAMES.asSequence().mapNotNull { serviceFileName ->\n                    file.findFileByRelativePath(\"META-INF/services/$serviceFileName\")\n                }\n            }\n            return@runWithCancellationCheck services.any { serviceFile ->\n                runReadAction {\n                    serviceFile.inputStream.bufferedReader()\n                        .use { reader -> reader.lineSequence().any { it == fqName } }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/diagnostics/QuickFixUtils.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.diagnostics\n\nimport com.intellij.codeInspection.LocalQuickFix\nimport com.intellij.openapi.editor.Editor\nimport com.intellij.openapi.project.Project\nimport com.intellij.psi.PsiElement\nimport com.intellij.psi.PsiFile\nimport org.jetbrains.kotlin.idea.inspections.KotlinUniversalQuickFix\nimport org.jetbrains.kotlin.idea.quickfix.KotlinCrossLanguageQuickFixAction\n\n\nfun <T : PsiElement> LocalQuickFix(\n    text: String,\n    element: T,\n    invokeAction: QuickFixInvoke<T>.() -> Unit\n): LocalQuickFix {\n    return object : KotlinCrossLanguageQuickFixAction<T>(element), KotlinUniversalQuickFix {\n        @Suppress(\"DialogTitleCapitalization\")\n        override fun getFamilyName(): String = \"Mirai console\"\n        override fun getText(): String = text\n        override fun invokeImpl(project: Project, editor: Editor?, file: PsiFile) {\n            invokeAction(QuickFixInvoke(project, editor ?: return, file, this.element ?: return))\n        }\n    }\n}\n\nclass QuickFixInvoke<T>(\n    val project: Project,\n    val editor: Editor,\n    val file: PsiFile,\n    val element: T,\n)"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/diagnostics/ResourceNotClosedInspection.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.diagnostics\n\nimport com.intellij.codeInspection.LocalQuickFix\nimport com.intellij.codeInspection.ProblemHighlightType\nimport com.intellij.codeInspection.ProblemsHolder\nimport com.intellij.openapi.editor.Editor\nimport com.intellij.openapi.project.Project\nimport com.intellij.psi.*\nimport net.mamoe.mirai.console.intellij.resolve.*\nimport org.jetbrains.kotlin.idea.base.psi.kotlinFqName\nimport org.jetbrains.kotlin.idea.caches.resolve.resolveToCall\nimport org.jetbrains.kotlin.idea.codeinsight.api.classic.inspections.AbstractKotlinInspection\nimport org.jetbrains.kotlin.idea.inspections.KotlinUniversalQuickFix\nimport org.jetbrains.kotlin.idea.quickfix.KotlinCrossLanguageQuickFixAction\nimport org.jetbrains.kotlin.idea.references.mainReference\nimport org.jetbrains.kotlin.idea.search.usagesSearch.descriptor\nimport org.jetbrains.kotlin.idea.util.ImportInsertHelper\nimport org.jetbrains.kotlin.name.FqName\nimport org.jetbrains.kotlin.psi.*\nimport org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject\nimport org.jetbrains.kotlin.psi.psiUtil.referenceExpression\nimport org.jetbrains.kotlin.resolve.calls.util.getCalleeExpressionIfAny\nimport org.jetbrains.kotlin.resolve.lazy.BodyResolveMode\nimport kotlin.contracts.contract\n\n/*\nprivate val bundle by lazy {\n    BundleUtil.loadLanguageBundle(PluginMainServiceNotConfiguredInspection::class.java.classLoader, \"messages.InspectionGadgetsBundle\")!!\n}*/\n\n\n/**\n * @since 2.4\n */\nclass ResourceNotClosedInspection : AbstractKotlinInspection() {\n    override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {\n        return object : KtVisitorVoid() {\n            override fun visitCallExpression(callExpression: KtCallExpression) {\n                for (processor in ResourceNotClosedInspectionProcessors.processors) {\n                    processor.visitKtExpr(holder, isOnTheFly, callExpression)\n                }\n            }\n\n            override fun visitElement(element: PsiElement) {\n                if (element is PsiCallExpression) {\n                    for (processor in ResourceNotClosedInspectionProcessors.processors) {\n                        processor.visitPsiExpr(holder, isOnTheFly, element)\n                    }\n                }\n            }\n        }\n    }\n}\n\nval CONTACT_FQ_NAME = FqName(\"net.mamoe.mirai.contact.Contact\")\nval CONTACT_COMPANION_FQ_NAME = FqName(\"net.mamoe.mirai.contact.Contact.Companion\")\n\nfun KtReferenceExpression.resolveCalleeFunction(): KtNamedFunction? {\n    val originalCallee = getCalleeExpressionIfAny()?.referenceExpression()?.mainReference?.resolve() ?: return null\n    if (originalCallee !is KtNamedFunction) return null\n\n    return originalCallee\n}\n\nfun KtNamedFunction.isNamedMemberFunctionOf(\n    className: String,\n    functionName: String,\n    extensionReceiver: String? = null\n): Boolean {\n    if (extensionReceiver != null) {\n        if (this.receiverTypeReference?.resolveReferencedType()?.kotlinFqName\n                ?.toString() != extensionReceiver\n        ) return false\n    }\n    return this.name == functionName && this.containingClassOrObject?.allSuperTypes?.any {\n        it.kotlinFqName?.toString() == className\n    } == true\n}\n\n@Suppress(\"DialogTitleCapitalization\")\nobject ResourceNotClosedInspectionProcessors {\n    val processors = arrayOf(\n        FirstArgumentProcessor,\n        KtExtensionProcessor\n    )\n\n    interface Processor {\n        fun visitKtExpr(holder: ProblemsHolder, isOnTheFly: Boolean, callExpr: KtCallExpression)\n        fun visitPsiExpr(holder: ProblemsHolder, isOnTheFly: Boolean, expr: PsiCallExpression)\n    }\n\n    object KtExtensionProcessor : Processor {\n        // net.mamoe.mirai.utils.ExternalResource.Companion.sendAsImage(net.mamoe.mirai.utils.ExternalResource, C, kotlin.coroutines.Continuation<? super net.mamoe.mirai.message.MessageReceipt<? extends C>>)\n        val SEND_AS_IMAGE_TO = FunctionSignature {\n            name(\"sendAsImageTo\")\n            dispatchReceiver(\"net.mamoe.mirai.utils.ExternalResource.Companion\")\n            extensionReceiver(\"net.mamoe.mirai.utils.ExternalResource\")\n        }\n        val UPLOAD_AS_IMAGE = FunctionSignature {\n            name(\"uploadAsImage\")\n            dispatchReceiver(\"net.mamoe.mirai.utils.ExternalResource.Companion\")\n            extensionReceiver(\"net.mamoe.mirai.utils.ExternalResource\")\n        }\n\n        override fun visitKtExpr(holder: ProblemsHolder, isOnTheFly: Boolean, callExpr: KtCallExpression) {\n            val parent = callExpr.parent\n            if (parent !is KtDotQualifiedExpression) return\n            val callee = callExpr.resolveCalleeFunction() ?: return\n\n            if (!parent.receiverExpression.isCallingExternalResourceCreators()) return\n\n            class Fix(private val functionName: String) :\n                KotlinCrossLanguageQuickFixAction<KtDotQualifiedExpression>(parent), KotlinUniversalQuickFix {\n                override fun getFamilyName(): String = FAMILY_NAME\n                override fun getText(): String = \"修复 $functionName\"\n\n                override fun invokeImpl(project: Project, editor: Editor?, file: PsiFile) {\n                    if (editor == null) return\n                    val uploadImageExpression = element ?: return\n                    val toExternalExpression = uploadImageExpression.receiverExpression\n\n                    val toExternalReceiverExpression = toExternalExpression.dotReceiverExpression() ?: return\n\n                    toExternalExpression.replace(toExternalReceiverExpression)\n                }\n            }\n\n            when {\n                callee.hasSignature(SEND_AS_IMAGE_TO) -> {\n                    // RECEIVER.sendAsImageTo\n                    holder.registerResourceNotClosedProblem(\n                        parent.receiverExpression,\n                        Fix(\"sendAsImageTo\"),\n                    )\n                }\n\n                callee.hasSignature(UPLOAD_AS_IMAGE) -> {\n                    holder.registerResourceNotClosedProblem(\n                        parent.receiverExpression,\n                        Fix(\"uploadAsImage\"),\n                    )\n                }\n            }\n        }\n\n        override fun visitPsiExpr(holder: ProblemsHolder, isOnTheFly: Boolean, expr: PsiCallExpression) {\n        }\n\n    }\n\n    object FirstArgumentProcessor : Processor {\n        val CONTACT_UPLOAD_IMAGE = FunctionSignature {\n            name(\"uploadImage\")\n            dispatchReceiver(CONTACT_FQ_NAME)\n            parameters(\"net.mamoe.mirai.utils.ExternalResource\")\n        }\n        val CONTACT_UPLOAD_IMAGE_STATIC = FunctionSignature {\n            name(\"uploadImage\")\n            extensionReceiver(CONTACT_FQ_NAME)\n            dispatchReceiver(CONTACT_COMPANION_FQ_NAME)\n            parameters(\"net.mamoe.mirai.utils.ExternalResource\")\n        }\n        val CONTACT_COMPANION_UPLOAD_IMAGE = FunctionSignature {\n            name(\"uploadImage\")\n            extensionReceiver(CONTACT_FQ_NAME)\n            parameters(\"net.mamoe.mirai.utils.ExternalResource\")\n        }\n\n        val CONTACT_COMPANION_SEND_IMAGE = FunctionSignature {\n            name(\"sendImage\")\n            extensionReceiver(CONTACT_FQ_NAME)\n            parameters(\"net.mamoe.mirai.utils.ExternalResource\")\n        }\n\n        private val signatures = arrayOf(\n            CONTACT_UPLOAD_IMAGE,\n            CONTACT_COMPANION_UPLOAD_IMAGE,\n            CONTACT_COMPANION_SEND_IMAGE\n        )\n\n        override fun visitKtExpr(holder: ProblemsHolder, isOnTheFly: Boolean, callExpr: KtCallExpression) {\n            val callee = callExpr.resolveCalleeFunction() ?: return\n            if (signatures.none { callee.hasSignature(it) }) return\n\n            val firstArgument = callExpr.valueArguments.firstOrNull() ?: return\n            val firstArgumentExpr = firstArgument.getArgumentExpression()\n            if (firstArgumentExpr?.isCallingExternalResourceCreators() != true) return\n\n            holder.registerResourceNotClosedProblem(\n                firstArgument,\n                LocalQuickFix(\"修复\", firstArgumentExpr) {\n                    fun tryAddImport() {\n                        if (file !is KtFile) return\n                        val companion = callee.descriptor?.containingDeclaration?.companionObjectDescriptor() ?: return\n                        val toImport = companion.findMemberFunction(callee.nameAsName ?: return) ?: return\n\n                        // net.mamoe.mirai.contact.Contact.Companion\n                        ImportInsertHelper.getInstance(project).importDescriptor(file, toImport)\n                    }\n\n                    val newArgumentText = element.dotReceiverExpression()?.text ?: return@LocalQuickFix\n                    callExpr.replace(KtPsiFactory(project).createExpression(buildString {\n                        append(callee.name)\n                        append('(')\n                        append(newArgumentText)\n                        append(')')\n                    }))\n                    tryAddImport()\n                }\n            )\n        }\n\n        override fun visitPsiExpr(holder: ProblemsHolder, isOnTheFly: Boolean, expr: PsiCallExpression) {\n            if (expr !is PsiMethodCallExpression) return\n            val callee = expr.resolveMethod() ?: return\n\n            val arguments = expr.argumentList.expressions\n            when {\n                callee.hasSignature(CONTACT_UPLOAD_IMAGE) -> {\n                    createFixImpl(\n                        expr = expr,\n                        holder = holder,\n                        argument = arguments.firstOrNull() ?: return,\n                        fileTypeArgument = arguments.getOrNull(1)\n                    ) { it.methodExpression.qualifierExpression?.text ?: \"this\" }\n                }\n\n                callee.hasSignature(CONTACT_UPLOAD_IMAGE_STATIC) -> {\n                    createFixImpl(\n                        expr = expr,\n                        holder = holder,\n                        argument = arguments.getOrNull(1) ?: return,\n                        fileTypeArgument = arguments.getOrNull(2)\n                    ) { arguments.getOrNull(0)?.text ?: \"this\" }\n                }\n            }\n        }\n\n        private fun createFixImpl(\n            expr: PsiMethodCallExpression,\n            holder: ProblemsHolder,\n            argument: PsiExpression,\n            fileTypeArgument: PsiExpression?,\n            replaceForFirstArgument: (expr: PsiMethodCallExpression) -> String,\n        ) {\n            if (!argument.isCallingExternalResourceCreators()) return\n\n            holder.registerResourceNotClosedProblem(\n                argument,\n                LocalQuickFix(\"修复\", argument) {\n                    /*\n                            useImage(Contact.uploadImage(contact, ExternalResource.create(file))); // before\n                            useImage(Contact.uploadImage(contact, file)); // after\n                             */\n                    val factory = project.psiElementFactory ?: return@LocalQuickFix\n                    val reference = factory.createExpressionFromText(\n                        if (fileTypeArgument == null) {\n                            \"$CONTACT_FQ_NAME.uploadImage(${replaceForFirstArgument(expr)}, ${argument.argumentList?.expressions?.firstOrNull()?.text ?: \"\"})\"\n                        } else {\n                            \"$CONTACT_FQ_NAME.uploadImage(${replaceForFirstArgument(expr)}, ${argument.argumentList?.expressions?.firstOrNull()?.text ?: \"\"}, ${fileTypeArgument.text})\"\n                        },\n                        expr.context\n                    )\n                    expr.replace(reference)\n                }\n            )\n        }\n    }\n\n    private fun ProblemsHolder.registerResourceNotClosedProblem(target: PsiElement, vararg fixes: LocalQuickFix) {\n        registerProblem(\n            target,\n            @Suppress(\"DialogTitleCapitalization\") \"资源未关闭\",\n            ProblemHighlightType.WARNING,\n            *fixes\n        )\n    }\n}\n\nprivate val EXTERNAL_RESOURCE_CREATE = FunctionSignature {\n    name(\"create\")\n    dispatchReceiver(\"net.mamoe.mirai.utils.ExternalResource.Companion\")\n}\nprivate val TO_EXTERNAL_RESOURCE = FunctionSignature {\n    name(\"toExternalResource\")\n    dispatchReceiver(\"net.mamoe.mirai.utils.ExternalResource.Companion\")\n}\n\nfun KtExpression.isCallingExternalResourceCreators(): Boolean {\n    val callExpr = resolveToCall(BodyResolveMode.PARTIAL)?.resultingDescriptor ?: return false\n    return callExpr.hasSignature(EXTERNAL_RESOURCE_CREATE) || callExpr.hasSignature(TO_EXTERNAL_RESOURCE)\n}\n\nfun PsiExpression.isCallingExternalResourceCreators(): Boolean {\n    contract { returns() implies (this@isCallingExternalResourceCreators is PsiCallExpression) }\n    if (this !is PsiCallExpression) return false\n    val callee = resolveMethod() ?: return false\n    return callee.hasSignature(EXTERNAL_RESOURCE_CREATE)\n}\n\nprivate const val FAMILY_NAME = \"Mirai console\""
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/diagnostics/TaskUtils.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.console.intellij.diagnostics\n\nimport com.intellij.openapi.vfs.LocalFileSystem\nimport com.intellij.openapi.vfs.VfsUtil\nimport com.intellij.openapi.vfs.VirtualFile\nimport com.intellij.util.io.writeChild\nimport org.intellij.lang.annotations.Language\nimport java.nio.file.Path\n\nval Path.vfOrNull: VirtualFile?\n    get() = LocalFileSystem.getInstance().refreshAndFindFileByPath(this.toAbsolutePath().toString())\n\nval Path.vf: VirtualFile\n    get() = vfOrNull ?: error(\"Failed to resolve VirtualFile ${this.toAbsolutePath()}\")\n\nfun VirtualFile.readText(): String? =\n    if (this.exists() && !this.isDirectory) String(inputStream.use { it.readBytes() }) else null\n\nfun VirtualFile.readChildText(relative: String): String? = this.resolve(relative)?.readText()\n\nfun VirtualFile.resolve(relative: String): VirtualFile? = VfsUtil.findRelativeFile(\n    this,\n    *relative.replace('\\\\', '/').split('/').toTypedArray()\n)\n\n@PublishedApi\ninternal inline fun <T> computeDelegated(executor: (setter: (T) -> Unit) -> Unit): T {\n    var resultRef: T? = null\n    executor { resultRef = it }\n    @Suppress(\"UNCHECKED_CAST\")\n    return resultRef as T\n}\n\ninternal fun VirtualFile.writeChild(path: String, content: String): Path {\n    return toNioPath().writeChild(path, content)\n}\n\n@Language(\"RegExp\")\nconst val CLASS_NAME_PATTERN = \"[a-zA-Z]+[0-9a-zA-Z_]*\" // self written\n\n@Language(\"RegExp\")\nconst val PACKAGE_PATTERN = \"\"\"[a-zA-Z]+[0-9a-zA-Z_]*(\\.[a-zA-Z]+[0-9a-zA-Z_]*)*\"\"\"\n\n@Language(\"RegExp\")\nconst val QUALIFIED_CLASS_NAME_PATTERN = \"\"\"($PACKAGE_PATTERN\\.)?$CLASS_NAME_PATTERN\"\"\" // self written\n\nfun String.isValidQualifiedClassName(): Boolean = this matches Regex(QUALIFIED_CLASS_NAME_PATTERN)\nfun String.isValidPackageName(): Boolean = this matches Regex(PACKAGE_PATTERN)\nfun String.isValidSimpleClassName(): Boolean = this matches Regex(CLASS_NAME_PATTERN)\nfun String.adjustToClassName(): String? {\n    val result = buildString {\n        var doCapitalization = true\n\n        fun Char.isAllowed() = isLetterOrDigit() || this in \"_-\"\n\n        for (char in this@adjustToClassName) {\n            if (!char.isAllowed()) continue\n\n            if (doCapitalization) {\n                when {\n                    char.isDigit() -> {\n                        if (this.isEmpty()) append('_')\n                        append(char)\n                    }\n                    char.isLetter() -> append(char.uppercase())\n                    char == '-' -> append(\"_\")\n                    else -> append(char)\n                }\n                doCapitalization = false\n            } else {\n                if (char in \"_-\") {\n                    doCapitalization = true\n                } else {\n                    append(char)\n                }\n            }\n        }\n    }\n\n    if (result.isValidSimpleClassName()) return result\n\n    return null\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/diagnostics/UsingStringPlusMessageInspection.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.diagnostics\n\nimport com.intellij.codeInspection.ProblemHighlightType\nimport com.intellij.codeInspection.ProblemsHolder\nimport com.intellij.openapi.editor.Editor\nimport com.intellij.openapi.project.Project\nimport com.intellij.psi.PsiElement\nimport com.intellij.psi.PsiElementVisitor\nimport com.intellij.psi.PsiFile\nimport net.mamoe.mirai.console.intellij.resolve.*\nimport org.jetbrains.kotlin.idea.codeinsight.api.classic.inspections.AbstractKotlinInspection\nimport org.jetbrains.kotlin.idea.core.ShortenReferences\nimport org.jetbrains.kotlin.idea.inspections.KotlinUniversalQuickFix\nimport org.jetbrains.kotlin.idea.quickfix.KotlinCrossLanguageQuickFixAction\nimport org.jetbrains.kotlin.idea.references.mainReference\nimport org.jetbrains.kotlin.lexer.KtTokens\nimport org.jetbrains.kotlin.psi.*\nimport org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject\nimport org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForReceiver\nimport org.jetbrains.kotlin.psi.psiUtil.referenceExpression\nimport org.jetbrains.kotlin.resolve.calls.util.getCalleeExpressionIfAny\n\n/*\nprivate val bundle by lazy {\n    BundleUtil.loadLanguageBundle(PluginMainServiceNotConfiguredInspection::class.java.classLoader, \"messages.InspectionGadgetsBundle\")!!\n}*/\n\nclass UsingStringPlusMessageInspection : AbstractKotlinInspection() {\n    companion object {\n        const val DESCRIPTION = \"使用 String + Message 会导致 Message 被转换为 String 再相加\"\n        private const val MESSAGE_FQ_NAME_STR = \"net.mamoe.mirai.message.data.Message\"\n        private const val CONVERT_TO_PLAIN_TEXT = \"将 String 转换为 PlainText\"\n\n\n        fun KtReferenceExpression.isCallingStringPlus(): Boolean {\n            val callee = this.referenceExpression()?.mainReference?.resolve() ?: return false\n            if (callee !is KtNamedFunction) return false\n\n            val className = callee.containingClassOrObject?.fqName?.asString()\n            if (className != \"kotlin.String\") return false\n            if (callee.name != \"plus\") return false\n            return true\n        }\n    }\n\n    private class Visitor(\n        val holder: ProblemsHolder\n    ) : KtVisitorVoid() {\n        class BinaryExprFix(left: KtExpression) : ConvertToPlainTextFix<KtExpression>(left) {\n            override fun invokeImpl(project: Project, editor: Editor?, file: PsiFile) {\n                if (editor == null || file !is KtFile) return\n                val element = element ?: return\n\n                val referenceExpr = element.referenceExpression()\n                if (referenceExpr == null || element.parent is KtBinaryExpression) {\n                    // `+ operator`, e.g. `str + msg`\n                    // or\n                    // complex expressions, e.g. `str.toString().plus(msg)`, `\"\".also {  }.plus(msg)`\n                    val replaced =\n                        element.replace(KtPsiFactory(project).createExpression(\"net.mamoe.mirai.message.data.PlainText(${element.text})\"))\n                                as? KtElement ?: return\n                    ShortenReferences.DEFAULT.process(replaced)\n                    return\n                }\n\n                if (element is KtNameReferenceExpression) {\n                    val receiver = element.getQualifiedExpressionForReceiver() ?: return\n                    val replaced = receiver\n                        .replace(KtPsiFactory(project).createExpression(\"net.mamoe.mirai.message.data.PlainText(${receiver.text})\"))\n                            as? KtElement ?: return\n\n                    ShortenReferences.DEFAULT.process(replaced)\n                }\n            }\n        }\n\n        override fun visitBinaryExpression(binaryExpression: KtBinaryExpression) {\n            if (binaryExpression.operationToken != KtTokens.PLUS) return\n            if (binaryExpression.left?.getCalleeExpressionIfAny()?.typeFqName()?.toString() != \"kotlin.String\") return\n\n            val rightType = binaryExpression.right?.type() ?: return\n            if (!rightType.hasSuperType(MESSAGE_FQ_NAME_STR)) return\n\n            val left = binaryExpression.left ?: return\n\n            holder.registerProblem(\n                left,\n                DESCRIPTION,\n                ProblemHighlightType.WARNING,\n                BinaryExprFix(left)\n            )\n        }\n\n        override fun visitCallExpression(expression: KtCallExpression) {\n            if (!expression.isCallingStringPlus()) return\n            val argumentType = expression.valueArguments.singleOrNull()?.type() ?: return\n\n            if (!argumentType.hasSuperType(MESSAGE_FQ_NAME_STR)) return\n\n            val explicitReceiverExpr = expression.siblingDotReceiverExpression()\n            if (explicitReceiverExpr != null) {\n                holder.registerProblem(\n                    explicitReceiverExpr,\n                    DESCRIPTION,\n                    ProblemHighlightType.WARNING,\n                    LocalQuickFix(CONVERT_TO_PLAIN_TEXT, explicitReceiverExpr) {\n                        element.replaceExpressionAndShortenReferences(\"net.mamoe.mirai.message.data.PlainText(${element.text})\")\n                    }\n                )\n            } else {\n                val nameReferenceExpression =\n                    expression.findChild<KtNameReferenceExpression>() ?: expression.calleeExpression ?: expression\n                holder.registerProblem(\n                    nameReferenceExpression,\n                    DESCRIPTION,\n                    ProblemHighlightType.WARNING,\n                    LocalQuickFix(CONVERT_TO_PLAIN_TEXT, expression) {\n                        val callExpression = this.element.calleeExpression ?: return@LocalQuickFix\n                        val implicitReceiverText = this.element.implicitExpressionText() ?: return@LocalQuickFix\n\n                        this.element.replaceExpressionAndShortenReferences(\n                            \"net.mamoe.mirai.message.data.PlainText(${implicitReceiverText}).${callExpression.text}\"\n                        )\n                    }\n                )\n            }\n        }\n    }\n\n    override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor = Visitor(holder)\n\n    abstract class ConvertToPlainTextFix<T : PsiElement>(element: T) : KotlinCrossLanguageQuickFixAction<T>(element),\n        KotlinUniversalQuickFix {\n        @Suppress(\"DialogTitleCapitalization\")\n        override fun getFamilyName(): String = \"Mirai Console\"\n\n        @Suppress(\"DialogTitleCapitalization\")\n        override fun getText(): String = \"将 String 转换为 PlainText\"\n    }\n}\n\n\nfun KtElement.replaceExpressionAndShortenReferences(expression: String) {\n    val replaced = replace(KtPsiFactory(this.project).createExpression(expression)) as? KtElement ?: return\n    ShortenReferences.DEFAULT.process(replaced)\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/diagnostics/diagnosticsUtil.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.diagnostics\n\nimport com.intellij.psi.PsiElement\nimport net.mamoe.mirai.console.compiler.common.castOrNull\nimport net.mamoe.mirai.console.compiler.common.resolve.READ_ONLY_PLUGIN_DATA_FQ_NAME\nimport net.mamoe.mirai.console.intellij.resolve.getResolvedCall\nimport org.jetbrains.kotlin.descriptors.CallableDescriptor\nimport org.jetbrains.kotlin.diagnostics.Diagnostic\nimport org.jetbrains.kotlin.idea.base.psi.kotlinFqName\nimport org.jetbrains.kotlin.idea.references.mainReference\nimport org.jetbrains.kotlin.name.FqName\nimport org.jetbrains.kotlin.psi.KtElement\nimport org.jetbrains.kotlin.psi.KtTypeParameter\nimport org.jetbrains.kotlin.psi.KtTypeReference\nimport org.jetbrains.kotlin.psi.KtUserType\nimport org.jetbrains.kotlin.resolve.calls.model.ResolvedCall\nimport org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext\nimport org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull\nimport org.jetbrains.kotlin.resolve.descriptorUtil.getAllSuperClassifiers\nimport org.jetbrains.kotlin.types.KotlinType\nimport org.jetbrains.kotlinx.serialization.compiler.resolve.toClassDescriptor\n\nfun KotlinType.isSubtypeOfReadOnlyPluginData(): Boolean {\n    return this.toClassDescriptor?.getAllSuperClassifiers()\n        ?.any { it.fqNameOrNull() == READ_ONLY_PLUGIN_DATA_FQ_NAME } == true\n}\n\nfun DeclarationCheckerContext.report(diagnostic: Diagnostic) {\n    return this.trace.report(diagnostic)\n}\n\nval DeclarationCheckerContext.bindingContext get() = this.trace.bindingContext\n\nfun KtElement.getResolvedCall(\n    context: DeclarationCheckerContext,\n): ResolvedCall<out CallableDescriptor>? {\n    return this.getResolvedCall(context.bindingContext)\n}\n\nfun KtTypeReference.isReferencing(fqName: FqName): Boolean {\n    return resolveReferencedType()?.kotlinFqName == fqName\n}\n\nval KtTypeReference.referencedUserType: KtUserType? get() = this.typeElement.castOrNull()\n\nfun KtTypeReference.resolveReferencedType(): PsiElement? {\n    val resolved = referencedUserType?.referenceExpression?.mainReference?.resolve()\n    if (resolved is KtTypeParameter) {\n        val bound = resolved.extendsBound ?: return resolved\n        if (bound.name == resolved.name) return null // <C: C> bad type, avoid infinite run\n        return bound.resolveReferencedType()\n    }\n    return resolved\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/diagnostics/fix/AbuseYellowIntention.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.diagnostics.fix\n/*\n\nimport com.intellij.openapi.editor.Editor\nimport net.mamoe.mirai.console.intellij.resolve.resolveStringConstantValues\nimport org.jetbrains.kotlin.idea.intentions.SelfTargetingIntention\nimport org.jetbrains.kotlin.psi.KtPsiFactory\nimport org.jetbrains.kotlin.psi.KtStringTemplateExpression\n\n@Suppress(\"IntentionDescriptionNotFoundInspection\") //\nclass AbuseYellowIntention :\n    SelfTargetingIntention<KtStringTemplateExpression>(KtStringTemplateExpression::class.java, { \"Abuse yellow\" }, { \"Abuse yellow\" }) {\n    override fun applyTo(element: KtStringTemplateExpression, editor: Editor?) {\n        element.replace(KtPsiFactory(element).createExpression(\"\\\"弱智黄色\\\"\"))\n    }\n\n    override fun isApplicableTo(element: KtStringTemplateExpression, caretOffset: Int): Boolean {\n        return element.resolveStringConstantValues().firstOrNull() == \"黄色\"\n    }\n\n}*/"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/diagnostics/fix/AddSerializerFix.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.diagnostics.fix\n\nimport com.intellij.codeInsight.intention.IntentionAction\nimport com.intellij.openapi.editor.Editor\nimport com.intellij.openapi.project.Project\nimport com.intellij.psi.PsiFile\nimport net.mamoe.mirai.console.compiler.common.SERIALIZABLE_FQ_NAME\nimport net.mamoe.mirai.console.compiler.common.castOrNull\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors\nimport org.jetbrains.kotlin.descriptors.ClassDescriptor\nimport org.jetbrains.kotlin.diagnostics.Diagnostic\nimport org.jetbrains.kotlin.diagnostics.DiagnosticWithParameters1\nimport org.jetbrains.kotlin.idea.inspections.KotlinUniversalQuickFix\nimport org.jetbrains.kotlin.idea.quickfix.KotlinCrossLanguageQuickFixAction\nimport org.jetbrains.kotlin.idea.quickfix.KotlinSingleIntentionActionFactory\nimport org.jetbrains.kotlin.idea.util.addAnnotation\nimport org.jetbrains.kotlin.js.resolve.diagnostics.findPsi\nimport org.jetbrains.kotlin.psi.KtClassOrObject\nimport org.jetbrains.kotlin.psi.KtModifierListOwner\n\n/**\n * @see MiraiConsoleErrors.UNSERIALIZABLE_TYPE\n */\nclass AddSerializerFix(\n    element: KtClassOrObject,\n) : KotlinCrossLanguageQuickFixAction<KtModifierListOwner>(element), KotlinUniversalQuickFix {\n\n    override fun getFamilyName(): String = \"Mirai Console\"\n    override fun getText(): String = \"添加 @Serializable\"\n\n    override fun invokeImpl(project: Project, editor: Editor?, file: PsiFile) {\n        element?.addAnnotation(SERIALIZABLE_FQ_NAME) ?: return\n    }\n\n    companion object : KotlinSingleIntentionActionFactory() {\n        override fun createAction(diagnostic: Diagnostic): IntentionAction? {\n            val classDescriptor =\n                diagnostic.castOrNull<DiagnosticWithParameters1<*, *>>()?.a?.castOrNull<ClassDescriptor>()\n                    ?: return null\n            val ktClassOrObject = classDescriptor.findPsi()?.castOrNull<KtClassOrObject>() ?: return null\n            return AddSerializerFix(ktClassOrObject)\n        }\n\n        override fun isApplicableForCodeFragment(): Boolean = false\n    }\n}\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/diagnostics/fix/ConfigurePluginMainServiceFix.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.diagnostics.fix\n\nimport com.intellij.codeInspection.LocalQuickFix\nimport com.intellij.openapi.editor.Editor\nimport com.intellij.openapi.project.Project\nimport com.intellij.openapi.project.rootManager\nimport com.intellij.openapi.vfs.VfsUtil\nimport com.intellij.psi.PsiElement\nimport com.intellij.psi.PsiFile\nimport net.mamoe.mirai.console.intellij.diagnostics.readChildText\nimport net.mamoe.mirai.console.intellij.diagnostics.writeChild\nimport org.jetbrains.kotlin.idea.base.util.isAndroidModule\nimport org.jetbrains.kotlin.idea.base.util.module\nimport org.jetbrains.kotlin.idea.inspections.KotlinUniversalQuickFix\nimport org.jetbrains.kotlin.idea.quickfix.KotlinCrossLanguageQuickFixAction\nimport org.jetbrains.kotlin.idea.util.application.executeWriteCommand\n\n\nclass ConfigurePluginMainServiceFix(\n    element: PsiElement,\n    private val fqName: String,\n) : KotlinCrossLanguageQuickFixAction<PsiElement>(element), KotlinUniversalQuickFix, LocalQuickFix {\n\n    override fun getFamilyName(): String = \"Mirai Console\"\n    override fun getText(): String = \"配置插件主类服务\"\n\n    override fun invokeImpl(project: Project, editor: Editor?, file: PsiFile) {\n        val elementFqName = fqName\n        val sourceRoots = file.module?.rootManager?.sourceRoots ?: return\n\n        val sourceRoot = sourceRoots.find { it.name.endsWith(\"resources\") }\n            ?: sourceRoots.find { it.name.endsWith(\"res\") }\n            ?: sourceRoots.find { it.name.contains(\"resources\") }\n            ?: sourceRoots.find { it.name.contains(\"res\") }\n            ?: sourceRoots.last().run {\n                project.executeWriteCommand(name, groupId = null) {\n                    parent.createChildDirectory(\n                        this@ConfigurePluginMainServiceFix,\n                        if (file.module?.isAndroidModule() == true) \"res\" else \"resources\"\n                    )\n                }\n            }\n\n        project.executeWriteCommand(name) {\n            val filepath = \"META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin\"\n\n            fun computeContent(): String {\n                val origin = sourceRoot.readChildText(filepath) ?: \"\"\n                return when {\n                    origin.isBlank() -> elementFqName\n                    origin.endsWith(\"\\n\") -> origin + elementFqName\n                    else -> \"$origin\\n$elementFqName\"\n                }\n            }\n\n            sourceRoot.writeChild(filepath, computeContent())\n            VfsUtil.markDirtyAndRefresh(true, false, false, sourceRoot.findChild(filepath))\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/diagnostics/fix/ConvertToValFix.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.diagnostics.fix\n\nimport com.intellij.codeInsight.intention.IntentionAction\nimport com.intellij.openapi.editor.Editor\nimport com.intellij.openapi.project.Project\nimport com.intellij.psi.PsiElement\nimport com.intellij.psi.PsiFile\nimport net.mamoe.mirai.console.compiler.common.castOrNull\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors\nimport org.jetbrains.kotlin.diagnostics.Diagnostic\nimport org.jetbrains.kotlin.diagnostics.SimpleDiagnostic\nimport org.jetbrains.kotlin.idea.inspections.KotlinUniversalQuickFix\nimport org.jetbrains.kotlin.idea.quickfix.KotlinCrossLanguageQuickFixAction\nimport org.jetbrains.kotlin.idea.quickfix.KotlinSingleIntentionActionFactory\nimport org.jetbrains.kotlin.idea.util.application.executeWriteCommand\nimport org.jetbrains.kotlin.psi.KtPsiFactory\n\n/**\n * @see MiraiConsoleErrors.READ_ONLY_VALUE_CANNOT_BE_VAR\n */\nclass ConvertToValFix(\n    element: PsiElement,\n) : KotlinCrossLanguageQuickFixAction<PsiElement>(element), KotlinUniversalQuickFix {\n\n    override fun getFamilyName(): String = \"Mirai Console\"\n    override fun getText(): String = \"转换为 val\"\n\n    override fun invokeImpl(project: Project, editor: Editor?, file: PsiFile) {\n        val element = element ?: return\n        project.executeWriteCommand(name) {\n            element.replace(KtPsiFactory(project).createValKeyword())\n        }\n    }\n\n    companion object : KotlinSingleIntentionActionFactory() {\n        override fun createAction(diagnostic: Diagnostic): IntentionAction? {\n            val diagnostic1 = diagnostic.castOrNull<SimpleDiagnostic<PsiElement>>() ?: return null\n            return ConvertToValFix(diagnostic1.psiElement)\n        }\n\n        override fun isApplicableForCodeFragment(): Boolean = false\n    }\n}\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/diagnostics/fix/ProvideDefaultValueFix.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.diagnostics.fix\n\nimport com.intellij.codeInsight.intention.IntentionAction\nimport com.intellij.openapi.editor.Editor\nimport com.intellij.openapi.project.Project\nimport com.intellij.psi.PsiFile\nimport com.intellij.psi.SmartPointerManager\nimport com.intellij.psi.SmartPsiElementPointer\nimport net.mamoe.mirai.console.compiler.common.castOrNull\nimport net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors\nimport net.mamoe.mirai.console.intellij.resolve.findChild\nimport org.jetbrains.kotlin.diagnostics.Diagnostic\nimport org.jetbrains.kotlin.diagnostics.DiagnosticWithParameters2\nimport org.jetbrains.kotlin.idea.core.moveCaret\nimport org.jetbrains.kotlin.idea.inspections.KotlinUniversalQuickFix\nimport org.jetbrains.kotlin.idea.quickfix.KotlinCrossLanguageQuickFixAction\nimport org.jetbrains.kotlin.idea.quickfix.KotlinSingleIntentionActionFactory\nimport org.jetbrains.kotlin.idea.util.application.executeWriteCommand\nimport org.jetbrains.kotlin.psi.*\nimport org.jetbrains.kotlin.psi.psiUtil.endOffset\n\n/**\n * @see MiraiConsoleErrors.NOT_CONSTRUCTABLE_TYPE\n */\nclass ProvideDefaultValueFix(\n    element: KtCallExpression,\n    private val typeProjection: SmartPsiElementPointer<KtTypeProjection>,\n) : KotlinCrossLanguageQuickFixAction<KtCallExpression>(element), KotlinUniversalQuickFix {\n\n    override fun getFamilyName(): String = \"Mirai Console\"\n    override fun getText(): String = \"添加默认值\"\n\n    override fun invokeImpl(project: Project, editor: Editor?, file: PsiFile) {\n        val element = element ?: return\n        if (file !is KtFile) return\n\n\n        /*\n        val refereeFqName = element.resolve()?.getKotlinFqName() ?: return\n        val referee = file.resolveImportReference(refereeFqName).singleOrNull { it is ClassDescriptor } ?: return\n        ImportInsertHelper.getInstance(project).importDescriptor(file, referee)\n         */\n\n        val typeName =\n            typeProjection.element?.typeReference?.typeElement?.castOrNull<KtUserType>()?.referencedName ?: return\n        val argumentList = element.findChild<KtValueArgumentList>() ?: return\n        val offset = argumentList.leftParenthesis?.endOffset ?: return\n\n        project.executeWriteCommand(name) {\n            argumentList.addArgument(KtPsiFactory(project).createArgument(\"$typeName()\"))\n            editor?.moveCaret(offset + typeName.length + 1)\n        }\n    }\n\n    companion object : KotlinSingleIntentionActionFactory() {\n        override fun createAction(diagnostic: Diagnostic): IntentionAction? {\n            val diagnostic1 =\n                diagnostic.castOrNull<DiagnosticWithParameters2<KtTypeProjection, KtCallExpression, *>>() ?: return null\n            return ProvideDefaultValueFix(diagnostic1.a, SmartPointerManager.createPointer(diagnostic1.psiElement))\n        }\n\n        override fun isApplicableForCodeFragment(): Boolean = false\n    }\n}\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/diagnostics/fix/TypeProjectionFix.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.diagnostics.fix\n\nimport com.intellij.codeInsight.intention.IntentionAction\nimport com.intellij.openapi.editor.Editor\nimport com.intellij.openapi.project.Project\nimport com.intellij.psi.PsiFile\nimport org.jetbrains.kotlin.diagnostics.Diagnostic\nimport org.jetbrains.kotlin.idea.base.psi.replaced\nimport org.jetbrains.kotlin.idea.core.ShortenReferences\nimport org.jetbrains.kotlin.idea.inspections.KotlinUniversalQuickFix\nimport org.jetbrains.kotlin.idea.quickfix.KotlinCrossLanguageQuickFixAction\nimport org.jetbrains.kotlin.idea.quickfix.KotlinSingleIntentionActionFactory\nimport org.jetbrains.kotlin.psi.KtPsiFactory\nimport org.jetbrains.kotlin.psi.KtTypeProjection\n\nabstract class AbstractTypeProjectionFix(\n    element: KtTypeProjection,\n    private val newTypeFqn: String,\n) : KotlinCrossLanguageQuickFixAction<KtTypeProjection>(element), KotlinUniversalQuickFix {\n    override fun getFamilyName(): String = \"Mirai console\"\n    override fun getText(): String = \"转化为 ${newTypeFqn.substringAfterLast('.')}\"\n\n    override fun invokeImpl(project: Project, editor: Editor?, file: PsiFile) {\n        val element = element ?: return\n        val arguments = element.text.substringAfter('<', \"\")\n        val newTypeElement = KtPsiFactory(project).createTypeArgument(\n            if (arguments.isBlank()) {\n                newTypeFqn\n            } else \"$newTypeFqn<$arguments\"\n        )\n        val e = element.replaced(newTypeElement)\n        // ABI change\n        ShortenReferences.DEFAULT.process(e)\n    }\n}\n\nclass ConvertToMutableMapFix(\n    element: KtTypeProjection,\n) : AbstractTypeProjectionFix(element, \"kotlin.collections.MutableMap\") {\n    companion object : KotlinSingleIntentionActionFactory() {\n        override fun createAction(diagnostic: Diagnostic): IntentionAction? {\n            return ConvertToMutableMapFix(diagnostic.psiElement as? KtTypeProjection ?: return null)\n        }\n\n        override fun isApplicableForCodeFragment(): Boolean = false\n    }\n}\n\nclass ConvertToMapFix(\n    element: KtTypeProjection,\n) : AbstractTypeProjectionFix(element, \"kotlin.collections.Map\") {\n    companion object : KotlinSingleIntentionActionFactory() {\n        override fun createAction(diagnostic: Diagnostic): IntentionAction? {\n            return ConvertToMapFix(diagnostic.psiElement as? KtTypeProjection ?: return null)\n        }\n\n        override fun isApplicableForCodeFragment(): Boolean = false\n    }\n}\n\nclass ConvertToConcurrentMapFix(\n    element: KtTypeProjection,\n) : AbstractTypeProjectionFix(element, \"java.util.concurrent.ConcurrentHashMap\") {\n    companion object : KotlinSingleIntentionActionFactory() {\n        override fun createAction(diagnostic: Diagnostic): IntentionAction? {\n            return ConvertToConcurrentMapFix(diagnostic.psiElement as? KtTypeProjection ?: return null)\n        }\n\n        override fun isApplicableForCodeFragment(): Boolean = false\n    }\n}\n\nclass ConvertToListFix(\n    element: KtTypeProjection,\n) : AbstractTypeProjectionFix(element, \"kotlin.collections.List\") {\n    companion object : KotlinSingleIntentionActionFactory() {\n        override fun createAction(diagnostic: Diagnostic): IntentionAction? {\n            return ConvertToListFix(diagnostic.psiElement as? KtTypeProjection ?: return null)\n        }\n\n        override fun isApplicableForCodeFragment(): Boolean = false\n    }\n}\n\nclass ConvertToMutableListFix(\n    element: KtTypeProjection,\n) : AbstractTypeProjectionFix(element, \"kotlin.collections.MutableList\") {\n    companion object : KotlinSingleIntentionActionFactory() {\n        override fun createAction(diagnostic: Diagnostic): IntentionAction? {\n            return ConvertToListFix(diagnostic.psiElement as? KtTypeProjection ?: return null)\n        }\n\n        override fun isApplicableForCodeFragment(): Boolean = false\n    }\n}\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/diagnostics/fix/WrapWithResourceUseCallIntention.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.diagnostics.fix\n\nimport com.intellij.openapi.editor.Editor\nimport com.intellij.openapi.projectRoots.JavaSdkVersion\nimport com.intellij.openapi.projectRoots.JavaVersionService\nimport com.intellij.psi.PsiElement\nimport com.intellij.psi.PsiMethodCallExpression\nimport net.mamoe.mirai.console.intellij.diagnostics.ResourceNotClosedInspectionProcessors.KtExtensionProcessor.SEND_AS_IMAGE_TO\nimport net.mamoe.mirai.console.intellij.diagnostics.ResourceNotClosedInspectionProcessors.KtExtensionProcessor.UPLOAD_AS_IMAGE\nimport net.mamoe.mirai.console.intellij.diagnostics.replaceExpressionAndShortenReferences\nimport net.mamoe.mirai.console.intellij.diagnostics.resolveCalleeFunction\nimport net.mamoe.mirai.console.intellij.resolve.hasSignature\nimport org.jetbrains.kotlin.idea.base.util.module\nimport org.jetbrains.kotlin.idea.codeinsight.api.classic.intentions.SelfTargetingIntention\nimport org.jetbrains.kotlin.psi.KtDotQualifiedExpression\nimport org.jetbrains.kotlin.psi.KtSimpleNameExpression\nimport org.jetbrains.kotlin.psi.psiUtil.referenceExpression\n\n/**\n * @since 2.4\n */\nclass WrapWithResourceUseCallIntention :\n    SelfTargetingIntention<KtDotQualifiedExpression>(KtDotQualifiedExpression::class.java, { \"转换为 .use\" }) {\n    override fun applyTo(element: KtDotQualifiedExpression, editor: Editor?) {\n        val selectorExpression = element.selectorExpression ?: return\n        selectorExpression.replaceExpressionAndShortenReferences(\"use { it.${selectorExpression.text} }\")\n    }\n\n    override fun isApplicableTo(element: KtDotQualifiedExpression, caretOffset: Int): Boolean {\n        val callee = element.selectorExpression?.referenceExpression()?.resolveCalleeFunction() ?: return false\n        if (!callee.hasSignature(UPLOAD_AS_IMAGE) && !callee.hasSignature(SEND_AS_IMAGE_TO)) return false\n        val receiver = element.receiverExpression\n        return receiver is KtSimpleNameExpression\n    }\n}\n\n// https://github.com/mamoe/mirai-console/issues/284\n/**\n *\n * to be supported by 2.5\n * @since 2.4\n */\nclass WrapWithResourceUseCallJavaIntention :\n    SelfTargetingIntention<PsiMethodCallExpression>(PsiMethodCallExpression::class.java, { \"转换为 .use\" }) {\n    override fun applyTo(element: PsiMethodCallExpression, editor: Editor?) {\n        // val selectorExpression = element.methodExpression\n\n    }\n\n    override fun isApplicableTo(element: PsiMethodCallExpression, caretOffset: Int): Boolean {\n        return false\n        // if (!element.isJavaVersionAtLeast(JavaSdkVersion.JDK_1_9)) return false\n\n    }\n}\n\nfun PsiElement.isJavaVersionAtLeast(version: JavaSdkVersion): Boolean {\n    return this.module?.getService(JavaVersionService::class.java)?.isAtLeast(this, version) == true\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/line/marker/CommandDeclarationLineMarkerProvider.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.line.marker\n\nimport com.intellij.codeInsight.daemon.LineMarkerInfo\nimport com.intellij.codeInsight.daemon.LineMarkerProvider\nimport com.intellij.openapi.editor.markup.GutterIconRenderer\nimport com.intellij.psi.PsiElement\nimport com.intellij.psi.PsiMethod\nimport net.mamoe.mirai.console.intellij.assets.Icons\nimport net.mamoe.mirai.console.intellij.resolve.getElementForLineMark\nimport net.mamoe.mirai.console.intellij.resolve.isSimpleCommandHandlerOrCompositeCommandSubCommand\nimport net.mamoe.mirai.console.intellij.util.runIgnoringErrors\nimport org.jetbrains.kotlin.psi.KtNamedFunction\n\nclass CommandDeclarationLineMarkerProvider : LineMarkerProvider {\n    override fun getLineMarkerInfo(element: PsiElement): LineMarkerInfo<*>? {\n        when (element) {\n            is KtNamedFunction -> {\n                if (!element.isSimpleCommandHandlerOrCompositeCommandSubCommand()) return null\n\n                runIgnoringErrors { // not showing icons is better than throwing exception every time doing inspection\n                    return Info(getElementForLineMark(element.funKeyword ?: element.identifyingElement ?: element))\n                }\n            }\n            is PsiMethod -> {\n                if (!element.isSimpleCommandHandlerOrCompositeCommandSubCommand()) return null\n\n                runIgnoringErrors { // not showing icons is better than throwing exception every time doing inspection\n                    return Info(getElementForLineMark(element.identifyingElement ?: element))\n                }\n            }\n            else -> return null\n        }\n\n    }\n\n    class Info(callElement: PsiElement) : LineMarkerInfo<PsiElement>(\n        callElement,\n        callElement.textRange,\n        Icons.CommandDeclaration,\n        { \"子指令定义\" },\n        null,\n        GutterIconRenderer.Alignment.RIGHT,\n        { \"子指令定义\" }\n    )\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/line/marker/PluginMainLineMarkerProvider.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.line.marker\n\nimport com.intellij.codeInsight.daemon.LineMarkerInfo\nimport com.intellij.codeInsight.daemon.LineMarkerProvider\nimport com.intellij.openapi.editor.markup.GutterIconRenderer\nimport com.intellij.psi.PsiElement\nimport net.mamoe.mirai.console.compiler.common.resolve.PLUGIN_FQ_NAME\nimport net.mamoe.mirai.console.intellij.assets.Icons\nimport net.mamoe.mirai.console.intellij.resolve.allSuperNames\nimport net.mamoe.mirai.console.intellij.resolve.getElementForLineMark\nimport net.mamoe.mirai.console.intellij.util.runIgnoringErrors\n\nclass PluginMainLineMarkerProvider : LineMarkerProvider {\n    override fun getLineMarkerInfo(element: PsiElement): LineMarkerInfo<*>? {\n        runIgnoringErrors { // not showing icons is better than throwing exception every time doing inspection\n            if (element.allSuperNames.any { it == PLUGIN_FQ_NAME }) return Info(getElementForLineMark(element))\n        }\n\n        return null\n    }\n\n\n    class Info(callElement: PsiElement) : LineMarkerInfo<PsiElement>(\n        callElement,\n        callElement.textRange,\n        Icons.PluginMainDeclaration,\n        { \"Mirai Console Plugin\" },\n        null, GutterIconRenderer.Alignment.RIGHT,\n        { \"Mirai Console Plugin\" }\n    ) {\n    }\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/resolve/FunctionSignature.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.resolve\n\nimport com.intellij.psi.PsiMethod\nimport com.intellij.psi.PsiModifier\nimport net.mamoe.mirai.console.intellij.diagnostics.resolveReferencedType\nimport org.jetbrains.kotlin.asJava.elements.KtLightMethod\nimport org.jetbrains.kotlin.descriptors.CallableDescriptor\nimport org.jetbrains.kotlin.idea.base.psi.kotlinFqName\nimport org.jetbrains.kotlin.idea.caches.resolve.resolveToCall\nimport org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny\nimport org.jetbrains.kotlin.idea.quickfix.createFromUsage.callableBuilder.getReturnTypeReference\nimport org.jetbrains.kotlin.idea.refactoring.fqName.fqName\nimport org.jetbrains.kotlin.name.FqName\nimport org.jetbrains.kotlin.psi.KtDeclaration\nimport org.jetbrains.kotlin.psi.KtExpression\nimport org.jetbrains.kotlin.psi.KtFunction\nimport org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject\nimport org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe\nimport org.jetbrains.kotlin.resolve.lazy.BodyResolveMode\n\ninline fun FunctionSignature(builderAction: FunctionSignatureBuilder.() -> Unit): FunctionSignature {\n    return FunctionSignatureBuilder().apply(builderAction).build()\n}\n\ndata class FunctionSignature(\n    val name: String? = null,\n    val dispatchReceiver: FqName? = null,\n    val extensionReceiver: FqName? = null,\n    val parameters: List<FqName>? = null,\n    val returnType: FqName? = null,\n)\n\nclass FunctionSignatureBuilder {\n    private var name: String? = null\n    private var dispatchReceiver: FqName? = null\n    private var extensionReceiver: FqName? = null\n    private var parameters: List<FqName>? = null\n    private var returnType: FqName? = null\n\n    fun name(name: String) {\n        this.name = name\n    }\n\n    fun dispatchReceiver(dispatchReceiver: String) {\n        this.dispatchReceiver = FqName(dispatchReceiver)\n    }\n\n    fun extensionReceiver(extensionReceiver: String) {\n        this.extensionReceiver = FqName(extensionReceiver)\n    }\n\n    fun parameters(vararg parameters: String) {\n        this.parameters = parameters.map { FqName(it) }\n    }\n\n    fun returnType(returnType: String) {\n        this.returnType = FqName(returnType)\n    }\n\n    fun build(): FunctionSignature =\n        FunctionSignature(name, dispatchReceiver, extensionReceiver, parameters, returnType)\n}\n\nfun FunctionSignatureBuilder.dispatchReceiver(dispatchReceiver: FqName) {\n    dispatchReceiver(dispatchReceiver.toString())\n}\n\nfun FunctionSignatureBuilder.extensionReceiver(extensionReceiver: FqName) {\n    extensionReceiver(extensionReceiver.toString())\n}\n\n\nfun KtFunction.hasSignature(functionSignature: FunctionSignature): Boolean {\n    if (functionSignature.name != null) {\n        if (this.name != functionSignature.name) return false\n    }\n    if (functionSignature.dispatchReceiver != null) {\n        if (this.containingClassOrObject?.fqName != functionSignature.dispatchReceiver) return false\n    }\n    if (functionSignature.extensionReceiver != null) {\n        if (this.receiverTypeReference?.resolveReferencedType()\n                ?.kotlinFqName != functionSignature.extensionReceiver\n        ) return false\n    }\n    if (functionSignature.parameters != null) {\n        if (this.valueParameters.zip(functionSignature.parameters)\n                .any { it.first.type()?.fqName != it.second }\n        ) return false\n    }\n    if (functionSignature.returnType != null) {\n        if (this.getReturnTypeReference()?.resolveReferencedType()\n                ?.kotlinFqName != functionSignature.returnType\n        ) return false\n    }\n    return true\n}\n\nfun KtDeclaration.type() =\n    (resolveToDescriptorIfAny() as? CallableDescriptor)?.returnType\n\nfun PsiMethod.hasSignature(functionSignature: FunctionSignature): Boolean {\n    if (functionSignature.name != null) {\n        if (this.name != functionSignature.name) return false\n    }\n    val parameters = parameterList.parameters.toMutableList()\n    if (functionSignature.dispatchReceiver != null) {\n        val containingClass = this.containingClass ?: return false\n\n        val kotlinContainingClassFqn = if (this is KtLightMethod) {\n            if (this.modifierList.hasExplicitModifier(PsiModifier.STATIC)) {\n                this.containingClass.kotlinOrigin?.companionObjects?.firstOrNull()?.fqName\n            } else containingClass.kotlinFqName\n        } else containingClass.kotlinFqName\n\n        if (kotlinContainingClassFqn != functionSignature.dispatchReceiver) return false\n    }\n    if (functionSignature.extensionReceiver != null) {\n        val receiver = parameters.removeFirstOrNull() ?: return false\n        if (receiver.type.canonicalText != functionSignature.extensionReceiver.toString()) return false\n    }\n    if (functionSignature.parameters != null) {\n        if (parameters.zip(functionSignature.parameters)\n                .any { it.first.type.canonicalText != it.second.toString() }\n        ) return false\n    }\n    if (functionSignature.returnType != null) {\n        if (returnType?.canonicalText != functionSignature.returnType.toString()) return false\n    }\n    return true\n}\n\n\nfun KtExpression.isCalling(functionSignature: FunctionSignature): Boolean {\n    val descriptor = resolveToCall(BodyResolveMode.PARTIAL)?.resultingDescriptor ?: return false\n    return descriptor.hasSignature(functionSignature)\n}\n\nfun CallableDescriptor.hasSignature(functionSignature: FunctionSignature): Boolean {\n    if (functionSignature.name != null) {\n        if (this.name.toString() != functionSignature.name) return false\n    }\n    if (functionSignature.extensionReceiver != null) {\n        if (this.extensionReceiverParameter?.fqNameUnsafe != functionSignature.extensionReceiver.toUnsafe()) return false\n    }\n    if (functionSignature.dispatchReceiver != null) {\n        if (this.containingDeclaration.fqNameUnsafe != functionSignature.dispatchReceiver.toUnsafe()) return false\n    }\n    if (functionSignature.parameters != null) {\n        if (this.valueParameters.zip(functionSignature.parameters)\n                .any { it.first.type.fqName != it.second }\n        ) return false\n    }\n    if (functionSignature.returnType != null) {\n        if (this.returnType?.fqName != functionSignature.returnType) return false\n    }\n    return true\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/resolve/ReceiverExpression.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.resolve\n\nimport org.jetbrains.kotlin.idea.caches.resolve.analyze\nimport org.jetbrains.kotlin.idea.util.getFactoryForImplicitReceiverWithSubtypeOf\nimport org.jetbrains.kotlin.idea.util.getResolutionScope\nimport org.jetbrains.kotlin.psi.KtCallExpression\nimport org.jetbrains.kotlin.psi.KtDotQualifiedExpression\nimport org.jetbrains.kotlin.psi.KtExpression\nimport org.jetbrains.kotlin.psi.KtPsiFactory\n\nsealed class ReceiverExpression {\n    abstract val receiverExpression: KtExpression\n    abstract val receiverText: String\n\n    operator fun component1(): KtExpression = receiverExpression\n    operator fun component2(): String = receiverText\n\n    class Explicit(\n        override val receiverExpression: KtExpression\n    ) : ReceiverExpression() {\n        override val receiverText: String\n            get() = receiverExpression.text\n    }\n\n    class Implicit(\n        receiverExpression: Lazy<KtExpression>,\n        override val receiverText: String,\n    ) : ReceiverExpression() {\n        override val receiverExpression: KtExpression by receiverExpression\n    }\n}\n\nfun KtCallExpression.siblingDotReceiverExpression(): KtExpression? {\n    val dotQualifiedExpression = parent\n    if (dotQualifiedExpression is KtDotQualifiedExpression) {\n        return dotQualifiedExpression.receiverExpression\n    }\n    return null\n}\n\nfun KtExpression.dotReceiverExpression(): KtExpression? {\n    return if (this is KtDotQualifiedExpression) receiverExpression else null\n}\n\n/**\n * Find:\n * - explicit receiver: `a` for `a.foo()`\n * - implicit labeled receiver: `this@run` in `a.run { foo() }`\n *\n * @receiver identifier reference in a call. e.g. `foo` in `a.foo()` and `foo()`\n */\nfun KtExpression.receiverExpression(psiFactory: KtPsiFactory): ReceiverExpression? {\n    val dotQualifiedExpr = parent\n    if (dotQualifiedExpr is KtDotQualifiedExpression) {\n        return ReceiverExpression.Explicit(dotQualifiedExpr.receiverExpression)\n    } else {\n        val context = analyze()\n        val scope = getResolutionScope(context) ?: return null\n\n        val descriptor = getResolvedCall(context)?.resultingDescriptor ?: return null\n        val receiverDescriptor = descriptor.extensionReceiverParameter\n            ?: descriptor.dispatchReceiverParameter\n            ?: return null\n\n        val expressionFactory = scope.getFactoryForImplicitReceiverWithSubtypeOf(receiverDescriptor.type) ?: return null\n        val receiverText = if (expressionFactory.isImmediate) \"this\" else expressionFactory.expressionText\n        return ReceiverExpression.Implicit(lazy { expressionFactory.createExpression(psiFactory, true) }, receiverText)\n    }\n}\n\nfun KtExpression.implicitExpressionText(): String? {\n    val dotQualifiedExpr = parent\n    if (dotQualifiedExpr is KtDotQualifiedExpression) {\n        return null\n    } else {\n        val context = analyze()\n        val scope = getResolutionScope(context) ?: return null\n\n        val descriptor = getResolvedCall(context)?.resultingDescriptor ?: return null\n        val receiverDescriptor = descriptor.extensionReceiverParameter\n            ?: descriptor.dispatchReceiverParameter\n            ?: return null\n\n        val expressionFactory = scope.getFactoryForImplicitReceiverWithSubtypeOf(receiverDescriptor.type) ?: return null\n        return if (expressionFactory.isImmediate) \"this\" else expressionFactory.expressionText\n    }\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/resolve/resolveIdea.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.resolve\n\nimport com.intellij.openapi.project.Project\nimport com.intellij.psi.*\nimport net.mamoe.mirai.console.compiler.common.resolve.COMPOSITE_COMMAND_SUB_COMMAND_FQ_NAME\nimport net.mamoe.mirai.console.compiler.common.resolve.SIMPLE_COMMAND_HANDLER_COMMAND_FQ_NAME\nimport net.mamoe.mirai.console.compiler.common.resolve.findParent\nimport org.jetbrains.kotlin.descriptors.*\nimport org.jetbrains.kotlin.idea.base.psi.kotlinFqName\nimport org.jetbrains.kotlin.idea.caches.resolve.resolveToCall\nimport org.jetbrains.kotlin.idea.refactoring.fqName.fqName\nimport org.jetbrains.kotlin.idea.references.KtSimpleNameReference\nimport org.jetbrains.kotlin.idea.references.mainReference\nimport org.jetbrains.kotlin.idea.references.resolveToDescriptors\nimport org.jetbrains.kotlin.incremental.components.NoLookupLocation\nimport org.jetbrains.kotlin.name.FqName\nimport org.jetbrains.kotlin.name.Name\nimport org.jetbrains.kotlin.psi.*\nimport org.jetbrains.kotlin.psi.psiUtil.referenceExpression\nimport org.jetbrains.kotlin.resolve.BindingContext\nimport org.jetbrains.kotlin.resolve.calls.model.ResolvedCall\nimport org.jetbrains.kotlin.resolve.calls.util.getCall\nimport org.jetbrains.kotlin.resolve.calls.util.getResolvedCall\nimport org.jetbrains.kotlin.resolve.constants.ArrayValue\nimport org.jetbrains.kotlin.resolve.constants.ConstantValue\nimport org.jetbrains.kotlin.resolve.constants.StringValue\nimport org.jetbrains.kotlin.resolve.lazy.BodyResolveMode\nimport org.jetbrains.kotlin.types.KotlinType\nimport org.jetbrains.kotlin.types.TypeProjection\nimport org.jetbrains.kotlin.types.typeUtil.supertypes\nimport org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance\n\n\n/**\n * For CompositeCommand.SubCommand\n */\nfun KtNamedFunction.isCompositeCommandSubCommand(): Boolean = this.hasAnnotation(COMPOSITE_COMMAND_SUB_COMMAND_FQ_NAME)\nfun PsiModifierListOwner.isCompositeCommandSubCommand(): Boolean =\n    this.hasAnnotation(COMPOSITE_COMMAND_SUB_COMMAND_FQ_NAME)\n\ninternal fun PsiModifierListOwner.hasAnnotation(fqName: FqName): Boolean = this.hasAnnotation(fqName.asString())\n\n/**\n * SimpleCommand.Handler\n */\nfun KtNamedFunction.isSimpleCommandHandler(): Boolean = this.hasAnnotation(SIMPLE_COMMAND_HANDLER_COMMAND_FQ_NAME)\nfun PsiModifierListOwner.isSimpleCommandHandler(): Boolean = this.hasAnnotation(SIMPLE_COMMAND_HANDLER_COMMAND_FQ_NAME)\n\nfun KtNamedFunction.isSimpleCommandHandlerOrCompositeCommandSubCommand(): Boolean =\n    this.isSimpleCommandHandler() || this.isCompositeCommandSubCommand()\n\nfun PsiModifierListOwner.isSimpleCommandHandlerOrCompositeCommandSubCommand(): Boolean =\n    this.isSimpleCommandHandler() || this.isCompositeCommandSubCommand()\n\n\nval KtPureClassOrObject.allSuperTypes: Sequence<KtSuperTypeListEntry>\n    get() = sequence {\n        yieldAll(superTypeListEntries)\n        for (list in superTypeListEntries.asSequence()) {\n            yieldAll(\n                (list.typeAsUserType?.referenceExpression?.mainReference?.resolve()?.parents(true)\n                    ?.filterIsInstance<KtClass>()\n                    ?.firstOrNull())?.allSuperTypes.orEmpty()\n            )\n        }\n    }\n\nfun PsiElement.parents(withSelf: Boolean): Sequence<PsiElement> {\n    val seed = if (withSelf) this else parentWithoutWalkingDirectories(this)\n    return generateSequence(seed, ::parentWithoutWalkingDirectories)\n}\n\nprivate fun parentWithoutWalkingDirectories(element: PsiElement): PsiElement? {\n    return if (element is PsiFile) null else element.parent\n}\n\nval PsiClass.allSuperTypes: Sequence<PsiClass>\n    get() = sequence {\n        interfaces.forEach {\n            yield(it)\n            yieldAll(it.allSuperTypes)\n        }\n        val superClass = superClass\n        if (superClass != null) {\n            yield(superClass)\n            yieldAll(superClass.allSuperTypes)\n        }\n    }\n\nfun KtConstructorCalleeExpression.getTypeAsUserType(): KtUserType? {\n    val reference = typeReference\n    if (reference != null) {\n        val element = reference.typeElement\n        if (element is KtUserType) {\n            return element\n        }\n    }\n    return null\n}\n\nfun KotlinType.hasSuperType(fqName: String, includeSelf: Boolean = true): Boolean {\n    if (includeSelf && this.fqName?.asString() == fqName) return true\n    return this.supertypes().any { it.hasSuperType(\"net.mamoe.mirai.message.data.Message\", true) }\n}\n\nfun KtClassOrObject.hasSuperType(fqName: FqName): Boolean = allSuperNames.contains(fqName)\nfun KtClass.hasSuperType(fqName: FqName): Boolean = allSuperNames.contains(fqName)\n\n@Suppress(\"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\")\n@kotlin.internal.LowPriorityInOverloadResolution\nfun PsiElement.hasSuperType(fqName: FqName): Boolean = allSuperNames.contains(fqName)\n\nval KtClassOrObject.allSuperNames: Sequence<FqName> get() = allSuperTypes.mapNotNull { it.kotlinFqName }\nval PsiClass.allSuperNames: Sequence<FqName>\n    get() = allSuperTypes.mapNotNull { clazz ->\n        clazz.qualifiedName?.let {\n            FqName(\n                it\n            )\n        }\n    }\n\n@Suppress(\"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\")\n@kotlin.internal.LowPriorityInOverloadResolution\nval PsiElement.allSuperNames: Sequence<FqName>\n    get() {\n        return when (this) {\n            is KtClassOrObject -> allSuperNames\n            is PsiClass -> allSuperNames\n            else -> emptySequence()\n        }\n    }\n\nfun getElementForLineMark(callElement: PsiElement): PsiElement =\n    when (callElement) {\n        is KtSimpleNameExpression -> callElement.getReferencedNameElement()\n        else ->\n            // a fallback,\n            //but who knows what to reference in KtArrayAccessExpression ?\n            generateSequence(callElement, { it.firstChild }).last()\n    }\n\nval KtAnnotationEntry.annotationClass: KtClass?\n    get() = calleeExpression?.constructorReferenceExpression?.run {\n        try {\n            mainReference.resolve()\n        } catch (e: Exception) {\n            null // type inference with `by lazy {}` is unstable for now. I just ignore exceptions encountering with such issue.\n        }\n    }?.findParent<KtClass>()\n\nfun KtAnnotated.hasAnnotation(fqName: FqName): Boolean =\n    this.annotationEntries.any { it.annotationClass?.kotlinFqName == fqName }\n\nfun ValueArgument.resolveStringConstantValues(bindingContext: BindingContext): Sequence<String>? {\n    return this.getArgumentExpression()?.resolveStringConstantValues(bindingContext)\n}\n\nval PsiElement.allChildrenFlat: Sequence<PsiElement>\n    get() {\n        return sequence {\n            for (child in children) {\n                yield(child)\n                yieldAll(child.allChildrenFlat)\n            }\n        }\n    }\n\ninline fun <reified E> PsiElement.findChild(): E? = this.children.find { it is E } as E?\n\nfun KtValueArgument.type() = getArgumentExpression()?.referenceExpression()?.type()\nfun KtExpression.resultingDescriptor() = resolveToCall(BodyResolveMode.PARTIAL)?.resultingDescriptor\nfun KtExpression.type() = resultingDescriptor()?.returnType\nfun KtReferenceExpression.typeFqName() = type()?.fqName\nfun KtExpression.typeFqName() = referenceExpression()?.typeFqName()\n\nfun KtElement.getResolvedCall(\n    context: BindingContext,\n): ResolvedCall<out CallableDescriptor>? {\n    return this.getCall(context)?.getResolvedCall(context)\n}\n\nval ResolvedCall<out CallableDescriptor>.valueParameters: List<ValueParameterDescriptor> get() = this.resultingDescriptor.valueParameters\n\nval Project.psiElementFactory: PsiElementFactory?\n    get() = PsiElementFactory.getInstance(this)\n\nfun ConstantValue<*>.selfOrChildrenConstantStrings(): Sequence<String> {\n    return when (this) {\n        is StringValue -> sequenceOf(value)\n        is ArrayValue -> sequence {\n            yieldAll(this@selfOrChildrenConstantStrings.selfOrChildrenConstantStrings())\n        }\n\n        else -> emptySequence()\n    }\n}\n\nfun ClassDescriptor.findMemberFunction(name: Name, vararg typeProjection: TypeProjection): SimpleFunctionDescriptor? {\n    return getMemberScope(typeProjection.toList()).getContributedFunctions(name, NoLookupLocation.FROM_IDE)\n        .firstOrNull()\n}\n\nfun DeclarationDescriptor.companionObjectDescriptor(): ClassDescriptor? {\n    if (this !is ClassDescriptor) {\n        return null\n    }\n    return this.companionObjectDescriptor\n}\n\nfun KtExpression.resolveStringConstantValues(bindingContext: BindingContext): Sequence<String> {\n    when (this) {\n        is KtNameReferenceExpression -> {\n            when (val descriptor =\n                references.firstIsInstance<KtSimpleNameReference>().resolveToDescriptors(bindingContext)\n                    .singleOrNull()) {\n                is VariableDescriptor -> {\n                    val compileTimeConstant = descriptor.compileTimeInitializer ?: return emptySequence()\n                    return compileTimeConstant.selfOrChildrenConstantStrings()\n                }\n                //is PsiDeclarationStatement -> {\n                //    // TODO: 2020/9/18 compile-time constants from Java\n                //}\n            }\n        }\n\n        is KtStringTemplateExpression -> {\n            if (hasInterpolation()) return emptySequence()\n            return sequenceOf(entries.joinToString(\"\") { it.text })\n        }\n        /*\n        is KtCallExpression -> {\n            val callee = this.calleeExpression?.getResolvedCallOrResolveToCall(bindingContext)?.resultingDescriptor\n            if (callee is VariableDescriptor) {\n                val compileTimeConstant = callee.compileTimeInitializer ?: return null\n                return compileTimeConstant.castOrNull<StringValue>()?.value\n            }\n            return null\n        }*/\n        is KtConstantExpression -> {\n            // TODO: 2020/9/18  KtExpression.resolveStringConstantValue: KtConstantExpression\n        }\n    }\n    return emptySequence()\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/util/RequirementHelper.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.util\n\n@Suppress(\"RegExpRedundantEscape\")\nobject RequirementHelper {\n    private val directVersion = \"\"\"^[0-9]+(\\.[0-9]+)+(|[\\-+].+)$\"\"\".toRegex()\n    private val versionSelect = \"\"\"^[0-9]+(\\.[0-9]+)*\\.x$\"\"\".toRegex()\n    private val versionMathRange =\n        \"\"\"([\\[\\(])([0-9]+(\\.[0-9]+)+(|[\\-+].+))\\s*\\,\\s*([0-9]+(\\.[0-9]+)+(|[\\-+].+))([\\]\\)])\"\"\".toRegex()\n    private val versionRule = \"\"\"^((\\>\\=)|(\\<\\=)|(\\=)|(\\!\\=)|(\\>)|(\\<))\\s*([0-9]+(\\.[0-9]+)+(|[\\-+].+))$\"\"\".toRegex()\n\n    private val SEM_VERSION_REGEX =\n        \"\"\"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:\\.(0|[1-9]\\d*))?(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$\"\"\".toRegex()\n\n    fun isValid(rule: String): Boolean {\n        return rule.trim().let {\n            directVersion.matches(it) ||\n                    versionSelect.matches(it) ||\n                    versionMathRange.matches(it) ||\n                    versionRule.matches(it)\n        }\n    }\n\n    internal object RequirementChecker : RequirementParser.ProcessorBase<Unit>() {\n        override fun processLogic(isAnd: Boolean, chunks: Iterable<Unit>) {\n        }\n\n        override fun processString(reader: RequirementParser.TokenReader, token: RequirementParser.Token.Content) {\n            if (!isValid(token.content)) {\n                token.ia(reader, \"`${token.content}` 无效.\")\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/util/RequirementParser.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.util\n\nimport kotlin.math.max\nimport kotlin.math.min\n\ninternal class RequirementParser {\n    sealed class Token {\n        open var line: Int = -1\n        open var pos: Int = -1\n        open var sourcePos: Int = -1\n        open lateinit var content: String\n\n        sealed class GroupBod : Token() {\n            class Left : GroupBod() {\n                override var content: String\n                    get() = \"{\"\n                    set(_) {}\n            }\n\n            class Right : GroupBod() {\n                override var content: String\n                    get() = \"}\"\n                    set(_) {}\n            }\n        }\n\n        sealed class Logic : Token() {\n            class And : Logic() {\n                override var content: String\n                    get() = \"&&\"\n                    set(_) {}\n            }\n\n            class Or : Logic() {\n                override var content: String\n                    get() = \"||\"\n                    set(_) {}\n            }\n        }\n\n        class Content : Token()\n        class Ending : Token() {\n            override var content: String\n                get() = \"\"\n                set(_) {}\n        }\n\n        object Begin : Token() {\n            override var content: String\n                get() = \"\"\n                set(_) {}\n            override var line: Int\n                get() = 0\n                set(_) {}\n            override var pos: Int\n                get() = 0\n                set(_) {}\n            override var sourcePos: Int\n                get() = 0\n                set(_) {}\n        }\n\n        override fun toString(): String {\n            return javaClass.canonicalName.substringAfterLast('.') + \" - $content [$line, $pos]\"\n        }\n    }\n\n    companion object {\n        const val END = '\\u0000'\n    }\n\n    class TokenReader(\n        @JvmField val content: String\n    ) {\n        @JvmField\n        var pos: Int = 0\n\n        @JvmField\n        var line: Int = 0\n\n        @JvmField\n        var posi: Int = 0\n\n        @JvmField\n        var latestToken: Token = Token.Begin\n\n        @JvmField\n        var insertToken: Token? = Token.Begin\n        fun peekChar(): Char {\n            if (pos < content.length)\n                return content[pos]\n            return END\n        }\n\n        fun peekNextChar(): Char {\n            if (pos + 1 < content.length)\n                return content[pos + 1]\n            return END\n        }\n\n        fun nextChar(): Char {\n            val char = peekChar()\n            pos++\n            if (char == '\\n') {\n                line++\n                posi = 0\n            } else {\n                posi++\n            }\n            return char\n        }\n\n        fun nextToken(): Token {\n            insertToken?.let { insertToken = null; return it }\n            return nextToken0().also { latestToken = it }\n        }\n\n        private fun nextToken0(): Token {\n            if (pos < content.length) {\n                while (peekChar().isWhitespace()) {\n                    nextChar()\n                }\n                val startIndex = pos\n                if (startIndex >= content.length) {\n                    return Token.Ending().also {\n                        it.line = line\n                        it.pos = posi\n                        it.sourcePos = content.length\n                    }\n                }\n                val pline = line\n                val ppos = posi\n                nextChar()\n                when (content[startIndex]) {\n                    '&' -> {\n                        if (peekChar() == '&') {\n                            return Token.Logic.And().also {\n                                it.pos = ppos\n                                it.line = pline\n                                it.sourcePos = startIndex\n                                nextChar()\n                            }\n                        }\n                    }\n                    '|' -> {\n                        if (peekChar() == '|') {\n                            return Token.Logic.Or().also {\n                                nextChar()\n                                it.pos = ppos\n                                it.line = pline\n                                it.sourcePos = startIndex\n                            }\n                        }\n                    }\n                    '{' -> {\n                        return Token.GroupBod.Left().also {\n                            it.pos = ppos\n                            it.line = pline\n                            it.sourcePos = startIndex\n                        }\n                    }\n                    '}' -> {\n                        return Token.GroupBod.Right().also {\n                            it.pos = ppos\n                            it.line = pline\n                            it.sourcePos = startIndex\n                        }\n                    }\n                }\n                while (true) {\n                    when (val c = peekChar()) {\n                        '&', '|' -> {\n                            if (c == peekNextChar()) {\n                                break\n                            }\n                            nextChar()\n                        }\n                        '{', '}' -> {\n                            break\n                        }\n                        END -> break\n                        else -> nextChar()\n                    }\n                }\n                val endIndex = pos\n                return Token.Content().also {\n                    it.content = content.substring(startIndex, endIndex)\n                    it.pos = ppos\n                    it.line = pline\n                    it.sourcePos = startIndex\n                }\n            }\n            return Token.Ending().also {\n                it.line = line\n                it.pos = posi\n                it.sourcePos = content.length\n            }\n        }\n    }\n\n    interface TokensProcessor<R> {\n        fun process(reader: TokenReader): R\n        fun processLine(reader: TokenReader): R\n        fun processLogic(isAnd: Boolean, chunks: Iterable<R>): R\n    }\n\n    abstract class ProcessorBase<R> : TokensProcessor<R> {\n        fun Token.ia(reader: TokenReader, msg: String, cause: Throwable? = null): Nothing {\n            throw IllegalArgumentException(\"$msg (at [$line, $pos], ${cutSource(reader, sourcePos)})\", cause)\n        }\n\n        fun cutSource(reader: TokenReader, index: Int): String {\n            val content = reader.content\n            val s = max(0, index - 10)\n            val e = min(content.length, index + 10)\n            return content.substring(s, e)\n        }\n\n        override fun process(reader: TokenReader): R {\n            return when (val nextToken = reader.nextToken()) {\n                is Token.Begin,\n                is Token.GroupBod.Left -> {\n                    val first = when (val next = reader.nextToken()) {\n                        is Token.Content -> {\n                            processString(reader, next)\n                        }\n                        is Token.GroupBod.Right -> {\n                            nextToken.ia(\n                                reader, if (nextToken is Token.Begin)\n                                    \"无效的关键字 `}`\"\n                                else \"空规则组\"\n                            )\n                        }\n                        is Token.Logic -> {\n                            nextToken.ia(reader, \"规则不允许以逻辑操作符开始\")\n                        }\n                        is Token.Ending -> {\n                            nextToken.ia(\n                                reader, if (nextToken is Token.Begin)\n                                    \"规则为空\"\n                                else \"需要更多内容\"\n                            )\n                        }\n                        is Token.GroupBod.Left -> {\n                            reader.insertToken = next\n                            process(reader)\n                        }\n                        else -> {\n                            next.ia(reader, \"Bad token $next\")\n                        }\n                    }\n                    // null -> not set\n                    // true -> AND mode\n                    // false-> OR mode\n                    var mode: Boolean? = null\n                    val chunks = arrayListOf(first)\n                    while (true) {\n                        when (val next = reader.nextToken()) {\n                            is Token.Ending,\n                            is Token.GroupBod.Right -> {\n                                val isEndingOfGroup = next is Token.GroupBod.Right\n                                val isStartingOfGroup = nextToken is Token.GroupBod.Left\n                                if (isStartingOfGroup != isEndingOfGroup) {\n                                    fun getType(type: Boolean) = if (type) \"`}`\" else \"<结束>\"\n                                    next.ia(\n                                        reader,\n                                        \"需要 ${getType(isStartingOfGroup)}, 但是找到了 ${getType(isEndingOfGroup)}\"\n                                    )\n                                } else {\n                                    // reader.insertToken = next\n                                    break\n                                }\n                            }\n                            is Token.Logic -> {\n                                val stx = next is Token.Logic.And\n                                if (mode == null) mode = stx\n                                else if (mode != stx) {\n                                    fun getMode(type: Boolean) = if (type) \"`&&`\" else \"`||`\"\n                                    next.ia(\n                                        reader, \"为了避免语义混乱, 不允许在一层规则组混合使用 `&&` 和 `||`, 请显式使用 `{}` 分离. \" +\n                                                \"需要 ${getMode(mode)}, 但是找到了 ${getMode(stx)}\"\n                                    )\n                                }\n                                chunks.add(process(reader))\n                            }\n                            else -> {\n                                next.ia(\n                                    reader, \"Except ${\n                                        when (mode) {\n                                            null -> \"`&&` or `||`\"\n                                            true -> \"`&&`\"\n                                            false -> \"`||`\"\n                                        }\n                                    } but get `${next.content}`\"\n                                )\n                            }\n                        }\n                    }\n                    if (mode == null) {\n                        first\n                    } else {\n                        processLogic(mode, chunks)\n                    }\n                }\n                is Token.Content -> {\n                    processString(reader, nextToken)\n                }\n                is Token.Ending -> {\n                    nextToken.ia(reader, \"需要更多值.\")\n                }\n                else -> {\n                    nextToken.ia(reader, \"Assert Error: $nextToken\")\n                }\n            }\n        }\n\n        abstract fun processString(reader: TokenReader, token: Token.Content): R\n\n\n        override fun processLine(reader: TokenReader): R {\n            return process(reader).also {\n                val tok = reader.nextToken()\n                if (reader.nextToken() !is Token.Ending) {\n                    tok.ia(reader, \"Token Reader 未完成解析\")\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/util/RunIgnoringErrors.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.util\n\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\n\ninternal val DEBUG_ENABLED = System.getenv(\"mirai.console.intellij.debug\") == \"true\"\n\ninternal inline fun runIgnoringErrors(\n    block: () -> Unit\n) {\n    contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }\n    try {\n        block()\n    } catch (e: Error) {\n        // ignored\n    }\n}\n\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n@kotlin.internal.LowPriorityInOverloadResolution\ninternal inline fun <R> R.runIgnoringErrors(\n    block: R.() -> Unit\n) {\n    contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }\n    try {\n        block()\n    } catch (e: Error) {\n        // ignored\n    }\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/wizard/BuildSystemType.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.wizard\n\nenum class BuildSystemType {\n    GradleKt {\n        override fun createBuildSystem(model: MiraiProjectModel): ProjectCreator =\n            GradleKotlinProjectCreator(model)\n\n        override fun toString(): String = \"Gradle Kotlin DSL\"\n    },\n    GradleGroovy {\n        override fun createBuildSystem(model: MiraiProjectModel): ProjectCreator =\n            GradleGroovyProjectCreator(model)\n\n        override fun toString(): String = \"Gradle Groovy DSL\"\n    }, ;\n\n    abstract fun createBuildSystem(model: MiraiProjectModel): ProjectCreator\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/wizard/KotlinStdlibVersion.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.console.intellij.wizard\n\nimport org.jetbrains.kotlin.tools.projectWizard.Versions\nimport org.jsoup.Jsoup\nimport org.jsoup.nodes.Document\nimport java.io.IOException\n\ntypealias KotlinStdlibVersion = String\n\nobject KotlinStdlibVersionFetcher {\n    @Throws(IOException::class)\n    fun getKotlinStdlibVersion(miraiVersion: MiraiVersion): KotlinStdlibVersion {\n        fun download(url: String): Document {\n            return Jsoup.connect(url)\n                .followRedirects(true)\n                .ignoreContentType(true)\n                .ignoreHttpErrors(true)\n                .get()\n        }\n\n        val path = \"net/mamoe/mirai-core/$miraiVersion/mirai-core-$miraiVersion.pom\"\n        return kotlin.runCatching {\n            download(\"https://maven.aliyun.com/repository/central/$path\")\n        }.recoverCatching {\n            download(\"https://repo.maven.apache.org/maven2/$path\")\n        }.map { document ->\n            val xml = document.toString()\n\n            Regex(\"\"\"<artifactid>\\s*kotlin-stdlib-[A-Za-z0-9-]+\\s*</artifactid>\\s*<version>\\s*(.*?)\\s*</version>\"\"\")\n                .findAll(xml)\n                .mapNotNull {\n                    it.groupValues.getOrNull(1)\n                }\n                .firstOrNull() ?: Versions.KOTLIN.text\n        }.getOrThrow()\n    }\n}\n\n/*\n\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <!-- This module was also published with a richer model, Gradle metadata,  -->\n  <!-- which should be used instead. Do not delete the following line which  -->\n  <!-- is to indicate to Gradle or any Gradle module metadata file consumer  -->\n  <!-- that they should prefer consuming it instead. -->\n  <!-- do_not_remove: published-with-gradle-metadata -->\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>net.mamoe</groupId>\n  <artifactId>mirai-core</artifactId>\n  <version>2.12.2</version>\n  <packaging>pom</packaging>\n  <licenses>\n    <license>\n      <name>GNU AGPLv3</name>\n      <url>https://github.com/mamoe/mirai/blob/master/LICENSE</url>\n    </license>\n  </licenses>\n  <developers>\n    <developer>\n      <id>mamoe</id>\n      <name>Mamoe Technologies</name>\n      <email>support@mamoe.net</email>\n    </developer>\n  </developers>\n  <scm>\n    <connection>scm:https://github.com/mamoe/mirai.git</connection>\n    <developerConnection>scm:git://github.com/mamoe/mirai.git</developerConnection>\n    <url>https://github.com/mamoe/mirai</url>\n  </scm>\n  <dependencies>\n    <dependency>\n      <groupId>net.mamoe</groupId>\n      <artifactId>mirai-core-api</artifactId>\n      <version>2.12.2</version>\n      <scope>runtime</scope>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlinx</groupId>\n      <artifactId>kotlinx-serialization-core-jvm</artifactId>\n      <version>1.3.2</version>\n      <scope>runtime</scope>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlinx</groupId>\n      <artifactId>kotlinx-serialization-json-jvm</artifactId>\n      <version>1.3.2</version>\n      <scope>runtime</scope>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlinx</groupId>\n      <artifactId>kotlinx-coroutines-core-jvm</artifactId>\n      <version>1.6.1</version>\n      <scope>runtime</scope>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-stdlib-jdk8</artifactId>\n      <version>1.6.21</version>\n      <scope>runtime</scope>\n    </dependency>\n  </dependencies>\n  <description>Mirai Protocol implementation for QQ Android</description>\n  <name>mirai-core</name>\n  <url>https://github.com/mamoe/mirai</url>\n</project>\n\n */\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/wizard/LanguageType.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.wizard\n\nimport com.intellij.ide.fileTemplates.FileTemplate\nimport net.mamoe.mirai.console.intellij.assets.FT\n\ndata class NamedFile(\n    val path: String,\n    val template: FileTemplate\n)\n\ninterface ILanguageType {\n    val sourceSetDirName: String\n    fun pluginMainClassFile(creator: ProjectCreator): NamedFile\n}\n\nsealed class LanguageType : ILanguageType {\n    @Suppress(\"UNCHECKED_CAST\")\n    fun <T : String?> escapeString(string: T): T {\n        string ?: return null as T\n        return string\n            .replace(\"\\\\\", \"\\\\\\\\\")\n            .replace(\"\\n\", \"\\\\n\")\n            .replace(\"\\\"\", \"\\\\\\\"\") as T\n    }\n\n    abstract fun <T : String?> escapeRawString(string: T): T\n\n    companion object {\n        fun values() = arrayOf(Kotlin, Java)\n    }\n\n    object Kotlin : LanguageType() {\n        override fun toString(): String = \"Kotlin\" // display in UI\n        override val sourceSetDirName: String get() = \"kotlin\"\n        override fun pluginMainClassFile(creator: ProjectCreator): NamedFile = creator.model.run {\n            return NamedFile(\n                path = \"src/main/kotlin/$mainClassSimpleName.kt\",\n                template = creator.getTemplate(FT.PluginMainKt)\n            )\n        }\n\n        @Suppress(\"UNCHECKED_CAST\")\n        override fun <T : String?> escapeRawString(string: T): T {\n            string ?: return null as T\n            return string.replace(\"$\", \"\\${'\\$'}\").replace(\"\\n\", \"\\\\n\") as T\n        }\n    }\n\n    object Java : LanguageType() {\n        override fun toString(): String = \"Java\" // display in UI\n        override val sourceSetDirName: String get() = \"java\"\n        override fun pluginMainClassFile(creator: ProjectCreator): NamedFile = creator.model.run {\n            return NamedFile(\n                path = \"src/main/java/${packageName.replace('.', '/')}/$mainClassSimpleName.java\",\n                template = creator.getTemplate(FT.PluginMainJava)\n            )\n        }\n\n        override fun <T : String?> escapeRawString(string: T): T = escapeString(string)\n    }\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/wizard/MiraiModuleBuilder.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.console.intellij.wizard\n\nimport com.intellij.ide.fileTemplates.FileTemplateManager\nimport com.intellij.ide.starters.local.*\nimport com.intellij.ide.starters.local.wizard.StarterInitialStep\nimport com.intellij.ide.starters.shared.*\nimport com.intellij.ide.util.projectWizard.ModuleWizardStep\nimport com.intellij.ide.util.projectWizard.WizardContext\nimport com.intellij.openapi.module.Module\nimport com.intellij.openapi.project.ProjectManager\nimport com.intellij.openapi.roots.ui.configuration.ModulesProvider\nimport com.intellij.openapi.util.Key\nimport com.intellij.pom.java.LanguageLevel\nimport com.intellij.util.lang.JavaVersion\nimport net.mamoe.mirai.console.intellij.assets.FT\nimport net.mamoe.mirai.console.intellij.assets.Icons\n\nclass MiraiModuleBuilder : StarterModuleBuilder() {\n    companion object {\n        val MIRAI_PROJECT_MODEL_KEY = Key.create<MiraiProjectModel>(\"mirai.project.model\")\n\n        val GRADLE_GROOVY_PROJECT: StarterProjectType = StarterProjectType(\"gradleGroovy\", \"Gradle Groovy DSL\")\n        val GRADLE_KTS_PROJECT: StarterProjectType = StarterProjectType(\"gradleKts\", \"Gradle Kotlin DSL\")\n    }\n\n    override fun getBuilderId() = \"MiraiModuleBuilder\"\n    override fun getPresentableName() = MiraiProjectWizardBundle.message(\"module.presentation.name\")\n    override fun getWeight() = KOTLIN_WEIGHT - 2\n    override fun getNodeIcon() = Icons.MainIcon\n    override fun getDescription(): String = MiraiProjectWizardBundle.message(\"module.description\")\n\n    override fun getProjectTypes(): List<StarterProjectType> = listOf(GRADLE_GROOVY_PROJECT, GRADLE_KTS_PROJECT)\n    override fun getTestFrameworks(): List<StarterTestRunner> = listOf(JUNIT_TEST_RUNNER)\n    override fun getMinJavaVersion(): JavaVersion = LanguageLevel.JDK_1_8.toJavaVersion()\n\n    override fun getStarterPack(): StarterPack {\n        return StarterPack(\n            \"mirai\", listOf(\n                Starter(\"mirai\", \"Mirai Console\", getDependencyConfig(\"/starters/compose.pom\"), emptyList())\n            )\n        )\n    }\n\n    override fun getLanguages(): List<StarterLanguage> = listOf(JAVA_STARTER_LANGUAGE, KOTLIN_STARTER_LANGUAGE)\n\n\n    override fun createWizardSteps(\n        context: WizardContext,\n        modulesProvider: ModulesProvider\n    ): Array<ModuleWizardStep> = emptyArray()\n\n    override fun createOptionsStep(contextProvider: StarterContextProvider): StarterInitialStep {\n        return MiraiProjectWizardInitialStep(contextProvider)\n    }\n\n    override fun setupModule(module: Module) {\n        // manually set, we do not show the second page with libraries\n        starterContext.starter = starterContext.starterPack.starters.first()\n        starterContext.starterDependencyConfig = loadDependencyConfig()[starterContext.starter?.id]\n\n        super.setupModule(module)\n    }\n\n    override fun getTemplateProperties(): Map<String, Any> {\n        val model = starterContext.getUserData(MIRAI_PROJECT_MODEL_KEY)!!\n        model.run {\n            val projectCoordinates = projectCoordinates\n            val pluginCoordinates = pluginCoordinates\n            return mapOf<String, Any>(\n                \"KOTLIN_VERSION\" to kotlinVersion,\n                \"MIRAI_VERSION\" to miraiVersion,\n                \"GROUP_ID\" to projectCoordinates.groupId,\n                \"VERSION\" to projectCoordinates.version,\n                \"PROJECT_NAME\" to starterContext,\n                \"USE_PROXY_REPO\" to useProxyRepo,\n                \"ARTIFACT_ID\" to projectCoordinates.artifactId,\n                \"MODULE_NAME\" to projectCoordinates.moduleName,\n\n                \"PLUGIN_ID\" to pluginCoordinates.id,\n                \"PLUGIN_NAME\" to languageType.escapeString(pluginCoordinates.name),\n                \"PLUGIN_AUTHOR\" to languageType.escapeString(pluginCoordinates.author),\n                \"PLUGIN_INFO\" to languageType.escapeRawString(pluginCoordinates.info),\n                \"PLUGIN_DEPENDS_ON\" to pluginCoordinates.dependsOn,\n                \"PLUGIN_VERSION\" to projectCoordinates.version,\n\n                \"PACKAGE_NAME\" to packageName,\n                \"CLASS_NAME\" to mainClassSimpleName,\n\n                \"LANGUAGE_TYPE\" to languageType.toString(),\n            )\n        }\n    }\n\n    override fun getAssets(starter: Starter): List<GeneratorAsset> {\n        val ftManager = FileTemplateManager.getInstance(ProjectManager.getInstance().defaultProject)\n        val assets = mutableListOf<GeneratorAsset>()\n\n        val model = starterContext.getUserData(MIRAI_PROJECT_MODEL_KEY)!!\n\n        val standardAssetsProvider = StandardAssetsProvider()\n        assets.add(GeneratorTemplateFile(\n            standardAssetsProvider.gradleWrapperPropertiesLocation,\n            ftManager.getCodeTemplate(FT.GradleWrapperProperties)\n        ))\n        assets.addAll(standardAssetsProvider.getGradlewAssets())\n\n        model.buildSystemType.createBuildSystem(model)\n            .collectAssets { assets.add(it) }\n\n        assets.add(\n            GeneratorTemplateFile(\n                \"src/main/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin\",\n                ftManager.getCodeTemplate(FT.PluginMainService)\n            )\n        )\n\n        assets.add(GeneratorEmptyDirectory(\"debug-sandbox\"))\n        assets.add(GeneratorEmptyDirectory(\"debug-sandbox/plugins\"))\n        assets.add(GeneratorEmptyDirectory(\"debug-sandbox/data\"))\n        assets.add(GeneratorEmptyDirectory(\"debug-sandbox/config\"))\n        assets.add(\n            GeneratorTemplateFile(\n                \"debug-sandbox/account.properties\",\n                ftManager.getCodeTemplate(FT.AccountProperties)\n            )\n        )\n\n        assets.add(GeneratorTemplateFile(\".run/RunTerminal.run.xml\", ftManager.getCodeTemplate(FT.RunTerminalRun)))\n\n        return assets\n    }\n\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/wizard/MiraiModuleType.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.console.intellij.wizard\n\nimport com.intellij.openapi.module.ModuleType\nimport com.intellij.openapi.module.ModuleTypeManager\nimport net.mamoe.mirai.console.intellij.assets.Icons\n\nclass MiraiModuleType : ModuleType<MiraiModuleBuilder>(\"MIRAI_CONSOLE_PLUGIN_MODULE\") {\n    override fun createModuleBuilder() = MiraiModuleBuilder()\n    override fun getIcon() = Icons.MainIcon\n    override fun getNodeIcon(isOpened: Boolean) = Icons.MainIcon\n    override fun getName() = NAME\n    override fun getDescription() =\n        \"Modules used for developing plugins for <b>Mirai Console</b>\"\n\n    companion object {\n        private const val ID = \"MIRAI_CONSOLE_PLUGIN_MODULE\"\n        const val NAME = \"Mirai\"\n\n        val instance: MiraiModuleType\n            get() = ModuleTypeManager.getInstance().findByID(ID) as MiraiModuleType\n    }\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/wizard/MiraiProjectModel.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.console.intellij.wizard\n\nimport net.mamoe.mirai.console.intellij.diagnostics.adjustToClassName\nimport kotlin.contracts.contract\n\ndata class ProjectCoordinates(\n    val groupId: String, // already checked by pattern\n    val artifactId: String,\n    val version: String,\n    val moduleName: String\n) {\n    val packageName: String get() = groupId\n}\n\ndata class PluginCoordinates(\n    val id: String,\n    val name: String,\n    val author: String,\n    val info: String,\n    val dependsOn: String,\n)\n\nclass MiraiProjectModel(\n    val projectCoordinates: ProjectCoordinates,\n    val pluginCoordinates: PluginCoordinates,\n    val miraiVersion: String,\n    val kotlinVersion: String,\n\n    val buildSystemType: BuildSystemType,\n    val languageType: LanguageType,\n    val useProxyRepo: Boolean,\n\n    val mainClassSimpleName: String = pluginCoordinates.run {\n        name.adjustToClassName() ?: id.substringAfterLast('.').adjustToClassName()\n    } ?: \"PluginMain\",\n    val packageName: String = projectCoordinates.checkNotNull(\"projectCoordinates\").groupId,\n)\n\nfun <T : Any> T?.checkNotNull(name: String): T {\n    contract {\n        returns() implies (this@checkNotNull != null)\n    }\n    checkNotNull(this) {\n        \"$name is not yet initialized.\"\n    }\n    return this\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/wizard/MiraiProjectWizardInitialStep.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.wizard\n\nimport com.intellij.ide.starters.local.StarterContextProvider\nimport com.intellij.ide.starters.local.wizard.StarterInitialStep\nimport com.intellij.ide.starters.shared.JAVA_STARTER_LANGUAGE\nimport com.intellij.ide.starters.shared.KOTLIN_STARTER_LANGUAGE\nimport com.intellij.ide.starters.shared.ValidationFunctions\nimport com.intellij.openapi.diagnostic.logger\nimport com.intellij.openapi.observable.util.trim\nimport com.intellij.openapi.ui.ComboBox\nimport com.intellij.openapi.ui.MessageType\nimport com.intellij.openapi.ui.popup.Balloon\nimport com.intellij.openapi.ui.popup.JBPopupFactory\nimport com.intellij.ui.SimpleTextAttributes.GRAYED_ITALIC_ATTRIBUTES\nimport com.intellij.ui.awt.RelativePoint\nimport com.intellij.ui.dsl.builder.*\nimport net.mamoe.mirai.console.intellij.wizard.MiraiProjectWizardBundle.message\nimport org.jetbrains.concurrency.Promise\nimport org.jetbrains.concurrency.runAsync\nimport org.jetbrains.kotlin.tools.projectWizard.Versions\n\nprivate val log = logger<MiraiProjectWizardInitialStep>()\n\nclass MiraiProjectWizardInitialStep(contextProvider: StarterContextProvider) : StarterInitialStep(contextProvider) {\n    private val pluginVersionProperty = propertyGraph.property(\"0.1.0\")\n    private val pluginNameProperty = propertyGraph.lazyProperty { \"\" }\n    private val pluginIdProperty = propertyGraph.lazyProperty { \"\" }\n    private val pluginAuthorProperty = propertyGraph.lazyProperty { System.getProperty(\"user.name\") }\n    private val pluginDependenciesProperty = propertyGraph.lazyProperty { \"\" }\n    private val pluginInfoProperty = propertyGraph.lazyProperty { \"\" }\n    private val miraiVersionKindProperty = propertyGraph.property(MiraiVersionKind.Stable)\n    private val miraiVersionProperty = propertyGraph.property(\"0.1.0\")\n    private val useProxyRepoProperty = propertyGraph.property(true)\n\n    var pluginVersion by pluginVersionProperty.trim()\n    var pluginName by pluginNameProperty.trim()\n    var pluginId by pluginIdProperty.trim()\n    var pluginAuthor by pluginAuthorProperty.trim()\n    var pluginDependencies by pluginDependenciesProperty.trim()\n    var pluginInfo by pluginInfoProperty.trim()\n\n    var miraiVersionKind by miraiVersionKindProperty\n    var miraiVersion by miraiVersionProperty\n\n    var kotlinStdlibVersion = Versions.KOTLIN.text\n\n    private lateinit var miraiVersionCell: Cell<ComboBox<String>>\n\n    var useProxyRepo by useProxyRepoProperty\n\n    override fun addFieldsAfter(layout: Panel) {\n        layout.group(message(\"title.plugin.description\")) {\n            row(message(\"label.plugin.id\")) {\n                textField()\n                    .withSpecialValidation(\n                        ValidationFunctions.CHECK_NOT_EMPTY,\n                    )\n                    .bindText(pluginIdProperty)\n                rowComment(message(\"comment.plugin.id\"))\n\n                pluginIdProperty.dependsOn(groupIdProperty) { \"$groupId.$artifactId\" }\n                pluginIdProperty.dependsOn(artifactIdProperty) { \"$groupId.$artifactId\" }\n            }\n\n            row(message(\"label.plugin.name\")) {\n                textField()\n                    .withSpecialValidation(\n                        ValidationFunctions.CHECK_NOT_EMPTY,\n                        MiraiValidations.CHECK_FORBIDDEN_PLUGIN_NAME,\n                    )\n                    .bindText(pluginNameProperty)\n\n                pluginNameProperty.dependsOn(artifactIdProperty) {\n                    artifactId.adjustToPresentationName()\n                }\n\n                rowComment(message(\"comment.plugin.name\"))\n            }\n\n            row(message(\"label.plugin.version\")) {\n                textField()\n                    .withSpecialValidation(\n                        ValidationFunctions.CHECK_NOT_EMPTY,\n                        MiraiValidations.CHECK_ILLEGAL_VERSION_LINE\n                    )\n                    .bindText(pluginVersionProperty)\n                rowComment(message(\"comment.plugin.version\"))\n            }\n            row(message(\"label.plugin.author\")) {\n                textField().bindText(pluginAuthorProperty)\n            }\n            row(message(\"label.plugin.dependencies\")) {\n                expandableTextField()\n                    .withSpecialValidation(MiraiValidations.CHECK_PLUGIN_DEPENDENCIES_SEGMENT)\n                    .bindText(pluginDependenciesProperty)\n                    .component.emptyText.setText(message(\"text.hint.plugin.dependencies\"), GRAYED_ITALIC_ATTRIBUTES)\n                rowComment(message(\"comment.plugin.dependencies\"))\n            }\n            row(message(\"label.plugin.info\")) {\n                expandableTextField().bindText(pluginInfoProperty)\n                    .component.emptyText.setText(message(\"text.hint.plugin.info\"), GRAYED_ITALIC_ATTRIBUTES)\n                rowComment(message(\"comment.plugin.info\"))\n            }\n            row(message(\"label.mirai.version\")) {\n                val miraiVersionKindCell = segmentedButton(MiraiVersionKind.values().toList()) { kind ->\n                    when (kind) {\n                        MiraiVersionKind.Stable -> message(\"label.version.stable\")\n                        MiraiVersionKind.Prerelease -> message(\"label.version.prerelease\")\n                        MiraiVersionKind.Nightly -> message(\"label.version.nightly\")\n                    }\n                }.bind(miraiVersionKindProperty)\n\n                miraiVersionCell = comboBox(listOf<String>())\n                    .enabled(false)\n                    .bindItem(miraiVersionProperty)\n\n                miraiVersionProperty.afterChange {\n                    kotlinStdlibVersion = \"Loading\"\n                    runAsync {\n                        KotlinStdlibVersionFetcher.getKotlinStdlibVersion(miraiVersion)\n                    }.onError {\n                        log.error(it)\n                        kotlinStdlibVersion = Versions.KOTLIN.text\n                    }.onProcessed {\n                        kotlinStdlibVersion = it\n                    }\n                }\n\n                miraiVersionKindProperty.afterChange {\n                    if (!miraiVersionCell.component.isEnabled) return@afterChange\n\n                    updateVersionItems(miraiVersionKindCell, miraiVersionCell)\n                }\n\n                updateVersionItems(miraiVersionKindCell, miraiVersionCell)\n                rowComment(message(\"comment.mirai.version\"))\n            }\n            row {\n                checkBox(message(\"text.use.proxy.repo\")).enabled(true).bindSelected(useProxyRepoProperty)\n            }\n        }\n\n        // Update default values\n\n        languageProperty.set(KOTLIN_STARTER_LANGUAGE)\n        projectTypeProperty.set(MiraiModuleBuilder.GRADLE_KTS_PROJECT)\n        pluginIdProperty.set(\"$groupId.$artifactId\")\n        pluginNameProperty.set(artifactId.adjustToPresentationName())\n    }\n\n    override fun updateDataModel() {\n        super.updateDataModel()\n\n        starterContext.putUserData(\n            /* key = */ MiraiModuleBuilder.MIRAI_PROJECT_MODEL_KEY,\n            /* value = */ MiraiProjectModel(\n                projectCoordinates = ProjectCoordinates(\n                    groupId = groupId.trim(),\n                    artifactId = artifactId.trim(),\n                    version = pluginVersion.trim(),\n                    moduleName = entityName\n                ),\n                pluginCoordinates = PluginCoordinates(\n                    id = pluginId.trim(),\n                    name = pluginName.trim(),\n                    author = pluginAuthor.trim(),\n                    info = pluginInfo.trim(),\n                    dependsOn = pluginDependencies.trim()\n                ),\n                miraiVersion = miraiVersion,\n                kotlinVersion = kotlinStdlibVersion,\n                buildSystemType = when (val projectType = projectTypeProperty.get()) {\n                    MiraiModuleBuilder.GRADLE_KTS_PROJECT -> BuildSystemType.GradleKt\n                    MiraiModuleBuilder.GRADLE_GROOVY_PROJECT -> BuildSystemType.GradleGroovy\n                    else -> error(\"Unsupported project type: $projectType\")\n                },\n                languageType = when (val language = languageProperty.get()) {\n                    KOTLIN_STARTER_LANGUAGE -> LanguageType.Kotlin\n                    JAVA_STARTER_LANGUAGE -> LanguageType.Java\n                    else -> error(\"Unsupported language type: $language\")\n                },\n                useProxyRepo = useProxyRepo\n            )\n        )\n    }\n\n    override fun validate(): Boolean {\n        if (miraiVersion == message(\"label.mirai.version.loading\") || kotlinStdlibVersion == \"Loading\") {\n            JBPopupFactory.getInstance()\n                .createHtmlTextBalloonBuilder(\n                    message(\"error.please.wait.for.mirai.version\"),\n                    MessageType.WARNING, null\n                )\n                .setFadeoutTime(3000)\n                .createBalloon()\n                .show(\n                    RelativePoint.getSouthWestOf(\n                        miraiVersionCell.component\n                    ), Balloon.Position.atLeft\n                )\n            return false\n        }\n        return super.validate()\n    }\n\n    private fun updateVersionItems(\n        miraiVersionKindCell: SegmentedButton<MiraiVersionKind>,\n        miraiVersionCell: Cell<ComboBox<MiraiVersion>>\n    ): Promise<Set<MiraiVersion>?> {\n        miraiVersionCell.component.isEditable = false\n        miraiVersionKindCell.enabled(false) // disable the kind selector until the async operation finishes\n        miraiVersionCell.enabled(false)\n\n        miraiVersionCell.component.removeAllItems()\n        miraiVersionCell.component.addItem(message(\"label.mirai.version.loading\"))\n\n        return runAsync {\n            try {\n                val list = MiraiVersionKind.getMiraiVersionList()\n                miraiVersionCell.component.removeAllItems()\n                list.filter { miraiVersionKind.isThatKind(it) }\n                    .forEach { v -> miraiVersionCell.component.addItem(v) }\n                list\n            } catch (e: Throwable) {\n                JBPopupFactory.getInstance()\n                    .createHtmlTextBalloonBuilder(\n                        message(\"error.failed.to.download.mirai.version\"),\n                        MessageType.ERROR, null\n                    )\n                    .setFadeoutTime(2000)\n                    .createBalloon()\n                    .show(\n                        RelativePoint.getSouthOf(\n                            miraiVersionCell.component\n                        ), Balloon.Position.below\n                    )\n                null\n            }\n        }.onError { log.error(it) }\n            .onProcessed { versions ->\n                miraiVersionCell.component.isEditable = versions == null\n                miraiVersionKindCell.enabled(true)\n                miraiVersionCell.enabled(true)\n            }\n    }\n}\n\nprivate fun String.adjustToPresentationName(): String {\n    val result = buildString {\n        var doCapitalization = true\n\n        fun Char.isAllowed() = isLetterOrDigit() || this in \"_- \"\n\n        for (char in this@adjustToPresentationName) {\n            if (!char.isAllowed()) continue\n\n            if (doCapitalization) {\n                when {\n                    char.isLetter() -> append(char.uppercase())\n                    char == '_' -> {}\n                    char == '-' -> {}\n                    else -> append(char)\n                }\n                doCapitalization = false\n            } else {\n                if (char in \"_- \") {\n                    doCapitalization = true\n                    append(' ')\n                } else {\n                    append(char)\n                }\n            }\n        }\n    }.trim()\n\n    return result\n}\n"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/wizard/MiraiValidations.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.wizard\n\nimport com.intellij.ide.starters.shared.TextValidationFunction\nimport net.mamoe.mirai.console.compiler.common.CheckerConstants\nimport net.mamoe.mirai.console.intellij.util.RequirementHelper\nimport net.mamoe.mirai.console.intellij.util.RequirementParser\nimport net.mamoe.mirai.console.intellij.wizard.MiraiProjectWizardBundle.message\n\nobject MiraiValidations {\n    val CHECK_FORBIDDEN_PLUGIN_NAME = TextValidationFunction { text ->\n        val lowercaseName = text.lowercase().trim()\n        val illegal =\n            CheckerConstants.PLUGIN_FORBIDDEN_NAMES.firstOrNull { it == lowercaseName }\n        if (illegal != null) {\n            message(\"validation.plugin.name.forbidden.character\", illegal)\n        } else null\n    }\n\n    val CHECK_PLUGIN_ID = TextValidationFunction { text ->\n        if (!CheckerConstants.PLUGIN_ID_REGEX.matches(text.trim())) {\n            message(\"validation.illegal.plugin.id\", text)\n        } else null\n    }\n\n    val CHECK_ILLEGAL_VERSION_LINE = TextValidationFunction { text ->\n        checkVersionLine(text)?.let {\n            message(\"validation.illegal.version\", text, it)\n        }\n    }\n\n    val CHECK_PLUGIN_DEPENDENCIES_LINE = TextValidationFunction { text ->\n        try {\n            val trim = text.trim()\n            val dep = PluginDependency.parseFromString(trim)\n            if (!CheckerConstants.PLUGIN_ID_REGEX.matches(dep.id)) {\n                return@TextValidationFunction message(\"validation.illegal.plugin.id\", dep.id)\n            }\n\n            dep.versionRequirement?.let { checkVersionRequirementLine(it) }?.let {\n                return@TextValidationFunction message(\"validation.illegal.version\", it)\n            }\n\n            null // no error\n        } catch (e: IllegalArgumentException) {\n            message(\"validation.illegal.version\", text, e.message ?: message(\"no.error.message\"))\n        }\n    }\n\n    val CHECK_PLUGIN_DEPENDENCIES_SEGMENT = TextValidationFunction { text ->\n        text.lineSequence()\n            .map { it.trim() }\n            .filter { it.isNotEmpty() }\n            .map { CHECK_PLUGIN_DEPENDENCIES_LINE.checkText(it) }\n            .firstOrNull()\n    }\n\n    /**\n     * Check multiple lines and returns information about the first illegal one.\n     */\n    val CHECK_ILLEGAL_VERSION_SEGMENT = TextValidationFunction { text ->\n        text.lineSequence()\n            .map { it.trim() }\n            .filter { it.isNotEmpty() }\n            .mapNotNull { CHECK_ILLEGAL_VERSION_LINE.checkText(text) }\n            .firstOrNull()\n    }\n\n    private class PluginDependency @JvmOverloads constructor(\n        val id: String,\n        val versionRequirement: String? = null,\n    ) {\n        companion object {\n\n            /**\n             * Frozen version of [net.mamoe.mirai.console.plugin.description.PluginDescription.Companion.parseFromString] from `2.11.0-M2.2`.\n             */\n            @JvmStatic\n            fun parseFromString(string: String): PluginDependency {\n//                val optional = string.endsWith('?')\n                val (id, version) = string.removeSuffix(\"?\").let { rule ->\n                    if (rule.contains(':')) {\n                        rule.substringBeforeLast(':') to rule.substringAfterLast(':')\n                    } else {\n                        rule to null\n                    }\n                }\n                return PluginDependency(id, version)\n            }\n        }\n    }\n\n    private fun checkVersionLine(version: String): String? {\n        return checkVersionRequirementLine(version) // for simplicity\n    }\n\n    private fun checkVersionRequirementLine(versionRequirement: String): String? {\n        kotlin.runCatching {\n            RequirementHelper.RequirementChecker.processLine(\n                RequirementParser.TokenReader(\n                    versionRequirement\n                )\n            )\n        }.onFailure { return it.message ?: message(\"no.error.message\") }\n        return null\n    }\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/wizard/MiraiVersion.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.console.intellij.wizard\n\nimport com.intellij.openapi.diagnostic.Logger\nimport com.intellij.util.text.SemVer\nimport org.jsoup.Jsoup\nimport org.jsoup.nodes.Document\nimport java.io.IOException\n\ntypealias MiraiVersion = String\n\nenum class MiraiVersionKind {\n    Stable {\n        override fun isThatKind(version: String): Boolean = version matches REGEX_STABLE\n    },\n    Prerelease {\n        override fun isThatKind(version: String): Boolean =\n            Stable.isThatKind(version) || version.contains(\"-M\") || version.contains(\"-RC\")\n    },\n    Nightly {\n        override fun isThatKind(version: String): Boolean = true // version.contains(\"-dev\")\n    }, ;\n\n    abstract fun isThatKind(version: String): Boolean\n\n    companion object {\n        val DEFAULT = Stable\n\n        private val REGEX_STABLE = Regex(\"\"\"^\\d+\\.\\d+(?:\\.\\d+)?$\"\"\")\n        private val LOG = Logger.getInstance(MiraiVersionKind::class.java)\n\n        @Throws(IOException::class)\n        fun getMiraiVersionList(): Set<MiraiVersion> {\n            fun download(url: String): Document {\n                return Jsoup.connect(url)\n                    .followRedirects(true)\n                    .ignoreContentType(true)\n                    .ignoreHttpErrors(true)\n                    .get()\n            }\n\n            return kotlin.runCatching {\n                download(\"https://maven.aliyun.com/repository/central/net/mamoe/mirai-core/maven-metadata.xml\")\n            }.recoverCatching {\n                download(\"https://repo.maven.apache.org/maven2/net/mamoe/mirai-core/maven-metadata.xml\")\n            }.map { document ->\n                val xml = document.toString()\n\n                Regex(\"\"\"<version>\\s*(.*?)\\s*</version>\"\"\")\n                    .findAll(xml)\n                    .mapNotNull { it.groupValues.getOrNull(1) }\n                    .sortVersionsDescending()\n                    .toSet()\n            }.getOrThrow()\n        }\n\n        // Kotlin version: not working because\n        // Caused by: java.util.ServiceConfigurationError: kotlinx.coroutines.CoroutineExceptionHandler: com.intellij.openapi.application.impl.CoroutineExceptionHandlerImpl not a subtype\n//\n//        private suspend fun getMiraiVersionList(): Set<MiraiVersion> {\n//            suspend fun download(url: String): Document {\n//                return Jsoup.connect(url)\n//                    .followRedirects(true)\n//                    .ignoreContentType(true)\n//                    .ignoreHttpErrors(true)\n//                    .run { runInterruptible(Dispatchers.IO) { get() } }\n//            }\n//\n//            val document = supervisorScope {\n//                val jobs = mutableListOf<Deferred<Document>>()\n//                jobs += async {\n//                    download(\"https://maven.aliyun.com/repository/central/net/mamoe/mirai-core/maven-metadata.xml\")\n//                }\n//                jobs += async {\n//                    download(\"https://repo.maven.apache.org/maven2/net/mamoe/mirai-core/maven-metadata.xml\")\n//                }\n//                val timeout = launch {\n//                    delay(10_000)\n//                }\n//                // select the faster one\n//                select<Document> {\n//                    jobs.forEach { job -> job.onAwait { it } }\n//                    timeout.onJoin {\n//                        throw IllegalStateException(\"Timeout getMiraiVersionList\").apply {\n//                            jobs.forEach {\n//                                if (it.isCompleted) {\n//                                    try {\n//                                        it.await()\n//                                    } catch (e: Throwable) {\n//                                        addSuppressed(e)\n//                                    }\n//                                }\n//                            }\n//                        }\n//                    }\n//                }\n//                jobs.forEach { it.cancel() }\n//                timeout.cancel()\n//            }\n//\n//            val xml = document.toString()\n//\n//            return Regex(\"\"\"<version>\\s*(.*?)\\s*</version>\"\"\").findAll(xml).mapNotNull { it.groupValues.getOrNull(1) }.toSet()\n//        }\n\n//        fun CoroutineScope.getMiraiVersionListAsync(): Deferred<Set<MiraiVersion>> {\n//            return async(CoroutineName(\"getMiraiVersionListAsync\")) {\n//                getMiraiVersionList()\n//            }\n//        }\n    }\n}\n\ninternal fun Sequence<String>.sortVersionsDescending(): Sequence<String> {\n    return this\n        .mapNotNull { SemVer.parseFromText(it) }\n        .sortedWith { o1, o2 ->\n            o2.compareTo(o1)\n        }\n        .map { it.toString() }\n}\n\n\n/*\n\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<metadata>\n  <groupId>net.mamoe</groupId>\n  <artifactId>mirai-core</artifactId>\n  <versioning>\n    <latest>2.5.0-dev-2</latest>\n    <release>2.5.0-dev-2</release>\n    <versions>\n      <version>2.4-RC</version>\n      <version>2.4-M1-dev-publish-3</version>\n      <version>2.4.0-dev-publish-2</version>\n      <version>2.4.0</version>\n      <version>2.4.1</version>\n      <version>2.4.2</version>\n      <version>2.5-RC-dev-1</version>\n      <version>2.5-M1</version>\n      <version>2.5-M2-dev-2</version>\n      <version>2.5-M2</version>\n      <version>2.5.0-dev-android-1</version>\n      <version>2.5.0-dev-1</version>\n      <version>2.5.0-dev-2</version>\n    </versions>\n    <lastUpdated>20210319014025</lastUpdated>\n  </versioning>\n</metadata>\n\n */"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/wizard/MiraiWizardBundle.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.wizard\n\nimport com.intellij.AbstractBundle\nimport org.jetbrains.annotations.Nls\nimport org.jetbrains.annotations.NonNls\nimport org.jetbrains.annotations.PropertyKey\nimport java.util.function.Supplier\n\n@NonNls\nprivate const val BUNDLE = \"messages.MiraiProjectWizardBundle\"\n\nobject MiraiProjectWizardBundle : AbstractBundle(BUNDLE) {\n    @Nls\n    @JvmStatic\n    fun message(@NonNls @PropertyKey(resourceBundle = BUNDLE) key: String, vararg params: Any): String =\n        getMessage(key, *params)\n\n    @JvmStatic\n    fun messagePointer(@PropertyKey(resourceBundle = BUNDLE) key: String, vararg params: Any): Supplier<String> {\n        return getLazyMessage(key, *params)\n    }\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/src/wizard/ProjectAssetsProvider.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.console.intellij.wizard\n\nimport com.intellij.ide.fileTemplates.FileTemplate\nimport com.intellij.ide.fileTemplates.FileTemplateManager\nimport com.intellij.ide.starters.local.GeneratorAsset\nimport com.intellij.ide.starters.local.GeneratorEmptyDirectory\nimport com.intellij.ide.starters.local.GeneratorTemplateFile\nimport com.intellij.openapi.project.ProjectManager\nimport net.mamoe.mirai.console.intellij.assets.FT\n\nsealed class ProjectCreator(\n    val model: MiraiProjectModel,\n) {\n    private val manager get() = FileTemplateManager.getInstance(ProjectManager.getInstance().defaultProject)\n\n    fun getTemplate(name: String): FileTemplate = manager.getCodeTemplate(name)\n\n    abstract fun collectAssets(\n        collect: (GeneratorAsset) -> Unit,\n    )\n}\n\nsealed class GradleProjectCreator(\n    model: MiraiProjectModel,\n) : ProjectCreator(model) {\n    override fun collectAssets(\n        collect: (GeneratorAsset) -> Unit\n    ) {\n        collect(GeneratorEmptyDirectory(\"src/main/${model.languageType.sourceSetDirName}\"))\n        collect(GeneratorEmptyDirectory(\"src/main/resources\"))\n\n        collect(GeneratorEmptyDirectory(\"src/test/${model.languageType.sourceSetDirName}\"))\n        collect(GeneratorEmptyDirectory(\"src/test/resources\"))\n\n        collect(GeneratorTemplateFile(model.languageType.pluginMainClassFile(this)))\n\n        collect(GeneratorTemplateFile(\".gitignore\", getTemplate(FT.Gitignore)))\n        collect(GeneratorTemplateFile(\"gradle.properties\", getTemplate(FT.GradleProperties)))\n    }\n\n}\n\nprivate fun GeneratorTemplateFile(targetFileName: NamedFile): GeneratorTemplateFile {\n    return GeneratorTemplateFile(targetFileName.path, targetFileName.template)\n}\n\n\nclass GradleKotlinProjectCreator(\n    model: MiraiProjectModel,\n) : GradleProjectCreator(\n    model,\n) {\n    override fun collectAssets(\n        collect: (GeneratorAsset) -> Unit\n    ) {\n        super.collectAssets(collect)\n        collect(GeneratorTemplateFile(\"build.gradle.kts\", getTemplate(FT.BuildGradleKts)))\n        collect(GeneratorTemplateFile(\"settings.gradle.kts\", getTemplate(FT.SettingsGradleKts)))\n    }\n}\n\nclass GradleGroovyProjectCreator(\n    model: MiraiProjectModel,\n) : GradleProjectCreator(\n    model,\n) {\n    override fun collectAssets(\n        collect: (GeneratorAsset) -> Unit\n    ) {\n        super.collectAssets(collect)\n        collect(GeneratorTemplateFile(\"build.gradle\", getTemplate(FT.BuildGradle)))\n        collect(GeneratorTemplateFile(\"settings.gradle\", getTemplate(FT.SettingsGradle)))\n    }\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/test/creator/MiraiVersionKindTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\npackage creator\n\nimport net.mamoe.mirai.console.intellij.wizard.sortVersionsDescending\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\nclass MiraiVersionKindTest {\n\n    @Test\n    fun sortVersions() {\n        assertEquals(\n            \"2.10.0, 2.10.0-RC, 2.10.0-M1, 2.9.0, 2.9.0-RC, 2.9.0-M2, 2.9.0-M1, 2.7.0, 2.7.0-RC\"\n                .split(\",\")\n                .map { it.trim() },\n            sequenceOf(\n                \"2.9.0\",\n                \"2.9.0-M1\",\n                \"2.9.0-M2\",\n                \"2.9.0-RC\",\n                \"2.7.0\",\n                \"2.7.0-RC\",\n                \"2.10.0\",\n                \"2.10.0-RC\",\n                \"2.10.0-M1\"\n            ).sortVersionsDescending().toList()\n        )\n    }\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/test/creator/tasks/TaskUtilsKtTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.console.intellij.creator.tasks\n\nimport net.mamoe.mirai.console.intellij.diagnostics.adjustToClassName\nimport net.mamoe.mirai.console.intellij.diagnostics.isValidPackageName\nimport net.mamoe.mirai.console.intellij.diagnostics.isValidQualifiedClassName\nimport net.mamoe.mirai.console.intellij.diagnostics.isValidSimpleClassName\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertTrue\n\ninternal class TaskUtilsKtTest {\n\n    private fun useClassNameCases(mustBeTrue: (String) -> Boolean) {\n        val success = listOf(\"A\", \"A_B\", \"A0\", \"A_0\", \"A_B0\")\n        val failure = listOf(\"\", \"0\", \"_\", \"-\", \".\", \"/\", \"A/\", \"A.\", \"A.\")\n\n        success.forEach { assertEquals(true, mustBeTrue(it), it) }\n        failure.forEach { assertEquals(false, mustBeTrue(it), it) }\n    }\n\n    @Test\n    fun isValidPackageName() {\n        useClassNameCases { it.isValidPackageName() }\n    }\n\n    @Test\n    fun isValidClassName() {\n        useClassNameCases { it.isValidSimpleClassName() }\n    }\n\n    @Test\n    fun adjustToClassName() {\n        assertEquals(\"Test\", \"Test\".adjustToClassName())\n        assertEquals(\"TeSt\", \"Te_st\".adjustToClassName())\n        assertEquals(\"TeSt\", \"Te_St\".adjustToClassName())\n        assertEquals(\"TeSt\", \"Te-st\".adjustToClassName())\n        assertEquals(\"TeSt\", \"Te-St\".adjustToClassName())\n\n        assertEquals(\"TestAA\", \"Test//!@#$%^&*()AA\".adjustToClassName())\n\n        assertEquals(null, \"0\".adjustToClassName())\n        assertEquals(null, \"_0\".adjustToClassName())\n        assertEquals(null, \"_0A\".adjustToClassName())\n        assertEquals(\"A1\", \"A1\".adjustToClassName())\n\n        assertEquals(\"A1\", \"A_1\".adjustToClassName())\n        assertEquals(\"A1\", \"A-1\".adjustToClassName())\n\n        assertEquals(\"MiraiConsoleExample\", \"mirai-console-example\".adjustToClassName())\n    }\n\n    @Test\n    fun qualifiedClassname() {\n        useClassNameCases { it.isValidQualifiedClassName() }\n        assertTrue { \"a.b.c\".isValidQualifiedClassName() }\n    }\n}"
  },
  {
    "path": "mirai-console/tools/intellij-plugin/test/package.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n\npackage net.mamoe.mirai.console.intellij"
  },
  {
    "path": "mirai-core/.gitignore",
    "content": "src/jvmTest/kotlin/local\ntest-sandbox/"
  },
  {
    "path": "mirai-core/README.md",
    "content": "# mirai-core\n\nmirai 核心实现模块。首先阅读 [mirai-core-api/README.md](../mirai-core-api/README.md)。\n\n本文仅介绍重要部分。\n\n## 架构\n\n| 包名                        | 描述                 |\n|:---------------------------|:--------------------|\n| `net.mamoe.mirai.internal` | mirai 核心 API 的实现 |\n| `.contact`                 | 联系人实现            |\n| `.message`                 | 消息系统的实现         |\n| `.network`                 | 网络层实现            |\n| `.utils`                   | 工具类               |\n\n## `net.mamoe.mirai.internal.contact`\n\n### `AbstractContact`\n\n[AbstractContact.kt](src/commonMain/kotlin/contact/AbstractContact.kt#L22)\n\n所有 `Contact` 实现的基类. 实现生命周期等.\n\n### `SendMessageHandler`\n\n[SendMessageHandler.kt](src/commonMain/kotlin/contact/SendMessageHandler.kt#L35)\n\n处理 mirai 消息系统 `Message` 到协议数据结构的转换, 并处理长消息上传, 音乐转发上传等.\n\n\n## `net.mamoe.mirai.internal.message`\n\n### `ReceiveMessageTransformer`\n\n[ReceiveMessageHandler.kt](src/commonMain/kotlin/message/ReceiveMessageHandler.kt#L29)\n\n处理协议数据结构到 `Message` 的转换. 设有 `RefinableMessage` 处理长消息下载, 合并转发下载并展开等.\n\n### `RefinableMessage`\n\n[RefinableMessage.kt](src/commonMain/kotlin/message/RefinableMessage.kt#L17)\n\n支持处理长消息下载, 合并转发下载并展开等.\n\n### `Image` 实现\n\n[imagesImpl.kt](src/commonMain/kotlin/message/imagesImpl.kt#L30)\n\n图片的实现的基类为 `AbstractImage`.\n\n在底层协议, 群图片与私聊图片很不同. 因此图片实现可以是 `GroupImage` 或 `FriendImage`.\n\n图片又细分了 `OnlineImage` 和 `OfflineImage`. 故有 `OnlineGroupImage` 等四个类型, 及他们分别的 `Impl`.\n\n`OnlineImage` 为通过 `Contact.uploadImage` 上传得到的, 或刚刚从服务器接收的图片对象. `OfflineImage` 则为反序列化得到的对象.\n\n### `MessageSource` 实现\n\n[MessageSourceInternal.kt](src/commonMain/kotlin/message/MessageSourceInternal.kt#L20)\n\n`MessageSource` 在协议底层十分复杂,"
  },
  {
    "path": "mirai-core/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"UNUSED_VARIABLE\")\n\nimport BinaryCompatibilityConfigurator.configureBinaryValidators\nimport shadow.relocateCompileOnly\nimport shadow.relocateImplementation\n\nplugins {\n    kotlin(\"multiplatform\")\n    id(\"kotlinx-atomicfu\")\n    kotlin(\"plugin.serialization\")\n    id(\"me.him188.kotlin-jvm-blocking-bridge\")\n    id(\"me.him188.kotlin-dynamic-delegation\")\n//    id(\"me.him188.maven-central-publish\")\n    `maven-publish`\n}\n\ndescription = \"Mirai Protocol implementation for QQ Android\"\n\nkotlin {\n    explicitApi()\n    apply(plugin = \"explicit-api\")\n\n    configureJvmTargetsHierarchical(\"net.mamoe.mirai.internal\")\n\n    optInForAllSourceSets(\"net.mamoe.mirai.utils.MiraiExperimentalApi\")\n    optInForAllSourceSets(\"net.mamoe.mirai.utils.MiraiInternalApi\")\n    optInForAllSourceSets(\"net.mamoe.mirai.LowLevelApi\")\n    optInForAllSourceSets(\"kotlinx.serialization.ExperimentalSerializationApi\")\n\n    sourceSets.apply {\n\n        val commonMain by getting {\n            dependencies {\n                api(project(\":mirai-core-api\"))\n                api(`kotlinx-serialization-core`)\n                api(`kotlinx-serialization-json`)\n                api(`kotlinx-coroutines-core`)\n\n                implementation(`kt-bignum`)\n                implementation(project(\":mirai-core-utils\"))\n                implementation(`kotlinx-serialization-protobuf`)\n                implementation(`kotlinx-atomicfu`)\n\n                // runtime from mirai-core-utils\n                relocateCompileOnly(`ktor-io_relocated`)\n\n//                relocateImplementation(`ktor-http_relocated`)\n//                relocateImplementation(`ktor-serialization_relocated`)\n//                relocateImplementation(`ktor-websocket-serialization_relocated`)\n            }\n        }\n\n        commonTest {\n            dependencies {\n                implementation(kotlin(\"script-runtime\"))\n                implementation(`kotlinx-coroutines-test`)\n                api(yamlkt)\n                api(`junit-jupiter-api`)\n            }\n        }\n\n        findByName(\"jvmBaseMain\")?.apply {\n            dependencies {\n                implementation(`log4j-api`)\n                implementation(`netty-handler`)\n                api(`kotlinx-coroutines-jdk8`) // use -jvm modules for this magic target 'jvmBase'\n            }\n        }\n\n        findByName(\"jvmBaseTest\")?.apply {\n            dependencies {\n                implementation(`kotlinx-coroutines-debug`)\n            }\n        }\n\n        findByName(\"androidMain\")?.apply {\n            dependencies {\n                if (rootProject.property(\"mirai.android.target.api.level\")!!.toString().toInt() < 23) {\n                    // Ship with BC if we are targeting 23 or lower where AndroidKeyStore is not stable enough.\n                    // For more info, read `net.mamoe.mirai.internal.utils.crypto.EcdhAndroidKt.create` in `androidMain`.\n                    implementation(bouncycastle)\n                }\n            }\n        }\n\n        // For Android with JDK\n        findByName(\"androidTest\")?.apply {\n            dependencies {\n                implementation(bouncycastle)\n            }\n        }\n        // For Android with SDK\n        findByName(\"androidUnitTest\")?.apply {\n            dependencies {\n                implementation(bouncycastle)\n            }\n        }\n\n        findByName(\"jvmMain\")?.apply {\n            dependencies {\n                implementation(bouncycastle)\n                // api(kotlinx(\"coroutines-debug\", Versions.coroutines))\n            }\n        }\n\n        findByName(\"jvmTest\")?.apply {\n            dependencies {\n                api(`kotlinx-coroutines-debug`)\n                //  implementation(\"net.mamoe:mirai-login-solver-selenium:1.0-dev-14\")\n            }\n        }\n\n\n        // Kt bignum\n        findByName(\"jvmBaseMain\")?.apply {\n            dependencies {\n                relocateImplementation(`kt-bignum_relocated`)\n            }\n        }\n\n\n        // Ktor\n        findByName(\"commonMain\")?.apply {\n            dependencies {\n                compileOnly(`ktor-io`)\n                implementation(`ktor-client-core`)\n            }\n        }\n        findByName(\"jvmBaseMain\")?.apply {\n            // relocate for JVM like modules\n            dependencies {\n                relocateCompileOnly(`ktor-io_relocated`) // runtime from mirai-core-utils\n                relocateImplementation(`ktor-client-core_relocated`)\n            }\n        }\n        findByName(\"jvmBaseMain\")?.apply {\n            dependencies {\n                relocateImplementation(`ktor-client-okhttp_relocated`)\n            }\n        }\n\n    }\n}\n\natomicfu {\n    transformJvm = false\n}\n\nif (tasks.findByName(\"androidMainClasses\") != null) {\n    tasks.register(\"checkAndroidApiLevel\") {\n        doFirst {\n            analyzes.AndroidApiLevelCheck.check(\n                buildDir.resolve(\"classes/kotlin/android/main\"),\n                project.property(\"mirai.android.target.api.level\")!!.toString().toInt(),\n                project\n            )\n        }\n        group = \"verification\"\n        this.mustRunAfter(\"androidMainClasses\")\n    }\n    tasks.findByName(\"androidTest\")?.dependsOn(\"checkAndroidApiLevel\")\n}\n\nconfigureMppPublishing()\nconfigureBinaryValidators(setOf(\"jvm\", \"android\").filterTargets())\n\ntasks.register(\"compileJava\") {\n    description = \"Dummy task to allow IntelliJ IDEA to run main functions from jvmTest\"\n    dependsOn(tasks.getByName(\"compileKotlinJvm\"))\n}\n\ntasks.register(\"testClasses\") {\n    description = \"Dummy task to allow IntelliJ IDEA to run main functions from jvmTest\"\n    dependsOn(tasks.getByName(\"compileTestKotlinJvm\"))\n}\n\n//mavenCentralPublish {\n//    artifactId = \"mirai-core\"\n//    githubProject(\"mamoe\", \"mirai\")\n//    developer(\"Mamoe Technologies\", email = \"support@mamoe.net\", url = \"https://github.com/mamoe\")\n//    licenseFromGitHubProject(\"AGPLv3\", \"dev\")\n//    publishPlatformArtifactsInRootModule = \"jvm\"\n//}\n"
  },
  {
    "path": "mirai-core/compatibility-validation/android/api/android.api",
    "content": ""
  },
  {
    "path": "mirai-core/compatibility-validation/jvm/api/jvm.api",
    "content": ""
  },
  {
    "path": "mirai-core/src/androidInstrumentedTest/kotlin/package.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal"
  },
  {
    "path": "mirai-core/src/androidInstrumentedTest/kotlin/test/initializeTestJvm.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.test\n\ninternal actual fun initializeTestPlatformBeforeCommon() {\n    // nop\n}"
  },
  {
    "path": "mirai-core/src/androidInstrumentedTest/kotlin/testFramework/currentPlatform.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework\n\nactual fun currentPlatform(): Platform = Platform.AndroidInstrumentedTest"
  },
  {
    "path": "mirai-core/src/androidMain/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019-2023 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<manifest package=\"net.mamoe.mirai.internal\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n</manifest>"
  },
  {
    "path": "mirai-core/src/androidMain/kotlin/package.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal"
  },
  {
    "path": "mirai-core/src/androidMain/kotlin/utils/crypto/EcdhAndroid.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils.crypto\n\nimport java.security.Provider\nimport java.security.Security\n\ninternal actual fun Ecdh.Companion.create(): Ecdh<*, *> =\n// WARNING: If you change the SDK version checks here, \n//          search for usages of `mirai.android.target.api.level` and see if you need to change elsewhere! \n    //          Especially in mirai-core/build.gradle.kts (configuring bouncy-castle dependency)\n\n    if (kotlin.runCatching {\n            // When running tests on JVM desktop, `ClassNotFoundException` will be got\n            android.os.Build.VERSION.SDK_INT >= 23\n        }.getOrDefault(false)) {\n        // For newer Android, BC is deprecated, but AndroidKeyStore (default) handles ECDH well\n        // Do not specify a provider as Google recommends\n        JceEcdh()\n    } else {\n        // For older Android, AndroidKeyStore (default) is buggy and cannot handle EC key generation without tricks\n        // See https://developer.android.com/training/articles/keystore#SupportedKeyPairGenerators for details\n\n        // Let's use BC instead, BC is bundled into older Android\n        JceEcdhWithProvider(\n            Security.getProvider(\"BC\")\n                ?: Class.forName(\"org.bouncycastle.jce.provider.BouncyCastleProvider\")\n                    .getConstructor().newInstance() as Provider // in tests\n        )\n    }"
  },
  {
    "path": "mirai-core/src/androidUnitTest/kotlin/package.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.internal"
  },
  {
    "path": "mirai-core/src/androidUnitTest/kotlin/test/Logger.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.test\n\nimport android.util.Log\nimport net.mamoe.mirai.utils.MiraiLogger\n\n/**\n * Delegate logs to stdout, since android [Log] is not mocked.\n */\nclass JvmLoggerFactory : MiraiLogger.Factory {\n    override fun create(requester: Class<*>, identity: String?): MiraiLogger {\n        @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n        return net.mamoe.mirai.internal.utils.StdoutLogger(identity ?: requester.simpleName)\n    }\n}"
  },
  {
    "path": "mirai-core/src/androidUnitTest/kotlin/test/initializeTestJvm.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.test\n\nimport net.mamoe.mirai.internal.utils.StructureToStringTransformerNew\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.PlatformLogger\nimport net.mamoe.mirai.utils.Services\nimport org.junit.jupiter.api.Test\nimport kotlin.test.assertIsNot\n\ninternal actual fun initializeTestPlatformBeforeCommon() {\n    Services.register(\n        net.mamoe.mirai.utils.StructureToStringTransformer::class.qualifiedName!!,\n        StructureToStringTransformerNew::class.qualifiedName!!,\n        ::StructureToStringTransformerNew\n    )\n    Services.registerAsOverride(\n        MiraiLogger.Factory::class.qualifiedName!!,\n        \"net.mamoe.mirai.utils.MiraiLogger.Factory\"\n    ) {\n        JvmLoggerFactory()\n    }\n\n    // force override\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n    net.mamoe.mirai.utils.MiraiLoggerFactoryImplementationBridge.setInstance(JvmLoggerFactory())\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n    net.mamoe.mirai.utils.MiraiLoggerFactoryImplementationBridge.freeze()\n\n    println(\"[testFramework] Initialized loggers using JvmLoggerFactory\")\n\n\n}\n\ninternal class AndroidUnitTestPlatformTest : AbstractTest() {\n    @Test\n    fun usesStdoutLogger() {\n        // PlatformLogger uses android.util.Log and will fail\n        assertIsNot<PlatformLogger>(MiraiLogger.Factory.create(this::class))\n    }\n}"
  },
  {
    "path": "mirai-core/src/androidUnitTest/kotlin/testFramework/currentPlatform.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework\n\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport org.junit.jupiter.api.Test\nimport kotlin.test.assertIs\n\nactual fun currentPlatform(): Platform = when (System.getenv(\"mirai.android.sdk.kind\")) {\n    \"jdk\" -> Platform.AndroidUnitTestWithJdk\n    \"adk\" -> Platform.AndroidUnitTestWithAdk\n    else -> throw IllegalStateException(\"`mirai.android.sdk.kind` must be `jdk` or `adk`. Ensure you are running tests using Gradle test tasks.\")\n}\n\ninternal class AndroidUnitTestPlatformTest : AbstractTest() {\n\n    @Test\n    fun currentPlatformIsAvailable() {\n        assertIs<Platform.AndroidUnitTest>(currentPlatform())\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/AbstractBot.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\n@file:OptIn(LowLevelApi::class)\n\npackage net.mamoe.mirai.internal\n\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.LowLevelApi\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.contact.ContactList\nimport net.mamoe.mirai.event.EventChannel\nimport net.mamoe.mirai.event.GlobalEventChannel\nimport net.mamoe.mirai.event.events.BotEvent\nimport net.mamoe.mirai.internal.contact.*\nimport net.mamoe.mirai.internal.contact.info.FriendInfoImpl\nimport net.mamoe.mirai.internal.contact.info.StrangerInfoImpl\nimport net.mamoe.mirai.internal.network.component.ComponentStorage\nimport net.mamoe.mirai.internal.network.components.SsoProcessor\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.State\nimport net.mamoe.mirai.internal.network.handler.asCoroutineExceptionHandler\nimport net.mamoe.mirai.internal.network.handler.selector.NetworkException\nimport net.mamoe.mirai.network.LoginFailedException\nimport net.mamoe.mirai.supervisorJob\nimport net.mamoe.mirai.utils.*\nimport kotlin.collections.set\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.jvm.Volatile\n\n/**\n * Protocol-irrelevant implementations\n */\ninternal abstract class AbstractBot(\n    final override val configuration: BotConfiguration,\n    final override val id: Long,\n) : Bot, CoroutineScope {\n    ///////////////////////////////////////////////////////////////////////////\n    // lifecycle\n    ///////////////////////////////////////////////////////////////////////////\n\n    // FASTEST INIT\n    @Suppress(\"LeakingThis\")\n    final override val logger: MiraiLogger = configuration.botLoggerSupplier(this)\n\n    final override val coroutineContext: CoroutineContext =\n        CoroutineName(\"Bot.$id\")\n            .plus(logger.asCoroutineExceptionHandler())\n            .childScopeContext(configuration.parentCoroutineContext)\n            .apply {\n                job.invokeOnCompletion { throwable ->\n                    logger.info { \"Bot cancelled\" + throwable?.message?.let { \": $it\" }.orEmpty() }\n\n                    kotlin.runCatching {\n                        val bot = bot\n                        if (bot is AbstractBot && bot.networkInitialized) {\n                            bot.network.close(throwable)\n                        }\n                    }.onFailure {\n                        if (it !is CancellationException) logger.error(it)\n                    }\n\n                    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n                    Bot._instances.remove(id)\n\n                    // help GC release instances\n                    groups.forEach { it.members.delegate.clear() }\n                    groups.delegate.clear() // job is cancelled, so child jobs are to be cancelled\n                    friends.delegate.clear()\n                    strangers.delegate.clear()\n                }\n            }\n\n    init {\n        @Suppress(\"LeakingThis\", \"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n        Bot._instances[this.id] = this\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // overrides\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * Bot level components plus network level components.\n     */\n    abstract val components: ComponentStorage\n\n    final override val isOnline: Boolean get() = if (!networkInitialized) false else network.state == State.OK\n    final override val eventChannel: EventChannel<BotEvent> =\n        GlobalEventChannel.filterIsInstance<BotEvent>().filter { it.bot === this@AbstractBot }\n\n    final override val otherClients: ContactList<OtherClientImpl> = ContactList()\n    final override val friends: ContactList<FriendImpl> = ContactList()\n    final override val groups: ContactList<GroupImpl> = ContactList()\n    final override val strangers: ContactList<StrangerImpl> = ContactList()\n\n    final override val asFriend: FriendImpl by lazy {\n        Mirai.newFriend(this, FriendInfoImpl(uin, \"\", \"\", 0)).cast()\n    } // nick is initialized later on login\n    final override val asStranger: StrangerImpl by lazy {\n        Mirai.newStranger(this, StrangerInfoImpl(bot.id, bot.nick)).cast()\n    }\n    final override var nick: String by asFriend.info::nick\n\n    override fun close(cause: Throwable?) {\n        if (!this.isActive) return\n\n        try {\n            if (networkInitialized) {\n                network.close(cause)\n            }\n        } finally { // ensure CoroutineScope is always closed\n            if (cause == null) {\n                supervisorJob.cancel()\n            } else {\n                supervisorJob.cancel(CancellationException(\"Bot closed\", cause))\n            }\n        }\n    }\n\n    final override fun toString(): String = \"Bot($id)\"\n\n    ///////////////////////////////////////////////////////////////////////////\n    // network\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Volatile\n    var networkInitialized = false\n    val network: NetworkHandler by lazy {\n        createNetworkHandler().also {\n            it.context // ensure components available\n            networkInitialized = true\n        }\n    } // the selector handles renewal of [NetworkHandler]\n\n    final override suspend fun login() {\n        if (!isActive) error(\"Bot is already closed and cannot relogin. Please create a new Bot instance then do login.\")\n        try {\n            network.resumeConnection()\n        } catch (e: Throwable) { // failed to init\n            // lift cause to the top of the exception chain. e.g. LoginFailedException\n            val cause = if (e is NetworkException) {\n                e.unwrapForPublicApi()\n            } else e\n\n            try {\n                // close bot if it hadn't been done during `resumeConnection()`\n                if (!components[SsoProcessor].firstLoginSucceed) {\n                    close(cause) // failed to do first login, close bot\n                } else if (cause is LoginFailedException && cause.killBot) {\n                    close(cause) // re-login failed and has caused bot being somehow killed by server\n                }\n            } catch (errorInClose: Throwable) {\n                errorInClose.addSuppressed(cause)\n                throw errorInClose\n            }\n\n            throw cause\n        }\n        logger.info { \"Bot login successful.\" }\n    }\n\n    protected abstract fun createNetworkHandler(): NetworkHandler\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/BotAccount.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n@file:Suppress(\"EXPERIMENTAL_API_USAGE\", \"DEPRECATION_ERROR\")\n\npackage net.mamoe.mirai.internal\n\nimport net.mamoe.mirai.auth.BotAuthorization\nimport net.mamoe.mirai.utils.SecretsProtection\nimport net.mamoe.mirai.utils.TestOnly\n\n\ninternal class BotAccount(\n    internal val id: Long,\n    authorization: BotAuthorization,\n) {\n    var authorization: BotAuthorization = authorization\n        // FIXME: Making this mutable is very bad. \n        //  But I had to do this because the current test framework is bad, and I don't have time to do a major rewrite. \n        @TestOnly set\n\n    @TestOnly // to be compatible with your local tests :)\n    constructor(\n        id: Long, pwd: String\n    ) : this(id, BotAuthorization.byPassword(pwd))\n\n    var accountSecretsKeyBuffer: SecretsProtection.EscapedByteBuffer? = null\n\n    val accountSecretsKey: ByteArray\n        get() {\n            accountSecretsKeyBuffer?.let { return it.asByteArray }\n            error(\"accountSecretsKey not yet available\")\n        }\n\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/BotFactory.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n@file:Suppress(\n    \"FunctionName\", \"INAPPLICABLE_JVM_NAME\", \"DEPRECATION_ERROR\", \"DeprecatedCallableAddReplaceWith\",\n    \"OverridingDeprecatedMember\"\n)\n\npackage net.mamoe.mirai.internal\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.BotFactory\nimport net.mamoe.mirai.auth.BotAuthorization\nimport net.mamoe.mirai.utils.BotConfiguration\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\n\n/**\n * QQ for Android\n */\n@DeprecatedSinceMirai(errorSince = \"2.10\", internalSince = \"2.11\")\ninternal object BotFactoryImpl : BotFactory {\n\n    /**\n     * 使用指定的 [配置][configuration] 构造 [Bot] 实例\n     */\n    override fun newBot(qq: Long, password: String, configuration: BotConfiguration): Bot {\n        return QQAndroidBot(BotAccount(qq, BotAuthorization.byPassword(password)), configuration)\n    }\n\n    /**\n     * 使用指定的 [配置][configuration] 构造 [Bot] 实例\n     */\n    override fun newBot(\n        qq: Long,\n        passwordMd5: ByteArray,\n        configuration: BotConfiguration\n    ): Bot = QQAndroidBot(BotAccount(qq, BotAuthorization.byPassword(passwordMd5)), configuration)\n\n    override fun newBot(qq: Long, authorization: BotAuthorization, configuration: BotConfiguration): Bot {\n        return QQAndroidBot(BotAccount(qq, authorization), configuration)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/MiraiImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmName(\"MiraiImplKt_common\")\n\npackage net.mamoe.mirai.internal\n\nimport io.ktor.client.*\nimport io.ktor.client.request.*\nimport io.ktor.client.request.forms.*\nimport io.ktor.client.statement.*\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.json.Json\nimport kotlinx.serialization.json.JsonObject\nimport kotlinx.serialization.json.jsonPrimitive\nimport kotlinx.serialization.json.long\nimport net.mamoe.mirai.*\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.data.*\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.internal.contact.*\nimport net.mamoe.mirai.internal.contact.info.FriendInfoImpl\nimport net.mamoe.mirai.internal.contact.info.FriendInfoImpl.Companion.impl\nimport net.mamoe.mirai.internal.contact.info.MemberInfoImpl\nimport net.mamoe.mirai.internal.contact.info.StrangerInfoImpl.Companion.impl\nimport net.mamoe.mirai.internal.event.EventChannelToEventDispatcherAdapter\nimport net.mamoe.mirai.internal.event.InternalEventMechanism\nimport net.mamoe.mirai.internal.message.DeepMessageRefiner.refineDeep\nimport net.mamoe.mirai.internal.message.EmptyRefineContext\nimport net.mamoe.mirai.internal.message.RefineContext\nimport net.mamoe.mirai.internal.message.SimpleRefineContext\nimport net.mamoe.mirai.internal.message.data.*\nimport net.mamoe.mirai.internal.message.image.*\nimport net.mamoe.mirai.internal.message.source.*\nimport net.mamoe.mirai.internal.message.toMessageChainNoSource\nimport net.mamoe.mirai.internal.network.components.EventDispatcher\nimport net.mamoe.mirai.internal.network.highway.ChannelKind\nimport net.mamoe.mirai.internal.network.highway.ResourceKind\nimport net.mamoe.mirai.internal.network.highway.tryDownload\nimport net.mamoe.mirai.internal.network.highway.tryServersDownload\nimport net.mamoe.mirai.internal.network.protocol.data.jce.SvcDevLoginInfo\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.network.protocol.data.proto.LongMsg\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgTransmit\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.MultiMsg\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.NewContact\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.NudgePacket\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.PbMessageSvc\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.voice.PttStore\nimport net.mamoe.mirai.internal.network.protocol.packet.list.FriendList\nimport net.mamoe.mirai.internal.network.protocol.packet.login.StatSvc\nimport net.mamoe.mirai.internal.network.protocol.packet.summarycard.SummaryCard\nimport net.mamoe.mirai.internal.network.psKey\nimport net.mamoe.mirai.internal.network.sKey\nimport net.mamoe.mirai.internal.utils.MiraiProtocolInternal\nimport net.mamoe.mirai.internal.utils.crypto.TEA\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.message.action.Nudge\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.*\nimport kotlin.jvm.JvmName\n\ninternal fun getMiraiImpl() = Mirai as MiraiImpl\n\ninternal expect fun createDefaultHttpClient(): HttpClient\n\n// used by `net.mamoe.mirai.deps.test.CoreDependencyResolutionTest` in mirai-deps-test module. Do not change signature.\n@Suppress(\"unused\")\n@TestOnly\ninternal fun testHttpClient() {\n    createDefaultHttpClient().close()\n}\n\n@Suppress(\"FunctionName\")\ninternal expect fun _MiraiImpl_static_init()\n\n@OptIn(LowLevelApi::class)\n// not object for ServiceLoader.\ninternal open class MiraiImpl : IMirai, LowLevelApiAccessor {\n    init {\n        _MiraiImpl_static_init() // companion object is lazily initialized on native\n    }\n\n    companion object {\n        init {\n            _MiraiImpl_static_init()\n        }\n    }\n\n    override val BotFactory: BotFactory\n        get() = BotFactoryImpl\n\n    override var FileCacheStrategy: FileCacheStrategy = net.mamoe.mirai.utils.FileCacheStrategy.PlatformDefault\n\n    private val httpClient: HttpClient = createDefaultHttpClient()\n\n    override suspend fun acceptNewFriendRequest(event: NewFriendRequestEvent) {\n        check(!event.bot.friends.contains(event.fromId)) {\n            \"the request $event is outdated: You had already responded it on another device.\"\n        }\n\n        solveNewFriendRequestEvent(\n            event.bot,\n            eventId = event.eventId,\n            fromId = event.fromId,\n            fromNick = event.fromNick,\n            accept = true,\n            blackList = false\n        )\n\n        event.bot.getFriend(event.fromId)?.let { friend ->\n            FriendAddEvent(friend).broadcast()\n        }\n    }\n\n    override suspend fun refreshKeys(bot: Bot) {\n        // TODO: 2021/4/14 MiraiImpl.refreshKeysNow\n    }\n\n    override suspend fun rejectNewFriendRequest(event: NewFriendRequestEvent, blackList: Boolean) {\n        check(!event.bot.friends.contains(event.fromId)) {\n            \"the request $event is outdated: You had already responded it on another device.\"\n        }\n\n        solveNewFriendRequestEvent(\n            event.bot,\n            eventId = event.eventId,\n            fromId = event.fromId,\n            fromNick = event.fromNick,\n            accept = false,\n            blackList = blackList\n        )\n    }\n\n    override suspend fun acceptMemberJoinRequest(event: MemberJoinRequestEvent) {\n        @Suppress(\"DuplicatedCode\")\n        checkGroupPermission(event.bot, event.groupId) { event::class.simpleName ?: \"<anonymous class>\" }\n\n        if (event.group?.contains(event.fromId) == true) return\n\n        solveMemberJoinRequestEvent(\n            bot = event.bot,\n            eventId = event.eventId,\n            fromId = event.fromId,\n            fromNick = event.fromNick,\n            groupId = event.groupId,\n            accept = true,\n            blackList = false\n        )\n    }\n\n    @Suppress(\"DuplicatedCode\")\n    override suspend fun rejectMemberJoinRequest(event: MemberJoinRequestEvent, blackList: Boolean, message: String) {\n        checkGroupPermission(event.bot, event.groupId) { event::class.simpleName ?: \"<anonymous class>\" }\n\n        if (event.group?.contains(event.fromId) == true) return\n\n        solveMemberJoinRequestEvent(\n            bot = event.bot,\n            eventId = event.eventId,\n            fromId = event.fromId,\n            fromNick = event.fromNick,\n            groupId = event.groupId,\n            accept = false,\n            blackList = blackList,\n            message = message\n        )\n    }\n\n    private inline fun checkGroupPermission(eventBot: Bot, groupId: Long, eventName: () -> String) {\n        val group = eventBot.getGroup(groupId)\n            ?: kotlin.run {\n                error(\n                    \"A ${eventName()} is outdated. Group $groupId not found for bot ${eventBot.id}. \" +\n                            \"This is because bot isn't in the group anymore\"\n                )\n\n            }\n\n        group.checkBotPermission(MemberPermission.ADMINISTRATOR)\n    }\n\n    override suspend fun getOnlineOtherClientsList(bot: Bot, mayIncludeSelf: Boolean): List<OtherClientInfo> {\n        bot.asQQAndroidBot()\n        val response = bot.network.run {\n            bot.network.sendAndExpect(StatSvc.GetDevLoginInfo(bot.client))\n        }\n\n        fun SvcDevLoginInfo.toOtherClientInfo() = OtherClientInfo(\n            iAppId.toInt(),\n            Platform.getByTerminalId(iTerType?.toInt() ?: 0),\n            deviceName.orEmpty(),\n            deviceTypeInfo.orEmpty()\n        )\n\n        return response.deviceList.map { it.toOtherClientInfo() }.let { result ->\n            if (mayIncludeSelf) result else result.filterNot {\n                it.appId == MiraiProtocolInternal[bot.configuration.protocol].id.toInt()\n            }\n        }\n    }\n\n    override suspend fun ignoreMemberJoinRequest(event: MemberJoinRequestEvent, blackList: Boolean) {\n        checkGroupPermission(event.bot, event.groupId) { event::class.simpleName ?: \"<anonymous class>\" }\n\n        solveMemberJoinRequestEvent(\n            bot = event.bot,\n            eventId = event.eventId,\n            fromId = event.fromId,\n            fromNick = event.fromNick,\n            groupId = event.groupId,\n            accept = null,\n            blackList = blackList\n        )\n    }\n\n    override suspend fun acceptInvitedJoinGroupRequest(event: BotInvitedJoinGroupRequestEvent) =\n        solveInvitedJoinGroupRequest(event, accept = true)\n\n    override suspend fun ignoreInvitedJoinGroupRequest(event: BotInvitedJoinGroupRequestEvent) =\n        solveInvitedJoinGroupRequest(event, accept = false)\n\n    @OptIn(InternalEventMechanism::class)\n    override suspend fun broadcastEvent(event: Event) {\n        if (event is BotEvent) {\n            val bot = event.bot\n            if (bot is AbstractBot) {\n                bot.components[EventDispatcher].broadcast(event)\n            }\n        } else {\n            EventChannelToEventDispatcherAdapter.instance.broadcastEventImpl(event)\n        }\n    }\n\n    private suspend fun solveInvitedJoinGroupRequest(event: BotInvitedJoinGroupRequestEvent, accept: Boolean) {\n        check(!event.bot.groups.contains(event.groupId)) {\n            \"the request $this is outdated: Bot has been already in the group.\"\n        }\n\n        solveBotInvitedJoinGroupRequestEvent(\n            bot = event.bot,\n            eventId = event.eventId,\n            invitorId = event.invitorId,\n            groupId = event.groupId,\n            accept = accept\n        )\n    }\n\n    @LowLevelApi\n    override fun newFriend(bot: Bot, friendInfo: FriendInfo): FriendImpl {\n        return FriendImpl(\n            bot.asQQAndroidBot(),\n            bot.coroutineContext,\n            friendInfo.impl(),\n        )\n    }\n\n    @LowLevelApi\n    override fun newStranger(bot: Bot, strangerInfo: StrangerInfo): StrangerImpl {\n        return StrangerImpl(\n            bot.asQQAndroidBot(),\n            bot.coroutineContext,\n            strangerInfo.impl(),\n        )\n    }\n\n\n    @OptIn(LowLevelApi::class)\n    override suspend fun getRawGroupList(bot: Bot): Sequence<Long> {\n        bot.asQQAndroidBot()\n        return bot.network.run {\n            bot.network.sendAndExpect(FriendList.GetTroopListSimplify(bot.client))\n        }.groups.asSequence().map { it.groupUin.shl(32) and it.groupCode }\n    }\n\n    @OptIn(LowLevelApi::class)\n    override suspend fun getRawGroupMemberList(\n        bot: Bot,\n        groupUin: Long,\n        groupCode: Long,\n        ownerId: Long\n    ): Sequence<MemberInfo> {\n        var nextUin = 0L\n        var sequence = sequenceOf<MemberInfoImpl>()\n        while (true) {\n            val data = bot.asQQAndroidBot().network.sendAndExpect(\n                FriendList.GetTroopMemberList(\n                    client = bot.client,\n                    targetGroupUin = groupUin,\n                    targetGroupCode = groupCode,\n                    nextUin = nextUin\n                ), 5000, 3\n            )\n            sequence += data.members.asSequence().map { troopMemberInfo ->\n                MemberInfoImpl(bot.client, troopMemberInfo, ownerId)\n            }\n            nextUin = data.nextUin\n            if (nextUin == 0L) {\n                break\n            }\n        }\n        return sequence\n    }\n\n    override suspend fun recallGroupMessageRaw(\n        bot: Bot,\n        groupCode: Long,\n        messageIds: IntArray,\n        messageInternalIds: IntArray,\n    ): Boolean {\n        val response = bot.asQQAndroidBot().network.sendAndExpect(\n            PbMessageSvc.PbMsgWithDraw.createForGroupMessage(\n                bot.client,\n                groupCode,\n                messageIds,\n                messageInternalIds\n            ), 5000, 2\n        )\n\n        return response is PbMessageSvc.PbMsgWithDraw.Response.Success\n    }\n\n    override suspend fun recallFriendMessageRaw(\n        bot: Bot,\n        targetId: Long,\n        messageIds: IntArray,\n        messageInternalIds: IntArray,\n        time: Int,\n    ): Boolean {\n        val response = bot.asQQAndroidBot().network.sendAndExpect(\n            PbMessageSvc.PbMsgWithDraw.createForFriendMessage(\n                bot.client,\n                targetId,\n                messageIds,\n                messageInternalIds,\n                time,\n            ), 5000, 2\n        )\n\n        return response is PbMessageSvc.PbMsgWithDraw.Response.Success\n    }\n\n    override suspend fun recallGroupTempMessageRaw(\n        bot: Bot,\n        groupUin: Long,\n        targetId: Long,\n        messageIds: IntArray,\n        messageInternalIds: IntArray,\n        time: Int\n    ): Boolean {\n        val response = bot.asQQAndroidBot().network.sendAndExpect(\n            PbMessageSvc.PbMsgWithDraw.createForGroupTempMessage(\n                bot.client,\n                groupUin,\n                targetId,\n                messageIds,\n                messageInternalIds,\n                time,\n            ), 5000, 2\n        )\n\n        return response is PbMessageSvc.PbMsgWithDraw.Response.Success\n    }\n\n    override suspend fun recallMessage(bot: Bot, source: MessageSource) = bot.asQQAndroidBot().run {\n        check(source is MessageSourceInternal)\n\n        source.ensureSequenceIdAvailable()\n\n        check(!source.isRecalledOrPlanned && source.setRecalled()) {\n            \"$source had already been recalled.\"\n        }\n\n        val response: PbMessageSvc.PbMsgWithDraw.Response = when (source) {\n            is OnlineMessageSourceToGroupImpl,\n            is OnlineMessageSourceFromGroupImpl\n            -> {\n                val group: Group = when (source) {\n                    is OnlineMessageSourceToGroupImpl -> source.subject\n                    is OnlineMessageSourceFromGroupImpl -> source.subject\n                    else -> error(\"stub\")\n                }\n                if (bot.id != source.fromId) {\n                    // if member leave, messageSource will throw exception(#1661)\n                    when (group[source.fromId]?.permission ?: MemberPermission.MEMBER) {\n                        MemberPermission.MEMBER -> group.checkBotPermission(MemberPermission.ADMINISTRATOR)\n                        MemberPermission.ADMINISTRATOR -> group.checkBotPermission(MemberPermission.OWNER)\n                        // bot cannot be owner\n                        MemberPermission.OWNER -> throw PermissionDeniedException(\"Permission denied: cannot recall message from owner\")\n                    }\n                }\n\n\n                bot.asQQAndroidBot().network.sendAndExpect(\n                    PbMessageSvc.PbMsgWithDraw.createForGroupMessage(\n                        bot.asQQAndroidBot().client,\n                        group.id,\n                        source.sequenceIds,\n                        source.internalIds\n                    ), 5000, 2\n                )\n            }\n            is OnlineMessageSourceFromFriendImpl,\n            is OnlineMessageSourceToFriendImpl,\n            is OnlineMessageSourceFromStrangerImpl,\n            is OnlineMessageSourceToStrangerImpl,\n            -> {\n                check(source.fromId == bot.id) {\n                    \"can only recall a message sent by bot\"\n                }\n                bot.asQQAndroidBot().network.sendAndExpect(\n                    PbMessageSvc.PbMsgWithDraw.createForFriendMessage(\n                        bot.client,\n                        source.targetId,\n                        source.sequenceIds,\n                        source.internalIds,\n                        source.time\n                    ), 5000, 2\n                )\n            }\n            is OnlineMessageSourceFromTempImpl,\n            is OnlineMessageSourceToTempImpl\n            -> {\n                check(source.fromId == bot.id) {\n                    \"can only recall a message sent by bot\"\n                }\n                source as OnlineMessageSourceToTempImpl\n                bot.asQQAndroidBot().network.sendAndExpect(\n                    PbMessageSvc.PbMsgWithDraw.createForGroupTempMessage(\n                        bot.client,\n                        (source.target.group as GroupImpl).uin,\n                        source.targetId,\n                        source.sequenceIds,\n                        source.internalIds,\n                        source.time\n                    ), 5000, 2\n                )\n            }\n            is OfflineMessageSource -> {\n                when (source.kind) {\n                    MessageSourceKind.FRIEND, MessageSourceKind.STRANGER -> {\n                        check(source.fromId == bot.id) {\n                            \"can only recall a message sent by bot\"\n                        }\n                        bot.asQQAndroidBot().network.sendAndExpect(\n                            PbMessageSvc.PbMsgWithDraw.createForFriendMessage(\n                                bot.client,\n                                source.targetId,\n                                source.sequenceIds,\n                                source.internalIds,\n                                source.time\n                            ), 5000, 2\n                        )\n                    }\n                    MessageSourceKind.TEMP -> {\n                        check(source.fromId == bot.id) {\n                            \"can only recall a message sent by bot\"\n                        }\n                        bot.asQQAndroidBot().network.sendAndExpect(\n                            PbMessageSvc.PbMsgWithDraw.createForGroupTempMessage(\n                                bot.client,\n                                source.targetId, // groupUin\n                                source.targetId, // memberUin\n                                source.sequenceIds,\n                                source.internalIds,\n                                source.time\n                            ), 5000, 2\n                        )\n                    }\n                    MessageSourceKind.GROUP -> {\n                        bot.asQQAndroidBot().network.sendAndExpect(\n                            PbMessageSvc.PbMsgWithDraw.createForGroupMessage(\n                                bot.client,\n                                source.targetId,\n                                source.sequenceIds,\n                                source.internalIds\n                            ), 5000, 2\n                        )\n                    }\n                }\n            }\n            else -> error(\"stub!\")\n        }\n\n\n        // 1001: No message meets the requirements (实际上是没权限, 管理员在尝试撤回群主的消息)\n        // 154: timeout\n        // 3: <no message>\n        check(response is PbMessageSvc.PbMsgWithDraw.Response.Success) { \"Failed to recall message #${source.ids.contentToString()}: $response\" }\n    }\n\n    private val json = Json {\n        isLenient = true\n        ignoreUnknownKeys = true\n    }\n\n\n    override suspend fun solveNewFriendRequestEvent(\n        bot: Bot,\n        eventId: Long,\n        fromId: Long,\n        fromNick: String,\n        accept: Boolean,\n        blackList: Boolean\n    ): Unit = bot.asQQAndroidBot().run {\n        network.sendWithoutExpect(\n            NewContact.SystemMsgNewFriend.Action(\n                bot.client,\n                eventId = eventId,\n                fromId = fromId,\n                accept = accept,\n                blackList = blackList\n            )\n        )\n\n        if (!accept) return\n\n        @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n        bot.friends.delegate.add(newFriend(bot, FriendInfoImpl(fromId, fromNick, \"\", 0)))\n    }\n\n    override suspend fun solveBotInvitedJoinGroupRequestEvent(\n        bot: Bot,\n        eventId: Long,\n        invitorId: Long,\n        groupId: Long,\n        accept: Boolean\n    ) {\n        bot.asQQAndroidBot().network.sendWithoutExpect(\n            NewContact.SystemMsgNewGroup.Action(\n                bot.client,\n                eventId = eventId,\n                fromId = invitorId,\n                groupId = groupId,\n                isInvited = true,\n                accept = accept\n            )\n        )\n    }\n\n    override suspend fun solveMemberJoinRequestEvent(\n        bot: Bot,\n        eventId: Long,\n        fromId: Long,\n        fromNick: String,\n        groupId: Long,\n        accept: Boolean?,\n        blackList: Boolean,\n        message: String\n    ) {\n        bot.asQQAndroidBot().network.sendWithoutExpect(\n            NewContact.SystemMsgNewGroup.Action(\n                bot.client,\n                eventId = eventId,\n                fromId = fromId,\n                groupId = groupId,\n                isInvited = false,\n                accept = accept,\n                blackList = blackList,\n                message = message\n            )\n        )\n        // Add member in MsgOnlinePush.PbPushMsg\n    }\n\n    @LowLevelApi\n    override suspend fun getGroupVoiceDownloadUrl(\n        bot: Bot,\n        md5: ByteArray,\n        groupId: Long,\n        dstUin: Long\n    ): String {\n        val response = bot.asQQAndroidBot().network.sendAndExpect(\n            PttStore.GroupPttDown(bot.client, groupId, dstUin, md5),\n            5000,\n            2\n        )\n        return \"http://${response.strDomain}${response.downPara.decodeToString()}\"\n    }\n\n    override suspend fun muteAnonymousMember(\n        bot: Bot,\n        anonymousId: String,\n        anonymousNick: String,\n        groupId: Long,\n        seconds: Int\n    ) {\n        bot as QQAndroidBot\n        val response = httpClient.post {\n            url(\"https://qqweb.qq.com/c/anonymoustalk/blacklist\")\n            setBody(\n                MultiPartFormDataContent(formData {\n                    append(\"anony_id\", anonymousId)\n                    append(\"group_code\", groupId)\n                    append(\"seconds\", seconds)\n                    append(\"anony_nick\", anonymousNick)\n                    append(\"bkn\", bot.client.wLoginSigInfo.bkn)\n                })\n            )\n            headers {\n                // ktor bug\n                append(\n                    \"cookie\",\n                    \"uin=o${bot.id}; skey=${bot.sKey}; p_uin=o${bot.id}; p_skey=${bot.psKey(host)};\"\n                )\n            }\n        }.bodyAsText()\n        val jsonObj = Json.decodeFromString(JsonObject.serializer(), response)\n        if ((jsonObj[\"retcode\"] ?: jsonObj[\"cgicode\"] ?: error(\"missing response code\")).jsonPrimitive.long != 0L) {\n            throw IllegalStateException(response)\n        }\n    }\n\n    override fun createFileMessage(id: String, internalId: Int, name: String, size: Long): FileMessage {\n        return FileMessageImpl(id, internalId, name, size)\n    }\n\n    override fun createUnsupportedMessage(struct: ByteArray): UnsupportedMessage =\n        UnsupportedMessageImpl(struct.loadAs(ImMsgBody.Elem.serializer()))\n\n    @Suppress(\"OverridingDeprecatedMember\")\n    override suspend fun queryImageUrl(bot: Bot, image: Image): String = when (image) {\n        is ConstOriginUrlAware -> image.originUrl\n        is DeferredOriginUrlAware -> image.getUrl(bot)\n        is SuspendDeferredOriginUrlAware -> image.getUrl(bot)\n        else -> error(\"Internal error: unsupported image class: ${image::class.simpleName}\")\n    }\n\n    override suspend fun queryProfile(bot: Bot, targetId: Long): UserProfile {\n\n        return bot.asQQAndroidBot().network.sendAndExpect(\n            SummaryCard.ReqSummaryCard(bot.client, targetId),\n            5000, 2\n        )\n    }\n\n    override suspend fun sendNudge(bot: Bot, nudge: Nudge, receiver: Contact): Boolean {\n        if (!bot.configuration.protocol.isNudgeSupported) {\n            throw UnsupportedOperationException(\"nudge is supported only with protocol ${\n                MiraiProtocolInternal.protocols.filter { it.value.supportsNudge }.map { it.key }\n            }\")\n        }\n        bot.asQQAndroidBot()\n\n        bot.network.run {\n            return if (receiver is Group) {\n                receiver.checkIsGroupImpl()\n                bot.network.sendAndExpect(\n                    NudgePacket.troopInvoke(\n                        client = bot.client,\n                        messageReceiverGroupCode = receiver.id,\n                        nudgeTargetId = nudge.target.id,\n                    )\n                ).success\n            } else {\n                bot.network.sendAndExpect(\n                    NudgePacket.friendInvoke(\n                        client = bot.client,\n                        messageReceiverUin = receiver.id,\n                        nudgeTargetId = nudge.target.id,\n                    )\n                ).success\n            }\n        }\n    }\n\n    override fun getUin(contactOrBot: ContactOrBot): Long {\n        return when (contactOrBot) {\n            is Group -> contactOrBot.uin\n            is User -> contactOrBot.uin\n            is Bot -> contactOrBot.uin\n            else -> contactOrBot.id\n        }\n    }\n\n    override fun constructMessageSource(\n        botId: Long,\n        kind: MessageSourceKind,\n        fromId: Long,\n        targetId: Long,\n        ids: IntArray,\n        time: Int,\n        internalIds: IntArray,\n        originalMessage: MessageChain\n    ): OfflineMessageSource = OfflineMessageSourceImplData(\n        kind, ids, botId, time, fromId, targetId, originalMessage, internalIds\n    )\n\n    override suspend fun downloadLongMessage(bot: Bot, resourceId: String): MessageChain {\n        try {\n            return downloadMultiMsgTransmit(bot, resourceId, ResourceKind.LONG_MESSAGE).msg\n                .toMessageChainNoSource(bot, 0, MessageSourceKind.GROUP)\n                .refineDeep(bot)\n        } catch (error: Throwable) {\n            throw IllegalStateException(\"Failed to download long message `$resourceId`\", error)\n        }\n    }\n\n    override suspend fun downloadForwardMessage(bot: Bot, resourceId: String): List<ForwardMessage.Node> {\n        try {\n            return downloadMultiMsgTransmit(bot, resourceId, ResourceKind.FORWARD_MESSAGE).toForwardMessageNodes(bot)\n        } catch (error: Throwable) {\n            throw IllegalStateException(\"Failed to download forward message `$resourceId`\", error)\n        }\n    }\n\n    internal open suspend fun MsgTransmit.PbMultiMsgNew.toForwardMessageNodes(\n        bot: Bot,\n        context: RefineContext\n    ): List<ForwardMessage.Node> {\n        return msg.map { it.toNode(bot, context) }\n    }\n\n    internal open suspend fun MsgTransmit.PbMultiMsgTransmit.toForwardMessageNodes(bot: Bot): List<ForwardMessage.Node> {\n        val pbs = this.pbItemList.associate {\n            it.fileName to it.buffer.loadAs(MsgTransmit.PbMultiMsgNew.serializer())\n        }\n        val main = pbs[\"MultiMsg\"] ?: return this.msg.map { it.toNode(bot, EmptyRefineContext) }\n        return main.toForwardMessageNodes(bot, SimpleRefineContext(ForwardMessageInternal.MsgTransmits to pbs))\n    }\n\n    private suspend fun MsgComm.Msg.toNode(bot: Bot, refineContext: RefineContext): ForwardMessage.Node {\n        val msg = this\n\n        @Suppress(\"USELESS_CAST\") // compiler bug, do not remove\n        val senderName = (msg.msgHead.groupInfo?.groupCard\n            ?: msg.msgHead.fromNick.takeIf { it.isNotEmpty() }\n            ?: msg.msgHead.fromUin.toString()) as String\n        val chain = listOf(msg)\n            .toMessageChainNoSource(bot, 0, MessageSourceKind.GROUP)\n            .refineDeep(bot, refineContext)\n        return ForwardMessage.Node(\n            senderId = msg.msgHead.fromUin,\n            time = msg.msgHead.msgTime,\n            senderName = senderName,\n            messageChain = chain\n        )\n    }\n\n    private suspend fun downloadMultiMsgTransmit(\n        bot: Bot,\n        resourceId: String,\n        resourceKind: ResourceKind,\n    ): MsgTransmit.PbMultiMsgTransmit {\n        bot.asQQAndroidBot()\n        when (val resp = bot.network.sendAndExpect(MultiMsg.ApplyDown(bot.client, 2, resourceId, 1))) {\n            is MultiMsg.ApplyDown.Response.RequireDownload -> {\n                val origin = resp.origin\n\n                val data: ByteArray = if (origin.msgExternInfo?.channelType == 2) {\n                    tryDownload(\n                        bot = bot,\n                        host = \"https://ssl.htdata.qq.com\",\n                        port = 443,\n                        times = 3,\n                        resourceKind = resourceKind,\n                        channelKind = ChannelKind.HTTP\n                    ) { host, _ ->\n                        httpClient.get(\"$host${origin.thumbDownPara}\")\n                    }.readBytes()\n                } else tryServersDownload(\n                    bot = bot,\n                    servers = origin.uint32DownIp.zip(origin.uint32DownPort),\n                    resourceKind = resourceKind,\n                    channelKind = ChannelKind.HTTP\n                ) { ip, port ->\n                    httpClient.get(\"http://$ip:$port${origin.thumbDownPara}\")\n                }.readBytes()\n\n                val body = data.read {\n                    check(readByte() == 40.toByte()) {\n                        \"bad data while MultiMsg.ApplyDown: ${data.toUHexString()}\"\n                    }\n                    val headLength = readInt()\n                    val bodyLength = readInt()\n                    discardExact(headLength)\n                    readBytes(bodyLength)\n                }\n\n                val decrypted = TEA.decrypt(body, origin.msgKey)\n                val longResp =\n                    decrypted.loadAs(LongMsg.RspBody.serializer())\n\n                val down = longResp.msgDownRsp.single()\n                check(down.result == 0) {\n                    \"Message download failed, result=${down.result}, resId=${down.msgResid.decodeToString()}, msgContent=${down.msgContent.toUHexString()}\"\n                }\n\n                val content = down.msgContent.ungzip()\n                return content.loadAs(MsgTransmit.PbMultiMsgTransmit.serializer())\n            }\n            MultiMsg.ApplyDown.Response.MessageTooLarge -> {\n                error(\"Message is too large and cannot download\")\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/QQAndroidBot.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal\n\nimport kotlinx.atomicfu.atomic\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.auth.AuthReason\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.BotOfflineEvent\nimport net.mamoe.mirai.event.events.BotOnlineEvent\nimport net.mamoe.mirai.event.events.BotReloginEvent\nimport net.mamoe.mirai.internal.contact.friendgroup.FriendGroupsImpl\nimport net.mamoe.mirai.internal.network.component.ComponentStorage\nimport net.mamoe.mirai.internal.network.component.ComponentStorageDelegate\nimport net.mamoe.mirai.internal.network.component.ConcurrentComponentStorage\nimport net.mamoe.mirai.internal.network.component.withFallback\nimport net.mamoe.mirai.internal.network.components.*\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.State\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerContextImpl\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerFactory\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport.BaseStateImpl\nimport net.mamoe.mirai.internal.network.handler.selector.KeepAliveNetworkHandlerSelector\nimport net.mamoe.mirai.internal.network.handler.selector.NetworkException\nimport net.mamoe.mirai.internal.network.handler.selector.SelectorNetworkHandler\nimport net.mamoe.mirai.internal.network.handler.state.CombinedStateObserver.Companion.plus\nimport net.mamoe.mirai.internal.network.handler.state.LoggingStateObserver\nimport net.mamoe.mirai.internal.network.handler.state.StateChangedObserver\nimport net.mamoe.mirai.internal.network.handler.state.StateObserver\nimport net.mamoe.mirai.internal.network.handler.state.safe\nimport net.mamoe.mirai.internal.network.impl.ForceOfflineException\nimport net.mamoe.mirai.internal.network.notice.TraceLoggingNoticeProcessor\nimport net.mamoe.mirai.internal.network.notice.UnconsumedNoticesAlerter\nimport net.mamoe.mirai.internal.network.notice.decoders.GroupNotificationDecoder\nimport net.mamoe.mirai.internal.network.notice.decoders.MsgInfoDecoder\nimport net.mamoe.mirai.internal.network.notice.group.GroupMessageProcessor\nimport net.mamoe.mirai.internal.network.notice.group.GroupNotificationProcessor\nimport net.mamoe.mirai.internal.network.notice.group.GroupOrMemberListNoticeProcessor\nimport net.mamoe.mirai.internal.network.notice.group.GroupRecallProcessor\nimport net.mamoe.mirai.internal.network.notice.priv.FriendGroupNoticeProcessor\nimport net.mamoe.mirai.internal.network.notice.priv.FriendNoticeProcessor\nimport net.mamoe.mirai.internal.network.notice.priv.OtherClientNoticeProcessor\nimport net.mamoe.mirai.internal.network.notice.priv.PrivateMessageProcessor\nimport net.mamoe.mirai.internal.network.protocol.packet.login.StatSvc\nimport net.mamoe.mirai.internal.utils.ImagePatcher\nimport net.mamoe.mirai.internal.utils.ImagePatcherImpl\nimport net.mamoe.mirai.internal.utils.actualCacheDir\nimport net.mamoe.mirai.internal.utils.subLogger\nimport net.mamoe.mirai.utils.BotConfiguration\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.lateinitMutableProperty\nimport kotlin.contracts.contract\nimport kotlin.time.Duration.Companion.seconds\n\ninternal fun Bot.asQQAndroidBot(): QQAndroidBot {\n    contract {\n        returns() implies (this@asQQAndroidBot is QQAndroidBot)\n    }\n\n    return this as QQAndroidBot\n}\n\n@Suppress(\"INVISIBLE_MEMBER\", \"BooleanLiteralArgument\", \"OverridingDeprecatedMember\")\ninternal open class QQAndroidBot constructor(\n    internal val account: BotAccount,\n    configuration: BotConfiguration,\n) : AbstractBot(configuration, account.id) {\n    override val bot: QQAndroidBot get() = this\n    override val friendGroups: FriendGroupsImpl by lazy { FriendGroupsImpl(this) }\n\n    val client get() = components[SsoProcessor].client\n\n    private val closing = atomic(false)\n    override fun close(cause: Throwable?) {\n        if (!this.isActive) return\n        if (!closing.compareAndSet(false, true)) return\n\n        if (networkInitialized) {\n            runBlocking {\n                try { // this may not be very good but\n                    withTimeoutOrNull(5.seconds) {\n                        components[SsoProcessor].logout(network)\n                    }\n                } catch (ignored: Exception) {\n                }\n            }\n        }\n\n        super.close(cause)\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // network\n    ///////////////////////////////////////////////////////////////////////////\n\n    // also called by tests.\n    fun ComponentStorage.stateObserverChain(): StateObserver {\n        val components = this\n        val eventDispatcher = this[EventDispatcher]\n        return StateObserver.chainOfNotNull(\n            components[BotInitProcessor].asObserver(),\n            object : StateChangedObserver(State.OK) {\n                private val shouldBroadcastRelogin = atomic(false)\n\n                override fun stateChanged0(\n                    networkHandler: NetworkHandlerSupport,\n                    previous: BaseStateImpl,\n                    new: BaseStateImpl,\n                ) {\n                    eventDispatcher.broadcastAsync(BotOnlineEvent(bot)).thenBroadcast(eventDispatcher) {\n                        if (!shouldBroadcastRelogin.compareAndSet(false, true)) {\n                            BotReloginEvent(bot, new.getCause())\n                        } else null\n                    }\n                }\n\n                override fun toString(): String = \"StateChangedObserver(BotOnlineEventBroadcaster)\"\n            },\n            StateChangedObserver(\"LastConnectedAddressUpdater\", State.OK) {\n                components[ServerList].run {\n                    lastConnectedIP = getLastPolledIP()\n                }\n            },\n            StateChangedObserver(\"LastDisconnectedAddressUpdater\", State.CLOSED) {\n                components[ServerList].run {\n                    lastDisconnectedIP = lastConnectedIP\n                }\n            },\n            StateChangedObserver(\"BotOfflineEventBroadcasterAfter\", State.OK, State.CLOSED) { new ->\n                // logging performed by BotOfflineEventMonitor\n                val cause = new.getCause()\n                when {\n                    cause is ForceOfflineException -> {\n                        eventDispatcher.broadcastAsync(BotOfflineEvent.Force(bot, cause.title, cause.message))\n                    }\n\n                    cause is StatSvc.ReqMSFOffline.MsfOfflineToken -> {\n                        eventDispatcher.broadcastAsync(BotOfflineEvent.MsfOffline(bot, cause))\n                    }\n\n                    cause is NetworkException && cause.recoverable -> {\n                        eventDispatcher.broadcastAsync(BotOfflineEvent.Dropped(bot, cause))\n                    }\n\n                    cause is BotClosedByEvent -> {\n                    }\n\n                    else -> {\n                        // any other unexpected exceptions considered as an error\n\n                        // When bot is closed, eventDispatcher.isActive will be false.\n                        // While in TestEventDispatcherImpl, eventDispatcher.isActive will always be true to enable catching the event.\n                        if (eventDispatcher.isActive) {\n                            eventDispatcher.broadcastAsync { BotOfflineEvent.Active(bot, cause) }\n                        } else {\n                            @OptIn(DelicateCoroutinesApi::class)\n                            GlobalScope.launch {\n                                BotOfflineEvent.Active(bot, cause).broadcast()\n                            }\n                        }\n                    }\n                }\n            },\n            StateChangedObserver(\"ReLoginCauseCatcher\", State.OK, State.CLOSED) { new ->\n                get(SsoProcessor).authReason = when (val cause = new.getCause()) {\n                    is ForceOfflineException -> AuthReason.ForceOffline(bot, cause.message)\n                    is StatSvc.ReqMSFOffline.MsfOfflineToken -> AuthReason.MsfOffline(bot, cause.message)\n                    is NetworkException -> AuthReason.NetworkError(bot, cause.message)\n                    else -> AuthReason.Unknown(bot, cause)\n                }\n            },\n            StateChangedObserver(\"FirstLoginObserver\", State.OK) {\n                get(SsoProcessor).isFirstLogin = false\n            }\n        ).safe(logger.subLogger(\"StateObserver\")) + LoggingStateObserver.createLoggingIfEnabled()\n    }\n\n\n    private val networkLogger: MiraiLogger by lazy { configuration.networkLoggerSupplier(this) }\n    final override val components: ComponentStorage get() = network.context\n\n    private val defaultBotLevelComponents: ComponentStorage by lateinitMutableProperty {\n        createBotLevelComponents().apply {\n            set(StateObserver, stateObserverChain())\n        }.also { components ->\n            components[BotOfflineEventMonitor].attachJob(bot, this)\n        }\n    }\n\n    open fun createBotLevelComponents(): ConcurrentComponentStorage = ConcurrentComponentStorage {\n        val components = ComponentStorageDelegate { this@QQAndroidBot.components }\n\n        // There's no need to interrupt a broadcasting event when network handler closed.\n        set(EventDispatcher, EventDispatcherImpl(bot.coroutineContext, logger.subLogger(\"EventDispatcher\")))\n\n        val pipelineLogger = networkLogger.subLogger(\"NoticeProcessor\") //  shorten name\n        set(\n            NoticeProcessorPipeline,\n            NoticeProcessorPipelineImpl.create(\n                bot,\n                MsgInfoDecoder(pipelineLogger.subLogger(\"MsgInfoDecoder\")),\n                GroupNotificationDecoder(),\n\n                FriendNoticeProcessor(pipelineLogger.subLogger(\"FriendNoticeProcessor\")),\n                GroupOrMemberListNoticeProcessor(pipelineLogger.subLogger(\"GroupOrMemberListNoticeProcessor\")),\n                GroupMessageProcessor(pipelineLogger.subLogger(\"GroupMessageProcessor\")),\n                GroupNotificationProcessor(pipelineLogger.subLogger(\"GroupNotificationProcessor\")),\n                FriendGroupNoticeProcessor(pipelineLogger.subLogger(\"FriendGroupNoticeProcessor\")),\n                PrivateMessageProcessor(),\n                OtherClientNoticeProcessor(),\n                GroupRecallProcessor(),\n                UnconsumedNoticesAlerter(pipelineLogger.subLogger(\"UnconsumedNoticesAlerter\")),\n                TraceLoggingNoticeProcessor(pipelineLogger.subLogger(\"TraceLoggingNoticeProcessor\"))\n            )\n        )\n\n        set(SsoProcessorContext, SsoProcessorContextImpl(bot))\n        set(SsoProcessor, SsoProcessorImpl(get(SsoProcessorContext)))\n        set(\n            QRCodeLoginProcessor,\n            QRCodeLoginProcessor.parse(get(SsoProcessorContext), networkLogger.subLogger(\"QRCodeLoginProcessor\"))\n        )\n\n        val cacheValidator = CacheValidatorImpl(\n            get(SsoProcessorContext),\n            configuration.actualCacheDir().resolve(\"validator.bin\"),\n            networkLogger.subLogger(\"CacheValidator\"),\n        )\n        set(CacheValidator, cacheValidator)\n\n        set(HeartbeatProcessor, HeartbeatProcessorImpl())\n        set(HeartbeatScheduler, TimeBasedHeartbeatSchedulerImpl(networkLogger.subLogger(\"HeartbeatScheduler\")))\n        set(HttpClientProvider, HttpClientProviderImpl())\n        set(KeyRefreshProcessor, KeyRefreshProcessorImpl(networkLogger.subLogger(\"KeyRefreshProcessor\")))\n        set(ConfigPushProcessor, ConfigPushProcessorImpl(networkLogger.subLogger(\"ConfigPushProcessor\")))\n        set(BotOfflineEventMonitor, BotOfflineEventMonitorImpl())\n\n        set(BotInitProcessor, BotInitProcessorImpl(bot, components, networkLogger.subLogger(\"BotInitProcessor\")))\n        set(ContactCacheService, ContactCacheServiceImpl(bot, networkLogger.subLogger(\"ContactCacheService\")))\n        set(ContactUpdater, ContactUpdaterImpl(bot, components, networkLogger.subLogger(\"ContactUpdater\")))\n        set(\n            BdhSessionSyncer,\n            BdhSessionSyncerImpl(configuration, components, networkLogger.subLogger(\"BotSessionSyncer\")),\n        )\n        set(\n            MessageSvcSyncer,\n            MessageSvcSyncerImpl(bot, bot.coroutineContext, networkLogger.subLogger(\"MessageSvcSyncer\")),\n        )\n        set(\n            EcdhInitialPublicKeyUpdater,\n            EcdhInitialPublicKeyUpdaterImpl(bot, networkLogger.subLogger(\"ECDHInitialPublicKeyUpdater\")),\n        )\n        set(ServerList, ServerListImpl(networkLogger.subLogger(\"ServerList\")))\n        set(PacketLoggingStrategy, PacketLoggingStrategyImpl(bot))\n        set(\n            PacketHandler,\n            PacketHandlerChain(\n                EventBroadcasterPacketHandler(components),\n                CallPacketFactoryPacketHandler(bot),\n                LoggingPacketHandlerAdapter(get(PacketLoggingStrategy), networkLogger),\n            ),\n        )\n        set(PacketCodec, PacketCodecImpl())\n        set(\n            OtherClientUpdater,\n            OtherClientUpdaterImpl(bot, components, networkLogger.subLogger(\"OtherClientUpdater\")),\n        )\n        set(ConfigPushSyncer, ConfigPushSyncerImpl())\n        set(\n            AccountSecretsManager,\n            configuration.createAccountsSecretsManager(bot.logger.subLogger(\"AccountSecretsManager\")),\n        )\n        set(ImagePatcher, ImagePatcherImpl())\n\n        cacheValidator.register(get(AccountSecretsManager))\n        cacheValidator.register(get(BdhSessionSyncer))\n\n        set(\n            EncryptServiceHolder, EncryptServiceHolderImpl(this@QQAndroidBot, get(SsoProcessorContext))\n        )\n    }\n\n    /**\n     * This would overrides those from [createBotLevelComponents]\n     */\n    open fun createNetworkLevelComponents(): ComponentStorage {\n        return ConcurrentComponentStorage {\n            set(BotClientHolder, BotClientHolderImpl(bot, networkLogger.subLogger(\"BotClientHolder\")))\n            set(SyncController, SyncControllerImpl())\n            set(ClockHolder, ClockHolder())\n        }.withFallback(defaultBotLevelComponents)\n    }\n\n    override fun createNetworkHandler(): NetworkHandler {\n        return SelectorNetworkHandler(\n            KeepAliveNetworkHandlerSelector(\n                maxAttempts = configuration.reconnectionRetryTimes.coerceIn(1, Int.MAX_VALUE),\n                logger = networkLogger.subLogger(\"Selector\")\n            ) {\n                val context = NetworkHandlerContextImpl(\n                    bot,\n                    networkLogger,\n                    createNetworkLevelComponents(),\n                )\n                NetworkHandlerFactory.getPlatformDefault().create(\n                    context,\n                    context[ServerList].pollAny().toSocketAddress(),\n                )\n            },\n        ) // We can move the factory to configuration but this is not necessary for now.\n    }\n}\n\ninternal fun QQAndroidBot.getGroupByUinOrFail(uin: Long) =\n    getGroupByUin(uin) ?: throw NoSuchElementException(\"group.uin=$uin\")\n\ninternal fun QQAndroidBot.getGroupByUin(uin: Long) = groups.firstOrNull { it.uin == uin }\n\n/**\n * uin first\n */\ninternal fun QQAndroidBot.getGroupByUinOrCode(uinOrCode: Long) =\n    groups.firstOrNull { it.uin == uinOrCode } ?: groups.firstOrNull { it.id == uinOrCode }\n\n/**\n * uin first\n */\ninternal fun QQAndroidBot.getGroupByUinOrCodeOrFail(uinOrCode: Long) =\n    getGroupByUinOrCode(uinOrCode) ?: throw NoSuchElementException(\"group.code or uin=$uinOrCode\")\n\n\n/**\n * code first\n */\ninternal fun QQAndroidBot.getGroupByCodeOrUin(uinOrCode: Long) =\n    groups.firstOrNull { it.id == uinOrCode } ?: groups.firstOrNull { it.uin == uinOrCode }\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/AbstractContact.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.BeforeShortVideoUploadEvent\nimport net.mamoe.mirai.event.events.EventCancelledException\nimport net.mamoe.mirai.event.events.ShortVideoUploadEvent\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.message.data.OfflineShortVideoImpl\nimport net.mamoe.mirai.internal.message.data.ShortVideoThumbnail\nimport net.mamoe.mirai.internal.message.image.calculateImageInfo\nimport net.mamoe.mirai.internal.network.highway.Highway\nimport net.mamoe.mirai.internal.network.highway.ResourceKind\nimport net.mamoe.mirai.internal.network.protocol.data.proto.PttShortVideo\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.video.PttCenterSvr\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf\nimport net.mamoe.mirai.message.data.ShortVideo\nimport net.mamoe.mirai.internal.utils.CombinedExternalResource\nimport net.mamoe.mirai.utils.*\nimport kotlin.contracts.contract\nimport kotlin.coroutines.CoroutineContext\n\ninternal abstract class AbstractContact(\n    final override val bot: QQAndroidBot,\n    parentCoroutineContext: CoroutineContext,\n) : Contact {\n    final override val coroutineContext: CoroutineContext = parentCoroutineContext.childScopeContext()\n\n    override suspend fun uploadShortVideo(\n        thumbnail: ExternalResource,\n        video: ExternalResource,\n        fileName: String?\n    ): ShortVideo = thumbnail.withAutoClose {\n        video.withAutoClose {\n            if (this !is Group && this !is Friend) {\n                throw UnsupportedOperationException(\"short video can only upload to friend or group.\")\n            }\n\n            if (video.formatName != \"mp4\") {\n                throw UnsupportedOperationException(\"video format ${video.formatName} is not supported.\")\n            }\n\n            if (BeforeShortVideoUploadEvent(this, thumbnail, video).broadcast().isCancelled) {\n                throw EventCancelledException(\"cancelled by BeforeShortVideoUploadEvent\")\n            }\n\n            // local uploaded offline short video uses video file md5 as its file name by default\n            val videoName = fileName ?: video.md5.toUHexString(\"\")\n\n            val uploadResp = bot.network.sendAndExpect(\n                PttCenterSvr.GroupShortVideoUpReq(\n                    client = bot.client,\n                    contact = this,\n                    thumbnailFileMd5 = thumbnail.md5,\n                    thumbnailFileSize = thumbnail.size,\n                    videoFileName = videoName,\n                    videoFileMd5 = video.md5,\n                    videoFileSize = video.size,\n                    videoFileFormat = video.formatName\n                )\n            )\n\n            // get thumbnail image width and height\n            val thumbnailInfo = thumbnail.calculateImageInfo()\n\n            // fast path\n            if (uploadResp is PttCenterSvr.GroupShortVideoUpReq.Response.FileExists) {\n                return OfflineShortVideoImpl(\n                    uploadResp.fileId,\n                    videoName,\n                    video.md5,\n                    video.size,\n                    video.formatName,\n                    ShortVideoThumbnail(\n                        thumbnail.md5,\n                        thumbnail.size,\n                        thumbnailInfo.width,\n                        thumbnailInfo.height\n                    )\n                ).also {\n                    ShortVideoUploadEvent.Succeed(this, thumbnail, video, it).broadcast()\n                }\n            }\n\n            val highwayRespExt = CombinedExternalResource(thumbnail, video).use { resource ->\n                Highway.uploadResourceBdh(\n                    bot = bot,\n                    resource = resource,\n                    kind = ResourceKind.SHORT_VIDEO,\n                    commandId = 25,\n                    extendInfo = buildPacket {\n                        writeProtoBuf(\n                            PttShortVideo.PttShortVideoUploadReq.serializer(),\n                            PttCenterSvr.GroupShortVideoUpReq.buildShortVideoFileInfo(\n                                client = bot.client,\n                                contact = this@AbstractContact,\n                                thumbnailFileMd5 = thumbnail.md5,\n                                thumbnailFileSize = thumbnail.size,\n                                videoFileName = videoName,\n                                videoFileMd5 = video.md5,\n                                videoFileSize = video.size,\n                                videoFileFormat = video.formatName\n                            )\n                        )\n                    }.readBytes(),\n                    encrypt = true\n                ).extendInfo\n            }\n\n            if (highwayRespExt == null) {\n                ShortVideoUploadEvent.Failed(\n                    this,\n                    thumbnail,\n                    video,\n                    -1,\n                    \"highway upload short video failed, extendInfo is null.\"\n                ).broadcast()\n                error(\"highway upload short video failed, extendInfo is null.\")\n            }\n\n            val highwayUploadResp = highwayRespExt.loadAs(PttShortVideo.PttShortVideoUploadResp.serializer())\n\n            OfflineShortVideoImpl(\n                highwayUploadResp.fileid,\n                videoName,\n                video.md5,\n                video.size,\n                video.formatName,\n                ShortVideoThumbnail(\n                    thumbnail.md5,\n                    thumbnail.size,\n                    thumbnailInfo.width,\n                    thumbnailInfo.height\n                )\n            ).also {\n                ShortVideoUploadEvent.Succeed(this, thumbnail, video, it).broadcast()\n            }\n        }\n    }\n}\n\ninternal val Contact.userIdOrNull: Long? get() = if (this is User) this.id else null\ninternal val Contact.groupIdOrNull: Long? get() = if (this is Group) this.id else null\ninternal val Contact.groupUinOrNull: Long? get() = if (this is Group) this.uin else null\ninternal val ContactOrBot.uin: Long\n    get() = when (this) {\n        is Group -> uin\n        is User -> uin\n        is OtherClient -> bot.uin\n        is Bot -> id\n        else -> this.id\n    }\n\ninternal fun Contact.impl(): AbstractContact {\n    contract { returns() implies (this@impl is AbstractContact) }\n    return this as AbstractContact\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/AbstractMember.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact\n\nimport net.mamoe.mirai.contact.Member\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.data.MemberInfo\nimport net.mamoe.mirai.internal.contact.info.MemberInfoImpl\nimport net.mamoe.mirai.utils.cast\nimport kotlin.coroutines.CoroutineContext\n\ninternal sealed class AbstractMember(\n    final override val group: GroupImpl,\n    parentCoroutineContext: CoroutineContext,\n    memberInfo: MemberInfo,\n) : AbstractUser(group.bot, parentCoroutineContext, memberInfo), Member {\n\n    final override val info: MemberInfoImpl = memberInfo.cast()\n\n    override var nick: String by info::nick\n    override val remark: String by info::remark\n\n    override val nameCard: String get() = info.nameCard\n    override val specialTitle: String get() = info.specialTitle\n    override val active: MemberActiveImpl = MemberActiveImpl(info, group)\n\n    override var permission: MemberPermission by info::permission\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/AbstractUser.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact\n\nimport net.mamoe.mirai.contact.Friend\nimport net.mamoe.mirai.contact.Member\nimport net.mamoe.mirai.contact.Stranger\nimport net.mamoe.mirai.contact.User\nimport net.mamoe.mirai.data.UserInfo\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.message.contextualBugReportException\nimport net.mamoe.mirai.internal.message.flags.SkipEventBroadcast\nimport net.mamoe.mirai.internal.message.image.*\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocolFacade\nimport net.mamoe.mirai.internal.message.protocol.outgoing.HighwayUploader\nimport net.mamoe.mirai.internal.message.protocol.outgoing.MessageProtocolStrategy\nimport net.mamoe.mirai.internal.network.component.buildComponentStorage\nimport net.mamoe.mirai.internal.network.components.BdhSession\nimport net.mamoe.mirai.internal.network.components.ClockHolder\nimport net.mamoe.mirai.internal.network.components.HttpClientProvider\nimport net.mamoe.mirai.internal.network.highway.ChannelKind\nimport net.mamoe.mirai.internal.network.highway.Highway\nimport net.mamoe.mirai.internal.network.highway.ResourceKind.PRIVATE_IMAGE\nimport net.mamoe.mirai.internal.network.highway.postImage\nimport net.mamoe.mirai.internal.network.highway.tryServersUpload\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Cmd0x352\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.image.ImgStore\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.image.LongConn\nimport net.mamoe.mirai.internal.utils.AtomicIntSeq\nimport net.mamoe.mirai.internal.utils.C2CPkgMsgParsingCache\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.*\nimport kotlin.contracts.contract\nimport kotlin.coroutines.CoroutineContext\n\ninternal val User.info: UserInfo? get() = this.castOrNull<AbstractUser>()?.info\n\n@Suppress(\"NOTHING_TO_INLINE\")\ninternal inline fun User.impl(): AbstractUser {\n    contract { returns() implies (this@impl is AbstractUser) }\n    check(this is AbstractUser)\n    return this\n}\n\ninternal val User.correspondingMessageSourceKind\n    get() = when (this) {\n        is Friend -> MessageSourceKind.FRIEND\n        is Member -> MessageSourceKind.TEMP\n        is Stranger -> MessageSourceKind.STRANGER\n        else -> error(\"Unknown user: ${this::class.qualifiedName}\")\n    }\n\ninternal sealed class AbstractUser(\n    bot: QQAndroidBot,\n    parentCoroutineContext: CoroutineContext,\n    userInfo: UserInfo,\n) : User, AbstractContact(bot, parentCoroutineContext) {\n\n    final override val id: Long = userInfo.uin\n    abstract override val nick: String\n    abstract override val remark: String\n\n    val messageSeq = AtomicIntSeq.forMessageSeq()\n    val fragmentedMessageMerger = C2CPkgMsgParsingCache()\n\n    open val info: UserInfo = userInfo\n\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n    override suspend fun uploadImage(resource: ExternalResource): Image = resource.withAutoClose {\n        if (BeforeImageUploadEvent(this, resource).broadcast().isCancelled) {\n            throw EventCancelledException(\"cancelled by BeforeImageUploadEvent.ToGroup\")\n        }\n        val imageInfo = runBIO { resource.calculateImageInfo() }\n        val resp = bot.network.sendAndExpect(\n            LongConn.OffPicUp(\n                bot.client,\n                Cmd0x352.TryUpImgReq(\n                    buType = 1,\n                    srcUin = bot.id,\n                    dstUin = this@AbstractUser.id,\n                    fileMd5 = resource.md5,\n                    fileSize = resource.size,\n                    imgWidth = imageInfo.width,\n                    imgHeight = imageInfo.height,\n                    imgType = getIdByImageType(imageInfo.imageType),\n                    fileName = \"${resource.md5.toUHexString(\"\")}.${resource.formatName}\",\n                    //For gif, using not original\n                    imgOriginal = (imageInfo.imageType != ImageType.GIF),\n                    buildVer = bot.client.buildVer,\n                ),\n            ), 5000, 2\n        )\n\n        return when (resp) {\n            is LongConn.OffPicUp.Response.FileExists -> {\n                val imageType =\n                    getImageType(resp.imageInfo.fileType).takeIf { it != ExternalResource.DEFAULT_FORMAT_NAME }\n                        ?: resource.formatName\n\n                resp.imageInfo.run {\n                    OfflineFriendImage(\n                        imageId = generateImageIdFromResourceId(\n                            resourceId = resp.resourceId, format = imageType\n                        ) ?: kotlin.run {\n                            if (resp.imageInfo.fileMd5.size == 16) {\n                                generateImageId(resp.imageInfo.fileMd5, imageType)\n                            } else {\n                                throw contextualBugReportException(\n                                    \"Failed to compute friend image image from resourceId: ${resp.resourceId}\",\n                                    resp.structureToString(),\n                                    additional = \"并附加此时正在上传的文件\"\n                                )\n                            }\n                        },\n                        width = fileWidth,\n                        height = fileHeight,\n                        imageType = getImageTypeById(fileType) ?: ImageType.UNKNOWN,\n                        size = resource.size\n                    )\n                }.also {\n                    ImageUploadEvent.Succeed(this, resource, it).broadcast()\n                }\n            }\n\n            is LongConn.OffPicUp.Response.RequireUpload -> {\n\n                kotlin.runCatching {\n                    // try once upload by private bdh\n                    Highway.uploadResourceBdh(\n                        bot = bot,\n                        resource = resource,\n                        kind = PRIVATE_IMAGE,\n                        commandId = 1,\n                        initialTicket = resp.uKey,\n                        tryOnce = true\n                    )\n                }.recoverCatchingSuppressed {\n                    // try upload as group image\n                    val response: ImgStore.GroupPicUp.Response = bot.network.sendAndExpect(\n                        ImgStore.GroupPicUp(\n                            bot.client,\n                            uin = bot.id,\n                            groupCode = id,\n                            md5 = resource.md5,\n                            size = resource.size,\n                            picWidth = imageInfo.width,\n                            picHeight = imageInfo.height,\n                            picType = getIdByImageType(imageInfo.imageType),\n                            buType = 2, // not group\n                        )\n                    )\n\n                    when (response) {\n                        is ImgStore.GroupPicUp.Response.Failed -> {\n                            error(\"upload private image as group image failed with reason ${response.message}\")\n                        }\n                        is ImgStore.GroupPicUp.Response.FileExists -> {\n                            // success\n                        }\n                        is ImgStore.GroupPicUp.Response.RequireUpload -> {\n                            // val servers = response.uploadIpList.zip(response.uploadPortList)\n                            Highway.uploadResourceBdh(bot = bot,\n                                resource = resource,\n                                kind = PRIVATE_IMAGE,\n                                commandId = 2,\n                                initialTicket = response.uKey,\n                                fallbackSession = {\n                                    BdhSession(\n                                        EMPTY_BYTE_ARRAY, EMPTY_BYTE_ARRAY,\n                                        ssoAddresses = response.uploadIpList.zip(response.uploadPortList)\n                                            .toMutableSet(),\n                                    )\n                                })\n                        }\n                    }\n                }.recoverCatchingSuppressed {\n                    // try upload by private bdh on other servers\n                    Highway.uploadResourceBdh(\n                        bot = bot,\n                        resource = resource,\n                        kind = PRIVATE_IMAGE,\n                        commandId = 1,\n                        initialTicket = resp.uKey,\n                    )\n                }.recoverCatchingSuppressed {\n                    // try upload by http on provided servers\n                    tryServersUpload(\n                        bot = bot,\n                        servers = resp.serverIp.zip(resp.serverPort),\n                        resourceSize = resource.size,\n                        resourceKind = PRIVATE_IMAGE,\n                        channelKind = ChannelKind.HTTP\n                    ) { ip, port ->\n                        bot.components[HttpClientProvider].getHttpClient().postImage(\n                            serverIp = ip,\n                            serverPort = port,\n                            htcmd = \"0x6ff0070\",\n                            uin = bot.id,\n                            groupcode = null,\n                            imageInput = resource,\n                            uKeyHex = resp.uKey.toUHexString(\"\")\n                        )\n                    }\n                }.recoverCatchingSuppressed {\n                    // try upload by http on fallback server\n                    bot.components[HttpClientProvider].getHttpClient().postImage(\n                        serverIp = \"htdata2.qq.com\",\n                        htcmd = \"0x6ff0070\",\n                        uin = bot.id,\n                        groupcode = null,\n                        imageInput = resource,\n                        uKeyHex = resp.uKey.toUHexString(\"\")\n                    )\n                }.getOrThrow()\n\n                imageInfo.run {\n                    OfflineFriendImage(\n                        imageId = generateImageIdFromResourceId(resp.resourceId, resource.formatName)\n                            ?: resp.resourceId,\n                        width = width,\n                        height = height,\n                        imageType = imageType,\n                        size = resource.size\n                    )\n                }.also {\n                    ImageUploadEvent.Succeed(this, resource, it).broadcast()\n                }\n            }\n            is LongConn.OffPicUp.Response.Failed -> {\n                ImageUploadEvent.Failed(this, resource, -1, resp.message).broadcast()\n                error(resp.message)\n            }\n        }\n    }\n}\n\n\ninternal suspend fun <C : AbstractContact> C.sendMessageImpl(\n    message: Message,\n    messageProtocolStrategy: MessageProtocolStrategy<C>,\n    preSendEventConstructor: (C, Message) -> MessagePreSendEvent,\n    postSendEventConstructor: (C, MessageChain, Throwable?, MessageReceipt<C>?) -> MessagePostSendEvent<C>,\n): MessageReceipt<C> {\n    val skipEvent = if (message is MessageChain) {\n        message.anyIsInstance<SkipEventBroadcast>()\n    } else false\n\n    require(!message.isContentEmpty()) { \"message is empty\" }\n\n    val chain = broadcastMessagePreSendEvent(message, skipEvent, preSendEventConstructor)\n\n    val result = kotlin.runCatching {\n        MessageProtocolFacade.preprocessAndSendOutgoing(this, chain, buildComponentStorage {\n            set(MessageProtocolStrategy, messageProtocolStrategy)\n            set(HighwayUploader, HighwayUploader.Default)\n            set(ClockHolder, bot.components[ClockHolder])\n        })\n    }\n\n    if (result.isSuccess) {\n        // logMessageSent(result.getOrNull()?.source?.plus(chain) ?: chain) // log with source\n        bot.logger.verbose(\"$this <- $chain\".replaceMagicCodes())\n    }\n\n    if (!skipEvent) {\n        postSendEventConstructor(this, chain, result.exceptionOrNull(), result.getOrNull()).broadcast()\n    }\n\n    return result.getOrThrow()\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/AnonymousMemberImpl.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact\n\nimport net.mamoe.mirai.contact.AnonymousMember\nimport net.mamoe.mirai.data.MemberInfo\nimport net.mamoe.mirai.internal.MiraiImpl\nimport net.mamoe.mirai.internal.getMiraiImpl\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.utils.ExternalResource\nimport kotlin.coroutines.CoroutineContext\n\ninternal class AnonymousMemberImpl(\n    group: GroupImpl,\n    parentCoroutineContext: CoroutineContext,\n    memberInfo: MemberInfo,\n) : AnonymousMember, AbstractMember(group, parentCoroutineContext, memberInfo) {\n    init {\n        requireNotNull(memberInfo.anonymousId) { \"anonymousId must not be null\" }\n    }\n\n    override val anonymousId: String get() = info.anonymousId!!\n\n    override suspend fun mute(durationSeconds: Int) {\n        checkBotPermissionHigherThanThis(\"mute\")\n        getMiraiImpl().muteAnonymousMember(bot, anonymousId, nameCard, group.uin, durationSeconds)\n    }\n\n    override fun toString(): String = \"AnonymousMember($nameCard, $anonymousId)\"\n    override suspend fun uploadImage(resource: ExternalResource): Image =\n        throw UnsupportedOperationException(\"Cannot upload image to AnonymousMember\")\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/ContactAware.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact\n\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.internal.asQQAndroidBot\n\ninternal interface ContactAware {\n    val contact: Contact\n\n    val bot get() = contact.bot.asQQAndroidBot()\n    val client get() = bot.client\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/FriendImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(LowLevelApi::class)\n@file:Suppress(\n    \"NOTHING_TO_INLINE\",\n)\n\npackage net.mamoe.mirai.internal.contact\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.coroutines.launch\nimport net.mamoe.mirai.LowLevelApi\nimport net.mamoe.mirai.contact.Friend\nimport net.mamoe.mirai.contact.friendgroup.FriendGroup\nimport net.mamoe.mirai.contact.roaming.RoamingMessages\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.FriendMessagePostSendEvent\nimport net.mamoe.mirai.event.events.FriendMessagePreSendEvent\nimport net.mamoe.mirai.event.events.FriendRemarkChangeEvent\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.info.FriendInfoImpl\nimport net.mamoe.mirai.internal.contact.roaming.RoamingMessagesImplFriend\nimport net.mamoe.mirai.internal.message.data.OfflineAudioImpl\nimport net.mamoe.mirai.internal.message.protocol.outgoing.FriendMessageProtocolStrategy\nimport net.mamoe.mirai.internal.message.protocol.outgoing.MessageProtocolStrategy\nimport net.mamoe.mirai.internal.network.components.HttpClientProvider\nimport net.mamoe.mirai.internal.network.highway.*\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Cmd0x346\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.voice.PttStore\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.voice.audioCodec\nimport net.mamoe.mirai.internal.network.protocol.packet.list.FriendList\nimport net.mamoe.mirai.internal.network.protocol.packet.summarycard.ChangeFriendRemark\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.data.OfflineAudio\nimport net.mamoe.mirai.spi.AudioToSilkService\nimport net.mamoe.mirai.utils.*\nimport kotlin.contracts.ExperimentalContracts\nimport kotlin.contracts.contract\nimport kotlin.coroutines.CoroutineContext\n\ninternal fun net.mamoe.mirai.internal.network.protocol.data.jce.FriendInfo.toMiraiFriendInfo(): FriendInfoImpl =\n    FriendInfoImpl(\n        friendUin,\n        nick,\n        remark,\n        groupId.toInt(),\n    )\n\n@OptIn(ExperimentalContracts::class)\ninternal inline fun Friend.impl(): FriendImpl {\n    contract {\n        returns() implies (this@impl is FriendImpl)\n    }\n    check(this is FriendImpl) { \"A Friend instance is not instance of FriendImpl. Your instance: ${this::class.qualifiedName}\" }\n    return this\n}\n\ninternal class FriendImpl(\n    bot: QQAndroidBot,\n    parentCoroutineContext: CoroutineContext,\n    override val info: FriendInfoImpl,\n) : Friend, AbstractUser(bot, parentCoroutineContext, info) {\n    override var nick: String by info::nick\n\n    override var remark: String\n        get() = info.remark\n        set(value) {\n            val old = info.remark\n            info.remark = value\n            launch {\n                bot.network.sendWithoutExpect(ChangeFriendRemark(bot.client, this@FriendImpl.id, value))\n                FriendRemarkChangeEvent(this@FriendImpl, old, value).broadcast()\n            }\n        }\n\n    override val friendGroup: FriendGroup\n        get() = bot.friendGroups[info.friendGroupId] ?: bot.friendGroups[0]!!\n\n    private val messageProtocolStrategy: MessageProtocolStrategy<FriendImpl> = FriendMessageProtocolStrategy(this)\n\n    override suspend fun delete() {\n        check(bot.friends[id] != null) {\n            \"Friend $id had already been deleted\"\n        }\n        bot.network.sendAndExpect(FriendList.DelFriend.invoke(bot.client, this@FriendImpl), 5000, 2).let {\n            check(it.isSuccess) { \"delete friend failed: ${it.resultCode}\" }\n        }\n    }\n\n    override suspend fun sendMessage(message: Message): MessageReceipt<Friend> {\n        return sendMessageImpl(\n            message,\n            messageProtocolStrategy,\n            ::FriendMessagePreSendEvent,\n            ::FriendMessagePostSendEvent.cast()\n        )\n    }\n\n    override fun toString(): String = \"Friend($id)\"\n\n    override suspend fun uploadAudio(resource: ExternalResource): OfflineAudio = AudioToSilkService.instance.convert(\n        resource\n    ).useAutoClose { res ->\n\n        var audio: OfflineAudioImpl? = null\n        kotlin.runCatching {\n            val resp = Highway.uploadResourceBdh(\n                bot = bot,\n                resource = res,\n                kind = ResourceKind.PRIVATE_AUDIO,\n                commandId = 26,\n                extendInfo = PttStore.C2C.createC2CPttStoreBDHExt(bot, this@FriendImpl.uin, res)\n                    .toByteArray(Cmd0x346.ReqBody.serializer())\n            )\n            // resp._miraiContentToString(\"UV resp\")\n            val c346resp = resp.extendInfo!!.loadAs(Cmd0x346.RspBody.serializer())\n            if (c346resp.msgApplyUploadRsp == null) {\n                error(\"Upload failed\")\n            }\n            audio = OfflineAudioImpl(\n                filename = \"${res.md5.toUHexString(\"\")}.amr\",\n                fileMd5 = res.md5,\n                fileSize = res.size,\n                codec = res.audioCodec,\n                originalPtt = ImMsgBody.Ptt(\n                    fileType = 4,\n                    srcUin = bot.uin,\n                    fileUuid = c346resp.msgApplyUploadRsp.uuid,\n                    fileMd5 = res.md5,\n                    fileName = res.md5 + \".amr\".toByteArray(),\n                    fileSize = res.size.toInt(),\n                    boolValid = true,\n                )\n            )\n        }.recoverCatchingSuppressed {\n            when (val resp = bot.network.sendAndExpect(PttStore.GroupPttUp(bot.client, bot.id, id, res))) {\n                is PttStore.GroupPttUp.Response.RequireUpload -> {\n                    tryServersUpload(\n                        bot,\n                        resp.uploadIpList.zip(resp.uploadPortList),\n                        res.size,\n                        ResourceKind.GROUP_AUDIO,\n                        ChannelKind.HTTP\n                    ) { ip, port ->\n                        bot.components[HttpClientProvider].getHttpClient()\n                            .postPtt(ip, port, res, resp.uKey, resp.fileKey)\n                    }\n                    audio = OfflineAudioImpl(\n                        filename = \"${res.md5.toUHexString(\"\")}.amr\",\n                        fileMd5 = res.md5,\n                        fileSize = res.size,\n                        codec = res.audioCodec,\n                        originalPtt = ImMsgBody.Ptt(\n                            fileType = 4,\n                            srcUin = bot.uin,\n                            fileUuid = resp.fileId.toByteArray(),\n                            fileMd5 = res.md5,\n                            fileName = res.md5 + \".amr\".toByteArray(),\n                            fileSize = res.size.toInt(),\n                            boolValid = true,\n                        )\n                    )\n                }\n            }\n        }.getOrThrow()\n\n        return audio!!\n    }\n\n    override val roamingMessages: RoamingMessages by lazy { RoamingMessagesImplFriend(this) }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INAPPLICABLE_JVM_NAME\", \"DEPRECATION_ERROR\", \"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n@file:OptIn(LowLevelApi::class)\n\npackage net.mamoe.mirai.internal.contact\n\nimport kotlinx.atomicfu.AtomicRef\nimport kotlinx.atomicfu.atomic\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.LowLevelApi\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.contact.active.GroupActive\nimport net.mamoe.mirai.contact.announcement.Announcements\nimport net.mamoe.mirai.contact.essence.Essences\nimport net.mamoe.mirai.contact.file.RemoteFiles\nimport net.mamoe.mirai.contact.roaming.RoamingMessages\nimport net.mamoe.mirai.data.GroupHonorType\nimport net.mamoe.mirai.data.GroupInfo\nimport net.mamoe.mirai.data.MemberInfo\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.active.GroupActiveImpl\nimport net.mamoe.mirai.internal.contact.announcement.AnnouncementsImpl\nimport net.mamoe.mirai.internal.contact.essence.EssencesImpl\nimport net.mamoe.mirai.internal.contact.file.RemoteFilesImpl\nimport net.mamoe.mirai.internal.contact.info.MemberInfoImpl\nimport net.mamoe.mirai.internal.contact.roaming.RoamingMessagesImplGroup\nimport net.mamoe.mirai.internal.message.contextualBugReportException\nimport net.mamoe.mirai.internal.message.data.OfflineAudioImpl\nimport net.mamoe.mirai.internal.message.image.OfflineGroupImage\nimport net.mamoe.mirai.internal.message.image.calculateImageInfo\nimport net.mamoe.mirai.internal.message.image.getIdByImageType\nimport net.mamoe.mirai.internal.message.image.getImageTypeById\nimport net.mamoe.mirai.internal.message.protocol.outgoing.GroupMessageProtocolStrategy\nimport net.mamoe.mirai.internal.message.protocol.outgoing.MessageProtocolStrategy\nimport net.mamoe.mirai.internal.network.components.BdhSession\nimport net.mamoe.mirai.internal.network.components.HttpClientProvider\nimport net.mamoe.mirai.internal.network.handler.logger\nimport net.mamoe.mirai.internal.network.highway.ChannelKind\nimport net.mamoe.mirai.internal.network.highway.Highway\nimport net.mamoe.mirai.internal.network.highway.ResourceKind.GROUP_AUDIO\nimport net.mamoe.mirai.internal.network.highway.ResourceKind.GROUP_IMAGE\nimport net.mamoe.mirai.internal.network.highway.postPtt\nimport net.mamoe.mirai.internal.network.highway.tryServersUpload\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Cmd0x388\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.TroopEssenceMsgManager\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.image.ImgStore\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.voice.PttStore\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.voice.audioCodec\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.voice.voiceCodec\nimport net.mamoe.mirai.internal.network.protocol.packet.list.ProfileService\nimport net.mamoe.mirai.internal.utils.GroupPkgMsgParsingCache\nimport net.mamoe.mirai.internal.utils.ImagePatcher\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.internal.utils.subLogger\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.spi.AudioToSilkService\nimport net.mamoe.mirai.utils.*\nimport kotlin.contracts.contract\nimport kotlin.coroutines.CoroutineContext\n\ninternal fun GroupImpl.Companion.checkIsInstance(instance: Group) {\n    contract { returns() implies (instance is GroupImpl) }\n    check(instance is GroupImpl) { \"group is not an instanceof GroupImpl!! DO NOT interlace two or more protocol implementations!!\" }\n}\n\ninternal fun Group.checkIsGroupImpl(): GroupImpl {\n    contract { returns() implies (this@checkIsGroupImpl is GroupImpl) }\n    GroupImpl.checkIsInstance(this)\n    return this\n}\n\ninternal fun GroupImpl(\n    bot: QQAndroidBot,\n    parentCoroutineContext: CoroutineContext,\n    id: Long,\n    groupInfo: GroupInfo,\n    members: Sequence<MemberInfo>,\n): GroupImpl {\n    return GroupImpl(bot, parentCoroutineContext, id, groupInfo, ContactList(ConcurrentLinkedDeque())).apply Group@{\n        members.forEach { info ->\n            if (info.uin == bot.id) {\n                botAsMember = newNormalMember(info)\n                if (info.permission == MemberPermission.OWNER) {\n                    owner = botAsMember\n                }\n            } else newNormalMember(info).let { member ->\n                if (member.permission == MemberPermission.OWNER) {\n                    owner = member\n                }\n                this@Group.members.delegate.add(member)\n            }\n        }\n    }.apply {\n        if (!botAsMemberInitialized) {\n            logger.error(\n                contextualBugReportException(\"GroupImpl\", \"\"\"\n                    groupId: ${groupInfo.groupCode.takeIf { it != 0L } ?: id}\n                    groupUin: ${groupInfo.uin}\n                    membersCount: ${members.count()}\n                    botId: ${bot.id}\n                    owner: ${kotlin.runCatching { owner }.getOrNull()?.id}\n                \"\"\".trimIndent(), additional = \"并告知此时 Bot 是否为群管理员或群主, 和是否刚刚加入或离开这个群\"\n                )\n            )\n        }\n    }\n}\n\nprivate val logger by lazy {\n    MiraiLogger.Factory.create(GroupImpl::class, \"Group\")\n}\n\ninternal fun Bot.nickIn(context: Contact): String =\n    if (context is Group) context.botAsMember.nameCardOrNick else bot.nick\n\ninternal expect class GroupImpl constructor(\n    bot: QQAndroidBot,\n    parentCoroutineContext: CoroutineContext,\n    id: Long,\n    groupInfo: GroupInfo,\n    members: ContactList<NormalMemberImpl>,\n) : Group, CommonGroupImpl {\n    companion object\n}\n\n@Suppress(\"PropertyName\")\ninternal abstract class CommonGroupImpl constructor(\n    bot: QQAndroidBot,\n    parentCoroutineContext: CoroutineContext,\n    override val id: Long,\n    groupInfo: GroupInfo,\n    final override val members: ContactList<NormalMemberImpl>,\n) : Group, AbstractContact(bot, parentCoroutineContext) {\n    companion object\n\n    val uin: Long = groupInfo.uin\n    final override val settings: GroupSettingsImpl = GroupSettingsImpl(this.cast(), groupInfo)\n    final override var name: String by settings::name\n\n    final override lateinit var owner: NormalMemberImpl\n    final override lateinit var botAsMember: NormalMemberImpl\n    internal val botAsMemberInitialized get() = ::botAsMember.isInitialized\n\n    final override val files: RemoteFiles by lazy { RemoteFilesImpl(this) }\n\n\n    private val _lastTalkative: AtomicRef<NormalMemberImpl?> = atomic(null)\n\n    init {\n        // Cannot move to argument of `atomic`, compiler error.\n        val value = members.find { GroupHonorType.TALKATIVE in it.active.honors }\n        _lastTalkative.value = value\n    }\n\n    val lastTalkative get() = _lastTalkative.value\n    fun casLastTalkative(expect: NormalMemberImpl?, update: NormalMemberImpl?): Boolean =\n        _lastTalkative.compareAndSet(expect, update)\n\n    final override val announcements: Announcements by lazy {\n        AnnouncementsImpl(\n            this as GroupImpl,\n            bot.network.logger.subLogger(\"Group $id\")\n        )\n    }\n\n    final override val active: GroupActive by lazy {\n        GroupActiveImpl(\n            this as GroupImpl,\n            bot.network.logger.subLogger(\"Group $id\"),\n            groupInfo\n        )\n    }\n\n    val groupPkgMsgParsingCache = GroupPkgMsgParsingCache()\n\n    private val messageProtocolStrategy: MessageProtocolStrategy<GroupImpl> = GroupMessageProtocolStrategy(this.cast())\n\n    override suspend fun quit(): Boolean {\n        check(botPermission != MemberPermission.OWNER) {\n            \"Failed to quit $id because bot is the owner\"\n        }\n\n        if (!bot.groups.delegate.remove(this)) {\n            return false\n        }\n\n        val response: ProfileService.GroupMngReq.GroupMngReqResponse = bot.network.sendAndExpect(\n            ProfileService.GroupMngReq(bot.client, this@CommonGroupImpl.id), 5000, 2\n        )\n        check(response.errorCode == 0) {\n            \"Group($id).quit failed: $response\".also {\n                bot.groups.delegate.add(this@CommonGroupImpl.castUp())\n            }\n        }\n        BotLeaveEvent.Active(this).broadcast()\n        return true\n    }\n\n    override operator fun get(id: Long): NormalMemberImpl? {\n        if (id == bot.id) return botAsMember\n        return members.firstOrNull { it.id == id }\n    }\n\n    override fun contains(id: Long): Boolean {\n        return bot.id == id || members.firstOrNull { it.id == id } != null\n    }\n\n    override suspend fun sendMessage(message: Message): MessageReceipt<Group> {\n        check(!isBotMuted) { throw BotIsBeingMutedException(this, message) }\n        return sendMessageImpl(\n            message,\n            messageProtocolStrategy.castUp(),\n            ::GroupMessagePreSendEvent,\n            ::GroupMessagePostSendEvent.cast()\n        )\n    }\n\n    override suspend fun uploadImage(resource: ExternalResource): Image = resource.withAutoClose {\n        if (BeforeImageUploadEvent(this, resource).broadcast().isCancelled) {\n            throw EventCancelledException(\"cancelled by BeforeImageUploadEvent.ToGroup\")\n        }\n\n        fun OfflineGroupImage.putIntoCache() {\n            // We can't understand wny Image(group.uploadImage().imageId)\n            bot.components[ImagePatcher].putCache(this)\n        }\n\n        val imageInfo = runBIO { resource.calculateImageInfo() }\n\n        val response: ImgStore.GroupPicUp.Response = bot.network.sendAndExpect(\n            ImgStore.GroupPicUp(\n                bot.client,\n                uin = bot.id,\n                groupCode = id,\n                md5 = resource.md5,\n                size = resource.size,\n                filename = \"${resource.md5.toUHexString(\"\")}.${resource.formatName}\",\n                picWidth = imageInfo.width,\n                picHeight = imageInfo.height,\n                picType = getIdByImageType(imageInfo.imageType),\n            ), 5000, 2\n        )\n\n        when (response) {\n            is ImgStore.GroupPicUp.Response.Failed -> {\n                ImageUploadEvent.Failed(this@CommonGroupImpl, resource, response.resultCode, response.message)\n                    .broadcast()\n                if (response.message == \"over file size max\") throw OverFileSizeMaxException()\n                error(\"upload group image failed with reason ${response.message}\")\n            }\n            is ImgStore.GroupPicUp.Response.FileExists -> {\n                val resourceId = resource.calculateResourceId()\n                return response.fileInfo.run {\n                    OfflineGroupImage(\n                        imageId = resourceId,\n                        height = fileHeight,\n                        width = fileWidth,\n                        imageType = getImageTypeById(fileType) ?: ImageType.UNKNOWN,\n                        size = resource.size\n                    )\n                }\n                    .also {\n                        it.fileId = response.fileId.toInt()\n                    }\n                    .also { it.putIntoCache() }\n                    .also { ImageUploadEvent.Succeed(this@CommonGroupImpl, resource, it).broadcast() }\n            }\n            is ImgStore.GroupPicUp.Response.RequireUpload -> {\n                // val servers = response.uploadIpList.zip(response.uploadPortList)\n                Highway.uploadResourceBdh(\n                    bot = bot,\n                    resource = resource,\n                    kind = GROUP_IMAGE,\n                    commandId = 2,\n                    initialTicket = response.uKey,\n                    noBdhAwait = true,\n                    fallbackSession = {\n                        BdhSession(\n                            EMPTY_BYTE_ARRAY, EMPTY_BYTE_ARRAY,\n                            ssoAddresses = response.uploadIpList.zip(response.uploadPortList).toMutableSet(),\n                        )\n                    },\n                )\n\n                return imageInfo.run {\n                    OfflineGroupImage(\n                        imageId = resource.calculateResourceId(),\n                        width = width,\n                        height = height,\n                        imageType = imageType,\n                        size = resource.size\n                    )\n                }.also { it.fileId = response.fileId.toInt() }\n                    .also { it.putIntoCache() }\n                    .also { ImageUploadEvent.Succeed(this@CommonGroupImpl, resource, it).broadcast() }\n            }\n        }\n    }\n\n    @Deprecated(\"use uploadAudio\", replaceWith = ReplaceWith(\"uploadAudio(resource)\"), level = DeprecationLevel.HIDDEN)\n    @Suppress(\"OverridingDeprecatedMember\", \"DEPRECATION\", \"DEPRECATION_ERROR\")\n    override suspend fun uploadVoice(resource: ExternalResource): net.mamoe.mirai.message.data.Voice =\n        AudioToSilkService.instance.convert(\n            resource\n        ).useAutoClose { res ->\n            return bot.network.run {\n                uploadAudioResource(res)\n\n                // val body = resp?.loadAs(Cmd0x388.RspBody.serializer())\n                //     ?.msgTryupPttRsp\n                //     ?.singleOrNull()?.fileKey ?: error(\"Group voice highway transfer succeed but failed to find fileKey\")\n\n                net.mamoe.mirai.message.data.Voice(\n                    \"${res.md5.toUHexString(\"\")}.amr\",\n                    res.md5,\n                    res.size,\n                    res.voiceCodec,\n                    \"\"\n                )\n            }\n        }\n\n    private suspend fun uploadAudioResource(resource: ExternalResource) {\n        kotlin.runCatching {\n            val (_) = Highway.uploadResourceBdh(\n                bot = bot,\n                resource = resource,\n                kind = GROUP_AUDIO,\n                commandId = 29,\n                extendInfo = PttStore.GroupPttUp.createTryUpPttPack(bot.id, id, resource)\n                    .toByteArray(Cmd0x388.ReqBody.serializer()),\n            )\n        }.recoverCatchingSuppressed {\n            when (val resp = bot.network.sendAndExpect(PttStore.GroupPttUp(bot.client, bot.id, id, resource))) {\n                is PttStore.GroupPttUp.Response.RequireUpload -> {\n                    tryServersUpload(\n                        bot,\n                        resp.uploadIpList.zip(resp.uploadPortList),\n                        resource.size,\n                        GROUP_AUDIO,\n                        ChannelKind.HTTP\n                    ) { ip, port ->\n                        bot.components[HttpClientProvider].getHttpClient()\n                            .postPtt(ip, port, resource, resp.uKey, resp.fileKey)\n                    }\n                }\n            }\n        }.getOrThrow()\n    }\n\n    override suspend fun uploadAudio(resource: ExternalResource): OfflineAudio = AudioToSilkService.instance.convert(\n        resource\n    ).useAutoClose { res ->\n        return bot.network.run {\n            uploadAudioResource(res)\n\n            // val body = resp?.loadAs(Cmd0x388.RspBody.serializer())\n            //     ?.msgTryupPttRsp\n            //     ?.singleOrNull()?.fileKey ?: error(\"Group voice highway transfer succeed but failed to find fileKey\")\n\n            OfflineAudioImpl(\n                filename = \"${res.md5.toUHexString(\"\")}.amr\",\n                fileMd5 = res.md5,\n                fileSize = res.size,\n                codec = res.audioCodec,\n                originalPtt = null,\n            )\n        }\n\n    }\n\n    override suspend fun setEssenceMessage(source: MessageSource): Boolean {\n        checkBotPermission(MemberPermission.ADMINISTRATOR)\n        val result = bot.network.sendAndExpect(\n            TroopEssenceMsgManager.SetEssence(\n                bot.client,\n                this@CommonGroupImpl.uin,\n                source.internalIds.first(),\n                source.ids.first()\n            ), 5000, 2\n        )\n        return result.success\n    }\n\n    override val roamingMessages: RoamingMessages by lazy { RoamingMessagesImplGroup(this) }\n\n    // 鉴于在 [essences] 中 有相同的功能的 Web API 所以此方法移除\n//    override suspend fun removeEssenceMessage(source: MessageSource): Boolean {\n//        checkBotPermission(MemberPermission.ADMINISTRATOR)\n//        val result = bot.network.sendAndExpect(\n//            TroopEssenceMsgManager.RemoveEssence(\n//                bot.client,\n//                this@CommonGroupImpl.uin,\n//                source.internalIds.first(),\n//                source.ids.first()\n//            ), 5000, 2\n//        )\n//        return result.success\n//    }\n\n    override val essences: Essences by lazy {\n        EssencesImpl(\n            this as GroupImpl,\n            bot.network.logger.subLogger(\"Group $id\"),\n        )\n    }\n\n    override fun toString(): String = \"Group($id)\"\n}\n\ninternal fun Group.addNewNormalMember(memberInfo: MemberInfo): NormalMemberImpl? {\n    if (members.contains(memberInfo.uin)) return null\n    return newNormalMember(memberInfo).also {\n        members.delegate.add(it)\n    }\n}\n\ninternal fun Group.newNormalMember(memberInfo: MemberInfo): NormalMemberImpl {\n    this.checkIsGroupImpl()\n    return NormalMemberImpl(\n        this,\n        this.coroutineContext,\n        memberInfo\n    )\n}\n\ninternal fun GroupImpl.newAnonymous(name: String, id: String): AnonymousMemberImpl {\n    return AnonymousMemberImpl(\n        this, this.coroutineContext,\n        MemberInfoImpl(\n            uin = 80000000L,\n            nick = name,\n            permission = MemberPermission.MEMBER,\n            remark = \"匿名\",\n            nameCard = name,\n            specialTitle = \"匿名\",\n            muteTimestamp = 0,\n            anonymousId = id,\n        )\n    )\n}\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/GroupSendMessageImpl.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:Suppress(\"RESULT_CLASS_IN_RETURN_TYPE\") // inline ABI not stable but we don't care about internal ABI\n\npackage net.mamoe.mirai.internal.contact\n\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.EventCancelledException\nimport net.mamoe.mirai.event.events.MessagePreSendEvent\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.toMessageChain\n\n/**\n * Called only in 'public' apis.\n */\ninternal suspend fun <C : Contact> C.broadcastMessagePreSendEvent(\n    message: Message,\n    skipEvent: Boolean,\n    eventConstructor: (C, Message) -> MessagePreSendEvent,\n): MessageChain {\n    if (skipEvent) return message.toMessageChain()\n    var eventName: String? = null\n    return kotlin.runCatching {\n        eventConstructor(this, message).also {\n            eventName = it::class.simpleName\n        }.broadcast()\n    }.onSuccess {\n        check(!it.isCancelled) {\n            throw EventCancelledException(\"cancelled by $eventName\")\n        }\n    }.getOrElse {\n        eventName = eventName ?: (this@broadcastMessagePreSendEvent::class.simpleName + \"MessagePreSendEvent\")\n        throw EventCancelledException(\"exception thrown when broadcasting $eventName\", it)\n    }.message.toMessageChain()\n}\n\n\ninternal enum class SendMessageStep(\n    val allowMultiplePackets: Boolean\n) {\n    /**\n     * 尝试单包直接发送全部消息\n     */\n    FIRST(false) {\n        override fun nextStepOrNull(): SendMessageStep {\n            return LONG_MESSAGE\n        }\n    },\n\n    /**\n     * 尝试通过长消息通道上传长消息取得 resId 后再通过普通消息通道发送长消息标识\n     */\n    LONG_MESSAGE(false) {\n        override fun nextStepOrNull(): SendMessageStep {\n            return FRAGMENTED\n        }\n    },\n\n    /**\n     * 发送分片多包发送\n     */\n    FRAGMENTED(true) {\n        override fun nextStepOrNull(): SendMessageStep? {\n            return null\n        }\n    };\n\n    abstract fun nextStepOrNull(): SendMessageStep?\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/GroupSettingsImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact\n\nimport kotlinx.coroutines.launch\nimport net.mamoe.mirai.contact.GroupSettings\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.contact.checkBotPermission\nimport net.mamoe.mirai.data.GroupInfo\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.GroupAllowMemberInviteEvent\nimport net.mamoe.mirai.event.events.GroupMuteAllEvent\nimport net.mamoe.mirai.event.events.GroupNameChangeEvent\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.TroopManagement.GroupOperation\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.TroopManagement.SwitchAnonymousChat\n\n@Suppress(\"SetterBackingFieldAssignment\")\ninternal class GroupSettingsImpl(\n    private val group: GroupImpl,\n    groupInfo: GroupInfo,\n) : GroupSettings {\n\n    private inline fun <T> GroupImpl.setImpl(\n        newValue: T,\n        getter: () -> T,\n        setter: (T) -> Unit,\n        crossinline packetConstructor: (client: QQAndroidClient, groupCode: Long, newValue: T) -> OutgoingPacket,\n        crossinline eventConstructor: (old: T) -> Event?,\n    ) {\n        checkBotPermission(MemberPermission.ADMINISTRATOR)\n        val oldValue = getter()\n        setter(newValue)\n        launch {\n            bot.network.sendWithoutExpect(packetConstructor(bot.client, id, newValue))\n            eventConstructor(oldValue)?.broadcast()\n        }\n    }\n\n\n    internal var nameField: String = groupInfo.name\n    var name: String\n        get() = nameField\n        set(newValue) {\n            group.setImpl(newValue, { nameField }, { nameField = it }, GroupOperation::name) {\n                GroupNameChangeEvent(it, newValue, group, null)\n            }\n        }\n\n\n    private var _entranceAnnouncement: String = groupInfo.memo\n\n    @Deprecated(\"Don't use public var internally\", level = DeprecationLevel.HIDDEN)\n    override var entranceAnnouncement: String\n        get() = _entranceAnnouncement\n        set(newValue) {\n            group.setImpl(newValue, { _entranceAnnouncement }, { _entranceAnnouncement = it }, GroupOperation::memo) {\n                null\n            }\n        }\n\n    private var isAllowMemberInviteField: Boolean = groupInfo.allowMemberInvite\n\n    @Deprecated(\"Don't use public var internally\", level = DeprecationLevel.HIDDEN)\n    override var isAllowMemberInvite: Boolean\n        get() = isAllowMemberInviteField\n        set(newValue) {\n            group.setImpl(\n                newValue,\n                { isAllowMemberInviteField },\n                { isAllowMemberInviteField = it },\n                GroupOperation::allowMemberInvite\n            ) {\n                GroupAllowMemberInviteEvent(it, newValue, group, null)\n            }\n        }\n\n    internal var isAnonymousChatEnabledField: Boolean = groupInfo.allowAnonymousChat\n\n    @Deprecated(\"Don't use public var internally\", level = DeprecationLevel.HIDDEN)\n    override var isAnonymousChatEnabled: Boolean\n        get() = isAnonymousChatEnabledField\n        set(newValue) {\n            group.run {\n                checkBotPermission(MemberPermission.ADMINISTRATOR)\n                launch {\n                    //Handle it in NoticePipelineContext#processAllowAnonymousChat\n                    bot.network.sendAndExpect(SwitchAnonymousChat(bot.client, id, newValue))\n                }\n            }\n        }\n\n    @Deprecated(\"Don't use public var internally\", level = DeprecationLevel.HIDDEN)\n    override var isAutoApproveEnabled: Boolean = groupInfo.autoApprove\n        @Suppress(\"UNUSED_PARAMETER\")\n        set(newValue) {\n            throw UnsupportedOperationException()\n        }\n\n\n    internal var isMuteAllField: Boolean = groupInfo.muteAll\n\n    @Deprecated(\"Don't use public var internally\", level = DeprecationLevel.HIDDEN)\n    override var isMuteAll: Boolean\n        get() = isMuteAllField\n        set(newValue) {\n            group.setImpl(newValue, { isMuteAllField }, { isMuteAllField = it }, GroupOperation::muteAll) {\n                GroupMuteAllEvent(it, newValue, group, null)\n            }\n        }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/MemberActiveImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact\n\nimport net.mamoe.mirai.contact.active.MemberActive\nimport net.mamoe.mirai.contact.active.MemberMedalInfo\nimport net.mamoe.mirai.data.GroupHonorType\nimport net.mamoe.mirai.internal.contact.active.GroupActiveImpl\nimport net.mamoe.mirai.internal.contact.info.MemberInfoImpl\n\ninternal class MemberActiveImpl(private val info: MemberInfoImpl, private val group: GroupImpl) : MemberActive {\n    override val rank: Int get() = info.rank\n    override val point: Int get() = info.point\n    override val honors: Set<GroupHonorType> get() = info.honors\n    override val temperature: Int get() = info.temperature\n    override suspend fun queryMedal(): MemberMedalInfo {\n        return (group.active as GroupActiveImpl).queryMemberMedal(uid = info.uin)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/NormalMemberImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"EXPERIMENTAL_API_USAGE\")\n\npackage net.mamoe.mirai.internal.contact\n\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.launch\nimport net.mamoe.mirai.LowLevelApi\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.data.MemberInfo\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.internal.message.protocol.outgoing.GroupTempMessageProtocolStrategy\nimport net.mamoe.mirai.internal.message.protocol.outgoing.MessageProtocolStrategy\nimport net.mamoe.mirai.internal.message.source.OnlineMessageSourceToTempImpl\nimport net.mamoe.mirai.internal.message.source.createMessageReceipt\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.TroopManagement\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.utils.cast\nimport net.mamoe.mirai.utils.currentTimeSeconds\nimport kotlin.contracts.ExperimentalContracts\nimport kotlin.contracts.contract\nimport kotlin.coroutines.CoroutineContext\n\n@OptIn(LowLevelApi::class)\n@Suppress(\"MemberVisibilityCanBePrivate\")\ninternal class NormalMemberImpl constructor(\n    group: GroupImpl,\n    parentCoroutineContext: CoroutineContext,\n    memberInfo: MemberInfo,\n) : NormalMember, AbstractMember(group, parentCoroutineContext, memberInfo) {\n\n    override val joinTimestamp: Int get() = info.joinTimestamp\n    override val lastSpeakTimestamp: Int get() = info.lastSpeakTimestamp\n\n    private val messageProtocolStrategy: MessageProtocolStrategy<NormalMemberImpl> = GroupTempMessageProtocolStrategy\n\n    override fun toString(): String = \"NormalMember($id)\"\n\n    @Suppress(\"DuplicatedCode\")\n    override suspend fun sendMessage(message: Message): MessageReceipt<NormalMember> {\n        return asFriendOrNull()?.sendMessage(message)?.convert()\n            ?: asStrangerOrNull()?.sendMessage(message)?.convert()\n            ?: sendMessageImpl(\n                message = message,\n                preSendEventConstructor = ::GroupTempMessagePreSendEvent,\n                postSendEventConstructor = ::GroupTempMessagePostSendEvent.cast(),\n                messageProtocolStrategy = messageProtocolStrategy\n            )\n    }\n\n    private fun MessageReceipt<User>.convert(): MessageReceipt<NormalMemberImpl> {\n        return OnlineMessageSourceToTempImpl(source, this@NormalMemberImpl).createMessageReceipt(\n            this@NormalMemberImpl,\n            doLightRefine = false //we've already did\n        )\n    }\n\n\n    @Suppress(\"PropertyName\")\n    internal var _nameCard: String = memberInfo.nameCard\n\n    @Suppress(\"PropertyName\")\n    internal var _specialTitle: String = memberInfo.specialTitle\n\n    @Suppress(\"PropertyName\")\n    var _muteTimestamp: Int = memberInfo.muteTimestamp\n\n    @Suppress(\"PropertyName\")\n    var _nudgeTimestamp: Long = 0L\n\n    override val muteTimeRemaining: Int\n        get() = if (_muteTimestamp == 0 || _muteTimestamp == 0xFFFFFFFF.toInt()) {\n            0\n        } else {\n            (_muteTimestamp - currentTimeSeconds().toInt()).coerceAtLeast(0)\n        }\n\n    override var nameCard: String\n        get() = _nameCard\n        set(newValue) {\n            if (id != bot.id) {\n                group.checkBotPermission(MemberPermission.ADMINISTRATOR)\n            }\n            if (_nameCard != newValue) {\n                val oldValue = _nameCard\n                _nameCard = newValue\n                launch {\n                    bot.network.sendWithoutExpect(\n                        TroopManagement.EditGroupNametag(\n                            bot.client,\n                            this@NormalMemberImpl,\n                            newValue,\n                        )\n                    )\n                    MemberCardChangeEvent(oldValue, newValue, this@NormalMemberImpl).broadcast()\n                }\n            }\n        }\n\n    override var specialTitle: String\n        get() = _specialTitle\n        set(newValue) {\n            group.checkBotPermission(MemberPermission.OWNER)\n            if (_specialTitle != newValue) {\n                val oldValue = _specialTitle\n                _specialTitle = newValue\n                launch {\n                    bot.network.sendWithoutExpect(\n                        TroopManagement.EditSpecialTitle(\n                            bot.client,\n                            this@NormalMemberImpl,\n                            newValue,\n                        )\n                    )\n                    MemberSpecialTitleChangeEvent(oldValue, newValue, this@NormalMemberImpl, null).broadcast()\n                }\n            }\n        }\n\n    override suspend fun mute(durationSeconds: Int) {\n        check(this.id != bot.id) {\n            \"A bot can't mute itself.\"\n        }\n        require(durationSeconds > 0) {\n            \"durationSeconds must greater than zero\"\n        }\n        checkBotPermissionHigherThanThis(\"mute\")\n        bot.network.sendAndExpect(\n            TroopManagement.Mute(\n                client = bot.client,\n                groupCode = group.id,\n                memberUin = this@NormalMemberImpl.id,\n                timeInSecond = durationSeconds,\n            ), 5000, 2\n        )\n\n        @Suppress(\"RemoveRedundantQualifierName\") // or unresolved reference\n        (net.mamoe.mirai.event.events.MemberMuteEvent(this@NormalMemberImpl, durationSeconds, null).broadcast())\n        this._muteTimestamp = currentTimeSeconds().toInt() + durationSeconds\n    }\n\n    override suspend fun unmute() {\n        checkBotPermissionHigherThanThis(\"unmute\")\n        bot.network.sendAndExpect(\n            TroopManagement.Mute(\n                client = bot.client,\n                groupCode = group.id,\n                memberUin = this@NormalMemberImpl.id,\n                timeInSecond = 0,\n            ), 5000, 2\n        )\n\n        @Suppress(\"RemoveRedundantQualifierName\") // or unresolved reference\n        (net.mamoe.mirai.event.events.MemberUnmuteEvent(this@NormalMemberImpl, null).broadcast())\n        this._muteTimestamp = 0\n    }\n\n    override suspend fun kick(message: String, block: Boolean) {\n        checkBotPermissionHigherThanThis(\"kick\")\n        check(group.members[this.id] != null) {\n            \"Member ${this.id} had already been kicked from group ${group.id}\"\n        }\n        val response: TroopManagement.Kick.Response = bot.network.sendAndExpect(\n            TroopManagement.Kick(\n                client = bot.client,\n                groupCode = group.groupCode,\n                memberId = id,\n                message = message,\n                ban = block\n            ), 5000, 2\n        )\n\n        // Note: when member not found, result is still true.\n\n        if (response.ret == 255) error(\"Operation too fast\") // https://github.com/mamoe/mirai/issues/1503\n        check(response.success) { \"kick member $id of group ${group.id} failed: ${response.ret}\" }\n\n\n        group.members.delegate.removeAll { it.id == this@NormalMemberImpl.id }\n        this@NormalMemberImpl.cancel(CancellationException(\"Kicked by bot\"))\n        MemberLeaveEvent.Kick(this@NormalMemberImpl, null).broadcast()\n    }\n\n    override suspend fun modifyAdmin(operation: Boolean) {\n        checkBotPermissionHighest(\"modifyAdmin\")\n\n        val origin = this@NormalMemberImpl.permission\n        val new = if (operation) {\n            MemberPermission.ADMINISTRATOR\n        } else {\n            MemberPermission.MEMBER\n        }\n\n        if (origin == new) return\n\n        val resp: TroopManagement.ModifyAdmin.Response = bot.network.sendAndExpect(\n            TroopManagement.ModifyAdmin(\n                client = bot.client,\n                member = this@NormalMemberImpl,\n                operation = operation,\n            ), 5000, 2\n        ) as TroopManagement.ModifyAdmin.Response\n\n        check(resp.success) {\n            buildString {\n                append(\"Failed to \")\n                append(if (operation) \"grant\" else \"revoke\")\n                append(\" administrator privileges \")\n                append(if (operation) \"to\" else \"from\")\n                append(\" member \")\n                append(id).append(\" in group \").append(group.id)\n\n                append(\": code=\").append(resp.code)\n                append(\", msg=\").append(resp.msg)\n            }\n        }\n\n        this@NormalMemberImpl.permission = new\n\n        MemberPermissionChangeEvent(this@NormalMemberImpl, origin, new).broadcast()\n    }\n}\n\ninternal fun Member.checkBotPermissionHighest(operationName: String) {\n    check(group.botPermission == MemberPermission.OWNER) {\n        throw PermissionDeniedException(\n            \"`$operationName` operation for member $id requires the OWNER permission, while bot has ${group.botPermission} in group ${group.id}\",\n        )\n    }\n}\n\ninternal fun Member.checkBotPermissionHigherThanThis(operationName: String) {\n    check(group.botPermission > this.permission) {\n        throw PermissionDeniedException(\n            \"`$operationName` operation for member $id of group ${group.id} requires a higher permission, while \" +\n                    \"${group.botPermission} < ${this.permission}\",\n        )\n    }\n}\n\n@OptIn(ExperimentalContracts::class)\ninternal fun Member.checkIsMemberImpl(): NormalMemberImpl {\n    contract {\n        returns() implies (this@checkIsMemberImpl is NormalMemberImpl)\n    }\n    check(this is NormalMemberImpl) { \"A Member instance is not instance of MemberImpl. Don't interlace two protocol implementations together!\" }\n    return this\n}\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/OnlineAnnouncementImpl.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact\n\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.NormalMember\nimport net.mamoe.mirai.contact.announcement.AnnouncementParameters\nimport net.mamoe.mirai.contact.announcement.OnlineAnnouncement\n\n/**\n * Note: Online is not designed to be serializable\n *\n * @since 2.7\n */\n//@SerialName(OnlineAnnouncementImpl.SERIAL_NAME)\n//@Serializable(OnlineAnnouncementImpl.Serializer::class)\ninternal data class OnlineAnnouncementImpl(\n    override val group: Group,\n    override val senderId: Long,\n    override val sender: NormalMember?,\n    override val content: String,\n    override val parameters: AnnouncementParameters,\n    override val fid: String,\n    override val allConfirmed: Boolean,\n    override val confirmedMembersCount: Int,\n    override val publicationTime: Long,\n) : OnlineAnnouncement {\n//\n//    @Serializable\n//    private data class SerialData(\n//        val botId: Long,\n//        val groupId: Long,\n//        val memberId: Long,\n//        val title: String,\n//        val body: String,\n//        val parameters: AnnouncementParameters,\n//        val fid: String,\n//        val isAllRead: Boolean,\n//        val readMemberNumber: Int,\n//        val publishTime: Long,\n//    )\n//\n//    internal object Serializer : KSerializer<OnlineAnnouncementImpl> by SerialData.serializer().map(\n//        SerialData.serializer().descriptor.copy(SERIAL_NAME),\n//        {\n//            OnlineAnnouncementImpl(\n//                sender = Bot.getInstance(botId).getGroupOrFail(groupId).getMemberOrFail(memberId),\n//                title = title,\n//                body = body,\n//                parameters = parameters,\n//                fid = Fid(fid),\n//                isAllRead = isAllRead,\n//                readMemberNumber = readMemberNumber,\n//                publishTime = publishTime\n//            )\n//        },\n//        {\n//            SerialData(\n//                botId = sender.bot.id,\n//                groupId = sender.group.id,\n//                memberId = sender.id,\n//                title = title,\n//                body = body,\n//                parameters = parameters,\n//                fid = fid.toString(),\n//                isAllRead = isAllRead,\n//                readMemberNumber = readMemberNumber,\n//                publishTime = publishTime\n//            )\n//        }\n//    )\n\n//    companion object {\n//        const val SERIAL_NAME: String = \"ReceiveAnnouncement\"\n//    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/OtherClientImpl.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact\n\nimport net.mamoe.mirai.contact.OtherClient\nimport net.mamoe.mirai.contact.OtherClientInfo\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.utils.ExternalResource\nimport kotlin.coroutines.CoroutineContext\n\ninternal inline val OtherClient.appId: Int\n    get() = info.appId\n\ninternal fun QQAndroidBot.createOtherClient(\n    info: OtherClientInfo,\n): OtherClientImpl {\n    return OtherClientImpl(this, coroutineContext, info)\n}\n\ninternal class OtherClientImpl(\n    bot: QQAndroidBot,\n    coroutineContext: CoroutineContext,\n    override val info: OtherClientInfo,\n) : OtherClient, AbstractContact(bot, coroutineContext) {\n    override suspend fun sendMessage(message: Message): MessageReceipt<OtherClient> {\n        throw UnsupportedOperationException(\"OtherClientImpl.sendMessage is not yet supported.\")\n    }\n\n    override suspend fun uploadImage(resource: ExternalResource): Image {\n        throw UnsupportedOperationException(\"OtherClientImpl.uploadImage is not yet supported.\")\n    }\n\n    override fun toString(): String {\n        return \"OtherClient(bot=${bot.id},deviceName=${info.deviceName},platform=${info.platform})\"\n    }\n}\n\n/*\ncontentHead=ContentHead#522561765 {\n}\nmsgBody=MsgBody#-1622349855 {\n        msgContent=08 04 12 1E 08 E9 07 10 B7 F7 8B 80 02 18 E9 07 20 00 28 DD F1 92 B7 07 30 DD F1 92 B7 07 48 02 50 03 32 1E 08 88 80 F8 92 CD 84 80 80 10 10 01 18 00 20 01 2A 0C 0A 0A 08 01 12 06 E5 95 8A E5 95 8A\n        richText=RichText#-184909407 {\n                elems=[]\n        }\n}\nmsgHead=MsgHead#1128220129 {\n        authUin=0x0000000000000000(0)\n        c2cCmd=0x00000007(7)\n        cpid=0x0000000000000000(0)\n        fromUin=0x0000000076E4B8DD(1994701021)\n        isSrcMsg=false\n        msgInstCtrl=InstCtrl#1220180502 {\n                msgExcludeInst=[]\n                msgFromInst=InstInfo#-1165404375 {\n                        apppid=0x000003E9(1001)\n                        enumDeviceType=0x00000002(2)\n                        instid=0x2002FBB7(537066423)\n                }\n                msgSendToInst=[InstInfo#-1165404375 {\n                        apppid=0x000003E9(1001)\n                        enumDeviceType=0x00000003(3)\n                }]\n        }\n        msgSeq=0x000073C8(29640)\n        msgTime=0x5FE34926(1608730918)\n        msgType=0x00000211(529)\n        msgUid=0x0100000076360F0E(72057596021182222)\n        toUin=0x0000000076E4B8DD(1994701021)\n}\n */"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/SendMessageHandler.kt",
    "content": ""
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/StrangerImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n@file:OptIn(LowLevelApi::class)\n@file:Suppress(\n    \"EXPERIMENTAL_API_USAGE\",\n    \"DEPRECATION_ERROR\",\n    \"NOTHING_TO_INLINE\",\n    \"INVISIBLE_MEMBER\",\n    \"INVISIBLE_REFERENCE\"\n)\n\npackage net.mamoe.mirai.internal.contact\n\nimport net.mamoe.mirai.LowLevelApi\nimport net.mamoe.mirai.contact.Stranger\nimport net.mamoe.mirai.contact.User\nimport net.mamoe.mirai.contact.asFriendOrNull\nimport net.mamoe.mirai.data.StrangerInfo\nimport net.mamoe.mirai.event.events.StrangerMessagePostSendEvent\nimport net.mamoe.mirai.event.events.StrangerMessagePreSendEvent\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.message.protocol.outgoing.MessageProtocolStrategy\nimport net.mamoe.mirai.internal.message.protocol.outgoing.StrangerMessageProtocolStrategy\nimport net.mamoe.mirai.internal.message.source.OnlineMessageSourceToStrangerImpl\nimport net.mamoe.mirai.internal.message.source.createMessageReceipt\nimport net.mamoe.mirai.internal.network.protocol.packet.list.StrangerList\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.utils.cast\nimport kotlin.contracts.ExperimentalContracts\nimport kotlin.contracts.contract\nimport kotlin.coroutines.CoroutineContext\n\n\n@OptIn(ExperimentalContracts::class)\ninternal inline fun Stranger.impl(): StrangerImpl {\n    contract { returns() implies (this@impl is StrangerImpl) }\n    check(this is StrangerImpl) { \"A Stranger instance is not instance of StrangerImpl. Your instance: ${this::class.qualifiedName}\" }\n    return this\n}\n\ninternal class StrangerImpl(\n    bot: QQAndroidBot,\n    parentCoroutineContext: CoroutineContext,\n    override val info: StrangerInfo,\n) : Stranger, AbstractUser(bot, parentCoroutineContext, info) {\n    override val nick: String by info::nick\n    override val remark: String by info::remark\n    override suspend fun delete() {\n        check(bot.strangers[this.id] != null) {\n            \"Stranger ${this.id} had already been deleted\"\n        }\n        bot.network.sendAndExpect(StrangerList.DelStranger(bot.client, this@StrangerImpl), 5000, 2).also {\n            check(it.isSuccess) { \"delete Stranger $id failed: ${it.result}\" }\n        }\n    }\n\n    private val messageProtocolStrategy: MessageProtocolStrategy<StrangerImpl> = StrangerMessageProtocolStrategy\n\n    @Suppress(\"DuplicatedCode\")\n    override suspend fun sendMessage(message: Message): MessageReceipt<Stranger> {\n        return asFriendOrNull()?.sendMessage(message)?.convert()\n            ?: sendMessageImpl(\n                message = message,\n                messageProtocolStrategy = messageProtocolStrategy,\n                preSendEventConstructor = ::StrangerMessagePreSendEvent,\n                postSendEventConstructor = ::StrangerMessagePostSendEvent.cast()\n            )\n    }\n\n    private fun MessageReceipt<User>.convert(): MessageReceipt<StrangerImpl> {\n        return OnlineMessageSourceToStrangerImpl(source, this@StrangerImpl).createMessageReceipt(\n            this@StrangerImpl,\n            doLightRefine = false //we've already did\n        )\n    }\n\n    override fun toString(): String = \"Stranger($id)\"\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/active/GroupActiveImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.active\n\nimport kotlinx.coroutines.currentCoroutineContext\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.isActive\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.contact.active.*\nimport net.mamoe.mirai.contact.checkBotPermission\nimport net.mamoe.mirai.data.GroupHonorType\nimport net.mamoe.mirai.data.GroupInfo\nimport net.mamoe.mirai.internal.contact.GroupImpl\nimport net.mamoe.mirai.internal.contact.groupCode\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.check\n\ninternal expect class GroupActiveImpl(\n    group: GroupImpl,\n    logger: MiraiLogger,\n    groupInfo: GroupInfo,\n) : CommonGroupActiveImpl\n\ninternal abstract class CommonGroupActiveImpl(\n    protected val group: GroupImpl,\n    protected val logger: MiraiLogger,\n    groupInfo: GroupInfo,\n) : GroupActive {\n    private var _isHonorVisible: Boolean = groupInfo.isHonorVisible\n    private var _isTitleVisible: Boolean = groupInfo.isTitleVisible\n    private var _isTemperatureVisible: Boolean = groupInfo.isTemperatureVisible\n    private var _isRankVisible: Map<Int, String> = groupInfo.rankTitles\n    private var _temperatureTitles: Map<Int, String> = groupInfo.temperatureTitles\n\n    private suspend fun getGroupLevelInfo(): GroupLevelInfo {\n        return group.bot.getRawGroupLevelInfo(groupCode = group.groupCode).check()\n    }\n\n    private suspend fun refreshRank() {\n        val info = getGroupLevelInfo()\n        _isTitleVisible = info.levelFlag == 1\n        _isTemperatureVisible = info.levelNewFlag == 1\n        _isRankVisible = info.levelName.mapKeys { (level, _) -> level.removePrefix(\"lvln\").toInt() }\n        _temperatureTitles = info.levelNewName.mapKeys { (level, _) -> level.removePrefix(\"lvln\").toInt() }\n    }\n\n    override val isHonorVisible: Boolean get() = _isHonorVisible\n\n    override suspend fun setHonorVisible(newValue: Boolean) {\n        group.checkBotPermission(MemberPermission.ADMINISTRATOR)\n        group.bot.setGroupHonourFlag(groupCode = group.groupCode, flag = newValue).check()\n        _isHonorVisible = newValue\n    }\n\n    override val rankTitles: Map<Int, String> get() = _isRankVisible\n\n    override suspend fun setRankTitles(newValue: Map<Int, String>) {\n        group.checkBotPermission(MemberPermission.ADMINISTRATOR)\n        group.bot.setGroupLevelInfo(groupCode = group.groupCode, new = false, titles = newValue).check()\n        refreshRank()\n    }\n\n    override val isTitleVisible: Boolean get() = _isTitleVisible\n\n    override suspend fun setTitleVisible(newValue: Boolean) {\n        group.checkBotPermission(MemberPermission.ADMINISTRATOR)\n        group.bot.setGroupSetting(groupCode = group.groupCode, new = false, show = newValue).check()\n        refreshRank()\n    }\n\n    override val temperatureTitles: Map<Int, String> get() = _temperatureTitles\n\n    override suspend fun setTemperatureTitles(newValue: Map<Int, String>) {\n        group.checkBotPermission(MemberPermission.ADMINISTRATOR)\n        group.bot.setGroupLevelInfo(groupCode = group.groupCode, new = true, titles = newValue).check()\n        refreshRank()\n    }\n\n    override val isTemperatureVisible: Boolean get() = _isTemperatureVisible\n\n    override suspend fun setTemperatureVisible(newValue: Boolean) {\n        group.checkBotPermission(MemberPermission.ADMINISTRATOR)\n        group.bot.setGroupSetting(groupCode = group.groupCode, new = true, show = newValue).check()\n        refreshRank()\n    }\n\n    override suspend fun refresh() {\n        val info = group.bot.getRawMemberLevelInfo(groupCode = group.groupCode).check()\n        refreshRank()\n        _isHonorVisible = info.honourFlag == 1\n        _isTitleVisible = info.levelFlag == 1\n        _isRankVisible = info.levelName.mapKeys { (level, _) -> level.removePrefix(\"lvln\").toInt() }\n\n        for (member in group.members) {\n            val (_, _, point, rank) = info.lv[member.id] ?: continue\n\n            member.info.point = point\n            member.info.rank = rank\n        }\n    }\n\n    protected suspend fun getGroupActiveData(page: Int?): GroupActiveData {\n        return group.bot.getRawGroupActiveData(group.id, page).check()\n    }\n\n    override fun asFlow(): Flow<ActiveRecord> {\n        return flow {\n            var page = 0\n            while (currentCoroutineContext().isActive) {\n                val result = getGroupActiveData(page = page)\n                val most = result.info.mostAct ?: break\n\n                for (active in most) emit(active.toActiveRecord(group))\n\n                if (result.info.isEnd == 1) break\n                page++\n            }\n        }\n    }\n\n    override suspend fun queryChart(): ActiveChart {\n        return getGroupActiveData(page = null).info.toActiveChart()\n    }\n\n    private suspend fun getHonorInfo(type: GroupHonorType): MemberHonorList {\n        return when (type) {\n            GroupHonorType.TALKATIVE -> group.bot.getRawTalkativeInfo(group.id)\n            GroupHonorType.PERFORMER -> group.bot.getRawContinuousInfo(group.id, type.id)\n            GroupHonorType.LEGEND -> group.bot.getRawContinuousInfo(group.id, type.id)\n            GroupHonorType.STRONG_NEWBIE -> group.bot.getRawContinuousInfo(group.id, type.id)\n            GroupHonorType.EMOTION -> group.bot.getRawEmotionInfo(group.id)\n            GroupHonorType.BRONZE -> group.bot.getRawHomeworkExcellentInfo(group.id, 1)\n            GroupHonorType.SILVER -> group.bot.getRawHomeworkExcellentInfo(group.id, 2)\n            GroupHonorType.GOLDEN -> group.bot.getRawHomeworkExcellentInfo(group.id, 3)\n            GroupHonorType.WHIRLWIND -> group.bot.getRawHomeworkActiveInfo(group.id)\n            GroupHonorType.RICHER -> group.bot.getRawRicherHonorInfo(group.id)\n            GroupHonorType.RED_PACKET -> group.bot.getRawRedPacketInfo(group.id)\n            else -> group.bot.getRawContinuousInfo(group.id, type.id)\n        }\n    }\n\n    override suspend fun queryHonorHistory(type: GroupHonorType): ActiveHonorList {\n        val data = getHonorInfo(type)\n\n        when (type) {\n            GroupHonorType.TALKATIVE, GroupHonorType.RICHER, GroupHonorType.RED_PACKET -> {\n                val current = data.current?.uin\n                for (member in group.members) {\n                    if (member.id != current) {\n                        member.info.honors += type\n                    } else {\n                        member.info.honors -= type\n                    }\n                }\n                data.current?.let { group.members[it.uin] }?.let { it.info.honors += type }\n            }\n            GroupHonorType.LEGEND -> {\n                val current = data.list.mapTo(HashSet()) { it.uin }\n                for (member in group.members) {\n                    if (member.id in current) {\n                        member.info.honors += GroupHonorType.LEGEND\n                        member.info.honors -= GroupHonorType.PERFORMER\n                    } else {\n                        member.info.honors -= GroupHonorType.LEGEND\n                    }\n                }\n            }\n            else -> {\n                val current = data.list.mapTo(HashSet()) { it.uin }\n                for (member in group.members) {\n                    if (member.id in current) {\n                        member.info.honors += type\n                    } else {\n                        member.info.honors -= type\n                    }\n                }\n            }\n        }\n\n        @Suppress(\"INVISIBLE_MEMBER\")\n        return ActiveHonorList(\n            type = type,\n            current = data.current?.toActiveHonorInfo(group),\n            records = data.list.map { it.toActiveHonorInfo(group) },\n        )\n    }\n\n    private suspend fun getMemberScoreData(): MemberScoreData {\n        return group.bot.getRawMemberTitleList(group.id).check()\n    }\n\n    override suspend fun queryActiveRank(): List<ActiveRankRecord> {\n        val data = getMemberScoreData()\n\n        @Suppress(\"INVISIBLE_MEMBER\")\n        return data.members.map {\n            ActiveRankRecord(\n                memberId = it.uin,\n                memberName = it.nickName,\n                member = group.get(id = it.uin),\n                temperature = it.levelId,\n                score = it.score\n            )\n        }\n    }\n\n    private suspend fun getMemberMedalInfo(uid: Long): MemberMedalData {\n        return group.bot.getRawMemberMedalInfo(group.id, uid)\n    }\n\n    suspend fun queryMemberMedal(uid: Long): MemberMedalInfo {\n        val info = getMemberMedalInfo(uid = uid)\n        val medals: MutableSet<MemberMedalType> = HashSet()\n        var worn: MemberMedalType = MemberMedalType.ACTIVE\n\n        for (item in info.list) {\n            if (item.achieveTs == 0) continue\n            val type = when (item.mask) {\n                MemberMedalType.OWNER.mask -> MemberMedalType.OWNER\n                MemberMedalType.ADMIN.mask -> MemberMedalType.ADMIN\n                MemberMedalType.SPECIAL.mask -> MemberMedalType.SPECIAL\n                MemberMedalType.ACTIVE.mask -> MemberMedalType.ACTIVE\n                else -> continue\n            }\n            medals.add(type)\n            if (item.wearTs != 0) worn = type\n        }\n\n        @Suppress(\"INVISIBLE_MEMBER\")\n        return MemberMedalInfo(\n            title = info.weared,\n            color = info.wearedColor,\n            wearing = worn,\n            medals = medals\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/active/GroupActiveProtocol.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.active\n\nimport io.ktor.client.request.*\nimport io.ktor.client.request.forms.*\nimport io.ktor.client.statement.*\nimport io.ktor.http.*\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.Json\nimport kotlinx.serialization.json.JsonElement\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.active.*\nimport net.mamoe.mirai.data.GroupHonorType\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.GroupImpl\nimport net.mamoe.mirai.internal.network.components.HttpClientProvider\nimport net.mamoe.mirai.internal.network.psKey\nimport net.mamoe.mirai.internal.network.sKey\nimport net.mamoe.mirai.utils.*\n\n@Serializable\ninternal data class SetResult(\n    @SerialName(\"ec\") override val errorCode: Int = 0,\n    @SerialName(\"em\") override val errorMessage: String? = null,\n    @SerialName(\"errcode\") val errCode: Int?\n) : CheckableResponseA(), JsonStruct\n\n/**\n * 群等级信息\n */\n@Serializable\ninternal data class GroupLevelInfo(\n    @SerialName(\"ec\") override val errorCode: Int = 0,\n    @SerialName(\"em\") override val errorMessage: String? = null,\n    @SerialName(\"errcode\") val errCode: Int?,\n    @SerialName(\"levelflag\") val levelFlag: Int = 0,\n    @SerialName(\"levelname\") val levelName: Map<String, String> = emptyMap(),\n    @SerialName(\"levelnewflag\") val levelNewFlag: Int = 0,\n    @SerialName(\"levelnewname\") val levelNewName: Map<String, String> = emptyMap()\n) : CheckableResponseA(), JsonStruct\n\n@Serializable\ninternal data class MemberLevelInfo(\n    @SerialName(\"ec\") override val errorCode: Int = 0,\n    @SerialName(\"em\") override val errorMessage: String? = null,\n    @SerialName(\"errcode\") val errCode: Int?,\n    @SerialName(\"role\") val role: Int = 0,\n    @SerialName(\"mems\") val mems: Map<Long, MemberInfo> = emptyMap(),\n    @SerialName(\"lv\") val lv: Map<Long, LevelInfo> = emptyMap(),\n    @SerialName(\"levelflag\") val levelFlag: Int = 0,\n    @SerialName(\"levelname\") val levelName: Map<String, String> = emptyMap(),\n    @SerialName(\"honourflag\") val honourFlag: Int = 0\n) : CheckableResponseA(), JsonStruct {\n\n    @Serializable\n    data class MemberInfo(\n        @SerialName(\"u\") val u: Long = 0, @SerialName(\"g\") val g: Int = 0, @SerialName(\"n\") val n: String = \"\"\n    )\n\n    @Serializable\n    data class LevelInfo(\n        @SerialName(\"u\") val u: Long = 0,\n        @SerialName(\"d\") val d: Int = 0,\n        @SerialName(\"p\") val p: Int = 0,\n        @SerialName(\"l\") val l: Int = 1\n    )\n}\n\n/**\n * 群统计信息\n */\n@Serializable\ninternal data class GroupActiveData(\n    @SerialName(\"ec\") override val errorCode: Int = 0,\n    @SerialName(\"em\") override val errorMessage: String? = null,\n    @SerialName(\"errcode\") val errCode: Int?,\n    @SerialName(\"ginfo\") val info: ActiveInfo,\n    @SerialName(\"query\") val query: Int? = 0,\n    @SerialName(\"role\") val role: Int? = 0\n) : CheckableResponseA(), JsonStruct {\n\n    @Serializable\n    data class Situation(\n        @SerialName(\"date\") val date: String, @SerialName(\"num\") val num: Int\n    )\n\n    @Serializable\n    data class MostActive(\n        @SerialName(\"name\") val name: String,  // 名称 不完整\n        @SerialName(\"sentences_num\") val sentencesNum: Int,   // 发言数\n        @SerialName(\"sta\") val sta: Int = 0, @SerialName(\"uin\") val uin: Long = 0\n    )\n\n    @Serializable\n    data class ActiveInfo(\n        @SerialName(\"g_act_num\") val actNum: List<Situation>? = null,    //发言人数列表\n        @SerialName(\"g_createtime\") val createTime: Int? = 0,\n        @SerialName(\"g_exit_num\") val exitNum: List<Situation>? = null,  //退群人数列表\n        @SerialName(\"g_join_num\") val joinNum: List<Situation>? = null,\n        @SerialName(\"g_mem_num\") val memNum: List<Situation>? = null,   //人数变化\n        @SerialName(\"g_most_act\") val mostAct: List<MostActive>? = null,  //发言排行\n        @SerialName(\"g_sentences\") val sentences: List<Situation>? = null,\n        @SerialName(\"gc\") val gc: Int? = null,\n        @SerialName(\"gn\") val gn: String? = null,\n        @SerialName(\"gowner\") val owner: String? = null,\n        @SerialName(\"isEnd\") val isEnd: Int\n    )\n}\n\n@Serializable\ninternal data class CgiData(\n    @SerialName(\"cgicode\") val cgicode: Int,\n    @SerialName(\"data\") val `data`: JsonElement,\n    @SerialName(\"msg\") override val errorMessage: String,\n    @SerialName(\"retcode\") override val errorCode: Int\n) : CheckableResponseA(), JsonStruct\n\n@Serializable\ninternal data class MemberMedalData(\n    @SerialName(\"avatar\") val avatar: String,\n    @SerialName(\"face_flag\") val faceFlag: Int,\n    @SerialName(\"last_view_ts\") val lastViewTs: Int,\n    @SerialName(\"list\") val list: List<MemberMedalItem>, // 头衔详情\n    @SerialName(\"nick\") val nick: String,\n    @SerialName(\"role\") val role: Int, // 身份/权限\n    @SerialName(\"weared\") val weared: String, // 目前显示头衔\n    @SerialName(\"weared_color\") val wearedColor: String // 头衔颜色\n)\n\n@Serializable\ninternal data class MemberMedalItem(\n    @SerialName(\"achieve_ts\") val achieveTs: Int, // 是否拥有\n    @SerialName(\"category_id\") val categoryId: Int,\n    @SerialName(\"color\") val color: String,\n    @SerialName(\"is_mystery\") val isMystery: Int,\n    @SerialName(\"mask\") val mask: Int, //  群主 300 管理员 301 特殊 302  活跃 315\n    @SerialName(\"medal_desc\") val medalDesc: String,\n    @SerialName(\"name\") val name: String,\n    @SerialName(\"order\") val order: Int,\n    @SerialName(\"pic\") val pic: String,\n    @SerialName(\"rule\") val rule: Int,\n    @SerialName(\"rule_desc\") val ruleDesc: String, // 来源\n    @SerialName(\"wear_ts\") val wearTs: Int // 是否佩戴\n)\n\n@Serializable\ninternal data class MemberHonorInfo(\n    @SerialName(\"add_friend\") val addFriend: Int = 0,\n    @SerialName(\"avatar\") val avatar: String,\n    @SerialName(\"avatar_size\") val avatarSize: Int,\n    @SerialName(\"day_count\") val dayCount: Int,\n    @SerialName(\"day_count_history\") val dayCountHistory: Int = 1,\n    @SerialName(\"day_count_max\") val dayCountMax: Int = 1,\n    @SerialName(\"honor_ids\") val honorIds: List<Int> = emptyList(),\n    @SerialName(\"nick\") val nick: String,\n    @SerialName(\"uin\") val uin: Long,\n    @SerialName(\"update_ymd\") val updated: Long = 0, // 格式为 yyyyMMdd 的 数字，表示最后更新时间\n)\n\ninternal interface MemberHonorList : JsonStruct {\n    val current: MemberHonorInfo? get() = null\n    val total: Int\n    val list: List<MemberHonorInfo>\n}\n\n@Serializable\ninternal data class MemberTalkativeInfo(\n    @SerialName(\"current_talkative\") val currentTalkative: MemberHonorInfo? = null,\n    @SerialName(\"talkative_amount\") val talkativeAmount: Int,\n    @SerialName(\"talkative_list\") val talkativeList: List<MemberHonorInfo>\n) : MemberHonorList {\n    override val current: MemberHonorInfo? get() = currentTalkative\n    override val total: Int get() = talkativeAmount\n    override val list: List<MemberHonorInfo> get() = talkativeList\n}\n\n@Serializable\ninternal data class MemberEmotionInfo(\n    @SerialName(\"emotion_list\") val emotionList: List<MemberHonorInfo>, @SerialName(\"total\") override val total: Int\n) : MemberHonorList {\n    override val list: List<MemberHonorInfo> get() = emotionList\n}\n\n@Serializable\ninternal data class MemberHomeworkExcellentInfo(\n    @SerialName(\"hwexcellent_list\") val excellentList: List<MemberHonorInfo>,\n    @SerialName(\"total\") override val total: Int\n) : MemberHonorList {\n    override val list: List<MemberHonorInfo> get() = excellentList\n}\n\n@Serializable\ninternal data class MemberHomeworkActiveInfo(\n    @SerialName(\"hwactive_list\") val activeList: List<MemberHonorInfo>, @SerialName(\"total\") override val total: Int\n) : MemberHonorList {\n    override val list: List<MemberHonorInfo> get() = activeList\n}\n\n@Serializable\ninternal data class MemberContinuousInfo(\n    @SerialName(\"continuous_list\") val continuousList: List<MemberHonorInfo>,\n    @SerialName(\"total\") override val total: Int\n) : MemberHonorList {\n    override val list: List<MemberHonorInfo> get() = continuousList\n}\n\n@Serializable\ninternal data class MemberRicherHonorInfo(\n    @SerialName(\"current_richer_honor\") val currentRicherHonor: MemberHonorInfo? = null,\n    @SerialName(\"richer_amount\") val richerAmount: Int,\n    @SerialName(\"richer_honor_list\") val richerHonorList: List<MemberHonorInfo>\n) : MemberHonorList {\n    override val current: MemberHonorInfo? get() = currentRicherHonor\n    override val total: Int get() = richerAmount\n    override val list: List<MemberHonorInfo> get() = richerHonorList\n}\n\n@Serializable\ninternal data class MemberRedPacketInfo(\n    @SerialName(\"current_redpacket_honor\") val currentRedPacketHonor: MemberHonorInfo? = null,\n    @SerialName(\"redpacket_amount\") val redPacketAmount: Int,\n    @SerialName(\"redpacket_honor_list\") val redPacketHonorList: List<MemberHonorInfo>\n) : MemberHonorList {\n    override val current: MemberHonorInfo? get() = currentRedPacketHonor\n    override val total: Int get() = redPacketAmount\n    override val list: List<MemberHonorInfo> get() = redPacketHonorList\n}\n\n@Serializable\ninternal data class MemberScoreData(\n    @SerialName(\"level_list\") val levels: List<Level>,\n    @SerialName(\"member_level_list\") val mapping: List<MemberLevel>,\n    @SerialName(\"member_title_info\") val self: MemberScoreInfo,\n    @SerialName(\"members_list\") val members: List<MemberScoreInfo>,\n    @SerialName(\"msg\") override val errorMessage: String,\n    @SerialName(\"retcode\") override val errorCode: Int\n) : CheckableResponseA(), JsonStruct {\n    @Serializable\n    data class Level(\n        @SerialName(\"level\") val level: String, @SerialName(\"name\") val name: String\n    )\n\n    @Serializable\n    data class MemberLevel(\n        @SerialName(\"level\") val level: Int,\n        @SerialName(\"lower_limit\") val lowerLimit: Int,\n        @SerialName(\"mapping_level\") val mappingLevel: Int,\n        @SerialName(\"name\") val name: String\n    )\n\n    @Serializable\n    data class MemberScoreInfo(\n        @SerialName(\"level_id\") val levelId: Int,\n        @SerialName(\"nf\") val nf: Int = 0,\n        @SerialName(\"nick_name\") val nickName: String,\n        @SerialName(\"role\") val role: Int,\n        @SerialName(\"score\") val score: Int,\n        @SerialName(\"uin\") val uin: Long\n    )\n}\n\n\ninternal suspend fun QQAndroidBot.getRawGroupLevelInfo(\n    groupCode: Long\n): GroupLevelInfo {\n    return components[HttpClientProvider].getHttpClient().get {\n        url(\"https://qinfo.clt.qq.com/cgi-bin/qun_info/get_group_level_new_info\")\n        parameter(\"gc\", groupCode)\n        parameter(\"bkn\", client.wLoginSigInfo.bkn)\n        parameter(\"src\", \"qinfo_v3\")\n\n        headers {\n            // ktor bug\n            append(\n                \"cookie\", \"uin=o${id}; skey=${sKey}\"\n            )\n        }\n    }.bodyAsText()\n        .loadAs(GroupLevelInfo.serializer())\n}\n\ninternal suspend fun QQAndroidBot.getRawMemberLevelInfo(\n    groupCode: Long\n): MemberLevelInfo {\n    return components[HttpClientProvider].getHttpClient().get {\n        url(\"https://qinfo.clt.qq.com/cgi-bin/qun_info/get_group_members_lite\")\n        parameter(\"gc\", groupCode)\n        parameter(\"bkn\", client.wLoginSigInfo.bkn)\n        parameter(\"src\", \"qinfo_v3\")\n\n        headers {\n            // ktor bug\n            append(\n                \"cookie\", \"uin=o${id}; skey=${sKey}\"\n            )\n        }\n    }.bodyAsText()\n        .loadAs(MemberLevelInfo.serializer())\n}\n\ninternal suspend fun QQAndroidBot.getRawMemberMedalInfo(\n    groupCode: Long, uid: Long\n): MemberMedalData {\n    return components[HttpClientProvider].getHttpClient().get {\n        url(\"https://qun.qq.com/cgi-bin/qunwelcome/medal2/list\")\n        parameter(\"gc\", groupCode)\n        parameter(\"uin\", uid)\n        parameter(\"bkn\", client.wLoginSigInfo.bkn)\n\n        headers {\n            // ktor bug\n            append(\n                \"cookie\", \"uin=o${id}; skey=${sKey}; p_uin=o${id}; p_skey=${psKey(host)};\"\n            )\n        }\n    }.bodyAsText()\n        .loadAs(CgiData.serializer())\n        .loadData(MemberMedalData.serializer())\n}\n\ninternal suspend fun QQAndroidBot.getRawTalkativeInfo(\n    groupCode: Long\n): MemberTalkativeInfo {\n    return components[HttpClientProvider].getHttpClient().get {\n        url(\"https://qun.qq.com/cgi-bin/qunapp/honor_talkative\")\n        parameter(\"gc\", groupCode)\n        parameter(\"num\", 3000)\n        parameter(\"bkn\", client.wLoginSigInfo.bkn)\n\n        headers {\n            // ktor bug\n            append(\n                \"cookie\", \"uin=o${id}; skey=${sKey}; p_uin=o${id}; p_skey=${psKey(host)};\"\n            )\n        }\n    }.bodyAsText()\n        .loadAs(CgiData.serializer())\n        .loadData(MemberTalkativeInfo.serializer())\n}\n\ninternal suspend fun QQAndroidBot.getRawEmotionInfo(\n    groupCode: Long\n): MemberEmotionInfo {\n    return components[HttpClientProvider].getHttpClient().get {\n        url(\"https://qun.qq.com/cgi-bin/qunapp/honor_emotion\")\n        parameter(\"gc\", groupCode)\n        parameter(\"num\", 3000)\n        parameter(\"bkn\", client.wLoginSigInfo.bkn)\n\n        headers {\n            // ktor bug\n            append(\n                \"cookie\", \"uin=o${id}; skey=${sKey}; p_uin=o${id}; p_skey=${psKey(host)};\"\n            )\n        }\n    }.bodyAsText()\n        .loadAs(CgiData.serializer())\n        .loadData(MemberEmotionInfo.serializer())\n}\n\n@PublishedApi\ninternal val defaultJson: Json = Json {\n    isLenient = true\n    ignoreUnknownKeys = true\n}\n\nprivate fun <T> CgiData.loadData(serializer: KSerializer<T>): T =\n    defaultJson.decodeFromJsonElement(serializer, this.data)\n\n/**\n * @param type 取值 1 2 3 分别对应 学术新星 顶尖学霸 至尊学神\n */\ninternal suspend fun QQAndroidBot.getRawHomeworkExcellentInfo(\n    groupCode: Long, type: Int\n): MemberHomeworkExcellentInfo {\n    return components[HttpClientProvider].getHttpClient().get {\n        url(\"https://qun.qq.com/cgi-bin/qunapp/honor_hwexcellent\")\n        parameter(\"gc\", groupCode)\n        parameter(\"req_type\", type)\n        parameter(\"num\", 3000)\n        parameter(\"bkn\", client.wLoginSigInfo.bkn)\n\n        headers {\n            // ktor bug\n            append(\n                \"cookie\", \"uin=o${id}; skey=${sKey}; p_uin=o${id}; p_skey=${psKey(host)};\"\n            )\n        }\n    }.bodyAsText()\n        .loadAs(CgiData.serializer())\n        .loadData(MemberHomeworkExcellentInfo.serializer())\n}\n\ninternal suspend fun QQAndroidBot.getRawHomeworkActiveInfo(\n    groupCode: Long\n): MemberHomeworkActiveInfo {\n    return components[HttpClientProvider].getHttpClient().get {\n        url(\"https://qun.qq.com/cgi-bin/qunapp/honor_hwactive\")\n        parameter(\"gc\", groupCode)\n        parameter(\"num\", 3000)\n        parameter(\"bkn\", client.wLoginSigInfo.bkn)\n\n        headers {\n            // ktor bug\n            append(\n                \"cookie\", \"uin=o${id}; skey=${sKey}; p_uin=o${id}; p_skey=${psKey(host)};\"\n            )\n        }\n    }.bodyAsText()\n        .loadAs(CgiData.serializer())\n        .loadData(MemberHomeworkActiveInfo.serializer())\n}\n\n/**\n * @param type 取值 2 3 5 分别对应 群聊之火 群聊炽焰 冒尖小春笋\n */\ninternal suspend fun QQAndroidBot.getRawContinuousInfo(\n    groupCode: Long, type: Int\n): MemberContinuousInfo {\n    return components[HttpClientProvider].getHttpClient().get {\n        url(\"https://qun.qq.com/cgi-bin/qunapp/honor_continuous\")\n        parameter(\"gc\", groupCode)\n        parameter(\"num\", 3000)\n        parameter(\"continuous_type\", type)\n        parameter(\"bkn\", client.wLoginSigInfo.bkn)\n\n        headers {\n            // ktor bug\n            append(\n                \"cookie\", \"uin=o${id}; skey=${sKey}; p_uin=o${id}; p_skey=${psKey(host)};\"\n            )\n        }\n    }.bodyAsText()\n        .loadAs(CgiData.serializer())\n        .loadData(MemberContinuousInfo.serializer())\n}\n\ninternal suspend fun QQAndroidBot.getRawRicherHonorInfo(\n    groupCode: Long\n): MemberRicherHonorInfo {\n    return components[HttpClientProvider].getHttpClient().get {\n        url(\"https://qun.qq.com/cgi-bin/new_honor/list_honor/list_richer_honor\")\n        parameter(\"group_code\", groupCode)\n        parameter(\"num\", 3000)\n        parameter(\"bkn\", client.wLoginSigInfo.bkn)\n\n        headers {\n            // ktor bug\n            append(\n                \"cookie\", \"uin=o${id}; skey=${sKey}; p_uin=o${id}; p_skey=${psKey(host)};\"\n            )\n        }\n    }.bodyAsText()\n        .loadAs(CgiData.serializer())\n        .loadData(MemberRicherHonorInfo.serializer())\n}\n\ninternal suspend fun QQAndroidBot.getRawRedPacketInfo(\n    groupCode: Long\n): MemberRedPacketInfo {\n    return components[HttpClientProvider].getHttpClient().get {\n        url(\"https://qun.qq.com/cgi-bin/new_honor/list_honor/list_redpacket_honor\")\n        parameter(\"group_code\", groupCode)\n        parameter(\"num\", 3000)\n        parameter(\"bkn\", client.wLoginSigInfo.bkn)\n\n        headers {\n            // ktor bug\n            append(\n                \"cookie\", \"uin=o${id}; skey=${sKey}; p_uin=o${id}; p_skey=${psKey(host)};\"\n            )\n        }\n    }.bodyAsText()\n        .loadAs(CgiData.serializer())\n        .loadData(MemberRedPacketInfo.serializer())\n}\n\n/**\n * 只有前 50 名的数据\n */\ninternal suspend fun QQAndroidBot.getRawMemberTitleList(\n    groupCode: Long\n): MemberScoreData {\n    return components[HttpClientProvider].getHttpClient().get {\n        url(\"https://qun.qq.com/cgi-bin/honorv2/honor_title_list\")\n        parameter(\"group_code\", groupCode)\n        parameter(\"request_type\", \"2\")\n        parameter(\"g_tk\", client.wLoginSigInfo.bkn)\n\n        headers {\n            // ktor bug\n            append(\n                \"cookie\", \"uin=o${id}; skey=${sKey}; p_uin=o${id}; p_skey=${psKey(host)};\"\n            )\n        }\n    }.bodyAsText()\n        .loadAs(MemberScoreData.serializer())\n}\n\ninternal suspend fun QQAndroidBot.setGroupLevelInfo(\n    groupCode: Long, new: Boolean, titles: Map<Int, String>\n): SetResult {\n    return components[HttpClientProvider].getHttpClient().post {\n        url(\"https://qinfo.clt.qq.com/cgi-bin/qun_info/set_group_level_info\")\n        setBody(FormDataContent(Parameters.build {\n            titles.forEach { (index, name) ->\n                append(\"lvln$index\", name)\n            }\n            append(\"new\", if (new) \"1\" else \"0\")\n            append(\"gc\", groupCode.toString())\n            append(\"src\", \"qinfo_v3\")\n            append(\"bkn\", client.wLoginSigInfo.bkn.toString())\n        }))\n\n        headers {\n            // ktor bug\n            append(\n                \"cookie\", \"uin=o${id}; skey=${sKey}\"\n            )\n        }\n    }.bodyAsText()\n        .loadAs(SetResult.serializer())\n}\n\ninternal suspend fun QQAndroidBot.setGroupSetting(\n    groupCode: Long, new: Boolean, show: Boolean\n): SetResult {\n    return components[HttpClientProvider].getHttpClient().post {\n        url(\"https://qinfo.clt.qq.com/cgi-bin/qun_info/set_group_setting\")\n        setBody(FormDataContent(Parameters.build {\n            append(if (new) \"levelnewflag\" else \"levelflag\", if (show) \"1\" else \"0\")\n            append(\"gc\", groupCode.toString())\n            append(\"src\", \"qinfo_v3\")\n            append(\"bkn\", client.wLoginSigInfo.bkn.toString())\n        }))\n\n        headers {\n            // ktor bug\n            append(\n                \"cookie\", \"uin=o${id}; skey=${sKey}\"\n            )\n        }\n    }.bodyAsText()\n        .loadAs(SetResult.serializer())\n}\n\ninternal suspend fun QQAndroidBot.setGroupHonourFlag(\n    groupCode: Long, flag: Boolean\n): SetResult {\n    return components[HttpClientProvider].getHttpClient().post {\n        url(\"https://qinfo.clt.qq.com/cgi-bin/qun_info/set_honour_flag\")\n        setBody(FormDataContent(Parameters.build {\n            append(\"gc\", groupCode.toString())\n            append(\"bkn\", client.wLoginSigInfo.bkn.toString())\n            append(\"src\", \"qinfo_v3\")\n            append(\"flag\", if (flag) \"0\" else \"1\")\n        }))\n\n        headers {\n            // ktor bug\n            append(\n                \"cookie\", \"uin=o${id}; skey=${sKey}\"\n            )\n        }\n    }.bodyAsText()\n        .loadAs(SetResult.serializer())\n}\n\ninternal suspend fun QQAndroidBot.getRawGroupActiveData(\n    groupCode: Long, page: Int? = null\n): GroupActiveData {\n    return components[HttpClientProvider].getHttpClient().get {\n        url(\"https://qqweb.qq.com/c/activedata/get_mygroup_data\")\n        parameter(\"bkn\", client.wLoginSigInfo.bkn)\n        parameter(\"gc\", groupCode)\n        parameter(\"page\", page)\n        headers {\n            // ktor bug\n            append(\n                \"cookie\", \"uin=o${id}; skey=${sKey}; p_uin=o${id}; p_skey=${psKey(host)};\"\n            )\n        }\n    }.bodyAsText()\n        .loadAs(GroupActiveData.serializer())\n}\n\n@Suppress(\"INVISIBLE_MEMBER\")\ninternal fun GroupActiveData.MostActive.toActiveRecord(group: Group): ActiveRecord {\n    return ActiveRecord(\n        memberId = uin, memberName = name, periodDays = sentencesNum, messagesCount = sta, member = group.get(id = uin)\n    )\n}\n\n@Suppress(\"INVISIBLE_MEMBER\")\ninternal fun GroupActiveData.ActiveInfo.toActiveChart(): ActiveChart {\n    return ActiveChart(\n        actives = actNum?.associate { it.date to it.num }.orEmpty(),\n        sentences = sentences?.associate { it.date to it.num }.orEmpty(),\n        members = memNum?.associate { it.date to it.num }.orEmpty(),\n        join = joinNum?.associate { it.date to it.num }.orEmpty(),\n        exit = exitNum?.associate { it.date to it.num }.orEmpty()\n    )\n}\n\n@Suppress(\"INVISIBLE_MEMBER\")\ninternal fun MemberHonorInfo.toActiveHonorInfo(group: GroupImpl): ActiveHonorInfo {\n    return ActiveHonorInfo(\n        memberName = nick,\n        memberId = uin,\n        avatar = avatar + avatarSize,\n        member = group.get(id = uin),\n        termDays = dayCount,\n        historyDays = dayCountHistory,\n        maxTermDays = dayCountMax\n    )\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/announcement/AnnouncementsImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.announcement\n\nimport io.ktor.client.request.*\nimport io.ktor.client.request.forms.*\nimport io.ktor.client.statement.*\nimport io.ktor.http.*\nimport kotlinx.coroutines.flow.*\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.contact.NormalMember\nimport net.mamoe.mirai.contact.announcement.*\nimport net.mamoe.mirai.contact.checkBotPermission\nimport net.mamoe.mirai.internal.AbstractBot\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.GroupImpl\nimport net.mamoe.mirai.internal.contact.OnlineAnnouncementImpl\nimport net.mamoe.mirai.internal.contact.active.defaultJson\nimport net.mamoe.mirai.internal.contact.announcement.AnnouncementProtocol.deleteGroupAnnouncement\nimport net.mamoe.mirai.internal.contact.announcement.AnnouncementProtocol.getGroupAnnouncement\nimport net.mamoe.mirai.internal.contact.announcement.AnnouncementProtocol.getRawGroupAnnouncements\nimport net.mamoe.mirai.internal.contact.announcement.AnnouncementProtocol.getReadDetail\nimport net.mamoe.mirai.internal.contact.announcement.AnnouncementProtocol.sendGroupAnnouncement\nimport net.mamoe.mirai.internal.contact.announcement.AnnouncementProtocol.sendRemind\nimport net.mamoe.mirai.internal.contact.announcement.AnnouncementProtocol.toAnnouncement\nimport net.mamoe.mirai.internal.contact.announcement.AnnouncementProtocol.toGroupAnnouncement\nimport net.mamoe.mirai.internal.message.contextualBugReportException\nimport net.mamoe.mirai.internal.network.client\nimport net.mamoe.mirai.internal.network.components.HttpClientProvider\nimport net.mamoe.mirai.internal.network.highway.ChannelKind\nimport net.mamoe.mirai.internal.network.highway.ResourceKind\nimport net.mamoe.mirai.internal.network.highway.tryServersUpload\nimport net.mamoe.mirai.internal.network.psKey\nimport net.mamoe.mirai.internal.network.sKey\nimport net.mamoe.mirai.internal.utils.io.writeResource\nimport net.mamoe.mirai.utils.*\nimport net.mamoe.mirai.utils.Either.Companion.onLeft\nimport net.mamoe.mirai.utils.Either.Companion.rightOrNull\n\ninternal class AnnouncementsImpl(\n    protected val group: GroupImpl,\n    protected val logger: MiraiLogger,\n) : Announcements {\n    inline val bot get() = group.bot\n\n    protected suspend fun getGroupAnnouncementList(i: Int): GroupAnnouncementList? {\n        return bot.getRawGroupAnnouncements(group.id, i).onLeft {\n            if (logger.isEnabled) { // createException\n                logger.warning(\n                    { \"Failed to load announcement for group ${group.id}\" },\n                    it.createException()\n                )\n            }\n        }.rightOrNull\n    }\n\n    override fun asFlow(): Flow<OnlineAnnouncement> {\n        return flow {\n            var i = 1\n            while (true) {\n                val result = getGroupAnnouncementList(i++) ?: break\n\n                if (result.inst.isNullOrEmpty() && result.feeds.isNullOrEmpty()) break\n\n                result.inst?.let { emitAll(it.asFlow()) }\n                result.feeds?.let { emitAll(it.asFlow()) }\n            }\n        }.map { it.toAnnouncement(group) }\n    }\n\n\n    override suspend fun delete(fid: String): Boolean {\n        group.checkBotPermission(MemberPermission.ADMINISTRATOR) { \"Only administrator have permission to delete group announcement\" }\n        return bot.deleteGroupAnnouncement(group.id, fid)\n    }\n\n    override suspend fun get(fid: String): OnlineAnnouncement {\n        return bot.getGroupAnnouncement(group.id, fid).toAnnouncement(group)\n    }\n\n\n    private fun Announcement.describe(): String =\n        \"'${content.truncated(10)}' ${parameters.describe()}\"\n\n    private fun AnnouncementParameters.describe(): String {\n        return mutableListOf<String>().apply {\n            if (image != null) add(\"with image\")\n            if (sendToNewMember) add(\"sendToNewMember\")\n            if (isPinned) add(\"pinned\")\n            if (showEditCard) add(\"showEditCard\")\n            if (showPopup) add(\"popup\")\n            if (requireConfirmation) add(\"needConfirm\")\n        }.joinToString()\n    }\n\n    override suspend fun publish(announcement: Announcement): OnlineAnnouncement = announcement.run {\n        val id = announcement.hashCode()\n        logger.verbose { \"Publishing announcement #$id: ${announcement.describe()}\" }\n        val bot = group.bot\n        group.checkBotPermission(MemberPermission.ADMINISTRATOR) { \"Only administrator have permission to send group announcement\" }\n        val image = parameters.image\n        val fid = bot.sendGroupAnnouncement(group.id, toGroupAnnouncement(bot.id), image)\n\n        return OnlineAnnouncementImpl(\n            group = group,\n            senderId = bot.id,\n            sender = group.botAsMember,\n            content = content,\n            parameters = parameters,\n            fid = fid,\n            allConfirmed = false,\n            confirmedMembersCount = 0,\n            publicationTime = currentTimeSeconds()\n        ).also {\n            logger.verbose { \"Publishing announcement #$id: success.\" }\n        }\n    }\n\n    override suspend fun uploadImage(resource: ExternalResource): AnnouncementImage {\n        return tryServersUpload(\n            bot,\n            serversStub,\n            resource.size,\n            ResourceKind.ANNOUNCEMENT_IMAGE,\n            ChannelKind.HTTP\n        ) { _, _ ->\n            // use common logging\n\n            AnnouncementProtocol.uploadGroupAnnouncementImage(bot, resource)\n        }\n    }\n\n    override suspend fun members(fid: String, confirmed: Boolean): List<NormalMember> {\n        group.checkBotPermission(MemberPermission.ADMINISTRATOR) { \"Only administrator have permission see announcement confirmed detail\" }\n        val flow = flow<NormalMember> {\n            var offset = 0\n            while (true) {\n                val detail = bot.getReadDetail(\n                    groupId = group.id,\n                    fid = fid,\n                    read = confirmed,\n                    offset = offset,\n                    limit = 50\n                )\n                if (detail.users.isEmpty()) break\n                for (user in detail.users) {\n                    val member = group[user.uin] ?: continue\n                    emit(member)\n                }\n                offset += detail.users.size\n                val target = if (confirmed) detail.readTotal else detail.unreadTotal\n                if (offset == target) break\n            }\n        }\n        return flow.toList()\n    }\n\n    override suspend fun remind(fid: String) {\n        group.checkBotPermission(MemberPermission.ADMINISTRATOR) { \"Only administrator have permission send announcement remind\" }\n        bot.sendRemind(groupId = group.id, fid = fid)\n    }\n}\n\nprivate val serversStub = listOf(\"web.qun.qq.com\" to 80)\n\ninternal object AnnouncementProtocol {\n    @Serializable\n    data class UploadImageResp(\n        @SerialName(\"ec\") override val errorCode: Int = 0,\n        @SerialName(\"em\") override val errorMessage: String? = null,\n        @SerialName(\"id\") val id: String,\n    ) : CheckableResponseA(), JsonStruct\n\n    suspend fun uploadGroupAnnouncementImage(\n        bot: AbstractBot,\n        resource: ExternalResource\n    ): AnnouncementImage = bot.run {\n        val resp = bot.components[HttpClientProvider].getHttpClient().post {\n            url(\"https://web.qun.qq.com/cgi-bin/announce/upload_img\")\n            setBody(\n                MultiPartFormDataContent(formData {\n                    append(\"\\\"bkn\\\"\", client.wLoginSigInfo.bkn)\n                    append(\"\\\"source\\\"\", \"troopNotice\")\n                    append(\"m\", \"0\")\n                    append(\n                        \"\\\"pic_up\\\"\",\n                        headers = Headers.build {\n                            append(HttpHeaders.ContentType, ContentType.Image.PNG)\n                            append(HttpHeaders.ContentDisposition, \"filename=\\\"temp_uploadFile.png\\\"\")\n                        }\n                    ) {\n                        writeResource(resource)\n                    }\n                })\n            )\n            cookie(\"uin\", \"o$id\")\n            cookie(\"p_uin\", \"o$id\")\n            cookie(\"skey\", sKey)\n            cookie(\"p_skey\", psKey(\"qun.qq.com\"))\n        }.bodyAsText().loadSafelyAs(UploadImageResp.serializer()).check()\n        return resp.id.replace(\"&quot;\", \"\\\"\").loadSafelyAs(GroupAnnouncementImage.serializer()).check().toPublic()\n    }\n\n    @Serializable\n    data class SendGroupAnnouncementResp(\n        @SerialName(\"ec\") override val errorCode: Int = 0,\n        @SerialName(\"em\") override val errorMessage: String? = null,\n        @SerialName(\"new_fid\") val fid: String? = null,\n    ) : CheckableResponseA(), JsonStruct\n\n    suspend fun QQAndroidBot.sendGroupAnnouncement(\n        groupId: Long,\n        announcement: GroupAnnouncement,\n        image: AnnouncementImage?,\n    ): String {\n        val body = bot.components[HttpClientProvider].getHttpClient().post {\n            url(\n                \"https://web.qun.qq.com/cgi-bin/announce/add_qun_\" + if (announcement.type == 20) {\n                    \"instruction\"\n                } else {\n                    \"notice\"\n                }\n            )\n            setBody(\n                MultiPartFormDataContent(formData {\n                    append(\"qid\", groupId)\n                    append(\"bkn\", client.wLoginSigInfo.bkn)\n                    append(\"text\", announcement.msg.text)\n                    append(\"pinned\", announcement.pinned)\n                    image?.let {\n                        append(\"pic\", image.id)\n                        append(\"imgWidth\", image.width)\n                        append(\"imgHeight\", image.height)\n                    }\n                    append(\n                        \"settings\",\n                        announcement.settings.toJsonString(GroupAnnouncementSettings.serializer()),\n                    )\n                    append(\"format\", \"json\")\n                    // append(\"type\", announcement.type.toString())\n                })\n            )\n            cookie(\"uin\", \"o$id\")\n            cookie(\"p_uin\", \"o$id\")\n            cookie(\"skey\", sKey)\n            cookie(\"p_skey\", psKey(\"qun.qq.com\"))\n        }.bodyAsText()\n\n        val resp = body.loadSafelyAs(SendGroupAnnouncementResp.serializer()).check() // check: deserialization errors\n        resp.check() // check: server response\n        resp.fid?.let { return it }\n        // '{\"ec\":1,\"em\":\"no login [errcode:1:0]\",\"ltsm\":1653791033,\"srv_code\":0}'\n\n        throw contextualBugReportException(\"No fid found, but this should have be handled before.\", forDebug = body)\n    }\n\n    suspend fun QQAndroidBot.getRawGroupAnnouncements(\n        groupId: Long,\n        page: Int,\n        amount: Int = 10\n    ): Either<DeserializationFailure, GroupAnnouncementList> {\n        return bot.components[HttpClientProvider].getHttpClient().post {\n            url(\"https://web.qun.qq.com/cgi-bin/announce/list_announce\")\n            setBody(\n                MultiPartFormDataContent(formData {\n                    append(\"qid\", groupId)\n                    append(\"bkn\", client.wLoginSigInfo.bkn)\n                    append(\"ft\", 23)  //好像是一个用来识别应用的参数\n                    append(\"s\", if (page == 1) 0 else -(page * amount + 1))  // 第一页这里的参数应该是-1\n                    append(\"n\", amount)\n                    append(\"ni\", if (page == 1) 1 else 0)\n                    append(\"format\", \"json\")\n                })\n            )\n            cookie(\"uin\", \"o$id\")\n            cookie(\"p_uin\", \"o$id\")\n            cookie(\"skey\", sKey)\n            cookie(\"p_skey\", psKey(\"qun.qq.com\"))\n        }.bodyAsText().loadSafelyAs(GroupAnnouncementList.serializer())\n    }\n\n    @Serializable\n    data class DeleteResp(\n        @SerialName(\"ec\") override val errorCode: Int = 0,\n        @SerialName(\"em\") override val errorMessage: String? = null,\n    ) : CheckableResponseA(), JsonStruct\n\n    suspend fun QQAndroidBot.deleteGroupAnnouncement(groupId: Long, fid: String): Boolean {\n        components[HttpClientProvider].getHttpClient().post {\n            url(\"https://web.qun.qq.com/cgi-bin/announce/del_feed\")\n            setBody(feedBody(groupId, fid))\n            cookie(\"uin\", \"o$id\")\n            cookie(\"p_uin\", \"o$id\")\n            cookie(\"skey\", sKey)\n            cookie(\"p_skey\", psKey(\"qun.qq.com\"))\n        }.bodyAsText().loadSafelyAs(DeleteResp.serializer()).check()\n        return true\n    }\n\n    suspend fun QQAndroidBot.getGroupAnnouncement(groupId: Long, fid: String): GroupAnnouncement {\n        return bot.components[HttpClientProvider].getHttpClient().post {\n            url(\"https://web.qun.qq.com/cgi-bin/announce/get_feed\")\n            setBody(feedBody(groupId, fid))\n            cookie(\"uin\", \"o$id\")\n            cookie(\"p_uin\", \"o$id\")\n            cookie(\"skey\", sKey)\n            cookie(\"p_skey\", psKey(\"qun.qq.com\"))\n        }.bodyAsText().loadAs(GroupAnnouncement.serializer())\n    }\n\n    private fun QQAndroidBot.feedBody(\n        groupId: Long,\n        fid: String\n    ) = MultiPartFormDataContent(formData {\n        append(\"qid\", groupId)\n        append(\"bkn\", client.wLoginSigInfo.bkn)\n        append(\"fid\", fid)\n        append(\"format\", \"json\")\n    })\n\n    private fun <T> CgiData.loadData(serializer: KSerializer<T>): T =\n        defaultJson.decodeFromJsonElement(serializer, this.data)\n\n    suspend fun QQAndroidBot.getReadDetail(\n        groupId: Long,\n        fid: String,\n        read: Boolean,\n        offset: Int,\n        limit: Int\n    ): GroupAnnouncementReadDetail {\n        val cgi = bot.components[HttpClientProvider].getHttpClient().post {\n            url(\"https://qun.qq.com/cgi-bin/qunapp/announce_unread\")\n            parameter(\"gc\", groupId)\n            parameter(\"start\", offset)\n            parameter(\"num\", limit)\n            parameter(\"feed_id\", fid)\n            parameter(\"type\", if (read) 1 else 0)\n            parameter(\"bkn\", client.wLoginSigInfo.bkn)\n            headers {\n                // ktor bug\n                append(\n                    \"cookie\",\n                    \"uin=o${id}; skey=${sKey}; p_uin=o${id}; p_skey=${psKey(\"qun.qq.com\")};\"\n                )\n            }\n        }.bodyAsText().loadAs(CgiData.serializer())\n        check(cgi.cgicode == 0) { cgi.errorMessage }\n        return cgi.loadData(GroupAnnouncementReadDetail.serializer())\n    }\n\n    suspend fun QQAndroidBot.sendRemind(groupId: Long, fid: String) {\n        val cgi = bot.components[HttpClientProvider].getHttpClient().post {\n            url(\"https://qun.qq.com/cgi-bin/qunapp/announce_remindread\")\n            parameter(\"gc\", groupId)\n            parameter(\"feed_id\", fid)\n            parameter(\"bkn\", client.wLoginSigInfo.bkn)\n            headers {\n                // ktor bug\n                append(\n                    \"cookie\",\n                    \"uin=o${id}; skey=${sKey}; p_uin=o${id}; p_skey=${psKey(\"qun.qq.com\")};\"\n                )\n            }\n        }.bodyAsText().loadAs(CgiData.serializer())\n        // 14 \"该公告不存在\"\n        // 54016 \"该公告已提醒多次，不可再提醒。\"\n        // 54010 \"提醒太频繁，请稍后再试\"\n        check(cgi.cgicode == 0) { cgi.errorMessage }\n    }\n\n    fun Announcement.toGroupAnnouncement(senderId: Long): GroupAnnouncement {\n        return GroupAnnouncement(\n            sender = senderId,\n            msg = GroupAnnouncementMsg(text = content), // 实际测试中发布一个新公告的时候不需要进行 html 转码\n            type = if (parameters.sendToNewMember) 20 else 6,\n            settings = GroupAnnouncementSettings(\n                isShowEditCard = if (parameters.showEditCard) 1 else 0,\n                tipWindowType = if (parameters.showPopup) 0 else 1,\n                confirmRequired = if (parameters.requireConfirmation) 1 else 0,\n            ),\n            pinned = if (parameters.isPinned) 1 else 0,\n        )\n    }\n\n    fun GroupAnnouncement.toAnnouncement(group: Group): OnlineAnnouncementImpl {\n        val fid = this.fid ?: \"\"\n\n        return OnlineAnnouncementImpl(\n            group = group,\n            senderId = sender,\n            sender = group[sender],\n            content = msg.text.decodeHtmlEscape(),\n            parameters = buildAnnouncementParameters {\n                isPinned = this@toAnnouncement.pinned == 1\n                sendToNewMember = type == 20\n                showPopup = settings.tipWindowType == 0\n                requireConfirmation = settings.confirmRequired == 1\n                showEditCard = settings.isShowEditCard == 1\n                image = msg.images.firstOrNull()?.toPublic()\n            },\n            fid = fid,\n            allConfirmed = isAllConfirm != 0,\n            confirmedMembersCount = readNum,\n            publicationTime = time\n        )\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/announcement/GroupAnnouncement.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"DEPRECATION\")\n\npackage net.mamoe.mirai.internal.contact.announcement\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.JsonElement\nimport net.mamoe.mirai.contact.announcement.AnnouncementImage\nimport net.mamoe.mirai.utils.CheckableResponseA\nimport net.mamoe.mirai.utils.JsonStruct\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n@Serializable\ninternal data class GroupAnnouncementList(\n    @SerialName(\"ec\") override val errorCode: Int = 0,\n    @SerialName(\"em\") override val errorMessage: String? = null,\n    val feeds: List<GroupAnnouncement>? = null,   //群公告列表\n    val inst: List<GroupAnnouncement>? = null  //置顶列表？ 应该是发送给新成员的\n) : CheckableResponseA(), JsonStruct {\n    /*\n  // notes from original implementor, luo123, on 2020/3/13\n\n * 群公告数据类\n * getGroupAnnouncementList时，如果page=1，那么你可以在inst里拿到一些置顶公告\n *\n * 发公告时只需要填写text，其他参数可为默认值\n *\n     */\n}\n\n@Serializable\ninternal data class GroupAnnouncement(\n    @SerialName(\"u\") val sender: Long = 0, //发送者id\n    val msg: GroupAnnouncementMsg,\n    val type: Int = 0, //20 为inst , 6 为feeds\n    val settings: GroupAnnouncementSettings = GroupAnnouncementSettings.DEFAULT,\n    @SerialName(\"pubt\") val time: Long = 0, //发布时间\n    @SerialName(\"read_num\") val readNum: Int = 0, //如果需要确认,则为确认收到的人数,反之则为已经阅读的人数\n    @SerialName(\"is_read\") val isRead: Int = 0, //好像没用\n    @SerialName(\"is_all_confirm\") val isAllConfirm: Int = 0, //为0 则未全部收到\n    val pinned: Int = 0, //1为置顶, 0为默认\n    val fid: String? = null,      //公告的id\n) : JsonStruct\n\n@Serializable\ninternal class GroupAnnouncementImage @MiraiInternalApi constructor(\n    @SerialName(\"h\") val height: Int,\n    @SerialName(\"w\") val width: Int,\n    @SerialName(\"id\") val id: String\n) : JsonStruct {\n    fun toPublic(): AnnouncementImage = AnnouncementImage.create(id, height, width)\n}\n\n@Serializable\ninternal data class GroupAnnouncementMsg(\n    val text: String,\n    @SerialName(\"text_face\") val textFace: String? = null,\n    @SerialName(\"pics\") val images: List<GroupAnnouncementImage> = emptyList(),\n//    val title: String? = null // no title any more\n)\n\n\n@Serializable\ninternal data class GroupAnnouncementSettings(\n    @SerialName(\"is_show_edit_card\") val isShowEditCard: Int = 0, //引导群成员修改该昵称  1 引导\n    @SerialName(\"remind_ts\") val remindTs: Int = 0,\n    @SerialName(\"tip_window_type\") val tipWindowType: Int = 0,  //是否用弹窗展示   1 不使用\n    @SerialName(\"confirm_required\") val confirmRequired: Int = 0 // 是否需要确认收到 1 需要\n) : JsonStruct {\n    companion object {\n        val DEFAULT = GroupAnnouncementSettings()\n    }\n}\n\n@Serializable\ninternal data class CgiData(\n    @SerialName(\"cgicode\") val cgicode: Int,\n    @SerialName(\"data\") val `data`: JsonElement,\n    @SerialName(\"msg\") override val errorMessage: String,\n    @SerialName(\"retcode\") override val errorCode: Int\n) : CheckableResponseA(), JsonStruct\n\n@Serializable\ninternal data class GroupAnnouncementReadDetail(\n    @SerialName(\"read_total\") val readTotal: Int = 0,\n    @SerialName(\"unread_total\") val unreadTotal: Int = 0,\n    @SerialName(\"users\") val users: List<User> = emptyList()\n) {\n    @Serializable\n    data class User(\n        @SerialName(\"avatar\") val avatar: String,\n        @SerialName(\"display_name\") val displayName: String,\n        @SerialName(\"face_flag\") val faceFlag: Int,\n        @SerialName(\"uin\") val uin: Long\n    )\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/essence/EssencesImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.essence\n\nimport kotlinx.coroutines.currentCoroutineContext\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.isActive\nimport kotlinx.serialization.json.JsonObject\nimport kotlinx.serialization.json.int\nimport kotlinx.serialization.json.intOrNull\nimport kotlinx.serialization.json.jsonPrimitive\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.contact.checkBotPermission\nimport net.mamoe.mirai.contact.essence.EssenceMessageRecord\nimport net.mamoe.mirai.contact.essence.Essences\nimport net.mamoe.mirai.internal.contact.GroupImpl\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.TroopEssenceMsgManager\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.*\nimport net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource\n\ninternal class EssencesImpl(\n    internal val group: GroupImpl,\n    internal val logger: MiraiLogger,\n) : Essences {\n\n    private suspend fun parse(content: JsonObject): Message {\n        return when (content.getValue(\"msg_type\").jsonPrimitive.intOrNull) {\n            1 -> PlainText(content = content.getValue(\"text\").jsonPrimitive.content)\n            2 -> Face(id = content.getValue(\"face_index\").jsonPrimitive.int)\n            3 -> {\n                val url = content.getValue(\"image_url\").jsonPrimitive.content\n\n                try {\n                    // url -> bytes -> group.upload\n                    val bytes = group.bot.downloadEssenceMessageImage(url)\n                    bytes.toExternalResource().use { group.uploadImage(it) }\n                } catch (cause: Exception) {\n                    logger.debug({ \"essence message image $url download fail.\" }, cause)\n                    val match = IMAGE_MD5_REGEX.find(url) ?: return emptyMessageChain()\n                    val (md5, ext) = match.destructured\n                    val imageId = buildString {\n                        append(md5)\n                        insert(8,\"-\")\n                        insert(13,\"-\")\n                        insert(18,\"-\")\n                        insert(23,\"-\")\n                        insert(0, \"{\")\n                        append(\"}.\")\n                        append(ext.replace(\"jpeg\", \"jpg\"))\n                    }\n                    Image(imageId)\n                }\n            }\n            else -> {\n                // XXX: unknown message type\n                logger.warning { \"unknown digest message type for $content\" }\n                emptyMessageChain()\n            }\n        }\n    }\n\n    private fun plain(content: JsonObject): String {\n        return when (content.getValue(\"msg_type\").jsonPrimitive.intOrNull) {\n            1 -> content.getValue(\"text\").jsonPrimitive.content\n            2 -> Face(id = content.getValue(\"face_index\").jsonPrimitive.int).content\n            3 -> \"[图片]\"\n            else -> \"\"\n        }\n    }\n\n    private suspend fun source(digests: DigestMessage, parse: Boolean): MessageSource {\n        return group.bot.buildMessageSource(MessageSourceKind.GROUP) {\n            ids = intArrayOf(digests.msgSeq.toInt())\n            internalIds = intArrayOf(digests.msgRandom.toInt())\n            time = digests.senderTime\n\n            fromId = digests.senderUin\n            targetId = group.id\n\n            if (parse) {\n                messages(digests.msgContent.map { content -> parse(content) })\n            } else {\n                messages(digests.msgContent.joinToString { content -> plain(content) }.toPlainText())\n            }\n        }\n    }\n\n    private fun record(digests: DigestMessage): EssenceMessageRecord {\n        return EssenceMessageRecord(\n            group = group,\n            sender = group[digests.senderUin],\n            senderId = digests.senderUin,\n            senderNick = digests.senderNick,\n            senderTime = digests.senderTime,\n            operator = group[digests.addDigestUin],\n            operatorId = digests.addDigestUin,\n            operatorNick = digests.addDigestNick,\n            operatorTime = digests.addDigestTime,\n            loadMessageSource = { source(digests = digests, parse = false) }\n        )\n    }\n\n    override suspend fun getPage(start: Int, limit: Int): List<EssenceMessageRecord> {\n        val page = group.bot.getDigestList(\n            groupCode = group.id,\n            pageStart = start,\n            pageLimit = limit\n        )\n\n        return page.messages.map(this::record)\n    }\n\n    override suspend fun share(source: MessageSource): String {\n        val share = group.bot.shareDigest(\n            groupCode = group.id,\n            msgSeq = source.ids.first().toLong().and(0xFFFF_FFFF),\n            msgRandom = source.internalIds.first().toLong().and(0xFFFF_FFFF),\n            targetGroupCode = 0\n        )\n        return \"https://qun.qq.com/essence/share?_wv=3&_wwv=128&_wvx=2&sharekey=${share.shareKey}\"\n    }\n\n    override suspend fun remove(source: MessageSource) {\n        group.checkBotPermission(MemberPermission.ADMINISTRATOR)\n        val result = group.bot.network.sendAndExpect(\n            TroopEssenceMsgManager.RemoveEssence(\n                group.bot.client,\n                group.uin,\n                source.internalIds.first(),\n                source.ids.first()\n            ), 5000, 2\n        )\n        if (result.success.not()) {\n            try {\n                group.bot.cancelDigest(\n                    groupCode = group.id,\n                    msgSeq = source.ids.first().toLong().and(0xFFFF_FFFF),\n                    msgRandom = source.internalIds.first().toLong().and(0xFFFF_FFFF)\n                )\n            } catch (cause: IllegalStateException) {\n                cause.addSuppressed(IllegalStateException(result.msg))\n                throw cause\n            }\n        }\n    }\n\n    override fun asFlow(): Flow<EssenceMessageRecord> {\n        return flow {\n            var offset = 0\n            while (currentCoroutineContext().isActive) {\n                val page = group.bot.getDigestList(\n                    groupCode = group.id,\n                    pageStart = offset,\n                    pageLimit = 30\n                )\n                for (message in page.messages) {\n                    emit(record(message))\n                }\n                if (page.isEnd) break\n                if (page.messages.isEmpty()) break\n                offset += 30\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/essence/GroupDigestProtocol.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.essence\n\nimport io.ktor.client.call.*\nimport io.ktor.client.request.*\nimport io.ktor.client.statement.*\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.JsonElement\nimport kotlinx.serialization.json.JsonNull\nimport kotlinx.serialization.json.JsonObject\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.active.defaultJson\nimport net.mamoe.mirai.internal.network.components.HttpClientProvider\nimport net.mamoe.mirai.internal.network.psKey\nimport net.mamoe.mirai.internal.network.sKey\nimport net.mamoe.mirai.utils.CheckableResponseA\nimport net.mamoe.mirai.utils.JsonStruct\nimport net.mamoe.mirai.utils.loadAs\n\n@Serializable\ninternal data class DigestData(\n    @SerialName(\"data\") val `data`: JsonElement = JsonNull,\n    @SerialName(\"wording\") val reason: String = \"\",\n    @SerialName(\"retmsg\") override val errorMessage: String,\n    @SerialName(\"retcode\") override val errorCode: Int\n) : CheckableResponseA(), JsonStruct\n\n@Serializable\ninternal data class DigestList(\n    @SerialName(\"group_role\")\n    val role: Int = 0,\n    @SerialName(\"is_end\")\n    val isEnd: Boolean = false,\n    @SerialName(\"msg_list\")\n    val messages: List<DigestMessage> = emptyList(),\n    @SerialName(\"show_tips\")\n    val showTips: Boolean = false\n)\n\n@Serializable\ninternal data class DigestMessage(\n    @SerialName(\"add_digest_nick\")\n    val addDigestNick: String = \"\",\n    @SerialName(\"add_digest_time\")\n    val addDigestTime: Int = 0,\n    @SerialName(\"add_digest_uin\")\n    val addDigestUin: Long = 0,\n    @SerialName(\"group_code\")\n    val groupCode: String = \"\",\n    @SerialName(\"msg_content\")\n    val msgContent: List<JsonObject> = emptyList(),\n    @SerialName(\"msg_random\")\n    val msgRandom: Long = 0,\n    @SerialName(\"msg_seq\")\n    val msgSeq: Long = 0,\n    @SerialName(\"sender_nick\")\n    val senderNick: String = \"\",\n    @SerialName(\"sender_time\")\n    val senderTime: Int = 0,\n    @SerialName(\"sender_uin\")\n    val senderUin: Long = 0\n)\n\ninternal val IMAGE_MD5_REGEX: Regex = \"\"\"([0-9a-fA-F]{32})\\.([0-9a-zA-Z]+)\"\"\".toRegex()\n\n@Serializable\ninternal data class DigestShare(\n    @SerialName(\"share_key\")\n    val shareKey: String = \"\"\n)\n\nprivate fun <T> DigestData.loadData(serializer: KSerializer<T>): T {\n    return try {\n        defaultJson.decodeFromJsonElement(serializer, this.data)\n    } catch (cause: Exception) {\n        throw IllegalStateException(\"parse digest data error, status: $errorCode - $errorMessage\", cause)\n    }\n}\n\ninternal suspend fun QQAndroidBot.getDigestList(\n    groupCode: Long, pageStart: Int, pageLimit: Int\n): DigestList {\n    return components[HttpClientProvider].getHttpClient().get {\n        url(\"https://qun.qq.com/cgi-bin/group_digest/digest_list\")\n        parameter(\"group_code\", groupCode)\n        parameter(\"page_start\", pageStart)\n        parameter(\"page_limit\", pageLimit)\n        parameter(\"bkn\", client.wLoginSigInfo.bkn)\n\n        headers {\n            // ktor bug\n            append(\n                \"cookie\",\n                \"uin=o${id}; skey=${sKey}; p_uin=o${id}; p_skey=${psKey(host)};\"\n            )\n        }\n    }.bodyAsText().loadAs(DigestData.serializer()).loadData(DigestList.serializer())\n}\n\ninternal suspend fun QQAndroidBot.cancelDigest(\n    groupCode: Long, msgSeq: Long, msgRandom: Long\n) {\n    val data = components[HttpClientProvider].getHttpClient().get {\n        url(\"https://qun.qq.com/cgi-bin/group_digest/cancel_digest\")\n        parameter(\"group_code\", groupCode)\n        parameter(\"msg_seq\", msgSeq)\n        parameter(\"msg_random\", msgRandom)\n        parameter(\"bkn\", client.wLoginSigInfo.bkn)\n\n        headers {\n            // ktor bug\n            append(\n                \"cookie\",\n                \"uin=o${id}; skey=${sKey}; p_uin=o${id}; p_skey=${psKey(host)};\"\n            )\n        }\n    }.bodyAsText().loadAs(DigestData.serializer())\n\n    when (data.errorCode) {\n        0, 11007, 11001 -> Unit\n        else -> throw IllegalStateException(\"cancel digest error, status: ${data.errorCode} - ${data.errorMessage}, reason: ${data.reason}\")\n    }\n}\n\ninternal suspend fun QQAndroidBot.shareDigest(\n    groupCode: Long, msgSeq: Long, msgRandom: Long, targetGroupCode: Long\n): DigestShare {\n    return components[HttpClientProvider].getHttpClient().get {\n        url(\"https://qun.qq.com/cgi-bin/group_digest/share_digest\")\n        parameter(\"group_code\", groupCode)\n        parameter(\"msg_seq\", msgSeq)\n        parameter(\"msg_random\", msgRandom)\n        parameter(\"target_group_code\", targetGroupCode)\n        parameter(\"bkn\", client.wLoginSigInfo.bkn)\n\n        headers {\n            // ktor bug\n            append(\n                \"cookie\",\n                \"uin=o${id}; skey=${sKey}; p_uin=o${id}; p_skey=${psKey(host)};\"\n            )\n        }\n    }.bodyAsText().loadAs(DigestData.serializer()).loadData(DigestShare.serializer())\n}\n\ninternal suspend fun QQAndroidBot.downloadEssenceMessageImage(urlString: String): ByteArray {\n    return components[HttpClientProvider].getHttpClient().get {\n        url(urlString)\n    }.body()\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/file/AbsoluteFileImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.file\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.contact.FileSupported\nimport net.mamoe.mirai.contact.file.AbsoluteFile\nimport net.mamoe.mirai.contact.file.AbsoluteFolder\nimport net.mamoe.mirai.internal.message.data.FileMessageImpl\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.FileManagement\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.toResult\nimport net.mamoe.mirai.message.data.FileMessage\nimport net.mamoe.mirai.utils.isSameClass\nimport net.mamoe.mirai.utils.toUHexString\n\ninternal class AbsoluteFileImpl(\n    contact: FileSupported,\n    parent: AbsoluteFolder?,\n    id: String,\n    name: String,\n    uploadTime: Long,\n    lastModifiedTime: Long,\n    uploaderId: Long,\n\n    override var expiryTime: Long,\n    override val size: Long, // when file is changed, its id will also be changed, so no need to be var\n    override val sha1: ByteArray,\n    override val md5: ByteArray,\n\n    busId: Int,\n) : AbsoluteFile, AbstractAbsoluteFileFolder(\n    contact, parent, id, name, uploadTime, uploaderId, lastModifiedTime,\n    busId\n) {\n    override fun checkPermission(operationHint: String) {\n        // TODO: 30/10/2021  checkPermission: 群可以设置允许任何人上传而目前没有检测这个属性, 因此不能实现权限判定\n\n//        if (uploaderId == bot.id) return\n//        if (contact is GroupImpl && !contact.botPermission.isOperator()) throwPermissionDeniedException(operationHint)\n//        return\n    }\n\n    override val isFile: Boolean get() = true\n    override val isFolder: Boolean get() = false\n\n    override val absolutePath: String\n        get() {\n            val parent = parent\n            return when {\n                parent == null || parent.name == \"/\" -> \"/$name\"\n                else -> \"${parent.absolutePath}/$name\"\n            }\n        }\n\n    override suspend fun exists(): Boolean {\n        return bot.network.sendAndExpect(\n            FileManagement.GetFileInfo(\n                client,\n                groupCode = contact.id,\n                busId = busId,\n                fileId = id\n            )\n        ).toResult(\"AbsoluteFileImpl.exists\", checkResp = false)\n            .getOrThrow()\n            .fileInfo != null\n    }\n\n\n    override suspend fun moveTo(folder: AbsoluteFolder): Boolean {\n        if (folder.contact != this.contact) {\n            error(\"Cross-group file operation is not yet supported.\")\n        }\n        if (folder.absolutePath == this.parentOrRoot.absolutePath) return true\n        checkPermission(\"moveTo\")\n\n\n        val result =\n            bot.network.sendAndExpect(\n                FileManagement.MoveFile(\n                    client,\n                    contact.id,\n                    busId,\n                    id,\n                    parent.idOrRoot,\n                    folder.idOrRoot\n                )\n            )\n                .toResult(\"AbsoluteFileImpl.moveTo\", checkResp = false)\n                .getOrThrow()\n\n        return when (result.int32RetCode) {\n            -36 -> throwPermissionDeniedException(\"moveTo\")\n            0 -> {\n                parent = folder\n                true\n            }\n            else -> {\n                false\n            }\n        }\n//        } else {\n//            return FileManagement.RenameFolder(client, contact.id, id, name).sendAndExpect(bot)\n//                .toResult(\"RemoteFile.moveTo\", checkResp = false).getOrThrow().int32RetCode == 0\n//        }\n    }\n\n    override suspend fun getUrl(): String? {\n        // Known error\n        // java.lang.IllegalStateException: Failed AbsoluteFileImpl.getUrl, result=-303, msg=param error: bus_id\n        // java.lang.IllegalStateException: Failed AbsoluteFileImpl.getUrl, result=-103, msg=GetFileAttrAction file not exist\n\n        val resp = bot.network.sendAndExpect(\n            FileManagement.RequestDownload(\n                client,\n                groupCode = contact.id,\n                busId = busId,\n                fileId = id\n            )\n        ).toResult(\"AbsoluteFileImpl.getUrl\").getOrElse { return null }\n\n\n        return \"http://${resp.downloadIp}/ftn_handler/${resp.downloadUrl.toUHexString(\"\")}/?fname=\" +\n                id.toByteArray().toUHexString(\"\")\n    }\n\n    override fun toMessage(): FileMessage {\n        return FileMessageImpl(id, busId, name, size)\n    }\n\n    override suspend fun refresh(): Boolean {\n        val new = refreshed() ?: return false\n        this.parent = new.parent\n        this.expiryTime = new.expiryTime\n        this.name = new.name\n        this.lastModifiedTime = new.lastModifiedTime\n        return true\n    }\n\n    override fun toString(): String = \"AbsoluteFile(name=$name, absolutePath=$absolutePath, id=$id)\"\n\n    override suspend fun refreshed(): AbsoluteFile? {\n        val result = bot.network.sendAndExpect(FileManagement.GetFileInfo(client, contact.id, id, busId))\n            .toResult(\"AbsoluteFile.refreshed\")\n            .getOrNull()?.fileInfo\n            ?: return null\n\n        return if (result.parentFolderId == this.parentOrRoot.id) {\n            this.parentOrRoot.impl().createChildFile(result)\n        } else {\n            null\n        }\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (other !is AbsoluteFileImpl || !isSameClass(this, other)) return false\n        if (!super.equals(other)) return false\n\n        if (expiryTime != other.expiryTime) return false\n        if (size != other.size) return false\n        if (!sha1.contentEquals(other.sha1)) return false\n        if (!md5.contentEquals(other.md5)) return false\n\n        return true\n    }\n\n    override fun hashCode(): Int {\n        var result = super.hashCode()\n        result = 31 * result + expiryTime.hashCode()\n        result = 31 * result + size.hashCode()\n        result = 31 * result + sha1.contentHashCode()\n        result = 31 * result + md5.contentHashCode()\n        return result\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/file/AbsoluteFolderImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.file\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.coroutines.flow.*\nimport net.mamoe.mirai.contact.FileSupported\nimport net.mamoe.mirai.contact.file.AbsoluteFile\nimport net.mamoe.mirai.contact.file.AbsoluteFileFolder\nimport net.mamoe.mirai.contact.file.AbsoluteFolder\nimport net.mamoe.mirai.contact.isOperator\nimport net.mamoe.mirai.internal.contact.GroupImpl\nimport net.mamoe.mirai.internal.contact.file.RemoteFilesImpl.Companion.findFileByPath\nimport net.mamoe.mirai.internal.message.flags.AllowSendFileMessage\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.components.ClockHolder.Companion.clock\nimport net.mamoe.mirai.internal.network.highway.Highway\nimport net.mamoe.mirai.internal.network.highway.ResourceKind\nimport net.mamoe.mirai.internal.network.protocol\nimport net.mamoe.mirai.internal.network.protocol.data.proto.*\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.FileManagement\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.toResult\nimport net.mamoe.mirai.internal.utils.FileSystem\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.utils.*\n\ninternal fun Oidb0x6d8.GetFileListRspBody.Item.resolved(parent: CommonAbsoluteFolderImpl): AbsoluteFileFolder? {\n    val item = this\n    return when {\n        item.fileInfo != null -> {\n            parent.createChildFile(item.fileInfo)\n        }\n        item.folderInfo != null -> {\n            parent.createChildFolder(item.folderInfo)\n        }\n        else -> null\n    }\n}\n\ninternal fun CommonAbsoluteFolderImpl.createChildFolder(\n    folderInfo: GroupFileCommon.FolderInfo\n): AbsoluteFolderImpl = AbsoluteFolderImpl(\n    contact = contact,\n    parent = this,\n    id = folderInfo.folderId,\n    name = folderInfo.folderName,\n    uploadTime = folderInfo.createTime.toLongUnsigned(),\n    uploaderId = folderInfo.createUin,\n    lastModifiedTime = folderInfo.modifyTime.toLongUnsigned(),\n    contentsCount = folderInfo.totalFileCount\n)\n\ninternal fun CommonAbsoluteFolderImpl.createChildFile(\n    info: GroupFileCommon.FileInfo\n): AbsoluteFileImpl = AbsoluteFileImpl(\n    contact = contact,\n    parent = this,\n    id = info.fileId,\n    name = info.fileName,\n    uploadTime = info.uploadTime.toLongUnsigned(),\n    lastModifiedTime = info.modifyTime.toLongUnsigned(),\n    uploaderId = info.uploaderUin,\n    expiryTime = info.deadTime.toLongUnsigned(),\n    size = info.fileSize,\n    sha1 = info.sha,\n    md5 = info.md5,\n    busId = info.busId\n)\n\ninternal expect class AbsoluteFolderImpl(\n    contact: FileSupported, parent: AbsoluteFolder?, id: String, name: String,\n    uploadTime: Long, uploaderId: Long, lastModifiedTime: Long,\n    contentsCount: Int,\n) : CommonAbsoluteFolderImpl\n\ninternal abstract class CommonAbsoluteFolderImpl(\n    contact: FileSupported, parent: AbsoluteFolder?, id: String, name: String,\n    uploadTime: Long, uploaderId: Long, lastModifiedTime: Long,\n    override var contentsCount: Int,\n) : AbstractAbsoluteFileFolder(\n    contact,\n    parent, id, name, uploadTime, uploaderId, lastModifiedTime, 0\n), AbsoluteFolder {\n    override fun checkPermission(operationHint: String) {\n        // 目录权限不受 '允许任何人上传' 设置的影响\n        if (contact is GroupImpl && !contact.botPermission.isOperator()) throwPermissionDeniedException(operationHint)\n        return\n    }\n\n    override val isFile: Boolean get() = false\n    override val isFolder: Boolean get() = true\n\n    override val absolutePath: String\n        get() {\n            val parent = parent\n            return when {\n                parent == null || this.id == \"/\" -> \"/\"\n                parent.parent == null || parent.id == \"/\" -> \"/$name\"\n                else -> \"${parent.absolutePath}/$name\"\n            }\n        }\n\n    companion object {\n        suspend fun getItemsFlow(\n            client: QQAndroidClient,\n            contact: FileSupported,\n            folderId: String\n        ): Flow<Oidb0x6d8.GetFileListRspBody.Item> {\n            return flow {\n                var index = 0\n                while (true) {\n                    val list =\n                        client.bot.network.sendAndExpect(\n                            FileManagement.GetFileList(\n                                client,\n                                groupCode = contact.id,\n                                folderId = folderId,\n                                startIndex = index\n                            )\n                        ).toResult(\"AbsoluteFolderImpl.getFilesFlow\").getOrThrow()\n                    index += list.itemList.size\n\n                    if (list.int32RetCode != 0) return@flow\n                    if (list.itemList.isEmpty()) return@flow\n\n                    emitAll(list.itemList.asFlow())\n                }\n            }\n        }\n\n        suspend fun uploadNewFileImpl(\n            folder: AbsoluteFolderImpl,\n            filepath: String,\n            content: ExternalResource,\n            callback: ProgressionCallback<AbsoluteFile, Long>?\n        ): AbsoluteFile {\n            if (filepath.isBlank()) throw IllegalArgumentException(\"filename cannot be blank.\")\n            // TODO: 12/10/2021 checkPermission for AbsoluteFolderImpl.upload\n\n            content.withAutoClose {\n                val resp =\n                    folder.bot.network.sendAndExpect(\n                        FileManagement.RequestUpload(\n                            folder.client,\n                            groupCode = folder.contact.id,\n                            folderId = folder.id,\n                            resource = content,\n                            filename = filepath\n                        )\n                    ).toResult(\"AbsoluteFolderImpl.upload\").getOrThrow()\n\n                when (resp.int32RetCode) {\n                    -36 -> folder.throwPermissionDeniedException(\"uploadNewFile\")\n                }\n\n                val file = AbsoluteFileImpl(\n                    contact = folder.contact,\n                    parent = folder,\n                    id = resp.fileId,\n                    name = filepath,\n                    uploadTime = folder.bot.clock.server.currentTimeSeconds(),\n                    lastModifiedTime = folder.bot.clock.server.currentTimeSeconds(),\n                    expiryTime = 0,\n                    uploaderId = folder.bot.id,\n                    size = content.size,\n                    sha1 = content.sha1,\n                    md5 = content.md5,\n                    busId = resp.busId\n                )\n\n                if (resp.boolFileExist) {\n                    // resp.boolFileExist:\n                    //      服务器是否存在相同的内容, 只是用来判断可不可以跳过上传\n                    //      当为 true 时跳过上传, 但仍然需要完成 `sendMessage(FileMessage)` 才是正常逻辑\n                    callback?.onBegin(file, content)\n                    val result = kotlin.runCatching {\n                        folder.contact.sendMessage(AllowSendFileMessage + file.toMessage())\n                    }.map { content.size }\n                    callback?.onFinished(file, content, result)\n                    return file\n                }\n\n                val ext = GroupFileUploadExt(\n                    u1 = 100,\n                    u2 = 1,\n                    entry = GroupFileUploadEntry(\n                        business = ExcitingBusiInfo(\n                            busId = resp.busId,\n                            senderUin = folder.bot.id,\n                            receiverUin = folder.contact.id, // TODO: 2021/3/1 code or uin?\n                            groupCode = folder.contact.id,\n                        ),\n                        fileEntry = ExcitingFileEntry(\n                            fileSize = content.size,\n                            md5 = content.md5,\n                            sha1 = content.sha1,\n                            fileId = resp.fileId.toByteArray(),\n                            uploadKey = resp.checkKey,\n                        ),\n                        clientInfo = ExcitingClientInfo(\n                            clientType = 2,\n                            appId = folder.client.protocol.id.toString(),\n                            terminalType = 2,\n                            clientVer = \"9e9c09dc\",\n                            unknown = 4,\n                        ),\n                        fileNameInfo = ExcitingFileNameInfo(filepath),\n                        host = ExcitingHostConfig(\n                            hosts = listOf(\n                                ExcitingHostInfo(\n                                    url = ExcitingUrlInfo(\n                                        unknown = 1,\n                                        host = resp.uploadIpLanV4.firstOrNull()\n                                            ?: resp.uploadIpLanV6.firstOrNull()\n                                            ?: resp.uploadIp,\n                                    ),\n                                    port = resp.uploadPort,\n                                ),\n                            ),\n                        ),\n                    ),\n                    u3 = 0,\n                ).toByteArray(GroupFileUploadExt.serializer())\n\n                callback?.onBegin(file, content)\n\n                kotlin.runCatching {\n                    Highway.uploadResourceBdh(\n                        bot = folder.bot,\n                        resource = content,\n                        kind = ResourceKind.GROUP_FILE,\n                        commandId = 71,\n                        extendInfo = ext,\n                        dataFlag = 0,\n                        callback = if (callback == null) null else fun(it: Long) {\n                            callback.onProgression(file, content, it)\n                        }\n                    )\n                }.let { result0 ->\n                    val result = result0.onSuccessCatching {\n                        folder.contact.sendMessage(AllowSendFileMessage + file.toMessage())\n                    }\n                    callback?.onFinished(file, content, result.map { content.size })\n                }\n\n                return file\n            }\n        }\n    }\n\n    suspend fun getItemsFlow(): Flow<Oidb0x6d8.GetFileListRspBody.Item> = Companion.getItemsFlow(client, contact, id)\n\n    protected fun Oidb0x6d8.GetFileListRspBody.Item.resolve(): AbsoluteFileFolder? =\n        resolved(this@CommonAbsoluteFolderImpl)\n\n    override suspend fun folders(): Flow<AbsoluteFolder> {\n        return getItemsFlow().filter { it.folderInfo != null }.map { it.resolve() as AbsoluteFolder }\n    }\n\n    override suspend fun files(): Flow<AbsoluteFile> {\n        return getItemsFlow().filter { it.fileInfo != null }.map { it.resolve() as AbsoluteFile }\n    }\n\n    override suspend fun children(): Flow<AbsoluteFileFolder> {\n        return getItemsFlow().mapNotNull { it.resolve() }\n    }\n\n    override suspend fun createFolder(name: String): AbsoluteFolder {\n        if (name.isBlank()) throw IllegalArgumentException(\"folder name cannot be blank.\")\n        checkPermission(\"createFolder\")\n        FileSystem.checkLegitimacy(name)\n\n        // server only support nesting depth level of 1 so we don't need to check the name\n\n        val result = bot.network.sendAndExpect(FileManagement.CreateFolder(client, contact.id, this.id, name))\n            .toResult(\"AbsoluteFolderImpl.mkdir\", checkResp = false)\n            .getOrThrow() // throw protocol errors\n\n        /*\n        2021-10-30 13:06:33 D/soutv: unnamed = CreateFolderRspBody#-941698272 {\n            folderInfo=FolderInfo#1879610684 {\n                    createTime=0x617D3548(1635595592)\n                    createUin=xxx\n                    folderId=/49a18e46-cf24-4362-b0d0-13235c0e7862\n                    folderName=myFolder\n                    modifyTime=0x617D3548(1635595592)\n                    modifyUin=xxx\n                    parentFolderId=/\n                    usedSpace=0x0000000000000000(0)\n            }\n            retMsg=ok\n        }\n         */\n\n        /*\n        2021-10-30 13:03:44 D/soutv: unnamed = CreateFolderRspBody#-941698272 {\n            clientWording=只允许群主和管理员操作\n            int32RetCode=0xFFFFFFDC(-36)\n            retMsg=not group admin\n        }\n         */\n\n        /*\n        2021-10-30 13:10:32 D/soutv: unnamed = CreateFolderRspBody#-941698272 {\n            clientWording=同名文件夹已存在\n            int32RetCode=0xFFFFFEC7(-313)\n            retMsg=folder name has exist\n        }\n         */\n\n        return when (result.int32RetCode) {\n            -36 -> throwPermissionDeniedException(\"createFolder\")\n            -313 -> this.resolveFolder(name) // already exists\n            0 -> {\n                if (result.folderInfo != null) {\n                    this.createChildFolder(result.folderInfo)\n                } else {\n                    this.resolveFolder(name)\n                }\n            }\n            else -> {\n                // unexpected errors\n                error(\"Failed to create folder '$name': ${result.int32RetCode} ${result.clientWording}.\")\n            }\n        } ?: error(\"Failed to create folder '$name': server returned success but failed to find folder.\")\n    }\n\n    override suspend fun resolveFolder(name: String): AbsoluteFolder? {\n        if (name.isBlank()) throw IllegalArgumentException(\"folder name cannot be blank.\")\n        if (!FileSystem.isLegal(name)) return null\n        if (name[0] == '/') {\n            return root.resolveFolder(name.substring(1))\n        }\n        return getItemsFlow().firstOrNull { it.folderInfo?.folderName == name }?.resolve() as AbsoluteFolder?\n    }\n\n    override suspend fun resolveFolderById(id: String): AbsoluteFolder? {\n        if (name.isBlank()) throw IllegalArgumentException(\"folder id cannot be blank.\")\n        if (!FileSystem.isLegal(id)) return null\n        if (id == AbsoluteFolder.ROOT_FOLDER_ID) return root // special case, not ambiguous — '/' always refers to root.\n        if (this.id != AbsoluteFolder.ROOT_FOLDER_ID) return null // reserved for future\n\n        // All folder ids start with '/'.\n        // Currently, only root folders can have children folders,\n        // and we don't know how the folderIds can be changed,\n        // so we force the receiver to be root for now, to provide forward-compatibility.\n        return root.impl().getItemsFlow().firstOrNull { it.folderInfo?.folderId == id }?.resolve() as AbsoluteFolder?\n    }\n\n    override suspend fun resolveFileById(id: String, deep: Boolean): AbsoluteFile? {\n        if (id == \"/\" || id.isEmpty()) throw IllegalArgumentException(\"Illegal file id: $id\")\n        getItemsFlow().filter { it.fileInfo?.fileId == id }.map { it.resolve() as AbsoluteFile }.firstOrNull()\n            ?.let { return it }\n\n        if (!deep) return null\n\n        return folders().map { it.resolveFileById(id, deep) }.firstOrNull { it != null }\n    }\n\n    override suspend fun resolveFiles(path: String): Flow<AbsoluteFile> {\n        if (path.isBlank()) throw IllegalArgumentException(\"path cannot be blank.\")\n        if (!FileSystem.isLegal(path)) return emptyFlow()\n\n        if (path[0] == '/') {\n            return root.resolveFiles(path.substring(1))\n        }\n\n        if (!path.contains('/')) {\n            return getItemsFlow().filter { it.fileInfo?.fileName == path }.map { it.resolve() as AbsoluteFile }\n        }\n\n        return resolveFolder(path.substringBefore('/'))?.resolveFiles(path.substringAfter('/')) ?: emptyFlow()\n    }\n\n    override suspend fun resolveAll(path: String): Flow<AbsoluteFileFolder> {\n        if (path.isBlank()) throw IllegalArgumentException(\"path cannot be blank.\")\n        if (!FileSystem.isLegal(path)) return emptyFlow()\n        if (path[0] == '/') {\n            return root.resolveAll(path.substring(1))\n        }\n        if (!path.contains('/')) {\n            return getItemsFlow().mapNotNull { it.resolve() }\n        }\n\n        return resolveFolder(path.substringBefore('/'))?.resolveAll(path.substringAfter('/')) ?: emptyFlow()\n    }\n\n    override suspend fun uploadNewFile(\n        filepath: String,\n        content: ExternalResource,\n        callback: ProgressionCallback<AbsoluteFile, Long>?\n    ): AbsoluteFile {\n        val (actualFolder, actualFilename) = findFileByPath(filepath)\n        return uploadNewFileImpl(actualFolder.impl(), actualFilename, content, callback)\n    }\n\n    override suspend fun exists(): Boolean {\n        return parentOrFail().folders().firstOrNull { it.id == this.id } != null\n    }\n\n    override suspend fun refresh(): Boolean {\n        val new = refreshed() ?: return false\n        this.name = new.name\n        this.lastModifiedTime = new.lastModifiedTime\n        this.contentsCount = new.contentsCount\n        return true\n    }\n\n    override fun toString(): String = \"AbsoluteFolder(name=$name, absolutePath=$absolutePath, id=$id)\"\n\n    override suspend fun refreshed(): AbsoluteFolder? = parentOrRoot.folders().firstOrNull { it.id == this.id }\n\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (!isSameType(this, other)) return false\n        if (!super.equals(other)) return false\n\n        if (contentsCount != other.contentsCount) return false\n\n        return true\n    }\n\n    override fun hashCode(): Int {\n        var result = super.hashCode()\n        result = 31 * result + contentsCount.hashCode()\n        return result\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/file/AbstractAbsoluteFileFolder.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"MemberVisibilityCanBePrivate\")\n\npackage net.mamoe.mirai.internal.contact.file\n\nimport net.mamoe.mirai.contact.FileSupported\nimport net.mamoe.mirai.contact.PermissionDeniedException\nimport net.mamoe.mirai.contact.file.AbsoluteFile\nimport net.mamoe.mirai.contact.file.AbsoluteFileFolder\nimport net.mamoe.mirai.contact.file.AbsoluteFolder\nimport net.mamoe.mirai.internal.asQQAndroidBot\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.FileManagement\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.toResult\nimport net.mamoe.mirai.internal.utils.FileSystem\nimport net.mamoe.mirai.utils.cast\nimport net.mamoe.mirai.utils.isSameType\n\ninternal fun AbstractAbsoluteFileFolder.api(): AbsoluteFileFolder = this.cast()\ninternal fun AbsoluteFileFolder.impl(): AbstractAbsoluteFileFolder = this.cast()\ninternal fun AbsoluteFile.impl(): AbsoluteFileImpl = this.cast()\ninternal fun AbsoluteFolder.impl(): AbsoluteFolderImpl = this.cast()\n\ninternal val AbsoluteFolder?.idOrRoot get() = this?.id ?: AbsoluteFolder.ROOT_FOLDER_ID\n\ninternal val AbstractAbsoluteFileFolder.parentOrRoot get() = parent ?: contact.files.root\ninternal val AbstractAbsoluteFileFolder.root get() = contact.files.root\n\n/**\n * @see AbsoluteFileFolder\n */\ninternal abstract class AbstractAbsoluteFileFolder(\n    // overriding AbsFileFolder\n    val contact: FileSupported,\n    var parent: AbsoluteFolder?,\n    val id: String, // uuid-like\n    var name: String,\n    val uploadTime: Long,\n    val uploaderId: Long,\n    var lastModifiedTime: Long,\n    // end\n\n    val busId: Int, // protocol internal\n) {\n    protected inline val bot get() = contact.bot.asQQAndroidBot()\n    protected inline val client get() = bot.client\n\n    protected abstract fun checkPermission(operationHint: String)\n\n    fun throwPermissionDeniedException(operationHint: String): Nothing {\n        throw PermissionDeniedException(\"Permission denied: '$operationHint' on file '${this.api().absolutePath}' requires an operator permission.\")\n    }\n\n    protected fun parentOrFail() = parent ?: error(\"Cannot rename the root folder.\")\n\n    ///////////////////////////////////////////////////////////////////////////\n    // overriding AbsFileFolder\n    ///////////////////////////////////////////////////////////////////////////\n\n    protected abstract val isFile: Boolean\n    protected abstract val isFolder: Boolean\n\n    suspend fun renameTo(newName: String): Boolean {\n        FileSystem.checkLegitimacy(newName)\n        parentOrFail()\n        checkPermission(\"renameTo\")\n\n        val result = bot.network.sendAndExpect(\n            if (isFile) {\n                FileManagement.RenameFile(client, contact.id, busId, id, parent.idOrRoot, newName)\n            } else {\n                FileManagement.RenameFolder(client, contact.id, id, newName)\n            }\n        )\n\n        result.toResult(\"AbstractAbsoluteFileFolder.renameTo\") {\n            when (it) {\n                0 -> {\n                    name = newName\n                    return true\n                }\n                1 -> return false\n                else -> false\n            }\n        }.getOrThrow()\n\n        error(\"unreachable\")\n    }\n\n    suspend fun delete(): Boolean {\n        checkPermission(\"delete\")\n        val result = if (isFile) {\n            bot.network.sendAndExpect(FileManagement.DeleteFile(client, contact.id, busId, id, parent.idOrRoot))\n        } else {\n            // natively 'recursive'\n            bot.network.sendAndExpect(FileManagement.DeleteFolder(client, contact.id, id))\n        }.toResult(\"AbstractAbsoluteFileFolder.delete\", checkResp = false).getOrThrow()\n\n        return when (result.int32RetCode) {\n            -36 -> throwPermissionDeniedException(\"delete\")\n            0 -> true\n            else -> {\n                // files not exists or other errors.\n                false\n            }\n        }\n    }\n\n    @Suppress(\"DuplicatedCode\")\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (!isSameType(this, other)) return false\n\n        if (contact != other.contact) return false\n        if (parent != other.parent) return false\n        if (id != other.id) return false\n        if (name != other.name) return false\n        if (uploadTime != other.uploadTime) return false\n        if (uploaderId != other.uploaderId) return false\n        if (lastModifiedTime != other.lastModifiedTime) return false\n        if (busId != other.busId) return false\n        if (isFile != other.isFile) return false\n        if (isFolder != other.isFolder) return false\n\n        return true\n    }\n\n    override fun hashCode(): Int {\n        var result = contact.hashCode()\n        result = 31 * result + (parent?.hashCode() ?: 0)\n        result = 31 * result + id.hashCode()\n        result = 31 * result + name.hashCode()\n        result = 31 * result + uploadTime.hashCode()\n        result = 31 * result + uploaderId.hashCode()\n        result = 31 * result + lastModifiedTime.hashCode()\n        result = 31 * result + busId\n        result = 31 * result + isFile.hashCode()\n        result = 31 * result + isFolder.hashCode()\n        return result\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/file/FileProtocol.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.file\n\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Oidb0x6d6\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.CommonOidbResponse\nimport net.mamoe.mirai.internal.utils.FileSystem\n\n/**\n * Abstract protocol bridge for file management.\n */\ninternal interface FileProtocol {\n    val fs: FileSystem get() = FileSystem\n\n    fun renameFile(\n        client: QQAndroidClient,\n        groupCode: Long,\n        busId: Int,\n        fileId: String,\n        parentFolderId: String,\n        newName: String,\n    ): CommonOidbResponse<Oidb0x6d6.RenameFileRspBody>\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/file/RemoteFilesImpl.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.file\n\nimport net.mamoe.mirai.contact.FileSupported\nimport net.mamoe.mirai.contact.file.AbsoluteFolder\nimport net.mamoe.mirai.contact.file.RemoteFiles\nimport net.mamoe.mirai.internal.contact.ContactAware\nimport net.mamoe.mirai.internal.utils.FileSystem\n\ninternal class RemoteFilesImpl(\n    override val contact: FileSupported,\n    override val root: AbsoluteFolder = AbsoluteFolderImpl(\n        contact,\n        null,\n        AbsoluteFolder.ROOT_FOLDER_ID,\n        \"/\",\n        0,\n        0,\n        0,\n        0\n    ),\n) : RemoteFiles, ContactAware {\n    companion object {\n        suspend fun AbsoluteFolder.findFileByPath(path: String): Pair<AbsoluteFolder, String> {\n            if (path.isBlank()) throw IllegalArgumentException(\"absolutePath cannot be blank.\")\n            val normalized = FileSystem.normalize(path)\n//            if (!normalized.contains('/')) {\n//                throw IllegalArgumentException(\"Invalid absolutePath: '$path'. If you wanted to upload file to root directory, please add a leading '/'.\")\n//            }\n            val folder = when (normalized.count { it == '/' }) {\n                0, 1 -> this\n                else -> this.createFolder(normalized.substringBeforeLast(\"/\"))\n            }\n\n            val filename = normalized.substringAfterLast('/')\n            return folder to filename\n        }\n    }\n\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/friendgroup/FriendGroupImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.friendgroup\n\nimport net.mamoe.mirai.contact.Friend\nimport net.mamoe.mirai.contact.friendgroup.FriendGroup\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.FriendImpl\nimport net.mamoe.mirai.internal.contact.impl\nimport net.mamoe.mirai.internal.contact.info.FriendGroupInfo\nimport net.mamoe.mirai.internal.network.protocol.packet.list.FriendList\nimport kotlin.contracts.ExperimentalContracts\nimport kotlin.contracts.contract\n\n@OptIn(ExperimentalContracts::class)\ninternal fun FriendGroup.impl(): FriendGroupImpl {\n    contract {\n        returns() implies (this@impl is FriendGroupImpl)\n    }\n    check(this is FriendGroupImpl) { \"A FriendGroup instance is not instance of FriendGroupImpl. Your instance: ${this::class.qualifiedName}\" }\n    return this\n}\n\ninternal class FriendGroupImpl constructor(\n    val bot: QQAndroidBot,\n    val info: FriendGroupInfo\n) : FriendGroup {\n    override val id: Int by info::groupId\n\n    override var name: String by info::groupName\n    override val count: Int\n        get() = friends.size\n    override val friends: Collection<Friend> = object : AbstractCollection<Friend>() {\n        override val size: Int\n            get() = bot.friends.count { it.impl().info.friendGroupId == id }\n\n        private val delegateSequence = sequence<Friend> {\n            bot.friends.forEach { friend ->\n                friend.impl()\n                if (friend.info.friendGroupId == id) {\n                    yield(friend)\n                }\n            }\n        }\n\n        override fun iterator(): Iterator<Friend> = delegateSequence.iterator()\n\n        override fun isEmpty(): Boolean {\n            return bot.friends.none { it.impl().info.friendGroupId == id }\n        }\n\n        override fun contains(element: Friend): Boolean {\n            if (element !is FriendImpl) return false\n            return element.info.friendGroupId == id\n        }\n    }\n\n\n    override suspend fun renameTo(newName: String): Boolean {\n        bot.network.sendAndExpect(FriendList.SetGroupReqPack.Rename(bot.client, newName, id)).let {\n            if (it.result.toInt() == 1) {\n                return false\n            }\n            check(it.isSuccess) {\n                \"Cannot rename friendGroup(id=$id) to $newName, code=${it.result.toInt()}, errStr=${it.errStr}\"\n            }\n        }\n        info.groupName = newName\n        return true\n    }\n\n    override suspend fun moveIn(friend: Friend): Boolean {\n        bot.network.sendAndExpect(FriendList.MoveGroupMemReqPack(bot.client, friend.id, id)).let {\n            check(it.isSuccess) {\n                \"Cannot move friend to $this, code=${it.result.toInt()}, errStr=${it.errStr}\"\n            }\n        }\n        // 因为 MoveGroupMemReqPack 协议在测试里如果移动到不存在的分组，他会自动移动好友到 id = 0 的默认好友分组然后返回 result = 0\n        val id = friend.queryProfile().friendGroupId\n        friend.impl().info.friendGroupId = id\n        if (id != this.id && id == 0) return false\n        return true\n    }\n\n    override suspend fun delete(): Boolean {\n        bot.network.sendAndExpect(FriendList.SetGroupReqPack.Delete(bot.client, id)).let {\n            if (it.result.toInt() == 1) {\n                return false\n            }\n            check(it.isSuccess) {\n                \"Cannot delete friendGroup, code=${it.result.toInt()}, errStr=${it.errStr}\"\n            }\n        }\n        friends.forEach {\n            it.impl().info.friendGroupId = 0\n        }\n        bot.friendGroups.friendGroups.remove(this)\n        return true\n    }\n\n    override fun toString(): String {\n        return \"FriendGroup(id=$id, name=$name)\"\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/friendgroup/FriendGroupsImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.friendgroup\n\nimport net.mamoe.mirai.contact.friendgroup.FriendGroup\nimport net.mamoe.mirai.contact.friendgroup.FriendGroups\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.info.FriendGroupInfo\nimport net.mamoe.mirai.internal.network.protocol.packet.list.FriendList\nimport net.mamoe.mirai.utils.ConcurrentLinkedDeque\nimport net.mamoe.mirai.utils.asImmutable\n\ninternal class FriendGroupsImpl(\n    val bot: QQAndroidBot\n) : FriendGroups {\n    val friendGroups = ConcurrentLinkedDeque<FriendGroupImpl>()\n    private val friendGroupsImmutable by lazy { friendGroups.asImmutable() }\n\n    override suspend fun create(name: String): FriendGroup {\n        val resp = bot.network.sendAndExpect(FriendList.SetGroupReqPack.New(bot.client, name))\n        check(resp.isSuccess) {\n            \"Cannot create friendGroup, code=${resp.result.toInt()}, errStr=${resp.errStr}\"\n        }\n        return FriendGroupImpl(bot, FriendGroupInfo(resp.groupId, name)).apply { friendGroups.add(this) }\n    }\n\n    override fun get(id: Int): FriendGroup? = friendGroups.firstOrNull { it.id == id }\n\n    override fun asCollection(): Collection<FriendGroup> = friendGroupsImmutable\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/info/FriendGroupInfo.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.info\n\nimport kotlinx.serialization.Serializable\n\n@Serializable\ninternal data class FriendGroupInfo(\n    val groupId: Int,\n    var groupName: String,\n    // val friendCount: Int,\n    // val onlineFriendCount: Int\n)"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/info/FriendInfoImpl.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.info\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.data.FriendInfo\n\n// since 2.4, for serialization\n@Serializable\ninternal data class FriendInfoImpl(\n    override val uin: Long,\n    override var nick: String,\n    override var remark: String,\n    override var friendGroupId: Int = 0\n) : FriendInfo {\n    companion object {\n        fun FriendInfo.impl() = if (this is FriendInfoImpl) this else FriendInfoImpl(uin, nick, remark, friendGroupId)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/info/GroupInfoImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.info\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.data.GroupInfo\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.protocol.data.jce.StGroupRankInfo\nimport net.mamoe.mirai.internal.network.protocol.data.jce.StTroopNum\n\n@Serializable\ninternal data class GroupInfoImpl(\n    override val uin: Long,\n    override val owner: Long,\n    override val groupCode: Long,\n    override val memo: String,\n    override val name: String,\n    override val allowMemberInvite: Boolean,\n    override val allowAnonymousChat: Boolean,\n    override val autoApprove: Boolean,\n    override val confessTalk: Boolean,\n    override val muteAll: Boolean,\n    override val botMuteTimestamp: Int,\n    override val isHonorVisible: Boolean,\n    override val isTitleVisible: Boolean,\n    override val isTemperatureVisible: Boolean,\n    override val rankTitles: Map<Int, String>,\n    override val temperatureTitles: Map<Int, String>\n) : GroupInfo, Packet, Packet.NoLog {\n    constructor(stTroopNum: StTroopNum, stGroupRankInfo: StGroupRankInfo?) : this(\n        uin = stTroopNum.groupUin,\n        owner = stTroopNum.dwGroupOwnerUin,\n        groupCode = stTroopNum.groupCode,\n        memo = stTroopNum.groupMemo,\n        name = stTroopNum.groupName,\n        allowMemberInvite = stTroopNum.dwGroupFlagExt?.and(0x000000c0) != 0L,\n        allowAnonymousChat = stTroopNum.dwGroupFlagExt?.and(0x40000000) != 0L,\n        autoApprove = stTroopNum.dwGroupFlagExt3?.and(0x00100000) == 0L,\n        confessTalk = stTroopNum.dwGroupFlagExt3?.and(0x00002000) == 0L,\n        muteAll = stTroopNum.dwShutUpTimestamp != 0L,\n        botMuteTimestamp = stTroopNum.dwMyShutUpTimestamp?.toInt() ?: 0,\n        isHonorVisible = stGroupRankInfo?.groupRankSysFlag?.toInt() == 1,\n        isTitleVisible = stGroupRankInfo?.groupRankUserFlag?.toInt() == 1,\n        isTemperatureVisible = stGroupRankInfo?.groupRankUserFlagNew?.toInt() == 1,\n        rankTitles = buildMap {\n            for (pair in stGroupRankInfo?.vecRankMap.orEmpty()) {\n                val level = pair.dwLevel?.toInt() ?: continue\n                val title = pair.rank.orEmpty()\n\n                put(level, title)\n            }\n        },\n        temperatureTitles = buildMap {\n            for (pair in stGroupRankInfo?.vecRankMapNew.orEmpty()) {\n                val level = pair.dwLevel?.toInt() ?: continue\n                val title = pair.rank.orEmpty()\n\n                put(level, title)\n            }\n        }\n    )\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/info/MemberInfoImpl.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.info\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.data.GroupHonorType\nimport net.mamoe.mirai.data.MemberInfo\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.data.jce.StTroopMemberInfo\nimport net.mamoe.mirai.internal.network.protocol.packet.login.wtlogin.orEmpty\nimport net.mamoe.mirai.utils.ConcurrentSet\nimport net.mamoe.mirai.utils.currentTimeSeconds\n\n@Serializable\ninternal data class MemberInfoImpl(\n    override val uin: Long,\n    override var nick: String,\n    override var permission: MemberPermission,\n    override var remark: String = \"\",\n    override val nameCard: String = \"\",\n    override val specialTitle: String = \"\",\n    override val muteTimestamp: Int = 0,\n    override val anonymousId: String? = null,\n    override val joinTimestamp: Int = currentTimeSeconds().toInt(),\n    override var lastSpeakTimestamp: Int = 0,\n    override val isOfficialBot: Boolean = false,\n    override var rank: Int = 1,\n    override var point: Int = 0,\n    override val honors: MutableSet<GroupHonorType> = ConcurrentSet(),\n    override var temperature: Int = 1\n) : MemberInfo {\n    constructor(\n        client: QQAndroidClient,\n        jceInfo: StTroopMemberInfo,\n        groupOwnerId: Long,\n    ) : this(\n        uin = jceInfo.memberUin,\n        nick = jceInfo.nick,\n        permission = when {\n            jceInfo.memberUin == groupOwnerId -> MemberPermission.OWNER\n            jceInfo.dwFlag?.takeLowestOneBit() == 1L -> MemberPermission.ADMINISTRATOR\n            else -> MemberPermission.MEMBER\n        },\n        remark = jceInfo.autoRemark.orEmpty(),\n        nameCard = jceInfo.sName.orEmpty(),\n        specialTitle = jceInfo.sSpecialTitle.orEmpty(),\n        muteTimestamp = jceInfo.dwShutupTimestap?.toInt() ?: 0,\n        anonymousId = null,\n        joinTimestamp = jceInfo.dwJoinTime?.toInt() ?: 0,\n        lastSpeakTimestamp = jceInfo.dwLastSpeakTime?.toInt() ?: 0,\n        isOfficialBot = client.groupConfig.isOfficialRobot(jceInfo.memberUin),\n        rank = jceInfo.dwMemberLevel?.toInt() ?: 1,\n        point = jceInfo.dwPoint?.toInt() ?: 0,\n        honors = ConcurrentSet<GroupHonorType>().apply {\n            /**\n             * vecGroupHonor 的 结构是\n             * [\n             *     (type, value),\n             *     (type, value),\n             *     (type, value),\n             * ]\n             *  构成的 ByteArray\n             *  type = 8 时，表示群荣誉头衔标志\n             *  type = 16 时，表示群荣誉活跃度\n             */\n            val bytes = jceInfo.vecGroupHonor.orEmpty()\n            for (index in bytes.indices step 2) {\n                val type = bytes[index]\n                if (type.toInt() == 8) {\n                    val value = bytes.getOrNull(index + 1) ?: break\n                    try {\n                        @Suppress(\"INVISIBLE_MEMBER\")\n                        add(GroupHonorType(value.toInt()))\n                    } catch (_: Exception) {\n                    }\n                }\n            }\n        },\n        temperature = jceInfo.vecGroupHonor?.let { bytes ->\n            for (index in bytes.indices step 2) {\n                val type = bytes[index]\n                if (type.toInt() == 16) {\n                    val value = bytes.getOrNull(index + 1) ?: break\n                    return@let value.toInt()\n                }\n            }\n            null\n        } ?: 0\n    )\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/info/StrangerInfoImpl.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.info\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.data.StrangerInfo\n\n@SerialName(\"StrangerInfo\")\n@Serializable\ninternal class StrangerInfoImpl(\n    override val uin: Long,\n    override val nick: String,\n    override val fromGroup: Long = 0,\n    override val remark: String = \"\",\n) : StrangerInfo {\n    companion object {\n        fun StrangerInfo.impl() = if (this is StrangerInfoImpl) this else StrangerInfoImpl(uin, nick, fromGroup, remark)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/roaming/AbstractRoamingMessages.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.roaming\n\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.contact.roaming.RoamingMessage\nimport net.mamoe.mirai.contact.roaming.RoamingMessages\nimport net.mamoe.mirai.internal.contact.AbstractContact\nimport net.mamoe.mirai.internal.message.source.decodeRandom\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.utils.mapToIntArray\nimport net.mamoe.mirai.utils.toLongUnsigned\n\ninternal abstract class AbstractRoamingMessages : RoamingMessages {\n    abstract val contact: AbstractContact\n\n    protected fun createRoamingMessage(\n        message: MsgComm.Msg,\n        messages: List<MsgComm.Msg>\n    ) = object : RoamingMessage {\n        override val contact: Contact get() = this@AbstractRoamingMessages.contact\n        override val sender: Long get() = message.msgHead.fromUin\n        override val target: Long\n            get() = message.msgHead.groupInfo?.groupCode ?: message.msgHead.toUin\n        override val time: Long get() = message.msgHead.msgTime.toLongUnsigned()\n        override val ids: IntArray by lazy { messages.mapToIntArray { it.msgHead.msgSeq } }\n        override val internalIds: IntArray by lazy {\n            messages.mapToIntArray { it.decodeRandom() }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/roaming/RoamingMessagesImplFriend.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.roaming\n\nimport net.mamoe.mirai.internal.contact.FriendImpl\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.receive.MessageSvcPbGetRoamMsgReq\nimport net.mamoe.mirai.utils.check\n\ninternal class RoamingMessagesImplFriend(\n    override val contact: FriendImpl\n) : TimeBasedRoamingMessagesImpl() {\n    override suspend fun requestRoamMsg(\n        timeStart: Long,\n        lastMessageTime: Long,\n        random: Long\n    ): MessageSvcPbGetRoamMsgReq.Response {\n        return contact.bot.network.sendAndExpect(\n            MessageSvcPbGetRoamMsgReq.createForFriend(\n                client = contact.bot.client,\n                uin = contact.id,\n                timeStart = timeStart,\n                lastMsgTime = lastMessageTime,\n                random = random,\n                maxCount = 1000,\n                sig = byteArrayOf(),\n                pwd = byteArrayOf()\n            )\n        ).value.check()\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/roaming/RoamingMessagesImplGroup.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.roaming\n\nimport kotlinx.coroutines.flow.*\nimport net.mamoe.mirai.contact.roaming.RoamingMessageFilter\nimport net.mamoe.mirai.internal.contact.CommonGroupImpl\nimport net.mamoe.mirai.internal.message.RefineContextKey\nimport net.mamoe.mirai.internal.message.SimpleRefineContext\nimport net.mamoe.mirai.internal.message.toMessageChainOnline\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.TroopManagement\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.receive.MessageSvcPbGetGroupMsg\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.MessageSourceKind\n\ninternal class RoamingMessagesImplGroup(\n    override val contact: CommonGroupImpl\n) : AbstractRoamingMessages() {\n    private val bot get() = contact.bot\n\n    override suspend fun getMessagesIn(\n        timeStart: Long,\n        timeEnd: Long,\n        filter: RoamingMessageFilter?\n    ): Flow<MessageChain> {\n        var currentSeq: Int = getLastMsgSeq() ?: return emptyFlow()\n        var lastOfferedSeq = -1\n\n        return flow {\n            while (true) {\n                val resp = contact.bot.network.sendAndExpect(\n                    MessageSvcPbGetGroupMsg(\n                        client = contact.bot.client,\n                        groupUin = contact.uin,\n                        messageSequence = currentSeq.toLong(),\n                        count = 20 // maximum 20\n                    )\n                )\n\n                if (resp is MessageSvcPbGetGroupMsg.Failed) break\n                resp as MessageSvcPbGetGroupMsg.Success // stupid smart cast\n                if (resp.msgElem.isEmpty()) break\n\n                // the message may be sorted increasing by message time,\n                // if so, additional sortBy will not take cost.\n                val messageTimeSequence = resp.msgElem.asSequence().map { it.time }\n\n                val maxTime = messageTimeSequence.max()\n\n\n                // we have fetched all messages\n                // note: maxTime = 0 means all fetched messages were recalled\n                if (maxTime < timeStart && maxTime != 0) break\n\n                emitAll(\n                    resp.msgElem.asSequence()\n                        .filter { lastOfferedSeq == -1 || it.msgHead.msgSeq < lastOfferedSeq }\n                        .filter { it.time in timeStart..timeEnd }\n                        .sortedByDescending { it.msgHead.msgSeq } // Ensure caller receives newer messages first\n                        .filter { filter.apply(it) } // Call filter after sort\n                        .asFlow()\n                        .map {\n                            listOf(it).toMessageChainOnline(\n                                bot,\n                                contact.id,\n                                MessageSourceKind.GROUP,\n                                SimpleRefineContext(\n                                    RefineContextKey.MessageSourceKind to MessageSourceKind.GROUP,\n                                    RefineContextKey.FromId to it.msgHead.fromUin,\n                                    RefineContextKey.GroupIdOrZero to contact.id,\n                                )\n                            )\n                        }\n                )\n\n                currentSeq = resp.msgElem.first().msgHead.msgSeq\n                lastOfferedSeq = currentSeq\n            }\n        }\n    }\n\n    private val MsgComm.Msg.time get() = msgHead.msgTime\n\n    private fun RoamingMessageFilter?.apply(\n        it: MsgComm.Msg\n    ) = this?.invoke(createRoamingMessage(it, listOf())) != false\n\n    private suspend fun getLastMsgSeq(): Int? {\n        // Iterate from the newest message to find messages within [timeStart] and [timeEnd]\n        val lastMsgSeqResp = bot.network.sendAndExpect(\n            TroopManagement.GetGroupLastMsgSeq(\n                client = bot.client,\n                groupUin = contact.uin\n            )\n        )\n\n        return when (lastMsgSeqResp) {\n            TroopManagement.GetGroupLastMsgSeq.Response.Failed -> null\n            is TroopManagement.GetGroupLastMsgSeq.Response.Success -> lastMsgSeqResp.seq\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/roaming/TimeBasedRoamingMessagesImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\")\n\npackage net.mamoe.mirai.internal.contact.roaming\n\nimport kotlinx.coroutines.currentCoroutineContext\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.isActive\nimport net.mamoe.mirai.contact.roaming.RoamingMessageFilter\nimport net.mamoe.mirai.internal.message.RefineContextKey\nimport net.mamoe.mirai.internal.message.SimpleRefineContext\nimport net.mamoe.mirai.internal.message.toMessageChainOnline\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.receive.MessageSvcPbGetRoamMsgReq\nimport net.mamoe.mirai.message.data.MessageChain\n\ninternal sealed class TimeBasedRoamingMessagesImpl : AbstractRoamingMessages() {\n    override suspend fun getMessagesIn(\n        timeStart: Long,\n        timeEnd: Long,\n        filter: RoamingMessageFilter?\n    ): Flow<MessageChain> {\n        return flow {\n            var lastMessageTime = timeEnd.coerceAtLeast(timeStart).coerceAtLeast(1)\n            var random = 0L\n            while (currentCoroutineContext().isActive) {\n                val resp = requestRoamMsg(timeStart, lastMessageTime, random)\n                val messages = resp.messages ?: break\n\n                if (filter == null || filter === RoamingMessageFilter.ANY) {\n                    // fast path\n                    messages.forEach { msg ->\n                        val context = SimpleRefineContext(RefineContextKey.FromId to msg.msgHead.fromUin)\n                        emit(msg.toMessageChainOnline(contact.bot, context))\n                    }\n                } else {\n                    for (message in messages) {\n                        if (filter.invoke(createRoamingMessage(message, messages))) {\n                            val context = SimpleRefineContext(RefineContextKey.FromId to message.msgHead.fromUin)\n                            emit(message.toMessageChainOnline(contact.bot, context))\n                        }\n                    }\n                }\n\n                lastMessageTime = resp.lastMessageTime\n                random = resp.random\n            }\n        }\n    }\n\n    abstract suspend fun requestRoamMsg(\n        timeStart: Long,\n        lastMessageTime: Long,\n        random: Long\n    ): MessageSvcPbGetRoamMsgReq.Response\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/contact/util.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n\npackage net.mamoe.mirai.internal.contact\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.cast\nimport net.mamoe.mirai.utils.toUHexString\nimport net.mamoe.mirai.utils.verbose\n\ninternal inline val Group.uin: Long get() = this.cast<GroupImpl>().uin\ninternal inline val Group.groupCode: Long get() = this.id\ninternal inline val User.uin: Long get() = this.id\ninternal inline val Bot.uin: Long get() = this.id\n\n@Suppress(\"RemoveRedundantQualifierName\") // compiler bug\ninternal fun net.mamoe.mirai.event.events.MessageEvent.logMessageReceived() {\n    fun renderMessage(message: MessageChain): String {\n        return message.filterNot { it is MessageSource }.joinToString(\"\")\n    }\n\n    fun renderGroupMessage(group: Group, senderName: String, sender: Member, message: MessageChain): String {\n        val displayId = if (sender is AnonymousMember) \"匿名\" else sender.id.toString()\n        return \"[${group.name}(${group.id})] ${senderName}($displayId) -> ${renderMessage(message)}\"\n    }\n\n    fun renderGroupMessageSync(group: Group, message: MessageChain): String {\n        return \"[${group.name}(${group.id})][SYNC] <- ${renderMessage(message)}\"\n    }\n\n    fun renderGroupTempMessage(group: Group, senderName: String, sender: Member, message: MessageChain): String {\n        return \"[${group.name}(${group.id})] $senderName(Temp ${sender.id}) -> ${renderMessage(message)}\"\n    }\n\n    fun renderGroupTempMessageSync(group: Group, subjectName: String, subject: Member, message: MessageChain): String {\n        return \"[${group.name}(${group.id})] $subjectName(Temp ${subject.id})[SYNC] <- ${renderMessage(message)}\"\n    }\n\n    fun renderStrangerMessage(senderName: String, sender: User, message: MessageChain): String {\n        return \"[$senderName(Stranger ${sender.id}) -> ${renderMessage(message)}\"\n    }\n\n    fun renderStrangerMessageSync(subjectName: String, subject: User, message: MessageChain): String {\n        return \"[$subjectName(Stranger ${subject.id})[SYNC] <- ${renderMessage(message)}\"\n    }\n\n    fun renderFriendMessage(sender: User, message: MessageChain): String {\n        return \"${sender.nick}(${sender.id}) -> ${renderMessage(message)}\"\n    }\n\n    fun renderFriendMessageSync(subject: User, message: MessageChain): String {\n        return \"${subject.nick}(${subject.id})[SYNC] <- ${renderMessage(message)}\"\n    }\n\n    fun renderOtherClientMessage(client: OtherClient): String {\n        return \"${client.platform} -> ${renderMessage(message)}\"\n    }\n\n\n    bot.logger.verbose {\n        when (this) {\n            is net.mamoe.mirai.event.events.GroupMessageEvent ->\n                renderGroupMessage(group, senderName, sender, message)\n            is net.mamoe.mirai.event.events.GroupMessageSyncEvent ->\n                renderGroupMessageSync(group, message)\n\n            is net.mamoe.mirai.event.events.GroupTempMessageEvent ->\n                renderGroupTempMessage(group, senderName, sender, message)\n            is net.mamoe.mirai.event.events.GroupTempMessageSyncEvent ->\n                renderGroupTempMessageSync(group, subject.nameCardOrNick, subject, message)\n\n            is net.mamoe.mirai.event.events.StrangerMessageEvent ->\n                renderStrangerMessage(senderName, sender, message)\n            is net.mamoe.mirai.event.events.StrangerMessageSyncEvent ->\n                renderStrangerMessageSync(subject.nick, subject, message)\n\n            is net.mamoe.mirai.event.events.FriendMessageEvent ->\n                renderFriendMessage(sender, message)\n            is net.mamoe.mirai.event.events.FriendMessageSyncEvent ->\n                renderFriendMessageSync(subject, message)\n\n            is net.mamoe.mirai.event.events.OtherClientMessageEvent ->\n                renderOtherClientMessage(client)\n\n            else -> toString()\n        }.replaceMagicCodes() // group name & sender nick & message\n    }\n}\n\n@Suppress(\"SpellCheckingInspection\")\nprivate val charMappings = mapOf(\n    '\\n' to \"\"\"\\n\"\"\",\n    '\\r' to \"\",\n\n    // region Control Characters https://en.wikipedia.org/wiki/Control_character https://en.wikipedia.org/wiki/Unicode_control_characters\n\n    // ASCII\n    '\\u0000' to \"<NUL>\",\n    '\\u0001' to \"<SOH>\",\n    '\\u0002' to \"<STX>\",\n    '\\u0003' to \"<ETX>\",\n    '\\u0004' to \"<EOT>\",\n    '\\u0005' to \"<ENQ>\",\n    '\\u0006' to \"<ACK>\",\n    '\\u0007' to \"<BEL>\",\n    '\\u0008' to \"<BS>\",\n    '\\u0009' to \"<HT>\",\n    // '\\u000a' to \"<LF>\", // \\n\n    '\\u000b' to \"<VT>\",\n    '\\u000c' to \"<FF>\",\n    // '\\u000d' to \"<CR>\", // \\r\n    '\\u000e' to \"<SO>\",\n    '\\u000F' to \"<SI>\",\n    '\\u0010' to \"<DLE>\",\n    '\\u0011' to \"<DC1>\",\n    '\\u0012' to \"<DC2>\",\n    '\\u0013' to \"<DC3>\",\n    '\\u0014' to \"<DC4>\",\n    '\\u0015' to \"<NAK>\",\n    '\\u0016' to \"<SYN>\",\n    '\\u0017' to \"<ETB>\",\n    '\\u0018' to \"<CAN>\",\n    '\\u0019' to \"<EM>\",\n    '\\u001a' to \"<SUB>\",\n    '\\u001b' to \"<ESC>\",\n    '\\u001c' to \"<FS>\",\n    '\\u001d' to \"<GS>\",\n    '\\u001e' to \"<RS>\",\n    '\\u001f' to \"<US>\",\n\n    '\\u007F' to \"<DEL>\",\n    '\\u0085' to \"<NEL>\",\n\n    // Unicode Control Characters - Bidirectional text control\n    // https://en.wikipedia.org/wiki/Unicode_control_characters#Bidirectional_text_control\n\n    '\\u061C' to \"<ALM>\",\n    '\\u200E' to \"<LTRM>\",\n    '\\u200F' to \"<RTLM>\",\n    '\\u202A' to \"<LTRE>\",\n    '\\u202B' to \"<RTLE>\",\n    '\\u202C' to \"<PDF>\",\n    '\\u202D' to \"<LTR>\",\n    '\\u202E' to \"<RTL>\",\n    '\\u2066' to \"<LTRI>\",\n    '\\u2067' to \"<RTLI>\",\n    '\\u2068' to \"<FSI>\",\n    '\\u2069' to \"<PDI>\",\n    // endregion\n\n)\n\nprivate val regionMappings: Map<IntRange, StringBuilder.(Char) -> Unit> = mapOf(\n    0x0080..0x009F to { // https://en.wikipedia.org/wiki/Control_character#In_Unicode\n        append(\"<control-\").append(it.code.toUHexString()).append(\">\")\n    },\n)\n\ninternal fun String.applyCharMapping() = buildString(capacity = this.length) {\n    this@applyCharMapping.forEach { char ->\n\n        charMappings[char]?.let { append(char); return@forEach }\n\n        regionMappings.entries.find { char.code in it.key }?.let { mapping ->\n            mapping.value.invoke(this@buildString, char)\n            return@forEach\n        }\n\n        append(char)\n    }\n}\n\ninternal fun String.replaceMagicCodes(): String = this\n    .applyCharMapping()\n\n\ninternal fun Message.takeContent(length: Int): String =\n    this.toMessageChain().joinToString(\"\", limit = length) { it.content }\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/event/EventChannelImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.event\n\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.asSharedFlow\nimport kotlinx.coroutines.flow.filter\nimport kotlinx.coroutines.sync.withLock\nimport net.mamoe.mirai.event.*\nimport net.mamoe.mirai.event.events.BotEvent\nimport net.mamoe.mirai.event.events.MessageEvent\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.components.EventDispatcher\nimport net.mamoe.mirai.internal.network.components.SHOW_VERBOSE_EVENT\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.verbose\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\nimport kotlin.reflect.KClass\n\n// See docs below\n@RequiresOptIn(\n    \"You must not use this API unless you are writing Event infrastructure.\",\n    level = RequiresOptIn.Level.ERROR\n)\ninternal annotation class InternalEventMechanism\n\n// Note: You probably should only use EventChannelToEventDispatcherAdapter.instance, or just use EventDispatchers. Event.broadcast is also good to use internally!\n/**\n * Implementation of [EventChannel]. Every [EventChannelImpl] holds its own list of listeners, so one [EventChannelImpl] instance, [EventChannelToEventDispatcherAdapter] is shared in mirai.\n *\n * ## Broadcasting an event\n *\n * You should first consider using [EventDispatcher.broadcast] or [EventDispatcher.broadcastAsync].\n * Use [Event.broadcast] if you have no access to [EventDispatcher] (though you should have).\n *\n * Note: using [Event.broadcast] for [BotEvent] is the same as using [EventDispatcher.broadcast] but the former is slower. So it's recommended to use [EventDispatcher].\n *\n * **Never ever** use [EventChannelToEventDispatcherAdapter.instance] directly.\n */\ninternal sealed class EventChannelImpl<E : Event>(\n    baseEventClass: KClass<out E>, defaultCoroutineContext: CoroutineContext = EmptyCoroutineContext\n) : EventChannel<E>(baseEventClass, defaultCoroutineContext) {\n    private val eventListeners = EventListeners()\n\n    // drop any unsubscribed events\n    private val flow = MutableSharedFlow<Event>(extraBufferCapacity = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST)\n\n    companion object {\n        private val logger by lazy { MiraiLogger.Factory.create(EventChannelImpl::class, \"EventChannelImpl\") }\n    }\n\n    /**\n     * Basic entrance for broadcasting an event.\n     */\n    @InternalEventMechanism\n    suspend fun <E : Event> broadcastEventImpl(event: E): E {\n        require(event is AbstractEvent) { \"Events must extend AbstractEvent\" }\n\n        if (event is BroadcastControllable && !event.shouldBroadcast) {\n            return event\n        }\n        event.broadCastLock.withLock {\n            event._intercepted = false\n            callListeners(event)\n        }\n\n        return event\n    }\n\n    @InternalEventMechanism\n    private suspend fun callListeners(event: Event) {\n        event as AbstractEvent\n        logEvent(event)\n        eventListeners.callListeners(event)\n        flow.emit(event)\n    }\n\n    override fun asFlow(): Flow<E> {\n        @Suppress(\"UNCHECKED_CAST\")\n        return flow.asSharedFlow().filter { baseEventClass.isInstance(it) } as Flow<E>\n    }\n\n    override fun <E : Event> registerListener(eventClass: KClass<out E>, listener: Listener<E>) {\n        eventListeners.addListener(eventClass, listener)\n    }\n\n    override fun <E : Event> createListener(\n        coroutineContext: CoroutineContext,\n        concurrencyKind: ConcurrencyKind,\n        priority: EventPriority,\n        listenerBlock: suspend (E) -> ListeningStatus\n    ): Listener<E> {\n        val context = this.defaultCoroutineContext + coroutineContext\n        return SafeListener(\n            parentJob = context[Job],\n            subscriberContext = context,\n            listenerBlock = listenerBlock,\n            concurrencyKind = concurrencyKind,\n            priority = priority\n        )\n    }\n\n    private fun isVerboseEvent(event: Event): Boolean {\n        if (SHOW_VERBOSE_EVENT) return false\n        if (event is VerboseEvent) {\n            if (event is BotEvent) {\n                return !event.bot.configuration.isShowingVerboseEventLog\n            }\n            return true\n        }\n        return false\n    }\n\n    private fun logEvent(event: Event) {\n        if (event is Packet.NoEventLog) return\n        if (event is Packet.NoLog) return\n        if (event is MessageEvent) return // specially handled in [LoggingPacketHandlerAdapter]\n//        if (this is Packet) return@withLock // all [Packet]s are logged in [LoggingPacketHandlerAdapter]\n        if (isVerboseEvent(event)) return\n\n        if (event is BotEvent) {\n            event.bot.logger.verbose { \"Event: $event\" }\n        } else {\n            logger.verbose { \"Event: $event\" }\n        }\n    }\n\n    override fun context(vararg coroutineContexts: CoroutineContext): EventChannel<E> {\n        val newDefaultContext = coroutineContexts.fold(defaultCoroutineContext) { acc, coroutineContext ->\n            acc + coroutineContext\n        }\n\n        @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n        return object : DelegateEventChannel<E>(this) {\n            override fun <E : Event> createListener(\n                coroutineContext: CoroutineContext,\n                concurrencyKind: ConcurrencyKind,\n                priority: EventPriority,\n                listenerBlock: suspend (E) -> ListeningStatus\n            ): Listener<E> {\n                return super.createListener(\n                    newDefaultContext + coroutineContext,\n                    concurrencyKind,\n                    priority,\n                    listenerBlock\n                )\n            }\n\n            override fun context(vararg coroutineContexts: CoroutineContext): EventChannel<E> {\n                return delegate.context(newDefaultContext, *coroutineContexts)\n            }\n        }\n    }\n}\n\n\ninternal abstract class DelegateEventChannel<BaseEvent : Event>(\n    protected val delegate: EventChannel<BaseEvent>,\n) : EventChannel<BaseEvent>(delegate.baseEventClass, delegate.defaultCoroutineContext) {\n    override fun asFlow(): Flow<BaseEvent> = delegate.asFlow()\n\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n    override fun <E : Event> registerListener(eventClass: KClass<out E>, listener: Listener<E>) {\n        delegate.registerListener0(eventClass, listener)\n    }\n\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n    override fun <E : Event> createListener(\n        coroutineContext: CoroutineContext,\n        concurrencyKind: ConcurrencyKind,\n        priority: EventPriority,\n        listenerBlock: suspend (E) -> ListeningStatus\n    ): Listener<E> = delegate.createListener0(coroutineContext, concurrencyKind, priority, listenerBlock)\n\n    override fun context(vararg coroutineContexts: CoroutineContext): EventChannel<BaseEvent> {\n        return delegate.context(*coroutineContexts)\n    }\n}\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/event/EventChannelToEventDispatcherAdapter.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.event\n\nimport net.mamoe.mirai.event.Event\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\nimport kotlin.reflect.KClass\n\ninternal class EventChannelToEventDispatcherAdapter<E : Event> private constructor(\n    baseEventClass: KClass<out E>, defaultCoroutineContext: CoroutineContext = EmptyCoroutineContext\n) : EventChannelImpl<E>(baseEventClass, defaultCoroutineContext) {\n    companion object {\n        @InternalEventMechanism\n        val instance by lazy { EventChannelToEventDispatcherAdapter(Event::class, EmptyCoroutineContext) }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/event/EventListeners.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.event\n\nimport kotlinx.coroutines.CoroutineStart\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.supervisorScope\nimport kotlinx.coroutines.sync.withLock\nimport net.mamoe.mirai.event.*\nimport net.mamoe.mirai.internal.network.components.EVENT_LAUNCH_UNDISPATCHED\nimport net.mamoe.mirai.utils.*\nimport kotlin.reflect.KClass\n\n\ninternal class ListenerRegistry(\n    val listener: Listener<Event>,\n    val type: KClass<out Event>,\n)\n\n\ninternal class EventListeners {\n    companion object {\n        private val logger by lazy {\n            MiraiLogger.Factory.create(EventListeners::class).withSwitch(systemProp(\"mirai.event.trace\", false))\n        }\n    }\n\n    private val map: Map<EventPriority, MutableCollection<ListenerRegistry>>\n\n    init {\n        val map =\n            EnumMap<EventPriority, MutableCollection<ListenerRegistry>>(EventPriority::class)\n        EventPriority.values().forEach {\n            map[it] = ConcurrentLinkedDeque()\n        }\n        this.map = map\n    }\n\n\n    fun clear() {\n        map.forEach { (_, u) ->\n            u.clear()\n        }\n    }\n\n    operator fun get(priority: EventPriority): MutableCollection<ListenerRegistry> =\n        map[priority] ?: error(\"Internal error: map[$priority] == null\")\n\n\n    private val prioritiesExcludedMonitor: Array<EventPriority> = run {\n        EventPriority.values().filter { it != EventPriority.MONITOR }.toTypedArray()\n    }\n\n    internal suspend fun <E : AbstractEvent> callListeners(event: E) {\n        for (p in prioritiesExcludedMonitor) {\n            val container = get(p)\n            for (registry in container) {\n                if (event.isIntercepted) return\n                if (!registry.type.isInstance(event)) continue\n                val listener = registry.listener\n                process(container, registry, listener, event)\n            }\n        }\n\n        if (event.isIntercepted) return\n        val container = get(EventPriority.MONITOR)\n        when (container.size) {\n            0 -> return\n            1 -> {\n                val registry = container.firstOrNull() ?: return\n                if (!registry.type.isInstance(event)) return\n                process(container, registry, registry.listener, event)\n            }\n            else -> supervisorScope {\n                for (registry in get(EventPriority.MONITOR)) {\n                    if (!registry.type.isInstance(event)) continue\n                    launch(start = if (EVENT_LAUNCH_UNDISPATCHED) CoroutineStart.UNDISPATCHED else CoroutineStart.DEFAULT) {\n                        process(container, registry, registry.listener, event)\n                    }\n                }\n            }\n        }\n    }\n\n    internal fun <E : Event> addListener(eventClass: KClass<E>, listener: Listener<E>) {\n        logger.info { \"Add listener: $listener for $eventClass\" }\n        val listeners = get(listener.priority)\n\n        @Suppress(\"UNCHECKED_CAST\")\n        val node = ListenerRegistry(listener as Listener<Event>, eventClass)\n        listeners.add(node)\n        listener.invokeOnCompletion {\n            listeners.remove(node)\n        }\n    }\n\n    private suspend fun <E : AbstractEvent> process(\n        container: MutableCollection<ListenerRegistry>,\n        registry: ListenerRegistry,\n        listener: Listener<Event>,\n        event: E,\n    ) {\n        logger.info { \"Invoke listener: $listener\" }\n        when (listener.concurrencyKind) {\n            ConcurrencyKind.LOCKED -> {\n                (listener as SafeListener).lock!!.withLock {\n                    if (listener.onEvent(event) == ListeningStatus.STOPPED) {\n                        container.remove(registry)\n                    }\n                }\n            }\n            ConcurrencyKind.CONCURRENT -> {\n                if (listener.onEvent(event) == ListeningStatus.STOPPED) {\n                    container.remove(registry)\n                }\n            }\n        }\n        logger.info { \"Finished listener: $listener\" }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/event/GlobalEventChannelProviderImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.event\n\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.event.EventChannel\nimport net.mamoe.mirai.event.InternalGlobalEventChannelProvider\n\n@InternalEventMechanism\ninternal class GlobalEventChannelProviderImpl : InternalGlobalEventChannelProvider {\n    @InternalEventMechanism\n    val instance = EventChannelToEventDispatcherAdapter.instance\n\n    @OptIn(InternalEventMechanism::class)\n    override fun getInstance(): EventChannel<Event> = instance\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/event/SafeListener.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.event\n\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.sync.Mutex\nimport net.mamoe.mirai.event.*\nimport net.mamoe.mirai.event.events.BotEvent\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.systemProp\nimport kotlin.coroutines.CoroutineContext\n\n/**\n * 包装用户的 [Listener], 增加异常处理, 实现 [ConcurrencyKind].\n */\ninternal class SafeListener<in E : Event> internal constructor(\n    parentJob: Job?,\n    subscriberContext: CoroutineContext,\n    private val listenerBlock: suspend (E) -> ListeningStatus,\n    override val concurrencyKind: ConcurrencyKind,\n    override val priority: EventPriority,\n    private val creationStacktrace: Exception? = if (traceEnabled) Exception() else null\n) : Listener<E>, CompletableJob by SupervisorJob(parentJob) { // avoid being cancelled on handling event\n\n    private val subscriberContext: CoroutineContext = subscriberContext + this // override Job.\n\n    val lock: Mutex? = when (concurrencyKind) {\n        ConcurrencyKind.LOCKED -> Mutex()\n        else -> null\n    }\n\n    override fun toString(): String {\n        return if (creationStacktrace != null) {\n            \"SafeListener(concurrency=${concurrencyKind}\" +\n                    \", priority=$priority\" +\n                    \", subscriberContext=${subscriberContext.minusKey(Job)}\" +\n                    \", trace=${creationStacktrace.stackTraceToString()})\"\n        } else {\n            return \"SafeListener(concurrency=${concurrencyKind}\" +\n                    \", priority=$priority\" +\n                    \", subscriberContext=${subscriberContext.minusKey(Job)})\" // remove this\n        }\n    }\n\n    @Suppress(\"unused\")\n    override suspend fun onEvent(event: E): ListeningStatus {\n        if (isCompleted || isCancelled) return ListeningStatus.STOPPED\n        if (!isActive) return ListeningStatus.LISTENING\n        return try {\n            // Inherit context.\n            withContext(subscriberContext) { listenerBlock.invoke(event) }.also { if (it == ListeningStatus.STOPPED) this.complete() }\n        } catch (e: Throwable) {\n            // 若监听方使用了 EventChannel.exceptionHandler, 那么它就能处理异常, 否则将只记录异常.\n            val subscriberExceptionHandler = subscriberContext[CoroutineExceptionHandler]\n            if (subscriberExceptionHandler == null) {\n                val logger = if (event is BotEvent) event.bot.logger else logger\n                val subscriberName =\n                    subscriberContext[CoroutineName]?.name\n                        ?: \"<unnamed>\" // Bot 协程域有 CoroutineName, mirai-console 也会给插件域加入.\n                val broadcasterName = currentCoroutineContext()[CoroutineName]?.name ?: \"<unnamed>\"\n                val message =\n                    \"An exception occurred when processing event. \" +\n                            \"Subscriber scope: '$subscriberName'. \" +\n                            \"Broadcaster scope: '$broadcasterName'\"\n                logger.warning(message, e)\n\n            } else {\n                subscriberExceptionHandler.handleException(subscriberContext, e)\n            }\n\n\n            ListeningStatus.LISTENING\n        }\n    }\n\n    companion object {\n        private val logger by lazy {\n            MiraiLogger.Factory.create(SafeListener::class)\n        }\n    }\n}\n\nprivate val traceEnabled by lazy { systemProp(\"mirai.event.trace\", true) }"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/event/package.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.event\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/ReceiveMessageHandler.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.internal.message.DeepMessageRefiner.refineDeep\nimport net.mamoe.mirai.internal.message.LightMessageRefiner.refineLight\nimport net.mamoe.mirai.internal.message.ReceiveMessageTransformer.cleanupRubbishMessageElements\nimport net.mamoe.mirai.internal.message.ReceiveMessageTransformer.toAudio\nimport net.mamoe.mirai.internal.message.data.LongMessageInternal\nimport net.mamoe.mirai.internal.message.data.OnlineAudioImpl\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocolFacade\nimport net.mamoe.mirai.internal.message.protocol.impl.PokeMessageProtocol.Companion.UNSUPPORTED_POKE_MESSAGE_PLAIN\nimport net.mamoe.mirai.internal.message.protocol.impl.RichMessageProtocol.Companion.UNSUPPORTED_MERGED_MESSAGE_PLAIN\nimport net.mamoe.mirai.internal.message.source.*\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.castOrNull\nimport net.mamoe.mirai.utils.structureToString\nimport net.mamoe.mirai.utils.toLongUnsigned\nimport net.mamoe.mirai.utils.warning\n\n/**\n * 只在手动构造 [OfflineMessageSource] 时调用\n */\ninternal fun ImMsgBody.SourceMsg.toMessageChainNoSource(\n    bot: Bot,\n    messageSourceKind: MessageSourceKind,\n    groupIdOrZero: Long,\n    refineContext: RefineContext = EmptyRefineContext,\n    facade: MessageProtocolFacade = MessageProtocolFacade\n): MessageChain {\n    val elements = this.elems\n    return buildMessageChain(elements.size + 1) {\n        facade.decode(elements, groupIdOrZero, messageSourceKind, bot, this, null)\n    }.cleanupRubbishMessageElements().refineLight(bot, refineContext)\n}\n\n\ninternal suspend fun List<MsgComm.Msg>.toMessageChainOnline(\n    bot: Bot,\n    groupIdOrZero: Long,\n    messageSourceKind: MessageSourceKind,\n    refineContext: RefineContext = EmptyRefineContext,\n    facade: MessageProtocolFacade = MessageProtocolFacade\n): MessageChain {\n    return toMessageChain(bot, groupIdOrZero, true, messageSourceKind, facade).refineDeep(bot, refineContext)\n}\n\ninternal fun getMessageSourceKindFromC2cCmdOrNull(c2cCmd: Int): MessageSourceKind? {\n    return when (c2cCmd) {\n        11 -> MessageSourceKind.FRIEND // bot 给其他人发消息\n        4 -> MessageSourceKind.FRIEND // bot 给自己作为好友发消息 (非 other client)\n        1 -> MessageSourceKind.GROUP\n        else -> null\n    }\n}\n\ninternal fun getMessageSourceKindFromC2cCmd(c2cCmd: Int): MessageSourceKind {\n    return getMessageSourceKindFromC2cCmdOrNull(c2cCmd) ?: error(\"Could not get source kind from c2cCmd: $c2cCmd\")\n}\n\n\ninternal suspend fun MsgComm.Msg.toMessageChainOnline(\n    bot: Bot,\n    refineContext: RefineContext = EmptyRefineContext,\n    facade: MessageProtocolFacade = MessageProtocolFacade,\n): MessageChain {\n    val kind = getMessageSourceKindFromC2cCmd(msgHead.c2cCmd)\n    val groupId = when (kind) {\n        MessageSourceKind.GROUP -> msgHead.groupInfo?.groupCode ?: 0\n        else -> 0\n    }\n\n    return listOf(this).toMessageChainOnline(\n        bot,\n        groupId,\n        kind,\n        refineContext.merge(SimpleRefineContext(\n            RefineContextKey.MessageSourceKind to kind,\n            RefineContextKey.GroupIdOrZero to groupId\n        ), false),\n        facade\n    )\n}\n\n//internal fun List<MsgComm.Msg>.toMessageChainOffline(\n//    bot: Bot,\n//    groupIdOrZero: Long,\n//    messageSourceKind: MessageSourceKind\n//): MessageChain {\n//    return toMessageChain(bot, groupIdOrZero, false, messageSourceKind).refineLight(bot)\n//}\n\ninternal fun List<MsgComm.Msg>.toMessageChainNoSource(\n    bot: Bot,\n    groupIdOrZero: Long,\n    messageSourceKind: MessageSourceKind,\n    refineContext: RefineContext = EmptyRefineContext,\n): MessageChain {\n    return toMessageChain(bot, groupIdOrZero, null, messageSourceKind).refineLight(bot, refineContext)\n}\n\n\nprivate fun List<MsgComm.Msg>.toMessageChain(\n    bot: Bot,\n    groupIdOrZero: Long,\n    onlineSource: Boolean?,\n    messageSourceKind: MessageSourceKind,\n    facade: MessageProtocolFacade = MessageProtocolFacade,\n): MessageChain {\n    try {\n        return toMessageChainImpl(bot, groupIdOrZero, onlineSource, messageSourceKind, facade)\n    } catch (e: Exception) {\n        throw IllegalStateException(\n            \"Failed to transform internal message to facade message, msg=${this@toMessageChain.structureToString()}\",\n            e\n        )\n    }\n}\n\n\nprivate fun List<MsgComm.Msg>.toMessageChainImpl(\n    bot: Bot,\n    groupIdOrZero: Long,\n    onlineSource: Boolean?,\n    messageSourceKind: MessageSourceKind,\n    facade: MessageProtocolFacade = MessageProtocolFacade,\n): MessageChain {\n    val messageList = this\n\n\n    val builder = MessageChainBuilder(messageList.sumOf { it.msgBody.richText.elems.size })\n\n    val source = if (onlineSource != null) {\n        ReceiveMessageTransformer.createMessageSource(bot, onlineSource, messageSourceKind, messageList)\n    } else null\n    if (source != null) builder.add(source)\n\n    val fromId = source?.fromId ?: firstOrNull()?.msgHead?.fromUin\n    if (fromId == null) {\n        bot.logger.warning {\n            \"Cannot determine fromId from message source and msg elements, \" +\n                    \"source: $source, elements: ${this.joinToString(\", \")}\"\n        }\n    }\n\n    messageList.forEach { msg ->\n        facade.decode(\n            msg.msgBody.richText.elems,\n            groupIdOrZero,\n            messageSourceKind,\n            bot,\n            builder,\n            msg\n        )\n    }\n\n    for (msg in messageList) {\n        msg.msgBody.richText.ptt?.toAudio()?.let { builder.add(it) }\n    }\n\n    return builder.build().cleanupRubbishMessageElements()\n}\n\n/**\n * 接收消息的解析器. 将 [MsgComm.Msg] 转换为对应的 [SingleMessage]\n * @see joinToMessageChain\n */\ninternal object ReceiveMessageTransformer {\n    fun createMessageSource(\n        bot: Bot,\n        onlineSource: Boolean,\n        messageSourceKind: MessageSourceKind,\n        messageList: List<MsgComm.Msg>,\n    ): MessageSource {\n        return when (onlineSource) {\n            true -> {\n                when (messageSourceKind) {\n                    MessageSourceKind.TEMP -> OnlineMessageSourceFromTempImpl(bot, messageList)\n                    MessageSourceKind.GROUP -> OnlineMessageSourceFromGroupImpl(bot, messageList)\n                    MessageSourceKind.FRIEND -> OnlineMessageSourceFromFriendImpl(bot, messageList)\n                    MessageSourceKind.STRANGER -> OnlineMessageSourceFromStrangerImpl(bot, messageList)\n                }\n            }\n\n            false -> {\n                OfflineMessageSourceImplData(bot, messageList, messageSourceKind)\n            }\n        }\n    }\n\n    fun MessageChainBuilder.compressContinuousPlainText() {\n        var index = 0\n        val builder = StringBuilder()\n        while (index + 1 < size) {\n            val elm0 = get(index)\n            val elm1 = get(index + 1)\n            if (elm0 is PlainText && elm1 is PlainText) {\n                builder.setLength(0)\n                var end = -1\n                for (i in index until size) {\n                    val elm = get(i)\n                    if (elm is PlainText) {\n                        end = i\n                        builder.append(elm.content)\n                    } else break\n                }\n                set(index, PlainText(builder.toString()))\n                // do delete\n                val index1 = index + 1\n                repeat(end - index) {\n                    removeAt(index1)\n                }\n            }\n            index++\n        }\n\n        // delete empty plain text\n        removeAll { it is PlainText && it.content.isEmpty() }\n    }\n\n    fun MessageChain.cleanupRubbishMessageElements(): MessageChain {\n        val builder = MessageChainBuilder(initialSize = count()).also {\n            it.addAll(this)\n        }\n\n        kotlin.run moveQuoteReply@{ // Move QuoteReply after MessageSource\n            val exceptedQuoteReplyIndex = builder.indexOfFirst { it is MessageSource } + 1\n            val quoteReplyIndex = builder.indexOfFirst { it is QuoteReply }\n            if (quoteReplyIndex < 1) return@moveQuoteReply\n            if (quoteReplyIndex != exceptedQuoteReplyIndex) {\n                val qr = builder[quoteReplyIndex]\n                builder.removeAt(quoteReplyIndex)\n                builder.add(exceptedQuoteReplyIndex, qr)\n            }\n        }\n\n        kotlin.run quote@{\n            val quoteReplyIndex = builder.indexOfFirst { it is QuoteReply }\n            if (quoteReplyIndex >= 0) {\n                // QuoteReply + At + PlainText(space 1)\n                if (quoteReplyIndex < builder.size - 1) {\n                    if (builder[quoteReplyIndex + 1] is At) {\n                        builder.removeAt(quoteReplyIndex + 1)\n                    }\n                    if (quoteReplyIndex < builder.size - 1) {\n                        val elm = builder[quoteReplyIndex + 1]\n                        if (elm is PlainText && elm.content.startsWith(' ')) {\n                            if (elm.content.length == 1) {\n                                builder.removeAt(quoteReplyIndex + 1)\n                            } else {\n                                builder[quoteReplyIndex + 1] = PlainText(elm.content.substring(1))\n                            }\n                        }\n                    }\n                    return@quote\n                }\n            }\n        }\n\n        // TIM audios\n        if (builder.any { it is Audio }) {\n            builder.remove(UNSUPPORTED_VOICE_MESSAGE_PLAIN)\n        }\n\n        kotlin.run { // VipFace\n            val vipFaceIndex = builder.indexOfFirst { it is VipFace }\n            if (vipFaceIndex >= 0 && vipFaceIndex < builder.size - 1) {\n                val l = builder[vipFaceIndex] as VipFace\n                val text = builder[vipFaceIndex + 1]\n                if (text is PlainText) {\n                    if (text.content.length == 4 + (l.count / 10) + l.kind.name.length) {\n                        builder.removeAt(vipFaceIndex + 1)\n                    }\n                }\n            }\n        }\n\n        fun removeSuffixText(index: Int, text: PlainText) {\n            if (index >= 0 && index < builder.size - 1) {\n                if (builder[index + 1] == text) {\n                    builder.removeAt(index + 1)\n                }\n            }\n        }\n\n        removeSuffixText(builder.indexOfFirst { it is LongMessageInternal }, UNSUPPORTED_MERGED_MESSAGE_PLAIN)\n        removeSuffixText(builder.indexOfFirst { it is PokeMessage }, UNSUPPORTED_POKE_MESSAGE_PLAIN)\n\n        builder.compressContinuousPlainText()\n\n        return builder.asMessageChain()\n    }\n\n    fun ImMsgBody.Ptt.toAudio() = OnlineAudioImpl(\n        filename = fileName.decodeToString(),\n        fileMd5 = fileMd5,\n        fileSize = fileSize.toLongUnsigned(),\n        codec = AudioCodec.fromId(format),\n        url = downPara.decodeToString(),\n        length = time.toLongUnsigned(),\n        originalPtt = this,\n    )\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/RefinableMessage.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.internal.message.DeepMessageRefiner.refineDeep\nimport net.mamoe.mirai.internal.message.LightMessageRefiner.refineLight\nimport net.mamoe.mirai.internal.message.LightMessageRefiner.refineMessageSource\nimport net.mamoe.mirai.internal.message.flags.InternalFlagOnlyMessage\nimport net.mamoe.mirai.internal.message.source.IncomingMessageSourceInternal\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.cast\nimport net.mamoe.mirai.utils.safeCast\n\n/**\n * 在接收解析消息后会经过一层转换的消息.\n *\n * @see DeepMessageRefiner.refineDeep\n * @see LightMessageRefiner.refineLight\n */\ninternal interface RefinableMessage : SingleMessage {\n\n    /**\n     * Refine if possible (without suspension), returns self otherwise.\n     * @since 2.6\n     */ // see #1157\n    fun tryRefine(\n        bot: Bot,\n        context: MessageChain,\n        refineContext: RefineContext = EmptyRefineContext,\n    ): Message? = this\n\n    /**\n     * This message [RefinableMessage] will be replaced by return value of [refineLight]\n     */\n    suspend fun refine(\n        bot: Bot,\n        context: MessageChain,\n        refineContext: RefineContext = EmptyRefineContext,\n    ): Message? = tryRefine(bot, context, refineContext)\n}\n\ninternal sealed class MessageRefiner {\n    protected inline fun MessageChain.refineImpl(\n        bot: Bot,\n        refineAction: (message: RefinableMessage) -> Message?,\n    ): MessageChain {\n        val convertLineSeparator = bot.configuration.convertLineSeparator\n\n        if (none {\n                it is RefinableMessage\n                        || (it is PlainText && convertLineSeparator && it.content.contains('\\r'))\n            }\n        ) return this\n\n\n        val builder = MessageChainBuilder(this.size)\n        for (singleMessage in this) {\n            if (singleMessage is RefinableMessage) {\n                val v = refineAction(singleMessage)\n                if (v != null) builder.add(v)\n            } else if (singleMessage is PlainText && convertLineSeparator) {\n                val content = singleMessage.content\n                if (content.contains('\\r')) {\n                    builder.add(\n                        PlainText(\n                            content\n                                .replace(\"\\r\\n\", \"\\n\")\n                                .replace('\\r', '\\n')\n                        )\n                    )\n                } else {\n                    builder.add(singleMessage)\n                }\n            } else {\n                builder.add(singleMessage)\n            }\n        }\n        return builder.build()\n    }\n}\n\n@Suppress(\"unused\")\ninternal class RefineContextKey<T : Any>(\n    val name: String?,\n) {\n    override fun toString(): String {\n        return buildString {\n            append(\"Key(\")\n            name?.also(this@buildString::append) ?: kotlin.run {\n                append('#').append(this@RefineContextKey.hashCode())\n            }\n            append(')')\n        }\n    }\n\n    internal companion object {\n        val MessageSourceKind = RefineContextKey<MessageSourceKind>(\"MessageSourceKind\")\n        val FromId = RefineContextKey<Long>(\"FromId\")\n        val GroupIdOrZero = RefineContextKey<Long>(\"GroupIdOrZero\")\n    }\n}\n\n/**\n * 转换消息时的上下文\n */\ninternal interface RefineContext {\n    operator fun contains(key: RefineContextKey<*>): Boolean\n    operator fun <T : Any> get(key: RefineContextKey<T>): T?\n    fun <T : Any> getNotNull(key: RefineContextKey<T>): T = get(key) ?: error(\"No such value of `$key`\")\n    fun merge(other: RefineContext, override: Boolean): RefineContext\n    fun entries(): Set<Pair<RefineContextKey<*>, Any>>\n}\n\ninternal interface MutableRefineContext : RefineContext {\n    operator fun <T : Any> set(key: RefineContextKey<T>, value: T)\n    fun remove(key: RefineContextKey<*>)\n}\n\ninternal object EmptyRefineContext : RefineContext {\n    override fun contains(key: RefineContextKey<*>): Boolean = false\n    override fun <T : Any> get(key: RefineContextKey<T>): T? = null\n    override fun merge(other: RefineContext, override: Boolean): RefineContext {\n        return other\n    }\n    override fun entries(): Set<Pair<RefineContextKey<*>, Any>> {\n        return emptySet()\n    }\n    override fun toString(): String {\n        return \"EmptyRefineContext\"\n    }\n\n    override fun equals(other: Any?): Boolean {\n        return other === EmptyRefineContext\n    }\n}\n\n@Suppress(\"UNCHECKED_CAST\")\ninternal class SimpleRefineContext(\n    private val delegate: MutableMap<RefineContextKey<*>, Any> = mutableMapOf(),\n) : MutableRefineContext {\n\n    override fun contains(key: RefineContextKey<*>): Boolean = delegate.containsKey(key)\n    override fun <T : Any> get(key: RefineContextKey<T>): T? {\n        return (delegate[key] ?: return null) as T\n    }\n\n    override fun <T : Any> set(key: RefineContextKey<T>, value: T) {\n        delegate[key] = value\n    }\n\n    override fun remove(key: RefineContextKey<*>) {\n        delegate.remove(key)\n    }\n\n    override fun entries(): Set<Pair<RefineContextKey<*>, Any>> {\n        return delegate.entries.map { (k, v) -> k to v }.toSet()\n    }\n\n    override fun merge(other: RefineContext, override: Boolean): RefineContext {\n        val new = SimpleRefineContext(*entries().toTypedArray())\n        other.entries().forEach { (key, value) ->\n            if (new[key] == null || override) {\n                new[key as RefineContextKey<Any>] = value\n            }\n        }\n        return new\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (other !is RefineContext) return false\n        if (other === this) return true\n\n        return other.entries() == entries()\n    }\n}\n\ninternal fun SimpleRefineContext(vararg elements: Pair<RefineContextKey<*>, Any>): SimpleRefineContext =\n    SimpleRefineContext(elements.toMap().toMutableMap())\n\n/**\n * 执行不需要 `suspend` 的 refine. 用于 [MessageSource.originalMessage].\n */\ninternal object LightMessageRefiner : MessageRefiner() {\n    /* note:\n     * 不在 refineLight 中处理的原因是 refineMessageSource\n     * 需要的是 **最终处理完成后** 的 MessageChain (即 refineDeep 后的 MessageChain)\n     *\n     * 在 refineLight/RefinableMessage.(try)refine 中直接处理将导致获取不到最终结果导致逻辑错误\n     */\n    fun MessageChain.refineMessageSource(): MessageChain {\n        val source = this.sourceOrNull?.safeCast<IncomingMessageSourceInternal>() ?: return this\n        val originalMessage = this\n        source.originalMessageLazy = lazy {\n            originalMessage.filterNot { it is MessageSource }.toMessageChain()\n//            @Suppress(\"INVISIBLE_MEMBER\")\n//            createMessageChainImplOptimized(originalMessage.filterNot { it is MessageSource })\n        }\n        return this\n    }\n\n    fun MessageChain.refineLight(\n        bot: Bot,\n        refineContext: RefineContext = EmptyRefineContext,\n    ): MessageChain {\n        return refineImpl(bot) { it.tryRefine(bot, this, refineContext) }\n    }\n\n    /**\n     * 去除 [MessageChain] 携带的内部标识\n     *\n     * 用于 [createMessageReceipt] <- `RemoteFile.uploadAndSend` (文件操作API v1)\n     */\n    fun MessageChain.dropMiraiInternalFlags(): MessageChain {\n        return asSequence().filterNot { it is InternalFlagOnlyMessage }.toMessageChain()\n    }\n}\n\n/**\n * 执行需要 `suspend` 的 refine. 用于解析到的消息.\n */\ninternal object DeepMessageRefiner : MessageRefiner() {\n    suspend fun MessageChain.refineDeep(\n        bot: Bot,\n        refineContext: RefineContext = EmptyRefineContext,\n    ): MessageChain {\n        return refineImpl(bot) { it.refine(bot, this, refineContext) }\n            .refineMessageSource()\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/atImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/contextualBugReportException.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message\n\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\n\ninternal data class ContextualBugReportException(\n    override val message: String,\n    override val cause: Throwable?,\n) : IllegalStateException()\n\ninternal fun contextualBugReportException(\n    context: String,\n    forDebug: String?,\n    e: Throwable? = null,\n    additional: String = \"\",\n): ContextualBugReportException {\n    return ContextualBugReportException(\n        \"在 $context 时遇到了意料之中的问题. 请完整复制此日志提交给 mirai: https://github.com/mamoe/mirai/issues/new/choose   $additional 调试信息: $forDebug\",\n        e,\n    )\n}\n\ninternal inline fun <R> runWithBugReport(context: String, forDebug: () -> String, block: () -> R): R {\n    contract {\n        callsInPlace(block, InvocationKind.EXACTLY_ONCE)\n        callsInPlace(forDebug, InvocationKind.AT_MOST_ONCE)\n    }\n\n    return runCatching(block).getOrElse {\n        throw contextualBugReportException(context, forDebug(), it)\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/data/FileMessageImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.internal.message.data\n\nimport kotlinx.coroutines.flow.filter\nimport kotlinx.coroutines.flow.firstOrNull\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.Transient\nimport net.mamoe.mirai.contact.FileSupported\nimport net.mamoe.mirai.contact.file.AbsoluteFile\nimport net.mamoe.mirai.contact.file.AbsoluteFolder\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.asQQAndroidBot\nimport net.mamoe.mirai.internal.contact.file.*\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Oidb0x6d8.GetFileListRspBody\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.FileManagement\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.toResult\nimport net.mamoe.mirai.message.data.FileMessage\nimport net.mamoe.mirai.utils.cast\nimport kotlin.contracts.contract\n\ninternal fun FileMessage.checkIsImpl(): FileMessageImpl {\n    contract { returns() implies (this@checkIsImpl is FileMessageImpl) }\n    return this as? FileMessageImpl ?: error(\"FileMessage must not be implemented manually.\")\n}\n\n@Serializable\n@Suppress(\"ANNOTATION_ARGUMENT_MUST_BE_CONST\") // bug\n@SerialName(FileMessage.SERIAL_NAME)\ninternal data class FileMessageImpl(\n    override val id: String,\n    @SerialName(\"internalId\") val busId: Int,\n    override val name: String,\n    override val size: Long,\n    @Transient val allowSend: Boolean = false,\n) : FileMessage {\n    override val internalId: Int\n        get() = busId\n\n    override suspend fun toAbsoluteFile(contact: FileSupported): AbsoluteFile? {\n        val result = contact.bot.asQQAndroidBot().network\n            .sendAndExpect(FileManagement.GetFileInfo(contact.bot.asQQAndroidBot().client, contact.id, id, busId))\n            .toResult(\"FileMessage.toAbsoluteFile\").getOrThrow()\n        if (result.fileInfo == null) return null\n\n        // Get its parent AbsoluteFolder\n        // This is necessary for properties like creationTime.\n        // Maybe we can optimize it in the future (i.e. make it lazy?)\n\n        val root = contact.files.root.impl()\n        val folder = if (result.fileInfo.parentFolderId == AbsoluteFolder.ROOT_FOLDER_ID) {\n            root\n        } else {\n            val folders = ArrayList<GetFileListRspBody.Item>()\n            root.impl().getItemsFlow()\n                .filter { it.folderInfo != null }\n                .onEach { folders.add(it) }\n                .firstOrNull { it.folderInfo?.folderId == result.fileInfo.parentFolderId }\n                ?.resolved(root) as AbsoluteFolderImpl?\n                ?: kotlin.run {\n                    for (folder in folders) {\n                        CommonAbsoluteFolderImpl.getItemsFlow(\n                            (contact.bot as QQAndroidBot).client,\n                            contact,\n                            folder.folderInfo!!.folderId\n                        ).firstOrNull { it.folderInfo?.folderId == result.fileInfo.parentFolderId }\n                            ?.resolved(root)?.cast<AbsoluteFolderImpl?>()?.let { return@run it }\n                    }\n                    root\n                }\n        }\n\n        return folder.createChildFile(result.fileInfo)\n    }\n\n    override fun toString(): String = \"[mirai:file:$name, id=$id, internalId=$busId, size=$size]\"\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/data/LongMessageInternal.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.data\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.internal.asQQAndroidBot\nimport net.mamoe.mirai.internal.getMiraiImpl\nimport net.mamoe.mirai.internal.message.RefinableMessage\nimport net.mamoe.mirai.internal.message.RefineContext\nimport net.mamoe.mirai.internal.message.RefineContextKey\nimport net.mamoe.mirai.internal.message.visitor.ex\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgTransmit\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.encodeHtmlEscape\nimport net.mamoe.mirai.utils.safeCast\n\n// internal runtime value, not serializable\ninternal data class LongMessageInternal internal constructor(override val content: String, val resId: String) :\n    AbstractServiceMessage(), RefinableMessage {\n    override val serviceId: Int get() = 35\n\n    override suspend fun refine(bot: Bot, context: MessageChain, refineContext: RefineContext): Message {\n        bot.asQQAndroidBot()\n        val long = Mirai.downloadLongMessage(bot, resId)\n\n        return MessageOrigin(SimpleServiceMessage(serviceId, content), resId, MessageOriginKind.LONG) + long\n    }\n\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.ex()?.visitLongMessageInternal(this, data) ?: super<AbstractServiceMessage>.accept(visitor, data)\n    }\n\n    companion object Key :\n        AbstractPolymorphicMessageKey<ServiceMessage, LongMessageInternal>(ServiceMessage, { it.safeCast() })\n}\n\n// internal runtime value, not serializable\n@Suppress(\"RegExpRedundantEscape\", \"UnnecessaryVariable\")\ninternal data class ForwardMessageInternal(\n    override val content: String,\n    val resId: String?,\n    /**\n     * null means top-level.\n     * not null means nested and need [ForwardMessageInternal.MsgTransmits] in [RefineContext]\n     */\n    val fileName: String?,\n\n    /**\n     * For light refine before constructing [MessageReceipt].\n     * See [OutgoingMessageSourceInternal] for more details.\n     */\n    val origin: ForwardMessage? = null,\n) : AbstractServiceMessage(),\n    RefinableMessage {\n    override val serviceId: Int get() = 35\n\n    override fun tryRefine(bot: Bot, context: MessageChain, refineContext: RefineContext): Message {\n        return origin ?: this\n    }\n\n    override suspend fun refine(bot: Bot, context: MessageChain, refineContext: RefineContext): Message {\n        bot.asQQAndroidBot()\n\n        val msgXml = content.substringAfter(\"<msg\", \"\")\n        val xmlHead = msgXml.substringBefore(\"<item\")\n        val xmlFoot: String\n        val xmlContent = msgXml.substringAfter(\"<item\").let {\n            xmlFoot = it.substringAfter(\"</item\", \"\")\n            it.substringBefore(\"</item\")\n        }\n        val brief = xmlHead.findField(\"brief\")\n\n        val summary = SUMMARY_REGEX.find(xmlContent)?.let { it.groupValues[1] } ?: \"\"\n\n        val titles = TITLE_REGEX.findAll(xmlContent)\n            .map { it.groupValues[2].trim() }.toMutableList()\n\n        val title = titles.removeFirstOrNull() ?: \"\"\n\n        val preview = titles\n        val source = xmlFoot.findField(\"name\")\n\n        val resId = resId?.takeIf { it.isNotEmpty() }\n\n        if (fileName != null) kotlin.run nested@{ // nested\n            val transmits = refineContext[MsgTransmits]?.get(fileName)\n                ?: return@nested // Refine failed\n            return MessageOrigin(\n                SimpleServiceMessage(serviceId, content),\n                resId,\n                MessageOriginKind.FORWARD,\n            ) + ForwardMessage(\n                preview = preview,\n                title = title,\n                brief = brief,\n                source = source,\n                summary = summary.trim(),\n                nodeList = getMiraiImpl().run { transmits.toForwardMessageNodes(bot, refineContext) },\n            )\n        }\n\n        // No id and no fileName\n        if (resId == null) {\n            return SimpleServiceMessage(serviceId, content)\n        }\n\n        return MessageOrigin(\n            SimpleServiceMessage(serviceId, content),\n            resId,\n            MessageOriginKind.FORWARD,\n        ) + ForwardMessage(\n            preview = preview,\n            title = title,\n            brief = brief,\n            source = source,\n            summary = summary.trim(),\n            nodeList = Mirai.downloadForwardMessage(bot, resId),\n        )\n    }\n\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.ex()?.visitForwardMessageInternal(this, data) ?: super<AbstractServiceMessage>.accept(\n            visitor,\n            data\n        )\n    }\n\n    companion object Key :\n        AbstractPolymorphicMessageKey<ServiceMessage, ForwardMessageInternal>(ServiceMessage, { it.safeCast() }) {\n\n        val SUMMARY_REGEX = \"\"\"\\<summary.*\\>(.*?)\\<\\/summary\\>\"\"\".toRegex()\n\n        @Suppress(\"SpellCheckingInspection\")\n        val TITLE_REGEX = \"\"\"\\<title([A-Za-z\\s#\\\"0-9\\=]*)\\>([\\u0000-\\uFFFF]*?)\\<\\/title\\>\"\"\".toRegex()\n\n\n        fun String.findField(type: String): String {\n            return substringAfter(\"$type=\\\"\", \"\")\n                .substringBefore(\"\\\"\", \"\")\n        }\n\n        val MsgTransmits = RefineContextKey<Map<String, MsgTransmit.PbMultiMsgNew>>(\"MsgTransmit\")\n    }\n}\n\nprivate fun String.xmlEnc(): String = encodeHtmlEscape()\n\ninternal fun RichMessage.Key.forwardMessage(\n    resId: String,\n    fileName: String,\n    forwardMessage: ForwardMessage,\n): ForwardMessageInternal = with(forwardMessage) {\n    val template = \"\"\"\n        <?xml version=\"1.0\" encoding=\"utf-8\"?>\n        <msg serviceID=\"35\" templateID=\"1\" action=\"viewMultiMsg\" brief=\"${brief.take(30).xmlEnc()}\"\n             m_resid=\"$resId\" m_fileName=\"$fileName\"\n             tSum=\"3\" sourceMsgId=\"0\" url=\"\" flag=\"3\" adverSign=\"0\" multiMsgFlag=\"0\">\n            <item layout=\"1\" advertiser_id=\"0\" aid=\"0\">\n                <title size=\"34\" maxLines=\"2\" lineSpace=\"12\">${title.take(50).xmlEnc()}</title>\n                ${\n        when {\n            preview.size > 4 -> {\n                preview.take(3).joinToString(\"\") {\n                    \"\"\"<title size=\"26\" color=\"#777777\" maxLines=\"2\" lineSpace=\"12\">${it.take(50).xmlEnc()}</title>\"\"\"\n                } + \"\"\"<title size=\"26\" color=\"#777777\" maxLines=\"2\" lineSpace=\"12\">...</title>\"\"\"\n            }\n            else -> {\n                preview.joinToString(\"\") {\n                    \"\"\"<title size=\"26\" color=\"#777777\" maxLines=\"2\" lineSpace=\"12\">${it.take(50).xmlEnc()}</title>\"\"\"\n                }\n            }\n        }\n    }\n                <hr hidden=\"false\" style=\"0\"/>\n                <summary size=\"26\" color=\"#777777\">${summary.take(50).xmlEnc()}</summary>\n            </item>\n            <source name=\"${source.take(50).xmlEnc()}\" icon=\"\" action=\"\" appid=\"-1\"/>\n        </msg>\n    \"\"\".trimIndent().replace(\"\\n\", \" \").trim()\n    return ForwardMessageInternal(template, resId, null, forwardMessage)\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/data/MarketFaceImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.internal.message.data\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.Transient\nimport net.mamoe.mirai.internal.message.visitor.ex\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.message.data.MarketFace\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\n\n@SerialName(MarketFace.SERIAL_NAME)\n@Serializable\ninternal data class MarketFaceImpl internal constructor(\n    internal val delegate: ImMsgBody.MarketFace,\n) : MarketFace {\n\n    override val name: String get() = delegate.faceName.decodeToString()\n\n    @Transient\n    override val id: Int = delegate.tabId\n\n    override fun toString() = \"[mirai:marketface:$id,$name]\"\n\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.ex()?.visitMarketFaceImpl(this, data) ?: super.accept(visitor, data)\n    }\n\n    companion object {\n        const val SERIAL_NAME = MarketFace.SERIAL_NAME\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/data/MessageChainBuilderExt.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.data\n\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.MessageChainBuilder\nimport net.mamoe.mirai.message.data.SingleMessage\nimport net.mamoe.mirai.message.data.toMessageChain\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.message.data.visitor.MessageVisitorUnit\nimport net.mamoe.mirai.message.data.visitor.accept\nimport net.mamoe.mirai.utils.replaceAllKotlin\n\n\ninternal fun MessageChainBuilder.acceptChildren(visitor: MessageVisitorUnit) {\n    forEach { it.accept(visitor) }\n}\n\ninternal fun MessageChainBuilder.transformChildren(visitor: MessageVisitor<MessageChainBuilder, SingleMessage>) {\n    replaceAllKotlin { it.accept(visitor, this) }\n}\n\ninternal inline fun MessageChain.transform(trans: (SingleMessage) -> SingleMessage?): MessageChain {\n    return this.mapNotNull(trans).toMessageChain()\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/data/MessageSourceExt.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.data\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.message.data.MessageSourceKind\n\ninternal fun ContactOrBot.inferMessageSourceKind(): MessageSourceKind {\n    return when (this) {\n        is Group -> MessageSourceKind.GROUP\n        is Member -> MessageSourceKind.TEMP\n        is Friend -> MessageSourceKind.FRIEND\n        is Stranger -> MessageSourceKind.STRANGER\n        is Bot -> MessageSourceKind.FRIEND\n        else -> error(\"Unsupported contact: $this\")\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/data/MultiMsgUploader.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.data\n\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.internal.contact.impl\nimport net.mamoe.mirai.internal.contact.uin\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocolFacade\nimport net.mamoe.mirai.internal.message.source.MessageSourceInternal\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.component.ComponentStorage\nimport net.mamoe.mirai.internal.network.highway.Highway\nimport net.mamoe.mirai.internal.network.highway.ResourceKind\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.network.protocol.data.proto.LongMsg\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgTransmit\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.MessageValidationData\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.MultiMsg\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource\nimport net.mamoe.mirai.utils.concatAsLong\nimport net.mamoe.mirai.utils.gzip\nimport net.mamoe.mirai.utils.toLongUnsigned\nimport net.mamoe.mirai.utils.use\nimport kotlin.math.absoluteValue\nimport kotlin.random.Random\n\ninternal open class MultiMsgUploader(\n    val client: QQAndroidClient,\n    val isLong: Boolean,\n    val random: Random,\n    val contact: Contact,\n    val components: ComponentStorage,\n    val senderName: String\n) {\n\n    protected open fun newUploader(): MultiMsgUploader = MultiMsgUploader(\n        client = client,\n        isLong = isLong,\n        random = random,\n        contact = contact,\n        components = components,\n        senderName = senderName\n    )\n\n    val mainMsg = mutableListOf<MsgComm.Msg>()\n    val nestedMsgs = mutableMapOf<String, MutableList<MsgComm.Msg>>()\n\n    init {\n        nestedMsgs[\"MultiMsg\"] = mainMsg\n    }\n\n    protected open fun newNid(): String {\n        var nid: String\n        do {\n            nid = \"${random.nextInt().absoluteValue}\"\n        } while (nestedMsgs.containsKey(nid))\n        return nid\n    }\n\n    open suspend fun emitMain(\n        nodes: Collection<ForwardMessage.INode>,\n    ) {\n        emit(\"MultiMsg\", nodes)\n    }\n\n    open suspend fun convertNestedForwardMessage(nestedForward: ForwardMessage, msgChain: MessageChain): MessageChain {\n        suspend fun convertByMessageOrigin(origin: MessageOrigin): MessageChain? {\n            if (origin.kind != MessageOriginKind.FORWARD) return null\n            val resId = origin.resourceId\n            if (resId != null) {\n                val nid = newNid()\n                emit(nid, nestedForward.nodeList)\n                return messageChainOf(\n                    RichMessage.forwardMessage(\n                        resId = resId,\n                        fileName = nid,\n                        forwardMessage = nestedForward,\n                    )\n                )\n            }\n            return null\n        }\n\n        suspend fun convertByReUpload(): MessageChain {\n            // Upload nested and refine to service msg\n            val nestedMMUploader = newUploader()\n            nestedMMUploader.emitMain(nestedForward.nodeList)\n\n            val resId = nestedMMUploader.uploadAndReturnResId()\n\n            val mirror = nestedMMUploader.nestedMsgs\n            mirror.remove(\"MultiMsg\")\n            nestedMsgs.putAll(mirror)\n\n            val nid = newNid()\n            nestedMsgs[nid] = nestedMMUploader.mainMsg\n            return messageChainOf(\n                RichMessage.forwardMessage(\n                    resId = resId,\n                    fileName = nid,\n                    forwardMessage = nestedForward,\n                )\n            )\n        }\n\n        msgChain.firstIsInstanceOrNull<MessageOrigin>()?.let { origin ->\n            convertByMessageOrigin(origin)?.let { return it }\n        }\n\n        return convertByReUpload()\n    }\n\n    open suspend fun emit(id: String, msgs: Collection<ForwardMessage.INode>) {\n        val nds = mutableListOf<MsgComm.Msg>().let { tmp ->\n            nestedMsgs.getOrPut(id) { tmp }\n        }\n\n        val existsIds = mutableSetOf<Long>()\n        val existsSeqs = mutableSetOf<Int>()\n\n        class PendingMessage(\n            var seq: Int, var uid: Int,\n            var convertedMessageChain: MessageChain,\n            val msg: ForwardMessage.INode,\n        )\n\n        val pendingMessages = mutableListOf<PendingMessage>()\n        var hasMsgSource = false\n\n        // Step1: Convert message & Get message ids\n        msgs.forEach { msg ->\n            var msgChain = msg.messageChain\n            msgChain[ForwardMessage]?.let { nestedForward ->\n                msgChain = convertNestedForwardMessage(nestedForward, msgChain)\n            }\n\n            msgChain = components[MessageProtocolFacade].preprocess(contact.impl(), msgChain, components)\n\n            var seq: Int = -1\n            var uid: Int = -1\n            msg.messageChain.sourceOrNull?.let { source ->\n                source as MessageSourceInternal\n                hasMsgSource = true\n\n                seq = source.sequenceIds.first()\n                uid = source.internalIds.first()\n            }\n\n            pendingMessages.add(\n                PendingMessage(\n                    seq = seq, uid = uid, convertedMessageChain = msgChain,\n                    msg = msg\n                )\n            )\n        }\n        // Step2: Fix duplicated messages\n        if (hasMsgSource) {\n            pendingMessages.forEach { pm ->\n                if (pm.seq == -1 && pm.uid == -1) return@forEach\n\n                while (true) {\n                    if (existsSeqs.add(pm.seq)) return@forEach\n\n                    pm.seq++\n                    pm.uid = random.nextInt().absoluteValue\n                }\n            }\n        }\n\n        // Step3: Fill custom messages.....\n        val randSeqStart = random.nextInt().absoluteValue.coerceAtMost(\n            Int.MAX_VALUE - pendingMessages.size - 15405\n        ).coerceAtLeast(141225)\n\n        var seqStart = if (hasMsgSource) {\n            val idx = pendingMessages.indexOfFirst { it.seq != -1 }\n            // Assertion: idx != -1\n            pendingMessages[idx].seq - idx\n        } else randSeqStart\n\n        pendingMessages.forEach { pm ->\n            if (pm.seq != -1 && pm.uid != -1) {\n                seqStart = pm.seq + 1\n            } else {\n                pm.seq = seqStart\n                seqStart++\n\n                do { // For patch: no duplicated id\n                    pm.uid = random.nextInt().absoluteValue\n                } while (!existsIds.add(pm.seq.concatAsLong(pm.uid)))\n            }\n        }\n\n        // Step4: Verify sequence\n        existsSeqs.clear()\n        var lastSeq = 0\n        var needPatch = false\n        for (pm in pendingMessages) {\n            if (pm.seq <= lastSeq) {\n                needPatch = true\n                break\n            }\n            lastSeq = pm.seq\n            if (!existsSeqs.add(lastSeq)) {\n                needPatch = true\n                break\n            }\n        }\n        // Step 5: Patch\n        if (needPatch) {\n            existsIds.clear()\n            existsSeqs.clear()\n\n            var ranSeqStart = randSeqStart\n            for (pm in pendingMessages) {\n                val oldSeq = pm.seq\n                val oldUid = pm.uid\n                pm.seq = ranSeqStart\n                ranSeqStart++\n                pm.uid = random.nextInt().absoluteValue\n\n                for (otherpms in pendingMessages) {\n                    val quoteReply = otherpms.convertedMessageChain[QuoteReply] ?: continue\n                    val srco = quoteReply.source\n                    val src = srco as? MessageSourceInternal ?: continue\n                    if (src.sequenceIds.first() == oldSeq && src.internalIds.first() == oldUid) {\n                        val newSrc = MessageSourceBuilder()\n                            .allFrom(srco)\n                            .id(pm.seq)\n                            .internalId(pm.uid)\n                            .time(srco.time)\n                            .build(botId = client.uin, kind = srco.kind)\n                        otherpms.convertedMessageChain = otherpms.convertedMessageChain + newSrc\n                    }\n                }\n            }\n        }\n\n        val isToGroup = contact is Group\n        // Step6: Convert\n        pendingMessages.forEach { pm ->\n            val msg0 = MsgComm.Msg(\n                msgHead = MsgComm.MsgHead(\n                    fromUin = pm.msg.senderId,\n                    fromNick = pm.msg.senderName,\n                    msgSeq = pm.seq,\n                    msgTime = pm.msg.time,\n                    msgUid = 0x0100000000000000L or pm.uid.toLongUnsigned(),\n                    mutiltransHead = MsgComm.MutilTransHead(\n                        status = 0,\n                        msgId = 1,\n                    ),\n                    msgType = if (isToGroup) {\n                        82 // troop\n                    } else {\n                        9 // c2c\n                    },\n                    c2cCmd = if (isToGroup) 0 else 11,\n                    groupInfo = if (isToGroup) MsgComm.GroupInfo(\n                        groupCode = contact.id,\n                        groupCard = pm.msg.senderName, // Cinnamon\n                    ) else null,\n                    isSrcMsg = false,\n                ), msgBody = ImMsgBody.MsgBody(\n                    richText = ImMsgBody.RichText(\n                        elems = MessageProtocolFacade.encode(\n                            pm.convertedMessageChain,\n                            messageTarget = contact, withGeneralFlags = false, isForward = true\n                        )\n                    )\n                )\n            )\n            nds.add(msg0)\n        }\n    }\n\n    open fun toMessageValidationData(): MessageValidationData {\n        val msgTransmit =\n            MsgTransmit.PbMultiMsgTransmit(msg = mainMsg, pbItemList = nestedMsgs.asSequence().map { (name, msgList) ->\n                MsgTransmit.PbMultiMsgItem(\n                    fileName = name,\n                    buffer = MsgTransmit.PbMultiMsgNew(msgList).toByteArray(MsgTransmit.PbMultiMsgNew.serializer())\n                )\n            }.toList())\n        val bytes = msgTransmit.toByteArray(MsgTransmit.PbMultiMsgTransmit.serializer())\n\n        return MessageValidationData(bytes.gzip())\n    }\n\n    open suspend fun uploadAndReturnResId(): String {\n        val data = toMessageValidationData()\n\n        val response = client.bot.network.sendAndExpect(\n            MultiMsg.ApplyUp.createForGroup(\n                buType = if (isLong) 1 else 2, client = client, messageData = data, dstUin = contact.uin\n            )\n        )\n\n        lateinit var resId: String\n        when (response) {\n            is MultiMsg.ApplyUp.Response.MessageTooLarge -> error(\n                \"Internal error: message is too large, but this should be handled before sending. \"\n            )\n            is MultiMsg.ApplyUp.Response.RequireUpload -> {\n                resId = response.proto.msgResid\n\n                val body = LongMsg.ReqBody(\n                    subcmd = 1, platformType = 9, termType = 5, msgUpReq = listOf(\n                        LongMsg.MsgUpReq(\n                            msgType = 3, // group\n                            dstUin = contact.uin,\n                            msgId = 0,\n                            msgUkey = response.proto.msgUkey,\n                            needCache = 0,\n                            storeType = 2,\n                            msgContent = data.data\n                        )\n                    )\n                ).toByteArray(LongMsg.ReqBody.serializer())\n\n                body.toExternalResource().use { resource ->\n                    Highway.uploadResourceBdh(\n                        bot = client.bot, resource = resource, kind = when (isLong) {\n                            true -> ResourceKind.LONG_MESSAGE\n                            false -> ResourceKind.FORWARD_MESSAGE\n                        }, commandId = 27, initialTicket = response.proto.msgSig\n                    )\n                }\n            }\n        }\n\n        return resId // this must be initialized, 'lateinit' due to IDE complaint\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/data/UnsupportedMessageImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.data\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.descriptors.SerialDescriptor\nimport kotlinx.serialization.encoding.Decoder\nimport kotlinx.serialization.encoding.Encoder\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.message.data.UnsupportedMessage\nimport net.mamoe.mirai.message.data.content\nimport net.mamoe.mirai.utils.copy\n\n@SerialName(UnsupportedMessage.SERIAL_NAME)\n@Serializable(UnsupportedMessageImpl.Serializer::class)\ninternal data class UnsupportedMessageImpl(\n    val structElem: ImMsgBody.Elem,\n) : UnsupportedMessage {\n    override val struct: ByteArray by lazy { structElem.toByteArray(ImMsgBody.Elem.serializer()) }\n    override fun toString(): String = content\n    override fun hashCode(): Int {\n        return struct.contentHashCode()\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (other === this) return true\n        if (other !is UnsupportedMessageImpl) return false\n        if (other.structElem == this.structElem) return true\n        return other.struct.contentEquals(this.struct)\n    }\n\n    object Serializer : KSerializer<UnsupportedMessageImpl> {\n        override val descriptor: SerialDescriptor =\n            UnsupportedMessage.Serializer.descriptor.copy(UnsupportedMessage.SERIAL_NAME)\n\n        override fun deserialize(decoder: Decoder): UnsupportedMessageImpl =\n            UnsupportedMessage.Serializer.deserialize(decoder) as UnsupportedMessageImpl\n\n        override fun serialize(encoder: Encoder, value: UnsupportedMessageImpl) =\n            UnsupportedMessage.Serializer.serialize(encoder, value)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/data/audio.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.data\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.copy\nimport net.mamoe.mirai.utils.isSameType\nimport net.mamoe.mirai.utils.map\n\n\n/**\n * ## Audio Implementation Overview\n *\n * ```\n *                     (api)Audio\n *                          |\n *                    /------------------\\\n *         (api)OnlineAudio        (api)OfflineAudio\n *              |                         |\n *              |                         |\n * (core)OnlineAudioImpl      (core)OfflineAudioImpl\n * ```\n *\n * - [OnlineAudioImpl]: 实现从 [ImMsgBody.Ptt] 解析\n * - [OfflineAudioImpl]: 支持用户手动构造\n *\n * ## Equality\n *\n * - [OnlineAudio] != [OfflineAudio]\n *\n * ## Converting [Audio] to [ImMsgBody.Ptt]\n *\n * Always call [Audio.toPtt]\n */\ninternal interface AudioPttSupport : MessageContent { // Audio is sealed in mirai-core-api\n    /**\n     * 原协议数据. 用于在接受到其他用户发送的语音时能按照原样发回.\n     */\n    val originalPtt: ImMsgBody.Ptt?\n}\n\n@Serializable\ninternal class AudioExtraData(\n    @ProtoNumber(1) val ptt: ImMsgBody.Ptt?,\n) : ProtoBuf {\n    fun toByteArray(): ByteArray {\n        return Wrapper(CURRENT_VERSION, this).toByteArray(Wrapper.serializer())\n    }\n\n    companion object {\n        @Serializable\n        class Wrapper(\n            @ProtoNumber(1) val version: Int,\n            @ProtoNumber(2) val v1: AudioExtraData? = null,\n        ) : ProtoBuf\n\n        private const val CURRENT_VERSION = 1\n\n\n        fun loadFrom(byteArray: ByteArray?): AudioExtraData? {\n            byteArray ?: return null\n            return kotlin.runCatching {\n                byteArray.loadAs(Wrapper.serializer()).v1 // in this version we only support v1\n            }.getOrNull()\n        }\n    }\n}\n\ninternal fun Audio.toPtt(): ImMsgBody.Ptt {\n    if (this is AudioPttSupport) {\n        this.originalPtt?.let { return it }\n    }\n    return ImMsgBody.Ptt(\n        fileName = this.filename.toByteArray(),\n        fileMd5 = this.fileMd5,\n        boolValid = true,\n        fileSize = this.fileSize.toInt(),\n        fileType = 4,\n        pbReserve = byteArrayOf(0),\n        format = this.codec.id\n    )\n}\n\n@SerialName(OnlineAudio.SERIAL_NAME)\n@Serializable(OnlineAudioImpl.Serializer::class)\ninternal class OnlineAudioImpl(\n    override val filename: String,\n    override val fileMd5: ByteArray,\n    override val fileSize: Long,\n    override val codec: AudioCodec,\n    url: String,\n    override val length: Long,\n    override val originalPtt: ImMsgBody.Ptt?,\n) : OnlineAudio, AudioPttSupport {\n    private val _url = refineUrl(url)\n\n    override val extraData: ByteArray? by lazy {\n        AudioExtraData(originalPtt).toByteArray()\n    }\n\n    override val urlForDownload: String\n        get() = _url.takeIf { it.isNotBlank() }\n            ?: throw UnsupportedOperationException(\"Could not fetch URL for audio $filename\")\n\n    private val _stringValue: String by lazy { \"[mirai:audio:${filename}]\" }\n    override fun toString(): String = _stringValue\n\n    @Suppress(\"DuplicatedCode\")\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (!isSameType(this, other)) return false\n\n        if (filename != other.filename) return false\n        if (!fileMd5.contentEquals(other.fileMd5)) return false\n        if (fileSize != other.fileSize) return false\n        if (_url != other._url) return false\n        if (codec != other.codec) return false\n        if (length != other.length) return false\n        if (originalPtt != other.originalPtt) return false\n\n        return true\n    }\n\n    override fun hashCode(): Int {\n        var result = super.hashCode()\n        result = 31 * result + filename.hashCode()\n        result = 31 * result + fileMd5.contentHashCode()\n        result = 31 * result + fileSize.hashCode()\n        result = 31 * result + _url.hashCode()\n        result = 31 * result + codec.hashCode()\n        result = 31 * result + length.hashCode()\n        result = 31 * result + originalPtt.hashCode()\n        return result\n    }\n\n\n    companion object {\n        fun refineUrl(url: String) = when {\n            url.isBlank() -> \"\"\n            url.startsWith(\"http\") -> url\n            url.startsWith(\"/\") -> \"$DOWNLOAD_URL$url\"\n            else -> \"$DOWNLOAD_URL/$url\"\n        }\n\n        @Suppress(\"HttpUrlsUsage\")\n        const val DOWNLOAD_URL = \"http://grouptalk.c2c.qq.com\"\n    }\n\n    object Serializer : KSerializer<OnlineAudioImpl> by Surrogate.serializer().map(\n        resultantDescriptor = Surrogate.serializer().descriptor,\n        deserialize = {\n            OnlineAudioImpl(\n                filename = filename,\n                fileMd5 = fileMd5,\n                fileSize = fileSize,\n                url = urlForDownload,\n                codec = codec,\n                length = length,\n                originalPtt = AudioExtraData.loadFrom(extraData)?.ptt\n            )\n        },\n        serialize = {\n            Surrogate(\n                filename = filename,\n                fileMd5 = fileMd5,\n                fileSize = fileSize,\n                urlForDownload = urlForDownload,\n                codec = codec,\n                length = length,\n                extraData = extraData\n            )\n        }\n    ) {\n        @Serializable\n        @SerialName(OnlineAudio.SERIAL_NAME)\n        private class Surrogate(\n            override val filename: String,\n            override val fileMd5: ByteArray,\n            override val fileSize: Long,\n            override val codec: AudioCodec,\n            override val length: Long,\n            override val extraData: ByteArray?,\n            override val urlForDownload: String,\n        ) : OnlineAudio {\n            override fun toString(): String {\n                return \"Surrogate(filename='$filename', fileMd5=${fileMd5.contentToString()}, fileSize=$fileSize, codec=$codec, length=$length, extraData=${extraData.contentToString()}, urlForDownload='$urlForDownload')\"\n            }\n        }\n    }\n}\n\n@SerialName(OfflineAudio.SERIAL_NAME)\n@Serializable(OfflineAudioImpl.Serializer::class)\ninternal class OfflineAudioImpl(\n    override val filename: String,\n    override val fileMd5: ByteArray,\n    override val fileSize: Long,\n    override val codec: AudioCodec,\n    override val originalPtt: ImMsgBody.Ptt?,\n) : OfflineAudio, AudioPttSupport {\n    constructor(\n        filename: String,\n        fileMd5: ByteArray,\n        fileSize: Long,\n        codec: AudioCodec,\n        extraData: ByteArray?,\n    ) : this(filename, fileMd5, fileSize, codec, AudioExtraData.loadFrom(extraData)?.ptt)\n\n    override val extraData: ByteArray? by lazy {\n        AudioExtraData(originalPtt).toByteArray()\n    }\n\n    private val _stringValue: String by lazy { \"[mirai:audio:${filename}]\" }\n    override fun toString(): String = _stringValue\n\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (!isSameType(this, other)) return false\n\n        if (filename != other.filename) return false\n        if (!fileMd5.contentEquals(other.fileMd5)) return false\n        if (fileSize != other.fileSize) return false\n        if (codec != other.codec) return false\n        if (originalPtt != other.originalPtt) return false\n        return true\n    }\n\n    override fun hashCode(): Int {\n        var result = filename.hashCode()\n        result = 31 * result + fileMd5.contentHashCode()\n        result = 31 * result + fileSize.hashCode()\n        result = 31 * result + codec.hashCode()\n        result = 31 * result + originalPtt.hashCode()\n        return result\n    }\n\n    object Serializer : KSerializer<OfflineAudioImpl> by Surrogate.serializer().map(\n        resultantDescriptor = Surrogate.serializer().descriptor,\n        deserialize = {\n            OfflineAudioImpl(\n                filename = filename,\n                fileMd5 = fileMd5,\n                fileSize = fileSize,\n                codec = codec,\n                extraData = extraData,\n            )\n        },\n        serialize = {\n            Surrogate(\n                filename = filename,\n                fileMd5 = fileMd5,\n                fileSize = fileSize,\n                codec = codec,\n                extraData = extraData,\n            )\n        }\n    ) {\n        @Serializable\n        @SerialName(OfflineAudio.SERIAL_NAME)\n        private class Surrogate(\n            override val filename: String,\n            override val fileMd5: ByteArray,\n            override val fileSize: Long,\n            override val codec: AudioCodec,\n            override val extraData: ByteArray?,\n        ) : OfflineAudio {\n            override fun toString(): String {\n                return \"OfflineAudio(filename='$filename', fileMd5=${fileMd5.contentToString()}, fileSize=$fileSize, codec=$codec, extraData=${extraData.contentToString()})\"\n            }\n        }\n    }\n}\n\n@PublishedApi\ninternal class OfflineAudioFactoryImpl : OfflineAudio.Factory {\n    override fun create(\n        filename: String,\n        fileMd5: ByteArray,\n        fileSize: Long,\n        codec: AudioCodec,\n        extraData: ByteArray?\n    ): OfflineAudio = OfflineAudioImpl(filename, fileMd5, fileSize, codec, extraData)\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/data/lightApp.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.data\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.*\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.internal.message.RefinableMessage\nimport net.mamoe.mirai.internal.message.RefineContext\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.map\nimport net.mamoe.mirai.utils.safeCast\n\ninternal data class LightAppInternal(\n    override val content: String,\n) : RichMessage, RefinableMessage {\n    companion object Key :\n        AbstractPolymorphicMessageKey<RichMessage, LightAppInternal>(RichMessage, { it.safeCast() })\n\n    override fun tryRefine(bot: Bot, context: MessageChain, refineContext: RefineContext): Message {\n        val contentJson = runCatching {\n            json.parseToJsonElement(content).jsonObject\n        }.getOrNull() ?: return LightApp(content)\n\n        val struct = contentJson.tryDeserialize() ?: return LightApp(content)\n\n        return lightRefine(struct, contentJson) ?: LightApp(content)\n    }\n\n    private fun lightRefine(struct: LightAppStruct, contentJson: JsonObject): Message? {\n\n        struct.run {\n            if (meta.music != null) {\n                MusicKind.values().find { it.appId == meta.music.appid }?.let { musicType ->\n                    meta.music.run {\n                        return MessageOrigin(\n                            LightApp(content),\n                            null,\n                            MessageOriginKind.MUSIC_SHARE\n                        ) + MusicShare(\n                            kind = musicType, title = title, summary = desc,\n                            jumpUrl = jumpUrl, pictureUrl = preview, musicUrl = musicUrl, brief = prompt\n                        )\n                    }\n                }\n            }\n        }\n\n        return null\n    }\n\n    override suspend fun refine(bot: Bot, context: MessageChain, refineContext: RefineContext): Message? {\n        val contentJson = runCatching {\n            json.parseToJsonElement(content).jsonObject\n        }.getOrNull() ?: return LightApp(content)\n\n        val struct = contentJson.tryDeserialize() ?: return LightApp(content)\n\n        if (struct.app == \"com.tencent.multimsg\") {\n            runCatching {\n                json.decodeFromJsonElement(\n                    LightAppStruct.Meta.MultiMsgDetail.serializer(),\n                    contentJson[\"meta\"]!!.jsonObject[\"detail\"]!!\n                )\n            }.onSuccess { detail ->\n                return MessageOrigin(\n                    LightApp(content),\n                    detail.resId,\n                    MessageOriginKind.FORWARD,\n                ) + ForwardMessage(\n                    preview = listOf(), // FIXME preview with LightApp\n                    title = detail.source.trim(),\n                    brief = struct.prompt.trim(),\n                    source = detail.source.trim(),\n                    summary = detail.summary.trim(),\n                    nodeList = Mirai.downloadForwardMessage(bot, detail.resId),\n                )\n            }.onFailure { err ->\n                bot.logger.warning(\"Exception when refining forward message\", err)\n            }\n        }\n\n\n        return lightRefine(struct, contentJson) ?: LightApp(content)\n    }\n}\n\nprivate val json = Json {\n    ignoreUnknownKeys = true\n    isLenient = true\n}\n\nprivate fun JsonElement.tryDeserialize(): LightAppStruct? {\n    return kotlin.runCatching {\n        json.decodeFromJsonElement(LightAppStruct.serializer(), this)\n    }.getOrNull()\n}\n\n/*\nEXAMPLE LightAppStruct for MusicShare\n\n{\n  \"app\": \"com.tencent.structmsg\",\n  \"config\": {\n    \"autosize\": true,\n    \"ctime\": 1611339208,\n    \"forward\": true,\n    \"token\": \"1f27c2b5687e0320549992a4652c8465\",\n    \"type\": \"normal\"\n  },\n  \"desc\": \"音乐\",\n  \"extra\": {\n    \"app_type\": 1,\n    \"appid\": 100495085, // NeteaseCloudMusic\n    \"uin\": 123456789 // qq uin\n  },\n  \"meta\": {\n    \"music\": {\n      \"action\": \"\",\n      \"android_pkg_name\": \"\",\n      \"app_type\": 1,\n      \"appid\": 100495085,\n      \"desc\": \"rinahamu/Yunomi\",\n      \"jumpUrl\": \"http://music.163.com/song/1338728297/?userid=324076307\",\n      \"musicUrl\": \"http://music.163.com/song/media/outer/url?id=1338728297&userid=324076307\",\n      \"preview\": \"http://p2.music.126.net/y19E5SadGUmSR8SZxkrNtw==/109951163785855539.jpg\",\n      \"sourceMsgId\": \"0\",\n      \"source_icon\": \"\",\n      \"source_url\": \"\",\n      \"tag\": \"网易云音乐\",\n      \"title\": \"ファッション\"\n    }\n  },\n  \"prompt\": \"[分享]ファッション\",\n  \"ver\": \"0.0.0.1\",\n  \"view\": \"music\"\n}\n */\n/*\nEXAMPLE LightAppStruct for ForwardMessage\n\n{\n    \"app\": \"com.tencent.multimsg\",\n    \"desc\": \"[聊天记录]\",\n    \"bizsrc\": \"\",\n    \"view\": \"contact\",\n    \"ver\": \"0.0.0.5\",\n    \"prompt\": \"[聊天记录]\",\n    \"appID\": \"\",\n    \"sourceName\": \"\",\n    \"actionData\": \"\",\n    \"actionData_A\": \"\",\n    \"sourceUrl\": \"\",\n    \"meta\": {\n        \"detail\": {\n            \"news\": [\n                {\n                    \"text\": \"纤绫·洛雨:  [动画表情]\"\n                },\n                {\n                    \"text\": \"纤绫·洛雨:  [图片]\"\n                }\n            ],\n            \"uniseq\": \"7238251206428406430\",\n            \"resid\": \"...\",\n            \"summary\": \"查看2条转发消息\",\n            \"source\": \"群聊的聊天记录\"\n        }\n    },\n    \"config\": {\n        \"round\": 1,\n        \"forward\": 1,\n        \"autosize\": 1,\n        \"type\": \"normal\",\n        \"width\": 300\n    },\n    \"text\": \"\",\n    \"sourceAd\": \"\",\n    \"extra\": \"{\\\"tsum\\\":2,\\\"filename\\\":\\\"7238251206428406430\\\"}\"\n}\n */\n\n\n@Serializable\ninternal data class LightAppStruct(\n    @SerialName(\"app\")\n    val app: String = \"\",\n    @SerialName(\"config\")\n    val config: Config = Config(),\n    @SerialName(\"desc\")\n    val desc: String = \"\",\n    // @SerialName(\"extra\")\n    // val extra: Extra = Extra(),\n    @SerialName(\"meta\")\n    val meta: Meta = Meta(),\n    @SerialName(\"prompt\")\n    val prompt: String = \"\",\n    @SerialName(\"ver\")\n    val ver: String = \"\",\n    @SerialName(\"view\")\n    val view: String = \"\",\n) {\n    @Serializable\n    data class Config(\n        @SerialName(\"autosize\")\n        @Serializable(BadBooleanSerializer::class)\n        val autosize: Boolean = false,\n        @SerialName(\"ctime\")\n        val ctime: Long = 0,\n        @SerialName(\"forward\")\n        @Serializable(BadBooleanSerializer::class)\n        val forward: Boolean = false,\n        @SerialName(\"token\")\n        val token: String = \"\",\n        @SerialName(\"type\")\n        val type: String = \"\",\n    )\n\n    @Serializable\n    data class Extra(\n        @SerialName(\"app_type\")\n        val appType: Long = 0,\n        @SerialName(\"appid\")\n        val appid: Long = 0,\n        @SerialName(\"uin\")\n        val uin: Long = 0,\n    )\n\n    @Serializable\n    data class Meta(\n        @SerialName(\"music\")\n        val music: Music? = null,\n    ) {\n        @Serializable\n        data class Music(\n            @SerialName(\"action\")\n            val action: String = \"\",\n            @SerialName(\"android_pkg_name\")\n            val androidPkgName: String = \"\",\n            @SerialName(\"app_type\")\n            val appType: Long = 0,\n            @SerialName(\"appid\")\n            val appid: Long = 0,\n            @SerialName(\"desc\")\n            val desc: String = \"\",\n            @SerialName(\"jumpUrl\")\n            val jumpUrl: String = \"\",\n            @SerialName(\"musicUrl\")\n            val musicUrl: String = \"\",\n            @SerialName(\"preview\")\n            val preview: String = \"\",\n            @SerialName(\"source_icon\")\n            val sourceIcon: String = \"\",\n            @SerialName(\"sourceMsgId\")\n            val sourceMsgId: String = \"\",\n            @SerialName(\"source_url\")\n            val sourceUrl: String = \"\",\n            @SerialName(\"tag\")\n            val tag: String = \"\",\n            @SerialName(\"title\")\n            val title: String = \"\",\n        )\n\n        @Serializable\n        data class MultiMsgDetail(\n            @SerialName(\"uniseq\")\n            val fileName: String,\n            @SerialName(\"resid\")\n            val resId: String,\n\n            @SerialName(\"summary\")\n            val summary: String = \"\",\n            @SerialName(\"source\")\n            val source: String = \"\",\n        )\n    }\n}\n\nprivate object BadBooleanSerializer : KSerializer<Boolean> by JsonPrimitive.serializer().map(\n    JsonPrimitive.serializer().descriptor,\n    deserialize = { prime ->\n        prime.booleanOrNull?.let { return@map it }\n\n        prime.intOrNull?.let { return@map it != 0 }\n\n        return@map prime.content.toBoolean()\n    },\n    serialize = { JsonPrimitive(it) }\n)\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/data/shortVideo.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.data\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.getMember\nimport net.mamoe.mirai.internal.asQQAndroidBot\nimport net.mamoe.mirai.internal.message.RefinableMessage\nimport net.mamoe.mirai.internal.message.RefineContext\nimport net.mamoe.mirai.internal.message.RefineContextKey\nimport net.mamoe.mirai.internal.message.protocol.impl.ShortVideoProtocol\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.video.PttCenterSvr\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.toUHexString\n\n/**\n * receive from pipeline and refine to [OnlineShortVideoImpl]\n */\ninternal class OnlineShortVideoMsgInternal(\n    private val videoFile: ImMsgBody.VideoFile\n) : RefinableMessage {\n\n    override fun tryRefine(bot: Bot, context: MessageChain, refineContext: RefineContext): Message? {\n        return null\n    }\n\n    override suspend fun refine(bot: Bot, context: MessageChain, refineContext: RefineContext): Message? {\n        bot.asQQAndroidBot()\n\n        val sourceKind = refineContext[RefineContextKey.MessageSourceKind] ?: return null\n        val fromId = refineContext[RefineContextKey.FromId] ?: return null\n        val groupId = refineContext[RefineContextKey.GroupIdOrZero] ?: return null\n\n        val contact = when (sourceKind) {\n            MessageSourceKind.FRIEND -> bot.getFriend(fromId) ?: error(\"Cannot find friend $fromId.\")\n            MessageSourceKind.GROUP -> bot.getGroup(groupId) ?: error(\"Cannot find group $groupId.\")\n            else -> return null // ignore processing stranger's video message\n        }\n        val sender = when (sourceKind) {\n            MessageSourceKind.FRIEND -> bot.getFriend(fromId) ?: error(\"Cannot find friend $fromId.\")\n            MessageSourceKind.GROUP -> {\n                val group = bot.getGroup(groupId) ?: error(\"Cannot find group $groupId.\")\n                group.getMember(fromId) ?: error(\"Cannot find member $fromId of group $groupId.\")\n            }\n            else -> return null // ignore processing stranger's video message\n        }\n\n        val shortVideoDownloadReq = bot.network.sendAndExpect(\n            PttCenterSvr.ShortVideoDownReq(\n                bot.client,\n                contact,\n                sender,\n                videoFile.fileUuid.decodeToString(),\n                videoFile.fileMd5\n            )\n        )\n\n        if (shortVideoDownloadReq !is PttCenterSvr.ShortVideoDownReq.Response.Success)\n            throw IllegalStateException(\"Failed to query short video download attributes.\")\n\n        if (!shortVideoDownloadReq.fileMd5.contentEquals(videoFile.fileMd5))\n            throw IllegalStateException(\n                \"Queried short video download attributes doesn't match the requests. \" +\n                        \"message provides: ${videoFile.fileMd5.toUHexString(\"\")}, \" +\n                        \"queried result: ${shortVideoDownloadReq.fileMd5.toUHexString(\"\")}\"\n            )\n\n        val format = ShortVideoProtocol.FORMAT\n            .firstOrNull { it.second == videoFile.fileFormat }?.first\n            ?: ExternalResource.DEFAULT_FORMAT_NAME\n\n        return OnlineShortVideoImpl(\n            videoFile.fileUuid.decodeToString(),\n            shortVideoDownloadReq.fileMd5,\n            videoFile.fileName.decodeToString(),\n            videoFile.fileSize.toLong(),\n            format,\n            shortVideoDownloadReq.urlV4,\n            ShortVideoThumbnail(\n                videoFile.thumbFileMd5,\n                videoFile.thumbFileSize.toLong(),\n                videoFile.thumbWidth,\n                videoFile.thumbHeight\n            )\n        )\n    }\n\n\n    override fun toString(): String {\n        return \"OnlineShortVideoMsgInternal(videoElem=$videoFile)\"\n    }\n\n    override fun contentToString(): String {\n        return \"[视频元数据]\"\n    }\n}\n\n@Serializable\ninternal data class ShortVideoThumbnail(\n    val md5: ByteArray,\n    val size: Long,\n    val width: Int?,\n    val height: Int?,\n) {\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (javaClass != other?.javaClass) return false\n\n        other as ShortVideoThumbnail\n\n        if (!md5.contentEquals(other.md5)) return false\n        if (size != other.size) return false\n        if (width != other.width) return false\n        if (height != other.height) return false\n\n        return true\n    }\n\n    override fun hashCode(): Int {\n        var result = md5.contentHashCode()\n        result = 31 * result + size.hashCode()\n        result = 31 * result + (width ?: 0)\n        result = 31 * result + (height ?: 0)\n        return result\n    }\n}\n\ninternal abstract class AbstractShortVideoWithThumbnail : ShortVideo {\n    abstract val thumbnail: ShortVideoThumbnail\n}\n\n@Suppress(\"DuplicatedCode\")\n@SerialName(OnlineShortVideo.SERIAL_NAME)\n@Serializable\ninternal class OnlineShortVideoImpl(\n    override val videoId: String,\n    override val fileMd5: ByteArray,\n    override val filename: String,\n    override val fileSize: Long,\n    override val fileFormat: String,\n    override val urlForDownload: String,\n    override val thumbnail: ShortVideoThumbnail\n) : OnlineShortVideo, AbstractShortVideoWithThumbnail() {\n\n    override fun toString(): String {\n        return \"[mirai:shortvideo:$videoId, videoName=$filename.$fileFormat, videoMd5=${fileMd5.toUHexString(\"\")}, \" +\n                \"videoSize=${fileSize}, thumbnailMd5=${thumbnail.md5.toUHexString(\"\")}, thumbnailSize=${thumbnail.size}]\"\n    }\n\n    override fun contentToString(): String {\n        return \"[视频]\"\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (javaClass != other?.javaClass) return false\n\n        other as OnlineShortVideoImpl\n\n        if (videoId != other.videoId) return false\n        if (!fileMd5.contentEquals(other.fileMd5)) return false\n        if (filename != other.filename) return false\n        if (fileSize != other.fileSize) return false\n        if (fileFormat != other.fileFormat) return false\n        if (urlForDownload != other.urlForDownload) return false\n        if (thumbnail != other.thumbnail) return false\n\n        return true\n    }\n\n    override fun hashCode(): Int {\n        var result = videoId.hashCode()\n        result = 31 * result + fileMd5.contentHashCode()\n        result = 31 * result + filename.hashCode()\n        result = 31 * result + fileSize.hashCode()\n        result = 31 * result + fileFormat.hashCode()\n        result = 31 * result + urlForDownload.hashCode()\n        result = 31 * result + thumbnail.hashCode()\n        return result\n    }\n}\n\n@Serializable\ninternal class OfflineShortVideoImpl(\n    override val videoId: String,\n    override val filename: String,\n    override val fileMd5: ByteArray,\n    override val fileSize: Long,\n    override val fileFormat: String,\n    override val thumbnail: ShortVideoThumbnail\n) : OfflineShortVideo, AbstractShortVideoWithThumbnail() {\n\n    /**\n     * offline short video uses\n     */\n    override fun toString(): String {\n        return \"[mirai:shortvideo:$videoId, videoName=$filename.$fileFormat, videoMd5=${fileMd5.toUHexString(\"\")}, \" +\n                \"videoSize=${fileSize}, thumbnailMd5=${thumbnail.md5.toUHexString(\"\")}, thumbnailSize=${thumbnail.size}]\"\n    }\n\n    override fun contentToString(): String {\n        return \"[视频]\"\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (javaClass != other?.javaClass) return false\n\n        other as OfflineShortVideoImpl\n\n        if (videoId != other.videoId) return false\n        if (filename != other.filename) return false\n        if (!fileMd5.contentEquals(other.fileMd5)) return false\n        if (fileSize != other.fileSize) return false\n        if (fileFormat != other.fileFormat) return false\n        if (thumbnail != other.thumbnail) return false\n\n        return true\n    }\n\n    override fun hashCode(): Int {\n        var result = videoId.hashCode()\n        result = 31 * result + filename.hashCode()\n        result = 31 * result + fileMd5.contentHashCode()\n        result = 31 * result + fileSize.hashCode()\n        result = 31 * result + fileFormat.hashCode()\n        result = 31 * result + thumbnail.hashCode()\n        return result\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/faceImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/flags/InternalFlagOnlyMessage.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.internal.message.flags\n\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.internal.message.visitor.ex\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.safeCast\n\n/**\n * Ignore on transformation\n */\ninternal sealed interface InternalFlagOnlyMessage : MessageMetadata\n\ninternal sealed interface ForceAs : InternalFlagOnlyMessage, ConstrainSingle {\n    companion object Key : AbstractMessageKey<ForceAs>({ it.safeCast() })\n}\n\n/**\n * 内部 flag, 放入 chain 强制作为 long 发送\n */\ninternal object ForceAsLongMessage : ForceAs,\n    AbstractPolymorphicMessageKey<ForceAs, ForceAsLongMessage>(ForceAs, { it.safeCast() }) {\n    override val key: MessageKey<ForceAsLongMessage> get() = this\n\n    override fun toString(): String = \"\"\n\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.ex()?.visitForceAsLongMessage(this, data) ?: super.accept(visitor, data)\n    }\n}\n\n/**\n * 内部 flag, 放入 chain 强制作为 fragmented 发送\n */\ninternal object ForceAsFragmentedMessage : ForceAs,\n    AbstractPolymorphicMessageKey<ForceAs, ForceAsFragmentedMessage>(ForceAs, { it.safeCast() }) {\n    override val key: MessageKey<ForceAsFragmentedMessage> get() = this\n\n    override fun toString(): String = \"\"\n\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.ex()?.visitForceAsFragmentedMessage(this, data) ?: super.accept(visitor, data)\n    }\n}\n\n/**\n * 强制不发 long\n */\ninternal object DontAsLongMessage : MessageMetadata, ConstrainSingle, InternalFlagOnlyMessage,\n    AbstractMessageKey<DontAsLongMessage>({ it.safeCast() }) {\n    override val key: MessageKey<DontAsLongMessage> get() = this\n\n    override fun toString(): String = \"\"\n\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.ex()?.visitDontAsLongMessage(this, data) ?: super<InternalFlagOnlyMessage>.accept(visitor, data)\n    }\n}\n\ninternal object IgnoreLengthCheck : MessageMetadata, ConstrainSingle, InternalFlagOnlyMessage,\n    AbstractMessageKey<IgnoreLengthCheck>({ it.safeCast() }) {\n    override val key: MessageKey<IgnoreLengthCheck> get() = this\n\n    override fun toString(): String = \"\"\n\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.ex()?.visitIgnoreLengthCheck(this, data) ?: super<InternalFlagOnlyMessage>.accept(visitor, data)\n    }\n}\n\n/**\n * Skip broadcasting events. Used for [Contact.sendMessage]\n */\ninternal sealed interface SkipEventBroadcast : MessageMetadata, ConstrainSingle, InternalFlagOnlyMessage {\n    override val key: MessageKey<SkipEventBroadcast> get() = Companion\n\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.ex()?.visitSkipEventBroadcast(this, data) ?: super<InternalFlagOnlyMessage>.accept(\n            visitor,\n            data\n        )\n    }\n\n    companion object : AbstractMessageKey<SkipEventBroadcast>({ it.safeCast() }), SkipEventBroadcast {\n        // instance\n\n        override fun toString(): String = \"\"\n    }\n}\n\ninternal sealed interface AllowSendFileMessage : MessageMetadata, ConstrainSingle, InternalFlagOnlyMessage,\n    SkipEventBroadcast {\n    override val key: MessageKey<AllowSendFileMessage> get() = Companion\n\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.ex()?.visitAllowSendFileMessage(this, data) ?: super<InternalFlagOnlyMessage>.accept(\n            visitor,\n            data\n        )\n    }\n\n    companion object : AbstractMessageKey<AllowSendFileMessage>({ it.safeCast() }), AllowSendFileMessage {\n        override fun toString(): String = \"\"\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/image/AbstractImage.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.image\n\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.utils.MiraiLogger\n\n/**\n * 所有 [Image] 实现的基类.\n */\n// moved from mirai-core-api since 2.11\ninternal sealed class AbstractImage : Image {\n    private val _stringValue: String? by lazy(LazyThreadSafetyMode.NONE) { \"[mirai:image:$imageId, width=$width, height=$height, size=$size, type=$imageType, isEmoji=$isEmoji]\" }\n\n    override val size: Long\n        get() = 0L\n    override val width: Int\n        get() = 0\n    override val height: Int\n        get() = 0\n\n    final override fun toString(): String = _stringValue!!\n    final override fun contentToString(): String = if (isEmoji) {\n        \"[动画表情]\"\n    } else {\n        \"[图片]\"\n    }\n\n    override fun appendMiraiCodeTo(builder: StringBuilder) {\n        builder.append(\"[mirai:image:\").append(imageId).append(\"]\")\n    }\n\n    final override fun hashCode(): Int = imageId.hashCode()\n    final override fun equals(other: Any?): Boolean {\n        if (other === this) return true\n        if (other !is Image) return false\n        return this.imageId == other.imageId &&\n                this.width == other.width &&\n                this.height == other.height &&\n                this.isEmoji == other.isEmoji &&\n                this.imageType == other.imageType &&\n                this.size == other.size\n    }\n}\n\n/**\n * 好友图片\n *\n * [imageId] 形如 `/f8f1ab55-bf8e-4236-b55e-955848d7069f` (37 长度)  或 `/000000000-3814297509-BFB7027B9354B8F899A062061D74E206` (54 长度)\n */\n// NotOnlineImage\n// moved from mirai-core-api since 2.11\ninternal sealed class FriendImage : AbstractImage()\n\n/**\n * 群图片.\n *\n * @property imageId 形如 `{01E9451B-70ED-EAE3-B37C-101F1EEBF5B5}.ext` (ext系扩展名)\n * @see Image 查看更多说明\n */\n// CustomFace\n// moved from mirai-core-api since 2.11\ninternal sealed class GroupImage : AbstractImage()\n\n// NT Image\ninternal sealed class NewTechImage : AbstractImage()\n\nprivate val imageLogger: MiraiLogger by lazy { MiraiLogger.Factory.create(Image::class, \"Image\") }\ninternal val Image.Key.logger get() = imageLogger"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/image/ImageDecoder.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.image\n\nimport io.ktor.utils.io.core.*\nimport io.ktor.utils.io.errors.*\nimport net.mamoe.mirai.message.data.ImageType\nimport net.mamoe.mirai.utils.*\n\n//SOF0-SOF3 SOF5-SOF7 SOF9-SOF11 SOF13-SOF15 Segment\n// (0xC4, 0xC8 and 0xCC not included due to is not an SOF)\nprivate val JPG_SOF_RANGE = listOf(\n    0xC0..0xC3,\n    0xC5..0xC7,\n    0xC9..0xCB,\n    0xCD..0xCF\n)\n\n// https://docs.fileformat.com/image/jpeg/\n// http://www.vip.sugovica.hu/Sardi/kepnezo/JPEG%20File%20Layout%20and%20Format.htm\nprivate fun Input.getJPGImageInfo(): ImageInfo {\n    require(readBytes(2).contentEquals(byteArrayOf(0xFF.toByte(), 0xD8.toByte()))) {\n        \"It's not a valid jpg file\"\n    }\n    //0xFF Segment Start\n    while (readByte() == 0xFF.toByte()) {\n        val type = readByte().toIntUnsigned()\n        //Find SOF\n        if (JPG_SOF_RANGE.any { it.contains(type) }) {\n            //Length\n            discardExact(2)\n            //Data precision\n            discardExact(1)\n            val height = readShort().toInt()\n            val width = readShort().toInt()\n            return ImageInfo(width = width, height = height, imageType = ImageType.JPG)\n        } else {\n            when (type) {\n                //SOS Segment, header is ended\n                0xDA -> break\n                //0x00 (Byte alignment) and 0x01 (TEM)\n                in 0x00..0x01 -> continue\n                //RST[0-7] no length and content, skip\n                in 0xD0..0xD7 -> continue\n                //Normal segment, Skipped size=Segment Length - 2 (Length data itself)\n                else -> discardExact(readShort().toIntUnsigned() - 2)\n            }\n        }\n    }\n    throw IllegalArgumentException(\"It's not a valid jpg file, failed to find an SOF segment\")\n}\n\nprivate fun Input.getBMPImageInfo(): ImageInfo {\n    require(readString(2) == \"BM\") {\n        \"It's not a valid bmp file\"\n    }\n    //==========\n    //FILE HEADER\n    //==========\n    //Size\n    discardExact(4)\n    //Reserve 2*2bytes\n    discardExact(4)\n    //Offset for image data\n    discardExact(4)\n    //==========\n    //INFO HEADER\n    //==========\n    //Size\n    discardExact(4)\n    return ImageInfo(\n        width = readIntLittleEndian(),\n        height = readIntLittleEndian(),\n        imageType = ImageType.BMP\n    )\n}\n\nprivate fun Input.getPNGImageInfo(): ImageInfo {\n    require(\n        readBytes(8).contentEquals(\n            byteArrayOf(\n                0x89.toByte(),\n                0x50,\n                0x4e,\n                0x47,\n                0x0d,\n                0x0a,\n                0x1a,\n                0x0a\n            )\n        )\n    ) {\n        \"It's not a valid png file\"\n    }\n    //Chunk length\n    discardExact(4)\n    //Chunk type\n    var type = readString(4)\n    //First chunk must be IHDR\n    require(type == \"IHDR\") {\n        \"It's not a valid png file, First chunk must be IHDR\"\n    }\n    val width = readInt()\n    val height = readInt()\n    //Skip to next chunk\n    //Bit depth (1 byte) + color type (1 byte)\n    // + compression method (1 byte) + filter method (1 byte)\n    // + interlace method (1 byte) + CRC(4 bytes) = 9 bytes\n    discardExact(9)\n\n    //Chunk length\n    discardExact(4)\n    //Chunk type\n    type = readString(4)\n\n    return ImageInfo(\n        width = width,\n        height = height,\n        //Correct the image type\n        //If is apng, it has to be an acTL chunk\n        imageType = if (type == \"acTL\") {\n            ImageType.APNG\n        } else {\n            ImageType.PNG\n        }\n    )\n}\n\nprivate fun Input.getGIFImageInfo(): ImageInfo {\n\n    require(readString(6).run { startsWith(\"GIF\") && endsWith(\"a\") }) {\n        \"It's not a valid gif file\"\n    }\n    return ImageInfo(\n        width = readShortLittleEndian().toInt(),\n        height = readShortLittleEndian().toInt(),\n        imageType = ImageType.GIF\n    )\n}\n\n@Throws(IOException::class, IllegalArgumentException::class)\ninternal fun ExternalResource.calculateImageInfo(): ImageInfo {\n    //Preload\n    val imageType = ImageType.match(formatName)\n    return input().withUse {\n        when (imageType) {\n            ImageType.JPG -> getJPGImageInfo()\n            ImageType.BMP -> getBMPImageInfo()\n            ImageType.GIF -> getGIFImageInfo()\n            ImageType.PNG, ImageType.APNG -> getPNGImageInfo()\n            else -> {\n                throw IllegalArgumentException(\n                    \"Unsupported image type (${formatName}) for ExternalResource ${this@calculateImageInfo}, \" +\n                            \"considering use gif/png/bmp/jpg format. \" +\n                            \"image header: ${readBytesOf(max = 30).toUHexString()}\"\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/image/ImageInfo.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.image\n\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.message.data.ImageType\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.systemProp\n\n\ninternal data class ImageInfo(val width: Int = 0, val height: Int = 0, val imageType: ImageType = ImageType.UNKNOWN)\n\n\n/*\n * ImgType:\n *  JPG:    1000\n *  PNG:    1001\n *  WEBP:   1002\n *  BMP:    1005\n *  GIG:    2000 // gig? gif?\n *  APNG:   2001\n *  SHARPP: 1004\n */\n\ninternal val UNKNOWN_IMAGE_TYPE_PROMPT_ENABLED = systemProp(\"mirai.unknown.image.type.logging\", false)\n\ninternal fun getImageTypeById(id: Int): ImageType? {\n    return if (id == 2001) {\n        ImageType.APNG\n    } else {\n        ImageType.matchOrNull(getImageType(id))\n    }\n}\n\ninternal fun getIdByImageType(imageType: ImageType): Int {\n    return when (imageType) {\n        ImageType.JPG -> 1000\n        ImageType.PNG -> 1001\n        //ImageType.WEBP -> 1002 //Unsupported by pc client\n        ImageType.BMP -> 1005\n        ImageType.GIF -> 2000\n        ImageType.APNG -> 2001\n        //default to jpg\n        else -> 1000\n    }\n}\n\ninternal fun getImageType(id: Int): String {\n    return when (id) {\n        1000 -> \"jpg\"\n        1001 -> \"png\"\n        //1002 -> \"webp\" //Unsupported by pc client\n        1005 -> \"bmp\"\n        2000, 3, 4 -> \"gif\"\n        //apng\n        2001 -> \"png\"\n        else -> {\n            if (UNKNOWN_IMAGE_TYPE_PROMPT_ENABLED) {\n                Image.logger.debug(\n                    \"Unknown image id: $id. Stacktrace:\",\n                    Exception()\n                )\n            }\n            ExternalResource.DEFAULT_FORMAT_NAME\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/image/ImageUrlAware.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.image\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.message.data.Image\n\ninternal sealed interface ImageUrlAware : Image\n\ninternal interface ConstOriginUrlAware : ImageUrlAware {\n    val originUrl: String\n}\n\ninternal interface DeferredOriginUrlAware : ImageUrlAware {\n    fun getUrl(bot: Bot): String\n}\n\ninternal interface SuspendDeferredOriginUrlAware : ImageUrlAware {\n    suspend fun getUrl(bot: Bot): String\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/image/InternalImageProtocolImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.image\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.User\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.asQQAndroidBot\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Cmd0x352\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.image.ImgStore\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.image.LongConn\nimport net.mamoe.mirai.internal.utils.ImagePatcher\nimport net.mamoe.mirai.internal.utils.withCache\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.message.data.ImageType\nimport net.mamoe.mirai.message.data.InternalImageProtocol\nimport net.mamoe.mirai.utils.cast\nimport net.mamoe.mirai.utils.toUHexString\n\ninternal class InternalImageProtocolImpl : InternalImageProtocol {\n\n    /**\n     * Test Notes:\n     *\n     * - 查图片只需要 md5 和 size\n     * - 上传给群的图片可以通过 GroupPicUp(groupCode=user.id) 或 OffPicUp(dstUin=user.id) 查询\n     * - 上传给好友的图片可以通过 GroupPicUp(groupCode=group.id) 或 OffPicUp(dstUin=group.id) 查询\n     */\n    interface ImageUploadedChecker<C : Contact?> {\n        suspend fun isUploaded(\n            bot: QQAndroidBot,\n            context: C,\n            md5: ByteArray,\n            type: ImageType,\n            size: Long,\n            width: Int,\n            height: Int\n        ): Boolean\n\n        companion object {\n            val checkers = mapOf(\n                Group::class to ImageUploadedCheckerGroup(),\n                User::class to ImageUploadedCheckerUser(),\n                null to ImageUploadedCheckerFallback()\n            )\n        }\n    }\n\n    class ImageUploadedCheckerGroup : ImageUploadedChecker<Group> {\n        override suspend fun isUploaded(\n            bot: QQAndroidBot,\n            context: Group,\n            md5: ByteArray,\n            type: ImageType,\n            size: Long,\n            width: Int,\n            height: Int\n        ): Boolean {\n            val response: ImgStore.GroupPicUp.Response = bot.network.sendAndExpect(\n                ImgStore.GroupPicUp(\n                    bot.client,\n                    uin = bot.id,\n                    groupCode = context.id,\n                    md5 = md5,\n                    size = size,\n                    filename = \"${md5.toUHexString(\"\")}.${type.formatName}\",\n                    picWidth = width,\n                    picHeight = height,\n                    picType = getIdByImageType(type),\n                )\n            )\n\n            return response is ImgStore.GroupPicUp.Response.FileExists\n        }\n    }\n\n    class ImageUploadedCheckerUser : ImageUploadedChecker<User> {\n        override suspend fun isUploaded(\n            bot: QQAndroidBot,\n            context: User,\n            md5: ByteArray,\n            type: ImageType,\n            size: Long,\n            width: Int,\n            height: Int\n        ): Boolean {\n            val resp = bot.network.sendAndExpect(\n                LongConn.OffPicUp(\n                    bot.client,\n                    Cmd0x352.TryUpImgReq(\n                        buType = 1,\n                        srcUin = bot.id,\n                        dstUin = context.id,\n                        fileMd5 = md5,\n                        fileSize = size,\n                        imgWidth = width,\n                        imgHeight = height,\n                        imgType = getIdByImageType(type),\n                        fileName = \"${md5.toUHexString(\"\")}.${type.formatName}\",\n                        //For gif, using not original\n                        imgOriginal = (type != ImageType.GIF),\n                        buildVer = bot.client.buildVer,\n                    ),\n                )\n            )\n\n            return resp is LongConn.OffPicUp.Response.FileExists\n        }\n    }\n\n    class ImageUploadedCheckerFallback : ImageUploadedChecker<Nothing?> {\n        override suspend fun isUploaded(\n            bot: QQAndroidBot,\n            context: Nothing?,\n            md5: ByteArray,\n            type: ImageType,\n            size: Long,\n            width: Int,\n            height: Int\n        ): Boolean {\n            val response: ImgStore.GroupPicUp.Response = bot.network.sendAndExpect(\n                ImgStore.GroupPicUp(\n                    bot.client,\n                    uin = bot.id,\n                    groupCode = 1,\n                    md5 = md5,\n                    size = size,\n                    filename = \"${md5.toUHexString(\"\")}.${type.formatName}\",\n                    picWidth = width,\n                    picHeight = height,\n                    picType = getIdByImageType(type),\n                )\n            )\n\n            return response is ImgStore.GroupPicUp.Response.FileExists\n        }\n    }\n\n    fun findExistImageByCache(imageId: String): Image? {\n        Bot.instancesSequence.forEach { existsBot ->\n            runCatching {\n                val patcher = existsBot.asQQAndroidBot().components[ImagePatcher]\n\n                patcher.findCacheByImageId(imageId)?.withCache { cache ->\n                    val rsp = cache.cacheOGI.value0\n                    if (rsp != null) return rsp\n                }\n            }\n        }\n        return null\n    }\n\n    override fun createImage(\n        imageId: String,\n        size: Long,\n        type: ImageType,\n        width: Int,\n        height: Int,\n        isEmoji: Boolean\n    ): Image {\n        return when {\n            imageId matches Image.IMAGE_ID_REGEX -> {\n                if (size == 0L && width == 0 && height == 0) {\n                    findExistImageByCache(imageId)?.let { return it }\n                }\n                OfflineGroupImage(imageId, width, height, size, type, isEmoji)\n            }\n            imageId matches Image.IMAGE_RESOURCE_ID_REGEX_1 -> {\n                OfflineFriendImage(imageId, width, height, size, type, isEmoji)\n            }\n            imageId matches Image.IMAGE_RESOURCE_ID_REGEX_2 -> {\n                OfflineFriendImage(imageId, width, height, size, type, isEmoji)\n            }\n            else ->\n                @Suppress(\"INVISIBLE_MEMBER\")\n                throw IllegalArgumentException(\"Illegal imageId: $imageId. ${net.mamoe.mirai.message.data.ILLEGAL_IMAGE_ID_EXCEPTION_MESSAGE}\")\n        }\n    }\n\n    override suspend fun isUploaded(\n        bot: Bot,\n        md5: ByteArray,\n        size: Long,\n        context: Contact?,\n        type: ImageType,\n        width: Int,\n        height: Int\n    ): Boolean {\n        val checker = findChecker(context) ?: return false\n        checker.cast<ImageUploadedChecker<Contact?>>()\n        return checker.isUploaded(bot.asQQAndroidBot(), context.cast<Contact?>(), md5, type, size, width, height)\n    }\n\n    fun findChecker(context: Contact?) = ImageUploadedChecker.checkers.asSequence()\n        .find { bothNull(it.key, context) || it.key?.isInstance(context) == true }?.value\n\n    private fun bothNull(a: Any?, b: Any?) = a == null && b == null\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/image/InternalShortVideoProtocolImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.image\n\nimport net.mamoe.mirai.internal.message.data.OfflineShortVideoImpl\nimport net.mamoe.mirai.internal.message.data.ShortVideoThumbnail\nimport net.mamoe.mirai.message.data.InternalShortVideoProtocol\nimport net.mamoe.mirai.message.data.OfflineShortVideo\n\ninternal class InternalShortVideoProtocolImpl : InternalShortVideoProtocol {\n    override fun createOfflineShortVideo(\n        videoId: String,\n        fileMd5: ByteArray,\n        fileSize: Long,\n        fileFormat: String,\n        fileName: String,\n        thumbnailMd5: ByteArray,\n        thumbnailSize: Long\n    ): OfflineShortVideo {\n        return OfflineShortVideoImpl(\n            videoId,\n            fileName,\n            fileMd5,\n            fileSize,\n            fileFormat,\n            ShortVideoThumbnail(\n                thumbnailMd5,\n                thumbnailSize,\n                0,\n                0\n            )\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/image/OfflineImage.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.image\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.Transient\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.message.data.ImageType\n\n/**\n * 离线的图片, 即为客户端主动上传到服务器而获得的 [Image] 实例.\n * 不能直接获取它在服务器上的链接. 需要通过 [IMirai.queryImageUrl] 查询\n *\n * 一般由 [Contact.uploadImage] 得到\n */\ninternal sealed interface OfflineImage : Image\n\n/**\n * 通过 [Group.uploadImage] 上传得到的 [GroupImage]. 它的链接需要查询 [IMirai.queryImageUrl]\n *\n * @param imageId 参考 [Image.imageId]\n */\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(with = OfflineFriendImage.Serializer::class)\ninternal data class OfflineFriendImage(\n    override val imageId: String,\n    override val width: Int = 0,\n    override val height: Int = 0,\n    override val size: Long = 0L,\n    override val imageType: ImageType = ImageType.UNKNOWN,\n    override val isEmoji: Boolean = false,\n) : FriendImage(), OfflineImage, DeferredOriginUrlAware {\n    object Serializer : Image.FallbackSerializer(\"OfflineFriendImage\")\n\n    override fun getUrl(bot: Bot): String {\n        return \"http://c2cpicdw.qpic.cn/offpic_new/${bot.id}${this.friendImageId}/0?term=2\"\n    }\n}\n\n/**\n * @param imageId 参考 [Image.imageId]\n */\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(with = OfflineGroupImage.Serializer::class)\ninternal data class OfflineGroupImage(\n    override val imageId: String,\n    override val width: Int = 0,\n    override val height: Int = 0,\n    override val size: Long = 0L,\n    override val imageType: ImageType = ImageType.UNKNOWN,\n    override val isEmoji: Boolean = false,\n) : GroupImage(), OfflineImage, DeferredOriginUrlAware {\n    @Transient\n    internal var fileId: Int? = null\n\n    object Serializer : Image.FallbackSerializer(\"OfflineGroupImage\")\n\n    override fun getUrl(bot: Bot): String {\n        return \"http://gchat.qpic.cn/gchatpic_new/${bot.id}/0-0-${\n            imageId.substring(1..36)\n                .replace(\"-\", \"\")\n        }/0?term=2\"\n    }\n\n    init {\n        @Suppress(\"DEPRECATION\")\n        require(imageId matches Image.IMAGE_ID_REGEX) {\n            \"Illegal imageId. It must matches GROUP_IMAGE_ID_REGEX\"\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/image/OnlineImage.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.image\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.message.contextualBugReportException\nimport net.mamoe.mirai.internal.network.protocol.data.proto.CustomFaceExtPb\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImgExtPbResvAttrCommon\nimport net.mamoe.mirai.internal.network.protocol.data.proto.NotOnlineImageExtPb\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.message.data.ImageType\nimport net.mamoe.mirai.utils.generateImageId\nimport net.mamoe.mirai.utils.generateImageIdFromResourceId\nimport net.mamoe.mirai.utils.hexToBytes\nimport net.mamoe.mirai.utils.structureToString\n\ninternal sealed interface OnlineImage : Image, ConstOriginUrlAware {\n    override val originUrl: String\n}\n\n/**\n * 接收消息时获取到的 [FriendImage]. 它可以直接获取下载链接 [originUrl]\n */\ninternal sealed class OnlineFriendImage : FriendImage(), OnlineImage\n\n\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(with = OnlineFriendImageImpl.Serializer::class)\ninternal class OnlineFriendImageImpl(\n    internal val delegate: ImMsgBody.NotOnlineImage,\n) : @Suppress(\"DEPRECATION\")\nOnlineFriendImage() {\n    object Serializer : Image.FallbackSerializer(\"OnlineFriendImage\")\n\n    override val size: Long get() = delegate.fileLen\n    override val width: Int\n        get() = delegate.picWidth\n    override val height: Int\n        get() = delegate.picHeight\n    override val imageType: ImageType\n        get() = OnlineImageIds.speculateImageType(delegate.filePath, delegate.imgType)\n    override val imageId: String = kotlin.run {\n        val imageType = imageType.formatName\n        generateImageIdFromResourceId(delegate.resId, imageType)\n            ?: kotlin.run {\n                if (delegate.picMd5.size == 16) generateImageId(delegate.picMd5, imageType)\n                else {\n                    Image.logger.warning(\n                        contextualBugReportException(\n                            \"Failed to compute friend imageId: resId=${delegate.resId}\",\n                            delegate.structureToString(),\n                            additional = \"并描述此时 Bot 是否正在从好友或群接受消息, 尽量附加该图片原文件\"\n                        )\n                    )\n                    delegate.resId\n                }\n            }\n    }\n\n    override val originUrl: String\n        get() = if (delegate.origUrl.isNotBlank()) {\n            \"http://c2cpicdw.qpic.cn\" + this.delegate.origUrl\n        } else if (delegate.resId.isNotEmpty() && delegate.resId[0] == '{') {\n            // https://github.com/mamoe/mirai/issues/1600\n            gchatImageUrlByImageId(imageId)\n        } else {\n            \"http://c2cpicdw.qpic.cn/offpic_new/0/\" + delegate.resId + \"/0?term=2\"\n        }\n\n    override val isEmoji: Boolean by lazy {\n        delegate.pbReserve.pbImageResv_checkIsEmoji(NotOnlineImageExtPb.ResvAttr.serializer())\n    }\n}\n\n\nprivate fun gchatImageUrlByImageId(imageId: String) =\n    \"http://gchat.qpic.cn/gchatpic_new/0/0-0-${\n        imageId.substring(1..36)\n            .replace(\"-\", \"\")\n    }/0?term=2\"\n\n\nprivate fun <T : ImgExtPbResvAttrCommon> ByteArray.pbImageResv_checkIsEmoji(serializer: KSerializer<T>): Boolean {\n    val data = this\n    return kotlin.runCatching {\n        data.takeIf { it.isNotEmpty() }?.loadAs(serializer)?.let { ext ->\n            ext.imageBizType == 1 || ext.textSummary.decodeToString() == \"[动画表情]\"\n        }\n    }.getOrNull() ?: false\n}\n\n/**\n * 接收消息时获取到的 [GroupImage]. 它可以直接获取下载链接 [originUrl]\n */\n@Suppress(\"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\")\ninternal sealed class OnlineGroupImage : GroupImage(), OnlineImage\n\n\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(with = OnlineGroupImageImpl.Serializer::class)\ninternal class OnlineGroupImageImpl(\n    internal val delegate: ImMsgBody.CustomFace,\n) : OnlineGroupImage() {\n    object Serializer : Image.FallbackSerializer(\"OnlineGroupImage\")\n\n    override val size: Long get() = delegate.size.toLong()\n    override val width: Int\n        get() = delegate.width\n    override val height: Int\n        get() = delegate.height\n    override val imageType: ImageType\n        get() = OnlineImageIds.speculateImageType(delegate.filePath, delegate.imageType)\n\n    override val imageId: String = generateImageId(\n        delegate.picMd5,\n        OnlineImageIds.speculateImageTypeNameFromFilePath(delegate.filePath)\n    ).takeIf {\n        Image.IMAGE_ID_REGEX.matches(it)\n    } ?: generateImageId(delegate.picMd5)\n\n    override val originUrl: String\n        get() = if (delegate.origUrl.isBlank()) {\n            gchatImageUrlByImageId(imageId)\n        } else \"http://gchat.qpic.cn\" + delegate.origUrl\n\n    override val isEmoji: Boolean by lazy {\n        delegate.pbReserve.pbImageResv_checkIsEmoji(CustomFaceExtPb.ResvAttr.serializer())\n    }\n}\n\n@Suppress(\"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\")\ninternal sealed class OnlineNewTechImage : NewTechImage(), OnlineImage\n\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(with = OnlineNewTechImageImpl.Serializer::class)\ninternal class OnlineNewTechImageImpl(\n    internal val commonElem: ImMsgBody.CommonElem,\n) : OnlineNewTechImage() {\n\n    private val delegate = commonElem.pbElem.loadAs(ImMsgBody.NewTechImageInfo.serializer())\n\n    object Serializer : Image.FallbackSerializer(\"OnlineNewTechImage\")\n\n    override val md5 = delegate.info.msgInfo.imageInfo.md5.hexToBytes()\n\n    private val senderMeta = delegate.meta.main.friendMeta ?: delegate.meta.main.groupMeta!!\n    override val size: Long get() = delegate.info.msgInfo.imageInfo.size\n    override val width: Int\n        get() = delegate.info.msgInfo.imageInfo.imageWidth\n    override val height: Int\n        get() = delegate.info.msgInfo.imageInfo.imageHeight\n    override val imageType: ImageType\n        get() = OnlineImageIds.speculateImageType(\n            delegate.info.msgInfo.imageInfo.filePath,\n            delegate.info.msgInfo.imageInfo.imageType.type\n        )\n\n    override val imageId: String = generateImageId(\n        md5,\n        OnlineImageIds.speculateImageTypeNameFromFilePath(delegate.info.msgInfo.imageInfo.filePath)\n    ).takeIf {\n        Image.IMAGE_ID_REGEX.matches(it)\n    } ?: generateImageId(md5)\n\n    override val originUrl: String\n        get() = if (senderMeta.origUrl.isBlank()) {\n            gchatImageUrlByImageId(imageId)\n        } else \"http://\" + delegate.info.noKeyDownloadInfo.domain + \"/download?appid=1407&fileid=\" + delegate.info.msgInfo.fileId + senderMeta.origUrl\n\n    override val isEmoji: Boolean by lazy {\n        delegate.meta.main.isEmoji == 1 || delegate.meta.main.displayStr == \"[动画表情]\"\n\n    }\n}\n\nprivate object OnlineImageIds {\n\n    fun speculateImageType(filePath: String, imageTypeInt: Int): ImageType {\n        return getImageTypeById(imageTypeInt) ?: speculateImageTypeFromImageId(filePath) ?: ImageType.UNKNOWN\n    }\n\n    fun speculateImageTypeFromImageId(filePathOrImageId: String): ImageType? {\n        return speculateImageTypeNameFromFilePath(filePathOrImageId)?.let { ImageType.matchOrNull(it) }\n    }\n\n    /**\n     * @param filePath should ends with `.type`\n     */\n    fun speculateImageTypeNameFromFilePath(filePath: String): String? {\n        return filePath.substringAfterLast('.').lowercase().let { ext ->\n            if (ext == \"null\") {\n                // official clients might send `null`\n                null\n            } else ext\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/image/jceData.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.image\n\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.utils.toUHexString\n\n\ninternal val Image.friendImageId: String\n    get() {\n        //    /1234567890-3666252994-EFF4427CE3D27DB6B1D9A8AB72E7A29C\n        return \"/000000000-000000000-${md5.toUHexString(\"\")}\"\n    }\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/imagesImpl.kt",
    "content": ""
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/messageToElems.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message\n\nimport net.mamoe.mirai.message.data.PlainText\n\n\ninternal val UNSUPPORTED_VOICE_MESSAGE_PLAIN = PlainText(\"收到语音消息，你需要升级到最新版QQ才能接收，升级地址https://im.qq.com\")\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/MessageProtocol.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol\n\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoder\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoder\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePostprocessor\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePreprocessor\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessageSender\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessageTransformer\nimport net.mamoe.mirai.internal.message.protocol.serialization.MessageSerializer\nimport net.mamoe.mirai.message.data.SingleMessage\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.systemProp\nimport net.mamoe.mirai.utils.withSwitch\nimport kotlin.reflect.KClass\n\n// Loaded by ServiceLoader\ninternal abstract class MessageProtocol(\n    val priority: UInt = PRIORITY_CONTENT // the higher, the prior it being called\n) {\n    val logger: MiraiLogger by lazy {\n        MiraiLogger.Factory.create(this::class).withSwitch(systemProp(\"mirai.message.protocol.log.full\", false))\n    }\n\n    fun collectProcessors(processorCollector: ProcessorCollector) {\n        processorCollector.collectProcessorsImpl()\n    }\n\n    protected abstract fun ProcessorCollector.collectProcessorsImpl()\n\n    companion object {\n        const val PRIORITY_METADATA: UInt = 10000u\n        const val PRIORITY_CONTENT: UInt = 1000u\n        const val PRIORITY_IGNORE: UInt = 500u\n        const val PRIORITY_UNSUPPORTED: UInt = 100u\n        const val PRIORITY_GENERAL_SENDER: UInt = 100u\n    }\n\n    object PriorityComparator : Comparator<MessageProtocol> {\n        override fun compare(a: MessageProtocol, b: MessageProtocol): Int {\n\n            // Do not use o1.compareTo\n            // > Task :mirai-core:checkAndroidApiLevel\n            // > /Users/runner/work/mirai/mirai/mirai-core/build/classes/kotlin/android/main/net/mamoe/mirai/internal/message/protocol/MessageProtocol$PriorityComparator.class\n            //    > Method compare(Lnet/mamoe/mirai/internal/message/protocol/MessageProtocol;Lnet/mamoe/mirai/internal/message/protocol/MessageProtocol;)I\n            //      > Invoke method java/lang/Integer.compareUnsigned(II)I\n            //          Couldn't access java/lang/Integer.compareUnsigned(II)I: java/lang/Integer.compareUnsigned(II)I since api level 26\n\n            return uintCompare(a.priority.toInt(), b.priority.toInt())\n        }\n\n        private fun uintCompare(v1: Int, v2: Int): Int = (v1 xor Int.MIN_VALUE).compareTo(v2 xor Int.MIN_VALUE)\n    }\n}\n\ninternal abstract class ProcessorCollector {\n    inline fun <reified T : SingleMessage> add(encoder: MessageEncoder<T>) = add(encoder, T::class)\n\n\n    abstract fun <T : SingleMessage> add(encoder: MessageEncoder<T>, elementType: KClass<T>)\n\n    abstract fun add(decoder: MessageDecoder)\n\n\n    abstract fun add(preprocessor: OutgoingMessagePreprocessor)\n    abstract fun add(transformer: OutgoingMessageTransformer)\n    abstract fun add(sender: OutgoingMessageSender)\n    abstract fun add(postprocessor: OutgoingMessagePostprocessor)\n\n    abstract fun <T : Any> add(serializer: MessageSerializer<T>)\n}\n\n/* This stub is used for allocate new empty MessageProtocolFacade only */\ninternal object StubMessageProtocol : MessageProtocol() {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n    }\n}\n\n///////////////////////////////////////////////////////////////////////////\n// refiners\n///////////////////////////////////////////////////////////////////////////\n\n\n//internal interface MessageRefiner : Processor<MessageRefinerContext>\n//\n//internal interface MessageRefinerContext : ProcessorPipelineContext<SingleMessage, Message?> {\n//    /**\n//     * Refine if possible (without suspension), returns self otherwise.\n//     * @since 2.6\n//     */ // see #1157\n//    fun tryRefine(\n//        bot: Bot,\n//        context: MessageChain,\n//        refineContext: RefineContext = EmptyRefineContext,\n//    ): Message? = this\n//\n//    /**\n//     * This message [RefinableMessage] will be replaced by return value of [refineLight]\n//     */\n//    suspend fun refine(\n//        bot: Bot,\n//        context: MessageChain,\n//        refineContext: RefineContext = EmptyRefineContext,\n//    ): Message? = tryRefine(bot, context, refineContext)\n//}\n//\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/MessageProtocolFacade.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol\n\nimport kotlinx.serialization.modules.SerializersModule\nimport kotlinx.serialization.modules.polymorphic\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.ContactOrBot\nimport net.mamoe.mirai.internal.contact.AbstractContact\nimport net.mamoe.mirai.internal.contact.SendMessageStep\nimport net.mamoe.mirai.internal.contact.impl\nimport net.mamoe.mirai.internal.message.DeepMessageRefiner.refineDeep\nimport net.mamoe.mirai.internal.message.EmptyRefineContext\nimport net.mamoe.mirai.internal.message.LightMessageRefiner.refineLight\nimport net.mamoe.mirai.internal.message.RefineContext\nimport net.mamoe.mirai.internal.message.contextualBugReportException\nimport net.mamoe.mirai.internal.message.protocol.decode.*\nimport net.mamoe.mirai.internal.message.protocol.encode.*\nimport net.mamoe.mirai.internal.message.protocol.outgoing.*\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.COMPONENTS\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.CONTACT\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.MESSAGE_TO_RETRY\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.ORIGINAL_MESSAGE\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.ORIGINAL_MESSAGE_AS_CHAIN\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.STEP\nimport net.mamoe.mirai.internal.message.protocol.serialization.MessageSerializer\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.component.ComponentStorage\nimport net.mamoe.mirai.internal.network.component.buildComponentStorage\nimport net.mamoe.mirai.internal.network.component.withFallback\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.pipeline.ProcessResult\nimport net.mamoe.mirai.internal.utils.runCoroutineInPlace\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.MessageSerializers\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.message.data.visitor.RecursiveMessageVisitor\nimport net.mamoe.mirai.message.data.visitor.accept\nimport net.mamoe.mirai.utils.*\nimport kotlin.reflect.KClass\n\ninternal interface MessageProtocolFacade {\n    val remark: String get() = \"MessageProtocolFacade\"\n\n    val encoderPipeline: MessageEncoderPipeline\n    val decoderPipeline: MessageDecoderPipeline\n    val preprocessorPipeline: OutgoingMessagePipeline\n    val outgoingPipeline: OutgoingMessagePipeline\n    val serializers: Collection<MessageSerializer<*>>\n\n    val loaded: List<MessageProtocol>\n\n    /**\n     * Encode high-level [MessageChain] to give list of low-level and protocol-specific [ImMsgBody.Elem]s.\n     */\n    fun encode(\n        chain: MessageChain,\n        messageTarget: ContactOrBot?, // for At.display, QuoteReply, Image, and more.\n        withGeneralFlags: Boolean, // important for RichMessages, may also be helpful for others\n        isForward: Boolean = false, // is inside forward, for At.display\n    ): List<ImMsgBody.Elem>\n\n    /**\n     * Decode list of low-level and protocol-specific [ImMsgBody.Elem]s to give a high-level [MessageChain].\n     *\n     * [SingleMessage]s are appended to the [builder].\n     */\n    fun decode(\n        elements: List<ImMsgBody.Elem>,\n        groupIdOrZero: Long,\n        messageSourceKind: MessageSourceKind,\n        bot: Bot,\n        builder: MessageChainBuilder,\n        containingMsg: MsgComm.Msg? = null,\n    )\n\n\n    /**\n     * Pre-process a message\n     * @see OutgoingMessagePreprocessor\n     */\n    suspend fun <C : AbstractContact> preprocess(\n        target: C,\n        message: Message,\n        components: ComponentStorage,\n    ): MessageChain\n\n    /**\n     * Send a message\n     * @see OutgoingMessageProcessor\n     */\n    suspend fun <C : AbstractContact> sendOutgoing(\n        target: C,\n        message: Message,\n        components: ComponentStorage,\n    ): MessageReceipt<C>\n\n    /**\n     * Preprocess and send a message\n     * @see OutgoingMessagePreprocessor\n     * @see OutgoingMessageProcessor\n     */\n    suspend fun <C : AbstractContact> preprocessAndSendOutgoing(\n        target: C,\n        message: Message,\n        components: ComponentStorage,\n    ): MessageReceipt<C>\n\n\n    /**\n     * Preprocess and send a message\n     * @see OutgoingMessagePreprocessor\n     * @see OutgoingMessageProcessor\n     */\n    @TestOnly\n    suspend fun <C : AbstractContact> preprocessAndSendOutgoingImpl(\n        target: C,\n        message: Message,\n        components: ComponentStorage,\n    ): ProcessResult<OutgoingMessagePipelineContext, MessageReceipt<*>>\n\n    /**\n     * Decode list of low-level and protocol-specific [ImMsgBody.Elem]s to give a high-level [MessageChain].\n     */\n    fun decode(\n        elements: List<ImMsgBody.Elem>,\n        groupIdOrZero: Long,\n        messageSourceKind: MessageSourceKind,\n        bot: Bot,\n    ): MessageChain = buildMessageChain {\n        decode(elements, groupIdOrZero, messageSourceKind, bot, this, null)\n    }\n\n\n    fun createSerializersModule(): SerializersModule = SerializersModule {\n        serializers.forEach { ms ->\n            @Suppress(\"UNCHECKED_CAST\")\n            ms as MessageSerializer<SingleMessage>\n            for (superclass in ms.superclasses) {\n                polymorphic(superclass) {\n                    subclass(ms.forClass, ms.serializer)\n                }\n            }\n            if (ms.registerAlsoContextual) {\n                contextual(ms.forClass, ms.serializer)\n            }\n//            contextual(ms.forClass, ms.serializer)\n        }\n    }\n\n    fun copy(): MessageProtocolFacade\n\n    /**\n     * The default global instance.\n     */\n    companion object INSTANCE : MessageProtocolFacade by MessageProtocolFacadeImpl(),\n        ComponentKey<MessageProtocolFacade> {\n        init {\n            MessageSerializers.registerSerializers(createSerializersModule())\n        }\n    }\n}\n\ninternal fun MessageProtocolFacade.decodeAndRefineLight(\n    elements: List<ImMsgBody.Elem>,\n    groupIdOrZero: Long,\n    messageSourceKind: MessageSourceKind,\n    bot: Bot,\n    refineContext: RefineContext = EmptyRefineContext\n): MessageChain = decode(elements, groupIdOrZero, messageSourceKind, bot).refineLight(bot, refineContext)\n\ninternal suspend fun MessageProtocolFacade.decodeAndRefineDeep(\n    elements: List<ImMsgBody.Elem>,\n    groupIdOrZero: Long,\n    messageSourceKind: MessageSourceKind,\n    bot: Bot,\n    refineContext: RefineContext = EmptyRefineContext\n): MessageChain = decode(elements, groupIdOrZero, messageSourceKind, bot).refineDeep(bot, refineContext)\n\n\nprivate const val errorTips =\n    \"This should not happen if you are using mirai under default JVM classloader or using Mirai Console.\" +\n            \"If so, please file an issue. \" +\n            \"If you are trying to load mirai manually from other classloader, \" +\n            \"e.g. in another plugin system like Minecraft, it's your responsibility to ensure the Java SPI works.\"\n\ninternal class MessageProtocolFacadeImpl(\n    private val protocols: Iterable<MessageProtocol> = loadServices(MessageProtocol::class).asIterable(),\n    override val remark: String = \"MessageProtocolFacade\"\n) : MessageProtocolFacade {\n    override val encoderPipeline: MessageEncoderPipeline = MessageEncoderPipelineImpl()\n    override val decoderPipeline: MessageDecoderPipeline = MessageDecoderPipelineImpl()\n    override val preprocessorPipeline: OutgoingMessagePipeline = OutgoingMessagePipelineImpl()\n    override val outgoingPipeline: OutgoingMessagePipeline = OutgoingMessagePipelineImpl()\n    override val serializers: MutableCollection<MessageSerializer<*>> = ArrayList(10)\n\n    override val loaded: List<MessageProtocol> = kotlin.run {\n        val instances = protocols\n            .sortedWith(MessageProtocol.PriorityComparator.reversed())\n        if (instances.isEmpty()) {\n            error(\n                \"Failed to load services for MessageProtocol from your classpath. \" +\n                        \"Check you ClassLoader environment and ensure services for '${MessageProtocol::class.qualifiedName}' can be loaded. $errorTips\"\n            )\n        }\n        for (instance in instances) {\n            instance.collectProcessors(object : ProcessorCollector() {\n                override fun <T : SingleMessage> add(encoder: MessageEncoder<T>, elementType: KClass<T>) {\n                    this@MessageProtocolFacadeImpl.encoderPipeline.registerProcessor(\n                        MessageEncoderProcessor(\n                            encoder,\n                            elementType\n                        )\n                    )\n                }\n\n                override fun add(decoder: MessageDecoder) {\n                    this@MessageProtocolFacadeImpl.decoderPipeline.registerProcessor(MessageDecoderProcessor(decoder))\n                }\n\n                override fun add(preprocessor: OutgoingMessagePreprocessor) {\n                    preprocessorPipeline.registerProcessor(OutgoingMessageProcessorAdapter(preprocessor))\n                }\n\n                override fun add(transformer: OutgoingMessageTransformer) {\n                    outgoingPipeline.registerProcessor(OutgoingMessageProcessorAdapter(transformer))\n                }\n\n                override fun add(sender: OutgoingMessageSender) {\n                    outgoingPipeline.registerProcessor(OutgoingMessageProcessorAdapter(sender))\n                }\n\n                override fun add(postprocessor: OutgoingMessagePostprocessor) {\n                    outgoingPipeline.registerProcessor(OutgoingMessageProcessorAdapter(postprocessor))\n                }\n\n                override fun <T : Any> add(serializer: MessageSerializer<T>) {\n                    serializers.add(serializer)\n                }\n            })\n        }\n        instances.toList()\n    }\n\n    private fun checkOutgoingPipeline() {\n        if (outgoingPipeline.processors.isEmpty()) {\n            error(\n                \"`outgoingPipeline` is empty. It means you have corrupted classpath or bad service configuration. $errorTips\"\n            )\n        }\n    }\n\n    override fun encode(\n        chain: MessageChain,\n        messageTarget: ContactOrBot?,\n        withGeneralFlags: Boolean,\n        isForward: Boolean\n    ): List<ImMsgBody.Elem> {\n        val pipeline = encoderPipeline\n\n        val attributes = buildTypeSafeMap {\n            set(MessageEncoderContext.CONTACT, messageTarget)\n            set(MessageEncoderContext.ORIGINAL_MESSAGE, chain)\n            set(MessageEncoderContext.ADD_GENERAL_FLAGS, withGeneralFlags)\n            set(MessageEncoderContext.IS_FORWARD, isForward)\n        }\n\n        val builder = ArrayList<ImMsgBody.Elem>(chain.size)\n\n        chain.accept(object : RecursiveMessageVisitor<Unit>() {\n            override fun visitSingleMessage(message: SingleMessage, data: Unit) {\n                runCoroutineInPlace {\n                    builder.addAll(pipeline.process(message, attributes).collected)\n                }\n            }\n        })\n\n        return builder\n    }\n\n    override fun decode(\n        elements: List<ImMsgBody.Elem>,\n        groupIdOrZero: Long,\n        messageSourceKind: MessageSourceKind,\n        bot: Bot,\n        builder: MessageChainBuilder,\n        containingMsg: MsgComm.Msg?\n    ) {\n        val pipeline = decoderPipeline\n\n        val attributes = buildTypeSafeMap {\n            set(MessageDecoderContext.BOT, bot)\n            set(MessageDecoderContext.MESSAGE_SOURCE_KIND, messageSourceKind)\n            set(MessageDecoderContext.GROUP_ID, groupIdOrZero)\n            set(MessageDecoderContext.CONTAINING_MSG, containingMsg)\n        }\n\n        runCoroutineInPlace {\n            elements.forEach { builder.addAll(pipeline.process(it, attributes).collected) }\n        }\n    }\n\n    private val thisComponentStorage by lazy {\n        buildComponentStorage {\n            set(\n                MessageProtocolFacade,\n                this@MessageProtocolFacadeImpl\n            )\n        }\n    }\n\n    override suspend fun <C : AbstractContact> preprocess(\n        target: C,\n        message: Message,\n        components: ComponentStorage\n    ): MessageChain {\n        val attributes = createAttributesForOutgoingMessage(target, message, components)\n\n        return preprocessorPipeline.process(message.toMessageChain(), attributes).context.currentMessageChain\n    }\n\n    override suspend fun <C : AbstractContact> sendOutgoing(\n        target: C, message: Message,\n        components: ComponentStorage\n    ): MessageReceipt<C> {\n        checkOutgoingPipeline()\n\n        val attributes = createAttributesForOutgoingMessage(target, message, components)\n        val (_, result) = outgoingPipeline.process(message.toMessageChain(), attributes)\n\n        return getSingleReceipt(result, message)\n    }\n\n    override suspend fun <C : AbstractContact> preprocessAndSendOutgoing(\n        target: C,\n        message: Message,\n        components: ComponentStorage\n    ): MessageReceipt<C> {\n        @OptIn(TestOnly::class)\n        return getSingleReceipt(preprocessAndSendOutgoingImpl(target, message, components).collected, message)\n    }\n\n    @TestOnly\n    override suspend fun <C : AbstractContact> preprocessAndSendOutgoingImpl(\n        target: C,\n        message: Message,\n        components: ComponentStorage\n    ): ProcessResult<OutgoingMessagePipelineContext, MessageReceipt<*>> {\n        checkOutgoingPipeline()\n        val attributes = createAttributesForOutgoingMessage(target, message, components)\n\n        val data = message.toMessageChain()\n        val (context, _) = preprocessorPipeline.process(data, attributes)\n        val preprocessed = context.currentMessageChain\n\n        return outgoingPipeline.process(\n            data,\n            outgoingPipeline.createContext(preprocessed, context.attributes.plus(MESSAGE_TO_RETRY to preprocessed)),\n            attributes\n        )\n    }\n\n    override fun copy(): MessageProtocolFacade {\n        return MessageProtocolFacadeImpl(protocols)\n    }\n\n    private fun <C : AbstractContact> getSingleReceipt(\n        result: Collection<MessageReceipt<*>>,\n        message: Message\n    ): MessageReceipt<C> {\n        when (result.size) {\n            0 -> throw contextualBugReportException(\n                \"Internal error: no MessageReceipt was returned from OutgoingMessagePipeline for message\",\n                forDebug = message.structureToString()\n            )\n\n            1 -> return result.single().castUp()\n            else -> throw contextualBugReportException(\n                \"Internal error: multiple MessageReceipts were returned from OutgoingMessagePipeline: $result\",\n                forDebug = message.structureToString()\n            )\n        }\n    }\n\n    private fun <C : AbstractContact> createAttributesForOutgoingMessage(\n        target: C,\n        message: Message,\n        context: ComponentStorage\n    ): MutableTypeSafeMap {\n        val chain = message.toMessageChain()\n        val attributes = buildTypeSafeMap {\n            set(CONTACT, target.impl())\n            set(ORIGINAL_MESSAGE, message)\n            set(ORIGINAL_MESSAGE_AS_CHAIN, chain)\n            set(STEP, SendMessageStep.FIRST)\n            set(COMPONENTS, thisComponentStorage.withFallback(context))\n            set(MESSAGE_TO_RETRY, chain)\n        }\n        return attributes\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/decode/MessageDecoder.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.decode\n\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.pipeline.PipelineConsumptionMarker\nimport net.mamoe.mirai.internal.pipeline.Processor\n\n\ninternal interface MessageDecoder : PipelineConsumptionMarker {\n    suspend fun MessageDecoderContext.process(data: ImMsgBody.Elem)\n}\n\n/**\n * Adapter for [MessageDecoder] to be used as [Processor].\n */\ninternal class MessageDecoderProcessor(\n    private val decoder: MessageDecoder,\n) : Processor<MessageDecoderContext, ImMsgBody.Elem> {\n    override val origin: Any get() = this\n\n    override suspend fun process(context: MessageDecoderContext, data: ImMsgBody.Elem) {\n        @Suppress(\"ILLEGAL_RESTRICTED_SUSPENDING_FUNCTION_CALL\")\n        decoder.run { context.process(data) }\n        // TODO: 2022/4/27 handle exceptions\n    }\n\n    override fun toString(): String {\n        return \"MessageDecoderProcessor(decoder=$decoder)\"\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/decode/MessageDecoderPipeline.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.decode\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderContext.Companion.CONTAINING_MSG\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.pipeline.*\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.data.MessageSourceKind\nimport net.mamoe.mirai.utils.*\nimport kotlin.coroutines.RestrictsSuspension\n\ninternal interface MessageDecoderPipeline :\n    ProcessorPipeline<MessageDecoderProcessor, MessageDecoderContext, ImMsgBody.Elem, Message>\n\n@RestrictsSuspension // Implementor can only call `MessageDecoderContext.process` and `processAlso` so there will be no suspension point\ninternal interface MessageDecoderContext : ProcessorPipelineContext<ImMsgBody.Elem, Message> {\n    companion object {\n        val BOT = TypeKey<Bot>(\"bot\")\n        val MESSAGE_SOURCE_KIND = TypeKey<MessageSourceKind>(\"messageSourceKind\")\n        val GROUP_ID = TypeKey<Long>(\"groupId\") // zero if not group\n        val CONTAINING_MSG = TypeKey<MsgComm.Msg?>(\"containingMsg\")\n        val FROM_ID = TypeKey<Long>(\"fromId\") // group/temp = sender, friend/stranger = this\n    }\n}\n\ninternal open class MessageDecoderPipelineImpl :\n    AbstractProcessorPipeline<MessageDecoderProcessor, MessageDecoderContext, ImMsgBody.Elem, Message>(\n        PipelineConfiguration(stopWhenConsumed = true),\n        @OptIn(TestOnly::class)\n        defaultTraceLogging\n    ),\n    MessageDecoderPipeline {\n\n    inner class MessageDecoderContextImpl(attributes: TypeSafeMap) : MessageDecoderContext, BaseContextImpl(attributes)\n\n    override fun createContext(data: ImMsgBody.Elem, attributes: TypeSafeMap): MessageDecoderContext =\n        MessageDecoderContextImpl(attributes)\n\n    override suspend fun process(\n        data: ImMsgBody.Elem,\n        context: MessageDecoderContext,\n        attributes: TypeSafeMap\n    ): ProcessResult<MessageDecoderContext, Message> {\n        context.attributes[CONTAINING_MSG]?.let { msg ->\n            traceLogging.info { \"Processing MsgCommon.Msg: ${msg.structureToStringAndDesensitizeIfAvailable()}\" }\n        }\n        return super.process(data, context, attributes)\n    }\n\n    companion object {\n        @TestOnly\n        val defaultTraceLogging: MiraiLoggerWithSwitch by lazy {\n            MiraiLogger.Factory.create(MessageDecoderPipelineImpl::class, \"MessageDecoderPipeline\")\n                .withSwitch(systemProp(\"mirai.message.decoder.pipeline.log.full\", false))\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/encode/MessageEncoder.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.encode\n\nimport net.mamoe.mirai.internal.pipeline.PipelineConsumptionMarker\nimport net.mamoe.mirai.internal.pipeline.Processor\nimport net.mamoe.mirai.message.data.SingleMessage\nimport net.mamoe.mirai.utils.uncheckedCast\nimport kotlin.reflect.KClass\n\ninternal fun interface MessageEncoder<T : SingleMessage> : PipelineConsumptionMarker {\n    suspend fun MessageEncoderContext.process(data: T)\n}\n\n\n/**\n * Adapter for [MessageEncoder] to be used as [Processor].\n */\ninternal class MessageEncoderProcessor<T : SingleMessage>(\n    private val encoder: MessageEncoder<T>,\n    private val elementType: KClass<T>,\n) : Processor<MessageEncoderContext, SingleMessage> {\n    override val origin: Any get() = this\n\n    override suspend fun process(context: MessageEncoderContext, data: SingleMessage) {\n        if (elementType.isInstance(data)) {\n            @Suppress(\"ILLEGAL_RESTRICTED_SUSPENDING_FUNCTION_CALL\")\n            encoder.run { context.process(data.uncheckedCast()) }\n            // TODO: 2022/4/27 handle exceptions\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/encode/MessageEncoderPipeline.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.encode\n\nimport net.mamoe.mirai.contact.ContactOrBot\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.pipeline.*\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.SingleMessage\nimport net.mamoe.mirai.utils.*\nimport kotlin.coroutines.RestrictsSuspension\n\ninternal interface MessageEncoderPipeline :\n    ProcessorPipeline<MessageEncoderProcessor<*>, MessageEncoderContext, SingleMessage, ImMsgBody.Elem> {\n}\n\n/**\n * The context for a [MessageEncoder]. [RestrictsSuspension] ensures no real suspension may happen during [Processor.process].\n */\n@RestrictsSuspension\ninternal interface MessageEncoderContext : ProcessorPipelineContext<SingleMessage, ImMsgBody.Elem> {\n\n    /**\n     * General flags that should be appended to the end of the result.\n     *\n     * Do not update this property directly, but call [collectGeneralFlags].\n     */\n    var generalFlags: ImMsgBody.Elem\n\n    companion object {\n        val ADD_GENERAL_FLAGS = TypeKey<Boolean>(\"addGeneralFlags\")\n        val MessageEncoderContext.addGeneralFlags get() = attributes[ADD_GENERAL_FLAGS]\n\n        /**\n         * Override default generalFlags if needed\n         */\n        inline fun MessageEncoderContext.collectGeneralFlags(block: () -> ImMsgBody.Elem) {\n            if (addGeneralFlags) {\n                generalFlags = block()\n            }\n        }\n\n        val CONTACT = TypeKey<ContactOrBot?>(\"contactOrBot\")\n        val MessageEncoderContext.contact get() = attributes[CONTACT]\n\n        val ORIGINAL_MESSAGE = TypeKey<MessageChain>(\"originalMessage\")\n        val MessageEncoderContext.originalMessage get() = attributes[ORIGINAL_MESSAGE]\n\n        val IS_FORWARD = TypeKey<Boolean>(\"isForward\")\n        val MessageEncoderContext.isForward get() = attributes[IS_FORWARD]\n    }\n}\n\n/**\n * This pipeline encodes [SingleMessage] into [ImMsgBody.Elem]s, in the context of [MessageEncoderContext]\n */\ninternal open class MessageEncoderPipelineImpl :\n    AbstractProcessorPipeline<MessageEncoderProcessor<*>, MessageEncoderContext, SingleMessage, ImMsgBody.Elem>(\n        PipelineConfiguration(stopWhenConsumed = true),\n        @OptIn(TestOnly::class)\n        defaultTraceLogging\n    ),\n    MessageEncoderPipeline {\n\n    private inner class MessageEncoderContextImpl(attributes: TypeSafeMap) : MessageEncoderContext,\n        BaseContextImpl(attributes) {\n        override var generalFlags: ImMsgBody.Elem by lateinitMutableProperty {\n            ImMsgBody.Elem(generalFlags = ImMsgBody.GeneralFlags(pbReserve = PB_RESERVE_FOR_ELSE))\n        }\n    }\n\n    override fun createContext(data: SingleMessage, attributes: TypeSafeMap): MessageEncoderContext =\n        MessageEncoderContextImpl(attributes)\n\n    companion object {\n        private val PB_RESERVE_FOR_ELSE = \"78 00 F8 01 00 C8 02 00\".hexToBytes()\n\n        @TestOnly\n        val defaultTraceLogging: MiraiLoggerWithSwitch by lazy {\n            MiraiLogger.Factory.create(MessageEncoderPipelineImpl::class, \"MessageEncoderPipeline\")\n                .withSwitch(systemProp(\"mirai.message.encoder.pipeline.log.full\", false))\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/impl/AudioProtocol.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.internal.message.data.OfflineAudioImpl\nimport net.mamoe.mirai.internal.message.data.OnlineAudioImpl\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.internal.message.protocol.serialization.MessageSerializer\nimport net.mamoe.mirai.message.data.*\n\ninternal class AudioProtocol : MessageProtocol() {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        MessageSerializer.superclassesScope(\n            OnlineAudio::class,\n            Audio::class,\n            MessageContent::class,\n            SingleMessage::class\n        ) {\n            add(MessageSerializer(OnlineAudioImpl::class, OnlineAudioImpl.serializer()))\n        }\n        MessageSerializer.superclassesScope(\n            OfflineAudio::class,\n            Audio::class,\n            MessageContent::class,\n            SingleMessage::class\n        ) {\n            add(MessageSerializer(OfflineAudioImpl::class, OfflineAudioImpl.serializer()))\n        }\n        MessageSerializer.superclassesScope(MessageContent::class, SingleMessage::class) {\n            @Suppress(\"DEPRECATION_ERROR\")\n            add(\n                MessageSerializer(\n                    net.mamoe.mirai.message.data.Voice::class,\n                    net.mamoe.mirai.message.data.Voice.serializer()\n                )\n            )\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/impl/CustomMessageProtocol.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoder\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderContext\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoder\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.message.data.CustomMessage\nimport net.mamoe.mirai.utils.read\nimport net.mamoe.mirai.utils.toUHexString\n\ninternal class CustomMessageProtocol : MessageProtocol() {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        add(Encoder())\n        add(Decoder())\n    }\n\n    private companion object {\n        private const val MIRAI_CUSTOM_ELEM_TYPE = 103904510 // \"mirai.hashCode()\"\n    }\n\n    private class Encoder : MessageEncoder<CustomMessage> {\n        override suspend fun MessageEncoderContext.process(data: CustomMessage) {\n            markAsConsumed()\n\n            @Suppress(\"UNCHECKED_CAST\")\n            collect(\n                ImMsgBody.Elem(\n                    customElem = ImMsgBody.CustomElem(\n                        enumType = MIRAI_CUSTOM_ELEM_TYPE,\n                        data = CustomMessage.dump(\n                            data.getFactory() as CustomMessage.Factory<CustomMessage>,\n                            data\n                        )\n                    )\n                )\n            )\n        }\n\n    }\n\n    private class Decoder : MessageDecoder {\n        override suspend fun MessageDecoderContext.process(data: ImMsgBody.Elem) {\n            if (data.customElem == null) return\n            markAsConsumed()\n            kotlin.runCatching {\n                if (data.customElem.enumType != MIRAI_CUSTOM_ELEM_TYPE) return\n                data.customElem.data.read {\n                    CustomMessage.load(this)\n                }\n            }.fold(\n                onFailure = {\n                    if (it is CustomMessage.Companion.CustomMessageFullDataDeserializeInternalException) {\n                        throw IllegalStateException(\n                            \"Internal error: \" +\n                                    \"exception while deserializing CustomMessage head data,\" +\n                                    \" data=${data.customElem.data.toUHexString()}\", it\n                        )\n                    } else {\n                        it as CustomMessage.Companion.CustomMessageFullDataDeserializeUserException\n                        throw IllegalStateException(\n                            \"User error: \" +\n                                    \"exception while deserializing CustomMessage body,\" +\n                                    \" body=${it.body.toUHexString()}\", it\n                        )\n                    }\n\n                },\n                onSuccess = {\n                    if (it != null) {\n                        collect(it)\n                    }\n                }\n            )\n\n        }\n\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/impl/FaceProtocol.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoder\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderContext\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoder\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext\nimport net.mamoe.mirai.internal.message.protocol.serialization.MessageSerializer\nimport net.mamoe.mirai.internal.network.protocol.data.proto.HummerCommelem\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.message.data.Face\nimport net.mamoe.mirai.message.data.MessageContent\nimport net.mamoe.mirai.message.data.SingleMessage\nimport net.mamoe.mirai.utils.hexToBytes\nimport net.mamoe.mirai.utils.toByteArray\n\ninternal class FaceProtocol : MessageProtocol() {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        add(Encoder())\n        add(Type1Decoder())\n        add(Type2Decoder())\n\n        MessageSerializer.superclassesScope(MessageContent::class, SingleMessage::class) {\n            add(\n                MessageSerializer(\n                    Face::class,\n                    Face.serializer()\n                )\n            )\n        }\n    }\n\n    private class Encoder : MessageEncoder<Face> {\n        override suspend fun MessageEncoderContext.process(data: Face) {\n            markAsConsumed()\n            collect(\n                if (data.id >= 260) {\n                    ImMsgBody.Elem(commonElem = data.toCommData())\n                } else {\n                    ImMsgBody.Elem(face = data.toJceData())\n                }\n            )\n        }\n\n        private companion object {\n            private val FACE_BUF = \"00 01 00 04 52 CC F5 D0\".hexToBytes()\n\n            fun Face.toJceData(): ImMsgBody.Face {\n                return ImMsgBody.Face(\n                    index = this.id,\n                    old = (0x1445 - 4 + this.id).toShort().toByteArray(),\n                    buf = FACE_BUF\n                )\n            }\n\n            fun Face.toCommData(): ImMsgBody.CommonElem {\n                return ImMsgBody.CommonElem(\n                    serviceType = 33,\n                    pbElem = HummerCommelem.MsgElemInfoServtype33(\n                        index = this.id,\n                        name = \"/${this.name}\".toByteArray(),\n                        compat = \"/${this.name}\".toByteArray()\n                    ).toByteArray(HummerCommelem.MsgElemInfoServtype33.serializer()),\n                    businessType = 1\n                )\n\n            }\n        }\n    }\n\n    private class Type1Decoder : MessageDecoder {\n        override suspend fun MessageDecoderContext.process(data: ImMsgBody.Elem) {\n            val commonElem = data.commonElem ?: return\n            if (commonElem.serviceType != 33) return\n            markAsConsumed()\n\n            val proto =\n                commonElem.pbElem.loadAs(HummerCommelem.MsgElemInfoServtype33.serializer())\n            collect(Face(proto.index))\n        }\n\n    }\n\n    private class Type2Decoder : MessageDecoder {\n        override suspend fun MessageDecoderContext.process(data: ImMsgBody.Elem) {\n            val face = data.face ?: return\n            markAsConsumed()\n            collect(Face(face.index))\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/impl/FileMessageProtocol.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.coroutineScope\nimport net.mamoe.mirai.internal.contact.SendMessageStep\nimport net.mamoe.mirai.internal.message.data.FileMessageImpl\nimport net.mamoe.mirai.internal.message.data.checkIsImpl\nimport net.mamoe.mirai.internal.message.flags.AllowSendFileMessage\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoder\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderContext\nimport net.mamoe.mirai.internal.message.protocol.outgoing.MessageProtocolStrategy\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.CONTACT\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.ORIGINAL_MESSAGE_AS_CHAIN\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.components\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessageSender\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessageTransformer\nimport net.mamoe.mirai.internal.message.protocol.serialization.MessageSerializer\nimport net.mamoe.mirai.internal.message.source.createMessageReceipt\nimport net.mamoe.mirai.internal.message.visitor.MessageVisitorEx\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ObjMsg\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.FileManagement\nimport net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf\nimport net.mamoe.mirai.message.data.FileMessage\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.MessageContent\nimport net.mamoe.mirai.message.data.SingleMessage\nimport net.mamoe.mirai.message.data.visitor.RecursiveMessageVisitor\nimport net.mamoe.mirai.message.data.visitor.acceptChildren\nimport net.mamoe.mirai.utils.read\nimport net.mamoe.mirai.utils.systemProp\n\ninternal class FileMessageProtocol : MessageProtocol() {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        // no encoder\n        add(Decoder())\n\n        add(OutgoingMessageTransformer {\n            if (attributes[OutgoingMessagePipelineContext.STEP] == SendMessageStep.FIRST\n            ) {\n                verifyFileMessage(currentMessageChain)\n            }\n        })\n\n        add(FileMessageSender())\n\n        MessageSerializer.superclassesScope(FileMessage::class, MessageContent::class, SingleMessage::class) {\n            add(\n                MessageSerializer(\n                    FileMessageImpl::class,\n                    FileMessageImpl.serializer()\n                )\n            )\n        }\n    }\n\n    companion object {\n        private val ALLOW_SENDING_FILE_MESSAGE = systemProp(\"mirai.message.allow.sending.file.message\", false)\n\n        fun verifyFileMessage(message: MessageChain) {\n            var hasFileMessage = false\n            var hasAllowSendFileMessage = false\n            message.acceptChildren(object : RecursiveMessageVisitor<Unit>(), MessageVisitorEx<Unit, Unit> {\n                override fun isFinished(): Boolean {\n                    return hasAllowSendFileMessage // finish early if allow send\n                }\n\n                override fun visitAllowSendFileMessage(message: AllowSendFileMessage, data: Unit) {\n                    hasAllowSendFileMessage = true\n                }\n\n                override fun visitFileMessage(message: FileMessage, data: Unit) {\n                    if (ALLOW_SENDING_FILE_MESSAGE) return\n                    // #1715\n                    if (message !is FileMessageImpl) error(\"Customized FileMessage cannot be send\")\n                    if (!message.allowSend) {\n                        hasFileMessage = true\n                    }\n                }\n            })\n            if (hasAllowSendFileMessage) {\n                // allowing\n                return\n            }\n            if (hasFileMessage) {\n                throw IllegalStateException(\n                    \"Sending FileMessage is not allowed, as it may cause unexpected results. \" +\n                            \"Add JVM argument `-Dmirai.message.allow.sending.file.message=true` to disable this check. \" +\n                            \"Do this only for compatibility!\"\n                )\n            }\n        }\n    }\n\n    private class FileMessageSender : OutgoingMessageSender {\n        override suspend fun OutgoingMessagePipelineContext.process() {\n            val file = currentMessageChain[FileMessage] ?: return\n            markAsConsumed()\n\n            file.checkIsImpl()\n\n            val contact = attributes[CONTACT]\n            val bot = contact.bot\n\n            val strategy = components[MessageProtocolStrategy]\n\n            val source = coroutineScope {\n                val source = async {\n                    strategy.constructSourceForSpecialMessage(attributes[ORIGINAL_MESSAGE_AS_CHAIN], 2021)\n                }\n\n                bot.network.sendAndExpect(FileManagement.Feed(bot.client, contact.id, file.busId, file.id))\n\n                source.await()\n            }\n\n            collect(source.createMessageReceipt(contact, true))\n        }\n    }\n\n    private class Decoder : MessageDecoder {\n        override suspend fun MessageDecoderContext.process(data: ImMsgBody.Elem) {\n            if (data.transElemInfo == null) return\n            if (data.transElemInfo.elemType != 24) return\n\n            markAsConsumed()\n\n            data.transElemInfo.elemValue.read {\n                // group file feed\n                // 01 00 77 08 06 12 0A 61 61 61 61 61 61 2E 74 78 74 1A 06 31 35 42 79 74 65 3A 5F 12 5D 08 66 12 25 2F 64 37 34 62 62 66 33 61 2D 37 62 32 35 2D 31 31 65 62 2D 38 34 66 38 2D 35 34 35 32 30 30 37 62 35 64 39 66 18 0F 22 0A 61 61 61 61 61 61 2E 74 78 74 28 00 3A 00 42 20 61 33 32 35 66 36 33 34 33 30 65 37 61 30 31 31 66 37 64 30 38 37 66 63 33 32 34 37 35 34 39 63\n                //                fun getFileRsrvAttr(file: ObjMsg.MsgContentInfo.MsgFile): HummerResv21.ResvAttr? {\n                //                    if (file.ext.isEmpty()) return null\n                //                    val element = kotlin.runCatching {\n                //                        jsonForFileDecode.parseToJsonElement(file.ext) as? JsonObject\n                //                    }.getOrNull() ?: return null\n                //                    val extInfo = element[\"ExtInfo\"]?.toString()?.decodeBase64() ?: return null\n                //                    return extInfo.loadAs(HummerResv21.ResvAttr.serializer())\n                //                }\n\n                val var7 = readByte()\n                if (var7 == 1.toByte()) {\n                    while (remaining > 2) {\n                        val proto = readProtoBuf(ObjMsg.ObjMsg.serializer(), readShort().toUShort().toInt())\n                        // proto.msgType=6\n\n                        val file = proto.msgContentInfo.firstOrNull()?.msgFile ?: continue // officially get(0) only.\n                        //                        val attr = getFileRsrvAttr(file) ?: continue\n                        //                        val info = attr.forwardExtFileInfo ?: continue\n\n                        collect(\n                            FileMessageImpl(\n                                id = file.filePath,\n                                busId = file.busId, // path i.e. /a99e95fa-7b2d-11eb-adae-5452007b698a\n                                name = file.fileName,\n                                size = file.fileSize\n                            )\n                        )\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/impl/FlashImageProtocol.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.contact.ContactOrBot\nimport net.mamoe.mirai.contact.User\nimport net.mamoe.mirai.internal.message.image.OnlineFriendImageImpl\nimport net.mamoe.mirai.internal.message.image.OnlineGroupImageImpl\nimport net.mamoe.mirai.internal.message.image.friendImageId\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoder\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderContext\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoder\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext.Companion.collectGeneralFlags\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext.Companion.contact\nimport net.mamoe.mirai.internal.message.protocol.serialization.MessageSerializer\nimport net.mamoe.mirai.internal.network.protocol.data.proto.HummerCommelem\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.message.data.FlashImage\nimport net.mamoe.mirai.message.data.MessageContent\nimport net.mamoe.mirai.message.data.PlainText\nimport net.mamoe.mirai.message.data.SingleMessage\nimport net.mamoe.mirai.utils.hexToBytes\n\ninternal class FlashImageProtocol : MessageProtocol() {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        add(Decoder())\n        add(Encoder())\n\n        MessageSerializer.superclassesScope(MessageContent::class, SingleMessage::class) {\n            add(MessageSerializer(FlashImage::class, FlashImage.serializer()))\n        }\n    }\n\n    private class Decoder : MessageDecoder {\n        override suspend fun MessageDecoderContext.process(data: ImMsgBody.Elem) {\n            if (data.commonElem == null) return\n            if (data.commonElem.serviceType != 3) return\n\n            markAsConsumed()\n\n            val proto =\n                data.commonElem.pbElem.loadAs(HummerCommelem.MsgElemInfoServtype3.serializer())\n            if (proto.flashTroopPic != null) {\n                collect(FlashImage(OnlineGroupImageImpl(proto.flashTroopPic)))\n            }\n            if (proto.flashC2cPic != null) {\n                collect(FlashImage(OnlineFriendImageImpl(proto.flashC2cPic)))\n            }\n\n        }\n\n    }\n\n    private class Encoder : MessageEncoder<FlashImage> {\n        override suspend fun MessageEncoderContext.process(data: FlashImage) {\n            markAsConsumed()\n\n            collect(data.toJceData(contact))\n            processAlso(UNSUPPORTED_FLASH_MESSAGE_PLAIN)\n            collectGeneralFlags {\n                ImMsgBody.Elem(generalFlags = ImMsgBody.GeneralFlags(pbReserve = PB_RESERVE_FOR_DOUTU))\n            }\n        }\n\n        private companion object {\n            @Suppress(\"SpellCheckingInspection\")\n            private val PB_RESERVE_FOR_DOUTU = \"78 00 90 01 01 F8 01 00 A0 02 00 C8 02 00\".hexToBytes()\n            private val UNSUPPORTED_FLASH_MESSAGE_PLAIN = PlainText(\"[闪照]请使用新版手机QQ查看闪照。\")\n\n            private fun FlashImage.toJceData(messageTarget: ContactOrBot?): ImMsgBody.Elem {\n                return if (messageTarget is User) {\n                    ImMsgBody.Elem(\n                        commonElem = ImMsgBody.CommonElem(\n                            serviceType = 3,\n                            businessType = 0,\n                            pbElem = HummerCommelem.MsgElemInfoServtype3(\n                                flashC2cPic = ImMsgBody.NotOnlineImage(\n                                    filePath = image.friendImageId,\n                                    resId = image.friendImageId,\n                                    picMd5 = image.md5,\n                                    oldPicMd5 = false,\n                                    pbReserve = byteArrayOf(0x78, 0x06)\n                                )\n                            ).toByteArray(HummerCommelem.MsgElemInfoServtype3.serializer())\n                        )\n                    )\n                } else {\n                    ImMsgBody.Elem(\n                        commonElem = ImMsgBody.CommonElem(\n                            serviceType = 3,\n                            businessType = 0,\n                            pbElem = HummerCommelem.MsgElemInfoServtype3(\n                                flashTroopPic = ImMsgBody.CustomFace(\n                                    filePath = image.imageId,\n                                    picMd5 = image.md5,\n                                    pbReserve = byteArrayOf(0x78, 0x06)\n                                )\n                            ).toByteArray(HummerCommelem.MsgElemInfoServtype3.serializer())\n                        )\n                    )\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/impl/ForwardMessageProtocol.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.contact.MessageTooLargeException\nimport net.mamoe.mirai.internal.contact.AbstractContact\nimport net.mamoe.mirai.internal.message.data.forwardMessage\nimport net.mamoe.mirai.internal.message.flags.IgnoreLengthCheck\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.internal.message.protocol.outgoing.HighwayUploader\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.CONTACT\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.components\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePreprocessor\nimport net.mamoe.mirai.internal.message.protocol.serialization.MessageSerializer\nimport net.mamoe.mirai.internal.network.components.ClockHolder\nimport net.mamoe.mirai.message.data.*\n\ninternal class ForwardMessageProtocol : MessageProtocol() {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        add(ForwardMessageUploader())\n\n        MessageSerializer.superclassesScope(MessageContent::class, SingleMessage::class) {\n            add(MessageSerializer(ForwardMessage::class, ForwardMessage.serializer()))\n        }\n    }\n\n    class ForwardMessageUploader : OutgoingMessagePreprocessor {\n        override suspend fun OutgoingMessagePipelineContext.process() {\n            val forward = currentMessageChain[ForwardMessage] ?: return\n\n            val contact = attributes[CONTACT]\n            if (!currentMessageChain.contains(IgnoreLengthCheck)) {\n                checkLength(forward, contact)\n                sequence {\n                    forward.nodeList.forEach { yieldAll(it.messageChain) }\n                }.asIterable().verifyLength(forward, contact)\n            }\n\n            val resId = components[HighwayUploader].uploadMessages(\n                contact,\n                components,\n                forward.nodeList,\n                false\n            )\n\n            currentMessageChain += RichMessage.forwardMessage(\n                resId = resId,\n                fileName = components[ClockHolder].local.currentTimeSeconds().toString(),\n                forwardMessage = forward,\n            ).toMessageChain()\n        }\n\n        private fun checkLength(\n            forward: ForwardMessage,\n            contact: AbstractContact\n        ) {\n            check(forward.nodeList.size <= 200) {\n                throw MessageTooLargeException(\n                    contact, forward, forward,\n                    \"ForwardMessage allows up to 200 nodes, but found ${forward.nodeList.size}\"\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/impl/GeneralMessageSenderProtocol.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport kotlinx.coroutines.Deferred\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.internal.AbstractBot\nimport net.mamoe.mirai.internal.contact.AbstractContact\nimport net.mamoe.mirai.internal.contact.SendMessageStep\nimport net.mamoe.mirai.internal.message.flags.ForceAsFragmentedMessage\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.internal.message.protocol.outgoing.MessageProtocolStrategy\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.CONTACT\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.MESSAGE_TO_RETRY\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.ORIGINAL_MESSAGE\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.ORIGINAL_MESSAGE_AS_CHAIN\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.STEP\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.components\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessageSender\nimport net.mamoe.mirai.internal.message.protocol.serialization.MessageSerializer\nimport net.mamoe.mirai.internal.message.source.OutgoingMessageSourceInternal\nimport net.mamoe.mirai.internal.message.source.createMessageReceipt\nimport net.mamoe.mirai.internal.network.components.ClockHolder.Companion.clock\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.receive.MessageSvcPbSendMsg\nimport net.mamoe.mirai.message.data.AtAll\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.OnlineMessageSource\nimport net.mamoe.mirai.message.data.content\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.buildTypeSafeMap\nimport net.mamoe.mirai.utils.info\nimport net.mamoe.mirai.utils.truncated\n\ninternal class GeneralMessageSenderProtocol : MessageProtocol(PRIORITY_GENERAL_SENDER) {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        add(GeneralMessageSender(logger))\n\n        add(MessageSerializer(MessageChain::class, MessageChain.serializer(), emptyArray()))\n    }\n\n\n    class GeneralMessageSender(\n        private val logger: MiraiLogger,\n    ) : OutgoingMessageSender {\n        override suspend fun OutgoingMessagePipelineContext.process() {\n            markAsConsumed()\n\n            @Suppress(\"UNCHECKED_CAST\")\n            val strategy = components[MessageProtocolStrategy] as MessageProtocolStrategy<AbstractContact>\n            val step = attributes[STEP]\n            val contact = attributes[CONTACT]\n            val bot = contact.bot\n\n            var source: Deferred<OnlineMessageSource.Outgoing>? = null\n\n            val packets = strategy.createPacketsForGeneralMessage(\n                client = bot.client,\n                contact = contact,\n                message = currentMessageChain,\n                originalMessage = attributes[ORIGINAL_MESSAGE_AS_CHAIN],\n                fragmented = step == SendMessageStep.FRAGMENTED || currentMessageChain.contains(ForceAsFragmentedMessage)\n            ) { source = it }\n\n            // Patch time to be actual server time\n            var finalTime = bot.clock.server.currentTimeSeconds().toInt()\n            val sendPacketOk = sendAllPackets(bot, step, contact, packets) { _, rsp ->\n                if (rsp is MessageSvcPbSendMsg.Response.SUCCESS) {\n                    finalTime = rsp.sendTime\n                }\n            }\n            if (sendPacketOk) {\n                val sourceAwait = source?.await() ?: error(\"Internal error: source is not initialized\")\n                (sourceAwait as OutgoingMessageSourceInternal).time = finalTime\n                sourceAwait.tryEnsureSequenceIdAvailable()\n                collect(sourceAwait.createMessageReceipt(contact, true))\n            }\n        }\n\n        /**\n         * @return `true`, if source needs to be added\n         */\n        private suspend fun OutgoingMessagePipelineContext.sendAllPackets(\n            bot: AbstractBot,\n            step: SendMessageStep,\n            contact: Contact,\n            packets: List<OutgoingPacket>,\n            packetResponseConsumer: (Int, MessageSvcPbSendMsg.Response) -> Unit = { _, _ -> },\n        ): Boolean {\n            if (!step.allowMultiplePackets && packets.size != 1) {\n                throw IllegalStateException(\"Internal error: step $step doesn't allow multiple packets while found ${packets.size} ones.\")\n            }\n\n            packets.forEachIndexed { index, packet ->\n                if (!sendSinglePacket(\n                        bot, packet, step, contact,\n                    ) { packetResponseConsumer(index, it) }\n                ) return@sendAllPackets false\n            }\n\n            return true\n        }\n\n        private suspend fun OutgoingMessagePipelineContext.sendSinglePacket(\n            bot: AbstractBot,\n            packet: OutgoingPacket,\n            step: SendMessageStep,\n            contact: Contact,\n            packetResponseConsumer: (MessageSvcPbSendMsg.Response) -> Unit,\n        ): Boolean {\n            val originalMessage = attributes[ORIGINAL_MESSAGE]\n            val protocolStrategy = components[MessageProtocolStrategy]\n            val finalMessage = currentMessageChain\n\n            val resp = protocolStrategy.sendPacket(bot, packet) as MessageSvcPbSendMsg.Response\n            packetResponseConsumer(resp)\n            if (resp is MessageSvcPbSendMsg.Response.MessageTooLarge) {\n                logger.info { \"STEP $step: message too large.\" }\n                val next = step.nextStepOrNull()\n                    ?: throw MessageTooLargeException(\n                        contact,\n                        originalMessage,\n                        finalMessage,\n                        \"Message '${finalMessage.content.truncated(10)}' is too large.\"\n                    )\n\n                // retry with next step\n                logger.info { \"Retrying with STEP $next\" }\n                val (_, receipts) = processAlso(\n                    attributes[MESSAGE_TO_RETRY],\n                    extraAttributes = buildTypeSafeMap {\n                        set(STEP, next)\n                    },\n                )\n                check(receipts.size == 1) { \"Internal error: expected exactly one receipt collected from sub-process, but found ${receipts.size}.\" }\n                // We expect to get a Receipt from processAlso\n                return false\n            }\n            if (resp is MessageSvcPbSendMsg.Response.ServiceUnavailable) {\n                throw IllegalStateException(\"Send message to $contact failed, server service is unavailable.\")\n            }\n            if (resp is MessageSvcPbSendMsg.Response.Failed) {\n                when (resp.resultType) {\n                    120 -> if (contact is Group) throw BotIsBeingMutedException(contact, originalMessage)\n                    121 -> if (AtAll in currentMessageChain) throw SendMessageFailedException(\n                        contact,\n                        SendMessageFailedException.Reason.AT_ALL_LIMITED,\n                        originalMessage\n                    )\n                    299 -> if (contact is Group) throw SendMessageFailedException(\n                        contact,\n                        SendMessageFailedException.Reason.GROUP_CHAT_LIMITED,\n                        originalMessage\n                    )\n                    // #2127\n                    46 -> throw SendMessageFailedException(\n                        contact,\n                        SendMessageFailedException.Reason.LIMITED_MESSAGING,\n                        originalMessage,\n                        tips = \"问题原因可能是账号被多次举报或被服务器认为不安全. 若账号在官方客户端也无法发出消息, 可尝试用手机 QQ 登录后访问 https://accounts.qq.com/safe/message/unlock?lock_info=5_5 解冻.\"\n                    )\n                }\n            }\n            check(resp is MessageSvcPbSendMsg.Response.SUCCESS) {\n                \"Send message failed: $resp\"\n            }\n            return true\n        }\n\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/impl/IgnoredMessagesProtocol.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.internal.message.flags.InternalFlagOnlyMessage\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoder\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderContext\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoder\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.message.data.ForwardMessage\nimport net.mamoe.mirai.message.data.MessageSource\nimport net.mamoe.mirai.message.data.ShowImageFlag\nimport net.mamoe.mirai.message.data.SingleMessage\n\ninternal class IgnoredMessagesProtocol : MessageProtocol(PRIORITY_IGNORE) {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        add(Encoder())\n        add(Decoder())\n\n        // 所有未处理的 Elem 都会变成 UnsupportedMessage 所有不用在这里处理\n    }\n\n    private class Decoder : MessageDecoder {\n        override suspend fun MessageDecoderContext.process(data: ImMsgBody.Elem) {\n            when {\n                data.elemFlags2 != null\n                        || data.extraInfo != null\n                        || data.generalFlags != null\n                        || data.anonGroupMsg != null\n                -> markAsConsumed()\n            }\n        }\n    }\n\n    private class Encoder : MessageEncoder<SingleMessage> {\n        override suspend fun MessageEncoderContext.process(data: SingleMessage) {\n            when (data) {\n                is ForwardMessage,\n                is MessageSource, // mirai metadata only\n                -> {\n                    markAsConsumed()\n                }\n                is InternalFlagOnlyMessage, is ShowImageFlag -> {\n                    // ignored\n                    markAsConsumed()\n                }\n            }\n\n        }\n\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/impl/ImageProtocol.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.contact.User\nimport net.mamoe.mirai.internal.contact.GroupImpl\nimport net.mamoe.mirai.internal.message.data.transform\nimport net.mamoe.mirai.internal.message.image.*\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoder\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderContext\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoder\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext.Companion.contact\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.CONTACT\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePreprocessor\nimport net.mamoe.mirai.internal.message.protocol.serialization.MessageSerializer\nimport net.mamoe.mirai.internal.network.protocol.data.proto.CustomFace\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.utils.ImagePatcher\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.generateImageId\nimport net.mamoe.mirai.utils.toUHexString\n\ninternal class ImageProtocol : MessageProtocol() {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        add(ImageEncoder())\n        add(ImageDecoder())\n\n        add(ImagePatcherForGroup())\n\n        MessageSerializer.superclassesScope(MessageContent::class, SingleMessage::class) {\n            @Suppress(\"DEPRECATION\", \"DEPRECATION_ERROR\")\n            add(MessageSerializer(Image::class, Image.Serializer, registerAlsoContextual = true))\n        }\n\n        MessageSerializer.superclassesScope(Image::class, MessageContent::class, SingleMessage::class) {\n            add(MessageSerializer(OfflineGroupImage::class, OfflineGroupImage.serializer()))\n            add(MessageSerializer(OfflineFriendImage::class, OfflineFriendImage.serializer()))\n            add(MessageSerializer(OnlineFriendImageImpl::class, OnlineFriendImageImpl.serializer()))\n            add(MessageSerializer(OnlineGroupImageImpl::class, OnlineGroupImageImpl.serializer()))\n            add(MessageSerializer(OnlineNewTechImageImpl::class, OnlineNewTechImageImpl.serializer()))\n        }\n    }\n\n    private class ImagePatcherForGroup : OutgoingMessagePreprocessor {\n        override suspend fun OutgoingMessagePipelineContext.process() {\n            val contact = attributes[CONTACT]\n            if (contact !is GroupImpl) return\n\n            val patcher = contact.bot.components[ImagePatcher]\n            currentMessageChain = currentMessageChain.transform { element ->\n                when (element) {\n                    is OfflineGroupImage -> {\n                        patcher.patchOfflineGroupImage(contact, element)\n                        element\n                    }\n                    is FriendImage -> {\n                        patcher.patchFriendImageToGroupImage(contact, element)\n                    }\n                    else -> element\n                }\n            }\n        }\n    }\n\n    private class ImageDecoder : MessageDecoder {\n        override suspend fun MessageDecoderContext.process(data: ImMsgBody.Elem) {\n            markAsConsumed()\n            when {\n                data.notOnlineImage != null -> {\n                    collect(OnlineFriendImageImpl(data.notOnlineImage))\n                }\n                data.customFace != null -> {\n                    collect(OnlineGroupImageImpl(data.customFace))\n                    data.customFace.pbReserve.let {\n                        if (it.isNotEmpty() && it.loadAs(CustomFace.ResvAttr.serializer()).msgImageShow != null) {\n                            collect(ShowImageFlag)\n                        }\n                    }\n                }\n                data.commonElem != null && data.commonElem.serviceType == 48 -> {\n                    collect(OnlineNewTechImageImpl(data.commonElem))\n                }\n                else -> {\n                    markNotConsumed()\n                }\n            }\n        }\n\n    }\n\n    private class ImageEncoder : MessageEncoder<AbstractImage> {\n        override suspend fun MessageEncoderContext.process(data: AbstractImage) {\n            markAsConsumed()\n\n            when (data) {\n                is OfflineGroupImage -> {\n                    if (contact is User) {\n                        collect(ImMsgBody.Elem(notOnlineImage = data.toJceData().toNotOnlineImage()))\n                    } else {\n                        collect(ImMsgBody.Elem(customFace = data.toJceData()))\n                    }\n                }\n                is OnlineGroupImageImpl -> {\n                    if (contact is User) {\n                        collect(ImMsgBody.Elem(notOnlineImage = data.delegate.toNotOnlineImage()))\n                    } else {\n                        collect(ImMsgBody.Elem(customFace = data.delegate))\n                    }\n                }\n                is OnlineFriendImageImpl -> {\n                    if (contact is User) {\n                        collect(ImMsgBody.Elem(notOnlineImage = data.delegate))\n                    } else {\n                        collect(ImMsgBody.Elem(customFace = data.delegate.toCustomFace()))\n                    }\n                }\n                is OfflineFriendImage -> {\n                    if (contact is User) {\n                        collect(ImMsgBody.Elem(notOnlineImage = data.toJceData()))\n                    } else {\n                        collect(ImMsgBody.Elem(customFace = data.toJceData().toCustomFace()))\n                    }\n                }\n                is OnlineNewTechImageImpl -> {\n                    collect(ImMsgBody.Elem(commonElem = data.commonElem))\n                }\n            }\n        }\n\n        companion object {\n            private fun OfflineGroupImage.toJceData(): ImMsgBody.CustomFace {\n                return ImMsgBody.CustomFace(\n                    fileId = this.fileId ?: 0,\n                    filePath = this.imageId,\n                    picMd5 = this.md5,\n                    flag = ByteArray(4),\n                    size = size.toInt(),\n                    width = width.coerceAtLeast(1),\n                    height = height.coerceAtLeast(1),\n                    imageType = getIdByImageType(imageType),\n                    origin = if (imageType == ImageType.GIF) {\n                        0\n                    } else {\n                        1\n                    },\n                    //_400Height = 235,\n                    //_400Url = \"/gchatpic_new/000000000/1041235568-2195821338-01E9451B70EDEAE3B37C101F1EEBF5B5/400?term=2\",\n                    //_400Width = 351,\n                    //        pbReserve = \"08 00 10 00 32 00 50 00 78 08\".autoHexToBytes(),\n                    bizType = 5,\n                    fileType = 66,\n                    useful = 1,\n                    //  pbReserve = CustomFaceExtPb.ResvAttr().toByteArray(CustomFaceExtPb.ResvAttr.serializer())\n                )\n            }\n\n            private fun ImMsgBody.CustomFace.toNotOnlineImage(): ImMsgBody.NotOnlineImage {\n                val resId = calculateResId()\n\n                return ImMsgBody.NotOnlineImage(\n                    filePath = filePath,\n                    resId = resId,\n                    oldPicMd5 = false,\n                    picWidth = width,\n                    picHeight = height,\n                    imgType = imageType,\n                    picMd5 = picMd5,\n                    fileLen = size.toLong(),\n                    oldVerSendFile = oldData,\n                    downloadPath = resId,\n                    original = origin,\n                    bizType = bizType,\n                    pbReserve = byteArrayOf(0x78, 0x02),\n                )\n            }\n\n            private fun ImMsgBody.NotOnlineImage.toCustomFace(): ImMsgBody.CustomFace {\n                return ImMsgBody.CustomFace(\n                    filePath = generateImageId(picMd5, getImageType(imgType)),\n                    picMd5 = picMd5,\n                    bizType = 5,\n                    fileType = 66,\n                    useful = 1,\n                    flag = ByteArray(4),\n                    bigUrl = bigUrl,\n                    origUrl = origUrl,\n                    width = picWidth.coerceAtLeast(1),\n                    height = picHeight.coerceAtLeast(1),\n                    imageType = imgType,\n                    //_400Height = 235,\n                    //_400Url = \"/gchatpic_new/000000000/1041235568-2195821338-01E9451B70EDEAE3B37C101F1EEBF5B5/400?term=2\",\n                    //_400Width = 351,\n                    origin = original,\n                    size = fileLen.toInt()\n                )\n            }\n\n            // aka friend image id\n            private fun ImMsgBody.NotOnlineImageOrCustomFace.calculateResId(): String {\n                val url = origUrl.takeIf { it.isNotBlank() }\n                    ?: thumbUrl.takeIf { it.isNotBlank() }\n                    ?: _400Url.takeIf { it.isNotBlank() }\n                    ?: \"\"\n\n                // gchatpic_new\n                // offpic_new\n                val picSenderId = url.substringAfter(\"pic_new/\").substringBefore(\"/\")\n                    .takeIf { it.isNotBlank() } ?: \"000000000\"\n                val unknownInt = url.substringAfter(\"-\").substringBefore(\"-\")\n                    .takeIf { it.isNotBlank() } ?: \"000000000\"\n\n                return \"/$picSenderId-$unknownInt-${picMd5.toUHexString(\"\")}\"\n            }\n\n\n            private fun OfflineFriendImage.toJceData(): ImMsgBody.NotOnlineImage {\n                val friendImageId = this.friendImageId\n                return ImMsgBody.NotOnlineImage(\n                    filePath = friendImageId,\n                    resId = friendImageId,\n                    oldPicMd5 = false,\n                    picMd5 = this.md5,\n                    fileLen = size,\n                    downloadPath = friendImageId,\n                    original = if (imageType == ImageType.GIF) {\n                        0\n                    } else {\n                        1\n                    },\n                    picWidth = width,\n                    picHeight = height,\n                    imgType = getIdByImageType(imageType),\n                    pbReserve = byteArrayOf(0x78, 0x02)\n                )\n            }\n\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/impl/LongMessageProtocol.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.internal.contact.AbstractContact\nimport net.mamoe.mirai.internal.contact.SendMessageStep\nimport net.mamoe.mirai.internal.contact.takeContent\nimport net.mamoe.mirai.internal.message.data.LongMessageInternal\nimport net.mamoe.mirai.internal.message.flags.DontAsLongMessage\nimport net.mamoe.mirai.internal.message.flags.ForceAsLongMessage\nimport net.mamoe.mirai.internal.message.flags.IgnoreLengthCheck\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.internal.message.protocol.outgoing.HighwayUploader\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.CONTACT\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.STEP\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.components\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessageTransformer\nimport net.mamoe.mirai.internal.network.components.ClockHolder\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.utils.truncated\n\ninternal class LongMessageProtocol : MessageProtocol() {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        add(OutgoingMessageTransformer {\n            currentMessageChain =\n                convertToLongMessageIfNeeded(\n                    currentMessageChain,\n                    attributes[STEP],\n                    attributes[CONTACT]\n                )\n        })\n    }\n\n    /**\n     * Convert to [LongMessageInternal] iff [SendMessageStep.FIRST] has failed.\n     */\n    private suspend fun OutgoingMessagePipelineContext.convertToLongMessageIfNeeded(\n        chain: MessageChain,\n        step: SendMessageStep,\n        contact: AbstractContact,\n    ): MessageChain {\n        val uploader = components[HighwayUploader]\n\n        suspend fun sendLongImpl(): MessageChain {\n            val time = components[ClockHolder].local.currentTimeSeconds()\n            val resId = uploader.uploadLongMessage(contact, components, chain, time.toInt())\n            return chain + createLongMessage(\n                brief = chain.takeContent(27),\n                resId = resId,\n                timeSeconds = time\n            ) // LongMessageInternal replaces all contents and preserves metadata\n        }\n\n        return when (step) {\n            SendMessageStep.FIRST -> {\n                // 只需要在第一次发送的时候验证长度\n                // 后续重试直接跳过\n                if (chain.contains(ForceAsLongMessage)) {\n                    return sendLongImpl()\n                }\n\n                if (!chain.contains(IgnoreLengthCheck)) {\n                    chain.verifyLength(chain, contact)\n                }\n\n                chain\n            }\n            SendMessageStep.LONG_MESSAGE -> {\n                if (chain.contains(DontAsLongMessage)) chain // fragmented\n                else sendLongImpl()\n            }\n            SendMessageStep.FRAGMENTED -> chain\n        }\n    }\n\n    private fun createLongMessage(brief: String, resId: String, timeSeconds: Long): LongMessageInternal {\n        val limited: String = brief.truncated(30)\n        val template = \"\"\"\n                <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\n                <msg serviceID=\"35\" templateID=\"1\" action=\"viewMultiMsg\"\n                     brief=\"$limited\"\n                     m_resid=\"$resId\"\n                     m_fileName=\"$timeSeconds\" sourceMsgId=\"0\" url=\"\"\n                     flag=\"3\" adverSign=\"0\" multiMsgFlag=\"1\">\n                    <item layout=\"1\">\n                        <title>$limited</title>\n                        <hr hidden=\"false\" style=\"0\"/>\n                        <summary>点击查看完整消息</summary>\n                    </item>\n                    <source name=\"聊天记录\" icon=\"\" action=\"\" appid=\"-1\"/>\n                </msg>\n            \"\"\".trimIndent().trim()\n\n        return LongMessageInternal(template, resId)\n    }\n\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/impl/MarketFaceProtocol.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.internal.message.data.MarketFaceImpl\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoder\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderContext\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoder\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext.Companion.collectGeneralFlags\nimport net.mamoe.mirai.internal.message.protocol.serialization.MessageSerializer\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.copy\nimport net.mamoe.mirai.utils.hexToBytes\nimport net.mamoe.mirai.utils.map\n\n\ninternal class MarketFaceProtocol : MessageProtocol() {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        add(DiceEncoder())\n        add(RockPaperScissorsEncoder())\n        add(MarketFaceImplEncoder())\n\n        add(MarketFaceDecoder())\n\n\n        // Serialization overview:\n        // Using MarketFace as serial type:\n        // - convert data to MarketFaceImpl on serialization. Convert them back to subtypes on deserialization.\n        // - serial name is always \"MarketFace\"\n        // Using subtypes:\n        // - serial name is name of subtype, i.e. \"MarketFace\" / \"Dice\".\n        // - Note that we don't use MarketFaceImpl but MarketFace for compatibility concerns.\n\n        add(\n            MessageSerializer(\n                MarketFace::class, MarketFaceImpl.serializer().map(\n                    resultantDescriptor = MarketFaceImpl.serializer().descriptor.copy(MarketFace.SERIAL_NAME),\n                    deserialize = {\n                        it.delegate.toDiceOrNull() ?: it.delegate.toRockPaperScissorsOrNull() ?: it\n                    },\n                    serialize = {\n                        when (it) {\n                            is Dice -> MarketFaceImpl(it.toJceStruct())\n                            is RockPaperScissors -> MarketFaceImpl(it.toJceStruct())\n                            is MarketFaceImpl -> it\n                            else -> {\n                                error(\"Unsupported MarketFace type ${it::class.qualifiedName}\")\n                            }\n                        }\n                    }\n                ), emptyArray()\n            )\n        )\n\n        MessageSerializer.superclassesScope(MarketFace::class, MessageContent::class, SingleMessage::class) {\n            add(MessageSerializer(MarketFaceImpl::class, MarketFaceImpl.serializer()))\n            add(MessageSerializer(Dice::class, Dice.serializer()))\n            add(MessageSerializer(RockPaperScissors::class, RockPaperScissors.serializer()))\n        }\n    }\n\n    private class MarketFaceImplEncoder : MessageEncoder<MarketFaceImpl> {\n        override suspend fun MessageEncoderContext.process(data: MarketFaceImpl) {\n            collect(ImMsgBody.Elem(marketFace = data.delegate))\n            processAlso(PlainText(data.name))\n            collect(ImMsgBody.Elem(extraInfo = ImMsgBody.ExtraInfo(flags = 8, groupMask = 1)))\n            collectGeneralFlags {\n                ImMsgBody.Elem(generalFlags = ImMsgBody.GeneralFlags(pbReserve = PB_RESERVE_FOR_MARKET_FACE))\n            }\n        }\n\n        private companion object {\n            private val PB_RESERVE_FOR_MARKET_FACE =\n                \"02 78 80 80 04 C8 01 00 F0 01 00 F8 01 00 90 02 00 C8 02 00 98 03 00 A0 03 00 B0 03 00 C0 03 00 D0 03 00 E8 03 00 8A 04 04 08 02 10 3B 90 04 80 C0 80 80 04 B8 04 00 C0 04 00 CA 04 00 F8 04 80 80 04 88 05 00\".hexToBytes()\n        }\n    }\n\n    private class DiceEncoder : MessageEncoder<Dice> {\n        override suspend fun MessageEncoderContext.process(data: Dice) {\n            markAsConsumed()\n            processAlso(MarketFaceImpl(data.toJceStruct()))\n        }\n    }\n\n    private class RockPaperScissorsEncoder : MessageEncoder<RockPaperScissors> {\n        override suspend fun MessageEncoderContext.process(data: RockPaperScissors) {\n            markAsConsumed()\n            processAlso(MarketFaceImpl(data.toJceStruct()))\n        }\n    }\n\n    private class MarketFaceDecoder : MessageDecoder {\n        override suspend fun MessageDecoderContext.process(data: ImMsgBody.Elem) {\n            val proto = data.marketFace ?: return\n\n            proto.toDiceOrNull()?.let {\n                collect(it)\n                return\n            }\n\n            proto.toRockPaperScissorsOrNull()?.let {\n                collect(it)\n                return\n            }\n\n            collect(MarketFaceImpl(proto))\n        }\n    }\n\n\n    private companion object {\n        /**\n         * PC 客户端没有 [ImMsgBody.MarketFace.mobileParam], 是按 [ImMsgBody.MarketFace.faceId] 发的...\n         */\n        @Suppress(\"SpellCheckingInspection\")\n        private val DICE_PC_FACE_IDS = mapOf(\n            1 to \"E6EEDE15CDFBEB4DF0242448535354F1\".hexToBytes(),\n            2 to \"C5A95816FB5AFE34A58AF0E837A3B5A0\".hexToBytes(),\n            3 to \"382131D722EEA4624F087C5B8035AF5F\".hexToBytes(),\n            4 to \"FA90E956DCAD76742F2DB87723D3B669\".hexToBytes(),\n            5 to \"D51FA892017647431BB243920EC9FB8E\".hexToBytes(),\n            6 to \"7A2303AD80755FCB6BBFAC38327E0C01\".hexToBytes(),\n        )\n\n        private val RPS_PC_FACE_IDS = mapOf(\n            48 to \"E5D889F1DF79B2B45183F625584465D3\".hexToBytes(),\n            49 to \"628FA4AB7B6C2BCCFCDCD0C2DAF7A60C\".hexToBytes(),\n            50 to \"457CDE420F598EB424CED2E905D38D8B\".hexToBytes(),\n        )\n\n        private fun ImMsgBody.MarketFace.toDiceOrNull(): Dice? {\n            if (this.tabId != 11464) return null\n            val value = when {\n                mobileParam.isNotEmpty() -> mobileParam.lastOrNull()?.toInt()?.and(0xff)?.minus(47) ?: return null\n                else -> DICE_PC_FACE_IDS.entries.find { it.value.contentEquals(faceId) }?.key ?: return null\n            }\n            if (value in 1..6) {\n                return Dice(value)\n            }\n            return null\n        }\n\n        private fun ImMsgBody.MarketFace.toRockPaperScissorsOrNull(): RockPaperScissors? {\n            if (tabId != 11415) return null\n\n            val value = when {\n                mobileParam.isNotEmpty() -> {\n                    val theLast = mobileParam.lastOrNull() ?: return null\n                    theLast.toInt().and(0xff)\n                }\n                else -> RPS_PC_FACE_IDS.entries.find { it.value.contentEquals(faceId) }?.key ?: return null\n            }\n\n            return when (value) {\n                48 -> RockPaperScissors.ROCK\n                49 -> RockPaperScissors.SCISSORS\n                50 -> RockPaperScissors.PAPER\n\n                else -> null\n            }\n        }\n\n        // From https://github.com/mamoe/mirai/issues/1012\n        private fun Dice.toJceStruct(): ImMsgBody.MarketFace {\n            return ImMsgBody.MarketFace(\n                faceName = byteArrayOf(91, -23, -86, -80, -27, -83, -112, 93),\n                itemType = 6,\n                faceInfo = 1,\n                faceId = byteArrayOf(\n                    72, 35, -45, -83, -79, 93,\n                    -16, -128, 20, -50, 93, 103,\n                    -106, -73, 110, -31\n                ),\n                tabId = 11464,\n                subType = 3,\n                key = byteArrayOf(52, 48, 57, 101, 50, 97, 54, 57, 98, 49, 54, 57, 49, 56, 102, 57),\n                mediaType = 0,\n                imageWidth = 200,\n                imageHeight = 200,\n                mobileParam = byteArrayOf(\n                    114, 115, 99, 84, 121, 112, 101,\n                    63, 49, 59, 118, 97, 108, 117,\n                    101, 61,\n                    (47 + value).toByte()\n                ),\n                pbReserve = byteArrayOf(\n                    10, 6, 8, -56, 1, 16, -56, 1, 64,\n                    1, 88, 0, 98, 9, 35, 48, 48, 48,\n                    48, 48, 48, 48, 48, 106, 9, 35,\n                    48, 48, 48, 48, 48, 48, 48, 48\n                )\n            )\n        }\n\n        private fun RockPaperScissors.toJceStruct(): ImMsgBody.MarketFace {\n            return ImMsgBody.MarketFace(\n                faceName = byteArrayOf(91, -25, -116, -100, -26, -117, -77, 93),\n                itemType = 6,\n                faceInfo = 1,\n                faceId = byteArrayOf(\n                    -125, -56, -94, -109, -82,\n                    101, -54, 20, 15, 52,\n                    -127, 32, -89, 116, 72, -18\n                ),\n                tabId = 11415,\n                subType = 3,\n                key = byteArrayOf(55, 100, 101, 51, 57, 102, 101, 98, 99, 102, 52, 53, 101, 54, 100, 98),\n                mediaType = 0,\n                imageWidth = 200,\n                imageHeight = 200,\n                mobileParam = byteArrayOf(\n                    114, 115, 99, 84, 121, 112, 101,\n                    63, 49, 59, 118, 97, 108, 117,\n                    101, 61,\n                    internalId\n                ),\n                pbReserve = byteArrayOf(10, 6, 8, -56, 1, 16, -56, 1, 64, 1)\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/impl/MusicShareProtocol.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.AbstractContact\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoder\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext\nimport net.mamoe.mirai.internal.message.protocol.outgoing.MessageProtocolStrategy\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.CONTACT\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.ORIGINAL_MESSAGE_AS_CHAIN\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePipelineContext.Companion.components\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessageSender\nimport net.mamoe.mirai.internal.message.protocol.serialization.MessageSerializer\nimport net.mamoe.mirai.internal.message.source.createMessageReceipt\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.MusicSharePacket\nimport net.mamoe.mirai.message.data.*\n\ninternal class MusicShareProtocol : MessageProtocol() {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        add(Encoder())\n        // no decoder. refined from LightApp\n//        add(Decoder())\n\n        add(Sender())\n\n        MessageSerializer.superclassesScope(MessageContent::class, SingleMessage::class) {\n            add(MessageSerializer(MusicShare::class, MusicShare.serializer(), registerAlsoContextual = true))\n        }\n    }\n\n    private class Encoder : MessageEncoder<MusicShare> {\n        override suspend fun MessageEncoderContext.process(data: MusicShare) {\n            markAsConsumed()\n            // 只有在 QuoteReply 的 source 里才会进行 MusicShare 转换, 因此可以转 PT.\n            // 发送消息时会被特殊处理\n            processAlso(PlainText(data.content))\n        }\n    }\n\n    open class Sender : OutgoingMessageSender {\n        override suspend fun OutgoingMessagePipelineContext.process() {\n            val musicShare = currentMessageChain[MusicShare] ?: return\n            markAsConsumed()\n\n            val contact = attributes[CONTACT]\n            val strategy = components[MessageProtocolStrategy]\n            val bot = contact.bot\n\n            sendMusicSharePacket(bot, musicShare, contact, strategy)\n\n            val source = strategy.constructSourceForSpecialMessage(attributes[ORIGINAL_MESSAGE_AS_CHAIN], 3116)\n            source.tryEnsureSequenceIdAvailable()\n\n            collect(source.createMessageReceipt(contact, true))\n        }\n\n        protected open suspend fun sendMusicSharePacket(\n            bot: QQAndroidBot,\n            musicShare: MusicShare,\n            contact: AbstractContact,\n            strategy: MessageProtocolStrategy<*>\n        ) {\n            val packet = MusicSharePacket(\n                bot.client, musicShare, contact.id,\n                targetKind = if (contact is Group) MessageSourceKind.GROUP else MessageSourceKind.FRIEND // always FRIEND\n            )\n            val result = strategy.sendPacket(bot, packet)\n            result.pkg.checkSuccess(\"send music share\")\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/impl/PokeMessageProtocol.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoder\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderContext\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoder\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext\nimport net.mamoe.mirai.internal.message.protocol.serialization.MessageSerializer\nimport net.mamoe.mirai.internal.network.protocol.data.proto.HummerCommelem\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.message.data.MessageContent\nimport net.mamoe.mirai.message.data.PlainText\nimport net.mamoe.mirai.message.data.PokeMessage\nimport net.mamoe.mirai.message.data.SingleMessage\n\ninternal class PokeMessageProtocol : MessageProtocol() {\n    companion object {\n        val UNSUPPORTED_POKE_MESSAGE_PLAIN = PlainText(\"[戳一戳]请使用最新版手机QQ体验新功能。\")\n    }\n\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        add(Encoder())\n        add(Decoder())\n\n        MessageSerializer.superclassesScope(MessageContent::class, SingleMessage::class) {\n            add(MessageSerializer(PokeMessage::class, PokeMessage.serializer()))\n        }\n    }\n\n    private class Encoder : MessageEncoder<PokeMessage> {\n        override suspend fun MessageEncoderContext.process(data: PokeMessage) {\n            markAsConsumed()\n            collect(\n                ImMsgBody.Elem(\n                    commonElem = ImMsgBody.CommonElem(\n                        serviceType = 2,\n                        businessType = data.pokeType,\n                        pbElem = HummerCommelem.MsgElemInfoServtype2(\n                            pokeType = data.pokeType,\n                            vaspokeId = data.id,\n                            vaspokeMinver = \"7.2.0\",\n                            vaspokeName = data.name\n                        ).toByteArray(HummerCommelem.MsgElemInfoServtype2.serializer())\n                    )\n                )\n            )\n            processAlso(UNSUPPORTED_POKE_MESSAGE_PLAIN)\n        }\n    }\n\n    private class Decoder : MessageDecoder {\n        override suspend fun MessageDecoderContext.process(data: ImMsgBody.Elem) {\n            if (data.commonElem == null) return\n            if (data.commonElem.serviceType != 2) return\n            markAsConsumed()\n\n            val proto =\n                data.commonElem.pbElem.loadAs(HummerCommelem.MsgElemInfoServtype2.serializer())\n            val name = proto.vaspokeName.takeIf { it.isNotEmpty() }\n                ?: PokeMessage.values.firstOrNull { it.id == proto.vaspokeId && it.pokeType == proto.pokeType }?.name\n                    .orEmpty()\n            collect(\n                PokeMessage(\n                    name = name,\n                    pokeType = proto.pokeType,\n                    id = proto.vaspokeId\n                )\n            )\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/impl/PttMessageProtocol.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoder\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext.Companion.collectGeneralFlags\nimport net.mamoe.mirai.internal.message.protocol.serialization.MessageSerializer\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.hexToBytes\n\ninternal class PttMessageProtocol : MessageProtocol() {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n\n        add(Encoder())\n\n        MessageSerializer.superclassesScope(MessageContent::class, SingleMessage::class) {\n            add(MessageSerializer(At::class, At.serializer()))\n            add(MessageSerializer(AtAll::class, AtAll.serializer()))\n            add(MessageSerializer(PlainText::class, PlainText.serializer()))\n        }\n    }\n\n    private class Encoder : MessageEncoder<PttMessage> {\n        override suspend fun MessageEncoderContext.process(data: PttMessage) {\n            markAsConsumed()\n            collect(\n                ImMsgBody.Elem(\n                    extraInfo = ImMsgBody.ExtraInfo(flags = 16, groupMask = 1)\n                )\n            )\n            collect(\n                ImMsgBody.Elem(\n                    elemFlags2 = ImMsgBody.ElemFlags2(\n                        vipStatus = 1\n                    )\n                )\n            )\n\n            collectGeneralFlags {\n                ImMsgBody.Elem(generalFlags = ImMsgBody.GeneralFlags(pbReserve = PB_RESERVE_FOR_PTT))\n            }\n        }\n\n        private companion object {\n            private val PB_RESERVE_FOR_PTT =\n                \"78 00 F8 01 00 C8 02 00 AA 03 26 08 22 12 22 41 20 41 3B 25 3E 16 45 3F 43 2F 29 3E 44 24 14 18 46 3D 2B 4A 44 3A 18 2E 19 29 1B 26 32 31 31 29 43\".hexToBytes()\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/impl/QuoteReplyProtocol.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.contact.AnonymousMember\nimport net.mamoe.mirai.internal.message.MessageSourceSerializerImpl\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoder\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderContext\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderContext.Companion.BOT\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderContext.Companion.GROUP_ID\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderContext.Companion.MESSAGE_SOURCE_KIND\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoder\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessagePreprocessor\nimport net.mamoe.mirai.internal.message.protocol.serialization.MessageSerializer\nimport net.mamoe.mirai.internal.message.source.*\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.map\n\ninternal class QuoteReplyProtocol : MessageProtocol(PRIORITY_METADATA) {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        add(Encoder())\n        add(Decoder())\n\n        add(OutgoingMessagePreprocessor {\n            currentMessageChain[QuoteReply]?.source?.ensureSequenceIdAvailable()\n        })\n\n        MessageSerializer.superclassesScope(MessageSource::class, MessageMetadata::class, SingleMessage::class) {\n            add(\n                MessageSerializer(\n                    OnlineMessageSourceFromGroupImpl::class,\n                    OnlineMessageSourceFromGroupImpl.serializer()\n                )\n            )\n            add(\n                MessageSerializer(\n                    OnlineMessageSourceFromFriendImpl::class,\n                    OnlineMessageSourceFromFriendImpl.serializer()\n                )\n            )\n            add(\n                MessageSerializer(\n                    OnlineMessageSourceFromTempImpl::class,\n                    OnlineMessageSourceFromTempImpl.serializer()\n                )\n            )\n            add(\n                MessageSerializer(\n                    OnlineMessageSourceFromStrangerImpl::class,\n                    OnlineMessageSourceFromStrangerImpl.serializer()\n                )\n            )\n            add(\n                MessageSerializer(\n                    OnlineMessageSourceToGroupImpl::class,\n                    OnlineMessageSourceToGroupImpl.serializer()\n                )\n            )\n            add(\n                MessageSerializer(\n                    OnlineMessageSourceToFriendImpl::class,\n                    OnlineMessageSourceToFriendImpl.serializer()\n                )\n            )\n            add(\n                MessageSerializer(\n                    OnlineMessageSourceToTempImpl::class,\n                    OnlineMessageSourceToTempImpl.serializer()\n                )\n            )\n            add(\n                MessageSerializer(\n                    OnlineMessageSourceToStrangerImpl::class,\n                    OnlineMessageSourceToStrangerImpl.serializer()\n                )\n            )\n            add(\n                MessageSerializer(\n                    OfflineMessageSourceImplData::class,\n                    OfflineMessageSourceImplData.serializer()\n                )\n            )\n\n        }\n\n        MessageSerializer.superclassesScope(MessageMetadata::class, SingleMessage::class) {\n            @Suppress(\"DEPRECATION\")\n            add(\n                MessageSerializer(\n                    MessageSource::class,\n                    OfflineMessageSourceImplData.serializer().map(\n                        MessageSourceSerializerImpl.serialDataSerializer().descriptor,\n                        { it },\n                        {\n                            OfflineMessageSourceImplData(\n                                kind, ids, botId, time, fromId, targetId,\n                                originalMessage, internalIds\n                            )\n                        }\n                    ),\n                    registerAlsoContextual = true\n                )\n            )\n        }\n\n//        add(\n//            MessageSerializer(\n//                MessageSource::class,\n//                PolymorphicSerializer(MessageSource::class),\n//                emptyArray(),\n//                registerAlsoContextual = true\n//            )\n//        )\n\n        MessageSerializer.superclassesScope(MessageMetadata::class, SingleMessage::class) {\n            add(MessageSerializer(QuoteReply::class, QuoteReply.serializer()))\n            @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n            add(MessageSerializer(ShowImageFlag::class, ShowImageFlag.Serializer))\n            add(MessageSerializer(MessageOrigin::class, MessageOrigin.serializer()))\n        }\n    }\n\n    private class Decoder : MessageDecoder {\n        override suspend fun MessageDecoderContext.process(data: ImMsgBody.Elem) {\n            if (data.srcMsg == null) return\n            markAsConsumed()\n            collect(\n                QuoteReply(\n                    OfflineMessageSourceImplData(\n                        data.srcMsg,\n                        attributes[BOT],\n                        attributes[MESSAGE_SOURCE_KIND],\n                        attributes[GROUP_ID]\n                    )\n                )\n            )\n        }\n\n    }\n\n    private class Encoder : MessageEncoder<QuoteReply> {\n        override suspend fun MessageEncoderContext.process(data: QuoteReply) {\n            val source = data.source as? MessageSourceInternal ?: return\n            val sourceCommon = source as MessageSource\n\n            markAsConsumed()\n            collect(ImMsgBody.Elem(srcMsg = source.toJceData()))\n            if (sourceCommon.kind == MessageSourceKind.GROUP) {\n                fun isPlusNeed(): Boolean {\n                    if (source is OnlineMessageSource.Incoming.FromGroup) {\n                        try {\n                            val sender0 = source.sender\n                            return sender0 !is AnonymousMember\n                        } catch (_: IllegalStateException) {\n                            // Member not available now\n                        }\n                    }\n\n                    return sourceCommon.fromId != 80000000L // #2501\n                }\n\n                if (isPlusNeed()) {\n                    processAlso(At(sourceCommon.fromId))\n\n                    // transformOneMessage(PlainText(\" \"))\n                    // removed by https://github.com/mamoe/mirai/issues/524\n                    // 发送 QuoteReply 消息时无可避免的产生多余空格 #524\n                }\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/impl/RichMessageProtocol.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.message.data.ForwardMessageInternal\nimport net.mamoe.mirai.internal.message.data.LightAppInternal\nimport net.mamoe.mirai.internal.message.data.LongMessageInternal\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoder\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderContext\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoder\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext.Companion.collectGeneralFlags\nimport net.mamoe.mirai.internal.message.protocol.serialization.MessageSerializer\nimport net.mamoe.mirai.internal.message.runWithBugReport\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.*\n\n/**\n * Handles:\n * - [RichMessage]\n * - [LongMessageInternal]\n * - [ServiceMessage]\n * - [ForwardMessage]\n */\ninternal class RichMessageProtocol : MessageProtocol() {\n    companion object {\n        val UNSUPPORTED_MERGED_MESSAGE_PLAIN = PlainText(\"你的QQ暂不支持查看[转发多条消息]，请期待后续版本。\")\n    }\n\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        add(RichMsgDecoder())\n        add(LightAppDecoder())\n\n        add(Encoder())\n\n        MessageSerializer.superclassesScope(\n            ServiceMessage::class,\n            RichMessage::class,\n            MessageContent::class,\n            SingleMessage::class\n        ) {\n            add(MessageSerializer(SimpleServiceMessage::class, SimpleServiceMessage.serializer()))\n        }\n\n        MessageSerializer.superclassesScope(RichMessage::class, MessageContent::class, SingleMessage::class) {\n            add(MessageSerializer(LightApp::class, LightApp.serializer()))\n        }\n\n        add(MessageSerializer(MessageOriginKind::class, MessageOriginKind.serializer(), emptyArray()))\n    }\n\n    private class Encoder : MessageEncoder<RichMessage> {\n        override suspend fun MessageEncoderContext.process(data: RichMessage) {\n            markAsConsumed()\n            val content = data.content.toByteArray().deflate()\n            var longTextResId: String? = null\n            when (data) {\n                is ForwardMessageInternal -> {\n                    collect(\n                        ImMsgBody.Elem(\n                            richMsg = ImMsgBody.RichMsg(\n                                serviceId = data.serviceId, // ok\n                                template1 = byteArrayOf(1) + content\n                            )\n                        )\n                    )\n                    // transformOneMessage(UNSUPPORTED_MERGED_MESSAGE_PLAIN)\n                }\n                is LongMessageInternal -> {\n                    collect(\n                        ImMsgBody.Elem(\n                            richMsg = ImMsgBody.RichMsg(\n                                serviceId = data.serviceId, // ok\n                                template1 = byteArrayOf(1) + content\n                            )\n                        )\n                    )\n                    processAlso(UNSUPPORTED_MERGED_MESSAGE_PLAIN)\n                    longTextResId = data.resId\n                }\n                is LightApp -> collect(\n                    ImMsgBody.Elem(\n                        lightApp = ImMsgBody.LightAppElem(\n                            data = byteArrayOf(1) + content\n                        )\n                    )\n                )\n                else -> collect(\n                    ImMsgBody.Elem(\n                        richMsg = ImMsgBody.RichMsg(\n                            serviceId = when (data) {\n                                is ServiceMessage -> data.serviceId\n                                else -> error(\"unsupported RichMessage: ${data::class.simpleName}\")\n                            },\n                            template1 = byteArrayOf(1) + content\n                        )\n                    )\n                )\n            }\n\n            collectGeneralFlags {\n                if (longTextResId != null) {\n                    ImMsgBody.Elem(\n                        generalFlags = ImMsgBody.GeneralFlags(\n                            longTextFlag = 1,\n                            longTextResid = longTextResId,\n                            pbReserve = \"78 00 F8 01 00 C8 02 00\".hexToBytes()\n                        )\n                    )\n                } else {\n                    // 08 09 78 00 A0 01 81 DC 01 C8 01 00 F0 01 00 F8 01 00 90 02 00 98 03 00 A0 03 20 B0 03 00 C0 03 00 D0 03 00 E8 03 00 8A 04 02 08 03 90 04 80 80 80 10 B8 04 00 C0 04 00\n                    ImMsgBody.Elem(generalFlags = ImMsgBody.GeneralFlags(pbReserve = PB_RESERVE_FOR_RICH_MESSAGE))\n                }\n            }\n        }\n\n        private companion object {\n            private val PB_RESERVE_FOR_RICH_MESSAGE =\n                \"08 09 78 00 C8 01 00 F0 01 00 F8 01 00 90 02 00 C8 02 00 98 03 00 A0 03 20 B0 03 00 C0 03 00 D0 03 00 E8 03 00 8A 04 02 08 03 90 04 80 80 80 10 B8 04 00 C0 04 00\".hexToBytes()\n        }\n    }\n\n    private class LightAppDecoder : MessageDecoder {\n        override suspend fun MessageDecoderContext.process(data: ImMsgBody.Elem) {\n            val lightApp = data.lightApp ?: return\n            markAsConsumed()\n\n            val content = runWithBugReport(\"解析 lightApp\",\n                { \"resId=\" + lightApp.msgResid + \"data=\" + lightApp.data.toUHexString() }) {\n                when (lightApp.data[0].toInt()) {\n                    0 -> lightApp.data.decodeToString(startIndex = 1)\n                    1 -> lightApp.data.toReadPacket(offset = 1).inflateInput().readAllText()\n                    else -> error(\"unknown compression flag=${lightApp.data[0]}\")\n                }\n            }\n\n            collect(LightAppInternal(content))\n        }\n\n    }\n\n    private class RichMsgDecoder : MessageDecoder {\n        override suspend fun MessageDecoderContext.process(data: ImMsgBody.Elem) {\n            if (data.richMsg == null) return\n\n            val richMsg = data.richMsg\n\n            val content = runWithBugReport(\"解析 richMsg\", { richMsg.template1.toUHexString() }) {\n                when (richMsg.template1[0].toInt()) {\n                    0 -> richMsg.template1.decodeToString(startIndex = 1)\n                    1 -> richMsg.template1.toReadPacket(offset = 1).inflateInput().readAllText()\n                    else -> error(\"unknown compression flag=${richMsg.template1[0]}\")\n                }\n            }\n\n            fun findStringProperty(name: String): String {\n                return content.substringAfter(\"$name=\\\"\", \"\").substringBefore(\"\\\"\", \"\")\n            }\n\n            val serviceId = when (val sid = richMsg.serviceId) {\n                0 -> {\n                    val serviceIdStr = findStringProperty(\"serviceID\")\n                    if (serviceIdStr.isEmpty() || serviceIdStr.isBlank()) {\n                        0\n                    } else {\n                        serviceIdStr.toIntOrNull() ?: 0\n                    }\n                }\n                else -> sid\n            }\n            when (serviceId) {\n                // 5: 使用微博长图转换功能分享到QQ群\n                /*\n                            <?xml version=\"1.0\" encoding=\"utf-8\"?><msg serviceID=\"5\" templateID=\"12345\" brief=\"[分享]想要沐浴阳光，就别钻进\n        阴影。 ???\" ><item layout=\"0\"><image uuid=\"{E5F68BD5-05F8-148B-9DA7-FECD026D30AD}.jpg\" md5=\"E5F68BD505F8148B9DA7FECD026D\n        30AD\" GroupFiledid=\"2167263882\" minWidth=\"120\" minHeight=\"120\" maxWidth=\"180\" maxHeight=\"180\" /></item><source name=\"新\n        浪微博\" icon=\"http://i.gtimg.cn/open/app_icon/00/73/69/03//100736903_100_m.png\" appid=\"100736903\" action=\"\" i_actionData\n        =\"\" a_actionData=\"\" url=\"\"/></msg>\n                             */\n                /**\n                 * json?\n                 */\n                1 -> @Suppress(\"DEPRECATION_ERROR\")\n                collect(SimpleServiceMessage(1, content))\n                /**\n                 * [LongMessageInternal], [ForwardMessage]\n                 */\n                35 -> {\n\n                    val resId = findStringProperty(\"m_resid\")\n                    val fileName = findStringProperty(\"m_fileName\").takeIf { it.isNotEmpty() }\n\n                    val msg = if (resId.isEmpty()) {\n                        // Nested ForwardMessage\n                        if (fileName != null && findStringProperty(\"action\") == \"viewMultiMsg\") {\n                            ForwardMessageInternal(content, null, fileName)\n                        } else {\n                            SimpleServiceMessage(35, content)\n                        }\n                    } else when (findStringProperty(\"multiMsgFlag\").toIntOrNull()) {\n                        1 -> LongMessageInternal(content, resId)\n                        0 -> ForwardMessageInternal(content, resId, fileName)\n                        else -> {\n                            // from PC QQ\n                            if (findStringProperty(\"action\") == \"viewMultiMsg\") {\n                                ForwardMessageInternal(content, resId, fileName)\n                            } else {\n                                SimpleServiceMessage(35, content)\n                            }\n                        }\n                    }\n\n                    collect(msg)\n                }\n\n                // 104 新群员入群的消息\n                else -> {\n                    collect(SimpleServiceMessage(serviceId, content))\n                }\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/impl/ShortVideoProtocol.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.internal.message.data.AbstractShortVideoWithThumbnail\nimport net.mamoe.mirai.internal.message.data.OfflineShortVideoImpl\nimport net.mamoe.mirai.internal.message.data.OnlineShortVideoImpl\nimport net.mamoe.mirai.internal.message.data.OnlineShortVideoMsgInternal\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoder\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderContext\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoder\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext\nimport net.mamoe.mirai.internal.message.protocol.serialization.MessageSerializer\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.message.data.MessageContent\nimport net.mamoe.mirai.message.data.ShortVideo\nimport net.mamoe.mirai.message.data.SingleMessage\n\ninternal class ShortVideoProtocol : MessageProtocol() {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        add(Decoder())\n        add(Encoder())\n\n        MessageSerializer.superclassesScope(ShortVideo::class, MessageContent::class, SingleMessage::class) {\n            add(MessageSerializer(OfflineShortVideoImpl::class, OfflineShortVideoImpl.serializer()))\n            add(MessageSerializer(OnlineShortVideoImpl::class, OnlineShortVideoImpl.serializer()))\n        }\n    }\n\n    private class Decoder : MessageDecoder {\n        override suspend fun MessageDecoderContext.process(data: ImMsgBody.Elem) {\n            val videoFile = data.videoFile ?: return\n            markAsConsumed()\n\n            collect(OnlineShortVideoMsgInternal(videoFile))\n        }\n    }\n\n    private class Encoder : MessageEncoder<AbstractShortVideoWithThumbnail> {\n        override suspend fun MessageEncoderContext.process(data: AbstractShortVideoWithThumbnail) {\n            markAsConsumed()\n\n            collect(ImMsgBody.Elem(text = ImMsgBody.Text(\"你的 QQ 暂不支持查看视频短片，请期待后续版本。\")))\n\n            val thumbWidth = if (data.thumbnail.width == null || data.thumbnail.width == 0) 1280 else data.thumbnail.width!!\n            val thumbHeight = if (data.thumbnail.height == null || data.thumbnail.height == 0) 720 else data.thumbnail.height!!\n\n            collect(\n                ImMsgBody.Elem(\n                    videoFile = ImMsgBody.VideoFile(\n                        fileUuid = data.videoId.encodeToByteArray(),\n                        fileMd5 = data.fileMd5,\n                        fileName = data.filename.encodeToByteArray(),\n                        fileFormat = FORMAT.firstOrNull { it.first == data.fileFormat }?.second ?: 3,\n                        fileTime = 10,\n                        fileSize = data.fileSize.toInt(),\n                        thumbWidth = thumbWidth,\n                        thumbHeight = thumbHeight,\n                        thumbFileMd5 = data.thumbnail.md5,\n                        thumbFileSize = data.thumbnail.size.toInt(),\n                        busiType = 0,\n                        fromChatType = -1,\n                        toChatType = -1,\n                        boolSupportProgressive = true,\n                        fileWidth = thumbWidth,\n                        fileHeight = thumbHeight\n                    )\n                )\n            )\n        }\n\n    }\n\n     internal companion object {\n         internal val FORMAT: List<Pair<String, Int>> = listOf(\n             \"ts\" to 1,\n             \"avi\" to 2,\n             \"mp4\" to 3,\n             \"wmv\" to 4,\n             \"mkv\" to 5,\n             \"rmvb\" to 6,\n             \"rm\" to 7,\n             \"afs\" to 8,\n             \"mov\" to 9,\n             \"mod\" to 10,\n             \"mts\" to 11\n         )\n     }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/impl/SuperFaceProtocol.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoder\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderContext\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoder\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext.Companion.collectGeneralFlags\nimport net.mamoe.mirai.internal.message.protocol.serialization.MessageSerializer\nimport net.mamoe.mirai.internal.network.protocol.data.proto.HummerCommelem\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.message.data.*\nimport kotlin.text.toByteArray\n\ninternal class SuperFaceProtocol : MessageProtocol() {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        add(Decoder())\n        add(Encoder())\n\n        MessageSerializer.superclassesScope(MessageContent::class, SingleMessage::class) {\n            add(MessageSerializer(SuperFace::class, SuperFace.serializer()))\n        }\n    }\n\n    private class Decoder : MessageDecoder {\n        override suspend fun MessageDecoderContext.process(data: ImMsgBody.Elem) {\n            if (data.commonElem == null) return\n            if (data.commonElem.serviceType != 37) return\n\n            markAsConsumed()\n\n            val proto = data.commonElem.pbElem.loadAs(HummerCommelem.MsgElemInfoServtype37.serializer())\n            collect(SuperFace(face = proto.qsId, id = proto.stickerId.decodeToString(), type = proto.stickerType))\n        }\n    }\n\n    private class Encoder : MessageEncoder<SuperFace> {\n        override suspend fun MessageEncoderContext.process(data: SuperFace) {\n            markAsConsumed()\n\n            collect(ImMsgBody.Elem(commonElem = data.toCommData()))\n            processAlso(PlainText(\"/${data.name}\"))\n            collectGeneralFlags {\n                ImMsgBody.Elem(\n                    generalFlags = ImMsgBody.GeneralFlags(\n                        pbReserve = ImMsgBody.Text(str = \"[${data.name}]请使用最新版手机QQ体验新功能\")\n                            .toByteArray(ImMsgBody.Text.serializer())\n                    )\n                )\n            }\n        }\n    }\n\n    companion object {\n        fun SuperFace.toCommData(): ImMsgBody.CommonElem {\n            return ImMsgBody.CommonElem(\n                serviceType = 37,\n                pbElem = HummerCommelem.MsgElemInfoServtype37(\n                    packId = \"1\".encodeToByteArray(),\n                    stickerId = id.encodeToByteArray(),\n                    qsId = face,\n                    sourceType = 1,\n                    stickerType = type,\n                    text = \"/${name}\".toByteArray(),\n                    randomType = 1\n                ).toByteArray(HummerCommelem.MsgElemInfoServtype37.serializer()),\n                businessType = type\n            )\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/impl/TextProtocol.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmName(\"TextProtocol_common\")\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.nameCardOrNick\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoder\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderContext\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoder\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext.Companion.CONTACT\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext.Companion.isForward\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext.Companion.originalMessage\nimport net.mamoe.mirai.internal.message.protocol.serialization.MessageSerializer\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.read\nimport net.mamoe.mirai.utils.safeCast\nimport kotlin.jvm.JvmName\n\n/**\n * For [PlainText] and [At]\n */\ninternal class TextProtocol : MessageProtocol() {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        add(PlainTextEncoder())\n        add(AtEncoder())\n        add(AtAllEncoder())\n\n        add(Decoder())\n\n        MessageSerializer.superclassesScope(MessageContent::class, SingleMessage::class) {\n            add(MessageSerializer(PlainText::class, PlainText.serializer(), registerAlsoContextual = true))\n            add(MessageSerializer(At::class, At.serializer(), registerAlsoContextual = true))\n            add(MessageSerializer(AtAll::class, AtAll.serializer(), registerAlsoContextual = true))\n            add(MessageSerializer(Face::class, Face.serializer(), registerAlsoContextual = true))\n        }\n    }\n\n    private class Decoder : MessageDecoder {\n        override suspend fun MessageDecoderContext.process(data: ImMsgBody.Elem) {\n            val text = data.text ?: return\n            markAsConsumed()\n            if (text.attr6Buf.isEmpty()) {\n                collect(PlainText(text.str))\n            } else {\n                val id = text.attr6Buf.read {\n                    discardExact(7)\n                    readInt().toUInt().toLong()\n                }\n                if (id == 0L) {\n                    collect(AtAll)\n                } else {\n                    collect(At(id)) // element.text.str\n                }\n            }\n\n        }\n    }\n\n    private class PlainTextEncoder : MessageEncoder<PlainText> {\n        override suspend fun MessageEncoderContext.process(data: PlainText) {\n            markAsConsumed()\n            collect(ImMsgBody.Elem(text = ImMsgBody.Text(str = data.content)))\n        }\n    }\n\n    private class AtEncoder : MessageEncoder<At> {\n        override suspend fun MessageEncoderContext.process(data: At) {\n            markAsConsumed()\n            collected += ImMsgBody.Elem(\n                text = data.toJceData(\n                    attributes[CONTACT].safeCast(),\n                    originalMessage.sourceOrNull,\n                    isForward,\n                )\n            )\n            // elements.add(ImMsgBody.Elem(text = ImMsgBody.Text(str = \" \")))\n            // removed by https://github.com/mamoe/mirai/issues/524\n            // 发送 QuoteReply 消息时无可避免的产生多余空格 #524\n        }\n\n        private fun At.toJceData(\n            group: Group?,\n            source: MessageSource?,\n            isForward: Boolean,\n        ): ImMsgBody.Text {\n            fun findFromGroup(g: Group?): String? {\n                return g?.members?.get(this.target)?.nameCardOrNick\n            }\n\n            fun findFromSource(): String? {\n                return when (source) {\n                    is OnlineMessageSource -> {\n                        return findFromGroup(source.target.safeCast())\n                    }\n                    is OfflineMessageSource -> {\n                        if (source.kind == MessageSourceKind.GROUP) {\n                            return findFromGroup(group?.bot?.getGroup(source.targetId))\n                        } else null\n                    }\n                    else -> null\n                }\n            }\n\n            val nick = if (isForward) {\n                findFromSource() ?: findFromGroup(group)\n            } else {\n                findFromGroup(group) ?: findFromSource()\n            } ?: target.toString()\n\n            val text = \"@$nick\".dropEmoji()\n            return ImMsgBody.Text(\n                str = text,\n                attr6Buf = buildPacket {\n                    // MessageForText$AtTroopMemberInfo\n                    writeShort(1) // const\n                    writeShort(0) // startPos\n                    writeShort(text.length.toShort()) // textLen\n                    writeByte(0) // flag, may=1\n                    writeInt(target.toInt()) // uin\n                    writeShort(0) // const\n                }.readBytes()\n            )\n        }\n\n        companion object {\n            // region Emoji pattern. <Licenced under the MIT LICENSE>\n            //\n            // https://github.com/mathiasbynens/emoji-test-regex-pattern\n            // https://github.com/mathiasbynens/emoji-test-regex-pattern/blob/main/dist/latest/java.txt\n            //\n\n            @Suppress(\"RegExpSingleCharAlternation\", \"RegExpRedundantEscape\")\n            private val EMOJI_PATTERN: Regex? = runCatching {\n                val resource = getEmojiPatternResourceOrNull() ?: return@runCatching null\n                Regex(resource)\n            }.getOrNull() // May some java runtime unsupported\n\n            fun String.dropEmoji(): String {\n                EMOJI_PATTERN?.let { regex -> return replace(regex, \"\") }\n                return this\n            }\n\n            // endregion\n        }\n    }\n\n    private class AtAllEncoder : MessageEncoder<AtAll> {\n        override suspend fun MessageEncoderContext.process(data: AtAll) {\n            markAsConsumed()\n            collect(jceData)\n        }\n\n        companion object {\n            private val jceData by lazy {\n                ImMsgBody.Elem(\n                    text = ImMsgBody.Text(\n                        str = AtAll.display,\n                        attr6Buf = buildPacket {\n                            // MessageForText$AtTroopMemberInfo\n                            writeShort(1) // const\n                            writeShort(0) // startPos\n                            writeShort(AtAll.display.length.toShort()) // textLen\n                            writeByte(1) // flag, may=1\n                            writeInt(0) // uin\n                            writeShort(0) // const\n                        }.readBytes()\n                    )\n                )\n            }\n        }\n    }\n}\n\ninternal expect fun getEmojiPatternResourceOrNull(): String?"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/impl/UnsupportedMessageProtocol.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.internal.message.data.UnsupportedMessageImpl\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoder\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderContext\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoder\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext\nimport net.mamoe.mirai.internal.message.protocol.serialization.MessageSerializer\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.message.data.MessageContent\nimport net.mamoe.mirai.message.data.SingleMessage\nimport net.mamoe.mirai.message.data.UnsupportedMessage\n\ninternal class UnsupportedMessageProtocol : MessageProtocol(priority = PRIORITY_UNSUPPORTED) {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        add(Decoder())\n        add(Encoder())\n\n        MessageSerializer.superclassesScope(UnsupportedMessage::class, MessageContent::class, SingleMessage::class) {\n            add(\n                MessageSerializer(\n                    UnsupportedMessageImpl::class,\n                    UnsupportedMessageImpl.serializer()\n                )\n            )\n        }\n    }\n\n    private class Decoder : MessageDecoder {\n        override suspend fun MessageDecoderContext.process(data: ImMsgBody.Elem) {\n            markAsConsumed()\n            val struct = UnsupportedMessageImpl(data)\n            if (struct.struct.isEmpty()) return\n            collect(struct)\n        }\n    }\n\n    private class Encoder : MessageEncoder<UnsupportedMessageImpl> {\n        override suspend fun MessageEncoderContext.process(data: UnsupportedMessageImpl) {\n            markAsConsumed()\n            collect(data.structElem)\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/impl/VipFaceProtocol.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoder\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderContext\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoder\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderContext\nimport net.mamoe.mirai.internal.message.protocol.serialization.MessageSerializer\nimport net.mamoe.mirai.internal.network.protocol.data.proto.HummerCommelem\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.message.data.MessageContent\nimport net.mamoe.mirai.message.data.PlainText\nimport net.mamoe.mirai.message.data.SingleMessage\nimport net.mamoe.mirai.message.data.VipFace\n\ninternal class VipFaceProtocol : MessageProtocol() {\n    override fun ProcessorCollector.collectProcessorsImpl() {\n        add(Encoder())\n        add(Decoder())\n\n        MessageSerializer.superclassesScope(MessageContent::class, SingleMessage::class) {\n            add(MessageSerializer(VipFace::class, VipFace.serializer()))\n        }\n    }\n\n    private class Encoder : MessageEncoder<VipFace> {\n        override suspend fun MessageEncoderContext.process(data: VipFace) {\n            markAsConsumed()\n            processAlso(PlainText(data.contentToString()))\n        }\n    }\n\n    private class Decoder : MessageDecoder {\n        override suspend fun MessageDecoderContext.process(data: ImMsgBody.Elem) {\n            if (data.commonElem == null) return\n            if (data.commonElem.serviceType != 23) return\n            markAsConsumed()\n\n            val proto =\n                data.commonElem.pbElem.loadAs(HummerCommelem.MsgElemInfoServtype23.serializer())\n            collect(VipFace(VipFace.Kind(proto.faceType, proto.faceSummary), proto.faceBubbleCount))\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/outgoing/HighwayUploader.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.outgoing\n\nimport net.mamoe.mirai.internal.contact.AbstractContact\nimport net.mamoe.mirai.internal.contact.nickIn\nimport net.mamoe.mirai.internal.message.data.MultiMsgUploader\nimport net.mamoe.mirai.internal.message.source.ensureSequenceIdAvailable\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.component.ComponentStorage\nimport net.mamoe.mirai.internal.network.components.ClockHolder\nimport net.mamoe.mirai.message.data.ForwardMessage\nimport net.mamoe.mirai.message.data.MessageChain\nimport kotlin.random.Random\n\ninternal interface HighwayUploader {\n    suspend fun uploadMessages(\n        contact: AbstractContact,\n        components: ComponentStorage,\n        nodes: Collection<ForwardMessage.INode>,\n        isLong: Boolean,\n        senderName: String = contact.bot.nickIn(contact),\n    ): String {\n        nodes.forEach { it.messageChain.ensureSequenceIdAvailable() }\n\n        val uploader = MultiMsgUploader(\n            client = contact.bot.client,\n            isLong = isLong,\n            contact = contact,\n            random = Random(components[ClockHolder].local.currentTimeSeconds()),\n            senderName = senderName,\n            components = components\n        ).also { it.emitMain(nodes) }\n\n        return uploader.uploadAndReturnResId()\n    }\n\n    suspend fun uploadLongMessage(\n        contact: AbstractContact,\n        components: ComponentStorage,\n        chain: MessageChain,\n        timeSeconds: Int,\n        senderName: String = contact.bot.nickIn(contact),\n    ): String {\n        val bot = contact.bot\n        return uploadMessages(\n            contact,\n            components,\n            listOf(\n                ForwardMessage.Node(\n                    senderId = bot.id,\n                    time = timeSeconds,\n                    messageChain = chain,\n                    senderName = senderName\n                )\n            ),\n            true,\n            senderName = senderName,\n        )\n    }\n\n    companion object : ComponentKey<HighwayUploader>\n\n    object Default : HighwayUploader\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/outgoing/MessageProtocolStrategy.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.outgoing\n\nimport kotlinx.coroutines.Deferred\nimport kotlinx.coroutines.withTimeoutOrNull\nimport net.mamoe.mirai.event.EventPriority\nimport net.mamoe.mirai.event.GlobalEventChannel\nimport net.mamoe.mirai.event.nextEvent\nimport net.mamoe.mirai.internal.AbstractBot\nimport net.mamoe.mirai.internal.contact.*\nimport net.mamoe.mirai.internal.message.source.OnlineMessageSourceToFriendImpl\nimport net.mamoe.mirai.internal.message.source.OnlineMessageSourceToGroupImpl\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.components.ClockHolder.Companion.clock\nimport net.mamoe.mirai.internal.network.notice.group.GroupMessageProcessor\nimport net.mamoe.mirai.internal.network.notice.priv.PrivateMessageProcessor\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketWithRespType\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.receive.*\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.OnlineMessageSource\n\ninternal interface MessageProtocolStrategy<in C : AbstractContact> {\n    suspend fun sendPacket(bot: AbstractBot, packet: OutgoingPacket): Packet? {\n        return bot.network.sendAndExpect(packet)\n    }\n\n    suspend fun <R : Packet?> sendPacket(bot: AbstractBot, packet: OutgoingPacketWithRespType<R>): R {\n        return bot.network.sendAndExpect(packet)\n    }\n\n    /**\n     * If [fragmented] is false, returned list must contain at most one element.\n     */\n    suspend fun createPacketsForGeneralMessage(\n        client: QQAndroidClient,\n        contact: C,\n        message: MessageChain, // to send\n        originalMessage: MessageChain, // to create Receipt\n        fragmented: Boolean,\n        sourceCallback: (Deferred<OnlineMessageSource.Outgoing>) -> Unit,\n    ): List<OutgoingPacket>\n\n    suspend fun constructSourceForSpecialMessage(\n        originalMessage: MessageChain,\n        fromAppId: Int,\n    ): OnlineMessageSource.Outgoing\n\n    companion object : ComponentKey<MessageProtocolStrategy<*>>\n}\n\ninternal sealed class UserMessageProtocolStrategy<C : AbstractUser> : MessageProtocolStrategy<C> {\n    override suspend fun constructSourceForSpecialMessage(\n        originalMessage: MessageChain,\n        fromAppId: Int\n    ): OnlineMessageSource.Outgoing {\n        throw UnsupportedOperationException(\"Sending MusicShare or FileMessage to User is not yet supported\")\n    }\n}\n\ninternal class FriendMessageProtocolStrategy(\n    private val contact: FriendImpl,\n) : UserMessageProtocolStrategy<FriendImpl>() {\n    override suspend fun createPacketsForGeneralMessage(\n        client: QQAndroidClient,\n        contact: FriendImpl,\n        message: MessageChain,\n        originalMessage: MessageChain,\n        fragmented: Boolean,\n        sourceCallback: (Deferred<OnlineMessageSource.Outgoing>) -> Unit\n    ): List<OutgoingPacket> {\n        return MessageSvcPbSendMsg.createToFriend(client, contact, message, originalMessage, fragmented, sourceCallback)\n    }\n\n    override suspend fun constructSourceForSpecialMessage(\n        originalMessage: MessageChain,\n        fromAppId: Int\n    ): OnlineMessageSource.Outgoing {\n        val receipt: PrivateMessageProcessor.SendPrivateMessageReceipt = withTimeoutOrNull(3000) {\n            GlobalEventChannel.parentScope(this).nextEvent(EventPriority.MONITOR) {\n                it.bot === contact.bot && it.fromAppId == fromAppId\n            }\n        } ?: PrivateMessageProcessor.SendPrivateMessageReceipt.EMPTY\n\n        return OnlineMessageSourceToFriendImpl(\n            internalIds = intArrayOf(receipt.messageRandom),\n            sequenceIds = intArrayOf(receipt.sequenceId),\n            sender = contact.bot,\n            target = contact,\n            time = contact.bot.clock.server.currentTimeSeconds().toInt(),\n            originalMessage = originalMessage\n        )\n    }\n}\n\ninternal object StrangerMessageProtocolStrategy : UserMessageProtocolStrategy<StrangerImpl>() {\n    override suspend fun createPacketsForGeneralMessage(\n        client: QQAndroidClient,\n        contact: StrangerImpl,\n        message: MessageChain,\n        originalMessage: MessageChain,\n        fragmented: Boolean,\n        sourceCallback: (Deferred<OnlineMessageSource.Outgoing>) -> Unit\n    ): List<OutgoingPacket> {\n        return MessageSvcPbSendMsg.createToStranger(\n            client,\n            contact,\n            message,\n            originalMessage,\n            fragmented,\n            sourceCallback\n        )\n    }\n}\n\ninternal object GroupTempMessageProtocolStrategy : UserMessageProtocolStrategy<NormalMemberImpl>() {\n    override suspend fun createPacketsForGeneralMessage(\n        client: QQAndroidClient,\n        contact: NormalMemberImpl,\n        message: MessageChain,\n        originalMessage: MessageChain,\n        fragmented: Boolean,\n        sourceCallback: (Deferred<OnlineMessageSource.Outgoing>) -> Unit\n    ): List<OutgoingPacket> {\n        return MessageSvcPbSendMsg.createToTemp(client, contact, message, originalMessage, fragmented, sourceCallback)\n    }\n}\n\ninternal open class GroupMessageProtocolStrategy(\n    private val contact: GroupImpl,\n) : MessageProtocolStrategy<GroupImpl> {\n    override suspend fun createPacketsForGeneralMessage(\n        client: QQAndroidClient,\n        contact: GroupImpl,\n        message: MessageChain,\n        originalMessage: MessageChain,\n        fragmented: Boolean,\n        sourceCallback: (Deferred<OnlineMessageSource.Outgoing>) -> Unit\n    ): List<OutgoingPacket> {\n        return MessageSvcPbSendMsg.createToGroup(client, contact, message, originalMessage, fragmented, sourceCallback)\n    }\n\n    override suspend fun constructSourceForSpecialMessage(\n        originalMessage: MessageChain,\n        fromAppId: Int\n    ): OnlineMessageSource.Outgoing {\n        val receipt: GroupMessageProcessor.SendGroupMessageReceipt = withTimeoutOrNull(3000) {\n            GlobalEventChannel.parentScope(this).nextEvent(EventPriority.MONITOR) {\n                it.bot === contact.bot && it.fromAppId == fromAppId\n            }\n        } ?: GroupMessageProcessor.SendGroupMessageReceipt.EMPTY\n\n        return OnlineMessageSourceToGroupImpl(\n            contact,\n            internalIds = intArrayOf(receipt.messageRandom),\n            providedSequenceIds = intArrayOf(receipt.sequenceId),\n            sender = contact.bot,\n            target = contact,\n            time = contact.bot.clock.server.currentTimeSeconds().toInt(),\n            originalMessage = originalMessage\n        )\n    }\n\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/outgoing/OutgoingMessagePipeline.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.outgoing\n\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.contact.MessageTooLargeException\nimport net.mamoe.mirai.internal.contact.AbstractContact\nimport net.mamoe.mirai.internal.contact.SendMessageStep\nimport net.mamoe.mirai.internal.message.source.ensureSequenceIdAvailable\nimport net.mamoe.mirai.internal.network.component.ComponentStorage\nimport net.mamoe.mirai.internal.network.handler.logger\nimport net.mamoe.mirai.internal.pipeline.*\nimport net.mamoe.mirai.internal.utils.estimateLength\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.*\n\n///////////////////////////////////////////////////////////////////////////\n// Infrastructure for a ProcessorPipeline\n///////////////////////////////////////////////////////////////////////////\n\n// Just to change this easily — you'd know it's actually Unit — a placeholder.\ninternal typealias OutgoingMessagePipelineInput = MessageChain\n\n\ninternal interface OutgoingMessagePipeline :\n    ProcessorPipeline<OutgoingMessagePipelineProcessor, OutgoingMessagePipelineContext, OutgoingMessagePipelineInput, MessageReceipt<*>>\n\ninternal open class OutgoingMessagePipelineImpl :\n    AbstractProcessorPipeline<OutgoingMessagePipelineProcessor, OutgoingMessagePipelineContext, OutgoingMessagePipelineInput, MessageReceipt<*>>(\n        PipelineConfiguration(stopWhenConsumed = true), @OptIn(TestOnly::class) defaultTraceLogging\n    ), OutgoingMessagePipeline {\n\n    inner class OutgoingMessagePipelineContextImpl(\n        attributes: TypeSafeMap, override var currentMessageChain: MessageChain\n    ) : OutgoingMessagePipelineContext, BaseContextImpl(attributes) {\n        /**\n         * Calls super [AbstractProcessorPipeline.BaseContextImpl.processAlso], Also updates [currentMessageChain].\n         */\n        override suspend fun processAlso(\n            data: OutgoingMessagePipelineInput,\n            extraAttributes: TypeSafeMap\n        ): ProcessResult<out ProcessorPipelineContext<OutgoingMessagePipelineInput, MessageReceipt<*>>, MessageReceipt<*>> {\n            return super.processAlso(data, extraAttributes).also { (context, _) ->\n                this.currentMessageChain = (context as OutgoingMessagePipelineContext).currentMessageChain\n            }\n        }\n    }\n\n    override fun createContext(\n        data: OutgoingMessagePipelineInput, attributes: TypeSafeMap\n    ): OutgoingMessagePipelineContext = OutgoingMessagePipelineContextImpl(attributes, data)\n\n    companion object {\n        @TestOnly\n        val defaultTraceLogging: MiraiLoggerWithSwitch by lazy {\n            MiraiLogger.Factory.create(OutgoingMessagePipelineImpl::class, \"OutgoingMessagePipeline\")\n                .withSwitch(systemProp(\"mirai.message.outgoing.pipeline.log.full\", false))\n        }\n    }\n}\n\n\ninternal interface OutgoingMessagePipelineContext :\n    ProcessorPipelineContext<OutgoingMessagePipelineInput, MessageReceipt<*>> {\n    /**\n     * Current message chain updated throughout the process. Will be updated from the [sub-processes][processAlso].\n     */\n    var currentMessageChain: MessageChain\n\n    suspend fun MessageSource.tryEnsureSequenceIdAvailable() {\n        val contact = attributes[CONTACT]\n        val bot = contact.bot\n        try {\n            ensureSequenceIdAvailable()\n        } catch (e: Exception) {\n            bot.network.logger.warning(\n                \"Timeout awaiting sequenceId for message(${currentMessageChain.content.take(10)}). Some features may not work properly.\",\n                e\n            )\n        }\n    }\n\n    fun Iterable<SingleMessage>.countImages(): Int = this.count { it is Image }\n\n    fun Iterable<SingleMessage>.verifyLength(\n        originalMessage: Message, target: Contact,\n    ): Int {\n        val chain = this\n        val length = estimateLength(target, 15001)\n        if (length > 15000 || countImages() > 50) {\n            throw MessageTooLargeException(\n                target, originalMessage, this.toMessageChain(),\n                \"message(${\n                    chain.joinToString(\"\", limit = 10).let { rsp ->\n                        if (rsp.length > 100) {\n                            rsp.take(100) + \"...\"\n                        } else rsp\n                    }\n                }) is too large. Allow up to 50 images or 5000 chars\"\n            )\n        }\n        return length\n    }\n\n\n    companion object {\n        /**\n         * Original\n         */\n        val ORIGINAL_MESSAGE = TypeKey<Message>(\"originalMessage\")\n\n        /**\n         * You should only use [ORIGINAL_MESSAGE_AS_CHAIN] if you can't use [ORIGINAL_MESSAGE]\n         */\n        val ORIGINAL_MESSAGE_AS_CHAIN = TypeKey<MessageChain>(\"originalMessageAsChain\")\n\n        /**\n         * Message chain used when retrying with next [step][SendMessageStep]s.\n         */\n        val MESSAGE_TO_RETRY = TypeKey<MessageChain>(\"messageToRetry\")\n\n        /**\n         * Message target\n         */\n        val CONTACT = TypeKey<AbstractContact>(\"contact\")\n\n        val STEP = TypeKey<SendMessageStep>(\"step\")\n\n        val COMPONENTS = TypeKey<ComponentStorage>(\"components\")\n        val OutgoingMessagePipelineContext.components: ComponentStorage get() = attributes[COMPONENTS]\n    }\n}\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/outgoing/OutgoingMessagePipelineProcessor.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.outgoing\n\nimport net.mamoe.mirai.internal.pipeline.Processor\n\ninternal sealed interface OutgoingMessagePipelineProcessor :\n    Processor<OutgoingMessagePipelineContext, OutgoingMessagePipelineInput>\n\n/**\n * Adapter for [OutgoingMessageProcessor] to be used as [Processor].\n */\ninternal class OutgoingMessageProcessorAdapter(\n    private val processor: OutgoingMessageProcessor,\n) : OutgoingMessagePipelineProcessor {\n    override val origin: OutgoingMessageProcessor get() = processor\n\n    override suspend fun process(context: OutgoingMessagePipelineContext, data: OutgoingMessagePipelineInput) {\n        processor.run { context.process() }\n    }\n\n    override fun toString(): String {\n        return \"OutgoingMessageProcessorAdapter(transformer=$processor)\"\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/outgoing/OutgoingMessageProcessor.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.outgoing\n\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.internal.message.data.LongMessageInternal\nimport net.mamoe.mirai.internal.pipeline.PipelineConsumptionMarker\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.MessageChain\n\n/**\n * A handler that is responsible for some logic in sending a [MessageChain] to a target [Contact].\n *\n * Broadcasting events is not of responsibility of [OutgoingMessageProcessor].\n */\ninternal sealed interface OutgoingMessageProcessor {\n    suspend fun OutgoingMessagePipelineContext.process()\n}\n\n/**\n * A preprocessor will be called in the first place.\n *\n * It is designed to do type conversions, and pre-conditional checks.\n *\n * **Preprocessors are not called in nested processing.**\n */\ninternal fun interface OutgoingMessagePreprocessor : OutgoingMessageProcessor\n\n\n/**\n * A transformer will be called after [Preprocessors][OutgoingMessagePreprocessor] and before [Postprocessors][OutgoingMessagePostprocessor].\n *\n * It is capable for handling some special messages, e.g. transform long messages as [LongMessageInternal].\n */\ninternal fun interface OutgoingMessageTransformer : OutgoingMessageProcessor\n\n/**\n * A transformer will be called after [Preprocessors][OutgoingMessagePreprocessor] and before [Postprocessors][OutgoingMessagePostprocessor].\n *\n * It is capable for sending packets, and create [MessageReceipt].\n * Senders can finish the pipeline by [OutgoingMessagePipelineContext.markAsConsumed].\n */\ninternal fun interface OutgoingMessageSender : OutgoingMessageProcessor, PipelineConsumptionMarker\n\n/**\n * A postprocessor will be called in the last place.\n *\n * It is designed to do cleanup.\n *\n * Note that if an exception was thrown by previous processors, postprocessors may not be called,\n * so do not reply on the postprocessor to close resources.\n */\ninternal fun interface OutgoingMessagePostprocessor : OutgoingMessageProcessor\n\n//internal interface MessageRefiner\n//\n//internal fun interface DeepMessageRefiner : MessageRefiner, OutgoingMessageProcessor\n//\n//@RestrictsSuspension // only allowed to call `processAlso`\n//internal fun interface LightMessageRefiner : MessageRefiner {\n//    suspend fun OutgoingMessagePipelineContext.process()\n//}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/protocol/serialization/MessageSerializer.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.serialization\n\nimport kotlinx.serialization.KSerializer\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.ProcessorCollector\nimport net.mamoe.mirai.message.data.SingleMessage\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.jvm.JvmInline\nimport kotlin.reflect.KClass\n\n/**\n * Collectd in [MessageProtocol.collectProcessors].\n * @see ProcessorCollector.add\n */\ninternal class MessageSerializer<T : Any>(\n    /**\n     * The exact class the [serializer] is for\n     */\n    val forClass: KClass<T>,\n    val serializer: KSerializer<T>,\n    /**\n     * Polymorphic base\n     */\n    val superclasses: Array<out KClass<in T>>,\n    /**\n     * Register also this as contextual\n     */\n    val registerAlsoContextual: Boolean = superclasses.isEmpty(),\n) {\n    // This can help native targets, which has no reflection support.\n\n    companion object {\n        inline fun <T : SingleMessage, R> superclassesScope(\n            vararg superclasses: KClass<in T>,\n            block: SuperclassesScope<T>.() -> R\n        ): R {\n            contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }\n            return block(SuperclassesScope(superclasses))\n        }\n    }\n}\n\n@JvmInline\ninternal value class SuperclassesScope<T : SingleMessage>(\n    val superclasses: Array<out KClass<in T>>,\n)\n\n@Suppress(\"FunctionName\")\ninternal fun <T : SingleMessage> SuperclassesScope<in T>.MessageSerializer(\n    forClass: KClass<T>,\n    serializer: KSerializer<T>,\n    registerAlsoContextual: Boolean = true,\n): MessageSerializer<T> = MessageSerializer(forClass, serializer, superclasses, registerAlsoContextual)"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/rich/package.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.rich\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/source/MessageSourceInternal.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.source\n\nimport kotlinx.serialization.Transient\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.internal.message.LightMessageRefiner.dropMiraiInternalFlags\nimport net.mamoe.mirai.internal.message.LightMessageRefiner.refineLight\nimport net.mamoe.mirai.internal.message.visitor.ex\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.cast\n\n\n/**\n * All [MessageSource] should implement this interface.\n */\ninternal interface MessageSourceInternal : MessageMetadata {\n    @Transient\n    val sequenceIds: IntArray // ids\n\n    @Transient\n    val internalIds: IntArray // randomId\n\n    @Deprecated(\"don't use this internally. Use sequenceId or random instead.\", level = DeprecationLevel.ERROR)\n    @Transient\n    val ids: IntArray\n\n    @Transient\n    val isRecalledOrPlanned: Boolean\n    fun setRecalled(): Boolean // CAS\n\n    fun toJceData(): ImMsgBody.SourceMsg\n\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.ex()?.visitMessageSourceInternal(this.cast(), data) ?: super.accept(visitor, data)\n    }\n}\n\n/**\n * All [OnlineMessageSource.Outgoing] should implement this interface.\n */\ninternal interface OutgoingMessageSourceInternal : MessageSourceInternal {\n\n    // #1371:\n    // 问题是 `build` 得到的 `ForwardMessage` 会在 `transformSpecialMessages`\n    // 时上传并变成 `ForwardMessageInternal` 再传递给 factory 发送, 并以这个 internal 结果构造了 receipt.\n\n    // 于是构造 receipt 后会进行 light refine 并更新这个属性.\n\n    /**\n     * This 'overrides' [MessageSource.originalMessage].\n     */\n    var originalMessage: MessageChain\n\n    /**\n     * This for patch outgoing message source to real time (from server)\n     */\n    var time: Int\n}\n\n/**\n * All [OnlineMessageSource.Incoming] should implement this interface.\n *\n */\ninternal interface IncomingMessageSourceInternal : MessageSourceInternal {\n    // #1532, #1289\n    // 问题描述: 解析 Incoming 时存在中间元素 (如 ForwardMessageInternal) 等,\n    // MessageChain.source.originMessage 中可能因为各种原因而存在这些中间元素\n\n    // 于是在广播 MessageEvent 前将 originalMessage 改成 refined 后的 MessageChain\n\n    var originalMessageLazy: Lazy<MessageChain>\n}\n\n@Suppress(\"DEPRECATION_ERROR\")\ninternal fun <C : Contact> OnlineMessageSource.Outgoing.createMessageReceipt(\n    target: C,\n    doLightRefine: Boolean,\n): MessageReceipt<C> {\n    if (doLightRefine) {\n        check(this is OutgoingMessageSourceInternal) { \"Internal error: source !is OutgoingMessageSourceInternal\" }\n        this.originalMessage = this.originalMessage\n            .dropMiraiInternalFlags()\n            .refineLight(bot)\n    }\n    return MessageReceipt(this, target)\n}\n\n@Suppress(\"RedundantSuspendModifier\", \"unused\")\ninternal suspend fun MessageSource.ensureSequenceIdAvailable() {\n    if (this is OnlineMessageSourceToGroupImpl) {\n        ensureSequenceIdAvailable()\n    }\n}\n\n@Suppress(\"RedundantSuspendModifier\", \"unused\")\ninternal suspend inline fun Message.ensureSequenceIdAvailable() {\n    (this as? MessageChain)?.sourceOrNull?.ensureSequenceIdAvailable()\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/source/incomingSourceImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"EXPERIMENTAL_API_USAGE\", \"EXPERIMENTAL_OVERRIDE\", \"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\")\n\npackage net.mamoe.mirai.internal.message.source\n\nimport kotlinx.atomicfu.atomic\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.Transient\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.ContactOrBot\nimport net.mamoe.mirai.contact.Friend\nimport net.mamoe.mirai.contact.Member\nimport net.mamoe.mirai.contact.Stranger\nimport net.mamoe.mirai.internal.asQQAndroidBot\nimport net.mamoe.mirai.internal.contact.GroupImpl\nimport net.mamoe.mirai.internal.contact.checkIsGroupImpl\nimport net.mamoe.mirai.internal.contact.newAnonymous\nimport net.mamoe.mirai.internal.getGroupByUinOrCodeOrFail\nimport net.mamoe.mirai.internal.message.MessageSourceSerializerImpl\nimport net.mamoe.mirai.internal.message.toMessageChainNoSource\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.data.proto.SourceMsg\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.MessageSource\nimport net.mamoe.mirai.message.data.MessageSourceKind\nimport net.mamoe.mirai.message.data.OnlineMessageSource\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport net.mamoe.mirai.utils.encodeBase64\nimport net.mamoe.mirai.utils.mapToIntArray\nimport net.mamoe.mirai.utils.structureToString\n\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(OnlineMessageSourceFromFriendImpl.Serializer::class)\ninternal class OnlineMessageSourceFromFriendImpl(\n    override val bot: Bot,\n    private val msg: List<MsgComm.Msg>,\n) : OnlineMessageSource.Incoming.FromFriend(), IncomingMessageSourceInternal {\n    object Serializer : KSerializer<MessageSource> by MessageSourceSerializerImpl(\"OnlineMessageSourceFromFriend\")\n\n    override val sequenceIds: IntArray = msg.mapToIntArray { it.msgHead.msgSeq.and(0xFFFF) }\n\n    private val _isRecalledOrPlanned = atomic(false)\n\n    @Transient\n    override val isRecalledOrPlanned: Boolean get() = _isRecalledOrPlanned.value\n    override fun setRecalled(): Boolean = _isRecalledOrPlanned.compareAndSet(expect = false, update = true)\n    override val ids: IntArray get() = sequenceIds // msg.msgBody.richText.attr!!.random\n    override val internalIds: IntArray = msg.mapToIntArray { it.decodeRandom() }\n    override val time: Int = msg.first().msgHead.msgTime\n    override var originalMessageLazy = lazy {\n        msg.toMessageChainNoSource(bot, 0, MessageSourceKind.FRIEND)\n    }\n    override val originalMessage: MessageChain get() = originalMessageLazy.value\n    override val isOriginalMessageInitialized: Boolean\n        get() = originalMessageLazy.isInitialized()\n\n    override val sender: Friend by lazy {\n        if (fromId == bot.id) {\n            bot.asFriend\n        } else {\n            bot.getFriendOrFail(fromId)\n        }\n    }\n\n    override val subject: Friend by lazy {\n        if (fromId == bot.id) {\n            bot.getFriendOrFail(targetId)\n        } else {\n            bot.getFriendOrFail(fromId)\n        }\n    }\n    override val fromId: Long\n        get() = msg.first().msgHead.fromUin\n\n    override val targetId: Long\n        get() = msg.first().msgHead.toUin\n\n    override val target: ContactOrBot by lazy {\n        if (fromId == bot.id) {\n            bot.getFriendOrFail(targetId)\n        } else {\n            bot\n        }\n    }\n\n\n    private val jceData: ImMsgBody.SourceMsg by lazy { msg.toJceDataPrivate() }\n\n    override fun toJceData(): ImMsgBody.SourceMsg = jceData\n\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return super<IncomingMessageSourceInternal>.accept(visitor, data)\n    }\n}\n\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(OnlineMessageSourceFromStrangerImpl.Serializer::class)\ninternal class OnlineMessageSourceFromStrangerImpl(\n    override val bot: Bot,\n    private val msg: List<MsgComm.Msg>,\n) : OnlineMessageSource.Incoming.FromStranger(), IncomingMessageSourceInternal {\n    object Serializer : KSerializer<MessageSource> by MessageSourceSerializerImpl(\"OnlineMessageSourceFromStranger\")\n\n    override val sequenceIds: IntArray = msg.mapToIntArray { it.msgHead.msgSeq }\n\n    private val _isRecalledOrPlanned = atomic(false)\n\n    @Transient\n    override val isRecalledOrPlanned: Boolean get() = _isRecalledOrPlanned.value\n    override fun setRecalled(): Boolean = _isRecalledOrPlanned.compareAndSet(expect = false, update = true)\n\n    override val ids: IntArray get() = sequenceIds // msg.msgBody.richText.attr!!.random\n    override val internalIds: IntArray = msg.mapToIntArray { it.decodeRandom() }\n    override val time: Int = msg.first().msgHead.msgTime\n    override var originalMessageLazy = lazy {\n        msg.toMessageChainNoSource(bot, 0, MessageSourceKind.STRANGER)\n    }\n    override val originalMessage: MessageChain get() = originalMessageLazy.value\n    override val isOriginalMessageInitialized: Boolean\n        get() = originalMessageLazy.isInitialized()\n\n    override val sender: Stranger by lazy {\n        if (fromId == bot.id) {\n            bot.asStranger\n        } else {\n            bot.getStrangerOrFail(fromId)\n        }\n    }\n\n    override val subject: Stranger by lazy {\n        if (fromId == bot.id) {\n            bot.getStrangerOrFail(targetId)\n        } else {\n            bot.getStrangerOrFail(fromId)\n        }\n    }\n\n    override val fromId: Long\n        get() = msg.first().msgHead.fromUin\n\n    override val targetId: Long\n        get() = msg.first().msgHead.toUin\n\n    override val target: ContactOrBot by lazy {\n        if (fromId == bot.id) {\n            bot.getStrangerOrFail(targetId)\n        } else {\n            bot\n        }\n    }\n\n    private val jceData: ImMsgBody.SourceMsg by lazy { msg.toJceDataPrivate() }\n\n    override fun toJceData(): ImMsgBody.SourceMsg = jceData\n\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return super<IncomingMessageSourceInternal>.accept(visitor, data)\n    }\n}\n\nprivate fun List<MsgComm.Msg>.toJceDataPrivate(): ImMsgBody.SourceMsg {\n    val elements = flatMap { it.msgBody.richText.elems }.toMutableList().also {\n        if (it.lastOrNull()?.elemFlags2 == null) it.add(ImMsgBody.Elem(elemFlags2 = ImMsgBody.ElemFlags2()))\n    }\n\n    val firstMsgMsgHead = first().msgHead\n\n    firstMsgMsgHead.run {\n        return ImMsgBody.SourceMsg(\n            origSeqs = mapToIntArray { it.msgHead.msgSeq },\n            senderUin = fromUin,\n            toUin = toUin,\n            flag = 1,\n            elems = flatMap { it.msgBody.richText.elems },\n            type = 0,\n            time = msgTime,\n            pbReserve = SourceMsg.ResvAttr(\n                origUids = mutableListOf(firstMsgMsgHead.msgUid)\n            ).toByteArray(SourceMsg.ResvAttr.serializer()),\n            srcMsg = MsgComm.Msg(\n                msgHead = MsgComm.MsgHead(\n                    fromUin = fromUin, // qq\n                    toUin = toUin, // group\n                    msgType = msgType, // 82?\n                    c2cCmd = c2cCmd,\n                    msgSeq = msgSeq,\n                    msgTime = msgTime,\n                    msgUid = firstMsgMsgHead.msgUid, // ok\n//                    msgUid = ids.single().toLong() and 0xFFFF_FFFF, // ok\n                    // groupInfo = MsgComm.GroupInfo(groupCode = msgHead.groupInfo.groupCode),\n                    isSrcMsg = true\n                ),\n                msgBody = ImMsgBody.MsgBody(\n                    richText = ImMsgBody.RichText(\n                        elems = elements\n                    )\n                )\n            ).toByteArray(MsgComm.Msg.serializer())\n        )\n    }\n}\n\ninternal fun MsgComm.Msg.decodeRandom(): Int {\n    msgBody.richText.attr?.random?.let { return it }\n\n    // msg uin = 0x100000000000000 or rand.toLongUnsigned()\n    return msgHead.msgUid.toInt()\n}\n\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(OnlineMessageSourceFromTempImpl.Serializer::class)\ninternal class OnlineMessageSourceFromTempImpl(\n    override val bot: Bot,\n    private val msg: List<MsgComm.Msg>,\n) : OnlineMessageSource.Incoming.FromTemp(), IncomingMessageSourceInternal {\n    object Serializer : KSerializer<MessageSource> by MessageSourceSerializerImpl(\"OnlineMessageSourceFromTemp\")\n\n    override val sequenceIds: IntArray = msg.mapToIntArray { it.msgHead.msgSeq }\n    override val internalIds: IntArray = msg.mapToIntArray { it.decodeRandom() }\n\n    private val _isRecalledOrPlanned = atomic(false)\n\n    @Transient\n    override val isRecalledOrPlanned: Boolean get() = _isRecalledOrPlanned.value\n    override fun setRecalled(): Boolean = _isRecalledOrPlanned.compareAndSet(expect = false, update = true)\n\n    override val ids: IntArray get() = sequenceIds //\n    override val time: Int = msg.first().msgHead.msgTime\n    override var originalMessageLazy = lazy {\n        msg.toMessageChainNoSource(bot, groupIdOrZero = 0, MessageSourceKind.TEMP)\n    }\n    override val originalMessage: MessageChain get() = originalMessageLazy.value\n    override val isOriginalMessageInitialized: Boolean\n        get() = originalMessageLazy.isInitialized()\n\n    @Suppress(\"PropertyName\")\n    private val _group = with(msg.first().msgHead) {\n        // it must be uin, see #1410\n        // corresponding test: net.mamoe.mirai.internal.notice.processors.MessageTest.group temp message test 2\n\n        // search for group code also is for tests. code may be passed as uin in tests.\n        // clashing is unlikely possible in real time, so it would not be a problem.\n        bot.asQQAndroidBot().getGroupByUinOrCodeOrFail(c2cTmpMsgHead!!.groupUin)\n    }\n\n    override val sender: Member by lazy {\n        _group.getOrFail(fromId)\n    }\n\n    override val target: ContactOrBot by lazy {\n        if (fromId == botId) {\n            _group.getOrFail(targetId)\n        } else bot\n    }\n\n    override val subject: Member by lazy {\n        if (fromId == botId) {\n            _group.getOrFail(targetId)\n        } else {\n            _group.getOrFail(fromId)\n        }\n    }\n\n    override val fromId: Long\n        get() = msg.first().msgHead.fromUin\n    override val targetId: Long\n        get() = msg.first().msgHead.toUin\n\n\n    private val jceData: ImMsgBody.SourceMsg by lazy { msg.toJceDataPrivate() }\n    override fun toJceData(): ImMsgBody.SourceMsg = jceData\n\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return super<IncomingMessageSourceInternal>.accept(visitor, data)\n    }\n}\n\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(OnlineMessageSourceFromGroupImpl.Serializer::class)\ninternal class OnlineMessageSourceFromGroupImpl(\n    override val bot: Bot,\n    private val msg: List<MsgComm.Msg>,\n) : OnlineMessageSource.Incoming.FromGroup(), IncomingMessageSourceInternal {\n    object Serializer : KSerializer<MessageSource> by MessageSourceSerializerImpl(\"OnlineMessageSourceFromGroupImpl\")\n\n\n    private val _isRecalledOrPlanned = atomic(false)\n\n    @Transient\n    override val isRecalledOrPlanned: Boolean get() = _isRecalledOrPlanned.value\n    override fun setRecalled(): Boolean = _isRecalledOrPlanned.compareAndSet(expect = false, update = true)\n    override val sequenceIds: IntArray = msg.mapToIntArray { it.msgHead.msgSeq }\n    override val internalIds: IntArray = msg.mapToIntArray { it.decodeRandom() }\n    override val ids: IntArray get() = sequenceIds\n    override val time: Int = msg.first().msgHead.msgTime\n    override var originalMessageLazy = lazy {\n        msg.toMessageChainNoSource(bot, groupIdOrZero = group.id, MessageSourceKind.GROUP)\n    }\n    override val originalMessage: MessageChain get() = originalMessageLazy.value\n    override val isOriginalMessageInitialized: Boolean\n        get() = originalMessageLazy.isInitialized()\n\n\n    override val subject: GroupImpl by lazy {\n        val group = bot.getGroup(targetId)?.checkIsGroupImpl()\n            ?: error(\"cannot find group for OnlineMessageSourceFromGroupImpl. Use `source.targetId` to get group id. msg=${msg.structureToString()}\")\n\n        group\n    }\n\n    override val sender: Member by lazy {\n        val group = subject\n\n        val member = group[msg.first().msgHead.fromUin]\n        if (member != null) return@lazy member\n\n        val anonymousInfo = msg.first().msgBody.richText.elems.firstOrNull { it.anonGroupMsg != null }\n            ?: error(\"cannot find member for OnlineMessageSourceFromGroupImpl. Use `source.fromId` to get sender id. msg=${msg.structureToString()}\")\n\n        anonymousInfo.run {\n            group.newAnonymous(anonGroupMsg!!.anonNick.decodeToString(), anonGroupMsg.anonId.encodeBase64())\n        }\n    }\n\n    override val fromId: Long get() = msg.first().msgHead.fromUin\n    override val targetId: Long\n        get() {\n            return msg.first().msgHead.groupInfo?.groupCode\n                ?: error(\"cannot find groupCode for OnlineMessageSourceFromGroupImpl. msg=${msg.structureToString()}\")\n        }\n\n    private val jceData: ImMsgBody.SourceMsg by lazy {\n        ImMsgBody.SourceMsg(\n            origSeqs = intArrayOf(msg.first().msgHead.msgSeq),\n            senderUin = msg.first().msgHead.fromUin,\n            toUin = 0,\n            flag = 1,\n            elems = msg.flatMap { it.msgBody.richText.elems },\n            type = 0,\n            time = msg.first().msgHead.msgTime,\n            pbReserve = EMPTY_BYTE_ARRAY,\n            srcMsg = EMPTY_BYTE_ARRAY\n        )\n    }\n\n    override fun toJceData(): ImMsgBody.SourceMsg {\n        return jceData\n    }\n\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return super<IncomingMessageSourceInternal>.accept(visitor, data)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/source/offlineSourceImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.internal.message.source\n\nimport kotlinx.atomicfu.atomic\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.Transient\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.internal.message.MessageSourceSerializerImpl\nimport net.mamoe.mirai.internal.message.RefineContextKey\nimport net.mamoe.mirai.internal.message.SimpleRefineContext\nimport net.mamoe.mirai.internal.message.toMessageChainNoSource\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.data.proto.SourceMsg\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.MessageSource\nimport net.mamoe.mirai.message.data.MessageSourceKind\nimport net.mamoe.mirai.message.data.OfflineMessageSource\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.isSameType\nimport net.mamoe.mirai.utils.mapToIntArray\n\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(OfflineMessageSourceImplData.Serializer::class)\ninternal class OfflineMessageSourceImplData(\n    override val kind: MessageSourceKind,\n    override val ids: IntArray,\n    override val botId: Long,\n    override val time: Int,\n    override val fromId: Long,\n    override val targetId: Long,\n    private val originalMessageLazy: Lazy<MessageChain>,\n    override val internalIds: IntArray,\n) : OfflineMessageSource(), MessageSourceInternal {\n    object Serializer : KSerializer<MessageSource> by MessageSourceSerializerImpl(\"OfflineMessageSource\")\n\n    override val sequenceIds: IntArray get() = ids\n    override val originalMessage: MessageChain by originalMessageLazy\n    override val isOriginalMessageInitialized: Boolean\n        get() = originalMessageLazy.isInitialized()\n\n    // for override.\n    // if provided, no need to serialize from message\n    @Transient\n    var originElems: List<ImMsgBody.Elem>? = null\n\n    // may provided by OfflineMessageSourceImplBySourceMsg\n    @Transient\n    var jceData: ImMsgBody.SourceMsg? = null\n\n    private val _isRecalledOrPlanned = atomic(false)\n\n    @Transient\n    override val isRecalledOrPlanned: Boolean get() = _isRecalledOrPlanned.value\n    override fun setRecalled(): Boolean = _isRecalledOrPlanned.compareAndSet(expect = false, update = true)\n\n    override fun toJceData(): ImMsgBody.SourceMsg {\n        jceData?.let { return it }\n\n        return toJceDataImpl(null).also { jceData = it }\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (!isSameType(this, other)) return false\n\n        val originElems = originElems\n        if (originElems != null) {\n            if (originElems == other.originElems) return true\n        }\n\n        if (kind != other.kind) return false\n        if (!ids.contentEquals(other.ids)) return false\n        if (botId != other.botId) return false\n        if (time != other.time) return false\n        if (fromId != other.fromId) return false\n        if (targetId != other.targetId) return false\n        if (originalMessage != other.originalMessage) return false\n        if (!internalIds.contentEquals(other.internalIds)) return false\n\n        return true\n    }\n\n    override fun hashCode(): Int {\n        var result = kind.hashCode()\n        result = 31 * result + ids.contentHashCode()\n        result = 31 * result + botId.hashCode()\n        result = 31 * result + time\n        result = 31 * result + fromId.hashCode()\n        result = 31 * result + targetId.hashCode()\n        result = 31 * result + originalMessage.hashCode()\n        result = 31 * result + internalIds.contentHashCode()\n        return result\n    }\n\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return super<MessageSourceInternal>.accept(visitor, data)\n    }\n}\n\nprivate fun IntArray.fixIds(kind: MessageSourceKind): IntArray {\n    if (kind == MessageSourceKind.FRIEND) {\n        for (idx in this.indices) {\n            this[idx] = this[idx].and(0xFFFF)\n        }\n    }\n    return this\n}\n\ninternal fun OfflineMessageSourceImplData(\n    bot: Bot,\n    delegate: List<MsgComm.Msg>,\n    kind: MessageSourceKind,\n): OfflineMessageSourceImplData {\n    val head = delegate.first().msgHead\n    return OfflineMessageSourceImplData(\n        kind = kind,\n        time = head.msgTime,\n        fromId = head.fromUin,\n        targetId = head.groupInfo?.groupCode ?: head.toUin,\n        originalMessage = delegate.toMessageChainNoSource(\n            bot,\n            groupIdOrZero = head.groupInfo?.groupCode ?: 0,\n            messageSourceKind = kind\n        ),\n        ids = delegate.mapToIntArray { it.msgHead.msgSeq }.fixIds(kind),\n        internalIds = delegate.mapToIntArray { it.msgHead.msgUid.toInt() },\n        botId = bot.id\n    ).apply {\n        originElems = delegate.flatMap { it.msgBody.richText.elems }\n    }\n}\n\ninternal fun OfflineMessageSourceImplData(\n    kind: MessageSourceKind,\n    ids: IntArray,\n    botId: Long,\n    time: Int,\n    fromId: Long,\n    targetId: Long,\n    originalMessage: MessageChain,\n    internalIds: IntArray,\n): OfflineMessageSourceImplData = OfflineMessageSourceImplData(\n    kind = kind,\n    ids = ids,\n    botId = botId,\n    time = time,\n    fromId = fromId,\n    targetId = targetId,\n    originalMessageLazy = lazyOf(originalMessage),\n    internalIds = internalIds\n).also {\n    it.originalMessage // initialize lazy, to make isOriginalMessageInitialized true.\n}\n\n@Suppress(\"LocalVariableName\")\ninternal fun OfflineMessageSourceImplData(\n    delegate: ImMsgBody.SourceMsg,\n    bot: Bot,\n    _messageSourceKind: MessageSourceKind,\n    _groupIdOrZero: Long,\n): OfflineMessageSourceImplData {\n    var messageSourceKind = _messageSourceKind\n    var groupIdOrZero = _groupIdOrZero\n\n    if (messageSourceKind != MessageSourceKind.GROUP && delegate.troopName.isNotEmpty()) { // FROM GROUP: 单独回复\n        messageSourceKind = MessageSourceKind.GROUP\n        groupIdOrZero = 0\n    }\n\n    return OfflineMessageSourceImplData(\n        kind = messageSourceKind,\n        ids = delegate.origSeqs.fixIds(messageSourceKind),\n        internalIds = delegate.pbReserve.loadAs(SourceMsg.ResvAttr.serializer())\n            .origUids?.mapToIntArray { it.toInt() } ?: intArrayOf(),\n        time = delegate.time,\n        originalMessageLazy = lazy {\n            val context = SimpleRefineContext(RefineContextKey.FromId to delegate.senderUin)\n            delegate.toMessageChainNoSource(bot, messageSourceKind, groupIdOrZero, context)\n        },\n        fromId = delegate.senderUin,\n        targetId = when {\n            groupIdOrZero != 0L -> groupIdOrZero\n            delegate.toUin != 0L -> delegate.toUin\n            delegate.srcMsg != null -> runCatching {\n                delegate.srcMsg.loadAs(MsgComm.Msg.serializer()).msgHead.toUin\n            }.getOrElse { 0L }\n\n            else -> 0/*error(\"cannot find targetId. delegate=${delegate._miraiContentToString()}, delegate.srcMsg=${\n            kotlin.runCatching { delegate.srcMsg?.loadAs(MsgComm.Msg.serializer())?._miraiContentToString() }\n                .fold(\n                    onFailure = { \"<error: ${it.message}>\" },\n                    onSuccess = { it }\n                )\n            }\"\n            )*/\n        },\n        botId = bot.id\n    ).apply {\n        jceData = delegate\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/source/outgoingSourceImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"EXPERIMENTAL_API_USAGE\", \"EXPERIMENTAL_OVERRIDE\", \"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\")\n\npackage net.mamoe.mirai.internal.message.source\n\nimport kotlinx.atomicfu.atomic\nimport kotlinx.coroutines.*\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.Transient\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.event.EventPriority\nimport net.mamoe.mirai.event.GlobalEventChannel\nimport net.mamoe.mirai.event.syncFromEvent\nimport net.mamoe.mirai.internal.contact.uin\nimport net.mamoe.mirai.internal.message.MessageSourceSerializerImpl\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocolFacade\nimport net.mamoe.mirai.internal.network.notice.group.GroupMessageProcessor.SendGroupMessageReceipt\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.data.proto.SourceMsg\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.MessageSource\nimport net.mamoe.mirai.message.data.OnlineMessageSource\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.TestOnly\nimport net.mamoe.mirai.utils.loadService\nimport net.mamoe.mirai.utils.toLongUnsigned\n\n\ninternal fun <T> T.toJceDataImpl(subject: ContactOrBot?): ImMsgBody.SourceMsg\n        where T : MessageSourceInternal, T : MessageSource {\n\n    val elements = MessageProtocolFacade.encode(originalMessage, subject, withGeneralFlags = false)\n\n    val pdReserve = SourceMsg.ResvAttr(\n        origUids = internalIds.map { 0x100000000000000 or it.toLongUnsigned() }\n//        origUids = sequenceIds.zip(internalIds)\n//            .map { (seq, internal) -> seq.toLong().shl(32) or internal.toLongUnsigned() }\n    )\n\n    return ImMsgBody.SourceMsg(\n        origSeqs = sequenceIds,\n        senderUin = fromId,\n        toUin = targetId,\n        flag = 1,\n        elems = elements,\n        type = 0,\n        time = time,\n        pbReserve = pdReserve.toByteArray(SourceMsg.ResvAttr.serializer()),\n        srcMsg = MsgComm.Msg(\n            msgHead = MsgComm.MsgHead(\n                fromUin = fromId, // qq\n                toUin = targetId, // group\n                msgType = 9, // 82?\n                c2cCmd = 11,\n                msgSeq = sequenceIds.first(),\n                msgTime = time,\n                msgUid = pdReserve.origUids!!.first(),\n                // groupInfo = MsgComm.GroupInfo(groupCode = delegate.msgHead.groupInfo.groupCode),\n                isSrcMsg = true\n            ),\n            msgBody = ImMsgBody.MsgBody(\n                richText = ImMsgBody.RichText(\n                    elems = elements.toMutableList().also {\n                        if (it.lastOrNull()?.elemFlags2 == null) it.add(ImMsgBody.Elem(elemFlags2 = ImMsgBody.ElemFlags2()))\n                    }\n                )\n            )\n        ).toByteArray(MsgComm.Msg.serializer())\n    )\n}\n\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(OnlineMessageSourceToFriendImpl.Serializer::class)\ninternal class OnlineMessageSourceToFriendImpl(\n    override val sequenceIds: IntArray,\n    override val internalIds: IntArray,\n    override var time: Int,\n    override var originalMessage: MessageChain,\n    override val sender: Bot,\n    override val target: Friend,\n) : OnlineMessageSource.Outgoing.ToFriend(), MessageSourceInternal, OutgoingMessageSourceInternal {\n    object Serializer : KSerializer<MessageSource> by MessageSourceSerializerImpl(\"OnlineMessageSourceToFriend\")\n\n    override val isOriginalMessageInitialized: Boolean\n        get() = true\n\n    override val bot: Bot\n        get() = sender\n    override val ids: IntArray\n        get() = sequenceIds\n\n    private val _isRecalledOrPlanned = atomic(false)\n\n    @Transient\n    override val isRecalledOrPlanned: Boolean get() = _isRecalledOrPlanned.value\n    override fun setRecalled(): Boolean = _isRecalledOrPlanned.compareAndSet(expect = false, update = true)\n\n    private val jceData: ImMsgBody.SourceMsg by lazy { toJceDataImpl(subject) }\n    override fun toJceData(): ImMsgBody.SourceMsg = jceData\n\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return super<OutgoingMessageSourceInternal>.accept(visitor, data)\n    }\n}\n\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(OnlineMessageSourceToStrangerImpl.Serializer::class)\ninternal class OnlineMessageSourceToStrangerImpl(\n    override val sequenceIds: IntArray,\n    override val internalIds: IntArray,\n    override var time: Int,\n    override var originalMessage: MessageChain,\n    override val sender: Bot,\n    override val target: Stranger,\n) : OnlineMessageSource.Outgoing.ToStranger(), MessageSourceInternal, OutgoingMessageSourceInternal {\n\n    constructor(\n        delegate: Outgoing,\n        target: Stranger,\n    ) : this(delegate.ids, delegate.internalIds, delegate.time, delegate.originalMessage, delegate.sender, target)\n\n    object Serializer : KSerializer<MessageSource> by MessageSourceSerializerImpl(\"OnlineMessageSourceToStranger\")\n\n    override val isOriginalMessageInitialized: Boolean\n        get() = true\n    override val bot: Bot\n        get() = sender\n    override val ids: IntArray\n        get() = sequenceIds\n\n    private val _isRecalledOrPlanned = atomic(false)\n\n    @Transient\n    override val isRecalledOrPlanned: Boolean get() = _isRecalledOrPlanned.value\n    override fun setRecalled(): Boolean = _isRecalledOrPlanned.compareAndSet(expect = false, update = true)\n\n    private val jceData: ImMsgBody.SourceMsg by lazy { toJceDataImpl(subject) }\n    override fun toJceData(): ImMsgBody.SourceMsg = jceData\n\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return super<OutgoingMessageSourceInternal>.accept(visitor, data)\n    }\n}\n\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(OnlineMessageSourceToTempImpl.Serializer::class)\ninternal class OnlineMessageSourceToTempImpl(\n    override val sequenceIds: IntArray,\n    override val internalIds: IntArray,\n    override var time: Int,\n    override var originalMessage: MessageChain,\n    override val sender: Bot,\n    override val target: Member,\n) : OnlineMessageSource.Outgoing.ToTemp(), MessageSourceInternal, OutgoingMessageSourceInternal {\n    constructor(\n        delegate: Outgoing,\n        target: Member,\n    ) : this(delegate.ids, delegate.internalIds, delegate.time, delegate.originalMessage, delegate.sender, target)\n\n    object Serializer : KSerializer<MessageSource> by MessageSourceSerializerImpl(\"OnlineMessageSourceToTemp\")\n\n    override val isOriginalMessageInitialized: Boolean\n        get() = true\n\n    override val bot: Bot\n        get() = sender\n    override val ids: IntArray\n        get() = sequenceIds\n\n    private val _isRecalledOrPlanned = atomic(false)\n\n    @Transient\n    override val isRecalledOrPlanned: Boolean get() = _isRecalledOrPlanned.value\n    override fun setRecalled(): Boolean = _isRecalledOrPlanned.compareAndSet(expect = false, update = true)\n\n    private val jceData: ImMsgBody.SourceMsg by lazy { toJceDataImpl(subject) }\n    override fun toJceData(): ImMsgBody.SourceMsg = jceData\n\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return super<OutgoingMessageSourceInternal>.accept(visitor, data)\n    }\n}\n\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(OnlineMessageSourceToGroupImpl.Serializer::class)\ninternal class OnlineMessageSourceToGroupImpl(\n    coroutineScope: CoroutineScope,\n    override val internalIds: IntArray, // aka random\n    override var time: Int,\n    override var originalMessage: MessageChain,\n    override val sender: Bot,\n    override val target: Group,\n    providedSequenceIds: IntArray? = null,\n) : OnlineMessageSource.Outgoing.ToGroup(), MessageSourceInternal, OutgoingMessageSourceInternal {\n    object Serializer : KSerializer<MessageSource> by MessageSourceSerializerImpl(\"OnlineMessageSourceToGroup\")\n\n    override val isOriginalMessageInitialized: Boolean\n        get() = true\n\n    override val ids: IntArray\n        get() = sequenceIds\n    override val bot: Bot\n        get() = sender\n\n    private val _isRecalledOrPlanned = atomic(false)\n\n    @Transient\n    override val isRecalledOrPlanned: Boolean get() = _isRecalledOrPlanned.value\n    override fun setRecalled(): Boolean = _isRecalledOrPlanned.compareAndSet(expect = false, update = true)\n\n\n    /**\n     * Note that in tests result of this Deferred is always `null`. See TestMessageSourceSequenceIdAwaiter.\n     */\n    private val sequenceIdDeferred: Deferred<IntArray?> = providedSequenceIds?.let { CompletableDeferred(it) } ?: run {\n        MessageSourceSequenceIdAwaiter.instance.getSequenceIdAsync(this, coroutineScope)\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    override val sequenceIds: IntArray\n        get() = when {\n            sequenceIdDeferred.isCompleted -> sequenceIdDeferred.getCompleted() ?: intArrayOf()\n            !sequenceIdDeferred.isActive -> intArrayOf()\n            else -> error(\"sequenceIds not yet available\")\n        }\n\n\n    suspend fun ensureSequenceIdAvailable() = kotlin.run { sequenceIdDeferred.await() }\n\n    private val jceData: ImMsgBody.SourceMsg by lazy {\n        val elements = MessageProtocolFacade.encode(originalMessage, subject, withGeneralFlags = true)\n        ImMsgBody.SourceMsg(\n            origSeqs = sequenceIds,\n            senderUin = fromId,\n            toUin = target.uin,\n            flag = 1,\n            elems = elements,\n            type = 0,\n            time = time,\n            pbReserve = SourceMsg.ResvAttr(\n                origUids = internalIds.map { it.toLongUnsigned() } // ids is actually messageRandom\n            ).toByteArray(SourceMsg.ResvAttr.serializer()),\n            srcMsg = MsgComm.Msg(\n                msgHead = MsgComm.MsgHead(\n                    fromUin = fromId, // qq\n                    toUin = target.uin, // group\n                    msgType = 82, // 82?\n                    c2cCmd = 1,\n                    msgSeq = sequenceIds.single(),\n                    msgTime = time,\n                    msgUid = internalIds.single().toLongUnsigned(),\n                    groupInfo = MsgComm.GroupInfo(groupCode = targetId),\n                    isSrcMsg = true\n                ),\n                msgBody = ImMsgBody.MsgBody(\n                    richText = ImMsgBody.RichText(\n                        elems = elements.toMutableList().also {\n                            if (it.lastOrNull()?.elemFlags2 == null) it.add(ImMsgBody.Elem(elemFlags2 = ImMsgBody.ElemFlags2()))\n                        }\n                    )\n                )\n            ).toByteArray(MsgComm.Msg.serializer())\n        )\n    }\n\n    override fun toJceData(): ImMsgBody.SourceMsg = jceData\n\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return super<OutgoingMessageSourceInternal>.accept(visitor, data)\n    }\n}\n\ninternal open class MessageSourceSequenceIdAwaiter {\n    open fun getSequenceIdAsync(\n        sourceToGroupImpl: OnlineMessageSourceToGroupImpl,\n        coroutineScope: CoroutineScope\n    ): Deferred<IntArray?> {\n        val multi = mutableMapOf<Int, Int>()\n        return coroutineScope.async {\n            withTimeoutOrNull(\n                timeMillis = 3000L * sourceToGroupImpl.internalIds.size\n            ) {\n                GlobalEventChannel.parentScope(this)\n                    .syncFromEvent<SendGroupMessageReceipt, IntArray>(EventPriority.MONITOR) { receipt ->\n                        if (receipt.bot !== sourceToGroupImpl.bot) return@syncFromEvent null\n                        if (receipt.messageRandom in sourceToGroupImpl.internalIds) {\n                            multi[receipt.messageRandom] = receipt.sequenceId\n                            if (multi.size == sourceToGroupImpl.internalIds.size) {\n                                IntArray(multi.size) { index ->\n                                    multi[sourceToGroupImpl.internalIds[index]]!!\n                                }\n                            } else null\n                        } else null\n                    }\n            }\n        }\n    }\n\n    companion object {\n        @Suppress(\"ObjectPropertyName\")\n        private val _instance = atomic(\n            loadService(MessageSourceSequenceIdAwaiter::class) { MessageSourceSequenceIdAwaiter() }\n        )\n\n        val instance: MessageSourceSequenceIdAwaiter get() = _instance.value\n\n        // Used for reset test env\n        @TestOnly\n        internal fun setInstance(instance: MessageSourceSequenceIdAwaiter) {\n            _instance.value = instance\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/message/visitor/MessageVisitorEx.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.internal.message.visitor\n\nimport net.mamoe.mirai.internal.message.data.ForwardMessageInternal\nimport net.mamoe.mirai.internal.message.data.LongMessageInternal\nimport net.mamoe.mirai.internal.message.data.MarketFaceImpl\nimport net.mamoe.mirai.internal.message.flags.*\nimport net.mamoe.mirai.internal.message.source.MessageSourceInternal\nimport net.mamoe.mirai.message.data.MessageSource\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.castOrNull\n\ninternal fun <D, R> MessageVisitor<D, R>?.ex(): MessageVisitorEx<D, R>? = castOrNull()\n\n/**\n * For mirai-core-specific types\n */\ninternal interface MessageVisitorEx<in D, out R> : MessageVisitor<D, R> {\n    fun <T> visitMessageSourceInternal(message: T, data: D): R where T : MessageSourceInternal, T : MessageSource {\n        return visitMessageSource(message, data)\n    }\n\n    fun visitForwardMessageInternal(message: ForwardMessageInternal, data: D): R {\n        return visitAbstractServiceMessage(message, data)\n    }\n\n    fun visitLongMessageInternal(message: LongMessageInternal, data: D): R {\n        return visitAbstractServiceMessage(message, data)\n    }\n\n    fun visitMarketFaceImpl(message: MarketFaceImpl, data: D): R {\n        return visitMarketFace(message, data)\n    }\n\n    fun visitInternalFlagOnlyMessage(message: InternalFlagOnlyMessage, data: D): R {\n        return visitMessageMetadata(message, data)\n    }\n\n    fun visitForceAsLongMessage(message: ForceAsLongMessage, data: D): R {\n        return visitInternalFlagOnlyMessage(message, data)\n    }\n\n    fun visitForceAsFragmentedMessage(message: ForceAsFragmentedMessage, data: D): R {\n        return visitInternalFlagOnlyMessage(message, data)\n    }\n\n    fun visitDontAsLongMessage(message: DontAsLongMessage, data: D): R {\n        return visitInternalFlagOnlyMessage(message, data)\n    }\n\n    fun visitIgnoreLengthCheck(message: IgnoreLengthCheck, data: D): R {\n        return visitInternalFlagOnlyMessage(message, data)\n    }\n\n    fun visitSkipEventBroadcast(message: SkipEventBroadcast, data: D): R {\n        return visitInternalFlagOnlyMessage(message, data)\n    }\n\n    fun visitAllowSendFileMessage(message: AllowSendFileMessage, data: D): R {\n        return visitSkipEventBroadcast(message, data)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/ContactListCache.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.Json\nimport kotlinx.serialization.protobuf.ProtoBuf\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.info.FriendInfoImpl\nimport net.mamoe.mirai.internal.contact.info.MemberInfoImpl\nimport net.mamoe.mirai.internal.network.protocol.data.jce.StTroopNum\nimport net.mamoe.mirai.internal.utils.ScheduledJob\nimport net.mamoe.mirai.internal.utils.groupCacheDir\nimport net.mamoe.mirai.utils.*\n\ninternal val JsonForCache = Json {\n    encodeDefaults = true\n    ignoreUnknownKeys = true\n//    isLenient = true // \"null\" will become null and cause errors\n    prettyPrint = true\n}\n\ninternal val ProtoBufForCache = ProtoBuf {\n    encodeDefaults = true\n}\n\n@Serializable\ninternal data class FriendListCache(\n    var friendListSeq: Long = 0,\n    /**\n     * 实际上是个序列号, 不是时间\n     */\n    var timeStamp: Long = 0,\n    var list: List<FriendInfoImpl> = emptyList(),\n)\n\n@Serializable\ninternal data class GroupMemberListCache(\n    var troopMemberNumSeq: Long,\n    var list: List<MemberInfoImpl> = emptyList(),\n)\n\ninternal fun GroupMemberListCache.isValid(stTroopNum: StTroopNum): Boolean {\n    return this.list.size == stTroopNum.dwMemberNum?.toInt() && this.troopMemberNumSeq == stTroopNum.dwMemberNumSeq\n}\n\ninternal class GroupMemberListCaches(\n    private val bot: QQAndroidBot,\n    private val logger: MiraiLogger,\n) {\n    init {\n        @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n        bot.eventChannel.parentScope(bot)\n            .subscribeAlways<net.mamoe.mirai.event.events.BaseGroupMemberInfoChangeEvent> {\n                groupListSaver.notice()\n            }\n\n    }\n\n    private val changedGroups: MutableCollection<Long> = ConcurrentLinkedDeque()\n    private val groupListSaver: ScheduledJob by lazy {\n        ScheduledJob(bot.coroutineContext, bot.configuration.contactListCache.saveIntervalMillis) {\n            runBIO { saveGroupCaches() }\n        }\n    }\n\n    fun reportChanged(groupCode: Long) {\n        changedGroups.add(groupCode)\n        groupListSaver.notice()\n    }\n\n    private fun takeCurrentChangedGroups(): Map<Long, GroupMemberListCache> {\n        val ret = HashMap<Long, GroupMemberListCache>()\n        changedGroups.removeAll {\n            ret[it] = get(it)\n            true\n        }\n        return ret\n    }\n\n    private val cacheDir: MiraiFile by lazy { bot.configuration.groupCacheDir() }\n\n    private fun resolveCacheFile(groupCode: Long): MiraiFile {\n        cacheDir.mkdirs()\n        return cacheDir.resolve(\"$groupCode.json\")\n    }\n\n    fun saveGroupCaches() {\n        val currentChanged = takeCurrentChangedGroups()\n        if (currentChanged.isNotEmpty()) {\n            for ((id, cache) in currentChanged) {\n                val file = resolveCacheFile(id)\n                file.createNewFile()\n                file.writeText(JsonForCache.encodeToString(GroupMemberListCache.serializer(), cache))\n            }\n            logger.info { \"Saved ${currentChanged.size} groups to local cache.\" }\n        }\n    }\n\n    val map: MutableMap<Long, GroupMemberListCache> = ConcurrentHashMap()\n\n    fun retainAll(list: Collection<Long>) {\n        this.map.keys.retainAll(list)\n    }\n\n    operator fun get(id: Long): GroupMemberListCache {\n        return map.getOrPut(id) {\n            val file = resolveCacheFile(id)\n            if (file.exists() && file.isFile) {\n                try {\n                    val text = file.readText()\n                    if (text.isNotBlank()) {\n                        return JsonForCache.decodeFromString(GroupMemberListCache.serializer(), text)\n                    }\n                } catch (e: Exception) {\n                    logger.warning(\n                        \"Exception while loading GroupMemberListCache for group $id, possibly file corrupted. Deleting cache file.\",\n                        e\n                    )\n                    file.delete()\n                }\n            }\n\n            GroupMemberListCache(0, emptyList())\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/DebuggingProperties.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network\n\ninternal object DebuggingProperties {\n    const val SHOW_TLV_MAP_ON_LOGIN_SUCCESS = false\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/Packet.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network\n\nimport net.mamoe.mirai.internal.AbstractBot\nimport net.mamoe.mirai.internal.network.handler.logger\nimport net.mamoe.mirai.internal.utils.io.ProtocolStruct\nimport net.mamoe.mirai.utils.MiraiLogger\n\n/*\n\n// moved to `mirai-core`\n\n/**\n * 从服务器收到的包解析之后的结构化数据.\n * 它是一个数据包工厂的处理的返回值.\n */\ninterface Packet {\n    /**\n     * 实现这个接口的包将不会被记录到日志中\n     */\n    interface NoLog\n}\n*/\n\n/**\n * PacketFactory 可以一次解析多个包出来. 它们将会被分别广播.\n */\ninternal interface MultiPacket : Packet {\n    /**\n     * `true` if this packet has some useful meaning, otherwise it will be considered just as a wrapper of its children.\n     */\n    val isMeaningful: Boolean\n\n    /**\n     * if item is [MultiPacket], its children will be ignored.\n     */\n    fun children(): Iterator<Packet>\n}\n\ninternal fun Collection<Packet>.toPacket(): Packet {\n    return when (this.size) {\n        1 -> this.single()\n        else -> MultiPacket(this)\n    }\n}\n\ninternal fun MultiPacket(delegate: Collection<Packet>): MultiPacket {\n    return MultiPacketImpl(delegate)\n}\n\ninternal fun MultiPacket(delegate: Packet): MultiPacket =\n    if (delegate is MultiPacket) delegate else MultiPacket(listOf(delegate))\n\n\nprivate class MultiPacketImpl(\n    val delegate: Collection<Packet>,\n) : MultiPacket {\n    override val isMeaningful: Boolean get() = false\n\n    override fun children(): Iterator<Packet> {\n        return sequence {\n            for (packet in delegate) {\n                yield(packet)\n                if (packet is MultiPacket) {\n                    yieldAll(packet.children())\n                }\n            }\n        }.iterator()\n    }\n\n    override fun toString(): String = delegate.joinToString(\n        separator = \"\\n\",\n        prefix = \"MultiPacket [\\n\",\n        postfix = \"]\",\n    )\n}\n\n\ninternal class ParseErrorPacket(\n    val data: ProtocolStruct,\n    val error: Throwable,\n    val direction: Direction = Direction.TO_BOT_LOGGER,\n) : Packet, Packet.NoLog {\n    enum class Direction {\n        TO_BOT_LOGGER {\n            override fun getLogger(bot: AbstractBot): MiraiLogger = bot.logger\n        },\n        TO_NETWORK_LOGGER {\n            override fun getLogger(bot: AbstractBot): MiraiLogger = bot.network.logger\n        };\n\n        abstract fun getLogger(bot: AbstractBot): MiraiLogger\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/QQAndroidClient.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\", \"EXPERIMENTAL_API_USAGE\", \"DEPRECATION_ERROR\", \"unused\")\n\npackage net.mamoe.mirai.internal.network\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.atomicfu.AtomicInt\nimport kotlinx.atomicfu.atomic\nimport net.mamoe.mirai.data.OnlineStatus\nimport net.mamoe.mirai.internal.BotAccount\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.components.AccountSecrets\nimport net.mamoe.mirai.internal.network.components.SsoProcessorContext\nimport net.mamoe.mirai.internal.network.components.SsoSession\nimport net.mamoe.mirai.internal.network.components.encryptServiceOrNull\nimport net.mamoe.mirai.internal.network.protocol.data.jce.FileStoragePushFSSvcList\nimport net.mamoe.mirai.internal.network.protocol.packet.Tlv\nimport net.mamoe.mirai.internal.utils.AtomicIntSeq\nimport net.mamoe.mirai.internal.utils.MiraiProtocolInternal\nimport net.mamoe.mirai.internal.utils.NetworkType\nimport net.mamoe.mirai.utils.*\nimport kotlin.random.Random\n\n\ninternal val DEFAULT_GUID = \"%4;7t>;28<fc.5*6\".toByteArray()\n\n/**\n * 生成长度为 [length], 元素为随机 `0..255` 的 [ByteArray]\n */\ninternal fun getRandomByteArray(length: Int): ByteArray = ByteArray(length) { Random.nextInt(0, 255).toByte() }\n\n// [114.221.148.179:14000, 113.96.13.125:8080, 14.22.3.51:8080, 42.81.172.207:443, 114.221.144.89:80, 125.94.60.148:14000, 42.81.192.226:443, 114.221.148.233:8080, msfwifi.3g.qq.com:8080, 42.81.172.22:80]\n\ninternal val DefaultServerList: MutableSet<Pair<String, Int>> =\n    \"msfwifi.3g.qq.com:8080\"\n        .split(\", \")\n        .map {\n            val host = it.substringBefore(':')\n            val port = it.substringAfter(':').toInt()\n            host to port\n        }.shuffled().toMutableSet()\n\n/*\n APP ID:\n GetStViaSMSVerifyLogin = 16\n GetStWithoutPasswd = 16\n\n\n TICKET ID\n Pskey = 0x10_0000, from oicq/wlogin_sdk/request/WtloginHelper.java:2980\n Skey = 0x1000 from oicq/wlogin_sdk/request/WtloginHelper.java:2986\n\n DOMAINS\n Pskey: \"openmobile.qq.com\"\n */\n/**\n * holds all the states related to network.\n */\ninternal open class QQAndroidClient(\n    val account: BotAccount,\n    val device: DeviceInfo,\n    accountSecrets: AccountSecrets\n) : AccountSecrets by accountSecrets, SsoSession {\n    lateinit var _bot: QQAndroidBot\n    val bot: QQAndroidBot get() = _bot\n\n    /**\n     * 真实 QQ 号. 使用邮箱等登录时则需获取这个 uin 进行后续一些操作.\n     *\n     * **注意**: 总是使用这个属性, 而不要使用 [BotAccount.id]. 将来它可能会变为 [String]\n     */\n    val uin: Long get() = _uin\n\n    override var outgoingPacketSessionId: ByteArray = 0x02B05B8B.toByteArray()\n    override var loginState = 0\n\n    val supportedEncrypt by lazy {\n        bot.encryptServiceOrNull?.supports(bot.configuration.protocol) ?: false\n    }\n    var onlineStatus: OnlineStatus = OnlineStatus.ONLINE\n\n    var fileStoragePushFSSvcList: FileStoragePushFSSvcList? = null\n\n    @Volatile\n    private var _ssoSequenceId: Int = Random.nextInt(100000)\n\n    @Synchronized\n    @MiraiInternalApi(\"Do not use directly. Get from the lambda param of buildSsoPacket\")\n    internal fun nextSsoSequenceId(): Int {\n        _ssoSequenceId += 2\n        val new = _ssoSequenceId\n        if (new > 100000) {\n            _ssoSequenceId = Random.nextInt(100000) + 60000\n        }\n        return new\n    }\n\n\n    val apkVersionName: ByteArray get() = protocol.ver.toByteArray() //\"8.4.18\".toByteArray()\n    val buildVer: String get() = protocol.buildVer // 8.2.0.1296 // 8.4.8.4810 // 8.2.7.4410\n\n\n    private val sequenceId: AtomicInt = atomic(getRandomUnsignedInt())\n    internal fun atomicNextMessageSequenceId(): Int = sequenceId.incrementAndGet()\n    internal fun nextRequestPacketRequestId(): Int = sequenceId.incrementAndGet()\n\n    @Volatile\n    private var highwayDataTransSequenceId: Int = Random.nextInt(100000)\n\n    @Synchronized\n    internal fun nextHighwayDataTransSequenceId(): Int {\n        highwayDataTransSequenceId += 1\n        val new = highwayDataTransSequenceId\n        if (new > 1000000) {\n            highwayDataTransSequenceId = Random.nextInt(1060000)\n        }\n        return new\n    }\n\n    internal var strangerSeq: Int = 0\n\n    /**\n     * for send\n     */\n    val sendFriendMessageSeq = AtomicIntSeq.forPrivateSync()\n\n    internal val groupConfig: GroupConfig = GroupConfig()\n\n    internal class GroupConfig {\n        var robotConfigVersion: Int = 0\n        var aioKeyWordVersion: Int = 0\n        var robotUinRangeList: List<LongRange> = emptyList()\n\n        fun isOfficialRobot(uin: Long): Boolean {\n            return robotUinRangeList.any { range -> range.contains(uin) }\n        }\n    }\n\n    var t150: Tlv? = null\n    var rollbackSig: ByteArray? = null\n    var ipFromT149: ByteArray? = null\n\n    /**\n     * 客户端与服务器时间差\n     */\n    var timeDifference: Long = 0\n\n    @Suppress(\"PropertyName\")\n    internal var _uin: Long = account.id\n\n    var t530: ByteArray? = null\n    var t528: ByteArray? = null\n    var t174: ByteArray? = null\n\n    /**\n     * t186\n     */\n    var pwdFlag: Boolean = false\n\n    lateinit var wFastLoginInfo: WFastLoginInfo\n    var reserveUinInfo: ReserveUinInfo? = null\n    var t402: ByteArray? = null\n    lateinit var t104: ByteArray\n    internal val t104Initialized get() = ::t104.isInitialized\n    var t543: ByteArray? = null\n    var t547: ByteArray? = null\n\n    /**\n     * t545\n     */\n    val qimei16: String? get() = bot.components[SsoProcessorContext].qimei16\n    val qimei36: String? get() = bot.components[SsoProcessorContext].qimei36\n}\n\ninternal val QQAndroidClient.apkId: ByteArray get() = protocol.apkId.toByteArray()\ninternal val QQAndroidClient.ssoVersion: Int get() = protocol.ssoVersion\ninternal val QQAndroidClient.networkType: NetworkType get() = NetworkType.WIFI\ninternal val QQAndroidClient.appClientVersion: Int get() = 0\ninternal val QQAndroidClient.mainSigMap: Int get() = protocol.mainSigMap\ninternal val QQAndroidClient.miscBitMap: Int get() = protocol.miscBitMap // 184024956 // 也可能是 150470524 ?\ninternal val QQAndroidClient.clientVersion: String get() = \"android ${protocol.ver}\" // android 8.5.0\ninternal val QQAndroidClient.protocol get() = MiraiProtocolInternal[bot.configuration.protocol]\ninternal val QQAndroidClient.sdkVersion: String get() = protocol.sdkVer\ninternal val QQAndroidClient.buildTime: Long get() = protocol.buildTime\ninternal val QQAndroidClient.subAppId: Long get() = protocol.id\ninternal val QQAndroidClient.apkSignatureMd5: ByteArray get() = protocol.sign.hexToBytes() // \"A6 B7 45 BF 24 A2 C2 77 52 77 16 F6 F3 6E B6 8D\".hexToBytes()\ninternal val QQAndroidClient.subSigMap: Int get() = protocol.subSigMap // 0x10400 //=66,560\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/Ticket.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network\n\ninternal class Ticket(\n    val id: Int,\n    val data: ByteArray,\n    val key: ByteArray?,\n    val creationTime: Long,\n    val expireTime: Long\n) {\n    companion object {\n        const val USER_A5 = 0x2\n        const val AQ_SIG = 0x200000\n        const val USER_SIG_64 = 0x2000\n        const val SUPER_KEY = 0x100000\n        const val OPEN_KEY = 0x4000\n        const val ACCESS_TOKEN = 0x8000\n        const val USER_ST_SIG = 0x80\n        const val USER_A8 = 0x10\n        const val LS_KEY = 0x200\n        const val S_KEY = 0x1000\n        const val V_KEY = 0x20000\n        const val TGT = 0x40\n        const val D2 = 0x40000\n        const val SID = 0x80000\n        const val USER_ST_WEB_SIG = 0x20\n        const val PAY_TOKEN = 0x800000\n        const val PF = 0x1000000\n        const val DA2 = 0x2000000\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/auth/AuthControl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.auth\n\nimport net.mamoe.mirai.auth.BotAuthInfo\nimport net.mamoe.mirai.auth.BotAuthorization\nimport net.mamoe.mirai.internal.network.components.SsoProcessorImpl\nimport net.mamoe.mirai.internal.utils.asUtilsLogger\nimport net.mamoe.mirai.internal.utils.subLogger\nimport net.mamoe.mirai.utils.*\nimport net.mamoe.mirai.utils.channels.OnDemandChannel\nimport net.mamoe.mirai.utils.channels.OnDemandReceiveChannel\nimport net.mamoe.mirai.utils.channels.ProducerFailureException\nimport kotlin.coroutines.CoroutineContext\n\n\n/**\n * Event sequence:\n *\n * 1. Starts a user coroutine [BotAuthorization.authorize].\n * 2. User coroutine\n */\ninternal class AuthControl(\n    private val botAuthInfo: BotAuthInfo,\n    private val authorization: BotAuthorization,\n    private val logger: MiraiLogger,\n    parentCoroutineContext: CoroutineContext,\n) {\n    internal val exceptionCollector = ExceptionCollector()\n\n    private val userDecisions: OnDemandReceiveChannel<Throwable?, SsoProcessorImpl.AuthMethod> =\n        OnDemandChannel(\n            parentCoroutineContext,\n            logger.subLogger(\"AuthControl/UserDecisions\").withSwitch(DEBUG_LOGGING).asUtilsLogger()\n        ) { _ ->\n            val sessionImpl = SafeBotAuthSession(this)\n            authorization.authorize(sessionImpl, botAuthInfo) // OnDemandChannel handles exceptions for us\n        }\n\n    fun start() {\n        userDecisions.expectMore(null)\n    }\n\n    // Does not throw\n    suspend fun acquireAuth(): SsoProcessorImpl.AuthMethod {\n        logger.verbose { \"[AuthControl/acquire] Acquiring auth method\" }\n\n        val rsp = try {\n            userDecisions.receiveOrNull() ?: SsoProcessorImpl.AuthMethod.NotAvailable\n        } catch (e: ProducerFailureException) {\n            SsoProcessorImpl.AuthMethod.Error(e.unwrap())\n        }\n\n        logger.debug { \"[AuthControl/acquire] Authorization responded: $rsp\" }\n        return rsp\n    }\n\n    fun actMethodFailed(cause: Throwable) {\n        logger.verbose { \"[AuthControl/resume] Fire auth failed with cause: $cause\" }\n        userDecisions.expectMore(cause)\n    }\n\n    fun actComplete() {\n        logger.verbose { \"[AuthControl/resume] Fire auth completed\" }\n        userDecisions.close()\n    }\n\n    private companion object {\n        private val DEBUG_LOGGING = systemProp(\"mirai.network.auth.logging\", false)\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/auth/BotAuthSessionInternal.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.auth\n\nimport net.mamoe.mirai.auth.BotAuthInfo\nimport net.mamoe.mirai.auth.BotAuthResult\nimport net.mamoe.mirai.auth.BotAuthSession\nimport net.mamoe.mirai.auth.BotAuthorization\nimport net.mamoe.mirai.utils.SecretsProtection\nimport net.mamoe.mirai.utils.md5\n\n\n// With SecretsProtection support\ninternal abstract class BotAuthSessionInternal : BotAuthSession {\n\n    final override suspend fun authByPassword(password: String): BotAuthResult {\n        return authByPassword(password.md5())\n    }\n\n    final override suspend fun authByPassword(passwordMd5: ByteArray): BotAuthResult {\n        return authByPassword(SecretsProtection.EscapedByteBuffer(passwordMd5))\n    }\n\n    abstract suspend fun authByPassword(passwordMd5: SecretsProtection.EscapedByteBuffer): BotAuthResult\n}\n\n// With SecretsProtection support\ninternal abstract class BotAuthorizationWithSecretsProtection : BotAuthorization {\n    final override fun calculateSecretsKey(bot: BotAuthInfo): ByteArray {\n        return calculateSecretsKeyImpl(bot).asByteArray\n    }\n\n    abstract fun calculateSecretsKeyImpl(\n        bot: BotAuthInfo,\n    ): SecretsProtection.EscapedByteBuffer\n\n    abstract suspend fun authorize(session: BotAuthSessionInternal, bot: BotAuthInfo): BotAuthResult\n\n    final override suspend fun authorize(session: BotAuthSession, info: BotAuthInfo): BotAuthResult {\n        return authorize(session as BotAuthSessionInternal, info)\n    }\n}\n\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/auth/DefaultBotAuthorizationFactoryImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.auth\n\nimport net.mamoe.mirai.auth.BotAuthInfo\nimport net.mamoe.mirai.auth.BotAuthResult\nimport net.mamoe.mirai.auth.BotAuthSession\nimport net.mamoe.mirai.auth.BotAuthorization\nimport net.mamoe.mirai.utils.SecretsProtection.EscapedByteBuffer\n\n/**\n * Provides default [BotAuthorization.byPassword] implementation.\n * @see net.mamoe.mirai.auth.DefaultBotAuthorizationFactory\n */\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"CANNOT_OVERRIDE_INVISIBLE_MEMBER\")\ninternal class DefaultBotAuthorizationFactoryImpl :\n    net.mamoe.mirai.auth.DefaultBotAuthorizationFactory {\n    override fun byPassword(passwordMd5: ByteArray): BotAuthorization {\n        val buffer = EscapedByteBuffer(passwordMd5)\n        return byPassword(buffer) // Avoid referring passwordMd5(ByteArray)\n    }\n\n    private fun byPassword(buffer: EscapedByteBuffer): BotAuthorization {\n        return object : BotAuthorizationWithSecretsProtection() {\n            override fun calculateSecretsKeyImpl(bot: BotAuthInfo): EscapedByteBuffer = buffer\n\n            override suspend fun authorize(\n                session: BotAuthSessionInternal,\n                bot: BotAuthInfo\n            ): BotAuthResult = session.authByPassword(buffer)\n\n            override fun toString(): String = \"BotAuthorization.byPassword(<ERASED>)\"\n        }\n    }\n\n    override fun byQRCode(): BotAuthorization {\n        return object : BotAuthorization {\n            override suspend fun authorize(session: BotAuthSession, info: BotAuthInfo): BotAuthResult =\n                session.authByQRCode()\n\n            override fun toString(): String = \"BotAuthorization.byQRCode()\"\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/auth/SafeBotAuthSession.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.auth\n\nimport net.mamoe.mirai.auth.BotAuthResult\nimport net.mamoe.mirai.internal.network.components.SsoProcessorImpl\nimport net.mamoe.mirai.utils.SecretsProtection\nimport net.mamoe.mirai.utils.channels.IllegalChannelStateException\nimport net.mamoe.mirai.utils.channels.OnDemandSendChannel\n\n/**\n * Implements [BotAuthSessionInternal] from API, to be called by the user, to receive user's decisions.\n */\ninternal class SafeBotAuthSession(\n    private val producer: OnDemandSendChannel<Throwable?, SsoProcessorImpl.AuthMethod>\n) : BotAuthSessionInternal() {\n    private val authResultImpl = object : BotAuthResult {}\n\n    override suspend fun authByPassword(passwordMd5: SecretsProtection.EscapedByteBuffer): BotAuthResult {\n        runWrapInternalException {\n            producer.emit(SsoProcessorImpl.AuthMethod.Pwd(passwordMd5))\n        }?.let { throw it }\n        return authResultImpl\n    }\n\n    override suspend fun authByQRCode(): BotAuthResult {\n        runWrapInternalException {\n            producer.emit(SsoProcessorImpl.AuthMethod.QRCode)\n        }?.let { throw it }\n        return authResultImpl\n    }\n\n    private inline fun <R> runWrapInternalException(block: () -> R): R {\n        try {\n            return block()\n        } catch (e: IllegalChannelStateException) {\n            if (e.lastStateWasSucceed) {\n                throw IllegalStateException(\n                    \"This login session has already completed. Please return the BotAuthResult you get from 'authBy*()' immediately\",\n                    e\n                )\n            } else {\n                throw e // internal bug\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/component/ComponentKey.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmName(\"ComponentKeyKt_common\")\n\npackage net.mamoe.mirai.internal.network.component\n\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocolFacade\nimport kotlin.jvm.JvmName\nimport kotlin.reflect.*\n\n/**\n * A key for specific component [T]. Components are not polymorphic.\n *\n * Most components locate in `net.mamoe.mirai.internal.network.components` while some like [MessageProtocolFacade] don't.\n *\n * @param T is a type hint.\n */\ninternal interface ComponentKey<T : Any> {\n\n    companion object {\n        /**\n         * Get name of `T`.\n         *\n         * - If [qualified] is `false`, example: `PacketCodec`.\n         * - If [qualified] is `true`, example: `net.mamoe.mirai.internal.network.components.PacketCodec`.\n         */\n        fun <T : Any> ComponentKey<T>.componentName(qualified: Boolean = false): String {\n            val argument = getComponentTypeArgument()\n            argument?.render(qualified)?.let { return it }\n            return argument?.type?.classifier.renderClassifier(qualified)\n        }\n\n        fun <T : Any> ComponentKey<T>.smartToString(qualified: Boolean = false): String {\n            return \"ComponentKey<${componentName(qualified)}>\"\n        }\n\n        // reflection is slow, but it is initialized once only (if memory sufficient).\n\n        private fun KTypeProjection.render(\n            fullName: Boolean\n        ): String? {\n            val projection = this\n\n            projection.type?.classifier?.let { classifier ->\n                if (classifier is KClass<*>) {\n                    return classifier.run { if (fullName) qualifiedName else simpleName } ?: \"?\"\n                }\n            }\n\n            projection.type?.arguments?.firstOrNull()?.let { argument ->\n                return argument.render(fullName)\n            }\n\n            return null\n        }\n\n        private fun KClassifier?.renderClassifier(\n            fullName: Boolean\n        ): String {\n            return when (val classifier = this) {\n                null -> \"?\"\n                is KClass<*> -> classifier.run { if (fullName) qualifiedName else simpleName } ?: \"?\"\n                is KTypeParameter -> classifier.renderTypeParameter(fullName)\n                else -> \"?\"\n            }\n        }\n\n        private fun KType.renderType(fullName: Boolean) = classifier.renderClassifier(fullName)\n\n        private fun KTypeParameter.renderTypeParameter(fullName: Boolean): String {\n            val upperBounds = upperBounds\n            return when (upperBounds.size) {\n                0 -> toString()\n                1 -> upperBounds[0].renderType(fullName)\n                else -> upperBounds.joinToString(\" & \") { it.renderType(fullName) }\n            }\n        }\n    }\n}\n\ninternal expect fun ComponentKey<*>.getComponentTypeArgument(): KTypeProjection?"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/component/ComponentStorage.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.component\n\nimport net.mamoe.mirai.utils.TestOnly\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\n\n/**\n * Mediator for [component][ComponentKey]s accessing each other.\n *\n * Implementation must be thread-safe.\n *\n * @see MutableComponentStorage\n * @see ConcurrentComponentStorage\n * @see withFallback\n */\ninternal interface ComponentStorage {\n    @TestOnly\n    val size: Int\n\n    @Throws(NoSuchComponentException::class)\n    operator fun <T : Any> get(key: ComponentKey<T>): T\n    fun <T : Any> getOrNull(key: ComponentKey<T>): T?\n\n    val keys: Set<ComponentKey<*>>\n\n    override fun toString(): String\n\n    companion object {\n        val EMPTY: ComponentStorage by lazy { ConcurrentComponentStorage() }\n    }\n}\n\ninternal fun buildComponentStorage(builderAction: MutableComponentStorage.() -> Unit): ComponentStorage {\n    contract { callsInPlace(builderAction, InvocationKind.EXACTLY_ONCE) }\n    return ConcurrentComponentStorage(builderAction)\n}\n\ninternal fun ComponentStorage?.withFallback(fallback: ComponentStorage?): ComponentStorage {\n    if (this == null) return fallback ?: return ComponentStorage.EMPTY\n    if (fallback == null) return this\n    return CombinedComponentStorage(this, fallback)\n}\n\ninternal fun ComponentStorage?.withPrimary(primary: ComponentStorage?): ComponentStorage = primary.withFallback(this)\n\nprivate class CombinedComponentStorage(\n    val main: ComponentStorage,\n    val fallback: ComponentStorage,\n) : ComponentStorage {\n    override val keys: Set<ComponentKey<*>> get() = main.keys + fallback.keys\n    @TestOnly\n    override val size: Int get() = main.size + fallback.size\n\n    override fun <T : Any> get(key: ComponentKey<T>): T {\n        return main.getOrNull(key) ?: fallback.getOrNull(key) ?: throw NoSuchComponentException(key, this)\n            .apply {\n                //\n                kotlin.runCatching { main[key] }.exceptionOrNull()?.let(::addSuppressed)\n                kotlin.runCatching { fallback[key] }.exceptionOrNull()?.let(::addSuppressed)\n            }\n    }\n\n    override fun <T : Any> getOrNull(key: ComponentKey<T>): T? {\n        return main.getOrNull(key) ?: fallback.getOrNull(key)\n    }\n\n    override fun toString(): String = buildString {\n        appendLine(\"CombinedComponentStorage {\")\n        appendLine(\"* main:\")\n        main.toString().lines().forEach {\n            append(\"  \").appendLine(it)\n        }\n        appendLine(\"*** fallback:\")\n        fallback.toString().lines().forEach {\n            append(\"  \").appendLine(it)\n        }\n        appendLine(\"}\")\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/component/ComponentStorageDelegate.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.component\n\nimport net.mamoe.mirai.utils.TestOnly\n\ninternal class ComponentStorageDelegate(\n    private val instance: () -> ComponentStorage\n) : ComponentStorage {\n    @TestOnly\n    override val size: Int get() = instance().size\n    override fun <T : Any> get(key: ComponentKey<T>): T = instance()[key]\n    override fun <T : Any> getOrNull(key: ComponentKey<T>): T? = instance().getOrNull(key)\n    override val keys: Set<ComponentKey<*>> get() = instance().keys\n    override fun toString(): String = instance().toString()\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/component/ConcurrentComponentStorage.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.component\n\nimport net.mamoe.mirai.internal.network.component.ComponentKey.Companion.componentName\nimport net.mamoe.mirai.utils.ConcurrentHashMap\nimport net.mamoe.mirai.utils.TestOnly\nimport net.mamoe.mirai.utils.systemProp\nimport kotlin.LazyThreadSafetyMode.NONE\n\n/**\n * A thread-safe implementation of [MutableComponentStorage]\n */\ninternal class ConcurrentComponentStorage(\n    private val showAllComponents: Boolean = SHOW_ALL_COMPONENTS,\n    private val creationStacktrace: Exception? =\n        if (SHOW_COMPONENTS_CREATION_STACKTRACE) Exception(\"ConcurrentComponentStorage Creation stacktrace\") else null,\n) : ComponentStorage, MutableComponentStorage {\n    private val map = ConcurrentHashMap<ComponentKey<*>, Any?>()\n\n    override val keys: Set<ComponentKey<*>> get() = map.keys\n    @TestOnly\n    override val size: Int get() = map.size\n\n    override operator fun <T : Any> get(key: ComponentKey<T>): T {\n        return getOrNull(key)\n            ?: throw NoSuchComponentException(key, this, creationStacktrace)\n    }\n\n    override fun <T : Any> getOrNull(key: ComponentKey<T>): T? {\n        @Suppress(\"UNCHECKED_CAST\")\n        return map[key] as T?\n    }\n\n    override operator fun <T : Any> set(key: ComponentKey<T>, value: T) {\n        map[key] = value\n    }\n\n    override fun <T : Any> remove(key: ComponentKey<T>): T? {\n        @Suppress(\"UNCHECKED_CAST\")\n        return map.remove(key) as T?\n    }\n\n    override fun toString(): String {\n        if (showAllComponents) {\n            return buildString {\n                append(\"ConcurrentComponentStorage(size=\").append(map.size).append(\") {\").appendLine()\n                for ((key, value) in map) {\n                    append(\"  \").append(key.componentName(qualified = false)).append(\": \").append(value).appendLine()\n                }\n                append('}')\n            }\n        }\n        return \"ConcurrentComponentStorage(size=${map.size})\"\n    }\n}\n\ninternal inline fun ConcurrentComponentStorage(builderAction: ConcurrentComponentStorage.() -> Unit): ConcurrentComponentStorage {\n    return ConcurrentComponentStorage().apply(builderAction)\n}\n\nprivate val SHOW_ALL_COMPONENTS: Boolean by lazy(NONE) { systemProp(\"mirai.network.show.all.components\", false) }\nprivate val SHOW_COMPONENTS_CREATION_STACKTRACE: Boolean by lazy(NONE) {\n    systemProp(\n        \"mirai.network.show.components.creation.stacktrace\",\n        false\n    )\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/component/MutableComponentStorage.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.component\n\nimport net.mamoe.mirai.utils.TestOnly\nimport net.mamoe.mirai.utils.cast\n\ninternal interface MutableComponentStorage : ComponentStorage {\n    override operator fun <T : Any> get(key: ComponentKey<T>): T\n    operator fun <T : Any> set(key: ComponentKey<T>, value: T)\n    fun <T : Any> remove(key: ComponentKey<T>): T?\n\n}\n\n@TestOnly\ninternal fun MutableComponentStorage.setAll(other: ComponentStorage) {\n    for (key in other.keys) {\n        set(key.cast(), other[key])\n    }\n}\n\ninternal operator fun <T : Any> MutableComponentStorage.set(key: ComponentKey<T>, value: T?) {\n    if (value == null) {\n        remove(key)\n    } else {\n        set(key, value)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/component/NoSuchComponentException.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.component\n\n/**\n * Should not be thrown normally.\n */\ninternal data class NoSuchComponentException(\n    val key: ComponentKey<*>,\n    val storage: ComponentStorage,\n    override val cause: Throwable? = null\n) : NoSuchElementException() {\n    override val message: String by lazy {\n        \"No such component '$key' in storage: \\n$storage\"\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/AccountSecretsManager.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.internal.BotAccount\nimport net.mamoe.mirai.internal.network.LoginExtraData\nimport net.mamoe.mirai.internal.network.WLoginSigInfo\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.getRandomByteArray\nimport net.mamoe.mirai.internal.network.protocol.packet.login.wtlogin.get_mpasswd\nimport net.mamoe.mirai.internal.utils.accountSecretsFile\nimport net.mamoe.mirai.internal.utils.crypto.QQEcdhInitialPublicKey\nimport net.mamoe.mirai.internal.utils.crypto.TEA\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.utils.*\nimport kotlin.jvm.Synchronized\nimport kotlin.jvm.Volatile\nimport kotlin.random.Random\n\n/**\n * For a [Bot].\n *\n * @see MemoryAccountSecretsManager\n * @see FileCacheAccountSecretsManager\n * @see CombinedAccountSecretsManager\n */\ninternal interface AccountSecretsManager : Cacheable {\n    fun saveSecrets(account: BotAccount, secrets: AccountSecrets)\n    fun getSecrets(account: BotAccount): AccountSecrets?\n    override fun invalidate()\n\n    companion object : ComponentKey<AccountSecretsManager>\n}\n\n/**\n * Secrets for authentication with server. (login)\n */\ninternal interface AccountSecrets {\n    var wLoginSigInfoField: WLoginSigInfo?\n\n    val wLoginSigInfoInitialized get() = wLoginSigInfoField != null\n    var wLoginSigInfo: WLoginSigInfo\n        get() = wLoginSigInfoField ?: error(\"wLoginSigInfoField is not yet initialized\")\n        set(value) {\n            wLoginSigInfoField = value\n        }\n\n    /**\n     * t537\n     */\n    var loginExtraData: MutableSet<LoginExtraData>\n\n    var G: ByteArray // sigInfo[2]\n    var dpwd: ByteArray\n    var randSeed: ByteArray // t403\n\n    /**\n     * t108 时更新\n     */\n    var ksid: ByteArray\n\n    var tgtgtKey: ByteArray\n    val randomKey: ByteArray\n    var ecdhInitialPublicKey: QQEcdhInitialPublicKey\n}\n\n\n@Serializable\ninternal data class AccountSecretsImpl(\n    override var loginExtraData: MutableSet<LoginExtraData>,\n    override var wLoginSigInfoField: WLoginSigInfo?,\n    override var G: ByteArray,\n    override var dpwd: ByteArray = get_mpasswd().toByteArray(),\n    override var randSeed: ByteArray,\n    override var ksid: ByteArray,\n    override var tgtgtKey: ByteArray,\n    override val randomKey: ByteArray,\n    override var ecdhInitialPublicKey: QQEcdhInitialPublicKey,\n) : AccountSecrets, ProtoBuf {\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (!isSameType(this, other)) return false\n\n        if (loginExtraData != other.loginExtraData) return false\n        if (wLoginSigInfoField != other.wLoginSigInfoField) return false\n        if (!G.contentEquals(other.G)) return false\n        if (!dpwd.contentEquals(other.dpwd)) return false\n        if (!randSeed.contentEquals(other.randSeed)) return false\n        if (!ksid.contentEquals(other.ksid)) return false\n        if (!tgtgtKey.contentEquals(other.tgtgtKey)) return false\n        if (!randomKey.contentEquals(other.randomKey)) return false\n        if (ecdhInitialPublicKey != other.ecdhInitialPublicKey) return false\n\n        return true\n    }\n\n    override fun hashCode(): Int {\n        var result = loginExtraData.hashCode()\n        result = 31 * result + (wLoginSigInfoField?.hashCode() ?: 0)\n        result = 31 * result + G.contentHashCode()\n        result = 31 * result + dpwd.contentHashCode()\n        result = 31 * result + randSeed.contentHashCode()\n        result = 31 * result + ksid.contentHashCode()\n        result = 31 * result + tgtgtKey.contentHashCode()\n        result = 31 * result + randomKey.contentHashCode()\n        result = 31 * result + ecdhInitialPublicKey.hashCode()\n        return result\n    }\n}\n\ninternal fun AccountSecretsImpl(\n    other: AccountSecrets,\n): AccountSecretsImpl = other.run {\n    AccountSecretsImpl(\n        loginExtraData, wLoginSigInfoField, G, dpwd,\n        randSeed, ksid, tgtgtKey, randomKey, ecdhInitialPublicKey\n    )\n}\n\ninternal fun AccountSecretsImpl(\n    device: DeviceInfo,\n): AccountSecretsImpl {\n    return AccountSecretsImpl(\n        loginExtraData = ConcurrentSet(),\n        wLoginSigInfoField = null,\n        G = device.guid,\n        dpwd = get_mpasswd().toByteArray(),\n        randSeed = EMPTY_BYTE_ARRAY,\n        ksid = EMPTY_BYTE_ARRAY,\n        tgtgtKey = (Random.nextBytes(16) + device.guid).md5(),\n        randomKey = getRandomByteArray(16),\n        ecdhInitialPublicKey = QQEcdhInitialPublicKey.default\n    )\n}\n\n\ninternal fun AccountSecretsManager.getSecretsOrCreate(account: BotAccount, device: DeviceInfo): AccountSecrets {\n    var secrets = getSecrets(account)\n    if (secrets == null) {\n        secrets = AccountSecretsImpl(device)\n        saveSecrets(account, secrets)\n    }\n    return secrets\n}\n\ninternal class MemoryAccountSecretsManager : AccountSecretsManager {\n    @Volatile\n    private var instance: AccountSecrets? = null\n\n    @Synchronized\n    override fun saveSecrets(account: BotAccount, secrets: AccountSecrets) {\n        instance = secrets\n    }\n\n    @Synchronized\n    override fun getSecrets(account: BotAccount): AccountSecrets? = this.instance\n\n    @Synchronized\n    override fun invalidate() {\n        instance = null\n    }\n}\n\n\ninternal class FileCacheAccountSecretsManager(\n    val file: MiraiFile,\n    val logger: MiraiLogger,\n) : AccountSecretsManager {\n    @Synchronized\n    override fun saveSecrets(account: BotAccount, secrets: AccountSecrets) {\n        if (secrets.wLoginSigInfoField == null) return\n        saveSecretsToFile(file, account, secrets)\n        logger.info { \"Saved account secrets to local cache for fast login.\" }\n    }\n\n    @Synchronized\n    override fun getSecrets(account: BotAccount): AccountSecrets? {\n        return getSecretsImpl(account)\n    }\n\n    private fun getSecretsImpl(account: BotAccount): AccountSecrets? {\n        if (!file.exists()) return null\n        val loaded = kotlin.runCatching {\n            TEA.decrypt(file.readBytes(), account.accountSecretsKey).loadAs(AccountSecretsImpl.serializer())\n        }.getOrElse { e ->\n            if (e.message == \"Field 'ecdhInitialPublicKey' is required for type with serial name 'net.mamoe.mirai.internal.network.components.AccountSecretsImpl', but it was missing\") {\n                logger.info { \"Detected old account secrets, invalidating...\" }\n            } else {\n                logger.error(\"Failed to load account secrets from local cache. Invalidating cache...\", e)\n            }\n            file.delete()\n            return null\n        }\n\n        logger.info { \"Loaded account secrets from local cache.\" }\n        return loaded\n    }\n\n    @Synchronized\n    override fun invalidate() {\n        file.delete()\n    }\n\n    companion object {\n        fun saveSecretsToFile(file: MiraiFile, account: BotAccount, secrets: AccountSecrets) {\n            file.writeBytes(\n                TEA.encrypt(\n                    AccountSecretsImpl(secrets).toByteArray(AccountSecretsImpl.serializer()),\n                    account.accountSecretsKey\n                )\n            )\n        }\n    }\n}\n\ninternal class CombinedAccountSecretsManager(\n    private val primary: AccountSecretsManager,\n    private val alternative: AccountSecretsManager,\n) : AccountSecretsManager {\n    override fun saveSecrets(account: BotAccount, secrets: AccountSecrets) {\n        primary.saveSecrets(account, secrets)\n        alternative.saveSecrets(account, secrets)\n    }\n\n    override fun getSecrets(account: BotAccount): AccountSecrets? {\n        return primary.getSecrets(account) ?: alternative.getSecrets(account)\n    }\n\n    override fun invalidate() {\n        primary.invalidate()\n        alternative.invalidate()\n    }\n}\n\n/**\n * Create a [CombinedAccountSecretsManager] with [MemoryAccountSecretsManager] as primary and [FileCacheAccountSecretsManager] as an alternative.\n */\ninternal fun BotConfiguration.createAccountsSecretsManager(logger: MiraiLogger): AccountSecretsManager {\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n    return if (accountSecrets) {\n        CombinedAccountSecretsManager(\n            MemoryAccountSecretsManager(),\n            FileCacheAccountSecretsManager(accountSecretsFile(), logger)\n        )\n    } else {\n        MemoryAccountSecretsManager()\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/BdhSessionSyncer.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport kotlinx.coroutines.CompletableDeferred\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.builtins.SetSerializer\nimport net.mamoe.mirai.internal.network.JsonForCache\nimport net.mamoe.mirai.internal.network.ProtoBufForCache\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.component.ComponentStorage\nimport net.mamoe.mirai.internal.utils.actualCacheDir\nimport net.mamoe.mirai.utils.*\nimport kotlin.jvm.Volatile\n\ninternal interface BdhSessionSyncer : Cacheable {\n    val bdhSession: CompletableDeferred<BdhSession>\n    val hasSession: Boolean\n\n    fun overrideSession(\n        session: BdhSession,\n        doSave: Boolean = true\n    )\n\n    fun loadServerListFromCache()\n    fun loadFromCache()\n    fun saveServerListToCache()\n    fun saveToCache()\n\n    companion object : ComponentKey<BdhSessionSyncer>\n}\n\n@Serializable\ninternal class BdhSession(\n    val sigSession: ByteArray,\n    val sessionKey: ByteArray,\n    var ssoAddresses: MutableSet<Pair<Int, Int>> = ConcurrentSet(),\n    var otherAddresses: MutableSet<Pair<Int, Int>> = ConcurrentSet(),\n)\n\nprivate val ServerListSerializer: KSerializer<Set<ServerAddress>> =\n    SetSerializer(ServerAddress.serializer())\n\n@OptIn(ExperimentalCoroutinesApi::class)\ninternal class BdhSessionSyncerImpl(\n    private val configuration: BotConfiguration,\n    private val context: ComponentStorage,\n    private val logger: MiraiLogger,\n) : BdhSessionSyncer {\n    @Volatile\n    override var bdhSession: CompletableDeferred<BdhSession> = CompletableDeferred()\n    override val hasSession: Boolean\n        get() = kotlin.runCatching { bdhSession.getCompleted() }.isSuccess\n\n    override fun overrideSession(\n        session: BdhSession,\n        doSave: Boolean\n    ) {\n        bdhSession.complete(session)\n        bdhSession = CompletableDeferred(session)\n        if (doSave) {\n            saveToCache()\n        }\n    }\n\n    private val sessionCacheFile: MiraiFile\n        get() = configuration.actualCacheDir().resolve(\"session.bin\")\n    private val serverListCacheFile: MiraiFile\n        get() = configuration.actualCacheDir().resolve(\"servers.json\")\n\n    override fun invalidate() {\n        sessionCacheFile.delete()\n        serverListCacheFile.delete()\n    }\n\n    override fun loadServerListFromCache() {\n        val serverListCacheFile = this.serverListCacheFile\n        if (serverListCacheFile.isFile) {\n            logger.verbose(\"Loading server list from cache.\")\n            kotlin.runCatching {\n                val list = JsonForCache.decodeFromString(ServerListSerializer, serverListCacheFile.readText())\n                context[ServerList].setPreferred(list.map { ServerAddress(it.host, it.port) })\n            }.onFailure {\n                logger.warning(\"Error in loading server list from cache\", it)\n            }\n        } else {\n            logger.verbose(\"No server list cached.\")\n        }\n    }\n\n    override fun loadFromCache() {\n        val sessionCacheFile = this.sessionCacheFile\n        if (sessionCacheFile.isFile) {\n            logger.verbose(\"Loading BdhSession from cache file\")\n            kotlin.runCatching {\n                overrideSession(\n                    ProtoBufForCache.decodeFromByteArray(BdhSession.serializer(), sessionCacheFile.readBytes()),\n                    doSave = false\n                )\n            }.onFailure {\n                kotlin.runCatching { sessionCacheFile.delete() }\n                logger.warning(\"Error in loading BdhSession from cache\", it)\n            }\n        } else {\n            logger.verbose(\"No BdhSession cache\")\n        }\n    }\n\n    override fun saveServerListToCache() {\n        val serverListCacheFile = this.serverListCacheFile\n        serverListCacheFile.parent?.mkdirs()\n\n        logger.verbose(\"Saving server list to cache\")\n        kotlin.runCatching {\n            serverListCacheFile.writeText(\n                JsonForCache.encodeToString(\n                    ServerListSerializer,\n                    context[ServerList].getPreferred()\n                )\n            )\n        }.onFailure {\n            logger.warning(\"Error in saving ServerList to cache.\", it)\n        }\n    }\n\n    override fun saveToCache() {\n        val sessionCacheFile = this.sessionCacheFile\n        sessionCacheFile.parent?.mkdirs()\n        if (bdhSession.isCompleted) {\n            logger.verbose(\"Saving bdh session to cache\")\n            kotlin.runCatching {\n                sessionCacheFile.writeBytes(\n                    ProtoBufForCache.encodeToByteArray(\n                        BdhSession.serializer(),\n                        bdhSession.getCompleted()\n                    )\n                )\n            }.onFailure {\n                logger.warning(\"Error in saving BdhSession to cache.\", it)\n            }\n        } else {\n            sessionCacheFile.delete()\n            logger.verbose(\"No BdhSession to save to cache\")\n        }\n\n    }\n}\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/BotClientHolder.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.lateinitMutableProperty\n\ninternal interface BotClientHolder {\n    var client: QQAndroidClient\n\n    fun refreshClient()\n\n    companion object : ComponentKey<BotClientHolder>\n}\n\ninternal class BotClientHolderImpl(\n    private val bot: QQAndroidBot,\n    private val logger: MiraiLogger,\n) : BotClientHolder {\n    override var client: QQAndroidClient by lateinitMutableProperty { createClient(bot) }\n\n    override fun refreshClient() {\n        client = createClient(bot)\n    }\n\n    private fun createClient(bot: QQAndroidBot): QQAndroidClient {\n        val ssoContext = bot.components[SsoProcessorContext]\n        val device = ssoContext.device\n        return QQAndroidClient(\n            ssoContext.account,\n            device = device,\n            accountSecrets = bot.components[AccountSecretsManager].getSecretsOrCreate(ssoContext.account, device)\n        ).apply {\n            _bot = bot\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/BotInitProcessor.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport kotlinx.atomicfu.atomic\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.coroutineScope\nimport kotlinx.coroutines.isActive\nimport kotlinx.coroutines.launch\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.component.ComponentStorage\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.State\nimport net.mamoe.mirai.internal.network.handler.selector.NetworkException\nimport net.mamoe.mirai.internal.network.handler.state.JobAttachStateObserver\nimport net.mamoe.mirai.internal.network.handler.state.StateObserver\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.receive.MessageSvcPushForceOffline\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.Symbol\n\n\n/**\n * Handles initialization jobs after successful logon.\n *\n * The initialization includes:\n * - Downloading contact list, which might read from local cache\n * - Synchronizing message sequence id\n * - Synchronizing BDH session for resource uploading\n *\n * Calls [ContactUpdater], [OtherClientUpdater], [ConfigPushSyncer], ... (see [BotInitProcessorImpl])\n *\n * Attached to handler state [NetworkHandler.State.LOADING] [as state observer][asObserver] in [QQAndroidBot.stateObserverChain].\n */\ninternal interface BotInitProcessor {\n    /**\n     * Do initialization. Implementor must ensure initialization runs exactly single time.\n     */\n    suspend fun init()\n\n    /**\n     * Called when login was potentially halted, meaning the data might not have been loaded,\n     * so we need to set the flag that helps keep single-initialization to UNINITIALIZED.\n     *\n     * This is called in [MessageSvcPushForceOffline], which is in case connection is closed by server during the [NetworkHandler.State.LOADING] state.\n     *\n     * This function only marks current initialization work has failed. It has nothing to do with result of login.\n     * To update that result, update `bot.components[SsoProcessor].firstLoginResult`.\n     *\n     * See [BotInitProcessorImpl.state].\n     */\n    fun setLoginHalted()\n\n    companion object : ComponentKey<BotInitProcessor>\n}\n\ninternal fun BotInitProcessor.asObserver(targetState: State = State.LOADING): StateObserver {\n    return JobAttachStateObserver(\"BotInitProcessor.init\", targetState) { init() }\n}\n\n\ninternal class BotInitProcessorImpl(\n    private val bot: QQAndroidBot,\n    private val context: ComponentStorage,\n    private val logger: MiraiLogger,\n) : BotInitProcessor {\n    companion object {\n        private val UNINITIALIZED = Symbol(\"UNINITIALIZED\")\n        private val INITIALIZING = Symbol(\"INITIALIZING\")\n        private val INITIALIZED = Symbol(\"INITIALIZED\")\n    }\n\n    private val state = atomic(UNINITIALIZED)\n\n    override fun setLoginHalted() {\n        state.compareAndSet(expect = INITIALIZING, update = UNINITIALIZED)\n    }\n\n    override suspend fun init() {\n        if (!state.compareAndSet(expect = UNINITIALIZED, update = INITIALIZING)) return\n\n        try {\n            check(bot.isActive) { \"bot is dead therefore network can't init.\" }\n            context[ContactUpdater].closeAllContacts(CancellationException(\"re-init\"))\n\n            val registerResp =\n                context[SsoProcessor].registerResp ?: error(\"Internal error: registerResp is not yet available.\")\n\n            context[MessageSvcSyncer].startSync()\n            context[BdhSessionSyncer].loadFromCache()\n\n            // do them parallel.\n            coroutineScope {\n                launch { runWithCoverage(\"loading OtherClients\") { context[OtherClientUpdater].update() } }\n                launch { runWithCoverage(\"loading friends\") { context[ContactUpdater].reloadFriendList(registerResp.origin) } }\n                launch { runWithCoverage(\"loading groups\") { context[ContactUpdater].reloadGroupList() } }\n                launch { runWithCoverage(\"loading otherClients\") { context[ContactUpdater].reloadStrangerList() } }\n                launch { runWithCoverage(\"loading friendGroups\") { context[ContactUpdater].reloadFriendGroupList() } }\n            }\n\n            state.value = INITIALIZED\n            bot.components[SsoProcessor].casFirstLoginResult(null, FirstLoginResult.PASSED)\n        } catch (e: Throwable) {\n            setLoginHalted()\n            bot.components[SsoProcessor].casFirstLoginResult(null, FirstLoginResult.OTHER_FAILURE)\n            throw e\n        }\n    }\n\n    private inline fun runWithCoverage(hint: String, block: () -> Unit) {\n        try {\n            block()\n        } catch (e: NetworkException) {\n            logger.warning(\n                \"An NetworkException was thrown during '$hint' of Bot ${bot.id}. \" +\n                        \"This means your network is unstable at this moment, \" +\n                        \"or the server has closed the connection due to some reason (you will see the cause if further trials are all failed). \" +\n                        \"Halting the log-in process to wait for a while to reconnect...\"\n            )\n            throw e\n        } catch (e: Throwable) {\n            logger.warning(\n                \"An exception was thrown during '$hint' of Bot ${bot.id}. \" +\n                        \"Trying to ignore the error and continue logging in...\",\n                e\n            )\n        }\n    }\n\n}\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/BotOfflineEventMonitor.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport kotlinx.coroutines.CoroutineScope\nimport net.mamoe.mirai.event.ConcurrencyKind\nimport net.mamoe.mirai.event.EventPriority\nimport net.mamoe.mirai.event.events.BotOfflineEvent\nimport net.mamoe.mirai.event.subscribeAlways\nimport net.mamoe.mirai.internal.AbstractBot\nimport net.mamoe.mirai.internal.asQQAndroidBot\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.State\nimport net.mamoe.mirai.internal.network.handler.selector.NetworkException\nimport net.mamoe.mirai.utils.*\n\n/**\n * Handles [BotOfflineEvent]. It launches recovery jobs when receiving offline events from server.\n */\ninternal interface BotOfflineEventMonitor {\n    companion object : ComponentKey<BotOfflineEventMonitor>\n\n    /**\n     * Attach a listener to the [scope]. [scope] is usually the scope of [NetworkHandler.State.OK].\n     */\n    fun attachJob(bot: AbstractBot, scope: CoroutineScope)\n}\n\ninternal data class BotClosedByEvent(\n    val event: BotOfflineEvent,\n    override val message: String? = \"Bot is closed by event '$event'.\",\n) : NetworkException(false)\n\ninternal class BotOfflineEventMonitorImpl : BotOfflineEventMonitor {\n    override fun attachJob(bot: AbstractBot, scope: CoroutineScope) {\n        bot.eventChannel.parentScope(scope).subscribeAlways(\n            ::onEvent,\n            priority = EventPriority.MONITOR,\n            concurrency = ConcurrencyKind.LOCKED,\n        )\n    }\n\n    private fun onEvent(event: BotOfflineEvent) {\n        val bot = event.bot.asQQAndroidBot()\n        val network = bot.network\n\n        fun closeNetwork() {\n            if (network.state == State.CLOSED) return // avoid recursive calls.\n            network.close(if (event is BotOfflineEvent.CauseAware) event.cause else BotClosedByEvent(event))\n        }\n\n        when (event) {\n            is BotOfflineEvent.Active -> {\n                // This event might also be broadcast by the network handler by a state observer.\n                // In that case, `network.state` will be `CLOSED` then `closeNetwork` returns immediately.\n                // So there won't be recursive calls.\n\n                val cause = event.cause\n                val msg = if (cause == null) \"\" else \" with exception: $cause\"\n                bot.logger.info(\"Bot is closed manually$msg\", cause)\n\n                closeNetwork()\n            }\n            is BotOfflineEvent.Force -> {\n                bot.logger.warning { \"Connection occupied by another android device. Will try to resume connection. (${event.message})\" }\n                closeNetwork()\n            }\n            is BotOfflineEvent.MsfOffline -> {\n                // This normally means bot is blocked and requires manual action.\n                bot.logger.warning { \"Server notifies offline. (${event.cause?.message ?: event.toString()})\" }\n                closeNetwork()\n                // `closeNetwork` will close NetworkHandler,\n                // after which NetworkHandlerSelector will create a new instance to try to fix the problem.\n                // A new login attempt will fail because the bot is blocked, with LoginFailedException which then wrapped into NetworkException. (LoginFailedExceptionAsNetworkException)\n                // Selector will handle this exception, and close the block while logging this down.\n\n                // See SelectorNetworkHandler.instance for more information on how the Selector handles the exception.\n            }\n            is BotOfflineEvent.Dropped,\n            is BotOfflineEvent.RequireReconnect,\n            -> {\n                val causeMessage = event.castOrNull<BotOfflineEvent.CauseAware>()?.cause?.toString() ?: event.toString()\n                bot.logger.warning { \"Connection lost, reconnecting... ($causeMessage)\" }\n                closeNetwork()\n            }\n        }\n\n        if (event.reconnect) {\n            launchRecovery(bot)\n        }\n    }\n\n    private fun launchRecovery(bot: AbstractBot) {\n        // Run this coroutine in EventDispatcher, so joinBroadcast will work.\n        // EventDispatcher is in Bot's components level so won't be closed by network.\n        bot.components[EventDispatcher].broadcastAsync {\n            var success = false\n            val time = measureTimeMillis {\n                success = kotlin.runCatching {\n                    bot.network.resumeConnection()\n                }.isSuccess\n            }\n\n            if (success) {\n                bot.logger.info { \"Reconnected successfully in ${time.millisToHumanReadableString()}.\" }\n            }\n\n            null\n        }\n    }\n\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/CacheValidator.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.utils.MiraiProtocolInternal\nimport net.mamoe.mirai.internal.utils.io.writeShortLVString\nimport net.mamoe.mirai.utils.*\n\n/**\n * Validator for checking caches is usable for current bot or not.\n */\ninternal interface CacheValidator {\n    fun register(cache: Cacheable)\n\n    fun validate()\n\n    companion object : ComponentKey<CacheValidator>\n}\n\ninternal interface Cacheable {\n    fun invalidate()\n}\n\ninternal class CacheValidatorImpl(\n    private val ssoProcessorContext: SsoProcessorContext,\n    private val hashFile: MiraiFile,\n    private val logger: MiraiLogger,\n) : CacheValidator {\n    private val caches: MutableList<Cacheable> = mutableListOf()\n\n    override fun register(cache: Cacheable) {\n        caches.add(cache)\n    }\n\n    override fun validate() {\n\n        val hash: ByteArray = buildPacket {\n            val botConf = ssoProcessorContext.configuration\n            writeInt(botConf.protocol.ordinal)\n            val internalProtocol = MiraiProtocolInternal[botConf.protocol]\n            writeShortLVString(internalProtocol.apkId)\n            writeLong(internalProtocol.id)\n            writeShortLVString(internalProtocol.sdkVer)\n            writeInt(internalProtocol.miscBitMap)\n            writeInt(internalProtocol.subSigMap)\n            writeInt(internalProtocol.mainSigMap)\n            writeShortLVString(internalProtocol.sign)\n            writeLong(internalProtocol.buildTime)\n            writeInt(internalProtocol.ssoVersion)\n\n            val device = ssoProcessorContext.device\n\n            @Suppress(\"INVISIBLE_MEMBER\")\n            writeFully(device.serializeToString().encodeToByteArray())\n        }.let { pkg ->\n            try {\n                pkg.readBytes()\n            } finally {\n                pkg.release()\n            }\n        }.sha1()\n\n        if (!hashFile.exists()) {\n            logger.verbose { \"Invalidate caches because hash file not available.\" }\n\n            invalidate()\n\n            kotlin.runCatching {\n                hashFile.writeBytes(hash)\n            }.onFailure { logger.warning(\"Exception in writing hash to validation file\", it) }\n            return\n        }\n        if (!hashFile.isFile) {\n            logger.verbose { \"hash file isn't a file.\" }\n            invalidate()\n\n            kotlin.runCatching {\n                hashFile.deleteRecursively()\n                hashFile.writeBytes(hash)\n            }.onFailure { logger.warning(\"Exception in writing hash to validation file\", it) }\n            return\n        }\n\n        try {\n            val hashInFile = hashFile.readBytes()\n            if (hashInFile.contentEquals(hash)) {\n                logger.verbose { \"Validated caches.\" }\n                return\n            }\n\n            logger.verbose { \"Hash not match. Invaliding caches.....\" }\n            invalidate()\n\n            hashFile.writeBytes(hash)\n        } catch (e: Throwable) {\n            logger.warning(\"Exception in validation. Invalidating.....\", e)\n            invalidate()\n        }\n\n    }\n\n    private fun invalidate() {\n        caches.forEach { it.invalidate() }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/ClockComponent.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.utils.Clock\nimport net.mamoe.mirai.utils.lateinitMutableProperty\n\ninternal open class ClockHolder {\n    open val local: Clock get() = Clock.SystemDefault\n    open var server: Clock by lateinitMutableProperty { local }\n\n    companion object : ComponentKey<ClockHolder> {\n        val QQAndroidBot.clock get() = components[ClockHolder]\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/ConfigPushProcessor.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport kotlinx.coroutines.withTimeoutOrNull\nimport net.mamoe.mirai.event.EventPriority\nimport net.mamoe.mirai.event.events.BotOfflineEvent\nimport net.mamoe.mirai.event.globalEventChannel\nimport net.mamoe.mirai.event.nextEvent\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.selector.NetworkException\nimport net.mamoe.mirai.internal.network.protocol.packet.login.ConfigPushSvc\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.warning\n\n/**\n * Job: Switch server if ConfigPush not received.\n */\ninternal interface ConfigPushProcessor {\n    suspend fun syncConfigPush(network: NetworkHandler)\n\n    companion object : ComponentKey<ConfigPushProcessor>\n}\n\ninternal class ConfigPushProcessorImpl(\n    private val logger: MiraiLogger,\n) : ConfigPushProcessor {\n    override suspend fun syncConfigPush(network: NetworkHandler) {\n        val resp = withTimeoutOrNull(60_000) {\n            globalEventChannel().nextEvent<ConfigPushSvc.PushReq.PushReqResponse>(\n                EventPriority.MONITOR\n            ) { it.bot == network.context.bot }\n        }\n\n        if (resp == null) {\n            val bdhSyncer = network.context[BdhSessionSyncer]\n            if (!bdhSyncer.hasSession) {\n                val e = NetworkException(\"Timeout waiting for ConfigPush.\",true)\n                bdhSyncer.bdhSession.completeExceptionally(e)\n                logger.warning { \"Missing ConfigPush. Switching server...\" }\n                network.context[SsoProcessor].casFirstLoginResult(null, FirstLoginResult.CHANGE_SERVER)\n                network.context.bot.components[EventDispatcher].broadcastAsync(\n                    BotOfflineEvent.RequireReconnect(\n                        network.context.bot,\n                        e\n                    )\n                )\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/ConfigPushSyncer.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport net.mamoe.mirai.internal.network.component.ComponentKey\n\ninternal interface ConfigPushSyncer {\n    suspend fun awaitSync()\n\n    companion object : ComponentKey<ConfigPushSyncer>\n}\n\ninternal class ConfigPushSyncerImpl : ConfigPushSyncer {\n    override suspend fun awaitSync() {\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/ContactCacheService.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport kotlinx.serialization.json.Json\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.FriendListCache\nimport net.mamoe.mirai.internal.network.GroupMemberListCaches\nimport net.mamoe.mirai.internal.network.JsonForCache\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.utils.ScheduledJob\nimport net.mamoe.mirai.internal.utils.friendCacheFile\nimport net.mamoe.mirai.utils.*\n\n/**\n * Strategy of caching contacts. Used by [ContactUpdater].\n */\ninternal interface ContactCacheService {\n    val friendListCache: FriendListCache? // from old code\n    val groupMemberListCaches: GroupMemberListCaches? // from old code\n\n    /**\n     * Implementation does not need to be thread-safe.\n     */\n    fun saveFriendCache() // from old code\n\n    companion object : ComponentKey<ContactCacheService>\n}\n\ninternal class ContactCacheServiceImpl(\n    private val bot: QQAndroidBot,\n    private val logger: MiraiLogger,\n) : ContactCacheService {\n    private val configuration get() = bot.configuration\n\n    ///////////////////////////////////////////////////////////////////////////\n    // contact cache\n    ///////////////////////////////////////////////////////////////////////////\n\n    companion object {\n        internal val json: Json = kotlin.runCatching {\n            Json {\n                isLenient = true\n                ignoreUnknownKeys = true\n                prettyPrint = true\n            }\n        }.getOrElse {\n            @Suppress(\"JSON_FORMAT_REDUNDANT_DEFAULT\") // compatibility for older versions\n            (Json {})\n        }\n    }\n\n    override val friendListCache: FriendListCache? by lazy {\n        if (!configuration.contactListCache.friendListCacheEnabled) return@lazy null\n        val file = configuration.friendCacheFile()\n        val ret = file.loadNotBlankAs(FriendListCache.serializer(), JsonForCache) ?: FriendListCache()\n\n        @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n        bot.eventChannel.parentScope(bot)\n            .subscribeAlways<net.mamoe.mirai.event.events.FriendInfoChangeEvent> {\n                friendListSaver?.notice()\n            }\n        ret\n    }\n\n    override val groupMemberListCaches: GroupMemberListCaches? by lazy {\n        if (!configuration.contactListCache.groupMemberListCacheEnabled) {\n            return@lazy null\n        }\n        GroupMemberListCaches(bot, logger)\n    }\n\n    private val friendListSaver: ScheduledJob? by lazy {\n        if (!configuration.contactListCache.friendListCacheEnabled) return@lazy null\n        ScheduledJob(bot.coroutineContext, configuration.contactListCache.saveIntervalMillis) {\n            runBIO { saveFriendCache() }\n        }\n    }\n\n    override fun saveFriendCache() {\n        val friendListCache = friendListCache ?: return\n\n        configuration.friendCacheFile().run {\n            createFileIfNotExists()\n            writeText(JsonForCache.encodeToString(FriendListCache.serializer(), friendListCache))\n            logger.info { \"Saved ${friendListCache.list.size} friends to local cache.\" }\n        }\n    }\n\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/ContactUpdater.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.coroutineScope\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.Semaphore\nimport kotlinx.coroutines.sync.withLock\nimport kotlinx.coroutines.sync.withPermit\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.data.MemberInfo\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.GroupImpl\nimport net.mamoe.mirai.internal.contact.StrangerImpl\nimport net.mamoe.mirai.internal.contact.friendgroup.FriendGroupImpl\nimport net.mamoe.mirai.internal.contact.info.*\nimport net.mamoe.mirai.internal.contact.toMiraiFriendInfo\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.component.ComponentStorage\nimport net.mamoe.mirai.internal.network.isValid\nimport net.mamoe.mirai.internal.network.notice.NewContactSupport\nimport net.mamoe.mirai.internal.network.protocol.data.jce.StGroupRankInfo\nimport net.mamoe.mirai.internal.network.protocol.data.jce.StTroopNum\nimport net.mamoe.mirai.internal.network.protocol.data.jce.SvcRespRegister\nimport net.mamoe.mirai.internal.network.protocol.data.jce.isValid\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.TroopManagement\nimport net.mamoe.mirai.internal.network.protocol.packet.list.FriendList\nimport net.mamoe.mirai.internal.network.protocol.packet.list.StrangerList\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.info\nimport net.mamoe.mirai.utils.retryCatching\nimport net.mamoe.mirai.utils.verbose\nimport kotlin.jvm.Volatile\n\n/**\n * Manager of caches for [Contact]s.\n *\n * Uses [ContactCacheService].\n */\ninternal interface ContactUpdater {\n    val otherClientsLock: Mutex\n    val groupListModifyLock: Mutex\n    val friendListLock: Mutex\n    val friendGroupsLock: Mutex\n    val strangerListLock: Mutex\n\n    suspend fun reloadFriendList(registerResp: SvcRespRegister)\n    suspend fun reloadFriendGroupList()\n    suspend fun reloadGroupList()\n    suspend fun reloadStrangerList()\n\n    /**\n     * Closes all contacts and save them to cache if needed.\n     *\n     * Implementation must be thread-safe.\n     */\n    fun closeAllContacts(e: CancellationException)\n\n    companion object : ComponentKey<ContactUpdater>\n}\n\ninternal class ContactUpdaterImpl(\n    val bot: QQAndroidBot, // not good\n    val components: ComponentStorage,\n    private val logger: MiraiLogger,\n) : ContactUpdater, NewContactSupport {\n    override val otherClientsLock: Mutex = Mutex()\n    override val groupListModifyLock: Mutex = Mutex()\n    override val friendListLock: Mutex = Mutex()\n    override val friendGroupsLock: Mutex = Mutex()\n    override val strangerListLock: Mutex = Mutex()\n    private val cacheService get() = components[ContactCacheService]\n\n    override fun closeAllContacts(e: CancellationException) {\n        if (!initFriendOk) {\n            bot.friends.delegate.removeAll { it.cancel(e); true }\n        }\n        if (!initGroupOk) {\n            bot.groups.delegate.removeAll { it.cancel(e); true }\n        }\n        if (!initStrangerOk) {\n            bot.strangers.delegate.removeAll { it.cancel(e); true }\n        }\n        if (!initFriendGroupOk) {\n            bot.friendGroups.friendGroups.clear()\n        }\n    }\n\n\n    @Volatile\n    private var initFriendOk = false\n\n    @Volatile\n    private var initFriendGroupOk = false\n\n    @Volatile\n    private var initGroupOk = false\n\n    @Volatile\n    private var initStrangerOk = false\n\n    /**\n     * Don't use concurrently\n     */\n    override suspend fun reloadFriendList(registerResp: SvcRespRegister) = friendListLock.withLock {\n        if (initFriendOk) {\n            return\n        }\n\n        val friendListCache = cacheService.friendListCache\n\n        fun updateCacheSeq(list: List<FriendInfoImpl>) {\n            cacheService.friendListCache?.apply {\n                friendListSeq = registerResp.iLargeSeq\n                timeStamp = registerResp.timeStamp\n                this.list = list\n                cacheService.saveFriendCache()\n            }\n        }\n\n        suspend fun refreshFriendList(): List<FriendInfoImpl> {\n            logger.info { \"Start loading friend list...\" }\n            val friendInfos = mutableListOf<FriendInfoImpl>()\n\n            var count = 0\n            var total: Short\n            while (true) {\n                val data = bot.network.sendAndExpect(\n                    FriendList.GetFriendGroupList(bot.client, count, 150, 0, 0),\n                    timeout = 5000,\n                    attempts = 2\n                )\n\n                total = data.totalFriendCount\n\n                for (jceInfo in data.friendList) {\n                    friendInfos.add(jceInfo.toMiraiFriendInfo())\n                }\n\n                count += data.friendList.size\n                logger.verbose { \"Loading friend list: ${count}/${total}\" }\n                if (count >= total) break\n            }\n            logger.info { \"Successfully loaded friend list: $count in total\" }\n            return friendInfos\n        }\n\n        val list = if (friendListCache?.isValid(registerResp) == true) {\n            val list = friendListCache.list\n            logger.info { \"Loaded ${list.size} friends from local cache.\" }\n\n            // For sync bot nick\n            bot.network.sendAndExpect(\n                FriendList.GetFriendGroupList(\n                    bot.client, 0, 1, 0, 0\n                )\n            )\n\n            list\n        } else {\n            refreshFriendList().also {\n                updateCacheSeq(it)\n            }\n        }\n\n        for (friendInfoImpl in list) {\n            bot.addNewFriendAndRemoveStranger(friendInfoImpl)\n        }\n\n        initFriendOk = true\n    }\n\n    override suspend fun reloadFriendGroupList() = friendGroupsLock.withLock {\n        if (initFriendGroupOk) return\n\n        suspend fun refreshFriendGroupList(): List<FriendGroupImpl> {\n            logger.info { \"Start loading friendGroup list...\" }\n            val friendGroupInfos = mutableListOf<FriendGroupImpl>()\n\n            var count = 0\n            var total: Short\n            while (true) {\n                val data = bot.network.sendAndExpect(\n                    FriendList.GetFriendGroupList(bot.client, 0, 0, count, 150)\n                )\n\n                total = data.totoalGroupCount\n\n                for (jceInfo in data.groupList) {\n                    friendGroupInfos.add(\n                        FriendGroupImpl(\n                            bot, FriendGroupInfo(\n                                jceInfo.groupId.toInt(),\n                                jceInfo.groupname\n                            )\n                        )\n                    )\n                }\n\n                count += data.groupList.size\n                logger.verbose { \"Loading friendGroup list: ${count}/${total}\" }\n                if (count >= total) break\n            }\n            logger.info { \"Successfully loaded friendGroup list: $count in total\" }\n            return friendGroupInfos\n        }\n\n        bot.friendGroups.friendGroups.clear()\n        bot.friendGroups.friendGroups.addAll(refreshFriendGroupList())\n\n        initFriendGroupOk = true\n    }\n\n    private suspend fun addGroupToBot(stTroopNum: StTroopNum, stGroupRankInfo: StGroupRankInfo?) = stTroopNum.run {\n        suspend fun refreshGroupMemberList(): Sequence<MemberInfo> {\n            return Mirai.getRawGroupMemberList(\n                bot,\n                groupUin,\n                groupCode,\n                dwGroupOwnerUin\n            )\n        }\n\n        val cache = cacheService.groupMemberListCaches?.get(groupCode)\n        val members = if (cache != null) {\n            if (cache.isValid(stTroopNum)) {\n                cache.list.asSequence().also {\n                    logger.info { \"Loaded ${cache.list.size} members from local cache for group $groupName (${groupCode})\" }\n                }\n            } else refreshGroupMemberList().also { sequence ->\n                cache.troopMemberNumSeq = dwMemberNumSeq ?: 0\n                cache.list = sequence.mapTo(ArrayList()) { it as MemberInfoImpl }\n                cacheService.groupMemberListCaches!!.map[groupCode] = cache\n                cacheService.groupMemberListCaches!!.reportChanged(groupCode)\n            }\n        } else {\n            refreshGroupMemberList()\n        }\n\n        bot.groups.delegate.add(\n            GroupImpl(\n                bot = bot,\n                parentCoroutineContext = bot.coroutineContext,\n                id = groupCode,\n                groupInfo = GroupInfoImpl(stTroopNum, stGroupRankInfo),\n                members = members,\n            ),\n        )\n    }\n\n    override suspend fun reloadStrangerList() = strangerListLock.withLock {\n        if (initStrangerOk) {\n            return\n        }\n        var currentCount = 0\n        logger.info { \"Start loading stranger list...\" }\n\n        val response = bot.network.sendAndExpect(\n            StrangerList.GetStrangerList(bot.client),\n            timeout = 5000,\n            attempts = 2\n        )\n\n        if (response.result == 0) {\n            response.strangerList.forEach {\n                // atomic\n                bot.strangers.delegate.add(\n                    StrangerImpl(bot, bot.coroutineContext, StrangerInfoImpl(it.uin, it.nick.decodeToString()))\n                ).also { currentCount++ }\n            }\n        }\n        logger.info { \"Successfully loaded stranger list: $currentCount in total\" }\n        initStrangerOk = true\n\n    }\n\n    override suspend fun reloadGroupList() = groupListModifyLock.withLock {\n        if (initGroupOk) {\n            return\n        }\n\n        bot.network.sendAndExpect(TroopManagement.GetTroopConfig(bot.client))\n\n        logger.info { \"Start loading group list...\" }\n\n        val troopListData = bot.network.sendAndExpect(FriendList.GetTroopListSimplify(bot.client), attempts = 5)\n\n        val semaphore = Semaphore(30)\n\n        coroutineScope {\n            troopListData.groups.forEach { group ->\n                launch {\n                    semaphore.withPermit {\n                        retryCatching(5) {\n                            addGroupToBot(group, troopListData.ranks.find { it.dwGroupCode == group.groupCode })\n                        }.getOrThrow()\n                    }\n                }\n            }\n        }\n\n        logger.info { \"Successfully loaded group list: ${troopListData.groups.size} in total.\" }\n        cacheService.groupMemberListCaches?.saveGroupCaches()\n        initGroupOk = true\n    }\n\n\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/EcdhInitialPublicKeyUpdater.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport io.ktor.client.request.*\nimport io.ktor.client.statement.*\nimport kotlinx.coroutines.withTimeout\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.Json\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.protocol.packet.createChannelProxy\nimport net.mamoe.mirai.internal.spi.EncryptServiceContext\nimport net.mamoe.mirai.internal.utils.actualCacheDir\nimport net.mamoe.mirai.internal.utils.crypto.QQEcdh\nimport net.mamoe.mirai.internal.utils.crypto.QQEcdhInitialPublicKey\nimport net.mamoe.mirai.internal.utils.crypto.verify\nimport net.mamoe.mirai.internal.utils.workingDirPath\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.buildTypeSafeMap\nimport net.mamoe.mirai.utils.currentTimeSeconds\nimport kotlin.time.Duration.Companion.seconds\n\n\n/**\n * Updater for updating [QQEcdhInitialPublicKey].\n */\ninternal interface EcdhInitialPublicKeyUpdater {\n    /**\n     * Refresh the [QQEcdhInitialPublicKey]\n     */\n    suspend fun refreshInitialPublicKeyAndApplyEcdh()\n\n    suspend fun initializeSsoSecureEcdh()\n\n    fun getQQEcdh(): QQEcdh\n\n    companion object : ComponentKey<EcdhInitialPublicKeyUpdater>\n}\n\ninternal class EcdhInitialPublicKeyUpdaterImpl(\n    private val bot: QQAndroidBot,\n    private val logger: MiraiLogger\n) : EcdhInitialPublicKeyUpdater {\n    @Serializable\n    data class ServerRespPOJO(\n\n        @SerialName(\"PubKeyMeta\")\n        val pubKeyMeta: PubKeyMeta,\n\n        @SerialName(\"QuerySpan\")\n        val querySpan: Int = 0\n    )\n\n    @Serializable\n    data class PubKeyMeta(\n\n        @SerialName(\"PubKey\")\n        val pubKey: String,\n\n        @SerialName(\"PubKeySign\")\n        val pubKeySign: String,\n\n        @SerialName(\"KeyVer\")\n        val keyVer: Int\n    )\n\n    var qqEcdh: QQEcdh? = null\n    override fun getQQEcdh(): QQEcdh {\n        if (qqEcdh == null) {\n            error(\"Calling getQQEcdh without calling refreshInitialPublicKeyAndApplyEcdh\")\n        }\n        return qqEcdh!!\n    }\n\n    override suspend fun refreshInitialPublicKeyAndApplyEcdh() {\n\n        val initialPublicKey = kotlin.runCatching {\n            val currentPublicKey = bot.client.ecdhInitialPublicKey\n            if (currentPublicKey.expireTime > currentTimeSeconds()) {\n                logger.info(\"ECDH key is valid.\")\n                currentPublicKey\n            } else {\n                logger.info(\"ECDH key is invalid, start to fetch ecdh public key from server.\")\n                val respStr =\n                    withTimeout(10.seconds) {\n                        bot.components[HttpClientProvider].getHttpClient()\n                            .get(\"https://keyrotate.qq.com/rotate_key?cipher_suite_ver=305&uin=${bot.client.uin}\")\n                            .bodyAsText()\n                    }\n                val resp = Json.decodeFromString(ServerRespPOJO.serializer(), respStr)\n                resp.pubKeyMeta.let { meta ->\n                    val key = QQEcdhInitialPublicKey(meta.keyVer, meta.pubKey, currentTimeSeconds() + resp.querySpan)\n                    check(key.verify(meta.pubKeySign)) { \"Ecdh public key which from server is invalid\" }\n                    logger.info(\"Successfully fetched ecdh public key from server.\")\n                    key\n                }\n            }\n        }.getOrElse {\n            logger.error(\"Failed to fetch ECDH public key from server, using default key instead\", it)\n            QQEcdhInitialPublicKey.default\n        }\n        bot.client.ecdhInitialPublicKey = initialPublicKey\n        qqEcdh = QQEcdh(initialPublicKey)\n    }\n\n    override suspend fun initializeSsoSecureEcdh() {\n        val encryptWorker = bot.encryptServiceOrNull\n\n        if (encryptWorker == null) {\n            logger.info(\"EncryptService SPI is not provided, sso secure ecdh will not be initialized.\")\n            return\n        }\n\n        encryptWorker.initialize(EncryptServiceContext(bot.id, buildTypeSafeMap {\n            set(EncryptServiceContext.KEY_CHANNEL_PROXY, createChannelProxy(bot))\n            set(EncryptServiceContext.KEY_DEVICE_INFO, bot.client.device)\n            set(EncryptServiceContext.KEY_BOT_PROTOCOL, bot.configuration.protocol)\n            set(EncryptServiceContext.KEY_QIMEI36, bot.client.qimei36 ?: \"\")\n            set(EncryptServiceContext.KEY_BOT_WORKING_DIR, bot.configuration.workingDirPath)\n            set(EncryptServiceContext.KEY_BOT_CACHING_DIR, bot.configuration.actualCacheDir().absolutePath)\n        }))\n    }\n\n\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/EncryptServiceHolder.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport net.mamoe.mirai.internal.AbstractBot\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.spi.EncryptService\nimport net.mamoe.mirai.internal.spi.EncryptServiceContext\nimport net.mamoe.mirai.internal.utils.actualCacheDir\nimport net.mamoe.mirai.internal.utils.workingDirPath\nimport net.mamoe.mirai.utils.buildTypeSafeMap\nimport net.mamoe.mirai.utils.childScope\n\ninternal interface EncryptServiceHolder {\n    companion object : ComponentKey<EncryptServiceHolder>\n\n    val isAvailable: Boolean\n\n    val service: EncryptService\n\n    val serviceOrNull: EncryptService?\n\n}\n\n\ninternal class EncryptServiceHolderImpl(\n    bot: AbstractBot,\n    ssoProcessorContext: SsoProcessorContext,\n) : EncryptServiceHolder {\n    override var isAvailable: Boolean = false\n        private set\n\n    private var service0: EncryptService? = null\n\n    override val serviceOrNull: EncryptService? get() = service0\n    override val service: EncryptService\n        get() = service0 ?: error(\"Encrypt Service not available\")\n\n    init {\n        EncryptService.factory?.let { globalService ->\n            try {\n                service0 = globalService.createForBot(\n                    EncryptServiceContext(bot.id, buildTypeSafeMap {\n                        set(EncryptServiceContext.KEY_BOT_PROTOCOL, bot.configuration.protocol)\n                        set(EncryptServiceContext.KEY_DEVICE_INFO, ssoProcessorContext.device)\n                        set(EncryptServiceContext.KEY_BOT_WORKING_DIR, bot.configuration.workingDirPath)\n                        set(EncryptServiceContext.KEY_BOT_CACHING_DIR, bot.configuration.actualCacheDir().absolutePath)\n                    }),\n\n                    bot.childScope(name = \"Encrypt Service\"),\n                )\n\n                isAvailable = true\n            } catch (error: UnsupportedOperationException) {\n                bot.logger.warning(\"$globalService is not yet supported EncryptService with bot $bot\", error)\n                isAvailable = false\n                service0 = null\n            } catch (_: EncryptService.SignalServiceNotAvailable) {\n                isAvailable = false\n                service0 = null\n            } /* catch (error: Throwable) { throw error } */ // crash bot initialize\n        }\n    }\n}\n\n\ninternal val AbstractBot.encryptService: EncryptService get() = components[EncryptServiceHolder].service\ninternal val AbstractBot.encryptServiceOrNull: EncryptService? get() = components[EncryptServiceHolder].serviceOrNull\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/EventDispatcher.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.event.EventChannel\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.internal.event.EventChannelToEventDispatcherAdapter\nimport net.mamoe.mirai.internal.event.InternalEventMechanism\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.utils.*\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\nimport kotlin.jvm.JvmInline\n\n/**\n * All events will be caught and forwarded to [EventDispatcher]. Invocation of [Event.broadcast] and [EventDispatcher.broadcast] are effectively equal.\n */\ninternal interface EventDispatcher {\n    val isActive: Boolean\n\n    /**\n     * Broadcast an event using [EventChannel]. It's safe to use this function internally.\n     */\n    suspend fun broadcast(event: Event)\n\n    fun broadcastAsync(event: Event, additionalContext: CoroutineContext = EmptyCoroutineContext): EventBroadcastJob\n\n    fun broadcastAsync(\n        additionalContext: CoroutineContext = EmptyCoroutineContext,\n        event: suspend () -> Event?,\n    ): EventBroadcastJob\n\n    /**\n     * Join all jobs. Joins also jobs launched during this call.\n     */\n    @TestOnly\n    suspend fun joinBroadcast() {\n        throw UnsupportedOperationException(\"joinBroadcast is only supported in TestEventDispatcherImpl\")\n    }\n\n    companion object : ComponentKey<EventDispatcher>\n}\n\n@JvmInline\ninternal value class EventBroadcastJob(\n    val job: Job\n) {\n    inline fun onSuccess(crossinline action: () -> Unit) {\n        job.invokeOnCompletion {\n            if (it == null) action()\n        }\n    }\n\n    inline fun thenBroadcast(eventDispatcher: EventDispatcher, crossinline event: suspend () -> Event?) {\n        eventDispatcher.broadcastAsync {\n            job.join()\n            event()\n        }\n    }\n}\n\n/**\n * If `true`, all event listeners runs directly in the broadcaster's thread until first suspension.\n *\n * If there is no suspension point in the listener, the coroutine executing [Event.broadcast] will not suspend,\n * so the thread before and after execution will be the same and no other code is being executed if there is only one thread.\n *\n * This is useful for tests to not depend on `delay`\n */\ninternal var EVENT_LAUNCH_UNDISPATCHED: Boolean by lateinitMutableProperty {\n    systemProp(\"mirai.event.launch.undispatched\", false)\n}\n\ninternal val SHOW_VERBOSE_EVENT: Boolean by lazy { systemProp(\"mirai.event.show.verbose.events\", false) }\n\ninternal open class EventDispatcherImpl(\n    lifecycleContext: CoroutineContext,\n    protected val logger: MiraiLogger,\n) : EventDispatcher,\n    CoroutineScope by lifecycleContext\n        .addNameHierarchically(\"EventDispatcher\")\n        .childScope() {\n\n    override val isActive: Boolean\n        get() = this.coroutineContext.isActive\n\n    @OptIn(InternalEventMechanism::class)\n    override suspend fun broadcast(event: Event) {\n        try {\n            EventChannelToEventDispatcherAdapter.instance.broadcastEventImpl(event)\n        } catch (e: Exception) {\n            if (e is CancellationException) return\n            if (logger.isEnabled) {\n                val msg = optimizeEventToString(event)\n                logger.error(IllegalStateException(\"Exception while broadcasting event '$msg'\", e))\n            }\n        }\n    }\n\n    override fun broadcastAsync(event: Event, additionalContext: CoroutineContext): EventBroadcastJob {\n        val job = launch(\n            additionalContext,\n            start = CoroutineStart.UNDISPATCHED\n        ) { broadcast(event) }\n        // UNDISPATCHED: starts the coroutine NOW in the current thread until its first suspension point,\n        // so that after `broadcastAsync` the job is always already started and `joinBroadcast` will work normally.\n        return EventBroadcastJob(job)\n    }\n\n    override fun broadcastAsync(additionalContext: CoroutineContext, event: suspend () -> Event?): EventBroadcastJob {\n        val job = launch(\n            additionalContext,\n            start = CoroutineStart.UNDISPATCHED\n        ) {\n            event()?.let { broadcast(it) }\n        }\n        // UNDISPATCHED: starts the coroutine NOW in the current thread until its first suspension point,\n        // so that after `broadcastAsync` the job is always already started and `joinBroadcast` will work normally.\n        return EventBroadcastJob(job)\n    }\n\n    protected fun optimizeEventToString(event: Event): String {\n        val qualified = event::class.qualifiedName ?: return event.toString()\n        return qualified.substringAfter(\"net.mamoe.mirai.event.events.\", \"\").ifEmpty { event.toString() }\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // broadcast\n    ///////////////////////////////////////////////////////////////////////////\n\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/HeartbeatProcessor.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.TimeoutCancellationException\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.protocol.packet.login.Heartbeat\nimport net.mamoe.mirai.internal.network.protocol.packet.login.StatSvc\n\ninternal interface HeartbeatProcessor {\n    /**\n     * @throws TimeoutCancellationException if timed out waiting for response.\n     * @throws CancellationException if [networkHandler] closed.\n     * @throws Exception any other exceptions considered critical internal error and will stop SSO (i.e. stop Bot).\n     */\n    suspend fun doAliveHeartbeatNow(networkHandler: NetworkHandler)\n\n    /**\n     * @throws TimeoutCancellationException if timed out waiting for response.\n     * @throws CancellationException if [networkHandler] closed.\n     * @throws Exception any other exceptions considered critical internal error and will stop SSO (i.e. stop Bot).\n     */\n    suspend fun doStatHeartbeatNow(networkHandler: NetworkHandler)\n\n    /**\n     * @throws TimeoutCancellationException if timed out waiting for response.\n     * @throws CancellationException if [networkHandler] closed.\n     * @throws Exception any other exceptions considered critical internal error and will stop SSO (i.e. stop Bot).\n     */\n    suspend fun doRegisterNow(networkHandler: NetworkHandler): StatSvc.Register.Response\n\n    companion object : ComponentKey<HeartbeatProcessor>\n}\n\ninternal class HeartbeatProcessorImpl : HeartbeatProcessor {\n    override suspend fun doStatHeartbeatNow(networkHandler: NetworkHandler) {\n        networkHandler.sendAndExpect(\n            StatSvc.SimpleGet(networkHandler.context.bot.client),\n            timeout = networkHandler.context[SsoProcessorContext].configuration.heartbeatTimeoutMillis,\n            attempts = 2\n        )\n    }\n\n    override suspend fun doAliveHeartbeatNow(networkHandler: NetworkHandler) {\n        networkHandler.sendAndExpect(\n            Heartbeat.Alive(networkHandler.context.bot.client),\n            timeout = networkHandler.context[SsoProcessorContext].configuration.heartbeatTimeoutMillis,\n            attempts = 2\n        )\n    }\n\n    override suspend fun doRegisterNow(networkHandler: NetworkHandler): StatSvc.Register.Response {\n        return networkHandler.context[SsoProcessor].sendRegister(networkHandler)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/HeartbeatScheduler.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.component.ComponentStorage\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport\nimport net.mamoe.mirai.internal.network.handler.selector.NetworkException\nimport net.mamoe.mirai.internal.network.handler.selector.PacketTimeoutException\nimport net.mamoe.mirai.utils.BotConfiguration.HeartbeatStrategy.*\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.info\n\n/**\n * Accepts any kinds of exceptions. A [NetworkException] can control whether this error is recoverable, while any other ones are regarded as unexpected failure.\n */\ninternal typealias HeartbeatFailureHandler = (name: String, e: Throwable) -> Unit\n\n/**\n * Schedules [HeartbeatProcessor]\n */\ninternal interface HeartbeatScheduler {\n    fun launchJobsIn(\n        network: NetworkHandlerSupport,\n        scope: CoroutineScope,\n        onHeartFailure: HeartbeatFailureHandler\n    ): List<Job>\n\n    companion object : ComponentKey<HeartbeatScheduler>\n}\n\ninternal class TimeBasedHeartbeatSchedulerImpl(\n    private val logger: MiraiLogger,\n) : HeartbeatScheduler {\n    override fun launchJobsIn(\n        network: NetworkHandlerSupport,\n        scope: CoroutineScope,\n        onHeartFailure: HeartbeatFailureHandler\n    ): List<Job> {\n        val context: ComponentStorage = network.context\n        val heartbeatProcessor = context[HeartbeatProcessor]\n\n        val configuration = context[SsoProcessorContext].configuration\n        val timeout = configuration.heartbeatTimeoutMillis\n\n        val list = mutableListOf<Job>()\n        when (val hb = context[SsoProcessorContext].configuration.heartbeatStrategy) {\n            STAT_HB -> {\n                list += launchHeartbeatJobAsync(\n                    scope = scope,\n                    name = \"${network.context.bot.id}.StatHeartbeat\",\n                    delay = { configuration.statHeartbeatPeriodMillis },\n                    timeout = { timeout },\n                    action = { heartbeatProcessor.doStatHeartbeatNow(network) },\n                    onHeartFailure = onHeartFailure\n                )\n            }\n            REGISTER -> {\n                list += launchHeartbeatJobAsync(\n                    scope = scope,\n                    name = \"${network.context.bot.id}.RegisterHeartbeat\",\n                    delay = { configuration.statHeartbeatPeriodMillis },\n                    timeout = { timeout },\n                    action = { heartbeatProcessor.doRegisterNow(network) },\n                    onHeartFailure = onHeartFailure\n                )\n            }\n            NONE -> {\n            }\n            else -> throw IllegalStateException(\"Unexpected HeartbeatStrategy: $hb\")\n        }\n\n        list += launchHeartbeatJobAsync(\n            scope = scope,\n            name = \"${network.context.bot.id}.AliveHeartbeat\",\n            delay = { configuration.heartbeatPeriodMillis },\n            timeout = { timeout },\n            action = { heartbeatProcessor.doAliveHeartbeatNow(network) },\n            onHeartFailure = onHeartFailure\n        )\n        return list\n    }\n\n    /**\n     * If any of the functions throw an exception, HB will fail unexpectedly can [onHeartFailure] will be called.\n     */\n    private fun launchHeartbeatJobAsync(\n        scope: CoroutineScope,\n        name: String,\n        delay: () -> Long,\n        timeout: () -> Long,\n        action: suspend () -> Unit,\n        onHeartFailure: HeartbeatFailureHandler,\n    ): Deferred<Unit> {\n        val coroutineName = \"$name Scheduler\"\n        return scope.async(CoroutineName(coroutineName)) {\n            while (isActive) {\n                try {\n                    delay(delay())\n                } catch (e: CancellationException) {\n                    return@async // considered normally cancel\n                } catch (e: Throwable) {\n                    onHeartFailure(\n                        name,\n                        IllegalStateException(\n                            \"$coroutineName: Internal error: exception in heartbeat delay function\",\n                            e\n                        ) // throwing a ISE will stop the handler.\n                    )\n                    return@async\n                }\n\n                try {\n                    var cause: Throwable? = null\n                    val result = try {\n                        withTimeoutOrNull(timeout()) { action() }\n                    } catch (e: TimeoutCancellationException) {\n                        // from `action`\n                        cause = e\n                        null\n                    }\n                    if (result == null) {\n                        onHeartFailure(\n                            name,\n                            PacketTimeoutException(\n                                \"$coroutineName: Timeout receiving action response\",\n                                cause // cause is TimeoutCancellationException from `action`\n                            ) // This is a NetworkException that is recoverable\n                        )\n                        return@async\n                    }\n                } catch (e: Throwable) {\n                    // catch other errors in `action`, should not happen\n                    onHeartFailure(\n                        name,\n                        IllegalStateException(\"$coroutineName: Internal error: caught unexpected exception\", e)\n                    ) // Terminal ISE\n                    return@async\n                }\n            }\n        }.apply {\n            invokeOnCompletion { e ->\n                if (e is CancellationException) return@invokeOnCompletion // normally closed\n                if (e != null) logger.info { \"$name failed: $e.\" }\n            }\n        }\n    }\n\n\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/HttpClientProvider.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport io.ktor.client.*\nimport net.mamoe.mirai.internal.createDefaultHttpClient\nimport net.mamoe.mirai.internal.network.component.ComponentKey\n\ninternal interface HttpClientProvider {\n    fun getHttpClient(): HttpClient\n\n    companion object : ComponentKey<HttpClientProvider>\n}\n\ninternal class HttpClientProviderImpl : HttpClientProvider {\n    private val instance by lazy { createDefaultHttpClient() }\n    override fun getHttpClient(): HttpClient = instance\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/KeyRefreshProcessor.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.protocol.packet.login.wtlogin.WtLogin15\nimport net.mamoe.mirai.network.LoginFailedException\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.info\nimport net.mamoe.mirai.utils.millisToHumanReadableString\nimport net.mamoe.mirai.utils.minutesToMillis\nimport kotlin.coroutines.cancellation.CancellationException\n\ninternal interface KeyRefreshProcessor {\n    suspend fun keyRefreshLoop(handler: NetworkHandler)\n\n    @Throws(LoginFailedException::class, CancellationException::class)\n    suspend fun refreshKeysNow(handler: NetworkHandler)\n\n    companion object : ComponentKey<KeyRefreshProcessor>\n}\n\ninternal class KeyRefreshProcessorImpl(\n    private val logger: MiraiLogger,\n) : KeyRefreshProcessor {\n    override suspend fun keyRefreshLoop(handler: NetworkHandler): Unit = coroutineScope {\n        val client = handler.context[SsoProcessor].client\n        launch(CoroutineName(\"Login Session Refresh Scheduler\")) {\n            while (isActive) {\n                client.wLoginSigInfo.vKey.run {\n                    //由过期时间最短的且不会被skey更换更新的vkey计算重新登录的时间\n                    val delay = (expireTime - creationTime).times(1000) - 5.minutesToMillis\n                    logger.info { \"Scheduled refresh login session in ${delay.millisToHumanReadableString()}.\" }\n                    delay(delay)\n                }\n                runCatching {\n                    handler.context[SsoProcessor].login(handler)\n                }.onFailure {\n                    logger.warning(\"Failed to refresh login session.\", it)\n                }\n            }\n        }\n        launch(CoroutineName(\"Key Refresh Scheduler\")) {\n            while (isActive) {\n                client.wLoginSigInfo.sKey.run {\n                    val delay = (expireTime - creationTime).times(1000) - 5.minutesToMillis\n                    logger.info { \"Scheduled key refresh in ${delay.millisToHumanReadableString()}.\" }\n                    delay(delay)\n                }\n                runCatching {\n                    refreshKeysNow(handler)\n                }.onFailure {\n                    logger.error(\"Failed to refresh key.\", it)\n                }\n            }\n        }\n    }\n\n    override suspend fun refreshKeysNow(handler: NetworkHandler) {\n        handler.sendAndExpect(WtLogin15(handler.context[SsoProcessor].client))\n        handler.context[SsoProcessor].client.bot.apply {\n            components[AccountSecretsManager].saveSecrets(account, AccountSecretsImpl(client))\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/MessageSvcSyncer.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.mamoe.mirai.event.globalEventChannel\nimport net.mamoe.mirai.event.nextEvent\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgSvc\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.receive.MessageSvcPbGetMsg\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.addNameHierarchically\nimport net.mamoe.mirai.utils.childScope\nimport net.mamoe.mirai.utils.info\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.jvm.Volatile\n\ninternal interface MessageSvcSyncer {\n    suspend fun startSync()\n    suspend fun joinSync()\n\n    companion object : ComponentKey<MessageSvcSyncer>\n}\n\ninternal class MessageSvcSyncerImpl(\n    private val bot: QQAndroidBot,\n    private val parentContext: CoroutineContext,\n    private val logger: MiraiLogger,\n) : MessageSvcSyncer {\n\n    @Volatile\n    private var scope: CoroutineScope? = null\n\n    @Volatile\n    private var job: Job? = null\n\n    private val lock = Mutex()\n\n    private fun initScope() {\n        scope = parentContext.addNameHierarchically(\"MessageSvcSyncerImpl\").childScope()\n    }\n\n    override suspend fun startSync(): Unit = lock.withLock {\n        scope?.cancel()\n        initScope()\n        job = scope!!.launch { syncMessageSvc() }\n    }\n\n    private suspend fun syncMessageSvc() {\n        logger.info { \"Syncing friend message history...\" }\n        withTimeoutOrNull(30000) {\n            launch(CoroutineName(\"Syncing friend message history\")) {\n                globalEventChannel().nextEvent<MessageSvcPbGetMsg.GetMsgSuccess> {\n                    it.bot == this@MessageSvcSyncerImpl.bot\n                }\n            }\n            bot.network.sendAndExpect(MessageSvcPbGetMsg(bot.client, MsgSvc.SyncFlag.START, null))\n        } ?: error(\"timeout syncing friend message history.\")\n        logger.info { \"Syncing friend message history: Success.\" }\n    }\n\n    override suspend fun joinSync(): Unit = lock.withLock {\n        job?.join()\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/NetworkHandlerReference.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\n\ninternal class NetworkHandlerReference(\n    private val getInstance: () -> NetworkHandler,\n) {\n    fun get(): NetworkHandler = getInstance()\n\n    companion object : ComponentKey<NetworkHandlerReference>\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/NoticeProcessorPipeline.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.ParseErrorPacket\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.component.ComponentStorage\nimport net.mamoe.mirai.internal.network.notice.BotAware\nimport net.mamoe.mirai.internal.network.notice.NewContactSupport\nimport net.mamoe.mirai.internal.network.notice.decoders.DecodedNotifyMsgBody\nimport net.mamoe.mirai.internal.network.notice.decoders.MsgType0x2DC\nimport net.mamoe.mirai.internal.network.protocol.data.jce.MsgInfo\nimport net.mamoe.mirai.internal.network.protocol.data.jce.MsgType0x210\nimport net.mamoe.mirai.internal.network.protocol.data.jce.RequestPushStatus\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgOnlinePush\nimport net.mamoe.mirai.internal.network.protocol.data.proto.OnlinePushTrans.PbMsgInfo\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.receive.MessageSvcPbGetMsg\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.receive.OnlinePushPbPushTransMsg\nimport net.mamoe.mirai.internal.network.toPacket\nimport net.mamoe.mirai.internal.pipeline.*\nimport net.mamoe.mirai.internal.utils.io.ProtocolStruct\nimport net.mamoe.mirai.utils.*\nimport kotlin.jvm.JvmStatic\nimport kotlin.reflect.KClass\n\n/**\n * Centralized processor pipeline for [MessageSvcPbGetMsg] and [OnlinePushPbPushTransMsg]\n */\ninternal interface NoticeProcessorPipeline :\n    ProcessorPipeline<NoticeProcessor, NoticePipelineContext, ProtocolStruct, Packet> {\n    companion object : ComponentKey<NoticeProcessorPipeline> {\n        val ComponentStorage.noticeProcessorPipeline get() = get(NoticeProcessorPipeline)\n\n        @JvmStatic\n        suspend inline fun QQAndroidBot.processPacketThroughPipeline(\n            data: ProtocolStruct,\n            attributes: TypeSafeMap = TypeSafeMap.EMPTY,\n        ): Packet {\n            return components.noticeProcessorPipeline.process(data, attributes).collected.toPacket()\n        }\n    }\n}\n\ninternal interface NoticePipelineContext : BotAware, NewContactSupport,\n    ProcessorPipelineContext<ProtocolStruct, Packet> {\n    override val bot: QQAndroidBot\n\n    companion object {\n        val KEY_FROM_SYNC = TypeKey<Boolean>(\"fromSync\")\n        val KEY_MSG_INFO = TypeKey<MsgInfo>(\"msgInfo\")\n\n        val NoticePipelineContext.fromSync get() = attributes[KEY_FROM_SYNC]\n        val NoticePipelineContext.fromSyncSafely get() = attributes[KEY_FROM_SYNC, false]\n\n        /**\n         * 来自 [MsgInfo] 的数据, 即 [MsgType0x210], [MsgType0x2DC] 的处理过程之中可以使用\n         */\n        val NoticePipelineContext.msgInfo get() = attributes[KEY_MSG_INFO]\n    }\n}\n\ninternal inline val NoticePipelineContext.context get() = this\n\nprivate val defaultTraceLogging: MiraiLogger by lazy {\n    MiraiLogger.Factory.create(NoticeProcessorPipelineImpl::class, \"NoticeProcessorPipeline\")\n        .withSwitch(systemProp(\"mirai.network.notice.pipeline.log.full\", false))\n}\n\ninternal open class NoticeProcessorPipelineImpl protected constructor(\n    private val bot: QQAndroidBot,\n    traceLogging: MiraiLogger = defaultTraceLogging,\n) : NoticeProcessorPipeline,\n    AbstractProcessorPipeline<NoticeProcessor, NoticePipelineContext, ProtocolStruct, Packet>(\n        PipelineConfiguration(stopWhenConsumed = false), traceLogging\n    ) {\n\n    open inner class ContextImpl(\n        attributes: TypeSafeMap,\n    ) : BaseContextImpl(attributes), NoticePipelineContext {\n        override val bot: QQAndroidBot\n            get() = this@NoticeProcessorPipelineImpl.bot\n    }\n\n    override fun handleExceptionInProcess(\n        data: ProtocolStruct,\n        context: NoticePipelineContext,\n        attributes: TypeSafeMap,\n        processor: NoticeProcessor,\n        e: Throwable\n    ) {\n        context.collect(\n            ParseErrorPacket(\n                data,\n                IllegalStateException(\n                    \"Exception in $processor while processing packet ${packetToString(data)}.\",\n                    e,\n                ),\n            )\n        )\n    }\n\n    override fun createContext(data: ProtocolStruct, attributes: TypeSafeMap): NoticePipelineContext =\n        ContextImpl(attributes)\n\n    protected open fun packetToString(data: Any?): String =\n        data.toDebugString(\"mirai.network.notice.pipeline.log.full\")\n\n\n    companion object {\n        fun create(bot: QQAndroidBot, vararg processors: NoticeProcessor): NoticeProcessorPipelineImpl =\n            NoticeProcessorPipelineImpl(bot, defaultTraceLogging).apply {\n                for (processor in processors) {\n                    registerProcessor(processor)\n                }\n            }\n    }\n}\n\n///////////////////////////////////////////////////////////////////////////\n// NoticeProcessor\n///////////////////////////////////////////////////////////////////////////\n\n/**\n * A processor handling some specific type of message.\n */\ninternal interface NoticeProcessor : Processor<NoticePipelineContext, ProtocolStruct>\n\ninternal abstract class AnyNoticeProcessor : SimpleNoticeProcessor<ProtocolStruct>(type())\n\ninternal abstract class SimpleNoticeProcessor<in T : ProtocolStruct>(\n    private val type: KClass<T>,\n) : NoticeProcessor {\n\n    final override suspend fun process(context: NoticePipelineContext, data: ProtocolStruct) {\n        if (type.isInstance(data)) {\n            context.processImpl(data.uncheckedCast())\n        }\n    }\n\n    protected abstract suspend fun NoticePipelineContext.processImpl(data: T)\n\n    companion object {\n        @JvmStatic\n        protected inline fun <reified T : Any> type(): KClass<T> = T::class\n    }\n}\n\ninternal abstract class MsgCommonMsgProcessor : SimpleNoticeProcessor<MsgComm.Msg>(type()) {\n    abstract override suspend fun NoticePipelineContext.processImpl(data: MsgComm.Msg)\n}\n\ninternal abstract class MixedNoticeProcessor : AnyNoticeProcessor() {\n    final override suspend fun NoticePipelineContext.processImpl(data: ProtocolStruct) {\n        when (data) {\n            is PbMsgInfo -> processImpl(data)\n            is MsgOnlinePush.PbPushMsg -> processImpl(data)\n            is MsgComm.Msg -> processImpl(data)\n            is MsgType0x210 -> processImpl(data)\n            is MsgType0x2DC -> processImpl(data)\n            is Structmsg.StructMsg -> processImpl(data)\n            is RequestPushStatus -> processImpl(data)\n            is DecodedNotifyMsgBody -> processImpl(data)\n        }\n    }\n\n    protected open suspend fun NoticePipelineContext.processImpl(data: MsgType0x210) {} // 528\n    protected open suspend fun NoticePipelineContext.processImpl(data: MsgType0x2DC) {} // 732\n    protected open suspend fun NoticePipelineContext.processImpl(data: PbMsgInfo) {}\n    protected open suspend fun NoticePipelineContext.processImpl(data: MsgOnlinePush.PbPushMsg) {}\n    protected open suspend fun NoticePipelineContext.processImpl(data: MsgComm.Msg) {}\n    protected open suspend fun NoticePipelineContext.processImpl(data: Structmsg.StructMsg) {}\n    protected open suspend fun NoticePipelineContext.processImpl(data: RequestPushStatus) {}\n\n    protected open suspend fun NoticePipelineContext.processImpl(data: DecodedNotifyMsgBody) {}\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/OtherClientUpdater.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.contact.ContactList\nimport net.mamoe.mirai.contact.OtherClient\nimport net.mamoe.mirai.contact.deviceName\nimport net.mamoe.mirai.contact.platform\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.createOtherClient\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.component.ComponentStorage\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.info\n\ninternal interface OtherClientUpdater {\n\n    suspend fun update()\n\n    companion object : ComponentKey<OtherClientUpdater>\n}\n\ninternal class OtherClientUpdaterImpl(\n    private val bot: QQAndroidBot,\n    private val context: ComponentStorage,\n    private val logger: MiraiLogger,\n) : OtherClientUpdater {\n\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n    val otherClientList = ContactList<OtherClient>()\n\n    private val lock = Mutex()\n\n    override suspend fun update() = lock.withLock {\n        val list = Mirai.getOnlineOtherClientsList(bot)\n        bot.otherClients.delegate.clear()\n        bot.otherClients.delegate.addAll(list.map { bot.createOtherClient(it) })\n        if (bot.otherClients.isEmpty()) {\n            logger.info { \"No OtherClient online.\" }\n        } else {\n            logger.info {\n                \"Online OtherClients: \" +\n                        bot.otherClients.joinToString { \"${it.deviceName}(${it.platform?.name ?: \"unknown platform\"})\" }\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/PacketCodec.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.components.PacketCodec.Companion.PacketLogger\nimport net.mamoe.mirai.internal.network.components.PacketCodecException.Kind.*\nimport net.mamoe.mirai.internal.network.handler.selector.NetworkException\nimport net.mamoe.mirai.internal.network.protocol.data.proto.SSOReserveField\nimport net.mamoe.mirai.internal.network.protocol.packet.*\nimport net.mamoe.mirai.internal.network.protocol.packet.login.WtLogin\nimport net.mamoe.mirai.internal.network.protocol.packet.sso.TRpcRawPacket\nimport net.mamoe.mirai.internal.utils.crypto.Ecdh\nimport net.mamoe.mirai.internal.utils.crypto.TEA\nimport net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf\nimport net.mamoe.mirai.utils.*\n\n\n/**\n * Packet decoders.\n *\n * - Transforms [ByteReadPacket] to [RawIncomingPacket]\n */\ninternal interface PacketCodec {\n    /**\n     * It's caller's responsibility to close [input].\n     *\n     * @throws PacketCodecException normal, known errors\n     * @throws Exception unexpected errors\n     * @param input received from sockets.\n     * @return decoded\n     */\n    @Throws(PacketCodecException::class)\n    fun decodeRaw(client: SsoSession, input: ByteReadPacket): RawIncomingPacket\n\n    /**\n     * Process [RawIncomingPacket] using [IncomingPacketFactory.decode].\n     *\n     * This function throws **no** exception and wrap them into [IncomingPacket].\n     */\n    suspend fun processBody(bot: QQAndroidBot, input: RawIncomingPacket): IncomingPacket?\n\n    companion object : ComponentKey<PacketCodec> {\n        val PACKET_DEBUG = systemProp(\"mirai.network.packet.logger\", false)\n\n        internal val PacketLogger: MiraiLoggerWithSwitch by lazy {\n            MiraiLogger.Factory.create(PacketCodec::class, \"Packet\").withSwitch(PACKET_DEBUG)\n        }\n    }\n}\n\n/**\n * Wraps an exception thrown by [PacketCodec.decodeRaw], which is not a [PacketCodecException] (meaning unexpected).\n */\ninternal data class ExceptionInPacketCodecException(\n    override val cause: Throwable,\n) : IllegalStateException(\"Exception in PacketCodec.\", cause)\n\n/**\n * Thrown by [PacketCodec.decodeRaw], representing an excepted error.\n */\ninternal class PacketCodecException(\n    val targetException: Throwable,\n    val kind: Kind,\n) : NetworkException(recoverable = true, cause = targetException) {\n    constructor(message: String, kind: Kind) : this(IllegalStateException(message), kind)\n\n    enum class Kind {\n        /**\n         * 会触发重连\n         */\n        SESSION_EXPIRED,\n\n        /**\n         * 只记录日志\n         */\n        PROTOCOL_UPDATED,\n\n        /**\n         * 只记录日志\n         */\n        OTHER,\n    }\n\n//     not available in native\n//    override fun getStackTrace(): Array<StackTraceElement> {\n//        return targetException.stackTrace\n//    }\n}\n\ninternal enum class IncomingPacketType(val value: Int) {\n    Login(0x0A),\n    Simple(0x0B),\n    Unknown(-1)\n    ;\n\n    companion object {\n        internal fun of(value: Int) = enumValues<IncomingPacketType>().find { it.value == value } ?: Unknown\n    }\n}\n\ninternal class PacketCodecImpl : PacketCodec {\n\n    override fun decodeRaw(\n        client: SsoSession,\n        input: ByteReadPacket\n    ): RawIncomingPacket = input.run {\n        // packet type\n        val packetType = IncomingPacketType.of(readInt())\n\n        PacketLogger.verbose { \"开始处理一个包\" }\n\n        val encryptMethod = PacketEncryptType.of(readByte().toInt())\n        val flag3 = readByte().toInt()\n        val flag3Exception = if (flag3 != 0) {\n            PacketCodecException(\n                \"Illegal flag3. Expected 0, whereas got $flag3. packet type=$packetType, encrypt method=$encryptMethod. \",\n                kind = PROTOCOL_UPDATED\n            )\n        } else null\n\n        readString(readInt() - 4)// uinAccount\n\n        ByteArrayPool.useInstance(this.remaining.toInt()) { buffer ->\n            val size = this.readAvailable(buffer)\n\n            val raw = try {\n                when (encryptMethod) {\n                    PacketEncryptType.Empty -> TEA.decrypt(buffer, DECRYPTER_16_ZERO, size)\n                    PacketEncryptType.D2 -> {\n                        TEA.decrypt(buffer, kotlin.runCatching { client.wLoginSigInfo.d2Key }.getOrElse {\n                            throw PacketCodecException(\n                                \"Received packet needed d2Key to decrypt but d2Key doesn't existed, ignoring. Please report to https://github.com/mamoe/mirai/issues/new/choose if you see anything abnormal\",\n                                PROTOCOL_UPDATED\n                            )\n                        }, size)\n                    }\n\n                    PacketEncryptType.NoEncrypt -> buffer\n                    else -> throw PacketCodecException(\"Unknown encrypt type=$encryptMethod\", PROTOCOL_UPDATED)\n                }.let { decryptedData ->\n                    PacketLogger.verbose { \"Parsing: type=${packetType}: len=${decryptedData.size}, value=${decryptedData.toUHexString()}\" }\n\n                    when (packetType) {\n                        IncomingPacketType.Login -> parseSsoFrame(client, decryptedData)\n                        IncomingPacketType.Simple -> parseSsoFrame(\n                            client,\n                            decryptedData\n                        ) // 这里可能是 uni?? 但测试时候发现结构跟 sso 一样.\n                        else -> throw PacketCodecException(\n                            \"unknown packet type: ${packetType.value.toUHexString()}\",\n                            PROTOCOL_UPDATED\n                        )\n                    }.also { pkg ->\n                        PacketLogger.debug {\n                            \"result: ${pkg.commandName}, seq=${pkg.sequenceId}, ${\n                                pkg.body.copy()\n                                    .useBytes { data: ByteArray, length: Int -> data.toUHexString(length = length) }\n                            }\"\n                        }\n                    }\n                }\n            } catch (e: Exception) {\n                throw e.also {\n                    if (flag3Exception != null) {\n                        it.addSuppressed(flag3Exception)\n                    }\n                }\n            }\n\n            if (flag3 != 0 && flag3Exception != null) {\n                if (raw.commandName == WtLogin.TransEmp.commandName) {\n                    PacketLogger.warning(\n                        \"unknown flag3: $flag3 in packet ${WtLogin.TransEmp.commandName}, \" +\n                                \"which may means protocol is updated.\",\n                        flag3Exception\n                    )\n                } else if (raw.commandName.startsWith(TRpcRawPacket.COMMAND_PREFIX)) {\n                    PacketLogger.verbose { \"received a trpc native packet: ${raw.commandName}\" }\n                } else {\n                    throw flag3Exception\n                }\n            }\n\n            when (encryptMethod) {\n                PacketEncryptType.NoEncrypt,\n                PacketEncryptType.D2 -> RawIncomingPacket(\n                    raw.commandName,\n                    raw.sequenceId,\n                    raw.body.readBytes()\n                )\n\n                PacketEncryptType.Empty -> {\n                    RawIncomingPacket(\n                        raw.commandName,\n                        raw.sequenceId,\n                        raw.body.withUse {\n                            if (raw.commandName.startsWith(TRpcRawPacket.COMMAND_PREFIX)) {\n                                readBytes()\n                            } else {\n                                try {\n                                    parseOicqResponse(client, raw.commandName)\n                                } catch (e: Throwable) {\n                                    throw PacketCodecException(e, PacketCodecException.Kind.OTHER)\n                                }\n                            }\n                        }\n                    )\n                }\n\n                else -> error(\"unreachable\")\n            }\n        }\n    }\n\n    internal class DecodeResult constructor(\n        val commandName: String,\n        val sequenceId: Int,\n        /**\n         * Can be passed to [PacketFactory]\n         */\n        val body: ByteReadPacket,\n    )\n\n    private fun parseSsoFrame(client: SsoSession, bytes: ByteArray): DecodeResult =\n        bytes.toReadPacket().let { input ->\n            val commandName: String\n            val ssoSequenceId: Int\n            val dataCompressed: Int\n            input.readPacketExact(input.readInt() - 4).withUse {\n                ssoSequenceId = readInt()\n                PacketLogger.verbose { \"sequenceId = $ssoSequenceId\" }\n\n                val returnCode = readInt()\n                if (returnCode != 0) {\n                    if (returnCode <= -10000) {\n                        // #470: -10008, 例如在手机QQ强制下线机器人\n                        // #1957: -10106, 未知原因, 但会导致收不到消息\n\n                        throw PacketCodecException(\n                            \"Received packet returnCode = $returnCode, which may mean session expired.\",\n                            SESSION_EXPIRED\n                        )\n\n                        // 备注: 之后该异常将会导致 NetworkHandler close, 然后由 selector 触发重连.\n                        // 重连时会在 net.mamoe.mirai.internal.network.components.SsoProcessorImpl.login 进行 FastLogin.\n                        // 不确定在这种情况下执行 FastLogin 是否正确. 若有问题, 考虑强制执行 SlowLogin (by invalidating session).\n                    } else {\n                        throw PacketCodecException(\n                            \"Received unknown packet returnCode = $returnCode, ignoring. Please report to https://github.com/mamoe/mirai/issues/new/choose if you see anything abnormal\",\n                            OTHER\n                        )\n\n                        // 备注: OTHER 不会触发重连, 只会记录日志.\n                    }\n                }\n\n                if (PacketLogger.isEnabled) {\n                    val extraData = readBytes(readInt() - 4)\n                    if (extraData.isNotEmpty()) {\n                        PacketLogger.verbose {\n                            \"(sso/inner)extraData = ${extraData.toUHexString()}, result= ${\n                                kotlin.runCatching {\n                                    readProtoBuf(\n                                        SSOReserveField.ReserveFields.serializer()\n                                    ).structureToString()\n                                }.getOrElse { e -> \"error: \" + e.message }\n                            }\"\n                        }\n                    }\n                } else {\n                    discardExact(readInt() - 4)\n                }\n\n                commandName = readString(readInt() - 4)\n                client.outgoingPacketSessionId = readBytes(readInt() - 4)\n\n                dataCompressed = readInt()\n            }\n\n            val packet = when (dataCompressed) {\n                0 -> {\n                    val size = input.readInt().toLong() and 0xffffffff\n                    if (size == input.remaining || size == input.remaining + 4) {\n                        input\n                    } else {\n                        buildPacket {\n                            writeInt(size.toInt())\n                            writePacket(input)\n                        }\n                    }\n                }\n\n                1 -> {\n                    input.discardExact(4)\n                    input.inflateAllAvailable().let { bytes ->\n                        val size = bytes.toInt()\n                        if (size == bytes.size || size == bytes.size + 4) {\n                            bytes.toReadPacket(offset = 4)\n                        } else {\n                            bytes.toReadPacket()\n                        }\n                    }\n                }\n\n                8 -> input\n                else -> throw PacketCodecException(\"Unknown dataCompressed flag: $dataCompressed\", PROTOCOL_UPDATED)\n            }\n\n            // body\n\n            return DecodeResult(commandName, ssoSequenceId, packet)\n        }\n\n    private fun ByteReadPacket.parseOicqResponse(\n        client: SsoSession,\n        commandName: String\n    ): ByteArray {\n        val qqEcdh = (client as QQAndroidClient).bot.components[EcdhInitialPublicKeyUpdater].getQQEcdh()\n        fun decrypt(encryptionMethod: Int): ByteArray {\n            return when (encryptionMethod) {\n                4 -> {\n                    val size = (this.remaining - 1).toInt()\n                    val data =\n                        TEA.decrypt(\n                            this.readBytes(),\n                            qqEcdh.initialQQShareKey,\n                            length = size\n                        )\n\n                    val peerShareKey =\n                        qqEcdh.calculateQQShareKey(Ecdh.Instance.importPublicKey(readUShortLVByteArray()))\n                    TEA.decrypt(data, peerShareKey)\n                }\n\n                3 -> {\n                    val size = (this.remaining - 1).toInt()\n                    // session\n                    TEA.decrypt(\n                        this.readBytes(),\n                        client.wLoginSigInfo.wtSessionTicketKey,\n                        length = size\n                    )\n                }\n\n                0 -> {\n                    if (client.loginState == 0) {\n                        val size = (this.remaining - 1).toInt()\n                        val byteArrayBuffer = this.readBytes(size)\n\n                        runCatching {\n                            TEA.decrypt(byteArrayBuffer, qqEcdh.initialQQShareKey, length = size)\n                        }.getOrElse {\n                            TEA.decrypt(byteArrayBuffer, client.randomKey, length = size)\n                        }\n                    } else {\n                        val size = (this.remaining - 1).toInt()\n                        TEA.decrypt(this.readBytes(), client.randomKey, length = size)\n                    }\n                }\n\n                else -> error(\"Illegal encryption method. expected 0 or 4, got $encryptionMethod\")\n            }\n        }\n\n        val packetType = readByte().toInt()\n        if (packetType != 2) {\n            val fullPacketDump = copy().readBytes().toUHexString()\n            var decryptedData: String? = null\n            if (remaining > 15) {\n                discardExact(12)\n                val encryptionMethod = this.readShort().toUShort().toInt()\n                discardExact(1)\n                decryptedData = kotlin.runCatching {\n                    decrypt(encryptionMethod).toUHexString()\n                }.getOrNull()\n            }\n            throw PacketCodecException(\n                \"Received unknown oicq packet type = $packetType, command name = $commandName, ignoring...\" +\n                        \"\\nPlease report this message to https://github.com/mamoe/mirai/issues/new/choose, \\n\" +\n                        \"Full packet dump: $fullPacketDump\\n\" +\n                        \"Decrypted data (contains your encrypted password, please change your password after reporting issue): $decryptedData\",\n                PROTOCOL_UPDATED\n            )\n        }\n\n        this.discardExact(2)\n        this.discardExact(2)\n        this.readShort().toUShort()\n        this.readShort()\n        this.readInt().toUInt().toLong()\n        val encryptionMethod = this.readShort().toUShort().toInt()\n\n        this.discardExact(1)\n        return decrypt(encryptionMethod)\n    }\n\n    /**\n     * Process [RawIncomingPacket] using [IncomingPacketFactory.decode].\n     *\n     * This function wraps exceptions into [IncomingPacket]\n     */\n    override suspend fun processBody(bot: QQAndroidBot, input: RawIncomingPacket): IncomingPacket? {\n        val factory = KnownPacketFactories.findPacketFactory(input.commandName)\n            ?: TRpcRawPacket.takeIf { input.commandName.startsWith(TRpcRawPacket.COMMAND_PREFIX) }\n            ?: return null\n\n        return kotlin.runCatching {\n            input.body.toReadPacket().use { body ->\n                when (factory) {\n                    // specially\n                    is TRpcRawPacket -> TRpcRawPacket.decode(input, body)\n\n                    is OutgoingPacketFactory -> factory.decode(bot, body)\n                    is IncomingPacketFactory -> factory.decode(bot, body, input.sequenceId)\n                }\n            }\n        }.fold(\n            onSuccess = { packet ->\n                IncomingPacket(input.commandName, input.sequenceId, packet)\n            },\n            onFailure = { exception: Throwable ->\n                IncomingPacket(input.commandName, input.sequenceId, exception)\n            }\n        )\n    }\n}\n\n/**\n * Represents a packet that has just been decrypted. Subsequent operation is normally passing it to a responsible [PacketFactory] according to [commandName] from [KnownPacketFactories].\n */\ninternal class RawIncomingPacket constructor(\n    val commandName: String,\n    val sequenceId: Int,\n    /**\n     * Can be passed to [PacketFactory]\n     */\n    val body: ByteArray,\n)\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/PacketHandler.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport net.mamoe.mirai.event.BroadcastControllable\nimport net.mamoe.mirai.event.CancellableEvent\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.MultiPacket\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.component.ComponentStorage\nimport net.mamoe.mirai.internal.network.protocol.packet.*\nimport net.mamoe.mirai.utils.Either.Companion.ifRight\nimport net.mamoe.mirai.utils.Either.Companion.onRight\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.cast\nimport kotlin.coroutines.cancellation.CancellationException\n\ninternal interface PacketHandler {\n    suspend fun handlePacket(incomingPacket: IncomingPacket)\n\n    companion object : ComponentKey<PacketHandler>\n}\n\ninternal class PacketHandlerChain(\n    private val instances: Collection<PacketHandler>\n) : PacketHandler {\n    constructor(vararg instances: PacketHandler?) : this(instances.filterNotNull())\n    constructor(instances: Iterable<PacketHandler?>) : this(instances.filterNotNull())\n\n    override suspend fun handlePacket(incomingPacket: IncomingPacket) {\n        for (instance in instances) {\n            try {\n                instance.handlePacket(incomingPacket)\n            } catch (e: Throwable) {\n                if (e is CancellationException) return\n                throw ExceptionInPacketHandlerException(instance, incomingPacket, e)\n            }\n        }\n    }\n}\n\ninternal data class ExceptionInPacketHandlerException(\n    val packetHandler: PacketHandler,\n    val incomingPacket: IncomingPacket,\n    override val cause: Throwable,\n) : IllegalStateException(\"Exception in PacketHandler '$packetHandler' for command '${incomingPacket.commandName}'.\")\n\ninternal class LoggingPacketHandlerAdapter(\n    private val strategy: PacketLoggingStrategy,\n    private val logger: MiraiLogger,\n) : PacketHandler {\n    override suspend fun handlePacket(incomingPacket: IncomingPacket) {\n        strategy.logReceived(logger, incomingPacket)\n    }\n\n    override fun toString(): String = \"LoggingPacketHandlerAdapter\"\n}\n\ninternal class EventBroadcasterPacketHandler(\n    private val components: ComponentStorage,\n) : PacketHandler {\n\n    override suspend fun handlePacket(incomingPacket: IncomingPacket) {\n        incomingPacket.result.ifRight(::impl)\n    }\n\n    private fun impl(packet: Packet?) {\n        if (packet == null) return\n        if (packet is MultiPacket) {\n            for (p in packet.children()) {\n                impl(p)\n            }\n        }\n        when {\n            packet is CancellableEvent && packet.isCancelled -> return\n            packet is BroadcastControllable && !packet.shouldBroadcast -> return\n            packet is Event -> {\n                components[EventDispatcher].broadcastAsync(packet)\n            }\n        }\n    }\n\n    override fun toString(): String = \"EventBroadcasterPacketHandler\"\n}\n\ninternal class CallPacketFactoryPacketHandler(\n    private val bot: QQAndroidBot,\n) : PacketHandler {\n\n    override suspend fun handlePacket(incomingPacket: IncomingPacket) {\n        incomingPacket.result.onRight { data ->\n            val factory = KnownPacketFactories.findPacketFactory(incomingPacket.commandName) ?: return\n            factory.cast<PacketFactory<Packet?>>().run {\n                when (this) {\n                    is IncomingPacketFactory -> {\n                        val r = bot.handle(data, incomingPacket.sequenceId)\n                        if (r != null) {\n                            bot.network.sendWithoutExpect(r)\n                        }\n                    }\n                    is OutgoingPacketFactory -> bot.handle(data)\n                }\n            }\n        }\n    }\n\n    override fun toString(): String = \"CallPacketFactoryPacketHandler\"\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/PacketLoggingStrategy.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport net.mamoe.mirai.event.events.MessageEvent\nimport net.mamoe.mirai.internal.AbstractBot\nimport net.mamoe.mirai.internal.contact.logMessageReceived\nimport net.mamoe.mirai.internal.contact.replaceMagicCodes\nimport net.mamoe.mirai.internal.network.MultiPacket\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.ParseErrorPacket\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.protocol.packet.IncomingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.utils.Either.Companion.fold\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.systemProp\nimport net.mamoe.mirai.utils.verbose\nimport kotlin.coroutines.cancellation.CancellationException\n\n/**\n * Implementation must be fast and non-blocking, throwing no exception.\n */\ninternal interface PacketLoggingStrategy {\n    fun logSent(logger: MiraiLogger, outgoingPacket: OutgoingPacket)\n    fun logReceived(logger: MiraiLogger, incomingPacket: IncomingPacket)\n\n    companion object : ComponentKey<PacketLoggingStrategy>\n}\n\ninternal class PacketLoggingStrategyImpl(\n    private val bot: AbstractBot,\n    private val blacklist: Set<String> = getDefaultBlacklist(),\n) : PacketLoggingStrategy {\n    override fun logSent(logger: MiraiLogger, outgoingPacket: OutgoingPacket) {\n        if (outgoingPacket.commandName in blacklist) return\n        logger.verbose { \"Send: ${outgoingPacket.displayName}\" }\n    }\n\n    override fun logReceived(logger: MiraiLogger, incomingPacket: IncomingPacket) {\n        incomingPacket.result.fold(\n            onLeft = { e ->\n                if (e is CancellationException) return\n                logger.error(\"Exception in decoding packet.\", e)\n            },\n            onRight = { packet ->\n                packet ?: return\n                if (!bot.logger.isEnabled && !logger.isEnabled) return\n\n                if (packet is MultiPacket) {\n                    if (packet.isMeaningful) logReceivedImpl(packet, incomingPacket, logger)\n                    for (d in packet.children()) {\n                        logReceivedImpl(d, incomingPacket, logger)\n                    }\n                }\n\n                logReceivedImpl(packet, incomingPacket, logger)\n            },\n        )\n    }\n\n    private fun logReceivedImpl(packet: Packet, incomingPacket: IncomingPacket, logger: MiraiLogger) {\n        when (packet) {\n            is ParseErrorPacket -> {\n                packet.direction.getLogger(bot).error(\"Exception on parsing packet.\", packet.error)\n            }\n            is MessageEvent -> packet.logMessageReceived()\n            is Packet.NoLog -> {\n                // nothing to do\n            }\n            // packet is Event && packet !is Packet.NoEventLog -> bot.logger.verbose {\n            //     \"Event: $packet\".replaceMagicCodes()\n            // } // processed in global `Event.broadcast`\n            else -> {\n                if (incomingPacket.commandName in blacklist) return\n                if (SHOW_PACKET_DETAILS) {\n                    logger.verbose { \"Recv: ${incomingPacket.commandName} ${incomingPacket.result}\".replaceMagicCodes() }\n                } else {\n                    logger.verbose { \"Recv: ${incomingPacket.commandName}\".replaceMagicCodes() }\n                }\n            }\n        }\n    }\n\n    companion object {\n        fun getDefaultBlacklist(): Set<String> {\n            if (systemProp(\"mirai.network.show.verbose.packets\", false)) return emptySet()\n            return DEFAULT_BLACKLIST\n        }\n\n        private val DEFAULT_BLACKLIST: Set<String> by lazy {\n            setOf(\n                // C2C event sync, too verbose to show.\n                \"MessageSvc.PushNotify\",\n                \"MessageSvc.PbGetMsg\",\n                \"MessageSvc.PbDeleteMsg\",\n\n                // Group event sync, decoded as specific events, to optimize logs.\n                \"OnlinePush.ReqPush\",\n                \"OnlinePush.RespPush\",\n\n                // Periodic heartbeat, showing them does not help anything.\n                \"Heartbeat.Alive\",\n                \"StatSvc.SimpleGet\",\n            )\n        }\n\n    }\n}\n\n\nprivate val SHOW_PACKET_DETAILS = systemProp(\"mirai.network.show.packet.details\", false)"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/QRCodeLoginProcessor.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport kotlinx.atomicfu.atomic\nimport kotlinx.coroutines.delay\nimport net.mamoe.mirai.auth.QRCodeLoginListener\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.QRCodeLoginData\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.protocol.packet.login.WtLogin\nimport net.mamoe.mirai.internal.utils.MiraiProtocolInternal.Companion.asInternal\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.debug\n\ninternal interface QRCodeLoginProcessor {\n    suspend fun process(handler: NetworkHandler, client: QQAndroidClient): QRCodeLoginData = error(\"Not implemented\")\n\n    /**\n     * Allocate a special processor for once login request\n     */\n    fun prepareProcess(handler: NetworkHandler, client: QQAndroidClient): QRCodeLoginProcessor =\n        error(\"Not implemented\")\n\n    companion object : ComponentKey<QRCodeLoginProcessor> {\n        internal val NOOP = object : QRCodeLoginProcessor {}\n\n        fun parse(ssoContext: SsoProcessorContext, logger: MiraiLogger): QRCodeLoginProcessor {\n            return QRCodeLoginProcessorPreLoaded(ssoContext, logger)\n        }\n    }\n}\n\ninternal class QRCodeLoginProcessorPreLoaded(\n    private val ssoContext: SsoProcessorContext,\n    private val logger: MiraiLogger,\n) : QRCodeLoginProcessor {\n    override fun prepareProcess(handler: NetworkHandler, client: QQAndroidClient): QRCodeLoginProcessor {\n        check(ssoContext.bot.configuration.protocol.asInternal.supportsQRLogin) {\n            \"The login protocol must be ANDROID_WATCH or MACOS while enabling qrcode login.\" +\n                    \"Set it by `bot.configuration.protocol = BotConfiguration.MiraiProtocol.ANDROID_WATCH`.\"\n        }\n\n        val loginSolver = ssoContext.bot.configuration.loginSolver\n            ?: throw IllegalStateException(\n                \"No LoginSolver found while enabling qrcode login. \" +\n                        \"Please provide by BotConfiguration.loginSolver. \" +\n                        \"For example use `BotFactory.newBot(...) { loginSolver = yourLoginSolver}` in Kotlin, \" +\n                        \"use `BotFactory.newBot(..., new BotConfiguration() {{ setLoginSolver(yourLoginSolver) }})` in Java.\"\n            )\n\n        val qrCodeLoginListener = loginSolver.createQRCodeLoginListener(client.bot)\n\n        return loginSolver.run {\n            QRCodeLoginProcessorImpl(qrCodeLoginListener, logger)\n        }\n    }\n}\n\ninternal class QRCodeLoginProcessorImpl(\n    private val qrCodeLoginListener: QRCodeLoginListener,\n    private val logger: MiraiLogger,\n) : QRCodeLoginProcessor {\n\n    private var state = atomic(QRCodeLoginListener.State.DEFAULT)\n\n    private suspend fun requestQRCode(\n        handler: NetworkHandler,\n        client: QQAndroidClient\n    ): WtLogin.TransEmp.Response.FetchQRCode {\n        logger.debug { \"requesting qrcode.\" }\n        val resp = handler.sendAndExpect(\n            WtLogin.TransEmp.FetchQRCode(\n                client,\n                size = qrCodeLoginListener.qrCodeSize,\n                margin = qrCodeLoginListener.qrCodeMargin,\n                ecLevel = qrCodeLoginListener.qrCodeEcLevel,\n            ),\n        )\n        check(resp is WtLogin.TransEmp.Response.FetchQRCode) { \"Cannot fetch qrcode, resp=$resp\" }\n        qrCodeLoginListener.onFetchQRCode(handler.context.bot, resp.imageData)\n        return resp\n    }\n\n    private suspend fun queryQRCodeStatus(\n        handler: NetworkHandler,\n        client: QQAndroidClient,\n        sig: ByteArray\n    ): WtLogin.TransEmp.Response {\n        logger.debug { \"querying qrcode state.\" }\n        val resp = handler.sendAndExpect(WtLogin.TransEmp.QueryQRCodeStatus(client, sig))\n        check(\n            resp is WtLogin.TransEmp.Response.QRCodeStatus || resp is WtLogin.TransEmp.Response.QRCodeConfirmed\n        ) { \"Cannot query qrcode status, resp=$resp\" }\n\n        val currentState = state.value\n        val newState = resp.mapProtocolState()\n        if (currentState != newState && state.compareAndSet(currentState, newState)) {\n            logger.debug { \"qrcode state changed: $state\" }\n            qrCodeLoginListener.onStateChanged(handler.context.bot, newState)\n        }\n        return resp\n    }\n\n    override suspend fun process(handler: NetworkHandler, client: QQAndroidClient): QRCodeLoginData {\n        return try {\n            process0(handler, client)\n        } finally {\n            qrCodeLoginListener.onCompleted()\n        }\n    }\n\n    private suspend fun process0(handler: NetworkHandler, client: QQAndroidClient): QRCodeLoginData {\n        main@ while (true) {\n            val qrCodeData = requestQRCode(handler, client)\n            state@ while (true) {\n                qrCodeLoginListener.onIntervalLoop()\n\n                when (val status = queryQRCodeStatus(handler, client, qrCodeData.sig)) {\n                    is WtLogin.TransEmp.Response.QRCodeConfirmed -> {\n                        return status.data\n                    }\n\n                    is WtLogin.TransEmp.Response.QRCodeStatus -> when (status.state) {\n                        WtLogin.TransEmp.Response.QRCodeStatus.State.TIMEOUT,\n                        WtLogin.TransEmp.Response.QRCodeStatus.State.CANCELLED -> {\n                            break@state\n                        }\n\n                        else -> {} // WAITING_FOR_SCAN or WAITING_FOR_CONFIRM\n                    }\n                    // status is FetchQRCode, which is unreachable.\n                    else -> {\n                        error(\"query qrcode status should not be FetchQRCode.\")\n                    }\n                }\n\n                delay(qrCodeLoginListener.qrCodeStateUpdateInterval.coerceAtLeast(200L))\n            }\n        }\n    }\n\n    private fun WtLogin.TransEmp.Response.mapProtocolState(): QRCodeLoginListener.State {\n        return when (this) {\n            is WtLogin.TransEmp.Response.QRCodeStatus -> when (this.state) {\n                WtLogin.TransEmp.Response.QRCodeStatus.State.WAITING_FOR_SCAN ->\n                    QRCodeLoginListener.State.WAITING_FOR_SCAN\n\n                WtLogin.TransEmp.Response.QRCodeStatus.State.WAITING_FOR_CONFIRM ->\n                    QRCodeLoginListener.State.WAITING_FOR_CONFIRM\n\n                WtLogin.TransEmp.Response.QRCodeStatus.State.CANCELLED ->\n                    QRCodeLoginListener.State.CANCELLED\n\n                WtLogin.TransEmp.Response.QRCodeStatus.State.TIMEOUT ->\n                    QRCodeLoginListener.State.TIMEOUT\n            }\n\n            is WtLogin.TransEmp.Response.QRCodeConfirmed ->\n                QRCodeLoginListener.State.CONFIRMED\n\n            is WtLogin.TransEmp.Response.FetchQRCode ->\n                error(\"$this cannot be mapped to listener state.\")\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/ServerList.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.components.ServerList.Companion.DEFAULT_SERVER_LIST\nimport net.mamoe.mirai.internal.network.handler.SocketAddress\nimport net.mamoe.mirai.internal.network.handler.createSocketAddress\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.TestOnly\nimport net.mamoe.mirai.utils.verbose\nimport kotlin.jvm.Synchronized\nimport kotlin.jvm.Volatile\n\n@Serializable\ninternal data class ServerAddress(\n    val host: String,\n    val port: Int\n) {\n    init {\n        require(port >= 0) { \"port must be positive: '$port'\" }\n        require(host.isNotBlank()) { \"host is invalid: '$host'\" }\n    }\n\n    override fun toString(): String {\n        return \"$host:$port\"\n    }\n\n    fun toSocketAddress(): SocketAddress = createSocketAddress(host, port)\n}\n\n/**\n * Self-refillable (similarly circular) queue of servers. Pop each time when trying to connect.\n *\n * [Preferred][getPreferred] prevails if present than [DEFAULT_SERVER_LIST].\n *\n * *+Implementation must be thread-safe**.\n */\ninternal interface ServerList {\n    /**\n     * Set preferred so not using [DEFAULT_SERVER_LIST].\n     */\n    fun setPreferred(list: Collection<ServerAddress>)\n\n    /**\n     * Might return [DEFAULT_SERVER_LIST] if not present.\n     */\n    fun getPreferred(): Set<ServerAddress>\n\n    /**\n     * Refill the queue. Mostly do not call this function.\n     */\n    fun refresh()\n\n\n    /**\n     * Last disconnected ip\n     */\n    var lastDisconnectedIP: String\n\n    /**\n     * Last connected ip\n     */\n    var lastConnectedIP: String\n\n    /**\n     * Get last poll ip\n     */\n    fun getLastPolledIP(): String\n\n    /**\n     * [Poll][Queue.poll] from current address list. Returns `null` if current address list is empty.\n     */\n    fun pollCurrent(): ServerAddress?\n\n    /**\n     * [Poll][Queue.poll] from current address list, before which the list is filled with preferred addresses or default list if empty.\n     */\n    fun pollAny(): ServerAddress\n\n    companion object : ComponentKey<ServerList> {\n        val DEFAULT_SERVER_LIST: Set<ServerAddress> =\n            \"\"\"msfwifi.3g.qq.com:8080\"\"\".trimMargin()\n                .splitToSequence(\",\").filterNot(String::isBlank)\n                .map { it.trim() }\n                .map {\n                    val host = it.substringBefore(':')\n                    val port = it.substringAfter(':').toInt()\n                    ServerAddress(host, port)\n                }.shuffled().toMutableSet()\n    }\n}\n\ninternal class ServerListImpl(\n    private val logger: MiraiLogger,\n    initial: Collection<ServerAddress> = emptyList()\n) : ServerList {\n    @TestOnly\n    constructor(initial: Collection<ServerAddress>) : this(MiraiLogger.Factory.create(ServerListImpl::class), initial)\n\n    @TestOnly\n    constructor() : this(MiraiLogger.Factory.create(ServerListImpl::class))\n\n    @Volatile\n    private var preferred: Set<ServerAddress> = DEFAULT_SERVER_LIST\n\n    @Volatile\n    private var current: ArrayDeque<ServerAddress> = ArrayDeque(initial)\n\n    @Volatile\n    private var lastPolledAddress: ServerAddress? = null\n\n    @Synchronized\n    override fun setPreferred(list: Collection<ServerAddress>) {\n        logger.verbose { \"Server list: ${list.joinToString()}.\" }\n        require(list.isNotEmpty()) { \"list cannot be empty.\" }\n        preferred = list.toSet()\n    }\n\n    override fun getPreferred() = preferred\n\n    init {\n        refresh()\n    }\n\n    @Synchronized\n    override fun refresh() {\n        current = preferred.toCollection(ArrayDeque(current.size))\n        check(current.isNotEmpty()) {\n            \"Internal error: failed to fill server list. No server available.\"\n        }\n    }\n\n    override var lastDisconnectedIP: String = \"\"\n    override var lastConnectedIP: String = \"\"\n\n    override fun getLastPolledIP(): String = lastPolledAddress?.host ?: \"\"\n\n    /**\n     * [Poll][Queue.poll] from current address list. Returns `null` if current address list is empty.\n     */\n    @Synchronized\n    override fun pollCurrent(): ServerAddress? {\n        return current.removeFirstOrNull()?.also { address ->\n            lastPolledAddress = address\n        }\n    }\n\n    /**\n     * [Poll][Queue.poll] from current address list, before which the list is filled with preferred addresses or default list if empty.\n     */\n    @Synchronized\n    override fun pollAny(): ServerAddress {\n        if (current.isEmpty()) refresh()\n        return current.removeFirst().also { address ->\n            lastPolledAddress = address\n        }\n    }\n\n    override fun toString(): String {\n        return \"ServerListImpl(current.size=${current.size})\"\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/SsoProcessor.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport kotlinx.atomicfu.AtomicRef\nimport kotlinx.atomicfu.atomic\nimport net.mamoe.mirai.auth.AuthReason\nimport net.mamoe.mirai.auth.BotAuthInfo\nimport net.mamoe.mirai.auth.BotAuthorization\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.QRCodeLoginData\nimport net.mamoe.mirai.internal.network.WLoginSigInfo\nimport net.mamoe.mirai.internal.network.auth.AuthControl\nimport net.mamoe.mirai.internal.network.auth.BotAuthorizationWithSecretsProtection\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.logger\nimport net.mamoe.mirai.internal.network.handler.selector.NetworkException\nimport net.mamoe.mirai.internal.network.handler.selector.SelectorRequireReconnectException\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketWithRespType\nimport net.mamoe.mirai.internal.network.protocol.packet.login.DeviceVerificationResultImpl\nimport net.mamoe.mirai.internal.network.protocol.packet.login.SmsDeviceVerificationResult\nimport net.mamoe.mirai.internal.network.protocol.packet.login.StatSvc\nimport net.mamoe.mirai.internal.network.protocol.packet.login.UrlDeviceVerificationResult\nimport net.mamoe.mirai.internal.network.protocol.packet.login.WtLogin.Login.LoginPacketResponse\nimport net.mamoe.mirai.internal.network.protocol.packet.login.WtLogin.Login.LoginPacketResponse.Captcha\nimport net.mamoe.mirai.internal.network.protocol.packet.login.wtlogin.*\nimport net.mamoe.mirai.internal.network.qimei.requestQimei\nimport net.mamoe.mirai.internal.utils.subLogger\nimport net.mamoe.mirai.network.*\nimport net.mamoe.mirai.utils.*\nimport net.mamoe.mirai.utils.BotConfiguration.MiraiProtocol\nimport kotlin.coroutines.cancellation.CancellationException\n\n/**\n * Handles login, and acts also as a mediator of [BotInitProcessor]\n */\ninternal interface SsoProcessor {\n    val client: QQAndroidClient\n    val ssoSession: SsoSession\n\n    val firstLoginResult: FirstLoginResult? // null means just initialized\n    fun casFirstLoginResult(\n        expect: FirstLoginResult?,\n        update: FirstLoginResult?\n    ): Boolean // enable compiler optimization\n\n    fun setFirstLoginResult(value: FirstLoginResult?)\n\n    val firstLoginSucceed: Boolean get() = firstLoginResult?.success ?: false\n    val registerResp: StatSvc.Register.Response?\n\n    var isFirstLogin: Boolean\n    var authReason: AuthReason\n\n    /**\n     * Do login. Throws [LoginFailedException] if failed\n     */\n    @Throws(LoginFailedException::class, CancellationException::class)\n    suspend fun login(handler: NetworkHandler)\n\n    suspend fun logout(handler: NetworkHandler)\n\n    suspend fun sendRegister(handler: NetworkHandler): StatSvc.Register.Response\n\n    companion object : ComponentKey<SsoProcessor>\n}\n\n/**\n * Wraps [LoginFailedException] into [NetworkException]\n */\ninternal class LoginFailedExceptionAsNetworkException(\n    private val underlying: LoginFailedException\n) : NetworkException(underlying.message ?: \"Login failed\", underlying, !underlying.killBot) {\n    override fun unwrapForPublicApi(): Throwable {\n        return underlying\n    }\n}\n\ninternal enum class FirstLoginResult(\n    val success: Boolean,\n    val canRecoverOnFirstLogin: Boolean,\n) {\n    PASSED(true, true),\n    CHANGE_SERVER(false, true), // by ConfigPush\n    OTHER_FAILURE(false, false),\n}\n\n/**\n * Contains secrets for encryption and decryption during a session created by [SsoProcessor] and [PacketCodec].\n *\n * @see AccountSecrets\n */\ninternal interface SsoSession {\n    var outgoingPacketSessionId: ByteArray\n\n    /**\n     * always 0 for now.\n     */\n    var loginState: Int\n\n    // also present in AccountSecrets\n    var wLoginSigInfo: WLoginSigInfo\n    val randomKey: ByteArray\n}\n\n/**\n * Strategy that performs the process of single sing-on (SSO). (login)\n *\n * And allows to retire the [session][ssoSession] after success.\n *\n * Used by `NettyNetworkHandler.StateConnecting`.\n */\ninternal open class SsoProcessorImpl(\n    val ssoContext: SsoProcessorContext,\n) : SsoProcessor {\n\n    ///////////////////////////////////////////////////////////////////////////\n    // public\n    ///////////////////////////////////////////////////////////////////////////\n\n    private val _firstLoginResult: AtomicRef<FirstLoginResult?> = atomic(null)\n    override val firstLoginResult get() = _firstLoginResult.value\n    override fun casFirstLoginResult(expect: FirstLoginResult?, update: FirstLoginResult?): Boolean =\n        _firstLoginResult.compareAndSet(expect, update)\n\n    override fun setFirstLoginResult(value: FirstLoginResult?) {\n        _firstLoginResult.value = value\n    }\n\n    @Volatile\n    override var registerResp: StatSvc.Register.Response? = null\n\n    override var client\n        get() = ssoContext.bot.components[BotClientHolder].client\n        set(value) {\n            ssoContext.bot.components[BotClientHolder].client = value\n        }\n\n    private val qimeiLogger by lazy { ssoContext.bot.network.logger.subLogger(\"QimeiApi\") }\n\n    override val ssoSession: SsoSession get() = client\n    private val components get() = ssoContext.bot.components\n\n    override var isFirstLogin: Boolean = true\n    override var authReason: AuthReason by lateinitMutableProperty {\n        AuthReason.FreshLogin(ssoContext.bot, null)\n    }\n\n    private val botAuthInfo = object : BotAuthInfo {\n        override val id: Long\n            get() = ssoContext.bot.id\n        override val deviceInfo: DeviceInfo\n            get() = ssoContext.device\n        override val configuration: BotConfiguration\n            get() = ssoContext.bot.configuration\n        override val isFirstLogin: Boolean\n            get() = this@SsoProcessorImpl.isFirstLogin\n        override val reason: AuthReason\n            get() = this@SsoProcessorImpl.authReason\n    }\n\n    protected open suspend fun doSlowLogin(\n        handler: NetworkHandler,\n        loginType: LoginType\n    ) {\n        SlowLoginImpl(handler, loginType).doLogin()\n    }\n\n    protected open suspend fun doFastLogin(handler: NetworkHandler) {\n        FastLoginImpl(handler).doLogin()\n    }\n\n\n    /**\n     * Throws [LoginFailedException] if failed. Any other exceptions are considered as internal error.\n     */\n    final override suspend fun login(handler: NetworkHandler) {\n\n        fun initAndStartAuthControl() {\n            authControl = AuthControl(\n                botAuthInfo,\n                ssoContext.bot.account.authorization,\n                ssoContext.bot.network.logger,\n                ssoContext.bot.coroutineContext, // do not use network context because network may restart whilst auth control should keep alive\n            ).also { it.start() }\n        }\n\n        suspend fun loginSuccess() {\n            components[AccountSecretsManager].saveSecrets(ssoContext.account, AccountSecretsImpl(client))\n            sendRegister(handler)\n            ssoContext.bot.logger.info { \"Login successful.\" }\n        }\n\n        if (authControl == null) {\n            ssoContext.bot.account.let { account ->\n                if (account.accountSecretsKeyBuffer == null) {\n\n                    account.accountSecretsKeyBuffer = when (val authorization = account.authorization) {\n                        is BotAuthorizationWithSecretsProtection -> authorization.calculateSecretsKeyImpl(botAuthInfo)\n                        else -> SecretsProtection.EscapedByteBuffer(authorization.calculateSecretsKey(botAuthInfo))\n                    }\n                }\n            }\n\n            components[CacheValidator].validate()\n            components[BdhSessionSyncer].loadServerListFromCache()\n\n            try {\n                ssoContext.bot.requestQimei(qimeiLogger)\n            } catch (exception: Throwable) {\n                qimeiLogger.warning(\"Cannot get qimei from server.\", exception)\n            }\n\n            // trpc ecdh service needs qimei to init\n            components[EcdhInitialPublicKeyUpdater].initializeSsoSecureEcdh()\n\n            // try fast login\n            if (client.wLoginSigInfoInitialized) {\n                ssoContext.bot.components[EcdhInitialPublicKeyUpdater].refreshInitialPublicKeyAndApplyEcdh()\n                kotlin.runCatching {\n                    doFastLogin(handler)\n                }.onFailure { e ->\n                    // first fast-login exception should also be considered as re-auth cause.\n                    if (isFirstLogin) {\n                        authReason = AuthReason.FastLoginError(ssoContext.bot, e.message)\n                    }\n\n                    initAndStartAuthControl()\n                    authControl!!.exceptionCollector.collect(e)\n\n                    throw SelectorRequireReconnectException()\n                }\n\n                loginSuccess()\n\n                return\n            } else if (isFirstLogin) {\n                authReason = AuthReason.FreshLogin(ssoContext.bot, null)\n            }\n        }\n\n        if (authControl == null) initAndStartAuthControl()\n        val authControl0 = authControl!!\n\n\n        var nextAuthMethod: AuthMethod? = null\n        try {\n            ssoContext.bot.components[BotClientHolder].refreshClient()\n            ssoContext.bot.components[EcdhInitialPublicKeyUpdater].refreshInitialPublicKeyAndApplyEcdh()\n\n            when (val authw = authControl0.acquireAuth().also { nextAuthMethod = it }) {\n                is AuthMethod.Error -> {\n                    authControl = null\n                    throw BotAuthorizationException(ssoContext.account.authorization, authw.exception)\n                }\n\n                AuthMethod.NotAvailable -> {\n                    authControl = null\n                    error(\"No more auth method available\")\n                }\n\n                is AuthMethod.Pwd -> {\n                    val loginType = LoginType.Password(authw.passwordMd5)\n                    doSlowLogin(handler, loginType)\n                }\n\n                AuthMethod.QRCode -> {\n                    val rsp = ssoContext.bot.components[QRCodeLoginProcessor].prepareProcess(\n                        handler, client\n                    ).process(handler, client)\n\n                    val loginType = LoginType.QRCode(rsp)\n                    doSlowLogin(handler, loginType)\n                }\n            }\n\n            authControl!!.actComplete()\n            authControl = null\n        } catch (exception: Throwable) {\n            if (exception is SelectorRequireReconnectException) {\n                throw exception\n            }\n\n            ssoContext.bot.network.logger.warning({ \"Failed with auth method: $nextAuthMethod\" }, exception)\n            authControl0.exceptionCollector.collectException(exception)\n\n            if (nextAuthMethod !is AuthMethod.Error && nextAuthMethod != null) {\n                authControl0.actMethodFailed(exception)\n            }\n\n            if (exception is NetworkException) {\n                if (exception.recoverable) throw exception\n            }\n\n            if (nextAuthMethod == null || nextAuthMethod is AuthMethod.NotAvailable || nextAuthMethod is AuthMethod.Error) {\n                authControl = null\n                authControl0.exceptionCollector.throwLast()\n            }\n\n            throw SelectorRequireReconnectException()\n        }\n\n        loginSuccess()\n\n    }\n\n    sealed class AuthMethod {\n        object NotAvailable : AuthMethod() {\n            override fun toString(): String = \"NotAvailable\"\n        }\n\n        object QRCode : AuthMethod() {\n            override fun toString(): String = \"QRCode\"\n        }\n\n        class Pwd(val passwordMd5: SecretsProtection.EscapedByteBuffer) : AuthMethod() {\n            override fun toString(): String = \"Password@${hashCode()}\"\n        }\n\n        /**\n         * Exception in [BotAuthorization]\n         */\n        class Error(\n            val exception: Throwable // unwrapped\n        ) : AuthMethod() {\n            override fun toString(): String = \"Error[$exception]@${hashCode()}\"\n        }\n    }\n\n    private var authControl: AuthControl? = null\n\n    override suspend fun sendRegister(handler: NetworkHandler): StatSvc.Register.Response {\n        return handler.sendAndExpect(StatSvc.Register.online(client)).also {\n            registerResp = it\n        }\n    }\n\n    override suspend fun logout(handler: NetworkHandler) {\n        if (firstLoginSucceed) {\n            handler.sendWithoutExpect(StatSvc.Register.offline(client))\n        }\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // login\n    ///////////////////////////////////////////////////////////////////////////\n\n    // we have exactly two methods----slow and fast.\n\n    protected abstract inner class LoginStrategy(\n        val handler: NetworkHandler,\n    ) {\n        protected val context get() = handler.context\n        protected val bot get() = context.bot\n        protected val logger get() = bot.logger\n\n        protected suspend fun <R : Packet?> OutgoingPacketWithRespType<R>.sendAndExpect(): R =\n            handler.sendAndExpect(this)\n\n        abstract suspend fun doLogin()\n    }\n\n    private inner class SlowLoginImpl(\n        handler: NetworkHandler,\n        private val loginType: LoginType\n    ) : LoginStrategy(handler) {\n\n        private fun loginSolverNotNull(): LoginSolver {\n            fun LoginSolver?.notnull(): LoginSolver {\n                checkNotNull(this) {\n                    \"No LoginSolver found. Please provide by BotConfiguration.loginSolver. \" +\n                            \"For example use `BotFactory.newBot(...) { loginSolver = yourLoginSolver}` in Kotlin, \" +\n                            \"use `BotFactory.newBot(..., new BotConfiguration() {{ setLoginSolver(yourLoginSolver) }})` in Java.\"\n                }\n                return this\n            }\n\n            return bot.configuration.loginSolver.notnull()\n        }\n\n        private val sliderSupported get() = bot.configuration.loginSolver?.isSliderCaptchaSupported ?: false\n\n        private fun createUnsupportedSliderCaptchaException(allowSlider: Boolean): UnsupportedSliderCaptchaException {\n            return UnsupportedSliderCaptchaException(\n                buildString {\n                    append(\"Mirai 无法完成滑块验证.\")\n                    if (allowSlider) {\n                        append(\" 使用协议 \")\n                        append(ssoContext.protocol)\n                        append(\" 强制要求滑块验证, 请更换协议后重试.\")\n                    }\n                    append(\", extra={ login-solver=\")\n                    bot.configuration.loginSolver.let { ls ->\n                        append(ls)\n                        append(\" <\")\n                        append(ls?.let { it::class })\n                        append(\">\")\n                    }\n                    append(\" 另请参阅: https://github.com/project-mirai/mirai-login-solver-selenium\")\n                }\n            )\n        }\n\n        override suspend fun doLogin() = withExceptionCollector {\n\n            @Suppress(\"FunctionName\")\n            fun SSOWtLogin9(allowSlider: Boolean) = when (loginType) {\n                is LoginType.Password -> WtLogin9.Password(client, loginType.passwordMd5.asByteArray, allowSlider)\n                is LoginType.QRCode -> WtLogin9.QRCode(client, loginType.qrCodeLoginData)\n            }\n\n            var allowSlider = sliderSupported || bot.configuration.protocol == MiraiProtocol.ANDROID_PHONE\n\n            var response: LoginPacketResponse = SSOWtLogin9(allowSlider).sendAndExpect()\n\n            mainloop@ while (true) {\n                when (response) {\n                    is LoginPacketResponse.Success -> {\n                        logger.info { \"Login successful\" }\n                        break@mainloop\n                    }\n\n                    is LoginPacketResponse.DeviceLockLogin -> {\n                        response = WtLogin20(client).sendAndExpect()\n                    }\n\n                    is LoginPacketResponse.VerificationNeeded -> {\n                        val result = loginSolverNotNull().onSolveDeviceVerification(\n                            bot, response.requests\n                        )\n                        check(result is DeviceVerificationResultImpl)\n                        response = when (result) {\n                            is UrlDeviceVerificationResult -> {\n                                SSOWtLogin9(allowSlider).sendAndExpect()\n                            }\n\n                            is SmsDeviceVerificationResult -> {\n                                WtLogin7(client, result.token, result.code).sendAndExpect()\n                            }\n                        }\n                    }\n\n                    is Captcha.Picture -> {\n                        var result = loginSolverNotNull().onSolvePicCaptcha(bot, response.data)\n                        if (result == null || result.length != 4) {\n                            //refresh captcha\n                            result = \"ABCD\"\n                        }\n                        response = WtLogin2.SubmitPictureCaptcha(client, response.sign, result).sendAndExpect()\n                    }\n\n                    is Captcha.Slider -> {\n                        if (sliderSupported) {\n                            // use solver\n                            val ticket = try {\n                                loginSolverNotNull().onSolveSliderCaptcha(bot, response.url)?.takeIf { it.isNotEmpty() }\n                            } catch (error: Throwable) {\n                                collectThrow(error)\n                            }\n                            response = if (ticket == null) {\n                                SSOWtLogin9(allowSlider).sendAndExpect()\n                            } else {\n                                WtLogin2.SubmitSliderCaptcha(client, ticket).sendAndExpect()\n                            }\n                        } else {\n                            // retry once\n                            if (!allowSlider) collectThrow(createUnsupportedSliderCaptchaException(allowSlider))\n                            // allowSlider = false\n                            // TODO Reconnect without slider request\n                            //      Need to create new connection NOT send it in current connection\n                            // response = WtLogin9(client, allowSlider).sendAndExpect()\n                            collectThrow(createUnsupportedSliderCaptchaException(false))\n                        }\n                    }\n\n                    is LoginPacketResponse.Error -> {\n                        if (response.message.contains(\"0x9a\")) { //Error(title=登录失败, message=请你稍后重试。(0x9a), errorInfo=)\n                            collectThrow(RetryLaterException(\"Login failed: $response\"))\n                        }\n                        val msg = response.toString()\n                        collectThrow(WrongPasswordException(buildString(capacity = msg.length) {\n                            append(msg)\n                            if (msg.contains(\"当前上网环境异常\")) { // Error(title=禁止登录, message=当前上网环境异常，请更换网络环境或在常用设备上登录或稍后再试。, errorInfo=)\n                                append(\", mirai 提示: 若频繁出现, 请尝试开启设备锁\")\n                            }\n                            if (msg.contains(\"当前登录存在安全风险\")) { // Error(title=禁止登录, message=当前上网环境异常，请更换网络环境或在常用设备上登录或稍后再试。, errorInfo=)\n                                append(\", mirai 提示: 这可能是尝试登录次数过多导致的, 请等待一段时间后再试\")\n                            }\n                            if (!sliderSupported) {\n                                append(\", extra={ sliderSupported=false, login-solver=\").append(bot.configuration.loginSolver)\n                                append(\" <\").append(\n                                    bot.configuration.loginSolver?.let { it::class }\n                                )\n                                append(\"> }\")\n                                if (msg.contains(\"版本过低\")) {\n                                    append(\", mirai 提示: 提供给 mirai 的验证码处理器不支持滑块验证, 请报告至此验证器的作者\")\n                                }\n                            }\n                        }))\n                    }\n\n                    is LoginPacketResponse.SmsRequestSuccess -> {\n                        error(\"Unexpected response: $response\")\n                    }\n                }\n            }\n\n        }\n    }\n\n    protected sealed class LoginType {\n        class Password(val passwordMd5: SecretsProtection.EscapedByteBuffer) : LoginType()\n        class QRCode(val qrCodeLoginData: QRCodeLoginData) : LoginType()\n    }\n\n    protected inner class FastLoginImpl(handler: NetworkHandler) : LoginStrategy(handler) {\n        override suspend fun doLogin() {\n            val login10 = handler.sendAndExpect(WtLogin10(client))\n            check(login10 is LoginPacketResponse.Success) { \"Fast login failed: $login10\" }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/SsoProcessorContext.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.internal.BotAccount\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.utils.BotConfiguration\nimport net.mamoe.mirai.utils.DeviceInfo\n\n/**\n * Provides the information needed by the [SsoProcessor].\n */\ninternal interface SsoProcessorContext {\n    /**\n     * Use other properties instead. Use [bot] only when you cannot find other properties.\n     */\n    val bot: QQAndroidBot\n\n    val account: BotAccount\n    val device: DeviceInfo\n\n    val protocol: BotConfiguration.MiraiProtocol\n\n    val configuration: BotConfiguration get() = bot.configuration\n\n    /**\n     * t545\n     */\n    var qimei16: String?\n    var qimei36: String?\n\n    companion object : ComponentKey<SsoProcessorContext>\n}\n\ninternal class SsoProcessorContextImpl(\n    override val bot: QQAndroidBot,\n) : SsoProcessorContext {\n    override val account: BotAccount get() = bot.account\n    override val device: DeviceInfo = configuration.createDeviceInfo(bot)\n    override val protocol: BotConfiguration.MiraiProtocol get() = configuration.protocol\n    override val configuration: BotConfiguration get() = bot.configuration\n\n\n    override var qimei16: String? = null\n    override var qimei36: String? = null\n}\n\ninternal fun BotConfiguration.createDeviceInfo(bot: Bot): DeviceInfo = deviceInfo?.invoke(bot) ?: DeviceInfo.random()"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/SyncController.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.components\n\nimport kotlinx.atomicfu.AtomicBoolean\nimport kotlinx.atomicfu.atomic\nimport net.mamoe.mirai.internal.AbstractBot\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.protocol.SyncingCacheList\nimport net.mamoe.mirai.internal.network.protocol.data.jce.MsgInfo\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.data.proto.OnlinePushTrans\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport net.mamoe.mirai.utils.currentTimeSeconds\nimport kotlin.jvm.Volatile\n\ninternal interface SyncController {\n    val firstNotify: Boolean\n    fun casFirstNotify(expect: Boolean, update: Boolean): Boolean\n\n    var latestMsgNewGroupTime: Long\n    var latestMsgNewFriendTime: Long\n\n    var syncCookie: ByteArray?\n    var pubAccountCookie: ByteArray\n    var msgCtrlBuf: ByteArray\n\n    fun syncOnlinePush(uid: Long, sequence: Short, time: Long): Boolean\n    fun syncNewFriend(sequence: Long, time: Long): Boolean\n    fun syncNewGroup(sequence: Long, time: Long): Boolean\n    fun syncGetMessage(uid: Long, sequence: Int, time: Int): Boolean\n    fun syncPushTrans(uid: Long, sequence: Int, time: Int): Boolean\n\n    fun syncGroupMessageReceipt(messageRandom: Int): Boolean\n    fun containsGroupMessageReceipt(messageRandom: Int): Boolean\n\n    companion object : ComponentKey<SyncController> {\n        val AbstractBot.syncController get() = this.components[SyncController]\n        val QQAndroidClient.syncController get() = bot.syncController\n        var QQAndroidClient.syncCookie\n            get() = bot.syncController.syncCookie\n            set(value) {\n                bot.syncController.syncCookie = value\n            }\n    }\n}\n\ninternal fun SyncController.syncPushTrans(content: OnlinePushTrans.PbMsgInfo): Boolean =\n    syncPushTrans(content.msgUid, content.msgSeq, content.msgTime)\n\ninternal fun SyncController.syncGetMessage(\n    msgHead: MsgComm.MsgHead,\n) = msgHead.run {\n    syncGetMessage(msgUid, msgSeq, msgTime)\n}\n\ninternal fun SyncController.syncOnlinePush(\n    msgInfo: MsgInfo,\n) = syncOnlinePush(\n    uid = msgInfo.lMsgUid ?: 0,\n    sequence = msgInfo.shMsgSeq,\n    time = msgInfo.uMsgTime,\n)\n\ninternal class SyncControllerImpl : SyncController {\n    private val _firstNotify: AtomicBoolean = atomic(true)\n    override val firstNotify get() = _firstNotify.value\n    override fun casFirstNotify(expect: Boolean, update: Boolean): Boolean = _firstNotify.compareAndSet(expect, update)\n\n    @Volatile\n    override var latestMsgNewGroupTime: Long = currentTimeSeconds()\n\n    @Volatile\n    override var latestMsgNewFriendTime: Long = currentTimeSeconds()\n\n    @Volatile\n    override var syncCookie: ByteArray? = null\n\n    @Volatile\n    override var pubAccountCookie = EMPTY_BYTE_ARRAY\n\n    @Volatile\n    override var msgCtrlBuf: ByteArray = EMPTY_BYTE_ARRAY\n\n    private val pbGetMessageCacheList = SyncingCacheList<PbGetMessageSyncId>()\n    private val systemMsgNewGroupCacheList = SyncingCacheList<SystemMsgNewSyncId>(10)\n    private val systemMsgNewFriendCacheList = SyncingCacheList<SystemMsgNewSyncId>(10)\n    private val pbPushTransMsgCacheList = SyncingCacheList<PbPushTransMsgSyncId>(10)\n    private val onlinePushReqPushCacheList = SyncingCacheList<OnlinePushReqPushSyncId>(50)\n    private val pendingGroupMessageReceiptCacheList = SyncingCacheList<PendingGroupMessageReceiptSyncId>(50)\n\n    override fun syncOnlinePush(uid: Long, sequence: Short, time: Long): Boolean =\n        onlinePushReqPushCacheList.addCache(OnlinePushReqPushSyncId(uid, sequence, time))\n\n    override fun syncNewFriend(sequence: Long, time: Long): Boolean =\n        systemMsgNewFriendCacheList.addCache(SystemMsgNewSyncId(sequence, time))\n\n    override fun syncNewGroup(sequence: Long, time: Long): Boolean =\n        systemMsgNewGroupCacheList.addCache(SystemMsgNewSyncId(sequence, time))\n\n    override fun syncGetMessage(uid: Long, sequence: Int, time: Int): Boolean =\n        pbGetMessageCacheList.addCache(PbGetMessageSyncId(uid, sequence, time))\n\n    override fun syncPushTrans(uid: Long, sequence: Int, time: Int): Boolean =\n        pbPushTransMsgCacheList.addCache(PbPushTransMsgSyncId(uid, sequence, time))\n\n    override fun syncGroupMessageReceipt(messageRandom: Int): Boolean =\n        pendingGroupMessageReceiptCacheList.addCache(PendingGroupMessageReceiptSyncId(messageRandom))\n\n    override fun containsGroupMessageReceipt(messageRandom: Int): Boolean =\n        pendingGroupMessageReceiptCacheList.contains { it.messageRandom == messageRandom }\n\n    data class PbGetMessageSyncId(\n        val uid: Long,\n        val sequence: Int,\n        val time: Int,\n    )\n\n    data class SystemMsgNewSyncId(\n        val sequence: Long,\n        val time: Long,\n    )\n\n    data class PbPushTransMsgSyncId(\n        val uid: Long,\n        val sequence: Int,\n        val time: Int,\n    )\n\n    data class OnlinePushReqPushSyncId(\n        val uid: Long,\n        val sequence: Short,\n        val time: Long,\n    )\n\n    data class PendingGroupMessageReceiptSyncId(\n        val messageRandom: Int,\n    )\n\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/components/package.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n/**\n * 放置一些小组件\n */\npackage net.mamoe.mirai.internal.network.components"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/CommonNetworkHandler.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.channels.onFailure\nimport net.mamoe.mirai.internal.network.components.*\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.Companion.runUnwrapCancellationException\nimport net.mamoe.mirai.internal.network.handler.selector.NetworkException\nimport net.mamoe.mirai.internal.network.handler.selector.NetworkHandlerSelector\nimport net.mamoe.mirai.internal.network.handler.selector.SelectorRequireReconnectException\nimport net.mamoe.mirai.internal.network.handler.state.StateObserver\nimport net.mamoe.mirai.internal.network.impl.HeartbeatFailedException\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.network.LoginFailedException\nimport net.mamoe.mirai.utils.*\nimport kotlin.coroutines.CoroutineContext\n\n/**\n * Implements protocol-specific logic based on [NetworkHandlerSupport]. This can be shared between tests and\n */\ninternal abstract class CommonNetworkHandler<Conn>(\n    context: NetworkHandlerContext,\n    protected val address: SocketAddress,\n) : NetworkHandlerSupport(context) {\n    final override tailrec suspend fun sendPacketImpl(packet: OutgoingPacket) {\n        val state = _state as CommonNetworkHandler<*>.CommonState\n        if (state.sendPacketImpl(packet)) return\n\n        // now the state it not yet ready for sending packet ...\n        stateChannel.receive() // [SUSPENSION POINT] so we wait for next state ...\n        return sendPacketImpl(packet) // and try again.\n    }\n\n    override fun toString(): String {\n        return \"CommonNetworkHandler(context=$context, address=$address)\"\n    }\n\n\n    ///////////////////////////////////////////////////////////////////////////\n    // exception handling\n    ///////////////////////////////////////////////////////////////////////////\n\n    protected open fun handleExceptionInDecoding(error: Throwable) {\n        fun passToExceptionHandler() {\n            // Typically, just log the exception\n            coroutineContext[CoroutineExceptionHandler]!!.handleException(\n                coroutineContext,\n                ExceptionInPacketCodecException(error.unwrap<PacketCodecException>())\n            )\n        }\n\n        if (error is PacketCodecException) {\n            if (error.targetException is EOFException) return\n            when (error.kind) {\n                PacketCodecException.Kind.SESSION_EXPIRED -> {\n                    setState { StateClosed(error) }\n                    return\n                }\n\n                PacketCodecException.Kind.PROTOCOL_UPDATED -> passToExceptionHandler()\n                PacketCodecException.Kind.OTHER -> passToExceptionHandler()\n            }\n        }\n\n        passToExceptionHandler()\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // conn.\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * Creates a connection.\n     */\n    protected abstract suspend fun createConnection(): Conn\n\n    /**\n     * Writes and flushes the packet asynchronously.\n     */\n    protected abstract fun Conn.writeAndFlushOrCloseAsync(packet: OutgoingPacket)\n\n    /**\n     * Close this connection for general reason, immediately. Immediately means any live objects with lifecycle must be marked *cancelled*, *dead* or any terminate state.\n     */\n    @Suppress(\"EXTENSION_SHADOWED_BY_MEMBER\", \"KotlinRedundantDiagnosticSuppress\") // can happen on some platforms\n    protected abstract fun Conn.close()\n\n    /**\n     * *Single-thread* event-loop packet decoder.\n     *\n     * Call [PacketDecodePipeline.send] to submit a decoding job.\n     */\n    internal inner class PacketDecodePipeline(parentContext: CoroutineContext) :\n        CoroutineScope by parentContext.childScope() {\n        private val packetCodec: PacketCodec by lazy { context[PacketCodec] }\n        private val ssoProcessor: SsoProcessor by lazy { context[SsoProcessor] }\n\n\n        private val queue: Channel<ByteReadPacket> = Channel<ByteReadPacket>(Channel.BUFFERED) { undelivered ->\n            launch { sendQueue(undelivered) }\n        }.also { channel -> coroutineContext[Job]!!.invokeOnCompletion { channel.close(it) } }\n\n        private suspend inline fun sendQueue(packet: ByteReadPacket) {\n            queue.send(packet)\n        }\n\n        init {\n            launch {\n                while (isActive) {\n                    val result = queue.receiveCatching()\n                    packetLogger.verbose { \"Decoding packet: $result\" }\n                    result.onFailure { if (it is CancellationException) return@launch }\n\n                    result.getOrNull()?.let { packet ->\n                        try {\n                            val decoded = decodePacket(packet)\n                            launch(start = CoroutineStart.UNDISPATCHED) { processBody(decoded) }\n                        } catch (e: Throwable) {\n                            if (e is CancellationException) return@launch\n                            handleExceptionInDecoding(e)\n                            logger.error(\"Error while decoding packet '${packet}'\", e)\n                        }\n                    }\n                }\n            }\n        }\n\n        private fun decodePacket(packet: ByteReadPacket): RawIncomingPacket {\n            return if (packetLogger.isDebugEnabled) {\n                val bytes = packet.readBytes()\n                logger.verbose { \"Decoding: len=${bytes.size}, value=${bytes.toUHexString()}\" }\n                val raw = packetCodec.decodeRaw(\n                    ssoProcessor.ssoSession,\n                    bytes.toReadPacket()\n                )\n                logger.verbose { \"Decoded: ${raw.commandName}\" }\n                raw\n            } else {\n                packetCodec.decodeRaw(\n                    ssoProcessor.ssoSession,\n                    packet\n                )\n            }\n        }\n\n        private suspend fun processBody(raw: RawIncomingPacket) {\n            packetLogger.debug { \"Packet Handling Processor: receive packet ${raw.commandName}\" }\n            val result = packetCodec.processBody(context.bot, raw)\n            if (result == null) {\n                collectUnknownPacket(raw)\n            } else collectReceived(result)\n        }\n\n        fun send(packet: ByteReadPacket) {\n            queue.trySend(packet).onFailure {\n                throw it ?: throw IllegalStateException(\"Internal error: Failed to decode '$packet' without reason.\")\n            }\n        }\n    }\n\n\n    ///////////////////////////////////////////////////////////////////////////\n    // states\n    ///////////////////////////////////////////////////////////////////////////\n\n    override fun close(cause: Throwable?) {\n        if (state == NetworkHandler.State.CLOSED) return // quick check if already closed\n        if (setState { StateClosed(cause) } == null) return // atomic check\n        super.close(cause) // cancel coroutine scope\n    }\n\n    init {\n        coroutineContext.job.invokeOnCompletion { e ->\n            close(e)\n        }\n    }\n\n    /**\n     * When state is initialized, it must be set to [_state]. (inside [setState])\n     *\n     * For what jobs each state will do, it is not solely decided by the state itself. [StateObserver]s may also launch jobs into the scope.\n     *\n     * @see StateObserver\n     */\n    protected abstract inner class CommonState(\n        correspondingState: NetworkHandler.State,\n    ) : NetworkHandlerSupport.BaseStateImpl(correspondingState) {\n        /**\n         * @return `true` if packet has been sent, `false` if state is not ready for send.\n         * @throws IllegalStateException if is [StateClosed].\n         */\n        abstract suspend fun sendPacketImpl(packet: OutgoingPacket): Boolean\n    }\n\n    protected inner class StateInitialized : CommonState(NetworkHandler.State.INITIALIZED) {\n        override suspend fun sendPacketImpl(packet: OutgoingPacket): Boolean {\n            //            error(\"Cannot send packet when connection is not set. (resumeConnection not called.)\")\n            return false\n        }\n\n        override suspend fun resumeConnection0() {\n            this.setState { StateConnecting(ExceptionCollector()) }\n                ?.resumeConnection()\n                ?: this@CommonNetworkHandler.resumeConnection() // concurrently closed by other thread.\n        }\n\n        override fun toString(): String = \"StateInitialized\"\n    }\n\n    /**\n     * 1. Connect to server.\n     * 2. Perform SSO login with [SsoProcessor]\n     *\n     * If failure, set state to [StateClosed]\n     * If success, set state to [StateOK]\n     */\n    protected inner class StateConnecting(\n        /**\n         * Collected (suppressed) exceptions that have led this state.\n         *\n         * Dropped when state becomes [StateOK].\n         */\n        private val collectiveExceptions: ExceptionCollector,\n    ) : CommonState(NetworkHandler.State.CONNECTING) {\n        private lateinit var connection: Deferred<Conn>\n\n        private lateinit var connectResult: Deferred<Unit>\n\n        override fun startState() {\n            connection = async {\n                createConnection()\n            }\n\n            connectResult = async {\n                connection.join()\n                try {\n                    context[SsoProcessor].login(this@CommonNetworkHandler)\n                } catch (e: LoginFailedException) {\n                    throw LoginFailedExceptionAsNetworkException(e)\n                }\n            }\n            connectResult.invokeOnCompletion { error ->\n                if (error == null) {\n                    this@CommonNetworkHandler.launch { resumeConnection() } // go to next state.\n                } else {\n                    // failed in SSO stage\n                    context[SsoProcessor].casFirstLoginResult(\n                        null,\n                        when (error) {\n                            is SelectorRequireReconnectException -> null\n                            else -> FirstLoginResult.OTHER_FAILURE\n                        }\n                    )\n\n                    if (error is CancellationException) {\n                        // CancellationException is either caused by parent cancellation or manual `connectResult.cancel`.\n                        // The later should not happen, so it's definitely due to the parent cancellation.\n                        // It means that the super scope, the NetworkHandler is closed.\n                        // If we don't `return` here, state will be set to StateClosed with CancellationException, which isn't the real cause.\n                        return@invokeOnCompletion\n                    }\n\n                    setState {\n                        // logon failure closes the network handler.\n                        StateClosed(collectiveExceptions.collectGet(error))\n                        // The exception will be ignored unless all further attempts recovering connection have failed.\n                        // This is to reduce useless logs for the user----there is nothing to worry about if we can recover the connection.\n                    }\n                }\n            }\n\n        }\n\n        override fun getCause(): Throwable? = collectiveExceptions.getLast()\n\n        override suspend fun sendPacketImpl(packet: OutgoingPacket): Boolean = runUnwrapCancellationException {\n            connection.await() // split line number\n                .writeAndFlushOrCloseAsync(packet)\n            return true\n        }\n\n        override suspend fun resumeConnection0() = runUnwrapCancellationException {\n            connectResult.await() // propagates exceptions\n            val connection = connection.await()\n            this.setState { StateLoading(connection) }\n                ?.resumeConnection()\n                ?: this@CommonNetworkHandler.resumeConnection() // concurrently closed by other thread.\n        }\n\n        override fun toString(): String = \"StateConnecting\"\n    }\n\n    /**\n     * @see BotInitProcessor\n     * @see StateObserver\n     */\n    protected inner class StateLoading(\n        private val connection: Conn,\n    ) : CommonState(NetworkHandler.State.LOADING) {\n\n        override fun startState() {\n            coroutineContext.job.invokeOnCompletion {\n                if (it != null) {\n                    connection.close()\n                }\n            }\n        }\n\n        override suspend fun sendPacketImpl(packet: OutgoingPacket): Boolean {\n            connection.writeAndFlushOrCloseAsync(packet)\n            return true\n        }\n\n        // Yes, nothing to do in this state.\n\n        override suspend fun resumeConnection0(): Unit = runUnwrapCancellationException {\n            (coroutineContext.job as CompletableJob).run {\n                complete()\n                join()\n            }\n            setState { StateOK(connection) }\n        } // noop\n\n        override fun toString(): String = \"StateLoading\"\n    }\n\n    protected inner class StateOK(\n        private val connection: Conn,\n    ) : CommonState(NetworkHandler.State.OK) {\n        override fun startState() {\n            coroutineContext.job.invokeOnCompletion { err ->\n                if (err is StateSwitchingException) {\n                    if (err.new.correspondingState == NetworkHandler.State.CLOSED) {\n                        return@invokeOnCompletion\n                    }\n                }\n                connection.close()\n            }\n        }\n\n        private val heartbeatJobs =\n            context[HeartbeatScheduler].launchJobsIn(this@CommonNetworkHandler, this) { name, e ->\n                setState { StateClosed(HeartbeatFailedException(name, e)) }\n            }\n\n        // we can also move them as observers if needed.\n\n        private val keyRefresh = launch(CoroutineName(\"Key refresh\")) {\n            context[KeyRefreshProcessor].keyRefreshLoop(this@CommonNetworkHandler)\n        }\n\n        private val configPush = this@CommonNetworkHandler.launch(CoroutineName(\"ConfigPush sync\")) {\n            context[ConfigPushProcessor].syncConfigPush(this@CommonNetworkHandler)\n        }\n\n\n        override suspend fun sendPacketImpl(packet: OutgoingPacket): Boolean {\n            connection.writeAndFlushOrCloseAsync(packet)\n            return true\n        }\n\n        override suspend fun resumeConnection0(): Unit = runUnwrapCancellationException {\n            joinCompleted(coroutineContext.job)\n            for (job in heartbeatJobs) joinCompleted(job)\n            joinCompleted(configPush)\n            joinCompleted(keyRefresh)\n        } // noop\n\n        override fun toString(): String = \"StateOK\"\n    }\n\n    /**\n     * 这会永久关闭这个 [NetworkHandler], 但通常 bot 会使用 [NetworkHandlerSelector], selector 会创建新的 [NetworkHandler] 来恢复连接.\n     *\n     * 备注: selector 会恢复连接, 当且仅当 [exception] 类型是 [NetworkException] 且 [NetworkException.recoverable] 为 `true`.\n     */\n    protected inner class StateClosed(\n        val exception: Throwable?,\n    ) : CommonState(NetworkHandler.State.CLOSED) {\n\n        override fun afterUpdated() {\n            close(exception)\n        }\n\n        override fun getCause(): Throwable? = exception\n        override suspend fun sendPacketImpl(packet: OutgoingPacket) = error(\"NetworkHandler is already closed.\")\n        override suspend fun resumeConnection0() {\n            exception?.let { throw it }\n        } // noop\n\n        override fun toString(): String = \"StateClosed\"\n    }\n\n    override fun initialState(): NetworkHandlerSupport.BaseStateImpl = StateInitialized()\n\n}\n\ninternal suspend inline fun joinCompleted(job: Job) {\n    if (job.isCompleted) job.join()\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/NetworkHandler.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler\n\nimport kotlinx.atomicfu.atomic\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.TimeoutCancellationException\nimport kotlinx.coroutines.channels.ReceiveChannel\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.flow.consumeAsFlow\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.flow.takeWhile\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.internal.AbstractBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.components.BotInitProcessor\nimport net.mamoe.mirai.internal.network.components.HeartbeatScheduler\nimport net.mamoe.mirai.internal.network.components.SsoProcessor\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.State\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.State.*\nimport net.mamoe.mirai.internal.network.handler.selector.MaxAttemptsReachedException\nimport net.mamoe.mirai.internal.network.handler.selector.NetworkException\nimport net.mamoe.mirai.internal.network.handler.selector.SelectorNetworkHandler\nimport net.mamoe.mirai.internal.network.handler.state.StateObserver\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketWithRespType\nimport net.mamoe.mirai.internal.network.protocol.packet.PacketFactory\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.systemProp\nimport net.mamoe.mirai.utils.unwrapCancellationException\n\n/**\n * Coroutine-based network framework. Usually wrapped with [SelectorNetworkHandler] to enable retrying.\n *\n * Implementation is typically subclass of [NetworkHandlerSupport].\n *\n * Instances are often created by [NetworkHandlerFactory].\n *\n * For more information, see [State].\n *\n * @see NetworkHandlerSupport\n * @see NetworkHandlerFactory\n */\ninternal interface NetworkHandler : CoroutineScope {\n    val context: NetworkHandlerContext\n\n    /**\n     * Current state of this handler.\n     */\n    val state: State\n\n    fun getLastFailure(): Throwable?\n\n    /**\n     * The channel that is sent with a [State] when changed.\n     */\n    val stateChannel: ReceiveChannel<State>\n\n    /**\n     * State of this handler.\n     *\n     * ## States transition overview\n     *\n     * There are 5 [State]s, each of which encapsulates the state of the network connection.\n     *\n     * Initial state is [State.INITIALIZED], at which no packets can be sent before [resumeConnection], which transmits state into [State.CONNECTING].\n     * On [State.CONNECTING], [NetworkHandler] establishes a connection with the server while [SsoProcessor] takes responsibility in the single-sign-on process.\n     *\n     * Successful logon turns state to [State.LOADING], an **open state**, which does nothing by default. Jobs can be *attached* by [StateObserver]s.\n     * For example, attaching a [BotInitProcessor] to handle account-relevant jobs to the [Bot].\n     *\n     * Failure during [State.CONNECTING] and [State.LOADING] switches state to [State.CLOSED], on which [NetworkHandler] is considered **permanently dead**.\n     * The state after finishing of [State.LOADING] is [State.OK]. This state lasts for the majority of time.\n     *\n     * When connection is lost (e.g. due to Internet unavailability), it does NOT return to [State.CONNECTING] but to [State.CLOSED]. No reconnection is allowed.\n     * Retrial may only be performed in [SelectorNetworkHandler].\n     *\n     * ## 深入了解状态维护机制\n     *\n     * ### 登录时的状态转移\n     *\n     * [NetworkHandler] 实例会在 [登录][Bot.login] 时创建 (定义在 [AbstractBot.network]), 此时初始状态为 [INITIALIZED].\n     *\n     * [Bot.login] 会在创建该实例后就执行 [NetworkHandler.resumeConnection], 意图是将 [NetworkHandler] **调整**为可以收发功能数据包的正常工作状态, 即 [OK].\n     * 为了达成这个状态, [NetworkHandler] 将需要通过 [INITIALIZED] -> [CONNECTING] -> [LOADING] -> [OK], 即**初始化** -> **连接服务器** -> **载入** -> **完成**流程.\n     *\n     * 在 [CONNECTING] 状态中, [NetworkHandler] 将会与服务器建立网络连接, 并执行登录.\n     * 若成功, 状态进入 [LOADING], 此时 [NetworkHandler] 将会从服务器拉取好友列表等必要信息.\n     * 拉取顺利完成后状态进入 [OK], 用于维护登录会话的心跳任务等协程将会由启动 [HeartbeatScheduler] 启动, [NetworkHandler] 现在可以收发功能数据包. [NetworkHandler.resumeConnection] 返回, [Bot.login] 返回.\n     *\n     * ### 单向状态转移与\"重置\"\n     *\n     * [NetworkHandler] 的实现除了 [SelectorNetworkHandler] 外, 都只设计实现单向的状态转移,\n     * 这意味着它们最终的状态都是 [CLOSED], 并且一旦到达 [CLOSED] 就无法回到之前的状态.\n     *\n     * [Selector][SelectorNetworkHandler] 是对某一个 [NetworkHandler] 的包装, 它为 [NetworkHandler] 增加异常处理和\"可重置\"的状态转移能力.\n     * 若在单向状态转移过程 (比如登录) 中出现异常, 异常会被传递到 [NetworkHandler.resumeConnection] 抛出.\n     *\n     * ### 异常的区分\n     *\n     * 网络系统中的异常是有语义的 — 它如果是 [NetworkException], [Selector][SelectorNetworkHandler] 会使用异常的 [NetworkException.recoverable] 信息判断是否应该\"重置\"状态.\n     * [NetworkException] 是已知的异常. 而任何其他的异常, 例如 [IllegalStateException], [NoSuchElementException], 都是未知的异常.\n     * 未知的异常会被认为是严重的内部错误, [Selector][SelectorNetworkHandler] 会[关闭 bot][Bot.close]. (提醒: 关闭 bot 是终止操作, 标志 bot 实例的结束)\n     *\n     * 你在 [NetworkHandler.resumeConnection] 和 [Selector][SelectorNetworkHandler] 中需要注意异常类型, 为函数清晰注释其可能抛出的异常类型.\n     *\n     * [Selector][SelectorNetworkHandler] 不会立即将异常向上传递, 而是会根据异常类型尝试\"重置\"状态, 以处理网络状态不佳或服务器要求重连到其他地址等情况.\n     *\n     * ### Selector 重置状态\n     *\n     * [Selector][SelectorNetworkHandler] 通过实例化新的 [NetworkHandler] 来获得状态为 [INITIALIZED] 的实例, 对外来说就是\"重置\"了状态.\n     *\n     * @see state\n     */\n    enum class State {\n        /**\n         * Just created and no connection has been made.\n         *\n         * At this state [resumeConnection] turns state into [CONNECTING] and\n         * establishes a connection to the server and do authentication, for which [sendAndExpect] suspends.\n         */\n        INITIALIZED,\n\n        /**\n         * Connection to server, including the process of authentication.\n         *\n         * At this state [resumeConnection] does nothing. [sendAndExpect] suspends for the result of connection started in [INITIALIZED].\n         */\n        CONNECTING,\n\n        /**\n         * Loading essential data from server and local cache. Data include contact list.\n         *\n         * At this state [resumeConnection] waits for the jobs. [sendAndExpect] works normally.\n         */\n        LOADING,\n\n        /**\n         * Everything is working.\n         *\n         * At this state [resumeConnection] does nothing. [sendAndExpect] works normally.\n         */\n        OK,\n\n        /**\n         * The terminal state. Both [resumeConnection] and [sendAndExpect] throw a [IllegalStateException].\n         *\n         * **Important nodes**: iff [NetworkHandler] is [SelectorNetworkHandler], it might return to a normal state e.g. [INITIALIZED] if new instance of [NetworkHandler] is created.\n         * However callers usually do not need to pay extra attention on this behavior. Everything will just work fine if you consider [CLOSED] as a final, non-recoverable state.\n         *\n         * At this state [resumeConnection] throws the exception caught from underlying socket implementation (i.e netty).\n         * [sendAndExpect] throws [IllegalStateException].\n         */\n        CLOSED,\n    }\n\n    /**\n     * Suspends the coroutine until [sendAndExpect] can be executed without suspension.\n     *\n     * If this functions returns normally, it indicates that [state] is [State.LOADING] or [State.OK]\n     *\n     * @throws NetworkException 已知的异常\n     * @throws Throwable 其他内部错误\n     * @throws MaxAttemptsReachedException 重试次数达到上限\n     * @throws CancellationException 协程被取消\n     *\n     * @see SelectorNetworkHandler.instance\n     */\n    @Throws(NetworkException::class, Throwable::class)\n    suspend fun resumeConnection()\n\n\n    /**\n     * Sends [packet], suspends and expects to receive a response from the server.\n     *\n     * Coroutine suspension may happen if connection is not yet available however,\n     * [IllegalStateException] is thrown if [NetworkHandler] is already in [State.CLOSED] since closure is final.\n     *\n     * @throws TimeoutCancellationException if timeout has been reached.\n     * @throws CancellationException if the [NetworkHandler] is closed, with the last cause for closure.\n     * @throws IllegalArgumentException if [timeout] or [attempts] are invalid.\n     *\n     * @param attempts ranges `1..INFINITY`\n     */\n    suspend fun <P : Packet?> sendAndExpect(\n        packet: OutgoingPacketWithRespType<P>,\n        timeout: Long = 5000,\n        attempts: Int = 2\n    ): P\n\n    /**\n     * Sends [packet], suspends and expects to receive a response from the server.\n     *\n     * Note that it's corresponding [PacketFactory]'s responsibility to decode the returned date from server to give resultant [Packet],\n     * and that packet is cast to [P], hence unsafe (vulnerable for [ClassCastException]).\n     * Always use [sendAndExpect] with [OutgoingPacketWithRespType], use this unsafe overload only for legacy code.\n     */\n    suspend fun <P : Packet?> sendAndExpect(packet: OutgoingPacket, timeout: Long = 5000, attempts: Int = 2): P\n\n    /**\n     * Sends [packet] and does not expect any response.\n     *\n     * Response is still being processed but not passed as a return value of this function, so it does not suspend this function (due to awaiting for the response).\n     * However, coroutine is still suspended if connection is not yet available.\n     * [IllegalStateException] will be thrown if [NetworkHandler] is already in [State.CLOSED] since closure is final, since closure is final.\n     *\n     * @throws CancellationException if the [NetworkHandler] is closed, with the last cause for closure.\n     */\n    suspend fun sendWithoutExpect(packet: OutgoingPacket)\n\n    /**\n     * Closes this handler gracefully (i.e. asynchronously). You should provide [cause] as possible as you can to give debugging information.\n     *\n     * After invocation of [close], [state] will always be [State.CLOSED].\n     */\n    fun close(cause: Throwable?)\n\n    companion object {\n        /**\n         * [unwrapCancellationException] will give a rather long and complicated trace showing all internal traces.\n         * The traces may help locate where the [Job.cancel] is called, but this is not usually important.\n         * @since 2.13\n         */\n        var CANCELLATION_TRACE by atomic(systemProp(\"mirai.network.handler.cancellation.trace\", false))\n\n        inline fun <R> runUnwrapCancellationException(block: () -> R): R {\n            try {\n                return block()\n            } catch (e: CancellationException) {\n                // e is like `Exception in thread \"main\" kotlinx.coroutines.JobCancellationException: Parent job is Cancelling; job=JobImpl{Cancelled}@f252f300`\n                // and this is useless.\n\n                throw e.unwrapCancellationException(CANCELLATION_TRACE)\n\n                // if (e.suppressed.isNotEmpty()) throw e // preserve details.\n                // throw e.findCause { it !is CancellationException } ?: e\n            }\n        }\n    }\n}\n\ninternal val NetworkHandler.logger: MiraiLogger get() = context.logger\n\n/**\n * Suspends coroutine to wait for the state [suspendUntil].\n */\ninternal suspend fun NetworkHandler.awaitState(suspendUntil: NetworkHandler.State) {\n    if (this.state == suspendUntil) return\n    stateChannel.consumeAsFlow().takeWhile { it != suspendUntil }.collect()\n}\n\n/**\n * Suspends coroutine to wait for a state change. Returns immediately after [NetworkHandler.state] has changed.\n */\ninternal suspend fun NetworkHandler.awaitStateChange() {\n    stateChannel.consumeAsFlow().first()\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/NetworkHandlerContext.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler\n\nimport kotlinx.coroutines.CoroutineExceptionHandler\nimport kotlinx.coroutines.CoroutineName\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.component.ComponentStorage\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.SimpleLogger\n\n/**\n * Immutable context for [NetworkHandler]\n * @see NetworkHandlerContextImpl\n */\ninternal interface NetworkHandlerContext : ComponentStorage {\n    val bot: QQAndroidBot\n    // however migration requires a major change.\n\n    val logger: MiraiLogger\n}\n\ninternal inline fun NetworkHandlerContext.mapComponents(action: (ComponentStorage) -> ComponentStorage): NetworkHandlerContext {\n    return NetworkHandlerContextImpl(bot, logger, this.let(action))\n}\n\ninternal class NetworkHandlerContextImpl(\n    override val bot: QQAndroidBot,\n    override val logger: MiraiLogger,\n    private val storage: ComponentStorage, // should be the same as bot.components\n) : NetworkHandlerContext, ComponentStorage by storage {\n    override fun toString(): String {\n        return \"NetworkHandlerContextImpl(bot=${bot.id}, storage=$storage)\"\n    }\n}\n\ninternal fun MiraiLogger.asCoroutineExceptionHandler(\n    priority: SimpleLogger.LogPriority = SimpleLogger.LogPriority.ERROR,\n): CoroutineExceptionHandler {\n    return CoroutineExceptionHandler { context, e ->\n        call(\n            priority,\n            context[CoroutineName]?.let { \"Exception in coroutine '${it.name}'.\" } ?: \"Exception in unnamed coroutine.\",\n            e\n        )\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/NetworkHandlerFactory.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler\n\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.State\n\n/**\n * Factory for a specific [NetworkHandler] implementation.\n */\ninternal expect fun interface NetworkHandlerFactory<out H : NetworkHandler> {\n    open fun create(context: NetworkHandlerContext, host: String, port: Int): H\n\n    /**\n     * Create an instance of [H]. The returning [H] has [NetworkHandler.state] of [State.INITIALIZED]\n     */\n    fun create(context: NetworkHandlerContext, address: SocketAddress): H\n\n    companion object {\n        fun getPlatformDefault(): NetworkHandlerFactory<*>\n    }\n}\n\ninternal expect abstract class SocketAddress\n\n@Suppress(\"EXTENSION_SHADOWED_BY_MEMBER\")\ninternal expect fun SocketAddress.getHost(): String\n\n@Suppress(\"EXTENSION_SHADOWED_BY_MEMBER\")\ninternal expect fun SocketAddress.getPort(): Int\n\ninternal expect fun createSocketAddress(host: String, port: Int): SocketAddress\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/NetworkHandlerSupport.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler\n\nimport kotlinx.atomicfu.locks.SynchronizedObject\nimport kotlinx.atomicfu.locks.reentrantLock\nimport kotlinx.atomicfu.locks.withLock\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.channels.ReceiveChannel\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.components.PacketCodec\nimport net.mamoe.mirai.internal.network.components.PacketHandler\nimport net.mamoe.mirai.internal.network.components.PacketLoggingStrategy\nimport net.mamoe.mirai.internal.network.components.RawIncomingPacket\nimport net.mamoe.mirai.internal.network.handler.selector.NetworkHandlerSelector\nimport net.mamoe.mirai.internal.network.handler.state.StateObserver\nimport net.mamoe.mirai.internal.network.protocol.packet.IncomingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketWithRespType\nimport net.mamoe.mirai.internal.utils.fromMiraiLogger\nimport net.mamoe.mirai.internal.utils.subLogger\nimport net.mamoe.mirai.utils.*\nimport net.mamoe.mirai.utils.Either.Companion.fold\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\nimport kotlin.jvm.Volatile\nimport kotlin.reflect.KClass\n\n/**\n * Implements a state-based [NetworkHandler].\n */\ninternal abstract class NetworkHandlerSupport(\n    final override val context: NetworkHandlerContext,\n    additionalCoroutineContext: CoroutineContext = EmptyCoroutineContext,\n) : NetworkHandler, CoroutineScope {\n    final override val coroutineContext: CoroutineContext =\n        additionalCoroutineContext.childScopeContext(SupervisorJob(context.bot.coroutineContext.job))\n            .plus(CoroutineExceptionHandler.fromMiraiLogger(logger))\n\n    /**\n     * Creates an instance of the initial state. This is guaranteed to be called at most once.\n     */\n    protected abstract fun initialState(): BaseStateImpl\n\n    /**\n     * Performs network IO or launches a coroutine for that, to send the [packet].\n     *\n     * **Node**: It's not guaranteed whether this function sends the packet in-place or launches a coroutine for it.\n     * Caller should not rely on this characteristic.\n     */\n    protected abstract suspend fun sendPacketImpl(packet: OutgoingPacket)\n\n    /**\n     * Handles *unknown* [RawIncomingPacket]s. Packets with unrecognized [RawIncomingPacket.commandName] are considered *unknown*.\n     *\n     * Can be called by implementation\n     */\n    protected fun collectUnknownPacket(raw: RawIncomingPacket) {\n        packetLogger.debug { \"Unknown packet: commandName=${raw.commandName}, body=${raw.body.toUHexString()}\" }\n        // may add hooks here (to context)\n    }\n\n    override fun close(cause: Throwable?) {\n        if (coroutineContext.job.isActive) {\n            coroutineContext.job.cancel(\n                if (cause is CancellationException) {\n                    cause\n                } else {\n                    CancellationException(\"NetworkHandler closed\", cause)\n                }\n            )\n        }\n    }\n\n    protected val packetLogger: MiraiLogger by lazy {\n        context.logger.subLogger(\"NetworkDebug\").withSwitch(PacketCodec.PACKET_DEBUG)\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // packets synchronization impl\n    ///////////////////////////////////////////////////////////////////////////\n\n    private val packetHandler: PacketHandler by lazy { context[PacketHandler] }\n\n    /**\n     * Called when a packet is received.\n     */\n    internal open fun collectReceived(packet: IncomingPacket) {\n        for (listener in packetListeners) {\n            if (!listener.isExpected(packet)) continue\n            if (packetListeners.remove(listener)) {\n                packet.result.fold(\n                    onLeft = { listener.result.completeExceptionally(it) },\n                    onRight = { listener.result.complete(it) }\n                )\n            }\n        }\n        launch(start = CoroutineStart.UNDISPATCHED) {\n            try {\n                packetHandler.handlePacket(packet)\n            } catch (e: Throwable) { // do not pass it to CoroutineExceptionHandler for a more controllable behavior.\n                logger.error(e)\n            }\n        }\n    }\n\n    final override suspend fun <P : Packet?> sendAndExpect(packet: OutgoingPacket, timeout: Long, attempts: Int): P {\n        require(attempts >= 1) { \"attempts must be at least 1.\" }\n        val listener = PacketListener(packet.commandName, packet.sequenceId)\n        packetListeners.add(listener)\n        withExceptionCollector {\n            try {\n                repeat(attempts) {\n                    context[PacketLoggingStrategy].logSent(logger, packet)\n                    sendPacketImpl(packet)\n                    try {\n                        @Suppress(\"UNCHECKED_CAST\")\n                        return withTimeout(timeout) {\n                            listener.result.await()\n                        } as P\n                    } catch (e: TimeoutCancellationException) {\n                        collectException(e)\n                    }\n                }\n                throwLast()\n            } finally {\n                packetListeners.remove(listener)\n                if (listener.result.isActive) {\n                    listener.result.completeExceptionally(\n                        getLast() ?: IllegalStateException(\"Internal error: sendAndExpect failed without an exception.\")\n                    )\n                }\n            }\n        }\n    }\n\n    final override suspend fun <P : Packet?> sendAndExpect(\n        packet: OutgoingPacketWithRespType<P>,\n        timeout: Long,\n        attempts: Int\n    ): P = sendAndExpect(packet as OutgoingPacket, timeout, attempts)\n\n    final override suspend fun sendWithoutExpect(packet: OutgoingPacket) {\n        context[PacketLoggingStrategy].logSent(logger, packet)\n        sendPacketImpl(packet)\n    }\n\n    /**\n     * Listens for the resultant packet from server.\n     */\n    protected class PacketListener(\n        val commandName: String,\n        val sequenceId: Int,\n    ) {\n        /**\n         * Response from server. May complete with [CompletableDeferred.completeExceptionally] for a meaningful stacktrace.\n         */\n        val result = CompletableDeferred<Packet?>()\n\n        fun isExpected(packet: IncomingPacket): Boolean =\n            this.commandName == packet.commandName && this.sequenceId == packet.sequenceId\n    }\n\n    private val packetListeners = ConcurrentLinkedDeque<PacketListener>()\n\n    ///////////////////////////////////////////////////////////////////////////\n    // state impl\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * A **scoped** state corresponding to [NetworkHandler.State].\n     *\n     * CoroutineScope is cancelled when switched to another state.\n     *\n     * State can only be changed inside [setState].\n     *\n     * **IMPORTANT implementation notes:**\n     *\n     * You must create subclasses of [BaseStateImpl] for EVERY SINGLE [NetworkHandler.State].\n     * **DO NOT** use same type for more than one [NetworkHandler.State],\n     * otherwise [setState] will refuse updating state in some concurrent situations and will be very difficult to debug.\n     *\n     * **IMPORTANT notes to lifecycle:**\n     *\n     * Normally if the state is set to [NetworkHandler.State.CLOSED] by [setState], [selector][NetworkHandlerSelector] may reinitialize an instance.\n     *\n     * Any exception caught by the scope (supervisor job) is considered as _fatal failure_ that will set state to CLOSE and **propagate the exception to user of [selector][NetworkHandlerSelector]**.\n     *\n     *\n     * You must catch all the exceptions and change states by [setState] manually.\n     */\n    abstract inner class BaseStateImpl(\n        val correspondingState: NetworkHandler.State,\n    ) : CoroutineScope {\n        final override val coroutineContext: CoroutineContext =\n            this@NetworkHandlerSupport.coroutineContext + Job(this@NetworkHandlerSupport.coroutineContext.job)\n\n        // Important: read the above doc before implementing BaseStateImpl.\n\n        // Do not use init blocks to launch anything. Do use [startState]\n\n\n        /**\n         * Starts things that should be done in this state.\n         *\n         * Called after this instance is initialized, and it is at suitable time for initialization.\n         *\n         * Note: must be fast.\n         */\n        open fun startState() {\n\n        }\n\n        /**\n         * Called after this instance is set to [_state]. (Visible publicly)\n         */\n        open fun afterUpdated() {\n\n        }\n\n        open fun getCause(): Throwable? = null\n\n        /**\n         * May throw any exception that caused the state to fail.\n         */\n        @Throws(Exception::class)\n        suspend fun resumeConnection() {\n            val observer = context.getOrNull(StateObserver)\n            observer?.beforeStateResume(this@NetworkHandlerSupport, _state)\n            val result = kotlin.runCatching { resumeConnection0() }\n            observer?.afterStateResume(this@NetworkHandlerSupport, _state, result)\n            result.getOrThrow()\n        }\n\n        protected abstract suspend fun resumeConnection0()\n    }\n\n    /**\n     * State is *lazy*, initialized only if requested.\n     *\n     * You must not set this property directly, but use [setState].\n     */\n    @Suppress(\"PropertyName\")\n    protected var _state: BaseStateImpl by lateinitMutableProperty { initialState() }\n        private set\n\n    final override val state: NetworkHandler.State get() = _state.correspondingState\n\n    override fun getLastFailure(): Throwable? = _state.getCause()\n\n    private val _stateChannel = Channel<NetworkHandler.State>(0)\n    final override val stateChannel: ReceiveChannel<NetworkHandler.State> get() = _stateChannel\n\n    protected data class StateSwitchingException(\n        val old: BaseStateImpl,\n        val new: BaseStateImpl,\n        override val cause: Throwable? = new.getCause(), // so it can be unwrapped\n    ) : CancellationException(\"State is switched from $old to $new\")\n\n    /**\n     * Calculate [new state][new] and set it as the current, returning the new state,\n     * or `null` if state has concurrently been set to CLOSED, or has same [class][KClass] as current.\n     *\n     * You may need to call [BaseStateImpl.resumeConnection] to activate the new state, as states are lazy.\n     */\n    protected inline fun <reified S : BaseStateImpl> setState(noinline new: () -> S): S? =\n        _state.setState(new)\n\n    /**\n     * Attempts to change state if current state is [this].\n     *\n     * Returns null if new state has same [class][KClass] as current or when current state is already set to another state concurrently by another thread.\n     *\n     * This is designed to be used inside [BaseStateImpl].\n     */\n    protected inline fun <reified S : BaseStateImpl> BaseStateImpl.setState(\n        noinline new: () -> S,\n    ): S? = lock.withLock {\n        if (_state === this) {\n            @OptIn(TestOnly::class)\n            this@NetworkHandlerSupport.setStateImpl(S::class, new)\n        } else {\n            null\n        }\n    }\n\n    private val lock = reentrantLock()\n    internal val lockForSetStateWithOldInstance = SynchronizedObject()\n\n    @Volatile\n    private var changingState: KClass<out BaseStateImpl>? = null\n\n    /**\n     * This can only be called by [setState] or in tests. Note:\n     */\n    //\n    @TestOnly\n    internal fun <S : BaseStateImpl> setStateImpl(newType: KClass<S>, new: () -> S): S? =\n        lock.withLock {\n            val old = _state\n            if (old::class == newType) return@withLock null // already set to expected state by another thread. Avoid replications.\n            if (old.correspondingState == NetworkHandler.State.CLOSED) return@withLock null // CLOSED is final.\n\n            val changingState = changingState\n            if (changingState != null) {\n                if (changingState == newType) {\n                    // no duplicates\n                    return null\n                } else {\n                    error(\"New state ${newType.simpleName} clashes with current switching process, changingState = ${changingState.simpleName}.\")\n                }\n            }\n\n            this.changingState = newType\n\n            try {\n\n                val stateObserver = context.getOrNull(StateObserver)\n\n                val impl = try {\n                    new()\n                } catch (e: Throwable) {\n                    stateObserver?.exceptionOnCreatingNewState(this, old, e)\n                    throw e\n                }\n\n                try {\n                    check(old !== impl) { \"Old and new states cannot be the same.\" }\n\n                    stateObserver?.beforeStateChanged(this, old, impl)\n\n                    // We should startState before expose it publicly because State.resumeConnection may wait for some jobs that are launched in startState.\n                    // We cannot close old state before changing the 'public' _state to be the new one, otherwise every client will get some kind of exceptions (unspecified, maybe CancellationException).\n                    impl.startState() // launch jobs\n                } catch (e: Throwable) {\n                    throw e\n                }\n\n                // No further change\n\n                _state = impl // update current state\n                // After _state is updated, we are safe.\n\n                old.cancel(StateSwitchingException(old, impl)) // close old\n                impl.afterUpdated() // now do post-update things.\n\n                stateObserver?.stateChanged(this, old, impl) // notify observer\n                _stateChannel.trySend(impl.correspondingState) // notify selector\n\n                return@withLock impl\n            } finally {\n                this.changingState = null\n            }\n        }\n\n    final override suspend fun resumeConnection() {\n        _state.resumeConnection()\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/selector/AbstractKeepAliveNetworkHandlerSelector.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler.selector\n\nimport io.ktor.client.utils.*\nimport kotlinx.atomicfu.atomic\nimport kotlinx.atomicfu.locks.SynchronizedObject\nimport kotlinx.atomicfu.locks.synchronized\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.internal.network.components.SsoProcessor\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerFactory\nimport net.mamoe.mirai.internal.network.handler.logger\nimport net.mamoe.mirai.utils.*\nimport kotlin.jvm.Volatile\n\n/**\n * A lazy stateful implementation of [NetworkHandlerSelector].\n *\n * - Calls [factory.create][NetworkHandlerFactory.create] to create [NetworkHandler]s.\n * - Re-initialize [NetworkHandler] instances if the old one is dead.\n * - Suspends requests when connection is not available.\n *\n * No connection is created until first invocation of [getCurrentInstanceOrNull],\n * and new connections are created only when calling [getCurrentInstanceOrNull] if the old connection was dead.\n */\n// may be replaced with a better name.\ninternal abstract class AbstractKeepAliveNetworkHandlerSelector<H : NetworkHandler>(\n    private val maxAttempts: Int = DEFAULT_MAX_ATTEMPTS,\n    private val logger: MiraiLogger,\n) : NetworkHandlerSelector<H> {\n\n    init {\n        require(maxAttempts >= 1) { \"maxAttempts must >= 1\" }\n    }\n\n    private val current = atomic<H?>(null)\n\n    @net.mamoe.mirai.utils.TestOnly\n    internal fun setCurrent(h: H) {\n        current.value = h\n    }\n\n    protected abstract fun createInstance(): H\n\n    final override fun getCurrentInstanceOrNull(): H? = current.value\n\n    final override tailrec fun getCurrentInstanceOrCreate(): H {\n        getCurrentInstanceOrNull()?.let { return it }\n        refreshInstance()\n        return getCurrentInstanceOrCreate()\n    }\n\n    final override suspend fun awaitResumeInstance(): H = AwaitResumeInstance().run()\n\n    private inner class AwaitResumeInstance : SynchronizedObject() {\n        private inline fun logIfEnabled(block: () -> String) {\n            if (SELECTOR_LOGGING) {\n                logger.debug { \"Attempt #$attempted: ${block.invoke()}\" }\n            }\n        }\n\n        private var attempted: Int = 0\n        private var lastNetwork: H? = null\n\n        @Volatile\n        private var _exceptionCollector: ExceptionCollector? = null\n\n        // lazily initialize ExceptionCollector.\n        private val exceptionCollector: ExceptionCollector\n            get() {\n                _exceptionCollector?.let { return it }\n                return synchronized(this) {\n                    _exceptionCollector?.let { return it }\n                    object : ExceptionCollector() {\n                        override fun beforeCollect(throwable: Throwable) {\n                            lastNetwork?.logger?.warning(\"Exception in resumeConnection.\", throwable)\n                        }\n                    }.also {\n                        _exceptionCollector = it\n                    }\n                }\n            }\n\n        /**\n         * 尝试重置状态, 捕获并处理发生的可被挽救的异常, 重新抛出其他异常. 每次此函数运行时都会创建新的 [H].\n         * 抛出异常: 表示 [NetworkHandler.resumeConnection] 抛出了某个异常, 且这个问题不可挽救 (需要停止 selector).\n         *\n         * 只有 [NetworkException] 是期望的异常 (根据 [NetworkException.recoverable] 决定是否可挽救). 任何其他异常都是未期望的, 将会被原封不动地抛出.\n         */\n        @Throws(\n            NetworkException::class, MaxAttemptsReachedException::class, CancellationException::class, Throwable::class\n        )\n        suspend fun run(): H {\n            return try {\n                runImpl()\n            } finally {\n                exceptionCollector.dispose()\n                lastNetwork = null // help gc\n            }\n        }\n\n        private tailrec suspend fun runImpl(): H {\n            if (attempted >= maxAttempts) {\n                logIfEnabled { \"Max attempt $maxAttempts reached.\" }\n                throw MaxAttemptsReachedException(exceptionCollector.getLast())\n            }\n            if (!currentCoroutineContext().isActive) {\n                yield() // check cancellation\n            }\n            val current = getCurrentInstanceOrNull()\n            lastNetwork = current\n\n            if (current != null) {\n                if (current.context[SsoProcessor].firstLoginResult?.canRecoverOnFirstLogin == false) {\n                    // == null 只表示\n                    // == false 表示第一次登录失败, 且此失败没必要重试\n                    logIfEnabled { \"[FIRST LOGIN ERROR] current = $current\" }\n                    logIfEnabled { \"[FIRST LOGIN ERROR] current.state = ${current.state}\" }\n                    throw current.getLastFailure() ?: exceptionCollector.getLast()\n                    ?: error(\"Failed to login with unknown reason.\")\n                }\n            }\n\n            /**\n             * 执行 [NetworkHandler.resumeConnection].\n             *\n             * 本函数有三个终止状态:\n             * - 返回 `true`: 表示 [NetworkHandler.resumeConnection] 正常返回.\n             * - 返回 `false`: 表示 [NetworkHandler.resumeConnection] 抛出了某个异常, 但这个问题可以挽救 (需要重置状态).\n             * - 抛出异常: 表示 [NetworkHandler.resumeConnection] 抛出了某个异常, 且这个问题不可挽救 (需要停止 selector).\n             *\n             * 只有 [NetworkException] 是期望的异常 (根据 [NetworkException.recoverable] 决定是否可挽救). 任何其他异常都是未期望的, 将会被原封不动地抛出.\n             */\n            @Throws(NetworkException::class, CancellationException::class, Throwable::class)\n            suspend fun H.resumeInstanceCatchingException(): Boolean {\n                logIfEnabled { \"Try resumeConnection\" }\n                try {\n                    resumeConnection()\n                    return true // 一切正常\n                } catch (e: NetworkException) {\n                    logIfEnabled { \"... failed with NetworkException (recoverable=${e.recoverable}): $e\" }\n                    exceptionCollector.collect(e)\n                    close(e) // close H\n\n                    logIfEnabled { \"CLOSED instance\" }\n                    if (e.recoverable) {\n                        // 可挽救\n                        return false\n                    } else {\n                        // 不可挽救\n                        exceptionCollector.throwLast()\n                    }\n                } catch (e: TimeoutCancellationException) {\n                    logIfEnabled { \"... failed with TimeoutCancellationException: $e\" }\n                    exceptionCollector.collect(e)\n                    close(e) // close H\n                    logIfEnabled { \"CLOSED instance\" }\n                    // 发包超时 可挽救\n                    return false\n                } catch (e: Throwable) {\n                    // 不可挽救\n                    logIfEnabled { \"... failed with unexpected: $e\" }\n                    exceptionCollector.collect(e)\n                    close(e) // close H\n                    logIfEnabled { \"CLOSED instance\" }\n                    exceptionCollector.throwLast()\n                }\n            }\n\n            logIfEnabled { \"current.state = ${current?.state}\" }\n            return if (current != null) {\n                when (current.state) {\n                    NetworkHandler.State.CLOSED -> {\n                        current.resumeInstanceCatchingException()\n                        // This may return false, meaning the error causing the state to be CLOSED is recoverable.\n                        // Otherwise, it throws, meaning it is unrecoverable.\n\n                        if (compareAndSetCurrent(current, null)) {\n                            logIfEnabled { \"... Set current to null.\" }\n                            // invalidate the instance and try again.\n\n                            // NetworkHandler is CancellationException if closed by `NetworkHandler.close`\n                            // `unwrapCancellationException` will give a rather long and complicated trace showing all internal traces.\n                            // The traces may help locate exactly where the `NetworkHandler.close` is called,\n                            // but this is not usually desired.\n                            val lastFailure =\n                                current.getLastFailure()?.unwrapCancellationException(NetworkHandler.CANCELLATION_TRACE)\n\n                            logIfEnabled { \"...    Last failure was $lastFailure.\" }\n                            exceptionCollector.collectException(lastFailure)\n                        }\n                        if (attempted > 1) {\n                            logIfEnabled { \"... Delaying ${RECONNECT_DELAY.millisToHumanReadableString()}.\" }\n                            delay(RECONNECT_DELAY) // make it slower to avoid massive reconnection on network failure.\n                        }\n                        attempted += 1\n                        runImpl() // will create new instance (see the `else` branch).\n                    }\n                    NetworkHandler.State.INITIALIZED -> {\n                        if (!current.resumeInstanceCatchingException()) {\n                            attempted += 1\n                            return runImpl()\n                        }\n                        logIfEnabled { \"RETURN\" }\n                        return current\n                    }\n                    NetworkHandler.State.CONNECTING -> {\n                        logIfEnabled { \"RETURN\" }\n                        // can send packet\n                        return current\n                    }\n                    NetworkHandler.State.LOADING -> {\n                        logIfEnabled { \"RETURN\" }\n                        return current\n                    }\n                    NetworkHandler.State.OK -> {\n                        if (current.resumeInstanceCatchingException()) {\n                            logIfEnabled { \"RETURN\" }\n                            return current\n                        } else {\n                            attempted += 1\n                            return runImpl()\n                        }\n                    }\n                }\n            } else {\n                logIfEnabled { \"Creating new instance.\" }\n                refreshInstance()\n                logIfEnabled { \"... Created.\" }\n                runImpl() // directly retry, does not count for attempts.\n            }\n        }\n    }\n\n    private fun compareAndSetCurrent(expect: H?, update: H?) =\n        current.compareAndSet(expect, update) // to enable compiler optimization\n\n    private val lock = SynchronizedObject()\n    protected open fun refreshInstance() {\n        synchronized(lock) { // avoid concurrent `createInstance()`\n            if (getCurrentInstanceOrNull() == null) this.current.compareAndSet(null, createInstance())\n        }\n    }\n\n\n    companion object {\n        var DEFAULT_MAX_ATTEMPTS by atomic(\n            systemProp(\n                \"mirai.network.handler.selector.max.attempts\", Long.MAX_VALUE\n            ).coerceIn(1..Int.MAX_VALUE.toLongUnsigned()).toInt()\n        )\n\n        /**\n         * millis\n         */\n        var RECONNECT_DELAY by atomic(systemProp(\"mirai.network.reconnect.delay\", 3000L).coerceIn(0..Long.MAX_VALUE))\n\n        var SELECTOR_LOGGING by atomic(systemProp(\"mirai.network.handler.selector.logging\", false))\n    }\n}\n\n@Suppress(\"FunctionName\")\ninternal fun <H : NetworkHandler> KeepAliveNetworkHandlerSelector(\n    maxAttempts: Int,\n    logger: MiraiLogger,\n    createInstance: () -> H,\n): AbstractKeepAliveNetworkHandlerSelector<H> {\n    return object : AbstractKeepAliveNetworkHandlerSelector<H>(maxAttempts, logger) {\n        override fun createInstance(): H = createInstance()\n    }\n}\n\n@Suppress(\"FunctionName\")\ninternal inline fun <H : NetworkHandler> KeepAliveNetworkHandlerSelector(\n    logger: MiraiLogger,\n    crossinline createInstance: () -> H,\n): AbstractKeepAliveNetworkHandlerSelector<H> {\n    return object : AbstractKeepAliveNetworkHandlerSelector<H>(logger = logger) {\n        override fun createInstance(): H = createInstance()\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/selector/ExceptionInSelectorResumeException.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler.selector\n\ninternal class ExceptionInSelectorResumeException(\n    cause: Throwable,\n) : RuntimeException(cause)"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/selector/MaxAttemptsReachedException.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler.selector\n\ninternal data class MaxAttemptsReachedException(\n    override val cause: Throwable?,\n) : IllegalStateException(\"Failed to resume instance. Maximum attempts reached.\") {\n    override fun toString(): String {\n        return \"MaxAttemptsReachedException\"\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/selector/NetworkChannelException.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler.selector\n\ninternal open class NetworkChannelException : NetworkException {\n    constructor() : super(true)\n    constructor(cause: Throwable?) : super(true, cause)\n    constructor(message: String) : super(message, true)\n    constructor(message: String, cause: Throwable?) : super(message, cause, true)\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/selector/NetworkException.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler.selector\n\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport\nimport net.mamoe.mirai.utils.unwrap\n\n/**\n * 已知的网络异常.\n *\n * 在 [NetworkHandlerSupport.BaseStateImpl] 中抛出此异常,\n * 或用此异常 [close NetworkHandler][NetworkHandler.close], 可建议 [Selector][SelectorNetworkHandler] 是否执行重连.\n */\ninternal open class NetworkException : Exception {\n    /**\n     * If true, the selector may recover the network handler by some means.\n     */\n    val recoverable: Boolean\n\n    constructor(recoverable: Boolean) : super() {\n        this.recoverable = recoverable\n    }\n\n    constructor(recoverable: Boolean, cause: Throwable?) : super(cause) {\n        this.recoverable = recoverable\n    }\n\n    constructor(message: String, recoverable: Boolean) : super(message) {\n        this.recoverable = recoverable\n    }\n\n    constructor(message: String, cause: Throwable?, recoverable: Boolean) : super(message, cause) {\n        this.recoverable = recoverable\n    }\n\n    /**\n     * Returns the exception to be thrown for public API.\n     */\n    open fun unwrapForPublicApi(): Throwable {\n        return this.unwrap<NetworkException>()\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/selector/NetworkHandlerSelector.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler.selector\n\nimport kotlinx.coroutines.CancellationException\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerFactory\n\n/**\n * A **lazy** director([selector][SelectorNetworkHandler.selector]) of [NetworkHandler].\n *\n * *lazy* means that no action is taken at any time until member functions are invoked.\n *\n * It can produce [H] instances (maybe by calling [NetworkHandlerFactory]), to be used by [SelectorNetworkHandler]\n *\n * @see SelectorNetworkHandler\n */\ninternal interface NetworkHandlerSelector<out H : NetworkHandler> {\n    /**\n     * Returns an instance immediately without suspension, or `null` if instance not ready. Returned [H] can be in any states.\n     *\n     * This function should not throw any exception.\n     * @see awaitResumeInstance\n     */\n    fun getCurrentInstanceOrNull(): H?\n\n    /**\n     * Returns the current [NetworkHandler] or creates a new one if it is `null`. Returned [H] can be in any states.\n     */\n    fun getCurrentInstanceOrCreate(): H\n\n    /**\n     * Returns an alive [NetworkHandler], or suspends the coroutine until the connection has been made again.\n     * Returned [H] can be in [NetworkHandler.State.LOADING] and [NetworkHandler.State.OK] only (but it may happen that the state changed just after returning from this function).\n     *\n     * @throws NetworkException [NetworkHandler.resumeConnection] 抛出了 [NetworkException] 并且 [NetworkException.recoverable] 为 `false`.\n     * @throws Throwable [NetworkHandler.resumeConnection] 抛出了其他异常. 任何其他异常都属于内部错误并会原样抛出.\n     * @throws MaxAttemptsReachedException 重试次数达到上限 (由 selector 构造)\n     * @throws CancellationException 协程被取消\n     */\n    @Throws(NetworkException::class, MaxAttemptsReachedException::class, CancellationException::class, Throwable::class)\n    suspend fun awaitResumeInstance(): H\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/selector/NoServerAvailableException.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler.selector\n\ninternal class NoServerAvailableException :\n    NoSuchElementException(\"No server available. (Failed to connect to any of the servers)\")"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/selector/PacketTimeoutException.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler.selector\n\ninternal data class PacketTimeoutException(\n    override val message: String,\n    override val cause: Throwable? = null,\n) : NetworkException(true)"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/selector/SelectorNetworkHandler.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler.selector\n\nimport kotlinx.atomicfu.locks.SynchronizedObject\nimport kotlinx.atomicfu.locks.synchronized\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.channels.ReceiveChannel\nimport kotlinx.coroutines.isActive\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.State\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerContext\nimport net.mamoe.mirai.internal.network.handler.logger\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketWithRespType\nimport net.mamoe.mirai.utils.addNameHierarchically\nimport net.mamoe.mirai.utils.childScope\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.cancellation.CancellationException\nimport kotlin.jvm.Volatile\n\n/**\n * A proxy to [NetworkHandler] that delegates calls to instance returned by [NetworkHandlerSelector.awaitResumeInstance].\n * Selection logic is implemented in [NetworkHandlerSelector].\n *\n * This is useful to implement a delegation of [NetworkHandler]. The functionality of *selection* is provided by the strategy [selector][NetworkHandlerSelector].\n *\n * ### Important notes\n *\n * [NetworkHandlerSelector.awaitResumeInstance] is called everytime when an operation in [NetworkHandler] is called.\n *\n * Before every [sendAndExpect] call, [resumeConnection] is invoked.\n *\n * @see NetworkHandlerSelector\n */\ninternal open class SelectorNetworkHandler<out H : NetworkHandler>(\n    val selector: NetworkHandlerSelector<H>,\n) : NetworkHandler {\n    @Volatile\n    private var lastCancellationCause: Throwable? = null\n\n    override val context: NetworkHandlerContext get() = selector.getCurrentInstanceOrCreate().context\n\n    protected val scope: CoroutineScope by lazy {\n        context.bot.coroutineContext\n            .addNameHierarchically(\"SelectorNetworkHandler\")\n            .childScope()\n    }\n    private val lock = SynchronizedObject()\n\n    /**\n     * 挂起协程直到获取一个可用的 [instance]. 此函数有副作用: 获取 [instance] 应当是必须成功的, 不成功(在本函数重新抛出捕获的异常之前)则会关闭 bot.\n     *\n     * \"不成功\"包括多次重连后仍然不成功, bot 被 ban, 内部错误等已经被适当重试过了的情况.\n     *\n     * @see NetworkHandlerSelector.awaitResumeInstance\n     */\n    @Throws(Exception::class)\n    protected suspend inline fun instance(): H {\n        if (!scope.isActive) {\n            throw lastCancellationCause?.let(::CancellationException)\n                ?: CancellationException(\"SelectorNetworkHandler is already closed\")\n        }\n\n        return try {\n            selector.awaitResumeInstance()\n        } catch (e: Throwable) {\n            // selector 抛出了无法处理的, 不可挽救的异常. close bot.\n            logger.warning(\"Network selector received exception, closing bot. (${e})\")\n            context.bot.close(e)\n            throw e\n        }\n    }\n\n    override val state: State\n        get() = selector.getCurrentInstanceOrCreate().state\n\n    override fun getLastFailure(): Throwable? = selector.getCurrentInstanceOrCreate().getLastFailure()\n\n    override val stateChannel: ReceiveChannel<State>\n        get() = selector.getCurrentInstanceOrCreate().stateChannel\n\n    override suspend fun resumeConnection() {\n        instance() // the selector will resume connection for us.\n    }\n\n    override suspend fun <P : Packet?> sendAndExpect(packet: OutgoingPacket, timeout: Long, attempts: Int): P =\n        instance().sendAndExpect(packet, timeout, attempts)\n\n    override suspend fun <P : Packet?> sendAndExpect(\n        packet: OutgoingPacketWithRespType<P>,\n        timeout: Long,\n        attempts: Int\n    ): P = instance().sendAndExpect(packet, timeout, attempts)\n\n    override suspend fun sendWithoutExpect(packet: OutgoingPacket) = instance().sendWithoutExpect(packet)\n    override fun close(cause: Throwable?) {\n        if (cause is NetworkException && cause.recoverable) {\n            selector.getCurrentInstanceOrNull()?.close(cause)\n            return\n        }\n        synchronized(lock) {\n            if (scope.isActive) {\n                lastCancellationCause = cause\n                scope.cancel()\n            } else {\n                return\n            }\n        }\n        selector.getCurrentInstanceOrNull()?.close(cause)\n    }\n\n    override val coroutineContext: CoroutineContext\n        get() = selector.getCurrentInstanceOrNull()?.coroutineContext ?: scope.coroutineContext // merely use fallback\n\n    override fun toString(): String = \"SelectorNetworkHandler(currentInstance=${selector.getCurrentInstanceOrNull()})\"\n}\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/selector/SelectorRequireReconnectException.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler.selector\n\n/**\n * A special exception that instructs selector to restart network connection\n */\ninternal expect class SelectorRequireReconnectException() : NetworkException\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/state/CombinedStateObserver.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler.state\n\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport\n\ninternal class CombinedStateObserver(\n    private val list: List<StateObserver>,\n) : StateObserver {\n    override fun beforeStateChanged(\n        networkHandler: NetworkHandlerSupport,\n        previous: NetworkHandlerSupport.BaseStateImpl,\n        new: NetworkHandlerSupport.BaseStateImpl,\n    ) {\n        list.forEach { it.beforeStateChanged(networkHandler, previous, new) }\n    }\n\n    override fun stateChanged(\n        networkHandler: NetworkHandlerSupport,\n        previous: NetworkHandlerSupport.BaseStateImpl,\n        new: NetworkHandlerSupport.BaseStateImpl,\n    ) {\n        list.forEach { it.stateChanged(networkHandler, previous, new) }\n    }\n\n    override fun exceptionOnCreatingNewState(\n        networkHandler: NetworkHandlerSupport,\n        previousState: NetworkHandlerSupport.BaseStateImpl,\n        exception: Throwable,\n    ) {\n        list.forEach { it.exceptionOnCreatingNewState(networkHandler, previousState, exception) }\n    }\n\n    override suspend fun beforeStateResume(networkHandler: NetworkHandler, state: NetworkHandlerSupport.BaseStateImpl) {\n        list.forEach { it.beforeStateResume(networkHandler, state) }\n    }\n\n    override suspend fun afterStateResume(\n        networkHandler: NetworkHandler,\n        state: NetworkHandlerSupport.BaseStateImpl,\n        result: Result<Unit>,\n    ) {\n        list.forEach { it.afterStateResume(networkHandler, state, result) }\n    }\n\n    override fun toString(): String {\n        return list.joinToString(\n            prefix = \"CombinedStateObserver[\",\n            postfix = \"]\",\n            separator = \" -> \"\n        ) { it.toString() }\n    }\n\n    companion object {\n        operator fun StateObserver?.plus(last: StateObserver?): StateObserver {\n            return when {\n                last == null -> this ?: StateObserver.NOP\n                this == null -> last\n                else -> {\n                    val result = mutableListOf<StateObserver>()\n                    if (this is CombinedStateObserver) result.addAll(this.list) else result.add(this)\n                    if (last is CombinedStateObserver) result.addAll(last.list) else result.add(last)\n                    CombinedStateObserver(result)\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/state/ExceptionInStateObserverException.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler.state\n\ninternal class ExceptionInStateObserverException(\n    override val cause: Throwable,\n) : RuntimeException()"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/state/JobAttachStateObserver.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler.state\n\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.CoroutineStart\nimport kotlinx.coroutines.launch\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport\nimport net.mamoe.mirai.utils.unwrapCancellationException\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\n\n/**\n * The [StateObserver] that attaches a job to the [CoroutineScope] of the state.\n */\ninternal class JobAttachStateObserver(\n    private val name: String,\n    targetState: NetworkHandler.State,\n    private val coroutineContext: CoroutineContext = EmptyCoroutineContext,\n    private val job: suspend CoroutineScope.(state: NetworkHandlerSupport.BaseStateImpl) -> Unit,\n) : StateChangedObserver(targetState) {\n    override fun stateChanged0(\n        networkHandler: NetworkHandlerSupport,\n        previous: NetworkHandlerSupport.BaseStateImpl,\n        new: NetworkHandlerSupport.BaseStateImpl,\n    ) {\n        new.launch(CoroutineName(name) + coroutineContext, start = CoroutineStart.UNDISPATCHED) {\n            try {\n                job(new)\n            } catch (e: Throwable) {\n                throw IllegalStateException(\"Exception in attached Job '$name'\", e.unwrapCancellationException())\n            }\n        }\n    }\n\n    override fun toString(): String {\n        return \"JobAttachStateObserver(name=$name)\"\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/state/LoggingStateObserver.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler.state\n\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport\nimport net.mamoe.mirai.utils.*\nimport kotlin.coroutines.coroutineContext\n\ninternal class LoggingStateObserver(\n    val logger: MiraiLogger,\n    private val showStacktrace: Boolean = false,\n) : StateObserver {\n    override fun toString(): String = \"LoggingStateObserver(logger=${logger.identity})\"\n\n    override fun beforeStateChanged(\n        networkHandler: NetworkHandlerSupport,\n        previous: NetworkHandlerSupport.BaseStateImpl,\n        new: NetworkHandlerSupport.BaseStateImpl,\n    ) {\n        logger.debug(\n            { \"Before change: ${previous.correspondingState} -> ${new.correspondingState}\" },\n            if (showStacktrace) Exception(\"Show stacktrace\") else null\n        )\n    }\n\n    override fun stateChanged(\n        networkHandler: NetworkHandlerSupport,\n        previous: NetworkHandlerSupport.BaseStateImpl,\n        new: NetworkHandlerSupport.BaseStateImpl,\n    ) {\n        logger.debug(\n            { \"State changed: ${previous.correspondingState} -> ${new.correspondingState}\" },\n            if (showStacktrace) Exception(\"Show stacktrace\") else null\n        )\n    }\n\n    override fun exceptionOnCreatingNewState(\n        networkHandler: NetworkHandlerSupport,\n        previousState: NetworkHandlerSupport.BaseStateImpl,\n        exception: Throwable,\n    ) {\n        logger.debug { \"State exception: ${previousState.correspondingState} -> $exception\" }\n    }\n\n    override suspend fun beforeStateResume(networkHandler: NetworkHandler, state: NetworkHandlerSupport.BaseStateImpl) {\n        logger.debug { \"State resuming: [${coroutineContext.coroutineName}] ${state.correspondingState}\" }\n    }\n\n    override suspend fun afterStateResume(\n        networkHandler: NetworkHandler,\n        state: NetworkHandlerSupport.BaseStateImpl,\n        result: Result<Unit>,\n    ) {\n        result.fold(\n            onSuccess = {\n                logger.debug { \"State resumed: [${coroutineContext.coroutineName}] ${state.correspondingState}.\" }\n            },\n            onFailure = {\n                logger.debug {\n                    \"State resumed: [${coroutineContext.coroutineName}] ${state.correspondingState} \" +\n                            \"${result.exceptionOrNull()?.unwrapCancellationException(false)}\"\n                }\n            }\n        )\n    }\n\n    companion object {\n        /**\n         * - `on`/`true` for simple logging\n         * - `full` for logging with stacktrace\n         */\n        var ENABLED = systemProp(\n            \"mirai.network.state.observer.logging\",\n            \"off\"\n        ).lowercase()\n\n        fun createLoggingIfEnabled(): StateObserver? {\n            return when (ENABLED) {\n                \"full\" -> {\n                    SafeStateObserver(\n                        LoggingStateObserver(MiraiLogger.Factory.create(LoggingStateObserver::class, \"States\"), true),\n                        MiraiLogger.Factory.create(LoggingStateObserver::class, \"LoggingStateObserver errors\")\n                    )\n                }\n                \"on\", \"true\" -> {\n                    SafeStateObserver(\n                        LoggingStateObserver(MiraiLogger.Factory.create(LoggingStateObserver::class, \"States\"), false),\n                        MiraiLogger.Factory.create(LoggingStateObserver::class, \"LoggingStateObserver errors\")\n                    )\n                }\n                else -> null\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/state/SafeStateObserver.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler.state\n\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.error\n\ninternal fun StateObserver.safe(logger: MiraiLogger): StateObserver {\n    if (this is SafeStateObserver) return this\n    return SafeStateObserver(this, logger)\n}\n\n/**\n * Catches exception then log by [logger]\n */\ninternal class SafeStateObserver(\n    val delegate: StateObserver,\n    val logger: MiraiLogger,\n) : StateObserver {\n\n    override fun toString(): String {\n        return \"SafeStateObserver(delegate=$delegate)\"\n    }\n\n    override fun beforeStateChanged(\n        networkHandler: NetworkHandlerSupport,\n        previous: NetworkHandlerSupport.BaseStateImpl,\n        new: NetworkHandlerSupport.BaseStateImpl\n    ) {\n        try {\n            delegate.beforeStateChanged(networkHandler, previous, new)\n        } catch (e: Throwable) {\n            logger.error(\n                { \"Internal error: exception in StateObserver $delegate\" },\n                ExceptionInStateObserverException(e)\n            )\n        }\n    }\n\n    override fun stateChanged(\n        networkHandler: NetworkHandlerSupport,\n        previous: NetworkHandlerSupport.BaseStateImpl,\n        new: NetworkHandlerSupport.BaseStateImpl,\n    ) {\n        try {\n            delegate.stateChanged(networkHandler, previous, new)\n        } catch (e: Throwable) {\n            logger.error(\n                { \"Internal error: exception in StateObserver $delegate\" },\n                ExceptionInStateObserverException(e)\n            )\n        }\n    }\n\n    override fun exceptionOnCreatingNewState(\n        networkHandler: NetworkHandlerSupport,\n        previousState: NetworkHandlerSupport.BaseStateImpl,\n        exception: Throwable,\n    ) {\n        try {\n            delegate.exceptionOnCreatingNewState(networkHandler, previousState, exception)\n        } catch (e: Throwable) {\n            logger.error(\n                { \"Internal error: exception in StateObserver $delegate\" },\n                ExceptionInStateObserverException(e)\n            )\n        }\n    }\n\n    override suspend fun beforeStateResume(networkHandler: NetworkHandler, state: NetworkHandlerSupport.BaseStateImpl) {\n        try {\n            delegate.beforeStateResume(networkHandler, state)\n        } catch (e: Throwable) {\n            logger.error(\n                { \"Internal error: exception in StateObserver $delegate\" },\n                ExceptionInStateObserverException(e)\n            )\n        }\n    }\n\n    override suspend fun afterStateResume(\n        networkHandler: NetworkHandler,\n        state: NetworkHandlerSupport.BaseStateImpl,\n        result: Result<Unit>,\n    ) {\n        try {\n            delegate.afterStateResume(networkHandler, state, result)\n        } catch (e: Throwable) {\n            logger.error(\n                { \"Internal error: exception in StateObserver $delegate\" },\n                ExceptionInStateObserverException(e)\n            )\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/state/StateChangedObserver.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler.state\n\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.State\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport\n\n@Suppress(\"FunctionName\")\ninternal fun StateChangedObserver(\n    name: String,\n    to: State,\n    action: (new: NetworkHandlerSupport.BaseStateImpl) -> Unit,\n): StateObserver {\n    return object : StateChangedObserver(to) {\n        override fun stateChanged0(\n            networkHandler: NetworkHandlerSupport,\n            previous: NetworkHandlerSupport.BaseStateImpl,\n            new: NetworkHandlerSupport.BaseStateImpl,\n        ) {\n            action(new)\n        }\n\n        override fun toString(): String = \"StateChangedObserver($name)\"\n    }\n}\n\n@Suppress(\"FunctionName\")\ninternal fun StateChangedObserver(\n    name: String,\n    from: State,\n    to: State,\n    action: (new: NetworkHandlerSupport.BaseStateImpl) -> Unit,\n): StateObserver {\n    return object : StateObserver {\n        override fun stateChanged(\n            networkHandler: NetworkHandlerSupport,\n            previous: NetworkHandlerSupport.BaseStateImpl,\n            new: NetworkHandlerSupport.BaseStateImpl,\n        ) {\n            if (previous.correspondingState == from && new.correspondingState == to) {\n                action(new)\n            }\n        }\n\n        override fun toString(): String = \"StateObserver($name)\"\n    }\n}\n\n@Suppress(\"FunctionName\")\ninternal fun BeforeStateChangedObserver(\n    name: String,\n    from: State,\n    to: State,\n    action: (new: NetworkHandlerSupport.BaseStateImpl) -> Unit,\n): StateObserver {\n    return object : StateObserver {\n        override fun beforeStateChanged(\n            networkHandler: NetworkHandlerSupport,\n            previous: NetworkHandlerSupport.BaseStateImpl,\n            new: NetworkHandlerSupport.BaseStateImpl,\n        ) {\n            if (previous.correspondingState == from && new.correspondingState == to) {\n                action(new)\n            }\n        }\n\n        override fun toString(): String = \"BeforeStateChangedObserver($name)\"\n    }\n}\n\ninternal abstract class StateChangedObserver(\n    val state: State,\n) : StateObserver {\n    protected abstract fun stateChanged0(\n        networkHandler: NetworkHandlerSupport,\n        previous: NetworkHandlerSupport.BaseStateImpl,\n        new: NetworkHandlerSupport.BaseStateImpl,\n    )\n\n    override fun stateChanged(\n        networkHandler: NetworkHandlerSupport,\n        previous: NetworkHandlerSupport.BaseStateImpl,\n        new: NetworkHandlerSupport.BaseStateImpl,\n    ) {\n        if (previous.correspondingState != state && new.correspondingState == state) {\n            stateChanged0(networkHandler, previous, new)\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/handler/state/StateObserver.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler.state\n\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport\n\n/**\n * Observer of state changes.\n *\n * @see SafeStateObserver\n * @see LoggingStateObserver\n */\ninternal interface StateObserver {\n\n    /**\n     * Called when _state is being changed_, where [NetworkHandlerSupport._state] is still [previous], and new state is not yet started.\n     */\n    fun beforeStateChanged(\n        networkHandler: NetworkHandlerSupport,\n        previous: NetworkHandlerSupport.BaseStateImpl,\n        new: NetworkHandlerSupport.BaseStateImpl,\n    ) {\n\n    }\n\n    /**\n     * Called when _state is fished changing_, where [NetworkHandlerSupport._state] had become [new].\n     */\n    fun stateChanged(\n        networkHandler: NetworkHandlerSupport,\n        previous: NetworkHandlerSupport.BaseStateImpl,\n        new: NetworkHandlerSupport.BaseStateImpl,\n    ) {\n    }\n\n    fun exceptionOnCreatingNewState(\n        networkHandler: NetworkHandlerSupport,\n        previousState: NetworkHandlerSupport.BaseStateImpl,\n        exception: Throwable,\n    ) {\n    }\n\n    suspend fun beforeStateResume(\n        networkHandler: NetworkHandler,\n        state: NetworkHandlerSupport.BaseStateImpl,\n    ) {\n\n    }\n\n    suspend fun afterStateResume(\n        networkHandler: NetworkHandler,\n        state: NetworkHandlerSupport.BaseStateImpl,\n        result: Result<Unit>,\n    ) {\n\n    }\n\n    companion object : ComponentKey<StateObserver> {\n        internal val NOP = object : StateObserver {\n            override fun toString(): String {\n                return \"StateObserver.NOP\"\n            }\n        }\n\n        fun chainOfNotNull(\n            vararg observers: StateObserver?,\n        ): StateObserver = CombinedStateObserver(observers.filterNotNull())\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/highway/ChunkedFlowSession.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.highway\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.atomicfu.atomic\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.flow\nimport net.mamoe.mirai.utils.Closeable\nimport net.mamoe.mirai.utils.runBIO\nimport net.mamoe.mirai.utils.toLongUnsigned\nimport net.mamoe.mirai.utils.withUse\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\n\ninternal class ChunkedFlowSession<T>(\n    private val input: Input,\n    private val buffer: ByteArray,\n    private val callback: Highway.ProgressionCallback? = null,\n    private val mapper: (buffer: ByteArray, size: Int, offset: Long) -> T,\n) : Closeable {\n    override fun close() {\n        input.close()\n    }\n\n    private val offset = atomic(0L)\n\n    internal suspend inline fun useAll(crossinline block: suspend (T) -> Unit) {\n        contract { callsInPlace(block, InvocationKind.UNKNOWN) }\n        withUse {\n            while (true) {\n                val size = runBIO { input.readAvailable(buffer) }\n                if (size <= 0) return\n                block(mapper(buffer, size, offset.getAndAdd(size.toLongUnsigned())))\n                callback?.onProgression(offset.value)\n            }\n        }\n    }\n\n    internal fun asFlow(): Flow<T> = flow { useAll { emit(it) } } // 'single thread' producer\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/highway/Highway.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.highway\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.channels.ReceiveChannel\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.produceIn\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.asQQAndroidBot\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.components.BdhSession\nimport net.mamoe.mirai.internal.network.components.BdhSessionSyncer\nimport net.mamoe.mirai.internal.network.handler.logger\nimport net.mamoe.mirai.internal.network.protocol.data.proto.CSDataHighwayHead\nimport net.mamoe.mirai.internal.network.subAppId\nimport net.mamoe.mirai.internal.utils.PlatformSocket\nimport net.mamoe.mirai.internal.utils.crypto.TEA\nimport net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.internal.utils.retryWithServers\nimport net.mamoe.mirai.internal.utils.sizeToString\nimport net.mamoe.mirai.utils.*\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.jvm.Volatile\nimport kotlin.math.roundToInt\n\ninternal object Highway {\n\n\n    @Suppress(\"ArrayInDataClass\")\n    data class BdhUploadResponse(\n        var extendInfo: ByteArray? = null,\n    )\n\n    fun interface ProgressionCallback {\n        fun onProgression(size: Long)\n    }\n\n    suspend fun uploadResourceBdh(\n        bot: QQAndroidBot,\n        resource: ExternalResource,\n        kind: ResourceKind,\n        commandId: Int,  // group image=2, friend image=1, groupPtt=29\n        extendInfo: ByteArray? = null,\n        encrypt: Boolean = false,\n        initialTicket: ByteArray? = null, // null then use sig session\n        tryOnce: Boolean = false,\n        noBdhAwait: Boolean = false,\n        fallbackSession: (Throwable) -> BdhSession = { throw IllegalStateException(\"Failed to get bdh session\", it) },\n        resultChecker: (CSDataHighwayHead.RspDataHighwayHead) -> Boolean = { it.errorCode == 0 },\n        createConnection: suspend (ip: String, port: Int) -> HighwayProtocolChannel = { ip, port ->\n            PlatformSocket.connect(ip, port)\n        },\n        callback: ProgressionCallback? = null,\n        dataFlag: Int = 4096,\n        localeId: Int = 2052,\n    ): BdhUploadResponse {\n        val bdhSession = kotlin.runCatching {\n            val deferred = bot.asQQAndroidBot().components[BdhSessionSyncer].bdhSession\n            // no need to care about timeout. proceed by bot init\n            @OptIn(ExperimentalCoroutinesApi::class)\n            if (noBdhAwait) deferred.getCompleted() else deferred.await()\n        }.getOrElse(fallbackSession)\n\n        return tryServersUpload(\n            bot = bot,\n            servers = if (tryOnce) listOf(bdhSession.ssoAddresses.random()) else bdhSession.ssoAddresses,\n            resourceSize = resource.size,\n            resourceKind = kind,\n            channelKind = ChannelKind.HIGHWAY\n        ) { ip, port ->\n            val md5 = resource.md5\n            require(md5.size == 16) { \"bad md5. Required size=16, got ${md5.size}\" }\n\n            val resp = BdhUploadResponse()\n            highwayPacketSession(\n                client = bot.client,\n                appId = bot.client.subAppId.toInt(),\n                command = \"PicUp.DataUp\",\n                commandId = commandId,\n                initialTicket = initialTicket ?: bdhSession.sigSession,\n                data = resource,\n                dataFlag = dataFlag,\n                localeId = localeId,\n                fileMd5 = md5,\n                extendInfo = extendInfo?.let {\n                    if (encrypt) TEA.encrypt(extendInfo, bdhSession.sessionKey) else extendInfo\n                },\n                callback = callback\n            ).sendConcurrently(\n                createConnection = { createConnection(ip, port) },\n                coroutines = bot.configuration.highwayUploadCoroutineCount,\n                resultChecker = resultChecker,\n            ) { head ->\n                if (head.rspExtendinfo.isNotEmpty()) {\n                    resp.extendInfo = head.rspExtendinfo\n                }\n            }\n            resp\n        }\n    }\n}\n\ninternal enum class ResourceKind(\n    private val display: String,\n) {\n    PRIVATE_IMAGE(\"private image\"),\n    GROUP_IMAGE(\"group image\"),\n    PRIVATE_AUDIO(\"private audio\"),\n    GROUP_AUDIO(\"group audio\"),\n\n    GROUP_FILE(\"group file\"),\n\n    LONG_MESSAGE(\"long message\"),\n    FORWARD_MESSAGE(\"forward message\"),\n\n    ANNOUNCEMENT_IMAGE(\"announcement image\"),\n\n    SHORT_VIDEO(\"short video\")\n    ;\n\n    override fun toString(): String = display\n}\n\ninternal enum class ChannelKind(\n    private val display: String,\n) {\n    HIGHWAY(\"Highway\"),\n    HTTP(\"Http\")\n    ;\n\n    override fun toString(): String = display\n}\n\ninternal suspend inline fun <reified R, reified IP> tryServersUpload(\n    bot: QQAndroidBot,\n    servers: Collection<Pair<IP, Int>>,\n    resourceSize: Long,\n    resourceKind: ResourceKind,\n    channelKind: ChannelKind,\n    crossinline implOnEachServer: suspend (ip: String, port: Int) -> R,\n) = servers.retryWithServers(\n    (resourceSize * 1000 / 1024 / 10).coerceAtLeast(5000),\n    onFail = { throw IllegalStateException(\"cannot upload $resourceKind, failed on all servers.\", it) }\n) { ip, port ->\n    bot.network.logger.verbose {\n        \"[${channelKind}] Uploading $resourceKind to ${ip}:$port, size=${resourceSize.sizeToString()}\"\n    }\n\n    var resp: R? = null\n    val time = measureTimeMillis {\n        runCatching {\n            resp = implOnEachServer(ip, port)\n        }.onFailure {\n            bot.network.logger.verbose {\n                \"[${channelKind}] Uploading $resourceKind to ${ip}:$port, size=${resourceSize.sizeToString()} failed: $it\"\n            }\n            throw it\n        }\n    }\n\n    bot.network.logger.verbose {\n        \"[${channelKind}] Uploading $resourceKind: succeed at ${\n            (resourceSize.toDouble() / 1024 / time.toDouble().div(1000)).roundToInt()\n        } KiB/s\"\n    }\n\n    resp as R\n}\n\ninternal suspend inline fun <reified R> tryServersDownload(\n    bot: QQAndroidBot,\n    servers: Collection<Pair<Int, Int>>,\n    resourceKind: ResourceKind,\n    channelKind: ChannelKind,\n    crossinline implOnEachServer: suspend (ip: String, port: Int) -> R,\n) = servers.retryWithServers(\n    5000,\n    onFail = { throw IllegalStateException(\"cannot download $resourceKind, failed on all servers.\", it) }\n) { ip, port ->\n    tryDownloadImplEach(bot, channelKind, resourceKind, ip, port, implOnEachServer)\n}\n\ninternal suspend inline fun <reified R> tryDownload(\n    bot: QQAndroidBot,\n    host: String,\n    port: Int,\n    times: Int = 1,\n    resourceKind: ResourceKind,\n    channelKind: ChannelKind,\n    crossinline implOnEachServer: suspend (ip: String, port: Int) -> R,\n) = retryCatching(times) {\n    tryDownloadImplEach(bot, channelKind, resourceKind, host, port, implOnEachServer)\n}.getOrElse { throw IllegalStateException(\"Cannot download $resourceKind\", it) }\n\n\nprivate suspend inline fun <reified R> tryDownloadImplEach(\n    bot: QQAndroidBot,\n    channelKind: ChannelKind,\n    resourceKind: ResourceKind,\n    host: String,\n    port: Int,\n    crossinline implOnEachServer: suspend (ip: String, port: Int) -> R,\n): R {\n    bot.network.logger.verbose {\n        \"[${channelKind}] Downloading $resourceKind from ${host}:$port\"\n    }\n\n    var resp: R? = null\n    runCatching {\n        resp = implOnEachServer(host, port)\n    }.onFailure {\n        bot.network.logger.verbose {\n            \"[${channelKind}] Downloading $resourceKind from ${host}:$port failed: $it\"\n        }\n        throw it\n    }\n\n    bot.network.logger.verbose {\n        \"[${channelKind}] Downloading $resourceKind: succeed\"\n    }\n\n    return resp as R\n}\n\ninternal suspend fun ChunkedFlowSession<ByteReadPacket>.sendSequentially(\n    socket: PlatformSocket,\n    respCallback: (resp: CSDataHighwayHead.RspDataHighwayHead) -> Unit = {},\n) {\n    contract { callsInPlace(respCallback, InvocationKind.UNKNOWN) }\n    useAll {\n        socket.send(it)\n        //0A 3C 08 01 12 0A 31 39 39 34 37 30 31 30 32 31 1A 0C 50 69 63 55 70 2E 44 61 74 61 55 70 20 E9 A7 05 28 00 30 BD DB 8B 80 02 38 80 20 40 02 4A 0A 38 2E 32 2E 30 2E 31 32 39 36 50 84 10 12 3D 08 00 10 FD 08 18 00 20 FD 08 28 C6 01 38 00 42 10 D4 1D 8C D9 8F 00 B2 04 E9 80 09 98 EC F8 42 7E 4A 10 D4 1D 8C D9 8F 00 B2 04 E9 80 09 98 EC F8 42 7E 50 89 92 A2 FB 06 58 00 60 00 18 53 20 01 28 00 30 04 3A 00 40 E6 B7 F7 D9 80 2E 48 00 50 00\n\n        socket.read().withUse {\n            discardExact(1)\n            val headLength = readInt()\n            discardExact(4)\n            val proto = readProtoBuf(CSDataHighwayHead.RspDataHighwayHead.serializer(), length = headLength)\n            check(proto.errorCode == 0) { \"highway transfer failed, error ${proto.errorCode}\" }\n            respCallback(proto)\n        }\n    }\n}\n\nprivate fun <T> Flow<T>.produceIn0(coroutineScope: CoroutineScope): ReceiveChannel<T> {\n    return kotlin.runCatching {\n        @OptIn(FlowPreview::class)\n        produceIn(coroutineScope) // this is experimental api\n    }.getOrElse {\n        // fallback strategy in case binary changes.\n\n        val channel = Channel<T>()\n        coroutineScope.launch(CoroutineName(\"Flow collector\")) {\n            collect {\n                channel.send(it)\n            }\n            channel.close()\n        }\n        channel\n    }\n}\n\ninternal interface HighwayProtocolChannel {\n    suspend fun send(packet: ByteReadPacket)\n    suspend fun read(): ByteReadPacket\n}\n\n\n// backup\n\n//            createConnection = { ip, port ->\n//                SynchronousHighwayProtocolChannel { packet ->\n//                    val http = Mirai.Http\n//                    http.post(\"http://$ip:$port/cgi-bin/httpconn?htcmd=0x6FF0087&uin=${bot.id}\") {\n//                        userAgent(\"QQClient\")\n//                        val bytes = packet.readBytes()\n//                        body = object : OutgoingContent.WriteChannelContent() {\n//                            override val contentLength: Long get() = bytes.size.toLongUnsigned()\n//                            override val contentType: ContentType get() = ContentType.Any\n//                            override suspend fun writeTo(channel: ByteWriteChannel) {\n//                                channel.writeFully(bytes)\n//                            }\n//                        }\n//                    }\n//                }\n//            }\n\ninternal class SynchronousHighwayProtocolChannel(\n    val action: suspend (ByteReadPacket) -> ByteArray,\n) : HighwayProtocolChannel {\n    @Volatile\n    var result: ByteArray? = null\n\n    override suspend fun send(packet: ByteReadPacket) {\n        result = action(packet)\n    }\n\n    override suspend fun read(): ByteReadPacket {\n        return result?.toReadPacket() ?: error(\"result is null\")\n    }\n}\n\ninternal suspend fun ChunkedFlowSession<ByteReadPacket>.sendConcurrently(\n    createConnection: suspend () -> HighwayProtocolChannel,\n    coroutines: Int = 5,\n    resultChecker: (CSDataHighwayHead.RspDataHighwayHead) -> Boolean,\n    respCallback: (resp: CSDataHighwayHead.RspDataHighwayHead) -> Unit = {},\n) = coroutineScope {\n    val channel = asFlow().produceIn0(this)\n\n    coroutineContext.job.invokeOnCompletion {\n        if (channel is Channel<*>) {\n            try {\n                channel.close() // safely closes resource\n            } catch (ignored: Exception) {\n            }\n        }\n    }\n    // 'single thread' producer emits chunks to channel\n\n    repeat(coroutines) {\n        launch(CoroutineName(\"Worker $it\")) {\n            val socket = createConnection()\n            while (isActive) {\n                val next = channel.receiveCatching().getOrNull() ?: return@launch // concurrent-safe receive\n                val result = next.withUse {\n                    socket.sendReceiveHighway(next, resultChecker)\n                }\n                respCallback(result)\n            }\n        }\n    }\n}\n\n\nprivate suspend fun HighwayProtocolChannel.sendReceiveHighway(\n    it: ByteReadPacket,\n    resultChecker: (CSDataHighwayHead.RspDataHighwayHead) -> Boolean,\n): CSDataHighwayHead.RspDataHighwayHead {\n    send(it)\n    //0A 3C 08 01 12 0A 31 39 39 34 37 30 31 30 32 31 1A 0C 50 69 63 55 70 2E 44 61 74 61 55 70 20 E9 A7 05 28 00 30 BD DB 8B 80 02 38 80 20 40 02 4A 0A 38 2E 32 2E 30 2E 31 32 39 36 50 84 10 12 3D 08 00 10 FD 08 18 00 20 FD 08 28 C6 01 38 00 42 10 D4 1D 8C D9 8F 00 B2 04 E9 80 09 98 EC F8 42 7E 4A 10 D4 1D 8C D9 8F 00 B2 04 E9 80 09 98 EC F8 42 7E 50 89 92 A2 FB 06 58 00 60 00 18 53 20 01 28 00 30 04 3A 00 40 E6 B7 F7 D9 80 2E 48 00 50 00\n\n    read().withUse {\n        discardExact(1)\n        val headLength = readInt()\n        discardExact(4)\n        val proto = readProtoBuf(CSDataHighwayHead.RspDataHighwayHead.serializer(), length = headLength)\n        check(resultChecker(proto)) { \"highway transfer failed, error ${proto.errorCode}\" }\n        // error 70: 某属性有误\n        // error 79: 没有 body (可能)\n        return proto\n    }\n}\n\ninternal fun highwayPacketSession(\n    // RequestDataTrans\n    client: QQAndroidClient,\n    command: String,\n    appId: Int,\n    dataFlag: Int = 4096,\n    commandId: Int,\n    localeId: Int = 2052,\n    initialTicket: ByteArray,\n    data: ExternalResource,\n    fileMd5: ByteArray,\n    sizePerPacket: Int = ByteArrayPool.BUFFER_SIZE,\n    extendInfo: ByteArray? = null,\n    callback: Highway.ProgressionCallback? = null,\n): ChunkedFlowSession<ByteReadPacket> {\n    ByteArrayPool.checkBufferSize(sizePerPacket)\n    //   require(ticket.size == 128) { \"bad uKey. Required size=128, got ${ticket.size}\" }\n\n    return ChunkedFlowSession(data.input(), ByteArray(sizePerPacket), callback) { buffer, size, offset ->\n        val head = CSDataHighwayHead.ReqDataHighwayHead(\n            msgBasehead = CSDataHighwayHead.DataHighwayHead(\n                version = 1,\n                uin = client.uin.toString(),\n                command = command,\n                seq = client.nextHighwayDataTransSequenceId(),\n                retryTimes = 0,\n                appid = appId,\n                dataflag = dataFlag,\n                commandId = commandId,\n                localeId = localeId\n            ),\n            msgSeghead = CSDataHighwayHead.SegHead(\n                //   cacheAddr = 812157193,\n                datalength = size,\n                dataoffset = offset,\n                filesize = data.size,\n                serviceticket = initialTicket,\n                md5 = buffer.md5(0, size),\n                fileMd5 = fileMd5,\n                flag = 0,\n                rtcode = 0\n            ),\n            reqExtendinfo = extendInfo,\n            msgLoginSigHead = null\n        ).toByteArray(CSDataHighwayHead.ReqDataHighwayHead.serializer())\n\n        buildPacket {\n            writeByte(40)\n            writeInt(head.size)\n            writeInt(size)\n            writeFully(head)\n            writeFully(buffer, 0, size)\n            writeByte(41)\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/highway/Http.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.highway\n\nimport io.ktor.client.*\nimport io.ktor.client.request.*\nimport io.ktor.http.*\nimport io.ktor.http.content.*\nimport io.ktor.util.*\nimport io.ktor.utils.io.*\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.voice.voiceCodec\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.copyTo\nimport net.mamoe.mirai.utils.toUHexString\nimport net.mamoe.mirai.utils.withUse\n\n\n/**\n * 在发送完成后将会 [InputStream.close]\n */\ninternal fun ExternalResource.consumeAsWriteChannelContent(contentType: ContentType?): OutgoingContent.WriteChannelContent {\n    return object : OutgoingContent.WriteChannelContent() {\n        override val contentType: ContentType? = contentType\n        override val contentLength: Long = size\n\n        override suspend fun writeTo(channel: ByteWriteChannel) {\n            input().withUse { copyTo(channel) }\n        }\n    }\n}\n\ninternal val FALLBACK_HTTP_SERVER = \"htdata2.qq.com\" to 0\n\n@OptIn(InternalAPI::class) // ktor bug\n@Suppress(\"SpellCheckingInspection\")\ninternal suspend fun HttpClient.postImage(\n    serverIp: String,\n    serverPort: Int = DEFAULT_PORT,\n    htcmd: String,\n    uin: Long,\n    groupcode: Long?,\n    imageInput: ExternalResource,\n    uKeyHex: String,\n): Boolean = post {\n    url {\n        protocol = URLProtocol.HTTP\n        host = serverIp // \"htdata2.qq.com\"\n        port = serverPort\n        path(\"cgi-bin/httpconn\")\n\n        parameters[\"htcmd\"] = htcmd\n        parameters[\"uin\"] = uin.toString()\n\n        if (groupcode != null) parameters[\"groupcode\"] = groupcode.toString()\n\n        parameters[\"term\"] = \"pc\"\n        parameters[\"ver\"] = \"5603\"\n        parameters[\"filesize\"] = imageInput.size.toString()\n        parameters[\"range\"] = 0.toString()\n        parameters[\"ukey\"] = uKeyHex\n\n        userAgent(\"QQClient\")\n    }\n\n    body = imageInput.consumeAsWriteChannelContent(ContentType.Image.Any)\n}.status == HttpStatusCode.OK\n\ninternal suspend fun HttpClient.postPtt(\n    serverIp: String,\n    serverPort: Int,\n    resource: ExternalResource,\n    uKey: ByteArray,\n    fileKey: ByteArray,\n) {\n    post {\n        url(\"http://$serverIp:$serverPort\")\n        parameter(\"ver\", 4679)\n        parameter(\"ukey\", uKey.toUHexString(\"\"))\n        parameter(\"filekey\", fileKey.toUHexString(\"\"))\n        parameter(\"filesize\", resource.size)\n        parameter(\"bmd5\", resource.md5.toUHexString(\"\"))\n        parameter(\"mType\", \"pttDu\")\n        parameter(\"voice_encodec\", resource.voiceCodec)\n        setBody(resource.consumeAsWriteChannelContent(null))\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/impl/HeartbeatFailedException.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.impl\n\nimport net.mamoe.mirai.internal.network.handler.selector.NetworkException\n\ninternal class HeartbeatFailedException(\n    private val name: String, // kind of HB\n    override val cause: Throwable,\n    recoverable: Boolean = cause is NetworkException && cause.recoverable,\n) : NetworkException(recoverable) {\n    override val message: String = \"Exception in $name job\"\n    override fun toString(): String = \"HeartbeatFailedException: $name, recoverable=$recoverable, cause=$cause\"\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/impl/ServerClosedException.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.impl\n\nimport net.mamoe.mirai.internal.network.handler.selector.NetworkException\n\ninternal sealed class ServerClosedException(\n    override val message: String? = null,\n    override val cause: Throwable? = null,\n) : NetworkException(true)\n\ninternal class ForceOfflineException(\n    val title: String,\n    override val message: String,\n    cause: Throwable? = null,\n) : ServerClosedException(message, cause)"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/impl/package.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.impl"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/keys.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.AbstractBot\nimport net.mamoe.mirai.internal.network.components.BotClientHolder\nimport net.mamoe.mirai.utils.*\n\n\ninternal class ReserveUinInfo(\n    val imgType: ByteArray,\n    val imgFormat: ByteArray,\n    val imgUrl: ByteArray,\n) {\n    override fun toString(): String {\n        return \"ReserveUinInfo(imgType=${imgType.toUHexString()}, imgFormat=${imgFormat.toUHexString()}, imgUrl=${imgUrl.toUHexString()})\"\n    }\n}\n\ninternal class WFastLoginInfo(\n    val outA1: ByteReadPacket,\n    var adUrl: String = \"\",\n    var iconUrl: String = \"\",\n    var profileUrl: String = \"\",\n    var userJson: String = \"\",\n) {\n    override fun toString(): String {\n        return \"WFastLoginInfo(outA1=$outA1, adUrl='$adUrl', iconUrl='$iconUrl', profileUrl='$profileUrl', userJson='$userJson')\"\n    }\n}\n\n@Serializable\ninternal class WLoginSimpleInfo(\n    val uin: Long, // uin\n    val imgType: ByteArray,\n    val imgFormat: ByteArray,\n    val imgUrl: ByteArray,\n    val mainDisplayName: ByteArray,\n) {\n    override fun toString(): String {\n        return \"WLoginSimpleInfo(uin=$uin, imgType=${imgType.toUHexString()}, imgFormat=${imgFormat.toUHexString()}, imgUrl=${imgUrl.toUHexString()}, mainDisplayName=${mainDisplayName.toUHexString()})\"\n    }\n}\n\n@Serializable\ninternal class LoginExtraData(\n    val uin: Long,\n    val ip: ByteArray,\n    val time: Int,\n    val version: Int,\n) {\n    override fun toString(): String {\n        return \"LoginExtraData(uin=$uin, ip=${ip.toUHexString()}, time=$time, version=$version)\"\n    }\n}\n\ninternal fun BytePacketBuilder.writeLoginExtraData(loginExtraData: LoginExtraData) {\n    loginExtraData.run {\n        writeLong(uin)\n        writeByte(ip.size.toByte())\n        writeFully(ip)\n        writeInt(time)\n        writeInt(version)\n    }\n}\n\n@Serializable\ninternal class QRCodeLoginData(\n    val tmpPwd: ByteArray, // get from wtlogin.trans_emp, don't use client.wLoginSigInfo.encryptA1\n    val noPicSig: ByteArray, // get from wtlogin.trans_emp, don't use client.wLoginSigInfo.encryptA1\n    val tgtQR: ByteArray,\n) {\n    override fun toString(): String {\n        return \"QRCodeLoginData(tmpPwd=${tmpPwd.toUHexString()}, noPicSig=${noPicSig.toUHexString()}, tgtQR=${tgtQR.toUHexString()})\"\n    }\n}\n\n@Suppress(\"ArrayInDataClass\") // for `copy`\n@Serializable\ninternal data class WLoginSigInfo(\n    val uin: Long,\n    var encryptA1: ByteArray?, // sigInfo[0]\n    /**\n     * WARNING, please check [QQAndroidClient.tlv16a]\n     */\n    var noPicSig: ByteArray?, // sigInfo[1]\n\n    val simpleInfo: WLoginSimpleInfo,\n\n    var appPri: Long,\n    var a2ExpiryTime: Long,\n    var loginBitmap: Long,\n    var tgt: ByteArray,\n    var a2CreationTime: Long,\n    var tgtKey: ByteArray,\n    var userStSig: KeyWithCreationTime,\n    /**\n     * TransEmpPacket 加密使用\n     */\n    var userStKey: ByteArray,\n    var userStWebSig: KeyWithExpiry,\n    var userA5: KeyWithCreationTime,\n    var userA8: KeyWithExpiry,\n    var lsKey: KeyWithExpiry,\n    var sKey: KeyWithExpiry,\n    var userSig64: KeyWithCreationTime,\n    var openId: ByteArray,\n    var openKey: KeyWithCreationTime,\n    var vKey: KeyWithExpiry,\n    var accessToken: KeyWithCreationTime,\n    var d2: KeyWithExpiry,\n    var d2Key: ByteArray,\n    var sid: KeyWithExpiry,\n    var aqSig: KeyWithCreationTime,\n    var psKeyMap: PSKeyMap,\n    var pt4TokenMap: MutableMap<String, KeyWithExpiry> = mutableMapOf(), // = Pt4TokenMap  maybe compiler bug\n    var superKey: ByteArray,\n    var payToken: ByteArray,\n    var pf: ByteArray,\n    var pfKey: ByteArray,\n    var da2: ByteArray,\n    // val pt4Token: ByteArray,\n    var wtSessionTicket: KeyWithCreationTime,\n    var wtSessionTicketKey: ByteArray,\n    var deviceToken: ByteArray,\n    var encryptedDownloadSession: EncryptedDownloadSession? = null,\n) {\n\n    /**\n     * 获取 获取群公告 所需的 bkn 参数\n     * */\n    val bkn: Int\n        get() = sKey.data\n            .fold(5381) { acc: Int, b: Byte -> acc + acc.shl(5) + b.toInt() }\n            .and(Int.MAX_VALUE)\n\n    //图片加密下载\n    //是否加密从bigdatachannel处得知\n    @Serializable\n    internal class EncryptedDownloadSession(\n        val appId: Long, //1600000226L\n        val stKey: ByteArray,\n        val stSig: ByteArray,\n    )\n\n    override fun toString(): String {\n        return \"WLoginSigInfo(uin=$uin, encryptA1=${encryptA1?.toUHexString()}, noPicSig=${noPicSig?.toUHexString()}, simpleInfo=$simpleInfo, appPri=$appPri, a2ExpiryTime=$a2ExpiryTime, loginBitmap=$loginBitmap, tgt=${tgt.toUHexString()}, a2CreationTime=$a2CreationTime, tgtKey=${tgtKey.toUHexString()}, userStSig=$userStSig, userStKey=${userStKey.toUHexString()}, userStWebSig=$userStWebSig, userA5=$userA5, userA8=$userA8, lsKey=$lsKey, sKey=$sKey, userSig64=$userSig64, openId=${openId.toUHexString()}, openKey=$openKey, vKey=$vKey, accessToken=$accessToken, d2=$d2, d2Key=${d2Key.toUHexString()}, sid=$sid, aqSig=$aqSig, psKey=$psKeyMap, superKey=${superKey.toUHexString()}, payToken=${payToken.toUHexString()}, pf=${pf.toUHexString()}, pfKey=${pfKey.toUHexString()}, da2=${da2.toUHexString()}, wtSessionTicket=$wtSessionTicket, wtSessionTicketKey=${wtSessionTicketKey.toUHexString()}, deviceToken=${deviceToken.toUHexString()})\"\n    }\n\n    fun getPsKey(name: String): String {\n        return psKeyMap[name]?.data?.decodeToString() ?: error(\"Cannot find PsKey $name\")\n    }\n}\n\ninternal typealias PSKeyMap = MutableMap<String, KeyWithExpiry>\ninternal typealias Pt4TokenMap = MutableMap<String, KeyWithExpiry>\n\ninternal fun parsePSKeyMapAndPt4TokenMap(\n    data: ByteArray,\n    creationTime: Long,\n    expireTime: Long,\n    outPSKeyMap: PSKeyMap,\n    outPt4TokenMap: Pt4TokenMap,\n) =\n    data.read {\n        repeat(readShort().toInt()) {\n            val domain = readUShortLVString()\n            val psKey = readUShortLVByteArray()\n            val pt4token = readUShortLVByteArray()\n\n            when {\n                psKey.isNotEmpty() -> outPSKeyMap[domain] = KeyWithExpiry(psKey, creationTime, expireTime)\n                pt4token.isNotEmpty() -> outPt4TokenMap[domain] = KeyWithExpiry(pt4token, creationTime, expireTime)\n            }\n        }\n    }\n\n@Serializable\ninternal open class KeyWithExpiry(\n    @SerialName(\"data1\") override val data: ByteArray,\n    @SerialName(\"creationTime1\") override val creationTime: Long,\n    val expireTime: Long,\n) : KeyWithCreationTime(data, creationTime) {\n    override fun toString(): String {\n        return \"KeyWithExpiry(data=${data.toUHexString()}, creationTime=$creationTime)\"\n    }\n}\n\ninternal val KeyWithExpiry.str get() = data.decodeToString()\ninternal val AbstractBot.sKey get() = client.wLoginSigInfo.sKey.str\ninternal fun AbstractBot.psKey(name: String) = client.wLoginSigInfo.getPsKey(name)\ninternal val AbstractBot.client get() = components[BotClientHolder].client\n\n@Serializable\ninternal open class KeyWithCreationTime(\n    open val data: ByteArray,\n    open val creationTime: Long,\n) {\n    override fun toString(): String {\n        return \"KeyWithCreationTime(data=${data.toUHexString()}, creationTime=$creationTime)\"\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/notice/NewContactSupport.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.notice\n\nimport kotlinx.coroutines.cancel\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.FriendImpl\nimport net.mamoe.mirai.internal.contact.GroupImpl\nimport net.mamoe.mirai.internal.contact.StrangerImpl\nimport net.mamoe.mirai.internal.contact.impl\nimport net.mamoe.mirai.internal.contact.info.FriendInfoImpl\nimport net.mamoe.mirai.internal.contact.info.GroupInfoImpl\nimport net.mamoe.mirai.internal.contact.info.MemberInfoImpl\nimport net.mamoe.mirai.internal.contact.info.StrangerInfoImpl\nimport net.mamoe.mirai.internal.getGroupByUin\nimport net.mamoe.mirai.internal.network.protocol.data.jce.StGroupRankInfo\nimport net.mamoe.mirai.internal.network.protocol.data.jce.StTroopNum\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.packet.list.FriendList\n\ninternal interface NewContactSupport { // can be a marker interface when context receivers are available.\n\n    fun MsgComm.Msg.getNewMemberInfo(): MemberInfoImpl {\n        return MemberInfoImpl(\n            nameCard = msgHead.authNick.ifEmpty { msgHead.fromNick },\n            permission = MemberPermission.MEMBER,\n            specialTitle = \"\",\n            muteTimestamp = 0,\n            uin = msgHead.authUin,\n            nick = msgHead.authNick.ifEmpty { msgHead.fromNick },\n            remark = \"\",\n            anonymousId = null,\n        )\n    }\n\n    suspend fun QQAndroidBot.addNewGroupByCode(code: Long): GroupImpl? {\n        if (getGroup(code) != null) return null\n        return getNewGroup(code)?.apply { groups.delegate.add(this) }\n    }\n\n    // final\n    suspend fun QQAndroidBot.addNewGroupByUin(groupUin: Long): GroupImpl? {\n        if (getGroupByUin(groupUin) != null) return null\n        return addNewGroupByCode(Mirai.calculateGroupCodeByGroupUin(groupUin))\n    }\n\n    suspend fun QQAndroidBot.addNewGroup(stTroopNum: StTroopNum, stGroupRankInfo: StGroupRankInfo?): GroupImpl? {\n        if (getGroup(stTroopNum.groupCode) != null) return null\n        return getNewGroup(stTroopNum, stGroupRankInfo).apply { groups.delegate.add(this) }\n    }\n\n    fun QQAndroidBot.removeStranger(id: Long): StrangerImpl? {\n        val instance = strangers[id] ?: return null\n        strangers.remove(instance.id)\n        instance.cancel()\n        return instance\n    }\n\n    fun QQAndroidBot.removeFriend(id: Long): FriendImpl? {\n        val instance = friends[id] ?: return null\n        friends.remove(instance.id)\n        instance.cancel()\n        return instance\n    }\n\n    fun QQAndroidBot.addNewFriendAndRemoveStranger(info: FriendInfoImpl): FriendImpl? {\n        if (friends.contains(info.uin)) return null\n        strangers[info.uin]?.let { removeStranger(it.id) }\n        val friend = Mirai.newFriend(bot, info).impl()\n        friends.delegate.add(friend)\n        return friend\n    }\n\n    fun QQAndroidBot.addNewStranger(info: StrangerInfoImpl): StrangerImpl? {\n        if (friends.contains(info.uin)) return null // cannot have both stranger and friend\n        if (strangers.contains(info.uin)) return null\n        val stranger = Mirai.newStranger(bot, info).impl()\n        strangers.delegate.add(stranger)\n        return stranger\n    }\n\n    private suspend fun QQAndroidBot.getNewGroup(groupCode: Long): GroupImpl? {\n        val response = network.sendAndExpect(\n            FriendList.GetTroopListSimplify(client),\n            timeout = 10_000, attempts = 5\n        )\n\n        val troopNum = response.groups.firstOrNull { it.groupCode == groupCode } ?: return null\n        val groupRankInfo = response.ranks.find { it.dwGroupCode == groupCode }\n\n        return getNewGroup(troopNum, groupRankInfo)\n    }\n\n    private suspend fun QQAndroidBot.getNewGroup(troopNum: StTroopNum, stGroupRankInfo: StGroupRankInfo?): GroupImpl {\n        return GroupImpl(\n            bot = this,\n            parentCoroutineContext = coroutineContext,\n            id = troopNum.groupCode,\n            groupInfo = GroupInfoImpl(troopNum, stGroupRankInfo),\n            members = Mirai.getRawGroupMemberList(\n                this,\n                troopNum.groupUin,\n                troopNum.groupCode,\n                troopNum.dwGroupOwnerUin,\n            ),\n        )\n    }\n\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/notice/PrivateContactSupport.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.notice\n\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.GroupImpl\n\n///////////////////////////////////////////////////////////////////////////\n// Extension interfaces ---- should convert to context receivers in the future.\n///////////////////////////////////////////////////////////////////////////\n\ninternal interface BotAware : PrivateContactSupport {\n    override val bot: QQAndroidBot\n}\n\ninternal interface GroupAware : GroupMemberSupport, BotAware {\n    override val group: GroupImpl\n    override val bot: QQAndroidBot get() = group.bot\n}\n\ninternal interface PrivateContactSupport {\n    val bot: QQAndroidBot\n\n    fun Long.findFriend() = bot.friends[this]\n    fun Long.findStranger() = bot.strangers[this]\n    fun Long.findFriendOrStranger() = findFriend() ?: findStranger()\n    fun String.findFriend() = this.toLongOrNull()?.findFriend()\n    fun String.findStranger() = this.toLongOrNull()?.findStranger()\n    fun String.findFriendOrStranger() = this.toLongOrNull()?.findFriendOrStranger()\n}\n\ninternal interface GroupMemberSupport {\n    val group: GroupImpl\n\n    fun Long.findMember() = group[this]\n    fun String.findMember() = this.toLongOrNull()?.findMember()\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/notice/TraceLoggingNoticeProcessor.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.notice\n\nimport net.mamoe.mirai.internal.network.components.NoticePipelineContext\nimport net.mamoe.mirai.internal.network.components.SimpleNoticeProcessor\nimport net.mamoe.mirai.internal.utils.io.ProtocolStruct\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.systemProp\nimport net.mamoe.mirai.utils.warning\nimport net.mamoe.mirai.utils.withSwitch\n\ninternal class TraceLoggingNoticeProcessor(\n    logger: MiraiLogger\n) : SimpleNoticeProcessor<ProtocolStruct>(type()) {\n    private val logger: MiraiLogger = logger.withSwitch(systemProp(\"mirai.network.notice.trace.logging\", false))\n\n    override suspend fun NoticePipelineContext.processImpl(data: ProtocolStruct) {\n        logger.warning { \"${data::class.simpleName}: isConsumed=$isConsumed\" }\n    }\n\n//    override suspend fun NoticePipelineContext.processImpl(data: MsgType0x210) {\n//        logger.warning { \"MsgType0x210: isConsumed=$isConsumed\" }\n//    }\n//\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/notice/UnconsumedNoticesAlerter.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.notice\n\nimport net.mamoe.mirai.internal.message.contextualBugReportException\nimport net.mamoe.mirai.internal.network.components.MixedNoticeProcessor\nimport net.mamoe.mirai.internal.network.components.NoticePipelineContext\nimport net.mamoe.mirai.internal.network.notice.decoders.MsgType0x2DC\nimport net.mamoe.mirai.internal.network.protocol.data.jce.MsgType0x210\nimport net.mamoe.mirai.internal.network.protocol.data.jce.RequestPushStatus\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgOnlinePush\nimport net.mamoe.mirai.internal.network.protocol.data.proto.OnlinePushTrans\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.NewContact\nimport net.mamoe.mirai.utils.*\n\ninternal class UnconsumedNoticesAlerter(\n    logger: MiraiLogger,\n) : MixedNoticeProcessor() {\n    private val logger: MiraiLogger = logger.withSwitch(systemProp(\"mirai.network.notice.unconsumed.logging\", false))\n\n    override suspend fun NoticePipelineContext.processImpl(data: MsgType0x210) {\n        if (isConsumed) return\n        when (data.uSubMsgType) {\n            0x26L, // VIP 进群提示\n            0x111L, // 提示共同好友\n            0xD4L, // bot 在其他客户端被踢或主动退出而同步情况\n            -> {\n                // Network(1994701021) 16:03:54 : unknown group 528 type 0x0000000000000026, data: 08 01 12 40 0A 06 08 F4 EF BB 8F 04 10 E7 C1 AD B8 02 18 01 22 2C 10 01 1A 1A 18 B4 DC F8 9B 0C 20 E7 C1 AD B8 02 28 06 30 02 A2 01 04 08 93 D6 03 A8 01 08 20 00 28 00 32 08 18 01 20 FE AF AF F5 05 28 00\n            }\n\n            0xE2L -> {\n                // unknown\n\n                // 0A 35 08 00 10 A2 FF 8C F0 03 1A 1B E5 90 8C E6 84 8F E4 BD A0 E7 9A 84 E5 8A A0 E5 A5 BD E5 8F 8B E8 AF B7 E6 B1 82 22 0C E6 BD 9C E6 B1 9F E7 BE A4 E5 8F 8B 28 01\n                // vProtobuf.loadAs(Msgtype0x210.serializer())\n            }\n            else -> {\n                logger.debug { \"Unknown group 528 type 0x${data.uSubMsgType.toUHexString(\"\")}, data: \" + data.vProtobuf.toUHexString() }\n            }\n        }\n    }\n\n    override suspend fun NoticePipelineContext.processImpl(data: MsgType0x2DC) {\n        if (isConsumed) return\n        logger.debug { \"Unknown group 732 type ${data.kind}, data: \" + data.buf.toUHexString() }\n    }\n\n    override suspend fun NoticePipelineContext.processImpl(data: OnlinePushTrans.PbMsgInfo) {\n        if (isConsumed) return\n        when {\n            data.msgType == 529 && data.msgSubtype == 9 -> {\n                /*\n                PbMsgInfo#1773430973 {\n                    fromUin=0x0000000026BA1173(649728371)\n                    generalFlag=0x00000001(1)\n                    msgData=0A 07 70 72 69 6E 74 65 72 10 02 1A CD 02 0A 1F 53 61 6D 73 75 6E 67 20 4D 4C 2D 31 38 36 30 20 53 65 72 69 65 73 20 28 55 53 42 30 30 31 29 0A 16 4F 6E 65 4E 6F 74 65 20 66 6F 72 20 57 69 6E 64 6F 77 73 20 31 30 0A 19 50 68 61 6E 74 6F 6D 20 50 72 69 6E 74 20 74 6F 20 45 76 65 72 6E 6F 74 65 0A 11 4F 6E 65 4E 6F 74 65 20 28 44 65 73 6B 74 6F 70 29 0A 1D 4D 69 63 72 6F 73 6F 66 74 20 58 50 53 20 44 6F 63 75 6D 65 6E 74 20 57 72 69 74 65 72 0A 16 4D 69 63 72 6F 73 6F 66 74 20 50 72 69 6E 74 20 74 6F 20 50 44 46 0A 15 46 6F 78 69 74 20 50 68 61 6E 74 6F 6D 20 50 72 69 6E 74 65 72 0A 03 46 61 78 32 09 0A 03 6A 70 67 10 01 18 00 32 0A 0A 04 6A 70 65 67 10 01 18 00 32 09 0A 03 70 6E 67 10 01 18 00 32 09 0A 03 67 69 66 10 01 18 00 32 09 0A 03 62 6D 70 10 01 18 00 32 09 0A 03 64 6F 63 10 01 18 01 32 0A 0A 04 64 6F 63 78 10 01 18 01 32 09 0A 03 74 78 74 10 00 18 00 32 09 0A 03 70 64 66 10 01 18 01 32 09 0A 03 70 70 74 10 01 18 01 32 0A 0A 04 70 70 74 78 10 01 18 01 32 09 0A 03 78 6C 73 10 01 18 01 32 0A 0A 04 78 6C 73 78 10 01 18 01\n                    msgSeq=0x00001AFF(6911)\n                    msgSubtype=0x00000009(9)\n                    msgTime=0x5FDF21A3(1608458659)\n                    msgType=0x00000211(529)\n                    msgUid=0x010000005FDEE04C(72057595646369868)\n                    realMsgTime=0x5FDF21A3(1608458659)\n                    svrIp=0x3E689409(1047041033)\n                    toUin=0x0000000026BA1173(649728371)\n                }\n                 */\n                return\n            }\n        }\n        if (logger.isEnabled && logger.isDebugEnabled) {\n            logger.debug(\n                contextualBugReportException(\n                    \"解析 OnlinePush.PbPushTransMsg, msgType=${data.msgType}\",\n                    data.structureToString(),\n                    null,\n                    \"并描述此时机器人是否被踢出, 或是否有成员列表变更等动作.\",\n                )\n            )\n        }\n    }\n\n    override suspend fun NoticePipelineContext.processImpl(data: MsgOnlinePush.PbPushMsg) {\n        if (isConsumed) return\n\n    }\n\n    override suspend fun NoticePipelineContext.processImpl(data: MsgComm.Msg) {\n        if (isConsumed) return\n        when (data.msgHead.msgType) {\n            732 -> {\n                // 732:  27 0B 60 E7 0C 01 3E 03 3F A2 5E 90 60 E2 00 01 44 71 47 90 00 00 02 58\n                // 732:  27 0B 60 E7 11 00 40 08 07 20 E7 C1 AD B8 02 5A 36 08 B4 E7 E0 F0 09 1A 1A 08 9C D4 16 10 F7 D2 D8 F5 05 18 D0 E2 85 F4 06 20 00 28 00 30 B4 E7 E0 F0 09 2A 0E 08 00 12 0A 08 9C D4 16 10 00 18 01 20 00 30 00 38 00\n                // 732:  27 0B 60 E7 11 00 33 08 07 20 E7 C1 AD B8 02 5A 29 08 EE 97 85 E9 01 1A 19 08 EE D6 16 10 FF F2 D8 F5 05 18 E9 E7 A3 05 20 00 28 00 30 EE 97 85 E9 01 2A 02 08 00 30 00 38 00\n\n                // unknown\n                // 前 4 byte 是群号\n            }\n            84, 87 -> { // 请求入群验证 和 被邀请入群\n                bot.network.sendWithoutExpect(NewContact.SystemMsgNewGroup(bot.client))\n            }\n            187 -> { // 请求加好友验证\n                bot.network.sendWithoutExpect(NewContact.SystemMsgNewFriend(bot.client))\n            }\n            else -> {\n                logger.debug { \"unknown PbGetMsg type ${data.msgHead.msgType}, data=${data.msgBody.msgContent.toUHexString()}\" }\n            }\n        }\n    }\n\n    override suspend fun NoticePipelineContext.processImpl(data: Structmsg.StructMsg) {\n        if (isConsumed) return\n        if (logger.isEnabled && logger.isDebugEnabled) {\n            data.msg?.context {\n                throw contextualBugReportException(\n                    \"解析 NewContact.SystemMsgNewGroup, subType=$subType, groupMsgType=$groupMsgType\",\n                    forDebug = this.structureToString(),\n                    additional = \"并尽量描述此时机器人是否正被邀请加入群, 或者是有有新群员加入此群\",\n                )\n            }\n        }\n    }\n\n    override suspend fun NoticePipelineContext.processImpl(data: RequestPushStatus) {\n        if (isConsumed) return\n        if (logger.isEnabled && logger.isDebugEnabled) {\n            throw contextualBugReportException(\n                \"decode SvcRequestPushStatus (PC Client status change)\",\n                data.structureToString(),\n                additional = \"unknown status=${data.status}\",\n            )\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/notice/decoders/GroupNotificationDecoder.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.notice.decoders\n\nimport net.mamoe.mirai.internal.contact.GroupImpl\nimport net.mamoe.mirai.internal.network.components.MixedNoticeProcessor\nimport net.mamoe.mirai.internal.network.components.NoticePipelineContext\nimport net.mamoe.mirai.internal.network.protocol.data.proto.TroopTips0x857\nimport net.mamoe.mirai.internal.utils.io.ProtocolStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\n\ninternal class GroupNotificationDecoder : MixedNoticeProcessor() {\n    override suspend fun NoticePipelineContext.processImpl(data: MsgType0x2DC) {\n        when (data.kind) {\n            0x10 -> {\n                val proto = data.buf.loadAs(TroopTips0x857.NotifyMsgBody.serializer(), offset = 1)\n                processAlso(DecodedNotifyMsgBody(data.kind, data.group, proto))\n            }\n        }\n    }\n}\n\ninternal data class DecodedNotifyMsgBody(\n    override val kind: Int,\n    override val group: GroupImpl,\n    override val buf: TroopTips0x857.NotifyMsgBody,\n) : BaseMsgType0x2DC<TroopTips0x857.NotifyMsgBody>, ProtocolStruct"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/notice/decoders/MsgInfoDecoder.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.notice.decoders\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.contact.GroupImpl\nimport net.mamoe.mirai.internal.contact.checkIsGroupImpl\nimport net.mamoe.mirai.internal.getGroupByUin\nimport net.mamoe.mirai.internal.network.components.NoticePipelineContext\nimport net.mamoe.mirai.internal.network.components.NoticePipelineContext.Companion.KEY_MSG_INFO\nimport net.mamoe.mirai.internal.network.components.SimpleNoticeProcessor\nimport net.mamoe.mirai.internal.network.components.SyncController.Companion.syncController\nimport net.mamoe.mirai.internal.network.components.syncOnlinePush\nimport net.mamoe.mirai.internal.network.notice.GroupAware\nimport net.mamoe.mirai.internal.network.protocol.data.jce.MsgInfo\nimport net.mamoe.mirai.internal.network.protocol.data.jce.MsgType0x210\nimport net.mamoe.mirai.internal.network.protocol.data.jce.OnlinePushPack.SvcReqPushMsg\nimport net.mamoe.mirai.internal.utils.io.ProtocolStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.utils.*\n\n/**\n * Decodes [SvcReqPushMsg] to [MsgInfo] then re-fire [MsgType0x210] or [MsgType0x2DC]\n */\ninternal class MsgInfoDecoder(\n    private val logger: MiraiLogger,\n) : SimpleNoticeProcessor<SvcReqPushMsg>(type()) {\n    override suspend fun NoticePipelineContext.processImpl(data: SvcReqPushMsg) {\n        // SvcReqPushMsg is fully handled here, no need to set consumed.\n\n        for (msgInfo in data.vMsgInfos) {\n            decodeMsgInfo(msgInfo)\n        }\n    }\n\n    private suspend fun NoticePipelineContext.decodeMsgInfo(data: MsgInfo) {\n        if (!bot.syncController.syncOnlinePush(data)) return\n        @Suppress(\"MoveVariableDeclarationIntoWhen\") // for debug\n        val id = data.shMsgType.toUShort().toInt()\n        when (id) {\n            // 528\n            0x210 -> processAlso(data.vMsg.loadAs(MsgType0x210.serializer()), KEY_MSG_INFO to data)\n\n            // 732\n            0x2dc -> {\n                data.vMsg.read {\n                    val groupCode = readInt().toUInt().toLong()\n                    val group = bot.getGroup(groupCode) ?: bot.getGroupByUin(groupCode)\n                    ?: return // group has not been initialized\n                    group.checkIsGroupImpl()\n\n                    val kind = readByte().toInt()\n                    discardExact(1)\n\n                    processAlso(MsgType0x2DC(kind, group, this.readBytes()), KEY_MSG_INFO to data)\n                }\n            }\n            else -> {\n                logger.debug { \"Unknown MsgInfo kind ${data.shMsgType.toInt()}, data=${data.vMsg.toUHexString()}\" }\n            }\n        }\n    }\n}\n\ninternal interface BaseMsgType0x2DC<V> : GroupAware {\n    val kind: Int\n    override val group: GroupImpl\n    val buf: V\n\n    override val bot get() = group.bot\n}\n\ninternal data class MsgType0x2DC(\n    override val kind: Int, // inner kind, read from vMsg\n    override val group: GroupImpl,\n    override val buf: ByteArray,\n) : ProtocolStruct, BaseMsgType0x2DC<ByteArray> {\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (!isSameType(this, other)) return false\n\n        if (kind != other.kind) return false\n        if (group != other.group) return false\n        if (!buf.contentEquals(other.buf)) return false\n\n        return true\n    }\n\n    override fun hashCode(): Int {\n        var result = kind\n        result = 31 * result + group.hashCode()\n        result = 31 * result + buf.contentHashCode()\n        return result\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/notice/group/GroupMessageProcessor.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.notice.group\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.Member\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.GroupMessageEvent\nimport net.mamoe.mirai.event.events.GroupMessageSyncEvent\nimport net.mamoe.mirai.event.events.MemberCardChangeEvent\nimport net.mamoe.mirai.event.events.MemberSpecialTitleChangeEvent\nimport net.mamoe.mirai.internal.contact.*\nimport net.mamoe.mirai.internal.contact.info.MemberInfoImpl\nimport net.mamoe.mirai.internal.message.RefineContextKey\nimport net.mamoe.mirai.internal.message.SimpleRefineContext\nimport net.mamoe.mirai.internal.message.toMessageChainOnline\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.components.NoticePipelineContext\nimport net.mamoe.mirai.internal.network.components.SimpleNoticeProcessor\nimport net.mamoe.mirai.internal.network.components.SyncController.Companion.syncController\nimport net.mamoe.mirai.internal.network.notice.group.GroupMessageProcessor.MemberNick.Companion.generateMemberNickFromMember\nimport net.mamoe.mirai.internal.network.notice.priv.PrivateMessageProcessor\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgOnlinePush\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Oidb0x8fc\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.voice.PttStore\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.message.data.MessageSourceKind\nimport net.mamoe.mirai.utils.*\n\n/**\n * Handles [GroupMessageEvent]. For private message events, see [PrivateMessageProcessor]\n */\ninternal class GroupMessageProcessor(\n    private val logger: MiraiLogger,\n) : SimpleNoticeProcessor<MsgOnlinePush.PbPushMsg>(type()) {\n    internal data class SendGroupMessageReceipt(\n        val bot: Bot?,\n        val messageRandom: Int,\n        val sequenceId: Int,\n        val fromAppId: Int,\n    ) : Packet, Event, Packet.NoLog, AbstractEvent() {\n        override fun toString(): String {\n            return \"OnlinePush.PbPushGroupMsg.SendGroupMessageReceipt(messageRandom=$messageRandom, sequenceId=$sequenceId)\"\n        }\n\n        companion object {\n            val EMPTY = SendGroupMessageReceipt(null, 0, 0, 0)\n        }\n    }\n\n    private data class MemberNick(val nick: String, val isNameCard: Boolean = false) {\n        companion object {\n            fun Member.generateMemberNickFromMember(): MemberNick {\n                return nameCard.takeIf { nameCard.isNotEmpty() }?.let {\n                    MemberNick(nameCard, true)\n                } ?: MemberNick(nick, false)\n            }\n        }\n    }\n\n\n    override suspend fun NoticePipelineContext.processImpl(data: MsgOnlinePush.PbPushMsg) {\n        val msgHead = data.msg.msgHead\n\n        val isFromSelfAccount = msgHead.fromUin == bot.id\n        if (isFromSelfAccount) {\n            val messageRandom = data.msg.msgBody.richText.attr?.random ?: return\n\n            if (bot.syncController.containsGroupMessageReceipt(messageRandom)\n                || msgHead.fromAppid == 3116 || msgHead.fromAppid == 2021\n            ) {\n                // 3116=group music share\n                // 2021=group file\n                // message sent by bot\n                collect(SendGroupMessageReceipt(bot, messageRandom, msgHead.msgSeq, msgHead.fromAppid))\n                return\n            }\n            // else: sync form other device\n        }\n\n        if (msgHead.groupInfo == null) return\n\n        val group = bot.getGroup(msgHead.groupInfo.groupCode) as GroupImpl? ?: return // 机器人还正在进群\n\n\n        // fragmented message\n        val msgs = group.groupPkgMsgParsingCache.tryMerge(data).ifEmpty { return }\n\n        var extraInfo: ImMsgBody.ExtraInfo? = null\n        var anonymous: ImMsgBody.AnonymousGroupMsg? = null\n\n        for (msg in msgs) {\n            for (elem in msg.msg.msgBody.richText.elems) {\n                when {\n                    elem.extraInfo != null -> extraInfo = elem.extraInfo\n                    elem.anonGroupMsg != null -> anonymous = elem.anonGroupMsg\n                }\n            }\n\n            msg.msg.msgBody.richText.ptt?.let pttPatch@{ ptt ->\n                if (ptt.downPara.isNotEmpty()) return@pttPatch\n\n                kotlin.runCatching {\n                    val response = bot.network.sendAndExpect(\n                        PttStore.GroupPttDown(\n                            bot.client,\n                            group.groupCode,\n                            ptt,\n                            msg.msg\n                        ),\n                        5000,\n                        2\n                    )\n\n                    ptt.downPara =\n                        \"http://${response.strDomain}${response.downPara.decodeToString()}\".encodeToByteArray()\n                }\n            }\n        }\n\n\n        val sender: Member  // null if sync from other client\n        val nameCard: MemberNick\n\n        if (anonymous != null) { // anonymous member\n            sender = group.newAnonymous(anonymous.anonNick.decodeToString(), anonymous.anonId.encodeBase64())\n            nameCard = sender.generateMemberNickFromMember()\n        } else { // normal member chat\n            sender = group[msgHead.fromUin] ?: kotlin.run {\n                logger.warning { \"Failed to find member ${msgHead.fromUin} in group ${group.id}\" }\n                return\n            }\n            nameCard = findSenderName(extraInfo, msgHead.groupInfo) ?: sender.generateMemberNickFromMember()\n        }\n\n        sender.info?.castOrNull<MemberInfoImpl>()?.run {\n            lastSpeakTimestamp = currentTimeSeconds().toInt()\n        }\n        sender.castOrNull<NormalMemberImpl>()?.run {\n            val specialTitleNow = extraInfo?.senderTitle?.decodeToString().orEmpty()\n            if (specialTitle != specialTitleNow) {\n                //群特殊头衔 只有群主才能进行操作\n                collect(MemberSpecialTitleChangeEvent(specialTitle, specialTitleNow, this, group.owner))\n                _specialTitle = specialTitleNow\n            }\n        }\n\n        if (isFromSelfAccount) {\n            collect(\n                GroupMessageSyncEvent(\n                    client = bot.otherClients.find { it.appId == msgHead.fromInstid }\n                        ?: return, // don't compare with dstAppId. diff.\n                    message = msgs.map { it.msg }.toMessageChainOnline(\n                        bot,\n                        group.id,\n                        MessageSourceKind.GROUP,\n                        SimpleRefineContext(\n                            mutableMapOf(\n                                RefineContextKey.MessageSourceKind to MessageSourceKind.GROUP,\n                                RefineContextKey.FromId to sender.uin,\n                                RefineContextKey.GroupIdOrZero to group.id,\n                            )\n                        )\n                    ),\n                    time = msgHead.msgTime,\n                    group = group,\n                    sender = sender,\n                    senderName = nameCard.nick,\n                ),\n            )\n            return\n        } else {\n            broadcastNameCardChangedEventIfNecessary(sender, nameCard)\n\n            collect(\n                GroupMessageEvent(\n                    senderName = nameCard.nick,\n                    sender = sender,\n                    message = msgs.map { it.msg }.toMessageChainOnline(\n                        bot,\n                        group.id,\n                        MessageSourceKind.GROUP,\n                        SimpleRefineContext(\n                            mutableMapOf(\n                                RefineContextKey.MessageSourceKind to MessageSourceKind.GROUP,\n                                RefineContextKey.FromId to sender.uin,\n                                RefineContextKey.GroupIdOrZero to group.id,\n                            )\n                        )\n                    ),\n                    permission = sender.permission,\n                    time = msgHead.msgTime,\n                ),\n            )\n            return\n        }\n    }\n\n    private suspend inline fun broadcastNameCardChangedEventIfNecessary(\n        sender: Member,\n        new: MemberNick,\n    ) {\n        if (sender is NormalMemberImpl) {\n            val currentNameCard = sender.nameCard\n            if (new.isNameCard) {\n                new.nick.let { name ->\n                    if (currentNameCard != name) {\n                        sender._nameCard = name\n                        MemberCardChangeEvent(currentNameCard, name, sender).broadcast()\n                    }\n                }\n            } else {\n                // 说明删除了群名片\n                if (currentNameCard.isNotEmpty()) {\n                    sender._nameCard = \"\"\n                    MemberCardChangeEvent(currentNameCard, \"\", sender).broadcast()\n                }\n            }\n        }\n    }\n\n    private fun findSenderName(\n        extraInfo: ImMsgBody.ExtraInfo?,\n        groupInfo: MsgComm.GroupInfo,\n    ): MemberNick? =\n        extraInfo?.groupCard?.takeIf { it.isNotEmpty() }?.decodeCommCardNameBuf()?.let {\n            MemberNick(it, true)\n        } ?: groupInfo.takeIf { it.groupCard.isNotEmpty() }?.let {\n            MemberNick(it.groupCard, it.groupCardType != 2)\n        }\n\n    private fun ByteArray.decodeCommCardNameBuf() = kotlin.runCatching {\n        if (this[0] == 0x0A.toByte()) {\n            val nameBuf = loadAs(Oidb0x8fc.CommCardNameBuf.serializer())\n            if (nameBuf.richCardName.isNotEmpty()) {\n                return@runCatching nameBuf.richCardName.joinToString(\"\") { it.text.decodeToString() }\n            }\n        }\n        return@runCatching null\n    }.getOrNull() ?: decodeToString()\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/notice/group/GroupNotificationProcessor.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.notice.group\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.contact.NormalMember\nimport net.mamoe.mirai.contact.UserOrBot\nimport net.mamoe.mirai.contact.getMember\nimport net.mamoe.mirai.data.GroupHonorType\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.GroupImpl\nimport net.mamoe.mirai.internal.contact.checkIsGroupImpl\nimport net.mamoe.mirai.internal.contact.checkIsMemberImpl\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.components.MixedNoticeProcessor\nimport net.mamoe.mirai.internal.network.components.NoticePipelineContext\nimport net.mamoe.mirai.internal.network.notice.NewContactSupport\nimport net.mamoe.mirai.internal.network.notice.decoders.MsgType0x2DC\nimport net.mamoe.mirai.internal.network.protocol.data.jce.MsgType0x210\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Submsgtype0x122\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Submsgtype0x27\nimport net.mamoe.mirai.internal.network.protocol.data.proto.TroopTips0x857\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.internal.utils.parseToMessageDataList\nimport net.mamoe.mirai.utils.*\nimport kotlin.jvm.JvmName\n\ninternal class GroupNotificationProcessor(\n    private val logger: MiraiLogger,\n) : MixedNoticeProcessor(), NewContactSupport {\n\n    override suspend fun NoticePipelineContext.processImpl(data: MsgType0x210) = data.context {\n        when (data.uSubMsgType) {\n            0x27L -> {\n                val body = vProtobuf.loadAs(Submsgtype0x27.SubMsgType0x27.SubMsgType0x27MsgBody.serializer())\n                for (msgModInfo in body.msgModInfos) {\n                    markAsConsumed(msgModInfo)\n                    when {\n                        msgModInfo.msgModGroupProfile != null -> handleGroupProfileChanged(msgModInfo.msgModGroupProfile)\n                        msgModInfo.msgModGroupMemberProfile != null -> handleGroupMemberProfileChanged(msgModInfo.msgModGroupMemberProfile)\n                        else -> markNotConsumed(msgModInfo)\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * @see GroupNameChangeEvent\n     */\n    private fun NoticePipelineContext.handleGroupProfileChanged(\n        modGroupProfile: Submsgtype0x27.SubMsgType0x27.ModGroupProfile\n    ) {\n        for (info in modGroupProfile.msgGroupProfileInfos) {\n            when (info.field) {\n                1 -> {\n                    // 群名\n                    val new = info.value.decodeToString()\n\n                    val group = bot.getGroup(modGroupProfile.groupCode) ?: continue\n                    group.checkIsGroupImpl()\n                    val old = group.name\n\n                    if (new == old) continue\n\n                    if (modGroupProfile.cmdUin == bot.id) continue\n                    val operator = group[modGroupProfile.cmdUin] ?: continue\n\n                    group.settings.nameField = new\n\n                    collect(GroupNameChangeEvent(old, new, group, operator))\n                }\n                2 -> {\n                    // 头像\n                    // top_package/akkz.java:3446\n                    /*\n                        var4 = var82.byteAt(0);\n                           short var3 = (short) (var82.byteAt(1) | var4 << 8);\n                           var85 = var18.method_77927(var7 + \"\");\n                           var85.troopface = var3;\n                           var85.hasSetNewTroopHead = true;\n                         */\n                    //                        bot.logger.debug(\n                    //                            contextualBugReportException(\n                    //                                \"解析 Transformers528 0x27L ModGroupProfile 群头像修改\",\n                    //                                forDebug = \"this=${this._miraiContentToString()}\"\n                    //                            )\n                    //                        )\n                }\n                3 -> { // troop.credit.data\n                    // top_package/akkz.java:3475\n                    // top_package/akkz.java:3498\n                    //                        bot.logger.debug(\n                    //                            contextualBugReportException(\n                    //                                \"解析 Transformers528 0x27L ModGroupProfile 群 troop.credit.data\",\n                    //                                forDebug = \"this=${this._miraiContentToString()}\"\n                    //                            )\n                    //                        )\n                }\n                else -> {\n                }\n            }\n        }\n    }\n\n    /**\n     * @see MemberCardChangeEvent\n     */\n    private fun NoticePipelineContext.handleGroupMemberProfileChanged(\n        modGroupMemberProfile: Submsgtype0x27.SubMsgType0x27.ModGroupMemberProfile\n    ) {\n        for (info in modGroupMemberProfile.msgGroupMemberProfileInfos) {\n            when (info.field) {\n                1 -> { // name card\n                    val new = info.value\n                    val group = bot.getGroup(modGroupMemberProfile.groupCode) ?: continue\n                    group.checkIsGroupImpl()\n                    val member = group[modGroupMemberProfile.uin] ?: continue\n                    member.checkIsMemberImpl()\n\n                    val old = member.nameCard\n\n                    if (new == old) continue\n                    member._nameCard = new\n\n                    collect(MemberCardChangeEvent(old, new, member))\n                }\n                2 -> {\n                    if (info.value.singleOrNull()?.code != 0) {\n                        logger.debug {\n                            \"Unknown Transformers528 0x27L ModGroupMemberProfile, field=${info.field}, value=${info.value}\"\n                        }\n                    }\n                    continue\n                }\n                else -> {\n                    logger.debug {\n                        \"Unknown Transformers528 0x27L ModGroupMemberProfile, field=${info.field}, value=${info.value}\"\n                    }\n                    continue\n                }\n            }\n        }\n    }\n\n\n    ///////////////////////////////////////////////////////////////////////////\n    // MsgType0x2DC\n    ///////////////////////////////////////////////////////////////////////////\n\n    override suspend fun NoticePipelineContext.processImpl(data: MsgType0x2DC) {\n        when (data.kind) {\n            0x0C -> processMute(data)\n            0x0E -> processAllowAnonymousChat(data)\n            0x10 -> processNormalGrayTip(data)\n            0x14 -> processGeneralGrayTip(data)\n        }\n    }\n\n    /**\n     * @see MemberMuteEvent\n     * @see MemberUnmuteEvent\n     * @see GroupMuteAllEvent\n     * @see BotMuteEvent\n     * @see BotUnmuteEvent\n     */\n    private fun NoticePipelineContext.processMute(\n        data: MsgType0x2DC,\n    ) = data.context {\n        fun handleMuteMemberPacket(\n            bot: QQAndroidBot,\n            group: GroupImpl,\n            operator: NormalMember,\n            target: Long,\n            timeSeconds: Int,\n        ): Packet? {\n            if (target == 0L) {\n                val new = timeSeconds != 0\n                if (group.settings.isMuteAllField == new) {\n                    return null\n                }\n                group.settings.isMuteAllField = new\n                return GroupMuteAllEvent(!new, new, group, operator)\n            }\n\n            if (target == bot.id) {\n                return when {\n                    group.botMuteRemaining == timeSeconds -> null\n                    timeSeconds == 0 || timeSeconds == 0xFFFF_FFFF.toInt() -> {\n                        group.botAsMember.checkIsMemberImpl()._muteTimestamp = 0\n                        BotUnmuteEvent(operator)\n                    }\n                    else -> {\n                        group.botAsMember.checkIsMemberImpl()._muteTimestamp =\n                            currentTimeSeconds().toInt() + timeSeconds\n                        BotMuteEvent(timeSeconds, operator)\n                    }\n                }\n            }\n\n            val member = group[target] ?: return null\n            member.checkIsMemberImpl()\n\n            if (member.muteTimeRemaining == timeSeconds) return null\n\n            member._muteTimestamp = currentTimeSeconds().toInt() + timeSeconds\n            return if (timeSeconds == 0) MemberUnmuteEvent(member, operator)\n            else MemberMuteEvent(member, timeSeconds, operator)\n        }\n\n        markAsConsumed()\n\n        buf.read {\n            val operatorUin = readInt().toUInt().toLong()\n            if (operatorUin == bot.id) return\n            val operator = group[operatorUin] ?: return\n            readInt().toUInt().toLong() // time\n            val length = readShort().toUShort().toInt()\n            repeat(length) {\n                val target = readInt().toUInt().toLong()\n                val timeSeconds = readInt().toUInt()\n                collected += handleMuteMemberPacket(bot, group, operator, target, timeSeconds.toInt())\n            }\n        }\n    }\n\n    /**\n     * @see GroupAllowAnonymousChatEvent\n     */\n    private fun NoticePipelineContext.processAllowAnonymousChat(\n        data: MsgType0x2DC,\n    ) = data.context {\n        markAsConsumed()\n        buf.read {\n            val operator = group[readInt().toUInt().toLong()] ?: return\n            val new = readInt() == 0\n            if (group.settings.isAnonymousChatEnabledField == new) return\n\n            group.settings.isAnonymousChatEnabledField = new\n            collect(GroupAllowAnonymousChatEvent(!new, new, group, operator))\n        }\n    }\n\n    /**\n     * @see GroupAllowConfessTalkEvent\n     * @see MemberSpecialTitleChangeEvent\n     */\n    //gray tip: 聊天中的灰色小框系统提示信息（无通用模板，为混合xml代码的文本）\n    private fun NoticePipelineContext.processNormalGrayTip(\n        data: MsgType0x2DC,\n    ) = data.context {\n        val proto = data.buf.loadAs(TroopTips0x857.NotifyMsgBody.serializer(), offset = 1)\n        markAsConsumed()\n        when (proto.optEnumType) {\n            1 -> {\n                val tipsInfo = proto.optMsgGraytips ?: return\n\n                val message = tipsInfo.optBytesContent.decodeToString()\n                when (tipsInfo.robotGroupOpt) {\n                    // 非机器人信息\n                    0 -> {\n                        //坦白说开关\n                        if (message.endsWith(\"群聊坦白说\")) {\n                            val new = when (message) {\n                                \"管理员已关闭群聊坦白说\" -> false\n                                \"管理员已开启群聊坦白说\" -> true\n                                else -> {\n                                    logger.debug { \"Unknown server confess talk messages $message\" }\n                                    return\n                                }\n                            }\n                            collect(\n                                GroupAllowConfessTalkEvent(\n                                    origin = !new,\n                                    new = new,\n                                    group = group,\n                                    isByBot = false\n                                )\n                            )\n                            //群特殊头衔授予\n                        } else if (message.endsWith(\">头衔\")) {\n                            message.parseToMessageDataList().let { seq ->\n                                if (seq.count() == 2) {\n                                    val uin = seq.first().data.toLong()\n                                    val newTitle = seq.last().text\n                                    val member = group.getMember(uin) ?: return@let\n                                    member.checkIsMemberImpl()\n                                    collect(\n                                        MemberSpecialTitleChangeEvent(\n                                            member.specialTitle,\n                                            newTitle,\n                                            member,\n                                            group.owner\n                                        )\n                                    )\n                                    member._specialTitle = newTitle\n                                } else {\n                                    logger.debug { \"Unknown server special title messages $message\" }\n                                    return\n                                }\n\n                            }\n                        }\n                    }\n                }\n            }\n            else -> markNotConsumed()\n        }\n    }\n\n\n    /**\n     * @see NudgeEvent\n     * @see MemberHonorChangeEvent\n     * @see GroupTalkativeChangeEvent\n     */\n    // general gray tip: 聊天中的灰色小框系统提示信息（有通用模板）\n    private fun NoticePipelineContext.processGeneralGrayTip(\n        data: MsgType0x2DC,\n    ) = data.context {\n\n        val grayTip = buf.loadAs(TroopTips0x857.NotifyMsgBody.serializer(), 1).optGeneralGrayTip\n        markAsConsumed()\n        when (grayTip?.templId) {\n            // 群戳一戳\n            10043L, 1133L, 1132L, 1134L, 1135L, 1136L -> {\n                \n                fun String.findUser(): UserOrBot? {\n                    return if (this == bot.id.toString()) {\n                        group.botAsMember\n                    } else {\n                        this.findMember() ?: this.findFriendOrStranger()\n                    }\n                }\n                \n                // group nudge\n                // 预置数据，服务器将不会提供己方已知消息\n                val action = grayTip.msgTemplParam[\"action_str\"].orEmpty()\n                val from = grayTip.msgTemplParam[\"uin_str1\"]\n                val target = grayTip.msgTemplParam[\"uin_str2\"]\n                val suffix = grayTip.msgTemplParam[\"suffix_str\"].orEmpty()\n\n                val fromUser = from?.findUser()\n                val targetUser = target?.findUser()\n\n                if (fromUser == null || targetUser == null) {\n                    markNotConsumed()\n                    logger.debug {\n                        \"Cannot find from or target in Transformers528 0x14 template\\ntemplId=${grayTip.templId}\\nPermList=${grayTip.msgTemplParam.structureToString()}\"\n                    }\n                } else {\n                    collected += NudgeEvent(\n                            from = fromUser,\n                            target = targetUser,\n                            action = action,\n                            suffix = suffix,\n                            subject = group,\n                    )\n                }\n            }\n            // 群签到/打卡\n            10036L, 10038L -> {\n                val user = grayTip.msgTemplParam[\"mqq_uin\"]?.findMember() ?: group.botAsMember\n                val sign = grayTip.msgTemplParam[\"user_sign\"].orEmpty()\n                val img = grayTip.msgTemplParam[\"rank_img\"]\n                val rank = \"\"\"今日第(\\d+)个打卡\"\"\".toRegex().matchEntire(sign)?.groupValues?.get(1)?.toInt()\n\n                collected += SignEvent(\n                    user = user,\n                    sign = sign,\n                    hasRank = img != null,\n                    rank = rank\n                )\n            }\n            // 龙王\n            10093L, 10094L, 1053L, 1054L, 1103L -> {\n                val now = grayTip.msgTemplParam[\"uin\"]?.findMember() ?: group.botAsMember\n                val previous = grayTip.msgTemplParam[\"uin_last\"]?.findMember()\n\n                val lastTalkative = group.lastTalkative\n                if (lastTalkative == now) return // duplicate\n                if (!group.casLastTalkative(lastTalkative, now)) return\n\n                if (previous == null) {\n                    collect(MemberHonorChangeEvent.Achieve(now, GroupHonorType.TALKATIVE))\n                } else {\n                    collect(GroupTalkativeChangeEvent(group, now, previous))\n                    collect(MemberHonorChangeEvent.Lose(previous, GroupHonorType.TALKATIVE))\n                    collect(MemberHonorChangeEvent.Achieve(now, GroupHonorType.TALKATIVE))\n                }\n            }\n            // 群聊之火\n            1052L, 1129L -> {\n                val now = grayTip.msgTemplParam[\"uin\"]?.findMember() ?: group.botAsMember\n\n                now.info.honors += GroupHonorType.PERFORMER\n                collect(MemberHonorChangeEvent.Achieve(now, GroupHonorType.PERFORMER))\n            }\n            // 群聊炽焰\n            1055L -> {\n                val now = grayTip.msgTemplParam[\"uin\"]?.findMember() ?: group.botAsMember\n\n                now.info.honors -= GroupHonorType.PERFORMER\n                now.info.honors += GroupHonorType.LEGEND\n                collect(MemberHonorChangeEvent.Lose(now, GroupHonorType.PERFORMER))\n                collect(MemberHonorChangeEvent.Achieve(now, GroupHonorType.LEGEND))\n            }\n            // 快乐源泉\n            1067L -> {\n                val now = grayTip.msgTemplParam[\"uin\"]?.findMember() ?: group.botAsMember\n\n                now.info.honors += GroupHonorType.EMOTION\n                collect(MemberHonorChangeEvent.Achieve(now, GroupHonorType.EMOTION))\n            }\n            // 善财福禄寿\n            10111L -> {\n                val now = grayTip.msgTemplParam[\"uin\"]?.findMember() ?: group.botAsMember\n                val previous = grayTip.msgTemplParam[\"uin_last\"]?.findMember()\n\n                if (previous == null) {\n                    collect(MemberHonorChangeEvent.Achieve(now, GroupHonorType.RED_PACKET))\n                } else {\n                    // 善财福禄寿 也是唯一的, 也许要加 新事件\n                    collect(MemberHonorChangeEvent.Lose(previous, GroupHonorType.RED_PACKET))\n                    collect(MemberHonorChangeEvent.Achieve(now, GroupHonorType.RED_PACKET))\n                }\n            }\n            //\n            else -> {\n                markNotConsumed()\n                logger.debug {\n                    \"Unknown Transformers528 0x14 template\\ntemplId=${grayTip?.templId}\\nPermList=${grayTip?.msgTemplParam?.structureToString()}\"\n                }\n            }\n        }\n    }\n}\n\ninternal operator fun List<TroopTips0x857.TemplParam>.get(name: String) = this.findLast { it.name == name }?.value\n\n@JvmName(\"get2\")\ninternal operator fun List<Submsgtype0x122.Submsgtype0x122.TemplParam>.get(name: String) =\n    this.findLast { it.name == name }?.value\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/notice/group/GroupOrMemberListNoticeProcessor.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.notice.group\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.sync.withLock\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.contact.MemberPermission.*\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.internal.contact.addNewNormalMember\nimport net.mamoe.mirai.internal.contact.info.MemberInfoImpl\nimport net.mamoe.mirai.internal.getGroupByCodeOrUin\nimport net.mamoe.mirai.internal.getGroupByUin\nimport net.mamoe.mirai.internal.getGroupByUinOrCode\nimport net.mamoe.mirai.internal.message.contextualBugReportException\nimport net.mamoe.mirai.internal.network.components.ContactUpdater\nimport net.mamoe.mirai.internal.network.components.MixedNoticeProcessor\nimport net.mamoe.mirai.internal.network.components.NoticePipelineContext\nimport net.mamoe.mirai.internal.network.notice.decoders.DecodedNotifyMsgBody\nimport net.mamoe.mirai.internal.network.protocol.data.jce.MsgType0x210\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.data.proto.OnlinePushTrans\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Submsgtype0x44\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.internal.utils.parseToMessageDataList\nimport net.mamoe.mirai.internal.utils.toMemberInfo\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.context\nimport net.mamoe.mirai.utils.read\nimport net.mamoe.mirai.utils.structureToString\n\n\n/**\n * Member/Bot invited/active join // force/active leave\n * Member/Bot permission change\n *\n * @see BotJoinGroupEvent\n * @see MemberJoinEvent\n *\n * @see BotLeaveEvent\n * @see MemberLeaveEvent\n *\n * @see MemberPermissionChangeEvent\n * @see BotGroupPermissionChangeEvent\n *\n * @see BotInvitedJoinGroupRequestEvent\n * @see MemberJoinRequestEvent\n */\ninternal class GroupOrMemberListNoticeProcessor(\n    private val logger: MiraiLogger,\n) : MixedNoticeProcessor() {\n\n    override suspend fun NoticePipelineContext.processImpl(data: MsgType0x210) {\n        if (data.uSubMsgType != 0x44L) return\n        markAsConsumed()\n        val msg = data.vProtobuf.loadAs(Submsgtype0x44.Submsgtype0x44.MsgBody.serializer())\n        if (msg.msgGroupMsgSync == null) return\n\n        when (msg.msgGroupMsgSync.msgType) {\n            1, 2 -> {\n                bot.components[ContactUpdater].groupListModifyLock.withLock {\n                    bot.addNewGroupByCode(msg.msgGroupMsgSync.grpCode)?.let {\n                        collect(BotJoinGroupEvent.Active(it))\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * @see MemberJoinEvent.Invite\n     * @see MemberLeaveEvent.Quit\n     */\n    override suspend fun NoticePipelineContext.processImpl(data: DecodedNotifyMsgBody) = data.context {\n        val proto = data.buf\n        if (proto.optEnumType != 1) return\n        val tipsInfo = proto.optMsgGraytips ?: return\n\n        val message = tipsInfo.optBytesContent.decodeToString()\n        // 机器人信息\n        markAsConsumed()\n        when (tipsInfo.robotGroupOpt) {\n            // 添加\n            1 -> {\n                val dataList = message.parseToMessageDataList()\n                val invitor = dataList.first().let { messageData ->\n                    group[messageData.data.toLong()] ?: return\n                }\n                val member = dataList.last().let { messageData ->\n                    group.addNewNormalMember(messageData.toMemberInfo()) ?: return\n                }\n                collect(MemberJoinEvent.Invite(member, invitor))\n            }\n            // 移除\n            2 -> {\n                message.parseToMessageDataList().first().let {\n                    val member = group.getOrFail(it.data.toLong())\n                    group.members.delegate.remove(member)\n                    collect(MemberLeaveEvent.Quit(member))\n                }\n            }\n            else -> markNotConsumed()\n        }\n    }\n\n    /**\n     * @see MemberJoinEvent.Invite\n     * @see BotJoinGroupEvent.Invite\n     * @see MemberJoinEvent.Active\n     * @see BotJoinGroupEvent.Active\n     */\n    override suspend fun NoticePipelineContext.processImpl(data: MsgComm.Msg) = data.context {\n        bot.components[ContactUpdater].groupListModifyLock.withLock {\n            when (data.msgHead.msgType) {\n                33 -> processGroupJoin33(data)\n                34 -> Unit // 34 与 33 重复, 忽略 34\n                38 -> processGroupJoin38(data)\n                85 -> processGroupJoin85(data)\n                else -> return\n            }\n            markAsConsumed()\n        }\n    }\n\n    // 33\n    private suspend fun NoticePipelineContext.processGroupJoin33(data: MsgComm.Msg) = data.context {\n        msgBody.msgContent.read {\n            val groupCode = readInt().toUInt().toLong()\n            if (remaining < 5) return\n            discardExact(1)\n            val joinedMemberUin = readInt().toUInt().toLong()\n\n            if (joinedMemberUin == bot.id && bot.getGroupByCodeOrUin(groupCode) != null) return // duplicate\n\n            val group = bot.getGroupByCodeOrUin(groupCode) ?: bot.addNewGroupByCode(groupCode) ?: return\n            val joinType = readByte().toInt()\n            val invitorUin = readInt().toUInt().toLong()\n            when (joinType) {\n                // 邀请加入\n                -125, 3 -> {\n                    val invitor = group[invitorUin] ?: return\n                    collected += if (joinedMemberUin == bot.id) {\n                        BotJoinGroupEvent.Invite(invitor)\n                    } else {\n                        MemberJoinEvent.Invite(group.addNewNormalMember(getNewMemberInfo()) ?: return, invitor)\n                    }\n                }\n                // 通过群员分享的二维码/直接加入\n                -126, 2 -> {\n                    collected += if (joinedMemberUin == bot.id) {\n                        BotJoinGroupEvent.Active(group)\n                    } else {\n                        MemberJoinEvent.Active(group.addNewNormalMember(getNewMemberInfo()) ?: return)\n                    }\n                }\n                // 忽略\n                else -> {\n                }\n            }\n        }\n        // 邀请入群\n        // package: 27 0B 60 E7 01 CA CC 69 8B 83 44 71 47 90 06 B9 DC C0 ED D4 B1 00 30 33 44 30 42 38 46 30 39 37 32 38 35 43 34 31 38 30 33 36 41 34 36 31 36 31 35 32 37 38 46 46 43 30 41 38 30 36 30 36 45 38 31 43 39 41 34 38 37\n        // package: groupUin + 01 CA CC 69 8B 83 + invitorUin + length(06) + string + magicKey\n\n\n        // 主动入群, 直接加入: msgContent=27 0B 60 E7 01 76 E4 B8 DD 82 3E 03 3F A2 06 B4 B4 BD A8 D5 DF 00 30 42 39 41 30 33 45 38 34 30 39 34 42 46 30 45 32 45 38 42 31 43 43 41 34 32 42 38 42 44 42 35 34 44 42 31 44 32 32 30 46 30 38 39 46 46 35 41 38\n        // 主动直接加入                  27 0B 60 E7 01 76 E4 B8 DD 82 3E 03 3F A2 06 B4 B4 BD A8 D5 DF 00 30 33 30 45 38 42 31 33 46 41 41 31 33 46 38 31 35 34 41 38 33 32 37 31 43 34 34 38 35 33 35 46 45 31 38 32 43 39 42 43 46 46 32 44 39 39 46 41 37\n\n        // 有人被邀请(经过同意后)加入      27 0B 60 E7 01 76 E4 B8 DD 83 3E 03 3F A2 06 B4 B4 BD A8 D5 DF 00 30 34 30 34 38 32 33 38 35 37 41 37 38 46 33 45 37 35 38 42 39 38 46 43 45 44 43 32 41 30 31 36 36 30 34 31 36 39 35 39 30 38 39 30 39 45 31 34 34\n        // 搜索到群, 直接加入             27 0B 60 E7 01 07 6E 47 BA 82 3E 03 3F A2 06 B4 B4 BD A8 D5 DF 00 30 32 30 39 39 42 39 41 46 32 39 41 35 42 33 46 34 32 30 44 36 44 36 39 35 44 38 45 34 35 30 46 30 45 30 38 45 31 41 39 42 46 46 45 32 30 32 34 35\n    }\n\n    // 38\n    private suspend fun NoticePipelineContext.processGroupJoin38(data: MsgComm.Msg) = data.context {\n        if (bot.getGroupByUin(msgHead.fromUin) != null) return\n        bot.addNewGroupByUin(msgHead.fromUin)?.let { collect(BotJoinGroupEvent.Active(it)) }\n    }\n\n    // 85\n    private suspend fun NoticePipelineContext.processGroupJoin85(data: MsgComm.Msg) = data.context {\n        // msgHead.authUin: 处理人\n        if (msgHead.toUin != bot.id) return\n        processGroupJoin38(data)\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Structmsg.StructMsg\n    ///////////////////////////////////////////////////////////////////////////\n\n    override suspend fun NoticePipelineContext.processImpl(data: Structmsg.StructMsg) = data.msg.context {\n        if (this == null) return\n        markAsConsumed()\n        when (subType) {\n            0 -> {\n                if (groupMsgType == 8) {\n                    // #1388: 使用手机TIM邀请入群，我为管理员，成功邀请 bot 入群\n\n                    // 能正常解析 BotInvitedJoinGroupRequestEvent 和 BotJoinGroupEvent.Active, 因此忽略该通知\n                    return\n                } else {\n                    throw contextualBugReportException(\n                        \"解析 NewContact.SystemMsgNewGroup, subType=5, groupMsgType=$groupMsgType\",\n                        data.structureToString(),\n                        null,\n                        \"并描述此时机器人是否被邀请加入群等其他\",\n                    )\n                }\n            }\n\n            // 处理被邀请入群 或 处理成员入群申请\n            1 -> when (groupMsgType) {\n                1 -> {\n                    // 成员申请入群\n                    collected += MemberJoinRequestEvent(\n                        bot, data.msgSeq, msgAdditional,\n                        data.reqUin, groupCode, groupName, reqUinNick\n                    )\n                }\n                2 -> {\n                    // Bot 被邀请入群\n                    collected += BotInvitedJoinGroupRequestEvent(\n                        bot, data.msgSeq, actionUin,\n                        groupCode, groupName, actionUinNick\n                    )\n                }\n                22 -> {\n                    // 成员邀请入群\n                    collected += MemberJoinRequestEvent(\n                        bot, data.msgSeq, msgAdditional,\n                        data.reqUin, groupCode, groupName, reqUinNick, actionUin\n                    )\n                }\n                else -> throw contextualBugReportException(\n                    \"parse SystemMsgNewGroup, subType=1\",\n                    this.structureToString(),\n                    additional = \"并尽量描述此时机器人是否正被邀请加入群, 或者是有有新群员加入此群\"\n                )\n            }\n            2 -> { // 被邀请入群, 自动同意, 不需处理\n\n                //                            val group = bot.getNewGroup(groupCode) ?: return null\n                //                            val invitor = group[actionUin]\n                //\n                //                            BotJoinGroupEvent.Invite(invitor)\n            }\n            3 -> { // 已被请他管理员处理\n            }\n            5 -> {\n                val group = bot.getGroup(groupCode) ?: return\n                when (groupMsgType) {\n                    3 -> {\n                        // https://github.com/mamoe/mirai/issues/651\n                        // msgDescribe=将你设置为管理员\n                        // msgTitle=管理员设置\n                    }\n                    13 -> {\n                        // 成员主动退出, 机器人是管理员, 接到通知\n                        // 但无法获取是哪个成员.\n                    }\n                    7 -> { // 机器人被踢\n                        val operator = group[actionUin] ?: return\n                        collected += BotLeaveEvent.Kick(operator)\n                    }\n                    6 -> {\n                        // 其他管理员踢出了一个群成员, 测试时能正常解析但没有收到 groupMsgType=6 的消息, 但有 issue 收到这些消息\n                        // #1429, #1171, #1263\n\n                        // > 这是历史的群系统消息，实际上可以直接进行忽略，其实只是因为缺失了忽略的处理而已\n                        // https://github.com/mamoe/mirai/issues/1171#issuecomment-907075637\n                    }\n                    16 -> {\n                        // #1467\n                        // 历史消息同步\n                    }\n                    else -> {\n                        throw contextualBugReportException(\n                            \"解析 NewContact.SystemMsgNewGroup, subType=5, groupMsgType=$groupMsgType\",\n                            this.structureToString(),\n                            null,\n                            \"并描述此时机器人是否被踢出群等\",\n                        )\n                    }\n                }\n            }\n            else -> markNotConsumed()\n        }\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // OnlinePushTrans.PbMsgInfo\n    ///////////////////////////////////////////////////////////////////////////\n\n    override suspend fun NoticePipelineContext.processImpl(data: OnlinePushTrans.PbMsgInfo) {\n        markAsConsumed()\n        when (data.msgType) {\n            44 -> data.msgData.read {\n                //                  3D C4 33 DD 01 FF CD 76 F4 03 C3 7E 2E 34\n                //      群转让\n                //      start with  3D C4 33 DD 01 FF\n                //                  3D C4 33 DD 01 FF C3 7E 2E 34 CD 76 F4 03\n                // 权限变更\n                //                  3D C4 33 DD 01 00/01 .....\n                //                  3D C4 33 DD 01 01 C3 7E 2E 34 01\n                discardExact(5)\n                val kind = readByte().toUByte().toInt()\n                if (kind == 0xFF) {\n                    val from = readInt().toUInt().toLong()\n                    val to = readInt().toUInt().toLong()\n\n                    handleGroupOwnershipTransfer(data, from, to)\n                } else {\n                    val var5 = if (kind == 0 || kind == 1) 0 else readInt().toUInt().toInt()\n                    val target = readInt().toUInt().toLong()\n\n                    if (var5 == 0) {\n                        val newPermission = if (remaining == 1L) readByte() else return\n                        handlePermissionChange(data, target, newPermission.toInt())\n                    }\n                }\n            }\n            34 -> {\n                /* quit\n                27 0B 60 E7\n                01\n                2F 55 7C B8\n                82\n                00 30 42 33 32 46 30 38 33 32 39 32 35 30 31 39 33 45 46 32 45 30 36 35 41 35 41 33 42 37 35 43 41 34 46 37 42 38 42 38 42 44 43 35 35 34 35 44 38 30\n                 */\n                /* kick\n                27 0B 60 E7\n                01\n                A8 32 51 A1\n                83 3E 03 3F A2 06 B4 B4 BD A8 D5 DF 00 30 39 32 46 45 30 36 31 41 33 37 36 43 44 35 37 35 37 39 45 37 32 34 44 37 37 30 36 46 39 39 43 35 35 33 33 31 34 44 32 44 46 35 45 42 43 31 31 36\n                 */\n\n                data.msgData.read {\n                    readInt().toUInt().toLong() // groupCode\n                    readByte().toInt() // follow type\n                    val target = readInt().toUInt().toLong()\n                    val kind = readByte().toUByte().toInt()\n                    val operator = readInt().toUInt().toLong()\n                    val groupUin = data.fromUin\n                    handleLeave(target, kind, operator, groupUin)\n                }\n            }\n            else -> markNotConsumed()\n        }\n    }\n\n    private fun NoticePipelineContext.handleLeave(\n        target: Long,\n        kind: Int,\n        operator: Long,\n        groupUin: Long,\n    ) {\n        when (kind) {\n            // 01 为bot为群主时解散群\n            1, 0x81 -> bot.getGroupByUinOrCode(groupUin)?.let { group ->\n                collect(BotLeaveEvent.Disband(group))\n                bot.groups.delegate.remove(group)\n                group.cancel(CancellationException(\"Being Disband\"))\n            }\n            2, 0x82 -> bot.getGroupByUinOrCode(groupUin)?.let { group ->\n                if (target == bot.id) {\n                    collect(BotLeaveEvent.Active(group))\n                    bot.groups.delegate.remove(group)\n                    group.cancel(CancellationException(\"Left actively\"))\n                } else {\n                    val member = group[target] ?: return\n                    collect(MemberLeaveEvent.Quit(member))\n                    group.members.delegate.remove(member)\n                    member.cancel(CancellationException(\"Left actively\"))\n                }\n            }\n            // 03 包括 bot 是群主, 管理员踢出群成员\n            3, 0x83 -> bot.getGroupByUinOrCode(groupUin)?.let { group ->\n                if (target == bot.id) {\n                    val member = group.members[operator] ?: return\n                    collect(BotLeaveEvent.Kick(member))\n                    bot.groups.delegate.remove(group)\n                    group.cancel(CancellationException(\"Being kicked\"))\n                } else {\n                    val member = group[target] ?: return\n                    collect(MemberLeaveEvent.Kick(member, group.members[operator]))\n                    group.members.delegate.remove(member)\n                    member.cancel(CancellationException(\"Being kicked\"))\n                }\n            }\n        }\n    }\n\n    /**\n     * Group owner changes permission of a member, when bot is a member.\n     *\n     * @see BotGroupPermissionChangeEvent\n     * @see MemberPermissionChangeEvent\n     */\n    private fun NoticePipelineContext.handlePermissionChange(\n        data: OnlinePushTrans.PbMsgInfo,\n        target: Long,\n        newPermissionByte: Int,\n    ) {\n        val group = bot.getGroupByUinOrCode(data.fromUin) ?: return\n\n        val newPermission = if (newPermissionByte == 1) ADMINISTRATOR else MEMBER\n\n        if (target == bot.id) {\n            if (group.botPermission == newPermission) return\n\n            collect(BotGroupPermissionChangeEvent(group, group.botPermission, newPermission))\n            group.botAsMember.permission = newPermission\n        } else {\n            val member = group[target] ?: return\n            if (member.permission == newPermission) return\n\n            collect(MemberPermissionChangeEvent(member, member.permission, newPermission))\n            member.permission = newPermission\n        }\n    }\n\n    /**\n     * Owner of the group [from] transfers ownership to another member [to], or retrieve ownership.\n     */\n    private suspend fun NoticePipelineContext.handleGroupOwnershipTransfer(\n        data: OnlinePushTrans.PbMsgInfo,\n        from: Long,\n        to: Long,\n    ) {\n        val group = bot.getGroupByUinOrCode(data.fromUin)\n        if (from == bot.id) {\n            // bot -> member\n            group ?: return markAsConsumed()\n\n            // Bot permission changed to MEMBER\n            if (group.botPermission != MEMBER) {\n                collect(BotGroupPermissionChangeEvent(group, group.botPermission, MEMBER))\n                group.botAsMember.permission = MEMBER\n            }\n\n            // member Retrieve or permission changed to OWNER\n            var newOwner = group[to]\n            if (newOwner == null) {\n                val nick = Mirai.queryProfile(bot, to).nickname\n                newOwner = group.addNewNormalMember(MemberInfoImpl(uin = to, nick = nick, permission = OWNER)) ?: return\n                collect(MemberJoinEvent.Retrieve(newOwner))\n            } else if (newOwner.permission != OWNER) {\n                collect(MemberPermissionChangeEvent(newOwner, newOwner.permission, OWNER))\n                newOwner.permission = OWNER\n            }\n        } else {\n            // member -> member/bot\n\n            // bot Retrieve or permission changed to OWNER\n            if (group == null) { // TODO: 2021/8/25 test this\n                collect(BotJoinGroupEvent.Retrieve(bot.addNewGroupByUin(data.fromUin) ?: return))\n                return\n            }\n\n            // member permission changed to MEMBER\n            val member = group[from]\n            if (member != null && member.permission != MEMBER) {\n                collect(MemberPermissionChangeEvent(member, member.permission, MEMBER))\n                member.permission = MEMBER\n            } else {\n                // if member is null, he has already quit the group in another event.\n            }\n\n            if (to == bot.id) {\n                // member -> bot\n                if (group.botPermission != OWNER) {\n                    collect(BotGroupPermissionChangeEvent(group, group.botPermission, OWNER))\n                    group.botAsMember.permission = OWNER\n                }\n            } else {\n                // member -> member\n                group[to]?.let { newOwner ->\n                    if (newOwner.permission != OWNER) {\n                        collect(MemberPermissionChangeEvent(newOwner, newOwner.permission, OWNER))\n                    }\n                    newOwner.permission = OWNER\n                }\n            }\n        }\n    }\n\n\n    // backup, copied from old code\n    /*\n    34 -> { // 主动入群\n\n        // 回答了问题, 还需要管理员审核\n        // msgContent=27 0B 60 E7 01 76 E4 B8 DD 82 00 30 45 41 31 30 35 35 42 44 39 39 42 35 37 46 44 31 41 31 46 36 42 43 42 43 33 43 42 39 34 34 38 31 33 34 42 36 31 46 38 45 43 39 38 38 43 39 37 33\n        // msgContent=27 0B 60 E7 01 76 E4 B8 DD 02 00 30 44 44 41 43 44 33 35 43 31 39 34 30 46 42 39 39 34 46 43 32 34 43 39 32 33 39 31 45 42 35 32 33 46 36 30 37 35 42 41 38 42 30 30 37 42 36 42 41\n        // 回答正确问题, 直接加入\n\n        //            27 0B 60 E7 01 76 E4 B8 DD 82 00 30 43 37 37 39 41 38 32 44 38 33 30 35 37 38 31 33 37 45 42 39 35 43 42 45 36 45 43 38 36 34 38 44 34 35 44 42 33 44 45 37 34 41 36 30 33 37 46 45\n        // 提交验证消息加入, 需要审核\n\n        // 被踢了??\n        // msgContent=27 0B 60 E7 01 76 E4 B8 DD 83 3E 03 3F A2 06 B4 B4 BD A8 D5 DF 00 30 46 46 32 33 36 39 35 33 31 37 42 44 46 37 43 36 39 34 37 41 45 38 39 43 45 43 42 46 33 41 37 35 39 34 39 45 36 37 33 37 31 41 39 44 33 33 45 33\n\n        /*\n        // 搜索后直接加入群\n\n        soutv 17:43:32 : 33类型的content = 27 0B 60 E7 01 07 6E 47 BA 82 3E 03 3F A2 06 B4 B4 BD A8 D5 DF 00 30 32 30 39 39 42 39 41 46 32 39 41 35 42 33 46 34 32 30 44 36 44 36 39 35 44 38 45 34 35 30 46 30 45 30 38 45 31 41 39 42 46 46 45 32 30 32 34 35\n        soutv 17:43:32 : 主动入群content = 2A 3D F5 69 01 35 D7 10 EA 83 4C EF 4F DD 06 B9 DC C0 ED D4 B1 00 30 37 41 39 31 39 34 31 41 30 37 46 38 32 31 39 39 43 34 35 46 39 30 36 31 43 37 39 37 33 39 35 43 34 44 36 31 33 43 31 35 42 37 32 45 46 43 43 36\n         */\n\n        val group = bot.getGroupByUinOrNull(msgHead.fromUin)\n        group ?: return\n\n        msgBody.msgContent.soutv(\"主动入群content\")\n\n        if (msgBody.msgContent.read {\n                discardExact(4) // group code\n                discardExact(1) // 1\n                discardExact(4) // requester uin\n                readByte().toInt().and(0xff)\n                // 0x02: 回答正确问题直接加入\n                // 0x82: 回答了问题, 或者有验证消息, 需要管理员审核\n                // 0x83: 回答正确问题直接加入\n            } != 0x82) {\n\n            if (group.members.contains(msgHead.authUin)) {\n                return\n            }\n            @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n            return MemberJoinEvent.Active(group.newMember(getNewMemberInfo())\n                .also { group.members.delegate.addLast(it) })\n        } else return\n    }\n    */\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/notice/group/GroupRecallProcessor.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.notice.group\n\nimport net.mamoe.mirai.event.events.MessageRecallEvent\nimport net.mamoe.mirai.internal.network.components.MixedNoticeProcessor\nimport net.mamoe.mirai.internal.network.components.NoticePipelineContext\nimport net.mamoe.mirai.internal.network.notice.decoders.MsgType0x2DC\nimport net.mamoe.mirai.internal.network.protocol.data.proto.TroopTips0x857\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.utils.mapToIntArray\n\ninternal class GroupRecallProcessor : MixedNoticeProcessor() {\n    override suspend fun NoticePipelineContext.processImpl(data: MsgType0x2DC) {\n        val (kind, group, buf) = data\n        if (kind != 0x11) return\n\n        val proto = buf.loadAs(TroopTips0x857.NotifyMsgBody.serializer(), 1)\n\n        val recallReminder = proto.optMsgRecall ?: return\n        val operator = group[recallReminder.uin] ?: return\n        markAsConsumed()\n        for (firstPkg in recallReminder.recalledMsgList) {\n            if (firstPkg.authorUin == bot.id && operator.id == bot.id) continue // already broadcast\n            val author = group[firstPkg.authorUin] ?: continue\n\n            collected += MessageRecallEvent.GroupRecall(\n                bot = bot,\n                authorId = firstPkg.authorUin,\n                messageIds = recallReminder.recalledMsgList.mapToIntArray { it.seq },\n                messageInternalIds = recallReminder.recalledMsgList.mapToIntArray { it.msgRandom },\n                messageTime = firstPkg.time,\n                operator = operator,\n                group = group,\n                author = author,\n            )\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/notice/priv/FriendGroupNoticeProcessor.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.notice.priv\n\nimport net.mamoe.mirai.internal.contact.friendgroup.FriendGroupImpl\nimport net.mamoe.mirai.internal.contact.friendgroup.impl\nimport net.mamoe.mirai.internal.contact.impl\nimport net.mamoe.mirai.internal.contact.info.FriendGroupInfo\nimport net.mamoe.mirai.internal.network.components.MixedNoticeProcessor\nimport net.mamoe.mirai.internal.network.components.NoticePipelineContext\nimport net.mamoe.mirai.internal.network.notice.NewContactSupport\nimport net.mamoe.mirai.internal.network.protocol.data.jce.MsgType0x210\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Submsgtype0x27\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.context\nimport net.mamoe.mirai.utils.error\nimport net.mamoe.mirai.utils.warning\n\ninternal class FriendGroupNoticeProcessor(\n    private val logger: MiraiLogger,\n) : MixedNoticeProcessor(), NewContactSupport {\n\n    override suspend fun NoticePipelineContext.processImpl(data: MsgType0x210) = data.context {\n        when (data.uSubMsgType) {\n            0x27L -> {\n                val body = vProtobuf.loadAs(Submsgtype0x27.SubMsgType0x27.SubMsgType0x27MsgBody.serializer())\n                for (msgModInfo in body.msgModInfos) {\n                    markAsConsumed(msgModInfo)\n                    when {\n                        msgModInfo.msgModFriendGroup != null -> handleFriendGroupChanged(\n                            msgModInfo.msgModFriendGroup, logger\n                        )\n                        msgModInfo.msgModGroupName != null -> handleFriendGroupNameChanged(\n                            msgModInfo.msgModGroupName, logger\n                        )\n                        msgModInfo.msgDelGroup != null -> handleDelGroup(msgModInfo.msgDelGroup, logger)\n                        msgModInfo.msgAddGroup != null -> handleAddGroup(msgModInfo.msgAddGroup)\n                        else -> markNotConsumed(msgModInfo)\n                    }\n                }\n            }\n        }\n    }\n\n    private fun NoticePipelineContext.handleAddGroup(\n        addGroup: Submsgtype0x27.SubMsgType0x27.AddGroup\n    ) {\n        bot.friendGroups.friendGroups.add(\n            FriendGroupImpl(\n                bot,\n                FriendGroupInfo(addGroup.groupid, addGroup.groupname.decodeToString())\n            )\n        )\n    }\n\n    private fun NoticePipelineContext.handleDelGroup(\n        delGroup: Submsgtype0x27.SubMsgType0x27.DelGroup, logger: MiraiLogger\n    ) {\n        bot.friendGroups[delGroup.groupid]?.let { friendGroup ->\n            friendGroup.friends.forEach {\n                it.impl().info.friendGroupId = 0\n            }\n            bot.friendGroups.friendGroups.remove(friendGroup)\n        } ?: let {\n            logger.warning { \"Detected friendGroup(id=${delGroup.groupid}) was removed but it isn't available in bot's friendGroups list\" }\n            return\n        }\n    }\n\n    private fun NoticePipelineContext.handleFriendGroupNameChanged(\n        modFriendGroup: Submsgtype0x27.SubMsgType0x27.ModGroupName, logger: MiraiLogger\n    ) {\n        bot.friendGroups[modFriendGroup.groupid]?.let {\n            it.impl().name = modFriendGroup.groupname.decodeToString()\n        } ?: let {\n            logger.warning { \"Detected friendGroup(id=${modFriendGroup.groupid}) was renamed but it cannot be found in bot's friendGroups list\" }\n            return\n        }\n    }\n\n    private fun NoticePipelineContext.handleFriendGroupChanged(\n        modFriendGroup: Submsgtype0x27.SubMsgType0x27.ModFriendGroup,\n        logger: MiraiLogger\n    ) {\n        modFriendGroup.msgFrdGroup.forEach { body ->\n            val friend = bot.getFriend(body.fuin) ?: let {\n                logger.error { \"Detected friend(id=${body.fuin}) was moved to friendGroup(id=${body.uint32NewGroupId}) but friend not found in bot's friends list\" }\n                return\n            }\n            if (friend.impl().info.friendGroupId == body.uint32NewGroupId.first()) return@forEach\n            friend.info.friendGroupId = body.uint32NewGroupId.first()\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/notice/priv/FriendNoticeProcessor.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.notice.priv\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.contact.User\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.internal.contact.impl\nimport net.mamoe.mirai.internal.contact.info.FriendInfoImpl\nimport net.mamoe.mirai.internal.contact.info.StrangerInfoImpl\nimport net.mamoe.mirai.internal.contact.toMiraiFriendInfo\nimport net.mamoe.mirai.internal.network.components.MixedNoticeProcessor\nimport net.mamoe.mirai.internal.network.components.NoticePipelineContext\nimport net.mamoe.mirai.internal.network.components.NoticePipelineContext.Companion.msgInfo\nimport net.mamoe.mirai.internal.network.notice.NewContactSupport\nimport net.mamoe.mirai.internal.network.notice.group.get\nimport net.mamoe.mirai.internal.network.protocol.data.jce.MsgType0x210\nimport net.mamoe.mirai.internal.network.protocol.data.proto.FrdSysMsg\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Submsgtype0x115.SubMsgType0x115\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Submsgtype0x122\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Submsgtype0x27.SubMsgType0x27.*\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Submsgtype0x44.Submsgtype0x44\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Submsgtype0xb3.SubMsgType0xb3\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.NewContact\nimport net.mamoe.mirai.internal.network.protocol.packet.list.FriendList.GetFriendGroupList\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.utils.*\n\n/**\n * All [FriendEvent] except [FriendMessageEvent]\n *\n * @see FriendInputStatusChangedEvent\n * @see FriendAddEvent\n * @see StrangerRelationChangeEvent.Friended\n */\ninternal class FriendNoticeProcessor(\n    private val logger: MiraiLogger,\n) : MixedNoticeProcessor(), NewContactSupport {\n    override suspend fun NoticePipelineContext.processImpl(data: MsgComm.Msg) = data.context {\n        if (msgHead.msgType != 191) return\n\n        var fromGroup = 0L\n        var pbNick = \"\"\n        msgBody.msgContent.read {\n            readByte().toUByte() // version\n            discardExact(readByte().toUByte().toInt()) //skip\n            readShort().toUShort() //source id\n            readShort().toUShort() //SourceSubID\n            discardExact(readShort().toUShort().toLong()) //skip size\n            if (readShort().toUShort().toInt() != 0) { //hasExtraInfo\n                discardExact(readShort().toUShort().toInt()) //mail address info, skip\n            }\n            discardExact(4 + readShort().toUShort().toInt()) //skip\n            for (i in 1..readByte().toUByte().toInt()) { //pb size\n                val type = readShort().toUShort().toInt()\n                val pbArray = ByteArray(readShort().toUShort().toInt() and 0xFF)\n                readAvailable(pbArray)\n                when (type) {\n                    1000 -> pbArray.loadAs(FrdSysMsg.GroupInfo.serializer()).let { fromGroup = it.groupUin }\n                    1002 -> pbArray.loadAs(FrdSysMsg.FriendMiscInfo.serializer())\n                        .let { pbNick = it.fromuinNick }\n\n                    else -> {\n                    } //ignore\n                }\n            }\n        }\n\n        msgHead.context {\n            // 对方 qq\n            val id = longArrayOf(fromUin, authUin).firstOrNull { it != 0L && it != bot.id }\n            if (id == null) {\n                logger.error { \"Could not determine uin for new stranger\" }\n                return\n            }\n            if (bot.getStranger(id) != null) return\n\n            val nick = fromNick.ifEmpty { authNick }.ifEmpty { pbNick }\n            collect(StrangerAddEvent(bot.addNewStranger(StrangerInfoImpl(id, nick, fromGroup)) ?: return))\n            //同时需要请求好友验证消息（有新请求需要同意）\n            bot.network.sendWithoutExpect(NewContact.SystemMsgNewFriend(bot.client))\n        }\n\n    }\n\n    override suspend fun NoticePipelineContext.processImpl(data: MsgType0x210) = data.context {\n        markAsConsumed()\n        when (data.uSubMsgType) {\n            0xB3L -> {\n                // 08 01 12 52 08 A2 FF 8C F0 03 10 00 1D 15 3D 90 5E 22 2E E6 88 91 E4 BB AC E5 B7 B2 E7 BB 8F E6 98 AF E5 A5 BD E5 8F 8B E5 95 A6 EF BC 8C E4 B8 80 E8 B5 B7 E6 9D A5 E8 81 8A E5 A4 A9 E5 90 A7 21 2A 09 48 69 6D 31 38 38 6D 6F 65 30 07 38 03 48 DD F1 92 B7 07\n                val body: SubMsgType0xb3.MsgBody = vProtobuf.loadAs(SubMsgType0xb3.MsgBody.serializer())\n                handleFriendAddedB(data, body)\n            }\n\n            0x44L -> {\n                val body = vProtobuf.loadAs(Submsgtype0x44.MsgBody.serializer())\n                handleFriendAddedA(body)\n            }\n\n            0x27L -> {\n                val body = vProtobuf.loadAs(SubMsgType0x27MsgBody.serializer())\n                for (msgModInfo in body.msgModInfos) {\n                    when {\n                        msgModInfo.msgModFriendRemark != null -> handleRemarkChanged(msgModInfo.msgModFriendRemark)\n                        msgModInfo.msgDelFriend != null -> handleFriendDeleted(msgModInfo.msgDelFriend)\n                        msgModInfo.msgModCustomFace != null -> handleAvatarChanged(msgModInfo.msgModCustomFace)\n                        msgModInfo.msgModProfile != null -> handleProfileChanged(msgModInfo.msgModProfile)\n                    }\n                }\n            }\n\n            0x115L -> {\n                val body = vProtobuf.loadAs(SubMsgType0x115.MsgBody.serializer())\n                handleInputStatusChanged(body)\n            }\n\n            0x122L -> {\n                val body = vProtobuf.loadAs(Submsgtype0x122.Submsgtype0x122.MsgBody.serializer())\n                when (body.templId) {\n                    //戳一戳\n                    1132L, 1133L, 1134L, 1135L, 1136L, 10043L -> handlePrivateNudge(body)\n                }\n            }\n\n            0x8AL -> {\n                val body = vProtobuf.loadAs(Sub8A.serializer())\n                processFriendRecall(body)\n            }\n\n            else -> markNotConsumed()\n        }\n    }\n\n\n    @Serializable\n    private class Wording(\n        @ProtoNumber(1) val itemID: Int = 0,\n        @ProtoNumber(2) val itemName: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    private class Sub8AMsgInfo(\n        @ProtoNumber(1) val fromUin: Long,\n        @ProtoNumber(2) val botUin: Long,\n        @ProtoNumber(3) val srcId: Int,\n        @ProtoNumber(4) val srcInternalId: Long,\n        @ProtoNumber(5) val time: Long,\n        // see #2784\n//        @ProtoNumber(6) val random: Int,\n//        @ProtoNumber(7) val pkgNum: Int, // 1\n//        @ProtoNumber(8) val pkgIndex: Int, // 0\n//        @ProtoNumber(9) val devSeq: Int, // 0\n//        @ProtoNumber(12) val flag: Int, // 1\n//        @ProtoNumber(13) val wording: Wording,\n    ) : ProtoBuf\n\n    @Serializable\n    private class Sub8A(\n        @ProtoNumber(1) val msgInfo: List<Sub8AMsgInfo>,\n        @ProtoNumber(2) val appId: Int, // 1\n        @ProtoNumber(3) val instId: Int, // 1\n        @ProtoNumber(4) val longMessageFlag: Int, // 0\n        @ProtoNumber(5) val reserved: ByteArray? = null, // struct{ boolean(1), boolean(2) }\n    ) : ProtoBuf\n\n    private fun NoticePipelineContext.processFriendRecall(body: Sub8A) {\n        for (info in body.msgInfo) {\n            if (info.botUin != bot.id) continue\n            collected += MessageRecallEvent.FriendRecall(\n                bot = bot,\n                messageIds = intArrayOf(info.srcId),\n                messageInternalIds = intArrayOf(info.srcInternalId.toInt()),\n                messageTime = info.time.toInt(),\n                operatorId = info.fromUin,\n                operator = bot.getFriend(info.fromUin) ?: continue,\n            )\n        }\n    }\n\n\n    private fun NoticePipelineContext.handleInputStatusChanged(body: SubMsgType0x115.MsgBody) {\n        val friend = bot.getFriend(body.fromUin) ?: return\n        val item = body.msgNotifyItem ?: return\n        collect(FriendInputStatusChangedEvent(friend, item.eventType == 1))\n    }\n\n    private fun NoticePipelineContext.handleProfileChanged(body: ModProfile) {\n        var containsUnknown = false\n        for (profileInfo in body.msgProfileInfos) {\n            when (profileInfo.field) {\n                20002 -> { // 昵称修改\n                    val to = profileInfo.value\n                    if (body.uin == bot.id) {\n                        val from = bot.nick\n                        if (from == to) continue\n                        collect(BotNickChangedEvent(bot, from, to))\n                        bot.nick = to\n                    } else {\n                        val friend = bot.getFriend(body.uin)?.impl() ?: continue\n                        val from = friend.nick\n                        if (from == to) continue\n                        collect(FriendNickChangedEvent(friend, from, to))\n                        friend.info.nick = to\n                    }\n                }\n\n                else -> containsUnknown = true\n            }\n        }\n        if (body.msgProfileInfos.isEmpty() || containsUnknown) {\n            logger.debug { \"Transformers528 0x27L: ProfileChanged new data: ${body.structureToString()}\" }\n        }\n    }\n\n    private fun NoticePipelineContext.handleRemarkChanged(body: ModFriendRemark) {\n        for (new in body.msgFrdRmk) {\n            val friend = bot.getFriend(new.fuin)?.impl() ?: continue\n\n            collect(FriendRemarkChangeEvent(friend, friend.remark, new.rmkName))\n            friend.info.remark = new.rmkName\n        }\n    }\n\n    private fun NoticePipelineContext.handleAvatarChanged(body: ModCustomFace) {\n        if (body.uin == bot.id) {\n            collect(BotAvatarChangedEvent(bot))\n        } else {\n            collect(FriendAvatarChangedEvent(bot.getFriend(body.uin) ?: return))\n        }\n    }\n\n    private fun NoticePipelineContext.handleFriendDeleted(body: DelFriend) {\n        for (id in body.uint64Uins) {\n            collect(FriendDeleteEvent(bot.removeFriend(id) ?: continue))\n        }\n    }\n\n    private suspend fun NoticePipelineContext.handleFriendAddedA(\n        body: Submsgtype0x44.MsgBody,\n    ) = body.msgFriendMsgSync.context {\n        if (this == null) return\n\n        when (processtype) {\n            3, 9, 10 -> {\n                if (bot.getFriend(fuin) != null) return\n\n\n                val response = bot.network.sendAndExpect(GetFriendGroupList.forSingleFriend(bot.client, fuin))\n                val info = response.friendList.firstOrNull() ?: return\n                collect(\n                    FriendAddEvent(bot.addNewFriendAndRemoveStranger(info.toMiraiFriendInfo()) ?: return),\n                )\n\n            }\n        }\n    }\n\n    private fun NoticePipelineContext.handleFriendAddedB(data: MsgType0x210, body: SubMsgType0xb3.MsgBody) =\n        data.context {\n            val info = FriendInfoImpl(\n                uin = body.msgAddFrdNotify.fuin,\n                nick = body.msgAddFrdNotify.fuinNick,\n                remark = \"\",\n                friendGroupId = 0,\n            )\n\n            val removed = bot.removeStranger(info.uin)\n            val added = bot.addNewFriendAndRemoveStranger(info) ?: return\n            collect(FriendAddEvent(added))\n            if (removed != null) collect(StrangerRelationChangeEvent.Friended(removed, added))\n        }\n\n    private fun NoticePipelineContext.handlePrivateNudge(body: Submsgtype0x122.Submsgtype0x122.MsgBody) {\n        val action = body.msgTemplParam[\"action_str\"].orEmpty()\n        val from = body.msgTemplParam[\"uin_str1\"]?.findFriendOrStranger() ?: bot.asFriend\n        val target = body.msgTemplParam[\"uin_str2\"]?.findFriendOrStranger() ?: bot.asFriend\n        val suffix = body.msgTemplParam[\"suffix_str\"].orEmpty()\n\n        val subject: User = bot.getFriend(msgInfo.lFromUin)\n            ?: bot.getStranger(msgInfo.lFromUin)\n            ?: return\n\n        collected += NudgeEvent(\n            from = if (from.id == bot.id) bot else from,\n            target = if (target.id == bot.id) bot else target,\n            action = action,\n            suffix = suffix,\n            subject = subject,\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/notice/priv/OtherClientNoticeProcessor.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.notice.priv\n\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.sync.withLock\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.contact.ClientKind\nimport net.mamoe.mirai.contact.OtherClientInfo\nimport net.mamoe.mirai.contact.Platform\nimport net.mamoe.mirai.event.events.OtherClientMessageEvent\nimport net.mamoe.mirai.event.events.OtherClientOfflineEvent\nimport net.mamoe.mirai.event.events.OtherClientOnlineEvent\nimport net.mamoe.mirai.internal.contact.appId\nimport net.mamoe.mirai.internal.contact.createOtherClient\nimport net.mamoe.mirai.internal.message.contextualBugReportException\nimport net.mamoe.mirai.internal.message.source.OnlineMessageSourceFromFriendImpl\nimport net.mamoe.mirai.internal.network.components.ContactUpdater\nimport net.mamoe.mirai.internal.network.components.MixedNoticeProcessor\nimport net.mamoe.mirai.internal.network.components.NoticePipelineContext\nimport net.mamoe.mirai.internal.network.handler.logger\nimport net.mamoe.mirai.internal.network.protocol.data.jce.RequestPushStatus\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.data.proto.SubMsgType0x7\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.message.data.PlainText\nimport net.mamoe.mirai.message.data.buildMessageChain\nimport net.mamoe.mirai.utils.context\nimport net.mamoe.mirai.utils.structureToString\n\n/**\n * @see OtherClientOnlineEvent\n * @see OtherClientOfflineEvent\n *\n * @see OtherClientMessageEvent\n */\ninternal class OtherClientNoticeProcessor : MixedNoticeProcessor() {\n    /**\n     * @see OtherClientOnlineEvent\n     * @see OtherClientOfflineEvent\n     */\n    override suspend fun NoticePipelineContext.processImpl(data: RequestPushStatus) {\n        markAsConsumed()\n        bot.components[ContactUpdater].otherClientsLock.withLock {\n            val instanceInfo = data.vecInstanceList?.firstOrNull()\n            val appId = instanceInfo?.iAppId ?: 1\n            when (data.status.toInt()) {\n                1 -> { // online\n                    if (bot.otherClients.any { appId == it.appId }) return\n\n                    suspend fun tryFindInQuery(): OtherClientInfo? {\n                        return Mirai.getOnlineOtherClientsList(bot).find { it.appId == appId }\n                            ?: kotlin.run {\n                                delay(2000) // sometimes server sync slow\n                                Mirai.getOnlineOtherClientsList(bot).find { it.appId == appId }\n                            }\n                    }\n\n                    val info =\n                        tryFindInQuery() ?: kotlin.run {\n                            bot.network.logger.warning(\n                                contextualBugReportException(\n                                    \"SvcRequestPushStatus (OtherClient online)\",\n                                    \"packet: \\n\" + data.structureToString() +\n                                            \"\\n\\nquery: \\n\" +\n                                            Mirai.getOnlineOtherClientsList(bot).structureToString(),\n                                    additional = \"Failed to find corresponding instanceInfo.\",\n                                ),\n                            )\n                            OtherClientInfo(appId, Platform.WINDOWS, \"\", \"电脑\")\n                        }\n\n                    val client = bot.createOtherClient(info)\n                    bot.otherClients.delegate.add(client)\n                    collected += OtherClientOnlineEvent(\n                        client,\n                        ClientKind[data.nClientType?.toInt() ?: 0],\n                    )\n                }\n\n                2 -> { // off\n                    val client = bot.otherClients.find { it.appId == appId } ?: return\n                    client.cancel(CancellationException(\"Offline\"))\n                    bot.otherClients.delegate.remove(client)\n                    collected += OtherClientOfflineEvent(client)\n                }\n\n                else -> markNotConsumed()\n            }\n        }\n    }\n\n\n    /**\n     * @see OtherClientMessageEvent\n     */\n    override suspend fun NoticePipelineContext.processImpl(data: MsgComm.Msg) = data.context {\n        if (msgHead.msgType != 529) return\n\n        // top_package/awbk.java:3765\n        markAsConsumed() // todo check\n        if (msgHead.c2cCmd != 7) {\n            // 各种垃圾\n            // 08 04 12 1E 08 E9 07 10 B7 F7 8B 80 02 18 E9 07 20 00 28 DD F1 92 B7 07 30 DD F1 92 B7 07 48 02 50 03 32 1E 08 88 80 F8 92 CD 84 80 80 10 10 01 18 00 20 01 2A 0C 0A 0A 08 01 12 06 E5 95 8A E5 95 8A\n            return\n        }\n        val body = msgBody.msgContent.loadAs(SubMsgType0x7.MsgBody.serializer())\n\n        val textMsg =\n            body.msgSubcmd0x4Generic?.buf?.loadAs(SubMsgType0x7.MsgBody.QQDataTextMsg.serializer())\n                ?: return\n\n        with(body.msgHeader ?: return) {\n            if (dstUin != bot.id) return\n            val client = bot.otherClients.find { it.appId == srcInstId }\n                ?: return // don't compare with dstAppId. diff.\n\n            val chain = buildMessageChain {\n                +OnlineMessageSourceFromFriendImpl(bot, listOf(data))\n                for (msgItem in textMsg.msgItems) {\n                    when (msgItem.type) {\n                        1 -> +PlainText(msgItem.text)\n                        else -> {\n                        }\n                    }\n                }\n            }\n\n            collect(OtherClientMessageEvent(client, chain, msgHead.msgTime))\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/notice/priv/PrivateMessageProcessor.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.notice.priv\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.internal.contact.*\nimport net.mamoe.mirai.internal.getGroupByUinOrCode\nimport net.mamoe.mirai.internal.message.RefineContextKey\nimport net.mamoe.mirai.internal.message.SimpleRefineContext\nimport net.mamoe.mirai.internal.message.toMessageChainOnline\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.components.NoticePipelineContext\nimport net.mamoe.mirai.internal.network.components.NoticePipelineContext.Companion.KEY_FROM_SYNC\nimport net.mamoe.mirai.internal.network.components.NoticePipelineContext.Companion.fromSync\nimport net.mamoe.mirai.internal.network.components.SimpleNoticeProcessor\nimport net.mamoe.mirai.internal.network.components.SsoProcessor\nimport net.mamoe.mirai.internal.network.notice.group.GroupMessageProcessor\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.voice.PttStore\nimport net.mamoe.mirai.message.data.MessageSourceKind\nimport net.mamoe.mirai.utils.assertUnreachable\nimport net.mamoe.mirai.utils.context\n\n/**\n * Handles [UserMessageEvent] and their sync events. Requires [KEY_FROM_SYNC].\n *\n * For [GroupMessageEvent], see [GroupMessageProcessor].\n *\n * @see StrangerMessageEvent\n * @see StrangerMessageSyncEvent\n *\n * @see FriendMessageEvent\n * @see FriendMessageSyncEvent\n *\n * @see GroupTempMessageEvent\n * @see GroupTempMessageSyncEvent\n */\ninternal class PrivateMessageProcessor : SimpleNoticeProcessor<MsgComm.Msg>(type()) {\n\n    internal data class SendPrivateMessageReceipt(\n        val bot: Bot?,\n        val messageRandom: Int,\n        val sequenceId: Int,\n        val fromAppId: Int,\n    ) : Packet, Event, Packet.NoLog, AbstractEvent() {\n        override fun toString(): String {\n            return \"OnlinePush.PbC2CMsgSync.SendPrivateMessageReceipt(messageRandom=$messageRandom, sequenceId=$sequenceId)\"\n        }\n\n        companion object {\n            val EMPTY = SendPrivateMessageReceipt(null, 0, 0, 0)\n        }\n    }\n\n    override suspend fun NoticePipelineContext.processImpl(data: MsgComm.Msg) = data.context {\n        markAsConsumed()\n        val fromSync = attributes[KEY_FROM_SYNC, null] ?: return\n\n        if (fromSync) {\n            val msgFromAppid = msgHead.fromAppid\n            // 3116 = music share\n            // message sent by bot\n            if (msgFromAppid == 3116) {\n                handleSpecialMessageSendingResponse(data, msgFromAppid)\n                return\n            }\n        }\n\n        if (msgHead.fromUin == bot.id && fromSync) {\n            // Bot send message to himself? or from other client? I am not the implementer.\n\n            // This was `bot.client.sendFriendMessageSeq.updateIfSmallerThan(msgHead.msgSeq)`,\n            // changed to `if (!bot.client.sendFriendMessageSeq.updateIfDifferentWith(msgHead.msgSeq)) return`\n            // in 2021/12/20, 2.10.0-RC, 2.8.4, 2.9.0\n            // to fix 好友无法消息同步（FriendMessageSyncEvent） #1624\n            // Relevant tests: `MessageSyncTest`\n            if (!bot.client.sendFriendMessageSeq.updateIfDifferentWith(msgHead.msgSeq)) return\n        }\n\n        if (!bot.components[SsoProcessor].firstLoginSucceed) return\n        val senderUin = if (fromSync) msgHead.toUin else msgHead.fromUin\n        when (msgHead.msgType) {\n            166, 167, // 单向好友\n            208, // friend ptt, maybe also support stranger\n            -> {\n                data.msgBody.richText.ptt?.let { ptt ->\n                    if (ptt.downPara.isEmpty()) {\n                        val rsp = bot.network.sendAndExpect(\n                            PttStore.C2CPttDown(bot.client, senderUin, ptt.fileUuid)\n                        )\n                        if (rsp is PttStore.C2CPttDown.Response.Success) {\n                            ptt.downPara = rsp.downloadUrl.encodeToByteArray()\n                        }\n                    }\n                }\n                handlePrivateMessage(\n                    data,\n                    bot.getFriend(senderUin)?.impl()\n                        ?: bot.getStranger(senderUin)?.impl()\n                        ?: return\n                )\n            }\n\n            141, // group temp\n            -> {\n                val tmpHead = msgHead.c2cTmpMsgHead ?: return\n                val group = bot.getGroupByUinOrCode(tmpHead.groupUin) ?: return\n                handlePrivateMessage(data, group[senderUin] ?: return)\n            }\n\n            else -> markNotConsumed()\n        }\n\n    }\n\n    private suspend fun NoticePipelineContext.handlePrivateMessage(\n        data: MsgComm.Msg,\n        user: AbstractUser,\n    ) = data.context {\n        if (!user.messageSeq.updateIfDifferentWith(msgHead.msgSeq)) return\n        if (contentHead?.autoReply == 1) return\n\n        val msgs = user.fragmentedMessageMerger.tryMerge(this)\n        if (msgs.isEmpty()) return\n\n        val chain = msgs.toMessageChainOnline(\n            bot,\n            0,\n            user.correspondingMessageSourceKind,\n            SimpleRefineContext(\n                RefineContextKey.MessageSourceKind to MessageSourceKind.FRIEND,\n                RefineContextKey.FromId to user.uin,\n                RefineContextKey.GroupIdOrZero to 0L,\n            )\n        )\n        val time = msgHead.msgTime\n\n        collected += if (fromSync) {\n            val client = bot.otherClients.find { it.appId == msgHead.fromInstid }\n                ?: return // don't compare with dstAppId. diff.\n            when (user) {\n                is FriendImpl -> FriendMessageSyncEvent(client, user, chain, time)\n                is StrangerImpl -> StrangerMessageSyncEvent(client, user, chain, time)\n                is NormalMemberImpl -> GroupTempMessageSyncEvent(client, user, chain, time)\n                is AnonymousMemberImpl -> assertUnreachable()\n            }\n        } else {\n            when (user) {\n                is FriendImpl -> FriendMessageEvent(user, chain, time)\n                is StrangerImpl -> StrangerMessageEvent(user, chain, time)\n                is NormalMemberImpl -> GroupTempMessageEvent(user, chain, time)\n                is AnonymousMemberImpl -> assertUnreachable()\n            }\n        }\n    }\n\n    private fun NoticePipelineContext.handleSpecialMessageSendingResponse(\n        data: MsgComm.Msg,\n        fromAppId: Int,\n    ) = data.context {\n        val messageRandom = data.msgBody.richText.attr?.random ?: return\n        collect(\n            SendPrivateMessageReceipt(\n                bot, messageRandom, data.msgHead.msgSeq, fromAppId\n            )\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/LoginType.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol\n\nimport kotlin.jvm.JvmInline\n\n@JvmInline\ninternal value class LoginType(\n    val value: Int\n) {\n    companion object {\n        /**\n         * 短信验证登录\n         */\n        val SMS = LoginType(3)\n\n        /**\n         * 密码登录\n         */\n        val PASSWORD = LoginType(1)\n\n        /**\n         * 微信一键登录\n         */\n        val WE_CHAT = LoginType(4)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/SyncingCacheList.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\npackage net.mamoe.mirai.internal.network.protocol\n\nimport net.mamoe.mirai.utils.LinkedList\nimport kotlin.jvm.Synchronized\n\ninternal class SyncingCacheList<E>(private val size: Int = 50) {\n    private val packetIdList = LinkedList<E>()\n\n    @Synchronized // faster than suspending Mutex\n    fun addCache(element: E): Boolean {\n        if (packetIdList.contains(element)) return false // duplicate\n        packetIdList.add(element)\n        if (packetIdList.size >= size) packetIdList.removeFirst()\n        return true\n    }\n\n    @Synchronized\n    fun removeFirst(condition: (E) -> Boolean): Boolean {\n        val itr = packetIdList.listIterator()\n        for (element in itr) {\n            if (element.let(condition)) {\n                itr.remove()\n                return true\n            }\n        }\n        return false\n    }\n\n    @Synchronized\n    fun contains(condition: (E) -> Boolean): Boolean = packetIdList.any(condition)\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/ChangeFriendNameReq.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport kotlin.jvm.JvmField\n\n\n@Serializable\ninternal class ChangeFriendNameReq(\n    @JvmField @TarsId(0) val uFriendUin: Long = 0L,\n    @JvmField @TarsId(1) val cstrName: String = \"\"\n) : JceStruct\n\n@Serializable\ninternal class ChangeFriendNameRes(\n    @JvmField @TarsId(0) val result: Byte = 0\n) : JceStruct"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/ConfigPush.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class BigDataChannel(\n    @TarsId(0) @JvmField val vBigdataIplists: List<BigDataIpList>,\n    @TarsId(1) @JvmField val sBigdataSigSession: ByteArray? = null,\n    @TarsId(2) @JvmField val sBigdataKeySession: ByteArray? = null,\n    @TarsId(3) @JvmField val uSigUin: Long? = null,\n    @TarsId(4) @JvmField val iConnectFlag: Int? = 1,\n    @TarsId(5) @JvmField val vBigdataPbBuf: ByteArray? = null,\n) : JceStruct\n\n@Serializable\ninternal class BigDataIpInfo(\n    @TarsId(0) @JvmField val uType: Long,\n    @TarsId(1) @JvmField val sIp: String = \"\",\n    @TarsId(2) @JvmField val uPort: Long,\n) : JceStruct\n\n@Serializable\ninternal class BigDataIpList(\n    @TarsId(0) @JvmField val uServiceType: Long,\n    @TarsId(1) @JvmField val vIplist: List<BigDataIpInfo>,\n    @TarsId(2) @JvmField val netSegConfs: List<NetSegConf>? = null,\n    @TarsId(3) @JvmField val ufragmentSize: Long? = null,\n) : JceStruct\n\n@Serializable\ninternal class ClientLogConfig(\n    @TarsId(1) @JvmField val type: Int,\n    @TarsId(2) @JvmField val timeStart: TimeStamp? = null,\n    @TarsId(3) @JvmField val timeFinish: TimeStamp? = null,\n    @TarsId(4) @JvmField val loglevel: Byte? = null,\n    @TarsId(5) @JvmField val cookie: Int? = null,\n    @TarsId(6) @JvmField val lseq: Long? = null,\n) : JceStruct\n\n@Serializable\ninternal class DomainIpChannel(\n    @TarsId(0) @JvmField val vDomainIplists: List<DomainIpList>,\n) : JceStruct\n\n@Serializable\ninternal class DomainIpInfo(\n    @TarsId(1) @JvmField val uIp: Int,\n    @TarsId(2) @JvmField val uPort: Int,\n) : JceStruct\n\n@Serializable\ninternal class DomainIpList(\n    @TarsId(0) @JvmField val uDomainType: Int,\n    @TarsId(1) @JvmField val vIplist: List<DomainIpInfo>,\n    @TarsId(2) @JvmField val unknown: ByteArray? = null,\n    @TarsId(4) @JvmField val int: Int? = null, // added\n) : JceStruct\n\n@Serializable\ninternal class _340(\n    @TarsId(1) @JvmField val field1315: List<_339>,\n    @TarsId(3) @JvmField val field1316: List<_339>,\n    @TarsId(4) @JvmField val field1317: Int,\n    @TarsId(5) @JvmField val field1318: Byte? = 0,\n    @TarsId(6) @JvmField val field1319: Byte? = 0,\n    @TarsId(7) @JvmField val field1320: Int? = 1,\n    @TarsId(8) @JvmField val field1321: List<_339>? = null,\n    @TarsId(9) @JvmField val field1322: List<_339>? = null,\n    @TarsId(10) @JvmField val field1323: List<_339>? = null,\n    @TarsId(11) @JvmField val field1324: List<_339>? = null,\n    @TarsId(12) @JvmField val field1325: List<_339>? = null,\n    @TarsId(13) @JvmField val field1326: List<_339>? = null,\n    @TarsId(14) @JvmField val netType: Byte? = 0,\n    @TarsId(15) @JvmField val heThreshold: Int? = 0,\n    @TarsId(16) @JvmField val policyId: String? = \"\",\n) : JceStruct\n\n@Serializable\ninternal class _339(\n    @TarsId(1) @JvmField val field1298: String = \"\",\n    @TarsId(2) @JvmField val field1299: Int = 0,\n    @TarsId(3) @JvmField val field1300: Byte = 0,\n    @TarsId(4) @JvmField val field1301: Byte = 0,\n    @TarsId(5) @JvmField val field1302: Byte? = 0,\n    @TarsId(6) @JvmField val field1303: Int? = 8,\n    @TarsId(7) @JvmField val field1304: Byte? = 0,\n    @TarsId(8) @JvmField val field1305: String = \"\",\n    @TarsId(9) @JvmField val field1306: String = \"\",\n) : JceStruct\n\n\n/**\n * v8.5.5\n */\n@Serializable\ninternal class FileStoragePushFSSvcList(\n    @TarsId(0) @JvmField val vUpLoadList: List<FileStorageServerListInfo> = emptyList(),\n    @TarsId(1) @JvmField val vPicDownLoadList: List<FileStorageServerListInfo> = emptyList(),\n    @TarsId(2) @JvmField val vGPicDownLoadList: List<FileStorageServerListInfo> = emptyList(),\n    @TarsId(3) @JvmField val vQzoneProxyServiceList: List<FileStorageServerListInfo> = emptyList(),\n    @TarsId(4) @JvmField val vUrlEncodeServiceList: List<FileStorageServerListInfo> = emptyList(),\n    @TarsId(5) @JvmField val bigDataChannel: BigDataChannel? = null,\n    @TarsId(6) @JvmField val vVipEmotionList: List<FileStorageServerListInfo> = emptyList(),\n    @TarsId(7) @JvmField val vC2CPicDownList: List<FileStorageServerListInfo> = emptyList(),\n    @TarsId(8) @JvmField val fmtIPInfo: FmtIPInfo? = null,\n    @TarsId(9) @JvmField val domainIpChannel: DomainIpChannel? = null,\n    @TarsId(10) @JvmField val pttlist: ByteArray? = null,\n) : JceStruct\n\n@Serializable\ninternal class FileStorageServerListInfo(\n    @TarsId(1) @JvmField val sIP: String = \"\",\n    @TarsId(2) @JvmField val iPort: Int,\n) : JceStruct\n\n@Serializable\ninternal class FmtIPInfo(\n    @TarsId(0) @JvmField val sGateIp: String = \"\",\n    @TarsId(1) @JvmField val iGateIpOper: Long,\n) : JceStruct\n\n@Serializable\ninternal class NetSegConf(\n    @TarsId(0) @JvmField val uint32NetType: Long? = null,\n    @TarsId(1) @JvmField val uint32Segsize: Long? = null,\n    @TarsId(2) @JvmField val uint32Segnum: Long? = null,\n    @TarsId(3) @JvmField val uint32Curconnnum: Long? = null,\n) : JceStruct\n\n@Suppress(\"ArrayInDataClass\")\n@Serializable\ninternal class PushReq(\n    @TarsId(1) @JvmField val type: Int,\n    @TarsId(2) @JvmField val jcebuf: ByteArray,\n    @TarsId(3) @JvmField val seq: Long,\n) : JceStruct, Packet\n\n@Serializable\ninternal data class ServerListPush(\n    @TarsId(1) val mobileSSOServerList: List<ServerInfo>,\n    @TarsId(3) val wifiSSOServerList: List<ServerInfo>,\n    @TarsId(4) val reconnectNeeded: Int = 0,\n    //@JvmField @TarsId(5)  val skipped:Byte? = 0,\n    //@JvmField @TarsId(6)  val skipped:Byte? = 0,\n    //@JvmField @TarsId(7)  val skipped:Int? = 1,\n    @TarsId(8) val mobileHttpServerList: List<ServerInfo>,\n    @TarsId(9) val wifiHttpServerList: List<ServerInfo>,\n    @TarsId(10) val quicServerList: List<ServerInfo>,\n    @TarsId(11) val ssoServerListIpv6: List<ServerInfo>,\n    @TarsId(12) val httpServerListIpv6: List<ServerInfo>,\n    @TarsId(13) val quicServerListIpv6: List<ServerInfo>,\n    /**\n     * wifi下&1==1则启用\n     * 移动数据(mobile)下&2==2则启用\n     */\n    @TarsId(14) val ipv6ConfigVal: Byte? = 0,\n    //@JvmField @TarsId(15) val netTestDelay:Int? = 0,\n    @TarsId(16) val configDesc: String? = \"\",\n) : JceStruct {\n\n    @Serializable\n    data class ServerInfo(\n        @TarsId(1) val host: String,\n        @TarsId(2) val port: Int,\n        //@JvmField @TarsId(3) val skipped: Byte = 0,\n        //@JvmField @TarsId(4) val skipped: Byte = 0,\n        /**\n         * 2,3->http\n         * 0,1->socket\n         */\n        //@JvmField @TarsId(5) val protocolType: Byte? = 0,\n        //@JvmField @TarsId(6) val skipped: Int? = 8,\n        //@JvmField @TarsId(7) val skipped: Byte? = 0,\n        @TarsId(8) val location: String = \"\",\n        /**\n         * cm->China mobile 中国移动\n         * uni->China unicom 中国联通\n         * others->其他\n         */\n        @TarsId(9) val ispName: String = \"\",\n    ) : JceStruct {\n        override fun toString(): String {\n            return \"$host:$port\"\n        }\n    }\n}\n\n@Serializable\ninternal class PushResp(\n    @TarsId(1) @JvmField val type: Int,\n    @TarsId(2) @JvmField val seq: Long,\n    @TarsId(3) @JvmField val jcebuf: ByteArray? = null,\n) : JceStruct\n\n@Serializable\ninternal class SsoServerList(\n    @TarsId(1) @JvmField val v2G3GList: List<SsoServerListInfo>,\n    @TarsId(3) @JvmField val vWifiList: List<SsoServerListInfo>,\n    @TarsId(4) @JvmField val iReconnect: Int,\n    @TarsId(5) @JvmField val testSpeed: Byte? = null,\n    @TarsId(6) @JvmField val useNewList: Byte? = null,\n    @TarsId(7) @JvmField val iMultiConn: Int? = 1,\n    @TarsId(8) @JvmField val vHttp2g3glist: List<SsoServerListInfo>? = null,\n    @TarsId(9) @JvmField val vHttpWifilist: List<SsoServerListInfo>? = null,\n) : JceStruct\n\n@Serializable\ninternal class SsoServerListInfo(\n    @TarsId(1) @JvmField val sIP: String = \"\",\n    @TarsId(2) @JvmField val iPort: Int,\n    @TarsId(3) @JvmField val linkType: Byte,\n    @TarsId(4) @JvmField val proxy: Byte,\n    @TarsId(5) @JvmField val protocolType: Byte? = null,\n    @TarsId(6) @JvmField val iTimeOut: Int? = 10,\n) : JceStruct\n\n@Serializable\ninternal class TimeStamp(\n    @TarsId(1) @JvmField val year: Int,\n    @TarsId(2) @JvmField val month: Byte,\n    @TarsId(3) @JvmField val day: Byte,\n    @TarsId(4) @JvmField val hour: Byte,\n) : JceStruct\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/DeviceItemDes.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\npackage  net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class DeviceItemDes(\n    @JvmField @TarsId(0) val vecItemDes: ByteArray,\n) : JceStruct\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/FriendList.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport kotlin.jvm.JvmField\n\n\n@Serializable\ninternal class DelFriendReq(\n    @JvmField @TarsId(0) val uin: Long,\n    @JvmField @TarsId(1) val delUin: Long,\n    @JvmField @TarsId(2) val delType: Byte,\n    @JvmField @TarsId(3) val version: Int? = null,\n) : JceStruct\n\n@Serializable\ninternal class DelFriendResp(\n    @JvmField @TarsId(0) val uin: Long,\n    @JvmField @TarsId(1) val delUin: Long,\n    @JvmField @TarsId(2) val result: Int,\n    @JvmField @TarsId(3) val errorCode: Short? = null,\n) : JceStruct\n\n@Serializable\ninternal class ModifyGroupCardReq(\n    @TarsId(0) @JvmField val dwZero: Long,\n    @TarsId(1) @JvmField val dwGroupCode: Long,\n    @TarsId(2) @JvmField val dwNewSeq: Long,\n    @TarsId(3) @JvmField val vecUinInfo: List<stUinInfo>,\n) : JceStruct\n\n@Serializable\ninternal class stUinInfo(\n    @TarsId(0) @JvmField val dwuin: Long,\n    @TarsId(1) @JvmField val dwFlag: Long,\n    @TarsId(2) @JvmField val sName: String = \"\",\n    @TarsId(3) @JvmField val gender: Byte,\n    @TarsId(4) @JvmField val sPhone: String = \"\",\n    @TarsId(5) @JvmField val sEmail: String = \"\",\n    @TarsId(6) @JvmField val sRemark: String = \"\",\n) : JceStruct\n\n@Serializable\ninternal class GetFriendListReq(\n    @TarsId(0) @JvmField val reqtype: Int? = null,\n    @TarsId(1) @JvmField val ifReflush: Byte? = null,\n    @TarsId(2) @JvmField val uin: Long? = null,\n    @TarsId(3) @JvmField val startIndex: Short? = null,\n    @TarsId(4) @JvmField val getfriendCount: Short? = null,\n    @TarsId(5) @JvmField val groupid: Byte? = null,\n    @TarsId(6) @JvmField val ifGetGroupInfo: Byte? = null,\n    @TarsId(7) @JvmField val groupstartIndex: Byte? = null,\n    @TarsId(8) @JvmField val getgroupCount: Byte? = null,\n    @TarsId(9) @JvmField val ifGetMSFGroup: Byte? = null,\n    @TarsId(10) @JvmField val ifShowTermType: Byte? = null,\n    @TarsId(11) @JvmField val version: Long? = null,\n    @TarsId(12) @JvmField val uinList: List<Long>? = null,\n    @TarsId(13) @JvmField val eAppType: Int = 0,\n    @TarsId(14) @JvmField val ifGetDOVId: Byte? = null,\n    @TarsId(15) @JvmField val ifGetBothFlag: Byte? = null,\n    @TarsId(16) @JvmField val vec0xd50Req: ByteArray? = null,\n    @TarsId(17) @JvmField val vec0xd6bReq: ByteArray? = null,\n    @TarsId(18) @JvmField val vecSnsTypelist: List<Long>? = null,\n) : JceStruct\n\n\n@Serializable\ninternal class GetFriendListResp(\n    @TarsId(0) @JvmField val reqtype: Int,\n    @TarsId(1) @JvmField val ifReflush: Byte,\n    @TarsId(2) @JvmField val uin: Long,\n    @TarsId(3) @JvmField val startIndex: Short,\n    @TarsId(4) @JvmField val getfriendCount: Short,\n    @TarsId(5) @JvmField val totoalFriendCount: Short,\n    @TarsId(6) @JvmField val friendCount: Short,\n    @TarsId(7) @JvmField val vecFriendInfo: List<FriendInfo>? = null,\n    @TarsId(8) @JvmField val groupid: Byte? = null,\n    @TarsId(9) @JvmField val ifGetGroupInfo: Byte,\n    @TarsId(10) @JvmField val groupstartIndex: Byte? = null,\n    @TarsId(11) @JvmField val getgroupCount: Byte? = null,\n    @TarsId(12) @JvmField val totoalGroupCount: Short? = null,\n    @TarsId(13) @JvmField val groupCount: Byte? = null,\n    @TarsId(14) @JvmField val vecGroupInfo: List<GroupInfo>? = null,\n    @TarsId(15) @JvmField val result: Int,\n    @TarsId(16) @JvmField val errorCode: Short? = null,\n    @TarsId(17) @JvmField val onlineFriendCount: Short? = null,\n    @TarsId(18) @JvmField val serverTime: Long? = null,\n    @TarsId(19) @JvmField val sqqOnLineCount: Short? = null,\n    @TarsId(20) @JvmField val vecMSFGroupInfo: List<GroupInfo>? = null,\n    @TarsId(21) @JvmField val respType: Byte? = null,\n    @TarsId(22) @JvmField val hasOtherRespFlag: Byte? = null,\n    @TarsId(23) @JvmField val stSelfInfo: FriendInfo? = null,\n    @TarsId(24) @JvmField val showPcIcon: Byte? = null,\n    @TarsId(25) @JvmField val wGetExtSnsRspCode: Short? = null,\n    @TarsId(26) @JvmField val stSubSrvRspCode: FriendListSubSrvRspCode? = null,\n) : JceStruct\n\n@Serializable\ninternal class FriendListSubSrvRspCode(\n    @TarsId(0) @JvmField val wGetMutualMarkRspCode: Short? = null,\n    @TarsId(1) @JvmField val wGetIntimateInfoRspCode: Short? = null,\n) : JceStruct\n\n@Serializable\ninternal class FriendInfo(\n    @TarsId(0) @JvmField val friendUin: Long,\n    @TarsId(1) @JvmField val groupId: Byte,\n    @TarsId(2) @JvmField val faceId: Short,\n    @TarsId(3) @JvmField val remark: String = \"\",\n    @TarsId(4) @JvmField val sqqtype: Byte,\n    @TarsId(5) @JvmField val status: Byte = 20,\n    @TarsId(6) @JvmField val memberLevel: Byte? = null,\n    @TarsId(7) @JvmField val isMqqOnLine: Byte? = null,\n    @TarsId(8) @JvmField val sqqOnLineState: Byte? = null,\n    @TarsId(9) @JvmField val isIphoneOnline: Byte? = null,\n    @TarsId(10) @JvmField val detalStatusFlag: Byte? = null,\n    @TarsId(11) @JvmField val sqqOnLineStateV2: Byte? = null,\n    @TarsId(12) @JvmField val sShowName: String? = \"\",\n    @TarsId(13) @JvmField val isRemark: Byte? = null,\n    @TarsId(14) @JvmField val nick: String = \"\",\n    @TarsId(15) @JvmField val specialFlag: Byte? = null,\n    @TarsId(16) @JvmField val vecIMGroupID: ByteArray? = null,\n    @TarsId(17) @JvmField val vecMSFGroupID: ByteArray? = null,\n    @TarsId(18) @JvmField val iTermType: Int? = null,\n    @TarsId(19) @JvmField val oVipInfo: VipBaseInfo? = null, //? bad\n    @TarsId(20) @JvmField val network: Byte? = null,\n    @TarsId(21) @JvmField val vecRing: ByteArray? = null,\n    @TarsId(22) @JvmField val uAbiFlag: Long? = null,\n    @TarsId(23) @JvmField val ulFaceAddonId: Long? = null,\n    @TarsId(24) @JvmField val eNetworkType: Int? = 0,\n    @TarsId(25) @JvmField val uVipFont: Long? = null,\n    @TarsId(26) @JvmField val eIconType: Int? = 0,\n    @TarsId(27) @JvmField val termDesc: String? = \"\",\n    @TarsId(28) @JvmField val uColorRing: Long? = null,\n    @TarsId(29) @JvmField val apolloFlag: Byte? = null,\n    @TarsId(30) @JvmField val uApolloTimestamp: Long? = null,\n    @TarsId(31) @JvmField val sex: Byte? = null,\n    @TarsId(32) @JvmField val uFounderFont: Long? = null,\n    @TarsId(33) @JvmField val eimId: String? = \"\",\n    @TarsId(34) @JvmField val eimMobile: String? = \"\",\n    @TarsId(35) @JvmField val olympicTorch: Byte? = null,\n    @TarsId(36) @JvmField val uApolloSignTime: Long? = null,\n    @TarsId(37) @JvmField val uLaviUin: Long? = null,\n    @TarsId(38) @JvmField val uTagUpdateTime: Long? = null,\n    @TarsId(39) @JvmField val uGameLastLoginTime: Long? = null,\n    @TarsId(40) @JvmField val uGameAppid: Long? = null,\n    @TarsId(41) @JvmField val vecCardID: ByteArray? = null,\n    @TarsId(42) @JvmField val ulBitSet: Long? = null,\n    @TarsId(43) @JvmField val kingOfGloryFlag: Byte? = null,\n    @TarsId(44) @JvmField val ulKingOfGloryRank: Long? = null,\n    @TarsId(45) @JvmField val masterUin: String? = \"\",\n    @TarsId(46) @JvmField val uLastMedalUpdateTime: Long? = null,\n    @TarsId(47) @JvmField val uFaceStoreId: Long? = null,\n    @TarsId(48) @JvmField val uFontEffect: Long? = null,\n    @TarsId(49) @JvmField val sDOVId: String? = \"\",\n    @TarsId(50) @JvmField val uBothFlag: Long? = null,\n    @TarsId(51) @JvmField val centiShow3DFlag: Byte? = null,\n    @TarsId(52) @JvmField val vecIntimateInfo: ByteArray? = null,\n    @TarsId(53) @JvmField val showNameplate: Byte? = null,\n    @TarsId(54) @JvmField val newLoverDiamondFlag: Byte? = null,\n    @TarsId(55) @JvmField val vecExtSnsFrdData: ByteArray? = null,\n    @TarsId(56) @JvmField val vecMutualMarkData: ByteArray? = null,\n) : JceStruct\n\n@Serializable\ninternal class VipBaseInfo(\n    @TarsId(0) @JvmField val mOpenInfo: Map<Int, VipOpenInfo>? = null,\n    // 1, 2 are since 8.2.7\n    @TarsId(1) @JvmField val iNameplateVipType: Int? = 0,\n    @TarsId(2) @JvmField val iGrayNameplateFlag: Int? = 0,\n) : JceStruct\n\n@Serializable\ninternal class VipOpenInfo(\n    @TarsId(0) @JvmField val open: Boolean? = false,\n    @TarsId(1) @JvmField val iVipType: Int = -1,\n    @TarsId(2) @JvmField val iVipLevel: Int = -1,\n    @TarsId(3) @JvmField val iVipFlag: Int? = null,\n    @TarsId(4) @JvmField val nameplateId: Long? = null,\n) : JceStruct\n\n@Serializable\ninternal class GroupInfo(\n    @TarsId(0) @JvmField val groupId: Byte,\n    @TarsId(1) @JvmField val groupname: String = \"\",\n    @TarsId(2) @JvmField val friendCount: Int,\n    @TarsId(3) @JvmField val onlineFriendCount: Int,\n    @TarsId(4) @JvmField val seqid: Byte? = null,\n    @TarsId(5) @JvmField val sqqOnLineCount: Int? = null,\n) : JceStruct\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/GroupMngReq.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class GroupMngReqJce(\n    @TarsId(0) @JvmField val reqtype: Int,\n    @TarsId(1) @JvmField val uin: Long,\n    @TarsId(2) @JvmField val vecBody: ByteArray,\n    @TarsId(3) @JvmField val checkInGroup: Byte? = null,\n    @TarsId(4) @JvmField val sGroupLocation: String? = \"\",\n    @TarsId(5) @JvmField val statOption: Byte? = null,\n    @TarsId(6) @JvmField val wSourceID: Int? = null,\n    @TarsId(7) @JvmField val wSourceSubID: Int? = null,\n    @TarsId(8) @JvmField val isSupportAuthQuestionJoin: Byte? = null,\n    @TarsId(9) @JvmField val ifGetAuthInfo: Byte? = null,\n    @TarsId(10) @JvmField val dwDiscussUin: Long? = null,\n    @TarsId(11) @JvmField val sJoinGroupKey: String? = \"\",\n    @TarsId(12) @JvmField val sJoinGroupPicUrl: String? = \"\",\n    @TarsId(13) @JvmField val vecJoinGroupRichMsg: ByteArray? = null,\n    @TarsId(14) @JvmField val sJoinGroupAuth: String? = \"\",\n    @TarsId(15) @JvmField val sJoinGroupVerifyToken: String? = \"\",\n    @TarsId(16) @JvmField val dwJoinVerifyType: Long? = null,\n) : JceStruct\n\n@Serializable\ninternal class GroupMngRes(\n    @TarsId(0) @JvmField val reqtype: Int,\n    @TarsId(1) @JvmField val result: Byte,\n    @TarsId(2) @JvmField val vecBody: ByteArray,\n    @TarsId(3) @JvmField val errorString: String = \"\",\n    @TarsId(4) @JvmField val errorCode: Short = 0,\n    @TarsId(5) @JvmField val isInGroup: Byte? = null,\n    @TarsId(6) @JvmField val sGroupLocation: String? = \"\",\n    @TarsId(7) @JvmField val isMemInvite: Byte? = null,\n    @TarsId(8) @JvmField val sAuthGrpInfo: String? = \"\",\n    @TarsId(9) @JvmField val sJoinQuestion: String? = \"\",\n    @TarsId(10) @JvmField val sJoinAnswer: String? = \"\",\n    @TarsId(11) @JvmField val dwDis2GrpLimitType: Long? = null,\n) : JceStruct\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/InstanceInfo.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage  net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.contact.ClientKind\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal data class InstanceInfo(\n    @JvmField @TarsId(0) val iAppId: Int? = null,\n    @JvmField @TarsId(1) val tablet: Byte? = null,\n    @JvmField @TarsId(2) val iPlatform: Long? = null,\n    /**\n     * @see ClientKind\n     */\n    @JvmField @TarsId(3) val iProductType: Long? = null,\n    @JvmField @TarsId(4) val iClientType: Long? = null,\n) : JceStruct\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/MoveGroupMemPack.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport kotlin.jvm.JvmField\n\n\n@Serializable\ninternal class MovGroupMemReq(\n    @JvmField @TarsId(0) val uin: Long = 0L,\n    @JvmField @TarsId(1) val reqtype: Byte = 0,\n    @JvmField @TarsId(2) val vecBody: ByteArray? = null\n) : JceStruct\n\n@Serializable\ninternal class MovGroupMemResp(\n    @JvmField @TarsId(0) val uin: Long = 0L,\n    @JvmField @TarsId(1) val reqtype: Byte = 0,\n    @JvmField @TarsId(2) val result: Byte = 0,\n    @JvmField @TarsId(3) val errorString: String = \"\"\n) : JceStruct"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/MsgType0x210.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Submsgtype0x27\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.NestedStructure\nimport net.mamoe.mirai.internal.utils.io.NestedStructureDesensitizer\nimport net.mamoe.mirai.internal.utils.io.ProtocolStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class AddGroup(\n    @TarsId(0) @JvmField val dwGroupID: Long? = null,\n    @TarsId(1) @JvmField val dwSortID: Long? = null,\n    @TarsId(2) @JvmField val groupName: String? = \"\",\n) : JceStruct\n\n@Serializable\ninternal class DelGroup(\n    @TarsId(0) @JvmField val dwGroupID: Long? = null,\n) : JceStruct\n\n@Serializable\ninternal class FriendGroup(\n    @TarsId(0) @JvmField val dwFuin: Long? = null,\n    @TarsId(1) @JvmField val vOldGroupID: List<Long>? = null,\n    @TarsId(2) @JvmField val vNewGroupID: List<Long>? = null,\n) : JceStruct\n\n@Serializable\ninternal class GroupSort(\n    @TarsId(0) @JvmField val dwGroupID: Long? = null,\n    @TarsId(1) @JvmField val dwSortID: Long? = null,\n) : JceStruct\n\n@Serializable\ninternal class MarketFaceInfo(\n    @TarsId(0) @JvmField val insertIdx: Long,\n    @TarsId(1) @JvmField val marketFaceBuff: ByteArray,\n) : JceStruct\n\n@Serializable\ninternal class ModFriendGroup(\n    @TarsId(0) @JvmField val vMsgFrdGroup: List<FriendGroup>? = null,\n) : JceStruct\n\n@Serializable\ninternal class ModGroupName(\n    @TarsId(0) @JvmField val dwGroupID: Long? = null,\n    @TarsId(1) @JvmField val groupName: String? = \"\",\n) : JceStruct\n\n@Serializable\ninternal class ModGroupSort(\n    @TarsId(0) @JvmField val vMsgGroupSort: List<GroupSort>? = null,\n) : JceStruct\n\n@Serializable\ninternal class MsgType0x210(\n    @TarsId(0) @JvmField val uSubMsgType: Long,\n    @TarsId(1) @JvmField val stMsgInfo0x2: MsgType0x210SubMsgType0x2? = null,\n    @TarsId(3) @JvmField val stMsgInfo0xa: MsgType0x210SubMsgType0xa? = null,\n    @TarsId(4) @JvmField val stMsgInfo0xe: MsgType0x210SubMsgType0xe? = null,\n    @TarsId(5) @JvmField val stMsgInfo0x13: MsgType0x210SubMsgType0x13? = null,\n    @TarsId(6) @JvmField val stMsgInfo0x17: MsgType0x210SubMsgType0x17? = null,\n    @TarsId(7) @JvmField val stMsgInfo0x20: MsgType0x210SubMsgType0x20? = null,\n    @TarsId(8) @JvmField val stMsgInfo0x1d: MsgType0x210SubMsgType0x1d? = null,\n    @TarsId(9) @JvmField val stMsgInfo0x24: MsgType0x210SubMsgType0x24? = null,\n    @NestedStructure(Deserializer::class) @TarsId(10) @JvmField val vProtobuf: ByteArray = EMPTY_BYTE_ARRAY,\n) : JceStruct {\n    object Deserializer : NestedStructureDesensitizer<MsgType0x210, ProtocolStruct> {\n        override fun deserialize(context: MsgType0x210, byteArray: ByteArray): ProtocolStruct? {\n            return when (context.uSubMsgType) {\n                0x27L -> byteArray.loadAs(Submsgtype0x27.SubMsgType0x27.SubMsgType0x27MsgBody.serializer())\n                else -> null\n            }\n        }\n\n    }\n}\n\n@Serializable\ninternal class MsgType0x210SubMsgType0x13(\n    @TarsId(0) @JvmField val uint32SrcAppId: Long? = null,\n    @TarsId(1) @JvmField val uint32SrcInstId: Long? = null,\n    @TarsId(2) @JvmField val uint32DstAppId: Long? = null,\n    @TarsId(3) @JvmField val uint32DstInstId: Long? = null,\n    @TarsId(4) @JvmField val uint64DstUin: Long? = null,\n    @TarsId(5) @JvmField val uint64Sessionid: Long? = null,\n    @TarsId(6) @JvmField val uint32Size: Long? = null,\n    @TarsId(7) @JvmField val uint32Index: Long? = null,\n    @TarsId(8) @JvmField val uint32Type: Long? = null,\n    @TarsId(9) @JvmField val buf: ByteArray? = null,\n) : JceStruct\n\n@Serializable\ninternal class MsgType0x210SubMsgType0x13_MsgItem(\n    @TarsId(0) @JvmField val uint32Type: Long? = null,\n    @TarsId(1) @JvmField val text: ByteArray? = null,\n) : JceStruct\n\n@Serializable\ninternal class MsgType0x210SubMsgType0x17(\n    @TarsId(0) @JvmField val dwOpType: Long? = null,\n    @TarsId(1) @JvmField val stAddGroup: AddGroup? = null,\n    @TarsId(2) @JvmField val stDelGroup: DelGroup? = null,\n    @TarsId(3) @JvmField val stModGroupName: ModGroupName? = null,\n    @TarsId(4) @JvmField val stModGroupSort: ModGroupSort? = null,\n    @TarsId(5) @JvmField val stModFriendGroup: ModFriendGroup? = null,\n) : JceStruct\n\n@Serializable\ninternal class MsgType0x210SubMsgType0x1d(\n    @TarsId(0) @JvmField val dwOpType: Long? = null,\n    @TarsId(1) @JvmField val dwUin: Long? = null,\n    @TarsId(2) @JvmField val dwID: Long? = null,\n    @TarsId(3) @JvmField val value: String? = \"\",\n) : JceStruct\n\n@Serializable\ninternal class MsgType0x210SubMsgType0x2(\n    @TarsId(0) @JvmField val uSrcAppId: Long? = null,\n    @TarsId(1) @JvmField val uSrcInstId: Long? = null,\n    @TarsId(2) @JvmField val uDstAppId: Long? = null,\n    @TarsId(3) @JvmField val uDstInstId: Long? = null,\n    @TarsId(4) @JvmField val uDstUin: Long? = null,\n    @TarsId(5) @JvmField val fileName: ByteArray? = null,\n    @TarsId(6) @JvmField val fileIndex: ByteArray? = null,\n    @TarsId(7) @JvmField val fileMd5: ByteArray? = null,\n    @TarsId(8) @JvmField val fileKey: ByteArray? = null,\n    @TarsId(9) @JvmField val uServerIp: Long? = null,\n    @TarsId(10) @JvmField val uServerPort: Long? = null,\n    @TarsId(11) @JvmField val fileLen: Long? = null,\n    @TarsId(12) @JvmField val sessionId: Long? = null,\n    @TarsId(13) @JvmField val originfileMd5: ByteArray? = null,\n    @TarsId(14) @JvmField val uOriginfiletype: Long? = null,\n    @TarsId(15) @JvmField val uSeq: Long? = null,\n) : JceStruct\n\n@Serializable\ninternal class MsgType0x210SubMsgType0x20(\n    @TarsId(0) @JvmField val dwOpType: Long? = null,\n    @TarsId(1) @JvmField val dwType: Long? = null,\n    @TarsId(2) @JvmField val dwUin: Long? = null,\n    @TarsId(3) @JvmField val remaek: String? = \"\",\n) : JceStruct\n\n@Serializable\ninternal class MsgType0x210SubMsgType0x24(\n    @TarsId(0) @JvmField val vPluginNumList: List<PluginNum>? = null,\n) : JceStruct\n\n@Serializable\ninternal class MsgType0x210SubMsgType0xa(\n    @TarsId(0) @JvmField val uSrcAppId: Long? = null,\n    @TarsId(1) @JvmField val uSrcInstId: Long? = null,\n    @TarsId(2) @JvmField val uDstAppId: Long? = null,\n    @TarsId(3) @JvmField val uDstInstId: Long? = null,\n    @TarsId(4) @JvmField val uDstUin: Long? = null,\n    @TarsId(5) @JvmField val uType: Long? = null,\n    @TarsId(6) @JvmField val uServerIp: Long? = null,\n    @TarsId(7) @JvmField val uServerPort: Long? = null,\n    @TarsId(8) @JvmField val vUrlNotify: ByteArray? = null,\n    @TarsId(9) @JvmField val vTokenKey: ByteArray? = null,\n    @TarsId(10) @JvmField val uFileLen: Long? = null,\n    @TarsId(11) @JvmField val fileName: ByteArray? = null,\n    @TarsId(12) @JvmField val vMd5: ByteArray? = null,\n    @TarsId(13) @JvmField val sessionId: Long? = null,\n    @TarsId(14) @JvmField val originfileMd5: ByteArray? = null,\n    @TarsId(15) @JvmField val uOriginfiletype: Long? = null,\n    @TarsId(16) @JvmField val uSeq: Long? = null,\n) : JceStruct\n\n@Serializable\ninternal class MsgType0x210SubMsgType0xe(\n    @TarsId(0) @JvmField val uint32SrcAppId: Long? = null,\n    @TarsId(1) @JvmField val uint32SrcInstId: Long? = null,\n    @TarsId(2) @JvmField val uint32DstAppId: Long? = null,\n    @TarsId(3) @JvmField val uint32DstInstId: Long? = null,\n    @TarsId(4) @JvmField val uint64DstUin: Long? = null,\n    @TarsId(5) @JvmField val uint64Sessionid: Long? = null,\n    @TarsId(6) @JvmField val uint32Operate: Long? = null,\n    @TarsId(7) @JvmField val uint32Seq: Long? = null,\n    @TarsId(8) @JvmField val uint32Code: Long? = null,\n    @TarsId(9) @JvmField val msg: String? = \"\",\n) : JceStruct\n\n@Serializable\ninternal class PersonInfoChange(\n    @TarsId(0) @JvmField val type: Byte? = null,\n    @TarsId(1) @JvmField val vChgField: List<PersonInfoField>? = null,\n) : JceStruct\n\n@Serializable\ninternal class PersonInfoField(\n    @TarsId(0) @JvmField val uField: Long? = null,\n) : JceStruct\n\n@Serializable\ninternal class PluginNum(\n    @TarsId(0) @JvmField val dwID: Long? = null,\n    @TarsId(1) @JvmField val dwNUm: Long? = null,\n    @TarsId(2) @JvmField val flag: Byte? = null,\n) : JceStruct\n\n@Serializable\ninternal class SlaveMasterMsg(\n    @TarsId(0) @JvmField val uMsgType: Long? = null,\n    @TarsId(1) @JvmField val uCmd: Long? = null,\n    @TarsId(2) @JvmField val uSeq: Long? = null,\n    @TarsId(3) @JvmField val fromUin: Long? = null,\n    @TarsId(4) @JvmField val wFromApp: Short? = null,\n    @TarsId(5) @JvmField val uFromInstId: Long? = null,\n    @TarsId(6) @JvmField val toUin: Long? = null,\n    @TarsId(7) @JvmField val wToApp: Short? = null,\n    @TarsId(8) @JvmField val uToInstId: Long? = null,\n    @TarsId(9) @JvmField val vOrigMsg: ByteArray? = null,\n    @TarsId(10) @JvmField val uLastChangeTime: Long? = null,\n    @TarsId(11) @JvmField val vReserved: ByteArray? = null,\n    @TarsId(12) @JvmField val vMarketFace: List<MarketFaceInfo>? = null,\n    @TarsId(13) @JvmField val uSuperQQBubbleId: Long? = null,\n) : JceStruct\n\n@Serializable\ninternal class Type_1_QQDataTextMsg(\n    @TarsId(0) @JvmField val msgItem: List<MsgType0x210SubMsgType0x13_MsgItem>? = null,\n) : JceStruct\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/OnlinePushPack.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport kotlin.jvm.JvmField\n\ninternal class OnlinePushPack {\n    @Serializable\n    internal class DelMsgInfo(\n        @TarsId(0) @JvmField val fromUin: Long,\n        @TarsId(1) @JvmField val uMsgTime: Long,\n        @TarsId(2) @JvmField val shMsgSeq: Short,\n        @TarsId(3) @JvmField val vMsgCookies: ByteArray? = null,\n        @TarsId(4) @JvmField val wCmd: Short? = null,\n        @TarsId(5) @JvmField val uMsgType: Long? = null,\n        @TarsId(6) @JvmField val uAppId: Long? = null,\n        @TarsId(7) @JvmField val sendTime: Long? = null,\n        @TarsId(8) @JvmField val ssoSeq: Int? = null,\n        @TarsId(9) @JvmField val ssoIp: Int? = null,\n        @TarsId(10) @JvmField val clientIp: Int? = null,\n    ) : JceStruct\n\n    @Serializable\n    internal class DeviceInfo(\n        @TarsId(0) @JvmField val netType: Byte? = null,\n        @TarsId(1) @JvmField val devType: String? = \"\",\n        @TarsId(2) @JvmField val oSVer: String? = \"\",\n        @TarsId(3) @JvmField val vendorName: String? = \"\",\n        @TarsId(4) @JvmField val vendorOSName: String? = \"\",\n        @TarsId(5) @JvmField val iOSIdfa: String? = \"\",\n    ) : JceStruct\n\n    @Serializable\n    internal class Name(\n        @TarsId(0) @JvmField val fromUin: Long,\n        @TarsId(1) @JvmField val uMsgTime: Long,\n        @TarsId(2) @JvmField val shMsgType: Short,\n        @TarsId(3) @JvmField val shMsgSeq: Short,\n        @TarsId(4) @JvmField val msg: String = \"\",\n        @TarsId(5) @JvmField val uRealMsgTime: Int? = null,\n        @TarsId(6) @JvmField val vMsg: ByteArray? = null,\n        @TarsId(7) @JvmField val uAppShareID: Long? = null,\n        @TarsId(8) @JvmField val vMsgCookies: ByteArray? = null,\n        @TarsId(9) @JvmField val vAppShareCookie: ByteArray? = null,\n        @TarsId(10) @JvmField val msgUid: Long? = null,\n        @TarsId(11) @JvmField val lastChangeTime: Long? = 1L,\n        @TarsId(12) @JvmField val vCPicInfo: List<CPicInfo>? = null,\n        @TarsId(13) @JvmField val stShareData: ShareData? = null,\n        @TarsId(14) @JvmField val fromInstId: Long? = null,\n        @TarsId(15) @JvmField val vRemarkOfSender: ByteArray? = null,\n        @TarsId(16) @JvmField val fromMobile: String? = \"\",\n        @TarsId(17) @JvmField val fromName: String? = \"\",\n        @TarsId(18) @JvmField val vNickName: List<String>? = null,\n        @TarsId(19) @JvmField val stC2CTmpMsgHead: TempMsgHead? = null,\n    ) : JceStruct\n\n    @Serializable\n    internal class SvcReqPushMsg(\n        @TarsId(0) @JvmField val uin: Long,\n        @TarsId(1) @JvmField val uMsgTime: Long,\n        @TarsId(2) @JvmField val vMsgInfos: List<MsgInfo>,\n        @TarsId(3) @JvmField val svrip: Int? = 0,\n        @TarsId(4) @JvmField val vSyncCookie: ByteArray? = null,\n        @TarsId(5) @JvmField val vUinPairMsg: List<UinPairMsg>? = null,\n        @TarsId(6) @JvmField val mPreviews: Map<String, ByteArray>? = null,\n        // @SerialId(7) @JvmField val wUserActive: Int? = null,\n        //@SerialId(12) @JvmField val wGeneralFlag: Int? = null\n    ) : JceStruct\n\n    @Serializable\n    internal class SvcRespPushMsg(\n        @TarsId(0) @JvmField val uin: Long,\n        @TarsId(1) @JvmField val vDelInfos: List<DelMsgInfo>,\n        @TarsId(2) @JvmField val svrip: Int = 0,\n        @TarsId(3) @JvmField val pushToken: ByteArray? = null,\n        @TarsId(4) @JvmField val serviceType: Int? = null,\n        @TarsId(5) @JvmField val deviceInfo: DeviceInfo? = null,\n    ) : JceStruct\n\n    @Serializable\n    internal class UinPairMsg(\n        @TarsId(1) @JvmField val uLastReadTime: Long? = null,\n        @TarsId(2) @JvmField val peerUin: Long? = null,\n        @TarsId(3) @JvmField val uMsgCompleted: Long? = null,\n        @TarsId(4) @JvmField val vMsgInfos: List<MsgInfo>? = null,\n    ) : JceStruct\n\n    @Serializable\n    internal class MsgType0x210(\n        @TarsId(0) @JvmField val uSubMsgType: Long,\n        @TarsId(1) @JvmField val stMsgInfo0x2: MsgType0x210SubMsgType0x2? = null,\n        @TarsId(3) @JvmField val stMsgInfo0xa: MsgType0x210SubMsgType0xa? = null,\n        @TarsId(4) @JvmField val stMsgInfo0xe: MsgType0x210SubMsgType0xe? = null,\n        @TarsId(5) @JvmField val stMsgInfo0x13: MsgType0x210SubMsgType0x13? = null,\n        @TarsId(6) @JvmField val stMsgInfo0x17: MsgType0x210SubMsgType0x17? = null,\n        @TarsId(7) @JvmField val stMsgInfo0x20: MsgType0x210SubMsgType0x20? = null,\n        @TarsId(8) @JvmField val stMsgInfo0x1d: MsgType0x210SubMsgType0x1d? = null,\n        @TarsId(9) @JvmField val stMsgInfo0x24: MsgType0x210SubMsgType0x24? = null,\n        @TarsId(10) @JvmField val vProtobuf: ByteArray? = null,\n    ) : JceStruct\n\n    @Serializable\n    internal class MsgType0x210SubMsgType0x13(\n        @TarsId(0) @JvmField val uint32SrcAppId: Long? = null,\n        @TarsId(1) @JvmField val uint32SrcInstId: Long? = null,\n        @TarsId(2) @JvmField val uint32DstAppId: Long? = null,\n        @TarsId(3) @JvmField val uint32DstInstId: Long? = null,\n        @TarsId(4) @JvmField val uint64DstUin: Long? = null,\n        @TarsId(5) @JvmField val uint64Sessionid: Long? = null,\n        @TarsId(6) @JvmField val uint32Size: Long? = null,\n        @TarsId(7) @JvmField val uint32Index: Long? = null,\n        @TarsId(8) @JvmField val uint32Type: Long? = null,\n        @TarsId(9) @JvmField val buf: ByteArray? = null,\n    ) : JceStruct\n\n    @Serializable\n    internal class MsgType0x210SubMsgType0x17(\n        @TarsId(0) @JvmField val dwOpType: Long? = null,\n        @TarsId(1) @JvmField val stAddGroup: AddGroup? = null,\n        @TarsId(2) @JvmField val stDelGroup: DelGroup? = null,\n        @TarsId(3) @JvmField val stModGroupName: ModGroupName? = null,\n        @TarsId(4) @JvmField val stModGroupSort: ModGroupSort? = null,\n        @TarsId(5) @JvmField val stModFriendGroup: ModFriendGroup? = null,\n    ) : JceStruct\n\n    @Serializable\n    internal class AddGroup(\n        @TarsId(0) @JvmField val dwGroupID: Long? = null,\n        @TarsId(1) @JvmField val dwSortID: Long? = null,\n        @TarsId(2) @JvmField val groupName: String? = \"\",\n    ) : JceStruct\n\n    @Serializable\n    internal class DelGroup(\n        @TarsId(0) @JvmField val dwGroupID: Long? = null,\n    ) : JceStruct\n\n    @Serializable\n    internal class ModFriendGroup(\n        @TarsId(0) @JvmField val vMsgFrdGroup: List<FriendGroup>? = null,\n    ) : JceStruct\n\n    @Serializable\n    internal class FriendGroup(\n        @TarsId(0) @JvmField val dwFuin: Long? = null,\n        @TarsId(1) @JvmField val vOldGroupID: List<Long>? = null,\n        @TarsId(2) @JvmField val vNewGroupID: List<Long>? = null,\n    ) : JceStruct\n\n    @Serializable\n    internal class ModGroupName(\n        @TarsId(0) @JvmField val dwGroupID: Long? = null,\n        @TarsId(1) @JvmField val groupName: String? = \"\",\n    ) : JceStruct\n\n    @Serializable\n    internal class ModGroupSort(\n        @TarsId(0) @JvmField val vMsgGroupSort: List<GroupSort>? = null,\n    ) : JceStruct\n\n    @Serializable\n    internal class GroupSort(\n        @TarsId(0) @JvmField val dwGroupID: Long? = null,\n        @TarsId(1) @JvmField val dwSortID: Long? = null,\n    ) : JceStruct\n\n    @Serializable\n    internal class MsgType0x210SubMsgType0x1d(\n        @TarsId(0) @JvmField val dwOpType: Long? = null,\n        @TarsId(1) @JvmField val dwUin: Long? = null,\n        @TarsId(2) @JvmField val dwID: Long? = null,\n        @TarsId(3) @JvmField val value: String? = \"\",\n    ) : JceStruct\n\n    @Serializable\n    internal class MsgType0x210SubMsgType0x2(\n        @TarsId(0) @JvmField val uSrcAppId: Long? = null,\n        @TarsId(1) @JvmField val uSrcInstId: Long? = null,\n        @TarsId(2) @JvmField val uDstAppId: Long? = null,\n        @TarsId(3) @JvmField val uDstInstId: Long? = null,\n        @TarsId(4) @JvmField val uDstUin: Long? = null,\n        @TarsId(5) @JvmField val fileName: ByteArray? = null,\n        @TarsId(6) @JvmField val fileIndex: ByteArray? = null,\n        @TarsId(7) @JvmField val fileMd5: ByteArray? = null,\n        @TarsId(8) @JvmField val fileKey: ByteArray? = null,\n        @TarsId(9) @JvmField val uServerIp: Long? = null,\n        @TarsId(10) @JvmField val uServerPort: Long? = null,\n        @TarsId(11) @JvmField val fileLen: Long? = null,\n        @TarsId(12) @JvmField val sessionId: Long? = null,\n        @TarsId(13) @JvmField val originfileMd5: ByteArray? = null,\n        @TarsId(14) @JvmField val uOriginfiletype: Long? = null,\n        @TarsId(15) @JvmField val uSeq: Long? = null,\n    ) : JceStruct\n\n    @Serializable\n    internal class MsgType0x210SubMsgType0x20(\n        @TarsId(0) @JvmField val dwOpType: Long? = null,\n        @TarsId(1) @JvmField val dwType: Long? = null,\n        @TarsId(2) @JvmField val dwUin: Long? = null,\n        @TarsId(3) @JvmField val remaek: String? = \"\",\n    ) : JceStruct\n\n    @Serializable\n    internal class MsgType0x210SubMsgType0x24(\n        @TarsId(0) @JvmField val vPluginNumList: List<PluginNum>? = null,\n    ) : JceStruct\n\n    @Serializable\n    internal class PluginNum(\n        @TarsId(0) @JvmField val dwID: Long? = null,\n        @TarsId(1) @JvmField val dwNUm: Long? = null,\n        @TarsId(2) @JvmField val flag: Byte? = null,\n    ) : JceStruct\n\n    @Serializable\n    internal class MsgType0x210SubMsgType0xa(\n        @TarsId(0) @JvmField val uSrcAppId: Long? = null,\n        @TarsId(1) @JvmField val uSrcInstId: Long? = null,\n        @TarsId(2) @JvmField val uDstAppId: Long? = null,\n        @TarsId(3) @JvmField val uDstInstId: Long? = null,\n        @TarsId(4) @JvmField val uDstUin: Long? = null,\n        @TarsId(5) @JvmField val uType: Long? = null,\n        @TarsId(6) @JvmField val uServerIp: Long? = null,\n        @TarsId(7) @JvmField val uServerPort: Long? = null,\n        @TarsId(8) @JvmField val vUrlNotify: ByteArray? = null,\n        @TarsId(9) @JvmField val vTokenKey: ByteArray? = null,\n        @TarsId(10) @JvmField val uFileLen: Long? = null,\n        @TarsId(11) @JvmField val fileName: ByteArray? = null,\n        @TarsId(12) @JvmField val vMd5: ByteArray? = null,\n        @TarsId(13) @JvmField val sessionId: Long? = null,\n        @TarsId(14) @JvmField val originfileMd5: ByteArray? = null,\n        @TarsId(15) @JvmField val uOriginfiletype: Long? = null,\n        @TarsId(16) @JvmField val uSeq: Long? = null,\n    ) : JceStruct\n\n    @Serializable\n    internal class MsgType0x210SubMsgType0xe(\n        @TarsId(0) @JvmField val uint32SrcAppId: Long? = null,\n        @TarsId(1) @JvmField val uint32SrcInstId: Long? = null,\n        @TarsId(2) @JvmField val uint32DstAppId: Long? = null,\n        @TarsId(3) @JvmField val uint32DstInstId: Long? = null,\n        @TarsId(4) @JvmField val uint64DstUin: Long? = null,\n        @TarsId(5) @JvmField val uint64Sessionid: Long? = null,\n        @TarsId(6) @JvmField val uint32Operate: Long? = null,\n        @TarsId(7) @JvmField val uint32Seq: Long? = null,\n        @TarsId(8) @JvmField val uint32Code: Long? = null,\n        @TarsId(9) @JvmField val msg: String? = \"\",\n    ) : JceStruct\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/PushNotifyPack.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.NestedStructure\nimport net.mamoe.mirai.internal.utils.io.NestedStructureDesensitizer\nimport net.mamoe.mirai.internal.utils.io.ProtocolStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\n@Suppress(\"ArrayInDataClass\")\n@Serializable\ninternal class RequestPushNotify(\n    @TarsId(0) @JvmField val uin: Long? = 0L,\n    @TarsId(1) @JvmField val ctype: Byte = 0,\n    @TarsId(2) @JvmField val strService: String?,\n    @TarsId(3) @JvmField val strCmd: String?,\n    @TarsId(4) @JvmField val vNotifyCookie: ByteArray? = EMPTY_BYTE_ARRAY,\n    @TarsId(5) @JvmField val usMsgType: Int?,\n    @TarsId(6) @JvmField val wUserActive: Int?,\n    @TarsId(7) @JvmField val wGeneralFlag: Int?,\n    @TarsId(8) @JvmField val bindedUin: Long?,\n    @TarsId(9) @JvmField val stMsgInfo: MsgInfo?,\n    @TarsId(10) @JvmField val msgCtrlBuf: String?,\n    @TarsId(11) @JvmField val serverBuf: ByteArray?,\n    @TarsId(12) @JvmField val pingFlag: Long?,\n    @TarsId(13) @JvmField val svrip: Int?,\n) : JceStruct, Packet {\n    override fun toString(): String {\n        return \"RequestPushNotify(usMsgType=$usMsgType)\"\n    }\n}\n\n@Serializable\ninternal class MsgInfo(\n    @TarsId(0) @JvmField val lFromUin: Long = 0L,\n    @TarsId(1) @JvmField val uMsgTime: Long = 0L,\n    @TarsId(2) @JvmField val shMsgType: Short,\n    @TarsId(3) @JvmField val shMsgSeq: Short,\n    @TarsId(4) @JvmField val strMsg: String?,\n    @TarsId(5) @JvmField val uRealMsgTime: Int?,\n    @param:NestedStructure(VMsgDesensitizationSerializer::class)\n    @TarsId(6) @JvmField val vMsg: ByteArray,\n    @TarsId(7) @JvmField val uAppShareID: Long?,\n    @TarsId(8) @JvmField val vMsgCookies: ByteArray? = EMPTY_BYTE_ARRAY,\n    @TarsId(9) @JvmField val vAppShareCookie: ByteArray? = EMPTY_BYTE_ARRAY,\n    @TarsId(10) @JvmField val lMsgUid: Long?,\n    @TarsId(11) @JvmField val lLastChangeTime: Long?,\n    @TarsId(12) @JvmField val vCPicInfo: List<CPicInfo>?,\n    @TarsId(13) @JvmField val stShareData: ShareData?,\n    @TarsId(14) @JvmField val lFromInstId: Long?,\n    @TarsId(15) @JvmField val vRemarkOfSender: ByteArray?,\n    @TarsId(16) @JvmField val strFromMobile: String?,\n    @TarsId(17) @JvmField val strFromName: String?,\n    @TarsId(18) @JvmField val vNickName: List<String>?, //,\n    //@SerialId(19) @JvmField val stC2CTmpMsgHead: TempMsgHead?\n) : JceStruct\n\ninternal object VMsgDesensitizationSerializer : NestedStructureDesensitizer<MsgInfo, ProtocolStruct> {\n    override fun deserialize(context: MsgInfo, byteArray: ByteArray): ProtocolStruct? {\n        return when (context.shMsgType.toUShort().toInt()) {\n            0x210 -> byteArray.loadAs(MsgType0x210.serializer())\n            else -> null\n        }\n    }\n}\n\n\n@Serializable\ninternal class ShareData(\n    @TarsId(0) @JvmField val pkgname: String = \"\",\n    @TarsId(1) @JvmField val msgtail: String = \"\",\n    @TarsId(2) @JvmField val picurl: String = \"\",\n    @TarsId(3) @JvmField val url: String = \"\",\n) : JceStruct\n\n@Serializable\ninternal class TempMsgHead(\n    @TarsId(0) @JvmField val c2c_type: Int? = 0,\n    @TarsId(1) @JvmField val serviceType: Int? = 0,\n) : JceStruct\n\n@Serializable\ninternal class CPicInfo(\n    @TarsId(0) @JvmField val vPath: ByteArray = EMPTY_BYTE_ARRAY,\n    @TarsId(1) @JvmField val vHost: ByteArray? = EMPTY_BYTE_ARRAY,\n) : JceStruct"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/ReqPushStatus.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport kotlin.jvm.JvmField\n\n\n@Serializable\ninternal class RequestPushStatus(\n    @JvmField @TarsId(0) val uin: Long,\n    @JvmField @TarsId(1) val status: Byte,\n    @JvmField @TarsId(2) val dataLine: Byte? = null,\n    @JvmField @TarsId(3) val printable: Byte? = null,\n    @JvmField @TarsId(4) val viewFile: Byte? = null,\n    @JvmField @TarsId(5) val nPCVer: Long? = null,\n    @JvmField @TarsId(6) val nClientType: Long? = null,\n    @JvmField @TarsId(7) val nInstanceId: Long? = null,\n    @JvmField @TarsId(8) val vecInstanceList: List<InstanceInfo>? = null,\n) : JceStruct, Packet\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/ReqSummaryCard.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport kotlin.jvm.JvmField\n\n\n@Serializable\ninternal class ReqHead(\n    @JvmField @TarsId(0) val iVersion: Int = 1,\n) : JceStruct\n\n@Serializable\ninternal class ReqSummaryCard(\n    @JvmField @TarsId(0) val uin: Long,\n    @JvmField @TarsId(1) val eComeFrom: Int = 65535,\n    @JvmField @TarsId(2) val uQzoneFeedTimestamp: Long? = null,\n    @JvmField @TarsId(3) val isFriend: Byte? = null,\n    @JvmField @TarsId(4) val groupCode: Long? = null,\n    @JvmField @TarsId(5) val groupUin: Long? = null,\n    //@JvmField @TarsId(6) val vSeed: ByteArray? = null,\n    //@JvmField @TarsId(7) val searchName: String? = \"\",\n    @JvmField @TarsId(8) val getControl: Long? = null,\n    @JvmField @TarsId(9) val eAddFriendSource: Int? = null,\n    @JvmField @TarsId(10) val vSecureSig: ByteArray? = null,\n    //@JvmField @TarsId(11) val vReqLastGameInfo: ByteArray? = null,\n    //@JvmField @TarsId(12) val vReqTemplateInfo: ByteArray? = null,\n    //@JvmField @TarsId(13) val vReqStarInfo: ByteArray? = null,\n    //@JvmField @TarsId(14) val vvReqServices: List<ByteArray>? = null,\n    @JvmField @TarsId(15) val tinyId: Long? = null,\n    @JvmField @TarsId(16) val uLikeSource: Long? = null,\n    //@JvmField @TarsId(17) val stLocaleInfo: UserLocaleInfo? = null,\n    @JvmField @TarsId(18) val reqMedalWallInfo: Byte? = null,\n    @JvmField @TarsId(19) val vReq0x5ebFieldId: List<Int>? = null,\n    @JvmField @TarsId(20) val reqNearbyGodInfo: Byte? = null,\n    //@JvmField @TarsId(21) val reqCommLabel: Byte? = null,\n    @JvmField @TarsId(22) val reqExtendCard: Byte? = null,\n    //@JvmField @TarsId(23) val vReqKandianInfo: ByteArray? = null,\n    //@JvmField @TarsId(24) val uRichCardNameVer: Long? = null\n) : JceStruct\n\n@Serializable\ninternal class RespHead(\n    @JvmField @TarsId(0) val iVersion: Int,\n    @JvmField @TarsId(1) val iResult: Int,\n    @JvmField @TarsId(2) val errorMsg: String = \"\",\n    @JvmField @TarsId(3) val vCookies: ByteArray? = null,\n) : JceStruct\n\n@Serializable\ninternal class RespSearch(\n    @JvmField @TarsId(0) val vRecords: List<SearchInfo>,\n    @JvmField @TarsId(1) val vSecureSig: ByteArray? = null,\n    @JvmField @TarsId(2) val vvRespServices: List<ByteArray>? = null,\n) : JceStruct\n\n@Serializable\ninternal class RespSummaryCard(\n    //    @JvmField @TarsId(0) val iFace: Int? = null,\n    @JvmField @TarsId(1) val sex: Byte? = null,\n    @JvmField @TarsId(2) val age: Byte? = null,\n    @JvmField @TarsId(3) val nick: String? = \"\",\n    @JvmField @TarsId(4) val remark: String? = \"\",\n    @JvmField @TarsId(5) val iLevel: Int? = null,\n    @JvmField @TarsId(6) val province: String? = \"\",\n    @JvmField @TarsId(7) val city: String? = \"\",\n    @JvmField @TarsId(8) val sign: String? = \"\",\n    @JvmField @TarsId(9) val groupName: String? = \"\",\n    @JvmField @TarsId(10) val groupNick: String? = \"\",\n    @JvmField @TarsId(11) val mobile: String? = \"\",\n    @JvmField @TarsId(12) val contactName: String? = \"\",\n    @JvmField @TarsId(13) val ulShowControl: Long? = null,\n    @JvmField @TarsId(14) val qzoneFeedsDesc: String? = \"\",\n    //    @JvmField @TarsId(15)  val oLatestPhotos:AlbumInfo? = null,\n    @JvmField @TarsId(16) val iVoteCount: Int? = null,\n    @JvmField @TarsId(17) val iLastestVoteCount: Int? = null,\n    @JvmField @TarsId(18) val valid4Vote: Byte? = null,\n    @JvmField @TarsId(19) val country: String? = \"\",\n    @JvmField @TarsId(20) val status: String? = \"\",\n    @JvmField @TarsId(21) val autoRemark: String? = \"\",\n    @JvmField @TarsId(22) val cacheControl: Long? = null,\n    @JvmField @TarsId(23) val uin: Long? = null,\n    @JvmField @TarsId(24) val iPhotoCount: Int? = null,\n    @JvmField @TarsId(25) val eAddOption: Int? = 101,\n    @JvmField @TarsId(26) val vAddQuestion: List<String>? = null,\n    @JvmField @TarsId(27) val vSeed: ByteArray? = null,\n    @JvmField @TarsId(28) val discussName: String? = \"\",\n    @JvmField @TarsId(29) val stVipInfo: VipBaseInfo? = null,\n    @JvmField @TarsId(30) val showName: String? = \"\",\n    @JvmField @TarsId(31) val stVoiceInfo: VoiceInfo? = null,\n    @JvmField @TarsId(32) val vRichSign: ByteArray? = null,\n    @JvmField @TarsId(33) val uSignModifyTime: Long? = null,\n    @JvmField @TarsId(34) val vRespLastGameInfo: ByteArray? = null,\n    @JvmField @TarsId(35) val userFlag: Long? = null,\n    @JvmField @TarsId(36) val uLoginDays: Long? = null,\n    @JvmField @TarsId(37) val loginDesc: String? = \"\",\n    @JvmField @TarsId(38) val uTemplateId: Long? = null,\n    @JvmField @TarsId(39) val uQQMasterLoginDays: Long? = 20L,\n    @JvmField @TarsId(40) val ulFaceAddonId: Long? = null,\n    @JvmField @TarsId(41) val vRespTemplateInfo: ByteArray? = null,\n    @JvmField @TarsId(42) val respMusicInfo: String? = \"\",\n    @JvmField @TarsId(43) val vRespStarInfo: ByteArray? = null,\n    @JvmField @TarsId(44) val stDiamonds: VipBaseInfo? = null,\n    @JvmField @TarsId(45) val uAccelerateMultiple: Long? = null,\n    @JvmField @TarsId(46) val vvRespServices: List<ByteArray>? = null,\n    @JvmField @TarsId(47) val spaceName: String? = \"\",\n    //    @JvmField @TarsId(48)  val stDateCard:DateCard? = null,\n    @JvmField @TarsId(49) val iBirthday: Int? = null,\n    //    @JvmField @TarsId(50)  val stQCallInfo:QCallInfo? = null,\n    //    @JvmField @TarsId(51)  val stGiftInfo:GiftInfo? = null,\n    //    @JvmField @TarsId(52)  val stPanSocialInfo:PanSocialInfo? = null,\n    //    @JvmField @TarsId(53)  val stVideoInfo:QQVideoInfo? = null,\n    @JvmField @TarsId(54) val vTempChatSig: ByteArray? = null,\n    //    @JvmField @TarsId(55)  val stInterestTag:InterestTagInfo? = null,\n    //    @JvmField @TarsId(56) val stUserFeed: UserFeed? = null,\n    //    @JvmField @TarsId(57)  val stQiqiVideoInfo:QiqiVideoInfo? = null,\n    //    @JvmField @TarsId(58)  val stPrivInfo:PrivilegeBaseInfo? = null,\n    //    @JvmField @TarsId(59)  val stApollo:QQApolloInfo? = null,\n    //    @JvmField @TarsId(60)  val stAddFrdSrcInfo:AddFrdSrcInfo? = null,\n    //    @JvmField @TarsId(61)  val stBindPhoneInfo:BindPhoneInfo? = null,\n    @JvmField @TarsId(62) val vVisitingCardInfo: ByteArray? = null,\n    @JvmField @TarsId(63) val voteLimitedNotice: String? = \"\",\n    @JvmField @TarsId(64) val haveVotedCnt: Short? = null,\n    @JvmField @TarsId(65) val availVoteCnt: Short? = null,\n    @JvmField @TarsId(66) val eIMBindPhoneNum: String? = \"\",\n    @JvmField @TarsId(67) val eIMId: String? = \"\",\n    @JvmField @TarsId(68) val email: String? = \"\",\n    @JvmField @TarsId(69) val uCareer: Long? = null,\n    @JvmField @TarsId(70) val personal: String? = \"\",\n    @JvmField @TarsId(71) val vHotChatInfo: ByteArray? = null,\n    //    @JvmField @TarsId(72)  val stOlympicInfo:OlympicInfo? = null,\n    @JvmField @TarsId(73) val stCoverInfo: TCoverInfo? = null,\n    @JvmField @TarsId(74) val stNowBroadcastInfo: TNowBroadcastInfo? = null,\n    //    @JvmField @TarsId(75)  val stEimInfo:TEIMInfo? = null,\n    @JvmField @TarsId(78) val stVideoHeadInfo: TVideoHeadInfo? = null,\n    @JvmField @TarsId(79) val iContactNotBindQQ: Int? = null,\n    //    @JvmField @TarsId(80)  val stMedalWallInfo:TMedalWallInfo? = null,\n    @JvmField @TarsId(81) val vvRespServicesBigOrder: List<ByteArray>? = null,\n    @JvmField @TarsId(82) val vResp0x5ebInfo: ByteArray? = null,\n    @JvmField @TarsId(83) val stNearbyGodInfo: TNearbyGodInfo? = null,\n    @JvmField @TarsId(84) val vRespQQStoryInfo: ByteArray? = null,\n    @JvmField @TarsId(85) val vRespCustomLabelInfo: ByteArray? = null,\n    @JvmField @TarsId(86) val vPraiseList: List<TPraiseInfo>? = null,\n    @JvmField @TarsId(87) val stCampusCircleInfo: TCampusCircleInfo? = null,\n    @JvmField @TarsId(88) val stTimInfo: TTimInfo? = null,\n    @JvmField @TarsId(89) val stQimInfo: TQimInfo? = null,\n    //    @JvmField @TarsId(90)  val stHeartInfo:HeartInfo? = null,\n    @JvmField @TarsId(91) val vQzoneCoverInfo: ByteArray? = null,\n    @JvmField @TarsId(92) val vNearbyTaskInfo: ByteArray? = null,\n    @JvmField @TarsId(93) val vNowInfo: ByteArray? = null,\n    @JvmField @TarsId(94) val uFriendGroupId: Long? = null,\n    @JvmField @TarsId(95) val vCommLabel: ByteArray? = null,\n    @JvmField @TarsId(96) val vExtendCard: ByteArray? = null,\n    @JvmField @TarsId(97) val qzoneHeader: String? = \"\",\n    @JvmField @TarsId(98) val mapQzoneEx: Map<String, String>? = null,\n    @JvmField @TarsId(99) val vRespKandianInfo: ByteArray? = null,\n    //    @JvmField @TarsId(100) val stWeishiInfo:WeishiInfo? = null,\n    @JvmField @TarsId(101) val uRichCardNameVer: Long? = null,\n    @JvmField @TarsId(102) val uCurMulType: Long? = null,\n    @JvmField @TarsId(103) val vLongNickTopicInfo: ByteArray? = null,\n) : JceStruct\n\n@Serializable\ninternal class RespVoiceManage(\n    @JvmField @TarsId(0) val eOpType: Int,\n) : JceStruct\n\n@Serializable\ninternal class SearchInfo(\n    @JvmField @TarsId(0) val uIN: Long,\n    @JvmField @TarsId(1) val eSource: Int,\n    @JvmField @TarsId(2) val nick: String? = \"\",\n    @JvmField @TarsId(3) val mobile: String? = \"\",\n    @JvmField @TarsId(4) val isFriend: Byte? = null,\n    @JvmField @TarsId(5) val inContact: Byte? = null,\n    @JvmField @TarsId(6) val isEnterpriseQQ: Byte? = null,\n) : JceStruct\n\n@Serializable\ninternal class TCampusCircleInfo(\n    @JvmField @TarsId(0) val iIsSigned: Int? = null,\n    @JvmField @TarsId(1) val name: String? = \"\",\n    @JvmField @TarsId(2) val academy: String? = \"\",\n    @JvmField @TarsId(3) val eStatus: Int? = null,\n    @JvmField @TarsId(4) val stSchoolInfo: TCampusSchoolInfo? = null,\n) : JceStruct\n\n@Serializable\ninternal class TCampusSchoolInfo(\n    @JvmField @TarsId(0) val uTimestamp: Long? = null,\n    @JvmField @TarsId(1) val uSchoolId: Long? = null,\n    @JvmField @TarsId(2) val iIsValidForCertified: Int? = null,\n) : JceStruct\n\n@Serializable\ninternal class TCoverInfo(\n    @JvmField @TarsId(0) val vTagInfo: ByteArray? = null,\n) : JceStruct\n\n\n@Serializable\ninternal class TNearbyGodInfo(\n    @JvmField @TarsId(0) val iIsGodFlag: Int? = null,\n    @JvmField @TarsId(1) val jumpUrl: String? = \"\",\n) : JceStruct\n\n@Serializable\ninternal class TNowBroadcastInfo(\n    @JvmField @TarsId(0) val iFlag: Int? = null,\n    @JvmField @TarsId(1) val iconURL: String? = \"\",\n    @JvmField @TarsId(2) val hrefURL: String? = \"\",\n    @JvmField @TarsId(3) val vAnchorDataRsp: ByteArray? = null,\n) : JceStruct\n\n@Serializable\ninternal class TPraiseInfo(\n    @JvmField @TarsId(0) val uCustomId: Long? = null,\n    @JvmField @TarsId(1) val iIsPayed: Int? = null,\n) : JceStruct\n\n@Serializable\ninternal class TQimInfo(\n    @JvmField @TarsId(0) val iIsOnline: Int? = null,\n) : JceStruct\n\n@Serializable\ninternal class TTimInfo(\n    @JvmField @TarsId(0) val iIsOnline: Int? = null,\n) : JceStruct\n\n@Serializable\ninternal class TVideoHeadInfo(\n    @JvmField @TarsId(0) val iNearbyFlag: Int? = null,\n    @JvmField @TarsId(1) val iBasicFlag: Int? = null,\n    @JvmField @TarsId(2) val vMsg: ByteArray? = null,\n) : JceStruct\n\n@Serializable\ninternal class UserFeed(\n    @JvmField @TarsId(0) val uFlag: Long? = null,\n    @JvmField @TarsId(1) val vFeedInfo: ByteArray? = null,\n) : JceStruct\n\n@Serializable\ninternal class UserLocaleInfo(\n    @JvmField @TarsId(1) val longitude: Long? = null,\n    @JvmField @TarsId(2) val latitude: Long? = null,\n) : JceStruct\n\n@Serializable\ninternal class VoiceInfo(\n    @JvmField @TarsId(0) val vVoiceId: ByteArray? = null,\n    @JvmField @TarsId(1) val shDuration: Short? = null,\n    @JvmField @TarsId(2) val read: Byte? = 2,\n    @JvmField @TarsId(3) val url: String? = \"\",\n) : JceStruct\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/RequestMSFForceOffline.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class RequestMSFForceOffline(\n    @TarsId(0) @JvmField val uin: Long = 0L,\n    @TarsId(1) @JvmField val iSeqno: Long = 0L,\n    @TarsId(2) @JvmField val kickType: Byte = 0,\n    @TarsId(3) @JvmField val info: String = \"\",\n    @TarsId(4) @JvmField val title: String? = \"\",\n    @TarsId(5) @JvmField val sigKick: Byte? = 0,\n    @TarsId(6) @JvmField val vecSigKickData: ByteArray? = null,\n    @TarsId(7) @JvmField val sameDevice: Byte? = 0,\n) : JceStruct\n\n\n@Serializable\ninternal class RspMSFForceOffline(\n    @TarsId(0) @JvmField val uin: Long,\n    @TarsId(1) @JvmField val seq: Long,\n    @TarsId(2) @JvmField val const: Byte = 0,\n) : JceStruct"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/RequestPacket.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\nprivate val EMPTY_MAP = mapOf<String, String>()\n\n@Serializable\ninternal class RequestPacket(\n    @TarsId(1) @JvmField val version: Short? = 3,\n    @TarsId(2) @JvmField val cPacketType: Byte = 0,\n    @TarsId(3) @JvmField val iMessageType: Int = 0,\n    @TarsId(4) @JvmField val requestId: Int = 0,\n    @TarsId(5) @JvmField val servantName: String = \"\",\n    @TarsId(6) @JvmField val funcName: String = \"\",\n    @TarsId(7) @JvmField val sBuffer: ByteArray = EMPTY_BYTE_ARRAY,\n    @TarsId(8) @JvmField val iTimeout: Int? = 0,\n    @TarsId(9) @JvmField val context: Map<String, String>? = EMPTY_MAP,\n    @TarsId(10) @JvmField val status: Map<String, String>? = EMPTY_MAP,\n) : JceStruct\n\n@Serializable\ninternal class RequestDataVersion3(\n    @TarsId(0) @JvmField val map: Map<String, ByteArray>, // 注意: ByteArray 不能直接放序列化的 JceStruct!! 要放类似 RequestDataStructSvcReqRegister 的\n) : JceStruct\n\n@Serializable\ninternal class RequestDataVersion2(\n    @TarsId(0) @JvmField val map: Map<String, Map<String, ByteArray>>,\n) : JceStruct\n\n@Serializable\ninternal class RequestDataStructSvcReqRegister(\n    @TarsId(0) @JvmField val struct: SvcReqRegister,\n) : JceStruct"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/RequestPushForceOffline.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class RequestPushForceOffline(\n    @TarsId(0) @JvmField val uin: Long,\n    @TarsId(1) @JvmField val title: String = \"\",\n    @TarsId(2) @JvmField val tips: String = \"\",\n    @TarsId(3) @JvmField val sameDevice: Byte? = null,\n) : JceStruct, Packet"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/SetGroupPack.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport kotlin.jvm.JvmField\n\n\n@Serializable\ninternal class SetGroupReq(\n    @JvmField @TarsId(0) val reqtype: Int = 0,\n    @JvmField @TarsId(1) val uin: Long = 0L,\n    @JvmField @TarsId(2) val vecBody: ByteArray? = null\n) : JceStruct\n\n@Serializable\ninternal class SetGroupResp(\n    @JvmField @TarsId(0) val reqtype: Byte = 0,\n    @JvmField @TarsId(1) val result: Byte = 0,\n    @JvmField @TarsId(2) val vecBody: ByteArray? = null,\n    @JvmField @TarsId(3) val errorString: String = \"\"\n) : JceStruct"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/SvcDevLoginInfo.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal data class SvcDevLoginInfo(\n    @JvmField @TarsId(0) val iAppId: Long,\n    // @JvmField @TarsId(1) val vecGuid: ByteArray? = null,\n    @JvmField @TarsId(2) val iLoginTime: Long,\n    @JvmField @TarsId(3) val iLoginPlatform: Long? = null, // 1: ios, 2: android, 3: windows, 4: symbian, 5: feature\n    @JvmField @TarsId(4) val loginLocation: String? = \"\",\n    @JvmField @TarsId(5) val deviceName: String? = \"\",\n    @JvmField @TarsId(6) val deviceTypeInfo: String? = \"\",\n    // @JvmField @TarsId(7) val stDeviceItemDes: DeviceItemDes? = null,\n    @JvmField @TarsId(8) val iTerType: Long? = null, // 1:windows, 2: mobile, 3: ios\n    @JvmField @TarsId(9) val iProductType: Long? = null, // always 0\n    @JvmField @TarsId(10) val iCanBeKicked: Long? = null, // isOnline\n) : JceStruct\n\n/*\nvecCurrentLoginDevInfo=[SvcDevLoginInfo#1676411955 {\n        deviceName=mirai\n        deviceTypeInfo=mirai\n        iAppId=0x000000002002E738(537061176)\n        iCanBeKicked=0x0000000000000001(1)\n        iLoginPlatform=0x0000000000000002(2)\n        iLoginTime=0x000000005FE4A45C(1608819804)\n        iProductType=0x0000000000000000(0)\n        iTerType=0x0000000000000002(2)\n}, SvcDevLoginInfo#1676411955 {\n        deviceName=xxx的iPad\n        deviceTypeInfo=iPad\n        iAppId=0x000000002002FB7C(537066364)\n        iCanBeKicked=0x0000000000000001(1)\n        iLoginPlatform=0x0000000000000001(1)\n        iLoginTime=0x000000005FE4A418(1608819736)\n        iProductType=0x0000000000000000(0)\n        iTerType=0x0000000000000003(3)\n}, SvcDevLoginInfo#1676411955 {\n        deviceName=Mi 10 Pro\n        deviceTypeInfo=Mi 10 Pro\n        iAppId=0x000000002002FBB7(537066423)\n        iCanBeKicked=0x0000000000000001(1)\n        iLoginPlatform=0x0000000000000002(2)\n        iLoginTime=0x000000005FE4A628(1608820264)\n        iProductType=0x0000000000000000(0)\n        iTerType=0x0000000000000002(2)\n}, SvcDevLoginInfo#1676411955 {\n        deviceName=DESKTOP-KMQEB7V\n        deviceTypeInfo=电脑\n        iAppId=0x0000000000000001(1)\n        iCanBeKicked=0x0000000000000001(1)\n        iLoginPlatform=0x0000000000000003(3)\n        iLoginTime=0x000000005FE4A5C1(1608820161)\n        iProductType=0x0000000000000000(0)\n        iTerType=0x0000000000000001(1)\n        loginLocation=中国湖北省武汉市\n}]\n */\n@Serializable\ninternal class SvcReqGetDevLoginInfo(\n    @JvmField @TarsId(0) val vecGuid: ByteArray,\n    @JvmField @TarsId(1) val appName: String = \"\",\n    @JvmField @TarsId(2) val iLoginType: Long = 1L,\n    @JvmField @TarsId(3) val iTimeStamp: Long,\n    @JvmField @TarsId(4) val iNextItemIndex: Long,\n    @JvmField @TarsId(5) val iRequireMax: Long,\n    @JvmField @TarsId(6) val iGetDevListType: Long? = 7L, // 1: online list 2: recent list? 4: getAuthLoginDevList?\n) : JceStruct\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/SvcReqMSFLoginNotifyData.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage  net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport kotlin.jvm.JvmField\n\n// ANDROID PHONE QQ\n\n// 2020-12-23 20:16:57 D/soutv: PK =\n//SvcReqMSFLoginNotifyData(iAppId=537066423,\n//status=2,\n//tablet=0,\n//iPlatform=109,\n//title=下线通知,\n//info=你的帐号在手机上退出了,\n//iProductType=0,\n//iClientType=65799,\n//vecInstanceList=[])\n\n// ANDROID PHONE QQ\n// 2020-12-23 20:21:02 D/soutv: PK = SvcReqMSFLoginNotifyData(\n//iAppId=537066423,\n//status=1,\n//tablet=0,\n//iPlatform=109, title=上线通知, info=你的帐号在手机上登录了, iProductType=0, iClientType=65799, vecInstanceList=[InstanceInfo(iAppId=537066423, tablet=0, iPlatform=109, iProductType=0, iClientType=65799)])\n\n@Serializable\ninternal data class SvcReqMSFLoginNotifyData(\n    @JvmField @TarsId(0) val iAppId: Long,\n    @JvmField @TarsId(1) val status: Byte, // 上线=1, 下线=2\n    @JvmField @TarsId(2) val tablet: Byte? = null,\n    @JvmField @TarsId(3) val iPlatform: Long? = null,\n    @JvmField @TarsId(4) val title: String? = \"\",\n    @JvmField @TarsId(5) val info: String? = \"\",\n    @JvmField @TarsId(6) val iProductType: Long? = null,\n    @JvmField @TarsId(7) val iClientType: Long? = null,\n    @JvmField @TarsId(8) val vecInstanceList: List<InstanceInfo>? = null,\n) : JceStruct\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/SvcReqRegister.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class SvcReqRegister(\n    @TarsId(0) @JvmField var lUin: Long = 0L,\n    @TarsId(1) @JvmField var lBid: Long = 0L,\n    @TarsId(2) @JvmField var cConnType: Byte = 0,\n    @TarsId(3) @JvmField var sOther: String = \"\",\n    @TarsId(4) @JvmField var iStatus: Int = 11,\n    @TarsId(5) @JvmField var bOnlinePush: Byte = 0,\n    @TarsId(6) @JvmField var bIsOnline: Byte = 0,\n    @TarsId(7) @JvmField var bIsShowOnline: Byte = 0,\n    @TarsId(8) @JvmField var bKikPC: Byte = 0,\n    @TarsId(9) @JvmField var bKikWeak: Byte = 0,\n    @TarsId(10) @JvmField var timeStamp: Long = 0L,\n    @TarsId(11) @JvmField var iOSVersion: Long = 0L,\n    @TarsId(12) @JvmField var cNetType: Byte = 0,\n    @TarsId(13) @JvmField var sBuildVer: String? = \"\",\n    @TarsId(14) @JvmField var bRegType: Byte = 0,\n    @TarsId(15) @JvmField var vecDevParam: ByteArray? = null,\n    @TarsId(16) @JvmField var vecGuid: ByteArray? = null,\n    @TarsId(17) @JvmField var iLocaleID: Int = 2052,\n    @TarsId(18) @JvmField var bSlientPush: Byte = 0,\n    @TarsId(19) @JvmField var strDevName: String? = null,\n    @TarsId(20) @JvmField var strDevType: String? = null,\n    @TarsId(21) @JvmField var strOSVer: String? = null,\n    @TarsId(22) @JvmField var bOpenPush: Byte,\n    @TarsId(23) @JvmField var iLargeSeq: Long,\n    @TarsId(24) @JvmField var iLastWatchStartTime: Long = 0L,\n    @TarsId(26) @JvmField var uOldSSOIp: Long = 0L,\n    @TarsId(27) @JvmField var uNewSSOIp: Long = 0L,\n    @TarsId(28) @JvmField var sChannelNo: String? = null,\n    @TarsId(29) @JvmField var lCpId: Long = 0L,\n    @TarsId(30) @JvmField var strVendorName: String? = null,\n    @TarsId(31) @JvmField var strVendorOSName: String? = null,\n    @TarsId(32) @JvmField var strIOSIdfa: String? = null,\n    @TarsId(33) @JvmField var bytes_0x769_reqbody: ByteArray? = null,\n    @TarsId(34) @JvmField var bIsSetStatus: Byte = 0,\n    @TarsId(35) @JvmField var vecServerBuf: ByteArray? = null,\n    @TarsId(36) @JvmField var bSetMute: Byte = 0,\n    // @SerialId(25) var vecBindUin: ArrayList<*>? = null // ?? 未知泛型\n) : JceStruct"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/SvcRequestPushReadedNotify.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"SpellCheckingInspection\")\n\npackage net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class SvcRequestPushReadedNotify(\n    @JvmField @TarsId(0) val notifyType: Byte,\n    @JvmField @TarsId(1) val vC2CReadedNotify: List<C2CMsgReadedNotify>? = null,\n    @JvmField @TarsId(2) val vGroupReadedNotify: List<GroupMsgReadedNotify>? = null,\n    @JvmField @TarsId(3) val vDisReadedNotify: List<DisMsgReadedNotify>? = null,\n) : JceStruct\n\n\n@Serializable\ninternal class C2CMsgReadedNotify(\n    @JvmField @TarsId(0) val peerUin: Long? = null,\n    @JvmField @TarsId(1) val lastReadTime: Long? = null,\n    @JvmField @TarsId(2) val flag: Long? = null,\n    @JvmField @TarsId(3) val phoneNum: String? = \"\",\n    @JvmField @TarsId(4) val bindedUin: Long? = null,\n) : JceStruct\n\n@Serializable\ninternal class DisMsgReadedNotify(\n    @JvmField @TarsId(0) val disUin: Long? = null,\n    @JvmField @TarsId(1) val opType: Long? = null,\n    @JvmField @TarsId(2) val memberSeq: Long? = null,\n    @JvmField @TarsId(3) val disMsgSeq: Long? = null,\n) : JceStruct\n\n\n@Serializable\ninternal class GPicInfo(\n    @JvmField @TarsId(0) val vPath: ByteArray,\n    @JvmField @TarsId(1) val vHost: ByteArray? = null,\n) : JceStruct\n\n\n@Serializable\ninternal class GroupMsgHead(\n    @JvmField @TarsId(0) val usCmdType: Int,\n    @JvmField @TarsId(1) val totalPkg: Byte,\n    @JvmField @TarsId(2) val curPkg: Byte,\n    @JvmField @TarsId(3) val usPkgSeq: Int,\n    @JvmField @TarsId(4) val dwReserved: Long,\n) : JceStruct\n\n@Serializable\ninternal class GroupMsgReadedNotify(\n    @JvmField @TarsId(0) val groupCode: Long? = null,\n    @JvmField @TarsId(1) val opType: Long? = null,\n    @JvmField @TarsId(2) val memberSeq: Long? = null,\n    @JvmField @TarsId(3) val groupMsgSeq: Long? = null,\n) : JceStruct\n\n@Serializable\ninternal class RequestPushGroupMsg(\n    @JvmField @TarsId(0) val uin: Long,\n    @JvmField @TarsId(1) val type: Byte,\n    @JvmField @TarsId(2) val service: String = \"\",\n    @JvmField @TarsId(3) val cmd: String = \"\",\n    @JvmField @TarsId(4) val groupCode: Long,\n    @JvmField @TarsId(5) val groupType: Byte,\n    @JvmField @TarsId(6) val sendUin: Long,\n    @JvmField @TarsId(7) val lsMsgSeq: Long,\n    @JvmField @TarsId(8) val uMsgTime: Int,\n    @JvmField @TarsId(9) val infoSeq: Long,\n    @JvmField @TarsId(10) val shMsgLen: Short,\n    @JvmField @TarsId(11) val vMsg: ByteArray,\n    @JvmField @TarsId(12) val groupCard: String? = \"\",\n    @JvmField @TarsId(13) val uAppShareID: Long? = null,\n    @JvmField @TarsId(14) val vGPicInfo: List<GPicInfo>? = null,\n    @JvmField @TarsId(15) val vAppShareCookie: ByteArray? = null,\n    @JvmField @TarsId(16) val stShareData: ShareData? = null,\n    @JvmField @TarsId(17) val fromInstId: Long? = null,\n    @JvmField @TarsId(18) val stGroupMsgHead: GroupMsgHead? = null,\n    @JvmField @TarsId(19) val wUserActive: Int? = null,\n    @JvmField @TarsId(20) val vMarketFace: List<MarketFaceInfo>? = null,\n    @JvmField @TarsId(21) val uSuperQQBubbleId: Long? = null,\n) : JceStruct\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/SvcRespRegister.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.network.FriendListCache\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport kotlin.jvm.JvmField\n\n\n@Serializable\ninternal class SvcRespRegister(\n    @JvmField @TarsId(0) val uin: Long = 0L,\n    @JvmField @TarsId(1) val bid: Long = 0L,\n    @JvmField @TarsId(2) val replyCode: Byte = 0,\n    @JvmField @TarsId(3) val result: String = \"\",\n    @JvmField @TarsId(4) val serverTime: Long = 0L,\n    @JvmField @TarsId(5) val logQQ: Byte = 0,\n    @JvmField @TarsId(6) val needKik: Byte = 0,\n    @JvmField @TarsId(7) val updateFlag: Byte = 0,\n    @JvmField @TarsId(8) val timeStamp: Long = 0L,\n    @JvmField @TarsId(9) val crashFlag: Byte? = 0,\n    @JvmField @TarsId(10) val clientIP: String = \"\",\n    @JvmField @TarsId(11) val iClientPort: Int = 0,\n    @JvmField @TarsId(12) val iHelloInterval: Int = 300,\n    @JvmField @TarsId(13) val iLargeSeq: Long = 0L,\n    /**\n     * =1 好友列表更新\n     */\n    @JvmField @TarsId(14) val largeSeqUpdate: Byte = 0,\n    @JvmField @TarsId(15) val bytes_0x769_rspBody: ByteArray? = null,\n    @JvmField @TarsId(16) val iStatus: Int? = 0,\n) : JceStruct\n\ninternal fun FriendListCache.isValid(svcRespRegister: SvcRespRegister): Boolean {\n    return svcRespRegister.iLargeSeq == friendListSeq && svcRespRegister.timeStamp == timeStamp\n    //    return this.largeSeqUpdate != 0.toByte()\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/SvcRspGetDevLoginInfo.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class SvcRspGetDevLoginInfo(\n    @JvmField @TarsId(0) val iResult: Int,\n    @JvmField @TarsId(1) val result: String? = \"\",\n    @JvmField @TarsId(2) val iNextItemIndex: Long,\n    @JvmField @TarsId(3) val iTotalItemCount: Long,\n    @JvmField @TarsId(4) val vecCurrentLoginDevInfo: List<SvcDevLoginInfo>? = null,\n    @JvmField @TarsId(5) val vecHistoryLoginDevInfo: List<SvcDevLoginInfo>? = null,\n    @JvmField @TarsId(6) val vecAuthLoginDevInfo: List<SvcDevLoginInfo>? = null,\n) : JceStruct\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/jce/TroopList.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.jce\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class GetTroopListReqV2Simplify(\n    @TarsId(0) @JvmField val uin: Long,\n    @TarsId(1) @JvmField val getMSFMsgFlag: Byte? = null,\n    @TarsId(2) @JvmField val vecCookies: ByteArray? = null,\n    @TarsId(3) @JvmField val vecGroupInfo: List<StTroopNumSimplify>? = null,\n    @TarsId(4) @JvmField val groupFlagExt: Byte? = null,\n    @TarsId(5) @JvmField val shVersion: Int? = null,\n    @TarsId(6) @JvmField val dwCompanyId: Long? = null,\n    @TarsId(7) @JvmField val versionNum: Long? = null,\n    @TarsId(8) @JvmField val getLongGroupName: Byte? = null,\n) : JceStruct\n\n@Serializable\ninternal class StTroopNumSimplify(\n    @TarsId(0) @JvmField val groupCode: Long,\n    @TarsId(1) @JvmField val dwGroupInfoSeq: Long? = null,\n    @TarsId(2) @JvmField val dwGroupFlagExt: Long? = null,\n    @TarsId(3) @JvmField val dwGroupRankSeq: Long? = null,\n    @TarsId(4) @JvmField val dwGroupInfoExtSeq: Long? = 0L,\n) : JceStruct\n\n\n@Serializable\ninternal class GetTroopListRespV2(\n    @TarsId(0) @JvmField val uin: Long,\n    @TarsId(1) @JvmField val troopCount: Short,\n    @TarsId(2) @JvmField val result: Int,\n    @TarsId(3) @JvmField val errorCode: Short? = null,\n    @TarsId(4) @JvmField val vecCookies: ByteArray? = null,\n    @TarsId(5) @JvmField val vecTroopList: List<StTroopNum>? = null,\n    @TarsId(6) @JvmField val vecTroopListDel: List<StTroopNum>? = null,\n    @TarsId(7) @JvmField val vecTroopRank: List<StGroupRankInfo>? = null,\n    @TarsId(8) @JvmField val vecFavGroup: List<StFavoriteGroup>? = null,\n    @TarsId(9) @JvmField val vecTroopListExt: List<StTroopNum>? = null,\n    @TarsId(10) @JvmField val vecGroupInfoExt: List<Long>? = null,\n) : JceStruct\n\n\n@Serializable\ninternal class StTroopNum(\n    @TarsId(0) @JvmField val groupUin: Long,\n    @TarsId(1) @JvmField val groupCode: Long,\n    @TarsId(2) @JvmField val flag: Byte? = null,\n    @TarsId(3) @JvmField val dwGroupInfoSeq: Long? = null,\n    @TarsId(4) @JvmField val groupName: String = \"\",\n    @TarsId(5) @JvmField val groupMemo: String = \"\",\n    @TarsId(6) @JvmField val dwGroupFlagExt: Long? = null,\n    @TarsId(7) @JvmField val dwGroupRankSeq: Long? = null,\n    @TarsId(8) @JvmField val dwCertificationType: Long? = null,\n    @TarsId(9) @JvmField val dwShutUpTimestamp: Long? = null,\n    @TarsId(10) @JvmField val dwMyShutUpTimestamp: Long? = null,\n    @TarsId(11) @JvmField val dwCmdUinUinFlag: Long? = null,\n    @TarsId(12) @JvmField val dwAdditionalFlag: Long? = null,\n    @TarsId(13) @JvmField val dwGroupTypeFlag: Long? = null,\n    @TarsId(14) @JvmField val dwGroupSecType: Long? = null,\n    @TarsId(15) @JvmField val dwGroupSecTypeInfo: Long? = null,\n    @TarsId(16) @JvmField val dwGroupClassExt: Long? = null,\n    @TarsId(17) @JvmField val dwAppPrivilegeFlag: Long? = null,\n    @TarsId(18) @JvmField val dwSubscriptionUin: Long? = null,\n    @TarsId(19) @JvmField val dwMemberNum: Long? = null,\n    @TarsId(20) @JvmField val dwMemberNumSeq: Long? = null,\n    @TarsId(21) @JvmField val dwMemberCardSeq: Long? = null,\n    @TarsId(22) @JvmField val dwGroupFlagExt3: Long? = null,\n    @TarsId(23) @JvmField val dwGroupOwnerUin: Long,\n    @TarsId(24) @JvmField val isConfGroup: Byte? = null,\n    @TarsId(25) @JvmField val isModifyConfGroupFace: Byte? = null,\n    @TarsId(26) @JvmField val isModifyConfGroupName: Byte? = null,\n    @TarsId(27) @JvmField val dwCmduinJoinTime: Long? = null,\n    @TarsId(28) @JvmField val ulCompanyId: Long? = null,\n    @TarsId(29) @JvmField val dwMaxGroupMemberNum: Long? = null,\n    @TarsId(30) @JvmField val dwCmdUinGroupMask: Long? = null,\n    @TarsId(31) @JvmField val udwHLGuildAppid: Long? = null,\n    @TarsId(32) @JvmField val udwHLGuildSubType: Long? = null,\n    @TarsId(33) @JvmField val udwCmdUinRingtoneID: Long? = null,\n    @TarsId(34) @JvmField val udwCmdUinFlagEx2: Long? = null,\n    @TarsId(35) @JvmField val dwGroupFlagExt4: Long? = 0L,\n    @TarsId(36) @JvmField val dwAppealDeadline: Long? = 0L,\n    @TarsId(37) @JvmField val dwGroupFlag: Long? = 0L,\n    @TarsId(38) @JvmField val vecGroupRemark: ByteArray? = null,\n) : JceStruct\n\n@Serializable\ninternal class StGroupRankInfo(\n    @TarsId(0) @JvmField val dwGroupCode: Long = 0L,\n    @TarsId(1) @JvmField val groupRankSysFlag: Byte? = 0,\n    @TarsId(2) @JvmField val groupRankUserFlag: Byte? = 0,\n    @TarsId(3) @JvmField val vecRankMap: List<StLevelRankPair>? = null,\n    @TarsId(4) @JvmField val dwGroupRankSeq: Long? = 0L,\n    @TarsId(5) @JvmField val ownerName: String? = \"\",\n    @TarsId(6) @JvmField val adminName: String? = \"\",\n    @TarsId(7) @JvmField val dwOfficeMode: Long? = 0L,\n    @TarsId(8) @JvmField val groupRankUserFlagNew: Byte? = 0,\n    @TarsId(9) @JvmField val vecRankMapNew: List<StLevelRankPair>? = null,\n) : JceStruct\n\n@Serializable\ninternal class StFavoriteGroup(\n    @TarsId(0) @JvmField val dwGroupCode: Long,\n    @TarsId(1) @JvmField val dwTimestamp: Long? = null,\n    @TarsId(2) @JvmField val dwSnsFlag: Long? = 1L,\n    @TarsId(3) @JvmField val dwOpenTimestamp: Long? = null,\n) : JceStruct\n\n@Serializable\ninternal class StLevelRankPair(\n    @TarsId(0) @JvmField val dwLevel: Long? = null,\n    @TarsId(1) @JvmField val rank: String? = \"\",\n) : JceStruct\n\n@Serializable\ninternal class GetTroopMemberListReq(\n    @TarsId(0) @JvmField val uin: Long,\n    @TarsId(1) @JvmField val groupCode: Long,\n    @TarsId(2) @JvmField val nextUin: Long,\n    @TarsId(3) @JvmField val groupUin: Long,\n    @TarsId(4) @JvmField val version: Long? = null,\n    @TarsId(5) @JvmField val reqType: Long? = null,\n    @TarsId(6) @JvmField val getListAppointTime: Long? = null,\n    @TarsId(7) @JvmField val richCardNameVer: Byte? = null,\n) : JceStruct\n\n\n@Serializable\ninternal class GetTroopMemberListResp(\n    @TarsId(0) @JvmField val uin: Long,\n    @TarsId(1) @JvmField val groupCode: Long,\n    @TarsId(2) @JvmField val groupUin: Long,\n    @TarsId(3) @JvmField val vecTroopMember: List<StTroopMemberInfo>,\n    @TarsId(4) @JvmField val nextUin: Long,\n    @TarsId(5) @JvmField val result: Int,\n    @TarsId(6) @JvmField val errorCode: Short? = null,\n    @TarsId(7) @JvmField val officeMode: Long? = null,\n    @TarsId(8) @JvmField val nextGetTime: Long? = null,\n) : JceStruct\n\n@Serializable\ninternal class StTroopMemberInfo(\n    @TarsId(0) @JvmField val memberUin: Long,\n    @TarsId(1) @JvmField val faceId: Short,\n    @TarsId(2) @JvmField val age: Byte,\n    @TarsId(3) @JvmField val gender: Byte,\n    @TarsId(4) @JvmField val nick: String = \"\",\n    @TarsId(5) @JvmField val status: Byte = 20,\n    @TarsId(6) @JvmField val sShowName: String? = null,\n    @TarsId(8) @JvmField val sName: String? = null,\n    @TarsId(9) @JvmField val cGender: Byte? = null,\n    @TarsId(10) @JvmField val sPhone: String? = \"\",\n    @TarsId(11) @JvmField val sEmail: String? = \"\",\n    @TarsId(12) @JvmField val sMemo: String? = \"\",\n    @TarsId(13) @JvmField val autoRemark: String? = \"\",\n    @TarsId(14) @JvmField val dwMemberLevel: Long? = null,\n    @TarsId(15) @JvmField val dwJoinTime: Long? = null,\n    @TarsId(16) @JvmField val dwLastSpeakTime: Long? = null,\n    @TarsId(17) @JvmField val dwCreditLevel: Long? = null,\n    @TarsId(18) @JvmField val dwFlag: Long? = null,\n    @TarsId(19) @JvmField val dwFlagExt: Long? = null,\n    @TarsId(20) @JvmField val dwPoint: Long? = null,\n    @TarsId(21) @JvmField val concerned: Byte? = null,\n    @TarsId(22) @JvmField val shielded: Byte? = null,\n    @TarsId(23) @JvmField val sSpecialTitle: String? = \"\",\n    @TarsId(24) @JvmField val dwSpecialTitleExpireTime: Long? = null,\n    @TarsId(25) @JvmField val job: String? = \"\",\n    @TarsId(26) @JvmField val apolloFlag: Byte? = null,\n    @TarsId(27) @JvmField val dwApolloTimestamp: Long? = null,\n    @TarsId(28) @JvmField val dwGlobalGroupLevel: Long? = null,\n    @TarsId(29) @JvmField val dwTitleId: Long? = null,\n    @TarsId(30) @JvmField val dwShutupTimestap: Long? = null,\n    @TarsId(31) @JvmField val dwGlobalGroupPoint: Long? = null,\n    @TarsId(32) @JvmField val qzusrinfo: QzoneUserInfo? = null,\n    @TarsId(33) @JvmField val richCardNameVer: Byte? = null,\n    @TarsId(34) @JvmField val dwVipType: Long? = null,\n    @TarsId(35) @JvmField val dwVipLevel: Long? = null,\n    @TarsId(36) @JvmField val dwBigClubLevel: Long? = null,\n    @TarsId(37) @JvmField val dwBigClubFlag: Long? = null,\n    @TarsId(38) @JvmField val dwNameplate: Long? = null,\n    @TarsId(39) @JvmField val vecGroupHonor: ByteArray? = null,\n    @TarsId(40) @JvmField val vecName: ByteArray? = null,\n    @TarsId(41) @JvmField val richFlag: Byte? = 0,\n) : JceStruct\n\n@Serializable\ninternal class QzoneUserInfo(\n    @TarsId(0) @JvmField val eStarState: Int? = null,\n    @TarsId(1) @JvmField val extendInfo: Map<String, String>? = null,\n) : JceStruct"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/Cmd0x346.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n@file:Suppress(\"unused\", \"SpellCheckingInspection\")\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class Cmd0x346 : ProtoBuf {\n    @Serializable\n    internal class AddrList(\n        @JvmField @ProtoNumber(2) val strIp: List<String> = emptyList(),\n        @JvmField @ProtoNumber(3) val strDomain: String = \"\",\n        @JvmField @ProtoNumber(4) val port: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyCleanTrafficReq : ProtoBuf\n\n    @Serializable\n    internal class ApplyCleanTrafficRsp(\n        @JvmField @ProtoNumber(10) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(20) val retMsg: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyCopyFromReq(\n        @JvmField @ProtoNumber(10) val srcUin: Long = 0L,\n        @JvmField @ProtoNumber(20) val srcGroup: Long = 0L,\n        @JvmField @ProtoNumber(30) val srcSvcid: Int = 0,\n        @JvmField @ProtoNumber(40) val srcParentfolder: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(50) val srcUuid: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(60) val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(70) val dstUin: Long = 0L,\n        @JvmField @ProtoNumber(80) val fileSize: Long = 0L,\n        @JvmField @ProtoNumber(90) val fileName: String = \"\",\n        @JvmField @ProtoNumber(100) val dangerLevel: Int = 0,\n        @JvmField @ProtoNumber(110) val totalSpace: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyCopyFromRsp(\n        @JvmField @ProtoNumber(10) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(20) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(30) val uuid: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(40) val totalSpace: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyCopyToReq(\n        @JvmField @ProtoNumber(10) val dstId: Long = 0L,\n        @JvmField @ProtoNumber(20) val dstUin: Long = 0L,\n        @JvmField @ProtoNumber(30) val dstSvcid: Int = 0,\n        @JvmField @ProtoNumber(40) val srcUin: Long = 0L,\n        @JvmField @ProtoNumber(50) val fileSize: Long = 0L,\n        @JvmField @ProtoNumber(60) val fileName: String = \"\",\n        @JvmField @ProtoNumber(70) val localFilepath: String = \"\",\n        @JvmField @ProtoNumber(80) val uuid: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyCopyToRsp(\n        @JvmField @ProtoNumber(10) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(20) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(30) val fileKey: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyDownloadAbsReq(\n        @JvmField @ProtoNumber(10) val uin: Long = 0L,\n        @JvmField @ProtoNumber(20) val uuid: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyDownloadAbsRsp(\n        @JvmField @ProtoNumber(10) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(20) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(30) val msgDownloadInfo: Cmd0x346.DownloadInfo? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyDownloadReq(\n        @JvmField @ProtoNumber(10) val uin: Long = 0L,\n        @JvmField @ProtoNumber(20) val uuid: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(30) val ownerType: Int = 0,\n        @JvmField @ProtoNumber(500) val extUintype: Int = 0,\n        @JvmField @ProtoNumber(501) val needHttpsUrl: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyDownloadRsp(\n        @JvmField @ProtoNumber(10) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(20) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(30) val msgDownloadInfo: Cmd0x346.DownloadInfo? = null,\n        @JvmField @ProtoNumber(40) val msgFileInfo: Cmd0x346.FileInfo? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyForwardFileReq(\n        @JvmField @ProtoNumber(10) val senderUin: Long = 0L,\n        @JvmField @ProtoNumber(20) val recverUin: Long = 0L,\n        @JvmField @ProtoNumber(30) val uuid: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(40) val dangerLevel: Int = 0,\n        @JvmField @ProtoNumber(50) val totalSpace: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyForwardFileRsp(\n        @JvmField @ProtoNumber(10) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(20) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(30) val totalSpace: Long = 0L,\n        @JvmField @ProtoNumber(40) val usedSpace: Long = 0L,\n        @JvmField @ProtoNumber(50) val uuid: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyGetTrafficReq : ProtoBuf\n\n    @Serializable\n    internal class ApplyGetTrafficRsp(\n        @JvmField @ProtoNumber(10) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(20) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(30) val useFileSize: Long = 0L,\n        @JvmField @ProtoNumber(40) val useFileNum: Int = 0,\n        @JvmField @ProtoNumber(50) val allFileSize: Long = 0L,\n        @JvmField @ProtoNumber(60) val allFileNum: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyListDownloadReq(\n        @JvmField @ProtoNumber(10) val uin: Long = 0L,\n        @JvmField @ProtoNumber(20) val beginIndex: Int = 0,\n        @JvmField @ProtoNumber(30) val reqCount: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyListDownloadRsp(\n        @JvmField @ProtoNumber(10) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(20) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(30) val totalCount: Int = 0,\n        @JvmField @ProtoNumber(40) val beginIndex: Int = 0,\n        @JvmField @ProtoNumber(50) val rspCount: Int = 0,\n        @JvmField @ProtoNumber(60) val isEnd: Int = 0,\n        @JvmField @ProtoNumber(70) val msgFileList: List<Cmd0x346.FileInfo> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyUploadHitReq(\n        @JvmField @ProtoNumber(10) val senderUin: Long = 0L,\n        @JvmField @ProtoNumber(20) val recverUin: Long = 0L,\n        @JvmField @ProtoNumber(30) val fileSize: Long = 0L,\n        @JvmField @ProtoNumber(40) val fileName: String = \"\",\n        @JvmField @ProtoNumber(50) val _10mMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(60) val localFilepath: String = \"\",\n        @JvmField @ProtoNumber(70) val dangerLevel: Int = 0,\n        @JvmField @ProtoNumber(80) val totalSpace: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyUploadHitReqV2(\n        @JvmField @ProtoNumber(10) val senderUin: Long = 0L,\n        @JvmField @ProtoNumber(20) val recverUin: Long = 0L,\n        @JvmField @ProtoNumber(30) val fileSize: Long = 0L,\n        @JvmField @ProtoNumber(40) val fileName: String = \"\",\n        @JvmField @ProtoNumber(50) val _10mMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(60) val _3sha: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(70) val sha: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(80) val localFilepath: String = \"\",\n        @JvmField @ProtoNumber(90) val dangerLevel: Int = 0,\n        @JvmField @ProtoNumber(100) val totalSpace: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyUploadHitReqV3(\n        @JvmField @ProtoNumber(10) val senderUin: Long = 0L,\n        @JvmField @ProtoNumber(20) val recverUin: Long = 0L,\n        @JvmField @ProtoNumber(30) val fileSize: Long = 0L,\n        @JvmField @ProtoNumber(40) val fileName: String = \"\",\n        @JvmField @ProtoNumber(50) val _10mMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(60) val sha: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(70) val localFilepath: String = \"\",\n        @JvmField @ProtoNumber(80) val dangerLevel: Int = 0,\n        @JvmField @ProtoNumber(90) val totalSpace: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyUploadHitRsp(\n        @JvmField @ProtoNumber(10) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(20) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(30) val uploadIp: String = \"\",\n        @JvmField @ProtoNumber(40) val uploadPort: Int = 0,\n        @JvmField @ProtoNumber(50) val uploadDomain: String = \"\",\n        @JvmField @ProtoNumber(60) val uuid: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(70) val uploadKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(80) val totalSpace: Long = 0L,\n        @JvmField @ProtoNumber(90) val usedSpace: Long = 0L,\n        @JvmField @ProtoNumber(100) val uploadDns: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyUploadHitRspV2(\n        @JvmField @ProtoNumber(10) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(20) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(30) val uploadIp: String = \"\",\n        @JvmField @ProtoNumber(40) val uploadPort: Int = 0,\n        @JvmField @ProtoNumber(50) val uploadDomain: String = \"\",\n        @JvmField @ProtoNumber(60) val uuid: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(70) val uploadKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(80) val totalSpace: Long = 0L,\n        @JvmField @ProtoNumber(90) val usedSpace: Long = 0L,\n        @JvmField @ProtoNumber(100) val uploadHttpsPort: Int = 443,\n        @JvmField @ProtoNumber(110) val uploadHttpsDomain: String = \"\",\n        @JvmField @ProtoNumber(120) val uploadDns: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyUploadHitRspV3(\n        @JvmField @ProtoNumber(10) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(20) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(30) val uploadIp: String = \"\",\n        @JvmField @ProtoNumber(40) val uploadPort: Int = 0,\n        @JvmField @ProtoNumber(50) val uploadDomain: String = \"\",\n        @JvmField @ProtoNumber(60) val uuid: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(70) val uploadKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(80) val totalSpace: Long = 0L,\n        @JvmField @ProtoNumber(90) val usedSpace: Long = 0L,\n        @JvmField @ProtoNumber(100) val uploadDns: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyUploadReq(\n        @JvmField @ProtoNumber(10) val senderUin: Long = 0L,\n        @JvmField @ProtoNumber(20) val recverUin: Long = 0L,\n        @JvmField @ProtoNumber(30) val fileType: Int = 0,\n        @JvmField @ProtoNumber(40) val fileSize: Long = 0L,\n        @JvmField @ProtoNumber(50) val fileName: ByteArray = EMPTY_BYTE_ARRAY, //String = \"\",\n        @JvmField @ProtoNumber(60) val _10mMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(70) val localFilepath: String = \"\",\n        @JvmField @ProtoNumber(80) val dangerLevel: Int = 0,\n        @JvmField @ProtoNumber(90) val totalSpace: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyUploadReqV2(\n        @JvmField @ProtoNumber(10) val senderUin: Long = 0L,\n        @JvmField @ProtoNumber(20) val recverUin: Long = 0L,\n        @JvmField @ProtoNumber(30) val fileSize: Long = 0L,\n        @JvmField @ProtoNumber(40) val fileName: String = \"\",\n        @JvmField @ProtoNumber(50) val _10mMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(60) val _3sha: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(70) val localFilepath: String = \"\",\n        @JvmField @ProtoNumber(80) val dangerLevel: Int = 0,\n        @JvmField @ProtoNumber(90) val totalSpace: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyUploadReqV3(\n        @JvmField @ProtoNumber(10) val senderUin: Long = 0L,\n        @JvmField @ProtoNumber(20) val recverUin: Long = 0L,\n        @JvmField @ProtoNumber(30) val fileSize: Long = 0L,\n        @JvmField @ProtoNumber(40) val fileName: String = \"\",\n        @JvmField @ProtoNumber(50) val _10mMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(60) val sha: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(70) val localFilepath: String = \"\",\n        @JvmField @ProtoNumber(80) val dangerLevel: Int = 0,\n        @JvmField @ProtoNumber(90) val totalSpace: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyUploadRsp(\n        @JvmField @ProtoNumber(10) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(20) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(30) val totalSpace: Long = 0L,\n        @JvmField @ProtoNumber(40) val usedSpace: Long = 0L,\n        @JvmField @ProtoNumber(50) val uploadedSize: Long = 0L,\n        @JvmField @ProtoNumber(60) val uploadIp: String = \"\",\n        @JvmField @ProtoNumber(70) val uploadDomain: String = \"\",\n        @JvmField @ProtoNumber(80) val uploadPort: Int = 0,\n        @JvmField @ProtoNumber(90) val uuid: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(100) val uploadKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(110) val boolFileExist: Boolean = false,\n        @JvmField @ProtoNumber(120) val packSize: Int = 0,\n        @JvmField @ProtoNumber(130) val strUploadipList: List<String> = emptyList(),\n        @JvmField @ProtoNumber(140) val uploadDns: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyUploadRspV2(\n        @JvmField @ProtoNumber(10) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(20) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(30) val totalSpace: Long = 0L,\n        @JvmField @ProtoNumber(40) val usedSpace: Long = 0L,\n        @JvmField @ProtoNumber(50) val uploadedSize: Long = 0L,\n        @JvmField @ProtoNumber(60) val uploadIp: String = \"\",\n        @JvmField @ProtoNumber(70) val uploadDomain: String = \"\",\n        @JvmField @ProtoNumber(80) val uploadPort: Int = 0,\n        @JvmField @ProtoNumber(90) val uuid: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(100) val uploadKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(110) val boolFileExist: Boolean = false,\n        @JvmField @ProtoNumber(120) val packSize: Int = 0,\n        @JvmField @ProtoNumber(130) val strUploadipList: List<String> = emptyList(),\n        @JvmField @ProtoNumber(140) val httpsvrApiVer: Int = 0,\n        @JvmField @ProtoNumber(141) val sha: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(142) val uploadHttpsPort: Int = 443,\n        @JvmField @ProtoNumber(143) val uploadHttpsDomain: String = \"\",\n        @JvmField @ProtoNumber(150) val uploadDns: String = \"\",\n        @JvmField @ProtoNumber(160) val uploadLanip: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApplyUploadRspV3(\n        @JvmField @ProtoNumber(10) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(20) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(30) val totalSpace: Long = 0L,\n        @JvmField @ProtoNumber(40) val usedSpace: Long = 0L,\n        @JvmField @ProtoNumber(50) val uploadedSize: Long = 0L,\n        @JvmField @ProtoNumber(60) val uploadIp: String = \"\",\n        @JvmField @ProtoNumber(70) val uploadDomain: String = \"\",\n        @JvmField @ProtoNumber(80) val uploadPort: Int = 0,\n        @JvmField @ProtoNumber(90) val uuid: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(100) val uploadKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(110) val boolFileExist: Boolean = false,\n        @JvmField @ProtoNumber(120) val packSize: Int = 0,\n        @JvmField @ProtoNumber(130) val strUploadipList: List<String> = emptyList(),\n        @JvmField @ProtoNumber(140) val uploadHttpsPort: Int = 443,\n        @JvmField @ProtoNumber(150) val uploadHttpsDomain: String = \"\",\n        @JvmField @ProtoNumber(160) val uploadDns: String = \"\",\n        @JvmField @ProtoNumber(170) val uploadLanip: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DeleteFileReq(\n        @JvmField @ProtoNumber(10) val uin: Long = 0L,\n        @JvmField @ProtoNumber(20) val peerUin: Long = 0L,\n        @JvmField @ProtoNumber(30) val deleteType: Int = 0,\n        @JvmField @ProtoNumber(40) val uuid: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DeleteFileRsp(\n        @JvmField @ProtoNumber(10) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(20) val retMsg: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DelMessageReq(\n        @JvmField @ProtoNumber(1) val uinSender: Long = 0L,\n        @JvmField @ProtoNumber(2) val uinReceiver: Long = 0L,\n        @JvmField @ProtoNumber(10) val msgTime: Int = 0,\n        @JvmField @ProtoNumber(20) val msgRandom: Int = 0,\n        @JvmField @ProtoNumber(30) val msgSeqNo: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DownloadInfo(\n        @JvmField @ProtoNumber(10) val downloadKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(20) val downloadIp: String = \"\",\n        @JvmField @ProtoNumber(30) val downloadDomain: String = \"\",\n        @JvmField @ProtoNumber(40) val port: Int = 0,\n        @JvmField @ProtoNumber(50) val downloadUrl: String = \"\",\n        @JvmField @ProtoNumber(60) val strDownloadipList: List<String> = emptyList(),\n        @JvmField @ProtoNumber(70) val cookie: String = \"\",\n        @JvmField @ProtoNumber(80) val httpsPort: Int = 443,\n        @JvmField @ProtoNumber(90) val httpsDownloadDomain: String = \"\",\n        @JvmField @ProtoNumber(110) val downloadDns: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DownloadSuccReq(\n        @JvmField @ProtoNumber(10) val uin: Long = 0L,\n        @JvmField @ProtoNumber(20) val uuid: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DownloadSuccRsp(\n        @JvmField @ProtoNumber(10) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(20) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(30) val int32DownStat: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ExtensionReq(\n        @JvmField @ProtoNumber(1) val id: Long = 0L,\n        @JvmField @ProtoNumber(2) val type: Long = 0L,\n        @JvmField @ProtoNumber(3) val dstPhonenum: String = \"\",\n        @JvmField @ProtoNumber(4) val int32PhoneConvertType: Int = 0,\n        @JvmField @ProtoNumber(20) val sig: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(100) val routeId: Long = 0L,\n        @JvmField @ProtoNumber(90100) val msgDelMessageReq: Cmd0x346.DelMessageReq? = null,\n        @JvmField @ProtoNumber(90200) val downloadUrlType: Int = 0,\n        @JvmField @ProtoNumber(90300) val pttFormat: Int = 0,\n        @JvmField @ProtoNumber(90400) val isNeedInnerIp: Int = 0,\n        @JvmField @ProtoNumber(90500) val netType: Int = 255,\n        @JvmField @ProtoNumber(90600) val voiceType: Int = 0,\n        @JvmField @ProtoNumber(90700) val fileType: Int = 0,\n        @JvmField @ProtoNumber(90800) val pttTime: Int = 0,\n        @JvmField @ProtoNumber(90900) val bdhCmdid: Int = 0,\n        @JvmField @ProtoNumber(91000) val reqTransferType: Int = 0,\n        @JvmField @ProtoNumber(91100) val isAuto: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ExtensionRsp(\n        @JvmField @ProtoNumber(1) val transferType: Int = 0,\n        @JvmField @ProtoNumber(2) val channelType: Int = 0,\n        @JvmField @ProtoNumber(3) val allowRetry: Int = 0,\n        @JvmField @ProtoNumber(4) val serverAddrIpv6List: Cmd0x346.AddrList? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FileInfo(\n        @JvmField @ProtoNumber(1) val uin: Long = 0L,\n        @JvmField @ProtoNumber(2) val dangerEvel: Int = 0,\n        @JvmField @ProtoNumber(3) val fileSize: Long = 0L,\n        @JvmField @ProtoNumber(4) val lifeTime: Int = 0,\n        @JvmField @ProtoNumber(5) val uploadTime: Int = 0,\n        @JvmField @ProtoNumber(6) val uuid: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(7) val fileName: String = \"\",\n        @JvmField @ProtoNumber(90) val absFileType: Int = 0,\n        @JvmField @ProtoNumber(100) val _10mMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(101) val sha: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(110) val clientType: Int = 0,\n        @JvmField @ProtoNumber(120) val ownerUin: Long = 0L,\n        @JvmField @ProtoNumber(121) val peerUin: Long = 0L,\n        @JvmField @ProtoNumber(130) val expireTime: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FileQueryReq(\n        @JvmField @ProtoNumber(10) val uin: Long = 0L,\n        @JvmField @ProtoNumber(20) val uuid: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FileQueryRsp(\n        @JvmField @ProtoNumber(10) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(20) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(30) val msgFileInfo: Cmd0x346.FileInfo? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RecallFileReq(\n        @JvmField @ProtoNumber(1) val uin: Long = 0L,\n        @JvmField @ProtoNumber(2) val uuid: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RecallFileRsp(\n        @JvmField @ProtoNumber(1) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(2) val retMsg: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RecvListQueryReq(\n        @JvmField @ProtoNumber(1) val uin: Long = 0L,\n        @JvmField @ProtoNumber(2) val beginIndex: Int = 0,\n        @JvmField @ProtoNumber(3) val reqCount: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RecvListQueryRsp(\n        @JvmField @ProtoNumber(1) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(2) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val fileTotCount: Int = 0,\n        @JvmField @ProtoNumber(4) val beginIndex: Int = 0,\n        @JvmField @ProtoNumber(5) val rspFileCount: Int = 0,\n        @JvmField @ProtoNumber(6) val isEnd: Int = 0,\n        @JvmField @ProtoNumber(7) val msgFileList: List<Cmd0x346.FileInfo> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RenewFileReq(\n        @JvmField @ProtoNumber(1) val uin: Long = 0L,\n        @JvmField @ProtoNumber(2) val uuid: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(3) val addTtl: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RenewFileRsp(\n        @JvmField @ProtoNumber(1) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(2) val retMsg: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @JvmField @ProtoNumber(1) val cmd: Int = 0,\n        @JvmField @ProtoNumber(2) val seq: Int = 0,\n        @JvmField @ProtoNumber(3) val msgRecvListQueryReq: Cmd0x346.RecvListQueryReq? = null,\n        @JvmField @ProtoNumber(4) val msgSendListQueryReq: Cmd0x346.SendListQueryReq? = null,\n        @JvmField @ProtoNumber(5) val msgRenewFileReq: Cmd0x346.RenewFileReq? = null,\n        @JvmField @ProtoNumber(6) val msgRecallFileReq: Cmd0x346.RecallFileReq? = null,\n        @JvmField @ProtoNumber(7) val msgApplyUploadReq: Cmd0x346.ApplyUploadReq? = null,\n        @JvmField @ProtoNumber(8) val msgApplyUploadHitReq: Cmd0x346.ApplyUploadHitReq? = null,\n        @JvmField @ProtoNumber(9) val msgApplyForwardFileReq: Cmd0x346.ApplyForwardFileReq? = null,\n        @JvmField @ProtoNumber(10) val msgUploadSuccReq: Cmd0x346.UploadSuccReq? = null,\n        @JvmField @ProtoNumber(11) val msgDeleteFileReq: Cmd0x346.DeleteFileReq? = null,\n        @JvmField @ProtoNumber(12) val msgDownloadSuccReq: Cmd0x346.DownloadSuccReq? = null,\n        @JvmField @ProtoNumber(13) val msgApplyDownloadAbsReq: Cmd0x346.ApplyDownloadAbsReq? = null,\n        @JvmField @ProtoNumber(14) val msgApplyDownloadReq: Cmd0x346.ApplyDownloadReq? = null,\n        @JvmField @ProtoNumber(15) val msgApplyListDownloadReq: Cmd0x346.ApplyListDownloadReq? = null,\n        @JvmField @ProtoNumber(16) val msgFileQueryReq: Cmd0x346.FileQueryReq? = null,\n        @JvmField @ProtoNumber(17) val msgApplyCopyFromReq: Cmd0x346.ApplyCopyFromReq? = null,\n        @JvmField @ProtoNumber(18) val msgApplyUploadReqV2: Cmd0x346.ApplyUploadReqV2? = null,\n        @JvmField @ProtoNumber(19) val msgApplyUploadReqV3: Cmd0x346.ApplyUploadReqV3? = null,\n        @JvmField @ProtoNumber(20) val msgApplyUploadHitReqV2: Cmd0x346.ApplyUploadHitReqV2? = null,\n        @JvmField @ProtoNumber(21) val msgApplyUploadHitReqV3: Cmd0x346.ApplyUploadHitReqV3? = null,\n        @JvmField @ProtoNumber(101) val businessId: Int = 0,\n        @JvmField @ProtoNumber(102) val clientType: Int = 0,\n        @JvmField @ProtoNumber(90000) val msgApplyCopyToReq: Cmd0x346.ApplyCopyToReq? = null,\n        @JvmField @ProtoNumber(90001) val msgApplyCleanTrafficReq: Cmd0x346.ApplyCleanTrafficReq? = null,\n        @JvmField @ProtoNumber(90002) val msgApplyGetTrafficReq: Cmd0x346.ApplyGetTrafficReq? = null,\n        @JvmField @ProtoNumber(99999) val msgExtensionReq: Cmd0x346.ExtensionReq? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @JvmField @ProtoNumber(1) val cmd: Int = 0,\n        @JvmField @ProtoNumber(2) val seq: Int = 0,\n        @JvmField @ProtoNumber(3) val msgRecvListQueryRsp: Cmd0x346.RecvListQueryRsp? = null,\n        @JvmField @ProtoNumber(4) val msgSendListQueryRsp: Cmd0x346.SendListQueryRsp? = null,\n        @JvmField @ProtoNumber(5) val msgRenewFileRsp: Cmd0x346.RenewFileRsp? = null,\n        @JvmField @ProtoNumber(6) val msgRecallFileRsp: Cmd0x346.RecallFileRsp? = null,\n        @JvmField @ProtoNumber(7) val msgApplyUploadRsp: Cmd0x346.ApplyUploadRsp? = null,\n        @JvmField @ProtoNumber(8) val msgApplyUploadHitRsp: Cmd0x346.ApplyUploadHitRsp? = null,\n        @JvmField @ProtoNumber(9) val msgApplyForwardFileRsp: Cmd0x346.ApplyForwardFileRsp? = null,\n        @JvmField @ProtoNumber(10) val msgUploadSuccRsp: Cmd0x346.UploadSuccRsp? = null,\n        @JvmField @ProtoNumber(11) val msgDeleteFileRsp: Cmd0x346.DeleteFileRsp? = null,\n        @JvmField @ProtoNumber(12) val msgDownloadSuccRsp: Cmd0x346.DownloadSuccRsp? = null,\n        @JvmField @ProtoNumber(13) val msgApplyDownloadAbsRsp: Cmd0x346.ApplyDownloadAbsRsp? = null,\n        @JvmField @ProtoNumber(14) val msgApplyDownloadRsp: Cmd0x346.ApplyDownloadRsp? = null,\n        @JvmField @ProtoNumber(15) val msgApplyListDownloadRsp: Cmd0x346.ApplyListDownloadRsp? = null,\n        @JvmField @ProtoNumber(16) val msgFileQueryRsp: Cmd0x346.FileQueryRsp? = null,\n        @JvmField @ProtoNumber(17) val msgApplyCopyFromRsp: Cmd0x346.ApplyCopyFromRsp? = null,\n        @JvmField @ProtoNumber(18) val msgApplyUploadRspV2: Cmd0x346.ApplyUploadRspV2? = null,\n        @JvmField @ProtoNumber(19) val msgApplyUploadRspV3: Cmd0x346.ApplyUploadRspV3? = null,\n        @JvmField @ProtoNumber(20) val msgApplyUploadHitRspV2: Cmd0x346.ApplyUploadHitRspV2? = null,\n        @JvmField @ProtoNumber(21) val msgApplyUploadHitRspV3: Cmd0x346.ApplyUploadHitRspV3? = null,\n        @JvmField @ProtoNumber(90000) val msgApplyCopyToRsp: Cmd0x346.ApplyCopyToRsp? = null,\n        @JvmField @ProtoNumber(90001) val msgApplyCleanTrafficRsp: Cmd0x346.ApplyCleanTrafficRsp? = null,\n        @JvmField @ProtoNumber(90002) val msgApplyGetTrafficRsp: Cmd0x346.ApplyGetTrafficRsp? = null,\n        @JvmField @ProtoNumber(99999) val msgExtensionRsp: Cmd0x346.ExtensionRsp? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SendListQueryReq(\n        @JvmField @ProtoNumber(1) val uin: Long = 0L,\n        @JvmField @ProtoNumber(2) val beginIndex: Int = 0,\n        @JvmField @ProtoNumber(3) val reqCount: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SendListQueryRsp(\n        @JvmField @ProtoNumber(1) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(2) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val fileTotCount: Int = 0,\n        @JvmField @ProtoNumber(4) val beginIndex: Int = 0,\n        @JvmField @ProtoNumber(5) val rspFileCount: Int = 0,\n        @JvmField @ProtoNumber(6) val isEnd: Int = 0,\n        @JvmField @ProtoNumber(7) val totLimit: Long = 0L,\n        @JvmField @ProtoNumber(8) val usedLimit: Long = 0L,\n        @JvmField @ProtoNumber(9) val msgFileList: List<Cmd0x346.FileInfo> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class UploadSuccReq(\n        @JvmField @ProtoNumber(10) val senderUin: Long = 0L,\n        @JvmField @ProtoNumber(20) val recverUin: Long = 0L,\n        @JvmField @ProtoNumber(30) val uuid: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class UploadSuccRsp(\n        @JvmField @ProtoNumber(10) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(20) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(30) val msgFileInfo: Cmd0x346.FileInfo? = null,\n    ) : ProtoBuf\n}\n        "
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/Cmd0x352.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class Cmd0x352 : ProtoBuf {\n    @Serializable\n    internal class DelImgReq(\n        @ProtoNumber(1) @JvmField val srcUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val dstUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val reqTerm: Int = 0,\n        @ProtoNumber(4) @JvmField val reqPlatformType: Int = 0,\n        @ProtoNumber(5) @JvmField val buType: Int = 0,\n        @ProtoNumber(6) @JvmField val buildVer: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val fileResid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val picWidth: Int = 0,\n        @ProtoNumber(9) @JvmField val picHeight: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DelImgRsp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val failMsg: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val fileResid: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetImgUrlReq(\n        @ProtoNumber(1) @JvmField val srcUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val dstUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val fileResid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val urlFlag: Int = 0,\n        @ProtoNumber(6) @JvmField val urlType: Int = 0,\n        @ProtoNumber(7) @JvmField val reqTerm: Int = 0,\n        @ProtoNumber(8) @JvmField val reqPlatformType: Int = 0,\n        @ProtoNumber(9) @JvmField val srcFileType: Int = 0,\n        @ProtoNumber(10) @JvmField val innerIp: Int = 0,\n        @ProtoNumber(11) @JvmField val boolAddressBook: Boolean = false,\n        @ProtoNumber(12) @JvmField val buType: Int = 0,\n        @ProtoNumber(13) @JvmField val buildVer: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(14) @JvmField val picUpTimestamp: Int = 0,\n        @ProtoNumber(15) @JvmField val reqTransferType: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetImgUrlRsp(\n        @ProtoNumber(1) @JvmField val fileResid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val clientIp: Int = 0,\n        @ProtoNumber(3) @JvmField val result: Int = 0,\n        @ProtoNumber(4) @JvmField val failMsg: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val bytesThumbDownUrl: List<ByteArray> = emptyList(),\n        @ProtoNumber(6) @JvmField val bytesOriginalDownUrl: List<ByteArray> = emptyList(),\n        @ProtoNumber(7) @JvmField val msgImgInfo: ImgInfo? = null,\n        @ProtoNumber(8) @JvmField val uint32DownIp: List<Int> = emptyList(),\n        @ProtoNumber(9) @JvmField val uint32DownPort: List<Int> = emptyList(),\n        @ProtoNumber(10) @JvmField val thumbDownPara: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(11) @JvmField val originalDownPara: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(12) @JvmField val downDomain: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(13) @JvmField val bytesBigDownUrl: List<ByteArray> = emptyList(),\n        @ProtoNumber(14) @JvmField val bigDownPara: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(15) @JvmField val bigThumbDownPara: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(16) @JvmField val httpsUrlFlag: Int = 0,\n        @ProtoNumber(26) @JvmField val msgDownIp6: List<IPv6Info> = emptyList(),\n        @ProtoNumber(27) @JvmField val clientIp6: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Suppress(\"ArrayInDataClass\")\n    @Serializable\n    internal class ImgInfo(\n        @ProtoNumber(1) @JvmField val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val fileType: Int = 0,\n        @ProtoNumber(3) @JvmField val fileSize: Long = 0L,\n        @ProtoNumber(4) @JvmField val fileWidth: Int = 0,\n        @ProtoNumber(5) @JvmField val fileHeight: Int = 0,\n        @ProtoNumber(6) @JvmField val fileFlag: Long = 0L,\n        @ProtoNumber(7) @JvmField val fileCutPos: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class IPv6Info(\n        @ProtoNumber(1) @JvmField val ip6: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val port: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val subcmd: Int = 0, //2是GetImgUrlReq 1是UploadImgReq\n        @ProtoNumber(2) @JvmField val msgTryupImgReq: List<TryUpImgReq> = emptyList(), // optional\n        @ProtoNumber(3) @JvmField val msgGetimgUrlReq: List<GetImgUrlReq> = emptyList(), // optional\n        @ProtoNumber(4) @JvmField val msgDelImgReq: List<DelImgReq> = emptyList(),\n        @ProtoNumber(10) @JvmField val netType: Int = 0, // 数据网络=5, wifi=3\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val subcmd: Int = 0,\n        @ProtoNumber(2) @JvmField val msgTryupImgRsp: List<TryUpImgRsp> = emptyList(),\n        @ProtoNumber(3) @JvmField val msgGetimgUrlRsp: List<GetImgUrlRsp> = emptyList(),\n        @ProtoNumber(4) @JvmField val boolNewBigchan: Boolean = false,\n        @ProtoNumber(5) @JvmField val msgDelImgRsp: List<DelImgRsp> = emptyList(),\n        @ProtoNumber(10) @JvmField val failMsg: String? = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TryUpImgReq(\n        @ProtoNumber(1) @JvmField val srcUin: Long,\n        @ProtoNumber(2) @JvmField val dstUin: Long,\n        @ProtoNumber(3) @JvmField val fileId: Long = 0L, //从0开始的自增数？貌似有一个连接就要自增1, 但是又会重置回0\n        @ProtoNumber(4) @JvmField val fileMd5: ByteArray,\n        @ProtoNumber(5) @JvmField val fileSize: Long, //默认为md5+\".jpg\"\n        @ProtoNumber(6) @JvmField val fileName: String,\n        @ProtoNumber(7) @JvmField val srcTerm: Int = 5,\n        @ProtoNumber(8) @JvmField val platformType: Int = 9,\n        @ProtoNumber(9) @JvmField val innerIP: Int = 0,\n        @ProtoNumber(10) @JvmField val addressBook: Boolean = false, //chatType == 1006为true 我觉得发false没问题\n        @ProtoNumber(11) @JvmField val retry: Int = 0, //default\n        @ProtoNumber(12) @JvmField val buType: Int = 1, //1或96 不确定\n        @ProtoNumber(13) @JvmField val imgOriginal: Boolean = false, //是否为原图\n        @ProtoNumber(14) @JvmField val imgWidth: Int = 0,\n        @ProtoNumber(15) @JvmField val imgHeight: Int = 0,\n        /**\n         * ImgType:\n         *  JPG:    1000\n         *  PNG:    1001\n         *  WEBP:   1002\n         *  BMP:    1005\n         *  GIG:    2000\n         *  APNG:   2001\n         *  SHARPP: 1004\n         */\n        @ProtoNumber(16) @JvmField val imgType: Int = 1000,\n        @ProtoNumber(17) @JvmField val buildVer: String = \"8.2.7.4410\", //版本号\n        @ProtoNumber(18) @JvmField val fileIndex: ByteArray = EMPTY_BYTE_ARRAY, //default\n        @ProtoNumber(19) @JvmField val fileStoreDays: Int = 0, //default\n        @ProtoNumber(20) @JvmField val stepFlag: Int = 0, //default\n        @ProtoNumber(21) @JvmField val rejectTryFast: Boolean = false, //bool\n        @ProtoNumber(22) @JvmField val srvUpload: Int = 1, //typeHotPic[1/2/3]\n        @ProtoNumber(23) @JvmField val transferUrl: ByteArray = EMPTY_BYTE_ARRAY, //rawDownloadUrl, 如果没有就是EMPTY_BYTE_ARRAY\n    ) : ImgReq\n\n    @Serializable\n    internal class TryUpImgRsp(\n        @ProtoNumber(1) @JvmField val fileId: Long = 0L,\n        @ProtoNumber(2) @JvmField val clientIp: Int = 0,\n        @ProtoNumber(3) @JvmField val result: Int = 0,\n        @ProtoNumber(4) @JvmField val failMsg: String = \"\",\n        @ProtoNumber(5) @JvmField val boolFileExit: Boolean = false,\n        @ProtoNumber(6) @JvmField val msgImgInfo: ImgInfo? = null,\n        @ProtoNumber(7) @JvmField val uint32UpIp: List<Int> = emptyList(),\n        @ProtoNumber(8) @JvmField val uint32UpPort: List<Int> = emptyList(),\n        @ProtoNumber(9) @JvmField val upUkey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(10) @JvmField val upResid: String = \"\",\n        @ProtoNumber(11) @JvmField val upUuid: String = \"\",\n        @ProtoNumber(12) @JvmField val upOffset: Long = 0L,\n        @ProtoNumber(13) @JvmField val blockSize: Long = 0L,\n        @ProtoNumber(14) @JvmField val encryptDstip: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(15) @JvmField val roamdays: Int = 0,\n        @ProtoNumber(26) @JvmField val msgUpIp6: List<IPv6Info> = emptyList(),\n        @ProtoNumber(27) @JvmField val clientIp6: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(60) @JvmField val thumbDownPara: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(61) @JvmField val originalDownPara: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(62) @JvmField val downDomain: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(64) @JvmField val bigDownPara: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(65) @JvmField val bigThumbDownPara: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(66) @JvmField val httpsUrlFlag: Int = 0,\n        @ProtoNumber(1001) @JvmField val msgInfo4busi: TryUpInfo4Busi? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TryUpInfo4Busi(\n        @ProtoNumber(1) @JvmField val fileResid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val downDomain: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val thumbDownUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val originalDownUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val bigDownUrl: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/Cmd0x388.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class Cmd0x388 : ProtoBuf {\n    @Serializable\n    internal class DelImgReq(\n        @ProtoNumber(1) @JvmField val srcUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val dstUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val reqTerm: Int = 0,\n        @ProtoNumber(4) @JvmField val reqPlatformType: Int = 0,\n        @ProtoNumber(5) @JvmField val buType: Int = 0,\n        @ProtoNumber(6) @JvmField val buildVer: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val fileResid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val picWidth: Int = 0,\n        @ProtoNumber(9) @JvmField val picHeight: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DelImgRsp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val failMsg: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val fileResid: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ExpRoamExtendInfo(\n        @ProtoNumber(1) @JvmField val resid: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ExpRoamPicInfo(\n        @ProtoNumber(1) @JvmField val shopFlag: Int = 0,\n        @ProtoNumber(2) @JvmField val pkgId: Int = 0,\n        @ProtoNumber(3) @JvmField val picId: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ExtensionCommPicTryUp(\n        @ProtoNumber(1) @JvmField val bytesExtinfo: List<ByteArray> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ExtensionExpRoamTryUp(\n        @ProtoNumber(1) @JvmField val msgExproamPicInfo: List<ExpRoamPicInfo> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetImgUrlReq(\n        @ProtoNumber(1) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(2) @JvmField val dstUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val fileid: Long = 0L,\n        @ProtoNumber(4) @JvmField val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val urlFlag: Int = 0,\n        @ProtoNumber(6) @JvmField val urlType: Int = 0,\n        @ProtoNumber(7) @JvmField val reqTerm: Int = 0,\n        @ProtoNumber(8) @JvmField val reqPlatformType: Int = 0,\n        @ProtoNumber(9) @JvmField val innerIp: Int = 0,\n        @ProtoNumber(10) @JvmField val buType: Int = 0,\n        @ProtoNumber(11) @JvmField val buildVer: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(12) @JvmField val fileId: Long = 0L,\n        @ProtoNumber(13) @JvmField val fileSize: Long = 0L,\n        @ProtoNumber(14) @JvmField val originalPic: Int = 0,\n        @ProtoNumber(15) @JvmField val retryReq: Int = 0,\n        @ProtoNumber(16) @JvmField val fileHeight: Int = 0,\n        @ProtoNumber(17) @JvmField val fileWidth: Int = 0,\n        @ProtoNumber(18) @JvmField val picType: Int = 0,\n        @ProtoNumber(19) @JvmField val picUpTimestamp: Int = 0,\n        @ProtoNumber(20) @JvmField val reqTransferType: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetImgUrlRsp(\n        @ProtoNumber(1) @JvmField val fileid: Long = 0L,\n        @ProtoNumber(2) @JvmField val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val result: Int = 0,\n        @ProtoNumber(4) @JvmField val failMsg: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val msgImgInfo: ImgInfo? = null,\n        @ProtoNumber(6) @JvmField val bytesThumbDownUrl: List<ByteArray> = emptyList(),\n        @ProtoNumber(7) @JvmField val bytesOriginalDownUrl: List<ByteArray> = emptyList(),\n        @ProtoNumber(8) @JvmField val bytesBigDownUrl: List<ByteArray> = emptyList(),\n        @ProtoNumber(9) @JvmField val uint32DownIp: List<Int> = emptyList(),\n        @ProtoNumber(10) @JvmField val uint32DownPort: List<Int> = emptyList(),\n        @ProtoNumber(11) @JvmField val downDomain: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(12) @JvmField val thumbDownPara: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(13) @JvmField val originalDownPara: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(14) @JvmField val bigDownPara: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(15) @JvmField val fileId: Long = 0L,\n        @ProtoNumber(16) @JvmField val autoDownType: Int = 0,\n        @ProtoNumber(17) @JvmField val uint32OrderDownType: List<Int> = emptyList(),\n        @ProtoNumber(19) @JvmField val bigThumbDownPara: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(20) @JvmField val httpsUrlFlag: Int = 0,\n        @ProtoNumber(26) @JvmField val msgDownIp6: List<IPv6Info> = emptyList(),\n        @ProtoNumber(27) @JvmField val clientIp6: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetPttUrlReq(\n        @ProtoNumber(1) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(2) @JvmField val dstUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val fileid: Long = 0L,\n        @ProtoNumber(4) @JvmField val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val reqTerm: Int = 0,\n        @ProtoNumber(6) @JvmField val reqPlatformType: Int = 0,\n        @ProtoNumber(7) @JvmField val innerIp: Int = 0,\n        @ProtoNumber(8) @JvmField val buType: Int = 0,\n        @ProtoNumber(9) @JvmField val buildVer: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(10) @JvmField val fileId: Long = 0L,\n        @ProtoNumber(11) @JvmField val fileKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(12) @JvmField val codec: Int = 0,\n        @ProtoNumber(13) @JvmField val buId: Int = 0,\n        @ProtoNumber(14) @JvmField val reqTransferType: Int = 0,\n        @ProtoNumber(15) @JvmField val isAuto: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetPttUrlRsp(\n        @ProtoNumber(1) @JvmField val fileid: Long = 0L,\n        @ProtoNumber(2) @JvmField val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val result: Int = 0,\n        @ProtoNumber(4) @JvmField val failMsg: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val bytesDownUrl: List<ByteArray> = emptyList(),\n        @ProtoNumber(6) @JvmField val uint32DownIp: List<Int> = emptyList(),\n        @ProtoNumber(7) @JvmField val uint32DownPort: List<Int> = emptyList(),\n        @ProtoNumber(8) @JvmField val downDomain: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(9) @JvmField val downPara: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(10) @JvmField val fileId: Long = 0L,\n        @ProtoNumber(11) @JvmField val transferType: Int = 0,\n        @ProtoNumber(12) @JvmField val allowRetry: Int = 0,\n        @ProtoNumber(26) @JvmField val msgDownIp6: List<IPv6Info> = emptyList(),\n        @ProtoNumber(27) @JvmField val clientIp6: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(28) @JvmField val strDomain: String = \"\",\n    ) : ProtoBuf\n\n    @Suppress(\"ArrayInDataClass\")\n    @Serializable\n    internal class ImgInfo(\n        @ProtoNumber(1) @JvmField val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val fileType: Int = 0,\n        @ProtoNumber(3) @JvmField val fileSize: Long = 0L,\n        @ProtoNumber(4) @JvmField val fileWidth: Int = 0,\n        @ProtoNumber(5) @JvmField val fileHeight: Int = 0,\n    ) : ProtoBuf {\n        override fun toString(): String {\n            return \"ImgInfo(fileMd5=${fileMd5.contentToString()}, fileType=$fileType, fileSize=$fileSize, fileWidth=$fileWidth, fileHeight=$fileHeight)\"\n        }\n    }\n\n    @Serializable\n    internal class IPv6Info(\n        @ProtoNumber(1) @JvmField val ip6: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val port: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PicSize(\n        @ProtoNumber(1) @JvmField val original: Int = 0,\n        @ProtoNumber(2) @JvmField val thumb: Int = 0,\n        @ProtoNumber(3) @JvmField val high: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val netType: Int = 0,\n        @ProtoNumber(2) @JvmField val subcmd: Int = 0,\n        @ProtoNumber(3) @JvmField val msgTryupImgReq: List<TryUpImgReq> = emptyList(),\n        @ProtoNumber(4) @JvmField val msgGetimgUrlReq: List<GetImgUrlReq> = emptyList(),\n        @ProtoNumber(5) @JvmField val msgTryupPttReq: List<TryUpPttReq> = emptyList(),\n        @ProtoNumber(6) @JvmField val msgGetpttUrlReq: List<GetPttUrlReq> = emptyList(),\n        @ProtoNumber(7) @JvmField val commandId: Int = 0,\n        @ProtoNumber(8) @JvmField val msgDelImgReq: List<DelImgReq> = emptyList(),\n        @ProtoNumber(1001) @JvmField val extension: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val clientIp: Int = 0,\n        @ProtoNumber(2) @JvmField val subcmd: Int = 0,\n        @ProtoNumber(3) @JvmField val msgTryupImgRsp: List<TryUpImgRsp> = emptyList(),\n        @ProtoNumber(4) @JvmField val msgGetimgUrlRsp: List<GetImgUrlRsp> = emptyList(),\n        @ProtoNumber(5) @JvmField val msgTryupPttRsp: List<TryUpPttRsp> = emptyList(),\n        @ProtoNumber(6) @JvmField val msgGetpttUrlRsp: List<GetPttUrlRsp> = emptyList(),\n        @ProtoNumber(7) @JvmField val msgDelImgRsp: List<DelImgRsp> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TryUpImgReq(\n        @ProtoNumber(1) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(2) @JvmField val srcUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val fileId: Long = 0L,\n        @ProtoNumber(4) @JvmField val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val fileSize: Long = 0L,\n        @ProtoNumber(6) @JvmField val fileName: String = \"\",\n        @ProtoNumber(7) @JvmField val srcTerm: Int = 0,\n        @ProtoNumber(8) @JvmField val platformType: Int = 0,\n        /**\n         * if uinType = 1 then 1 else2\n         *\n        UIN_QQ = new UINTYPE(0, 0, \"UIN_QQ\");\n        UIN_EMAIL = new UINTYPE(1, 1, \"UIN_EMAIL\");\n        UIN_MOBILE = new UINTYPE(2, 2, \"UIN_MOBILE\");\n         */\n        @ProtoNumber(9) @JvmField val buType: Int = 0,\n        @ProtoNumber(10) @JvmField val picWidth: Int = 0,\n        @ProtoNumber(11) @JvmField val picHeight: Int = 0,\n        @ProtoNumber(12) @JvmField val picType: Int = 0,\n        @ProtoNumber(13) @JvmField val buildVer: String = \"\",\n        @ProtoNumber(14) @JvmField val innerIp: Int = 0,\n        @ProtoNumber(15) @JvmField val appPicType: Int = 0,\n        @ProtoNumber(16) @JvmField val originalPic: Int = 0,\n        @ProtoNumber(17) @JvmField val fileIndex: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(18) @JvmField val dstUin: Long = 0L,\n        @ProtoNumber(19) @JvmField val srvUpload: Int = 0,\n        @ProtoNumber(20) @JvmField val transferUrl: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ImgReq\n\n    @Serializable\n    internal class TryUpImgRsp(\n        @ProtoNumber(1) @JvmField val fileId: Long = 0L,\n        @ProtoNumber(2) @JvmField val result: Int = 0,\n        @ProtoNumber(3) @JvmField val failMsg: String = \"\",\n        @ProtoNumber(4) @JvmField val boolFileExit: Boolean = false,\n        @ProtoNumber(5) @JvmField val msgImgInfo: ImgInfo? = null,\n        @ProtoNumber(6) @JvmField val uint32UpIp: List<Int> = emptyList(),\n        @ProtoNumber(7) @JvmField val uint32UpPort: List<Int> = emptyList(),\n        @ProtoNumber(8) @JvmField val upUkey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(9) @JvmField val fileid: Long = 0L,\n        @ProtoNumber(10) @JvmField val upOffset: Long = 0L,\n        @ProtoNumber(11) @JvmField val blockSize: Long = 0L,\n        @ProtoNumber(12) @JvmField val boolNewBigChan: Boolean = false,\n        @ProtoNumber(26) @JvmField val msgUpIp6: List<IPv6Info> = emptyList(),\n        @ProtoNumber(27) @JvmField val clientIp6: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(1001) @JvmField val msgInfo4busi: TryUpInfo4Busi? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TryUpInfo4Busi(\n        @ProtoNumber(1) @JvmField val downDomain: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val thumbDownUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val originalDownUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val bigDownUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val fileResid: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TryUpPttReq(\n        @ProtoNumber(1) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(2) @JvmField val srcUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val fileId: Long = 0L,\n        @ProtoNumber(4) @JvmField val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val fileSize: Long = 0L,\n        @ProtoNumber(6) @JvmField val fileName: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val srcTerm: Int = 0,\n        @ProtoNumber(8) @JvmField val platformType: Int = 0,\n        @ProtoNumber(9) @JvmField val buType: Int = 0,\n        @ProtoNumber(10) @JvmField val buildVer: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(11) @JvmField val innerIp: Int = 0,\n        @ProtoNumber(12) @JvmField val voiceLength: Int = 0,\n        @ProtoNumber(13) @JvmField val boolNewUpChan: Boolean = false,\n        @ProtoNumber(14) @JvmField val codec: Int = 0,\n        @ProtoNumber(15) @JvmField val voiceType: Int = 0,\n        @ProtoNumber(16) @JvmField val buId: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TryUpPttRsp(\n        @ProtoNumber(1) @JvmField val fileId: Long = 0L,\n        @ProtoNumber(2) @JvmField val result: Int = 0,\n        @ProtoNumber(3) @JvmField val failMsg: ByteArray? = null,\n        @ProtoNumber(4) @JvmField val boolFileExit: Boolean = false,\n        @ProtoNumber(5) @JvmField val uint32UpIp: List<Int> = emptyList(),\n        @ProtoNumber(6) @JvmField val uint32UpPort: List<Int> = emptyList(),\n        @ProtoNumber(7) @JvmField val upUkey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val fileid: Long = 0L,\n        @ProtoNumber(9) @JvmField val upOffset: Long = 0L,\n        @ProtoNumber(10) @JvmField val blockSize: Long = 0L,\n        @ProtoNumber(11) @JvmField val fileKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(12) @JvmField val channelType: Int = 0,\n        @ProtoNumber(26) @JvmField val msgUpIp6: List<IPv6Info> = emptyList(),\n        @ProtoNumber(27) @JvmField val clientIp6: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/Cmd0x857.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"SpellCheckingInspection\")\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoIntegerType\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport kotlinx.serialization.protobuf.ProtoType\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class GroupOpenSysMsg : ProtoBuf {\n    @Serializable\n    internal class LightApp(\n        @ProtoNumber(1) @JvmField val app: String = \"\",\n        @ProtoNumber(2) @JvmField val view: String = \"\",\n        @ProtoNumber(3) @JvmField val desc: String = \"\",\n        @ProtoNumber(4) @JvmField val prompt: String = \"\",\n        @ProtoNumber(5) @JvmField val ver: String = \"\",\n        @ProtoNumber(6) @JvmField val meta: String = \"\",\n        @ProtoNumber(7) @JvmField val config: String = \"\",\n        @ProtoNumber(8) @JvmField val source: Source? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RichMsg(\n        @ProtoNumber(1) @JvmField val title: String = \"\",\n        @ProtoNumber(2) @JvmField val desc: String = \"\",\n        @ProtoNumber(3) @JvmField val brief: String = \"\",\n        @ProtoNumber(4) @JvmField val cover: String = \"\",\n        @ProtoNumber(5) @JvmField val url: String = \"\",\n        @ProtoNumber(6) @JvmField val source: Source? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Sender(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val nick: String = \"\",\n        @ProtoNumber(3) @JvmField val avatar: String = \"\",\n        @ProtoNumber(4) @JvmField val url: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Source(\n        @ProtoNumber(1) @JvmField val name: String = \"\",\n        @ProtoNumber(2) @JvmField val icon: String = \"\",\n        @ProtoNumber(3) @JvmField val url: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SysMsgBody(\n        @ProtoNumber(1) @JvmField val groupId: Long = 0L,\n        @ProtoNumber(2) @JvmField val appid: Long = 0L,\n        @ProtoNumber(3) @JvmField val sender: Sender? = null,\n        @ProtoNumber(4) @JvmField val msgType: Int = 0,\n        @ProtoNumber(5) @JvmField val content: String = \"\",\n        @ProtoNumber(6) @JvmField val richMsg: RichMsg? = null,\n        @ProtoNumber(7) @JvmField val lightApp: LightApp? = null,\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class TroopTips0x857 : ProtoBuf {\n    @Serializable\n    internal class AIOGrayTipsInfo(\n        @ProtoNumber(1) @JvmField val optUint32ShowLastest: Int = 0,\n        @ProtoNumber(2) @JvmField val optBytesContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val optUint32Remind: Int = 0,\n        @ProtoNumber(4) @JvmField val optBytesBrief: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val receiverUin: Long = 0L,\n        @ProtoNumber(6) @JvmField val reliaoAdminOpt: Int = 0,\n        @ProtoNumber(7) @JvmField val robotGroupOpt: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class AIOTopTipsInfo(\n        @ProtoNumber(1) @JvmField val optBytesContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val optUint32Icon: Int = 0,\n        @ProtoNumber(3) @JvmField val optEnumAction: Int /* enum */ = 1,\n        @ProtoNumber(4) @JvmField val optBytesUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val optBytesData: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val optBytesDataI: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val optBytesDataA: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val optBytesDataP: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FloatedTipsInfo(\n        @ProtoNumber(1) @JvmField val optBytesContent: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GeneralGrayTipInfo(\n        @ProtoNumber(1) @JvmField val busiType: Long = 0L,\n        @ProtoNumber(2) @JvmField val busiId: Long = 0L,\n        @ProtoNumber(3) @JvmField val ctrlFlag: Int = 0,\n        @ProtoNumber(4) @JvmField val c2cType: Int = 0,\n        @ProtoNumber(5) @JvmField val serviceType: Int = 0,\n        @ProtoNumber(6) @JvmField val templId: Long = 0L,\n        @ProtoNumber(7) @JvmField val msgTemplParam: List<TemplParam> = emptyList(),\n        @ProtoNumber(8) @JvmField val content: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(10) @JvmField val tipsSeqId: Long = 0L,\n        @ProtoNumber(100) @JvmField val pbReserv: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GoldMsgTipsElem(\n        @ProtoNumber(1) @JvmField val type: Int = 0,\n        @ProtoNumber(2) @JvmField val billno: String = \"\",\n        @ProtoNumber(3) @JvmField val result: Int = 0,\n        @ProtoNumber(4) @JvmField val amount: Int = 0,\n        @ProtoNumber(5) @JvmField val total: Int = 0,\n        @ProtoNumber(6) @JvmField val interval: Int = 0,\n        @ProtoNumber(7) @JvmField val finish: Int = 0,\n        @ProtoNumber(8) @JvmField val uin: List<Long> = emptyList(),\n        @ProtoNumber(9) @JvmField val action: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GrayData(\n        @ProtoNumber(1) @JvmField val allRead: Int = 0,\n        @ProtoNumber(2) @JvmField val feedId: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupAnnounceTBCInfo(\n        @ProtoNumber(1) @JvmField val feedsId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val groupId: Long = 0L,\n        @ProtoNumber(3) @JvmField val action: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupAsyncNotify(\n        @ProtoNumber(1) @JvmField val msgType: Int = 0,\n        @ProtoNumber(2) @JvmField val msgSeq: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupInfoChange(\n        @ProtoNumber(1) @JvmField val groupHonorSwitch: Int = 0,\n        @ProtoNumber(2) @JvmField val groupMemberLevelSwitch: Int = 0,\n        @ProtoNumber(3) @JvmField val groupFlagext4: Int = 0,\n        @ProtoNumber(4) @JvmField val appealDeadline: Int = 0,\n        @ProtoNumber(5) @JvmField val groupFlag: Int = 0,\n        @ProtoNumber(7) @JvmField val groupFlagext3: Int = 0,\n        @ProtoNumber(8) @JvmField val groupClassExt: Int = 0,\n        @ProtoNumber(9) @JvmField val groupInfoExtSeq: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupNotifyInfo(\n        @ProtoNumber(1) @JvmField val optUint32AutoPullFlag: Int = 0,\n        @ProtoNumber(2) @JvmField val optBytesFeedsId: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class InstCtrl(\n        @ProtoNumber(1) @JvmField val msgSendToInst: List<InstInfo> = emptyList(),\n        @ProtoNumber(2) @JvmField val msgExcludeInst: List<InstInfo> = emptyList(),\n        @ProtoNumber(3) @JvmField val msgFromInst: InstInfo? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class InstInfo(\n        @ProtoNumber(1) @JvmField val apppid: Int = 0,\n        @ProtoNumber(2) @JvmField val instid: Int = 0,\n        @ProtoNumber(3) @JvmField val platform: Int = 0,\n        @ProtoNumber(4) @JvmField val openAppid: Int = 0,\n        @ProtoNumber(5) @JvmField val productid: Int = 0,\n        @ProtoNumber(6) @JvmField val ssoBid: Int = 0,\n        @ProtoNumber(7) @JvmField val guid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val verMin: Int = 0,\n        @ProtoNumber(9) @JvmField val verMax: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class LbsShareChangePushInfo(\n        @ProtoNumber(1) @JvmField val msgType: Int = 0,\n        @ProtoNumber(2) @JvmField val msgInfo: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val versionCtrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val groupId: Long = 0L,\n        @ProtoNumber(5) @JvmField val operUin: Long = 0L,\n        @ProtoNumber(6) @JvmField val grayTips: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val msgSeq: Long = 0L,\n        @ProtoNumber(8) @JvmField val joinNums: Int = 0,\n        @ProtoNumber(99) @JvmField val pushType: Int = 0,\n        @ProtoNumber(100) @JvmField val extInfo: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class LuckyBagNotify(\n        @ProtoNumber(1) @JvmField val msgTips: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MediaChangePushInfo(\n        @ProtoNumber(1) @JvmField val msgType: Int = 0,\n        @ProtoNumber(2) @JvmField val msgInfo: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val versionCtrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val groupId: Long = 0L,\n        @ProtoNumber(5) @JvmField val operUin: Long = 0L,\n        @ProtoNumber(6) @JvmField val grayTips: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val msgSeq: Long = 0L,\n        @ProtoNumber(8) @JvmField val joinNums: Int = 0,\n        @ProtoNumber(9) @JvmField val msgPerSetting: PersonalSetting? = null,\n        @ProtoNumber(10) @JvmField val playMode: Int = 0,\n        @ProtoNumber(11) @JvmField val isJoinWhenStart: Boolean = false,\n        @ProtoNumber(99) @JvmField val mediaType: Int = 0,\n        @ProtoNumber(100) @JvmField val extInfo: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf {\n        @Serializable\n        internal class PersonalSetting(\n            @ProtoNumber(1) @JvmField val themeId: Int = 0,\n            @ProtoNumber(2) @JvmField val playerId: Int = 0,\n            @ProtoNumber(3) @JvmField val fontId: Int = 0,\n        ) : ProtoBuf\n    }\n\n    @Serializable\n    internal class MessageBoxInfo(\n        @ProtoNumber(1) @JvmField val optBytesContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val optBytesTitle: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val optBytesButton: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MessageRecallReminder(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val nickname: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val recalledMsgList: List<MessageMeta> = emptyList(),\n        @ProtoNumber(4) @JvmField val reminderContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val userdef: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val groupType: Int = 0,\n        @ProtoNumber(7) @JvmField val opType: Int = 0,\n        @ProtoNumber(8) @JvmField val adminUin: Long = 0L,\n        @ProtoNumber(9) @JvmField val msgWordingInfo: WithDrawWordingInfo? = null,\n    ) : ProtoBuf {\n        @Serializable\n        internal class MessageMeta(\n            @ProtoNumber(1) @JvmField val seq: Int = 0,\n            @ProtoNumber(2) @JvmField val time: Int = 0,\n            @ProtoNumber(3) @JvmField val msgRandom: Int = 0,\n            @ProtoNumber(4) @JvmField val msgType: Int = 0,\n            @ProtoNumber(5) @JvmField val msgFlag: Int = 0,\n            @ProtoNumber(6) @JvmField val authorUin: Long = 0L,\n            @ProtoNumber(7) @JvmField val isAnonyMsg: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class WithDrawWordingInfo(\n            @ProtoNumber(1) @JvmField val int32ItemId: Int = 0,\n            @ProtoNumber(2) @JvmField val itemName: String = \"\",\n        ) : ProtoBuf\n    }\n\n    @Serializable\n    internal class MiniAppNotify(\n        @ProtoNumber(1) @JvmField val msg: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NotifyMsgBody(\n        @ProtoNumber(1) @JvmField val optEnumType: Int /* enum */ = 1,\n        @ProtoNumber(2) @JvmField val optUint64MsgTime: Long = 0L,\n        @ProtoNumber(3) @JvmField val optUint64MsgExpires: Long = 0L,\n        @ProtoNumber(4) @JvmField val optUint64GroupCode: Long = 0L,\n        @ProtoNumber(5) @JvmField val optMsgGraytips: AIOGrayTipsInfo? = null,\n        @ProtoNumber(6) @JvmField val optMsgMessagebox: MessageBoxInfo? = null,\n        @ProtoNumber(7) @JvmField val optMsgFloatedtips: FloatedTipsInfo? = null,\n        @ProtoNumber(8) @JvmField val optMsgToptips: AIOTopTipsInfo? = null,\n        @ProtoNumber(9) @JvmField val optMsgRedtips: RedGrayTipsInfo? = null,\n        @ProtoNumber(10) @JvmField val optMsgGroupNotify: GroupNotifyInfo? = null,\n        @ProtoNumber(11) @JvmField val optMsgRecall: MessageRecallReminder? = null,\n        @ProtoNumber(12) @JvmField val optMsgThemeNotify: ThemeStateNotify? = null,\n        @ProtoNumber(13) @JvmField val serviceType: Int = 0,\n        @ProtoNumber(14) @JvmField val optMsgObjmsgUpdate: NotifyObjmsgUpdate? = null,\n        @ProtoNumber(15) @JvmField val optMsgWerewolfPush: WereWolfPush? = null,\n        //@ProtoNumber(16) @JvmField val optStcmGameState: ApolloGameStatus.STCMGameMessage? = null,\n        //@ProtoNumber(17) @JvmField val aplloMsgPush: ApolloPushMsgInfo.STPushMsgElem? = null,\n        @ProtoNumber(18) @JvmField val optMsgGoldtips: GoldMsgTipsElem? = null,\n        @ProtoNumber(20) @JvmField val optMsgMiniappNotify: MiniAppNotify? = null,\n        @ProtoNumber(21) @JvmField val optUint64SenderUin: Long = 0L,\n        @ProtoNumber(22) @JvmField val optMsgLuckybagNotify: LuckyBagNotify? = null,\n        @ProtoNumber(23) @JvmField val optMsgTroopformtipsPush: TroopFormGrayTipsInfo? = null,\n        @ProtoNumber(24) @JvmField val optMsgMediaPush: MediaChangePushInfo? = null,\n        @ProtoNumber(26) @JvmField val optGeneralGrayTip: GeneralGrayTipInfo? = null,\n        @ProtoNumber(27) @JvmField val optMsgVideoPush: VideoChangePushInfo? = null,\n        @ProtoNumber(28) @JvmField val optLbsShareChangePlusInfo: LbsShareChangePushInfo? = null,\n        @ProtoNumber(29) @JvmField val optMsgSingPush: SingChangePushInfo? = null,\n        @ProtoNumber(30) @JvmField val optMsgGroupInfoChange: GroupInfoChange? = null,\n        @ProtoNumber(31) @JvmField val optGroupAnnounceTbcInfo: GroupAnnounceTBCInfo? = null,\n        @ProtoNumber(32) @JvmField val optQqVedioGamePushInfo: QQVedioGamePushInfo? = null,\n        @ProtoNumber(33) @JvmField val optQqGroupDigestMsg: QQGroupDigestMsg? = null,\n        @ProtoNumber(34) @JvmField val optStudyRoomMemberMsg: StudyRoomMemberChangePush? = null,\n        @ProtoNumber(35) @JvmField val optQqLiveNotify: QQVaLiveNotifyMsg? = null,\n        @ProtoNumber(36) @JvmField val optGroupAsyncNotidy: GroupAsyncNotify? = null,\n        @ProtoNumber(37) @JvmField val optUint64GroupCurMsgSeq: Long = 0L,\n        @ProtoNumber(38) @JvmField val optGroupDigestMsgSummary: QQGroupDigestMsgSummary? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NotifyObjmsgUpdate(\n        @ProtoNumber(1) @JvmField val objmsgId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val updateType: Int = 0,\n        @ProtoNumber(3) @JvmField val extMsg: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class QQGroupDigestMsg(\n        @ProtoNumber(1) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(2) @JvmField val msgSeq: Int = 0,\n        @ProtoNumber(3) @JvmField val msgRandom: Int = 0,\n        @ProtoNumber(4) @JvmField val opType: Int = 0,\n        @ProtoNumber(5) @JvmField val msgSender: Long = 0L,\n        @ProtoNumber(6) @JvmField val digestOper: Long = 0L,\n        @ProtoNumber(7) @JvmField val opTime: Int = 0,\n        @ProtoNumber(8) @JvmField val lastestMsgSeq: Int = 0,\n        @ProtoNumber(9) @JvmField val operNick: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(10) @JvmField val senderNick: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(11) @JvmField val extInfo: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class QQGroupDigestMsgSummary(\n        @ProtoNumber(1) @JvmField val digestOper: Long = 0L,\n        @ProtoNumber(2) @JvmField val opType: Int = 0,\n        @ProtoNumber(3) @JvmField val opTime: Int = 0,\n        @ProtoNumber(4) @JvmField val digestNick: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val succCnt: Int = 0,\n        @ProtoNumber(6) @JvmField val summaryInfo: List<QQGroupDigestSummaryInfo> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class QQGroupDigestSummaryInfo(\n        @ProtoNumber(1) @JvmField val msgSeq: Int = 0,\n        @ProtoNumber(2) @JvmField val msgRandom: Int = 0,\n        @ProtoNumber(3) @JvmField val errorCode: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class QQVaLiveNotifyMsg(\n        @ProtoNumber(1) @JvmField val uid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val notifyType: Int = 0,\n        @ProtoNumber(3) @JvmField val ext1: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val ext2: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val ext3: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class QQVedioGamePushInfo(\n        @ProtoNumber(1) @JvmField val msgType: Int = 0,\n        @ProtoNumber(2) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(3) @JvmField val operUin: Long = 0L,\n        @ProtoNumber(4) @JvmField val versionCtrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val extInfo: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RedGrayTipsInfo(\n        @ProtoNumber(1) @JvmField val optUint32ShowLastest: Int = 0,\n        @ProtoNumber(2) @JvmField val senderUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val receiverUin: Long = 0L,\n        @ProtoNumber(4) @JvmField val senderRichContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val receiverRichContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val authkey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoType(ProtoIntegerType.SIGNED) @ProtoNumber(7) @JvmField val sint32Msgtype: Int = 0,\n        @ProtoNumber(8) @JvmField val luckyFlag: Int = 0,\n        @ProtoNumber(9) @JvmField val hideFlag: Int = 0,\n        @ProtoNumber(10) @JvmField val pcBody: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(11) @JvmField val icon: Int = 0,\n        @ProtoNumber(12) @JvmField val luckyUin: Long = 0L,\n        @ProtoNumber(13) @JvmField val time: Int = 0,\n        @ProtoNumber(14) @JvmField val random: Int = 0,\n        @ProtoNumber(15) @JvmField val broadcastRichContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(16) @JvmField val idiom: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(17) @JvmField val idiomSeq: Int = 0,\n        @ProtoNumber(18) @JvmField val idiomAlpha: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(19) @JvmField val jumpurl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(20) @JvmField val subchannel: Int = 0,\n        @ProtoNumber(21) @JvmField val poemRule: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val optUint64GroupCode: Long = 0L,\n        @ProtoNumber(2) @JvmField val uint64Memberuins: List<Long> = emptyList(),\n        @ProtoNumber(3) @JvmField val optUint32Offline: Int = 0,\n        @ProtoNumber(4) @JvmField val msgInstCtrl: InstCtrl? = null,\n        @ProtoNumber(5) @JvmField val optBytesMsg: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val optUint32BusiType: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val optUint64GroupCode: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SingChangePushInfo(\n        @ProtoNumber(1) @JvmField val seq: Long = 0L,\n        @ProtoNumber(2) @JvmField val actionType: Int = 0,\n        @ProtoNumber(3) @JvmField val groupId: Long = 0L,\n        @ProtoNumber(4) @JvmField val operUin: Long = 0L,\n        @ProtoNumber(5) @JvmField val grayTips: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val joinNums: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class StudyRoomMemberChangePush(\n        @ProtoNumber(1) @JvmField val memberCount: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TemplParam(\n        @ProtoNumber(1) @JvmField val name: String = \"\",\n        @ProtoNumber(2) @JvmField val value: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ThemeStateNotify(\n        @ProtoNumber(1) @JvmField val state: Int = 0,\n        @ProtoNumber(2) @JvmField val feedsId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val themeName: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val actionUin: Long = 0L,\n        @ProtoNumber(5) @JvmField val createUin: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TroopFormGrayTipsInfo(\n        @ProtoNumber(1) @JvmField val writerUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val creatorUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val richContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val optBytesUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val creatorNick: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class VideoChangePushInfo(\n        @ProtoNumber(1) @JvmField val seq: Long = 0L,\n        @ProtoNumber(2) @JvmField val actionType: Int = 0,\n        @ProtoNumber(3) @JvmField val groupId: Long = 0L,\n        @ProtoNumber(4) @JvmField val operUin: Long = 0L,\n        @ProtoNumber(5) @JvmField val grayTips: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val joinNums: Int = 0,\n        @ProtoNumber(7) @JvmField val joinState: Int = 0,\n        @ProtoNumber(100) @JvmField val extInfo: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class WereWolfPush(\n        @ProtoNumber(1) @JvmField val pushType: Int = 0,\n        @ProtoNumber(2) @JvmField val gameRoom: Long = 0L,\n        @ProtoNumber(3) @JvmField val enumGameState: Int = 0,\n        @ProtoNumber(4) @JvmField val gameRound: Int = 0,\n        @ProtoNumber(5) @JvmField val roles: List<Role> = emptyList(),\n        @ProtoNumber(6) @JvmField val speaker: Long = 0L,\n        @ProtoNumber(7) @JvmField val judgeUin: Long = 0L,\n        @ProtoNumber(8) @JvmField val judgeWords: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(9) @JvmField val enumOperation: Int = 0,\n        @ProtoNumber(10) @JvmField val srcUser: Long = 0L,\n        @ProtoNumber(11) @JvmField val dstUser: Long = 0L,\n        @ProtoNumber(12) @JvmField val deadUsers: List<Long> = emptyList(),\n        @ProtoNumber(13) @JvmField val gameResult: Int = 0,\n        @ProtoNumber(14) @JvmField val timeoutSec: Int = 0,\n        @ProtoNumber(15) @JvmField val killConfirmed: Int = 0,\n        @ProtoNumber(16) @JvmField val judgeNickname: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(17) @JvmField val votedTieUsers: List<Long> = emptyList(),\n    ) : ProtoBuf {\n        @Serializable\n        internal class GameRecord(\n            @ProtoNumber(1) @JvmField val total: Int = 0,\n            @ProtoNumber(2) @JvmField val win: Int = 0,\n            @ProtoNumber(3) @JvmField val lose: Int = 0,\n            @ProtoNumber(4) @JvmField val draw: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class Role(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val enumType: Int = 0,\n            @ProtoNumber(3) @JvmField val enumState: Int = 0,\n            @ProtoNumber(4) @JvmField val canSpeak: Int = 0,\n            @ProtoNumber(5) @JvmField val canListen: Int = 0,\n            @ProtoNumber(6) @JvmField val position: Int = 0,\n            @ProtoNumber(7) @JvmField val canVote: Int = 0,\n            @ProtoNumber(8) @JvmField val canVoted: Int = 0,\n            @ProtoNumber(9) @JvmField val alreadyChecked: Int = 0,\n            @ProtoNumber(10) @JvmField val alreadySaved: Int = 0,\n            @ProtoNumber(11) @JvmField val alreadyPoisoned: Int = 0,\n            @ProtoNumber(12) @JvmField val playerState: Int = 0,\n            @ProtoNumber(13) @JvmField val enumDeadOp: Int = 0,\n            @ProtoNumber(14) @JvmField val enumOperation: Int = 0,\n            @ProtoNumber(15) @JvmField val dstUser: Long = 0L,\n            @ProtoNumber(16) @JvmField val operationRound: Int = 0,\n            @ProtoNumber(17) @JvmField val msgGameRecord: GameRecord? = null,\n            @ProtoNumber(18) @JvmField val isWerewolf: Int = 0,\n            @ProtoNumber(19) @JvmField val defendedUser: Long = 0L,\n            @ProtoNumber(20) @JvmField val isSheriff: Int = 0,\n        ) : ProtoBuf\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/Cmd0x858.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"SpellCheckingInspection\")\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoIntegerType\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport kotlinx.serialization.protobuf.ProtoType\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class Oidb0x858 : ProtoBuf {\n    @Serializable\n    internal class GoldMsgTipsElem(\n        @ProtoNumber(1) @JvmField val type: Int = 0,\n        @ProtoNumber(2) @JvmField val billno: String = \"\",\n        @ProtoNumber(3) @JvmField val result: Int = 0,\n        @ProtoNumber(4) @JvmField val amount: Int = 0,\n        @ProtoNumber(5) @JvmField val total: Int = 0,\n        @ProtoNumber(6) @JvmField val interval: Int = 0,\n        @ProtoNumber(7) @JvmField val finish: Int = 0,\n        @ProtoNumber(8) @JvmField val uin: List<Long> = emptyList(),\n        @ProtoNumber(9) @JvmField val action: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MessageRecallReminder(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val nickname: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val recalledMsgList: List<MessageMeta> = emptyList(),\n        @ProtoNumber(4) @JvmField val reminderContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val userdef: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf {\n        @Serializable\n        internal class MessageMeta(\n            @ProtoNumber(1) @JvmField val seq: Int = 0,\n            @ProtoNumber(2) @JvmField val time: Int = 0,\n            @ProtoNumber(3) @JvmField val msgRandom: Int = 0,\n        ) : ProtoBuf\n    }\n\n    @Serializable\n    internal class NotifyMsgBody(\n        @ProtoNumber(1) @JvmField val optEnumType: Int /* enum */ = 5,\n        @ProtoNumber(2) @JvmField val optUint64MsgTime: Long = 0L,\n        @ProtoNumber(3) @JvmField val optUint64MsgExpires: Long = 0L,\n        @ProtoNumber(4) @JvmField val optUint64ConfUin: Long = 0L,\n        @ProtoNumber(5) @JvmField val optMsgRedtips: RedGrayTipsInfo? = null,\n        @ProtoNumber(6) @JvmField val optMsgRecallReminder: MessageRecallReminder? = null,\n        @ProtoNumber(7) @JvmField val optMsgObjUpdate: NotifyObjmsgUpdate? = null,\n        // @SerialId(8) @JvmField val optStcmGameState: ApolloGameStatus.STCMGameMessage? = null,\n        // @SerialId(9) @JvmField val aplloMsgPush: ApolloPushMsgInfo.STPushMsgElem? = null,\n        @ProtoNumber(10) @JvmField val optMsgGoldtips: GoldMsgTipsElem? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NotifyObjmsgUpdate(\n        @ProtoNumber(1) @JvmField val objmsgId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val updateType: Int = 0,\n        @ProtoNumber(3) @JvmField val extMsg: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RedGrayTipsInfo(\n        @ProtoNumber(1) @JvmField val optUint32ShowLastest: Int = 0,\n        @ProtoNumber(2) @JvmField val senderUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val receiverUin: Long = 0L,\n        @ProtoNumber(4) @JvmField val senderRichContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val receiverRichContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val authkey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoType(ProtoIntegerType.SIGNED) @ProtoNumber(7) @JvmField val sint32Msgtype: Int = 0,\n        @ProtoNumber(8) @JvmField val luckyFlag: Int = 0,\n        @ProtoNumber(9) @JvmField val hideFlag: Int = 0,\n        @ProtoNumber(10) @JvmField val pcBody: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(11) @JvmField val icon: Int = 0,\n        @ProtoNumber(12) @JvmField val luckyUin: Long = 0L,\n        @ProtoNumber(13) @JvmField val time: Int = 0,\n        @ProtoNumber(14) @JvmField val random: Int = 0,\n        @ProtoNumber(15) @JvmField val broadcastRichContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(16) @JvmField val idiom: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(17) @JvmField val idiomSeq: Int = 0,\n        @ProtoNumber(18) @JvmField val idiomAlpha: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(19) @JvmField val jumpurl: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/Define.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\ninternal class Common : ProtoBuf {\n    @Serializable\n    internal class BindInfo(\n        @ProtoNumber(1) @JvmField val friUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val friNick: String = \"\",\n        @ProtoNumber(3) @JvmField val time: Long = 0L,\n        @ProtoNumber(4) @JvmField val bindStatus: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MedalInfo(\n        @ProtoNumber(1) @JvmField val id: Int = 0,\n        @ProtoNumber(2) @JvmField val type: Int = 0,\n        @ProtoNumber(4) @JvmField val seq: Long = 0,\n        @ProtoNumber(5) @JvmField val name: String = \"\",\n        @ProtoNumber(6) @JvmField val newflag: Int = 0,\n        @ProtoNumber(7) @JvmField val time: Long = 0L,\n        @ProtoNumber(8) @JvmField val msgBindFri: BindInfo? = null,\n        @ProtoNumber(11) @JvmField val desc: String = \"\",\n        @ProtoNumber(31) @JvmField val level: Int = 0,\n        @ProtoNumber(36) @JvmField val taskinfos: List<MedalTaskInfo> = emptyList(),\n        @ProtoNumber(40) @JvmField val point: Int = 0,\n        @ProtoNumber(41) @JvmField val pointLevel2: Int = 0,\n        @ProtoNumber(42) @JvmField val pointLevel3: Int = 0,\n        @ProtoNumber(43) @JvmField val seqLevel2: Long = 0,\n        @ProtoNumber(44) @JvmField val seqLevel3: Long = 0,\n        @ProtoNumber(45) @JvmField val timeLevel2: Long = 0L,\n        @ProtoNumber(46) @JvmField val timeLevel3: Long = 0L,\n        @ProtoNumber(47) @JvmField val descLevel2: String = \"\",\n        @ProtoNumber(48) @JvmField val descLevel3: String = \"\",\n        @ProtoNumber(49) @JvmField val endtime: Int = 0,\n        @ProtoNumber(50) @JvmField val detailUrl: String = \"\",\n        @ProtoNumber(51) @JvmField val detailUrl2: String = \"\",\n        @ProtoNumber(52) @JvmField val detailUrl3: String = \"\",\n        @ProtoNumber(53) @JvmField val taskDesc: String = \"\",\n        @ProtoNumber(54) @JvmField val taskDesc2: String = \"\",\n        @ProtoNumber(55) @JvmField val taskDesc3: String = \"\",\n        @ProtoNumber(56) @JvmField val levelCount: Int = 0,\n        @ProtoNumber(57) @JvmField val noProgress: Int = 0,\n        @ProtoNumber(58) @JvmField val resource: String = \"\",\n        @ProtoNumber(59) @JvmField val fromuinLevel: Int = 0,\n        @ProtoNumber(60) @JvmField val unread: Int = 0,\n        @ProtoNumber(61) @JvmField val unread2: Int = 0,\n        @ProtoNumber(62) @JvmField val unread3: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MedalTaskInfo(\n        @ProtoNumber(1) @JvmField val taskid: Int = 0,\n        @ProtoNumber(32) @JvmField val int32TaskValue: Int = 0,\n        @ProtoNumber(33) @JvmField val tarValue: Int = 0,\n        @ProtoNumber(34) @JvmField val tarValueLevel2: Int = 0,\n        @ProtoNumber(35) @JvmField val tarValueLevel3: Int = 0,\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class AppointDefine : ProtoBuf {\n    @Serializable\n    internal class ADFeedContent(\n        @ProtoNumber(1) @JvmField val msgUserInfo: UserInfo? = null,\n        @ProtoNumber(2) @JvmField val strPicUrl: List<String> = emptyList(),\n        @ProtoNumber(3) @JvmField val msgText: RichText? = null,\n        @ProtoNumber(4) @JvmField val attendInfo: String = \"\",\n        @ProtoNumber(5) @JvmField val actionUrl: String = \"\",\n        @ProtoNumber(6) @JvmField val publishTime: Int = 0,\n        @ProtoNumber(7) @JvmField val msgHotTopicList: HotTopicList? = null,\n        @ProtoNumber(8) @JvmField val moreUrl: String = \"\",\n        @ProtoNumber(9) @JvmField val recordDuration: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RichText(\n        @ProtoNumber(1) @JvmField val msgElems: List<Elem> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RankEvent(\n        @ProtoNumber(1) @JvmField val listtype: Int = 0,\n        @ProtoNumber(2) @JvmField val notifytype: Int = 0,\n        @ProtoNumber(3) @JvmField val eventtime: Int = 0,\n        @ProtoNumber(4) @JvmField val seq: Int = 0,\n        @ProtoNumber(5) @JvmField val notifyTips: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Wifi(\n        @ProtoNumber(1) @JvmField val mac: Long = 0L,\n        @ProtoNumber(2) @JvmField val int32Rssi: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class InterestItem(\n        @ProtoNumber(1) @JvmField val tagId: Long = 0L,\n        @ProtoNumber(2) @JvmField val tagName: String = \"\",\n        @ProtoNumber(3) @JvmField val tagIconUrl: String = \"\",\n        @ProtoNumber(4) @JvmField val tagHref: String = \"\",\n        @ProtoNumber(5) @JvmField val tagBackColor: String = \"\",\n        @ProtoNumber(6) @JvmField val tagFontColor: String = \"\",\n        @ProtoNumber(7) @JvmField val tagVid: String = \"\",\n        @ProtoNumber(8) @JvmField val tagType: Int = 0,\n        @ProtoNumber(9) @JvmField val addTime: Int = 0,\n        @ProtoNumber(10) @JvmField val tagCategory: String = \"\",\n        @ProtoNumber(11) @JvmField val tagOtherUrl: String = \"\",\n        @ProtoNumber(12) @JvmField val bid: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ShopID(\n        @ProtoNumber(1) @JvmField val shopid: String = \"\",\n        @ProtoNumber(2) @JvmField val sp: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FeedComment(\n        @ProtoNumber(1) @JvmField val commentId: String = \"\",\n        @ProtoNumber(2) @JvmField val feedId: String = \"\",\n        @ProtoNumber(3) @JvmField val msgPublisherInfo: StrangerInfo? = null,\n        @ProtoNumber(4) @JvmField val time: Int = 0,\n        @ProtoNumber(6) @JvmField val msgReplyInfo: ReplyInfo? = null,\n        @ProtoNumber(7) @JvmField val flag: Int = 0,\n        @ProtoNumber(8) @JvmField val msgContent: RichText? = null,\n        @ProtoNumber(9) @JvmField val hot: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ADFeed(\n        @ProtoNumber(1) @JvmField val taskId: Int = 0,\n        @ProtoNumber(2) @JvmField val style: Int = 0,\n        @ProtoNumber(3) @JvmField val content: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Cell(\n        @ProtoNumber(1) @JvmField val int32Mcc: Int = -1,\n        @ProtoNumber(2) @JvmField val int32Mnc: Int = -1,\n        @ProtoNumber(3) @JvmField val int32Lac: Int = -1,\n        @ProtoNumber(4) @JvmField val int32Cellid: Int = -1,\n        @ProtoNumber(5) @JvmField val int32Rssi: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RecentVistorEvent(\n        @ProtoNumber(1) @JvmField val eventtype: Int = 0,\n        @ProtoNumber(2) @JvmField val eventTinyid: Long = 0L,\n        @ProtoNumber(3) @JvmField val unreadCount: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class OrganizerInfo(\n        @ProtoNumber(1) @JvmField val hostName: String = \"\",\n        @ProtoNumber(2) @JvmField val hostUrl: String = \"\",\n        @ProtoNumber(3) @JvmField val hostCover: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class InterestTag(\n        @ProtoNumber(1) @JvmField val tagType: Int = 0,\n        @ProtoNumber(2) @JvmField val msgTagList: List<InterestItem> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class AppointInfoEx(\n        @ProtoNumber(1) @JvmField val feedsPicUrl: String = \"\",\n        @ProtoNumber(2) @JvmField val feedsUrl: String = \"\",\n        @ProtoNumber(3) @JvmField val detailTitle: String = \"\",\n        @ProtoNumber(4) @JvmField val detailDescribe: String = \"\",\n        @ProtoNumber(5) @JvmField val showPublisher: Int = 0,\n        @ProtoNumber(6) @JvmField val detailPicUrl: String = \"\",\n        @ProtoNumber(7) @JvmField val detailUrl: String = \"\",\n        @ProtoNumber(8) @JvmField val showAttend: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DateComment(\n        @ProtoNumber(1) @JvmField val commentId: String = \"\",\n        @ProtoNumber(2) @JvmField val msgAppointId: AppointID? = null,\n        @ProtoNumber(3) @JvmField val msgPublisherInfo: StrangerInfo? = null,\n        @ProtoNumber(4) @JvmField val time: Int = 0,\n        @ProtoNumber(6) @JvmField val msgReplyInfo: ReplyInfo? = null,\n        @ProtoNumber(7) @JvmField val flag: Int = 0,\n        @ProtoNumber(8) @JvmField val msgContent: RichText? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class AppointContent(\n        @ProtoNumber(1) @JvmField val appointSubject: Int = 0,\n        @ProtoNumber(2) @JvmField val payType: Int = 0,\n        @ProtoNumber(3) @JvmField val appointDate: Int = 0,\n        @ProtoNumber(4) @JvmField val appointGender: Int = 0,\n        @ProtoNumber(5) @JvmField val appointIntroduce: String = \"\",\n        @ProtoNumber(6) @JvmField val msgAppointAddress: AddressInfo? = null,\n        @ProtoNumber(7) @JvmField val msgTravelInfo: TravelInfo? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FeedInfo(\n        @ProtoNumber(1) @JvmField val feedType: Long = 0L,\n        @ProtoNumber(2) @JvmField val feedId: String = \"\",\n        @ProtoNumber(3) @JvmField val msgFeedContent: FeedContent? = null,\n        @ProtoNumber(4) @JvmField val msgTopicInfo: NearbyTopic? = null,\n        @ProtoNumber(5) @JvmField val publishTime: Long = 0,\n        @ProtoNumber(6) @JvmField val praiseCount: Int = 0,\n        @ProtoNumber(7) @JvmField val praiseFlag: Int = 0,\n        @ProtoNumber(8) @JvmField val msgPraiseUser: List<StrangerInfo> = emptyList(),\n        @ProtoNumber(9) @JvmField val commentCount: Int = 0,\n        @ProtoNumber(10) @JvmField val msgCommentList: List<FeedComment> = emptyList(),\n        @ProtoNumber(11) @JvmField val commentRetAll: Int = 0,\n        @ProtoNumber(12) @JvmField val hotFlag: Int = 0,\n        @ProtoNumber(13) @JvmField val svrReserved: Long = 0L,\n        @ProtoNumber(14) @JvmField val msgHotEntry: HotEntry? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class HotTopicList(\n        @ProtoNumber(1) @JvmField val topicList: List<HotTopic> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FeedContent(\n        @ProtoNumber(1) @JvmField val strPicUrl: List<String> = emptyList(),\n        @ProtoNumber(2) @JvmField val msgText: RichText? = null,\n        @ProtoNumber(3) @JvmField val hrefUrl: String = \"\",\n        @ProtoNumber(5) @JvmField val groupName: String = \"\",\n        @ProtoNumber(6) @JvmField val groupBulletin: String = \"\",\n        @ProtoNumber(7) @JvmField val feedType: Int = 0,\n        @ProtoNumber(8) @JvmField val poiId: String = \"\",\n        @ProtoNumber(9) @JvmField val poiTitle: String = \"\",\n        @ProtoNumber(20) @JvmField val effectiveTime: Int = 0,\n        @ProtoNumber(21) @JvmField val expiationTime: Int = 0,\n        @ProtoNumber(22) @JvmField val msgLocale: LocaleInfo? = null,\n        @ProtoNumber(23) @JvmField val feedsIndex: Int = 0,\n        @ProtoNumber(24) @JvmField val msgAd: ADFeed? = null,\n        @ProtoNumber(25) @JvmField val privateData: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TravelInfo(\n        @ProtoNumber(1) @JvmField val msgDepartLocale: LocaleInfo? = null,\n        @ProtoNumber(2) @JvmField val msgDestination: LocaleInfo? = null,\n        @ProtoNumber(3) @JvmField val vehicle: Int = 0,\n        @ProtoNumber(4) @JvmField val partnerCount: Int = 0,\n        @ProtoNumber(5) @JvmField val placePicUrl: String = \"\",\n        @ProtoNumber(6) @JvmField val placeUrl: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RecentFreshFeed(\n        @ProtoNumber(1) @JvmField val freshFeedInfo: List<FreshFeedInfo> = emptyList(),\n        @ProtoNumber(2) @JvmField val uid: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GPS(\n        @ProtoNumber(1) @JvmField val int32Lat: Int = 900000000,\n        @ProtoNumber(2) @JvmField val int32Lon: Int = 900000000,\n        @ProtoNumber(3) @JvmField val int32Alt: Int = -10000000,\n        @ProtoNumber(4) @JvmField val int32Type: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class AppointID(\n        @ProtoNumber(1) @JvmField val requestId: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class LocaleInfo(\n        @ProtoNumber(1) @JvmField val name: String = \"\",\n        @ProtoNumber(2) @JvmField val country: String = \"\",\n        @ProtoNumber(3) @JvmField val province: String = \"\",\n        @ProtoNumber(4) @JvmField val city: String = \"\",\n        @ProtoNumber(5) @JvmField val region: String = \"\",\n        @ProtoNumber(6) @JvmField val poi: String = \"\",\n        @ProtoNumber(7) @JvmField val msgGps: GPS? = null,\n        @ProtoNumber(8) @JvmField val address: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class LBSInfo(\n        @ProtoNumber(1) @JvmField val msgGps: GPS? = null,\n        @ProtoNumber(2) @JvmField val msgWifis: List<Wifi> = emptyList(),\n        @ProtoNumber(3) @JvmField val msgCells: List<Cell> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FeedEvent(\n        @ProtoNumber(1) @JvmField val eventId: Long = 0L,\n        @ProtoNumber(2) @JvmField val time: Int = 0,\n        @ProtoNumber(3) @JvmField val eventtype: Int = 0,\n        @ProtoNumber(4) @JvmField val msgUserInfo: StrangerInfo? = null,\n        @ProtoNumber(5) @JvmField val msgFeedInfo: FeedInfo? = null,\n        @ProtoNumber(6) @JvmField val eventTips: String = \"\",\n        @ProtoNumber(7) @JvmField val msgComment: FeedComment? = null,\n        @ProtoNumber(8) @JvmField val cancelEventId: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FeedsCookie(\n        @ProtoNumber(1) @JvmField val strList: List<String> = emptyList(),\n        @ProtoNumber(2) @JvmField val pose: Int = 0,\n        @ProtoNumber(3) @JvmField val cookie: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val uint64Topics: List<Long> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NearbyTopic(\n        @ProtoNumber(1) @JvmField val topicId: Long = 0L,\n        @ProtoNumber(2) @JvmField val topic: String = \"\",\n        @ProtoNumber(3) @JvmField val foreword: String = \"\",\n        @ProtoNumber(4) @JvmField val createTime: Int = 0,\n        @ProtoNumber(5) @JvmField val updateTime: Int = 0,\n        @ProtoNumber(6) @JvmField val hotFlag: Int = 0,\n        @ProtoNumber(7) @JvmField val buttonStyle: Int = 0,\n        @ProtoNumber(8) @JvmField val buttonSrc: String = \"\",\n        @ProtoNumber(9) @JvmField val backgroundSrc: String = \"\",\n        @ProtoNumber(10) @JvmField val attendeeInfo: String = \"\",\n        @ProtoNumber(11) @JvmField val index: Int = 0,\n        @ProtoNumber(12) @JvmField val publishScope: Int = 0,\n        @ProtoNumber(13) @JvmField val effectiveTime: Int = 0,\n        @ProtoNumber(14) @JvmField val expiationTime: Int = 0,\n        @ProtoNumber(15) @JvmField val pushedUsrCount: Int = 0,\n        @ProtoNumber(16) @JvmField val timerangeLeft: Int = 0,\n        @ProtoNumber(17) @JvmField val timerangeRight: Int = 0,\n        @ProtoNumber(18) @JvmField val area: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NearbyEvent(\n        @ProtoNumber(1) @JvmField val eventtype: Int = 0,\n        @ProtoNumber(2) @JvmField val msgRankevent: RankEvent? = null,\n        @ProtoNumber(3) @JvmField val eventUin: Long = 0L,\n        @ProtoNumber(4) @JvmField val eventTinyid: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Feed(\n        @ProtoNumber(1) @JvmField val msgUserInfo: PublisherInfo? = null,\n        @ProtoNumber(2) @JvmField val msgFeedInfo: FeedInfo? = null,\n        @ProtoNumber(3) @JvmField val ownerFlag: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ActivityInfo(\n        @ProtoNumber(2) @JvmField val name: String = \"\",\n        @ProtoNumber(3) @JvmField val cover: String = \"\",\n        @ProtoNumber(4) @JvmField val url: String = \"\",\n        @ProtoNumber(5) @JvmField val startTime: Int = 0,\n        @ProtoNumber(6) @JvmField val endTime: Int = 0,\n        @ProtoNumber(7) @JvmField val locName: String = \"\",\n        @ProtoNumber(8) @JvmField val enroll: Long = 0L,\n        @ProtoNumber(9) @JvmField val createUin: Long = 0L,\n        @ProtoNumber(10) @JvmField val createTime: Int = 0,\n        @ProtoNumber(11) @JvmField val organizerInfo: OrganizerInfo = OrganizerInfo(),\n        @ProtoNumber(12) @JvmField val flag: Long? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class HotEntry(\n        @ProtoNumber(1) @JvmField val openFlag: Int = 0,\n        @ProtoNumber(2) @JvmField val restTime: Int = 0,\n        @ProtoNumber(3) @JvmField val foreword: String = \"\",\n        @ProtoNumber(4) @JvmField val backgroundSrc: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class UserFeed(\n        @ProtoNumber(1) @JvmField val msgUserInfo: PublisherInfo? = null,\n        @ProtoNumber(2) @JvmField val msgFeedInfo: FeedInfo? = null,\n        @ProtoNumber(3) @JvmField val ownerFlag: Int = 0,\n        @ProtoNumber(4) @JvmField val msgActivityInfo: ActivityInfo? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Elem(\n        @ProtoNumber(1) @JvmField val content: String = \"\",\n        @ProtoNumber(2) @JvmField val msgFaceInfo: Face? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class HotFreshFeedList(\n        @ProtoNumber(1) @JvmField val msgFeeds: List<HotUserFeed> = emptyList(),\n        @ProtoNumber(2) @JvmField val updateTime: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RptInterestTag(\n        @ProtoNumber(1) @JvmField val interestTags: List<InterestTag> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class AddressInfo(\n        @ProtoNumber(1) @JvmField val companyZone: String = \"\",\n        @ProtoNumber(2) @JvmField val companyName: String = \"\",\n        @ProtoNumber(3) @JvmField val companyAddr: String = \"\",\n        @ProtoNumber(4) @JvmField val companyPicUrl: String = \"\",\n        @ProtoNumber(5) @JvmField val companyUrl: String = \"\",\n        @ProtoNumber(6) @JvmField val msgCompanyId: ShopID? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PublisherInfo(\n        @ProtoNumber(1) @JvmField val tinyid: Long = 0L,\n        @ProtoNumber(2) @JvmField val nickname: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val age: Int = 0,\n        @ProtoNumber(4) @JvmField val gender: Int = 0,\n        @ProtoNumber(5) @JvmField val constellation: String = \"\",\n        @ProtoNumber(6) @JvmField val profession: Int = 0,\n        @ProtoNumber(7) @JvmField val distance: String = \"\",\n        @ProtoNumber(8) @JvmField val marriage: Int = 0,\n        @ProtoNumber(9) @JvmField val vipinfo: String = \"\",\n        @ProtoNumber(10) @JvmField val recommend: Int = 0,\n        @ProtoNumber(11) @JvmField val godflag: Int = 0,\n        @ProtoNumber(12) @JvmField val chatflag: Int = 0,\n        @ProtoNumber(13) @JvmField val chatupCount: Int = 0,\n        @ProtoNumber(14) @JvmField val charm: Int = 0,\n        @ProtoNumber(15) @JvmField val charmLevel: Int = 0,\n        @ProtoNumber(16) @JvmField val pubNumber: Int = 0,\n        @ProtoNumber(17) @JvmField val msgCommonLabel: CommonLabel? = null,\n        @ProtoNumber(18) @JvmField val recentVistorTime: Int = 0,\n        @ProtoNumber(19) @JvmField val strangerDeclare: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(20) @JvmField val friendUin: Long = 0L,\n        @ProtoNumber(21) @JvmField val historyFlag: Int = 0,\n        @ProtoNumber(22) @JvmField val followflag: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class HotUserFeed(\n        @ProtoNumber(1) @JvmField val feedId: String = \"\",\n        @ProtoNumber(2) @JvmField val praiseCount: Int = 0,\n        @ProtoNumber(3) @JvmField val publishUid: Long = 0L,\n        @ProtoNumber(4) @JvmField val publishTime: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FreshFeedInfo(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val time: Int = 0,\n        @ProtoNumber(3) @JvmField val feedId: String = \"\",\n        @ProtoNumber(4) @JvmField val feedType: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CommonLabel(\n        @ProtoNumber(1) @JvmField val lableId: Int = 0,\n        @ProtoNumber(2) @JvmField val lableMsgPre: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val lableMsgLast: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val interstName: List<ByteArray> = emptyList(),\n        @ProtoNumber(5) @JvmField val interstType: List<Int> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Face(\n        @ProtoNumber(1) @JvmField val index: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class StrangerInfo(\n        @ProtoNumber(1) @JvmField val tinyid: Long = 0L,\n        @ProtoNumber(2) @JvmField val nickname: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val age: Int = 0,\n        @ProtoNumber(4) @JvmField val gender: Int = 0,\n        @ProtoNumber(5) @JvmField val dating: Int = 0,\n        @ProtoNumber(6) @JvmField val listIdx: Int = 0,\n        @ProtoNumber(7) @JvmField val constellation: String = \"\",\n        @ProtoNumber(8) @JvmField val profession: Int = 0,\n        @ProtoNumber(9) @JvmField val marriage: Int = 0,\n        @ProtoNumber(10) @JvmField val vipinfo: String = \"\",\n        @ProtoNumber(11) @JvmField val recommend: Int = 0,\n        @ProtoNumber(12) @JvmField val godflag: Int = 0,\n        @ProtoNumber(13) @JvmField val charm: Int = 0,\n        @ProtoNumber(14) @JvmField val charmLevel: Int = 0,\n        @ProtoNumber(15) @JvmField val uin: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class HotTopic(\n        @ProtoNumber(1) @JvmField val id: Long = 0L,\n        @ProtoNumber(2) @JvmField val title: String = \"\",\n        @ProtoNumber(3) @JvmField val topicType: Long = 0L,\n        @ProtoNumber(4) @JvmField val total: Long = 0L,\n        @ProtoNumber(5) @JvmField val times: Long = 0L,\n        @ProtoNumber(6) @JvmField val historyTimes: Long = 0L,\n        @ProtoNumber(7) @JvmField val bgUrl: String = \"\",\n        @ProtoNumber(8) @JvmField val url: String = \"\",\n        @ProtoNumber(9) @JvmField val extraInfo: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DateEvent(\n        @ProtoNumber(1) @JvmField val eventId: Long = 0L,\n        @ProtoNumber(2) @JvmField val time: Int = 0,\n        @ProtoNumber(3) @JvmField val type: Int = 0,\n        @ProtoNumber(4) @JvmField val msgUserInfo: StrangerInfo? = null,\n        @ProtoNumber(5) @JvmField val msgDateInfo: AppointInfo? = null,\n        @ProtoNumber(6) @JvmField val attendIdx: Int = 0,\n        @ProtoNumber(7) @JvmField val eventTips: String = \"\",\n        @ProtoNumber(8) @JvmField val msgComment: DateComment? = null,\n        @ProtoNumber(9) @JvmField val cancelEventId: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class AppointInfo(\n        @ProtoNumber(1) @JvmField val msgAppointId: AppointID? = null,\n        @ProtoNumber(2) @JvmField val msgAppointment: AppointContent? = null,\n        @ProtoNumber(3) @JvmField val appointStatus: Int = 0,\n        @ProtoNumber(4) @JvmField val joinWording: String = \"\",\n        @ProtoNumber(5) @JvmField val viewWording: String = \"\",\n        @ProtoNumber(6) @JvmField val unreadCount: Int = 0,\n        @ProtoNumber(7) @JvmField val owner: Int = 0,\n        @ProtoNumber(8) @JvmField val join: Int = 0,\n        @ProtoNumber(9) @JvmField val view: Int = 0,\n        @ProtoNumber(10) @JvmField val commentWording: String = \"\",\n        @ProtoNumber(11) @JvmField val commentNum: Int = 0,\n        @ProtoNumber(12) @JvmField val attendStatus: Int = 0,\n        @ProtoNumber(13) @JvmField val msgAppointmentEx: AppointInfoEx? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class UserInfo(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val nickname: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val age: Int = 0,\n        @ProtoNumber(4) @JvmField val gender: Int = 0,\n        @ProtoNumber(5) @JvmField val avatar: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReplyInfo(\n        @ProtoNumber(1) @JvmField val commentId: String = \"\",\n        @ProtoNumber(2) @JvmField val msgStrangerInfo: StrangerInfo? = null,\n    ) : ProtoBuf\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/Exciting.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class GroupFileUploadExt(\n    @JvmField @ProtoNumber(1) val u1: Int,\n    @JvmField @ProtoNumber(2) val u2: Int,\n    @JvmField @ProtoNumber(100) val entry: GroupFileUploadEntry,\n    @JvmField @ProtoNumber(3) val u3: Int,\n) : ProtoBuf\n\n@Serializable\ninternal class GroupFileUploadEntry(\n    @JvmField @ProtoNumber(100) val business: ExcitingBusiInfo,\n    @JvmField @ProtoNumber(200) val fileEntry: ExcitingFileEntry,\n    @JvmField @ProtoNumber(300) val clientInfo: ExcitingClientInfo,\n    @JvmField @ProtoNumber(400) val fileNameInfo: ExcitingFileNameInfo,\n    @JvmField @ProtoNumber(500) val host: ExcitingHostConfig,\n) : ProtoBuf\n\n@Serializable\ninternal class ExcitingBusiInfo(\n    @JvmField @ProtoNumber(1) val busId: Int,\n    @JvmField @ProtoNumber(100) val senderUin: Long,\n    @JvmField @ProtoNumber(200) val receiverUin: Long, // maybe\n    @JvmField @ProtoNumber(400) val groupCode: Long, // maybe\n) : ProtoBuf\n\n@Serializable\ninternal class ExcitingFileEntry(\n    @JvmField @ProtoNumber(100) val fileSize: Long,\n    @JvmField @ProtoNumber(200) val md5: ByteArray,\n    @JvmField @ProtoNumber(300) val sha1: ByteArray,\n    @JvmField @ProtoNumber(600) val fileId: ByteArray,\n    @JvmField @ProtoNumber(700) val uploadKey: ByteArray,\n) : ProtoBuf\n\n\n@Serializable\ninternal class ExcitingClientInfo(\n    @JvmField @ProtoNumber(100) val clientType: Int, // maybe\n    @JvmField @ProtoNumber(200) val appId: String,\n    @JvmField @ProtoNumber(300) val terminalType: Int,\n    @JvmField @ProtoNumber(400) val clientVer: String,\n    @JvmField @ProtoNumber(600) val unknown: Int,\n) : ProtoBuf\n\n@Serializable\ninternal class ExcitingFileNameInfo(\n    @JvmField @ProtoNumber(100) val filename: String,\n) : ProtoBuf\n\n@Serializable\ninternal class ExcitingHostConfig(\n    @JvmField @ProtoNumber(200) val hosts: List<ExcitingHostInfo>,\n) : ProtoBuf\n\n@Serializable\ninternal class ExcitingHostInfo(\n    @JvmField @ProtoNumber(1) val url: ExcitingUrlInfo,\n    @JvmField @ProtoNumber(2) val port: Int,\n) : ProtoBuf\n\n@Serializable\ninternal class ExcitingUrlInfo(\n    @JvmField @ProtoNumber(1) val unknown: Int,\n    @JvmField @ProtoNumber(2) val host: String,\n) : ProtoBuf"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/FrdSysMsg.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"SpellCheckingInspection\")\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport kotlin.jvm.JvmField\n\ninternal class FrdSysMsg {\n    @Serializable\n    internal class AddFrdSNInfo(\n        @JvmField @ProtoNumber(1) val notSeeDynamic: Int = 0,\n        @JvmField @ProtoNumber(2) val setSn: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class AddFriendVerifyInfo(\n        @JvmField @ProtoNumber(1) val type: Int = 0,\n        @JvmField @ProtoNumber(2) val url: String = \"\",\n        @JvmField @ProtoNumber(3) val verifyInfo: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class AddtionInfo(\n        @JvmField @ProtoNumber(1) val poke: Int = 0,\n        @JvmField @ProtoNumber(2) val format: Int = 0,\n        @JvmField @ProtoNumber(3) val entityCategory: String = \"\",\n        @JvmField @ProtoNumber(4) val entityName: String = \"\",\n        @JvmField @ProtoNumber(5) val entityUrl: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DiscussInfo(\n        @JvmField @ProtoNumber(1) val discussUin: Long = 0L,\n        @JvmField @ProtoNumber(2) val discussName: String = \"\",\n        @JvmField @ProtoNumber(3) val discussNick: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class EimInfo(\n        @JvmField @ProtoNumber(1) val eimFuin: Long = 0L,\n        @JvmField @ProtoNumber(2) val eimId: String = \"\",\n        @JvmField @ProtoNumber(3) val eimTelno: String = \"\",\n        @JvmField @ProtoNumber(4) val groupId: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FriendHelloInfo(\n        @JvmField @ProtoNumber(1) val sourceName: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FriendMiscInfo(\n        @JvmField @ProtoNumber(1) val fromuinNick: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FriendSysMsg(\n        @JvmField @ProtoNumber(11) val msgGroupExt: GroupInfoExt? = null,\n        @JvmField @ProtoNumber(12) val msgIntiteInfo: InviteInfo? = null,\n        @JvmField @ProtoNumber(13) val msgSchoolInfo: SchoolInfo? = null,\n        @JvmField @ProtoNumber(100) val doubtFlag: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupInfo(\n        @JvmField @ProtoNumber(1) val groupUin: Long = 0L,\n        @JvmField @ProtoNumber(2) val groupName: String = \"\",\n        @JvmField @ProtoNumber(3) val groupNick: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupInfoExt(\n        @JvmField @ProtoNumber(1) val notifyType: Int = 0,\n        @JvmField @ProtoNumber(2) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(3) val fromGroupadmlist: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class InviteInfo(\n        @JvmField @ProtoNumber(1) val recommendUin: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgEncodeFlag(\n        @JvmField @ProtoNumber(1) val isUtf8: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SchoolInfo(\n        @JvmField @ProtoNumber(1) val schoolId: String = \"\",\n        @JvmField @ProtoNumber(2) val schoolName: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TongXunLuNickInfo(\n        @JvmField @ProtoNumber(1) val fromuin: Long = 0L,\n        @JvmField @ProtoNumber(2) val touin: Long = 0L,\n        @JvmField @ProtoNumber(3) val tongxunluNickname: String = \"\",\n    ) : ProtoBuf\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/FriendListCommon.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"SpellCheckingInspection\")\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class Vec0xd50 : ProtoBuf {\n    @Serializable\n    internal class ExtSnsFrdData(\n        @ProtoNumber(1) @JvmField val frdUin: Long = 0L,\n        @ProtoNumber(91001) @JvmField val musicSwitch: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(101001) @JvmField val mutualmarkAlienation: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(141001) @JvmField val mutualmarkScore: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(151001) @JvmField val ksingSwitch: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(181001) @JvmField val lbsShare: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val msgUpdateData: List<ExtSnsFrdData> = emptyList(),\n        @ProtoNumber(11) @JvmField val over: Int = 0,\n        @ProtoNumber(12) @JvmField val nextStart: Int = 0,\n        @ProtoNumber(13) @JvmField val uint64UnfinishedUins: List<Long> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val appid: Long = 0L,\n        @ProtoNumber(2) @JvmField val maxPkgSize: Int = 0,\n        @ProtoNumber(3) @JvmField val startTime: Int = 0,\n        @ProtoNumber(4) @JvmField val startIndex: Int = 0,\n        @ProtoNumber(5) @JvmField val reqNum: Int = 0,\n        @ProtoNumber(6) @JvmField val uinList: List<Long> = emptyList(),\n        @ProtoNumber(91001) @JvmField val reqMusicSwitch: Int = 0,\n        @ProtoNumber(101001) @JvmField val reqMutualmarkAlienation: Int = 0,\n        @ProtoNumber(141001) @JvmField val reqMutualmarkScore: Int = 0,\n        @ProtoNumber(151001) @JvmField val reqKsingSwitch: Int = 0,\n        @ProtoNumber(181001) @JvmField val reqMutualmarkLbsshare: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class KSingRelationInfo(\n        @ProtoNumber(1) @JvmField val flag: Int = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Vec0xd6b : ProtoBuf {\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val maxPkgSize: Int = 0,\n        @ProtoNumber(2) @JvmField val startTime: Int = 0,\n        @ProtoNumber(11) @JvmField val uinList: List<Long> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(11) @JvmField val msgMutualmarkData: List<MutualMarkData> = emptyList(),\n        @ProtoNumber(12) @JvmField val uint64UnfinishedUins: List<Long> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MutualMarkData(\n        @ProtoNumber(1) @JvmField val frdUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val result: Int = 0\n        // @SerialId(11) @JvmField val mutualmarkInfo: List<Mutualmark.MutualMark> = emptyList()\n    ) : ProtoBuf\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/Group.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class GroupLabel : ProtoBuf {\n    @Serializable\n    internal class Label(\n        @ProtoNumber(1) @JvmField val name: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val enumType: Int /* enum */ = 1,\n        @ProtoNumber(3) @JvmField val textColor: Color? = null,\n        @ProtoNumber(4) @JvmField val edgingColor: Color? = null,\n        @ProtoNumber(5) @JvmField val labelAttr: Int = 0,\n        @ProtoNumber(6) @JvmField val labelType: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val error: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val groupInfo: List<GroupInfo> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SourceId(\n        @ProtoNumber(1) @JvmField val sourceId: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupInfo(\n        @ProtoNumber(1) @JvmField val int32Result: Int = 0,\n        @ProtoNumber(2) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(3) @JvmField val groupLabel: List<Label> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Color(\n        @ProtoNumber(1) @JvmField val r: Int = 0,\n        @ProtoNumber(2) @JvmField val g: Int = 0,\n        @ProtoNumber(3) @JvmField val b: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val sourceId: SourceId? = null,\n        @ProtoNumber(2) @JvmField val uinInfo: UinInfo? = null,\n        @ProtoNumber(3) @JvmField val numberLabel: Int = 5,\n        @ProtoNumber(4) @JvmField val groupCode: List<Long> = emptyList(),\n        @ProtoNumber(5) @JvmField val labelStyle: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class UinInfo(\n        @ProtoNumber(1) @JvmField val int64Longitude: Long = 0L,\n        @ProtoNumber(2) @JvmField val int64Latitude: Long = 0L,\n    ) : ProtoBuf\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/GroupFileCommon.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"SpellCheckingInspection\")\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\ninternal class GroupFileCommon : ProtoBuf {\n    @Serializable\n    internal class FeedsInfo(\n        @JvmField @ProtoNumber(1) val busId: Int = 0,\n        @JvmField @ProtoNumber(2) val fileId: String = \"\",\n        @JvmField @ProtoNumber(3) val msgRandom: Int = 0,\n        @JvmField @ProtoNumber(4) val ext: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(5) val feedFlag: Int = 0,\n        @JvmField @ProtoNumber(6) val msgCtrl: MsgCtrl.MsgCtrl? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FeedsResult(\n        @JvmField @ProtoNumber(1) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(2) val detail: String = \"\",\n        @JvmField @ProtoNumber(3) val fileId: String = \"\",\n        @JvmField @ProtoNumber(4) val busId: Int = 0,\n        @JvmField @ProtoNumber(5) val deadTime: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FileInfo(\n        @JvmField @ProtoNumber(1) val fileId: String = \"\",\n        @JvmField @ProtoNumber(2) val fileName: String = \"\",\n        @JvmField @ProtoNumber(3) val fileSize: Long = 0L,\n        @JvmField @ProtoNumber(4) val busId: Int = 0,\n        @JvmField @ProtoNumber(5) val uploadedSize: Long = 0L,\n        @JvmField @ProtoNumber(6) val uploadTime: Int = 0,\n        @JvmField @ProtoNumber(7) val deadTime: Int = 0,\n        @JvmField @ProtoNumber(8) val modifyTime: Int = 0,\n        @JvmField @ProtoNumber(9) val downloadTimes: Int = 0,\n        @JvmField @ProtoNumber(10) val sha: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(11) val sha3: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(12) val md5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(13) val localPath: String = \"\",\n        @JvmField @ProtoNumber(14) val uploaderName: String = \"\",\n        @JvmField @ProtoNumber(15) val uploaderUin: Long = 0L,\n        @JvmField @ProtoNumber(16) val parentFolderId: String = \"\",\n        @JvmField @ProtoNumber(17) val safeType: Int = 0,\n        @JvmField @ProtoNumber(20) val fileBlobExt: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(21) val ownerUin: Long = 0L,\n        @JvmField @ProtoNumber(22) val feedId: String = \"\",\n        @JvmField @ProtoNumber(23) val reservedField: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FileInfoTmem(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val files: List<FileInfo> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FileItem(\n        @JvmField @ProtoNumber(1) val type: Int = 0,\n        @JvmField @ProtoNumber(2) val folderInfo: FolderInfo? = null,\n        @JvmField @ProtoNumber(3) val fileInfo: FileInfo? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FolderInfo(\n        @JvmField @ProtoNumber(1) val folderId: String = \"\", // uuid\n        @JvmField @ProtoNumber(2) val parentFolderId: String = \"\",\n        @JvmField @ProtoNumber(3) val folderName: String = \"\",\n        @JvmField @ProtoNumber(4) val createTime: Int = 0,\n        @JvmField @ProtoNumber(5) val modifyTime: Int = 0,\n        @JvmField @ProtoNumber(6) val createUin: Long = 0L,\n        @JvmField @ProtoNumber(7) val creatorName: String = \"\",\n        @JvmField @ProtoNumber(8) val totalFileCount: Int = 0,\n        @JvmField @ProtoNumber(9) val modifyUin: Long = 0L,\n        @JvmField @ProtoNumber(10) val modifyName: String = \"\",\n        @JvmField @ProtoNumber(11) val usedSpace: Long = 0L\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FolderInfoTmem(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val folders: List<FolderInfo> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class OverwriteInfo(\n        @JvmField @ProtoNumber(1) val fileId: String = \"\",\n        @JvmField @ProtoNumber(2) val downloadTimes: Int = 0\n    ) : ProtoBuf\n}\n        "
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/Highway.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"SpellCheckingInspection\")\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoIntegerType\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport kotlinx.serialization.protobuf.ProtoType\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\n\n/**\n * v8.5.5\n */\n\n@Serializable\ninternal class BdhExtinfo : ProtoBuf {\n    @Serializable\n    internal class CommFileExtReq(\n        @JvmField @ProtoNumber(1) val actionType: Int = 0,\n        @JvmField @ProtoNumber(2) val uuid: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CommFileExtRsp(\n        @JvmField @ProtoNumber(1) val int32Retcode: Int = 0,\n        @JvmField @ProtoNumber(2) val downloadUrl: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PicInfo(\n        @JvmField @ProtoNumber(1) val idx: Int = 0,\n        @JvmField @ProtoNumber(2) val size: Int = 0,\n        @JvmField @ProtoNumber(3) val binMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(4) val type: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class QQVoiceExtReq(\n        @JvmField @ProtoNumber(1) val qid: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(2) val fmt: Int = 0,\n        @JvmField @ProtoNumber(3) val rate: Int = 0,\n        @JvmField @ProtoNumber(4) val bits: Int = 0,\n        @JvmField @ProtoNumber(5) val channel: Int = 0,\n        @JvmField @ProtoNumber(6) val pinyin: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class QQVoiceExtRsp(\n        @JvmField @ProtoNumber(1) val qid: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(2) val int32Retcode: Int = 0,\n        @JvmField @ProtoNumber(3) val msgResult: List<QQVoiceResult> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class QQVoiceResult(\n        @JvmField @ProtoNumber(1) val text: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(2) val pinyin: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(3) val source: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ShortVideoReqExtInfo(\n        @JvmField @ProtoNumber(1) val cmd: Int = 0,\n        @JvmField @ProtoNumber(2) val sessionId: Long = 0L,\n        @JvmField @ProtoNumber(3) val msgThumbinfo: PicInfo? = null,\n        @JvmField @ProtoNumber(4) val msgVideoinfo: VideoInfo? = null,\n        @JvmField @ProtoNumber(5) val msgShortvideoSureReq: ShortVideoSureReqInfo? = null,\n        @JvmField @ProtoNumber(6) val boolIsMergeCmdBeforeData: Boolean = false,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ShortVideoRspExtInfo(\n        @JvmField @ProtoNumber(1) val cmd: Int = 0,\n        @JvmField @ProtoNumber(2) val sessionId: Long = 0L,\n        @JvmField @ProtoNumber(3) val int32Retcode: Int = 0,\n        @JvmField @ProtoNumber(4) val errinfo: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(5) val msgThumbinfo: PicInfo? = null,\n        @JvmField @ProtoNumber(6) val msgVideoinfo: VideoInfo? = null,\n        @JvmField @ProtoNumber(7) val msgShortvideoSureRsp: ShortVideoSureRspInfo? = null,\n        @JvmField @ProtoNumber(8) val retryFlag: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ShortVideoSureReqInfo(\n        @JvmField @ProtoNumber(1) val fromuin: Long = 0L,\n        @JvmField @ProtoNumber(2) val chatType: Int = 0,\n        @JvmField @ProtoNumber(3) val touin: Long = 0L,\n        @JvmField @ProtoNumber(4) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(5) val clientType: Int = 0,\n        @JvmField @ProtoNumber(6) val msgThumbinfo: PicInfo? = null,\n        @JvmField @ProtoNumber(7) val msgMergeVideoinfo: List<VideoInfo> = emptyList(),\n        @JvmField @ProtoNumber(8) val msgDropVideoinfo: List<VideoInfo> = emptyList(),\n        @JvmField @ProtoNumber(9) val businessType: Int = 0,\n        @JvmField @ProtoNumber(10) val subBusinessType: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ShortVideoSureRspInfo(\n        @JvmField @ProtoNumber(1) val fileid: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(2) val ukey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(3) val msgVideoinfo: VideoInfo? = null,\n        @JvmField @ProtoNumber(4) val mergeCost: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class StoryVideoExtReq : ProtoBuf\n\n    @Serializable\n    internal class StoryVideoExtRsp(\n        @JvmField @ProtoNumber(1) val int32Retcode: Int = 0,\n        @JvmField @ProtoNumber(2) val msg: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(3) val cdnUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(4) val fileKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(5) val fileId: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class UploadPicExtInfo(\n        @JvmField @ProtoNumber(1) val fileResid: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(2) val downloadUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(3) val thumbDownloadUrl: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class VideoInfo(\n        @JvmField @ProtoNumber(1) val idx: Int = 0,\n        @JvmField @ProtoNumber(2) val size: Int = 0,\n        @JvmField @ProtoNumber(3) val binMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(4) val format: Int = 0,\n        @JvmField @ProtoNumber(5) val resLen: Int = 0,\n        @JvmField @ProtoNumber(6) val resWidth: Int = 0,\n        @JvmField @ProtoNumber(7) val time: Int = 0,\n        @JvmField @ProtoNumber(8) val starttime: Long = 0L,\n        @JvmField @ProtoNumber(9) val isAudio: Int = 0,\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class CSDataHighwayHead : ProtoBuf {\n    @Serializable\n    internal class C2CCommonExtendinfo(\n        @JvmField @ProtoNumber(1) val infoId: Int = 0,\n        @JvmField @ProtoNumber(2) val msgFilterExtendinfo: FilterExtendinfo? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DataHighwayHead(\n        @JvmField @ProtoNumber(1) val version: Int = 0,\n        @JvmField @ProtoNumber(2) val uin: String = \"\",\n        @JvmField @ProtoNumber(3) val command: String = \"\",\n        @JvmField @ProtoNumber(4) val seq: Int = 0,\n        @JvmField @ProtoNumber(5) val retryTimes: Int? = null, // = 0,\n        @JvmField @ProtoNumber(6) val appid: Int? = null, // = 0,\n        @JvmField @ProtoNumber(7) val dataflag: Int? = null, // = 0,\n        @JvmField @ProtoNumber(8) val commandId: Int? = null, // = 0,\n        @JvmField @ProtoNumber(9) val buildVer: String = \"\",\n        @JvmField @ProtoNumber(10) val localeId: Int = 0,\n        @JvmField @ProtoNumber(11) val envId: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DataHole(\n        @JvmField @ProtoNumber(1) val begin: Long = 0L,\n        @JvmField @ProtoNumber(2) val end: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FilterExtendinfo(\n        @JvmField @ProtoNumber(1) val filterFlag: Int = 0,\n        @JvmField @ProtoNumber(2) val msgImageFilterRequest: ImageFilterRequest? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FilterStyle(\n        @JvmField @ProtoNumber(1) val styleId: Int = 0,\n        @JvmField @ProtoNumber(2) val styleName: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ImageFilterRequest(\n        @JvmField @ProtoNumber(1) val sessionId: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(2) val clientIp: Int = 0,\n        @JvmField @ProtoNumber(3) val uin: Long = 0L,\n        @JvmField @ProtoNumber(4) val style: FilterStyle? = null,\n        @JvmField @ProtoNumber(5) val width: Int = 0,\n        @JvmField @ProtoNumber(6) val height: Int = 0,\n        @JvmField @ProtoNumber(7) val imageData: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ImageFilterResponse(\n        @JvmField @ProtoNumber(1) val retCode: Int = 0,\n        @JvmField @ProtoNumber(2) val imageData: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(3) val costTime: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class LoginSigHead(\n        @JvmField @ProtoNumber(1) val loginsigType: Int = 0,\n        @JvmField @ProtoNumber(2) val loginsig: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NewServiceTicket(\n        @JvmField @ProtoNumber(1) val signature: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(2) val ukey: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PicInfoExt(\n        @JvmField @ProtoNumber(1) val picWidth: Int = 0,\n        @JvmField @ProtoNumber(2) val picHeight: Int = 0,\n        @JvmField @ProtoNumber(3) val picFlag: Int = 0,\n        @JvmField @ProtoNumber(4) val busiType: Int = 0,\n        @JvmField @ProtoNumber(5) val srcTerm: Int = 0,\n        @JvmField @ProtoNumber(6) val platType: Int = 0,\n        @JvmField @ProtoNumber(7) val netType: Int = 0,\n        @JvmField @ProtoNumber(8) val imgType: Int = 0,\n        @JvmField @ProtoNumber(9) val appPicType: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PicRspExtInfo(\n        @JvmField @ProtoNumber(1) val skey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(2) val clientIp: Int = 0,\n        @JvmField @ProtoNumber(3) val upOffset: Long = 0L,\n        @JvmField @ProtoNumber(4) val blockSize: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class QueryHoleRsp(\n        @JvmField @ProtoNumber(1) val result: Int = 0,\n        @JvmField @ProtoNumber(2) val dataHole: List<DataHole> = emptyList(),\n        @JvmField @ProtoNumber(3) val boolCompFlag: Boolean = false,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqDataHighwayHead(\n        @JvmField @ProtoNumber(1) val msgBasehead: DataHighwayHead? = null,\n        @JvmField @ProtoNumber(2) val msgSeghead: SegHead? = null,\n        @JvmField @ProtoNumber(3) val reqExtendinfo: ByteArray? = null, // = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(4) val timestamp: Long = 0L,\n        @JvmField @ProtoNumber(5) val msgLoginSigHead: LoginSigHead? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @JvmField @ProtoNumber(1) val msgQueryHoleRsp: QueryHoleRsp? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspDataHighwayHead(\n        @JvmField @ProtoNumber(1) val msgBasehead: DataHighwayHead? = null,\n        @JvmField @ProtoNumber(2) val msgSeghead: SegHead? = null,\n        @JvmField @ProtoNumber(3) val errorCode: Int = 0,\n        @JvmField @ProtoNumber(4) val allowRetry: Int = 0,\n        @JvmField @ProtoNumber(5) val cachecost: Int = 0,\n        @JvmField @ProtoNumber(6) val htcost: Int = 0,\n        @JvmField @ProtoNumber(7) val rspExtendinfo: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(8) val timestamp: Long = 0L,\n        @JvmField @ProtoNumber(9) val range: Long = 0L,\n        @JvmField @ProtoNumber(10) val isReset: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SegHead(\n        @JvmField @ProtoNumber(1) val serviceid: Int = 0,\n        @JvmField @ProtoNumber(2) val filesize: Long = 0L,\n        @JvmField @ProtoNumber(3) val dataoffset: Long = 0L,\n        @JvmField @ProtoNumber(4) val datalength: Int = 0,\n        @JvmField @ProtoNumber(5) val rtcode: Int? = null, // = 0,\n        @JvmField @ProtoNumber(6) val serviceticket: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(7) val flag: Int? = null, // = 0,\n        @JvmField @ProtoNumber(8) val md5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(9) val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(10) val cacheAddr: Int = 0,\n        @JvmField @ProtoNumber(11) val queryTimes: Int = 0,\n        @JvmField @ProtoNumber(12) val updateCacheip: Int = 0,\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class HwConfigPersistentPB : ProtoBuf {\n    @Serializable\n    internal class HwConfigItemPB(\n        @JvmField @ProtoNumber(1) val key: String = \"\",\n        @JvmField @ProtoNumber(2) val endPointList: List<HwEndPointPB> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class HwConfigPB(\n        @JvmField @ProtoNumber(1) val configItemList: List<HwConfigItemPB> = emptyList(),\n        @JvmField @ProtoNumber(2) val netSegConfList: List<HwNetSegConfPB> = emptyList(),\n        @JvmField @ProtoNumber(3) val shortVideoNetConf: List<HwNetSegConfPB> = emptyList(),\n        @JvmField @ProtoNumber(4) val configItemListIp6: List<HwConfigItemPB> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class HwEndPointPB(\n        @JvmField @ProtoNumber(1) val host: String = \"\",\n        @JvmField @ProtoNumber(2) val int32Port: Int = 0,\n        @JvmField @ProtoNumber(3) val int64Timestampe: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class HwNetSegConfPB(\n        @JvmField @ProtoNumber(1) val int64NetType: Long = 0L,\n        @JvmField @ProtoNumber(2) val int64SegSize: Long = 0L,\n        @JvmField @ProtoNumber(3) val int64SegNum: Long = 0L,\n        @JvmField @ProtoNumber(4) val int64CurConnNum: Long = 0L,\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class HwSessionInfoPersistentPB : ProtoBuf {\n    @Serializable\n    internal class HwSessionInfoPB(\n        @JvmField @ProtoNumber(1) val httpconnSigSession: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(2) val sessionKey: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Subcmd0x501 : ProtoBuf {\n    @Serializable\n    internal class ReqBody(\n        @JvmField @ProtoNumber(1281) val msgSubcmd0x501ReqBody: SubCmd0x501ReqBody? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @JvmField @ProtoNumber(1281) val msgSubcmd0x501RspBody: SubCmd0x501Rspbody? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SubCmd0x501ReqBody(\n        @JvmField @ProtoNumber(1) val uin: Long = 0L,\n        @JvmField @ProtoNumber(2) val idcId: Int = 0,\n        @JvmField @ProtoNumber(3) val appid: Int = 0,\n        @JvmField @ProtoNumber(4) val loginSigType: Int = 0,\n        @JvmField @ProtoNumber(5) val loginSigTicket: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(6) val requestFlag: Int = 0,\n        @JvmField @ProtoNumber(7) val uint32ServiceTypes: List<Int> = emptyList(),\n        @JvmField @ProtoNumber(8) val bid: Int = 0,\n        @JvmField @ProtoNumber(9) val term: Int = 0,\n        @JvmField @ProtoNumber(10) val plat: Int = 0,\n        @JvmField @ProtoNumber(11) val net: Int = 0,\n        @JvmField @ProtoNumber(12) val caller: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SubCmd0x501Rspbody(\n        @JvmField @ProtoNumber(1) val httpconnSigSession: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(2) val sessionKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(3) val msgHttpconnAddrs: List<SrvAddrs> = emptyList(),\n        @JvmField @ProtoNumber(4) val preConnection: Int = 0,\n        @JvmField @ProtoNumber(5) val csConn: Int = 0,\n        @JvmField @ProtoNumber(6) val msgIpLearnConf: IpLearnConf? = null,\n        @JvmField @ProtoNumber(7) val msgDynTimeoutConf: DynTimeOutConf? = null,\n        @JvmField @ProtoNumber(8) val msgOpenUpConf: OpenUpConf? = null,\n        @JvmField @ProtoNumber(9) val msgDownloadEncryptConf: DownloadEncryptConf? = null,\n        @JvmField @ProtoNumber(10) val msgShortVideoConf: ShortVideoConf? = null,\n        @JvmField @ProtoNumber(11) val msgPtvConf: PTVConf? = null,\n        @JvmField @ProtoNumber(12) val shareType: Int = 0,\n        @JvmField @ProtoNumber(13) val shareChannel: Int = 0,\n        @JvmField @ProtoNumber(14) val fmtPolicy: Int = 0,\n        @JvmField @ProtoNumber(15) val bigdataPolicy: Int = 0,\n        @JvmField @ProtoNumber(16) val connAttemptDelay: Int = 0,\n    ) : ProtoBuf {\n        @Serializable\n        internal class DownloadEncryptConf(\n            @JvmField @ProtoNumber(1) val boolEnableEncryptRequest: Boolean = false,\n            @JvmField @ProtoNumber(2) val boolEnableEncryptedPic: Boolean = false,\n            @JvmField @ProtoNumber(3) val ctrlFlag: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class DynTimeOutConf(\n            @JvmField @ProtoNumber(1) val tbase2g: Int = 0,\n            @JvmField @ProtoNumber(2) val tbase3g: Int = 0,\n            @JvmField @ProtoNumber(3) val tbase4g: Int = 0,\n            @JvmField @ProtoNumber(4) val tbaseWifi: Int = 0,\n            @JvmField @ProtoNumber(5) val torg2g: Int = 0,\n            @JvmField @ProtoNumber(6) val torg3g: Int = 0,\n            @JvmField @ProtoNumber(7) val torg4g: Int = 0,\n            @JvmField @ProtoNumber(8) val torgWifi: Int = 0,\n            @JvmField @ProtoNumber(9) val maxTimeout: Int = 0,\n            @JvmField @ProtoNumber(10) val enableDynTimeout: Int = 0,\n            @JvmField @ProtoNumber(11) val maxTimeout2g: Int = 0,\n            @JvmField @ProtoNumber(12) val maxTimeout3g: Int = 0,\n            @JvmField @ProtoNumber(13) val maxTimeout4g: Int = 0,\n            @JvmField @ProtoNumber(14) val maxTimeoutWifi: Int = 0,\n            @JvmField @ProtoNumber(15) val hbTimeout2g: Int = 0,\n            @JvmField @ProtoNumber(16) val hbTimeout3g: Int = 0,\n            @JvmField @ProtoNumber(17) val hbTimeout4g: Int = 0,\n            @JvmField @ProtoNumber(18) val hbTimeoutWifi: Int = 0,\n            @JvmField @ProtoNumber(19) val hbTimeoutDefault: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class Ip6Addr(\n            @JvmField @ProtoNumber(1) val type: Int = 0,\n            @JvmField @ProtoNumber(2) val ip6: ByteArray = EMPTY_BYTE_ARRAY,\n            @JvmField @ProtoNumber(3) val port: Int = 0,\n            @JvmField @ProtoNumber(4) val area: Int = 0,\n            @JvmField @ProtoNumber(5) val sameIsp: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class IpAddr(\n            @JvmField @ProtoNumber(1) val type: Int = 0,\n            @ProtoType(ProtoIntegerType.FIXED) @JvmField @ProtoNumber(2) val ip: Int = 0,\n            @JvmField @ProtoNumber(3) val port: Int = 0,\n            @JvmField @ProtoNumber(4) val area: Int = 0,\n            @JvmField @ProtoNumber(5) val sameIsp: Int = 0,\n        ) : ProtoBuf {\n            fun decode(): Pair<Int, Int> = ip to port\n        }\n\n        @Serializable\n        internal class IpLearnConf(\n            @JvmField @ProtoNumber(1) val refreshCachedIp: Int = 0,\n            @JvmField @ProtoNumber(2) val enableIpLearn: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class NetSegConf(\n            @JvmField @ProtoNumber(1) val netType: Int = 0,\n            @JvmField @ProtoNumber(2) val segsize: Int = 0,\n            @JvmField @ProtoNumber(3) val segnum: Int = 0,\n            @JvmField @ProtoNumber(4) val curconnnum: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class OpenUpConf(\n            @JvmField @ProtoNumber(1) val boolEnableOpenup: Boolean = false,\n            @JvmField @ProtoNumber(2) val preSendSegnum: Int = 0,\n            @JvmField @ProtoNumber(3) val preSendSegnum3g: Int = 0,\n            @JvmField @ProtoNumber(4) val preSendSegnum4g: Int = 0,\n            @JvmField @ProtoNumber(5) val preSendSegnumWifi: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class PTVConf(\n            @JvmField @ProtoNumber(1) val channelType: Int = 0,\n            @JvmField @ProtoNumber(2) val msgNetsegconf: List<NetSegConf> = emptyList(),\n            @JvmField @ProtoNumber(3) val boolOpenHardwareCodec: Boolean = false,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ShortVideoConf(\n            @JvmField @ProtoNumber(1) val channelType: Int = 0,\n            @JvmField @ProtoNumber(2) val msgNetsegconf: List<NetSegConf> = emptyList(),\n            @JvmField @ProtoNumber(3) val boolOpenHardwareCodec: Boolean = false,\n            @JvmField @ProtoNumber(4) val boolSendAheadSignal: Boolean = false,\n        ) : ProtoBuf\n\n        @Serializable\n        internal data class SrvAddrs(\n            @JvmField @ProtoNumber(1) val serviceType: Int = 0,\n            @JvmField @ProtoNumber(2) val msgAddrs: List<IpAddr> = emptyList(),\n            @JvmField @ProtoNumber(3) val fragmentSize: Int = 0,\n            @JvmField @ProtoNumber(4) val msgNetsegconf: List<NetSegConf> = emptyList(),\n            @JvmField @ProtoNumber(5) val msgAddrsV6: List<Ip6Addr> = emptyList(),\n        ) : ProtoBuf\n    }\n}\n        "
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/HummerCommelem.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\ninternal class HummerCommelem : ProtoBuf {\n    @Serializable\n    internal class MsgElemInfoServtype1(\n        @ProtoNumber(1) @JvmField val rewardId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val senderUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val picType: Int = 0,\n        @ProtoNumber(4) @JvmField val rewardMoney: Int = 0,\n        @ProtoNumber(5) @JvmField val url: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val content: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val createTimestamp: Int = 0,\n        @ProtoNumber(8) @JvmField val status: Int = 0,\n        @ProtoNumber(9) @JvmField val size: Int = 0,\n        @ProtoNumber(10) @JvmField val videoDuration: Int = 0,\n        @ProtoNumber(11) @JvmField val seq: Long = 0L,\n        @ProtoNumber(12) @JvmField val rewardTypeExt: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgElemInfoServtype11(\n        @ProtoNumber(1) @JvmField val resID: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val resMD5: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val reserveInfo1: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val reserveInfo2: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val doodleDataOffset: Int = 0,\n        @ProtoNumber(6) @JvmField val doodleGifId: Int = 0,\n        @ProtoNumber(7) @JvmField val doodleUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val doodleMd5: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgElemInfoServtype13(\n        @ProtoNumber(1) @JvmField val sysHeadId: Int = 0,\n        @ProtoNumber(2) @JvmField val headFlag: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgElemInfoServtype14(\n        @ProtoNumber(1) @JvmField val id: Int = 0,\n        @ProtoNumber(2) @JvmField val reserveInfo: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgElemInfoServtype15(\n        @ProtoNumber(1) @JvmField val vid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val cover: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val title: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val summary: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val createTime: Long = 0L,\n        @ProtoNumber(6) @JvmField val commentContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val author: Long = 0L,\n        @ProtoNumber(8) @JvmField val ctrVersion: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgElemInfoServtype16(\n        @ProtoNumber(1) @JvmField val uid: Long = 0L,\n        @ProtoNumber(2) @JvmField val unionID: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val storyID: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val md5: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val thumbUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val doodleUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val videoWidth: Int = 0,\n        @ProtoNumber(8) @JvmField val videoHeight: Int = 0,\n        @ProtoNumber(9) @JvmField val sourceName: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(10) @JvmField val sourceActionType: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(11) @JvmField val sourceActionData: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(12) @JvmField val ctrVersion: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgElemInfoServtype18(\n        @ProtoNumber(1) @JvmField val currentAmount: Long = 0L,\n        @ProtoNumber(2) @JvmField val totalAmount: Long = 0L,\n        @ProtoNumber(3) @JvmField val listid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val authKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val number: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgElemInfoServtype19(\n        @ProtoNumber(1) @JvmField val data: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgElemInfoServtype2(\n        @ProtoNumber(1) @JvmField val pokeType: Int = 0,\n        @ProtoNumber(2) @JvmField val pokeSummary: String = \"\",\n        @ProtoNumber(3) @JvmField val doubleHit: Int = 0,\n        @ProtoNumber(4) @JvmField val vaspokeId: Int = 0,\n        @ProtoNumber(5) @JvmField val vaspokeName: String = \"\",\n        @ProtoNumber(6) @JvmField val vaspokeMinver: String = \"\",\n        @ProtoNumber(7) @JvmField val pokeStrength: Int = 0,\n        @ProtoNumber(8) @JvmField val msgType: Int = 0,\n        @ProtoNumber(9) @JvmField val faceBubbleCount: Int = 0,\n        @ProtoNumber(10) @JvmField val pokeFlag: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgElemInfoServtype20(\n        @ProtoNumber(1) @JvmField val data: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgElemInfoServtype21(\n        @ProtoNumber(1) @JvmField val topicId: Int = 0,\n        @ProtoNumber(2) @JvmField val confessorUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val confessorNick: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val confessorSex: Int = 0,\n        @ProtoNumber(5) @JvmField val sysmsgFlag: Int = 0,\n        @ProtoNumber(6) @JvmField val c2cConfessCtx: C2CConfessContext? = null,\n        @ProtoNumber(7) @JvmField val topic: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val confessTime: Long = 0L,\n        @ProtoNumber(9) @JvmField val groupConfessMsg: GroupConfessMsg? = null,\n        @ProtoNumber(10) @JvmField val groupConfessCtx: GroupConfessContext? = null\n    ) : ProtoBuf {\n        @Serializable\n        internal class C2CConfessContext(\n            @ProtoNumber(1) @JvmField val confessorUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val confessToUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val sendUin: Long = 0L,\n            @ProtoNumber(4) @JvmField val confessorNick: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val confess: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val bgType: Int = 0,\n            @ProtoNumber(7) @JvmField val topicId: Int = 0,\n            @ProtoNumber(8) @JvmField val confessTime: Long = 0L,\n            @ProtoNumber(9) @JvmField val confessorSex: Int = 0,\n            @ProtoNumber(10) @JvmField val bizType: Int = 0,\n            @ProtoNumber(11) @JvmField val confessNum: Int = 0,\n            @ProtoNumber(12) @JvmField val confessToSex: Int = 0\n        ) : ProtoBuf\n\n        @Serializable\n        internal class GroupConfessContext(\n            @ProtoNumber(1) @JvmField val confessorUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val confessToUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val sendUin: Long = 0L,\n            @ProtoNumber(4) @JvmField val confessorSex: Int = 0,\n            @ProtoNumber(5) @JvmField val confessToNick: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val topic: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(7) @JvmField val topicId: Int = 0,\n            @ProtoNumber(8) @JvmField val confessTime: Long = 0L,\n            @ProtoNumber(9) @JvmField val confessToNickType: Int = 0,\n            @ProtoNumber(10) @JvmField val confessorNick: ByteArray = EMPTY_BYTE_ARRAY\n        ) : ProtoBuf\n\n        @Serializable\n        internal class GroupConfessItem(\n            @ProtoNumber(1) @JvmField val topicId: Int = 0,\n            @ProtoNumber(2) @JvmField val confessToUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val confessToNick: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val topic: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val confessToNickType: Int = 0\n        ) : ProtoBuf\n\n        @Serializable\n        internal class GroupConfessMsg(\n            @ProtoNumber(1) @JvmField val confessTime: Long = 0L,\n            @ProtoNumber(2) @JvmField val confessorUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val confessorSex: Int = 0,\n            @ProtoNumber(4) @JvmField val sysmsgFlag: Int = 0,\n            @ProtoNumber(5) @JvmField val confessItems: List<GroupConfessItem> = emptyList(),\n            @ProtoNumber(6) @JvmField val totalTopicCount: Int = 0\n        ) : ProtoBuf\n    }\n\n    @Serializable\n    internal class MsgElemInfoServtype23(\n        @ProtoNumber(1) @JvmField val faceType: Int = 0,\n        @ProtoNumber(2) @JvmField val faceBubbleCount: Int = 0,\n        @ProtoNumber(3) @JvmField val faceSummary: String = \"\",\n        @ProtoNumber(4) @JvmField val flag: Int = 0,\n        @ProtoNumber(5) @JvmField val others: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgElemInfoServtype24(\n        @ProtoNumber(1) @JvmField val limitChatEnter: LimitChatEnter? = null,\n        @ProtoNumber(2) @JvmField val limitChatExit: LimitChatExit? = null\n    ) : ProtoBuf {\n        @Serializable\n        internal class LimitChatEnter(\n            @ProtoNumber(1) @JvmField val tipsWording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val leftChatTime: Int = 0,\n            @ProtoNumber(3) @JvmField val matchTs: Long = 0L,\n            @ProtoNumber(4) @JvmField val matchExpiredTime: Int = 0,\n            @ProtoNumber(5) @JvmField val c2cExpiredTime: Int = 0,\n            @ProtoNumber(6) @JvmField val readyTs: Long = 0L,\n            @ProtoNumber(7) @JvmField val matchNick: ByteArray = EMPTY_BYTE_ARRAY\n        ) : ProtoBuf\n\n        @Serializable\n        internal class LimitChatExit(\n            @ProtoNumber(1) @JvmField val exitMethod: Int = 0,\n            @ProtoNumber(2) @JvmField val matchTs: Long = 0L\n        ) : ProtoBuf\n    }\n\n    @Serializable\n    internal class MsgElemInfoServtype27(\n        @ProtoNumber(1) @JvmField val videoFile: ImMsgBody.VideoFile? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgElemInfoServtype29(\n        @ProtoNumber(1) @JvmField val luckybagMsg: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgElemInfoServtype3(\n        @ProtoNumber(1) @JvmField val flashTroopPic: ImMsgBody.CustomFace? = null,\n        @ProtoNumber(2) @JvmField val flashC2cPic: ImMsgBody.NotOnlineImage? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgElemInfoServtype31(\n        @ProtoNumber(1) @JvmField val text: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val ext: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgElemInfoServtype33(\n        @ProtoNumber(1) @JvmField val index: Int = 0,\n        @ProtoNumber(2) @JvmField val name: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val compat: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val buf: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgElemInfoServtype37(\n        @ProtoNumber(1) @JvmField val packId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val stickerId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val qsId: Int = 0,\n        @ProtoNumber(4) @JvmField val sourceType: Int = 0,\n        @ProtoNumber(5) @JvmField val stickerType: Int = 0,\n        @ProtoNumber(6) @JvmField val resultId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val text: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val surpriseId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(9) @JvmField val randomType: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgElemInfoServtype4(\n        @ProtoNumber(1) @JvmField val imsgType: Int = 0,\n        @ProtoNumber(4) @JvmField val stStoryAioObjMsg: StoryAioObjMsg? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgElemInfoServtype5(\n        @ProtoNumber(1) @JvmField val vid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val cover: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val title: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val summary: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val createTime: Long = 0L,\n        @ProtoNumber(6) @JvmField val commentContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val author: Long = 0L\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgElemInfoServtype8(\n        @ProtoNumber(1) @JvmField val wifiDeliverGiftMsg: ImMsgBody.DeliverGiftMsg? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgElemInfoServtype9(\n        @ProtoNumber(1) @JvmField val anchorStatus: Int = 0,\n        @ProtoNumber(2) @JvmField val jumpSchema: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val anchorNickname: String = \"\",\n        @ProtoNumber(4) @JvmField val anchorHeadUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val liveTitle: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class StoryAioObjMsg(\n        @ProtoNumber(1) @JvmField val uiUrl: String = \"\",\n        @ProtoNumber(2) @JvmField val jmpUrl: String = \"\"\n    ) : ProtoBuf\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/HummerResv12.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"SpellCheckingInspection\")\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class MarketFaceExtPb : ProtoBuf {\n    @Serializable\n    internal class ResvAttr(\n        @JvmField @ProtoNumber(1) val supportSize: List<SupportSize> = emptyList(),\n        @JvmField @ProtoNumber(2) val sourceType: Int = 0,\n        @JvmField @ProtoNumber(3) val sourceName: String = \"\",\n        @JvmField @ProtoNumber(4) val sourceJumpUrl: String = \"\",\n        @JvmField @ProtoNumber(5) val sourceTypeName: String = \"\",\n        @JvmField @ProtoNumber(6) val startTime: Int = 0,\n        @JvmField @ProtoNumber(7) val endTime: Int = 0,\n        @JvmField @ProtoNumber(8) val emojiType: Int = 0,\n        @JvmField @ProtoNumber(9) val apngSupportSize: List<SupportSize> = emptyList(),\n        @JvmField @ProtoNumber(10) val hasIpProduct: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SupportSize(\n        @JvmField @ProtoNumber(1) val width: Int = 0,\n        @JvmField @ProtoNumber(2) val height: Int = 0,\n    ) : ProtoBuf\n}\n        "
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/HummerResv21.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"SpellCheckingInspection\")\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\ninternal class HummerResv21 : ProtoBuf {\n    @Serializable\n    internal class FileImgInfo(\n        @JvmField @ProtoNumber(1) val fileWidth: Int = 0,\n        @JvmField @ProtoNumber(2) val fileHeight: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ForwardExtFileInfo(\n        @JvmField @ProtoNumber(1) val fileType: Int = 0,\n        @JvmField @ProtoNumber(2) val senderUin: Long = 0L,\n        @JvmField @ProtoNumber(3) val receiverUin: Long = 0L,\n        @JvmField @ProtoNumber(4) val fileUuid: String = \"\",\n        @JvmField @ProtoNumber(5) val fileName: String = \"\",\n        @JvmField @ProtoNumber(6) val fileSize: Long = 0L,\n        @JvmField @ProtoNumber(7) val fileSha1: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(8) val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(9) val int64DeadTime: Long = 0L,\n        @JvmField @ProtoNumber(10) val imgWidth: Int = 0,\n        @JvmField @ProtoNumber(11) val imgHeight: Int = 0,\n        @JvmField @ProtoNumber(12) val videoDuration: Long = 0L,\n        @JvmField @ProtoNumber(13) val busId: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ResvAttr(\n        @JvmField @ProtoNumber(1) val fileImageInfo: FileImgInfo? = null,\n        @JvmField @ProtoNumber(2) val forwardExtFileInfo: ForwardExtFileInfo? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class XtfSenderInfo(\n        @JvmField @ProtoNumber(1) val lanIp: Int = 0,\n        @JvmField @ProtoNumber(2) val lanPort: Int = 0,\n        @JvmField @ProtoNumber(3) val lanSrkey: Long = 0L,\n    ) : ProtoBuf\n}\n        "
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/HummerResv3.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"SpellCheckingInspection\")\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\n/**\n * v8.5.5\n */\n@Serializable\ninternal class CustomFaceExtPb : ProtoBuf {\n    @Serializable\n    internal class AnimationImageShow(\n        @JvmField @ProtoNumber(1) val int32EffectId: Int = 0,\n        @JvmField @ProtoNumber(2) val animationParam: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ResvAttr(\n        @ProtoNumber(1) override val imageBizType: Int = 0,\n        @JvmField @ProtoNumber(2) val customfaceType: Int = 0,\n        @JvmField @ProtoNumber(3) val emojiPackageid: Int = 0,\n        @JvmField @ProtoNumber(4) val emojiId: Int = 0,\n        @JvmField @ProtoNumber(5) val text: String = \"\",\n        @JvmField @ProtoNumber(6) val doutuSuppliers: String = \"\",\n        @JvmField @ProtoNumber(7) val msgImageShow: AnimationImageShow? = null,\n        @ProtoNumber(9) override val textSummary: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(10) val emojiFrom: Int = 0,\n        @JvmField @ProtoNumber(11) val emojiSource: String = \"\",\n        @JvmField @ProtoNumber(12) val emojiWebUrl: String = \"\",\n        @JvmField @ProtoNumber(13) val emojiIconUrl: String = \"\",\n        @JvmField @ProtoNumber(14) val emojiMarketFaceName: String = \"\",\n        @JvmField @ProtoNumber(15) val source: Int = 0,\n        @JvmField @ProtoNumber(16) val cameraCaptureTemplateinfo: String = \"\",\n        @JvmField @ProtoNumber(17) val cameraCaptureMaterialname: String = \"\",\n        @JvmField @ProtoNumber(18) val adEmoJumpUrl: String = \"\",\n        @JvmField @ProtoNumber(19) val adEmoDescStr: String = \"\",\n    ) : ProtoBuf, ImgExtPbResvAttrCommon\n}\n        "
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/HummerResv6.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n@file:Suppress(\"unused\", \"SpellCheckingInspection\")\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class NotOnlineImageExtPb : ProtoBuf {\n    @Serializable\n    internal class ResvAttr(\n        @ProtoNumber(1) override val imageBizType: Int = 0,\n        @JvmField @ProtoNumber(2) val customfaceType: Int = 0,\n        @JvmField @ProtoNumber(3) val emojiPackageid: Int = 0,\n        @JvmField @ProtoNumber(4) val emojiId: Int = 0,\n        @JvmField @ProtoNumber(5) val text: String = \"\",\n        @JvmField @ProtoNumber(6) val doutuSuppliers: String = \"\",\n        @ProtoNumber(8) override val textSummary: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(10) val emojiFrom: Int = 0,\n        @JvmField @ProtoNumber(11) val emojiSource: String = \"\",\n        @JvmField @ProtoNumber(12) val emojiWebUrl: String = \"\",\n        @JvmField @ProtoNumber(13) val emojiIconUrl: String = \"\",\n        @JvmField @ProtoNumber(14) val emojiMarketFaceName: String = \"\",\n        @JvmField @ProtoNumber(15) val source: Int = 0\n    ) : ProtoBuf, ImgExtPbResvAttrCommon\n}\n        "
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/ImageRequest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.currentTimeSeconds\nimport kotlin.jvm.JvmField\n\ninternal interface ImgReq : ProtoBuf\n\n// cmd0x352$ReqBody\n\n@Serializable\ninternal class GetImgUrlReq(\n    @ProtoNumber(1) @JvmField val srcUni: Int,\n    @ProtoNumber(2) @JvmField val dstUni: Int,\n    @ProtoNumber(3) @JvmField val fileResID: String, //UUID\n    /**\n     * UUID例子: 没有找到\n     */\n    @ProtoNumber(4) @JvmField val urlFlag: Int = 1,\n    //5 unknown, 好像没用\n    @ProtoNumber(6) @JvmField val urlType: Int = 4,\n    @ProtoNumber(7) @JvmField val requestTerm: Int = 5, //确定\n    @ProtoNumber(8) @JvmField val requestPlatformType: Int = 9, //确定\n    @ProtoNumber(9) @JvmField val srcFileType: Int = 1, //2=ftn，1=picplatform，255\n    @ProtoNumber(10) @JvmField val innerIP: Int = 0, //确定\n    @ProtoNumber(11) @JvmField val addressBook: Int = 0, //[ChatType.internalID]== 1006为1[为CONTACT时] 我觉得发0没问题\n    @ProtoNumber(12) @JvmField val buType: Int = 1, //确定\n    @ProtoNumber(13) @JvmField val buildVer: String = \"8.2.7.4410\", //版本号\n    @ProtoNumber(14) @JvmField val timestamp: Int = currentTimeSeconds().toInt(), //(pic_up_timestamp)\n    @ProtoNumber(15) @JvmField val requestTransferType: Int = 1,\n) : ImgReq"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/ImgExtPbResvAttrCommon.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\n\ninternal interface ImgExtPbResvAttrCommon: ProtoBuf {\n    val textSummary: ByteArray\n    val imageBizType: Int\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/LongMsg.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\ninternal class LongMsg : ProtoBuf {\n    @Serializable\n    internal class MsgDeleteReq(\n        @ProtoNumber(1) @JvmField val msgResid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val msgType: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgDeleteRsp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val msgResid: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgDownReq(\n        @ProtoNumber(1) @JvmField val srcUin: Int = 0,\n        @ProtoNumber(2) @JvmField val msgResid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val msgType: Int = 0,\n        @ProtoNumber(4) @JvmField val needCache: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgDownRsp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val msgResid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val msgContent: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgUpReq(\n        @ProtoNumber(1) @JvmField val msgType: Int = 0,\n        @ProtoNumber(2) @JvmField val dstUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val msgId: Int = 0,\n        @ProtoNumber(4) @JvmField val msgContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val storeType: Int = 0,\n        @ProtoNumber(6) @JvmField val msgUkey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val needCache: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgUpRsp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val msgId: Int = 0,\n        @ProtoNumber(3) @JvmField val msgResid: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val subcmd: Int = 0,\n        @ProtoNumber(2) @JvmField val termType: Int = 0,\n        @ProtoNumber(3) @JvmField val platformType: Int = 0,\n        @ProtoNumber(4) @JvmField val msgUpReq: List<LongMsg.MsgUpReq> = emptyList(),\n        @ProtoNumber(5) @JvmField val msgDownReq: List<LongMsg.MsgDownReq> = emptyList(),\n        @ProtoNumber(6) @JvmField val msgDelReq: List<LongMsg.MsgDeleteReq> = emptyList(),\n        @ProtoNumber(10) @JvmField val agentType: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val subcmd: Int = 0,\n        @ProtoNumber(2) @JvmField val msgUpRsp: List<LongMsg.MsgUpRsp> = emptyList(),\n        @ProtoNumber(3) @JvmField val msgDownRsp: List<LongMsg.MsgDownRsp> = emptyList(),\n        @ProtoNumber(4) @JvmField val msgDelRsp: List<LongMsg.MsgDeleteRsp> = emptyList(),\n    ) : ProtoBuf\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/Msg.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoIntegerType\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport kotlinx.serialization.protobuf.ProtoType\nimport net.mamoe.mirai.internal.utils.io.NestedStructure\nimport net.mamoe.mirai.internal.utils.io.NestedStructureDesensitizer\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport net.mamoe.mirai.utils.inflate\nimport net.mamoe.mirai.utils.isSameType\nimport net.mamoe.mirai.utils.structureToStringIfAvailable\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class ImCommon : ProtoBuf {\n    @Serializable\n    internal class GroupInfo(\n        @ProtoNumber(1) @JvmField val groupId: Long = 0L,\n        @ProtoNumber(2) @JvmField val groupType: Int /* enum */ = 1,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Signature(\n        @ProtoNumber(1) @JvmField val keyType: Int = 0,\n        @ProtoNumber(2) @JvmField val sessionAppId: Int = 0,\n        @ProtoNumber(3) @JvmField val sessionKey: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Token(\n        @ProtoNumber(1) @JvmField val buf: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val c2cType: Int = 0,\n        @ProtoNumber(3) @JvmField val serviceType: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class User(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val appId: Int = 0,\n        @ProtoNumber(3) @JvmField val instanceId: Int = 0,\n        @ProtoNumber(4) @JvmField val appType: Int = 0,\n        @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(5) @JvmField val clientIp: Int = 0,\n        @ProtoNumber(6) @JvmField val version: Int = 0,\n        @ProtoNumber(7) @JvmField val phoneNumber: String = \"\",\n        @ProtoNumber(8) @JvmField val platformId: Int = 0,\n        @ProtoNumber(9) @JvmField val language: Int = 0,\n        @ProtoNumber(10) @JvmField val equipKey: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class ImImagent : ProtoBuf {\n    @Serializable\n    internal class ImAgentHead(\n        @ProtoNumber(1) @JvmField val command: Int /* enum */ = 1,\n        @ProtoNumber(2) @JvmField val seq: Int = 0,\n        @ProtoNumber(3) @JvmField val result: Int = 0,\n        @ProtoNumber(4) @JvmField val err: String = \"\",\n        @ProtoNumber(5) @JvmField val echoBuf: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val reqUser: ImCommon.User? = null,\n        @ProtoNumber(7) @JvmField val reqInfo: Requestinfo? = null,\n        @ProtoNumber(8) @JvmField val signature: Signature? = null,\n        @ProtoNumber(9) @JvmField val subCmd: Int = 0,\n        @ProtoNumber(10) @JvmField val serverIp: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ImAgentPackage(\n        @ProtoNumber(1) @JvmField val head: ImAgentHead? = null,\n        @ProtoNumber(11) @JvmField val msgSendReq: ImMsg.MsgSendReq? = null,\n        @ProtoNumber(12) @JvmField val msgSendResp: ImMsg.MsgSendResp? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Requestinfo(\n        @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(1) @JvmField val reqIp: Int = 0,\n        @ProtoNumber(2) @JvmField val reqPort: Int = 0,\n        @ProtoNumber(3) @JvmField val reqFlag: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Signature(\n        @ProtoNumber(1) @JvmField val keyType: Int = 0,\n        @ProtoNumber(2) @JvmField val sessionAppId: Int = 0,\n        @ProtoNumber(3) @JvmField val sessionKey: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class ImMsg : ProtoBuf {\n    @Serializable\n    internal class C2C(\n        @ProtoNumber(1) @JvmField val sender: ImCommon.User? = null,\n        @ProtoNumber(2) @JvmField val receiver: ImCommon.User? = null,\n        @ProtoNumber(3) @JvmField val c2cRelation: C2CRelation? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class C2CRelation(\n        @ProtoNumber(1) @JvmField val c2cType: Int /* enum */ = 0,\n        @ProtoNumber(2) @JvmField val groupInfo: ImCommon.GroupInfo? = null,\n        @ProtoNumber(3) @JvmField val token: ImCommon.Token? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ContentHead(\n        @ProtoNumber(1) @JvmField val pkgNum: Int = 1,\n        @ProtoNumber(2) @JvmField val pkgIndex: Int = 0,\n        @ProtoNumber(3) @JvmField val seq: Int = 0,\n        @ProtoNumber(4) @JvmField val dateTime: Int = 0,\n        @ProtoNumber(5) @JvmField val msgType: Int = 0,\n        @ProtoNumber(6) @JvmField val divSeq: Int = 0,\n        @ProtoNumber(7) @JvmField val msgdbUin: Long = 0L,\n        @ProtoNumber(8) @JvmField val msgdbSeq: Int = 0,\n        @ProtoNumber(9) @JvmField val wordMsgSeq: Int = 0,\n        @ProtoNumber(10) @JvmField val msgRand: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Group(\n        @ProtoNumber(1) @JvmField val sender: ImCommon.User? = null,\n        @ProtoNumber(2) @JvmField val receiver: ImCommon.User? = null,\n        @ProtoNumber(3) @JvmField val groupInfo: ImCommon.GroupInfo? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Msg(\n        @ProtoNumber(1) @JvmField val head: MsgHead? = null,\n        @ProtoNumber(2) @JvmField val body: ImMsgBody.MsgBody? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgHead(\n        @ProtoNumber(1) @JvmField val routingHead: RoutingHead? = null,\n        @ProtoNumber(2) @JvmField val contentHead: ContentHead? = null,\n        @ProtoNumber(3) @JvmField val gbkTmpMsgBody: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgSendReq(\n        @ProtoNumber(1) @JvmField val msg: Msg? = null,\n        @ProtoNumber(2) @JvmField val buMsg: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val msgTailId: Int = 0,\n        @ProtoNumber(4) @JvmField val connMsgFlag: Int = 0,\n        @ProtoNumber(5) @JvmField val cookie: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgSendResp\n\n    @Serializable\n    internal class RoutingHead(\n        @ProtoNumber(1) @JvmField val c2c: C2C? = null,\n        @ProtoNumber(2) @JvmField val group: Group? = null,\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class ImMsgBody : ProtoBuf {\n    @Serializable\n    internal class AnonymousGroupMsg(\n        @ProtoNumber(1) @JvmField val flags: Int = 0,\n        @ProtoNumber(2) @JvmField val anonId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val anonNick: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val headPortrait: Int = 0,\n        @ProtoNumber(5) @JvmField val expireTime: Int = 0,\n        @ProtoNumber(6) @JvmField val bubbleId: Int = 0,\n        @ProtoNumber(7) @JvmField val rankColor: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ApolloActMsg(\n        @ProtoNumber(1) @JvmField val actionId: Int = 0,\n        @ProtoNumber(2) @JvmField val actionName: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val actionText: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val flag: Int = 0,\n        @ProtoNumber(5) @JvmField val peerUin: Int = 0,\n        @ProtoNumber(6) @JvmField val senderTs: Int = 0,\n        @ProtoNumber(7) @JvmField val peerTs: Int = 0,\n        @ProtoNumber(8) @JvmField val int32SenderStatus: Int = 0,\n        @ProtoNumber(9) @JvmField val int32PeerStatus: Int = 0,\n        @ProtoNumber(10) @JvmField val diytextId: Int = 0,\n        @ProtoNumber(11) @JvmField val diytextContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(12) @JvmField val inputText: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(13) @JvmField val pbReserve: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ArkAppElem(\n        @ProtoNumber(1) @JvmField val appName: String = \"\",\n        @ProtoNumber(2) @JvmField val minVersion: String = \"\",\n        @ProtoNumber(3) @JvmField val xmlTemplate: String = \"\",\n        @ProtoNumber(4) @JvmField val data: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Attr(\n        @ProtoType(ProtoIntegerType.SIGNED) @ProtoNumber(1) @JvmField val codePage: Int = -1,\n        @ProtoNumber(2) @JvmField val time: Int = 1,\n        @ProtoNumber(3) @JvmField val random: Int = 0,\n        @ProtoNumber(4) @JvmField val color: Int = 0,\n        @ProtoNumber(5) @JvmField val size: Int = 10,\n        @ProtoNumber(6) @JvmField val effect: Int = 7,\n        @ProtoNumber(7) @JvmField val charSet: Int = 78,\n        @ProtoNumber(8) @JvmField val pitchAndFamily: Int = 90,\n        @ProtoNumber(9) @JvmField val fontName: String = \"Times New Roman\",\n        @ProtoNumber(10) @JvmField val reserveData: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class BitAppMsg(\n        @ProtoNumber(1) @JvmField val buf: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class BlessingMessage(\n        @ProtoNumber(1) @JvmField val msgType: Int = 0,\n        @ProtoNumber(2) @JvmField val exFlag: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CommonElem(\n        @ProtoNumber(1) @JvmField val serviceType: Int = 0,\n        @ProtoNumber(2) @JvmField val pbElem: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val businessType: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ConferenceTipsInfo(\n        @ProtoNumber(1) @JvmField val sessionType: Int = 0,\n        @ProtoNumber(2) @JvmField val sessionUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val text: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CrmElem(\n        @ProtoNumber(1) @JvmField val crmBuf: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val msgResid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val qidianFlag: Int = 0,\n        @ProtoNumber(4) @JvmField val pushFlag: Int = 0,\n        @ProtoNumber(5) @JvmField val countFlag: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CustomElem(\n        @ProtoNumber(1) @JvmField val desc: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val data: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val enumType: Int /* enum */ = 1,\n        @ProtoNumber(4) @JvmField val ext: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val sound: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CustomFace(\n        @ProtoNumber(1) @JvmField val guid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val filePath: String = \"\",\n        @ProtoNumber(3) @JvmField val shortcut: String = \"\",\n        @ProtoNumber(4) @JvmField val buffer: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val flag: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val oldData: ByteArray? = null,\n        @ProtoNumber(7) @JvmField val fileId: Int = 0,\n        @ProtoNumber(8) @JvmField val serverIp: Int = 0,\n        @ProtoNumber(9) @JvmField val serverPort: Int = 0,\n        @ProtoNumber(10) @JvmField val fileType: Int = 0,\n        @ProtoNumber(11) @JvmField val signature: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(12) @JvmField val useful: Int = 0,\n        @ProtoNumber(13) override val picMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(14) override val thumbUrl: String = \"\",\n        @ProtoNumber(15) @JvmField val bigUrl: String = \"\",\n        @ProtoNumber(16) override val origUrl: String = \"\",\n        @ProtoNumber(17) @JvmField val bizType: Int = 0,\n        @ProtoNumber(18) @JvmField val repeatIndex: Int = 0,\n        @ProtoNumber(19) @JvmField val repeatImage: Int = 0,\n        @ProtoNumber(20) @JvmField val imageType: Int = 0,\n        @ProtoNumber(21) @JvmField val index: Int = 0,\n        @ProtoNumber(22) @JvmField val width: Int = 0,\n        @ProtoNumber(23) @JvmField val height: Int = 0,\n        @ProtoNumber(24) @JvmField val source: Int = 0,\n        @ProtoNumber(25) @JvmField val size: Int = 0,\n        @ProtoNumber(26) @JvmField val origin: Int = 0,\n        @ProtoNumber(27) @JvmField val thumbWidth: Int = 0,\n        @ProtoNumber(28) @JvmField val thumbHeight: Int = 0,\n        @ProtoNumber(29) @JvmField val showLen: Int = 0,\n        @ProtoNumber(30) @JvmField val downloadLen: Int = 0,\n        @ProtoNumber(31) override val _400Url: String = \"\",\n        @ProtoNumber(32) @JvmField val _400Width: Int = 0,\n        @ProtoNumber(33) @JvmField val _400Height: Int = 0,\n        @ProtoNumber(34) @JvmField val pbReserve: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf, NotOnlineImageOrCustomFace\n\n    @Serializable\n    internal class DeliverGiftMsg(\n        @ProtoNumber(1) @JvmField val grayTipContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val animationPackageId: Int = 0,\n        @ProtoNumber(3) @JvmField val animationPackageUrlA: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val animationPackageUrlI: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val remindBrief: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val giftId: Int = 0,\n        @ProtoNumber(7) @JvmField val giftCount: Int = 0,\n        @ProtoNumber(8) @JvmField val animationBrief: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(9) @JvmField val senderUin: Long = 0L,\n        @ProtoNumber(10) @JvmField val receiverUin: Long = 0L,\n        @ProtoNumber(11) @JvmField val stmessageTitle: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(12) @JvmField val stmessageSubtitle: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(13) @JvmField val stmessageMessage: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(14) @JvmField val stmessageGiftpicid: Int = 0,\n        @ProtoNumber(15) @JvmField val stmessageComefrom: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(16) @JvmField val stmessageExflag: Int = 0,\n        @ProtoNumber(17) @JvmField val toAllGiftId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(18) @JvmField val comefromLink: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(19) @JvmField val pbReserve: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(20) @JvmField val receiverName: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(21) @JvmField val receiverPic: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(22) @JvmField val stmessageGifturl: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class EIMInfo(\n        @ProtoNumber(1) @JvmField val rootId: Long = 0L,\n        @ProtoNumber(2) @JvmField val flag: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Elem(\n        @ProtoNumber(1) @JvmField val text: Text? = null,\n        @ProtoNumber(2) @JvmField val face: Face? = null,\n        @ProtoNumber(3) @JvmField val onlineImage: OnlineImage? = null,\n        @ProtoNumber(4) @JvmField val notOnlineImage: NotOnlineImage? = null,\n        @ProtoNumber(5) @JvmField val transElemInfo: TransElem? = null,\n        @ProtoNumber(6) @JvmField val marketFace: MarketFace? = null,\n        @ProtoNumber(7) @JvmField val elemFlags: ElemFlags? = null,\n        @ProtoNumber(8) @JvmField val customFace: CustomFace? = null,\n        @ProtoNumber(9) @JvmField val elemFlags2: ElemFlags2? = null,\n        @ProtoNumber(10) @JvmField val funFace: FunFace? = null,\n        @ProtoNumber(11) @JvmField val secretFile: SecretFileMsg? = null,\n        @ProtoNumber(12) @JvmField val richMsg: RichMsg? = null,\n        @ProtoNumber(13) @JvmField val groupFile: GroupFile? = null,\n        @ProtoNumber(14) @JvmField val pubGroup: PubGroup? = null,\n        @ProtoNumber(15) @JvmField val marketTrans: MarketTrans? = null,\n        @ProtoNumber(16) @JvmField val extraInfo: ExtraInfo? = null,\n        @ProtoNumber(17) @JvmField val shakeWindow: ShakeWindow? = null,\n        @ProtoNumber(18) @JvmField val pubAccount: PubAccount? = null,\n        @ProtoNumber(19) @JvmField val videoFile: VideoFile? = null,\n        @ProtoNumber(20) @JvmField val tipsInfo: TipsInfo? = null,\n        @ProtoNumber(21) @JvmField val anonGroupMsg: AnonymousGroupMsg? = null,\n        @ProtoNumber(22) @JvmField val qqLiveOld: QQLiveOld? = null,\n        @ProtoNumber(23) @JvmField val lifeOnline: LifeOnlineAccount? = null,\n        // @ProtoNumber(24) @JvmField val qqwalletMsg: QQWalletMsg? = null,\n        @ProtoNumber(25) @JvmField val crmElem: CrmElem? = null,\n        @ProtoNumber(26) @JvmField val conferenceTipsInfo: ConferenceTipsInfo? = null,\n        @ProtoNumber(27) @JvmField val redbagInfo: RedBagInfo? = null,\n        @ProtoNumber(28) @JvmField val lowVersionTips: LowVersionTips? = null,\n        @ProtoNumber(29) @JvmField val bankcodeCtrlInfo: ByteArray? = null,\n        @ProtoNumber(30) @JvmField val nearByMsg: NearByMessageType? = null,\n        @ProtoNumber(31) @JvmField val customElem: CustomElem? = null,\n        @ProtoNumber(32) @JvmField val locationInfo: LocationInfo? = null,\n        @ProtoNumber(33) @JvmField val pubAccInfo: PubAccInfo? = null,\n        @ProtoNumber(34) @JvmField val smallEmoji: SmallEmoji? = null,\n        @ProtoNumber(35) @JvmField val fsjMsgElem: FSJMessageElem? = null,\n        @ProtoNumber(36) @JvmField val arkApp: ArkAppElem? = null,\n        @ProtoNumber(37) @JvmField val generalFlags: GeneralFlags? = null,\n        @ProtoNumber(38) @JvmField val hcFlashPic: CustomFace? = null,\n        @ProtoNumber(39) @JvmField val deliverGiftMsg: DeliverGiftMsg? = null,\n        @ProtoNumber(40) @JvmField val bitappMsg: BitAppMsg? = null,\n        @ProtoNumber(41) @JvmField val openQqData: OpenQQData? = null,\n        @ProtoNumber(42) @JvmField val apolloMsg: ApolloActMsg? = null,\n        @ProtoNumber(43) @JvmField val groupPubAccInfo: GroupPubAccountInfo? = null,\n        @ProtoNumber(44) @JvmField val blessMsg: BlessingMessage? = null,\n        @ProtoNumber(45) @JvmField val srcMsg: SourceMsg? = null,\n        @ProtoNumber(46) @JvmField val lolaMsg: LolaMsg? = null,\n        @ProtoNumber(47) @JvmField val groupBusinessMsg: GroupBusinessMsg? = null,\n        @ProtoNumber(48) @JvmField val msgWorkflowNotify: WorkflowNotifyMsg? = null,\n        @ProtoNumber(49) @JvmField val patElem: PatsElem? = null,\n        @ProtoNumber(50) @JvmField val groupPostElem: GroupPostElem? = null,\n        @ProtoNumber(51) @JvmField val lightApp: LightAppElem? = null,\n        @ProtoNumber(52) @JvmField val eimInfo: EIMInfo? = null,\n        @ProtoNumber(53) @JvmField val commonElem: CommonElem? = null,\n    ) : ProtoBuf {\n        override fun toString(): String {\n            return this.structureToStringIfAvailable() ?: super.toString()\n        }\n    }\n\n    @Serializable\n    internal class ElemFlags(\n        @ProtoNumber(1) @JvmField val flags1: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val businessData: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ElemFlags2(\n        @ProtoNumber(1) @JvmField val colorTextId: Int = 0,\n        @ProtoNumber(2) @JvmField val msgId: Long = 0L,\n        @ProtoNumber(3) @JvmField val whisperSessionId: Int = 0,\n        @ProtoNumber(4) @JvmField val pttChangeBit: Int = 0,\n        @ProtoNumber(5) @JvmField val vipStatus: Int = 0,\n        @ProtoNumber(6) @JvmField val compatibleId: Int = 0,\n        @ProtoNumber(7) @JvmField val insts: List<Inst> = emptyList(),\n        @ProtoNumber(8) @JvmField val msgRptCnt: Int = 0,\n        @ProtoNumber(9) @JvmField val srcInst: Inst? = null,\n        @ProtoNumber(10) @JvmField val longtitude: Int = 0,\n        @ProtoNumber(11) @JvmField val latitude: Int = 0,\n        @ProtoNumber(12) @JvmField val customFont: Int = 0,\n        @ProtoNumber(13) @JvmField val pcSupportDef: PcSupportDef? = null,\n        @ProtoNumber(14) @JvmField val crmFlags: Int = 0,\n    ) : ProtoBuf {\n        @Serializable\n        internal class Inst(\n            @ProtoNumber(1) @JvmField val appId: Int = 0,\n            @ProtoNumber(2) @JvmField val instId: Int = 0,\n        )\n    }\n\n    @Serializable\n    internal class ExtraInfo(\n        @ProtoNumber(1) @JvmField val nick: String = \"\",\n        @ProtoNumber(2) @JvmField val groupCard: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val level: Int = 0,\n        @ProtoNumber(4) @JvmField val flags: Int = 0,\n        @ProtoNumber(5) @JvmField val groupMask: Int = 0,\n        @ProtoNumber(6) @JvmField val msgTailId: Int = 0,\n        @ProtoNumber(7) @JvmField val senderTitle: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val apnsTips: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(9) @JvmField val uin: Long = 0L,\n        @ProtoNumber(10) @JvmField val msgStateFlag: Int = 0,\n        @ProtoNumber(11) @JvmField val apnsSoundType: Int = 0,\n        @ProtoNumber(12) @JvmField val newGroupFlag: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Face(\n        @ProtoNumber(1) @JvmField val index: Int = 0,\n        @ProtoNumber(2) @JvmField val old: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(11) @JvmField val buf: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FSJMessageElem(\n        @ProtoNumber(1) @JvmField val msgType: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FunFace(\n        @ProtoNumber(1) @JvmField val msgTurntable: Turntable? = null,\n        @ProtoNumber(2) @JvmField val msgBomb: Bomb? = null,\n    ) {\n        @Serializable\n        internal class Bomb(\n            @ProtoNumber(1) @JvmField val boolBurst: Boolean = false,\n        )\n\n        @Serializable\n        internal class Turntable(\n            @ProtoNumber(1) @JvmField val uint64UinList: List<Long> = emptyList(),\n            @ProtoNumber(2) @JvmField val hitUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val hitUinNick: String = \"\",\n        )\n    }\n\n    @Serializable\n    internal class GeneralFlags(\n        @ProtoNumber(1) @JvmField val bubbleDiyTextId: Int = 0,\n        @ProtoNumber(2) @JvmField val groupFlagNew: Int = 0,\n        @ProtoNumber(3) @JvmField val uin: Long = 0L,\n        @ProtoNumber(4) @JvmField val rpId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val prpFold: Int = 0,\n        @ProtoNumber(6) @JvmField val longTextFlag: Int = 0,\n        @ProtoNumber(7) @JvmField val longTextResid: String = \"\",\n        @ProtoNumber(8) @JvmField val groupType: Int = 0,\n        @ProtoNumber(9) @JvmField val toUinFlag: Int = 0,\n        @ProtoNumber(10) @JvmField val glamourLevel: Int = 0,\n        @ProtoNumber(11) @JvmField val memberLevel: Int = 0,\n        @ProtoNumber(12) @JvmField val groupRankSeq: Long = 0L,\n        @ProtoNumber(13) @JvmField val olympicTorch: Int = 0,\n        @ProtoNumber(14) @JvmField val babyqGuideMsgCookie: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(15) @JvmField val uin32ExpertFlag: Int = 0,\n        @ProtoNumber(16) @JvmField val bubbleSubId: Int = 0,\n        @ProtoNumber(17) @JvmField val pendantId: Long = 0L,\n        @ProtoNumber(18) @JvmField val rpIndex: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(19) @JvmField val pbReserve: ByteArray = EMPTY_BYTE_ARRAY, // 78 00 F8 01 00 C8 02 00\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupBusinessMsg(\n        @ProtoNumber(1) @JvmField val flags: Int = 0,\n        @ProtoNumber(2) @JvmField val headUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val headClkUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val nick: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val nickColor: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val rank: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val rankColor: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val rankBgcolor: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupFile(\n        @ProtoNumber(1) @JvmField val filename: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val fileSize: Long = 0L,\n        @ProtoNumber(3) @JvmField val fileId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val batchId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val fileKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val mark: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val sequence: Long = 0L,\n        @ProtoNumber(8) @JvmField val batchItemId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(9) @JvmField val feedMsgTime: Int = 0,\n        @ProtoNumber(10) @JvmField val pbReserve: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupPostElem(\n        @ProtoNumber(1) @JvmField val transType: Int = 0,\n        @ProtoNumber(2) @JvmField val transMsg: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupPubAccountInfo(\n        @ProtoNumber(1) @JvmField val pubAccount: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class LifeOnlineAccount(\n        @ProtoNumber(1) @JvmField val uniqueId: Long = 0L,\n        @ProtoNumber(2) @JvmField val op: Int = 0,\n        @ProtoNumber(3) @JvmField val showTime: Int = 0,\n        @ProtoNumber(4) @JvmField val report: Int = 0,\n        @ProtoNumber(5) @JvmField val ack: Int = 0,\n        @ProtoNumber(6) @JvmField val bitmap: Long = 0L,\n        @ProtoNumber(7) @JvmField val gdtImpData: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val gdtCliData: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(9) @JvmField val viewId: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class LightAppElem(\n        @NestedStructure(LightAppElemDesensitizer::class)\n        @ProtoNumber(1) @JvmField val data: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val msgResid: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    internal object LightAppElemDesensitizer : NestedStructureDesensitizer<LightAppElem, ByteArray> {\n\n        // unzip\n        override fun deserialize(context: LightAppElem, byteArray: ByteArray): ByteArray {\n            if (byteArray.isEmpty()) return byteArray\n\n            return when (byteArray[0].toInt()) {\n                0 -> byteArrayOf(0) + byteArray.decodeToString(startIndex = 1).toByteArray()\n                1 -> byteArrayOf(0) + byteArray.inflate(offset = 1)\n                else -> error(\"unknown compression flag=${byteArray[0]}\")\n            }\n        }\n\n    }\n\n    @Serializable\n    internal class LocationInfo(\n        @ProtoNumber(1) @JvmField val longitude: Double = 0.0,\n        @ProtoNumber(2) @JvmField val latitude: Double = 0.0,\n        @ProtoNumber(3) @JvmField val desc: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class LolaMsg(\n        @ProtoNumber(1) @JvmField val msgResid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val encodeContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val longMsgUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val downloadKey: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class LowVersionTips(\n        @ProtoNumber(1) @JvmField val businessId: Int = 0,\n        @ProtoNumber(2) @JvmField val sessionType: Int = 0,\n        @ProtoNumber(3) @JvmField val sessionUin: Long = 0L,\n        @ProtoNumber(4) @JvmField val senderUin: Long = 0L,\n        @ProtoNumber(5) @JvmField val text: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal data class MarketFace(\n        @ProtoNumber(1) @JvmField var faceName: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val itemType: Int = 0,\n        @ProtoNumber(3) @JvmField val faceInfo: Int = 0,\n        @ProtoNumber(4) @JvmField val faceId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val tabId: Int = 0,\n        @ProtoNumber(6) @JvmField val subType: Int = 0,\n        @ProtoNumber(7) @JvmField val key: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val param: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(9) @JvmField val mediaType: Int = 0,\n        @ProtoNumber(10) @JvmField val imageWidth: Int = 0,\n        @ProtoNumber(11) @JvmField val imageHeight: Int = 0,\n        @ProtoNumber(12) @JvmField val mobileParam: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(13) @JvmField val pbReserve: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf {\n        @Suppress(\"DuplicatedCode\")\n        override fun equals(other: Any?): Boolean {\n            if (this === other) return true\n            if (!isSameType(this, other)) return false\n\n            if (!faceName.contentEquals(other.faceName)) return false\n            if (itemType != other.itemType) return false\n            if (faceInfo != other.faceInfo) return false\n            if (!faceId.contentEquals(other.faceId)) return false\n            if (tabId != other.tabId) return false\n            if (subType != other.subType) return false\n            if (!key.contentEquals(other.key)) return false\n            if (!param.contentEquals(other.param)) return false\n            if (mediaType != other.mediaType) return false\n            if (imageWidth != other.imageWidth) return false\n            if (imageHeight != other.imageHeight) return false\n            if (!mobileParam.contentEquals(other.mobileParam)) return false\n            if (!pbReserve.contentEquals(other.pbReserve)) return false\n\n            return true\n        }\n\n        override fun hashCode(): Int {\n            var result = faceName.contentHashCode()\n            result = 31 * result + itemType\n            result = 31 * result + faceInfo\n            result = 31 * result + faceId.contentHashCode()\n            result = 31 * result + tabId\n            result = 31 * result + subType\n            result = 31 * result + key.contentHashCode()\n            result = 31 * result + param.contentHashCode()\n            result = 31 * result + mediaType\n            result = 31 * result + imageWidth\n            result = 31 * result + imageHeight\n            result = 31 * result + mobileParam.contentHashCode()\n            result = 31 * result + pbReserve.contentHashCode()\n            return result\n        }\n    }\n\n    @Serializable\n    internal class MarketTrans(\n        @ProtoNumber(1) @JvmField val int32Flag: Int = 0,\n        @ProtoNumber(2) @JvmField val xml: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val msgResid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val ability: Int = 0,\n        @ProtoNumber(5) @JvmField val minAbility: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgBody(\n        @ProtoNumber(1) @JvmField val richText: RichText = RichText(),\n        @ProtoNumber(2) @JvmField val msgContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val msgEncryptContent: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgBodySubtype4(\n        @ProtoNumber(1) @JvmField val msgNotOnlineFile: NotOnlineFile? = null,\n        @ProtoNumber(2) @JvmField val msgTime: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NearByMessageType(\n        @ProtoNumber(1) @JvmField val type: Int = 0,\n        @ProtoNumber(2) @JvmField val identifyType: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NotOnlineFile(\n        @ProtoNumber(1) @JvmField val fileType: Int = 0,\n        @ProtoNumber(2) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val fileUuid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val fileName: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val fileSize: Long = 0L,\n        @ProtoNumber(7) @JvmField val note: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val reserved: Int = 0,\n        @ProtoNumber(9) @JvmField val subcmd: Int = 0,\n        @ProtoNumber(10) @JvmField val microCloud: Int = 0,\n        @ProtoNumber(11) @JvmField val bytesFileUrls: List<ByteArray> = emptyList(),\n        @ProtoNumber(12) @JvmField val downloadFlag: Int = 0,\n        @ProtoNumber(50) @JvmField val dangerEvel: Int = 0,\n        @ProtoNumber(51) @JvmField val lifeTime: Int = 0,\n        @ProtoNumber(52) @JvmField val uploadTime: Int = 0,\n        @ProtoNumber(53) @JvmField val absFileType: Int = 0,\n        @ProtoNumber(54) @JvmField val clientType: Int = 0,\n        @ProtoNumber(55) @JvmField val expireTime: Int = 0,\n        @ProtoNumber(56) @JvmField val pbReserve: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NewTechImageType(\n        @ProtoNumber(1) @JvmField val i: Int = 0,\n        @ProtoNumber(2) @JvmField val type: Int = 0,\n        @ProtoNumber(3) @JvmField val j: Int = 0,\n        @ProtoNumber(4) @JvmField val k: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NewTechImageFileInfo(\n        @ProtoNumber(1) @JvmField val size: Long = 0L,\n        @ProtoNumber(2) @JvmField val md5: String = \"\",\n        @ProtoNumber(3) @JvmField val sha1: String = \"\",\n        @ProtoNumber(4) @JvmField val filePath: String = \"\",\n        @ProtoNumber(5) @JvmField val imageType: NewTechImageType,\n        @ProtoNumber(6) @JvmField val imageWidth: Int = 0,\n        @ProtoNumber(7) @JvmField val imageHeight: Int = 0,\n        @ProtoNumber(8) @JvmField val i: Int = 0,\n        @ProtoNumber(9) @JvmField val j: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NewTechImageMsgInfo(\n        @ProtoNumber(1) @JvmField val imageInfo: NewTechImageFileInfo,\n        @ProtoNumber(2) @JvmField val fileId: String = \"\",\n        @ProtoNumber(3) @JvmField val i: Int = 0,\n        @ProtoNumber(4) @JvmField val timestamp: Long = 0L,\n        @ProtoNumber(5) @JvmField val friendOrGroup: Int = 0,\n        @ProtoNumber(6) @JvmField val j: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NewTechImageSpec(\n        @ProtoNumber(1) @JvmField val origin: String = \"&spec=0\",\n        @ProtoNumber(2) @JvmField val large: String = \"&spec=720\",\n        @ProtoNumber(3) @JvmField val small: String = \"&spec=198\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NewTechImageNoKeyDownloadInfo(\n        @ProtoNumber(1) @JvmField val noKeyUrl: String = \"\",\n        @ProtoNumber(2) @JvmField val spec: NewTechImageSpec,\n        @ProtoNumber(3) @JvmField val domain: String = \"multimedia.nt.qq.com.cn\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NewTechImageGroupInfo(\n        @ProtoNumber(1) @JvmField val groupId: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NewTechImageFriendInfo(\n        @ProtoNumber(1) @JvmField val i: Int = 0,\n        @ProtoNumber(2) @JvmField val j: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NewTechImageSenderInfo(\n        @ProtoNumber(101) @JvmField val i: Int = 0,\n        @ProtoNumber(102) @JvmField val j: Int = 0,\n        @ProtoNumber(200) @JvmField val k: Int = 0,\n        @ProtoNumber(201) @JvmField val friendInfo: NewTechImageFriendInfo?,\n        @ProtoNumber(202) @JvmField val groupInfo: NewTechImageGroupInfo?,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NewTechImageInfoMain(\n        @ProtoNumber(1) @JvmField val msgInfo: NewTechImageMsgInfo,\n        @ProtoNumber(2) @JvmField val noKeyDownloadInfo: NewTechImageNoKeyDownloadInfo,\n        @ProtoNumber(5) @JvmField val k: Int = 0,\n        @ProtoNumber(6) @JvmField val senderInfo: NewTechImageSenderInfo,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NewTechImageMetaInfoSenderMetaSenderUnknown(\n        @ProtoNumber(1) @JvmField val i: Int = 0,\n        @ProtoNumber(2) @JvmField val j: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val k: Int = 0,\n        @ProtoNumber(4) @JvmField val l: Int = 0,\n        @ProtoNumber(5) @JvmField val m: Int = 0,\n        @ProtoNumber(7) @JvmField val n: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NewTechImageMetaInfoSenderMeta(\n        @ProtoNumber(1) @JvmField val i: Int = 0,\n        @ProtoNumber(3) @JvmField val j: Int = 0,\n        @ProtoNumber(4) @JvmField val k: Int = 0,\n        @ProtoNumber(9) @JvmField val displayStr: String = \"\",\n        @ProtoNumber(10) @JvmField val l: Int = 0,\n        @ProtoNumber(12) @JvmField val m: ByteArray? = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(18) @JvmField val n: ByteArray? = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(19) @JvmField val o: ByteArray? = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(20) @JvmField val friendUnknown: NewTechImageMetaInfoSenderMetaSenderUnknown?,\n        @ProtoNumber(21) @JvmField val groupUnknown: NewTechImageMetaInfoSenderMetaSenderUnknown?,\n        @ProtoNumber(30) @JvmField val origUrl: String = \"\",\n        @ProtoNumber(31) @JvmField val md5Upper: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NewTechImageMetaInfoMain(\n        @ProtoNumber(1) @JvmField val isEmoji: Int = 0,\n        @ProtoNumber(2) @JvmField val displayStr: String = \"\",\n        @ProtoNumber(11) @JvmField val friendMeta: NewTechImageMetaInfoSenderMeta?,\n        @ProtoNumber(12) @JvmField val groupMeta: NewTechImageMetaInfoSenderMeta?,\n        @ProtoNumber(1001) @JvmField val i: Int = 0,\n        @ProtoNumber(1002) @JvmField val j: Int = 0,\n        @ProtoNumber(1003) @JvmField val k: Int? = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NewTechImageMetaInfoUnknown2(\n        @ProtoNumber(3) @JvmField val i: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NewTechImageMetaInfoUnknown3(\n        @ProtoNumber(11) @JvmField val i: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(12) @JvmField val j: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NewTechImageMetaInfo(\n        @ProtoNumber(1) @JvmField val main: NewTechImageMetaInfoMain,\n        @ProtoNumber(2) @JvmField val unknown1: NewTechImageMetaInfoUnknown2,\n        @ProtoNumber(3) @JvmField val unknown2: NewTechImageMetaInfoUnknown3,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NewTechImageInfo(\n        @ProtoNumber(1) @JvmField val info: NewTechImageInfoMain,\n        @ProtoNumber(2) @JvmField val meta: NewTechImageMetaInfo,\n    ) : ProtoBuf\n\n    interface NotOnlineImageOrCustomFace {\n        val thumbUrl: String\n        val origUrl: String\n        val _400Url: String\n        val picMd5: ByteArray\n    }\n\n    @Serializable\n    internal class NotOnlineImage(\n        @ProtoNumber(1) @JvmField val filePath: String = \"\",\n        @ProtoNumber(2) @JvmField val fileLen: Long = 0L, // originally int\n        @ProtoNumber(3) @JvmField val downloadPath: String = \"\",\n        @ProtoNumber(4) @JvmField val oldVerSendFile: ByteArray? = null,\n        @ProtoNumber(5) @JvmField val imgType: Int = 0,\n        @ProtoNumber(6) @JvmField val previewsImage: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) override val picMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val picHeight: Int = 0,\n        @ProtoNumber(9) @JvmField val picWidth: Int = 0,\n        @ProtoNumber(10) @JvmField val resId: String = \"\",\n        @ProtoNumber(11) @JvmField val flag: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(12) override val thumbUrl: String = \"\",\n        @ProtoNumber(13) @JvmField val original: Int = 0,\n        @ProtoNumber(14) @JvmField val bigUrl: String = \"\",\n        @ProtoNumber(15) override val origUrl: String = \"\",\n        @ProtoNumber(16) @JvmField val bizType: Int = 0,\n        @ProtoNumber(17) @JvmField val result: Int = 0,\n        @ProtoNumber(18) @JvmField val index: Int = 0,\n        @ProtoNumber(19) @JvmField val opFaceBuf: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(20) @JvmField val oldPicMd5: Boolean = false,\n        @ProtoNumber(21) @JvmField val thumbWidth: Int = 0,\n        @ProtoNumber(22) @JvmField val thumbHeight: Int = 0,\n        @ProtoNumber(23) @JvmField val fileId: Int = 0,\n        @ProtoNumber(24) @JvmField val showLen: Int = 0,\n        @ProtoNumber(25) @JvmField val downloadLen: Int = 0,\n        @ProtoNumber(26) override val _400Url: String = \"\",\n        @ProtoNumber(27) @JvmField val _400Width: Int = 0,\n        @ProtoNumber(28) @JvmField val _400Height: Int = 0,\n        @ProtoNumber(29) @JvmField val pbReserve: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf, NotOnlineImageOrCustomFace\n\n\n    @Serializable\n    internal class OnlineImage(\n        @ProtoNumber(1) @JvmField val guid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val filePath: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val oldVerSendFile: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class OpenQQData(\n        @ProtoNumber(1) @JvmField val carQqData: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PatsElem(\n        @ProtoNumber(1) @JvmField val patType: Int = 0,\n        @ProtoNumber(2) @JvmField val patCount: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PcSupportDef(\n        @ProtoNumber(1) @JvmField val pcPtlBegin: Int = 0,\n        @ProtoNumber(2) @JvmField val pcPtlEnd: Int = 0,\n        @ProtoNumber(3) @JvmField val macPtlBegin: Int = 0,\n        @ProtoNumber(4) @JvmField val macPtlEnd: Int = 0,\n        @ProtoNumber(5) @JvmField val ptlsSupport: List<Int> = emptyList(),\n        @ProtoNumber(6) @JvmField val ptlsNotSupport: List<Int> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Ptt(\n        @ProtoNumber(1) @JvmField val fileType: Int = 0,\n        @ProtoNumber(2) @JvmField val srcUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val fileUuid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val fileName: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val fileSize: Int = 0,\n        @ProtoNumber(7) @JvmField val reserve: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val fileId: Int = 0,\n        @ProtoNumber(9) @JvmField val serverIp: Int = 0,\n        @ProtoNumber(10) @JvmField val serverPort: Int = 0,\n        @ProtoNumber(11) @JvmField val boolValid: Boolean = false,\n        @ProtoNumber(12) @JvmField val signature: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(13) @JvmField val shortcut: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(14) @JvmField val fileKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(15) @JvmField val magicPttIndex: Int = 0,\n        @ProtoNumber(16) @JvmField val voiceSwitch: Int = 0,\n        @ProtoNumber(17) @JvmField val pttUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(18) @JvmField val groupFileKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(19) @JvmField val time: Int = 0,\n        @ProtoNumber(20) @JvmField var downPara: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(29) @JvmField val format: Int = 0,\n        @ProtoNumber(30) @JvmField val pbReserve: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(31) @JvmField val bytesPttUrls: List<ByteArray> = emptyList(),\n        @ProtoNumber(32) @JvmField val downloadFlag: Int = 0,\n    ) : ProtoBuf {\n        override fun equals(other: Any?): Boolean {\n            if (this === other) return true\n            if (!isSameType(this, other)) return false\n\n            if (fileType != other.fileType) return false\n            if (srcUin != other.srcUin) return false\n            if (!fileUuid.contentEquals(other.fileUuid)) return false\n            if (!fileMd5.contentEquals(other.fileMd5)) return false\n            if (!fileName.contentEquals(other.fileName)) return false\n            if (fileSize != other.fileSize) return false\n            if (!reserve.contentEquals(other.reserve)) return false\n            if (fileId != other.fileId) return false\n            if (serverIp != other.serverIp) return false\n            if (serverPort != other.serverPort) return false\n            if (boolValid != other.boolValid) return false\n            if (!signature.contentEquals(other.signature)) return false\n            if (!shortcut.contentEquals(other.shortcut)) return false\n            if (!fileKey.contentEquals(other.fileKey)) return false\n            if (magicPttIndex != other.magicPttIndex) return false\n            if (voiceSwitch != other.voiceSwitch) return false\n            if (!pttUrl.contentEquals(other.pttUrl)) return false\n            if (!groupFileKey.contentEquals(other.groupFileKey)) return false\n            if (time != other.time) return false\n            if (!downPara.contentEquals(other.downPara)) return false\n            if (format != other.format) return false\n            if (!pbReserve.contentEquals(other.pbReserve)) return false\n            if (bytesPttUrls != other.bytesPttUrls) return false\n            if (downloadFlag != other.downloadFlag) return false\n\n            return true\n        }\n\n        override fun hashCode(): Int {\n            var result = fileType\n            result = 31 * result + srcUin.hashCode()\n            result = 31 * result + fileUuid.contentHashCode()\n            result = 31 * result + fileMd5.contentHashCode()\n            result = 31 * result + fileName.contentHashCode()\n            result = 31 * result + fileSize\n            result = 31 * result + reserve.contentHashCode()\n            result = 31 * result + fileId\n            result = 31 * result + serverIp\n            result = 31 * result + serverPort\n            result = 31 * result + boolValid.hashCode()\n            result = 31 * result + signature.contentHashCode()\n            result = 31 * result + shortcut.contentHashCode()\n            result = 31 * result + fileKey.contentHashCode()\n            result = 31 * result + magicPttIndex\n            result = 31 * result + voiceSwitch\n            result = 31 * result + pttUrl.contentHashCode()\n            result = 31 * result + groupFileKey.contentHashCode()\n            result = 31 * result + time\n            result = 31 * result + downPara.contentHashCode()\n            result = 31 * result + format\n            result = 31 * result + pbReserve.contentHashCode()\n            result = 31 * result + bytesPttUrls.hashCode()\n            result = 31 * result + downloadFlag\n            return result\n        }\n    }\n\n    @Serializable\n    internal class PubAccInfo(\n        @ProtoNumber(1) @JvmField val isInterNum: Int = 0,\n        @ProtoNumber(2) @JvmField val ingMsgTemplateId: String = \"\",\n        @ProtoNumber(3) @JvmField val ingLongMsgUrl: String = \"\",\n        @ProtoNumber(4) @JvmField val downloadKey: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PubAccount(\n        @ProtoNumber(1) @JvmField val buf: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val pubAccountUin: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PubGroup(\n        @ProtoNumber(1) @JvmField val nickname: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val gender: Int = 0,\n        @ProtoNumber(3) @JvmField val age: Int = 0,\n        @ProtoNumber(4) @JvmField val distance: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class QQLiveOld(\n        @ProtoNumber(1) @JvmField val subCmd: Int = 0,\n        @ProtoNumber(2) @JvmField val showText: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val param: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val introduce: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class QQWalletAioBody(\n        @ProtoNumber(1) @JvmField val senduin: Long = 0L,\n        @ProtoNumber(2) @JvmField val sender: QQWalletAioElem? = null,\n        @ProtoNumber(3) @JvmField val receiver: QQWalletAioElem? = null,\n        @ProtoType(ProtoIntegerType.SIGNED) @ProtoNumber(4) @JvmField val sint32Channelid: Int = 0,\n        @ProtoType(ProtoIntegerType.SIGNED) @ProtoNumber(5) @JvmField val sint32Templateid: Int = 0,\n        @ProtoNumber(6) @JvmField val resend: Int = 0,\n        @ProtoNumber(7) @JvmField val msgPriority: Int = 0,\n        @ProtoType(ProtoIntegerType.SIGNED) @ProtoNumber(8) @JvmField val sint32Redtype: Int = 0,\n        @ProtoNumber(9) @JvmField val billno: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(10) @JvmField val authkey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoType(ProtoIntegerType.SIGNED) @ProtoNumber(11) @JvmField val sint32Sessiontype: Int = 0,\n        @ProtoType(ProtoIntegerType.SIGNED) @ProtoNumber(12) @JvmField val sint32Msgtype: Int = 0,\n        @ProtoType(ProtoIntegerType.SIGNED) @ProtoNumber(13) @JvmField val sint32Envelopeid: Int = 0,\n        @ProtoNumber(14) @JvmField val name: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoType(ProtoIntegerType.SIGNED) @ProtoNumber(15) @JvmField val sint32Conftype: Int = 0,\n        @ProtoType(ProtoIntegerType.SIGNED) @ProtoNumber(16) @JvmField val sint32MsgFrom: Int = 0,\n        @ProtoNumber(17) @JvmField val pcBody: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(18) @JvmField val ingIndex: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(19) @JvmField val redchannel: Int = 0,\n        @ProtoNumber(20) @JvmField val grapUin: List<Long> = emptyList(),\n        @ProtoNumber(21) @JvmField val pbReserve: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class QQWalletAioElem(\n        @ProtoNumber(1) @JvmField val background: Int = 0,\n        @ProtoNumber(2) @JvmField val icon: Int = 0,\n        @ProtoNumber(3) @JvmField val title: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val subtitle: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val content: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val linkurl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val blackstripe: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val notice: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(9) @JvmField val titleColor: Int = 0,\n        @ProtoNumber(10) @JvmField val subtitleColor: Int = 0,\n        @ProtoNumber(11) @JvmField val actionsPriority: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(12) @JvmField val jumpUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(13) @JvmField val nativeIos: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(14) @JvmField val nativeAndroid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(15) @JvmField val iconurl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(16) @JvmField val contentColor: Int = 0,\n        @ProtoNumber(17) @JvmField val contentBgcolor: Int = 0,\n        @ProtoNumber(18) @JvmField val aioImageLeft: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(19) @JvmField val aioImageRight: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(20) @JvmField val cftImage: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(21) @JvmField val pbReserve: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class QQWalletMsg(\n        @ProtoNumber(1) @JvmField val aioBody: QQWalletAioBody? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RedBagInfo(\n        @ProtoNumber(1) @JvmField val redbagType: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RichMsg(\n        @ProtoNumber(1) @JvmField val template1: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val serviceId: Int = 0,\n        @ProtoNumber(3) @JvmField val msgResid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val rand: Int = 0,\n        @ProtoNumber(5) @JvmField val seq: Int = 0,\n        @ProtoNumber(6) @JvmField val flags: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RichText(\n        @ProtoNumber(1) @JvmField val attr: Attr? = null,\n        @ProtoNumber(2) @JvmField val elems: List<Elem> = listOf(),\n        @ProtoNumber(3) @JvmField val notOnlineFile: NotOnlineFile? = null,\n        @ProtoNumber(4) @JvmField val ptt: Ptt? = null,\n        @ProtoNumber(5) @JvmField val tmpPtt: TmpPtt? = null,\n        @ProtoNumber(6) @JvmField val trans211TmpMsg: Trans211TmpMsg? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SecretFileMsg(\n        @ProtoNumber(1) @JvmField val fileKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val fromUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(4) @JvmField val status: Int = 0,\n        @ProtoNumber(5) @JvmField val ttl: Int = 0,\n        @ProtoNumber(6) @JvmField val type: Int = 0,\n        @ProtoNumber(7) @JvmField val encryptPreheadLength: Int = 0,\n        @ProtoNumber(8) @JvmField val encryptType: Int = 0,\n        @ProtoNumber(9) @JvmField val encryptKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(10) @JvmField val readTimes: Int = 0,\n        @ProtoNumber(11) @JvmField val leftTime: Int = 0,\n        @ProtoNumber(12) @JvmField val notOnlineImage: NotOnlineImage? = null,\n        @ProtoNumber(13) @JvmField val elemFlags2: ElemFlags2? = null,\n        @ProtoNumber(14) @JvmField val opertype: Int = 0,\n        @ProtoNumber(15) @JvmField val fromphonenum: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ShakeWindow(\n        @ProtoNumber(1) @JvmField val type: Int = 0,\n        @ProtoNumber(2) @JvmField val reserve: Int = 0,\n        @ProtoNumber(3) @JvmField val uin: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SmallEmoji(\n        @ProtoNumber(1) @JvmField val packIdSum: Int = 0,\n        @ProtoNumber(2) @JvmField val imageType: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SourceMsg(\n        @ProtoNumber(1) @JvmField val origSeqs: IntArray = intArrayOf(),\n        @ProtoNumber(2) @JvmField val senderUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val time: Int = 0,\n        @ProtoNumber(4) @JvmField val flag: Int = 0,\n        @ProtoNumber(5) @JvmField val elems: List<Elem> = emptyList(),\n        @ProtoNumber(6) @JvmField val type: Int = 0,\n        @ProtoNumber(7) @JvmField val richMsg: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val pbReserve: ByteArray = EMPTY_BYTE_ARRAY,\n        @NestedStructure(SrcMsgDesensitizer::class)\n        @ProtoNumber(9) @JvmField val srcMsg: ByteArray? = null,\n        @ProtoNumber(10) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(11) @JvmField val troopName: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    internal object SrcMsgDesensitizer : NestedStructureDesensitizer<SourceMsg, MsgComm.Msg> {\n        override fun deserialize(context: SourceMsg, byteArray: ByteArray): MsgComm.Msg {\n            return byteArray.loadAs(MsgComm.Msg.serializer())\n        }\n    }\n\n    @Serializable\n    internal class Text(\n        @ProtoNumber(1) @JvmField val str: String = \"\",\n        @ProtoNumber(2) @JvmField val link: String = \"\",\n        @ProtoNumber(3) @JvmField val attr6Buf: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val attr7Buf: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(11) @JvmField val buf: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(12) @JvmField val pbReserve: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TipsInfo(\n        @ProtoNumber(1) @JvmField val text: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TmpPtt(\n        @ProtoNumber(1) @JvmField val fileType: Int = 0,\n        @ProtoNumber(2) @JvmField val fileUuid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val fileName: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val fileSize: Int = 0,\n        @ProtoNumber(6) @JvmField val pttTimes: Int = 0,\n        @ProtoNumber(7) @JvmField val userType: Int = 0,\n        @ProtoNumber(8) @JvmField val ptttransFlag: Int = 0,\n        @ProtoNumber(9) @JvmField val busiType: Int = 0,\n        @ProtoNumber(10) @JvmField val msgId: Long = 0L,\n        @ProtoNumber(30) @JvmField val pbReserve: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(31) @JvmField val pttEncodeData: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Trans211TmpMsg(\n        @ProtoNumber(1) @JvmField val msgBody: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val c2cCmd: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TransElem(\n        @ProtoNumber(1) @JvmField val elemType: Int = 0,\n        @ProtoNumber(2) @JvmField val elemValue: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class VideoFile(\n        @ProtoNumber(1) @JvmField val fileUuid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val fileName: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val fileFormat: Int = 0,\n        @ProtoNumber(5) @JvmField val fileTime: Int = 0,\n        @ProtoNumber(6) @JvmField val fileSize: Int = 0,\n        @ProtoNumber(7) @JvmField val thumbWidth: Int = 0,\n        @ProtoNumber(8) @JvmField val thumbHeight: Int = 0,\n        @ProtoNumber(9) @JvmField val thumbFileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(10) @JvmField val source: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(11) @JvmField val thumbFileSize: Int = 0,\n        @ProtoNumber(12) @JvmField val busiType: Int = 0,\n        @ProtoNumber(13) @JvmField val fromChatType: Int = 0,\n        @ProtoNumber(14) @JvmField val toChatType: Int = 0,\n        @ProtoNumber(15) @JvmField val boolSupportProgressive: Boolean = false,\n        @ProtoNumber(16) @JvmField val fileWidth: Int = 0,\n        @ProtoNumber(17) @JvmField val fileHeight: Int = 0,\n        @ProtoNumber(18) @JvmField val subBusiType: Int = 0,\n        @ProtoNumber(19) @JvmField val videoAttr: Int = 0,\n        @ProtoNumber(20) @JvmField val bytesThumbFileUrls: List<ByteArray> = emptyList(),\n        @ProtoNumber(21) @JvmField val bytesVideoFileUrls: List<ByteArray> = emptyList(),\n        @ProtoNumber(22) @JvmField val thumbDownloadFlag: Int = 0,\n        @ProtoNumber(23) @JvmField val videoDownloadFlag: Int = 0,\n        @ProtoNumber(24) @JvmField val pbReserve: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class WorkflowNotifyMsg(\n        @ProtoNumber(1) @JvmField val extMsg: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val createUin: Long = 0L,\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class ImMsgHead : ProtoBuf {\n    @Serializable\n    internal class C2CHead(\n        @ProtoNumber(1) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val fromUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val ccType: Int = 0,\n        @ProtoNumber(4) @JvmField val ccCmd: Int = 0,\n        @ProtoNumber(5) @JvmField val authPicSig: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val authSig: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val authBuf: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val serverTime: Int = 0,\n        @ProtoNumber(9) @JvmField val clientTime: Int = 0,\n        @ProtoNumber(10) @JvmField val rand: Int = 0,\n        @ProtoNumber(11) @JvmField val ingPhoneNumber: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CSHead(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val command: Int = 0,\n        @ProtoNumber(3) @JvmField val seq: Int = 0,\n        @ProtoNumber(4) @JvmField val version: Int = 0,\n        @ProtoNumber(5) @JvmField val retryTimes: Int = 0,\n        @ProtoNumber(6) @JvmField val clientType: Int = 0,\n        @ProtoNumber(7) @JvmField val pubno: Int = 0,\n        @ProtoNumber(8) @JvmField val localid: Int = 0,\n        @ProtoNumber(9) @JvmField val timezone: Int = 0,\n        @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(10) @JvmField val clientIp: Int = 0,\n        @ProtoNumber(11) @JvmField val clientPort: Int = 0,\n        @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(12) @JvmField val connIp: Int = 0,\n        @ProtoNumber(13) @JvmField val connPort: Int = 0,\n        @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(14) @JvmField val interfaceIp: Int = 0,\n        @ProtoNumber(15) @JvmField val interfacePort: Int = 0,\n        @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(16) @JvmField val actualIp: Int = 0,\n        @ProtoNumber(17) @JvmField val flag: Int = 0,\n        @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(18) @JvmField val timestamp: Int = 0,\n        @ProtoNumber(19) @JvmField val subcmd: Int = 0,\n        @ProtoNumber(20) @JvmField val result: Int = 0,\n        @ProtoNumber(21) @JvmField val appId: Int = 0,\n        @ProtoNumber(22) @JvmField val instanceId: Int = 0,\n        @ProtoNumber(23) @JvmField val sessionId: Long = 0L,\n        @ProtoNumber(24) @JvmField val idcId: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DeltaHead(\n        @ProtoNumber(1) @JvmField val totalLen: Long = 0L,\n        @ProtoNumber(2) @JvmField val offset: Long = 0L,\n        @ProtoNumber(3) @JvmField val ackOffset: Long = 0L,\n        @ProtoNumber(4) @JvmField val cookie: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val ackCookie: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val result: Int = 0,\n        @ProtoNumber(7) @JvmField val flags: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Head(\n        @ProtoNumber(1) @JvmField val headType: Int = 0,\n        @ProtoNumber(2) @JvmField val msgCsHead: CSHead? = null,\n        @ProtoNumber(3) @JvmField val msgS2cHead: S2CHead? = null,\n        @ProtoNumber(4) @JvmField val msgHttpconnHead: HttpConnHead? = null,\n        @ProtoNumber(5) @JvmField val paintFlag: Int = 0,\n        @ProtoNumber(6) @JvmField val msgLoginSig: LoginSig? = null,\n        @ProtoNumber(7) @JvmField val msgDeltaHead: DeltaHead? = null,\n        @ProtoNumber(8) @JvmField val msgC2cHead: C2CHead? = null,\n        @ProtoNumber(9) @JvmField val msgSconnHead: SConnHead? = null,\n        @ProtoNumber(10) @JvmField val msgInstCtrl: InstCtrl? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class HttpConnHead(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val command: Int = 0,\n        @ProtoNumber(3) @JvmField val subCommand: Int = 0,\n        @ProtoNumber(4) @JvmField val seq: Int = 0,\n        @ProtoNumber(5) @JvmField val version: Int = 0,\n        @ProtoNumber(6) @JvmField val retryTimes: Int = 0,\n        @ProtoNumber(7) @JvmField val clientType: Int = 0,\n        @ProtoNumber(8) @JvmField val pubNo: Int = 0,\n        @ProtoNumber(9) @JvmField val localId: Int = 0,\n        @ProtoNumber(10) @JvmField val timeZone: Int = 0,\n        @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(11) @JvmField val clientIp: Int = 0,\n        @ProtoNumber(12) @JvmField val clientPort: Int = 0,\n        @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(13) @JvmField val qzhttpIp: Int = 0,\n        @ProtoNumber(14) @JvmField val qzhttpPort: Int = 0,\n        @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(15) @JvmField val sppIp: Int = 0,\n        @ProtoNumber(16) @JvmField val sppPort: Int = 0,\n        @ProtoNumber(17) @JvmField val flag: Int = 0,\n        @ProtoNumber(18) @JvmField val key: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(19) @JvmField val compressType: Int = 0,\n        @ProtoNumber(20) @JvmField val originSize: Int = 0,\n        @ProtoNumber(21) @JvmField val errorCode: Int = 0,\n        @ProtoNumber(22) @JvmField val msgRedirect: RedirectMsg? = null,\n        @ProtoNumber(23) @JvmField val commandId: Int = 0,\n        @ProtoNumber(24) @JvmField val serviceCmdid: Int = 0,\n        @ProtoNumber(25) @JvmField val msgOidbhead: TransOidbHead? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class InstCtrl(\n        @ProtoNumber(1) @JvmField val msgSendToInst: List<InstInfo> = emptyList(),\n        @ProtoNumber(2) @JvmField val msgExcludeInst: List<InstInfo> = emptyList(),\n        @ProtoNumber(3) @JvmField val msgFromInst: InstInfo? = InstInfo(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class InstInfo(\n        @ProtoNumber(1) @JvmField val apppid: Int = 0,\n        @ProtoNumber(2) @JvmField val instid: Int = 0,\n        @ProtoNumber(3) @JvmField val platform: Int = 0,\n        @ProtoNumber(10) @JvmField val enumDeviceType: Int /* enum */ = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class LoginSig(\n        @ProtoNumber(1) @JvmField val type: Int = 0,\n        @ProtoNumber(2) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RedirectMsg(\n        @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(1) @JvmField val lastRedirectIp: Int = 0,\n        @ProtoNumber(2) @JvmField val lastRedirectPort: Int = 0,\n        @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(3) @JvmField val redirectIp: Int = 0,\n        @ProtoNumber(4) @JvmField val redirectPort: Int = 0,\n        @ProtoNumber(5) @JvmField val redirectCount: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class S2CHead(\n        @ProtoNumber(1) @JvmField val subMsgtype: Int = 0,\n        @ProtoNumber(2) @JvmField val msgType: Int = 0,\n        @ProtoNumber(3) @JvmField val fromUin: Long = 0L,\n        @ProtoNumber(4) @JvmField val msgId: Int = 0,\n        @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(5) @JvmField val relayIp: Int = 0,\n        @ProtoNumber(6) @JvmField val relayPort: Int = 0,\n        @ProtoNumber(7) @JvmField val toUin: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SConnHead : ProtoBuf\n\n    @Serializable\n    internal class TransOidbHead(\n        @ProtoNumber(1) @JvmField val command: Int = 0,\n        @ProtoNumber(2) @JvmField val serviceType: Int = 0,\n        @ProtoNumber(3) @JvmField val result: Int = 0,\n        @ProtoNumber(4) @JvmField val errorMsg: String = \"\",\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class ImReceipt : ProtoBuf {\n    @Serializable\n    internal class MsgInfo(\n        @ProtoNumber(1) @JvmField val fromUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val msgSeq: Int = 0,\n        @ProtoNumber(4) @JvmField val msgRandom: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal data class ReceiptInfo(\n        @ProtoNumber(1) @JvmField val readTime: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReceiptReq(\n        @ProtoNumber(1) @JvmField val command: Int /* enum */ = 1,\n        @ProtoNumber(2) @JvmField val msgInfo: MsgInfo? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReceiptResp(\n        @ProtoNumber(1) @JvmField val command: Int /* enum */ = 1,\n        @ProtoNumber(2) @JvmField val receiptInfo: ReceiptInfo? = null,\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class ObjMsg : ProtoBuf {\n    @Serializable\n    internal class MsgContentInfo(\n        @ProtoNumber(1) @JvmField val contentInfoId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val msgFile: MsgFile? = null,\n    ) : ProtoBuf {\n        @Serializable\n        internal class MsgFile(\n            @ProtoNumber(1) @JvmField val busId: Int = 0,\n            @ProtoNumber(2) @JvmField val filePath: String = \"\", // actually uuid\n            @ProtoNumber(3) @JvmField val fileSize: Long = 0L,\n            @ProtoNumber(4) @JvmField val fileName: String = \"\",\n            @ProtoNumber(5) @JvmField val int64DeadTime: Long = 0L,\n            @ProtoNumber(6) @JvmField val fileSha1: ByteArray = EMPTY_BYTE_ARRAY, // empty\n            @ProtoNumber(7) @JvmField val ext: String = \"\", // originally bytes\n        ) : ProtoBuf\n    }\n\n    @Serializable\n    internal class MsgPic(\n        @ProtoNumber(1) @JvmField val smallPicUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val originalPicUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val localPicId: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ObjMsg(\n        @ProtoNumber(1) @JvmField val msgType: Int = 0,\n        @ProtoNumber(2) @JvmField val title: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val bytesAbstact: List<ByteArray> = emptyList(),\n        @ProtoNumber(5) @JvmField val titleExt: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val msgPic: List<MsgPic> = emptyList(),\n        @ProtoNumber(7) @JvmField val msgContentInfo: List<MsgContentInfo> = emptyList(),\n        @ProtoNumber(8) @JvmField val reportIdShow: Int = 0,\n    ) : ProtoBuf\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/MsgCommon.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\n/**\n * msf.msgcomm.msg_comm\n */\n@Serializable\ninternal class MsgComm : ProtoBuf {\n    @Serializable\n    internal class AppShareInfo(\n        @ProtoNumber(1) @JvmField val appshareId: Int = 0,\n        @ProtoNumber(2) @JvmField val appshareCookie: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val appshareResource: PluginInfo? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class C2CTmpMsgHead(\n        @ProtoNumber(1) @JvmField val c2cType: Int = 0,\n        @ProtoNumber(2) @JvmField val serviceType: Int = 0,\n        @ProtoNumber(3) @JvmField val groupUin: Long = 0L,\n        @ProtoNumber(4) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(5) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val sigType: Int = 0,\n        @ProtoNumber(7) @JvmField val fromPhone: String = \"\",\n        @ProtoNumber(8) @JvmField val toPhone: String = \"\",\n        @ProtoNumber(9) @JvmField val lockDisplay: Int = 0,\n        @ProtoNumber(10) @JvmField val directionFlag: Int = 0,\n        @ProtoNumber(11) @JvmField val reserved: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ContentHead(\n        @ProtoNumber(1) @JvmField val pkgNum: Int = 0,\n        @ProtoNumber(2) @JvmField val pkgIndex: Int = 0,\n        @ProtoNumber(3) @JvmField val divSeq: Int = 0,\n        @ProtoNumber(4) @JvmField val autoReply: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DiscussInfo(\n        @ProtoNumber(1) @JvmField val discussUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val discussType: Int = 0,\n        @ProtoNumber(3) @JvmField val discussInfoSeq: Long = 0L,\n        @ProtoNumber(4) @JvmField val discussRemark: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val discussName: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ExtGroupKeyInfo(\n        @ProtoNumber(1) @JvmField val curMaxSeq: Int = 0,\n        @ProtoNumber(2) @JvmField val curTime: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupInfo(\n        @ProtoNumber(1) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(2) @JvmField val groupType: Int = 0,\n        @ProtoNumber(3) @JvmField val groupInfoSeq: Long = 0L,\n        @ProtoNumber(4) @JvmField val groupCard: String = \"\",\n        @ProtoNumber(5) @JvmField val groupRank: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val groupLevel: Int = 0,\n        @ProtoNumber(7) @JvmField val groupCardType: Int = 0,\n        @ProtoNumber(8) @JvmField val groupName: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Msg(\n        @ProtoNumber(1) @JvmField val msgHead: MsgHead,\n        @ProtoNumber(2) @JvmField val contentHead: ContentHead? = null,\n        @ProtoNumber(3) @JvmField val msgBody: ImMsgBody.MsgBody,\n        @ProtoNumber(4) @JvmField val appshareInfo: AppShareInfo? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgHead(\n        @ProtoNumber(1) @JvmField val fromUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val msgType: Int = 0,\n        @ProtoNumber(4) @JvmField val c2cCmd: Int = 0,\n        @ProtoNumber(5) @JvmField val msgSeq: Int = 0,\n        @ProtoNumber(6) @JvmField val msgTime: Int = 0,\n        @ProtoNumber(7) var msgUid: Long = 0L,\n        @ProtoNumber(8) @JvmField val c2cTmpMsgHead: C2CTmpMsgHead? = null,\n        @ProtoNumber(9) @JvmField val groupInfo: GroupInfo? = null,\n        /**\n         * 1: 群消息 by pc tim\n         * 1001: 群消息 sent by android phone\n         *\n         *\n         * 3116: music share, ANDROID_PHONE 发送\n         */\n        @ProtoNumber(10) @JvmField val fromAppid: Int = 0,\n        @ProtoNumber(11) @JvmField val fromInstid: Int = 0,\n        @ProtoNumber(12) @JvmField val userActive: Int = 0,\n        @ProtoNumber(13) @JvmField val discussInfo: DiscussInfo? = null,\n        @ProtoNumber(14) @JvmField val fromNick: String = \"\",\n        @ProtoNumber(15) @JvmField val authUin: Long = 0L,\n        @ProtoNumber(16) @JvmField val authNick: String = \"\",\n        @ProtoNumber(17) @JvmField val msgFlag: Int = 0,\n        @ProtoNumber(18) @JvmField val authRemark: String = \"\",\n        @ProtoNumber(19) @JvmField val groupName: String = \"\",\n        @ProtoNumber(20) @JvmField val mutiltransHead: MutilTransHead? = null,\n        @ProtoNumber(21) @JvmField val msgInstCtrl: ImMsgHead.InstCtrl? = null,\n        @ProtoNumber(22) @JvmField val publicAccountGroupSendFlag: Int = 0,\n        @ProtoNumber(23) @JvmField val wseqInC2cMsghead: Int = 0,\n        @ProtoNumber(24) @JvmField val cpid: Long = 0L,\n        @ProtoNumber(25) @JvmField val extGroupKeyInfo: ExtGroupKeyInfo? = null,\n        @ProtoNumber(26) @JvmField val multiCompatibleText: String = \"\",\n        @ProtoNumber(27) @JvmField val authSex: Int = 0,\n        @ProtoNumber(28) @JvmField val isSrcMsg: Boolean = false,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgType0x210(\n        @ProtoNumber(1) @JvmField val subMsgType: Int = 0,\n        @ProtoNumber(2) @JvmField val msgContent: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MutilTransHead(\n        @ProtoNumber(1) @JvmField val status: Int = 0,\n        @ProtoNumber(2) @JvmField val msgId: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PluginInfo(\n        @ProtoNumber(1) @JvmField val resId: Int = 0,\n        @ProtoNumber(2) @JvmField val pkgName: String = \"\",\n        @ProtoNumber(3) @JvmField val newVer: Int = 0,\n        @ProtoNumber(4) @JvmField val resType: Int = 0,\n        @ProtoNumber(5) @JvmField val lanType: Int = 0,\n        @ProtoNumber(6) @JvmField val priority: Int = 0,\n        @ProtoNumber(7) @JvmField val resName: String = \"\",\n        @ProtoNumber(8) @JvmField val resDesc: String = \"\",\n        @ProtoNumber(9) @JvmField val resUrlBig: String = \"\",\n        @ProtoNumber(10) @JvmField val resUrlSmall: String = \"\",\n        @ProtoNumber(11) @JvmField val resConf: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Uin2Nick(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val nick: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class UinPairMsg(\n        @ProtoNumber(1) @JvmField val lastReadTime: Int = 0,\n        @ProtoNumber(2) @JvmField val peerUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val msgCompleted: Int = 0,\n        @ProtoNumber(4) @JvmField val msg: List<Msg> = emptyList(),\n        @ProtoNumber(5) @JvmField val unreadMsgNum: Int = 0,\n        @ProtoNumber(8) @JvmField val c2cType: Int = 0,\n        @ProtoNumber(9) @JvmField val serviceType: Int = 0,\n        @ProtoNumber(10) @JvmField val pbReserve: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/MsgRevokeUserDef.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport kotlin.jvm.JvmField\n\ninternal class MsgRevokeUserDef : ProtoBuf {\n    @Serializable\n    internal class MsgInfoUserDef(\n        @ProtoNumber(1) @JvmField val longMessageFlag: Int,\n        @ProtoNumber(2) @JvmField val longMsgInfo: List<MsgInfoDef> = emptyList(),\n        @ProtoNumber(3) @JvmField val fileUuid: List<String> = listOf()\n    ) : ProtoBuf {\n        @Serializable\n        internal class MsgInfoDef(\n            @ProtoNumber(1) @JvmField val msgSeq: Int = 0,\n            @ProtoNumber(2) @JvmField val longMsgId: Int = 0,\n            @ProtoNumber(3) @JvmField val longMsgNum: Int = 0,\n            @ProtoNumber(4) @JvmField val longMsgIndex: Int = 0\n        ) : ProtoBuf\n    }\n\n    @Serializable\n    internal class UinTypeUserDef(\n        @ProtoNumber(1) @JvmField val fromUinType: Int,\n        @ProtoNumber(2) @JvmField val fromGroupCode: Long = 0L,\n        @ProtoNumber(3) @JvmField val fileUuid: List<String> = emptyList()\n    ) : ProtoBuf\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/MsgSvc.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.CheckableResponseB\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class MsgSvc : ProtoBuf {\n    @Serializable\n    internal class Grp(\n        @ProtoNumber(1) @JvmField val groupCode: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbGetMsgResp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val errmsg: String = \"\",\n        @ProtoNumber(3) @JvmField val syncCookie: ByteArray? = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val syncFlag: SyncFlag = SyncFlag.CONTINUE,\n        @ProtoNumber(5) @JvmField val uinPairMsgs: List<MsgComm.UinPairMsg> = emptyList(),\n        @ProtoNumber(6) @JvmField val bindUin: Long = 0L,\n        @ProtoNumber(7) @JvmField val msgRspType: Int = 0,\n        @ProtoNumber(8) @JvmField val pubAccountCookie: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(9) @JvmField val isPartialSync: Boolean = false,\n        @ProtoNumber(10) @JvmField val msgCtrlBuf: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbGroupMsgWithDrawReq(\n        @ProtoNumber(1) @JvmField val subCmd: Int,\n        @ProtoNumber(2) @JvmField val groupType: Int,\n        @ProtoNumber(3) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(4) @JvmField val msgList: List<MessageInfo> = emptyList(),\n        @ProtoNumber(5) @JvmField val userdef: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf {\n        @Serializable\n        internal class MessageInfo(\n            @ProtoNumber(1) @JvmField val msgSeq: Int = 0,\n            @ProtoNumber(2) @JvmField val msgRandom: Int = 0,\n            @ProtoNumber(3) @JvmField val msgType: Int = 0,\n        )\n    }\n\n    @Serializable\n    internal class PbGroupReadedReportReq(\n        @ProtoNumber(1) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(2) @JvmField val lastReadSeq: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class BusinessWPATmp(\n        @ProtoNumber(1) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val sigt: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class C2C(\n        @ProtoNumber(1) @JvmField val toUin: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbGetGroupMsgReq(\n        @ProtoNumber(1) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(2) @JvmField val beginSeq: Long = 0L,\n        @ProtoNumber(3) @JvmField val endSeq: Long = 0L,\n        @ProtoNumber(4) @JvmField val filter: Int /* enum */ = 0,\n        @ProtoNumber(5) @JvmField val memberSeq: Long = 0L,\n        @ProtoNumber(6) @JvmField val publicGroup: Boolean = false,\n        @ProtoNumber(7) @JvmField val shieldFlag: Int = 0,\n        @ProtoNumber(8) @JvmField val saveTrafficFlag: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbBindUinMsgReadedConfirmReq(\n        @ProtoNumber(1) @JvmField val syncCookie: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val bindUin: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class AccostTmp(\n        @ProtoNumber(1) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val reply: Boolean = false,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbDiscussReadedReportResp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val errmsg: String = \"\",\n        @ProtoNumber(3) @JvmField val confUin: Long = 0L,\n        @ProtoNumber(4) @JvmField val memberSeq: Long = 0L,\n        @ProtoNumber(5) @JvmField val confSeq: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NearByAssistantTmp(\n        @ProtoNumber(1) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val reply: Boolean = false,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgSendInfo(\n        @ProtoNumber(1) @JvmField val receiver: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PubGroupTmp(\n        @ProtoNumber(1) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val groupUin: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class AddressListTmp(\n        @ProtoNumber(1) @JvmField val fromPhone: String = \"\",\n        @ProtoNumber(2) @JvmField val toPhone: String = \"\",\n        @ProtoNumber(3) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(4) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val fromContactSize: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DisTmp(\n        @ProtoNumber(1) @JvmField val disUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val toUin: Long = 0L,\n    )\n\n    @Serializable\n    internal class PbMsgWithDrawResp(\n        @ProtoNumber(1) @JvmField val c2cWithDraw: List<PbC2CMsgWithDrawResp> = emptyList(),\n        @ProtoNumber(2) @JvmField val groupWithDraw: List<PbGroupMsgWithDrawResp> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class AuthTmp(\n        @ProtoNumber(1) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbMsgWithDrawReq(\n        @ProtoNumber(1) @JvmField val c2cWithDraw: List<PbC2CMsgWithDrawReq> = emptyList(),\n        @ProtoNumber(2) @JvmField val groupWithDraw: List<PbGroupMsgWithDrawReq> = emptyList(),\n    ) : ProtoBuf\n\n    internal enum class SyncFlag {\n        START,\n        CONTINUE,\n        STOP\n    }\n\n    @Serializable\n    internal class PbGetMsgReq(\n        @ProtoNumber(1) @JvmField val syncFlag: SyncFlag,\n        @ProtoNumber(2) @JvmField val syncCookie: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val rambleFlag: Int = 1,\n        @ProtoNumber(4) @JvmField val latestRambleNumber: Int = 20,\n        @ProtoNumber(5) @JvmField val otherRambleNumber: Int = 3,\n        @ProtoNumber(6) @JvmField val onlineSyncFlag: Int = 1,\n        @ProtoNumber(7) @JvmField val contextFlag: Int = 0,\n        @ProtoNumber(8) @JvmField val whisperSessionId: Int = 0,\n        @ProtoNumber(9) @JvmField val msgReqType: Int = 0,\n        @ProtoNumber(10) @JvmField val pubaccountCookie: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(11) @JvmField val msgCtrlBuf: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(12) @JvmField val serverBuf: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbGetOneDayRoamMsgReq(\n        @ProtoNumber(1) @JvmField val peerUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val lastMsgtime: Long = 0L,\n        @ProtoNumber(3) @JvmField val random: Long = 0L,\n        @ProtoNumber(4) @JvmField val readCnt: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GrpTmp(\n        @ProtoNumber(1) @JvmField val groupUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val toUin: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbGetDiscussMsgResp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val errmsg: String = \"\",\n        @ProtoNumber(3) @JvmField val discussUin: Long = 0L,\n        @ProtoNumber(4) @JvmField val returnEndSeq: Long = 0L,\n        @ProtoNumber(5) @JvmField val returnBeginSeq: Long = 0L,\n        @ProtoNumber(6) @JvmField val msg: List<MsgComm.Msg> = emptyList(),\n        @ProtoNumber(7) @JvmField val lastGetTime: Long = 0L,\n        @ProtoNumber(8) @JvmField val discussInfoSeq: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CommTmp(\n        @ProtoNumber(1) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val c2cType: Int = 0,\n        @ProtoNumber(3) @JvmField val svrType: Int = 0,\n        @ProtoNumber(4) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val reserved: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbGroupMsgWithDrawResp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val errmsg: String = \"\",\n        @ProtoNumber(3) @JvmField val subCmd: Int = 0,\n        @ProtoNumber(4) @JvmField val groupType: Int = 0,\n        @ProtoNumber(5) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(6) @JvmField val failedMsgList: List<MessageResult> = emptyList(),\n        @ProtoNumber(7) @JvmField val userdef: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf {\n        @Serializable\n        internal class MessageResult(\n            @ProtoNumber(1) @JvmField val result: Int = 0,\n            @ProtoNumber(2) @JvmField val msgSeq: Int = 0,\n            @ProtoNumber(3) @JvmField val msgTime: Int = 0,\n            @ProtoNumber(4) @JvmField val msgRandom: Int = 0,\n            @ProtoNumber(5) @JvmField val errMsg: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val msgType: Int = 0,\n        ) : ProtoBuf\n    }\n\n    @Serializable\n    internal class PbC2CReadedReportResp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val errmsg: String = \"\",\n        @ProtoNumber(3) @JvmField val syncCookie: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbC2CUnReadMsgNumReq : ProtoBuf\n\n    @Serializable\n    internal class PbC2CMsgWithDrawReq(\n        @ProtoNumber(1) @JvmField val msgInfo: List<MsgInfo> = emptyList(),\n        @ProtoNumber(2) @JvmField val longMessageFlag: Int,\n        @ProtoNumber(3) @JvmField val reserved: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val subCmd: Int = 0,\n    ) : ProtoBuf {\n        @Serializable\n        internal class MsgInfo(\n            @ProtoNumber(1) @JvmField val fromUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val toUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val msgSeq: Int = 0,\n            @ProtoNumber(4) @JvmField val msgUid: Long = 0L,\n            @ProtoNumber(5) @JvmField val msgTime: Long = 0L,\n            @ProtoNumber(6) @JvmField val msgRandom: Int = 0,\n            @ProtoNumber(7) @JvmField val pkgNum: Int = 0,\n            @ProtoNumber(8) @JvmField val pkgIndex: Int = 0,\n            @ProtoNumber(9) @JvmField val divSeq: Int = 0,\n            @ProtoNumber(10) @JvmField val msgType: Int,\n            @ProtoNumber(20) @JvmField val routingHead: RoutingHead? = null,\n        )\n    }\n\n    @Serializable\n    internal class PbDelRoamMsgResp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val errmsg: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Dis(\n        @ProtoNumber(1) @JvmField val disUin: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TransSvrInfo(\n        @ProtoNumber(1) @JvmField val subType: Int = 0,\n        @ProtoNumber(2) @JvmField val int32RetCode: Int = 0,\n        @ProtoNumber(3) @JvmField val errMsg: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val transInfo: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbPullGroupMsgSeqResp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val errmsg: String = \"\",\n        @ProtoNumber(3) @JvmField val groupInfoResp: List<GroupInfoResp> = emptyList(),\n    ) : ProtoBuf {\n        @Serializable\n        internal class GroupInfoResp(\n            @ProtoNumber(1) @JvmField val groupCode: Long = 0L,\n            @ProtoNumber(2) @JvmField val memberSeq: Long = 0L,\n            @ProtoNumber(3) @JvmField val groupSeq: Long = 0L,\n        )\n    }\n\n    @Serializable\n    internal class PbSendMsgReq(\n        @ProtoNumber(1) @JvmField val routingHead: RoutingHead? = null,\n        @ProtoNumber(2) @JvmField val contentHead: MsgComm.ContentHead? = null,\n        @ProtoNumber(3) @JvmField val msgBody: ImMsgBody.MsgBody = ImMsgBody.MsgBody(),\n        @ProtoNumber(4) @JvmField val msgSeq: Int = 0,\n        @ProtoNumber(5) @JvmField val msgRand: Int = 0,\n        @ProtoNumber(6) @JvmField val syncCookie: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val appShare: MsgComm.AppShareInfo? = null,\n        @ProtoNumber(8) @JvmField val msgVia: Int = 0,\n        @ProtoNumber(9) @JvmField val dataStatist: Int = 0,\n        @ProtoNumber(10) @JvmField val multiMsgAssist: MultiMsgAssist? = null,\n        @ProtoNumber(11) @JvmField val inputNotifyInfo: PbInputNotifyInfo? = null,\n        @ProtoNumber(12) @JvmField val msgCtrl: MsgCtrl.MsgCtrl? = null,\n        @ProtoNumber(13) @JvmField val receiptReq: ImReceipt.ReceiptReq? = null,\n        @ProtoNumber(14) @JvmField val multiSendSeq: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TransMsg(\n        @ProtoNumber(1) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val c2cCmd: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbDeleteMsgResp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val errmsg: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbSearchRoamMsgInCloudResp(\n        @ProtoNumber(1) @JvmField val msg: List<MsgComm.Msg> = emptyList(),\n        @ProtoNumber(2) @JvmField val serializeRspbody: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbInputNotifyInfo(\n        @ProtoNumber(1) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val ime: Int = 0,\n        @ProtoNumber(3) @JvmField val notifyFlag: Int = 0,\n        @ProtoNumber(4) @JvmField val pbReserve: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val iosPushWording: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbUnReadMsgSeqResp(\n        @ProtoNumber(1) @JvmField val c2cUnreadInfo: PbC2CUnReadMsgNumResp? = null,\n        @ProtoNumber(2) @JvmField val binduinUnreadInfo: List<PbBindUinUnReadMsgNumResp> = emptyList(),\n        @ProtoNumber(3) @JvmField val groupUnreadInfo: PbPullGroupMsgSeqResp? = null,\n        @ProtoNumber(4) @JvmField val discussUnreadInfo: PbPullDiscussMsgSeqResp? = null,\n        @ProtoNumber(5) @JvmField val thirdqqUnreadInfo: PbThirdQQUnReadMsgNumResp? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbDeleteMsgReq(\n        @ProtoNumber(1) @JvmField val msgItems: List<MsgItem> = emptyList(),\n    ) : ProtoBuf {\n        @Serializable\n        internal class MsgItem(\n            @ProtoNumber(1) @JvmField val fromUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val toUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val msgType: Int = 0,\n            @ProtoNumber(4) @JvmField val msgSeq: Int = 0,\n            @ProtoNumber(5) @JvmField val msgUid: Long = 0L,\n            @ProtoNumber(7) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n\n    @Serializable\n    internal class MultiMsgAssist(\n        @ProtoNumber(1) @JvmField val repeatedRouting: List<RoutingHead> = emptyList(),\n        @ProtoNumber(2) @JvmField val msgUse: Int /* enum */ = 1,\n        @ProtoNumber(3) @JvmField val tempId: Long = 0L,\n        @ProtoNumber(4) @JvmField val vedioLen: Long = 0L,\n        @ProtoNumber(5) @JvmField val redbagId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val redbagAmount: Long = 0L,\n        @ProtoNumber(7) @JvmField val hasReadbag: Int = 0,\n        @ProtoNumber(8) @JvmField val hasVedio: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbMsgReadedReportReq(\n        @ProtoNumber(1) @JvmField val grpReadReport: List<PbGroupReadedReportReq> = emptyList(),\n        @ProtoNumber(2) @JvmField val disReadReport: List<PbDiscussReadedReportReq> = emptyList(),\n        @ProtoNumber(3) @JvmField val c2cReadReport: PbC2CReadedReportReq? = null,\n        @ProtoNumber(4) @JvmField val bindUinReadReport: PbBindUinMsgReadedConfirmReq? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbGetOneDayRoamMsgResp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val errmsg: String = \"\",\n        @ProtoNumber(3) @JvmField val peerUin: Long = 0L,\n        @ProtoNumber(4) @JvmField val lastMsgtime: Long = 0L,\n        @ProtoNumber(5) @JvmField val random: Long = 0L,\n        @ProtoNumber(6) @JvmField val msg: List<MsgComm.Msg> = emptyList(),\n        @ProtoNumber(7) @JvmField val iscomplete: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbBindUinGetMsgReq(\n        @ProtoNumber(1) @JvmField val bindUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val bindUinSig: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val syncFlag: Int /* enum */ = 0,\n        @ProtoNumber(4) @JvmField val syncCookie: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NearByDatingTmp(\n        @ProtoNumber(1) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val reply: Boolean = false,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class BsnsTmp(\n        @ProtoNumber(1) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RoutingHead(\n        @ProtoNumber(1) @JvmField val c2c: C2C? = null,\n        @ProtoNumber(2) @JvmField val grp: Grp? = null,\n        @ProtoNumber(3) @JvmField val grpTmp: GrpTmp? = null,\n        @ProtoNumber(4) @JvmField val dis: Dis? = null,\n        @ProtoNumber(5) @JvmField val disTmp: DisTmp? = null,\n        @ProtoNumber(6) @JvmField val wpaTmp: WPATmp? = null,\n        @ProtoNumber(7) @JvmField val secretFile: SecretFileHead? = null,\n        @ProtoNumber(8) @JvmField val publicPlat: PublicPlat? = null,\n        @ProtoNumber(9) @JvmField val transMsg: TransMsg? = null,\n        @ProtoNumber(10) @JvmField val addressList: AddressListTmp? = null,\n        @ProtoNumber(11) @JvmField val richStatusTmp: RichStatusTmp? = null,\n        @ProtoNumber(12) @JvmField val transCmd: TransCmd? = null,\n        @ProtoNumber(13) @JvmField val accostTmp: AccostTmp? = null,\n        @ProtoNumber(14) @JvmField val pubGroupTmp: PubGroupTmp? = null,\n        @ProtoNumber(15) @JvmField val trans0x211: Trans0x211? = null,\n        @ProtoNumber(16) @JvmField val businessWpaTmp: BusinessWPATmp? = null,\n        @ProtoNumber(17) @JvmField val authTmp: AuthTmp? = null,\n        @ProtoNumber(18) @JvmField val bsnsTmp: BsnsTmp? = null,\n        @ProtoNumber(19) @JvmField val qqQuerybusinessTmp: QQQueryBusinessTmp? = null,\n        @ProtoNumber(20) @JvmField val nearbyDatingTmp: NearByDatingTmp? = null,\n        @ProtoNumber(21) @JvmField val nearbyAssistantTmp: NearByAssistantTmp? = null,\n        @ProtoNumber(22) @JvmField val commTmp: CommTmp? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TransResp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val errmsg: String = \"\",\n        @ProtoNumber(3) @JvmField val respTag: Int = 0,\n        @ProtoNumber(4) @JvmField val respBuff: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbSendMsgResp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val errmsg: String = \"\",\n        @ProtoNumber(3) @JvmField val sendTime: Int = 0,\n        @ProtoNumber(4) @JvmField val svrbusyWaitTime: Int = 0,\n        @ProtoNumber(5) @JvmField val msgSendInfo: MsgSendInfo? = null,\n        @ProtoNumber(6) @JvmField val errtype: Int = 0,\n        @ProtoNumber(7) @JvmField val transSvrInfo: TransSvrInfo? = null,\n        @ProtoNumber(8) @JvmField val receiptResp: ImReceipt.ReceiptResp? = null,\n        @ProtoNumber(9) @JvmField val textAnalysisResult: Int = 0,\n    ) : ProtoBuf, Packet\n\n    @Serializable\n    internal class PbBindUinUnReadMsgNumResp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val errmsg: String = \"\",\n        @ProtoNumber(3) @JvmField val bindUin: Long = 0L,\n        @ProtoNumber(4) @JvmField val msgNum: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbGetDiscussMsgReq(\n        @ProtoNumber(1) @JvmField val discussUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val endSeq: Long = 0L,\n        @ProtoNumber(3) @JvmField val beginSeq: Long = 0L,\n        @ProtoNumber(4) @JvmField val lastGetTime: Long = 0L,\n        @ProtoNumber(5) @JvmField val discussInfoSeq: Long = 0L,\n        @ProtoNumber(6) @JvmField val filter: Int /* enum */ = 0,\n        @ProtoNumber(7) @JvmField val memberSeq: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbC2CMsgWithDrawResp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val errmsg: String = \"\",\n        @ProtoNumber(3) @JvmField val msgStatus: List<MsgStatus> = emptyList(),\n        @ProtoNumber(4) @JvmField val subCmd: Int = 0,\n    ) : ProtoBuf {\n        @Serializable\n        internal class MsgStatus(\n            @ProtoNumber(1) @JvmField val msgInfo: PbC2CMsgWithDrawReq.MsgInfo? = null,\n            @ProtoNumber(2) @JvmField val status: Int = 0,\n        ) : ProtoBuf\n    }\n\n    @Serializable\n    internal class SecretFileHead(\n        @ProtoNumber(1) @JvmField val secretFileMsg: SubMsgType0xc1.MsgBody? = null,\n        //    @ProtoNumber(2) @JvmField val secretFileStatus: SubMsgType0x1a.MsgBody? = null\n    )\n\n    @Serializable\n    internal class PbGetRoamMsgReq(\n        @ProtoNumber(1) @JvmField val peerUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val lastMsgtime: Long = 0L,\n        @ProtoNumber(3) @JvmField val random: Long = 0L,\n        @ProtoNumber(4) @JvmField val readCnt: Int = 0,\n        @ProtoNumber(5) @JvmField val checkPwd: Int = 0,\n        @ProtoNumber(6) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val pwd: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val subcmd: Int = 0,\n        @ProtoNumber(9) @JvmField val beginMsgtime: Long = 0L,\n        @ProtoNumber(10) @JvmField val reqType: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TransCmd(\n        @ProtoNumber(1) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val msgType: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbMsgReadedReportResp(\n        @ProtoNumber(1) @JvmField val grpReadReport: List<PbGroupReadedReportResp> = emptyList(),\n        @ProtoNumber(2) @JvmField val disReadReport: List<PbDiscussReadedReportResp> = emptyList(),\n        @ProtoNumber(3) @JvmField val c2cReadReport: PbC2CReadedReportResp? = null,\n        @ProtoNumber(4) @JvmField val bindUinReadReport: PbBindUinMsgReadedConfirmResp? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbThirdQQUnReadMsgNumResp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val errmsg: String = \"\",\n        @ProtoNumber(3) @JvmField val thirdqqRespInfo: List<ThirdQQRespInfo> = emptyList(),\n        @ProtoNumber(4) @JvmField val interval: Int = 0,\n    ) : ProtoBuf {\n        @Serializable\n        internal class ThirdQQRespInfo(\n            @ProtoNumber(1) @JvmField val thirdUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val thirdUinCookie: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val msgNum: Int = 0,\n            @ProtoNumber(4) @JvmField val msgFlag: Int = 0,\n            @ProtoNumber(5) @JvmField val redbagTime: Int = 0,\n            @ProtoNumber(6) @JvmField val status: Int = 0,\n            @ProtoNumber(7) @JvmField val lastMsgTime: Int = 0,\n        ) : ProtoBuf\n    }\n\n    @Serializable\n    internal class RichStatusTmp(\n        @ProtoNumber(1) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class QQQueryBusinessTmp(\n        @ProtoNumber(1) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbDelRoamMsgReq(\n        @ProtoNumber(1) @JvmField val c2cMsg: C2CMsg? = null,\n        @ProtoNumber(2) @JvmField val grpMsg: GrpMsg? = null,\n        @ProtoNumber(3) @JvmField val disMsg: DisMsg? = null,\n    ) : ProtoBuf {\n        @Serializable\n        internal class GrpMsg(\n            @ProtoNumber(1) @JvmField val groupCode: Long = 0L,\n            @ProtoNumber(2) @JvmField val msgSeq: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class C2CMsg(\n            @ProtoNumber(1) @JvmField val fromUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val peerUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val msgTime: Int = 0,\n            @ProtoNumber(4) @JvmField val msgRandom: Int = 0,\n            @ProtoNumber(5) @JvmField val msgSeq: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class DisMsg(\n            @ProtoNumber(1) @JvmField val discussUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val msgSeq: Long = 0L,\n        ) : ProtoBuf\n    }\n\n    @Serializable\n    internal class PbUnReadMsgSeqReq(\n        @ProtoNumber(1) @JvmField val c2cUnreadInfo: PbC2CUnReadMsgNumReq? = null,\n        @ProtoNumber(2) @JvmField val binduinUnreadInfo: List<PbBindUinUnReadMsgNumReq> = emptyList(),\n        @ProtoNumber(3) @JvmField val groupUnreadInfo: PbPullGroupMsgSeqReq? = null,\n        @ProtoNumber(4) @JvmField val discussUnreadInfo: PbPullDiscussMsgSeqReq? = null,\n        @ProtoNumber(5) @JvmField val thirdqqUnreadInfo: PbThirdQQUnReadMsgNumReq? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbPullDiscussMsgSeqResp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val errmsg: String = \"\",\n        @ProtoNumber(3) @JvmField val discussInfoResp: List<DiscussInfoResp> = emptyList(),\n    ) : ProtoBuf {\n        @Serializable\n        internal class DiscussInfoResp(\n            @ProtoNumber(1) @JvmField val confUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val memberSeq: Long = 0L,\n            @ProtoNumber(3) @JvmField val confSeq: Long = 0L,\n        ) : ProtoBuf\n    }\n\n    @Serializable\n    internal class PbPullDiscussMsgSeqReq(\n        @ProtoNumber(1) @JvmField val discussInfoReq: List<DiscussInfoReq> = emptyList(),\n    ) : ProtoBuf {\n        @Serializable\n        internal class DiscussInfoReq(\n            @ProtoNumber(1) @JvmField val confUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val lastSeq: Long = 0L,\n        ) : ProtoBuf\n    }\n\n    @Serializable\n    internal class WPATmp(\n        @ProtoNumber(1) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PublicPlat(\n        @ProtoNumber(1) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbBindUinMsgReadedConfirmResp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val errmsg: String = \"\",\n        @ProtoNumber(3) @JvmField val syncCookie: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val bindUin: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbGetRoamMsgResp(\n        @ProtoNumber(1) override val result: Int = 0,\n        @ProtoNumber(2) override val errmsg: String = \"\",\n        @ProtoNumber(3) @JvmField val peerUin: Long = 0L,\n        @ProtoNumber(4) @JvmField val lastMsgtime: Long = 0L,\n        @ProtoNumber(5) @JvmField val random: Long = 0L,\n        @ProtoNumber(6) @JvmField val msg: List<MsgComm.Msg> = emptyList(),\n        @ProtoNumber(7) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf, CheckableResponseB()\n\n    @Serializable\n    internal class PbDiscussReadedReportReq(\n        @ProtoNumber(1) @JvmField val confUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val lastReadSeq: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbC2CReadedReportReq(\n        @ProtoNumber(1) @JvmField val syncCookie: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val pairInfo: List<UinPairReadInfo> = emptyList(),\n    ) : ProtoBuf {\n        @Serializable\n        internal class UinPairReadInfo(\n            @ProtoNumber(1) @JvmField val peerUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val lastReadTime: Int = 0,\n            @ProtoNumber(3) @JvmField val crmSig: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n\n    @Serializable\n    internal class Trans0x211(\n        @ProtoNumber(1) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val ccCmd: Int = 0,\n        @ProtoNumber(3) @JvmField val instCtrl: ImMsgHead.InstCtrl? = null,\n        @ProtoNumber(4) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val c2cType: Int = 0,\n        @ProtoNumber(6) @JvmField val serviceType: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbSearchRoamMsgInCloudReq(\n        @ProtoNumber(1) @JvmField val serializeReqbody: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbBindUinUnReadMsgNumReq(\n        @ProtoNumber(1) @JvmField val bindUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val syncCookie: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbC2CUnReadMsgNumResp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val errmsg: String = \"\",\n        @ProtoNumber(3) @JvmField val msgNum: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbPullGroupMsgSeqReq(\n        @ProtoNumber(1) @JvmField val groupInfoReq: List<GroupInfoReq> = emptyList(),\n    ) : ProtoBuf {\n        @Serializable\n        internal class GroupInfoReq(\n            @ProtoNumber(1) @JvmField val groupCode: Long = 0L,\n            @ProtoNumber(2) @JvmField val lastSeq: Long = 0L,\n        ) : ProtoBuf\n    }\n\n    @Serializable\n    internal class TransReq(\n        @ProtoNumber(1) @JvmField val command: Int = 0,\n        @ProtoNumber(2) @JvmField val reqTag: Int = 0,\n        @ProtoNumber(3) @JvmField val reqBuff: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbGroupReadedReportResp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val errmsg: String = \"\",\n        @ProtoNumber(3) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(4) @JvmField val memberSeq: Long = 0L,\n        @ProtoNumber(5) @JvmField val groupMsgSeq: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbGetGroupMsgResp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val errmsg: String = \"\",\n        @ProtoNumber(3) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(4) @JvmField val returnBeginSeq: Long = 0L,\n        @ProtoNumber(5) @JvmField val returnEndSeq: Long = 0L,\n        @ProtoNumber(6) @JvmField val msg: List<MsgComm.Msg> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbThirdQQUnReadMsgNumReq(\n        @ProtoNumber(1) @JvmField val thirdqqReqInfo: List<ThirdQQReqInfo> = emptyList(),\n        @ProtoNumber(2) @JvmField val source: Int = 0,\n    ) : ProtoBuf {\n        @Serializable\n        internal class ThirdQQReqInfo(\n            @ProtoNumber(1) @JvmField val thirdUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val thirdUinSig: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val thirdUinCookie: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n@Serializable\ninternal class MsgCtrl {\n    @Serializable\n    internal class MsgCtrl(\n        @ProtoNumber(1) @JvmField val msgFlag: Int = 0,\n        @ProtoNumber(2) @JvmField val resvResvInfo: ResvResvInfo? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ResvResvInfo(\n        @ProtoNumber(1) @JvmField val flag: Int = 0,\n        @ProtoNumber(2) @JvmField val reserv1: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val reserv2: Long = 0L,\n        @ProtoNumber(4) @JvmField val reserv3: Long = 0L,\n        @ProtoNumber(5) @JvmField val createTime: Int = 0,\n        @ProtoNumber(6) @JvmField val picHeight: Int = 0,\n        @ProtoNumber(7) @JvmField val picWidth: Int = 0,\n        @ProtoNumber(8) @JvmField val resvFlag: Int = 0,\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class SubMsgType0xc1 {\n    @Serializable\n    internal class NotOnlineImage(\n        @ProtoNumber(1) @JvmField val filePath: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val fileLen: Int = 0,\n        @ProtoNumber(3) @JvmField val downloadPath: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val oldVerSendFile: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val imgType: Int = 0,\n        @ProtoNumber(6) @JvmField val previewsImage: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val picMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val picHeight: Int = 0,\n        @ProtoNumber(9) @JvmField val picWidth: Int = 0,\n        @ProtoNumber(10) @JvmField val resId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(11) @JvmField val flag: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(12) @JvmField val downloadUrl: String = \"\",\n        @ProtoNumber(13) @JvmField val original: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgBody(\n        @ProtoNumber(1) @JvmField val fileKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val fromUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(4) @JvmField val status: Int = 0,\n        @ProtoNumber(5) @JvmField val ttl: Int = 0,\n        @ProtoNumber(6) @JvmField val type: Int = 0,\n        @ProtoNumber(7) @JvmField val encryptPreheadLength: Int = 0,\n        @ProtoNumber(8) @JvmField val encryptType: Int = 0,\n        @ProtoNumber(9) @JvmField val encryptKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(10) @JvmField val readTimes: Int = 0,\n        @ProtoNumber(11) @JvmField val leftTime: Int = 0,\n        @ProtoNumber(12) @JvmField val notOnlineImage: NotOnlineImage? = null,\n    ) : ProtoBuf\n}\n\n/*\n@Serializable\ninternal class SubMsgType0x1a {\n    @Serializable\n    internal class MsgBody(\n        @ProtoNumber(1) @JvmField val fileKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val fromUin_int32: Int = 0,\n        @ProtoNumber(3) @JvmField val toUin_int32: Int = 0,\n        @ProtoNumber(4) @JvmField val status: Int = 0,\n        @ProtoNumber(5) @JvmField val ttl: Int = 0,\n        @ProtoNumber(6) @JvmField val ingDesc: String = \"\",\n        @ProtoNumber(7) @JvmField val type: Int = 0,\n        @ProtoNumber(8) @JvmField val captureTimes: Int = 0,\n        @ProtoNumber(9) @JvmField val fromUin: Long = 0L,\n        @ProtoNumber(10) @JvmField val toUin: Long = 0L\n    ) : ProtoBuf\n}*/"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/MsgTransmit.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\ninternal class MsgTransmit : ProtoBuf {\n    @Serializable\n    internal class PbMultiMsgItem(\n        @ProtoNumber(1) @JvmField val fileName: String = \"\",\n        @ProtoNumber(2) @JvmField val buffer: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbMultiMsgNew(\n        @ProtoNumber(1) @JvmField val msg: List<MsgComm.Msg> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbMultiMsgTransmit(\n        @ProtoNumber(1) @JvmField val msg: List<MsgComm.Msg> = emptyList(),\n        @ProtoNumber(2) @JvmField val pbItemList: List<PbMultiMsgItem> = emptyList(),\n    ) : ProtoBuf\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/MultiMsg.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class MultiMsg : ProtoBuf {\n    @Serializable\n    internal class ExternMsg(\n        @ProtoNumber(1) @JvmField val channelType: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MultiMsgApplyDownReq(\n        @ProtoNumber(1) @JvmField val msgResid: String = \"\",\n        @ProtoNumber(2) @JvmField val msgType: Int = 0,\n        @ProtoNumber(3) @JvmField val srcUin: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MultiMsgApplyDownRsp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val thumbDownPara: String = \"\",\n        @ProtoNumber(3) @JvmField val msgKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val uint32DownIp: List<Int> = emptyList(),\n        @ProtoNumber(5) @JvmField val uint32DownPort: List<Int> = emptyList(),\n        @ProtoNumber(6) @JvmField val msgResid: String = \"\",\n        @ProtoNumber(7) @JvmField val msgExternInfo: ExternMsg? = null,\n        @ProtoNumber(8) @JvmField val bytesDownIpV6: List<ByteArray> = emptyList(),\n        @ProtoNumber(9) @JvmField val uint32DownV6Port: List<Int> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MultiMsgApplyUpReq(\n        @ProtoNumber(1) @JvmField val dstUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val msgSize: Long = 0L,\n        @ProtoNumber(3) @JvmField val msgMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val msgType: Int = 0,\n        @ProtoNumber(5) @JvmField val applyId: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MultiMsgApplyUpRsp(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val msgResid: String = \"\",\n        @ProtoNumber(3) @JvmField val msgUkey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val uint32UpIp: List<Int> = emptyList(),\n        @ProtoNumber(5) @JvmField val uint32UpPort: List<Int> = emptyList(),\n        @ProtoNumber(6) @JvmField val blockSize: Long = 0L,\n        @ProtoNumber(7) @JvmField val upOffset: Long = 0L,\n        @ProtoNumber(8) @JvmField val applyId: Int = 0,\n        @ProtoNumber(9) @JvmField val msgKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(10) @JvmField val msgSig: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(11) @JvmField val msgExternInfo: ExternMsg? = null,\n        @ProtoNumber(12) @JvmField val bytesUpIpV6: List<ByteArray> = emptyList(),\n        @ProtoNumber(13) @JvmField val uint32UpV6Port: List<Int> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val subcmd: Int = 0,\n        @ProtoNumber(2) @JvmField val termType: Int = 0,\n        @ProtoNumber(3) @JvmField val platformType: Int = 0,\n        @ProtoNumber(4) @JvmField val netType: Int = 0,\n        @ProtoNumber(5) @JvmField val buildVer: String = \"\",\n        @ProtoNumber(6) @JvmField val multimsgApplyupReq: List<MultiMsg.MultiMsgApplyUpReq> = emptyList(),\n        @ProtoNumber(7) @JvmField val multimsgApplydownReq: List<MultiMsg.MultiMsgApplyDownReq> = emptyList(),\n        @ProtoNumber(8) @JvmField val buType: Int = 0,\n        @ProtoNumber(9) @JvmField val reqChannelType: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val subcmd: Int = 0,\n        @ProtoNumber(2) @JvmField val multimsgApplyupRsp: List<MultiMsg.MultiMsgApplyUpRsp> = emptyList(),\n        @ProtoNumber(3) @JvmField val multimsgApplydownRsp: List<MultiMsg.MultiMsgApplyDownRsp> = emptyList(),\n    ) : ProtoBuf\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/OIDB.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport net.mamoe.mirai.utils.capitalize\nimport kotlin.jvm.JvmField\n\ninternal class Oidb0x5d4 : ProtoBuf {\n    @Serializable\n    internal class DelResult(\n        @JvmField @ProtoNumber(1) val uin: Long = 0L,\n        @JvmField @ProtoNumber(2) val res: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @JvmField @ProtoNumber(1) val uinList: List<Long> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @JvmField @ProtoNumber(1) val seq: Int = 0,\n        @JvmField @ProtoNumber(2) val result: List<DelResult> = emptyList()\n    ) : ProtoBuf\n}\n\ninternal class Oidb0x5d2 : ProtoBuf {\n    @Serializable\n    internal class FriendInfo(\n        @JvmField @ProtoNumber(1) val uin: Long = 0L,\n        @JvmField @ProtoNumber(2) val gender: Int = 0,\n        @JvmField @ProtoNumber(3) val age: Int = 0,\n        @JvmField @ProtoNumber(4) val group: Int = 0,\n        @JvmField @ProtoNumber(5) val login: Int = 0,\n        @JvmField @ProtoNumber(6) val remark: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FriendEntry(\n        @JvmField @ProtoNumber(1) val uin: Long = 0L,\n        @JvmField @ProtoNumber(2) val nick: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupInfo(\n        @JvmField @ProtoNumber(1) val id: Int = 0,\n        @JvmField @ProtoNumber(2) val name: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class LoginInfo(\n        @JvmField @ProtoNumber(1) val id: Int = 0,\n        @JvmField @ProtoNumber(2) val name: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @JvmField @ProtoNumber(1) val subCmd: Int = 0,\n        @JvmField @ProtoNumber(2) val reqGetList: ReqGetList? = null,\n        @JvmField @ProtoNumber(3) val reqGetInfo: ReqGetInfo? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqGetInfo(\n        @JvmField @ProtoNumber(1) val uinList: List<Long> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqGetList(\n        @JvmField @ProtoNumber(1) val seq: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @JvmField @ProtoNumber(1) val subCmd: Int = 0,\n        @JvmField @ProtoNumber(2) val rspGetList: RspGetList? = null,\n        @JvmField @ProtoNumber(3) val rspGetInfo: RspGetInfo? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspGetInfo(\n        @JvmField @ProtoNumber(1) val groupInfo: List<GroupInfo> = emptyList(),\n        @JvmField @ProtoNumber(2) val loginInfo: List<LoginInfo> = emptyList(),\n        @JvmField @ProtoNumber(3) val time: Int = 0,\n        @JvmField @ProtoNumber(4) val frdInfo: List<FriendInfo> = emptyList(),\n        @JvmField @ProtoNumber(5) val frdDelete: List<Long> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspGetList(\n        @JvmField @ProtoNumber(1) val seq: Int = 0,\n        @JvmField @ProtoNumber(2) val list: List<FriendEntry> = emptyList()\n    ) : ProtoBuf\n}\n\ninternal class Oidb0x496 {\n    @Serializable\n    internal class AioKeyword(\n        @JvmField @ProtoNumber(1) val keywords: List<AioKeywordInfo> = emptyList(),\n        @JvmField @ProtoNumber(2) val rules: List<AioKeywordRuleInfo> = emptyList(),\n        @JvmField @ProtoNumber(3) val version: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class AioKeywordInfo(\n        @JvmField @ProtoNumber(1) val word: String = \"\",\n        @JvmField @ProtoNumber(2) val ruleId: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class AioKeywordRuleInfo(\n        @JvmField @ProtoNumber(1) val ruleId: Int = 0,\n        @JvmField @ProtoNumber(2) val startTime: Int = 0,\n        @JvmField @ProtoNumber(3) val endTime: Int = 0,\n        @JvmField @ProtoNumber(4) val postionFlag: Int = 0,\n        @JvmField @ProtoNumber(5) val matchGroupClass: List<Int> = emptyList(),\n        @JvmField @ProtoNumber(6) val version: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupMsgConfig(\n        @JvmField @ProtoNumber(1) val boolUinEnable: Boolean = false,\n        @JvmField @ProtoNumber(2) val maxAioMsg: Int = 0,\n        @JvmField @ProtoNumber(3) val enableHelper: Int = 0,\n        @JvmField @ProtoNumber(4) val groupMaxNumber: Int = 0,\n        @JvmField @ProtoNumber(5) val nextUpdateTime: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgSeqInfo(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val managerUinList: List<Long> = emptyList(),\n        @JvmField @ProtoNumber(3) val updateTime: Long = 0L,\n        @JvmField @ProtoNumber(4) val firstUnreadManagerMsgSeq: Long = 0L,\n        @JvmField @ProtoNumber(5) val uint64ManagerMsgSeq: List<Long> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val updateTime: Long = 0L,\n        @JvmField @ProtoNumber(3) val managerUinList: Long = 0L,\n        @JvmField @ProtoNumber(4) val firstUnreadManagerMsgSeq: Long = 0L,\n        @JvmField @ProtoNumber(5) val justFetchMsgConfig: Int = 0,\n        @JvmField @ProtoNumber(6) val type: Int = 0,\n        @JvmField @ProtoNumber(7) val version: Int = 0,\n        @JvmField @ProtoNumber(8) val aioKeywordVersion: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Robot(\n        @JvmField @ProtoNumber(1) val version: Int = 0,\n        @JvmField @ProtoNumber(2) val uinRange: List<UinRange> = emptyList(),\n        @JvmField @ProtoNumber(3) val fireKeywords: List<String> = emptyList(),\n        @JvmField @ProtoNumber(4) val startKeywords: List<String> = emptyList(),\n        @JvmField @ProtoNumber(5) val endKeywords: List<String> = emptyList(),\n        @JvmField @ProtoNumber(6) val sessionTimeout: Int = 0,\n        @JvmField @ProtoNumber(7) val subscribeCategories: List<RobotSubscribeCategory> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RobotSubscribeCategory(\n        @JvmField @ProtoNumber(1) val id: Int = 0,\n        @JvmField @ProtoNumber(2) val name: String = \"\",\n        @JvmField @ProtoNumber(3) val type: Int = 0,\n        @JvmField @ProtoNumber(4) val nextWording: String = \"\",\n        @JvmField @ProtoNumber(5) val nextContent: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @JvmField @ProtoNumber(1) val msgSeqInfo: List<MsgSeqInfo> = emptyList(),\n        @JvmField @ProtoNumber(2) val maxAioMsg: Long = 0L,\n        @JvmField @ProtoNumber(3) val maxPositionMsg: Long = 0L,\n        @JvmField @ProtoNumber(4) val msgGroupMsgConfig: GroupMsgConfig? = null,\n        @JvmField @ProtoNumber(5) val robotConfig: Robot? = null,\n        @JvmField @ProtoNumber(6) val aioKeywordConfig: AioKeyword? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class UinRange(\n        @JvmField @ProtoNumber(1) val startUin: Long = 0L,\n        @JvmField @ProtoNumber(2) val endUin: Long = 0L\n    ) : ProtoBuf\n}\n\n\n@Serializable\ninternal class Oidb0x8a0 : ProtoBuf {\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val optUint64GroupCode: Long = 0L,\n        @ProtoNumber(2) @JvmField val msgKickResult: List<KickResult> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class KickResult(\n        @ProtoNumber(1) @JvmField val optUint32Result: Int = 0,\n        @ProtoNumber(2) @JvmField val optUint64MemberUin: Long = 0L\n    ) : ProtoBuf\n\n    @Serializable\n    internal class KickMemberInfo(\n        @ProtoNumber(1) @JvmField val optUint32Operate: Int = 0,\n        @ProtoNumber(2) @JvmField val optUint64MemberUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val optUint32Flag: Int = 0,\n        @ProtoNumber(4) @JvmField val optBytesMsg: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val optUint64GroupCode: Long = 0L,\n        @ProtoNumber(2) @JvmField val msgKickList: List<KickMemberInfo> = emptyList(),\n        @ProtoNumber(3) @JvmField val kickList: List<Long> = emptyList(),\n        @ProtoNumber(4) @JvmField val kickFlag: Int = 0,\n        @ProtoNumber(5) @JvmField val kickMsg: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n}\n\n\n@Serializable\ninternal class Oidb0x8fc : ProtoBuf {\n    @Serializable\n    internal class CardNameElem(\n        @ProtoNumber(1) @JvmField val enumCardType: Int /* enum */ = 1,\n        @ProtoNumber(2) @JvmField val value: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CommCardNameBuf(\n        @ProtoNumber(1) @JvmField val richCardName: List<RichCardNameElem> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(2) @JvmField val showFlag: Int = 0,\n        @ProtoNumber(3) @JvmField val memLevelInfo: List<MemberInfo> = emptyList(),\n        @ProtoNumber(4) @JvmField val levelName: List<LevelName> = emptyList(),\n        @ProtoNumber(5) @JvmField val updateTime: Int = 0,\n        @ProtoNumber(6) @JvmField val officeMode: Int = 0,\n        @ProtoNumber(7) @JvmField val groupOpenAppid: Int = 0,\n        @ProtoNumber(8) @JvmField val msgClientInfo: ClientInfo? = null,\n        @ProtoNumber(9) @JvmField val authKey: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MemberInfo(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val point: Int = 0,\n        @ProtoNumber(3) @JvmField val activeDay: Int = 0,\n        @ProtoNumber(4) @JvmField val level: Int = 0,\n        @ProtoNumber(5) @JvmField val specialTitle: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val specialTitleExpireTime: Int = 0,\n        @ProtoNumber(7) @JvmField val uinName: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val memberCardName: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(9) @JvmField val phone: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(10) @JvmField val email: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(11) @JvmField val remark: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(12) @JvmField val gender: Int = 0,\n        @ProtoNumber(13) @JvmField val job: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(14) @JvmField val tribeLevel: Int = 0,\n        @ProtoNumber(15) @JvmField val tribePoint: Int = 0,\n        @ProtoNumber(16) @JvmField val richCardName: List<CardNameElem> = emptyList(),\n        @ProtoNumber(17) @JvmField val commRichCardName: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RichCardNameElem(\n        @ProtoNumber(1) @JvmField val ctrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val text: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(2) @JvmField val errInfo: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ClientInfo(\n        @ProtoNumber(1) @JvmField val implat: Int = 0,\n        @ProtoNumber(2) @JvmField val ingClientver: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class LevelName(\n        @ProtoNumber(1) @JvmField val level: Int = 0,\n        @ProtoNumber(2) @JvmField val name: String = \"\"\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0x88d : ProtoBuf {\n    @Serializable\n    internal class GroupExInfoOnly(\n        @ProtoNumber(1) @JvmField val tribeId: Int = 0,\n        @ProtoNumber(2) @JvmField val moneyForAddGroup: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqGroupInfo(\n        @ProtoNumber(1) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(2) @JvmField val stgroupinfo: GroupInfo? = null,\n        @ProtoNumber(3) @JvmField val lastGetGroupNameTime: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspGroupInfo(\n        @ProtoNumber(1) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(2) @JvmField val result: Int = 0,\n        @ProtoNumber(3) @JvmField val stgroupinfo: GroupInfo? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupGeoInfo(\n        @ProtoNumber(1) @JvmField val owneruin: Long = 0L,\n        @ProtoNumber(2) @JvmField val settime: Int = 0,\n        @ProtoNumber(3) @JvmField val cityid: Int = 0,\n        @ProtoNumber(4) @JvmField val int64Longitude: Long = 0L,\n        @ProtoNumber(5) @JvmField val int64Latitude: Long = 0L,\n        @ProtoNumber(6) @JvmField val geocontent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val poiId: Long = 0L\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TagRecord(\n        @ProtoNumber(1) @JvmField val fromUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(3) @JvmField val tagId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val setTime: Long = 0L,\n        @ProtoNumber(5) @JvmField val goodNum: Int = 0,\n        @ProtoNumber(6) @JvmField val badNum: Int = 0,\n        @ProtoNumber(7) @JvmField val tagLen: Int = 0,\n        @ProtoNumber(8) @JvmField val tagValue: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupInfo(\n        @ProtoNumber(1) @JvmField val groupOwner: Long? = null,\n        @ProtoNumber(2) @JvmField val groupCreateTime: Int? = null,\n        @ProtoNumber(3) @JvmField val groupFlag: Int? = null,\n        @ProtoNumber(4) @JvmField val groupFlagExt: Int? = null,\n        @ProtoNumber(5) @JvmField val groupMemberMaxNum: Int? = null,\n        @ProtoNumber(6) @JvmField val groupMemberNum: Int? = null,\n        @ProtoNumber(7) @JvmField val groupOption: Int? = null,\n        @ProtoNumber(8) @JvmField val groupClassExt: Int? = null,\n        @ProtoNumber(9) @JvmField val groupSpecialClass: Int? = null,\n        @ProtoNumber(10) @JvmField val groupLevel: Int? = null,\n        @ProtoNumber(11) @JvmField val groupFace: Int? = null,\n        @ProtoNumber(12) @JvmField val groupDefaultPage: Int? = null,\n        @ProtoNumber(13) @JvmField val groupInfoSeq: Int? = null,\n        @ProtoNumber(14) @JvmField val groupRoamingTime: Int? = null,\n        @ProtoNumber(15) @JvmField val groupName: String? = null,\n        @ProtoNumber(16) @JvmField val groupMemo: String? = null,\n        @ProtoNumber(17) @JvmField val ingGroupFingerMemo: String? = null,\n        @ProtoNumber(18) @JvmField val ingGroupClassText: String? = null,\n        @ProtoNumber(19) @JvmField val groupAllianceCode: List<Int> = emptyList(),\n        @ProtoNumber(20) @JvmField val groupExtraAdmNum: Int? = null,\n        @ProtoNumber(21) @JvmField val groupUin: Long? = null,\n        @ProtoNumber(22) @JvmField val groupCurMsgSeq: Int? = null,\n        @ProtoNumber(23) @JvmField val groupLastMsgTime: Int? = null,\n        @ProtoNumber(24) @JvmField val ingGroupQuestion: String? = null,\n        @ProtoNumber(25) @JvmField val ingGroupAnswer: String? = null,\n        @ProtoNumber(26) @JvmField val groupVisitorMaxNum: Int? = null,\n        @ProtoNumber(27) @JvmField val groupVisitorCurNum: Int? = null,\n        @ProtoNumber(28) @JvmField val levelNameSeq: Int? = null,\n        @ProtoNumber(29) @JvmField val groupAdminMaxNum: Int? = null,\n        @ProtoNumber(30) @JvmField val groupAioSkinTimestamp: Int? = null,\n        @ProtoNumber(31) @JvmField val groupBoardSkinTimestamp: Int? = null,\n        @ProtoNumber(32) @JvmField val ingGroupAioSkinUrl: String? = null,\n        @ProtoNumber(33) @JvmField val ingGroupBoardSkinUrl: String? = null,\n        @ProtoNumber(34) @JvmField val groupCoverSkinTimestamp: Int? = null,\n        @ProtoNumber(35) @JvmField val ingGroupCoverSkinUrl: String? = null,\n        @ProtoNumber(36) @JvmField val groupGrade: Int? = null,\n        @ProtoNumber(37) @JvmField val activeMemberNum: Int? = null,\n        @ProtoNumber(38) @JvmField val certificationType: Int? = null,\n        @ProtoNumber(39) @JvmField val ingCertificationText: String? = null,\n        @ProtoNumber(40) @JvmField val ingGroupRichFingerMemo: String? = null,\n        @ProtoNumber(41) @JvmField val tagRecord: List<TagRecord> = emptyList(),\n        @ProtoNumber(42) @JvmField val groupGeoInfo: GroupGeoInfo? = null,\n        @ProtoNumber(43) @JvmField val headPortraitSeq: Int? = null,\n        @ProtoNumber(44) @JvmField val msgHeadPortrait: GroupHeadPortrait? = null,\n        @ProtoNumber(45) @JvmField val shutupTimestamp: Int? = null,\n        @ProtoNumber(46) @JvmField val shutupTimestampMe: Int? = null,\n        @ProtoNumber(47) @JvmField val createSourceFlag: Int? = null,\n        @ProtoNumber(48) @JvmField val cmduinMsgSeq: Int? = null,\n        @ProtoNumber(49) @JvmField val cmduinJoinTime: Int? = null,\n        @ProtoNumber(50) @JvmField val cmduinUinFlag: Int? = null,\n        @ProtoNumber(51) @JvmField val cmduinFlagEx: Int? = null,\n        @ProtoNumber(52) @JvmField val cmduinNewMobileFlag: Int? = null,\n        @ProtoNumber(53) @JvmField val cmduinReadMsgSeq: Int? = null,\n        @ProtoNumber(54) @JvmField val cmduinLastMsgTime: Int? = null,\n        @ProtoNumber(55) @JvmField val groupTypeFlag: Int? = null,\n        @ProtoNumber(56) @JvmField val appPrivilegeFlag: Int? = null,\n        @ProtoNumber(57) @JvmField val stGroupExInfo: GroupExInfoOnly? = null,\n        @ProtoNumber(58) @JvmField val groupSecLevel: Int? = null,\n        @ProtoNumber(59) @JvmField val groupSecLevelInfo: Int? = null,\n        @ProtoNumber(60) @JvmField val cmduinPrivilege: Int? = null,\n        @ProtoNumber(61) @JvmField val ingPoidInfo: ByteArray? = null,\n        @ProtoNumber(62) @JvmField val cmduinFlagEx2: Int? = null,\n        @ProtoNumber(63) @JvmField val confUin: Long? = null,\n        @ProtoNumber(64) @JvmField val confMaxMsgSeq: Int? = null,\n        @ProtoNumber(65) @JvmField val confToGroupTime: Int? = null,\n        @ProtoNumber(66) @JvmField val passwordRedbagTime: Int? = null,\n        @ProtoNumber(67) @JvmField val subscriptionUin: Long? = null,\n        @ProtoNumber(68) @JvmField val memberListChangeSeq: Int? = null,\n        @ProtoNumber(69) @JvmField val membercardSeq: Int? = null,\n        @ProtoNumber(70) @JvmField val rootId: Long? = null,\n        @ProtoNumber(71) @JvmField val parentId: Long? = null,\n        @ProtoNumber(72) @JvmField val teamSeq: Int? = null,\n        @ProtoNumber(73) @JvmField val historyMsgBeginTime: Long? = null,\n        @ProtoNumber(74) @JvmField val inviteNoAuthNumLimit: Long? = null,\n        @ProtoNumber(75) @JvmField val cmduinHistoryMsgSeq: Int? = null,\n        @ProtoNumber(76) @JvmField val cmduinJoinMsgSeq: Int? = null,\n        @ProtoNumber(77) @JvmField val groupFlagext3: Int? = null,\n        @ProtoNumber(78) @JvmField val groupOpenAppid: Int? = null,\n        @ProtoNumber(79) @JvmField val isConfGroup: Int? = null,\n        @ProtoNumber(80) @JvmField val isModifyConfGroupFace: Int? = null,\n        @ProtoNumber(81) @JvmField val isModifyConfGroupName: Int? = null,\n        @ProtoNumber(82) @JvmField val noFingerOpenFlag: Int? = null,\n        @ProtoNumber(83) @JvmField val noCodeFingerOpenFlag: Int? = null,\n        @ProtoNumber(84) @JvmField val autoAgreeJoinGroupUserNumForNormalGroup: Int? = null,\n        @ProtoNumber(85) @JvmField val autoAgreeJoinGroupUserNumForConfGroup: Int? = null,\n        @ProtoNumber(86) @JvmField val isAllowConfGroupMemberNick: Int? = null,\n        @ProtoNumber(87) @JvmField val isAllowConfGroupMemberAtAll: Int? = null,\n        @ProtoNumber(88) @JvmField val isAllowConfGroupMemberModifyGroupName: Int? = null,\n        @ProtoNumber(89) @JvmField val longGroupName: String? = null,\n        @ProtoNumber(90) @JvmField val cmduinJoinRealMsgSeq: Int? = null,\n        @ProtoNumber(91) @JvmField val isGroupFreeze: Int? = null,\n        @ProtoNumber(92) @JvmField val msgLimitFrequency: Int? = null,\n        @ProtoNumber(93) @JvmField val joinGroupAuth: ByteArray? = null,\n        @ProtoNumber(94) @JvmField val hlGuildAppid: Int? = null,\n        @ProtoNumber(95) @JvmField val hlGuildSubType: Int? = null,\n        @ProtoNumber(96) @JvmField val hlGuildOrgid: Int? = null,\n        @ProtoNumber(97) @JvmField val isAllowHlGuildBinary: Int? = null,\n        @ProtoNumber(98) @JvmField val cmduinRingtoneId: Int? = null,\n        @ProtoNumber(99) @JvmField val groupFlagext4: Int? = null,\n        @ProtoNumber(100) @JvmField val groupFreezeReason: Int? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupHeadPortraitInfo(\n        @ProtoNumber(1) @JvmField val uint32PicId: Int = 0,\n        @ProtoNumber(2) @JvmField val leftX: Int = 0,\n        @ProtoNumber(3) @JvmField val leftY: Int = 0,\n        @ProtoNumber(4) @JvmField val rightX: Int = 0,\n        @ProtoNumber(5) @JvmField val rightY: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val stzrspgroupinfo: List<RspGroupInfo> = emptyList(),\n        @ProtoNumber(2) @JvmField val errorinfo: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val appid: Int = 0,\n        @ProtoNumber(2) @JvmField val stzreqgroupinfo: List<ReqGroupInfo> = emptyList(),\n        @ProtoNumber(3) @JvmField val pcClientVersion: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupHeadPortrait(\n        @ProtoNumber(1) @JvmField val picCnt: Int = 0,\n        @ProtoNumber(2) @JvmField val msgInfo: List<GroupHeadPortraitInfo> = emptyList(),\n        @ProtoNumber(3) @JvmField val defaultId: Int = 0,\n        @ProtoNumber(4) @JvmField val verifyingPicCnt: Int = 0,\n        @ProtoNumber(5) @JvmField val msgVerifyingpicInfo: List<GroupHeadPortraitInfo> = emptyList()\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0x89a : ProtoBuf {\n    @Serializable\n    internal class GroupNewGuidelinesInfo(\n        @ProtoNumber(1) @JvmField val boolEnabled: Boolean = false,\n        @ProtoNumber(2) @JvmField val ingContent: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Groupinfo(\n        @ProtoNumber(1) @JvmField var groupExtAdmNum: Int? = null,\n        @ProtoNumber(2) @JvmField var flag: Int? = null,\n        @ProtoNumber(3) @JvmField var ingGroupName: ByteArray? = null,\n        @ProtoNumber(4) @JvmField var ingGroupMemo: ByteArray? = null,\n        @ProtoNumber(5) @JvmField var ingGroupFingerMemo: ByteArray? = null,\n        @ProtoNumber(6) @JvmField var ingGroupAioSkinUrl: ByteArray? = null,\n        @ProtoNumber(7) @JvmField var ingGroupBoardSkinUrl: ByteArray? = null,\n        @ProtoNumber(8) @JvmField var ingGroupCoverSkinUrl: ByteArray? = null,\n        @ProtoNumber(9) @JvmField var groupGrade: Int? = null,\n        @ProtoNumber(10) @JvmField var activeMemberNum: Int? = null,\n        @ProtoNumber(11) @JvmField var certificationType: Int? = null,\n        @ProtoNumber(12) @JvmField var ingCertificationText: ByteArray? = null,\n        @ProtoNumber(13) @JvmField var ingGroupRichFingerMemo: ByteArray? = null,\n        @ProtoNumber(14) @JvmField var stGroupNewguidelines: GroupNewGuidelinesInfo? = null,\n        @ProtoNumber(15) @JvmField var groupFace: Int? = null,\n        @ProtoNumber(16) @JvmField var addOption: Int? = null,\n        @ProtoNumber(17) @JvmField var shutupTime: Int? = null,\n        @ProtoNumber(18) @JvmField var groupTypeFlag: Int? = null,\n        @ProtoNumber(19) @JvmField var stringGroupTag: List<ByteArray> = emptyList(),\n        @ProtoNumber(20) @JvmField var msgGroupGeoInfo: GroupGeoInfo? = null,\n        @ProtoNumber(21) @JvmField var groupClassExt: Int? = null,\n        @ProtoNumber(22) @JvmField var ingGroupClassText: ByteArray? = null,\n        @ProtoNumber(23) @JvmField var appPrivilegeFlag: Int? = null,\n        @ProtoNumber(24) @JvmField var appPrivilegeMask: Int? = null,\n        @ProtoNumber(25) @JvmField var stGroupExInfo: GroupExInfoOnly? = null,\n        @ProtoNumber(26) @JvmField var groupSecLevel: Int? = null,\n        @ProtoNumber(27) @JvmField var groupSecLevelInfo: Int? = null,\n        @ProtoNumber(28) @JvmField var subscriptionUin: Long? = null,\n        @ProtoNumber(29) @JvmField var allowMemberInvite: Int? = null,\n        @ProtoNumber(30) @JvmField var ingGroupQuestion: ByteArray? = null,\n        @ProtoNumber(31) @JvmField var ingGroupAnswer: ByteArray? = null,\n        @ProtoNumber(32) @JvmField var groupFlagext3: Int? = null,\n        @ProtoNumber(33) @JvmField var groupFlagext3Mask: Int? = null,\n        @ProtoNumber(34) @JvmField var groupOpenAppid: Int? = null,\n        @ProtoNumber(35) @JvmField var noFingerOpenFlag: Int? = null,\n        @ProtoNumber(36) @JvmField var noCodeFingerOpenFlag: Int? = null,\n        @ProtoNumber(37) @JvmField var rootId: Long? = null,\n        @ProtoNumber(38) @JvmField var msgLimitFrequency: Int? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(2) @JvmField val errorinfo: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupExInfoOnly(\n        @ProtoNumber(1) @JvmField val tribeId: Int = 0,\n        @ProtoNumber(2) @JvmField val moneyForAddGroup: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupGeoInfo(\n        @ProtoNumber(1) @JvmField val cityId: Int = 0,\n        @ProtoNumber(2) @JvmField val longtitude: Long = 0L,\n        @ProtoNumber(3) @JvmField val latitude: Long = 0L,\n        @ProtoNumber(4) @JvmField val ingGeoContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val poiId: Long = 0L\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(2) @JvmField val stGroupInfo: Groupinfo? = null,\n        @ProtoNumber(3) @JvmField val originalOperatorUin: Long = 0L,\n        @ProtoNumber(4) @JvmField val reqGroupOpenAppid: Int = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0x7cb : ProtoBuf {\n    @Serializable\n    internal class ConfigItem(\n        @ProtoNumber(1) @JvmField val id: Int = 0,\n        @ProtoNumber(2) @JvmField val config: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val timeStamp: Int = 0,\n        @ProtoNumber(2) @JvmField val timeGap: Int = 0,\n        @ProtoNumber(3) @JvmField val commentConfigs: List<CommentConfig> = emptyList(),\n        @ProtoNumber(4) @JvmField val attendTipsToA: String = \"\",\n        @ProtoNumber(5) @JvmField val firstMsgTips: String = \"\",\n        @ProtoNumber(6) @JvmField val cancleConfig: List<ConfigItem> = emptyList(),\n        @ProtoNumber(7) @JvmField val msgDateRequest: DateRequest? = null,\n        @ProtoNumber(8) @JvmField val msgHotLocale: List<ByteArray> = emptyList(),//List<AppointDefine.LocaleInfo>\n        @ProtoNumber(9) @JvmField val msgTopicList: List<TopicConfig> = emptyList(),\n        @ProtoNumber(10) @JvmField val travelMsgTips: String = \"\",\n        @ProtoNumber(11) @JvmField val travelProfileTips: String = \"\",\n        @ProtoNumber(12) @JvmField val travelAttenTips: String = \"\",\n        @ProtoNumber(13) @JvmField val topicDefault: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CommentConfig(\n        @ProtoNumber(1) @JvmField val appointSubject: Int = 0,\n        @ProtoNumber(2) @JvmField val msgConfigs: List<ConfigItem> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val timeStamp: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DateRequest(\n        @ProtoNumber(1) @JvmField val time: Int = 0,\n        @ProtoNumber(2) @JvmField val errMsg: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TopicConfig(\n        @ProtoNumber(1) @JvmField val topicId: Int = 0,\n        @ProtoNumber(2) @JvmField val topicName: String = \"\",\n        @ProtoNumber(3) @JvmField val deadline: Int = 0,\n        @ProtoNumber(4) @JvmField val errDeadline: String = \"\"\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0x87a : ProtoBuf {\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val country: String = \"\",\n        @ProtoNumber(2) @JvmField val telephone: String = \"\",\n        @ProtoNumber(3) @JvmField val resendInterval: Int = 0,\n        @ProtoNumber(4) @JvmField val guid: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val country: String = \"\",\n        @ProtoNumber(2) @JvmField val telephone: String = \"\",\n        @ProtoNumber(3) @JvmField val guid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val enumButype: Int /* enum */ = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class GroupAppPb : ProtoBuf {\n    @Serializable\n    internal class ClientInfo(\n        @ProtoNumber(1) @JvmField val platform: Int = 0,\n        @ProtoNumber(2) @JvmField val version: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val fullList: AppList? = null,\n        @ProtoNumber(2) @JvmField val groupGrayList: AppList? = null,\n        @ProtoNumber(3) @JvmField val redPointList: AppList? = null,\n        @ProtoNumber(4) @JvmField val cacheInterval: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class AppList(\n        @ProtoNumber(1) @JvmField val hash: String = \"\",\n        @ProtoNumber(2) @JvmField val infos: List<AppInfo> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class AppInfo(\n        @ProtoNumber(1) @JvmField val appid: Int = 0,\n        @ProtoNumber(2) @JvmField val icon: String = \"\",\n        @ProtoNumber(3) @JvmField val name: String = \"\",\n        @ProtoNumber(4) @JvmField val url: String = \"\",\n        @ProtoNumber(5) @JvmField val isGray: Int = 0,\n        @ProtoNumber(6) @JvmField val iconSimpleDay: String = \"\",\n        @ProtoNumber(7) @JvmField val iconSimpleNight: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val client: ClientInfo? = null,\n        @ProtoNumber(2) @JvmField val groupId: Long = 0L,\n        @ProtoNumber(3) @JvmField val groupType: Int = 0,\n        @ProtoNumber(4) @JvmField val fullListHash: String = \"\",\n        @ProtoNumber(5) @JvmField val groupGrayListHash: String = \"\"\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xc34 : ProtoBuf {\n    @Serializable\n    internal class RspBody : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0x5fd : ProtoBuf {\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val msgComment: AppointDefine.DateComment? = null,\n        @ProtoNumber(2) @JvmField val maxFetchCount: Int = 0,\n        @ProtoNumber(3) @JvmField val lastCommentId: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val msgComment: List<AppointDefine.DateComment> = emptyList(),\n        @ProtoNumber(2) @JvmField val errorTips: String = \"\",\n        @ProtoNumber(3) @JvmField val clearCacheFlag: Int = 0,\n        @ProtoNumber(4) @JvmField val commentWording: String = \"\",\n        @ProtoNumber(5) @JvmField val commentNum: Int = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xbcb : ProtoBuf {\n    @Serializable\n    internal class CheckUrlReqItem(\n        @ProtoNumber(1) @JvmField val url: String = \"\",\n        @ProtoNumber(2) @JvmField val refer: String = \"\",\n        @ProtoNumber(3) @JvmField val plateform: String = \"\",\n        @ProtoNumber(4) @JvmField val qqPfTo: String = \"\",\n        @ProtoNumber(5) @JvmField val msgType: Int = 0,\n        @ProtoNumber(6) @JvmField val msgFrom: Int = 0,\n        @ProtoNumber(7) @JvmField val msgChatid: Long = 0L,\n        @ProtoNumber(8) @JvmField val serviceType: Long = 0L,\n        @ProtoNumber(9) @JvmField val sendUin: Long = 0L,\n        @ProtoNumber(10) @JvmField val reqType: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CheckUrlRsp(\n        @ProtoNumber(1) @JvmField val results: List<UrlCheckResult> = emptyList(),\n        @ProtoNumber(2) @JvmField val nextReqDuration: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(9) @JvmField val notUseCache: Int = 0,\n        @ProtoNumber(10) @JvmField val checkUrlReq: CheckUrlReq? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val wording: String = \"\",\n        @ProtoNumber(10) @JvmField val checkUrlRsp: CheckUrlRsp? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CheckUrlReq(\n        @ProtoNumber(1) @JvmField val url: List<String> = emptyList(),\n        @ProtoNumber(2) @JvmField val refer: String = \"\",\n        @ProtoNumber(3) @JvmField val plateform: String = \"\",\n        @ProtoNumber(4) @JvmField val qqPfTo: String = \"\",\n        @ProtoNumber(5) @JvmField val msgType: Int = 0,\n        @ProtoNumber(6) @JvmField val msgFrom: Int = 0,\n        @ProtoNumber(7) @JvmField val msgChatid: Long = 0L,\n        @ProtoNumber(8) @JvmField val serviceType: Long = 0L,\n        @ProtoNumber(9) @JvmField val sendUin: Long = 0L,\n        @ProtoNumber(10) @JvmField val reqType: String = \"\",\n        @ProtoNumber(11) @JvmField val originalUrl: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class UrlCheckResult(\n        @ProtoNumber(1) @JvmField val url: String = \"\",\n        @ProtoNumber(2) @JvmField val result: Int = 0,\n        @ProtoNumber(3) @JvmField val jumpResult: Int = 0,\n        @ProtoNumber(4) @JvmField val jumpUrl: String = \"\",\n        @ProtoNumber(5) @JvmField val level: Int = 0,\n        @ProtoNumber(6) @JvmField val subLevel: Int = 0,\n        @ProtoNumber(7) @JvmField val umrtype: Int = 0,\n        @ProtoNumber(8) @JvmField val retFrom: Int = 0,\n        @ProtoNumber(9) @JvmField val operationBit: Long = 0L\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xbfe : ProtoBuf {\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val receiveStatus: Int = 0,\n        @ProtoNumber(2) @JvmField val jumpUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val flag: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xbe8 : ProtoBuf {\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val enumOpCode: Int /* enum */ = 1,\n        @ProtoNumber(3) @JvmField val rspOfPopupFlag: Int = 0,\n        @ProtoNumber(4) @JvmField val popupCountNow: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PopupResult(\n        @ProtoNumber(1) @JvmField val popupResult: Int = 0,\n        @ProtoNumber(2) @JvmField val popupFieldid: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val enumOpCode: Int /* enum */ = 1,\n        @ProtoNumber(3) @JvmField val reqOfPopupFlag: Int = 0,\n        @ProtoNumber(4) @JvmField val rstOfPopupFlag: Int = 0,\n        @ProtoNumber(5) @JvmField val mqq808WelcomepageFlag: Int = 0,\n        @ProtoNumber(6) @JvmField val msgPopupResult: List<PopupResult> = emptyList()\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0x7de : ProtoBuf {\n    @Serializable\n    internal class UserProfile(\n        @ProtoNumber(1) @JvmField val msgPublisherInfo: AppointDefine.PublisherInfo? = null,\n        @ProtoNumber(2) @JvmField val msgAppointsInfo: AppointDefine.AppointInfo? = null,\n        @ProtoNumber(3) @JvmField val msgVistorInfo: List<AppointDefine.StrangerInfo> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val msgHead: BusiRespHead? = null,\n        @ProtoNumber(2) @JvmField val msgUserList: List<UserProfile> = emptyList(),\n        @ProtoNumber(3) @JvmField val ended: Int = 0,\n        @ProtoNumber(4) @JvmField val cookie: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class BusiRespHead(\n        @ProtoNumber(1) @JvmField val int32Version: Int = 1,\n        @ProtoNumber(2) @JvmField val int32Seq: Int = 0,\n        @ProtoNumber(3) @JvmField val int32ReplyCode: Int = 0,\n        @ProtoNumber(4) @JvmField val result: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val msgHead: BusiReqHead? = null,\n        @ProtoNumber(2) @JvmField val msgLbsInfo: AppointDefine.LBSInfo? = null,\n        @ProtoNumber(3) @JvmField val time: Int = 0,\n        @ProtoNumber(4) @JvmField val subject: Int = 0,\n        @ProtoNumber(5) @JvmField val gender: Int = 0,\n        @ProtoNumber(6) @JvmField val ageLow: Int = 0,\n        @ProtoNumber(7) @JvmField val ageUp: Int = 0,\n        @ProtoNumber(8) @JvmField val profession: Int = 0,\n        @ProtoNumber(9) @JvmField val cookie: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(10) @JvmField val msgDestination: AppointDefine.LocaleInfo? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class BusiReqHead(\n        @ProtoNumber(1) @JvmField val int32Version: Int = 1,\n        @ProtoNumber(2) @JvmField val int32Seq: Int = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0x7a8 : ProtoBuf {\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val reqUin: Long = 0L,\n        @ProtoNumber(11) @JvmField val onlyObtained: Int = 0,\n        @ProtoNumber(12) @JvmField val readReport: Int = 0,\n        @ProtoNumber(13) @JvmField val sortType: Int = 0,\n        @ProtoNumber(14) @JvmField val onlyNew: Int = 0,\n        @ProtoNumber(15) @JvmField val filterMedalIds: List<Int> = emptyList(),\n        @ProtoNumber(16) @JvmField val onlySummary: Int = 0,\n        @ProtoNumber(17) @JvmField val doScan: Int = 0,\n        @ProtoNumber(18) @JvmField val startTimestamp: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val nick: String = \"\",\n        @ProtoNumber(2) @JvmField val metalRank: Int = 0,\n        @ProtoNumber(3) @JvmField val friCount: Int = 0,\n        @ProtoNumber(4) @JvmField val metalCount: Int = 0,\n        @ProtoNumber(5) @JvmField val metalTotal: Int = 0,\n        @ProtoNumber(6) @JvmField val msgMedal: List<Common.MedalInfo> = emptyList(),\n        @ProtoNumber(8) @JvmField val totalPoint: Int = 0,\n        @ProtoNumber(9) @JvmField val int32NewCount: Int = 0,\n        @ProtoNumber(10) @JvmField val int32UpgradeCount: Int = 0,\n        @ProtoNumber(11) @JvmField val promptParams: String = \"\",\n        @ProtoNumber(12) @JvmField val now: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MedalNews(\n        @ProtoNumber(1) @JvmField val friUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val friNick: String = \"\",\n        @ProtoNumber(3) @JvmField val msgMedal: Common.MedalInfo? = null\n    ) : ProtoBuf\n}\n\n\n@Serializable\ninternal class Cmd0x5fe : ProtoBuf {\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val msgAppointId: AppointDefine.AppointID? = null,\n        @ProtoNumber(2) @JvmField val commentId: String = \"\",\n        @ProtoNumber(3) @JvmField val fetchOldCount: Int = 0,\n        @ProtoNumber(4) @JvmField val fetchNewCount: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val msgComment: List<AppointDefine.DateComment> = emptyList(),\n        @ProtoNumber(2) @JvmField val errorTips: String = \"\",\n        @ProtoNumber(3) @JvmField val fetchOldOver: Int = 0,\n        @ProtoNumber(4) @JvmField val fetchNewOver: Int = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xc35 : ProtoBuf {\n    @Serializable\n    internal class RspBody : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val msgExposeInfo: List<ExposeItem> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ExposeItem(\n        @ProtoNumber(1) @JvmField val friend: Long = 0L,\n        @ProtoNumber(2) @JvmField val pageId: Int = 0,\n        @ProtoNumber(3) @JvmField val entranceId: Int = 0,\n        @ProtoNumber(4) @JvmField val actionId: Int = 0,\n        @ProtoNumber(5) @JvmField val exposeCount: Int = 0,\n        @ProtoNumber(6) @JvmField val exposeTime: Int = 0,\n        @ProtoNumber(7) @JvmField val algoBuffer: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val addition: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xc0d : ProtoBuf {\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val completedTaskStamp: Long = 0L,\n        @ProtoNumber(2) @JvmField val errMsg: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val taskType: Int = 0,\n        @ProtoNumber(3) @JvmField val taskPoint: Int = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class OidbSso : ProtoBuf {\n    @Serializable\n    internal class OIDBSSOPkg(\n        @ProtoNumber(1) @JvmField val command: Int = 0,\n        @ProtoNumber(2) @JvmField val serviceType: Int,\n        @ProtoNumber(3) @JvmField val result: Int = 0,\n        @ProtoNumber(4) @JvmField val bodybuffer: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val errorMsg: String = \"\",\n        @ProtoNumber(6) @JvmField val clientVersion: String = \"\"\n    ) : ProtoBuf, Packet {\n        fun checkSuccess(actionName: String) {\n            check(result == 0) {\n                \"${actionName.capitalize()} failed. result=$result, errorMsg=$errorMsg\"\n            }\n        }\n    }\n}\n\n@Serializable\ninternal class Cmd0xc83 : ProtoBuf {\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(101) @JvmField val fromUin: Long = 0L,\n        @ProtoNumber(102) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(103) @JvmField val op: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(101) @JvmField val result: Int = 0,\n        @ProtoNumber(102) @JvmField val retryInterval: Int = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0xccb : ProtoBuf {\n    @Serializable\n    internal class GroupMsgInfo(\n        @ProtoNumber(1) @JvmField val msgSeq: Int = 0,\n        @ProtoNumber(2) @JvmField val roamFlag: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val type: Int = 0,\n        @ProtoNumber(2) @JvmField val destUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(4) @JvmField val c2cMsg: List<C2cMsgInfo> = emptyList(),\n        @ProtoNumber(5) @JvmField val groupMsg: List<GroupMsgInfo> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val type: Int = 0,\n        @ProtoNumber(2) @JvmField val destUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(4) @JvmField val c2cMsg: List<C2cMsgInfo> = emptyList(),\n        @ProtoNumber(5) @JvmField val groupMsg: List<GroupMsgInfo> = emptyList(),\n        @ProtoNumber(6) @JvmField val resId: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class C2cMsgInfo(\n        @ProtoNumber(1) @JvmField val msgSeq: Int = 0,\n        @ProtoNumber(2) @JvmField val msgTime: Int = 0,\n        @ProtoNumber(3) @JvmField val msgRandom: Int = 0,\n        @ProtoNumber(4) @JvmField val roamFlag: Int = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xd84 : ProtoBuf {\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val xmitinfo: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val xmitinfo: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0x5e1 : ProtoBuf {\n    @Serializable\n    internal class UdcUinData(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(4) @JvmField val openid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(20002) @JvmField val nick: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(20003) @JvmField val country: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(20004) @JvmField val province: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(20009) @JvmField val gender: Int = 0,\n        @ProtoNumber(20014) @JvmField val allow: Int = 0,\n        @ProtoNumber(20015) @JvmField val faceId: Int = 0,\n        @ProtoNumber(20020) @JvmField val city: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(20027) @JvmField val commonPlace1: Int = 0,\n        @ProtoNumber(20030) @JvmField val mss3Bitmapextra: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(20031) @JvmField val birthday: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(20032) @JvmField val cityId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(20033) @JvmField val lang1: Int = 0,\n        @ProtoNumber(20034) @JvmField val lang2: Int = 0,\n        @ProtoNumber(20035) @JvmField val lang3: Int = 0,\n        @ProtoNumber(20041) @JvmField val cityZoneId: Int = 0,\n        @ProtoNumber(20056) @JvmField val oin: Int = 0,\n        @ProtoNumber(20059) @JvmField val bubbleId: Int = 0,\n        @ProtoNumber(21001) @JvmField val mss2Identity: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(21002) @JvmField val mss1Service: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(21003) @JvmField val lflag: Int = 0,\n        @ProtoNumber(21004) @JvmField val extFlag: Int = 0,\n        @ProtoNumber(21006) @JvmField val basicSvrFlag: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(21007) @JvmField val basicCliFlag: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(24101) @JvmField val pengyouRealname: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(24103) @JvmField val pengyouGender: Int = 0,\n        @ProtoNumber(24118) @JvmField val pengyouFlag: Int = 0,\n        @ProtoNumber(26004) @JvmField val fullBirthday: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(26005) @JvmField val fullAge: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(26010) @JvmField val simpleUpdateTime: Int = 0,\n        @ProtoNumber(26011) @JvmField val mssUpdateTime: Int = 0,\n        @ProtoNumber(27022) @JvmField val groupMemCreditFlag: Int = 0,\n        @ProtoNumber(27025) @JvmField val faceAddonId: Long = 0L,\n        @ProtoNumber(27026) @JvmField val musicGene: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(40323) @JvmField val fileShareBit: Int = 0,\n        @ProtoNumber(40404) @JvmField val recommendPrivacyCtrl: Int = 0,\n        @ProtoNumber(40505) @JvmField val oldFriendChat: Int = 0,\n        @ProtoNumber(40602) @JvmField val businessBit: Int = 0,\n        @ProtoNumber(41305) @JvmField val crmBit: Int = 0,\n        @ProtoNumber(41810) @JvmField val forbidFileshareBit: Int = 0,\n        @ProtoNumber(42333) @JvmField val userLoginGuardFace: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(11) @JvmField val msgUinData: List<UdcUinData> = emptyList(),\n        @ProtoNumber(12) @JvmField val uint64UnfinishedUins: List<Long> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val uint64Uins: List<Long> = emptyList(),\n        @ProtoNumber(2) @JvmField val startTime: Int = 0,\n        @ProtoNumber(3) @JvmField val maxPackageSize: Int = 0,\n        @ProtoNumber(4) @JvmField val bytesOpenid: List<ByteArray> = emptyList(),\n        @ProtoNumber(5) @JvmField val appid: Int = 0,\n        @ProtoNumber(20002) @JvmField val reqNick: Int = 0,\n        @ProtoNumber(20003) @JvmField val reqCountry: Int = 0,\n        @ProtoNumber(20004) @JvmField val reqProvince: Int = 0,\n        @ProtoNumber(20009) @JvmField val reqGender: Int = 0,\n        @ProtoNumber(20014) @JvmField val reqAllow: Int = 0,\n        @ProtoNumber(20015) @JvmField val reqFaceId: Int = 0,\n        @ProtoNumber(20020) @JvmField val reqCity: Int = 0,\n        @ProtoNumber(20027) @JvmField val reqCommonPlace1: Int = 0,\n        @ProtoNumber(20030) @JvmField val reqMss3Bitmapextra: Int = 0,\n        @ProtoNumber(20031) @JvmField val reqBirthday: Int = 0,\n        @ProtoNumber(20032) @JvmField val reqCityId: Int = 0,\n        @ProtoNumber(20033) @JvmField val reqLang1: Int = 0,\n        @ProtoNumber(20034) @JvmField val reqLang2: Int = 0,\n        @ProtoNumber(20035) @JvmField val reqLang3: Int = 0,\n        @ProtoNumber(20041) @JvmField val reqCityZoneId: Int = 0,\n        @ProtoNumber(20056) @JvmField val reqOin: Int = 0,\n        @ProtoNumber(20059) @JvmField val reqBubbleId: Int = 0,\n        @ProtoNumber(21001) @JvmField val reqMss2Identity: Int = 0,\n        @ProtoNumber(21002) @JvmField val reqMss1Service: Int = 0,\n        @ProtoNumber(21003) @JvmField val reqLflag: Int = 0,\n        @ProtoNumber(21004) @JvmField val reqExtFlag: Int = 0,\n        @ProtoNumber(21006) @JvmField val reqBasicSvrFlag: Int = 0,\n        @ProtoNumber(21007) @JvmField val reqBasicCliFlag: Int = 0,\n        @ProtoNumber(24101) @JvmField val reqPengyouRealname: Int = 0,\n        @ProtoNumber(24103) @JvmField val reqPengyouGender: Int = 0,\n        @ProtoNumber(24118) @JvmField val reqPengyouFlag: Int = 0,\n        @ProtoNumber(26004) @JvmField val reqFullBirthday: Int = 0,\n        @ProtoNumber(26005) @JvmField val reqFullAge: Int = 0,\n        @ProtoNumber(26010) @JvmField val reqSimpleUpdateTime: Int = 0,\n        @ProtoNumber(26011) @JvmField val reqMssUpdateTime: Int = 0,\n        @ProtoNumber(27022) @JvmField val reqGroupMemCreditFlag: Int = 0,\n        @ProtoNumber(27025) @JvmField val reqFaceAddonId: Int = 0,\n        @ProtoNumber(27026) @JvmField val reqMusicGene: Int = 0,\n        @ProtoNumber(40323) @JvmField val reqFileShareBit: Int = 0,\n        @ProtoNumber(40404) @JvmField val reqRecommendPrivacyCtrlBit: Int = 0,\n        @ProtoNumber(40505) @JvmField val reqOldFriendChatBit: Int = 0,\n        @ProtoNumber(40602) @JvmField val reqBusinessBit: Int = 0,\n        @ProtoNumber(41305) @JvmField val reqCrmBit: Int = 0,\n        @ProtoNumber(41810) @JvmField val reqForbidFileshareBit: Int = 0,\n        @ProtoNumber(42333) @JvmField val userLoginGuardFace: Int = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xc90 : ProtoBuf {\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val communityBid: List<Long> = emptyList(),\n        @ProtoNumber(2) @JvmField val page: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CommunityWebInfo(\n        @ProtoNumber(1) @JvmField val communityInfoItem: List<CommunityConfigInfo> = emptyList(),\n        @ProtoNumber(2) @JvmField val page: Int = 0,\n        @ProtoNumber(3) @JvmField val end: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val communityInfoItem: List<CommunityConfigInfo> = emptyList(),\n        @ProtoNumber(2) @JvmField val jumpConcernCommunityUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val communityTitleWording: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val moreUrlWording: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val webCommunityInfo: CommunityWebInfo? = null,\n        @ProtoNumber(6) @JvmField val jumpCommunityChannelUrl: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CommunityConfigInfo(\n        @ProtoNumber(1) @JvmField val jumpHomePageUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val name: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val picUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val dynamicCount: Int = 0,\n        @ProtoNumber(5) @JvmField val communityBid: Long = 0L,\n        @ProtoNumber(6) @JvmField val followStatus: Int = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0xd8a : ProtoBuf {\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val retcode: Int = 0,\n        @ProtoNumber(2) @JvmField val res: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val cmd: Int = 0,\n        @ProtoNumber(3) @JvmField val body: String = \"\",\n        @ProtoNumber(4) @JvmField val clientInfo: ClientInfo? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ClientInfo(\n        @ProtoNumber(1) @JvmField val implat: Int = 0,\n        @ProtoNumber(2) @JvmField val ingClientver: String = \"\"\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xb6f : ProtoBuf {\n    @Serializable\n    internal class ReportFreqRspBody(\n        @ProtoNumber(1) @JvmField val identity: Identity? = null,\n        @ProtoNumber(4) @JvmField val remainTimes: Long = 0L,\n        @ProtoNumber(5) @JvmField val expireTime: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Identity(\n        @ProtoNumber(1) @JvmField val apiName: String = \"\",\n        @ProtoNumber(2) @JvmField val appid: Int = 0,\n        @ProtoNumber(3) @JvmField val apptype: Int = 0,\n        @ProtoNumber(4) @JvmField val bizid: Int = 0,\n        @ProtoNumber(10) @JvmField val intExt1: Long = 0L,\n        @ProtoNumber(20) @JvmField val ext1: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ThresholdInfo(\n        @ProtoNumber(1) @JvmField val thresholdPerMinute: Long = 0L,\n        @ProtoNumber(2) @JvmField val thresholdPerDay: Long = 0L,\n        @ProtoNumber(3) @JvmField val thresholdPerHour: Long = 0L,\n        @ProtoNumber(4) @JvmField val thresholdPerWeek: Long = 0L\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val reportFreqRsp: ReportFreqRspBody? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReportFreqReqBody(\n        @ProtoNumber(1) @JvmField val identity: Identity? = null,\n        @ProtoNumber(2) @JvmField val invokeTimes: Long = 1L\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val reportFreqReq: ReportFreqReqBody? = null\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0x7dc : ProtoBuf {\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val seq: Int = 0,\n        @ProtoNumber(2) @JvmField val wording: String = \"\",\n        @ProtoNumber(3) @JvmField val msgAppointInfo: List<AppointDefine.AppointInfo> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val seq: Int = 0,\n        @ProtoNumber(2) @JvmField val msgAppointment: AppointDefine.AppointContent? = null,\n        @ProtoNumber(3) @JvmField val msgLbsInfo: AppointDefine.LBSInfo? = null,\n        @ProtoNumber(4) @JvmField val overwrite: Int = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0x7cd : ProtoBuf {\n    @Serializable\n    internal class AppointBrife(\n        @ProtoNumber(1) @JvmField val msgPublisherInfo: AppointDefine.PublisherInfo? = null,\n        @ProtoNumber(2) @JvmField val msgAppointsInfo: AppointDefine.AppointInfo? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val stamp: Int = 0,\n        @ProtoNumber(2) @JvmField val over: Int = 0,\n        @ProtoNumber(3) @JvmField val next: Int = 0,\n        @ProtoNumber(4) @JvmField val msgAppointsInfo: List<AppointBrife> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val stamp: Int = 0,\n        @ProtoNumber(2) @JvmField val start: Int = 0,\n        @ProtoNumber(3) @JvmField val want: Int = 0,\n        @ProtoNumber(4) @JvmField val msgLbsInfo: AppointDefine.LBSInfo? = null,\n        @ProtoNumber(5) @JvmField val msgAppointIds: List<AppointDefine.AppointID> = emptyList(),\n        @ProtoNumber(6) @JvmField val appointOperation: Int = 0,\n        @ProtoNumber(100) @JvmField val requestUin: Long = 0L\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xc0c : ProtoBuf {\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val isTaskCompleted: Int = 0,\n        @ProtoNumber(2) @JvmField val taskPoint: Int = 0,\n        @ProtoNumber(3) @JvmField val guideWording: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val needShowProgress: Int = 0,\n        @ProtoNumber(5) @JvmField val originalProgress: Int = 0,\n        @ProtoNumber(6) @JvmField val nowProgress: Int = 0,\n        @ProtoNumber(7) @JvmField val totalProgress: Int = 0,\n        @ProtoNumber(8) @JvmField val needExecTask: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class VideoSrcType(\n        @ProtoNumber(1) @JvmField val sourceType: Int = 0,\n        @ProtoNumber(2) @JvmField val videoFromType: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val taskType: Int = 0,\n        @ProtoNumber(3) @JvmField val rowkey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val feedsId: Long = 0L,\n        @ProtoNumber(5) @JvmField val msgVideoFromType: VideoSrcType? = null\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0x5fb : ProtoBuf {\n    @Serializable\n    internal class ReqInfo(\n        @ProtoNumber(3) @JvmField val time: Int = 0,\n        @ProtoNumber(4) @JvmField val subject: Int = 0,\n        @ProtoNumber(5) @JvmField val gender: Int = 0,\n        @ProtoNumber(6) @JvmField val ageLow: Int = 0,\n        @ProtoNumber(7) @JvmField val ageUp: Int = 0,\n        @ProtoNumber(8) @JvmField val profession: Int = 0,\n        @ProtoNumber(9) @JvmField val cookie: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(10) @JvmField val msgDestination: AppointDefine.LocaleInfo? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val msgHead: BusiReqHead? = null,\n        @ProtoNumber(2) @JvmField val msgLbsInfo: AppointDefine.LBSInfo? = null,\n        @ProtoNumber(3) @JvmField val reqInfo: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class BusiRespHead(\n        @ProtoNumber(1) @JvmField val int32Version: Int = 1,\n        @ProtoNumber(2) @JvmField val int32Seq: Int = 0,\n        @ProtoNumber(3) @JvmField val int32ReplyCode: Int = 0,\n        @ProtoNumber(4) @JvmField val result: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class UserProfile(\n        @ProtoNumber(1) @JvmField val int64Id: Long = 0L,\n        @ProtoNumber(2) @JvmField val int32IdType: Int = 0,\n        @ProtoNumber(3) @JvmField val url: String = \"\",\n        @ProtoNumber(4) @JvmField val int32PicType: Int = 0,\n        @ProtoNumber(5) @JvmField val int32SubPicType: Int = 0,\n        @ProtoNumber(6) @JvmField val title: String = \"\",\n        @ProtoNumber(7) @JvmField val content: String = \"\",\n        @ProtoNumber(8) @JvmField val content2: String = \"\",\n        @ProtoNumber(9) @JvmField val picUrl: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class BusiReqHead(\n        @ProtoNumber(1) @JvmField val int32Version: Int = 1,\n        @ProtoNumber(2) @JvmField val int32Seq: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val msgHead: BusiRespHead? = null,\n        @ProtoNumber(2) @JvmField val msgUserList: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xb61 : ProtoBuf {\n    @Serializable\n    internal class GetAppinfoReq(\n        @ProtoNumber(1) @JvmField val appid: Int = 0,\n        @ProtoNumber(2) @JvmField val appType: Int = 0,\n        @ProtoNumber(3) @JvmField val platform: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetPkgUrlReq(\n        @ProtoNumber(1) @JvmField val appid: Int = 0,\n        @ProtoNumber(2) @JvmField val appType: Int = 0,\n        @ProtoNumber(3) @JvmField val appVersion: Int = 0,\n        @ProtoNumber(4) @JvmField val platform: Int = 0,\n        @ProtoNumber(5) @JvmField val sysVersion: String = \"\",\n        @ProtoNumber(6) @JvmField val qqVersion: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val wording: String = \"\",\n        @ProtoNumber(2) @JvmField val nextReqDuration: Int = 0,\n        @ProtoNumber(10) @JvmField val getAppinfoRsp: GetAppinfoRsp? = null,\n        @ProtoNumber(11) @JvmField val getMqqappUrlRsp: GetPkgUrlRsp? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(10) @JvmField val getAppinfoReq: GetAppinfoReq? = null,\n        @ProtoNumber(11) @JvmField val getMqqappUrlReq: GetPkgUrlReq? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetAppinfoRsp(\n        @ProtoNumber(1) @JvmField val appinfo: Qqconnect.Appinfo? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetPkgUrlRsp(\n        @ProtoNumber(1) @JvmField val appVersion: Int = 0,\n        @ProtoNumber(2) @JvmField val pkgUrl: String = \"\"\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xb60 : ProtoBuf {\n    @Serializable\n    internal class GetPrivilegeReq(\n        @ProtoNumber(1) @JvmField val appid: Int = 0,\n        @ProtoNumber(2) @JvmField val appType: Int = 3\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CheckUrlReq(\n        @ProtoNumber(1) @JvmField val appid: Int = 0,\n        @ProtoNumber(2) @JvmField val appType: Int = 0,\n        @ProtoNumber(3) @JvmField val url: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ClientInfo(\n        @ProtoNumber(1) @JvmField val platform: Int = 0,\n        @ProtoNumber(2) @JvmField val sdkVersion: String = \"\",\n        @ProtoNumber(3) @JvmField val androidPackageName: String = \"\",\n        @ProtoNumber(4) @JvmField val androidSignature: String = \"\",\n        @ProtoNumber(5) @JvmField val iosBundleId: String = \"\",\n        @ProtoNumber(6) @JvmField val pcSign: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val wording: String = \"\",\n        @ProtoNumber(10) @JvmField val getPrivilegeRsp: GetPrivilegeRsp? = null,\n        @ProtoNumber(11) @JvmField val checkUrlRsp: CheckUrlRsp? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CheckUrlRsp(\n        @ProtoNumber(1) @JvmField val isAuthed: Boolean = false,\n        @ProtoNumber(2) @JvmField val nextReqDuration: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val clientInfo: ClientInfo? = null,\n        @ProtoNumber(10) @JvmField val getPrivilegeReq: GetPrivilegeReq? = null,\n        @ProtoNumber(11) @JvmField val checkUrlReq: CheckUrlReq? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetPrivilegeRsp(\n        @ProtoNumber(1) @JvmField val apiGroups: List<Int> = emptyList(),\n        @ProtoNumber(2) @JvmField val nextReqDuration: Int = 0,\n        @ProtoNumber(3) @JvmField val apiNames: List<String> = emptyList()\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0x5fc : ProtoBuf {\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val lastEventId: Long = 0L,\n        @ProtoNumber(2) @JvmField val readEventId: Long = 0L,\n        @ProtoNumber(3) @JvmField val fetchCount: Int = 0,\n        @ProtoNumber(4) @JvmField val lastNearbyEventId: Long = 0L,\n        @ProtoNumber(5) @JvmField val readNearbyEventId: Long = 0L,\n        @ProtoNumber(6) @JvmField val fetchNearbyEventCount: Int = 0,\n        @ProtoNumber(7) @JvmField val lastFeedEventId: Long = 0L,\n        @ProtoNumber(8) @JvmField val readFeedEventId: Long = 0L,\n        @ProtoNumber(9) @JvmField val fetchFeedEventCount: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val msgEventList: List<AppointDefine.DateEvent> = emptyList(),\n        @ProtoNumber(2) @JvmField val actAppointIds: List<AppointDefine.AppointID> = emptyList(),\n        @ProtoNumber(3) @JvmField val maxEventId: Long = 0L,\n        @ProtoNumber(4) @JvmField val errorTips: String = \"\",\n        @ProtoNumber(5) @JvmField val msgNearbyEventList: List<AppointDefine.NearbyEvent> = emptyList(),\n        @ProtoNumber(6) @JvmField val msgFeedEventList: List<AppointDefine.FeedEvent> = emptyList(),\n        @ProtoNumber(7) @JvmField val maxFreshEventId: Long = 0L\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xc33 : ProtoBuf {\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val nextGap: Int = 0,\n        @ProtoNumber(3) @JvmField val newUser: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xc0b : ProtoBuf {\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val isOpenCoinEntry: Int = 0,\n        @ProtoNumber(2) @JvmField val canGetCoinCount: Int = 0,\n        @ProtoNumber(3) @JvmField val coinIconUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val lastCompletedTaskStamp: Long = 0L,\n        @ProtoNumber(6) @JvmField val cmsWording: List<KanDianCMSActivityInfo> = emptyList(),\n        @ProtoNumber(7) @JvmField val lastCmsActivityStamp: Long = 0L,\n        @ProtoNumber(8) @JvmField val msgKandianCoinRemind: KanDianCoinRemind? = null,\n        @ProtoNumber(9) @JvmField val msgKandianTaskRemind: KanDianTaskRemind? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class KanDianCoinRemind(\n        @ProtoNumber(1) @JvmField val wording: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class KanDianTaskRemind(\n        @ProtoNumber(1) @JvmField val wording: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val jumpUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val taskType: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class KanDianCMSActivityInfo(\n        @ProtoNumber(1) @JvmField val activityId: Long = 0L,\n        @ProtoNumber(2) @JvmField val wording: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val pictureUrl: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0xc85 : ProtoBuf {\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(101) @JvmField val fromUin: Long = 0L,\n        @ProtoNumber(102) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(103) @JvmField val op: Int = 0,\n        @ProtoNumber(104) @JvmField val intervalDays: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class InteractionDetailInfo(\n        @ProtoNumber(101) @JvmField val continuousRecordDays: Int = 0,\n        @ProtoNumber(102) @JvmField val sendDayTime: Int = 0,\n        @ProtoNumber(103) @JvmField val recvDayTime: Int = 0,\n        @ProtoNumber(104) @JvmField val sendRecord: String = \"\",\n        @ProtoNumber(105) @JvmField val recvRecord: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(101) @JvmField val result: Int = 0,\n        @ProtoNumber(102) @JvmField val recentInteractionTime: Int = 0,\n        @ProtoNumber(103) @JvmField val interactionDetailInfo: InteractionDetailInfo? = null\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0x7ce : ProtoBuf {\n    @Serializable\n    internal class AppintDetail(\n        @ProtoNumber(1) @JvmField val msgPublisherInfo: AppointDefine.PublisherInfo? = null,\n        @ProtoNumber(2) @JvmField val msgAppointsInfo: AppointDefine.AppointInfo? = null,\n        @ProtoNumber(3) @JvmField val score: Int = 0,\n        @ProtoNumber(4) @JvmField val joinOver: Int = 0,\n        @ProtoNumber(5) @JvmField val joinNext: Int = 0,\n        @ProtoNumber(6) @JvmField val msgStrangerInfo: List<AppointDefine.StrangerInfo> = emptyList(),\n        @ProtoNumber(7) @JvmField val viewOver: Int = 0,\n        @ProtoNumber(8) @JvmField val viewNext: Int = 0,\n        @ProtoNumber(9) @JvmField val msgVistorInfo: List<AppointDefine.StrangerInfo> = emptyList(),\n        @ProtoNumber(10) @JvmField val meJoin: Int = 0,\n        @ProtoNumber(12) @JvmField val canProfile: Int = 0,\n        @ProtoNumber(13) @JvmField val profileErrmsg: String = \"\",\n        @ProtoNumber(14) @JvmField val canAio: Int = 0,\n        @ProtoNumber(15) @JvmField val aioErrmsg: String = \"\",\n        @ProtoNumber(16) @JvmField val sigC2C: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(17) @JvmField val uin: Long = 0L,\n        @ProtoNumber(18) @JvmField val limited: Int = 0,\n        @ProtoNumber(19) @JvmField val msgCommentList: List<AppointDefine.DateComment> = emptyList(),\n        @ProtoNumber(20) @JvmField val commentOver: Int = 0,\n        @ProtoNumber(23) @JvmField val meInvited: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val msgAppointsInfo: List<AppintDetail> = emptyList(),\n        @ProtoNumber(2) @JvmField val secureFlag: Int = 0,\n        @ProtoNumber(3) @JvmField val secureTips: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val appointIds: List<AppointDefine.AppointID> = emptyList(),\n        @ProtoNumber(2) @JvmField val joinStart: Int = 0,\n        @ProtoNumber(3) @JvmField val joinWant: Int = 0,\n        @ProtoNumber(4) @JvmField val viewStart: Int = 0,\n        @ProtoNumber(5) @JvmField val viewWant: Int = 0,\n        @ProtoNumber(6) @JvmField val msgLbsInfo: AppointDefine.LBSInfo? = null,\n        @ProtoNumber(7) @JvmField val uint64Uins: List<Long> = emptyList(),\n        @ProtoNumber(8) @JvmField val viewCommentCount: Int = 0,\n        @ProtoNumber(100) @JvmField val requestUin: Long = 0L\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0x7db : ProtoBuf {\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val wording: String = \"\",\n        @ProtoNumber(2) @JvmField val msgAppointInfo: AppointDefine.AppointInfo? = null,\n        @ProtoNumber(3) @JvmField val sigC2C: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val appointAction: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val msgAppointId: AppointDefine.AppointID? = null,\n        @ProtoNumber(2) @JvmField val appointAction: Int = 0,\n        @ProtoNumber(3) @JvmField val overwrite: Int = 0,\n        @ProtoNumber(4) @JvmField val msgAppointIds: List<AppointDefine.AppointID> = emptyList()\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xc6c : ProtoBuf {\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val msgGroupInfo: List<GroupInfo> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupInfo(\n        @ProtoNumber(1) @JvmField val groupUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val groupCode: Long = 0L\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xc05 : ProtoBuf {\n    @Serializable\n    internal class GetAuthAppListReq(\n        @ProtoNumber(1) @JvmField val start: Int = 0,\n        @ProtoNumber(2) @JvmField val limit: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val wording: String = \"\",\n        @ProtoNumber(10) @JvmField val getCreateAppListRsp: GetCreateAppListRsp? = null,\n        @ProtoNumber(11) @JvmField val getAuthAppListRsp: GetAuthAppListRsp? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetCreateAppListRsp(\n        @ProtoNumber(1) @JvmField val totalCount: Int = 0,\n        @ProtoNumber(2) @JvmField val appinfos: List<Qqconnect.Appinfo> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetAuthAppListRsp(\n        @ProtoNumber(1) @JvmField val totalCount: Int = 0,\n        @ProtoNumber(2) @JvmField val appinfos: List<Qqconnect.Appinfo> = emptyList(),\n        @ProtoNumber(3) @JvmField val curIndex: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(10) @JvmField val getCreateAppListReq: GetCreateAppListReq? = null,\n        @ProtoNumber(11) @JvmField val getAuthAppListReq: GetAuthAppListReq? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetCreateAppListReq(\n        @ProtoNumber(1) @JvmField val start: Int = 0,\n        @ProtoNumber(2) @JvmField val limit: Int = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0x7da : ProtoBuf {\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val msgAppointIds: List<AppointDefine.AppointID> = emptyList(),\n        @ProtoNumber(2) @JvmField val appointOperation: Int = 0,\n        @ProtoNumber(3) @JvmField val operationReason: Int = 0,\n        @ProtoNumber(4) @JvmField val overwrite: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val wording: String = \"\",\n        @ProtoNumber(2) @JvmField val msgAppointInfo: List<AppointDefine.AppointInfo> = emptyList(),\n        @ProtoNumber(3) @JvmField val operationReason: Int = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Qqconnect : ProtoBuf {\n    @Serializable\n    internal class MobileAppInfo(\n        @ProtoNumber(11) @JvmField val androidAppInfo: List<AndroidAppInfo> = emptyList(),\n        @ProtoNumber(12) @JvmField val iosAppInfo: List<IOSAppInfo> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TemplateMsgConfig(\n        @ProtoNumber(1) @JvmField val serviceMsgUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val publicMsgUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val campMsgUin: Long = 0L\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Appinfo(\n        @ProtoNumber(1) @JvmField val appid: Int = 0,\n        @ProtoNumber(2) @JvmField val appType: Int = 0,\n        @ProtoNumber(3) @JvmField val platform: Int = 0,\n        @ProtoNumber(4) @JvmField val appName: String = \"\",\n        @ProtoNumber(5) @JvmField val appKey: String = \"\",\n        @ProtoNumber(6) @JvmField val appState: Int = 0,\n        @ProtoNumber(7) @JvmField val iphoneUrlScheme: String = \"\",\n        @ProtoNumber(8) @JvmField val androidPackName: String = \"\",\n        @ProtoNumber(9) @JvmField val iconUrl: String = \"\",\n        @ProtoNumber(10) @JvmField val sourceUrl: String = \"\",\n        @ProtoNumber(11) @JvmField val iconSmallUrl: String = \"\",\n        @ProtoNumber(12) @JvmField val iconMiddleUrl: String = \"\",\n        @ProtoNumber(13) @JvmField val tencentDocsAppinfo: TencentDocsAppinfo? = null,\n        @ProtoNumber(21) @JvmField val developerUin: Long = 0L,\n        @ProtoNumber(22) @JvmField val appClass: Int = 0,\n        @ProtoNumber(23) @JvmField val appSubclass: Int = 0,\n        @ProtoNumber(24) @JvmField val remark: String = \"\",\n        @ProtoNumber(25) @JvmField val iconMiniUrl: String = \"\",\n        @ProtoNumber(26) @JvmField val authTime: Long = 0L,\n        @ProtoNumber(27) @JvmField val appUrl: String = \"\",\n        @ProtoNumber(28) @JvmField val universalLink: String = \"\",\n        @ProtoNumber(29) @JvmField val qqconnectFeature: Int = 0,\n        @ProtoNumber(30) @JvmField val isHatchery: Int = 0,\n        @ProtoNumber(31) @JvmField val testUinList: List<Long> = emptyList(),\n        @ProtoNumber(100) @JvmField val templateMsgConfig: TemplateMsgConfig? = null,\n        @ProtoNumber(101) @JvmField val miniAppInfo: MiniAppInfo? = null,\n        @ProtoNumber(102) @JvmField val webAppInfo: WebAppInfo? = null,\n        @ProtoNumber(103) @JvmField val mobileAppInfo: MobileAppInfo? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ConnectClientInfo(\n        @ProtoNumber(1) @JvmField val platform: Int = 0,\n        @ProtoNumber(2) @JvmField val sdkVersion: String = \"\",\n        @ProtoNumber(3) @JvmField val systemName: String = \"\",\n        @ProtoNumber(4) @JvmField val systemVersion: String = \"\",\n        @ProtoNumber(21) @JvmField val androidPackageName: String = \"\",\n        @ProtoNumber(22) @JvmField val androidSignature: String = \"\",\n        @ProtoNumber(31) @JvmField val iosBundleId: String = \"\",\n        @ProtoNumber(32) @JvmField val iosDeviceId: String = \"\",\n        @ProtoNumber(33) @JvmField val iosAppToken: String = \"\",\n        @ProtoNumber(41) @JvmField val pcSign: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TencentDocsAppinfo(\n        @ProtoNumber(1) @JvmField val openTypes: String = \"\",\n        @ProtoNumber(2) @JvmField val opts: String = \"\",\n        @ProtoNumber(3) @JvmField val ejs: String = \"\",\n        @ProtoNumber(4) @JvmField val callbackUrlTest: String = \"\",\n        @ProtoNumber(5) @JvmField val callbackUrl: String = \"\",\n        @ProtoNumber(6) @JvmField val domain: String = \"\",\n        @ProtoNumber(7) @JvmField val userinfoCallback: String = \"\",\n        @ProtoNumber(8) @JvmField val userinfoCallbackTest: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class WebAppInfo(\n        @ProtoNumber(1) @JvmField val websiteUrl: String = \"\",\n        @ProtoNumber(2) @JvmField val provider: String = \"\",\n        @ProtoNumber(3) @JvmField val icp: String = \"\",\n        @ProtoNumber(4) @JvmField val callbackUrl: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class IOSAppInfo(\n        @ProtoNumber(1) @JvmField val bundleId: String = \"\",\n        @ProtoNumber(2) @JvmField val urlScheme: String = \"\",\n        @ProtoNumber(3) @JvmField val storeId: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgUinInfo(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val msgType: Int = 0,\n        @ProtoNumber(3) @JvmField val appid: Int = 0,\n        @ProtoNumber(4) @JvmField val appType: Int = 0,\n        @ProtoNumber(5) @JvmField val ctime: Int = 0,\n        @ProtoNumber(6) @JvmField val mtime: Int = 0,\n        @ProtoNumber(7) @JvmField val mpType: Int = 0,\n        @ProtoNumber(100) @JvmField val nick: String = \"\",\n        @ProtoNumber(101) @JvmField val faceUrl: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MiniAppInfo(\n        @ProtoNumber(1) @JvmField val superUin: Long = 0L,\n        @ProtoNumber(11) @JvmField val ownerType: Int = 0,\n        @ProtoNumber(12) @JvmField val ownerName: String = \"\",\n        @ProtoNumber(13) @JvmField val ownerIdCardType: Int = 0,\n        @ProtoNumber(14) @JvmField val ownerIdCard: String = \"\",\n        @ProtoNumber(15) @JvmField val ownerStatus: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class AndroidAppInfo(\n        @ProtoNumber(1) @JvmField val packName: String = \"\",\n        @ProtoNumber(2) @JvmField val packSign: String = \"\",\n        @ProtoNumber(3) @JvmField val apkDownUrl: String = \"\"\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Sync : ProtoBuf {\n    @Serializable\n    internal class SyncAppointmentReq(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val msgAppointment: AppointDefine.AppointContent? = null,\n        @ProtoNumber(3) @JvmField val msgGpsInfo: AppointDefine.GPS? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SyncAppointmentRsp(\n        @ProtoNumber(1) @JvmField val result: Int = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xc26 : ProtoBuf {\n    @Serializable\n    internal class RgoupLabel(\n        @ProtoNumber(1) @JvmField val name: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val enumType: Int /* enum */ = 1,\n        @ProtoNumber(3) @JvmField val textColor: RgroupColor? = null,\n        @ProtoNumber(4) @JvmField val edgingColor: RgroupColor? = null,\n        @ProtoNumber(5) @JvmField val labelAttr: Int = 0,\n        @ProtoNumber(6) @JvmField val labelType: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class AddFriendSource(\n        @ProtoNumber(1) @JvmField val source: Int = 0,\n        @ProtoNumber(2) @JvmField val subSource: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Label(\n        @ProtoNumber(1) @JvmField val name: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val textColor: Color? = null,\n        @ProtoNumber(3) @JvmField val edgingColor: Color? = null,\n        @ProtoNumber(4) @JvmField val labelType: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class EntryDelay(\n        @ProtoNumber(1) @JvmField val emEntry: Int /* enum */ = 1,\n        @ProtoNumber(2) @JvmField val delay: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val msgPersons: List<MayKnowPerson> = emptyList(),\n        @ProtoNumber(2) @JvmField val entryInuse: List<Int> = emptyList(),\n        @ProtoNumber(3) @JvmField val entryClose: List<Int> = emptyList(),\n        @ProtoNumber(4) @JvmField val nextGap: Int = 0,\n        @ProtoNumber(5) @JvmField val timestamp: Int = 0,\n        @ProtoNumber(6) @JvmField val msgUp: Int = 0,\n        @ProtoNumber(7) @JvmField val entryDelays: List<EntryDelay> = emptyList(),\n        @ProtoNumber(8) @JvmField val listSwitch: Int = 0,\n        @ProtoNumber(9) @JvmField val addPageListSwitch: Int = 0,\n        @ProtoNumber(10) @JvmField val emRspDataType: Int /* enum */ = 1,\n        @ProtoNumber(11) @JvmField val msgRgroupItems: List<RecommendInfo> = emptyList(),\n        @ProtoNumber(12) @JvmField val boolIsNewuser: Boolean = false,\n        @ProtoNumber(13) @JvmField val msgTables: List<TabInfo> = emptyList(),\n        @ProtoNumber(14) @JvmField val cookies: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TabInfo(\n        @ProtoNumber(1) @JvmField val tabId: Int = 0,\n        @ProtoNumber(2) @JvmField val recommendCount: Int = 0,\n        @ProtoNumber(3) @JvmField val tableName: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val iconUrlSelect: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val iconUrlUnselect: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val backgroundColorSelect: Color? = null,\n        @ProtoNumber(7) @JvmField val backgroundColorUnselect: Color? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MayKnowPerson(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val msgIosSource: AddFriendSource? = null,\n        @ProtoNumber(3) @JvmField val msgAndroidSource: AddFriendSource? = null,\n        @ProtoNumber(4) @JvmField val reason: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val additive: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val nick: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val remark: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val country: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(9) @JvmField val province: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(10) @JvmField val city: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(11) @JvmField val age: Int = 0,\n        @ProtoNumber(12) @JvmField val catelogue: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(13) @JvmField val alghrithm: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(14) @JvmField val richbuffer: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(15) @JvmField val qzone: Int = 0,\n        @ProtoNumber(16) @JvmField val gender: Int = 0,\n        @ProtoNumber(17) @JvmField val mobileName: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(18) @JvmField val token: String = \"\",\n        @ProtoNumber(19) @JvmField val onlineState: Int = 0,\n        @ProtoNumber(20) @JvmField val msgLabels: List<Label> = emptyList(),\n        @ProtoNumber(21) @JvmField val sourceid: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RecommendInfo(\n        @ProtoNumber(1) @JvmField val woring: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val msgGroups: List<RgroupInfo> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RgroupInfo(\n        @ProtoNumber(1) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(2) @JvmField val ownerUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val groupName: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val groupMemo: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val memberNum: Int = 0,\n        @ProtoNumber(6) @JvmField val groupLabel: List<RgoupLabel> = emptyList(),\n        @ProtoNumber(7) @JvmField val groupFlagExt: Int = 0,\n        @ProtoNumber(8) @JvmField val groupFlag: Int = 0,\n        @ProtoNumber(9) @JvmField val source: Int /* enum */ = 1,\n        @ProtoNumber(10) @JvmField val tagWording: RgoupLabel? = null,\n        @ProtoNumber(11) @JvmField val algorithm: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(12) @JvmField val joinGroupAuth: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(13) @JvmField val activity: Int = 0,\n        @ProtoNumber(14) @JvmField val memberMaxNum: Int = 0,\n        @ProtoNumber(15) @JvmField val int32UinPrivilege: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val filterUins: List<Long> = emptyList(),\n        @ProtoNumber(2) @JvmField val phoneBook: Int = 0,\n        @ProtoNumber(3) @JvmField val expectedUins: List<Long> = emptyList(),\n        @ProtoNumber(4) @JvmField val emEntry: Int /* enum */ = 1,\n        @ProtoNumber(5) @JvmField val fetchRgroup: Int = 0,\n        @ProtoNumber(6) @JvmField val tabId: Int = 0,\n        @ProtoNumber(7) @JvmField val want: Int = 80,\n        @ProtoNumber(8) @JvmField val cookies: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RgroupColor(\n        @ProtoNumber(1) @JvmField val r: Int = 0,\n        @ProtoNumber(2) @JvmField val g: Int = 0,\n        @ProtoNumber(3) @JvmField val b: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Color(\n        @ProtoNumber(1) @JvmField val r: Int = 0,\n        @ProtoNumber(2) @JvmField val g: Int = 0,\n        @ProtoNumber(3) @JvmField val b: Int = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0xac6 : ProtoBuf {\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val results: List<OperateResult> = emptyList(),\n        @ProtoNumber(4) @JvmField val metalCount: Int = 0,\n        @ProtoNumber(5) @JvmField val metalTotal: Int = 0,\n        @ProtoNumber(9) @JvmField val int32NewCount: Int = 0,\n        @ProtoNumber(10) @JvmField val int32UpgradeCount: Int = 0,\n        @ProtoNumber(11) @JvmField val promptParams: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val medals: List<MedalReport> = emptyList(),\n        @ProtoNumber(2) @JvmField val clean: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MedalReport(\n        @ProtoNumber(1) @JvmField val id: Int = 0,\n        @ProtoNumber(2) @JvmField val level: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class OperateResult(\n        @ProtoNumber(1) @JvmField val id: Int = 0,\n        @ProtoNumber(2) @JvmField val int32Result: Int = 0,\n        @ProtoNumber(3) @JvmField val errmsg: String = \"\"\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xd32 : ProtoBuf {\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val openid: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val xmitinfo: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class XmitInfo(\n        @ProtoNumber(1) @JvmField val signature: String = \"\",\n        @ProtoNumber(2) @JvmField val appid: String = \"\",\n        @ProtoNumber(3) @JvmField val groupid: String = \"\",\n        @ProtoNumber(4) @JvmField val nonce: String = \"\",\n        @ProtoNumber(5) @JvmField val timestamp: Int = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0x7cf : ProtoBuf {\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val stamp: Int = 0,\n        @ProtoNumber(2) @JvmField val start: Int = 0,\n        @ProtoNumber(3) @JvmField val want: Int = 0,\n        @ProtoNumber(4) @JvmField val reqValidOnly: Int = 0,\n        @ProtoNumber(5) @JvmField val msgAppointIds: List<AppointDefine.AppointID> = emptyList(),\n        @ProtoNumber(6) @JvmField val appointOperation: Int = 0,\n        @ProtoNumber(100) @JvmField val requestUin: Long = 0L\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val stamp: Int = 0,\n        @ProtoNumber(2) @JvmField val over: Int = 0,\n        @ProtoNumber(3) @JvmField val next: Int = 0,\n        @ProtoNumber(4) @JvmField val msgAppointsInfo: List<AppointDefine.AppointInfo> = emptyList(),\n        @ProtoNumber(5) @JvmField val unreadCount: Int = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0xac7 : ProtoBuf {\n    @Serializable\n    internal class DeviceInfo(\n        @ProtoNumber(1) @JvmField val din: Long = 0L,\n        @ProtoNumber(2) @JvmField val name: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val extd: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val cmd: Int = 0,\n        @ProtoNumber(2) @JvmField val din: Long = 0L,\n        @ProtoNumber(3) @JvmField val extd: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val msgBinderSig: BinderSig? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReceiveMessageDevices(\n        @ProtoNumber(1) @JvmField val devices: List<DeviceInfo> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class BinderSig(\n        @ProtoNumber(1) @JvmField val type: Int = 0,\n        @ProtoNumber(2) @JvmField val uin: Long = 0L,\n        @ProtoNumber(3) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0x5fa : ProtoBuf {\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val msgStrangerInfo: List<AppointDefine.StrangerInfo> = emptyList(),\n        @ProtoNumber(2) @JvmField val reachStart: Int = 0,\n        @ProtoNumber(3) @JvmField val reachEnd: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val appointIds: AppointDefine.AppointID? = null,\n        @ProtoNumber(2) @JvmField val referIdx: Int = 0,\n        @ProtoNumber(3) @JvmField val getReferRec: Int = 0,\n        @ProtoNumber(4) @JvmField val reqNextCount: Int = 0,\n        @ProtoNumber(5) @JvmField val reqPrevCount: Int = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class FavoriteCKVData : ProtoBuf {\n    @Serializable\n    internal class PicInfo(\n        @ProtoNumber(1) @JvmField val uri: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val md5: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val sha1: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val name: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val note: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val width: Int = 0,\n        @ProtoNumber(7) @JvmField val height: Int = 0,\n        @ProtoNumber(8) @JvmField val size: Int = 0,\n        @ProtoNumber(9) @JvmField val type: Int = 0,\n        @ProtoNumber(10) @JvmField val msgOwner: Author? = null,\n        @ProtoNumber(11) @JvmField val picId: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class KandianFavoriteItem(\n        @ProtoNumber(1) @JvmField val msgFavoriteExtInfo: KandianFavoriteBizData? = null,\n        @ProtoNumber(2) @JvmField val bytesCid: List<ByteArray> = emptyList(),\n        @ProtoNumber(3) @JvmField val type: Int = 0,\n        @ProtoNumber(4) @JvmField val status: Int = 0,\n        @ProtoNumber(5) @JvmField val msgAuthor: Author? = null,\n        @ProtoNumber(6) @JvmField val createTime: Long = 0L,\n        @ProtoNumber(7) @JvmField val favoriteTime: Long = 0L,\n        @ProtoNumber(8) @JvmField val modifyTime: Long = 0L,\n        @ProtoNumber(9) @JvmField val dataSyncTime: Long = 0L,\n        @ProtoNumber(10) @JvmField val msgFavoriteSummary: FavoriteSummary? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class LinkSummary(\n        @ProtoNumber(1) @JvmField val uri: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val title: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val publisher: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val brief: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val msgPicInfo: List<PicInfo> = emptyList(),\n        @ProtoNumber(6) @JvmField val type: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val resourceUri: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class UserFavoriteList(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val modifyTs: Long = 0L,\n        @ProtoNumber(100) @JvmField val msgFavoriteItems: List<FavoriteItem> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FavoriteSummary(\n        @ProtoNumber(2) @JvmField val msgLinkSummary: LinkSummary? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FavoriteItem(\n        @ProtoNumber(1) @JvmField val favoriteSource: Int = 0,\n        @ProtoNumber(100) @JvmField val msgKandianFavoriteItem: KandianFavoriteItem? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Author(\n        @ProtoNumber(1) @JvmField val type: Int = 0,\n        @ProtoNumber(2) @JvmField val numId: Long = 0L,\n        @ProtoNumber(3) @JvmField val strId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val groupId: Long = 0L,\n        @ProtoNumber(5) @JvmField val groupName: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class KandianFavoriteBizData(\n        @ProtoNumber(1) @JvmField val rowkey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val type: Int = 0,\n        @ProtoNumber(3) @JvmField val videoDuration: Int = 0,\n        @ProtoNumber(4) @JvmField val picNum: Int = 0,\n        @ProtoNumber(5) @JvmField val accountId: Long = 0L,\n        @ProtoNumber(6) @JvmField val accountName: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val videoType: Int = 0,\n        @ProtoNumber(8) @JvmField val feedsId: Long = 0L,\n        @ProtoNumber(9) @JvmField val feedsType: Int = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0x5ff : ProtoBuf {\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val errorTips: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val msgAppointId: AppointDefine.AppointID? = null,\n        @ProtoNumber(2) @JvmField val commentId: String = \"\"\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xccd : ProtoBuf {\n    @Serializable\n    internal class Result(\n        @ProtoNumber(1) @JvmField val appid: Int = 0,\n        @ProtoNumber(2) @JvmField val errcode: Int = 0,\n        @ProtoNumber(3) @JvmField val errmsg: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val int64Uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val appids: List<Int> = emptyList(),\n        @ProtoNumber(3) @JvmField val platform: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val errcode: Int = 0,\n        @ProtoNumber(2) @JvmField val results: List<Result> = emptyList()\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xc36 : ProtoBuf {\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val uint64Uins: List<Long> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0x87c : ProtoBuf {\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val country: String = \"\",\n        @ProtoNumber(2) @JvmField val telephone: String = \"\",\n        @ProtoNumber(3) @JvmField val smsCode: String = \"\",\n        @ProtoNumber(4) @JvmField val guid: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val enumButype: Int /* enum */ = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val country: String = \"\",\n        @ProtoNumber(2) @JvmField val telephone: String = \"\",\n        @ProtoNumber(3) @JvmField val keyType: Int = 0,\n        @ProtoNumber(4) @JvmField val key: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val guid: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0xbf2 : ProtoBuf {\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val phoneAddrBook: List<PhoneAddrBook> = emptyList(),\n        @ProtoNumber(2) @JvmField val end: Int = 0,\n        @ProtoNumber(3) @JvmField val nextIndex: Long = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PhoneAddrBook(\n        @ProtoNumber(1) @JvmField val phone: String = \"\",\n        @ProtoNumber(2) @JvmField val nick: String = \"\",\n        @ProtoNumber(3) @JvmField val headUrl: String = \"\",\n        @ProtoNumber(4) @JvmField val longNick: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val startIndex: Long = 0L,\n        @ProtoNumber(3) @JvmField val num: Long = 0L\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0x6cd : ProtoBuf {\n    @Serializable\n    internal class RedpointInfo(\n        @ProtoNumber(1) @JvmField val taskid: Int = 0,\n        @ProtoNumber(2) @JvmField val curSeq: Long = 0L,\n        @ProtoNumber(3) @JvmField val pullSeq: Long = 0L,\n        @ProtoNumber(4) @JvmField val readSeq: Long = 0L,\n        @ProtoNumber(5) @JvmField val pullTimes: Int = 0,\n        @ProtoNumber(6) @JvmField val lastPullTime: Int = 0,\n        @ProtoNumber(7) @JvmField val int32RemainedTime: Int = 0,\n        @ProtoNumber(8) @JvmField val lastRecvTime: Int = 0,\n        @ProtoNumber(9) @JvmField val fromId: Long = 0L,\n        @ProtoNumber(10) @JvmField val enumRedpointType: Int /* enum */ = 1,\n        @ProtoNumber(11) @JvmField val msgRedpointExtraInfo: RepointExtraInfo? = null,\n        @ProtoNumber(12) @JvmField val configVersion: String = \"\",\n        @ProtoNumber(13) @JvmField val doActivity: Int = 0,\n        @ProtoNumber(14) @JvmField val msgUnreadMsg: List<MessageRec> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PullRedpointReq(\n        @ProtoNumber(1) @JvmField val taskid: Int = 0,\n        @ProtoNumber(2) @JvmField val lastPullSeq: Long = 0L\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val msgRedpoint: List<RedpointInfo> = emptyList(),\n        @ProtoNumber(2) @JvmField val unfinishedRedpoint: List<PullRedpointReq> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val lastPullRedpoint: List<PullRedpointReq> = emptyList(),\n        @ProtoNumber(2) @JvmField val unfinishedRedpoint: List<PullRedpointReq> = emptyList(),\n        @ProtoNumber(3) @JvmField val msgPullSingleTask: PullRedpointReq? = null,\n        @ProtoNumber(4) @JvmField val retMsgRec: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MessageRec(\n        @ProtoNumber(1) @JvmField val seq: Long = 0L,\n        @ProtoNumber(2) @JvmField val time: Int = 0,\n        @ProtoNumber(3) @JvmField val content: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RepointExtraInfo(\n        @ProtoNumber(1) @JvmField val count: Int = 0,\n        @ProtoNumber(2) @JvmField val iconUrl: String = \"\",\n        @ProtoNumber(3) @JvmField val tips: String = \"\",\n        @ProtoNumber(4) @JvmField val data: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xd55 : ProtoBuf {\n    @Serializable\n    internal class CheckUserRsp(\n        @ProtoNumber(1) @JvmField val openidUin: Long = 0L\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CheckMiniAppRsp : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val appid: Long = 0L,\n        @ProtoNumber(2) @JvmField val appType: Int = 0,\n        @ProtoNumber(3) @JvmField val srcId: Int = 0,\n        @ProtoNumber(4) @JvmField val rawUrl: String = \"\",\n        @ProtoNumber(11) @JvmField val checkAppSignReq: CheckAppSignReq? = null,\n        @ProtoNumber(12) @JvmField val checkUserReq: CheckUserReq? = null,\n        @ProtoNumber(13) @JvmField val checkMiniAppReq: CheckMiniAppReq? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CheckAppSignReq(\n        @ProtoNumber(1) @JvmField val clientInfo: Qqconnect.ConnectClientInfo? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val wording: String = \"\",\n        @ProtoNumber(11) @JvmField val checkAppSignRsp: CheckAppSignRsp? = null,\n        @ProtoNumber(12) @JvmField val checkUserRsp: CheckUserRsp? = null,\n        @ProtoNumber(13) @JvmField val checkMiniAppRsp: CheckMiniAppRsp? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CheckUserReq(\n        @ProtoNumber(1) @JvmField val openid: String = \"\",\n        @ProtoNumber(2) @JvmField val needCheckSameUser: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CheckMiniAppReq(\n        @ProtoNumber(1) @JvmField val miniAppAppid: Long = 0L,\n        @ProtoNumber(2) @JvmField val needCheckBind: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CheckAppSignRsp(\n        @ProtoNumber(1) @JvmField val iosAppToken: String = \"\",\n        @ProtoNumber(2) @JvmField val iosUniversalLink: String = \"\",\n        @ProtoNumber(11) @JvmField val optimizeSwitch: Int = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0x8b4 : ProtoBuf {\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val gc: Long = 0L,\n        @ProtoNumber(2) @JvmField val guin: Long = 0L,\n        @ProtoNumber(3) @JvmField val flag: Int = 0,\n        @ProtoNumber(21) @JvmField val dstUin: Long = 0L,\n        @ProtoNumber(22) @JvmField val start: Int = 0,\n        @ProtoNumber(23) @JvmField val cnt: Int = 0,\n        @ProtoNumber(24) @JvmField val tag: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupInfo(\n        @ProtoNumber(1) @JvmField val gc: Long = 0L,\n        @ProtoNumber(2) @JvmField val groupName: String = \"\",\n        @ProtoNumber(3) @JvmField val faceUrl: String = \"\",\n        @ProtoNumber(4) @JvmField val setDisplayTime: Int = 0,\n        // @SerialId(5) @JvmField val groupLabel: List<GroupLabel.Label> = emptyList(),\n        @ProtoNumber(6) @JvmField val textIntro: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val richIntro: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TagInfo(\n        @ProtoNumber(1) @JvmField val dstUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val start: Int = 0,\n        @ProtoNumber(3) @JvmField val cnt: Int = 0,\n        @ProtoNumber(4) @JvmField val timestamp: Int = 0,\n        @ProtoNumber(5) @JvmField val _0x7ddSeq: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val flag: Int = 0,\n        @ProtoNumber(21) @JvmField val tag: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(22) @JvmField val groupInfo: List<GroupInfo> = emptyList(),\n        @ProtoNumber(23) @JvmField val textLabel: List<ByteArray> = emptyList()\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0x682 : ProtoBuf {\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val msgChatinfo: List<ChatInfo> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ChatInfo(\n        @ProtoNumber(1) @JvmField val touin: Long = 0L,\n        @ProtoNumber(2) @JvmField val chatflag: Int = 0,\n        @ProtoNumber(3) @JvmField val goldflag: Int = 0,\n        @ProtoNumber(4) @JvmField val totalexpcount: Int = 0,\n        @ProtoNumber(5) @JvmField val curexpcount: Int = 0,\n        @ProtoNumber(6) @JvmField val totalFlag: Int = 0,\n        @ProtoNumber(7) @JvmField val curdayFlag: Int = 0,\n        @ProtoNumber(8) @JvmField val expressTipsMsg: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(9) @JvmField val expressMsg: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val uint64Touinlist: List<Long> = emptyList()\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0x6f5 : ProtoBuf {\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val qqVersion: String = \"\",\n        @ProtoNumber(2) @JvmField val qqPlatform: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TaskInfo(\n        @ProtoNumber(1) @JvmField val taskId: Int = 0,\n        @ProtoNumber(2) @JvmField val appid: Int = 0,\n        @ProtoNumber(3) @JvmField val passthroughLevel: Int = 0,\n        @ProtoNumber(4) @JvmField val showLevel: Int = 0,\n        @ProtoNumber(5) @JvmField val extra: Int = 0,\n        @ProtoNumber(6) @JvmField val priority: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val configVersion: String = \"\",\n        @ProtoNumber(2) @JvmField val taskInfo: List<TaskInfo> = emptyList()\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xb7e : ProtoBuf {\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val topItem: List<DiandianTopConfig> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DiandianTopConfig(\n        @ProtoNumber(1) @JvmField val jumpUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val title: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val subTitle: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val subTitleColor: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val picUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val type: Int = 0,\n        @ProtoNumber(7) @JvmField val topicId: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody : ProtoBuf\n}\n\n@Serializable\ninternal class Oidb0xc2f : ProtoBuf {\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val msgGetFollowUserRecommendListRsp: GetFollowUserRecommendListRsp? = null\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetFollowUserRecommendListReq(\n        @ProtoNumber(1) @JvmField val followedUin: Long = 0L\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RecommendAccountInfo(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val accountType: Int = 0,\n        @ProtoNumber(3) @JvmField val nickName: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val headImgUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val isVip: Int = 0,\n        @ProtoNumber(6) @JvmField val isStar: Int = 0,\n        @ProtoNumber(7) @JvmField val recommendReason: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetFollowUserRecommendListRsp(\n        @ProtoNumber(1) @JvmField val msgRecommendList: List<RecommendAccountInfo> = emptyList(),\n        @ProtoNumber(2) @JvmField val jumpUrl: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val msgGetFollowUserRecommendListReq: GetFollowUserRecommendListReq? = null\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0x7ca : ProtoBuf {\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val msgAppointId: AppointDefine.AppointID? = null,\n        @ProtoNumber(2) @JvmField val tinyid: Long = 0L,\n        @ProtoNumber(3) @JvmField val opType: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val sigC2C: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val peerUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val errorWording: String = \"\",\n        @ProtoNumber(4) @JvmField val opType: Int = 0\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0xd40 : ProtoBuf {\n    @Serializable\n    internal class DeviceInfo(\n        @ProtoNumber(1) @JvmField val os: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val dev: DeviceInfo? = null,\n        @ProtoNumber(2) @JvmField val src: Int = 0,\n        @ProtoNumber(3) @JvmField val event: Int = 0,\n        @ProtoNumber(4) @JvmField val redtype: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0x6ce : ProtoBuf {\n    @Serializable\n    internal class RspBody : ProtoBuf\n\n    @Serializable\n    internal class ReadRedpointReq(\n        @ProtoNumber(1) @JvmField val taskid: Int = 0,\n        @ProtoNumber(2) @JvmField val readSeq: Long = 0L,\n        @ProtoNumber(3) @JvmField val appid: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val msgReadReq: List<ReadRedpointReq> = emptyList()\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Cmd0xed3 : ProtoBuf {\n    @Serializable\n    internal class RspBody : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(3) @JvmField val msgSeq: Int = 0,\n        @ProtoNumber(4) @JvmField val msgRandom: Int = 0,\n        @ProtoNumber(5) @JvmField val aioUin: Long = 0L\n    ) : ProtoBuf\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/Oidb0x6d6.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"SpellCheckingInspection\")\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.CheckableStruct\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\ninternal class Oidb0x6d6 : ProtoBuf {\n    @Serializable\n    internal class DeleteFileReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val appId: Int = 0,\n        @JvmField @ProtoNumber(3) val busId: Int = 0,\n        @JvmField @ProtoNumber(4) val parentFolderId: String = \"\",\n        @JvmField @ProtoNumber(5) val fileId: String = \"\",\n        @JvmField @ProtoNumber(6) val msgdbSeq: Int = 0,\n        @JvmField @ProtoNumber(7) val msgRand: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DeleteFileRspBody(\n        /**\n         * -103: file not exist\n         */\n        @ProtoNumber(1) override val int32RetCode: Int = 0,\n        @ProtoNumber(2) override val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val clientWording: String = \"\",\n    ) : ProtoBuf, CheckableStruct\n\n    @Serializable\n    internal class DownloadFileReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val appId: Int = 0,\n        @JvmField @ProtoNumber(3) val busId: Int = 0,\n        @JvmField @ProtoNumber(4) val fileId: String = \"\",\n        @JvmField @ProtoNumber(5) val boolThumbnailReq: Boolean = false,\n        @JvmField @ProtoNumber(6) val urlType: Int = 0,\n        @JvmField @ProtoNumber(7) val boolPreviewReq: Boolean = false,\n        @JvmField @ProtoNumber(8) val src: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DownloadFileRspBody(\n        @ProtoNumber(1) override val int32RetCode: Int = 0,\n        @ProtoNumber(2) override val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val clientWording: String = \"\",\n        @JvmField @ProtoNumber(4) val downloadIp: String = \"\",\n        @JvmField @ProtoNumber(5) val downloadDns: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(6) val downloadUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(7) val sha: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(8) val sha3: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(9) val md5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(10) val cookieVal: String = \"\",\n        @JvmField @ProtoNumber(11) val saveFileName: String = \"\",\n        @JvmField @ProtoNumber(12) val previewPort: Int = 0,\n        @JvmField @ProtoNumber(13) val downloadDnsHttps: String = \"\",\n        @JvmField @ProtoNumber(14) val previewPortHttps: Int = 0,\n    ) : ProtoBuf, CheckableStruct\n\n    @Serializable\n    internal class MoveFileReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val appId: Int = 0,\n        @JvmField @ProtoNumber(3) val busId: Int = 0,\n        @JvmField @ProtoNumber(4) val fileId: String = \"\",\n        @JvmField @ProtoNumber(5) val parentFolderId: String = \"\",\n        @JvmField @ProtoNumber(6) val destFolderId: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MoveFileRspBody(\n        @ProtoNumber(1) override val int32RetCode: Int = 0,\n        @ProtoNumber(2) override val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val clientWording: String = \"\",\n        @JvmField @ProtoNumber(4) val parentFolderId: String = \"\",\n    ) : ProtoBuf, CheckableStruct\n\n    @Serializable\n    internal class RenameFileReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val appId: Int = 0,\n        @JvmField @ProtoNumber(3) val busId: Int = 0,\n        @JvmField @ProtoNumber(4) val fileId: String = \"\",\n        @JvmField @ProtoNumber(5) val parentFolderId: String = \"\",\n        @JvmField @ProtoNumber(6) val newFileName: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RenameFileRspBody(\n        @ProtoNumber(1) override val int32RetCode: Int = 0,\n        @ProtoNumber(2) override val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val clientWording: String = \"\",\n    ) : ProtoBuf, CheckableStruct\n\n    @Serializable\n    internal class ReqBody(\n        @JvmField @ProtoNumber(1) val uploadFileReq: UploadFileReqBody? = null,\n        @JvmField @ProtoNumber(2) val resendFileReq: ResendReqBody? = null,\n        @JvmField @ProtoNumber(3) val downloadFileReq: DownloadFileReqBody? = null,\n        @JvmField @ProtoNumber(4) val deleteFileReq: DeleteFileReqBody? = null,\n        @JvmField @ProtoNumber(5) val renameFileReq: RenameFileReqBody? = null,\n        @JvmField @ProtoNumber(6) val moveFileReq: MoveFileReqBody? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ResendReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val appId: Int = 0,\n        @JvmField @ProtoNumber(3) val busId: Int = 0,\n        @JvmField @ProtoNumber(4) val fileId: String = \"\",\n        @JvmField @ProtoNumber(5) val sha: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ResendRspBody(\n        @ProtoNumber(1) override val int32RetCode: Int = 0,\n        @ProtoNumber(2) override val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val clientWording: String = \"\",\n        @JvmField @ProtoNumber(4) val uploadIp: String = \"\",\n        @JvmField @ProtoNumber(5) val fileKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(6) val checkKey: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf, CheckableStruct\n\n    @Serializable\n    internal class RspBody(\n        @JvmField @ProtoNumber(1) val uploadFileRsp: UploadFileRspBody? = null,\n        @JvmField @ProtoNumber(2) val resendFileRsp: ResendRspBody? = null,\n        @JvmField @ProtoNumber(3) val downloadFileRsp: DownloadFileRspBody? = null,\n        @JvmField @ProtoNumber(4) val deleteFileRsp: DeleteFileRspBody? = null,\n        @JvmField @ProtoNumber(5) val renameFileRsp: RenameFileRspBody? = null,\n        @JvmField @ProtoNumber(6) val moveFileRsp: MoveFileRspBody? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class UploadFileReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val appId: Int = 0,\n        @JvmField @ProtoNumber(3) val busId: Int = 0,\n        @JvmField @ProtoNumber(4) val entrance: Int = 0,\n        @JvmField @ProtoNumber(5) val parentFolderId: String = \"\",\n        @JvmField @ProtoNumber(6) val fileName: String = \"\",\n        @JvmField @ProtoNumber(7) val localPath: String = \"\",\n        @JvmField @ProtoNumber(8) val fileSize: Long = 0L,\n        @JvmField @ProtoNumber(9) val sha: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(10) val sha3: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(11) val md5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(15) val boolSupportMultiUpload: Boolean = false,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class UploadFileRspBody(\n        @ProtoNumber(1) override val int32RetCode: Int = 0,\n        @ProtoNumber(2) override val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val clientWording: String = \"\",\n        @JvmField @ProtoNumber(4) val uploadIp: String = \"\",\n        @JvmField @ProtoNumber(5) val serverDns: String = \"\",\n        @JvmField @ProtoNumber(6) val busId: Int = 0,\n        @JvmField @ProtoNumber(7) val fileId: String = \"\",\n        @JvmField @ProtoNumber(8) val fileKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(9) val checkKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(10) val boolFileExist: Boolean = false,\n        @JvmField @ProtoNumber(12) val uploadIpLanV4: List<String> = emptyList(),\n        @JvmField @ProtoNumber(13) val uploadIpLanV6: List<String> = emptyList(),\n        @JvmField @ProtoNumber(14) val uploadPort: Int = 0,\n    ) : ProtoBuf, CheckableStruct\n}\n        "
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/Oidb0x6d7.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"SpellCheckingInspection\")\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.CheckableStruct\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport kotlin.jvm.JvmField\n\ninternal class Oidb0x6d7 : ProtoBuf {\n    @Serializable\n    internal class CreateFolderReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val appId: Int = 0,\n        @JvmField @ProtoNumber(3) val parentFolderId: String = \"\",\n        @JvmField @ProtoNumber(4) val folderName: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CreateFolderRspBody(\n        @ProtoNumber(1) override val int32RetCode: Int = 0,\n        @ProtoNumber(2) override val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val clientWording: String = \"\",\n        @JvmField @ProtoNumber(4) val folderInfo: GroupFileCommon.FolderInfo? = null,\n    ) : ProtoBuf, CheckableStruct\n\n    @Serializable\n    internal class DeleteFolderReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val appId: Int = 0,\n        @JvmField @ProtoNumber(3) val folderId: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DeleteFolderRspBody(\n        @ProtoNumber(1) override val int32RetCode: Int = 0,\n        @ProtoNumber(2) override val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val clientWording: String = \"\",\n    ) : ProtoBuf, CheckableStruct\n\n    @Serializable\n    internal class MoveFolderReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val appId: Int = 0,\n        @JvmField @ProtoNumber(3) val folderId: String = \"\",\n        @JvmField @ProtoNumber(4) val parentFolderId: String = \"\",\n        @JvmField @ProtoNumber(5) val destFolderId: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MoveFolderRspBody(\n        @ProtoNumber(1) override val int32RetCode: Int = 0,\n        @ProtoNumber(2) override val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val clientWording: String = \"\",\n        @JvmField @ProtoNumber(4) val folderInfo: GroupFileCommon.FolderInfo? = null,\n    ) : ProtoBuf, CheckableStruct\n\n    @Serializable\n    internal class RenameFolderReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val appId: Int = 0,\n        @JvmField @ProtoNumber(3) val folderId: String = \"\",\n        @JvmField @ProtoNumber(4) val newFolderName: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RenameFolderRspBody(\n        @ProtoNumber(1) override val int32RetCode: Int = 0,\n        @ProtoNumber(2) override val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val clientWording: String = \"\",\n        @JvmField @ProtoNumber(4) val folderInfo: GroupFileCommon.FolderInfo? = null,\n    ) : ProtoBuf, CheckableStruct\n\n    @Serializable\n    internal class ReqBody(\n        @JvmField @ProtoNumber(1) val createFolderReq: CreateFolderReqBody? = null,\n        @JvmField @ProtoNumber(2) val deleteFolderReq: DeleteFolderReqBody? = null,\n        @JvmField @ProtoNumber(3) val renameFolderReq: RenameFolderReqBody? = null,\n        @JvmField @ProtoNumber(4) val moveFolderReq: MoveFolderReqBody? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @JvmField @ProtoNumber(1) val createFolderRsp: CreateFolderRspBody? = null,\n        @JvmField @ProtoNumber(2) val deleteFolderRsp: DeleteFolderRspBody? = null,\n        @JvmField @ProtoNumber(3) val renameFolderRsp: RenameFolderRspBody? = null,\n        @JvmField @ProtoNumber(4) val moveFolderRsp: MoveFolderRspBody? = null,\n    ) : ProtoBuf\n}\n        "
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/Oidb0x6d8.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"SpellCheckingInspection\")\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\ninternal class Oidb0x6d8 : ProtoBuf {\n    @Serializable\n    internal class FileTimeStamp(\n        @JvmField @ProtoNumber(1) val uploadTime: Int = 0,\n        @JvmField @ProtoNumber(2) val fileId: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetFileCountReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val appId: Int = 0,\n        @JvmField @ProtoNumber(3) val busId: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetFileCountRspBody(\n        @JvmField @ProtoNumber(1) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(2) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val clientWording: String = \"\",\n        @JvmField @ProtoNumber(4) val allFileCount: Int = 0,\n        @JvmField @ProtoNumber(5) val boolFileTooMany: Boolean = false,\n        @JvmField @ProtoNumber(6) val limitCount: Int = 0,\n        @JvmField @ProtoNumber(7) val boolIsFull: Boolean = false,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetFileInfoReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val appId: Int = 0,\n        @JvmField @ProtoNumber(3) val busId: Int = 0,\n        @JvmField @ProtoNumber(4) val fileId: String = \"\",\n        @JvmField @ProtoNumber(5) val fieldFlag: Int = 16777215,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetFileInfoRspBody(\n        @JvmField @ProtoNumber(1) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(2) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val clientWording: String = \"\",\n        @JvmField @ProtoNumber(4) val fileInfo: GroupFileCommon.FileInfo? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetFileListReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val appId: Int = 0,\n        @JvmField @ProtoNumber(3) val folderId: String = \"\",\n        @JvmField @ProtoNumber(4) val startTimestamp: FileTimeStamp? = null,\n        @JvmField @ProtoNumber(5) val fileCount: Int = 0,\n        @JvmField @ProtoNumber(6) val maxTimestamp: FileTimeStamp? = null,\n        @JvmField @ProtoNumber(7) val allFileCount: Int = 0,\n        @JvmField @ProtoNumber(8) val reqFrom: Int = 0,\n        @JvmField @ProtoNumber(9) val sortBy: Int = 0,\n        @JvmField @ProtoNumber(10) val filterCode: Int = 0,\n        @JvmField @ProtoNumber(11) val uin: Long = 0L,\n        @JvmField @ProtoNumber(12) val fieldFlag: Int = 16777215,\n        @JvmField @ProtoNumber(13) val startIndex: Int = 0,\n        @JvmField @ProtoNumber(14) val context: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(15) val clientVersion: Int = 0,\n        @JvmField @ProtoNumber(16) val whiteList: Int = 0,\n        @JvmField @ProtoNumber(17) val sortOrder: Int = 0,\n        @JvmField @ProtoNumber(18) val showOnlinedocFolder: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetFileListRspBody(\n        @JvmField @ProtoNumber(1) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(2) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val clientWording: String = \"\",\n        @JvmField @ProtoNumber(4) val boolIsEnd: Boolean = false,\n        @JvmField @ProtoNumber(5) val itemList: List<Item> = emptyList(),\n        @JvmField @ProtoNumber(6) val msgMaxTimestamp: FileTimeStamp? = null,\n        @JvmField @ProtoNumber(7) val allFileCount: Int = 0,\n        @JvmField @ProtoNumber(8) val filterCode: Int = 0,\n        @JvmField @ProtoNumber(11) val boolSafeCheckFlag: Boolean = false,\n        @JvmField @ProtoNumber(12) val safeCheckRes: Int = 0,\n        @JvmField @ProtoNumber(13) val nextIndex: Int = 0,\n        @JvmField @ProtoNumber(14) val context: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(15) val role: Int = 0,\n        @JvmField @ProtoNumber(16) val openFlag: Int = 0,\n    ) : ProtoBuf {\n        @Serializable\n        internal class Item(\n            @JvmField @ProtoNumber(1) val type: Int = 0, // folder=2,\n            @JvmField @ProtoNumber(2) val folderInfo: GroupFileCommon.FolderInfo? = null,\n            @JvmField @ProtoNumber(3) val fileInfo: GroupFileCommon.FileInfo? = null,\n        ) : ProtoBuf {\n            val id get() = fileInfo?.fileId ?: folderInfo?.folderId\n            val name get() = fileInfo?.fileName ?: folderInfo?.folderName\n        }\n    }\n\n    @Serializable\n    internal class GetFilePreviewReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val appId: Int = 0,\n        @JvmField @ProtoNumber(3) val busId: Int = 0,\n        @JvmField @ProtoNumber(4) val fileId: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetFilePreviewRspBody(\n        @JvmField @ProtoNumber(1) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(2) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val clientWording: String = \"\",\n        @JvmField @ProtoNumber(4) val int32ServerIp: Int = 0,\n        @JvmField @ProtoNumber(5) val int32ServerPort: Int = 0,\n        @JvmField @ProtoNumber(6) val downloadDns: String = \"\",\n        @JvmField @ProtoNumber(7) val downloadUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(8) val cookieVal: String = \"\",\n        @JvmField @ProtoNumber(9) val reservedField: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(10) val downloadDnsHttps: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(11) val previewPortHttps: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetSpaceReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val appId: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetSpaceRspBody(\n        @JvmField @ProtoNumber(1) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(2) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val clientWording: String = \"\",\n        @JvmField @ProtoNumber(4) val totalSpace: Long = 0L,\n        @JvmField @ProtoNumber(5) val usedSpace: Long = 0L,\n        @JvmField @ProtoNumber(6) val boolAllUpload: Boolean = false,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @JvmField @ProtoNumber(1) val fileInfoReq: GetFileInfoReqBody? = null,\n        @JvmField @ProtoNumber(2) val fileListInfoReq: GetFileListReqBody? = null,\n        @JvmField @ProtoNumber(3) val groupFileCntReq: GetFileCountReqBody? = null,\n        @JvmField @ProtoNumber(4) val groupSpaceReq: GetSpaceReqBody? = null,\n        @JvmField @ProtoNumber(5) val filePreviewReq: GetFilePreviewReqBody? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @JvmField @ProtoNumber(1) val fileInfoRsp: GetFileInfoRspBody? = null,\n        @JvmField @ProtoNumber(2) val fileListInfoRsp: GetFileListRspBody? = null,\n        @JvmField @ProtoNumber(3) val groupFileCntRsp: GetFileCountRspBody? = null,\n        @JvmField @ProtoNumber(4) val groupSpaceRsp: GetSpaceRspBody? = null,\n        @JvmField @ProtoNumber(5) val filePreviewRsp: GetFilePreviewRspBody? = null,\n    ) : ProtoBuf\n}\n        "
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/Oidb0x6d9.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"SpellCheckingInspection\")\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\ninternal class Oidb0x6d9 : ProtoBuf {\n    @Serializable\n    internal class CopyFromReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val appId: Int = 0,\n        @JvmField @ProtoNumber(3) val srcBusId: Int = 0,\n        @JvmField @ProtoNumber(4) val srcParentFolder: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(5) val srcFilePath: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(6) val dstBusId: Int = 0,\n        @JvmField @ProtoNumber(7) val dstFolderId: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(8) val fileSize: Long = 0L,\n        @JvmField @ProtoNumber(9) val localPath: String = \"\",\n        @JvmField @ProtoNumber(10) val fileName: String = \"\",\n        @JvmField @ProtoNumber(11) val srcUin: Long = 0L,\n        @JvmField @ProtoNumber(12) val md5: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CopyFromRspBody(\n        @JvmField @ProtoNumber(1) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(2) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val clientWording: String = \"\",\n        @JvmField @ProtoNumber(4) val saveFilePath: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(5) val busId: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CopyToReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val appId: Int = 0,\n        @JvmField @ProtoNumber(3) val srcBusId: Int = 0,\n        @JvmField @ProtoNumber(4) val srcFileId: String = \"\",\n        @JvmField @ProtoNumber(5) val dstBusId: Int = 0,\n        @JvmField @ProtoNumber(6) val dstUin: Long = 0L,\n        @JvmField @ProtoNumber(40) val newFileName: String = \"\",\n        @JvmField @ProtoNumber(100) val timCloudPdirKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(101) val timCloudPpdirKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(102) val timCloudExtensionInfo: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(103) val timFileExistOption: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CopyToRspBody(\n        @JvmField @ProtoNumber(1) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(2) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val clientWording: String = \"\",\n        @JvmField @ProtoNumber(4) val saveFilePath: String = \"\",\n        @JvmField @ProtoNumber(5) val busId: Int = 0,\n        @JvmField @ProtoNumber(40) val fileName: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FeedsReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val appId: Int = 0,\n        @JvmField @ProtoNumber(3) val feedsInfoList: List<GroupFileCommon.FeedsInfo> = emptyList(),\n        @JvmField @ProtoNumber(4) val multiSendSeq: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FeedsRspBody(\n        @JvmField @ProtoNumber(1) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(2) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val clientWording: String = \"\",\n        @JvmField @ProtoNumber(4) val feedsResultList: List<GroupFileCommon.FeedsResult> = emptyList(),\n        @JvmField @ProtoNumber(5) val svrbusyWaitTime: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @JvmField @ProtoNumber(1) val transFileReq: TransFileReqBody? = null,\n        @JvmField @ProtoNumber(2) val copyFromReq: CopyFromReqBody? = null,\n        @JvmField @ProtoNumber(3) val copyToReq: CopyToReqBody? = null,\n        @JvmField @ProtoNumber(5) val feedsInfoReq: FeedsReqBody? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @JvmField @ProtoNumber(1) val transFileRsp: TransFileRspBody? = null,\n        @JvmField @ProtoNumber(2) val copyFromRsp: CopyFromRspBody? = null,\n        @JvmField @ProtoNumber(3) val copyToRsp: CopyToRspBody? = null,\n        @JvmField @ProtoNumber(5) val feedsInfoRsp: FeedsRspBody? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TransFileReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val appId: Int = 0,\n        @JvmField @ProtoNumber(3) val busId: Int = 0,\n        @JvmField @ProtoNumber(4) val fileId: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TransFileRspBody(\n        @JvmField @ProtoNumber(1) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(2) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val clientWording: String = \"\",\n        @JvmField @ProtoNumber(4) val saveBusId: Int = 0,\n        @JvmField @ProtoNumber(5) val saveFilePath: String = \"\",\n    ) : ProtoBuf\n}\n        "
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/Oidb0x769.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"SpellCheckingInspection\")\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class Oidb0x769 : ProtoBuf {\n    @Serializable\n    internal class Camera(\n        @JvmField @ProtoNumber(1) val primary: Long = 0L,\n        @JvmField @ProtoNumber(2) val secondary: Long = 0L,\n        @JvmField @ProtoNumber(3) val flash: Boolean = false,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Config(\n        @JvmField @ProtoNumber(1) val type: Int = 0,\n        @JvmField @ProtoNumber(2) val version: Int = 0,\n        @JvmField @ProtoNumber(3) val contentList: List<String> = emptyList(),\n        @JvmField @ProtoNumber(4) val debugMsg: String = \"\",\n        @JvmField @ProtoNumber(5) val msgContentList: List<Content> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ConfigSeq(\n        @JvmField @ProtoNumber(1) val type: Int = 0,\n        @JvmField @ProtoNumber(2) val version: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Content(\n        @JvmField @ProtoNumber(1) val taskId: Int = 0,\n        @JvmField @ProtoNumber(2) val compress: Int = 0,\n        @JvmField @ProtoNumber(10) val content: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CPU(\n        @JvmField @ProtoNumber(1) val model: String = \"\",\n        @JvmField @ProtoNumber(2) val cores: Int = 0,\n        @JvmField @ProtoNumber(3) val frequency: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DeviceInfo(\n        @JvmField @ProtoNumber(1) val brand: String = \"\",\n        @JvmField @ProtoNumber(2) val model: String = \"\",\n        @JvmField @ProtoNumber(3) val os: OS? = null,\n        @JvmField @ProtoNumber(4) val cpu: CPU? = null,\n        @JvmField @ProtoNumber(5) val memory: Memory? = null,\n        @JvmField @ProtoNumber(6) val storage: Storage? = null,\n        @JvmField @ProtoNumber(7) val screen: Screen? = null,\n        @JvmField @ProtoNumber(8) val camera: Camera? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Memory(\n        @JvmField @ProtoNumber(1) val total: Long = 0L,\n        @JvmField @ProtoNumber(2) val process: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class OS(\n        //1 IOS | 2 ANDROID | 3 OTHER\n        @JvmField @ProtoNumber(1) val type: Int /* enum */ = 1,\n        @JvmField @ProtoNumber(2) val version: String = \"\",\n        @JvmField @ProtoNumber(3) val sdk: String = \"\",\n        @JvmField @ProtoNumber(4) val kernel: String = \"\",\n        @JvmField @ProtoNumber(5) val rom: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class QueryUinPackageUsageReq(\n        @JvmField @ProtoNumber(1) val type: Int = 0,\n        @JvmField @ProtoNumber(2) val uinFileSize: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class QueryUinPackageUsageRsp(\n        @JvmField @ProtoNumber(1) val status: Int = 0,\n        @JvmField @ProtoNumber(2) val leftUinNum: Long = 0L,\n        @JvmField @ProtoNumber(3) val maxUinNum: Long = 0L,\n        @JvmField @ProtoNumber(4) val proportion: Int = 0,\n        @JvmField @ProtoNumber(10) val uinPackageUsedList: List<UinPackageUsedInfo> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @JvmField @ProtoNumber(1) val configList: List<ConfigSeq> = emptyList(),\n        @JvmField @ProtoNumber(2) val msgDeviceInfo: DeviceInfo? = null,\n        @JvmField @ProtoNumber(3) val info: String = \"\",\n        @JvmField @ProtoNumber(4) val province: String = \"\",\n        @JvmField @ProtoNumber(5) val city: String = \"\",\n        @JvmField @ProtoNumber(6) val reqDebugMsg: Int = 0,\n        @JvmField @ProtoNumber(101) val queryUinPackageUsageReq: QueryUinPackageUsageReq? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @JvmField @ProtoNumber(1) val result: Int = 0,\n        @JvmField @ProtoNumber(2) val configList: List<Config> = emptyList(),\n        @JvmField @ProtoNumber(101) val queryUinPackageUsageRsp: QueryUinPackageUsageRsp? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Screen(\n        @JvmField @ProtoNumber(1) val model: String = \"\",\n        @JvmField @ProtoNumber(2) val width: Int = 0,\n        @JvmField @ProtoNumber(3) val height: Int = 0,\n        @JvmField @ProtoNumber(4) val dpi: Int = 0,\n        @JvmField @ProtoNumber(5) val multiTouch: Boolean = false,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Storage(\n        @JvmField @ProtoNumber(1) val builtin: Long = 0L,\n        @JvmField @ProtoNumber(2) val external: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class UinPackageUsedInfo(\n        @JvmField @ProtoNumber(1) val ruleId: Int = 0,\n        @JvmField @ProtoNumber(2) val author: String = \"\",\n        @JvmField @ProtoNumber(3) val url: String = \"\",\n        @JvmField @ProtoNumber(4) val uinNum: Long = 0L,\n    ) : ProtoBuf\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/Oidb0xeac.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"SpellCheckingInspection\")\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class Oidb0xeac : ProtoBuf {\n    @Serializable\n    internal class ArkMsg(\n        @JvmField @ProtoNumber(1) val appName: String = \"\",\n        @JvmField @ProtoNumber(2) val json: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class BatchReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val msgs: List<Oidb0xeac.MsgInfo> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class BatchRspBody(\n        @JvmField @ProtoNumber(1) val wording: String = \"\",\n        @JvmField @ProtoNumber(2) val errorCode: Int = 0,\n        @JvmField @ProtoNumber(3) val succCnt: Int = 0,\n        @JvmField @ProtoNumber(4) val msgProcInfos: List<Oidb0xeac.MsgProcessInfo> = emptyList(),\n        @JvmField @ProtoNumber(5) val digestTime: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DigestMsg(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val msgSeq: Int = 0,\n        @JvmField @ProtoNumber(3) val msgRandom: Int = 0,\n        @JvmField @ProtoNumber(4) val msgContent: List<Oidb0xeac.MsgElem> = emptyList(),\n        @JvmField @ProtoNumber(5) val textSize: Long = 0L,\n        @JvmField @ProtoNumber(6) val picSize: Long = 0L,\n        @JvmField @ProtoNumber(7) val videoSize: Long = 0L,\n        @JvmField @ProtoNumber(8) val senderUin: Long = 0L,\n        @JvmField @ProtoNumber(9) val senderTime: Int = 0,\n        @JvmField @ProtoNumber(10) val addDigestUin: Long = 0L,\n        @JvmField @ProtoNumber(11) val addDigestTime: Int = 0,\n        @JvmField @ProtoNumber(12) val startTime: Int = 0,\n        @JvmField @ProtoNumber(13) val latestMsgSeq: Int = 0,\n        @JvmField @ProtoNumber(14) val opType: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FaceMsg(\n        @JvmField @ProtoNumber(1) val index: Int = 0,\n        @JvmField @ProtoNumber(2) val text: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupFileMsg(\n        @JvmField @ProtoNumber(1) val fileName: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(2) val busId: Int = 0,\n        @JvmField @ProtoNumber(3) val fileId: String = \"\",\n        @JvmField @ProtoNumber(4) val fileSize: Long = 0L,\n        @JvmField @ProtoNumber(5) val deadTime: Long = 0L,\n        @JvmField @ProtoNumber(6) val fileSha1: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(7) val ext: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(8) val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ImageMsg(\n        @JvmField @ProtoNumber(1) val md5: String = \"\",\n        @JvmField @ProtoNumber(2) val uuid: String = \"\",\n        @JvmField @ProtoNumber(3) val imgType: Int = 0,\n        @JvmField @ProtoNumber(4) val fileSize: Int = 0,\n        @JvmField @ProtoNumber(5) val width: Int = 0,\n        @JvmField @ProtoNumber(6) val height: Int = 0,\n        @JvmField @ProtoNumber(101) val fileId: Int = 0,\n        @JvmField @ProtoNumber(102) val serverIp: Int = 0,\n        @JvmField @ProtoNumber(103) val serverPort: Int = 0,\n        @JvmField @ProtoNumber(104) val filePath: String = \"\",\n        @JvmField @ProtoNumber(201) val thumbUrl: String = \"\",\n        @JvmField @ProtoNumber(202) val originalUrl: String = \"\",\n        @JvmField @ProtoNumber(203) val resaveUrl: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgElem(\n        @JvmField @ProtoNumber(1) val msgType: Int = 0,\n        @JvmField @ProtoNumber(11) val textMsg: Oidb0xeac.TextMsg? = null,\n        @JvmField @ProtoNumber(12) val faceMsg: Oidb0xeac.FaceMsg? = null,\n        @JvmField @ProtoNumber(13) val imageMsg: Oidb0xeac.ImageMsg? = null,\n        @JvmField @ProtoNumber(14) val groupFileMsg: Oidb0xeac.GroupFileMsg? = null,\n        @JvmField @ProtoNumber(15) val shareMsg: Oidb0xeac.ShareMsg? = null,\n        @JvmField @ProtoNumber(16) val richMsg: Oidb0xeac.RichMsg? = null,\n        @JvmField @ProtoNumber(17) val arkMsg: Oidb0xeac.ArkMsg? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgInfo(\n        @JvmField @ProtoNumber(1) val msgSeq: Int = 0,\n        @JvmField @ProtoNumber(2) val msgRandom: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgProcessInfo(\n        @JvmField @ProtoNumber(1) val msg: Oidb0xeac.MsgInfo? = null,\n        @JvmField @ProtoNumber(2) val errorCode: Int = 0,\n        @JvmField @ProtoNumber(3) val digestUin: Long = 0L,\n        @JvmField @ProtoNumber(4) val digestTime: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @JvmField @ProtoNumber(1) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(2) val msgSeq: Int = 0,\n        @JvmField @ProtoNumber(3) val msgRandom: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RichMsg(\n        @JvmField @ProtoNumber(1) val serviceId: Int = 0,\n        @JvmField @ProtoNumber(2) val xml: String = \"\",\n        @JvmField @ProtoNumber(3) val longMsgResid: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @JvmField @ProtoNumber(1) val wording: String = \"\",\n        @JvmField @ProtoNumber(2) val digestUin: Long = 0L,\n        @JvmField @ProtoNumber(3) val digestTime: Int = 0,\n        @JvmField @ProtoNumber(4) val msg: Oidb0xeac.DigestMsg? = null,\n        @JvmField @ProtoNumber(10) val errorCode: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ShareMsg(\n        @JvmField @ProtoNumber(1) val type: String = \"\",\n        @JvmField @ProtoNumber(2) val title: String = \"\",\n        @JvmField @ProtoNumber(3) val summary: String = \"\",\n        @JvmField @ProtoNumber(4) val brief: String = \"\",\n        @JvmField @ProtoNumber(5) val url: String = \"\",\n        @JvmField @ProtoNumber(6) val pictureUrl: String = \"\",\n        @JvmField @ProtoNumber(7) val action: String = \"\",\n        @JvmField @ProtoNumber(8) val source: String = \"\",\n        @JvmField @ProtoNumber(9) val sourceUrl: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class TextMsg(\n        @JvmField @ProtoNumber(1) val str: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/OidbCmd0xb77.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"SpellCheckingInspection\")\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class OidbCmd0xb77 : ProtoBuf {\n    @Serializable\n    internal class ArkJsonBody(\n        @JvmField @ProtoNumber(10) val jsonStr: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ArkMsgBody(\n        @JvmField @ProtoNumber(1) val app: String = \"\",\n        @JvmField @ProtoNumber(2) val view: String = \"\",\n        @JvmField @ProtoNumber(3) val prompt: String = \"\",\n        @JvmField @ProtoNumber(4) val ver: String = \"\",\n        @JvmField @ProtoNumber(5) val desc: String = \"\",\n        @JvmField @ProtoNumber(6) val featureId: Int = 0,\n        @JvmField @ProtoNumber(10) val meta: String = \"\",\n        @JvmField @ProtoNumber(11) val metaUrl1: String = \"\",\n        @JvmField @ProtoNumber(12) val metaUrl2: String = \"\",\n        @JvmField @ProtoNumber(13) val metaUrl3: String = \"\",\n        @JvmField @ProtoNumber(14) val metaText1: String = \"\",\n        @JvmField @ProtoNumber(15) val metaText2: String = \"\",\n        @JvmField @ProtoNumber(16) val metaText3: String = \"\",\n        @JvmField @ProtoNumber(20) val config: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ArkV1MsgBody(\n        @JvmField @ProtoNumber(1) val app: String = \"\",\n        @JvmField @ProtoNumber(2) val view: String = \"\",\n        @JvmField @ProtoNumber(3) val prompt: String = \"\",\n        @JvmField @ProtoNumber(4) val ver: String = \"\",\n        @JvmField @ProtoNumber(5) val desc: String = \"\",\n        @JvmField @ProtoNumber(6) val featureId: Int = 0,\n        @JvmField @ProtoNumber(10) val meta: String = \"\",\n        @JvmField @ProtoNumber(11) val items: List<TemplateItem> = emptyList(),\n        @JvmField @ProtoNumber(20) val config: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ClientInfo(\n        @JvmField @ProtoNumber(1) val platform: Int = 0,\n        @JvmField @ProtoNumber(2) val sdkVersion: String = \"\",\n        @JvmField @ProtoNumber(3) val androidPackageName: String = \"\",\n        @JvmField @ProtoNumber(4) val androidSignature: String = \"\",\n        @JvmField @ProtoNumber(5) val iosBundleId: String = \"\",\n        @JvmField @ProtoNumber(6) val pcSign: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ImageInfo(\n        @JvmField @ProtoNumber(1) val md5: String = \"\",\n        @JvmField @ProtoNumber(2) val uuid: String = \"\",\n        @JvmField @ProtoNumber(3) val imgType: Int = 0,\n        @JvmField @ProtoNumber(4) val fileSize: Int = 0,\n        @JvmField @ProtoNumber(5) val width: Int = 0,\n        @JvmField @ProtoNumber(6) val height: Int = 0,\n        @JvmField @ProtoNumber(7) val original: Int = 0,\n        @JvmField @ProtoNumber(101) val fileId: Int = 0,\n        @JvmField @ProtoNumber(102) val serverIp: Int = 0,\n        @JvmField @ProtoNumber(103) val serverPort: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MiniAppMsgBody(\n        @JvmField @ProtoNumber(1) val miniAppAppid: Long = 0L,\n        @JvmField @ProtoNumber(2) val miniAppPath: String = \"\",\n        @JvmField @ProtoNumber(3) val webPageUrl: String = \"\",\n        @JvmField @ProtoNumber(4) val miniAppType: Int = 0,\n        @JvmField @ProtoNumber(5) val title: String = \"\",\n        @JvmField @ProtoNumber(6) val desc: String = \"\",\n        @JvmField @ProtoNumber(10) val jsonStr: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @JvmField @ProtoNumber(1) val appid: Long = 0L,\n        @JvmField @ProtoNumber(2) val appType: Int = 0,\n        @JvmField @ProtoNumber(3) val msgStyle: Int = 0,\n        @JvmField @ProtoNumber(4) val senderUin: Long = 0L,\n        @JvmField @ProtoNumber(5) val clientInfo: ClientInfo? = null,\n        // @JvmField @ProtoNumber(6) val textMsg: String? = null,\n        @JvmField @ProtoNumber(7) val extInfo: ExtInfo? = null,\n        @JvmField @ProtoNumber(10) val sendType: Int = 0,\n        @JvmField @ProtoNumber(11) val recvUin: Long = 0L,\n        @JvmField @ProtoNumber(12) val richMsgBody: RichMsgBody? = null,\n        @JvmField @ProtoNumber(13) val arkMsgBody: ArkMsgBody? = null,\n        // @JvmField @ProtoNumber(14) val recvOpenid: String? = null, // don't be \"\"\n        @JvmField @ProtoNumber(15) val arkv1MsgBody: ArkV1MsgBody? = null,\n        @JvmField @ProtoNumber(16) val arkJsonBody: ArkJsonBody? = null,\n        @JvmField @ProtoNumber(17) val xmlMsgBody: XmlMsgBody? = null,\n        @JvmField @ProtoNumber(18) val miniAppMsgBody: MiniAppMsgBody? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ExtInfo(\n        @ProtoNumber(1) @JvmField val customFeatureId: List<Int> = emptyList(),\n        @ProtoNumber(2) @JvmField val apnsWording: String = \"\",\n        @ProtoNumber(3) @JvmField val groupSaveDbFlag: Int = 0,\n        @ProtoNumber(4) @JvmField val receiverAppId: Int = 0,\n        @ProtoNumber(5) @JvmField val msgSeq: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RichMsgBody(\n        @JvmField @ProtoNumber(1) val usingArk: Boolean = false,\n        @JvmField @ProtoNumber(10) val title: String = \"\",\n        @JvmField @ProtoNumber(11) val summary: String = \"\",\n        @JvmField @ProtoNumber(12) val brief: String = \"\",\n        @JvmField @ProtoNumber(13) val url: String = \"\",\n        @JvmField @ProtoNumber(14) val pictureUrl: String = \"\",\n        @JvmField @ProtoNumber(15) val action: String = \"\",\n        @JvmField @ProtoNumber(16) val musicUrl: String = \"\",\n        @JvmField @ProtoNumber(21) val imageInfo: ImageInfo? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @JvmField @ProtoNumber(1) val wording: String = \"\",\n        @JvmField @ProtoNumber(2) val jumpResult: Int = 0,\n        @JvmField @ProtoNumber(3) val jumpUrl: String = \"\",\n        @JvmField @ProtoNumber(4) val level: Int = 0,\n        @JvmField @ProtoNumber(5) val subLevel: Int = 0,\n        @JvmField @ProtoNumber(6) val developMsg: String = \"\",\n    ) : ProtoBuf, Packet\n\n    @Serializable\n    internal class TemplateItem(\n        @JvmField @ProtoNumber(1) val key: String = \"\",\n        @JvmField @ProtoNumber(2) val type: Int = 0,\n        @JvmField @ProtoNumber(3) val value: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class XmlMsgBody(\n        @JvmField @ProtoNumber(11) val serviceId: Int = 0,\n        @JvmField @ProtoNumber(12) val xml: String = \"\",\n    ) : ProtoBuf\n}\n        "
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/OnlinePush.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class MsgOnlinePush {\n    @Serializable\n    internal class PbPushMsg(\n        @ProtoNumber(1) @JvmField val msg: MsgComm.Msg,\n        @ProtoNumber(2) @JvmField val svrip: Int = 0,\n        @ProtoNumber(3) @JvmField val pushToken: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val pingFlag: Int = 0,\n        @ProtoNumber(9) @JvmField val generalFlag: Int = 0,\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class OnlinePushTrans : ProtoBuf {\n    @Serializable\n    internal class ExtGroupKeyInfo(\n        @ProtoNumber(1) @JvmField val curMaxSeq: Int = 0,\n        @ProtoNumber(2) @JvmField val curTime: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PbMsgInfo(\n        @ProtoNumber(1) @JvmField val fromUin: Long = 0L,\n        @ProtoNumber(2) @JvmField val toUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val msgType: Int = 0,\n        @ProtoNumber(4) @JvmField val msgSubtype: Int = 0,\n        @ProtoNumber(5) @JvmField val msgSeq: Int = 0,\n        @ProtoNumber(6) @JvmField val msgUid: Long = 0L,\n        @ProtoNumber(7) @JvmField val msgTime: Int = 0,\n        @ProtoNumber(8) @JvmField val realMsgTime: Int = 0,\n        @ProtoNumber(9) @JvmField val nickName: String = \"\",\n        @ProtoNumber(10) @JvmField val msgData: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(11) @JvmField val svrIp: Int = 0,\n        @ProtoNumber(12) @JvmField val extGroupKeyInfo: ExtGroupKeyInfo? = null,\n        @ProtoNumber(17) @JvmField val generalFlag: Int = 0,\n    ) : ProtoBuf\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/PbReserve.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\ninternal class NotOnlineImage {\n    @Serializable\n    internal class ResvAttr(\n        @JvmField @ProtoNumber(1) val imageBizType: Int = 0,\n        @JvmField @ProtoNumber(2) val customfaceType: Int = 0,\n        @JvmField @ProtoNumber(3) val emojiPackageid: Int = 0,\n        @JvmField @ProtoNumber(4) val emojiId: Int = 0,\n        @JvmField @ProtoNumber(5) val text: String = \"\",\n        @JvmField @ProtoNumber(6) val doutuSuppliers: String = \"\",\n        @JvmField @ProtoNumber(8) val textSummary: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(10) val emojiFrom: Int = 0,\n        @JvmField @ProtoNumber(11) val emojiSource: String = \"\",\n        @JvmField @ProtoNumber(12) val emojiWebUrl: String = \"\",\n        @JvmField @ProtoNumber(13) val emojiIconUrl: String = \"\",\n        @JvmField @ProtoNumber(14) val emojiMarketFaceName: String = \"\",\n        @JvmField @ProtoNumber(15) val source: Int = 0,\n        @JvmField @ProtoNumber(16) val cameraCaptureTemplateinfo: String = \"\",\n        @JvmField @ProtoNumber(17) val cameraCaptureMaterialname: String = \"\",\n        @JvmField @ProtoNumber(18) val adEmoJumpUrl: String = \"\",\n        @JvmField @ProtoNumber(19) val adEmoDescStr: String = \"\",\n    ) : ProtoBuf\n}\n\ninternal class CustomFace {\n    @Serializable\n    internal class AnimationImageShow(\n        @JvmField @ProtoNumber(1) val int32EffectId: Int = 0,\n        @JvmField @ProtoNumber(2) val animationParam: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ResvAttr(\n        @JvmField @ProtoNumber(1) val imageBizType: Int = 0,\n        @JvmField @ProtoNumber(2) val customfaceType: Int = 0,\n        @JvmField @ProtoNumber(3) val emojiPackageid: Int = 0,\n        @JvmField @ProtoNumber(4) val emojiId: Int = 0,\n        @JvmField @ProtoNumber(5) val text: String = \"\",\n        @JvmField @ProtoNumber(6) val doutuSuppliers: String = \"\",\n        @JvmField @ProtoNumber(7) val msgImageShow: AnimationImageShow? = null,\n        @JvmField @ProtoNumber(9) val textSummary: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(10) val emojiFrom: Int = 0,\n        @JvmField @ProtoNumber(11) val emojiSource: String = \"\",\n        @JvmField @ProtoNumber(12) val emojiWebUrl: String = \"\",\n        @JvmField @ProtoNumber(13) val emojiIconUrl: String = \"\",\n        @JvmField @ProtoNumber(14) val emojiMarketFaceName: String = \"\",\n        @JvmField @ProtoNumber(15) val source: Int = 0,\n        @JvmField @ProtoNumber(16) val cameraCaptureTemplateinfo: String = \"\",\n        @JvmField @ProtoNumber(17) val cameraCaptureMaterialname: String = \"\",\n        @JvmField @ProtoNumber(18) val adEmoJumpUrl: String = \"\",\n        @JvmField @ProtoNumber(19) val adEmoDescStr: String = \"\",\n    ) : ProtoBuf\n}\n\ninternal class Generalflags : ProtoBuf {\n    @Serializable\n    internal class ResvAttr(\n        @ProtoNumber(1) @JvmField val globalGroupLevel: Int = 0,\n        @ProtoNumber(2) @JvmField val nearbyCharmLevel: Int = 0,\n        @ProtoNumber(3) @JvmField val redbagMsgSenderUin: Long = 0L,\n        @ProtoNumber(4) @JvmField val titleId: Int = 0,\n        @ProtoNumber(5) @JvmField val robotMsgFlag: Int = 0,\n        @ProtoNumber(6) @JvmField val wantGiftSenderUin: Long = 0L,\n        @ProtoNumber(7) @JvmField val stickerX: Float = 0.0f,\n        @ProtoNumber(8) @JvmField val stickerY: Float = 0.0f,\n        @ProtoNumber(9) @JvmField val stickerWidth: Float = 0.0f,\n        @ProtoNumber(10) @JvmField val stickerHeight: Float = 0.0f,\n        @ProtoNumber(11) @JvmField val stickerRotate: Int = 0,\n        @ProtoNumber(12) @JvmField val stickerHostMsgseq: Long = 0L,\n        @ProtoNumber(13) @JvmField val stickerHostMsguid: Long = 0L,\n        @ProtoNumber(14) @JvmField val stickerHostTime: Long = 0L,\n        @ProtoNumber(15) @JvmField val mobileCustomFont: Int = 0,\n        @ProtoNumber(16) @JvmField val tailKey: Int = 0,\n        @ProtoNumber(17) @JvmField val showTailFlag: Int = 0,\n        @ProtoNumber(18) @JvmField val doutuMsgType: Int = 0,\n        @ProtoNumber(19) @JvmField val doutuCombo: Int = 0,\n        @ProtoNumber(20) @JvmField val customFeatureid: Int = 0,\n        @ProtoNumber(21) @JvmField val goldenMsgType: Int = 0,\n        @ProtoNumber(22) @JvmField val goldenMsgInfo: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(23) @JvmField val botMessageClassId: Int = 0,\n        @ProtoNumber(24) @JvmField val subscriptionUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(25) @JvmField val pendantDiyId: Int = 0,\n        @ProtoNumber(26) @JvmField val timedMessage: Int = 0,\n        @ProtoNumber(27) @JvmField val holidayFlag: Int = 0,\n        @ProtoNumber(29) @JvmField val kplInfo: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(30) @JvmField val faceId: Int = 0,\n        @ProtoNumber(31) @JvmField val diyFontTimestamp: Int = 0,\n        @ProtoNumber(32) @JvmField val redEnvelopeType: Int = 0,\n        @ProtoNumber(33) @JvmField val shortVideoId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(34) @JvmField val reqFontEffectId: Int = 0,\n        @ProtoNumber(35) @JvmField val loveLanguageFlag: Int = 0,\n        @ProtoNumber(36) @JvmField val aioSyncToStoryFlag: Int = 0,\n        @ProtoNumber(37) @JvmField val uploadImageToQzoneFlag: Int = 0,\n        @ProtoNumber(39) @JvmField val uploadImageToQzoneParam: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(40) @JvmField val groupConfessSig: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(41) @JvmField val subfontId: Long = 0L,\n        @ProtoNumber(42) @JvmField val msgFlagType: Int = 0,\n        @ProtoNumber(43) @JvmField val uint32CustomFeatureid: List<Int> = emptyList(),\n        @ProtoNumber(44) @JvmField val richCardNameVer: Int = 0,\n        @ProtoNumber(47) @JvmField val msgInfoFlag: Int = 0,\n        @ProtoNumber(48) @JvmField val serviceMsgType: Int = 0,\n        @ProtoNumber(49) @JvmField val serviceMsgRemindType: Int = 0,\n        @ProtoNumber(50) @JvmField val serviceMsgName: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(51) @JvmField val vipType: Int = 0,\n        @ProtoNumber(52) @JvmField val vipLevel: Int = 0,\n        @ProtoNumber(53) @JvmField val pbPttWaveform: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(54) @JvmField val userBigclubLevel: Int = 0,\n        @ProtoNumber(55) @JvmField val userBigclubFlag: Int = 0,\n        @ProtoNumber(56) @JvmField val nameplate: Int = 0,\n        @ProtoNumber(57) @JvmField val autoReply: Int = 0,\n        @ProtoNumber(58) @JvmField val reqIsBigclubHidden: Int = 0,\n        @ProtoNumber(59) @JvmField val showInMsgList: Int = 0,\n        @ProtoNumber(60) @JvmField val oacMsgExtend: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(61) @JvmField val groupMemberFlagEx2: Int = 0,\n        @ProtoNumber(62) @JvmField val groupRingtoneId: Int = 0,\n        @ProtoNumber(63) @JvmField val robotGeneralTrans: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(64) @JvmField val troopPobingTemplate: Int = 0,\n        @ProtoNumber(65) @JvmField val hudongMark: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(66) @JvmField val groupInfoFlagEx3: Int = 0,\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class ResvAttrForGiftMsg : ProtoBuf {\n    @Serializable\n    internal class ActivityGiftInfo(\n        @ProtoNumber(1) @JvmField val isActivityGift: Int = 0,\n        @ProtoNumber(2) @JvmField val textColor: String = \"\",\n        @ProtoNumber(3) @JvmField val text: String = \"\",\n        @ProtoNumber(4) @JvmField val url: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class InteractGift(\n        @ProtoNumber(1) @JvmField val interactId: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ResvAttr(\n        @ProtoNumber(1) @JvmField val int32SendScore: Int = 0,\n        @ProtoNumber(2) @JvmField val int32RecvScore: Int = 0,\n        @ProtoNumber(3) @JvmField val charmHeroism: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val buttonFlag: Int = 0,\n        @ProtoNumber(5) @JvmField val objColor: Int = 0,\n        @ProtoNumber(6) @JvmField val animationType: Int = 0,\n        @ProtoNumber(7) @JvmField val msgInteractGift: InteractGift? = null,\n        @ProtoNumber(8) @JvmField val activityGiftInfo: ActivityGiftInfo? = null,\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class SourceMsg : ProtoBuf {\n    @Serializable\n    internal class ResvAttr(\n        @ProtoNumber(1) @JvmField val richMsg2: ByteArray? = null,\n        @ProtoNumber(2) @JvmField val oriMsgtype: Int? = null,\n        @ProtoNumber(3) @JvmField val origUids: List<Long>? = null,\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class VideoFile : ProtoBuf {\n    @Serializable\n    internal class ResvAttr(\n        @ProtoNumber(1) @JvmField val hotvideoIcon: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val hotvideoTitle: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val hotvideoUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val hotvideoIconSub: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val specialVideoType: Int = 0,\n        @ProtoNumber(6) @JvmField val dynamicText: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(7) @JvmField val msgTailType: Int = 0,\n        @ProtoNumber(8) @JvmField val redEnvelopeType: Int = 0,\n        @ProtoNumber(9) @JvmField val shortVideoId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(10) @JvmField val animojiModelId: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(11) @JvmField val longVideoKandianType: Int = 0,\n        @ProtoNumber(12) @JvmField val source: Int = 0,\n    ) : ProtoBuf\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/PttShortVideo.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\n\n@Serializable\ninternal class PttShortVideo : ProtoBuf {\n    @Serializable\n    internal class ServerListInfo(\n        @JvmField @ProtoNumber(1) val upIp: Int = 0,\n        @JvmField @ProtoNumber(2) val upPort: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class CodecConfigReq(\n        @JvmField @ProtoNumber(1) val platformChipinfo: String = \"\",\n        @JvmField @ProtoNumber(2) val osVersion: String = \"\",\n        @JvmField @ProtoNumber(3) val deviceName: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class DataHole(\n        @JvmField @ProtoNumber(1) val begin: Long = 0L,\n        @JvmField @ProtoNumber(2) val end: Long = 0L\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ExtensionReq(\n        @JvmField @ProtoNumber(1) val subBusiType: Int = 0,\n        @JvmField @ProtoNumber(2) val userCnt: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PttShortVideoAddr(\n        @JvmField @ProtoNumber(1) val hostType: Int = 0,\n        @JvmField @ProtoNumber(10) val strHost: List<String> = emptyList(),\n        @JvmField @ProtoNumber(11) val urlArgs: String = \"\",\n        @JvmField @ProtoNumber(21) val strHostIpv6: List<String> = emptyList(),\n        @JvmField @ProtoNumber(22) val strDomain: List<String> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PttShortVideoDeleteReq(\n        @JvmField @ProtoNumber(1) val fromuin: Long = 0L,\n        @JvmField @ProtoNumber(2) val touin: Long = 0L,\n        @JvmField @ProtoNumber(3) val chatType: Int = 0,\n        @JvmField @ProtoNumber(4) val clientType: Int = 0,\n        @JvmField @ProtoNumber(5) val fileid: String = \"\",\n        @JvmField @ProtoNumber(6) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(7) val agentType: Int = 0,\n        @JvmField @ProtoNumber(8) val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(9) val businessType: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PttShortVideoDeleteResp(\n        @JvmField @ProtoNumber(1) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(2) val retMsg: String = \"\"\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PttShortVideoDownloadReq(\n        @JvmField @ProtoNumber(1) val fromuin: Long = 0L,\n        @JvmField @ProtoNumber(2) val touin: Long = 0L,\n        @JvmField @ProtoNumber(3) val chatType: Int = 0,\n        @JvmField @ProtoNumber(4) val clientType: Int = 0,\n        @JvmField @ProtoNumber(5) val fileid: String = \"\",\n        @JvmField @ProtoNumber(6) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(7) val agentType: Int = 0,\n        @JvmField @ProtoNumber(8) val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(9) val businessType: Int = 0,\n        @JvmField @ProtoNumber(10) val fileType: Int = 0,\n        @JvmField @ProtoNumber(11) val downType: Int = 0,\n        @JvmField @ProtoNumber(12) val sceneType: Int = 0,\n        @JvmField @ProtoNumber(13) val needInnerAddr: Int = 0,\n        @JvmField @ProtoNumber(14) val reqTransferType: Int = 0,\n        @JvmField @ProtoNumber(15) val reqHostType: Int = 0,\n        @JvmField @ProtoNumber(20) val flagSupportLargeSize: Int = 0,\n        @JvmField @ProtoNumber(30) val flagClientQuicProtoEnable: Int = 0,\n        @JvmField @ProtoNumber(31) val targetCodecFormat: Int = 0,\n        @JvmField @ProtoNumber(32) val msgCodecConfig: CodecConfigReq? = null,\n        @JvmField @ProtoNumber(33) val sourceCodecFormat: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PttShortVideoDownloadResp(\n        @JvmField @ProtoNumber(1) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(2) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val sameAreaOutAddr: List<PttShortVideoIpList> = emptyList(),\n        @JvmField @ProtoNumber(4) val diffAreaOutAddr: List<PttShortVideoIpList> = emptyList(),\n        @JvmField @ProtoNumber(5) val downloadkey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(6) val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(7) val sameAreaInnerAddr: List<PttShortVideoIpList> = emptyList(),\n        @JvmField @ProtoNumber(8) val diffAreaInnerAddr: List<PttShortVideoIpList> = emptyList(),\n        @JvmField @ProtoNumber(9) val msgDownloadAddr: PttShortVideoAddr? = null,\n        @JvmField @ProtoNumber(10) val encryptKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(30) val flagServerQuicProtoEnable: Int = 0,\n        @JvmField @ProtoNumber(31) val serverQuicPara: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(32) val codecFormat: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PttShortVideoFileInfo(\n        @JvmField @ProtoNumber(1) val fileName: String = \"\",\n        @JvmField @ProtoNumber(2) val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(3) val thumbFileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(4) val fileSize: Long = 0L,\n        @JvmField @ProtoNumber(5) val fileResLength: Int = 0,\n        @JvmField @ProtoNumber(6) val fileResWidth: Int = 0,\n        @JvmField @ProtoNumber(7) val fileFormat: Int = 0,\n        @JvmField @ProtoNumber(8) val fileTime: Int = 0,\n        @JvmField @ProtoNumber(9) val thumbFileSize: Long = 0L,\n        @JvmField @ProtoNumber(10) val decryptVideoMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(11) val decryptFileSize: Long = 0L,\n        @JvmField @ProtoNumber(12) val decryptThumbMd5: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(13) val decryptThumbSize: Long = 0L,\n        @JvmField @ProtoNumber(14) val extend: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PttShortVideoFileInfoExtend(\n        @JvmField @ProtoNumber(1) val bitRate: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PttShortVideoIpList(\n        @JvmField @ProtoNumber(1) val ip: Int = 0,\n        @JvmField @ProtoNumber(2) val port: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PttShortVideoRetweetReq(\n        @JvmField @ProtoNumber(1) val fromUin: Long = 0L,\n        @JvmField @ProtoNumber(2) val toUin: Long = 0L,\n        @JvmField @ProtoNumber(3) val fromChatType: Int = 0,\n        @JvmField @ProtoNumber(4) val toChatType: Int = 0,\n        @JvmField @ProtoNumber(5) val fromBusiType: Int = 0,\n        @JvmField @ProtoNumber(6) val toBusiType: Int = 0,\n        @JvmField @ProtoNumber(7) val clientType: Int = 0,\n        @JvmField @ProtoNumber(8) val msgPttShortVideoFileInfo: PttShortVideoFileInfo? = null,\n        @JvmField @ProtoNumber(9) val agentType: Int = 0,\n        @JvmField @ProtoNumber(10) val fileid: String = \"\",\n        @JvmField @ProtoNumber(11) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(20) val flagSupportLargeSize: Int = 0,\n        @JvmField @ProtoNumber(21) val codecFormat: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PttShortVideoRetweetResp(\n        @JvmField @ProtoNumber(1) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(2) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val sameAreaOutAddr: List<PttShortVideoIpList> = emptyList(),\n        @JvmField @ProtoNumber(4) val diffAreaOutAddr: List<PttShortVideoIpList> = emptyList(),\n        @JvmField @ProtoNumber(5) val fileid: String = \"\",\n        @JvmField @ProtoNumber(6) val ukey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(7) val fileExist: Int = 0,\n        @JvmField @ProtoNumber(8) val sameAreaInnerAddr: List<PttShortVideoIpList> = emptyList(),\n        @JvmField @ProtoNumber(9) val diffAreaInnerAddr: List<PttShortVideoIpList> = emptyList(),\n        @JvmField @ProtoNumber(10) val dataHole: List<DataHole> = emptyList(),\n        @JvmField @ProtoNumber(11) val isHotFile: Int = 0,\n        @JvmField @ProtoNumber(12) val longVideoCarryWatchPointType: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PttShortVideoUploadReq(\n        @JvmField @ProtoNumber(1) val fromuin: Long = 0L,\n        @JvmField @ProtoNumber(2) val touin: Long = 0L,\n        @JvmField @ProtoNumber(3) val chatType: Int = 0,\n        @JvmField @ProtoNumber(4) val clientType: Int = 0,\n        @JvmField @ProtoNumber(5) val msgPttShortVideoFileInfo: PttShortVideoFileInfo? = null,\n        @JvmField @ProtoNumber(6) val groupCode: Long = 0L,\n        @JvmField @ProtoNumber(7) val agentType: Int = 0,\n        @JvmField @ProtoNumber(8) val businessType: Int = 0,\n        @JvmField @ProtoNumber(9) val encryptKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(10) val subBusinessType: Int = 0,\n        @JvmField @ProtoNumber(20) val flagSupportLargeSize: Int = 0,\n        @JvmField @ProtoNumber(21) val codecFormat: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PttShortVideoUploadResp(\n        @JvmField @ProtoNumber(1) val int32RetCode: Int = 0,\n        @JvmField @ProtoNumber(2) val retMsg: String = \"\",\n        @JvmField @ProtoNumber(3) val sameAreaOutAddr: List<PttShortVideoIpList> = emptyList(),\n        @JvmField @ProtoNumber(4) val diffAreaOutAddr: List<PttShortVideoIpList> = emptyList(),\n        @JvmField @ProtoNumber(5) val fileid: String = \"\",\n        @JvmField @ProtoNumber(6) val ukey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(7) val fileExist: Int = 0,\n        @JvmField @ProtoNumber(8) val sameAreaInnerAddr: List<PttShortVideoIpList> = emptyList(),\n        @JvmField @ProtoNumber(9) val diffAreaInnerAddr: List<PttShortVideoIpList> = emptyList(),\n        @JvmField @ProtoNumber(10) val dataHole: List<DataHole> = emptyList(),\n        @JvmField @ProtoNumber(11) val encryptKey: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(12) val isHotFile: Int = 0,\n        @JvmField @ProtoNumber(13) val longVideoCarryWatchPointType: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class QuicParameter(\n        @JvmField @ProtoNumber(1) val enableQuic: Int = 0,\n        @JvmField @ProtoNumber(2) val encryptionVer: Int = 1,\n        @JvmField @ProtoNumber(3) val fecVer: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @JvmField @ProtoNumber(1) val cmd: Int = 0,\n        @JvmField @ProtoNumber(2) val seq: Int = 0,\n        @JvmField @ProtoNumber(3) val msgPttShortVideoUploadReq: PttShortVideoUploadReq? = null,\n        @JvmField @ProtoNumber(4) val msgPttShortVideoDownloadReq: PttShortVideoDownloadReq? = null,\n        @JvmField @ProtoNumber(5) val msgShortVideoRetweetReq: List<PttShortVideoRetweetReq> = emptyList(),\n        @JvmField @ProtoNumber(6) val msgShortVideoDeleteReq: List<PttShortVideoDeleteReq> = emptyList(),\n        @JvmField @ProtoNumber(100) val msgExtensionReq: List<ExtensionReq> = emptyList()\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @JvmField @ProtoNumber(1) val cmd: Int = 0,\n        @JvmField @ProtoNumber(2) val seq: Int = 0,\n        @JvmField @ProtoNumber(3) val msgPttShortVideoUploadResp: PttShortVideoUploadResp? = null,\n        @JvmField @ProtoNumber(4) val msgPttShortVideoDownloadResp: PttShortVideoDownloadResp? = null,\n        @JvmField @ProtoNumber(5) val msgShortVideoRetweetResp: List<PttShortVideoRetweetResp> = emptyList(),\n        @JvmField @ProtoNumber(6) val msgShortVideoDeleteResp: List<PttShortVideoDeleteResp> = emptyList(),\n        @JvmField @ProtoNumber(100) val changeChannel: Int = 0,\n        @JvmField @ProtoNumber(101) val allowRetry: Int = 0\n    ) : ProtoBuf\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/SSOReserveField.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\n\ninternal class SSOReserveField {\n    @Serializable\n    internal class ReserveFields(\n        @ProtoNumber(8) @JvmField val clientIpcookie: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(9) @JvmField val flag: Int = 0,\n        @ProtoNumber(10) @JvmField val envId: Int = 0,\n        @ProtoNumber(11) @JvmField val localeId: Int = 2052,\n        @ProtoNumber(12) @JvmField val qimei: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(13) @JvmField val env: String = \"\",\n        @ProtoNumber(14) @JvmField val newconnFlag: Int = 0,\n        @ProtoNumber(15) @JvmField val traceParent: String = \"\",\n        @ProtoNumber(16) @JvmField val uid: String = \"\",\n        @ProtoNumber(18) @JvmField val imsi: Int = 0,\n        @ProtoNumber(19) @JvmField val networkType: Int = 0,\n        @ProtoNumber(20) @JvmField val ipStackType: Int = 0,\n        @ProtoNumber(21) @JvmField val messageType: Int = 0,\n        @ProtoNumber(22) @JvmField val trpcRsp: SsoTrpcResponse? = null,\n        @ProtoNumber(23) @JvmField val transInfo: List<SsoMapEntry> = emptyList(),\n        @ProtoNumber(24) @JvmField val secInfo: SsoSecureInfo? = null,\n        @ProtoNumber(25) @JvmField val secSigFlag: Int = 0,\n        @ProtoNumber(26) @JvmField val ntCoreVersion: Int = 0,\n        @ProtoNumber(27) @JvmField val ssoRouteCost: Int = 0,\n        @ProtoNumber(28) @JvmField val ssoIpOrigin: Int = 0,\n        @ProtoNumber(30) @JvmField val presureToken: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SsoMapEntry(\n        @ProtoNumber(1) @JvmField val key: String = \"\",\n        @ProtoNumber(2) @JvmField val value: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SsoSecureInfo(\n        @ProtoNumber(1) @JvmField val secSig: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val secDeviceToken: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val secExtra: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SsoTrpcResponse(\n        @ProtoNumber(1) @JvmField val ret: Int = 0,\n        @ProtoNumber(2) @JvmField val funcRet: Int = 0,\n        @ProtoNumber(3) @JvmField val errorMsg: ByteArray = EMPTY_BYTE_ARRAY\n    ) : ProtoBuf\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/StatSvcGetOnline.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport kotlin.jvm.JvmField\n\ninternal class StatSvcGetOnline {\n    @Serializable\n    internal class Instance(\n        @ProtoNumber(1) @JvmField val instanceId: Int = 0,\n        @ProtoNumber(2) @JvmField val clientType: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqBody(\n        @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        @ProtoNumber(2) @JvmField val appid: Int = 0\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspBody(\n        @ProtoNumber(1) @JvmField val errorCode: Int = 0,\n        @ProtoNumber(2) @JvmField val errorMsg: String = \"\",\n        @ProtoNumber(3) @JvmField val uin: Long = 0L,\n        @ProtoNumber(4) @JvmField val appid: Int = 0,\n        @ProtoNumber(5) @JvmField val timeInterval: Int = 0,\n        @ProtoNumber(6) @JvmField val msgInstances: List<StatSvcGetOnline.Instance> = emptyList()\n    ) : ProtoBuf\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/StatSvcSimpleGet.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport kotlin.jvm.JvmField\n\n\ninternal class StatSvcSimpleGet {\n    @Serializable\n    internal class RspBody(\n        @JvmField @ProtoNumber(1) val errorCode: Int = 0,\n        @JvmField @ProtoNumber(2) val errmsg: String = \"\",\n        @JvmField @ProtoNumber(3) val helloInterval: Int = 0,\n        @JvmField @ProtoNumber(4) val clientip: String = \"\",\n        @JvmField @ProtoNumber(5) val clientBatteyGetInterval: Int = 0\n    ) : ProtoBuf\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/StructMsg.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\ninternal class QPayReminderMsg : ProtoBuf {\n    @Serializable\n    internal class GetInfoReq(\n        @ProtoNumber(1) @JvmField val scene: String = \"\",\n        @ProtoNumber(2) @JvmField val subCmd: String = \"\",\n        @ProtoNumber(3) @JvmField val infoDate: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GetInfoRsp(\n        @ProtoNumber(1) @JvmField val resultCode: Int = 0,\n        @ProtoNumber(2) @JvmField val resultInfo: String = \"\",\n        @ProtoNumber(3) @JvmField val urgency: Int = 0,\n        @ProtoNumber(4) @JvmField val templateNo: Int = 0,\n        @ProtoNumber(5) @JvmField val content: String = \"\",\n        @ProtoNumber(6) @JvmField val infoDate: String = \"\",\n    ) : ProtoBuf\n}\n\ninternal class Structmsg : ProtoBuf {\n    @Serializable\n    internal class AddFrdSNInfo(\n        @ProtoNumber(1) @JvmField val notSeeDynamic: Int = 0,\n        @ProtoNumber(2) @JvmField val setSn: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FlagInfo(\n        @ProtoNumber(1) @JvmField val grpMsgKickAdmin: Int = 0,\n        @ProtoNumber(2) @JvmField val grpMsgHiddenGrp: Int = 0,\n        @ProtoNumber(3) @JvmField val grpMsgWordingDown: Int = 0,\n        @ProtoNumber(4) @JvmField val frdMsgGetBusiCard: Int = 0,\n        @ProtoNumber(5) @JvmField val grpMsgGetOfficialAccount: Int = 0,\n        @ProtoNumber(6) @JvmField val grpMsgGetPayInGroup: Int = 0,\n        @ProtoNumber(7) @JvmField val frdMsgDiscuss2ManyChat: Int = 0,\n        @ProtoNumber(8) @JvmField val grpMsgNotAllowJoinGrpInviteNotFrd: Int = 0,\n        @ProtoNumber(9) @JvmField val frdMsgNeedWaitingMsg: Int = 0,\n        @ProtoNumber(10) @JvmField val frdMsgUint32NeedAllUnreadMsg: Int = 0,\n        @ProtoNumber(11) @JvmField val grpMsgNeedAutoAdminWording: Int = 0,\n        @ProtoNumber(12) @JvmField val grpMsgGetTransferGroupMsgFlag: Int = 0,\n        @ProtoNumber(13) @JvmField val grpMsgGetQuitPayGroupMsgFlag: Int = 0,\n        @ProtoNumber(14) @JvmField val grpMsgSupportInviteAutoJoin: Int = 0,\n        @ProtoNumber(15) @JvmField val grpMsgMaskInviteAutoJoin: Int = 0,\n        @ProtoNumber(16) @JvmField val grpMsgGetDisbandedByAdmin: Int = 0,\n        @ProtoNumber(17) @JvmField val grpMsgGetC2cInviteJoinGroup: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class FriendInfo(\n        @ProtoNumber(1) @JvmField val msgJointFriend: String = \"\",\n        @ProtoNumber(2) @JvmField val msgBlacklist: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GroupInfo(\n        @ProtoNumber(1) @JvmField val groupAuthType: Int = 0,\n        @ProtoNumber(2) @JvmField val displayAction: Int = 0,\n        @ProtoNumber(3) @JvmField val msgAlert: String = \"\",\n        @ProtoNumber(4) @JvmField val msgDetailAlert: String = \"\",\n        @ProtoNumber(5) @JvmField val msgOtherAdminDone: String = \"\",\n        @ProtoNumber(6) @JvmField val appPrivilegeFlag: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgInviteExt(\n        @ProtoNumber(1) @JvmField val srcType: Int = 0,\n        @ProtoNumber(2) @JvmField val srcCode: Long = 0L,\n        @ProtoNumber(3) @JvmField val waitState: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgPayGroupExt(\n        @ProtoNumber(1) @JvmField val joinGrpTime: Long = 0L,\n        @ProtoNumber(2) @JvmField val quitGrpTime: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqNextSystemMsg(\n        @ProtoNumber(1) @JvmField val msgNum: Int = 0,\n        @ProtoNumber(2) @JvmField val followingFriendSeq: Long = 0L,\n        @ProtoNumber(3) @JvmField val followingGroupSeq: Long = 0L,\n        @ProtoNumber(4) @JvmField val checktype: Int /* enum */ = 1,\n        @ProtoNumber(5) @JvmField val flag: FlagInfo? = null,\n        @ProtoNumber(6) @JvmField val language: Int = 0,\n        @ProtoNumber(7) @JvmField val version: Int = 0,\n        @ProtoNumber(8) @JvmField val friendMsgTypeFlag: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqSystemMsg(\n        @ProtoNumber(1) @JvmField val msgNum: Int = 0,\n        @ProtoNumber(2) @JvmField val latestFriendSeq: Long = 0L,\n        @ProtoNumber(3) @JvmField val latestGroupSeq: Long = 0L,\n        @ProtoNumber(4) @JvmField val version: Int = 0,\n        @ProtoNumber(5) @JvmField val language: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqSystemMsgAction(\n        @ProtoNumber(1) @JvmField val msgType: Int /* enum */ = 1,\n        @ProtoNumber(2) @JvmField val msgSeq: Long = 0L,\n        @ProtoNumber(3) @JvmField val reqUin: Long = 0L,\n        @ProtoNumber(4) @JvmField val subType: Int = 0,\n        @ProtoNumber(5) @JvmField val srcId: Int = 0,\n        @ProtoNumber(6) @JvmField val subSrcId: Int = 0,\n        @ProtoNumber(7) @JvmField val groupMsgType: Int = 0,\n        @ProtoNumber(8) @JvmField val actionInfo: SystemMsgActionInfo? = null,\n        @ProtoNumber(9) @JvmField val language: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqSystemMsgNew(\n        @ProtoNumber(1) @JvmField val msgNum: Int = 0,\n        @ProtoNumber(2) @JvmField val latestFriendSeq: Long = 0L,\n        @ProtoNumber(3) @JvmField val latestGroupSeq: Long = 0L,\n        @ProtoNumber(4) @JvmField val version: Int = 0,\n        @ProtoNumber(5) @JvmField val checktype: Int /* enum */ = 1,\n        @ProtoNumber(6) @JvmField val flag: FlagInfo? = null,\n        @ProtoNumber(7) @JvmField val language: Int = 0,\n        @ProtoNumber(8) @JvmField val isGetFrdRibbon: Boolean = true,\n        @ProtoNumber(9) @JvmField val isGetGrpRibbon: Boolean = true,\n        @ProtoNumber(10) @JvmField val friendMsgTypeFlag: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqSystemMsgRead(\n        @ProtoNumber(1) @JvmField val latestFriendSeq: Long = 0L,\n        @ProtoNumber(2) @JvmField val latestGroupSeq: Long = 0L,\n        @ProtoNumber(3) @JvmField val type: Int = 0,\n        @ProtoNumber(4) @JvmField val checktype: Int /* enum */ = 1,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspHead(\n        @ProtoNumber(1) @JvmField val result: Int = 0,\n        @ProtoNumber(2) @JvmField val msgFail: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspNextSystemMsg(\n        @ProtoNumber(1) @JvmField val head: RspHead? = null,\n        @ProtoNumber(2) @JvmField val msgs: List<StructMsg> = emptyList(),\n        @ProtoNumber(3) @JvmField val followingFriendSeq: Long = 0L,\n        @ProtoNumber(4) @JvmField val followingGroupSeq: Long = 0L,\n        @ProtoNumber(5) @JvmField val checktype: Int /* enum */ = 1,\n        @ProtoNumber(100) @JvmField val gameNick: String = \"\",\n        @ProtoNumber(101) @JvmField val undecidForQim: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(102) @JvmField val unReadCount3: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspSystemMsg(\n        @ProtoNumber(1) @JvmField val head: RspHead? = null,\n        @ProtoNumber(2) @JvmField val msgs: List<StructMsg> = emptyList(),\n        @ProtoNumber(3) @JvmField val unreadCount: Int = 0,\n        @ProtoNumber(4) @JvmField val latestFriendSeq: Long = 0L,\n        @ProtoNumber(5) @JvmField val latestGroupSeq: Long = 0L,\n        @ProtoNumber(6) @JvmField val followingFriendSeq: Long = 0L,\n        @ProtoNumber(7) @JvmField val followingGroupSeq: Long = 0L,\n        @ProtoNumber(8) @JvmField val msgDisplay: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspSystemMsgAction(\n        @ProtoNumber(1) @JvmField val head: RspHead? = null,\n        @ProtoNumber(2) @JvmField val msgDetail: String = \"\",\n        @ProtoNumber(3) @JvmField val type: Int = 0,\n        @ProtoNumber(5) @JvmField val msgInvalidDecided: String = \"\",\n        @ProtoNumber(6) @JvmField val remarkResult: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspSystemMsgNew(\n        @ProtoNumber(1) @JvmField val head: RspHead? = null,\n        @ProtoNumber(2) @JvmField val unreadFriendCount: Int = 0,\n        @ProtoNumber(3) @JvmField val unreadGroupCount: Int = 0,\n        @ProtoNumber(4) @JvmField val latestFriendSeq: Long = 0L,\n        @ProtoNumber(5) @JvmField val latestGroupSeq: Long = 0L,\n        @ProtoNumber(6) @JvmField val followingFriendSeq: Long = 0L,\n        @ProtoNumber(7) @JvmField val followingGroupSeq: Long = 0L,\n        @ProtoNumber(9) @JvmField val friendmsgs: List<StructMsg> = emptyList(),\n        @ProtoNumber(10) @JvmField val groupmsgs: List<StructMsg> = emptyList(),\n        @ProtoNumber(11) @JvmField val msgRibbonFriend: StructMsg? = null,\n        @ProtoNumber(12) @JvmField val msgRibbonGroup: StructMsg? = null,\n        @ProtoNumber(13) @JvmField val msgDisplay: String = \"\",\n        @ProtoNumber(14) @JvmField val grpMsgDisplay: String = \"\",\n        @ProtoNumber(15) @JvmField val over: Int = 0,\n        @ProtoNumber(20) @JvmField val checktype: Int /* enum */ = 1,\n        @ProtoNumber(100) @JvmField val gameNick: String = \"\",\n        @ProtoNumber(101) @JvmField val undecidForQim: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(102) @JvmField val unReadCount3: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RspSystemMsgRead(\n        @ProtoNumber(1) @JvmField val head: RspHead? = null,\n        @ProtoNumber(2) @JvmField val type: Int = 0,\n        @ProtoNumber(3) @JvmField val checktype: Int /* enum */ = 1,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class StructMsg(\n        @ProtoNumber(1) @JvmField val version: Int = 0,\n        @ProtoNumber(2) @JvmField val msgType: Int /* enum */ = 1,\n        @ProtoNumber(3) @JvmField val msgSeq: Long = 0L,\n        @ProtoNumber(4) @JvmField val msgTime: Long = 0L,\n        @ProtoNumber(5) @JvmField val reqUin: Long = 0L,\n        @ProtoNumber(6) @JvmField val unreadFlag: Int = 0,\n        @ProtoNumber(50) @JvmField val msg: SystemMsg? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SystemMsg(\n        @ProtoNumber(1) @JvmField val subType: Int = 0,\n        @ProtoNumber(2) @JvmField val msgTitle: String = \"\",\n        @ProtoNumber(3) @JvmField val msgDescribe: String = \"\",\n        @ProtoNumber(4) @JvmField val msgAdditional: String = \"\",\n        @ProtoNumber(5) @JvmField val msgSource: String = \"\",\n        @ProtoNumber(6) @JvmField val msgDecided: String = \"\",\n        @ProtoNumber(7) @JvmField val srcId: Int = 0,\n        @ProtoNumber(8) @JvmField val subSrcId: Int = 0,\n        @ProtoNumber(9) @JvmField val actions: List<SystemMsgAction> = emptyList(),\n        @ProtoNumber(10) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(11) @JvmField val actionUin: Long = 0L,\n        @ProtoNumber(12) @JvmField val groupMsgType: Int = 0,\n        @ProtoNumber(13) @JvmField val groupInviterRole: Int = 0,\n        @ProtoNumber(14) @JvmField val friendInfo: FriendInfo? = null,\n        @ProtoNumber(15) @JvmField val groupInfo: GroupInfo? = null,\n        @ProtoNumber(16) @JvmField val actorUin: Long = 0L,\n        @ProtoNumber(17) @JvmField val msgActorDescribe: String = \"\",\n        @ProtoNumber(18) @JvmField val msgAdditionalList: String = \"\",\n        @ProtoNumber(19) @JvmField val relation: Int = 0,\n        @ProtoNumber(20) @JvmField val reqsubtype: Int = 0,\n        @ProtoNumber(21) @JvmField val cloneUin: Long = 0L,\n        @ProtoNumber(22) @JvmField val discussUin: Long = 0L,\n        @ProtoNumber(23) @JvmField val eimGroupId: Long = 0L,\n        @ProtoNumber(24) @JvmField val msgInviteExtinfo: MsgInviteExt? = null,\n        @ProtoNumber(25) @JvmField val msgPayGroupExtinfo: MsgPayGroupExt? = null,\n        @ProtoNumber(26) @JvmField val sourceFlag: Int = 0,\n        @ProtoNumber(27) @JvmField val gameNick: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(28) @JvmField val gameMsg: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(29) @JvmField val groupFlagext3: Int = 0,\n        @ProtoNumber(30) @JvmField val groupOwnerUin: Long = 0L,\n        @ProtoNumber(31) @JvmField val doubtFlag: Int = 0,\n        @ProtoNumber(32) @JvmField val warningTips: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(33) @JvmField val nameMore: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(50) @JvmField val reqUinFaceid: Int = 0,\n        @ProtoNumber(51) @JvmField val reqUinNick: String = \"\",\n        @ProtoNumber(52) @JvmField val groupName: String = \"\",\n        @ProtoNumber(53) @JvmField val actionUinNick: String = \"\",\n        @ProtoNumber(54) @JvmField val msgQna: String = \"\",\n        @ProtoNumber(55) @JvmField val msgDetail: String = \"\",\n        @ProtoNumber(57) @JvmField val groupExtFlag: Int = 0,\n        @ProtoNumber(58) @JvmField val actorUinNick: String = \"\",\n        @ProtoNumber(59) @JvmField val picUrl: String = \"\",\n        @ProtoNumber(60) @JvmField val cloneUinNick: String = \"\",\n        @ProtoNumber(61) @JvmField val reqUinBusinessCard: String = \"\",\n        @ProtoNumber(63) @JvmField val eimGroupIdName: String = \"\",\n        @ProtoNumber(64) @JvmField val reqUinPreRemark: String = \"\",\n        @ProtoNumber(65) @JvmField val actionUinQqNick: String = \"\",\n        @ProtoNumber(66) @JvmField val actionUinRemark: String = \"\",\n        @ProtoNumber(67) @JvmField val reqUinGender: Int = 0,\n        @ProtoNumber(68) @JvmField val reqUinAge: Int = 0,\n        @ProtoNumber(69) @JvmField val c2cInviteJoinGroupFlag: Int = 0,\n        @ProtoNumber(101) @JvmField val cardSwitch: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SystemMsgAction(\n        @ProtoNumber(1) @JvmField val name: String = \"\",\n        @ProtoNumber(2) @JvmField val result: String = \"\",\n        @ProtoNumber(3) @JvmField val action: Int = 0,\n        @ProtoNumber(4) @JvmField val actionInfo: SystemMsgActionInfo? = null,\n        @ProtoNumber(5) @JvmField val detailName: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SystemMsgActionInfo(\n        @ProtoNumber(1) @JvmField val type: Int /* enum */ = 1,\n        @ProtoNumber(2) @JvmField val groupCode: Long = 0L,\n        @ProtoNumber(3) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(50) @JvmField val msg: String = \"\",\n        @ProtoNumber(51) @JvmField val groupId: Int = 0,\n        @ProtoNumber(52) @JvmField val remark: String = \"\",\n        @ProtoNumber(53) @JvmField val blacklist: Boolean = false,\n        @ProtoNumber(54) @JvmField val addFrdSNInfo: AddFrdSNInfo? = null,\n    ) : ProtoBuf\n}\n\n@Serializable\ninternal class Youtu : ProtoBuf {\n    @Serializable\n    internal class NameCardOcrRsp(\n        @ProtoNumber(1) @JvmField val errorcode: Int = 0,\n        @ProtoNumber(2) @JvmField val errormsg: String = \"\",\n        @ProtoNumber(3) @JvmField val uin: String = \"\",\n        @ProtoNumber(4) @JvmField val uinConfidence: Float = 0.0F,\n        @ProtoNumber(5) @JvmField val phone: String = \"\",\n        @ProtoNumber(6) @JvmField val phoneConfidence: Float = 0.0F,\n        @ProtoNumber(7) @JvmField val name: String = \"\",\n        @ProtoNumber(8) @JvmField val nameConfidence: Float = 0.0F,\n        @ProtoNumber(9) @JvmField val image: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(10) @JvmField val sessionId: String = \"\",\n    ) : ProtoBuf\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/SyncCookie.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport kotlin.jvm.JvmField\nimport kotlin.math.absoluteValue\nimport kotlin.random.Random\n\n\n// COMMENTED ON 2020/7/25\n\n@Serializable\ninternal class SyncCookie(\n    @ProtoNumber(1) @JvmField val time1: Long? = null, // 1580277992\n    @ProtoNumber(2) @JvmField val time: Long, // 1580277992\n    @ProtoNumber(3) @JvmField val unknown1: Long = Random.nextLong().absoluteValue, // 678328038\n    @ProtoNumber(4) @JvmField val unknown2: Long = Random.nextLong().absoluteValue, // 1687142153\n    @ProtoNumber(5) @JvmField val const1: Long = const1_, // 1458467940\n    @ProtoNumber(11) @JvmField val const2: Long = const2_, // 2683038258\n    @ProtoNumber(12) @JvmField val unknown3: Long = 0x1d,\n    @ProtoNumber(13) @JvmField val lastSyncTime: Long? = null,\n    @ProtoNumber(14) @JvmField val unknown4: Long = 0,\n) : ProtoBuf\n\nprivate val const1_: Long = Random.nextLong().absoluteValue\nprivate val const2_: Long = Random.nextLong().absoluteValue\n\n\n/*\n\n@Serializable\ninternal class SyncCookie(\n    @SerialId(1) @JvmField val time1: Long? = null, // 1580277992\n    @SerialId(2) @JvmField val time: Long, // 1580277992\n    @SerialId(3) @JvmField val unknown1: Long = 678328038,// 678328038\n    @SerialId(4) @JvmField val unknown2: Long = 1687142153, // 1687142153\n    @SerialId(5) @JvmField val const1: Long = 1458467940, // 1458467940\n    @SerialId(11) @JvmField val const2: Long = 2683038258, // 2683038258\n    @SerialId(12) @JvmField val unknown3: Long = 0x1d,\n    @SerialId(13) @JvmField val lastSyncTime: Long? = null,\n    @SerialId(14) @JvmField val unknown4: Long = 0\n) : ProtoBuf\n */"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/msgType0x210.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"SpellCheckingInspection\")\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoIntegerType\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport kotlinx.serialization.protobuf.ProtoType\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\n@Serializable\ninternal class SubMsgType0x43 : ProtoBuf {\n    @Serializable\n    internal class UpdateTips(\n        @ProtoNumber(1) @JvmField val desc: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n}\n\ninternal class Submsgtype0x101 {\n    internal class SubMsgType0x27 : ProtoBuf {\n        @Serializable\n        internal class ClientReport(\n            @ProtoNumber(1) @JvmField val serviceId: Int = 0,\n            @ProtoNumber(2) @JvmField val contentId: String = \"\",\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgPushPlatform: PushPlatform? = null,\n            @ProtoNumber(2) @JvmField val msgClientReport: ClientReport? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class PushPlatform(\n            @ProtoNumber(1) @JvmField val fromUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val title: String = \"\",\n            @ProtoNumber(3) @JvmField val desc: String = \"\",\n            @ProtoNumber(4) @JvmField val targetUrl: String = \"\",\n            @ProtoNumber(5) @JvmField val forwardType: Int = 0,\n            @ProtoNumber(6) @JvmField val extDataString: String = \"\",\n            @ProtoNumber(7) @JvmField val extData: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x102 {\n    internal class Submsgtype0x102 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val adId: String = \"\",\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x103 {\n    internal class Submsgtype0x103 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val from: Long = 0L,\n            @ProtoNumber(2) @JvmField val to: Long = 0L,\n            @ProtoNumber(3) @JvmField val topicId: Int = 0,\n            @ProtoNumber(11) @JvmField val curCount: Int = 0,\n            @ProtoNumber(12) @JvmField val totalCount: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x104 {\n    internal class Submsgtype0x104 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val from: Long = 0L,\n            @ProtoNumber(2) @JvmField val to: Long = 0L,\n            @ProtoNumber(3) @JvmField val topicId: Int = 0,\n            @ProtoNumber(11) @JvmField val wording: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x108 {\n    internal class SubMsgType0x108 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val type: Int = 0,\n            @ProtoNumber(2) @JvmField val pushUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val likeCount: Int = 0,\n            @ProtoNumber(4) @JvmField val pushTime: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x10f {\n    internal class Submsgtype0x10f : ProtoBuf {\n        @Serializable\n        internal class KanDianCoinSettingWording(\n            @ProtoNumber(1) @JvmField val wording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val pictureUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val isOpenCoinEntry: Int = 0,\n            @ProtoNumber(2) @JvmField val canGetCoinCount: Int = 0,\n            @ProtoNumber(3) @JvmField val coinIconUrl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val msgSettingWording: KanDianCoinSettingWording? = null,\n            @ProtoNumber(5) @JvmField val lastCompletedTaskStamp: Long = 0L,\n            @ProtoNumber(6) @JvmField val dstUin: Long = 0L,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x111 {\n    internal class SubMsgType0x111 : ProtoBuf {\n        @Serializable\n        internal class AddFriendSource(\n            @ProtoNumber(1) @JvmField val source: Int = 0,\n            @ProtoNumber(2) @JvmField val subSource: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class Color(\n            @ProtoNumber(1) @JvmField val r: Int = 0,\n            @ProtoNumber(2) @JvmField val g: Int = 0,\n            @ProtoNumber(3) @JvmField val b: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class Label(\n            @ProtoNumber(1) @JvmField val name: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val textColor: Color? = null,\n            @ProtoNumber(3) @JvmField val edgingColor: Color? = null,\n            @ProtoNumber(4) @JvmField val labelType: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MayKnowPerson(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val msgIosSource: AddFriendSource? = null,\n            @ProtoNumber(3) @JvmField val msgAndroidSource: AddFriendSource? = null,\n            @ProtoNumber(4) @JvmField val reason: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val additive: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val nick: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(7) @JvmField val remark: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(8) @JvmField val country: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(9) @JvmField val province: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(10) @JvmField val city: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(11) @JvmField val age: Int = 0,\n            @ProtoNumber(12) @JvmField val catelogue: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(13) @JvmField val alghrithm: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(14) @JvmField val richbuffer: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(15) @JvmField val qzone: Int = 0,\n            @ProtoNumber(16) @JvmField val gender: Int = 0,\n            @ProtoNumber(17) @JvmField val mobileName: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(18) @JvmField val token: String = \"\",\n            @ProtoNumber(19) @JvmField val msgLabels: List<Label> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val type: Long = 0L,\n            @ProtoNumber(2) @JvmField val msgAddRecommendPersons: List<MayKnowPerson> = emptyList(),\n            @ProtoNumber(3) @JvmField val uint64DelUins: List<Long> = emptyList(),\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x113 {\n    internal class SubMsgType0x113 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val int32AppId: Int = 0,\n            @ProtoNumber(2) @JvmField val int32TaskId: Int = 0,\n            @ProtoNumber(3) @JvmField val enumTaskOp: Int /* enum */ = 1,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x115 {\n    internal class SubMsgType0x115 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val fromUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val toUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val msgNotifyItem: NotifyItem? = null,\n            @ProtoNumber(4) @JvmField val pbReserve: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class NotifyItem(\n            @ProtoNumber(1) @JvmField val ime: Int = 0,\n            @ProtoNumber(2) @JvmField val timeout: Int = 0,\n            @ProtoNumber(3) @JvmField val timestamp: Long = 0L,\n            @ProtoNumber(4) @JvmField val eventType: Int = 0,\n            @ProtoNumber(5) @JvmField val interval: Int = 0,\n            @ProtoNumber(6) @JvmField val wording: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x116 {\n    internal class Submsgtype0x116 : ProtoBuf {\n        @Serializable\n        internal class MemberInfo(\n            @ProtoNumber(1) @JvmField val memberUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val inviteTimestamp: Int = 0,\n            @ProtoNumber(3) @JvmField val terminalType: Int = 0,\n            @ProtoNumber(4) @JvmField val clientVersion: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgMemberJoin: List<MemberInfo> = emptyList(),\n            @ProtoNumber(2) @JvmField val msgMemberQuit: List<MemberInfo> = emptyList(),\n            @ProtoNumber(3) @JvmField val groupId: Int = 0,\n            @ProtoNumber(4) @JvmField val roomId: Int = 0,\n            @ProtoNumber(5) @JvmField val inviteListTotalCount: Int = 0,\n            @ProtoNumber(6) @JvmField val enumEventType: Int /* enum */ = 1,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x117 {\n    internal class Submsgtype0x117 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val uint32MoudleId: List<Int> = emptyList(),\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x118 {\n    internal class Submsgtype0x118 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val pushType: Int = 0,\n            @ProtoNumber(2) @JvmField val pushData: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val timestamp: Int = 0,\n            @ProtoNumber(4) @JvmField val msgSystemNotify: SystemNotify? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class SystemNotify(\n            @ProtoNumber(1) @JvmField val msgSummary: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val filterFlag: Int = 0,\n            @ProtoNumber(3) @JvmField val extendContent: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val ignorePcActive: Int = 0,\n            @ProtoNumber(5) @JvmField val filterVersion: Int = 0,\n            @ProtoNumber(6) @JvmField val countFlag: Int = 0,\n            @ProtoNumber(7) @JvmField val filterVersionUpperlimitFlag: Int = 0,\n            @ProtoNumber(8) @JvmField val filterVersionUpperlimit: Int = 0,\n            @ProtoNumber(9) @JvmField val customSound: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(10) @JvmField val admnFlag: Int = 0,\n            @ProtoNumber(11) @JvmField val ignoreWithoutContent: Int = 0,\n            @ProtoNumber(12) @JvmField val msgTitle: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x119 {\n    internal class SubMsgType0x119 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val writerUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val creatorUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val richContent: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val optBytesUrl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val creatorNick: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x11a {\n    internal class Submsgtype0x11a : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val enumResult: Int /* enum */ = 0,\n            @ProtoNumber(2) @JvmField val token: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val encryptKey: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val msgUserData: UserData? = null,\n            @ProtoNumber(5) @JvmField val enumBizType: Int /* enum */ = 1,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class UserData(\n            @ProtoNumber(1) @JvmField val ip: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val fixed32Port: List<Int> = emptyList(),\n            @ProtoNumber(3) @JvmField val ssid: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val bssid: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val enumPlatform: Int /* enum */ = 1,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x11b {\n    internal class Submsgtype0x11b : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val qrSig: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val enumBizType: Int /* enum */ = 1,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x11c {\n    @Serializable\n    internal class MsgBody(\n        @ProtoNumber(1) @JvmField val cmd: Int = 0,\n        @ProtoNumber(2) @JvmField val timestamp: Int = 0,\n        @ProtoNumber(3) @JvmField val data: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n}\n\n\ninternal class Submsgtype0x11e {\n    internal class SubMsgType0x11e : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val type: Int = 0,\n            @ProtoNumber(2) @JvmField val reason: String = \"\",\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x11f {\n    internal class SubMsgType0x11f : ProtoBuf {\n        @Serializable\n        internal class MediaUserInfo(\n            @ProtoNumber(1) @JvmField val toUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val joinState: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgType: Int = 0,\n            @ProtoNumber(2) @JvmField val msgInfo: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val versionCtrl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val aioType: Int = 0,\n            @ProtoNumber(5) @JvmField val operUin: Long = 0L,\n            @ProtoNumber(6) @JvmField val uint64ToUin: List<Long> = emptyList(),\n            @ProtoNumber(7) @JvmField val grayTips: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(8) @JvmField val msgSeq: Long = 0L,\n            @ProtoNumber(9) @JvmField val msgMediaUin: List<MediaUserInfo> = emptyList(),\n            @ProtoNumber(10) @JvmField val msgPerSetting: PersonalSetting? = null,\n            @ProtoNumber(11) @JvmField val playMode: Int = 0,\n            @ProtoNumber(99) @JvmField val mediaType: Int = 0,\n            @ProtoNumber(100) @JvmField val extInfo: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class PersonalSetting(\n            @ProtoNumber(1) @JvmField val themeId: Int = 0,\n            @ProtoNumber(2) @JvmField val playerId: Int = 0,\n            @ProtoNumber(3) @JvmField val fontId: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x120 {\n    internal class SubMsgType0x120 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val srcAppId: Int = 0,\n            @ProtoNumber(2) @JvmField val noticeType: Int = 0,\n            @ProtoNumber(3) @JvmField val reserve1: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val reserve2: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val reserve3: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val noticeTime: Int = 0,\n            @ProtoNumber(7) @JvmField val frdUin: Long = 0L,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x122 {\n    internal class GrayTipsResv : ProtoBuf {\n        @Serializable\n        internal class ResvAttr(\n            @ProtoNumber(1) @JvmField val friendBannedFlag: Int = 0,\n        ) : ProtoBuf\n    }\n\n    internal class Submsgtype0x122 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val busiType: Long = 0L,\n            @ProtoNumber(2) @JvmField val busiId: Long = 0L,\n            @ProtoNumber(3) @JvmField val ctrlFlag: Int = 0,\n            @ProtoNumber(4) @JvmField val c2cType: Int = 0,\n            @ProtoNumber(5) @JvmField val serviceType: Int = 0,\n            @ProtoNumber(6) @JvmField val templId: Long = 0L,\n            @ProtoNumber(7) @JvmField val msgTemplParam: List<TemplParam> = emptyList(),\n            @ProtoNumber(8) @JvmField val content: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(10) @JvmField val tipsSeqId: Long = 0L,\n            @ProtoNumber(100) @JvmField val pbReserv: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class TemplParam(\n            @ProtoNumber(1) @JvmField val name: String = \"\",\n            @ProtoNumber(2) @JvmField val value: String = \"\",\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x123 {\n    internal class Submsgtype0x123 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val busiType: Long = 0L,\n            @ProtoNumber(2) @JvmField val busiId: Long = 0L,\n            @ProtoNumber(3) @JvmField val ctrlFlag: Int = 0,\n            @ProtoNumber(4) @JvmField val c2cType: Int = 0,\n            @ProtoNumber(5) @JvmField val serviceType: Int = 0,\n            @ProtoNumber(6) @JvmField val templId: Long = 0L,\n            @ProtoNumber(7) @JvmField val templParam: List<TemplParam> = emptyList(),\n            @ProtoNumber(8) @JvmField val templContent: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class TemplParam(\n            @ProtoNumber(1) @JvmField val name: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val value: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x125 {\n    internal class Submsgtype0x125 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgType: Int = 0,\n            @ProtoNumber(2) @JvmField val msgInfo: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val versionCtrl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val operUin: Long = 0L,\n            @ProtoNumber(5) @JvmField val grayTips: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val msgSeq: Long = 0L,\n            @ProtoNumber(99) @JvmField val pushType: Int = 0,\n            @ProtoNumber(100) @JvmField val extInfo: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x126 {\n    internal class Submsgtype0x126 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgSeq: Long = 0L,\n            @ProtoNumber(2) @JvmField val msgType: Int = 0,\n            @ProtoNumber(3) @JvmField val msgInfo: String = \"\",\n            @ProtoNumber(100) @JvmField val extInfo: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x127 {\n    internal class Submsgtype0x127 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val seq: Long = 0L,\n            @ProtoNumber(2) @JvmField val actionType: Int = 0,\n            @ProtoNumber(3) @JvmField val friendUin: Long = 0L,\n            @ProtoNumber(4) @JvmField val operUin: Long = 0L,\n            @ProtoNumber(5) @JvmField val grayTips: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val joinState: Int /* enum */ = 1,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x128 {\n    internal class Submsgtype0x128 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val matchUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val tipsWording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val nick: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val timeStamp: Long = 0L,\n            @ProtoNumber(6) @JvmField val matchExpiredTime: Int = 0,\n            @ProtoNumber(7) @JvmField val reportId: String = \"\",\n            //@ProtoNumber(8) @JvmField val msgTag: Oidb0xe03.TagInfo? = null,\n            //@ProtoNumber(9) @JvmField val msgMatchUinData: Oidb0xe03.MatchUinData? = null\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x129 {\n    internal class Submsgtype0x129 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val seq: Long = 0L,\n            @ProtoNumber(2) @JvmField val actionType: Int = 0,\n            @ProtoNumber(3) @JvmField val friendUin: Long = 0L,\n            @ProtoNumber(4) @JvmField val operUin: Long = 0L,\n            @ProtoNumber(5) @JvmField val grayTips: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val joinState: Int /* enum */ = 1,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x133 {\n    internal class Submsgtype0x133 : ProtoBuf {\n        @Serializable\n        internal class FaceFriend(\n            @ProtoNumber(1) @JvmField val friend: Long = 0L,\n            @ProtoNumber(2) @JvmField val name: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val type: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val msgFriends: List<FaceFriend> = emptyList(),\n            @ProtoNumber(3) @JvmField val sessionId: String = \"\",\n        ) : ProtoBuf\n    }\n}\n\ninternal class Submsgtype0x135 {\n    @Serializable\n    internal class ModulePushPb : ProtoBuf {\n        @Serializable\n        internal class Content(\n            @ProtoNumber(1) @JvmField val fromUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val title: String = \"\",\n            @ProtoNumber(3) @JvmField val desc: String = \"\",\n            @ProtoNumber(4) @JvmField val msgImage: Image? = null,\n            @ProtoNumber(5) @JvmField val msgForward: Forward? = null,\n            @ProtoNumber(6) @JvmField val extData: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class Forward(\n            @ProtoNumber(1) @JvmField val url: String = \"\",\n            @ProtoNumber(2) @JvmField val type: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class Image(\n            @ProtoNumber(1) @JvmField val url: String = \"\",\n            @ProtoNumber(2) @JvmField val width: Int = 0,\n            @ProtoNumber(3) @JvmField val height: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val int32ServiceId: Int = 0,\n            @ProtoNumber(2) @JvmField val int32SubServiceId: Int = 0,\n            @ProtoNumber(3) @JvmField val int32NotifyId: Int = 0,\n            @ProtoNumber(4) @JvmField val int32PushId: Int = 0,\n            @ProtoNumber(5) @JvmField val int32Type: Int = 0,\n            @ProtoNumber(6) @JvmField val int32RecallFlag: Int = 0,\n            @ProtoNumber(7) @JvmField val msgContent: Content? = null,\n        ) : ProtoBuf\n    }\n}\n\n@Serializable\ninternal class Submsgtype0x13a : ProtoBuf {\n    @Serializable\n    internal class MsgBody(\n        @ProtoNumber(1) @JvmField val pushType: Int = 0,\n        @ProtoNumber(2) @JvmField val pushData: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(3) @JvmField val timestamp: Int = 0,\n        @ProtoNumber(4) @JvmField val msgSystemNotify: SystemNotify? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class SystemNotify(\n        @ProtoNumber(1) @JvmField val msgSummary: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(2) @JvmField val filterFlag: Int = 0,\n        @ProtoNumber(3) @JvmField val extendContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(4) @JvmField val ignorePcActive: Int = 0,\n        @ProtoNumber(5) @JvmField val filterVersion: Int = 0,\n        @ProtoNumber(6) @JvmField val countFlag: Int = 0,\n        @ProtoNumber(7) @JvmField val filterVersionUpperlimitFlag: Int = 0,\n        @ProtoNumber(8) @JvmField val filterVersionUpperlimit: Int = 0,\n        @ProtoNumber(9) @JvmField val customSound: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(10) @JvmField val admnFlag: Int = 0,\n        @ProtoNumber(11) @JvmField val ignoreWithoutContent: Int = 0,\n        @ProtoNumber(12) @JvmField val msgTitle: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n}\n\n\n@Serializable\ninternal class Submsgtype0x13b : ProtoBuf {\n    @Serializable\n    internal class MsgBody(\n        @ProtoNumber(1) @JvmField val op: Int /* enum */ = 2,\n        @ProtoNumber(2) @JvmField val muteFriend: Long = 0L,\n    ) : ProtoBuf\n}\n\n/*\ninternal class Submsgtype0x1a {\n    internal class SubMsgType0x1a : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val fileKey: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val fromUinInt: Int = 0,\n            @ProtoNumber(3) @JvmField val toUinInt: Int = 0,\n            @ProtoNumber(4) @JvmField val status: Int = 0,\n            @ProtoNumber(5) @JvmField val ttl: Int = 0,\n            @ProtoNumber(6) @JvmField val desc: String = \"\",\n            @ProtoNumber(7) @JvmField val type: Int = 0,\n            @ProtoNumber(8) @JvmField val captureTimes: Int = 0,\n            @ProtoNumber(9) @JvmField val fromUin: Long = 0L,\n            @ProtoNumber(10) @JvmField val toUin: Long = 0L\n        ) : ProtoBuf\n    }\n}*/\n\n\ninternal class Submsgtype0x26 {\n    internal class Submsgtype0x26 : ProtoBuf {\n        @Serializable\n        internal class AppID(\n            @ProtoNumber(1) @JvmField val appId: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class AppNotifyContent(\n            @ProtoNumber(1) @JvmField val text: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val optMsgAppNotifyUser: List<AppNotifyUser> = emptyList(),\n            @ProtoNumber(3) @JvmField val onlineCount: Int = 0,\n            @ProtoNumber(4) @JvmField val expireTs: Int = 0,\n            @ProtoNumber(5) @JvmField val roomMode: Int = 0,\n            @ProtoNumber(6) @JvmField val liveExtraMode: Int = 0,\n            @ProtoNumber(7) @JvmField val gameId: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class AppNotifyUser(\n            @ProtoNumber(1) @JvmField val optUint64Uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val optUint32Flag: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class AppTip(\n            @ProtoNumber(1) @JvmField val tipInfoSeq: Int = 0,\n            @ProtoNumber(2) @JvmField val icon: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val iconTimeStamp: Int = 0,\n            @ProtoNumber(4) @JvmField val tooltip: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val reportidClick: Int = 0,\n            @ProtoNumber(6) @JvmField val reportidShow: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class AppTipNotify(\n            @ProtoNumber(1) @JvmField val msgAppTip: AppTip? = null,\n            @ProtoNumber(2) @JvmField val action: Int = 0,\n            @ProtoNumber(3) @JvmField val text: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val notifySeq: Int = 0,\n            @ProtoNumber(5) @JvmField val neededTipInfoSeq: Int = 0,\n            @ProtoNumber(6) @JvmField val optMsgAppNotifyContent: AppNotifyContent? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val subCmd: Int = 0,\n            @ProtoNumber(2) @JvmField val msgSubcmd0x1PushBody: List<SubCmd0x1UpdateAppUnreadNum> = emptyList(),\n            @ProtoNumber(3) @JvmField val msgSubcmd0x2PushBody: SubCmd0x2UpdateAppList? = null,\n            @ProtoNumber(4) @JvmField val msgSubcmd0x3PushBody: SubCmd0x3UpdateDiscussAppInfo? = null,\n            @ProtoNumber(5) @JvmField val msgSubcmd0x4PushBody: SubCmd0x4UpdateApp? = null,\n        ) : ProtoBuf {\n            @Serializable\n            internal class SubCmd0x1UpdateAppUnreadNum(\n                @ProtoNumber(1) @JvmField val msgAppId: AppID? = null,\n                @ProtoNumber(2) @JvmField val groupCode: Long = 0L,\n                @ProtoType(ProtoIntegerType.SIGNED) @ProtoNumber(3) @JvmField val sint32UnreadNum: Int = 0,\n                @ProtoNumber(4) @JvmField val msgAppTipNotify: AppTipNotify? = null,\n                @ProtoType(ProtoIntegerType.SIGNED) @ProtoNumber(5) @JvmField val sint32AlbumCnt: Int = 0,\n            ) : ProtoBuf\n\n            @Serializable\n            internal class SubCmd0x2UpdateAppList(\n                @ProtoNumber(1) @JvmField val msgAppId: List<AppID> = emptyList(),\n                @ProtoNumber(2) @JvmField val uint32TimeStamp: List<Int> = emptyList(),\n                @ProtoNumber(3) @JvmField val groupCode: Long = 0L,\n            ) : ProtoBuf\n\n            @Serializable\n            internal class SubCmd0x3UpdateDiscussAppInfo(\n                @ProtoNumber(1) @JvmField val msgAppId: AppID? = null,\n                @ProtoNumber(2) @JvmField val confUin: Long = 0L,\n                @ProtoNumber(3) @JvmField val msgAppTipNotify: AppTipNotify? = null,\n            ) : ProtoBuf\n\n            @Serializable\n            internal class SubCmd0x4UpdateApp(\n                @ProtoNumber(1) @JvmField val msgAppId: AppID? = null,\n                @ProtoNumber(2) @JvmField val groupCode: Long = 0L,\n                @ProtoType(ProtoIntegerType.SIGNED) @ProtoNumber(3) @JvmField val sint32UnreadNum: Int = 0,\n            ) : ProtoBuf\n        }\n\n        @Serializable\n        internal class TransferCnt(\n            @ProtoNumber(1) @JvmField val chainId: Long = 0L,\n        ) : ProtoBuf\n    }\n}\n\ninternal class Submsgtype0x27 {\n    internal class SubMsgType0x27 : ProtoBuf {\n        @Serializable\n        internal class AddGroup(\n            @ProtoNumber(1) @JvmField val groupid: Int = 0,\n            @ProtoNumber(2) @JvmField val sortid: Int = 0,\n            @ProtoNumber(3) @JvmField val groupname: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class AppointmentNotify(\n            @ProtoNumber(1) @JvmField val fromUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val appointId: String = \"\",\n            @ProtoNumber(3) @JvmField val notifytype: Int = 0,\n            @ProtoNumber(4) @JvmField val tipsContent: String = \"\",\n            @ProtoNumber(5) @JvmField val unreadCount: Int = 0,\n            @ProtoNumber(6) @JvmField val joinWording: String = \"\",\n            @ProtoNumber(7) @JvmField val viewWording: String = \"\",\n            @ProtoNumber(8) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(9) @JvmField val eventInfo: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(10) @JvmField val nearbyEventInfo: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(11) @JvmField val feedEventInfo: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class BinaryMsg(\n            @ProtoNumber(1) @JvmField val opType: Int = 0,\n            @ProtoNumber(2) @JvmField val opValue: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ChatMatchInfo(\n            @ProtoNumber(1) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val uin: Long = 0L,\n            @ProtoNumber(3) @JvmField val matchUin: Long = 0L,\n            @ProtoNumber(4) @JvmField val tipsWording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val leftChatTime: Int = 0,\n            @ProtoNumber(6) @JvmField val timeStamp: Long = 0L,\n            @ProtoNumber(7) @JvmField val matchExpiredTime: Int = 0,\n            @ProtoNumber(8) @JvmField val c2cExpiredTime: Int = 0,\n            @ProtoNumber(9) @JvmField val matchCount: Int = 0,\n            @ProtoNumber(10) @JvmField val nick: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ConfMsgRoamFlag(\n            @ProtoNumber(1) @JvmField val confid: Long = 0L,\n            @ProtoNumber(2) @JvmField val flag: Int = 0,\n            @ProtoNumber(3) @JvmField val timestamp: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class DaRenNotify(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val loginDays: Int = 0,\n            @ProtoNumber(3) @JvmField val days: Int = 0,\n            @ProtoNumber(4) @JvmField val isYestodayLogin: Int = 0,\n            @ProtoNumber(5) @JvmField val isTodayLogin: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class DelFriend(\n            @ProtoNumber(1) @JvmField val uint64Uins: List<Long> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class DelGroup(\n            @ProtoNumber(1) @JvmField val groupid: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class FanpaiziNotify(\n            @ProtoNumber(1) @JvmField val fromUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val fromNick: String = \"\",\n            @ProtoNumber(3) @JvmField val tipsContent: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ForwardBody(\n            @ProtoNumber(1) @JvmField val notifyType: Int = 0,\n            @ProtoNumber(2) @JvmField val opType: Int = 0,\n            @ProtoNumber(3) @JvmField val msgAddGroup: AddGroup? = null,\n            @ProtoNumber(4) @JvmField val msgDelGroup: DelGroup? = null,\n            @ProtoNumber(5) @JvmField val msgModGroupName: ModGroupName? = null,\n            @ProtoNumber(6) @JvmField val msgModGroupSort: ModGroupSort? = null,\n            @ProtoNumber(7) @JvmField val msgModFriendGroup: ModFriendGroup? = null,\n            @ProtoNumber(8) @JvmField val msgModProfile: ModProfile? = null,\n            @ProtoNumber(9) @JvmField val msgModFriendRemark: ModFriendRemark? = null,\n            @ProtoNumber(10) @JvmField val msgModLongNick: ModLongNick? = null,\n            @ProtoNumber(11) @JvmField val msgModCustomFace: ModCustomFace? = null,\n            @ProtoNumber(12) @JvmField val msgModGroupProfile: ModGroupProfile? = null,\n            @ProtoNumber(13) @JvmField val msgModGroupMemberProfile: ModGroupMemberProfile? = null,\n            @ProtoNumber(14) @JvmField val msgDelFriend: DelFriend? = null,\n            @ProtoNumber(15) @JvmField val msgRoamPriv: ModFrdRoamPriv? = null,\n            @ProtoNumber(16) @JvmField val msgGrpMsgRoamFlag: GrpMsgRoamFlag? = null,\n            @ProtoNumber(17) @JvmField val msgConfMsgRoamFlag: ConfMsgRoamFlag? = null,\n            @ProtoNumber(18) @JvmField val msgModRichLongNick: ModLongNick? = null,\n            @ProtoNumber(19) @JvmField val msgBinPkg: BinaryMsg? = null,\n            @ProtoNumber(20) @JvmField val msgModFriendRings: ModSnsGeneralInfo? = null,\n            @ProtoNumber(21) @JvmField val msgModConfProfile: ModConfProfile? = null,\n            @ProtoNumber(22) @JvmField val msgModFriendFlag: SnsUpdateFlag? = null,\n            @ProtoNumber(23) @JvmField val msgAppointmentNotify: AppointmentNotify? = null,\n            @ProtoNumber(25) @JvmField val msgDarenNotify: DaRenNotify? = null,\n            @ProtoNumber(26) @JvmField val msgNewComeinUserNotify: NewComeinUserNotify? = null,\n            @ProtoNumber(200) @JvmField val msgPushSearchDev: PushSearchDev? = null,\n            @ProtoNumber(201) @JvmField val msgPushReportDev: PushReportDev? = null,\n            @ProtoNumber(202) @JvmField val msgQqPayPush: QQPayPush? = null,\n            @ProtoNumber(203) @JvmField val redpointInfo: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(204) @JvmField val msgHotFriendNotify: HotFriendNotify? = null,\n            @ProtoNumber(205) @JvmField val msgPraiseRankNotify: PraiseRankNotify? = null,\n            @ProtoNumber(210) @JvmField val msgCampusNotify: MQQCampusNotify? = null,\n            @ProtoNumber(211) @JvmField val msgModRichLongNickEx: ModLongNick? = null,\n            @ProtoNumber(212) @JvmField val msgChatMatchInfo: ChatMatchInfo? = null,\n            @ProtoNumber(214) @JvmField val msgFrdCustomOnlineStatusChange: FrdCustomOnlineStatusChange? = null,\n            @ProtoNumber(2000) @JvmField val msgFanpanziNotify: FanpaiziNotify? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class FrdCustomOnlineStatusChange(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class FriendGroup(\n            @ProtoNumber(1) @JvmField val fuin: Long = 0L,\n            @ProtoNumber(2) @JvmField val uint32OldGroupId: List<Int> = emptyList(),\n            @ProtoNumber(3) @JvmField val uint32NewGroupId: List<Int> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class FriendRemark(\n            @ProtoNumber(1) @JvmField val type: Int = 0,\n            @ProtoNumber(2) @JvmField val fuin: Long = 0L,\n            @ProtoNumber(3) @JvmField val rmkName: String = \"\",\n            @ProtoNumber(4) @JvmField val groupCode: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class GPS(\n            @ProtoNumber(1) @JvmField val int32Lat: Int = 900000000,\n            @ProtoNumber(2) @JvmField val int32Lon: Int = 900000000,\n            @ProtoNumber(3) @JvmField val int32Alt: Int = -10000000,\n            @ProtoNumber(4) @JvmField val int32Type: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class GroupMemberProfileInfo(\n            @ProtoNumber(1) @JvmField val field: Int = 0,\n            @ProtoNumber(2) @JvmField val value: String = \"\",\n        ) : ProtoBuf\n\n        @Serializable\n        internal class GroupProfileInfo(\n            @ProtoNumber(1) @JvmField val field: Int = 0,\n            @ProtoNumber(2) @JvmField val value: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class GroupSort(\n            @ProtoNumber(1) @JvmField val groupid: Int = 0,\n            @ProtoNumber(2) @JvmField val sortid: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class GrpMsgRoamFlag(\n            @ProtoNumber(1) @JvmField val groupcode: Long = 0L,\n            @ProtoNumber(2) @JvmField val flag: Int = 0,\n            @ProtoNumber(3) @JvmField val timestamp: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class HotFriendNotify(\n            @ProtoNumber(1) @JvmField val dstUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val praiseHotLevel: Int = 0,\n            @ProtoNumber(3) @JvmField val chatHotLevel: Int = 0,\n            @ProtoNumber(4) @JvmField val praiseHotDays: Int = 0,\n            @ProtoNumber(5) @JvmField val chatHotDays: Int = 0,\n            @ProtoNumber(6) @JvmField val closeLevel: Int = 0,\n            @ProtoNumber(7) @JvmField val closeDays: Int = 0,\n            @ProtoNumber(8) @JvmField val praiseFlag: Int = 0,\n            @ProtoNumber(9) @JvmField val chatFlag: Int = 0,\n            @ProtoNumber(10) @JvmField val closeFlag: Int = 0,\n            @ProtoNumber(11) @JvmField val notifyTime: Long = 0L,\n            @ProtoNumber(12) @JvmField val lastPraiseTime: Long = 0L,\n            @ProtoNumber(13) @JvmField val lastChatTime: Long = 0L,\n            @ProtoNumber(14) @JvmField val qzoneHotLevel: Int = 0,\n            @ProtoNumber(15) @JvmField val qzoneHotDays: Int = 0,\n            @ProtoNumber(16) @JvmField val qzoneFlag: Int = 0,\n            @ProtoNumber(17) @JvmField val lastQzoneTime: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ModConfProfile(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val confUin: Int = 0,\n            @ProtoNumber(3) @JvmField val msgProfileInfos: List<ProfileInfo> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ModCustomFace(\n            @ProtoNumber(1) @JvmField val type: Int = 0,\n            @ProtoNumber(2) @JvmField val uin: Long = 0L,\n            @ProtoNumber(3) @JvmField val groupCode: Long = 0L,\n            @ProtoNumber(4) @JvmField val cmdUin: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ModFrdRoamPriv(\n            @ProtoNumber(1) @JvmField val msgRoamPriv: List<OneRoamPriv> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ModFriendGroup(\n            @ProtoNumber(1) @JvmField val msgFrdGroup: List<FriendGroup> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ModFriendRemark(\n            @ProtoNumber(1) @JvmField val msgFrdRmk: List<FriendRemark> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ModGroupMemberProfile(\n            @ProtoNumber(1) @JvmField val groupUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val uin: Long = 0L,\n            @ProtoNumber(3) @JvmField val msgGroupMemberProfileInfos: List<GroupMemberProfileInfo> = emptyList(),\n            @ProtoNumber(4) @JvmField val groupCode: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ModGroupName(\n            @ProtoNumber(1) @JvmField val groupid: Int = 0,\n            @ProtoNumber(2) @JvmField val groupname: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ModGroupProfile(\n            @ProtoNumber(1) @JvmField val groupUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val msgGroupProfileInfos: List<GroupProfileInfo> = emptyList(),\n            @ProtoNumber(3) @JvmField val groupCode: Long = 0L,\n            @ProtoNumber(4) @JvmField val cmdUin: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ModGroupSort(\n            @ProtoNumber(1) @JvmField val msgGroupsort: List<GroupSort> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ModLongNick(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val value: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ModProfile(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val msgProfileInfos: List<ProfileInfo> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ModSnsGeneralInfo(\n            @ProtoNumber(1) @JvmField val msgSnsGeneralInfos: List<SnsUpateBuffer> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MQQCampusNotify(\n            @ProtoNumber(1) @JvmField val fromUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val wording: String = \"\",\n            @ProtoNumber(3) @JvmField val target: String = \"\",\n            @ProtoNumber(4) @JvmField val type: Int = 0,\n            @ProtoNumber(5) @JvmField val source: String = \"\",\n        ) : ProtoBuf\n\n        @Serializable\n        internal class SubMsgType0x27MsgBody(\n            @ProtoNumber(1) @JvmField val msgModInfos: List<ForwardBody> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class NewComeinUser(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val isFrd: Int = 0,\n            @ProtoNumber(3) @JvmField val remark: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val nick: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class NewComeinUserNotify(\n            @ProtoNumber(1) @JvmField val msgType: Int = 0,\n            @ProtoNumber(2) @JvmField val boolStrongNotify: Boolean = false,\n            @ProtoNumber(3) @JvmField val pushTime: Int = 0,\n            @ProtoNumber(4) @JvmField val msgNewComeinUser: NewComeinUser? = null,\n            @ProtoNumber(5) @JvmField val msgNewGroup: NewGroup? = null,\n            @ProtoNumber(6) @JvmField val msgNewGroupUser: NewGroupUser? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class NewGroup(\n            @ProtoNumber(1) @JvmField val groupCode: Long = 0L,\n            @ProtoNumber(2) @JvmField val groupName: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val ownerUin: Long = 0L,\n            @ProtoNumber(4) @JvmField val ownerNick: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val distance: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class NewGroupUser(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val int32Sex: Int = 0,\n            @ProtoNumber(3) @JvmField val int32Age: Int = 0,\n            @ProtoNumber(4) @JvmField val nick: String = \"\",\n            @ProtoNumber(5) @JvmField val distance: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class OneRoamPriv(\n            @ProtoNumber(1) @JvmField val fuin: Long = 0L,\n            @ProtoNumber(2) @JvmField val privTag: Int = 0,\n            @ProtoNumber(3) @JvmField val privValue: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class PraiseRankNotify(\n            @ProtoNumber(11) @JvmField val isChampion: Int = 0,\n            @ProtoNumber(12) @JvmField val rankNum: Int = 0,\n            @ProtoNumber(13) @JvmField val msg: String = \"\",\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ProfileInfo(\n            @ProtoNumber(1) @JvmField val field: Int = 0,\n            @ProtoNumber(2) @JvmField val value: String = \"\",\n        ) : ProtoBuf\n\n        @Serializable\n        internal class PushReportDev(\n            @ProtoNumber(1) @JvmField val msgType: Int = 0,\n            @ProtoNumber(4) @JvmField val cookie: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val reportMaxNum: Int = 200,\n            @ProtoNumber(6) @JvmField val sn: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class PushSearchDev(\n            @ProtoNumber(1) @JvmField val msgType: Int = 0,\n            @ProtoNumber(2) @JvmField val msgGpsInfo: GPS? = null,\n            @ProtoNumber(3) @JvmField val devTime: Int = 0,\n            @ProtoNumber(4) @JvmField val pushTime: Int = 0,\n            @ProtoNumber(5) @JvmField val din: Long = 0L,\n            @ProtoNumber(6) @JvmField val data: String = \"\",\n        ) : ProtoBuf\n\n        @Serializable\n        internal class QQPayPush(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val boolPayOk: Boolean = false,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class SnsUpateBuffer(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val code: Long = 0L,\n            @ProtoNumber(3) @JvmField val result: Int = 0,\n            @ProtoNumber(400) @JvmField val msgSnsUpdateItem: List<SnsUpdateItem> = emptyList(),\n            @ProtoNumber(401) @JvmField val uint32Idlist: List<Int> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class SnsUpdateFlag(\n            @ProtoNumber(1) @JvmField val msgUpdateSnsFlag: List<SnsUpdateOneFlag> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class SnsUpdateItem(\n            @ProtoNumber(1) @JvmField val updateSnsType: Int = 0,\n            @ProtoNumber(2) @JvmField val value: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class SnsUpdateOneFlag(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val id: Long = 0L,\n            @ProtoNumber(3) @JvmField val flag: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x28 {\n    internal class SubMsgType0x28 : ProtoBuf {\n        @Serializable\n        internal class FollowList(\n            @ProtoNumber(1) @JvmField val puin: Long = 0L,\n            @ProtoNumber(2) @JvmField val uin: Long = 0L,\n            @ProtoNumber(3) @JvmField val type: Int = 0,\n            @ProtoNumber(4) @JvmField val seqno: Int = 0,\n            @ProtoNumber(135) @JvmField val disableCancelChat: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val subCmd: Int = 0,\n            @ProtoNumber(2) @JvmField val msgRspFollowlist: RspFollowList? = null,\n            @ProtoNumber(3) @JvmField val msgRspTypelist: RspTypeList? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class RspFollowList(\n            @ProtoNumber(1) @JvmField val msgFollowlist: List<FollowList> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class RspTypeList(\n            @ProtoNumber(1) @JvmField val msgTypelist: List<TypeList> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class TypeList(\n            @ProtoNumber(1) @JvmField val puin: Long = 0L,\n            @ProtoNumber(2) @JvmField val flag: Int = 0,\n            @ProtoNumber(3) @JvmField val type: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x30 {\n    internal class SubMsgType0x30 : ProtoBuf {\n        @Serializable\n        internal class BlockListNotify(\n            @ProtoNumber(1) @JvmField val msgBlockUinInfo: List<BlockUinInfo> = emptyList(),\n            @ProtoNumber(2) @JvmField val uint64DelUin: List<Long> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class BlockUinInfo(\n            @ProtoNumber(1) @JvmField val blockUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val sourceId: Int = 0,\n            @ProtoNumber(3) @JvmField val sourceSubId: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val subCmd: Int = 0,\n            @ProtoNumber(2) @JvmField val msgS2cBlocklistNotify: BlockListNotify? = null,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x31 {\n    internal class Submsgtype0x31 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val flag: Int = 0,\n            @ProtoNumber(2) @JvmField val uin: Long = 0L,\n            @ProtoNumber(3) @JvmField val bindUin: Long = 0L,\n            @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(4) @JvmField val time: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x35 {\n    internal class Submsgtype0x35 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val bubbleTimestamp: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x3b {\n    internal class Submsgtype0x3b : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val subCmd: Int = 0,\n            @ProtoNumber(2) @JvmField val groupCode: Long = 0L,\n            @ProtoNumber(3) @JvmField val userShowFlag: Int = 0,\n            @ProtoNumber(4) @JvmField val memberLevelChanged: Int = 0,\n            @ProtoNumber(5) @JvmField val officemode: Int = 0,\n            @ProtoNumber(7) @JvmField val memberLevelNewChanged: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x3d {\n    internal class SttResultPush : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val subCmd: Int = 0,\n            @ProtoNumber(2) @JvmField val msgPttResp: TransPttResp? = null,\n            @ProtoNumber(3) @JvmField val msgPttShardResp: TransPttShardRsp? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class TextRsp(\n            @ProtoNumber(4) @JvmField val totalLen: Int = 0,\n            @ProtoNumber(5) @JvmField val seq: Int = 0,\n            @ProtoNumber(6) @JvmField val pos: Int = 0,\n            @ProtoNumber(7) @JvmField val len: Int = 0,\n            @ProtoNumber(8) @JvmField val text: ByteArray = EMPTY_BYTE_ARRAY\n        ) : ProtoBuf\n\n        @Serializable\n        internal class TransPttResp(\n            @ProtoNumber(1) @JvmField val sessionid: Long = 0L,\n            @ProtoNumber(2) @JvmField val pttType: Int = 0,\n            @ProtoNumber(3) @JvmField val errorCode: Int = 0,\n            @ProtoNumber(4) @JvmField val totalLen: Int = 0,\n            @ProtoNumber(5) @JvmField val seq: Int = 0,\n            @ProtoNumber(6) @JvmField val pos: Int = 0,\n            @ProtoNumber(7) @JvmField val len: Int = 0,\n            @ProtoNumber(8) @JvmField val text: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(9) @JvmField val senderUin: Long = 0L,\n            @ProtoNumber(10) @JvmField val receiverUin: Long = 0L,\n            @ProtoNumber(11) @JvmField val fileID: Int = 0,\n            @ProtoNumber(12) @JvmField val filemd5: String = \"\",\n            @ProtoNumber(13) @JvmField val filePath: String = \"\",\n        ) : ProtoBuf\n\n        @Serializable\n        internal class TransPttShardRsp(\n            @ProtoNumber(1) @JvmField val sessionid: Long = 0L,\n            @ProtoNumber(2) @JvmField val pttType: Int = 0,\n            @ProtoNumber(3) @JvmField val errorCode: Int = 0,\n            @ProtoNumber(9) @JvmField val senderUin: Long = 0L,\n            @ProtoNumber(10) @JvmField val receiverUin: Long = 0L,\n            @ProtoNumber(11) @JvmField val fileID: Int = 0,\n            @ProtoNumber(12) @JvmField val filemd5: String = \"\",\n            @ProtoNumber(13) @JvmField val filePath: String = \"\",\n            @ProtoNumber(21) @JvmField val totalSeq: Int = 0,\n            @ProtoNumber(22) @JvmField val boolIsTotalEnd: Boolean = false,\n            @ProtoNumber(23) @JvmField val boolIsCurEnd: Boolean = false,\n            @ProtoNumber(30) @JvmField val curTextRsp: TextRsp? = null,\n            @ProtoNumber(31) @JvmField val allTextRsp: TextRsp? = null\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x3e {\n    internal class Submsgtype0x3e : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val subcmd: Int = 0,\n            @ProtoNumber(2) @JvmField val random: Int = 0,\n            @ProtoNumber(3) @JvmField val result: Int = 0,\n            @ProtoNumber(4) @JvmField val device: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val sid: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x3f {\n    internal class SubMsgType0x3f : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgPubunikey: List<PubUniKey> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class PubUniKey(\n            @ProtoNumber(1) @JvmField val fromPubUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val qwMsgId: Long = 0L,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x40 {\n    internal class SubMsgType0x40 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val vUuid: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val fromUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val toUin: Long = 0L,\n            @ProtoNumber(4) @JvmField val state: Int = 0,\n            @ProtoNumber(11) @JvmField val opertype: Int = 0,\n            @ProtoNumber(12) @JvmField val fromphonenum: String = \"\",\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x41 {\n    internal class MsgType0x210SubMsgType0x41 : ProtoBuf {\n        @Serializable\n        internal class GameRsultMsg(\n            @ProtoNumber(1) @JvmField val gameName: String = \"\",\n            @ProtoNumber(2) @JvmField val gamePic: String = \"\",\n            @ProtoNumber(3) @JvmField val moreInfo: String = \"\",\n            @ProtoNumber(4) @JvmField val msgGameRsts: List<UinResult> = emptyList(),\n            @ProtoNumber(5) @JvmField val gameSubheading: String = \"\",\n            @ProtoNumber(6) @JvmField val uin: Long = 0L,\n            @ProtoNumber(7) @JvmField val nickname: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class UinResult(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val nickname: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val grade: Int = 0,\n            @ProtoNumber(4) @JvmField val score: String = \"\",\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x42 {\n    internal class Submsgtype0x42 : ProtoBuf {\n        @Serializable\n        internal class GameStatusSync(\n            @ProtoNumber(1) @JvmField val gameAppid: Int = 0,\n            @ProtoNumber(2) @JvmField val data: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x44 {\n    internal class Submsgtype0x44 : ProtoBuf {\n        @Serializable\n        internal class ClearCountMsg(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val time: Int = 0,\n            @ProtoNumber(3) @JvmField val processflag: Int = 0,\n            @ProtoNumber(4) @JvmField val updateflag: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class DelMsgNotify(\n            @ProtoNumber(1) @JvmField val sequence: Long = 0L\n        ) : ProtoBuf\n\n        @Serializable\n        internal class FriendSyncMsg(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val fuin: Long = 0L,\n            @ProtoNumber(3) @JvmField val processtype: Int = 0,\n            @ProtoNumber(4) @JvmField val time: Int = 0,\n            @ProtoNumber(5) @JvmField val processflag: Int = 0,\n            @ProtoNumber(6) @JvmField val sourceid: Int = 0,\n            @ProtoNumber(7) @JvmField val sourcesubid: Int = 0,\n            @ProtoNumber(8) @JvmField val strWording: List<String> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class GeneralNotify(\n            @ProtoNumber(1) @JvmField val msgType: Int = 0,\n            @ProtoNumber(2) @JvmField val msgSeq: Long = 0L\n        ) : ProtoBuf\n\n        @Serializable\n        internal class GroupSyncMsg(\n            @ProtoNumber(1) @JvmField val msgType: Int = 0,\n            @ProtoNumber(2) @JvmField val msgSeq: Long = 0L,\n            @ProtoNumber(3) @JvmField val grpCode: Long = 0L,\n            @ProtoNumber(4) @JvmField val gaCode: Long = 0L,\n            @ProtoNumber(5) @JvmField val optUin1: Long = 0L,\n            @ProtoNumber(6) @JvmField val optUin2: Long = 0L,\n            @ProtoNumber(7) @JvmField val msgBuf: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(8) @JvmField val authKey: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(9) @JvmField val msgStatus: Int = 0,\n            @ProtoNumber(10) @JvmField val actionUin: Long = 0L,\n            @ProtoNumber(11) @JvmField val actionTime: Long = 0L,\n            @ProtoNumber(12) @JvmField val curMaxMemCount: Int = 0,\n            @ProtoNumber(13) @JvmField val nextMaxMemCount: Int = 0,\n            @ProtoNumber(14) @JvmField val curMemCount: Int = 0,\n            @ProtoNumber(15) @JvmField val reqSrcId: Int = 0,\n            @ProtoNumber(16) @JvmField val reqSrcSubId: Int = 0,\n            @ProtoNumber(17) @JvmField val inviterRole: Int = 0,\n            @ProtoNumber(18) @JvmField val extAdminNum: Int = 0,\n            @ProtoNumber(19) @JvmField val processflag: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ModifySyncMsg(\n            @ProtoNumber(1) @JvmField val time: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgFriendMsgSync: FriendSyncMsg? = null,\n            @ProtoNumber(2) @JvmField val msgGroupMsgSync: GroupSyncMsg? = null,\n            @ProtoNumber(3) @JvmField val msgCleanCountMsg: ClearCountMsg? = null,\n            @ProtoNumber(4) @JvmField val msgModifyMsgSync: ModifySyncMsg? = null,\n            @ProtoNumber(5) @JvmField val msgWaitingMsgSync: WaitingSyncMsg? = null,\n            @ProtoNumber(7) @JvmField val msgDelMsgNotify: DelMsgNotify? = null,\n            @ProtoNumber(8) @JvmField val msgGeneralNotify: GeneralNotify? = null\n        ) : ProtoBuf\n\n        @Serializable\n        internal class WaitingSyncMsg(\n            @ProtoNumber(1) @JvmField val time: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x48 {\n    @Serializable\n    internal class RecommendDeviceLock(\n        @ProtoNumber(1) @JvmField val canCancel: Boolean = false,\n        @ProtoNumber(2) @JvmField val wording: String = \"\",\n        @ProtoNumber(3) @JvmField val title: String = \"\",\n        @ProtoNumber(4) @JvmField val secondTitle: String = \"\",\n        @ProtoNumber(5) @JvmField val thirdTitle: String = \"\",\n        @ProtoNumber(6) @JvmField val wordingList: List<String> = emptyList(),\n    ) : ProtoBuf\n}\n\n\ninternal class Submsgtype0x4a {\n    @Serializable\n    internal class MsgBody(\n        @ProtoNumber(1) @JvmField val secCmd: Int = 0,\n        @ProtoNumber(2) @JvmField val data: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n}\n\n\ninternal class Submsgtype0x4b {\n    @Serializable\n    internal class MsgBody(\n        @ProtoNumber(1) @JvmField val albumid: String = \"\",\n        @ProtoNumber(2) @JvmField val coverUrl: String = \"\",\n        @ProtoNumber(3) @JvmField val albumName: String = \"\",\n        @ProtoNumber(4) @JvmField val opuin: Long = 0L,\n        @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(5) @JvmField val time: Int = 0,\n        @ProtoNumber(6) @JvmField val picCnt: Int = 0,\n        @ProtoNumber(7) @JvmField val pushMsgHelper: String = \"\",\n        @ProtoNumber(8) @JvmField val pushMsgAlbum: String = \"\",\n        @ProtoNumber(9) @JvmField val usrTotal: Int = 0,\n        @ProtoNumber(10) @JvmField val uint64User: List<Long> = emptyList(),\n    ) : ProtoBuf\n\n    internal class Submsgtype0x4b : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val albumid: String = \"\",\n            @ProtoNumber(2) @JvmField val coverUrl: String = \"\",\n            @ProtoNumber(3) @JvmField val albumName: String = \"\",\n            @ProtoNumber(4) @JvmField val opuin: Long = 0L,\n            @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(5) @JvmField val time: Int = 0,\n            @ProtoNumber(6) @JvmField val picCnt: Int = 0,\n            @ProtoNumber(7) @JvmField val pushMsgHelper: String = \"\",\n            @ProtoNumber(8) @JvmField val pushMsgAlbum: String = \"\",\n            @ProtoNumber(9) @JvmField val usrTotal: Int = 0,\n            @ProtoNumber(10) @JvmField val uint64User: List<Long> = emptyList(),\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x4e {\n    internal class Submsgtype0x4e : ProtoBuf {\n        @Serializable\n        internal class GroupBulletin(\n            @ProtoNumber(1) @JvmField val msgContent: List<Content> = emptyList(),\n        ) : ProtoBuf {\n            @Serializable\n            internal class Content(\n                @ProtoNumber(1) @JvmField val feedid: ByteArray = EMPTY_BYTE_ARRAY,\n                @ProtoNumber(2) @JvmField val uin: Long = 0L,\n                @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(3) @JvmField val time: Int = 0,\n            ) : ProtoBuf\n        }\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val groupId: Long = 0L,\n            @ProtoNumber(2) @JvmField val groupCode: Long = 0L,\n            @ProtoNumber(3) @JvmField val appid: Int = 0,\n            @ProtoNumber(4) @JvmField val msgGroupBulletin: GroupBulletin? = null,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x54 {\n    internal class Submsgtype0x54 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val peerType: Int /* enum */ = 1,\n            @ProtoNumber(2) @JvmField val peerUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val taskList: List<TaskInfo> = emptyList(),\n        ) : ProtoBuf {\n            @Serializable\n            internal class TaskInfo(\n                @ProtoNumber(1) @JvmField val taskId: Int = 0,\n            ) : ProtoBuf\n        }\n    }\n}\n\n\ninternal class Submsgtype0x60 {\n    internal class SubMsgType0x60 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val pushcmd: Int = 0,\n            @ProtoNumber(2) @JvmField val int64Ts: Long = 0L,\n            @ProtoNumber(3) @JvmField val ssid: String = \"\",\n            @ProtoNumber(4) @JvmField val content: String = \"\",\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x63 {\n    internal class Submsgtype0x63 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val roomid: Long = 0L,\n            @ProtoNumber(2) @JvmField val seq: Int = 0,\n            @ProtoNumber(3) @JvmField val url: String = \"\",\n            @ProtoNumber(4) @JvmField val data: String = \"\",\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x65 {\n    internal class SubMsgType0x65 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val cmd: Int = 0,\n            @ProtoNumber(2) @JvmField val msgExpiredPkg: MsgExpiredPkg? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgExpiredPkg(\n            @ProtoNumber(1) @JvmField val platform: Int = 0,\n            @ProtoNumber(2) @JvmField val expirePkg: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val predownPkg: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x66 {\n    internal class Submsgtype0x66 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val type: Int = 0,\n            @ProtoNumber(2) @JvmField val pushData: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val timestamp: Int = 0,\n            @ProtoNumber(4) @JvmField val notifyText: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val pushFlag: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x67 {\n    internal class Submsgtype0x67 : ProtoBuf {\n        @Serializable\n        internal class GroupInfo(\n            @ProtoNumber(1) @JvmField val groupCode: Long = 0L,\n            @ProtoNumber(2) @JvmField val groupName: String = \"\",\n            @ProtoNumber(3) @JvmField val groupMemo: String = \"\",\n            @ProtoNumber(4) @JvmField val memberNum: Int = 0,\n            @ProtoNumber(5) @JvmField val groupType: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgGrpinfo: List<GroupInfo> = emptyList(),\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x69 {\n    @Serializable\n    internal class Submsgtype0x69(\n        @ProtoNumber(1) @JvmField val appid: Int = 0,\n        @ProtoNumber(2) @JvmField val boolDisplayReddot: Boolean = false,\n        @ProtoNumber(3) @JvmField val number: Int = 0,\n        @ProtoNumber(4) @JvmField val reason: Int = 0,\n        @ProtoNumber(5) @JvmField val lastTime: Int = 0,\n        @ProtoNumber(6) @JvmField val cmdUin: Long = 0L,\n        @ProtoNumber(7) @JvmField val faceUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(8) @JvmField val customBuffer: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(9) @JvmField val expireTime: Int = 0,\n        @ProtoNumber(10) @JvmField val cmdUinType: Int = 0,\n        @ProtoNumber(11) @JvmField val reportType: Int = 0,\n        @ProtoNumber(12) @JvmField val boolTestEnv: Boolean = false,\n    ) : ProtoBuf\n}\n\n\ninternal class Submsgtype0x6b {\n    internal class SubMsgType0x6b : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val toUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val tipsContent: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val yesText: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val noText: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x6f {\n    internal class SubMsgType0x6f : ProtoBuf {\n        @Serializable\n        internal class AddFriendSource(\n            @ProtoNumber(1) @JvmField val source: Int = 0,\n            @ProtoNumber(2) @JvmField val subSource: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class AddQimFriendNotifyToQQ(\n            @ProtoNumber(1) @JvmField val opType: Int = 0,\n            @ProtoNumber(2) @JvmField val uin: Long = 0L,\n            @ProtoNumber(3) @JvmField val gender: Int = 0,\n            @ProtoNumber(4) @JvmField val smartRemark: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val longnick: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val storysTotalNum: Long = 0L,\n            @ProtoNumber(7) @JvmField val caresCount: Long = 0L,\n            @ProtoNumber(8) @JvmField val fansCount: Long = 0L,\n            @ProtoNumber(9) @JvmField val wording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(10) @JvmField val srcWording: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class AddQimNotLoginFrdNotifyToQQ(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val nick: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val gender: Int = 0,\n            @ProtoNumber(4) @JvmField val age: Int = 0,\n            @ProtoNumber(5) @JvmField val coverstory: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val storysTotalNum: Long = 0L,\n            @ProtoNumber(7) @JvmField val msgVideoInfo: List<VideoInfo> = emptyList(),\n            @ProtoNumber(8) @JvmField val wording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(9) @JvmField val qqUin: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class BirthdayReminderPush(\n            @ProtoNumber(2004) @JvmField val reminderWording: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class FanpaiziNotify(\n            @ProtoNumber(1) @JvmField val fromUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val fromNick: String = \"\",\n            @ProtoNumber(3) @JvmField val tipsContent: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ForwardBody(\n            @ProtoNumber(1) @JvmField val notifyType: Int = 0,\n            @ProtoNumber(2) @JvmField val opType: Int = 0,\n            @ProtoNumber(2000) @JvmField val msgFanpanziNotify: FanpaiziNotify? = null,\n            @ProtoNumber(2001) @JvmField val msgMcardNotificationLike: MCardNotificationLike? = null,\n            @ProtoNumber(2002) @JvmField val msgVipInfoNotify: VipInfoNotify? = null,\n            @ProtoNumber(2003) @JvmField val msgPushLostDevFound: PushLostDevFound? = null,\n            @ProtoNumber(2004) @JvmField val msgBirthdayReminderPush: BirthdayReminderPush? = null,\n            @ProtoNumber(2005) @JvmField val msgPushLostDev: PushLostDevFound? = null,\n            @ProtoNumber(2007) @JvmField val msgBabyqRewardInfo: RewardInfo? = null,\n            @ProtoNumber(2008) @JvmField val msgHotFriendNotify: HotFriendNotify? = null,\n            @ProtoNumber(2009) @JvmField val msgPushQimRecommend: QimRecomendMsg? = null,\n            @ProtoNumber(2010) @JvmField val msgModQimFriend: QimFriendNotify? = null,\n            @ProtoNumber(2011) @JvmField val msgModQimFriendToQq: QimFriendNotifyToQQ? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class GPS(\n            @ProtoNumber(1) @JvmField val int32Lat: Int = 900000000,\n            @ProtoNumber(2) @JvmField val int32Lon: Int = 900000000,\n            @ProtoNumber(3) @JvmField val int32Alt: Int = -10000000,\n            @ProtoNumber(4) @JvmField val int32Type: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class HotFriendNotify(\n            @ProtoNumber(1) @JvmField val dstUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val praiseHotLevel: Int = 0,\n            @ProtoNumber(3) @JvmField val chatHotLevel: Int = 0,\n            @ProtoNumber(4) @JvmField val praiseHotDays: Int = 0,\n            @ProtoNumber(5) @JvmField val chatHotDays: Int = 0,\n            @ProtoNumber(6) @JvmField val closeLevel: Int = 0,\n            @ProtoNumber(7) @JvmField val closeDays: Int = 0,\n            @ProtoNumber(8) @JvmField val praiseFlag: Int = 0,\n            @ProtoNumber(9) @JvmField val chatFlag: Int = 0,\n            @ProtoNumber(10) @JvmField val closeFlag: Int = 0,\n            @ProtoNumber(11) @JvmField val notifyTime: Long = 0L,\n            @ProtoNumber(12) @JvmField val lastPraiseTime: Long = 0L,\n            @ProtoNumber(13) @JvmField val lastChatTime: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MCardNotificationLike(\n            @ProtoNumber(1) @JvmField val fromUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val counterTotal: Int = 0,\n            @ProtoNumber(3) @JvmField val counterNew: Int = 0,\n            @ProtoNumber(4) @JvmField val wording: String = \"\",\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgModInfos: List<ForwardBody> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class PushLostDevFound(\n            @ProtoNumber(1) @JvmField val msgType: Int = 0,\n            @ProtoNumber(3) @JvmField val devTime: Int = 0,\n            @ProtoNumber(6) @JvmField val din: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class QimFriendNotify(\n            @ProtoNumber(1) @JvmField val opType: Int = 0,\n            @ProtoNumber(2) @JvmField val uint64Uins: List<Long> = emptyList(),\n            @ProtoNumber(3) @JvmField val fansUnreadCount: Long = 0L,\n            @ProtoNumber(4) @JvmField val fansTotalCount: Long = 0L,\n            @ProtoNumber(5) @JvmField val pushTime: Long = 0L,\n            @ProtoNumber(6) @JvmField val bytesMobiles: List<ByteArray> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class QimFriendNotifyToQQ(\n            @ProtoNumber(1) @JvmField val notifyType: Int = 0,\n            @ProtoNumber(2) @JvmField val msgAddNotifyToQq: AddQimFriendNotifyToQQ? = null,\n            @ProtoNumber(3) @JvmField val msgUpgradeNotify: UpgradeQimFriendNotify? = null,\n            @ProtoNumber(4) @JvmField val msgAddNotLoginFrdNotifyToQq: AddQimNotLoginFrdNotifyToQQ? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class QimRecomendInfo(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val name: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val reason: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val gender: Int = 0,\n            @ProtoNumber(5) @JvmField val longnick: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val alghbuff: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(7) @JvmField val age: Int = 0,\n            @ProtoNumber(8) @JvmField val source: Int = 0,\n            @ProtoNumber(9) @JvmField val sourceReason: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(10) @JvmField val msgIosSource: AddFriendSource? = null,\n            @ProtoNumber(11) @JvmField val msgAndroidSource: AddFriendSource? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class QimRecomendMsg(\n            @ProtoNumber(1) @JvmField val msgRecomendList: List<QimRecomendInfo> = emptyList(),\n            @ProtoNumber(2) @JvmField val timestamp: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class RewardInfo(\n            @ProtoNumber(1) @JvmField val type: Int = 0,\n            @ProtoNumber(2) @JvmField val name: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val jmpUrl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val cookies: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val jmpWording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val optWording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(7) @JvmField val optUrl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(8) @JvmField val faceAddonId: Long = 0L,\n            @ProtoNumber(9) @JvmField val iconUrl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(10) @JvmField val toastWording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(11) @JvmField val reportType: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class UpgradeQimFriendNotify(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val wording: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class VideoInfo(\n            @ProtoNumber(1) @JvmField val vid: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val videoCoverUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class VipInfoNotify(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val vipLevel: Int = 0,\n            @ProtoNumber(3) @JvmField val vipIdentify: Int = 0,\n            @ProtoNumber(4) @JvmField val ext: Int = 0,\n            @ProtoNumber(5) @JvmField val extString: String = \"\",\n            @ProtoNumber(6) @JvmField val redFlag: Int = 0,\n            @ProtoNumber(7) @JvmField val disableRedEnvelope: Int = 0,\n            @ProtoNumber(8) @JvmField val redpackId: Int = 0,\n            @ProtoNumber(9) @JvmField val redpackName: String = \"\",\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x71 {\n    internal class Submsgtype0x71 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgAppInfo: List<ReportAppInfo> = emptyList(),\n            @ProtoNumber(2) @JvmField val uiUin: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class RedDisplayInfo(\n            @ProtoNumber(1) @JvmField val msgRedTypeInfo: List<RedTypeInfo> = emptyList(),\n            @ProtoNumber(2) @JvmField val msgTabDisplayInfo: RedTypeInfo? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class RedTypeInfo(\n            @ProtoNumber(1) @JvmField val redType: Int = 0,\n            @ProtoNumber(2) @JvmField val redContent: String = \"\",\n            @ProtoNumber(3) @JvmField val redDesc: String = \"\",\n            @ProtoNumber(4) @JvmField val redPriority: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ReportAppInfo(\n            @ProtoNumber(1) @JvmField val appId: Int = 0,\n            @ProtoNumber(2) @JvmField val int32NewFlag: Int = 0,\n            @ProtoNumber(3) @JvmField val type: Int = 0,\n            @ProtoNumber(4) @JvmField val buffer: String = \"\",\n            @ProtoNumber(5) @JvmField val path: String = \"\",\n            @ProtoNumber(6) @JvmField val pushRedTs: Int = 0,\n            @ProtoNumber(7) @JvmField val mission: String = \"\",\n            @ProtoNumber(8) @JvmField val int32Appset: Int = 0,\n            @ProtoNumber(9) @JvmField val int32Num: Int = 0,\n            @ProtoNumber(10) @JvmField val iconUrl: String = \"\",\n            @ProtoNumber(11) @JvmField val int32IconFlag: Int = 0,\n            @ProtoNumber(12) @JvmField val int32IconType: Int = 0,\n            @ProtoNumber(13) @JvmField val duration: Int = 0,\n            @ProtoNumber(14) @JvmField val msgVersionInfo: ReportVersion? = null,\n            @ProtoNumber(15) @JvmField val androidAppId: Int = 0,\n            @ProtoNumber(16) @JvmField val iosAppId: Int = 0,\n            @ProtoNumber(17) @JvmField val androidPath: String = \"\",\n            @ProtoNumber(18) @JvmField val iosPath: String = \"\",\n            @ProtoNumber(19) @JvmField val int32MissionLevel: Int = 0,\n            @ProtoNumber(20) @JvmField val msgDisplayDesc: RedDisplayInfo? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ReportVersion(\n            @ProtoNumber(1) @JvmField val int32PlantId: Int = 0,\n            @ProtoNumber(2) @JvmField val boolAllver: Boolean = false,\n            @ProtoNumber(3) @JvmField val strVersion: List<String> = emptyList(),\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x72 {\n    internal class SubMsgType0x72 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val subCmd: Int = 0,\n            @ProtoNumber(2) @JvmField val urgency: Int = 0,\n            @ProtoNumber(3) @JvmField val templateNo: Int = 0,\n            @ProtoNumber(4) @JvmField val content: String = \"\",\n            @ProtoNumber(5) @JvmField val infoDate: String = \"\",\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x76 {\n    internal class SubMsgType0x76 : ProtoBuf {\n        @Serializable\n        internal class BirthdayNotify(\n            @ProtoNumber(1) @JvmField val msgOneFriend: List<OneBirthdayFriend> = emptyList(),\n            @ProtoNumber(2) @JvmField val reserved: Int = 0,\n            @ProtoNumber(3) @JvmField val giftMsg: List<OneGiftMessage> = emptyList(),\n            @ProtoNumber(4) @JvmField val topPicUrl: String = \"\",\n            @ProtoNumber(5) @JvmField val extend: String = \"\",\n        ) : ProtoBuf\n\n        @Serializable\n        internal class GeoGraphicNotify(\n            @ProtoNumber(1) @JvmField val localCity: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val msgOneFriend: List<OneGeoGraphicFriend> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MemorialDayNotify(\n            @ProtoNumber(1) @JvmField val anniversaryInfo: List<OneMemorialDayInfo> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgType: Int = 0,\n            @ProtoNumber(2) @JvmField val boolStrongNotify: Boolean = false,\n            @ProtoNumber(3) @JvmField val pushTime: Int = 0,\n            @ProtoNumber(4) @JvmField val msgGeographicNotify: GeoGraphicNotify? = null,\n            @ProtoNumber(5) @JvmField val msgBirthdayNotify: BirthdayNotify? = null,\n            @ProtoNumber(6) @JvmField val notifyWording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(7) @JvmField val msgMemorialdayNotify: MemorialDayNotify? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class OneBirthdayFriend(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val boolLunarBirth: Boolean = false,\n            @ProtoNumber(3) @JvmField val birthMonth: Int = 0,\n            @ProtoNumber(4) @JvmField val birthDate: Int = 0,\n            @ProtoNumber(5) @JvmField val msgSendTime: Long = 0L,\n            @ProtoNumber(6) @JvmField val birthYear: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class OneGeoGraphicFriend(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class OneGiftMessage(\n            @ProtoNumber(1) @JvmField val giftId: Int = 0,\n            @ProtoNumber(2) @JvmField val giftName: String = \"\",\n            @ProtoNumber(3) @JvmField val type: Int = 0,\n            @ProtoNumber(4) @JvmField val giftUrl: String = \"\",\n            @ProtoNumber(5) @JvmField val price: Int = 0,\n            @ProtoNumber(6) @JvmField val playCnt: Int = 0,\n            @ProtoNumber(7) @JvmField val backgroundColor: String = \"\",\n        ) : ProtoBuf\n\n        @Serializable\n        internal class OneMemorialDayInfo(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val type: Long = 0,\n            @ProtoNumber(3) @JvmField val memorialTime: Int = 0,\n            @ProtoNumber(11) @JvmField val mainWordingNick: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(12) @JvmField val mainWordingEvent: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(13) @JvmField val subWording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(14) @JvmField val greetings: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(15) @JvmField val friendGender: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x78 {\n    internal class Submsgtype0x78 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val type: Int = 0,\n            @ProtoNumber(2) @JvmField val version: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x7a {\n    internal class Submsgtype0x7a : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val content: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val fromUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val nick: String = \"\",\n            @ProtoNumber(4) @JvmField val discussUin: Long = 0L,\n            @ProtoNumber(5) @JvmField val discussNick: String = \"\",\n            @ProtoNumber(6) @JvmField val seq: Long = 0L,\n            @ProtoNumber(7) @JvmField val atTime: Long = 0L,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x7c {\n    internal class Submsgtype0x7c : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val int32Cmd: Int = 0,\n            @ProtoNumber(3) @JvmField val stringCmdExt: List<String> = emptyList(),\n            @ProtoNumber(4) @JvmField val seq: Long = 0L,\n            @ProtoNumber(5) @JvmField val stringSeqExt: List<String> = emptyList(),\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x7e {\n    internal class Submsgtype0x7e : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val notice: String = \"\",\n            @ProtoNumber(2) @JvmField val msgOnlinePush: WalletMsgPush? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class WalletMsgPush(\n            @ProtoNumber(1) @JvmField val action: Int = 0,\n            @ProtoNumber(2) @JvmField val timestamp: Int = 0,\n            @ProtoNumber(3) @JvmField val extend: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val serialno: String = \"\",\n            @ProtoNumber(5) @JvmField val billno: String = \"\",\n            @ProtoNumber(6) @JvmField val appinfo: String = \"\",\n            @ProtoNumber(7) @JvmField val amount: Int = 0,\n            @ProtoNumber(8) @JvmField val jumpurl: String = \"\",\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x83 {\n    internal class SubMsgType0x83 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgParams: List<MsgParams> = emptyList(),\n            @ProtoNumber(2) @JvmField val seq: Long = 0L,\n            @ProtoNumber(3) @JvmField val groupId: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgParams(\n            @ProtoNumber(1) @JvmField val type: Int = 0,\n            @ProtoNumber(2) @JvmField val fromUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val toUin: Long = 0L,\n            @ProtoNumber(4) @JvmField val dataString: String = \"\",\n            @ProtoNumber(5) @JvmField val data: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        internal class MsgRep : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x85 {\n    internal class SubMsgType0x85 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val showLastest: Int = 0,\n            @ProtoNumber(2) @JvmField val senderUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val receiverUin: Long = 0L,\n            @ProtoNumber(4) @JvmField val senderRichContent: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val receiverRichContent: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val authkey: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(7) @JvmField val pcBody: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(8) @JvmField val icon: Int = 0,\n            @ProtoNumber(9) @JvmField val random: Int = 0,\n            @ProtoNumber(10) @JvmField val redSenderUin: Long = 0L,\n            @ProtoNumber(11) @JvmField val type: Int = 0,\n            @ProtoNumber(12) @JvmField val subType: Int = 0,\n            @ProtoNumber(13) @JvmField val jumpurl: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x86 {\n    internal class SubMsgType0x86 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val notifyFlag: Int = 0,\n            @ProtoNumber(2) @JvmField val notifyWording: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x87 {\n    internal class SubMsgType0x87 : ProtoBuf {\n        @Serializable\n        internal class CloneInfo(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val remark: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val originNick: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val showInAio: Int = 0,\n            @ProtoNumber(5) @JvmField val toUin: Long = 0L,\n            @ProtoNumber(6) @JvmField val toNick: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(7) @JvmField val srcGender: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val friendMsgTypeFlag: Long = 0L,\n            @ProtoNumber(2) @JvmField val msgMsgNotify: List<MsgNotify> = emptyList(),\n            @ProtoNumber(3) @JvmField val msgMsgNotifyUnread: MsgNotifyUnread? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgNotify(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val fuin: Long = 0L,\n            @ProtoNumber(3) @JvmField val time: Int = 0,\n            @ProtoNumber(4) @JvmField val reqsubtype: Int = 0,\n            @ProtoNumber(5) @JvmField val maxCount: Int = 0,\n            @ProtoNumber(6) @JvmField val msgCloneInfo: CloneInfo? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgNotifyUnread(\n            @ProtoNumber(1) @JvmField val unreadcount: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x89 {\n    internal class Submsgtype0x89 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val uiUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val pushRedTs: Int = 0,\n            @ProtoNumber(3) @JvmField val msgNumRed: List<NumRedBusiInfo> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class NumRedBusiInfo(\n            @ProtoNumber(1) @JvmField val clientVerBegin: String = \"\",\n            @ProtoNumber(2) @JvmField val clientVerEnd: String = \"\",\n            @ProtoNumber(3) @JvmField val platId: Int = 0,\n            @ProtoNumber(4) @JvmField val appId: Int = 0,\n            @ProtoNumber(5) @JvmField val androidAppId: Int = 0,\n            @ProtoNumber(6) @JvmField val iosAppId: Int = 0,\n            @ProtoNumber(7) @JvmField val path: String = \"\",\n            @ProtoNumber(8) @JvmField val androidPath: String = \"\",\n            @ProtoNumber(9) @JvmField val iosPath: String = \"\",\n            @ProtoNumber(10) @JvmField val missionid: String = \"\",\n            @ProtoNumber(11) @JvmField val msgid: Long = 0L,\n            @ProtoNumber(12) @JvmField val status: Int = 0,\n            @ProtoNumber(13) @JvmField val expireTime: Int = 0,\n            @ProtoNumber(14) @JvmField val int32Appset: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x8d {\n    internal class SubMsgType0x8d : ProtoBuf {\n        @Serializable\n        internal class ChannelNotify(\n            @ProtoNumber(1) @JvmField val channelId: Long = 0L,\n            @ProtoNumber(2) @JvmField val channelName: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val wording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val topArticleIdList: List<Long> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class CommentFeeds(\n            @ProtoNumber(1) @JvmField val feedsOwner: Long = 0L,\n            @ProtoNumber(2) @JvmField val feedsId: Long = 0L,\n            @ProtoNumber(3) @JvmField val commentUin: Long = 0L,\n            @ProtoNumber(4) @JvmField val commentId: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val replyUin: Long = 0L,\n            @ProtoNumber(6) @JvmField val replyId: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(7) @JvmField val commentInfo: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(8) @JvmField val feedsSubject: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class DeleteComment(\n            @ProtoNumber(1) @JvmField val feedsOwner: Long = 0L,\n            @ProtoNumber(2) @JvmField val feedsId: Long = 0L,\n            @ProtoNumber(3) @JvmField val commentUin: Long = 0L,\n            @ProtoNumber(4) @JvmField val commentId: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val replyUin: Long = 0L,\n            @ProtoNumber(6) @JvmField val replyId: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(7) @JvmField val deleteUin: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class DeleteFeeds(\n            @ProtoNumber(1) @JvmField val feedsOwner: Long = 0L,\n            @ProtoNumber(2) @JvmField val feedsId: Long = 0L,\n            @ProtoNumber(3) @JvmField val deleteUin: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class LikeFeeds(\n            @ProtoNumber(1) @JvmField val feedsOwner: Long = 0L,\n            @ProtoNumber(2) @JvmField val feedsId: Long = 0L,\n            @ProtoNumber(3) @JvmField val likeUin: Long = 0L,\n            @ProtoNumber(4) @JvmField val feedsSubject: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgNotifyInfos: List<NotifyBody> = emptyList(),\n            @ProtoNumber(2) @JvmField val redSpotNotifyBody: RedSpotNotifyBody? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class NotifyBody(\n            @ProtoNumber(1) @JvmField val notifyType: Int = 0,\n            @ProtoNumber(2) @JvmField val seq: Int = 0,\n            @ProtoNumber(3) @JvmField val pushTime: Int = 0,\n            @ProtoNumber(10) @JvmField val msgPublishFeeds: PublishFeeds? = null,\n            @ProtoNumber(11) @JvmField val msgCommentFeeds: CommentFeeds? = null,\n            @ProtoNumber(12) @JvmField val msgLikeFeeds: LikeFeeds? = null,\n            @ProtoNumber(13) @JvmField val msgDeleteFeeds: DeleteFeeds? = null,\n            @ProtoNumber(14) @JvmField val msgDeleteComment: DeleteComment? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class PublishFeeds(\n            @ProtoNumber(1) @JvmField val feedsOwner: Long = 0L,\n            @ProtoNumber(2) @JvmField val feedsId: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class RedSpotNotifyBody(\n            @ProtoNumber(1) @JvmField val time: Int = 0,\n            @ProtoNumber(2) @JvmField val newChannelList: List<Long> = emptyList(),\n            @ProtoNumber(3) @JvmField val guideWording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val msgChannelNotify: ChannelNotify? = null,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x8f {\n    internal class Submsgtype0x8f : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgSourceId: SourceID? = null,\n            @ProtoNumber(2) @JvmField val feedsId: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val enumMsgType: Int /* enum */ = 1,\n            @ProtoNumber(4) @JvmField val extMsg: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val authorUin: Long = 0L,\n            @ProtoNumber(6) @JvmField val confirmUin: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class SourceID(\n            @ProtoNumber(1) @JvmField val sourceType: Int = 0,\n            @ProtoNumber(2) @JvmField val sourceCode: Long = 0L,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x90 {\n    internal class SubMsgType0x90 : ProtoBuf {\n        @Serializable\n        internal class DpNotifyMsgBdoy(\n            @ProtoNumber(1) @JvmField val pid: Int = 0,\n            @ProtoNumber(2) @JvmField val din: Long = 0L,\n            @ProtoNumber(3) @JvmField val msgNotifyInfo: List<NotifyItem> = emptyList(),\n            @ProtoNumber(4) @JvmField val extendInfo: String = \"\",\n        ) : ProtoBuf\n\n        @Serializable\n        internal class Head(\n            @ProtoNumber(1) @JvmField val cmd: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgHead: Head? = null,\n            @ProtoNumber(2) @JvmField val msgBody: PushBody? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class NotifyItem(\n            @ProtoNumber(1) @JvmField val propertyid: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class OccupyMicrophoneNotifyMsgBody(\n            @ProtoNumber(1) @JvmField val uin: Int = 0,\n            @ProtoNumber(2) @JvmField val din: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class PushBody(\n            @ProtoNumber(1) @JvmField val msgDpNotifyBody: DpNotifyMsgBdoy? = null,\n            @ProtoNumber(2) @JvmField val msgOccupyMicrophoneBody: OccupyMicrophoneNotifyMsgBody? = null,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x92 {\n    internal class SubMsgType0x92 : ProtoBuf {\n        @Serializable\n        internal class CrmS2CMsgHead(\n            @ProtoNumber(1) @JvmField val crmSubCmd: Int = 0,\n            @ProtoNumber(2) @JvmField val headLen: Int = 0,\n            @ProtoNumber(3) @JvmField val verNo: Int = 0,\n            @ProtoNumber(4) @JvmField val kfUin: Long = 0L,\n            @ProtoNumber(5) @JvmField val seq: Int = 0,\n            @ProtoNumber(6) @JvmField val packNum: Int = 0,\n            @ProtoNumber(7) @JvmField val curPack: Int = 0,\n            @ProtoNumber(8) @JvmField val bufSig: String = \"\",\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val subCmd: Int = 0,\n            @ProtoNumber(2) @JvmField val msgCrmCommonHead: CrmS2CMsgHead? = null,\n            @ProtoNumber(100) @JvmField val msgPushEmanMsg: S2CPushEmanMsgToC? = null,\n        ) : ProtoBuf {\n            @Serializable\n            internal class S2CPushEmanMsgToC(\n                @ProtoNumber(1) @JvmField val uin: Long = 0L,\n                @ProtoNumber(2) @JvmField val xml: String = \"\",\n            ) : ProtoBuf\n        }\n    }\n}\n\n\ninternal class Submsgtype0x93 {\n    internal class Submsgtype0x93 : ProtoBuf {\n        @Serializable\n        internal class LiteMailIndexInfo(\n            @ProtoNumber(1) @JvmField val feedsId: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val msgSourceId: SourceID? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgType: Int = 0,\n            @ProtoNumber(2) @JvmField val msgUmcChanged: UnreadMailCountChanged? = null,\n            @ProtoNumber(3) @JvmField val msgStateChanged: StateChangeNotify? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class SourceID(\n            @ProtoNumber(1) @JvmField val sourceType: Int = 0,\n            @ProtoNumber(2) @JvmField val sourceCode: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class StateChangeNotify(\n            @ProtoNumber(1) @JvmField val msgSourceId: SourceID? = null,\n            @ProtoNumber(2) @JvmField val feedsId: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val enumMsgType: Int /* enum */ = 1,\n            @ProtoNumber(4) @JvmField val extMsg: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val reqUin: Long = 0L,\n            @ProtoNumber(6) @JvmField val msgLiteMailIndex: List<LiteMailIndexInfo> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class UnreadMailCountChanged(\n            @ProtoNumber(1) @JvmField val msgUmc: UnreadMailCountInfo? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class UnreadMailCountInfo(\n            @ProtoNumber(1) @JvmField val unreadCount: Int = 0,\n            @ProtoNumber(2) @JvmField val dataVersion: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x94 {\n    internal class Submsgtype0x94 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val taskId: Int = 0,\n            @ProtoNumber(2) @JvmField val folderReddotFlag: Int = 0,\n            @ProtoNumber(3) @JvmField val discoverReddotFlag: Int = 0,\n            @ProtoNumber(4) @JvmField val startTs: Int = 0,\n            @ProtoNumber(5) @JvmField val endTs: Int = 0,\n            @ProtoNumber(6) @JvmField val periodOfValidity: Int = 0,\n            @ProtoNumber(7) @JvmField val folderMsg: String = \"\",\n            @ProtoNumber(8) @JvmField val discountReddotFlag: Int = 0,\n            @ProtoNumber(9) @JvmField val nearbyReddotFlag: Int = 0,\n            @ProtoNumber(10) @JvmField val mineReddotFlag: Int = 0,\n            @ProtoNumber(11) @JvmField val onlyDiscoverReddotFlag: Int = 0,\n            @ProtoNumber(12) @JvmField val onlyDiscountReddotFlag: Int = 0,\n            @ProtoNumber(13) @JvmField val onlyNearbyReddotFlag: Int = 0,\n            @ProtoNumber(14) @JvmField val onlyMineReddotFlag: Int = 0,\n            @ProtoNumber(15) @JvmField val taskType: Int = 0,\n            @ProtoNumber(16) @JvmField val taskInfo: String = \"\",\n            @ProtoNumber(17) @JvmField val typeName: String = \"\",\n            @ProtoNumber(18) @JvmField val typeColor: String = \"\",\n            @ProtoNumber(19) @JvmField val jumpUrl: String = \"\",\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x96 {\n    internal class Submsgtype0x96 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val pushMsg: String = \"\",\n            @ProtoNumber(2) @JvmField val pushType: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x97 {\n    internal class Submsgtype0x97 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val businessUin: String = \"\",\n            @ProtoNumber(2) @JvmField val jsonContext: String = \"\",\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x98 {\n    internal class Submsgtype0x98 : ProtoBuf {\n        @Serializable\n        internal class ModBlock(\n            @ProtoNumber(1) @JvmField val op: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val subCmd: Int = 0,\n            @ProtoNumber(3) @JvmField val msgModBlock: ModBlock? = null,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x9b {\n    internal class SubMsgType0x9b : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val appId: Long = 0L,\n            @ProtoNumber(2) @JvmField val mainType: Int = 0,\n            @ProtoNumber(3) @JvmField val subType: Int = 0,\n            @ProtoNumber(4) @JvmField val extMsg: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val workflowId: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class PbOfficeNotify(\n            @ProtoNumber(1) @JvmField val optUint32MyofficeFlag: Int = 0,\n            @ProtoNumber(2) @JvmField val uint64Appid: List<Long> = emptyList(),\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x9d {\n    internal class SubMsgType0x9d : ProtoBuf {\n        @Serializable\n        internal class ModuleUpdateNotify(\n            @ProtoNumber(1) @JvmField val moduleId: Int = 0,\n            @ProtoNumber(2) @JvmField val moduleVersion: Int = 0,\n            @ProtoNumber(3) @JvmField val moduleState: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val subCmd: Int = 0,\n            @ProtoNumber(2) @JvmField val lolaModuleUpdate: List<ModuleUpdateNotify> = emptyList(),\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x9e {\n    internal class SubmsgType0x9e : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val type: Int = 0,\n            @ProtoNumber(2) @JvmField val wording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val url: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val authKey: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0x9f {\n    @Serializable\n    internal class MsgBody(\n        @ProtoNumber(1) @JvmField val showLastest: Int = 0,\n        @ProtoNumber(2) @JvmField val senderUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val receiverUin: Long = 0L,\n        @ProtoNumber(4) @JvmField val senderRichContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val receiverRichContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val authkey: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoType(ProtoIntegerType.SIGNED) @ProtoNumber(7) @JvmField val sint32Sessiontype: Int = 0,\n        @ProtoNumber(8) @JvmField val groupUin: Long = 0L,\n    ) : ProtoBuf\n}\n\n\ninternal class Submsgtype0xa0 {\n    internal class Submsgtype0xa0 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val isMassBlessOpen: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xa1 {\n    internal class Submsgtype0xa1 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val subCmd: Int = 0,\n            @ProtoNumber(2) @JvmField val qid: Long = 0L,\n            @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(3) @JvmField val fixed32UpdateTime: Int = 0,\n            @ProtoNumber(4) @JvmField val teamCreatedDestroied: Int = 0,\n            @ProtoNumber(5) @JvmField val uint64OfficeFaceChangedUins: List<Long> = emptyList(),\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xa2 {\n    @Serializable\n    internal class MsgBody(\n        @ProtoNumber(1) @JvmField val showLastest: Int = 0,\n        @ProtoNumber(2) @JvmField val senderUin: Long = 0L,\n        @ProtoNumber(3) @JvmField val receiverUin: Long = 0L,\n        @ProtoNumber(4) @JvmField val senderRichContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(5) @JvmField val receiverRichContent: ByteArray = EMPTY_BYTE_ARRAY,\n        @ProtoNumber(6) @JvmField val authkey: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n}\n\n\ninternal class Submsgtype0xa4 {\n    internal class Submsgtype0xa4 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val title: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val brief: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val url: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xa8 {\n    internal class SubMsgType0xa8 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val actionType: Int = 0,\n            @ProtoNumber(2) @JvmField val actionSubType: Int = 0,\n            @ProtoNumber(3) @JvmField val msgSummary: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val extendContent: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xaa {\n    internal class SubMsgType0xaa : ProtoBuf {\n        @Serializable\n        internal class GameTeamMsgBody(\n            @ProtoNumber(1) @JvmField val gameTeamCmd: Int = 0,\n            @ProtoNumber(2) @JvmField val msgTurnOverMessage: GameTeamTurnOverMessage? = null,\n            @ProtoNumber(3) @JvmField val msgStartGameMessage: GameTeamStartGameMessage? = null,\n            @ProtoNumber(4) @JvmField val msgUpdateTeamMessage: GameTeamUpdateTeamMessage? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class GameTeamStartGameMessage(\n            @ProtoNumber(1) @JvmField val gamedata: String = \"\",\n            @ProtoNumber(2) @JvmField val platformType: Int = 0,\n            @ProtoNumber(3) @JvmField val title: String = \"\",\n            @ProtoNumber(4) @JvmField val summary: String = \"\",\n            @ProtoNumber(5) @JvmField val picUrl: String = \"\",\n            @ProtoNumber(6) @JvmField val appid: String = \"\",\n            @ProtoNumber(7) @JvmField val appStoreId: String = \"\",\n            @ProtoNumber(8) @JvmField val packageName: String = \"\",\n            @ProtoNumber(9) @JvmField val createMsgTime: Long = 0L,\n            @ProtoNumber(10) @JvmField val expire: Int = 0,\n            @ProtoNumber(11) @JvmField val buildTeamTime: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class GameTeamTurnOverMessage(\n            @ProtoNumber(1) @JvmField val teamId: String = \"\",\n            @ProtoNumber(2) @JvmField val sessionType: Int = 0,\n            @ProtoNumber(3) @JvmField val sourceUin: String = \"\",\n            @ProtoNumber(4) @JvmField val actionUin: String = \"\",\n            @ProtoNumber(5) @JvmField val actionType: Int = 0,\n            @ProtoNumber(6) @JvmField val currentCount: Int = 0,\n            @ProtoNumber(7) @JvmField val totalCount: Int = 0,\n            @ProtoNumber(8) @JvmField val createMsgTime: Long = 0L,\n            @ProtoNumber(9) @JvmField val status: Int = 0,\n            @ProtoNumber(10) @JvmField val expire: Int = 0,\n            @ProtoNumber(11) @JvmField val buildTeamTime: Long = 0L,\n            @ProtoNumber(12) @JvmField val leaderUin: String = \"\",\n            @ProtoNumber(13) @JvmField val uin32LeaderStatus: Int = 0,\n            @ProtoNumber(14) @JvmField val inviteSourceList: List<InviteSource> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class GameTeamUpdateTeamMessage(\n            @ProtoNumber(1) @JvmField val teamId: String = \"\",\n            @ProtoNumber(2) @JvmField val gameId: String = \"\",\n            @ProtoNumber(3) @JvmField val status: Int = 0,\n            @ProtoNumber(4) @JvmField val modeImg: String = \"\",\n            @ProtoNumber(5) @JvmField val currentCount: Int = 0,\n            @ProtoNumber(6) @JvmField val createMsgTime: Long = 0L,\n            @ProtoNumber(7) @JvmField val expire: Int = 0,\n            @ProtoNumber(8) @JvmField val buildTeamTime: Long = 0L,\n            @ProtoNumber(9) @JvmField val leaderUin: String = \"\",\n            @ProtoNumber(10) @JvmField val uin32LeaderStatus: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class InviteSource(\n            @ProtoNumber(1) @JvmField val type: Int = 0,\n            @ProtoNumber(2) @JvmField val src: String = \"\",\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val cmd: Int = 0,\n            @ProtoNumber(2) @JvmField val msgGameTeamMsg: GameTeamMsgBody? = null,\n            @ProtoNumber(3) @JvmField val msgOnlineDocMsg: OnlineDocMsgBody? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class OnlineDocMsgBody(\n            @ProtoNumber(1) @JvmField val onlineDocCmd: Int = 0,\n            @ProtoNumber(2) @JvmField val msgPushChangeTitleMessage: OnlineDocPushChangeTitleMessage? = null,\n            @ProtoNumber(3) @JvmField val msgPushNewPadMessage: OnlineDocPushNewPadMessage? = null,\n            @ProtoNumber(4) @JvmField val msgPushPreviewToEdit: OnlineDocPushPreviewToEditMessage? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class OnlineDocPushChangeTitleMessage(\n            @ProtoNumber(1) @JvmField val domainid: Int = 0,\n            @ProtoNumber(2) @JvmField val localpadid: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val title: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val lastEditorUin: Long = 0L,\n            @ProtoNumber(5) @JvmField val lastEditorNick: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val lastEditTime: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class OnlineDocPushNewPadMessage(\n            @ProtoNumber(1) @JvmField val padUrl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val type: Int = 0,\n            @ProtoNumber(3) @JvmField val title: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val createTime: Long = 0L,\n            @ProtoNumber(5) @JvmField val creatorUin: Long = 0L,\n            @ProtoNumber(6) @JvmField val creatorNick: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(7) @JvmField val lastEditorUin: Long = 0L,\n            @ProtoNumber(8) @JvmField val lastEditorNick: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(9) @JvmField val lastEditTime: Long = 0L,\n            @ProtoNumber(10) @JvmField val boolPinnedFlag: Boolean = false,\n            @ProtoNumber(11) @JvmField val lastViewerUin: Long = 0L,\n            @ProtoNumber(12) @JvmField val lastViewerNick: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(13) @JvmField val lastViewTime: Long = 0L,\n            @ProtoNumber(14) @JvmField val lastPinnedTime: Long = 0L,\n            @ProtoNumber(15) @JvmField val currentUserBrowseTime: Long = 0L,\n            @ProtoNumber(16) @JvmField val hostuserUin: Long = 0L,\n            @ProtoNumber(17) @JvmField val hostuserNick: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(18) @JvmField val lastAuthTime: Long = 0L,\n            @ProtoNumber(19) @JvmField val policy: Int = 0,\n            @ProtoNumber(20) @JvmField val rightFlag: Int = 0,\n            @ProtoNumber(21) @JvmField val domainid: Int = 0,\n            @ProtoNumber(22) @JvmField val localpadid: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(23) @JvmField val lastUnpinnedTime: Long = 0L,\n            @ProtoNumber(24) @JvmField val boolDeleteFlag: Boolean = false,\n            @ProtoNumber(25) @JvmField val lastDeleteTime: Long = 0L,\n            @ProtoNumber(26) @JvmField val thumbUrl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(27) @JvmField val pdid: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class OnlineDocPushPreviewToEditMessage(\n            @ProtoNumber(1) @JvmField val version: Int = 0,\n            @ProtoNumber(2) @JvmField val title: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val padUrl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val aioSession: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xab {\n    internal class SubMsgType0xab : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val gc: Long = 0L,\n            @ProtoNumber(3) @JvmField val rewardId: String = \"\",\n            @ProtoNumber(4) @JvmField val rewardStatus: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xae {\n    internal class SubMsgType0xae : ProtoBuf {\n        @Serializable\n        internal class AddFriendSource(\n            @ProtoNumber(1) @JvmField val source: Int = 0,\n            @ProtoNumber(2) @JvmField val subSource: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val type: Int = 0,\n            @ProtoNumber(2) @JvmField val msgPeopleMayKonw: PushPeopleMayKnow? = null,\n            @ProtoNumber(3) @JvmField val msgPersonsMayKnow: PushPeopleMayKnowV2? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class PersonMayKnow(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val name: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val age: Int = 0,\n            @ProtoNumber(4) @JvmField val sex: Int = 0,\n            @ProtoNumber(5) @JvmField val mainReason: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val soureReason: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(7) @JvmField val alghrithm: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(8) @JvmField val source: Int = 0,\n            @ProtoNumber(9) @JvmField val msgIosSource: AddFriendSource? = null,\n            @ProtoNumber(10) @JvmField val msgAndroidSource: AddFriendSource? = null,\n            @ProtoNumber(11) @JvmField val msg: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(12) @JvmField val gameSource: Int = 0,\n            @ProtoNumber(13) @JvmField val roleName: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class PushPeopleMayKnow(\n            @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(1) @JvmField val fixed32Timestamp: Int = 0,\n            @ProtoNumber(2) @JvmField val wordingMsg: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class PushPeopleMayKnowV2(\n            @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(1) @JvmField val fixed32Timestamp: Int = 0,\n            @ProtoNumber(2) @JvmField val msgFriendList: List<PersonMayKnow> = emptyList(),\n            @ProtoNumber(3) @JvmField val roleName: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xb1 {\n    internal class Submsgtype0xb1 : ProtoBuf {\n        @Serializable\n        internal class DealInviteInfo(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val groupCode: Long = 0L,\n            @ProtoNumber(3) @JvmField val id: String = \"\",\n            @ProtoNumber(4) @JvmField val dealResult: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class InviteInfo(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val groupCode: Long = 0L,\n            @ProtoNumber(3) @JvmField val expireTime: Int = 0,\n            @ProtoNumber(4) @JvmField val id: String = \"\",\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val notifyType: Int = 0,\n            @ProtoNumber(2) @JvmField val inviteInfo: InviteInfo? = null,\n            @ProtoNumber(3) @JvmField val univiteInfo: UninviteInfo? = null,\n            @ProtoNumber(4) @JvmField val dealInfo: DealInviteInfo? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class UninviteInfo(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val groupCode: Long = 0L,\n            @ProtoNumber(3) @JvmField val id: String = \"\",\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xb3 {\n    class SubMsgType0xb3 {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val type: Int = 0,\n            @ProtoNumber(2) @JvmField val msgAddFrdNotify: PushAddFrdNotify,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class PushAddFrdNotify(\n            @ProtoNumber(1) @JvmField val fuin: Long = 0L,\n            @ProtoNumber(2) @JvmField val fuinBubbleId: Long = 0L,\n            @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(3) @JvmField val fixed32Timestamp: Int = 0,\n            @ProtoNumber(4) @JvmField val wording: String = \"\", // 我们已经是好友啦，一起来聊天吧!\n            @ProtoNumber(5) @JvmField val fuinNick: String = \"\",\n            @ProtoNumber(6) @JvmField val sourceId: Int = 0,\n            @ProtoNumber(7) @JvmField val subsourceId: Int = 0,\n            @ProtoNumber(8) @JvmField val mobile: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(9) @JvmField val reqUin: Long = 0L,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xb5 {\n    internal class SubMsgType0xb5 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val grayTipContent: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val animationPackageId: Int = 0,\n            @ProtoNumber(3) @JvmField val animationPackageUrlA: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val animationPackageUrlI: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val remindBrief: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val giftId: Int = 0,\n            @ProtoNumber(7) @JvmField val giftCount: Int = 0,\n            @ProtoNumber(8) @JvmField val animationBrief: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(9) @JvmField val senderUin: Long = 0L,\n            @ProtoNumber(10) @JvmField val receiverUin: Long = 0L,\n            @ProtoNumber(11) @JvmField val stmessageTitle: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(12) @JvmField val stmessageSubtitle: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(13) @JvmField val stmessageMessage: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(14) @JvmField val stmessageGiftpicid: Int = 0,\n            @ProtoNumber(15) @JvmField val stmessageComefrom: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(16) @JvmField val stmessageExflag: Int = 0,\n            @ProtoNumber(17) @JvmField val toAllGiftId: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(10000) @JvmField val groupCode: Long = 0L,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xbe {\n    internal class SubMsgType0xbe : ProtoBuf {\n        @Serializable\n        internal class Medal(\n            @ProtoNumber(1) @JvmField val id: Int = 0,\n            @ProtoNumber(2) @JvmField val level: Int = 0,\n            @ProtoNumber(3) @JvmField val type: Int = 0,\n            @ProtoNumber(4) @JvmField val iconUrl: String = \"\",\n            @ProtoNumber(5) @JvmField val flashUrl: String = \"\",\n            @ProtoNumber(6) @JvmField val name: String = \"\",\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val groupCode: Long = 0L,\n            @ProtoNumber(3) @JvmField val notifyType: Int = 0,\n            @ProtoNumber(4) @JvmField val onlineLevel: Int = 0,\n            @ProtoNumber(5) @JvmField val msgMedalList: List<Medal> = emptyList(),\n        ) : ProtoBuf\n    }\n}\n\n\n/*\ninternal class Submsgtype0xc1 {\n    internal class Submsgtype0xc1 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val groupid: Long = 0L,\n            @ProtoNumber(2) @JvmField val memberNum: Int = 0,\n            @ProtoNumber(3) @JvmField val data: String = \"\"\n        ) : ProtoBuf\n    }\n}\n*/\n\ninternal class Submsgtype0xc3 {\n    internal class Submsgtype0xc3 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val type: Int = 0,\n            @ProtoNumber(2) @JvmField val pushData: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val timestamp: Long = 0L,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xc5 {\n    internal class Submsgtype0xc5 : ProtoBuf {\n        @Serializable\n        internal class BBInfo(\n            @ProtoNumber(1) @JvmField val bbUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val src: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class BiuBody(\n            @ProtoNumber(1) @JvmField val biuUin: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class CommentInfo(\n            @ProtoNumber(2) @JvmField val commentUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val commentId: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val replyUin: Long = 0L,\n            @ProtoNumber(5) @JvmField val replyId: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val commentContent: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class LikeInfo(\n            @ProtoNumber(2) @JvmField val likeUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val op: Int = 0,\n            @ProtoNumber(4) @JvmField val replyId: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val bid: Int = 0,\n            @ProtoNumber(2) @JvmField val source: Int = 0,\n            @ProtoNumber(3) @JvmField val operatorType: Int /* enum */ = 1,\n            @ProtoNumber(4) @JvmField val articleId: Long = 0L,\n            @ProtoNumber(5) @JvmField val pushTime: Int = 0,\n            @ProtoNumber(6) @JvmField val seq: Long = 0L,\n            @ProtoNumber(7) @JvmField val msgid: String = \"\",\n            @ProtoNumber(10) @JvmField val msgNotifyInfos: NotifyBody? = null,\n            @ProtoNumber(11) @JvmField val diandianCookie: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class NotifyBody(\n            @ProtoNumber(1) @JvmField val msgStyleSheet: StyleSheet? = null,\n            @ProtoNumber(10) @JvmField val msgCommentArticle: CommentInfo? = null,\n            @ProtoNumber(11) @JvmField val msgLikeArticle: LikeInfo? = null,\n            @ProtoNumber(12) @JvmField val msgBbInfo: BBInfo? = null,\n            @ProtoNumber(13) @JvmField val redPointInfo: List<RedPointInfo> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class RedPointInfo(\n            @ProtoNumber(1) @JvmField val itemId: Int = 0,\n            @ProtoNumber(2) @JvmField val redPointItemType: Int /* enum */ = 0,\n            @ProtoNumber(3) @JvmField val url: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val effectTime: Long = 0L,\n            @ProtoNumber(5) @JvmField val failureTime: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class StyleSheet(\n            @ProtoNumber(1) @JvmField val showFolder: Int = 0,\n            @ProtoNumber(2) @JvmField val folderRedType: Int /* enum */ = 0,\n            @ProtoNumber(3) @JvmField val orangeWord: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val summary: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val msgTipBody: TipsBody? = null,\n            @ProtoNumber(6) @JvmField val showLockScreen: Int = 0,\n            @ProtoNumber(7) @JvmField val msgType: Int /* enum */ = 0,\n            @ProtoNumber(8) @JvmField val msgBiuBody: BiuBody? = null,\n            @ProtoNumber(9) @JvmField val isLow: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class TipsBody(\n            @ProtoNumber(1) @JvmField val tipsUiType: Int /* enum */ = 0,\n            @ProtoNumber(2) @JvmField val uin: Long = 0L,\n            @ProtoNumber(3) @JvmField val iconUrl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val content: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val schema: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val businessInfo: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xc6 {\n    internal class SubMsgType0xc6 : ProtoBuf {\n        @Serializable\n        internal class AccountExceptionAlertBody(\n            @ProtoNumber(1) @JvmField val title: String = \"\",\n            @ProtoNumber(2) @JvmField val content: String = \"\",\n            @ProtoNumber(3) @JvmField val leftButtonText: String = \"\",\n            @ProtoNumber(4) @JvmField val rightButtonText: String = \"\",\n            @ProtoNumber(5) @JvmField val rightButtonLink: String = \"\",\n            @ProtoNumber(6) @JvmField val leftButtonId: Int = 0,\n            @ProtoNumber(7) @JvmField val rightButtonId: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val secCmd: Int = 0,\n            @ProtoNumber(2) @JvmField val msgS2cAccountExceptionNotify: AccountExceptionAlertBody? = null,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xc7 {\n    internal class Submsgtype0xc7 : ProtoBuf {\n        @Serializable\n        internal class ForwardBody(\n            @ProtoNumber(1) @JvmField val notifyType: Int = 0,\n            @ProtoNumber(2) @JvmField val opType: Int = 0,\n            @ProtoNumber(3000) @JvmField val msgHotFriendNotify: HotFriendNotify? = null,\n            @ProtoNumber(4000) @JvmField val msgRelationalChainChange: RelationalChainChange? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class FriendShipFlagNotify(\n            @ProtoNumber(1) @JvmField val dstUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val level1: Int = 0,\n            @ProtoNumber(3) @JvmField val level2: Int = 0,\n            @ProtoNumber(4) @JvmField val continuityDays: Int = 0,\n            @ProtoNumber(5) @JvmField val chatFlag: Int = 0,\n            @ProtoNumber(6) @JvmField val lastChatTime: Long = 0L,\n            @ProtoNumber(7) @JvmField val notifyTime: Long = 0L,\n            @ProtoNumber(8) @JvmField val seq: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class HotFriendNotify(\n            @ProtoNumber(1) @JvmField val dstUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val praiseHotLevel: Int = 0,\n            @ProtoNumber(3) @JvmField val chatHotLevel: Int = 0,\n            @ProtoNumber(4) @JvmField val praiseHotDays: Int = 0,\n            @ProtoNumber(5) @JvmField val chatHotDays: Int = 0,\n            @ProtoNumber(6) @JvmField val closeLevel: Int = 0,\n            @ProtoNumber(7) @JvmField val closeDays: Int = 0,\n            @ProtoNumber(8) @JvmField val praiseFlag: Int = 0,\n            @ProtoNumber(9) @JvmField val chatFlag: Int = 0,\n            @ProtoNumber(10) @JvmField val closeFlag: Int = 0,\n            @ProtoNumber(11) @JvmField val notifyTime: Long = 0L,\n            @ProtoNumber(12) @JvmField val lastPraiseTime: Long = 0L,\n            @ProtoNumber(13) @JvmField val lastChatTime: Long = 0L,\n            @ProtoNumber(14) @JvmField val qzoneHotLevel: Int = 0,\n            @ProtoNumber(15) @JvmField val qzoneHotDays: Int = 0,\n            @ProtoNumber(16) @JvmField val qzoneFlag: Int = 0,\n            @ProtoNumber(17) @JvmField val lastQzoneTime: Long = 0L,\n            @ProtoNumber(51) @JvmField val showRecheckEntry: Int = 0,\n            @ProtoNumber(52) @JvmField val wildcardWording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(100) @JvmField val loverFlag: Int = 0,\n            @ProtoNumber(200) @JvmField val keyHotLevel: Int = 0,\n            @ProtoNumber(201) @JvmField val keyHotDays: Int = 0,\n            @ProtoNumber(202) @JvmField val keyFlag: Int = 0,\n            @ProtoNumber(203) @JvmField val lastKeyTime: Long = 0L,\n            @ProtoNumber(204) @JvmField val keyWording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(205) @JvmField val keyTransFlag: Int = 0,\n            @ProtoNumber(206) @JvmField val loverKeyBusinessType: Int = 0,\n            @ProtoNumber(207) @JvmField val loverKeySubBusinessType: Int = 0,\n            @ProtoNumber(208) @JvmField val loverKeyMainWording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(209) @JvmField val loverKeyLinkWording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(300) @JvmField val boatLevel: Int = 0,\n            @ProtoNumber(301) @JvmField val boatDays: Int = 0,\n            @ProtoNumber(302) @JvmField val boatFlag: Int = 0,\n            @ProtoNumber(303) @JvmField val lastBoatTime: Int = 0,\n            @ProtoNumber(304) @JvmField val boatWording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(400) @JvmField val notifyType: Int = 0,\n            @ProtoNumber(401) @JvmField val msgFriendshipFlagNotify: FriendShipFlagNotify? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgModInfos: List<ForwardBody> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class RelationalChainChange(\n            @ProtoNumber(1) @JvmField val appid: Long = 0L,\n            @ProtoNumber(2) @JvmField val srcUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val dstUin: Long = 0L,\n            @ProtoNumber(4) @JvmField val changeType: Int /* enum */ = 1,\n            @ProtoNumber(5) @JvmField val msgRelationalChainInfoOld: RelationalChainInfo? = null,\n            @ProtoNumber(6) @JvmField val msgRelationalChainInfoNew: RelationalChainInfo? = null,\n            @ProtoNumber(7) @JvmField val msgToDegradeInfo: ToDegradeInfo? = null,\n            @ProtoNumber(20) @JvmField val relationalChainInfos: List<RelationalChainInfos> = emptyList(),\n            @ProtoNumber(100) @JvmField val uint32FeatureId: List<Int> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class RelationalChainInfo(\n            @ProtoNumber(1) @JvmField val type: Int /* enum */ = 1,\n            @ProtoNumber(2) @JvmField val attr: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(1002) @JvmField val intimateInfo: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(91001) @JvmField val musicSwitch: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(101001) @JvmField val mutualmarkAlienation: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class RelationalChainInfos(\n            @ProtoNumber(1) @JvmField val msgRelationalChainInfoOld: RelationalChainInfo? = null,\n            @ProtoNumber(2) @JvmField val msgRelationalChainInfoNew: RelationalChainInfo? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ToDegradeInfo(\n            @ProtoNumber(1) @JvmField val toDegradeItem: List<ToDegradeItem> = emptyList(),\n            @ProtoNumber(2) @JvmField val nick: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val notifyTime: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ToDegradeItem(\n            @ProtoNumber(1) @JvmField val type: Int /* enum */ = 1,\n            @ProtoNumber(2) @JvmField val oldLevel: Int = 0,\n            @ProtoNumber(3) @JvmField val newLevel: Int = 0,\n            @ProtoNumber(11) @JvmField val continuityDays: Int = 0,\n            @ProtoNumber(12) @JvmField val lastActionTime: Long = 0L,\n        ) : ProtoBuf\n    }\n}\n\ninternal class Mutualmark {\n    class Mutualmark : ProtoBuf {\n        @Serializable\n        internal class MutualmarkInfo(\n            @ProtoNumber(1) @JvmField val lastActionTime: Long = 0L,\n            @ProtoNumber(2) @JvmField val level: Int = 0,\n            @ProtoNumber(3) @JvmField val lastChangeTime: Long = 0L,\n            @ProtoNumber(4) @JvmField val continueDays: Int = 0,\n            @ProtoNumber(5) @JvmField val wildcardWording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val notifyTime: Long = 0L,\n            @ProtoNumber(7) @JvmField val iconStatus: Long = 0L,\n            @ProtoNumber(8) @JvmField val iconStatusEndTime: Long = 0L,\n            @ProtoNumber(9) @JvmField val closeFlag: Int = 0,\n            @ProtoNumber(10) @JvmField val resourceInfo: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ResourceInfo17(\n            @ProtoNumber(1) @JvmField val dynamicUrl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val staticUrl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val cartoonUrl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val cartoonMd5: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val playCartoon: Int = 0,\n            @ProtoNumber(6) @JvmField val word: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xc9 {\n    class Submsgtype0xc9 : ProtoBuf {\n        @Serializable\n        internal class BusinessMsg(\n            @ProtoNumber(1) @JvmField val msgType: Int /* enum */ = 0,\n            @ProtoNumber(2) @JvmField val msgData: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val boolTabVisible: Boolean = false,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val type: Int = 0,\n            @ProtoNumber(2) @JvmField val fromUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val actionUin: Long = 0L,\n            @ProtoNumber(4) @JvmField val source: Int /* enum */ = 0,\n            @ProtoNumber(5) @JvmField val msgBusinessMsg: List<BusinessMsg> = emptyList(),\n            @ProtoNumber(6) @JvmField val boolNewFriend: Boolean = false,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xca {\n    class Submsgtype0xca : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val msgList: List<MsgContent> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgContent(\n            @ProtoNumber(1) @JvmField val tag: Long = 0L,\n            @ProtoNumber(2) @JvmField val msgType: Long = 0L,\n            @ProtoNumber(3) @JvmField val seq: Long = 0L,\n            @ProtoNumber(4) @JvmField val content: String = \"\",\n            @ProtoNumber(5) @JvmField val actionId: Long = 0L,\n            @ProtoNumber(6) @JvmField val ts: Long = 0L,\n            @ProtoNumber(7) @JvmField val expts: Long = 0L,\n            @ProtoNumber(8) @JvmField val errorMsg: String = \"\",\n            @ProtoNumber(9) @JvmField val showSpace: Long = 0L,\n            @ProtoNumber(10) @JvmField val regionUrl: String = \"\",\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xcb {\n    internal class SubMsgType0xcb : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val anchorStatus: Int = 0,\n            @ProtoNumber(2) @JvmField val jumpSchema: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val anchorNickname: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val anchorHeadUrl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val liveWording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val liveEndWording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(7) @JvmField val c2cMsgWording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(8) @JvmField val liveWordingType: Int = 0,\n            @ProtoNumber(9) @JvmField val endWordingType: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xcc {\n    internal class SubMsgType0xcc : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgType: Int = 0,\n            @ProtoNumber(2) @JvmField val msgInfo: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val uin: Long = 0L,\n            @ProtoNumber(4) @JvmField val unionId: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val subType: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val feedId: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(7) @JvmField val vid: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(8) @JvmField val coverUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xce {\n    internal class Submsgtype0xce : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val int64StartTime: Long = 0L,\n            @ProtoNumber(2) @JvmField val int64EndTime: Long = 0L,\n            @ProtoNumber(3) @JvmField val params: String = \"\",\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xcf {\n    internal class Submsgtype0xcf : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val rsptype: Int = 0,\n            @ProtoNumber(2) @JvmField val rspbody: String = \"\",\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xd0 {\n    internal class SubMsgType0xd0 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgType: Int = 0,\n            @ProtoNumber(2) @JvmField val msgInfo: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val hotTopicId: Long = 0L,\n            @ProtoNumber(4) @JvmField val hotTopicName: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val bigVId: Long = 0L,\n            @ProtoNumber(6) @JvmField val bigVUnionId: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(7) @JvmField val pgcType: Int = 0,\n            @ProtoNumber(8) @JvmField val pgcColumnUnionId: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(9) @JvmField val link: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(10) @JvmField val subType: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(11) @JvmField val coverUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xd7 {\n    internal class SubMsgType0xd7 : ProtoBuf {\n        @Serializable\n        internal class Content(\n            @ProtoNumber(1) @JvmField val fromUser: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val plainText: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val buluoWord: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val richFreshWord: AppointDefine.RichText? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val type: Int = 0,\n            @ProtoNumber(2) @JvmField val msgboxUnreadCount: Int = 0,\n            @ProtoNumber(3) @JvmField val unreadCount: Int = 0,\n            @ProtoNumber(4) @JvmField val msgContent: Content? = null,\n            @ProtoNumber(5) @JvmField val timestamp: Long = 0L,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xda {\n    internal class SubMsgType0xda : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgType: Int = 0,\n            @ProtoNumber(2) @JvmField val msgInfo: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val subType: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val versionCtrl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val feedId: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val unionId: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(7) @JvmField val commentId: Int = 0,\n            @ProtoNumber(8) @JvmField val iconUnionId: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(9) @JvmField val coverUrl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(10) @JvmField val operType: Int = 0,\n            @ProtoNumber(11) @JvmField val groupUnionid: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(12) @JvmField val vid: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(13) @JvmField val doodleUrl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(14) @JvmField val fromNick: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(15) @JvmField val vidUrl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(16) @JvmField val extInfo: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xdb {\n    internal class Submsgtype0xdb : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val rsptype: Int = 0,\n            @ProtoNumber(2) @JvmField val rspbody: String = \"\",\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xdc {\n    internal class Submsgtype0xdc : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgList: List<MsgContent> = emptyList(),\n            @ProtoNumber(2) @JvmField val msgType: Int = 0,\n            @ProtoNumber(3) @JvmField val msgList0x02: List<MsgContent> = emptyList(),\n            @ProtoNumber(4) @JvmField val minQqVer: String = \"\",\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgContent(\n            @ProtoNumber(1) @JvmField val masterPri: Long = 0L,\n            @ProtoNumber(2) @JvmField val subPri: Long = 0L,\n            @ProtoNumber(3) @JvmField val showTimes: Long = 0L,\n            @ProtoNumber(4) @JvmField val showBegTs: Long = 0L,\n            @ProtoNumber(5) @JvmField val expTs: Long = 0L,\n            @ProtoNumber(6) @JvmField val msgSentTs: Long = 0L,\n            @ProtoNumber(7) @JvmField val actionId: Long = 0L,\n            @ProtoNumber(8) @JvmField val wording: String = \"\",\n            @ProtoNumber(9) @JvmField val scheme: String = \"\",\n            @ProtoNumber(10) @JvmField val regionUrl: String = \"\",\n            @ProtoNumber(11) @JvmField val wordingColor: Long = 0L,\n            @ProtoNumber(12) @JvmField val msgId: Long = 0L,\n            @ProtoNumber(13) @JvmField val bubbleId: Long = 0L,\n            @ProtoNumber(14) @JvmField val tips: String = \"\",\n            @ProtoNumber(15) @JvmField val gameId: Long = 0L,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xdd {\n    internal class Submsgtype0xdd : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgType: Int = 0,\n            @ProtoNumber(2) @JvmField val uint64InviteUin: List<Long> = emptyList(),\n            @ProtoNumber(3) @JvmField val inviteLeader: Long = 0L,\n            @ProtoNumber(4) @JvmField val msgPoiInfo: WifiPOIInfo? = null,\n            @ProtoNumber(5) @JvmField val msgPlayerState: List<PlayerState> = emptyList(),\n        ) : ProtoBuf {\n            @Serializable\n            internal class PlayerState(\n                @ProtoNumber(1) @JvmField val uin: Long = 0L,\n                @ProtoNumber(2) @JvmField val state: Int = 0,\n            ) : ProtoBuf\n\n            @Serializable\n            internal class SeatsInfo(\n                @ProtoNumber(1) @JvmField val seatFlag: Int = 0,\n                @ProtoNumber(2) @JvmField val guestUin: Long = 0L,\n                @ProtoNumber(3) @JvmField val seatId: Int = 0,\n                @ProtoNumber(4) @JvmField val seatSeq: Int = 0,\n            ) : ProtoBuf\n\n            @Serializable\n            internal class WifiPOIInfo(\n                @ProtoNumber(1) @JvmField val uid: ByteArray = EMPTY_BYTE_ARRAY,\n                @ProtoNumber(2) @JvmField val name: ByteArray = EMPTY_BYTE_ARRAY,\n                @ProtoNumber(3) @JvmField val faceId: Int = 0,\n                @ProtoNumber(4) @JvmField val sig: ByteArray = EMPTY_BYTE_ARRAY,\n                @ProtoNumber(5) @JvmField val groupCode: Int = 0,\n                @ProtoNumber(6) @JvmField val groupUin: Int = 0,\n                @ProtoNumber(7) @JvmField val visitorNum: Int = 0,\n                @ProtoNumber(8) @JvmField val wifiPoiType: Int = 0,\n                @ProtoNumber(9) @JvmField val isMember: Int = 0,\n                @ProtoNumber(10) @JvmField val distance: Int = 0,\n                @ProtoNumber(11) @JvmField val msgTabSwitchOff: Int = 0,\n                @ProtoNumber(12) @JvmField val faceUrl: String = \"\",\n                @ProtoNumber(13) @JvmField val hotThemeGroupFlag: Int = 0,\n                @ProtoNumber(14) @JvmField val bannerUrl: String = \"\",\n                @ProtoNumber(15) @JvmField val specialFlag: Int = 0,\n                @ProtoNumber(16) @JvmField val totalNumLimit: Int = 0,\n                @ProtoNumber(17) @JvmField val isAdmin: Int = 0,\n                @ProtoNumber(18) @JvmField val joinGroupUrl: String = \"\",\n                @ProtoNumber(19) @JvmField val groupTypeFlag: Int = 0,\n                @ProtoNumber(20) @JvmField val createrCityId: Int = 0,\n                @ProtoNumber(21) @JvmField val isUserCreate: Int = 0,\n                @ProtoNumber(22) @JvmField val ownerUin: Long = 0L,\n                @ProtoNumber(23) @JvmField val auditFlag: Int = 0,\n                @ProtoNumber(24) @JvmField val tvPkFlag: Int = 0,\n                @ProtoNumber(25) @JvmField val subType: Int = 0,\n                @ProtoNumber(26) @JvmField val lastMsgSeq: Long = 0L,\n                @ProtoNumber(27) @JvmField val msgSeatsInfo: List<SeatsInfo> = emptyList(),\n                @ProtoNumber(28) @JvmField val flowerNum: Long = 0L,\n                @ProtoNumber(29) @JvmField val flowerPoint: Long = 0L,\n                @ProtoNumber(31) @JvmField val favoritesTime: Long = 0L,\n                @ProtoNumber(32) @JvmField val favoritesExpired: Int = 0,\n                @ProtoNumber(33) @JvmField val groupId: Int = 0,\n                @ProtoNumber(34) @JvmField val praiseNums: Long = 0L,\n                @ProtoNumber(35) @JvmField val reportPraiseGapTime: Long = 0L,\n                @ProtoNumber(36) @JvmField val reportPraiseGapFrequency: Long = 0L,\n                @ProtoNumber(37) @JvmField val getPraiseGapTime: Long = 0L,\n                @ProtoNumber(38) @JvmField val vistorJoinGroupTime: Long = 0L,\n                @ProtoNumber(39) @JvmField val groupIsNotExist: Int = 0,\n                @ProtoNumber(40) @JvmField val guestNum: Int = 0,\n                @ProtoNumber(41) @JvmField val highQualityFlag: Int = 0,\n                @ProtoNumber(42) @JvmField val exitGroupCode: Long = 0L,\n                @ProtoNumber(43) @JvmField val int32Latitude: Int = 0,\n                @ProtoNumber(44) @JvmField val int32Longitude: Int = 0,\n                @ProtoNumber(45) @JvmField val smemo: String = \"\",\n                @ProtoNumber(46) @JvmField val isAllCountry: Int = 0,\n            ) : ProtoBuf\n        }\n    }\n}\n\n\ninternal class Submsgtype0xde {\n    internal class Submsgtype0xde : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgType: Int = 0,\n            @ProtoNumber(2) @JvmField val unionId: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val uid: Long = 0L,\n            @ProtoNumber(4) @JvmField val vid: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val videoCover: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xdf {\n    internal class Submsgtype0xdf : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            // @ProtoNumber(1) @JvmField val msgGameState: ApolloGameStatus.STCMGameMessage? = null,\n            @ProtoNumber(2) @JvmField val uint32UinList: List<Int> = emptyList(),\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xe0 {\n    internal class Submsgtype0xe0 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val pushExt: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xe1 {\n    internal class Submsgtype0xe1 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val pushExt: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xe4 {\n    internal class Submsgtype0xe4 : ProtoBuf {\n        @Serializable\n        internal class GeoInfo(\n            @ProtoNumber(1) @JvmField val latitude: Long = 0L,\n            @ProtoNumber(2) @JvmField val longitude: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class GiftMsg(\n            @ProtoNumber(1) @JvmField val fromUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val toUin: Long = 0L,\n            @ProtoNumber(3) @JvmField val productId: Int = 0,\n            @ProtoNumber(4) @JvmField val giftId: Int = 0,\n            @ProtoNumber(5) @JvmField val giftNum: Long = 0L,\n            @ProtoNumber(6) @JvmField val roomid: String = \"\",\n            @ProtoNumber(7) @JvmField val giftWording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(8) @JvmField val packageurl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(50) @JvmField val curAddDuration: Int = 0,\n            @ProtoNumber(51) @JvmField val allAddDuration: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class LikeMsg(\n            @ProtoNumber(1) @JvmField val fromUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val toUin: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgMatchPlayer: Player? = null,\n            @ProtoNumber(2) @JvmField val distance: Int = 0,\n            @ProtoNumber(3) @JvmField val hint: String = \"\",\n            @ProtoNumber(4) @JvmField val countdown: Int = 0,\n            @ProtoNumber(5) @JvmField val key: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val type: Int = 0,\n            @ProtoNumber(7) @JvmField val callType: Int = 0,\n            @ProtoNumber(8) @JvmField val displayDistance: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(9) @JvmField val msgLike: LikeMsg? = null,\n            @ProtoNumber(10) @JvmField val msgGift: GiftMsg? = null,\n            @ProtoNumber(11) @JvmField val msgRoom: Room? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class Player(\n            @ProtoNumber(1) @JvmField val uin: Long = 0L,\n            @ProtoNumber(2) @JvmField val nickname: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val logoUrl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(4) @JvmField val gender: Int = 0,\n            @ProtoNumber(5) @JvmField val level: Int = 0,\n            @ProtoNumber(6) @JvmField val age: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class Room(\n            @ProtoNumber(1) @JvmField val roomId: String = \"\",\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xe5 {\n    internal class Submsgtype0xe5 : ProtoBuf {\n        @Serializable\n        internal class CrmS2CMsgHead(\n            @ProtoNumber(1) @JvmField val crmSubCmd: Int = 0,\n            @ProtoNumber(2) @JvmField val headLen: Int = 0,\n            @ProtoNumber(3) @JvmField val verNo: Int = 0,\n            @ProtoNumber(4) @JvmField val kfUin: Long = 0L,\n            @ProtoNumber(5) @JvmField val seq: Int = 0,\n            @ProtoNumber(6) @JvmField val packNum: Int = 0,\n            @ProtoNumber(7) @JvmField val curPack: Int = 0,\n            @ProtoNumber(8) @JvmField val bufSig: String = \"\",\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val subCmd: Int = 0,\n            @ProtoNumber(2) @JvmField val msgCrmCommonHead: CrmS2CMsgHead? = null,\n            @ProtoNumber(3) @JvmField val msgS2cCcAgentStatusChangePush: S2CCcAgentStatusChangePush? = null,\n            @ProtoNumber(4) @JvmField val msgS2cCcConfigChangePush: S2CCcConfigChangePush? = null,\n            @ProtoNumber(5) @JvmField val msgS2cCcExceptionOccurPush: S2CCcExceptionOccurPush? = null,\n            @ProtoNumber(6) @JvmField val msgS2cCcTalkingStatusChangePush: S2CCcTalkingStatusChangePush? = null,\n            @ProtoNumber(7) @JvmField val msgS2cCcAgentActionResultPush: S2CCcAgentActionResultPush? = null,\n            @ProtoNumber(8) @JvmField val msgS2cCallRecordChangePush: S2CCallRecordChangePush? = null,\n            @ProtoNumber(9) @JvmField val msgS2cSmsEventPush: S2CSMSEventPush? = null,\n            @ProtoNumber(10) @JvmField val msgS2cAgentCallStatusEventPush: S2CAgentCallStatusEventPush? = null,\n            @ProtoNumber(11) @JvmField val msgS2cUserGetCouponForKfextEventPush: S2CUserGetCouponForKFExtEventPush? = null,\n            @ProtoNumber(12) @JvmField val msgS2cUserGetCouponForCEventPush: S2CUserGetCouponForCEventPush? = null,\n        ) : ProtoBuf {\n            @Serializable\n            internal class S2CAgentCallStatusEventPush(\n                @ProtoNumber(1) @JvmField val type: Int = 0,\n                @ProtoNumber(2) @JvmField val callStatus: Int = 0,\n                @ProtoNumber(3) @JvmField val ringAsr: Int = 0,\n                @ProtoNumber(4) @JvmField val callid: String = \"\",\n                @ProtoNumber(5) @JvmField val fromKfext: Long = 0L,\n                @ProtoNumber(6) @JvmField val timestamp: Int = 0,\n            ) : ProtoBuf\n\n            @Serializable\n            internal class S2CCallRecordChangePush(\n                @ProtoNumber(1) @JvmField val kfext: Long = 0L,\n                @ProtoType(ProtoIntegerType.FIXED) @ProtoNumber(2) @JvmField val fixed64Timestamp: Long = 0L,\n            ) : ProtoBuf\n\n            @Serializable\n            internal class S2CCcAgentActionResultPush(\n                @ProtoNumber(1) @JvmField val type: Int = 0,\n                @ProtoNumber(2) @JvmField val callid: String = \"\",\n                @ProtoNumber(3) @JvmField val result: Int = 0,\n                @ProtoNumber(4) @JvmField val timestamp: Int = 0,\n                @ProtoNumber(5) @JvmField val status: Int = 0,\n                @ProtoNumber(6) @JvmField val targetName: ByteArray = EMPTY_BYTE_ARRAY,\n                @ProtoNumber(7) @JvmField val targetKfext: Long = 0L,\n            ) : ProtoBuf\n\n            @Serializable\n            internal class S2CCcAgentStatusChangePush(\n                @ProtoNumber(1) @JvmField val readyDevice: Int = 0,\n                @ProtoNumber(2) @JvmField val updateTime: Long = 0L,\n                @ProtoNumber(3) @JvmField val deviceSubState: Int = 0,\n            ) : ProtoBuf\n\n            @Serializable\n            internal class S2CCcConfigChangePush(\n                @ProtoNumber(1) @JvmField val optype: Int = 0,\n            ) : ProtoBuf\n\n            @Serializable\n            internal class S2CCcExceptionOccurPush(\n                @ProtoNumber(1) @JvmField val optype: Int = 0,\n            ) : ProtoBuf\n\n            @Serializable\n            internal class S2CCcTalkingStatusChangePush(\n                @ProtoNumber(1) @JvmField val talkingStatus: Int = 0,\n                @ProtoNumber(2) @JvmField val callid: String = \"\",\n            ) : ProtoBuf\n\n            @Serializable\n            internal class S2CSMSEventPush(\n                @ProtoNumber(1) @JvmField val type: Int = 0,\n                @ProtoNumber(2) @JvmField val phoneNum: String = \"\",\n                @ProtoNumber(3) @JvmField val timestamp: Long = 0L,\n                @ProtoNumber(4) @JvmField val smsId: String = \"\",\n                @ProtoNumber(5) @JvmField val eventMsg: String = \"\",\n            ) : ProtoBuf\n\n            @Serializable\n            internal class S2CUserGetCouponForCEventPush(\n                @ProtoNumber(1) @JvmField val qquin: Long = 0L,\n                @ProtoNumber(2) @JvmField val kfuin: Long = 0L,\n                @ProtoNumber(3) @JvmField val couponId: Long = 0L,\n                @ProtoNumber(4) @JvmField val timestamp: Int = 0,\n                @ProtoNumber(5) @JvmField val kfext: Long = 0L,\n                @ProtoNumber(6) @JvmField val tipsContent: String = \"\",\n            ) : ProtoBuf\n\n            @Serializable\n            internal class S2CUserGetCouponForKFExtEventPush(\n                @ProtoNumber(1) @JvmField val channelType: Int = 0,\n                @ProtoNumber(2) @JvmField val fakeuin: Long = 0L,\n                @ProtoNumber(3) @JvmField val qquin: Long = 0L,\n                @ProtoNumber(4) @JvmField val openid: String = \"\",\n                @ProtoNumber(5) @JvmField val visitorid: String = \"\",\n                @ProtoNumber(6) @JvmField val appid: String = \"\",\n                @ProtoNumber(7) @JvmField val qqPubUin: Long = 0L,\n                @ProtoNumber(8) @JvmField val kfuin: Long = 0L,\n                @ProtoNumber(9) @JvmField val couponId: Long = 0L,\n                @ProtoNumber(10) @JvmField val notifyTips: String = \"\",\n                @ProtoNumber(11) @JvmField val timestamp: Int = 0,\n                @ProtoNumber(12) @JvmField val kfext: Long = 0L,\n            ) : ProtoBuf\n        }\n    }\n}\n\n\ninternal class Submsgtype0xe8 {\n    internal class Submsgtype0xe8 : ProtoBuf {\n        @Serializable\n        internal class MsgBody/*(\n             @ProtoNumber(1) @JvmField val msgItem: ApolloPushMsgInfo.STPushMsgElem? = null\n        )*/ : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xe9 {\n    internal class SubMsgType0xe9 : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val businessType: Int = 0,\n            @ProtoNumber(2) @JvmField val business: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xea {\n    internal class Submsgtype0xea : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val title: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val content: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xee {\n    internal class Submsgtype0xee : ProtoBuf {\n        @Serializable\n        internal class AccountInfo(\n            @ProtoNumber(1) @JvmField val id: Long = 0L,\n            @ProtoNumber(2) @JvmField val name: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val iconUrl: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ContextInfo(\n            @ProtoNumber(1) @JvmField val id: Long = 0L,\n            @ProtoNumber(2) @JvmField val title: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val msgPicList: List<PictureInfo> = emptyList(),\n            @ProtoNumber(4) @JvmField val jumpUrl: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(5) @JvmField val orangeWord: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(6) @JvmField val brief: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(7) @JvmField val enumContextType: Int /* enum */ = 0,\n            @ProtoNumber(8) @JvmField val videoBrief: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ControlInfo(\n            @ProtoNumber(1) @JvmField val commentLength: Int = 0,\n            @ProtoNumber(2) @JvmField val showLine: Int = 0,\n            @ProtoNumber(3) @JvmField val fontSize: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ExtraInfo(\n            @ProtoNumber(1) @JvmField val ext: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val cookie: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val id: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val seq: Long = 0L,\n            @ProtoNumber(3) @JvmField val bid: Int = 0,\n            @ProtoNumber(11) @JvmField val msgNotifyList: List<NotifyInfo> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class NotifyInfo(\n            @ProtoNumber(1) @JvmField val msgStyleSheet: StyleSheet? = null,\n            @ProtoNumber(2) @JvmField val enumApppushType: Int /* enum */ = 0,\n            @ProtoNumber(3) @JvmField val msgOrdinaryPushInfo: OrdinaryPushInfo? = null,\n            @ProtoNumber(4) @JvmField val msgSocialPushInfo: SocialPushInfo? = null,\n            @ProtoNumber(5) @JvmField val msgUgcPushInfo: UGCPushInfo? = null,\n            @ProtoNumber(11) @JvmField val msgContextInfo: ContextInfo? = null,\n            @ProtoNumber(12) @JvmField val msgAccountInfo: AccountInfo? = null,\n            @ProtoNumber(13) @JvmField val msgStatisticsInfo: StatisticsInfo? = null,\n            @ProtoNumber(14) @JvmField val msgControlInfo: ControlInfo? = null,\n            @ProtoNumber(21) @JvmField val msgExtraInfo: ExtraInfo? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class OrangeControlInfo(\n            @ProtoNumber(1) @JvmField val color: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val fontSize: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class OrdinaryPushInfo(\n            @ProtoNumber(1) @JvmField val msgLabelControlInfo: OrangeControlInfo? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class PictureInfo(\n            @ProtoNumber(1) @JvmField val url: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class SocialPushInfo(\n            @ProtoNumber(1) @JvmField val feedsId: Long = 0L,\n            @ProtoNumber(2) @JvmField val biuReason: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(3) @JvmField val biuComment: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class StatisticsInfo(\n            @ProtoNumber(1) @JvmField val algorithmId: Long = 0L,\n            @ProtoNumber(2) @JvmField val strategyId: Long = 0L,\n            @ProtoNumber(3) @JvmField val folderStatus: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class StyleSheet(\n            @ProtoNumber(1) @JvmField val enumStyleType: Int /* enum */ = 0,\n            @ProtoNumber(2) @JvmField val arkEnable: Int = 0,\n            @ProtoNumber(3) @JvmField val scene: Long = 0L,\n            @ProtoNumber(11) @JvmField val duration: Int = 0,\n            @ProtoNumber(12) @JvmField val endTime: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class UGCPushInfo(\n            @ProtoNumber(1) @JvmField val feedsId: Long = 0L,\n            @ProtoNumber(2) @JvmField val ugcReason: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xf9 {\n    internal class Submsgtype0xf9 : ProtoBuf {\n        @Serializable\n        internal class AdInfo(\n            @ProtoNumber(1) @JvmField val fromUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val nick: String = \"\",\n            @ProtoNumber(3) @JvmField val headUrl: String = \"\",\n            @ProtoNumber(4) @JvmField val brief: String = \"\",\n            @ProtoNumber(5) @JvmField val action: String = \"\",\n            @ProtoNumber(6) @JvmField val flag: Int = 0,\n            @ProtoNumber(7) @JvmField val serviceID: Int = 0,\n            @ProtoNumber(8) @JvmField val templateID: Int = 0,\n            @ProtoNumber(9) @JvmField val url: String = \"\",\n            @ProtoNumber(10) @JvmField val msgMsgCommonData: MsgCommonData? = null,\n            @ProtoNumber(11) @JvmField val msgVideo: List<Video> = emptyList(),\n            @ProtoNumber(12) @JvmField val pushTime: Int = 0,\n            @ProtoNumber(13) @JvmField val invalidTime: Int = 0,\n            @ProtoNumber(14) @JvmField val maxExposureTime: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val zipAdInfo: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgCommonData(\n            @ProtoNumber(1) @JvmField val adId: String = \"\",\n            @ProtoNumber(2) @JvmField val adPosId: String = \"\",\n            @ProtoNumber(3) @JvmField val boolBannerShow: Boolean = false,\n            @ProtoNumber(4) @JvmField val bannertype: Int = 0,\n            @ProtoNumber(5) @JvmField val jumpType: Int = 0,\n            @ProtoNumber(6) @JvmField val jumpUrl: String = \"\",\n            @ProtoNumber(7) @JvmField val appId: String = \"\",\n            @ProtoNumber(8) @JvmField val appName: String = \"\",\n            @ProtoNumber(9) @JvmField val packagename: String = \"\",\n            @ProtoNumber(10) @JvmField val androidDownloadUrl: String = \"\",\n            @ProtoNumber(11) @JvmField val scheme: String = \"\",\n            @ProtoNumber(12) @JvmField val iosDownloadUrl: String = \"\",\n            @ProtoNumber(13) @JvmField val bannerImgUrl: String = \"\",\n            @ProtoNumber(14) @JvmField val bannerText: String = \"\",\n            @ProtoNumber(15) @JvmField val bannerButtonText: String = \"\",\n            @ProtoNumber(16) @JvmField val boolSilentDownload: Boolean = false,\n            @ProtoNumber(17) @JvmField val audioSwitchType: Int = 0,\n            @ProtoNumber(18) @JvmField val preDownloadType: Int = 0,\n            @ProtoNumber(19) @JvmField val reportLink: String = \"\",\n            @ProtoNumber(20) @JvmField val boolHorizontalVideo: Boolean = false,\n            @ProtoNumber(21) @JvmField val audioFadeinDuration: Int = 0,\n            @ProtoNumber(22) @JvmField val openJumpUrlGuide: String = \"\",\n            @ProtoNumber(23) @JvmField val myappDownloadUrl: String = \"\",\n            @ProtoNumber(24) @JvmField val jumpTypeParams: String = \"\",\n            @ProtoNumber(25) @JvmField val scrollUpToJump: Int = 0,\n            @ProtoNumber(26) @JvmField val controlVariable: Int = 0,\n            @ProtoNumber(27) @JvmField val autoJump: Int = 0,\n            @ProtoNumber(28) @JvmField val clickLink: String = \"\",\n            @ProtoNumber(29) @JvmField val monitorType: Int = 0,\n            @ProtoNumber(30) @JvmField val shareNick: String = \"\",\n            @ProtoNumber(31) @JvmField val shareAdHeadUrl: String = \"\",\n            @ProtoNumber(32) @JvmField val shareAdBrief: String = \"\",\n            @ProtoNumber(33) @JvmField val shareAdTxt: String = \"\",\n            @ProtoNumber(34) @JvmField val shareAdIconUrl: String = \"\",\n            @ProtoNumber(35) @JvmField val shareJumpUrl: String = \"\",\n            @ProtoNumber(36) @JvmField val controlPluginTime: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class Video(\n            @ProtoNumber(1) @JvmField val layout: Int = 0,\n            @ProtoNumber(2) @JvmField val cover: String = \"\",\n            @ProtoNumber(3) @JvmField val src: String = \"\",\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xfd {\n    internal class Submsgtype0xfd : ProtoBuf {\n        @Serializable\n        internal class AdInfo(\n            @ProtoNumber(1) @JvmField val fromUin: Long = 0L,\n            @ProtoNumber(2) @JvmField val adId: String = \"\",\n            @ProtoNumber(3) @JvmField val adSeq: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val msgAdInfo: AdInfo? = null,\n        ) : ProtoBuf\n    }\n}\n\n\ninternal class Submsgtype0xfe {\n    internal class Submsgtype0xfe : ProtoBuf {\n        @Serializable\n        internal class MsgBody(\n            @ProtoNumber(1) @JvmField val wording: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoNumber(2) @JvmField val innerUnreadNum: Int = 0,\n            @ProtoNumber(3) @JvmField val boxUnreadNum: Int = 0,\n            @ProtoNumber(4) @JvmField val updateTime: Int = 0,\n        ) : ProtoBuf\n    }\n}\n        "
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/proto/msgType0x211.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"SpellCheckingInspection\")\n\npackage net.mamoe.mirai.internal.network.protocol.data.proto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.protobuf.ProtoIntegerType\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport kotlinx.serialization.protobuf.ProtoType\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.jvm.JvmField\n\n\n@Serializable\ninternal class SubMsgType0x3 : ProtoBuf {\n    @Serializable\n    internal class FailNotify(\n        @JvmField @ProtoNumber(1) val sessionid: Int = 0,\n        @JvmField @ProtoNumber(2) val retCode: Int = 0,\n        @JvmField @ProtoNumber(3) val reason: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgBody(\n        @JvmField @ProtoNumber(1) val msgProgressNotify: ProgressNotify? = null,\n        @JvmField @ProtoNumber(2) val msgFailNotify: FailNotify? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ProgressNotify(\n        @JvmField @ProtoNumber(1) val sessionid: Int = 0,\n        @JvmField @ProtoNumber(2) val uuid: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(3) val progress: Int = 0,\n        @JvmField @ProtoNumber(4) val averageSpeed: Int = 0,\n    ) : ProtoBuf\n}\n\n\n@Serializable\ninternal class SubMsgType0x4 : ProtoBuf {\n    @Serializable\n    internal class MsgBody(\n        @JvmField @ProtoNumber(1) val msgNotOnlineFile: ImMsgBody.NotOnlineFile? = null,\n        @JvmField @ProtoNumber(2) val msgTime: Int = 0,\n        @JvmField @ProtoNumber(3) val onlineFileForPolyToOffline: Int = 0,\n        @JvmField @ProtoNumber(4) val fileImageInfo: HummerResv21.FileImgInfo? = null,\n        @JvmField @ProtoNumber(5) val msgXtfSenderInfo: HummerResv21.XtfSenderInfo? = null,\n        @JvmField @ProtoNumber(6) val resvAttr: HummerResv21.ResvAttr? = null,\n    ) : ProtoBuf\n}\n\n\n@Serializable\ninternal class SubMsgType0x5 : ProtoBuf {\n    @Serializable\n    internal class MsgBody(\n        @JvmField @ProtoNumber(1) val sessionid: Int = 0,\n    ) : ProtoBuf\n}\n\n\n@Serializable\ninternal class SubMsgType0x7 : ProtoBuf {\n    @Serializable\n    internal class MsgBody(\n        @JvmField @ProtoNumber(1) val subCmd: Int = 0,\n        @JvmField @ProtoNumber(2) val msgHeader: MsgHeader? = null,\n        @JvmField @ProtoNumber(3) val msgSubcmd0x1FtnNotify: List<FTNNotify> = emptyList(),\n        @JvmField @ProtoNumber(4) val msgSubcmd0x2NfcNotify: List<NFCNotify> = emptyList(),\n        @JvmField @ProtoNumber(5) val msgSubcmd0x3Filecontrol: List<FileControl> = emptyList(),\n        @JvmField @ProtoNumber(6) val msgSubcmd0x4Generic: GenericSubCmd? = null,\n        @JvmField @ProtoNumber(7) val msgSubcmd0x5MoloNotify: List<MoloNotify> = emptyList(),\n        @JvmField @ProtoNumber(8) val msgSubcmd0x8RnfcNotify: List<RNFCNotify> = emptyList(),\n        @JvmField @ProtoNumber(9) val msgSubcmd0x9FtnThumbNotify: List<FTNNotify> = emptyList(),\n        @JvmField @ProtoNumber(10) val msgSubcmd0xaNfcThumbNotify: List<NFCNotify> = emptyList(),\n        @JvmField @ProtoNumber(11) val msgSubcmd0xbMpfileNotify: List<MpFileNotify> = emptyList(),\n        @JvmField @ProtoNumber(12) val msgSubcmd0xcProgressReq: ProgressReq? = null,\n        @JvmField @ProtoNumber(13) val msgSubcmd0xdProgressRsp: ProgressRsp? = null,\n    ) : ProtoBuf {\n        @Serializable\n        internal class ActionInfo(\n            @JvmField @ProtoNumber(1) val serviceName: String = \"\",\n            @JvmField @ProtoNumber(2) val buf: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class FileControl(\n            @JvmField @ProtoNumber(1) val sessionid: Long = 0L,\n            @JvmField @ProtoNumber(2) val operate: Int = 0,\n            @JvmField @ProtoNumber(3) val seq: Int = 0,\n            @JvmField @ProtoNumber(4) val code: Int = 0,\n            @JvmField @ProtoNumber(5) val msg: String = \"\",\n            @JvmField @ProtoNumber(6) val groupId: Int = 0,\n            @JvmField @ProtoNumber(7) val groupCurindex: Int = 0,\n            @JvmField @ProtoNumber(8) val batchID: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class FTNNotify(\n            @JvmField @ProtoNumber(1) val sessionid: Long = 0L,\n            @JvmField @ProtoNumber(2) val fileName: String = \"\",\n            @JvmField @ProtoNumber(3) val fileIndex: String = \"\",\n            @JvmField @ProtoNumber(4) val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n            @JvmField @ProtoNumber(5) val fileKey: String = \"\",\n            @JvmField @ProtoNumber(6) val fileLen: Long = 0L,\n            @JvmField @ProtoNumber(7) val originfileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n            @JvmField @ProtoNumber(8) val originfiletype: Int = 0,\n            @JvmField @ProtoNumber(9) val groupId: Int = 0,\n            @JvmField @ProtoNumber(10) val groupSize: Int = 0,\n            @JvmField @ProtoNumber(11) val groupCurindex: Int = 0,\n            @JvmField @ProtoNumber(20) val msgActionInfo: ActionInfo? = null,\n            @JvmField @ProtoNumber(21) val batchID: Int = 0,\n            @JvmField @ProtoNumber(22) val groupflag: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgItem(\n            @JvmField @ProtoNumber(1) val type: Int = 0,\n            @JvmField @ProtoNumber(2) val text: String = \"\",\n        ) : ProtoBuf\n\n        @Serializable\n        internal class QQDataTextMsg(\n            @JvmField @ProtoNumber(1) val msgItems: List<MsgItem> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class WifiPhotoNoPush(\n            @JvmField @ProtoNumber(1) val json: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class WifiPhotoWithPush(\n            @JvmField @ProtoNumber(1) val json: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class GenericSubCmd(\n            @JvmField @ProtoNumber(1) val sessionid: Long = 0L,\n            @JvmField @ProtoNumber(2) val size: Int = 0,\n            @JvmField @ProtoNumber(3) val index: Int = 0,\n            @JvmField @ProtoNumber(4) val type: Int = 0,\n            @JvmField @ProtoNumber(5) val buf: ByteArray = EMPTY_BYTE_ARRAY,\n            @JvmField @ProtoNumber(6) val supportAuth: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MoloNotify(\n            @JvmField @ProtoNumber(1) val buf: ByteArray = EMPTY_BYTE_ARRAY,\n            @JvmField @ProtoNumber(2) val groupId: Int = 0,\n            @JvmField @ProtoNumber(3) val groupSize: Int = 0,\n            @JvmField @ProtoNumber(4) val groupCurindex: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MpFileNotify(\n            @JvmField @ProtoNumber(1) val sessionid: Long = 0L,\n            @JvmField @ProtoNumber(2) val operate: Int = 0,\n            @ProtoType(ProtoIntegerType.FIXED) @JvmField @ProtoNumber(3) val fixed32Ip: Int = 0,\n            @JvmField @ProtoNumber(4) val port: Int = 0,\n            @JvmField @ProtoNumber(5) val type: Int = 0,\n            @JvmField @ProtoNumber(6) val power: Int = 0,\n            @JvmField @ProtoNumber(7) val json: ByteArray = EMPTY_BYTE_ARRAY,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgHeader(\n            @JvmField @ProtoNumber(1) val srcAppId: Int = 0,\n            @JvmField @ProtoNumber(2) val srcInstId: Int = 0,\n            @JvmField @ProtoNumber(3) val dstAppId: Int = 0,\n            @JvmField @ProtoNumber(4) val dstInstId: Int = 0,\n            @JvmField @ProtoNumber(5) val dstUin: Long = 0L,\n            @JvmField @ProtoNumber(6) val srcUin: Long = 0L,\n            @JvmField @ProtoNumber(7) val srcUinType: Int = 0,\n            @JvmField @ProtoNumber(8) val dstUinType: Int = 0,\n            @JvmField @ProtoNumber(9) val srcTerType: Int = 0,\n            @JvmField @ProtoNumber(10) val dstTerType: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class NFCNotify(\n            @JvmField @ProtoNumber(1) val sessionid: Long = 0L,\n            @JvmField @ProtoNumber(2) val fileName: String = \"\",\n            @JvmField @ProtoNumber(3) val fileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoType(ProtoIntegerType.FIXED) @JvmField @ProtoNumber(4) val fixed32Ip: Int = 0,\n            @JvmField @ProtoNumber(5) val port: Int = 0,\n            @JvmField @ProtoNumber(6) val urlNotify: ByteArray = EMPTY_BYTE_ARRAY,\n            @JvmField @ProtoNumber(7) val tokenkey: ByteArray = EMPTY_BYTE_ARRAY,\n            @JvmField @ProtoNumber(8) val fileLen: Long = 0L,\n            @JvmField @ProtoNumber(9) val originfileMd5: ByteArray = EMPTY_BYTE_ARRAY,\n            @JvmField @ProtoNumber(10) val originfiletype: Int = 0,\n            @JvmField @ProtoNumber(11) val groupId: Int = 0,\n            @JvmField @ProtoNumber(12) val groupSize: Int = 0,\n            @JvmField @ProtoNumber(13) val groupCurindex: Int = 0,\n            @JvmField @ProtoNumber(20) val msgActionInfo: ActionInfo? = null,\n            @JvmField @ProtoNumber(21) val batchID: Int = 0,\n            @JvmField @ProtoNumber(22) val groupflag: Int = 0,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ProgressReq(\n            @JvmField @ProtoNumber(1) val cmd: Int = 0,\n            @JvmField @ProtoNumber(2) val cookie: Long = 0L,\n            @JvmField @ProtoNumber(3) val infoflag: Int = 0,\n            @JvmField @ProtoNumber(4) val uint64Sessionid: List<Long> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ProgressInfo(\n            @JvmField @ProtoNumber(1) val sessionid: Long = 0L,\n            @JvmField @ProtoNumber(2) val progress: Long = 0L,\n            @JvmField @ProtoNumber(3) val status: Int = 0,\n            @JvmField @ProtoNumber(4) val filesize: Long = 0L,\n            @JvmField @ProtoNumber(5) val filename: String = \"\",\n            @JvmField @ProtoNumber(6) val time: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class ProgressRsp(\n            @JvmField @ProtoNumber(1) val cmd: Int = 0,\n            @JvmField @ProtoNumber(2) val cookie: Long = 0L,\n            @JvmField @ProtoNumber(3) val packageCount: Int = 0,\n            @JvmField @ProtoNumber(4) val packageIndex: Int = 0,\n            @JvmField @ProtoNumber(5) val msgProgressinfo: List<ProgressInfo> = emptyList(),\n        ) : ProtoBuf\n\n        @Serializable\n        internal class RNFCNotify(\n            @JvmField @ProtoNumber(1) val sessionid: Long = 0L,\n            @JvmField @ProtoNumber(2) val token: ByteArray = EMPTY_BYTE_ARRAY,\n            @ProtoType(ProtoIntegerType.FIXED) @JvmField @ProtoNumber(3) val fixed32Ip: Int = 0,\n            @JvmField @ProtoNumber(4) val port: Int = 0,\n            @JvmField @ProtoNumber(5) val svrTaskId: Long = 0L,\n        ) : ProtoBuf\n    }\n}\n\n\n@Serializable\ninternal class C2CType0x211SubC2CType0x8 : ProtoBuf {\n    @Serializable\n    internal class BusiReqHead(\n        @JvmField @ProtoNumber(1) val int32Version: Int = 0,\n        @JvmField @ProtoNumber(2) val int32Seq: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class BusiRespHead(\n        @JvmField @ProtoNumber(1) val int32Version: Int = 0,\n        @JvmField @ProtoNumber(2) val int32Seq: Int = 0,\n        @JvmField @ProtoNumber(3) val int32ReplyCode: Int = 0,\n        @JvmField @ProtoNumber(4) val result: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Cell(\n        @JvmField @ProtoNumber(1) val int32Mcc: Int = -1,\n        @JvmField @ProtoNumber(2) val int32Mnc: Int = -1,\n        @JvmField @ProtoNumber(3) val int32Lac: Int = -1,\n        @JvmField @ProtoNumber(4) val int32Cellid: Int = -1,\n        @JvmField @ProtoNumber(5) val int32Rssi: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ConnType(\n        @JvmField @ProtoNumber(1) val type: Int /* enum */ = 1,\n        @JvmField @ProtoNumber(2) val desription: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class GPS(\n        @JvmField @ProtoNumber(1) val int32Lat: Int = 900000000,\n        @JvmField @ProtoNumber(2) val int32Lon: Int = 900000000,\n        @JvmField @ProtoNumber(3) val int32Alt: Int = -10000000,\n        @JvmField @ProtoNumber(4) val eType: Int /* enum */ = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class IPAddrInfo(\n        @JvmField @ProtoNumber(1) val int32Ip: Int = 0,\n        @JvmField @ProtoNumber(2) val int32Mask: Int = 0,\n        @JvmField @ProtoNumber(3) val int32Gateway: Int = 0,\n        @JvmField @ProtoNumber(4) val int32Port: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class JudgeResult(\n        @JvmField @ProtoNumber(1) val type: Int /* enum */ = 0,\n        @JvmField @ProtoNumber(2) val ssid: String = \"\",\n        @JvmField @ProtoNumber(3) val tips: String = \"\",\n        @JvmField @ProtoNumber(4) val int32IdleTimeout: Int = 0,\n        @JvmField @ProtoNumber(5) val idleWaiting: Int = 0,\n        @JvmField @ProtoNumber(6) val forceWifi: Int = 0,\n        @JvmField @ProtoNumber(7) val flagsWifipsw: Int = 0,\n        @JvmField @ProtoNumber(8) val flagsNetcheck: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class LBSInfo(\n        @JvmField @ProtoNumber(1) val msgGps: GPS? = null,\n        @JvmField @ProtoNumber(2) val msgWifis: List<Wifi> = emptyList(),\n        @JvmField @ProtoNumber(3) val msgCells: List<Cell> = emptyList(),\n    ) : ProtoBuf\n\n    @Serializable\n    internal class MsgBody(\n        @JvmField @ProtoNumber(1) val msgType: Int /* enum */ = 1,\n        @JvmField @ProtoNumber(2) val msgCcNotifylist: NotifyList? = null,\n        @JvmField @ProtoNumber(3) val msgCcnfAbiQuery: NearFieldAbiQuery? = null,\n        @JvmField @ProtoNumber(4) val msgCcPushJudgeResult: PushJudgeResult? = null,\n        @JvmField @ProtoNumber(5) val msgCcnfFilesendReq: NearFieldFileSendReq? = null,\n        @JvmField @ProtoNumber(6) val msgCcnfFilestateSync: NearFieldFileStateSync? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NearFieldAbiQuery(\n        @JvmField @ProtoNumber(1) val toUin: Long = 0L,\n        @JvmField @ProtoNumber(2) val fromUin: Long = 0L,\n        @JvmField @ProtoNumber(3) val boolNeedTips: Boolean = false,\n        @JvmField @ProtoNumber(4) val int32Timeout: Int = 0,\n        @JvmField @ProtoNumber(5) val cookie: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(6) val int32PeerIp: Int = 0,\n        @JvmField @ProtoNumber(7) val int32PeerPort: Int = 0,\n        @JvmField @ProtoNumber(8) val peerExtra: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NearFieldFileInfo(\n        @JvmField @ProtoNumber(1) val fileName: String = \"\",\n        @JvmField @ProtoNumber(2) val fileSize: Long = 0L,\n        @JvmField @ProtoNumber(3) val fileMd5: String = \"\",\n        @JvmField @ProtoNumber(4) val fileUrl: String = \"\",\n        @JvmField @ProtoNumber(5) val fileThumbMd5: String = \"\",\n        @JvmField @ProtoNumber(6) val fileThumbUrl: String = \"\",\n        @JvmField @ProtoNumber(7) val sessionId: Long = 0L,\n        @JvmField @ProtoNumber(8) val int32Timeout: Int = 0,\n        @JvmField @ProtoNumber(9) val groupId: Long = 0L,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NearFieldFileSendReq(\n        @JvmField @ProtoNumber(1) val toUin: Long = 0L,\n        @JvmField @ProtoNumber(2) val msgFileList: List<NearFieldFileInfo> = emptyList(),\n        @JvmField @ProtoNumber(3) val int32Ip: Int = 0,\n        @JvmField @ProtoNumber(4) val int32UdpPort: Int = 0,\n        @JvmField @ProtoNumber(5) val ssid: String = \"\",\n        @JvmField @ProtoNumber(6) val int32ConnWifiapTimeout: Int = 0,\n        @JvmField @ProtoNumber(7) val forceWifi: Int = 0,\n        @JvmField @ProtoNumber(8) val wifipsw: String = \"\",\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NearFieldFileStateSync(\n        @JvmField @ProtoNumber(1) val eType: Int /* enum */ = 1,\n        @JvmField @ProtoNumber(2) val sessionId: Long = 0L,\n        @JvmField @ProtoNumber(3) val fromUin: Long = 0L,\n        @JvmField @ProtoNumber(4) val int32ErrorCode: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NearfieldInfo(\n        @JvmField @ProtoNumber(1) val msgLbsInfo: LBSInfo? = null,\n        @JvmField @ProtoNumber(2) val msgConnType: ConnType? = null,\n        @JvmField @ProtoNumber(3) val msgIpInfo: IPAddrInfo? = null,\n        @JvmField @ProtoNumber(4) val msgWifiDetail: WifiDetailInfo? = null,\n        @JvmField @ProtoNumber(5) val msgWifiAbi: WifiAbility? = null,\n        @JvmField @ProtoNumber(6) val extra: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class NotifyList(\n        @JvmField @ProtoNumber(1) val notifyType: Int /* enum */ = 0,\n        @JvmField @ProtoNumber(2) val msgUpdateList: List<UpdateInfo> = emptyList(),\n        @JvmField @ProtoNumber(3) val sessionId: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class PushJudgeResult(\n        @JvmField @ProtoNumber(1) val msgHead: BusiRespHead? = null,\n        @JvmField @ProtoNumber(2) val toUin: Long = 0L,\n        @JvmField @ProtoNumber(3) val msgResult: JudgeResult? = null,\n        @JvmField @ProtoNumber(4) val int32PeerIp: Int = 0,\n        @JvmField @ProtoNumber(5) val int32PeerPort: Int = 0,\n        @JvmField @ProtoNumber(6) val peerExtra: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqAIOJudge(\n        @JvmField @ProtoNumber(1) val msgHead: BusiReqHead? = null,\n        @JvmField @ProtoNumber(2) val toUin: Long = 0L,\n        @JvmField @ProtoNumber(3) val msgNearfieldInfo: NearfieldInfo? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqExit(\n        @JvmField @ProtoNumber(1) val msgHead: BusiReqHead? = null,\n        @JvmField @ProtoNumber(2) val sessionId: Int = 0,\n        @JvmField @ProtoNumber(3) val msgNearfieldInfo: NearfieldInfo? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqGetList(\n        @JvmField @ProtoNumber(1) val msgHead: BusiReqHead? = null,\n        @JvmField @ProtoNumber(2) val msgNearfieldInfo: NearfieldInfo? = null,\n        @JvmField @ProtoNumber(3) val sessionId: Int = 0,\n        @JvmField @ProtoNumber(4) val cookie: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class ReqReportNearFieldAbi(\n        @JvmField @ProtoNumber(1) val msgHead: BusiReqHead? = null,\n        @JvmField @ProtoNumber(2) val fromUin: Long = 0L,\n        @JvmField @ProtoNumber(3) val msgNearfieldInfo: NearfieldInfo? = null,\n        @JvmField @ProtoNumber(4) val cookie: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RespAIOJudge(\n        @JvmField @ProtoNumber(1) val msgHead: BusiRespHead? = null,\n        @JvmField @ProtoNumber(2) val msgResult: JudgeResult? = null,\n        @JvmField @ProtoNumber(3) val timeout: Int = 0,\n        @JvmField @ProtoNumber(4) val toUin: Long = 0L,\n        @JvmField @ProtoNumber(5) val int32PeerIp: Int = 0,\n        @JvmField @ProtoNumber(6) val int32PeerPort: Int = 0,\n        @JvmField @ProtoNumber(7) val peerExtra: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RespExit(\n        @JvmField @ProtoNumber(1) val msgHead: BusiRespHead? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class RespGetList(\n        @JvmField @ProtoNumber(1) val msgHead: BusiRespHead? = null,\n        @JvmField @ProtoNumber(2) val msgUserList: List<UserProfile> = emptyList(),\n        @JvmField @ProtoNumber(3) val sessionId: Int = 0,\n        @JvmField @ProtoNumber(4) val int32UpdateInterval: Int = 0,\n        @JvmField @ProtoNumber(5) val cookie: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class UpdateInfo(\n        @JvmField @ProtoNumber(1) val type: Int /* enum */ = 1,\n        @JvmField @ProtoNumber(2) val msgUser: UserProfile? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class UserAbility(\n        @JvmField @ProtoNumber(1) val int32SysQlver: Int = 0,\n        @JvmField @ProtoNumber(2) val int32SysTerm: Int = 0,\n        @JvmField @ProtoNumber(3) val int32SysApp: Int = 0,\n        @JvmField @ProtoNumber(10) val int32AbsWifiHost: Int = 0,\n        @JvmField @ProtoNumber(11) val int32AbsWifiClient: Int = 0,\n        @JvmField @ProtoNumber(12) val int32AbsWifiForcedcreate: Int = 0,\n        @JvmField @ProtoNumber(13) val int32AbsWifiForcedconnect: Int = 0,\n        @JvmField @ProtoNumber(14) val int32AbsWifiPassword: Int = 0,\n        @JvmField @ProtoNumber(20) val int32AbsNetReachablecheck: Int = 0,\n        @JvmField @ProtoNumber(21) val int32AbsNetSpeedTest: Int = 0,\n        @JvmField @ProtoNumber(30) val int32AbsUiPromptOnclick: Int = 0,\n        @JvmField @ProtoNumber(31) val int32AbsUiPromptPassive: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class UserExtraInfo(\n        @JvmField @ProtoNumber(1) val ability: UserAbility? = null,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class UserProfile(\n        @JvmField @ProtoNumber(1) val uin: Long = 0L,\n        @JvmField @ProtoNumber(2) val int32FaceId: Int = 0,\n        @JvmField @ProtoNumber(3) val int32Sex: Int = 0,\n        @JvmField @ProtoNumber(4) val int32Age: Int = 0,\n        @JvmField @ProtoNumber(5) val nick: String = \"\",\n        @JvmField @ProtoNumber(6) val tmpTalkSig: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(7) val msgResult: JudgeResult? = null,\n        @JvmField @ProtoNumber(8) val int32Ip: Int = 0,\n        @JvmField @ProtoNumber(9) val int32Port: Int = 0,\n        @JvmField @ProtoNumber(10) val tip: ByteArray = EMPTY_BYTE_ARRAY,\n        @JvmField @ProtoNumber(11) val extra: ByteArray = EMPTY_BYTE_ARRAY,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class Wifi(\n        @JvmField @ProtoNumber(1) val mac: Long = 0L,\n        @JvmField @ProtoNumber(2) val int32Rssi: Int = 0,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class WifiAbility(\n        @JvmField @ProtoNumber(1) val boolEstablishAbi: Boolean = false,\n        @JvmField @ProtoNumber(2) val boolAutoConnectAbi: Boolean = false,\n    ) : ProtoBuf\n\n    @Serializable\n    internal class WifiDetailInfo(\n        @JvmField @ProtoNumber(1) val boolSelfEstablish: Boolean = false,\n        @JvmField @ProtoNumber(2) val ssid: String = \"\",\n        @JvmField @ProtoNumber(3) val mac: String = \"\",\n    ) : ProtoBuf\n}\n\n\n@Serializable\ninternal class C2CType0x211SubC2CType0x9 : ProtoBuf {\n    @Serializable\n    internal class MsgBody(\n        @JvmField @ProtoNumber(1) val service: String = \"\",\n        @JvmField @ProtoNumber(2) val cMD: Int = 0,\n        @JvmField @ProtoNumber(3) val msgPrinter: MsgPrinter? = null,\n    ) : ProtoBuf {\n        @Serializable\n        internal class HPPrinterStateInfo(\n            @JvmField @ProtoNumber(1) val printerDin: Long = 0L,\n            @JvmField @ProtoNumber(2) val printerQrPicUrl: String = \"\",\n            @JvmField @ProtoNumber(3) val printerQrOpenUrl: String = \"\",\n            @JvmField @ProtoNumber(4) val printerTipUrl: String = \"\",\n        ) : ProtoBuf\n\n        @Serializable\n        internal class MsgPrinter(\n            @JvmField @ProtoNumber(1) val stringPrinter: List<String> = emptyList(),\n            @JvmField @ProtoNumber(2) val printSessionId: Long = 0L,\n            @JvmField @ProtoNumber(3) val printResult: Int = 0,\n            @JvmField @ProtoNumber(4) val resultMsg: String = \"\",\n            @JvmField @ProtoNumber(5) val uint64SessionId: List<Long> = emptyList(),\n            @JvmField @ProtoNumber(6) val msgSupportFileInfo: List<SupportFileInfo> = emptyList(),\n            @JvmField @ProtoNumber(7) val hpPrinterStateInfo: HPPrinterStateInfo? = null,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class SupportFileInfo(\n            @JvmField @ProtoNumber(1) val fileSuffix: String = \"\",\n            @JvmField @ProtoNumber(2) val copies: Int = 0,\n            @JvmField @ProtoNumber(3) val duplex: Int = 0,\n        ) : ProtoBuf\n    }\n}\n\n\n@Serializable\ninternal class C2CType0x211SubC2CType0xb : ProtoBuf {\n    @Serializable\n    internal class MsgBody(\n        @JvmField @ProtoNumber(1) val msgMsgHeader: MsgHeader? = null,\n        @JvmField @ProtoNumber(2) val msgRejectMotify: RejectNotify? = null,\n    ) : ProtoBuf {\n        @Serializable\n        internal class MsgHeader(\n            @JvmField @ProtoNumber(1) val bodyType: Int /* enum */ = 101,\n            @JvmField @ProtoNumber(2) val sessionType: Int = 0,\n            @JvmField @ProtoNumber(3) val toUin: Long = 0L,\n            @JvmField @ProtoNumber(4) val toMobile: String = \"\",\n            @JvmField @ProtoNumber(5) val roomId: Long = 0L,\n        ) : ProtoBuf\n\n        @Serializable\n        internal class RejectNotify(\n            @JvmField @ProtoNumber(1) val enumRejectReason: Int /* enum */ = 201,\n            @JvmField @ProtoNumber(2) val msg: String = \"\",\n            @JvmField @ProtoNumber(3) val ringFilename: String = \"\",\n        ) : ProtoBuf\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/data/richstatus/RichStatus.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.richstatus\n\nimport kotlin.jvm.JvmField\n\ninternal class RichStatus(\n    @JvmField var actId: Int = 0,\n    @JvmField var actionId: Int = 0,\n    @JvmField var actionText: String? = null,\n\n    @JvmField var dataId: Int = 0,\n    @JvmField var dataText: String? = null,\n\n    @JvmField var feedsId: String? = null,\n\n    @JvmField var fontId: Int = 0,\n    @JvmField var fontType: Int = 0,\n\n\n    @JvmField var key: ByteArray? = null,\n\n    @JvmField var latitude: Int = 0,\n    @JvmField var locationPosition: Int = 0,\n    @JvmField var locationText: String? = null,\n    @JvmField var lontitude: Int = 0,\n\n    // @JvmField var mStickerInfos: MutableList<StickerInfo>? = null,\n    // @JvmField var mUins: MutableList<String>? = null,\n    @JvmField var plainText: MutableList<String>? = null,\n\n    // public HashMap<Integer, /**/> sigZanInfo,\n    @JvmField var signType: Int = 0,\n    @JvmField var time: Long = 0,\n\n    // var topics: MutableList<Pair<Integer, String>> = mutableListOf(),\n    // var topicsPos: MutableList<Pair<Integer, Integer>> = mutableListOf(),\n    @JvmField var tplId: Int = 0,\n    @JvmField var tplType: Int = 0,\n) {\n\n    fun addPlainText(var1: String) {\n        var pts = this.plainText\n        if (pts == null) {\n            pts = mutableListOf()\n            this.plainText = pts\n        }\n        pts.add(var1)\n    }\n\n    companion object {\n        fun parseStatus(rawData: ByteArray?): RichStatus {\n            return parseRichStatusImpl(rawData)\n        }\n    }\n}\n\n\ninternal expect fun parseRichStatusImpl(rawData: ByteArray?): RichStatus"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/EncryptMethod.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.utils.crypto.QQEcdh\nimport net.mamoe.mirai.internal.utils.io.encryptAndWrite\nimport net.mamoe.mirai.internal.utils.io.writeShortLVByteArray\n\ninternal interface EncryptMethod {\n    val id: Int\n\n    fun makeBody(client: QQAndroidClient, body: BytePacketBuilder.() -> Unit): ByteReadPacket\n}\n\ninternal interface EncryptMethodSessionKey : EncryptMethod {\n    override val id: Int get() = 69\n    val currentLoginState: Int\n    val sessionKey: ByteArray\n\n    override fun makeBody(client: QQAndroidClient, body: BytePacketBuilder.() -> Unit): ByteReadPacket =\n        buildPacket {\n            require(currentLoginState == 2 || currentLoginState == 3) { \"currentLoginState must be either 2 or 3\" }\n            writeByte(1) // const\n            writeByte(if (currentLoginState == 2) 3 else 2)\n            writeFully(sessionKey)\n            writeShort(258) // const\n            writeShort(0) // const, length of publicKey\n            encryptAndWrite(sessionKey, body)\n        }\n}\n\ninternal class EncryptMethodSessionKeyNew(\n    val wtSessionTicket: ByteArray, // t133\n    val wtSessionTicketKey: ByteArray, // t134\n) : EncryptMethod {\n    override val id: Int get() = 69\n\n    override fun makeBody(client: QQAndroidClient, body: BytePacketBuilder.() -> Unit): ByteReadPacket =\n        buildPacket {\n            writeShortLVByteArray(wtSessionTicket)\n            encryptAndWrite(wtSessionTicketKey, body)\n        }\n}\n\ninternal class EncryptMethodSessionKeyLoginState2(override val sessionKey: ByteArray) :\n    EncryptMethodSessionKey {\n    override val currentLoginState: Int get() = 2\n}\n\ninternal class EncryptMethodSessionKeyLoginState3(override val sessionKey: ByteArray) :\n    EncryptMethodSessionKey {\n    override val currentLoginState: Int get() = 3\n}\n\ninternal class EncryptMethodEcdh135(override val ecdh: QQEcdh) :\n    EncryptMethodEcdh {\n    override val id: Int get() = 135\n}\n\ninternal class EncryptMethodEcdh7(override val ecdh: QQEcdh) :\n    EncryptMethodEcdh {\n    override val id: Int get() = 7 // 135\n}\n\ninternal interface EncryptMethodEcdh : EncryptMethod {\n    companion object {\n        operator fun invoke(ecdh: QQEcdh): EncryptMethodEcdh {\n            return if (ecdh.fallbackMode) {\n                EncryptMethodEcdh135(ecdh)\n            } else EncryptMethodEcdh7(ecdh)\n        }\n    }\n\n    val ecdh: QQEcdh\n\n    override fun makeBody(client: QQAndroidClient, body: BytePacketBuilder.() -> Unit): ByteReadPacket = buildPacket {\n        /* //new curve p-256\n        writeByte(2) // const\n        writeByte(1) // const\n        writeFully(client.randomKey)\n        writeShort(0x0131) // const\n        writeShort(0x0001)\n         */\n\n        writeByte(2) // version\n        writeByte(1) // const\n        writeFully(client.randomKey)\n        writeShort(0x0131)\n        writeShort(ecdh.version.toShort())// public key version\n        // for p-256, drop(26). // but not really sure.\n        writeShortLVByteArray(ecdh.publicKey)\n        encryptAndWrite(ecdh.initialQQShareKey, body)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/OutgoingPacket.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet\n\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.encodeToByteArray\nimport kotlinx.serialization.protobuf.ProtoBuf\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.*\nimport net.mamoe.mirai.internal.network.components.EcdhInitialPublicKeyUpdater\nimport net.mamoe.mirai.internal.network.components.encryptServiceOrNull\nimport net.mamoe.mirai.internal.network.protocol.data.proto.SSOReserveField\nimport net.mamoe.mirai.internal.network.protocol.packet.sso.TRpcRawPacket\nimport net.mamoe.mirai.internal.spi.EncryptService\nimport net.mamoe.mirai.internal.spi.EncryptServiceContext\nimport net.mamoe.mirai.internal.utils.io.encryptAndWrite\nimport net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf\nimport net.mamoe.mirai.internal.utils.io.writeHex\nimport net.mamoe.mirai.internal.utils.io.writeIntLVPacket\nimport net.mamoe.mirai.utils.*\nimport net.mamoe.mirai.utils.Either.Companion.fold\nimport kotlin.random.Random\n\n@Suppress(\"unused\")\ninternal class OutgoingPacketWithRespType<R : Packet?> constructor(\n    remark: String?,\n    commandName: String,\n    sequenceId: Int,\n    delegate: ByteReadPacket\n) : OutgoingPacket(remark, commandName, sequenceId, delegate)\n\ninternal open class OutgoingPacket constructor(\n    remark: String?,\n    val commandName: String,\n    val sequenceId: Int,\n    delegate: ByteReadPacket\n) {\n    val delegate = delegate.readBytes()\n    val displayName: String = if (remark == null) commandName else \"$commandName($remark)\"\n}\n\ninternal class IncomingPacket private constructor(\n    val commandName: String,\n    val sequenceId: Int,\n\n    val result: Either<Throwable, Packet?> // exception will be the same as caught from PacketFactory.decode. So they can be ISE, NPE, etc.\n) {\n    companion object {\n        operator fun invoke(commandName: String, sequenceId: Int, data: Packet?) =\n            IncomingPacket(commandName, sequenceId, Either(data))\n\n        operator fun invoke(commandName: String, sequenceId: Int, throwable: Throwable) =\n            IncomingPacket(commandName, sequenceId, Either(throwable))\n\n\n        @TestOnly\n        operator fun invoke(commandName: String, data: Packet?) =\n            IncomingPacket(commandName, Random.nextInt(), data)\n\n        @TestOnly\n        operator fun invoke(commandName: String, throwable: Throwable) =\n            IncomingPacket(commandName, Random.nextInt(), throwable)\n    }\n\n    override fun toString(): String {\n        return result.fold(\n            onLeft = { \"IncomingPacket(cmd=$commandName, seq=$sequenceId, FAILURE, e=$it)\" },\n            onRight = { \"IncomingPacket(cmd=$commandName, seq=$sequenceId, SUCCESS, r=$it)\" }\n        )\n    }\n}\n\ninternal enum class PacketEncryptType(val value: Int) {\n    NoEncrypt(0x00) { // 0x00\n        override fun defaultKey(client: QQAndroidClient): ByteArray = NO_ENCRYPT\n    },\n    D2(0x01) { //0x01\n        override fun defaultKey(client: QQAndroidClient): ByteArray {\n            return client.wLoginSigInfo.d2Key\n        }\n    },\n    Empty(0x02) { // 16 zeros,// 0x02\n        override fun defaultKey(client: QQAndroidClient): ByteArray {\n            return KEY_16_ZEROS\n        }\n    },\n    Unknown(-1) {\n        override fun defaultKey(client: QQAndroidClient): ByteArray {\n            error(\"unreachable\")\n        }\n    }\n    ;\n\n    inline val codec: Byte get() = ordinal.toByte()\n\n    abstract fun defaultKey(client: QQAndroidClient): ByteArray\n\n    companion object {\n        internal fun of(value: Int) = enumValues<PacketEncryptType>().find { it.value == value } ?: Unknown\n    }\n}\n\n\n@Suppress(\"DuplicatedCode\")\ninternal fun <R : Packet?> buildRawUniPacket(\n    client: QQAndroidClient,\n    encryptMethod: PacketEncryptType = PacketEncryptType.D2,\n    remark: String?,\n    commandName: String,\n    key: ByteArray = encryptMethod.defaultKey(client),\n    extraData: ByteReadPacket = BRP_STUB,\n    uin: String = client.uin.toString(),\n    sequenceId: Int = client.nextSsoSequenceId(),\n    body: BytePacketBuilder.(sequenceId: Int) -> Unit\n): OutgoingPacketWithRespType<R> {\n\n    return OutgoingPacketWithRespType(remark, commandName, sequenceId, buildPacket {\n        writeIntLVPacket(lengthOffset = { it + 4 }) {\n            writeInt(0x0B) // req type simple\n            writeByte(encryptMethod.codec)\n            writeInt(sequenceId)\n            writeByte(0)\n            uin.let {\n                writeInt(it.length + 4)\n                writeText(it)\n            }\n            val encryptWorker = client.bot.encryptServiceOrNull\n            val bodyBytes = buildPacket { body(sequenceId) }.readBytes()\n            val signDataPacket = if (encryptWorker != null) {\n\n                val signResult = encryptWorker.qSecurityGetSign(\n                    EncryptServiceContext(client.uin),\n                    sequenceId,\n                    commandName,\n                    bodyBytes\n                )\n                if (signResult != null)\n                    buildPacket {\n                        writeProtoBuf(\n                            SSOReserveField.ReserveFields.serializer(),\n                            SSOReserveField.ReserveFields(\n                                flag = 0,\n                                qimei = client.qimei16?.toByteArray() ?: EMPTY_BYTE_ARRAY,\n                                newconnFlag = 0,\n                                uid = client.uin.toString(),\n                                imsi = 0,\n                                networkType = 1,\n                                ipStackType = 1,\n                                messageType = 0,\n                                secInfo = SSOReserveField.SsoSecureInfo(\n                                    secSig = signResult.sign,\n                                    secDeviceToken = signResult.token,\n                                    secExtra = signResult.extra\n                                ),\n                                ssoIpOrigin = 0,\n                            )\n                        )\n                    } else BRP_STUB\n            } else BRP_STUB\n\n            if (signDataPacket != BRP_STUB && (extraData != BRP_STUB && extraData.remaining != 0L)) {\n                throw IllegalStateException(\"$commandName cmd needs sign but has extraData!\")\n            }\n\n            if (encryptMethod === PacketEncryptType.NoEncrypt) {\n                writeUniPacket(\n                    commandName,\n                    client.outgoingPacketSessionId,\n                    if (signDataPacket == BRP_STUB) {\n                        extraData\n                    } else {\n                        signDataPacket\n                    },\n                    (client.qimei16?.encodeToByteArray() ?: EMPTY_BYTE_ARRAY)\n                ) {\n                    writeFully(bodyBytes)\n                }\n            } else {\n                encryptAndWrite(key) {\n                    writeUniPacket(\n                        commandName,\n                        client.outgoingPacketSessionId,\n                        if (signDataPacket == BRP_STUB) {\n                            extraData\n                        } else {\n                            signDataPacket\n                        },\n                        (client.qimei16?.encodeToByteArray() ?: EMPTY_BYTE_ARRAY)\n                    ) {\n                        writeFully(bodyBytes)\n                    }\n                }\n            }\n        }\n    })\n}\n\n@Suppress(\"DuplicatedCode\", \"NOTHING_TO_INLINE\")\ninternal inline fun <R : Packet?> OutgoingPacketFactory<R>.buildOutgoingUniPacket(\n    client: QQAndroidClient,\n    encryptMethod: PacketEncryptType = PacketEncryptType.D2,\n    remark: String? = this.commandName,\n    commandName: String = this.commandName,\n    key: ByteArray = encryptMethod.defaultKey(client),\n    extraData: ByteReadPacket = BRP_STUB,\n    uin: String = client.uin.toString(),\n    sequenceId: Int = client.nextSsoSequenceId(),\n    noinline body: BytePacketBuilder.(sequenceId: Int) -> Unit\n): OutgoingPacketWithRespType<R> =\n    buildRawUniPacket(client, encryptMethod, remark, commandName, key, extraData, uin, sequenceId, body)\n\n@Suppress(\"NOTHING_TO_INLINE\")\ninternal inline fun <R : Packet?> IncomingPacketFactory<R>.buildResponseUniPacket(\n    client: QQAndroidClient,\n    encryptMethod: PacketEncryptType = PacketEncryptType.D2, // 1: PB?\n    remark: String? = this.responseCommandName,\n    commandName: String = this.responseCommandName,\n    key: ByteArray = encryptMethod.defaultKey(client),\n    extraData: ByteReadPacket = BRP_STUB,\n    sequenceId: Int = client.nextSsoSequenceId(),\n    noinline body: BytePacketBuilder.(sequenceId: Int) -> Unit = {}\n): OutgoingPacketWithRespType<R> = buildRawUniPacket(\n    client = client,\n    encryptMethod = encryptMethod,\n    remark = remark,\n    commandName = commandName,\n    key = key,\n    extraData = extraData,\n    sequenceId = sequenceId,\n    body = body\n)\n\n\nprivate inline fun BytePacketBuilder.writeUniPacket(\n    commandName: String,\n    outgoingPacketSessionId: ByteArray,\n    extraData: ByteReadPacket = BRP_STUB,\n    qimei16: ByteArray = EMPTY_BYTE_ARRAY,\n    crossinline body: BytePacketBuilder.() -> Unit\n) {\n    writeIntLVPacket(lengthOffset = { it + 4 }) {\n        commandName.let {\n            writeInt(it.length + 4)\n            writeText(it)\n        }\n\n        writeInt(outgoingPacketSessionId.size + 4)\n        writeFully(outgoingPacketSessionId) //  02 B0 5B 8B\n\n        if (extraData === BRP_STUB) {\n            writeInt(0x04)\n        } else {\n            writeInt((extraData.remaining + 4).toInt())\n            writePacket(extraData)\n        }\n\n        writeInt(qimei16.size + 4)\n        writeFully(qimei16)\n    }\n\n    // body\n    writeIntLVPacket(lengthOffset = { it + 4 }, builder = body)\n}\n\ninternal val NO_ENCRYPT: ByteArray = ByteArray(0)\n\n/**\n * com.tencent.qphone.base.util.CodecWarpper#encodeRequest(int, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, byte[], int, int, java.lang.String, byte, byte, byte, byte[], byte[], boolean)\n */\ninternal fun <R : Packet?> OutgoingPacketFactory<R>.buildLoginOutgoingPacket(\n    client: QQAndroidClient,\n    encryptMethod: PacketEncryptType,\n    uin: String = client.uin.toString(),\n    extraData: ByteArray = if (encryptMethod == PacketEncryptType.D2) client.wLoginSigInfo.d2.data else EMPTY_BYTE_ARRAY,\n    remark: String? = null,\n    commandName: String = this.commandName,\n    key: ByteArray = encryptMethod.defaultKey(client),\n    body: BytePacketBuilder.(sequenceId: Int) -> Unit\n): OutgoingPacketWithRespType<R> {\n    val sequenceId: Int = client.nextSsoSequenceId()\n\n    return OutgoingPacketWithRespType(remark, commandName, sequenceId, buildPacket {\n        writeIntLVPacket(lengthOffset = { it + 4 }) {\n            writeInt(0x00_00_00_0A) // packet login\n            writeByte(encryptMethod.codec) // encrypt type\n\n            extraData.let { // actually d2 key if encryptMethod = d2\n                writeInt(it.size + 4)\n                writeFully(it)\n            }\n\n            writeByte(0x00)\n\n            uin.let {\n                writeInt(it.length + 4)\n                writeText(it)\n            }\n\n            if (encryptMethod == PacketEncryptType.NoEncrypt) {\n                body(sequenceId)\n            } else {\n                encryptAndWrite(key) { body(sequenceId) }\n            }\n        }\n    })\n}\n\nprivate inline val BRP_STUB get() = ByteReadPacket.Empty\n\ninternal fun createChannelProxy(bot: QQAndroidBot): EncryptService.ChannelProxy {\n    return object : EncryptService.ChannelProxy {\n        override suspend fun sendMessage(\n            remark: String,\n            commandName: String,\n            uin: Long,\n            data: ByteArray\n        ): EncryptService.ChannelResult? {\n            if (commandName.startsWith(TRpcRawPacket.COMMAND_PREFIX)) {\n                val client = bot.client\n                val packet = client.bot.network.sendAndExpect(\n                    TRpcRawPacket.buildLoginOutgoingPacket(\n                        client = client,\n                        encryptMethod = PacketEncryptType.Empty,\n                        uin = uin.toString(),\n                        remark = remark,\n                        commandName = commandName,\n                    ) {\n                        writeSsoPacket(\n                            client,\n                            client.subAppId,\n                            sequenceId = it,\n                            commandName = commandName,\n                            body = { writeFully(data) }\n                        )\n                    }\n                )\n                return EncryptService.ChannelResult(commandName, packet.data)\n            }\n            return null\n        }\n    }\n}\n\ninternal fun BytePacketBuilder.writeSsoPacket(\n    client: QQAndroidClient,\n    subAppId: Long,\n    commandName: String,\n    extraData: ByteReadPacket = BRP_STUB,\n    unknownHex: String = \"01 00 00 00 00 00 00 00 00 00 01 00\",\n    sequenceId: Int,\n    body: BytePacketBuilder.() -> Unit\n) {\n\n    /* send\n     * 00 00 00 78\n     * 00 00 94 90\n     * 20 02 ED BD\n     * 20 02 ED BD\n     * 01 00 00 00 00 00 00 00 00 00 01 00\n     * 00 00 00 04\n     * 00 00 00 13 48 65 61 72 74 62 65 61 74 2E 41 6C 69 76 65\n     * 00 00 00 08 59 E7 DF 4F\n     * 00 00 00 13 38 36 35 31 36 36 30 32 36 34 34 36 39 32 35\n     * 00 00 00 04\n     * 00 22 7C 34 36 30 30 30 31 39 31 39 38 37 36 30 32 36 7C 41 38 2E 32 2E 30 2E 32 37 66 36 65 61 39 36\n     * 00 00 00 04\n     *\n     * 00 00 00 04\n     */\n    val encryptWorker = client.bot.encryptServiceOrNull\n    val bodyBytes = buildPacket(body).readBytes()\n    val reserveField = if (encryptWorker != null) {\n\n        val signResult = encryptWorker.qSecurityGetSign(\n            EncryptServiceContext(client.uin),\n            sequenceId,\n            commandName,\n            bodyBytes\n        )\n        if (signResult != null)\n            ProtoBuf.encodeToByteArray(\n                SSOReserveField.ReserveFields(\n                    flag = 0,\n                    qimei = client.qimei16?.toByteArray() ?: EMPTY_BYTE_ARRAY,\n                    newconnFlag = 0,\n                    uid = client.uin.toString(),\n                    imsi = 0,\n                    networkType = 1,\n                    ipStackType = 1,\n                    messageType = 0,\n                    secInfo = SSOReserveField.SsoSecureInfo(\n                        secSig = signResult.sign,\n                        secDeviceToken = signResult.token,\n                        secExtra = signResult.extra\n                    ),\n                    ssoIpOrigin = 0,\n                )\n            ) else EMPTY_BYTE_ARRAY\n    } else EMPTY_BYTE_ARRAY\n\n    writeIntLVPacket(lengthOffset = { it + 4 }) {\n        writeInt(sequenceId)\n        writeInt(subAppId.toInt())\n        writeInt(subAppId.toInt())\n        writeHex(unknownHex)\n        if (extraData === BRP_STUB || extraData.remaining == 0L) {\n            // fast-path\n            writeInt(0x04)\n        } else {\n            writeInt((extraData.remaining + 4).toInt())\n            writePacket(extraData)\n        }\n\n        writeInt(commandName.length + 4)\n        writeText(commandName)\n\n        writeInt(client.outgoingPacketSessionId.size + 4)\n        writeFully(client.outgoingPacketSessionId) //  02 B0 5B 8B\n\n        writeInt(client.device.imei.length + 4)\n        writeText(client.device.imei)\n        writeInt(0x4)\n\n        writeShort((client.ksid.size + 2).toShort())\n        writeFully(client.ksid)\n\n        writeInt(reserveField.size + 4)\n        writeFully(reserveField)\n\n\n        val qimei16Bytes = client.qimei16?.toByteArray() ?: EMPTY_BYTE_ARRAY\n        writeInt(qimei16Bytes.size + 4)\n        writeFully(qimei16Bytes)\n    }\n\n    // body\n    writeIntLVPacket(lengthOffset = { it + 4 }, builder = { writeFully(bodyBytes) })\n}\n\ninternal fun BytePacketBuilder.writeOicqRequestPacket(\n    client: QQAndroidClient,\n    uin: Long = client.uin,\n    encryptMethod: EncryptMethod = EncryptMethodEcdh(client.bot.components[EcdhInitialPublicKeyUpdater].getQQEcdh()),\n    commandId: Int,\n    bodyBlock: BytePacketBuilder.() -> Unit\n) {\n    val body = encryptMethod.makeBody(client, bodyBlock)\n    writeByte(0x02) // head\n    writeShort((27 + 2 + body.remaining).toShort()) // orthodox algorithm\n    writeShort(8001)\n    writeShort(commandId.toShort())\n    writeShort(1) // const??\n    writeInt(uin.toInt())\n    writeByte(3) // originally const\n    writeByte(encryptMethod.id.toByte())\n    writeByte(0) // const8_always_0\n    writeInt(2) // originally const\n    writeInt(client.appClientVersion)\n    writeInt(0) // constp_always_0\n\n    writePacket(body)\n\n    writeByte(0x03) // tail\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/PacketFactory.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.components.PacketCodec\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.*\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.image.ImgStore\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.image.LongConn\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.receive.*\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.video.PttCenterSvr\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.voice.PttStore\nimport net.mamoe.mirai.internal.network.protocol.packet.list.FriendList\nimport net.mamoe.mirai.internal.network.protocol.packet.list.ProfileService\nimport net.mamoe.mirai.internal.network.protocol.packet.list.StrangerList\nimport net.mamoe.mirai.internal.network.protocol.packet.login.ConfigPushSvc\nimport net.mamoe.mirai.internal.network.protocol.packet.login.Heartbeat\nimport net.mamoe.mirai.internal.network.protocol.packet.login.StatSvc\nimport net.mamoe.mirai.internal.network.protocol.packet.login.WtLogin\nimport net.mamoe.mirai.internal.network.protocol.packet.summarycard.ChangeFriendRemark\nimport net.mamoe.mirai.internal.network.protocol.packet.summarycard.SummaryCard\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport net.mamoe.mirai.utils.MiraiLoggerWithSwitch\n\ninternal sealed class PacketFactory<TPacket : Packet?> {\n    /**\n     * 筛选从服务器接收到的包时的 commandName\n     */\n    abstract val receivingCommandName: String\n\n    open val canBeCached: Boolean get() = true\n}\n\n/**\n * 一种客户端主动发送的数据包的处理工厂.\n * 它必须是由客户端主动发送, 产生一个 sequenceId, 然后服务器以相同的 sequenceId 返回.\n * 必须在 [KnownPacketFactories] 中注册工厂, 否则将不能收到回复.\n * 应由一个 `object` 实现, 且实现 `operator fun invoke` 或按 subCommand 或其意义命名的函数来构造 [OutgoingPacket]\n *\n * @param TPacket 服务器回复包解析结果\n */\ninternal abstract class OutgoingPacketFactory<TPacket : Packet?>(\n    /**\n     * 命令名. 如 `wtlogin.login`, `ConfigPushSvc.PushDomain`\n     */\n    val commandName: String\n) : PacketFactory<TPacket>() {\n    final override val receivingCommandName: String get() = commandName\n\n    /**\n     * **解码**服务器的回复数据包. 返回的包若是 [Event], 则会 broadcast.\n     */\n    abstract suspend fun ByteReadPacket.decode(bot: QQAndroidBot): TPacket\n\n    /**\n     * 可选的处理这个包. 可以在这里面发新的包.\n     */\n    open suspend fun QQAndroidBot.handle(packet: TPacket) {}\n}\n\n/**\n * 处理服务器发来的包的工厂.\n * 这个工厂可以在 [handle] 时回复一个 commandId 为 [responseCommandName] 的包, 也可以不回复.\n * 必须先到 [KnownPacketFactories] 中注册工厂, 否则不能处理.\n */\ninternal abstract class IncomingPacketFactory<TPacket : Packet?>(\n    /**\n     * 接收自服务器的包的 commandName\n     */\n    override val receivingCommandName: String,\n    /**\n     * 要返回给服务器的包的 commandName\n     */\n    val responseCommandName: String = \"\"\n) : PacketFactory<TPacket>() {\n    /**\n     * **解码**服务器的回复数据包. 返回的包若是 [Event], 则会 broadcast.\n     */\n    abstract suspend fun ByteReadPacket.decode(bot: QQAndroidBot, sequenceId: Int): TPacket\n\n    /**\n     * 处理解码后的包, 返回一个 [OutgoingPacket] 以发送给服务器, 返回 null 则不作处理.\n     */\n    open suspend fun QQAndroidBot.handle(packet: TPacket, sequenceId: Int): OutgoingPacket? {\n        return null\n    }\n}\n\n@JvmName(\"decode0\")\ninternal suspend inline fun <P : Packet?> OutgoingPacketFactory<P>.decode(\n    bot: QQAndroidBot,\n    packet: ByteReadPacket\n): P =\n    packet.decode(bot)\n\n@JvmName(\"decode1\")\ninternal suspend inline fun <P : Packet?> IncomingPacketFactory<P>.decode(\n    bot: QQAndroidBot,\n    packet: ByteReadPacket,\n    sequenceId: Int\n): P = packet.decode(bot, sequenceId)\n\n/**\n * 数据包相关的调试输出.\n * 它默认是关闭的.\n */\n@Deprecated(\n    \"Kept for binary compatibility.\",\n    ReplaceWith(\"PacketCodec.PacketLogger\", \"net.mamoe.mirai.internal.network.components.PacketCodec\"),\n    level = DeprecationLevel.HIDDEN,\n)\n@PublishedApi\n@DeprecatedSinceMirai(hiddenSince = \"2.7\")\ninternal val PacketLogger: MiraiLoggerWithSwitch\n    get() = PacketCodec.PacketLogger\n\n/**\n * Registered factories.\n */\ninternal object KnownPacketFactories {\n    object OutgoingFactories : List<OutgoingPacketFactory<*>> by mutableListOf(\n        WtLogin.Login,\n        WtLogin.ExchangeEmp,\n        WtLogin.TransEmp,\n        StatSvc.Register,\n        StatSvc.GetOnlineStatus,\n        StatSvc.SimpleGet,\n        StatSvc.GetDevLoginInfo,\n        MessageSvcPbGetMsg,\n        MessageSvcPushForceOffline,\n        MessageSvcPbSendMsg,\n        MessageSvcPbDeleteMsg,\n        MessageSvcPbGetRoamMsgReq,\n        MessageSvcPbGetGroupMsg,\n        FriendList.GetFriendGroupList,\n        FriendList.DelFriend,\n        FriendList.GetTroopListSimplify,\n        FriendList.GetTroopMemberList,\n        FriendList.SetGroupReqPack,\n        FriendList.MoveGroupMemReqPack,\n        ImgStore.GroupPicUp,\n        PttStore.GroupPttUp,\n        PttStore.GroupPttDown,\n        PttStore.C2CPttDown,\n        PttCenterSvr.GroupShortVideoUpReq,\n        PttCenterSvr.ShortVideoDownReq,\n        LongConn.OffPicUp,\n//        LongConn.OffPicDown,\n        TroopManagement.EditSpecialTitle,\n        TroopManagement.Mute,\n        TroopManagement.GroupOperation,\n        TroopManagement.GetTroopConfig,\n        TroopManagement.ModifyAdmin,\n        TroopManagement.GetGroupLastMsgSeq,\n        //  TroopManagement.GetGroupInfo,\n        TroopManagement.EditGroupNametag,\n        TroopManagement.Kick,\n        TroopManagement.SwitchAnonymousChat,\n        TroopEssenceMsgManager.SetEssence,\n        TroopEssenceMsgManager.RemoveEssence,\n        NudgePacket,\n        Heartbeat.Alive,\n        PbMessageSvc.PbMsgWithDraw,\n        MultiMsg.ApplyUp,\n        MultiMsg.ApplyDown,\n        NewContact.SystemMsgNewFriend,\n        NewContact.SystemMsgNewGroup,\n        ProfileService.GroupMngReq,\n        StrangerList.GetStrangerList,\n        StrangerList.DelStranger,\n        SummaryCard.ReqSummaryCard,\n        ChangeFriendRemark,\n        MusicSharePacket,\n        *FileManagement.factories\n    )\n\n    object IncomingFactories : List<IncomingPacketFactory<*>> by mutableListOf(\n        OnlinePushPbPushGroupMsg,\n        OnlinePushReqPush,\n        OnlinePushPbPushTransMsg,\n        OnlinePushSidExpired,\n        MessageSvcPushNotify,\n        MessageSvcPushReaded,\n        MessageSvcRequestPushStatus,\n        ConfigPushSvc.PushReq,\n        PbC2CMsgSync,\n        StatSvc.ReqMSFOffline,\n        StatSvc.SvcReqMSFLoginNotify\n    )\n    // SvcReqMSFLoginNotify 自己的其他设备上限\n    // MessageSvcPushReaded 电脑阅读了别人的消息, 告知手机\n    // OnlinePush.PbC2CMsgSync 电脑发消息给别人, 同步给手机\n\n    fun findPacketFactory(commandName: String): PacketFactory<*>? {\n        return OutgoingFactories.firstOrNull { it.receivingCommandName == commandName }\n            ?: IncomingFactories.firstOrNull { it.receivingCommandName == commandName }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/Tlv.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage net.mamoe.mirai.internal.network.protocol.packet\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.network.*\nimport net.mamoe.mirai.internal.network.components.encryptServiceOrNull\nimport net.mamoe.mirai.internal.network.protocol.LoginType\nimport net.mamoe.mirai.internal.spi.EncryptServiceContext\nimport net.mamoe.mirai.internal.utils.GuidSource\nimport net.mamoe.mirai.internal.utils.MacOrAndroidIdChangeFlag\nimport net.mamoe.mirai.internal.utils.NetworkType\nimport net.mamoe.mirai.internal.utils.guidFlag\nimport net.mamoe.mirai.internal.utils.io.encryptAndWrite\nimport net.mamoe.mirai.internal.utils.io.writeShortLVByteArray\nimport net.mamoe.mirai.internal.utils.io.writeShortLVByteArrayLimitedLength\nimport net.mamoe.mirai.internal.utils.io.writeShortLVString\nimport net.mamoe.mirai.utils.*\nimport kotlin.random.Random\n\nprivate val Char.isHumanReadable get() = this in '0'..'9' || this in 'a'..'z' || this in 'A'..'Z' || this in \"\"\" <>?,.\";':/\\][{}~!@#$%^&*()_+-=`\"\"\" || this in \"\\n\\r\"\n\ninternal fun TlvMap.smartToString(leadingLineBreak: Boolean = true, sorted: Boolean = true): String {\n    fun ByteArray.valueToString(): String {\n        val str = this.decodeToString()\n        return if (str.all { it.isHumanReadable }) str\n        else this.toUHexString()\n    }\n\n    val map = if (sorted) entries.sortedBy { it.key } else this.entries\n\n    return buildString {\n        if (leadingLineBreak) appendLine()\n        appendLine(\"count=${map.size}\")\n        appendLine(map.joinToString(\"\\n\") { (key, value) ->\n            \"0x\" + key.toShort().toUHexString(\"\") + \" = \" + value.valueToString()\n        })\n    }\n}\n\n/**\n * 显式表示一个 [ByteArray] 是一个 tlv 的 body\n */\n@JvmInline\ninternal value class Tlv(val value: ByteArray)\n\ninternal fun TlvMapWriter.t1(uin: Long, timeSeconds: Int, ipv4: ByteArray) {\n    require(ipv4.size == 4) { \"ip.size must == 4\" }\n\n    tlv(0x01) {\n        writeShort(1) // _ip_ver\n        writeInt(Random.nextInt())\n        writeInt(uin.toInt())\n        writeInt(timeSeconds)\n        writeFully(ipv4)\n        writeShort(0)\n    }\n}\n\ninternal fun TlvMapWriter.t2(captchaCode: String, captchaToken: ByteArray, sigVer: Short = 0) {\n    tlv(0x02) {\n        writeShort(sigVer)\n        writeShortLVString(captchaCode)\n        writeShortLVByteArray(captchaToken)\n    }\n}\n\ninternal fun TlvMapWriter.t8(\n    localId: Int = 2052\n) {\n    tlv(0x08) {\n        writeShort(0)\n        writeInt(localId) // localId\n        writeShort(0)\n    }\n}\n\ninternal fun TlvMapWriter.t16(\n    ssoVersion: Int,\n    subAppId: Long,\n    guid: ByteArray,\n    apkId: ByteArray,\n    apkVersionName: ByteArray,\n    apkSignatureMd5: ByteArray\n) {\n    tlv(0x16) {\n        writeInt(ssoVersion)\n        writeInt(16)\n        writeInt(subAppId.toInt())\n        writeFully(guid)\n        writeShortLVByteArray(apkId)\n        writeShortLVByteArray(apkVersionName)\n        writeShortLVByteArray(apkSignatureMd5)\n    }\n}\n\ninternal fun TlvMapWriter.t18(\n    appId: Long,\n    appClientVersion: Int = 0,\n    uin: Long,\n    constant1_always_0: Int = 0\n) {\n    tlv(0x18) {\n        writeShort(1) //_ping_version\n        writeInt(0x00_00_06_00) //_sso_version=1536\n        writeInt(appId.toInt())\n        writeInt(appClientVersion)\n        writeInt(uin.toInt())\n        writeShort(constant1_always_0.toShort())\n        writeShort(0)\n    }\n}\n\ninternal fun TlvMapWriter.t1b(\n    micro: Int = 0,\n    version: Int = 0,\n    size: Int = 3,\n    margin: Int = 4,\n    dpi: Int = 72,\n    ecLevel: Int = 2,\n    hint: Int = 2\n) {\n    tlv(0x1b) {\n        writeInt(micro)\n        writeInt(version)\n        writeInt(size)\n        writeInt(margin)\n        writeInt(dpi)\n        writeInt(ecLevel)\n        writeInt(hint)\n        writeShort(0)\n    }\n}\n\ninternal fun TlvMapWriter.t1d(\n    miscBitmap: Int,\n) {\n    tlv(0x1d) {\n        writeByte(1)\n        writeInt(miscBitmap)\n        writeInt(0)\n        writeByte(0)\n        writeInt(0)\n    }\n}\n\ninternal fun TlvMapWriter.t1f(\n    isRoot: Boolean = false,\n    osName: ByteArray,\n    osVersion: ByteArray,\n    simVendor: ByteArray,\n    apn: ByteArray,\n    networkType: Short = 2,\n) {\n    tlv(0x1f) {\n        writeByte(if (isRoot) 1 else 0)\n        writeShortLVByteArray(osName)\n        writeShortLVByteArray(osVersion)\n        writeShort(networkType)\n        writeShortLVByteArray(simVendor)\n        writeShortLVByteArray(EMPTY_BYTE_ARRAY)\n        writeShortLVByteArray(apn)\n    }\n}\n\ninternal fun TlvMapWriter.t33(\n    guid: ByteArray,\n) {\n    tlv(0x33, guid)\n}\n\ninternal fun TlvMapWriter.t35(\n    productType: Int\n) {\n    tlv(0x35) {\n        writeInt(productType)\n    }\n}\n\ninternal fun TlvMapWriter.t106(\n    client: QQAndroidClient,\n    appId: Long = 16L,\n    passwordMd5: ByteArray,\n) {\n    return t106(\n        appId,\n        client.subAppId /* maybe 1*/,\n        client.appClientVersion,\n        client.uin,\n        client.device.ipAddress,\n        true,\n        passwordMd5,\n        0,\n        client.uin.toByteArray(),\n        client.tgtgtKey,\n        true,\n        client.device.guid,\n        LoginType.PASSWORD,\n        client.ssoVersion\n    )\n}\n\ninternal fun TlvMapWriter.t106(\n    encryptA1: ByteArray\n) {\n    tlv(0x106) {\n        writeFully(encryptA1)\n    }\n}\n\n/**\n * A1\n */\ninternal fun TlvMapWriter.t106(\n    appId: Long = 16L,\n    subAppId: Long,\n    appClientVersion: Int = 0,\n    uin: Long,\n    ipv4: ByteArray,\n    isSavePassword: Boolean = true,\n    passwordMd5: ByteArray,\n    salt: Long,\n    uinAccountString: ByteArray,\n    tgtgtKey: ByteArray,\n    isGuidAvailable: Boolean = true,\n    guid: ByteArray?,\n    loginType: LoginType,\n    ssoVersion: Int,\n) {\n    passwordMd5.requireSize(16)\n    tgtgtKey.requireSize(16)\n    guid?.requireSize(16)\n    ipv4.requireSize(4)\n\n    tlv(0x106) {\n        encryptAndWrite(\n            (passwordMd5 + ByteArray(4) + (salt.takeIf { it != 0L } ?: uin).toInt()\n                .toByteArray()).md5()\n        ) {\n            writeShort(4)//TGTGTVer\n            writeInt(Random.nextInt())\n            writeInt(ssoVersion)//ssoVer\n            writeInt(appId.toInt())\n            writeInt(appClientVersion)\n\n            if (uin == 0L) {\n                writeLong(salt)\n            } else {\n                writeLong(uin)\n            }\n\n            writeInt(currentTimeSeconds().toInt())\n            writeFully(ipv4) //\n            writeByte(isSavePassword.toByte())\n            writeFully(passwordMd5)\n            writeFully(tgtgtKey)\n            writeInt(0) // wtf\n            writeByte(isGuidAvailable.toByte())\n            if (isGuidAvailable) {\n                require(guid != null) { \"Guid must not be null when isGuidAvailable==true\" }\n            }\n            if (guid == null) {\n                repeat(4) {\n                    writeInt(Random.nextInt())\n                }\n            } else {\n                writeFully(guid)\n            }\n            writeInt(subAppId.toInt())\n            writeInt(loginType.value)\n            writeShortLVByteArray(uinAccountString)\n            writeShort(0)\n        }\n    }\n}\n\ninternal fun TlvMapWriter.t116(\n    miscBitmap: Int,\n    subSigMap: Int,\n    appIdList: LongArray = longArrayOf(1600000226L)\n) {\n    tlv(0x116) {\n        writeByte(0) // _ver\n        writeInt(miscBitmap) // 184024956\n        writeInt(subSigMap) // 66560\n        writeByte(appIdList.size.toByte())\n        appIdList.forEach {\n            writeInt(it.toInt())\n        }\n    }\n}\n\n\ninternal fun TlvMapWriter.t100(\n    appId: Long = 16,\n    subAppId: Long,\n    appClientVersion: Int,\n    ssoVersion: Int,\n    mainSigMap: Int\n) {\n    tlv(0x100) {\n        writeShort(1)//db_buf_ver\n        writeInt(ssoVersion)//sso_ver\n        writeInt(appId.toInt())\n        writeInt(subAppId.toInt())\n        writeInt(appClientVersion)\n        writeInt(mainSigMap) // sigMap, 34869472?\n    }\n}\n\ninternal fun TlvMapWriter.t10a(\n    tgt: ByteArray,\n) {\n    tlv(0x10a) {\n        writeFully(tgt)\n    }\n}\n\n\ninternal fun TlvMapWriter.t107(\n    picType: Int,\n    capType: Int = 0,\n    picSize: Int = 0,\n    retType: Int = 1\n) {\n    tlv(0x107) {\n        writeShort(picType.toShort())\n        writeByte(capType.toByte())\n        writeShort(picSize.toShort())\n        writeByte(retType.toByte())\n    }\n}\n\ninternal fun TlvMapWriter.t108(\n    ksid: ByteArray\n) {\n    // require(ksid.size == 16) { \"ksid should length 16\" }\n    tlv(0x108) {\n        writeFully(ksid)\n    }\n}\n\ninternal fun TlvMapWriter.t104(\n    t104Data: ByteArray\n) {\n    tlv(0x104) {\n        writeFully(t104Data)\n    }\n}\n\ninternal fun TlvMapWriter.t547(\n    t547Data: ByteArray\n) {\n    tlv(0x547) {\n        writeFully(t547Data)\n    }\n}\n\ninternal fun TlvMapWriter.t174(\n    t174Data: ByteArray\n) {\n    tlv(0x174) {\n        writeFully(t174Data)\n    }\n}\n\n\ninternal fun TlvMapWriter.t17a(\n    smsAppId: Int = 0\n) {\n    tlv(0x17a) {\n        writeInt(smsAppId)\n    }\n}\n\ninternal fun TlvMapWriter.t197(\n    devLockMobileType: Byte = 0\n) {\n    tlv(0x197) {\n        writeByte(devLockMobileType)\n    }\n}\n\ninternal fun TlvMapWriter.t198() {\n    tlv(0x198) {\n        writeByte(0)\n    }\n}\n\ninternal fun TlvMapWriter.t19e(\n    value: Int = 0\n) {\n    tlv(0x19e) {\n        writeShort(1)\n        writeByte(value.toByte())\n    }\n}\n\ninternal fun TlvMapWriter.t17c(\n    t17cData: ByteArray\n) {\n    tlv(0x17c) {\n        writeShort(t17cData.size.toShort())\n        writeFully(t17cData)\n    }\n}\n\ninternal fun TlvMapWriter.t401(\n    t401Data: ByteArray\n) {\n    tlv(0x401) {\n        writeFully(t401Data)\n    }\n}\n\n/**\n * @param apkId application.getPackageName().getBytes()\n */\ninternal fun TlvMapWriter.t142(\n    apkId: ByteArray\n) {\n    tlv(0x142) {\n        writeShort(0) //_version\n        writeShortLVByteArrayLimitedLength(apkId, 32)\n    }\n}\n\ninternal fun TlvMapWriter.t143(\n    d2: ByteArray\n) {\n    tlv(0x143) {\n        writeFully(d2)\n    }\n}\n\ninternal fun TlvMapWriter.t112(\n    nonNumberUin: ByteArray\n) {\n    tlv(0x112) {\n        writeFully(nonNumberUin)\n    }\n}\n\ninternal fun TlvMapWriter.t144(\n    client: QQAndroidClient\n) {\n    return t144(\n        androidId = client.device.androidId,\n        androidDevInfo = client.device.generateDeviceInfoData(),\n        osType = client.device.osType,\n        osVersion = client.device.version.release,\n        networkType = client.networkType,\n        simInfo = client.device.simInfo,\n        unknown = byteArrayOf(),\n        apn = client.device.apn,\n        isGuidFromFileNull = false,\n        isGuidAvailable = true,\n        isGuidChanged = false,\n        guidFlag = guidFlag(GuidSource.FROM_STORAGE, MacOrAndroidIdChangeFlag(0)),\n        buildModel = client.device.model,\n        guid = client.device.guid,\n        buildBrand = client.device.brand,\n        tgtgtKey = client.tgtgtKey\n    )\n}\n\ninternal fun TlvMapWriter.t144(\n    // t109\n    androidId: ByteArray,\n\n    // t52d\n    androidDevInfo: ByteArray,\n\n    // t124\n    osType: ByteArray = \"android\".toByteArray(),\n    osVersion: ByteArray,\n    networkType: NetworkType,\n    simInfo: ByteArray,\n    unknown: ByteArray,\n    apn: ByteArray = \"wifi\".toByteArray(),\n\n    // t128\n    isGuidFromFileNull: Boolean = false,\n    isGuidAvailable: Boolean = true,\n    isGuidChanged: Boolean = false,\n    guidFlag: Long,\n    buildModel: ByteArray,\n    guid: ByteArray,\n    buildBrand: ByteArray,\n\n    // encrypt\n    tgtgtKey: ByteArray\n) {\n    tlv(0x144) {\n        encryptAndWrite(tgtgtKey) {\n            _writeTlvMap {\n                t109(androidId)\n                t52d(androidDevInfo)\n                t124(osType, osVersion, networkType, simInfo, unknown, apn)\n                t128(isGuidFromFileNull, isGuidAvailable, isGuidChanged, guidFlag, buildModel, guid, buildBrand)\n                t16e(buildModel)\n            }\n        }\n    }\n}\n\n\ninternal fun TlvMapWriter.t109(\n    androidId: ByteArray\n) {\n    tlv(0x109) {\n        writeFully(androidId.md5())\n    }\n}\n\ninternal fun TlvMapWriter.t52d(\n    androidDevInfo: ByteArray // oicq.wlogin_sdk.tools.util#get_android_dev_info\n) {\n    tlv(0x52d) {\n        writeFully(androidDevInfo)\n\n        // 0A  07  75  6E  6B  6E  6F  77  6E  12  7E  4C  69  6E  75  78  20  76  65  72  73  69  6F  6E  20  34  2E  39  2E  33  31  20  28  62  75  69  6C  64  40  42  75  69  6C  64  32  29  20  28  67  63  63  20  76  65  72  73  69  6F  6E  20  34  2E  39  20  32  30  31  35  30  31  32  33  20  28  70  72  65  72  65  6C  65  61  73  65  29  20  28  47  43  43  29  20  29  20  23  31  20  53  4D  50  20  50  52  45  45  4D  50  54  20  54  68  75  20  44  65  63  20  31  32  20  31  35  3A  33  30  3A  35  35  20  49  53  54  20  32  30  31  39  1A  03  52  45  4C  22  03  33  32  37  2A  41  4F  6E  65  50  6C  75  73  2F  4F  6E  65  50  6C  75  73  35  2F  4F  6E  65  50  6C  75  73  35  3A  37  2E  31  2E  31  2F  4E  4D  46  32  36  58  2F  31  30  31  37  31  36  31  37  3A  75  73  65  72  2F  72  65  6C  65  61  73  65  2D  6B  65  79  73  32  24  36  63  39  39  37  36  33  66  2D  66  62  34  32  2D  34  38  38  31  2D  62  37  32  65  2D  63  37  61  61  38  61  36  63  31  63  61  34  3A  10  65  38  63  37  30  35  34  64  30  32  66  33  36  33  64  30  42  0A  6E  6F  20  6D  65  73  73  61  67  65  4A  03  33  32  37\n\n    }\n}\n\ninternal fun TlvMapWriter.t124(\n    osType: ByteArray = \"android\".toByteArray(),\n    osVersion: ByteArray, // Build.VERSION.RELEASE.toByteArray()\n    networkType: NetworkType,  //oicq.wlogin_sdk.tools.util#get_network_type\n    simInfo: ByteArray, // oicq.wlogin_sdk.tools.util#get_sim_operator_name\n    address: ByteArray, // always new byte[0]\n    apn: ByteArray = \"wifi\".toByteArray() // oicq.wlogin_sdk.tools.util#get_apn_string\n) {\n    tlv(0x124) {\n        writeShortLVByteArrayLimitedLength(osType, 16)\n        writeShortLVByteArrayLimitedLength(osVersion, 16)\n        writeShort(networkType.value.toShort())\n        writeShortLVByteArrayLimitedLength(simInfo, 16)\n        writeShortLVByteArrayLimitedLength(address, 32)\n        writeShortLVByteArrayLimitedLength(apn, 16)\n    }\n}\n\ninternal fun TlvMapWriter.t128(\n    isGuidFromFileNull: Boolean = false, // 保存到文件的 GUID 是否为 null\n    isGuidAvailable: Boolean = true, // GUID 是否可用(计算/读取成功)\n    isGuidChanged: Boolean = false, // GUID 是否有变动\n    /**\n     * guidFlag:\n     * ```java\n     * GUID_FLAG = 0;\n     * GUID_FLAG |= GUID_SRC << 24 & 0xFF000000;\n     * GUID_FLAG |= FLAG_MAC_ANDROIDID_GUID_CHANGE << 8 & 0xFF00;\n     * ```\n     *\n     *\n     * GUID_SRC:\n     * 0: 初始值;\n     * 1: 以前保存的文件;\n     * 20: 以前没保存且现在生成失败;\n     * 17: 以前没保存但现在生成成功;\n     *\n     *\n     * FLAG_MAC_ANDROIDID_GUID_CHANGE:\n     * ```java\n     * if (!Arrays.equals(currentMac, get_last_mac)) {\n     *     oicq.wlogin_sdk.request.t.FLAG_MAC_ANDROIDID_GUID_CHANGEMENT |= 0x1;\n     * }\n     * if (!Arrays.equals(currentAndroidId, get_last_android_id)) {\n     *     oicq.wlogin_sdk.request.t.FLAG_MAC_ANDROIDID_GUID_CHANGEMENT |= 0x2;\n     * }\n     * if (!Arrays.equals(currentGuid, get_last_guid)) {\n     *     oicq.wlogin_sdk.request.t.FLAG_MAC_ANDROIDID_GUID_CHANGEMENT |= 0x4;\n     * }\n     * ```\n     */\n    guidFlag: Long,\n    buildModel: ByteArray,  // android.os.Build.MODEL\n    /**\n     * defaults `\"%4;7t>;28<fc.5*6\".toByteArray()`\n     */\n    guid: ByteArray,\n    buildBrand: ByteArray // android.os.Build.BRAND\n) {\n    tlv(0x128) {\n        writeShort(0)\n        writeByte(isGuidFromFileNull.toByte())\n        writeByte(isGuidAvailable.toByte())\n        writeByte(isGuidChanged.toByte())\n        writeInt(guidFlag.toInt()) // 11 00 00 00\n        writeShortLVByteArrayLimitedLength(buildModel, 32)\n        writeShortLVByteArrayLimitedLength(guid, 16)\n        writeShortLVByteArrayLimitedLength(buildBrand, 16)\n    }\n}\n\ninternal fun TlvMapWriter.t16e(\n    buildModel: ByteArray\n) {\n    tlv(0x16e) {\n        writeFully(buildModel)\n    }\n}\n\ninternal fun TlvMapWriter.t145(\n    guid: ByteArray\n) {\n    tlv(0x145) {\n        writeFully(guid)\n    }\n}\n\ninternal fun TlvMapWriter.t147(\n    appId: Long,\n    apkVersionName: ByteArray,\n    apkSignatureMd5: ByteArray\n) {\n    tlv(0x147) {\n        writeInt(appId.toInt())\n        writeShortLVByteArrayLimitedLength(apkVersionName, 32)\n        writeShortLVByteArrayLimitedLength(apkSignatureMd5, 32)\n    }\n}\n\ninternal fun TlvMapWriter.t166(\n    imageType: Int\n) {\n    tlv(0x166) {\n        writeByte(imageType.toByte())\n    }\n}\n\ninternal fun TlvMapWriter.t16a(\n    noPicSig: ByteArray // unknown source\n) {\n    tlv(0x16a) {\n        writeFully(noPicSig)\n    }\n}\n\ninternal fun TlvMapWriter.t154(\n    ssoSequenceId: Int // starts from 0\n) {\n    tlv(0x154) {\n        writeInt(ssoSequenceId)\n    }\n}\n\ninternal fun TlvMapWriter.t141(\n    simInfo: ByteArray,\n    networkType: NetworkType,\n    apn: ByteArray\n) {\n    tlv(0x141) {\n        writeShort(1) // version\n        writeShortLVByteArray(simInfo)\n        writeShort(networkType.value.toShort())\n        writeShortLVByteArray(apn)\n    }\n}\n\ninternal fun TlvMapWriter.t511(\n    domains: List<String> = listOf(\n        \"tenpay.com\",\n        \"openmobile.qq.com\",\n        \"docs.qq.com\",\n        \"connect.qq.com\",\n        \"qzone.qq.com\",\n        \"vip.qq.com\",\n        \"gamecenter.qq.com\",\n        \"qun.qq.com\",\n        \"game.qq.com\",\n        \"qqweb.qq.com\",\n        \"office.qq.com\",\n        \"ti.qq.com\",\n        \"mail.qq.com\",\n        \"mma.qq.com\",\n    )\n) {\n    tlv(0x511) {\n        val list = domains.filter { it.isNotEmpty() }\n        writeShort(list.size.toShort())\n        list.forEach { element ->\n            if (element.startsWith('(')) {\n                val split = element.drop(1).split(')')\n\n                val flag = split[0].toInt()\n                var n = (flag and 0x100000 > 0).toInt()\n                if (flag and 0x8000000 > 0) {\n                    n = n or 0x2\n                }\n                writeByte(n.toByte())\n\n                writeShortLVString(split[1])\n            } else {\n                writeByte(1)\n                writeShortLVString(element)\n            }\n        }\n    }\n}\n\ninternal fun TlvMapWriter.t172(\n    rollbackSig: ByteArray // 由服务器发来的 tlv_t172 获得\n) {\n    tlv(0x172) {\n        writeFully(rollbackSig)\n    }\n}\n\ninternal fun TlvMapWriter.t185() {\n    tlv(0x185) {\n        writeByte(1)\n        writeByte(1)\n    }\n}\n\ninternal fun TlvMapWriter.t400(\n    /**\n     *  if (var1[2] != null && var1[2].length > 0) {\n    this._G = (byte[])var1[2].clone();\n    }\n     */\n    g: ByteArray, // 用于加密这个 tlv\n    uin: Long,\n    guid: ByteArray,\n    dpwd: ByteArray,\n    appId: Long,\n    subAppId: Long,\n    randomSeed: ByteArray\n) {\n    tlv(0x400) {\n        encryptAndWrite(g) {\n            writeByte(1) // version\n            writeLong(uin)\n            writeFully(guid)\n            writeFully(dpwd)\n            writeInt(appId.toInt())\n            writeInt(subAppId.toInt())\n            writeInt(currentTimeSeconds().toInt())\n            writeFully(randomSeed)\n        }\n    }\n}\n\n\ninternal fun TlvMapWriter.t187(\n    macAddress: ByteArray\n) {\n    tlv(0x187) {\n        writeFully(macAddress.md5()) // may be md5\n    }\n}\n\n\ninternal fun TlvMapWriter.t188(\n    androidId: ByteArray\n) {\n    tlv(0x188) {\n        writeFully(androidId.md5())\n    }\n}\n\ninternal fun TlvMapWriter.t193(\n    ticket: String\n) {\n    tlv(0x193) {\n        writeFully(ticket.toByteArray())\n    }\n}\n\ninternal fun TlvMapWriter.t194(\n    imsiMd5: ByteArray\n) {\n    imsiMd5 requireSize 16\n\n    tlv(0x194) {\n        writeFully(imsiMd5)\n    }\n}\n\ninternal fun TlvMapWriter.t191(\n    K: Int = 0x82\n) {\n    tlv(0x191) {\n        writeByte(K.toByte())\n    }\n}\n\ninternal fun TlvMapWriter.t201(\n    L: ByteArray = byteArrayOf(), // unknown\n    channelId: ByteArray = byteArrayOf(),\n    clientType: ByteArray = \"qq\".toByteArray(),\n    N: ByteArray\n) {\n    tlv(0x201) {\n        writeShortLVByteArray(L)\n        writeShortLVByteArray(channelId)\n        writeShortLVByteArray(clientType)\n        writeShortLVByteArray(N)\n    }\n}\n\ninternal fun TlvMapWriter.t202(\n    wifiBSSID: ByteArray,\n    wifiSSID: ByteArray\n) {\n    tlv(0x202) {\n        writeShortLVByteArrayLimitedLength(wifiBSSID, 16)\n        writeShortLVByteArrayLimitedLength(wifiSSID, 32)\n    }\n}\n\ninternal fun TlvMapWriter.t177(\n    buildTime: Long = 1571193922L, // wtLogin BuildTime\n    buildVersion: String = \"6.0.0.2413\" // wtLogin SDK Version\n) {\n    tlv(0x177) {\n        writeByte(1)\n        writeInt(buildTime.toInt())\n        writeShortLVString(buildVersion)\n    } // shouldEqualsTo 0x11\n}\n\ninternal fun TlvMapWriter.t516( // 1302\n    sourceType: Int = 0 // always 0\n) {\n    tlv(0x516) {\n        writeInt(sourceType)\n    }\n}\n\ninternal fun TlvMapWriter.t521( // 1313\n    productType: Int = 0, // coz setProductType is never used\n    unknown: Short = 0 // const\n) {\n    tlv(0x521) {\n        writeInt(productType)\n        writeShort(unknown)\n    }\n}\n\ninternal fun TlvMapWriter.t52c(\n    // ?\n) {\n    tlv(0x52c) {\n        writeByte(1)\n        writeLong(-1)\n    }\n}\n\ninternal fun TlvMapWriter.t536( // 1334\n    loginExtraData: ByteArray\n) {\n    tlv(0x536) {\n        writeFully(loginExtraData)\n    }\n}\n\ninternal fun TlvMapWriter.t536( // 1334\n    loginExtraData: Collection<LoginExtraData>\n) {\n    tlv(0x536) {\n        //com.tencent.loginsecsdk.ProtocolDet#packExtraData\n        writeByte(1) // const\n        writeByte(loginExtraData.size.toByte()) // data count\n        for (extraData in loginExtraData) {\n            writeLoginExtraData(extraData)\n        }\n    }\n}\n\ninternal fun TlvMapWriter.t525(\n    loginExtraData: Collection<LoginExtraData>,\n) {\n    tlv(0x525) {\n        _writeTlvMap {\n            t536(loginExtraData)\n        }\n    }\n}\n\ninternal fun TlvMapWriter.t525(\n    t536: ByteReadPacket = buildPacket {\n        _writeTlvMap(includeCount = false) {\n            t536(buildPacket {\n                //com.tencent.loginsecsdk.ProtocolDet#packExtraData\n                writeByte(1) // const\n                writeByte(0) // data count\n            }.readBytes())\n        }\n    }\n) {\n    tlv(0x525) {\n        writeShort(1)\n        writePacket(t536)\n    }\n}\n\ninternal fun TlvMapWriter.t542(\n    value: ByteArray\n) {\n    tlv(0x542) {\n        writeFully(value)\n    }\n}\n\ninternal fun TlvMapWriter.t545(\n    qimei: String\n) {\n    tlv(0x545) {\n        writeFully(qimei.toByteArray())\n    }\n}\n\ninternal fun TlvMapWriter.t548(\n    nativeGetTestData: ByteArray = (\n            \"01 02 01 01 00 0A 00 00 00 80 5E C1 1A B0 39 A0 \" +\n                    \"E0 5C 67 DF 44 F8 E5 86 91 A2 A4 5D 92 2B 25 3A \" +\n                    \"B6 6E 2F F1 A1 E3 60 B8 36 1E 2F 6B 6F F7 2D F7 \" +\n                    \"F8 21 F1 0B 75 7D 2A 4F 63 B8 83 9C 41 0B AA C7 \" +\n                    \"C9 69 0D 70 AB F3 0F 46 28 C2 CD DB 81 CC 74 18 \" +\n                    \"ED 97 CD 31 3E 1A 17 F1 94 96 AB 6C 6B 25 4F 83 \" +\n                    \"5B 15 82 B0 8F 53 82 3F 59 FE 6E B5 EA B5 EA 7A \" +\n                    \"0C E7 2B 31 CA 4C FD 43 9A DB 40 7A CA 51 D7 9A \" +\n                    \"3C AD 6D 8F 3C C6 84 A5 4A 5F 00 20 BE FB 91 06 \" +\n                    \"F0 67 42 8B CC 59 27 4E BC 91 78 55 4E E4 5C 98 \" +\n                    \"4B 8B 0F C9 A3 83 56 06 E8 AE 5A 0D 00 AC 01 02 \" +\n                    \"01 02 00 0A 00 00 00 80 5E C1 1A B0 39 A0 E0 5C \" +\n                    \"67 DF 44 F8 E5 86 91 A2 A4 5D 92 2B 25 3A B6 6E \" +\n                    \"2F F1 A1 E3 60 B8 36 1E 2F 6B 6F F7 2D F7 F8 21 \" +\n                    \"F1 0B 75 7D 2A 4F 63 B8 83 9C 41 0B AA C7 C9 69 \" +\n                    \"0D 70 AB F3 0F 46 28 C2 CD DB 81 CC 74 18 ED 97 \" +\n                    \"CD 31 3E 1A 17 F1 94 96 AB 6C 6B 25 4F 83 5B 15 \" +\n                    \"82 B0 8F 53 82 3F 59 FE 6E B5 EA B5 EA 7A 0C E7 \" +\n                    \"2B 31 CA 4C FD 43 9A DB 40 7A CA 51 D7 9A 3C AD \" +\n                    \"6D 8F 3C C6 84 A5 4A 5F 00 20 BE FB 91 06 F0 67 \" +\n                    \"42 8B CC 59 27 4E BC 91 78 55 4E E4 5C 98 4B 8B \" +\n                    \"0F C9 A3 83 56 06 E8 AE 5A 0D 00 80 5E C1 1A B0 \" +\n                    \"39 A0 E0 5C 67 DF 44 F8 E5 86 91 A2 A4 5D 92 2B \" +\n                    \"25 3A B6 6E 2F F1 A1 E3 60 B8 36 1E 2F 6B 6F F7 \" +\n                    \"2D F7 F8 21 F1 0B 75 7D 2A 4F 63 B8 83 9C 41 0B \" +\n                    \"AA C7 C9 69 0D 70 AB F3 0F 46 28 C2 CD DB 81 CC \" +\n                    \"74 18 ED 97 CD 31 3E 1A 17 F1 94 96 AB 6C 6B 25 \" +\n                    \"4F 83 5B 15 82 B0 8F 53 82 3F 59 FE 6E B5 EA B5 \" +\n                    \"EA 7A 0C E7 2B 31 CA 4C FD 43 9A DB 40 7A CA 51 \" +\n                    \"D7 9A 3C AD 6D 8F 3C C6 84 A5 71 6F 00 00 00 1F \" +\n                    \"00 00 27 10\").hexToBytes()\n) {\n    tlv(0x548) {\n        writeFully(nativeGetTestData)\n    }\n}\n\n\ninternal fun TlvMapWriter.t544ForToken( // 1348\n    client: QQAndroidClient,\n    uin: Long,\n    protocol: BotConfiguration.MiraiProtocol,\n    guid: ByteArray,\n    sdkVersion: String,\n    subCommandId: Int,\n    commandStr: String\n) {\n    val service = client.bot.encryptServiceOrNull ?: return\n    tlv(0x544) {\n        buildPacket {\n            writeFully(buildPacket {\n                writeLong(uin)\n            }.readBytes(4))\n            writeShortLVByteArray(guid)\n            writeShortLVString(sdkVersion)\n            writeInt(subCommandId)\n            writeInt(0)\n        }.use { dataIn ->\n            service.encryptTlv(EncryptServiceContext(uin, buildTypeSafeMap {\n                set(EncryptServiceContext.KEY_COMMAND_STR, commandStr)\n                set(EncryptServiceContext.KEY_BOT_PROTOCOL, protocol)\n            }), 0x544, dataIn.readBytes())\n        }.let { result ->\n            writeFully(result ?: \"\".toByteArray()) // Empty str means native throws exception\n        }\n    }\n}\n\ninternal fun TlvMapWriter.t544ForVerify( // 1348\n    client: QQAndroidClient,\n    uin: Long,\n    protocol: BotConfiguration.MiraiProtocol,\n    guid: ByteArray,\n    sdkVersion: String,\n    subCommandId: Int,\n    commandStr: String\n) {\n    val service = client.bot.encryptServiceOrNull ?: return\n    tlv(0x544) {\n        buildPacket {\n            writeLong(uin)\n            writeShortLVByteArray(guid)\n            writeShortLVString(sdkVersion)\n            writeInt(subCommandId)\n        }.use { dataIn ->\n            service.encryptTlv(EncryptServiceContext(uin, buildTypeSafeMap {\n                set(EncryptServiceContext.KEY_COMMAND_STR, commandStr)\n                set(EncryptServiceContext.KEY_BOT_PROTOCOL, protocol)\n            }), 0x544, dataIn.readBytes())\n        }.let { result ->\n            writeFully(result ?: \"\".toByteArray()) // Empty str means native throws exception\n        }\n    }\n}\n\ninternal fun TlvMapWriter.t318(\n    tgtQR: ByteArray // unknown\n) {\n    tlv(0x318) {\n        writeFully(tgtQR)\n    }\n}\n\nprivate inline fun Boolean.toByte(): Byte = if (this) 1 else 0\nprivate inline fun Boolean.toInt(): Int = if (this) 1 else 0\n\n// noinline: wrong exception stacktrace reported\n\nprivate infix fun Int.shouldEqualsTo(int: Int) = check(this == int) { \"Required $int, but found $this\" }\nprivate infix fun ByteArray.requireSize(exactSize: Int) =\n    check(this.size == exactSize) { \"Required size $exactSize, but found ${this.size}\" }\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/ChatType.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat\n\ninternal enum class ChatType(val internalID: Int) {\n\n    FRIEND(2),//可以为任何数字\n\n    CONTACT(1006),\n\n    //推测为\"群\"\n    TROOP(1),\n    TROOP_HCTOPIC(1026),\n\n    //坦白说\n    CONFESS_A(1033),\n    CONFESS_B(1034),\n\n    CM_GAME_TEMP(1036),\n\n    DISCUSSION(3000),\n\n    DEVICE_MSG(9501),\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/GroupFile.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.DeserializationStrategy\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.data.proto.*\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.readOidbSsoPkg\nimport net.mamoe.mirai.internal.utils.io.serialization.writeOidb\nimport net.mamoe.mirai.utils.ExternalResource\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.math.absoluteValue\nimport kotlin.random.Random\n\ninternal sealed class CommonOidbResponse<T> : Packet {\n    data class Failure<T>(\n        val result: Int,\n        val msg: String,\n        val e: Throwable?,\n    ) : CommonOidbResponse<T>() {\n        inline fun createException(actionName: String): IllegalStateException {\n            return IllegalStateException(\"Failed $actionName, result=$result, msg=$msg\", e)\n        }\n\n        override fun toString(): String {\n            return \"CommonOidbResponse.Failure(result=$result, msg=$msg, e=$e)\"\n        }\n    }\n\n    class Success<T>(\n        val resp: T\n    ) : CommonOidbResponse<T>() {\n        override fun toString(): String {\n            return \"CommonOidbResponse.Success\"\n        }\n    }\n}\n\ninternal interface CheckableStruct {\n    val int32RetCode: Int\n    val retMsg: String\n}\n\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"RESULT_CLASS_IN_RETURN_TYPE\")\n@kotlin.internal.InlineOnly\ninternal inline fun <T> CommonOidbResponse<T>.toResult(actionName: String, checkResp: Boolean = true): Result<T> {\n    return if (this is CommonOidbResponse.Failure) {\n        Result.failure(this.createException(actionName))\n    } else {\n        this as CommonOidbResponse.Success<T>\n        if (!checkResp) return Result.success(this.resp)\n        val result = this.resp\n        if (result is CheckableStruct) {\n            if (result.int32RetCode != 0) return Result.failure(IllegalStateException(\"Failed $actionName, result=${result.int32RetCode}, msg=${result.retMsg}\"))\n        }\n        Result.success(this.resp)\n    }\n}\n\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"RESULT_CLASS_IN_RETURN_TYPE\")\n@kotlin.internal.InlineOnly\ninternal inline fun <T> CommonOidbResponse<T>.toResult(\n    actionName: String,\n    checkResp: CheckableStruct.(Int) -> Boolean\n): Result<T> {\n    return if (this is CommonOidbResponse.Failure) {\n        Result.failure(this.createException(actionName))\n    } else {\n        this as CommonOidbResponse.Success<T>\n        val result = this.resp\n        if (result is CheckableStruct) {\n            if (!checkResp(\n                    result,\n                    result.int32RetCode\n                )\n            ) return Result.failure(IllegalStateException(\"Failed $actionName, result=${result.int32RetCode}, msg=${result.retMsg}\"))\n        }\n        Result.success(this.resp)\n    }\n}\n\n/**\n * @param respMapper may throw any exception, which will be wrapped to CommonOidbResponse.Failure\n */\ninternal inline fun <T : ProtoBuf, R> ByteReadPacket.readOidbRespCommon(\n    bodyBufferDeserializer: DeserializationStrategy<T>,\n    respMapper: (T) -> R\n): CommonOidbResponse<R> {\n    contract { callsInPlace(respMapper, InvocationKind.AT_MOST_ONCE) }\n    val oidb = readOidbSsoPkg(bodyBufferDeserializer)\n    return oidb.fold(\n        onSuccess = {\n            CommonOidbResponse.Success(kotlin.runCatching {\n                respMapper(this)\n            }.getOrElse {\n                return CommonOidbResponse.Failure(0, it.message ?: \"\", it)\n            })\n        },\n        onFailure = {\n            CommonOidbResponse.Failure(result, errorMsg, null)\n        }\n    )\n}\n\ninternal object FileManagement {\n    val factories = arrayOf(\n        GetFileList,\n        GetFileInfo,\n        RequestDownload,\n        RequestUpload,\n        DeleteFile,\n        MoveFile,\n        RenameFile,\n        TransferFile,\n        Feed,\n        RenameFolder,\n//        MoveFolder,\n        DeleteFolder,\n        CreateFolder,\n    )\n\n    object GetFileList : OutgoingPacketFactory<CommonOidbResponse<Oidb0x6d8.GetFileListRspBody>>(\"OidbSvc.0x6d8_1\") {\n        operator fun invoke(\n            client: QQAndroidClient,\n            groupCode: Long,\n            folderId: String,\n            startIndex: Int,\n        ) = buildOutgoingUniPacket(client) {\n            writeOidb(\n                1752,\n                1,\n                Oidb0x6d8.ReqBody.serializer(),\n                Oidb0x6d8.ReqBody(\n                    fileListInfoReq = Oidb0x6d8.GetFileListReqBody(\n                        groupCode = groupCode,\n                        appId = 3,\n                        folderId = folderId,\n                        fileCount = 20,\n                        reqFrom = 3,\n                        sortBy = 1,\n                        startIndex = startIndex\n                    )\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): CommonOidbResponse<Oidb0x6d8.GetFileListRspBody> {\n            return readOidbRespCommon(Oidb0x6d8.RspBody.serializer()) { it.fileListInfoRsp!! }\n        }\n    }\n\n    object GetFileInfo : OutgoingPacketFactory<CommonOidbResponse<Oidb0x6d8.GetFileInfoRspBody>>(\"OidbSvc.0x6d8_0\") {\n        operator fun invoke(\n            client: QQAndroidClient,\n            groupCode: Long,\n            fileId: String,\n            busId: Int,\n        ) = buildOutgoingUniPacket(client) {\n            writeOidb(\n                1752,\n                0,\n                Oidb0x6d8.ReqBody.serializer(),\n                Oidb0x6d8.ReqBody(\n                    fileInfoReq = Oidb0x6d8.GetFileInfoReqBody(\n                        groupCode = groupCode,\n                        appId = 3,\n                        fileId = fileId,\n                        busId = busId\n                    )\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): CommonOidbResponse<Oidb0x6d8.GetFileInfoRspBody> {\n            return readOidbRespCommon(Oidb0x6d8.RspBody.serializer()) { it.fileInfoRsp!! }\n        }\n    }\n\n    object RequestUpload : OutgoingPacketFactory<CommonOidbResponse<Oidb0x6d6.UploadFileRspBody>>(\"OidbSvc.0x6d6_0\") {\n        operator fun invoke(\n            client: QQAndroidClient,\n            groupCode: Long,\n            folderId: String,\n            resource: ExternalResource,\n            filename: String,\n        ) = buildOutgoingUniPacket(client) {\n            resource.sha1 // check supported\n\n            writeOidb(\n                command = 1750,\n                serviceType = 0,\n                Oidb0x6d6.ReqBody.serializer(),\n                Oidb0x6d6.ReqBody(\n                    uploadFileReq = Oidb0x6d6.UploadFileReqBody(\n                        groupCode = groupCode,\n                        appId = 3,\n                        busId = 102,\n                        entrance = 5,\n                        parentFolderId = folderId,\n                        fileName = filename,\n                        localPath = \"/storage/emulated/0/Pictures/files/s/$filename\",\n                        fileSize = resource.size,\n                        sha = resource.sha1,\n                        md5 = resource.md5,\n                        boolSupportMultiUpload = true,\n                    )\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): CommonOidbResponse<Oidb0x6d6.UploadFileRspBody> {\n            return readOidbRespCommon(Oidb0x6d6.RspBody.serializer()) { it.uploadFileRsp!! }\n        }\n    }\n\n    object RequestDownload :\n        OutgoingPacketFactory<CommonOidbResponse<Oidb0x6d6.DownloadFileRspBody>>(\"OidbSvc.0x6d6_2\") {\n        operator fun invoke(\n            client: QQAndroidClient,\n            groupCode: Long,\n            busId: Int,\n            fileId: String,\n        ) = buildOutgoingUniPacket(client) {\n            writeOidb(\n                command = 1750,\n                serviceType = 2,\n                Oidb0x6d6.ReqBody.serializer(),\n                Oidb0x6d6.ReqBody(\n                    downloadFileReq = Oidb0x6d6.DownloadFileReqBody(\n                        groupCode = groupCode,\n                        appId = 3,\n                        busId = busId,\n                        fileId = fileId,\n                    )\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): CommonOidbResponse<Oidb0x6d6.DownloadFileRspBody> {\n            return readOidbRespCommon(Oidb0x6d6.RspBody.serializer()) { it.downloadFileRsp!! }\n        }\n    }\n\n    object MoveFile : OutgoingPacketFactory<CommonOidbResponse<Oidb0x6d6.MoveFileRspBody>>(\"OidbSvc.0x6d6_5\") {\n        operator fun invoke(\n            client: QQAndroidClient,\n            groupCode: Long,\n            busId: Int,\n            fileId: String,\n            parentFolderId: String,\n            destFolderId: String,\n        ) = buildOutgoingUniPacket(client) {\n            writeOidb(\n                command = 1750,\n                serviceType = 5,\n                Oidb0x6d6.ReqBody.serializer(),\n                Oidb0x6d6.ReqBody(\n                    moveFileReq = Oidb0x6d6.MoveFileReqBody(\n                        groupCode = groupCode,\n                        appId = 3,\n                        busId = busId,\n                        fileId = fileId,\n                        parentFolderId = parentFolderId,\n                        destFolderId = destFolderId\n                    )\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): CommonOidbResponse<Oidb0x6d6.MoveFileRspBody> {\n            return readOidbRespCommon(Oidb0x6d6.RspBody.serializer()) { it.moveFileRsp!! }\n        }\n    }\n\n\n    // 转发\n    object TransferFile : OutgoingPacketFactory<CommonOidbResponse<Oidb0x6d9.TransFileRspBody>>(\"OidbSvc.0x6d9_0\") {\n        operator fun invoke(\n            client: QQAndroidClient,\n            groupCode: Long,\n            busId: Int,\n            fileId: String,\n        ) = buildOutgoingUniPacket(client) {\n            writeOidb(\n                command = 1753,\n                serviceType = 0,\n                Oidb0x6d9.ReqBody.serializer(),\n                Oidb0x6d9.ReqBody(\n                    transFileReq = Oidb0x6d9.TransFileReqBody(\n                        groupCode = groupCode,\n                        appId = 3,\n                        busId = busId,\n                        fileId = fileId,\n                    )\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): CommonOidbResponse<Oidb0x6d9.TransFileRspBody> {\n            return readOidbRespCommon(Oidb0x6d9.RspBody.serializer()) { it.transFileRsp!! }\n        }\n    }\n\n\n    object RenameFile : OutgoingPacketFactory<CommonOidbResponse<Oidb0x6d6.RenameFileRspBody>>(\"OidbSvc.0x6d6_4\") {\n        operator fun invoke(\n            client: QQAndroidClient,\n            groupCode: Long,\n            busId: Int,\n            fileId: String,\n            parentFolderId: String,\n            newName: String,\n        ) = buildOutgoingUniPacket(client) {\n            writeOidb(\n                command = 1750,\n                serviceType = 4,\n                Oidb0x6d6.ReqBody.serializer(),\n                Oidb0x6d6.ReqBody(\n                    renameFileReq = Oidb0x6d6.RenameFileReqBody(\n                        groupCode = groupCode,\n                        appId = 3,\n                        busId = busId,\n                        fileId = fileId,\n                        parentFolderId = parentFolderId,\n                        newFileName = newName,\n                    )\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): CommonOidbResponse<Oidb0x6d6.RenameFileRspBody> {\n            return readOidbRespCommon(Oidb0x6d6.RspBody.serializer()) { it.renameFileRsp!! }\n        }\n    }\n\n    object DeleteFile : OutgoingPacketFactory<CommonOidbResponse<Oidb0x6d6.DeleteFileRspBody>>(\"OidbSvc.0x6d6_3\") {\n        operator fun invoke(\n            client: QQAndroidClient,\n            groupCode: Long,\n            busId: Int,\n            fileId: String,\n            parentFolderId: String,\n        ) = buildOutgoingUniPacket(client) {\n            writeOidb(\n                command = 1750,\n                serviceType = 3,\n                Oidb0x6d6.ReqBody.serializer(),\n                Oidb0x6d6.ReqBody(\n                    deleteFileReq = Oidb0x6d6.DeleteFileReqBody(\n                        groupCode = groupCode,\n                        appId = 3,\n                        busId = busId,\n                        fileId = fileId,\n                        parentFolderId = parentFolderId,\n                    )\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): CommonOidbResponse<Oidb0x6d6.DeleteFileRspBody> {\n            return readOidbRespCommon(Oidb0x6d6.RspBody.serializer()) { it.deleteFileRsp!! }\n        }\n    }\n\n    object Feed : OutgoingPacketFactory<CommonOidbResponse<Oidb0x6d9.FeedsRspBody>>(\"OidbSvc.0x6d9_4\") {\n        operator fun invoke(\n            client: QQAndroidClient,\n            groupCode: Long,\n            busId: Int,\n            fileId: String,\n            random: Int = Random.nextInt().absoluteValue,\n        ) = buildOutgoingUniPacket(client) {\n            writeOidb(\n                command = 1753,\n                serviceType = 4,\n                Oidb0x6d9.ReqBody.serializer(),\n                Oidb0x6d9.ReqBody(\n                    feedsInfoReq = Oidb0x6d9.FeedsReqBody(\n                        groupCode = groupCode,\n                        appId = 3,\n                        feedsInfoList = listOf(\n                            GroupFileCommon.FeedsInfo(\n                                busId = busId,\n                                fileId = fileId,\n                                feedFlag = 1,\n                                msgRandom = random,\n                            )\n                        )\n                    )\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): CommonOidbResponse<Oidb0x6d9.FeedsRspBody> {\n            return readOidbRespCommon(Oidb0x6d9.RspBody.serializer()) { it.feedsInfoRsp!! }\n        }\n    }\n\n\n    object RenameFolder : OutgoingPacketFactory<CommonOidbResponse<Oidb0x6d7.RenameFolderRspBody>>(\"OidbSvc.0x6d7_2\") {\n        operator fun invoke(\n            client: QQAndroidClient,\n            groupCode: Long,\n            folderId: String,\n            newName: String\n        ) = buildOutgoingUniPacket(client) {\n            writeOidb(\n                command = 1751,\n                serviceType = 2,\n                Oidb0x6d7.ReqBody.serializer(),\n                Oidb0x6d7.ReqBody(\n                    renameFolderReq = Oidb0x6d7.RenameFolderReqBody(\n                        groupCode = groupCode,\n                        appId = 3,\n                        folderId = folderId,\n                        newFolderName = newName,\n                    )\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): CommonOidbResponse<Oidb0x6d7.RenameFolderRspBody> {\n            return readOidbRespCommon(Oidb0x6d7.RspBody.serializer()) { it.renameFolderRsp!! }\n        }\n    }\n\n    // qq doesn't support\n//    object MoveFolder : OutgoingPacketFactory<CommonOidbResponse<Oidb0x6d7.MoveFolderRspBody>>(\"OidbSvc.0x6d7_3\") {\n//        operator fun invoke(\n//            client: QQAndroidClient,\n//            groupCode: Long,\n//            folderId: String,\n//            parentFolderId: String,\n//            newParentFolderId: String,\n//        ) = buildOutgoingUniPacket(client) {\n//            writeOidb(\n//                command = 1751,\n//                serviceType = 3,\n//                Oidb0x6d7.ReqBody.serializer(),\n//                Oidb0x6d7.ReqBody(\n//                    moveFolderReq = Oidb0x6d7.MoveFolderReqBody(\n//                        groupCode = groupCode,\n//                        appId = 3,\n//                        folderId = folderId,\n//                        parentFolderId = parentFolderId,\n//                        destFolderId = newParentFolderId,\n//                    )\n//                )\n//            )\n//        }\n//\n//        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): CommonOidbResponse<Oidb0x6d7.MoveFolderRspBody> {\n//            return readOidbRespCommon(Oidb0x6d7.RspBody.serializer()) { it.moveFolderRsp!! }\n//        }\n//    }\n\n    object DeleteFolder : OutgoingPacketFactory<CommonOidbResponse<Oidb0x6d7.DeleteFolderRspBody>>(\"OidbSvc.0x6d7_1\") {\n        operator fun invoke(\n            client: QQAndroidClient,\n            groupCode: Long,\n            folderId: String,\n        ) = buildOutgoingUniPacket(client) {\n            writeOidb(\n                command = 1751,\n                serviceType = 1,\n                Oidb0x6d7.ReqBody.serializer(),\n                Oidb0x6d7.ReqBody(\n                    deleteFolderReq = Oidb0x6d7.DeleteFolderReqBody(\n                        groupCode = groupCode,\n                        appId = 3,\n                        folderId = folderId,\n                    )\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): CommonOidbResponse<Oidb0x6d7.DeleteFolderRspBody> {\n            return readOidbRespCommon(Oidb0x6d7.RspBody.serializer()) { it.deleteFolderRsp!! }\n        }\n    }\n\n    object CreateFolder : OutgoingPacketFactory<CommonOidbResponse<Oidb0x6d7.CreateFolderRspBody>>(\"OidbSvc.0x6d7_0\") {\n        operator fun invoke(\n            client: QQAndroidClient,\n            groupCode: Long,\n            parentFolderId: String,\n            name: String\n        ) = buildOutgoingUniPacket(client) {\n            writeOidb(\n                command = 1751,\n                serviceType = 0,\n                Oidb0x6d7.ReqBody.serializer(),\n                Oidb0x6d7.ReqBody(\n                    createFolderReq = Oidb0x6d7.CreateFolderReqBody(\n                        groupCode = groupCode,\n                        appId = 3,\n                        parentFolderId = parentFolderId,\n                        folderName = name,\n                    )\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): CommonOidbResponse<Oidb0x6d7.CreateFolderRspBody> {\n            return readOidbRespCommon(Oidb0x6d7.RspBody.serializer()) { it.createFolderRsp!! }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/MultiMsg.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"EXPERIMENTAL_API_USAGE\")\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.message.contextualBugReportException\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.components.PacketCodec\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MultiMsg\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf\nimport net.mamoe.mirai.utils.md5\nimport net.mamoe.mirai.utils.structureToString\n\ninternal class MessageValidationData(\n    val data: ByteArray,\n    val md5: ByteArray = data.md5()\n) {\n    override fun toString(): String {\n        return \"MessageValidationData(data=<size=${data.size}>, md5=${md5.contentToString()})\"\n    }\n}\n\ninternal class MultiMsg {\n\n    object ApplyUp : OutgoingPacketFactory<ApplyUp.Response>(\"MultiMsg.ApplyUp\") {\n        sealed class Response : Packet {\n            data class RequireUpload(\n                val proto: MultiMsg.MultiMsgApplyUpRsp\n            ) : Response() {\n                override fun toString(): String {\n                    if (PacketCodec.PacketLogger.isEnabled) {\n                        return structureToString()\n                    }\n                    return \"MultiMsg.ApplyUp.Response.RequireUpload\"\n                }\n            }\n\n            object MessageTooLarge : Response()\n        }\n\n        // captured from group\n        fun createForGroup(\n            buType: Int,\n            client: QQAndroidClient,\n            messageData: MessageValidationData,\n            dstUin: Long // group uin\n        ) = buildOutgoingUniPacket(client) {\n            writeProtoBuf(\n                MultiMsg.ReqBody.serializer(),\n                MultiMsg.ReqBody(\n                    buType = buType, // 1: long, 2: 合并转发\n                    buildVer = \"8.2.0.1296\",\n                    multimsgApplyupReq = listOf(\n                        MultiMsg.MultiMsgApplyUpReq(\n                            applyId = 0,\n                            dstUin = dstUin,\n                            msgMd5 = messageData.md5,\n                            msgSize = messageData.data.size.toLong(),\n                            msgType = 3 // TODO 3 for group?\n                        )\n                    ),\n                    netType = 3, // wifi=3, wap=5\n                    platformType = 9,\n                    subcmd = 1,\n                    termType = 5,\n                    reqChannelType = 0\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            val body = readProtoBuf(MultiMsg.RspBody.serializer())\n            val response = body.multimsgApplyupRsp.first()\n            return when (response.result) {\n                0 -> Response.RequireUpload(response)\n                193 -> Response.MessageTooLarge\n                //1 -> Response.OK(resId = response.msgResid)\n                else -> {\n                    error(kotlin.run {\n                        println(response.structureToString())\n                    }.let { \"Protocol error: MultiMsg.ApplyUp failed with result ${response.result}\" })\n                }\n            }\n        }\n    }\n\n    object ApplyDown : OutgoingPacketFactory<ApplyDown.Response>(\"MultiMsg.ApplyDown\") {\n        sealed class Response : Packet {\n            class RequireDownload(\n                val origin: MultiMsg.MultiMsgApplyDownRsp\n            ) : Response() {\n                override fun toString(): String = \"MultiMsg.ApplyDown.Response\"\n            }\n\n            object MessageTooLarge : Response()\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient,\n            buType: Int,\n            resId: String,\n            msgType: Int,\n        ) = buildOutgoingUniPacket(client) {\n            writeProtoBuf(\n                MultiMsg.ReqBody.serializer(),\n                MultiMsg.ReqBody(\n                    buType = buType, // 1: long, 2: 合并转发\n                    buildVer = \"8.2.0.1296\",\n                    multimsgApplydownReq = listOf(\n                        MultiMsg.MultiMsgApplyDownReq(\n                            msgResid = resId,\n                            msgType = msgType,\n                        )\n                    ),\n                    netType = 3, // wifi=3, wap=5\n                    platformType = 9,\n                    subcmd = 2,\n                    termType = 5,\n                    reqChannelType = 2\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            val body = readProtoBuf(MultiMsg.RspBody.serializer())\n            val response = body.multimsgApplydownRsp.first()\n            return when (response.result) {\n                0 -> Response.RequireDownload(response)\n                193 -> Response.MessageTooLarge\n                //1 -> Response.OK(resId = response.msgResid)\n                else -> throw contextualBugReportException(\n                    \"MultiMsg.ApplyDown\",\n                    response.structureToString(),\n                    additional = \"Decode failure result=${response.result}\"\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/MusicSharePacket.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.clientVersion\nimport net.mamoe.mirai.internal.network.protocol.data.proto.OidbCmd0xb77\nimport net.mamoe.mirai.internal.network.protocol.data.proto.OidbSso\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf\nimport net.mamoe.mirai.message.data.MessageSourceKind\nimport net.mamoe.mirai.message.data.MusicShare\n\ninternal object MusicSharePacket :\n    OutgoingPacketFactory<MusicSharePacket.Response>(\"OidbSvc.0xb77_9\") {\n\n    class Response(\n        val pkg: OidbSso.OIDBSSOPkg,\n    ) : Packet {\n        val response by lazy {\n            pkg.bodybuffer.loadAs(OidbCmd0xb77.RspBody.serializer())\n        }\n\n        override fun toString(): String =\n            \"MusicSharePacket.Response(success=${pkg.result == 0}, error=${pkg.errorMsg})\"\n    }\n\n    override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n        return Response(readProtoBuf(OidbSso.OIDBSSOPkg.serializer()))\n    }\n\n    operator fun invoke(\n        client: QQAndroidClient,\n        musicShare: MusicShare,\n        targetUin: Long,\n        targetKind: MessageSourceKind\n    ) = buildOutgoingUniPacket(client) {\n        with(musicShare) {\n            val musicType = musicShare.kind\n            writeProtoBuf(\n                OidbSso.OIDBSSOPkg.serializer(),\n                OidbSso.OIDBSSOPkg(\n                    command = 2935,\n                    serviceType = 9,\n                    clientVersion = client.clientVersion,\n                    bodybuffer = OidbCmd0xb77.ReqBody(\n                        appid = musicType.appId,\n                        appType = 1,\n                        msgStyle = if (jumpUrl.isNotBlank()) 4 else 0, // 有播放连接为4, 无播放连接为0\n                        clientInfo = OidbCmd0xb77.ClientInfo(\n                            platform = musicType.platform,\n                            sdkVersion = musicType.sdkVersion,\n                            androidPackageName = musicType.packageName,\n                            androidSignature = musicType.signature\n                        ),\n                        extInfo = OidbCmd0xb77.ExtInfo(\n                            msgSeq = 0\n                        ),\n                        sendType = when (targetKind) {\n                            MessageSourceKind.FRIEND -> 0\n                            MessageSourceKind.GROUP -> 1\n                            else -> error(\"Internal error: Unsupported targetKind $targetKind\")\n                        },\n                        recvUin = targetUin,\n                        richMsgBody = OidbCmd0xb77.RichMsgBody(\n                            title = title,\n                            summary = summary,\n                            brief = brief,\n                            url = jumpUrl,\n                            pictureUrl = pictureUrl,\n                            musicUrl = musicUrl\n                        )\n                    ).toByteArray(OidbCmd0xb77.ReqBody.serializer())\n                )\n            )\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/NewContact.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\")\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.event.events.NewFriendRequestEvent\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.components.NoticeProcessorPipeline.Companion.processPacketThroughPipeline\nimport net.mamoe.mirai.internal.network.components.SyncController.Companion.syncController\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.network.toPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf\nimport kotlin.math.max\n\ninternal class NewContact {\n\n    internal object SystemMsgNewFriend :\n        OutgoingPacketFactory<Packet>(\"ProfileService.Pb.ReqSystemMsgNew.Friend\") {\n\n        operator fun invoke(client: QQAndroidClient) = buildOutgoingUniPacket(client) {\n            writeProtoBuf(\n                Structmsg.ReqSystemMsgNew.serializer(),\n                Structmsg.ReqSystemMsgNew(\n                    checktype = 2,\n                    flag = Structmsg.FlagInfo(\n                        frdMsgDiscuss2ManyChat = 1,\n                        frdMsgGetBusiCard = 1,\n                        frdMsgNeedWaitingMsg = 1,\n                        frdMsgUint32NeedAllUnreadMsg = 1,\n                        grpMsgMaskInviteAutoJoin = 1,\n                    ),\n                    friendMsgTypeFlag = 1,\n                    isGetFrdRibbon = false,\n                    isGetGrpRibbon = false,\n                    msgNum = 20,\n                    version = 1000,\n                ),\n            )\n        }\n\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Packet {\n            readProtoBuf(Structmsg.RspSystemMsgNew.serializer()).run {\n                return friendmsgs.filter {\n                    it.msgTime >= bot.syncController.latestMsgNewFriendTime\n                }.mapNotNull { struct ->\n                    if (!bot.syncController.syncNewFriend(struct.msgSeq, struct.msgTime)) { // duplicate\n                        return@mapNotNull null\n                    }\n                    struct.msg?.run {\n                        NewFriendRequestEvent(\n                            bot,\n                            struct.msgSeq,\n                            msgAdditional,\n                            struct.reqUin,\n                            groupCode,\n                            reqUinNick,\n                        )\n                    }\n                }.toPacket().also {\n                    bot.syncController.run {\n                        latestMsgNewFriendTime = max(latestMsgNewFriendTime, friendmsgs.maxOfOrNull { it.msgTime } ?: 0)\n                    }\n                }\n            }\n        }\n\n        internal object Action : OutgoingPacketFactory<Nothing?>(\"ProfileService.Pb.ReqSystemMsgAction.Friend\") {\n\n            operator fun invoke(\n                client: QQAndroidClient,\n                eventId: Long,\n                fromId: Long,\n                accept: Boolean,\n                blackList: Boolean = false,\n            ) =\n                buildOutgoingUniPacket(client) {\n                    writeProtoBuf(\n                        Structmsg.ReqSystemMsgAction.serializer(),\n                        Structmsg.ReqSystemMsgAction(\n                            actionInfo = Structmsg.SystemMsgActionInfo(\n                                type = if (accept) 2 else 3,\n                                addFrdSNInfo = Structmsg.AddFrdSNInfo(),\n                                msg = \"\",\n                                remark = \"\",\n                                blacklist = !accept && blackList,\n                            ),\n                            msgSeq = eventId,\n                            reqUin = fromId,\n                            srcId = 6,\n                            subSrcId = 7,\n                            subType = 1,\n                        ),\n                    )\n                }\n\n            override suspend fun ByteReadPacket.decode(bot: QQAndroidBot) = null\n        }\n    }\n\n\n    internal object SystemMsgNewGroup :\n        OutgoingPacketFactory<Packet?>(\"ProfileService.Pb.ReqSystemMsgNew.Group\") {\n\n        operator fun invoke(client: QQAndroidClient) = buildOutgoingUniPacket(client) {\n            writeProtoBuf(\n                Structmsg.ReqSystemMsgNew.serializer(),\n                Structmsg.ReqSystemMsgNew(\n                    checktype = 3,\n                    flag = Structmsg.FlagInfo(\n                        frdMsgDiscuss2ManyChat = 1,\n                        frdMsgGetBusiCard = 0,\n                        frdMsgNeedWaitingMsg = 1,\n                        frdMsgUint32NeedAllUnreadMsg = 1,\n                        grpMsgGetC2cInviteJoinGroup = 1,\n                        grpMsgMaskInviteAutoJoin = 1,\n                        grpMsgGetDisbandedByAdmin = 1,\n                        grpMsgGetOfficialAccount = 1,\n                        grpMsgGetPayInGroup = 1,\n                        grpMsgGetQuitPayGroupMsgFlag = 1,\n                        grpMsgGetTransferGroupMsgFlag = 1,\n                        grpMsgHiddenGrp = 1,\n                        grpMsgKickAdmin = 1,\n                        grpMsgNeedAutoAdminWording = 1,\n                        grpMsgNotAllowJoinGrpInviteNotFrd = 1,\n                        grpMsgSupportInviteAutoJoin = 1,\n                        grpMsgWordingDown = 1,\n                    ),\n                    friendMsgTypeFlag = 1,\n                    isGetFrdRibbon = false,\n                    isGetGrpRibbon = false,\n                    msgNum = 5,\n                    version = 1000,\n                ),\n            )\n        }\n\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Packet {\n            return readBytes().loadAs(Structmsg.RspSystemMsgNew.serializer()).run {\n                groupmsgs.filter {\n                    it.msgTime >= bot.syncController.latestMsgNewGroupTime\n                }.mapNotNull { struct ->\n                    if (!bot.syncController.syncNewGroup(struct.msgSeq, struct.msgTime)) { // duplicate\n                        return@mapNotNull null\n                    }\n                    bot.processPacketThroughPipeline(struct)\n                }.toPacket().also {\n                    bot.syncController.run {\n                        latestMsgNewGroupTime = max(latestMsgNewGroupTime, groupmsgs.maxOfOrNull { it.msgTime } ?: 0)\n                    }\n                }\n            }\n        }\n\n        internal object Action : OutgoingPacketFactory<Nothing?>(\"ProfileService.Pb.ReqSystemMsgAction.Group\") {\n\n            operator fun invoke(\n                client: QQAndroidClient,\n                eventId: Long,\n                fromId: Long,\n                groupId: Long,\n                isInvited: Boolean,\n                accept: Boolean?,\n                blackList: Boolean = false,\n                message: String = \"\",\n            ) =\n                buildOutgoingUniPacket(client) {\n                    writeProtoBuf(\n                        Structmsg.ReqSystemMsgAction.serializer(),\n                        Structmsg.ReqSystemMsgAction(\n                            actionInfo = Structmsg.SystemMsgActionInfo(\n                                type = when (accept) {\n                                    null -> 14 // ignore\n                                    true -> 11 // accept\n                                    false -> 12 // reject\n                                },\n                                groupCode = groupId,\n                                msg = message,\n                                remark = \"\",\n                                blacklist = blackList,\n                            ),\n                            groupMsgType = if (isInvited) 2 else 1,\n                            language = 1000,\n                            msgSeq = eventId,\n                            reqUin = fromId,\n                            srcId = 3,\n                            subSrcId = if (isInvited) 10016 else 31,\n                            subType = 1,\n                        ),\n                    )\n                }\n\n            override suspend fun ByteReadPacket.decode(bot: QQAndroidBot) = null\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/NudgePacket.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Cmd0xed3\nimport net.mamoe.mirai.internal.network.protocol.data.proto.OidbSso\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf\n\ninternal object NudgePacket : OutgoingPacketFactory<NudgePacket.Response>(\"OidbSvc.0xed3\") {\n    override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n        with(readBytes().loadAs(OidbSso.OIDBSSOPkg.serializer())) {\n            return Response(result == 0, result)\n        }\n    }\n\n    class Response(val success: Boolean, val code: Int) : Packet {\n        override fun toString(): String = \"NudgeResponse(success=$success,code=$code)\"\n    }\n\n    fun friendInvoke(\n        client: QQAndroidClient,\n        nudgeTargetId: Long,\n        messageReceiverUin: Long,\n    ) = buildOutgoingUniPacket(client) {\n        writeProtoBuf(\n            OidbSso.OIDBSSOPkg.serializer(),\n            OidbSso.OIDBSSOPkg(\n                command = 3795,\n                serviceType = 1,\n                result = 0,\n                bodybuffer = Cmd0xed3.ReqBody(\n                    toUin = nudgeTargetId,\n                    aioUin = messageReceiverUin\n                ).toByteArray(Cmd0xed3.ReqBody.serializer())\n            )\n        )\n    }\n\n    fun troopInvoke(\n        client: QQAndroidClient,\n        messageReceiverGroupCode: Long,\n        nudgeTargetId: Long,\n    ) = buildOutgoingUniPacket(client) {\n        writeProtoBuf(\n            OidbSso.OIDBSSOPkg.serializer(),\n            OidbSso.OIDBSSOPkg(\n                command = 3795,\n                serviceType = 1,\n                result = 0,\n                bodybuffer = Cmd0xed3.ReqBody(\n                    toUin = nudgeTargetId,\n                    groupCode = messageReceiverGroupCode\n                ).toByteArray(Cmd0xed3.ReqBody.serializer())\n            )\n        )\n    }\n\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/PbMessageSvc.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"EXPERIMENTAL_API_USAGE\")\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgRevokeUserDef\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgSvc\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketWithRespType\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf\nimport net.mamoe.mirai.utils.hexToBytes\nimport net.mamoe.mirai.utils.toLongUnsigned\n\ninternal class PbMessageSvc {\n    object PbMsgWithDraw : OutgoingPacketFactory<PbMsgWithDraw.Response>(\n        \"PbMessageSvc.PbMsgWithDraw\"\n    ) {\n        sealed class Response : Packet {\n            object Success : Response() {\n                override fun toString(): String {\n                    return \"PbMsgWithDraw.Success\"\n                }\n            }\n\n            data class Failed(\n                val result: Int,\n                val errorMessage: String\n            ) : Response()\n        }\n\n        // 12 1A 08 01 10 00 18 E7 C1 AD B8 02 22 0A 08 BF BA 03 10 BF 81 CB B7 03 2A 02 08 00\n        fun createForGroupMessage(\n            client: QQAndroidClient,\n            groupCode: Long,\n            messageSequenceId: IntArray, // 56639\n            messageRandom: IntArray, // 921878719\n            messageType: Int = 0\n        ): OutgoingPacketWithRespType<Response> {\n            require(messageSequenceId.size == messageRandom.size)\n\n            return buildOutgoingUniPacket(\n                client,\n                remark = \"PbMsgWithDraw(\" +\n                        \"group=$groupCode, \" +\n                        \"seq=${messageSequenceId.joinToString(separator = \",\")}, \" +\n                        \"rand=${messageRandom.joinToString(separator = \",\")}\" +\n                        \")\"\n            ) {\n                writeProtoBuf(\n                    MsgSvc.PbMsgWithDrawReq.serializer(),\n                    MsgSvc.PbMsgWithDrawReq(\n                        groupWithDraw = listOf(\n                            MsgSvc.PbGroupMsgWithDrawReq(\n                                subCmd = 1,\n                                groupType = 0, // 普通群\n                                groupCode = groupCode,\n                                msgList = messageSequenceId.zip(messageRandom).map { (seq, random) ->\n                                    MsgSvc.PbGroupMsgWithDrawReq.MessageInfo(\n                                        msgSeq = seq,\n                                        msgRandom = random,\n                                        msgType = messageType\n                                    )\n                                },\n                                userdef = MsgRevokeUserDef.MsgInfoUserDef(\n                                    longMessageFlag = 0\n                                ).toByteArray(MsgRevokeUserDef.MsgInfoUserDef.serializer())\n                            )\n                        )\n                    )\n                )\n            }\n        }\n\n        fun createForGroupTempMessage(\n            client: QQAndroidClient,\n            groupUin: Long,\n            toUin: Long,\n            messageSequenceId: IntArray, // 56639\n            messageRandom: IntArray, // 921878719\n            time: Int\n        ): OutgoingPacketWithRespType<Response> {\n            require(messageSequenceId.size == messageRandom.size)\n\n            return buildOutgoingUniPacket(\n                client,\n                remark = \"PbMsgWithDraw(\" +\n                        \"groupTemp=$toUin, \" +\n                        \"seq=${messageSequenceId.joinToString(separator = \",\")}, \" +\n                        \"rand=${messageRandom.joinToString(separator = \",\")}, \" +\n                        \"time=${time}\" +\n                        \")\"\n            ) {\n                writeProtoBuf(\n                    MsgSvc.PbMsgWithDrawReq.serializer(),\n                    MsgSvc.PbMsgWithDrawReq(\n                        c2cWithDraw = listOf(\n                            MsgSvc.PbC2CMsgWithDrawReq(\n                                subCmd = 1,\n                                longMessageFlag = 0,\n                                msgInfo = messageSequenceId.zip(messageRandom).map { (seq, random) ->\n                                    MsgSvc.PbC2CMsgWithDrawReq.MsgInfo(\n                                        msgType = 0,\n                                        fromUin = client.bot.id,\n                                        toUin = toUin,\n                                        msgSeq = seq,\n                                        msgRandom = random,\n                                        msgUid = 0x0100000000000000 or random.toLongUnsigned(),\n                                        msgTime = time.toLongUnsigned(),\n                                        routingHead = MsgSvc.RoutingHead(\n                                            grpTmp = MsgSvc.GrpTmp(groupUin, toUin)\n                                        ),\n                                    )\n                                },\n                                reserved = RESERVED_TEMP\n                            )\n                        )\n                    )\n                )\n            }\n        }\n\n        private val RESERVED_TEMP = \"08 01 10 E3 E9 D6 80 02\".hexToBytes()\n\n        fun createForFriendMessage(\n            client: QQAndroidClient,\n            toUin: Long,\n            messageSequenceId: IntArray, // 56639\n            messageRandom: IntArray, // 921878719\n            time: Int\n        ): OutgoingPacketWithRespType<Response> {\n            require(messageSequenceId.size == messageRandom.size)\n\n            return buildOutgoingUniPacket(\n                client,\n                remark = \"PbMsgWithDraw(\" +\n                        \"friend=$toUin, \" +\n                        \"seq=${messageSequenceId.joinToString(separator = \",\")}, \" +\n                        \"rand=${messageRandom.joinToString(separator = \",\")}, \" +\n                        \"time=${time}\" +\n                        \")\"\n            ) {\n                writeProtoBuf(\n                    MsgSvc.PbMsgWithDrawReq.serializer(),\n                    MsgSvc.PbMsgWithDrawReq(\n                        c2cWithDraw = listOf(\n                            MsgSvc.PbC2CMsgWithDrawReq(\n                                subCmd = 1,\n                                longMessageFlag = 0,\n                                msgInfo = messageSequenceId.zip(messageRandom).map { (seq, random) ->\n                                    MsgSvc.PbC2CMsgWithDrawReq.MsgInfo(\n                                        msgType = 0,\n                                        fromUin = client.bot.id,\n                                        toUin = toUin,\n                                        msgSeq = seq,\n                                        msgRandom = random,\n                                        msgUid = 0x0100000000000000 or random.toLongUnsigned(),\n                                        msgTime = time.toLongUnsigned(),\n                                        routingHead = MsgSvc.RoutingHead(\n                                            c2c = MsgSvc.C2C(\n                                                toUin = toUin\n                                            )\n                                        )\n                                    )\n                                },\n                                reserved = MsgRevokeUserDef.UinTypeUserDef(\n                                    0,\n                                ).toByteArray(MsgRevokeUserDef.UinTypeUserDef.serializer())\n                            )\n                        )\n                    )\n                )\n            }\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            val resp = readProtoBuf(MsgSvc.PbMsgWithDrawResp.serializer())\n            resp.groupWithDraw.firstOrNull()?.let {\n                if (it.result != 0) {\n                    return Response.Failed(it.result, it.errmsg)\n                }\n                return Response.Success\n            }\n            resp.c2cWithDraw.firstOrNull()?.let {\n                if (it.result != 2 && it.result != 3) {\n                    return Response.Failed(it.result, it.errmsg)\n                }\n                return Response.Success\n            }\n            return Response.Failed(-1, \"No response\")\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/SendMessageMultiProtocol.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/TroopEssenceMsgManager.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Oidb0xeac\nimport net.mamoe.mirai.internal.network.protocol.data.proto.OidbSso\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf\n\n/**\n * 群精华消息管理\n *\n * */\n\ninternal class TroopEssenceMsgManager {\n\n    internal data class Response(val success: Boolean, val msg: String?) : Packet\n\n    internal object SetEssence : OutgoingPacketFactory<Response>(\"OidbSvc.0xeac_1\") {\n\n        operator fun invoke(\n            client: QQAndroidClient,\n            troopUin: Long,\n            msgRandom: Int,\n            msgSeq: Int\n        ) = buildOutgoingUniPacket(client) {\n            writeProtoBuf(\n                OidbSso.OIDBSSOPkg.serializer(), OidbSso.OIDBSSOPkg(\n                    command = 3756,\n                    result = 0,\n                    serviceType = 1,\n                    bodybuffer = Oidb0xeac.ReqBody(\n                        groupCode = troopUin,\n                        msgSeq = msgSeq.and(-1),\n                        msgRandom = msgRandom\n                    ).toByteArray(Oidb0xeac.ReqBody.serializer()),\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            readProtoBuf(OidbSso.OIDBSSOPkg.serializer()).let { pkg ->\n                pkg.bodybuffer.loadAs(Oidb0xeac.RspBody.serializer()).let { data ->\n                    return Response(data.errorCode == 0, data.wording)\n                }\n            }\n\n        }\n    }\n\n    internal object RemoveEssence : OutgoingPacketFactory<Response>(\"OidbSvc.0xeac_2\") {\n\n        operator fun invoke(\n            client: QQAndroidClient,\n            troopUin: Long,\n            msgRandom: Int,\n            msgSeq: Int\n        ) = buildOutgoingUniPacket(client) {\n            writeProtoBuf(\n                OidbSso.OIDBSSOPkg.serializer(), OidbSso.OIDBSSOPkg(\n                    command = 3756,\n                    result = 0,\n                    serviceType = 1,\n                    bodybuffer = Oidb0xeac.ReqBody(\n                        groupCode = troopUin,\n                        msgSeq = msgSeq.and(-1),\n                        msgRandom = msgRandom\n                    ).toByteArray(Oidb0xeac.ReqBody.serializer()),\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            readProtoBuf(OidbSso.OIDBSSOPkg.serializer()).let { pkg ->\n                pkg.bodybuffer.loadAs(Oidb0xeac.RspBody.serializer()).let { data ->\n                    return Response(data.errorCode == 0, data.wording)\n                }\n            }\n\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/TroopManagement.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.contact.Member\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.info.GroupInfoImpl\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.data.jce.ModifyGroupCardReq\nimport net.mamoe.mirai.internal.network.protocol.data.jce.RequestPacket\nimport net.mamoe.mirai.internal.network.protocol.data.jce.stUinInfo\nimport net.mamoe.mirai.internal.network.protocol.data.proto.*\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketWithRespType\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.network.subAppId\nimport net.mamoe.mirai.internal.utils.io.serialization.*\nimport net.mamoe.mirai.utils.daysToSeconds\n\ninternal class TroopManagement {\n    internal object Mute : OutgoingPacketFactory<Mute.Response>(\"OidbSvc.0x570_8\") {\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            //屁用没有\n            return Response\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient,\n            groupCode: Long,\n            memberUin: Long,\n            timeInSecond: Int\n        ): OutgoingPacketWithRespType<Response> {\n            require(timeInSecond in 0..30.daysToSeconds)\n            return buildOutgoingUniPacket(client) {\n                writeProtoBuf(\n                    OidbSso.OIDBSSOPkg.serializer(),\n                    OidbSso.OIDBSSOPkg(\n                        command = 1392,\n                        serviceType = 8,\n                        result = 0,\n                        bodybuffer = buildPacket {\n                            writeInt(groupCode.toInt())//id or UIN?\n                            writeByte(32)\n                            writeShort(1)\n                            writeInt(memberUin.toInt())\n                            writeInt(timeInSecond)\n                        }.readBytes()\n                    )\n                )\n            }\n        }\n\n        object Response : Packet {\n            override fun toString(): String = \"Response(Mute)\"\n        }\n    }\n\n\n    internal object GetGroupInfo : OutgoingPacketFactory<GroupInfoImpl>(\"OidbSvc.0x88d_7\") {\n        @Deprecated(\"\")\n        operator fun invoke(\n            client: QQAndroidClient,\n            groupCode: Long\n        ): OutgoingPacketWithRespType<GroupInfoImpl> {\n            return buildOutgoingUniPacket(client) {\n                writeProtoBuf(\n                    OidbSso.OIDBSSOPkg.serializer(),\n                    OidbSso.OIDBSSOPkg(\n                        command = 2189,\n                        serviceType = 7,\n                        result = 0,\n                        bodybuffer = Oidb0x88d.ReqBody(\n                            appid = client.subAppId.toInt(),\n                            stzreqgroupinfo = listOf(\n                                Oidb0x88d.ReqGroupInfo(\n                                    stgroupinfo = Oidb0x88d.GroupInfo(\n                                        groupFlagExt = 0,\n                                        groupFlagext4 = 0,\n                                        groupFlag = 0,\n                                        groupFlagext3 = 1,//获取confess\n                                        noFingerOpenFlag = 1,\n                                        cmduinFlagEx2 = 0,\n                                        groupTypeFlag = 0,\n                                        appPrivilegeFlag = 0,\n                                        cmduinFlagEx = 0,\n                                        cmduinNewMobileFlag = 0,\n                                        cmduinUinFlag = 0,\n                                        createSourceFlag = 0,\n                                        noCodeFingerOpenFlag = 0,\n                                        ingGroupQuestion = \"\",\n                                        ingGroupAnswer = \"\",\n                                        groupName = \"\",\n                                        longGroupName = \"\",\n                                        groupMemo = \"\",\n                                        groupUin = 0,\n                                        groupOwner = 0\n                                    ),\n                                    groupCode = groupCode\n                                )\n                            )\n                        ).toByteArray(Oidb0x88d.ReqBody.serializer())\n                    )\n                )\n            }\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): GroupInfoImpl {\n            error(\"deprecated\")\n            /*\n            with(\n                this.readBytes()\n                    .loadAs(OidbSso.OIDBSSOPkg.serializer()).bodybuffer.loadAs(Oidb0x88d.RspBody.serializer()).stzrspgroupinfo!![0].stgroupinfo!!\n            ) {\n                return GroupInfoImpl()\n            }*/\n        }\n    }\n\n    internal object GetTroopConfig : OutgoingPacketFactory<GetTroopConfig.Response>(\"OidbSvc.0x496\") {\n        class Response(\n            val success: Boolean\n        ) : Packet {\n            override fun toString(): String = \"TroopManagement.GetTroopConfig.Response($success)\"\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient\n        ) = buildOutgoingUniPacket(client) {\n            writeProtoBuf(\n                OidbSso.OIDBSSOPkg.serializer(), OidbSso.OIDBSSOPkg(\n                    command = 1174,\n                    result = 0,\n                    serviceType = 0,\n                    clientVersion = \"android 8.4.18\",\n                    bodybuffer = Oidb0x496.ReqBody(\n                        updateTime = 0,\n                        firstUnreadManagerMsgSeq = 1,\n                        version = client.groupConfig.robotConfigVersion,\n                        aioKeywordVersion = client.groupConfig.aioKeyWordVersion,\n                        type = 3\n                    ).toByteArray(Oidb0x496.ReqBody.serializer())\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            readProtoBuf(OidbSso.OIDBSSOPkg.serializer()).let { pkg ->\n                pkg.bodybuffer.loadAs(Oidb0x496.RspBody.serializer()).let { data ->\n                    bot.client.groupConfig.let { config ->\n                        config.aioKeyWordVersion = data.aioKeywordConfig!!.version\n                        config.robotConfigVersion = data.robotConfig!!.version\n                        config.robotUinRangeList = data.robotConfig.uinRange.asSequence().map { range ->\n                            LongRange(range.startUin, range.endUin)\n                        }.toList()\n                    }\n                }\n\n                return Response(pkg.result == 0)\n            }\n        }\n    }\n\n    internal object Kick : OutgoingPacketFactory<Kick.Response>(\"OidbSvc.0x8a0_0\") {\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            val ret = this.readBytes()\n                .loadAs(OidbSso.OIDBSSOPkg.serializer()).bodybuffer.loadAs(Oidb0x8a0.RspBody.serializer()).msgKickResult.first().optUint32Result\n            return Response(\n                ret == 0,\n                ret\n            )\n        }\n\n        class Response(\n            val success: Boolean,\n            val ret: Int\n        ) : Packet {\n            override fun toString(): String = \"TroopManagement.Kick.Response($success)\"\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient,\n            groupCode: Long,\n            memberId: Long,\n            message: String,\n            ban: Boolean\n        ) = buildOutgoingUniPacket(client) {\n            writeProtoBuf(\n                OidbSso.OIDBSSOPkg.serializer(),\n                OidbSso.OIDBSSOPkg(\n                    command = 2208,\n                    serviceType = 0,//或者1\n                    result = 0,\n                    bodybuffer = Oidb0x8a0.ReqBody(\n                        optUint64GroupCode = groupCode,\n                        msgKickList = listOf(\n                            Oidb0x8a0.KickMemberInfo(\n                                optUint32Operate = 5,\n                                optUint64MemberUin = memberId,\n                                optUint32Flag = if (ban) 1 else 0 //1为拉黑\n                            )\n                        ),\n                        kickMsg = message.toByteArray()\n                    ).toByteArray(Oidb0x8a0.ReqBody.serializer())\n                )\n            )\n        }\n\n    }\n\n    internal object SwitchAnonymousChat : OutgoingPacketFactory<SwitchAnonymousChat.Response>(\"OidbSvc.0x568_22\") {\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            val ret = this.readBytes()\n                .loadAs(OidbSso.OIDBSSOPkg.serializer()).result\n            return Response(\n                ret == 0\n            )\n        }\n\n        class Response(\n            val success: Boolean\n        ) : Packet {\n            override fun toString(): String = \"TroopManagement.SwitchAnonymousChat.Response($success)\"\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient,\n            groupCode: Long,\n            switch: Boolean\n        ) = buildOutgoingUniPacket(client) {\n            writeProtoBuf(\n                OidbSso.OIDBSSOPkg.serializer(),\n                OidbSso.OIDBSSOPkg(\n                    command = 1384,\n                    serviceType = 22,\n                    result = 0,\n                    bodybuffer = buildPacket {\n                        writeInt(groupCode.toInt())\n                        if (switch) {\n                            writeByte(1)\n                        } else {\n                            writeByte(0)\n                        }\n                    }.readBytes()\n                )\n            )\n        }\n\n    }\n\n    internal object GroupOperation : OutgoingPacketFactory<GroupOperation.Response>(\"OidbSvc.0x89a_0\") {\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response = Response\n\n        fun muteAll(\n            client: QQAndroidClient,\n            groupCode: Long,\n            switch: Boolean\n        ) = impl(client, groupCode) {\n            shutupTime = if (switch) 0x0FFFFFFF else 0\n        }\n\n        private inline fun impl(\n            client: QQAndroidClient,\n            groupCode: Long,\n            crossinline info: Oidb0x89a.Groupinfo.() -> Unit\n        ): OutgoingPacket {\n            return buildOutgoingUniPacket(client) {\n                writeProtoBuf(\n                    OidbSso.OIDBSSOPkg.serializer(),\n                    OidbSso.OIDBSSOPkg(\n                        command = 2202,\n                        serviceType = 0,\n                        bodybuffer = Oidb0x89a.ReqBody(\n                            groupCode = groupCode,\n                            stGroupInfo = Oidb0x89a.Groupinfo().apply(info)\n                        ).toByteArray(Oidb0x89a.ReqBody.serializer()),\n                    )\n                )\n            }\n        }\n\n        fun autoApprove(\n            client: QQAndroidClient,\n            groupCode: Long,\n            switch: Boolean\n        ) = impl(client, groupCode) {\n            groupFlagext3 = if (switch) 0x00100000 else 0x00000000//暂时无效\n        }\n\n        fun name(\n            client: QQAndroidClient,\n            groupCode: Long,\n            newName: String\n        ) = impl(client, groupCode) {\n            ingGroupName = newName.toByteArray()\n        }\n\n        fun memo(\n            client: QQAndroidClient,\n            groupCode: Long,\n            newMemo: String\n        ) = impl(client, groupCode) {\n            ingGroupMemo = newMemo.toByteArray()\n        }\n\n        fun allowMemberInvite(\n            client: QQAndroidClient,\n            groupCode: Long,\n            switch: Boolean\n        ) = impl(client, groupCode) {\n            allowMemberInvite = if (switch) 1 else 0\n        }\n\n        object Response : Packet {\n            override fun toString(): String {\n                return \"TroopManagement.GroupOperation.Response\"\n            }\n        }\n    }\n\n\n    internal object EditSpecialTitle : OutgoingPacketFactory<EditSpecialTitle.Response>(\"OidbSvc.0x8fc_2\") {\n        object Response : Packet\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            return Response\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient,\n            member: Member,\n            newName: String\n        ): OutgoingPacket {\n            return buildOutgoingUniPacket(client) {\n                writeProtoBuf(\n                    OidbSso.OIDBSSOPkg.serializer(),\n                    OidbSso.OIDBSSOPkg(\n                        command = 2300,\n                        serviceType = 2,\n                        bodybuffer = Oidb0x8fc.ReqBody(\n                            groupCode = member.group.id,\n                            memLevelInfo = listOf(\n                                Oidb0x8fc.MemberInfo(\n                                    uin = member.id,\n                                    uinName = newName.toByteArray(),\n                                    specialTitle = newName.toByteArray(),\n                                    specialTitleExpireTime = -1\n                                )\n                            )\n                        ).toByteArray(Oidb0x8fc.ReqBody.serializer())\n                    )\n                )\n            }\n        }\n    }\n\n    internal object EditGroupNametag :\n        OutgoingPacketFactory<EditGroupNametag.Response>(\"friendlist.ModifyGroupCardReq\") {\n        object Response : Packet {\n            override fun toString(): String {\n                return \"TroopManagement.EditGroupNametag.Response\"\n            }\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): EditGroupNametag.Response {\n            this.close()\n            return Response\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient,\n            member: Member,\n            newName: String\n        ): OutgoingPacketWithRespType<Response> {\n            return buildOutgoingUniPacket(client) {\n                writeJceStruct(\n                    RequestPacket.serializer(),\n                    RequestPacket(\n                        funcName = \"ModifyGroupCardReq\",\n                        servantName = \"mqq.IMService.FriendListServiceServantObj\",\n                        version = 3,\n                        cPacketType = 0x00,\n                        requestId = client.nextRequestPacketRequestId(),\n                        sBuffer = jceRequestSBuffer(\n                            \"MGCREQ\",\n                            ModifyGroupCardReq.serializer(),\n                            ModifyGroupCardReq(\n                                dwZero = 0L,\n                                dwGroupCode = member.group.id,\n                                dwNewSeq = 0L,\n                                vecUinInfo = listOf(\n                                    stUinInfo(\n                                        gender = 0,\n                                        dwuin = member.id,\n                                        dwFlag = 31,\n                                        sName = newName,\n                                        sPhone = \"\",\n                                        sEmail = \"\",\n                                        sRemark = \"\"\n                                    )\n                                )\n                            )\n                        )\n                    )\n                )\n            }\n        }\n\n    }\n\n    internal object ModifyAdmin : OutgoingPacketFactory<ModifyAdmin.Response>(\"OidbSvc.0x55c_1\") {\n        data class Response(\n            val code: Int,\n            val success: Boolean,\n            val msg: String,\n        ) : Packet {\n            override fun toString(): String {\n                return \"TroopManagement.ModifyAdmin.Response(code=${code}, success=${success}, msg=${msg})\"\n            }\n        }\n\n        /**\n         * @param operation: true is add\n         */\n        operator fun invoke(\n            client: QQAndroidClient,\n            member: Member,\n            operation: Boolean\n        ): OutgoingPacket {\n            return buildOutgoingUniPacket(client) {\n                writeProtoBuf(\n                    OidbSso.OIDBSSOPkg.serializer(),\n                    OidbSso.OIDBSSOPkg(\n                        command = 1372,\n                        serviceType = 1,\n                        bodybuffer = buildPacket {\n                            writeInt(member.group.id.toInt())\n                            writeInt(member.id.toInt())\n                            writeByte(if (operation) 1 else 0)\n                        }.readBytes()\n                    )\n                )\n            }\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): ModifyAdmin.Response {\n            val stupidPacket = readProtoBuf(OidbSso.OIDBSSOPkg.serializer())\n            return stupidPacket.run {\n                ModifyAdmin.Response(\n                    this.result,\n                    this.result == 0,\n                    this.errorMsg\n                )\n            }\n        }\n\n    }\n\n    internal object GetGroupLastMsgSeq : OutgoingPacketFactory<GetGroupLastMsgSeq.Response>(\"OidbSvc.0x88d_0\") {\n        sealed class Response(val groupUin: Long, val seq: Int) : Packet {\n            object Failed : Response(-1, -1) {\n                override fun toString(): String {\n                    return \"TroopManagement.GetGroupLastMsgSeq.Failed\"\n                }\n            }\n\n            class Success(groupUin: Long, seq: Int) : Response(groupUin, seq) {\n                override fun toString(): String {\n                    return \"TroopManagement.GetGroupLastMsgSeq.Response(groupUin=${groupUin}, seq=${seq})\"\n                }\n            }\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient,\n            groupUin: Long,\n        ) = buildOutgoingUniPacket(client) {\n            writeOidb(\n                2189,\n                0,\n                Oidb0x88d.ReqBody.serializer(),\n                Oidb0x88d.ReqBody(\n                    appid = client.subAppId.toInt(),\n                    stzreqgroupinfo = listOf(\n                        Oidb0x88d.ReqGroupInfo(\n                            groupCode = groupUin,\n                            stgroupinfo = Oidb0x88d.GroupInfo(groupCurMsgSeq = 0)\n                        )\n                    )\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            val resp = readOidbRespCommon(Oidb0x88d.RspBody.serializer()) { it.stzrspgroupinfo }\n                .toResult(\"OidbSvc.0x88d_0\") { it == 0 }\n                .getOrNull() ?: return Response.Failed\n\n            check(resp.isNotEmpty()) { return Response.Failed }\n\n            val group = resp.first()\n            val info = group.stgroupinfo ?: return Response.Failed\n            val seq = info.groupCurMsgSeq ?: return Response.Failed\n\n            return Response.Success(group.groupCode, seq)\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/image/ImgStore.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat.image\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Cmd0x388\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf\nimport kotlin.random.Random\nimport kotlin.random.nextInt\n\ninternal fun getRandomString(length: Int): String =\n    getRandomString(length, charRanges = defaultRanges)\n\nprivate val defaultRanges: Array<CharRange> = arrayOf('a'..'z', 'A'..'Z', '0'..'9')\n\ninternal fun getRandomString(length: Int, vararg charRanges: CharRange): String =\n    CharArray(length) { charRanges[Random.Default.nextInt(0..charRanges.lastIndex)].random() }.concatToString()\n\ninternal class ImgStore {\n    object GroupPicUp : OutgoingPacketFactory<GroupPicUp.Response>(\"ImgStore.GroupPicUp\") {\n\n        operator fun invoke(\n            client: QQAndroidClient,\n            uin: Long,\n            groupCode: Long,\n            md5: ByteArray,\n            size: Long,\n            picWidth: Int = 0, // not orthodox\n            picHeight: Int = 0, // not orthodox\n            picType: Int = 2001,\n            fileId: Long = 0,\n            filename: String = getRandomString(16) + \".gif\", // make server happier\n            srcTerm: Int = 5,\n            platformType: Int = 9,\n            buType: Int = 1, // group 1, other 2\n            appPicType: Int = 1006,\n        ) = buildOutgoingUniPacket(client) {\n            writeProtoBuf(\n                Cmd0x388.ReqBody.serializer(),\n                Cmd0x388.ReqBody(\n                    netType = 3, // wifi\n                    subcmd = 1,\n                    msgTryupImgReq = listOf(\n                        Cmd0x388.TryUpImgReq(\n                            groupCode = groupCode,\n                            srcUin = uin,\n                            fileMd5 = md5,\n                            fileSize = size,\n                            fileId = fileId,\n                            fileName = filename,\n                            picWidth = picWidth,\n                            picHeight = picHeight,\n                            picType = picType,\n                            appPicType = appPicType,\n                            buildVer = client.buildVer,\n                            srcTerm = srcTerm,\n                            platformType = platformType,\n                            //For gif, not original there\n                            originalPic = if (picType == 2000) {\n                                0\n                            } else {\n                                1\n                            },\n                            buType = buType\n                        )\n                    )\n                )\n            )\n        }\n\n        sealed class Response : Packet {\n            class FileExists(\n                val fileId: Long,\n                val fileInfo: Cmd0x388.ImgInfo\n            ) : Response() {\n                override fun toString(): String {\n                    return \"FileExists(fileId=$fileId, fileInfo=$fileInfo)\"\n                }\n            }\n\n            class RequireUpload(\n                val fileId: Long,\n                val uKey: ByteArray,\n                val uploadIpList: List<Int>,\n                val uploadPortList: List<Int>\n            ) : Response() {\n                override fun toString(): String {\n                    return \"RequireUpload(fileId=$fileId, uKey=${uKey.contentToString()})\"\n                }\n            }\n\n            data class Failed(\n                val resultCode: Int,\n                val message: String\n            ) : Response()\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            val resp0 = readProtoBuf(Cmd0x388.RspBody.serializer())\n            val resp =\n                resp0.msgTryupImgRsp.firstOrNull() ?: error(\"cannot find `msgTryupImgRsp` from `Cmd0x388.RspBody`\")\n            return when {\n                resp.result != 0 -> Response.Failed(resultCode = resp.result, message = resp.failMsg)\n                resp.boolFileExit -> Response.FileExists(fileId = resp.fileid, fileInfo = resp.msgImgInfo!!)\n                else -> Response.RequireUpload(\n                    fileId = resp.fileid,\n                    uKey = resp.upUkey,\n                    uploadIpList = resp.uint32UpIp,\n                    uploadPortList = resp.uint32UpPort\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/image/LongConn.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat.image\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Cmd0x352\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf\n\ninternal class LongConn {\n\n    internal object OffPicUp : OutgoingPacketFactory<OffPicUp.Response>(\"LongConn.OffPicUp\") {\n\n        operator fun invoke(client: QQAndroidClient, req: Cmd0x352.TryUpImgReq) =\n            buildOutgoingUniPacket(client) {\n                writeProtoBuf(\n                    Cmd0x352.ReqBody.serializer(),\n                    Cmd0x352.ReqBody(\n                        subcmd = 1,\n                        netType = 3,\n                        msgTryupImgReq = listOf(req),\n                        msgDelImgReq = listOf(),\n                        msgGetimgUrlReq = listOf(),\n                    )\n                )\n            }\n\n\n        //08 01 12 7D 08 00 10 AB E1 9D DF 07 18 00 28 01 32 1C 0A 10 8E C4 9D 72 26 AE 20 C0 5D A2 B6 78 4D 12 B7 3A 10 E9 07 18 86 1F 20 30 28 30 52 25 2F 61 30 30 39 32 64 61 39 2D 64 39 31 38 2D 34 38 31 62 2D 38 34 30 63 2D 33 32 33 64 64 33 39 33 34 35 37 63 5A 25 2F 61 30 30 39 32 64 61 39 2D 64 39 31 38 2D 34 38 31 62 2D 38 34 30 63 2D 33 32 33 64 64 33 39 33 34 35 37 63 60 00 68 80 40 20 01\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            val resp = readProtoBuf(Cmd0x352.RspBody.serializer())\n            if (resp.failMsg?.isNotEmpty() == true) {\n                return Response.Failed(resp.failMsg)\n            }\n            check(resp.subcmd == 1)\n            val imgRsp = resp.msgTryupImgRsp.first()\n            if (imgRsp.result != 0) {\n                return Response.Failed(imgRsp.failMsg)\n            }\n\n            return if (imgRsp.boolFileExit) {\n                Response.FileExists(imgRsp.upResid, imgRsp.msgImgInfo!!)\n            } else {\n                Response.RequireUpload(imgRsp.upResid, imgRsp.uint32UpIp, imgRsp.uint32UpPort, imgRsp.upUkey)\n            }\n        }\n\n\n        sealed class Response : Packet {\n            data class FileExists(val resourceId: String, val imageInfo: Cmd0x352.ImgInfo) : Response()\n\n            @Suppress(\"ArrayInDataClass\")\n            data class RequireUpload(\n                val resourceId: String,\n                val serverIp: List<Int>,\n                val serverPort: List<Int>,\n                val uKey: ByteArray\n            ) : Response()\n\n            data class Failed(val message: String) : Response()\n        }\n\n    }\n\n//    object OffPicDown : OutgoingPacketFactory<OffPicDown.ImageDownPacketResponse>(\"LongConn.OffPicDown\") {\n//        operator fun invoke(client: QQAndroidClient, @Suppress(\"UNUSED_PARAMETER\") req: GetImgUrlReq): OutgoingPacket {\n//            return buildOutgoingUniPacket(client) {\n//            }\n//        }\n//\n//        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): ImageDownPacketResponse {\n//        }\n//\n//\n//        sealed class ImageDownPacketResponse : Packet {\n//            object Success : ImageDownPacketResponse()\n//        }\n//    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbDeleteMsg.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat.receive\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgSvc\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf\n\ninternal object MessageSvcPbDeleteMsg : OutgoingPacketFactory<Nothing?>(\"MessageSvc.PbDeleteMsg\") {\n\n    internal operator fun invoke(client: QQAndroidClient, items: List<MsgSvc.PbDeleteMsgReq.MsgItem>) =\n        buildOutgoingUniPacket(client) {\n\n            writeProtoBuf(\n                MsgSvc.PbDeleteMsgReq.serializer(),\n                MsgSvc.PbDeleteMsgReq(\n                    msgItems = items\n                )\n            )\n        }\n\n    internal suspend fun delete(bot: QQAndroidBot, messages: List<MsgComm.Msg>) {\n        val map = messages.map {\n            MsgSvc.PbDeleteMsgReq.MsgItem(\n                fromUin = it.msgHead.fromUin,\n                toUin = it.msgHead.toUin,\n                // 群为84、好友为187。群通过其他方法删除，但测试结果显示通过187也能删除群消息。\n                msgType = 187,\n                msgSeq = it.msgHead.msgSeq,\n                msgUid = it.msgHead.msgUid,\n            )\n        }\n\n        bot.network.sendWithoutExpect(MessageSvcPbDeleteMsg(bot.client, map))\n    }\n\n\n    override suspend fun ByteReadPacket.decode(bot: QQAndroidBot) = null\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbGetGroupMsg.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat.receive\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgSvc\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf\n\n/*\n * 获取群历史消息\n */\ninternal object MessageSvcPbGetGroupMsg : OutgoingPacketFactory<MessageSvcPbGetGroupMsg.Response>(\"MessageSvc.PbGetGroupMsg\") {\n    sealed class Response : Packet\n\n    class Failed(\n        val result: Int,\n        val errorMsg: String\n    ) : Response()\n\n    class Success(\n        val msgElem: List<MsgComm.Msg>,\n        val beginSequence: Long,\n        val endSequence: Long,\n    ) : Response()\n\n    operator fun invoke(\n        client: QQAndroidClient,\n        groupUin: Long,\n        messageSequence: Long,\n        count: Int,\n    ) = buildOutgoingUniPacket(client) {\n        writeProtoBuf(\n            MsgSvc.PbGetGroupMsgReq.serializer(),\n            MsgSvc.PbGetGroupMsgReq(\n                groupCode = groupUin,\n                beginSeq = messageSequence - count + 1,\n                endSeq = messageSequence,\n\n            )\n        )\n    }\n\n    override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n        val resp = readProtoBuf(MsgSvc.PbGetGroupMsgResp.serializer())\n        return if (resp.result != 0) {\n            Failed(resp.result, resp.errmsg)\n        } else {\n            Success(\n                msgElem = resp.msg,\n                beginSequence = resp.returnBeginSeq,\n                endSequence = resp.returnEndSeq\n            )\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat.receive\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.event.events.BotEvent\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.MultiPacket\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.components.NoticePipelineContext.Companion.KEY_FROM_SYNC\nimport net.mamoe.mirai.internal.network.components.NoticeProcessorPipeline.Companion.processPacketThroughPipeline\nimport net.mamoe.mirai.internal.network.components.SyncController.Companion.syncController\nimport net.mamoe.mirai.internal.network.components.syncGetMessage\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgSvc\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf\nimport net.mamoe.mirai.utils.toLongUnsigned\nimport kotlin.random.Random\n\n\n/**\n * 获取好友消息和消息记录\n */\ninternal object MessageSvcPbGetMsg : OutgoingPacketFactory<MessageSvcPbGetMsg.Response>(\"MessageSvc.PbGetMsg\") {\n\n\n    @Suppress(\"SpellCheckingInspection\")\n    operator fun invoke(\n        client: QQAndroidClient,\n        syncFlag: MsgSvc.SyncFlag = MsgSvc.SyncFlag.START,\n        syncCookie: ByteArray?, //PbPushMsg.msg.msgHead.msgTime\n    ) = buildOutgoingUniPacket(client) {\n        //println(\"syncCookie=${client.c2cMessageSync.syncCookie?.toUHexString()}\")\n        writeProtoBuf(\n            MsgSvc.PbGetMsgReq.serializer(),\n            MsgSvc.PbGetMsgReq(\n                msgReqType = 1, // from.ctype.toInt()\n                contextFlag = 1,\n                rambleFlag = 0,\n                latestRambleNumber = 20,\n                otherRambleNumber = 3,\n                onlineSyncFlag = 1,\n                whisperSessionId = 0,\n                syncFlag = syncFlag,\n                //  serverBuf = from.serverBuf ?: EMPTY_BYTE_ARRAY,\n                syncCookie = syncCookie ?: client.bot.syncController.syncCookie\n                ?: byteArrayOf(), //.also { client.c2cMessageSync.syncCookie = it },\n                // syncFlag = client.c2cMessageSync.syncFlag,\n                //msgCtrlBuf = client.c2cMessageSync.msgCtrlBuf,\n                //pubaccountCookie = client.c2cMessageSync.pubAccountCookie\n            ),\n        )\n    }\n\n    open class GetMsgSuccess(delegate: List<Packet>, syncCookie: ByteArray?, bot: QQAndroidBot) :\n        Response(MsgSvc.SyncFlag.STOP, delegate, syncCookie, bot) {\n\n        override fun toString(): String = \"MessageSvcPbGetMsg.GetMsgSuccess\"\n    }\n\n    /**\n     * 不要直接 expect 这个 class. 它可能还没同步完成\n     */\n    open class Response(\n        internal val syncFlagFromServer: MsgSvc.SyncFlag,\n        private val delegate: List<Packet>,\n        val syncCookie: ByteArray?, override val bot: Bot,\n    ) : AbstractEvent(),\n        MultiPacket,\n        Packet.NoEventLog,\n        BotEvent {\n        override val isMeaningful: Boolean get() = true\n\n        override fun children(): Iterator<Packet> {\n            return delegate.iterator()\n        }\n\n        override fun toString(): String =\n            \"MessageSvcPbGetMsg.Response(flag=$syncFlagFromServer)\"\n    }\n\n    class EmptyResponse(\n        bot: QQAndroidBot,\n    ) : GetMsgSuccess(emptyList(), null, bot)\n\n    override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n        // 00 00 01 0F 08 00 12 00 1A 34 08 FF C1 C4 F1 05 10 FF C1 C4 F1 05 18 E6 ED B9 C3 02 20 89 FE BE A4 06 28 8A CA 91 D1 0C 48 9B A5 BD 9B 0A 58 DE 9D 99 F8 08 60 1D 68 FF C1 C4 F1 05 70 00 20 02 2A 9D 01 08 F3 C1 C4 F1 05 10 A2 FF 8C F0 03 18 01 22 8A 01 0A 2A 08 A2 FF 8C F0 03 10 DD F1 92 B7 07 18 A6 01 20 0B 28 AE F9 01 30 F4 C1 C4 F1 05 38 A7 E3 D8 D4 84 80 80 80 01 B8 01 CD B5 01 12 08 08 01 10 00 18 00 20 00 1A 52 0A 50 0A 27 08 00 10 F4 C1 C4 F1 05 18 A7 E3 D8 D4 04 20 00 28 0C 30 00 38 86 01 40 22 4A 0C E5 BE AE E8 BD AF E9 9B 85 E9 BB 91 12 08 0A 06 0A 04 4E 4D 53 4C 12 15 AA 02 12 9A 01 0F 80 01 01 C8 01 00 F0 01 00 F8 01 00 90 02 00 12 04 4A 02 08 00 30 01 2A 15 08 97 A2 C1 F1 05 10 95 A6 F5 E5 0C 18 01 30 01 40 01 48 81 01 2A 10 08 D3 F7 B5 F1 05 10 DD F1 92 B7 07 18 01 30 01 38 00 42 00 48 00\n        val resp = readProtoBuf(MsgSvc.PbGetMsgResp.serializer())\n\n        if (resp.result != 0) {\n            // this is normally recoverable, no need to log\n\n\n            //            bot.network.logger\n            //                .warning { \"MessageSvcPushNotify: result != 0, result = ${resp.result}, errorMsg=${resp.errmsg}\" }\n            bot.network.launch(CoroutineName(\"MessageSvcPushNotify.retry\")) {\n                delay(500 + Random.nextLong(0, 1000))\n                bot.network.sendWithoutExpect(MessageSvcPbGetMsg(bot.client, syncCookie = null))\n            }\n            return EmptyResponse(bot)\n        }\n        when (resp.msgRspType) {\n            0 -> {\n                bot.syncController.syncCookie = resp.syncCookie\n                bot.syncController.pubAccountCookie = resp.pubAccountCookie\n            }\n            1 -> {\n                bot.syncController.syncCookie = resp.syncCookie\n            }\n            2 -> {\n                bot.syncController.pubAccountCookie = resp.pubAccountCookie\n\n            }\n        }\n\n\n        // bot.logger.debug(resp.msgRspType._miraiContentToString())\n        // bot.logger.debug(resp.syncCookie._miraiContentToString())\n\n        bot.syncController.msgCtrlBuf = resp.msgCtrlBuf\n\n        if (resp.uinPairMsgs.isEmpty()) return EmptyResponse(bot)\n\n        val messages = resp.uinPairMsgs.asSequence()\n            .filterNot { it.msg.isEmpty() }\n            .flatMap { pair ->\n                pair.msg.asSequence()\n                    .filter { msg: MsgComm.Msg -> msg.msgHead.msgTime > pair.lastReadTime.toLongUnsigned() }\n            }\n            .toList()\n            .also { MessageSvcPbDeleteMsg.delete(bot, it) } // 删除消息\n            .filter { msg ->\n                bot.syncController.syncGetMessage(msg.msgHead)\n            }\n            .map { msg ->\n                bot.processPacketThroughPipeline(msg, KEY_FROM_SYNC to false)\n            }\n\n        val list: List<Packet> = messages\n        if (resp.syncFlag == MsgSvc.SyncFlag.STOP) {\n            return GetMsgSuccess(list, resp.syncCookie, bot)\n        }\n        return Response(resp.syncFlag, list, resp.syncCookie, bot)\n    }\n\n    override suspend fun QQAndroidBot.handle(packet: Response) {\n        when (packet.syncFlagFromServer) {\n            MsgSvc.SyncFlag.STOP -> {\n\n            }\n\n            MsgSvc.SyncFlag.START -> {\n                network.sendAndExpect(\n                    MessageSvcPbGetMsg(\n                        client,\n                        MsgSvc.SyncFlag.CONTINUE,\n                        bot.syncController.syncCookie,\n                    ), 5000, 2\n                )\n                return\n            }\n\n            MsgSvc.SyncFlag.CONTINUE -> {\n                network.sendAndExpect(\n                    MessageSvcPbGetMsg(\n                        client,\n                        MsgSvc.SyncFlag.CONTINUE,\n                        bot.syncController.syncCookie,\n                    ), 5000, 2\n                )\n                return\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbGetRoamMsgReq.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat.receive\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgSvc\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport net.mamoe.mirai.utils.Either\nimport net.mamoe.mirai.utils.Either.Companion.mapRight\nimport net.mamoe.mirai.utils.FailureResponse\nimport net.mamoe.mirai.utils.checked\n\ninternal class CheckedResponse<T>(\n    val value: Either<FailureResponse, T>\n) : Packet\n\ninternal object MessageSvcPbGetRoamMsgReq :\n    OutgoingPacketFactory<CheckedResponse<MessageSvcPbGetRoamMsgReq.Response>>(\"MessageSvc.PbGetRoamMsg\") {\n\n    class Response(\n        val messages: List<MsgComm.Msg>?,\n        val lastMessageTime: Long,\n        val random: Long,\n        val sig: ByteArray, // 似乎没被用到, 服务器每次返回不同\n    ) {\n\n    }\n\n    fun createForFriend(\n        client: QQAndroidClient,\n        uin: Long,\n        timeStart: Long,\n        lastMsgTime: Long, // 上次 resp 中的, 否则为期待的 time end\n        random: Long = 0,\n        maxCount: Int = 1000,\n        sig: ByteArray = EMPTY_BYTE_ARRAY, // 客户端每次请求相同\n        pwd: ByteArray = EMPTY_BYTE_ARRAY,\n    ) = buildOutgoingUniPacket(client) {\n        writeProtoBuf(\n            MsgSvc.PbGetRoamMsgReq.serializer(), MsgSvc.PbGetRoamMsgReq(\n                peerUin = uin,\n                beginMsgtime = timeStart,\n                lastMsgtime = lastMsgTime,\n                checkPwd = 1, // always\n                readCnt = maxCount,\n                subcmd = 1,\n                reqType = 1,\n                sig = sig,\n                pwd = pwd,\n                random = random,\n            )\n        )\n    }\n\n    override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): CheckedResponse<Response> {\n        val resp = readProtoBuf(MsgSvc.PbGetRoamMsgResp.serializer())\n        if (resp.result == 1) return CheckedResponse(\n            Either.right(\n                Response(\n                    null,\n                    resp.lastMsgtime,\n                    resp.random,\n                    resp.sig,\n                )\n            )\n        ) // finished\n        return CheckedResponse(resp.checked().mapRight {\n            Response(\n                messages = resp.msg.asReversed(),\n                lastMessageTime = resp.lastMsgtime,\n                random = resp.random,\n                sig = resp.sig,\n            )\n        })\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbSendMsg.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat.receive\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.coroutines.CompletableDeferred\nimport kotlinx.coroutines.Deferred\nimport net.mamoe.mirai.contact.Friend\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.Member\nimport net.mamoe.mirai.contact.Stranger\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.groupCode\nimport net.mamoe.mirai.internal.contact.uin\nimport net.mamoe.mirai.internal.message.data.ForwardMessageInternal\nimport net.mamoe.mirai.internal.message.data.toPtt\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocolFacade\nimport net.mamoe.mirai.internal.message.source.OnlineMessageSourceToFriendImpl\nimport net.mamoe.mirai.internal.message.source.OnlineMessageSourceToGroupImpl\nimport net.mamoe.mirai.internal.message.source.OnlineMessageSourceToStrangerImpl\nimport net.mamoe.mirai.internal.message.source.OnlineMessageSourceToTempImpl\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.components.ClockHolder.Companion.clock\nimport net.mamoe.mirai.internal.network.components.SyncController.Companion.syncController\nimport net.mamoe.mirai.internal.network.components.SyncController.Companion.syncCookie\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgCtrl\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgSvc\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.getRandomUnsignedInt\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.math.absoluteValue\nimport kotlin.random.Random\n\ninternal object MessageSvcPbSendMsg : OutgoingPacketFactory<MessageSvcPbSendMsg.Response>(\"MessageSvc.PbSendMsg\") {\n    sealed class Response : Packet {\n        class SUCCESS(\n            val sendTime: Int,\n        ) : Response() {\n            override fun toString(): String = \"MessageSvcPbSendMsg.Response.SUCCESS(time=$sendTime)\"\n        }\n\n        object MessageTooLarge : Response() {\n            override fun toString(): String = \"MessageSvcPbSendMsg.Response.MessageTooLarge\"\n        }\n\n        object ServiceUnavailable : Response() {\n            override fun toString(): String = \"MessageSvcPbSendMsg.Response.ServiceUnavailable\"\n        }\n\n        /**\n         * 121: 被限制? 个别号才不能发\n         */\n        data class Failed(val resultType: Int, val errorCode: Int, val errorMessage: String) : Response() {\n            override fun toString(): String =\n                \"MessageSvcPbSendMsg.Response.Failed(resultType=$resultType, errorCode=$errorCode, errorMessage=$errorMessage)\"\n        }\n    }\n\n    internal fun MessageChain.fragmented(): List<MessageChain> {\n        val results = mutableListOf<MessageChain>()\n        var txtAdd = false\n        val last = mutableListOf<Message>()\n        fun flush() {\n            txtAdd = false\n            if (last.isNotEmpty()) {\n                results.add(ArrayList(last).toMessageChain())\n                last.clear()\n            }\n        }\n        forEach { element ->\n            if (last.size >= 4) {\n                flush()\n            }\n            if (element is PlainText) {\n                if (txtAdd) {\n                    flush()\n                }\n                if (element.content.length < 80) {\n                    txtAdd = true\n                    last.add(element)\n                } else {\n                    val split = element.content.chunked(80)\n                    flush()\n                    split.forEach { results.add(PlainText(it).toMessageChain()) }\n                }\n            } else {\n                last.add(element)\n            }\n        }\n        flush()\n        return results\n    }\n\n    class LateinitBox<T : Any> {\n        lateinit var value: T\n    }\n\n    private inline fun buildOutgoingMessageCommon(\n        client: QQAndroidClient,\n        message: MessageChain,\n        crossinline fragmentTranslator: (MessageChain) -> ImMsgBody.MsgBody,\n        crossinline pbSendMsgReq: (\n            msgBody: ImMsgBody.MsgBody,\n            msgSeq: Int,\n            msgRand: Int,\n            contentHead: MsgComm.ContentHead,\n        ) -> MsgSvc.PbSendMsgReq,\n        sequenceIds: LateinitBox<IntArray>,\n        sequenceIdsInitializer: (Int) -> IntArray,\n        randIds: LateinitBox<IntArray>,\n        doFragmented: Boolean = true,\n        postInit: () -> Unit,\n    ): List<OutgoingPacket> {\n        val fragmented = if (doFragmented)\n            message.fragmented()\n        else listOf(message)\n\n        val response = mutableListOf<OutgoingPacket>()\n        val div = if (fragmented.size == 1) 0 else getRandomUnsignedInt()\n        val pkgNum = fragmented.size\n\n        val seqIds = sequenceIdsInitializer(pkgNum)\n        val randIds0 = IntArray(pkgNum) { getRandomUnsignedInt() }\n\n        sequenceIds.value = seqIds\n        randIds.value = randIds0\n        postInit()\n        fragmented.forEachIndexed { pkgIndex, fMsg ->\n            response.add(\n                buildOutgoingUniPacket(client) {\n                    writeProtoBuf(\n                        MsgSvc.PbSendMsgReq.serializer(),\n                        pbSendMsgReq(\n                            fragmentTranslator(fMsg),\n                            seqIds[pkgIndex],\n                            randIds0[pkgIndex],\n                            MsgComm.ContentHead(\n                                pkgNum = pkgNum,\n                                divSeq = div,\n                                pkgIndex = pkgIndex,\n                            ),\n                        ),\n                    )\n                },\n            )\n        }\n        return response\n    }\n\n    // old Voice\n    private fun PttMessage.toPtt() = run {\n        (this.pttInternalInstance as? ImMsgBody.Ptt)?.let { return it }\n        ImMsgBody.Ptt(\n            fileName = fileName.toByteArray(),\n            fileMd5 = md5,\n            boolValid = true,\n            fileSize = fileSize.toInt(),\n            fileType = 4,\n            pbReserve = byteArrayOf(0),\n            format = let {\n                @Suppress(\"DEPRECATION_ERROR\")\n                if (it is net.mamoe.mirai.message.data.Voice) {\n                    it._codec\n                } else {\n                    0\n                }\n            },\n        )\n    }\n\n    /**\n     * 发送陌生人消息\n     */\n    internal fun createToStrangerImpl(\n        client: QQAndroidClient,\n        target: Stranger,\n        message: MessageChain,\n        originalMessage: MessageChain,\n        fragmented: Boolean,\n        source: (OnlineMessageSourceToStrangerImpl) -> Unit,\n    ): List<OutgoingPacket> {\n\n        val sequenceIds = LateinitBox<IntArray>()\n        val randIds = LateinitBox<IntArray>()\n        return buildOutgoingMessageCommon(\n            client = client,\n            message = message,\n            fragmentTranslator = {\n                ImMsgBody.MsgBody(\n                    richText = ImMsgBody.RichText(\n                        elems = MessageProtocolFacade.encode(it, messageTarget = target, withGeneralFlags = true),\n                    ),\n                )\n            },\n            pbSendMsgReq = { msgBody, msgSeq, msgRand, contentHead ->\n                MsgSvc.PbSendMsgReq(\n                    routingHead = MsgSvc.RoutingHead(c2c = MsgSvc.C2C(toUin = target.uin)),\n                    contentHead = contentHead,\n                    msgBody = msgBody,\n                    msgSeq = msgSeq,\n                    msgRand = msgRand,\n                    syncCookie = client.syncCookie ?: byteArrayOf(),\n                    // msgVia = 1\n                )\n            },\n            sequenceIds = sequenceIds,\n            randIds = randIds,\n            sequenceIdsInitializer = { size ->\n                IntArray(size) { client.atomicNextMessageSequenceId() }\n            },\n            postInit = {\n                source(\n                    OnlineMessageSourceToStrangerImpl(\n                        internalIds = randIds.value,\n                        sender = client.bot,\n                        target = target,\n                        time = client.bot.clock.server.currentTimeSeconds().toInt(),\n                        sequenceIds = sequenceIds.value,\n                        originalMessage = originalMessage,\n                    ),\n                )\n            },\n            doFragmented = fragmented,\n        )\n    }\n\n    /**\n     * 发送好友消息\n     */\n    internal fun createToFriendImpl(\n        client: QQAndroidClient,\n        targetFriend: Friend,\n        message: MessageChain,\n        originalMessage: MessageChain,\n        fragmented: Boolean,\n        sourceCallback: (OnlineMessageSourceToFriendImpl) -> Unit,\n    ): List<OutgoingPacket> {\n        contract {\n            callsInPlace(sourceCallback, InvocationKind.EXACTLY_ONCE)\n        }\n\n        val sequenceIds = LateinitBox<IntArray>()\n        val randIds = LateinitBox<IntArray>()\n        return buildOutgoingMessageCommon(\n            client = client,\n            message = message,\n            fragmentTranslator = { subChain ->\n                ImMsgBody.MsgBody(\n                    richText = ImMsgBody.RichText(\n                        elems = MessageProtocolFacade.encode(\n                            subChain,\n                            messageTarget = targetFriend,\n                            withGeneralFlags = true\n                        ),\n                        ptt = subChain.findPtt(),\n                    ),\n                )\n            },\n            pbSendMsgReq = { msgBody, msgSeq, msgRand, contentHead ->\n                MsgSvc.PbSendMsgReq(\n                    routingHead = MsgSvc.RoutingHead(c2c = MsgSvc.C2C(toUin = targetFriend.uin)),\n                    contentHead = contentHead,\n                    msgBody = msgBody,\n                    msgSeq = msgSeq,\n                    msgRand = msgRand,\n                    syncCookie = client.syncCookie ?: byteArrayOf(),\n                    // msgVia = 1\n                )\n            },\n            sequenceIds = sequenceIds,\n            randIds = randIds,\n            sequenceIdsInitializer = { size ->\n                IntArray(size) { client.sendFriendMessageSeq.next() }\n            },\n            postInit = {\n                sourceCallback(\n                    OnlineMessageSourceToFriendImpl(\n                        internalIds = randIds.value,\n                        sender = client.bot,\n                        target = targetFriend,\n                        time = client.bot.clock.server.currentTimeSeconds().toInt(),\n                        sequenceIds = sequenceIds.value,\n                        originalMessage = originalMessage,\n                    ),\n                )\n            },\n            doFragmented = fragmented,\n        )\n    }\n    /*= buildOutgoingUniPacket(client) {\n        ///writeFully(\"0A 08 0A 06 08 89 FC A6 8C 0B 12 06 08 01 10 00 18 00 1A 1F 0A 1D 12 08 0A 06 0A 04 F0 9F 92 A9 12 11 AA 02 0E 88 01 00 9A 01 08 78 00 F8 01 00 C8 02 00 20 9B 7A 28 F4 CA 9B B8 03 32 34 08 92 C2 C4 F1 05 10 92 C2 C4 F1 05 18 E6 ED B9 C3 02 20 89 FE BE A4 06 28 89 84 F9 A2 06 48 DE 8C EA E5 0E 58 D9 BD BB A0 09 60 1D 68 92 C2 C4 F1 05 70 00 40 01\".hexToBytes())\n\n        val rand = Random.nextInt().absoluteValue\n        val source = MessageSourceToFriendImpl(\n            internalIds = intArrayOf(rand),\n            sender = client.bot,\n            target = qq,\n            time = currentTimeSeconds().toInt(),\n            sequenceIds = intArrayOf(client.nextFriendSeq()),\n            originalMessage = message\n        )\n        sourceCallback(source)\n\n        ///return@buildOutgoingUniPacket\n        writeProtoBuf(\n            MsgSvc.PbSendMsgReq.serializer(), MsgSvc.PbSendMsgReq(\n                routingHead = MsgSvc.RoutingHead(c2c = MsgSvc.C2C(toUin = targetFriend.uin)),\n                contentHead = MsgComm.ContentHead(pkgNum = 1),\n                msgBody = ImMsgBody.MsgBody(\n                    richText = ImMsgBody.RichText(\n                        elems = message.toRichTextElems(messageTarget = targetFriend, withGeneralFlags = true)\n                    )\n                ),\n                msgSeq = source.sequenceIds.single(),\n                msgRand = source.internalIds.single(),\n                syncCookie = client.syncCookie ?: byteArrayOf()\n                // msgVia = 1\n            )\n        )\n    }\n    */\n\n\n    /**\n     * 发送临时消息\n     */\n    internal fun createToTempImpl(\n        client: QQAndroidClient,\n        targetMember: Member,\n        message: MessageChain,\n        source: OnlineMessageSourceToTempImpl,\n    ) = buildOutgoingUniPacket(client) {\n        writeProtoBuf(\n            MsgSvc.PbSendMsgReq.serializer(),\n            MsgSvc.PbSendMsgReq(\n                routingHead = MsgSvc.RoutingHead(\n                    grpTmp = MsgSvc.GrpTmp(targetMember.group.uin, targetMember.id),\n                ),\n                contentHead = MsgComm.ContentHead(pkgNum = 1),\n                msgBody = ImMsgBody.MsgBody(\n                    richText = ImMsgBody.RichText(\n                        elems = MessageProtocolFacade.encode(\n                            message,\n                            messageTarget = targetMember,\n                            withGeneralFlags = true\n                        ),\n                    ),\n                ),\n                msgSeq = source.sequenceIds.single(),\n                msgRand = source.internalIds.single(),\n                syncCookie = client.syncCookie ?: byteArrayOf(),\n            ),\n        )\n    }\n\n\n    /**\n     * 发送群消息\n     */\n    internal fun createToGroupImpl(\n        client: QQAndroidClient,\n        targetGroup: Group,\n        message: MessageChain,\n        originalMessage: MessageChain,\n        fragmented: Boolean,\n        sourceCallback: (OnlineMessageSourceToGroupImpl) -> Unit,\n    ): List<OutgoingPacket> {\n        val sequenceIds = LateinitBox<IntArray>()\n        val randIds = LateinitBox<IntArray>()\n        return buildOutgoingMessageCommon(\n            client = client,\n            message = message,\n            fragmentTranslator = { subChain ->\n                ImMsgBody.MsgBody(\n                    richText = ImMsgBody.RichText(\n                        elems = MessageProtocolFacade.encode(\n                            subChain,\n                            messageTarget = targetGroup,\n                            withGeneralFlags = true\n                        ),\n                        ptt = subChain.findPtt(),\n\n                        ),\n                )\n            },\n            pbSendMsgReq = { msgBody, msgSeq, msgRand, contentHead ->\n                MsgSvc.PbSendMsgReq(\n                    routingHead = MsgSvc.RoutingHead(grp = MsgSvc.Grp(groupCode = targetGroup.groupCode)),\n                    contentHead = contentHead,\n                    msgBody = msgBody,\n                    msgSeq = msgSeq,\n                    msgRand = msgRand,\n                    syncCookie = client.syncCookie ?: byteArrayOf(),\n                    msgVia = 1,\n                    msgCtrl =\n                    if (message[ForwardMessageInternal] != null)\n                        MsgCtrl.MsgCtrl(msgFlag = 4)\n                    else null,\n                )\n            },\n            sequenceIds = sequenceIds,\n            randIds = randIds,\n            sequenceIdsInitializer = { size ->\n                IntArray(size) { client.atomicNextMessageSequenceId() }\n            },\n            postInit = {\n                randIds.value.forEach { id -> client.syncController.syncGroupMessageReceipt(id) }\n                sourceCallback(\n                    OnlineMessageSourceToGroupImpl(\n                        targetGroup,\n                        internalIds = randIds.value,\n                        sender = client.bot,\n                        target = targetGroup,\n                        time = client.bot.clock.server.currentTimeSeconds().toInt(),\n                        originalMessage = originalMessage, //,\n                        //   sourceMessage = message\n                    ),\n                )\n            },\n            doFragmented = fragmented,\n        )\n    }\n\n    private fun MessageChain.findPtt() =\n        findIsInstance<Audio>()?.toPtt() ?: this[PttMessage]?.toPtt()\n    /*\n    = buildOutgoingUniPacket(client) {\n        ///writeFully(\"0A 08 0A 06 08 89 FC A6 8C 0B 12 06 08 01 10 00 18 00 1A 1F 0A 1D 12 08 0A 06 0A 04 F0 9F 92 A9 12 11 AA 02 0E 88 01 00 9A 01 08 78 00 F8 01 00 C8 02 00 20 9B 7A 28 F4 CA 9B B8 03 32 34 08 92 C2 C4 F1 05 10 92 C2 C4 F1 05 18 E6 ED B9 C3 02 20 89 FE BE A4 06 28 89 84 F9 A2 06 48 DE 8C EA E5 0E 58 D9 BD BB A0 09 60 1D 68 92 C2 C4 F1 05 70 00 40 01\".hexToBytes())\n\n        // DebugLogger.debug(\"sending group message: \" + message.toRichTextElems().contentToString())\n\n        ///return@buildOutgoingUniPacket\n        writeProtoBuf(\n            MsgSvc.PbSendMsgReq.serializer(), MsgSvc.PbSendMsgReq(\n                routingHead = MsgSvc.RoutingHead(grp = MsgSvc.Grp(groupCode = targetGroup.groupCode)),\n                contentHead = MsgComm.ContentHead(pkgNum = 1),\n                msgBody = ImMsgBody.MsgBody(\n                    richText = ImMsgBody.RichText(\n                        elems = message.toRichTextElems(messageTarget = targetGroup, withGeneralFlags = true),\n                        ptt = message[PttMessage]?.run {\n                            ImMsgBody.Ptt(\n                                fileName = fileName.toByteArray(),\n                                fileMd5 = md5,\n                                boolValid = true,\n                                fileSize = fileSize.toInt(),\n                                fileType = 4,\n                                pbReserve = byteArrayOf(0),\n                                format = let {\n                                    if (it is Voice) {\n                                        it.codec\n                                    } else {\n                                        0\n                                    }\n                                }\n                            )\n                        }\n                    )\n                ),\n                msgSeq = client.atomicNextMessageSequenceId(),\n                msgRand = source.internalIds.single(),\n                syncCookie = EMPTY_BYTE_ARRAY,\n                msgVia = 1,\n                msgCtrl =\n                if (message[ForwardMessageInternal] != null)\n                    MsgCtrl.MsgCtrl(msgFlag = 4)\n                else null\n            )\n        )\n    }\n     */\n\n    override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n        val response = readProtoBuf(MsgSvc.PbSendMsgResp.serializer())\n        return when (response.result) {\n            0 -> Response.SUCCESS(response.sendTime)\n            10 -> Response.MessageTooLarge\n            32 -> Response.ServiceUnavailable\n            else -> Response.Failed(\n                response.result,\n                response.errtype,\n                response.errmsg,\n            )\n\n        }\n    }\n}\n\n@Suppress(\"UNUSED_PARAMETER\")\ninternal fun MessageSvcPbSendMsg.createToTemp(\n    client: QQAndroidClient,\n    member: Member,\n    message: MessageChain,\n    originalMessage: MessageChain,\n    fragmented: Boolean,\n    sourceCallback: (Deferred<OnlineMessageSourceToTempImpl>) -> Unit,\n): List<OutgoingPacket> {\n    contract {\n        callsInPlace(sourceCallback, InvocationKind.EXACTLY_ONCE)\n    }\n    val source = OnlineMessageSourceToTempImpl(\n        internalIds = intArrayOf(Random.nextInt().absoluteValue),\n        sender = client.bot,\n        target = member,\n        time = client.bot.clock.server.currentTimeSeconds().toInt(),\n        sequenceIds = intArrayOf(client.atomicNextMessageSequenceId()),\n        originalMessage = originalMessage,\n    )\n    sourceCallback(CompletableDeferred(source))\n    return createToTempImpl(\n        client,\n        member,\n        message,\n        source,\n    ).let { listOf(it) }\n}\n\ninternal fun MessageSvcPbSendMsg.createToStranger(\n    client: QQAndroidClient,\n    stranger: Stranger,\n    message: MessageChain, // to send\n    originalMessage: MessageChain, // for Receipt\n    fragmented: Boolean,\n    sourceCallback: (Deferred<OnlineMessageSourceToStrangerImpl>) -> Unit,\n): List<OutgoingPacket> {\n    contract {\n        callsInPlace(sourceCallback, InvocationKind.EXACTLY_ONCE)\n    }\n    return createToStrangerImpl(\n        client,\n        stranger,\n        message,\n        originalMessage,\n        fragmented,\n    ) { sourceCallback(CompletableDeferred(it)) }\n}\n\ninternal fun MessageSvcPbSendMsg.createToFriend(\n    client: QQAndroidClient,\n    qq: Friend,\n    message: MessageChain,\n    originalMessage: MessageChain,\n    fragmented: Boolean,\n    sourceCallback: (Deferred<OnlineMessageSourceToFriendImpl>) -> Unit,\n): List<OutgoingPacket> {\n    contract {\n        callsInPlace(sourceCallback, InvocationKind.EXACTLY_ONCE)\n    }\n    return createToFriendImpl(\n        client,\n        qq,\n        message,\n        originalMessage,\n        fragmented,\n    ) { sourceCallback(CompletableDeferred(it)) }\n}\n\n\ninternal fun MessageSvcPbSendMsg.createToGroup(\n    client: QQAndroidClient,\n    group: Group,\n    message: MessageChain,\n    originalMessage: MessageChain,\n    fragmented: Boolean,\n    sourceCallback: (Deferred<OnlineMessageSourceToGroupImpl>) -> Unit,\n): List<OutgoingPacket> {\n    contract {\n        callsInPlace(sourceCallback, InvocationKind.EXACTLY_ONCE)\n    }\n    return createToGroupImpl(\n        client,\n        group,\n        message,\n        originalMessage,\n        fragmented,\n    ) { sourceCallback(CompletableDeferred(it)) }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PushForceOffline.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat.receive\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.components.AccountSecretsManager\nimport net.mamoe.mirai.internal.network.components.BotInitProcessor\nimport net.mamoe.mirai.internal.network.impl.ForceOfflineException\nimport net.mamoe.mirai.internal.network.protocol.data.jce.RequestPushForceOffline\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.utils.io.serialization.readUniPacket\n\n\n/**\n * 被挤下线\n */\ninternal object MessageSvcPushForceOffline :\n    OutgoingPacketFactory<RequestPushForceOffline>(\"MessageSvc.PushForceOffline\") {\n\n    override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): RequestPushForceOffline {\n        return readUniPacket(RequestPushForceOffline.serializer())\n    }\n\n    override suspend fun QQAndroidBot.handle(packet: RequestPushForceOffline) {\n        components[AccountSecretsManager].invalidate() // otherwise you receive `MessageSvc.PushForceOffline` again just after logging in.\n        components[BotInitProcessor].setLoginHalted() // so that BotInitProcessor will be run on successful reconnection.\n        network.close(ForceOfflineException(packet.title, packet.tips))\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PushNotify.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat.receive\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.components.SyncController.Companion.syncController\nimport net.mamoe.mirai.internal.network.protocol.data.jce.RequestPushNotify\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgSvc\nimport net.mamoe.mirai.internal.network.protocol.packet.IncomingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.readUniPacket\n\n\n/**\n * 告知要刷新好友消息\n */\ninternal object MessageSvcPushNotify : IncomingPacketFactory<RequestPushNotify>(\"MessageSvc.PushNotify\") {\n    override suspend fun ByteReadPacket.decode(bot: QQAndroidBot, sequenceId: Int): RequestPushNotify {\n        discardExact(4) // don't remove\n        return readUniPacket(RequestPushNotify.serializer())\n    }\n\n    override suspend fun QQAndroidBot.handle(packet: RequestPushNotify, sequenceId: Int): OutgoingPacket {\n        while (true) {\n            val firstNotify = syncController.firstNotify\n\n            val cookie = if (firstNotify) {\n                if (!syncController.casFirstNotify(firstNotify, false)) {\n                    continue\n                }\n                null\n            } else {\n                packet.vNotifyCookie\n            }\n\n            return MessageSvcPbGetMsg(\n                client,\n                MsgSvc.SyncFlag.START,\n                cookie,\n            )\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PushReaded.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat.receive\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.protocol.packet.IncomingPacketFactory\n\ninternal object MessageSvcPushReaded : IncomingPacketFactory<Packet?>(\n    \"MessageSvc.PushReaded\", \"\"\n) {\n    override suspend fun ByteReadPacket.decode(bot: QQAndroidBot, sequenceId: Int): Packet? {\n        // val notify = readUniPacket(SvcRequestPushReadedNotify.serializer())\n\n        // just ignore.\n        return null\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.RequestPushStatus.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat.receive\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.components.NoticeProcessorPipeline.Companion.processPacketThroughPipeline\nimport net.mamoe.mirai.internal.network.protocol.data.jce.RequestPushStatus\nimport net.mamoe.mirai.internal.network.protocol.packet.IncomingPacketFactory\nimport net.mamoe.mirai.internal.utils.io.serialization.readUniPacket\n\ninternal object MessageSvcRequestPushStatus : IncomingPacketFactory<Packet>(\n    \"MessageSvc.RequestPushStatus\", \"\",\n) {\n    override suspend fun ByteReadPacket.decode(bot: QQAndroidBot, sequenceId: Int): Packet {\n        val packet = readUniPacket(RequestPushStatus.serializer())\n        return bot.processPacketThroughPipeline(packet)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbC2CMsgSync.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat.receive\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.components.NoticePipelineContext.Companion.KEY_FROM_SYNC\nimport net.mamoe.mirai.internal.network.components.NoticeProcessorPipeline.Companion.processPacketThroughPipeline\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgOnlinePush\nimport net.mamoe.mirai.internal.network.protocol.packet.IncomingPacketFactory\nimport net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf\n\ninternal object PbC2CMsgSync : IncomingPacketFactory<Packet>(\n    \"OnlinePush.PbC2CMsgSync\", \"\",\n) {\n    override suspend fun ByteReadPacket.decode(bot: QQAndroidBot, sequenceId: Int): Packet {\n        return bot.processPacketThroughPipeline(\n            readProtoBuf(MsgOnlinePush.PbPushMsg.serializer()).msg,\n            KEY_FROM_SYNC to true,\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat.receive\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.components.NoticeProcessorPipeline.Companion.processPacketThroughPipeline\nimport net.mamoe.mirai.internal.network.components.SsoProcessor\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgOnlinePush\nimport net.mamoe.mirai.internal.network.protocol.packet.IncomingPacketFactory\nimport net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf\n\n/**\n * 接受群消息\n */\ninternal object OnlinePushPbPushGroupMsg : IncomingPacketFactory<Packet?>(\"OnlinePush.PbPushGroupMsg\") {\n\n    override suspend fun ByteReadPacket.decode(bot: QQAndroidBot, sequenceId: Int): Packet? {\n        // 00 00 02 E4 0A D5 05 0A 4F 08 A2 FF 8C F0 03 10 DD F1 92 B7 07 18 52 20 00 28 BC 3D 30 8C 82 AB F1 05 38 D2 80 E0 8C 80 80 80 80 02 4A 21 08 E7 C1 AD B8 02 10 01 18 BA 05 22 09 48 69 6D 31 38 38 6D 6F 65 30 06 38 02 42 05 4D 69 72 61 69 50 01 58 01 60 00 88 01 08 12 06 08 01 10 00 18 00 1A F9 04 0A F6 04 0A 26 08 00 10 87 82 AB F1 05 18 B7 B4 BF 30 20 00 28 0C 30 00 38 86 01 40 22 4A 0C E5 BE AE E8 BD AF E9 9B 85 E9 BB 91 12 E6 03 42 E3 03 12 2A 7B 34 45 31 38 35 38 32 32 2D 30 45 37 42 2D 46 38 30 46 2D 43 35 42 31 2D 33 34 34 38 38 33 37 34 44 33 39 43 7D 2E 6A 70 67 22 00 2A 04 03 00 00 00 32 60 15 36 20 39 36 6B 45 31 41 38 35 32 32 39 64 63 36 39 38 34 37 39 37 37 62 20 20 20 20 20 20 35 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7B 34 45 31 38 35 38 32 32 2D 30 45 37 42 2D 46 38 30 46 2D 43 35 42 31 2D 33 34 34 38 38 33 37 34 44 33 39 43 7D 2E 6A 70 67 31 32 31 32 41 38 C6 BB 8A A9 08 40 FB AE 9E C2 09 48 50 50 41 5A 00 60 01 6A 10 4E 18 58 22 0E 7B F8 0F C5 B1 34 48 83 74 D3 9C 72 59 2F 67 63 68 61 74 70 69 63 5F 6E 65 77 2F 31 30 34 30 34 30 30 32 39 30 2F 36 35 35 30 35 37 31 32 37 2D 32 32 33 33 36 33 38 33 34 32 2D 34 45 31 38 35 38 32 32 30 45 37 42 46 38 30 46 43 35 42 31 33 34 34 38 38 33 37 34 44 33 39 43 2F 31 39 38 3F 74 65 72 6D 3D 32 82 01 57 2F 67 63 68 61 74 70 69 63 5F 6E 65 77 2F 31 30 34 30 34 30 30 32 39 30 2F 36 35 35 30 35 37 31 32 37 2D 32 32 33 33 36 33 38 33 34 32 2D 34 45 31 38 35 38 32 32 30 45 37 42 46 38 30 46 43 35 42 31 33 34 34 38 38 33 37 34 44 33 39 43 2F 30 3F 74 65 72 6D 3D 32 B0 01 4D B8 01 2E C8 01 FF 05 D8 01 4D E0 01 2E FA 01 59 2F 67 63 68 61 74 70 69 63 5F 6E 65 77 2F 31 30 34 30 34 30 30 32 39 30 2F 36 35 35 30 35 37 31 32 37 2D 32 32 33 33 36 33 38 33 34 32 2D 34 45 31 38 35 38 32 32 30 45 37 42 46 38 30 46 43 35 42 31 33 34 34 38 38 33 37 34 44 33 39 43 2F 34 30 30 3F 74 65 72 6D 3D 32 80 02 4D 88 02 2E 12 45 AA 02 42 50 03 60 00 68 00 9A 01 39 08 09 20 BF 50 80 01 01 C8 01 00 F0 01 00 F8 01 00 90 02 00 98 03 00 A0 03 20 B0 03 00 C0 03 00 D0 03 00 E8 03 00 8A 04 04 08 02 08 01 90 04 80 80 80 10 B8 04 00 C0 04 00 12 06 4A 04 08 00 40 01 12 14 82 01 11 0A 09 48 69 6D 31 38 38 6D 6F 65 18 06 20 08 28 03 10 8A CA 9D A1 07 1A 00\n        if (!bot.components[SsoProcessor].firstLoginSucceed) return null\n        return bot.processPacketThroughPipeline(readProtoBuf(MsgOnlinePush.PbPushMsg.serializer()))\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushTransMsg.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat.receive\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.components.NoticeProcessorPipeline.Companion.processPacketThroughPipeline\nimport net.mamoe.mirai.internal.network.components.SyncController.Companion.syncController\nimport net.mamoe.mirai.internal.network.components.syncPushTrans\nimport net.mamoe.mirai.internal.network.protocol.data.proto.OnlinePushTrans\nimport net.mamoe.mirai.internal.network.protocol.packet.IncomingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.buildResponseUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf\n\n\ninternal object OnlinePushPbPushTransMsg :\n    IncomingPacketFactory<Packet?>(\"OnlinePush.PbPushTransMsg\", \"OnlinePush.RespPush\") {\n\n\n    override suspend fun ByteReadPacket.decode(bot: QQAndroidBot, sequenceId: Int): Packet? {\n        val content = this.readProtoBuf(OnlinePushTrans.PbMsgInfo.serializer())\n        if (!bot.syncController.syncPushTrans(content)) return null\n        return bot.processPacketThroughPipeline(content)\n    }\n\n    override suspend fun QQAndroidBot.handle(packet: Packet?, sequenceId: Int): OutgoingPacket {\n        return buildResponseUniPacket(client, sequenceId = sequenceId)\n    }\n\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat.receive\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.MultiPacket\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.components.NoticeProcessorPipeline.Companion.processPacketThroughPipeline\nimport net.mamoe.mirai.internal.network.protocol.data.jce.OnlinePushPack\nimport net.mamoe.mirai.internal.network.protocol.packet.IncomingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.buildResponseUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.readUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.writeJceRequestPacket\n\ninternal object OnlinePushReqPush : IncomingPacketFactory<OnlinePushReqPush.ReqPushDecoded>(\n    \"OnlinePush.ReqPush\",\n    \"OnlinePush.RespPush\",\n) {\n    override suspend fun ByteReadPacket.decode(bot: QQAndroidBot, sequenceId: Int): ReqPushDecoded {\n        val reqPushMsg = readUniPacket(OnlinePushPack.SvcReqPushMsg.serializer(), \"req\")\n        return ReqPushDecoded(reqPushMsg, bot.processPacketThroughPipeline(reqPushMsg))\n    }\n\n    internal class ReqPushDecoded(val request: OnlinePushPack.SvcReqPushMsg, packet: Packet) :\n        MultiPacket by MultiPacket(packet), Packet.NoLog {\n        override fun toString(): String = \"OnlinePush.ReqPush.ReqPushDecoded\"\n    }\n\n    override suspend fun QQAndroidBot.handle(packet: ReqPushDecoded, sequenceId: Int): OutgoingPacket {\n        return buildResponseUniPacket(client) {\n            writeJceRequestPacket(\n                servantName = \"OnlinePush\",\n                funcName = \"SvcRespPushMsg\",\n                name = \"resp\",\n                serializer = OnlinePushPack.SvcRespPushMsg.serializer(),\n                body = OnlinePushPack.SvcRespPushMsg(\n                    packet.request.uin,\n                    packet.request.vMsgInfos.map { msg ->\n                        OnlinePushPack.DelMsgInfo(\n                            fromUin = msg.lFromUin,\n                            shMsgSeq = msg.shMsgSeq,\n                            vMsgCookies = msg.vMsgCookies,\n                            uMsgTime = msg.uMsgTime, // captured 0\n                        )\n                    },\n                ),\n            )\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.SidExpired.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat.receive\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.components.AccountSecretsImpl\nimport net.mamoe.mirai.internal.network.components.AccountSecretsManager\nimport net.mamoe.mirai.internal.network.protocol.packet.IncomingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.buildResponseUniPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.login.wtlogin.WtLogin10\n\ninternal object OnlinePushSidExpired :\n    IncomingPacketFactory<Packet?>(\"OnlinePush.SidTicketExpired\", \"OnlinePush.SidTicketExpired\") {\n\n    override suspend fun QQAndroidBot.handle(packet: Packet?, sequenceId: Int): OutgoingPacket {\n        return buildResponseUniPacket(client, sequenceId = sequenceId).also {\n            bot.network.sendAndExpect(WtLogin10(client, mainSigMap = 1052896, remark = \"10:refresh-token\"))\n            bot.components[AccountSecretsManager].saveSecrets(bot.account, AccountSecretsImpl(client))\n        }\n    }\n\n    override suspend fun ByteReadPacket.decode(bot: QQAndroidBot, sequenceId: Int): Packet? {\n        return null\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/shortvideo/PttCenterSvr.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat.video\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.contact.Friend\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.User\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.uin\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.data.proto.PttShortVideo\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf\n\ninternal class PttCenterSvr {\n    object GroupShortVideoUpReq :\n        OutgoingPacketFactory<GroupShortVideoUpReq.Response>(\"PttCenterSvr.GroupShortVideoUpReq\") {\n        sealed class Response : Packet {\n            class FileExists(val fileId: String) : Response() {\n                override fun toString(): String {\n                    return \"PttCenterSvr.GroupShortVideoUpReq.Response.FileExists(fileId=${fileId})\"\n                }\n            }\n\n            object RequireUpload : Response() {\n                override fun toString(): String {\n                    return \"PttCenterSvr.GroupShortVideoUpReq.Response.RequireUpload\"\n                }\n            }\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            val resp = readProtoBuf(PttShortVideo.RspBody.serializer())\n            val upResp = resp.msgPttShortVideoUploadResp ?: return Response.RequireUpload\n\n            return if (upResp.fileExist == 1) {\n                Response.FileExists(upResp.fileid)\n            } else {\n                Response.RequireUpload\n            }\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient,\n            contact: Contact,\n            thumbnailFileMd5: ByteArray,\n            thumbnailFileSize: Long,\n            videoFileName: String,\n            videoFileMd5: ByteArray,\n            videoFileSize: Long,\n            videoFileFormat: String\n        ) = buildOutgoingUniPacket(client) { sequenceId ->\n            writeProtoBuf(\n                PttShortVideo.ReqBody.serializer(),\n                PttShortVideo.ReqBody(\n                    cmd = 300,\n                    seq = sequenceId,\n                    msgPttShortVideoUploadReq = buildShortVideoFileInfo(\n                        client,\n                        contact,\n                        thumbnailFileMd5,\n                        thumbnailFileSize,\n                        videoFileName,\n                        videoFileMd5,\n                        videoFileSize,\n                        videoFileFormat\n                    ),\n                    msgExtensionReq = listOf(\n                        PttShortVideo.ExtensionReq(\n                            subBusiType = 0,\n                            userCnt = 1\n                        )\n                    )\n                )\n            )\n        }\n\n        internal fun buildShortVideoFileInfo(\n            client: QQAndroidClient,\n            contact: Contact,\n            thumbnailFileMd5: ByteArray,\n            thumbnailFileSize: Long,\n            videoFileName: String,\n            videoFileMd5: ByteArray,\n            videoFileSize: Long,\n            videoFileFormat: String\n        ) = PttShortVideo.PttShortVideoUploadReq(\n            fromuin = client.uin,\n            touin = contact.uin,\n            chatType = 1, // guild channel = 4, others = 1\n            clientType = 2,\n            msgPttShortVideoFileInfo = PttShortVideo.PttShortVideoFileInfo(\n                fileName = videoFileName + videoFileFormat,\n                fileMd5 = videoFileMd5,\n                fileSize = videoFileSize,\n                fileResLength = 1280,\n                fileResWidth = 720,\n                // Lcom/tencent/mobileqq/transfile/ShortVideoUploadProcessor;getFormat(Ljava/lang/String;)I\n                fileFormat = 3,\n                fileTime = 120,\n                thumbFileMd5 = thumbnailFileMd5,\n                thumbFileSize = thumbnailFileSize\n            ),\n            groupCode = if (contact is Group) contact.uin else 0,\n            flagSupportLargeSize = 1\n        )\n    }\n\n    object ShortVideoDownReq : OutgoingPacketFactory<ShortVideoDownReq.Response>(\"PttCenterSvr.ShortVideoDownReq\") {\n        sealed class Response : Packet {\n            class Success(val fileMd5: ByteArray, val urlV4: String, val urlV6: String?) : Response() {\n                override fun toString(): String {\n                    return \"PttCenterSvr.ShortVideoDownReq.Response.Success(\" +\n                            \"urlV4=$urlV4, urlV6=$urlV6)\"\n                }\n            }\n\n            object Failed : Response() {\n                override fun toString(): String {\n                    return \"PttCenterSvr.ShortVideoDownReq.Response.Failed\"\n                }\n            }\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            val resp = readProtoBuf(PttShortVideo.RspBody.serializer())\n\n            val shortVideoDownloadResp = resp.msgPttShortVideoDownloadResp ?: return Response.Failed\n            val attr = shortVideoDownloadResp.msgDownloadAddr ?: return Response.Failed\n\n            val fileMd5 = shortVideoDownloadResp.fileMd5\n            val urlV4 = attr.strHost.first() + attr.urlArgs\n            val urlV6 = attr.strHostIpv6.firstOrNull()?.plus(attr.urlArgs)\n\n            return Response.Success(fileMd5, urlV4, urlV6)\n        }\n\n        // Lcom/tencent/mobileqq/transfile/protohandler/ShortVideoDownHandler;constructReqBody(Ljava/util/List;)[B\n        operator fun invoke(\n            client: QQAndroidClient,\n            contact: Contact,\n            sender: User,\n            videoFIleId: String,\n            videoFileMd5: ByteArray,\n        ) = buildOutgoingUniPacket(client) { sequenceId ->\n            writeProtoBuf(\n                PttShortVideo.ReqBody.serializer(),\n                PttShortVideo.ReqBody(\n                    cmd = 400,\n                    seq = sequenceId,\n                    msgPttShortVideoDownloadReq = PttShortVideo.PttShortVideoDownloadReq(\n                        fromuin = sender.uin,\n                        touin = client.uin,\n                        chatType = if (sender is Friend) 0 else 1,\n                        clientType = 7,\n                        fileid = videoFIleId,\n                        groupCode = if (contact is Group) contact.uin else 0L,\n                        fileMd5 = videoFileMd5,\n                        businessType = 1,\n                        flagSupportLargeSize = 1,\n                        flagClientQuicProtoEnable = 1,\n                        fileType = 2, // maybe 1 = newly uploaded video, unverified\n                        downType = 2,\n                        sceneType = 2, // hooked 0 and 1, but unknown\n                        reqTransferType = 1,\n                        reqHostType = 11,\n                    ),\n                    msgExtensionReq = listOf(\n                        PttShortVideo.ExtensionReq(subBusiType = 0)\n                    )\n                )\n            )\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/voice/PttStore.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.chat.voice\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.uin\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Cmd0x346\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Cmd0x388\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketWithRespType\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf\nimport net.mamoe.mirai.internal.utils.toIpV4AddressString\nimport net.mamoe.mirai.message.data.AudioCodec\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.toUHexString\n\ninternal inline val ExternalResource.voiceCodec: Int get() = audioCodec.id\n\ninternal val ExternalResource.audioCodec: AudioCodec\n    get() {\n        return when (formatName) {\n            // 实际上 amr 是 0, 但用 1 也可以发. 为了避免 silk 错被以 amr 发送导致降音质就都用 1\n            \"amr\" -> AudioCodec.SILK\n            \"silk\" -> AudioCodec.SILK\n            else -> AudioCodec.AMR     // use amr by default\n        }\n    }\n\ninternal class PttStore {\n    object GroupPttUp : OutgoingPacketFactory<GroupPttUp.Response>(\"PttStore.GroupPttUp\") {\n\n        sealed class Response : Packet {\n\n            class RequireUpload(\n                val fileId: Long,\n                val uKey: ByteArray,\n                val uploadIpList: List<Int>,\n                val uploadPortList: List<Int>,\n                val fileKey: ByteArray\n            ) : GroupPttUp.Response() {\n                override fun toString(): String {\n                    return \"RequireUpload(\" +\n                            \"fileId=$fileId, \" +\n                            \"uploadServers=${\n                                uploadIpList.zip(uploadPortList)\n                                    .joinToString(\n                                        prefix = \"[\",\n                                        postfix = \"]\"\n                                    ) { \"${it.first.toIpV4AddressString()}:${it.second}1\" }\n                            }, \" +\n                            \"uKey=${uKey.toUHexString(\"\")}, \" +\n                            \"fileKey=${fileKey.toUHexString(\"\")}\" +\n                            \")\"\n                }\n            }\n        }\n\n        fun createTryUpPttPack(\n            uin: Long,\n            groupCode: Long,\n            resource: ExternalResource\n        ): Cmd0x388.ReqBody {\n            return Cmd0x388.ReqBody(\n                netType = 3, // wifi\n                subcmd = 3,\n                msgTryupPttReq = listOf(\n                    Cmd0x388.TryUpPttReq(\n                        srcUin = uin,\n                        groupCode = groupCode,\n                        fileId = 0,\n                        fileSize = resource.size,\n                        fileMd5 = resource.md5,\n                        fileName = resource.md5,\n                        srcTerm = 5,\n                        platformType = 9,\n                        buType = 4,\n                        innerIp = 0,\n                        buildVer = \"6.5.5.663\".encodeToByteArray(),\n                        voiceLength = 1,\n                        codec = resource.voiceCodec, // HTTP 时只支持 0\n                        // 2021/1/26 因为 #577 修改为 resource.voiceCodec\n                        voiceType = 1,\n                        boolNewUpChan = true\n                    )\n                )\n            )\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient,\n            uin: Long,\n            groupCode: Long,\n            resource: ExternalResource\n        ): OutgoingPacketWithRespType<Response> {\n            val pack = createTryUpPttPack(uin, groupCode, resource)\n            return buildOutgoingUniPacket(client) {\n                writeProtoBuf(Cmd0x388.ReqBody.serializer(), pack)\n            }\n        }\n\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            val resp0 = readProtoBuf(Cmd0x388.RspBody.serializer())\n            val resp =\n                resp0.msgTryupPttRsp.firstOrNull() ?: error(\"cannot find `msgTryupPttRsp` from `Cmd0x388.RspBody`\")\n            if (resp.failMsg != null) {\n                throw IllegalStateException(resp.failMsg.decodeToString())\n            }\n            return Response.RequireUpload(\n                fileId = resp.fileid,\n                uKey = resp.upUkey,\n                uploadIpList = resp.uint32UpIp,\n                uploadPortList = resp.uint32UpPort,\n                fileKey = resp.fileKey\n            )\n\n        }\n\n    }\n\n    object GroupPttDown : OutgoingPacketFactory<GroupPttDown.Response.DownLoadInfo>(\"PttStore.GroupPttDown\") {\n\n        sealed class Response : Packet {\n            class DownLoadInfo(\n                val downDomain: ByteArray,\n                val downPara: ByteArray,\n                val strDomain: String,\n                val uint32DownIp: List<Int>,\n                val uint32DownPort: List<Int>\n            ) : GroupPttDown.Response() {\n                override fun toString(): String {\n                    return \"GroupPttDown(downPara=${downPara.decodeToString()},strDomain=$strDomain})\"\n                }\n            }\n\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient,\n            groupCode: Long,\n            ptt: ImMsgBody.Ptt,\n            msg: MsgComm.Msg,\n        ) = buildOutgoingUniPacket(client) {\n            writeProtoBuf(\n                Cmd0x388.ReqBody.serializer(), Cmd0x388.ReqBody(\n                    netType = 3, // wifi\n                    subcmd = 4,\n                    msgGetpttUrlReq = listOf(\n                        Cmd0x388.GetPttUrlReq(\n                            groupCode = groupCode,\n                            fileid = 0,\n                            fileId = ptt.fileId.toLong(),\n                            fileMd5 = ptt.fileMd5,\n                            dstUin = msg.msgHead.toUin,\n                            fileKey = ptt.groupFileKey,\n                            buType = 3,\n                            innerIp = 0,\n                            buildVer = \"8.5.5\".encodeToByteArray(),\n                            codec = ptt.format,\n                            reqTerm = 5,\n                            reqPlatformType = 9,\n                        )\n                    )\n                )\n            )\n        }\n\n        @OptIn(ExperimentalStdlibApi::class)\n        operator fun invoke(\n            client: QQAndroidClient,\n            groupCode: Long,\n            dstUin: Long,\n            md5: ByteArray\n\n        ) = buildOutgoingUniPacket(client) {\n            writeProtoBuf(\n                Cmd0x388.ReqBody.serializer(), Cmd0x388.ReqBody(\n                    netType = 3, // wifi\n                    subcmd = 4,\n                    msgGetpttUrlReq = listOf(\n                        Cmd0x388.GetPttUrlReq(\n                            groupCode = groupCode,\n                            fileMd5 = md5,\n                            dstUin = dstUin,\n                            buType = 4,\n                            innerIp = 0,\n                            buildVer = \"8.5.5\".encodeToByteArray(),\n                            codec = 0,\n                            reqTerm = 5,\n                            reqPlatformType = 9\n                        )\n                    )\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response.DownLoadInfo {\n            val resp0 = readProtoBuf(Cmd0x388.RspBody.serializer())\n            val resp =\n                resp0.msgGetpttUrlRsp.firstOrNull() ?: error(\"cannot find `msgGetpttUrlRsp` from `Cmd0x388.RspBody`\")\n            if (!resp.failMsg.contentEquals(EMPTY_BYTE_ARRAY)) {\n                throw IllegalStateException(resp.failMsg.decodeToString())\n            }\n            return Response.DownLoadInfo(\n                downDomain = resp.downDomain,\n                downPara = resp.downPara,\n                uint32DownIp = resp.uint32DownIp,\n                uint32DownPort = resp.uint32DownPort,\n                strDomain = resp.strDomain\n            )\n        }\n    }\n\n    object C2CPttDown : OutgoingPacketFactory<C2CPttDown.Response>(\n        \"PttCenterSvr.pb_pttCenter_CMD_REQ_APPLY_DOWNLOAD-1200\"\n    ) {\n        operator fun invoke(client: QQAndroidClient, uin: Long, uuid: ByteArray) =\n            buildOutgoingUniPacket(client) {\n                writeProtoBuf(\n                    Cmd0x346.ReqBody.serializer(), Cmd0x346.ReqBody(\n                        msgApplyDownloadReq = Cmd0x346.ApplyDownloadReq(\n                            uin = uin,\n                            uuid = uuid,\n                            needHttpsUrl = 1,\n                        ),\n                        clientType = 104,\n                        cmd = 1200,\n                        businessId = 17, // or 3?\n                    )\n                )\n            }\n\n        sealed class Response : Packet {\n            class Failed(val retMsg: String) : Response() {\n                override fun toString(): String {\n                    return \"PttCenterSvr.pb_pttCenter#download.Failed(retMsg=$retMsg)\"\n                }\n            }\n\n            class Success(val downloadUrl: String) : Response() {\n                override fun toString(): String {\n                    return \"PttCenterSvr.pb_pttCenter#download.Success\"\n                }\n            }\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): C2CPttDown.Response {\n            val data = readProtoBuf(Cmd0x346.RspBody.serializer())\n            val rsp = data.msgApplyDownloadRsp ?: return Response.Failed(\"Response not found\")\n            if (rsp.retMsg != \"success\") {\n                return Response.Failed(rsp.retMsg)\n            }\n            val downloadInfo = rsp.msgDownloadInfo ?: return Response.Failed(\"Download info not found\")\n            return Response.Success(downloadInfo.downloadUrl)\n        }\n    }\n\n    object C2C {\n        fun createC2CPttStoreBDHExt(\n            bot: QQAndroidBot,\n            uin: Long,\n            resource: ExternalResource\n        ): Cmd0x346.ReqBody {\n            return Cmd0x346.ReqBody(\n                cmd = 500,\n                businessId = 17,\n                clientType = 104,\n                msgExtensionReq = Cmd0x346.ExtensionReq(\n                    id = 3,\n                    pttFormat = 1,\n                    netType = 3,\n                    voiceType = 1,\n                    pttTime = 1,\n                ),\n                msgApplyUploadReq = Cmd0x346.ApplyUploadReq(\n                    senderUin = bot.uin,\n                    recverUin = uin,\n                    fileType = 2,\n                    fileSize = resource.size,\n                    fileName = resource.md5,\n                    _10mMd5 = resource.md5,\n                ),\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/list/FriendList.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.list\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.contact.Friend\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.uin\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.data.jce.*\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Vec0xd50\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Vec0xd6b\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.*\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport net.mamoe.mirai.utils.toByteArray\n\n\ninternal class FriendList {\n\n    internal object GetTroopMemberList :\n        OutgoingPacketFactory<GetTroopMemberList.Response>(\"friendlist.GetTroopMemberListReq\") {\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            val res = this.readUniPacket(GetTroopMemberListResp.serializer())\n            return Response(\n                res.vecTroopMember,\n                res.nextUin\n            )\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient,\n            targetGroupUin: Long,\n            targetGroupCode: Long,\n            nextUin: Long = 0\n        ) = buildOutgoingUniPacket(client) {\n            writeJceStruct(\n                RequestPacket.serializer(),\n                RequestPacket(\n                    funcName = \"GetTroopMemberListReq\",\n                    servantName = \"mqq.IMService.FriendListServiceServantObj\",\n                    version = 3,\n                    requestId = client.nextRequestPacketRequestId(),\n                    sBuffer = jceRequestSBuffer(\n                        \"GTML\",\n                        GetTroopMemberListReq.serializer(),\n                        GetTroopMemberListReq(\n                            uin = client.uin,\n                            groupCode = targetGroupCode,\n                            groupUin = targetGroupUin,\n                            nextUin = nextUin,\n                            reqType = 0,\n                            version = 2\n                        )\n                    )\n                )\n            )\n        }\n\n        class Response(\n            val members: List<StTroopMemberInfo>,\n            val nextUin: Long\n        ) : Packet {\n            override fun toString(): String = \"FriendList.GetTroopMemberList.Response\"\n        }\n\n    }\n\n    internal object GetTroopListSimplify :\n        OutgoingPacketFactory<GetTroopListSimplify.Response>(\"friendlist.GetTroopListReqV2\") {\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            val res = this.readUniPacket(GetTroopListRespV2.serializer())\n            return Response(res.vecTroopList.orEmpty(), res.vecTroopRank.orEmpty())\n        }\n\n        class Response(\n            val groups: List<StTroopNum>,\n            val ranks: List<StGroupRankInfo>\n        ) : Packet {\n            override fun toString(): String = \"FriendList.GetFriendGroupList.Response\"\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient\n        ) = buildOutgoingUniPacket(client) {\n            writeJceStruct(\n                RequestPacket.serializer(),\n                RequestPacket(\n                    funcName = \"GetTroopListReqV2Simplify\",\n                    servantName = \"mqq.IMService.FriendListServiceServantObj\",\n                    version = 3,\n                    cPacketType = 0x00,\n                    requestId = client.nextRequestPacketRequestId(),\n                    sBuffer = jceRequestSBuffer(\n                        \"GetTroopListReqV2Simplify\",\n                        GetTroopListReqV2Simplify.serializer(),\n                        GetTroopListReqV2Simplify(\n                            uin = client.uin,\n                            getMSFMsgFlag = 0,\n                            groupFlagExt = 1,\n                            shVersion = 7,\n                            dwCompanyId = 0,\n                            versionNum = 1,\n                            vecGroupInfo = listOf(),\n                            getLongGroupName = 1\n                        )\n                    )\n                )\n            )\n        }\n    }\n\n    internal object DelFriend :\n        OutgoingPacketFactory<DelFriend.Response>(\"friendlist.delFriend\") {\n\n        class Response(val isSuccess: Boolean, val resultCode: Int) : Packet {\n            override fun toString(): String = \"FriendList.DelFriend.Response(isSuccess=$isSuccess)\"\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            val res = this.readUniPacket(DelFriendResp.serializer())\n            return Response(res.result == 0, res.result)\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient,\n            friend: Friend\n        ) = buildOutgoingUniPacket(client) {\n            writeJceStruct(\n                RequestPacket.serializer(),\n                RequestPacket(\n                    funcName = \"DelFriendReq\",\n                    servantName = \"mqq.IMService.FriendListServiceServantObj\",\n                    version = 3,\n                    sBuffer = jceRequestSBuffer(\n                        \"DF\",\n                        DelFriendReq.serializer(),\n                        DelFriendReq(\n                            uin = client.uin,\n                            delType = 2,\n                            delUin = friend.uin,\n                            version = 1\n                        )\n                    )\n                )\n            )\n        }\n    }\n\n    internal object GetFriendGroupList :\n        OutgoingPacketFactory<GetFriendGroupList.Response>(\"friendlist.getFriendGroupList\") {\n\n        class Response(\n            val selfInfo: FriendInfo?,\n            val totalFriendCount: Short,\n            val friendList: List<FriendInfo>,\n            // for FriendGroup\n            val groupList: List<GroupInfo>,\n            val totoalGroupCount: Short\n        ) : Packet {\n            override fun toString(): String = \"FriendList.GetFriendGroupList.Response\"\n        }\n\n        override suspend fun QQAndroidBot.handle(packet: Response) {\n            packet.selfInfo?.let { this.nick = it.nick }\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            val res = this.readUniPacket(GetFriendListResp.serializer())\n            return Response(\n                res.stSelfInfo,\n                res.totoalFriendCount,\n                res.vecFriendInfo.orEmpty(),\n                res.vecGroupInfo.orEmpty(),\n                res.totoalGroupCount ?: -1\n            )\n        }\n\n        fun forSingleFriend(\n            client: QQAndroidClient,\n            uin: Long\n        ) = buildOutgoingUniPacket(client) {\n            writeJceStruct(\n                RequestPacket.serializer(),\n                RequestPacket(\n                    funcName = \"GetFriendListReq\",\n                    servantName = \"mqq.IMService.FriendListServiceServantObj\",\n                    version = 3,\n                    cPacketType = 0x003,\n                    requestId = client.nextRequestPacketRequestId(),\n                    sBuffer = jceRequestSBuffer(\n                        \"FL\",\n                        GetFriendListReq.serializer(),\n                        GetFriendListReq(\n                            reqtype = 3,\n                            ifGetGroupInfo = 0,\n                            ifReflush = 1,\n                            uin = client.uin,\n                            startIndex = 0,\n                            groupstartIndex = 0,\n                            getgroupCount = 0,\n                            ifShowTermType = 1,\n                            version = 27L,\n                            getfriendCount = 0,\n                            ifGetMSFGroup = 0,\n                            eAppType = 0,\n                            groupid = 0,\n                            ifGetBothFlag = 0,\n                            ifGetDOVId = 0,\n                            uinList = listOf(uin),\n                            vec0xd6bReq = Vec0xd6b.ReqBody().toByteArray(Vec0xd6b.ReqBody.serializer()),\n                            vec0xd50Req = Vec0xd50.ReqBody(\n                                appid = 10002L,\n                                reqKsingSwitch = 1,\n                                reqMusicSwitch = 1,\n                                reqMutualmarkLbsshare = 1,\n                                reqMutualmarkAlienation = 1\n                            ).toByteArray(Vec0xd50.ReqBody.serializer())\n                        )\n                    )\n                )\n            )\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient,\n            friendListStartIndex: Int,\n            friendListCount: Int,\n            groupListStartIndex: Int,\n            groupListCount: Int\n        ) = buildOutgoingUniPacket(client) {\n            writeJceStruct(\n                RequestPacket.serializer(),\n                RequestPacket(\n                    funcName = \"GetFriendListReq\",\n                    servantName = \"mqq.IMService.FriendListServiceServantObj\",\n                    version = 3,\n                    cPacketType = 0x003,\n                    requestId = client.nextRequestPacketRequestId(),\n                    sBuffer = jceRequestSBuffer(\n                        \"FL\",\n                        GetFriendListReq.serializer(),\n                        GetFriendListReq(\n                            reqtype = 3,\n                            ifReflush = if (friendListStartIndex + groupListStartIndex <= 0) {\n                                0\n                            } else {\n                                1\n                            },\n                            uin = client.uin,\n                            startIndex = friendListStartIndex.toShort(),\n                            getfriendCount = friendListCount.toShort(),\n                            groupid = 0,\n                            ifGetGroupInfo = if (groupListCount <= 0) {\n                                0\n                            } else {\n                                1\n                            },\n                            groupstartIndex = groupListStartIndex.toByte(),\n                            getgroupCount = groupListCount.toByte(),\n                            ifGetMSFGroup = 0,\n                            ifShowTermType = 1,\n                            version = 27L,\n                            uinList = null,\n                            eAppType = 0,\n                            ifGetBothFlag = 0,\n                            ifGetDOVId = 0,\n                            vec0xd6bReq = EMPTY_BYTE_ARRAY,\n                            vec0xd50Req = Vec0xd50.ReqBody(\n                                appid = 10002L,\n                                reqKsingSwitch = 1,\n                                reqMusicSwitch = 1,\n                                reqMutualmarkLbsshare = 1,\n                                reqMutualmarkAlienation = 1\n                            ).toByteArray(Vec0xd50.ReqBody.serializer()),\n                            vecSnsTypelist = listOf(13580L, 13581L, 13582L)\n                        )\n                    )\n                )\n            )\n        }\n    }\n\n    // for FriendGroup\n    internal object SetGroupReqPack : OutgoingPacketFactory<SetGroupReqPack.Response>(\"friendlist.SetGroupReq\") {\n        class Response(\n            // Success: result == 0x00\n            val result: Byte,\n            val errStr: String,\n            // groupId for delete\n            val groupId: Int,\n            val isSuccess: Boolean = result.toInt() == 0\n        ) : Packet {\n            override fun toString(): String {\n                return \"SetGroupResp(isSuccess=$isSuccess,resultCode=$result, errString=$errStr, groupId=$groupId)\"\n            }\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            val pack = this.readUniPacket(SetGroupResp.serializer())\n            return if (pack.result.toInt() == 0) {\n                Response(pack.result, pack.errorString, pack.vecBody?.get(8)?.toInt() ?: -1)\n            } else {\n                Response(pack.result, pack.errorString, -1)\n            }\n        }\n\n        object New {\n            operator fun invoke(\n                client: QQAndroidClient, groupName: String\n            ) = buildOutgoingUniPacket(client) {\n                val arr = groupName.toByteArray()\n                // maybe is constant\n                val constant: Byte = 0x01\n                writeJceRequestPacket(\n                    servantName = \"mqq.IMService.FriendListServiceServantObj\",\n                    funcName = \"SetGroupReq\",\n                    serializer = SetGroupReq.serializer(),\n                    body = SetGroupReq(0, client.uin, byteArrayOf(constant, arr.size.toByte()) + arr)\n                )\n            }\n        }\n\n        object Rename {\n            operator fun invoke(client: QQAndroidClient, newName: String, id: Int) = buildOutgoingUniPacket(client) {\n                val arr = newName.toByteArray()\n                writeJceRequestPacket(\n                    servantName = \"mqq.IMService.FriendListServiceServantObj\",\n                    funcName = \"SetGroupReq\",\n                    serializer = SetGroupReq.serializer(),\n                    body = SetGroupReq(1, client.uin, byteArrayOf(id.toByte(), arr.size.toByte()) + arr)\n                )\n            }\n        }\n\n        object Delete {\n            operator fun invoke(client: QQAndroidClient, id: Int) = buildOutgoingUniPacket(client) {\n                writeJceRequestPacket(\n                    servantName = \"mqq.IMService.FriendListServiceServantObj\",\n                    funcName = \"SetGroupReq\",\n                    serializer = SetGroupReq.serializer(),\n                    body = SetGroupReq(2, client.uin, byteArrayOf(id.toByte()))\n                )\n            }\n        }\n    }\n\n    // for FriendGroup\n    internal object MoveGroupMemReqPack :\n        OutgoingPacketFactory<MoveGroupMemReqPack.Response>(\"friendlist.MovGroupMemReq\") {\n        private fun Long.toByteArray2(): ByteArray {\n            val arr = this.toByteArray()\n            val index = arr.indexOfFirst { it.toInt() != 0 }\n            return arr.sliceArray(index until arr.size)\n        }\n\n        // 如果不成功会自动移动到id = 0的默认好友分组, result 还是会返回0\n        class Response(\n            // Success: result == 0x00\n            val result: Byte,\n            val errStr: String,\n            val isSuccess: Boolean = result.toInt() == 0\n        ) : Packet {\n            override fun toString(): String {\n                return \"MoveGroupMemReq(isSuccess=$isSuccess,resultCode=$result, errString=$errStr)\"\n            }\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            val pack = this.readUniPacket(MovGroupMemResp.serializer())\n            return Response(pack.result, pack.errorString)\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient,\n            // friend id\n            id: Long,\n            // friend group id\n            groupId: Int\n        ) = buildOutgoingUniPacket(client) {\n            writeJceRequestPacket(\n                servantName = \"mqq.IMService.FriendListServiceServantObj\",\n                funcName = \"MovGroupMemReq\",\n                serializer = MovGroupMemReq.serializer(),\n                body = MovGroupMemReq(\n                    client.uin,\n                    0,\n                    byteArrayOf(\n                        0x01,\n                        0x00,\n                        (id.toByteArray2().size + 1).toByte()\n                    ) + id.toByteArray2() + byteArrayOf(groupId.toByte(), 0x00, 0x00)\n                )\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/list/ProfileService.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.list\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.data.jce.GroupMngReqJce\nimport net.mamoe.mirai.internal.network.protocol.data.jce.GroupMngRes\nimport net.mamoe.mirai.internal.network.protocol.data.jce.RequestPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.jceRequestSBuffer\nimport net.mamoe.mirai.internal.utils.io.serialization.readUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.writeJceStruct\nimport net.mamoe.mirai.utils.toByteArray\n\ninternal class ProfileService {\n    object GroupMngReq : OutgoingPacketFactory<GroupMngReq.GroupMngReqResponse>(\"ProfileService.GroupMngReq\") {\n        data class GroupMngReqResponse(val errorCode: Int, val errorMessage: String) : Packet\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): GroupMngReqResponse {\n            val resp = readUniPacket(GroupMngRes.serializer())\n            return GroupMngReqResponse(resp.errorCode.toInt(), resp.errorString)\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient,\n            groupCode: Long\n        ) = buildOutgoingUniPacket(client) {\n            writeJceStruct(\n                RequestPacket.serializer(),\n                RequestPacket(\n                    servantName = \"KQQ.ProfileService.ProfileServantObj\",\n                    funcName = \"GroupMngReq\",\n                    requestId = client.nextRequestPacketRequestId(),\n                    sBuffer = jceRequestSBuffer(\n                        \"GroupMngReq\",\n                        GroupMngReqJce.serializer(),\n                        GroupMngReqJce(\n                            reqtype = 2,\n                            uin = client.uin,\n                            vecBody = client.uin.shl(32).or(groupCode).toByteArray()\n                        )\n                    )\n                )\n            )\n        }\n\n\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/list/StrangerList.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.list\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.contact.Stranger\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.StrangerRelationChangeEvent\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Oidb0x5d2\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Oidb0x5d4\nimport net.mamoe.mirai.internal.network.protocol.data.proto.OidbSso\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf\n\ninternal class StrangerList {\n    object GetStrangerList : OutgoingPacketFactory<GetStrangerList.Response>(\"OidbSvc.0x5d2_0\") {\n\n        class Response(\n            val result: Int,\n            val strangerList: List<Oidb0x5d2.FriendEntry>,\n            val origin: Oidb0x5d2.RspGetList?\n        ) : Packet {\n            override fun toString(): String {\n                return \"StrangerList.GetStrangerList.Response(result=$result)\"\n            }\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient,\n        ) = buildOutgoingUniPacket(client) {\n            writeProtoBuf(\n                OidbSso.OIDBSSOPkg.serializer(),\n                OidbSso.OIDBSSOPkg(\n                    command = 1490,\n                    serviceType = 0,\n                    bodybuffer = Oidb0x5d2.ReqBody(\n                        subCmd = 1,\n                        reqGetList = Oidb0x5d2.ReqGetList(\n                            seq = client.strangerSeq\n                        )\n                    ).toByteArray(Oidb0x5d2.ReqBody.serializer())\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            readProtoBuf(OidbSso.OIDBSSOPkg.serializer()).let { pkg ->\n                if (pkg.result == 0) {\n                    pkg.bodybuffer.loadAs(Oidb0x5d2.RspBody.serializer()).rspGetList!!.let {\n                        bot.client.strangerSeq = it.seq\n                        return Response(pkg.result, it.list, it)\n                    }\n                }\n                return Response(pkg.result, emptyList(), null)\n            }\n        }\n\n    }\n\n    object DelStranger : OutgoingPacketFactory<DelStranger.Response>(\"OidbSvc.0x5d4_0\") {\n        class Response(val result: Int) : Packet {\n            val isSuccess = result == 0\n            override fun toString(): String = \"DelStranger.Response(success=${result == 0})\"\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient,\n            stranger: Stranger\n        ) = buildOutgoingUniPacket(client) {\n            writeProtoBuf(\n                OidbSso.OIDBSSOPkg.serializer(),\n                OidbSso.OIDBSSOPkg(\n                    command = 1492,\n                    serviceType = 0,\n                    result = 0,\n                    bodybuffer = Oidb0x5d4.ReqBody(\n                        uinList = listOf(stranger.id)\n                    ).toByteArray(Oidb0x5d4.ReqBody.serializer())\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            readProtoBuf(OidbSso.OIDBSSOPkg.serializer()).let { pkg ->\n                if (pkg.result == 0) {\n                    pkg.bodybuffer.loadAs(Oidb0x5d4.RspBody.serializer()).result.forEach { delResult ->\n                        bot.getStranger(delResult.uin)?.let {\n                            bot.strangers.remove(delResult.uin)\n                            StrangerRelationChangeEvent.Deleted(it).broadcast()\n                        }\n                    }\n                }\n                return Response(pkg.result)\n            }\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/login/ConfigPushSvc.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.login\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.event.events.BotOfflineEvent\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.message.contextualBugReportException\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.components.*\nimport net.mamoe.mirai.internal.network.networkType\nimport net.mamoe.mirai.internal.network.protocol.data.jce.FileStoragePushFSSvcList\nimport net.mamoe.mirai.internal.network.protocol.data.jce.PushResp\nimport net.mamoe.mirai.internal.network.protocol.data.jce.RequestPacket\nimport net.mamoe.mirai.internal.network.protocol.data.jce.ServerListPush\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Subcmd0x501\nimport net.mamoe.mirai.internal.network.protocol.packet.IncomingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.buildResponseUniPacket\nimport net.mamoe.mirai.internal.utils.NetworkType\nimport net.mamoe.mirai.internal.utils.io.serialization.jceRequestSBuffer\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.internal.utils.io.serialization.readUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.writeJceStruct\nimport net.mamoe.mirai.utils.info\nimport net.mamoe.mirai.utils.toUHexString\nimport net.mamoe.mirai.internal.network.protocol.data.jce.PushReq as PushReqJceStruct\n\n\ninternal class ConfigPushSvc {\n    object PushReq : IncomingPacketFactory<PushReq.PushReqResponse>(\n        receivingCommandName = \"ConfigPushSvc.PushReq\",\n        responseCommandName = \"ConfigPushSvc.PushResp\"\n    ) {\n        override val canBeCached: Boolean get() = false\n\n        sealed class PushReqResponse(\n            val struct: PushReqJceStruct,\n            val bot: QQAndroidBot,\n        ) : Packet, Event, AbstractEvent(), Packet.NoEventLog {\n            class Unknown(struct: PushReqJceStruct, bot: QQAndroidBot) : PushReqResponse(struct, bot) {\n                override fun toString(): String {\n                    return \"ConfigPushSvc.PushReq.PushReqResponse.Unknown\"\n                }\n            }\n\n            class LogAction(struct: PushReqJceStruct, bot: QQAndroidBot) : PushReqResponse(struct, bot) {\n                override fun toString(): String {\n                    return \"ConfigPushSvc.PushReq.PushReqResponse.LogAction\"\n                }\n            }\n\n            class ServerListPush(struct: PushReqJceStruct, bot: QQAndroidBot) : PushReqResponse(struct, bot) {\n                override fun toString(): String {\n                    return \"ConfigPushSvc.PushReq.PushReqResponse.ServerListPush\"\n                }\n            }\n\n            class ConfigPush(struct: PushReqJceStruct, bot: QQAndroidBot) : PushReqResponse(struct, bot) {\n                override fun toString(): String {\n                    return \"ConfigPushSvc.PushReq.PushReqResponse.ConfigPush\"\n                }\n            }\n\n\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot, sequenceId: Int): PushReqResponse {\n            val pushReq = readUniPacket(PushReqJceStruct.serializer(), \"PushReq\")\n            return when (pushReq.type) {\n                1 -> PushReqResponse.ServerListPush(pushReq, bot)\n                2 -> PushReqResponse.ConfigPush(pushReq, bot)\n                3 -> PushReqResponse.LogAction(pushReq, bot)\n                else -> PushReqResponse.Unknown(pushReq, bot)\n            }\n        }\n\n        override suspend fun QQAndroidBot.handle(packet: PushReqResponse, sequenceId: Int): OutgoingPacket? {\n            val bdhSyncer = bot.components[BdhSessionSyncer]\n\n            fun handleConfigPush(packet: PushReqResponse.ConfigPush) {\n                val pushReq = packet.struct\n\n                // FS server\n                val fileStoragePushFSSvcList = pushReq.jcebuf.loadAs(FileStoragePushFSSvcList.serializer())\n                bot.client.fileStoragePushFSSvcList = fileStoragePushFSSvcList\n\n\n                val bigDataChannel = fileStoragePushFSSvcList.bigDataChannel\n                if (bigDataChannel?.vBigdataPbBuf == null) {\n                    bdhSyncer.bdhSession.completeExceptionally(IllegalStateException(\"BdhSession not received.\"))\n                    return\n                }\n\n                kotlin.runCatching {\n                    val resp =\n                        bigDataChannel.vBigdataPbBuf.loadAs(Subcmd0x501.RspBody.serializer()).msgSubcmd0x501RspBody\n                            ?: error(\"msgSubcmd0x501RspBody not found\")\n\n                    val session = BdhSession(\n                        sigSession = resp.httpconnSigSession,\n                        sessionKey = resp.sessionKey\n                    )\n\n                    for ((type, addresses) in resp.msgHttpconnAddrs) {\n                        when (type) {\n                            10 -> session.ssoAddresses.addAll(addresses.map { it.decode() })\n                            21 -> session.otherAddresses.addAll(addresses.map { it.decode() })\n                        }\n                    }\n\n                    session\n                }.fold(\n                    onSuccess = {\n                        bdhSyncer.overrideSession(it)\n                    },\n                    onFailure = { cause ->\n                        val e = IllegalStateException(\"Failed to decode BdhSession\", cause)\n                        bdhSyncer.bdhSession.completeExceptionally(e)\n                        logger.error(e)\n                    }\n                )\n            }\n\n            fun handleServerListPush(resp: PushReqResponse.ServerListPush) {\n                val serverListPush = kotlin.runCatching {\n                    resp.struct.jcebuf.loadAs(ServerListPush.serializer())\n                }.getOrElse {\n                    throw contextualBugReportException(\n                        \"ConfigPush.ReqPush type=1\",\n                        forDebug = resp.struct.jcebuf.toUHexString(),\n                    )\n                }\n                val pushServerList = if (client.networkType == NetworkType.WIFI) {\n                    serverListPush.wifiSSOServerList\n                } else {\n                    serverListPush.mobileSSOServerList\n                }\n\n                if (pushServerList.isNotEmpty()) {\n                    bot.components[ServerList].setPreferred(\n                        pushServerList.shuffled().map { ServerAddress(it.host, it.port) })\n                }\n                bdhSyncer.saveToCache()\n                bdhSyncer.saveServerListToCache()\n                if (serverListPush.reconnectNeeded == 1) {\n                    bot.logger.info { \"Server request to change server.\" }\n                    bot.components[EventDispatcher].broadcastAsync(\n                        BotOfflineEvent.RequireReconnect(bot, IllegalStateException(\"Server request to change server.\"))\n                    )\n                }\n            }\n\n            when (packet) {\n                is PushReqResponse.ConfigPush -> {\n                    handleConfigPush(packet)\n                }\n                is PushReqResponse.ServerListPush -> {\n                    handleServerListPush(packet)\n                }\n                is PushReqResponse.LogAction, is PushReqResponse.Unknown -> {\n                    //ignore\n                }\n            }\n            //Always send resp\n            if (!client.wLoginSigInfoInitialized) return null // concurrently doing reconnection\n            return buildResponseUniPacket(\n                client,\n                sequenceId = sequenceId,\n                key = client.wLoginSigInfo.d2Key\n            ) {\n                writeJceStruct(\n                    RequestPacket.serializer(),\n                    RequestPacket(\n                        requestId = client.nextRequestPacketRequestId(),\n                        version = 3,\n                        servantName = \"QQService.ConfigPushSvc.MainServant\",\n                        funcName = \"PushResp\",\n                        sBuffer = jceRequestSBuffer(\n                            \"PushResp\",\n                            PushResp.serializer(),\n                            PushResp(\n                                type = packet.struct.type,\n                                seq = packet.struct.seq,\n                                jcebuf = if (packet.struct.type == 3) packet.struct.jcebuf else null\n                            )\n                        )\n                    )\n                )\n                // writePacket(this.build().debugPrintThis())\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/login/Heartbeat.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.login\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.PacketEncryptType\nimport net.mamoe.mirai.internal.network.protocol.packet.buildLoginOutgoingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.writeSsoPacket\nimport net.mamoe.mirai.internal.network.subAppId\n\ninternal class Heartbeat {\n\n    object Alive : OutgoingPacketFactory<Alive.Response>(\"Heartbeat.Alive\") {\n        object Response : Packet {\n            override fun toString(): String = \"Heartbeat.Alive.Response\"\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient\n        ) = buildLoginOutgoingPacket(client, encryptMethod = PacketEncryptType.NoEncrypt) {\n            writeSsoPacket(client, client.subAppId, commandName, sequenceId = it) {\n\n            }\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            return Response\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/login/StatSvc.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.login\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.sync.withLock\nimport kotlinx.serialization.protobuf.ProtoBuf\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.contact.ClientKind\nimport net.mamoe.mirai.contact.OtherClientInfo\nimport net.mamoe.mirai.contact.Platform\nimport net.mamoe.mirai.data.OnlineStatus\nimport net.mamoe.mirai.event.events.OtherClientOfflineEvent\nimport net.mamoe.mirai.event.events.OtherClientOnlineEvent\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.appId\nimport net.mamoe.mirai.internal.contact.createOtherClient\nimport net.mamoe.mirai.internal.message.contextualBugReportException\nimport net.mamoe.mirai.internal.network.*\nimport net.mamoe.mirai.internal.network.components.ClockHolder\nimport net.mamoe.mirai.internal.network.components.ContactCacheService\nimport net.mamoe.mirai.internal.network.components.ContactUpdater\nimport net.mamoe.mirai.internal.network.components.ServerList\nimport net.mamoe.mirai.internal.network.getRandomByteArray\nimport net.mamoe.mirai.internal.network.handler.logger\nimport net.mamoe.mirai.internal.network.handler.selector.NetworkException\nimport net.mamoe.mirai.internal.network.impl.HeartbeatFailedException\nimport net.mamoe.mirai.internal.network.protocol.data.jce.*\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Oidb0x769\nimport net.mamoe.mirai.internal.network.protocol.data.proto.StatSvcGetOnline\nimport net.mamoe.mirai.internal.network.protocol.data.proto.StatSvcSimpleGet\nimport net.mamoe.mirai.internal.network.protocol.packet.*\nimport net.mamoe.mirai.internal.utils.NetworkType\nimport net.mamoe.mirai.internal.utils.io.serialization.*\nimport net.mamoe.mirai.utils.*\n\n@Suppress(\"EnumEntryName\", \"unused\")\ninternal enum class RegPushReason {\n    appRegister,\n    createDefaultRegInfo,\n    fillRegProxy,\n    msfBoot,\n    msfByNetChange,\n    msfHeartTimeTooLong,\n    serverPush,\n    setOnlineStatus,\n    unknown\n}\n\ninternal class StatSvc {\n    internal object GetOnlineStatus : OutgoingPacketFactory<GetOnlineStatus.Response>(\"StatSvc.GetOnlineStatus\") {\n\n        internal sealed class Response : Packet {\n            override fun toString(): String = \"StatSvc.GetOnlineStatus.Response\"\n\n            object Success : Response() {\n                override fun toString(): String {\n                    return \"StatSvc.GetOnlineStatus.Response.Success\"\n                }\n            }\n\n            class Failed(val errno: Int, val message: String) : Response() {\n                override fun toString(): String {\n                    return \"StatSvc.GetOnlineStatus.Response.Failed(errno=$errno, message=$message)\"\n                }\n            }\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient\n        ) = buildLoginOutgoingPacket(client, PacketEncryptType.D2) {\n            writeProtoBuf(\n                StatSvcGetOnline.ReqBody.serializer(), StatSvcGetOnline.ReqBody(\n                    uin = client.uin,\n                    appid = 0\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            val resp = readProtoBuf(StatSvcGetOnline.RspBody.serializer())\n            return if (resp.errorCode != 0) {\n                Response.Failed(resp.errorCode, resp.errorMsg)\n            } else {\n                Response.Success\n            }\n        }\n    }\n\n    internal object SimpleGet : OutgoingPacketFactory<SimpleGet.Response>(\"StatSvc.SimpleGet\") {\n        internal sealed interface Response : Packet {\n            object Success : Response {\n                override fun toString(): String = \"SimpleGet.Response.Success\"\n            }\n\n            class Error(val code: Int, val msg: String) : Response {\n                override fun toString(): String = \"SimpleGet.Response.Error(code=$code,msg=$msg)\"\n            }\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient\n        ) = buildLoginOutgoingPacket(\n            client,\n            encryptMethod = PacketEncryptType.D2\n        ) {\n            writeSsoPacket(client, client.subAppId, commandName, sequenceId = it) {\n\n            }\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            readProtoBuf(StatSvcSimpleGet.RspBody.serializer()).let {\n                return if (it.errorCode == 0) {\n                    Response.Success\n                } else {\n                    Response.Error(it.errorCode, it.errmsg)\n                }\n            }\n        }\n\n        override suspend fun QQAndroidBot.handle(packet: Response) {\n            if (packet is Response.Error) {\n                network.close(HeartbeatFailedException(\"StatSvc.SimpleGet\", IllegalStateException(packet.toString())))\n            }\n        }\n    }\n\n    internal object Register : OutgoingPacketFactory<Register.Response>(\"StatSvc.register\") {\n\n        internal class Response(\n            val origin: SvcRespRegister\n        ) : Packet {\n            override fun toString(): String = \"Response(StatSvc.register)\"\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            val packet = readUniPacket(SvcRespRegister.serializer())\n            return Response(packet)\n        }\n\n        override suspend fun QQAndroidBot.handle(packet: Response) {\n            packet.origin.iHelloInterval.let {\n                bot.configuration.statHeartbeatPeriodMillis = it.times(1000).toLong()\n            }\n\n            val serverTime = packet.origin.serverTime\n            val diffMillis = if (serverTime == 0L) 0 else serverTime - currentTimeSeconds()\n            bot.components[ClockHolder].server = Clock.SystemDefault.adjusted(diffMillis)\n            bot.network.logger.info { \"Server time updated, serverTime: $serverTime, diff: ${diffMillis}ms=${diffMillis.millisToHumanReadableString()}\" }\n        }\n\n        fun online(\n            client: QQAndroidClient,\n            regPushReason: RegPushReason = RegPushReason.appRegister\n        ) = impl(\"online\", client, 1L or 2 or 4, client.onlineStatus, regPushReason) {\n            if (client.bot.configuration.protocol == BotConfiguration.MiraiProtocol.ANDROID_PHONE) {\n                client.bot.components[ServerList].run {\n                    kotlin.runCatching {\n                        uOldSSOIp = lastDisconnectedIP.toIpV4Long()\n                        uNewSSOIp = lastConnectedIP.toIpV4Long()\n                    }.onFailure { err ->\n                        client.bot.network.logger.warning({\n                            \"Exception when converting ipaddress to long: ld=${lastDisconnectedIP}, lc=${lastConnectedIP}\"\n                        }, err)\n                        uNewSSOIp = 0\n                        uOldSSOIp = 0\n                    }\n                }\n            } else {\n                uOldSSOIp = 0\n                uNewSSOIp = 0\n            }\n            client.bot.components[ContactCacheService].friendListCache?.let { friendListCache ->\n                iLargeSeq = friendListCache.friendListSeq\n            }\n            //  timeStamp = friendListCache.timeStamp\n            strVendorName = \"MIUI\"\n            strVendorOSName = \"?ONEPLUS A5000_23_17\"\n        }\n\n        fun offline(\n            client: QQAndroidClient,\n            regPushReason: RegPushReason = RegPushReason.appRegister\n        ) = impl(\"offline\", client, 1L or 2 or 4, OnlineStatus.OFFLINE, regPushReason)\n\n        private fun impl(\n            name: String,\n            client: QQAndroidClient,\n            bid: Long,\n            status: OnlineStatus,\n            regPushReason: RegPushReason = RegPushReason.appRegister,\n            applyAction: SvcReqRegister.() -> Unit = {}\n        ) = buildLoginOutgoingPacket(\n            client,\n            encryptMethod = PacketEncryptType.D2,\n            extraData = client.wLoginSigInfo.d2.data,\n            key = client.wLoginSigInfo.d2Key,\n            remark = name,\n        ) { sequenceId ->\n            writeSsoPacket(\n                client, subAppId = client.subAppId, commandName = commandName,\n                extraData = client.wLoginSigInfo.tgt.toReadPacket(), sequenceId = sequenceId\n            ) {\n                writeJceStruct(\n                    RequestPacket.serializer(),\n                    RequestPacket(\n                        servantName = \"PushService\",\n                        funcName = \"SvcReqRegister\",\n                        requestId = 0,\n                        sBuffer = jceRequestSBuffer(\n                            \"SvcReqRegister\",\n                            SvcReqRegister.serializer(),\n                            SvcReqRegister(\n                                cConnType = 0,\n                                lBid = bid,\n                                lUin = client.uin,\n                                iStatus = status.id,\n                                bKikPC = 0, // 是否把 PC 踢下线\n                                bKikWeak = 0,\n                                timeStamp = 0,\n                                // timeStamp = currentTimeSeconds // millis or seconds??\n                                iLargeSeq = 0, // ?\n                                bOpenPush = 1,\n                                iLocaleID = 2052,\n                                bRegType =\n                                (if (regPushReason == RegPushReason.appRegister ||\n                                    regPushReason == RegPushReason.fillRegProxy ||\n                                    regPushReason == RegPushReason.createDefaultRegInfo ||\n                                    regPushReason == RegPushReason.setOnlineStatus\n                                ) 0 else 1).toByte(),\n                                bIsSetStatus = if (regPushReason == RegPushReason.setOnlineStatus) 1 else 0,\n                                iOSVersion = client.device.version.sdk.toLong(),\n                                cNetType = if (client.networkType == NetworkType.WIFI) 1 else 0,\n                                vecGuid = client.device.guid,\n                                strDevName = client.device.model.decodeToString(),\n                                strDevType = client.device.model.decodeToString(),\n                                strOSVer = client.device.version.release.decodeToString(),\n                                // register 时还需要\n                                /*\n                                var44.uNewSSOIp = field_127445;\n                                var44.uOldSSOIp = field_127444;\n                                var44.strVendorName = ROMUtil.getRomName();\n                                var44.strVendorOSName = ROMUtil.getRomVersion(20);\n                                */\n                                bytes_0x769_reqbody = ProtoBuf.encodeToByteArray(\n                                    Oidb0x769.ReqBody.serializer(), Oidb0x769.ReqBody(\n                                        configList = listOf(\n                                            Oidb0x769.ConfigSeq(\n                                                type = 46,\n                                                version = 1610538309\n                                            ),\n                                            Oidb0x769.ConfigSeq(\n                                                type = 283,\n                                                version = 0\n                                            )\n                                        )\n                                    )\n                                ),\n                                bSetMute = 0\n                            ).apply(applyAction)\n                        )\n                    )\n                )\n            }\n        }\n\n\n    }\n\n    internal object ReqMSFOffline :\n        IncomingPacketFactory<ReqMSFOffline.MsfOfflinePacket>(\"StatSvc.ReqMSFOffline\", \"StatSvc.RspMSFForceOffline\") {\n\n        internal class MsfOfflinePacket(\n            val token: MsfOfflineToken,\n        ) : Packet {\n            override fun toString(): String = \"StatSvc.ReqMSFOffline\"\n        }\n\n        internal data class MsfOfflineToken(\n            val uin: Long,\n            val seq: Long,\n            val const: Byte\n        ) : Packet, NetworkException(\"dropped by StatSvc.ReqMSFOffline\", true)\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot, sequenceId: Int): MsfOfflinePacket {\n            val decodeUniPacket = readUniPacket(RequestMSFForceOffline.serializer())\n            @Suppress(\"INVISIBLE_MEMBER\")\n            return MsfOfflinePacket(MsfOfflineToken(decodeUniPacket.uin, decodeUniPacket.iSeqno, 0))\n        }\n\n        override suspend fun QQAndroidBot.handle(packet: MsfOfflinePacket, sequenceId: Int): OutgoingPacket? {\n            val cause = packet.token\n            val resp = buildResponseUniPacket(client) {\n                writeJceStruct(\n                    RequestPacket.serializer(),\n                    RequestPacket(\n                        servantName = \"StatSvc\",\n                        funcName = \"RspMSFForceOffline\",\n                        requestId = 0,\n                        sBuffer = jceRequestSBuffer(\n                            \"RspMSFForceOffline\",\n                            RspMSFForceOffline.serializer(),\n                            RspMSFForceOffline(\n                                cause.uin,\n                                cause.seq,\n                                cause.const\n                            )\n                        )\n                    )\n                )\n            }\n            kotlin.runCatching {\n                bot.network.sendWithoutExpect(resp)\n            }\n            bot.network.close(cause)\n            return null\n        }\n    }\n\n    internal object SvcReqMSFLoginNotify :\n        IncomingPacketFactory<Packet?>(\"StatSvc.SvcReqMSFLoginNotify\", \"StatSvc.SvcReqMSFLoginNotify\") {\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot, sequenceId: Int): Packet? =\n            bot.components[ContactUpdater].otherClientsLock.withLock {\n                val notify = readUniPacket(SvcReqMSFLoginNotifyData.serializer())\n\n                val appId = notify.iAppId.toInt()\n\n                when (notify.status.toInt()) {\n                    1 -> { // online\n                        if (bot.otherClients.any { it.appId == appId }) return null\n\n                        val info = Mirai.getOnlineOtherClientsList(bot).find { it.appId == appId }\n                            ?: kotlin.run {\n                                delay(2000) // sometimes server sync slow\n                                Mirai.getOnlineOtherClientsList(bot).find { it.appId == appId }\n                            } ?: kotlin.run {\n                                // 你的帐号在平板电脑上登录了\n                                val kind = notify.info?.substringAfter(\"在\")?.substringBefore(\"上\").orEmpty()\n                                OtherClientInfo(\n                                    appId,\n                                    Platform.MOBILE,\n                                    deviceName = kind,\n                                    deviceKind = kind\n                                )\n                            }\n\n                        val client = bot.createOtherClient(info)\n                        bot.otherClients.delegate.add(client)\n                        OtherClientOnlineEvent(\n                            client,\n                            ClientKind[notify.iClientType?.toInt() ?: 0]\n                        )\n                    }\n\n                    2 -> { // off\n                        val client = bot.otherClients.find { it.appId == appId } ?: return null\n                        client.cancel(CancellationException(\"Offline\"))\n                        bot.otherClients.delegate.remove(client)\n                        OtherClientOfflineEvent(client)\n                    }\n\n                    else -> throw contextualBugReportException(\n                        \"decode SvcReqMSFLoginNotify (OtherClient status change)\",\n                        notify.structureToString(),\n                        additional = \"unknown notify.status=${notify.status}\"\n                    )\n                }\n            }\n    }\n\n    internal object GetDevLoginInfo : OutgoingPacketFactory<GetDevLoginInfo.Response>(\"StatSvc.GetDevLoginInfo\") {\n\n        @Suppress(\"unused\") // false positive\n        data class Response(\n            val deviceList: List<SvcDevLoginInfo>,\n        ) : Packet {\n            override fun toString(): String {\n                return \"StatSvc.GetDevLoginInfo.Response(deviceList.size=${deviceList.size})\"\n            }\n        }\n\n        operator fun invoke(\n            client: QQAndroidClient,\n        ) = buildOutgoingUniPacket(client) {\n            writeJceRequestPacket(\n                servantName = \"StatSvc\",\n                funcName = \"SvcReqGetDevLoginInfo\",\n                serializer = SvcReqGetDevLoginInfo.serializer(),\n                body = SvcReqGetDevLoginInfo(\n                    iLoginType = 2,\n                    iRequireMax = 20,\n                    iTimeStamp = currentTimeMillis(),\n                    iGetDevListType = 1,\n                    vecGuid = getRandomByteArray(16), // 服务器防止频繁查询\n                    iNextItemIndex = 0,\n                    appName = client.protocol.apkId //\"com.tencent.mobileqq\"\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            val resp = readUniPacket(SvcRspGetDevLoginInfo.serializer())\n\n            // result 62 maybe too frequent\n            return Response(\n                resp.vecCurrentLoginDevInfo?.takeIf { it.isNotEmpty() }\n                    ?: resp.vecAuthLoginDevInfo?.takeIf { it.isNotEmpty() }\n                    ?: resp.vecHistoryLoginDevInfo.orEmpty()\n            )\n        }\n    }\n}\n\ninternal fun String.toIpV4Long(): Long {\n    if (isEmpty()) return 0\n    val split = split('.')\n    if (split.size != 4) return 0\n    return split.mapToByteArray { it.toUByte().toByte() }.toInt().toLongUnsigned()\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/login/WtLogin.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.login\n\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.event.events.BotEvent\nimport net.mamoe.mirai.internal.AbstractBot\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.*\nimport net.mamoe.mirai.internal.network.DebuggingProperties.SHOW_TLV_MAP_ON_LOGIN_SUCCESS\nimport net.mamoe.mirai.internal.network.components.KeyRefreshProcessor\nimport net.mamoe.mirai.internal.network.handler.logger\nimport net.mamoe.mirai.internal.network.protocol.packet.*\nimport net.mamoe.mirai.internal.network.protocol.packet.login.wtlogin.WtLogin8\nimport net.mamoe.mirai.internal.network.protocol.packet.login.wtlogin.WtLoginExt\nimport net.mamoe.mirai.internal.network.protocol.packet.login.wtlogin.analysisTlv0x531\nimport net.mamoe.mirai.internal.network.protocol.packet.login.wtlogin.orEmpty\nimport net.mamoe.mirai.internal.utils.crypto.TEA\nimport net.mamoe.mirai.internal.utils.io.writeShortLVByteArray\nimport net.mamoe.mirai.internal.utils.io.writeShortLVPacket\nimport net.mamoe.mirai.internal.utils.printStructure\nimport net.mamoe.mirai.network.InconsistentBotIdException\nimport net.mamoe.mirai.network.RetryLaterException\nimport net.mamoe.mirai.network.WrongPasswordException\nimport net.mamoe.mirai.utils.*\n\n\ninternal class SmsVerifyInfo(\n    override val countryCode: String?, // 86\n    override val phoneNumber: String?, // 123*******1\n    private val token: ByteArray, // t174\n    private val bot: AbstractBot,\n) : DeviceVerificationRequests.SmsRequest {\n    override suspend fun requestSms() {\n        val result = try {\n            bot.network.sendAndExpect(WtLogin8(bot.client, token))\n        } catch (e: Exception) {\n            bot.logger.warning(\"Exception while requesting SMS.\", e)\n            throw e\n        }\n        if (result !is WtLogin.Login.LoginPacketResponse.SmsRequestSuccess) {\n            bot.logger.warning(\"Failed requestSms, result = $result\")\n\n            if (result is WtLogin.Login.LoginPacketResponse.Error) {\n                when (result.code) {\n                    161, 162 -> {\n                        // 今日操作次数过多，请等待一天后再试。\n                        throw RetryLaterException(\n                            result.message,\n                            null,\n                            killBot = true\n                        )\n                    }\n                }\n            }\n\n            throw WrongPasswordException(\"Failed requestSms, result = $result\")\n        }\n    }\n\n    override fun solved(code: String): DeviceVerificationResult {\n        return SmsDeviceVerificationResult(code, token)\n    }\n\n    override fun toString(): String {\n        return \"SmsVerifyInfo(+$countryCode $phoneNumber)\"\n    }\n}\n\ninternal class FallbackRequestImpl(override val url: String) : DeviceVerificationRequests.FallbackRequest {\n    override fun solved(): DeviceVerificationResult {\n        return UrlDeviceVerificationResult\n    }\n\n    override fun toString(): String {\n        return \"FallbackRequestImpl($url)\"\n    }\n}\n\ninternal sealed interface DeviceVerificationResultImpl : DeviceVerificationResult\n\ninternal object UrlDeviceVerificationResult : DeviceVerificationResultImpl {\n    override fun toString(): String {\n        return \"UrlVerificationResult\"\n    }\n}\n\ninternal class SmsDeviceVerificationResult(\n    val code: String,\n    val token: ByteArray, // t174\n) : DeviceVerificationResultImpl {\n    override fun toString(): String {\n        return \"SmsVerificationResult(code=$code, token=${token.toUHexString(\"\")})\"\n    }\n}\n\ninternal class WtLogin {\n    /**\n     * OicqRequest\n     */\n    internal object Login : OutgoingPacketFactory<Login.LoginPacketResponse>(\"wtlogin.login\"), WtLoginExt {\n\n        /**\n         * Check SMS Login\n         */\n        object SubCommand17 {\n            operator fun invoke(\n                client: QQAndroidClient\n            ) = buildLoginOutgoingPacket(client, encryptMethod = PacketEncryptType.Empty) { sequenceId ->\n                writeSsoPacket(\n                    client,\n                    client.subAppId,\n                    commandName,\n                    sequenceId = sequenceId,\n                    unknownHex = \"01 00 00 00 00 00 00 00 00 00 01 00\"\n                ) {\n                    writeOicqRequestPacket(client, commandId = 0x0810) {\n                        writeShort(17) // subCommand\n                        _writeTlvMap {\n                            t100(16, client.subAppId, client.appClientVersion, client.ssoVersion, client.mainSigMap)\n                            t108(client.ksid)\n                            t109(client.device.androidId)\n                            t8(2052)\n                            t142(client.apkId)\n                            t145(client.device.guid)\n                            t154(0)\n                            // 需要 t112, 但在实现 QR 时删除了 phoneNumber\n//t112(client.account.phoneNumber.encodeToByteArray())\n                            t116(client.miscBitMap, client.subSigMap)\n                            t521()\n                            t52c()\n                            t52d(client.device.generateDeviceInfoData())\n                        }\n                    }\n                }\n            }\n        }\n\n\n        sealed class LoginPacketResponse : Packet, BotEvent, Packet.NoEventLog, AbstractEvent() {\n            class Success(override val bot: Bot) : LoginPacketResponse() {\n                override fun toString(): String = \"LoginPacketResponse.Success\"\n            }\n\n            class SmsRequestSuccess(override val bot: Bot) : LoginPacketResponse() {\n                override fun toString(): String = \"LoginPacketResponse.SmsRequestSuccess\"\n            }\n\n            data class Error(\n                override val bot: Bot,\n                val code: Int,\n                val title: String,\n                val message: String,\n                val errorInfo: String,\n            ) : LoginPacketResponse()\n\n            sealed class Captcha : LoginPacketResponse() {\n\n                class Slider(\n                    override val bot: Bot,\n                    val url: String,\n                ) : Captcha() {\n                    override fun toString(): String = \"LoginPacketResponse.Captcha.Slider\"\n                }\n\n                class Picture(\n                    override val bot: Bot,\n                    val data: ByteArray,\n                    val sign: ByteArray,\n                ) : Captcha() {\n                    override fun toString(): String = \"LoginPacketResponse.Captcha.Picture\"\n                }\n            }\n\n            class VerificationNeeded(\n                override val bot: Bot,\n                val message: String?,\n                val requests: DeviceVerificationRequests,\n            ) : LoginPacketResponse() {\n                override fun toString(): String =\n                    \"LoginPacketResponse.VerificationNeeded(requests=$requests)\"\n            }\n\n            class DeviceLockLogin(\n                override val bot: Bot,\n            ) : LoginPacketResponse() {\n                override fun toString(): String = \"LoginPacketResponse.DeviceLockLogin\"\n            }\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): LoginPacketResponse {\n\n            val subCommand = readShort().toUShort() // subCommand\n            // println(\"subCommand=$subCommand\")\n            val type = readByte().toUByte()\n            // println(\"type=$type\")\n\n            discardExact(2)\n            val tlvMap: TlvMap = this._readTLVMap()\n\n            if (SHOW_TLV_MAP_ON_LOGIN_SUCCESS) {\n                tlvMap.smartToString().printStructure(\"tlvMap outer\")\n            }\n\n            // tlvMap.printTLVMap()\n            tlvMap[0x161]?.let { bot.client.analysisTlv161(it) }\n            tlvMap[0x403]?.let { bot.client.randSeed = it }\n            tlvMap[0x402]?.let { bot.client.t402 = it }\n            tlvMap[0x546]?.let { bot.client.analysisTlv546(it) }\n            tlvMap[0x543]?.let { bot.client.t543 = it }\n            // tlvMap[0x402]?.let { t402 ->\n//            bot.client.G = buildPacket {\n//                writeFully(bot.client.device.guid)\n//                writeFully(bot.client.dpwd)\n//                writeFully(tlvMap[0x402] ?: EMPTY_BYTE_ARRAY)\n//            }.readBytes().md5()\n            //   }\n\n            tlvMap[0x402]?.let { t402 ->\n                bot.client.dpwd = getRandomByteArray(16)\n                bot.client.t402 = t402\n                bot.run {\n                    // client.dpwd = getRandomString(16).toByteArray()\n                    client.G = (client.device.guid + client.dpwd + t402).md5()\n                }\n            }\n\n            return when (type.toInt()) {\n                0 -> onLoginSuccess(subCommand.toInt(), tlvMap, bot)\n                2 -> onSolveLoginCaptcha(tlvMap, bot)\n                160, 239 /*-96*/ -> onVerificationNeeded(subCommand.toShort(), tlvMap, bot)\n                // 40: blocked\n                // 161: 今日操作次数过多，请等待一天后再试。   (SMS)\n                // 162: 可能也是 SMS 太频繁\n                // 180：可能是需要换服务器或者 refresh key\n                180 -> onRequestRefreshKeys(tlvMap, bot)\n                204 /*-52*/ -> onDevLockLogin(tlvMap, bot)\n                // 1, 15 -> onErrorMessage(tlvMap) ?: error(\"Cannot find error message\")\n                else -> {\n                    onErrorMessage(type.toInt(), tlvMap, bot)\n                        ?: error(\n                            \"Cannot find error message, unknown login result type: $type, TLVMap = ${dumpTlvMap(tlvMap)}\"\n                        )\n                }\n            }\n        }\n\n        private fun dumpTlvMap(tlvMap: TlvMap): String {\n            return tlvMap.entries.joinToString { \"${it.key}=${it.value.toUHexString()}\" }\n        }\n\n        // request refresh keys or change server ip?\n        private suspend fun onRequestRefreshKeys(\n            tlvMap: TlvMap,\n            bot: QQAndroidBot\n        ): LoginPacketResponse {\n            val errorMessage = onErrorMessage(0x146, tlvMap, bot)\n            if (errorMessage != null) {\n                return errorMessage\n            }\n\n            // analysis tlv t161\n            val t161 = (tlvMap[0x161]\n                ?: return LoginPacketResponse.Error(bot, 0x146, \"login failed\",\n                    \"login result type 180 without and t161 error message\", \"\"))\n                .toReadPacket()\n                .apply { discardExact(2) }\n                .withUse { _readTLVMap() }\n                .also { tm ->\n                    tm[0x173]?.let { bot.client.analysisTlv173(it) }\n                    tm[0x17f]?.let { bot.client.analysisTlv17f(it) }\n                }\n\n            val t172 = t161[0x172]\n            if (t172 != null) {\n                if (t172.contentEquals(bot.client.rollbackSig)) {\n                    return LoginPacketResponse.Error(bot, 0x146, \"login failed\",\n                        \"login result type 180 with same t172 as the client's\", \"\")\n                }\n\n                runCatching {\n                    bot.client.rollbackSig = t172\n                    bot.components[KeyRefreshProcessor].refreshKeysNow(bot.network)\n                }.fold(\n                    onSuccess = { return LoginPacketResponse.Success(bot) },\n                    onFailure = { return LoginPacketResponse.Error(bot, 0x146, \"login failed\",\n                        \"failed to refresh keys on receiving login result type 180\", \"\") }\n                )\n            } else {\n                return LoginPacketResponse.Error(bot, 0x146, \"login failed\",\n                    \"login result type 180 without t172\", \"\")\n            }\n        }\n\n        private fun onDevLockLogin(\n            tlvMap: TlvMap,\n            bot: QQAndroidBot\n        ): LoginPacketResponse.DeviceLockLogin {\n            bot.client.t104 = tlvMap.getOrFail(0x104)\n            // println(\"403： \" + tlvMap[0x403]?.toUHexString())\n            return LoginPacketResponse.DeviceLockLogin(bot)\n        }\n\n        private fun onVerificationNeeded(subCommand: Short, tlvMap: TlvMap, bot: QQAndroidBot): LoginPacketResponse {\n            val t174 = tlvMap[0x174]\n            val t17b = tlvMap[0x17b]\n            val message = tlvMap[0x17e]?.decodeToString()\n\n            t174?.let {\n                bot.client.t174 = it\n            }\n\n            if (t174 != null || t17b != null) {\n                tlvMap[0x104]?.let {\n                    // verify token\n                    bot.client.t104 = it\n                }\n            }\n\n            tlvMap[0x403]?.let {\n                bot.client.randSeed = it\n            }\n\n            if (subCommand == WtLogin8.subCommand) {\n                // response of submit sms\n                // tlvMap 只有 0x17b 和 0x174\n                return LoginPacketResponse.SmsRequestSuccess(bot)\n            }\n            var countryCode: String? = null\n            var phoneNumber: String? = null\n            tlvMap[0x178]?.read {\n                // phone number\n                countryCode = readUShortLVString()\n                phoneNumber = readUShortLVString()\n            }\n            val url = tlvMap[0x204]?.decodeToString()\n            check(url != null || t174 != null) {\n                \"Verification is needed but no method available.\"\n            }\n            return LoginPacketResponse.VerificationNeeded(\n                bot,\n                message = message,\n                requests = object : DeviceVerificationRequests {\n                    override val sms: DeviceVerificationRequests.SmsRequest? =\n                        t174?.let { SmsVerifyInfo(countryCode, phoneNumber, t174, bot) }\n                    override val fallback: DeviceVerificationRequests.FallbackRequest? =\n                        url?.let { FallbackRequestImpl(it) }\n                    override val preferSms: Boolean = tlvMap[0x17b] != null\n                    override fun toString(): String {\n                        return \"DeviceVerificationRequests(sms=$sms, preferSms=$preferSms, fallback=$fallback)\"\n                    }\n                },\n            )\n        }\n\n        private fun onSolveLoginCaptcha(tlvMap: TlvMap, bot: QQAndroidBot): LoginPacketResponse.Captcha {\n            /*\n            java.lang.IllegalStateException: UNKNOWN CAPTCHA QUESTION:\n            00 00 00 01 0A 70 69 63 5F 72 65 61 73 6F 6E 00 00 00 7F 51 51 E5 AE 89 E5 85 A8 E4 B8 AD E5 BF 83 E6 B8 A9 E9 A6 A8 E6 8F 90 E7 A4 BA EF BC 9A E5 BD 93 E5 89 8D E7 BD 91 E7 BB 9C E7 8E AF E5 A2 83 E6 9C 89 E5 8D B1 E5 8F 8A 51 51 E5 AE 89 E5 85 A8 E7 9A 84 E8 A1 8C E4 B8 BA EF BC 8C E4 B8 BA E4 BA 86 E4 BD A0 E7 9A 84 E5 B8 90 E5 8F B7 E5 AE 89 E5 85 A8 EF BC 8C E8 AF B7 E4 BD A0 E5 A1 AB E5 86 99 E9 AA 8C E8 AF 81 E7 A0 81 E3 80 82,\n            tlvMap={\n            0x00000104(260)=41 74 78 43 52 56 6A 46 61 79 33 76 56 5A 66 56 47 50 4B 63 4F 59 54 6D 76 32 4A 67 35 35 76 6A 51 67 3D 3D,\n            0x00000105(261)=00 04 41 7A 55 47 08 88 FF D8 FF E0 00 10 4A 46 49 46 00 01 01 00 00 01 00 01 00 00 FF FE 00 22 39 35 30 35 34 31 36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 88 5C DF 07 FF 7F 00 00 FF DB 00 43 00 0A 07 07 08 07 06 0A 08 08 08 0B 0A 0A 0B 0E 18 10 0E 0D 0D 0E 1D 15 16 11 18 23 1F 25 24 22 1F 22 21 26 2B 37 2F 26 29 34 29 21 22 30 41 31 34 39 3B 3E 3E 3E 25 2E 44 49 43 3C 48 37 3D 3E 3B FF DB 00 43 01 0A 0B 0B 0E 0D 0E 1C 10 10 1C 3B 28 22 28 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B FF C0 00 11 08 00 35 00 82 03 01 22 00 02 11 01 03 11 01 FF C4 00 1F 00 00 01 05 01 01 01 01 01 01 00 00 00 00 00 00 00 00 01 02 03 04 05 06 07 08 09 0A 0B FF C4 00 B5 10 00 02 01 03 03 02 04 03 05 05 04 04 00 00 01 7D 01 02 03 00 04 11 05 12 21 31 41 06 13 51 61 07 22 71 14 32 81 91 A1 08 23 42 B1 C1 15 52 D1 F0 24 33 62 72 82 09 0A 16 17 18 19 1A 25 26 27 28 29 2A 34 35 36 37 38 39 3A 43 44 45 46 47 48 49 4A 53 54 55 56 57 58 59 5A 63 64 65 66 67 68 69 6A 73 74 75 76 77 78 79 7A 83 84 85 86 87 88 89 8A 92 93 94 95 96 97 98 99 9A A2 A3 A4 A5 A6 A7 A8 A9 AA B2 B3 B4 B5 B6 B7 B8 B9 BA C2 C3 C4 C5 C6 C7 C8 C9 CA D2 D3 D4 D5 D6 D7 D8 D9 DA E1 E2 E3 E4 E5 E6 E7 E8 E9 EA F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FF C4 00 1F 01 00 03 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00 01 02 03 04 05 06 07 08 09 0A 0B FF C4 00 B5 11 00 02 01 02 04 04 03 04 07 05 04 04 00 01 02 77 00 01 02 03 11 04 05 21 31 06 12 41 51 07 61 71 13 22 32 81 08 14 42 91 A1 B1 C1 09 23 33 52 F0 15 62 72 D1 0A 16 24 34 E1 25 F1 17 18 19 1A 26 27 28 29 2A 35 36 37 38 39 3A 43 44 45 46 47 48 49 4A 53 54 55 56 57 58 59 5A 63 64 65 66 67 68 69 6A 73 74 75 76 77 78 79 7A 82 83 84 85 86 87 88 89 8A 92 93 94 95 96 97 98 99 9A A2 A3 A4 A5 A6 A7 A8 A9 AA B2 B3 B4 B5 B6 B7 B8 B9 BA C2 C3 C4 C5 C6 C7 C8 C9 CA D2 D3 D4 D5 D6 D7 D8 D9 DA E2 E3 E4 E5 E6 E7 E8 E9 EA F2 F3 F4 F5 F6 F7 F8 F9 FA FF DA 00 0C 03 01 00 02 11 03 11 00 3F 00 F5 EA 42 40 EA 40 AC CF 10 E9 D7 BA A6 96 6D AC 6F 05 AC 85 C3 12 77 00 EA 3F 87 2A 41 19 E3 91 5C BE 9D A7 E8 D2 5C B6 99 AB E9 CF 6B AA 85 3B 16 7B A9 5E 29 FD D1 8B 72 3D BA D7 4D 2A 31 9C 1C 9B F9 25 7F 9E E8 CA 53 69 DA C7 72 F2 C7 1A EE 92 45 45 F5 66 00 54 0B A9 D8 3C CB 0A DF 5B 34 8C 70 A8 25 5D C7 F0 CD 72 36 3A 22 18 2D 3F B5 EC 64 B4 8B 4A DC B2 24 8C B3 41 3E EE EA 0E 4F 24 8F A7 4A DE B6 F0 FD 9B 5D 45 76 F6 16 D6 C2 16 DF 0C 11 42 80 A9 EC 58 81 C9 F6 1C 0F 7A 73 A3 4A 1B CA FF 00 D7 A8 94 A4 FA 0F 6D 7C 16 B9 36 FA 75 D5 CC 56 AE D1 CB 32 49 0A AA B2 FD E0 77 C8 A4 63 DC 0E 39 1C 10 6A 7B 9D 5E 3B 5D 32 1B E9 2D AE 07 9D B0 2C 25 42 B8 66 E8 AD B8 85 53 DB 92 06 78 EA 40 34 0D F5 AE 16 39 60 86 6B 7D 55 F3 70 F1 96 C0 49 41 48 49 04 74 65 40 87 91 83 8F 5A 9B 4F 7B B8 ED 9A C6 ED 66 91 AC 64 09 E7 1D DF E9 0A 30 63 3B 8E 32 C7 20 37 6C AB 67 82 28 74 E2 B5 E5 FE BF E1 FD 37 40 A4 FB 96 ED 35 19 6E 2E 8D BC BA 65 DD A1 D8 5F 74 CD 11 5E A0 63 E4 76 20 F3 DF D0 D3 2F 7C 41 A4 69 C4 AD D6 A1 02 3A F5 8C 36 E7 FF 00 BE 46 4F E9 58 D7 A8 FA D4 36 33 C5 21 B3 1A D5 98 86 42 06 FD AE BF BD 55 23 8E 02 F9 EA 7A 75 FA 54 96 96 EB 1F 85 2F E2 B4 B4 B7 86 F6 DC 4B 14 AB 6B 17 97 BD D7 38 C6 39 F9 97 07 FE 05 55 EC 61 A3 97 A5 97 DD 7B BB F5 0E 77 B2 34 35 8D 7A 0D 2F 4D 82 F5 7C B9 56 E5 D5 62 67 93 CB 8F 90 58 16 62 0E 06 07 A1 ED 55 2E 24 F1 16 EB 77 7B DB 0B 61 2C EA B1 C3 0C 46 52 E3 A9 05 D8 8F E1 0C 78 03 A5 3B FE 12 7D 1A EE D0 43 69 1C D7 EB 24 7B 7C 8B 7B 76 7F 94 8E 87 8C 0F C4 D1 73 6D 35 A7 83 E0 DE 18 CD A7 C5 14 D8 E0 B7 EE C8 62 BC 77 21 4A FE 34 E3 1E 4B 27 1B 36 FA FF 00 97 90 9B BE CC DF A2 A8 DF 6B 5A 76 98 B1 35 E5 D2 45 E7 0C C6 30 58 B8 F6 03 93 D4 55 55 F1 56 8E CB 21 FB 44 8A 23 88 CA 7C CB 79 13 2A 08 1C 6E 51 9E 58 0C 0F 51 5C CA 8D 49 2B A8 BF B8 D1 CA 2B 76 6C 51 58 47 C5 0A 0A 96 D1 75 65 8C BA AF 98 D6 E1 46 58 80 38 2D 9E A4 76 A8 A4 F1 45 CB FD AD EC 34 77 B9 82 D2 46 8E 49 9E E5 23 1B 97 A8 DB CB 7D 38 E7 8A A5 87 A8 FA 7E 28 5E D2 27 45 45 47 0B BC 90 46 F2 46 62 76 50 59 09 CE D3 8E 46 7D AA 4A C4 B0 A2 8A 29 01 15 C5 C4 36 90 34 F7 12 AC 51 20 CB 3B 9C 01 59 1A 91 B3 D4 AD 3E D9 7B 6D 8B 1B 43 E7 87 96 32 1D 8A F3 95 1D 40 FE 7F 4A D2 BF D3 AD 75 3B 71 6F 77 19 92 30 C1 C0 0E CB C8 E8 72 08 35 53 FE 11 8D 14 FD EB 14 93 FE BA 33 3F F3 35 D1 4A 54 E3 AB 6E FF 00 D7 99 12 52 7A 74 32 8D FF 00 F6 CD C1 B1 D4 52 C6 EB 49 BD 83 CE 8E 58 A4 2A 62 00 F0 1B 3D F3 D0 8C 74 3E 95 9D 71 AC DC 78 6A 17 B3 6D 45 75 3D 3D C1 54 9A 2B 84 FB 5D B8 3C 63 04 FC E7 D0 FF 00 FA AB AD 7D 13 4A 94 C6 64 D3 AD 5C C6 81 13 74 4A 76 A8 E8 07 1D 2A 58 B4 FB 18 08 30 D9 C1 1E 3F B9 12 8F E9 5B AC 45 25 A7 2D D7 6F D7 D4 87 09 3E BA 99 D6 B6 F3 EB 16 BA 94 3A 95 9C 90 59 DD 95 F2 12 57 53 22 A1 8D 41 E0 64 2E 18 12 39 CE 49 E0 63 9B 3A 58 BF 96 18 BF B4 E2 D9 35 B6 50 B6 50 89 98 71 E6 80 07 CA 08 E8 38 FB CC 08 E0 13 A3 45 72 CA AD D5 AD FD 6D F8 F5 34 51 B1 CB B4 7A 89 D2 3E CF 16 8D 7B 1D CA DD 35 DC 6E CD 03 2A 39 94 C9 B7 89 41 23 E6 2A 4F 19 04 FA E2 B4 2C 1A 58 35 B9 A3 9D 04 6F 7B 6D 1D C3 22 9D C0 48 BF 24 98 3D F8 F2 C5 6C 56 36 A5 71 24 3A E5 A3 26 9D 77 72 63 85 F6 B4 0A 30 4B 10 36 96 24 28 1F 2E 79 3E 95 B2 A8 EA 5E 36 5A DF FC FA BE E8 97 1E 5D 48 61 D3 20 D6 A6 BB 7B F9 EE 9F CA B8 78 8D A8 9D 92 34 00 E5 78 5C 67 2A 55 B9 CF 5A 97 4A B0 87 4D D4 6F B4 DB 78 F6 D9 B4 71 CC 91 F5 08 5B 72 B0 FA 1D 80 FE 26 A3 B3 D3 EF E5 D7 46 AA F1 36 9F 1C 8B 99 AD C5 CF 99 E7 1D BB 46 E5 03 68 20 63 90 C7 A0 15 6E 6D 0E 2B 8B D9 AE 24 BC BC 0B 36 37 43 1C C6 34 E0 01 D5 70 DD BA 67 1D 69 CE 69 5E 2E 5A 5B EE 7F 90 92 EB 63 9F 8E DA 57 41 69 6D 1D CD BE B7 A4 44 56 DE 46 C8 8E EA 14 6C 2A 93 9C 30 61 B7 39 E4 13 53 DD DF 0B A7 B5 D4 D2 DD 6E EC 35 5B 6F B2 98 64 5D DE 54 B9 25 41 F4 05 B2 AD E8 42 D7 43 65 A5 D8 69 BB BE C7 69 14 25 F1 BD 95 7E 67 C7 4C 9E A7 F1 AC C4 B7 D4 74 7D 4E EB EC 36 02 EE CA ED 84 C1 44 CA 9E 4C A7 87 EB D8 F0 78 EF 9A D1 56 8C DB B7 E3 A7 AF A6 BA AD 7B F7 27 91 A4 43 7A E2 6B 69 B4 8D 33 CC 5B DD 21 22 9A DC 13 81 36 D1 C2 8E 79 07 05 4F A1 35 7E C4 34 EF 1C AD 0B 42 F7 04 DD 4C 8D C1 1C 05 45 61 EB 80 3F 14 A8 6F 34 8B C5 6B 2B DB 03 08 BF B6 67 DE 25 76 58 E5 59 39 75 24 02 7E F6 08 E3 B5 68 D8 C5 72 A8 D2 DE F9 5F 68 93 1B 84 44 95 50 3A 00 48 04 F7 3C FA 9A CA 73 8F 27 BB FF 00 07 FE 1B A9 49 3B EA 5A A2 8A 2B 90 D4 28 A2 8A 00 28 A2 8A 00 28 A2 8A 00 28 A2 8A 00 28 A2 8A 00 28 A2 8A 00 28 A2 8A 00 28 A2 8A 00 28 A2 8A 00 28 A2 8A 00 28 A2 8A 00 28 A2 8A 00 28 A2 8A 00 28 A2 8A 00 28 A2 8A 00 28 A2 8A 00 28 A2 8A 00 28 A2 8A 00 28 A2 8A 00 FF D9,\n            0x00000165(357)=00 00 00 01 0A 70 69 63 5F 72 65 61 73 6F 6E 00 00 00 7F 51 51 E5 AE 89 E5 85 A8 E4 B8 AD E5 BF 83 E6 B8 A9 E9 A6 A8 E6 8F 90 E7 A4 BA EF BC 9A E5 BD 93 E5 89 8D E7 BD 91 E7 BB 9C E7 8E AF E5 A2 83 E6 9C 89 E5 8D B1 E5 8F 8A 51 51 E5 AE 89 E5 85 A8 E7 9A 84 E8 A1 8C E4 B8 BA EF BC 8C E4 B8 BA E4 BA 86 E4 BD A0 E7 9A 84 E5 B8 90 E5 8F B7 E5 AE 89 E5 85 A8 EF BC 8C E8 AF B7 E4 BD A0 E5 A1 AB E5 86 99 E9 AA 8C E8 AF 81 E7 A0 81 E3 80 82\n            }\n\n             */\n            // val ret = tlvMap[0x104]?.let { println(it.toUHexString()) }\n            bot.client.t104 = tlvMap.getOrFail(0x104)\n            tlvMap[0x192]?.let {\n                return LoginPacketResponse.Captcha.Slider(bot, it.decodeToString())\n            }\n            tlvMap[0x165]?.let {\n                // if (question[18].toInt() == 0x36) {\n                // 图片验证\n                // DebugLogger.debug(\"是一个图片验证码\")\n                return tlvMap.getOrFail(0x105).toReadPacket().withUse {\n                    val imageData = this\n                    val signInfoLength = imageData.readShort()\n                    imageData.discardExact(2)//image Length\n                    val sign = imageData.readBytes(signInfoLength.toInt())\n\n                    LoginPacketResponse.Captcha.Picture(\n                        bot,\n                        data = imageData.readBytes(), sign = sign\n                    )\n                }\n                // } else error(\"UNKNOWN CAPTCHA QUESTION: ${question.toUHexString()}, tlvMap=\" + tlvMap.contentToString())\n            }\n\n            error(\"UNKNOWN CAPTCHA, tlvMap=\" + tlvMap.structureToString())\n        }\n\n        fun onLoginSuccess(subCommand: Int, tlvMap: TlvMap, bot: QQAndroidBot): LoginPacketResponse.Success {\n            val client = bot.client\n            //println(\"TLV KEYS: \" + tlvMap.keys.joinToString { it.contentToString() })\n\n            tlvMap[0x150]?.let { client.analysisTlv150(it) }\n            //  tlvMap[0x305]?.let { println(\"TLV 0x305=${it.toUHexString()}\") }\n            tlvMap[0x161]?.let { client.analysisTlv161(it) }\n            tlvMap[0x119]?.let { t119Data ->\n                TEA.decrypt(\n                    t119Data, if (subCommand == 11) {\n                        client.wLoginSigInfo.d2Key.md5()\n                    } else {\n                        client.tgtgtKey\n                    }\n                ).read {\n                    discardExact(2) // always discarded.  00 1C\n                    // 00 1C\n                    // 01 08 00 10 A1 73 76 98 64 E0 38 C6 C8 18 73 FA D3 85 DA D6 01 6A 00 30 1D 99 4A 28 7E B3 B8 AC 74 B9 C4 BB 6D BB 41 72 F7 5C 9F 0F 79 8A 82 4F 1F 69 34 6D 10 D6 BB E8 A3 4A 2B 5D F1 C7 05 3C F8 72 EF CF 67 E4 3C 94 01 06 00 78 B4 ED 9F 44 ED 10 18 A8 85 0A 8A 85 79 45 47 7F 25 AA EE 2C 53 83 80 0A B3 B0 47 3E 95 51 A4 AE 3E CA A0 1D B4 91 F7 BB 2E 94 76 A8 C8 97 02 C4 5B 15 02 B7 03 9A FC C2 58 6D 17 92 46 AE EB 2F 6F 65 B8 69 6C D6 9D AC 18 6F 07 53 AC FE FA BC BD CE 57 13 10 2D 5A C6 50 AA C2 AE 18 D4 FD CD F2 E0 D1 25 29 56 21 35 8F 01 9D D6 69 44 8F 06 D0 23 26 D3 0E E6 E6 B7 01 0C 00 10 73 32 61 4E 2C 72 35 58 68 28 47 3E 2B 6E 52 62 01 0A 00 48 A4 DA 48 FB B4 8D DA 7B 86 D7 A7 FE 01 1B 70 6F 54 F8 55 38 B0 AD 1B 0C 0B B9 F6 94 24 F8 9E 30 32 22 99 0C 22 CD 44 B8 B0 8A A8 65 E1 B8 F0 49 EF E1 23 D7 0D A3 F1 BB 52 B7 4B AF BD 50 EA BF 15 02 78 2B 8B 10 FB 15 01 0D 00 10 29 75 38 72 21 5D 3F 24 37 46 67 79 2B 65 6D 34 01 14 00 60 00 01 5E 19 65 8C 00 58 93 DD 4D 2C 2D 01 44 99 62 B8 7A EF 04 C5 71 0B F1 BE 4C F4 21 F2 97 B0 14 67 0E 14 9F D8 A2 0B 93 40 90 80 F3 59 7A 69 45 D7 D4 53 4C 08 3A 56 1D C9 95 36 2C 7C 5E EE 36 47 5F AE 26 72 76 FD FD 69 E6 0C 2D 3A E8 CF D4 8D 76 C9 17 C3 E3 CD 21 AB 04 6B 70 C5 EC EC 01 0E 00 10 56 48 3E 29 3A 5A 21 74 55 6A 2C 72 58 73 79 71 01 03 00 30 9B A6 5D 85 5C 40 7C 28 E7 05 A9 25 CA F5 FC C0 51 40 85 F3 2F D2 37 F9 09 A6 E6 56 7F 7A 2E 7D 9F B9 1C 00 65 55 D2 A9 60 03 77 AB 6A F5 3F CE 01 33 00 30 F4 3A A7 08 E2 04 FA C8 9D 54 49 DE 63 EA F0 A5 1C C4 03 57 51 B6 AE 0B 55 41 F8 AB 22 F1 DC A3 B0 73 08 55 14 02 BF FF 55 87 42 4C 23 70 91 6A 01 34 00 10 61 C7 02 3F 1D BE A6 27 2F 24 D4 92 95 68 71 EF 05 28 00 1A 7B 22 51 49 4D 5F 69 6E 76 69 74 61 74 69 6F 6E 5F 62 69 74 22 3A 22 31 22 7D 03 22 00 10 CE 1E 2E DC 69 24 4F 9B FF 2F 52 D8 8F 69 DD 40 01 1D 00 76 5F 5E 10 E2 34 36 79 27 23 53 4D 65 6B 6A 33 6D 7D 4E 3C 5F 00 60 00 01 5E 19 65 8C 00 58 67 00 9C 02 E4 BC DB A3 93 98 A1 ED 4C 91 08 6F 0C 06 E0 12 6A DC 14 5B 4D 20 7C 82 83 AE 94 53 A2 4A A0 35 FF 59 9D F3 EF 82 42 61 67 2A 31 E7 87 7E 74 E7 A3 E7 5C A8 3C 87 CF 40 6A 9F E5 F7 20 4E 56 C6 4F 1C 98 3A 8B A9 4F 1D 10 35 C2 3B A1 08 7A 89 0B 25 0C 63 01 1F 00 0A 00 01 51 80 00 00 03 84 00 00 01 38 00 0E 00 00 00 01 01 0A 00 27 8D 00 00 00 00 00 01 1A 00 13 02 5B 06 01 0E 73 74 65 61 6D 63 68 69 6E 61 2E 66 75 6E 05 22 00 14 00 00 00 00 76 E4 B8 DD AB 53 02 9F 5E 19 65 8C 20 02 ED BD 05 37 00 17 01 01 00 00 00 00 76 E4 B8 DD 04 AB 53 02 9F 5E 19 65 8C 20 02 ED BD 01 20 00 0A 4D 39 50 57 50 6E 4C 31 65 4F 01 6D 00 2C 31 7A 50 7A 63 72 70 4D 30 43 6E 31 37 4C 32 32 6E 77 2D 36 7A 4E 71 48 48 59 41 35 48 71 77 41 37 6D 76 4F 63 2D 4A 56 77 47 51 5F 05 12 03 5D 00 0E 00 0A 74 65 6E 70 61 79 2E 63 6F 6D 00 2C 6E 4A 72 55 55 74 63 2A 34 7A 32 76 31 66 6A 75 77 6F 6A 65 73 72 76 4F 68 70 66 45 76 4A 75 55 4B 6D 34 43 2D 76 74 38 4D 77 38 5F 00 00 00 11 6F 70 65 6E 6D 6F 62 69 6C 65 2E 71 71 2E 63 6F 6D 00 2C 78 59 35 65 62 4D 74 48 44 6D 30 53 6F 68 56 71 68 33 43 79 79 34 6F 63 65 4A 46 6A 51 58 65 68 30 44 61 75 55 30 6C 78 65 52 6B 5F 00 00 00 0B 64 6F 63 73 2E 71 71 2E 63 6F 6D 00 2C 64 6A 62 79 47 57 45 4F 34 58 34 6A 36 4A 73 48 45 65 6B 73 69 74 72 78 79 62 57 69 77 49 68 46 45 70 72 4A 59 4F 2D 6B 36 47 6F 5F 00 00 00 0E 63 6F 6E 6E 65 63 74 2E 71 71 2E 63 6F 6D 00 2C 64 4C 31 41 79 32 41 31 74 33 58 36 58 58 2A 74 33 64 4E 70 2A 31 61 2D 50 7A 65 57 67 48 70 2D 65 47 78 6B 59 74 71 62 69 6C 55 5F 00 00 00 0C 71 7A 6F 6E 65 2E 71 71 2E 63 6F 6D 00 2C 75 6A 55 5A 4F 6A 4F 48 52 61 75 6B 32 55 50 38 77 33 34 68 36 69 46 38 2A 77 4E 50 35 2D 66 54 75 37 67 39 56 67 44 57 2A 6B 6F 5F 00 00 00 0A 76 69 70 2E 71 71 2E 63 6F 6D 00 2C 37 47 31 44 6F 54 2D 4D 57 50 63 2D 62 43 46 68 63 62 32 56 38 6E 77 4A 75 41 51 63 54 39 77 45 49 62 57 43 4A 4B 44 4D 6C 6D 34 5F 00 00 00 0A 71 75 6E 2E 71 71 2E 63 6F 6D 00 2C 7A 73 70 5A 56 43 59 45 7A 35 2A 4F 6B 4E 68 6E 74 79 61 69 6E 6F 68 4D 32 6B 41 6C 2A 74 31 63 7A 48 57 77 30 41 6A 4B 50 4B 6B 5F 00 00 00 0B 67 61 6D 65 2E 71 71 2E 63 6F 6D 00 2C 32 6F 2D 51 53 36 65 43 70 37 6A 43 4E 34 6A 74 6E 47 4F 4B 33 67 73 32 63 4A 6F 56 71 58 65 44 48 61 55 39 65 34 2D 32 34 64 30 5F 00 00 00 0C 71 71 77 65 62 2E 71 71 2E 63 6F 6D 00 2C 63 54 4D 79 64 51 43 35 50 74 43 45 51 72 6F 33 53 54 41 66 7A 56 2D 44 76 46 56 35 58 6D 56 6B 49 31 68 4C 55 48 4E 65 76 56 38 5F 00 00 00 0D 6F 66 66 69 63 65 2E 71 71 2E 63 6F 6D 00 2C 6F 73 72 54 36 32 69 37 66 76 6D 49 50 64 6F 58 4B 48 74 38 58 52 59 56 77 72 7A 6E 69 31 58 7A 57 4C 77 2A 71 36 33 44 74 73 6F 5F 00 00 00 09 74 69 2E 71 71 2E 63 6F 6D 00 2C 41 61 77 4D 78 4D 32 79 58 51 47 75 72 75 55 6C 66 53 58 79 5A 57 48 53 78 52 57 58 50 74 6B 6B 4F 78 6F 66 4A 59 47 6C 71 68 34 5F 00 00 00 0B 6D 61 69 6C 2E 71 71 2E 63 6F 6D 00 2C 67 72 57 68 58 77 34 4C 6E 4B 49 4F 67 63 78 45 71 70 33 61 45 67 37 38 46 7A 77 4E 6D 4B 48 56 6E 6F 50 4C 4F 32 6D 57 6D 6E 38 5F 00 00 00 09 71 7A 6F 6E 65 2E 63 6F 6D 00 2C 72 61 47 79 51 35 54 72 4D 55 7A 6E 74 31 4E 52 44 2D 50 72 74 72 41 55 43 35 6A 61 2D 49 47 2D 73 77 4C 6D 49 51 51 41 44 4C 41 5F 00 00 00 0A 6D 6D 61 2E 71 71 2E 63 6F 6D 00 2C 39 73 2D 4F 51 30 67 76 39 42 6A 37 58 71 52 49 4E 30 35 46 32 64 4D 47 67 47 43 58 57 4A 62 68 63 30 38 63 7A 4B 52 76 6B 78 6B 5F 00 00 03 05 00 10 77 75 6E 54 5F 7E 66 7A 72 40 3C 6E 35 50 53 46 01 43 00 40 3A AE 30 87 81 3D EE BA 31 9C EA 9D 0D D4 73 B1 81 12 E0 94 71 73 7A B0 47 3D 09 47 E5 1B E1 E2 06 1A CB A4 E3 71 9E A6 EA 2A 73 5C C8 D3 B1 2A B1 C7 DA 04 A6 6D 12 26 DF 6B 8B EC C7 12 F8 E1 01 18 00 05 00 00 00 01 00 01 63 00 10 67 6B 60 23 24 6A 55 39 4E 58 24 5E 39 2B 7A 69 01 38 00 5E 00 00 00 09 01 06 00 27 8D 00 00 00 00 00 01 0A 00 24 EA 00 00 00 00 00 01 1C 00 1A 5E 00 00 00 00 00 01 02 00 01 51 80 00 00 00 00 01 03 00 00 1C 20 00 00 00 00 01 20 00 01 51 80 00 00 00 00 01 36 00 1B AF 80 00 00 00 00 01 43 00 1B AF 80 00 00 00 00 01 64 00 1B AF 80 00 00 00 00 01 30 00 0E 00 00 5E 19 65 8C 9F 02 53 AB 00 00 00 00\n                    val tlvMap119 = this._readTLVMap()\n\n                    if (SHOW_TLV_MAP_ON_LOGIN_SUCCESS) {\n                        tlvMap119.smartToString().printStructure(\"TlvMap119\")\n                    }\n\n                    tlvMap119[0x10c]?.read {\n                        client.tgtgtKey = readBytes(16)\n                    }\n\n                    // ???\n                    tlvMap119[0x1c]?.read {\n                        val bytes = readBytes()\n                        bot.network.logger.debug(\"onLoginSuccess, tlvMap119[0x1c]: \" + bytes.toUHexString())\n                        bot.network.logger.debug(\"onLoginSuccess, tlvMap119[0x1c]: \" + bytes.decodeToString())\n                    }\n\n                    tlvMap119[0x130]?.let { client.analysisTlv130(it) }\n                    tlvMap119[0x113]?.let { client.analysisTlv113(it) }\n\n                    // t528, t530 QQ 中最终保存到 oicq.wlogin_sdk.request.WUserSigInfo#loginResultTLVMap\n                    tlvMap119[0x528]?.let { client.t528 = it }\n                    tlvMap119[0x530]?.let { client.t530 = it }\n\n//                    tlvMap119[0x118]?.let { client.mainDisplayName = it }\n                    tlvMap119[0x108]?.let { client.ksid = it }\n                    tlvMap119[0x11a]?.read {\n                        readShort().toInt() // faceId\n                        readByte().toInt() // age\n                        readByte().toInt() // gender\n                        val nickLength = readByte().toInt()\n                        bot.nick = readString(nickLength)\n                    }\n                    var openId: ByteArray? = null\n                    var openKey: ByteArray? = null\n                    tlvMap119[0x125]?.read {\n                        openId = readUShortLVByteArray()\n                        openKey = readUShortLVByteArray()\n                    }\n\n                    /*\n                    util.LOGI(\"tgt len:\" + util.buf_len(t10a.get_body_data()) +\n                    \" tgt_key len:\" + util.buf_len(t10d.get_body_data()) +\n                    \" st len:\" + util.buf_len(t114.get_body_data()) +\n                    \" st_key len:\" + util.buf_len(t10e.get_body_data()) +\n                    \" stwx_web len:\" + util.buf_len(t103Data) +\n                    \" lskey len:\" + util.buf_len(t11cData) +\n                    \" skey len:\" + util.buf_len(t120Data) +\n                    \" sig64 len:\" + util.buf_len(t121Data) +\n                    \" openid len:\" + util.buf_len(openId) +\n                    \" openkey len:\" + util.buf_len(openKey) +\n                    \" pwdflag: \" + t186.get_data_len() + t186.getPwdflag(), \"\" + this.field_61436.uin);\n\n                     */\n                    tlvMap119[0x186]?.let { client.analysisTlv186(it) }\n                    tlvMap119[0x537]?.let { client.analysisTlv537(it) }\n                    tlvMap119[0x169]?.let { t169 ->\n                        client.wFastLoginInfo = WFastLoginInfo(\n                            outA1 = client.runCatching {\n                                parseWFastLoginInfoDataOutA1(t169)\n                            }.getOrElse { ByteReadPacket(byteArrayOf()) }\n                        )\n                    }\n\n                    tlvMap119[0x167]?.let {\n                        val imgType = byteArrayOf(readByte())\n                        val imgFormat = byteArrayOf(readByte())\n                        val imgUrl = readUShortLVByteArray()\n                        // dont move into constructor, keep order\n                        client.reserveUinInfo = ReserveUinInfo(imgType, imgFormat, imgUrl)\n                    }\n//                    client.qrPushSig = tlvMap119[0x317] ?: byteArrayOf()\n\n\n                    var payToken: ByteArray? = null\n                    tlvMap119[0x199]?.read {\n                        openId = readUShortLVByteArray()\n                        payToken = readUShortLVByteArray()\n                    }\n\n                    var pf: ByteArray? = null\n                    var pfKey: ByteArray? = null\n                    tlvMap119[0x200]?.let {\n                        pf = readUShortLVByteArray()\n                        pfKey = readUShortLVByteArray()\n                    }\n\n\n                    // sigMap??? =0x21410e0 // from qq\n\n                    val creationTime = currentTimeSeconds()\n                    val expireTime = creationTime + 21600\n\n                    val changeTokenTimeMap = tlvMap119[0x138]?.read {\n                        val tlvMap138 = mutableMapOf<Int, Long>()\n                        val count = readInt()\n                        repeat(count) {\n                            val key = readShort().toInt()\n                            val value = readInt().toLong()\n                            tlvMap138[key] = value\n                        }\n                        tlvMap138\n                    } ?: emptyMap()\n\n                    if (SHOW_TLV_MAP_ON_LOGIN_SUCCESS) {\n                        changeTokenTimeMap.structureToString().printStructure(\"tokenChangeTime\")\n                    }\n\n                    val outPSKeyMap: PSKeyMap?\n                    val outPt4TokenMap: Pt4TokenMap?\n                    if (tlvMap119[0x512] != null) {\n                        outPSKeyMap = mutableMapOf()\n                        outPt4TokenMap = mutableMapOf()\n                        parsePSKeyMapAndPt4TokenMap(\n                            tlvMap119[0x512]!!,\n                            creationTime,\n                            expireTime,\n                            outPSKeyMap,\n                            outPt4TokenMap\n                        )\n                    } else {\n                        outPSKeyMap = null\n                        outPt4TokenMap = null\n                    }\n\n                    if (client.wLoginSigInfoInitialized) {\n                        client.wLoginSigInfo.apply {\n                            superKey = tlvMap119.getOrElse(0x16d) { superKey }\n                            d2 = KeyWithExpiry(\n                                tlvMap119.getOrElse(0x143) { d2.data },\n                                creationTime,\n                                creationTime + changeTokenTimeMap.getOrElse(0x143) { 1728000L }\n                            )\n                            d2Key = tlvMap119.getOrElse(0x305) { d2Key }\n                            tgt = tlvMap119.getOrElse(0x10a) { tgt }\n                            tgtKey = tlvMap119.getOrElse(0x10d) { tgtKey }\n                            a2ExpiryTime = creationTime + changeTokenTimeMap.getOrElse(0x10a) { 2160000L }\n                            userStWebSig = KeyWithExpiry(\n                                tlvMap119.getOrElse(0x103) { userStWebSig.data },\n                                creationTime,\n                                creationTime + changeTokenTimeMap.getOrElse(0x103) { 6000L }\n                            )\n                            userStKey = tlvMap119.getOrElse(0x10e) { userStKey }\n                            userStSig =\n                                KeyWithCreationTime((tlvMap119.getOrElse(0x114) { userStSig.data }), creationTime)\n                            appPri = tlvMap119[0x11f]?.let {\n                                it.read {\n                                    //change interval (int time)\n                                    discardExact(4)\n                                    readInt().toUInt().toLong()\n                                }\n                            }\n                                ?: appPri\n                            sKey = KeyWithExpiry(\n                                tlvMap119.getOrEmpty(0x120),\n                                creationTime,\n                                creationTime + changeTokenTimeMap.getOrElse(0x120) { 86400L }\n                            )\n                            wtSessionTicket = KeyWithCreationTime(\n                                tlvMap119.getOrElse(\n                                    0x133\n                                ) {\n                                    client.wLoginSigInfo.wtSessionTicket.data\n                                }, creationTime\n                            )\n\n                            wtSessionTicketKey = tlvMap119.getOrElse(0x134) { client.wLoginSigInfo.wtSessionTicketKey }\n                            deviceToken = tlvMap119.getOrElse(0x322) { deviceToken }\n                            encryptedDownloadSession = tlvMap119[0x11d]?.let {\n                                client.analysisTlv11d(it)\n                            } ?: encryptedDownloadSession\n                            encryptA1 = tlvMap119.getOrElse(0x106) { encryptA1 }\n                            noPicSig = tlvMap119.getOrElse(0x16a) { noPicSig }\n                            psKeyMap.putAll(outPSKeyMap.orEmpty().toMutableMap())\n                            pt4TokenMap.putAll(outPt4TokenMap.orEmpty().toMutableMap())\n                        }\n                    } else {\n                        var a1: ByteArray? = tlvMap119.getOrFail(0x106)\n                        var noPicSig: ByteArray? = tlvMap119[0x16a]\n                        tlvMap119[0x531]?.let {\n                            analysisTlv0x531(it) { arg1, arg2 ->\n                                a1 = arg1\n                                noPicSig = arg2\n                            }\n                        }\n                        client.wLoginSigInfo = WLoginSigInfo(\n                            uin = client.uin,\n                            encryptA1 = a1,\n                            noPicSig = noPicSig,\n                            simpleInfo = WLoginSimpleInfo(\n                                uin = client.uin,\n                                imgType = client.reserveUinInfo?.imgType ?: byteArrayOf(),\n                                imgFormat = client.reserveUinInfo?.imgFormat ?: byteArrayOf(),\n                                imgUrl = client.reserveUinInfo?.imgUrl ?: byteArrayOf(),\n                                mainDisplayName = tlvMap119[0x118] ?: error(\"Cannot find tlv 0x118\")\n                            ), // defaults {}, from asyncContext._G\n                            appPri = tlvMap119[0x11f]?.let {\n                                it.read {\n                                    //change interval (int time)\n                                    discardExact(4)\n                                    readInt().toUInt().toLong()\n                                }\n                            }\n                                ?: 4294967295L, // defaults {}, from asyncContext._G\n                            a2ExpiryTime = creationTime + changeTokenTimeMap.getOrElse(\n                                0x10a\n                            ) {\n                                2160000L\n                            }, // or from asyncContext._t403.get_body_data()\n                            loginBitmap = 0,\n                            tgt = tlvMap119.getOrFail(0x10a),\n                            a2CreationTime = creationTime,\n                            tgtKey = tlvMap119.getOrEmpty(0x10d), // from asyncContext._login_bitmap\n                            userStSig = KeyWithCreationTime((tlvMap119.getOrEmpty(0x114)), creationTime),\n                            userStKey = tlvMap119.getOrEmpty(0x10e),\n                            userStWebSig = KeyWithExpiry(\n                                tlvMap119.getOrEmpty(0x103),\n                                creationTime,\n                                creationTime + changeTokenTimeMap.getOrElse(0x103) { 6000L }\n                            ),\n                            userA5 = KeyWithCreationTime(tlvMap119.getOrEmpty(0x10b), creationTime),\n                            userA8 = KeyWithExpiry(\n                                tlvMap119.getOrEmpty(0x102),\n                                creationTime,\n                                creationTime + changeTokenTimeMap.getOrElse(0x102) { 72000L }\n                            ),\n                            lsKey = KeyWithExpiry(\n                                tlvMap119.getOrEmpty(0x11c),\n                                creationTime,\n                                creationTime + changeTokenTimeMap.getOrElse(0x11c) { 1641600L }\n                            ),\n                            sKey = KeyWithExpiry(\n                                tlvMap119.getOrEmpty(0x120),\n                                creationTime,\n                                creationTime + changeTokenTimeMap.getOrElse(0x120) { 86400L }\n                            ),\n                            userSig64 = KeyWithCreationTime(tlvMap119.getOrEmpty(0x121), creationTime),\n                            openId = openId.orEmpty(),\n                            openKey = KeyWithCreationTime(openKey.orEmpty(), creationTime),\n                            vKey = KeyWithExpiry(\n                                tlvMap119.getOrEmpty(0x136),\n                                creationTime,\n                                creationTime + changeTokenTimeMap.getOrElse(0x136) { 1728000L }\n                            ),\n                            accessToken = KeyWithCreationTime(tlvMap119.getOrEmpty(0x136), creationTime),\n                            d2 = KeyWithExpiry(\n                                tlvMap119.getOrFail(0x143),\n                                creationTime,\n                                creationTime + changeTokenTimeMap.getOrElse(0x143) { 1728000L }\n                            ),\n                            d2Key = tlvMap119.getOrEmpty(0x305),\n                            sid = KeyWithExpiry(\n                                tlvMap119.getOrEmpty(0x164),\n                                creationTime,\n                                creationTime + changeTokenTimeMap.getOrElse(0x164) { 1728000L }\n                            ),\n                            aqSig = KeyWithCreationTime(tlvMap119.getOrEmpty(0x171), creationTime),\n                            psKeyMap = outPSKeyMap.orEmpty().toMutableMap(),\n                            pt4TokenMap = outPt4TokenMap.orEmpty().toMutableMap(),\n                            superKey = tlvMap119.getOrEmpty(0x16d),\n                            payToken = payToken.orEmpty(),\n                            pf = pf.orEmpty(),\n                            pfKey = pfKey.orEmpty(),\n                            da2 = tlvMap119.getOrEmpty(0x203),\n                            wtSessionTicket = KeyWithCreationTime(tlvMap119.getOrEmpty(0x133), creationTime),\n                            wtSessionTicketKey = tlvMap119.getOrEmpty(0x134),\n                            deviceToken = tlvMap119.getOrEmpty(0x322),\n                            encryptedDownloadSession = tlvMap119[0x11d]?.let {\n                                client.analysisTlv11d(it)\n                            },\n                        )\n                    }\n                    //bot.network.logger.error(client.wLoginSigInfo.psKeyMap[\"qun.qq.com\"]?.data?.encodeToString())\n                }\n            }\n\n            return LoginPacketResponse.Success(bot)\n        }\n\n    }\n\n    internal object ExchangeEmp : OutgoingPacketFactory<Login.LoginPacketResponse>(\"wtlogin.exchange_emp\"), WtLoginExt {\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Login.LoginPacketResponse {\n            return Login.run {\n                decode(bot)\n            }\n        }\n\n    }\n\n    internal object TransEmp : OutgoingPacketFactory<TransEmp.Response>(\"wtlogin.trans_emp\") {\n\n        fun FetchQRCode(\n            client: QQAndroidClient,\n            size: Int,\n            margin: Int,\n            ecLevel: Int\n        ) = TransEmp.buildLoginOutgoingPacket(client, encryptMethod = PacketEncryptType.Empty, uin = \"\") { sequenceId ->\n            writeSsoPacket(client, client.subAppId, TransEmp.commandName, sequenceId = sequenceId) {\n                writeOicqRequestPacket(client, uin = 0, commandId = 0x812) {\n                    val code2dPacket = buildCode2dPacket(0, 0, 0x31) {\n                        writeShort(0)\n                        writeInt(16)\n                        writeLong(0)\n                        writeByte(8)\n                        writeShortLVPacket { }\n\n                        _writeTlvMap {\n                            t16(\n                                client.ssoVersion,\n                                client.subAppId,\n                                client.device.guid,\n                                client.apkId,\n                                client.apkVersionName,\n                                client.apkSignatureMd5\n                            )\n                            t1b(\n                                size = size,\n                                margin = margin,\n                                ecLevel = ecLevel\n                            )\n                            t1d(client.miscBitMap)\n\n                            val protocol = client.bot.configuration.protocol\n                            when (protocol) {\n                                BotConfiguration.MiraiProtocol.MACOS -> t1f(\n                                    false,\n                                    \"Mac OSX\".toByteArray(),\n                                    \"10\".toByteArray(),\n                                    \"mac carrier\".toByteArray(),\n                                    client.device.apn,\n                                    2\n                                )\n\n                                BotConfiguration.MiraiProtocol.ANDROID_WATCH -> t1f(\n                                    false,\n                                    client.device.osType,\n                                    \"7.1.2\".toByteArray(),\n                                    \"China Mobile GSM\".toByteArray(),\n                                    client.device.apn,\n                                    2\n                                )\n\n                                else -> error(\"protocol $protocol doesn't support qrcode login.\")\n                            }\n\n                            t33(client.device.guid)\n                            t35(\n                                when (protocol) {\n                                    BotConfiguration.MiraiProtocol.MACOS -> 5\n                                    BotConfiguration.MiraiProtocol.ANDROID_WATCH -> 8\n                                    else -> error(\"assertion\")\n                                }\n                            )\n                        }\n                    }\n                    writeByte(0)\n                    writeShort(code2dPacket.remaining.toShort())\n                    writeInt(0x10) // appId, const 16\n                    writeInt(0x72) // 0x90\n                    writeFully(ByteArray(3) { 0x00 })\n                    writePacket(code2dPacket)\n                    code2dPacket.release()\n                }\n            }\n        }\n\n        fun QueryQRCodeStatus(\n            client: QQAndroidClient,\n            sig: ByteArray,\n        ) = TransEmp.buildLoginOutgoingPacket(client, encryptMethod = PacketEncryptType.Empty, uin = \"\") { sequenceId ->\n            writeSsoPacket(client, client.subAppId, TransEmp.commandName, sequenceId = sequenceId) {\n                writeOicqRequestPacket(client, uin = 0, commandId = 0x812) {\n                    val code2dPacket = buildCode2dPacket(1, 0, 0x12) {\n                        writeShort(5)\n                        writeByte(1)\n                        writeInt(8)\n                        writeInt(16)\n                        writeShortLVByteArray(sig)\n                        writeLong(0)\n                        writeByte(8)\n                        writeShortLVPacket { }\n                        writeShort(0)\n                    }\n                    writeByte(0)\n                    writeShort(code2dPacket.remaining.toShort())\n                    writeInt(0x10) // appId, const 16\n                    writeInt(0x72) // 0x90\n                    writeFully(ByteArray(3) { 0x00 })\n                    writePacket(code2dPacket)\n                    code2dPacket.release()\n                }\n            }\n        }\n\n        private fun buildCode2dPacket(\n            sequence: Int, uin: Long, command: Short, body: BytePacketBuilder.() -> Unit\n        ) = buildPacket {\n            writeInt(currentTimeSeconds().toInt())\n            writeByte(2)\n            val bodyPacket = buildPacket(body)\n            writeShort((43 + bodyPacket.remaining + 1).toUShort().toShort())\n            writeShort(command)\n            writeFully(ByteArray(21) { 0 })\n            writeByte(3)\n            writeShort(0)\n            writeShort(50)\n            writeInt(sequence)\n            writeLong(uin)\n            writePacket(bodyPacket)\n            bodyPacket.release()\n            writeByte(3)\n        }\n\n        sealed class Response() : Packet {\n            class FetchQRCode(val imageData: ByteArray, val sig: ByteArray) : Response() {\n                override fun toString(): String {\n                    return \"WtLogin.TransEmp.Response.FetchQRCode\" +\n                            \"(imageData=${imageData.toUHexString()}, sig=${sig.toUHexString()})\"\n                }\n            }\n\n            class QRCodeStatus(val state: State) : Response() {\n                override fun toString(): String {\n                    return \"WtLogin.TransEmp.Response.QRCodeStatus(state=$state)\"\n                }\n\n                enum class State { WAITING_FOR_SCAN, WAITING_FOR_CONFIRM, CANCELLED, TIMEOUT }\n            }\n\n            class QRCodeConfirmed(val data: QRCodeLoginData) : Response() {\n                override fun toString(): String {\n                    return \"WtLogin.TransEmp.Response.QRCodeConfirmed(data=$data)\"\n                }\n            }\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n            check(remaining >= 48) { \"remaining payload is too short, current is $remaining.\" }\n\n            discardExact(5)\n            readByte().toUByte()\n            readShort().toUShort()\n            val command = readShort().toUShort().toInt()\n            discardExact(21)\n            readByte().toUByte()\n            readShort().toUShort()\n            readShort().toUShort()\n            readInt()\n            readLong()\n\n            return when (command) {\n                0x31 -> { // qr code data\n                    readShort()\n                    readInt()\n\n                    val code = readByte().toInt()\n                    check(code == 0) { \"code is not 0 while parsing wtlogin.trans_emp with command 0x31.\" }\n                    val sig = readUShortLVByteArray()\n                    readShort().toUShort()\n\n                    val tlv = _readTLVMap()\n                    val data =\n                        tlv.getOrFail(0x17) { \"missing tlv 0x17 while parsing wtlogin.trans_emp with command 0x31.\" }\n\n                    Response.FetchQRCode(data, sig)\n                }\n\n                0x12 -> { // qr code state\n                    var length = readShort().toUShort().toInt()\n                    if (length != 0) {\n                        length--\n                        if (readByte().toUByte().toInt() == 2) {\n                            readLong()\n                            length -= 8\n                        }\n                    }\n\n                    if (length > 0) {\n                        discardExact(length)\n                    }\n                    readInt()\n\n                    val code = readByte().toUByte().toInt()\n                    if (code != 0) {\n                        when (code) { // code\n                            0x30 -> Response.QRCodeStatus(Response.QRCodeStatus.State.WAITING_FOR_SCAN)\n                            0x35 -> Response.QRCodeStatus(Response.QRCodeStatus.State.WAITING_FOR_CONFIRM)\n                            0x36 -> Response.QRCodeStatus(Response.QRCodeStatus.State.CANCELLED)\n                            0x11 -> Response.QRCodeStatus(Response.QRCodeStatus.State.TIMEOUT)\n                            else -> error(\"unknown code $code while parsing wtlogin.trans_emp with command 0x12.\")\n                        }\n                    } else {\n                        val client = bot.client\n\n                        val uin = readLong()\n                        if (client.uin != uin) {\n                            throw InconsistentBotIdException(expected = client.uin, actual = uin)\n                        }\n                        readInt()\n                        readShort().toUShort()\n                        val tlv = _readTLVMap()\n\n                        val tmpPwd = tlv.getOrFail(0x18) {\n                            \"missing tlv 0x18 while parsing wtlogin.trans_emp with command 0x12.\"\n                        }\n                        val noPicSig = tlv.getOrFail(0x19) {\n                            \"missing tlv 0x19 while parsing wtlogin.trans_emp with command 0x12.\"\n                        }\n                        val tgtQR = tlv.getOrFail(0x65) {\n                            \"missing tlv 0x65 while parsing wtlogin.trans_emp with command 0x12.\"\n                        }\n\n                        client.tgtgtKey = tlv.getOrFail(0x1e) {\n                            \"missing tlv 0x1e while parsing wtlogin.trans_emp with command 0x12.\"\n                        }\n\n                        Response.QRCodeConfirmed(QRCodeLoginData(tmpPwd, noPicSig, tgtQR))\n                    }\n                }\n\n                else -> error(\"wtlogin.trans_emp received an unknown command: $command\")\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/login/wtlogin/WtLogin10.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.login.wtlogin\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.network.*\nimport net.mamoe.mirai.internal.network.protocol.packet.*\nimport net.mamoe.mirai.internal.network.protocol.packet.login.WtLogin\nimport net.mamoe.mirai.internal.utils.GuidSource\nimport net.mamoe.mirai.internal.utils.MacOrAndroidIdChangeFlag\nimport net.mamoe.mirai.internal.utils.guidFlag\nimport net.mamoe.mirai.utils._writeTlvMap\nimport net.mamoe.mirai.utils.generateDeviceInfoData\nimport net.mamoe.mirai.utils.md5\nimport net.mamoe.mirai.utils.toReadPacket\n\ninternal object WtLogin10 : WtLoginExt {\n\n    const val appId: Long = 16L\n    operator fun invoke(\n        client: QQAndroidClient,\n        subAppId: Long = 100,\n        mainSigMap: Int = client.mainSigMap,\n        remark: String = \"10:fast-login\",\n    ) = WtLogin.ExchangeEmp.buildLoginOutgoingPacket(\n        client, encryptMethod = PacketEncryptType.Empty, remark = remark\n    ) { sequenceId ->\n        writeSsoPacket(\n            client,\n            client.subAppId,\n            WtLogin.ExchangeEmp.commandName,\n            extraData = client.wLoginSigInfo.tgt.toReadPacket(),\n            sequenceId = sequenceId\n        ) {\n            writeOicqRequestPacket(\n                client,\n                commandId =\n                0x0810\n            ) {\n                writeShort(11) // subCommand\n\n                _writeTlvMap(Short.SIZE_BYTES) {\n                    t100(appId, subAppId, client.appClientVersion, client.ssoVersion, mainSigMap)\n                    t10a(client.wLoginSigInfo.tgt)\n                    t116(client.miscBitMap, client.subSigMap)\n                    t108(client.ksid)\n                    t144(\n                        androidId = client.device.androidId,\n                        androidDevInfo = client.device.generateDeviceInfoData(),\n                        osType = client.device.osType,\n                        osVersion = client.device.version.release,\n                        networkType = client.networkType,\n                        simInfo = client.device.simInfo,\n                        unknown = byteArrayOf(),\n                        apn = client.device.apn,\n                        isGuidFromFileNull = false,\n                        isGuidAvailable = true,\n                        isGuidChanged = false,\n                        guidFlag = guidFlag(GuidSource.FROM_STORAGE, MacOrAndroidIdChangeFlag(0)),\n                        buildModel = client.device.model,\n                        guid = client.device.guid,\n                        buildBrand = client.device.brand,\n                        tgtgtKey = client.wLoginSigInfo.d2Key.md5()\n                    )\n                    //t112(client.account.phoneNumber.encodeToByteArray())\n                    t143(client.wLoginSigInfo.d2.data)\n                    t145(client.device.guid)\n                    t142(client.apkId)\n                    t154(sequenceId)\n                    t18(appId, uin = client.uin)\n                    t141(client.device.simInfo, client.networkType, client.device.apn)\n                    t8(2052)\n                    //t511()\n                    t147(appId, client.apkVersionName, client.apkSignatureMd5)\n                    t177(client.buildTime, client.sdkVersion)\n                    t187(client.device.macAddress)\n                    t188(client.device.androidId)\n                    t194(client.device.imsiMd5)\n                    t511()\n                    t202(client.device.wifiBSSID, client.device.wifiSSID)\n                    if (client.supportedEncrypt) {\n                        t544ForToken(\n                            client = client,\n                            uin = client.uin,\n                            protocol = client.bot.configuration.protocol,\n                            guid = client.device.guid,\n                            sdkVersion = client.sdkVersion,\n                            subCommandId = 10,\n                            commandStr = \"810_a\"\n                        )\n                    }\n                }\n\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/login/wtlogin/WtLogin15.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.login.wtlogin\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.network.*\nimport net.mamoe.mirai.internal.network.protocol.packet.*\nimport net.mamoe.mirai.internal.network.protocol.packet.login.WtLogin\nimport net.mamoe.mirai.utils._writeTlvMap\nimport net.mamoe.mirai.utils.currentTimeSeconds\nimport net.mamoe.mirai.utils.toByteArray\nimport kotlin.math.abs\nimport kotlin.random.Random\n\ninternal object WtLogin15 : WtLoginExt {\n    private const val subCommand = 15.toShort()\n\n    private const val appId = 16L\n\n    operator fun invoke(\n        client: QQAndroidClient,\n    ) = WtLogin.ExchangeEmp.buildOutgoingUniPacket(\n        client, encryptMethod = PacketEncryptType.Empty, remark = \"15:refresh-keys\"\n    ) { sequenceId ->\n//        writeSsoPacket(client, client.subAppId, WtLogin.ExchangeEmp.commandName, sequenceId = sequenceId) {\n        writeOicqRequestPacket(\n            client,\n            encryptMethod = EncryptMethodSessionKeyNew(\n                client.wLoginSigInfo.wtSessionTicket.data,\n                client.wLoginSigInfo.wtSessionTicketKey\n            ),\n            commandId = 0x0810\n        ) {\n            writeShort(subCommand) // subCommand\n\n            _writeTlvMap {\n\n\n//            writeFully((\"00 18 00 16 00 01 00 00 06 00 00 00 00 10 00 00 00 00 76 E4 B8 DD 00 00 00 00 00 01 00 14 00 01 5A 11 60 11 76 E4 B8 DD 60 0D 44 35 90 E8 11 1B 00 00 \" +\n//                    //\"01 06 \" +\n//                    //client.wLoginSigInfo.encryptA1!!.size.toShort().toUHexString() + \" \" + client.wLoginSigInfo.encryptA1!!.toUHexString() + \" \"+\n//                    \"01 06 00 78 CD 52 75 7E B7 CF A0 FC 58 15 1E 79 29 86 F0 28 06 AE 4D E4 EF 39 6B 8B 64 19 90 7E DF 2B 71 48 53 E6 71 19 4A 7F 81 06 EB 19 A2 CA 8B B3 47 D9 07 73 04 71 99 B3 F2 7E 2B F0 93 6B A0 FA 94 D3 15 41 55 6C EF 87 96 47 22 5C 6B 10 0F EC 27 3A 8F 83 0A 75 8B 95 EA 81 02 AA C6 E7 C8 6C 7B C3 93 4E EC 08 2E DB 9B 3E 4B 17 7C 06 1C 66 31 F4 EE 70 55 87 49 A2 5B 25 \" +\n//                    \"01 16 00 0E 00 0A F7 FF 7C 00 01 \" +\n//                    \"04 00 01 5F 5E 10 E2 01 00 00 16 00 01 00 00 00 0F 00 00 00 10 20 02 FD E2 00 00 00 00 02 10 10 E0 01 07 00 06 00 00 00 00 00 01 01 44 01 B8 20 3F 4F ED A0 CD 3B CC 07 47 A3 91 8B B5 C8 18 EA D1 45 8A 0F F3 1F CD 95 85 00 7C AD 7F 18 7C 43 B6 A6 C3 FF 53 D5 F6 F4 E6 75 1D 4F AF A4 DF C5 EB 3D 6F C5 C3 21 E9 C7 66 8A EF 4A BD 45 CC D2 A5 34 E4 1D F5 9B 07 9B 65 6A 35 BD B4 0B D1 94 43 18 1C 48 1D B5 2C B5 62 FA E9 E1 35 14 13 BC EE BF FA FD 98 A4 72 A8 1A 71 9C 77 2D 4D BF 58 3A 0A 72 D4 B0 A2 DA 6C FC 04 49 F5 05 3D EF 60 E5 92 9A 04 96 AA A4 22 4E 13 8F 63 3B D9 54 B8 DC CC 2D A0 0B 8B B9 9A D7 8A D0 E4 A4 EE 4F 2E 8D 52 86 35 74 70 93 A0 21 0D 98 DE A4 5B B9 79 A5 8E 31 8D A5 AC 0B DB A8 65 6C 93 1C EE FB E9 A2 FD 22 90 0B A5 41 3D 1F 2B A9 84 FF D8 64 DF 94 48 B3 D6 20 47 F3 12 D3 63 F0 84 1C 6A 1E 0A 8B 13 02 EA F2 C3 3E 41 87 59 5A 65 80 E4 7C 3E FC 52 70 20 26 ED 27 91 01 C0 4D 50 23 B9 1F 59 77 AE D5 4D C8 57 DB 86 E9 5B 98 0C 95 A2 15 AB 01 3E 10 D5 3B 01 57 FE C8 88 80 4D 1A 8A 4D 64 89 C3 7F E6 73 D3 04 C8 EA 98 E2 F3 82 48 7D FC D7 CF 07 \" +\n//                    \"F4 33 F1 1E D3 1C 0D 48 37 3A 50 0B 39 28 AB F3 4F BF C9 D8 70 6F B9 F2 FB 46 5A 4B 21 DE D8 B8 30 A1 FC C6 09 60 4E 07 21 28 F7 CC 7A A0 07 1C 87 42 90 D3 40 07 1B 35 52 56 31 E2 C0 6D 1F 79 43 6C 63 46 D4 92 EE 30 A2 D2 D6 0F 79 46 2A EF C7 C6 CF 54 1D 03 FE 80 D4 28 87 AF 2D 1A FF 71 99 FC 23 09 79 B0 9D B4 E9 0F 4E E3 D2 79 10 2C C7 6E 30 34 A5 66 2E 33 00 08 D0 58 2B 7F D8 E6 21 2E 7E 30 01 42 00 18 00 00 00 14 63 6F 6D 2E 74 65 6E 63 65 6E 74 2E 6D 6F 62 69 6C 65 71 71 01 45 00 10 E2 9A BF 20 0D 00 CA F0 4D 28 CA 66 BF 31 6E AF 01 6A 00 38 CA 78 6A 94 A7 A4 F3 BC 28 58 3C FF 53 41 4C A3 5B 98 AB 7C 21 FB 34 D9 28 59 91 D5 15 12 04 A0 7E 27 25 DF 7A A0 06 87 EB 13 12 10 CD 80 85 78 17 F9 1C D6 21 A7 AF 8C 01 54 00 04 00 01 38 E4 01 41 00 1C 00 01 00 10 43 68 69 6E 61 20 4D 6F 62 69 6C 65 20 47 53 4D 00 02 00 04 77 69 66 69 00 08 00 08 00 00 00 00 08 04 00 00 05 11 00 D3 00 0E 01 00 0A 74 65 6E 70 61 79 2E 63 6F 6D 01 00 11 6F 70 65 6E 6D 6F 62 69 6C 65 2E 71 71 2E 63 6F 6D 01 00 0B 64 6F 63 73 2E 71 71 2E 63 6F 6D 01 00 0E 63 6F 6E 6E 65 63 74 2E 71 71 2E 63 6F 6D 01 00 0C 71 7A 6F 6E 65 2E 71 71 2E 63 6F 6D 01 00 0A 76 69 70 2E 71 71 2E 63 6F 6D 01 00 11 67 61 6D 65 63 65 6E 74 65 72 2E 71 71 2E 63 6F 6D 01 00 0A 71 75 6E 2E 71 71 2E 63 6F 6D 01 00 0B 67 61 6D 65 2E 71 71 2E 63 6F 6D 01 00 0C 71 71 77 65 62 2E 71 71 2E 63 6F 6D 01 00 09 74 69 2E 71 71 2E 63 6F 6D 01 00 0D 6F 66 66 69 63 65 2E 71 71 2E 63 6F 6D 01 00 0B 6D 61 69 6C 2E 71 71 2E 63 6F 6D 01 00 0A 6D 6D 61 2E 71 71 2E 63 6F 6D 01 47 00 1D 00 00 00 10 00 05 38 2E 35 2E 35 00 10 A6 B7 45 BF 24 A2 C2 77 52 77 16 F6 F3 6E B6 8D 01 77 00 11 01 5F EC 50 93 00 0A 36 2E 30 2E 30 2E 32 34 36 33 \" +\n//                    \"04 00 00 48 2F C5 1F 51 62 56 7E A0 39 92 E9 DC 0D 55 00 E5 BA 24 8D 38 47 8F 1C 7F 6A 91 54 62 D9 B3 25 B0 2D 10 A2 15 5E B4 C7 5F 76 CA AC EF 76 88 92 F4 FF 16 55 98 EB 01 BB 4D 34 95 9E 8E 80 59 4E B3 99 1E 80 CD 4E 27 A4 8E\" +\n//                    \" 01 87 00 10 30 86 EC F4 ED 94 5D D2 6F 88 8A 39 46 6C 22 7D 01 88 00 10 9D B6 A8 DF CB C1 79 06 EB 5D 95 FA 20 5A 9E 11 01 94 00 10 73 A1 26 09 B8 99 62 29 04 95 B9 9E 5C DA 22 8C 02 02 00 1B 00 10 36 85 4A A7 02 92 35 CE 9F B5 A2 D0 7A E4 88 F8 00 07 22 38 32 45 46 45 22 05 16 00 04 00 00 00 00 05 21 00 06 00 00 00 00 00 00 05 25 00 47 00 01 05 36 00 41 01 03 00 00 00 00 76 E4 B8 DD 04 1B 11 E8 90 60 0D 3C 28 20 02 FD E2 00 00 00 00 76 E4 B8 DD 04 1B 11 E8 90 60 0D 3C 28 20 02 FD E2 00 00 00 00 76 E4 B8 DD 04 1B 11 E8 90 60 0D 3C 95 20 02 FD E2 \" +\n//                    \"\").hexToBytes())\n//            return@writeOicqRequestPacket\n\n                t18(appId, client.appClientVersion, uin = client.uin)\n                t1(client.uin, (currentTimeSeconds() + client.timeDifference).toInt(), client.device.ipAddress)\n\n                t106(client.wLoginSigInfo.encryptA1!!)\n//            kotlin.run {\n//                val key = (client.account.passwordMd5 + ByteArray(4) + client.uin.toInt().toByteArray()).md5()\n//                kotlin.runCatching {\n//                    TEA.decrypt(encryptA1, key).toUHexString()\n//                }.soutv(\"DEC\") // success\n//            }\n\n                // val a1 = kotlin.runCatching {\n                //     TEA.decrypt(encryptA1, buildPacket {\n                //         writeFully(client.device.guid)\n                //         writeFully(client.dpwd)\n                //         writeFully(client.randSeed)\n                //     }.readBytes().md5())\n                // }.recoverCatching {\n                //     client.tryDecryptOrNull(encryptA1) { it }!!\n                // }.getOrElse {\n                //     encryptA1.soutv(\"ENCRYPT A1\")\n                //     client.soutv(\"CLIENT\")\n                //     // exitProcess(1)\n                //     // error(\"Failed to decrypt A1\")\n                //     encryptA1\n                // }\n\n                t116(client.miscBitMap, client.subSigMap)\n                if (client.miscBitMap and 128 != 0) {\n                    t166(1)\n                    client.rollbackSig?.let { t172(it) }\n                }\n\n                //t100(appId, client.subAppId, client.appClientVersion, client.ssoVersion, client.mainSigMap)\n                //t100(appId, 1, client.appClientVersion, client.ssoVersion, mainSigMap = 1048768)\n                t100(appId, 2, client.appClientVersion, client.ssoVersion, client.mainSigMap)\n\n                t107(0)\n\n                if (client.ksid.isNotEmpty()) {\n                    t108(client.ksid)\n                }\n                t144(client)\n                t142(client.apkId)\n                if (client.uin !in 10000L..4000000000L) {\n                    t112(client.uin.toByteArray())\n                }\n                t145(client.device.guid)\n\n                val noPicSig =\n                    client.wLoginSigInfo.noPicSig ?: error(\"Internal error: doing exchange emp 15 while noPicSig=null\")\n                t16a(noPicSig)\n\n                t154(sequenceId)\n                t141(client.device.simInfo, client.networkType, client.device.apn)\n                t8(2052)\n                t511()\n                t147(appId, client.apkVersionName, client.apkSignatureMd5)\n                t177(buildTime = client.buildTime, buildVersion = client.sdkVersion)\n\n                // new\n                t400(\n                    g = client.G,\n                    uin = client.uin,\n                    guid = client.device.guid,\n                    dpwd = client.dpwd,\n                    appId = appId,\n                    subAppId = 1,\n                    randomSeed = client.randSeed\n                )\n\n                t187(client.device.macAddress)\n                t188(client.device.androidId)\n                t194(client.device.imsiMd5)\n                // ignored t201 cuz SetNeedForPayToken is never called.\n                t202(client.device.wifiBSSID, client.device.wifiSSID)\n                t516()\n\n                t521() // new\n                t525(client.loginExtraData) // new\n                if (client.supportedEncrypt) {\n                    t544ForToken(\n                        client = client,\n                        uin = client.uin,\n                        protocol = client.bot.configuration.protocol,\n                        guid = client.device.guid,\n                        sdkVersion = client.sdkVersion,\n                        subCommandId = 15,\n                        commandStr = \"810_f\"\n                    )\n                }\n                t545(client.qimei16 ?: client.device.imei)\n            }\n        }\n\n        //  }\n    }\n}\n\n@Suppress(\"FunctionName\", \"SpellCheckingInspection\")\ninternal fun get_mpasswd(random: Random = Random): String {\n    var var5: String\n    run label41@{\n        val var6 = ByteArray(16)\n        random.nextBytes(var6)\n        var var0 = 0\n        var var4 = \"\"\n        while (true) {\n            var5 = var4\n            if (var0 >= var6.size) {\n                return var5\n            }\n            val var3: Boolean = random.nextBoolean()\n            val var2: Int = abs(var6[var0] % 26)\n\n            val var1: Byte = if (var3) {\n                97\n            } else {\n                65\n            }\n            var4 += ((var1 + var2).toChar()).toString()\n\n            ++var0\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/login/wtlogin/WtLogin2.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.login.wtlogin\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.network.*\nimport net.mamoe.mirai.internal.network.protocol.packet.*\nimport net.mamoe.mirai.internal.network.protocol.packet.login.WtLogin\nimport net.mamoe.mirai.utils._writeTlvMap\n\n\ninternal object WtLogin2 : WtLoginExt {\n    fun SubmitSliderCaptcha(\n        client: QQAndroidClient,\n        ticket: String\n    ) = WtLogin.Login.buildLoginOutgoingPacket(client, encryptMethod = PacketEncryptType.Empty, remark = \"2:submit-slider\") { sequenceId ->\n        writeSsoPacket(client, client.subAppId, WtLogin.Login.commandName, sequenceId = sequenceId) {\n            writeOicqRequestPacket(client, commandId = 0x0810) {\n                writeShort(2) // subCommand\n\n                _writeTlvMap {\n                    t193(ticket)\n                    t8(2052)\n                    t104(client.t104)\n                    t116(client.miscBitMap, client.subSigMap)\n                    client.t547?.let { t547(it) }\n                    if (client.supportedEncrypt) {\n                        t544ForVerify(\n                            client = client,\n                            uin = client.uin,\n                            protocol = client.bot.configuration.protocol,\n                            guid = client.device.guid,\n                            sdkVersion = client.sdkVersion,\n                            subCommandId = 2,\n                            commandStr = \"810_2\"\n                        )\n                    }\n                }\n            }\n        }\n    }\n\n    fun SubmitPictureCaptcha(\n        client: QQAndroidClient,\n        captchaSign: ByteArray,\n        captchaAnswer: String\n    ) = WtLogin.Login.buildLoginOutgoingPacket(client, encryptMethod = PacketEncryptType.Empty, remark = \"2:submit-captcha\") { sequenceId ->\n        writeSsoPacket(client, client.subAppId, WtLogin.Login.commandName, sequenceId = sequenceId) {\n            writeOicqRequestPacket(client, commandId = 0x0810) {\n                writeShort(2) // subCommand\n\n                _writeTlvMap {\n                    t2(captchaAnswer, captchaSign, 0)\n                    t8(2052)\n                    t104(client.t104)\n                    t116(client.miscBitMap, client.subSigMap)\n                    client.t547?.let { t547(it) }\n                    if (client.supportedEncrypt) {\n                        t544ForVerify(\n                            client = client,\n                            uin = client.uin,\n                            protocol = client.bot.configuration.protocol,\n                            guid = client.device.guid,\n                            sdkVersion = client.sdkVersion,\n                            subCommandId = 2,\n                            commandStr = \"810_2\"\n                        )\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/login/wtlogin/WtLogin20.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.login.wtlogin\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.miscBitMap\nimport net.mamoe.mirai.internal.network.protocol.packet.*\nimport net.mamoe.mirai.internal.network.protocol.packet.login.WtLogin\nimport net.mamoe.mirai.internal.network.subAppId\nimport net.mamoe.mirai.internal.network.subSigMap\nimport net.mamoe.mirai.utils._writeTlvMap\n\ninternal object WtLogin20 : WtLoginExt {\n    operator fun invoke(\n        client: QQAndroidClient\n    ) = WtLogin.Login.buildLoginOutgoingPacket(client, encryptMethod = PacketEncryptType.Empty, remark = \"20:dev-lock\") { sequenceId ->\n        writeSsoPacket(client, client.subAppId, WtLogin.Login.commandName, sequenceId = sequenceId) {\n            writeOicqRequestPacket(client, commandId = 0x0810) {\n                writeShort(20) // subCommand\n                _writeTlvMap {\n                    t8(2052)\n                    t104(client.t104)\n                    t116(client.miscBitMap, client.subSigMap)\n                    t401(client.G) // (client.device.guid + \"stMNokHgxZUGhsYp\".toByteArray() + t402).md5()\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/login/wtlogin/WtLogin7.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.login.wtlogin\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.network.*\nimport net.mamoe.mirai.internal.network.protocol.packet.*\nimport net.mamoe.mirai.internal.network.protocol.packet.login.WtLogin\nimport net.mamoe.mirai.utils.DeviceVerificationRequests\nimport net.mamoe.mirai.utils._writeTlvMap\n\n/**\n * Submit SMS.\n * @see DeviceVerificationRequests.SmsRequest.requestSms\n */\ninternal object WtLogin7 : WtLoginExt {\n    operator fun invoke(\n        client: QQAndroidClient,\n        t174: ByteArray,\n        code: String\n    ) = WtLogin.Login.buildLoginOutgoingPacket(\n        client, encryptMethod = PacketEncryptType.Empty, remark = \"7:submit-sms\"\n    ) { sequenceId ->\n        writeSsoPacket(client, client.subAppId, WtLogin.Login.commandName, sequenceId = sequenceId) {\n            writeOicqRequestPacket(client, commandId = 0x0810) {\n                writeShort(7) // subCommand\n\n                _writeTlvMap {\n\n                    t8(2052)\n                    t104(client.t104)\n                    t116(client.miscBitMap, client.subSigMap)\n                    t174(client.t174 ?: t174)\n                    t17c(code.encodeToByteArray())\n                    t401(client.G)\n                    t198()\n                    if (client.supportedEncrypt) {\n                        t544ForVerify(\n                            client = client,\n                            uin = client.uin,\n                            protocol = client.bot.configuration.protocol,\n                            guid = client.device.guid,\n                            sdkVersion = client.sdkVersion,\n                            subCommandId = 7,\n                            commandStr = \"810_7\"\n                        )\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/login/wtlogin/WtLogin8.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.login.wtlogin\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.miscBitMap\nimport net.mamoe.mirai.internal.network.protocol.packet.*\nimport net.mamoe.mirai.internal.network.protocol.packet.login.WtLogin\nimport net.mamoe.mirai.internal.network.subAppId\nimport net.mamoe.mirai.internal.network.subSigMap\nimport net.mamoe.mirai.utils.DeviceVerificationRequests\nimport net.mamoe.mirai.utils._writeTlvMap\n\n/**\n * Request SMS.\n * @see DeviceVerificationRequests.SmsRequest.requestSms\n */\ninternal object WtLogin8 : WtLoginExt {\n    val subCommand: Short = 8\n    operator fun invoke(\n        client: QQAndroidClient,\n        t174: ByteArray\n    ) = WtLogin.Login.buildLoginOutgoingPacket(\n        client, encryptMethod = PacketEncryptType.Empty, remark = \"8:request-sms\"\n    ) { sequenceId ->\n        writeSsoPacket(client, client.subAppId, WtLogin.Login.commandName, sequenceId = sequenceId) {\n            writeOicqRequestPacket(client, commandId = 0x0810) {\n                writeShort(subCommand) // subCommand\n\n                _writeTlvMap {\n\n                    t8(2052)\n                    t104(client.t104)\n                    t116(client.miscBitMap, client.subSigMap)\n                    t174(t174)\n                    t17a(9)\n                    t197()\n                    // Lcom/tencent/mobileqq/msf/core/auth/l;a(Ljava/lang/String;JLoicq/wlogin_sdk/request/WUserSigInfo;IIILoicq/wlogin_sdk/tools/ErrMsg;)V\n                    // a2.addAttribute(\"smsExtraData\", WtloginHelper.getLoginResultData(wUserSigInfo, 1347));\n                    // wUserSigInfo.loginResultTLVMap.get(new Integer(1347)).get_data()\n\n                    // this.mUserSigInfo.loginResultTLVMap.put(new Integer(1347), async_contextVar._t543);\n                    // toServiceMsg.getAttribute(\"smsExtraData\"))\n                    client.t543?.let { t542(it) }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/login/wtlogin/WtLogin9.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.login.wtlogin\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.network.*\nimport net.mamoe.mirai.internal.network.protocol.packet.*\nimport net.mamoe.mirai.internal.network.protocol.packet.login.WtLogin\nimport net.mamoe.mirai.utils._writeTlvMap\nimport net.mamoe.mirai.utils.currentTimeSeconds\nimport net.mamoe.mirai.utils.toByteArray\n\ninternal object WtLogin9 : WtLoginExt {\n    private const val appId = 16L\n\n    fun Password(\n        client: QQAndroidClient,\n        passwordMd5: ByteArray,\n        allowSlider: Boolean\n    ) = WtLogin.Login.buildLoginOutgoingPacket(\n        client, encryptMethod = PacketEncryptType.Empty, remark = \"9:password-login\"\n    ) { sequenceId ->\n        writeSsoPacket(client, client.subAppId, WtLogin.Login.commandName, sequenceId = sequenceId) {\n            writeOicqRequestPacket(client, commandId = 0x0810) {\n                writeShort(9) // subCommand\n                val useEncryptA1AndNoPicSig =\n                    client.wLoginSigInfoInitialized\n                            && client.wLoginSigInfo.noPicSig != null\n                            && client.wLoginSigInfo.encryptA1 != null\n                //writeShort(LoginType.PASSWORD.value.toShort())\n\n                _writeTlvMap {\n\n                    t18(appId, client.appClientVersion, client.uin)\n                    t1(client.uin, (currentTimeSeconds() + client.timeDifference).toInt(), client.device.ipAddress)\n\n                    if (useEncryptA1AndNoPicSig) {\n                        t106(client.wLoginSigInfo.encryptA1!!)\n                    } else {\n                        t106(client, appId, passwordMd5)\n                    }\n\n                    /* // from GetStWithPasswd\n                int mMiscBitmap = this.mMiscBitmap;\n                if (t.uinDeviceToken) {\n                    mMiscBitmap = (this.mMiscBitmap | 0x2000000);\n                }\n\n\n                // defaults true\n                if (ConfigManager.get_loginWithPicSt()) appIdList = longArrayOf(1600000226L)\n                */\n                    t116(client.miscBitMap, client.subSigMap)\n                    t100(appId, client.subAppId, client.appClientVersion, client.ssoVersion, client.mainSigMap)\n                    t107(0)\n                    if (client.ksid.isNotEmpty()) {\n                        t108(client.ksid)\n                    }\n\n                    // t108(byteArrayOf())\n                    if (client.t104Initialized) {\n                        t104(client.t104)\n                    }\n\n                    t142(client.apkId)\n\n                    // if login with non-number uin\n                    if (client.uin !in 10000L..4000000000L) {\n                        t112(client.uin.toByteArray())\n                    }\n                    t144(client)\n\n                    //this.build().debugPrint(\"傻逼\")\n                    t145(client.device.guid)\n                    t147(appId, client.apkVersionName, client.apkSignatureMd5)\n\n\n                    if (client.miscBitMap and 0x80 != 0) {\n                        t166(1) // com.tencent.luggage.wxa.me.e.CTRL_INDEX\n                    }\n                    if (useEncryptA1AndNoPicSig) {\n                        t16a(client.wLoginSigInfo.noPicSig!!)\n                    }\n\n                    t154(sequenceId)\n                    t141(client.device.simInfo, client.networkType, client.device.apn)\n                    t8(2052)\n\n                    t511()\n\n                    // ignored t172 because rollbackSig is null\n                    // ignored t185 because loginType is not SMS\n                    if (useEncryptA1AndNoPicSig) {\n                        t400(\n                            g = client.G,\n                            uin = client.uin,\n                            guid = client.device.guid,\n                            dpwd = client.dpwd,\n                            appId = appId,\n                            subAppId = client.subAppId,\n                            randomSeed = client.randSeed,\n                        )\n                    }\n\n                    t187(client.device.macAddress)\n                    t188(client.device.androidId)\n                    t194(client.device.imsiMd5)\n                    if (allowSlider) {\n                        t191()\n                    }\n\n\n                    //t201(N = byteArrayOf())\n\n                    t202(client.device.wifiBSSID, client.device.wifiSSID)\n\n                    t177(\n                        buildTime = client.buildTime,\n                        buildVersion = client.sdkVersion,\n                    )\n                    t516()\n                    t521()\n\n                    t525()\n                    t545(client.qimei16 ?: client.device.imei)\n                    // t548()\n                    // this.build().debugPrint(\"傻逼\")\n\n                    // ignored t318 because not logging in by QR\n                    if (client.supportedEncrypt) {\n                        t544ForToken(\n                            client = client,\n                            uin = client.uin,\n                            protocol = client.bot.configuration.protocol,\n                            guid = client.device.guid,\n                            sdkVersion = client.sdkVersion,\n                            subCommandId = 9,\n                            commandStr = \"810_9\"\n                        )\n                    }\n                }\n            }\n        }\n    }\n\n    @Suppress(\"DuplicatedCode\")\n    fun QRCode(\n        client: QQAndroidClient,\n        data: QRCodeLoginData,\n    ) = WtLogin.Login.buildLoginOutgoingPacket(\n        client, encryptMethod = PacketEncryptType.Empty, remark = \"9:qrcode-login\"\n    ) { sequenceId ->\n        writeSsoPacket(client, client.subAppId, WtLogin.Login.commandName, sequenceId = sequenceId) {\n            writeOicqRequestPacket(client, commandId = 0x0810) {\n                writeShort(9) // subCommand\n//                writeShort(0x19) // count of TLVs, probably ignored by server?\n\n                _writeTlvMap {\n                    t18(appId, client.appClientVersion, client.uin)\n                    t1(client.uin, (currentTimeSeconds() + client.timeDifference).toInt(), client.device.ipAddress)\n\n                    t106(data.tmpPwd)\n\n                    t116(client.miscBitMap, client.subSigMap)\n                    t100(appId, client.subAppId, client.appClientVersion, client.ssoVersion, client.mainSigMap)\n                    t107(0)\n                    t108(client.device.imei.toByteArray())\n\n                    t142(client.apkId)\n\n                    t144(client)\n\n                    t145(client.device.guid)\n                    t147(appId, client.apkVersionName, client.apkSignatureMd5)\n\n                    t16a(data.noPicSig)\n\n                    t154(sequenceId)\n                    t141(client.device.simInfo, client.networkType, client.device.apn)\n                    t8(2052)\n\n                    t511()\n\n                    t187(client.device.macAddress)\n                    t188(client.device.androidId)\n                    t194(client.device.imsiMd5)\n                    t191(0x00)\n\n                    t202(client.device.wifiBSSID, client.device.wifiSSID)\n\n                    t177(client.buildTime, client.sdkVersion)\n                    t516()\n                    t521(8)\n                    t318(data.tgtQR)\n\n                    if (client.supportedEncrypt) {\n                        t544ForToken(\n                            client = client,\n                            uin = client.uin,\n                            protocol = client.bot.configuration.protocol,\n                            guid = client.device.guid,\n                            sdkVersion = client.sdkVersion,\n                            subCommandId = 9,\n                            commandStr = \"810_9\"\n                        )\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/login/wtlogin/WtLoginExt.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.login.wtlogin\n\nimport com.ionspin.kotlin.bignum.integer.BigInteger\nimport com.ionspin.kotlin.bignum.integer.util.fromTwosComplementByteArray\nimport com.ionspin.kotlin.bignum.integer.util.toTwosComplementByteArray\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.LoginExtraData\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.WLoginSigInfo\nimport net.mamoe.mirai.internal.network.protocol.packet.Tlv\nimport net.mamoe.mirai.internal.network.protocol.packet.login.WtLogin\nimport net.mamoe.mirai.internal.network.protocol.packet.t145\nimport net.mamoe.mirai.internal.utils.io.writeShortLVByteArray\nimport net.mamoe.mirai.utils.*\n\n\n@Suppress(\"UnusedReceiverParameter\")\ninternal inline fun WtLoginExt.analysisTlv0x531(\n    t531: ByteArray,\n    handler: (a1: ByteArray, noPicSig: ByteArray) -> Unit\n) {\n    val map = t531.toReadPacket().withUse { _readTLVMap() }\n\n    val t106 = map[0x106]\n    val t16a = map[0x16a]\n    val t113 = map[0x113]\n    val t10c = map[0x10c]\n\n    if (t106 != null && t16a != null && t113 != null && t10c != null) {\n        handler(t106 + t10c, t16a)\n    }\n}\n\n/**\n * @see WtLogin\n */\ninternal interface WtLoginExt { // so as not to register to global extension\n\n    fun onErrorMessage(type: Int, tlvMap: TlvMap, bot: QQAndroidBot): WtLogin.Login.LoginPacketResponse.Error? {\n        return tlvMap[0x149]?.read {\n            discardExact(2) //type\n            val title: String = readUShortLVString()\n            val content: String = readUShortLVString()\n            val otherInfo: String = readUShortLVString()\n\n            WtLogin.Login.LoginPacketResponse.Error(bot, type, title, content, otherInfo)\n        } ?: tlvMap[0x146]?.read {\n            discardExact(2) // ver\n            discardExact(2)  // code\n\n            val title = readUShortLVString()\n            val message = readUShortLVString()\n            val errorInfo = readUShortLVString()\n\n            WtLogin.Login.LoginPacketResponse.Error(bot, type, title, message, errorInfo)\n        }\n    }\n\n    fun TlvMap.getOrEmpty(key: Int): ByteArray {\n        return this[key] ?: byteArrayOf()\n    }\n\n    /**\n     * @throws error\n     */\n    fun QQAndroidClient.parseWFastLoginInfoDataOutA1(t169: ByteArray): ByteReadPacket {\n        val map = t169.toReadPacket().withUse { _readTLVMap() }\n\n        val t106 = map[0x106]\n        val t10c = map[0x10c]\n        val t16a = map[0x16a]\n\n        check(t106 != null) { \"getWFastLoginInfoDataOutA1: Cannot find tlv 0x106!!\" }\n        check(t10c != null) { \"getWFastLoginInfoDataOutA1: Cannot find tlv 0x10c!!\" }\n        check(t16a != null) { \"getWFastLoginInfoDataOutA1: Cannot find tlv 0x16a!!\" }\n\n        return buildPacket {\n            writeByte(64)\n\n            _writeTlvMap {\n\n                // TLV\n                tlv(0x106, t106)\n\n                tlv(0x10c, t10c)\n\n                tlv(0x16a, t16a)\n\n                t145(device.guid)\n            }\n        }\n    }\n\n    /**\n     * login extra data\n     *\n     * oicq/wlogin_sdk/request/oicq_request.java:1445\n     */\n    fun QQAndroidClient.analysisTlv537(t537: ByteArray) = t537.read {\n        //discardExact(2)\n        discardExact(1)\n        repeat(readByte().toInt()) {\n            loginExtraData.add(\n                LoginExtraData( // args are to correct order\n                    uin = readLong(),\n                    ip = readBytes(readByte().toInt() and 0xff),\n                    time = readInt(), // correct\n                    version = readInt()\n                )\n            )\n        }\n    }\n\n    /**\n     * Encrypt sig and key for pic downloading\n     */\n    fun QQAndroidClient.analysisTlv11d(t11d: ByteArray): WLoginSigInfo.EncryptedDownloadSession = t11d.read {\n        val appid = readInt().toLong().and(4294967295L)\n        val stKey = ByteArray(16)\n        readAvailable(stKey)\n        val stSigLength = readShort().toUShort().toInt()\n        val stSig = ByteArray(stSigLength)\n        readAvailable(stSig)\n        WLoginSigInfo.EncryptedDownloadSession(\n            appid,\n            stKey,\n            stSig\n        )\n    }\n\n    /**\n     * pwd flag\n     */\n    fun QQAndroidClient.analysisTlv186(t186: ByteArray) = t186.read {\n        discardExact(1)\n        pwdFlag = readByte().toInt() == 1\n    }\n\n    /**\n     * 设置 [QQAndroidClient.uin]\n     */\n    fun QQAndroidClient.analysisTlv113(t113: ByteArray) = t113.read {\n        _uin = readInt().toUInt().toLong()\n\n        /*\n        // nothing to do\n\n          if (!asyncContext.ifQQLoginInQim(class_1048.productType)) {\n              this.field_61436.method_62330(this.field_61436.field_63973, this.field_61436.uin);\n          }\n         */\n    }\n\n    /**\n     * 设置 [QQAndroidClient.timeDifference] 和 [QQAndroidClient.ipFromT149]\n     */\n    fun QQAndroidClient.analysisTlv130(t130: ByteArray) = t130.read {\n        discardExact(2)\n        timeDifference = readInt().toUInt().toLong() - currentTimeSeconds()\n        ipFromT149 = readBytes(4)\n    }\n\n    fun QQAndroidClient.analysisTlv150(t150: ByteArray) {\n        this.t150 = Tlv(t150)\n    }\n\n    fun QQAndroidClient.analysisTlv546(t546: ByteArray) {\n        val version: Byte\n        val algorithmType: Byte\n        val hashType: Byte\n        val maxIndex: Short\n        val reserveBytes: ByteArray\n        val inputBigNumArr: ByteArray\n        val targetHashArr: ByteArray\n        val reserveHashArr: ByteArray\n        var resultArr: ByteArray = EMPTY_BYTE_ARRAY\n        var costTimeMS: Int\n        var recursiveDepth = 0\n        var failed = false\n\n        fun getPadRemaining(bigNumArr: ByteArray, bound: Short): Int {\n            if (bound > 32) {\n                return 1\n            }\n            var maxLoopCount = 255\n            var index = 0\n            while (maxLoopCount >= 0 && index < bound) {\n                if (bigNumArr[maxLoopCount / 8].toInt() and (1 shl maxLoopCount) % 8 != 0) {\n                    return 2\n                }\n                maxLoopCount--\n                index++\n            }\n            return 0\n        }\n\n        fun calcType1(bigNumArrIn: ByteArray, maxLength: Short) {\n            var bigIntArrClone = bigNumArrIn.copyOf()\n            val originLength = bigIntArrClone.size\n            var bigInteger = BigInteger.fromTwosComplementByteArray(bigIntArrClone)\n            while (true) {\n                if (getPadRemaining(bigIntArrClone.sha256().copyOf(32), maxLength) == 0) {\n                    resultArr = bigIntArrClone\n                    return\n                }\n                recursiveDepth++\n                bigInteger = bigInteger.add(BigInteger.ONE)\n                bigIntArrClone = bigInteger.toTwosComplementByteArray()\n                if (bigIntArrClone.size > originLength) {\n                    failed = true\n                    return\n                }\n            }\n        }\n\n        fun calcType2(bigNumArrIn: ByteArray, hashTarget: ByteArray) {\n            var bigIntArrClone = bigNumArrIn.copyOf()\n            val originLength = bigIntArrClone.size\n            var bigInteger = BigInteger.fromTwosComplementByteArray(bigIntArrClone)\n            while (true) {\n                if (bigIntArrClone.sha256().copyOf(32).contentEquals(hashTarget)) {\n                    resultArr = bigIntArrClone\n                    return\n                }\n                recursiveDepth++\n                bigInteger = bigInteger.add(BigInteger.ONE)\n                bigIntArrClone = bigInteger.toTwosComplementByteArray()\n                if (bigIntArrClone.size > originLength) {\n                    failed = true\n                    return\n                }\n\n            }\n        }\n\n        t546.toReadPacket().apply {\n            version = readByte()\n            algorithmType = readByte()\n            hashType = readByte()\n            readByte() // Ignore resultStatus since it's useless\n            maxIndex = readShort()\n            reserveBytes = readBytes(2)\n            inputBigNumArr = readBytes(readShort().toInt())\n            targetHashArr = readBytes(readShort().toInt())\n            reserveHashArr = readBytes(readShort().toInt())\n        }\n        val startTimeMS: Long = currentTimeMillis()\n        costTimeMS = 0\n        recursiveDepth = 0\n        if (hashType == 1.toByte()) {\n            bot.logger.info(\"Calculating type $algorithmType PoW, it can take some time....\")\n            when (algorithmType.toInt()) {\n                1 -> calcType1(inputBigNumArr, maxIndex)\n                2 -> calcType2(inputBigNumArr, targetHashArr)\n                else -> {\n                    failed = true\n                    bot.logger.warning(\"Unsupported tlv546 algorithm type:${algorithmType}\")\n                }\n            }\n        } else {\n            failed = true\n            bot.logger.warning(\"Unsupported tlv546 hash type:${hashType}\")\n        }\n        if (!failed) {\n            costTimeMS = (currentTimeMillis() - startTimeMS).toInt()\n            bot.logger.info(\"Got PoW result, cost: $costTimeMS ms\")\n            this.t547 = buildPacket {\n                writeByte(version)\n                writeByte(algorithmType)\n                writeByte(hashType)\n                writeByte(1) //resultStatus\n                writeShort(maxIndex)\n                writeFully(reserveBytes)\n                writeShortLVByteArray(inputBigNumArr)\n                writeShortLVByteArray(targetHashArr)\n                writeShortLVByteArray(reserveHashArr)\n                writeShortLVByteArray(resultArr)\n                writeInt(costTimeMS)\n                writeInt(recursiveDepth)\n            }.readBytes()\n        } else {\n            bot.logger.warning(\"Failed to get PoW result, login may fail with error 0x6!\")\n        }\n\n    }\n\n    fun QQAndroidClient.analysisTlv161(t161: ByteArray) {\n        val tlv = t161.toReadPacket().apply { discardExact(2) }.withUse { _readTLVMap() }\n\n        tlv[0x173]?.let { analysisTlv173(it) }\n        tlv[0x17f]?.let { analysisTlv17f(it) }\n        tlv[0x172]?.let { rollbackSig = it }\n    }\n\n    /**\n     * server host\n     */\n    fun QQAndroidClient.analysisTlv173(t173: ByteArray) {\n        t173.read {\n            val type = readByte()\n            val host = readUShortLVString()\n            val port = readShort()\n\n            bot.logger.warning(\"服务器: host=$host, port=$port, type=$type\")\n            // SEE oicq_request.java at method analysisT173\n        }\n    }\n\n    /**\n     * ipv6 address\n     */\n    fun QQAndroidClient.analysisTlv17f(t17f: ByteArray) {\n        t17f.read {\n            val type = readByte()\n            val host = readUShortLVString()\n            val port = readShort()\n\n            bot.logger.warning(\"服务器 ipv6: host=$host, port=$port, type=$type\")\n            // SEE oicq_request.java at method analysisT17f\n        }\n    }\n\n    fun Input.readUShortLVString(): String = String(this.readUShortLVByteArray())\n}\n\n\ninternal fun ByteArray?.orEmpty(size: Int = 0): ByteArray {\n    return this ?: if (size == 0) EMPTY_BYTE_ARRAY else ByteArray(size)\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/sso/TRpcRawPacket.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.sso\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.components.RawIncomingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\n\ninternal object TRpcRawPacket : OutgoingPacketFactory<TRpcRawPacket.RawData>(\"trpc.o3.*\") {\n    const val COMMAND_PREFIX = \"trpc.o3.\"\n\n\n    internal class RawData(\n        val command: String,\n        val data: ByteArray,\n    ) : Packet\n\n    override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): RawData {\n        error(\"\")\n    }\n\n    fun decode(raw: RawIncomingPacket, body: ByteReadPacket): RawData =\n        RawData(raw.commandName, body.readBytes())\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/summarycard/FriendRemark.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.summarycard\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.data.jce.ChangeFriendNameReq\nimport net.mamoe.mirai.internal.network.protocol.data.jce.ChangeFriendNameRes\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketWithRespType\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.readUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.writeJceRequestPacket\n\ninternal object ChangeFriendRemark :\n    OutgoingPacketFactory<ChangeFriendRemark.Response>(\"ProfileService.ChangeFriendName\") {\n    class Response(val isSuccess: Boolean, val resultCode: Int) : Packet {\n        override fun toString(): String {\n            return \"ProfileService.ChangeFriendName.Response(isSuccess=$isSuccess, resultCode=$resultCode)\"\n        }\n    }\n\n    override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {\n        val res = this.readUniPacket(ChangeFriendNameRes.serializer())\n        return Response(res.result == 0x0.toByte(), res.result.toInt())\n    }\n\n    operator fun invoke(\n        client: QQAndroidClient,\n        id: Long,\n        newRemark: String\n    ): OutgoingPacketWithRespType<Response> {\n        return buildOutgoingUniPacket(client) {\n            writeJceRequestPacket(\n                servantName = \"KQQ.ProfileService.ProfileServantObj\",\n                funcName = \"ChangeFriendName\",\n                name = \"req\",\n                serializer = ChangeFriendNameReq.serializer(),\n                body = ChangeFriendNameReq(id, newRemark)\n            )\n        }\n    }\n\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/protocol/packet/summarycard/SummaryCard.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.packet.summarycard\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.data.UserProfile\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.data.jce.ReqHead\nimport net.mamoe.mirai.internal.network.protocol.data.jce.RequestDataVersion2\nimport net.mamoe.mirai.internal.network.protocol.data.jce.RequestPacket\nimport net.mamoe.mirai.internal.network.protocol.data.richstatus.RichStatus\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket\nimport net.mamoe.mirai.internal.utils.io.serialization.jceRequestSBuffer\nimport net.mamoe.mirai.internal.utils.io.serialization.readJceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars\nimport net.mamoe.mirai.internal.utils.io.serialization.writeJceStruct\nimport net.mamoe.mirai.utils.read\nimport net.mamoe.mirai.internal.network.protocol.data.jce.ReqSummaryCard as JceReqSummaryCard\nimport net.mamoe.mirai.internal.network.protocol.data.jce.RespSummaryCard as JceRespSummaryCard\n\ninternal data class UserProfileImpl(\n    override val nickname: String,\n    override val email: String,\n    override val age: Int,\n    override val qLevel: Int,\n    override val sex: UserProfile.Sex,\n    override val sign: String,\n    override val friendGroupId: Int,\n) : Packet, UserProfile {\n    override fun toString(): String {\n        return \"UserProfile(nickname=$nickname, email=$email, age=$age, qLevel=$qLevel, sex=$sex, sign=$sign, friendGroupId=$friendGroupId)\"\n    }\n}\n\ninternal object SummaryCard {\n    internal object ReqSummaryCard : OutgoingPacketFactory<UserProfileImpl>(\n        \"SummaryCard.ReqSummaryCard\"\n    ) {\n        operator fun invoke(\n            client: QQAndroidClient,\n            uin: Long,\n        ) = buildOutgoingUniPacket(client) {\n            writeJceStruct(\n                RequestPacket.serializer(),\n                RequestPacket(\n                    funcName = \"ReqSummaryCard\",\n                    servantName = \"SummaryCardServantObj\",\n                    version = 3,\n                    sBuffer = jceRequestSBuffer {\n                        \"ReqHead\"(ReqHead.serializer(), ReqHead(2))\n                        \"ReqSummaryCard\"(\n                            JceReqSummaryCard.serializer(), JceReqSummaryCard(\n                                uin = uin,\n                                eComeFrom = 31,\n                                getControl = 69181,\n                                eAddFriendSource = 3001,\n                                vSecureSig = byteArrayOf(0x00),\n                                reqMedalWallInfo = 0,\n                                vReq0x5ebFieldId = listOf(\n                                    27225, 27224, 42122, 42121, 27236,\n                                    27238, 42167, 42172, 40324, 42284,\n                                    42326, 42325, 42356, 42363, 42361,\n                                    42367, 42377, 42425, 42505, 42488\n                                ),\n                                reqNearbyGodInfo = 1,\n                                reqExtendCard = 1,\n                            )\n                        )\n                    }\n                )\n            )\n        }\n\n        override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): UserProfileImpl {\n            val fullMap = readJceStruct(\n                RequestPacket.serializer()\n            ).sBuffer.read {\n                readJceStruct(RequestDataVersion2.serializer())\n            }.map\n            val map = fullMap[\"RespSummaryCard\"] ?: error(\"Missing RespSummaryCard in response\")\n            val pck = map[\"SummaryCard.RespSummaryCard\"]\n                ?: map[\"SummaryCard_Old.RespSummaryCard\"]\n                ?: error(\"No Response found\")\n            val response = pck.read {\n                discardExact(1)\n                Tars.UTF_8.load(JceRespSummaryCard.serializer(), this)\n            }\n\n            fun parseSignFromRichSign(): String? {\n                val vsign = response.vRichSign ?: return null\n                val richStatus = RichStatus.parseStatus(vsign)\n                val pt = richStatus.plainText\n                if (pt != null && pt.isNotEmpty()) {\n                    return pt.first()\n                }\n                return null\n            }\n\n            val sign = response.sign?.takeIf { it.isNotEmpty() }\n                ?: parseSignFromRichSign()\n                ?: \"\"\n            return UserProfileImpl(\n                nickname = response.nick ?: \"\",\n                email = response.email ?: \"\",\n                age = response.age?.let { it.toInt() and 0xFF } ?: -1,\n                qLevel = response.iLevel ?: -1,\n                sex = when (response.sex?.let { it.toInt() and 0xFF }) {\n                    0 -> UserProfile.Sex.MALE\n                    1 -> UserProfile.Sex.FEMALE\n                    else -> UserProfile.Sex.UNKNOWN\n                },\n                sign = sign,\n                friendGroupId = response.uFriendGroupId?.toInt() ?: 0\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/network/qimei/Qimei.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.qimei\n\nimport io.ktor.client.plugins.*\nimport io.ktor.client.request.*\nimport io.ktor.client.statement.*\nimport io.ktor.http.*\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.encodeToString\nimport kotlinx.serialization.json.Json\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.components.BotClientHolder\nimport net.mamoe.mirai.internal.network.components.HttpClientProvider\nimport net.mamoe.mirai.internal.network.components.SsoProcessorContext\nimport net.mamoe.mirai.internal.network.protocol\nimport net.mamoe.mirai.internal.utils.crypto.aesDecrypt\nimport net.mamoe.mirai.internal.utils.crypto.aesEncrypt\nimport net.mamoe.mirai.internal.utils.crypto.rsaEncryptWithX509PubKey\nimport net.mamoe.mirai.utils.*\nimport net.mamoe.mirai.utils.BotConfiguration.MiraiProtocol\nimport kotlin.random.Random\n\nprivate val secret = \"ZdJqM15EeO2zWc08\"\nprivate val rsaPubKey = \"\"\"\n-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEIxgwoutfwoJxcGQeedgP7FG9\nqaIuS0qzfR8gWkrkTZKM2iWHn2ajQpBRZjMSoSf6+KJGvar2ORhBfpDXyVtZCKpq\nLQ+FLkpncClKVIrBwv6PHyUvuCb0rIarmgDnzkfQAqVufEtR64iazGDKatvJ9y6B\n9NMbHddGSAUmRTCrHQIDAQAB\n-----END PUBLIC KEY-----\n\"\"\".trimIndent()\n\ninternal suspend fun QQAndroidBot.requestQimei(logger: MiraiLogger) {\n    val protocol = components[BotClientHolder].client.protocol\n    if (protocol.appKey.isEmpty()) return\n\n    val deviceInfo = components[SsoProcessorContext].device\n    val httpClient = components[HttpClientProvider].getHttpClient()\n\n    val seed = deviceInfo.guid.foldRight(0x6f4L) { curr, acc -> acc + curr.toLong() }\n    val random = Random(seed)\n\n    val reservedData = Json.encodeToString(\n        ReservedData(\n            harmony = \"0\",\n            clone = \"0\",\n            containe = \"\",\n            oz = \"UhYmelwouA+V2nPWbOvLTgN2/m8jwGB+yUB5v9tysQg=\",\n            oo = \"Xecjt+9S1+f8Pz2VLSxgpw==\",\n            kelong = \"0\",\n            uptimes = formatTime(currentTimeMillis() - random.nextLong(14_400_000), null),\n            multiUser = \"0\",\n            bod = deviceInfo.board.decodeToString(),\n            brd = deviceInfo.brand.decodeToString(),\n            dv = deviceInfo.device.decodeToString(),\n            firstLevel = \"\",\n            manufact = deviceInfo.brand.decodeToString(),\n            name = deviceInfo.model.decodeToString(),\n            host = \"se.infra\",\n            kernel = deviceInfo.procVersion.decodeToString(),\n        )\n    )\n\n    val yearMonthFormatted = formatTime(currentTimeMillis(), \"yyyy-MM-01\")\n    val rand1 = random.nextInt(899999) + 100000\n    val rand2 = random.nextInt(899999999) + 100000000\n\n    val beaconId = buildString {\n        (1..40).forEach { i ->\n            when (i) {\n                1, 2, 13, 14, 17, 18, 21, 22, 25, 26, 29, 30, 33, 34, 37, 38 -> {\n                    append('k')\n                    append(i)\n                    append(':')\n                    append(yearMonthFormatted)\n                    append(rand1)\n                    append('.')\n                    append(rand2)\n                }\n\n                3 -> append(\"k3:0000000000000000\")\n                4 -> {\n                    append(\"k4:\")\n                    append(getRandomString(16))\n                }\n\n                else -> {\n                    append('k')\n                    append(i)\n                    append(':')\n                    append(random.nextInt(10000))\n                }\n            }\n            append(';')\n        }\n    }\n\n    val payloadParam = Json.encodeToString(\n        DevicePayloadData(\n            androidId = deviceInfo.androidId.decodeToString(),\n            platformId = 1,\n            appKey = protocol.appKey,\n            appVersion = protocol.buildVer,\n            beaconIdSrc = beaconId,\n            brand = deviceInfo.brand.decodeToString(),\n            channelId = \"2017\",\n            cid = \"\",\n            imei = deviceInfo.imei,\n            imsi = \"\",\n            mac = deviceInfo.macAddress.decodeToString(),\n            model = deviceInfo.model.decodeToString(),\n            networkType = \"unknown\",\n            oaid = \"\",\n            osVersion = buildString {\n                append(\"Android \")\n                append(deviceInfo.version.release.decodeToString())\n                append(\", level \")\n                append(deviceInfo.version.sdk.toString())\n            },\n            qimei = \"\",\n            qimei36 = \"\",\n            sdkVersion = \"1.2.13.6\",\n            audit = \"\",\n            userId = \"{}\",\n            packageId = protocol.apkId,\n            deviceType = if (configuration.protocol == MiraiProtocol.ANDROID_PAD) \"Pad\" else \"Phone\",\n            sdkName = \"\",\n            reserved = reservedData,\n        )\n    ).toByteArray()\n\n    val aesKey = getRandomString(16).toByteArray()\n    val nonce = getRandomString(16)\n    val timestamp = currentTimeSeconds() * 1000\n\n    val encodedAESKey = rsaEncryptWithX509PubKey(aesKey, rsaPubKey, timestamp).encodeBase64()\n    val encodedPayloadParam = aesEncrypt(payloadParam, aesKey, aesKey).encodeBase64()\n\n    val payload = Json.encodeToString(\n        PostData(\n            key = encodedAESKey,\n            params = encodedPayloadParam,\n            time = timestamp,\n            nonce = nonce,\n            sign = buildString {\n                append(encodedAESKey)\n                append(encodedPayloadParam)\n                append(timestamp)\n                append(nonce)\n                append(secret)\n            }.md5().toUHexString(\"\"),\n            extra = \"\"\n        )\n    )\n\n    val resp = Json.decodeFromString(\n        OLAAndroidResp.serializer(),\n        httpClient.post(\"https://snowflake.qq.com/ola/android\") {\n            userAgent(buildString {\n                append(\"Dalvik/\")\n                append(dalvikVersions[deviceInfo.version.sdk] ?: \"2.1.0\")\n                append(\" (Linux; U; Android \")\n                append(deviceInfo.version.release.decodeToString())\n                append(\"; \")\n                append(deviceInfo.device.decodeToString())\n                append(\" Build/\")\n                append(deviceInfo.display.decodeToString())\n                append(\")\")\n            })\n            contentType(ContentType.Application.Json)\n            header(\"Cookie\", \"\")\n            setBody(payload.toByteArray())\n            timeout {\n                connectTimeoutMillis = 5000\n                requestTimeoutMillis = 5000\n                socketTimeoutMillis = 5000\n            }\n        }.bodyAsText()\n    )\n\n    if (resp.code != 0) {\n        logger.warning { \"Cannot get qimei from server, return code = ${resp.code}\" }\n        return\n    }\n\n    val decryptedData = aesDecrypt(resp.data.decodeBase64(), aesKey, aesKey)\n    val qimeiData = Json.decodeFromString(QimeiData.serializer(), decryptedData.decodeToString())\n\n    client.bot.components[SsoProcessorContext].let { context ->\n        context.qimei36 = qimeiData.q36\n        context.qimei16 = qimeiData.q16\n    }\n}\n\nprivate val dalvikVersions = mapOf(\n    14 to \"1.6\",\n    15 to \"1.6\",\n    16 to \"1.6\",\n    17 to \"1.6\",\n    18 to \"1.6\",\n    19 to \"2.0\",\n    20 to \"2.0\",\n    21 to \"2.1.0\",\n    22 to \"2.1.0\",\n    23 to \"2.1.0\",\n    24 to \"2.1.0\",\n    25 to \"2.1.0\",\n    26 to \"2.1.0\",\n    27 to \"2.1.0\",\n    28 to \"2.1.0\",\n    29 to \"2.1.0\",\n    30 to \"2.1.0\",\n    31 to \"2.1.0\",\n    32 to \"2.1.0\",\n    33 to \"2.1.0\",\n    34 to \"2.1.0\",\n)\n\n@Serializable\nprivate class OLAAndroidResp(\n    val code: Int,\n    val data: String,\n)\n\n@Serializable\nprivate class QimeiData(\n    val q16: String,\n    val q36: String,\n)\n\n@Suppress(\"unused\")\n@Serializable\nprivate class ReservedData(\n    val harmony: String,\n    val clone: String,\n    val containe: String,\n    val oz: String,\n    val oo: String,\n    val kelong: String,\n    val uptimes: String,\n    val multiUser: String,\n    val bod: String,\n    val brd: String,\n    val dv: String,\n    val firstLevel: String,\n    val manufact: String,\n    val name: String,\n    val host: String,\n    val kernel: String\n)\n\n@Suppress(\"unused\")\n@Serializable\nprivate class DevicePayloadData(\n    val androidId: String,\n    val platformId: Int,\n    val appKey: String,\n    val appVersion: String,\n    val beaconIdSrc: String,\n    val brand: String,\n    val channelId: String,\n    val cid: String,\n    val imei: String,\n    val imsi: String,\n    val mac: String,\n    val model: String,\n    val networkType: String,\n    val oaid: String,\n    val osVersion: String,\n    val qimei: String,\n    val qimei36: String,\n    val sdkVersion: String,\n    val audit: String,\n    val userId: String,\n    val packageId: String,\n    val deviceType: String,\n    val sdkName: String,\n    val reserved: String\n)\n\n@Suppress(\"unused\")\n@Serializable\nprivate class PostData(\n    val key: String,\n    val params: String,\n    val time: Long,\n    val nonce: String,\n    val sign: String,\n    val extra: String\n)\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/pipeline/ProcessorPipeline.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.pipeline\n\nimport net.mamoe.mirai.internal.message.contextualBugReportException\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocolFacade\nimport net.mamoe.mirai.internal.network.components.NoticeProcessor\nimport net.mamoe.mirai.utils.*\nimport kotlin.jvm.JvmInline\n\ninternal interface Processor<C : ProcessorPipelineContext<D, *>, D> : PipelineConsumptionMarker {\n    val origin: Any get() = this\n\n    suspend fun process(context: C, data: D)\n}\n\n/**\n * # Processor Pipeline Architecture\n *\n *\n */\ninternal interface ProcessorPipeline<P : Processor<C, D>, C : ProcessorPipelineContext<D, R>, D, R> {\n    val processors: MutableCollection<ProcessorBox<P>>\n\n    fun interface DisposableRegistry : Closeable {\n        fun dispose()\n\n        override fun close() {\n            dispose()\n        }\n    }\n\n    fun registerProcessor(processor: P): DisposableRegistry // after\n\n    fun registerBefore(processor: P): DisposableRegistry\n\n    fun createContext(data: D, attributes: TypeSafeMap): C\n\n    /**\n     * Process using the [context].\n     *\n     * **Note:** This function may or may not re-throw exception caught when calling the [processors].\n     * @see AbstractProcessorPipeline.handleExceptionInProcess\n     */\n    suspend fun process(\n        data: D,\n        context: C,\n        attributes: TypeSafeMap = TypeSafeMap.EMPTY,\n    ): ProcessResult<C, R>\n\n    /**\n     * Process with a new [context][C]\n     *\n     * **Note:** This function may or may not re-throw exception caught when calling the [processors].\n     * @see AbstractProcessorPipeline.handleExceptionInProcess\n     */\n    suspend fun process(\n        data: D,\n        attributes: TypeSafeMap = TypeSafeMap.EMPTY\n    ): ProcessResult<C, R>\n}\n\ninternal inline fun <P : Processor<*, *>, Pip : ProcessorPipeline<P, *, *, *>> Pip.replaceProcessor(\n    predicate: (origin: Any) -> Boolean,\n    processor: P\n): Boolean {\n    for (box in processors) {\n        val value = box.value\n        if (predicate(value.origin)) {\n            box.value = processor\n            return true\n        }\n    }\n    return false\n}\n\n\n/**\n * Boxes a mutable property.\n */\n// data used for equality\ninternal data class ProcessorBox<P : Processor<*, *>>(\n    var value: P\n)\n\n/**\n * Returned from entry point methods in [MessageProtocolFacade].\n */\n// data used for destruction, don't change parameter ordering\ninternal data class ProcessResult<C : ProcessorPipelineContext<*, R>, R>(\n    val context: C,\n    val collected: Collection<R>,\n)\n\n\n// Box the\n@JvmInline\ninternal value class MutablePipelineResult<R>(\n    val data: MutableCollection<R>\n)\n\n\n/**\n * Marks a class that is allowed to call [ProcessorPipelineContext.markAsConsumed]\n */\ninternal interface PipelineConsumptionMarker\n\ninternal interface ProcessorPipelineContext<D, R> {\n\n    /**\n     * Child processes ([processAlso]) will inherit [attributes] from its parent, while any other properties from the context will not.\n     */\n    val attributes: TypeSafeMap\n\n    val collected: MutablePipelineResult<R>\n\n    // DSL to simplify some expressions\n    operator fun MutablePipelineResult<R>.plusAssign(result: R?) {\n        if (result != null) collect(result)\n    }\n\n\n    /**\n     * Collect a result.\n     */\n    fun collect(result: R)\n\n    /**\n     * Collect results.\n     */\n    fun collect(results: Iterable<R>)\n\n\n    val isConsumed: Boolean\n\n    /**\n     * Marks the input as consumed so that there will not be warnings like 'Unknown type xxx'.\n     *\n     * **This may or may not stop the pipeline — it's implementation-specific. Check pipeline's [AbstractProcessorPipeline.configuration] ([PipelineConfiguration.stopWhenConsumed]).**\n     *\n     * You need to invoke [markAsConsumed] if your implementation includes some `else` branch which covers all situations,\n     * and throws a [contextualBugReportException] or logs something.\n     */\n    @ConsumptionMarker\n    fun PipelineConsumptionMarker.markAsConsumed(marker: Any = this)\n\n    /**\n     * Marks the input as not consumed, if it was marked by this [NoticeProcessor].\n     */\n    @ConsumptionMarker\n    fun PipelineConsumptionMarker.markNotConsumed(marker: Any = this)\n\n    @DslMarker\n    annotation class ConsumptionMarker // to give an explicit color.\n\n    /**\n     * Fire the [data] into this processor pipeline, starting from the beginning, and collect the results to current [collected].\n     *\n     * **Please note different [ProcessorPipeline]s' [processAlso] may have different behavior. ALWAYS check implementation!**\n     *\n     * @param extraAttributes extra attributes\n     * @return result collected from processors. This would also have been collected to this context (where you call [processAlso]).\n     */\n    suspend fun processAlso(\n        data: D,\n        extraAttributes: TypeSafeMap = TypeSafeMap.EMPTY\n    ): ProcessResult<out ProcessorPipelineContext<D, R>, R>\n}\n\ninternal abstract class AbstractProcessorPipelineContext<D, R>(\n    override val attributes: TypeSafeMap,\n    private val traceLogging: MiraiLogger,\n) : ProcessorPipelineContext<D, R> {\n    private val consumers: ArrayDeque<Any> = ArrayDeque()\n\n    override val isConsumed: Boolean get() = consumers.isNotEmpty()\n    override fun PipelineConsumptionMarker.markAsConsumed(marker: Any) {\n        traceLogging.info { \"markAsConsumed: marker=$marker\" }\n        consumers.addFirst(marker)\n    }\n\n    override fun PipelineConsumptionMarker.markNotConsumed(marker: Any) {\n        if (consumers.firstOrNull() === marker) {\n            consumers.removeFirst()\n            traceLogging.info { \"markNotConsumed: Y, marker=$marker\" }\n        } else {\n            traceLogging.info { \"markNotConsumed: N, marker=$marker\" }\n        }\n    }\n\n    override val collected: MutablePipelineResult<R> = MutablePipelineResult(ConcurrentLinkedDeque())\n\n    override fun collect(result: R) {\n        collected.data.add(result)\n        traceLogging.info { \"collect: $result\" }\n    }\n\n    override fun collect(results: Iterable<R>) {\n        this.collected.data.addAll(results)\n        traceLogging.info { \"collect: $results\" }\n    }\n}\n\ninternal class PipelineConfiguration(\n    var stopWhenConsumed: Boolean\n)\n\n/**\n * Basic implementation of [ProcessorPipeline].\n * [configuration] used to control behaviors.\n * [traceLogging] will always be called frequently, but you can pass a [SilentLogger] or disable the logging levels.\n */\ninternal abstract class AbstractProcessorPipeline<P : Processor<C, D>, C : ProcessorPipelineContext<D, R>, D, R>\nprotected constructor(\n    val configuration: PipelineConfiguration,\n    val traceLogging: MiraiLogger,\n) : ProcessorPipeline<P, C, D, R> {\n    constructor(configuration: PipelineConfiguration) : this(configuration, SilentLogger)\n\n    /**\n     * Must be ordered\n     */\n    override val processors: MutableDeque<ProcessorBox<P>> = ConcurrentLinkedDeque()\n\n    override fun registerProcessor(processor: P): ProcessorPipeline.DisposableRegistry {\n        val box = ProcessorBox(processor)\n        processors.add(box)\n        return ProcessorPipeline.DisposableRegistry {\n            processors.remove(box)\n        }\n    }\n\n    override fun registerBefore(processor: P): ProcessorPipeline.DisposableRegistry {\n        val box = ProcessorBox(processor)\n        processors.addFirst(box)\n        return ProcessorPipeline.DisposableRegistry {\n            processors.remove(box)\n        }\n    }\n\n    abstract inner class BaseContextImpl(\n        attributes: TypeSafeMap,\n    ) : AbstractProcessorPipelineContext<D, R>(attributes, traceLogging) {\n        override suspend fun processAlso(\n            data: D,\n            extraAttributes: TypeSafeMap\n        ): ProcessResult<out ProcessorPipelineContext<D, R>, R> {\n            traceLogging.info { \"processAlso: data=${data.structureToStringAndDesensitizeIfAvailable()}\" }\n            traceLogging.info { \"extraAttributes = $extraAttributes\" }\n            val newAttributes = this.attributes + extraAttributes\n            traceLogging.info { \"newAttributes = $newAttributes\" }\n            return process(data, newAttributes).also {\n                this.collected.data += it.collected\n                traceLogging.info { \"processAlso: result=$it\" }\n            }\n        }\n    }\n\n    protected open fun handleExceptionInProcess(\n        data: D,\n        context: C,\n        attributes: TypeSafeMap,\n        processor: P,\n        e: Throwable\n    ): Unit = throw e\n\n    override suspend fun process(data: D, attributes: TypeSafeMap): ProcessResult<C, R> {\n        return process(data, createContext(data, attributes), attributes)\n    }\n\n    override suspend fun process(data: D, context: C, attributes: TypeSafeMap): ProcessResult<C, R> {\n        traceLogging.info { \"process: data=${data.structureToStringAndDesensitizeIfAvailable()}\" }\n\n        val diff = if (traceLogging.isEnabled) CollectionDiff<R>() else null\n        diff?.save(context.collected.data)\n\n        for ((processor) in processors) {\n\n            val result = kotlin.runCatching {\n                processor.process(context, data)\n            }.onFailure { e ->\n                handleExceptionInProcess(data, context, attributes, processor, e)\n            }\n\n            diff?.run {\n                val diffPackets = subtractAndSave(context.collected.data)\n\n                traceLogging.info {\n                    \"Finished ${\n                        processor.toString().replace(\"net.mamoe.mirai.internal.network.notice.\", \"\")\n                    }, success=${result.isSuccess}, consumed=${context.isConsumed}, diff=$diffPackets\"\n                }\n            }\n\n            if (context.isConsumed && configuration.stopWhenConsumed) {\n                traceLogging.info { \"stopWhenConsumed=true, stopped.\" }\n\n                break\n            }\n        }\n        return ProcessResult(context, context.collected.data)\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/spi/EncryptService.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n\npackage net.mamoe.mirai.internal.spi\n\nimport kotlinx.coroutines.CoroutineScope\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.spi.BaseService\nimport net.mamoe.mirai.spi.SpiServiceLoader\nimport net.mamoe.mirai.utils.*\n\n\n/**\n * @since 2.15.0\n */\npublic class EncryptServiceContext @MiraiInternalApi constructor(\n    /**\n     * [Bot.id]\n     */\n    public val id: Long,\n    public val extraArgs: TypeSafeMap = TypeSafeMap.EMPTY\n) {\n    public companion object {\n        public val KEY_COMMAND_STR: TypeKey<String> = TypeKey(\"KEY_COMMAND_STR\")\n        public val KEY_BOT_PROTOCOL: TypeKey<BotConfiguration.MiraiProtocol> = TypeKey(\"BOT_PROTOCOL\")\n        public val KEY_CHANNEL_PROXY: TypeKey<EncryptService.ChannelProxy> = TypeKey(\"KEY_CHANNEL_PROXY\")\n        public val KEY_DEVICE_INFO: TypeKey<DeviceInfo> = TypeKey(\"KEY_DEVICE_INFO\")\n        public val KEY_QIMEI36: TypeKey<String> = TypeKey(\"KEY_QIMEI36\")\n        public val KEY_BOT_WORKING_DIR: TypeKey<String> = TypeKey(\"KEY_BOT_WORKING_DIR\")\n        public val KEY_BOT_CACHING_DIR: TypeKey<String> = TypeKey(\"KEY_BOT_CACHING_DIR\")\n    }\n}\n\n/**\n * @since 2.15.0\n */\npublic interface EncryptService {\n    public fun initialize(context: EncryptServiceContext)\n\n    /**\n     * Returns `false` if not supported.\n     */\n    public fun supports(protocol: BotConfiguration.MiraiProtocol): Boolean {\n        return protocol != BotConfiguration.MiraiProtocol.ANDROID_WATCH\n    }\n\n    /**\n     * Returns `null` if encrypt fail.\n     */\n    public fun encryptTlv(\n        context: EncryptServiceContext,\n        tlvType: Int,\n        payload: ByteArray, // Do not write to payload\n    ): ByteArray?\n\n    public fun qSecurityGetSign(\n        context: EncryptServiceContext,\n        sequenceId: Int,\n        commandName: String,\n        payload: ByteArray\n    ): SignResult?\n\n    public class SignResult(\n        public val sign: ByteArray = EMPTY_BYTE_ARRAY,\n        public val token: ByteArray = EMPTY_BYTE_ARRAY,\n        public val extra: ByteArray = EMPTY_BYTE_ARRAY,\n    )\n\n    public class ChannelResult(\n        public val cmd: String,\n        public val data: ByteArray,\n    )\n\n    public interface ChannelProxy {\n        public suspend fun sendMessage(remark: String, commandName: String, uin: Long, data: ByteArray): ChannelResult?\n    }\n\n    // net.mamoe.mirai.internal.spi.EncryptService$Factory\n    public interface Factory : BaseService {\n\n        /*\n         * cleanup:\n         *         serviceSubScope.coroutineContext.job.invokeOnCompletion { }\n         */\n        public fun createForBot(context: EncryptServiceContext, serviceSubScope: CoroutineScope): EncryptService\n    }\n\n\n    public companion object {\n\n        private val loader = SpiServiceLoader(Factory::class)\n\n        private val warningAlert: Unit by lazy {\n            val log = MiraiLogger.Factory.create(EncryptService::class, \"EncryptService.alert\")\n\n            val serviceUsed = loader.service\n\n            if (serviceUsed != null) {\n                val serviceClass = serviceUsed.javaClass\n                log.warning { \"Encrypt service was loaded: $serviceUsed\" }\n                log.warning { \"All outgoing message may be leaked by this service.\" }\n                log.warning { \"Use this service if and only if you trusted this service and the service provider.\" }\n                log.warning { \"Service details:\" }\n                log.warning { \"  `- Jvm Class: $serviceClass\" }\n                log.warning { \"  `- ClassLoader: \" + serviceClass.classLoader }\n                log.warning { \"  `- Source: \" + serviceClass.protectionDomain?.codeSource?.location }\n                log.warning { \"  `- Protected Domain: \" + serviceClass.protectionDomain }\n            }\n\n        }\n\n        internal val factory: Factory?\n            get() {\n                warningAlert\n                return loader.service\n            }\n    }\n\n    // special error: no service used\n    public object SignalServiceNotAvailable : RuntimeException()\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/AtomicIntSeq.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n// IDE doesn't show warnings but compiler do.\n@file:Suppress(\"NOTHING_TO_INLINE\", \"KotlinRedundantDiagnosticSuppress\")\n\npackage net.mamoe.mirai.internal.utils\n\nimport kotlinx.atomicfu.AtomicInt\nimport kotlinx.atomicfu.atomic\nimport kotlinx.atomicfu.update\nimport net.mamoe.mirai.utils.getRandomUnsignedInt\nimport kotlin.jvm.JvmStatic\n\ninternal object AtomicIntSeq {\n    @JvmStatic\n    fun forMessageSeq(): AtomicIntMaxSeq = AtomicIntMaxSeq(0)\n\n    @JvmStatic\n    fun forPrivateSync(): AtomicInt65535Seq = AtomicInt65535Seq(getRandomUnsignedInt())\n}\n\n// value classes to optimize space\n\ninternal class AtomicIntMaxSeq(\n    value: Int\n) {\n    private val value: AtomicInt = atomic(value)\n\n    /**\n     * Increment [value] within the range from `0` (inclusive) to [Int.MAX_VALUE] (exclusive).\n     */\n    inline fun next(): Int = value.incrementAndGet().mod(Int.MAX_VALUE)\n\n    /**\n     * Atomically update [value] if it is smaller than [new].\n     *\n     * @param new should be positive\n     */\n    inline fun updateIfSmallerThan(new: Int): Boolean {\n        value.update { instant ->\n            if (instant < new) new else return false\n        }\n        return true\n    }\n\n    /**\n     * Atomically update [value] if it different with [new].\n     *\n     * @param new should be positive\n     */\n    inline fun updateIfDifferentWith(new: Int): Boolean {\n        value.update { instant ->\n            if (instant == new) return false\n            new\n        }\n        return true\n    }\n}\n\ninternal class AtomicInt65535Seq(\n    value: Int\n) {\n    private val value: AtomicInt = atomic(value)\n\n    /**\n     * Increment [value] within the range from `0` (inclusive) to `65535` (exclusive).\n     */\n    inline fun next(): Int = value.incrementAndGet().mod(65535)\n\n    /**\n     * Atomically update [value] if it is smaller than [new].\n     *\n     * @param new should be positive\n     */\n    inline fun updateIfSmallerThan(new: Int): Boolean {\n        value.update { instant ->\n            if (instant < new) new else return false\n        }\n        return true\n    }\n\n    /**\n     * Atomically update [value] if it different with [new].\n     *\n     * @param new should be positive\n     */\n    inline fun updateIfDifferentWith(new: Int): Boolean {\n        value.update { instant ->\n            if (instant == new) return false\n            new\n        }\n        return true\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/BotConfigurationExt.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmName(\"BotConfigurationExt_common\")\n\npackage net.mamoe.mirai.internal.utils\n\nimport net.mamoe.mirai.utils.BotConfiguration\nimport net.mamoe.mirai.utils.MiraiFile\nimport net.mamoe.mirai.utils.resolveCreateFile\nimport net.mamoe.mirai.utils.resolveMkdir\nimport kotlin.jvm.JvmName\n\n\ninternal expect val BotConfiguration.workingDirPath: String\n\n/*\nNote: Required the written path,\n      NOT the resolved (absolute) path.\n      See: #2160\n*/\ninternal expect val BotConfiguration.cacheDirPath: String\n\ninternal fun BotConfiguration.actualCacheDir(): MiraiFile = MiraiFile.create(workingDirPath).resolveMkdir(cacheDirPath)\ninternal fun BotConfiguration.contactCacheDir(): MiraiFile = actualCacheDir().resolveMkdir(\"contacts\")\ninternal fun BotConfiguration.friendCacheFile(): MiraiFile = contactCacheDir().resolveCreateFile(\"friends.json\")\ninternal fun BotConfiguration.groupCacheDir(): MiraiFile = contactCacheDir().resolveMkdir(\"groups\")\ninternal fun BotConfiguration.groupCacheFile(groupId: Long): MiraiFile =\n    groupCacheDir().resolveCreateFile(\"$groupId.json\")\n\ninternal fun BotConfiguration.accountSecretsFile(): MiraiFile = actualCacheDir().resolve(\"account.secrets\")"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/ExternalResourceImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport net.mamoe.mirai.utils.ExternalResource\n\n@Suppress(\"FunctionName\")\ninternal expect fun CombinedExternalResource(vararg resources: ExternalResource): ExternalResource"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/FileSystem.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\n// internal for tests\ninternal object FileSystem {\n    fun checkLegitimacy(path: String) {\n        val char = path.firstOrNull { it in \"\"\":*?\"<>|\"\"\" }\n        if (char != null) {\n            throw IllegalArgumentException(\"\"\"Chars ':*?\"<>|' are not allowed in path. RemoteFile path contains illegal char: '$char'. path='$path'\"\"\")\n        }\n    }\n\n    fun isLegal(path: String): Boolean {\n        return path.firstOrNull { it in \"\"\":*?\"<>|\"\"\" } == null\n    }\n\n    fun normalize(path: String): String {\n        checkLegitimacy(path)\n        return path.replace('\\\\', '/')\n    }\n\n    // net.mamoe.mirai.internal.utils.internal.utils.FileSystemTest\n\n    fun normalize(parent: String, name: String): String {\n        var nName = normalize(name)\n        if (nName.startsWith('/')) return nName // absolute path then ignore parent\n        nName = nName.removeSuffix(\"/\")\n\n        var nParent = normalize(parent)\n        if (nParent == \"/\") return \"/$nName\"\n        if (!nParent.startsWith('/')) nParent = \"/$nParent\"\n\n        val slash = nName.indexOf('/')\n        if (slash != -1) {\n            nParent += '/' + nName.substring(0, slash)\n            nName = nName.substring(slash + 1)\n        }\n\n        return \"$nParent/$nName\"\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/FragmentedMsgParsingCache.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport kotlinx.atomicfu.locks.reentrantLock\nimport kotlinx.atomicfu.locks.withLock\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgOnlinePush\nimport net.mamoe.mirai.utils.currentTimeMillis\n\n/**\n * fragmented message\n */\ninternal abstract class FragmentedMsgParsingCache<T> {\n    class PkgMsg<T>(\n        val size: Int,\n        val divSeq: Int,\n        val data: MutableMap<Int, T>,\n    ) {\n        val createTime = currentTimeMillis()\n    }\n\n    private val deque = ArrayList<PkgMsg<T>>(16)\n    private val accessLock = reentrantLock()\n    private fun clearInvalid() {\n        deque.removeAll {\n            currentTimeMillis() - it.createTime > 10000L\n        }\n    }\n\n    internal abstract val T.contentHead: MsgComm.ContentHead?\n\n    fun tryMerge(msg: T): List<T> {\n        val head = msg.contentHead ?: return listOf(msg)\n        val size = head.pkgNum\n        if (size < 2) return listOf(msg)\n        accessLock.withLock {\n            clearInvalid()\n            val seq = head.divSeq\n            val index = head.pkgIndex\n            val pkgMsg = deque.find {\n                it.divSeq == seq\n            } ?: PkgMsg<T>(size, seq, mutableMapOf()).also { deque.add(it) }\n            pkgMsg.data[index] = msg\n            if (pkgMsg.data.size == pkgMsg.size) {\n                deque.removeAll { it.divSeq == seq }\n                return pkgMsg.data.entries.asSequence()\n                    .sortedBy { it.key }\n                    .map { it.value }\n                    .toList()\n            }\n            return emptyList()\n        }\n    }\n}\n\n/**\n * fragmented message\n */\ninternal class GroupPkgMsgParsingCache : FragmentedMsgParsingCache<MsgOnlinePush.PbPushMsg>() {\n    override val MsgOnlinePush.PbPushMsg.contentHead: MsgComm.ContentHead?\n        get() = this.msg.contentHead\n}\n\n/**\n * fragmented message\n */\ninternal class C2CPkgMsgParsingCache : FragmentedMsgParsingCache<MsgComm.Msg>() {\n    @Suppress(\"EXTENSION_SHADOWED_BY_MEMBER\")\n    override val MsgComm.Msg.contentHead: MsgComm.ContentHead?\n        get() = this.contentHead\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/GuidSource.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport kotlin.jvm.JvmInline\nimport kotlin.jvm.JvmStatic\n\n/**\n * GUID 来源\n *\n * 0: 初始值;\n * 1: 以前保存的文件;\n * 20: 以前没保存且现在生成失败;\n * 17: 以前没保存但现在生成成功;\n */\n@Suppress(\"NON_PUBLIC_PRIMARY_CONSTRUCTOR_OF_INLINE_CLASS\")\n@JvmInline\ninternal value class GuidSource private constructor(val id: Long) { // uint actually\n    companion object {\n        /**\n         * 初始值\n         */\n        @JvmStatic\n        val STUB = GuidSource(0)\n\n        /**\n         *\n         */\n        @JvmStatic\n        val NEWLY_GENERATED = GuidSource(17)\n\n        /**\n         * 以前没保存但现在生成成功\n         */\n        @JvmStatic\n        val FROM_STORAGE = GuidSource(1)\n\n        /**\n         * 以前没保存且现在生成失败\n         */\n        @JvmStatic\n        val UNAVAILABLE = GuidSource(20)\n    }\n}\n\n/**\n * ```java\n * GUID_FLAG = 0;\n * GUID_FLAG |= GUID_SRC << 24 & 0xFF000000;\n * GUID_FLAG |= FLAG_MAC_ANDROIDID_GUID_CHANGE << 8 & 0xFF00;\n * ```\n *\n * FLAG_MAC_ANDROIDID_GUID_CHANGE:\n * ```java\n * if (!Arrays.equals(currentMac, get_last_mac)) {\n *     oicq.wlogin_sdk.request.t.FLAG_MAC_ANDROIDID_GUID_CHANGEMENT |= 0x1;\n * }\n * if (!Arrays.equals(currentAndroidId, get_last_android_id)) {\n *     oicq.wlogin_sdk.request.t.FLAG_MAC_ANDROIDID_GUID_CHANGEMENT |= 0x2;\n * }\n * if (!Arrays.equals(currentGuid, get_last_guid)) {\n *     oicq.wlogin_sdk.request.t.FLAG_MAC_ANDROIDID_GUID_CHANGEMENT |= 0x4;\n * }\n * ```\n */\ninternal fun guidFlag(\n    guidSource: GuidSource,\n    macOrAndroidIdChangeFlag: MacOrAndroidIdChangeFlag,\n): Long {\n    var flag = 0L\n    flag = flag or (guidSource.id shl 24 and 0xFF000000)\n    flag = flag or (macOrAndroidIdChangeFlag.value shl 8 and 0xFF00)\n    return flag\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/ImagePatcher.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport net.mamoe.mirai.internal.contact.GroupImpl\nimport net.mamoe.mirai.internal.message.image.FriendImage\nimport net.mamoe.mirai.internal.message.image.OfflineGroupImage\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.image.ImgStore\nimport net.mamoe.mirai.utils.ResourceAccessLock\nimport net.mamoe.mirai.utils.UnsafeMutableNonNullProperty\nimport net.mamoe.mirai.utils.currentTimeMillis\nimport net.mamoe.mirai.utils.unsafeMutableNonNullPropertyOf\n\ninternal interface ImagePatcher {\n    fun findCacheByImageId(id: String): ImageCache?\n\n    fun putCache(image: OfflineGroupImage)\n\n    suspend fun patchOfflineGroupImage(\n        group: GroupImpl,\n        image: OfflineGroupImage,\n    )\n\n    suspend fun patchFriendImageToGroupImage(\n        group: GroupImpl,\n        image: FriendImage,\n    ): OfflineGroupImage\n\n    companion object : ComponentKey<ImagePatcher>\n}\n\ninternal data class ImageCache(\n    var updateTime: Long = 0,\n    val id: UnsafeMutableNonNullProperty<String> = unsafeMutableNonNullPropertyOf(),\n    // OGI: OfflineGroupImage\n    val cacheOGI: UnsafeMutableNonNullProperty<OfflineGroupImage> = unsafeMutableNonNullPropertyOf(),\n    val accessLock: ResourceAccessLock = ResourceAccessLock(),\n)\n\ninternal inline fun <T> ImageCache.withCache(action: (ImageCache) -> T): T {\n    return try {\n        action(this)\n    } finally {\n        this.accessLock.release()\n    }\n}\n\n\ninternal open class ImagePatcherImpl : ImagePatcher {\n    val caches: Array<ImageCache> = Array(20) { ImageCache() }\n\n    fun findCache(id: String): ImageCache? {\n        return caches.firstOrNull { it.id.value0 == id && it.accessLock.tryUse() }\n    }\n\n    override fun findCacheByImageId(id: String): ImageCache? = findCache(calcInternalIdByImageId(id))\n\n    override fun putCache(image: OfflineGroupImage) {\n        putCache(calcInternalIdByImageId(image.imageId)).cacheOGI.value0 = image\n    }\n\n    fun putCache(id: String): ImageCache {\n        fun ImageCache.postReturn(): ImageCache = also { cache ->\n            cache.updateTime = currentTimeMillis()\n            cache.id.value0 = id\n        }\n\n        caches.forEach { exists ->\n            if (exists.id.value0 == id && exists.accessLock.tryInitialize()) {\n                return exists.postReturn()\n            }\n        }\n\n        // Try to use existing slot\n        caches.forEach { exists ->\n            if (exists.accessLock.tryInitialize()) {\n                return exists.postReturn()\n            }\n        }\n\n        val availableCaches = caches.filter { it.accessLock.lockIfNotUsing() }\n        if (availableCaches.isNotEmpty()) {\n            val target = availableCaches.minByOrNull { it.updateTime }!!\n            availableCaches.forEach { if (it !== target) it.accessLock.unlock() }\n\n            target.accessLock.setInitialized()\n            return target.postReturn()\n        }\n\n        // No available sort. Force to override the last one\n        val newCache = ImageCache()\n        newCache.accessLock.setInitialized()\n        newCache.postReturn()\n\n        var idx = 0\n        var lupd = Long.MAX_VALUE\n        caches.forEachIndexed { index, imageCache ->\n            val upd0 = imageCache.updateTime\n            if (upd0 < lupd) {\n                lupd = upd0\n                idx = index\n            }\n        }\n        caches[idx] = newCache\n\n        return newCache\n    }\n\n    private fun calcInternalIdByImageId(imageId: String): String {\n        return imageId.substring(1, imageId.indexOf('}'))\n    }\n\n    override suspend fun patchOfflineGroupImage(\n        group: GroupImpl,\n        image: OfflineGroupImage,\n    ) {\n        if (image.fileId != null) return\n        val iid = calcInternalIdByImageId(image.imageId)\n        findCache(iid)?.withCache { cache ->\n            cache.cacheOGI.value0?.let { cachedOGI ->\n                image.fileId = cachedOGI.fileId\n                return\n            }\n        }\n\n        val bot = group.bot\n\n        val response: ImgStore.GroupPicUp.Response = bot.network.sendAndExpect(\n            ImgStore.GroupPicUp(\n                bot.client,\n                uin = bot.id,\n                groupCode = group.id,\n                md5 = image.md5,\n                size = 1,\n            )\n        )\n\n        when (response) {\n            is ImgStore.GroupPicUp.Response.Failed -> {\n                image.fileId = 0 // Failed\n            }\n            is ImgStore.GroupPicUp.Response.FileExists -> {\n                image.fileId = response.fileId.toInt()\n            }\n            is ImgStore.GroupPicUp.Response.RequireUpload -> {\n                image.fileId = response.fileId.toInt()\n            }\n        }\n\n        putCache(iid).cacheOGI.value0 = image\n    }\n\n    /**\n     * Ensures server holds the cache\n     */\n    override suspend fun patchFriendImageToGroupImage(\n        group: GroupImpl,\n        image: FriendImage,\n    ): OfflineGroupImage {\n        val iid = calcInternalIdByImageId(image.imageId)\n        findCache(iid)?.withCache { cache ->\n            cache.cacheOGI.value0?.let { return it }\n        }\n\n        val bot = group.bot\n\n        val response = bot.network.sendAndExpect(\n            ImgStore.GroupPicUp(\n                bot.client,\n                uin = bot.id,\n                groupCode = group.id,\n                md5 = image.md5,\n                size = image.size\n            )\n        )\n\n        return OfflineGroupImage(\n            imageId = image.imageId,\n            width = image.width,\n            height = image.height,\n            size = if (response is ImgStore.GroupPicUp.Response.FileExists) {\n                response.fileInfo.fileSize\n            } else {\n                image.size\n            },\n            imageType = image.imageType\n        ).also { img ->\n            when (response) {\n                is ImgStore.GroupPicUp.Response.FileExists -> {\n                    img.fileId = response.fileId.toInt()\n                }\n                is ImgStore.GroupPicUp.Response.RequireUpload -> {\n                    img.fileId = response.fileId.toInt()\n                }\n                is ImgStore.GroupPicUp.Response.Failed -> {\n                    img.fileId = 0\n                }\n            }\n        }.also { img ->\n            putCache(iid).cacheOGI.value0 = img\n        }\n    }\n\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/MiraiCoreServices.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport net.mamoe.mirai.internal.event.InternalEventMechanism\nimport net.mamoe.mirai.utils.Services\n\ninternal object MiraiCoreServices {\n\n    @Suppress(\"RemoveRedundantQualifierName\")\n    @OptIn(InternalEventMechanism::class)\n    fun registerAll() {\n        Services.register(\n            \"net.mamoe.mirai.event.InternalGlobalEventChannelProvider\",\n            \"net.mamoe.mirai.internal.event.GlobalEventChannelProviderImpl\"\n        ) { net.mamoe.mirai.internal.event.GlobalEventChannelProviderImpl() }\n\n        Services.register(\n            \"net.mamoe.mirai.IMirai\",\n            \"net.mamoe.mirai.IMirai\"\n        ) { net.mamoe.mirai.internal.MiraiImpl() }\n\n        val msgProtocol = \"net.mamoe.mirai.internal.message.protocol.MessageProtocol\"\n\n        Services.register(\n            msgProtocol,\n            \"net.mamoe.mirai.internal.message.protocol.impl.AudioProtocol\"\n        ) { net.mamoe.mirai.internal.message.protocol.impl.AudioProtocol() }\n        Services.register(\n            msgProtocol,\n            \"net.mamoe.mirai.internal.message.protocol.impl.CustomMessageProtocol\"\n        ) { net.mamoe.mirai.internal.message.protocol.impl.CustomMessageProtocol() }\n        Services.register(\n            msgProtocol,\n            \"net.mamoe.mirai.internal.message.protocol.impl.FaceProtocol\"\n        ) { net.mamoe.mirai.internal.message.protocol.impl.FaceProtocol() }\n        Services.register(\n            msgProtocol,\n            \"net.mamoe.mirai.internal.message.protocol.impl.FileMessageProtocol\"\n        ) { net.mamoe.mirai.internal.message.protocol.impl.FileMessageProtocol() }\n        Services.register(\n            msgProtocol,\n            \"net.mamoe.mirai.internal.message.protocol.impl.FlashImageProtocol\"\n        ) { net.mamoe.mirai.internal.message.protocol.impl.FlashImageProtocol() }\n        Services.register(\n            msgProtocol,\n            \"net.mamoe.mirai.internal.message.protocol.impl.IgnoredMessagesProtocol\"\n        ) { net.mamoe.mirai.internal.message.protocol.impl.IgnoredMessagesProtocol() }\n        Services.register(\n            msgProtocol,\n            \"net.mamoe.mirai.internal.message.protocol.impl.ImageProtocol\"\n        ) { net.mamoe.mirai.internal.message.protocol.impl.ImageProtocol() }\n        Services.register(\n            msgProtocol,\n            \"net.mamoe.mirai.internal.message.protocol.impl.MarketFaceProtocol\"\n        ) { net.mamoe.mirai.internal.message.protocol.impl.MarketFaceProtocol() }\n        Services.register(\n            msgProtocol,\n            \"net.mamoe.mirai.internal.message.protocol.impl.SuperFaceProtocol\"\n        ) { net.mamoe.mirai.internal.message.protocol.impl.SuperFaceProtocol() }\n        Services.register(\n            msgProtocol,\n            \"net.mamoe.mirai.internal.message.protocol.impl.MusicShareProtocol\"\n        ) { net.mamoe.mirai.internal.message.protocol.impl.MusicShareProtocol() }\n        Services.register(\n            msgProtocol,\n            \"net.mamoe.mirai.internal.message.protocol.impl.PokeMessageProtocol\"\n        ) { net.mamoe.mirai.internal.message.protocol.impl.PokeMessageProtocol() }\n        Services.register(\n            msgProtocol,\n            \"net.mamoe.mirai.internal.message.protocol.impl.PttMessageProtocol\"\n        ) { net.mamoe.mirai.internal.message.protocol.impl.PttMessageProtocol() }\n        Services.register(\n            msgProtocol,\n            \"net.mamoe.mirai.internal.message.protocol.impl.QuoteReplyProtocol\"\n        ) { net.mamoe.mirai.internal.message.protocol.impl.QuoteReplyProtocol() }\n        Services.register(\n            msgProtocol,\n            \"net.mamoe.mirai.internal.message.protocol.impl.RichMessageProtocol\"\n        ) { net.mamoe.mirai.internal.message.protocol.impl.RichMessageProtocol() }\n        Services.register(\n            msgProtocol,\n            \"net.mamoe.mirai.internal.message.protocol.impl.ShortVideoProtocol\"\n        ) { net.mamoe.mirai.internal.message.protocol.impl.ShortVideoProtocol() }\n        Services.register(\n            msgProtocol,\n            \"net.mamoe.mirai.internal.message.protocol.impl.TextProtocol\"\n        ) { net.mamoe.mirai.internal.message.protocol.impl.TextProtocol() }\n        Services.register(\n            msgProtocol,\n            \"net.mamoe.mirai.internal.message.protocol.impl.VipFaceProtocol\"\n        ) { net.mamoe.mirai.internal.message.protocol.impl.VipFaceProtocol() }\n        Services.register(\n            msgProtocol,\n            \"net.mamoe.mirai.internal.message.protocol.impl.ForwardMessageProtocol\"\n        ) { net.mamoe.mirai.internal.message.protocol.impl.ForwardMessageProtocol() }\n        Services.register(\n            msgProtocol,\n            \"net.mamoe.mirai.internal.message.protocol.impl.LongMessageProtocol\"\n        ) { net.mamoe.mirai.internal.message.protocol.impl.LongMessageProtocol() }\n        Services.register(\n            msgProtocol,\n            \"net.mamoe.mirai.internal.message.protocol.impl.UnsupportedMessageProtocol\"\n        ) { net.mamoe.mirai.internal.message.protocol.impl.UnsupportedMessageProtocol() }\n        Services.register(\n            msgProtocol,\n            \"net.mamoe.mirai.internal.message.protocol.impl.GeneralMessageSenderProtocol\"\n        ) { net.mamoe.mirai.internal.message.protocol.impl.GeneralMessageSenderProtocol() }\n\n\n        Services.register(\n            \"net.mamoe.mirai.message.data.InternalImageProtocol\",\n            \"net.mamoe.mirai.internal.message.image.InternalImageProtocolImpl\"\n        ) { net.mamoe.mirai.internal.message.image.InternalImageProtocolImpl() }\n\n        Services.register(\n            \"net.mamoe.mirai.message.data.OfflineAudio.Factory\",\n            \"net.mamoe.mirai.internal.message.data.OfflineAudioFactoryImpl\"\n        ) { net.mamoe.mirai.internal.message.data.OfflineAudioFactoryImpl() }\n\n        Services.register(\n            \"net.mamoe.mirai.auth.DefaultBotAuthorizationFactory\",\n            \"net.mamoe.mirai.internal.network.auth.DefaultBotAuthorizationFactoryImpl\"\n        ) { net.mamoe.mirai.internal.network.auth.DefaultBotAuthorizationFactoryImpl() }\n\n        Services.register(\n            \"net.mamoe.mirai.utils.InternalProtocolDataExchange\",\n            \"net.mamoe.mirai.internal.utils.MiraiProtocolInternal\\$Exchange\"\n        ) { net.mamoe.mirai.internal.utils.MiraiProtocolInternal.Exchange() }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/MiraiProtocolInternal.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport net.mamoe.mirai.utils.BotConfiguration.MiraiProtocol\nimport net.mamoe.mirai.utils.EnumMap\nimport net.mamoe.mirai.utils.InternalProtocolDataExchange\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.toUHexString\n\ninternal class MiraiProtocolInternal(\n    var apkId: String,\n    var id: Long,\n    var ver: String,\n    var buildVer: String,\n    var sdkVer: String,\n    var miscBitMap: Int,\n    var subSigMap: Int,\n    var mainSigMap: Int,\n    var sign: String,\n    var buildTime: Long,\n    var ssoVersion: Int,\n    var appKey: String,\n    var supportsQRLogin: Boolean,\n    var supportsNudge: Boolean\n\n    // don't change property signatures, used externally.\n) : InternalProtocolDataExchange.InternalProtocolData {\n    internal companion object {\n        // don't change signature\n        internal val protocols = EnumMap<MiraiProtocol, MiraiProtocolInternal>(MiraiProtocol::class)\n\n        // don't change signature\n        operator fun get(protocol: MiraiProtocol): MiraiProtocolInternal =\n            protocols[protocol] ?: error(\"Internal Error: Missing protocol $protocol\")\n\n        init {\n            //Updated from MiraiGo (2023/6/18)\n            protocols[MiraiProtocol.ANDROID_PHONE] = MiraiProtocolInternal(\n                apkId = \"com.tencent.mobileqq\",\n                id = 537163098,\n                ver = \"8.9.58\",\n                buildVer = \"8.9.58.11170\",\n                sdkVer = \"6.0.0.2545\",\n                miscBitMap = 150470524,\n                subSigMap = 0x10400,\n                mainSigMap = 34869344 or 192,\n                sign = \"A6 B7 45 BF 24 A2 C2 77 52 77 16 F6 F3 6E B6 8D\",\n                buildTime = 1684467300L,\n                ssoVersion = 20,\n                appKey = \"0S200MNJT807V3GE\",\n                supportsQRLogin = false,\n                supportsNudge = true\n            )\n            //Updated from MiraiGo (2023/6/18)\n            protocols[MiraiProtocol.ANDROID_PAD] = MiraiProtocolInternal(\n                apkId = \"com.tencent.mobileqq\",\n                id = 537161402,\n                ver = \"8.9.58\",\n                buildVer = \"8.9.58.11170\",\n                sdkVer = \"6.0.0.2545\",\n                miscBitMap = 150470524,\n                subSigMap = 0x10400,\n                mainSigMap = 34869344 or 192,\n                sign = \"A6 B7 45 BF 24 A2 C2 77 52 77 16 F6 F3 6E B6 8D\",\n                buildTime = 1684467300L,\n                ssoVersion = 20,\n                appKey = \"0S200MNJT807V3GE\",\n                supportsQRLogin = false,\n                supportsNudge = true\n            )\n            //Updated from MiraiGo (2023/3/24)\n            protocols[MiraiProtocol.ANDROID_WATCH] = MiraiProtocolInternal(\n                apkId = \"com.tencent.qqlite\",\n                id = 537065138,\n                ver = \"2.0.8\",\n                buildVer = \"2.0.8\",\n                sdkVer = \"6.0.0.2365\",\n                miscBitMap = 16252796,\n                subSigMap = 0x10400,\n                mainSigMap = 16724722,\n                sign = \"A6 B7 45 BF 24 A2 C2 77 52 77 16 F6 F3 6E B6 8D\",\n                buildTime = 1559564731L,\n                ssoVersion = 5,\n                appKey = \"\",\n                supportsQRLogin = true,\n                supportsNudge = false\n            )\n            protocols[MiraiProtocol.IPAD] = MiraiProtocolInternal(\n                apkId = \"com.tencent.minihd.qq\",\n                id = 537151363,\n                ver = \"8.9.33\",\n                buildVer = \"8.9.33.614\",\n                sdkVer = \"6.0.0.2433\",\n                miscBitMap = 150470524,\n                subSigMap = 66560,\n                mainSigMap = 1970400,\n                sign = \"AA 39 78 F4 1F D9 6F F9 91 4A 66 9E 18 64 74 C7\",\n                buildTime = 1640921786L,\n                ssoVersion = 12,\n                appKey = \"\",\n                supportsQRLogin = false,\n                supportsNudge = true\n            )\n            protocols[MiraiProtocol.MACOS] = MiraiProtocolInternal(\n                apkId = \"com.tencent.qq\",\n                id = 537128930,\n                ver = \"6.8.2\",\n                buildVer = \"6.8.2.21241\",\n                sdkVer = \"6.2.0.1023\",\n                miscBitMap = 0x7ffc,\n                subSigMap = 66560,\n                mainSigMap = 1970400,\n                sign = \"com.tencent.qq\".encodeToByteArray().toUHexString(\" \"),\n                buildTime = 1647227495L,\n                ssoVersion = 7,\n                appKey = \"\",\n                supportsQRLogin = true,\n                supportsNudge = false\n            )\n        }\n\n        inline val MiraiProtocol.asInternal: MiraiProtocolInternal get() = get(this)\n    }\n\n    @PublishedApi\n    internal class Exchange : InternalProtocolDataExchange {\n        @MiraiInternalApi\n        override fun of(protocol: MiraiProtocol): InternalProtocolDataExchange.InternalProtocolData {\n            return get(protocol)\n        }\n    }\n\n\n    override val isQRLoginSupported: Boolean get() = supportsQRLogin\n    override val isNudgeSupported: Boolean get() = supportsNudge\n    override val mainVersion: String get() = ver\n    override val buildVersion: String get() = buildVer\n    override val sdkVersion: String get() = sdkVer\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/MiraiUtilsLogger.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n\npackage net.mamoe.mirai.internal.utils\n\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.UtilsLogger\nimport net.mamoe.mirai.utils.asUtilsLogger as asUtilsLogger1\n\ninternal fun MiraiLogger.asUtilsLogger(): UtilsLogger = asUtilsLogger1()"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/NetworkType.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport kotlin.jvm.JvmInline\n\n/**\n * 连接类型\n */\n@JvmInline\ninternal value class NetworkType(val value: Int) {\n    companion object {\n        /**\n         * 移动网络\n         */\n        val MOBILE = NetworkType(1)\n\n        /**\n         * Wifi\n         */\n        val WIFI = NetworkType(2)\n\n        /**\n         * 其他任何类型\n         */\n        val OTHER = NetworkType(0)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/PlatformDatagramChannel.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport io.ktor.utils.io.core.*\n\n//\n///**\n// * 多平台适配的 DatagramChannel.\n// */\n//internal class PlatformDatagramChannel(serverHost: String, serverPort: Short) : Closeable {\n//    @PublishedApi\n//    internal val channel: DatagramChannel =\n//        DatagramChannel.open().connect(InetSocketAddress(serverHost, serverPort.toInt()))\n//    val isOpen: Boolean get() = channel.isOpen\n//    override fun close() = channel.close()\n//\n//    suspend inline fun send(packet: ByteReadPacket): Boolean = withContext(Dispatchers.IO) {\n//        try {\n//            (channel as WritableByteChannel).writePacket(packet)\n//        } catch (e: Throwable) {\n//            throw SendPacketInternalException(e)\n//        }\n//    }\n//\n//    suspend inline fun read(): ByteReadPacket = withContext(Dispatchers.IO) {\n//        try {\n//            (channel as ReadableByteChannel).readPacketAtMost(Long.MAX_VALUE)\n//        } catch (e: Throwable) {\n//            throw ReadPacketInternalException(e)\n//        }\n//    }\n//}\n\n/*\n\nactual class PlatformDatagramChannel actual constructor(serverHost: String, serverPort: Short) : Closeable {\n    private val serverAddress: InetSocketAddress = InetSocketAddress(serverHost, serverPort.toInt())\n\n    @KtorExperimentalAPI\n    val socket = runBlocking { aSocket(ActorSelectorManager(Dispatchers.IO)).tcp()\n        .connect(remoteAddress = serverAddress) }\n\n    @KtorExperimentalAPI\n    val readChannel = socket.openReadChannel()\n\n    @KtorExperimentalAPI\n    val writeChannel = socket.openWriteChannel(true)\n\n    @KtorExperimentalAPI\n    @Throws(ReadPacketInternalException::class)\n    actual suspend fun read(buffer: IoBuffer) =\n        try {\n            readChannel.readAvailable(buffer)\n        } catch (e: ClosedChannelException) {\n            throw e\n        } catch (e: Throwable) {\n            throw ReadPacketInternalException(e)\n        }\n\n\n    @KtorExperimentalAPI\n    @Throws(SendPacketInternalException::class)\n    actual suspend fun send(buffer: IoBuffer) =\n        buffer.readDirect {\n            try {\n                writeChannel.writeFully(it)\n            } catch (e: ClosedChannelException) {\n                throw e\n            } catch (e: Throwable) {\n                throw SendPacketInternalException(e)\n            }\n        }\n\n\n    @KtorExperimentalAPI\n    @Throws(IOException::class)\n    override fun close() {\n        socket.close()\n    }\n\n    @KtorExperimentalAPI\n    actual val isOpen: Boolean\n        get() = socket.isClosed.not()\n}\n */\n\n/**\n * 在 [PlatformDatagramChannel.send] 或 [PlatformDatagramChannel.read] 时出现的错误.\n */\ninternal class SendPacketInternalException(cause: Throwable?) : Exception(cause)\n\n/**\n * 在 [PlatformDatagramChannel.send] 或 [PlatformDatagramChannel.read] 时出现的错误.\n */\ninternal class ReadPacketInternalException(cause: Throwable?) : Exception(cause)"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/PlatformSocket.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmName(\"PlatformSocketKt_common\")\n\npackage net.mamoe.mirai.internal.utils\n\nimport io.ktor.utils.io.core.*\nimport io.ktor.utils.io.errors.*\nimport net.mamoe.mirai.internal.network.handler.SocketAddress\nimport net.mamoe.mirai.internal.network.handler.getHost\nimport net.mamoe.mirai.internal.network.handler.getPort\nimport net.mamoe.mirai.internal.network.highway.HighwayProtocolChannel\nimport kotlin.jvm.JvmName\n\n/**\n * TCP Socket.\n */\ninternal expect class PlatformSocket : Closeable, HighwayProtocolChannel {\n    val isOpen: Boolean\n\n    override fun close()\n\n    suspend fun send(packet: ByteArray, offset: Int, length: Int)\n\n    /**\n     * @throws SendPacketInternalException\n     */\n    override suspend fun send(packet: ByteReadPacket)\n\n    /**\n     * @throws ReadPacketInternalException\n     */\n    override suspend fun read(): ByteReadPacket\n\n    companion object {\n        suspend fun connect(\n            serverIp: String,\n            serverPort: Int,\n        ): PlatformSocket\n\n        suspend inline fun <R> withConnection(\n            serverIp: String,\n            serverPort: Int,\n            block: PlatformSocket.() -> R,\n        ): R\n    }\n}\n\ninternal suspend inline fun PlatformSocket.Companion.connect(address: SocketAddress): PlatformSocket {\n    return connect(address.getHost(), address.getPort())\n}\n\n\ninternal expect class SocketException : IOException {\n    constructor()\n    constructor(message: String)\n}\n\ninternal expect class NoRouteToHostException : IOException {\n    constructor()\n    constructor(message: String)\n}\n\ninternal expect class UnknownHostException : IOException {\n    constructor()\n    constructor(message: String)\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/ScheduledJob.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.flow.receiveAsFlow\nimport kotlinx.coroutines.flow.sample\nimport kotlin.coroutines.CoroutineContext\n\n@OptIn(FlowPreview::class)\ninternal class ScheduledJob(\n    coroutineContext: CoroutineContext,\n    private val intervalMillis: Long,\n    private val task: suspend () -> Unit,\n) : CoroutineScope by CoroutineScope(coroutineContext + SupervisorJob(coroutineContext[Job])) {\n    private val coroutineExceptionHandler =\n        coroutineContext[CoroutineExceptionHandler].also {\n            requireNotNull(it) {\n                \"Could not init ScheduledJob, coroutineExceptionHandler == null\"\n            }\n        }\n\n    private val channel = Channel<Unit>(Channel.CONFLATED)\n\n    fun notice() {\n        if (intervalMillis == 0L) {\n            launch { task() }\n        } else channel.trySend(Unit)\n    }\n\n    private suspend fun doTask() {\n        runCatching {\n            task()\n        }.onFailure {\n            coroutineExceptionHandler!!.handleException(currentCoroutineContext(), it)\n        }\n    }\n\n    init {\n        if (intervalMillis != 0L) {\n            launch {\n                channel.receiveAsFlow()\n                    .runCatching {\n                        sample(intervalMillis)\n                    }\n                    .fold(\n                        onSuccess = { flow ->\n                            flow.collect { doTask() }\n                        },\n                        onFailure = {\n                            // binary change\n                            while (isActive) {\n                                delay(intervalMillis)\n                                task()\n                            }\n                        }\n                    )\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/SingleEntrantLock.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport kotlinx.atomicfu.AtomicRef\nimport kotlinx.atomicfu.atomic\nimport kotlinx.atomicfu.locks.SynchronizedObject\nimport kotlinx.atomicfu.locks.synchronized\n\n\ninternal class SingleEntrantLock : SynchronizedObject() {\n    private val locker: AtomicRef<Any?> = atomic(null)\n\n    inline fun <R> withLock(locker: Any, crossinline block: () -> R): R? {\n        return synchronized(this) {\n            if (this.locker.value === locker) return@synchronized null\n            this.locker.value = locker\n            block().also {\n                this.locker.value = null\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/SubLogger.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.CoroutineExceptionHandler\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.coroutineName\n\n\ninternal fun CoroutineExceptionHandler.Key.fromMiraiLogger(\n    logger: MiraiLogger,\n    ignoreCancellationException: Boolean = true, // kotlinx.coroutines default\n): CoroutineExceptionHandler {\n    return CoroutineExceptionHandler { coroutineContext, throwable ->\n        if (!ignoreCancellationException || throwable !is CancellationException) {\n            logger.error(\"Exception in coroutine '${coroutineContext.coroutineName}'\", throwable)\n        }\n    }\n}\n\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\ninternal fun MiraiLogger.subLogger(name: String): MiraiLogger = subLoggerImpl(this, name)"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/collection.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\ninternal fun <T, M : Comparable<M>> List<T>.indexFirstBE(\n    value: M,\n    mapping: (T) -> M\n): Int {\n    var (left, right) = 0 to size - 1\n    var index = -1\n    while (left <= right) {\n        val middle = left + (right - left) / 2\n        if (mapping(get(middle)) >= value) {\n            index = middle\n            right = middle - 1\n        } else {\n            left = middle + 1\n        }\n    }\n    return index\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/crypto/AES.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils.crypto\n\ninternal expect fun aesEncrypt(input: ByteArray, iv: ByteArray, key: ByteArray): ByteArray\n\ninternal expect fun aesDecrypt(input: ByteArray, iv: ByteArray, key: ByteArray): ByteArray"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/crypto/Ecdh.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils.crypto\n\nimport kotlin.jvm.JvmStatic\n\ninternal data class EcdhKeyPair<TPublicKey, TPrivate>(val public: TPublicKey, val private: TPrivate)\n\ninternal interface Ecdh<TPublicKey, TPrivate> {\n    fun generateKeyPair(): EcdhKeyPair<TPublicKey, TPrivate>\n    fun calculateShareKey(peerKey: TPublicKey, privateKey: TPrivate): ByteArray\n\n    /**\n     * @param encoded The encoding should conform with\n     * Sec. 2.3.3 of the SECG SEC 1 (\"Elliptic Curve Cryptography\") standard,\n     * with compression is off.\n     * @see <a href=\"https://www.secg.org/sec1-v2.pdf\">SECG SEC 1: Elliptic Curve Cryptography</a>\n     */\n    fun importPublicKey(encoded: ByteArray): TPublicKey\n\n    /**\n     * @return The encoding conforms with\n     * Sec. 2.3.3 of the SECG SEC 1 (\"Elliptic Curve Cryptography\") standard,\n     * with compression is off.\n     * @see <a href=\"https://www.secg.org/sec1-v2.pdf\">SECG SEC 1: Elliptic Curve Cryptography</a>\n     */\n    fun exportPublicKey(key: TPublicKey): ByteArray\n\n    companion object {\n        @JvmStatic\n        val Instance by lazy {\n            @Suppress(\"UNCHECKED_CAST\")\n            Ecdh.create() as Ecdh<Any, Any>\n        }\n    }\n}\ninternal expect fun Ecdh.Companion.create() : Ecdh<*, *>"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/crypto/QQEcdh.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\npackage net.mamoe.mirai.internal.utils.crypto\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.Transient\nimport net.mamoe.mirai.utils.cast\nimport net.mamoe.mirai.utils.hexToBytes\nimport net.mamoe.mirai.utils.md5\n\nprivate val defaultPublicKey =\n    \"04edb8906046f5bfbe9abbc5a88b37d70a6006bfbabc1f0cd49dfb33505e63efc5d78ee4e0a4595033b93d02096dcd3190279211f7b4f6785079e19004aa0e03bc\".hexToBytes()\nprivate val defaultQQShareKey = \"c129edba736f4909ecc4ab8e010f46a3\".hexToBytes()\n\n@Serializable\ninternal data class QQEcdhInitialPublicKey(val version: Int = 1, val keyStr: String, val expireTime: Long = 0) {\n    @Transient\n    internal val key = Ecdh.Instance.importPublicKey(keyStr.hexToBytes())\n    companion object {\n        internal val default: QQEcdhInitialPublicKey by lazy {\n            QQEcdhInitialPublicKey(keyStr = \"04EBCA94D733E399B2DB96EACDD3F69A8BB0F74224E2B44E3357812211D2E62EFBC91BB553098E25E33A799ADC7F76FEB208DA7C6522CDB0719A305180CC54A82E\")\n        }\n    }\n}\n\ninternal expect fun QQEcdhInitialPublicKey.verify(sign: String): Boolean\n\ninternal data class QQEcdh(private val initialPublicKey: QQEcdhInitialPublicKey = QQEcdhInitialPublicKey.default) {\n    val version: Int = initialPublicKey.version\n    private val keyPair = try {\n        Ecdh.Instance.generateKeyPair()\n    } catch (e:Throwable){\n        null\n    }\n    val publicKey: ByteArray = keyPair?.let {\n        Ecdh.Instance.exportPublicKey(it.public)\n    } ?: defaultPublicKey\n\n    val initialQQShareKey: ByteArray = keyPair?.let {\n        Ecdh.Instance.calculateShareKey(initialPublicKey.key, it.private).copyOf(16).md5()\n    } ?: defaultQQShareKey\n\n    val fallbackMode : Boolean = keyPair == null\n\n    /**\n     * 由 [keyPair] 的私匙和 [peerKey] 计算 shareKey\n     */\n    fun calculateQQShareKey(peerKey: Any): ByteArray {\n        check (keyPair != null) {\n            \"cannot calculate QQShareKey in fallback mode\"\n        }\n        return Ecdh.Instance.calculateShareKey(peerKey.cast(), keyPair.private).copyOf(16).md5()\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/crypto/RSA.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils.crypto\n\ninternal class RSAKeyPair(\n    val plainPubPemKey: String,\n    val plainPrivPemKey: String\n)\n\ninternal expect fun generateRSAKeyPair(keySize: Int): RSAKeyPair\n\ninternal expect fun rsaEncryptWithX509PubKey(input: ByteArray, plainPubPemKey: String, seed: Long): ByteArray\n\ninternal expect fun rsaDecryptWithPKCS8PrivKey(input: ByteArray, plainPrivPemKey: String, seed: Long): ByteArray"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/crypto/TEA.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils.crypto\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.utils.ByteArrayPool\nimport net.mamoe.mirai.utils.toByteArray\nimport net.mamoe.mirai.utils.toUHexString\nimport kotlin.experimental.and\nimport kotlin.experimental.xor\nimport kotlin.jvm.JvmStatic\nimport kotlin.random.Random\n\n/**\n * 解密错误\n */\ninternal class DecryptionFailedException : Exception {\n    constructor() : super()\n    constructor(message: String?) : super(message)\n}\n\n/**\n * TEA 算法加密解密工具类.\n *\n * **注意**: 此为 Mirai 内部 API. 它可能会在任何时刻被改变.\n */\ninternal object TEA {\n    /**\n     * 在 [ByteArrayPool] 缓存 [this], 然后使用 [key] 加密.\n     *\n     * @param key 长度至少为 16\n     * @consumer 由于缓存需要被回收, 需在方法内执行解密后明文的消耗过程\n     * @throws DecryptionFailedException 解密错误时\n     */\n    inline fun encrypt(\n        receiver: ByteReadPacket,\n        key: ByteArray,\n        offset: Int = 0,\n        length: Int = receiver.remaining.toInt() - offset,\n        consumer: (ByteArray) -> Unit,\n    ) {\n        ByteArrayPool.useInstance(length) {\n            receiver.readFully(it, offset, length)\n            consumer(encrypt(it, key, length = length))\n        }\n    }\n\n    @JvmStatic\n    fun decrypt(\n        receiver: ByteReadPacket,\n        key: ByteArray,\n        offset: Int = 0,\n        length: Int = (receiver.remaining - offset).toInt(),\n    ): ByteReadPacket =\n        decryptAsByteArray(receiver, key, offset, length) { data -> ByteReadPacket(data) }\n\n    inline fun <R> decryptAsByteArray(\n        receiver: ByteReadPacket,\n        key: ByteArray,\n        offset: Int = 0,\n        length: Int = (receiver.remaining - offset).toInt(),\n        consumer: (ByteArray) -> R,\n    ): R {\n        return ByteArrayPool.useInstance(length) {\n            receiver.readFully(it, offset, length)\n            consumer(decrypt(it, key, length))\n        }.also { receiver.close() }\n    }\n\n    private const val UINT32_MASK = 0xffffffffL\n\n    private fun doOption(data: ByteArray, key: ByteArray, length: Int, encrypt: Boolean): ByteArray {\n        lateinit var mOutput: ByteArray\n        lateinit var mInBlock: ByteArray\n        var mIndexPos: Int\n        lateinit var mIV: ByteArray\n        var mOutPos = 0\n        var mPreOutPos = 0\n        var isFirstBlock = true\n\n        val mKey = LongArray(4)\n\n        for (i in 0..3) {\n            mKey[i] = key.pack(i * 4, 4)\n        }\n\n        fun rand(): Int = Random.Default.nextInt()\n\n\n        fun encode(bytes: ByteArray): ByteArray {\n            var v0 = bytes.pack(0, 4)\n            var v1 = bytes.pack(4, 4)\n            var sum: Long = 0\n            val delta = 0x9e3779b9L\n            for (i in 0..15) {\n                sum = sum + delta and UINT32_MASK\n                v0 += (v1 shl 4) + mKey[0] xor v1 + sum xor v1.ushr(5) + mKey[1]\n                v0 = v0 and UINT32_MASK\n                v1 += (v0 shl 4) + mKey[2] xor v0 + sum xor v0.ushr(5) + mKey[3]\n                v1 = v1 and UINT32_MASK\n            }\n\n            return v0.toInt().toByteArray() + v1.toInt().toByteArray()\n        }\n\n        fun decode(bytes: ByteArray, offset: Int): ByteArray {\n            var v0 = bytes.pack(offset, 4)\n            var v1 = bytes.pack(offset + 4, 4)\n            val delta = 0x9e3779b9L\n            var sum = delta shl 4 and UINT32_MASK\n            for (i in 0..15) {\n                v1 -= (v0 shl 4) + mKey[2] xor v0 + sum xor v0.ushr(5) + mKey[3]\n                v1 = v1 and UINT32_MASK\n                v0 -= (v1 shl 4) + mKey[0] xor v1 + sum xor v1.ushr(5) + mKey[1]\n                v0 = v0 and UINT32_MASK\n                sum = sum - delta and UINT32_MASK\n            }\n            return v0.toInt().toByteArray() + v1.toInt().toByteArray()\n        }\n\n        fun encodeOneBlock() {\n            mIndexPos = 0\n            while (mIndexPos < 8) {\n                mInBlock[mIndexPos] = if (isFirstBlock)\n                    mInBlock[mIndexPos]\n                else\n                    (mInBlock[mIndexPos] xor mOutput[mPreOutPos + mIndexPos])\n                mIndexPos++\n            }\n\n            encode(mInBlock).copyInto(mOutput, mOutPos, 0, 8)\n            mIndexPos = 0\n            while (mIndexPos < 8) {\n                val outPos = mOutPos + mIndexPos\n                mOutput[outPos] = (mOutput[outPos] xor mIV[mIndexPos])\n                mIndexPos++\n            }\n            mInBlock.copyInto(mIV, 0, 0, 8)\n            mPreOutPos = mOutPos\n            mOutPos += 8\n            mIndexPos = 0\n            isFirstBlock = false\n        }\n\n        fun decodeOneBlock(ciphertext: ByteArray, offset: Int, len: Int): Boolean {\n            mIndexPos = 0\n            while (mIndexPos < 8) {\n                if (mOutPos + mIndexPos < len) {\n                    mIV[mIndexPos] = (mIV[mIndexPos] xor ciphertext[mOutPos + offset + mIndexPos])\n                    mIndexPos++\n                    continue\n                }\n                return true\n            }\n\n            mIV = decode(mIV, 0)\n            mOutPos += 8\n            mIndexPos = 0\n            return true\n\n        }\n\n        @Suppress(\"NAME_SHADOWING\")\n        fun encrypt(plaintext: ByteArray, offset: Int, len: Int): ByteArray {\n            var len = len\n            var offset = offset\n            mInBlock = ByteArray(8)\n            mIV = ByteArray(8)\n            mOutPos = 0\n            mPreOutPos = 0\n            isFirstBlock = true\n            mIndexPos = (len + 10) % 8\n            if (mIndexPos != 0) {\n                mIndexPos = 8 - mIndexPos\n            }\n            mOutput = ByteArray(mIndexPos + len + 10)\n            mInBlock[0] = (rand() and 0xf8 or mIndexPos).toByte()\n            for (i in 1..mIndexPos) {\n                mInBlock[i] = (rand() and 0xff).toByte()\n            }\n            ++mIndexPos\n            for (i in 0..7) {\n                mIV[i] = 0\n            }\n\n            var g = 0\n            while (g < 2) {\n                if (mIndexPos < 8) {\n                    mInBlock[mIndexPos++] = (rand() and 0xff).toByte()\n                    ++g\n                }\n                if (mIndexPos == 8) {\n                    encodeOneBlock()\n                }\n            }\n\n            while (len > 0) {\n                if (mIndexPos < 8) {\n                    mInBlock[mIndexPos++] = plaintext[offset++]\n                }\n                if (mIndexPos == 8) {\n                    encodeOneBlock()\n                }\n                len--\n            }\n            g = 0\n            while (g < 7) {\n                if (mIndexPos < 8) {\n                    mInBlock[mIndexPos++] = 0.toByte()\n                }\n                if (mIndexPos == 8) {\n                    encodeOneBlock()\n                }\n                g++\n            }\n            return mOutput\n        }\n\n        fun decrypt(cipherText: ByteArray, offset: Int, len: Int): ByteArray {\n            require(!(len % 8 != 0 || len < 16)) { \"data must len % 8 == 0 && len >= 16 but given $len\" }\n            mIV = decode(cipherText, offset)\n            mIndexPos = (mIV[0] and 7).toInt()\n            var plen = len - mIndexPos - 10\n            isFirstBlock = true\n            if (plen < 0) {\n                fail()\n            }\n            mOutput = ByteArray(plen)\n            mPreOutPos = 0\n            mOutPos = 8\n            ++mIndexPos\n            var g = 0\n            while (g < 2) {\n                if (mIndexPos < 8) {\n                    ++mIndexPos\n                    ++g\n                }\n                if (mIndexPos == 8) {\n                    isFirstBlock = false\n                    if (!decodeOneBlock(cipherText, offset, len)) {\n                        fail()\n                    }\n                }\n            }\n\n            var outpos = 0\n            while (plen != 0) {\n                if (mIndexPos < 8) {\n                    mOutput[outpos++] = if (isFirstBlock)\n                        mIV[mIndexPos]\n                    else\n                        (cipherText[mPreOutPos + offset + mIndexPos] xor mIV[mIndexPos])\n                    ++mIndexPos\n                }\n                if (mIndexPos == 8) {\n                    mPreOutPos = mOutPos - 8\n                    isFirstBlock = false\n                    if (!decodeOneBlock(cipherText, offset, len)) {\n                        fail()\n                    }\n                }\n                plen--\n            }\n            g = 0\n            while (g < 7) {\n                if (mIndexPos < 8) {\n                    if (cipherText[mPreOutPos + offset + mIndexPos].xor(mIV[mIndexPos]).toInt() != 0) {\n                        fail()\n                    } else {\n                        ++mIndexPos\n                    }\n                }\n\n                if (mIndexPos == 8) {\n                    mPreOutPos = mOutPos\n                    if (!decodeOneBlock(cipherText, offset, len)) {\n                        fail()\n                    }\n                }\n                g++\n            }\n            return mOutput\n        }\n\n        return if (encrypt) {\n            encrypt(data, 0, length)\n        } else {\n            decrypt(data, 0, length)\n        }\n    }\n\n    private fun fail(): Nothing = throw DecryptionFailedException()\n\n    /**\n     * 使用 [key] 加密 [source]\n     *\n     * @param key 长度至少为 16\n     * @throws DecryptionFailedException 解密错误时\n     */\n    @JvmStatic\n    fun encrypt(source: ByteArray, key: ByteArray, length: Int = source.size): ByteArray =\n        doOption(source, key, length, true)\n\n    /**\n     * 使用 [key] 解密 [source]\n     *\n     * @param key 长度至少为 16\n     * @throws DecryptionFailedException 解密错误时\n     */\n    @JvmStatic\n    fun decrypt(source: ByteArray, key: ByteArray, length: Int = source.size): ByteArray =\n        doOption(source, key, length, false)\n\n    private fun ByteArray.pack(offset: Int, len: Int): Long {\n        var result: Long = 0\n        val maxOffset = if (len > 8) offset + 8 else offset + len\n        for (index in offset until maxOffset) {\n            result = result shl 8 or (this[index].toLong() and 0xffL)\n        }\n        return result shr 32 or (result and UINT32_MASK)\n    }\n}\n\n@Suppress(\"NOTHING_TO_INLINE\")\nprivate inline fun ByteArray.checkDataLengthAndReturnSelf(length: Int = this.size): ByteArray {\n    if (!(length % 8 == 0 && length >= 16)) {\n        throw DecryptionFailedException(\"data must len % 8 == 0 && len >= 16 but given (length=$length) ${this.toUHexString()}\")\n    }\n    return this\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/flags.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport kotlin.jvm.JvmInline\n\n@JvmInline\ninternal value class MacOrAndroidIdChangeFlag(val value: Long = 0) {\n    fun macChanged(): MacOrAndroidIdChangeFlag =\n        MacOrAndroidIdChangeFlag(this.value or 0x1)\n\n    fun androidIdChanged(): MacOrAndroidIdChangeFlag =\n        MacOrAndroidIdChangeFlag(this.value or 0x2)\n\n    fun guidChanged(): MacOrAndroidIdChangeFlag =\n        MacOrAndroidIdChangeFlag(this.value or 0x3)\n\n    companion object {\n        val NoChange: MacOrAndroidIdChangeFlag get() = MacOrAndroidIdChangeFlag()\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/io/ProtocolStruct.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils.io\n\nimport kotlin.reflect.KClass\n\ninternal interface ProtocolStruct\ninternal interface ProtoBuf : ProtocolStruct\ninternal interface JceStruct : ProtocolStruct\n\n@Retention(AnnotationRetention.RUNTIME)\n@Target(AnnotationTarget.VALUE_PARAMETER)\ninternal annotation class NestedStructure(\n    val serializer: KClass<out NestedStructureDesensitizer<*, *>>\n)\n\ninternal interface NestedStructureDesensitizer<in C : ProtocolStruct, T> {\n    fun deserialize(context: C, byteArray: ByteArray): T?\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/io/output.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"EXPERIMENTAL_API_USAGE\", \"NOTHING_TO_INLINE\")\n@file:JvmMultifileClass\n@file:JvmName(\"Utils\")\n\npackage net.mamoe.mirai.internal.utils.io\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.utils.coerceAtMostOrFail\nimport net.mamoe.mirai.internal.utils.crypto.TEA\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.withUse\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\ninternal fun BytePacketBuilder.writeShortLVByteArrayLimitedLength(array: ByteArray, maxLength: Int) {\n    if (array.size <= maxLength) {\n        writeShort(array.size.toShort())\n        writeFully(array)\n    } else {\n        writeShort(maxLength.toShort())\n        repeat(maxLength) {\n            writeByte(array[it])\n        }\n    }\n}\n\ninternal fun BytePacketBuilder.writeResource(\n    resource: ExternalResource,\n    close: Boolean = false,\n): Long = resource.input().withUse { copyTo(this@writeResource) }.also {\n    if (close) resource.close()\n}\n\ninternal inline fun BytePacketBuilder.writeShortLVByteArray(byteArray: ByteArray): Int {\n    this.writeShort(byteArray.size.toShort())\n    this.writeFully(byteArray)\n    return byteArray.size\n}\n\ninternal inline fun BytePacketBuilder.writeIntLVPacket(\n    tag: UByte? = null,\n    lengthOffset: ((Long) -> Long) = { it },\n    crossinline builder: BytePacketBuilder.() -> Unit,\n): Int =\n    buildPacket(builder).use {\n        if (tag != null) writeByte(tag.toByte())\n        val length = lengthOffset.invoke(it.remaining).coerceAtMostOrFail(0xFFFFFFFFL)\n        writeInt(length.toInt())\n        writePacket(it)\n        return length.toInt()\n    }\n\ninternal inline fun BytePacketBuilder.writeShortLVPacket(\n    tag: UByte? = null,\n    lengthOffset: ((Long) -> Long) = { it },\n    crossinline builder: BytePacketBuilder.() -> Unit,\n): Int = buildPacket(builder).use {\n    if (tag != null) writeByte(tag.toByte())\n    val length = lengthOffset.invoke(it.remaining).coerceAtMostOrFail(0xFFFFFFFFL)\n    writeShort(length.toUShort().toShort())\n    writePacket(it)\n    return length.toInt()\n}\n\ninternal inline fun BytePacketBuilder.writeShortLVString(str: String) = writeShortLVByteArray(str.toByteArray())\n\ninternal fun BytePacketBuilder.writeHex(uHex: String) {\n    uHex.split(\" \").forEach {\n        if (it.isNotBlank()) {\n            writeByte(it.toUByte(16).toByte())\n        }\n    }\n}\n\n\ninternal inline fun BytePacketBuilder.encryptAndWrite(\n    key: ByteArray,\n    crossinline encoder: BytePacketBuilder.() -> Unit\n) = TEA.encrypt(buildPacket(encoder), key) { decrypted -> writeFully(decrypted) }"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/io/serialization/tars/Tars.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"MemberVisibilityCanBePrivate\", \"unused\")\n\npackage net.mamoe.mirai.internal.utils.io.serialization.tars\n\nimport io.ktor.utils.io.charsets.*\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.BinaryFormat\nimport kotlinx.serialization.DeserializationStrategy\nimport kotlinx.serialization.SerialFormat\nimport kotlinx.serialization.SerializationStrategy\nimport kotlinx.serialization.modules.EmptySerializersModule\nimport kotlinx.serialization.modules.SerializersModule\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.internal.DebugLogger\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.internal.TarsDecoder\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.internal.TarsInput\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.internal.TarsOld\nimport net.mamoe.mirai.utils.read\nimport kotlin.jvm.JvmStatic\n\n/**\n * The main entry point to work with Tars serialization.\n */\ninternal class Tars(\n    override val serializersModule: SerializersModule = EmptySerializersModule(),\n    val charset: Charset = Charsets.UTF_8,\n) : SerialFormat, BinaryFormat {\n    private val old = TarsOld(charset)\n\n    fun <T> dumpTo(serializer: SerializationStrategy<T>, ojb: T, output: Output) {\n        old.dumpAsPacket(serializer, ojb).use {\n            output.writePacket(it)\n        }\n    }\n\n    fun <T> load(deserializer: DeserializationStrategy<T>, input: Input, debugLogger: DebugLogger? = null): T {\n        val l = debugLogger ?: DebugLogger(null)\n        return TarsDecoder(TarsInput(input, charset, l), serializersModule, l).decodeSerializableValue(deserializer)\n    }\n\n    override fun <T> encodeToByteArray(serializer: SerializationStrategy<T>, value: T): ByteArray {\n        return buildPacket { dumpTo(serializer, value, this) }.readBytes()\n    }\n\n    override fun <T> decodeFromByteArray(deserializer: DeserializationStrategy<T>, bytes: ByteArray): T {\n        bytes.read {\n            return load(deserializer, this, null)\n        }\n    }\n\n    companion object {\n        @JvmStatic\n        val UTF_8: Tars = Tars()\n\n        internal const val BYTE: Byte = 0\n        internal const val DOUBLE: Byte = 5\n        internal const val FLOAT: Byte = 4\n        internal const val INT: Byte = 2\n        internal const val Tars_MAX_STRING_LENGTH = 104857600\n        internal const val LIST: Byte = 9\n        internal const val LONG: Byte = 3\n        internal const val MAP: Byte = 8\n        internal const val SHORT: Byte = 1\n        internal const val SIMPLE_LIST: Byte = 13\n        internal const val STRING1: Byte = 6\n        internal const val STRING4: Byte = 7\n        internal const val STRUCT_BEGIN: Byte = 10\n        internal const val STRUCT_END: Byte = 11\n        internal const val ZERO_TYPE: Byte = 12\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/io/serialization/tars/TarsId.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils.io.serialization.tars\n\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.SerialInfo\n\n/**\n * The serial id used in Tars serialization\n */\n@OptIn(ExperimentalSerializationApi::class)\n@SerialInfo\n@Target(AnnotationTarget.PROPERTY)\ninternal annotation class TarsId(val id: Int)\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/io/serialization/tars/internal/TarsDecoder.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"PrivatePropertyName\")\n\npackage net.mamoe.mirai.internal.utils.io.serialization.tars.internal\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.InternalSerializationApi\nimport kotlinx.serialization.descriptors.*\nimport kotlinx.serialization.encoding.AbstractDecoder\nimport kotlinx.serialization.encoding.CompositeDecoder\nimport kotlinx.serialization.internal.TaggedDecoder\nimport kotlinx.serialization.modules.SerializersModule\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport net.mamoe.mirai.utils.MiraiLogger\n\ninternal class DebugLogger(\n    val out: Output?\n) {\n    var structureHierarchy: Int = 0\n\n    fun println(message: Any?) {\n        out?.appendLine(\"    \".repeat(structureHierarchy) + message)\n    }\n\n    fun println() {\n        out?.appendLine()\n    }\n\n    inline fun println(lazyMessage: () -> String) {\n        out?.appendLine(\"    \".repeat(structureHierarchy) + lazyMessage())\n    }\n}\n\n@OptIn(InternalSerializationApi::class, ExperimentalSerializationApi::class)\ninternal class TarsDecoder(\n    val input: TarsInput,\n    override val serializersModule: SerializersModule,\n    val debugLogger: DebugLogger,\n) : TaggedDecoder<TarsTag>() {\n    override fun SerialDescriptor.getTag(index: Int): TarsTag {\n        val annotations = this.getElementAnnotations(index)\n\n        val id = annotations.filterIsInstance<TarsId>().single().id\n        // ?: error(\"cannot find @TarsId or @ProtoNumber for ${this.getElementName(index)} in ${this.serialName}\")\n        //debugLogger.println(\"getTag: ${this.getElementName(index)}=$id\")\n\n        return TarsTagCommon(id)\n    }\n\n    private fun SerialDescriptor.getTarsTagId(index: Int): Int {\n        // higher performance, don't use filterIsInstance\n        val annotation = getElementAnnotations(index).firstOrNull { it is TarsId }\n            ?: error(\"missing @TarsId for ${getElementName(index)} in ${this.serialName}\")\n        return (annotation as TarsId).id\n\n    }\n\n    private val SimpleByteArrayReader: SimpleByteArrayReaderImpl = SimpleByteArrayReaderImpl()\n\n    private inner class SimpleByteArrayReaderImpl : AbstractDecoder() {\n        override val serializersModule: SerializersModule\n            get() = this@TarsDecoder.serializersModule\n\n        override fun decodeSequentially(): Boolean = true\n\n        override fun endStructure(descriptor: SerialDescriptor) {\n            this@TarsDecoder.endStructure(descriptor)\n        }\n\n        override fun beginStructure(descriptor: SerialDescriptor): CompositeDecoder {\n            this@TarsDecoder.pushTag(TarsTagListElement())\n            return this@TarsDecoder.beginStructure(descriptor)\n        }\n\n        override fun decodeByte(): Byte = input.input.readByte()\n        override fun decodeShort(): Short = error(\"illegal access\")\n        override fun decodeInt(): Int = error(\"illegal access\")\n        override fun decodeLong(): Long = error(\"illegal access\")\n        override fun decodeFloat(): Float = error(\"illegal access\")\n        override fun decodeDouble(): Double = error(\"illegal access\")\n        override fun decodeBoolean(): Boolean = error(\"illegal access\")\n        override fun decodeChar(): Char = error(\"illegal access\")\n        override fun decodeEnum(enumDescriptor: SerialDescriptor): Int = error(\"illegal access\")\n        override fun decodeString(): String = error(\"illegal access\")\n\n        override fun decodeElementIndex(descriptor: SerialDescriptor): Int {\n            error(\"should not be reached\")\n        }\n\n        override fun decodeCollectionSize(descriptor: SerialDescriptor): Int {\n            // 不要读下一个 head\n            return input.currentHead.let { input.readTarsIntValue(it) }.also {\n                debugLogger.println { \"SimpleByteArrayReader.decodeCollectionSize: $it\" }\n            }\n        }\n    }\n\n    private val ListReader: ListReaderImpl = ListReaderImpl()\n\n    private inner class ListReaderImpl : AbstractDecoder() {\n        override val serializersModule: SerializersModule\n            get() = this@TarsDecoder.serializersModule\n\n        override fun decodeSequentially(): Boolean = true\n        override fun decodeElementIndex(descriptor: SerialDescriptor): Int = error(\"should not be reached\")\n        override fun endStructure(descriptor: SerialDescriptor) {\n            this@TarsDecoder.endStructure(descriptor)\n        }\n\n        override fun beginStructure(descriptor: SerialDescriptor): CompositeDecoder {\n            this@TarsDecoder.pushTag(TarsTagListElement())\n\n            return this@TarsDecoder.beginStructure(descriptor)\n        }\n\n        override fun decodeByte(): Byte = input.useHead { input.readTarsByteValue(it) }\n        override fun decodeShort(): Short = input.useHead { input.readTarsShortValue(it) }\n        override fun decodeInt(): Int = input.useHead { input.readTarsIntValue(it) }\n        override fun decodeLong(): Long = input.useHead { input.readTarsLongValue(it) }\n        override fun decodeFloat(): Float = input.useHead { input.readTarsFloatValue(it) }\n        override fun decodeDouble(): Double = input.useHead { input.readTarsDoubleValue(it) }\n        override fun decodeBoolean(): Boolean = input.useHead { input.readTarsBooleanValue(it) }\n        override fun decodeChar(): Char = decodeByte().toInt().toChar()\n        override fun decodeEnum(enumDescriptor: SerialDescriptor): Int = decodeInt()\n        override fun decodeString(): String = input.useHead { input.readTarsStringValue(it) }\n\n        override fun decodeCollectionSize(descriptor: SerialDescriptor): Int {\n            //debugLogger.println(\"decodeCollectionSize: ${descriptor.serialName}\")\n            // 不读下一个 head\n            return input.useHead { input.readTarsIntValue(it) }\n        }\n    }\n\n\n    private val MapReader: MapReaderImpl = MapReaderImpl()\n\n    private inner class MapReaderImpl : AbstractDecoder() {\n        override val serializersModule: SerializersModule\n            get() = this@TarsDecoder.serializersModule\n\n        override fun decodeSequentially(): Boolean = true\n        override fun decodeElementIndex(descriptor: SerialDescriptor): Int = error(\"stub\")\n\n        override fun endStructure(descriptor: SerialDescriptor) {\n            debugLogger.println { \"MapReader.endStructure: ${input.currentHeadOrNull}\" }\n            this@TarsDecoder.endStructure(descriptor)\n        }\n\n        override fun beginStructure(descriptor: SerialDescriptor): CompositeDecoder {\n            debugLogger.println { \"MapReader.beginStructure: ${input.currentHead}\" }\n            this@TarsDecoder.pushTag(\n                when (input.currentHead.tag) {\n                    0 -> TarsTagMapEntryKey()\n                    1 -> TarsTagMapEntryValue()\n                    else -> error(\"illegal map entry head: ${input.currentHead.tag}\")\n                }.also {\n                    debugLogger.println(\"MapReader.pushTag $it\")\n                }\n            )\n            return this@TarsDecoder.beginStructure(descriptor)\n        }\n\n        override fun decodeByte(): Byte = input.useHead { input.readTarsByteValue(it) }\n        override fun decodeShort(): Short = input.useHead { input.readTarsShortValue(it) }\n        override fun decodeInt(): Int = input.useHead { input.readTarsIntValue(it) }\n        override fun decodeLong(): Long = input.useHead { input.readTarsLongValue(it) }\n        override fun decodeFloat(): Float = input.useHead { input.readTarsFloatValue(it) }\n        override fun decodeDouble(): Double = input.useHead { input.readTarsDoubleValue(it) }\n\n        override fun decodeBoolean(): Boolean = input.useHead { input.readTarsBooleanValue(it) }\n        override fun decodeChar(): Char = decodeByte().toInt().toChar()\n        override fun decodeEnum(enumDescriptor: SerialDescriptor): Int = decodeInt()\n        override fun decodeString(): String = input.useHead { head ->\n            input.readTarsStringValue(head).also {\n                debugLogger.println { \"MapReader.decodeString: $it\" }\n            }\n        }\n\n        override fun decodeCollectionSize(descriptor: SerialDescriptor): Int {\n            debugLogger.println { \"decodeCollectionSize in MapReader: ${descriptor.serialName}\" }\n            // 不读下一个 head\n            return input.useHead { head ->\n                input.readTarsIntValue(head).also {\n                    debugLogger.println { \"decodeCollectionSize = $it\" }\n                }\n            }\n        }\n    }\n\n\n    override fun endStructure(descriptor: SerialDescriptor) {\n        debugLogger.structureHierarchy--\n        debugLogger.println { \"endStructure: ${descriptor.serialName}, $currentTagOrNull, ${input.currentHeadOrNull}\" }\n        if (currentTagOrNull?.isSimpleByteArray == true) {\n            debugLogger.println { \"endStructure: prepareNextHead() called\" }\n            currentTag.isSimpleByteArray = false\n            input.prepareNextHead() // read to next head\n        }\n        if (descriptor.kind == StructureKind.CLASS) {\n            if (currentTagOrNull == null) {\n                return\n            }\n            while (true) {\n                val currentHead = input.currentHeadOrNull ?: return\n                if (currentHead.type == Tars.STRUCT_END) {\n                    input.prepareNextHead()\n                    //debugLogger.println(\"current end\")\n                    break\n                }\n                //debugLogger.println(\"current $currentHead\")\n                input.skipField(currentHead.type)\n                input.prepareNextHead()\n            }\n            // pushTag(TarsTag(0, true))\n            // skip STRUCT_END\n            // popTag()\n        }\n    }\n\n\n    companion object {\n        val logger = MiraiLogger.Factory.create(TarsDecoder::class, \"TarsDecoder\")\n\n    }\n\n    override fun beginStructure(descriptor: SerialDescriptor): CompositeDecoder {\n        debugLogger.println()\n        debugLogger.println { \"beginStructure: ${descriptor.serialName}, ${descriptor.kind}\" }\n        debugLogger.structureHierarchy++\n        return when (descriptor.kind) {\n            is PrimitiveKind -> this@TarsDecoder\n\n            StructureKind.MAP -> {\n                val tag = popTag()\n                // debugLogger.println(\"!! MAP, tag=$tag\")\n                return input.skipToHeadAndUseIfPossibleOrFail(tag.id) {\n                    it.checkType(Tars.MAP, \"beginStructure\", tag, descriptor)\n                    MapReader\n                }\n            }\n            StructureKind.LIST -> {\n                //debugLogger.println(\"!! ByteArray\")\n                //debugLogger.println(\"decoderTag: $currentTagOrNull\")\n                //debugLogger.println(\"TarsHead: \" + Tars.currentHeadOrNull)\n                return input.skipToHeadAndUseIfPossibleOrFail(currentTag.id) {\n                    // don't check type. it's polymorphic\n\n                    //debugLogger.println(\"listHead: $it\")\n                    when (it.type) {\n                        Tars.SIMPLE_LIST -> {\n                            currentTag.isSimpleByteArray = true\n                            input.nextHead() // 无用的元素类型\n                            SimpleByteArrayReader\n                        }\n                        Tars.LIST -> ListReader\n                        else -> error(\"type mismatch. Expected SIMPLE_LIST or LIST, got $it instead\")\n                    }\n                }\n            }\n            StructureKind.CLASS -> {\n                currentTagOrNull ?: return this@TarsDecoder // outermost\n\n                //debugLogger.println(\"!! CLASS\")\n                //debugLogger.println(\"decoderTag: $currentTag\")\n                //debugLogger.println(\"TarsHead: \" + Tars.currentHeadOrNull)\n                val tag = popTag()\n                return input.skipToHeadAndUseIfPossibleOrFail(tag.id) { TarsHead ->\n                    TarsHead.checkType(Tars.STRUCT_BEGIN, \"beginStructure\", tag, descriptor)\n\n                    repeat(descriptor.elementsCount) {\n                        pushTag(descriptor.getTag(descriptor.elementsCount - it - 1)) // better performance\n                    }\n                    this // independent tag stack\n                }\n            }\n\n            StructureKind.OBJECT -> error(\"unsupported StructureKind.OBJECT: ${descriptor.serialName}\")\n            is SerialKind.ENUM -> error(\"unsupported UnionKind: ${descriptor.serialName}\")\n            is PolymorphicKind -> error(\"unsupported PolymorphicKind: ${descriptor.serialName}\")\n            is SerialKind.CONTEXTUAL -> error(\"unsupported PolymorphicKind: ${descriptor.serialName}\")\n        }\n    }\n\n    override fun decodeSequentially(): Boolean = false\n    override fun decodeElementIndex(descriptor: SerialDescriptor): Int {\n        var tarsHead = input.currentHeadOrNull ?: kotlin.run {\n            debugLogger.println(\"decodeElementIndex: currentHead == null\")\n            return CompositeDecoder.DECODE_DONE\n        }\n\n        debugLogger.println { \"decodeElementIndex: ${input.currentHead}\" }\n        while (!input.input.endOfInput) {\n            if (tarsHead.type == Tars.STRUCT_END) {\n                debugLogger.println { \"decodeElementIndex: ${input.currentHead}\" }\n                return CompositeDecoder.DECODE_DONE\n            }\n\n            repeat(descriptor.elementsCount) {\n                val tag = descriptor.getTarsTagId(it)\n                if (tag == tarsHead.tag) {\n                    debugLogger.println {\n                        \"name=\" + descriptor.getElementName(\n                            it\n                        )\n                    }\n                    return it\n                }\n            }\n\n            input.skipField(tarsHead.type)\n            if (!input.prepareNextHead()) {\n                debugLogger.println { \"decodeElementIndex EOF\" }\n                break\n            }\n            tarsHead = input.currentHead\n            debugLogger.println { \"next! $tarsHead\" }\n        }\n\n        return CompositeDecoder.DECODE_DONE // optional support\n    }\n\n    override fun decodeTaggedInt(tag: TarsTag): Int =\n        kotlin.runCatching { input.skipToHeadAndUseIfPossibleOrFail(tag.id) { input.readTarsIntValue(it) } }.getOrElse {\n            throw IllegalStateException(\"$tag\", it)\n        }\n\n    override fun decodeTaggedByte(tag: TarsTag): Byte =\n        kotlin.runCatching {\n            input.skipToHeadAndUseIfPossibleOrFail(tag.id) { input.readTarsByteValue(it) }\n        }.getOrElse {\n            throw IllegalStateException(\"$tag\", it)\n        }\n\n    override fun decodeTaggedBoolean(tag: TarsTag): Boolean =\n        input.skipToHeadAndUseIfPossibleOrFail(tag.id) { input.readTarsBooleanValue(it) }\n\n    override fun decodeTaggedFloat(tag: TarsTag): Float =\n        input.skipToHeadAndUseIfPossibleOrFail(tag.id) { input.readTarsFloatValue(it) }\n\n    override fun decodeTaggedDouble(tag: TarsTag): Double =\n        input.skipToHeadAndUseIfPossibleOrFail(tag.id) { input.readTarsDoubleValue(it) }\n\n    override fun decodeTaggedShort(tag: TarsTag): Short =\n        input.skipToHeadAndUseIfPossibleOrFail(tag.id) { input.readTarsShortValue(it) }\n\n    override fun decodeTaggedLong(tag: TarsTag): Long =\n        input.skipToHeadAndUseIfPossibleOrFail(tag.id) { input.readTarsLongValue(it) }\n\n    override fun decodeTaggedString(tag: TarsTag): String =\n        input.skipToHeadAndUseIfPossibleOrFail(tag.id) { input.readTarsStringValue(it) }\n\n    override fun decodeTaggedNotNullMark(tag: TarsTag): Boolean {\n        return input.skipToHeadOrNull(tag.id) != null\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/io/serialization/tars/internal/TarsInput.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils.io.serialization.tars.internal\n\nimport io.ktor.utils.io.charsets.*\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars\n\n\n/**\n * Tars Input. 需要手动管理 head.\n */\ninternal class TarsInput(\n    val input: Input, private val charset: Charset, private val debugLogger: DebugLogger,\n) {\n    private var _head: TarsHead? = null\n    private var _nextHead: TarsHead? = null\n\n    val currentHead: TarsHead get() = _head ?: throw EOFException(\"No current TarsHead available\")\n    val currentHeadOrNull: TarsHead? get() = _head\n\n    init {\n        prepareNextHead()\n    }\n\n    /**\n     * 预读取下个 [TarsHead]\n     *\n     * 注意: 应该读完 [currentHead] 的值再调用\n     */\n    @Suppress(\"MemberVisibilityCanBePrivate\")\n    fun peekNextHead(): TarsHead? {\n        _nextHead?.let { return it }\n        return readNextHeadButDoNotAssignTo_Head(true).also { _nextHead = it; }.also {\n            debugLogger.println(\"Peek next head: $it\")\n        }\n    }\n\n    /**\n     * 读取下一个 [TarsHead] 并保存. 可通过 [currentHead] 获取这个 [TarsHead].\n     *\n     * @return 是否成功读取. 返回 `false` 时代表 [Input.endOfInput]\n     */\n    fun prepareNextHead(): Boolean {\n        return readNextHeadButDoNotAssignTo_Head().also { _head = it; } != null\n    }\n\n    fun nextHead(): TarsHead {\n        if (!prepareNextHead()) {\n            throw EOFException(\"No more TarsHead available\")\n        }\n        return currentHead\n    }\n\n    /**\n     * 直接读取下一个 [TarsHead] 并返回.\n     * 返回 `null` 则代表 [Input.endOfInput]\n     */\n    @Suppress(\"FunctionName\")\n    @OptIn(ExperimentalUnsignedTypes::class)\n    private fun readNextHeadButDoNotAssignTo_Head(\n        ignoreNextHead: Boolean = false,\n    ): TarsHead? {\n        if (!ignoreNextHead) {\n            val n = _nextHead\n            if (n != null) {\n                _nextHead = null\n                return n\n            }\n        }\n        if (input.endOfInput) {\n            return null\n        }\n        val var2 = try {\n            input.readByte().toUByte()\n        } catch (e: EOFException) {\n            // somehow `endOfInput` still returns false\n            return null\n        }\n        val type = var2 and 15u\n        var tag = var2.toUInt() shr 4\n        if (tag == 15u) {\n            tag = input.readByte().toUByte().toUInt()\n        }\n        return TarsHead(\n            tag = tag.toInt(),\n            type = type.toByte()\n        )\n    }\n\n    /**\n     * 使用这个 [TarsHead].\n     * [block] 结束后将会 [准备下一个 [TarsHead]][prepareNextHead]\n     */\n    inline fun <R> useHead(crossinline block: (TarsHead) -> R): R {\n        return currentHead.let(block).also { prepareNextHead() }\n    }\n\n    /**\n     * 跳过 [TarsHead] 和对应的数据值, 直到找到 [tag], 否则返回 `null`\n     */\n    inline fun <R> skipToHeadAndUseIfPossibleOrNull(tag: Int, crossinline block: (TarsHead) -> R): R? {\n        return skipToHeadOrNull(tag)?.let(block).also { prepareNextHead() }\n    }\n\n    /**\n     * 跳过 [TarsHead] 和对应的数据值, 直到找到 [tag], 否则抛出异常\n     */\n    inline fun <R : Any> skipToHeadAndUseIfPossibleOrFail(\n        tag: Int,\n        crossinline message: () -> String = { \"tag not found: $tag\" },\n        crossinline block: (TarsHead) -> R,\n    ): R {\n        return checkNotNull(skipToHeadAndUseIfPossibleOrNull(tag, block), message)\n    }\n\n    @Suppress(\"MemberVisibilityCanBePrivate\")\n    fun skipToTag(tag: Int): Boolean {\n        while (true) {\n            val hd = peekNextHead() ?: return false\n            if (tag <= hd.tag || hd.type == 11.toByte()) {\n                return tag == hd.tag\n            }\n            debugLogger.println(\"Discard $tag, $hd, ${hd.size}\")\n            input.discardExact(hd.size)\n            skipField(hd.type)\n        }\n    }\n\n    @Suppress(\"MemberVisibilityCanBePrivate\")\n    fun readInt32(tag: Int): Int {\n        if (!skipToTag(tag)) return 0\n        return readTarsIntValue(nextHead())\n    }\n\n    tailrec fun skipToHeadOrNull(tag: Int): TarsHead? {\n        val current: TarsHead = currentHeadOrNull ?: return null // no backing field\n\n        return when {\n            current.tag > tag -> null // tag 大了，即找不到\n            current.tag == tag -> current // 满足需要.\n            else -> { // tag 小了\n                skipField(current.type)\n                check(prepareNextHead()) { \"cannot skip to tag $tag, early EOF\" }\n                skipToHeadOrNull(tag)\n            }\n        }\n    }\n\n    @OptIn(ExperimentalUnsignedTypes::class)\n    @PublishedApi\n    internal fun skipField(type: Byte) {\n        debugLogger.println {\n            \"skipping ${\n                TarsHead.findTarsTypeName(\n                    type\n                )\n            }\"\n        }\n        when (type) {\n            Tars.BYTE -> this.input.discardExact(1)\n            Tars.SHORT -> this.input.discardExact(2)\n            Tars.INT -> this.input.discardExact(4)\n            Tars.LONG -> this.input.discardExact(8)\n            Tars.FLOAT -> this.input.discardExact(4)\n            Tars.DOUBLE -> this.input.discardExact(8)\n            Tars.STRING1 -> this.input.discardExact(this.input.readByte().toUByte().toInt())\n            Tars.STRING4 -> this.input.discardExact(this.input.readInt())\n            Tars.MAP -> { // map\n                debugLogger.structureHierarchy++\n                repeat(readInt32(0).also {\n                    debugLogger.println(\"SIZE = $it\")\n                } * 2) {\n                    skipField(nextHead().type)\n                }\n                debugLogger.structureHierarchy--\n            }\n            Tars.LIST -> { // list\n                debugLogger.structureHierarchy++\n                repeat(readInt32(0).also {\n                    debugLogger.println(\"SIZE = $it\")\n                }) {\n                    skipField(nextHead().type)\n                }\n                debugLogger.structureHierarchy--\n            }\n            Tars.STRUCT_BEGIN -> {\n                debugLogger.structureHierarchy++\n                var head: TarsHead\n                do {\n                    head = nextHead()\n                    if (head.type == Tars.STRUCT_END) {\n                        debugLogger.structureHierarchy--\n                        skipField(head.type)\n                        break\n                    }\n                    skipField(head.type)\n                } while (head.type != Tars.STRUCT_END)\n            }\n            Tars.STRUCT_END, Tars.ZERO_TYPE -> {\n            }\n            Tars.SIMPLE_LIST -> {\n                debugLogger.structureHierarchy++\n                var head = nextHead()\n                check(head.type == Tars.BYTE) { \"bad simple list element type: \" + head.type + \", $head\" }\n                check(head.tag == 0) { \"simple list element tag must be 0, but was ${head.tag}\" }\n\n                head = nextHead()\n                check(head.tag == 0) { \"tag for size for simple list must be 0, but was ${head.tag}\" }\n                this.input.discardExact(readTarsIntValue(head))\n                debugLogger.structureHierarchy--\n            }\n            else -> error(\"invalid type: $type\")\n        }\n    }\n\n    // region readers\n    fun readTarsIntValue(head: TarsHead): Int {\n        //debugLogger.println(\"readTarsIntValue: $head\")\n        return readTarsIntValue(head.type, head)\n    }\n\n    @Suppress(\"MemberVisibilityCanBePrivate\")\n    fun readTarsIntValue(type: Byte, head: Any = type): Int {\n        return when (type) {\n            Tars.ZERO_TYPE -> 0\n            Tars.BYTE -> input.readByte().toInt()\n            Tars.SHORT -> input.readShort().toInt()\n            Tars.INT -> input.readInt()\n            else -> error(\"type mismatch: $head, expecting int.\")\n        }\n    }\n\n    fun readTarsShortValue(head: TarsHead): Short {\n        return when (head.type) {\n            Tars.ZERO_TYPE -> 0\n            Tars.BYTE -> input.readByte().toShort()\n            Tars.SHORT -> input.readShort()\n            else -> error(\"type mismatch: $head, expecting short.\")\n        }\n    }\n\n    fun readTarsLongValue(head: TarsHead): Long {\n        return when (head.type) {\n            Tars.ZERO_TYPE -> 0\n            Tars.BYTE -> input.readByte().toLong()\n            Tars.SHORT -> input.readShort().toLong()\n            Tars.INT -> input.readInt().toLong()\n            Tars.LONG -> input.readLong()\n            else -> error(\"type mismatch ${head}, expecting long.\")\n        }\n    }\n\n    fun readTarsByteValue(head: TarsHead): Byte {\n        //debugLogger.println(\"readTarsByteValue: $head\")\n        return when (head.type) {\n            Tars.ZERO_TYPE -> 0\n            Tars.BYTE -> input.readByte()\n            else -> error(\"type mismatch: $head, expecting byte.\")\n        }\n    }\n\n    fun readTarsFloatValue(head: TarsHead): Float {\n        return when (head.type) {\n            Tars.ZERO_TYPE -> 0f\n            Tars.FLOAT -> input.readFloat()\n            else -> error(\"type mismatch: $head, expecting float.\")\n        }\n    }\n\n    @OptIn(ExperimentalUnsignedTypes::class)\n    fun readTarsStringValue(head: TarsHead): String {\n        //debugLogger.println(\"readTarsStringValue: $head\")\n        return when (head.type) {\n            Tars.STRING1 -> input.readString(input.readByte().toUByte().toInt(), charset = charset)\n            Tars.STRING4 -> input.readString(\n                input.readInt().toUInt().toInt().also { require(it in 1 until 104857600) { \"bad string length: $it\" } },\n                charset = charset\n            )\n            else -> error(\"type mismatch: $head, expecting 6 or 7 (for string)\")\n        }\n    }\n\n    fun readTarsDoubleValue(head: TarsHead): Double {\n        return when (head.type.toInt()) {\n            12 -> 0.0\n            4 -> input.readFloat().toDouble()\n            5 -> input.readDouble()\n            else -> error(\"type mismatch: $head\")\n        }\n    }\n\n    fun readTarsBooleanValue(head: TarsHead): Boolean {\n        return readTarsByteValue(head) == 1.toByte()\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/io/serialization/tars/internal/TarsOld.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils.io.serialization.tars.internal\n\nimport io.ktor.utils.io.charsets.*\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.*\nimport kotlinx.serialization.builtins.MapEntrySerializer\nimport kotlinx.serialization.builtins.SetSerializer\nimport kotlinx.serialization.descriptors.PolymorphicKind\nimport kotlinx.serialization.descriptors.PrimitiveKind\nimport kotlinx.serialization.descriptors.SerialDescriptor\nimport kotlinx.serialization.descriptors.StructureKind\nimport kotlinx.serialization.encoding.CompositeEncoder\nimport kotlinx.serialization.internal.MapLikeSerializer\nimport kotlinx.serialization.internal.TaggedEncoder\nimport kotlinx.serialization.modules.EmptySerializersModule\nimport kotlinx.serialization.modules.SerializersModule\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars.Companion.BYTE\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars.Companion.DOUBLE\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars.Companion.FLOAT\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars.Companion.INT\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars.Companion.LIST\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars.Companion.LONG\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars.Companion.MAP\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars.Companion.SHORT\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars.Companion.SIMPLE_LIST\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars.Companion.STRING1\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars.Companion.STRING4\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars.Companion.STRUCT_BEGIN\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars.Companion.STRUCT_END\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars.Companion.Tars_MAX_STRING_LENGTH\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars.Companion.ZERO_TYPE\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\n\n@OptIn(ExperimentalSerializationApi::class)\ninternal inline fun <reified A : Annotation> SerialDescriptor.findAnnotation(elementIndex: Int): A? {\n    val candidates = getElementAnnotations(elementIndex).filterIsInstance<A>()\n    return when (candidates.size) {\n        0 -> null\n        1 -> candidates[0]\n        else -> throw IllegalStateException(\"There are duplicate annotations of type ${A::class} in the descriptor $this\")\n    }\n}\n\ninternal fun getSerialId(desc: SerialDescriptor, index: Int): Int? = desc.findAnnotation<TarsId>(index)?.id\n\n//@Suppress(\"DEPRECATION_ERROR\")\n@OptIn(InternalSerializationApi::class, ExperimentalSerializationApi::class)\ninternal class TarsOld internal constructor(\n    private val charset: Charset,\n    override val serializersModule: SerializersModule = EmptySerializersModule(),\n) :\n    SerialFormat, BinaryFormat {\n\n    private inner class ListWriter(\n        private val count: Int,\n        private val tag: Int,\n        private val parentEncoder: TarsEncoder,\n    ) : TarsEncoder(BytePacketBuilder()) {\n        override fun SerialDescriptor.getTag(index: Int): Int {\n            return 0\n        }\n\n        override fun endEncode(descriptor: SerialDescriptor) {\n            parentEncoder.writeHead(LIST, this.tag)\n            parentEncoder.encodeTaggedInt(0, count)\n            parentEncoder.output.writePacket(this.output.build())\n        }\n    }\n\n    private inner class TarsMapWriter(\n        output: BytePacketBuilder,\n    ) : TarsEncoder(output) {\n        override fun SerialDescriptor.getTag(index: Int): Int {\n            return if (index % 2 == 0) 0 else 1\n        }\n\n        /*\n        override fun endEncode(desc: SerialDescriptor) {\n            parentEncoder.writeHead(MAP, this.tag)\n            parentEncoder.encodeTaggedInt(Int.STUB_FOR_PRIMITIVE_NUMBERS_GBK, count)\n            // println(this.output.toByteArray().toUHexString())\n            parentEncoder.output.write(this.output.toByteArray())\n        }*/\n\n    }\n\n    /**\n     * From: com.qq.taf.Tars.TarsOutputStream\n     */\n    @Suppress(\"unused\", \"MemberVisibilityCanBePrivate\")\n    private open inner class TarsEncoder(\n        val output: BytePacketBuilder,\n    ) : TaggedEncoder<Int>() {\n        override val serializersModule get() = this@TarsOld.serializersModule\n\n        override fun SerialDescriptor.getTag(index: Int): Int {\n            return getSerialId(this, index) ?: error(\"cannot find @SerialId\")\n        }\n\n        /**\n         * 序列化最开始的时候的\n         */\n        override fun beginStructure(\n            descriptor: SerialDescriptor,\n        ): CompositeEncoder =\n            when (descriptor.kind) {\n                StructureKind.LIST -> this\n                StructureKind.MAP -> this\n                StructureKind.CLASS, StructureKind.OBJECT -> this\n                is PolymorphicKind -> this\n                else -> throw SerializationException(\"Primitives are not supported at top-level\")\n            }\n\n        @Suppress(\"UNCHECKED_CAST\", \"NAME_SHADOWING\")\n        override fun <T> encodeSerializableValue(serializer: SerializationStrategy<T>, value: T) = when {\n            serializer.descriptor.kind == StructureKind.MAP -> {\n                try {\n                    val entries = (value as Map<*, *>).entries\n                    val serializer = (serializer as MapLikeSerializer<Any?, Any?, T, *>)\n                    val mapEntrySerial = MapEntrySerializer(serializer.keySerializer, serializer.valueSerializer)\n\n                    this.writeHead(MAP, currentTag)\n                    this.encodeTaggedInt(0, entries.count())\n                    SetSerializer(mapEntrySerial).serialize(TarsMapWriter(this.output), entries)\n                } catch (e: Exception) {\n                    super.encodeSerializableValue(serializer, value)\n                }\n            }\n            serializer.descriptor.kind == StructureKind.LIST\n                    && value is ByteArray -> encodeTaggedByteArray(popTag(), value as ByteArray)\n            serializer.descriptor.kind == StructureKind.LIST\n                    && serializer.descriptor.getElementDescriptor(0) is PrimitiveKind -> {\n                serializer.serialize(\n                    ListWriter(\n                        when (value) {\n                            is ShortArray -> value.size\n                            is IntArray -> value.size\n                            is LongArray -> value.size\n                            is FloatArray -> value.size\n                            is DoubleArray -> value.size\n                            is CharArray -> value.size\n                            is ByteArray -> value.size\n                            is BooleanArray -> value.size\n                            else -> error(\"unknown array type: ${value.getClassName()}\")\n                        }, popTag(), this\n                    ),\n                    value\n                )\n            }\n            serializer.descriptor.kind == StructureKind.LIST && value is Array<*> -> {\n                if (serializer.descriptor.getElementDescriptor(0).kind is PrimitiveKind.BYTE) {\n                    encodeTaggedByteArray(popTag(), (value as Array<Byte>).toByteArray())\n                } else\n                    serializer.serialize(\n                        ListWriter((value as Array<*>).size, popTag(), this),\n                        value\n                    )\n            }\n            serializer.descriptor.kind == StructureKind.LIST -> {\n                serializer.serialize(\n                    ListWriter((value as Collection<*>).size, popTag(), this),\n                    value\n                )\n            }\n            serializer.descriptor.kind == StructureKind.CLASS -> {\n                if (currentTagOrNull == null) {\n                    serializer.serialize(this, value)\n                } else {\n                    this.writeHead(STRUCT_BEGIN, popTag())\n                    serializer.serialize(TarsEncoder(this.output), value)\n                    this.writeHead(STRUCT_END, 0)\n                }\n            }\n            else -> {\n                serializer.serialize(this, value)\n            }\n        }\n\n        public override fun encodeTaggedByte(tag: Int, value: Byte) {\n            if (value.toInt() == 0) {\n                writeHead(ZERO_TYPE, tag)\n            } else {\n                writeHead(BYTE, tag)\n                output.writeByte(value)\n            }\n        }\n\n        public override fun encodeTaggedShort(tag: Int, value: Short) {\n            if (value in Byte.MIN_VALUE..Byte.MAX_VALUE) {\n                encodeTaggedByte(tag, value.toByte())\n            } else {\n                writeHead(SHORT, tag)\n                output.writeShort(value)\n            }\n        }\n\n        public override fun encodeTaggedInt(tag: Int, value: Int) {\n            if (value in Short.MIN_VALUE..Short.MAX_VALUE) {\n                encodeTaggedShort(tag, value.toShort())\n            } else {\n                writeHead(INT, tag)\n                output.writeInt(value)\n            }\n        }\n\n        public override fun encodeTaggedFloat(tag: Int, value: Float) {\n            writeHead(FLOAT, tag)\n            output.writeFloat(value)\n        }\n\n        public override fun encodeTaggedDouble(tag: Int, value: Double) {\n            writeHead(DOUBLE, tag)\n            output.writeDouble(value)\n        }\n\n        public override fun encodeTaggedLong(tag: Int, value: Long) {\n            if (value in Int.MIN_VALUE..Int.MAX_VALUE) {\n                encodeTaggedInt(tag, value.toInt())\n            } else {\n                writeHead(LONG, tag)\n                output.writeLong(value)\n            }\n        }\n\n        public override fun encodeTaggedBoolean(tag: Int, value: Boolean) {\n            encodeTaggedByte(tag, if (value) 1 else 0)\n        }\n\n        public override fun encodeTaggedChar(tag: Int, value: Char) {\n            encodeTaggedByte(tag, value.code.toByte())\n        }\n\n        public override fun encodeTaggedEnum(tag: Int, enumDescriptor: SerialDescriptor, ordinal: Int) {\n            encodeTaggedInt(tag, ordinal)\n        }\n\n        public override fun encodeTaggedNull(tag: Int) {\n        }\n\n        fun encodeTaggedByteArray(tag: Int, bytes: ByteArray) {\n            writeHead(SIMPLE_LIST, tag)\n            writeHead(BYTE, 0)\n            encodeTaggedInt(0, bytes.size)\n            output.writeFully(bytes)\n        }\n\n        public override fun encodeTaggedString(tag: Int, value: String) {\n            require(value.length <= Tars_MAX_STRING_LENGTH) { \"string is too long for tag $tag\" }\n            val array = value.toByteArray(charset)\n            if (array.size > 255) {\n                writeHead(STRING4, tag)\n                output.writeInt(array.size)\n                output.writeFully(array)\n            } else {\n                writeHead(STRING1, tag)\n                output.writeByte(array.size.toByte()) // one byte\n                output.writeFully(array)\n            }\n        }\n\n        override fun encodeTaggedValue(tag: Int, value: Any) {\n            when (value) {\n                is Byte -> encodeTaggedByte(tag, value)\n                is Short -> encodeTaggedShort(tag, value)\n                is Int -> encodeTaggedInt(tag, value)\n                is Long -> encodeTaggedLong(tag, value)\n                is Float -> encodeTaggedFloat(tag, value)\n                is Double -> encodeTaggedDouble(tag, value)\n                is Boolean -> encodeTaggedBoolean(tag, value)\n                is String -> encodeTaggedString(tag, value)\n                is Unit -> {\n                }\n                else -> error(\"unsupported type: ${value.getClassName()}\")\n            }\n        }\n\n        fun writeHead(type: Byte, tag: Int) {\n            if (tag < 15) {\n                this.output.writeByte(((tag shl 4) or type.toInt()).toByte())\n                return\n            }\n            if (tag < 256) {\n                this.output.writeByte((type.toInt() or 0xF0).toByte())\n                this.output.writeByte(tag.toByte())\n                return\n            }\n            error(\"tag is too large: $tag\")\n        }\n    }\n\n    @Suppress(\"MemberVisibilityCanBePrivate\")\n    companion object : BinaryFormat by TarsOld(Charsets.UTF_8) {\n\n        private fun Any?.getClassName(): String =\n            (if (this == null) Unit::class else this::class).simpleName?.split(\".\")?.takeLast(2)?.joinToString(\".\")\n                ?: \"<unnamed class>\"\n    }\n\n    fun <T> dumpAsPacket(serializer: SerializationStrategy<T>, obj: T): ByteReadPacket {\n        val encoder = BytePacketBuilder()\n        val dumper = TarsEncoder(encoder)\n        dumper.encodeSerializableValue(serializer, obj)\n        return encoder.build()\n    }\n\n    override fun <T> encodeToByteArray(serializer: SerializationStrategy<T>, value: T): ByteArray {\n        return dumpAsPacket(serializer, value).readBytes()\n    }\n\n    override fun <T> decodeFromByteArray(deserializer: DeserializationStrategy<T>, bytes: ByteArray): T {\n        error(\"Use TarsNew.\")\n    }\n}\n\ninternal fun Input.readString(length: Int, charset: Charset = Charsets.UTF_8): String =\n    String(this.readBytes(length), charset = charset)\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/io/serialization/tars/internal/TarsTag.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils.io.serialization.tars.internal\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.descriptors.SerialDescriptor\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars\n\n\ninternal abstract class TarsTag {\n    abstract val id: Int\n    internal var isSimpleByteArray: Boolean = false\n}\n\n// For thread-safely, Don't use object\ninternal class TarsTagListElement : TarsTag() {\n    override val id: Int get() = 0\n    override fun toString(): String {\n        return \"TarsTagListElement\"\n    }\n}\n\n// For thread-safely, Don't use object\ninternal class TarsTagMapEntryKey : TarsTag() {\n    override val id: Int get() = 0\n    override fun toString(): String {\n        return \"TarsTagMapEntryKey\"\n    }\n}\n\n// For thread-safely, Don't use object\ninternal class TarsTagMapEntryValue : TarsTag() {\n    override val id: Int get() = 1\n    override fun toString(): String {\n        return \"TarsTagMapEntryValue\"\n    }\n}\n\ninternal data class TarsTagCommon(\n    override val id: Int,\n) : TarsTag()\n\n@OptIn(ExperimentalSerializationApi::class)\ninternal fun TarsHead.checkType(type: Byte, message: String, tag: TarsTag, descriptor: SerialDescriptor) {\n    check(this.type == type) {\n        \"type mismatch. \" +\n                \"Expected ${TarsHead.findTarsTypeName(type)}, \" +\n                \"actual ${TarsHead.findTarsTypeName(this.type)} for $message. \" +\n                \"Tag info: \" +\n                \"id=${tag.id}, \" +\n                \"name=${descriptor.getElementName(tag.id)} \" +\n                \"in ${descriptor.serialName}\"\n    }\n}\n\n@PublishedApi\ninternal fun Output.writeTarsHead(type: Byte, tag: Int) {\n    if (tag < 15) {\n        writeByte(((tag shl 4) or type.toInt()).toByte())\n        return\n    }\n    if (tag < 256) {\n        writeByte((type.toInt() or 0xF0).toByte())\n        writeByte(tag.toByte())\n        return\n    }\n    error(\"tag is too large: $tag\")\n}\n\n@OptIn(ExperimentalUnsignedTypes::class)\ninternal class TarsHead(private val value: Long) {\n    constructor(tag: Int, type: Byte) : this(tag.toLong().shl(32) or type.toLong())\n\n    val tag: Int get() = (value ushr 32).toInt()\n    val type: Byte get() = value.toUInt().toByte()\n    val size: Int\n        get() {\n            if (tag < 15) {\n                return 1\n            }\n            if (tag < 256) {\n                return 2\n            }\n            error(\"tag is too large: $tag\")\n        }\n\n    override fun toString(): String {\n        return \"TarsHead(tag=$tag, type=$type(${findTarsTypeName(type)}))\"\n    }\n\n    companion object {\n        fun findTarsTypeName(type: Byte): String {\n            return when (type) {\n                Tars.BYTE -> \"Byte\"\n                Tars.DOUBLE -> \"Double\"\n                Tars.FLOAT -> \"Float\"\n                Tars.INT -> \"Int\"\n                Tars.LIST -> \"List\"\n                Tars.LONG -> \"Long\"\n                Tars.MAP -> \"Map\"\n                Tars.SHORT -> \"Short\"\n                Tars.SIMPLE_LIST -> \"SimpleList\"\n                Tars.STRING1 -> \"String1\"\n                Tars.STRING4 -> \"String4\"\n                Tars.STRUCT_BEGIN -> \"StructBegin\"\n                Tars.STRUCT_END -> \"StructEnd\"\n                Tars.ZERO_TYPE -> \"Zero\"\n                else -> error(\"illegal Tars type: $type\")\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/io/serialization/utils.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmName(\"SerializationUtils\")\n@file:JvmMultifileClass\n@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage net.mamoe.mirai.internal.utils.io.serialization\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.DeserializationStrategy\nimport kotlinx.serialization.SerializationStrategy\nimport kotlinx.serialization.descriptors.SerialDescriptor\nimport net.mamoe.mirai.internal.message.contextualBugReportException\nimport net.mamoe.mirai.internal.network.protocol.data.jce.RequestDataVersion2\nimport net.mamoe.mirai.internal.network.protocol.data.jce.RequestDataVersion3\nimport net.mamoe.mirai.internal.network.protocol.data.jce.RequestPacket\nimport net.mamoe.mirai.internal.network.protocol.data.proto.OidbSso\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.internal.DebugLogger\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.internal.TarsDecoder\nimport net.mamoe.mirai.internal.utils.printStructure\nimport net.mamoe.mirai.utils.*\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.jvm.JvmInline\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\ninternal typealias KtProtoBuf = kotlinx.serialization.protobuf.ProtoBuf\n\ninternal fun <T : JceStruct> ByteArray.loadWithUniPacket(\n    deserializer: DeserializationStrategy<T>,\n    name: String? = null,\n): T = this.read { readUniPacket(deserializer, name) }\n\ninternal fun <T : JceStruct> ByteArray.loadAs(\n    deserializer: DeserializationStrategy<T>,\n    offset: Int = 0,\n    length: Int = size - offset,\n): T {\n    if (this.size >= 4) {\n        val possibleLength = this.toInt(offset = offset)\n//        return doLoadAs(deserializer, offset = offset + 4, length = possibleLength)\n\n        if (possibleLength == length || possibleLength == length - 4) {\n            return doLoadAs(\n                deserializer,\n                offset = offset + 4,\n                length = length - 4\n            )\n        }\n    }\n\n    return doLoadAs(deserializer, offset, length)\n}\n\nprivate fun <T : JceStruct> ByteArray.doLoadAs(\n    deserializer: DeserializationStrategy<T>,\n    offset: Int,\n    length: Int,\n): T {\n    try {\n        return this.toReadPacket(offset = offset, length = length).use { input ->\n            Tars.UTF_8.load(deserializer, input)\n        }\n    } catch (originalException: Exception) {\n        BytePacketBuilder().use { log ->\n            val build by lazy { log.build() }\n            try {\n                log.appendLine(\"\\nData: \")\n                log.appendLine(this.toUHexString(offset = offset, length = length))\n                log.appendLine(\"Trace:\")\n\n                val value = this.toReadPacket(offset = offset, length = length).use { input ->\n                    Tars.UTF_8.load(deserializer, input, debugLogger = DebugLogger(log))\n                }\n                return value.also {\n                    TarsDecoder.logger.warning(\n                        contextualBugReportException(\n                            \"解析 \" + deserializer.descriptor.serialName,\n                            \"启用 debug 模式后解析正常: $value \\n\\n${build.readText()}\",\n                            originalException\n                        )\n                    )\n                }\n            } catch (secondFailure: Exception) {\n                throw contextualBugReportException(\n                    \"解析 \" + deserializer.descriptor.serialName,\n                    build.readAllText(),\n                    ExceptionCollector.compressExceptions(originalException, secondFailure)\n                )\n            }\n        }\n    }\n}\n\ninternal fun <T : JceStruct> BytePacketBuilder.writeJceStruct(\n    serializer: SerializationStrategy<T>,\n    struct: T,\n) {\n    Tars.UTF_8.dumpTo(serializer, struct, this)\n}\n\ninternal fun <T : JceStruct> ByteReadPacket.readJceStruct(\n    deserializer: DeserializationStrategy<T>,\n    length: Int = this.remaining.toInt(),\n): T {\n    return this.useBytes(n = length) { data, arrayLength ->\n        data.loadAs(deserializer, offset = 0, length = arrayLength)\n    }\n}\n\ninternal fun <T : JceStruct> BytePacketBuilder.writeJceRequestPacket(\n    version: Int = 3,\n    servantName: String,\n    funcName: String,\n    name: String = funcName,\n    serializer: SerializationStrategy<T>,\n    body: T,\n) = writeJceStruct(\n    RequestPacket.serializer(),\n    RequestPacket(\n        requestId = 0,\n        version = version.toShort(),\n        servantName = servantName,\n        funcName = funcName,\n        sBuffer = jceRequestSBuffer(name, serializer, body),\n    ),\n)\n\n/**\n * 先解析为 [RequestPacket], 即 `UniRequest`, 再按版本解析 map, 再找出指定数据并反序列化\n */\ninternal fun <T : JceStruct> ByteReadPacket.readUniPacket(\n    deserializer: DeserializationStrategy<T>,\n    name: String? = null,\n): T {\n    return decodeUniRequestPacketAndDeserialize(name) {\n        it.read {\n            discardExact(1)\n            this.readJceStruct(deserializer, length = (this.remaining - 1).toInt())\n        }\n    }\n}\n\n/**\n * 先解析为 [RequestPacket], 即 `UniRequest`, 再按版本解析 map, 再找出指定数据并反序列化\n */\ninternal fun <T : ProtoBuf> ByteReadPacket.readUniPacket(\n    deserializer: DeserializationStrategy<T>,\n    name: String? = null,\n): T {\n    return decodeUniRequestPacketAndDeserialize(name) {\n        it.read {\n            discardExact(1)\n            this.readProtoBuf(deserializer, (this.remaining - 1).toInt())\n        }\n    }\n}\n\nprivate fun <K, V> Map<K, V>.singleValue(): V = this.entries.single().value\n\ninternal fun <R> ByteReadPacket.decodeUniRequestPacketAndDeserialize(name: String? = null, block: (ByteArray) -> R): R {\n    val request = this.readJceStruct(RequestPacket.serializer())\n\n    return block(\n        if (name == null) when (request.version?.toInt() ?: 3) {\n            2 -> request.sBuffer.loadAs(RequestDataVersion2.serializer()).map.singleValue().singleValue()\n            3 -> request.sBuffer.loadAs(RequestDataVersion3.serializer()).map.singleValue()\n            else -> error(\"unsupported version ${request.version}\")\n        } else when (request.version?.toInt() ?: 3) {\n            2 -> request.sBuffer.loadAs(RequestDataVersion2.serializer()).map.getOrElse(name) { error(\"cannot find $name\") }\n                .singleValue()\n            3 -> request.sBuffer.loadAs(RequestDataVersion3.serializer()).map.getOrElse(name) { error(\"cannot find $name\") }\n            else -> error(\"unsupported version ${request.version}\")\n        },\n    )\n}\n\ninternal fun <T : JceStruct> T.toByteArray(\n    serializer: SerializationStrategy<T>,\n): ByteArray = Tars.UTF_8.encodeToByteArray(serializer, this)\n\ninternal fun <T : ProtoBuf> BytePacketBuilder.writeProtoBuf(serializer: SerializationStrategy<T>, v: T) {\n    this.writeFully(v.toByteArray(serializer))\n}\n\ninternal fun <T : ProtoBuf> BytePacketBuilder.writeOidb(\n    command: Int = 0,\n    serviceType: Int = 0,\n    serializer: SerializationStrategy<T>,\n    v: T,\n    clientVersion: String = \"android 8.4.8\",\n) {\n    return this.writeProtoBuf(\n        OidbSso.OIDBSSOPkg.serializer(),\n        OidbSso.OIDBSSOPkg(\n            command = command,\n            serviceType = serviceType,\n            clientVersion = clientVersion,\n            bodybuffer = v.toByteArray(serializer),\n        ),\n    )\n}\n\n/**\n * dump\n */\ninternal fun <T : ProtoBuf> T.toByteArray(serializer: SerializationStrategy<T>): ByteArray {\n    return KtProtoBuf.encodeToByteArray(serializer, this)\n}\n\n/**\n * load\n */\ninternal fun <T : ProtoBuf> ByteArray.loadAs(deserializer: DeserializationStrategy<T>, offset: Int = 0): T {\n    if (offset != 0) {\n        require(offset in offset..this.lastIndex) { \"invalid offset: $offset\" }\n        return this.copyOfRange(offset, this.size).loadAs(deserializer)\n    }\n    return KtProtoBuf.decodeFromByteArray(deserializer, this)\n}\n\ninternal fun <T : ProtoBuf> ByteArray.loadOidb(deserializer: DeserializationStrategy<T>, log: Boolean = false): T {\n    val oidb = loadAs(OidbSso.OIDBSSOPkg.serializer())\n    if (log) {\n        oidb.printStructure(\"OIDB\")\n    }\n    return oidb.bodybuffer.loadAs(deserializer)\n}\n\n/**\n * load\n */\ninternal fun <T : ProtoBuf> ByteReadPacket.readProtoBuf(\n    serializer: DeserializationStrategy<T>,\n    length: Int = this.remaining.toInt(),\n): T = KtProtoBuf.decodeFromByteArray(serializer, this.readBytes(length))\n\n@Suppress(\"NON_PUBLIC_PRIMARY_CONSTRUCTOR_OF_INLINE_CLASS\")\n@JvmInline\ninternal value class OidbBodyOrFailure<T : ProtoBuf> private constructor(\n    private val v: Any,\n) {\n    internal class Failure(\n        val oidb: OidbSso.OIDBSSOPkg,\n    )\n\n    inline fun <R> fold(\n        onSuccess: T.(T) -> R,\n        onFailure: OidbSso.OIDBSSOPkg.(OidbSso.OIDBSSOPkg) -> R,\n    ): R {\n        contract {\n            callsInPlace(onSuccess, InvocationKind.AT_MOST_ONCE)\n            callsInPlace(onFailure, InvocationKind.AT_MOST_ONCE)\n        }\n        @Suppress(\"UNCHECKED_CAST\")\n        return if (v is Failure) {\n            onFailure(v.oidb, v.oidb)\n        } else {\n            val t = v as T\n            onSuccess(t, t)\n        }\n    }\n\n    companion object {\n        fun <T : ProtoBuf> success(t: T): OidbBodyOrFailure<T> = OidbBodyOrFailure(t)\n        fun <T : ProtoBuf> failure(oidb: OidbSso.OIDBSSOPkg): OidbBodyOrFailure<T> = OidbBodyOrFailure(Failure(oidb))\n    }\n}\n\n/**\n * load\n */\ninternal inline fun <T : ProtoBuf> ByteReadPacket.readOidbSsoPkg(\n    serializer: DeserializationStrategy<T>,\n    length: Int = this.remaining.toInt(),\n): OidbBodyOrFailure<T> {\n    val oidb = readBytes(length).loadAs(OidbSso.OIDBSSOPkg.serializer())\n    return if (oidb.result == 0) {\n        OidbBodyOrFailure.success(oidb.bodybuffer.loadAs(serializer))\n    } else {\n        OidbBodyOrFailure.failure(oidb)\n    }\n}\n\n/**\n * 构造 [RequestPacket] 的 [RequestPacket.sBuffer]\n */\ninternal fun <T : JceStruct> jceRequestSBuffer(\n    name: String,\n    serializer: SerializationStrategy<T>,\n    jceStruct: T,\n): ByteArray {\n    return RequestDataVersion3(\n        mapOf(\n            name to JCE_STRUCT_HEAD_OF_TAG_0 + jceStruct.toByteArray(serializer) + JCE_STRUCT_TAIL_OF_TAG_0,\n        ),\n    ).toByteArray(RequestDataVersion3.serializer())\n}\n\ninternal inline fun jceRequestSBuffer(block: JceRequestSBufferBuilder.() -> Unit): ByteArray {\n    contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }\n    return JceRequestSBufferBuilder().apply(block).complete()\n}\n\ninternal class JceRequestSBufferBuilder {\n    val map: MutableMap<String, ByteArray> = LinkedHashMap()\n    operator fun <T : JceStruct> String.invoke(\n        serializer: SerializationStrategy<T>,\n        jceStruct: T,\n    ) {\n        map[this] = JCE_STRUCT_HEAD_OF_TAG_0 + jceStruct.toByteArray(serializer) + JCE_STRUCT_TAIL_OF_TAG_0\n    }\n\n    fun complete(): ByteArray = RequestDataVersion3(map).toByteArray(RequestDataVersion3.serializer())\n}\n\nprivate val JCE_STRUCT_HEAD_OF_TAG_0 = byteArrayOf(0x0A)\nprivate val JCE_STRUCT_TAIL_OF_TAG_0 = byteArrayOf(0x0B)\n\ninternal inline fun <reified A : Annotation> SerialDescriptor.findAnnotation(elementIndex: Int): A? {\n    val candidates = getElementAnnotations(elementIndex).filterIsInstance<A>()\n    return when (candidates.size) {\n        0 -> null\n        1 -> candidates[0]\n        else -> throw IllegalStateException(\"There are duplicate annotations of type ${A::class} in the descriptor $this\")\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/numbers.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\n/**\n * 要求 [this] 最小为 [min].\n */\n@PublishedApi\ninternal fun Int.coerceAtLeastOrFail(min: Int): Int {\n    require(this >= min)\n    return this\n}\n\n/**\n * 要求 [this] 最小为 [min].\n */\n@PublishedApi\ninternal fun Long.coerceAtLeastOrFail(min: Long): Long {\n    require(this >= min)\n    return this\n}\n\n/**\n * 要求 [this] 最大为 [max].\n */\n@PublishedApi\ninternal fun Int.coerceAtMostOrFail(max: Int): Int =\n    if (this >= max) error(\"value $this is greater than its expected maximum value $max\")\n    else this\n\n@PublishedApi\ninternal fun Long.coerceAtMostOrFail(max: Long): Long =\n    if (this >= max) error(\"value $this is greater than its expected maximum value $max\")\n    else this"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/printStructure.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"EXPERIMENTAL_API_USAGE\", \"unused\")\n\npackage net.mamoe.mirai.internal.utils\n\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.debug\nimport net.mamoe.mirai.utils.StructureToStringTransformer\nimport net.mamoe.mirai.utils.structureToString\n\n\nprivate val SoutvLogger: MiraiLogger by lazy {\n    MiraiLogger.Factory.create(\n        StructureToStringTransformer::class,\n        \"printStructurally\"\n    )\n}\n\ninternal fun Any?.printStructure(name: String = \"unnamed\") {\n    return SoutvLogger.debug { \"$name = ${this.structureToString()}\" }\n}\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/retryWithServers.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport kotlinx.coroutines.withTimeoutOrNull\nimport net.mamoe.mirai.utils.cast\nimport kotlin.math.roundToInt\n\n\ninternal suspend inline fun <R, reified IP> Collection<Pair<IP, Int>>.retryWithServers(\n    timeoutMillis: Long,\n    onFail: (exception: Throwable?) -> Nothing,\n    crossinline block: suspend (ip: String, port: Int) -> R,\n): R {\n    require(this.isNotEmpty()) { \"receiver of retryWithServers must not be empty\" }\n\n    var exception: Throwable? = null\n    for (pair in this) {\n        return kotlin.runCatching {\n            withTimeoutOrNull(timeoutMillis) {\n                if (IP::class == Int::class) {\n                    block(pair.first.cast<Int>().toIpV4AddressString(), pair.second)\n                } else {\n                    block(pair.first.toString(), pair.second)\n                }\n            }\n        }.recover {\n            if (exception != null) {\n                it.addSuppressed(exception!!)\n            }\n            exception = it // so as to show last exception followed by suppressed others\n            null\n        }.getOrNull() ?: continue\n    }\n\n    onFail(exception)\n}\n\ninternal fun Int.sizeToString() = this.toLong().sizeToString()\ninternal fun Long.sizeToString(): String {\n    return if (this < 1024) {\n        \"$this B\"\n    } else ((this * 100.0 / 1024).roundToInt() / 100.0).toString() + \" KiB\"\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/runCoroutineInPlace.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport kotlinx.coroutines.CompletableDeferred\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.mirai.utils.MiraiLogger\nimport kotlin.coroutines.Continuation\nimport kotlin.coroutines.EmptyCoroutineContext\nimport kotlin.coroutines.intrinsics.COROUTINE_SUSPENDED\nimport kotlin.coroutines.intrinsics.startCoroutineUninterceptedOrReturn\n\n/**\n * Runs the [coroutine] directly in current thread, **expecting no suspension**.\n */\ninternal fun <R> runCoroutineInPlace(coroutine: suspend () -> R): R {\n    var lateResult: CompletableDeferred<R>? = null\n\n    val result = coroutine.startCoroutineUninterceptedOrReturn(Continuation(EmptyCoroutineContext) { r ->\n        val deferred: CompletableDeferred<R>? = lateResult\n        @Suppress(\"KotlinConstantConditions\")\n        if (deferred != null) {\n            r.fold(onSuccess = { deferred.complete(it) }, onFailure = { deferred.completeExceptionally(it) })\n        } else {\n            if (logger.isErrorEnabled) {\n                logger.error(IllegalStateException(\"runCoroutineInPlace reached an unexpected state: coroutine did not finish. ()\"))\n            }\n        }\n    })\n\n    if (result != COROUTINE_SUSPENDED) {\n        @Suppress(\"UNCHECKED_CAST\")\n        return result as R\n    }\n\n    lateResult = CompletableDeferred()\n\n    if (logger.isErrorEnabled) {\n        logger.error(IllegalStateException(\"runCoroutineInPlace reached an unexpected state: coroutine did not finish.\"))\n    }\n\n    return runBlocking { lateResult.await() }\n}\n\nprivate val myStubFailure = Exception()\n\nprivate class RunCoroutineInPlace\n\nprivate val logger by lazy {\n    MiraiLogger.Factory.create(RunCoroutineInPlace::class)\n}"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/string.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.Json\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.internal.contact.info.MemberInfoImpl\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n@Serializable\ninternal data class MessageData(\n    val data: String,\n    val cmd: Int,\n    val text: String,\n)\n\ninternal fun MessageData.toMemberInfo() = MemberInfoImpl(\n    uin = data.toLong(),\n    nick = text,\n    permission = MemberPermission.MEMBER,\n    remark = \"\",\n    nameCard = \"\",\n    specialTitle = \"\",\n    muteTimestamp = 0,\n    anonymousId = null,\n    isOfficialBot = true\n)\n\n@Suppress(\"RegExpRedundantEscape\")\ninternal val extraJsonPattern = Regex(\"<(\\\\{.*?\\\\})>\")\ninternal val jsonInstance = Json { ignoreUnknownKeys = true }\n\n@MiraiInternalApi\ninternal fun String.parseToMessageDataList(): Sequence<MessageData> {\n    return extraJsonPattern.findAll(this).filter { it.groups.size == 2 }.mapNotNull { result ->\n        jsonInstance.decodeFromString(MessageData.serializer(), result.groups[1]!!.value)\n    }\n}\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/kotlin/utils/type.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport net.mamoe.mirai.contact.ContactOrBot\nimport net.mamoe.mirai.internal.message.data.ForwardMessageInternal\nimport net.mamoe.mirai.internal.message.protocol.impl.ForwardMessageProtocol\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.chineseLength\n\n\ninternal fun Int.toIpV4AddressString(): String {\n    @Suppress(\"NAME_SHADOWING\")\n    var var0 = this.toLong() and 0xFFFFFFFF\n    return buildString {\n        for (var2 in 3 downTo 0) {\n            append(255L and var0 % 256L)\n            var0 /= 256L\n            if (var2 != 0) {\n                append('.')\n            }\n        }\n    }\n}\n\ninternal fun Iterable<SingleMessage>.estimateLength(target: ContactOrBot, upTo: Int): Int =\n    sumUpTo(upTo) { it, up ->\n        it.estimateLength(target, up)\n    }\n\n/**\n * @see ForwardMessageProtocol.ForwardMessageUploader.checkLength\n */\ninternal fun SingleMessage.estimateLength(target: ContactOrBot, upTo: Int): Int {\n    return when (this) {\n        is QuoteReply -> 444 + this.source.originalMessage.estimateLength(target, upTo) // Magic number\n        is Image -> 260 //Magic number\n        is PlainText -> content.chineseLength(upTo)\n        is At -> 60 //Magic number\n        is AtAll -> 60 //Magic number\n        is ForwardMessageInternal -> 0 // verified in ForwardMessageProtocol.ForwardMessageUploader.checkLength\n        else -> this.toString().chineseLength(upTo)\n    }\n}\n\ninternal inline fun <T> Iterable<T>.sumUpTo(upTo: Int, selector: (T, remaining: Int) -> Int): Int {\n    var sum = 0\n    for (element in this) {\n        if (sum >= upTo) {\n            return sum\n        }\n        sum += selector(element, (upTo - sum).coerceAtLeast(0))\n    }\n    return sum\n}\n\n"
  },
  {
    "path": "mirai-core/src/commonMain/resources/META-INF/services/net.mamoe.mirai.IMirai",
    "content": "#\n# Copyright 2019-2021 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nnet.mamoe.mirai.internal.MiraiImpl"
  },
  {
    "path": "mirai-core/src/commonMain/resources/META-INF/services/net.mamoe.mirai.auth.DefaultBotAuthorizationFactory",
    "content": "#\n# Copyright 2019-2023 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nnet.mamoe.mirai.internal.network.auth.DefaultBotAuthorizationFactoryImpl"
  },
  {
    "path": "mirai-core/src/commonMain/resources/META-INF/services/net.mamoe.mirai.event.InternalGlobalEventChannelProvider",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nnet.mamoe.mirai.internal.event.GlobalEventChannelProviderImpl"
  },
  {
    "path": "mirai-core/src/commonMain/resources/META-INF/services/net.mamoe.mirai.internal.message.protocol.MessageProtocol",
    "content": "#\n# Copyright 2019-2023 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nnet.mamoe.mirai.internal.message.protocol.impl.AudioProtocol\nnet.mamoe.mirai.internal.message.protocol.impl.CustomMessageProtocol\nnet.mamoe.mirai.internal.message.protocol.impl.FaceProtocol\nnet.mamoe.mirai.internal.message.protocol.impl.FileMessageProtocol\nnet.mamoe.mirai.internal.message.protocol.impl.FlashImageProtocol\nnet.mamoe.mirai.internal.message.protocol.impl.IgnoredMessagesProtocol\nnet.mamoe.mirai.internal.message.protocol.impl.ImageProtocol\nnet.mamoe.mirai.internal.message.protocol.impl.MarketFaceProtocol\nnet.mamoe.mirai.internal.message.protocol.impl.SuperFaceProtocol\nnet.mamoe.mirai.internal.message.protocol.impl.MusicShareProtocol\nnet.mamoe.mirai.internal.message.protocol.impl.PokeMessageProtocol\nnet.mamoe.mirai.internal.message.protocol.impl.PttMessageProtocol\nnet.mamoe.mirai.internal.message.protocol.impl.QuoteReplyProtocol\nnet.mamoe.mirai.internal.message.protocol.impl.RichMessageProtocol\nnet.mamoe.mirai.internal.message.protocol.impl.ShortVideoProtocol\nnet.mamoe.mirai.internal.message.protocol.impl.TextProtocol\nnet.mamoe.mirai.internal.message.protocol.impl.VipFaceProtocol\nnet.mamoe.mirai.internal.message.protocol.impl.ForwardMessageProtocol\nnet.mamoe.mirai.internal.message.protocol.impl.LongMessageProtocol\nnet.mamoe.mirai.internal.message.protocol.impl.UnsupportedMessageProtocol\nnet.mamoe.mirai.internal.message.protocol.impl.GeneralMessageSenderProtocol"
  },
  {
    "path": "mirai-core/src/commonMain/resources/META-INF/services/net.mamoe.mirai.message.data.InternalImageProtocol",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nnet.mamoe.mirai.internal.message.image.InternalImageProtocolImpl"
  },
  {
    "path": "mirai-core/src/commonMain/resources/META-INF/services/net.mamoe.mirai.message.data.InternalShortVideoProtocol",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nnet.mamoe.mirai.internal.message.image.InternalShortVideoProtocolImpl"
  },
  {
    "path": "mirai-core/src/commonMain/resources/META-INF/services/net.mamoe.mirai.message.data.OfflineAudio$Factory",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nnet.mamoe.mirai.internal.message.data.OfflineAudioFactoryImpl"
  },
  {
    "path": "mirai-core/src/commonMain/resources/META-INF/services/net.mamoe.mirai.utils.InternalProtocolDataExchange",
    "content": "#\n# Copyright 2019-2023 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nnet.mamoe.mirai.internal.utils.MiraiProtocolInternal$Exchange\n"
  },
  {
    "path": "mirai-core/src/commonMain/resources/emoji-pattern.regex",
    "content": "\\x{1F3F4}\\x{E0067}\\x{E0062}(?:\\x{E0077}\\x{E006C}\\x{E0073}|\\x{E0073}\\x{E0063}\\x{E0074}|\\x{E0065}\\x{E006E}\\x{E0067})\\x{E007F}|(?:\\x{1F9D1}\\x{1F3FF}\\x{200D}\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D})?|\\x{200D}(?:\\x{1F48B}\\x{200D})?)\\x{1F9D1}|\\x{1F469}\\x{1F3FF}\\x{200D}\\x{1F91D}\\x{200D}[\\x{1F468}\\x{1F469}]|\\x{1FAF1}\\x{1F3FF}\\x{200D}\\x{1FAF2})[\\x{1F3FB}-\\x{1F3FE}]|(?:\\x{1F9D1}\\x{1F3FE}\\x{200D}\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D})?|\\x{200D}(?:\\x{1F48B}\\x{200D})?)\\x{1F9D1}|\\x{1F469}\\x{1F3FE}\\x{200D}\\x{1F91D}\\x{200D}[\\x{1F468}\\x{1F469}]|\\x{1FAF1}\\x{1F3FE}\\x{200D}\\x{1FAF2})[\\x{1F3FB}-\\x{1F3FD}\\x{1F3FF}]|(?:\\x{1F9D1}\\x{1F3FD}\\x{200D}\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D})?|\\x{200D}(?:\\x{1F48B}\\x{200D})?)\\x{1F9D1}|\\x{1F469}\\x{1F3FD}\\x{200D}\\x{1F91D}\\x{200D}[\\x{1F468}\\x{1F469}]|\\x{1FAF1}\\x{1F3FD}\\x{200D}\\x{1FAF2})[\\x{1F3FB}\\x{1F3FC}\\x{1F3FE}\\x{1F3FF}]|(?:\\x{1F9D1}\\x{1F3FC}\\x{200D}\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D})?|\\x{200D}(?:\\x{1F48B}\\x{200D})?)\\x{1F9D1}|\\x{1F469}\\x{1F3FC}\\x{200D}\\x{1F91D}\\x{200D}[\\x{1F468}\\x{1F469}]|\\x{1FAF1}\\x{1F3FC}\\x{200D}\\x{1FAF2})[\\x{1F3FB}\\x{1F3FD}-\\x{1F3FF}]|(?:\\x{1F9D1}\\x{1F3FB}\\x{200D}\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D})?|\\x{200D}(?:\\x{1F48B}\\x{200D})?)\\x{1F9D1}|\\x{1F469}\\x{1F3FB}\\x{200D}\\x{1F91D}\\x{200D}[\\x{1F468}\\x{1F469}]|\\x{1FAF1}\\x{1F3FB}\\x{200D}\\x{1FAF2})[\\x{1F3FC}-\\x{1F3FF}]|\\x{1F468}(?:\\x{1F3FB}(?:\\x{200D}(?:\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D}\\x{1F468}[\\x{1F3FB}-\\x{1F3FF}]|\\x{1F468}[\\x{1F3FB}-\\x{1F3FF}])|\\x{200D}(?:\\x{1F48B}\\x{200D}\\x{1F468}[\\x{1F3FB}-\\x{1F3FF}]|\\x{1F468}[\\x{1F3FB}-\\x{1F3FF}]))|\\x{1F91D}\\x{200D}\\x{1F468}[\\x{1F3FC}-\\x{1F3FF}]|[\\x{2695}\\x{2696}\\x{2708}]\\x{FE0F}|[\\x{2695}\\x{2696}\\x{2708}]|[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}]))?|[\\x{1F3FC}-\\x{1F3FF}]\\x{200D}\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D}\\x{1F468}[\\x{1F3FB}-\\x{1F3FF}]|\\x{1F468}[\\x{1F3FB}-\\x{1F3FF}])|\\x{200D}(?:\\x{1F48B}\\x{200D}\\x{1F468}[\\x{1F3FB}-\\x{1F3FF}]|\\x{1F468}[\\x{1F3FB}-\\x{1F3FF}]))|\\x{200D}(?:\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D})?|\\x{200D}(?:\\x{1F48B}\\x{200D})?)\\x{1F468}|[\\x{1F468}\\x{1F469}]\\x{200D}(?:\\x{1F466}\\x{200D}\\x{1F466}|\\x{1F467}\\x{200D}[\\x{1F466}\\x{1F467}])|\\x{1F466}\\x{200D}\\x{1F466}|\\x{1F467}\\x{200D}[\\x{1F466}\\x{1F467}]|[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}])|\\x{1F3FF}\\x{200D}(?:\\x{1F91D}\\x{200D}\\x{1F468}[\\x{1F3FB}-\\x{1F3FE}]|[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}])|\\x{1F3FE}\\x{200D}(?:\\x{1F91D}\\x{200D}\\x{1F468}[\\x{1F3FB}-\\x{1F3FD}\\x{1F3FF}]|[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}])|\\x{1F3FD}\\x{200D}(?:\\x{1F91D}\\x{200D}\\x{1F468}[\\x{1F3FB}\\x{1F3FC}\\x{1F3FE}\\x{1F3FF}]|[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}])|\\x{1F3FC}\\x{200D}(?:\\x{1F91D}\\x{200D}\\x{1F468}[\\x{1F3FB}\\x{1F3FD}-\\x{1F3FF}]|[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}])|(?:\\x{1F3FF}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FE}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FD}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FC}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{200D}[\\x{2695}\\x{2696}\\x{2708}])\\x{FE0F}|\\x{200D}(?:[\\x{1F468}\\x{1F469}]\\x{200D}[\\x{1F466}\\x{1F467}]|[\\x{1F466}\\x{1F467}])|\\x{1F3FF}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FE}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FD}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FC}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FF}|\\x{1F3FE}|\\x{1F3FD}|\\x{1F3FC}|\\x{200D}[\\x{2695}\\x{2696}\\x{2708}])?|(?:\\x{1F469}(?:\\x{1F3FB}\\x{200D}\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D}[\\x{1F468}\\x{1F469}]|[\\x{1F468}\\x{1F469}])|\\x{200D}(?:\\x{1F48B}\\x{200D}[\\x{1F468}\\x{1F469}]|[\\x{1F468}\\x{1F469}]))|[\\x{1F3FC}-\\x{1F3FF}]\\x{200D}\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D}[\\x{1F468}\\x{1F469}]|[\\x{1F468}\\x{1F469}])|\\x{200D}(?:\\x{1F48B}\\x{200D}[\\x{1F468}\\x{1F469}]|[\\x{1F468}\\x{1F469}])))|\\x{1F9D1}[\\x{1F3FB}-\\x{1F3FF}]\\x{200D}\\x{1F91D}\\x{200D}\\x{1F9D1})[\\x{1F3FB}-\\x{1F3FF}]|\\x{1F469}\\x{200D}\\x{1F469}\\x{200D}(?:\\x{1F466}\\x{200D}\\x{1F466}|\\x{1F467}\\x{200D}[\\x{1F466}\\x{1F467}])|\\x{1F469}(?:\\x{200D}(?:\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D}[\\x{1F468}\\x{1F469}]|[\\x{1F468}\\x{1F469}])|\\x{200D}(?:\\x{1F48B}\\x{200D}[\\x{1F468}\\x{1F469}]|[\\x{1F468}\\x{1F469}]))|[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}])|\\x{1F3FF}\\x{200D}[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}]|\\x{1F3FE}\\x{200D}[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}]|\\x{1F3FD}\\x{200D}[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}]|\\x{1F3FC}\\x{200D}[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}]|\\x{1F3FB}\\x{200D}[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}])|\\x{1F9D1}(?:\\x{200D}(?:\\x{1F91D}\\x{200D}\\x{1F9D1}|[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F384}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}])|\\x{1F3FF}\\x{200D}[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F384}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}]|\\x{1F3FE}\\x{200D}[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F384}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}]|\\x{1F3FD}\\x{200D}[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F384}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}]|\\x{1F3FC}\\x{200D}[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F384}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}]|\\x{1F3FB}\\x{200D}[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F384}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}])|\\x{1F469}\\x{200D}\\x{1F466}\\x{200D}\\x{1F466}|\\x{1F469}\\x{200D}\\x{1F469}\\x{200D}[\\x{1F466}\\x{1F467}]|\\x{1F469}\\x{200D}\\x{1F467}\\x{200D}[\\x{1F466}\\x{1F467}]|(?:\\x{1F441}\\x{FE0F}?\\x{200D}\\x{1F5E8}|\\x{1F9D1}(?:\\x{1F3FF}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FE}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FD}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FC}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FB}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{200D}[\\x{2695}\\x{2696}\\x{2708}])|\\x{1F469}(?:\\x{1F3FF}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FE}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FD}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FC}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FB}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{200D}[\\x{2695}\\x{2696}\\x{2708}])|\\x{1F636}\\x{200D}\\x{1F32B}|\\x{1F3F3}\\x{FE0F}?\\x{200D}\\x{26A7}|\\x{1F43B}\\x{200D}\\x{2744}|(?:[\\x{1F3C3}\\x{1F3C4}\\x{1F3CA}\\x{1F46E}\\x{1F470}\\x{1F471}\\x{1F473}\\x{1F477}\\x{1F481}\\x{1F482}\\x{1F486}\\x{1F487}\\x{1F645}-\\x{1F647}\\x{1F64B}\\x{1F64D}\\x{1F64E}\\x{1F6A3}\\x{1F6B4}-\\x{1F6B6}\\x{1F926}\\x{1F935}\\x{1F937}-\\x{1F939}\\x{1F93D}\\x{1F93E}\\x{1F9B8}\\x{1F9B9}\\x{1F9CD}-\\x{1F9CF}\\x{1F9D4}\\x{1F9D6}-\\x{1F9DD}][\\x{1F3FB}-\\x{1F3FF}]|[\\x{1F46F}\\x{1F9DE}\\x{1F9DF}])\\x{200D}[\\x{2640}\\x{2642}]|[\\x{26F9}\\x{1F3CB}\\x{1F3CC}\\x{1F575}](?:[\\x{FE0F}\\x{1F3FB}-\\x{1F3FF}]\\x{200D}[\\x{2640}\\x{2642}]|\\x{200D}[\\x{2640}\\x{2642}])|\\x{1F3F4}\\x{200D}\\x{2620}|[\\x{1F3C3}\\x{1F3C4}\\x{1F3CA}\\x{1F46E}\\x{1F470}\\x{1F471}\\x{1F473}\\x{1F477}\\x{1F481}\\x{1F482}\\x{1F486}\\x{1F487}\\x{1F645}-\\x{1F647}\\x{1F64B}\\x{1F64D}\\x{1F64E}\\x{1F6A3}\\x{1F6B4}-\\x{1F6B6}\\x{1F926}\\x{1F935}\\x{1F937}-\\x{1F939}\\x{1F93C}-\\x{1F93E}\\x{1F9B8}\\x{1F9B9}\\x{1F9CD}-\\x{1F9CF}\\x{1F9D4}\\x{1F9D6}-\\x{1F9DD}]\\x{200D}[\\x{2640}\\x{2642}]|[\\xA9\\xAE\\x{203C}\\x{2049}\\x{2122}\\x{2139}\\x{2194}-\\x{2199}\\x{21A9}\\x{21AA}\\x{231A}\\x{231B}\\x{2328}\\x{23CF}\\x{23ED}-\\x{23EF}\\x{23F1}\\x{23F2}\\x{23F8}-\\x{23FA}\\x{24C2}\\x{25AA}\\x{25AB}\\x{25B6}\\x{25C0}\\x{25FB}\\x{25FC}\\x{25FE}\\x{2600}-\\x{2604}\\x{260E}\\x{2611}\\x{2614}\\x{2615}\\x{2618}\\x{2620}\\x{2622}\\x{2623}\\x{2626}\\x{262A}\\x{262E}\\x{262F}\\x{2638}-\\x{263A}\\x{2640}\\x{2642}\\x{2648}-\\x{2653}\\x{265F}\\x{2660}\\x{2663}\\x{2665}\\x{2666}\\x{2668}\\x{267B}\\x{267E}\\x{267F}\\x{2692}\\x{2694}-\\x{2697}\\x{2699}\\x{269B}\\x{269C}\\x{26A0}\\x{26A7}\\x{26AA}\\x{26B0}\\x{26B1}\\x{26BD}\\x{26BE}\\x{26C4}\\x{26C8}\\x{26CF}\\x{26D1}\\x{26D3}\\x{26E9}\\x{26F0}-\\x{26F5}\\x{26F7}\\x{26F8}\\x{26FA}\\x{2702}\\x{2708}\\x{2709}\\x{270F}\\x{2712}\\x{2714}\\x{2716}\\x{271D}\\x{2721}\\x{2733}\\x{2734}\\x{2744}\\x{2747}\\x{2757}\\x{2763}\\x{27A1}\\x{2934}\\x{2935}\\x{2B05}-\\x{2B07}\\x{2B1B}\\x{2B1C}\\x{2B55}\\x{3030}\\x{303D}\\x{3297}\\x{3299}\\x{1F004}\\x{1F170}\\x{1F171}\\x{1F17E}\\x{1F17F}\\x{1F202}\\x{1F237}\\x{1F321}\\x{1F324}-\\x{1F32C}\\x{1F336}\\x{1F37D}\\x{1F396}\\x{1F397}\\x{1F399}-\\x{1F39B}\\x{1F39E}\\x{1F39F}\\x{1F3CD}\\x{1F3CE}\\x{1F3D4}-\\x{1F3DF}\\x{1F3F5}\\x{1F3F7}\\x{1F43F}\\x{1F4FD}\\x{1F549}\\x{1F54A}\\x{1F56F}\\x{1F570}\\x{1F573}\\x{1F576}-\\x{1F579}\\x{1F587}\\x{1F58A}-\\x{1F58D}\\x{1F5A5}\\x{1F5A8}\\x{1F5B1}\\x{1F5B2}\\x{1F5BC}\\x{1F5C2}-\\x{1F5C4}\\x{1F5D1}-\\x{1F5D3}\\x{1F5DC}-\\x{1F5DE}\\x{1F5E1}\\x{1F5E3}\\x{1F5E8}\\x{1F5EF}\\x{1F5F3}\\x{1F5FA}\\x{1F6CB}\\x{1F6CD}-\\x{1F6CF}\\x{1F6E0}-\\x{1F6E5}\\x{1F6E9}\\x{1F6F0}\\x{1F6F3}])\\x{FE0F}|\\x{1F441}\\x{FE0F}?\\x{200D}\\x{1F5E8}|\\x{1F9D1}(?:\\x{1F3FF}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FE}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FD}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FC}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FB}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{200D}[\\x{2695}\\x{2696}\\x{2708}])|\\x{1F469}(?:\\x{1F3FF}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FE}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FD}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FC}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FB}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{200D}[\\x{2695}\\x{2696}\\x{2708}])|\\x{1F3F3}\\x{FE0F}?\\x{200D}\\x{1F308}|\\x{1F469}\\x{200D}\\x{1F467}|\\x{1F469}\\x{200D}\\x{1F466}|\\x{1F636}\\x{200D}\\x{1F32B}|\\x{1F3F3}\\x{FE0F}?\\x{200D}\\x{26A7}|\\x{1F635}\\x{200D}\\x{1F4AB}|\\x{1F62E}\\x{200D}\\x{1F4A8}|\\x{1F415}\\x{200D}\\x{1F9BA}|\\x{1FAF1}(?:\\x{1F3FF}|\\x{1F3FE}|\\x{1F3FD}|\\x{1F3FC}|\\x{1F3FB})?|\\x{1F9D1}(?:\\x{1F3FF}|\\x{1F3FE}|\\x{1F3FD}|\\x{1F3FC}|\\x{1F3FB})?|\\x{1F469}(?:\\x{1F3FF}|\\x{1F3FE}|\\x{1F3FD}|\\x{1F3FC}|\\x{1F3FB})?|\\x{1F43B}\\x{200D}\\x{2744}|(?:[\\x{1F3C3}\\x{1F3C4}\\x{1F3CA}\\x{1F46E}\\x{1F470}\\x{1F471}\\x{1F473}\\x{1F477}\\x{1F481}\\x{1F482}\\x{1F486}\\x{1F487}\\x{1F645}-\\x{1F647}\\x{1F64B}\\x{1F64D}\\x{1F64E}\\x{1F6A3}\\x{1F6B4}-\\x{1F6B6}\\x{1F926}\\x{1F935}\\x{1F937}-\\x{1F939}\\x{1F93D}\\x{1F93E}\\x{1F9B8}\\x{1F9B9}\\x{1F9CD}-\\x{1F9CF}\\x{1F9D4}\\x{1F9D6}-\\x{1F9DD}][\\x{1F3FB}-\\x{1F3FF}]|[\\x{1F46F}\\x{1F9DE}\\x{1F9DF}])\\x{200D}[\\x{2640}\\x{2642}]|[\\x{26F9}\\x{1F3CB}\\x{1F3CC}\\x{1F575}](?:[\\x{FE0F}\\x{1F3FB}-\\x{1F3FF}]\\x{200D}[\\x{2640}\\x{2642}]|\\x{200D}[\\x{2640}\\x{2642}])|\\x{1F3F4}\\x{200D}\\x{2620}|\\x{1F1FD}\\x{1F1F0}|\\x{1F1F6}\\x{1F1E6}|\\x{1F1F4}\\x{1F1F2}|\\x{1F408}\\x{200D}\\x{2B1B}|\\x{2764}(?:\\x{FE0F}\\x{200D}[\\x{1F525}\\x{1FA79}]|\\x{200D}[\\x{1F525}\\x{1FA79}])|\\x{1F441}\\x{FE0F}?|\\x{1F3F3}\\x{FE0F}?|[\\x{1F3C3}\\x{1F3C4}\\x{1F3CA}\\x{1F46E}\\x{1F470}\\x{1F471}\\x{1F473}\\x{1F477}\\x{1F481}\\x{1F482}\\x{1F486}\\x{1F487}\\x{1F645}-\\x{1F647}\\x{1F64B}\\x{1F64D}\\x{1F64E}\\x{1F6A3}\\x{1F6B4}-\\x{1F6B6}\\x{1F926}\\x{1F935}\\x{1F937}-\\x{1F939}\\x{1F93C}-\\x{1F93E}\\x{1F9B8}\\x{1F9B9}\\x{1F9CD}-\\x{1F9CF}\\x{1F9D4}\\x{1F9D6}-\\x{1F9DD}]\\x{200D}[\\x{2640}\\x{2642}]|\\x{1F1FF}[\\x{1F1E6}\\x{1F1F2}\\x{1F1FC}]|\\x{1F1FE}[\\x{1F1EA}\\x{1F1F9}]|\\x{1F1FC}[\\x{1F1EB}\\x{1F1F8}]|\\x{1F1FB}[\\x{1F1E6}\\x{1F1E8}\\x{1F1EA}\\x{1F1EC}\\x{1F1EE}\\x{1F1F3}\\x{1F1FA}]|\\x{1F1FA}[\\x{1F1E6}\\x{1F1EC}\\x{1F1F2}\\x{1F1F3}\\x{1F1F8}\\x{1F1FE}\\x{1F1FF}]|\\x{1F1F9}[\\x{1F1E6}\\x{1F1E8}\\x{1F1E9}\\x{1F1EB}-\\x{1F1ED}\\x{1F1EF}-\\x{1F1F4}\\x{1F1F7}\\x{1F1F9}\\x{1F1FB}\\x{1F1FC}\\x{1F1FF}]|\\x{1F1F8}[\\x{1F1E6}-\\x{1F1EA}\\x{1F1EC}-\\x{1F1F4}\\x{1F1F7}-\\x{1F1F9}\\x{1F1FB}\\x{1F1FD}-\\x{1F1FF}]|\\x{1F1F7}[\\x{1F1EA}\\x{1F1F4}\\x{1F1F8}\\x{1F1FA}\\x{1F1FC}]|\\x{1F1F5}[\\x{1F1E6}\\x{1F1EA}-\\x{1F1ED}\\x{1F1F0}-\\x{1F1F3}\\x{1F1F7}-\\x{1F1F9}\\x{1F1FC}\\x{1F1FE}]|\\x{1F1F3}[\\x{1F1E6}\\x{1F1E8}\\x{1F1EA}-\\x{1F1EC}\\x{1F1EE}\\x{1F1F1}\\x{1F1F4}\\x{1F1F5}\\x{1F1F7}\\x{1F1FA}\\x{1F1FF}]|\\x{1F1F2}[\\x{1F1E6}\\x{1F1E8}-\\x{1F1ED}\\x{1F1F0}-\\x{1F1FF}]|\\x{1F1F1}[\\x{1F1E6}-\\x{1F1E8}\\x{1F1EE}\\x{1F1F0}\\x{1F1F7}-\\x{1F1FB}\\x{1F1FE}]|\\x{1F1F0}[\\x{1F1EA}\\x{1F1EC}-\\x{1F1EE}\\x{1F1F2}\\x{1F1F3}\\x{1F1F5}\\x{1F1F7}\\x{1F1FC}\\x{1F1FE}\\x{1F1FF}]|\\x{1F1EF}[\\x{1F1EA}\\x{1F1F2}\\x{1F1F4}\\x{1F1F5}]|\\x{1F1EE}[\\x{1F1E8}-\\x{1F1EA}\\x{1F1F1}-\\x{1F1F4}\\x{1F1F6}-\\x{1F1F9}]|\\x{1F1ED}[\\x{1F1F0}\\x{1F1F2}\\x{1F1F3}\\x{1F1F7}\\x{1F1F9}\\x{1F1FA}]|\\x{1F1EC}[\\x{1F1E6}\\x{1F1E7}\\x{1F1E9}-\\x{1F1EE}\\x{1F1F1}-\\x{1F1F3}\\x{1F1F5}-\\x{1F1FA}\\x{1F1FC}\\x{1F1FE}]|\\x{1F1EB}[\\x{1F1EE}-\\x{1F1F0}\\x{1F1F2}\\x{1F1F4}\\x{1F1F7}]|\\x{1F1EA}[\\x{1F1E6}\\x{1F1E8}\\x{1F1EA}\\x{1F1EC}\\x{1F1ED}\\x{1F1F7}-\\x{1F1FA}]|\\x{1F1E9}[\\x{1F1EA}\\x{1F1EC}\\x{1F1EF}\\x{1F1F0}\\x{1F1F2}\\x{1F1F4}\\x{1F1FF}]|\\x{1F1E8}[\\x{1F1E6}\\x{1F1E8}\\x{1F1E9}\\x{1F1EB}-\\x{1F1EE}\\x{1F1F0}-\\x{1F1F5}\\x{1F1F7}\\x{1F1FA}-\\x{1F1FF}]|\\x{1F1E7}[\\x{1F1E6}\\x{1F1E7}\\x{1F1E9}-\\x{1F1EF}\\x{1F1F1}-\\x{1F1F4}\\x{1F1F6}-\\x{1F1F9}\\x{1F1FB}\\x{1F1FC}\\x{1F1FE}\\x{1F1FF}]|\\x{1F1E6}[\\x{1F1E8}-\\x{1F1EC}\\x{1F1EE}\\x{1F1F1}\\x{1F1F2}\\x{1F1F4}\\x{1F1F6}-\\x{1F1FA}\\x{1F1FC}\\x{1F1FD}\\x{1F1FF}]|[#\\*0-9]\\x{FE0F}?\\x{20E3}|\\x{1F93C}[\\x{1F3FB}-\\x{1F3FF}]|\\x{2764}\\x{FE0F}?|[\\x{1F3C3}\\x{1F3C4}\\x{1F3CA}\\x{1F46E}\\x{1F470}\\x{1F471}\\x{1F473}\\x{1F477}\\x{1F481}\\x{1F482}\\x{1F486}\\x{1F487}\\x{1F645}-\\x{1F647}\\x{1F64B}\\x{1F64D}\\x{1F64E}\\x{1F6A3}\\x{1F6B4}-\\x{1F6B6}\\x{1F926}\\x{1F935}\\x{1F937}-\\x{1F939}\\x{1F93D}\\x{1F93E}\\x{1F9B8}\\x{1F9B9}\\x{1F9CD}-\\x{1F9CF}\\x{1F9D4}\\x{1F9D6}-\\x{1F9DD}][\\x{1F3FB}-\\x{1F3FF}]|[\\x{26F9}\\x{1F3CB}\\x{1F3CC}\\x{1F575}][\\x{FE0F}\\x{1F3FB}-\\x{1F3FF}]?|\\x{1F3F4}|[\\x{270A}\\x{270B}\\x{1F385}\\x{1F3C2}\\x{1F3C7}\\x{1F442}\\x{1F443}\\x{1F446}-\\x{1F450}\\x{1F466}\\x{1F467}\\x{1F46B}-\\x{1F46D}\\x{1F472}\\x{1F474}-\\x{1F476}\\x{1F478}\\x{1F47C}\\x{1F483}\\x{1F485}\\x{1F48F}\\x{1F491}\\x{1F4AA}\\x{1F57A}\\x{1F595}\\x{1F596}\\x{1F64C}\\x{1F64F}\\x{1F6C0}\\x{1F6CC}\\x{1F90C}\\x{1F90F}\\x{1F918}-\\x{1F91F}\\x{1F930}-\\x{1F934}\\x{1F936}\\x{1F977}\\x{1F9B5}\\x{1F9B6}\\x{1F9BB}\\x{1F9D2}\\x{1F9D3}\\x{1F9D5}\\x{1FAC3}-\\x{1FAC5}\\x{1FAF0}\\x{1FAF2}-\\x{1FAF6}][\\x{1F3FB}-\\x{1F3FF}]|[\\x{261D}\\x{270C}\\x{270D}\\x{1F574}\\x{1F590}][\\x{FE0F}\\x{1F3FB}-\\x{1F3FF}]|[\\x{261D}\\x{270A}-\\x{270D}\\x{1F385}\\x{1F3C2}\\x{1F3C7}\\x{1F408}\\x{1F415}\\x{1F43B}\\x{1F442}\\x{1F443}\\x{1F446}-\\x{1F450}\\x{1F466}\\x{1F467}\\x{1F46B}-\\x{1F46D}\\x{1F472}\\x{1F474}-\\x{1F476}\\x{1F478}\\x{1F47C}\\x{1F483}\\x{1F485}\\x{1F48F}\\x{1F491}\\x{1F4AA}\\x{1F574}\\x{1F57A}\\x{1F590}\\x{1F595}\\x{1F596}\\x{1F62E}\\x{1F635}\\x{1F636}\\x{1F64C}\\x{1F64F}\\x{1F6C0}\\x{1F6CC}\\x{1F90C}\\x{1F90F}\\x{1F918}-\\x{1F91F}\\x{1F930}-\\x{1F934}\\x{1F936}\\x{1F93C}\\x{1F977}\\x{1F9B5}\\x{1F9B6}\\x{1F9BB}\\x{1F9D2}\\x{1F9D3}\\x{1F9D5}\\x{1FAC3}-\\x{1FAC5}\\x{1FAF0}\\x{1FAF2}-\\x{1FAF6}]|[\\x{1F3C3}\\x{1F3C4}\\x{1F3CA}\\x{1F46E}\\x{1F470}\\x{1F471}\\x{1F473}\\x{1F477}\\x{1F481}\\x{1F482}\\x{1F486}\\x{1F487}\\x{1F645}-\\x{1F647}\\x{1F64B}\\x{1F64D}\\x{1F64E}\\x{1F6A3}\\x{1F6B4}-\\x{1F6B6}\\x{1F926}\\x{1F935}\\x{1F937}-\\x{1F939}\\x{1F93D}\\x{1F93E}\\x{1F9B8}\\x{1F9B9}\\x{1F9CD}-\\x{1F9CF}\\x{1F9D4}\\x{1F9D6}-\\x{1F9DD}]|[\\x{1F46F}\\x{1F9DE}\\x{1F9DF}]|[\\xA9\\xAE\\x{203C}\\x{2049}\\x{2122}\\x{2139}\\x{2194}-\\x{2199}\\x{21A9}\\x{21AA}\\x{231A}\\x{231B}\\x{2328}\\x{23CF}\\x{23ED}-\\x{23EF}\\x{23F1}\\x{23F2}\\x{23F8}-\\x{23FA}\\x{24C2}\\x{25AA}\\x{25AB}\\x{25B6}\\x{25C0}\\x{25FB}\\x{25FC}\\x{25FE}\\x{2600}-\\x{2604}\\x{260E}\\x{2611}\\x{2614}\\x{2615}\\x{2618}\\x{2620}\\x{2622}\\x{2623}\\x{2626}\\x{262A}\\x{262E}\\x{262F}\\x{2638}-\\x{263A}\\x{2640}\\x{2642}\\x{2648}-\\x{2653}\\x{265F}\\x{2660}\\x{2663}\\x{2665}\\x{2666}\\x{2668}\\x{267B}\\x{267E}\\x{267F}\\x{2692}\\x{2694}-\\x{2697}\\x{2699}\\x{269B}\\x{269C}\\x{26A0}\\x{26A7}\\x{26AA}\\x{26B0}\\x{26B1}\\x{26BD}\\x{26BE}\\x{26C4}\\x{26C8}\\x{26CF}\\x{26D1}\\x{26D3}\\x{26E9}\\x{26F0}-\\x{26F5}\\x{26F7}\\x{26F8}\\x{26FA}\\x{2702}\\x{2708}\\x{2709}\\x{270F}\\x{2712}\\x{2714}\\x{2716}\\x{271D}\\x{2721}\\x{2733}\\x{2734}\\x{2744}\\x{2747}\\x{2757}\\x{2763}\\x{27A1}\\x{2934}\\x{2935}\\x{2B05}-\\x{2B07}\\x{2B1B}\\x{2B1C}\\x{2B55}\\x{3030}\\x{303D}\\x{3297}\\x{3299}\\x{1F004}\\x{1F170}\\x{1F171}\\x{1F17E}\\x{1F17F}\\x{1F202}\\x{1F237}\\x{1F321}\\x{1F324}-\\x{1F32C}\\x{1F336}\\x{1F37D}\\x{1F396}\\x{1F397}\\x{1F399}-\\x{1F39B}\\x{1F39E}\\x{1F39F}\\x{1F3CD}\\x{1F3CE}\\x{1F3D4}-\\x{1F3DF}\\x{1F3F5}\\x{1F3F7}\\x{1F43F}\\x{1F4FD}\\x{1F549}\\x{1F54A}\\x{1F56F}\\x{1F570}\\x{1F573}\\x{1F576}-\\x{1F579}\\x{1F587}\\x{1F58A}-\\x{1F58D}\\x{1F5A5}\\x{1F5A8}\\x{1F5B1}\\x{1F5B2}\\x{1F5BC}\\x{1F5C2}-\\x{1F5C4}\\x{1F5D1}-\\x{1F5D3}\\x{1F5DC}-\\x{1F5DE}\\x{1F5E1}\\x{1F5E3}\\x{1F5E8}\\x{1F5EF}\\x{1F5F3}\\x{1F5FA}\\x{1F6CB}\\x{1F6CD}-\\x{1F6CF}\\x{1F6E0}-\\x{1F6E5}\\x{1F6E9}\\x{1F6F0}\\x{1F6F3}]|[\\x{23E9}-\\x{23EC}\\x{23F0}\\x{23F3}\\x{25FD}\\x{2693}\\x{26A1}\\x{26AB}\\x{26C5}\\x{26CE}\\x{26D4}\\x{26EA}\\x{26FD}\\x{2705}\\x{2728}\\x{274C}\\x{274E}\\x{2753}-\\x{2755}\\x{2795}-\\x{2797}\\x{27B0}\\x{27BF}\\x{2B50}\\x{1F0CF}\\x{1F18E}\\x{1F191}-\\x{1F19A}\\x{1F201}\\x{1F21A}\\x{1F22F}\\x{1F232}-\\x{1F236}\\x{1F238}-\\x{1F23A}\\x{1F250}\\x{1F251}\\x{1F300}-\\x{1F320}\\x{1F32D}-\\x{1F335}\\x{1F337}-\\x{1F37C}\\x{1F37E}-\\x{1F384}\\x{1F386}-\\x{1F393}\\x{1F3A0}-\\x{1F3C1}\\x{1F3C5}\\x{1F3C6}\\x{1F3C8}\\x{1F3C9}\\x{1F3CF}-\\x{1F3D3}\\x{1F3E0}-\\x{1F3F0}\\x{1F3F8}-\\x{1F407}\\x{1F409}-\\x{1F414}\\x{1F416}-\\x{1F43A}\\x{1F43C}-\\x{1F43E}\\x{1F440}\\x{1F444}\\x{1F445}\\x{1F451}-\\x{1F465}\\x{1F46A}\\x{1F479}-\\x{1F47B}\\x{1F47D}-\\x{1F480}\\x{1F484}\\x{1F488}-\\x{1F48E}\\x{1F490}\\x{1F492}-\\x{1F4A9}\\x{1F4AB}-\\x{1F4FC}\\x{1F4FF}-\\x{1F53D}\\x{1F54B}-\\x{1F54E}\\x{1F550}-\\x{1F567}\\x{1F5A4}\\x{1F5FB}-\\x{1F62D}\\x{1F62F}-\\x{1F634}\\x{1F637}-\\x{1F644}\\x{1F648}-\\x{1F64A}\\x{1F680}-\\x{1F6A2}\\x{1F6A4}-\\x{1F6B3}\\x{1F6B7}-\\x{1F6BF}\\x{1F6C1}-\\x{1F6C5}\\x{1F6D0}-\\x{1F6D2}\\x{1F6D5}-\\x{1F6D7}\\x{1F6DD}-\\x{1F6DF}\\x{1F6EB}\\x{1F6EC}\\x{1F6F4}-\\x{1F6FC}\\x{1F7E0}-\\x{1F7EB}\\x{1F7F0}\\x{1F90D}\\x{1F90E}\\x{1F910}-\\x{1F917}\\x{1F920}-\\x{1F925}\\x{1F927}-\\x{1F92F}\\x{1F93A}\\x{1F93F}-\\x{1F945}\\x{1F947}-\\x{1F976}\\x{1F978}-\\x{1F9B4}\\x{1F9B7}\\x{1F9BA}\\x{1F9BC}-\\x{1F9CC}\\x{1F9D0}\\x{1F9E0}-\\x{1F9FF}\\x{1FA70}-\\x{1FA74}\\x{1FA78}-\\x{1FA7C}\\x{1FA80}-\\x{1FA86}\\x{1FA90}-\\x{1FAAC}\\x{1FAB0}-\\x{1FABA}\\x{1FAC0}-\\x{1FAC2}\\x{1FAD0}-\\x{1FAD9}\\x{1FAE0}-\\x{1FAE7}]"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/AbstractTestWithMiraiImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.internal\n\nimport net.mamoe.mirai.Mirai\nimport kotlin.test.AfterTest\nimport kotlin.test.BeforeTest\n\ninternal abstract class AbstractTestWithMiraiImpl : MiraiImpl() {\n    private val originalImpl = Mirai\n\n    @BeforeTest\n    fun setupMiraiImpl() {\n        @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n        net.mamoe.mirai._MiraiInstance.set(this)\n    }\n\n    @AfterTest\n    fun restoreMiraiImpl() {\n        @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n        net.mamoe.mirai._MiraiInstance.set(originalImpl)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/BotFactoryTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal\n\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.mirai.BotFactory\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport kotlin.test.Test\n\ninternal class BotFactoryTest : AbstractTest() {\n\n    @Test\n    fun `inlined newBot in Kotlin`() {\n        runBlocking {\n            BotFactory.newBot(123, \"\") {\n                inheritCoroutineContext()\n            }.close()\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/MockBot.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\n@file:Suppress(\"unused\")\n@file:OptIn(TestOnly::class)\n\npackage net.mamoe.mirai.internal\n\nimport net.mamoe.mirai.internal.network.component.ComponentStorage\nimport net.mamoe.mirai.internal.network.component.ConcurrentComponentStorage\nimport net.mamoe.mirai.internal.network.component.setAll\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.utils.BotConfiguration\nimport net.mamoe.mirai.utils.TestOnly\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.math.absoluteValue\nimport kotlin.random.Random\n\ninternal val MockAccount = BotAccount(Random.nextLong().absoluteValue.mod(1000L), \"pwd\")\n\ninternal val MockConfiguration = BotConfiguration {\n    randomDeviceInfo()\n}\n\ninternal class MockBotBuilder(\n    val conf: BotConfiguration = BotConfiguration(),\n) {\n    var nhProvider: (QQAndroidBot.(bot: QQAndroidBot) -> NetworkHandler)? = null\n    var additionalComponentsProvider: (QQAndroidBot.(bot: QQAndroidBot) -> ComponentStorage)? = null\n\n    fun conf(action: BotConfiguration.() -> Unit): MockBotBuilder {\n        contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }\n        conf.apply(action)\n        return this\n    }\n\n    fun networkHandlerProvider(provider: QQAndroidBot.(bot: QQAndroidBot) -> NetworkHandler): MockBotBuilder {\n        this.nhProvider = provider\n        return this\n    }\n}\n\n@Suppress(\"TestFunctionName\")\ninternal fun MockBot(account: BotAccount = MockAccount, conf: MockBotBuilder.() -> Unit = {}): QQAndroidBot {\n    return MockBotBuilder(MockConfiguration.copy()).apply(conf).run {\n        object : QQAndroidBot(account, this.conf) {\n            override fun createBotLevelComponents(): ConcurrentComponentStorage {\n                return super.createBotLevelComponents().apply {\n                    val componentsProvider = additionalComponentsProvider\n                    if (componentsProvider != null) {\n                        setAll(componentsProvider(bot, bot))\n                    }\n                }\n            }\n\n            override fun createNetworkHandler(): NetworkHandler =\n                nhProvider?.invoke(this, this) ?: super.createNetworkHandler()\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/PlatformUtilsTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.utils.deflate\nimport net.mamoe.mirai.utils.gzip\nimport net.mamoe.mirai.utils.inflate\nimport net.mamoe.mirai.utils.ungzip\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class PlatformUtilsTest : AbstractTest() {\n\n    @Test\n    fun testZip() {\n        assertEquals(\"test\", \"test\".toByteArray().deflate().inflate().decodeToString())\n    }\n\n    @Test\n    fun testGZip() {\n        assertEquals(\"test\", \"test\".toByteArray().gzip().ungzip().decodeToString())\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/ScheduledJobTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\npackage net.mamoe.mirai.internal\n\nimport kotlinx.atomicfu.atomic\nimport kotlinx.coroutines.CoroutineExceptionHandler\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.internal.utils.ScheduledJob\nimport net.mamoe.mirai.utils.AtomicInteger\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class ScheduledJobTest : AbstractTest() {\n    @Test\n    fun testScheduledJob() {\n        runBlocking {\n            val scope = CoroutineScope(CoroutineExceptionHandler { _, throwable ->\n                throwable.printStackTrace()\n            })\n            val invoked = AtomicInteger(0)\n            val job = ScheduledJob(scope.coroutineContext, 1000) {\n                invoked.incrementAndGet()\n            }\n            delay(100)\n            assertEquals(0, invoked.value)\n            job.notice()\n            job.notice()\n            job.notice()\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/TypeConversionTest.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal\n\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.utils.hexToBytes\nimport net.mamoe.mirai.utils.toByteArray\nimport net.mamoe.mirai.utils.toUHexString\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertTrue\n\ninternal class TypeConversionTest : AbstractTest() {\n\n    @ExperimentalUnsignedTypes\n    @Test\n    fun testConversions() {\n        assertEquals(\"01\", byteArrayOf(1).toUHexString())\n        assertEquals(\"7F\", byteArrayOf(0x7F).toUHexString())\n        assertEquals(\"FF\", ubyteArrayOf(0xffu).toUHexString())\n        assertEquals(\"7F\", ubyteArrayOf(0x7fu).toUHexString())\n        assertTrue { 1994701021.toByteArray().contentEquals(\"76 E4 B8 DD\".hexToBytes()) }\n        assertEquals(byteArrayOf(0, 0, 0, 0x01).toUHexString(), 1.toByteArray().toUHexString())\n        assertEquals(\n            ubyteArrayOf(0x7fu, 0xffu, 0xffu, 0xffu).toByteArray().toUHexString(),\n            Int.MAX_VALUE.toByteArray().toUHexString()\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/contact/file/AbsoluteFolderTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.file\n\nimport net.mamoe.mirai.internal.MockBot\nimport net.mamoe.mirai.internal.network.notice.BotAware\nimport net.mamoe.mirai.internal.network.protocol.data.proto.GroupFileCommon\nimport net.mamoe.mirai.internal.notice.processors.GroupExtensions\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class AbsoluteFolderTest : AbstractTest(), BotAware, GroupExtensions {\n    override val bot = MockBot { }\n    val group = bot.addGroup(1L, 2L)\n    private val root = group.files.root\n\n    @Test\n    fun `resolveFolderById always returns null if it is not root`() = runBlockingUnit {\n        val child = root.impl().createChildFolder(\n            GroupFileCommon.FolderInfo(\n                folderId = \"/f-1\",\n                folderName = \"name\"\n            )\n        )\n        assertEquals(null, child.resolveFolderById(\"/anything\"))\n    }\n\n    @Test\n    fun `resolveFolderById always returns root for slash`() = runBlockingUnit {\n        val child = root.impl().createChildFolder(\n            GroupFileCommon.FolderInfo(\n                folderId = \"/f-1\",\n                folderName = \"name\"\n            )\n        )\n        assertEquals(root, root.resolveFolderById(\"/\"))\n        assertEquals(root, child.resolveFolderById(\"/\"))\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/event/AbstractEventTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.event\n\nimport net.mamoe.mirai.internal.test.AbstractTest\n\ninternal abstract class AbstractEventTest : AbstractTest() {\n    init {\n//        System.setProperty(\"mirai.event.trace\", \"true\") // Do not set it to true by default, or the concurrency stress test will become extremely slow.\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/event/CancelScopeTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\npackage net.mamoe.mirai.internal.event\n\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.globalEventChannel\nimport kotlin.test.Test\nimport kotlin.test.assertFalse\n\n\ninternal class CancelScopeTest : AbstractEventTest() {\n    @Test\n    fun testCancelScope() {\n        val scope = CoroutineScope(SupervisorJob())\n\n        var got = false\n        scope.globalEventChannel().subscribeAlways<TestEvent> {\n            got = true\n        }\n\n        runBlocking {\n            scope.coroutineContext[Job]!!.cancelAndJoin()\n            TestEvent().broadcast()\n        }\n        assertFalse { got }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/event/EventChannelFlowTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.event\n\nimport kotlinx.coroutines.CoroutineStart\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.flow.first\nimport net.mamoe.mirai.event.GlobalEventChannel\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport kotlin.test.Test\nimport kotlin.test.assertIs\n\ninternal class EventChannelFlowTest : AbstractEventTest() {\n\n    @Test\n    fun asFlow(): Unit = runBlockingUnit() {\n        val channel = GlobalEventChannel\n        val job = async(start = CoroutineStart.UNDISPATCHED) {\n            channel.asFlow().first()\n        }\n        TestEvent().broadcast()\n        assertIs<TestEvent>(job.await())\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/event/EventChannelTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.event\n\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.flow.receiveAsFlow\nimport kotlinx.coroutines.flow.toList\nimport net.mamoe.mirai.event.*\nimport net.mamoe.mirai.event.events.FriendEvent\nimport net.mamoe.mirai.event.events.GroupEvent\nimport net.mamoe.mirai.event.events.GroupMessageEvent\nimport net.mamoe.mirai.event.events.MessageEvent\nimport kotlin.coroutines.coroutineContext\nimport kotlin.coroutines.resume\nimport kotlin.coroutines.resumeWithException\nimport kotlin.test.*\n\ninternal class EventChannelTest : AbstractEventTest() {\n    suspend fun suspendCall() {\n        coroutineContext\n    }\n\n    data class TE(\n        val x: Int,\n        val y: Int = 1,\n    ) : AbstractEvent()\n\n    @Test\n    fun singleFilter() {\n        runBlocking {\n            val received = suspendCancellableCoroutine { cont ->\n                globalEventChannel()\n                    .filterIsInstance<TE>()\n                    .filter {\n                        true\n                    }\n                    .filter {\n                        it.x == 2\n                    }\n                    .filter {\n                        true\n                    }\n                    .subscribeOnce<TE> {\n                        cont.resume(it.x)\n                    }\n\n                launch {\n                    println(\"Broadcast 1\")\n                    TE(1).broadcast()\n                    println(\"Broadcast 2\")\n                    TE(2).broadcast()\n                    println(\"Broadcast done\")\n                }\n            }\n\n            assertEquals(2, received)\n        }\n    }\n\n    @Test\n    fun multipleFilters() {\n        runBlocking {\n            val received = suspendCancellableCoroutine { cont ->\n                globalEventChannel()\n                    .filterIsInstance<TE>()\n                    .filter {\n                        true\n                    }\n                    .filter {\n                        it.x == 2\n                    }\n                    .filter {\n                        it.y == 2\n                    }\n                    .filter {\n                        true\n                    }\n                    .subscribeOnce<TE> {\n                        cont.resume(it.x)\n                    }\n\n                launch {\n                    println(\"Broadcast 1\")\n                    TE(1, 1).broadcast()\n                    println(\"Broadcast 2\")\n                    TE(2, 1).broadcast()\n                    println(\"Broadcast 2\")\n                    TE(2, 3).broadcast()\n                    println(\"Broadcast 2\")\n                    TE(2, 2).broadcast()\n                    println(\"Broadcast done\")\n                }\n            }\n\n            assertEquals(2, received)\n        }\n    }\n\n    @Test\n    fun multipleContexts1() {\n        runBlocking {\n            withContext(CoroutineName(\"1\")) {\n                val received = suspendCancellableCoroutine { cont ->\n                    globalEventChannel()\n                        .context(CoroutineName(\"2\"))\n                        .context(CoroutineName(\"3\"))\n                        .subscribeOnce<TE>(CoroutineName(\"4\")) {\n                            assertEquals(\"4\", currentCoroutineContext()[CoroutineName]!!.name)\n                            cont.resume(it.x)\n                        }\n\n                    launch {\n                        TE(2, 2).broadcast()\n                    }\n                }\n\n                assertEquals(2, received)\n            }\n        }\n    }\n\n    @Test\n    fun multipleContexts2() {\n        runBlocking {\n            withContext(CoroutineName(\"1\")) {\n                val received = suspendCancellableCoroutine { cont ->\n                    globalEventChannel()\n                        .context(CoroutineName(\"2\"))\n                        .context(CoroutineName(\"3\"))\n                        .subscribeOnce<TE> {\n                            assertEquals(\"3\", currentCoroutineContext()[CoroutineName]!!.name)\n                            cont.resume(it.x)\n                        }\n\n                    launch {\n                        TE(2, 2).broadcast()\n                    }\n                }\n\n                assertEquals(2, received)\n            }\n        }\n    }\n\n\n    @Test\n    fun multipleContexts3() {\n        runBlocking {\n            withContext(CoroutineName(\"1\")) {\n                val received = suspendCancellableCoroutine { cont ->\n                    globalEventChannel()\n                        .context(CoroutineName(\"2\"))\n                        .subscribeOnce<TE> {\n                            assertEquals(\"2\", currentCoroutineContext()[CoroutineName]!!.name)\n                            cont.resume(it.x)\n                        }\n\n                    launch {\n                        TE(2, 2).broadcast()\n                    }\n                }\n\n                assertEquals(2, received)\n            }\n        }\n    }\n\n    @Test\n    fun multipleContexts4() {\n        runBlocking {\n            withContext(CoroutineName(\"1\")) {\n                val received = suspendCancellableCoroutine { cont ->\n                    globalEventChannel()\n                        .subscribeOnce<TE> {\n                            assertEquals(\"1\", currentCoroutineContext()[CoroutineName]!!.name)\n                            cont.resume(it.x)\n                        }\n\n                    launch {\n                        TE(2, 2).broadcast()\n                    }\n                }\n\n                assertEquals(2, received)\n            }\n        }\n    }\n\n    @Test\n    fun `test forwardToChannel`() {\n        runBlocking {\n            val channel = Channel<TE>(Channel.BUFFERED)\n            val listener = globalEventChannel()\n                .filterIsInstance<TE>()\n                .filter { true }\n                .filter { it.x == 2 }\n                .filter { true }\n                .forwardToChannel(channel)\n\n            TE(1).broadcast()\n            TE(2).broadcast()\n            listener.complete()\n            TE(2).broadcast()\n\n            channel.close()\n\n            val list = channel.receiveAsFlow().toList()\n\n            assertEquals(1, list.size)\n            assertEquals(TE(2), list.single())\n        }\n    }\n\n    @Test\n    fun `test forwardToChannel listener completes if channel closed`() {\n        runBlocking {\n            val channel = Channel<TE>(Channel.BUFFERED)\n            val listener = globalEventChannel()\n                .filterIsInstance<TE>()\n                .filter { true }\n                .filter { it.x == 2 }\n                .filter { true }\n                .forwardToChannel(channel)\n\n            TE(1).broadcast()\n            TE(2).broadcast()\n            channel.close()\n            assertTrue { listener.isActive }\n            TE(2).broadcast()\n            assertTrue { listener.isCompleted }\n            assertFalse { listener.isActive }\n\n            val list = channel.receiveAsFlow().toList()\n\n            assertEquals(1, list.size)\n            assertEquals(TE(2), list.single())\n        }\n    }\n\n    @Test\n    fun testExceptionInFilter() {\n        assertFailsWith<ExceptionInEventChannelFilterException> {\n            runBlocking {\n                @Suppress(\"RemoveExplicitTypeArguments\")\n                suspendCancellableCoroutine<Int> { cont ->\n                    globalEventChannel()\n                        .exceptionHandler {\n                            cont.resumeWithException(it)\n                        }\n                        .filter {\n                            error(\"test error\")\n                        }\n                        .subscribeOnce<TE> {\n                            cont.resume(it.x)\n                        }\n\n                    launch {\n                        println(\"Broadcast 1\")\n                        TE(1).broadcast()\n                        println(\"Broadcast done\")\n                    }\n                }\n            }\n        }.run {\n            assertEquals(\"test error\", cause.message)\n        }\n    }\n\n    @Test\n    fun testExceptionInSubscribe() {\n        runBlocking {\n            assertFailsWith<IllegalStateException> {\n                suspendCancellableCoroutine<Int> { cont ->\n                    val handler = CoroutineExceptionHandler { _, throwable ->\n                        cont.resumeWithException(throwable)\n                    }\n\n                    val listener = globalEventChannel()\n                        .context(handler)\n                        .subscribeOnce<TE> {\n                            assertSame(handler, currentCoroutineContext()[CoroutineExceptionHandler])\n                            error(\"test error\")\n                        }\n\n                    launch {\n                        println(\"Broadcast 1\")\n                        TE(1).broadcast()\n                        println(\"Broadcast done\")\n                        listener.complete()\n                    }\n                }\n            }.run {\n                assertEquals(\"test error\", message)\n            }\n        }\n    }\n\n    @Suppress(\"UNUSED_VARIABLE\")\n    @Test\n    fun testVariance() {\n        var global: EventChannel<Event> = GlobalEventChannel\n        val a: EventChannel<MessageEvent> = global.filterIsInstance()\n\n        val filterLambda: (ev: MessageEvent) -> Boolean = { true }\n\n        // Kotlin can't resolve to the non-suspend one\n        a.filter {\n            // it: Event\n            suspendCall() // would be allowed in Kotlin\n            it.isIntercepted\n        }\n\n        val messageEventChannel = a.filterIsInstance<MessageEvent>()\n        // group.asChannel<GroupMessageEvent>()\n\n        val listener: Listener<GroupMessageEvent> = messageEventChannel.subscribeAlways<GroupEvent> {\n\n        }\n\n        global = a\n\n        global.subscribeMessages {\n\n        }\n\n        messageEventChannel.subscribeMessages {\n\n        }\n\n        global.subscribeAlways<FriendEvent> {\n\n        }\n\n        // inappliable: out cannot passed as in\n        // val b: EventChannel<in FriendMessageEvent> = global.filterIsInstance<FriendMessageEvent>()\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/event/EventTests.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.event\n\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.test.runTest\nimport net.mamoe.mirai.event.*\nimport net.mamoe.mirai.utils.AtomicInteger\nimport net.mamoe.mirai.utils.childScope\nimport kotlin.coroutines.EmptyCoroutineContext\nimport kotlin.test.AfterTest\nimport kotlin.test.Test\nimport kotlin.test.assertTrue\n\nclass TestEvent : AbstractEvent() {\n    var triggered = false\n}\n\ninternal class EventTests : AbstractEventTest() {\n    var scope = CoroutineScope(EmptyCoroutineContext)\n\n    @AfterTest\n    fun finallyReset() {\n        resetEventListeners()\n    }\n\n    @Test\n    fun testSubscribeInplace() {\n        resetEventListeners()\n        runBlocking(scope.coroutineContext) {\n            val subscriber = globalEventChannel().subscribeAlways<TestEvent> {\n                triggered = true\n            }\n\n            assertTrue(TestEvent().broadcast().triggered)\n            assertTrue { subscriber.complete() }\n        }\n    }\n\n    @Test\n    fun testSubscribeGlobalScope() {\n        resetEventListeners()\n        runBlocking {\n            val listener = globalEventChannel().subscribeAlways<TestEvent> {\n                triggered = true\n            }\n\n            assertTrue(TestEvent().broadcast().triggered)\n            listener.complete()\n        }\n    }\n\n    @Test\n    fun `test concurrent listening`() {\n        resetEventListeners()\n        var listeners = 0\n        val counter = AtomicInteger(0)\n        val channel = scope.globalEventChannel()\n        for (p in EventPriority.values()) {\n            repeat(2333) {\n                listeners++\n                channel.subscribeAlways<ParentEvent> {\n                    counter.getAndIncrement()\n                }\n            }\n        }\n        runBlocking {\n            ParentEvent().broadcast()\n        }\n        val called = counter.value\n        println(\"Registered $listeners listeners and $called called\")\n        if (listeners != called) {\n            throw IllegalStateException(\"Registered $listeners listeners but only $called called\")\n        }\n    }\n\n    @Test\n    fun `test concurrent listening 3`() {\n        resetEventListeners()\n        runBlocking {\n            val called = AtomicInteger(0)\n            val registered = AtomicInteger(0)\n            coroutineScope {\n                println(\"Step 0\")\n                for (priority in EventPriority.values()) {\n                    launch {\n                        repeat(5000) {\n                            registered.getAndIncrement()\n                            scope.globalEventChannel().subscribeAlways<ParentEvent>(\n                                priority = priority\n                            ) {\n                                called.getAndIncrement()\n                            }\n                        }\n                        println(\"Registered $priority\")\n                    }\n                }\n                println(\"Step 1\")\n            }\n            println(\"Step 2\")\n            ParentEvent().broadcast()\n            println(\"Step 3\")\n            check(called.value == registered.value)\n            println(\"Done\")\n            println(\"Called ${called.value}, registered ${registered.value}\")\n        }\n    }\n\n    @Test\n    fun `test concurrent listening 2`() = runTest {\n        resetEventListeners()\n        val registered = AtomicInteger(0)\n        val called = AtomicInteger(0)\n\n        val supervisor = CoroutineScope(SupervisorJob())\n\n        coroutineScope {\n            repeat(50) {\n                launch {\n                    repeat(444) {\n                        registered.getAndIncrement()\n\n                        supervisor.globalEventChannel().subscribeAlways<ParentEvent> {\n                            called.getAndIncrement()\n                        }\n                    }\n                }\n            }\n        }\n\n        println(\"All listeners registered\")\n\n        val postCount = 3\n        coroutineScope {\n            repeat(postCount) {\n                launch { ParentEvent().broadcast() }\n            }\n        }\n\n        val calledCount = called.value\n        val shouldCalled = registered.value * postCount\n        supervisor.cancel()\n\n        println(\"Should call $shouldCalled times and $called called\")\n        if (shouldCalled != calledCount) {\n            throw IllegalStateException(\"?\")\n        }\n    }\n\n    open class ParentEvent : Event, AbstractEvent() {\n        var triggered = false\n    }\n\n    open class ChildEvent : ParentEvent()\n\n    open class ChildChildEvent : ChildEvent()\n\n    @Test\n    fun `broadcast Child to Parent`() {\n        resetEventListeners()\n        runBlocking {\n            val job: CompletableJob\n            job = globalEventChannel().subscribeAlways<ParentEvent> {\n                triggered = true\n            }\n\n            assertTrue(ChildEvent().broadcast().triggered)\n            job.complete()\n        }\n    }\n\n    @Test\n    fun `broadcast ChildChild to Parent`() {\n        resetEventListeners()\n        runBlocking {\n            val job: CompletableJob\n            job = globalEventChannel().subscribeAlways<ParentEvent> {\n                triggered = true\n            }\n            assertTrue(ChildChildEvent().broadcast().triggered)\n            job.complete()\n        }\n    }\n\n    open class PriorityTestEvent : AbstractEvent()\n\n    private fun singleThreaded(step: StepUtil, invoke: suspend EventChannel<Event>.() -> Unit) {\n        runTest(borrowSingleThreadDispatcher()) {\n            val scope = this.childScope()\n            invoke(scope.globalEventChannel())\n            scope.cancel()\n        }\n        step.throws()\n    }\n\n    @Test\n    fun `test handler remove`() {\n        resetEventListeners()\n        val step = StepUtil()\n        singleThreaded(step) {\n            subscribe<Event> {\n                step.step(0)\n                ListeningStatus.STOPPED\n            }\n            ParentEvent().broadcast()\n            ParentEvent().broadcast()\n        }\n    }\n\n    /*\n    @Test\n    fun `test boom`() {\n        val step = StepUtil()\n        singleThreaded(step) {\n            step.step(0)\n            step.step(0)\n        }\n    }\n    */\n    private fun resetEventListeners() {\n        scope.cancel()\n        runBlocking { scope.coroutineContext[Job]?.join() }\n        scope = CoroutineScope(EmptyCoroutineContext)\n    }\n\n    @Test\n    fun `test intercept with always`() {\n        resetEventListeners()\n        val step = StepUtil()\n        singleThreaded(step) {\n            subscribeAlways<ParentEvent> {\n                step.step(0)\n                intercept()\n            }\n            subscribe<Event> {\n                step.step(-1, \"Boom\")\n                ListeningStatus.LISTENING\n            }\n            ParentEvent().broadcast()\n        }\n        resetEventListeners()\n    }\n\n    @Test\n    fun `test intercept`() {\n        resetEventListeners()\n        val step = StepUtil()\n        singleThreaded(step) {\n            subscribeAlways<AbstractEvent> {\n                step.step(0)\n                intercept()\n            }\n            subscribe<Event> {\n                step.step(-1, \"Boom\")\n                ListeningStatus.LISTENING\n            }\n            ParentEvent().broadcast()\n        }\n    }\n\n    @Test\n    fun `test listener complete`() {\n        resetEventListeners()\n        val step = StepUtil()\n        singleThreaded(step) {\n            val listener = subscribeAlways<ParentEvent> {\n                step.step(0, \"boom!\")\n            }\n            ParentEvent().broadcast()\n            listener.complete()\n            ParentEvent().broadcast()\n        }\n    }\n\n    @Test\n    fun `test event priority`() {\n        resetEventListeners()\n        val step = StepUtil()\n        singleThreaded(step) {\n            subscribe<PriorityTestEvent> {\n                step.step(1)\n                ListeningStatus.LISTENING\n            }\n            subscribe<PriorityTestEvent>(priority = EventPriority.HIGH) {\n                step.step(0)\n                ListeningStatus.LISTENING\n            }\n            subscribe<PriorityTestEvent>(priority = EventPriority.LOW) {\n                step.step(3)\n                ListeningStatus.LISTENING\n            }\n            subscribe<PriorityTestEvent> {\n                step.step(2)\n                ListeningStatus.LISTENING\n            }\n            PriorityTestEvent().broadcast()\n        }\n    }\n\n    @Test\n    fun `test next event and intercept`() {\n        resetEventListeners()\n        GlobalEventChannel.subscribeOnce<TestEvent> {\n            GlobalEventChannel.nextEvent<TestEvent>(priority = EventPriority.HIGH, intercept = true)\n        }\n        GlobalEventChannel.subscribeAlways<TestEvent>(priority = EventPriority.LOW) {\n            this.triggered = true\n        }\n        val tmp = TestEvent()\n        val tmp2 = TestEvent()\n        runBlocking {\n            launch {\n                tmp.broadcast()\n            }\n            launch {\n                tmp2.broadcast()\n            }\n        }\n        assertTrue { (tmp.triggered || tmp2.triggered) && (tmp.triggered != tmp2.triggered) }\n        resetEventListeners()\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/event/NextEventTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"DEPRECATION\")\n\npackage net.mamoe.mirai.internal.event\n\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.event.*\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport kotlin.test.*\n\ninternal class NextEventTest : AbstractEventTest() {\n    data class TE(\n        val x: Int\n    ) : AbstractEvent()\n\n    data class TE2(\n        val x: Int\n    ) : AbstractEvent()\n\n    ///////////////////////////////////////////////////////////////////////////\n    // nextEvent\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Test\n    fun `nextEvent can receive`() = runBlockingUnit {\n        val channel = GlobalEventChannel\n\n        val deferred = async(start = CoroutineStart.UNDISPATCHED) {\n            channel.nextEvent<TE>()\n        }\n\n        TE(1).broadcast()\n        yield()\n        assertTrue { deferred.isCompleted }\n        assertEquals(TE(1), deferred.await())\n    }\n\n    @Test\n    fun `nextEvent can filter type`() = runBlockingUnit {\n        val channel = GlobalEventChannel\n\n        val deferred = async(start = CoroutineStart.UNDISPATCHED) {\n            channel.nextEvent<TE>()\n        }\n\n        TE2(1).broadcast()\n        yield()\n        assertFalse { deferred.isCompleted }\n\n        TE(1).broadcast()\n        yield()\n        assertTrue { deferred.isCompleted }\n        assertEquals(TE(1), deferred.await())\n    }\n\n    @Test\n    fun `nextEvent can filter by filter`() = runBlockingUnit {\n        val channel = GlobalEventChannel\n\n        val deferred = async(start = CoroutineStart.UNDISPATCHED) {\n            channel.nextEvent<TE> { it.x == 2 }\n        }\n\n        TE(1).broadcast()\n        yield()\n        assertFalse { deferred.isCompleted }\n\n        TE(2).broadcast()\n        yield()\n        assertTrue { deferred.isCompleted }\n        assertEquals(TE(2), deferred.await())\n    }\n\n    @Test\n    fun `nextEvent can timeout`() = runBlockingUnit {\n        val channel = GlobalEventChannel\n\n        assertFailsWith<TimeoutCancellationException> {\n            withTimeout(timeMillis = 1) { channel.nextEvent<TE>(EventPriority.MONITOR) }\n        }\n    }\n\n    @Test\n    fun `nextEvent can cancel`() = runBlockingUnit {\n        val channel = GlobalEventChannel\n\n        coroutineScope {\n            val job = launch {\n                val result = kotlin.runCatching { channel.nextEvent<TE>(EventPriority.MONITOR) }\n                assertTrue { result.isFailure }\n                assertIs<CancellationException>(result.exceptionOrNull())\n                throw result.exceptionOrNull()!!\n            }\n            assertTrue { job.isActive }\n            job.cancelAndJoin()\n            assertTrue { job.isCancelled }\n        }\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // nextEventOrNull\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Test\n    fun `nextEventOrNull can receive`() = runBlockingUnit {\n        val deferred = async(start = CoroutineStart.UNDISPATCHED) {\n            withTimeoutOrNull<TE>(5000) { globalEventChannel().nextEvent(EventPriority.MONITOR) }\n        }\n\n        TE(1).broadcast()\n        yield()\n        assertTrue { deferred.isCompleted }\n        assertEquals(TE(1), deferred.await())\n    }\n\n    @Test\n    fun `nextEventOrNull can filter type`() = runBlockingUnit {\n        val deferred = async(start = CoroutineStart.UNDISPATCHED) {\n            withTimeoutOrNull<TE>(5000) { globalEventChannel().nextEvent(EventPriority.MONITOR) }\n        }\n\n        TE2(1).broadcast()\n        yield()\n        assertFalse { deferred.isCompleted }\n\n        TE(1).broadcast()\n        yield()\n        assertTrue { deferred.isCompleted }\n        assertEquals(TE(1), deferred.await())\n    }\n\n    @Test\n    fun `nextEventOrNull can filter by filter`() = runBlockingUnit {\n        val deferred = async(start = CoroutineStart.UNDISPATCHED) {\n            withTimeoutOrNull<TE>(5000) { globalEventChannel().nextEvent(EventPriority.MONITOR) { it.x == 2 } }\n        }\n\n        TE(1).broadcast()\n        yield()\n        assertFalse { deferred.isCompleted }\n\n        TE(2).broadcast()\n        yield()\n        assertTrue { deferred.isCompleted }\n        assertEquals(TE(2), deferred.await())\n    }\n\n    @Test\n    fun `nextEventOrNull can timeout`() = runBlockingUnit {\n        assertEquals(null,\n            withTimeoutOrNull<TE>(timeMillis = 1) { globalEventChannel().nextEvent(EventPriority.MONITOR) })\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/event/StepUtil.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.event\n\nimport kotlinx.atomicfu.atomic\nimport net.mamoe.mirai.utils.ConcurrentLinkedDeque\n\nclass StepUtil {\n    val step = atomic(0)\n    val exceptions = ConcurrentLinkedDeque<Throwable>()\n    fun step(step: Int, message: String = \"Wrong step\") {\n        println(\"Invoking step $step\")\n        if (step != this.step.getAndIncrement()) {\n            throw IllegalStateException(message).also { exceptions.add(it) }\n        }\n    }\n\n    fun throws() {\n        if (exceptions.isEmpty()) return\n        val root = exceptions.poll()!!\n        while (true) {\n            root.addSuppressed(exceptions.poll() ?: throw root)\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/CleanupRubbishMessageElementsTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message\n\nimport net.mamoe.mirai.internal.message.ReceiveMessageTransformer.cleanupRubbishMessageElements\nimport net.mamoe.mirai.internal.message.data.LongMessageInternal\nimport net.mamoe.mirai.internal.message.data.OnlineAudioImpl\nimport net.mamoe.mirai.internal.message.protocol.impl.PokeMessageProtocol.Companion.UNSUPPORTED_POKE_MESSAGE_PLAIN\nimport net.mamoe.mirai.internal.message.protocol.impl.RichMessageProtocol.Companion.UNSUPPORTED_MERGED_MESSAGE_PLAIN\nimport net.mamoe.mirai.internal.message.source.OfflineMessageSourceImplData\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.message.data.*\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class CleanupRubbishMessageElementsTest : AbstractTest() {\n    //region\n    private val replySource = OfflineMessageSourceImplData(\n        kind = MessageSourceKind.GROUP,\n        ids = intArrayOf(1),\n        botId = 1,\n        time = 1,\n        fromId = 87,\n        targetId = 7454,\n        originalMessage = messageChainOf(),\n        internalIds = intArrayOf(8711)\n    )\n\n    private val source = OfflineMessageSourceImplData(\n        kind = MessageSourceKind.GROUP,\n        ids = intArrayOf(1),\n        botId = 1,\n        time = 1,\n        fromId = 2,\n        targetId = 3,\n        originalMessage = messageChainOf(),\n        internalIds = intArrayOf(9)\n    )\n    //endregion\n\n    private fun assertCleanup(excepted: MessageChain, source: MessageChain) {\n        assertEquals(\n            excepted,\n            source.cleanupRubbishMessageElements()\n        )\n        assertEquals(\n            noMessageSource(excepted),\n            noMessageSource(source).cleanupRubbishMessageElements()\n        )\n    }\n\n    @Test\n    fun testQuoteAtSpace() {\n        // Windows PC QQ\n        assertCleanup(\n            messageChainOf(source, QuoteReply(replySource), PlainText(\"Hello!\")),\n            messageChainOf(source, At(123), PlainText(\" \"), QuoteReply(replySource), PlainText(\"Hello!\")),\n        )\n\n        // QQ Android\n        assertCleanup(\n            messageChainOf(source, QuoteReply(replySource), PlainText(\"Hello!\")),\n            messageChainOf(source, QuoteReply(replySource), At(1234567890), PlainText(\" Hello!\")),\n        )\n    }\n\n    @Test\n    fun testTIMAudio() {\n        val audio = OnlineAudioImpl(\"0\", byteArrayOf(), 0, AudioCodec.SILK, \"\", 0, null)\n        assertCleanup(\n            messageChainOf(source, audio),\n            messageChainOf(source, audio, UNSUPPORTED_VOICE_MESSAGE_PLAIN),\n        )\n    }\n\n    @Test\n    fun testPokeMessageCleanup() {\n        val poke = PokeMessage(\"\", 1, 1)\n        assertCleanup(\n            messageChainOf(source, poke),\n            messageChainOf(source, poke, UNSUPPORTED_POKE_MESSAGE_PLAIN),\n        )\n    }\n\n    @Test\n    fun testVipFaceCleanup() {\n        val vf = VipFace(VipFace.Kind(1, \"Test!\"), 50)\n        assertCleanup(\n            messageChainOf(source, vf),\n            messageChainOf(source, vf, PlainText(\"----CCCCCTest!\")),\n        )\n    }\n\n    @Test\n    fun testLongMessageInternalCleanup() {\n        val li = LongMessageInternal(\"\", \"\")\n        assertCleanup(\n            messageChainOf(source, li),\n            messageChainOf(source, li, UNSUPPORTED_MERGED_MESSAGE_PLAIN),\n        )\n    }\n\n    @Test\n    fun testCompressContinuousPlainText() {\n        assertCleanup(\n            messageChainOf(PlainText(\"1234567890\")),\n            \"12 3   45 6  789 0\".split(\" \").map(::PlainText).toMessageChain(),\n        )\n        assertCleanup(\n            msg(source, At(123456), \"Hello! How are you?\"),\n            msg(source, At(123456), \"Hello\", \"!\", \" \", \"How\", \" \", \"are \", \"you?\"),\n        )\n    }\n\n    @Test\n    fun testEmptyPlainTextRemoved() {\n        assertCleanup(\n            messageChainOf(),\n            \"                     \".split(\" \").map(::PlainText).toMessageChain(),\n        )\n        assertCleanup(\n            msg(AtAll),\n            msg(\"\", AtAll, \"\", \"\", \"\"),\n        )\n    }\n\n    @Test\n    fun testBlankPlainTextLiving() {\n        assertCleanup(\n            msg(\"    \"),\n            msg(\"\", \" \", \"  \", \" \"),\n        )\n    }\n\n    //region\n\n    private fun msg(vararg msgs: Any?): MessageChain {\n        return msgs.map { elm ->\n            when (elm) {\n                is Message -> elm\n                is String -> PlainText(elm)\n                else -> PlainText(elm.toString())\n            }\n        }.toMessageChain()\n    }\n\n    private fun noMessageSource(c: MessageChain): MessageChain {\n        return c.filterNot { it is MessageSource }.toMessageChain()\n    }\n\n    //endregion\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/ImageBuilderTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage message\n\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.message.data.ImageType\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class ImageBuilderTest : AbstractTest() {\n    companion object {\n        private const val IMAGE_ID = \"{01E9451B-70ED-EAE3-B37C-101F1EEBF5B5}.jpg\"\n        private const val IMAGE_ID_PNG = \"{01E9451B-70ED-EAE3-B37C-101F1EEBF5B5}.png\"\n        private const val IMAGE_ID_BMP = \"{01E9451B-70ED-EAE3-B37C-101F1EEBF5B5}.bmp\"\n        private const val IMAGE_ID_GIF = \"{01E9451B-70ED-EAE3-B37C-101F1EEBF5B5}.gif\"\n        private const val IMAGE_ID_UNKNOW = \"/01E9451B-70ED-EAE3-B37C-101F1EEBF5B5\"\n    }\n\n    @Test\n    fun create() {\n        // five overloads\n\n        Image(IMAGE_ID) {\n            assertEquals(IMAGE_ID, imageId)\n            assertEquals(0, width)\n            assertEquals(0, height)\n            assertEquals(0, size)\n            assertEquals(ImageType.UNKNOWN, type)\n            assertEquals(false, isEmoji)\n        }\n\n        Image.newBuilder(IMAGE_ID).run {\n            assertEquals(IMAGE_ID, imageId)\n            assertEquals(0, width)\n            assertEquals(0, height)\n            assertEquals(0, size)\n            assertEquals(ImageType.UNKNOWN, type)\n            assertEquals(false, isEmoji)\n        }\n\n        Image.Builder.newBuilder(IMAGE_ID).run {\n            assertEquals(IMAGE_ID, imageId)\n            assertEquals(0, width)\n            assertEquals(0, height)\n            assertEquals(0, size)\n            assertEquals(ImageType.UNKNOWN, type)\n            assertEquals(false, isEmoji)\n        }\n\n        Image.Builder.newBuilder(IMAGE_ID).build().run {\n            assertEquals(IMAGE_ID, imageId)\n            assertEquals(0, width)\n            assertEquals(0, height)\n            assertEquals(0, size)\n            assertEquals(ImageType.JPG, imageType)\n            assertEquals(false, isEmoji)\n        }\n    }\n\n    @Test\n    fun imageType() {\n        Image(IMAGE_ID).run {\n            assertEquals(IMAGE_ID, imageId)\n            assertEquals(0, width)\n            assertEquals(0, height)\n            assertEquals(0, size)\n            assertEquals(ImageType.JPG, imageType)\n            assertEquals(false, isEmoji)\n        }\n        Image(IMAGE_ID_PNG).run {\n            assertEquals(IMAGE_ID_PNG, imageId)\n            assertEquals(0, width)\n            assertEquals(0, height)\n            assertEquals(0, size)\n            assertEquals(ImageType.PNG, imageType)\n            assertEquals(false, isEmoji)\n        }\n        Image(IMAGE_ID_BMP).run {\n            assertEquals(IMAGE_ID_BMP, imageId)\n            assertEquals(0, width)\n            assertEquals(0, height)\n            assertEquals(0, size)\n            assertEquals(ImageType.BMP, imageType)\n            assertEquals(false, isEmoji)\n        }\n        Image(IMAGE_ID_GIF).run {\n            assertEquals(IMAGE_ID_GIF, imageId)\n            assertEquals(0, width)\n            assertEquals(0, height)\n            assertEquals(0, size)\n            assertEquals(ImageType.GIF, imageType)\n            assertEquals(false, isEmoji)\n        }\n        Image(IMAGE_ID_UNKNOW).run {\n            assertEquals(IMAGE_ID_UNKNOW, imageId)\n            assertEquals(0, width)\n            assertEquals(0, height)\n            assertEquals(0, size)\n            assertEquals(ImageType.UNKNOWN, imageType)\n            assertEquals(false, isEmoji)\n        }\n    }\n\n    @Test\n    fun legacyMethods() {\n        // just make sure they work\n\n        Mirai.createImage(IMAGE_ID).run {\n            assertEquals(IMAGE_ID, imageId)\n            assertEquals(0, width)\n            assertEquals(0, height)\n            assertEquals(0, size)\n            assertEquals(ImageType.JPG, imageType)\n            assertEquals(false, isEmoji)\n        }\n        Image.fromId(IMAGE_ID).run {\n            assertEquals(IMAGE_ID, imageId)\n            assertEquals(0, width)\n            assertEquals(0, height)\n            assertEquals(0, size)\n            assertEquals(ImageType.JPG, imageType)\n            assertEquals(false, isEmoji)\n        }\n        Image(IMAGE_ID).run {\n            assertEquals(IMAGE_ID, imageId)\n            assertEquals(0, width)\n            assertEquals(0, height)\n            assertEquals(0, size)\n            assertEquals(ImageType.JPG, imageType)\n            assertEquals(false, isEmoji)\n        }\n        Image(IMAGE_ID) {\n            width = 1\n            height = 2\n            size = 3\n            type = ImageType.GIF\n            isEmoji = true\n        }.run {\n            assertEquals(IMAGE_ID, imageId)\n            assertEquals(1, width)\n            assertEquals(2, height)\n            assertEquals(3, size)\n            assertEquals(ImageType.GIF, imageType)\n            assertEquals(true, isEmoji)\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/ImageReadingTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message\n\nimport io.ktor.utils.io.core.EOFException\nimport io.ktor.utils.io.errors.*\nimport net.mamoe.mirai.internal.message.image.calculateImageInfo\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.message.data.ImageType\nimport net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource\nimport net.mamoe.mirai.utils.MiraiFile\nimport net.mamoe.mirai.utils.hexToBytes\nimport net.mamoe.mirai.utils.readBytes\nimport net.mamoe.mirai.utils.withUse\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFailsWith\n\ninternal class ImageReadingTest : AbstractTest() {\n    @Test\n    fun `test read apng`() {\n        \"89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 01 E0 00 00 01 90 08 06 00 00 00 76 F6 B3 54 00 00 00 08 61 63 54 4C 00 00 00 22 00 00 00 00 32 4C BC 74 00 00 00 1A 66 63 54 4C 00\".testMatch(\n            ImageType.APNG\n        )\n        assertFailsWith(IOException::class) { \"89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00\".testMatch(ImageType.APNG) }\n    }\n\n    @Test\n    fun `test read png`() {\n        \"89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 01 E0 00 00 01 90 08 06 00 00 00 76 F6 B3 54 00 00 00 01 73 52 47 42 00 AE\".testMatch(\n            ImageType.PNG\n        )\n        assertFailsWith(IOException::class) { \"89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49\".testMatch(ImageType.PNG) }\n    }\n\n    @Test\n    fun `test read gif`() {\n        \"47 49 46 38 39 61 E0 01 90 01 F7 FF 00 30 A3 B0\".testMatch(ImageType.GIF)\n        assertFailsWith(IOException::class) { \"47 49 46 38 39 61 E0\".testMatch(ImageType.GIF) }\n    }\n\n    @Test\n    fun `test read jpg`() {\n        //SOF0\n        \"FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 78 00 78 00 00 FF E1 00 5A 45 78 69 66 00 00 4D 4D 00 2A 00 00 00 08 00 05 03 01 00 05 00 00 00 01 00 00 00 4A 03 03 00 01 00 00 00 01 00 00 00 00 51 10 00 01 00 00 00 01 01 00 00 00 51 11 00 04 00 00 00 01 00 00 12 74 51 12 00 04 00 00 00 01 00 00 12 74 00 00 00 00 00 01 86 A0 00 00 B1 8F FF DB 00 43 00 02 01 01 02 01 01 02 02 02 02 02 02 02 02 03 05 03 03 03 03 03 06 04 04 03 05 07 06 07 07 07 06 07 07 08 09 0B 09 08 08 0A 08 07 07 0A 0D 0A 0A 0B 0C 0C 0C 0C 07 09 0E 0F 0D 0C 0E 0B 0C 0C 0C FF DB 00 43 01 02 02 02 03 03 03 06 03 03 06 0C 08 07 08 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C FF C0 00 11 08 01 90 01 E0 03 01 22 00 02 11 01 03 11 01 FF DA\".testMatch(\n            ImageType.JPG\n        )\n        //SOF2\n        \"FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 78 00 78 00 00 FF E1 00 5A 45 78 69 66 00 00 4D 4D 00 2A 00 00 00 08 00 05 03 01 00 05 00 00 00 01 00 00 00 4A 03 03 00 01 00 00 00 01 00 00 00 00 51 10 00 01 00 00 00 01 01 00 00 00 51 11 00 04 00 00 00 01 00 00 12 74 51 12 00 04 00 00 00 01 00 00 12 74 00 00 00 00 00 01 86 A0 00 00 B1 8F FF DB 00 43 00 02 01 01 02 01 01 02 02 02 02 02 02 02 02 03 05 03 03 03 03 03 06 04 04 03 05 07 06 07 07 07 06 07 07 08 09 0B 09 08 08 0A 08 07 07 0A 0D 0A 0A 0B 0C 0C 0C 0C 07 09 0E 0F 0D 0C 0E 0B 0C 0C 0C FF DB 00 43 01 02 02 02 03 03 03 06 03 03 06 0C 08 07 08 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C FF C2 00 11 08 01 90 01 E0 03 01 22 00 02 11 01 03 11 01 FF DA\".testMatch(\n            ImageType.JPG\n        )\n        //FF 01\n        \"FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 78 00 78 00 00 FF 01 FF E1 00 5A 45 78 69 66 00 00 4D 4D 00 2A 00 00 00 08 00 05 03 01 00 05 00 00 00 01 00 00 00 4A 03 03 00 01 00 00 00 01 00 00 00 00 51 10 00 01 00 00 00 01 01 00 00 00 51 11 00 04 00 00 00 01 00 00 12 74 51 12 00 04 00 00 00 01 00 00 12 74 00 00 00 00 00 01 86 A0 00 00 B1 8F FF DB 00 43 00 02 01 01 02 01 01 02 02 02 02 02 02 02 02 03 05 03 03 03 03 03 06 04 04 03 05 07 06 07 07 07 06 07 07 08 09 0B 09 08 08 0A 08 07 07 0A 0D 0A 0A 0B 0C 0C 0C 0C 07 09 0E 0F 0D 0C 0E 0B 0C 0C 0C FF DB 00 43 01 02 02 02 03 03 03 06 03 03 06 0C 08 07 08 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C FF C2 00 11 08 01 90 01 E0 03 01 22 00 02 11 01 03 11 01 FF DA\".testMatch(\n            ImageType.JPG\n        )\n        //FF 00\n        \"FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 78 00 78 00 00 FF 00 FF E1 00 5A 45 78 69 66 00 00 4D 4D 00 2A 00 00 00 08 00 05 03 01 00 05 00 00 00 01 00 00 00 4A 03 03 00 01 00 00 00 01 00 00 00 00 51 10 00 01 00 00 00 01 01 00 00 00 51 11 00 04 00 00 00 01 00 00 12 74 51 12 00 04 00 00 00 01 00 00 12 74 00 00 00 00 00 01 86 A0 00 00 B1 8F FF DB 00 43 00 02 01 01 02 01 01 02 02 02 02 02 02 02 02 03 05 03 03 03 03 03 06 04 04 03 05 07 06 07 07 07 06 07 07 08 09 0B 09 08 08 0A 08 07 07 0A 0D 0A 0A 0B 0C 0C 0C 0C 07 09 0E 0F 0D 0C 0E 0B 0C 0C 0C FF DB 00 43 01 02 02 02 03 03 03 06 03 03 06 0C 08 07 08 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C FF C2 00 11 08 01 90 01 E0 03 01 22 00 02 11 01 03 11 01 FF DA\".testMatch(\n            ImageType.JPG\n        )\n        //RST[0-7]\n        \"FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 78 00 78 00 00 FF D0 FF D1 FF D2 FF D3 FF D4 FF D5 FF D6 FF D7 FF E1 00 5A 45 78 69 66 00 00 4D 4D 00 2A 00 00 00 08 00 05 03 01 00 05 00 00 00 01 00 00 00 4A 03 03 00 01 00 00 00 01 00 00 00 00 51 10 00 01 00 00 00 01 01 00 00 00 51 11 00 04 00 00 00 01 00 00 12 74 51 12 00 04 00 00 00 01 00 00 12 74 00 00 00 00 00 01 86 A0 00 00 B1 8F FF DB 00 43 00 02 01 01 02 01 01 02 02 02 02 02 02 02 02 03 05 03 03 03 03 03 06 04 04 03 05 07 06 07 07 07 06 07 07 08 09 0B 09 08 08 0A 08 07 07 0A 0D 0A 0A 0B 0C 0C 0C 0C 07 09 0E 0F 0D 0C 0E 0B 0C 0C 0C FF DB 00 43 01 02 02 02 03 03 03 06 03 03 06 0C 08 07 08 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C FF C2 00 11 08 01 90 01 E0 03 01 22 00 02 11 01 03 11 01 FF DA\".testMatch(\n            ImageType.JPG\n        )\n        println(\"Current path: \" + net.mamoe.mirai.utils.MiraiFile.create(\".\").absolutePath)\n        //Issue 1610\n        MiraiFile.create(\"./src/commonTest/resources/image/jpeg-header-issue-1610.bin\").readBytes().testRead(\n            ImageType.JPG\n        )\n        //Failed to find\n        assertFailsWith(IllegalArgumentException::class) {\n            \"FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 78 00 78 00 00 FF E1 00 5A 45 78 69 66 00 00 4D 4D 00 2A 00 00 00 08 00 05 03 01 00 05 00 00 00 01 00 00 00 4A 03 03 00 01 00 00 00 01 00 00 00 00 51 10 00 01 00 00 00 01 01 00 00 00 51 11 00 04 00 00 00 01 00 00 12 74 51 12 00 04 00 00 00 01 00 00 12 74 00 00 00 00 00 01 86 A0 00 00 B1 8F FF DB 00 43 00 02 01 01 02 01 01 02 02 02 02 02 02 02 02 03 05 03 03 03 03 03 06 04 04 03 05 07 06 07 07 07 06 07 07 08 09 0B 09 08 08 0A 08 07 07 0A 0D 0A 0A 0B 0C 0C 0C 0C 07 09 0E 0F 0D 0C 0E 0B 0C 0C 0C FF DB 00 43 01 02 02 02 03 03 03 06 03 03 06 0C 08 07 08 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C FF DA\".testMatch(\n                ImageType.JPG\n            )\n        }\n        assertFailsWith(EOFException::class) {\n            \"FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 78 00 78 00 00 FF E1 00 5A\".testMatch(\n                ImageType.JPG\n            )\n        }\n    }\n\n    @Test\n    fun `test read bmp`() {\n        \"42 4D 36 CA 08 00 00 00 00 00 36 00 00 00 28 00 00 00 E0 01 00 00 90 01 00 00 01 00 18 00 00 00 00 00 00 CA 08 00 74 12 00 00 74 12 00 00 00 00 00 00 00 00 00 00\"\n            .testMatch(ImageType.BMP)\n        assertFailsWith(IOException::class) {\n            \"42 4D 36 CA 08 00 00 00 00 00 36 00 00 00 28 00 00 00 E0 01 00 00 90\".testMatch(\n                ImageType.BMP\n            )\n        }\n    }\n\n    @Test\n    fun `test read fail`() {\n        assertFailsWith(IllegalArgumentException::class) {\n            \"CA FE FE\".testMatch(ImageType.BMP)\n        }\n    }\n\n    private fun ByteArray.testRead(type: ImageType) {\n        this.toExternalResource().withUse {\n            calculateImageInfo().run {\n                assertEquals(type, imageType, \"imageType\")\n            }\n        }\n    }\n\n    private fun String.testMatch(type: ImageType) {\n        this.hexToBytes().toExternalResource().withUse {\n            calculateImageInfo().run {\n                assertEquals(480, width, \"width\")\n                assertEquals(400, height, \"height\")\n                assertEquals(type, imageType, \"imageType\")\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/InternalImageProtocolImplTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message\n\nimport net.mamoe.mirai.internal.message.image.InternalImageProtocolImpl\nimport net.mamoe.mirai.internal.notice.processors.AbstractNoticeProcessorTest\nimport kotlin.test.Test\nimport kotlin.test.assertIs\n\ninternal class InternalImageProtocolImplTest : AbstractNoticeProcessorTest() { // borrow Bot testkit\n    val instance = InternalImageProtocolImpl()\n\n    @Test\n    fun testFindChecker() {\n        assertIs<InternalImageProtocolImpl.ImageUploadedCheckerGroup>(instance.findChecker(setBot(1).addGroup(2, 3)))\n        assertIs<InternalImageProtocolImpl.ImageUploadedCheckerUser>(instance.findChecker(setBot(1).addFriend(2)))\n        assertIs<InternalImageProtocolImpl.ImageUploadedCheckerFallback>(instance.findChecker(null))\n\n        // these 3 tests are complete -- no need to add more when adding more checkers.\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/RefineContextTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message\n\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFalse\nimport kotlin.test.assertTrue\n\ninternal class RefineContextTest : AbstractTest() {\n    @Test\n    fun `merge test`() {\n        val Key1 = RefineContextKey<Int>(\"KeyInt\")\n        val Key2 = RefineContextKey<Double>(\"KeyDouble\")\n        val Key3 = RefineContextKey<String>(\"KeyString\")\n        val Key4 = RefineContextKey<ByteArray>(\"KeyBytes\")\n\n        val context1 = SimpleRefineContext(\n            Key1 to 114514,\n            Key2 to 1919.810,\n            Key3 to \"sodayo\"\n        )\n\n        val context2 = SimpleRefineContext(\n            Key2 to 1919.811,\n            Key3 to \"yarimasune\",\n            Key4 to byteArrayOf(11, 45, 14)\n        )\n\n        val combinedOverride = context1.merge(context2, override = true)\n        val combinedNotOverride = context1.merge(context2, override = false)\n\n        val context3 = SimpleRefineContext(\n            Key2 to 1919.811,\n            Key3 to \"yarimasune\"\n        )\n\n        assertEquals(context1, context1.merge(context3, false))\n        assertTrue(combinedOverride != combinedNotOverride)\n\n        assertEquals(4, combinedOverride.entries().size)\n        assertEquals(1919.811, combinedOverride[Key2])\n        assertEquals(1919.810, combinedNotOverride[Key2])\n        assertEquals(\"sodayo\", combinedNotOverride[Key3])\n        assertTrue(byteArrayOf(11, 45, 14).contentEquals(combinedNotOverride[Key4]))\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/code/TestMiraiCode.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\") // MiraiCodeParser\n\npackage net.mamoe.mirai.internal.message.code\n\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.message.code.MiraiCode.deserializeMiraiCode\nimport net.mamoe.mirai.message.code.internal.MiraiCodeParser\nimport net.mamoe.mirai.message.data.*\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertNotNull\n\ninternal class TestMiraiCode : AbstractTest() {\n    @Test\n    fun testDynamicMiraiCodeParser() {\n        fun runTest(args: Int, code: String, parse: (args: Array<String>) -> Unit) {\n            val response = MiraiCodeParser.DynamicParser(args) { args0 -> parse(args0); AtAll }.parse(null, code)\n            assertNotNull(response, \"Parser not invoked\")\n        }\n        runTest(3, \"test,\\\\,test,\\\\,\\\\,test\") { (arg1, arg2, arg3) ->\n            assertEquals(\"test\", arg1)\n            assertEquals(\",test\", arg2)\n            assertEquals(\",,test\", arg3)\n        }\n        runTest(2, \",\") {}\n    }\n\n    @Test\n    fun `test serialization`() {\n        assertEquals(\"[mirai:file:id,1,name,2]\", FileMessage(\"id\", 1, \"name\", 2).serializeToMiraiCode())\n    }\n\n    @Test\n    fun `test deserialization`() {\n        assertEquals(AtAll.toMessageChain(), \"[mirai:atall]\".deserializeMiraiCode())\n        assertEquals(PlainText(\"[Hello\").toMessageChain(), \"\\\\[Hello\".deserializeMiraiCode())\n        assertEquals(buildMessageChain {\n            +PlainText(\"1\")\n            +AtAll\n            +PlainText(\"2345\")\n            +AtAll\n        }, \"1[mirai:atall]2345[mirai:atall]\".deserializeMiraiCode())\n        assertEquals(buildMessageChain {\n            +PlainText(\"1\")\n            +AtAll\n            +PlainText(\"2345[mirai:atall\")\n        }, \"1[mirai:atall]2345[mirai:atall\".deserializeMiraiCode())\n        assertEquals(buildMessageChain {\n            +PlainText(\"[mirai:atall]\")\n        }, \"\\\\[mirai:atall]\".deserializeMiraiCode())\n        assertEquals(buildMessageChain {\n            +PlainText(\"[mirai:atall]\")\n        }, \"[mirai:atall\\\\]\".deserializeMiraiCode())\n        assertEquals(buildMessageChain {\n            +PlainText(\"[mirai:atall]\")\n        }, \"[mirai\\\\:atall]\".deserializeMiraiCode())\n        assertEquals(buildMessageChain {\n            +SimpleServiceMessage(1, \"[HiHi!!!\\\\]\")\n            +PlainText(\" XE\")\n        }, \"[mirai:service:1,\\\\[HiHi!!!\\\\\\\\\\\\]] XE\".deserializeMiraiCode())\n        assertEquals(buildMessageChain {\n            +Dice(1)\n        }, \"[mirai:dice:1]\".deserializeMiraiCode())\n        assertEquals(FileMessage(\"id\", 1, \"name\", 2), \"[mirai:file:id,1,name,2]\".deserializeMiraiCode().single())\n\n        val musicShare = MusicShare(\n            kind = MusicKind.NeteaseCloudMusic,\n            title = \"ファッション\",\n            summary = \"rinahamu/Yunomi\",\n            jumpUrl = \"http://music.163.com/song/1338728297/?userid=324076307\",\n            pictureUrl = \"http://p2.music.126.net/y19E5SadGUmSR8SZxkrNtw==/109951163785855539.jpg\",\n            musicUrl = \"http://music.163.com/song/media/outer/url?id=1338728297&userid=324076307\",\n            brief = \"\",\n        )\n        assertEquals(musicShare.toMessageChain(), musicShare.serializeToMiraiCode().deserializeMiraiCode())\n\n        assertEquals(\n            messageChainOf(RockPaperScissors.ROCK),\n            \"[mirai:rps:rock]\".deserializeMiraiCode()\n        )\n        assertEquals(\n            messageChainOf(RockPaperScissors.SCISSORS),\n            \"[mirai:rps:scissors]\".deserializeMiraiCode()\n        )\n        assertEquals(\n            messageChainOf(RockPaperScissors.PAPER),\n            \"[mirai:rps:paper]\".deserializeMiraiCode()\n        )\n\n        assertEquals(\n            messageChainOf(SuperFace.from(Face(Face.LAN_QIU))),\n            \"[mirai:superface:114,13,2]\".deserializeMiraiCode()\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/data/AudioTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.data\n\nimport net.mamoe.mirai.internal.message.data.OnlineAudioImpl.Companion.DOWNLOAD_URL\nimport net.mamoe.mirai.internal.message.data.OnlineAudioImpl.Companion.refineUrl\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.message.data.AudioCodec\nimport net.mamoe.mirai.message.data.OfflineAudio\nimport kotlin.test.Test\nimport kotlin.test.assertContentEquals\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFalse\n\ninternal class AudioTest : AbstractTest() {\n\n    @Test\n    fun `test factory`() {\n        assertEquals(\n            OfflineAudio(\"name\", byteArrayOf(), 1, AudioCodec.SILK, byteArrayOf()),\n            OfflineAudio(\"name\", byteArrayOf(), 1, AudioCodec.SILK, byteArrayOf())\n        )\n    }\n\n    @Test\n    fun `invalid extraData is refreshed`() {\n        assertContentEquals(\n            OfflineAudio(\"test\", byteArrayOf(), 1, AudioCodec.SILK, null).extraData,\n            OfflineAudio(\"test\", byteArrayOf(), 1, AudioCodec.SILK, byteArrayOf(1, 2, 3)).extraData,\n        )\n    }\n\n    @Test\n    fun `test equality`() {\n        assertEquals(\n            OnlineAudioImpl(\"name\", byteArrayOf(), 1, AudioCodec.SILK, \"url\", 2, null),\n            OnlineAudioImpl(\"name\", byteArrayOf(), 1, AudioCodec.SILK, \"url\", 2, null)\n        )\n        assertEquals(\n            OnlineAudioImpl(\"name\", byteArrayOf(), 1, AudioCodec.SILK, \"url\", 2, null),\n            OnlineAudioImpl(\"name\", byteArrayOf(), 1, AudioCodec.SILK, \"url\", 2, null)\n        )\n        assertEquals(\n            OfflineAudioImpl(\"name\", byteArrayOf(), 1, AudioCodec.SILK, originalPtt = null),\n            OfflineAudioImpl(\"name\", byteArrayOf(), 1, AudioCodec.SILK, originalPtt = null)\n        )\n        assertEquals(\n            OfflineAudioImpl(\"name\", byteArrayOf(), 1, AudioCodec.SILK, byteArrayOf()),\n            OfflineAudioImpl(\"name\", byteArrayOf(), 1, AudioCodec.SILK, byteArrayOf())\n        )\n        assertEquals(\n            OfflineAudioImpl(\"name\", byteArrayOf(), 1, AudioCodec.SILK, ImMsgBody.Ptt(srcUin = 2)),\n            OfflineAudioImpl(\"name\", byteArrayOf(), 1, AudioCodec.SILK, ImMsgBody.Ptt(srcUin = 2))\n        )\n    }\n\n    @Test\n    fun `test refineUrl`() {\n        assertFalse { DOWNLOAD_URL.endsWith(\"/\") }\n\n        assertEquals(\"\", refineUrl(\"\"))\n        assertEquals(\"$DOWNLOAD_URL/test\", refineUrl(\"/test\"))\n        assertEquals(\"$DOWNLOAD_URL/test\", refineUrl(\"test\"))\n        assertEquals(\"https://custom.com\", refineUrl(\"https://custom.com\"))\n        assertEquals(\"http://localhost\", refineUrl(\"http://localhost\"))\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/data/ContentEqualsTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.data\n\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.safeCast\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFalse\nimport kotlin.test.assertTrue\n\ninternal class TestConstrainSingleMessage : ConstrainSingle, Any() {\n    companion object Key : AbstractMessageKey<TestConstrainSingleMessage>({ it.safeCast() })\n\n    override fun toString(): String = \"<TestConstrainSingleMessage#${super.hashCode()}>\"\n    override fun contentToString(): String = \"\"\n\n    override val key: MessageKey<TestConstrainSingleMessage>\n        get() = Key\n}\n\ninternal class ContentEqualsTest: AbstractTest() {\n\n    @Test\n    fun testContentEquals() {\n        val mySource = TestConstrainSingleMessage()\n        val image = Image(\"{01E9451B-70ED-EAE3-B37C-101F1EEBF5B5}.mirai\")\n\n        assertTrue {\n            buildMessageChain {\n                +\"test\"\n            }.contentEquals(buildMessageChain {\n                +\"te\"\n                +mySource\n                +\"st\"\n            })\n        }\n\n        assertFalse {\n            buildMessageChain {\n                +\"tests\"\n            }.contentEquals(buildMessageChain {\n                +\"te\"\n                +\"st\"\n            })\n        }\n\n        assertEquals(\"test\", buildMessageChain {\n            +mySource\n            +\"test\"\n            +mySource\n        }.content)\n\n        assertTrue {\n            buildMessageChain {\n                +\"test\"\n            }.contentEquals(buildMessageChain {\n                +\"te\"\n                +\"st\"\n                +mySource\n            })\n        }\n\n        assertTrue {\n            buildMessageChain {\n                +\"test\"\n                +image\n            }.contentEquals(buildMessageChain {\n                +\"te\"\n                +mySource\n                +\"st\"\n                +image\n            })\n        }\n\n\n        assertEquals(\"test\", buildMessageChain {\n            +mySource\n            +\"test\"\n            +mySource\n        }.content)\n\n        assertTrue {\n            buildMessageChain {\n                +\"test\"\n                +image\n            }.contentEquals(buildMessageChain {\n                +\"te\"\n                +\"st\"\n                +image\n                +mySource\n            })\n        }\n\n        assertFalse {\n            buildMessageChain {\n                +image\n                +\"test\"\n                +mySource\n            }.contentEquals(\"test\")\n        }\n\n        assertFalse {\n            buildMessageChain {\n                +\"test\"\n                +image\n            }.contentEquals(\"test\")\n        }\n\n        assertFalse {\n            buildMessageChain {\n                +image\n                +\"test\"\n            }.contentEquals(buildMessageChain {\n                +\"te\"\n                +\"st\"\n                +image\n                +mySource\n            })\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/data/ForwardRefineTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.data\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.internal.AbstractTestWithMiraiImpl\nimport net.mamoe.mirai.internal.MockBot\nimport net.mamoe.mirai.internal.message.DeepMessageRefiner.refineDeep\nimport net.mamoe.mirai.internal.message.SimpleRefineContext\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.structureToString\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertTrue\n\ninternal class ForwardRefineTest : AbstractTestWithMiraiImpl() {\n    private val bot = MockBot()\n\n    companion object {\n        private const val content = \"\"\"\n            <?xml version=\"1.0\" encoding=\"utf-8\"?>\n    <msg brief=\"[聊天记录]\" m_fileName=\"C85BCFB5-3143-41E2-860B-172D5E3FAFAC\" action=\"viewMultiMsg\" tSum=\"2\" flag=\"3\" m_resid=\"ZnAsFPOuieB0CJt7HJ6zC1Rq0MRqfso44OAvY99wqePeYYcGr03NI6UXB24QqefR\" serviceID=\"35\" m_fileSize=\"171\"  > <item layout=\"1\"> <title color=\"#000000\" size=\"34\" > 群聊的聊天记录 </title> <title color=\"#000000\" size=\"26\" > A:@B ‘ </title> <title color=\"#000000\" size=\"26\" > A:@B ’ </title>  <hr></hr> <summary color=\"#808080\" size=\"26\" > 查看转发消息  </summary> </item><source name=\"聊天记录\"></source> </msg>\n        \"\"\"\n        private const val resId = \"ZnAsFPOuieB0CJt7HJ6zC1Rq0MRqfso44OAvY99wqePeYYcGr03NI6UXB24QqefR\"\n        private val nodes = listOf(ForwardMessage.Node(1, 1, \"sender\", AtAll))\n    }\n\n    override suspend fun downloadForwardMessage(bot: Bot, resourceId: String): List<ForwardMessage.Node> {\n        assertEquals(resId, resourceId)\n        return nodes\n    }\n\n    @Test\n    fun `can refine ForwardMessageInternal deep`() = runBlockingUnit {\n        val internal = ForwardMessageInternal(content, resId, null)\n        val expectedOrigin =\n            SimpleServiceMessage(internal.serviceId, content) // we do not expose ForwardMessageInternal\n        val refine = internal.toMessageChain().refineDeep(bot, SimpleRefineContext().apply {\n            set(ForwardMessageInternal.MsgTransmits, mapOf())\n        })\n        println(refine.size)\n        println(refine.first()::class)\n        println(refine.structureToString())\n        assertTrue { refine.first() is MessageOrigin }\n        assertTrue { refine.drop(1).first() is ForwardMessage }\n        assertEquals(\n            ForwardMessage(\n                preview = listOf(\"A:@B ‘\", \"A:@B ’\"),\n                title = \"群聊的聊天记录\",\n                brief = \"[聊天记录]\",\n                source = \"聊天记录\",\n                summary = \"查看转发消息\",\n                nodeList = nodes\n            ),\n            refine[ForwardMessage]\n        )\n        assertEquals(\n            expectedOrigin,\n            refine[MessageOrigin]!!.origin\n        )\n        assertEquals(\n            MessageOrigin(expectedOrigin, resId, MessageOriginKind.FORWARD),\n            refine[MessageOrigin]\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/data/MessageReceiptTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.data\n\nimport net.mamoe.mirai.internal.MockBot\nimport net.mamoe.mirai.internal.contact.AbstractContact\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocolFacade\nimport net.mamoe.mirai.internal.message.protocol.impl.GeneralMessageSenderProtocol\nimport net.mamoe.mirai.internal.message.protocol.outgoing.*\nimport net.mamoe.mirai.internal.message.source.OnlineMessageSourceToGroupImpl\nimport net.mamoe.mirai.internal.message.source.createMessageReceipt\nimport net.mamoe.mirai.internal.network.component.ComponentStorage\nimport net.mamoe.mirai.internal.network.component.ConcurrentComponentStorage\nimport net.mamoe.mirai.internal.network.components.ClockHolder\nimport net.mamoe.mirai.internal.notice.processors.GroupExtensions\nimport net.mamoe.mirai.internal.pipeline.replaceProcessor\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.message.data.ForwardMessage\nimport net.mamoe.mirai.message.data.buildForwardMessage\nimport net.mamoe.mirai.message.data.toMessageChain\nimport net.mamoe.mirai.utils.Clock\nimport net.mamoe.mirai.utils.currentTimeSeconds\nimport kotlin.test.*\n\ninternal class MessageReceiptTest : AbstractTest(), GroupExtensions {\n    private val bot = MockBot()\n\n    @Test\n    fun `refine ForwardMessageInternal for MessageReceipt's original MessageChain`() = runBlockingUnit {\n        val group = bot.addGroup(123, 2)\n\n        val forward = buildForwardMessage(group) {\n            2 says \"ok\"\n        }\n        val message = forward.toMessageChain()\n\n        val facade = MessageProtocolFacade.INSTANCE.copy()\n\n        assertTrue {\n            facade.outgoingPipeline.replaceProcessor(\n                { it is GeneralMessageSenderProtocol.GeneralMessageSender },\n                OutgoingMessageProcessorAdapter(object : OutgoingMessageSender {\n                    override suspend fun OutgoingMessagePipelineContext.process() {\n                        assertIs<ForwardMessageInternal>(currentMessageChain[ForwardMessageInternal])\n                        assertSame(forward, currentMessageChain[ForwardMessageInternal]?.origin)\n\n                        val source = OnlineMessageSourceToGroupImpl(\n                            group,\n                            internalIds = intArrayOf(1),\n                            sender = bot,\n                            target = group,\n                            time = currentTimeSeconds().toInt(),\n                            originalMessage = currentMessageChain //,\n                            //   sourceMessage = message\n                        )\n\n                        collect(source.createMessageReceipt(group, true))\n                    }\n                })\n            )\n        }\n\n        val result = facade.preprocessAndSendOutgoing(group, message, ConcurrentComponentStorage {\n            set(MessageProtocolStrategy, object : GroupMessageProtocolStrategy(group) {\n\n            })\n            set(HighwayUploader, object : HighwayUploader {\n                override suspend fun uploadMessages(\n                    contact: AbstractContact,\n                    components: ComponentStorage,\n                    nodes: Collection<ForwardMessage.INode>,\n                    isLong: Boolean,\n                    senderName: String\n                ): String {\n                    return \"id\"\n                }\n            })\n            set(ClockHolder, object : ClockHolder() {\n                override val local: Clock = object : Clock {\n                    override fun currentTimeMillis(): Long {\n                        return 160023456\n                    }\n                }\n            })\n        })\n\n        assertIs<ForwardMessage>(result.source.originalMessage[ForwardMessage])\n        assertEquals(message, result.source.originalMessage)\n        assertSame(forward, result.source.originalMessage[ForwardMessage])\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/data/MessageRefineTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.internal.message.data\n\nimport kotlinx.serialization.decodeFromHexString\nimport kotlinx.serialization.protobuf.ProtoBuf\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.internal.AbstractTestWithMiraiImpl\nimport net.mamoe.mirai.internal.MockBot\nimport net.mamoe.mirai.internal.getMiraiImpl\nimport net.mamoe.mirai.internal.message.DeepMessageRefiner.refineDeep\nimport net.mamoe.mirai.internal.message.LightMessageRefiner.refineLight\nimport net.mamoe.mirai.internal.message.RefinableMessage\nimport net.mamoe.mirai.internal.message.RefineContext\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocolFacade\nimport net.mamoe.mirai.internal.message.source.OfflineMessageSourceImplData\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgTransmit\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.message.data.MessageChain.Companion.serializeToJsonString\nimport net.mamoe.mirai.utils.hexToBytes\nimport net.mamoe.mirai.utils.isSameType\nimport kotlin.random.Random\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\n\nopen class TM(private val name: String = Random.nextInt().toString()) : SingleMessage {\n    override fun toString(): String = name\n    override fun contentToString(): String = name\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (!isSameType(this, other)) return false\n\n        if (name != other.name) return false\n\n        return true\n    }\n\n    override fun hashCode(): Int = name.hashCode()\n}\n\nprivate val bot = MockBot()\n\nprivate suspend fun testRefineAll(\n    before: Message,\n    after: MessageChain,\n) {\n    testRefineLight(before, after)\n    testRefineDeep(before, after)\n}\n\nprivate suspend fun testRefineDeep(\n    before: Message,\n    after: MessageChain\n) = assertEquals(after.toMessageChain(), before.toMessageChain().refineDeep(bot))\n\nprivate fun testRefineLight(\n    before: Message,\n    after: MessageChain\n) = assertEquals(after.toMessageChain(), before.toMessageChain().refineLight(bot))\n\n\n@Suppress(\"TestFunctionName\")\nprivate fun RefinableMessage0(\n    refine: () -> Message?\n): RefinableMessage {\n    return object : RefinableMessage, TM() {\n        override fun tryRefine(bot: Bot, context: MessageChain, refineContext: RefineContext): Message? {\n            return refine()\n        }\n    }\n}\n\ninternal class MessageRefineTest : AbstractTestWithMiraiImpl() {\n\n    @Test\n    fun `can remove self`() = runBlockingUnit {\n        testRefineAll(\n            RefinableMessage0 { null },\n            messageChainOf()\n        )\n    }\n\n    @Test\n    fun `can replace`() = runBlockingUnit {\n        testRefineAll(\n            RefinableMessage0 { TM(\"1\") },\n            messageChainOf(TM(\"1\"))\n        )\n    }\n\n    @Test\n    fun `ignore non-refinable`() = runBlockingUnit {\n        testRefineAll(\n            TM(\"1\"),\n            messageChainOf(TM(\"1\"))\n        )\n    }\n\n    @Test\n    fun `can replace flatten`() = runBlockingUnit {\n        testRefineAll(\n            buildMessageChain {\n                +RefinableMessage0 { TM(\"1\") + TM(\"2\") }\n                +TM(\"3\")\n                +RefinableMessage0 { TM(\"4\") + TM(\"5\") }\n            },\n            messageChainOf(TM(\"1\"), TM(\"2\"), TM(\"3\"), TM(\"4\"), TM(\"5\"))\n        )\n    }\n\n    private val testCases = object {\n        /**\n         * 单个 quote 包含 at 和 plain\n         */\n        val simpleQuote =\n            decodeProto(\"087aea027708a2fc1010d285d8cc0418f9e7b4830620012a0d0a0b0a09e999a4e99d9e363438420a18aedd90f380808080014a480a2d08d285d8cc0410d285d8cc04185228a2fc1030f9e7b4830638aedd90f380808080014a0608d285d8cc04e001011a170a15120d0a0b0a09e999a4e99d9e36343812044a0208591a0a180a0740e9bb84e889b21a0d00010000000300499602d20000050a030a01201a0a180a0740e9bb84e889b21a0d00010000000300499602d20000070a050a032073624baa02489a0145080120cb507800c80100f00100f80100900200c80200980300a00300b00300c00300d00300e803008a04021002900480c0829004b80400c00400ca0400f804dc8002880500044a0240011082010d0a076161617465737418012803\")\n\n        /**\n         * 一个引用另一个 quote\n         */\n        val nestedQuote2 =\n            decodeProto(\"0631ea022e08a4fc1010d285d8cc041885e8b4830620012a0e0a0c0a0a40e9bb84e889b2207362420a1896fee2d386808080011b0a190a0840616161746573741a0d00010000000800499602d20000080a060a04207878784baa02489a0145080120cb507800c80100f00100f80100900200c80200980300a00300b00300c00300d00300e803008a04021003900480c0829004b80400c00400ca0400f804dc8002880500044a0240011082010d0a076161617465737418012803\")\n\n        /**\n         * quote -> quote -> quote[at + plain]\n         */\n        val nestedQuote3 =\n            decodeProto(\"062aea022708a6fc1010d285d8cc0418b0e8b4830620012a070a050a03787878420a18b584a7ca80808080011b0a190a0840616161746573741a0d00010000000800499602d200000a0a080a062061616161614baa02489a0145080120cb507800c80100f00100f80100900200c80200980300a00300b00300c00300d00300e803008a04021003900480c0829004b80400c00400ca0400f804dc8002880500044a0240011082010d0a076161617465737418012803\")\n\n        /**\n         * [Dice.value] 4\n         */\n        val dice4 =\n            decodeProto(\"056432620a0e5be99a8fe69cbae9aab0e5ad905d1006180122104823d3adb15df08014ce5d6796b76ee128c85930033a103430396532613639623136393138663950c80158c8016211727363547970653f313b76616c75653d336a0a0a0608c80110c8014001120a100a0e5be99a8fe69cbae9aab0e5ad905d4baa02489a014508017800900101c80100f00100f80100900200c80200980300a00300b00300c00300d00300e803008a04021003900480c0829004b80400c00400ca0400f804dc8002880500044a0240011082010d0a076161617465737418012803\")\n\n        /**\n         * quote -> dice4\n         */\n        val quoteDice4 =\n            decodeProto(\"06e601ea02e20108adfc1010d285d8cc04188feab4830620012a120a100a0e5be99a8fe69cbae9aab0e5ad905d420a1894bbc6f481808080014aad010a2d08d285d8cc0410d285d8cc04185228adfc10308feab483063894bbc6f481808080014a0608d285d8cc04e001011a7c0a7a125e325c0a0e5be99a8fe69cbae9aab0e5ad905d1006180122104823d3adb15df08014ce5d6796b76ee128c85930033a1034303965326136396231363931386639480050c80158c8016211727363547970653f313b76616c75653d336a02400112120a100a0e5be99a8fe69cbae9aab0e5ad905d12044a0208001b0a190a0840616161746573741a0d00010000000800499602d20000080a060a04206162634baa02489a0145080120cb507800c80100f00100f80100900200c80200980300a00300b00300c00300d00300e803008a04021003900480c0829004b80400c00400ca0400f804dc8002880500044a0240011082010d0a076161617465737418012803\")\n\n        /**\n         * forward[quote + dice + forward]\n         */\n        val complexForward =\n            \"044b0a3a08d285d8cc041852288f831130dfffb6830638a7c4dfde87808080014a0e08d285d8cc042206e7b289e889b2a2010b10b0f083f7fbffffffff011a0d0a0b12050a030a016112024a00dc010a3a08d285d8cc0418522891831130e4ffb68306388fc594dd85808080014a0e08d285d8cc042206e7b289e889b2a2010b10b1f083f7fbffffffff011a9d010a9a011270ea026d088f831110d285d8cc0418dfffb6830620012a050a030a0161420a18a7c4dfde87808080014a400a2d08d285d8cc0410d285d8cc041852288f831130dfffb6830638a7c4dfde87808080014a0608d285d8cc04e001011a0f0a0d12050a030a016112044a02080050d285d8cc04121a0a180a0740e7b289e889b21a0d00010000000300499602d2000012060a040a02207212024a00520a3a08d285d8cc0418522892831130f2ffb6830638a8e4d1eb80808080014a0e08d285d8cc042206e7b289e889b2a2010b10b2f083f7fbffffffff011a140a12120c0a0a0a085be9aab0e5ad905d12024a00700a3a08d285d8cc04185228978311308d80b7830638a0e8bfa582808080014a0e08d285d8cc042206e7b289e889b2a2010b10b3f083f7fbffffffff011a320a30122a0a280a265be59088e5b9b6e8bdace58f915de8afb7e58d87e7baa7e696b0e78988e69cace69fa5e79c8b12024a00\"\n                .let { s ->\n                    ProtoBuf.decodeFromHexString<List<MsgComm.Msg>>(s).flatMap { it.msgBody.richText.elems }\n                }\n\n        val nestedForward =\n            \"0a790a3008d285d8cc041852200028f9263084f99c83064a1608d285d8cc04220ee69eabe790b3c2b7e99ba8e88eb9a2010210011a450a430a0618d5f0fbdf0412390a370a315be59088e5b9b6e8bdace58f915de8afb7e4bdbfe794a8e6898be69cba5151e69c80e696b0e78988e69cace69fa5e79c8b1a005a000a620a3f08d285d8cc041852200028fb2630f5f99c83064a2508d285d8cc04221de7bea4e59e83e59cbeefbc8ce697b6e4b88de697b6e69da5e8a2ab6763a2010210011a1f0a1d0a0618df98a9a10d12090a070a01351a005a0012084a060890e60260000a97010a3f08d285d8cc0418522000288a2730ef999d83064a2508d285d8cc04221de7bea4e59e83e59cbeefbc8ce697b6e4b88de697b6e69da5e8a2ab6763a2010210011a540a520a0618a19bc4fe09122fea022c08fb2610d285d8cc0418f5f99c830620012a050a030a01353001420a188fefa5ae8a8080800150d285d8cc04120d0a0b0a0561736566661a005a0012084a060890e602600012fe060a084d756c74694d736712f1060af0040a3008d285d8cc041852200028f9263084f99c83064a1608d285d8cc04220ee69eabe790b3c2b7e99ba8e88eb9a2010210011abb040ab8040a0618d5f0fbdf0412ad0462aa040aa30401789cbd535d6f1241147df7574cc6676497a5c036bb3408bbb608550a02d234cdb2ccc2da1db6ccccb2edbe359af8fdf5604c6cad8969134d8d9a98544d2c0ffe1617f0c9bfe080561b5f7c30f14e723373ef9c73ef99dc51e636b003fa8850dbedaa503c234080baa6dbb2bb6d157acc8aa4e05cfa14e0a660da064d62234b85cbe3ad5be1decbf1ebb7e1d1a31508f0aa653b68d1c0488545cf617691b6571389999ca8c96224a38952249ee43b5917e488248852327936abcb991c0486c9a6a5fb36f28fa110b0b287551883c0720cde88040145a46f9b6821c74f33c715cb76c02b8a02ef1aa48162338481636cba1ee351c823cc660e02a6ebb84485a785a971ae294c8a430e1a0df6b898d1936b272501253a45fe85219698300c770f460fde7d7eff75fbc5f8dec75950a15cc23f3164caf99a96af674dcbcad44c400d622d87db83d1cdeb2bffb933fe3ae1eed57067f0edd39de1e3c32f1fee723f7cba3f7e7ed0366741f55c3568cc2fe1a5b546bd12d3a592b0982b89eb976b58971af54ea715bbe417af14e58b55d6aaf17ca3baae558235bfd835850b755d0a7a3d9f90423320fd3c08923579a3d9d419958c8542b613b082ee5332df4f56b4780a8bbee9457b74be10b43cdfa71ea3e7b576aee4aabf0501a543d24a943ba0500f63836cfe52971226eb8ff779b63fdab93d3e7a15de7f383cbc31dc7ac329a23f919c233a19a8b4425d8f980874a7e37d724c202ff62339b9ccff47fa3b18253b9f10231a000a620a3f08d285d8cc041852200028fb2630f5f99c83064a2508d285d8cc04221de7bea4e59e83e59cbeefbc8ce697b6e4b88de697b6e69da5e8a2ab6763a2010210011a1f0a1d0a0618df98a9a10d12090a070a01351a005a0012084a060890e60260000a97010a3f08d285d8cc0418522000288a2730ef999d83064a2508d285d8cc04221de7bea4e59e83e59cbeefbc8ce697b6e4b88de697b6e69da5e8a2ab6763a2010210011a540a520a0618a19bc4fe09122fea022c08fb2610d285d8cc0418f5f99c830620012a050a030a01353001420a188fefa5ae8a8080800150d285d8cc04120d0a0b0a0561736566661a005a0012084a060890e602600012f3040a2d4d756c74694d73675f36363544314539312d414531332d343739312d394630392d33303133373742434639414412c1040a4e0a3108d285d8cc041852200028ffb20130fef89c83064a1608d285d8cc04220ee69eabe790b3c2b7e99ba8e88eb9a2010210011a190a170a061881f9d1ae02120d0a0b0a0554734d73671a005a000ab9010a3108d285d8cc041852200028ffb20130fff89c83064a1608d285d8cc04220ee69eabe790b3c2b7e99ba8e88eb9a2010210011a83010a80010a0618e3fde8a20b121b0a190a1341534a57454a58436366664157630a736172661a005a00125942571220463042383130354243463033374133323733413644343133453941333043393338b0bd858e0940b787ace70b485050005a0060006a10f0b8105bcf037a3273a6d413e9a30c93a00100b001ac02b8018302c801b85c0a4e0a3108d285d8cc041852200028ffb2013080f99c83064a1608d285d8cc04220ee69eabe790b3c2b7e99ba8e88eb9a2010210011a190a170a0618d1afffda02120d0a0b0a0554734d73671a005a000ae2010a4008d285d8cc041852200028ffb2013081f99c83064a2508d285d8cc04221de7bea4e59e83e59cbeefbc8ce697b6e4b88de697b6e69da5e8a2ab6763a2010210011a9d010a9a010a0618bfb1ebfb0f128f010a8c010a85015647567a5a48526d526b5a585432463351304e4451317059576d46335a586868643255774d6a4d3950567464573246335a567045547a6b774d6e63304f5846337a71717772724c627a72764a0a7a3757397862624674733361494c43687a744c46777372487637544534386d317763752f7173484c7a64757777737574734b456744516f3d1a005a00\"\n                .hexToBytes().loadAs(MsgTransmit.PbMultiMsgTransmit.serializer())\n\n        private fun decodeProto(p: String) = ProtoBuf.decodeFromHexString<List<ImMsgBody.Elem>>(p)\n    }\n\n//    override suspend fun downloadForwardMessage(bot: Bot, resourceId: String): List<ForwardMessage.Node> {\n//        return super.downloadForwardMessage(bot, resourceId)\n//    }\n\n    /**\n     * We cannot test LongMessage and MusicShare in unit tests (for now), but these tests will be sufficient\n     */\n    @Test\n    fun `recursive refinement`() = runBlockingUnit {\n        val map = listOf(\n            RefineTest(testCases.simpleQuote) {\n                expected {\n                    +QuoteReply(sourceStub(buildMessageChain {\n                        +\"除非648\"\n                    }))\n                    +At(1234567890) // sent by official client, redundant At?\n                    +\" \"\n                    +At(1234567890)\n                    +\" sb\"\n                }\n                light()\n                deep()\n            },\n            RefineTest(testCases.nestedQuote2) {\n                expected {\n                    +QuoteReply(sourceStub(buildMessageChain {\n                        +\"@黄色 sb\" // this is sent by official client.\n                    }))\n                    +At(1234567890) // mentions self\n                    +\" xxx\"\n                }\n                light()\n                deep()\n            },\n            RefineTest(testCases.nestedQuote3) {\n                expected {\n                    +QuoteReply(sourceStub(buildMessageChain {\n                        +\"xxx\" // official client does not handle nested quotes.\n                    }))\n                    +At(1234567890) // mentions self\n                    +\" aaaaa\"\n                }\n                light()\n                deep()\n            },\n            RefineTest(testCases.dice4) {\n                expected {\n                    +Dice(4)\n                }\n                light()\n                deep()\n            },\n            RefineTest(testCases.quoteDice4) {\n                expected {\n                    +QuoteReply(sourceStub(PlainText(\"[随机骰子]\")))\n                    +At(1234567890)\n                    +\" abc\"\n                }\n                light()\n                deep()\n            },\n            RefineTest(testCases.complexForward) {\n                expected {\n                    +\"a\"\n                    +QuoteReply(sourceStub(PlainText(\"a\")))\n                    +At(1234567890)\n                    +PlainText(\" r\")\n                    +PlainText(\"[骰子]\") // client does not support\n                    +PlainText(\"[合并转发]请升级新版本查看\") // client support but mirai does not.\n                }\n                deep() // deep only\n            }\n        )\n\n        for (test in map) {\n            if (test.testLight) {\n                testRecursiveRefine(test.list, test.expected, true)\n            }\n            if (test.testDeep) {\n                testRecursiveRefine(test.list, test.expected, false)\n            }\n        }\n    }\n\n    @Test\n    fun `test nested forward refinement`() = runBlockingUnit {\n        val redefined = getMiraiImpl().run { testCases.nestedForward.toForwardMessageNodes(bot) }\n        assertNodesEquals(\n            listOf(\n                ForwardMessage.Node(\n                    senderId = 1234567890,\n                    time = 1617378436,\n                    senderName = \"枫琳·雨莹\",\n                    messageChain = buildMessageChain {\n                        +redefined[0].messageChain[MessageOrigin]!!\n                        val rf = redefined[0].messageChain[ForwardMessage]!!\n                        +ForwardMessage(\n                            preview = rf.preview,\n                            title = rf.title,\n                            brief = rf.brief,\n                            source = rf.source,\n                            summary = rf.summary,\n                            nodeList = listOf(\n                                ForwardMessage.Node(1234567890, 1617378430, \"枫琳·雨莹\", PlainText(\"TsMsg\")),\n                                ForwardMessage.Node(\n                                    1234567890,\n                                    1617378431,\n                                    \"枫琳·雨莹\",\n                                    PlainText(\"ASJWEJXCcffAWc\\nsarf\") + Image(\"{F0B8105B-CF03-7A32-73A6-D413E9A30C93}.mirai\")\n                                ),\n                                ForwardMessage.Node(1234567890, 1617378432, \"枫琳·雨莹\", PlainText(\"TsMsg\")),\n                                ForwardMessage.Node(\n                                    1234567890,\n                                    1617378433,\n                                    \"群垃圾，时不时来被gc\",\n                                    PlainText(\"VGVzZHRmRkZXT2F3Q0NDQ1pYWmF3ZXhhd2UwMjM9PVtdW2F3ZVpETzkwMnc0OXF3zqqwrrLbzrvJ\\nz7W9xbbFts3aILChztLFwsrHv7TE48m1wcu/qsHLzduwwsutsKEgDQo=\")\n                                ),\n                            )\n                        )\n                    }\n                ),\n                ForwardMessage.Node(\n                    1234567890, 1617378549, \"群垃圾，时不时来被gc\", PlainText(\"5\")\n                ),\n                ForwardMessage.Node(\n                    1234567890,\n                    1617382639,\n                    \"群垃圾，时不时来被gc\",\n                    redefined[2].messageChain[QuoteReply]!! + PlainText(\"aseff\")\n                ),\n            ),\n            redefined,\n        )\n    }\n\n}\n\n\nprivate fun sourceStub(\n    originalMessage: Message\n): OfflineMessageSourceImplData {\n    return OfflineMessageSourceImplData(\n        MessageSourceKind.GROUP, intArrayOf(), bot.id, 0, 0, 0, originalMessage.toMessageChain(), intArrayOf()\n    )\n}\n\nprivate suspend fun testRecursiveRefine(list: List<ImMsgBody.Elem>, expected: MessageChain, isLight: Boolean) {\n    val actual = buildMessageChain {\n        MessageProtocolFacade.decode(list, 0, MessageSourceKind.GROUP, bot, this, null)\n    }.let { c ->\n        if (isLight) {\n            c.refineLight(bot)\n        } else {\n            c.refineDeep(bot)\n        }\n    }\n    assertMessageChainEquals(expected, actual)\n}\n\nprivate fun assertNodesEquals(excepted: List<ForwardMessage.Node>, actual: List<ForwardMessage.Node>) {\n    assertEquals(excepted.size, actual.size, \"Length not match\")\n    for (i in excepted.indices) {\n        val en = excepted[i]\n        val an = actual[i]\n        assertEquals(en.senderId, an.senderId)\n        assertEquals(en.time, an.time)\n        assertEquals(en.senderName, an.senderName)\n        assertMessageChainEquals(en.messageChain, an.messageChain)\n    }\n}\n\n@Suppress(\"unused\")\nprivate object Color {\n    const val RESET = \"\\u001b[0m\"\n    const val WHITE = \"\\u001b[97m\"\n    const val RED = \"\\u001b[31m\"\n    const val EMERALD_GREEN = \"\\u001b[32m\"\n    const val GOLD = \"\\u001b[33m\"\n    const val BLUE = \"\\u001b[34m\"\n    const val PURPLE = \"\\u001b[35m\"\n    const val GREEN = \"\\u001b[36m\"\n    const val GRAY = \"\\u001b[90m\"\n    const val LIGHT_RED = \"\\u001b[91m\"\n    const val LIGHT_GREEN = \"\\u001b[92m\"\n    const val LIGHT_YELLOW = \"\\u001b[93m\"\n    const val LIGHT_BLUE = \"\\u001b[94m\"\n    const val LIGHT_PURPLE = \"\\u001b[95m\"\n    const val LIGHT_CYAN = \"\\u001b[96m\"\n}\n\nprivate fun assertMessageChainEquals(expected: MessageChain, actual: MessageChain) {\n    val color = object {\n        val yellow get() = Color.LIGHT_YELLOW\n        val green get() = Color.LIGHT_GREEN\n        val reset get() = Color.RESET\n    }\n\n    fun compare(expected: MessageChain, actual: MessageChain): Boolean {\n        if (expected.size != actual.size) return false\n        for ((e, a) in expected.zip(actual)) {\n            when (e) {\n                is QuoteReply -> {\n                    if (a !is QuoteReply) return false\n                    if (!compare(e.source.originalMessage, a.source.originalMessage)) return false\n                }\n\n                is MessageSource -> {\n                    if (a !is MessageSource) return false\n                    if (!compare(e.originalMessage, a.originalMessage)) return false\n                }\n\n                is ForwardMessage -> {\n                    if (a !is ForwardMessage) return false\n                    if (e.brief != a.brief) return false\n                    if (e.summary != a.summary) return false\n                    if (e.source != a.source) return false\n                    if (e.title != a.title) return false\n                    if (e.preview != a.preview) return false\n                    assertNodesEquals(e.nodeList, a.nodeList)\n                }\n\n                is Image -> {\n                    if (a !is Image) return false\n                    if (e.imageId != a.imageId) return false\n                }\n\n                else -> {\n                    if (e != a) return false\n                }\n            }\n        }\n        return true\n    }\n\n    if (!compare(expected, actual))\n        throw AssertionError(\n            \"\\n\" + \"\"\"\n                Expected  str:${color.green}${expected}${color.reset}\n                Actual    str:${color.green}${actual}${color.reset}\n                \n                Expected json:${color.yellow}${expected.serializeToJsonString()}${color.reset}\n                Actual   json:${color.yellow}${actual.serializeToJsonString()}${color.reset}\n            \"\"\".trimIndent() + \"\\n\"\n        )\n}\n\nprivate class RefineTest(\n    val list: List<ImMsgBody.Elem>,\n) {\n    lateinit var expected: MessageChain\n    fun expected(chain: MessageChainBuilder.() -> Unit) {\n        expected = buildMessageChain(chain)\n    }\n\n    var testLight: Boolean = false\n    var testDeep: Boolean = false\n    fun deep() {\n        testDeep = true\n    }\n\n    fun light() {\n        testLight = true\n    }\n}\n\n@Suppress(\"TestFunctionName\")\nprivate fun RefineTest(list: List<ImMsgBody.Elem>, action: RefineTest.() -> Unit): RefineTest {\n    return RefineTest(list).apply(action)\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/data/MessageSerializationTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.data\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.Polymorphic\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.*\nimport kotlinx.serialization.serializer\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.message.MessageSerializers\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.cast\nimport net.mamoe.mirai.utils.mapToByteArray\nimport net.mamoe.mirai.utils.structureToString\nimport kotlin.test.*\n\ninternal class MessageSerializationTest : AbstractTest() {\n    @Suppress(\"DEPRECATION_ERROR\")\n    private val module\n        get() = MessageSerializers.serializersModule\n    private val format\n        get() = Json {\n            serializersModule = module\n            useArrayPolymorphism = false\n            ignoreUnknownKeys = true\n        }\n\n    private inline fun <reified T : Any> T.serialize(serializer: KSerializer<T> = module.serializer()): String {\n        return format.encodeToString(serializer, this)\n    }\n\n    private inline fun <reified T : Any> String.deserialize(serializer: KSerializer<T> = module.serializer()): T {\n        return format.decodeFromString(serializer, this)\n    }\n\n    private inline fun <reified T : Any> testSerialization(t: T, serializer: KSerializer<T> = module.serializer()) {\n        val deserialized = kotlin.runCatching {\n            println(\"Testing ${t::class.simpleName} with serializer $serializer\")\n            val serialized = t.serialize(serializer)\n            println(\"Result: ${serializer.descriptor.serialName}  $serialized\")\n            serialized.deserialize(serializer)\n        }.getOrElse {\n            throw IllegalStateException(\"Failed to serialize $t\", it)\n        }\n        assertEquals(\n            t,\n            deserialized,\n            message = \"serialized string:   ${t.serialize(serializer)}\\ndeserialized string: ${\n                deserialized.serialize(\n                    serializer\n                )\n            }\\n\"\n        )\n    }\n\n\n    private val image = Image(\"{01E9451B-70ED-EAE3-B37C-101F1EEBF5B5}.mirai\")\n    private val testMessageContentInstances: Array<out MessageContent> = arrayOf(\n        PlainText(\"test\"),\n        At(123456),\n        AtAll,\n        image,\n        Face(Face.AI_NI),\n        RockPaperScissors.PAPER,\n        UnsupportedMessageImpl(ImMsgBody.Elem())\n    )\n\n    private val emptySource = Mirai.constructMessageSource(\n        1L,\n        MessageSourceKind.FRIEND,\n        1,\n        2,\n        intArrayOf(1),\n        1,\n        intArrayOf(1),\n        messageChainOf()\n    )\n\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n    private val testConstrainSingleMessageInstances: Array<out ConstrainSingle> = arrayOf(\n        Mirai.constructMessageSource(\n            1L,\n            MessageSourceKind.FRIEND,\n            1,\n            2,\n            intArrayOf(1),\n            1,\n            intArrayOf(1),\n            messageChainOf(emptySource, image)\n        ),\n\n        VipFace(VipFace.AiXin, 1),\n        PokeMessage.BaoBeiQiu,\n        MarketFaceImpl(ImMsgBody.MarketFace()),\n        SimpleServiceMessage(1, \"SSM\"),\n        LightApp(\"lightApp\"),\n        image.flash(),\n        image.toForwardMessage(1L, \"test\"),\n        MusicShare(MusicKind.NeteaseCloudMusic, \"123\", \"123\", \"123\", \"123\", \"123\", \"123\"),\n        MessageOrigin(SimpleServiceMessage(1, \"content\"), \"resource id\", MessageOriginKind.LONG),\n        ShowImageFlag,\n        Dice(1),\n        FileMessageImpl(\"id\", 2, \"name\", 1)\n    )\n\n    @Serializable\n    data class W(\n        val m: FileMessage\n    )\n\n    @Test\n    fun `test FileMessage serialization`() {\n        val w = W(FileMessageImpl(\"id\", 2, \"name\", 1))\n        println(w.serialize(W.serializer()))\n        assertEquals(w, w.serialize(W.serializer()).deserialize(W.serializer()))\n    }\n\n    @Test\n    fun `test Image serialization`() {\n        val string = image.serialize()\n        val element = string.deserialize<JsonElement>()\n        element as JsonObject\n        assertEquals(string.deserialize(), image)\n\n        val image2 = Image(image.imageId) {\n            type = ImageType.GIF\n            width = 123\n            height = 456\n        }\n        val string2 = image2.serialize()\n        val element2 = string2.deserialize<JsonElement>()\n        element2 as JsonObject\n        assertEquals(element2[\"imageType\"]?.jsonPrimitive?.content, image2.imageType.name)\n        assertEquals(element2[\"width\"]?.jsonPrimitive?.int, image2.width)\n        assertEquals(element2[\"height\"]?.jsonPrimitive?.int, image2.height)\n        val decoded: Image = string2.deserialize()\n        assertEquals(decoded.imageId, image2.imageId)\n        assertEquals(decoded.imageType, image2.imageType)\n        assertEquals(decoded.width, image2.width)\n        assertEquals(decoded.height, image2.height)\n\n        val string3 = \"\"\"\n        {\n            \"imageType\": \"GIF\",\n            \"width\": 123,\n            \"height\": 456,\n            \"imageId\": \"${image.imageId}\"\n         }\n        \"\"\".trimIndent()\n        val decoded2: Image = string3.deserialize()\n        assertEquals(decoded2.imageId, image2.imageId)\n        assertEquals(decoded2.imageType, image2.imageType)\n        assertEquals(decoded2.width, image2.width)\n        assertEquals(decoded2.height, image2.height)\n    }\n\n    @Serializable\n    data class RichWrapper(\n        val richMessage: RichMessage\n    )\n\n    @Test\n    fun `test polymorphic serialization`() {\n        val string = format.encodeToString(RichWrapper.serializer(), RichWrapper(SimpleServiceMessage(1, \"content\")))\n        println(string)\n        var element = format.parseToJsonElement(string)\n        element as JsonObject\n        element = element[\"richMessage\"] as JsonObject\n        assertEquals(\"SimpleServiceMessage\", element[\"type\"]?.cast<JsonPrimitive>()?.content)\n        assertEquals(\"content\", element[\"content\"]?.cast<JsonPrimitive>()?.content)\n        assertEquals(1, element[\"serviceId\"]?.cast<JsonPrimitive>()?.content?.toInt())\n    }\n\n    @Serializable\n    data class Wrapper(\n        val message: @Polymorphic SingleMessage\n    )\n\n    @Test\n    fun `test ShowImageFlag serialization`() {\n        val string = format.encodeToString(Wrapper.serializer(), Wrapper(ShowImageFlag))\n        println(string)\n        var element = format.parseToJsonElement(string)\n        element as JsonObject\n        element = element[\"message\"] as JsonObject\n        assertEquals(\"ShowImageFlag\", element[\"type\"]?.cast<JsonPrimitive>()?.content)\n        assertTrue { element.size == 1 }\n        assertEquals(ShowImageFlag, format.decodeFromString(Wrapper.serializer(), string).message)\n    }\n\n    @Test\n    fun `test contextual serialization`() {\n        for (message in testMessageContentInstances) {\n            testSerialization(\n                message,\n                module.getContextual(message::class)?.cast()\n                    ?: error(\"No contextual serializer found for ${message::class}\")\n            )\n        }\n        for (message in testConstrainSingleMessageInstances) {\n            testSerialization(\n                message,\n                module.getContextual(message::class)?.cast()\n                    ?: error(\"No contextual serializer found for ${message::class}\")\n            )\n        }\n    }\n\n    @Test\n    fun `test serialize message chain`() {\n        val chain = testMessageContentInstances.toMessageChain() + emptySource\n        println(chain.serialize()) // [[\"net.mamoe.mirai.message.data.PlainText\",{\"content\":\"test\"}],[\"net.mamoe.mirai.message.data.At\",{\"target\":123456,\"display\":\"\"}],[\"net.mamoe.mirai.message.data.AtAll\",{}],[\"net.mamoe.mirai.internal.message.OfflineGroupImage\",{\"imageId\":\"{01E9451B-70ED-EAE3-B37C-101F1EEBF5B5}.mirai\"}]]\n\n        testSerialization(chain)\n    }\n\n    @Test\n    fun `test MessageSource serializable from issue 1273`() {\n        // #1273\n\n        val a = \"\"\"\n            {\"kind\":\"GROUP\",\"botId\":692928873,\"ids\":[44],\"internalIds\":[-933057735],\"time\":1621607925,\"fromId\":1930893235,\"targetId\":1067474509,\"originalMessage\":[{\"type\":\"Image\",\"imageId\":\"{47B45B11-1491-3E85-E816-467029444C3F}.jpg\"}]}\n        \"\"\".trimIndent()\n        val j = Json {\n            serializersModule = module\n            ignoreUnknownKeys = true\n        }\n        val source = j.decodeFromString(MessageSerializers.serializersModule.serializer<MessageSource>(), a)\n        println(source.structureToString())\n        assertEquals(\n            expected = Mirai.buildMessageSource(692928873, MessageSourceKind.GROUP) {\n                id(44)\n                internalId(-933057735)\n                time(1621607925)\n                sender(1930893235)\n                target(1067474509)\n                messages {\n                    +Image(\"{47B45B11-1491-3E85-E816-467029444C3F}.jpg\")\n                }\n            },\n            actual = source\n        )\n    }\n\n    @Serializable\n    data class AudioTestStandard(\n        val online: OnlineAudio,\n        val offline: OfflineAudio,\n        val onlineAsRec: Audio,\n        val offlineAsRec: Audio,\n    )\n\n    @Test\n    fun `test Audio standard`() {\n        val origin = AudioTestStandard(\n            OnlineAudioImpl(\"name\", byteArrayOf(), 1, AudioCodec.SILK, \"url\", 2, null),\n            OfflineAudio(\"test\", byteArrayOf(), 1, AudioCodec.SILK, null),\n\n            OnlineAudioImpl(\"name\", byteArrayOf(), 1, AudioCodec.SILK, \"url\", 2, null),\n            OfflineAudio(\"test\", byteArrayOf(), 1, AudioCodec.SILK, null),\n        )\n\n        assertEquals(\n            AudioCodec.SILK.id,\n            format.encodeToJsonElement(origin).jsonObject[\"offline\"]!!.jsonObject[\"codec\"]!!.jsonPrimitive.content.toInt()\n        ) // use custom serializer\n\n        assertEquals(\n            AudioCodec.SILK.id,\n            format.encodeToJsonElement(origin).jsonObject[\"online\"]!!.jsonObject[\"codec\"]!!.jsonPrimitive.content.toInt()\n        ) // use custom serializer\n\n        assertEquals(\n            \"OnlineAudio\",\n            format.encodeToJsonElement(origin).jsonObject[\"online\"]!!.jsonObject[\"type\"]!!.jsonPrimitive.content\n        )\n        assertEquals(\n            \"OfflineAudio\",\n            format.encodeToJsonElement(origin).jsonObject[\"offline\"]!!.jsonObject[\"type\"]!!.jsonPrimitive.content\n        )\n\n        assertEquals(\n            \"OnlineAudio\",\n            format.encodeToJsonElement(origin).jsonObject[\"onlineAsRec\"]!!.jsonObject[\"type\"]!!.jsonPrimitive.content\n        )\n        assertEquals(\n            \"OfflineAudio\",\n            format.encodeToJsonElement(origin).jsonObject[\"offlineAsRec\"]!!.jsonObject[\"type\"]!!.jsonPrimitive.content\n        )\n\n        val result = origin.serialize().deserialize<AudioTestStandard>()\n\n        assertEquals(origin.online::class, result.online::class)\n        assertEquals(origin.offline::class, result.offline::class)\n        assertEquals(origin.onlineAsRec::class, result.onlineAsRec::class)\n        assertEquals(origin.offlineAsRec::class, result.offlineAsRec::class)\n\n        assertEquals(origin.online, result.online)\n        assertEquals(origin.offline, result.offline)\n        assertEquals(origin.onlineAsRec, result.onlineAsRec)\n        assertEquals(origin.offlineAsRec, result.offlineAsRec)\n\n        assertEquals(origin, result)\n    }\n\n    @Serializable\n    data class AudioTestWithPtt(\n        val online: OnlineAudio,\n        val offline: OfflineAudio,\n        val onlineAsRec: Audio,\n        val offlineAsRec: Audio,\n    )\n\n    @Test\n    fun `test Audio with ptt`() {\n        val origin = AudioTestWithPtt(\n            OnlineAudioImpl(\"name\", byteArrayOf(), 1, AudioCodec.SILK, \"url\", 2, ImMsgBody.Ptt(1)),\n            OfflineAudio(\"test\", byteArrayOf(), 1, AudioCodec.SILK, byteArrayOf(1, 2)),\n\n            OnlineAudioImpl(\"name\", byteArrayOf(), 1, AudioCodec.SILK, \"url\", 2, ImMsgBody.Ptt(1)),\n            OfflineAudio(\"test\", byteArrayOf(), 1, AudioCodec.SILK, byteArrayOf(1, 2)),\n        )\n\n        val result = origin.serialize().deserialize<AudioTestWithPtt>()\n\n        assertEquals(origin.online::class, result.online::class)\n        assertEquals(origin.offline::class, result.offline::class)\n        assertEquals(origin.onlineAsRec::class, result.onlineAsRec::class)\n        assertEquals(origin.offlineAsRec::class, result.offlineAsRec::class)\n\n        assertEquals(origin.online, result.online)\n        assertEquals(origin.offline, result.offline)\n        assertEquals(origin.onlineAsRec, result.onlineAsRec)\n        assertEquals(origin.offlineAsRec, result.offlineAsRec)\n\n        assertEquals(origin, result)\n    }\n\n    @Test\n    fun `test Audio extraData`() {\n        val origin = OnlineAudioImpl(\"name\", byteArrayOf(), 1, AudioCodec.SILK, \"url\", 2, ImMsgBody.Ptt(1))\n        val result = format.parseToJsonElement(origin.serialize()).jsonObject\n\n        assertNotNull(origin.extraData)\n        assertContentEquals(\n            origin.extraData,\n            result[\"extraData\"]?.jsonArray?.mapToByteArray { it.jsonPrimitive.int.toByte() })\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/protocol/MessageProtocolFacadeTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol\n\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class MessageProtocolFacadeTest : AbstractTest() {\n\n\n    @Test\n    fun `can load`() {\n        assertEquals(\n            \"\"\"\n                QuoteReplyProtocol\n                AudioProtocol\n                CustomMessageProtocol\n                FaceProtocol\n                FileMessageProtocol\n                FlashImageProtocol\n                ImageProtocol\n                MarketFaceProtocol\n                SuperFaceProtocol\n                MusicShareProtocol\n                PokeMessageProtocol\n                PttMessageProtocol\n                RichMessageProtocol\n                ShortVideoProtocol\n                TextProtocol\n                VipFaceProtocol\n                ForwardMessageProtocol\n                LongMessageProtocol\n                IgnoredMessagesProtocol\n                UnsupportedMessageProtocol\n                GeneralMessageSenderProtocol\n            \"\"\".trimIndent(),\n            MessageProtocolFacadeImpl().loaded.joinToString(\"\\n\") { it::class.simpleName.toString() }\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/protocol/impl/AbstractMessageProtocolTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.coroutines.CompletableDeferred\nimport kotlinx.coroutines.Deferred\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.serialization.*\nimport kotlinx.serialization.descriptors.SerialDescriptor\nimport kotlinx.serialization.descriptors.buildClassSerialDescriptor\nimport kotlinx.serialization.encoding.Decoder\nimport kotlinx.serialization.encoding.Encoder\nimport kotlinx.serialization.encoding.decodeStructure\nimport kotlinx.serialization.encoding.encodeStructure\nimport kotlinx.serialization.json.*\nimport net.mamoe.mirai.contact.ContactOrBot\nimport net.mamoe.mirai.contact.Friend\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.internal.AbstractBot\nimport net.mamoe.mirai.internal.BotAccount\nimport net.mamoe.mirai.internal.contact.AbstractContact\nimport net.mamoe.mirai.internal.message.data.inferMessageSourceKind\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocolFacade\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocolFacadeImpl\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderPipelineImpl\nimport net.mamoe.mirai.internal.message.protocol.decodeAndRefineLight\nimport net.mamoe.mirai.internal.message.protocol.encode.MessageEncoderPipelineImpl\nimport net.mamoe.mirai.internal.message.protocol.outgoing.HighwayUploader\nimport net.mamoe.mirai.internal.message.protocol.outgoing.MessageProtocolStrategy\nimport net.mamoe.mirai.internal.message.source.OnlineMessageSourceToFriendImpl\nimport net.mamoe.mirai.internal.message.source.OnlineMessageSourceToGroupImpl\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.component.ComponentStorage\nimport net.mamoe.mirai.internal.network.components.ClockHolder\nimport net.mamoe.mirai.internal.network.framework.AbstractMockNetworkHandlerTest\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.receive.MessageSvcPbSendMsg\nimport net.mamoe.mirai.internal.notice.processors.GroupExtensions\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.internal.testFramework.dynamicTest\nimport net.mamoe.mirai.message.MessageSerializers\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.message.data.MessageChain.Companion.serializeToJsonString\nimport net.mamoe.mirai.utils.*\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.reflect.KClass\nimport kotlin.test.*\n\n@OptIn(TestOnly::class)\ninternal abstract class AbstractMessageProtocolTest : AbstractMockNetworkHandlerTest(), GroupExtensions {\n    init {\n        setSystemProp(\"mirai.message.protocol.log.full\", \"true\")\n        setSystemProp(\"mirai.message.outgoing.pipeline.log.full\", \"true\")\n    }\n\n    override fun createAccount(): BotAccount = BotAccount(1230001L, \"pwd\")\n\n    protected abstract val protocols: Array<out MessageProtocol>\n    protected var defaultTarget: ContactOrBot by lateinitMutableProperty {\n        bot.addGroup(123, 1230003).apply {\n            addMember(1230003, \"user3\", MemberPermission.OWNER)\n        }\n    }\n\n    private var decoderLoggerEnabled = false\n    private var encoderLoggerEnabled = false\n\n    @BeforeTest\n    fun beforeEach() {\n        decoderLoggerEnabled = MessageDecoderPipelineImpl.defaultTraceLogging.isEnabled\n        MessageDecoderPipelineImpl.defaultTraceLogging.enable()\n        encoderLoggerEnabled = MessageEncoderPipelineImpl.defaultTraceLogging.isEnabled\n        MessageEncoderPipelineImpl.defaultTraceLogging.enable()\n    }\n\n    @AfterTest\n    fun afterEach() {\n        if (!decoderLoggerEnabled) {\n            MessageDecoderPipelineImpl.defaultTraceLogging.disable()\n        }\n        if (!encoderLoggerEnabled) {\n            MessageEncoderPipelineImpl.defaultTraceLogging.disable()\n        }\n    }\n\n    protected fun facadeOf(vararg protocols: MessageProtocol): MessageProtocolFacade {\n        return MessageProtocolFacadeImpl(\n            protocols.toList(),\n            remark = \"MessageProtocolFacade with ${protocols.joinToString { it::class.simpleName!! }}\"\n        )\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // coding\n    ///////////////////////////////////////////////////////////////////////////\n\n    protected fun doEncoderChecks(\n        expectedStruct: List<ImMsgBody.Elem>,\n        protocols: Array<out MessageProtocol>,\n        encode: MessageProtocolFacade.() -> List<ImMsgBody.Elem>\n    ) {\n        asserter.assertEquals(\n            expectedStruct,\n            facadeOf(*protocols).encode(),\n            message = \"Failed to check single Protocol\"\n        )\n        asserter.assertEquals(\n            expectedStruct,\n            MessageProtocolFacade.INSTANCE.encode(),\n            message = \"Failed to check with all protocols\"\n        )\n    }\n\n    var asserter: EqualityAsserter = EqualityAsserter.OrdinaryThenStructural\n\n    fun useOrdinaryEquality() {\n        asserter = EqualityAsserter.Ordinary\n    }\n\n    fun useStructuralEquality() {\n        asserter = EqualityAsserter.Structural\n    }\n\n    protected fun doDecoderChecks(\n        expectedChain: MessageChain,\n        protocols: Array<out MessageProtocol> = this.protocols,\n        decode: MessageProtocolFacade.() -> MessageChain\n    ) {\n        asserter.assertEquals(\n            expectedChain.toList(),\n            facadeOf(*protocols).decode().toList(),\n            message = \"Failed to check single Protocol\"\n        )\n        asserter.assertEquals(\n            expectedChain.toList(),\n            MessageProtocolFacade.INSTANCE.decode().toList(),\n            message = \"Failed to check with all protocols\"\n        )\n    }\n\n    protected fun doEncoderChecks(\n        vararg expectedStruct: ImMsgBody.Elem,\n        protocols: Array<out MessageProtocol> = this.protocols,\n        encode: MessageProtocolFacade.() -> List<ImMsgBody.Elem>\n    ): Unit = doEncoderChecks(expectedStruct.toList(), protocols, encode)\n\n\n    inner class CodingChecksBuilder {\n        var elems: MutableList<ImMsgBody.Elem> = mutableListOf()\n        var messages: MessageChainBuilder = MessageChainBuilder()\n\n        var groupIdOrZero: Long = 0\n        var target: ContactOrBot = defaultTarget\n        var messageSourceKind: MessageSourceKind by lateinitMutableProperty { target.inferMessageSourceKind() }\n        var withGeneralFlags = true\n        var isForward = false\n\n        fun elem(vararg elem: ImMsgBody.Elem) {\n            elems.addAll(elem)\n        }\n\n        fun message(vararg message: SingleMessage) {\n            messages.addAll(message)\n        }\n\n        fun target(target: ContactOrBot) {\n            this.target = target\n\n            messageSourceKind = target.inferMessageSourceKind()\n\n            if (target is Group) {\n                groupIdOrZero = target.id\n            }\n        }\n\n        fun forward() {\n            this.isForward = true\n        }\n\n        fun build() = ChecksConfiguration(\n            elems.toList(),\n            messages.build(),\n            groupIdOrZero,\n            messageSourceKind,\n            target,\n            withGeneralFlags,\n            isForward\n        )\n    }\n\n    class ChecksConfiguration(\n        val elems: List<ImMsgBody.Elem>,\n        val messageChain: MessageChain,\n        val groupIdOrZero: Long,\n        val messageSourceKind: MessageSourceKind,\n        val target: ContactOrBot?,\n        val withGeneralFlags: Boolean,\n        val isForward: Boolean,\n    )\n\n    @Suppress(\"DeferredIsResult\")\n    protected fun buildCodingChecks(\n        builderAction: CodingChecksBuilder.() -> Unit,\n    ): Deferred<ChecksConfiguration> { // IDE will warn you if you forget to call .do\n        contract { callsInPlace(builderAction, InvocationKind.EXACTLY_ONCE) }\n        return CompletableDeferred(CodingChecksBuilder().apply(builderAction).build())\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    protected open fun Deferred<ChecksConfiguration>.doEncoderChecks() {\n        val config = this.getCompleted()\n        doEncoderChecks(config.elems, protocols) {\n            encode(\n                config.messageChain,\n                config.target,\n                withGeneralFlags = config.withGeneralFlags,\n                isForward = config.isForward\n            )\n        }\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    protected open fun Deferred<ChecksConfiguration>.doDecoderChecks() {\n        val config = this.getCompleted()\n        doDecoderChecks(config.messageChain, protocols) {\n            decodeAndRefineLight(\n                config.elems,\n                config.groupIdOrZero,\n                config.messageSourceKind,\n                bot\n            )\n        }\n    }\n\n    protected open fun Deferred<ChecksConfiguration>.doBothChecks() {\n        doEncoderChecks()\n        doDecoderChecks()\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // sending\n    ///////////////////////////////////////////////////////////////////////////\n\n    open inner class TestMessageProtocolStrategy : MessageProtocolStrategy<AbstractContact> {\n        override suspend fun sendPacket(bot: AbstractBot, packet: OutgoingPacket): Packet {\n            assertEquals(0x123, packet.sequenceId)\n            return MessageSvcPbSendMsg.Response.SUCCESS(123)\n        }\n\n        override suspend fun createPacketsForGeneralMessage(\n            client: QQAndroidClient,\n            contact: AbstractContact,\n            message: MessageChain,\n            originalMessage: MessageChain,\n            fragmented: Boolean,\n            sourceCallback: (Deferred<OnlineMessageSource.Outgoing>) -> Unit\n        ): List<OutgoingPacket> {\n            sourceCallback(CompletableDeferred(constructSourceForSpecialMessage(originalMessage, 1000)))\n            return listOf(OutgoingPacket(\"Test\", \"test\", 0x123, ByteReadPacket.Empty))\n        }\n\n        override suspend fun constructSourceForSpecialMessage(\n            originalMessage: MessageChain,\n            fromAppId: Int\n        ): OnlineMessageSource.Outgoing {\n            return when (val defaultTarget = defaultTarget) {\n                is Group -> OnlineMessageSourceToGroupImpl(\n                    coroutineScope = defaultTarget,\n                    internalIds = intArrayOf(1),\n                    time = 1,\n                    originalMessage = originalMessage,\n                    sender = bot,\n                    target = defaultTarget\n                )\n\n                is Friend -> OnlineMessageSourceToFriendImpl(\n                    sequenceIds = intArrayOf(1),\n                    internalIds = intArrayOf(1),\n                    time = 1,\n                    originalMessage = originalMessage,\n                    sender = bot,\n                    target = defaultTarget\n                )\n\n                else -> error(\"Unexpected target: $defaultTarget\")\n            }\n        }\n\n    }\n\n    init {\n        components[MessageProtocolStrategy] = TestMessageProtocolStrategy()\n        components[HighwayUploader] = object : HighwayUploader {\n            override suspend fun uploadMessages(\n                contact: AbstractContact,\n                components: ComponentStorage,\n                nodes: Collection<ForwardMessage.INode>,\n                isLong: Boolean,\n                senderName: String\n            ): String {\n                return \"(size=${nodes.size})${\n                    nodes.joinToString().replace(bot.id.toString(), \"123123\").md5().toUHexString(\"\")\n                }\"\n            }\n        }\n        components[ClockHolder] = object : ClockHolder() {\n            override val local: Clock = object : Clock {\n                override fun currentTimeMillis(): Long = 160023456\n            }\n        }\n    }\n\n    fun runWithFacade(action: suspend MessageProtocolFacade.() -> Unit) {\n        runBlockingUnit {\n            facadeOf(*protocols).run { action() }\n            MessageProtocolFacade.INSTANCE.copy().run { action() }\n        }\n    }\n\n    companion object {\n        fun assertMessageEquals(expected: Message, actual: Message) {\n            val expectedChain = expected.toMessageChain()\n            val actualChain = actual.toMessageChain()\n\n            val message = \"\"\"\n                Expected: $1\n                                \n                Actual: $2\n            \"\"\".trimIndent().replace(\"$1\", expectedChain.render()).replace(\"$2\", actualChain.render())\n            assertEquals(expectedChain.size, actualChain.size, message)\n            asserter.assertEquals(message, expectedChain, actualChain)\n        }\n\n        fun MessageProtocolFacade.assertMessageEquals(expected: Message, actual: Message) {\n            val expectedChain = expected.toMessageChain()\n            val actualChain = actual.toMessageChain()\n\n            val message = \"\"\"\n                Facade: ${this.remark}\n                Expected: $1\n                                \n                Actual: $2\n            \"\"\".trimIndent().replace(\"$1\", expectedChain.render()).replace(\"$2\", actualChain.render())\n            assertEquals(expectedChain.size, actualChain.size, message)\n            asserter.assertEquals(message, expectedChain, actualChain)\n        }\n\n        inline fun Asserter.assertEquals(crossinline message: () -> String, expected: Any?, actual: Any?) {\n            assertTrue({ message() + \". Expected <$expected>, actual <$actual>.\" }, actual == expected)\n        }\n\n\n        fun MessageChain.render(): String = buildString {\n            appendLine(\"size = $size\")\n            for (singleMessage in distinct()) {\n                val count = this@render.count { it == singleMessage }\n                appendLine(\"$count x [${singleMessage::class.simpleName}] $singleMessage\")\n            }\n        }\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // serialization\n    ///////////////////////////////////////////////////////////////////////////\n\n    open val format: Json\n        // `serializersModule` is volatile, always return new Json instances.\n        get() = Json {\n            prettyPrint = true\n            serializersModule = MessageSerializers.serializersModule\n        }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // serialization - polymorphism\n    ///////////////////////////////////////////////////////////////////////////\n\n    interface PolymorphicWrapper {\n        val message: SingleMessage\n    }\n\n    /**\n     * @param expectedSerialName also known as *poly discriminator*, give `null` to check for no discriminator's presence\n     */\n    protected open fun <M : SingleMessage, P : PolymorphicWrapper> testPolymorphicIn(\n        polySerializer: KSerializer<P>,\n        polyConstructor: (message: M) -> P,\n        data: M,\n        expectedSerialName: String?,\n        expectedInstance: M = data,\n    ) {\n        val string = format.encodeToString(\n            polySerializer,\n            polyConstructor(data)\n        )\n        println(string)\n        var element = format.parseToJsonElement(string)\n        element as JsonObject\n        element = element[\"message\"] as JsonObject\n        if (expectedSerialName != null) {\n            assertEquals(expectedSerialName, element[\"type\"]?.cast<JsonPrimitive>()?.content)\n        } else {\n            assertEquals(null, element[\"type\"])\n        }\n        assertEquals(\n            expectedInstance,\n            format.decodeFromString(polySerializer, string).message\n        )\n    }\n\n    @Serializable\n    data class PolymorphicWrapperSingleMessage(\n        override val message: @Polymorphic SingleMessage\n    ) : PolymorphicWrapper\n\n    protected open fun <M : SingleMessage> testPolymorphicInSingleMessage(\n        data: M,\n        expectedSerialName: String,\n        expectedInstance: M = data,\n    ) = listOf(dynamicTest(\"testPolymorphicInSingleMessage\") {\n        testPolymorphicIn(\n            polySerializer = PolymorphicWrapperSingleMessage.serializer(),\n            polyConstructor = ::PolymorphicWrapperSingleMessage,\n            data = data,\n            expectedSerialName = expectedSerialName,\n            expectedInstance = expectedInstance\n        )\n\n    })\n\n    @Serializable\n    data class PolymorphicWrapperMessageContent(\n        override val message: @Polymorphic MessageContent\n    ) : PolymorphicWrapper\n\n    protected open fun <M : MessageContent> testPolymorphicInMessageContent(\n        data: M,\n        expectedSerialName: String,\n        expectedInstance: M = data,\n    ) = listOf(dynamicTest(\"testPolymorphicInMessageContent\") {\n        testPolymorphicIn(\n            polySerializer = PolymorphicWrapperMessageContent.serializer(),\n            polyConstructor = ::PolymorphicWrapperMessageContent,\n            data = data,\n            expectedSerialName = expectedSerialName,\n            expectedInstance = expectedInstance\n        )\n    })\n\n    @Serializable\n    data class PolymorphicWrapperMessageMetadata(\n        override val message: @Polymorphic MessageMetadata\n    ) : PolymorphicWrapper\n\n    protected open fun <M : MessageMetadata> testPolymorphicInMessageMetadata(\n        data: M,\n        expectedSerialName: String,\n        expectedInstance: M = data,\n    ) = listOf(dynamicTest(\"testPolymorphicInMessageMetadata\") {\n        testPolymorphicIn(\n            polySerializer = PolymorphicWrapperMessageMetadata.serializer(),\n            polyConstructor = ::PolymorphicWrapperMessageMetadata,\n            data = data,\n            expectedSerialName = expectedSerialName,\n            expectedInstance = expectedInstance\n        )\n    })\n\n    ///////////////////////////////////////////////////////////////////////////\n    // serialization - in MessageChain\n    ///////////////////////////////////////////////////////////////////////////\n\n    protected open fun <M : SingleMessage> testInsideMessageChain(\n        data: M,\n        expectedSerialName: String,\n        expectedInstance: M = data,\n    ) = listOf(dynamicTest(\"testInsideMessageChain\") {\n        val chain = messageChainOf(data)\n\n        val string = chain.serializeToJsonString(format)\n        println(string)\n        val element = format.parseToJsonElement(string).jsonArray.single().jsonObject\n        assertEquals(expectedSerialName, element[\"type\"]?.cast<JsonPrimitive>()?.content)\n\n        assertEquals(\n            expectedInstance,\n            MessageChain.deserializeFromJsonString(string).single()\n        )\n    })\n\n    ///////////////////////////////////////////////////////////////////////////\n    // serialization - contextual\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Serializable\n    data class ContextualWrapper(\n        val message: @Contextual SingleMessage,\n    )\n\n    @Serializable\n    data class GenericTypedWrapper<T : SingleMessage>(\n        val message: T,\n    )\n\n    protected open fun <M : T, T : SingleMessage> testContextual(\n        data: M,\n        expectedSerialName: String,\n        expectedInstance: M = data,\n        targetType: KClass<out T> = data::class,\n    ) = listOf(\n        testContextualWithWrapper<M, T>(data, expectedSerialName, expectedInstance),\n        testContextualWithStaticType(targetType, data, expectedInstance),\n        testContextualGeneric(targetType, data, expectedInstance),\n        testContextualWithoutWrapper<M, T>(data, expectedInstance)\n    ).flatten()\n\n    private fun <M : T, T : SingleMessage> testContextualWithoutWrapper(\n        data: M,\n        expectedInstance: M\n    ) = listOf(dynamicTest(\"testContextualWithoutWrapper\") {\n        @Suppress(\"UNCHECKED_CAST\")\n        val serializer = ContextualSerializer(data::class) as KSerializer<M>\n        val string = format.encodeToString(serializer, data)\n        println(string)\n        val element = format.parseToJsonElement(string).jsonObject\n        assertEquals(null, element[\"type\"])\n\n        assertEquals(\n            expectedInstance,\n            format.decodeFromString(serializer, string)\n        )\n    })\n\n    private fun <M : T, T : SingleMessage> testContextualGeneric(\n        targetType: KClass<out T>,\n        data: M,\n        expectedInstance: M\n    ) = listOf(dynamicTest(\"testContextualGeneric\") {\n        val messageSerializer: ContextualSerializer<SingleMessage> = ContextualSerializer(targetType).cast()\n\n        /**\n         * ```\n         * data class StaticTypedWrapper(\n         *     val message: T\n         * )\n         * ```\n         * without concern of generic types.\n         */\n        /**\n         * ```\n         * data class StaticTypedWrapper(\n         *     val message: T\n         * )\n         * ```\n         * without concern of generic types.\n         */\n        val serializer = GenericTypedWrapper.serializer(messageSerializer)\n\n        val string = format.encodeToString(serializer, GenericTypedWrapper(data))\n        println(string)\n        val element = format.parseToJsonElement(string).jsonObject[\"message\"]!!.jsonObject\n\n        assertEquals(null, element[\"type\"]?.jsonPrimitive?.content)\n\n        assertEquals(\n            expectedInstance,\n            format.decodeFromString(serializer, string).message\n        )\n    })\n\n    private fun <M : T, T : SingleMessage> testContextualWithStaticType(\n        targetType: KClass<out T>,\n        data: M,\n        expectedInstance: M,\n    ) = listOf(dynamicTest(\"testContextualWithStaticType\") {\n        val messageSerializer: ContextualSerializer<SingleMessage> = ContextualSerializer(targetType).cast()\n\n        /**\n         * ```\n         * data class StaticTypedWrapper(\n         *     val message: T\n         * )\n         * ```\n         * without concern of generic types.\n         */\n        /**\n         * ```\n         * data class StaticTypedWrapper(\n         *     val message: T\n         * )\n         * ```\n         * without concern of generic types.\n         */\n        val serializer = object : KSerializer<SingleMessage> {\n            override val descriptor: SerialDescriptor = buildClassSerialDescriptor(\"StaticTypedWrapper\") {\n                element(\"message\", messageSerializer.descriptor, listOf(Contextual()))\n            }\n\n            override fun deserialize(decoder: Decoder): SingleMessage {\n                return decoder.decodeStructure(descriptor) {\n                    if (this.decodeSequentially()) {\n                        this.decodeSerializableElement(\n                            descriptor.getElementDescriptor(0),\n                            0,\n                            messageSerializer\n                        )\n                    } else {\n                        val index = this.decodeElementIndex(descriptor)\n                        check(index == 0)\n                        this.decodeSerializableElement(descriptor, index, messageSerializer)\n                    }\n                }\n            }\n\n            override fun serialize(encoder: Encoder, value: SingleMessage) {\n                encoder.encodeStructure(descriptor) {\n                    encodeSerializableElement(descriptor, 0, messageSerializer, value)\n                }\n            }\n        }\n\n        val string = format.encodeToString(serializer, data)\n        println(string)\n        val element = format.parseToJsonElement(string).jsonObject[\"message\"]!!.jsonObject\n\n        assertEquals(null, element[\"type\"]?.jsonPrimitive?.content)\n\n        assertEquals(\n            expectedInstance,\n            format.decodeFromString(serializer, string)\n        )\n    })\n\n    private fun <M : T, T : SingleMessage> testContextualWithWrapper(\n        data: M,\n        expectedSerialName: String,\n        expectedInstance: M,\n        afterSerialization: (element: JsonObject) -> Unit = {}\n    ) = listOf(dynamicTest(\"testContextualWithWrapper\") {\n        val string = format.encodeToString(ContextualWrapper.serializer(), ContextualWrapper(data))\n        println(string)\n        val element = format.parseToJsonElement(string).jsonObject[\"message\"]!!.jsonObject\n        afterSerialization(element)\n\n        assertEquals(expectedSerialName, element[\"type\"]?.jsonPrimitive?.content)\n\n        assertEquals(\n            expectedInstance,\n            format.decodeFromString(ContextualWrapper.serializer(), string).message\n        )\n    })\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/protocol/impl/CustomMessageProtocolTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.message.data.CustomMessage\nimport net.mamoe.mirai.message.data.CustomMessageMetadata\nimport net.mamoe.mirai.utils.hexToBytes\nimport kotlin.test.BeforeTest\nimport kotlin.test.Test\n\ninternal class CustomMessageProtocolTest : AbstractMessageProtocolTest() {\n    override val protocols: Array<out MessageProtocol> = arrayOf(CustomMessageProtocol(), TextProtocol())\n\n    @BeforeTest\n    fun `init group`() {\n        defaultTarget = bot.addGroup(123, 1230003).apply {\n            addMember(1230003, \"user3\", MemberPermission.OWNER)\n        }\n    }\n\n    @BeforeTest\n    fun init() {\n        MyCustomMessage(1) // register\n    }\n\n    @Serializable\n    class MyCustomMessage(\n        val int: Int,\n    ) : CustomMessageMetadata(), ProtoBuf {\n        override fun getFactory(): Factory = Factory\n\n        object Factory : CustomMessage.Factory<MyCustomMessage>(\"MyCustomMessage\") {\n            override fun dump(message: MyCustomMessage): ByteArray {\n                return message.toByteArray(serializer())\n            }\n\n            override fun load(input: ByteArray): MyCustomMessage {\n                return input.loadAs(serializer())\n            }\n        }\n    }\n\n    @Test\n    fun `test encode`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    customElem = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.CustomElem(\n                        data = \"00 00 00 17 08 01 12 0F 4D 79 43 75 73 74 6F 6D 4D 65 73 73 61 67 65 1A 02 08 01\".hexToBytes(),\n                        enumType = 103904510,\n                    ),\n                )\n            )\n            message(MyCustomMessage(1))\n        }.doEncoderChecks()\n    }\n\n    @Test\n    fun `test decode`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    customElem = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.CustomElem(\n                        data = \"00 00 00 17 08 01 12 0F 4D 79 43 75 73 74 6F 6D 4D 65 73 73 61 67 65 1A 02 08 01\".hexToBytes(),\n                        enumType = 103904510,\n                    ),\n                )\n            )\n            message(MyCustomMessage(1))\n        }.doEncoderChecks()\n    }\n\n// not supported, see https://github.com/mamoe/mirai/issues/2144\n//    @TestFactory\n//    fun `test serialization`(): DynamicTestsResult {\n//        val data = MyCustomMessage(1)\n//        val serialName = \"CustomMessage\"\n//        return runDynamicTests(\n//            testPolymorphicInMessageMetadata(data, serialName),\n//            testPolymorphicInSingleMessage(data, serialName),\n//            testInsideMessageChain(data, serialName),\n//            testContextual(data),\n//        )\n//    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/protocol/impl/EqualityAsserter.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.json.Json\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.message.MessageSerializers\nimport net.mamoe.mirai.message.data.MessageChain.Companion.serializeToJsonString\nimport net.mamoe.mirai.message.data.SingleMessage\nimport net.mamoe.mirai.message.data.messageChainOf\nimport net.mamoe.mirai.utils.structureToStringIfAvailable\nimport kotlin.test.assertNotNull\nimport kotlin.test.asserter\n\ninternal interface EqualityAsserter {\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n    fun <@kotlin.internal.OnlyInputTypes T> assertEquals(\n        expected: List<T>,\n        actual: List<T>,\n        message: String? = null\n    )\n\n    object Ordinary : EqualityAsserter {\n        override fun <T> assertEquals(expected: List<T>, actual: List<T>, message: String?) {\n            if (expected.size == actual.size) {\n                if (expected.size == 1 && expected.singleOrNull() == actual.singleOrNull()) {\n                    return asserter.assertEquals(message, expected.single(), actual.single())\n                }\n\n                if (expected.zip(actual).all { (e, a) -> e == a }) return\n\n                asserter.assertEquals(message, expected, actual)\n            } else {\n                asserter.assertEquals(message, expected, actual)\n            }\n        }\n    }\n\n    object Structural : EqualityAsserter {\n        override fun <T> assertEquals(expected: List<T>, actual: List<T>, message: String?) {\n            if (expected.size == 1 && actual.size == 1) {\n                val e = expected.single()\n                val a = actual.single()\n                if (a == null || e == null) {\n                    asserter.assertEquals(\n                        \"[Null] $message\",\n                        structureToStringOrOrdinaryString(e),\n                        structureToStringOrOrdinaryString(a)\n                    )\n                    assertNotNull(a, message)\n                    assertNotNull(e, message)\n                }\n                @Suppress(\"UNNECESSARY_NOT_NULL_ASSERTION\")\n                if (!e!!::class.isInstance(a) && !a!!::class.isInstance(e)) {\n                    asserter.assertEquals(\n                        \"[Incompatible type] $message\",\n                        structureToStringOrOrdinaryString(e),\n                        structureToStringOrOrdinaryString(a)\n                    )\n                    return\n                }\n                asserter.assertEquals(\n                    message,\n                    structureToStringOrOrdinaryString(e),\n                    structureToStringOrOrdinaryString(a)\n                )\n            } else {\n                asserter.assertEquals(\n                    message,\n                    expected.joinToString { structureToStringOrOrdinaryString(it) },\n                    actual.joinToString { structureToStringOrOrdinaryString(it) })\n            }\n        }\n\n        private val json = Json {\n            isLenient = true\n            prettyPrint = true\n            serializersModule = MessageSerializers.serializersModule\n        }\n\n        private fun <T> structureToStringOrOrdinaryString(value: T): String {\n            if (value == null) return \"null\"\n            val valueNotNull: T & Any = value\n            @Suppress(\"UNCHECKED_CAST\")\n            return valueNotNull.structureToStringIfAvailable()\n            // fallback for native\n                ?: kotlin.run {\n                    if (valueNotNull is SingleMessage) {\n                        messageChainOf(valueNotNull).serializeToJsonString(json) // use the stable serialization approach\n                    } else json.encodeToString(\n                        when (valueNotNull) {\n                            is ImMsgBody.Elem -> ImMsgBody.Elem.serializer()\n                            else -> error(\"Unsupported type: $valueNotNull\")\n                        } as KSerializer<Any>, valueNotNull\n                    )\n                }\n        }\n    }\n\n    object OrdinaryThenStructural : EqualityAsserter {\n        override fun <T> assertEquals(expected: List<T>, actual: List<T>, message: String?) {\n            try {\n                Ordinary.assertEquals(expected, actual, message)\n                return\n            } catch (e: AssertionError) {\n                Structural.assertEquals(expected, actual, message)\n                return\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/protocol/impl/FaceProtocolTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.decodeAndRefineLight\nimport net.mamoe.mirai.internal.testFramework.DynamicTestsResult\nimport net.mamoe.mirai.internal.testFramework.TestFactory\nimport net.mamoe.mirai.internal.testFramework.runDynamicTests\nimport net.mamoe.mirai.message.data.Face\nimport net.mamoe.mirai.message.data.MessageSourceKind\nimport net.mamoe.mirai.message.data.messageChainOf\nimport net.mamoe.mirai.utils.hexToBytes\nimport kotlin.test.Test\n\ninternal class FaceProtocolTest : AbstractMessageProtocolTest() {\n    override val protocols: Array<out MessageProtocol> = arrayOf(FaceProtocol())\n\n    @Test\n    fun `can encode`() {\n        doEncoderChecks(\n            net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                face = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Face(\n                    index = 1,\n                    old = \"14 42\".hexToBytes(),\n                    buf = \"00 01 00 04 52 CC F5 D0\".hexToBytes(),\n                ),\n            ),\n        ) {\n            encode(\n                messageChainOf(Face(Face.PIE_ZUI)),\n                messageTarget = null, withGeneralFlags = true, isForward = false\n            )\n        }\n    }\n\n    @Test\n    fun `can decode`() {\n        doDecoderChecks(\n            messageChainOf(Face(Face.YIN_XIAN)),\n        ) {\n            decodeAndRefineLight(\n                listOf(\n                    net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                        face = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Face(\n                            index = 108,\n                            old = \"14 AD\".hexToBytes(),\n                        ),\n                    )\n                ),\n                groupIdOrZero = 0,\n                MessageSourceKind.GROUP,\n                bot,\n            )\n        }\n\n    }\n\n    @TestFactory\n    fun `test serialization`(): DynamicTestsResult {\n        val data = Face(1)\n        val serialName = Face.SERIAL_NAME\n        return runDynamicTests(\n            testPolymorphicInMessageContent(data, serialName),\n            testPolymorphicInSingleMessage(data, serialName),\n            testInsideMessageChain(data, serialName),\n            testContextual(data, serialName),\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/protocol/impl/FileMessageProtocolTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.internal.message.flags.AllowSendFileMessage\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.testFramework.DynamicTestsResult\nimport net.mamoe.mirai.internal.testFramework.TestFactory\nimport net.mamoe.mirai.internal.testFramework.runDynamicTests\nimport net.mamoe.mirai.message.data.FileMessage\nimport net.mamoe.mirai.message.data.toMessageChain\nimport net.mamoe.mirai.utils.hexToBytes\nimport kotlin.test.BeforeTest\nimport kotlin.test.Test\nimport kotlin.test.assertFailsWith\n\ninternal class FileMessageProtocolTest : AbstractMessageProtocolTest() {\n    override val protocols: Array<out MessageProtocol> = arrayOf(FileMessageProtocol(), TextProtocol())\n\n    @BeforeTest\n    fun `init group`() {\n        defaultTarget = bot.addGroup(123, 1230003).apply {\n            addMember(1230003, \"user3\", MemberPermission.OWNER)\n        }\n    }\n\n    @Test\n    fun `test decode`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    elemFlags2 = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.ElemFlags2(\n                        compatibleId = 1,\n                        msgRptCnt = 1,\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    transElemInfo = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.TransElem(\n                        elemType = 24,\n                        elemValue = \"01 00 7A 08 06 12 0C 73 65 73 73 69 6F 6E 2E 6C 6F 63 6B 1A 05 38 42 79 74 65 3A 61 12 5F 08 66 12 25 2F 38 34 33 35 32 37 64 38 2D 64 39 31 35 2D 31 31 65 63 2D 62 32 34 30 2D 35 34 35 32 30 30 37 62 64 61 61 34 18 08 22 0C 73 65 73 73 69 6F 6E 2E 6C 6F 63 6B 28 00 3A 00 42 20 39 30 33 65 39 36 34 35 36 38 38 62 63 62 32 35 35 64 30 36 64 31 64 61 31 35 33 66 64 36 32 64\".hexToBytes(),\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    generalFlags = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.GeneralFlags(\n                        glamourLevel = 3,\n                        pbReserve = \"08 0A 78 00 C8 01 00 F0 01 00 F8 01 00 90 02 00 98 03 00 A0 03 20 B0 03 00 C0 03 00 D0 03 00 E8 03 00 8A 04 02 10 0B 90 04 80 01 B8 04 02 C0 04 01 CA 04 00 F8 04 00 88 05 00\".hexToBytes(),\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    extraInfo = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.ExtraInfo(\n                        nick = \"Nick\",\n                        level = 1,\n                        flags = 8,\n                        groupMask = 1,\n                    ),\n                )\n            )\n            message(FileMessage(\"/843527d8-d915-11ec-b240-5452007bdaa4\", 102, \"session.lock\", 8))\n            useOrdinaryEquality()\n        }.doDecoderChecks()\n    }\n\n    @TestFactory\n    fun `test serialization`(): DynamicTestsResult {\n        val data = FileMessage(\"id\", 1, \"name\", 2)\n        val serialName = FileMessage.SERIAL_NAME\n        return runDynamicTests(\n            testPolymorphicInMessageContent(data, serialName),\n            testPolymorphicInSingleMessage(data, serialName),\n            testInsideMessageChain(data, serialName),\n            testContextual(data, serialName),\n        )\n    }\n\n    @Test\n    fun `test manual send forbidden`() {\n        val data = FileMessage(\"id\", 1, \"name\", 2)\n        assertFailsWith<IllegalStateException> {\n            FileMessageProtocol.verifyFileMessage(data.toMessageChain())\n        }\n    }\n\n    @Test\n    fun `test auto send allowed`() {\n        val data = FileMessage(\"id\", 1, \"name\", 2)\n        FileMessageProtocol.verifyFileMessage(AllowSendFileMessage + data)\n    }\n\n    @Test\n    fun `test auto send allowed2`() {\n        val data = FileMessage(\"id\", 1, \"name\", 2)\n        FileMessageProtocol.verifyFileMessage(data + AllowSendFileMessage)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/protocol/impl/ForwardMessageProtocolTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.internal.message.LightMessageRefiner.dropMiraiInternalFlags\nimport net.mamoe.mirai.internal.message.data.ForwardMessageInternal\nimport net.mamoe.mirai.internal.message.flags.IgnoreLengthCheck\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.testFramework.DynamicTestsResult\nimport net.mamoe.mirai.internal.testFramework.TestFactory\nimport net.mamoe.mirai.internal.testFramework.runDynamicTests\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.cast\nimport net.mamoe.mirai.utils.castUp\nimport net.mamoe.mirai.utils.getRandomString\nimport kotlin.random.Random\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class ForwardMessageProtocolTest : AbstractMessageProtocolTest() {\n    override val protocols: Array<out MessageProtocol> =\n        arrayOf(\n            TextProtocol(),\n            ImageProtocol(),\n            ForwardMessageProtocol(),\n            GeneralMessageSenderProtocol(),\n        )\n\n    init {\n        defaultTarget = bot.addGroup(123, 1230003).apply {\n            addMember(1230003, \"user3\", MemberPermission.OWNER)\n        }\n    }\n\n    @Test\n    fun precondition() {\n        assertEquals(getRandomString(5000, Random(1)), getRandomString(5000, Random(1)))\n        assertMessageEquals(\n            \"test\".toPlainText() + getRandomString(5000, Random(1)) +\n                    Image(\"{40A7C56B-45C9-23AE-0CFA-23F095B71035}.jpg\").repeat(200),\n            \"test\".toPlainText() + getRandomString(5000, Random(1)) +\n                    Image(\"{40A7C56B-45C9-23AE-0CFA-23F095B71035}.jpg\").repeat(200)\n        )\n    }\n\n    @Test\n    fun `can convert ForwardMessage to ForwardMessageInternal`() {\n        var message = buildForwardMessage(defaultTarget.cast()) {\n            currentTime = 16000000\n            1 named \"Name1\" says \"Hello\"\n        }.toMessageChain()\n\n        message += IgnoreLengthCheck\n\n        runWithFacade {\n            preprocessAndSendOutgoingImpl(defaultTarget.castUp(), message, components).let { (context, receipts) ->\n                val receipt = receipts.single()\n                assertMessageEquals(message.dropMiraiInternalFlags(), receipt.source.originalMessage)\n\n                assertMessageEquals(\n                    ForwardMessageInternal(\n                        \"\"\"<?xml version=\"1.0\" encoding=\"utf-8\"?> <msg serviceID=\"35\" templateID=\"1\" action=\"viewMultiMsg\" brief=\"[聊天记录]\"      m_resid=\"(size=1)501389E3070B20D87A80A67961F4EA0E\" m_fileName=\"160023\"      tSum=\"3\" sourceMsgId=\"0\" url=\"\" flag=\"3\" adverSign=\"0\" multiMsgFlag=\"0\">     <item layout=\"1\" advertiser_id=\"0\" aid=\"0\">         <title size=\"34\" maxLines=\"2\" lineSpace=\"12\">群聊的聊天记录</title>         <title size=\"26\" color=\"#777777\" maxLines=\"2\" lineSpace=\"12\">Name1: Hello</title>         <hr hidden=\"false\" style=\"0\"/>         <summary size=\"26\" color=\"#777777\">查看1条转发消息</summary>     </item>     <source name=\"聊天记录\" icon=\"\" action=\"\" appid=\"-1\"/> </msg>\"\"\",\n                        \"(size=1)501389E3070B20D87A80A67961F4EA0E\",\n                        null,\n                        origin = message[ForwardMessage]\n                    ) + IgnoreLengthCheck, context.currentMessageChain\n                )\n            }\n        }\n    }\n\n    @Test\n    fun `can convert empty ForwardMessage`() {\n        val message = buildForwardMessage(defaultTarget.cast()) {}.toMessageChain()\n\n        runWithFacade {\n            preprocessAndSendOutgoingImpl(defaultTarget.castUp(), message, components).let { (context, receipts) ->\n                val receipt = receipts.single()\n                assertMessageEquals(message.dropMiraiInternalFlags(), receipt.source.originalMessage)\n\n                assertMessageEquals(\n                    ForwardMessageInternal(\n                        \"\"\"<?xml version=\"1.0\" encoding=\"utf-8\"?> <msg serviceID=\"35\" templateID=\"1\" action=\"viewMultiMsg\" brief=\"[聊天记录]\"      m_resid=\"(size=0)D41D8CD98F00B204E9800998ECF8427E\" m_fileName=\"160023\"      tSum=\"3\" sourceMsgId=\"0\" url=\"\" flag=\"3\" adverSign=\"0\" multiMsgFlag=\"0\">     <item layout=\"1\" advertiser_id=\"0\" aid=\"0\">         <title size=\"34\" maxLines=\"2\" lineSpace=\"12\">群聊的聊天记录</title>                  <hr hidden=\"false\" style=\"0\"/>         <summary size=\"26\" color=\"#777777\">查看0条转发消息</summary>     </item>     <source name=\"聊天记录\" icon=\"\" action=\"\" appid=\"-1\"/> </msg>\"\"\",\n                        \"(size=0)D41D8CD98F00B204E9800998ECF8427E\",\n                        null,\n                        origin = message[ForwardMessage]\n                    ), context.currentMessageChain\n                )\n            }\n        }\n    }\n\n    // // TODO: 2022/5/23 test for download ForwardMessage\n//    @Test\n//    fun `can receive and download ForwardMessage`() {\n//        val message = runTest {\n//            runWithFacade {\n//                net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.Msg(\n//                    msgHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.MsgHead(\n//                        fromUin = 1230001,\n//                        toUin = 1230002,\n//                        msgType = 166,\n//                        c2cCmd = 11,\n//                        msgSeq = 34437,\n//                        msgTime = 1653334690,\n//                        msgUid = 72057594524997436,\n//                        wseqInC2cMsghead = 34437,\n//                    ),\n//                    msgBody = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MsgBody(\n//                        richText = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.RichText(\n//                            attr = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Attr(\n//                                codePage = 0,\n//                                time = 1653334690,\n//                                random = 487069500,\n//                                effect = 0,\n//                                charSet = 134,\n//                                pitchAndFamily = 2,\n//                                fontName = \"宋体\",\n//                            ),\n//                            elems = mutableListOf(\n//                                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n//                                    richMsg = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.RichMsg(\n//                                        template1 = \"01 78 9C B5 92 4F 6F D3 30 18 C6 BF 8A 65 0E 39 4C 23 4D FA 2F A0 38 53 B7 29 EB D8 12 89 65 45 FC 11 9A DC C4 C9 2C D9 49 65 3B DD DA DB 24 0E 08 0E 88 03 17 04 42 48 70 40 42 C0 89 DB 3E 4E BB 7E 0C 1C 77 12 E3 80 C4 85 F8 10 47 AF F3 F3 F3 3C EF EB 6F 9D 73 06 A6 44 48 5A 95 C8 72 6E B7 2C 40 CA B4 CA 68 59 20 6B 74 1C 6E 7A 16 90 0A 97 19 66 55 49 90 35 23 D2 02 5B 81 CF 65 01 24 11 53 9A 92 FD 5D 04 DB 5D 08 14 E1 13 86 95 F9 76 20 C0 A9 6A 98 70 4A C9 59 54 33 45 23 59 40 30 16 94 E4 08 3E 59 5D BC 58 7C FA B2 FA F6 63 71 F9 E6 29 04 FC 44 10 49 33 04 C7 C7 E1 91 3C 4C F2 78 F4 28 89 C2 68 7B 63 E0 B9 03 B1 71 FF E1 78 87 1E A4 C5 38 8E 6B 6F 6F BB FF 60 CF 3E 9A 77 0E 1E C7 C3 D1 4E 31 BC 37 8F C2 DD 3C 12 83 44 34 A8 9C 32 12 63 4E 10 EC 3B 2D BD BC 8E 73 C7 E9 BA 1D A7 D7 ED 35 3A 93 9A 23 E8 42 20 AB 5A A4 44 CB DA D7 17 B7 20 A8 05 43 10 82 9C E1 42 3B D2 0E 32 1D 4C 42 8B D2 54 F9 B5 87 D0 94 5B 30 F0 A9 76 0C 18 9E 55 B5 5A 3B 6E CE 2B AA 63 39 A1 6B 22 5E BF 03 5F 51 C5 08 90 74 AE 45 B5 3B 1A 86 CF 0F 69 49 A4 D1 C1 F4 2E 99 E0 54 D7 1C 17 06 43 CA 1D CF E3 15 B9 7A FB EC 66 4C BE 6D 28 7F C2 DC 1E 04 69 C5 2A 81 E0 AD BE 79 FE 11 7E 17 80 FC 2C A3 ED FF 4C 3D 15 E0 94 66 19 D1 19 E6 98 49 A2 53 57 33 46 4C 3A 76 E0 CB 9A 73 2C 66 7F BF 36 58 7E F8 7C F5 EE A5 BB 7C FF 71 75 F9 75 F1 EA F5 F2 E7 F3 E5 C5 77 DF BE FE 33 F0 ED A6 0D 9A 64 9A 09 4A D3 F7 9B B1 41 40 D3 66 0E 7F 4F A4 DE 4D 26 4D 67 36 1D 23 C2 D6 C3 1C FC 02 21 C3 0A 7E\".hexToBytes(),\n//                                        serviceId = 35,\n//                                    ),\n//                                ),\n//                                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n//                                    generalFlags = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.GeneralFlags(\n//                                        pbReserve = \"78 00 C8 01 00 F0 01 00 F8 01 00 90 02 00 C8 02 00 CA 04 00 D2 05 02 08 6A\".hexToBytes(),\n//                                    ),\n//                                ),\n//                                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n//                                ),\n//                            ),\n//                        ),\n//                    ),\n//                ).toMessageChainOnline(bot, facade = this)\n//            }\n//        }\n//    }\n\n    @TestFactory\n    fun `test serialization`(): DynamicTestsResult {\n        val data = buildForwardMessage(defaultTarget.castUp()) {\n            add(1, \"senderName\", time = 123, message = PlainText(\"simple text\"))\n            add(1, \"senderName\", time = 123) {\n                +PlainText(\"simple\")\n                +Face(1)\n                +Image(\"{90CCED1C-2D64-313B-5D66-46625CAB31D7}.jpg\")\n            }\n        }\n        val serialName = ForwardMessage.SERIAL_NAME\n        return runDynamicTests(\n            testPolymorphicInMessageContent(data, serialName),\n            testPolymorphicInSingleMessage(data, serialName),\n            testInsideMessageChain(data, serialName),\n            testContextual(data, serialName),\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/protocol/impl/GeneralMessageSenderProtocolTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(TestOnly::class)\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport kotlinx.coroutines.Deferred\nimport net.mamoe.mirai.internal.AbstractBot\nimport net.mamoe.mirai.internal.contact.AbstractContact\nimport net.mamoe.mirai.internal.message.LightMessageRefiner.dropMiraiInternalFlags\nimport net.mamoe.mirai.internal.message.flags.ForceAsFragmentedMessage\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.outgoing.MessageProtocolStrategy\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.receive.MessageSvcPbSendMsg\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.OnlineMessageSource\nimport net.mamoe.mirai.message.data.PlainText\nimport net.mamoe.mirai.message.data.messageChainOf\nimport net.mamoe.mirai.utils.TestOnly\nimport net.mamoe.mirai.utils.castUp\nimport kotlin.test.Test\nimport kotlin.test.assertFalse\nimport kotlin.test.assertTrue\n\ninternal class GeneralMessageSenderProtocolTest : AbstractMessageProtocolTest() {\n    override val protocols: Array<out MessageProtocol> = arrayOf(TextProtocol(), GeneralMessageSenderProtocol())\n\n    @Test\n    fun `can convert messages failed to send to fragmented`() {\n        val message = messageChainOf(PlainText(\"test\"), PlainText(\"test\"))\n\n        runWithFacade {\n            components[MessageProtocolStrategy] = object : TestMessageProtocolStrategy() {\n                var count = 0\n                override suspend fun sendPacket(bot: AbstractBot, packet: OutgoingPacket): Packet {\n                    println(\"MessageProtocolStrategy.sendPacket called: $count\")\n                    if (count++ <= 1) { // fail the first and second attempt\n                        return MessageSvcPbSendMsg.Response.MessageTooLarge\n                    }\n                    return super.sendPacket(bot, packet)\n                }\n\n                override suspend fun createPacketsForGeneralMessage(\n                    client: QQAndroidClient,\n                    contact: AbstractContact,\n                    message: MessageChain,\n                    originalMessage: MessageChain,\n                    fragmented: Boolean,\n                    sourceCallback: (Deferred<OnlineMessageSource.Outgoing>) -> Unit\n                ): List<OutgoingPacket> {\n                    if (count == 2) {\n                        assertTrue { fragmented }\n                    } else {\n                        assertFalse { fragmented }\n                    }\n                    return super.createPacketsForGeneralMessage(\n                        client,\n                        contact,\n                        message,\n                        originalMessage,\n                        fragmented,\n                        sourceCallback\n                    )\n                }\n            }\n            preprocessAndSendOutgoingImpl(defaultTarget.castUp(), message, components).let { (context, receipts) ->\n                val receipt = receipts.single()\n                assertMessageEquals(message.dropMiraiInternalFlags(), receipt.source.originalMessage)\n                assertMessageEquals(message.dropMiraiInternalFlags(), context.currentMessageChain)\n            }\n        }\n    }\n\n    @Test\n    fun `can convert messages to fragmented`() {\n        val message = messageChainOf(PlainText(\"test\"), PlainText(\"test\"), ForceAsFragmentedMessage)\n\n        runWithFacade {\n            components[MessageProtocolStrategy] = object : TestMessageProtocolStrategy() {\n                override suspend fun createPacketsForGeneralMessage(\n                    client: QQAndroidClient,\n                    contact: AbstractContact,\n                    message: MessageChain,\n                    originalMessage: MessageChain,\n                    fragmented: Boolean,\n                    sourceCallback: (Deferred<OnlineMessageSource.Outgoing>) -> Unit\n                ): List<OutgoingPacket> {\n                    assertTrue { fragmented }\n                    return super.createPacketsForGeneralMessage(\n                        client,\n                        contact,\n                        message,\n                        originalMessage,\n                        fragmented,\n                        sourceCallback\n                    )\n                }\n            }\n            preprocessAndSendOutgoingImpl(defaultTarget.castUp(), message, components).let { (context, receipts) ->\n                val receipt = receipts.single()\n                assertMessageEquals(message.dropMiraiInternalFlags(), receipt.source.originalMessage)\n                assertMessageEquals(message, context.currentMessageChain)\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/protocol/impl/ImageProtocolTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.Polymorphic\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.internal.message.image.OfflineFriendImage\nimport net.mamoe.mirai.internal.message.image.OfflineGroupImage\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.testFramework.DynamicTestsResult\nimport net.mamoe.mirai.internal.testFramework.TestFactory\nimport net.mamoe.mirai.internal.testFramework.dynamicTest\nimport net.mamoe.mirai.internal.testFramework.runDynamicTests\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.message.data.ImageType\nimport net.mamoe.mirai.utils.hexToBytes\nimport kotlin.test.BeforeTest\nimport kotlin.test.Test\nimport kotlin.test.assertIs\n\ninternal class ImageProtocolTest : AbstractMessageProtocolTest() {\n    override val protocols: Array<out MessageProtocol> = arrayOf(ImageProtocol())\n\n    @BeforeTest\n    fun `init group`() {\n        defaultTarget = bot.addGroup(123, 1230003).apply {\n            addMember(1230003, \"user3\", MemberPermission.OWNER)\n        }\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // receive from macOS client\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Test\n    fun `group Image receive from macOS`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    customFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.CustomFace(\n                        filePath = \"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\",\n                        fileId = -1866484636,\n                        useful = 1,\n                        picMd5 = \"A7 CB B5 29 43 A2 12 7C E4 26 59 D2 9B AA 85 15\".hexToBytes(),\n                        thumbUrl = \"/gchatpic_new/123456/12345678-2428482660-A7CBB52943A2127CE42659D29BAA8515/198?term=2\",\n                        origUrl = \"/gchatpic_new/123456/12345678-2428482660-A7CBB52943A2127CE42659D29BAA8515/0?term=2\",\n                        width = 904,\n                        height = 1214,\n                        size = 170426,\n                        thumbWidth = 147,\n                        thumbHeight = 198,\n                        _400Url = \"/gchatpic_new/123456/12345678-2428482660-A7CBB52943A2127CE42659D29BAA8515/400?term=2\",\n                        _400Width = 285,\n                        _400Height = 384,\n                    ),\n                )\n            )\n            message(Image(\"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\") {\n                width = 904\n                height = 1214\n                size = 170426\n                type = ImageType.JPG\n                isEmoji = false\n            })\n            targetGroup()\n            useOrdinaryEquality()\n        }.doDecoderChecks()\n    }\n\n    @Test\n    fun `friend Image receive from macOS`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    notOnlineImage = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.NotOnlineImage(\n                        filePath = \"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\",\n                        fileLen = 170426,\n                        downloadPath = \"/123456-306012740-A7CBB52943A2127CE42659D29BAA8515\",\n                        oldVerSendFile = \"16 20 31 32 32 31 30 31 31 31 31 41 42 20 20 20 20 31 37 30 34 32 36 6B 7B 41 37 43 42 42 35 32 39 2D 34 33 41 32 2D 31 32 37 43 2D 45 34 32 36 2D 35 39 44 32 39 42 41 41 38 35 31 35 7D 2E 6A 70 67 77 2F 31 30 34 30 34 30 30 32 39 30 2D 33 30 36 30 31 32 37 34 30 2D 41 37 43 42 42 35 32 39 34 33 41 32 31 32 37 43 45 34 32 36 35 39 44 32 39 42 41 41 38 35 31 35 41\".hexToBytes(),\n                        picMd5 = \"A7 CB B5 29 43 A2 12 7C E4 26 59 D2 9B AA 85 15\".hexToBytes(),\n                        picHeight = 1214,\n                        picWidth = 904,\n                        resId = \"/123456-306012740-A7CBB52943A2127CE42659D29BAA8515\",\n                        thumbUrl = \"/offpic_new/123456//123456-306012740-A7CBB52943A2127CE42659D29BAA8515/198?term=2\",\n                        origUrl = \"/offpic_new/123456//123456-306012740-A7CBB52943A2127CE42659D29BAA8515/0?term=2\",\n                        thumbWidth = 147,\n                        thumbHeight = 198,\n                        _400Url = \"/offpic_new/123456//123456-306012740-A7CBB52943A2127CE42659D29BAA8515/400?term=2\",\n                        _400Width = 285,\n                        _400Height = 384,\n                    ),\n                )\n            )\n            message(Image(\"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\") {\n                width = 904\n                height = 1214\n                size = 170426\n                type = ImageType.JPG\n                isEmoji = false\n            })\n            targetFriend()\n        }.doDecoderChecks()\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // receive from Android\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Test\n    fun `group Image receive from Android`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    customFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.CustomFace(\n                        filePath = \"A7CBB52943A2127CE42659D29BAA8515.jpg\",\n                        oldData = \"15 36 20 38 36 65 41 31 42 61 66 34 35 64 37 38 63 36 66 31 65 39 30 33 66 20 20 20 20 20 20 35 30 57 4A 4B 53 53 71 52 79 61 52 46 42 7A 77 38 34 41 37 43 42 42 35 32 39 34 33 41 32 31 32 37 43 45 34 32 36 35 39 44 32 39 42 41 41 38 35 31 35 2E 6A 70 67 41\".hexToBytes(),\n                        fileId = -1354377332,\n                        serverIp = 1864273983,\n                        serverPort = 80,\n                        fileType = 66,\n                        signature = \"WJKSSqRyaRFBzw84\".toByteArray(), /* 57 4A 4B 53 53 71 52 79 61 52 46 42 7A 77 38 34 */\n                        useful = 1,\n                        picMd5 = \"A7 CB B5 29 43 A2 12 7C E4 26 59 D2 9B AA 85 15\".hexToBytes(),\n                        thumbUrl = \"/gchatpic_new/123456/622457678-2940589964-A7CBB52943A2127CE42659D29BAA8515/198?term=2\",\n                        origUrl = \"/gchatpic_new/123456/622457678-2940589964-A7CBB52943A2127CE42659D29BAA8515/0?term=2\",\n                        imageType = 1000,\n                        width = 904,\n                        height = 1214,\n                        source = 103,\n                        size = 170426,\n                        thumbWidth = 147,\n                        thumbHeight = 198,\n                        _400Url = \"/gchatpic_new/123456/622457678-2940589964-A7CBB52943A2127CE42659D29BAA8515/400?term=2\",\n                        _400Width = 285,\n                        _400Height = 384,\n                        pbReserve = \"08 01 10 00 32 00 4A 0E 5B E5 8A A8 E7 94 BB E8 A1 A8 E6 83 85 5D 50 00 78 06\".hexToBytes(),\n                    ),\n                )\n            )\n            message(Image(\"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\") {\n                width = 904\n                height = 1214\n                size = 170426\n                type = ImageType.JPG\n                isEmoji = true\n            })\n            targetGroup()\n            useOrdinaryEquality()\n        }.doDecoderChecks()\n    }\n\n    @Test\n    fun `friend Image receive from Android`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    notOnlineImage = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.NotOnlineImage(\n                        filePath = \"A7CBB52943A2127CE42659D29BAA8515.jpg\",\n                        fileLen = 170426,\n                        downloadPath = \"/123456-113241016-A7CBB52943A2127CE42659D29BAA8515\",\n                        oldVerSendFile = \"16 20 31 31 36 31 30 31 30 35 31 41 42 20 20 20 20 31 37 30 34 32 36 65 41 37 43 42 42 35 32 39 34 33 41 32 31 32 37 43 45 34 32 36 35 39 44 32 39 42 41 41 38 35 31 35 2E 6A 70 67 77 2F 31 30 34 30 34 30 30 32 39 30 2D 31 31 33 32 34 31 30 31 36 2D 41 37 43 42 42 35 32 39 34 33 41 32 31 32 37 43 45 34 32 36 35 39 44 32 39 42 41 41 38 35 31 35 41\".hexToBytes(),\n                        imgType = 1000,\n                        picMd5 = \"A7 CB B5 29 43 A2 12 7C E4 26 59 D2 9B AA 85 15\".hexToBytes(),\n                        picHeight = 1214,\n                        picWidth = 904,\n                        resId = \"/123456-113241016-A7CBB52943A2127CE42659D29BAA8515\",\n                        thumbUrl = \"/offpic_new/123456//123456-113241016-A7CBB52943A2127CE42659D29BAA8515/198?term=2\",\n                        origUrl = \"/offpic_new/123456//123456-113241016-A7CBB52943A2127CE42659D29BAA8515/0?term=2\",\n                        bizType = 5,\n                        thumbWidth = 147,\n                        thumbHeight = 198,\n                        _400Url = \"/offpic_new/123456//123456-113241016-A7CBB52943A2127CE42659D29BAA8515/400?term=2\",\n                        _400Width = 285,\n                        _400Height = 384,\n                        pbReserve = \"08 01 10 00 32 00 42 0E 5B E5 8A A8 E7 94 BB E8 A1 A8 E6 83 85 5D 50 00 78 06\".hexToBytes(),\n                    ),\n                )\n            )\n            message(Image(\"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\") {\n                width = 904\n                height = 1214\n                size = 170426\n                type = ImageType.JPG\n                isEmoji = true\n            })\n            targetFriend()\n            useOrdinaryEquality()\n        }.doDecoderChecks()\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // receive from iOS\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Test\n    fun `group Image receive from iOS`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    notOnlineImage = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.NotOnlineImage(\n                        filePath = \"C344D6240014DA35BB63A958BC435134.png\",\n                        fileLen = 108536,\n                        downloadPath = \"/123456-346835805-C344D6240014DA35BB63A958BC435134\",\n                        oldVerSendFile = \"16 20 31 31 36 31 30 31 30 35 31 41 42 20 20 20 20 31 30 38 35 33 36 65 43 33 34 34 44 36 32 34 30 30 31 34 44 41 33 35 42 42 36 33 41 39 35 38 42 43 34 33 35 31 33 34 2E 70 6E 67 77 2F 32 36 35 32 33 38 36 32 32 38 2D 33 34 36 38 33 35 38 30 35 2D 43 33 34 34 44 36 32 34 30 30 31 34 44 41 33 35 42 42 36 33 41 39 35 38 42 43 34 33 35 31 33 34 41\".hexToBytes(),\n                        imgType = 1000,\n                        picMd5 = \"C3 44 D6 24 00 14 DA 35 BB 63 A9 58 BC 43 51 34\".hexToBytes(),\n                        picHeight = 1214,\n                        picWidth = 904,\n                        resId = \"/123456-346835805-C344D6240014DA35BB63A958BC435134\",\n                        thumbUrl = \"/offpic_new/123456//123456-346835805-C344D6240014DA35BB63A958BC435134/198?term=2\",\n                        origUrl = \"/offpic_new/123456//123456-346835805-C344D6240014DA35BB63A958BC435134/0?term=2\",\n                        bizType = 4,\n                        thumbWidth = 147,\n                        thumbHeight = 198,\n                        _400Url = \"/offpic_new/123456//123456-346835805-C344D6240014DA35BB63A958BC435134/400?term=2\",\n                        _400Width = 285,\n                        _400Height = 384,\n                        pbReserve = \"08 00 10 00 18 00 50 00 78 04\".hexToBytes(),\n                    ),\n                )\n            )\n            message(Image(\"{C344D624-0014-DA35-BB63-A958BC435134}.jpg\") {\n                width = 904\n                height = 1214\n                size = 108536\n                type = ImageType.JPG\n                isEmoji = false\n            })\n            targetGroup()\n            useOrdinaryEquality()\n        }.doDecoderChecks()\n    }\n\n    @Test\n    fun `friend Image receive from iOS`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    notOnlineImage = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.NotOnlineImage(\n                        filePath = \"C344D6240014DA35BB63A958BC435134.png\",\n                        fileLen = 108536,\n                        downloadPath = \"/123455-346835805-C344D6240014DA35BB63A958BC435134\",\n                        oldVerSendFile = \"16 20 31 31 36 31 30 31 30 35 31 41 42 20 20 20 20 31 30 38 35 33 36 65 43 33 34 34 44 36 32 34 30 30 31 34 44 41 33 35 42 42 36 33 41 39 35 38 42 43 34 33 35 31 33 34 2E 70 6E 67 77 2F 32 36 35 32 33 38 36 32 32 38 2D 33 34 36 38 33 35 38 30 35 2D 43 33 34 34 44 36 32 34 30 30 31 34 44 41 33 35 42 42 36 33 41 39 35 38 42 43 34 33 35 31 33 34 41\".hexToBytes(),\n                        imgType = 1000,\n                        picMd5 = \"C3 44 D6 24 00 14 DA 35 BB 63 A9 58 BC 43 51 34\".hexToBytes(),\n                        picHeight = 1214,\n                        picWidth = 904,\n                        resId = \"/123455-346835805-C344D6240014DA35BB63A958BC435134\",\n                        thumbUrl = \"/offpic_new/123455//123455-346835805-C344D6240014DA35BB63A958BC435134/198?term=2\",\n                        origUrl = \"/offpic_new/123455//123455-346835805-C344D6240014DA35BB63A958BC435134/0?term=2\",\n                        bizType = 4,\n                        thumbWidth = 147,\n                        thumbHeight = 198,\n                        _400Url = \"/offpic_new/123455//123455-346835805-C344D6240014DA35BB63A958BC435134/400?term=2\",\n                        _400Width = 285,\n                        _400Height = 384,\n                        pbReserve = \"08 00 10 00 18 00 50 00 78 04\".hexToBytes(),\n                    ),\n                )\n            )\n            message(Image(\"{C344D624-0014-DA35-BB63-A958BC435134}.jpg\") {\n                width = 904\n                height = 1214\n                size = 108536\n                type = ImageType.JPG\n                isEmoji = false\n            })\n            targetFriend()\n            useOrdinaryEquality()\n        }.doDecoderChecks()\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // receive from Windows\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Test\n    fun `group Image receive from Windows`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    customFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.CustomFace(\n                        filePath = \"{C344D624-0014-DA35-BB63-A958BC435134}.jpg\",\n                        flag = \"00 00 00 00\".hexToBytes(),\n                        oldData = \"15 36 20 39 32 6B 41 31 43 39 32 65 39 64 35 30 64 34 39 38 64 33 33 37 39 20 20 20 20 20 20 35 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7B 43 33 34 34 44 36 32 34 2D 30 30 31 34 2D 44 41 33 35 2D 42 42 36 33 2D 41 39 35 38 42 43 34 33 35 31 33 34 7D 2E 6A 70 67 41\".hexToBytes(),\n                        fileId = -1830169331,\n                        serverIp = 1233990521,\n                        serverPort = 80,\n                        fileType = 67,\n                        useful = 1,\n                        picMd5 = \"C3 44 D6 24 00 14 DA 35 BB 63 A9 58 BC 43 51 34\".hexToBytes(),\n                        thumbUrl = \"/gchatpic_new/123456/123456-2464797965-C344D6240014DA35BB63A958BC435134/198?term=2\",\n                        origUrl = \"/gchatpic_new/123456/123456-2464797965-C344D6240014DA35BB63A958BC435134/0?term=2\",\n                        imageType = 1000,\n                        width = 904,\n                        height = 1214,\n                        size = 108536,\n                        thumbWidth = 147,\n                        thumbHeight = 198,\n                        _400Url = \"/gchatpic_new/123456/123456-2464797965-C344D6240014DA35BB63A958BC435134/400?term=2\",\n                        _400Width = 285,\n                        _400Height = 384,\n                    ),\n                )\n            )\n            message(Image(\"{C344D624-0014-DA35-BB63-A958BC435134}.jpg\") {\n                width = 904\n                height = 1214\n                size = 108536\n                type = ImageType.JPG\n                isEmoji = false\n            })\n            targetGroup()\n        }.doDecoderChecks()\n    }\n\n    @Test\n    fun `friend Image receive from Windows`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    notOnlineImage = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.NotOnlineImage(\n                        filePath = \"J9R_MJL9@9Z02}QZ0LTTX77.jpg\",\n                        fileLen = 108536,\n                        downloadPath = \"/123456-2313394132-C344D6240014DA35BB63A958BC435134\",\n                        oldVerSendFile = \"16 20 31 31 37 31 30 31 30 36 31 43 42 20 20 20 20 31 30 38 35 33 36 65 43 33 34 34 44 36 32 34 30 30 31 34 44 41 33 35 42 42 36 33 41 39 35 38 42 43 34 33 35 31 33 34 2E 6A 70 67 78 2F 33 32 37 39 38 32 36 34 38 34 2D 32 33 31 33 33 39 34 31 33 32 2D 43 33 34 34 44 36 32 34 30 30 31 34 44 41 33 35 42 42 36 33 41 39 35 38 42 43 34 33 35 31 33 34 41\".hexToBytes(),\n                        imgType = 1000,\n                        picMd5 = \"C3 44 D6 24 00 14 DA 35 BB 63 A9 58 BC 43 51 34\".hexToBytes(),\n                        picHeight = 1214,\n                        picWidth = 904,\n                        resId = \"/123456-2313394132-C344D6240014DA35BB63A958BC435134\",\n                        flag = \"00 00 00 00\".hexToBytes(),\n                        thumbUrl = \"/offpic_new/123456//123456-2313394132-C344D6240014DA35BB63A958BC435134/198?term=2\",\n                        origUrl = \"/offpic_new/123456//123456-2313394132-C344D6240014DA35BB63A958BC435134/0?term=2\",\n                        thumbWidth = 147,\n                        thumbHeight = 198,\n                        _400Url = \"/offpic_new/123456//123456-2313394132-C344D6240014DA35BB63A958BC435134/400?term=2\",\n                        _400Width = 285,\n                        _400Height = 384,\n                    ),\n                )\n            )\n            message(Image(\"{C344D624-0014-DA35-BB63-A958BC435134}.jpg\") {\n                width = 904\n                height = 1214\n                size = 108536\n                type = ImageType.JPG\n                isEmoji = false\n            })\n            targetFriend()\n            useOrdinaryEquality()\n        }.doDecoderChecks()\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // receive from iPadOS\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Test\n    fun `group Image receive from iPadOS`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    customFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.CustomFace(\n                        filePath = \"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\",\n                        oldData = \"15 36 20 39 32 6B 41 31 E8 38 63 34 65 39 63 38 39 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 30 71 76 4A 51 79 6D 7A 37 4D 77 7A 7A 33 6A 74 4E 7B 41 37 43 42 42 35 32 39 2D 34 33 41 32 2D 31 32 37 43 2D 45 34 32 36 2D 35 39 44 32 39 42 41 41 38 35 31 35 7D 2E 6A 70 67 41\".hexToBytes(),\n                        fileId = -1941005175,\n                        fileType = -24,\n                        signature = \"qvJQymz7Mwzz3jtN\".toByteArray(), /* 71 76 4A 51 79 6D 7A 37 4D 77 7A 7A 33 6A 74 4E */\n                        useful = 1,\n                        picMd5 = \"A7 CB B5 29 43 A2 12 7C E4 26 59 D2 9B AA 85 15\".hexToBytes(),\n                        thumbUrl = \"/gchatpic_new/123456/123456-2353962121-A7CBB52943A2127CE42659D29BAA8515/198?term=2\",\n                        origUrl = \"/gchatpic_new/123456/123456-2353962121-A7CBB52943A2127CE42659D29BAA8515/0?term=2\",\n                        imageType = 1000,\n                        width = 904,\n                        height = 1214,\n                        source = 203,\n                        size = 170426,\n                        thumbWidth = 147,\n                        thumbHeight = 198,\n                        _400Url = \"/gchatpic_new/123456/123456-2353962121-A7CBB52943A2127CE42659D29BAA8515/400?term=2\",\n                        _400Width = 285,\n                        _400Height = 384,\n                        pbReserve = \"08 01 10 00 18 00 2A 0C E5 8A A8 E7 94 BB E8 A1 A8 E6 83 85 4A 0E 5B E5 8A A8 E7 94 BB E8 A1 A8 E6 83 85 5D 50 00 78 05\".hexToBytes(),\n                    ),\n                )\n            )\n            message(Image(\"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\") {\n                width = 904\n                height = 1214\n                size = 170426\n                type = ImageType.JPG\n                isEmoji = true\n            })\n            targetGroup()\n        }.doDecoderChecks()\n    }\n\n    @Test\n    fun `friend Image receive from iPadOS`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    notOnlineImage = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.NotOnlineImage(\n                        filePath = \"A7CBB52943A2127CE42659D29BAA8515.png\",\n                        fileLen = 170426,\n                        downloadPath = \"/1040400290-197707644-A7CBB52943A2127CE42659D29BAA8515\",\n                        oldVerSendFile = \"16 20 31 31 36 31 30 31 30 35 31 41 42 20 20 20 20 31 37 30 34 32 36 65 41 37 43 42 42 35 32 39 34 33 41 32 31 32 37 43 45 34 32 36 35 39 44 32 39 42 41 41 38 35 31 35 2E 70 6E 67 77 2F 31 30 34 30 34 30 30 32 39 30 2D 31 39 37 37 30 37 36 34 34 2D 41 37 43 42 42 35 32 39 34 33 41 32 31 32 37 43 45 34 32 36 35 39 44 32 39 42 41 41 38 35 31 35 41\".hexToBytes(),\n                        imgType = 1000,\n                        picMd5 = \"A7 CB B5 29 43 A2 12 7C E4 26 59 D2 9B AA 85 15\".hexToBytes(),\n                        picHeight = 1214,\n                        picWidth = 904,\n                        resId = \"/123456-197707644-A7CBB52943A2127CE42659D29BAA8515\",\n                        thumbUrl = \"/offpic_new/123456//123456-197707644-A7CBB52943A2127CE42659D29BAA8515/198?term=2\",\n                        origUrl = \"/offpic_new/123456//123456-197707644-A7CBB52943A2127CE42659D29BAA8515/0?term=2\",\n                        bizType = 5,\n                        thumbWidth = 147,\n                        thumbHeight = 198,\n                        _400Url = \"/offpic_new/123456//123456-197707644-A7CBB52943A2127CE42659D29BAA8515/400?term=2\",\n                        _400Width = 285,\n                        _400Height = 384,\n                        pbReserve = \"08 01 10 00 18 00 2A 0C E5 8A A8 E7 94 BB E8 A1 A8 E6 83 85 42 0E 5B E5 8A A8 E7 94 BB E8 A1 A8 E6 83 85 5D 50 00 78 05\".hexToBytes(),\n                    ),\n                )\n            )\n            message(Image(\"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\") {\n                width = 904\n                height = 1214\n                size = 170426\n                type = ImageType.JPG\n                isEmoji = true\n            })\n            targetFriend()\n            useOrdinaryEquality()\n        }.doDecoderChecks()\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // send without dimension\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Test\n    fun `group Image send without dimension`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    customFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.CustomFace(\n                        filePath = \"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\",\n                        flag = byteArrayOf(0, 0, 0, 0),\n                        fileType = 66,\n                        useful = 1,\n                        picMd5 = \"A7 CB B5 29 43 A2 12 7C E4 26 59 D2 9B AA 85 15\".hexToBytes(),\n                        bizType = 5,\n                        imageType = 1000,\n                        width = 1,\n                        height = 1,\n                        origin = 1,\n                    ),\n                )\n            )\n            message(Image(\"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\"))\n            targetGroup()\n        }.doEncoderChecks()\n    }\n\n    @Test\n    fun `friend Image send without dimension`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    notOnlineImage = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.NotOnlineImage(\n                        filePath = \"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\",\n                        downloadPath = \"/000000000-000000000-A7CBB52943A2127CE42659D29BAA8515\",\n                        imgType = 1000,\n                        picMd5 = \"A7 CB B5 29 43 A2 12 7C E4 26 59 D2 9B AA 85 15\".hexToBytes(),\n                        picHeight = 1,\n                        picWidth = 1,\n                        resId = \"/000000000-000000000-A7CBB52943A2127CE42659D29BAA8515\",\n                        original = 1,\n                        bizType = 5,\n                        pbReserve = \"x\u0002\".toByteArray(), /* 78 02 */\n                    ),\n                )\n            )\n            message(Image(\"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\"))\n            targetFriend()\n        }.doEncoderChecks()\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // send with dimension\n    ///////////////////////////////////////////////////////////////////////////\n\n\n    @Test\n    fun `group Image send with dimension`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    customFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.CustomFace(\n                        filePath = \"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\",\n                        flag = byteArrayOf(0, 0, 0, 0),\n                        fileType = 66,\n                        useful = 1,\n                        picMd5 = \"A7 CB B5 29 43 A2 12 7C E4 26 59 D2 9B AA 85 15\".hexToBytes(),\n                        bizType = 5,\n                        imageType = 1000,\n                        width = 904,\n                        height = 1214,\n                        size = 170426,\n                        origin = 1,\n                    ),\n                )\n            )\n            message(Image(\"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\") {\n                width = 904\n                height = 1214\n                size = 170426\n                type = ImageType.JPG\n                isEmoji = false\n            })\n            targetGroup()\n        }.doEncoderChecks()\n    }\n\n    private fun CodingChecksBuilder.targetGroup() {\n        target(bot.addGroup(1, 1))\n    }\n\n    @Test\n    fun `friend Image send with dimension`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    notOnlineImage = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.NotOnlineImage(\n                        filePath = \"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\",\n                        fileLen = 170426,\n                        downloadPath = \"/000000000-000000000-A7CBB52943A2127CE42659D29BAA8515\",\n                        imgType = 1000,\n                        picMd5 = \"A7 CB B5 29 43 A2 12 7C E4 26 59 D2 9B AA 85 15\".hexToBytes(),\n                        picHeight = 1214,\n                        picWidth = 904,\n                        resId = \"/000000000-000000000-A7CBB52943A2127CE42659D29BAA8515\",\n                        original = 1,\n                        bizType = 5,\n                        pbReserve = \"x\u0002\".toByteArray(), /* 78 02 */\n                    ),\n                )\n            )\n            message(Image(\"{A7CBB529-43A2-127C-E426-59D29BAA8515}.jpg\") {\n                width = 904\n                height = 1214\n                size = 170426\n                type = ImageType.JPG\n                isEmoji = false\n            })\n            targetFriend()\n        }.doEncoderChecks()\n    }\n\n    private fun CodingChecksBuilder.targetFriend() {\n        target(bot.addFriend(1))\n    }\n\n\n    ///////////////////////////////////////////////////////////////////////////\n    // serialization\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Serializable\n    data class PolymorphicWrapperImage(\n        override val message: @Polymorphic Image\n    ) : PolymorphicWrapper\n\n    private fun <M : Image> testPolymorphicInImage(\n        data: M,\n        expectedInstance: M = data,\n    ) = listOf(dynamicTest(\"testPolymorphicInImage\") {\n        testPolymorphicIn(\n            polySerializer = PolymorphicWrapperImage.serializer(),\n            polyConstructor = ::PolymorphicWrapperImage,\n            data = data,\n            expectedSerialName = null,\n            expectedInstance = expectedInstance,\n        )\n    })\n\n    @TestFactory\n    fun `test serialization for OfflineGroupImage`(): DynamicTestsResult {\n        val data = Image(\"{90CCED1C-2D64-313B-5D66-46625CAB31D7}.jpg\")\n        assertIs<OfflineGroupImage>(data)\n        val serialName = Image.SERIAL_NAME\n        return runDynamicTests(\n            testPolymorphicInImage(data),\n            testPolymorphicInMessageContent(data, serialName),\n            testPolymorphicInSingleMessage(data, serialName),\n            testInsideMessageChain(data, serialName),\n            testContextual(data, serialName),\n        )\n    }\n\n    @TestFactory\n    fun `test serialization for OfflineFriendImage type 1`(): DynamicTestsResult {\n        val data = Image(\"/f8f1ab55-bf8e-4236-b55e-955848d7069f\") // type 1\n        assertIs<OfflineFriendImage>(data)\n        val serialName = Image.SERIAL_NAME\n        return runDynamicTests(\n            testPolymorphicInImage(data),\n            testPolymorphicInMessageContent(data, serialName),\n            testPolymorphicInSingleMessage(data, serialName),\n            testInsideMessageChain(data, serialName),\n            testContextual(data, serialName),\n        )\n    }\n\n    @TestFactory\n    fun `test serialization for OfflineFriendImage type 2`(): DynamicTestsResult {\n        val data = Image(\"/000000000-3814297509-BFB7027B9354B8F899A062061D74E206\") // type 1\n        assertIs<OfflineFriendImage>(data)\n        val serialName = Image.SERIAL_NAME\n        return runDynamicTests(\n            testPolymorphicInImage(data),\n            testPolymorphicInMessageContent(data, serialName),\n            testPolymorphicInSingleMessage(data, serialName),\n            testInsideMessageChain(data, serialName),\n            testContextual(data, serialName),\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/protocol/impl/LongMessageProtocolTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.internal.AbstractBot\nimport net.mamoe.mirai.internal.message.LightMessageRefiner.dropMiraiInternalFlags\nimport net.mamoe.mirai.internal.message.data.LongMessageInternal\nimport net.mamoe.mirai.internal.message.flags.ForceAsLongMessage\nimport net.mamoe.mirai.internal.message.flags.IgnoreLengthCheck\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.outgoing.MessageProtocolStrategy\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.receive.MessageSvcPbSendMsg\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.message.data.repeat\nimport net.mamoe.mirai.message.data.toMessageChain\nimport net.mamoe.mirai.message.data.toPlainText\nimport net.mamoe.mirai.utils.castUp\nimport net.mamoe.mirai.utils.getRandomString\nimport kotlin.random.Random\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class LongMessageProtocolTest : AbstractMessageProtocolTest() {\n    override val protocols: Array<out MessageProtocol> =\n        arrayOf(\n            TextProtocol(),\n            ImageProtocol(),\n            LongMessageProtocol(),\n            GeneralMessageSenderProtocol(),\n        )\n\n\n    init {\n        defaultTarget = bot.addGroup(123, 1230003).apply {\n            addMember(1230003, \"user3\", MemberPermission.OWNER)\n        }\n    }\n\n    @Test\n    fun precondition() {\n        assertEquals(getRandomString(5000, Random(1)), getRandomString(5000, Random(1)))\n        assertMessageEquals(\n            \"test\".toPlainText() + getRandomString(5000, Random(1)) +\n                    Image(\"{40A7C56B-45C9-23AE-0CFA-23F095B71035}.jpg\").repeat(200),\n            \"test\".toPlainText() + getRandomString(5000, Random(1)) +\n                    Image(\"{40A7C56B-45C9-23AE-0CFA-23F095B71035}.jpg\").repeat(200)\n        )\n    }\n\n    @Test\n    fun `can convert messages to LongMessageInternal`() {\n        var message = \"test\".toPlainText() + getRandomString(5000, Random(1)) +\n                Image(\"{40A7C56B-45C9-23AE-0CFA-23F095B71035}.jpg\").repeat(200)\n\n        message += IgnoreLengthCheck\n        message += ForceAsLongMessage\n\n        runWithFacade {\n            preprocessAndSendOutgoingImpl(defaultTarget.castUp(), message, components).let { (context, receipts) ->\n                val receipt = receipts.single()\n                assertMessageEquals(message.dropMiraiInternalFlags(), receipt.source.originalMessage)\n\n                assertMessageEquals(\n                    LongMessageInternal(\n                        \"\"\"\n                            <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\n                            <msg serviceID=\"35\" templateID=\"1\" action=\"viewMultiMsg\"\n                                 brief=\"testqGnJ1R...\"\n                                 m_resid=\"(size=1)6C6FD4AEC362AA8E54058A27B422FA42\"\n                                 m_fileName=\"160023\" sourceMsgId=\"0\" url=\"\"\n                                 flag=\"3\" adverSign=\"0\" multiMsgFlag=\"1\">\n                                <item layout=\"1\">\n                                    <title>testqGnJ1R...</title>\n                                    <hr hidden=\"false\" style=\"0\"/>\n                                    <summary>点击查看完整消息</summary>\n                                </item>\n                                <source name=\"聊天记录\" icon=\"\" action=\"\" appid=\"-1\"/>\n                            </msg>\n                \"\"\".trimIndent(), \"(size=1)6C6FD4AEC362AA8E54058A27B422FA42\"\n                    ) + IgnoreLengthCheck + ForceAsLongMessage, context.currentMessageChain\n                )\n            }\n        }\n    }\n\n    @Test\n    fun `can convert messages failed to send at FIRST step to LongMessageInternal`() {\n        val message = \"test\".toPlainText().toMessageChain()\n\n        runWithFacade {\n            components[MessageProtocolStrategy] = object : TestMessageProtocolStrategy() {\n                var count = 0\n                override suspend fun sendPacket(bot: AbstractBot, packet: OutgoingPacket): Packet {\n                    println(\"MessageProtocolStrategy.sendPacket called: $count\")\n                    if (count++ == 0) { // fail the first attempt\n                        return MessageSvcPbSendMsg.Response.MessageTooLarge\n                    }\n                    return super.sendPacket(bot, packet)\n                }\n            }\n            preprocessAndSendOutgoingImpl(defaultTarget.castUp(), message, components).let { (context, receipts) ->\n                val receipt = receipts.single()\n                assertMessageEquals(message.dropMiraiInternalFlags(), receipt.source.originalMessage)\n\n                assertMessageEquals(\n                    LongMessageInternal(\n                        \"\"\"\n                            <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\n                            <msg serviceID=\"35\" templateID=\"1\" action=\"viewMultiMsg\"\n                                 brief=\"test\"\n                                 m_resid=\"(size=1)8698F15C27DA63648CEF9A93EA76B084\"\n                                 m_fileName=\"160023\" sourceMsgId=\"0\" url=\"\"\n                                 flag=\"3\" adverSign=\"0\" multiMsgFlag=\"1\">\n                                <item layout=\"1\">\n                                    <title>test</title>\n                                    <hr hidden=\"false\" style=\"0\"/>\n                                    <summary>点击查看完整消息</summary>\n                                </item>\n                                <source name=\"聊天记录\" icon=\"\" action=\"\" appid=\"-1\"/>\n                            </msg>\n                        \"\"\".trimIndent(), \"(size=1)8698F15C27DA63648CEF9A93EA76B084\"\n                    ), context.currentMessageChain\n                )\n            }\n        }\n    }\n\n    // should add tests for refining received LongMessage to normal messages (with a MessageOrigin)\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/protocol/impl/MarketFaceProtocolTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.Polymorphic\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.internal.message.data.MarketFaceImpl\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.testFramework.DynamicTestsResult\nimport net.mamoe.mirai.internal.testFramework.TestFactory\nimport net.mamoe.mirai.internal.testFramework.dynamicTest\nimport net.mamoe.mirai.internal.testFramework.runDynamicTests\nimport net.mamoe.mirai.message.data.Dice\nimport net.mamoe.mirai.message.data.MarketFace\nimport net.mamoe.mirai.message.data.RockPaperScissors\nimport net.mamoe.mirai.utils.hexToBytes\nimport kotlin.test.BeforeTest\nimport kotlin.test.Test\n\ninternal class MarketFaceProtocolTest : AbstractMessageProtocolTest() {\n    override val protocols: Array<out MessageProtocol> = arrayOf(MarketFaceProtocol(), TextProtocol())\n\n    @BeforeTest\n    fun `init group`() {\n        defaultTarget = bot.addGroup(123, 1230003).apply {\n            addMember(1230003, \"user3\", MemberPermission.OWNER)\n        }\n    }\n\n    @Test\n    fun `decode Dice`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    marketFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MarketFace(\n                        faceName = \"5B E9 9A 8F E6 9C BA E9 AA B0 E5 AD 90 5D\".hexToBytes(),\n                        itemType = 6,\n                        faceInfo = 1,\n                        faceId = \"48 23 D3 AD B1 5D F0 80 14 CE 5D 67 96 B7 6E E1\".hexToBytes(),\n                        tabId = 11464,\n                        subType = 3,\n                        key = \"409e2a69b16918f9\".toByteArray(), /* 34 30 39 65 32 61 36 39 62 31 36 39 31 38 66 39 */\n                        imageWidth = 200,\n                        imageHeight = 200,\n                        mobileParam = \"72 73 63 54 79 70 65 3F 31 3B 76 61 6C 75 65 3D 34\".hexToBytes(),\n                        pbReserve = \"0A 06 08 C8 01 10 C8 01 40 01\".hexToBytes(),\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"[随机骰子]\",\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    generalFlags = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.GeneralFlags(\n                        pbReserve = \"78 00 90 01 01 C8 01 00 F0 01 00 F8 01 00 90 02 00 C8 02 00 CA 04 00 D2 05 02 08 37\".hexToBytes(),\n                    ),\n                )\n            )\n            message(Dice(5))\n            useOrdinaryEquality()\n        }.doDecoderChecks()\n    }\n\n\n    @Test\n    fun `encode Dice`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    marketFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MarketFace(\n                        faceName = \"5B E9 AA B0 E5 AD 90 5D\".hexToBytes(), // [骰子]\n                        itemType = 6,\n                        faceInfo = 1,\n                        faceId = \"48 23 D3 AD B1 5D F0 80 14 CE 5D 67 96 B7 6E E1\".hexToBytes(),\n                        tabId = 11464,\n                        subType = 3,\n                        key = \"409e2a69b16918f9\".toByteArray(), /* 34 30 39 65 32 61 36 39 62 31 36 39 31 38 66 39 */\n                        imageWidth = 200,\n                        imageHeight = 200,\n                        mobileParam = \"72 73 63 54 79 70 65 3F 31 3B 76 61 6C 75 65 3D 34\".hexToBytes(),\n                        pbReserve = \"0A 06 08 C8 01 10 C8 01 40 01 58 00 62 09 23 30 30 30 30 30 30 30 30 6A 09 23 30 30 30 30 30 30 30 30\".hexToBytes(),\n                    ),\n                ), net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"[骰子]\",\n                    ),\n                ), net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    extraInfo = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.ExtraInfo(\n                        flags = 8,\n                        groupMask = 1,\n                    ),\n                )\n            )\n            message(Dice(5))\n        }.doEncoderChecks()\n    }\n\n    @Test\n    fun `decode RockPaperScissors`() {\n        // region WinQQ PC\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    marketFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MarketFace(\n                        itemType = 6,\n                        faceInfo = 1,\n                        faceId = \"E5 D8 89 F1 DF 79 B2 B4 51 83 F6 25 58 44 65 D3\".hexToBytes(),\n                        tabId = 11415,\n                        subType = 3,\n                        key = \"7de39febcf45e6db\".toByteArray(), /* 37 64 65 33 39 66 65 62 63 66 34 35 65 36 64 62 */\n                        imageWidth = 100,\n                        imageHeight = 100,\n                        pbReserve = \"0A 06 08 C8 01 10 C8 01 40 01\".hexToBytes(),\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"[猜拳]\",\n                        attr7Buf = \"01\".hexToBytes(),\n                    ),\n                ),\n            )\n\n            message(RockPaperScissors.ROCK)\n            useOrdinaryEquality()\n        }.doDecoderChecks()\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    marketFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MarketFace(\n                        itemType = 6,\n                        faceInfo = 1,\n                        faceId = \"62 8F A4 AB 7B 6C 2B CC FC DC D0 C2 DA F7 A6 0C\".hexToBytes(),\n                        tabId = 11415,\n                        subType = 3,\n                        key = \"7de39febcf45e6db\".toByteArray(), /* 37 64 65 33 39 66 65 62 63 66 34 35 65 36 64 62 */\n                        imageWidth = 100,\n                        imageHeight = 100,\n                        pbReserve = \"0A 06 08 C8 01 10 C8 01 40 01\".hexToBytes(),\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"[猜拳]\",\n                        attr7Buf = \"01\".hexToBytes(),\n                    ),\n                ),\n            )\n\n            message(RockPaperScissors.SCISSORS)\n            useOrdinaryEquality()\n        }.doDecoderChecks()\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    marketFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MarketFace(\n                        itemType = 6,\n                        faceInfo = 1,\n                        faceId = \"45 7C DE 42 0F 59 8E B4 24 CE D2 E9 05 D3 8D 8B\".hexToBytes(),\n                        tabId = 11415,\n                        subType = 3,\n                        key = \"7de39febcf45e6db\".toByteArray(), /* 37 64 65 33 39 66 65 62 63 66 34 35 65 36 64 62 */\n                        imageWidth = 100,\n                        imageHeight = 100,\n                        pbReserve = \"0A 06 08 C8 01 10 C8 01 40 01\".hexToBytes(),\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"[猜拳]\",\n                        attr7Buf = \"01\".hexToBytes(),\n                    ),\n                ),\n            )\n\n            message(RockPaperScissors.PAPER)\n            useOrdinaryEquality()\n        }.doDecoderChecks()\n        // endregion\n\n        // region AndroidQQ 8.4.18.49145\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    marketFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MarketFace(\n                        faceName = \"[猜拳]\".toByteArray(), /* 5B E7 8C 9C E6 8B B3 5D */\n                        itemType = 6,\n                        faceInfo = 1,\n                        faceId = \"83 C8 A2 93 AE 65 CA 14 0F 34 81 20 A7 74 48 EE\".hexToBytes(),\n                        tabId = 11415,\n                        subType = 3,\n                        key = \"7de39febcf45e6db\".toByteArray(), /* 37 64 65 33 39 66 65 62 63 66 34 35 65 36 64 62 */\n                        imageWidth = 200,\n                        imageHeight = 200,\n                        mobileParam = \"rscType?1;value=2\".toByteArray(), /* 72 73 63 54 79 70 65 3F 31 3B 76 61 6C 75 65 3D 32 */\n                        pbReserve = \"0A 06 08 C8 01 10 C8 01 40 01\".hexToBytes(),\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"[猜拳]\",\n                    ),\n                ),\n            )\n            message(RockPaperScissors.PAPER)\n            useOrdinaryEquality()\n        }.doDecoderChecks()\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    marketFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MarketFace(\n                        faceName = \"[猜拳]\".toByteArray(), /* 5B E7 8C 9C E6 8B B3 5D */\n                        itemType = 6,\n                        faceInfo = 1,\n                        faceId = \"83 C8 A2 93 AE 65 CA 14 0F 34 81 20 A7 74 48 EE\".hexToBytes(),\n                        tabId = 11415,\n                        subType = 3,\n                        key = \"7de39febcf45e6db\".toByteArray(), /* 37 64 65 33 39 66 65 62 63 66 34 35 65 36 64 62 */\n                        imageWidth = 200,\n                        imageHeight = 200,\n                        mobileParam = \"rscType?1;value=0\".toByteArray(), /* 72 73 63 54 79 70 65 3F 31 3B 76 61 6C 75 65 3D 30 */\n                        pbReserve = \"0A 06 08 C8 01 10 C8 01 40 01\".hexToBytes(),\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"[猜拳]\",\n                    ),\n                ),\n            )\n            message(RockPaperScissors.ROCK)\n            useOrdinaryEquality()\n        }.doDecoderChecks()\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    marketFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MarketFace(\n                        faceName = \"[猜拳]\".toByteArray(), /* 5B E7 8C 9C E6 8B B3 5D */\n                        itemType = 6,\n                        faceInfo = 1,\n                        faceId = \"83 C8 A2 93 AE 65 CA 14 0F 34 81 20 A7 74 48 EE\".hexToBytes(),\n                        tabId = 11415,\n                        subType = 3,\n                        key = \"7de39febcf45e6db\".toByteArray(), /* 37 64 65 33 39 66 65 62 63 66 34 35 65 36 64 62 */\n                        imageWidth = 200,\n                        imageHeight = 200,\n                        mobileParam = \"rscType?1;value=1\".toByteArray(), /* 72 73 63 54 79 70 65 3F 31 3B 76 61 6C 75 65 3D 31 */\n                        pbReserve = \"0A 06 08 C8 01 10 C8 01 40 01\".hexToBytes(),\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"[猜拳]\",\n                    ),\n                ),\n            )\n            message(RockPaperScissors.SCISSORS)\n            useOrdinaryEquality()\n        }.doDecoderChecks()\n        // endregion\n\n        // region MacOS\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    marketFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MarketFace(\n                        faceName = \"[猜拳]\".toByteArray(), /* 5B E7 8C 9C E6 8B B3 5D */\n                        itemType = 6,\n                        faceInfo = 1,\n                        faceId = \"83 C8 A2 93 AE 65 CA 14 0F 34 81 20 A7 74 48 EE\".hexToBytes(),\n                        tabId = 11415,\n                        subType = 3,\n                        key = \"7de39febcf45e6db\".toByteArray(), /* 37 64 65 33 39 66 65 62 63 66 34 35 65 36 64 62 */\n                        imageWidth = 200,\n                        imageHeight = 200,\n                        mobileParam = \"rscType?1;value=0\".toByteArray(), /* 72 73 63 54 79 70 65 3F 31 3B 76 61 6C 75 65 3D 30 */\n                        pbReserve = \"0A 06 08 C8 01 10 C8 01 40 01\".hexToBytes(),\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"[猜拳]\",\n                    ),\n                ),\n            )\n\n            message(RockPaperScissors.ROCK)\n            useOrdinaryEquality()\n        }.doDecoderChecks()\n        // endregion\n\n        // region iOS\n        buildCodingChecks {\n            elem(\n                // ROCK\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    marketFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MarketFace(\n                        faceName = \"[猜拳]\".toByteArray(), /* 5B E7 8C 9C E6 8B B3 5D */\n                        itemType = 6,\n                        faceInfo = 1,\n                        faceId = \"83 C8 A2 93 AE 65 CA 14 0F 34 81 20 A7 74 48 EE\".hexToBytes(),\n                        tabId = 11415,\n                        subType = 3,\n                        key = \"7de39febcf45e6db\".toByteArray(), /* 37 64 65 33 39 66 65 62 63 66 34 35 65 36 64 62 */\n                        imageWidth = 200,\n                        imageHeight = 200,\n                        mobileParam = \"rscType?1;value=0\".toByteArray(), /* 72 73 63 54 79 70 65 3F 31 3B 76 61 6C 75 65 3D 30 */\n                        pbReserve = \"0A 06 08 C8 01 10 C8 01 40 01\".hexToBytes(),\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"[猜拳]\",\n                    ),\n                ),\n            )\n            message(RockPaperScissors.ROCK)\n            useOrdinaryEquality()\n        }.doDecoderChecks()\n        buildCodingChecks { // paper\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    marketFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MarketFace(\n                        faceName = \"[猜拳]\".toByteArray(), /* 5B E7 8C 9C E6 8B B3 5D */\n                        itemType = 6,\n                        faceInfo = 1,\n                        faceId = \"83 C8 A2 93 AE 65 CA 14 0F 34 81 20 A7 74 48 EE\".hexToBytes(),\n                        tabId = 11415,\n                        subType = 3,\n                        key = \"7de39febcf45e6db\".toByteArray(), /* 37 64 65 33 39 66 65 62 63 66 34 35 65 36 64 62 */\n                        imageWidth = 200,\n                        imageHeight = 200,\n                        mobileParam = \"rscType?1;value=2\".toByteArray(), /* 72 73 63 54 79 70 65 3F 31 3B 76 61 6C 75 65 3D 32 */\n                        pbReserve = \"0A 06 08 C8 01 10 C8 01 40 01\".hexToBytes(),\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"[猜拳]\",\n                    ),\n                ),\n            )\n            message(RockPaperScissors.PAPER)\n            useOrdinaryEquality()\n        }.doDecoderChecks()\n        // endregion\n    }\n\n    @Test\n    fun `encode RockPaperScissors`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    marketFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MarketFace(\n                        faceName = \"[猜拳]\".toByteArray(), /* 5B E7 8C 9C E6 8B B3 5D */\n                        itemType = 6,\n                        faceInfo = 1,\n                        faceId = \"83 C8 A2 93 AE 65 CA 14 0F 34 81 20 A7 74 48 EE\".hexToBytes(),\n                        tabId = 11415,\n                        subType = 3,\n                        key = \"7de39febcf45e6db\".toByteArray(), /* 37 64 65 33 39 66 65 62 63 66 34 35 65 36 64 62 */\n                        imageWidth = 200,\n                        imageHeight = 200,\n                        mobileParam = \"rscType?1;value=0\".toByteArray(), /* 72 73 63 54 79 70 65 3F 31 3B 76 61 6C 75 65 3D 30 */\n                        pbReserve = \"0A 06 08 C8 01 10 C8 01 40 01\".hexToBytes(),\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"[猜拳]\",\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    extraInfo = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.ExtraInfo(\n                        flags = 8,\n                        groupMask = 1,\n                    ),\n                ),\n            )\n            message(RockPaperScissors.ROCK)\n        }.doBothChecks()\n\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    marketFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MarketFace(\n                        faceName = \"[猜拳]\".toByteArray(), /* 5B E7 8C 9C E6 8B B3 5D */\n                        itemType = 6,\n                        faceInfo = 1,\n                        faceId = \"83 C8 A2 93 AE 65 CA 14 0F 34 81 20 A7 74 48 EE\".hexToBytes(),\n                        tabId = 11415,\n                        subType = 3,\n                        key = \"7de39febcf45e6db\".toByteArray(), /* 37 64 65 33 39 66 65 62 63 66 34 35 65 36 64 62 */\n                        imageWidth = 200,\n                        imageHeight = 200,\n                        mobileParam = \"rscType?1;value=1\".toByteArray(), /* 72 73 63 54 79 70 65 3F 31 3B 76 61 6C 75 65 3D 31 */\n                        pbReserve = \"0A 06 08 C8 01 10 C8 01 40 01\".hexToBytes(),\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"[猜拳]\",\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    extraInfo = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.ExtraInfo(\n                        flags = 8,\n                        groupMask = 1,\n                    ),\n                ),\n            )\n            message(RockPaperScissors.SCISSORS)\n        }.doBothChecks()\n\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    marketFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MarketFace(\n                        faceName = \"[猜拳]\".toByteArray(), /* 5B E7 8C 9C E6 8B B3 5D */\n                        itemType = 6,\n                        faceInfo = 1,\n                        faceId = \"83 C8 A2 93 AE 65 CA 14 0F 34 81 20 A7 74 48 EE\".hexToBytes(),\n                        tabId = 11415,\n                        subType = 3,\n                        key = \"7de39febcf45e6db\".toByteArray(), /* 37 64 65 33 39 66 65 62 63 66 34 35 65 36 64 62 */\n                        imageWidth = 200,\n                        imageHeight = 200,\n                        mobileParam = \"rscType?1;value=2\".toByteArray(), /* 72 73 63 54 79 70 65 3F 31 3B 76 61 6C 75 65 3D 32 */\n                        pbReserve = \"0A 06 08 C8 01 10 C8 01 40 01\".hexToBytes(),\n                    ),\n                ), net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"[猜拳]\",\n                    ),\n                ), net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    extraInfo = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.ExtraInfo(\n                        flags = 8,\n                        groupMask = 1,\n                    ),\n                )\n            )\n            message(RockPaperScissors.PAPER)\n        }.doBothChecks()\n\n    }\n\n    @Test\n    fun `encode decode MarketFace from Android`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    marketFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MarketFace(\n                        faceName = \"5B E5 8F 91 E5 91 86 5D\".hexToBytes(),\n                        itemType = 6,\n                        faceInfo = 1,\n                        faceId = \"71 26 44 B5 27 94 46 11 99 8A EC 31 86 75 19 D2\".hexToBytes(),\n                        tabId = 10278,\n                        subType = 3,\n                        key = \"726a53a5372b7289\".toByteArray(), /* 37 32 36 61 35 33 61 35 33 37 32 62 37 32 38 39 */\n                        imageWidth = 200,\n                        imageHeight = 200,\n                        pbReserve = \"0A 06 08 C8 01 10 C8 01 10 64 1A 0B 51 51 E5 A4 A7 E9 BB 84 E8 84 B8 22 40 68 74 74 70 73 3A 2F 2F 7A 62 2E 76 69 70 2E 71 71 2E 63 6F 6D 2F 69 70 3F 5F 77 76 3D 31 36 37 37 38 32 34 31 26 66 72 6F 6D 3D 61 69 6F 45 6D 6F 6A 69 4E 65 77 26 69 64 3D 31 30 38 39 31 30 2A 06 E6 9D A5 E8 87 AA 30 B5 BB B4 E3 0D 38 B5 BB B4 E3 0D 40 01 50 00\".hexToBytes(),\n                    ),\n                ), net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"[发呆]\",\n                    ),\n                ), net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    extraInfo = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.ExtraInfo(\n                        flags = 8,\n                        groupMask = 1,\n                    ),\n                )\n            )\n            // MarketFaceImpl 不支持手动构造\n            message(\n                MarketFaceImpl(\n                    net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MarketFace(\n                        faceName = \"5B E5 8F 91 E5 91 86 5D\".hexToBytes(),\n                        itemType = 6,\n                        faceInfo = 1,\n                        faceId = \"71 26 44 B5 27 94 46 11 99 8A EC 31 86 75 19 D2\".hexToBytes(),\n                        tabId = 10278,\n                        subType = 3,\n                        key = \"726a53a5372b7289\".toByteArray(), /* 37 32 36 61 35 33 61 35 33 37 32 62 37 32 38 39 */\n                        imageWidth = 200,\n                        imageHeight = 200,\n                        pbReserve = \"0A 06 08 C8 01 10 C8 01 10 64 1A 0B 51 51 E5 A4 A7 E9 BB 84 E8 84 B8 22 40 68 74 74 70 73 3A 2F 2F 7A 62 2E 76 69 70 2E 71 71 2E 63 6F 6D 2F 69 70 3F 5F 77 76 3D 31 36 37 37 38 32 34 31 26 66 72 6F 6D 3D 61 69 6F 45 6D 6F 6A 69 4E 65 77 26 69 64 3D 31 30 38 39 31 30 2A 06 E6 9D A5 E8 87 AA 30 B5 BB B4 E3 0D 38 B5 BB B4 E3 0D 40 01 50 00\".hexToBytes(),\n                    )\n                )\n            )\n        }.doBothChecks()\n    }\n\n    @Test\n    fun `encode decode MarketFace from macOS`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    marketFace = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MarketFace(\n                        faceName = \"5B E5 8F 91 E5 91 86 5D\".hexToBytes(),\n                        itemType = 6,\n                        faceInfo = 1,\n                        faceId = \"71 26 44 B5 27 94 46 11 99 8A EC 31 86 75 19 D2\".hexToBytes(),\n                        tabId = 10278,\n                        subType = 3,\n                        key = \"726a53a5372b7289\".toByteArray(), /* 37 32 36 61 35 33 61 35 33 37 32 62 37 32 38 39 */\n                        imageWidth = 200,\n                        imageHeight = 200,\n                        pbReserve = \"0A 06 08 C8 01 10 C8 01 40 01\".hexToBytes(),\n                    ),\n                ), net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"[发呆]\",\n                    ),\n                ), net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    extraInfo = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.ExtraInfo(\n                        flags = 8,\n                        groupMask = 1,\n                    ),\n                )\n            )\n            // MarketFaceImpl 不支持手动构造\n            message(\n                MarketFaceImpl(\n                    net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MarketFace(\n                        faceName = \"5B E5 8F 91 E5 91 86 5D\".hexToBytes(),\n                        itemType = 6,\n                        faceInfo = 1,\n                        faceId = \"71 26 44 B5 27 94 46 11 99 8A EC 31 86 75 19 D2\".hexToBytes(),\n                        tabId = 10278,\n                        subType = 3,\n                        key = \"726a53a5372b7289\".toByteArray(), /* 37 32 36 61 35 33 61 35 33 37 32 62 37 32 38 39 */\n                        imageWidth = 200,\n                        imageHeight = 200,\n                        pbReserve = \"0A 06 08 C8 01 10 C8 01 40 01\".hexToBytes(),\n                    )\n                )\n            )\n        }.doBothChecks()\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // serialization\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Serializable\n    data class PolymorphicWrapperMarketFace(\n        override val message: @Polymorphic MarketFace\n    ) : PolymorphicWrapper\n\n    @Serializable\n    data class StaticWrapperDice(\n        override val message: Dice\n    ) : PolymorphicWrapper\n\n    @Serializable\n    data class StaticWrapperRockPaperScissors(\n        override val message: RockPaperScissors\n    ) : PolymorphicWrapper\n\n    private fun <M : MarketFace> testPolymorphicInMarketFace(\n        data: M,\n        expectedSerialName: String,\n        expectedInstance: M = data,\n    ) = listOf(dynamicTest(\"testPolymorphicInMarketFace\") {\n        testPolymorphicIn(\n            polySerializer = PolymorphicWrapperMarketFace.serializer(),\n            polyConstructor = ::PolymorphicWrapperMarketFace,\n            data = data,\n            expectedSerialName = expectedSerialName, // MarketFaceImpl is 'MarketFace', Dice is 'Dice', should include discriminator\n            expectedInstance = expectedInstance,\n        )\n    })\n\n    private fun testStaticDice(\n        data: Dice,\n        expectedInstance: Dice = data,\n    ) = listOf(dynamicTest(\"testStaticDice\") {\n        testPolymorphicIn(\n            polySerializer = StaticWrapperDice.serializer(),\n            polyConstructor = ::StaticWrapperDice,\n            data = data,\n            expectedSerialName = null,\n            expectedInstance = expectedInstance,\n        )\n    })\n\n    private fun testStaticRockPaperScissors(\n        data: RockPaperScissors,\n        expectedInstance: RockPaperScissors = data,\n    ) = listOf(dynamicTest(\"testStaticRockPaperScissors\") {\n        testPolymorphicIn(\n            polySerializer = StaticWrapperRockPaperScissors.serializer(),\n            polyConstructor = ::StaticWrapperRockPaperScissors,\n            data = data,\n            expectedSerialName = null,\n            expectedInstance = expectedInstance,\n        )\n    })\n\n    @TestFactory\n    fun `test serialization for MarketFaceImpl`(): DynamicTestsResult {\n        val data = MarketFaceImpl(\n            net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MarketFace(\n                faceName = \"5B E5 8F 91 E5 91 86 5D\".hexToBytes(),\n                itemType = 6,\n                faceInfo = 1,\n                faceId = \"71 26 44 B5 27 94 46 11 99 8A EC 31 86 75 19 D2\".hexToBytes(),\n                tabId = 10278,\n                subType = 3,\n                key = \"726a53a5372b7289\".toByteArray(), /* 37 32 36 61 35 33 61 35 33 37 32 62 37 32 38 39 */\n                imageWidth = 200,\n                imageHeight = 200,\n                pbReserve = \"0A 06 08 C8 01 10 C8 01 10 64 1A 0B 51 51 E5 A4 A7 E9 BB 84 E8 84 B8 22 40 68 74 74 70 73 3A 2F 2F 7A 62 2E 76 69 70 2E 71 71 2E 63 6F 6D 2F 69 70 3F 5F 77 76 3D 31 36 37 37 38 32 34 31 26 66 72 6F 6D 3D 61 69 6F 45 6D 6F 6A 69 4E 65 77 26 69 64 3D 31 30 38 39 31 30 2A 06 E6 9D A5 E8 87 AA 30 B5 BB B4 E3 0D 38 B5 BB B4 E3 0D 40 01 50 00\".hexToBytes(),\n            )\n        )\n        val serialName = MarketFaceImpl.SERIAL_NAME\n        return runDynamicTests(\n            testPolymorphicInMarketFace(data, serialName),\n            testPolymorphicInMessageContent(data, serialName),\n            testPolymorphicInSingleMessage(data, serialName),\n            testInsideMessageChain(data, serialName),\n            testContextual(data, serialName, targetType = MarketFace::class),\n        )\n    }\n\n    @TestFactory\n    fun `test serialization for RockPaperScissors`(): DynamicTestsResult {\n        val data = RockPaperScissors.PAPER\n\n        val serialName = RockPaperScissors.SERIAL_NAME\n        return runDynamicTests(\n            testPolymorphicInMarketFace(data, serialName),\n            testPolymorphicInMessageContent(data, serialName),\n            testPolymorphicInSingleMessage(data, serialName),\n            testInsideMessageChain(data, serialName),\n            testContextual(data, serialName),\n            testContextual(data, serialName, targetType = MarketFace::class),\n            testStaticRockPaperScissors(data),\n        )\n    }\n\n    @TestFactory\n    fun `test serialization for Dice`(): DynamicTestsResult {\n        val data = Dice(1)\n        val serialName = Dice.SERIAL_NAME\n        return runDynamicTests(\n            testPolymorphicInMarketFace(data, serialName),\n            testPolymorphicInMessageContent(data, serialName),\n            testPolymorphicInSingleMessage(data, serialName),\n            testInsideMessageChain(data, serialName),\n            testContextual(data, serialName, targetType = Dice::class),\n            testStaticDice(data),\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/protocol/impl/MusicShareProtocolTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.AbstractContact\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.outgoing.MessageProtocolStrategy\nimport net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessageProcessorAdapter\nimport net.mamoe.mirai.internal.pipeline.replaceProcessor\nimport net.mamoe.mirai.internal.testFramework.DynamicTestsResult\nimport net.mamoe.mirai.internal.testFramework.TestFactory\nimport net.mamoe.mirai.internal.testFramework.runDynamicTests\nimport net.mamoe.mirai.message.data.LightApp\nimport net.mamoe.mirai.message.data.MessageOrigin\nimport net.mamoe.mirai.message.data.MessageOriginKind\nimport net.mamoe.mirai.message.data.MusicKind.NeteaseCloudMusic\nimport net.mamoe.mirai.message.data.MusicShare\nimport net.mamoe.mirai.utils.castUp\nimport net.mamoe.mirai.utils.hexToBytes\nimport kotlin.test.BeforeTest\nimport kotlin.test.Test\nimport kotlin.test.assertTrue\n\ninternal class MusicShareProtocolTest : AbstractMessageProtocolTest() {\n    override val protocols: Array<out MessageProtocol> =\n        arrayOf(TextProtocol(), MusicShareProtocol(), RichMessageProtocol(), GeneralMessageSenderProtocol())\n\n    @BeforeTest\n    fun `init group`() {\n        defaultTarget = bot.addGroup(123, 1230003).apply {\n            addMember(1230003, \"user3\", MemberPermission.OWNER)\n        }\n    }\n\n    @Test\n    fun `decode from Android`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    lightApp = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.LightAppElem(\n                        data = \"01 78 9C 7D 53 5D 6B D4 40 14 FD 2F 81 EE 53 99 CC E4 63 76 53 08 42 15 A5 16 2D B5 08 16 23 61 3A 99 4D D3 6E 66 86 64 D2 A5 96 7D D9 80 F8 68 11 C1 37 1F 44 44 AB 4F 3E A8 45 7F 4D AA E2 BF F0 4E 58 B7 50 44 32 24 F7 DC B9 33 E7 7E 9C 9C 38 4C 6B 67 CD E1 AA 44 46 48 2E A4 41 B5 A9 1A 6E CA 3A 77 56 9D 4C D4 1C B6 7F BF FA 74 F1 F5 19 E0 A3 42 4C 01 97 4D 5D 70 0B 45 05 08 23 FB 10 C0 BA 52 A5 36 E0 7A F8 E3 E9 93 8B F3 B3 47 DD FC 4B 37 7F DB B5 EF BB F6 5B D7 BE E8 E6 AF BB B6 ED E6 9F BB F6 0D 84 97 C2 30 67 ED 64 71 1D 18 8C 9B 42 49 38 0F 9B 4C 66 95 2A B2 54 1F E6 A9 64 A5 58 78 B5 4E CD B1 06 44 7A 50 64 60 61 1C 44 21 1E 85 AB 0E 9C B7 91 84 86 5E 44 A9 EF 7B CB 12 76 1B A9 CA 22 71 BB F6 63 9F CB 3B FB 9E 7F E8 ED 33 B8 F8 A0 29 F5 FD 6A 02 91 FB C6 E8 7A 2D 71 13 F7 18 F5 99 21 42 7D 04 1D 4A 5C 58 B5 92 F9 B5 22 8B 43 EA 85 11 6C D0 01 34 2B DE DE C4 1B 5B 7C C5 BB B9 73 7D 63 6B 94 AF DF BD B5 E2 AD 4F F9 5E 9D AF F8 37 60 0D 6C DE D0 AD 1A CA 8B 47 68 88 02 6A EB B7 B7 5F 92 F6 9C 57 18 2D 1D 38 45 56 B0 C4 55 8D 11 55 E2 36 D5 E4 4A 06 B5 A8 C0 E1 7B 01 1E 52 1F 0F 07 35 8F A7 E5 D1 C0 C8 B8 1F 8A 58 8C 6D 49 A2 C9 DF CA 3C 8A A4 30 89 BB C9 76 77 F6 22 B5 BB FD 78 7F E2 3D 58 17 B7 F9 C1 E8 5E 1E C7 89 4B 70 14 85 04 3A 4A BC 90 62 32 C4 1E 3A D0 56 1B B5 6A 2A 2E EE D4 F9 46 66 45 B0 F4 A4 05 EF 67 78 D9 C7 02 E5 30 97 1C 71 09 35 68 01 6F DB 0E 1B 96 B8 18 27 6E 10 25 6E 08 DF 51 68 E9 16 C3 4C C1 4A 4B A4 E5 25 57 DA F4 BD 02 6C 58 0E C6 AF EF A7 3F 5F 3E BF 38 3F 5D EA D3 14 66 62 95 F2 7F DD 35 05 E4 47 3C 3F 08 E9 6C 06 A2 51 72 5C E4 56 7F FF 90 CF 58 55 53 56 41 85 F0 57 08 20 50 87 C2 16 47 30 E1 41 38 1E 31 3F DB C3 8C 92 30 8B 08 1B B2 60 8C 23 1A 8D B9 6F 73 E9 65 EA 48 55 95 6C E2 CC 66 7F 00 45 5B 33 67\".hexToBytes(),\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"\"\"\n                                |[分享]ジェリーフィッシュ\n                                |Yunomi / ローラーガール\n                                |https://y.music.163.com/m/song?id=562591636&uct=QK0IOc%2FSCIO8gBNG%2Bwcbsg%3D%3D&app_version=8.7.46\n                                |来自: 网易云音乐 \"\"\".trimMargin(),\n                    ),\n                ),\n            )\n            message(\n                MessageOrigin(\n                    LightApp(\n                        \"\"\"\n                            {\"app\":\"com.tencent.structmsg\",\"desc\":\"音乐\",\"view\":\"music\",\"ver\":\"0.0.0.1\",\"prompt\":\"[分享]ジェリーフィッシュ\",\"meta\":{\"music\":{\"action\":\"\",\"android_pkg_name\":\"\",\"app_type\":1,\"appid\":100495085,\"ctime\":1652966332,\"desc\":\"Yunomi\\/ローラーガール\",\"jumpUrl\":\"https:\\/\\/y.music.163.com\\/m\\/song?id=562591636&uct=QK0IOc%2FSCIO8gBNG%2Bwcbsg%3D%3D&app_version=8.7.46\",\"musicUrl\":\"http:\\/\\/music.163.com\\/song\\/media\\/outer\\/url?id=562591636&userid=324076307&sc=wmv&tn=\",\"preview\":\"http:\\/\\/p1.music.126.net\\/KaYSb9oYQzhl2XBeJcj8Rg==\\/109951165125601702.jpg\",\"sourceMsgId\":\"0\",\"source_icon\":\"https:\\/\\/i.gtimg.cn\\/open\\/app_icon\\/00\\/49\\/50\\/85\\/100495085_100_m.png\",\"source_url\":\"\",\"tag\":\"网易云音乐\",\"title\":\"ジェリーフィッシュ\",\"uin\":123456}},\"config\":{\"ctime\":1652966332,\"forward\":true,\"token\":\"101c45f8a3db0a615d91a7a4f0969fc3\",\"type\":\"normal\"}}\n                        \"\"\".trimIndent()\n                    ),\n                    null,\n                    MessageOriginKind.MUSIC_SHARE\n                ),\n                MusicShare(\n                    kind = NeteaseCloudMusic,\n                    title = \"ジェリーフィッシュ\",\n                    summary = \"Yunomi/ローラーガール\",\n                    jumpUrl = \"https://y.music.163.com/m/song?id=562591636&uct=QK0IOc%2FSCIO8gBNG%2Bwcbsg%3D%3D&app_version=8.7.46\",\n                    pictureUrl = \"http://p1.music.126.net/KaYSb9oYQzhl2XBeJcj8Rg==/109951165125601702.jpg\",\n                    musicUrl = \"http://music.163.com/song/media/outer/url?id=562591636&userid=324076307&sc=wmv&tn=\",\n                    brief = \"[分享]ジェリーフィッシュ\",\n                )\n            )\n        }.doDecoderChecks()\n    }\n\n    @Test\n    fun `can send MusicShare to group`() {\n        val message = MusicShare(\n            kind = NeteaseCloudMusic,\n            title = \"ジェリーフィッシュ\",\n            summary = \"Yunomi/ローラーガール\",\n            jumpUrl = \"https://y.music.163.com/m/song?id=562591636&uct=QK0IOc%2FSCIO8gBNG%2Bwcbsg%3D%3D&app_version=8.7.46\",\n            pictureUrl = \"http://p1.music.126.net/KaYSb9oYQzhl2XBeJcj8Rg==/109951165125601702.jpg\",\n            musicUrl = \"http://music.163.com/song/media/outer/url?id=562591636&userid=324076307&sc=wmv&tn=\",\n            brief = \"[分享]ジェリーフィッシュ\",\n        )\n\n        runWithFacade {\n            assertTrue {\n                outgoingPipeline.replaceProcessor(\n                    { it is MusicShareProtocol.Sender },\n                    OutgoingMessageProcessorAdapter(object : MusicShareProtocol.Sender() {\n                        override suspend fun sendMusicSharePacket(\n                            bot: QQAndroidBot,\n                            musicShare: MusicShare,\n                            contact: AbstractContact,\n                            strategy: MessageProtocolStrategy<*>\n                        ) {\n                            // nop\n                        }\n                    })\n                )\n            }\n            preprocessAndSendOutgoingImpl(defaultTarget.castUp(), message, components).let { (context, receipts) ->\n                val receipt = receipts.single()\n                assertMessageEquals(message, receipt.source.originalMessage)\n                assertMessageEquals(message, context.currentMessageChain)\n            }\n        }\n    }\n\n    @TestFactory\n    fun `test serialization for MusicShare`(): DynamicTestsResult {\n        val data = MusicShare(\n            kind = NeteaseCloudMusic,\n            title = \"ジェリーフィッシュ\",\n            summary = \"Yunomi/ローラーガール\",\n            jumpUrl = \"https://y.music.163.com/m/song?id=562591636&uct=QK0IOc%2FSCIO8gBNG%2Bwcbsg%3D%3D&app_version=8.7.46\",\n            pictureUrl = \"http://p1.music.126.net/KaYSb9oYQzhl2XBeJcj8Rg==/109951165125601702.jpg\",\n            musicUrl = \"http://music.163.com/song/media/outer/url?id=562591636&userid=324076307&sc=wmv&tn=\",\n            brief = \"[分享]ジェリーフィッシュ\",\n        )\n\n        val serialName = MusicShare.SERIAL_NAME\n        return runDynamicTests(\n            testPolymorphicInMessageContent(data, serialName),\n            testPolymorphicInSingleMessage(data, serialName),\n            testInsideMessageChain(data, serialName),\n            testContextual(data, serialName),\n        )\n    }\n\n\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/protocol/impl/PokeMessageProtocolTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.testFramework.DynamicTestsResult\nimport net.mamoe.mirai.internal.testFramework.TestFactory\nimport net.mamoe.mirai.internal.testFramework.runDynamicTests\nimport net.mamoe.mirai.message.data.PokeMessage\nimport net.mamoe.mirai.utils.hexToBytes\nimport kotlin.test.BeforeTest\nimport kotlin.test.Test\n\ninternal class PokeMessageProtocolTest : AbstractMessageProtocolTest() {\n    override val protocols: Array<out MessageProtocol> = arrayOf(TextProtocol(), PokeMessageProtocol())\n\n    @BeforeTest\n    fun `init group`() {\n        defaultTarget = bot.addGroup(123, 1230003).apply {\n            addMember(1230003, \"user3\", MemberPermission.OWNER)\n        }\n    }\n\n    @Test\n    fun `test PokeMessage`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    commonElem = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.CommonElem(\n                        serviceType = 2,\n                        pbElem = \"08 01 18 00 20 FF FF FF FF 0F 2A 00 32 00 38 00 50 00\".hexToBytes(),\n                        businessType = 1,\n                    ),\n                )\n            )\n            message(PokeMessage(\"戳一戳\", 1, -1))\n            useOrdinaryEquality()\n        }.doDecoderChecks()\n    }\n\n\n    // Unsupported kinds\n//    @Test\n//    fun `test PokeMessage`() {\n//        buildChecks {\n//            elem(\n//                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n//                    commonElem = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.CommonElem(\n//                        serviceType = 23,\n//                        pbElem = \"08 0A 10 01 1A 09 E7 95 A5 E7 95 A5 E7 95 A5\".hexToBytes(),\n//                        businessType = 10,\n//                    ),\n//                )\n//            )\n//            message(PokeMessage(\"略略略\", -1, 1))\n//            useOrdinaryEquality()\n//        }.doDecoderChecks()\n//    }\n\n    @Test\n    fun encode() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    commonElem = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.CommonElem(\n                        serviceType = 2,\n                        pbElem = \"08 01 20 FF FF FF FF FF FF FF FF FF 01 2A 09 E6 88 B3 E4 B8 80 E6 88 B3 32 05 37 2E 32 2E 30\".hexToBytes(),\n                        businessType = 1,\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"[戳一戳]请使用最新版手机QQ体验新功能。\",\n                    ),\n                )\n            )\n            message(PokeMessage.ChuoYiChuo)\n        }.doEncoderChecks()\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // serialization\n    ///////////////////////////////////////////////////////////////////////////\n\n    @TestFactory\n    fun `test serialization for PokeMessage`(): DynamicTestsResult {\n        val data = PokeMessage.ChuoYiChuo\n        val serialName = PokeMessage.SERIAL_NAME\n        return runDynamicTests(\n            testPolymorphicInMessageContent(data, serialName),\n            testPolymorphicInSingleMessage(data, serialName),\n            testInsideMessageChain(data, serialName),\n            testContextual(data, serialName),\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/protocol/impl/QuoteReplyProtocolTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport kotlinx.serialization.Polymorphic\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.message.source.OfflineMessageSourceImplData\nimport net.mamoe.mirai.internal.message.toMessageChainOnline\nimport net.mamoe.mirai.internal.testFramework.DynamicTestsResult\nimport net.mamoe.mirai.internal.testFramework.TestFactory\nimport net.mamoe.mirai.internal.testFramework.dynamicTest\nimport net.mamoe.mirai.internal.testFramework.runDynamicTests\nimport net.mamoe.mirai.internal.utils.runCoroutineInPlace\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.message.data.MessageSource.Key.quote\nimport net.mamoe.mirai.utils.hexToBytes\nimport kotlin.test.Test\n\ninternal class QuoteReplyProtocolTest : AbstractMessageProtocolTest() {\n    override val protocols: Array<out MessageProtocol> = arrayOf(QuoteReplyProtocol(), TextProtocol())\n\n    @Test\n    fun `decode referencing online group message in group`() {\n        buildCodingChecks {\n            targetGroup()\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    srcMsg = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.SourceMsg(\n                        origSeqs = intArrayOf(1803),\n                        senderUin = 1230001,\n                        time = 1653147259,\n                        flag = 1,\n                        elems = mutableListOf(\n                            net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                                    str = \"a\",\n                                ),\n                            ),\n                        ),\n                        pbReserve = \"18 AB 85 9D 81 82 80 80 80 01\".hexToBytes(),\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"s\",\n                    ),\n                ),\n            )\n            message(\n                QuoteReply(\n                    OfflineMessageSourceImplData(\n                        ids = intArrayOf(1803),\n                        internalIds = intArrayOf(539443883),\n                        time = 1653147259,\n                        originalMessage = messageChainOf(PlainText(\"a\")),\n                        kind = messageSourceKind,\n                        fromId = 1230001,\n                        targetId = 1,\n                        botId = bot.id,\n                    )\n                ), PlainText(\"s\")\n            )\n        }.doDecoderChecks()\n    }\n\n    @Test\n    fun `encode referencing offline group message in group`() {\n        buildCodingChecks {\n            targetGroup()\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    srcMsg = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.SourceMsg(\n                        origSeqs = intArrayOf(-31257),\n                        senderUin = 1230001,\n                        time = 1653326514,\n                        flag = 1,\n                        elems = mutableListOf(\n                            net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                                    str = \"a\",\n                                ),\n                            ),\n                        ),\n                        pbReserve = \"18 AE FB A2 F7 86 80 80 80 01\".hexToBytes(),\n                        srcMsg = \"0A 2C 08 B1 89 4B 10 DD F1 92 B7 07 18 09 20 0B 28 E7 8B FE FF FF FF FF FF FF 01 30 B2 85 AF 94 06 38 AE FB A2 F7 86 80 80 80 01 E0 01 01 1A 0D 0A 0B 12 05 0A 03 0A 01 61 12 02 4A 00\".hexToBytes(),\n                        toUin = 1994701021,\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"@\",\n                        attr6Buf = \"00 01 00 00 00 01 00 00 12 C4 B1 00 00\".hexToBytes(),\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"s\",\n                    ),\n                ),\n            )\n            message(\n                QuoteReply(\n                    OfflineMessageSourceImplData(\n                        ids = intArrayOf(-31257),\n                        internalIds = intArrayOf(1860746670),\n                        time = 1653326514,\n                        originalMessage = messageChainOf(PlainText(\"a\")),\n                        kind = messageSourceKind,\n                        fromId = 1230001,\n                        targetId = 1994701021,\n                        botId = bot.id,\n                    )\n                ), PlainText(\"s\")\n            )\n        }.doEncoderChecks()\n    }\n\n\n    private val onlineIncomingGroupMessage = runCoroutineInPlace {\n        net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.Msg(\n            msgHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.MsgHead(\n                fromUin = 1230001,\n                toUin = 1230002,\n                msgType = 166,\n                c2cCmd = 11,\n                msgSeq = 31245,\n                msgTime = 1653330864,\n                msgUid = 72057594652150074,\n                wseqInC2cMsghead = 31245,\n            ),\n            msgBody = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MsgBody(\n                richText = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.RichText(\n                    attr = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Attr(\n                        codePage = 0,\n                        time = 1653330864,\n                        random = 614222138,\n                        size = 9,\n                        effect = 0,\n                        charSet = 134,\n                        pitchAndFamily = 0,\n                        fontName = \"Helvetica\",\n                    ),\n                    elems = mutableListOf(\n                        net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                            text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                                str = \"a\",\n                            ),\n                        ),\n                        net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                        ),\n                        net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                            generalFlags = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.GeneralFlags(\n                                pbReserve = \"78 00 C8 01 00 F0 01 00 F8 01 00 90 02 00 CA 04 00 D2 05 02 08 61\".hexToBytes(),\n                            ),\n                        ),\n                    ),\n                ),\n            ),\n        ).toMessageChainOnline(bot)\n    }\n\n    @Test\n    fun `encode referencing online incoming group message in group`() {\n        buildCodingChecks {\n            targetGroup()\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    srcMsg = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.SourceMsg(\n                        origSeqs = intArrayOf(31245),\n                        senderUin = 1230001,\n                        time = 1653330864,\n                        flag = 1,\n                        elems = mutableListOf(\n                            net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                                    str = \"a\",\n                                ),\n                            ),\n                            net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                            ),\n                            net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                generalFlags = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.GeneralFlags(\n                                    pbReserve = \"78 00 C8 01 00 F0 01 00 F8 01 00 90 02 00 CA 04 00 D2 05 02 08 61\".hexToBytes(),\n                                ),\n                            ),\n                        ),\n                        pbReserve = \"18 BA 92 F1 A4 82 80 80 80 01\".hexToBytes(),\n                        srcMsg = \"0A 24 08 B1 89 4B 10 B2 89 4B 18 A6 01 20 0B 28 8D F4 01 30 B0 A7 AF 94 06 38 BA 92 F1 A4 82 80 80 80 01 E0 01 01 1A 2D 0A 2B 12 05 0A 03 0A 01 61 12 00 12 1C AA 02 19 9A 01 16 78 00 C8 01 00 F0 01 00 F8 01 00 90 02 00 CA 04 00 D2 05 02 08 61 12 02 4A 00\".hexToBytes(),\n                        toUin = 1230002,\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"s\",\n                    ),\n                )\n            )\n\n            message(onlineIncomingGroupMessage.quote(), PlainText(\"s\"))\n        }.doEncoderChecks()\n    }\n\n    // stranger and group temp are almost the same for friend.\n    @Test\n    fun `decode referencing online incoming private message in friend`() {\n        buildCodingChecks {\n            targetFriend()\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    srcMsg = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.SourceMsg(\n                        origSeqs = intArrayOf(34279),\n                        senderUin = 1230001,\n                        time = 1653326514,\n                        flag = 1,\n                        elems = mutableListOf(\n                            net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                                    str = \"a\",\n                                ),\n                            ),\n                        ),\n                        pbReserve = \"18 AE FB A2 F7 86 80 80 80 01\".hexToBytes(),\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"s\",\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    generalFlags = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.GeneralFlags(\n                        pbReserve = \"78 00 C8 01 00 F0 01 00 F8 01 00 90 02 00 CA 04 00 D2 05 02 08 51\".hexToBytes(),\n                    ),\n                ),\n            )\n            message(\n                QuoteReply(\n                    OfflineMessageSourceImplData(\n                        ids = intArrayOf(34279),\n                        internalIds = intArrayOf(1860746670),\n                        time = 1653326514,\n                        originalMessage = messageChainOf(PlainText(\"a\")),\n                        kind = messageSourceKind,\n                        fromId = 1230001,\n                        targetId = 0, // the referenced message was actually sending from friend 1230001 to bot.\n                        botId = bot.id,\n                    )\n                ), PlainText(\"s\")\n            )\n        }.doDecoderChecks()\n    }\n\n    @Test\n    fun `decode referencing online outgoing private message in friend`() {\n        buildCodingChecks {\n            targetFriend()\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    srcMsg = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.SourceMsg(\n                        origSeqs = intArrayOf(49858),\n                        senderUin = 1230002,\n                        time = 1653329998,\n                        flag = 1,\n                        elems = mutableListOf(\n                            net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                                    str = \"b\",\n                                ),\n                            ),\n                        ),\n                        pbReserve = \"18 C3 94 C4 B3 84 80 80 80 01\".hexToBytes(),\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"s\",\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    generalFlags = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.GeneralFlags(\n                        pbReserve = \"78 00 C8 01 00 F0 01 00 F8 01 00 90 02 00 CA 04 00 D2 05 02 08 5E\".hexToBytes(),\n                    ),\n                ),\n            )\n            message(\n                QuoteReply(\n                    OfflineMessageSourceImplData(\n                        ids = intArrayOf(49858),\n                        internalIds = intArrayOf(1181813315),\n                        time = 1653329998,\n                        originalMessage = messageChainOf(PlainText(\"b\")),\n                        kind = messageSourceKind,\n                        fromId = 1230002, // bot id\n                        targetId = 0, // the referenced message was actually sending from bot to the friend 1230001.\n                        botId = bot.id,\n                    )\n                ), PlainText(\"s\")\n            )\n        }.doDecoderChecks()\n    }\n\n    @Test\n    fun `encode referencing offline private message in friend`() {\n        buildCodingChecks {\n            targetFriend()\n\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    srcMsg = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.SourceMsg(\n                        origSeqs = intArrayOf(-31257),\n                        senderUin = 1230001,\n                        time = 1653326514,\n                        flag = 1,\n                        elems = mutableListOf(\n                            net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                                    str = \"a\",\n                                ),\n                            ),\n                        ),\n                        pbReserve = \"18 AE FB A2 F7 86 80 80 80 01\".hexToBytes(),\n                        srcMsg = \"0A 2C 08 B1 89 4B 10 DD F1 92 B7 07 18 09 20 0B 28 E7 8B FE FF FF FF FF FF FF 01 30 B2 85 AF 94 06 38 AE FB A2 F7 86 80 80 80 01 E0 01 01 1A 0D 0A 0B 12 05 0A 03 0A 01 61 12 02 4A 00\".hexToBytes(),\n                        toUin = 1994701021,\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"s\",\n                    ),\n                ),\n            )\n            message(\n                QuoteReply(\n                    OfflineMessageSourceImplData(\n                        ids = intArrayOf(-31257),\n                        internalIds = intArrayOf(1860746670),\n                        time = 1653326514,\n                        originalMessage = messageChainOf(PlainText(\"a\")),\n                        kind = messageSourceKind,\n                        fromId = 1230001,\n                        targetId = 1994701021,\n                        botId = bot.id,\n                    )\n                ), PlainText(\"s\")\n            )\n        }.doEncoderChecks()\n    }\n\n    init {\n        bot.addFriend(1230001)\n    }\n\n    private val onlineIncomingFriendMessage: MessageChain = runCoroutineInPlace {\n        net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.Msg(\n            msgHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.MsgHead(\n                fromUin = 1230001,\n                toUin = 1230002,\n                msgType = 166,\n                c2cCmd = 11,\n                msgSeq = 31222,\n                msgTime = 1653328003,\n                msgUid = 72057595832827069,\n                wseqInC2cMsghead = 31222,\n            ),\n            msgBody = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MsgBody(\n                richText = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.RichText(\n                    attr = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Attr(\n                        codePage = 0,\n                        time = 1653328002,\n                        random = 1794899133,\n                        size = 9,\n                        effect = 0,\n                        charSet = 134,\n                        pitchAndFamily = 0,\n                        fontName = \"Helvetica\",\n                    ),\n                    elems = mutableListOf(\n                        net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                            text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                                str = \"a\",\n                            ),\n                        ),\n                        net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                        ),\n                        net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                            generalFlags = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.GeneralFlags(\n                                pbReserve = \"78 00 C8 01 00 F0 01 00 F8 01 00 90 02 00 CA 04 00 D2 05 02 08 4F\".hexToBytes(),\n                            ),\n                        ),\n                    ),\n                ),\n            ),\n        ).toMessageChainOnline(bot)\n    }\n\n\n    @Test\n    fun `encode referencing online incoming private message in friend`() {\n        buildCodingChecks {\n            targetFriend()\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    srcMsg = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.SourceMsg(\n                        origSeqs = intArrayOf(31222),\n                        senderUin = 1230001,\n                        time = 1653328003,\n                        flag = 1,\n                        elems = mutableListOf(\n                            net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                                    str = \"a\",\n                                ),\n                            ),\n                            net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                            ), // Don't worry about this empty Elem, it's  from official\n                            net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                generalFlags = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.GeneralFlags(\n                                    pbReserve = \"78 00 C8 01 00 F0 01 00 F8 01 00 90 02 00 CA 04 00 D2 05 02 08 4F\".hexToBytes(),\n                                ),\n                            ),\n                        ),\n                        pbReserve = \"18 BD F9 EF D7 86 80 80 80 01\".hexToBytes(),\n                        srcMsg = \"0A 24 08 B1 89 4B 10 B2 89 4B 18 A6 01 20 0B 28 F6 F3 01 30 83 91 AF 94 06 38 BD F9 EF D7 86 80 80 80 01 E0 01 01 1A 2D 0A 2B 12 05 0A 03 0A 01 61 12 00 12 1C AA 02 19 9A 01 16 78 00 C8 01 00 F0 01 00 F8 01 00 90 02 00 CA 04 00 D2 05 02 08 4F 12 02 4A 00\".hexToBytes(),\n                        toUin = 1230002,\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"s\",\n                    ),\n                )\n            )\n\n            message(onlineIncomingFriendMessage.quote(), PlainText(\"s\"))\n        }.doEncoderChecks()\n    }\n\n    private fun CodingChecksBuilder.targetGroup() {\n        target(bot.addGroup(1, 1))\n    }\n\n    private fun CodingChecksBuilder.targetFriend() {\n        target(bot.getFriendOrFail(1230001))\n    }\n\n\n    ///////////////////////////////////////////////////////////////////////////\n    // serialization\n    ///////////////////////////////////////////////////////////////////////////\n\n    @TestFactory\n    fun `test serialization for QuoteReply`(): DynamicTestsResult {\n        val source = MessageSourceBuilder()\n            .sender(123)\n            .target(123)\n            .messages {\n                append(\"test\")\n            }\n            .build(123, MessageSourceKind.FRIEND)\n\n        val data = QuoteReply(source)\n\n        val serialName = QuoteReply.SERIAL_NAME\n        return runDynamicTests(\n            testPolymorphicInMessageMetadata(data, serialName),\n            testPolymorphicInSingleMessage(data, serialName),\n            testInsideMessageChain(data, serialName),\n            testContextual(data, serialName),\n        )\n    }\n\n\n    ///////////////////////////////////////////////////////////////////////////\n    // MessageSource serialization\n    ///////////////////////////////////////////////////////////////////////////\n\n\n    @Serializable\n    data class PolymorphicWrapperMessageSource(\n        override val message: @Polymorphic MessageSource\n    ) : PolymorphicWrapper\n\n    @Serializable\n    data class StaticWrapperMessageSource(\n        override val message: MessageSource\n    ) : PolymorphicWrapper\n\n    private fun <M : MessageSource> testPolymorphicInMessageSource(\n        data: M,\n        expectedInstance: M = data,\n    ) = listOf(dynamicTest(\"testPolymorphicInMessageSource\") {\n        testPolymorphicIn(\n            polySerializer = PolymorphicWrapperMessageSource.serializer(),\n            polyConstructor = ::PolymorphicWrapperMessageSource,\n            data = data,\n            expectedInstance = expectedInstance,\n            expectedSerialName = null,\n        )\n    })\n\n    private fun <M : MessageSource> testStaticInMessageSource(\n        data: M,\n        expectedInstance: M = data,\n    ) = listOf(dynamicTest(\"testStaticInMessageSource\") {\n        testPolymorphicIn(\n            polySerializer = StaticWrapperMessageSource.serializer(),\n            polyConstructor = ::StaticWrapperMessageSource,\n            data = data,\n            expectedInstance = expectedInstance,\n            expectedSerialName = null,\n        )\n    })\n\n    @TestFactory\n    fun `test serialization for OfflineMessageSource`(): DynamicTestsResult {\n        val data = MessageSourceBuilder()\n            .sender(123)\n            .target(123)\n            .messages {\n                append(\"test\")\n            }\n            .build(123, MessageSourceKind.FRIEND)\n\n        val serialName = MessageSource.SERIAL_NAME\n        return runDynamicTests(\n            testPolymorphicInMessageSource(data),\n            testPolymorphicInMessageMetadata(data, serialName),\n            testPolymorphicInSingleMessage(data, serialName),\n            testInsideMessageChain(data, serialName),\n            testContextual(data, serialName),\n            testStaticInMessageSource(data),\n        )\n    }\n\n    @TestFactory\n    fun `test serialization for OnlineMessageSource`(): DynamicTestsResult {\n        val data = onlineIncomingGroupMessage[MessageSource]!!\n        val expected = (data as OnlineMessageSource).toOffline()\n\n        val serialName = MessageSource.SERIAL_NAME\n        return runDynamicTests(\n            testPolymorphicInMessageSource(data, expectedInstance = expected),\n            testPolymorphicInMessageMetadata(data, serialName, expectedInstance = expected),\n            testPolymorphicInSingleMessage(data, serialName, expectedInstance = expected),\n            testInsideMessageChain(data, serialName, expectedInstance = expected),\n            testContextual(data, serialName, expectedInstance = expected),\n            testStaticInMessageSource(data, expectedInstance = expected),\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/protocol/impl/RichMessageProtocolTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport kotlinx.serialization.Polymorphic\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.testFramework.DynamicTestsResult\nimport net.mamoe.mirai.internal.testFramework.TestFactory\nimport net.mamoe.mirai.internal.testFramework.dynamicTest\nimport net.mamoe.mirai.internal.testFramework.runDynamicTests\nimport net.mamoe.mirai.message.data.RichMessage\nimport net.mamoe.mirai.utils.hexToBytes\nimport kotlin.test.BeforeTest\nimport kotlin.test.Test\n\ninternal class RichMessageProtocolTest : AbstractMessageProtocolTest() {\n    override val protocols: Array<out MessageProtocol> = arrayOf(TextProtocol(), RichMessageProtocol())\n\n    @BeforeTest\n    fun `init group`() {\n        defaultTarget = bot.addGroup(123, 1230003).apply {\n            addMember(1230003, \"user3\", MemberPermission.OWNER)\n        }\n    }\n\n    @Test\n    fun `decode from Android`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    richMsg = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.RichMsg(\n                        template1 = \"01 78 9C 7D 52 41 6F D3 30 14 FE 2B 96 A5 D1 13 71 92 36 59 03 71 2A 95 AA A8 4C 30 8D 82 44 85 50 E5 BA 9E EB 29 76 A2 C4 D9 28 C7 46 42 1C 99 10 12 37 0E 08 21 18 9C 38 00 13 FC 9A 14 10 FF 02 27 5D 27 4E 48 D6 F3 7B F6 F7 FC FC 7D EF 85 BD C7 32 06 C7 2C CB 45 A2 70 CB B1 EC 16 60 8A 26 73 A1 38 6E DD BF 37 BC DA 6D 81 5C 13 35 27 71 A2 18 6E 2D 59 DE 02 BD 28 94 39 07 39 CB 8E 05 65 A3 01 86 0E 04 9A C9 34 26 7A 13 BA 6D 08 08 D5 F5 A3 10 82 59 26 D8 21 86 0F 7F 3E 7B BA 3E 3F 7B 54 AD BE 56 AB 77 55 F9 A1 2A BF 57 E5 CB 6A F5 A6 2A CB 6A F5 A5 2A DF 42 90 27 45 46 D9 ED 9C 8F E6 18 DA 10 14 59 8C E1 42 EB 34 BF 86 D0 D2 92 45 2E A8 E5 F8 6D 8B 26 12 49 94 27 8A F7 C4 1C 7B BE EB 05 E6 D8 BF 42 64 7A BD A0 1A 1F EC D9 A3 7D BA E3 0E C7 37 46 FB 5D DE BF 73 73 C7 ED 9F D0 59 CE 77 DA 03 B3 1A 20 49 D3 E9 96 7D D7 DA B5 3A 3E 04 87 31 E1 4D 69 32 37 57 63 C1 55 13 C9 22 D6 C2 FC 6B 78 71 1D 85 C2 50 06 31 59 26 85 C6 D0 BD C0 6B 61 64 99 8A CD E7 C9 66 8F C2 54 50 5D 64 0C D0 C4 40 36 7C 0C 9D D4 D9 F2 71 7D 4B 31 8D F6 C8 64 3C 0B 92 C9 C1 93 45 EC 3E E8 B3 5B F4 A8 7B 97 63 8C 1C 3B 08 3C C7 F1 3D C7 F5 7C DB D9 B5 5D EB 28 E5 10 9C 34 65 16 8D 45 51 A8 85 8E 59 F4 1F 7D 43 B4 81 84 79 21 25 C9 96 D1 A4 50 89 14 A8 2A 3F 35 E0 F7 B5 5D 7D 6C FC B3 10 6D 51 21 AA B9 9A AC A6 39 40 11 C9 30 FC FD E3 F4 D7 AB 17 EB F3 D3 3F AF 3F AF BF 3D 87 40 D0 BA DD DB 5E 09 8B 6B 21 B9 45 15 4A 52 A6 50 2D 75 8D 40 B6 8D 3A 01 F2 6C D4 F5 0C 2F BB 13 78 76 D7 9B 1A 6F 2A AD 54 F1 7F 07 87 4C 37 FE 80 68 82 A1 36 93 C9 94 BE CC 31 45 0C 24 4D 6B 91 2F 0F 1B 1D 90 19 CF E8 2F D6 1B 08 55\".hexToBytes(),\n                        serviceId = 1,\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"https://y.music.163.com/m/song?id=562591636&uct=QK0IOc%2FSCIO8gBNG%2Bwcbsg%3D%3D&app_version=8.7.46\",\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    generalFlags = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.GeneralFlags(\n                        pbReserve = \"78 00 C8 01 00 F0 01 00 F8 01 00 90 02 00 C8 02 00 CA 04 00 D2 05 02 08 41\".hexToBytes(),\n                    ),\n                )\n            )\n            message(\n                net.mamoe.mirai.message.data.SimpleServiceMessage(\n                    serviceId = 1,\n                    content = \"\"\"\n                    <?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID=\"1\" templateID=\"123\" action=\"\" brief=\"[分享]ジェリーフィッシュ\" sourceMsgId=\"0\" url=\"https://y.music.163.com/m/song?id=562591636&amp;uct=QK0IOc%2FSCIO8gBNG%2Bwcbsg%3D%3D&amp;app_version=8.7.46\" flag=\"0\" adverSign=\"0\" multiMsgFlag=\"0\"><item layout=\"2\" advertiser_id=\"0\" aid=\"0\"><picture cover=\"http://p1.music.126.net/KaYSb9oYQzhl2XBeJcj8Rg==/109951165125601702.jpg\" w=\"0\" h=\"0\" /><title>ジェリーフィッシュ</title><summary>Yunomi/ローラーガール</summary></item><source name=\"网易云音乐\" icon=\"https://i.gtimg.cn/open/app_icon/00/49/50/85/100495085_100_m.png\" action=\"\" a_actionData=\"tencent100495085://\" appid=\"100495085\" /></msg>\n                \"\"\".trimIndent()\n                )\n            )\n        }.doDecoderChecks()\n    }\n\n    @Test\n    fun encode() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    richMsg = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.RichMsg(\n                        template1 = \"01 78 9C 7D 52 41 6F D3 30 14 FE 2B 96 A5 D1 13 71 92 36 59 03 71 2A 95 AA A8 4C 30 8D 82 44 85 50 E5 BA 9E EB 29 76 A2 C4 D9 28 C7 46 42 1C 99 10 12 37 0E 08 21 18 9C 38 00 13 FC 9A 14 10 FF 02 27 5D 27 4E 48 D6 F3 7B F6 F7 FC FC 7D EF 85 BD C7 32 06 C7 2C CB 45 A2 70 CB B1 EC 16 60 8A 26 73 A1 38 6E DD BF 37 BC DA 6D 81 5C 13 35 27 71 A2 18 6E 2D 59 DE 02 BD 28 94 39 07 39 CB 8E 05 65 A3 01 86 0E 04 9A C9 34 26 7A 13 BA 6D 08 08 D5 F5 A3 10 82 59 26 D8 21 86 0F 7F 3E 7B BA 3E 3F 7B 54 AD BE 56 AB 77 55 F9 A1 2A BF 57 E5 CB 6A F5 A6 2A CB 6A F5 A5 2A DF 42 90 27 45 46 D9 ED 9C 8F E6 18 DA 10 14 59 8C E1 42 EB 34 BF 86 D0 D2 92 45 2E A8 E5 F8 6D 8B 26 12 49 94 27 8A F7 C4 1C 7B BE EB 05 E6 D8 BF 42 64 7A BD A0 1A 1F EC D9 A3 7D BA E3 0E C7 37 46 FB 5D DE BF 73 73 C7 ED 9F D0 59 CE 77 DA 03 B3 1A 20 49 D3 E9 96 7D D7 DA B5 3A 3E 04 87 31 E1 4D 69 32 37 57 63 C1 55 13 C9 22 D6 C2 FC 6B 78 71 1D 85 C2 50 06 31 59 26 85 C6 D0 BD C0 6B 61 64 99 8A CD E7 C9 66 8F C2 54 50 5D 64 0C D0 C4 40 36 7C 0C 9D D4 D9 F2 71 7D 4B 31 8D F6 C8 64 3C 0B 92 C9 C1 93 45 EC 3E E8 B3 5B F4 A8 7B 97 63 8C 1C 3B 08 3C C7 F1 3D C7 F5 7C DB D9 B5 5D EB 28 E5 10 9C 34 65 16 8D 45 51 A8 85 8E 59 F4 1F 7D 43 B4 81 84 79 21 25 C9 96 D1 A4 50 89 14 A8 2A 3F 35 E0 F7 B5 5D 7D 6C FC B3 10 6D 51 21 AA B9 9A AC A6 39 40 11 C9 30 FC FD E3 F4 D7 AB 17 EB F3 D3 3F AF 3F AF BF 3D 87 40 D0 BA DD DB 5E 09 8B 6B 21 B9 45 15 4A 52 A6 50 2D 75 8D 40 B6 8D 3A 01 F2 6C D4 F5 0C 2F BB 13 78 76 D7 9B 1A 6F 2A AD 54 F1 7F 07 87 4C 37 FE 80 68 82 A1 36 93 C9 94 BE CC 31 45 0C 24 4D 6B 91 2F 0F 1B 1D 90 19 CF E8 2F D6 1B 08 55\".hexToBytes(),\n                        serviceId = 1,\n                    ),\n                ),\n            )\n            message(\n                net.mamoe.mirai.message.data.SimpleServiceMessage(\n                    serviceId = 1,\n                    content = \"\"\"\n                    <?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID=\"1\" templateID=\"123\" action=\"\" brief=\"[分享]ジェリーフィッシュ\" sourceMsgId=\"0\" url=\"https://y.music.163.com/m/song?id=562591636&amp;uct=QK0IOc%2FSCIO8gBNG%2Bwcbsg%3D%3D&amp;app_version=8.7.46\" flag=\"0\" adverSign=\"0\" multiMsgFlag=\"0\"><item layout=\"2\" advertiser_id=\"0\" aid=\"0\"><picture cover=\"http://p1.music.126.net/KaYSb9oYQzhl2XBeJcj8Rg==/109951165125601702.jpg\" w=\"0\" h=\"0\" /><title>ジェリーフィッシュ</title><summary>Yunomi/ローラーガール</summary></item><source name=\"网易云音乐\" icon=\"https://i.gtimg.cn/open/app_icon/00/49/50/85/100495085_100_m.png\" action=\"\" a_actionData=\"tencent100495085://\" appid=\"100495085\" /></msg>\n                \"\"\".trimIndent()\n                )\n            )\n        }.doEncoderChecks()\n    }\n\n    // no encoder. specially handled, no test for now.\n\n\n    ///////////////////////////////////////////////////////////////////////////\n    // serialization\n    ///////////////////////////////////////////////////////////////////////////\n\n\n    @Serializable\n    data class PolymorphicWrapperRichMessage(\n        override val message: @Polymorphic RichMessage\n    ) : PolymorphicWrapper\n\n    private fun <M : RichMessage> testPolymorphicInRichMessage(\n        data: M,\n        expectedSerialName: String,\n        expectedInstance: M = data,\n    ) = listOf(dynamicTest(\"testPolymorphicInRichMessage\") {\n        testPolymorphicIn(\n            polySerializer = PolymorphicWrapperRichMessage.serializer(),\n            polyConstructor = ::PolymorphicWrapperRichMessage,\n            data = data,\n            expectedSerialName = expectedSerialName,\n            expectedInstance = expectedInstance\n        )\n    })\n\n    @TestFactory\n    fun `test serialization for RichMessage`(): DynamicTestsResult {\n        val data = net.mamoe.mirai.message.data.SimpleServiceMessage(\n            serviceId = 1,\n            content = \"\"\"\n                    <?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID=\"1\" templateID=\"123\" action=\"\" brief=\"[分享]ジェリーフィッシュ\" sourceMsgId=\"0\" url=\"https://y.music.163.com/m/song?id=562591636&amp;uct=QK0IOc%2FSCIO8gBNG%2Bwcbsg%3D%3D&amp;app_version=8.7.46\" flag=\"0\" adverSign=\"0\" multiMsgFlag=\"0\"><item layout=\"2\" advertiser_id=\"0\" aid=\"0\"><picture cover=\"http://p1.music.126.net/KaYSb9oYQzhl2XBeJcj8Rg==/109951165125601702.jpg\" w=\"0\" h=\"0\" /><title>ジェリーフィッシュ</title><summary>Yunomi/ローラーガール</summary></item><source name=\"网易云音乐\" icon=\"https://i.gtimg.cn/open/app_icon/00/49/50/85/100495085_100_m.png\" action=\"\" a_actionData=\"tencent100495085://\" appid=\"100495085\" /></msg>\n                \"\"\".trimIndent()\n        )\n\n        val serialName = net.mamoe.mirai.message.data.SimpleServiceMessage.SERIAL_NAME\n        return runDynamicTests(\n            testPolymorphicInRichMessage(data, serialName),\n            testPolymorphicInMessageContent(data, serialName),\n            testPolymorphicInSingleMessage(data, serialName),\n            testInsideMessageChain(data, serialName),\n            testContextual(data, serialName),\n        )\n    }\n\n    @TestFactory\n    fun `test serialization for LightApp`(): DynamicTestsResult {\n        val data = net.mamoe.mirai.message.data.LightApp(\n            content = \"\"\"\n                    <?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID=\"1\" templateID=\"123\" action=\"\" brief=\"[分享]ジェリーフィッシュ\" sourceMsgId=\"0\" url=\"https://y.music.163.com/m/song?id=562591636&amp;uct=QK0IOc%2FSCIO8gBNG%2Bwcbsg%3D%3D&amp;app_version=8.7.46\" flag=\"0\" adverSign=\"0\" multiMsgFlag=\"0\"><item layout=\"2\" advertiser_id=\"0\" aid=\"0\"><picture cover=\"http://p1.music.126.net/KaYSb9oYQzhl2XBeJcj8Rg==/109951165125601702.jpg\" w=\"0\" h=\"0\" /><title>ジェリーフィッシュ</title><summary>Yunomi/ローラーガール</summary></item><source name=\"网易云音乐\" icon=\"https://i.gtimg.cn/open/app_icon/00/49/50/85/100495085_100_m.png\" action=\"\" a_actionData=\"tencent100495085://\" appid=\"100495085\" /></msg>\n                \"\"\".trimIndent()\n        )\n\n        val serialName = net.mamoe.mirai.message.data.LightApp.SERIAL_NAME\n        return runDynamicTests(\n            testPolymorphicInRichMessage(data, serialName),\n            testPolymorphicInMessageContent(data, serialName),\n            testPolymorphicInSingleMessage(data, serialName),\n            testInsideMessageChain(data, serialName),\n            testContextual(data, serialName),\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/protocol/impl/SuperFaceProtocolTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.testFramework.DynamicTestsResult\nimport net.mamoe.mirai.internal.testFramework.TestFactory\nimport net.mamoe.mirai.internal.testFramework.runDynamicTests\nimport net.mamoe.mirai.internal.utils.io.serialization.loadAs\nimport net.mamoe.mirai.message.data.Face\nimport net.mamoe.mirai.message.data.SuperFace\nimport net.mamoe.mirai.utils.hexToBytes\nimport kotlin.test.BeforeTest\nimport kotlin.test.Test\n\ninternal class SuperFaceProtocolTest : AbstractMessageProtocolTest() {\n    override val protocols: Array<out MessageProtocol> = arrayOf(SuperFaceProtocol(), TextProtocol())\n\n    @BeforeTest\n    fun `init group`() {\n        defaultTarget = bot.addGroup(123, 1230003).apply {\n            addMember(1230003, \"user3\", MemberPermission.OWNER)\n        }\n    }\n\n    @Test\n    fun `group AnimatedSticker receive from Android client`() {\n        buildCodingChecks {\n            elem(\n                \"AA 03 20 08 25 12 1A 0A 01 31 12 02 31 36 18 05 20 01 28 01 32 00 3A 07 2F E6 B5 81 E6 B3 AA 48 01 18 01\".hexToBytes()\n                    .loadAs(net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem.serializer())\n            )\n            elem(\n                \"AA 03 23 08 25 12 1D 0A 01 31 12 02 31 33 18 72 20 01 28 02 32 01 35 3A 07 2F E7 AF AE E7 90 83 42 00 48 01 18 02\".hexToBytes()\n                    .loadAs(net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem.serializer())\n            )\n            message(\n                SuperFace.from(Face(Face.LAN_QIU))\n            )\n        }.doDecoderChecks()\n    }\n\n    @TestFactory\n    fun `test serialization`(): DynamicTestsResult {\n        val data = SuperFace.from(Face(Face.LAN_QIU))\n        val serialName = SuperFace.SERIAL_NAME\n        return runDynamicTests(\n            testPolymorphicInMessageContent(data, serialName),\n            testPolymorphicInSingleMessage(data, serialName),\n            testInsideMessageChain(data, serialName),\n            testContextual(data, serialName),\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/protocol/impl/TextProtocolTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.testFramework.DynamicTestsResult\nimport net.mamoe.mirai.internal.testFramework.TestFactory\nimport net.mamoe.mirai.internal.testFramework.runDynamicTests\nimport net.mamoe.mirai.message.data.At\nimport net.mamoe.mirai.message.data.AtAll\nimport net.mamoe.mirai.message.data.PlainText\nimport net.mamoe.mirai.utils.hexToBytes\nimport kotlin.test.BeforeTest\nimport kotlin.test.Test\n\ninternal class TextProtocolTest : AbstractMessageProtocolTest() {\n    override val protocols: Array<out MessageProtocol> = arrayOf(TextProtocol())\n\n    @BeforeTest\n    fun `init group`() {\n        defaultTarget = bot.addGroup(123, 1230003).apply {\n            addMember(1230003, \"user3\", MemberPermission.OWNER)\n        }\n    }\n\n    @Test\n    fun `test PlainText`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"hello\",\n                    ),\n                )\n            )\n            message(PlainText(\"hello\"))\n        }.doBothChecks()\n    }\n\n    @Test\n    fun `test AtAll`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"@全体成员\",\n                        attr6Buf = \"00 01 00 00 00 05 01 00 00 00 00 00 00\".hexToBytes(),\n                    ),\n                )\n            )\n            message(AtAll)\n        }.doBothChecks()\n    }\n\n    @Test\n    fun `AtAll auto append spaces`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"@全体成员\",\n                        attr6Buf = \"00 01 00 00 00 05 01 00 00 00 00 00 00\".hexToBytes(),\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"Hi\",\n                    ),\n                ),\n            )\n            message(AtAll, PlainText(\"Hi\"))\n        }.doEncoderChecks()\n    }\n\n    @Test\n    fun `test At`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"@user3\",\n                        attr6Buf = \"00 01 00 00 00 06 00 00 12 C4 B3 00 00\".hexToBytes(),\n                    ),\n                )\n            )\n            message(At(1230003))\n        }.doBothChecks()\n    }\n\n    @Test\n    fun `At auto append spaces`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"@user3\",\n                        attr6Buf = \"00 01 00 00 00 06 00 00 12 C4 B3 00 00\".hexToBytes(),\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \" \",\n                    ),\n                ),\n            )\n            message(At(1230003))\n            message(PlainText(\" \"))\n            target(bot.addGroup(123, 1230003).apply {\n                addMember(1230003, \"user3\", MemberPermission.OWNER)\n            })\n        }.doBothChecks()\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // serialization\n    ///////////////////////////////////////////////////////////////////////////\n\n    @TestFactory\n    fun `test serialization for PlainText`(): DynamicTestsResult {\n        val data = PlainText(\n            content = \"\"\"foo\"\"\",\n        )\n\n        val serialName = PlainText.SERIAL_NAME\n        return runDynamicTests(\n            testPolymorphicInMessageContent(data, serialName),\n            testPolymorphicInSingleMessage(data, serialName),\n            testInsideMessageChain(data, serialName),\n            testContextual(data, serialName),\n        )\n    }\n\n    @TestFactory\n    fun `test serialization for At`(): DynamicTestsResult {\n        val data = At(\n            100\n        )\n\n        val serialName = At.SERIAL_NAME\n        return runDynamicTests(\n            testPolymorphicInMessageContent(data, serialName),\n            testPolymorphicInSingleMessage(data, serialName),\n            testInsideMessageChain(data, serialName),\n            testContextual(data, serialName),\n        )\n    }\n\n    @TestFactory\n    fun `test serialization for AtAll`(): DynamicTestsResult {\n        val data = AtAll\n        val serialName = AtAll.SERIAL_NAME\n        return runDynamicTests(\n            testPolymorphicInMessageContent(data, serialName),\n            testPolymorphicInSingleMessage(data, serialName),\n            testInsideMessageChain(data, serialName),\n            testContextual(data, serialName),\n        )\n    }\n\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/protocol/impl/VipFaceProtocolTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocol\nimport net.mamoe.mirai.internal.testFramework.DynamicTestsResult\nimport net.mamoe.mirai.internal.testFramework.TestFactory\nimport net.mamoe.mirai.internal.testFramework.runDynamicTests\nimport net.mamoe.mirai.message.data.VipFace\nimport net.mamoe.mirai.utils.hexToBytes\nimport kotlin.test.BeforeTest\nimport kotlin.test.Test\n\ninternal class VipFaceProtocolTest : AbstractMessageProtocolTest() {\n    override val protocols: Array<out MessageProtocol> = arrayOf(VipFaceProtocol(), TextProtocol())\n\n    @BeforeTest\n    fun `init group`() {\n        defaultTarget = bot.addGroup(123, 1230003).apply {\n            addMember(1230003, \"user3\", MemberPermission.OWNER)\n        }\n    }\n\n    @Test\n    fun `test decode`() {\n        buildCodingChecks {\n            elem(\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    commonElem = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.CommonElem(\n                        serviceType = 23,\n                        pbElem = \"08 09 10 01 1A 06 E6 A6 B4 E8 8E B2\".hexToBytes(),\n                        businessType = 9,\n                    ),\n                ),\n                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                        str = \"[榴莲]x1\",\n                        pbReserve = \"0A 34 5B E6 A6 B4 E8 8E B2 5D E8 AF B7 E4 BD BF E7 94 A8 E6 9C 80 E6 96 B0 E7 89 88 E6 89 8B E6 9C BA 51 51 E4 BD 93 E9 AA 8C E6 96 B0 E5 8A 9F E8 83 BD E3 80 82\".hexToBytes(),\n                    ),\n                )\n            )\n            message(VipFace(VipFace.LiuLian, 1))\n            useOrdinaryEquality()\n        }.doDecoderChecks()\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // serialization\n    ///////////////////////////////////////////////////////////////////////////\n\n    @TestFactory\n    fun `test serialization for VipFace`(): DynamicTestsResult {\n        val data = VipFace(\n            VipFace.LiuLian, 1\n        )\n\n        val serialName = VipFace.SERIAL_NAME\n        return runDynamicTests(\n            testPolymorphicInMessageContent(data, serialName),\n            testPolymorphicInSingleMessage(data, serialName),\n            testInsideMessageChain(data, serialName),\n            testContextual(data, serialName),\n        )\n    }\n\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/message/serialization/AbstractMessageSerializationTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.serialization\n\nimport net.mamoe.mirai.internal.test.AbstractTest\n\ninternal abstract class AbstractMessageSerializationTest : AbstractTest()"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/AwaitStateTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network\n\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.flow.consumeAsFlow\nimport kotlinx.coroutines.selects.select\nimport net.mamoe.mirai.internal.network.framework.AbstractMockNetworkHandlerTest\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.State.*\nimport net.mamoe.mirai.internal.network.handler.awaitState\nimport net.mamoe.mirai.internal.network.handler.awaitStateChange\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.utils.ConcurrentLinkedDeque\nimport kotlin.coroutines.ContinuationInterceptor\nimport kotlin.test.*\n\ninternal class AwaitStateTest : AbstractMockNetworkHandlerTest() {\n\n    @Test\n    fun `test select onStateChanged`() = runBlockingUnit {\n        createNetworkHandler().run {\n            assertState(INITIALIZED)\n            val queue = ConcurrentLinkedDeque<NetworkHandler.State>()\n            launch(start = CoroutineStart.UNDISPATCHED) {\n                select<Unit> { stateChannel.onReceive { queue.add(it) } }\n                assertEquals(1, queue.size)\n                assertEquals(OK, queue.first())\n            }\n            launch {\n                assertNotNull(setState(OK))\n            }\n\n        }\n    }\n\n    @Test\n    fun `test whileSelect onStateChanged on demand`() = runBlockingUnit(singleThreadDispatcher + Job()) {\n        createNetworkHandler().run {\n            assertState(INITIALIZED)\n            val queue = ConcurrentLinkedDeque<NetworkHandler.State>()\n            val selector = launch(\n                singleThreadDispatcher + CoroutineExceptionHandler { _, throwable ->\n                    if (throwable !is CancellationException) throwable.printStackTrace()\n                },\n                start = CoroutineStart.UNDISPATCHED\n            ) {\n                assertSame(singleThreadDispatcher, coroutineContext[ContinuationInterceptor])\n                stateChannel.consumeAsFlow().collect { queue.add(it) }\n            }\n\n            setState(OK)\n            yield()\n            setState(CLOSED)\n            yield()\n            selector.cancel()\n\n            runCatching { selector.join() }\n\n            assertEquals(2, queue.size)\n            assertEquals(OK, queue.first())\n            assertEquals(CLOSED, queue.drop(1).first())\n        }\n    }\n\n    // single thread so we can use [yield] to transfer dispatch\n    private val singleThreadDispatcher: CoroutineDispatcher = borrowSingleThreadDispatcher()\n\n    @Test\n    fun `test whileSelect onStateChanged drop if not listening`() = runBlockingUnit(singleThreadDispatcher + Job()) {\n        createNetworkHandler().run {\n            assertState(INITIALIZED)\n            val queue = ConcurrentLinkedDeque<NetworkHandler.State>()\n\n            assertNotNull(setState(CONNECTING))\n            assertNotNull(setState(LOADING))\n\n            val selector = launch(\n                singleThreadDispatcher + CoroutineExceptionHandler { _, throwable ->\n                    if (throwable !is CancellationException) throwable.printStackTrace()\n                },\n                start = CoroutineStart.UNDISPATCHED\n            ) {\n//                while (select { stateChannel.onReceive { queue.add(it); true } });\n                stateChannel.consumeAsFlow().collect { queue.add(it) }\n            }\n\n            assertNotNull(setState(OK))\n            yield() // yields the thread to run coroutine of select\n            assertNotNull(setState(CLOSED))\n            yield()\n            selector.cancel()\n\n            runCatching { selector.join() }\n\n            assertEquals(OK, queue.first(), queue.toString())\n            assertEquals(2, queue.size)\n            assertEquals(CLOSED, queue.drop(1).first())\n        }\n    }\n\n    @Test\n    fun `can await`() = runBlockingUnit(singleThreadDispatcher + Job()) {\n        createNetworkHandler().run {\n            assertState(INITIALIZED)\n            val job = launch(start = CoroutineStart.UNDISPATCHED) {\n                awaitState(CLOSED)\n                assertState(CLOSED)\n            }\n            yield()\n            assertTrue { job.isActive }\n\n            setState(OK)\n            yield()\n            assertTrue { job.isActive }\n\n            setState(CLOSED)\n            yield()\n        }\n    }\n\n    @Test\n    fun `can await change`() = runBlockingUnit(singleThreadDispatcher + Job()) {\n        createNetworkHandler().run {\n            assertState(INITIALIZED)\n            val job = launch(start = CoroutineStart.UNDISPATCHED) {\n                awaitStateChange()\n            }\n            yield()\n            assertTrue { job.isActive }\n\n            setState(CLOSED)\n            yield()\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/PacketCodecTest.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network\n\nimport net.mamoe.mirai.internal.test.AbstractTest\n\ninternal class PacketCodecTest : AbstractCodecTest()\n\ninternal abstract class AbstractCodecTest : AbstractTest()"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/ServerListTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(TestOnly::class)\n\npackage net.mamoe.mirai.internal.network\n\nimport net.mamoe.mirai.internal.network.components.ServerAddress\nimport net.mamoe.mirai.internal.network.components.ServerList\nimport net.mamoe.mirai.internal.network.components.ServerListImpl\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.utils.TestOnly\nimport kotlin.test.*\n\ninternal class ServerListTest : AbstractTest() {\n\n    @Test\n    fun canInitializeDefaults() {\n        assertNotEquals(0, ServerList.DEFAULT_SERVER_LIST.size)\n    }\n\n    @Test\n    fun `can poll current for initial`() {\n        assertNotNull(ServerListImpl().pollCurrent())\n    }\n\n    @Test\n    fun `last poll ip is updated when polled`() {\n        val instance = ServerListImpl()\n        val old = instance.getLastPolledIP()\n        assertNotNull(old)\n        assertTrue { old.isEmpty() }\n        assertNotNull(instance.pollCurrent())\n        val new = instance.getLastPolledIP()\n        assertNotNull(new)\n        assertNotEquals(old, new)\n    }\n\n    @Test\n    fun `not empty for initial`() {\n        assertNotNull(ServerListImpl().pollAny())\n    }\n\n    @Test\n    fun `poll current will end with null`() {\n        val instance = ServerListImpl()\n        repeat(100) {\n            instance.pollCurrent()\n        }\n        assertNull(instance.pollCurrent())\n    }\n\n    @Test\n    fun `poll any is always not null`() {\n        val instance = ServerListImpl()\n        repeat(100) {\n            instance.pollAny()\n        }\n        assertNotNull(instance.pollAny())\n    }\n\n    @Test\n    fun `preferred cannot be empty`() {\n        assertFailsWith<IllegalArgumentException> {\n            ServerListImpl().setPreferred(emptyList())\n        }\n    }\n\n    @Test\n    fun `use preferred`() {\n        val instance = ServerListImpl()\n        val addr = ServerAddress(\"test\", 1)\n        instance.setPreferred(listOf(addr))\n        repeat(100) {\n            instance.pollAny()\n        }\n        assertSame(addr, instance.pollAny())\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/auth/AbstractBotAuthTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.auth\n\nimport net.mamoe.mirai.auth.BotAuthInfo\nimport net.mamoe.mirai.auth.BotAuthResult\nimport net.mamoe.mirai.auth.BotAuthSession\nimport net.mamoe.mirai.auth.BotAuthorization\nimport net.mamoe.mirai.internal.network.components.SsoProcessor\nimport net.mamoe.mirai.internal.network.components.SsoProcessorContext\nimport net.mamoe.mirai.internal.network.components.SsoProcessorImpl\nimport net.mamoe.mirai.internal.network.framework.AbstractCommonNHTestWithSelector\nimport net.mamoe.mirai.internal.network.framework.PacketReplierDslBuilder\nimport net.mamoe.mirai.internal.network.framework.buildPacketReplier\n\ninternal abstract class AbstractBotAuthTest : AbstractCommonNHTestWithSelector() {\n    init {\n        // Use real processor to test login\n        overrideComponents[SsoProcessor] = SsoProcessorImpl(overrideComponents[SsoProcessorContext])\n    }\n\n    protected fun setAuthorization(authorize: suspend (session: BotAuthSession, info: BotAuthInfo) -> BotAuthResult) {\n        // Run a real SsoProcessor, just without sending packets\n        bot.account.authorization = object : BotAuthorization {\n            override suspend fun authorize(session: BotAuthSession, info: BotAuthInfo): BotAuthResult {\n                return authorize(session, info)\n            }\n        }\n    }\n\n    // Use the same replier even after reconnection\n    protected fun usePacketReplierThroughout(builderAction: PacketReplierDslBuilder.() -> Unit) {\n        val replier = buildPacketReplier {\n            builderAction()\n        }\n        onEachNetworkInstance {\n            addPacketReplier(replier) // share the decisions\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/auth/AuthorizationReasonTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.auth\n\nimport kotlinx.coroutines.test.runTest\nimport kotlinx.coroutines.yield\nimport net.mamoe.mirai.auth.AuthReason\nimport net.mamoe.mirai.auth.BotAuthResult\nimport net.mamoe.mirai.internal.MockAccount\nimport net.mamoe.mirai.internal.contact.uin\nimport net.mamoe.mirai.internal.network.components.AccountSecretsManager\nimport net.mamoe.mirai.internal.network.framework.createWLoginSigInfo\nimport net.mamoe.mirai.internal.network.protocol.data.jce.RequestPushForceOffline\nimport net.mamoe.mirai.internal.network.protocol.data.jce.SvcRespRegister\nimport net.mamoe.mirai.internal.network.protocol.packet.IncomingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.receive.MessageSvcPushForceOffline\nimport net.mamoe.mirai.internal.network.protocol.packet.login.StatSvc\nimport net.mamoe.mirai.internal.network.protocol.packet.login.WtLogin\nimport org.junit.jupiter.api.Disabled\nimport java.util.concurrent.atomic.AtomicReference\nimport kotlin.test.Test\nimport kotlin.test.assertFalse\nimport kotlin.test.assertIs\nimport kotlin.test.assertTrue\n\ninternal class AuthorizationReasonTest : AbstractBotAuthTest() {\n    @Test\n    fun `first login without fast login`() = runTest {\n        var isFirstLogin: Boolean = false\n        var authReason: AuthReason? = AuthReason.Unknown(bot, null)\n\n        setAuthorization { auth, info ->\n            isFirstLogin = info.isFirstLogin\n            authReason = info.reason\n\n            auth.authByPassword(\"\")\n            return@setAuthorization object : BotAuthResult {}\n        }\n\n        usePacketReplierThroughout {\n            expect(WtLogin.Login) reply {\n                bot.components[AccountSecretsManager].getSecrets(MockAccount)\n                    ?.wLoginSigInfo = createWLoginSigInfo(bot.id)\n\n                WtLogin.Login.LoginPacketResponse.Success(bot)\n            }\n            expect(StatSvc.Register) reply { StatSvc.Register.Response(SvcRespRegister()) }\n            expect(StatSvc.Register) reply { StatSvc.Register.Response(SvcRespRegister()) }\n        }\n\n        bot.components[AccountSecretsManager].getSecrets(MockAccount)?.wLoginSigInfoField = null\n        bot.login()\n\n        assertTrue(isFirstLogin)\n        assertIs<AuthReason.FreshLogin>(authReason)\n    }\n\n    @Test\n    fun `first login with fast login success`() = runTest {\n        var authorizationCalled = false\n        setAuthorization { auth, _ ->\n            authorizationCalled = true\n\n            auth.authByPassword(\"\")\n            return@setAuthorization object : BotAuthResult {}\n        }\n\n        usePacketReplierThroughout {\n            expect(WtLogin.ExchangeEmp) reply { WtLogin.Login.LoginPacketResponse.Success(bot) }\n            expect(StatSvc.Register) reply { StatSvc.Register.Response(SvcRespRegister()) }\n            expect(StatSvc.Register) reply { StatSvc.Register.Response(SvcRespRegister()) }\n        }\n\n        bot.login()\n\n        assertFalse(authorizationCalled)\n    }\n\n    @Test\n    fun `first login with fast login fail`() = runTest {\n        var isFirstLogin: Boolean = false\n        var authReason: AuthReason? = null\n\n        setAuthorization { auth, info ->\n            isFirstLogin = info.isFirstLogin\n            authReason = info.reason\n\n            auth.authByPassword(\"\")\n            return@setAuthorization object : BotAuthResult {}\n        }\n\n        usePacketReplierThroughout {\n            expect(WtLogin.ExchangeEmp) reply { WtLogin.Login.LoginPacketResponse.Error(bot, 1, \"\", \"\", \", \") }\n            expect(WtLogin.Login) reply { WtLogin.Login.LoginPacketResponse.Success(bot) }\n            expect(StatSvc.Register) reply { StatSvc.Register.Response(SvcRespRegister()) }\n            expect(StatSvc.Register) reply { StatSvc.Register.Response(SvcRespRegister()) }\n        }\n\n        bot.login()\n\n        assertTrue(isFirstLogin)\n        assertIs<AuthReason.FastLoginError>(authReason)\n    }\n\n    @Test\n    @Disabled // FIXME - bad github ci, but it is ok on local computer, reason unknown\n    fun `force offline`() = runTest {\n        var isFirstLogin: Boolean = true\n\n        // volatile\n        val authReason = AtomicReference<AuthReason?>(null)\n\n        setAuthorization { auth, info ->\n            isFirstLogin = info.isFirstLogin\n            authReason.set(info.reason)\n\n            auth.authByPassword(\"\")\n            return@setAuthorization object : BotAuthResult {}\n        }\n\n        usePacketReplierThroughout {\n            expect(WtLogin.ExchangeEmp) reply { WtLogin.Login.LoginPacketResponse.Success(bot) }\n            expect(StatSvc.Register) reply { StatSvc.Register.Response(SvcRespRegister()) }\n            expect(WtLogin.Login) reply {\n                bot.components[AccountSecretsManager].getSecrets(MockAccount)\n                    ?.wLoginSigInfo = createWLoginSigInfo(bot.id)\n                WtLogin.Login.LoginPacketResponse.Success(bot)\n            }\n            expect(StatSvc.Register) reply { StatSvc.Register.Response(SvcRespRegister()) }\n            expect(StatSvc.Register) reply { StatSvc.Register.Response(SvcRespRegister()) }\n        }\n\n        bot.configuration.autoReconnectOnForceOffline = true\n        bot.login()\n\n        network.currentInstance().collectReceived(\n            IncomingPacket(\n                MessageSvcPushForceOffline.commandName,\n                RequestPushForceOffline(bot.uin, tips = \"force offline manually in test\")\n            )\n        )\n\n        eventDispatcher.joinBroadcast() // why test finished before code reaches end??\n        yield()\n\n        assertFalse(isFirstLogin)\n        assertIs<AuthReason.ForceOffline>(authReason.get(), message = authReason.toString())\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/auth/BotAuthorizationTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.auth\n\nimport kotlinx.coroutines.test.runTest\nimport net.mamoe.mirai.internal.network.protocol.data.jce.SvcRespRegister\nimport net.mamoe.mirai.internal.network.protocol.packet.login.StatSvc\nimport net.mamoe.mirai.internal.network.protocol.packet.login.WtLogin\nimport net.mamoe.mirai.network.BotAuthorizationException\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFailsWith\nimport kotlin.test.assertIs\n\ninternal class BotAuthorizationTest : AbstractBotAuthTest() {\n    @Test\n    fun `authorization failure throws BotAuthorizationException`() = runTest {\n        // Run a real SsoProcessor, just without sending packets\n        setAuthorization { _, _ ->\n            throw IllegalStateException(\"Oops\")\n        }\n\n        usePacketReplierThroughout {\n            expect(WtLogin.ExchangeEmp) reply { WtLogin.Login.LoginPacketResponse.Error(bot, 1, \"\", \"\", \"\") }\n            expect(WtLogin.Login) reply { WtLogin.Login.LoginPacketResponse.Success(bot) }\n            expect(StatSvc.Register) reply { StatSvc.Register.Response(SvcRespRegister()) }\n        }\n\n        assertFailsWith<BotAuthorizationException> {\n            bot.login()\n        }.run {\n            val cause = cause\n            assertIs<IllegalStateException>(cause)\n            assertEquals(\"Oops\", cause.message)\n        }\n\n        // Stacktrace like this:\n\n        //net.mamoe.mirai.network.BotAuthorizationException: BotAuthorization(net.mamoe.mirai.internal.network.auth.AbstractBotAuthTest$authorization failure throws BotAuthorizationException$1$2@157c6b0f) threw an exception during authorization process. See cause below.\n        //\tat net.mamoe.mirai.internal.network.components.SsoProcessorImpl.login(SsoProcessor.kt:232)\n        //Caused by: java.lang.IllegalStateException: Oops\n        //\tat net.mamoe.mirai.internal.network.auth.AbstractBotAuthTest$authorization failure throws BotAuthorizationException$1$2.authorize(AbstractBotAuthTest.kt:44)\n        //\t(Coroutine boundary)\n        //\tat net.mamoe.mirai.utils.channels.CoroutineOnDemandReceiveChannel.receiveOrNull(OnDemandChannelImpl.kt:237)\n        //\t(Coroutine creation stacktrace)\n        //\tat net.mamoe.mirai.internal.network.handler.CommonNetworkHandler$StateConnecting.startState(CommonNetworkHandler.kt:244)\n        //Caused by: java.lang.IllegalStateException: Oops\n        //\tat net.mamoe.mirai.internal.network.auth.AbstractBotAuthTest$authorization failure throws BotAuthorizationException$1$2.authorize(AbstractBotAuthTest.kt:44)\n    }\n\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/component/AbstractMutableComponentStorageTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.component\n\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal abstract class AbstractMutableComponentStorageTest : AbstractTest() {\n\n    internal data class TestComponent2(\n        val value: Int\n    ) {\n        companion object : ComponentKey<TestComponent2>\n    }\n\n    internal data class TestComponent3(\n        val value: Int\n    ) {\n        companion object : ComponentKey<TestComponent3>\n    }\n\n    protected abstract fun createStorage(): MutableComponentStorage\n\n    @Test\n    fun `can put component`() {\n        val storage = createStorage().apply {\n            set(TestComponent2, TestComponent2(1))\n        }\n        assertEquals(1, storage.size)\n    }\n\n    @Test\n    fun `can put multiple components with different key`() {\n        val storage = createStorage().apply {\n            set(TestComponent2, TestComponent2(1))\n            set(TestComponent3, TestComponent3(1))\n        }\n        assertEquals(2, storage.size)\n    }\n\n    @Test\n    fun `can get component`() {\n        val storage = createStorage().apply {\n            set(TestComponent2, TestComponent2(1))\n        }\n        assertEquals(1, storage.size)\n        assertEquals(TestComponent2(1), storage[TestComponent2])\n    }\n\n    @Test\n    fun `can override component with same key`() {\n        val storage = createStorage().apply {\n            set(TestComponent2, TestComponent2(1))\n            set(TestComponent2, TestComponent2(2))\n        }\n        assertEquals(1, storage.size)\n        assertEquals(TestComponent2(2), storage[TestComponent2])\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/component/BotAuthControlTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.component\n\nimport kotlinx.coroutines.test.runTest\nimport kotlinx.coroutines.yield\nimport net.mamoe.mirai.auth.*\nimport net.mamoe.mirai.internal.network.auth.AuthControl\nimport net.mamoe.mirai.internal.network.components.SsoProcessorContext\nimport net.mamoe.mirai.internal.network.components.SsoProcessorImpl\nimport net.mamoe.mirai.internal.network.framework.AbstractCommonNHTest\nimport net.mamoe.mirai.network.CustomLoginFailedException\nimport net.mamoe.mirai.utils.BotConfiguration\nimport net.mamoe.mirai.utils.DeviceInfo\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport kotlin.properties.Delegates\nimport kotlin.reflect.KClass\nimport kotlin.test.Test\nimport kotlin.test.assertFailsWith\nimport kotlin.test.fail\n\ninternal class BotAuthControlTest : AbstractCommonNHTest() {\n    private val botAuthInfo = object : BotAuthInfo {\n        override val id: Long\n            get() = bot.id\n        override val deviceInfo: DeviceInfo\n            get() = bot.components[SsoProcessorContext].device\n        override val configuration: BotConfiguration\n            get() = bot.configuration\n\n        override val isFirstLogin: Boolean\n            get() = false\n\n        override val reason: AuthReason by Delegates.notNull()\n    }\n\n    private suspend fun AuthControl.assertRequire(exceptedType: KClass<*>) {\n        println(\"Requiring auth method\")\n        val nextAuth = acquireAuth()\n        println(\"Got $nextAuth\")\n        yield()\n\n        if (nextAuth is SsoProcessorImpl.AuthMethod.Error) {\n            fail(cause = nextAuth.exception)\n        }\n        if (exceptedType.isInstance(nextAuth)) return\n        fail(\"Type not match, excepted $exceptedType but got ${nextAuth::class}\")\n    }\n\n    @Test\n    fun `auth test`() = runTest {\n\n        val control = AuthControl(botAuthInfo, object : BotAuthorization {\n            override suspend fun authorize(session: BotAuthSession, info: BotAuthInfo): BotAuthResult {\n                return session.authByPassword(EMPTY_BYTE_ARRAY)\n            }\n        }, bot.logger, backgroundScope.coroutineContext)\n\n        control.start()\n        control.assertRequire(SsoProcessorImpl.AuthMethod.Pwd::class)\n        control.actComplete()\n        control.assertRequire(SsoProcessorImpl.AuthMethod.NotAvailable::class)\n\n    }\n\n    @Test\n    fun `test auth failed and reselect`() = runTest {\n        class MyLoginFailedException : CustomLoginFailedException(killBot = false)\n\n        val control = AuthControl(botAuthInfo, object : BotAuthorization {\n            override suspend fun authorize(session: BotAuthSession, info: BotAuthInfo): BotAuthResult {\n                assertFailsWith<MyLoginFailedException> { session.authByPassword(EMPTY_BYTE_ARRAY); println(\"!\") }\n                println(\"114514\")\n                return session.authByPassword(EMPTY_BYTE_ARRAY)\n            }\n        }, bot.logger, backgroundScope.coroutineContext)\n\n        control.start()\n        control.assertRequire(SsoProcessorImpl.AuthMethod.Pwd::class)\n        control.actMethodFailed(MyLoginFailedException())\n\n        control.assertRequire(SsoProcessorImpl.AuthMethod.Pwd::class)\n        control.actComplete()\n\n        control.assertRequire(SsoProcessorImpl.AuthMethod.NotAvailable::class)\n\n    }\n\n    @Test\n    fun `failed when login complete`() = runTest {\n        val control = AuthControl(botAuthInfo, object : BotAuthorization {\n            override suspend fun authorize(session: BotAuthSession, info: BotAuthInfo): BotAuthResult {\n                val rsp = session.authByPassword(EMPTY_BYTE_ARRAY)\n                assertFailsWith<IllegalStateException> { session.authByPassword(EMPTY_BYTE_ARRAY) }\n                assertFailsWith<IllegalStateException> { session.authByPassword(EMPTY_BYTE_ARRAY) }\n                assertFailsWith<IllegalStateException> { session.authByPassword(EMPTY_BYTE_ARRAY) }\n                return rsp\n            }\n        }, bot.logger, backgroundScope.coroutineContext)\n\n        control.start()\n        control.assertRequire(SsoProcessorImpl.AuthMethod.Pwd::class)\n        control.actComplete()\n        control.assertRequire(SsoProcessorImpl.AuthMethod.NotAvailable::class)\n\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/component/BotInitProcessorTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(TestOnly::class)\n\npackage net.mamoe.mirai.internal.network.component\n\nimport kotlinx.coroutines.CompletableDeferred\nimport kotlinx.coroutines.isActive\nimport kotlinx.coroutines.test.runTest\nimport net.mamoe.mirai.internal.contact.uin\nimport net.mamoe.mirai.internal.network.components.BotInitProcessor\nimport net.mamoe.mirai.internal.network.framework.AbstractCommonNHTest\nimport net.mamoe.mirai.internal.network.framework.AbstractCommonNHTestWithSelector\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.protocol.data.jce.RequestPushForceOffline\nimport net.mamoe.mirai.internal.network.protocol.packet.IncomingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.receive.MessageSvcPushForceOffline\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.utils.TestOnly\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFalse\nimport kotlin.test.assertTrue\n\ninternal class BotInitProcessorTest {\n    class WithoutSelector : AbstractCommonNHTest() {\n        @Test\n        fun `BotInitProcessor halted`() = runTest {\n            val p = setComponent(BotInitProcessor, object : BotInitProcessor {\n                var ranTimes = 0\n                var haltedTimes = 0\n                var def = CompletableDeferred<Unit>()\n                override suspend fun init() {\n                    ranTimes++\n                    def.await()\n                }\n\n                override fun setLoginHalted() {\n                    haltedTimes += 1\n                }\n            })\n            assertTrue { network.isActive }\n            network.setStateLoading(conn)\n            assertEquals(1, p.ranTimes)\n            assertEquals(0, p.haltedTimes)\n            assertState(NetworkHandler.State.LOADING)\n            network.collectReceived(\n                IncomingPacket(\n                    MessageSvcPushForceOffline.commandName,\n                    RequestPushForceOffline(bot.uin)\n                )\n            )\n            assertEquals(1, p.ranTimes)\n            assertEquals(1, p.haltedTimes)\n            eventDispatcher.joinBroadcast()\n            assertFalse { network.isActive }\n            network.assertState(NetworkHandler.State.CLOSED) // we do not use selector in this test so it will be CLOSED. It will recover (reconnect) instead in real.\n        }\n    }\n\n    class WithSelector : AbstractCommonNHTestWithSelector() {\n        @Test\n        fun `BotInitProcessor halted`() = runBlockingUnit {\n            bot.configuration.autoReconnectOnForceOffline = true\n            val p = setComponent(BotInitProcessor, object : BotInitProcessor {\n                var ranTimes = 0\n                var haltedTimes = 0\n                var def = CompletableDeferred<Unit>()\n                override suspend fun init() {\n                    ranTimes++\n                    def.await()\n                }\n\n                override fun setLoginHalted() {\n                    haltedTimes += 1\n                }\n            })\n            assertTrue { network.isActive }\n            network.setStateLoading(conn)\n            assertEquals(1, p.ranTimes)\n            assertEquals(0, p.haltedTimes)\n            assertState(NetworkHandler.State.LOADING)\n\n            network.currentInstance().collectReceived(\n                IncomingPacket(\n                    MessageSvcPushForceOffline.commandName,\n                    RequestPushForceOffline(bot.uin)\n                )\n            )\n            // all jobs launched during `collectReceived` are UNDISPATCHED, `collectReceived` returns on `def.await()` (suspension point)\n            // first run is CANCELLED.\n\n\n            assertEquals(1, p.ranTimes)\n            assertEquals(1, p.haltedTimes)\n\n            p.def.complete(Unit) // then BotInitProcessor.init finishes async.\n            network.resumeConnection() // join async\n            assertEquals(2, p.ranTimes) // we expect selector has run `init`\n            assertEquals(1, p.haltedTimes)\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/component/CombinedStorageTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(TestOnly::class)\n\npackage net.mamoe.mirai.internal.network.component\n\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.utils.TestOnly\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertSame\n\ninternal class CombinedStorageTest : AbstractTest() {\n\n    internal data class TestComponent2(\n        val value: Int\n    ) {\n        companion object : ComponentKey<TestComponent2>\n    }\n\n    internal data class TestComponent3(\n        val value: Int\n    ) {\n        companion object : ComponentKey<TestComponent3>\n    }\n\n    @Test\n    fun `can get from main`() {\n        val storage = ConcurrentComponentStorage().apply {\n            set(TestComponent2, TestComponent2(1))\n        }.withFallback(ConcurrentComponentStorage())\n        assertEquals(TestComponent2(1), storage[TestComponent2])\n    }\n\n    @Test\n    fun `can get from fallback`() {\n        val storage = ConcurrentComponentStorage().withFallback(ConcurrentComponentStorage().apply {\n            set(TestComponent2, TestComponent2(1))\n        })\n        assertEquals(TestComponent2(1), storage[TestComponent2])\n    }\n\n    @Test\n    fun `size is sum of sizes of two storages`() {\n        val storage = ConcurrentComponentStorage().apply {\n            set(TestComponent3, TestComponent3(1))\n        }.withFallback(ConcurrentComponentStorage().apply {\n            set(TestComponent2, TestComponent2(1))\n        })\n        assertEquals(2, storage.size)\n    }\n\n    @Test\n    fun `size can be zero`() {\n        val storage = ConcurrentComponentStorage().withFallback(ConcurrentComponentStorage())\n        assertEquals(0, storage.size)\n    }\n\n    @Test\n    fun `main prevails than fallback`() {\n        val storage = ConcurrentComponentStorage().apply {\n            set(TestComponent2, TestComponent2(1))\n        }.withFallback(ConcurrentComponentStorage().apply {\n            set(TestComponent2, TestComponent2(2))\n        })\n        assertEquals(TestComponent2(1), storage[TestComponent2])\n    }\n\n    @Test\n    fun `returns empty if both are null`() {\n        val x: ComponentStorage = null.withFallback(null)\n        assertEquals(ComponentStorage.EMPTY, x)\n    }\n\n    @Test\n    fun `returns first if second if null`() {\n        val x = ConcurrentComponentStorage().apply { set(TestComponent2, TestComponent2(1)) }\n        assertSame(x, x.withFallback(null))\n    }\n\n    @Test\n    fun `returns second if first if null`() {\n        val x = ConcurrentComponentStorage().apply { set(TestComponent2, TestComponent2(1)) }\n        assertSame(x, null.withFallback(x))\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/component/EventDispatcherTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(TestOnly::class)\n\npackage net.mamoe.mirai.internal.network.component\n\nimport kotlinx.coroutines.CompletableJob\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.job\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.internal.test.assertEventBroadcasts\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.TestOnly\nimport network.framework.components.TestEventDispatcherImpl\nimport kotlin.test.Test\n\ninternal class EventDispatcherTest : AbstractTest() {\n    private class Ev : AbstractEvent()\n\n    private val dispatcher = TestEventDispatcherImpl(\n        SupervisorJob(),\n        MiraiLogger.Factory.create(EventDispatcherTest::class)\n    )\n\n    @Test\n    fun `can broadcast`() = runBlockingUnit {\n        assertEventBroadcasts<Ev>(1) {\n            dispatcher.broadcast(Ev())\n        }\n    }\n\n    @Test\n    fun `can async`() = runBlockingUnit {\n        assertEventBroadcasts<Ev>(1) {\n            dispatcher.broadcastAsync(Ev())\n            (dispatcher.coroutineContext.job as CompletableJob).run {\n                complete()\n                join()\n            }\n        }\n    }\n\n    @Test\n    fun `can join`() = runBlockingUnit {\n        assertEventBroadcasts<Ev>(20) {\n            repeat(20) {\n                dispatcher.broadcastAsync(Ev())\n            }\n            dispatcher.joinBroadcast()\n        }\n    }\n\n    @Test\n    fun `broadcastAsync starts job immediately`() = runBlockingUnit {\n        assertEventBroadcasts<Ev>(1) {\n            dispatcher.broadcastAsync(Ev())\n            dispatcher.joinBroadcast()\n        }\n    }\n\n    @Test\n    fun `broadcastAsync starts job immediately parallel`() = runBlockingUnit {\n        assertEventBroadcasts<Ev>(20) {\n            repeat(20) {\n                dispatcher.broadcastAsync(Ev())\n            }\n            dispatcher.joinBroadcast()\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/framework/AbstractCommonNHTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.framework\n\nimport kotlinx.coroutines.CoroutineScope\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.handler.*\nimport net.mamoe.mirai.internal.network.protocol.packet.IncomingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.utils.ExceptionCollector\n\n/**\n * You may need to override [createConnection]\n */\ninternal abstract class TestCommonNetworkHandler(\n    override val bot: QQAndroidBot,\n    context: NetworkHandlerContext,\n    address: SocketAddress,\n) : CommonNetworkHandler<PlatformConn>(context, address), ITestNetworkHandler<PlatformConn> {\n    override suspend fun createConnection(): PlatformConn {\n        return PlatformConn()\n    }\n\n    override fun PlatformConn.writeAndFlushOrCloseAsync(packet: OutgoingPacket) {\n        for (packetReplier in packetRepliers) {\n            packetReplier.run {\n                object : PacketReplierContext {\n                    override val coroutineScope: CoroutineScope\n                        get() = CoroutineScope(coroutineContext)\n\n                    override fun reply(incoming: IncomingPacket) {\n                        collectReceived(incoming)\n                    }\n\n                    override fun reply(incoming: Packet) {\n                        reply(IncomingPacket(packet.commandName, packet.sequenceId, incoming))\n                    }\n\n                    override fun reply(incoming: Throwable) {\n                        reply(IncomingPacket(packet.commandName, packet.sequenceId, incoming))\n                    }\n                }.onSend(packet)\n            }\n        }\n    }\n\n    @Suppress(\"EXTENSION_SHADOWED_BY_MEMBER\")\n    override fun PlatformConn.close() {\n    }\n\n    override fun setStateClosed(exception: Throwable?): NetworkHandlerSupport.BaseStateImpl? {\n        return setState { StateClosed(exception) }\n    }\n\n    override fun setStateConnecting(exception: Throwable?): NetworkHandlerSupport.BaseStateImpl? {\n        return setState { StateConnecting(ExceptionCollector(exception)) }\n    }\n\n    override fun setStateOK(conn: PlatformConn, exception: Throwable?): NetworkHandlerSupport.BaseStateImpl? {\n        exception?.printStackTrace()\n        return setState { StateOK(conn) }\n    }\n\n    override fun setStateLoading(conn: PlatformConn): NetworkHandlerSupport.BaseStateImpl? {\n        return setState { StateLoading(conn) }\n    }\n\n    private val packetRepliers = mutableListOf<PacketReplier>()\n\n    fun addPacketReplier(packetReplier: PacketReplier) {\n        packetRepliers.add(packetReplier)\n    }\n\n    inline fun addPacketReplierDsl(crossinline action: PacketReplierDslBuilder.() -> Unit) {\n        packetRepliers.add(buildPacketReplier(action))\n    }\n}\n\n/**\n * Without selector. When network is closed, it will not reconnect, so that you can check for its states.\n *\n * @see AbstractCommonNHTestWithSelector\n */\ninternal expect abstract class AbstractCommonNHTest() :\n    AbstractRealNetworkHandlerTest<TestCommonNetworkHandler> {\n\n    val conn: PlatformConn\n\n    override val factory: NetworkHandlerFactory<TestCommonNetworkHandler>\n\n    protected fun removeOutgoingPacketEncoder()\n}\n\ninternal expect class PlatformConn()"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/framework/AbstractCommonNHTestWithSelector.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"MemberVisibilityCanBePrivate\")\n\npackage net.mamoe.mirai.internal.network.framework\n\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.components.BotOfflineEventMonitor\nimport net.mamoe.mirai.internal.network.components.BotOfflineEventMonitorImpl\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerFactory\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport\nimport net.mamoe.mirai.internal.network.handler.TestSelector\nimport net.mamoe.mirai.internal.network.handler.selector.NetworkHandlerSelector\nimport net.mamoe.mirai.internal.network.handler.selector.SelectorNetworkHandler\n\n/**\n * When network is closed, it will reconnect, so that you test for real environment,\n * but you cannot check for its states (it will never be CLOSED until some fatal error, just like in real).\n */\ninternal abstract class AbstractCommonNHTestWithSelector :\n    AbstractRealNetworkHandlerTest<TestSelectorNetworkHandler>() {\n    init {\n        overrideComponents[BotOfflineEventMonitor] = BotOfflineEventMonitorImpl()\n    }\n\n    val conn = PlatformConn()\n\n    val selector = TestSelector<TestCommonNetworkHandler> {\n        object : TestCommonNetworkHandler(bot, createContext(), createAddress()) {\n            //            override suspend fun createConnection(decodePipeline: PacketDecodePipeline): PlatformConn = channel\n            override suspend fun createConnection(): PlatformConn {\n                return conn\n            }\n        }.apply {\n            applyToInstances.forEach { it.invoke(this) }\n        }\n    }\n\n    override val factory: NetworkHandlerFactory<TestSelectorNetworkHandler> =\n        NetworkHandlerFactory { _, _ -> TestSelectorNetworkHandler(selector, bot) }\n\n\n    private val applyToInstances = mutableListOf<TestCommonNetworkHandler.() -> Unit>()\n    fun onEachNetworkInstance(action: TestCommonNetworkHandler.() -> Unit) {\n        applyToInstances.add(action)\n    }\n}\n\ninternal class TestSelectorNetworkHandler(\n    selector: NetworkHandlerSelector<TestCommonNetworkHandler>, override val bot: QQAndroidBot,\n) : ITestNetworkHandler<PlatformConn>,\n    SelectorNetworkHandler<TestCommonNetworkHandler>(selector) {\n\n    fun currentInstance() = selector.getCurrentInstanceOrCreate()\n    fun currentInstanceOrNull() = selector.getCurrentInstanceOrNull()\n\n    private val applyToInstances = mutableListOf<TestCommonNetworkHandler.() -> Unit>()\n    fun onEachInstance(action: TestCommonNetworkHandler.() -> Unit) {\n        applyToInstances.add(action)\n    }\n\n    override fun setStateClosed(exception: Throwable?): NetworkHandlerSupport.BaseStateImpl? {\n        return selector.getCurrentInstanceOrCreate().setStateClosed(exception)\n    }\n\n    override fun setStateConnecting(exception: Throwable?): NetworkHandlerSupport.BaseStateImpl? {\n        return selector.getCurrentInstanceOrCreate().setStateConnecting(exception)\n    }\n\n    override fun setStateOK(conn: PlatformConn, exception: Throwable?): NetworkHandlerSupport.BaseStateImpl? {\n        return selector.getCurrentInstanceOrCreate().setStateOK(conn, exception)\n    }\n\n    override fun setStateLoading(conn: PlatformConn): NetworkHandlerSupport.BaseStateImpl? {\n        return selector.getCurrentInstanceOrCreate().setStateLoading(conn)\n    }\n\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/framework/AbstractMockNetworkHandlerTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"MemberVisibilityCanBePrivate\")\n\npackage net.mamoe.mirai.internal.network.framework\n\nimport kotlinx.coroutines.SupervisorJob\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.internal.BotAccount\nimport net.mamoe.mirai.internal.MockBot\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.component.ConcurrentComponentStorage\nimport net.mamoe.mirai.internal.network.components.*\nimport net.mamoe.mirai.internal.network.framework.components.TestImagePatcher\nimport net.mamoe.mirai.internal.network.framework.components.TestSsoProcessor\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.state.LoggingStateObserver\nimport net.mamoe.mirai.internal.network.handler.state.SafeStateObserver\nimport net.mamoe.mirai.internal.network.handler.state.StateObserver\nimport net.mamoe.mirai.internal.utils.ImagePatcher\nimport net.mamoe.mirai.internal.utils.subLogger\nimport net.mamoe.mirai.utils.MiraiLogger\nimport network.framework.components.TestEventDispatcherImpl\nimport kotlin.math.absoluteValue\nimport kotlin.random.Random\nimport kotlin.test.AfterTest\nimport kotlin.test.assertEquals\n\n\n/**\n * Test with mock [NetworkHandler], and without selector.\n */\ninternal abstract class AbstractMockNetworkHandlerTest : AbstractNetworkHandlerTest() {\n    protected open fun createNetworkHandlerContext() = TestNetworkHandlerContext(bot, logger, components)\n    protected open fun createNetworkHandler() = TestNetworkHandler(bot, createNetworkHandlerContext())\n\n    protected open fun createAccount() = BotAccount(Random.nextLong().absoluteValue.mod(1000L), \"pwd\")\n\n    protected val bot: QQAndroidBot by lazy {\n        MockBot(createAccount()) {\n            nhProvider = { createNetworkHandler() }\n            additionalComponentsProvider = { this@AbstractMockNetworkHandlerTest.components }\n        }\n    }\n    protected val logger = MiraiLogger.Factory.create(Bot::class, \"test\")\n\n    private val eventDispatcherJob = SupervisorJob()\n\n    @AfterTest\n    private fun cancelJob() {\n        eventDispatcherJob.cancel()\n    }\n\n    protected val components = ConcurrentComponentStorage().apply {\n        set(SsoProcessor, TestSsoProcessor(bot))\n        set(\n            EventDispatcher,\n            // Note that in real we use 'bot.coroutineContext', but here we override with a new, independent job\n            // to allow BotOfflineEvent.Active to be broadcast and joinBroadcast works even if bot coroutineScope is closed.\n            TestEventDispatcherImpl(\n                bot.coroutineContext + eventDispatcherJob,\n                bot.logger.subLogger(\"TestEventDispatcherImpl\")\n            )\n        )\n        set(\n            StateObserver,\n            SafeStateObserver(\n                LoggingStateObserver(MiraiLogger.Factory.create(LoggingStateObserver::class, \"States\")),\n                MiraiLogger.Factory.create(SafeStateObserver::class, \"StateObserver errors\")\n            )\n        )\n        set(ImagePatcher, TestImagePatcher())\n        set(PacketLoggingStrategy, PacketLoggingStrategyImpl(bot))\n        set(AccountSecretsManager, MemoryAccountSecretsManager())\n        set(HttpClientProvider, HttpClientProviderImpl())\n    }\n\n    fun NetworkHandler.assertState(state: NetworkHandler.State) {\n        assertEquals(this.state, state)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/framework/AbstractNetworkHandlerTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.framework\n\nimport net.mamoe.mirai.internal.network.handler.selector.AbstractKeepAliveNetworkHandlerSelector\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.utils.setSystemProp\nimport kotlin.test.AfterTest\nimport kotlin.test.BeforeTest\n\n/**\n * @see AbstractCommonNHTest\n * @see AbstractCommonNHTestWithSelector\n * @see AbstractMockNetworkHandlerTest\n */\ninternal sealed class AbstractNetworkHandlerTest : AbstractTest() {\n    ///////////////////////////////////////////////////////////////////////////\n    // Defaults\n    ///////////////////////////////////////////////////////////////////////////\n\n    init {\n        setSystemProp(\"mirai.event.launch.undispatched\", \"true\") // allow us to do some\n    }\n\n    @BeforeTest\n    fun be() {\n        AbstractKeepAliveNetworkHandlerSelector.RECONNECT_DELAY = 0\n    }\n\n    @AfterTest\n    fun af() {\n        AbstractKeepAliveNetworkHandlerSelector.RECONNECT_DELAY = 3000\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/framework/AbstractRealNetworkHandlerTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(TestOnly::class)\n\npackage net.mamoe.mirai.internal.network.framework\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.SupervisorJob\nimport net.mamoe.mirai.internal.*\nimport net.mamoe.mirai.internal.contact.uin\nimport net.mamoe.mirai.internal.network.KeyWithCreationTime\nimport net.mamoe.mirai.internal.network.KeyWithExpiry\nimport net.mamoe.mirai.internal.network.WLoginSigInfo\nimport net.mamoe.mirai.internal.network.WLoginSimpleInfo\nimport net.mamoe.mirai.internal.network.component.ComponentKey\nimport net.mamoe.mirai.internal.network.component.ConcurrentComponentStorage\nimport net.mamoe.mirai.internal.network.component.setAll\nimport net.mamoe.mirai.internal.network.components.*\nimport net.mamoe.mirai.internal.network.framework.components.TestSsoProcessor\nimport net.mamoe.mirai.internal.network.handler.*\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.State\nimport net.mamoe.mirai.internal.network.protocol.data.jce.SvcRespRegister\nimport net.mamoe.mirai.internal.network.protocol.packet.login.StatSvc\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.internal.utils.crypto.QQEcdh\nimport net.mamoe.mirai.internal.utils.subLogger\nimport net.mamoe.mirai.utils.*\nimport network.framework.components.TestEventDispatcherImpl\nimport kotlin.random.Random\nimport kotlin.test.AfterTest\nimport kotlin.test.assertEquals\n\n/**\n * With real factory and components as in [QQAndroidBot.components].\n *\n * Extend [AbstractCommonNHTestWithSelector] or [AbstractCommonNHTest].\n */\ninternal abstract class AbstractRealNetworkHandlerTest<H : NetworkHandler> : AbstractNetworkHandlerTest() {\n    abstract val factory: NetworkHandlerFactory<H>\n\n    /**\n     * This is shared for all [createBot] by default. `network === bot.network`, unless you change it.\n     */\n    open val network: H by lateinitMutableProperty {\n        factory.create(createContext(), createAddress())\n    }\n\n    private var botInit = false\n    var bot: QQAndroidBot by lateinitMutableProperty {\n        botInit = true\n        createBot()\n    }\n\n    @AfterTest\n    fun afterEach() {\n        println(\"Test finished, closing Bot\")\n        if (botInit) {\n            bot.close()\n            println(\"joining Bot\")\n            runBlockingUnit { bot.join() }\n            println(\"cleanup ok\")\n        }\n    }\n\n    protected open fun createBot(account: BotAccount = MockAccount): QQAndroidBot {\n        return object : QQAndroidBot(account, MockConfiguration.copy()) {\n            override fun createBotLevelComponents(): ConcurrentComponentStorage =\n                super.createBotLevelComponents().apply {\n                    setAll(overrideComponents)\n                    get(AccountSecretsManager).getSecretsOrCreate(\n                        account,\n                        DeviceInfo.random(Random(1))\n                    ).wLoginSigInfo = createWLoginSigInfo(uin)\n                }\n\n            override fun createNetworkHandler(): NetworkHandler =\n                this@AbstractRealNetworkHandlerTest.network\n        }\n    }\n\n    open val networkLogger = MiraiLogger.Factory.create(NetworkHandler::class, \"network\")\n\n    sealed class NHEvent {\n        object Login : NHEvent()\n        object Logout : NHEvent()\n        object DoHeartbeatNow : NHEvent()\n        object Init : NHEvent()\n        object SetLoginHalted : NHEvent()\n    }\n\n    val nhEvents = ConcurrentLinkedQueue<NHEvent>()\n\n    private val eventDispatcherJob = SupervisorJob()\n\n    @AfterTest\n    private fun cancelJob() {\n        eventDispatcherJob.cancel()\n        println(\"Test finished, joining eventDispatcherJob\")\n        runBlockingUnit { eventDispatcherJob.join() }\n    }\n\n    /**\n     * This overrides [QQAndroidBot.components]\n     */\n    @OptIn(TestOnly::class)\n    val overrideComponents = ConcurrentComponentStorage().apply {\n        set(SsoProcessorContext, SsoProcessorContextImpl(bot))\n        set(SsoProcessor, object : TestSsoProcessor(bot) {\n            override suspend fun login(handler: NetworkHandler) {\n                nhEvents.add(NHEvent.Login)\n                super.login(handler)\n            }\n\n            override suspend fun logout(handler: NetworkHandler) {\n                nhEvents.add(NHEvent.Logout)\n                super.logout(handler)\n            }\n        })\n        set(HeartbeatProcessor, object : HeartbeatProcessor {\n            override suspend fun doAliveHeartbeatNow(networkHandler: NetworkHandler) {\n                nhEvents.add(NHEvent.DoHeartbeatNow)\n                networkLogger.debug { \"HeartbeatProcessor.doAliveHeartbeatNow\" }\n            }\n\n            override suspend fun doStatHeartbeatNow(networkHandler: NetworkHandler) {\n                nhEvents.add(NHEvent.DoHeartbeatNow)\n                networkLogger.debug { \"HeartbeatProcessor.doStatHeartbeatNow\" }\n            }\n\n            override suspend fun doRegisterNow(networkHandler: NetworkHandler): StatSvc.Register.Response {\n                nhEvents.add(NHEvent.DoHeartbeatNow)\n                networkLogger.debug { \"HeartbeatProcessor.doRegisterNow\" }\n                return StatSvc.Register.Response(SvcRespRegister())\n            }\n        })\n        set(KeyRefreshProcessor, object : KeyRefreshProcessor {\n            override suspend fun keyRefreshLoop(handler: NetworkHandler) {}\n            override suspend fun refreshKeysNow(handler: NetworkHandler) {}\n        })\n        set(ConfigPushProcessor, object : ConfigPushProcessor {\n            override suspend fun syncConfigPush(network: NetworkHandler) {}\n        })\n\n        set(BotInitProcessor, object : BotInitProcessor {\n            override fun setLoginHalted() {\n                nhEvents.add(NHEvent.SetLoginHalted)\n            }\n\n            override suspend fun init() {\n                nhEvents.add(NHEvent.Init)\n                networkLogger.debug { \"BotInitProcessor.init\" }\n                bot.components[SsoProcessor].setFirstLoginResult(FirstLoginResult.PASSED)\n            }\n        })\n        set(ServerList, ServerListImpl())\n\n        set(\n            EventDispatcher,\n            // Note that in real we use 'bot.coroutineContext', but here we override with a new, independent job\n            // to allow BotOfflineEvent.Active to be broadcast and joinBroadcast works even if bot coroutineScope is closed.\n            TestEventDispatcherImpl(\n                bot.coroutineContext + eventDispatcherJob,\n                bot.logger.subLogger(\"TestEventDispatcherImpl\")\n            )\n        )\n\n        set(BotOfflineEventMonitor, object : BotOfflineEventMonitor {\n            override fun attachJob(bot: AbstractBot, scope: CoroutineScope) {\n            }\n        })\n\n        set(EcdhInitialPublicKeyUpdater, object : EcdhInitialPublicKeyUpdater {\n            override suspend fun refreshInitialPublicKeyAndApplyEcdh() {\n            }\n\n            override suspend fun initializeSsoSecureEcdh() {\n            }\n\n            override fun getQQEcdh(): QQEcdh = QQEcdh()\n        })\n\n        set(AccountSecretsManager, MemoryAccountSecretsManager())\n        // set(StateObserver, bot.run { stateObserverChain() })\n    }\n\n\n    fun <T : Any> setComponent(key: ComponentKey<in T>, instance: T): T {\n        overrideComponents[key] = instance\n        return instance\n    }\n\n    open fun createContext(): NetworkHandlerContextImpl =\n        NetworkHandlerContextImpl(bot, networkLogger, bot.createNetworkLevelComponents())\n\n    //Use overrideComponents to avoid StackOverflowError when applying components\n    open fun createAddress(): SocketAddress =\n        overrideComponents[ServerList].pollAny().let { createSocketAddress(it.host, it.port) }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Assertions\n    ///////////////////////////////////////////////////////////////////////////\n\n    fun assertState(state: State) {\n        assertEquals(state, network.state)\n    }\n\n    fun assertState(vararg accepted: State) {\n        val s = network.state\n        if (s !in accepted) {\n            throw AssertionError(\"Expected: ${accepted.joinToString()}, actual: $s\")\n        }\n    }\n\n    fun NetworkHandler.assertState(state: State) {\n        assertEquals(state, this.state)\n    }\n\n    val eventDispatcher get() = bot.components[EventDispatcher]\n    var firstLoginResult: FirstLoginResult?\n        get() = bot.components[SsoProcessor].firstLoginResult\n        set(value) {\n            bot.components[SsoProcessor].setFirstLoginResult(value)\n        }\n}\n\ninternal fun AbstractRealNetworkHandlerTest<*>.setSsoProcessor(action: suspend SsoProcessor.(handler: NetworkHandler) -> Unit) {\n    overrideComponents[SsoProcessor] = object : SsoProcessor by overrideComponents[SsoProcessor] {\n        override suspend fun login(handler: NetworkHandler) = action(handler)\n    }\n}\n\ninternal fun createWLoginSigInfo(\n    uin: Long,\n    creationTime: Long = currentTimeSeconds(),\n    random: Random = Random(1)\n): WLoginSigInfo {\n    return WLoginSigInfo(\n        uin = uin,\n        encryptA1 = null,\n        noPicSig = null,\n        simpleInfo = WLoginSimpleInfo(\n            uin = uin,\n            imgType = EMPTY_BYTE_ARRAY,\n            imgFormat = EMPTY_BYTE_ARRAY,\n            imgUrl = EMPTY_BYTE_ARRAY,\n            mainDisplayName = EMPTY_BYTE_ARRAY\n        ), // defaults {}, from asyncContext._G\n        appPri = 4294967295L, // defaults {}, from asyncContext._G\n        a2ExpiryTime = creationTime + 2160000L, // or from asyncContext._t403.get_body_data()\n        loginBitmap = 0,\n        tgt = getRandomByteArray(16, random),\n        a2CreationTime = creationTime,\n        tgtKey = getRandomByteArray(16, random), // from asyncContext._login_bitmap\n        userStSig = KeyWithCreationTime(getRandomByteArray(16, random), creationTime),\n        userStKey = EMPTY_BYTE_ARRAY,\n        userStWebSig = KeyWithExpiry(\n            EMPTY_BYTE_ARRAY,\n            creationTime,\n            creationTime + 6000\n        ),\n        userA5 = KeyWithCreationTime(getRandomByteArray(16, random), creationTime),\n        userA8 = KeyWithExpiry(\n            EMPTY_BYTE_ARRAY,\n            creationTime,\n            creationTime + 72000L\n        ),\n        lsKey = KeyWithExpiry(\n            EMPTY_BYTE_ARRAY,\n            creationTime,\n            creationTime + 1641600L\n        ),\n        sKey = KeyWithExpiry(\n            EMPTY_BYTE_ARRAY,\n            creationTime,\n            creationTime + 86400L\n        ),\n        userSig64 = KeyWithCreationTime(EMPTY_BYTE_ARRAY, creationTime),\n        openId = EMPTY_BYTE_ARRAY,\n        openKey = KeyWithCreationTime(EMPTY_BYTE_ARRAY, creationTime),\n        vKey = KeyWithExpiry(\n            EMPTY_BYTE_ARRAY,\n            creationTime,\n            creationTime + 1728000L\n        ),\n        accessToken = KeyWithCreationTime(EMPTY_BYTE_ARRAY, creationTime),\n        d2 = KeyWithExpiry(\n            getRandomByteArray(16, random),\n            creationTime,\n            creationTime + 1728000L\n        ),\n        d2Key = getRandomByteArray(16, random),\n        sid = KeyWithExpiry(\n            EMPTY_BYTE_ARRAY,\n            creationTime,\n            creationTime + 1728000L\n        ),\n        aqSig = KeyWithCreationTime(EMPTY_BYTE_ARRAY, creationTime),\n        psKeyMap = mutableMapOf(),\n        pt4TokenMap = mutableMapOf(),\n        superKey = EMPTY_BYTE_ARRAY,\n        payToken = EMPTY_BYTE_ARRAY,\n        pf = EMPTY_BYTE_ARRAY,\n        pfKey = EMPTY_BYTE_ARRAY,\n        da2 = EMPTY_BYTE_ARRAY,\n        wtSessionTicket = KeyWithCreationTime(EMPTY_BYTE_ARRAY, creationTime),\n        wtSessionTicketKey = EMPTY_BYTE_ARRAY,\n        deviceToken = EMPTY_BYTE_ARRAY,\n        encryptedDownloadSession = null\n    )\n}\n"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/framework/AbstractRealTimeActionTestUnit.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.framework\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.network.KeyWithCreationTime\nimport net.mamoe.mirai.internal.network.KeyWithExpiry\nimport net.mamoe.mirai.internal.network.WLoginSigInfo\nimport net.mamoe.mirai.internal.network.WLoginSimpleInfo\nimport net.mamoe.mirai.internal.notice.processors.GroupExtensions\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport net.mamoe.mirai.utils.hexToBytes\nimport kotlin.test.BeforeTest\n\ninternal abstract class AbstractRealTimeActionTestUnit : AbstractCommonNHTest(), GroupExtensions {\n    @BeforeTest\n    internal fun prepareEnv() {\n        bot.client.wLoginSigInfoField = WLoginSigInfo(\n            uin = bot.id,\n            encryptA1 = \"01 23 33 AF EA\".hexToBytes(),\n            noPicSig = \"55 47 20 23 54\".hexToBytes(),\n            simpleInfo = WLoginSimpleInfo(\n                uin = bot.id,\n                imgType = EMPTY_BYTE_ARRAY,\n                imgFormat = EMPTY_BYTE_ARRAY,\n                imgUrl = EMPTY_BYTE_ARRAY,\n                mainDisplayName = EMPTY_BYTE_ARRAY,\n            ),\n            appPri = 0,\n            a2ExpiryTime = 0,\n            a2CreationTime = 849415181,\n            loginBitmap = 1145141919810,\n            tgt = \"EA 5B CE FA 6C\".hexToBytes(),\n            tgtKey = \"66 F5 A9 B8 FF\".hexToBytes(),\n            userStSig = KeyWithCreationTime(data = \"3C FF FF FF 07\".hexToBytes(), creationTime = 0),\n            userStKey = \"07 F5 A9 B8 0B\".hexToBytes(),\n            userStWebSig = KeyWithExpiry(data = \"A1 5B CE FA 60\".hexToBytes(), creationTime = 0, expireTime = 0),\n            userA5 = KeyWithCreationTime(data = \"66 CC FF AA AA\".hexToBytes(), creationTime = 0),\n            userA8 = KeyWithExpiry(data = \"65 c1 B9 7A 1F\".hexToBytes(), creationTime = 0, expireTime = 0),\n            lsKey = KeyWithExpiry(data = \"65 c1 B9 7A 1F\".hexToBytes(), creationTime = 0, expireTime = 0),\n            sKey = KeyWithExpiry(data = \"D6 B1 9C 66 3A\".hexToBytes(), creationTime = 0, expireTime = 0),\n            userSig64 = KeyWithCreationTime(data = \"D6 B1 9C 66 3A\".hexToBytes(), creationTime = 0),\n            openId = \"D6 B1 9C 66 3A\".hexToBytes(),\n            openKey = KeyWithCreationTime(data = \"B4 6E 5E 7A 3C\".hexToBytes(), creationTime = 0),\n            vKey = KeyWithExpiry(data = \"A1 34 17 48 21\".hexToBytes(), creationTime = 0, expireTime = 0),\n            accessToken = KeyWithCreationTime(data = \"12 35 87 14 A1\".hexToBytes(), creationTime = 0),\n            aqSig = KeyWithExpiry(data = \"22 0C DC AC 30\".hexToBytes(), creationTime = 0, expireTime = 0),\n            superKey = \"22 33 66 CC FF\".hexToBytes(),\n            sid = KeyWithExpiry(data = \"11 45 14 19 19\".hexToBytes(), creationTime = 0, expireTime = 0),\n            psKeyMap = mutableMapOf(),\n            pt4TokenMap = mutableMapOf(),\n            d2 = KeyWithExpiry(data = \"81 00 07 64 11\".hexToBytes(), creationTime = 0, expireTime = 0),\n            d2Key = \"404 not found!!!!!!\".toByteArray(),\n            payToken = \"What's this\".toByteArray(),\n            pf = \"> 1 + 1 == 11\\n< true\".toByteArray(),\n            pfKey = \"Don't change anything if it runs\".toByteArray(),\n            da2 = \"sudo rm -rf /\".toByteArray(),\n            wtSessionTicket = KeyWithCreationTime(data = \"deluser root\".toByteArray(), creationTime = 0),\n            wtSessionTicketKey = \"500 Server Internal Error\".toByteArray(),\n            deviceToken = \"Winserver datacenter 2077\".toByteArray(),\n        )\n        bot.client._bot = bot\n        network.setStateOK(conn)\n        removeOutgoingPacketEncoder()\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/framework/ITestNetworkHandler.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.framework\n\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.components.EventDispatcher\nimport net.mamoe.mirai.internal.network.components.SsoProcessor\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport\n\ninternal interface ITestNetworkHandler<Conn> : NetworkHandler {\n    val bot: QQAndroidBot\n\n\n    fun setStateClosed(exception: Throwable? = null): NetworkHandlerSupport.BaseStateImpl?\n    fun setStateConnecting(exception: Throwable? = null): NetworkHandlerSupport.BaseStateImpl?\n    fun setStateOK(conn: Conn, exception: Throwable? = null): NetworkHandlerSupport.BaseStateImpl?\n    fun setStateLoading(conn: Conn): NetworkHandlerSupport.BaseStateImpl?\n}\n\ninternal val ITestNetworkHandler<*>.eventDispatcher get() = bot.components[EventDispatcher]\ninternal val ITestNetworkHandler<*>.ssoProcessor get() = bot.components[SsoProcessor]\n"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/framework/PacketReplier.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.framework\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.launch\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.protocol.packet.IncomingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory\nimport kotlin.jvm.JvmName\n\n/**\n * 应答器, 模拟服务器返回.\n */\ninternal fun interface PacketReplier {\n    fun PacketReplierContext.onSend(packet: OutgoingPacket)\n}\n\ninternal inline fun buildPacketReplier(crossinline builderAction: PacketReplierDslBuilder.() -> Unit): PacketReplier {\n    return PacketReplierDslBuilder().apply { builderAction() }.build()\n}\n\ninternal interface PacketReplierContext {\n    val context: PacketReplierContext get() = this\n    val coroutineScope: CoroutineScope\n\n    fun reply(incoming: IncomingPacket)\n    fun reply(incoming: Packet)\n    fun reply(incoming: Throwable)\n    fun ignore() {}\n}\n\n\ninternal sealed class PacketReplierDecision {\n    data class Reply(val action: PacketReplierContext.(outgoingPacket: OutgoingPacket) -> Unit) :\n        PacketReplierDecision()\n\n    data object Ignore : PacketReplierDecision()\n}\n\ninternal class PacketReplierDslBuilder {\n    val decisions: MutableList<PacketReplierDecision> = mutableListOf()\n\n    class On<T : Packet?>(\n        val fromFactories: List<OutgoingPacketFactory<T>>,\n    )\n\n    /**\n     * Expects the next packet to be exactly\n     */\n    fun <T : Packet?> expect(\n        vararg from: OutgoingPacketFactory<T>,\n    ): On<T> = On(from.toList())\n\n    fun <T : Packet?> expect(\n        vararg from: OutgoingPacketFactory<T>,\n        action: PacketReplierContext.(outgoingPacket: OutgoingPacket) -> Unit\n    ): Unit = On(from.toList()).invoke(action)\n\n    operator fun <T : Packet?> On<T>.invoke(\n        action: PacketReplierContext.(outgoingPacket: OutgoingPacket) -> Unit\n    ) {\n        decisions.add(PacketReplierDecision.Reply { outgoing ->\n            fromFactories\n                .find { it.commandName == outgoing.commandName }\n                ?.let {\n                    return@Reply action(this, outgoing)\n                }\n                ?: run {\n                    val factories = fromFactories.joinToString(prefix = \"[\", postfix = \"]\") { it.commandName }\n                    throw AssertionError(\n                        \"Expected client to send a packet from factories $factories, but client sent ${outgoing.commandName}\"\n                    )\n                }\n        })\n    }\n\n    @JvmName(\"replyPacket\")\n    @OverloadResolutionByLambdaReturnType\n    inline infix fun <T : Packet?> On<T>.reply(crossinline lazyIncoming: () -> Packet) {\n        invoke { context.reply(lazyIncoming()) }\n    }\n\n    @JvmName(\"replyIncomingPacket\")\n    @OverloadResolutionByLambdaReturnType\n    inline infix fun <T : Packet?> On<T>.reply(crossinline lazyIncoming: () -> IncomingPacket) {\n        invoke { context.reply(lazyIncoming()) }\n    }\n\n    @JvmName(\"replyThrowable\")\n    @OverloadResolutionByLambdaReturnType\n    inline infix fun <T : Packet?> On<T>.reply(crossinline lazyIncoming: () -> Throwable) {\n        invoke { context.reply(lazyIncoming()) }\n    }\n\n    inline infix fun <T : Packet?> On<T>.ignore(crossinline lazy: () -> Unit) {\n        invoke {\n            lazy()\n            context.ignore()\n        }\n    }\n\n\n    /**\n     * Ignore the next packet.\n     */\n    fun ignore() {\n        decisions.add(PacketReplierDecision.Ignore)\n    }\n\n    internal fun build(): PacketReplier {\n        return PacketReplier { outgoing ->\n            val context = this\n            coroutineScope.launch {\n                when (val decision =\n                    decisions.removeFirstOrNull()\n                        ?: throw AssertionError(\"Client sent a packet ${outgoing.commandName} while not expected\")\n                ) {\n                    is PacketReplierDecision.Ignore -> return@launch\n                    is PacketReplierDecision.Reply -> {\n                        decision.action.invoke(context, outgoing)\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/framework/SynchronizedStdoutLogger.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.framework\n\nimport kotlinx.atomicfu.locks.reentrantLock\nimport kotlinx.atomicfu.locks.withLock\n\nprivate val lock = reentrantLock()\n\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"CANNOT_OVERRIDE_INVISIBLE_MEMBER\")\ninternal class SynchronizedStdoutLogger(override val identity: String?) : net.mamoe.mirai.internal.utils.StdoutLogger(\n    identity\n) {\n\n    override val output: (String) -> Unit = { str ->\n        lock.withLock { println(str) }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/framework/TestNetworkHandler.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.framework\n\nimport kotlinx.atomicfu.atomic\nimport kotlinx.coroutines.CompletableDeferred\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.State.*\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerContext\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport\nimport net.mamoe.mirai.internal.network.handler.logger\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.utils.ConcurrentLinkedQueue\nimport net.mamoe.mirai.utils.TestOnly\n\n/**\n * States are manually set.\n */\ninternal open class TestNetworkHandler(\n    override val bot: QQAndroidBot,\n    context: NetworkHandlerContext,\n) : NetworkHandlerSupport(context), ITestNetworkHandler<TestNetworkHandler.Connection> {\n    class Connection\n\n    @Suppress(\"EXPOSED_SUPER_CLASS\")\n    internal abstract inner class TestState(\n        correspondingState: NetworkHandler.State\n    ) : BaseStateImpl(correspondingState) {\n        val resumeDeferred = CompletableDeferred<Unit>()\n        val resumeCount = atomic(0)\n        val onResume get() = resumeDeferred.onJoin\n        private val mutex = Mutex()\n\n        override suspend fun resumeConnection0(): Unit = mutex.withLock {\n            resumeCount.incrementAndGet()\n            resumeDeferred.complete(Unit)\n            when (this.correspondingState) {\n                INITIALIZED -> {\n                    setState(CONNECTING)\n                }\n                else -> {\n                }\n            }\n        }\n\n        override fun toString(): String {\n            return \"TestState($correspondingState)\"\n        }\n    }\n\n    internal inner class TestStateInitial : TestState(INITIALIZED)\n    internal inner class TestStateConnecting : TestState(CONNECTING)\n    internal inner class TestStateLoading : TestState(LOADING)\n    internal inner class TestStateOK : TestState(OK)\n    internal inner class TestStateClosed : TestState(CLOSED)\n\n    @OptIn(TestOnly::class)\n    fun setState(correspondingState: NetworkHandler.State): TestState? {\n        // `null` means ignore checks. All test states have same type TestState.\n        val state: TestState = when (correspondingState) {\n            INITIALIZED -> TestStateInitial()\n            CONNECTING -> TestStateConnecting()\n            LOADING -> TestStateLoading()\n            OK -> TestStateOK()\n            CLOSED -> TestStateClosed()\n        }\n        return setStateImpl(TestState::class) { state }\n    }\n\n    private val initialState = TestStateInitial()\n    override fun initialState(): BaseStateImpl = initialState\n\n    val sendPacket get() = ConcurrentLinkedQueue<OutgoingPacket>()\n\n    override suspend fun sendPacketImpl(packet: OutgoingPacket) {\n        logger.info(\"sendPacketImpl: ${packet.displayName}\")\n        sendPacket.add(packet)\n    }\n\n\n    override fun setStateClosed(exception: Throwable?): TestState? {\n        return setState(CLOSED)\n    }\n\n    override fun setStateConnecting(exception: Throwable?): TestState? {\n        return setState(CONNECTING)\n    }\n\n    override fun setStateOK(conn: Connection, exception: Throwable?): TestState? {\n        exception?.printStackTrace()\n        return setState(OK)\n    }\n\n    override fun setStateLoading(conn: Connection): TestState? {\n        return setState(LOADING)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/framework/TestNetworkHandlerContext.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.framework\n\nimport net.mamoe.mirai.internal.MockBot\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.component.ComponentStorage\nimport net.mamoe.mirai.internal.network.component.ConcurrentComponentStorage\nimport net.mamoe.mirai.internal.network.components.SsoProcessor\nimport net.mamoe.mirai.internal.network.components.SsoProcessorContextImpl\nimport net.mamoe.mirai.internal.network.components.SsoProcessorImpl\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerContext\nimport net.mamoe.mirai.internal.network.handler.state.LoggingStateObserver\nimport net.mamoe.mirai.internal.network.handler.state.SafeStateObserver\nimport net.mamoe.mirai.internal.network.handler.state.StateObserver\nimport net.mamoe.mirai.utils.MiraiLogger\n\ninternal class TestNetworkHandlerContext(\n    override val bot: QQAndroidBot = MockBot(),\n    override val logger: MiraiLogger = MiraiLogger.Factory.create(TestNetworkHandlerContext::class, \"Test\"),\n    components: ComponentStorage = ConcurrentComponentStorage().apply {\n        set(SsoProcessor, SsoProcessorImpl(SsoProcessorContextImpl(bot)))\n        set(\n            StateObserver,\n            SafeStateObserver(\n                LoggingStateObserver(MiraiLogger.Factory.create(LoggingStateObserver::class, \"States\")),\n                MiraiLogger.Factory.create(LoggingStateObserver::class, \"StateObserver errors\")\n            )\n        )\n    }\n) : NetworkHandlerContext, ComponentStorage by components\n\n"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/framework/components/TestEventDispatcherImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage network.framework.components\n\nimport kotlinx.coroutines.CoroutineStart\nimport kotlinx.coroutines.job\nimport kotlinx.coroutines.launch\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.internal.network.components.EventDispatcherImpl\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.Companion.runUnwrapCancellationException\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.TestOnly\nimport kotlin.coroutines.CoroutineContext\n\ninternal open class TestEventDispatcherImpl(\n    lifecycleContext: CoroutineContext,\n    logger: MiraiLogger,\n) : EventDispatcherImpl(lifecycleContext, logger) {\n    override suspend fun broadcast(event: Event) {\n        runUnwrapCancellationException {\n            if (isActive) {\n                // This requires the scope to be active, while the original one doesn't.\n\n                // so that [joinBroadcast] works.\n                launch(\n                    start = CoroutineStart.UNDISPATCHED\n                ) {\n                    super.broadcast(event)\n                }.join()\n            } else {\n                // Scope closed, typically when broadcasting `BotOfflineEvent` by StateObserver from `bot.close`\n                super.broadcast(event)\n            }\n        }\n    }\n\n    @OptIn(TestOnly::class)\n    override suspend fun joinBroadcast() {\n        for (child in coroutineContext.job.children) {\n            child.join()\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/framework/components/TestImagePatcher.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.framework.components\n\nimport net.mamoe.mirai.internal.contact.GroupImpl\nimport net.mamoe.mirai.internal.message.image.FriendImage\nimport net.mamoe.mirai.internal.message.image.OfflineGroupImage\nimport net.mamoe.mirai.internal.utils.ImageCache\nimport net.mamoe.mirai.internal.utils.ImagePatcher\nimport net.mamoe.mirai.internal.utils.ImagePatcherImpl\n\ninternal class TestImagePatcher : ImagePatcher {\n    val patchedOfflineGroupImages: MutableList<OfflineGroupImage> = mutableListOf()\n    val patchedFriendImages: MutableList<FriendImage> = mutableListOf()\n\n    private val patcher = ImagePatcherImpl()\n\n    override fun findCacheByImageId(id: String): ImageCache? {\n        return patcher.findCacheByImageId(id)\n    }\n\n    override fun putCache(image: OfflineGroupImage) {\n        patcher.putCache(image)\n    }\n\n    override suspend fun patchOfflineGroupImage(group: GroupImpl, image: OfflineGroupImage) {\n        patchedOfflineGroupImages.add(image)\n    }\n\n    override suspend fun patchFriendImageToGroupImage(group: GroupImpl, image: FriendImage): OfflineGroupImage {\n        patchedFriendImages.add(image)\n        return OfflineGroupImage(image.imageId, image.width, image.height, image.size, image.imageType, image.isEmoji)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/framework/components/TestSsoProcessor.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.framework.components\n\nimport kotlinx.atomicfu.AtomicRef\nimport kotlinx.atomicfu.atomic\nimport net.mamoe.mirai.auth.AuthReason\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.components.*\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.logger\nimport net.mamoe.mirai.internal.network.protocol.data.jce.SvcRespRegister\nimport net.mamoe.mirai.internal.network.protocol.packet.login.StatSvc\nimport net.mamoe.mirai.utils.DeviceInfo\nimport net.mamoe.mirai.utils.debug\nimport net.mamoe.mirai.utils.lateinitMutableProperty\nimport kotlin.properties.Delegates\nimport kotlin.random.Random\n\ninternal open class TestSsoProcessor(private val bot: QQAndroidBot) : SsoProcessor {\n    val deviceInfo = bot.configuration.createDeviceInfo(bot)\n    override var client: QQAndroidClient by lateinitMutableProperty {\n        QQAndroidClient(\n            bot.account,\n            device = deviceInfo,\n            accountSecrets = bot.components[AccountSecretsManager].getSecretsOrCreate(\n                bot.account,\n                DeviceInfo.random(Random(1))\n            )\n        ).also { it._bot = bot }\n    }\n    override val ssoSession: SsoSession get() = bot.client\n    private val _firstLoginResult: AtomicRef<FirstLoginResult?> = atomic(null)\n    override val firstLoginResult get() = _firstLoginResult.value\n    override fun casFirstLoginResult(expect: FirstLoginResult?, update: FirstLoginResult?): Boolean {\n        return _firstLoginResult.compareAndSet(expect, update)\n    }\n\n    override fun setFirstLoginResult(value: FirstLoginResult?) {\n        _firstLoginResult.value = value\n    }\n\n    override var registerResp: StatSvc.Register.Response? = null\n\n    override var authReason: AuthReason by Delegates.notNull()\n    override var isFirstLogin: Boolean = true\n    override suspend fun login(handler: NetworkHandler) {\n        bot.network.logger.debug { \"SsoProcessor.login\" }\n    }\n\n    override suspend fun logout(handler: NetworkHandler) {\n        bot.network.logger.debug { \"SsoProcessor.logout\" }\n    }\n\n    override suspend fun sendRegister(handler: NetworkHandler): StatSvc.Register.Response {\n        bot.network.logger.debug { \"SsoProcessor.sendRegister\" }\n        return StatSvc.Register.Response(SvcRespRegister())\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/framework/networkUtils.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.framework\n\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\n\ninternal fun <R> NetworkHandler.useNetworkHandler(action: NetworkHandler.(handler: NetworkHandler) -> R): R {\n    contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }\n    val r = kotlin.runCatching { action(this) }\n    r.fold(\n        onSuccess = { close(null) },\n        onFailure = { close(it) }\n    )\n    return r.getOrThrow()\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/framework/sessionUtils.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.framework\n\nimport net.mamoe.mirai.event.events.BotOnlineEvent\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.QQAndroidClient\nimport net.mamoe.mirai.internal.network.WLoginSigInfo\nimport net.mamoe.mirai.internal.network.components.AccountSecrets\nimport net.mamoe.mirai.internal.network.components.AccountSecretsImpl\nimport net.mamoe.mirai.internal.network.components.SsoSession\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\nimport net.mamoe.mirai.utils.MiraiFile\nimport net.mamoe.mirai.utils.debug\nimport net.mamoe.mirai.utils.writeBytes\n\n\ninternal class TestSsoSession(\n    private val accountSecrets: AccountSecrets,\n    override var outgoingPacketSessionId: ByteArray = byteArrayOf(1, 2, 3, 4),\n    override var loginState: Int = 0,\n) : SsoSession {\n    override var wLoginSigInfo: WLoginSigInfo by accountSecrets::wLoginSigInfo\n    override val randomKey: ByteArray by accountSecrets::randomKey\n}\n\n//internal fun loadSession(\n//    resourceName: String,\n//): AccountSecretsImpl {\n//    val bytes = ClassLoader.getSystemResourceAsStream(resourceName)?.withUse { readBytes() }\n//        ?: error(\"AccountSecrets resource '$resourceName' not found.\")\n//    return bytes.loadAs(AccountSecretsImpl.serializer())\n//}\n\n/**\n * Secure to share with others. Designed to save real data for tests.\n */\ninternal fun QQAndroidClient.dumpSessionSafe(): ByteArray {\n    val secrets =\n        AccountSecretsImpl(device).copy(\n            wLoginSigInfoField = wLoginSigInfo.copy(\n                tgt = EMPTY_BYTE_ARRAY,\n                encryptA1 = EMPTY_BYTE_ARRAY,\n            )\n        )\n    return secrets.toByteArray(AccountSecretsImpl.serializer())\n}\n\ninternal fun QQAndroidBot.scheduleSafeSessionDump(outputFile: MiraiFile) {\n    this.eventChannel.subscribeAlways<BotOnlineEvent> {\n        outputFile.writeBytes(client.dumpSessionSafe())\n        bot.logger.debug { \"Dumped safe session to \" }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/framework/test/FrameworkEventTest.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.framework.test\n\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.internal.test.assertEventBroadcasts\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport kotlin.test.Test\nimport kotlin.test.assertFails\n\ninternal class FrameworkEventTest : AbstractTest() {\n\n    class TestEvent : AbstractEvent()\n    class TestEvent2 : AbstractEvent()\n\n    @Test\n    fun `can observe event`() = runBlockingUnit {\n        assertEventBroadcasts<TestEvent> {\n            TestEvent().broadcast()\n        }\n    }\n\n    @Test\n    fun `observes expected event`() = runBlockingUnit {\n        assertEventBroadcasts<TestEvent>(1) {\n            TestEvent().broadcast()\n            TestEvent2().broadcast()\n        }\n    }\n\n    @Test\n    fun `can observe event multiple times`() = runBlockingUnit {\n        assertEventBroadcasts<TestEvent>(2) {\n            TestEvent().broadcast()\n            TestEvent().broadcast()\n        }\n    }\n\n    @Test\n    fun `can observe event only in block`() = runBlockingUnit {\n        TestEvent().broadcast()\n        assertEventBroadcasts<TestEvent>(1) {\n            TestEvent().broadcast()\n        }\n    }\n\n    @Test\n    fun `fails if times not match`() = runBlockingUnit {\n        assertFails {\n            assertEventBroadcasts<TestEvent>(2) {\n                TestEvent().broadcast()\n            }\n        }\n        assertFails {\n            assertEventBroadcasts<TestEvent>(0) {\n                TestEvent().broadcast()\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/handler/KeepAliveNetworkHandlerSelectorTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(TestOnly::class)\n\npackage net.mamoe.mirai.internal.network.handler\n\nimport kotlinx.atomicfu.atomic\nimport net.mamoe.mirai.internal.network.framework.AbstractMockNetworkHandlerTest\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.State\nimport net.mamoe.mirai.internal.network.handler.selector.AbstractKeepAliveNetworkHandlerSelector\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.TestOnly\nimport kotlin.test.*\nimport kotlin.time.Duration.Companion.seconds\n\ninternal val selectorLogger = MiraiLogger.Factory.create(TestSelector::class, \"selector\")\n\ninternal class TestSelector<H : NetworkHandler> :\n    AbstractKeepAliveNetworkHandlerSelector<H> {\n\n    val createInstance0: () -> H\n\n    constructor(createInstance0: () -> H) : super(logger = selectorLogger) {\n        this.createInstance0 = createInstance0\n    }\n\n    constructor(maxAttempts: Int, createInstance0: () -> H) : super(maxAttempts, selectorLogger) {\n        this.createInstance0 = createInstance0\n    }\n\n    private val _createInstanceCount = atomic(0)\n    val createdInstanceCount get() = _createInstanceCount.value\n\n    override fun createInstance(): H {\n        _createInstanceCount.incrementAndGet()\n        return this.createInstance0()\n    }\n}\n\ninternal class KeepAliveNetworkHandlerSelectorTest : AbstractMockNetworkHandlerTest() {\n    @Test\n    fun `can initialize instance`() {\n        val selector = TestSelector {\n            createNetworkHandler().apply {\n                setState(State.OK)\n            }\n        }\n        runBlockingUnit(timeout = 1.seconds) { selector.awaitResumeInstance() }\n        assertNotNull(selector.getCurrentInstanceOrNull())\n    }\n\n    @Test\n    fun `no redundant initialization`() {\n        val selector = TestSelector<NetworkHandler> {\n            fail(\"initialize called\")\n        }\n        val handler = createNetworkHandler()\n        selector.setCurrent(handler)\n        assertSame(handler, selector.getCurrentInstanceOrNull())\n    }\n\n    @Test\n    fun `initialize another when closed`() {\n        val selector = TestSelector {\n            createNetworkHandler().apply { setState(State.OK) }\n        }\n        val handler = createNetworkHandler()\n        selector.setCurrent(handler)\n        assertSame(handler, selector.getCurrentInstanceOrNull())\n        handler.setState(State.CLOSED)\n        runBlockingUnit(timeout = 3.seconds) { selector.awaitResumeInstance() }\n        assertEquals(1, selector.createdInstanceCount)\n    }\n\n    @Test\n    fun `limited attempts`() = runBlockingUnit {\n        val selector = TestSelector(3) {\n            createNetworkHandler().apply { setState(State.CLOSED) }\n        }\n        assertFailsWith<IllegalStateException> {\n            selector.awaitResumeInstance()\n        }\n        assertEquals(3, selector.createdInstanceCount)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/handler/SelectorHeartbeatRecoveryTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(TestOnly::class)\n\npackage net.mamoe.mirai.internal.network.handler\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Job\nimport net.mamoe.mirai.event.events.BotOfflineEvent\nimport net.mamoe.mirai.internal.contact.uin\nimport net.mamoe.mirai.internal.network.components.*\nimport net.mamoe.mirai.internal.network.framework.AbstractCommonNHTestWithSelector\nimport net.mamoe.mirai.internal.network.framework.components.TestSsoProcessor\nimport net.mamoe.mirai.internal.network.handler.selector.NetworkException\nimport net.mamoe.mirai.internal.network.protocol.packet.login.StatSvc\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.network.NoServerAvailableException\nimport net.mamoe.mirai.network.WrongPasswordException\nimport net.mamoe.mirai.utils.TestOnly\nimport kotlin.test.*\n\n/**\n * Test whether the selector can recover the connection after first successful login.\n */\ninternal class SelectorHeartbeatRecoveryTest : AbstractCommonNHTestWithSelector() {\n//    @BeforeTest\n//    fun beforeTest(info: TestInfo) {\n//        println(\"=\".repeat(30) + \"BEGIN: ${info.displayName}\" + \"=\".repeat(30))\n//    }\n//\n//    @AfterTest\n//    fun afterTest(info: TestInfo) {\n//        println(\"=\".repeat(31) + \"END: ${info.displayName}\" + \"=\".repeat(31))\n//    }\n\n    /**\n     * @see NetworkHandler.State.CONNECTING\n     */\n    var throwExceptionOnLogin: (() -> Unit)? = null\n\n    init {\n        overrideComponents[SsoProcessor] = object : TestSsoProcessor(bot) {\n            private val delegate = overrideComponents[SsoProcessor]\n            override suspend fun login(handler: NetworkHandler) {\n                delegate.login(handler)\n                throwExceptionOnLogin?.invoke()\n            }\n        }.apply {\n            setFirstLoginResult(FirstLoginResult.PASSED)\n        }\n    }\n\n    @Test\n    fun `stop on manual close`() = runBlockingUnit {\n        network.resumeConnection()\n        network.close(IllegalStateException(\"Closed by test\"))\n        assertFails { network.resumeConnection() }\n    }\n\n    /**\n     * Emulates system hibernation and network failure.\n     */\n    @Test\n    fun `can recover on heartbeat failure with NettyChannelException`() = runBlockingUnit {\n        // We allow NetworkException to cause a reconnect.\n        testRecoverWhenHeartbeatFailWith { NetworkException(\"test IO ex\", true) }\n\n        bot.components[EventDispatcher].joinBroadcast() // Wait our async connector to complete.\n\n        // BotOfflineMonitor immediately launches a recovery which is UNDISPATCHED, so connection is immediately recovered.\n        assertTrue { bot.network.state != NetworkHandler.State.CLOSED }\n    }\n\n    @Test\n    fun `can recover on LoginFailedException with killBot=false`() = runBlockingUnit {\n        throwExceptionOnLogin = {\n            if (selector.createdInstanceCount != 3) {\n                throw NoServerAvailableException(null)\n            }\n        }\n\n        bot.login()\n        eventDispatcher.joinBroadcast()\n        assertState(NetworkHandler.State.OK)\n        assertEquals(3, selector.createdInstanceCount)\n    }\n\n    @Test\n    fun `can recover on LoginFailedException with killBot=true`() = runBlockingUnit {\n        throwExceptionOnLogin = {\n            throw WrongPasswordException(\"Congratulations! Your bot has been blocked!\")\n        }\n\n        assertFailsWith<WrongPasswordException> { bot.login() }\n        eventDispatcher.joinBroadcast()\n        assertState(NetworkHandler.State.CLOSED)\n        assertEquals(1, selector.createdInstanceCount)\n    }\n\n    @Test\n    fun `can recover on MsfOffline but fail and close bot on next login`() = runBlockingUnit {\n        bot.login()\n        firstLoginResult = FirstLoginResult.PASSED\n        eventDispatcher.joinBroadcast()\n        // Now first login succeed, and all events have been processed.\n        assertState(NetworkHandler.State.OK)\n\n        // Assume bot is blocked.\n        throwExceptionOnLogin = {\n            throw WrongPasswordException(\"Congratulations! Your bot has been blocked!\")\n        }\n        // When blocked, server sends this event.\n        eventDispatcher.broadcast(BotOfflineEvent.MsfOffline(bot, StatSvc.ReqMSFOffline.MsfOfflineToken(bot.uin, 1, 1)))\n        eventDispatcher.joinBroadcast() // Sync for processing the async recovery launched by [BotOfflineEventMonitor]\n\n        // Now we should expect\n        assertState(NetworkHandler.State.CLOSED)\n    }\n\n    @Test\n    fun `cannot recover on other failures`() = runBlockingUnit {\n        // ISE is considered as an internal error (bug).\n        testRecoverWhenHeartbeatFailWith { IllegalStateException() }\n\n        assertState(NetworkHandler.State.CLOSED)\n    }\n\n    private suspend fun testRecoverWhenHeartbeatFailWith(exception: () -> Exception) {\n        val heartbeatScheduler = object : HeartbeatScheduler {\n            lateinit var onHeartFailure: HeartbeatFailureHandler\n            override fun launchJobsIn(\n                network: NetworkHandlerSupport,\n                scope: CoroutineScope,\n                onHeartFailure: HeartbeatFailureHandler,\n            ): List<Job> {\n                this.onHeartFailure = onHeartFailure\n                return listOf(Job())\n            }\n        }\n        overrideComponents[HeartbeatScheduler] = heartbeatScheduler\n\n        bot.login()\n        // Now first login succeed.\n        bot.network.context[EventDispatcher].joinBroadcast()\n        assertState(NetworkHandler.State.OK)\n\n        println(\"1\")\n        heartbeatScheduler.onHeartFailure(\"Test\", exception())\n        println(\"2\")\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/handler/SelectorLoginRecoveryTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler\n\nimport kotlinx.coroutines.test.runTest\nimport net.mamoe.mirai.internal.network.components.FirstLoginResult\nimport net.mamoe.mirai.internal.network.components.SsoProcessor\nimport net.mamoe.mirai.internal.network.framework.AbstractRealNetworkHandlerTest\nimport net.mamoe.mirai.internal.network.framework.TestCommonNetworkHandler\nimport net.mamoe.mirai.internal.network.framework.components.TestSsoProcessor\nimport net.mamoe.mirai.internal.network.handler.selector.SelectorNetworkHandler\nimport net.mamoe.mirai.internal.network.protocol.packet.login.WtLogin\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFailsWith\n\ninternal class SelectorLoginRecoveryTest :\n    AbstractRealNetworkHandlerTest<SelectorNetworkHandler<TestCommonNetworkHandler>>() {\n\n    // does not use selector\n    override val factory: NetworkHandlerFactory<SelectorNetworkHandler<TestCommonNetworkHandler>> =\n        NetworkHandlerFactory<SelectorNetworkHandler<TestCommonNetworkHandler>> { context, address ->\n            SelectorNetworkHandler(TestSelector {\n                object : TestCommonNetworkHandler(bot, context, address) {\n                }\n            })\n        }\n\n    /**\n     * 登录时遇到未知错误, [WtLogin] 会抛 [IllegalStateException] (即抛不可挽救的异常),\n     * selector 应该停止登录, 不要重试, 重新抛出捕获的异常.\n     */\n    @Test\n    fun `rethrow exception caught during Bot_login`() = runTest {\n        val exceptionMessage = \"Login failed!\"\n        setComponent(SsoProcessor, object : TestSsoProcessor(bot) {\n            override suspend fun login(handler: NetworkHandler) {\n                throw IllegalStateException(exceptionMessage)\n            }\n        })\n\n        assertFailsWith<IllegalStateException> {\n            bot.login()\n        }.let { e ->\n            assertEquals(exceptionMessage, e.message)\n        }\n    }\n\n    /**\n     * 登录时遇到未知错误, [WtLogin] 会抛 [IllegalStateException] (即抛不可挽救的异常),\n     * selector 应该 close Bot, 不要 logout, 要重新抛出捕获的异常.\n     */\n    @Test\n    fun `do not call logout when closing bot due to failed to login`() = runTest {\n        val exceptionMessage = \"Login failed!\"\n        setComponent(SsoProcessor, object : TestSsoProcessor(bot) {\n            override suspend fun login(handler: NetworkHandler) {\n                throw IllegalStateException(exceptionMessage)\n            }\n\n            override suspend fun logout(handler: NetworkHandler) {\n                if (firstLoginSucceed) {\n                    throw AssertionError(\"Congratulations! You called logout!\")\n                }\n            }\n        })\n\n        assertEquals(null, bot.components[SsoProcessor].firstLoginResult)\n        bot.components[SsoProcessor].setFirstLoginResult(null)\n        assertFailsWith<IllegalStateException> {\n            bot.login()\n        }.let { e ->\n            assertEquals(exceptionMessage, e.message)\n        }\n        assertEquals(FirstLoginResult.OTHER_FAILURE, bot.components[SsoProcessor].firstLoginResult)\n        bot.close()\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/handler/StandaloneSelectorTests.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler\n\nimport kotlinx.atomicfu.atomic\nimport net.mamoe.mirai.internal.network.components.FirstLoginResult\nimport net.mamoe.mirai.internal.network.components.SsoProcessor\nimport net.mamoe.mirai.internal.network.framework.AbstractCommonNHTest\nimport net.mamoe.mirai.internal.network.framework.PlatformConn\nimport net.mamoe.mirai.internal.network.framework.TestCommonNetworkHandler\nimport net.mamoe.mirai.internal.network.handler.selector.MaxAttemptsReachedException\nimport net.mamoe.mirai.internal.network.handler.selector.NetworkException\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.utils.AtomicInteger\nimport kotlin.test.*\n\n/**\n * Every function can have its own selector.\n */\ninternal class StandaloneSelectorTests : AbstractCommonNHTest() {\n    private class MyException : Exception() {\n        override fun toString(): String {\n            return \"MyException\"\n        }\n    }\n\n    /**\n     * This simulates an error on [NetworkHandler.State.CONNECTING]\n     */\n    private var throwExceptionOnConnecting: (() -> Nothing)? = null\n\n    // does not use selector\n    override val factory: NetworkHandlerFactory<TestCommonNetworkHandler> =\n        NetworkHandlerFactory<TestCommonNetworkHandler> { context, address ->\n            object : TestCommonNetworkHandler(bot, context, address) {\n                override suspend fun createConnection(): PlatformConn {\n                    return throwExceptionOnConnecting?.invoke() ?: PlatformConn()\n                }\n            }\n        }\n\n    @Test\n    fun `should not tolerant any exception except NetworkException thrown by states`() = runBlockingUnit {\n        // selector should not tolerant any exception during state initialization, or in the Jobs launched in states.\n        throwExceptionOnConnecting = {\n            throw MyException()\n        }\n\n        val selector = TestSelector(3) { factory.create(createContext(), createAddress()) }\n        assertFailsWith<Throwable> { selector.awaitResumeInstance() }\n    }\n\n    // Since #1963, any error during first login will close the bot. So we assume first login succeed to do our test.\n    @BeforeTest\n    private fun setFirstLoginPassed() {\n        assertEquals(null, bot.components[SsoProcessor].firstLoginResult)\n        bot.components[SsoProcessor].setFirstLoginResult(FirstLoginResult.PASSED)\n    }\n\n    @Test\n    fun `NetworkException can suggest retrying`() = runBlockingUnit {\n        // selector should not tolerant any exception during state initialization, or in the Jobs launched in states.\n        throwExceptionOnConnecting = {\n            throw object : NetworkException(true) {}\n        }\n\n        val selector = TestSelector(3) { factory.create(createContext(), createAddress()) }\n        assertFailsWith<MaxAttemptsReachedException> { selector.awaitResumeInstance() }.let {\n            assertIs<NetworkException>(it.cause)\n        }\n    }\n\n    @Test\n    fun `NetworkException does not cause retrying if recoverable=false`() = runBlockingUnit {\n        // selector should not tolerant any exception during state initialization, or in the Jobs launched in states.\n        val times = AtomicInteger(0)\n        val theException = object : NetworkException(false) {}\n        throwExceptionOnConnecting = {\n            times.incrementAndGet()\n            throw theException\n        }\n\n        val selector = TestSelector(3) { factory.create(createContext(), createAddress()) }\n        assertFailsWith<NetworkException> { selector.awaitResumeInstance() }.let {\n            assertEquals(1, times.value)\n            assertSame(theException, it)\n        }\n    }\n\n    @Test\n    fun `other exceptions considered as internal error and does not trigger reconnect`() = runBlockingUnit {\n        throwExceptionOnConnecting = {\n            throw MyException()\n        }\n        val selector = TestSelector(3) { factory.create(createContext(), createAddress()) }\n        assertFailsWith<MyException> { selector.awaitResumeInstance() }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/handler/StateObserverTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler\n\nimport net.mamoe.mirai.internal.network.framework.AbstractMockNetworkHandlerTest\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.State.CONNECTING\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.State.INITIALIZED\nimport net.mamoe.mirai.internal.network.handler.state.CombinedStateObserver\nimport net.mamoe.mirai.internal.network.handler.state.CombinedStateObserver.Companion.plus\nimport net.mamoe.mirai.internal.network.handler.state.StateChangedObserver\nimport net.mamoe.mirai.internal.network.handler.state.StateObserver\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertIs\n\ninternal class StateObserverTest : AbstractMockNetworkHandlerTest() {\n    @Test\n    fun `can trigger observer`() {\n        val called = ArrayList<Pair<NetworkHandlerSupport.BaseStateImpl, NetworkHandlerSupport.BaseStateImpl>>()\n        components[StateObserver] = object : StateObserver {\n            override fun stateChanged(\n                networkHandler: NetworkHandlerSupport,\n                previous: NetworkHandlerSupport.BaseStateImpl,\n                new: NetworkHandlerSupport.BaseStateImpl\n            ) {\n                called.add(previous to new)\n            }\n        }\n        val handler = createNetworkHandler()\n        assertEquals(0, called.size)\n        handler.setState(INITIALIZED)\n        assertEquals(1, called.size)\n        assertEquals(INITIALIZED, called[0].first.correspondingState)\n        assertEquals(INITIALIZED, called[0].second.correspondingState)\n        handler.setState(CONNECTING)\n        assertEquals(2, called.size)\n        assertEquals(INITIALIZED, called[1].first.correspondingState)\n        assertEquals(CONNECTING, called[1].second.correspondingState)\n    }\n\n    @Test\n    fun `test StateChangedObserver`() {\n        val called = ArrayList<Pair<NetworkHandlerSupport.BaseStateImpl, NetworkHandlerSupport.BaseStateImpl>>()\n        components[StateObserver] = object : StateChangedObserver(CONNECTING) {\n            override fun stateChanged0(\n                networkHandler: NetworkHandlerSupport,\n                previous: NetworkHandlerSupport.BaseStateImpl,\n                new: NetworkHandlerSupport.BaseStateImpl\n            ) {\n                called.add(previous to new)\n            }\n        }\n        val handler = createNetworkHandler()\n        assertEquals(0, called.size)\n        handler.setState(INITIALIZED)\n        assertEquals(0, called.size)\n        handler.setState(CONNECTING)\n        assertEquals(1, called.size)\n        assertEquals(INITIALIZED, called[0].first.correspondingState)\n        assertEquals(CONNECTING, called[0].second.correspondingState)\n    }\n\n    @Test\n    fun `test StateChangedObserver2`() {\n        val called = ArrayList<NetworkHandlerSupport.BaseStateImpl>()\n        components[StateObserver] = StateChangedObserver(\"test\", INITIALIZED, CONNECTING) { new ->\n            called.add(new)\n        }\n        val handler = createNetworkHandler()\n        assertEquals(0, called.size)\n        handler.setState(INITIALIZED)\n        assertEquals(0, called.size)\n        handler.setState(CONNECTING)\n        assertEquals(1, called.size)\n        assertEquals(CONNECTING, called[0].correspondingState)\n    }\n\n    @Test\n    fun `can combine`() {\n        val called = ArrayList<Pair<NetworkHandlerSupport.BaseStateImpl, NetworkHandlerSupport.BaseStateImpl>>()\n        val added = object : StateChangedObserver(CONNECTING) {\n            override fun stateChanged0(\n                networkHandler: NetworkHandlerSupport,\n                previous: NetworkHandlerSupport.BaseStateImpl,\n                new: NetworkHandlerSupport.BaseStateImpl\n            ) {\n                called.add(previous to new)\n            }\n\n            override fun toString(): String = \"1\"\n        } + object : StateChangedObserver(CONNECTING) {\n            override fun stateChanged0(\n                networkHandler: NetworkHandlerSupport,\n                previous: NetworkHandlerSupport.BaseStateImpl,\n                new: NetworkHandlerSupport.BaseStateImpl\n            ) {\n                called.add(previous to new)\n            }\n\n            override fun toString(): String = \"2\"\n        }\n        assertIs<CombinedStateObserver>(added)\n        assertEquals(\"CombinedStateObserver[1 -> 2]\", added.toString())\n\n        components[StateObserver] = added\n        val handler = createNetworkHandler()\n        assertEquals(0, called.size)\n        handler.setState(INITIALIZED)\n        assertEquals(0, called.size)\n        handler.setState(CONNECTING)\n        assertEquals(2, called.size)\n        assertEquals(INITIALIZED, called[0].first.correspondingState)\n        assertEquals(CONNECTING, called[0].second.correspondingState)\n        assertEquals(INITIALIZED, called[1].first.correspondingState)\n        assertEquals(CONNECTING, called[1].second.correspondingState)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/impl/common/AccountSecretsTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.impl.common\n\nimport net.mamoe.mirai.internal.network.components.AccountSecretsImpl\nimport net.mamoe.mirai.internal.network.components.AccountSecretsManager\nimport net.mamoe.mirai.internal.network.components.FileCacheAccountSecretsManager\nimport net.mamoe.mirai.internal.network.framework.AbstractCommonNHTest\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.internal.utils.accountSecretsFile\nimport net.mamoe.mirai.utils.DeviceInfo\nimport net.mamoe.mirai.utils.SecretsProtection\nimport net.mamoe.mirai.utils.getRandomByteArray\nimport net.mamoe.mirai.utils.writeBytes\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class AccountSecretsTest : AbstractCommonNHTest() {\n    init {\n        overrideComponents.remove(AccountSecretsManager)\n        bot.account.accountSecretsKeyBuffer = SecretsProtection.EscapedByteBuffer(ByteArray(16))\n    }\n\n    @Test\n    fun `can login with no secrets`() = runBlockingUnit {\n        val file = bot.configuration.accountSecretsFile()\n        file.delete()\n        bot.login()\n        bot.network.assertState(NetworkHandler.State.OK)\n    }\n\n    @Test\n    fun `can login with good secrets`() = runBlockingUnit {\n        val file = bot.configuration.accountSecretsFile()\n        val s = AccountSecretsImpl(DeviceInfo.random())\n        FileCacheAccountSecretsManager.saveSecretsToFile(file, bot.account, s)\n        bot.login()\n        bot.network.assertState(NetworkHandler.State.OK)\n        assertEquals(s, bot.components[AccountSecretsManager].getSecrets(bot.account))\n    }\n\n    @Test\n    fun `can login with bad secrets`() = runBlockingUnit {\n        val file = bot.configuration.accountSecretsFile()\n        file.writeBytes(getRandomByteArray(16))\n        bot.login()\n        bot.network.assertState(NetworkHandler.State.OK)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/impl/common/BotLifecycleTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(TestOnly::class)\n\npackage net.mamoe.mirai.internal.network.impl.common\n\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.isActive\nimport kotlinx.coroutines.job\nimport kotlinx.coroutines.test.runTest\nimport net.mamoe.mirai.internal.MockBot\nimport net.mamoe.mirai.internal.network.components.EventDispatcher\nimport net.mamoe.mirai.internal.network.components.SsoProcessor\nimport net.mamoe.mirai.internal.network.framework.AbstractCommonNHTest\nimport net.mamoe.mirai.internal.network.framework.components.TestSsoProcessor\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.State.*\nimport net.mamoe.mirai.internal.network.protocol.packet.IncomingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.login.StatSvc\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.supervisorJob\nimport net.mamoe.mirai.utils.TestOnly\nimport kotlin.test.*\n\ninternal class BotLifecycleTest : AbstractCommonNHTest() {\n\n\n    // not allowed anymore\n\n    //    @Test\n    //    fun `closed on Force offline with BotOfflineEventMonitor`() = runBlockingUnit {\n    //        defaultComponents[BotOfflineEventMonitor] = BotOfflineEventMonitorImpl()\n    //        bot.login()\n    //        assertState(OK)\n    //        BotOfflineEvent.Force(bot, \"test\", \"test\").broadcast()\n    //        assertState(CLOSED)\n    //        assertFalse { network.isActive }\n    //        assertTrue { bot.isActive }\n    //    }\n\n    //    @Test\n    //    fun `closed on Active offline with BotOfflineEventMonitor`() = runBlockingUnit {\n    //        defaultComponents[BotOfflineEventMonitor] = BotOfflineEventMonitorImpl()\n    //        bot.login()\n    //        assertState(OK)\n    //        BotOfflineEvent.Active(bot, null).broadcast()\n    //        assertState(CLOSED)\n    //        assertFalse { network.isActive }\n    //        assertTrue { bot.isActive }\n    //    }\n\n    @Test\n    fun `state is CLOSED after Bot close`() = runBlockingUnit {\n        bot.network.assertState(INITIALIZED)\n        bot.login()\n        bot.network.assertState(OK)\n        bot.closeAndJoin()\n        bot.network.assertState(CLOSED)\n        bot.components[EventDispatcher].joinBroadcast()\n        bot.network.assertState(CLOSED)\n    }\n\n\n    @Test\n    fun `send logout on exit`() = runBlockingUnit {\n        assertIs<TestSsoProcessor>(bot.components[SsoProcessor])\n        bot.network.assertState(INITIALIZED)\n        bot.login()\n        bot.network.assertState(OK)\n        bot.closeAndJoin() // send logout blocking\n        eventDispatcher.joinBroadcast()\n        bot.network.assertState(CLOSED)\n        assertTrue { nhEvents.any { it is NHEvent.Logout } }\n    }\n\n    @Test\n    fun `can override context`() = runBlockingUnit {\n        bot = MockBot {\n            conf {\n                parentCoroutineContext = CoroutineName(\"Overrode\")\n            }\n            networkHandlerProvider { factory.create(createContext(), createAddress()) }\n        }\n        assertEquals(\"Overrode\", bot.coroutineContext[CoroutineName]!!.name)\n    }\n\n    @Test\n    fun `job attached`() = runBlockingUnit {\n        val parentJob = SupervisorJob()\n        bot = MockBot {\n            conf {\n                parentCoroutineContext = parentJob\n            }\n            networkHandlerProvider { factory.create(createContext(), createAddress()) }\n        }\n        assertEquals(1, parentJob.children.count())\n        assertEquals(bot.supervisorJob, parentJob.children.first())\n    }\n\n    @Test\n    fun `network scope closed on bot close`() = runBlockingUnit {\n        assertTrue { network.isActive }\n        bot.closeAndJoin()\n        assertFalse { network.isActive }\n    }\n\n    @Test\n    fun `network closed on SimpleGet Error`() = runBlockingUnit {\n        assertTrue { network.isActive }\n        bot.login()\n        assertTrue { network.isActive }\n        network.collectReceived(\n            IncomingPacket(\n                commandName = StatSvc.SimpleGet.commandName,\n                sequenceId = 1,\n                data = StatSvc.SimpleGet.Response.Error(1, \"test error\"),\n            )\n        )\n        network.coroutineContext.job.join()\n        network.assertState(CLOSED) // we do not use selector in this test so it will be CLOSED. It will recover (reconnect) instead in real.\n        assertFalse { network.isActive }\n    }\n\n    @Test // #2266\n    fun `no StackOverflowError on Bot close`() = runTest {\n        assertTrue { network.isActive }\n        bot.login()\n        assertTrue { network.isActive }\n        overrideComponents[SsoProcessor] = object : TestSsoProcessor(bot) {\n            override suspend fun logout(handler: NetworkHandler) {\n                bot.close()\n            }\n        }\n        bot.close()\n        network.assertState(CLOSED)\n        assertFalse { network.isActive }\n    }\n\n\n    @Test\n    fun `isOnline returns false if network not initialized`() = runBlockingUnit {\n        assertFalse { bot.isOnline }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/impl/common/CommonNHAddressChangedTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.impl.common\n\nimport net.mamoe.mirai.internal.network.components.ServerList\nimport net.mamoe.mirai.internal.network.framework.AbstractCommonNHTest\nimport net.mamoe.mirai.internal.network.framework.TestCommonNetworkHandler\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertNotEquals\nimport kotlin.test.assertTrue\n\ninternal class CommonNHAddressChangedTest : AbstractCommonNHTest() {\n    @Test\n    fun `test login ip changes`() = runBlockingUnit {\n        networkLogger.debug(\"before login, Assuming both ip is empty\")\n        val lastConnectedIpOld = bot.components[ServerList].lastConnectedIP\n        val lastDisconnectedIpOld = bot.components[ServerList].lastDisconnectedIP\n        assertTrue(lastConnectedIpOld.isEmpty(), \"Assuming lastConnectedIp is empty\")\n        assertTrue(lastDisconnectedIpOld.isEmpty(), \"Assuming lastDisconnectedIp is empty\")\n\n        networkLogger.debug(\"Do login, Assuming lastConnectedIp is NOT empty\")\n        bot.login()\n        assertState(NetworkHandler.State.OK)\n        assertNotEquals(\n            lastConnectedIpOld,\n            bot.components[ServerList].lastConnectedIP,\n            \"Assuming lastConnectedIp is NOT empty\"\n        )\n\n        networkLogger.debug(\"Offline the bot, Assuming lastConnectedIp is equals lastDisconnectedIp\")\n        (bot.network as TestCommonNetworkHandler).setStateClosed()\n        assertState(NetworkHandler.State.CLOSED)\n        assertEquals(\n            bot.components[ServerList].lastConnectedIP,\n            bot.components[ServerList].lastDisconnectedIP,\n            \"Assuming lastConnectedIp is equals lastDisconnectedIp\"\n        )\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/impl/common/CommonNHBotNormalLoginTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(TestOnly::class)\n\npackage net.mamoe.mirai.internal.network.impl.common\n\nimport io.ktor.utils.io.errors.*\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.internal.BotAccount\nimport net.mamoe.mirai.internal.MockConfiguration\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.network.component.ConcurrentComponentStorage\nimport net.mamoe.mirai.internal.network.component.setAll\nimport net.mamoe.mirai.internal.network.components.BotOfflineEventMonitor\nimport net.mamoe.mirai.internal.network.components.BotOfflineEventMonitorImpl\nimport net.mamoe.mirai.internal.network.components.FirstLoginResult\nimport net.mamoe.mirai.internal.network.framework.AbstractCommonNHTest\nimport net.mamoe.mirai.internal.network.framework.TestCommonNetworkHandler\nimport net.mamoe.mirai.internal.network.framework.setSsoProcessor\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler\nimport net.mamoe.mirai.internal.network.handler.selector.KeepAliveNetworkHandlerSelector\nimport net.mamoe.mirai.internal.network.handler.selector.NetworkChannelException\nimport net.mamoe.mirai.internal.network.handler.selector.SelectorNetworkHandler\nimport net.mamoe.mirai.internal.network.handler.selectorLogger\nimport net.mamoe.mirai.internal.network.impl.HeartbeatFailedException\nimport net.mamoe.mirai.internal.network.protocol.packet.login.StatSvc\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.network.CustomLoginFailedException\nimport net.mamoe.mirai.utils.TestOnly\nimport net.mamoe.mirai.utils.cast\nimport kotlin.test.*\n\ninternal class CommonNHBotNormalLoginTest : AbstractCommonNHTest() {\n    init {\n        overrideComponents[BotOfflineEventMonitor] = BotOfflineEventMonitorImpl()\n    }\n\n    val selector = KeepAliveNetworkHandlerSelector(selectorLogger) {\n        factory.create(createContext(), createAddress())\n    }\n\n    override val network: TestCommonNetworkHandler\n        get() = selector.getCurrentInstanceOrCreate().cast()\n\n    override fun createBot(account: BotAccount): QQAndroidBot {\n        return object : QQAndroidBot(account, MockConfiguration.copy()) {\n            override fun createBotLevelComponents(): ConcurrentComponentStorage =\n                super.createBotLevelComponents().apply { setAll(overrideComponents) }\n\n            override fun createNetworkHandler(): NetworkHandler =\n                SelectorNetworkHandler(selector)\n        }\n    }\n\n\n    class CusLoginException(message: String?) : CustomLoginFailedException(true, message)\n\n    @AfterTest\n    fun `close bot`() = runBlockingUnit {\n        bot.logger.info(\"[TEST UNIT] Releasing bot....\")\n        bot.closeAndJoin()\n    }\n\n    @Test\n    fun `test login fail`() = runBlockingUnit {\n        setSsoProcessor { throw CusLoginException(\"A\") }\n        assertFailsWith<CusLoginException>(\"A\") { bot.login() }\n        assertFalse(bot.isActive)\n    }\n\n    // #1963\n    @Test\n    fun `test first login failure with internally handled exceptions`() = runBlockingUnit {\n        setSsoProcessor { throw IOException(\"test Connection reset by peer\") }\n        assertFailsWith<IOException>(\"test Connection reset by peer\") { bot.login() }\n        assertState(NetworkHandler.State.CLOSED)\n    }\n\n    // #1963\n    @Test\n    fun `test first login failure with internally handled exceptions2`() = runBlockingUnit {\n        setSsoProcessor { throw NetworkChannelException(\"test Connection reset by peer\") }\n        assertFailsWith<NetworkChannelException>(\"test Connection reset by peer\") { bot.login() }\n        assertState(NetworkHandler.State.CLOSED)\n    }\n\n    // #1963\n    @Test\n    fun `test first login failure with internally handled exceptions3`() = runBlockingUnit {\n        setSsoProcessor {\n            //Throw TimeoutCancellationException\n            withTimeout(1) {\n                delay(1000)\n            }\n        }\n        assertFailsWith<TimeoutCancellationException>(\"test TimeoutCancellationException\") { bot.login() }\n        assertState(NetworkHandler.State.CLOSED)\n    }\n\n    // 经过 #1963 考虑后在初次登录遇到任何错误都终止并传递异常\n//    @Test\n//    fun `test network broken`() = runBlockingUnit {\n//        var retryCounter = 0\n//        setSsoProcessor {\n//            eventDispatcher.joinBroadcast()\n//            if (retryCounter++ >= 15) {\n//                return@setSsoProcessor\n//            }\n//            channel.pipeline().fireExceptionCaught(IOException(\"TestNetworkBroken\"))\n//            awaitCancellation() // receive exception from \"network\"\n//        }\n//        bot.login()\n//    }\n\n    @Test\n    fun `test resume after MsfOffline received after first login`() = runBlockingUnit {\n        bot.login()\n        assertEquals(FirstLoginResult.PASSED, firstLoginResult)\n        bot.network.close(StatSvc.ReqMSFOffline.MsfOfflineToken(0, 0, 0))\n\n        eventDispatcher.joinBroadcast()\n        yield() // auto resume in BotOfflineEventMonitor\n        eventDispatcher.joinBroadcast()\n\n        assertState(NetworkHandler.State.OK)\n    }\n\n    // #2504, #2488\n    @Test\n    fun `test resume failed with TimeoutCancellationException`() = runBlockingUnit {\n        var first = true\n        var failCount = 3\n        setSsoProcessor {\n            if (first) {\n                first = false\n            } else {\n                if (failCount > 0) {\n                    failCount--\n                    //Throw TimeoutCancellationException\n                    withTimeout(1) {\n                        delay(1000)\n                    }\n                }\n            }\n        }\n        bot.login()\n        bot.network.close(HeartbeatFailedException(\"Heartbeat Timeout\", RuntimeException(\"Timeout stub\"), true))\n        eventDispatcher.joinBroadcast()\n        yield() // auto resume in BotOfflineEventMonitor\n        eventDispatcher.joinBroadcast()\n        assertState(NetworkHandler.State.OK)\n    }\n\n}\n"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/impl/common/CommonNHEventTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(TestOnly::class)\n\npackage net.mamoe.mirai.internal.network.impl.common\n\nimport kotlinx.atomicfu.atomic\nimport kotlinx.coroutines.CompletableDeferred\nimport kotlinx.coroutines.isActive\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.event.events.BotOfflineEvent\nimport net.mamoe.mirai.event.events.BotOnlineEvent\nimport net.mamoe.mirai.event.events.BotReloginEvent\nimport net.mamoe.mirai.internal.network.components.FirstLoginResult\nimport net.mamoe.mirai.internal.network.components.SsoProcessor\nimport net.mamoe.mirai.internal.network.framework.AbstractCommonNHTest\nimport net.mamoe.mirai.internal.network.framework.eventDispatcher\nimport net.mamoe.mirai.internal.network.framework.setSsoProcessor\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.State.*\nimport net.mamoe.mirai.internal.test.assertEventBroadcasts\nimport net.mamoe.mirai.internal.test.assertEventNotBroadcast\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.supervisorJob\nimport net.mamoe.mirai.utils.TestOnly\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertTrue\n\n\ninternal class CommonNHEventTest : AbstractCommonNHTest() {\n    @Test\n    fun `BotOnlineEvent after successful logon`() = runBlockingUnit {\n        assertEventBroadcasts<BotOnlineEvent> {\n            assertEquals(INITIALIZED, network.state)\n            bot.login() // launches a job which broadcasts the event\n            eventDispatcher.joinBroadcast()\n            assertEquals(OK, network.state)\n        }\n    }\n\n\n    @Test\n    fun `BotOnlineEvent after successful reconnection`() = runBlockingUnit {\n        assertEquals(INITIALIZED, network.state)\n        bot.login()\n        bot.components[SsoProcessor].setFirstLoginResult(FirstLoginResult.PASSED)\n        assertEquals(OK, network.state)\n        eventDispatcher.joinBroadcast() // `login` launches a job which broadcasts the event\n        assertEventBroadcasts<BotOnlineEvent>(1) {\n            network.setStateConnecting()\n            network.resumeConnection()\n            eventDispatcher.joinBroadcast()\n            assertEquals(OK, network.state)\n        }\n    }\n\n    @Test\n    fun `BotOfflineEvent after successful reconnection`() = runBlockingUnit {\n        assertEquals(INITIALIZED, network.state)\n        bot.login()\n        bot.components[SsoProcessor].setFirstLoginResult(FirstLoginResult.PASSED)\n        assertEquals(OK, network.state)\n        eventDispatcher.joinBroadcast() // `login` launches a job which broadcasts the event\n        assertEventBroadcasts<BotOfflineEvent>(1) {\n            network.setStateClosed()\n            eventDispatcher.joinBroadcast()\n            assertState(CLOSED)\n        }\n    }\n\n\n    @Test\n    fun `from CONNECTING TO OK the first time`() = runBlockingUnit {\n        val ok = CompletableDeferred<Unit>()\n        setSsoProcessor {\n            ok.join()\n        }\n        assertState(INITIALIZED)\n        network.setStateConnecting()\n        assertEventBroadcasts<Event>(1) {\n            ok.complete(Unit)\n            network.resumeConnection()\n            eventDispatcher.joinBroadcast()\n        }.let { event ->\n            assertEquals(BotOnlineEvent::class, event[0]::class)\n        }\n    }\n\n    @Test\n    fun `from CONNECTING TO OK the second time`() = runBlockingUnit {\n        val ok = object {\n            val v = atomic(CompletableDeferred<Unit>())\n        }\n        setSsoProcessor {\n            ok.v.value.join()\n        }\n\n        assertState(INITIALIZED)\n\n        network.setStateConnecting()\n        ok.v.value.complete(Unit)\n        network.resumeConnection()\n        assertState(OK)\n\n        ok.v.value = CompletableDeferred()\n        network.setStateConnecting()\n        eventDispatcher.joinBroadcast()\n        println(\"Starting receiving events\")\n        assertEventBroadcasts<Event>(2) {\n            ok.v.value.complete(Unit)\n            network.resumeConnection()\n            eventDispatcher.joinBroadcast()\n        }.let { event ->\n            assertEquals(BotOnlineEvent::class, event[0]::class)\n            assertEquals(BotReloginEvent::class, event[1]::class)\n        }\n    }\n\n    @Test\n    fun `BotOffline from OK TO CLOSED`() = runBlockingUnit {\n        bot.login()\n        assertState(OK)\n        eventDispatcher.joinBroadcast() // `login` launches a job which broadcasts the event\n        assertEventBroadcasts<Event>(1) {\n            network.close(null)\n            assertState(CLOSED)\n            eventDispatcher.joinBroadcast()\n        }.let { event ->\n            assertEquals(BotOfflineEvent.Active::class, event[0]::class)\n        }\n    }\n\n    @Test\n    fun `BotOffline from OK TO CLOSED by bot close`() = runBlockingUnit {\n        bot.login()\n        assertState(OK)\n        assertEquals(FirstLoginResult.PASSED, firstLoginResult)\n        eventDispatcher.joinBroadcast() // `login` launches a job which broadcasts the event\n        assertEventBroadcasts<Event>(1) {\n            assertTrue { bot.isActive }\n            bot.close(null)\n            bot.supervisorJob.join()\n            assertState(CLOSED)\n            eventDispatcher.joinBroadcast()\n        }.let { event ->\n            assertEquals(BotOfflineEvent.Active::class, event[0]::class)\n        }\n    }\n\n    @Test\n    fun `no BotOffline from CONNECTING TO CLOSED`() = runBlockingUnit {\n        network.setStateConnecting()\n        eventDispatcher.joinBroadcast() // `login` launches a job which broadcasts the event\n        assertEventNotBroadcast {\n            network.setStateClosed()\n            network.resumeConnection()\n            eventDispatcher.joinBroadcast()\n        }\n    }\n\n    @Test\n    fun `BotReloginEvent after successful reconnection`() = runBlockingUnit {\n        assertEventBroadcasts<BotReloginEvent> {\n            assertState(INITIALIZED)\n            bot.login()\n            assertState(OK)\n            bot.components[SsoProcessor].setFirstLoginResult(FirstLoginResult.PASSED)\n            network.setStateConnecting()\n            network.resumeConnection()\n            assertState(OK)\n            network.eventDispatcher.joinBroadcast()\n            assertState(OK)\n        }\n    }\n\n//\n//    @Test\n//    fun `no event from INITIALIZED TO OK`() = runBlockingUnit {\n//        assertState(INITIALIZED)\n//        bot.login()\n//        assertState(OK)\n//        network.setStateConnecting()\n//        eventDispatcher.joinBroadcast() // `login` launches a job which broadcasts the event\n//        assertEventBroadcasts<Event>(0) {\n//            network.resumeConnection()\n//            eventDispatcher.joinBroadcast()\n//        }\n//    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/impl/common/ResumeConnectionTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.impl.netty\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.network.framework.AbstractCommonNHTest\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport kotlin.test.Test\nimport kotlin.test.assertFailsWith\n\ninternal class ResumeConnectionTest : AbstractCommonNHTest() {\n\n    private val packet = OutgoingPacket(\"\", \"\", 1, ByteReadPacket.Empty)\n\n    @Test\n    fun `cannot resume on CLOSED`() = runBlockingUnit {\n        network.setStateClosed()\n        assertFailsWith<IllegalStateException> {\n            network.sendWithoutExpect(packet)\n        }\n    }\n\n    @Test\n    fun `resumeConnection switches a state that can send packet on INITIALIZED`() = runBlockingUnit {\n        network.resumeConnection()\n        network.sendWithoutExpect(packet)\n    }\n\n    @Test\n    fun `resumeConnection switches a state that can send packet on CONNECTING`() = runBlockingUnit {\n        network.setStateConnecting()\n        network.resumeConnection()\n        network.sendWithoutExpect(packet)\n    }\n\n    @Test\n    fun `resumeConnection switches a state that can send packet on LOADING`() = runBlockingUnit {\n        network.setStateLoading(conn)\n        network.resumeConnection()\n        network.sendWithoutExpect(packet)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/impl/common/SendPacketTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.impl.common\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.coroutines.CoroutineStart\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.yield\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.framework.AbstractCommonNHTest\nimport net.mamoe.mirai.internal.network.protocol.packet.IncomingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.utils.AtomicBoolean\nimport kotlin.test.Test\nimport kotlin.test.assertNotNull\nimport kotlin.test.assertTrue\n\ninternal class SendPacketTest : AbstractCommonNHTest() {\n    // single thread so we can use [yield] to transfer dispatch\n    private val singleThreadDispatcher = borrowSingleThreadDispatcher()\n\n    @Test\n    fun `sendPacketImpl suspends until a valid state`() = runBlockingUnit(singleThreadDispatcher) {\n        val expectStop = AtomicBoolean(false)\n\n        // coroutine starts immediately and suspends at `net.mamoe.mirai.internal.network.impl.netty.NettyNetworkHandler.sendPacketImpl`\n        launch(singleThreadDispatcher, start = CoroutineStart.UNDISPATCHED) {\n            assertNotNull(network.sendAndExpect(OutgoingPacket(\"name\", \"cmd\", 1, ByteReadPacket.Empty)))\n            assertTrue { expectStop.value }\n        }\n        network.setStateOK(conn) // then we can send packet.\n        yield() // yields the thread to run `sendAndExpect`\n\n        // when we got thread here again, `sendAndExpect` is suspending for response [Packet].\n        network.collectReceived(IncomingPacket(\"cmd\", 1, object : Packet {}))\n        // now `sendAndExpect` should finish (asynchronously).\n        expectStop.value = true\n    }\n\n    @Test\n    fun `sendPacketImpl does not suspend if state is valid`() = runBlockingUnit(singleThreadDispatcher) {\n        network.setStateOK(conn) // then we can send packet.\n        val expectStop = AtomicBoolean(false)\n\n        val job = launch(singleThreadDispatcher, start = CoroutineStart.UNDISPATCHED) {\n            assertNotNull(network.sendAndExpect(OutgoingPacket(\"name\", \"cmd\", 1, ByteReadPacket.Empty)))\n            assertTrue { expectStop.value } // ensures `sendAndExpect` does not finish immediately. (We expect one suspension.)\n        }\n        expectStop.value = true\n        network.collectReceived(IncomingPacket(\"cmd\", 1, object : Packet {}))\n        yield()\n        assertTrue(job.isCompleted)\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/network/impl/common/SetStateTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(TestOnly::class)\n\npackage net.mamoe.mirai.internal.network.impl.common\n\nimport kotlinx.coroutines.CoroutineScope\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.event.events.BotOfflineEvent\nimport net.mamoe.mirai.internal.AbstractBot\nimport net.mamoe.mirai.internal.network.components.BotOfflineEventMonitor\nimport net.mamoe.mirai.internal.network.framework.AbstractCommonNHTest\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.State.*\nimport net.mamoe.mirai.internal.test.assertEventBroadcasts\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.utils.TestOnly\nimport kotlin.test.*\n\ninternal class SetStateTest : AbstractCommonNHTest() {\n    @Test\n    fun `setState should ignore duplications INITIALIZED to CLOSED to CLOSED`() {\n        assertState(INITIALIZED)\n        assertNotNull(network.setStateClosed(IllegalStateException(\"1\")))\n        assertState(CLOSED)\n        assertNull(network.setStateClosed(IllegalStateException(\"2\")))\n        assertState(CLOSED)\n    }\n\n    @Test\n    fun `setState should ignore duplications OK to CLOSED to CLOSED`() {\n        assertNotNull(network.setStateOK(conn))\n        assertState(OK)\n        assertNotNull(network.setStateClosed(IllegalStateException(\"1\")))\n        assertState(CLOSED)\n        assertNull(network.setStateClosed(IllegalStateException(\"2\")))\n        assertState(CLOSED)\n    }\n\n    @Test\n    fun `setState should ignore duplications 2 OK to CLOSED to CLOSED`() = runBlockingUnit {\n        overrideComponents[BotOfflineEventMonitor] = object : BotOfflineEventMonitor {\n            override fun attachJob(bot: AbstractBot, scope: CoroutineScope) {\n            }\n        }\n        assertNotNull(network.setStateOK(conn))\n        assertState(OK)\n        assertEventBroadcasts<Event> {\n            assertNotNull(network.setStateClosed(IllegalStateException(\"1\")))\n            assertState(CLOSED)\n            assertNull(network.setStateClosed(IllegalStateException(\"2\")))\n            assertState(CLOSED)\n            eventDispatcher.joinBroadcast()\n        }.let { list ->\n            assertEquals(1, list.size)\n            assertIs<BotOfflineEvent.Active>(list[0])\n        }\n    }\n\n    @Test\n    fun `Precondition - setState should ignore duplications 2 OK to CLOSED to CLOSED`() = runBlockingUnit {\n        assertNotNull(network.setStateOK(conn))\n        assertState(OK)\n        assertEventBroadcasts<Event> {\n            assertNotNull(network.setStateClosed(IllegalStateException(\"1\")))\n            assertState(CLOSED)\n            eventDispatcher.joinBroadcast()\n        }.let { list ->\n            assertEquals(1, list.size)\n            assertIs<BotOfflineEvent.Active>(list[0])\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/notice/processors/AbstractNoticeProcessorTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(TestOnly::class)\n\npackage net.mamoe.mirai.internal.notice.processors\n\nimport kotlinx.serialization.SerializationStrategy\nimport kotlinx.serialization.serializer\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.internal.BotAccount\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.asQQAndroidBot\nimport net.mamoe.mirai.internal.contact.*\nimport net.mamoe.mirai.internal.contact.info.FriendInfoImpl\nimport net.mamoe.mirai.internal.contact.info.GroupInfoImpl\nimport net.mamoe.mirai.internal.contact.info.MemberInfoImpl\nimport net.mamoe.mirai.internal.contact.info.StrangerInfoImpl\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.internal.network.components.*\nimport net.mamoe.mirai.internal.network.components.NoticeProcessorPipeline.Companion.noticeProcessorPipeline\nimport net.mamoe.mirai.internal.network.framework.AbstractCommonNHTest\nimport net.mamoe.mirai.internal.network.protocol.packet.IncomingPacket\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.ProtocolStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars\nimport net.mamoe.mirai.utils.*\n\n\n/**\n * To add breakpoint, see [NoticeProcessorPipelineImpl.process]\n */\ninternal abstract class AbstractNoticeProcessorTest : AbstractCommonNHTest(), GroupExtensions {\n    init {\n        setSystemProp(\"mirai.network.notice.pipeline.log.full\", \"true\")\n    }\n\n    protected class UseTestContext(\n        val attributes: MutableTypeSafeMap\n    ) {\n        val EMPTY_BYTE_ARRAY get() = net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY\n        fun String.hexToBytes() = hexToUBytes().toByteArray()\n\n        internal inline fun <reified T : JceStruct> T.toByteArray(\n            serializer: SerializationStrategy<T> = serializer(),\n        ): ByteArray = Tars.UTF_8.encodeToByteArray(serializer, this)\n\n    }\n\n    protected suspend inline fun use(\n        attributes: TypeSafeMap = createTypeSafeMap(),\n        pipeline: NoticeProcessorPipeline = bot.components.noticeProcessorPipeline,\n        block: UseTestContext.() -> ProtocolStruct\n    ): Collection<Packet> {\n        bot.components[SsoProcessor].setFirstLoginResult(FirstLoginResult.PASSED)\n        val handler = LoggingPacketHandlerAdapter(PacketLoggingStrategyImpl(bot), bot.logger)\n        val context = UseTestContext(attributes.toMutableTypeSafeMap())\n        return pipeline.process(block(context), context.attributes).collected.also { list ->\n            for (packet in list) {\n                handler.handlePacket(IncomingPacket(\"test\", packet))\n            }\n        }\n    }\n\n    protected suspend inline fun use(\n        attributes: TypeSafeMap = createTypeSafeMap(),\n        crossinline createContext: NoticeProcessorPipelineImpl.(attributes: TypeSafeMap) -> NoticeProcessorPipelineImpl.ContextImpl,\n        block: UseTestContext.() -> ProtocolStruct\n    ): Collection<Packet> =\n        use(attributes, pipeline = object : NoticeProcessorPipelineImpl(bot) {\n            init {\n                bot.components.noticeProcessorPipeline.processors.forEach { registerProcessor(it.value) }\n            }\n\n            override fun createContext(data: ProtocolStruct, attributes: TypeSafeMap): NoticePipelineContext =\n                createContext(this, attributes)\n        }, block)\n\n    open fun setBot(id: Long): QQAndroidBot {\n        bot = createBot(BotAccount(id, \"a\"))\n        return bot\n    }\n}\n\ninternal interface GroupExtensions {\n\n    @Suppress(\"TestFunctionName\")\n    fun GroupInfo(\n        uin: Long,\n        owner: Long,\n        groupCode: Long,\n        memo: String = \"\",\n        name: String,\n        allowMemberInvite: Boolean = false,\n        allowAnonymousChat: Boolean = false,\n        autoApprove: Boolean = false,\n        confessTalk: Boolean = false,\n        muteAll: Boolean = false,\n        botMuteTimestamp: Int = 0,\n        honorShow: Boolean = false,\n        titleShow: Boolean = false,\n        temperatureShow: Boolean = false,\n        rankTitles: Map<Int, String> = emptyMap(),\n        temperatureTitles: Map<Int, String> = emptyMap(),\n    ): GroupInfoImpl =\n        GroupInfoImpl(\n            uin, owner, groupCode, memo, name,\n            allowMemberInvite, allowAnonymousChat, autoApprove, confessTalk, muteAll,\n            botMuteTimestamp,\n            honorShow, titleShow, temperatureShow, rankTitles, temperatureTitles\n        )\n\n    fun Bot.addGroup(group: Group) {\n        groups.delegate.add(group)\n    }\n\n    fun Bot.addFriend(friend: Friend) {\n        friends.delegate.add(friend)\n    }\n\n    fun Bot.addFriend(id: Long, nick: String = \"friend$id\", remark: String = \"\", friendGroupId: Int = 0): FriendImpl {\n        return FriendImpl(bot.cast(), bot.coroutineContext, FriendInfoImpl(id, nick, remark, friendGroupId)).also {\n            friends.delegate.add(it)\n        }\n    }\n\n    fun Bot.addStranger(id: Long, nick: String = \"stranger$id\", fromGroupId: Long = 0): StrangerImpl {\n        return StrangerImpl(bot.cast(), bot.coroutineContext, StrangerInfoImpl(id, nick, fromGroupId)).also {\n            strangers.delegate.add(it)\n        }\n    }\n\n    fun Group.addMember(member: NormalMember) {\n        members.delegate.add(member)\n    }\n\n\n    fun Bot.addGroup(\n        id: Long,\n        owner: Long,\n        botPermission: MemberPermission = MemberPermission.MEMBER,\n        memo: String = \"\",\n        name: String = \"Test Group\",\n        allowMemberInvite: Boolean = false,\n        allowAnonymousChat: Boolean = false,\n        autoApprove: Boolean = false,\n        confessTalk: Boolean = false,\n        muteAll: Boolean = false,\n        botMuteTimestamp: Int = 0,\n    ): GroupImpl {\n        val impl = GroupImpl(\n            bot.cast(), coroutineContext, id,\n            GroupInfo(\n                @Suppress(\"DEPRECATION\")\n                Mirai.calculateGroupUinByGroupCode(id), owner, id, memo, name, allowMemberInvite,\n                allowAnonymousChat, autoApprove, confessTalk, muteAll, botMuteTimestamp\n            ),\n            ContactList(),\n        )\n        addGroup(impl)\n        impl.botAsMember = impl.addMember(bot.id, nick = bot.nick, permission = botPermission)\n        return impl\n    }\n\n    fun Bot.addGroup(\n        id: Long,\n        info: GroupInfoImpl,\n        botPermission: MemberPermission = MemberPermission.MEMBER,\n    ): Group {\n        val impl = GroupImpl(\n            bot.cast(), coroutineContext, id, info,\n            ContactList(),\n        )\n        addGroup(impl)\n        impl.botAsMember = impl.addMember(bot.id, nick = bot.nick, permission = botPermission)\n        return impl\n    }\n\n    fun Group.addMember(\n        id: Long,\n        nick: String = \"user$id\",\n        permission: MemberPermission,\n        remark: String = \"\",\n        nameCard: String = \"\",\n        specialTitle: String = \"\",\n        muteTimestamp: Int = 0,\n        anonymousId: String? = null,\n        joinTimestamp: Int = currentTimeSeconds().toInt(),\n        lastSpeakTimestamp: Int = 0,\n        isOfficialBot: Boolean = false,\n    ): NormalMemberImpl {\n        val member = NormalMemberImpl(\n            this.cast(), this.coroutineContext,\n            MemberInfoImpl(\n                id, nick, permission, remark, nameCard,\n                specialTitle, muteTimestamp, anonymousId, joinTimestamp, lastSpeakTimestamp, isOfficialBot\n            )\n        )\n        members.delegate.add(\n            member\n        )\n        return member\n    }\n\n    fun Group.addMember(\n        id: Long,\n        info: MemberInfoImpl,\n    ): Group {\n        members.delegate.add(NormalMemberImpl(this.cast(), this.coroutineContext, info))\n        return this\n    }\n\n    fun Bot.addOtherClient(\n        appId: Int,\n        platform: Platform = Platform.IOS,\n        deviceName: String = \"my device $appId\",\n        deviceKind: String = \"my device kind $appId\"\n    ): OtherClient {\n        return bot.asQQAndroidBot().createOtherClient(OtherClientInfo(appId, platform, deviceName, deviceKind)).also {\n            this.otherClients.delegate.add(it)\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/notice/processors/BotInvitedJoinTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.notice.processors\n\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.event.events.BotInvitedJoinGroupRequestEvent\nimport net.mamoe.mirai.event.events.BotJoinGroupEvent\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.contact.GroupImpl\nimport net.mamoe.mirai.internal.network.components.NoticeProcessorPipelineImpl\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertIs\n\ninternal class BotInvitedJoinTest : AbstractNoticeProcessorTest() {\n    @Test\n    fun `invited join`() = runBlockingUnit {\n        suspend fun runTest() = use {\n\n            Structmsg.StructMsg(\n                version = 1,\n                msgType = 2,\n                msgSeq = 1630,\n                msgTime = 1630,\n                reqUin = 1230,\n                msg = Structmsg.SystemMsg(\n                    subType = 1,\n                    msgTitle = \"邀请加群\",\n                    msgDescribe = \"邀请你加入 %group_name%\",\n                    actions = mutableListOf(\n                        Structmsg.SystemMsgAction(\n                            name = \"拒绝\",\n                            result = \"已拒绝\",\n                            actionInfo = Structmsg.SystemMsgActionInfo(\n                                type = 12,\n                                groupCode = 2230203,\n                            ),\n                            detailName = \"拒绝\",\n                        ), Structmsg.SystemMsgAction(\n                            name = \"同意\",\n                            result = \"已同意\",\n                            actionInfo = Structmsg.SystemMsgActionInfo(\n                                type = 11,\n                                groupCode = 2230203,\n                            ),\n                            detailName = \"同意\",\n                        ), Structmsg.SystemMsgAction(\n                            name = \"忽略\",\n                            result = \"已忽略\",\n                            actionInfo = Structmsg.SystemMsgActionInfo(\n                                type = 14,\n                                groupCode = 2230203,\n                            ),\n                            detailName = \"忽略\",\n                        )\n                    ),\n                    groupCode = 2230203,\n                    actionUin = 1230001,\n                    groupMsgType = 2,\n                    groupInviterRole = 1,\n                    groupInfo = Structmsg.GroupInfo(\n                        appPrivilegeFlag = 67698880,\n                    ),\n                    msgInviteExtinfo = Structmsg.MsgInviteExt(\n                    ),\n                    reqUinNick = \"user3\",\n                    groupName = \"testtest\",\n                    actionUinNick = \"user1\",\n                    groupExtFlag = 1075905600,\n                    actionUinQqNick = \"user1\",\n                    reqUinGender = 255,\n                    c2cInviteJoinGroupFlag = 1,\n                ),\n            )\n        }\n\n        setBot(1230003)\n\n        runTest().toList().run {\n            assertEquals(1, size, toString())\n            get(0).run {\n                assertIs<BotInvitedJoinGroupRequestEvent>(this)\n                assertEquals(1230001, invitorId)\n                assertEquals(\"user1\", invitorNick)\n                assertEquals(2230203, groupId)\n                assertEquals(\"testtest\", groupName)\n                assertEquals(1630, eventId)\n            }\n        }\n\n    }\n\n    @Test\n    fun `invited join  accepted`() = runBlockingUnit {\n        // https://github.com/mamoe/mirai/issues/1213\n        suspend fun runTest() = use(\n            createContext = { attributes ->\n                object : NoticeProcessorPipelineImpl.ContextImpl(attributes) {\n                    override suspend fun QQAndroidBot.addNewGroupByCode(code: Long): GroupImpl {\n                        assertEquals(2230203, code)\n                        return bot.addGroup(2230203, 1230001, name = \"testtest\").apply {\n                            addMember(1230003, permission = MemberPermission.MEMBER)\n                            addMember(1230001, permission = MemberPermission.OWNER)\n                        }\n                    }\n                }\n            }\n        ) {\n            net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.Msg(\n                msgHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.MsgHead(\n                    fromUin = 2230203,\n                    toUin = 1230002,\n                    msgType = 33,\n                    msgSeq = 593,\n                    msgTime = 1632,\n                    msgUid = 14411518,\n                    authUin = 1230002,\n                    authNick = \"user2\",\n                    extGroupKeyInfo = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.ExtGroupKeyInfo(\n                        curMaxSeq = 1652,\n                        curTime = 16327,\n                    ),\n                    authSex = 2,\n                ),\n                msgBody = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MsgBody(\n                    msgContent = \"00 22 07 BB 01 00 12 C4 B2 03 00 12 C4 B1 06 B4 B4 BD A8 D5 DF 00 30 31 39 37 31 44 32 34 34 31 44 30 42 30 45 41 44 42 35 35 32 46 43 33 31 35 32 36 33 43 45 39 39 43 45 43 43 35 46 30 35 45 32 46 38 39 44 41 33\".hexToBytes(),\n                ),\n            )\n        }\n\n        setBot(1230002)\n\n        runTest().toList().run {\n            assertEquals(1, size, toString())\n            get(0).run {\n                assertIs<BotJoinGroupEvent.Invite>(this)\n                assertEquals(1230001, invitor.id)\n            }\n        }\n\n    }\n\n\n    @Test\n    fun `invitation accepted`() = runBlockingUnit {\n        suspend fun runTest() =\n            use(createContext = { attributes ->\n                object : NoticeProcessorPipelineImpl.ContextImpl(attributes) {\n                    override suspend fun QQAndroidBot.addNewGroupByCode(code: Long): GroupImpl {\n                        assertEquals(2230203, code)\n                        return bot.addGroup(2230203, 1230002, name = \"testtest\").apply {\n                            addMember(1230001, permission = MemberPermission.MEMBER)\n                        }\n                    }\n                }\n            }) {\n                net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.Msg(\n                    msgHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.MsgHead(\n                        fromUin = 2230203,\n                        toUin = 1230003,\n                        msgType = 33,\n                        msgSeq = 61485,\n                        msgTime = 1630,\n                        msgUid = 1441,\n                        authUin = 1230003,\n                        authNick = \"user3\",\n                        extGroupKeyInfo = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.ExtGroupKeyInfo(\n                            curMaxSeq = 1631,\n                            curTime = 1630,\n                        ),\n                    ),\n                    contentHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.ContentHead(\n                    ),\n                    msgBody = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MsgBody(\n                        richText = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.RichText(\n                        ),\n                        msgContent = \"00 22 07 BB 01 00 12 C4 B3 03 00 12 C4 B1 00 00 30 34 32 42 39 44 46 43 34 39 45 42 34 30 46 41 42 45 45 32 33 36 34 37 45 46 39 35 31 44 44 42 31 31 32 36 31 31 38 44 43 46 44 32 37 42 30 42 45\".hexToBytes(),\n                    ),\n                )\n            }\n\n        setBot(1230003)\n\n        runTest().toList().run {\n            assertEquals(1, size, toString())\n            get(0).run {\n                assertIs<BotJoinGroupEvent.Invite>(this)\n                assertEquals(1230001, invitor.id)\n                assertEquals(2230203, group.id)\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/notice/processors/FriendNickChangeTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.notice.processors\n\nimport net.mamoe.mirai.event.events.FriendNickChangedEvent\nimport net.mamoe.mirai.internal.network.protocol.data.jce.MsgInfo\nimport net.mamoe.mirai.internal.network.protocol.data.jce.MsgType0x210\nimport net.mamoe.mirai.internal.network.protocol.data.jce.OnlinePushPack\nimport net.mamoe.mirai.internal.network.protocol.data.jce.ShareData\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Submsgtype0x27.SubMsgType0x27\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertIs\n\ninternal class FriendNickChangeTest : AbstractNoticeProcessorTest() {\n\n    @Test\n    fun `nick changed`() = runBlockingUnit {\n        // FriendNickChangedEvent 内容异常 https://github.com/mamoe/mirai/issues/1356\n\n        suspend fun runTest() = use {\n\n            OnlinePushPack.SvcReqPushMsg(\n                uin = 1230002,\n                uMsgTime = 1633037660,\n                vMsgInfos = mutableListOf(\n                    MsgInfo(\n                        lFromUin = 1230002,\n                        shMsgType = 528,\n                        shMsgSeq = 142,\n                        strMsg = \"\",\n                        uRealMsgTime = 160,\n                        vMsg = MsgType0x210(\n                            uSubMsgType = 39,\n                            vProtobuf = SubMsgType0x27.SubMsgType0x27MsgBody(\n                                msgModInfos = mutableListOf(\n                                    SubMsgType0x27.ForwardBody(\n                                        opType = 20,\n                                        msgModProfile = SubMsgType0x27.ModProfile(\n                                            uin = 1230001,\n                                            msgProfileInfos = mutableListOf(\n                                                SubMsgType0x27.ProfileInfo(\n                                                    field = 20002,\n                                                    value = \"ABC\",\n                                                )\n                                            ),\n                                        ),\n                                    )\n                                ),\n                            )\n                                .toByteArray(SubMsgType0x27.SubMsgType0x27MsgBody.serializer()),\n                        ).toByteArray(),\n                        uAppShareID = 0,\n                        vMsgCookies = \"08 90 04 10 90 84 A0 81 80 80 80 80 02 18 00 20 E3 86 03\".hexToBytes(),\n                        lMsgUid = 14411,\n                        lLastChangeTime = 1,\n                        vCPicInfo = mutableListOf(),\n                        stShareData = ShareData(\n                        ),\n                        lFromInstId = 0,\n                        vRemarkOfSender = net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY,\n                        strFromMobile = \"\",\n                        strFromName = \"\",\n                        vNickName = mutableListOf(),\n                    )\n                ),\n                svrip = 1273521418,\n            )\n\n        }\n\n        setBot(1230002).apply {\n            addFriend(1230001, nick = \"aaa\")\n        }\n\n        runTest().toList().run {\n            assertEquals(1, size, toString())\n            get(0).run {\n                assertIs<FriendNickChangedEvent>(this)\n                assertEquals(1230001, friend.id)\n                assertEquals(\"aaa\", from)\n                assertEquals(\"ABC\", to)\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/notice/processors/GroupRetrieveTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.notice.processors\n\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.event.events.BotGroupPermissionChangeEvent\nimport net.mamoe.mirai.event.events.MemberPermissionChangeEvent\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertIs\n\ninternal class GroupRetrieveTest : AbstractNoticeProcessorTest() {\n\n    @Test\n    fun `other member retrieves group from another member when they are in the group`() = runBlockingUnit {\n        suspend fun runTest() = use {\n            net.mamoe.mirai.internal.network.protocol.data.proto.OnlinePushTrans.PbMsgInfo(\n                fromUin = 2230203,\n                toUin = 1230003,\n                msgType = 44,\n                msgSeq = 27,\n                msgUid = 14411,\n                msgTime = 1629,\n                realMsgTime = 164,\n                msgData = \"00 22 07 BB 01 FF 00 12 C4 B1 00 12 C4 B2\".hexToBytes(),\n                svrIp = -9623,\n            )\n        }\n\n        setBot(1230003)\n            .addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230001, permission = MemberPermission.OWNER)\n                addMember(1230002, permission = MemberPermission.MEMBER)\n            }\n\n        runTest().toList().run {\n            assertEquals(2, size, toString())\n            get(0).run {\n                assertIs<MemberPermissionChangeEvent>(this)\n                assertEquals(1230001, member.id)\n                assertEquals(MemberPermission.OWNER, origin)\n                assertEquals(MemberPermission.MEMBER, new)\n                assertEquals(MemberPermission.MEMBER, group.members[1230001]!!.permission)\n            }\n            get(1).run {\n                assertIs<MemberPermissionChangeEvent>(this)\n                assertEquals(1230002, member.id)\n                assertEquals(MemberPermission.MEMBER, origin)\n                assertEquals(MemberPermission.OWNER, new)\n                assertEquals(MemberPermission.OWNER, group.members[1230002]!!.permission)\n            }\n        }\n    }\n\n    @Test\n    fun `other member retrieves group from bot when they are in the group`() = runBlockingUnit {\n        suspend fun runTest() = use {\n            net.mamoe.mirai.internal.network.protocol.data.proto.OnlinePushTrans.PbMsgInfo(\n                fromUin = 2230203,\n                toUin = 1230003,\n                msgType = 44,\n                msgSeq = 459,\n                msgUid = 14411518,\n                msgTime = 1629,\n                realMsgTime = 1629,\n                msgData = \"00 22 07 BB 01 FF 00 12 C4 B3 00 12 C4 B2\".hexToBytes(),\n                svrIp = -164,\n            )\n        }\n\n        setBot(1230003)\n            .addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230001, permission = MemberPermission.MEMBER)\n                addMember(1230002, permission = MemberPermission.MEMBER)\n                botAsMember.permission = MemberPermission.OWNER\n            }\n\n        runTest().toList().run {\n            assertEquals(2, size, toString())\n            get(0).run {\n                assertIs<BotGroupPermissionChangeEvent>(this)\n                assertEquals(MemberPermission.OWNER, origin)\n                assertEquals(MemberPermission.MEMBER, new)\n                assertEquals(MemberPermission.MEMBER, group.botPermission)\n            }\n            get(1).run {\n                assertIs<MemberPermissionChangeEvent>(this)\n                assertEquals(1230002, member.id)\n                assertEquals(MemberPermission.MEMBER, origin)\n                assertEquals(MemberPermission.OWNER, new)\n                assertEquals(MemberPermission.OWNER, group.members[1230002]!!.permission)\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/notice/processors/GroupTransferTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.notice.processors\n\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.event.events.BotGroupPermissionChangeEvent\nimport net.mamoe.mirai.event.events.MemberPermissionChangeEvent\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertIs\n\n\ninternal class GroupTransferTest : AbstractNoticeProcessorTest() {\n\n    @Test\n    fun `owner transfers group to other member`() = runBlockingUnit {\n        suspend fun runTest() = use {\n            net.mamoe.mirai.internal.network.protocol.data.proto.OnlinePushTrans.PbMsgInfo(\n                fromUin = 2230203,\n                toUin = 1230003,\n                msgType = 44,\n                msgSeq = 439,\n                msgUid = 14411520,\n                msgTime = 162974,\n                realMsgTime = 163874,\n                msgData = \"00 22 07 BB 01 FF 00 12 C4 B2 00 12 C4 B1\".hexToBytes(),\n                svrIp = 194,\n            )\n        }\n\n        val group = setBot(1230003)\n            .addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230001, permission = MemberPermission.MEMBER)\n                addMember(1230002, permission = MemberPermission.OWNER)\n            }\n\n        runTest().toList().run {\n            assertEquals(2, size)\n            get(0).run {\n                assertIs<MemberPermissionChangeEvent>(this)\n                assertEquals(1230002, member.id)\n                assertEquals(MemberPermission.OWNER, origin)\n                assertEquals(MemberPermission.MEMBER, new)\n                assertEquals(MemberPermission.MEMBER, group.members[1230002]!!.permission)\n            }\n            get(1).run {\n                assertIs<MemberPermissionChangeEvent>(this)\n                assertEquals(1230001, member.id)\n                assertEquals(MemberPermission.MEMBER, origin)\n                assertEquals(MemberPermission.OWNER, new)\n                assertEquals(MemberPermission.OWNER, group.members[1230001]!!.permission)\n            }\n        }\n    }\n\n    @Test\n    fun `owner transfers group to bot`() = runBlockingUnit {\n        suspend fun runTest() = use {\n            net.mamoe.mirai.internal.network.protocol.data.proto.OnlinePushTrans.PbMsgInfo(\n                fromUin = 2230203,\n                toUin = 1230003,\n                msgType = 44,\n                msgSeq = 291,\n                msgUid = 144115188,\n                msgTime = 16298,\n                realMsgTime = 16298,\n                msgData = \"00 22 07 BB 01 FF 00 12 C4 B2 00 12 C4 B3\".hexToBytes(),\n                svrIp = -14676,\n            )\n        }\n\n        setBot(1230003)\n            .addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230001, permission = MemberPermission.MEMBER)\n                addMember(1230002, permission = MemberPermission.OWNER)\n            }\n\n        runTest().toList().run {\n            assertEquals(2, size)\n            get(0).run {\n                assertIs<MemberPermissionChangeEvent>(this)\n                assertEquals(1230002, member.id)\n                assertEquals(MemberPermission.OWNER, origin)\n                assertEquals(MemberPermission.MEMBER, new)\n                assertEquals(MemberPermission.MEMBER, group.members[1230002]!!.permission)\n            }\n            get(1).run {\n                assertIs<BotGroupPermissionChangeEvent>(this)\n                assertEquals(MemberPermission.MEMBER, origin)\n                assertEquals(MemberPermission.OWNER, new)\n                assertEquals(MemberPermission.OWNER, group.botPermission)\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/notice/processors/MemberAdminChangeTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.notice.processors\n\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.event.events.BotGroupPermissionChangeEvent\nimport net.mamoe.mirai.event.events.MemberPermissionChangeEvent\nimport net.mamoe.mirai.internal.network.protocol.data.proto.OnlinePushTrans\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertIs\n\n\n/**\n * Set/cancel admin permission for bot/member\n */\ninternal class MemberAdminChangeTest : AbstractNoticeProcessorTest() {\n\n    @Test\n    fun `bot member to admin`() = runBlockingUnit {\n        suspend fun runTest() = use {\n            OnlinePushTrans.PbMsgInfo(\n                fromUin = 2230203,\n                toUin = 1230003,\n                msgType = 44,\n                msgSeq = 4827,\n                msgUid = 144,\n                msgTime = 162,\n                realMsgTime = 1629,\n                msgData = \"00 22 07 BB 01 01 00 12 C4 B3 01\".hexToBytes(),\n                svrIp = 12165,\n            )\n        }\n\n        // bot was MEMBER\n\n        val group = setBot(1230003)\n            .addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230001, permission = MemberPermission.MEMBER)\n                addMember(1230002, permission = MemberPermission.OWNER)\n            }\n\n        runTest().run {\n            assertEquals(1, size)\n            val event = single()\n            assertIs<BotGroupPermissionChangeEvent>(event)\n            assertEquals(MemberPermission.MEMBER, event.origin)\n            assertEquals(MemberPermission.ADMINISTRATOR, event.new)\n            assertEquals(MemberPermission.ADMINISTRATOR, group.botPermission)\n        }\n\n\n        // bot was ADMINISTRATOR\n\n        setBot(1230003)\n            .addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230001, permission = MemberPermission.MEMBER)\n                addMember(1230002, permission = MemberPermission.OWNER)\n                botAsMember.permission = MemberPermission.ADMINISTRATOR\n            }\n\n        runTest().run {\n            assertEquals(0, size)\n        }\n    }\n\n    @Test\n    fun `bot admin to member`() = runBlockingUnit {\n        suspend fun runTest() = use {\n            net.mamoe.mirai.internal.network.protocol.data.proto.OnlinePushTrans.PbMsgInfo(\n                fromUin = 2230203,\n                toUin = 1230003,\n                msgType = 44,\n                msgSeq = 483,\n                msgUid = 14411512,\n                msgTime = 1629863,\n                realMsgTime = 1623063,\n                msgData = \"00 22 07 BB 01 00 00 12 C4 B3 00\".hexToBytes(),\n                svrIp = 2039273,\n            )\n        }\n\n        val group = setBot(1230003)\n            .addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230001, permission = MemberPermission.MEMBER)\n                addMember(1230002, permission = MemberPermission.OWNER)\n                botAsMember.permission = MemberPermission.ADMINISTRATOR\n            }\n\n        runTest().run {\n            assertEquals(1, size)\n            val event = single()\n            assertIs<BotGroupPermissionChangeEvent>(event)\n            assertEquals(MemberPermission.ADMINISTRATOR, event.origin)\n            assertEquals(MemberPermission.MEMBER, event.new)\n            assertEquals(MemberPermission.MEMBER, group.botPermission)\n        }\n\n\n        setBot(1230003)\n            .addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230001, permission = MemberPermission.MEMBER)\n                addMember(1230002, permission = MemberPermission.OWNER)\n                botAsMember.permission = MemberPermission.MEMBER // already member\n            }\n\n        runTest().run {\n            assertEquals(0, size)\n        }\n    }\n\n    @Test\n    fun `member member to admin`() = runBlockingUnit {\n        suspend fun runTest() = use {\n            net.mamoe.mirai.internal.network.protocol.data.proto.OnlinePushTrans.PbMsgInfo(\n                fromUin = 2230203,\n                toUin = 1230003,\n                msgType = 44,\n                msgSeq = 5639,\n                msgUid = 1441812,\n                msgTime = 1623204,\n                realMsgTime = 1623204,\n                msgData = \"00 22 07 BB 01 01 00 12 C4 B1 01\".hexToBytes(),\n                svrIp = -20900855,\n            )\n        }\n\n        // member was MEMBER\n\n        val group = setBot(1230003)\n            .addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230001, permission = MemberPermission.MEMBER)\n                addMember(1230002, permission = MemberPermission.OWNER)\n            }\n\n\n        runTest().run {\n            assertEquals(1, size)\n            val event = single()\n            assertIs<MemberPermissionChangeEvent>(event)\n            assertEquals(1230001, event.member.id)\n            assertEquals(MemberPermission.MEMBER, event.origin)\n            assertEquals(MemberPermission.ADMINISTRATOR, event.new)\n            assertEquals(MemberPermission.ADMINISTRATOR, group.members[1230001]!!.permission)\n        }\n\n\n        // member was already ADMINISTRATOR\n\n        setBot(1230003)\n            .addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230001, permission = MemberPermission.ADMINISTRATOR)\n                addMember(1230002, permission = MemberPermission.OWNER)\n            }\n\n        runTest().run {\n            assertEquals(0, size)\n        }\n    }\n\n    @Test\n    fun `member admin to member`() = runBlockingUnit {\n        suspend fun runTest() = use {\n            net.mamoe.mirai.internal.network.protocol.data.proto.OnlinePushTrans.PbMsgInfo(\n                fromUin = 2230203,\n                toUin = 1230003,\n                msgType = 44,\n                msgSeq = 745,\n                msgUid = 144115576812,\n                msgTime = 162250,\n                realMsgTime = 16290,\n                msgData = \"00 22 07 BB 01 00 00 12 C4 B1 00\".hexToBytes(),\n                svrIp = 277969,\n            )\n        }\n\n        val group = setBot(1230003)\n            .addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230001, permission = MemberPermission.MEMBER)\n                    .permission = MemberPermission.ADMINISTRATOR\n                addMember(1230002, permission = MemberPermission.OWNER)\n            }\n\n        runTest().run {\n            assertEquals(1, size)\n            val event = single()\n            assertIs<MemberPermissionChangeEvent>(event)\n            assertEquals(1230001, event.member.id)\n            assertEquals(MemberPermission.ADMINISTRATOR, event.origin)\n            assertEquals(MemberPermission.MEMBER, event.new)\n            assertEquals(MemberPermission.MEMBER, group.members[1230001]!!.permission)\n        }\n\n\n        setBot(1230003)\n            .addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230001, permission = MemberPermission.MEMBER)\n                    .permission = MemberPermission.MEMBER // already member\n                addMember(1230002, permission = MemberPermission.OWNER)\n            }\n\n        runTest().run {\n            assertEquals(0, size)\n        }\n    }\n\n\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/notice/processors/MemberJoinTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.notice.processors\n\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.event.events.MemberJoinEvent\nimport net.mamoe.mirai.event.events.MemberJoinRequestEvent\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport kotlin.test.*\n\ninternal class MemberJoinTest : AbstractNoticeProcessorTest() {\n\n    @Test\n    fun `member actively request join`() = runBlockingUnit {\n        suspend fun runTest() = use {\n            Structmsg.StructMsg(\n                version = 1,\n                msgType = 2,\n                msgSeq = 16300,\n                msgTime = 1630,\n                reqUin = 1230001,\n                msg = Structmsg.SystemMsg(\n                    subType = 1,\n                    msgTitle = \"加群申请\",\n                    msgDescribe = \"申请加入 %group_name%\",\n                    msgAdditional = \"verification message\",\n                    srcId = 1,\n                    subSrcId = 5,\n                    actions = mutableListOf(\n                        Structmsg.SystemMsgAction(\n                            name = \"拒绝\",\n                            result = \"已拒绝\",\n                            actionInfo = Structmsg.SystemMsgActionInfo(\n                                type = 12,\n                                groupCode = 2230203,\n                            ),\n                            detailName = \"拒绝\",\n                        ), Structmsg.SystemMsgAction(\n                            name = \"同意\",\n                            result = \"已同意\",\n                            actionInfo = Structmsg.SystemMsgActionInfo(\n                                type = 11,\n                                groupCode = 2230203,\n                            ),\n                            detailName = \"同意\",\n                        ), Structmsg.SystemMsgAction(\n                            name = \"忽略\",\n                            result = \"已忽略\",\n                            actionInfo = Structmsg.SystemMsgActionInfo(\n                                type = 14,\n                                groupCode = 2230203,\n                            ),\n                            detailName = \"忽略\",\n                        )\n                    ),\n                    groupCode = 2230203,\n                    groupMsgType = 1,\n                    groupInfo = Structmsg.GroupInfo(\n                        appPrivilegeFlag = 67698880,\n                    ),\n                    groupFlagext3 = 128,\n                    reqUinFaceid = 7425,\n                    reqUinNick = \"user1\",\n                    groupName = \"testtest\",\n                    groupExtFlag = 1075905600,\n                    actionUinQqNick = \"user1\",\n                    reqUinGender = 1,\n                    reqUinAge = 19,\n                ),\n            )\n        }\n\n        setBot(1230003)\n            .addGroup(2230203, 1230002, name = \"testtest\", botPermission = MemberPermission.ADMINISTRATOR).apply {\n                addMember(1230002, \"user2\", MemberPermission.OWNER)\n            }\n\n        runTest().run {\n            assertEquals(1, size)\n            val event = single()\n            assertIs<MemberJoinRequestEvent>(event)\n            assertEquals(1230001, event.fromId)\n            assertEquals(2230203, event.groupId)\n            assertEquals(\"verification message\", event.message)\n            assertEquals(\"testtest\", event.groupName)\n        }\n    }\n\n    @Test\n    fun `member request accepted by other admin`() = runBlockingUnit {\n        suspend fun runTest() = use {\n            net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.Msg(\n                msgHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.MsgHead(\n                    fromUin = 2230203,\n                    toUin = 1230003,\n                    msgType = 33,\n                    msgSeq = 45,\n                    msgTime = 16,\n                    msgUid = 1441,\n                    authUin = 1230001,\n                    authNick = \"user1\",\n                    extGroupKeyInfo = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.ExtGroupKeyInfo(\n                        curMaxSeq = 1628,\n                        curTime = 1630,\n                    ),\n                    authSex = 2,\n                ),\n                contentHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.ContentHead(\n                ),\n                msgBody = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MsgBody(\n                    richText = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.RichText(\n                    ),\n                    msgContent = \"00 22 07 BB 01 00 12 C4 B1 02 00 12 C4 B3 06 B9 DC C0 ED D4 B1 00 30 44 38 32 41 43 32 46 33 30 36 46 44 34 35 30 30 36 38 32 46 36 41 38 32 30 31 38 34 41 42 30 43 43 30 32 43 41 33 33 37 41 31 30 38 43 32 36 36\".hexToBytes(),\n                ),\n            )\n\n        }\n\n        val group = setBot(1230003)\n            .addGroup(2230203, 1230002, name = \"testtest\", botPermission = MemberPermission.ADMINISTRATOR).apply {\n                addMember(1230002, \"user2\", MemberPermission.OWNER)\n            }\n\n        assertNull(group.members[1230001])\n\n        runTest().run {\n            assertEquals(1, size)\n            val event = single()\n            assertIs<MemberJoinEvent.Active>(event)\n            assertEquals(2230203, event.groupId)\n            assertEquals(1230001, event.member.id)\n            assertNotNull(group.members[1230001])\n        }\n    }\n\n    @Test\n    fun `member request accepted by bot as admin`() = runBlockingUnit {\n        suspend fun runTest() = use {\n            net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.Msg(\n                msgHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.MsgHead(\n                    fromUin = 2230203,\n                    toUin = 1230002,\n                    msgType = 33,\n                    msgSeq = 45576,\n                    msgTime = 1640123193,\n                    msgUid = 144115188080508961,\n                    authUin = 1230003,\n                    authNick = \"user3\",\n                    extGroupKeyInfo = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.ExtGroupKeyInfo(\n                        curMaxSeq = 1773,\n                        curTime = 1640123193,\n                    ),\n                ),\n                msgBody = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MsgBody(\n                    msgContent = \"00 22 07 BB 01 00 12 C4 B3 82 00 12 C4 B2 06 B9 DC C0 ED D4 B1 00 30 30 38 38 32 32 30 42 30 31 35 42 34 42 42 30 32 44 43 38 30 41 38 37 45 45 45 46 38 42 41 37 45 31 43 32 44 37 32 30 43 37 32 41 34 42 31 39 32\".hexToBytes(),\n                ),\n            )\n        }\n\n        val group = setBot(1230002)\n            .addGroup(2230203, 1230001, name = \"testtest\", botPermission = MemberPermission.ADMINISTRATOR).apply {\n                addMember(1230001, \"user2\", MemberPermission.OWNER)\n                addMember(1230002, \"bot\", MemberPermission.ADMINISTRATOR)\n            }\n\n        assertNull(group.members[1230003])\n\n        runTest().run {\n            assertEquals(1, size)\n            val event = single()\n            assertIs<MemberJoinEvent.Active>(event)\n            assertEquals(2230203, event.groupId)\n            assertEquals(1230003, event.member.id)\n            assertNotNull(group.members[1230003])\n        }\n    }\n\n    @Test\n    fun `member request rejected by other admin`() {\n        // There is no corresponding event\n    }\n\n\n    @Test\n    fun `member joins directly when group allows anyone`() = runBlockingUnit {\n        suspend fun runTest() = use {\n            net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.Msg(\n                msgHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.MsgHead(\n                    fromUin = 2230203,\n                    toUin = 1230003,\n                    msgType = 33,\n                    msgSeq = 45,\n                    msgTime = 16,\n                    msgUid = 1441,\n                    authUin = 1230001,\n                    authNick = \"user1\",\n                    extGroupKeyInfo = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.ExtGroupKeyInfo(\n                        curMaxSeq = 1628,\n                        curTime = 1630,\n                    ),\n                    authSex = 2,\n                ),\n                contentHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.ContentHead(\n                ),\n                msgBody = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MsgBody(\n                    richText = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.RichText(\n                    ),\n                    msgContent = \"00 22 07 BB 01 00 12 C4 B1 02 00 12 C4 B3 06 B9 DC C0 ED D4 B1 00 30 44 38 32 41 43 32 46 33 30 36 46 44 34 35 30 30 36 38 32 46 36 41 38 32 30 31 38 34 41 42 30 43 43 30 32 43 41 33 33 37 41 31 30 38 43 32 36 36\".hexToBytes(),\n                ),\n            )\n\n        }\n\n        val group = setBot(1230003)\n            .addGroup(2230203, 1230002, name = \"testtest\", botPermission = MemberPermission.ADMINISTRATOR).apply {\n                addMember(1230002, \"user2\", MemberPermission.OWNER)\n            }\n\n        assertNull(group.members[1230001])\n\n        runTest().run {\n            assertEquals(1, size)\n            val event = single()\n            assertIs<MemberJoinEvent.Active>(event)\n            assertEquals(2230203, event.groupId)\n            assertEquals(1230001, event.member.id)\n            assertNotNull(group.members[1230001])\n        }\n    }\n\n\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/notice/processors/MemberQuitTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.notice.processors\n\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.event.events.MemberLeaveEvent\nimport net.mamoe.mirai.internal.network.protocol.data.proto.OnlinePushTrans\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertIs\n\ninternal class MemberQuitTest : AbstractNoticeProcessorTest() {\n\n    @Test\n    fun `member active quit`() = runBlockingUnit {\n        suspend fun runTest() = use {\n            OnlinePushTrans.PbMsgInfo(\n                fromUin = 2230203,\n                toUin = 1230003,\n                msgType = 34,\n                msgSeq = 266,\n                msgUid = 1441151,\n                msgTime = 16298,\n                realMsgTime = 1629,\n                msgData = \"00 22 07 BB 01 00 12 C4 B1 02 00 30 39 41 36 36 41 32 31 32 33 35 37 32 43 39 35 38 42 42 36 38 45 32 36 44 34 34 32 38 45 32 32 37 32 36 44 39 44 45 41 31 34 41 44 37 30 31 46 31\".hexToBytes(),\n                svrIp = 618,\n                extGroupKeyInfo = OnlinePushTrans.ExtGroupKeyInfo(\n                    curMaxSeq = 1626,\n                    curTime = 16298,\n                ),\n                generalFlag = 1,\n            )\n        }\n\n        setBot(1230003)\n            .addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230001, \"user1\", MemberPermission.MEMBER)\n                addMember(1230002, \"user2\", MemberPermission.OWNER)\n            }\n\n        runTest().run {\n            assertEquals(1, size)\n            single().run {\n                assertIs<MemberLeaveEvent.Quit>(this)\n                assertEquals(1230001, member.id)\n                assertEquals(null, group.members[1230001])\n            }\n        }\n    }\n\n    @Test\n    fun `member kick`() = runBlockingUnit {\n        suspend fun runTest() = use {\n            net.mamoe.mirai.internal.network.protocol.data.proto.OnlinePushTrans.PbMsgInfo(\n                fromUin = 2230203,\n                toUin = 1230002,\n                msgType = 34,\n                msgSeq = 430,\n                msgUid = 1441,\n                msgTime = 16298,\n                realMsgTime = 1629,\n                msgData = \"00 22 07 BB 01 00 12 C4 B1 03 00 12 C4 B3 06 B4 B4 BD A8 D5 DF 00 30 45 31 39 41 35 43 41 37 34 36 44 37 38 31 36 45 34 46 36 37 41 39 35 36 46 32 34 46 46 38 33 41 32 30 34 44 41 33 38 30 35 41 38 34 39 45 44 32\".hexToBytes(),\n                svrIp = 54562,\n                extGroupKeyInfo = net.mamoe.mirai.internal.network.protocol.data.proto.OnlinePushTrans.ExtGroupKeyInfo(\n                    curMaxSeq = 1627,\n                    curTime = 1629,\n                ),\n                generalFlag = 1,\n            )\n        }\n\n        setBot(1230003)\n            .addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230001, \"user1\", MemberPermission.MEMBER)\n                addMember(1230002, \"user2\", MemberPermission.OWNER)\n            }\n\n        runTest().run {\n            assertEquals(1, size)\n            single().run {\n                assertIs<MemberLeaveEvent.Kick>(this)\n                assertEquals(1230001, member.id)\n                assertEquals(null, group.members[1230001])\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/notice/processors/MessageSyncTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.notice.processors\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.event.events.FriendMessageSyncEvent\nimport net.mamoe.mirai.event.events.GroupMessageSyncEvent\nimport net.mamoe.mirai.internal.network.components.NoticePipelineContext.Companion.KEY_FROM_SYNC\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgOnlinePush\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.message.data.content\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertIs\n\ninternal class MessageSyncTest : AbstractNoticeProcessorTest() {\n\n    @Test\n    fun `can receive group sync from macOS client`() = runBlockingUnit {\n        suspend fun runTest() = use {\n            MsgOnlinePush.PbPushMsg(\n                msg = MsgComm.Msg(\n                    msgHead = MsgComm.MsgHead(\n                        fromUin = 1230002,\n                        toUin = 1230002,\n                        msgType = 82,\n                        msgSeq = 1772,\n                        msgTime = 1640029614,\n                        msgUid = 144115188088832082,\n                        groupInfo = MsgComm.GroupInfo(\n                            groupCode = 2230203,\n                            groupType = 1,\n                            groupInfoSeq = 657,\n                            groupCard = \"user2\",\n                            groupLevel = 1,\n                            groupCardType = 2,\n                            groupName = \"testtest\".toByteArray(), /* 74 65 73 74 74 65 73 74 */\n                        ),\n                        fromAppid = 1001,\n                        fromInstid = 537067835,\n                        userActive = 1,\n                    ),\n                    msgBody = ImMsgBody.MsgBody(\n                        richText = ImMsgBody.RichText(\n                            attr = ImMsgBody.Attr(\n                                codePage = 0,\n                                time = 1640029614,\n                                random = 25984994,\n                                size = 9,\n                                effect = 0,\n                                charSet = 134,\n                                pitchAndFamily = 0,\n                                fontName = \"Helvetica\",\n                            ),\n                            elems = mutableListOf(\n                                ImMsgBody.Elem(\n                                    text = ImMsgBody.Text(\n                                        str = \"s\",\n                                    ),\n                                ),\n                                ImMsgBody.Elem(\n                                    elemFlags2 = ImMsgBody.ElemFlags2(\n                                        msgRptCnt = 1,\n                                    ),\n                                ),\n                                ImMsgBody.Elem(\n                                    generalFlags = ImMsgBody.GeneralFlags(\n                                        pbReserve = \"\".hexToBytes(),\n                                    ),\n                                ),\n                                ImMsgBody.Elem(\n                                    extraInfo = ImMsgBody.ExtraInfo(\n                                        nick = \"user2\",\n                                        level = 1,\n                                        groupMask = 1,\n                                    ),\n                                ),\n                            ),\n                        ),\n                    ),\n                ),\n                svrip = 1579509002,\n                generalFlag = 1,\n            )\n        }\n\n        setBot(1230002).apply {\n            addGroup(2230203L, 1230001).apply {\n                addMember(1230001, permission = MemberPermission.OWNER)\n                addMember(1230002, permission = MemberPermission.MEMBER)\n            }\n            addOtherClient(537067835)\n        }\n\n        runTest().toList().run {\n            assertEquals(1, size, toString())\n            get(0).run {\n                assertIs<GroupMessageSyncEvent>(this)\n                assertEquals(2230203, group.id)\n                assertEquals(1230002, sender.id)\n                assertEquals(\"s\", message.content)\n            }\n        }\n\n    }\n\n\n    @Test\n    fun `can receive friend sync from macOS client`() = runBlockingUnit {\n        suspend fun runTest() = use {\n            attributes[KEY_FROM_SYNC] = true\n\n            net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.Msg(\n                msgHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.MsgHead(\n                    fromUin = 1230002,\n                    toUin = 1230001,\n                    msgType = 166,\n                    c2cCmd = 11,\n                    msgSeq = 13887,\n                    msgTime = 1640030199,\n                    msgUid = 72057594845425959,\n                    fromAppid = 1001,\n                    fromInstid = 537067835,\n                    userActive = 1,\n                ),\n                msgBody = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MsgBody(\n                    richText = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.RichText(\n                        attr = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Attr(\n                            codePage = 0,\n                            time = 1640030199,\n                            random = 807498023,\n                            size = 9,\n                            effect = 0,\n                            charSet = 134,\n                            pitchAndFamily = 0,\n                            fontName = \"Helvetica\",\n                        ),\n                        elems = mutableListOf(\n                            net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                                    str = \"hi\",\n                                ),\n                            ),\n                            net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                            ),\n                            net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                generalFlags = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.GeneralFlags(\n                                    pbReserve = \"78 00 C8 01 00 F0 01 00 F8 01 00 90 02 00 CA 04 00\".hexToBytes(),\n                                ),\n                            ),\n                        ),\n                    ),\n                ),\n            )\n        }\n\n        setBot(1230002).apply {\n            addFriend(1230001)\n            addOtherClient(537067835)\n        }\n\n        runTest().toList().run {\n            assertEquals(1, size, toString())\n            get(0).run {\n                assertIs<FriendMessageSyncEvent>(this)\n                assertEquals(1230001, friend.id)\n                assertEquals(\"hi\", message.content)\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/notice/processors/MessageTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.notice.processors\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.event.events.FriendMessageEvent\nimport net.mamoe.mirai.event.events.GroupMessageEvent\nimport net.mamoe.mirai.event.events.GroupTempMessageEvent\nimport net.mamoe.mirai.internal.network.components.NoticePipelineContext.Companion.KEY_FROM_SYNC\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.message.data.*\nimport kotlin.test.Test\nimport kotlin.test.assertContentEquals\nimport kotlin.test.assertEquals\nimport kotlin.test.assertIs\n\ninternal class MessageTest : AbstractNoticeProcessorTest() {\n\n    @Test\n    fun `group message test`() = runBlockingUnit {\n        suspend fun runTest() = use {\n            net.mamoe.mirai.internal.network.protocol.data.proto.MsgOnlinePush.PbPushMsg(\n                msg = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.Msg(\n                    msgHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.MsgHead(\n                        fromUin = 1230001,\n                        toUin = 1230003,\n                        msgType = 82,\n                        msgSeq = 1629, // id\n                        msgTime = 1630,\n                        msgUid = 14411, // neither id nor internalId\n                        groupInfo = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.GroupInfo(\n                            groupCode = 2230203,\n                            groupType = 1,\n                            groupInfoSeq = 626,\n                            groupCard = \"user1\",\n                            groupLevel = 1,\n                            groupCardType = 2,\n                            groupName = \"testtest\".toByteArray(), /* 74 65 73 74 74 65 73 74 */\n                        ),\n                        fromAppid = 1,\n                        fromInstid = 1,\n                        userActive = 1,\n                    ),\n                    contentHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.ContentHead(\n                        pkgNum = 1,\n                    ),\n                    msgBody = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MsgBody(\n                        richText = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.RichText(\n                            attr = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Attr(\n                                codePage = 0,\n                                time = 1630,\n                                random = -1469, // internal id\n                                size = 12,\n                                effect = 0,\n                                charSet = 134,\n                                pitchAndFamily = 34,\n                                fontName = \"微软雅黑\",\n                            ),\n                            elems = mutableListOf(\n                                net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                    text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                                        str = \"hello\",\n                                    ),\n                                ), net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                    elemFlags2 = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.ElemFlags2(\n                                        msgRptCnt = 1,\n                                    ),\n                                ), net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                    generalFlags = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.GeneralFlags(\n                                        glamourLevel = 3,\n                                        pbReserve = \"08 0A 20 CB 50 80 01 01 C8 01 00 F0 01 00 F8 01 00 90 02 00 98 03 D1 02 A0 03 40 B0 03 00 C0 03 00 D0 03 00 E8 03 00 90 04 80 01 B8 04 02 C0 04 00 CA 04 00 F8 04 00 88 05 00\".hexToBytes(),\n                                    ),\n                                ), net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                    extraInfo = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.ExtraInfo(\n                                        nick = \"user1\",\n                                        level = 1,\n                                        groupMask = 3,\n                                    ),\n                                )\n                            ),\n                        ),\n                    ),\n                ),\n                svrip = 2057,\n                generalFlag = 1,\n            )\n        }\n\n        setBot(1230003)\n            .addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230001, permission = MemberPermission.MEMBER, nick = \"user1\")\n            }\n\n        runTest().run {\n            assertEquals(1, size)\n            val event = single()\n            assertIs<GroupMessageEvent>(event)\n            assertEquals(1630, event.time)\n            assertEquals(1230001, event.sender.id)\n            assertEquals(\"user1\", event.senderName)\n\n            assertEquals(\"hello\", event.message.content)\n\n            event.message.run {\n                assertEquals(2, size)\n                get(0).run {\n                    assertIs<OnlineMessageSource.Incoming.FromGroup>(this)\n                    assertContentEquals(intArrayOf(1629), ids)\n                    assertContentEquals(intArrayOf(-1469), internalIds)\n                    assertEquals(1630, time)\n                    assertEquals(1230001, fromId)\n                    assertEquals(2230203, targetId)\n                    assertEquals(event.message.filterNot { it is MessageSource }.toMessageChain(), originalMessage)\n                }\n                assertIs<PlainText>(get(1))\n                assertEquals(\"hello\", get(1).content)\n            }\n        }\n    }\n\n\n    @Test\n    fun `friend message test`() = runBlockingUnit {\n        suspend fun runTest() = use(KEY_FROM_SYNC to false) {\n            net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.Msg(\n                msgHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.MsgHead(\n                    fromUin = 1230001,\n                    toUin = 1230003,\n                    msgType = 166,\n                    c2cCmd = 11,\n                    msgSeq = 13985,\n                    msgTime = 1630,\n                    msgUid = 72057,\n                    wseqInC2cMsghead = 25159,\n                ),\n                contentHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.ContentHead(\n                    pkgNum = 1,\n                ),\n                msgBody = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MsgBody(\n                    richText = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.RichText(\n                        attr = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Attr(\n                            codePage = 0,\n                            time = 1630,\n                            random = -5872,\n                            size = 12,\n                            effect = 0,\n                            charSet = 134,\n                            pitchAndFamily = 34,\n                            fontName = \"微软雅黑\",\n                        ),\n                        elems = mutableListOf(\n                            net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                                    str = \"123\",\n                                ),\n                            ), net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                elemFlags2 = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.ElemFlags2(\n                                ),\n                            ), net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                generalFlags = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.GeneralFlags(\n                                    pbReserve = \"80 01 01 C8 01 00 F0 01 00 F8 01 00 90 02 00 CA 04 00\".hexToBytes(),\n                                ),\n                            )\n                        ),\n                    ),\n                ),\n            )\n        }\n\n        setBot(1230003)\n            .addFriend(1230001, \"user1\")\n\n\n\n        runTest().run {\n            assertEquals(1, size)\n            val event = single()\n            assertIs<FriendMessageEvent>(event)\n            assertEquals(1630, event.time)\n            assertEquals(1230001, event.sender.id)\n            assertEquals(\"user1\", event.senderName)\n\n            assertEquals(\"123\", event.message.content)\n\n            event.message.run {\n                assertEquals(2, size)\n                get(0).run {\n                    assertIs<OnlineMessageSource.Incoming.FromFriend>(this)\n                    assertContentEquals(intArrayOf(13985), ids)\n                    assertContentEquals(intArrayOf(-5872), internalIds)\n                    assertEquals(1630, time)\n                    assertEquals(1230001, fromId)\n                    assertEquals(1230003, targetId)\n                    assertEquals(event.message.filterNot { it is MessageSource }.toMessageChain(), originalMessage)\n                }\n                assertIs<PlainText>(get(1))\n                assertEquals(\"123\", get(1).content)\n            }\n        }\n    }\n\n    @Test\n    fun `group temp message test`() = runBlockingUnit {\n        suspend fun runTest() = use(KEY_FROM_SYNC to false) {\n            net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.Msg(\n                msgHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.MsgHead(\n                    fromUin = 1230001,\n                    toUin = 1230003,\n                    msgType = 141,\n                    c2cCmd = 11,\n                    msgSeq = 11080,\n                    msgTime = 1630,\n                    msgUid = 720,\n                    c2cTmpMsgHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.C2CTmpMsgHead(\n                        c2cType = 2,\n                        groupUin = 2230203,\n                        groupCode = 2230203,\n                        sig = \"38 59 CD 1E 22 9A 0A BA 28 59 46 BE FA 51 36 D0 F1 7A 5D 54 F5 04 05 7E 66 C7 36 4F 73 BF 45 96 00 39 7C 8F F5 43 57 74 B0 EB D9 5E 0F 1F 9B CF\".hexToBytes(),\n                    ),\n                    wseqInC2cMsghead = 25160,\n                ),\n                contentHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.ContentHead(\n                    pkgNum = 1,\n                ),\n                msgBody = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MsgBody(\n                    richText = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.RichText(\n                        attr = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Attr(\n                            codePage = 0,\n                            time = 1630,\n                            random = 1854,\n                            size = 12,\n                            effect = 0,\n                            charSet = 134,\n                            pitchAndFamily = 34,\n                            fontName = \"微软雅黑\",\n                        ),\n                        elems = mutableListOf(\n                            net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                                    str = \"hello\",\n                                ),\n                            ), net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                extraInfo = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.ExtraInfo(\n                                    nick = \"user1\",\n                                ),\n                            ), net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                elemFlags2 = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.ElemFlags2(\n                                ),\n                            ), net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                generalFlags = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.GeneralFlags(\n                                    pbReserve = \"80 01 01 C8 01 00 F0 01 00 F8 01 00 90 02 00 CA 04 00\".hexToBytes(),\n                                ),\n                            )\n                        ),\n                    ),\n                ),\n            )\n        }\n\n        setBot(1230003).apply {\n            addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230001, permission = MemberPermission.MEMBER, nick = \"user1\")\n            }\n            addStranger(1230001, \"user1\", fromGroupId = 2230203)\n        }\n\n\n        runTest().run {\n            assertEquals(1, size)\n            val event = single()\n            assertIs<GroupTempMessageEvent>(event)\n            assertEquals(1630, event.time)\n            assertEquals(1230001, event.sender.id)\n            assertEquals(\"user1\", event.senderName)\n\n            assertEquals(\"hello\", event.message.content)\n\n            event.message.run {\n                assertEquals(2, size)\n                get(0).run {\n                    assertIs<OnlineMessageSource.Incoming.FromTemp>(this)\n                    assertContentEquals(intArrayOf(11080), ids)\n                    assertContentEquals(intArrayOf(1854), internalIds)\n                    assertEquals(1630, time)\n                    assertEquals(1230001, fromId)\n                    assertEquals(1230003, targetId)\n                    assertEquals(event.message.filterNot { it is MessageSource }.toMessageChain(), originalMessage)\n                }\n                assertIs<PlainText>(get(1))\n                assertEquals(\"hello\", get(1).content)\n            }\n        }\n    }\n\n    // for #1410\n    @Test\n    fun `group temp message test for issue 1410`() = runBlockingUnit {\n        suspend fun runTest() = use(KEY_FROM_SYNC to false) {\n            net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.Msg(\n                msgHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.MsgHead(\n                    fromUin = 1230001,\n                    toUin = 1230003,\n                    msgType = 141,\n                    c2cCmd = 11,\n                    msgSeq = 11080,\n                    msgTime = 1630,\n                    msgUid = 720,\n                    c2cTmpMsgHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.C2CTmpMsgHead(\n                        c2cType = 2,\n                        groupUin = 2055561833,\n                        groupCode = 112561833,\n                        sig = \"38 59 CD 1E 22 9A 0A BA 28 59 46 BE FA 51 36 D0 F1 7A 5D 54 F5 04 05 7E 66 C7 36 4F 73 BF 45 96 00 39 7C 8F F5 43 57 74 B0 EB D9 5E 0F 1F 9B CF\".hexToBytes(),\n                    ),\n                    wseqInC2cMsghead = 25160,\n                ),\n                contentHead = net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm.ContentHead(\n                    pkgNum = 1,\n                ),\n                msgBody = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.MsgBody(\n                    richText = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.RichText(\n                        attr = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Attr(\n                            codePage = 0,\n                            time = 1630,\n                            random = 1854,\n                            size = 12,\n                            effect = 0,\n                            charSet = 134,\n                            pitchAndFamily = 34,\n                            fontName = \"微软雅黑\",\n                        ),\n                        elems = mutableListOf(\n                            net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                text = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Text(\n                                    str = \"hello\",\n                                ),\n                            ), net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                extraInfo = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.ExtraInfo(\n                                    nick = \"user1\",\n                                ),\n                            ), net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                elemFlags2 = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.ElemFlags2(\n                                ),\n                            ), net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.Elem(\n                                generalFlags = net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody.GeneralFlags(\n                                    pbReserve = \"80 01 01 C8 01 00 F0 01 00 F8 01 00 90 02 00 CA 04 00\".hexToBytes(),\n                                ),\n                            )\n                        ),\n                    ),\n                ),\n            )\n        }\n\n        setBot(1230003).apply {\n            addGroup(112561833, 1230002, name = \"testtest\").apply {\n                addMember(1230001, permission = MemberPermission.MEMBER, nick = \"user1\")\n            }\n            addStranger(1230001, \"user1\", fromGroupId = 2230203)\n        }\n\n\n        runTest().run {\n            assertEquals(1, size)\n            val event = single()\n            assertIs<GroupTempMessageEvent>(event)\n            assertEquals(1630, event.time)\n            assertEquals(1230001, event.sender.id)\n            assertEquals(\"user1\", event.senderName)\n\n            assertEquals(\"hello\", event.message.content)\n\n            event.message.run {\n                assertEquals(2, size)\n                get(0).run {\n                    assertIs<OnlineMessageSource.Incoming.FromTemp>(this)\n                    assertContentEquals(intArrayOf(11080), ids)\n                    assertContentEquals(intArrayOf(1854), internalIds)\n                    assertEquals(1630, time)\n                    assertEquals(1230001, fromId)\n                    assertEquals(1230003, targetId)\n                    assertEquals(event.message.filterNot { it is MessageSource }.toMessageChain(), originalMessage)\n                }\n                assertIs<PlainText>(get(1))\n                assertEquals(\"hello\", get(1).content)\n            }\n        }\n    }\n\n    @Test\n    fun `stranger message test`() { // TODO: 2021/8/27 cannot start a such conversation\n\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/notice/processors/MuteTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.notice.processors\n\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.event.events.BotMuteEvent\nimport net.mamoe.mirai.event.events.BotUnmuteEvent\nimport net.mamoe.mirai.event.events.MemberMuteEvent\nimport net.mamoe.mirai.event.events.MemberUnmuteEvent\nimport net.mamoe.mirai.internal.network.protocol.data.jce.MsgInfo\nimport net.mamoe.mirai.internal.network.protocol.data.jce.OnlinePushPack\nimport net.mamoe.mirai.internal.network.protocol.data.jce.ShareData\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.utils.currentTimeSeconds\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertIs\n\n\ninternal class MuteTest : AbstractNoticeProcessorTest() {\n    @Test\n    fun `bot mute`() = runBlockingUnit {\n        suspend fun MuteTest.runTest() = use {\n            OnlinePushPack.SvcReqPushMsg(\n                uin = 1230001,\n                uMsgTime = 1629868940,\n                vMsgInfos = mutableListOf(\n                    MsgInfo(\n                        lFromUin = 2230203,\n                        shMsgType = 732,\n                        shMsgSeq = 8352,\n                        strMsg = \"\",\n                        uRealMsgTime = 16298,\n                        vMsg = \"00 22 07 BB 0C 01 00 12 C4 B2 61 25 D3 8D 00 01 00 12 C4 B1 00 00 02 58\".hexToBytes(),\n                        uAppShareID = 0,\n                        vMsgCookies = \"08 DC 05 10 DC 85 E0 80 80 80 80 80 02 18 03 20 DE 86 03\".hexToBytes(),\n                        lMsgUid = 1441151,\n                        lLastChangeTime = 1,\n                        vCPicInfo = mutableListOf(),\n                        stShareData = ShareData(\n                        ),\n                        lFromInstId = 0,\n                        vRemarkOfSender = net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY,\n                        strFromMobile = \"\",\n                        strFromName = \"\",\n                        vNickName = mutableListOf(),\n                    )\n                ),\n                svrip = -1467,\n                vSyncCookie = net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY,\n                vUinPairMsg = mutableListOf(),\n                mPreviews = mutableMapOf(\n                ),\n            )\n\n\n        }\n        setBot(1230001)\n            .addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230002, \"user2\", MemberPermission.OWNER)\n            }\n\n        runTest().run {\n            assertEquals(1, size)\n            val event = single()\n            assertIs<BotMuteEvent>(event)\n            assertEquals(600, event.durationSeconds)\n            assertEquals(1230002, event.operator.id)\n        }\n    }\n\n    @Test\n    fun `bot unmute`() = runBlockingUnit {\n        suspend fun MuteTest.runTest() = use {\n            OnlinePushPack.SvcReqPushMsg(\n                uin = 1230001,\n                uMsgTime = 1629869459,\n                vMsgInfos = mutableListOf(\n                    MsgInfo(\n                        lFromUin = 2230203,\n                        shMsgType = 732,\n                        shMsgSeq = -26716,\n                        strMsg = \"\",\n                        uRealMsgTime = 1629,\n                        vMsg = \"00 22 07 BB 0C 01 00 12 C4 B2 61 25 D5 93 00 01 00 12 C4 B1 00 00 00 00\".hexToBytes(),\n                        uAppShareID = 0,\n                        vMsgCookies = \"08 DC 05 10 DC 85 E0 80 80 80 80 80 02 18 03 20 DE 86 03\".hexToBytes(),\n                        lMsgUid = 1441151,\n                        lLastChangeTime = 1,\n                        vCPicInfo = mutableListOf(),\n                        stShareData = ShareData(\n                        ),\n                        lFromInstId = 0,\n                        vRemarkOfSender = net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY,\n                        strFromMobile = \"\",\n                        strFromName = \"\",\n                        vNickName = mutableListOf(),\n                    )\n                ),\n                svrip = 1554,\n                vSyncCookie = net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY,\n                vUinPairMsg = mutableListOf(),\n                mPreviews = mutableMapOf(\n                ),\n            )\n        }\n\n        setBot(1230001)\n            .addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230002, \"user2\", MemberPermission.OWNER)\n                addMember(1230003, \"user3\", MemberPermission.MEMBER)\n                botAsMember.apply {\n                    _muteTimestamp = currentTimeSeconds().toInt() + 600\n                }\n            }\n\n        runTest().run {\n            assertEquals(1, size)\n            val event = single()\n            assertIs<BotUnmuteEvent>(event)\n            assertEquals(1230002, event.operator.id)\n        }\n\n\n        setBot(1230001)\n            .addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230002, \"user2\", MemberPermission.OWNER)\n                addMember(1230003, \"user3\", MemberPermission.MEMBER)\n                botAsMember.apply {\n                    _muteTimestamp = 0\n                }\n            }\n\n        runTest().run {\n            assertEquals(0, size)\n        }\n    }\n\n    @Test\n    fun `member mute`() = runBlockingUnit {\n        suspend fun MuteTest.runTest() = use {\n            OnlinePushPack.SvcReqPushMsg(\n                uin = 1230001,\n                uMsgTime = 1629870209,\n                vMsgInfos = mutableListOf(\n                    MsgInfo(\n                        lFromUin = 2230203,\n                        shMsgType = 732,\n                        shMsgSeq = 8159,\n                        strMsg = \"\",\n                        uRealMsgTime = 16298,\n                        vMsg = \"00 22 07 BB 0C 01 00 12 C4 B2 61 25 D8 81 00 01 00 12 C4 B3 00 00 02 58\".hexToBytes(),\n                        uAppShareID = 0,\n                        vMsgCookies = \"08 DC 05 10 DC 85 E0 80 80 80 80 80 02 18 03 20 DE 86 03\".hexToBytes(),\n                        lMsgUid = 1441151,\n                        lLastChangeTime = 1,\n                        vCPicInfo = mutableListOf(),\n                        stShareData = ShareData(\n                        ),\n                        lFromInstId = 0,\n                        vRemarkOfSender = net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY,\n                        strFromMobile = \"\",\n                        strFromName = \"\",\n                        vNickName = mutableListOf(),\n                    )\n                ),\n                svrip = -176,\n                vSyncCookie = net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY,\n                vUinPairMsg = mutableListOf(),\n                mPreviews = mutableMapOf(\n                ),\n            )\n        }\n\n        setBot(1230001)\n            .addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230002, \"user2\", MemberPermission.OWNER)\n                addMember(1230003, \"user3\", MemberPermission.MEMBER)\n            }\n\n        runTest().run {\n            assertEquals(1, size)\n            val event = single()\n            assertIs<MemberMuteEvent>(event)\n            assertEquals(600, event.durationSeconds)\n            assertEquals(1230002, event.operator?.id)\n        }\n    }\n\n\n    @Test\n    fun `member unmute`() = runBlockingUnit {\n        suspend fun MuteTest.runTest() = use {\n            OnlinePushPack.SvcReqPushMsg(\n                uin = 1230001,\n                uMsgTime = 16298,\n                vMsgInfos = mutableListOf(\n                    MsgInfo(\n                        lFromUin = 2230203,\n                        shMsgType = 732,\n                        shMsgSeq = 16929,\n                        strMsg = \"\",\n                        uRealMsgTime = 16298,\n                        vMsg = \"00 22 07 BB 0C 01 00 12 C4 B2 61 25 D7 02 00 01 00 12 C4 B3 00 00 00 00\".hexToBytes(),\n                        uAppShareID = 0,\n                        vMsgCookies = \"08 DC 05 10 DC 85 E0 80 80 80 80 80 02 18 03 20 DE 86 03\".hexToBytes(),\n                        lMsgUid = 1441151,\n                        lLastChangeTime = 1,\n                        vCPicInfo = mutableListOf(),\n                        stShareData = ShareData(\n                        ),\n                        lFromInstId = 0,\n                        vRemarkOfSender = net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY,\n                        strFromMobile = \"\",\n                        strFromName = \"\",\n                        vNickName = mutableListOf(),\n                    )\n                ),\n                svrip = 20406,\n                vSyncCookie = net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY,\n                vUinPairMsg = mutableListOf(),\n                mPreviews = mutableMapOf(\n                ),\n            )\n        }\n\n        setBot(1230001)\n            .addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230002, \"user2\", MemberPermission.OWNER)\n                addMember(1230003, \"user3\", MemberPermission.MEMBER).apply {\n                    _muteTimestamp = currentTimeSeconds().toInt() + 600\n                }\n            }\n\n        runTest().run {\n            assertEquals(1, size)\n            val event = single()\n            assertIs<MemberUnmuteEvent>(event)\n            assertEquals(1230002, event.operator?.id)\n        }\n\n\n        setBot(1230001)\n            .addGroup(2230203, 1230002, name = \"testtest\").apply {\n                addMember(1230002, \"user2\", MemberPermission.OWNER)\n                addMember(1230003, \"user3\", MemberPermission.MEMBER).apply {\n                    _muteTimestamp = 0\n                }\n            }\n\n        runTest().run {\n            assertEquals(0, size)\n        }\n    }\n\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/notice/processors/RecallTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.notice.processors\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.contact.PermissionDeniedException\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.message.source.OnlineMessageSourceFromGroupImpl\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.network.protocol.data.proto.MsgComm\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.PbMessageSvc\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport net.mamoe.mirai.message.data.OnlineMessageSource\nimport net.mamoe.mirai.utils.hexToBytes\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFailsWith\n\ninternal class RecallTest : AbstractNoticeProcessorTest() {\n\n    fun source(b: Bot, senderid: Long, groupid: Long, permision: MemberPermission): OnlineMessageSource =\n        OnlineMessageSourceFromGroupImpl(\n            b,\n            listOf(\n                MsgComm.Msg(\n                    msgHead = MsgComm.MsgHead(\n                        fromUin = senderid,\n                        toUin = b.id,\n                        msgType = 82,\n                        msgSeq = 1628,\n                        msgTime = 1629,\n                        msgUid = 1441,\n                        groupInfo = MsgComm.GroupInfo(\n                            groupCode = groupid,\n                            groupType = 1,\n                            groupInfoSeq = 624,\n                            groupCard = \"user3\",\n                            groupLevel = 1,\n                            groupCardType = 2,\n                            groupName = \"testtest\".toByteArray(), /* 74 65 73 74 74 65 73 74 */\n                        ),\n                        fromAppid = 1,\n                        fromInstid = 1,\n                        userActive = 1,\n                    ),\n                    contentHead = MsgComm.ContentHead(\n                        pkgNum = 1,\n                    ),\n                    msgBody = ImMsgBody.MsgBody(\n                        richText = ImMsgBody.RichText(\n                            attr = ImMsgBody.Attr(\n                                codePage = 0,\n                                time = 162,\n                                random = -313,\n                                size = 9,\n                                effect = 0,\n                                charSet = 134,\n                                pitchAndFamily = 0,\n                                fontName = \"微软雅黑\",\n                            ),\n                            elems = mutableListOf(\n                                ImMsgBody.Elem(\n                                    text = ImMsgBody.Text(\n                                        str = \"123123123\",\n                                    ),\n                                ), ImMsgBody.Elem(\n                                    elemFlags2 = ImMsgBody.ElemFlags2(\n                                        msgRptCnt = 1,\n                                    ),\n                                ), ImMsgBody.Elem(\n                                    generalFlags = ImMsgBody.GeneralFlags(\n                                        pbReserve = \"08 01 20 CB 50 80 01 01 C8 01 00 F0 01 00 F8 01 00 90 02 00 98 03 00 A0 03 00 B0 03 00 C0 03 00 D0 03 00 E8 03 00 8A 04 02 10 02 90 04 80 01 B8 04 00 C0 04 00 CA 04 00 F8 04 00 88 05 00\".hexToBytes(),\n                                    ),\n                                ), ImMsgBody.Elem(\n                                    extraInfo = ImMsgBody.ExtraInfo(\n                                        nick = \"user3\",\n                                        level = permision.level,\n                                        groupMask = 1,\n                                    ),\n                                )\n                            ),\n                        ),\n                    ),\n                )\n            )\n        )\n\n    override fun setBot(id: Long): QQAndroidBot {\n        return super.setBot(id).also { bot ->\n            runBlockingUnit { bot.login() }\n            network.addPacketReplier {\n                assertEquals(\"PbMessageSvc.PbMsgWithDraw\", it.commandName)\n                reply(PbMessageSvc.PbMsgWithDraw.Response.Success)\n            }\n        }\n    }\n\n    @Test\n    fun `recall member message without permission`() = runBlockingUnit {\n        val bot = setBot(2)\n        val group = bot.addGroup(5, 3, MemberPermission.MEMBER).apply {\n            // owner\n            addMember(3, permission = MemberPermission.OWNER)\n            // sender\n            addMember(1, permission = MemberPermission.MEMBER)\n        }\n        assertFailsWith<PermissionDeniedException> {\n            Mirai.recallMessage(bot, source(bot, 1, group.id, group.botPermission))\n        }\n    }\n\n    @Test\n    fun `recall member message`() = runBlockingUnit {\n        val bot = setBot(2)\n        val group = bot.addGroup(5, 3, MemberPermission.ADMINISTRATOR).apply {\n            // owner\n            addMember(3, permission = MemberPermission.OWNER)\n            // sender\n            addMember(1, permission = MemberPermission.MEMBER)\n        }\n        Mirai.recallMessage(bot, source(bot, 1, group.id, group.botPermission))\n    }\n\n    @Test\n    fun `recall administrator message`() = runBlockingUnit {\n        val bot = setBot(2)\n        val group = bot.addGroup(5, 3, MemberPermission.ADMINISTRATOR).apply {\n            // owner\n            addMember(3, permission = MemberPermission.OWNER)\n            // sender\n            addMember(1, permission = MemberPermission.ADMINISTRATOR)\n        }\n        assertFailsWith<PermissionDeniedException> {\n            Mirai.recallMessage(bot, source(bot, 1, group.id, group.botPermission))\n        }\n    }\n\n    @Test\n    fun `recall administrator message as owner`() = runBlockingUnit {\n        val bot = setBot(2)\n        val group = bot.addGroup(5, 2, MemberPermission.OWNER).apply {\n            // sender\n            addMember(1, permission = MemberPermission.ADMINISTRATOR)\n        }\n        Mirai.recallMessage(bot, source(bot, 1, group.id, group.botPermission))\n    }\n\n    @Test\n    fun `recall owner message`() = runBlockingUnit {\n        val bot = setBot(2)\n        val group = bot.addGroup(5, 1, MemberPermission.ADMINISTRATOR).apply {\n            // sender\n            addMember(1, permission = MemberPermission.OWNER)\n        }\n        assertFailsWith<PermissionDeniedException> {\n            Mirai.recallMessage(bot, source(bot, 1, group.id, group.botPermission))\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/samples/CustomMessageSamples.kt",
    "content": "/*\n * Copyright 2019-2020 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:Suppress(\"EXPERIMENTAL_API_USAGE\", \"EXPERIMENTAL_OVERRIDE\")\n\npackage samples\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.message.data.CustomMessage\nimport net.mamoe.mirai.message.data.CustomMessageMetadata\n\n\n/**\n * 定义一个自定义消息类型.\n * 在消息链中加入这个元素, 即可像普通元素一样发送和接收 (自动解析).\n */\n@Serializable\ndata class CustomMessageIdentifier(\n    val identifier1: Long,\n    val custom: String\n) : CustomMessageMetadata() {\n    // 可使用 JsonSerializerFactory 或 ProtoBufSerializerFactory\n    companion object Factory : CustomMessage.ProtoBufSerializerFactory<CustomMessageIdentifier>(\n        \"myMessage.CustomMessageIdentifier\"\n    )\n\n    override fun getFactory(): Factory = Factory\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/test/events.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.test\n\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.event.GlobalEventChannel\nimport net.mamoe.mirai.utils.ConcurrentLinkedQueue\nimport net.mamoe.mirai.utils.cast\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.test.assertEquals\n\ninternal inline fun <reified T : Event, R> assertEventBroadcasts(times: Int = 1, block: () -> R): R {\n    assertEventBroadcasts<T>(times) {\n        return block()\n    }\n}\n\ninternal inline fun <reified T : Event> assertEventBroadcasts(times: Int = 1, block: () -> Unit): List<T> {\n    contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }\n\n    val receivedEvents = ConcurrentLinkedQueue<Event>()\n    val listener = GlobalEventChannel.subscribeAlways<Event> { event ->\n        receivedEvents.add(event)\n    }\n\n    try {\n        block()\n    } finally {\n        listener.complete()\n    }\n\n    if (times < 0) return receivedEvents.filterIsInstance<T>().cast()\n\n    val actual = receivedEvents.filterIsInstance<T>().count()\n    assertEquals(\n        times,\n        actual,\n        \"Expected event ${T::class.simpleName} broadcast $times time(s). \" +\n                \"But actual count is ${actual}. \" +\n                \"\\nAll received events: ${receivedEvents.joinToString(\", \", \"[\", \"]\")}\"\n    )\n\n    return receivedEvents.filterIsInstance<T>().cast()\n}\n\n@OptIn(ExperimentalCoroutinesApi::class)\ninternal inline fun <R> assertEventNotBroadcast(block: () -> R): R {\n    return assertEventBroadcasts<Event, R>(0, block)\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/test/initPlatform.common.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.test\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport net.mamoe.mirai.IMirai\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.utils.setSystemProp\n\n/**\n * All test classes should inherit from [AbstractTest]\n */\nexpect abstract class AbstractTest() { // public, can be used in other modules\n    fun borrowSingleThreadDispatcher(): CoroutineDispatcher\n\n    companion object\n}\n\ninternal fun initializeTestCommon() {\n    setSystemProp(\"mirai.network.packet.logger\", \"true\")\n    setSystemProp(\"mirai.network.state.observer.logging\", \"true\")\n    setSystemProp(\"mirai.network.show.all.components\", \"true\")\n    setSystemProp(\"mirai.network.show.components.creation.stacktrace\", \"true\")\n    setSystemProp(\"mirai.network.handler.selector.logging\", \"true\")\n\n    Exception() // creates an exception to load relevant classes to estimate invocation time of test cases more accurately.\n    IMirai::class.simpleName // similarly, load classes.\n\n    Mirai // load services\n}\n"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/test/printing.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage test\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.IMirai\nimport net.mamoe.mirai.utils.*\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\n\n\nval DebugLogger: MiraiLogger = MiraiLogger.Factory.create(IMirai::class, \"Packet Debug\")\n\ninternal inline fun ByteArray.debugPrintThis(name: String): ByteArray {\n    DebugLogger.debug(name + \"=\" + this.toUHexString())\n    return this\n}\n\ninternal inline fun <R> Input.debugIfFail(\n    name: String = \"\",\n    onFail: (ByteArray) -> ByteReadPacket = { it.toReadPacket() },\n    block: ByteReadPacket.() -> R\n): R {\n\n    contract {\n        callsInPlace(block, InvocationKind.EXACTLY_ONCE)\n        callsInPlace(onFail, InvocationKind.UNKNOWN)\n    }\n    ByteArrayPool.useInstance {\n        val count = this.readAvailable(it)\n        try {\n            return it.toReadPacket(0, count).withUse(block)\n        } catch (e: Throwable) {\n            onFail(it.take(count).toByteArray()).readAvailable(it)\n            DebugLogger.debug(\"Error in ByteReadPacket $name=\" + it.toUHexString(offset = 0, length = count))\n            throw e\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/test/utils.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.internal.test\n\nimport kotlinx.coroutines.test.TestScope\nimport kotlinx.coroutines.test.runTest\nimport kotlinx.coroutines.withTimeout\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\nimport kotlin.time.Duration\n\nfun runBlockingUnit(\n    context: CoroutineContext = EmptyCoroutineContext,\n    block: suspend TestScope.() -> Unit\n) = runTest(context) { block() }\n\nfun runBlockingUnit(\n    context: CoroutineContext = EmptyCoroutineContext,\n    timeout: Duration,\n    block: suspend TestScope.() -> Unit\n) {\n    runTest(context, dispatchTimeoutMs = timeout.inWholeMilliseconds) {\n        withTimeout(timeout) {\n            block()\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/testFramework/DebugProbes.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Job\n\n/**\n * Mirror of kotlinx-coroutines-debug to be used in common sources.\n */\n@Suppress(\"RedundantSetter\", \"RedundantGetter\")\nexpect object DebugProbes {\n\n    /**\n     * Whether coroutine creation stack traces should be sanitized.\n     * Sanitization removes all frames from `kotlinx.coroutines` package except\n     * the first one and the last one to simplify diagnostic.\n     */\n    var sanitizeStackTraces: Boolean get set\n\n    /**\n     * Whether coroutine creation stack traces should be captured.\n     * When enabled, for each created coroutine a stack trace of the current\n     * thread is captured and attached to the coroutine.\n     * This option can be useful during local debug sessions, but is recommended\n     * to be disabled in production environments to avoid stack trace dumping overhead.\n     */\n    var enableCreationStackTraces: Boolean get set\n\n    /**\n     * Determines whether debug probes were [installed][DebugProbes.install].\n     */\n    val isInstalled: Boolean get\n\n    /**\n     * Installs a [DebugProbes] instead of no-op stdlib probes by redefining\n     * debug probes class using the same class loader as one loaded [DebugProbes] class.\n     */\n    fun install()\n\n    /**\n     * Uninstall debug probes.\n     */\n    fun uninstall()\n\n    /**\n     * Invokes given block of code with installed debug probes and uninstall probes in the end.\n     */\n    inline fun withDebugProbes(block: () -> Unit)\n\n    /**\n     * Returns string representation of the coroutines [job] hierarchy with additional debug information.\n     * Hierarchy is printed from the [job] as a root transitively to all children.\n     */\n    fun jobToString(job: Job): String\n\n    /**\n     * Returns string representation of all coroutines launched within the given [scope].\n     * Throws [IllegalStateException] if the scope has no a job in it.\n     */\n    fun scopeToString(scope: CoroutineScope): String\n\n    /**\n     * Prints [job] hierarchy representation from [jobToString] to the given [out].\n     */\n    public fun printJob(job: Job): Unit\n\n    /**\n     * Prints all coroutines launched within the given [scope].\n     * Throws [IllegalStateException] if the scope has no a job in it.\n     */\n    public fun printScope(scope: CoroutineScope): Unit\n\n    /**\n     * Returns all existing coroutines info.\n     * The resulting collection represents a consistent snapshot of all existing coroutines at the moment of invocation.\n     */\n//    public fun dumpCoroutinesInfo(): List<CoroutineInfo>\n\n    /**\n     * Dumps all active coroutines into the given output stream, providing a consistent snapshot of all existing coroutines at the moment of invocation.\n     * The output of this method is similar to `jstack` or a full thread dump. It can be used as the replacement to\n     * \"Dump threads\" action.\n     *\n     * Example of the output:\n     * ```\n     * Coroutines dump 2018/11/12 19:45:14\n     *\n     * Coroutine \"coroutine#42\":StandaloneCoroutine{Active}@58fdd99, state: SUSPENDED\n     *     at MyClass$awaitData.invokeSuspend(MyClass.kt:37)\n     * (Coroutine creation stacktrace)\n     *     at MyClass.createIoRequest(MyClass.kt:142)\n     *     at MyClass.fetchData(MyClass.kt:154)\n     *     at MyClass.showData(MyClass.kt:31)\n     * ...\n     * ```\n     */\n    fun dumpCoroutines(): Unit\n}\n"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/testFramework/DynamicTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmName(\"DynamicTestKt_common\")\n\npackage net.mamoe.mirai.internal.testFramework\n\nimport kotlin.jvm.JvmName\nimport kotlin.test.Test\n\n/**\n * Annotates a function to be a [Test] factory that returns a [DynamicTestsResult].\n *\n * On JVM, this delegates to JUnit's `TestFactory`. On Native, test functions are executed in-place.\n *\n * Tips: To run [TestFactory]s in IDEA, you can press `Ctrl + Shift + R`(for both macOS and Windows) with caret in the test function.\n */\n@Target(AnnotationTarget.FUNCTION)\n@Retention(AnnotationRetention.RUNTIME)\nexpect annotation class TestFactory()\n\n/**\n * @see dynamicTest\n */\nexpect open class DynamicTest // = junit.DynamicTest\n\n/**\n * @see runDynamicTests\n */\nexpect class DynamicTestsResult\n\n/**\n * Creates a dynamic test\n */\nexpect fun dynamicTest(displayName: String, action: () -> Unit): DynamicTest\n\n/**\n * The returned value must be returned from the function annotated with [TestFactory], otherwise the tests won't be executed on some platforms.\n */\nexpect fun runDynamicTests(dynamicTests: List<DynamicTest>): DynamicTestsResult\n\n/**\n * The returned value must be returned from the function annotated with [TestFactory], otherwise the tests won't be executed on some platforms.\n */\nfun runDynamicTests(vararg dynamicTests: Iterable<DynamicTest>): DynamicTestsResult =\n    runDynamicTests(dynamicTests = dynamicTests.flatMap { it })\n\n/**\n * The returned value must be returned from the function annotated with [TestFactory], otherwise the tests won't be executed on some platforms.\n */\nfun runDynamicTests(vararg dynamicTests: Sequence<DynamicTest>): DynamicTestsResult =\n    runDynamicTests(dynamicTests = dynamicTests.flatMap { it })\n\n/**\n * The returned value must be returned from the function annotated with [TestFactory], otherwise the tests won't be executed on some platforms.\n */\nfun runDynamicTests(vararg dynamicTests: DynamicTest): DynamicTestsResult = runDynamicTests(dynamicTests.toList())\n\n/**\n * The returned value must be returned from the function annotated with [TestFactory], otherwise the tests won't be executed on some platforms.\n */\nfun runDynamicTests(dynamicTests: Sequence<DynamicTest>): DynamicTestsResult = runDynamicTests(dynamicTests.toList())\n"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/testFramework/Platform.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework\n\n\nexpect fun currentPlatform(): Platform\n\nenum class PlatformRuntime {\n    JVM,\n    DALVIK,\n}\n\n// see `@DisabledOnPlatform`\nsealed class Platform(\n    val runtime: PlatformRuntime,\n) {\n    sealed class JvmLike(runtime: PlatformRuntime) : Platform(runtime)\n\n    sealed class Android(runtime: PlatformRuntime) : JvmLike(runtime)\n\n    sealed class AndroidUnitTest : Android(PlatformRuntime.JVM)\n    object AndroidUnitTestWithJdk : AndroidUnitTest()\n    object AndroidUnitTestWithAdk : AndroidUnitTest()\n\n    object AndroidInstrumentedTest : Android(PlatformRuntime.DALVIK)\n\n    object Jvm : JvmLike(PlatformRuntime.JVM)\n}\n\n"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/testFramework/message/TestMessageSourceSequenceIdAwaiter.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.message\n\nimport kotlinx.coroutines.CompletableDeferred\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Deferred\nimport net.mamoe.mirai.internal.message.source.MessageSourceSequenceIdAwaiter\nimport net.mamoe.mirai.internal.message.source.OnlineMessageSourceToGroupImpl\n\ninternal class TestMessageSourceSequenceIdAwaiter : MessageSourceSequenceIdAwaiter() {\n    override fun getSequenceIdAsync(\n        sourceToGroupImpl: OnlineMessageSourceToGroupImpl,\n        coroutineScope: CoroutineScope\n    ): Deferred<IntArray?> {\n        return CompletableDeferred(value = null) // assuming server didn't provide response, just to be simpler\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/testFramework/package.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/testFramework/rules/DisabledOnJvmLikePlatform.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.rules\n\nimport net.mamoe.mirai.internal.testFramework.Platform\nimport kotlin.reflect.KClass\n\n/**\n * 在 commonTest 使用, 以在目标平台忽略这个 test.\n *\n * 此注解只对 JVM 和 Android 平台生效.\n * 要在 native 平台忽略 test, 请手动写 `if (currentPlatform() is Native) return`.\n */\n@OptIn(ExperimentalMultiplatform::class)\n@OptionalExpectation\nexpect annotation class DisabledOnJvmLikePlatform(\n    vararg val values: KClass<out Platform.JvmLike> // don't read this property\n)"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/utils/FileSystemTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.internal.utils\n\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFailsWith\n\ninternal class FileSystemTest : AbstractTest() {\n\n    private val fs = FileSystem\n\n    @Test\n    fun testLegitimacy() {\n        fs.checkLegitimacy(\"a\")\n        assertFailsWith<IllegalArgumentException> { fs.checkLegitimacy(\"a:\") }\n        assertFailsWith<IllegalArgumentException> { fs.checkLegitimacy(\"?a\") }\n    }\n\n    @Test\n    fun testNormalize() {\n        assertEquals(\"/\", fs.normalize(\"/\"))\n        assertEquals(\"/\", fs.normalize(\"\\\\\"))\n        assertEquals(\"/foo\", fs.normalize(\"/foo\"))\n        assertEquals(\"/foo\", fs.normalize(\"\\\\foo\"))\n        assertEquals(\"foo\", fs.normalize(\"foo\"))\n        assertEquals(\"foo/\", fs.normalize(\"foo/\"))\n\n        assertEquals(\"/bar\", fs.normalize(\"\\\\foo\", \"/bar\"))\n        assertEquals(\"/foo/bar\", fs.normalize(\"\\\\foo\", \"bar\"))\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/utils/crypto/AESTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils.crypto\n\nimport net.mamoe.mirai.utils.currentTimeMillis\nimport net.mamoe.mirai.utils.getRandomString\nimport net.mamoe.mirai.utils.toUHexString\nimport kotlin.random.Random\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class AESTest {\n    @Test\n    fun `can do crypto`() {\n        val random = Random(currentTimeMillis())\n\n        val key = getRandomString(16, random).encodeToByteArray()\n        val iv = getRandomString(16, random).encodeToByteArray()\n        val currentTime = currentTimeMillis()\n\n        val plainText = buildString {\n            append(\"Use of this source code is governed by the GNU AGPLv3 license \")\n            append(\"that can be found through the following link. \")\n            append(currentTime)\n        }\n\n        println(\"AES crypto test: key = ${key.toUHexString()}, iv = ${iv.toUHexString()}, currentTimeMillis = $currentTime\")\n        val encrypted = aesEncrypt(plainText.encodeToByteArray(), iv, key)\n        val decrypted = aesDecrypt(encrypted, iv, key)\n\n        assertEquals(plainText, decrypted.decodeToString())\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/utils/crypto/EcdhTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils.crypto\n\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.utils.toUHexString\nimport kotlin.test.Test\nimport kotlin.test.assertContentEquals\nimport kotlin.test.assertEquals\n\ninternal class EcdhTest : AbstractTest() {\n\n    @Test\n    fun `can generate key pair`() {\n        val alice = Ecdh.Instance.generateKeyPair()\n        val bob = Ecdh.Instance.generateKeyPair()\n\n        val aliceSecret = Ecdh.Instance.calculateShareKey(bob.public, alice.private)\n        val bobSecret = Ecdh.Instance.calculateShareKey(alice.public, bob.private)\n\n        println(aliceSecret.toUHexString())\n        assertContentEquals(aliceSecret, bobSecret)\n    }\n\n    @Test\n    fun `can export and import public keys`() {\n        val alice = Ecdh.Instance.generateKeyPair()\n\n        println(alice)\n        val publicKey = Ecdh.Instance.exportPublicKey(alice.public)\n        println(publicKey.toUHexString())\n        assertEquals(0x04, publicKey.first())\n\n        val importedAlicePubKey = Ecdh.Instance.importPublicKey(publicKey)\n        assertEquals(alice.public, importedAlicePubKey)\n    }\n\n    /*\n\n\tEC_KEY *alice = create_key();\n\tEC_KEY *bob = create_key();\n\tassert(alice != NULL && bob != NULL);\n\n\tconst EC_POINT *alice_public = EC_KEY_get0_public_key(alice);\n\tconst EC_POINT *bob_public = EC_KEY_get0_public_key(bob);\n\n\tsize_t alice_secret_len;\n\tsize_t bob_secret_len;\n\n\tunsigned char *alice_secret = get_secret(alice, bob_public, &alice_secret_len);\n\tunsigned char *bob_secret = get_secret(bob, alice_public, &bob_secret_len);\n\tassert(alice_secret != NULL && bob_secret != NULL\n\t\t&& alice_secret_len == bob_secret_len);\n\n\tfor (int i = 0; i < alice_secret_len; i++)\n\t\tassert(alice_secret[i] == bob_secret[i]);\n\n\tEC_KEY_free(alice);\n\tEC_KEY_free(bob);\n\tOPENSSL_free(alice_secret);\n\tOPENSSL_free(bob_secret);\n\n\treturn 0;\n     */\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/utils/crypto/RSATest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils.crypto\n\nimport net.mamoe.mirai.internal.testFramework.*\nimport net.mamoe.mirai.internal.testFramework.rules.DisabledOnJvmLikePlatform\nimport kotlin.math.pow\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\n@DisabledOnJvmLikePlatform(Platform.AndroidUnitTest::class)\nclass RSATest {\n    @TestFactory\n    fun `can generate key pair`(): DynamicTestsResult {\n        return runDynamicTests(buildList {\n            repeat(4) { exp ->\n                val keySize = 2.0.pow(9 + exp).toInt()\n                add(dynamicTest(\"RSAKeyGenLength$keySize\") {\n                    val rsaKeyPair = generateRSAKeyPair(keySize)\n                    println(\"RSA keygen test #${exp + 1}: keySize = $keySize\")\n                    println(rsaKeyPair.plainPubPemKey)\n                    println(rsaKeyPair.plainPrivPemKey)\n                })\n            }\n        })\n    }\n\n    @Test\n    fun `can do crypto with generated key`() {\n        val keyPair = generateRSAKeyPair(2048)\n\n        val plainText = buildString {\n            append(\"Use of this source code is governed by the GNU AGPLv3 license \")\n            append(\"that can be found through the following link. \")\n        }\n\n        println(\n            \"RSA crypto test: plainTextLength: ${plainText.length}, \" +\n                    \"pubKey = ${keyPair.plainPubPemKey}, \" +\n                    \"privKey = ${keyPair.plainPrivPemKey}\"\n        )\n        val enc = rsaEncryptWithX509PubKey(plainText.encodeToByteArray(), keyPair.plainPubPemKey, 0)\n        println(\"rsa encrypt: data size=${enc.size}\")\n        val decrypted = rsaDecryptWithPKCS8PrivKey(enc, keyPair.plainPrivPemKey, 0)\n\n        assertEquals(plainText, decrypted.decodeToString())\n    }\n\n    @Test\n    fun `can do crypto with specific key`() {\n        val pubKey = \"\"\"\n-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr0KIpsWPW2JA7ShJI18o\nwPv3Ip3Y6a0OkJOozfVlQDOjjUG6niDcrPIm+OpL7pCAzwc+h8d9sFH5c/7/bY4i\nwKK6CpSaOYgQQ03P31KhzmXGJ4LVSxUIV0bhuDYQr+sU5Gu97onF8Ko8MELtWTPw\nKP1dfqZ3PrK8QBH6su0GlB8onYFtzDUckr2wCrrJ1cR4L1Dg5f2egE75l1cliAIM\n4FH1WFU2musfdEuCo5oPgl8ZPPLrQwp8qm9w7xBvbgbmfPTjPBC0N4gcelVzvdfC\neU8vpIlLP/9W5nkdqF6CWzjE3dIx2btOH4QDDyogDSLRAvcKN5/1EIZeu2FTbw9k\n3QIDAQAB\n-----END PUBLIC KEY-----\n        \"\"\".trimIndent()\n\n        val privKey = \"\"\"\n-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCvQoimxY9bYkDt\nKEkjXyjA+/cindjprQ6Qk6jN9WVAM6ONQbqeINys8ib46kvukIDPBz6Hx32wUflz\n/v9tjiLAoroKlJo5iBBDTc/fUqHOZcYngtVLFQhXRuG4NhCv6xTka73uicXwqjww\nQu1ZM/Ao/V1+pnc+srxAEfqy7QaUHyidgW3MNRySvbAKusnVxHgvUODl/Z6ATvmX\nVyWIAgzgUfVYVTaa6x90S4Kjmg+CXxk88utDCnyqb3DvEG9uBuZ89OM8ELQ3iBx6\nVXO918J5Ty+kiUs//1bmeR2oXoJbOMTd0jHZu04fhAMPKiANItEC9wo3n/UQhl67\nYVNvD2TdAgMBAAECggEAExREqRcfvJyNIeQ9Vg7xclTbuhaB+ypeSAnzGfzJeXxF\npUaPCNDeBSvVZ0qmWoG7rA4HViO3AJ9j7ydG6kfLa7orU6SKx5GS56jMZOzrdXsp\n37pD+wj+n/W08+da2LPYUeeSxSmVdVYq+DwI96mKTwQKDhQULiyqBrWOW7Um/q/Z\nJC8kJWKEmlNideDQHJxZViRyOdKvJtiwvoBLe1Jvbx7oMbpZnf20gV8C7UU7U38R\ne0BKT6HBUHXuOOp2tFFpX6dySkJqW7Jijv04B/KnDYaSWD8TtaQfPfAhkiEVA17E\nRet04PnPMiYCkSVakO0MEeFpwb01vPca4Z64zgf7EQKBgQDyU6wsO3v8L1OlV7tx\n7+T0PuOqeo7MWESSn18LeyOP2Y+fDtHKMUFULeYH1UZaGsZJvW+P+c8Mvyitbcvv\nSZPTR0Dg+1HueXWkNTejs8Z2BKpPmIPaVLz5FxhV7hV2hKgII/yhyRoiWrTiawLg\nocOnYSostg+tt6kT8U2QPKhg9QKBgQC5Jho1nZ3pFPVu2rV/o9VvN7bGfn1M2o8k\n9PQjLZQYiXJvPP0tNlvAOHk9cAqYecHJ3wDVacZWmLicU8xmNSFmmN6Vs9jj6km4\nCWq0/wuTUO/fiH+oHZb6+JM63RXbASWyNK+WwmZtDryNBGRB5zbeCAK8tFsRCJDw\n19WQUzljSQKBgCWKkuzTVlTuXA4MdmyjVpwENi8OB5tevVjdudLEg/DgKqDgod2q\nHc3VwoJKJzkEVt3LrEHo2IvH/ZxIm0R56J3dtw5jwQCp7nC/EdyZmFBmTqBAJ4Um\nhZQtYMbHOKoAySthr9y8lADofodpPqvgQ7hllCwTFIC8KER/qJ2E2C0VAoGATLUM\nhsoWckrMpHDYYVlvQ/TBNNuS7hRe2eDihPCNOt03G/8YpXKv8KN1F48j1KgdMZXC\nsqhwE9CSK7JMLMw2WltbXIp2gXa/tA+yteo00YPm3aWfvfcEZlY2KV0PgPyosXxC\ngyNnbCd+1q3LG8K/aJ3JBIV0dUonQqEpSfIxBIECgYArO3Iw+LvoePjq4yHheyEM\nrz6d6RB+i1Q7ExBK7lbZxN17HmKiOewwI772zEo28IY9sIHugV7rW1vQVs3bnzgk\nExDGjYWZSKHfs+3mvrLNRIx/IsVqqwlXt5oO9TspSh68ASvmXN51dmduxRrSuScq\n8a49uOr675SyFCJTIdF/Ag==\n-----END PRIVATE KEY-----\n\"\"\".trimIndent()\n\n        val plainText = buildString {\n            append(\"Use of this source code is governed by the GNU AGPLv3 license \")\n            append(\"that can be found through the following link. \")\n        }\n\n        val enc = rsaEncryptWithX509PubKey(plainText.encodeToByteArray(), pubKey, 0)\n        val dec = rsaDecryptWithPKCS8PrivKey(enc, privKey, 0)\n\n        assertEquals(plainText, dec.decodeToString())\n\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/utils/io/serialization/ReadJceStructTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils.io.serialization\n\nimport net.mamoe.mirai.internal.network.protocol.data.jce.PushReq\nimport net.mamoe.mirai.internal.network.protocol.data.jce.RequestPacket\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.utils.hexToBytes\nimport net.mamoe.mirai.utils.read\nimport kotlin.test.Test\n\ninternal class ReadJceStructTest : AbstractTest() {\n\n    @Test\n    fun `ByteReadPacket readJceStruct`() {\n        \"10 02 2C 3C 4C 56 23 51 51 53 65 72 76 69 63 65 2E 43 6F 6E 66 69 67 50 75 73 68 53 76 63 2E 4D 61 69 6E 53 65 72 76 61 6E 74 66 07 50 75 73 68 52 65 71 7D 00 01 03 A3 08 00 01 06 07 50 75 73 68 52 65 71 18 00 01 06 12 43 6F 6E 66 69 67 50 75 73 68 2E 50 75 73 68 52 65 71 1D 00 01 03 7B 0A 10 01 2D 00 01 03 6D 19 00 07 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 31 34 37 21 1F 90 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 32 34 34 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 31 38 33 2E 34 37 2E 39 39 2E 32 34 21 36 B0 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 34 35 21 01 BB 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 36 35 20 50 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 37 36 2E 32 31 31 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 11 6D 73 66 77 69 66 69 2E 33 67 2E 71 71 2E 63 6F 6D 21 1F 90 30 01 4C 5C 60 08 7C 86 06 6F 74 68 65 72 73 96 06 6F 74 68 65 72 73 AC 0B 39 00 07 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 31 34 37 21 1F 90 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 32 34 34 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 31 38 33 2E 34 37 2E 39 39 2E 32 34 21 36 B0 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 34 35 21 01 BB 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 36 35 20 50 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 37 36 2E 32 31 31 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 11 6D 73 66 77 69 66 69 2E 33 67 2E 71 71 2E 63 6F 6D 21 1F 90 30 01 4C 5C 60 08 7C 86 06 6F 74 68 65 72 73 96 06 6F 74 68 65 72 73 AC 0B 4C 5C 6C 70 01 89 00 04 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 99 00 04 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B A9 0C B9 0C C9 0C D9 0C EC FC 0F F6 10 00 FC 11 32 00 29 18 59 0B 8C 98 0C A8 0C\"\n            .hexToBytes().read {\n                readJceStruct(RequestPacket.serializer())\n            }\n    }\n\n    @Test\n    fun `ByteReadPacket readJceStruct with rubbish length`() { // #1991\n        \"00 00 03 E4 10 02 2C 3C 4C 56 23 51 51 53 65 72 76 69 63 65 2E 43 6F 6E 66 69 67 50 75 73 68 53 76 63 2E 4D 61 69 6E 53 65 72 76 61 6E 74 66 07 50 75 73 68 52 65 71 7D 00 01 03 A3 08 00 01 06 07 50 75 73 68 52 65 71 18 00 01 06 12 43 6F 6E 66 69 67 50 75 73 68 2E 50 75 73 68 52 65 71 1D 00 01 03 7B 0A 10 01 2D 00 01 03 6D 19 00 07 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 31 34 37 21 1F 90 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 32 34 34 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 31 38 33 2E 34 37 2E 39 39 2E 32 34 21 36 B0 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 34 35 21 01 BB 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 36 35 20 50 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 37 36 2E 32 31 31 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 11 6D 73 66 77 69 66 69 2E 33 67 2E 71 71 2E 63 6F 6D 21 1F 90 30 01 4C 5C 60 08 7C 86 06 6F 74 68 65 72 73 96 06 6F 74 68 65 72 73 AC 0B 39 00 07 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 31 34 37 21 1F 90 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 32 34 34 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 31 38 33 2E 34 37 2E 39 39 2E 32 34 21 36 B0 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 34 35 21 01 BB 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 36 35 20 50 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 37 36 2E 32 31 31 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 11 6D 73 66 77 69 66 69 2E 33 67 2E 71 71 2E 63 6F 6D 21 1F 90 30 01 4C 5C 60 08 7C 86 06 6F 74 68 65 72 73 96 06 6F 74 68 65 72 73 AC 0B 4C 5C 6C 70 01 89 00 04 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 99 00 04 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B A9 0C B9 0C C9 0C D9 0C EC FC 0F F6 10 00 FC 11 32 00 29 18 59 0B 8C 98 0C A8 0C\"\n            .hexToBytes().read {\n                readJceStruct(RequestPacket.serializer())\n            }\n    }\n\n    @Test\n    fun `ByteReadPacket readUniPacket`() {\n        \"10 02 2C 3C 4C 56 23 51 51 53 65 72 76 69 63 65 2E 43 6F 6E 66 69 67 50 75 73 68 53 76 63 2E 4D 61 69 6E 53 65 72 76 61 6E 74 66 07 50 75 73 68 52 65 71 7D 00 01 03 A3 08 00 01 06 07 50 75 73 68 52 65 71 18 00 01 06 12 43 6F 6E 66 69 67 50 75 73 68 2E 50 75 73 68 52 65 71 1D 00 01 03 7B 0A 10 01 2D 00 01 03 6D 19 00 07 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 31 34 37 21 1F 90 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 32 34 34 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 31 38 33 2E 34 37 2E 39 39 2E 32 34 21 36 B0 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 34 35 21 01 BB 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 36 35 20 50 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 37 36 2E 32 31 31 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 11 6D 73 66 77 69 66 69 2E 33 67 2E 71 71 2E 63 6F 6D 21 1F 90 30 01 4C 5C 60 08 7C 86 06 6F 74 68 65 72 73 96 06 6F 74 68 65 72 73 AC 0B 39 00 07 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 31 34 37 21 1F 90 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 32 34 34 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 31 38 33 2E 34 37 2E 39 39 2E 32 34 21 36 B0 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 34 35 21 01 BB 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 36 35 20 50 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 37 36 2E 32 31 31 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 11 6D 73 66 77 69 66 69 2E 33 67 2E 71 71 2E 63 6F 6D 21 1F 90 30 01 4C 5C 60 08 7C 86 06 6F 74 68 65 72 73 96 06 6F 74 68 65 72 73 AC 0B 4C 5C 6C 70 01 89 00 04 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 99 00 04 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B A9 0C B9 0C C9 0C D9 0C EC FC 0F F6 10 00 FC 11 32 00 29 18 59 0B 8C 98 0C A8 0C\"\n            .hexToBytes().read {\n                readUniPacket(PushReq.serializer(), \"PushReq\")\n            }\n    }\n\n    @Test\n    fun `ByteReadPacket readUniPacket with rubbish length`() { // #1991\n        \"00 00 03 E4 10 02 2C 3C 4C 56 23 51 51 53 65 72 76 69 63 65 2E 43 6F 6E 66 69 67 50 75 73 68 53 76 63 2E 4D 61 69 6E 53 65 72 76 61 6E 74 66 07 50 75 73 68 52 65 71 7D 00 01 03 A3 08 00 01 06 07 50 75 73 68 52 65 71 18 00 01 06 12 43 6F 6E 66 69 67 50 75 73 68 2E 50 75 73 68 52 65 71 1D 00 01 03 7B 0A 10 01 2D 00 01 03 6D 19 00 07 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 31 34 37 21 1F 90 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 32 34 34 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 31 38 33 2E 34 37 2E 39 39 2E 32 34 21 36 B0 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 34 35 21 01 BB 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 36 35 20 50 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 37 36 2E 32 31 31 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 11 6D 73 66 77 69 66 69 2E 33 67 2E 71 71 2E 63 6F 6D 21 1F 90 30 01 4C 5C 60 08 7C 86 06 6F 74 68 65 72 73 96 06 6F 74 68 65 72 73 AC 0B 39 00 07 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 31 34 37 21 1F 90 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 32 34 34 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 31 38 33 2E 34 37 2E 39 39 2E 32 34 21 36 B0 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 34 35 21 01 BB 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 36 35 20 50 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 37 36 2E 32 31 31 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 11 6D 73 66 77 69 66 69 2E 33 67 2E 71 71 2E 63 6F 6D 21 1F 90 30 01 4C 5C 60 08 7C 86 06 6F 74 68 65 72 73 96 06 6F 74 68 65 72 73 AC 0B 4C 5C 6C 70 01 89 00 04 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 99 00 04 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B A9 0C B9 0C C9 0C D9 0C EC FC 0F F6 10 00 FC 11 32 00 29 18 59 0B 8C 98 0C A8 0C\"\n            .hexToBytes().read {\n                readUniPacket(PushReq.serializer(), \"PushReq\")\n            }\n    }\n\n\n    @Test\n    fun `ByteArray readJceStruct`() {\n        \"10 02 2C 3C 4C 56 23 51 51 53 65 72 76 69 63 65 2E 43 6F 6E 66 69 67 50 75 73 68 53 76 63 2E 4D 61 69 6E 53 65 72 76 61 6E 74 66 07 50 75 73 68 52 65 71 7D 00 01 03 A3 08 00 01 06 07 50 75 73 68 52 65 71 18 00 01 06 12 43 6F 6E 66 69 67 50 75 73 68 2E 50 75 73 68 52 65 71 1D 00 01 03 7B 0A 10 01 2D 00 01 03 6D 19 00 07 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 31 34 37 21 1F 90 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 32 34 34 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 31 38 33 2E 34 37 2E 39 39 2E 32 34 21 36 B0 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 34 35 21 01 BB 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 36 35 20 50 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 37 36 2E 32 31 31 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 11 6D 73 66 77 69 66 69 2E 33 67 2E 71 71 2E 63 6F 6D 21 1F 90 30 01 4C 5C 60 08 7C 86 06 6F 74 68 65 72 73 96 06 6F 74 68 65 72 73 AC 0B 39 00 07 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 31 34 37 21 1F 90 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 32 34 34 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 31 38 33 2E 34 37 2E 39 39 2E 32 34 21 36 B0 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 34 35 21 01 BB 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 36 35 20 50 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 37 36 2E 32 31 31 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 11 6D 73 66 77 69 66 69 2E 33 67 2E 71 71 2E 63 6F 6D 21 1F 90 30 01 4C 5C 60 08 7C 86 06 6F 74 68 65 72 73 96 06 6F 74 68 65 72 73 AC 0B 4C 5C 6C 70 01 89 00 04 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 99 00 04 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B A9 0C B9 0C C9 0C D9 0C EC FC 0F F6 10 00 FC 11 32 00 29 18 59 0B 8C 98 0C A8 0C\"\n            .hexToBytes().loadAs(RequestPacket.serializer())\n    }\n\n    @Test\n    fun `ByteArray readJceStruct with rubbish length`() { // #1991\n        \"00 00 03 E4 10 02 2C 3C 4C 56 23 51 51 53 65 72 76 69 63 65 2E 43 6F 6E 66 69 67 50 75 73 68 53 76 63 2E 4D 61 69 6E 53 65 72 76 61 6E 74 66 07 50 75 73 68 52 65 71 7D 00 01 03 A3 08 00 01 06 07 50 75 73 68 52 65 71 18 00 01 06 12 43 6F 6E 66 69 67 50 75 73 68 2E 50 75 73 68 52 65 71 1D 00 01 03 7B 0A 10 01 2D 00 01 03 6D 19 00 07 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 31 34 37 21 1F 90 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 32 34 34 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 31 38 33 2E 34 37 2E 39 39 2E 32 34 21 36 B0 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 34 35 21 01 BB 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 36 35 20 50 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 37 36 2E 32 31 31 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 11 6D 73 66 77 69 66 69 2E 33 67 2E 71 71 2E 63 6F 6D 21 1F 90 30 01 4C 5C 60 08 7C 86 06 6F 74 68 65 72 73 96 06 6F 74 68 65 72 73 AC 0B 39 00 07 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 31 34 37 21 1F 90 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 32 34 34 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 31 38 33 2E 34 37 2E 39 39 2E 32 34 21 36 B0 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 34 35 21 01 BB 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 36 35 20 50 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 37 36 2E 32 31 31 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 11 6D 73 66 77 69 66 69 2E 33 67 2E 71 71 2E 63 6F 6D 21 1F 90 30 01 4C 5C 60 08 7C 86 06 6F 74 68 65 72 73 96 06 6F 74 68 65 72 73 AC 0B 4C 5C 6C 70 01 89 00 04 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 99 00 04 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B A9 0C B9 0C C9 0C D9 0C EC FC 0F F6 10 00 FC 11 32 00 29 18 59 0B 8C 98 0C A8 0C\"\n            .hexToBytes().loadAs(RequestPacket.serializer())\n    }\n\n    @Test\n    fun `ByteArray readUniPacket`() {\n        \"10 02 2C 3C 4C 56 23 51 51 53 65 72 76 69 63 65 2E 43 6F 6E 66 69 67 50 75 73 68 53 76 63 2E 4D 61 69 6E 53 65 72 76 61 6E 74 66 07 50 75 73 68 52 65 71 7D 00 01 03 A3 08 00 01 06 07 50 75 73 68 52 65 71 18 00 01 06 12 43 6F 6E 66 69 67 50 75 73 68 2E 50 75 73 68 52 65 71 1D 00 01 03 7B 0A 10 01 2D 00 01 03 6D 19 00 07 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 31 34 37 21 1F 90 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 32 34 34 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 31 38 33 2E 34 37 2E 39 39 2E 32 34 21 36 B0 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 34 35 21 01 BB 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 36 35 20 50 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 37 36 2E 32 31 31 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 11 6D 73 66 77 69 66 69 2E 33 67 2E 71 71 2E 63 6F 6D 21 1F 90 30 01 4C 5C 60 08 7C 86 06 6F 74 68 65 72 73 96 06 6F 74 68 65 72 73 AC 0B 39 00 07 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 31 34 37 21 1F 90 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 32 34 34 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 31 38 33 2E 34 37 2E 39 39 2E 32 34 21 36 B0 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 34 35 21 01 BB 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 36 35 20 50 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 37 36 2E 32 31 31 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 11 6D 73 66 77 69 66 69 2E 33 67 2E 71 71 2E 63 6F 6D 21 1F 90 30 01 4C 5C 60 08 7C 86 06 6F 74 68 65 72 73 96 06 6F 74 68 65 72 73 AC 0B 4C 5C 6C 70 01 89 00 04 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 99 00 04 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B A9 0C B9 0C C9 0C D9 0C EC FC 0F F6 10 00 FC 11 32 00 29 18 59 0B 8C 98 0C A8 0C\"\n            .hexToBytes().loadWithUniPacket(PushReq.serializer(), \"PushReq\")\n    }\n\n    @Test\n    fun `ByteArray readUniPacket with rubbish length`() { // #1991\n        \"00 00 03 E4 10 02 2C 3C 4C 56 23 51 51 53 65 72 76 69 63 65 2E 43 6F 6E 66 69 67 50 75 73 68 53 76 63 2E 4D 61 69 6E 53 65 72 76 61 6E 74 66 07 50 75 73 68 52 65 71 7D 00 01 03 A3 08 00 01 06 07 50 75 73 68 52 65 71 18 00 01 06 12 43 6F 6E 66 69 67 50 75 73 68 2E 50 75 73 68 52 65 71 1D 00 01 03 7B 0A 10 01 2D 00 01 03 6D 19 00 07 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 31 34 37 21 1F 90 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 32 34 34 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 31 38 33 2E 34 37 2E 39 39 2E 32 34 21 36 B0 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 34 35 21 01 BB 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 36 35 20 50 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 37 36 2E 32 31 31 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 11 6D 73 66 77 69 66 69 2E 33 67 2E 71 71 2E 63 6F 6D 21 1F 90 30 01 4C 5C 60 08 7C 86 06 6F 74 68 65 72 73 96 06 6F 74 68 65 72 73 AC 0B 39 00 07 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 31 34 37 21 1F 90 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 34 39 2E 37 2E 32 35 33 2E 32 34 34 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0C 31 38 33 2E 34 37 2E 39 39 2E 32 34 21 36 B0 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 34 35 21 01 BB 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 38 33 2E 34 37 2E 31 30 32 2E 31 36 35 20 50 30 01 4C 5C 60 08 70 01 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 37 36 2E 32 31 31 20 50 30 01 4C 5C 60 08 70 01 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 11 6D 73 66 77 69 66 69 2E 33 67 2E 71 71 2E 63 6F 6D 21 1F 90 30 01 4C 5C 60 08 7C 86 06 6F 74 68 65 72 73 96 06 6F 74 68 65 72 73 AC 0B 4C 5C 6C 70 01 89 00 04 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 99 00 04 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0D 34 32 2E 38 31 2E 31 39 33 2E 32 34 32 20 50 30 01 4C 50 03 60 08 7C 86 02 73 7A 96 03 74 65 6C AC 0B 0A 16 0E 31 31 39 2E 31 34 37 2E 31 39 30 2E 33 37 20 50 30 01 4C 50 03 60 08 7C 86 02 74 6A 96 03 74 65 6C AC 0B A9 0C B9 0C C9 0C D9 0C EC FC 0F F6 10 00 FC 11 32 00 29 18 59 0B 8C 98 0C A8 0C\"\n            .hexToBytes().loadWithUniPacket(PushReq.serializer(), \"PushReq\")\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/kotlin/utils/io/serialization/tars/internal/DebugLoggerTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils.io.serialization.tars.internal\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.internal.utils.io.JceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.readJceStruct\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.Tars\nimport net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.utils.toReadPacket\nimport net.mamoe.mirai.utils.toUHexString\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFails\n\ninternal class DebugLoggerTest : AbstractTest() {\n\n    fun String.uniteLine(): String = replace(\"\\r\\n\", \"\\n\").replace(\"\\r\", \"\\n\")\n\n    @Serializable\n    data class Struct(\n        @TarsId(1) val str: String,\n        @TarsId(2) val int: Int,\n    ) : JceStruct\n\n    @Test\n    fun `can log`() {\n        val out = BytePacketBuilder()\n        val logger = DebugLogger(out)\n        val original = Struct(\"string\", 1)\n        val bytes = original.toByteArray(Struct.serializer())\n        val value = bytes.toReadPacket().use { Tars.UTF_8.load(Struct.serializer(), it, logger) }\n        assertEquals(original, value)\n        assertEquals(\n            \"\"\"\n            beginStructure: net.mamoe.mirai.internal.utils.io.serialization.tars.internal.DebugLoggerTest.Struct, CLASS\n                decodeElementIndex: TarsHead(tag=1, type=6(String1))\n                name=str\n                decodeElementIndex: TarsHead(tag=2, type=0(Byte))\n                name=int\n                decodeElementIndex: currentHead == null\n            endStructure: net.mamoe.mirai.internal.utils.io.serialization.tars.internal.DebugLoggerTest.Struct, null, null\n        \"\"\".trimIndent(), out.build().readBytes().decodeToString().trim().uniteLine()\n        )\n    }\n\n    @Test\n    fun `can auto log`() {\n        val original = Struct(\"string\", 1)\n        val bytes = original.toByteArray(Struct.serializer())\n        println(bytes.toUHexString()) // 16 06 73 74 72 69 6E 67 20 01\n        bytes[bytes.lastIndex - 1] = 0x30.toByte() // change tag\n        val exception = assertFails { bytes.toReadPacket().use { it.readJceStruct(Struct.serializer()) } }\n        assertEquals(\n            \"\"\"\n            在 解析 net.mamoe.mirai.internal.utils.io.serialization.tars.internal.DebugLoggerTest.Struct 时遇到了意料之中的问题. 请完整复制此日志提交给 mirai: https://github.com/mamoe/mirai/issues/new/choose    调试信息: \n            Data: \n            16 06 73 74 72 69 6E 67 30 01\n            Trace:\n            \n            beginStructure: net.mamoe.mirai.internal.utils.io.serialization.tars.internal.DebugLoggerTest.Struct, CLASS\n                decodeElementIndex: TarsHead(tag=1, type=6(String1))\n                name=str\n                decodeElementIndex: TarsHead(tag=3, type=0(Byte))\n                skipping Byte\n                decodeElementIndex EOF\n            endStructure: net.mamoe.mirai.internal.utils.io.serialization.tars.internal.DebugLoggerTest.Struct, null, null\n        \"\"\".trimIndent().trim(), exception.message!!.trim().uniteLine()\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/commonTest/resources/META-INF/services/net.mamoe.mirai.internal.message.source.MessageSourceSequenceIdAwaiter",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nnet.mamoe.mirai.internal.testFramework.message.TestMessageSourceSequenceIdAwaiter"
  },
  {
    "path": "mirai-core/src/commonTest/resources/recording/configs/desensitization.yml",
    "content": "# Template for Desensitization in recordings\n#\n# Format:\n# ```\n# <sensitive value>: <replacement>\n# ```\n#\n# If key is a number, its group uin counterpart will also be processed, with calculated replacer.\n# WARNING: Ensure the <replacement> is not longer than <sensitive value>.\n#\n# For example, if your account id is 147258369, you may add:\n# ```\n# 147258369: 123456\n# ```\n# Then your id will be replaced with 123456.\n#\n#\n# To use desensitization, duplicate this file into name \"local.desensitization.yml\".\n\n123456789: 111"
  },
  {
    "path": "mirai-core/src/commonTest/resources/recording/configs/test.desensitization.yml",
    "content": "123456789: 111\n987654321: 222"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/MiraiImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmName(\"MiraiImplKt\")\n\npackage net.mamoe.mirai.internal\n\nimport io.ktor.client.*\nimport io.ktor.client.engine.okhttp.*\nimport io.ktor.client.plugins.*\nimport kotlinx.atomicfu.atomic\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocolFacade\nimport net.mamoe.mirai.internal.utils.MiraiCoreServices\n\nprivate val initialized = atomic(false)\n\n@Suppress(\"FunctionName\")\ninternal actual fun _MiraiImpl_static_init() {\n    if (!initialized.compareAndSet(expect = false, update = true)) return\n    MiraiCoreServices.registerAll()\n    MessageProtocolFacade.INSTANCE // register serializers\n}\n\ninternal actual fun createDefaultHttpClient(): HttpClient {\n    return HttpClient(OkHttp) {\n        install(HttpTimeout) {\n            this.requestTimeoutMillis = 30_0000\n            this.connectTimeoutMillis = 30_0000\n            this.socketTimeoutMillis = 30_0000\n        }\n    }\n\n}\n\n"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/contact/GroupImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact\n\nimport net.mamoe.mirai.contact.ContactList\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.data.GroupInfo\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.internal.utils.RemoteFileImpl\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport kotlin.coroutines.CoroutineContext\n\ninternal actual class GroupImpl actual constructor(\n    bot: QQAndroidBot,\n    parentCoroutineContext: CoroutineContext,\n    id: Long,\n    groupInfo: GroupInfo,\n    members: ContactList<NormalMemberImpl>,\n) : Group, CommonGroupImpl(bot, parentCoroutineContext, id, groupInfo, members) {\n    actual companion object;\n\n    @Suppress(\"DEPRECATION_ERROR\")\n    @Deprecated(\"Please use files instead.\", replaceWith = ReplaceWith(\"files.root\"), level = DeprecationLevel.ERROR)\n    @DeprecatedSinceMirai(warningSince = \"2.8\", errorSince = \"2.14\")\n    override val filesRoot: net.mamoe.mirai.utils.RemoteFile by lazy { RemoteFileImpl(this, \"/\") }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/contact/active/GroupActiveImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.active\n\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.mirai.contact.active.ActiveRecord\nimport net.mamoe.mirai.data.GroupInfo\nimport net.mamoe.mirai.internal.contact.GroupImpl\nimport net.mamoe.mirai.utils.JavaFriendlyAPI\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.stream\nimport java.util.stream.Stream\n\ninternal actual class GroupActiveImpl actual constructor(\n    group: GroupImpl,\n    logger: MiraiLogger,\n    groupInfo: GroupInfo,\n) : CommonGroupActiveImpl(group, logger, groupInfo) {\n\n    @JavaFriendlyAPI\n    override fun asStream(): Stream<ActiveRecord> {\n        return stream {\n            var page = 0\n            while (true) {\n                val result = runBlocking { getGroupActiveData(page = page) }\n                val most = result.info.mostAct ?: break\n\n                for (active in most) yield(active.toActiveRecord(group))\n\n                if (result.info.isEnd == 1) break\n                page++\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/contact/file/AbsoluteFolderImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.contact.file\n\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.mirai.contact.FileSupported\nimport net.mamoe.mirai.contact.file.AbsoluteFile\nimport net.mamoe.mirai.contact.file.AbsoluteFileFolder\nimport net.mamoe.mirai.contact.file.AbsoluteFolder\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Oidb0x6d8\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.FileManagement\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.toResult\nimport net.mamoe.mirai.internal.utils.FileSystem\nimport net.mamoe.mirai.utils.JavaFriendlyAPI\nimport java.util.stream.Stream\nimport kotlin.streams.asStream\n\ninternal actual class AbsoluteFolderImpl actual constructor(\n    contact: FileSupported, parent: AbsoluteFolder?, id: String, name: String,\n    uploadTime: Long, uploaderId: Long, lastModifiedTime: Long,\n    contentsCount: Int,\n) : CommonAbsoluteFolderImpl(contact, parent, id, name, uploadTime, uploaderId, lastModifiedTime, contentsCount) {\n\n    @JavaFriendlyAPI\n    override suspend fun foldersStream(): Stream<AbsoluteFolder> {\n        return getItemsSequence().filter { it.folderInfo != null }.map { it.resolve() as AbsoluteFolder }.asStream()\n    }\n\n    @JavaFriendlyAPI\n    override suspend fun filesStream(): Stream<AbsoluteFile> {\n        return getItemsSequence().filter { it.fileInfo != null }.map { it.resolve() as AbsoluteFile }.asStream()\n    }\n\n    @JavaFriendlyAPI\n    override suspend fun childrenStream(): Stream<AbsoluteFileFolder> {\n        return getItemsSequence().mapNotNull { it.resolve() }.asStream()\n    }\n\n    @JavaFriendlyAPI\n    private suspend fun getItemsSequence(): Sequence<Oidb0x6d8.GetFileListRspBody.Item> {\n        return sequence {\n            var index = 0\n            while (true) {\n                val list = runBlocking {\n                    bot.network.sendAndExpect(\n                        FileManagement.GetFileList(\n                            client,\n                            groupCode = contact.id,\n                            folderId = id,\n                            startIndex = index\n                        )\n                    )\n                }.toResult(\"AbsoluteFolderImpl.getFilesFlow\").getOrThrow()\n                index += list.itemList.size\n\n                if (list.int32RetCode != 0) return@sequence\n                if (list.itemList.isEmpty()) return@sequence\n\n                yieldAll(list.itemList)\n            }\n        }\n    }\n\n    @OptIn(JavaFriendlyAPI::class)\n    override suspend fun resolveFilesStream(path: String): Stream<AbsoluteFile> {\n        if (path.isBlank()) throw IllegalArgumentException(\"path cannot be blank.\")\n        if (!FileSystem.isLegal(path)) return Stream.empty()\n\n        if (path[0] == '/') {\n            return root.resolveFilesStream(path.substring(1))\n        }\n\n        if (!path.contains('/')) {\n            return getItemsSequence()\n                .filter { it.fileInfo?.fileName == path }\n                .map { it.resolve() as AbsoluteFile }\n                .asStream()\n        }\n\n        return resolveFolder(path.substringBefore('/'))?.resolveFilesStream(path.substringAfter('/')) ?: Stream.empty()\n    }\n\n    @JavaFriendlyAPI\n    override suspend fun resolveAllStream(path: String): Stream<AbsoluteFileFolder> {\n        if (path.isBlank()) throw IllegalArgumentException(\"path cannot be blank.\")\n        if (!FileSystem.isLegal(path)) return Stream.empty()\n        if (path[0] == '/') {\n            return root.resolveAllStream(path.substring(1))\n        }\n        if (!path.contains('/')) {\n            return getItemsSequence().mapNotNull { it.resolve() }.asStream()\n        }\n\n        return resolveFolder(path.substringBefore('/'))?.resolveAllStream(path.substringAfter('/')) ?: Stream.empty()\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/message/protocol/impl/TextProtocol.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message.protocol.impl\n\ninternal actual fun getEmojiPatternResourceOrNull(): String? {\n    return TextProtocol::class.java.classLoader?.getResourceAsStream(\"emoji-pattern.regex\")\n        ?.use { it.readBytes().decodeToString() }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/network/component/ComponentKey.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.component\n\nimport kotlin.reflect.KTypeProjection\nimport kotlin.reflect.full.allSupertypes\n\ninternal actual fun ComponentKey<*>.getComponentTypeArgument(): KTypeProjection? {\n    val thisType = this::class.allSupertypes.find { it.classifier == ComponentKey::class }\n    return thisType?.arguments?.firstOrNull()\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/network/handler/NetworkHandlerFactory.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler\n\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.State\nimport net.mamoe.mirai.internal.network.impl.netty.NettyNetworkHandlerFactory\nimport java.net.InetAddress\nimport java.net.InetSocketAddress\n\n/**\n * Factory for a specific [NetworkHandler] implementation.\n */\ninternal actual fun interface NetworkHandlerFactory<out H : NetworkHandler> {\n    actual fun create(context: NetworkHandlerContext, host: String, port: Int): H =\n        create(context, InetSocketAddress.createUnresolved(host, port))\n\n    fun create(context: NetworkHandlerContext, host: InetAddress, port: Int): H =\n        create(context, InetSocketAddress(host, port))\n\n    /**\n     * Create an instance of [H]. The returning [H] has [NetworkHandler.state] of [State.INITIALIZED]\n     */\n    actual fun create(context: NetworkHandlerContext, address: SocketAddress): H\n\n    actual companion object {\n        actual fun getPlatformDefault(): NetworkHandlerFactory<*> = NettyNetworkHandlerFactory\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/network/handler/SocketAddress.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler\n\nimport java.net.InetSocketAddress\n\n@Suppress(\"ACTUAL_WITHOUT_EXPECT\") // visibility\ninternal actual typealias SocketAddress = java.net.InetSocketAddress\n\n@Suppress(\"EXTENSION_SHADOWED_BY_MEMBER\")\ninternal actual fun SocketAddress.getHost(): String = hostString ?: error(\"Failed to get host from address '$this'.\")\n\n@Suppress(\"EXTENSION_SHADOWED_BY_MEMBER\")\ninternal actual fun SocketAddress.getPort(): Int = this.port\n\ninternal actual fun createSocketAddress(host: String, port: Int): SocketAddress {\n    return InetSocketAddress.createUnresolved(host, port)\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/network/handler/selector/SelectorRequireReconnectException.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.handler.selector\n\ninternal actual class SelectorRequireReconnectException(\n    withStackTrace: Boolean\n) : NetworkException(true) {\n    actual constructor() : this(false)\n\n    private companion object {\n        val EMPTY = arrayOf<StackTraceElement>()\n    }\n\n    override fun fillInStackTrace(): Throwable {\n        stackTrace = EMPTY\n        return this\n    }\n\n    init {\n        if (withStackTrace) super.fillInStackTrace()\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/network/impl/netty/NettyChannelException.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.impl.netty\n\nimport net.mamoe.mirai.internal.network.handler.selector.NetworkChannelException\n\ninternal data class NettyChannelException(\n    override val message: String? = null,\n    override val cause: Throwable? = null,\n) : NetworkChannelException()"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/network/impl/netty/NettyNetworkHandler.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.impl.netty\n\nimport io.netty.bootstrap.Bootstrap\nimport io.netty.buffer.ByteBuf\nimport io.netty.channel.*\nimport io.netty.channel.nio.NioEventLoopGroup\nimport io.netty.channel.socket.SocketChannel\nimport io.netty.channel.socket.nio.NioSocketChannel\nimport io.netty.handler.codec.LengthFieldBasedFrameDecoder\nimport io.netty.handler.codec.MessageToByteEncoder\nimport kotlinx.coroutines.CompletableDeferred\nimport kotlinx.coroutines.asCoroutineDispatcher\nimport kotlinx.coroutines.job\nimport net.mamoe.mirai.internal.network.handler.CommonNetworkHandler\nimport net.mamoe.mirai.internal.network.handler.NetworkHandler.State\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerContext\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.utils.cast\nimport net.mamoe.mirai.utils.debug\nimport java.net.SocketAddress\nimport io.netty.channel.Channel as NettyChannel\n\ninternal open class NettyNetworkHandler(\n    context: NetworkHandlerContext,\n    address: SocketAddress,\n) : CommonNetworkHandler<NettyChannel>(context, address.cast()) {\n    override fun toString(): String {\n        return \"NettyNetworkHandler(context=$context, address=$address)\"\n    }\n\n\n    ///////////////////////////////////////////////////////////////////////////\n    // exception handling\n    ///////////////////////////////////////////////////////////////////////////\n\n    protected open fun handlePipelineException(ctx: ChannelHandlerContext, error: Throwable) {\n        setState { StateClosed(NettyChannelException(cause = error, message = \"An unexpected exception was received from netty pipeline. (context=$context, address=$address)\")) }\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // netty conn.\n    ///////////////////////////////////////////////////////////////////////////\n\n    private inner class IncomingPacketDecoder(\n        private val decodePipeline: PacketDecodePipeline,\n    ) : SimpleChannelInboundHandler<ByteBuf>(ByteBuf::class.java) {\n        override fun channelRead0(ctx: ChannelHandlerContext, msg: ByteBuf) {\n            decodePipeline.send(msg.toReadPacket())\n        }\n    }\n\n    private inner class OutgoingPacketEncoder : MessageToByteEncoder<OutgoingPacket>(OutgoingPacket::class.java) {\n        override fun encode(ctx: ChannelHandlerContext, msg: OutgoingPacket, out: ByteBuf) {\n            out.writeBytes(msg.delegate)\n        }\n    }\n\n    protected open fun setupChannelPipeline(pipeline: ChannelPipeline, decodePipeline: PacketDecodePipeline) {\n        pipeline\n            .addLast(object : ChannelInboundHandlerAdapter() {\n                @Suppress(\"OVERRIDE_DEPRECATION\")\n                override fun exceptionCaught(ctx: ChannelHandlerContext, cause: Throwable) {\n                    handlePipelineException(ctx, cause)\n                }\n            })\n            .addLast(\"outgoing-packet-encoder\", OutgoingPacketEncoder())\n            .addLast(LengthFieldBasedFrameDecoder(Int.MAX_VALUE, 0, 4, -4, 4))\n            .addLast(IncomingPacketDecoder(decodePipeline))\n    }\n\n    protected open fun createDummyDecodePipeline() = PacketDecodePipeline(this@NettyNetworkHandler.coroutineContext)\n\n    // can be overridden for tests\n    override suspend fun createConnection(): NettyChannel {\n        packetLogger.debug { \"Connecting to $address\" }\n\n        val contextResult = CompletableDeferred<NettyChannel>()\n        val eventLoopGroup = NioEventLoopGroup()\n        val decodePipeline = PacketDecodePipeline(\n            this@NettyNetworkHandler.coroutineContext\n                .plus(eventLoopGroup.asCoroutineDispatcher())\n        )\n\n        val future = Bootstrap().group(eventLoopGroup)\n            .channel(NioSocketChannel::class.java)\n            .option(ChannelOption.SO_KEEPALIVE, true)\n            .handler(object : ChannelInitializer<SocketChannel>() {\n                override fun initChannel(ch: SocketChannel) {\n                    setupChannelPipeline(ch.pipeline(), decodePipeline)\n                    ch.pipeline()\n                        .addLast(object : ChannelInboundHandlerAdapter() {\n                            override fun channelInactive(ctx: ChannelHandlerContext?) {\n                                eventLoopGroup.shutdownGracefully()\n                                contextResult.cancel()\n                            }\n                        })\n\n                }\n            })\n            .connect(address)\n            .runCatching {\n                awaitKt()\n            }.onFailure {\n                eventLoopGroup.shutdownGracefully()\n                contextResult.cancel()\n            }.getOrElse { error ->\n                throw NettyChannelException(cause = error, message = \"Failed to connect $address\")\n            }\n\n        contextResult.complete(future.channel())\n\n        coroutineContext.job.invokeOnCompletion {\n            future.channel().close()\n            eventLoopGroup.shutdownGracefully()\n        }\n\n        future.channel().closeFuture().addListener {\n            if (_state.correspondingState == State.CLOSED) return@addListener\n            close(NettyChannelException(cause = it.cause()))\n        }\n\n        return contextResult.await()\n    }\n\n    @Suppress(\"EXTENSION_SHADOWED_BY_MEMBER\")\n    override fun io.netty.channel.Channel.close() {\n        this.close()\n    }\n\n    override fun NettyChannel.writeAndFlushOrCloseAsync(packet: OutgoingPacket) {\n        writeAndFlush(packet)\n            .addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE)\n            .addListener(ChannelFutureListener.CLOSE_ON_FAILURE)\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/network/impl/netty/NettyNetworkHandlerFactory.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.impl.netty\n\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerContext\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerFactory\nimport net.mamoe.mirai.internal.network.handler.SocketAddress\n\ninternal object NettyNetworkHandlerFactory : NetworkHandlerFactory<NettyNetworkHandler> {\n    override fun create(context: NetworkHandlerContext, address: SocketAddress): NettyNetworkHandler {\n        return NettyNetworkHandler(context, address)\n    }\n\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/network/impl/netty/nettyUtils.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.impl.netty\n\nimport io.ktor.utils.io.core.*\nimport io.ktor.utils.io.streams.*\nimport io.netty.buffer.ByteBuf\nimport io.netty.buffer.ByteBufInputStream\nimport io.netty.channel.ChannelFuture\nimport kotlinx.coroutines.suspendCancellableCoroutine\nimport net.mamoe.mirai.utils.withUse\n\n\ninternal suspend fun ChannelFuture.awaitKt(): ChannelFuture {\n    suspendCancellableCoroutine<Unit> { cont ->\n        cont.invokeOnCancellation {\n            channel().close()\n        }\n        addListener { f ->\n            if (f.isSuccess) {\n                cont.resumeWith(Result.success(Unit))\n            } else {\n                cont.resumeWith(Result.failure(f.cause()))\n            }\n        }\n    }\n    return this\n}\n\ninternal fun ByteBuf.toReadPacket(): ByteReadPacket {\n    val buf = this\n    return buildPacket {\n        ByteBufInputStream(buf).withUse { copyTo(outputStream()) }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/network/impl/package.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.impl"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/network/package.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/network/protocol/data/richstatus/RichStatus.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.protocol.data.richstatus\n\nimport net.mamoe.mirai.utils.pos\nimport net.mamoe.mirai.utils.toIntUnsigned\nimport java.nio.ByteBuffer\nimport java.nio.ByteOrder\n\n@Suppress(\"UsePropertyAccessSyntax\")\ninternal actual fun parseRichStatusImpl(rawData: ByteArray?) : RichStatus {\n    val rsp = RichStatus()\n\n    if (rawData == null || rawData.size <= 2) return rsp\n\n    val byteBuffer = ByteBuffer.wrap(rawData).order(ByteOrder.BIG_ENDIAN)\n\n    var lastPosition = 0\n    var lastStringData: String? = null\n\n    while (byteBuffer.remaining() >= 2) {\n        val dataType = byteBuffer.get().toIntUnsigned()\n        val dataLength = byteBuffer.get().toIntUnsigned()\n\n        if (byteBuffer.remaining() < dataLength) break\n\n        val dataStartPosition = lastPosition + 2\n\n        // Origin: dataType > 0 && dataType < 128\n        if (dataType in 1..127) {\n            val dataContent = String(rawData, dataStartPosition, dataLength)\n            lastPosition = dataStartPosition + dataLength\n            byteBuffer.pos = lastPosition\n\n            when (dataType) {\n                1 -> rsp.actionText = dataContent\n                2 -> rsp.dataText = dataContent\n                4 -> {\n                    if (lastStringData != null) {\n                        rsp.addPlainText(lastStringData)\n                        lastStringData = null\n                    }\n                    if (rsp.plainText != null) {\n                        rsp.locationPosition = rsp.plainText!!.size\n                    } else {\n                        rsp.locationPosition = 0\n                    }\n                    rsp.locationText = dataContent\n                }\n                else -> {\n                    if (lastStringData == null) {\n                        lastStringData = dataContent\n                    } else {\n                        lastStringData += dataContent\n                    }\n                }\n            }\n        } else {\n            run theSwitch@{\n                when (dataType) {\n                    129 -> {\n                        if (byteBuffer.remaining() >= 8) {\n                            rsp.actionId = byteBuffer.getInt()\n                            rsp.dataId = byteBuffer.getInt()\n                        }\n                    }\n                    130 -> {\n                        if (byteBuffer.remaining() >= 8) {\n                            rsp.lontitude = byteBuffer.getInt()\n                            rsp.latitude = byteBuffer.getInt()\n                        }\n                    }\n                    144 -> rsp.feedsId = String(rawData, dataStartPosition, dataLength)\n                    145 -> rsp.tplId = byteBuffer.getInt()\n                    146 -> rsp.tplType = byteBuffer.getInt()\n                    147 -> rsp.actId = byteBuffer.getInt()\n                    148 -> {\n                        if (byteBuffer.remaining() >= 4) {\n                            lastPosition = byteBuffer.getInt()\n                            /*\n                            if (var1 > 4) {\n                                var19 = String(var0, var5+4, var1-4)\n                                if (var19.isNotEmpty()) {\n                                    var9.topics.add(Pair(var2, var19))\n                                }\n                            }\n                            */\n                        }\n                    }\n                    149 -> {\n                        if (byteBuffer.remaining() >= 5) {\n                            lastPosition = dataLength\n                            while (true) {\n                                if (lastPosition < 5) return@theSwitch\n\n                                byteBuffer.getInt()\n                                byteBuffer.get().toIntUnsigned()\n\n                                // var9.topicsPos.add(new Pair(var6, var3));\n                                lastPosition -= 5\n                            }\n                        }\n                    }\n                    161 -> {\n                        /*\n                        val var11 = ByteArray(dataLength)\n                        byteBuffer.get(var11)\n                         */\n                        byteBuffer.pos += dataLength\n                        // Parse richstatus_sticker$RichStatus_Sticker\n                    }\n                    162 -> {\n                        rsp.fontId = byteBuffer.getInt()\n                    }\n                    163 -> {\n                        rsp.fontType = byteBuffer.getInt()\n                    }\n\n                }\n            }\n            lastPosition = dataStartPosition + dataLength\n            byteBuffer.pos = lastPosition\n        }\n    }\n\n    if (lastStringData != null) {\n        rsp.addPlainText(lastStringData)\n    }\n\n    return rsp\n\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/package.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/utils/BotConfigurationExt.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport net.mamoe.mirai.utils.BotConfiguration\n\ninternal actual val BotConfiguration.workingDirPath: String\n    get() = workingDir.absolutePath\n\ninternal actual val BotConfiguration.cacheDirPath: String\n    get() = cacheDir.path"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/utils/ExternalResourceImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport io.ktor.utils.io.core.*\nimport io.ktor.utils.io.streams.*\nimport kotlinx.coroutines.CompletableDeferred\nimport kotlinx.coroutines.Deferred\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.md5\nimport net.mamoe.mirai.utils.sha1\nimport java.io.InputStream\nimport java.io.SequenceInputStream\nimport java.util.Collections\n\n@Suppress(\"FunctionName\")\ninternal actual fun CombinedExternalResource(vararg resources: ExternalResource): ExternalResource {\n    return CombinedExternalResource(resources.toList())\n}\n\n/**\n * it is caller's responsibility to guarantee the immutability of the stream.\n */\ninternal class CombinedExternalResource(\n    private val inputs: Collection<ExternalResource>\n) : ExternalResource {\n    override val isAutoClose: Boolean = true\n\n    override val size: Long = inputs.sumOf { it.size }\n    override val md5: ByteArray by lazy { combine().md5() }\n    override val sha1: ByteArray by lazy { combine().sha1() }\n\n    override val formatName: String = \"\"\n\n    private val _closed = CompletableDeferred<Unit>()\n    override val closed: Deferred<Unit>\n        get() = _closed\n\n    override fun close() {\n        _closed.complete(Unit)\n    }\n\n    override fun inputStream(): InputStream = combine()\n\n    @MiraiInternalApi\n    override fun input(): Input = inputStream().asInput()\n\n    private fun combine(): InputStream {\n        return SequenceInputStream(Collections.enumeration(inputs.map { it.inputStream() }))\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/utils/PlatformSocket.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport io.ktor.utils.io.core.*\nimport io.ktor.utils.io.streams.*\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.runInterruptible\nimport kotlinx.coroutines.suspendCancellableCoroutine\nimport net.mamoe.mirai.internal.network.highway.HighwayProtocolChannel\nimport java.io.BufferedInputStream\nimport java.io.BufferedOutputStream\nimport java.io.IOException\nimport java.net.Socket\nimport java.util.concurrent.Executors\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\n\ninternal actual class PlatformSocket : Closeable, HighwayProtocolChannel {\n    private lateinit var socket: Socket\n\n    actual val isOpen: Boolean\n        get() =\n            if (::socket.isInitialized)\n                socket.isConnected\n            else false\n\n    actual override fun close() {\n        if (::socket.isInitialized) {\n            socket.close()\n        }\n        thread.shutdownNow()\n        kotlin.runCatching { writeChannel.close() }\n        kotlin.runCatching { readChannel.close() }\n    }\n\n    @PublishedApi\n    internal lateinit var writeChannel: BufferedOutputStream\n\n    @PublishedApi\n    internal lateinit var readChannel: BufferedInputStream\n\n    actual suspend fun send(packet: ByteArray, offset: Int, length: Int) {\n        runInterruptible(Dispatchers.IO) {\n            writeChannel.write(packet, offset, length)\n            writeChannel.flush()\n        }\n    }\n\n    /**\n     * @throws SendPacketInternalException\n     */\n    actual override suspend fun send(packet: ByteReadPacket) {\n        runInterruptible(Dispatchers.IO) {\n            try {\n                writeChannel.writePacket(packet)\n                writeChannel.flush()\n            } catch (e: IOException) {\n                throw SendPacketInternalException(e)\n            }\n        }\n    }\n\n    private val thread = Executors.newSingleThreadExecutor()\n\n    /**\n     * @throws ReadPacketInternalException\n     */\n    actual override suspend fun read(): ByteReadPacket = suspendCancellableCoroutine { cont ->\n        val task = thread.submit {\n            kotlin.runCatching {\n                readChannel.readPacketAtMost(Long.MAX_VALUE)\n            }.let {\n                cont.resumeWith(it)\n            }\n        }\n        cont.invokeOnCancellation {\n            kotlin.runCatching { task.cancel(true) }\n        }\n    }\n\n    suspend fun connect(serverHost: String, serverPort: Int) {\n        runInterruptible(Dispatchers.IO) {\n            socket = Socket(serverHost, serverPort)\n            readChannel = socket.getInputStream().buffered()\n            writeChannel = socket.getOutputStream().buffered()\n        }\n    }\n\n    actual companion object {\n        actual suspend fun connect(\n            serverIp: String,\n            serverPort: Int,\n        ): PlatformSocket {\n            val socket = PlatformSocket()\n            socket.connect(serverIp, serverPort)\n            return socket\n        }\n\n        actual suspend inline fun <R> withConnection(\n            serverIp: String,\n            serverPort: Int,\n            block: PlatformSocket.() -> R,\n        ): R {\n            contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }\n            return connect(serverIp, serverPort).use(block)\n        }\n    }\n}\n\n\n@Suppress(\"ACTUAL_WITHOUT_EXPECT\")\ninternal actual typealias SocketException = java.net.SocketException\n@Suppress(\"ACTUAL_WITHOUT_EXPECT\")\ninternal actual typealias NoRouteToHostException = java.net.NoRouteToHostException\n@Suppress(\"ACTUAL_WITHOUT_EXPECT\")\ninternal actual typealias UnknownHostException = java.net.UnknownHostException\n"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/utils/RemoteFileImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"DEPRECATION\", \"DEPRECATION_ERROR\")\n\npackage net.mamoe.mirai.internal.utils\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.isOperator\nimport net.mamoe.mirai.internal.asQQAndroidBot\nimport net.mamoe.mirai.internal.contact.groupCode\nimport net.mamoe.mirai.internal.message.data.FileMessageImpl\nimport net.mamoe.mirai.internal.message.flags.AllowSendFileMessage\nimport net.mamoe.mirai.internal.network.highway.Highway\nimport net.mamoe.mirai.internal.network.highway.ResourceKind\nimport net.mamoe.mirai.internal.network.protocol\nimport net.mamoe.mirai.internal.network.protocol.data.proto.*\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.FileManagement\nimport net.mamoe.mirai.internal.network.protocol.packet.chat.toResult\nimport net.mamoe.mirai.internal.utils.io.serialization.toByteArray\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.FileMessage\nimport net.mamoe.mirai.utils.*\nimport net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource\nimport net.mamoe.mirai.utils.RemoteFile.Companion.ROOT_PATH\nimport java.io.File\nimport kotlin.contracts.contract\nimport kotlin.text.toByteArray\n\nprivate val fs = FileSystem\n\ninternal class RemoteFileInfo(\n    val id: String, // fileId or folderId\n    val isFile: Boolean,\n    val path: String,\n    val name: String,\n    val parentFolderId: String,\n    val size: Long,\n    val busId: Int, // for file only\n    val creatorId: Long, //ownerUin, createUin\n    val createTime: Long, // uploadTime, createTime\n    val modifyTime: Long,\n    val downloadTimes: Int,\n    val sha: ByteArray, // for file only\n    val md5: ByteArray, // for file only\n) {\n    companion object {\n        val root = RemoteFileInfo(\n            \"/\", false, \"/\", \"/\", \"\", 0, 0, 0, 0, 0, 0, EMPTY_BYTE_ARRAY, EMPTY_BYTE_ARRAY\n        )\n    }\n}\n\ninternal fun RemoteFile.checkIsImpl(): CommonRemoteFileImpl {\n    contract { returns() implies (this@checkIsImpl is RemoteFileImpl) }\n    return this as? RemoteFileImpl ?: error(\"RemoteFile must not be implemented manually.\")\n}\n\ninternal expect class RemoteFileImpl(\n    contact: Group,\n    path: String, // absolute\n) : CommonRemoteFileImpl {\n    constructor(contact: Group, parent: String, name: String)\n}\n\ninternal abstract class CommonRemoteFileImpl(\n    override val contact: Group,\n    override val path: String, // absolute\n) : RemoteFile {\n\n    override var id: String? = null\n\n    override val name: String\n        get() = path.substringAfterLast('/')\n\n    private val bot get() = contact.bot.asQQAndroidBot()\n    private val client get() = bot.client\n\n    override val parent: CommonRemoteFileImpl?\n        get() {\n            if (path == ROOT_PATH) return null\n            val s = path.substringBeforeLast('/')\n            return RemoteFileImpl(contact, s.ifEmpty { ROOT_PATH })\n        }\n\n    /**\n     * Prefer id matching.\n     */\n    private suspend fun Flow<Oidb0x6d8.GetFileListRspBody.Item>.findMatching(): Oidb0x6d8.GetFileListRspBody.Item? {\n        var nameMatching: Oidb0x6d8.GetFileListRspBody.Item? = null\n\n        val idMatching = firstOrNull {\n            if (it.name == this@CommonRemoteFileImpl.name) {\n                nameMatching = it\n            }\n            it.id == this@CommonRemoteFileImpl.id\n        }\n\n        return idMatching ?: nameMatching\n    }\n\n    private suspend fun getFileFolderInfo(): RemoteFileInfo? {\n        val parent = parent ?: return RemoteFileInfo.root\n        val info = parent.getFilesFlow()\n            .filter { it.name == this.name }\n            .findMatching()\n            ?: return null\n        return when {\n            info.folderInfo != null -> info.folderInfo.run {\n                RemoteFileInfo(\n                    id = folderId,\n                    isFile = false,\n                    path = path,\n                    name = folderName,\n                    parentFolderId = parentFolderId,\n                    size = 0,\n                    busId = 0,\n                    creatorId = createUin,\n                    createTime = createTime.toLongUnsigned(),\n                    modifyTime = modifyTime.toLongUnsigned(),\n                    downloadTimes = 0,\n                    sha = EMPTY_BYTE_ARRAY,\n                    md5 = EMPTY_BYTE_ARRAY,\n                )\n            }\n            info.fileInfo != null -> info.fileInfo.run {\n                RemoteFileInfo(\n                    id = fileId,\n                    isFile = true,\n                    path = path,\n                    name = fileName,\n                    parentFolderId = parentFolderId,\n                    size = fileSize,\n                    busId = busId,\n                    creatorId = uploaderUin,\n                    createTime = uploadTime.toLongUnsigned(),\n                    modifyTime = modifyTime.toLongUnsigned(),\n                    downloadTimes = downloadTimes,\n                    sha = sha,\n                    md5 = md5,\n                )\n            }\n            else -> null\n        }\n    }\n\n    private fun RemoteFileInfo?.checkExists(thisPath: String, kind: String = \"Remote path\"): RemoteFileInfo {\n        if (this == null) throw IllegalStateException(\"$kind '$thisPath' does not exist.\")\n        return this\n    }\n\n    override suspend fun isFile(): Boolean = this.getFileFolderInfo().checkExists(this.path).isFile\n\n    // compiler bug\n    override suspend fun isDirectory(): Boolean = !isFile()\n    override suspend fun length(): Long = this.getFileFolderInfo().checkExists(this.path).size\n    override suspend fun exists(): Boolean = this.getFileFolderInfo() != null\n    override suspend fun getInfo(): RemoteFile.FileInfo? {\n        return getFileFolderInfo()?.run {\n            RemoteFile.FileInfo(\n                name = name,\n                id = id,\n                path = path,\n                length = size,\n                downloadTimes = downloadTimes,\n                uploaderId = creatorId,\n                uploadTime = createTime,\n                lastModifyTime = modifyTime,\n                sha1 = sha,\n                md5 = md5,\n            )\n        }\n    }\n\n    private suspend fun getFilesFlow(): Flow<Oidb0x6d8.GetFileListRspBody.Item> {\n        val info = getFileFolderInfo() ?: return emptyFlow()\n\n        return flow {\n            var index = 0\n            while (true) {\n                val list = bot.network.sendAndExpect(\n                    FileManagement.GetFileList(\n                        client,\n                        groupCode = contact.id,\n                        folderId = info.id,\n                        startIndex = index\n                    )\n                ).toResult(\"RemoteFile.listFiles\").getOrThrow()\n                index += list.itemList.size\n\n                if (list.int32RetCode != 0) return@flow\n                if (list.itemList.isEmpty()) return@flow\n\n                emitAll(list.itemList.asFlow())\n            }\n        }\n    }\n\n    private fun Oidb0x6d8.GetFileListRspBody.Item.resolveToFile(): RemoteFile? {\n        val item = this\n        return when {\n            item.fileInfo != null -> {\n                resolve(item.fileInfo.fileName)\n            }\n            item.folderInfo != null -> {\n                resolve(item.folderInfo.folderName)\n            }\n            else -> null\n        }?.also {\n            it.id = item.id\n        }\n    }\n\n    override suspend fun listFiles(): Flow<RemoteFile> {\n        return getFilesFlow().mapNotNull { item ->\n            item.resolveToFile()\n        }\n    }\n\n    // compiler bug\n    override suspend fun listFilesCollection(): List<RemoteFile> = listFiles().toList()\n\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n    @OptIn(JavaFriendlyAPI::class)\n    override suspend fun listFilesIterator(lazy: Boolean): Iterator<RemoteFile> {\n        if (!lazy) return listFiles().toList().iterator()\n\n        return object : Iterator<RemoteFile> {\n            private val queue = ArrayDeque<Oidb0x6d8.GetFileListRspBody.Item>(1)\n\n            @Volatile\n            private var index = 0\n            private var ended = false\n\n            private suspend fun updateItems() {\n                val list = bot.network.sendAndExpect(\n                    FileManagement.GetFileList(\n                        client,\n                        groupCode = contact.id,\n                        folderId = path,\n                        startIndex = index\n                    )\n                ).toResult(\"RemoteFile.listFiles\").getOrThrow()\n                if (list.int32RetCode != 0 || list.itemList.isEmpty()) {\n                    ended = true\n                    return\n                }\n                index += list.itemList.size\n                for (item in list.itemList) {\n                    if (item.fileInfo != null || item.folderInfo != null) queue.add(item)\n                }\n            }\n\n            override fun hasNext(): Boolean {\n                if (queue.isEmpty() && !ended) runBlocking { updateItems() }\n                return queue.isNotEmpty()\n            }\n\n            override fun next(): RemoteFile {\n                return queue.removeFirst().resolveToFile()!!\n            }\n        }\n    }\n\n    override fun resolve(relative: String) = RemoteFileImpl(contact, this.path, relative)\n    override fun resolve(relative: RemoteFile): RemoteFileImpl {\n        if (relative.checkIsImpl().contact !== this.contact) error(\"`relative` must be obtained from the same Group as `this`.\")\n\n        return resolve(relative.path).also { it.id = relative.id }\n    }\n\n    override suspend fun resolveById(id: String, deep: Boolean): RemoteFile? {\n        if (this.id == id) return this\n        val dirs = mutableListOf<Oidb0x6d8.GetFileListRspBody.Item>()\n        getFilesFlow().mapNotNull { item ->\n            when {\n                item.id == id -> item.resolveToFile()\n                deep && item.folderInfo != null -> {\n                    dirs.add(item)\n                    null\n                }\n                else -> null\n            }\n        }.firstOrNull()?.let { return it }\n        for (dir in dirs) {\n            dir.resolveToFile()?.resolveById(id, deep)?.let { return it }\n        }\n        return null\n    }\n\n    // compiler bug\n    override suspend fun resolveById(id: String): RemoteFile? = resolveById(id, deep = true)\n\n    override fun resolveSibling(relative: String): RemoteFileImpl {\n        val parent = this.parent\n        if (parent == null) {\n            if (fs.normalize(relative) == ROOT_PATH) error(\"Root path does not have sibling paths.\")\n            return RemoteFileImpl(contact, ROOT_PATH)\n        }\n        return RemoteFileImpl(contact, parent.path, relative)\n    }\n\n    override fun resolveSibling(relative: RemoteFile): RemoteFileImpl {\n        if (relative.checkIsImpl().contact !== this.contact) error(\"`relative` must be obtained from the same Group as `this`.\")\n\n        return resolveSibling(relative.path).also { it.id = relative.id }\n    }\n\n    private fun RemoteFileInfo.isOperable(): Boolean =\n        creatorId == bot.id || contact.botPermission.isOperator()\n\n    private fun isBotOperator(): Boolean = contact.botPermission.isOperator()\n\n    override suspend fun delete(): Boolean {\n        val info = getFileFolderInfo() ?: return false\n        if (!info.isOperable()) return false\n        return when {\n            info.isFile -> {\n                bot.network.sendAndExpect(\n                    FileManagement.DeleteFile(\n                        client,\n                        groupCode = contact.id,\n                        busId = info.busId,\n                        fileId = info.id,\n                        parentFolderId = info.parentFolderId,\n                    )\n                ).toResult(\"RemoteFile.delete\", checkResp = false).getOrThrow().int32RetCode == 0\n            }\n            //            recursively -> {\n            //                this.listFiles().collect { child ->\n            //                    child.delete()\n            //                }\n            //                this.delete()\n            //            }\n            else -> {\n                // natively 'recursive'\n                bot.network.sendAndExpect(\n                    FileManagement.DeleteFolder(\n                        client, contact.id, info.id\n                    )\n                ).toResult(\"RemoteFile.delete\").getOrThrow().int32RetCode == 0\n            }\n        }\n    }\n\n    override suspend fun renameTo(name: String): Boolean {\n        if (path == ROOT_PATH && name != ROOT_PATH) return false\n\n        val normalized = fs.normalize(name)\n        if (normalized.contains('/')) throw IllegalArgumentException(\"'/' is not allowed in file or directory names. Given: '$name'.\")\n\n        val info = getFileFolderInfo() ?: return false\n        if (!info.isOperable()) return false\n        return bot.network.sendAndExpect(\n            if (info.isFile) {\n                FileManagement.RenameFile(client, contact.id, info.busId, info.id, info.parentFolderId, normalized)\n            } else {\n                FileManagement.RenameFolder(client, contact.id, info.id, normalized)\n            }\n        ).toResult(\"RemoteFile.renameTo\", checkResp = false).getOrThrow().int32RetCode == 0\n    }\n\n    /**\n     * null means not exist\n     */\n    private suspend fun getIdSmart(): String? {\n        if (path == ROOT_PATH) return ROOT_PATH\n        return this.id ?: this.getFileFolderInfo()?.id\n    }\n\n    override suspend fun moveTo(target: RemoteFile): Boolean {\n        if (target.checkIsImpl().contact != this.contact) {\n            // TODO: 2021/3/4 cross-group file move\n\n            //                target.mkdir()\n            //                val targetFolderId = target.getIdSmart() ?: return false\n            //                this.listFiles().mapNotNull { it.checkIsImpl().getFileFolderInfo() }.collect {\n            //                    FileManagement.MoveFile(client, contact.id, it.busId, it.id, it.parentFolderId, targetFolderId)\n            //                        .sendAndExpect(bot).toResult(\"RemoteFile.moveTo\", checkResp = false).getOrThrow()\n            //\n            //                    // TODO: 2021/3/3 batch packets\n            //                }\n            //                this.delete() // it is now empty\n\n            error(\"Cross-group file operation is not yet supported.\")\n        }\n        if (target.path == this.path) return true\n        if (target.parent?.path == this.path) return false\n        val info = getFileFolderInfo() ?: return false\n        if (!info.isOperable()) return false\n        return if (info.isFile) {\n            val newParentId = target.parent?.checkIsImpl()?.getIdSmart() ?: return false\n            bot.network.sendAndExpect(\n                FileManagement.MoveFile(\n                    client,\n                    contact.id,\n                    info.busId,\n                    info.id,\n                    info.parentFolderId,\n                    newParentId\n                )\n            ).toResult(\"RemoteFile.moveTo\", checkResp = false).getOrThrow().int32RetCode == 0\n        } else {\n            return bot.network.sendAndExpect(FileManagement.RenameFolder(client, contact.id, info.id, target.name))\n                .toResult(\"RemoteFile.moveTo\", checkResp = false).getOrThrow().int32RetCode == 0\n        }\n    }\n\n\n    override suspend fun mkdir(): Boolean {\n        if (path == ROOT_PATH) return false\n        if (!isBotOperator()) return false\n\n        val parentFolderId: String = parent?.getIdSmart() ?: return false\n\n        return bot.network.sendAndExpect(FileManagement.CreateFolder(client, contact.id, parentFolderId, this.name))\n            .toResult(\"RemoteFile.mkdir\", checkResp = false).getOrThrow().int32RetCode == 0\n    }\n\n    private suspend fun upload0(\n        resource: ExternalResource,\n        callback: RemoteFile.ProgressionCallback?,\n    ): Oidb0x6d6.UploadFileRspBody? = resource.withAutoClose {\n        val parent = parent ?: return null\n        val parentInfo = parent.getFileFolderInfo() ?: return null\n        val resp = bot.network.sendAndExpect(\n            FileManagement.RequestUpload(\n                client,\n                groupCode = contact.id,\n                folderId = parentInfo.id,\n                resource = resource,\n                filename = this.name\n            )\n        ).toResult(\"RemoteFile.upload\").getOrThrow()\n        if (resp.boolFileExist) {\n            return resp\n        }\n\n        val ext = GroupFileUploadExt(\n            u1 = 100,\n            u2 = 1,\n            entry = GroupFileUploadEntry(\n                business = ExcitingBusiInfo(\n                    busId = resp.busId,\n                    senderUin = bot.id,\n                    receiverUin = contact.groupCode, // TODO: 2021/3/1 code or uin?\n                    groupCode = contact.groupCode,\n                ),\n                fileEntry = ExcitingFileEntry(\n                    fileSize = resource.size,\n                    md5 = resource.md5,\n                    sha1 = resource.sha1,\n                    fileId = resp.fileId.toByteArray(),\n                    uploadKey = resp.checkKey,\n                ),\n                clientInfo = ExcitingClientInfo(\n                    clientType = 2,\n                    appId = client.protocol.id.toString(),\n                    terminalType = 2,\n                    clientVer = \"9e9c09dc\",\n                    unknown = 4,\n                ),\n                fileNameInfo = ExcitingFileNameInfo(this.name),\n                host = ExcitingHostConfig(\n                    hosts = listOf(\n                        ExcitingHostInfo(\n                            url = ExcitingUrlInfo(\n                                unknown = 1,\n                                host = resp.uploadIpLanV4.firstOrNull()\n                                    ?: resp.uploadIpLanV6.firstOrNull()\n                                    ?: resp.uploadIp,\n                            ),\n                            port = resp.uploadPort,\n                        ),\n                    ),\n                ),\n            ),\n            u3 = 0,\n        ).toByteArray(GroupFileUploadExt.serializer())\n\n        callback?.onBegin(this, resource)\n\n        kotlin.runCatching {\n            Highway.uploadResourceBdh(\n                bot = bot,\n                resource = resource,\n                kind = ResourceKind.GROUP_FILE,\n                commandId = 71,\n                extendInfo = ext,\n                dataFlag = 0,\n                callback = if (callback == null) null else fun(it: Long) {\n                    callback.onProgression(this, resource, it)\n                }\n            )\n        }.fold(\n            onSuccess = {\n                callback?.onSuccess(this, resource)\n            },\n            onFailure = {\n                callback?.onFailure(this, resource, it)\n            }\n        )\n\n        return resp\n    }\n\n    private suspend fun uploadInternal(\n        resource: ExternalResource,\n        callback: RemoteFile.ProgressionCallback?,\n    ): FileMessage {\n        val resp = upload0(resource, callback) ?: error(\"Failed to upload file.\")\n        return FileMessageImpl(\n            resp.fileId, resp.busId, name, resource.size, allowSend = true\n        )\n    }\n\n    @Deprecated(\n        \"Use uploadAndSend instead.\",\n        replaceWith = ReplaceWith(\"this.uploadAndSend(resource, callback)\"),\n        level = DeprecationLevel.ERROR\n    )\n    override suspend fun upload(\n        resource: ExternalResource,\n        callback: RemoteFile.ProgressionCallback?,\n    ): FileMessage {\n        val msg = uploadInternal(resource, callback)\n        contact.sendMessage(msg + AllowSendFileMessage)\n        return msg\n    }\n\n    // compiler bug\n    @Deprecated(\n        \"Use uploadAndSend instead.\",\n        replaceWith = ReplaceWith(\"this.uploadAndSend(resource)\"),\n        level = DeprecationLevel.ERROR\n    )\n    @Suppress(\"DEPRECATION_ERROR\")\n    override suspend fun upload(resource: ExternalResource): FileMessage {\n        return upload(resource, null)\n    }\n\n    override suspend fun uploadAndSend(resource: ExternalResource): MessageReceipt<Contact> {\n        @Suppress(\"DEPRECATION\")\n        return contact.sendMessage(AllowSendFileMessage + uploadInternal(resource, null))\n    }\n\n    override suspend fun getDownloadInfo(): RemoteFile.DownloadInfo? {\n        val info = getFileFolderInfo() ?: return null\n        if (!info.isFile) return null\n        val resp = bot.network.sendAndExpect(\n            FileManagement.RequestDownload(\n                client,\n                groupCode = contact.id,\n                busId = info.busId,\n                fileId = info.id\n            )\n        ).toResult(\"RemoteFile.getDownloadInfo\").getOrThrow()\n\n        return RemoteFile.DownloadInfo(\n            filename = name,\n            id = info.id,\n            path = path,\n            url = \"http://${resp.downloadIp}/ftn_handler/${resp.downloadUrl.toUHexString(\"\")}/?fname=\" +\n                    info.id.toByteArray().toUHexString(\"\"),\n            sha1 = info.sha,\n            md5 = info.md5\n        )\n    }\n\n    override fun toString(): String = path\n\n    override suspend fun toMessage(): FileMessage? {\n        val info = getFileFolderInfo() ?: return null\n        if (!info.isFile) return null\n        return FileMessageImpl(info.id, info.busId, name, info.size)\n    }\n}\n\ninternal actual class RemoteFileImpl actual constructor(\n    contact: Group,\n    path: String\n) : CommonRemoteFileImpl(contact, path), RemoteFile {\n    actual constructor(contact: Group, parent: String, name: String) : this(contact, FileSystem.normalize(parent, name))\n\n    // compiler bug\n    @Deprecated(\n        \"Use uploadAndSend instead.\",\n        replaceWith = ReplaceWith(\"this.uploadAndSend(file, callback)\"),\n        level = DeprecationLevel.ERROR\n    )\n    @Suppress(\"DEPRECATION_ERROR\")\n    override suspend fun upload(file: File, callback: RemoteFile.ProgressionCallback?): FileMessage =\n        file.toExternalResource().use { upload(it, callback) }\n\n    //compiler bug\n    @Deprecated(\n        \"Use sendFile instead.\",\n        replaceWith = ReplaceWith(\"this.uploadAndSend(file)\"),\n        level = DeprecationLevel.ERROR\n    )\n    @Suppress(\"DEPRECATION_ERROR\")\n    override suspend fun upload(file: File): FileMessage {\n        // Dear compiler:\n        //\n        // Please generate invokeinterface.\n        //\n        // Yours Sincerely\n        // Him188\n        return file.toExternalResource().use { upload(it) }\n    }\n\n    // compiler bug\n    override suspend fun uploadAndSend(file: File): MessageReceipt<Contact> =\n        file.toExternalResource().use { uploadAndSend(it) }\n\n    //    override suspend fun writeSession(resource: ExternalResource): FileUploadSession {\n    //    }\n\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/utils/crypto/AES.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils.crypto\n\nimport javax.crypto.Cipher\nimport javax.crypto.spec.IvParameterSpec\nimport javax.crypto.spec.SecretKeySpec\n\ninternal actual fun aesEncrypt(input: ByteArray, iv: ByteArray, key: ByteArray): ByteArray {\n    return doAES(input, iv, key, Cipher.ENCRYPT_MODE)\n}\n\ninternal actual fun aesDecrypt(input: ByteArray, iv: ByteArray, key: ByteArray): ByteArray {\n    return doAES(input, iv, key, Cipher.DECRYPT_MODE)\n}\n\nprivate fun doAES(input: ByteArray, iv: ByteArray, key: ByteArray, opMode: Int): ByteArray {\n    val keySpec = SecretKeySpec(key, \"AES\")\n\n    val cipher = Cipher.getInstance(\"AES/CBC/PKCS5Padding\")\n    cipher.init(opMode, keySpec, IvParameterSpec(iv))\n\n    return cipher.doFinal(input)\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/utils/crypto/JceEcdh.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils.crypto\n\nimport java.math.BigInteger\nimport java.security.AlgorithmParameters\nimport java.security.KeyFactory\nimport java.security.KeyPairGenerator\nimport java.security.interfaces.ECPrivateKey\nimport java.security.interfaces.ECPublicKey\nimport java.security.spec.ECGenParameterSpec\nimport java.security.spec.ECParameterSpec\nimport java.security.spec.ECPoint\nimport java.security.spec.ECPublicKeySpec\nimport javax.crypto.KeyAgreement\n\ninternal open class JceEcdh : Ecdh<ECPublicKey, ECPrivateKey> {\n    protected open fun newECKeyPairGenerator() = KeyPairGenerator.getInstance(\"EC\")\n    protected open fun newECKeyFactory() = KeyFactory.getInstance(\"EC\")\n    protected open fun newECAlgorithmParameters() = AlgorithmParameters.getInstance(\"EC\")\n    protected open fun newECDHKeyAgreement() = KeyAgreement.getInstance(\"ECDH\")\n\n    override fun generateKeyPair(): EcdhKeyPair<ECPublicKey, ECPrivateKey> {\n        return newECKeyPairGenerator()\n            .apply {\n                // AKA. prime256v1\n                // But `secp256r1` is more common\n                initialize(ECGenParameterSpec(\"secp256r1\"))\n            }\n            .genKeyPair()\n            .let {\n                EcdhKeyPair(it.public as ECPublicKey, it.private as ECPrivateKey)\n            }\n    }\n\n    override fun calculateShareKey(peerKey: ECPublicKey, privateKey: ECPrivateKey): ByteArray {\n        return newECDHKeyAgreement().apply {\n            init(privateKey)\n            doPhase(peerKey, true)\n        }.generateSecret()\n    }\n\n    override fun importPublicKey(encoded: ByteArray): ECPublicKey {\n        val params: ECParameterSpec = newECAlgorithmParameters().apply {\n            init(ECGenParameterSpec(\"secp256r1\"))\n        }.getParameterSpec(ECParameterSpec::class.java)\n\n        require(encoded[0] == 0x04.toByte()) { \"Only uncompressed format is supported\" }\n        val fieldSize = params.curve.field.fieldSize\n        val elementSize = (fieldSize + 7) / 8\n        val affineXBytes = ByteArray(elementSize)\n        val affineYBytes = ByteArray(elementSize)\n        System.arraycopy(encoded, 1, affineXBytes, 0, elementSize)\n        System.arraycopy(encoded, elementSize + 1, affineYBytes, 0, elementSize)\n        val point = ECPoint(BigInteger(1, affineXBytes), BigInteger(1, affineYBytes))\n\n        val keySpec = ECPublicKeySpec(point, params)\n        return newECKeyFactory().generatePublic(keySpec) as ECPublicKey\n    }\n\n    override fun exportPublicKey(key: ECPublicKey): ByteArray {\n        val point = key.w\n        val fieldSize = key.params.curve.field.fieldSize\n        val elementSize = (fieldSize + 7) / 8\n        val x = point.affineX.toByteArray()\n        val y = point.affineY.toByteArray()\n        val startOfX = countLeadingZeros(x)\n        val startOfY = countLeadingZeros(y)\n        val encoded = ByteArray(elementSize * 2 + 1)\n        encoded[0] = 0x04 // uncompressed\n        System.arraycopy(x, startOfX, encoded, elementSize - x.size + startOfX + 1, x.size - startOfX)\n        System.arraycopy(y, startOfY, encoded, encoded.size - y.size + startOfY, y.size - startOfY)\n        return encoded\n    }\n\n    private fun countLeadingZeros(bytes: ByteArray): Int {\n        for (i in bytes.indices) {\n            if (bytes[i] != 0.toByte()) {\n                return i\n            }\n        }\n        return bytes.size\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/utils/crypto/JceEcdhWithProvider.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils.crypto\n\nimport java.security.AlgorithmParameters\nimport java.security.KeyFactory\nimport java.security.KeyPairGenerator\nimport java.security.Provider\nimport javax.crypto.KeyAgreement\n\ninternal class JceEcdhWithProvider(val provider: Provider): JceEcdh() {\n    override fun newECKeyPairGenerator() = KeyPairGenerator.getInstance(\"EC\", provider)\n    override fun newECKeyFactory() = KeyFactory.getInstance(\"EC\", provider)\n    override fun newECAlgorithmParameters() = AlgorithmParameters.getInstance(\"EC\", provider)\n    override fun newECDHKeyAgreement() = KeyAgreement.getInstance(\"ECDH\", provider)\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/utils/crypto/QQEcdhJvm.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\npackage net.mamoe.mirai.internal.utils.crypto\n\nimport net.mamoe.mirai.utils.decodeBase64\nimport java.security.KeyFactory\nimport java.security.Signature\nimport java.security.spec.X509EncodedKeySpec\n\ninternal val publicKeyForVerify by lazy {\n    KeyFactory.getInstance(\"RSA\")\n        .generatePublic(X509EncodedKeySpec(\"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuJTW4abQJXeVdAODw1CamZH4QJZChyT08ribet1Gp0wpSabIgyKFZAOxeArcCbknKyBrRY3FFI9HgY1AyItH8DOUe6ajDEb6c+vrgjgeCiOiCVyum4lI5Fmp38iHKH14xap6xGaXcBccdOZNzGT82sPDM2Oc6QYSZpfs8EO7TYT7KSB2gaHz99RQ4A/Lel1Vw0krk+DescN6TgRCaXjSGn268jD7lOO23x5JS1mavsUJtOZpXkK9GqCGSTCTbCwZhI33CpwdQ2EHLhiP5RaXZCio6lksu+d8sKTWU1eEiEb3cQ7nuZXLYH7leeYFoPtbFV4RicIWp0/YG+RP7rLPCwIDAQAB\".decodeBase64()))\n}\n\ninternal actual fun QQEcdhInitialPublicKey.verify(sign: String): Boolean {\n    val arrayForVerify = \"305$version$keyStr\".toByteArray()\n    val signInstance = Signature.getInstance(\"SHA256WithRSA\").apply {\n        initVerify(publicKeyForVerify)\n        update(arrayForVerify)\n    }\n    return signInstance.verify(sign.decodeBase64())\n}\n"
  },
  {
    "path": "mirai-core/src/jvmBaseMain/kotlin/utils/crypto/RSA.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils.crypto\n\nimport net.mamoe.mirai.utils.decodeBase64\nimport net.mamoe.mirai.utils.encodeBase64\nimport java.security.KeyFactory\nimport java.security.KeyPairGenerator\nimport java.security.SecureRandom\nimport java.security.spec.PKCS8EncodedKeySpec\nimport java.security.spec.X509EncodedKeySpec\nimport javax.crypto.Cipher\n\ninternal actual fun rsaEncryptWithX509PubKey(input: ByteArray, plainPubPemKey: String, seed: Long): ByteArray {\n    val encodedKey = plainPubPemKey\n        .replace(\"\\n\", \"\")\n        .removePrefix(\"-----BEGIN PUBLIC KEY-----\")\n        .removeSuffix(\"-----END PUBLIC KEY-----\")\n        .trim()\n        .decodeBase64()\n\n    val keyFactory = KeyFactory.getInstance(\"RSA\")\n    val rsaPubKey = keyFactory.generatePublic(X509EncodedKeySpec(encodedKey))\n\n\n    val cipher = Cipher.getInstance(\"RSA/ECB/PKCS1Padding\")\n    cipher.init(Cipher.ENCRYPT_MODE, rsaPubKey, SecureRandom().apply { setSeed(seed) })\n\n    return cipher.doFinal(input)\n}\n\ninternal actual fun rsaDecryptWithPKCS8PrivKey(input: ByteArray, plainPrivPemKey: String, seed: Long): ByteArray {\n    val encodedKey = plainPrivPemKey\n        .replace(\"\\n\", \"\")\n        .removePrefix(\"-----BEGIN PRIVATE KEY-----\")\n        .removeSuffix(\"-----END PRIVATE KEY-----\")\n        .trim()\n        .decodeBase64()\n\n    val keyFactory = KeyFactory.getInstance(\"RSA\")\n    val rsaPubKey = keyFactory.generatePrivate(PKCS8EncodedKeySpec(encodedKey))\n\n\n    val cipher = Cipher.getInstance(\"RSA/ECB/PKCS1Padding\")\n    cipher.init(Cipher.DECRYPT_MODE, rsaPubKey, SecureRandom().apply { setSeed(seed) })\n\n    return cipher.doFinal(input)\n}\n\ninternal actual fun generateRSAKeyPair(keySize: Int): RSAKeyPair {\n    val keyGen = KeyPairGenerator.getInstance(\"RSA\")\n    keyGen.initialize(keySize)\n\n    val keyPair = keyGen.generateKeyPair()\n    return RSAKeyPair(\n        plainPubPemKey = buildString {\n            appendLine(\"-----BEGIN PUBLIC KEY-----\")\n            keyPair.public.encoded.encodeBase64().chunked(64).forEach(::appendLine)\n            appendLine(\"-----END PUBLIC KEY-----\")\n        },\n        plainPrivPemKey = buildString {\n            appendLine(\"-----BEGIN PRIVATE KEY-----\")\n            keyPair.private.encoded.encodeBase64().chunked(64).forEach(::appendLine)\n            appendLine(\"-----END PRIVATE KEY-----\")\n        }\n    )\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/event/EventChannelJavaTest.java",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage event;\n\nimport net.mamoe.mirai.event.GlobalEventChannel;\nimport net.mamoe.mirai.event.events.GroupMessageEvent;\nimport net.mamoe.mirai.event.events.MessageEvent;\n\nimport java.util.Objects;\n\n/**\n * 仅测试可以使用, 不会被编译运行\n */\npublic class EventChannelJavaTest {\n\n    public static void main(String[] args) {\n        GlobalEventChannel.INSTANCE\n                .filter(event -> Objects.equals(event.toString(), \"test\"))\n                .filterIsInstance(MessageEvent.class)\n                .subscribeAlways(GroupMessageEvent.class, groupMessageEvent -> {\n\n                });\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/event/EventLaunchUndispatchedTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.event\n\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.event.EventPriority\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.globalEventChannel\nimport net.mamoe.mirai.internal.network.components.EVENT_LAUNCH_UNDISPATCHED\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport org.junit.jupiter.api.AfterEach\nimport java.util.concurrent.ConcurrentLinkedQueue\nimport java.util.concurrent.Executors\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFails\nimport kotlin.test.assertSame\n\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\ninternal class EventLaunchUndispatchedTest : AbstractEventTest() {\n    internal class TestEvent : AbstractEvent()\n\n    private var originalValue = EVENT_LAUNCH_UNDISPATCHED\n\n    @Test\n    fun `event runs undispatched`() = runBlockingUnit {\n        originalValue = EVENT_LAUNCH_UNDISPATCHED\n        EVENT_LAUNCH_UNDISPATCHED = true\n        doTest()\n        EVENT_LAUNCH_UNDISPATCHED = originalValue\n    }\n\n    @Test\n    fun `event runs undispatched fail`() = runBlockingUnit {\n        originalValue = EVENT_LAUNCH_UNDISPATCHED\n        EVENT_LAUNCH_UNDISPATCHED = false\n        assertFails { doTest() }\n        EVENT_LAUNCH_UNDISPATCHED = originalValue\n    }\n\n    private val dispatcher = Executors.newFixedThreadPool(4).asCoroutineDispatcher()\n\n    @AfterEach\n    fun cleanup() {\n        dispatcher.close()\n    }\n\n    private suspend fun doTest() = coroutineScope {\n        val invoked = ConcurrentLinkedQueue<Int>()\n\n        val thread = Thread.currentThread()\n\n        val job = SupervisorJob()\n        globalEventChannel(dispatcher).parentJob(job).exceptionHandler {} // printing exception to stdout is very slow\n            .run {\n                subscribeAlways<TestEvent>(dispatcher, priority = EventPriority.MONITOR) {\n                    assertSame(thread, Thread.currentThread())\n                    invoked.add(1)\n                    awaitCancellation()\n                }\n                repeat(1000) { i ->\n                    subscribeAlways<TestEvent>(dispatcher, priority = EventPriority.MONITOR) {\n                        assertSame(thread, Thread.currentThread())\n                        invoked.add(i + 2)\n                        awaitCancellation()\n                    }\n                }\n            }\n\n        launch(dispatcher, start = CoroutineStart.UNDISPATCHED) { TestEvent().broadcast() }\n        // `launch` returns on first suspension point of `broadcast`\n        // if EVENT_LAUNCH_UNDISPATCHED is `true`, all listeners run to `awaitCancellation` when `broadcast` is suspended\n        // otherwise, they are put into tasks queue to be scheduled. 10000 tasks wont complete very quickly, so the following `invoked.size` check works.\n        assertSame(thread, Thread.currentThread())\n        assertEquals(invoked.toList(), invoked.sorted())\n        assertEquals(1000 + 1, invoked.size)\n        job.cancel()\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/event/JvmMethodEventsTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n@file:Suppress(\"RedundantSuspendModifier\", \"unused\", \"UNUSED_PARAMETER\")\n\npackage net.mamoe.mirai.internal.event\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.isActive\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.mirai.event.*\nimport org.jetbrains.annotations.NotNull\nimport java.util.concurrent.atomic.AtomicInteger\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\nimport kotlin.test.*\n\n\ninternal class JvmMethodEventsTest : AbstractEventTest() {\n\n    @Test\n    fun testMethodListener() {\n        class TestClass : ListenerHost, CoroutineScope by CoroutineScope(EmptyCoroutineContext) {\n            private var called = AtomicInteger(0)\n\n            fun getCalled() = called.get()\n\n            @Suppress(\"unused\")\n            @EventHandler\n            suspend fun TestEvent.`suspend receiver param Unit`(event: TestEvent) {\n                called.getAndIncrement()\n            }\n\n            @Suppress(\"unused\")\n            @EventHandler\n            suspend fun TestEvent.`suspend receiver Unit`() {\n                called.getAndIncrement()\n            }\n\n            @Suppress(\"unused\")\n            @EventHandler\n            suspend fun `suspend param Unit`(event: TestEvent) {\n                called.getAndIncrement()\n            }\n\n            @EventHandler\n            @Suppress(\"unused\")\n            fun TestEvent.`receiver param Unit`(event: TestEvent) {\n                called.getAndIncrement()\n            }\n\n            @EventHandler\n            @Suppress(\"unused\")\n            suspend fun TestEvent.`suspend receiver param LS`(event: TestEvent): ListeningStatus {\n                called.getAndIncrement()\n                return ListeningStatus.STOPPED\n            }\n\n            @Suppress(\"unused\")\n            @EventHandler\n            suspend fun TestEvent.`suspend receiver LS`(): ListeningStatus {\n                called.getAndIncrement()\n                return ListeningStatus.STOPPED\n            }\n\n            @EventHandler\n            @Suppress(\"unused\")\n            suspend fun `suspend param LS`(event: TestEvent): ListeningStatus {\n                called.getAndIncrement()\n                return ListeningStatus.STOPPED\n            }\n\n            @EventHandler\n            @Suppress(\"unused\")\n            private fun TestEvent.`test annotations`(@NotNull event: TestEvent): ListeningStatus {\n                called.getAndIncrement()\n                return ListeningStatus.STOPPED\n            }\n\n            @EventHandler\n            @Suppress(\"unused\")\n            fun TestEvent.`receiver param LS`(event: TestEvent): ListeningStatus {\n                called.getAndIncrement()\n                return ListeningStatus.STOPPED\n            }\n        }\n\n        TestClass().run {\n            this.globalEventChannel().registerListenerHost(this)\n\n            runBlocking {\n                TestEvent().broadcast()\n            }\n\n            assertEquals(9, this.getCalled())\n            cancel() // reset listeners\n        }\n    }\n\n    @Test\n    fun testExceptionHandle() {\n        class MyException : RuntimeException()\n\n        class TestClass : SimpleListenerHost() {\n            var exceptionHandled: Boolean = false\n\n            override fun handleException(context: CoroutineContext, exception: Throwable) {\n                assert(exception is ExceptionInEventHandlerException)\n                assert(exception.event is TestEvent)\n                assert(exception.rootCause is MyException)\n                exceptionHandled = true\n            }\n\n            @Suppress(\"unused\")\n            @EventHandler\n            private suspend fun TestEvent.test() {\n                throw MyException()\n            }\n        }\n\n        TestClass().run {\n            this.globalEventChannel().registerListenerHost(this)\n\n            runBlocking {\n                TestEvent().broadcast()\n            }\n            cancel() // reset listeners\n            if (!exceptionHandled) {\n                fail(\"SimpleListenerHost.handleException not invoked\")\n            }\n        }\n\n        TestClass().run {\n            globalEventChannel().registerListenerHost(this)\n\n            runBlocking {\n                TestEvent().broadcast()\n            }\n            cancel() // reset listeners\n            if (!exceptionHandled) {\n                fail(\"SimpleListenerHost.handleException not invoked\")\n            }\n        }\n\n        TestClass().run {\n            val scope = CoroutineScope(EmptyCoroutineContext)\n            scope.globalEventChannel().registerListenerHost(this)\n\n            runBlocking {\n                TestEvent().broadcast()\n            }\n            cancel() // reset listeners\n            scope.cancel()\n            if (!exceptionHandled) {\n                fail(\"SimpleListenerHost.handleException not invoked\")\n            }\n        }\n    }\n\n    @Test\n    fun testIntercept() {\n        class TestClass : ListenerHost, CoroutineScope by CoroutineScope(EmptyCoroutineContext) {\n            private var called = AtomicInteger(0)\n\n            fun getCalled() = called.get()\n\n            @Suppress(\"unused\")\n            @EventHandler(EventPriority.HIGHEST)\n            private suspend fun TestEvent.`suspend receiver param Unit`(event: TestEvent) {\n                intercept()\n                called.getAndIncrement()\n            }\n\n            @EventHandler(EventPriority.MONITOR)\n            @Suppress(\"unused\")\n            private fun TestEvent.`receiver param LS`(event: TestEvent): ListeningStatus {\n                called.getAndIncrement()\n                return ListeningStatus.STOPPED\n            }\n        }\n\n        TestClass().run {\n            this.globalEventChannel().registerListenerHost(this)\n\n            runBlocking {\n                TestEvent().broadcast()\n            }\n            cancel() // reset listeners\n\n            assertEquals(1, this.getCalled())\n        }\n    }\n\n    @Test\n    fun testCancellation() {\n        class TestingListener : SimpleListenerHost() {\n            var handled: Boolean = false\n\n            @EventHandler\n            fun handle(event: TestEvent) {\n                handled = true\n            }\n        }\n        runBlocking {\n\n            TestingListener().runTesting(this.globalEventChannel()) {\n                TestEvent().broadcast()\n                assertTrue { handled }\n            }\n\n            // registered listeners cancelled when parent scope cancelled\n            CoroutineScope(EmptyCoroutineContext).let { scope ->\n                TestingListener().runTesting(scope.globalEventChannel()) { listener ->\n                    scope.cancel()\n                    TestEvent().broadcast()\n                    assertFalse { handled }\n                    assertTrue { listener.isActive }\n                }\n            }\n\n            // registered listeners cancelled when ListenerHost cancelled\n            CoroutineScope(EmptyCoroutineContext).let { scope ->\n                val listener = TestingListener()\n                listener.runTesting(scope.globalEventChannel()) { }\n                assertFalse { listener.isActive }\n                assertTrue { scope.isActive }\n                TestEvent().broadcast()\n                assertFalse { listener.handled }\n                scope.cancel()\n            }\n\n        }\n    }\n\n    private inline fun <T> T.runTesting(\n        channel: EventChannel<*>,\n        block: T.(T) -> Unit\n    ) where T : SimpleListenerHost {\n        contract {\n            callsInPlace(block, InvocationKind.EXACTLY_ONCE)\n        }\n        channel.registerListenerHost(this)\n        block(this, this)\n        cancel()\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/event/JvmMethodEventsTestJava.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.event\n\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.test.runTest\nimport net.mamoe.mirai.event.*\nimport net.mamoe.mirai.utils.childScope\nimport java.util.concurrent.atomic.AtomicInteger\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class JvmMethodEventsTestJava : AbstractEventTest() {\n    private val called = AtomicInteger(0)\n\n    @Test\n    fun test() = runTest {\n        val host = TestHost(called)\n        val scope = this.childScope()\n        scope.globalEventChannel().registerListenerHost(host)\n        TestEvent().broadcast()\n        assertEquals(3, called.get(), null)\n        host.cancel() // reset listeners\n        scope.cancel()\n    }\n}\n\n@Suppress(\n    \"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"RedundantVisibilityModifier\", \"UNUSED_PARAMETER\", \"unused\",\n    \"RedundantNullableReturnType\"\n)\n@net.mamoe.mirai.utils.EventListenerLikeJava\ninternal class TestHost(\n    private val called: AtomicInteger\n) : SimpleListenerHost() {\n    @EventHandler\n    public fun ev(event: TestEvent?) {\n        called.incrementAndGet()\n    }\n\n    @EventHandler\n    public fun ev2(event: TestEvent?): Void? {\n        called.incrementAndGet()\n        return null\n    }\n\n    @EventHandler\n    public fun ev3(event: TestEvent?): ListeningStatus? {\n        called.incrementAndGet()\n        return ListeningStatus.LISTENING\n    }\n\n}\n"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/event/SimpleListenerHostTestJava.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.event\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.mirai.event.*\nimport net.mamoe.mirai.utils.AtomicBoolean\nimport net.mamoe.mirai.utils.JavaFriendlyAPI\nimport kotlin.coroutines.EmptyCoroutineContext\nimport kotlin.test.Test\n\n@JavaFriendlyAPI\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n@net.mamoe.mirai.utils.EventListenerLikeJava\ninternal class SimpleListenerHostTestJava : AbstractEventTest() {\n    @Test\n    fun testJavaSimpleListenerHostWork() {\n        val called = AtomicBoolean(false)\n        val host: SimpleListenerHost = object : SimpleListenerHost() {\n            @EventHandler\n            @net.mamoe.mirai.utils.EventListenerLikeJava\n            @Suppress(\"unused\")\n            fun testListen(\n                event: AbstractEvent?\n            ) {\n                println(event)\n                called.value = true\n            }\n        }\n        val scope = CoroutineScope(EmptyCoroutineContext)\n        scope.globalEventChannel().registerListenerHost(host)\n        runBlocking { object : AbstractEvent() {}.broadcast() }\n        if (!called.value) {\n            throw AssertionError(\"JavaTest: SimpleListenerHost Failed.\")\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/network/component/ComponentKeyTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.component\n\nimport net.mamoe.mirai.internal.network.component.ComponentKey.Companion.componentName\nimport net.mamoe.mirai.internal.network.component.ComponentKey.Companion.smartToString\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\nprivate open class TestComponent {\n    companion object : ComponentKey<TestComponent>\n}\n\n\nprivate interface MyInterface\n\nprivate open class TestComponentExt : TestComponent(), MyInterface\n\nprivate open class Key<R> : ComponentKey<R> where R : TestComponent, R : MyInterface\nprivate class KeyActual : Key<TestComponentExt>()\n\n\ninternal class ComponentKeyTest : AbstractTest() {\n\n    @Test\n    fun testComponentName() {\n        assertEquals(\"TestComponent\", TestComponent.componentName(false))\n        assertEquals(TestComponent::class.qualifiedName!!, TestComponent.componentName(true))\n    }\n\n    @Test\n    fun `componentName with erased type argument`() {\n        assertEquals(\n            \"TestComponent & MyInterface\",\n            Key<TestComponentExt>().componentName(false)\n        )\n        assertEquals(\n            \"${TestComponent::class.qualifiedName!!} & ${MyInterface::class.qualifiedName!!}\",\n            Key<TestComponentExt>().componentName(true)\n        )\n    }\n\n    @Test\n    fun `componentName with actual type argument`() {\n        assertEquals(\n            \"TestComponentExt\",\n            KeyActual().componentName(false)\n        )\n        assertEquals(\n            TestComponentExt::class.qualifiedName!!,\n            KeyActual().componentName(true)\n        )\n    }\n\n    @Test\n    fun `test smartToString`() {\n        assertEquals(\"ComponentKey<TestComponent>\", TestComponent.smartToString(false))\n        assertEquals(\"ComponentKey<${TestComponent::class.qualifiedName!!}>\", TestComponent.smartToString(true))\n        assertEquals(\n            \"ComponentKey<${TestComponent::class.qualifiedName!!} & ${MyInterface::class.qualifiedName!!}>\",\n            Key<TestComponentExt>().smartToString(true)\n        )\n        assertEquals(\"ComponentKey<${TestComponentExt::class.qualifiedName!!}>\", KeyActual().smartToString(true))\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/network/component/ConcurrentComponentStorageToStringTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.component\n\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\n\ninternal class ConcurrentComponentStorageTest : AbstractMutableComponentStorageTest() {\n    internal data class TestComponent2(\n        val value: Int\n    ) {\n        companion object : ComponentKey<TestComponent2>\n    }\n\n    internal data class TestComponent3(\n        val value: Int\n    ) {\n        companion object : ComponentKey<TestComponent3>\n    }\n\n    override fun createStorage(): MutableComponentStorage = ConcurrentComponentStorage(showAllComponents = true)\n\n    @Test\n    fun `test toString non debug`() {\n        val storage = ConcurrentComponentStorage(showAllComponents = false).apply {\n            set(TestComponent2, TestComponent2(1))\n        }\n        assertEquals(\"ConcurrentComponentStorage(size=1)\", storage.toString())\n    }\n\n    @Test\n    fun `test toString debugging`() {\n        val storage = ConcurrentComponentStorage(showAllComponents = true).apply {\n            set(TestComponent2, TestComponent2(1))\n        }\n        assertEquals(\n            \"\"\"ConcurrentComponentStorage(size=1) {\n            |  TestComponent2: TestComponent2(value=1)\n            |}\"\"\".trimMargin(), storage.toString()\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/network/framework/AbstractCommonNHTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.framework\n\nimport kotlinx.coroutines.ExecutorCoroutineDispatcher\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerFactory\nimport kotlin.test.AfterTest\n\n/**\n * Without selector. When network is closed, it will not reconnect, so that you can check for its states.\n *\n * @see AbstractCommonNHTestWithSelector\n */\ninternal actual abstract class AbstractCommonNHTest actual constructor() :\n    AbstractRealNetworkHandlerTest<TestCommonNetworkHandler>() {\n\n    private val startedDispatchers = mutableListOf<ExecutorCoroutineDispatcher>()\n\n    @AfterTest\n    fun cleanupDispatchers() {\n        startedDispatchers.forEach { it.close() }\n    }\n\n    actual override val factory: NetworkHandlerFactory<TestCommonNetworkHandler> =\n        NetworkHandlerFactory<TestCommonNetworkHandler> { context, address ->\n            object : TestCommonNetworkHandler(bot, context, address) {\n                override suspend fun createConnection(): PlatformConn {\n                    return conn.apply {\n                        doRegister() // restart channel\n//                        setupChannelPipeline(\n//                            pipeline(), PacketDecodePipeline(\n//                                coroutineContext.plus(\n//                                    NioEventLoopGroup().asCoroutineDispatcher().also { startedDispatchers.add(it) })\n//                            )\n//                        )\n                    }\n                }\n            }\n        }\n\n    protected actual fun removeOutgoingPacketEncoder() {\n        kotlin.runCatching {\n            conn.pipeline().remove(\"outgoing-packet-encoder\")\n        }\n    }\n\n    actual val conn: PlatformConn = NettyNHTestChannel()\n}\n\ninternal actual typealias PlatformConn = NettyNHTestChannel\n"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/network/framework/AbstractNettyNHTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.framework\n\ninternal abstract class AbstractNettyNHTest : AbstractCommonNHTest() {\n\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/network/framework/NettyNHTestChannel.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.framework\n\nimport io.ktor.utils.io.core.*\nimport io.netty.channel.embedded.EmbeddedChannel\nimport io.netty.util.ReferenceCountUtil\nimport kotlinx.serialization.InternalSerializationApi\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.serializer\nimport net.mamoe.mirai.internal.network.components.RawIncomingPacket\nimport net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket\nimport net.mamoe.mirai.internal.utils.io.ProtoBuf\nimport net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.cast\nimport net.mamoe.mirai.utils.error\n\ninternal class NettyNHTestChannel(\n    var fakeServer: (NettyNHTestChannel.(msg: Any?) -> Unit)?,\n) : EmbeddedChannel() {\n    constructor() : this(null)\n\n    @OptIn(InternalSerializationApi::class)\n    fun listen(listener: (OutgoingPacket) -> Any?) {\n        fakeServer = { packet ->\n            if (packet is OutgoingPacket) {\n                val rsp0 = when (val rsp = listener(packet)) {\n                    null -> null\n                    is Unit -> null\n                    is ByteArray -> {\n                        RawIncomingPacket(\n                            commandName = packet.commandName,\n                            sequenceId = packet.sequenceId,\n                            body = rsp\n                        )\n                    }\n                    is RawIncomingPacket -> rsp\n                    is ProtoBuf -> {\n                        RawIncomingPacket(\n                            commandName = packet.commandName,\n                            sequenceId = packet.sequenceId,\n                            body = buildPacket {\n                                writeProtoBuf(\n                                    rsp::class.serializer().cast<KSerializer<ProtoBuf>>(),\n                                    rsp\n                                )\n                            }.readBytes()\n                        )\n                    }\n                    else -> {\n                        logger.error { \"Failed to respond $rsp\" }\n                        null\n                    }\n                }\n                if (rsp0 != null) {\n                    pipeline().fireChannelRead(rsp0)\n                }\n            }\n            ReferenceCountUtil.release(packet)\n        }\n    }\n\n    public /*internal*/ override fun doRegister() {\n        super.doRegister() // Set channel state to ACTIVE\n        // Drop old handlers\n        pipeline().let { p ->\n            while (p.first() != null) {\n                p.removeFirst()\n            }\n        }\n    }\n\n    override fun handleInboundMessage(msg: Any?) {\n        ReferenceCountUtil.release(msg) // Not handled, Drop\n    }\n\n    override fun handleOutboundMessage(msg: Any?) {\n        fakeServer?.invoke(this, msg) ?: ReferenceCountUtil.release(msg)\n    }\n\n    companion object {\n        private val logger by lazy {\n            MiraiLogger.Factory.create(NettyNHTestChannel::class)\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/network/impl/netty/CommonNHUtilsTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network.impl.netty\n\nimport io.netty.channel.DefaultChannelPromise\nimport io.netty.channel.embedded.EmbeddedChannel\nimport kotlinx.coroutines.CoroutineStart\nimport kotlinx.coroutines.launch\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.internal.test.runBlockingUnit\nimport org.junit.jupiter.api.AfterAll\nimport kotlin.test.Test\nimport kotlin.test.assertFailsWith\nimport kotlin.test.assertTrue\nimport kotlin.time.Duration.Companion.seconds\n\n/**\n * @see awaitKt\n */\ninternal class CommonNHUtilsTest : AbstractTest() {\n    companion object {\n        private val channel = EmbeddedChannel()\n\n        @JvmStatic\n        @AfterAll\n        fun afterAll() {\n            channel.close()\n        }\n    }\n\n    @Test\n    fun canAwait() = runBlockingUnit(timeout = 5.seconds) {\n        val future = DefaultChannelPromise(channel)\n        launch(start = CoroutineStart.UNDISPATCHED) { future.awaitKt() }\n        launch {\n            future.setSuccess()\n        }\n    }\n\n    @Test\n    fun returnsImmediatelyIfCompleted() = runBlockingUnit(timeout = 5.seconds) {\n        val future = DefaultChannelPromise(channel)\n        future.setSuccess()\n        future.awaitKt()\n    }\n\n    @Test\n    fun testAwait() {\n        class MyError : AssertionError(\"My\") // coroutine debugger will modify the exception if inside coroutine\n\n        runBlockingUnit(timeout = 5.seconds) {\n            val future = DefaultChannelPromise(channel)\n            launch(start = CoroutineStart.UNDISPATCHED) {\n                assertFailsWith<AssertionError> {\n                    future.awaitKt()\n                }.let { actual ->\n                    assertTrue { actual is MyError }\n                }\n            }\n            launch {\n                future.setFailure(MyError())\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/package.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/test/AbstractTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.test\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.debug.DebugProbes\nimport kotlinx.coroutines.test.StandardTestDispatcher\nimport net.mamoe.mirai.internal.testFramework.TestFactory\nimport org.junit.jupiter.api.BeforeAll\nimport org.junit.jupiter.api.TestInfo\nimport org.junit.jupiter.api.Timeout\nimport java.util.concurrent.TimeUnit\nimport kotlin.jvm.optionals.getOrNull\nimport kotlin.reflect.KClass\nimport kotlin.reflect.full.functions\nimport kotlin.reflect.full.hasAnnotation\n\n@Timeout(value = 7, unit = TimeUnit.MINUTES)\nactual abstract class AbstractTest actual constructor() {\n    actual fun borrowSingleThreadDispatcher(): CoroutineDispatcher {\n        return StandardTestDispatcher()\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    actual companion object {\n        @BeforeAll\n        @JvmStatic\n        fun checkTestFactories(testInfo: TestInfo) {\n            val clazz = testInfo.testClass.getOrNull()?.kotlin ?: return\n            for (function in clazz.functions) {\n                if (function.hasAnnotation<TestFactory>()) {\n                    check(function.returnType.classifier == List::class) {\n                        \"Illegal TestFactory function. A such function must return DynamicTestsResult.\"\n                    }\n                    check((function.returnType.classifier as? KClass<*>)?.qualifiedName == List::class.qualifiedName) {\n                        \"Illegal TestFactory function. A such function must return DynamicTestsResult.\"\n                    }\n                }\n            }\n        }\n\n        init {\n            initializeTestPlatformBeforeCommon()\n            initializeTestCommon()\n\n            runCatching { DebugProbes.install() }\n        }\n    }\n}\n\ninternal expect fun initializeTestPlatformBeforeCommon() /* override MiraiLogger.Factory implementation on AndroidUnitTest */"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/test/NativeTestWrapper.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.test\n\n"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/DebugProbes.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework\n\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\n\n@Suppress(\"ACTUAL_WITHOUT_EXPECT\", \"NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS\")\n@OptIn(ExperimentalCoroutinesApi::class)\nactual typealias DebugProbes = kotlinx.coroutines.debug.DebugProbes"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/DynamicTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework\n\nactual typealias TestFactory = org.junit.jupiter.api.TestFactory\n\nactual typealias DynamicTest = org.junit.jupiter.api.DynamicTest\n\n@Suppress(\"ACTUAL_TYPE_ALIAS_TO_CLASS_WITH_DECLARATION_SITE_VARIANCE\", \"ACTUAL_WITHOUT_EXPECT\")\nactual typealias DynamicTestsResult = List<*>\n\nactual fun dynamicTest(displayName: String, action: () -> Unit): DynamicTest {\n    return DynamicTest.dynamicTest(displayName, action)\n}\n\n\nactual fun runDynamicTests(dynamicTests: List<DynamicTest>): DynamicTestsResult = dynamicTests"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/RemoveDefaultValuesVisitor.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.codegen\n\nimport net.mamoe.mirai.internal.testFramework.codegen.descriptors.ClassValueDesc\nimport net.mamoe.mirai.internal.testFramework.codegen.descriptors.ValueDesc\nimport net.mamoe.mirai.internal.testFramework.codegen.descriptors.accept\nimport net.mamoe.mirai.internal.testFramework.codegen.visitor.ValueDescVisitorUnit\nimport net.mamoe.mirai.internal.testFramework.codegen.visitors.AnalyzeDefaultValuesMappingVisitor\nimport net.mamoe.mirai.internal.testFramework.codegen.visitors.DefaultValuesMapping\nimport kotlin.reflect.KParameter\n\n\nfun ValueDesc.removeDefaultValues(): ValueDesc {\n    val def = AnalyzeDefaultValuesMappingVisitor()\n    this.accept(def)\n    this.accept(RemoveDefaultValuesVisitor(def.mappings))\n    return this\n}\n\nclass RemoveDefaultValuesVisitor(\n    private val mappings: MutableList<DefaultValuesMapping>,\n) : ValueDescVisitorUnit {\n    override fun visitValue(desc: ValueDesc, data: Nothing?) {\n        desc.acceptChildren(this, data)\n    }\n\n    override fun <T : Any> visitClass(desc: ClassValueDesc<T>, data: Nothing?) {\n        super.visitClass(desc, data)\n        val mapping = mappings.find { it.forClass == desc.type }?.mapping ?: return\n\n        // remove properties who have the same values as their default values, this would significantly reduce code size.\n        mapping.forEach { (name, defaultValue) ->\n            if (desc.properties.entries.removeIf {\n                    it.key.name == name && isDefaultOrEmpty(it.key, it.value, defaultValue)\n                }) {\n                return@forEach // by removing one property, there will not by any other matches\n            }\n        }\n    }\n\n    private fun isDefaultOrEmpty(key: KParameter, value: ValueDesc, defaultValue: Any?): Boolean {\n        if (!key.isOptional) return false\n        if (equals(value.origin, defaultValue)) return true\n\n        if (value is ClassValueDesc<*>\n            && value.properties.all { it.key.isOptional && isDefaultOrEmpty(it.key, it.value, defaultValue) }\n        ) {\n            return true\n        }\n\n        return false\n    }\n\n    private fun Any?.isNullOrZeroOrEmpty(): Boolean {\n        when (this) {\n            null,\n            0.toByte(), 0.toShort(), 0, 0L, 0.toFloat(), 0.toDouble(), 0.toChar(),\n            \"\", listOf<Any>(), setOf<Any>(), mapOf<Any, Any>(),\n            -> return true\n        }\n\n        check(this != null)\n\n        when {\n            this is Array<*> && this.isEmpty() -> return true\n            this is IntArray && this.isEmpty() -> return true\n            this is ByteArray && this.isEmpty() -> return true\n            this is ShortArray && this.isEmpty() -> return true\n            this is LongArray && this.isEmpty() -> return true\n            this is CharArray && this.isEmpty() -> return true\n            this is FloatArray && this.isEmpty() -> return true\n            this is DoubleArray && this.isEmpty() -> return true\n            this is BooleanArray && this.isEmpty() -> return true\n        }\n\n        return false\n    }\n\n    fun equals(a: Any?, b: Any?): Boolean {\n        if (a.isNullOrZeroOrEmpty() && b.isNullOrZeroOrEmpty()) return true\n        return when {\n            a === b -> true\n            a == b -> true\n            a is Array<*>? && b is Array<*>? -> a.contentEquals(b)\n            a is IntArray? && b is IntArray? -> a.contentEquals(b)\n            a is ByteArray? && b is ByteArray? -> a.contentEquals(b)\n            a is ShortArray? && b is ShortArray? -> a.contentEquals(b)\n            a is LongArray? && b is LongArray? -> a.contentEquals(b)\n            a is CharArray? && b is CharArray? -> a.contentEquals(b)\n            a is FloatArray? && b is FloatArray? -> a.contentEquals(b)\n            a is DoubleArray? && b is DoubleArray? -> a.contentEquals(b)\n            a is BooleanArray? && b is BooleanArray? -> a.contentEquals(b)\n            else -> false\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/ValueDescAnalyzer.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ExperimentalStdlibApi::class)\n\npackage net.mamoe.mirai.internal.testFramework.codegen\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.internal.testFramework.codegen.descriptors.*\nimport net.mamoe.mirai.utils.cast\nimport kotlin.reflect.KParameter\nimport kotlin.reflect.KProperty1\nimport kotlin.reflect.KType\nimport kotlin.reflect.full.declaredMemberProperties\nimport kotlin.reflect.full.hasAnnotation\nimport kotlin.reflect.full.primaryConstructor\nimport kotlin.reflect.full.valueParameters\nimport kotlin.reflect.typeOf\n\nobject ValueDescAnalyzer {\n    private val anyType = typeOf<Any>()\n\n\n    /**\n     * Analyze [value] and give its correspondent [ValueDesc].\n     */\n    fun analyze(value: Any?, type: KType): ValueDesc {\n        if (value == null) return PlainValueDesc(null, \"null\", null)\n\n        val clazz = value::class\n\n        if (clazz.isData || clazz.hasAnnotation<Serializable>()) {\n            val primaryConstructor =\n                clazz.primaryConstructor ?: error(\"$value does not have a primary constructor.\")\n            val properties = clazz.declaredMemberProperties\n\n            val map = mutableMapOf<KParameter, ValueDesc>()\n\n            for (valueParameter in primaryConstructor.valueParameters) {\n                val prop = properties.find { it.name == valueParameter.name }\n                    ?: error(\"Could not find corresponding property for parameter ${clazz.qualifiedName}.${valueParameter.name}\")\n\n                prop.cast<KProperty1<Any, Any?>>()\n                map[valueParameter] = analyze(prop.get(value), prop.returnType)\n            }\n            return ClassValueDesc(null, value, map)\n        }\n\n        CollectionLikeValueDesc.createOrNull(value, type, null)?.let { return it }\n        if (value is Collection<*>) {\n            return CollectionValueDesc(\n                null,\n                value,\n                arrayType = type,\n                elementType = type.arguments.firstOrNull()?.type ?: anyType\n            )\n        } else if (value is Map<*, *>) {\n            return MapValueDesc(\n                null,\n                value.cast(),\n                value.cast(),\n                type,\n                type.arguments.firstOrNull()?.type ?: anyType,\n                type.arguments.getOrNull(1)?.type ?: anyType\n            )\n        }\n\n        return when (value) {\n            is CharSequence -> {\n                PlainValueDesc(null, '\"' + value.toString() + '\"', value)\n            }\n            is Char -> {\n                PlainValueDesc(null, \"'$value'\", value)\n            }\n            else -> PlainValueDesc(null, value.toString(), value)\n        }\n    }\n}\n\ninline fun <reified T> ValueDescAnalyzer.analyze(value: T): ValueDesc {\n    return analyze(value, typeOf<T>())\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/descriptors/ClassValueDesc.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.codegen.descriptors\n\nimport net.mamoe.mirai.internal.testFramework.codegen.visitor.ValueDescTransformer\nimport net.mamoe.mirai.internal.testFramework.codegen.visitor.ValueDescVisitor\nimport kotlin.reflect.KClass\nimport kotlin.reflect.KParameter\n\nclass ClassValueDesc<T : Any>(\n    override val parent: ValueDesc?,\n    override val origin: T,\n    val properties: MutableMap<KParameter, ValueDesc>,\n) : ValueDesc {\n    val type: KClass<out T> by lazy { origin::class }\n\n    override fun <D, R> accept(visitor: ValueDescVisitor<D, R>, data: D): R {\n        return visitor.visitClass(this, data)\n    }\n\n    override fun <D> acceptChildren(visitor: ValueDescVisitor<D, *>, data: D) {\n        properties.forEach { (_, u) ->\n            u.accept(visitor, data)\n        }\n    }\n\n    override fun <D> transformChildren(visitor: ValueDescTransformer<D>, data: D) {\n        val result = mutableMapOf<KParameter, ValueDesc>()\n        for (entry in this.properties.entries) {\n            entry.value.acceptChildren(visitor, data)\n            val newValue = entry.value.accept(visitor, data)\n            if (newValue != null) {\n                result[entry.key] = newValue\n            }\n        }\n        this.properties.clear()\n        this.properties.putAll(result)\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/descriptors/CollectionLikeValueDesc.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.codegen.descriptors\n\nimport net.mamoe.mirai.internal.testFramework.codegen.visitor.ValueDescTransformer\nimport net.mamoe.mirai.internal.testFramework.codegen.visitor.ValueDescVisitor\nimport kotlin.reflect.KType\nimport kotlin.reflect.typeOf\n\nsealed interface CollectionLikeValueDesc : ValueDesc {\n    val value: Any\n\n    val arrayType: KType\n    val elementType: KType\n    val elements: MutableList<ValueDesc>\n\n    override fun <D> acceptChildren(visitor: ValueDescVisitor<D, *>, data: D) {\n        for (element in elements) {\n            element.accept(visitor, data)\n        }\n    }\n\n    override fun <D> transformChildren(visitor: ValueDescTransformer<D>, data: D) {\n        elements.transform { it.accept(visitor, data) }\n    }\n\n    companion object {\n        @OptIn(ExperimentalStdlibApi::class)\n        fun createOrNull(array: Any, type: KType, parent: ValueDesc?): CollectionLikeValueDesc? {\n            if (array is Array<*>) return ObjectArrayValueDesc(parent, array, arrayType = type)\n            return when (array) {\n                is IntArray -> PrimitiveArrayValueDesc(parent, array, arrayType = type, elementType = typeOf<Int>())\n                is ByteArray -> PrimitiveArrayValueDesc(parent, array, arrayType = type, elementType = typeOf<Byte>())\n                is ShortArray -> PrimitiveArrayValueDesc(parent, array, arrayType = type, elementType = typeOf<Short>())\n                is CharArray -> PrimitiveArrayValueDesc(parent, array, arrayType = type, elementType = typeOf<Char>())\n                is LongArray -> PrimitiveArrayValueDesc(parent, array, arrayType = type, elementType = typeOf<Long>())\n                is FloatArray -> PrimitiveArrayValueDesc(parent, array, arrayType = type, elementType = typeOf<Float>())\n                is DoubleArray -> PrimitiveArrayValueDesc(\n                    parent,\n                    array,\n                    arrayType = type,\n                    elementType = typeOf<Double>()\n                )\n                is BooleanArray -> PrimitiveArrayValueDesc(\n                    parent,\n                    array,\n                    arrayType = type,\n                    elementType = typeOf<Boolean>()\n                )\n                else -> return null\n            }\n        }\n    }\n}\n\nfun <E> MutableList<E>.transform(transformer: (E) -> E?) {\n    val result = this.asSequence().mapNotNull(transformer).toMutableList()\n    this.clear()\n    this.addAll(result)\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/descriptors/CollectionValueDesc.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.codegen.descriptors\n\nimport net.mamoe.mirai.internal.testFramework.codegen.ValueDescAnalyzer\nimport net.mamoe.mirai.internal.testFramework.codegen.visitor.ValueDescVisitor\nimport kotlin.reflect.KType\nimport kotlin.reflect.full.createType\n\nclass CollectionValueDesc(\n    override val parent: ValueDesc?,\n    value: Collection<*>,\n    override val origin: Collection<*> = value,\n    override val arrayType: KType,\n    override val elementType: KType = arrayType.arguments.first().type ?: Any::class.createType()\n) : CollectionLikeValueDesc {\n\n    override var value: Collection<*> = value\n        set(value) {\n            field = value\n            elements.clear()\n            elements.addAll(initializeElements(value))\n        }\n\n    override val elements: MutableList<ValueDesc> by lazy {\n        initializeElements(value)\n    }\n\n    private fun initializeElements(value: Collection<*>) = value.mapTo(ArrayList(value.size)) {\n        ValueDescAnalyzer.analyze(it, elementType)\n    }\n\n\n    override fun <D, R> accept(visitor: ValueDescVisitor<D, R>, data: D): R = visitor.visitCollection(this, data)\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/descriptors/MapValueDesc.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.codegen.descriptors\n\nimport net.mamoe.mirai.internal.testFramework.codegen.ValueDescAnalyzer\nimport net.mamoe.mirai.internal.testFramework.codegen.visitor.ValueDescTransformer\nimport net.mamoe.mirai.internal.testFramework.codegen.visitor.ValueDescVisitor\nimport kotlin.reflect.KType\nimport kotlin.reflect.full.createType\n\nclass MapValueDesc(\n    override val parent: ValueDesc?,\n    var value: Map<Any?, Any?>,\n    override val origin: Map<Any?, Any?> = value,\n    val mapType: KType,\n    val keyType: KType = mapType.arguments.first().type ?: Any::class.createType(),\n    val valueType: KType = mapType.arguments[1].type ?: Any::class.createType(),\n) : ValueDesc {\n    val elements: MutableMap<ValueDesc, ValueDesc> by lazy {\n        value.map {\n            ValueDescAnalyzer.analyze(it.key, keyType) to ValueDescAnalyzer.analyze(\n                it.value,\n                valueType\n            )\n        }.toMap(mutableMapOf())\n    }\n\n    override fun <D, R> accept(visitor: ValueDescVisitor<D, R>, data: D): R = visitor.visitMap(this, data)\n\n    override fun <D> acceptChildren(visitor: ValueDescVisitor<D, *>, data: D) {\n        for ((key, value) in elements.entries) {\n            key.accept(visitor, data)\n            value.accept(visitor, data)\n        }\n    }\n\n    override fun <D> transformChildren(visitor: ValueDescTransformer<D>, data: D) {\n        val resultMap = mutableMapOf<ValueDesc, ValueDesc>()\n        for (entry in this.elements.entries) {\n            val newKey = entry.key.accept(visitor, data)\n            val newValue = entry.value.accept(visitor, data)\n            if (newKey != null && newValue != null) {\n                resultMap[newKey] = newValue\n            }\n        }\n        this.elements.clear()\n        this.elements.putAll(resultMap)\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/descriptors/ObjectArrayValueDesc.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.codegen.descriptors\n\nimport net.mamoe.mirai.internal.testFramework.codegen.ValueDescAnalyzer\nimport net.mamoe.mirai.internal.testFramework.codegen.visitor.ValueDescVisitor\nimport kotlin.reflect.KType\nimport kotlin.reflect.full.createType\n\nclass ObjectArrayValueDesc(\n    override val parent: ValueDesc?,\n    value: Array<*>,\n    override val origin: Array<*> = value,\n    override val arrayType: KType,\n    override val elementType: KType = arrayType.arguments.first().type ?: Any::class.createType(),\n) : CollectionLikeValueDesc {\n\n    override var value: Array<*> = value\n        set(value) {\n            field = value\n            elements.clear()\n            elements.addAll(initializeElements(value))\n        }\n\n    override val elements: MutableList<ValueDesc> by lazy {\n        initializeElements(value)\n    }\n\n    private fun initializeElements(value: Array<*>) = value.mapTo(ArrayList(value.size)) {\n        ValueDescAnalyzer.analyze(it, elementType)\n    }\n\n\n    override fun <D, R> accept(visitor: ValueDescVisitor<D, R>, data: D): R = visitor.visitObjectArray(this, data)\n\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/descriptors/PlainValueDesc.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.codegen.descriptors\n\nimport net.mamoe.mirai.internal.testFramework.codegen.visitor.ValueDescTransformer\nimport net.mamoe.mirai.internal.testFramework.codegen.visitor.ValueDescVisitor\n\nclass PlainValueDesc(\n    override val parent: ValueDesc?,\n    var value: String,\n    override val origin: Any?\n) : ValueDesc {\n    init {\n        require(value.isNotBlank())\n    }\n\n    override fun <D, R> accept(visitor: ValueDescVisitor<D, R>, data: D): R {\n        return visitor.visitPlain(this, data)\n    }\n\n    override fun <D> acceptChildren(visitor: ValueDescVisitor<D, *>, data: D) {\n    }\n\n    override fun <D> transformChildren(visitor: ValueDescTransformer<D>, data: D) {\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/descriptors/PrimitiveArrayValueDesc.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.codegen.descriptors\n\nimport net.mamoe.mirai.internal.testFramework.codegen.ValueDescAnalyzer\nimport net.mamoe.mirai.internal.testFramework.codegen.visitor.ValueDescVisitor\nimport kotlin.reflect.KType\n\nclass PrimitiveArrayValueDesc(\n    override val parent: ValueDesc?,\n    value: Any,\n    override val origin: Any = value,\n    override val arrayType: KType,\n    override val elementType: KType\n) : CollectionLikeValueDesc {\n    override var value: Any = value\n        set(value) {\n            field = value\n            elements.clear()\n            elements.addAll(initializeElements(value))\n        }\n\n    override val elements: MutableList<ValueDesc> by lazy {\n        initializeElements(value)\n    }\n\n    private fun initializeElements(value: Any): MutableList<ValueDesc> = when (value) {\n        is IntArray -> value.mapTo(mutableListOf()) { ValueDescAnalyzer.analyze(it, elementType) }\n        is ByteArray -> value.mapTo(mutableListOf()) { ValueDescAnalyzer.analyze(it, elementType) }\n        is ShortArray -> value.mapTo(mutableListOf()) { ValueDescAnalyzer.analyze(it, elementType) }\n        is CharArray -> value.mapTo(mutableListOf()) { ValueDescAnalyzer.analyze(it, elementType) }\n        is LongArray -> value.mapTo(mutableListOf()) { ValueDescAnalyzer.analyze(it, elementType) }\n        is FloatArray -> value.mapTo(mutableListOf()) { ValueDescAnalyzer.analyze(it, elementType) }\n        is DoubleArray -> value.mapTo(mutableListOf()) { ValueDescAnalyzer.analyze(it, elementType) }\n        is BooleanArray -> value.mapTo(mutableListOf()) { ValueDescAnalyzer.analyze(it, elementType) }\n        else -> error(\"$value is not an array.\")\n    }\n\n    override fun <D, R> accept(visitor: ValueDescVisitor<D, R>, data: D): R {\n        return visitor.visitPrimitiveArray(this, data)\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/descriptors/ValueDesc.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.codegen.descriptors\n\nimport net.mamoe.mirai.internal.testFramework.codegen.visitor.ValueDescTransformer\nimport net.mamoe.mirai.internal.testFramework.codegen.visitor.ValueDescTransformerNotNull\nimport net.mamoe.mirai.internal.testFramework.codegen.visitor.ValueDescVisitor\n\nsealed interface ValueDesc {\n    val origin: Any?\n    val parent: ValueDesc?\n\n    fun <D, R> accept(visitor: ValueDescVisitor<D, R>, data: D): R\n    fun <D> acceptChildren(visitor: ValueDescVisitor<D, *>, data: D)\n\n    fun <D> transform(visitor: ValueDescTransformer<D>, data: D): ValueDesc? = this.accept(visitor, data)\n    fun <D> transformChildren(visitor: ValueDescTransformer<D>, data: D)\n}\n\nfun <R> ValueDesc.accept(visitor: ValueDescVisitor<Nothing?, R>): R = accept(visitor, null)\nfun ValueDesc.transform(visitor: ValueDescTransformer<Nothing?>) = transform(visitor, null)\nfun ValueDesc.transform(visitor: ValueDescTransformerNotNull<Nothing?>) = transform(visitor, null)!!\nfun <R> ValueDesc.acceptChildren(visitor: ValueDescVisitor<Nothing?, R>) = acceptChildren(visitor, null)\nfun ValueDesc.transformChildren(visitor: ValueDescTransformer<Nothing?>) = transformChildren(visitor, null)\n\nval ValueDesc.parents\n    get() = sequence {\n        var parent = parent\n        do {\n            parent ?: return@sequence\n            yield(parent)\n            parent = parent.parent\n        } while (true)\n    }\n\ninline fun <reified T : ValueDesc> ValueDesc.findParent(): T? = parents.filterIsInstance<T>().firstOrNull()\n"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/test/IndenterTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.codegen.test\n\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.internal.testFramework.codegen.visitors.WordingIndenter\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class IndenterTest : AbstractTest() {\n\n    @Test\n    fun `can indentize`() {\n        assertEquals(\"    test\", WordingIndenter.spacing(4).indentize(\"test\"))\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/test/OptimizeByteArrayAsHexStringTransformerTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.codegen.test\n\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.internal.testFramework.codegen.ValueDescAnalyzer\nimport net.mamoe.mirai.internal.testFramework.codegen.analyze\nimport net.mamoe.mirai.internal.testFramework.codegen.descriptors.transform\nimport net.mamoe.mirai.internal.testFramework.codegen.visitors.OptimizeByteArrayAsHexStringTransformer\nimport net.mamoe.mirai.internal.testFramework.codegen.visitors.ValueDescToStringRenderer\nimport net.mamoe.mirai.internal.testFramework.codegen.visitors.renderToString\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class OptimizeByteArrayAsHexStringTransformerTest : AbstractTest() {\n\n    private inline fun <reified T> analyzeTransformAndRender(\n        value: T,\n        renderer: ValueDescToStringRenderer = ValueDescToStringRenderer()\n    ): String {\n        return ValueDescAnalyzer.analyze(value)\n            .transform(OptimizeByteArrayAsHexStringTransformer())\n            .renderToString(renderer)\n    }\n\n    @Test\n    fun `can optimize as string`() {\n        assertEquals(\n            \"\"\"\n            \"test\".toByteArray() /* 74 65 73 74 */\n        \"\"\".trimIndent(), analyzeTransformAndRender(\"test\".toByteArray())\n        )\n    }\n\n    @Test\n    fun `can optimize as hex`() {\n        assertEquals(\n            \"\"\"\n            \"4F 02\".hexToBytes()\n        \"\"\".trimIndent(), analyzeTransformAndRender(byteArrayOf(0x4f, 0x02))\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/test/visitors/ValueDescAnalyzerTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.codegen.test.visitors\n\nimport net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg\nimport net.mamoe.mirai.internal.testFramework.codegen.RemoveDefaultValuesVisitor\nimport net.mamoe.mirai.internal.testFramework.codegen.ValueDescAnalyzer\nimport net.mamoe.mirai.internal.testFramework.codegen.analyze\nimport net.mamoe.mirai.internal.testFramework.codegen.descriptors.accept\nimport net.mamoe.mirai.internal.testFramework.codegen.visitors.*\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\nclass ValueDescAnalyzerTest {\n\n    private inline fun <reified T> analyzeAndRender(\n        value: T\n    ): String {\n        return ValueDescAnalyzer.analyze(value).renderToString(\n            rendererContext = RendererContext(\n                indenter = Indenter.NoIndent,\n                classFormatter = object : ClassFormatter() {\n                    override fun formatClassProperty(\n                        context: ClassFormatterContext,\n                        propertyString: String?,\n                        valueString: String\n                    ): String = \"$propertyString=$valueString\"\n                }\n            ),\n        )\n    }\n\n    @Test\n    fun `test plain`() {\n        assertEquals(\n            \"\\\"test\\\"\",\n            analyzeAndRender(\"test\")\n        )\n        assertEquals(\n            \"1\",\n            analyzeAndRender(1)\n        )\n        assertEquals(\n            \"1.0\",\n            analyzeAndRender(1.0)\n        )\n    }\n\n    @Test\n    fun `test array`() {\n        assertEquals(\n            \"arrayOf(1, 2)\",\n            analyzeAndRender(arrayOf(1, 2))\n        )\n        assertEquals(\n            \"arrayOf(5.0)\",\n            analyzeAndRender(arrayOf(5.0))\n        )\n        assertEquals(\n            \"arrayOf(\\\"1\\\")\",\n            analyzeAndRender(arrayOf(\"1\"))\n        )\n        assertEquals(\n            \"\"\"\n                arrayOf(\n                arrayOf(1), \n                )\n            \"\"\".trimIndent(),\n            analyzeAndRender(arrayOf(arrayOf(1)))\n        )\n    }\n\n    data class TestClass(\n        val value: String\n    )\n\n    data class TestClass2(\n        val value: Any\n    )\n\n    @Test\n    fun `test class`() {\n        assertEquals(\n            \"\"\"\n                ${TestClass::class.qualifiedName!!}(\n                value=\"test\",\n                )\n            \"\"\".trimIndent(),\n            analyzeAndRender(TestClass(\"test\"))\n        )\n        assertEquals(\n            \"\"\"\n                ${TestClass2::class.qualifiedName!!}(\n                value=\"test\",\n                )\n            \"\"\".trimIndent(),\n            analyzeAndRender(TestClass2(\"test\"))\n        )\n        assertEquals(\n            \"\"\"\n                ${TestClass2::class.qualifiedName!!}(\n                value=1,\n                )\n            \"\"\".trimIndent(),\n            analyzeAndRender(TestClass2(1))\n        )\n    }\n\n    data class TestNesting(\n        val nested: Nested\n    ) {\n        data class Nested(\n            val value: String\n        )\n    }\n\n    @Test\n    fun `test nesting`() {\n        assertEquals(\n            \"\"\"\n                ${TestNesting::class.qualifiedName}(\n                nested=${TestNesting.Nested::class.qualifiedName}(\n                value=\"test\",\n                ),\n                )\n            \"\"\".trimIndent(),\n            analyzeAndRender(TestNesting(TestNesting.Nested(\"test\")))\n        )\n    }\n\n    @Test\n    fun `test complex nesting`() {\n        assertEquals(\n            \"\"\"\n            net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg.StructMsg(\n                version = 1,\n                msgType = 2,\n                msgSeq = 1630,\n                msgTime = 1630,\n                reqUin = 1230,\n                msg = net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg.SystemMsg(\n                    subType = 1,\n                    msgTitle = \"邀请加群\",\n                    msgDescribe = \"邀请你加入 %group_name%\",\n                    actions = mutableListOf(\n                        net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg.SystemMsgAction(\n                            name = \"拒绝\",\n                            result = \"已拒绝\",\n                            actionInfo = net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg.SystemMsgActionInfo(\n                                type = 12,\n                                groupCode = 2230203,\n                            ),\n                            detailName = \"拒绝\",\n                        ), \n                        net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg.SystemMsgAction(\n                            name = \"同意\",\n                            result = \"已同意\",\n                            actionInfo = net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg.SystemMsgActionInfo(\n                                type = 11,\n                                groupCode = 2230203,\n                            ),\n                            detailName = \"同意\",\n                        ), \n                        net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg.SystemMsgAction(\n                            name = \"忽略\",\n                            result = \"已忽略\",\n                            actionInfo = net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg.SystemMsgActionInfo(\n                                type = 14,\n                                groupCode = 2230203,\n                            ),\n                            detailName = \"忽略\",\n                        ), \n                    ),\n                    groupCode = 2230203,\n                    actionUin = 1230001,\n                    groupMsgType = 2,\n                    groupInviterRole = 1,\n                    groupInfo = net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg.GroupInfo(\n                        appPrivilegeFlag = 67698880,\n                    ),\n                    reqUinNick = \"user3\",\n                    groupName = \"testtest\",\n                    actionUinNick = \"user1\",\n                    groupExtFlag = 1075905600,\n                    actionUinQqNick = \"user1\",\n                    reqUinGender = 255,\n                    c2cInviteJoinGroupFlag = 1,\n                ),\n            )\n            \"\"\".trimIndent(),\n            ValueDescAnalyzer.analyze(\n                Structmsg.StructMsg(\n                    version = 1,\n                    msgType = 2,\n                    msgSeq = 1630,\n                    msgTime = 1630,\n                    reqUin = 1230,\n                    msg = Structmsg.SystemMsg(\n                        subType = 1,\n                        msgTitle = \"邀请加群\",\n                        msgDescribe = \"邀请你加入 %group_name%\",\n                        actions = mutableListOf(\n                            Structmsg.SystemMsgAction(\n                                name = \"拒绝\",\n                                result = \"已拒绝\",\n                                actionInfo = Structmsg.SystemMsgActionInfo(\n                                    type = 12,\n                                    groupCode = 2230203,\n                                ),\n                                detailName = \"拒绝\",\n                            ),\n                            Structmsg.SystemMsgAction(\n                                name = \"同意\",\n                                result = \"已同意\",\n                                actionInfo = Structmsg.SystemMsgActionInfo(\n                                    type = 11,\n                                    groupCode = 2230203,\n                                ),\n                                detailName = \"同意\",\n                            ),\n                            Structmsg.SystemMsgAction(\n                                name = \"忽略\",\n                                result = \"已忽略\",\n                                actionInfo = Structmsg.SystemMsgActionInfo(\n                                    type = 14,\n                                    groupCode = 2230203,\n                                ),\n                                detailName = \"忽略\",\n                            ),\n                        ),\n                        groupCode = 2230203,\n                        actionUin = 1230001,\n                        groupMsgType = 2,\n                        groupInviterRole = 1,\n                        groupInfo = Structmsg.GroupInfo(\n                            appPrivilegeFlag = 67698880,\n                        ),\n                        reqUinNick = \"user3\",\n                        groupName = \"testtest\",\n                        actionUinNick = \"user1\",\n                        groupExtFlag = 1075905600,\n                        actionUinQqNick = \"user1\",\n                        reqUinGender = 255,\n                        c2cInviteJoinGroupFlag = 1,\n                    ),\n                )\n            ).apply {\n                val def = AnalyzeDefaultValuesMappingVisitor()\n                accept(def)\n                accept(RemoveDefaultValuesVisitor(def.mappings))\n            }.renderToString(ValueDescToStringRenderer())\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/test/visitors/ValueDescToStringRendererTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ExperimentalStdlibApi::class)\n\npackage net.mamoe.mirai.internal.testFramework.codegen.test.visitors\n\nimport net.mamoe.mirai.internal.testFramework.codegen.ValueDescAnalyzer\nimport net.mamoe.mirai.internal.testFramework.codegen.analyze\nimport net.mamoe.mirai.internal.testFramework.codegen.visitors.ValueDescToStringRenderer\nimport net.mamoe.mirai.internal.testFramework.codegen.visitors.renderToString\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class ValueDescToStringRendererTest {\n    private val renderer = ValueDescToStringRenderer()\n\n    @Test\n    fun `plain value`() {\n        assertEquals(\"\\\"str\\\"\", ValueDescAnalyzer.analyze(\"str\").renderToString(renderer))\n        assertEquals(\"1\", ValueDescAnalyzer.analyze(1).renderToString(renderer))\n    }\n\n    @Test\n    fun `object array value`() {\n        assertEquals(\n            \"arrayOf(\\\"str\\\", \\\"obj\\\")\",\n            ValueDescAnalyzer.analyze(arrayOf(\"str\", \"obj\")).renderToString(renderer)\n        )\n        assertEquals(\"arrayOf(1, 2)\", ValueDescAnalyzer.analyze(arrayOf(1, 2)).renderToString(renderer))\n    }\n\n    @Test\n    fun `object array value nested`() {\n        assertEquals(\n            \"\"\"\n                arrayOf(\n                    arrayOf(\"str\", \"obj\"), \n                    arrayOf(\"str\", \"obj\"), \n                )\n            \"\"\".trimIndent(),\n            ValueDescAnalyzer.analyze(arrayOf(arrayOf(\"str\", \"obj\"), arrayOf(\"str\", \"obj\"))).renderToString(renderer)\n        )\n        assertEquals(\n            \"\"\"\n                arrayOf(\n                    arrayOf(1, 2), \n                    arrayOf(1, 2), \n                )\n            \"\"\".trimIndent(),\n            ValueDescAnalyzer.analyze(arrayOf(arrayOf(1, 2), arrayOf(1, 2))).renderToString(renderer)\n        )\n    }\n\n    @Test\n    fun `primitive array value`() {\n        assertEquals(\"intArrayOf(1, 2)\", ValueDescAnalyzer.analyze(intArrayOf(1, 2)).renderToString(renderer))\n    }\n\n    @Test\n    fun `collection value`() {\n        assertEquals(\"mutableListOf(1, 2)\", ValueDescAnalyzer.analyze(listOf(1, 2)).renderToString(renderer))\n        assertEquals(\"mutableSetOf(1, 2)\", ValueDescAnalyzer.analyze(setOf(1, 2)).renderToString(renderer))\n    }\n\n    @Test\n    fun `collection value nested`() {\n        assertEquals(\n            \"\"\"\n                mutableListOf(\n                    mutableListOf(1, 2), \n                    mutableListOf(1, 2), \n                )\n            \"\"\".trimIndent(),\n            ValueDescAnalyzer.analyze(listOf(listOf(1, 2), listOf(1, 2))).renderToString(renderer)\n        )\n        assertEquals(\n            \"\"\"\n                mutableSetOf(\n                    mutableListOf(1, 2), \n                    mutableListOf(2, 2), \n                )\n            \"\"\".trimIndent(),\n            ValueDescAnalyzer.analyze(setOf(listOf(1, 2), listOf(2, 2))).renderToString(renderer)\n        )\n    }\n\n    @Test\n    fun `map value`() {\n        assertEquals(\n            \"\"\"\n            mutableMapOf(\n                1 to 2,\n                3 to 2,\n            )\n        \"\"\".trimIndent(), ValueDescAnalyzer.analyze(mapOf(1 to 2, 3 to 2)).renderToString(renderer)\n        )\n    }\n\n    @Test\n    fun `map value nested`() {\n        assertEquals(\n            \"\"\"\n            |mutableMapOf(\n            |    1 to 2,\n            |    5 to mutableMapOf(\n            |        1 to 2,\n            |        3 to 2,\n            |    ),\n            |)\n        \"\"\".trimMargin(),\n            ValueDescAnalyzer.analyze(mapOf(1 to 2, 5 to mapOf(1 to 2, 3 to 2)))\n                .renderToString(renderer)\n        )\n    }\n\n    data class MyClass(\n        val str: String,\n        val int: Int,\n        val self: MyClass?,\n    )\n\n    @Suppress(\"ClassName\")\n    data class `MyClass$3`(\n        val str: String,\n        val int: Int,\n        val self: `MyClass$3`?,\n    )\n\n    @Test\n    fun `class value`() {\n        assertEquals(\n            \"\"\"\n                ${MyClass::class.qualifiedName}(\n                    str = \"str\",\n                    int = 1,\n                    self = null,\n                )\n            \"\"\".trimIndent(),\n            ValueDescAnalyzer.analyze(MyClass(\"str\", 1, null)).renderToString(renderer)\n        )\n    }\n\n    @Test\n    fun `local class`() {\n        data class MyClass2(\n            val str: String,\n            val int: Int,\n            val self: MyClass2?,\n        )\n\n        assertEquals(\n            \"\"\"\n                ${MyClass2::class.simpleName}(\n                    str = \"str\",\n                    int = 1,\n                    self = null,\n                )\n            \"\"\".trimIndent(),\n            ValueDescAnalyzer.analyze(MyClass2(\"str\", 1, null)).renderToString(renderer)\n        )\n    }\n\n    @Test\n    fun `class with special name`() {\n        assertEquals(\n            \"\"\"\n                `${`MyClass$3`::class.qualifiedName}`(\n                    str = \"str\",\n                    int = 1,\n                    self = null,\n                )\n            \"\"\".trimIndent(),\n            ValueDescAnalyzer.analyze(`MyClass$3`(\"str\", 1, null)).renderToString(renderer)\n        )\n    }\n\n\n    @Test\n    fun `class value nested`() {\n        data class MyClass2(\n            val str: String,\n            val int: Int,\n            val self: MyClass2?,\n        )\n\n        assertEquals(\n            \"\"\"\n                ${MyClass::class.qualifiedName}(\n                    str = \"str\",\n                    int = 1,\n                    self = ${MyClass::class.qualifiedName}(\n                        str = \"str\",\n                        int = 1,\n                        self = null,\n                    ),\n                )\n            \"\"\".trimIndent(),\n            ValueDescAnalyzer.analyze(MyClass(\"str\", 1, MyClass(\"str\", 1, null))).renderToString(renderer)\n        )\n\n        assertEquals(\n            \"\"\"\n                ${MyClass2::class.simpleName}(\n                    str = \"str\",\n                    int = 1,\n                    self = ${MyClass2::class.simpleName}(\n                        str = \"str\",\n                        int = 1,\n                        self = null,\n                    ),\n                )\n            \"\"\".trimIndent(),\n            ValueDescAnalyzer.analyze(MyClass2(\"str\", 1, MyClass2(\"str\", 1, null))).renderToString(renderer)\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/visitor/ValueDescTransformer.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ExperimentalStdlibApi::class)\n\npackage net.mamoe.mirai.internal.testFramework.codegen.visitor\n\nimport net.mamoe.mirai.internal.testFramework.codegen.descriptors.*\nimport kotlin.reflect.KParameter\n\nabstract class ValueDescTransformer<D> : ValueDescVisitor<D, ValueDesc?> {\n    override fun visitValue(desc: ValueDesc, data: D): ValueDesc? {\n        return desc\n    }\n\n    override fun visitObjectArray(desc: ObjectArrayValueDesc, data: D): ValueDesc? {\n        val newElements = desc.elements.mapNotNull { element ->\n            element.acceptChildren(this, data)\n            element.accept(this, data)\n        }\n        return ObjectArrayValueDesc(desc.parent, desc.value, desc.origin, desc.arrayType, desc.elementType).apply {\n            elements.clear()\n            elements.addAll(newElements)\n        }\n    }\n\n    override fun visitPrimitiveArray(desc: PrimitiveArrayValueDesc, data: D): ValueDesc? {\n        val newElements = desc.elements.mapNotNull { element ->\n            element.acceptChildren(this, data)\n            element.accept(this, data)\n        }\n        return PrimitiveArrayValueDesc(desc.parent, desc.value, desc.origin, desc.arrayType, desc.elementType).apply {\n            elements.clear()\n            elements.addAll(newElements)\n        }\n    }\n\n    override fun visitCollection(desc: CollectionValueDesc, data: D): ValueDesc? {\n        val newElements = desc.elements.mapNotNull { element ->\n            element.acceptChildren(this, data)\n            element.accept(this, data)\n        }\n        return CollectionValueDesc(desc.parent, desc.value, desc.origin, desc.arrayType, desc.elementType).apply {\n            elements.clear()\n            elements.addAll(newElements)\n        }\n    }\n\n    override fun <T : Any> visitClass(desc: ClassValueDesc<T>, data: D): ValueDesc? {\n        val resultMap = mutableMapOf<KParameter, ValueDesc>()\n        for ((param, value) in desc.properties) {\n            value.accept(this, data)?.let { resultMap.put(param, it) }\n        }\n        return ClassValueDesc(desc.parent, desc.origin, resultMap)\n    }\n}\n\nabstract class ValueDescTransformerNotNull<D> : ValueDescTransformer<D>() {\n    private fun fail(): Nothing {\n        throw IllegalStateException(\"ValueDescTransformerNotNull cannot return null from its 'visit' functions.\")\n    }\n\n    override fun visitValue(desc: ValueDesc, data: D): ValueDesc {\n        return super.visitValue(desc, data) ?: fail()\n    }\n\n    override fun visitObjectArray(desc: ObjectArrayValueDesc, data: D): ValueDesc {\n        return super.visitObjectArray(desc, data) ?: fail()\n    }\n\n    override fun visitPrimitiveArray(desc: PrimitiveArrayValueDesc, data: D): ValueDesc {\n        return super.visitPrimitiveArray(desc, data) ?: fail()\n    }\n\n    override fun visitCollection(desc: CollectionValueDesc, data: D): ValueDesc {\n        return super.visitCollection(desc, data) ?: fail()\n    }\n\n    override fun <T : Any> visitClass(desc: ClassValueDesc<T>, data: D): ValueDesc {\n        return super.visitClass(desc, data) ?: fail()\n    }\n\n    override fun visitPlain(desc: PlainValueDesc, data: D): ValueDesc? {\n        return super.visitPlain(desc, data) ?: fail()\n    }\n\n    override fun visitArray(desc: CollectionLikeValueDesc, data: D): ValueDesc {\n        return super.visitArray(desc, data) ?: fail()\n    }\n\n    override fun visitMap(desc: MapValueDesc, data: D): ValueDesc {\n        return super.visitMap(desc, data) ?: fail()\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/visitor/ValueDescVisitor.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.codegen.visitor\n\nimport net.mamoe.mirai.internal.testFramework.codegen.descriptors.*\n\ninterface ValueDescVisitor<D, R> {\n    fun visitValue(desc: ValueDesc, data: D): R\n\n    fun visitPlain(desc: PlainValueDesc, data: D): R {\n        return visitValue(desc, data)\n    }\n\n    fun visitArray(desc: CollectionLikeValueDesc, data: D): R {\n        return visitValue(desc, data)\n    }\n\n    fun visitObjectArray(desc: ObjectArrayValueDesc, data: D): R {\n        return visitArray(desc, data)\n    }\n\n    fun visitCollection(desc: CollectionValueDesc, data: D): R {\n        return visitArray(desc, data)\n    }\n\n    fun visitMap(desc: MapValueDesc, data: D): R {\n        return visitValue(desc, data)\n    }\n\n    fun visitPrimitiveArray(desc: PrimitiveArrayValueDesc, data: D): R {\n        return visitArray(desc, data)\n    }\n\n    fun <T : Any> visitClass(desc: ClassValueDesc<T>, data: D): R {\n        return visitValue(desc, data)\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/visitor/ValueDescVisitorUnit.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.codegen.visitor\n\nimport net.mamoe.mirai.internal.testFramework.codegen.descriptors.ValueDesc\n\ninterface ValueDescVisitorUnit : ValueDescVisitor<Nothing?, Unit> {\n    override fun visitValue(desc: ValueDesc, data: Nothing?) {\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/visitors/AnalyzeDefaultValuesMappingVisitor.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.codegen.visitors\n\nimport net.mamoe.mirai.internal.testFramework.codegen.descriptors.ClassValueDesc\nimport net.mamoe.mirai.internal.testFramework.codegen.descriptors.ValueDesc\nimport net.mamoe.mirai.internal.testFramework.codegen.visitor.ValueDescVisitorUnit\nimport net.mamoe.mirai.utils.cast\nimport kotlin.reflect.KClass\nimport kotlin.reflect.KParameter\nimport kotlin.reflect.KProperty\nimport kotlin.reflect.KProperty1\nimport kotlin.reflect.full.memberProperties\nimport kotlin.reflect.full.primaryConstructor\n\nclass DefaultValuesMapping(\n    val forClass: KClass<*>,\n    val mapping: MutableMap<String, Any?> = mutableMapOf()\n) {\n    operator fun get(property: KProperty<*>): Any? = mapping[property.name]\n}\n\nclass AnalyzeDefaultValuesMappingVisitor : ValueDescVisitorUnit {\n    val mappings: MutableList<DefaultValuesMapping> = mutableListOf()\n\n    override fun visitValue(desc: ValueDesc, data: Nothing?) {\n        desc.acceptChildren(this, data)\n    }\n\n    override fun <T : Any> visitClass(desc: ClassValueDesc<T>, data: Nothing?) {\n        super.visitClass(desc, data)\n\n        if (mappings.any { it.forClass == desc.type }) return\n\n        val defaultInstance =\n            createInstanceWithMostDefaultValues(desc.type, desc.properties.mapValues { it.value.origin })\n\n        val optionalParameters = desc.type.primaryConstructor!!.parameters.filter { it.isOptional }\n\n        mappings.add(\n            DefaultValuesMapping(\n                desc.type,\n                optionalParameters.associateTo(mutableMapOf()) { param ->\n                    val value = findCorrespondingProperty(desc, param).get(defaultInstance)\n                    param.name!! to value\n                }\n            )\n        )\n    }\n\n\n    private fun <T : Any> findCorrespondingProperty(\n        desc: ClassValueDesc<T>,\n        param: KParameter\n    ) = desc.type.memberProperties.single { it.name == param.name }.cast<KProperty1<Any, Any>>()\n\n    private fun <T : Any> createInstanceWithMostDefaultValues(clazz: KClass<T>, arguments: Map<KParameter, Any?>): T {\n        val primaryConstructor = clazz.primaryConstructor ?: error(\"Type $clazz does not have primary constructor.\")\n        return primaryConstructor.callBy(arguments.filter { !it.key.isOptional })\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/visitors/ClassFormatter.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.codegen.visitors\n\nimport net.mamoe.mirai.internal.testFramework.codegen.descriptors.ClassValueDesc\n\ndata class ClassFormatterContext(\n    val desc: ClassValueDesc<*>,\n    val visitor: ValueDescToStringRenderer,\n    val rendererContext: RendererContext,\n)\n\nopen class ClassFormatter {\n    open fun formatClassName(context: ClassFormatterContext): String {\n        val name = context.desc.type.qualifiedName ?: context.desc.type.simpleName ?: context.desc.type.toString()\n        return wrapBacktickIfNecessary(name)\n    }\n\n    open fun formatClassProperty(context: ClassFormatterContext, propertyString: String?, valueString: String): String =\n        \"$propertyString = $valueString\"\n\n    companion object {\n        protected fun wrapBacktickIfNecessary(name: String) = if (name.contains(' ') || name.contains('$')) {\n            \"`$name`\"\n        } else name\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/visitors/Indenter.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.codegen.visitors\n\nfun interface Indenter {\n    fun indentize(string: String): String\n\n    object NoIndent : Indenter {\n        override fun indentize(string: String): String = string\n    }\n}\n\nclass WordingIndenter constructor(\n    private val separator: String,\n) : Indenter {\n\n    override fun indentize(string: String): String = \"$separator$string\"\n\n    companion object {\n        fun spacing(count: Int = 4): Indenter = WordingIndenter(\" \".repeat(count))\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/visitors/OptimizeByteArrayAsHexStringTransformer.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ExperimentalStdlibApi::class)\n\npackage net.mamoe.mirai.internal.testFramework.codegen.visitors\n\nimport net.mamoe.mirai.internal.testFramework.codegen.descriptors.*\nimport net.mamoe.mirai.internal.testFramework.codegen.visitor.ValueDescTransformerNotNull\nimport net.mamoe.mirai.utils.toUHexString\nimport kotlin.reflect.typeOf\n\n/**\n * If the byte array was from [String.toByteArray], transform it to the [String].\n * Otherwise, transform it as hex string.\n */\nopen class OptimizeByteArrayAsHexStringTransformer : ValueDescTransformerNotNull<Nothing?>() {\n    open fun transform(desc: CollectionLikeValueDesc, value: ByteArray): ValueDesc {\n        return if (isReadableString(value)) {\n            // prefers to show readable string\n            PlainValueDesc(\n                desc.parent,\n                value = \"\\\"${\n                    value.decodeToString().escapeQuotation()\n                }\\\".toByteArray() /* ${value.toUHexString()} */\",\n                origin = desc.origin\n            )\n        } else {\n            PlainValueDesc(\n                desc.parent,\n                value = \"\\\"${value.toUHexString()}\\\".hexToBytes()\",\n                origin = desc.origin\n            )\n        }\n\n    }\n\n    protected fun isReadableString(value: ByteArray) =\n        value.decodeToString().all { (it.isDefined() || it.isWhitespace()) && !it.isISOControl() }\n\n    override fun visitValue(desc: ValueDesc, data: Nothing?): ValueDesc {\n        desc.acceptChildren(this, data)\n        return super.visitValue(desc, data)\n    }\n\n    override fun visitObjectArray(desc: ObjectArrayValueDesc, data: Nothing?): ValueDesc {\n        if (desc.arrayType == arrayOfByteType) {\n            val array = desc.elements.mapNotNull { (it as? PlainValueDesc)?.value?.toByteOrNull() }.toByteArray()\n            if (array.size != desc.elements.size) return desc\n\n            return transform(desc, array)\n        }\n        return super.visitObjectArray(desc, data)\n    }\n\n    override fun visitPrimitiveArray(desc: PrimitiveArrayValueDesc, data: Nothing?): ValueDesc {\n        if (desc.value is ByteArray) {\n            return transform(desc, desc.value as ByteArray)\n        }\n        return super.visitPrimitiveArray(desc, data)\n    }\n\n    companion object {\n        private val arrayOfByteType = typeOf<Array<Byte>>()\n        private fun String.escapeQuotation(): String = buildString { this@escapeQuotation.escapeQuotationTo(this) }\n\n        private fun String.escapeQuotationTo(out: StringBuilder) {\n            for (element in this) {\n                when (element) {\n                    '\\\\' -> out.append(\"\\\\\\\\\")\n                    '\\n' -> out.append(\"\\\\n\")\n                    '\\r' -> out.append(\"\\\\r\")\n                    '\\t' -> out.append(\"\\\\t\")\n                    '\\\"' -> out.append(\"\\\\\\\"\")\n                    else -> out.append(element)\n                }\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/codegen/visitors/ValueDescToStringRenderer.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.codegen.visitors\n\nimport net.mamoe.mirai.internal.testFramework.codegen.descriptors.*\nimport net.mamoe.mirai.internal.testFramework.codegen.visitor.ValueDescVisitor\n\nclass RendererContext(\n    val indenter: Indenter,\n    val classFormatter: ClassFormatter = ClassFormatter()\n)\n\nfun ValueDesc.renderToString(\n    renderer: ValueDescToStringRenderer = ValueDescToStringRenderer(),\n    rendererContext: RendererContext = RendererContext(WordingIndenter.spacing(4))\n): String {\n    return accept(\n        renderer,\n        rendererContext\n    )\n}\n\nopen class ValueDescToStringRenderer : ValueDescVisitor<RendererContext, String> {\n    private inline val visitor get() = this\n\n    private inline fun Appendable.withIndent(indenter: Indenter, block: Appendable.() -> Unit) {\n        append(\n            buildString(block)\n                .lineSequence()\n                .map { indenter.indentize(it) }\n                .joinToString(\"\\n\")\n                .trimEnd { it != '\\n' && it.isWhitespace() }\n        )\n    }\n\n    override fun visitValue(desc: ValueDesc, data: RendererContext): String {\n        return desc.toString() // tentative fallback\n    }\n\n    override fun visitPlain(desc: PlainValueDesc, data: RendererContext): String {\n        return desc.value\n    }\n\n    override fun visitArray(desc: CollectionLikeValueDesc, data: RendererContext): String = buildString {\n        val array = desc.value\n\n        fun impl(funcName: String, elements: List<ValueDesc>) {\n            if (elements.any { it !is PlainValueDesc }) {\n                // complex types\n                append(funcName)\n                append('(')\n                appendLine()\n                withIndent(data.indenter) {\n                    val list = elements.toList()\n                    list.forEach { desc ->\n                        append(desc.accept(visitor, data))\n                        appendLine(\", \")\n                    }\n                }\n                append(')')\n            } else {\n                // primitive types\n                append(funcName)\n                append('(')\n                val list = elements.toList()\n                list.forEachIndexed { index, desc ->\n                    append(desc.accept(visitor, data))\n                    if (index != list.lastIndex) append(\", \")\n                }\n                append(')')\n            }\n        }\n\n        when (array) {\n            is Array<*> -> impl(\"arrayOf\", desc.elements)\n            is IntArray -> impl(\"intArrayOf\", desc.elements)\n            is ByteArray -> impl(\"byteArrayOf\", desc.elements)\n            is ShortArray -> impl(\"shortArrayOf\", desc.elements)\n            is CharArray -> impl(\"charArrayOf\", desc.elements)\n            is LongArray -> impl(\"longArrayOf\", desc.elements)\n            is FloatArray -> impl(\"floatArrayOf\", desc.elements)\n            is DoubleArray -> impl(\"doubleArrayOf\", desc.elements)\n            is BooleanArray -> impl(\"booleanArrayOf\", desc.elements)\n            is List<*> -> impl(\"mutableListOf\", desc.elements)\n            is Set<*> -> impl(\"mutableSetOf\", desc.elements)\n            else -> error(\"$array is not an array.\")\n        }\n    }\n\n    override fun visitMap(desc: MapValueDesc, data: RendererContext): String = buildString {\n        appendLine(\"mutableMapOf(\")\n        for ((key, value) in desc.elements) {\n            withIndent(data.indenter) {\n                append(key.accept(visitor, data))\n                append(\" to \")\n                append(value.accept(visitor, data))\n                appendLine(\",\")\n            }\n        }\n        append(\")\")\n    }\n\n    override fun <T : Any> visitClass(desc: ClassValueDesc<T>, data: RendererContext): String = buildString {\n        val classFormatterContext = ClassFormatterContext(desc, visitor, data)\n        appendLine(\"${data.classFormatter.formatClassName(classFormatterContext)}(\")\n        for ((param, valueDesc) in desc.properties) {\n            withIndent(data.indenter) {\n                append(\n                    data.classFormatter.formatClassProperty(\n                        classFormatterContext,\n                        param.name,\n                        valueDesc.accept(visitor, data)\n                    )\n                )\n            }\n            appendLine(\",\")\n        }\n        append(\")\")\n    }\n\n//    open fun renderClassName(desc: ClassValueDesc<*>): String {\n//        val name = desc.type.qualifiedName ?: desc.type.java.name\n//        return wrapBacktickIfNecessary(name)\n//    }\n\n    companion object {\n        protected fun wrapBacktickIfNecessary(name: String) = if (name.contains(' ') || name.contains('$')) {\n            \"`$name`\"\n        } else name\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/desensitizer/Desensitizer.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.desensitizer\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.decodeFromString\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.internal.testFramework.codegen.ValueDescAnalyzer\nimport net.mamoe.mirai.internal.testFramework.codegen.analyze\nimport net.mamoe.mirai.internal.testFramework.codegen.descriptors.*\nimport net.mamoe.mirai.internal.testFramework.codegen.removeDefaultValues\nimport net.mamoe.mirai.internal.testFramework.codegen.visitor.ValueDescTransformerNotNull\nimport net.mamoe.mirai.internal.testFramework.codegen.visitors.OptimizeByteArrayAsHexStringTransformer\nimport net.mamoe.mirai.internal.testFramework.codegen.visitors.renderToString\nimport net.mamoe.mirai.internal.utils.io.NestedStructure\nimport net.mamoe.mirai.internal.utils.io.NestedStructureDesensitizer\nimport net.mamoe.mirai.internal.utils.io.ProtocolStruct\nimport net.mamoe.mirai.utils.*\nimport net.mamoe.yamlkt.Yaml\nimport net.mamoe.yamlkt.YamlBuilder\nimport java.io.File\nimport java.net.URL\nimport kotlin.reflect.KType\nimport kotlin.reflect.full.createInstance\nimport kotlin.reflect.full.findAnnotation\nimport kotlin.reflect.typeOf\n\nprivate val logger: MiraiLogger by lazy { MiraiLogger.Factory.create(Desensitizer::class) }\n\ninternal class Desensitizer private constructor(\n    val rules: Map<String, String>,\n) {\n    fun desensitize(value: String): String {\n        return rules.entries.fold(value) { acc, entry ->\n            acc.replace(entry.key, entry.value)\n        }\n    }\n\n    fun desensitize(value: ByteArray): ByteArray {\n        return desensitize(value.toUHexString()).hexToBytes()\n    }\n\n    fun desensitize(value: Array<Byte>): Array<Byte> {\n        return desensitize(value.toByteArray().toUHexString()).hexToBytes().toTypedArray()\n    }\n\n\n    companion object {\n        private val instance by lateinitMutableProperty {\n            create(\n                run<Map<String, String>> {\n\n                    val filename =\n                        systemProp(\"mirai.network.recording.desensitization.filepath\", \"local.desensitization.yml\")\n\n                    val file: URL? =\n                        File(filename).takeIf { it.isFile }?.toURI()?.toURL()\n                            ?: Thread.currentThread().contextClassLoader?.getResource(filename)\n                            ?: Thread.currentThread().contextClassLoader?.getResource(\"recording/configs/$filename\")\n\n                    file?.readText()?.let { format.decodeFromString(it) } ?: kotlin.run {\n                        logger.warning { \"Couldn't find desensitization rules. You can set by system property 'mirai.network.recording.desensitization.filepath' to path to the desensitization configuration file, or use the 'local.desensitization.yml' by default.\" }\n                        mapOf()\n                    }\n                }.also {\n                    logger.info { \"Loaded ${it.size} desensitization rules.\" }\n                }\n            )\n        }\n\n        /**\n         * Loaded from local.desensitization.yml\n         */\n        val local get() = instance\n\n        fun desensitize(string: String): String = instance.desensitize(string)\n\n\n        fun ValueDescAnalyzer.generateAndDesensitize(\n            value: Any?,\n            type: KType,\n            desensitizer: Desensitizer = instance,\n        ): String {\n            return analyze(value, type)\n                .transform(OptimizeByteArrayAsHexStringTransformer())\n                .removeDefaultValues()\n                .transform(DesensitizationVisitor(desensitizer))\n                .renderToString()\n        }\n\n        inline fun <reified T> ValueDescAnalyzer.generateAndDesensitize(\n            value: T,\n            desensitizer: Desensitizer = instance,\n        ): String = generateAndDesensitize(value, typeOf<T>(), desensitizer)\n\n\n        fun create(rules: Map<String, String>): Desensitizer {\n            val map = HashMap<String, String>()\n            map.putAll(rules)\n\n            fun addExtraRulesForString(value: String, replacement: String) {\n                // in proto, strings have lengths field, we must ensure that their lengths are intact.\n\n                when {\n                    value.length > replacement.length -> {\n                        map[value.toByteArray().toUHexString()] =\n                            (replacement + \"0\".repeat(value.length - replacement.length)).toByteArray()\n                                .toUHexString() // fix it to the same length\n                    }\n                    value.length < replacement.length -> {\n                        error(\"Replacement '$replacement' must not be longer than '$value'\")\n                    }\n                    else -> {\n                        map.getOrPut(value.toByteArray().toUHexString()) { replacement.toByteArray().toUHexString() }\n                    }\n                }\n            }\n\n            fun addExtraRulesForNumber(value: Long, replacement: Long) {\n                map.getOrPut(value.toString()) { replacement.toString() }\n\n                // 某些地方会 readLong, readInt, desensitizer visit 不到这些目标\n                map.getOrPut(value.toByteArray().toUHexString()) { replacement.toByteArray().toUHexString() }\n\n                if (value in Int.MIN_VALUE.toLong()..UInt.MAX_VALUE.toLong()\n                    && replacement in Int.MIN_VALUE.toLong()..UInt.MAX_VALUE.toLong()\n                ) {\n                    map.getOrPut(\n                        value.toInt().toByteArray().toUHexString()\n                    ) {\n                        replacement.toInt().toByteArray().toUHexString()\n                    }\n                }\n                // 不需要处理 proto, 所有 proto 都会被反序列化为结构类型由 desensitizer 处理\n            }\n\n            rules.forEach { (t, u) ->\n                if (t.toLongOrNull() != null && u.toLongOrNull() != null) {\n                    addExtraRulesForNumber(t.toLong(), u.toLong())\n                    @Suppress(\"DEPRECATION\")\n                    addExtraRulesForNumber(\n                        Mirai.calculateGroupUinByGroupCode(t.toLong()),\n                        Mirai.calculateGroupUinByGroupCode(u.toLong())\n                    ) // putIfAbsent, code prevails\n                }\n\n                addExtraRulesForString(t, u)\n            }\n\n            return Desensitizer(map)\n        }\n    }\n}\n\nprivate val format = Yaml {\n    // one-line\n    classSerialization = YamlBuilder.MapSerialization.FLOW_MAP\n    mapSerialization = YamlBuilder.MapSerialization.FLOW_MAP\n    listSerialization = YamlBuilder.ListSerialization.FLOW_SEQUENCE\n    stringSerialization = YamlBuilder.StringSerialization.DOUBLE_QUOTATION\n    encodeDefaultValues = false\n}\n\n\ninternal class DesensitizationVisitor(\n    private val desensitizer: Desensitizer,\n) : ValueDescTransformerNotNull<Nothing?>() {\n    override fun visitValue(desc: ValueDesc, data: Nothing?): ValueDesc {\n        desc.acceptChildren(this, data)\n        return super.visitValue(desc, data)\n    }\n\n    override fun visitPlain(desc: PlainValueDesc, data: Nothing?): ValueDesc {\n        return PlainValueDesc(desc.parent, desensitizer.desensitize(desc.value), desc.origin)\n    }\n\n    override fun visitObjectArray(desc: ObjectArrayValueDesc, data: Nothing?): ValueDesc {\n        return if (\n            desc.arrayType.arguments.firstOrNull()?.type?.classifier == Byte::class\n            || (desc.value as? Array<*>)?.getOrNull(0) is Byte\n        ) {\n            @Suppress(\"UNCHECKED_CAST\")\n            ObjectArrayValueDesc(\n                desc.parent,\n                desensitizer.desensitize(desc.value as Array<Byte>),\n                desc.origin,\n                desc.arrayType,\n                desc.elementType\n            )\n        } else {\n            super.visitObjectArray(desc, data)\n        }\n    }\n\n    override fun visitPrimitiveArray(desc: PrimitiveArrayValueDesc, data: Nothing?): ValueDesc {\n        return if (desc.value is ByteArray) {\n            PrimitiveArrayValueDesc(\n                desc.parent,\n                desensitizer.desensitize(desc.value as ByteArray),\n                desc.origin,\n                desc.arrayType,\n                desc.elementType\n            )\n        } else super.visitPrimitiveArray(desc, data)\n    }\n\n    override fun <T : Any> visitClass(desc: ClassValueDesc<T>, data: Nothing?): ValueDesc {\n        ClassValueDesc(desc.parent, desc.origin, desc.properties.toMutableMap().apply {\n            replaceAll() { key, value ->\n                val annotation = key.findAnnotation<NestedStructure>()\n                if (annotation != null && value.origin is ByteArray) {\n                    val instance = annotation.serializer.objectInstance ?: annotation.serializer.createInstance()\n\n                    val result = instance.cast<NestedStructureDesensitizer<ProtocolStruct, ProtocolStruct>>()\n                        .deserialize(desc.origin as ProtocolStruct, value.origin as ByteArray)\n                        ?.let { ValueDescAnalyzer.analyze(it) }\n\n                    if (result == null) {\n                        value\n                    } else {\n                        val generate = ValueDescAnalyzer.analyze(result)\n                            .transform(OptimizeByteArrayAsHexStringTransformer())\n                            .transform(DesensitizationVisitor(desensitizer))\n                            .renderToString()\n\n                        PlainValueDesc(\n                            desc,\n                            \"$generate.toByteArray(${result::class.qualifiedName}.serializer())\",\n                            value.origin\n                        )\n                    }\n                } else value\n            }\n        }).let {\n            return super.visitClass(it, data)\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/message/protocol/MessageDecodingRecorder.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.message.protocol\n\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoder\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderContext\nimport net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody\nimport net.mamoe.mirai.internal.testFramework.codegen.ValueDescAnalyzer\nimport net.mamoe.mirai.internal.testFramework.desensitizer.Desensitizer.Companion.generateAndDesensitize\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.debug\n\ninternal class MessageDecodingRecorder(\n    private val logger: MiraiLogger = MiraiLogger.Factory.create(MessageDecodingRecorder::class)\n) : MessageDecoder {\n    override suspend fun MessageDecoderContext.process(data: ImMsgBody.Elem) {\n        logger.debug {\n            \"\\n\" + ValueDescAnalyzer.generateAndDesensitize(data)\n        }\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/notice/RecordingNoticeHandler.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.notice\n\nimport kotlinx.atomicfu.atomic\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.mamoe.mirai.internal.network.components.NoticePipelineContext\nimport net.mamoe.mirai.internal.network.components.SimpleNoticeProcessor\nimport net.mamoe.mirai.internal.testFramework.codegen.ValueDescAnalyzer\nimport net.mamoe.mirai.internal.testFramework.desensitizer.Desensitizer.Companion.generateAndDesensitize\nimport net.mamoe.mirai.internal.utils.io.ProtocolStruct\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.info\n\n\n/**\n * ### How to use recorder?\n *\n * 0. Configure desensitization. See mirai-core/src/commonTest/recording/configs/desensitization.yml\n * 1. Inject the recorder as follows:\n *\n * ```\n * bot.components[NoticeProcessorPipeline].registerProcessor(recorder)\n * ```\n *\n * 2. Do something\n * 3. Recorded values are shown in logs. Check 'decoded' to ensure that all sensitive values are replaced.\n */\ninternal class RecordingNoticeProcessor : SimpleNoticeProcessor<ProtocolStruct>(type()) {\n    private val id = atomic(0)\n    private val lock = Mutex()\n\n    override suspend fun NoticePipelineContext.processImpl(data: ProtocolStruct) {\n        lock.withLock {\n            id.getAndDecrement()\n            logger.info { \"Recorded #${id.value} ${data::class.simpleName}\" }\n            logger.info { \"Desensitized: \\n\\n\\u001B[0m\" + ValueDescAnalyzer.generateAndDesensitize(data) + \"\\n\\n\" }\n        }\n    }\n}\n\nprivate val logger: MiraiLogger by lazy { MiraiLogger.Factory.create(RecordingNoticeProcessor::class) }"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/rules/DisabledOnPlatform.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.rules\n\nimport net.mamoe.mirai.internal.testFramework.Platform\nimport net.mamoe.mirai.internal.testFramework.currentPlatform\nimport org.junit.jupiter.api.extension.ConditionEvaluationResult\nimport org.junit.jupiter.api.extension.ExecutionCondition\nimport org.junit.jupiter.api.extension.ExtendWith\nimport org.junit.jupiter.api.extension.ExtensionContext\nimport org.junit.platform.commons.util.AnnotationUtils\nimport kotlin.jvm.optionals.getOrNull\nimport kotlin.reflect.KClass\nimport kotlin.reflect.full.isSuperclassOf\n\n\n@Suppress(\"NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS\") // magic\nactual typealias DisabledOnJvmLikePlatform = DisabledOnPlatform\n\n@Target(\n    AnnotationTarget.CLASS,\n    AnnotationTarget.FUNCTION,\n    AnnotationTarget.PROPERTY_GETTER,\n    AnnotationTarget.PROPERTY_SETTER\n)\n@Retention(AnnotationRetention.RUNTIME)\n@MustBeDocumented\n@ExtendWith(DisabledOnPlatformCondition::class)\nannotation class DisabledOnPlatform(\n    vararg val values: KClass<out Platform>\n)\n\ninternal object DisabledOnPlatformCondition : ExecutionCondition {\n    private val ENABLED_BY_DEFAULT = ConditionEvaluationResult.enabled(\"@DisabledOnPlatform is not present\")\n\n    override fun evaluateExecutionCondition(context: ExtensionContext?): ConditionEvaluationResult {\n        val annotation = AnnotationUtils.findAnnotation(\n            context!!.element,\n            DisabledOnPlatform::class.java\n        ).getOrNull() ?: return ENABLED_BY_DEFAULT\n\n        for (value in annotation.values) {\n            check(value != Platform::class) { \"@DisabledOnPlatform(Platform::class) is invalid. Use `@Disabled` to disable on all platforms\" }\n        }\n\n        val currentPlatform = currentPlatform()\n        val currentPlatformClass = currentPlatform::class\n        annotation.values.find { it.isSuperclassOf(currentPlatformClass) }\n            ?.let {\n                return ConditionEvaluationResult.disabled(\"@DisabledOnPlatform(${it.simpleName}), current = $currentPlatform\")\n            }\n        return ENABLED_BY_DEFAULT\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/testFramework/test/RecordingNoticeProcessorTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework.test\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.internal.testFramework.Platform\nimport net.mamoe.mirai.internal.testFramework.desensitizer.Desensitizer\nimport net.mamoe.mirai.internal.testFramework.rules.DisabledOnPlatform\nimport net.mamoe.mirai.internal.utils.io.ProtocolStruct\nimport net.mamoe.yamlkt.Yaml\nimport net.mamoe.yamlkt.YamlBuilder\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class RecordingNoticeProcessorTest : AbstractTest() {\n\n    @Serializable\n    data class MyProtocolStruct(\n        val value: String\n    ) : ProtocolStruct\n\n    @Test\n    @DisabledOnPlatform(Platform.Android::class) // resources not available\n    fun `test plain desensitization`() {\n        val text = loadDesensitizationRules()\n        val desensitizer = Desensitizer.create(Yaml.decodeFromString(text))\n\n\n        assertEquals(\n            \"\"\"\n            \"111\": s1av12sad3\n            \"222\": s1av12sad3\n        \"\"\".trim(),\n            desensitizer.desensitize(\n                \"\"\"\n            \"123456789\": s1av12sad3\n            \"987654321\": s1av12sad3\n        \"\"\".trim()\n            )\n        )\n    }\n\n\n    @Serializable\n    data class TestProto(\n        @ProtoNumber(1) val proto: Proto\n    ) : ProtocolStruct {\n        @Serializable\n        data class Proto(\n            @ProtoNumber(1) val int: Int\n        )\n    }\n\n    @Serializable\n    data class ByteArrayWrapper(\n        val value: ByteArray\n    )\n\n    val format = Yaml {\n        // one-line\n        classSerialization = YamlBuilder.MapSerialization.FLOW_MAP\n        mapSerialization = YamlBuilder.MapSerialization.FLOW_MAP\n        listSerialization = YamlBuilder.ListSerialization.FLOW_SEQUENCE\n        stringSerialization = YamlBuilder.StringSerialization.DOUBLE_QUOTATION\n        encodeDefaultValues = false\n    }\n\n\n    @Test\n    @DisabledOnPlatform(Platform.Android::class)\n    fun `test long as byte array desensitization`() {\n        val text = loadDesensitizationRules()\n        val desensitizer = Desensitizer.create(Yaml.decodeFromString(text))\n\n        val proto = TestProto(TestProto.Proto(123456789))\n\n        assertEquals(\n            TestProto(TestProto.Proto(111)),\n            format.decodeFromString(\n                TestProto.serializer(),\n                desensitizer.desensitize(format.encodeToString(TestProto.serializer(), proto))\n            )\n        )\n    }\n\n    private fun loadDesensitizationRules() =\n        ((Thread.currentThread().contextClassLoader ?: this::class.java.classLoader)\n            .getResource(\"recording/configs/test.desensitization.yml\")!!).readText()\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/utils/CombinedExternalResourceTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport io.ktor.utils.io.core.*\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertTrue\nimport kotlin.text.toByteArray\n\nclass CombinedExternalResourceTest : AbstractTest() {\n    @Test\n    fun `work`() {\n        val res1 = STRING_1.toByteArray().toExternalResource()\n        val res2 = STRING_2.toByteArray().toExternalResource()\n\n        val combined1 = buildPacket {\n            res1.input().use { it.copyTo(this) }\n            res2.input().use { it.copyTo(this) }\n        }.readBytes().toExternalResource()\n\n        val combined2 = CombinedExternalResource(res1, res2)\n\n        assertEquals(combined1.size, combined2.size)\n        assertTrue { combined1.md5.contentEquals(combined2.md5) }\n        assertTrue { combined1.sha1.contentEquals(combined2.sha1) }\n    }\n\n\n    private val STRING_1 = \"\"\"\n        b4FNDvv49gMInP29t82fPJuWQ4ArG1k1YVeCN3UReWXplm4H2S4Rp7zTpt8WXRQEtTL7VemlTIytPbwUkus7qgPVsyUCFreRR1vB3QhRznXqcT06fDkXJQJKyyBGEdwddNWZAkqZcdrOk679sG14kKK5GexaQUmdfTivT5VPO8w1yoWPcUHPfpjB0shCEzjkHI84LJbWNRCVjoZhy0jZAKZxLrsi1sGhl30QcXCFnHpPhWbED8Er9c8gVbjYsG8ejaUlbeNNdKW3GoOpgjFLbwZoQI4QZZgvP5jhBWUPiMG3MCcPlYRSgTf70JpDVTE0YOLhXdJJxz87S8MR4M7rU0WO7ZRkoFOQpFHdmfMmJxbiATHHkOyHVhu1mvA0L72MNtDQP5GcKlDbDcdJL7om4FmekAVVnh7R\n    \"\"\".trimIndent()\n    private val STRING_2 = \"\"\"\n        FdDoAZt2hJkKAfEWBNWO44R0tJRmApqIwHDD05oW0jyLVVPOdcPaFjY1muYM1qa6jbhZppWYm1oOmgbpFgdPZRYDgzznR0kSapdqXeSSevV4ww4E1U71ELDMsq4f0a1Y8K6UxIOpQl1n20eoe80fHuXKkfN6kbhROBXcwGbiFRpPg5k8G5hCerQQunQyNoeEZrbKacq2OYkOEJV57LuSbBTF4FMZYxCEp1a8omnK1EUHC1Go5pGy0dovz78KpCshPr7MHNMnRu0FiuJ1WYT8ri8iXWsTx3AMxHRjCYfJgrtqc86L3HW0V6Wr8FqFMJLtFl4PgXj5etfRSaaqRJFIZ3nWiRqW48JMRqdGRvLTUWs1Zoa8H11bych18MVypUQJOyxghLLJw0ZP4CvSNUeJOEMitxFxyzjC\n    \"\"\".trimIndent()\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/utils/StructureToStringTransformerNew.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport net.mamoe.mirai.internal.testFramework.codegen.ValueDescAnalyzer\nimport net.mamoe.mirai.internal.testFramework.codegen.analyze\nimport net.mamoe.mirai.internal.testFramework.codegen.descriptors.transform\nimport net.mamoe.mirai.internal.testFramework.codegen.removeDefaultValues\nimport net.mamoe.mirai.internal.testFramework.codegen.visitors.OptimizeByteArrayAsHexStringTransformer\nimport net.mamoe.mirai.internal.testFramework.codegen.visitors.renderToString\nimport net.mamoe.mirai.internal.testFramework.desensitizer.DesensitizationVisitor\nimport net.mamoe.mirai.internal.testFramework.desensitizer.Desensitizer\nimport net.mamoe.mirai.utils.StructureToStringTransformer\nimport net.mamoe.mirai.utils.StructureToStringTransformerLegacy\n\ninternal class StructureToStringTransformerNew : StructureToStringTransformer {\n    private val legacy = StructureToStringTransformerLegacy()\n\n    override fun transform(any: Any?): String =\n        kotlin.runCatching {\n            ValueDescAnalyzer.analyze(any)\n                .transform(OptimizeByteArrayAsHexStringTransformer())\n                .removeDefaultValues()\n                .renderToString()\n        }.getOrNull() ?: legacy.transform(any)\n\n    override fun transformAndDesensitize(any: Any?): String {\n        val desensitizer = Desensitizer.local\n        return kotlin.runCatching {\n            ValueDescAnalyzer.analyze(any)\n                .transform(OptimizeByteArrayAsHexStringTransformer())\n                .removeDefaultValues()\n                .transform(DesensitizationVisitor(desensitizer))\n                .renderToString()\n        }.getOrNull() ?: legacy.transform(any)\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/kotlin/utils/test/StructureToStringTransformerNewTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils.test\n\nimport net.mamoe.mirai.internal.test.AbstractTest\nimport net.mamoe.mirai.internal.utils.StructureToStringTransformerNew\nimport net.mamoe.mirai.utils.StructureToStringTransformer\nimport net.mamoe.mirai.utils.structureToString\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertIs\n\ninternal class StructureToStringTransformerNewTest : AbstractTest() {\n\n    data class MyClass(\n        val value: String\n    )\n\n    @Test\n    fun `can load service`() {\n        assertIs<StructureToStringTransformerNew>(StructureToStringTransformer.instance)\n    }\n\n    @Test\n    fun `can use`() {\n        assertEquals(\n            \"\"\"\n            ${MyClass::class.qualifiedName}(\n                value = \"1\",\n            )\n        \"\"\".trimIndent(),\n            MyClass(\"1\").structureToString()\n        )\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmBaseTest/resources/META-INF/services/net.mamoe.mirai.utils.StructureToStringTransformer",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\nnet.mamoe.mirai.internal.utils.StructureToStringTransformerNew"
  },
  {
    "path": "mirai-core/src/jvmMain/kotlin/package.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal"
  },
  {
    "path": "mirai-core/src/jvmMain/kotlin/utils/crypto/EcdhJvmDesktop.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils.crypto\n\nimport org.bouncycastle.jce.provider.BouncyCastleProvider\n\ninternal actual fun Ecdh.Companion.create(): Ecdh<*, *> =\n    kotlin.runCatching {\n        // try platform default EC/ECDH implementations first, which may have better performance\n        // note that they may not work properly but being created successfully\n        JceEcdh().apply {\n            val keyPair = generateKeyPair()\n            calculateShareKey(keyPair.public, keyPair.private)\n            val encoded = exportPublicKey(keyPair.public)\n            importPublicKey(encoded)\n        }\n    }.getOrElse {\n        // fallback to BouncyCastle\n        JceEcdhWithProvider(BouncyCastleProvider())\n    }"
  },
  {
    "path": "mirai-core/src/jvmTest/README.md",
    "content": "# mirai-core - jvm test - debug run\n\n-------------\n\n!! IMPORTANT !!\n\n在 `jvmTest` 直接启动 `mirai-core` 前, 您必须先阅读此篇的内容\n\n否则你可能会遇到一些问题\n\n-----------------------------------\n\n## 测试启动点配置\n\n在直接启动前, 首先需要手动创建一个专属于自己本地测试的测试启动点\n\n> mirai-core 自带 `jvmTest/kotlin/local` 的忽略, 您只需要在 `jvmTest/kotlin` 手动创建此文件夹即可\n\n在 `jvmTest/kotlin/local` 创建一个新的 kotlin 文件, 并写入以下内容\n\n```kotlin\nfun main() {\n    prepareEnvironmentForDebugRun()\n    // .....\n\n    val bot = DebugRunHelper.newBot(/* ..... */) {\n    }\n    bot as QQAndroidBot\n\n    runBlocking {\n        bot.login()\n\n        bot.eventChannel.subscribeAlways<MessageEvent> {\n            //......\n        }\n        bot.join()\n    }\n}\n```\n\n---------------\n\n## 测试数据存储\n\nIntellij IDEA 直接以默认配置运行程序时, 程序的工作目录都是顶层根目录 (`$rootProject/`)\n\n即在测试代码中的文件相关的操作都是相对 `$rootProject` 而言的\n\n`$rootProject/test` 在 `$rootProject/.gitignore` 中被声明完全忽略\n\n所以 `$rootProject/test` 可以用于存储测试数据, 如果目前本地环境中没有 `test` 文件夹, 可以手动创建\n"
  },
  {
    "path": "mirai-core/src/jvmTest/kotlin/AtomicResizeCacheListTest.kt",
    "content": "/*\n * Copyright 2019-2020 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal\n\n/*\n\ninternal class AtomicResizeCacheListTest {\n    @Test\n    fun testDuplication() {\n        val list = AtomicResizeCacheList<Int>(1000)\n        assertTrue { list.ensureNoDuplication(1) }\n        assertFalse { list.ensureNoDuplication(1) }\n        assertTrue { list.ensureNoDuplication(1) }\n    }\n\n    @Test\n    fun testRetention() {\n        val list = AtomicResizeCacheList<Int>(1000)\n        assertTrue { list.ensureNoDuplication(1) }\n        runBlocking {\n            delay(1010)\n            // because no concurrency guaranteed on same elements\n            assertFalse { list.ensureNoDuplication(1) }\n            assertTrue { list.ensureNoDuplication(2) }\n            // outdated elements are now cleaned\n            assertTrue { list.ensureNoDuplication(1) }\n        }\n    }\n}*/"
  },
  {
    "path": "mirai-core/src/jvmTest/kotlin/JavaApiTests.java",
    "content": "/*\n * Copyright 2019-2020 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\nimport kotlin.coroutines.CoroutineContext;\nimport net.mamoe.mirai.Bot;\nimport net.mamoe.mirai.BotFactory;\nimport net.mamoe.mirai.contact.Contact;\nimport net.mamoe.mirai.contact.Group;\nimport net.mamoe.mirai.event.EventHandler;\nimport net.mamoe.mirai.event.ListeningStatus;\nimport net.mamoe.mirai.event.SimpleListenerHost;\nimport net.mamoe.mirai.event.events.GroupMessageEvent;\nimport net.mamoe.mirai.event.events.MessageEvent;\nimport net.mamoe.mirai.message.data.Image;\nimport net.mamoe.mirai.message.data.MessageChain;\nimport net.mamoe.mirai.message.data.MessageSource;\nimport net.mamoe.mirai.message.data.MessageUtils;\nimport net.mamoe.mirai.utils.BotConfiguration;\nimport net.mamoe.mirai.utils.ExternalResource;\nimport org.jetbrains.annotations.NotNull;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.RandomAccessFile;\n\n/**\n * 仅用来测试调用，不会被单元测试运行\n */\n@SuppressWarnings({\"unused\", \"UnusedAssignment\"})\npublic class JavaApiTests {\n    @NotNull\n    Bot bot;\n\n    public JavaApiTests(@NotNull Bot bot) {\n        this.bot = bot;\n    }\n\n    public void generalCalls() {\n        bot.login();\n\n        bot.getAsFriend().sendMessage(\"test\"); // blocking bridge\n        bot.getOtherClients().getOrFail(1).getBot();\n    }\n\n    public void events() {\n        bot.getEventChannel().subscribe(MessageEvent.class, event -> ListeningStatus.LISTENING);\n\n        bot.getEventChannel().subscribeAlways(GroupMessageEvent.class, event -> {\n            Bot b = event.getBot();\n\n        });\n\n        SimpleListenerHost slh = new SimpleListenerHost() {\n\n            @Override\n            public void handleException(@NotNull CoroutineContext context, @NotNull Throwable exception) {\n                super.handleException(context, exception);\n            }\n\n            @EventHandler\n            public void onMsg(GroupMessageEvent e) {\n\n            }\n        };\n\n        bot.getEventChannel().registerListenerHost(slh);\n    }\n\n    @NotNull\n    private <T> T magic() {\n        throw new RuntimeException();\n    }\n\n    @NotNull\n    MessageChain chain = magic();\n\n    @NotNull\n    Contact contact = magic();\n\n    public void messages() {\n\n        Image image = (Image) chain.stream().filter(Image.class::isInstance).findFirst().orElse(null);\n\n        assert image != null;\n\n        String url = Image.queryUrl(image);\n        Image.fromId(\"123\");\n\n        MessageSource source = magic();\n\n        MessageUtils.getBot(source);\n        MessageUtils.calculateImageMd5(image);\n        MessageUtils.isContentEmpty(image);\n\n        MessageSource.quote(source);\n        MessageSource.quote(chain);\n\n        MessageSource.recall(source);\n    }\n\n    ExternalResource resource = magic();\n\n    public void externalResource() throws IOException {\n        resource.inputStream();\n\n\n        contact.uploadImage(resource); // base method\n\n\n        ExternalResource r;\n\n        r = ExternalResource.create((InputStream) magic()); // throws IOException\n        r = ExternalResource.create((File) magic());\n        r = ExternalResource.create((RandomAccessFile) magic());\n\n        ExternalResource.uploadAsImage(r, contact);  // returns Image\n\n        ExternalResource.sendAsImage(r, contact);    // returns MessageReceipt\n\n\n        ExternalResource.uploadAsImage((ExternalResource) magic(), contact);    // returns Image\n        ExternalResource.uploadAsImage((File) magic(), contact);                // returns Image\n        ExternalResource.uploadAsImage((InputStream) magic(), contact);         // returns Image\n\n        ExternalResource.sendAsImage((ExternalResource) magic(), contact);  // returns MessageReceipt\n        ExternalResource.sendAsImage((File) magic(), contact);              // returns MessageReceipt\n        ExternalResource.sendAsImage((InputStream) magic(), contact);       // returns MessageReceipt\n\n        Contact.uploadImage(contact, (ExternalResource) magic());   // returns Image\n        Contact.uploadImage(contact, (File) magic());               // returns Image\n        Contact.uploadImage(contact, (InputStream) magic());        // returns Image\n\n        Contact.sendImage(contact, (ExternalResource) magic());     // returns MessageReceipt\n        Contact.sendImage(contact, (File) magic());                 // returns MessageReceipt\n        Contact.sendImage(contact, (InputStream) magic());          // returns MessageReceipt\n\n        // experimental\n        ExternalResource.uploadAsVoice(magic(), (Group) contact);\n    }\n\n    public static void main(String[] args) {\n        Bot bot = BotFactory.INSTANCE.newBot(11, \"\", configuration -> {\n            configuration.fileBasedDeviceInfo();\n            configuration.setProtocol(BotConfiguration.MiraiProtocol.ANDROID_PHONE);\n        });\n\n        new JavaApiTests(bot);\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/jvmTest/kotlin/bootstrap/RunMessageDecodingRecorder.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.bootstrap\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.BotFactory\nimport net.mamoe.mirai.internal.asQQAndroidBot\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocolFacade\nimport net.mamoe.mirai.internal.message.protocol.decode.MessageDecoderProcessor\nimport net.mamoe.mirai.internal.testFramework.desensitizer.Desensitizer\nimport net.mamoe.mirai.internal.testFramework.message.protocol.MessageDecodingRecorder\nimport net.mamoe.mirai.utils.BotConfiguration\nimport net.mamoe.mirai.utils.readResource\nimport net.mamoe.yamlkt.Yaml\nimport kotlin.concurrent.thread\n\ninternal suspend fun main() {\n    Runtime.getRuntime().addShutdownHook(thread(start = false) {\n        Bot.instances.forEach {\n            it.close()\n        }\n    })\n\n\n    Desensitizer.local.desensitize(\"\") // verify rules\n\n    val account = Yaml.decodeFromString(LocalAccount.serializer(), readResource(\"local.account.yml\"))\n    val bot = BotFactory.newBot(account.id, account.password) {\n        enableContactCache()\n        fileBasedDeviceInfo(\"local.device.json\")\n        protocol = BotConfiguration.MiraiProtocol.ANDROID_PHONE\n    }.asQQAndroidBot()\n\n    MessageProtocolFacade.decoderPipeline.registerBefore(MessageDecoderProcessor(MessageDecodingRecorder()))\n\n    bot.login()\n\n    bot.join()\n}"
  },
  {
    "path": "mirai-core/src/jvmTest/kotlin/bootstrap/RunNoticeRecorder.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.bootstrap\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.BotFactory\nimport net.mamoe.mirai.internal.asQQAndroidBot\nimport net.mamoe.mirai.internal.network.components.NoticeProcessorPipeline\nimport net.mamoe.mirai.internal.testFramework.desensitizer.Desensitizer\nimport net.mamoe.mirai.internal.testFramework.notice.RecordingNoticeProcessor\nimport net.mamoe.mirai.utils.BotConfiguration\nimport net.mamoe.mirai.utils.readResource\nimport net.mamoe.yamlkt.Yaml\nimport kotlin.concurrent.thread\n\n@Serializable\ninternal data class LocalAccount(\n    val id: Long,\n    val password: String\n)\n\ninternal suspend fun main() {\n    Runtime.getRuntime().addShutdownHook(thread(start = false) {\n        Bot.instances.forEach {\n            it.close()\n        }\n    })\n\n\n    Desensitizer.local.desensitize(\"\") // verify rules\n\n    val account = Yaml.decodeFromString(LocalAccount.serializer(), readResource(\"local.account.yml\"))\n    val bot = BotFactory.newBot(account.id, account.password) {\n        enableContactCache()\n        fileBasedDeviceInfo(\"local.device.json\")\n        protocol = BotConfiguration.MiraiProtocol.ANDROID_PAD\n    }.asQQAndroidBot()\n\n    bot.components[NoticeProcessorPipeline].registerProcessor(RecordingNoticeProcessor())\n\n    bot.login()\n\n    bot.join()\n}"
  },
  {
    "path": "mirai-core/src/jvmTest/kotlin/directboot/DebugRunHelper.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.directboot\n\nimport kotlinx.coroutines.Dispatchers\nimport net.mamoe.mirai.BotFactory\nimport net.mamoe.mirai.auth.BotAuthorization\nimport net.mamoe.mirai.internal.QQAndroidBot\nimport net.mamoe.mirai.utils.BotConfiguration\nimport java.io.File\n\ninternal object DebugRunHelper {\n    fun newBot(id: Long, pwd: String, conf: BotConfiguration.(botid: Long) -> Unit): QQAndroidBot {\n        return newBot(id, BotAuthorization.byPassword(pwd), conf)\n    }\n\n    fun newBot(id: Long, authorization: BotAuthorization, conf: BotConfiguration.(botid: Long) -> Unit): QQAndroidBot {\n        val bot = BotFactory.newBot(id, authorization) {\n            parentCoroutineContext = Dispatchers.IO\n\n            workingDir = File(\"test/session/$id\").also { it.mkdirs() }.absoluteFile\n            cacheDir = workingDir.resolve(\"cache\").absoluteFile\n            this.fileBasedDeviceInfo(File(\"test/session/$id/device.json\").absolutePath)\n\n            conf(id)\n        }\n        return bot as QQAndroidBot\n    }\n}"
  },
  {
    "path": "mirai-core/src/jvmTest/kotlin/directboot/envprepare.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.directboot\n\nimport net.mamoe.mirai.internal.message.source.MessageSourceSequenceIdAwaiter\n\ninternal fun prepareEnvironmentForDebugRun() {\n\n    System.setProperty(\"mirai.network.packet.logger\", \"true\")\n    System.setProperty(\"mirai.event.show.verbose.events\", \"true\")\n    System.setProperty(\"mirai.network.state.observer.logging\", \"full\")\n    System.setProperty(\"mirai.network.handle.selector.logging\", \"true\")\n    System.setProperty(\"mirai.network.handler.selector.logging\", \"true\")\n    System.setProperty(\"mirai.resource.creation.stack.enabled\", \"true\")\n\n    MessageSourceSequenceIdAwaiter.setInstance(MessageSourceSequenceIdAwaiter())\n\n}\n\n"
  },
  {
    "path": "mirai-core/src/jvmTest/kotlin/netinternalkit/Ansi.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.netinternalkit\n\n// Copied from mirai-console/backend/mirai-console/src/util/AnsiMessageBuilder.kt\n\n\n@Suppress(\"RegExpRedundantEscape\")\nprivate val DROP_CSI_PATTERN = \"\"\"\\u001b\\[([\\u0030-\\u003F])*?([\\u0020-\\u002F])*?[\\u0040-\\u007E]\"\"\".toRegex()\nprivate val DROP_ANSI_PATTERN = \"\"\"\\u001b[\\u0040–\\u005F]\"\"\".toRegex()\n\ninternal fun String.dropAnsi(): String = this\n    .replace(DROP_CSI_PATTERN, \"\") // 先进行 CSI 剔除后进行 ANSI 剔除\n    .replace(DROP_ANSI_PATTERN, \"\")\n"
  },
  {
    "path": "mirai-core/src/jvmTest/kotlin/netinternalkit/LogCapture.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\")\n\npackage net.mamoe.mirai.internal.netinternalkit\n\nimport kotlinx.atomicfu.locks.withLock\nimport net.mamoe.mirai.utils.*\nimport java.io.File\n\ninternal object LogCapture {\n    lateinit var logCache: SizedCache<String>\n    private val output: (String) -> Unit = { log ->\n        println(log)\n        logCache.emit(log.dropAnsi())\n    }\n    var outputDir = File(\"test/capture\")\n\n    fun setupCapture(maxLine: Int = 200) {\n        logCache = SizedCache(maxLine)\n\n        @Suppress(\"INVISIBLE_MEMBER\")\n        MiraiLoggerFactoryImplementationBridge.wrapCurrent {\n            object : MiraiLogger.Factory {\n                override fun create(requester: Class<*>, identity: String?): MiraiLogger {\n                    return PlatformLogger(\n                        identity ?: requester.kotlin.simpleName ?: requester.simpleName,\n                        output\n                    )\n                }\n            }\n        }\n\n        NetReplayHelperSettings.logger_console = PlatformLogger(\n            identity = \"NetReplayHelper\",\n            output = ::println\n        )\n        NetReplayHelperSettings.logger_file = PlatformLogger(\n            identity = \"NetReplayHelper\",\n            output = { log -> logCache.emit(log.dropAnsi()) }\n        )\n    }\n\n    fun saveCapture(type: String = \"capture\") {\n        val output = outputDir.resolve(\"$type-${currentTimeMillis()}.txt\")\n        logCache.lock.withLock {\n            output.also { it.parentFile.mkdirs() }.bufferedWriter().use { writer ->\n                logCache.forEach { line ->\n                    writer.write(line)\n                    writer.write(10)\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core/src/jvmTest/kotlin/netinternalkit/NetReplayHelper.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmName(\"NetReplayHelper\")\n@file:Suppress(\"TestFunctionName\")\n\npackage net.mamoe.mirai.internal.netinternalkit\n\nimport io.netty.channel.*\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.BotFactory\nimport net.mamoe.mirai.internal.asQQAndroidBot\nimport net.mamoe.mirai.internal.network.components.PacketLoggingStrategyImpl\nimport net.mamoe.mirai.internal.network.components.RawIncomingPacket\nimport net.mamoe.mirai.internal.network.components.ServerList\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerContext\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerContextImpl\nimport net.mamoe.mirai.internal.network.handler.NetworkHandlerFactory\nimport net.mamoe.mirai.internal.network.handler.SocketAddress\nimport net.mamoe.mirai.internal.network.handler.selector.KeepAliveNetworkHandlerSelector\nimport net.mamoe.mirai.internal.network.handler.selector.SelectorNetworkHandler\nimport net.mamoe.mirai.internal.network.impl.netty.NettyNetworkHandler\nimport net.mamoe.mirai.internal.utils.subLogger\nimport net.mamoe.mirai.utils.*\nimport java.awt.Component\nimport java.awt.event.MouseAdapter\nimport java.awt.event.MouseEvent\nimport java.lang.invoke.MethodHandles\nimport javax.swing.*\nimport kotlin.reflect.KProperty\nimport kotlin.reflect.full.declaredMembers\nimport kotlin.reflect.jvm.isAccessible\nimport kotlin.reflect.jvm.javaField\n\n\ninternal object NetReplayHelperSettings {\n    var commands_hide_hideAll: Collection<String> by lateinitMutableProperty {\n        listOf(\n            \"Heartbeat.Alive\",\n            \"wtlogin.exchange_emp\",\n            \"StatSvc.register\",\n            \"StatSvc.GetDevLoginInfo\",\n            \"MessageSvc.PbGetMsg\",\n            \"friendlist.getFriendGroupList\",\n            \"friendlist.GetTroopListReqV2\",\n            \"friendlist.GetTroopMemberListReq\",\n        )\n    }\n\n    var commands_hide_hideInConsole: Collection<String> by lateinitMutableProperty {\n        listOf(\n            \"ConfigPushSvc.PushReq\",\n            *PacketLoggingStrategyImpl.getDefaultBlacklist().toTypedArray(),\n        )\n    }\n\n    var logger_console: MiraiLogger by lateinitMutableProperty {\n        MiraiLogger.Factory.create(NetReplayHelperClass())\n    }\n\n    var logger_file: MiraiLogger = SilentLogger.withSwitch(false)\n\n    @JvmField\n    val NetReplyHelper: Class<*> = NetReplayHelperClass()\n}\n\nprivate fun NetReplayHelperClass(): Class<*> {\n    return MethodHandles.lookup().lookupClass()\n}\n\n\nprivate fun attachNetReplayHelper(channel: Channel) {\n    channel.pipeline() // TODO: 2022/6/2 will not work since \"raw-packet-collector\" has been removed\n        .addBefore(\"raw-packet-collector\", \"raw-packet-dumper\", newRawPacketDumper())\n\n    attachNetReplayWView(channel)\n}\n\nprivate fun newRawPacketDumper(): ChannelHandler = object : ChannelInboundHandlerAdapter() {\n    override fun channelRead(ctx: ChannelHandlerContext?, msg: Any?) {\n        if (msg is RawIncomingPacket) {\n            if (msg.commandName in NetReplayHelperSettings.commands_hide_hideAll) {\n                NetReplayHelperSettings.logger_console.debug {\n                    \"sid=${msg.sequenceId}, cmd=${msg.commandName}, body=<DROPPED>\"\n                }\n                NetReplayHelperSettings.logger_file.debug {\n                    \"sid=${msg.sequenceId}, cmd=${msg.commandName}, body=<DROPPED>\"\n                }\n                super.channelRead(ctx, msg)\n                return\n            }\n            if (msg.commandName in NetReplayHelperSettings.commands_hide_hideInConsole) {\n                NetReplayHelperSettings.logger_console.debug {\n                    \"sid=${msg.sequenceId}, cmd=${msg.commandName}, body=<DROPPED>\"\n                }\n            } else {\n                NetReplayHelperSettings.logger_console.debug {\n                    \"sid=${msg.sequenceId}, cmd=${msg.commandName}, body=${msg.body.toUHexString()}\"\n                }\n            }\n            NetReplayHelperSettings.logger_file.debug {\n                \"sid=${msg.sequenceId}, cmd=${msg.commandName}, body=${msg.body.toUHexString()}\"\n            }\n        }\n        super.channelRead(ctx, msg)\n    }\n}\n\nprivate fun attachNetReplayWView(channel: Channel) {\n    val frame = JFrame(\"Net Replay Helper\")\n    val panel = JPanel()\n    val layout = GroupLayout(panel)\n    panel.layout = layout\n    frame.add(panel)\n\n    val cmd = JTextField()\n    val sid = JTextField()\n    val bdy = JTextField()\n    val log = JTextField()\n\n    val cmdLabel = JLabel(\"cmd\").also { it.labelFor = cmd }\n    val sidLabel = JLabel(\"seq\").also { it.labelFor = sid }\n    val bdyLabel = JLabel(\"body\").also { it.labelFor = bdy }\n    val logLabel = JLabel(\"log\").also { it.labelFor = log }\n\n    val fireCustom = JButton(\"Fire Cus\")\n    val fireLog = JButton(\"Fire Log\")\n\n    // region\n    layout.setHorizontalGroup(\n        layout.createParallelGroup().addGroup(\n            layout.createSequentialGroup().addGroup(\n                layout.createParallelGroup()\n                    .addComponent(cmdLabel)\n                    .addComponent(sidLabel)\n                    .addComponent(bdyLabel)\n                    .addComponent(logLabel)\n            ).addGroup(\n                layout.createParallelGroup()\n                    .addComponent(cmd)\n                    .addComponent(sid)\n                    .addComponent(bdy)\n                    .addComponent(log)\n            )\n        ).addGroup(\n            layout.createSequentialGroup()\n                .addComponent(fireCustom)\n                .addComponent(fireLog)\n        )\n    )\n    layout.setVerticalGroup(\n        layout.createSequentialGroup()\n            .addGroup(\n                layout.createParallelGroup(GroupLayout.Alignment.BASELINE)\n                    .addComponent(cmdLabel)\n                    .addComponent(cmd)\n            )\n            .addGroup(\n                layout.createParallelGroup(GroupLayout.Alignment.BASELINE)\n                    .addComponent(sidLabel)\n                    .addComponent(sid)\n            )\n            .addGroup(\n                layout.createParallelGroup(GroupLayout.Alignment.BASELINE)\n                    .addComponent(bdyLabel)\n                    .addComponent(bdy)\n            )\n            .addGroup(\n                layout.createParallelGroup(GroupLayout.Alignment.BASELINE)\n                    .addComponent(logLabel)\n                    .addComponent(log)\n            )\n            .addGroup(\n                layout.createParallelGroup()\n                    .addComponent(fireCustom)\n                    .addComponent(fireLog)\n            )\n    )\n    // endregion\n\n    fun Component.onClick(handle: () -> Unit) {\n        addMouseListener(object : MouseAdapter() {\n            override fun mouseClicked(e: MouseEvent?) {\n                runCatching(handle).onFailure { err ->\n                    NetReplayHelperSettings.logger_console.error(err)\n                    NetReplayHelperSettings.logger_file.error(err)\n                }\n            }\n        })\n    }\n\n    fireCustom.onClick {\n        val rp = RawIncomingPacket(\n            commandName = cmd.text.trim(),\n            sequenceId = sid.text.toInt(),\n            body = bdy.text.hexToBytes(),\n        )\n        channel.pipeline().fireChannelRead(rp)\n    }\n\n    @Suppress(\"LocalVariableName\")\n    fireLog.onClick {\n        var line = log.text.substringAfter(\"sid=\")\n        // 2021-11-07 11:49:38 D/NetReplayHelper: sid=123, cmd=HelloWorld!, body=00\n        val sid_ = line.substringBefore(\",\").toInt()\n        line = line.substringAfter(\"cmd=\")\n        val cmd_ = line.substringBeforeLast(\"body=\").trim().removeSuffix(\",\").trim()\n        val bdy_ = line.substringAfterLast(\"body=\").trim().hexToBytes()\n\n        val rp = RawIncomingPacket(\n            commandName = cmd_,\n            sequenceId = sid_,\n            body = bdy_,\n        )\n        channel.pipeline().fireChannelRead(rp)\n    }\n\n    frame.pack()\n    frame.defaultCloseOperation = JFrame.DO_NOTHING_ON_CLOSE\n    frame.setLocationRelativeTo(null)\n    frame.isVisible = true\n\n    channel.closeFuture().addListener {\n        SwingUtilities.invokeLater {\n            frame.dispose()\n        }\n    }\n\n}\n\nprivate object NRHNettyNetworkHandlerFactory : NetworkHandlerFactory<NettyNetworkHandler> {\n    override fun create(context: NetworkHandlerContext, address: SocketAddress): NettyNetworkHandler {\n        return object : NettyNetworkHandler(context, address) {\n            override fun setupChannelPipeline(pipeline: ChannelPipeline, decodePipeline: PacketDecodePipeline) {\n                super.setupChannelPipeline(pipeline, decodePipeline)\n                attachNetReplayHelper(pipeline.channel())\n            }\n        }\n    }\n}\n\n// Call before bot.login()\nfun Bot.attachNetReplayHelper() {\n    asQQAndroidBot()\n    val networkLogger = this::class.declaredMembers.first { it.name == \"networkLogger\" }.let { property ->\n        property as KProperty<*>\n        property.isAccessible = true\n        property.getter.call(this@attachNetReplayHelper)\n    } as MiraiLogger\n\n\n    val snh = network.cast<SelectorNetworkHandler<*>>()\n    val field = snh::selector.javaField!!\n    field.isAccessible = true\n    field.set(\n        snh,\n        KeepAliveNetworkHandlerSelector(\n            maxAttempts = configuration.reconnectionRetryTimes.coerceIn(1, Int.MAX_VALUE),\n            logger = networkLogger.subLogger(\"Selector\")\n        ) {\n            val context = NetworkHandlerContextImpl(\n                bot,\n                networkLogger,\n                createNetworkLevelComponents(),\n            )\n            NRHNettyNetworkHandlerFactory.create(\n                context,\n                context[ServerList].pollAny().toSocketAddress(),\n            )\n        },\n    )\n\n}\n\nfun main() {\n    val bot = BotFactory.newBot(0, \"\")\n    bot.attachNetReplayHelper() //\n    // TODO: 2022/6/2 will not work since \"raw-packet-collector\" has been removed, see net.mamoe.mirai.internal.netinternalkit.NetReplayHelper.attachNetReplayHelper(io.netty.channel.Channel)\n}\n"
  },
  {
    "path": "mirai-core/src/jvmTest/kotlin/package.kt",
    "content": "/*\n * Copyright 2019-2020 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal"
  },
  {
    "path": "mirai-core/src/jvmTest/kotlin/test/initializeTestJvm.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.test\n\ninternal actual fun initializeTestPlatformBeforeCommon() {\n    // nop\n}"
  },
  {
    "path": "mirai-core/src/jvmTest/kotlin/testFramework/currentPlatform.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.testFramework\n\nactual fun currentPlatform(): Platform = Platform.Jvm"
  },
  {
    "path": "mirai-core/src/jvmTest/resources/account.yml",
    "content": "id: 123\npassword: \"\""
  },
  {
    "path": "mirai-core-all/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"UnusedImport\")\n\nimport shadow.configureRelocatedShadowJarForJvmProject\nimport shadow.relocateImplementation\n\nplugins {\n    kotlin(\"jvm\")\n    kotlin(\"plugin.serialization\")\n    `maven-publish`\n    id(\"me.him188.kotlin-jvm-blocking-bridge\")\n}\n\nversion = Versions.project\ndescription = \"Mirai core shadowed\"\n\ndependencies {\n    api(project(\":mirai-core\"))\n    api(project(\":mirai-core-api\"))\n    api(project(\":mirai-core-utils\"))\n    implementation(`slf4j-api`) // Required by mirai-console\n\n    relocateImplementation(project, `kt-bignum_relocated`)\n    relocateImplementation(project, `ktor-client-core_relocated`)\n    relocateImplementation(project, `ktor-client-okhttp_relocated`)\n    relocateImplementation(project, `ktor-io_relocated`)\n}\n\nval shadow = configureRelocatedShadowJarForJvmProject(kotlin)\n\nif (System.getenv(\"MIRAI_IS_SNAPSHOTS_PUBLISHING\")?.toBoolean() != true) {\n    // Do not publish `-all` jars to snapshot server since they are too large.\n\n    configurePublishing(\"mirai-core-all\", addShadowJar = false)\n\n    publications {\n        getByName(\"mavenJava\", MavenPublication::class) {\n            artifact(shadow)\n        }\n    }\n\n    tasks.getByName(\"publishMavenJavaPublicationToMavenLocal\").dependsOn(shadow)\n    tasks.findByName(\"publishMavenJavaPublicationToMavenCentralRepository\")?.dependsOn(shadow)\n}\n\n//\n//// WARNING: You must also consider relocating transitive dependencies.\n//// Otherwise, user will get NoClassDefFound error when using mirai as a classpath dependency. See #2263.\n//\n//val includeInRuntime = true\n//relocateAllFromGroupId(\"io.ktor\", includeInRuntime, \"io.ktor\")\n//relocateAllFromGroupId(\"com.squareup.okhttp3\", includeInRuntime, listOf(\"okhttp3\"))\n//relocateAllFromGroupId(\"com.squareup.okio\", includeInRuntime, listOf(\"okio\"))"
  },
  {
    "path": "mirai-core-api/README.md",
    "content": "# mirai-core-api\n\nmirai 核心 API 模块。本文档帮助读者了解该模块的主要架构。\n\n> mirai 为多平台设计。支持 Android 和 JVM 双平台，拥有多个源集。\n>\n> - `commonMain`：平台无关的通用代码。绝大部分代码都存在与这个源集。\n> - `jvmMain`：桌面 JVM 平台的特别实现。\n> - `androidMain`：Android 平台的特别实现。\n>\n> 阅读源码通常阅读 `src/commonMain`\n\n## 架构\n\n| 包名               | 描述                                                |\n|:------------------|:----------------------------------------------------|\n| `net.mamoe.mirai` | mirai 核心 API                                      |\n| `.contact`        | 联系人类型。如群 `Group`，好友 `Friend`                 |\n| `.event`          | 事件框架。提供事件对象的基类以及监听事件的方法               |\n| `.event.events`   | 事件的定义。包含许多事件的具体类, 如消息事件 `MessageEvent` |\n| `.message`        | 消息系统                                             |\n| `.message.data`   | 提供对富文本聊天消息及其元素多样性的抽象                    |\n| `.message.code`   | 提供一个易于阅读的消息字符串表示方式                       |\n| `.message.action` | 提供与消息有关的动作的抽象，如戳一戳                       |\n| `.utils`          | 一些工具类                                            |\n| `.internal`       | 内部实现                                             |\n| `.internal.event` | 事件框架的实现                                        |\n\n## `net.mamoe.mirai`\n\n### `IMirai`\n[IMirai.kt](src/commonMain/kotlin/IMirai.kt#L33)\n\n**API 模块与协议实现模块的对接接口。**\n\n- 单例\n- 通过 `ServiceLoader` 寻找[协议实现](../mirai-core/README.md)。\n- 若 `ServiceLoader` 在特定环境下不可用，外部可在 Kotlin **在调用任何 Mirai API 之前**覆盖实例：\n  ```kotlin\n  @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\") // 必要\n  net.mamoe.mirai._MiraiInstance.set(net.mamoe.mirai.internal.MiraiImpl())\n  ```\n\n### `Bot`\n\n[BotFactory]: src/commonMain/kotlin/BotFactory.kt\n\n[Bot.kt](src/commonMain/kotlin/IMirai.kt#L29)\n\n表示一个机器人对象（账户）。\n\n- 通过 [BotFactory] 构造\n- 是功能的入口点----大部分操作都直接或间接经过 `Bot`\n- 持有联系人（好友和群）对象列表\n- 可获得事件通道\n\n## `net.mamoe.mirai.contact`\n\n联系人系统。[docs/Contacts](../docs/Contacts.md)\n\n## `net.mamoe.mirai.event`\n\n事件系统。[docs/Contacts](../docs/Contacts.md)\n\n## `net.mamoe.mirai.event.events`\n\n事件列表。[README](src/commonMain/kotlin/event/events/EventList.md#事件)\n\n## `net.mamoe.mirai.message`\n\n消息系统。\n\n### `MessageReceipt`\n\n[MessageReceipt.kt](src/commonMain/kotlin/message/MessageReceipt.kt#L25)\n\n在发送消息（`Contact.sendMessage`）后收到的回执。\n\n### `MessageSerializers`\n\n[MessageSerializers.kt](src/commonMain/kotlin/message/MessageSerializers.kt#L27)\n\n[kotlinx.serialization](https://github.com/kotlin/kotlinx.serialization) 序列化支持。\n\n## `net.mamoe.mirai.message.data`\n\n对富文本聊天消息及其元素多样性的抽象。\n\n一个消息元素最基本的接口为 [Message](src/commonMain/kotlin/message/data/Message.kt#L30).\n"
  },
  {
    "path": "mirai-core-api/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n@file:Suppress(\"UNUSED_VARIABLE\")\n\nimport BinaryCompatibilityConfigurator.configureBinaryValidators\nimport shadow.relocateCompileOnly\n\nplugins {\n    kotlin(\"multiplatform\")\n    kotlin(\"plugin.serialization\")\n\n    id(\"kotlinx-atomicfu\")\n    id(\"signing\")\n    id(\"me.him188.kotlin-jvm-blocking-bridge\")\n    id(\"me.him188.kotlin-dynamic-delegation\")\n//    id(\"me.him188.maven-central-publish\")\n\n    `maven-publish`\n}\n\ndescription = \"Mirai API module\"\n\nkotlin {\n    explicitApi()\n    apply(plugin = \"explicit-api\")\n\n    configureJvmTargetsHierarchical(\"net.mamoe.mirai\")\n\n    sourceSets {\n        val commonMain by getting {\n            dependencies {\n                api(kotlin(\"reflect\"))\n                api(`kotlinx-serialization-core`)\n                api(`kotlinx-serialization-json`)\n                api(`kotlinx-coroutines-core`) // don't remove it, otherwise IDE will complain\n\n                implementation(project(\":mirai-core-utils\"))\n                implementation(project(\":mirai-console-compiler-annotations\"))\n                implementation(`kotlinx-serialization-protobuf`)\n                implementation(`kotlinx-atomicfu`)\n                implementation(`jetbrains-annotations`)\n\n                // runtime from mirai-core-utils\n                relocateCompileOnly(`ktor-io_relocated`)\n\n                implementation(`kotlin-jvm-blocking-bridge`)\n                implementation(`kotlin-dynamic-delegation`)\n\n                implementation(`log4j-api`)\n                compileOnly(`slf4j-api`)\n            }\n        }\n\n        commonTest {\n            dependencies {\n                runtimeOnly(`log4j-core`)\n                implementation(`kotlinx-coroutines-test`)\n                api(`junit-jupiter-api`)\n            }\n        }\n\n        afterEvaluate {\n            findByName(\"androidUnitTest\")?.apply {\n                dependencies {\n                    runtimeOnly(`slf4j-api`)\n                }\n            }\n        }\n\n        findByName(\"jvmMain\")?.apply {\n\n        }\n\n        findByName(\"jvmTest\")?.apply {\n            dependencies {\n                runtimeOnly(files(\"build/classes/kotlin/jvm/test\")) // classpath is not properly set by IDE\n            }\n        }\n    }\n}\n\natomicfu {\n    transformJvm = false\n}\n\nif (tasks.findByName(\"androidMainClasses\") != null) {\n    tasks.register(\"checkAndroidApiLevel\") {\n        doFirst {\n            analyzes.AndroidApiLevelCheck.check(\n                buildDir.resolve(\"classes/kotlin/android/main\"),\n                project.property(\"mirai.android.target.api.level\")!!.toString().toInt(),\n                project\n            )\n        }\n        group = \"verification\"\n        this.mustRunAfter(\"androidMainClasses\")\n    }\n    tasks.findByName(\"androidTest\")?.dependsOn(\"checkAndroidApiLevel\")\n}\n\nconfigureMppPublishing()\nconfigureBinaryValidators(setOf(\"jvm\", \"android\").filterTargets())\n\n//mavenCentralPublish {\n//    artifactId = \"mirai-core-api\"\n//    githubProject(\"mamoe\", \"mirai\")\n//    developer(\"Mamoe Technologies\", email = \"support@mamoe.net\", url = \"https://github.com/mamoe\")\n//    licenseFromGitHubProject(\"AGPLv3\", \"dev\")\n//    publishPlatformArtifactsInRootModule = \"jvm\"\n//}\n"
  },
  {
    "path": "mirai-core-api/compatibility-validation/android/api/android.api",
    "content": "public abstract interface class net/mamoe/mirai/Bot : kotlinx/coroutines/CoroutineScope, net/mamoe/mirai/contact/ContactOrBot, net/mamoe/mirai/contact/UserOrBot {\n\tpublic static final field Companion Lnet/mamoe/mirai/Bot$Companion;\n\tpublic fun close ()V\n\tpublic abstract fun close (Ljava/lang/Throwable;)V\n\tpublic static synthetic fun close$default (Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;ILjava/lang/Object;)V\n\tpublic fun closeAndJoin (Ljava/lang/Throwable;)V\n\tpublic fun closeAndJoin (Ljava/lang/Throwable;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun closeAndJoin$default (Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;ILjava/lang/Object;)V\n\tpublic static synthetic fun closeAndJoin$default (Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun closeAndJoin$suspendImpl (Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun findInstance (J)Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getAsFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic abstract fun getAsStranger ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getConfiguration ()Lnet/mamoe/mirai/utils/BotConfiguration;\n\tpublic abstract fun getEventChannel ()Lnet/mamoe/mirai/event/EventChannel;\n\tpublic fun getFriend (J)Lnet/mamoe/mirai/contact/Friend;\n\tpublic abstract fun getFriendGroups ()Lnet/mamoe/mirai/contact/friendgroup/FriendGroups;\n\tpublic fun getFriendOrFail (J)Lnet/mamoe/mirai/contact/Friend;\n\tpublic abstract fun getFriends ()Lnet/mamoe/mirai/contact/ContactList;\n\tpublic fun getGroup (J)Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getGroupOrFail (J)Lnet/mamoe/mirai/contact/Group;\n\tpublic abstract fun getGroups ()Lnet/mamoe/mirai/contact/ContactList;\n\tpublic static fun getInstance (J)Lnet/mamoe/mirai/Bot;\n\tpublic static fun getInstanceOrNull (J)Lnet/mamoe/mirai/Bot;\n\tpublic static fun getInstances ()Ljava/util/List;\n\tpublic static fun getInstancesSequence ()Lkotlin/sequences/Sequence;\n\tpublic abstract fun getLogger ()Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic abstract fun getOtherClients ()Lnet/mamoe/mirai/contact/ContactList;\n\tpublic fun getStranger (J)Lnet/mamoe/mirai/contact/Stranger;\n\tpublic fun getStrangerOrFail (J)Lnet/mamoe/mirai/contact/Stranger;\n\tpublic abstract fun getStrangers ()Lnet/mamoe/mirai/contact/ContactList;\n\tpublic abstract fun isOnline ()Z\n\tpublic fun join ()V\n\tpublic fun join (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun join$suspendImpl (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun login ()V\n\tpublic abstract fun login (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun nudge ()Lnet/mamoe/mirai/message/action/BotNudge;\n\tpublic synthetic fun nudge ()Lnet/mamoe/mirai/message/action/Nudge;\n}\n\npublic final class net/mamoe/mirai/Bot$Companion {\n\tpublic final fun findInstance (J)Lnet/mamoe/mirai/Bot;\n\tpublic final fun getInstance (J)Lnet/mamoe/mirai/Bot;\n\tpublic final fun getInstanceOrNull (J)Lnet/mamoe/mirai/Bot;\n\tpublic final fun getInstances ()Ljava/util/List;\n\tpublic final fun getInstancesSequence ()Lkotlin/sequences/Sequence;\n}\n\npublic abstract interface class net/mamoe/mirai/BotFactory {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/BotFactory$INSTANCE;\n\tpublic fun newBot (JLjava/lang/String;)Lnet/mamoe/mirai/Bot;\n\tpublic fun newBot (JLjava/lang/String;Lnet/mamoe/mirai/BotFactory$BotConfigurationLambda;)Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun newBot (JLjava/lang/String;Lnet/mamoe/mirai/utils/BotConfiguration;)Lnet/mamoe/mirai/Bot;\n\tpublic fun newBot (JLnet/mamoe/mirai/auth/BotAuthorization;)Lnet/mamoe/mirai/Bot;\n\tpublic fun newBot (JLnet/mamoe/mirai/auth/BotAuthorization;Lnet/mamoe/mirai/BotFactory$BotConfigurationLambda;)Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun newBot (JLnet/mamoe/mirai/auth/BotAuthorization;Lnet/mamoe/mirai/utils/BotConfiguration;)Lnet/mamoe/mirai/Bot;\n\tpublic fun newBot (J[B)Lnet/mamoe/mirai/Bot;\n\tpublic fun newBot (J[BLnet/mamoe/mirai/BotFactory$BotConfigurationLambda;)Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun newBot (J[BLnet/mamoe/mirai/utils/BotConfiguration;)Lnet/mamoe/mirai/Bot;\n}\n\npublic abstract interface class net/mamoe/mirai/BotFactory$BotConfigurationLambda {\n\tpublic abstract fun invoke (Lnet/mamoe/mirai/utils/BotConfiguration;)V\n}\n\npublic final class net/mamoe/mirai/BotFactory$INSTANCE : net/mamoe/mirai/BotFactory {\n\tpublic final synthetic fun newBot (JLjava/lang/String;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/Bot;\n\tpublic fun newBot (JLjava/lang/String;Lnet/mamoe/mirai/utils/BotConfiguration;)Lnet/mamoe/mirai/Bot;\n\tpublic fun newBot (JLnet/mamoe/mirai/auth/BotAuthorization;Lnet/mamoe/mirai/utils/BotConfiguration;)Lnet/mamoe/mirai/Bot;\n\tpublic final synthetic fun newBot (J[BLkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/Bot;\n\tpublic fun newBot (J[BLnet/mamoe/mirai/utils/BotConfiguration;)Lnet/mamoe/mirai/Bot;\n}\n\npublic final class net/mamoe/mirai/BotKt {\n\tpublic static final synthetic fun alsoLogin (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun containsFriend (Lnet/mamoe/mirai/Bot;J)Z\n\tpublic static final synthetic fun containsGroup (Lnet/mamoe/mirai/Bot;J)Z\n\tpublic static final synthetic fun getSupervisorJob (Lnet/mamoe/mirai/Bot;)Lkotlinx/coroutines/CompletableJob;\n}\n\npublic abstract interface class net/mamoe/mirai/IMirai : net/mamoe/mirai/LowLevelApiAccessor {\n\tpublic fun acceptInvitedJoinGroupRequest (Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;)V\n\tpublic abstract fun acceptInvitedJoinGroupRequest (Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun acceptMemberJoinRequest (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;)V\n\tpublic abstract fun acceptMemberJoinRequest (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun acceptNewFriendRequest (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;)V\n\tpublic abstract fun acceptNewFriendRequest (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun broadcastEvent (Lnet/mamoe/mirai/event/Event;)V\n\tpublic abstract fun broadcastEvent (Lnet/mamoe/mirai/event/Event;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun calculateGroupCodeByGroupUin (J)J\n\tpublic fun calculateGroupUinByGroupCode (J)J\n\tpublic abstract fun constructMessageSource (JLnet/mamoe/mirai/message/data/MessageSourceKind;JJ[II[ILnet/mamoe/mirai/message/data/MessageChain;)Lnet/mamoe/mirai/message/data/OfflineMessageSource;\n\tpublic abstract fun createFileMessage (Ljava/lang/String;ILjava/lang/String;J)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic fun createImage (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic abstract fun createUnsupportedMessage ([B)Lnet/mamoe/mirai/message/data/UnsupportedMessage;\n\tpublic fun downloadForwardMessage (Lnet/mamoe/mirai/Bot;Ljava/lang/String;)Ljava/util/List;\n\tpublic abstract fun downloadForwardMessage (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun downloadLongMessage (Lnet/mamoe/mirai/Bot;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic abstract fun downloadLongMessage (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun getBotFactory ()Lnet/mamoe/mirai/BotFactory;\n\tpublic abstract fun getFileCacheStrategy ()Lnet/mamoe/mirai/utils/FileCacheStrategy;\n\tpublic fun getOnlineOtherClientsList (Lnet/mamoe/mirai/Bot;Z)Ljava/util/List;\n\tpublic abstract fun getOnlineOtherClientsList (Lnet/mamoe/mirai/Bot;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun getOnlineOtherClientsList$default (Lnet/mamoe/mirai/IMirai;Lnet/mamoe/mirai/Bot;ZILjava/lang/Object;)Ljava/util/List;\n\tpublic static synthetic fun getOnlineOtherClientsList$default (Lnet/mamoe/mirai/IMirai;Lnet/mamoe/mirai/Bot;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun getUin (Lnet/mamoe/mirai/contact/ContactOrBot;)J\n\tpublic fun ignoreInvitedJoinGroupRequest (Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;)V\n\tpublic abstract fun ignoreInvitedJoinGroupRequest (Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun ignoreMemberJoinRequest (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;Z)V\n\tpublic abstract fun ignoreMemberJoinRequest (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun ignoreMemberJoinRequest$default (Lnet/mamoe/mirai/IMirai;Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZILjava/lang/Object;)V\n\tpublic static synthetic fun ignoreMemberJoinRequest$default (Lnet/mamoe/mirai/IMirai;Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun queryImageUrl (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/message/data/Image;)Ljava/lang/String;\n\tpublic abstract fun queryImageUrl (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/message/data/Image;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun queryProfile (Lnet/mamoe/mirai/Bot;J)Lnet/mamoe/mirai/data/UserProfile;\n\tpublic abstract fun queryProfile (Lnet/mamoe/mirai/Bot;JLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun recallMessage (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/message/data/MessageSource;)V\n\tpublic abstract fun recallMessage (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/message/data/MessageSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun rejectMemberJoinRequest (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZLjava/lang/String;)V\n\tpublic abstract fun rejectMemberJoinRequest (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZLjava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun rejectMemberJoinRequest$default (Lnet/mamoe/mirai/IMirai;Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZLjava/lang/String;ILjava/lang/Object;)V\n\tpublic static synthetic fun rejectMemberJoinRequest$default (Lnet/mamoe/mirai/IMirai;Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZLjava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun rejectNewFriendRequest (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;Z)V\n\tpublic abstract fun rejectNewFriendRequest (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun rejectNewFriendRequest$default (Lnet/mamoe/mirai/IMirai;Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;ZILjava/lang/Object;)V\n\tpublic static synthetic fun rejectNewFriendRequest$default (Lnet/mamoe/mirai/IMirai;Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun sendNudge (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/message/action/Nudge;Lnet/mamoe/mirai/contact/Contact;)Z\n\tpublic abstract fun sendNudge (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/message/action/Nudge;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun setFileCacheStrategy (Lnet/mamoe/mirai/utils/FileCacheStrategy;)V\n}\n\npublic abstract interface annotation class net/mamoe/mirai/LowLevelApi : java/lang/annotation/Annotation {\n}\n\npublic abstract interface class net/mamoe/mirai/LowLevelApiAccessor {\n\tpublic fun getGroupVoiceDownloadUrl (Lnet/mamoe/mirai/Bot;[BJJ)Ljava/lang/String;\n\tpublic abstract fun getGroupVoiceDownloadUrl (Lnet/mamoe/mirai/Bot;[BJJLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun getRawGroupList (Lnet/mamoe/mirai/Bot;)Lkotlin/sequences/Sequence;\n\tpublic abstract fun getRawGroupList (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun getRawGroupMemberList (Lnet/mamoe/mirai/Bot;JJJ)Lkotlin/sequences/Sequence;\n\tpublic abstract fun getRawGroupMemberList (Lnet/mamoe/mirai/Bot;JJJLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun muteAnonymousMember (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Ljava/lang/String;JI)V\n\tpublic abstract fun muteAnonymousMember (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Ljava/lang/String;JILkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun newFriend (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/data/FriendInfo;)Lnet/mamoe/mirai/contact/Friend;\n\tpublic abstract fun newStranger (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/data/StrangerInfo;)Lnet/mamoe/mirai/contact/Stranger;\n\tpublic fun recallFriendMessageRaw (Lnet/mamoe/mirai/Bot;J[I[II)Z\n\tpublic abstract fun recallFriendMessageRaw (Lnet/mamoe/mirai/Bot;J[I[IILkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun recallGroupMessageRaw (Lnet/mamoe/mirai/Bot;J[I[I)Z\n\tpublic abstract fun recallGroupMessageRaw (Lnet/mamoe/mirai/Bot;J[I[ILkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun recallGroupTempMessageRaw (Lnet/mamoe/mirai/Bot;JJ[I[II)Z\n\tpublic abstract fun recallGroupTempMessageRaw (Lnet/mamoe/mirai/Bot;JJ[I[IILkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun solveBotInvitedJoinGroupRequestEvent (Lnet/mamoe/mirai/Bot;JJJZ)V\n\tpublic abstract fun solveBotInvitedJoinGroupRequestEvent (Lnet/mamoe/mirai/Bot;JJJZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun solveMemberJoinRequestEvent (Lnet/mamoe/mirai/Bot;JJLjava/lang/String;JLjava/lang/Boolean;ZLjava/lang/String;)V\n\tpublic abstract fun solveMemberJoinRequestEvent (Lnet/mamoe/mirai/Bot;JJLjava/lang/String;JLjava/lang/Boolean;ZLjava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun solveMemberJoinRequestEvent$default (Lnet/mamoe/mirai/LowLevelApiAccessor;Lnet/mamoe/mirai/Bot;JJLjava/lang/String;JLjava/lang/Boolean;ZLjava/lang/String;ILjava/lang/Object;)V\n\tpublic static synthetic fun solveMemberJoinRequestEvent$default (Lnet/mamoe/mirai/LowLevelApiAccessor;Lnet/mamoe/mirai/Bot;JJLjava/lang/String;JLjava/lang/Boolean;ZLjava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun solveNewFriendRequestEvent (Lnet/mamoe/mirai/Bot;JJLjava/lang/String;ZZ)V\n\tpublic abstract fun solveNewFriendRequestEvent (Lnet/mamoe/mirai/Bot;JJLjava/lang/String;ZZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/Mirai {\n\tpublic static final fun getInstance ()Lnet/mamoe/mirai/IMirai;\n\tpublic static final synthetic fun recallMessage (Lnet/mamoe/mirai/IMirai;Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/message/data/MessageChain;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/_MiraiInstance {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/_MiraiInstance;\n\tpublic static final fun get ()Lnet/mamoe/mirai/IMirai;\n\tpublic static final fun set (Lnet/mamoe/mirai/IMirai;)V\n}\n\npublic abstract class net/mamoe/mirai/auth/AuthReason {\n\tpublic abstract fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getMessage ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/auth/AuthReason$FastLoginError : net/mamoe/mirai/auth/AuthReason {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getMessage ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/auth/AuthReason$ForceOffline : net/mamoe/mirai/auth/AuthReason {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getMessage ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/auth/AuthReason$FreshLogin : net/mamoe/mirai/auth/AuthReason {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getMessage ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/auth/AuthReason$MsfOffline : net/mamoe/mirai/auth/AuthReason {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getMessage ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/auth/AuthReason$NetworkError : net/mamoe/mirai/auth/AuthReason {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getMessage ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/auth/AuthReason$Unknown : net/mamoe/mirai/auth/AuthReason {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getCause ()Ljava/lang/Throwable;\n\tpublic fun getMessage ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/auth/BotAuthInfo {\n\tpublic abstract fun getConfiguration ()Lnet/mamoe/mirai/utils/BotConfiguration;\n\tpublic abstract fun getDeviceInfo ()Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic abstract fun getId ()J\n\tpublic abstract fun getReason ()Lnet/mamoe/mirai/auth/AuthReason;\n\tpublic abstract fun isFirstLogin ()Z\n}\n\npublic abstract interface class net/mamoe/mirai/auth/BotAuthResult {\n}\n\npublic abstract interface class net/mamoe/mirai/auth/BotAuthSession {\n\tpublic abstract fun authByPassword (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun authByPassword ([BLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun authByQRCode (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/auth/BotAuthorization {\n\tpublic static final field Companion Lnet/mamoe/mirai/auth/BotAuthorization$Companion;\n\tpublic abstract fun authorize (Lnet/mamoe/mirai/auth/BotAuthSession;Lnet/mamoe/mirai/auth/BotAuthInfo;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun byPassword (Ljava/lang/String;)Lnet/mamoe/mirai/auth/BotAuthorization;\n\tpublic static fun byPassword ([B)Lnet/mamoe/mirai/auth/BotAuthorization;\n\tpublic static fun byQRCode ()Lnet/mamoe/mirai/auth/BotAuthorization;\n\tpublic fun calculateSecretsKey (Lnet/mamoe/mirai/auth/BotAuthInfo;)[B\n}\n\npublic final class net/mamoe/mirai/auth/BotAuthorization$Companion {\n\tpublic final fun byPassword (Ljava/lang/String;)Lnet/mamoe/mirai/auth/BotAuthorization;\n\tpublic final fun byPassword ([B)Lnet/mamoe/mirai/auth/BotAuthorization;\n\tpublic final fun byQRCode ()Lnet/mamoe/mirai/auth/BotAuthorization;\n\tpublic final fun invoke (Lkotlin/jvm/functions/Function3;)Lnet/mamoe/mirai/auth/BotAuthorization;\n}\n\npublic abstract interface class net/mamoe/mirai/auth/QRCodeLoginListener {\n\tpublic fun getQrCodeEcLevel ()I\n\tpublic fun getQrCodeMargin ()I\n\tpublic fun getQrCodeSize ()I\n\tpublic fun getQrCodeStateUpdateInterval ()J\n\tpublic fun onCompleted ()V\n\tpublic abstract fun onFetchQRCode (Lnet/mamoe/mirai/Bot;[B)V\n\tpublic fun onIntervalLoop ()V\n\tpublic abstract fun onStateChanged (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/auth/QRCodeLoginListener$State;)V\n}\n\npublic final class net/mamoe/mirai/auth/QRCodeLoginListener$State : java/lang/Enum {\n\tpublic static final field CANCELLED Lnet/mamoe/mirai/auth/QRCodeLoginListener$State;\n\tpublic static final field CONFIRMED Lnet/mamoe/mirai/auth/QRCodeLoginListener$State;\n\tpublic static final field DEFAULT Lnet/mamoe/mirai/auth/QRCodeLoginListener$State;\n\tpublic static final field TIMEOUT Lnet/mamoe/mirai/auth/QRCodeLoginListener$State;\n\tpublic static final field WAITING_FOR_CONFIRM Lnet/mamoe/mirai/auth/QRCodeLoginListener$State;\n\tpublic static final field WAITING_FOR_SCAN Lnet/mamoe/mirai/auth/QRCodeLoginListener$State;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/auth/QRCodeLoginListener$State;\n\tpublic static fun values ()[Lnet/mamoe/mirai/auth/QRCodeLoginListener$State;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/AnonymousMember : net/mamoe/mirai/contact/Member {\n\tpublic abstract fun getAnonymousId ()Ljava/lang/String;\n\tpublic fun nudge ()Lnet/mamoe/mirai/message/action/MemberNudge;\n\tpublic synthetic fun nudge ()Lnet/mamoe/mirai/message/action/Nudge;\n\tpublic synthetic fun nudge ()Lnet/mamoe/mirai/message/action/UserNudge;\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendMessage$suspendImpl (Lnet/mamoe/mirai/contact/AnonymousMember;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendMessage$suspendImpl (Lnet/mamoe/mirai/contact/AnonymousMember;Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun uploadImage (Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadImage$suspendImpl (Lnet/mamoe/mirai/contact/AnonymousMember;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/AudioSupported : net/mamoe/mirai/contact/Contact {\n\tpublic fun uploadAudio (Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/data/OfflineAudio;\n\tpublic abstract fun uploadAudio (Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/AvatarSpec : java/lang/Enum, java/lang/Comparable {\n\tpublic static final field LARGE Lnet/mamoe/mirai/contact/AvatarSpec;\n\tpublic static final field LARGEST Lnet/mamoe/mirai/contact/AvatarSpec;\n\tpublic static final field MEDIUM Lnet/mamoe/mirai/contact/AvatarSpec;\n\tpublic static final field ORIGINAL Lnet/mamoe/mirai/contact/AvatarSpec;\n\tpublic static final field SMALL Lnet/mamoe/mirai/contact/AvatarSpec;\n\tpublic static final field SMALLEST Lnet/mamoe/mirai/contact/AvatarSpec;\n\tpublic final fun getSize ()I\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/contact/AvatarSpec;\n\tpublic static fun values ()[Lnet/mamoe/mirai/contact/AvatarSpec;\n}\n\npublic final class net/mamoe/mirai/contact/BotIsBeingMutedException : net/mamoe/mirai/contact/SendMessageFailedException {\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/contact/Group;)V\n\tpublic fun getMessage ()Ljava/lang/String;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Group;\n}\n\npublic final class net/mamoe/mirai/contact/ClientKind : java/lang/Enum {\n\tpublic static final field ANDROID_PAD Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field AOL_CHAOJIHUIYUAN Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field AOL_HUIYUAN Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field AOL_SQQ Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field CAR Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/ClientKind$Companion;\n\tpublic static final field HRTX_IPHONE Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field HRTX_PC Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MC_3G Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MISRO_MSG Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_ANDROID Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_ANDROID_NEW Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_HD Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_HD_NEW Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_IPAD Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_IPAD_NEW Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_IPHONE Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_OTHER Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_PC_QQ Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_PC_TIM Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_WINPHONE_NEW Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field QQ_FORELDER Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field QQ_SERVICE Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field TV_QQ Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field WIN8 Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field WINPHONE Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic final fun getId ()I\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static fun values ()[Lnet/mamoe/mirai/contact/ClientKind;\n}\n\npublic final class net/mamoe/mirai/contact/ClientKind$Companion {\n}\n\npublic abstract interface class net/mamoe/mirai/contact/Contact : kotlinx/coroutines/CoroutineScope, net/mamoe/mirai/contact/ContactOrBot {\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/Contact$Companion;\n\tpublic abstract fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getId ()J\n\tpublic static fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendImage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendImage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic abstract fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendMessage$suspendImpl (Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun uploadImage (Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic abstract fun uploadImage (Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun uploadShortVideo (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ExternalResource;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ShortVideo;\n\tpublic abstract fun uploadShortVideo (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ExternalResource;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadShortVideo$default (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ExternalResource;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ShortVideo;\n\tpublic static synthetic fun uploadShortVideo$default (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ExternalResource;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/Contact$Companion {\n\tpublic final fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun sendImage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendImage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendImage$default (Lnet/mamoe/mirai/contact/Contact$Companion;Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendImage$default (Lnet/mamoe/mirai/contact/Contact$Companion;Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun sendImage$default (Lnet/mamoe/mirai/contact/Contact$Companion;Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendImage$default (Lnet/mamoe/mirai/contact/Contact$Companion;Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadImage$default (Lnet/mamoe/mirai/contact/Contact$Companion;Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static synthetic fun uploadImage$default (Lnet/mamoe/mirai/contact/Contact$Companion;Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadImage$default (Lnet/mamoe/mirai/contact/Contact$Companion;Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static synthetic fun uploadImage$default (Lnet/mamoe/mirai/contact/Contact$Companion;Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/ContactKt {\n\tpublic static final synthetic fun recallMessage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/message/data/MessageChain;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun recallMessage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/message/data/MessageSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/ContactList : java/util/Collection, kotlin/jvm/internal/markers/KMappedMarker {\n\tpublic final field delegate Ljava/util/Collection;\n\tpublic synthetic fun add (Ljava/lang/Object;)Z\n\tpublic fun add (Lnet/mamoe/mirai/contact/Contact;)Z\n\tpublic fun addAll (Ljava/util/Collection;)Z\n\tpublic fun clear ()V\n\tpublic final fun contains (J)Z\n\tpublic final fun contains (Ljava/lang/Object;)Z\n\tpublic fun contains (Lnet/mamoe/mirai/contact/Contact;)Z\n\tpublic fun containsAll (Ljava/util/Collection;)Z\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun get (J)Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun getOrFail (J)Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSize ()I\n\tpublic fun hashCode ()I\n\tpublic fun isEmpty ()Z\n\tpublic fun iterator ()Ljava/util/Iterator;\n\tpublic final fun remove (J)Z\n\tpublic fun remove (Ljava/lang/Object;)Z\n\tpublic fun removeAll (Ljava/util/Collection;)Z\n\tpublic fun removeIf (Ljava/util/function/Predicate;)Z\n\tpublic fun retainAll (Ljava/util/Collection;)Z\n\tpublic final fun size ()I\n\tpublic fun toArray ()[Ljava/lang/Object;\n\tpublic fun toArray ([Ljava/lang/Object;)[Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/ContactOrBot : kotlinx/coroutines/CoroutineScope {\n\tpublic fun getAvatarUrl ()Ljava/lang/String;\n\tpublic fun getAvatarUrl (Lnet/mamoe/mirai/contact/AvatarSpec;)Ljava/lang/String;\n\tpublic abstract fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getId ()J\n}\n\npublic final class net/mamoe/mirai/contact/ExceptionsKt {\n\tpublic static final fun getBotMuteRemaining (Lnet/mamoe/mirai/contact/BotIsBeingMutedException;)I\n}\n\npublic abstract interface class net/mamoe/mirai/contact/FileSupported : net/mamoe/mirai/contact/Contact {\n\tpublic abstract fun getFiles ()Lnet/mamoe/mirai/contact/file/RemoteFiles;\n\tpublic abstract fun getFilesRoot ()Lnet/mamoe/mirai/utils/RemoteFile;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/Friend : kotlinx/coroutines/CoroutineScope, net/mamoe/mirai/contact/AudioSupported, net/mamoe/mirai/contact/User, net/mamoe/mirai/contact/roaming/RoamingSupported {\n\tpublic fun delete ()V\n\tpublic abstract fun delete (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun getFriendGroup ()Lnet/mamoe/mirai/contact/friendgroup/FriendGroup;\n\tpublic abstract fun getRemark ()Ljava/lang/String;\n\tpublic fun nudge ()Lnet/mamoe/mirai/message/action/FriendNudge;\n\tpublic synthetic fun nudge ()Lnet/mamoe/mirai/message/action/Nudge;\n\tpublic synthetic fun nudge ()Lnet/mamoe/mirai/message/action/UserNudge;\n\tpublic fun sendMessage (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic abstract fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendMessage$suspendImpl (Lnet/mamoe/mirai/contact/Friend;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun setRemark (Ljava/lang/String;)V\n}\n\npublic abstract interface class net/mamoe/mirai/contact/Group : kotlinx/coroutines/CoroutineScope, net/mamoe/mirai/contact/AudioSupported, net/mamoe/mirai/contact/Contact, net/mamoe/mirai/contact/FileSupported, net/mamoe/mirai/contact/roaming/RoamingSupported {\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/Group$Companion;\n\tpublic fun avatarUrl (Lnet/mamoe/mirai/contact/AvatarSpec;)Ljava/lang/String;\n\tpublic abstract fun contains (J)Z\n\tpublic fun contains (Lnet/mamoe/mirai/contact/NormalMember;)Z\n\tpublic abstract fun get (J)Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic abstract fun getActive ()Lnet/mamoe/mirai/contact/active/GroupActive;\n\tpublic abstract fun getAnnouncements ()Lnet/mamoe/mirai/contact/announcement/Announcements;\n\tpublic fun getAvatarUrl ()Ljava/lang/String;\n\tpublic synthetic fun getAvatarUrl (Lnet/mamoe/mirai/contact/AvatarSpec;)Ljava/lang/String;\n\tpublic abstract fun getBotAsMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun getBotMuteRemaining ()I\n\tpublic fun getBotPermission ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic abstract fun getEssences ()Lnet/mamoe/mirai/contact/essence/Essences;\n\tpublic abstract fun getId ()J\n\tpublic abstract fun getMembers ()Lnet/mamoe/mirai/contact/ContactList;\n\tpublic abstract fun getName ()Ljava/lang/String;\n\tpublic fun getOrFail (J)Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic abstract fun getOwner ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic abstract fun getSettings ()Lnet/mamoe/mirai/contact/GroupSettings;\n\tpublic fun quit ()Z\n\tpublic abstract fun quit (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic abstract fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendMessage$suspendImpl (Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun setEssenceMessage (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/message/data/MessageChain;)Z\n\tpublic static fun setEssenceMessage (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/message/data/MessageChain;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun setEssenceMessage (Lnet/mamoe/mirai/message/data/MessageSource;)Z\n\tpublic abstract fun setEssenceMessage (Lnet/mamoe/mirai/message/data/MessageSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun setName (Ljava/lang/String;)V\n\tpublic synthetic fun uploadVoice (Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/data/Voice;\n\tpublic abstract synthetic fun uploadVoice (Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/Group$Companion {\n\tpublic final fun setEssenceMessage (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/message/data/MessageChain;)Z\n\tpublic final fun setEssenceMessage (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/message/data/MessageChain;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/GroupKt {\n\tpublic static final synthetic fun getMember (Lnet/mamoe/mirai/contact/Group;J)Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic static final synthetic fun getMemberOrFail (Lnet/mamoe/mirai/contact/Group;J)Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic static final fun isBotMuted (Lnet/mamoe/mirai/contact/Group;)Z\n}\n\npublic abstract interface class net/mamoe/mirai/contact/GroupSettings {\n\tpublic abstract synthetic fun getEntranceAnnouncement ()Ljava/lang/String;\n\tpublic abstract fun isAllowMemberInvite ()Z\n\tpublic abstract fun isAnonymousChatEnabled ()Z\n\tpublic abstract fun isAutoApproveEnabled ()Z\n\tpublic abstract fun isMuteAll ()Z\n\tpublic abstract fun setAllowMemberInvite (Z)V\n\tpublic abstract fun setAnonymousChatEnabled (Z)V\n\tpublic abstract synthetic fun setEntranceAnnouncement (Ljava/lang/String;)V\n\tpublic abstract fun setMuteAll (Z)V\n}\n\npublic abstract interface class net/mamoe/mirai/contact/Member : net/mamoe/mirai/contact/User {\n\tpublic abstract fun getActive ()Lnet/mamoe/mirai/contact/active/MemberActive;\n\tpublic abstract fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic abstract fun getNameCard ()Ljava/lang/String;\n\tpublic abstract fun getPermission ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic fun getRankTitle ()Ljava/lang/String;\n\tpublic abstract fun getSpecialTitle ()Ljava/lang/String;\n\tpublic fun getTemperatureTitle ()Ljava/lang/String;\n\tpublic fun mute (I)V\n\tpublic abstract fun mute (ILkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun nudge ()Lnet/mamoe/mirai/message/action/MemberNudge;\n\tpublic fun sendMessage (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic abstract fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic abstract fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/MemberKt {\n\tpublic static final fun asFriend (Lnet/mamoe/mirai/contact/Member;)Lnet/mamoe/mirai/contact/Friend;\n\tpublic static final fun asFriendOrNull (Lnet/mamoe/mirai/contact/Member;)Lnet/mamoe/mirai/contact/Friend;\n\tpublic static final fun asStranger (Lnet/mamoe/mirai/contact/Member;)Lnet/mamoe/mirai/contact/Stranger;\n\tpublic static final fun asStrangerOrNull (Lnet/mamoe/mirai/contact/Member;)Lnet/mamoe/mirai/contact/Stranger;\n\tpublic static final fun getNameCardOrNick (Lnet/mamoe/mirai/contact/Member;)Ljava/lang/String;\n\tpublic static final fun isFriend (Lnet/mamoe/mirai/contact/Member;)Z\n\tpublic static final fun isStranger (Lnet/mamoe/mirai/contact/Member;)Z\n}\n\npublic final class net/mamoe/mirai/contact/MemberPermission : java/lang/Enum, java/lang/Comparable {\n\tpublic static final field ADMINISTRATOR Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic static final field MEMBER Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic static final field OWNER Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic final fun getLevel ()I\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic static fun values ()[Lnet/mamoe/mirai/contact/MemberPermission;\n}\n\npublic final class net/mamoe/mirai/contact/MemberPermissionKt {\n\tpublic static final fun checkBotPermission (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/MemberPermission;Lkotlin/jvm/functions/Function0;)V\n\tpublic static synthetic fun checkBotPermission$default (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/MemberPermission;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)V\n\tpublic static final fun isAdministrator (Lnet/mamoe/mirai/contact/Member;)Z\n\tpublic static final fun isOperator (Lnet/mamoe/mirai/contact/Member;)Z\n\tpublic static final fun isOwner (Lnet/mamoe/mirai/contact/Member;)Z\n}\n\npublic final class net/mamoe/mirai/contact/MessageTooLargeException : net/mamoe/mirai/contact/SendMessageFailedException {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/message/data/Message;Lnet/mamoe/mirai/message/data/Message;Ljava/lang/String;)V\n\tpublic fun getMessage ()Ljava/lang/String;\n\tpublic final fun getMessageAfterEvent ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/NormalMember : net/mamoe/mirai/contact/Member {\n\tpublic abstract fun getJoinTimestamp ()I\n\tpublic abstract fun getLastSpeakTimestamp ()I\n\tpublic abstract fun getMuteTimeRemaining ()I\n\tpublic abstract fun getNameCard ()Ljava/lang/String;\n\tpublic abstract fun getSpecialTitle ()Ljava/lang/String;\n\tpublic fun isMuted ()Z\n\tpublic fun kick (Ljava/lang/String;)V\n\tpublic fun kick (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun kick (Ljava/lang/String;Z)V\n\tpublic abstract fun kick (Ljava/lang/String;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun kick$suspendImpl (Lnet/mamoe/mirai/contact/NormalMember;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun modifyAdmin (Z)V\n\tpublic abstract fun modifyAdmin (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun nudge ()Lnet/mamoe/mirai/message/action/MemberNudge;\n\tpublic synthetic fun nudge ()Lnet/mamoe/mirai/message/action/Nudge;\n\tpublic synthetic fun nudge ()Lnet/mamoe/mirai/message/action/UserNudge;\n\tpublic fun sendMessage (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic abstract fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendMessage$suspendImpl (Lnet/mamoe/mirai/contact/NormalMember;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun setNameCard (Ljava/lang/String;)V\n\tpublic abstract fun setSpecialTitle (Ljava/lang/String;)V\n\tpublic fun unmute ()V\n\tpublic abstract fun unmute (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/NormalMemberKt {\n\tpublic static final fun getNameCardOrNick (Lnet/mamoe/mirai/contact/User;)Ljava/lang/String;\n\tpublic static final fun getNameCardOrNick (Lnet/mamoe/mirai/contact/UserOrBot;)Ljava/lang/String;\n\tpublic static final fun isMuted (Lnet/mamoe/mirai/contact/NormalMember;)Z\n\tpublic static final fun mute-8Mi8wO0 (Lnet/mamoe/mirai/contact/NormalMember;JLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun mute-fcu0wV4 (Lnet/mamoe/mirai/contact/NormalMember;JLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/OtherClient : net/mamoe/mirai/contact/Contact {\n\tpublic abstract fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getId ()J\n\tpublic abstract fun getInfo ()Lnet/mamoe/mirai/contact/OtherClientInfo;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendMessage$suspendImpl (Lnet/mamoe/mirai/contact/OtherClient;Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun uploadImage (Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadImage$suspendImpl (Lnet/mamoe/mirai/contact/OtherClient;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/OtherClientInfo {\n\tpublic final fun component1 ()I\n\tpublic final fun component2 ()Lnet/mamoe/mirai/contact/Platform;\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun component4 ()Ljava/lang/String;\n\tpublic final fun copy (ILnet/mamoe/mirai/contact/Platform;Ljava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/contact/OtherClientInfo;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/contact/OtherClientInfo;ILnet/mamoe/mirai/contact/Platform;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/contact/OtherClientInfo;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getAppId ()I\n\tpublic final fun getDeviceKind ()Ljava/lang/String;\n\tpublic final fun getDeviceName ()Ljava/lang/String;\n\tpublic final fun getPlatform ()Lnet/mamoe/mirai/contact/Platform;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/contact/OtherClientKt {\n\tpublic static final fun getDeviceKind (Lnet/mamoe/mirai/contact/OtherClient;)Ljava/lang/String;\n\tpublic static final fun getDeviceName (Lnet/mamoe/mirai/contact/OtherClient;)Ljava/lang/String;\n\tpublic static final fun getPlatform (Lnet/mamoe/mirai/contact/OtherClient;)Lnet/mamoe/mirai/contact/Platform;\n}\n\npublic final class net/mamoe/mirai/contact/PermissionDeniedException : java/lang/IllegalStateException {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic final class net/mamoe/mirai/contact/Platform : java/lang/Enum {\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/Platform$Companion;\n\tpublic static final field IOS Lnet/mamoe/mirai/contact/Platform;\n\tpublic static final field MOBILE Lnet/mamoe/mirai/contact/Platform;\n\tpublic static final field WINDOWS Lnet/mamoe/mirai/contact/Platform;\n\tpublic final fun getPlatformId ()I\n\tpublic final fun getTerminalId ()I\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/contact/Platform;\n\tpublic static fun values ()[Lnet/mamoe/mirai/contact/Platform;\n}\n\npublic final class net/mamoe/mirai/contact/Platform$Companion {\n}\n\npublic class net/mamoe/mirai/contact/SendMessageFailedException : java/lang/RuntimeException {\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/contact/SendMessageFailedException$Reason;Lnet/mamoe/mirai/message/data/Message;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun getOriginalMessage ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic final fun getReason ()Lnet/mamoe/mirai/contact/SendMessageFailedException$Reason;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n}\n\npublic final class net/mamoe/mirai/contact/SendMessageFailedException$Reason : java/lang/Enum {\n\tpublic static final field AT_ALL_LIMITED Lnet/mamoe/mirai/contact/SendMessageFailedException$Reason;\n\tpublic static final field BOT_MUTED Lnet/mamoe/mirai/contact/SendMessageFailedException$Reason;\n\tpublic static final field GROUP_CHAT_LIMITED Lnet/mamoe/mirai/contact/SendMessageFailedException$Reason;\n\tpublic static final field LIMITED_MESSAGING Lnet/mamoe/mirai/contact/SendMessageFailedException$Reason;\n\tpublic static final field MESSAGE_TOO_LARGE Lnet/mamoe/mirai/contact/SendMessageFailedException$Reason;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/contact/SendMessageFailedException$Reason;\n\tpublic static fun values ()[Lnet/mamoe/mirai/contact/SendMessageFailedException$Reason;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/Stranger : kotlinx/coroutines/CoroutineScope, net/mamoe/mirai/contact/User {\n\tpublic fun delete ()V\n\tpublic abstract fun delete (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic synthetic fun nudge ()Lnet/mamoe/mirai/message/action/Nudge;\n\tpublic fun nudge ()Lnet/mamoe/mirai/message/action/StrangerNudge;\n\tpublic synthetic fun nudge ()Lnet/mamoe/mirai/message/action/UserNudge;\n\tpublic fun sendMessage (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic abstract fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendMessage$suspendImpl (Lnet/mamoe/mirai/contact/Stranger;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/StrangerKt {\n\tpublic static final fun asFriend (Lnet/mamoe/mirai/contact/Stranger;)Lnet/mamoe/mirai/contact/Friend;\n\tpublic static final fun asFriendOrNull (Lnet/mamoe/mirai/contact/Stranger;)Lnet/mamoe/mirai/contact/Friend;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/User : kotlinx/coroutines/CoroutineScope, net/mamoe/mirai/contact/Contact, net/mamoe/mirai/contact/UserOrBot {\n\tpublic abstract fun getId ()J\n\tpublic abstract fun getRemark ()Ljava/lang/String;\n\tpublic abstract fun nudge ()Lnet/mamoe/mirai/message/action/UserNudge;\n\tpublic fun queryProfile ()Lnet/mamoe/mirai/data/UserProfile;\n\tpublic fun queryProfile (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun queryProfile$suspendImpl (Lnet/mamoe/mirai/contact/User;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic abstract fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendMessage$suspendImpl (Lnet/mamoe/mirai/contact/User;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/UserKt {\n\tpublic static final fun getRemarkOrNameCard (Lnet/mamoe/mirai/contact/Member;)Ljava/lang/String;\n\tpublic static final fun getRemarkOrNameCardOrNick (Lnet/mamoe/mirai/contact/Member;)Ljava/lang/String;\n\tpublic static final fun getRemarkOrNick (Lnet/mamoe/mirai/contact/User;)Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/UserOrBot : net/mamoe/mirai/contact/ContactOrBot {\n\tpublic abstract fun getNick ()Ljava/lang/String;\n\tpublic abstract fun nudge ()Lnet/mamoe/mirai/message/action/Nudge;\n}\n\npublic final class net/mamoe/mirai/contact/active/ActiveChart {\n\tpublic final fun getActives ()Ljava/util/Map;\n\tpublic final fun getExit ()Ljava/util/Map;\n\tpublic final fun getJoin ()Ljava/util/Map;\n\tpublic final fun getMembers ()Ljava/util/Map;\n\tpublic final fun getSentences ()Ljava/util/Map;\n}\n\npublic final class net/mamoe/mirai/contact/active/ActiveHonorInfo {\n\tpublic final fun getAvatar ()Ljava/lang/String;\n\tpublic final fun getHistoryDays ()I\n\tpublic final fun getMaxTermDays ()I\n\tpublic final fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getMemberId ()J\n\tpublic final fun getMemberName ()Ljava/lang/String;\n\tpublic final fun getTermDays ()I\n}\n\npublic final class net/mamoe/mirai/contact/active/ActiveHonorList {\n\tpublic final fun getCurrent ()Lnet/mamoe/mirai/contact/active/ActiveHonorInfo;\n\tpublic final fun getRecords ()Ljava/util/List;\n\tpublic final fun getType ()I\n}\n\npublic final class net/mamoe/mirai/contact/active/ActiveRankRecord {\n\tpublic final fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getMemberId ()J\n\tpublic final fun getMemberName ()Ljava/lang/String;\n\tpublic final fun getScore ()I\n\tpublic final fun getTemperature ()I\n}\n\npublic final class net/mamoe/mirai/contact/active/ActiveRecord {\n\tpublic final fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getMemberId ()J\n\tpublic final fun getMemberName ()Ljava/lang/String;\n\tpublic final fun getMessagesCount ()I\n\tpublic final fun getPeriodDays ()I\n}\n\npublic abstract interface class net/mamoe/mirai/contact/active/GroupActive : net/mamoe/mirai/utils/Streamable {\n\tpublic abstract fun getRankTitles ()Ljava/util/Map;\n\tpublic abstract fun getTemperatureTitles ()Ljava/util/Map;\n\tpublic abstract fun isHonorVisible ()Z\n\tpublic abstract fun isTemperatureVisible ()Z\n\tpublic abstract fun isTitleVisible ()Z\n\tpublic fun queryActiveRank ()Ljava/util/List;\n\tpublic abstract fun queryActiveRank (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun queryChart ()Lnet/mamoe/mirai/contact/active/ActiveChart;\n\tpublic abstract fun queryChart (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun queryHonorHistory (ILkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun refresh ()V\n\tpublic abstract fun refresh (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun setHonorVisible (Z)V\n\tpublic abstract fun setHonorVisible (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun setRankTitles (Ljava/util/Map;)V\n\tpublic abstract fun setRankTitles (Ljava/util/Map;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun setTemperatureTitles (Ljava/util/Map;)V\n\tpublic abstract fun setTemperatureTitles (Ljava/util/Map;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun setTemperatureVisible (Z)V\n\tpublic abstract fun setTemperatureVisible (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun setTitleVisible (Z)V\n\tpublic abstract fun setTitleVisible (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/active/MemberActive {\n\tpublic abstract fun getHonors ()Ljava/util/Set;\n\tpublic abstract fun getPoint ()I\n\tpublic abstract fun getRank ()I\n\tpublic abstract fun getTemperature ()I\n\tpublic fun queryMedal ()Lnet/mamoe/mirai/contact/active/MemberMedalInfo;\n\tpublic abstract fun queryMedal (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/active/MemberMedalInfo {\n\tpublic final fun getColor ()Ljava/lang/String;\n\tpublic final fun getMedals ()Ljava/util/Set;\n\tpublic final fun getTitle ()Ljava/lang/String;\n\tpublic final fun getWearing ()Lnet/mamoe/mirai/contact/active/MemberMedalType;\n}\n\npublic final class net/mamoe/mirai/contact/active/MemberMedalType : java/lang/Enum {\n\tpublic static final field ACTIVE Lnet/mamoe/mirai/contact/active/MemberMedalType;\n\tpublic static final field ADMIN Lnet/mamoe/mirai/contact/active/MemberMedalType;\n\tpublic static final field OWNER Lnet/mamoe/mirai/contact/active/MemberMedalType;\n\tpublic static final field SPECIAL Lnet/mamoe/mirai/contact/active/MemberMedalType;\n\tpublic final fun getMask ()I\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/contact/active/MemberMedalType;\n\tpublic static fun values ()[Lnet/mamoe/mirai/contact/active/MemberMedalType;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/announcement/Announcement {\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/announcement/Announcement$Companion;\n\tpublic abstract fun getContent ()Ljava/lang/String;\n\tpublic abstract fun getParameters ()Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;\n\tpublic static fun publishAnnouncement (Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;)Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;\n\tpublic static fun publishAnnouncement (Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun publishAnnouncement (Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;)Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;\n\tpublic static fun publishAnnouncement (Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun publishTo (Lnet/mamoe/mirai/contact/Group;)Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;\n\tpublic fun publishTo (Lnet/mamoe/mirai/contact/Group;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun publishTo$suspendImpl (Lnet/mamoe/mirai/contact/announcement/Announcement;Lnet/mamoe/mirai/contact/Group;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/Announcement$Companion {\n\tpublic final fun publishAnnouncement (Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;)Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;\n\tpublic final fun publishAnnouncement (Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final synthetic fun publishAnnouncement (Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun publishAnnouncement (Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;)Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;\n\tpublic final fun publishAnnouncement (Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun publishAnnouncement$default (Lnet/mamoe/mirai/contact/announcement/Announcement$Companion;Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;ILjava/lang/Object;)Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;\n\tpublic static synthetic fun publishAnnouncement$default (Lnet/mamoe/mirai/contact/announcement/Announcement$Companion;Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/AnnouncementImage {\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/announcement/AnnouncementImage$Companion;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (ILjava/lang/String;IILkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;IILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic static final fun create (Ljava/lang/String;II)Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getHeight ()I\n\tpublic final fun getId ()Ljava/lang/String;\n\tpublic final fun getUrl ()Ljava/lang/String;\n\tpublic final fun getWidth ()I\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/contact/announcement/AnnouncementImage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/contact/announcement/AnnouncementImage$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/AnnouncementImage$Companion {\n\tpublic final fun create (Ljava/lang/String;II)Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/AnnouncementKt {\n\tpublic static final fun toOffline (Lnet/mamoe/mirai/contact/announcement/Announcement;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/AnnouncementParameters {\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters$Companion;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic fun <init> ()V\n\tpublic synthetic fun <init> (ILnet/mamoe/mirai/contact/announcement/AnnouncementImage;ZZZZZLkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic final fun builder ()Lnet/mamoe/mirai/contact/announcement/AnnouncementParametersBuilder;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic static final fun getDefault ()Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;\n\tpublic final fun getImage ()Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;\n\tpublic final fun getRequireConfirmation ()Z\n\tpublic final fun getSendToNewMember ()Z\n\tpublic final fun getShowEditCard ()Z\n\tpublic final fun getShowPopup ()Z\n\tpublic fun hashCode ()I\n\tpublic final fun isPinned ()Z\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/contact/announcement/AnnouncementParameters$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/AnnouncementParameters$Companion {\n\tpublic final fun getDefault ()Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/AnnouncementParametersBuilder {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun build ()Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;\n\tpublic final fun image ()Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;\n\tpublic final fun image (Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;)Lnet/mamoe/mirai/contact/announcement/AnnouncementParametersBuilder;\n\tpublic final fun isPinned ()Z\n\tpublic final fun isPinned (Z)Lnet/mamoe/mirai/contact/announcement/AnnouncementParametersBuilder;\n\tpublic final fun requireConfirmation ()Z\n\tpublic final fun requireConfirmation (Z)Lnet/mamoe/mirai/contact/announcement/AnnouncementParametersBuilder;\n\tpublic final fun sendToNewMember ()Z\n\tpublic final fun sendToNewMember (Z)Lnet/mamoe/mirai/contact/announcement/AnnouncementParametersBuilder;\n\tpublic final synthetic fun setImage (Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;)V\n\tpublic final synthetic fun setPinned (Z)V\n\tpublic final synthetic fun setRequireConfirmation (Z)V\n\tpublic final synthetic fun setSendToNewMember (Z)V\n\tpublic final synthetic fun setShowEditCard (Z)V\n\tpublic final synthetic fun setShowPopup (Z)V\n\tpublic final fun showEditCard ()Z\n\tpublic final fun showEditCard (Z)Lnet/mamoe/mirai/contact/announcement/AnnouncementParametersBuilder;\n\tpublic final fun showPopup ()Z\n\tpublic final fun showPopup (Z)Lnet/mamoe/mirai/contact/announcement/AnnouncementParametersBuilder;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/AnnouncementParametersBuilderKt {\n\tpublic static final fun buildAnnouncementParameters (Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/announcement/Announcements : net/mamoe/mirai/utils/Streamable {\n\tpublic synthetic fun asFlow (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun asFlow (Lnet/mamoe/mirai/contact/announcement/Announcements;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun delete (Ljava/lang/String;)Z\n\tpublic abstract fun delete (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun get (Ljava/lang/String;)Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;\n\tpublic abstract fun get (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun members (Ljava/lang/String;Z)Ljava/util/List;\n\tpublic abstract fun members (Ljava/lang/String;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun publish (Lnet/mamoe/mirai/contact/announcement/Announcement;)Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;\n\tpublic abstract fun publish (Lnet/mamoe/mirai/contact/announcement/Announcement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun remind (Ljava/lang/String;)V\n\tpublic abstract fun remind (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun uploadImage (Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;\n\tpublic abstract fun uploadImage (Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/announcement/OfflineAnnouncement : net/mamoe/mirai/contact/announcement/Announcement {\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement$Companion;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic static fun create (Ljava/lang/String;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n\tpublic static fun create (Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n\tpublic static fun from (Lnet/mamoe/mirai/contact/announcement/Announcement;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/OfflineAnnouncement$Companion {\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic final fun create (Ljava/lang/String;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n\tpublic final synthetic fun create (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n\tpublic final fun create (Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n\tpublic static synthetic fun create$default (Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement$Companion;Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;ILjava/lang/Object;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n\tpublic final fun from (Lnet/mamoe/mirai/contact/announcement/Announcement;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/OfflineAnnouncementKt {\n\tpublic static final fun OfflineAnnouncement (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n\tpublic static final fun OfflineAnnouncement (Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n\tpublic static final fun OfflineAnnouncement (Lnet/mamoe/mirai/contact/announcement/Announcement;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n\tpublic static synthetic fun OfflineAnnouncement$default (Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;ILjava/lang/Object;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/announcement/OnlineAnnouncement : net/mamoe/mirai/contact/announcement/Announcement {\n\tpublic fun delete ()Z\n\tpublic fun delete (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun delete$suspendImpl (Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun getAllConfirmed ()Z\n\tpublic abstract fun getConfirmedMembersCount ()I\n\tpublic abstract fun getFid ()Ljava/lang/String;\n\tpublic abstract fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic abstract fun getPublicationTime ()J\n\tpublic abstract fun getSender ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic abstract fun getSenderId ()J\n\tpublic fun members (Z)Ljava/util/List;\n\tpublic fun members (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun members$suspendImpl (Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun remind ()V\n\tpublic fun remind (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun remind$suspendImpl (Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/OnlineAnnouncementKt {\n\tpublic static final fun getBot (Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;)Lnet/mamoe/mirai/Bot;\n}\n\npublic final class net/mamoe/mirai/contact/essence/EssenceMessageRecord {\n\tpublic final fun getFullSource ()Lnet/mamoe/mirai/message/data/MessageSource;\n\tpublic final fun getFullSource (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun getOperator ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getOperatorId ()J\n\tpublic final fun getOperatorNick ()Ljava/lang/String;\n\tpublic final fun getOperatorTime ()I\n\tpublic final fun getSender ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getSenderId ()J\n\tpublic final fun getSenderNick ()Ljava/lang/String;\n\tpublic final fun getSenderTime ()I\n\tpublic final fun getSource ()Lnet/mamoe/mirai/message/data/MessageSource;\n\tpublic final fun getSource (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/essence/Essences : net/mamoe/mirai/utils/Streamable {\n\tpublic fun getPage (II)Ljava/util/List;\n\tpublic abstract fun getPage (IILkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun remove (Lnet/mamoe/mirai/message/data/MessageSource;)V\n\tpublic abstract fun remove (Lnet/mamoe/mirai/message/data/MessageSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun share (Lnet/mamoe/mirai/message/data/MessageSource;)Ljava/lang/String;\n\tpublic abstract fun share (Lnet/mamoe/mirai/message/data/MessageSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/file/AbsoluteFile : net/mamoe/mirai/contact/file/AbsoluteFileFolder {\n\tpublic abstract fun getExpiryTime ()J\n\tpublic abstract fun getMd5 ()[B\n\tpublic abstract fun getSha1 ()[B\n\tpublic abstract fun getSize ()J\n\tpublic fun getUrl ()Ljava/lang/String;\n\tpublic abstract fun getUrl (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun moveTo (Lnet/mamoe/mirai/contact/file/AbsoluteFolder;)Z\n\tpublic abstract fun moveTo (Lnet/mamoe/mirai/contact/file/AbsoluteFolder;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun refreshed ()Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic abstract fun refreshed (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun toMessage ()Lnet/mamoe/mirai/message/data/FileMessage;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/file/AbsoluteFileFolder {\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/file/AbsoluteFileFolder$Companion;\n\tpublic fun delete ()Z\n\tpublic abstract fun delete (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun exists ()Z\n\tpublic abstract fun exists (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun getAbsolutePath ()Ljava/lang/String;\n\tpublic abstract fun getContact ()Lnet/mamoe/mirai/contact/FileSupported;\n\tpublic static fun getExtension (Lnet/mamoe/mirai/contact/file/AbsoluteFileFolder;)Ljava/lang/String;\n\tpublic abstract fun getId ()Ljava/lang/String;\n\tpublic abstract fun getLastModifiedTime ()J\n\tpublic abstract fun getName ()Ljava/lang/String;\n\tpublic static fun getNameWithoutExtension (Lnet/mamoe/mirai/contact/file/AbsoluteFileFolder;)Ljava/lang/String;\n\tpublic abstract fun getParent ()Lnet/mamoe/mirai/contact/file/AbsoluteFolder;\n\tpublic abstract fun getUploadTime ()J\n\tpublic abstract fun getUploaderId ()J\n\tpublic abstract fun isFile ()Z\n\tpublic abstract fun isFolder ()Z\n\tpublic fun refresh ()Z\n\tpublic abstract fun refresh (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun refreshed ()Lnet/mamoe/mirai/contact/file/AbsoluteFileFolder;\n\tpublic abstract fun refreshed (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun renameTo (Ljava/lang/String;)Z\n\tpublic abstract fun renameTo (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/contact/file/AbsoluteFileFolder$Companion {\n\tpublic final fun getExtension (Lnet/mamoe/mirai/contact/file/AbsoluteFileFolder;)Ljava/lang/String;\n\tpublic final fun getNameWithoutExtension (Lnet/mamoe/mirai/contact/file/AbsoluteFileFolder;)Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/file/AbsoluteFolder : net/mamoe/mirai/contact/file/AbsoluteFileFolder {\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/file/AbsoluteFolder$Companion;\n\tpublic static final field ROOT_FOLDER_ID Ljava/lang/String;\n\tpublic fun children ()Lkotlinx/coroutines/flow/Flow;\n\tpublic abstract fun children (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun childrenStream ()Ljava/util/stream/Stream;\n\tpublic abstract fun childrenStream (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun createFolder (Ljava/lang/String;)Lnet/mamoe/mirai/contact/file/AbsoluteFolder;\n\tpublic abstract fun createFolder (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun files ()Lkotlinx/coroutines/flow/Flow;\n\tpublic abstract fun files (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun filesStream ()Ljava/util/stream/Stream;\n\tpublic abstract fun filesStream (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun folders ()Lkotlinx/coroutines/flow/Flow;\n\tpublic abstract fun folders (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun foldersStream ()Ljava/util/stream/Stream;\n\tpublic abstract fun foldersStream (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun getContentsCount ()I\n\tpublic fun isEmpty ()Z\n\tpublic fun refreshed ()Lnet/mamoe/mirai/contact/file/AbsoluteFolder;\n\tpublic abstract fun refreshed (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun resolveAll (Ljava/lang/String;)Lkotlinx/coroutines/flow/Flow;\n\tpublic abstract fun resolveAll (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun resolveAllStream (Ljava/lang/String;)Ljava/util/stream/Stream;\n\tpublic abstract fun resolveAllStream (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun resolveFileById (Ljava/lang/String;)Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic fun resolveFileById (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun resolveFileById (Ljava/lang/String;Z)Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic abstract fun resolveFileById (Ljava/lang/String;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun resolveFileById$default (Lnet/mamoe/mirai/contact/file/AbsoluteFolder;Ljava/lang/String;ZILjava/lang/Object;)Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic static synthetic fun resolveFileById$default (Lnet/mamoe/mirai/contact/file/AbsoluteFolder;Ljava/lang/String;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun resolveFiles (Ljava/lang/String;)Lkotlinx/coroutines/flow/Flow;\n\tpublic abstract fun resolveFiles (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun resolveFilesStream (Ljava/lang/String;)Ljava/util/stream/Stream;\n\tpublic abstract fun resolveFilesStream (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun resolveFolder (Ljava/lang/String;)Lnet/mamoe/mirai/contact/file/AbsoluteFolder;\n\tpublic abstract fun resolveFolder (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun resolveFolderById (Ljava/lang/String;)Lnet/mamoe/mirai/contact/file/AbsoluteFolder;\n\tpublic abstract fun resolveFolderById (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun uploadNewFile (Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic fun uploadNewFile (Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun uploadNewFile (Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ProgressionCallback;)Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic abstract fun uploadNewFile (Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadNewFile$default (Lnet/mamoe/mirai/contact/file/AbsoluteFolder;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic static synthetic fun uploadNewFile$default (Lnet/mamoe/mirai/contact/file/AbsoluteFolder;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/file/AbsoluteFolder$Companion {\n\tpublic static final field ROOT_FOLDER_ID Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/file/RemoteFiles {\n\tpublic abstract fun getContact ()Lnet/mamoe/mirai/contact/FileSupported;\n\tpublic abstract fun getRoot ()Lnet/mamoe/mirai/contact/file/AbsoluteFolder;\n\tpublic fun uploadNewFile (Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic fun uploadNewFile (Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun uploadNewFile (Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ProgressionCallback;)Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic fun uploadNewFile (Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadNewFile$default (Lnet/mamoe/mirai/contact/file/RemoteFiles;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic static synthetic fun uploadNewFile$default (Lnet/mamoe/mirai/contact/file/RemoteFiles;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadNewFile$suspendImpl (Lnet/mamoe/mirai/contact/file/RemoteFiles;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/friendgroup/FriendGroup {\n\tpublic fun delete ()Z\n\tpublic abstract fun delete (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun getCount ()I\n\tpublic abstract fun getFriends ()Ljava/util/Collection;\n\tpublic abstract fun getId ()I\n\tpublic abstract fun getName ()Ljava/lang/String;\n\tpublic fun moveIn (Lnet/mamoe/mirai/contact/Friend;)Z\n\tpublic abstract fun moveIn (Lnet/mamoe/mirai/contact/Friend;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun renameTo (Ljava/lang/String;)Z\n\tpublic abstract fun renameTo (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/friendgroup/FriendGroups {\n\tpublic abstract fun asCollection ()Ljava/util/Collection;\n\tpublic fun create (Ljava/lang/String;)Lnet/mamoe/mirai/contact/friendgroup/FriendGroup;\n\tpublic abstract fun create (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun get (I)Lnet/mamoe/mirai/contact/friendgroup/FriendGroup;\n\tpublic fun getDefault ()Lnet/mamoe/mirai/contact/friendgroup/FriendGroup;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/roaming/RoamingMessage {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getContact ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic abstract fun getIds ()[I\n\tpublic abstract fun getInternalIds ()[I\n\tpublic abstract fun getSender ()J\n\tpublic abstract fun getTarget ()J\n\tpublic abstract fun getTime ()J\n}\n\npublic abstract interface class net/mamoe/mirai/contact/roaming/RoamingMessageFilter {\n\tpublic static final field ANY Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter$Companion;\n\tpublic static final field RECEIVED Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;\n\tpublic static final field SENT Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;\n\tpublic fun and (Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;)Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;\n\tpublic abstract fun invoke (Lnet/mamoe/mirai/contact/roaming/RoamingMessage;)Z\n\tpublic fun not ()Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;\n\tpublic fun or (Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;)Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;\n}\n\npublic final class net/mamoe/mirai/contact/roaming/RoamingMessageFilter$Companion {\n}\n\npublic abstract interface class net/mamoe/mirai/contact/roaming/RoamingMessages {\n\tpublic fun getAllMessages (Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;)Lkotlinx/coroutines/flow/Flow;\n\tpublic fun getAllMessages (Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun getAllMessages$default (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow;\n\tpublic static synthetic fun getAllMessages$default (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun getAllMessages$suspendImpl (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun getAllMessagesStream ()Ljava/util/stream/Stream;\n\tpublic fun getAllMessagesStream (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun getAllMessagesStream (Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;)Ljava/util/stream/Stream;\n\tpublic fun getAllMessagesStream (Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun getAllMessagesStream$default (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;ILjava/lang/Object;)Ljava/util/stream/Stream;\n\tpublic static synthetic fun getAllMessagesStream$default (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun getAllMessagesStream$suspendImpl (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun getMessagesIn (JJLnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;)Lkotlinx/coroutines/flow/Flow;\n\tpublic abstract fun getMessagesIn (JJLnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun getMessagesIn$default (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;JJLnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow;\n\tpublic static synthetic fun getMessagesIn$default (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;JJLnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun getMessagesStream (JJ)Ljava/util/stream/Stream;\n\tpublic fun getMessagesStream (JJLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun getMessagesStream (JJLnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;)Ljava/util/stream/Stream;\n\tpublic fun getMessagesStream (JJLnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun getMessagesStream$default (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;JJLnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;ILjava/lang/Object;)Ljava/util/stream/Stream;\n\tpublic static synthetic fun getMessagesStream$default (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;JJLnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun getMessagesStream$suspendImpl (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;JJLnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/roaming/RoamingSupported : net/mamoe/mirai/contact/Contact {\n\tpublic abstract fun getRoamingMessages ()Lnet/mamoe/mirai/contact/roaming/RoamingMessages;\n}\n\npublic abstract interface class net/mamoe/mirai/data/FriendInfo : net/mamoe/mirai/data/UserInfo {\n\tpublic abstract fun getFriendGroupId ()I\n\tpublic abstract fun getNick ()Ljava/lang/String;\n\tpublic abstract fun getRemark ()Ljava/lang/String;\n\tpublic abstract fun getUin ()J\n\tpublic abstract fun setRemark (Ljava/lang/String;)V\n}\n\npublic class net/mamoe/mirai/data/FriendInfoImpl : net/mamoe/mirai/data/FriendInfo {\n\tpublic fun <init> (JLjava/lang/String;Ljava/lang/String;)V\n\tpublic fun getFriendGroupId ()I\n\tpublic fun getNick ()Ljava/lang/String;\n\tpublic fun getRemark ()Ljava/lang/String;\n\tpublic fun getUin ()J\n\tpublic fun setFriendGroupId (I)V\n\tpublic fun setNick (Ljava/lang/String;)V\n\tpublic fun setRemark (Ljava/lang/String;)V\n}\n\npublic final class net/mamoe/mirai/data/GroupHonorType {\n\tpublic static final field BRONZE_ID I\n\tpublic static final field Companion Lnet/mamoe/mirai/data/GroupHonorType$Companion;\n\tpublic static final field EMOTION_ID I\n\tpublic static final field GOLDEN_ID I\n\tpublic static final field LEGEND_ID I\n\tpublic static final field PERFORMER_ID I\n\tpublic static final field RED_PACKET_ID I\n\tpublic static final field RICHER_ID I\n\tpublic static final field SILVER_ID I\n\tpublic static final field STRONG_NEWBIE_ID I\n\tpublic static final field TALKATIVE_ID I\n\tpublic static final field WHIRLWIND_ID I\n\tpublic static final synthetic fun box-impl (I)Lnet/mamoe/mirai/data/GroupHonorType;\n\tpublic static fun constructor-impl (I)I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic static fun equals-impl (ILjava/lang/Object;)Z\n\tpublic static final fun equals-impl0 (II)Z\n\tpublic static final fun getBRONZE-AVr_HNQ ()I\n\tpublic static final fun getEMOTION-AVr_HNQ ()I\n\tpublic static final fun getGOLDEN-AVr_HNQ ()I\n\tpublic final fun getId ()I\n\tpublic static final fun getLEGEND-AVr_HNQ ()I\n\tpublic static final fun getPERFORMER-AVr_HNQ ()I\n\tpublic static final fun getRED_PACKET-AVr_HNQ ()I\n\tpublic static final fun getRICHER-AVr_HNQ ()I\n\tpublic static final fun getSILVER-AVr_HNQ ()I\n\tpublic static final fun getSTRONG_NEWBIE-AVr_HNQ ()I\n\tpublic static final fun getTALKATIVE-AVr_HNQ ()I\n\tpublic static final fun getWHIRLWIND-AVr_HNQ ()I\n\tpublic fun hashCode ()I\n\tpublic static fun hashCode-impl (I)I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static fun toString-impl (I)Ljava/lang/String;\n\tpublic final synthetic fun unbox-impl ()I\n}\n\npublic final class net/mamoe/mirai/data/GroupHonorType$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/data/GroupHonorType$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize-NYH6FXw (Lkotlinx/serialization/encoding/Decoder;)I\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize-aLnpm_Q (Lkotlinx/serialization/encoding/Encoder;I)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/data/GroupHonorType$Companion {\n\tpublic final fun getBRONZE-AVr_HNQ ()I\n\tpublic final fun getEMOTION-AVr_HNQ ()I\n\tpublic final fun getGOLDEN-AVr_HNQ ()I\n\tpublic final fun getLEGEND-AVr_HNQ ()I\n\tpublic final fun getPERFORMER-AVr_HNQ ()I\n\tpublic final fun getRED_PACKET-AVr_HNQ ()I\n\tpublic final fun getRICHER-AVr_HNQ ()I\n\tpublic final fun getSILVER-AVr_HNQ ()I\n\tpublic final fun getSTRONG_NEWBIE-AVr_HNQ ()I\n\tpublic final fun getTALKATIVE-AVr_HNQ ()I\n\tpublic final fun getWHIRLWIND-AVr_HNQ ()I\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract interface class net/mamoe/mirai/data/GroupInfo {\n\tpublic abstract fun getAllowAnonymousChat ()Z\n\tpublic abstract fun getAllowMemberInvite ()Z\n\tpublic abstract fun getAutoApprove ()Z\n\tpublic abstract fun getBotMuteTimestamp ()I\n\tpublic abstract fun getConfessTalk ()Z\n\tpublic abstract fun getGroupCode ()J\n\tpublic abstract fun getMemo ()Ljava/lang/String;\n\tpublic abstract fun getMuteAll ()Z\n\tpublic abstract fun getName ()Ljava/lang/String;\n\tpublic abstract fun getOwner ()J\n\tpublic abstract fun getRankTitles ()Ljava/util/Map;\n\tpublic abstract fun getTemperatureTitles ()Ljava/util/Map;\n\tpublic abstract fun getUin ()J\n\tpublic abstract fun isHonorVisible ()Z\n\tpublic abstract fun isTemperatureVisible ()Z\n\tpublic abstract fun isTitleVisible ()Z\n}\n\npublic abstract interface class net/mamoe/mirai/data/MemberInfo : net/mamoe/mirai/data/UserInfo {\n\tpublic fun getAnonymousId ()Ljava/lang/String;\n\tpublic abstract fun getHonors ()Ljava/util/Set;\n\tpublic abstract fun getJoinTimestamp ()I\n\tpublic abstract fun getLastSpeakTimestamp ()I\n\tpublic abstract fun getMuteTimestamp ()I\n\tpublic abstract fun getNameCard ()Ljava/lang/String;\n\tpublic abstract fun getPermission ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic abstract fun getPoint ()I\n\tpublic abstract fun getRank ()I\n\tpublic abstract fun getSpecialTitle ()Ljava/lang/String;\n\tpublic abstract fun getTemperature ()I\n\tpublic abstract fun isOfficialBot ()Z\n}\n\npublic final class net/mamoe/mirai/data/OnlineStatus : java/lang/Enum {\n\tpublic static final field AWAY Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic static final field BUSY Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic static final field Companion Lnet/mamoe/mirai/data/OnlineStatus$Companion;\n\tpublic static final field DND Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic static final field INVISIBLE Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic static final field OFFLINE Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic static final field ONLINE Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic static final field Q_ME Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic static final field RECEIVE_OFFLINE_MESSAGE Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic static final field UNKNOWN Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic final fun getId ()I\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic static fun values ()[Lnet/mamoe/mirai/data/OnlineStatus;\n}\n\npublic final class net/mamoe/mirai/data/OnlineStatus$Companion {\n\tpublic final fun ofId (I)Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic final fun ofIdOrNull (I)Lnet/mamoe/mirai/data/OnlineStatus;\n}\n\npublic abstract class net/mamoe/mirai/data/RequestEventData {\n\tpublic static final field Factory Lnet/mamoe/mirai/data/RequestEventData$Factory;\n\tpublic synthetic fun <init> (ILkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun accept (Lnet/mamoe/mirai/Bot;)V\n\tpublic abstract fun accept (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final fun from (Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest;\n\tpublic static final fun from (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;\n\tpublic static final fun from (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest;\n\tpublic abstract fun getEventId ()J\n\tpublic fun reject (Lnet/mamoe/mirai/Bot;)V\n\tpublic abstract fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/data/RequestEventData;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest : net/mamoe/mirai/data/RequestEventData {\n\tpublic static final field Companion Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest$Companion;\n\tpublic synthetic fun <init> (IJJLjava/lang/String;JLjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun accept (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun getEventId ()J\n\tpublic final fun getGroupId ()J\n\tpublic final fun getGroupName ()Ljava/lang/String;\n\tpublic final fun getInvitor ()J\n\tpublic final fun getInvitorNick ()Ljava/lang/String;\n\tpublic fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/data/RequestEventData$Factory {\n\tpublic final fun from (Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest;\n\tpublic final fun from (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;\n\tpublic final fun from (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/data/RequestEventData$MemberJoinRequest : net/mamoe/mirai/data/RequestEventData {\n\tpublic static final field Companion Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest$Companion;\n\tpublic synthetic fun <init> (IJJLjava/lang/String;JLjava/lang/String;JLjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic synthetic fun <init> (JJLjava/lang/String;JLjava/lang/String;JLjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun accept (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun getEventId ()J\n\tpublic final fun getGroupId ()J\n\tpublic final fun getGroupName ()Ljava/lang/String;\n\tpublic final fun getInvitor ()J\n\tpublic final fun getMessage ()Ljava/lang/String;\n\tpublic final fun getRequester ()J\n\tpublic final fun getRequesterNick ()Ljava/lang/String;\n\tpublic final fun reject (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun reject (Lnet/mamoe/mirai/Bot;ZLjava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun reject (Lnet/mamoe/mirai/Bot;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun reject$default (Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;Lnet/mamoe/mirai/Bot;ZLjava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/data/RequestEventData$MemberJoinRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/data/RequestEventData$MemberJoinRequest$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/data/RequestEventData$NewFriendRequest : net/mamoe/mirai/data/RequestEventData {\n\tpublic static final field Companion Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest$Companion;\n\tpublic synthetic fun <init> (IJJLjava/lang/String;JLjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun accept (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun getEventId ()J\n\tpublic final fun getFromGroupId ()J\n\tpublic final fun getMessage ()Ljava/lang/String;\n\tpublic final fun getRequester ()J\n\tpublic final fun getRequesterNick ()Ljava/lang/String;\n\tpublic fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun reject (Lnet/mamoe/mirai/Bot;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/data/RequestEventData$NewFriendRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/data/RequestEventData$NewFriendRequest$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract interface class net/mamoe/mirai/data/StrangerInfo : net/mamoe/mirai/data/UserInfo {\n\tpublic abstract fun getFromGroup ()J\n\tpublic abstract fun getNick ()Ljava/lang/String;\n\tpublic abstract fun getUin ()J\n}\n\npublic abstract interface class net/mamoe/mirai/data/UserInfo {\n\tpublic abstract fun getNick ()Ljava/lang/String;\n\tpublic abstract fun getRemark ()Ljava/lang/String;\n\tpublic abstract fun getUin ()J\n}\n\npublic abstract interface class net/mamoe/mirai/data/UserProfile {\n\tpublic abstract fun getAge ()I\n\tpublic abstract fun getEmail ()Ljava/lang/String;\n\tpublic abstract fun getFriendGroupId ()I\n\tpublic abstract fun getNickname ()Ljava/lang/String;\n\tpublic abstract fun getQLevel ()I\n\tpublic abstract fun getSex ()Lnet/mamoe/mirai/data/UserProfile$Sex;\n\tpublic abstract fun getSign ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/data/UserProfile$Sex : java/lang/Enum {\n\tpublic static final field FEMALE Lnet/mamoe/mirai/data/UserProfile$Sex;\n\tpublic static final field MALE Lnet/mamoe/mirai/data/UserProfile$Sex;\n\tpublic static final field UNKNOWN Lnet/mamoe/mirai/data/UserProfile$Sex;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/data/UserProfile$Sex;\n\tpublic static fun values ()[Lnet/mamoe/mirai/data/UserProfile$Sex;\n}\n\npublic abstract class net/mamoe/mirai/event/AbstractEvent : net/mamoe/mirai/event/Event {\n\tpublic field _intercepted Z\n\tpublic final field broadCastLock Lkotlinx/coroutines/sync/Mutex;\n\tpublic fun <init> ()V\n\tpublic final fun cancel ()V\n\tpublic fun intercept ()V\n\tpublic final fun isCancelled ()Z\n\tpublic fun isIntercepted ()Z\n}\n\npublic abstract interface class net/mamoe/mirai/event/BroadcastControllable : net/mamoe/mirai/event/Event {\n\tpublic fun getShouldBroadcast ()Z\n}\n\npublic abstract interface class net/mamoe/mirai/event/CancellableEvent : net/mamoe/mirai/event/Event {\n\tpublic abstract fun cancel ()V\n\tpublic abstract fun isCancelled ()Z\n}\n\npublic final class net/mamoe/mirai/event/ConcurrencyKind : java/lang/Enum {\n\tpublic static final field CONCURRENT Lnet/mamoe/mirai/event/ConcurrencyKind;\n\tpublic static final field LOCKED Lnet/mamoe/mirai/event/ConcurrencyKind;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/event/ConcurrencyKind;\n\tpublic static fun values ()[Lnet/mamoe/mirai/event/ConcurrencyKind;\n}\n\npublic abstract interface class net/mamoe/mirai/event/Event {\n\tpublic abstract fun intercept ()V\n\tpublic abstract fun isIntercepted ()Z\n}\n\npublic abstract class net/mamoe/mirai/event/EventChannel {\n\tpublic static synthetic fun asChannel$default (Lnet/mamoe/mirai/event/EventChannel;ILkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;ILjava/lang/Object;)Lkotlinx/coroutines/channels/Channel;\n\tpublic abstract fun asFlow ()Lkotlinx/coroutines/flow/Flow;\n\tpublic abstract fun context ([Lkotlin/coroutines/CoroutineContext;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic final fun exceptionHandler (Ljava/util/function/Consumer;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic final fun exceptionHandler (Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic final fun exceptionHandler (Lkotlinx/coroutines/CoroutineExceptionHandler;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic final fun filter (Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic final synthetic fun filter (Lkotlin/jvm/functions/Function2;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic final fun filterIsInstance (Ljava/lang/Class;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic final fun filterIsInstance (Lkotlin/reflect/KClass;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic final fun forwardToChannel (Lkotlinx/coroutines/channels/SendChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/EventPriority;)Lnet/mamoe/mirai/event/Listener;\n\tpublic static synthetic fun forwardToChannel$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlinx/coroutines/channels/SendChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/EventPriority;ILjava/lang/Object;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun getBaseEventClass ()Lkotlin/reflect/KClass;\n\tpublic final fun getDefaultCoroutineContext ()Lkotlin/coroutines/CoroutineContext;\n\tpublic final fun parentJob (Lkotlinx/coroutines/Job;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic final fun parentScope (Lkotlinx/coroutines/CoroutineScope;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic final fun registerListenerHost (Lnet/mamoe/mirai/event/ListenerHost;)V\n\tpublic final fun registerListenerHost (Lnet/mamoe/mirai/event/ListenerHost;Lkotlin/coroutines/CoroutineContext;)V\n\tpublic static synthetic fun registerListenerHost$default (Lnet/mamoe/mirai/event/EventChannel;Lnet/mamoe/mirai/event/ListenerHost;Lkotlin/coroutines/CoroutineContext;ILjava/lang/Object;)V\n\tpublic final fun subscribe (Ljava/lang/Class;Ljava/util/function/Function;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribe (Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Ljava/util/function/Function;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribe (Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Ljava/util/function/Function;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribe (Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Ljava/util/function/Function;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final synthetic fun subscribe (Lkotlin/reflect/KClass;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function3;)Lnet/mamoe/mirai/event/Listener;\n\tpublic static synthetic fun subscribe$default (Lnet/mamoe/mirai/event/EventChannel;Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Ljava/util/function/Function;ILjava/lang/Object;)Lnet/mamoe/mirai/event/Listener;\n\tpublic static synthetic fun subscribe$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/reflect/KClass;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribeAlways (Ljava/lang/Class;Ljava/util/function/Consumer;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribeAlways (Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Ljava/util/function/Consumer;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribeAlways (Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Ljava/util/function/Consumer;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribeAlways (Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Ljava/util/function/Consumer;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final synthetic fun subscribeAlways (Lkotlin/reflect/KClass;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function3;)Lnet/mamoe/mirai/event/Listener;\n\tpublic static synthetic fun subscribeAlways$default (Lnet/mamoe/mirai/event/EventChannel;Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Ljava/util/function/Consumer;ILjava/lang/Object;)Lnet/mamoe/mirai/event/Listener;\n\tpublic static synthetic fun subscribeAlways$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/reflect/KClass;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribeOnce (Ljava/lang/Class;Ljava/util/function/Consumer;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribeOnce (Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Ljava/util/function/Consumer;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribeOnce (Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Ljava/util/function/Consumer;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribeOnce (Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Ljava/util/function/Consumer;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribeOnce (Lkotlin/reflect/KClass;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function3;)Lnet/mamoe/mirai/event/Listener;\n\tpublic static synthetic fun subscribeOnce$default (Lnet/mamoe/mirai/event/EventChannel;Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Ljava/util/function/Consumer;ILjava/lang/Object;)Lnet/mamoe/mirai/event/Listener;\n\tpublic static synthetic fun subscribeOnce$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/reflect/KClass;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lnet/mamoe/mirai/event/Listener;\n}\n\npublic final class net/mamoe/mirai/event/EventChannelKt {\n\tpublic static final synthetic fun globalEventChannel (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic static synthetic fun globalEventChannel$default (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;ILjava/lang/Object;)Lnet/mamoe/mirai/event/EventChannel;\n}\n\npublic abstract interface annotation class net/mamoe/mirai/event/EventHandler : java/lang/annotation/Annotation {\n\tpublic abstract fun concurrency ()Lnet/mamoe/mirai/event/ConcurrencyKind;\n\tpublic abstract fun ignoreCancelled ()Z\n\tpublic abstract fun priority ()Lnet/mamoe/mirai/event/EventPriority;\n}\n\npublic final class net/mamoe/mirai/event/EventKt {\n\tpublic static final fun broadcast (Lnet/mamoe/mirai/event/Event;)Lnet/mamoe/mirai/event/Event;\n\tpublic static final fun broadcast (Lnet/mamoe/mirai/event/Event;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/event/EventPriority : java/lang/Enum {\n\tpublic static final field HIGH Lnet/mamoe/mirai/event/EventPriority;\n\tpublic static final field HIGHEST Lnet/mamoe/mirai/event/EventPriority;\n\tpublic static final field LOW Lnet/mamoe/mirai/event/EventPriority;\n\tpublic static final field LOWEST Lnet/mamoe/mirai/event/EventPriority;\n\tpublic static final field MONITOR Lnet/mamoe/mirai/event/EventPriority;\n\tpublic static final field NORMAL Lnet/mamoe/mirai/event/EventPriority;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/event/EventPriority;\n\tpublic static fun values ()[Lnet/mamoe/mirai/event/EventPriority;\n}\n\npublic final class net/mamoe/mirai/event/Events {\n\tpublic static final synthetic fun registerTo (Lkotlinx/coroutines/CoroutineScope;Lnet/mamoe/mirai/event/EventChannel;)V\n}\n\npublic final class net/mamoe/mirai/event/ExceptionInEventChannelFilterException : java/lang/IllegalStateException {\n\tpublic fun <init> (Lnet/mamoe/mirai/event/Event;Lnet/mamoe/mirai/event/EventChannel;Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/event/Event;Lnet/mamoe/mirai/event/EventChannel;Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getCause ()Ljava/lang/Throwable;\n\tpublic final fun getEvent ()Lnet/mamoe/mirai/event/Event;\n\tpublic final fun getEventChannel ()Lnet/mamoe/mirai/event/EventChannel;\n\tpublic fun getMessage ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/ExceptionInEventHandlerException : java/lang/IllegalStateException {\n\tpublic fun <init> (Lnet/mamoe/mirai/event/Event;Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/event/Event;Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getCause ()Ljava/lang/Throwable;\n\tpublic final fun getEvent ()Lnet/mamoe/mirai/event/Event;\n\tpublic fun getMessage ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/ExtensionsKt {\n\tpublic static final fun nextEventImpl (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/reflect/KClass;Lkotlinx/coroutines/CoroutineScope;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final fun syncFromEventImpl (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/reflect/KClass;Lkotlinx/coroutines/CoroutineScope;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/event/GlobalEventChannel : net/mamoe/mirai/event/EventChannel {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/event/GlobalEventChannel;\n\tpublic fun asFlow ()Lkotlinx/coroutines/flow/Flow;\n\tpublic fun context ([Lkotlin/coroutines/CoroutineContext;)Lnet/mamoe/mirai/event/EventChannel;\n}\n\npublic abstract interface class net/mamoe/mirai/event/Listener : kotlinx/coroutines/CompletableJob {\n\tpublic abstract fun getConcurrencyKind ()Lnet/mamoe/mirai/event/ConcurrencyKind;\n\tpublic fun getPriority ()Lnet/mamoe/mirai/event/EventPriority;\n\tpublic abstract fun onEvent (Lnet/mamoe/mirai/event/Event;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/event/Listener$DefaultImpls {\n\tpublic static synthetic fun cancel (Lnet/mamoe/mirai/event/Listener;)V\n\tpublic static fun fold (Lnet/mamoe/mirai/event/Listener;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;\n\tpublic static fun get (Lnet/mamoe/mirai/event/Listener;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element;\n\tpublic static fun minusKey (Lnet/mamoe/mirai/event/Listener;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext;\n\tpublic static fun plus (Lnet/mamoe/mirai/event/Listener;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext;\n\tpublic static fun plus (Lnet/mamoe/mirai/event/Listener;Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/Job;\n}\n\npublic abstract interface class net/mamoe/mirai/event/ListenerHost {\n}\n\npublic final class net/mamoe/mirai/event/ListeningStatus : java/lang/Enum {\n\tpublic static final field LISTENING Lnet/mamoe/mirai/event/ListeningStatus;\n\tpublic static final field STOPPED Lnet/mamoe/mirai/event/ListeningStatus;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/event/ListeningStatus;\n\tpublic static fun values ()[Lnet/mamoe/mirai/event/ListeningStatus;\n}\n\npublic abstract interface annotation class net/mamoe/mirai/event/MessageDsl : java/lang/annotation/Annotation {\n}\n\npublic abstract class net/mamoe/mirai/event/MessageSelectBuilder : net/mamoe/mirai/event/MessageSelectBuilderUnit {\n\tpublic fun <init> (Lnet/mamoe/mirai/event/events/MessageEvent;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V\n\tpublic synthetic fun always (Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic synthetic fun always (Lkotlin/jvm/functions/Function3;)Ljava/lang/Void;\n\tpublic synthetic fun containsReply (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;\n\tpublic synthetic fun containsReply (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Void;\n\tpublic synthetic fun containsReply (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic synthetic fun containsReply (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Ljava/lang/Void;\n\tpublic synthetic fun endsWithReply (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic synthetic fun endsWithReply (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Ljava/lang/Void;\n\tpublic synthetic fun findingReply (Lkotlin/text/Regex;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic synthetic fun findingReply (Lkotlin/text/Regex;Lkotlin/jvm/functions/Function3;)Ljava/lang/Void;\n\tpublic synthetic fun mapping (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic synthetic fun mapping (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;)Ljava/lang/Void;\n\tpublic synthetic fun matchingReply (Lkotlin/text/Regex;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic synthetic fun matchingReply (Lkotlin/text/Regex;Lkotlin/jvm/functions/Function3;)Ljava/lang/Void;\n\tpublic synthetic fun quoteReply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Ljava/lang/String;)Ljava/lang/Object;\n\tpublic synthetic fun quoteReply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Ljava/lang/String;)Ljava/lang/Void;\n\tpublic synthetic fun quoteReply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic synthetic fun quoteReply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lkotlin/jvm/functions/Function3;)Ljava/lang/Void;\n\tpublic synthetic fun quoteReply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/Object;\n\tpublic synthetic fun quoteReply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/Void;\n\tpublic synthetic fun quoteReply-8NSq9Eo (JLjava/lang/String;)Ljava/lang/Void;\n\tpublic synthetic fun quoteReply-8NSq9Eo (JLjava/lang/String;)V\n\tpublic synthetic fun quoteReply-8NSq9Eo (JLkotlin/jvm/functions/Function1;)Ljava/lang/Void;\n\tpublic synthetic fun quoteReply-8NSq9Eo (JLkotlin/jvm/functions/Function1;)V\n\tpublic synthetic fun quoteReply-8NSq9Eo (JLnet/mamoe/mirai/message/data/Message;)Ljava/lang/Void;\n\tpublic synthetic fun quoteReply-8NSq9Eo (JLnet/mamoe/mirai/message/data/Message;)V\n\tpublic synthetic fun reply (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;\n\tpublic synthetic fun reply (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Void;\n\tpublic synthetic fun reply (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic synthetic fun reply (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Ljava/lang/Void;\n\tpublic synthetic fun reply (Ljava/lang/String;Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/Object;\n\tpublic synthetic fun reply (Ljava/lang/String;Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/Void;\n\tpublic synthetic fun reply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Ljava/lang/String;)Ljava/lang/Object;\n\tpublic synthetic fun reply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Ljava/lang/String;)Ljava/lang/Void;\n\tpublic synthetic fun reply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic synthetic fun reply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lkotlin/jvm/functions/Function3;)Ljava/lang/Void;\n\tpublic synthetic fun reply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/Object;\n\tpublic synthetic fun reply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/Void;\n\tpublic synthetic fun reply-8NSq9Eo (JLjava/lang/String;)Ljava/lang/Void;\n\tpublic synthetic fun reply-8NSq9Eo (JLjava/lang/String;)V\n\tpublic synthetic fun reply-8NSq9Eo (JLkotlin/jvm/functions/Function1;)Ljava/lang/Void;\n\tpublic synthetic fun reply-8NSq9Eo (JLkotlin/jvm/functions/Function1;)V\n\tpublic synthetic fun reply-8NSq9Eo (JLnet/mamoe/mirai/message/data/Message;)Ljava/lang/Void;\n\tpublic synthetic fun reply-8NSq9Eo (JLnet/mamoe/mirai/message/data/Message;)V\n}\n\npublic abstract class net/mamoe/mirai/event/MessageSelectBuilderUnit : net/mamoe/mirai/event/CommonMessageSelectBuilderUnit {\n\tpublic fun <init> (Lnet/mamoe/mirai/event/events/MessageEvent;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V\n\tpublic final synthetic fun invoke-RNyhSv4 (JLkotlin/jvm/functions/Function1;)Ljava/lang/Void;\n\tpublic final synthetic fun invoke-RNyhSv4 (JLkotlin/jvm/functions/Function1;)V\n\tpublic final synthetic fun quoteReply-AVDwu3U (JLnet/mamoe/mirai/message/data/Message;)Ljava/lang/Void;\n\tpublic final synthetic fun quoteReply-AVDwu3U (JLnet/mamoe/mirai/message/data/Message;)V\n\tpublic final synthetic fun quoteReply-RNyhSv4 (JLkotlin/jvm/functions/Function1;)Ljava/lang/Void;\n\tpublic final synthetic fun quoteReply-RNyhSv4 (JLkotlin/jvm/functions/Function1;)V\n\tpublic final synthetic fun quoteReply-sCZ5gAI (JLjava/lang/String;)Ljava/lang/Void;\n\tpublic final synthetic fun quoteReply-sCZ5gAI (JLjava/lang/String;)V\n\tpublic final synthetic fun reply-AVDwu3U (JLnet/mamoe/mirai/message/data/Message;)Ljava/lang/Void;\n\tpublic final synthetic fun reply-AVDwu3U (JLnet/mamoe/mirai/message/data/Message;)V\n\tpublic final synthetic fun reply-RNyhSv4 (JLkotlin/jvm/functions/Function1;)Ljava/lang/Void;\n\tpublic final synthetic fun reply-RNyhSv4 (JLkotlin/jvm/functions/Function1;)V\n\tpublic final synthetic fun reply-sCZ5gAI (JLjava/lang/String;)Ljava/lang/Void;\n\tpublic final synthetic fun reply-sCZ5gAI (JLjava/lang/String;)V\n\tpublic final synthetic fun timeout-ncvN2qU (J)J\n}\n\npublic final class net/mamoe/mirai/event/MessageSelectionTimeoutChecker {\n\tpublic static final synthetic fun box-impl (J)Lnet/mamoe/mirai/event/MessageSelectionTimeoutChecker;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic static fun equals-impl (JLjava/lang/Object;)Z\n\tpublic static final fun equals-impl0 (JJ)Z\n\tpublic final fun getTimeoutMillis ()J\n\tpublic fun hashCode ()I\n\tpublic static fun hashCode-impl (J)I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static fun toString-impl (J)Ljava/lang/String;\n\tpublic final synthetic fun unbox-impl ()J\n}\n\npublic final class net/mamoe/mirai/event/MessageSelectionTimeoutException : java/lang/RuntimeException {\n\tpublic fun <init> ()V\n}\n\npublic class net/mamoe/mirai/event/MessageSubscribersBuilder {\n\tpublic fun always (Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final fun at (J)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun at (Lnet/mamoe/mirai/contact/User;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun atAll ()Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun atBot ()Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun atBot (Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final fun case (Ljava/lang/String;ZZ)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun case (Ljava/lang/String;ZZLkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic static synthetic fun case$default (Lnet/mamoe/mirai/event/MessageSubscribersBuilder;Ljava/lang/String;ZZILjava/lang/Object;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic static synthetic fun case$default (Lnet/mamoe/mirai/event/MessageSubscribersBuilder;Ljava/lang/String;ZZLkotlin/jvm/functions/Function3;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun contains (Ljava/lang/String;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun contains (Ljava/lang/String;Z)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun contains (Ljava/lang/String;ZZLkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic static synthetic fun contains$default (Lnet/mamoe/mirai/event/MessageSubscribersBuilder;Ljava/lang/String;ZILjava/lang/Object;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic static synthetic fun contains$default (Lnet/mamoe/mirai/event/MessageSubscribersBuilder;Ljava/lang/String;ZZLkotlin/jvm/functions/Function3;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun containsAll ([Ljava/lang/String;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun containsAll ([Ljava/lang/String;Z)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun containsAll ([Ljava/lang/String;ZZ)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic static synthetic fun containsAll$default (Lnet/mamoe/mirai/event/MessageSubscribersBuilder;[Ljava/lang/String;ZZILjava/lang/Object;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun containsAny ([Ljava/lang/String;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun containsAny ([Ljava/lang/String;Z)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun containsAny ([Ljava/lang/String;ZZ)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic static synthetic fun containsAny$default (Lnet/mamoe/mirai/event/MessageSubscribersBuilder;[Ljava/lang/String;ZZILjava/lang/Object;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic fun containsReply (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;\n\tpublic fun containsReply (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final fun content (Lkotlin/jvm/functions/Function2;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun endsWith (Ljava/lang/String;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun endsWith (Ljava/lang/String;Z)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun endsWith (Ljava/lang/String;ZZLkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic static synthetic fun endsWith$default (Lnet/mamoe/mirai/event/MessageSubscribersBuilder;Ljava/lang/String;ZILjava/lang/Object;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic static synthetic fun endsWith$default (Lnet/mamoe/mirai/event/MessageSubscribersBuilder;Ljava/lang/String;ZZLkotlin/jvm/functions/Function3;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun endsWithReply (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final fun finding (Lkotlin/text/Regex;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun finding (Lkotlin/text/Regex;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final synthetic fun findingExtension (Lkotlin/text/Regex;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic fun findingReply (Lkotlin/text/Regex;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final fun getSubscriber ()Lkotlin/jvm/functions/Function2;\n\tpublic final fun invoke (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic fun mapping (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final fun matching (Lkotlin/text/Regex;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun matching (Lkotlin/text/Regex;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final synthetic fun matchingExtension (Lkotlin/text/Regex;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic fun matchingReply (Lkotlin/text/Regex;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic fun newListeningFilter (Lkotlin/jvm/functions/Function2;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic fun quoteReply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Ljava/lang/String;)Ljava/lang/Object;\n\tpublic fun quoteReply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic fun quoteReply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/Object;\n\tpublic fun reply (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;\n\tpublic fun reply (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic fun reply (Ljava/lang/String;Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/Object;\n\tpublic fun reply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Ljava/lang/String;)Ljava/lang/Object;\n\tpublic fun reply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic fun reply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/Object;\n\tpublic final fun sentBy (J)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentBy (JLkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final fun sentBy (Ljava/lang/String;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentBy (Lnet/mamoe/mirai/contact/User;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentByAdministrator ()Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentByFriend ()Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentByFriend (Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final fun sentByGroupTemp ()Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentByOperator ()Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentByOwner ()Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentByStranger ()Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentByStranger (Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final synthetic fun sentByTemp ()Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentFrom (J)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentFrom (Lnet/mamoe/mirai/contact/Group;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun startsWith (Ljava/lang/String;Z)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun startsWith (Ljava/lang/String;ZZLkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic static synthetic fun startsWith$default (Lnet/mamoe/mirai/event/MessageSubscribersBuilder;Ljava/lang/String;ZILjava/lang/Object;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic static synthetic fun startsWith$default (Lnet/mamoe/mirai/event/MessageSubscribersBuilder;Ljava/lang/String;ZZLkotlin/jvm/functions/Function3;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter {\n\tpublic final fun and (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun getFilter ()Lkotlin/jvm/functions/Function2;\n\tpublic final fun invoke (Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final fun nand (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun not ()Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun or (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun xor (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n}\n\npublic final class net/mamoe/mirai/event/NextEventKt {\n\tpublic static final synthetic fun nextBotEventImpl (Lnet/mamoe/mirai/Bot;Lkotlin/reflect/KClass;Lkotlinx/coroutines/CoroutineScope;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun nextEventImpl (Lkotlin/reflect/KClass;Lkotlinx/coroutines/CoroutineScope;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final fun parentJob (Lnet/mamoe/mirai/event/EventChannel;Lkotlinx/coroutines/Job;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic static final synthetic fun withTimeoutOrCoroutineScope (JLkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun withTimeoutOrCoroutineScope (JLkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun withTimeoutOrCoroutineScope$default (JLkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/event/SelectKt {\n\tpublic static synthetic fun selectMessagesImpl$default (Lnet/mamoe/mirai/event/events/MessageEvent;JZZLnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static final synthetic fun withSilentTimeoutOrCoroutineScope (JLkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract class net/mamoe/mirai/event/SimpleListenerHost : kotlinx/coroutines/CoroutineScope, net/mamoe/mirai/event/ListenerHost {\n\tprotected static final field Companion Lnet/mamoe/mirai/event/SimpleListenerHost$Companion;\n\tpublic fun <init> ()V\n\tpublic fun <init> (Lkotlin/coroutines/CoroutineContext;)V\n\tpublic synthetic fun <init> (Lkotlin/coroutines/CoroutineContext;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun cancelAll ()V\n\tpublic final fun getCoroutineContext ()Lkotlin/coroutines/CoroutineContext;\n\tprotected static final fun getEvent (Ljava/lang/Throwable;)Lnet/mamoe/mirai/event/Event;\n\tprotected static final fun getRootCause (Ljava/lang/Throwable;)Ljava/lang/Throwable;\n\tpublic fun handleException (Lkotlin/coroutines/CoroutineContext;Ljava/lang/Throwable;)V\n}\n\nprotected final class net/mamoe/mirai/event/SimpleListenerHost$Companion {\n}\n\npublic final class net/mamoe/mirai/event/SubscribeMessagesKt {\n\tpublic static final fun subscribeFriendMessages (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static synthetic fun subscribeFriendMessages$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static final fun subscribeGroupMessages (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static synthetic fun subscribeGroupMessages$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static final fun subscribeGroupTempMessages (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static synthetic fun subscribeGroupTempMessages$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static final fun subscribeMessages (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static synthetic fun subscribeMessages$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static final fun subscribeOtherClientMessages (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static synthetic fun subscribeOtherClientMessages$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static final fun subscribeStrangerMessages (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static synthetic fun subscribeStrangerMessages$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static final synthetic fun subscribeTempMessages (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static synthetic fun subscribeTempMessages$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static final fun subscribeUserMessages (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static synthetic fun subscribeUserMessages$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/event/SyncFromEventKt {\n\tpublic static final synthetic fun syncFromEventImpl (Lkotlin/reflect/KClass;Lkotlinx/coroutines/CoroutineScope;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/event/events/BeforeImageUploadEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/CancellableEvent, net/mamoe/mirai/event/events/BotActiveEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/event/VerboseEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/event/events/BeforeImageUploadEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BeforeImageUploadEvent;Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BeforeImageUploadEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/BeforeShortVideoUploadEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/CancellableEvent, net/mamoe/mirai/event/events/BotActiveEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/event/VerboseEvent {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun getThumbnailSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun getVideoSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/BotActiveEvent : net/mamoe/mirai/event/events/BotEvent {\n}\n\npublic final class net/mamoe/mirai/event/events/BotAvatarChangedEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic fun <init> (Lnet/mamoe/mirai/Bot;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;)Lnet/mamoe/mirai/event/events/BotAvatarChangedEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotAvatarChangedEvent;Lnet/mamoe/mirai/Bot;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotAvatarChangedEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/BotEvent : net/mamoe/mirai/event/Event {\n\tpublic abstract fun getBot ()Lnet/mamoe/mirai/Bot;\n}\n\npublic final class net/mamoe/mirai/event/events/BotEventsKt {\n\tpublic static final synthetic fun getOperatorOrBot (Lnet/mamoe/mirai/event/events/GroupOperableEvent;)Lnet/mamoe/mirai/contact/Member;\n\tpublic static final fun getResult (Lnet/mamoe/mirai/event/events/MessagePostSendEvent;)Ljava/lang/Object;\n\tpublic static final synthetic fun getSource (Lnet/mamoe/mirai/event/events/MessagePostSendEvent;)Lnet/mamoe/mirai/message/data/MessageSource;\n\tpublic static final synthetic fun getSourceResult (Lnet/mamoe/mirai/event/events/MessagePostSendEvent;)Ljava/lang/Object;\n\tpublic static final synthetic fun isByBot (Lnet/mamoe/mirai/event/events/GroupOperableEvent;)Z\n\tpublic static final fun isByBot (Lnet/mamoe/mirai/event/events/MessageRecallEvent$FriendRecall;)Z\n\tpublic static final fun isByBot (Lnet/mamoe/mirai/event/events/MessageRecallEvent;)Z\n\tpublic static final synthetic fun isFailure (Lnet/mamoe/mirai/event/events/MessagePostSendEvent;)Z\n\tpublic static final synthetic fun isSuccess (Lnet/mamoe/mirai/event/events/MessagePostSendEvent;)Z\n}\n\npublic final class net/mamoe/mirai/event/events/BotGroupPermissionChangeEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/event/events/GroupEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/MemberPermission;Lnet/mamoe/mirai/contact/MemberPermission;)Lnet/mamoe/mirai/event/events/BotGroupPermissionChangeEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotGroupPermissionChangeEvent;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/MemberPermission;Lnet/mamoe/mirai/contact/MemberPermission;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotGroupPermissionChangeEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun getNew ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic final fun getOrigin ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BaseGroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun accept ()V\n\tpublic final fun accept (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun component2 ()J\n\tpublic final fun component3 ()J\n\tpublic final fun component4 ()J\n\tpublic final fun component5 ()Ljava/lang/String;\n\tpublic final fun component6 ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;JJJLjava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;Lnet/mamoe/mirai/Bot;JJJLjava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getEventId ()J\n\tpublic fun getGroupId ()J\n\tpublic final fun getGroupName ()Ljava/lang/String;\n\tpublic final fun getInvitor ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun getInvitorId ()J\n\tpublic final fun getInvitorNick ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic final fun ignore ()V\n\tpublic final fun ignore (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/event/events/BotJoinGroupEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/event/events/GroupEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic abstract fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n}\n\npublic abstract class net/mamoe/mirai/event/events/BotLeaveEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n}\n\npublic final class net/mamoe/mirai/event/events/BotMuteEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/event/events/GroupEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()I\n\tpublic final fun component2 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (ILnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/BotMuteEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotMuteEvent;ILnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotMuteEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getDurationSeconds ()I\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun getOperator ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/BotNickChangedEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic fun <init> (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Ljava/lang/String;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/event/events/BotNickChangedEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotNickChangedEvent;Lnet/mamoe/mirai/Bot;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotNickChangedEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getFrom ()Ljava/lang/String;\n\tpublic final fun getTo ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/event/events/BotOfflineEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotEvent {\n\tpublic fun getReconnect ()Z\n}\n\npublic final class net/mamoe/mirai/event/events/BotOfflineEvent$Active : net/mamoe/mirai/event/events/BotOfflineEvent, net/mamoe/mirai/event/events/BotActiveEvent, net/mamoe/mirai/event/events/BotOfflineEvent$CauseAware {\n\tpublic fun <init> (Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun component2 ()Ljava/lang/Throwable;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;)Lnet/mamoe/mirai/event/events/BotOfflineEvent$Active;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotOfflineEvent$Active;Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotOfflineEvent$Active;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getCause ()Ljava/lang/Throwable;\n\tpublic fun getReconnect ()Z\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/BotOfflineEvent$Dropped : net/mamoe/mirai/event/events/BotOfflineEvent, net/mamoe/mirai/event/events/BotOfflineEvent$CauseAware, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun component2 ()Ljava/lang/Throwable;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;)Lnet/mamoe/mirai/event/events/BotOfflineEvent$Dropped;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotOfflineEvent$Dropped;Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotOfflineEvent$Dropped;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getCause ()Ljava/lang/Throwable;\n\tpublic fun getReconnect ()Z\n\tpublic fun hashCode ()I\n\tpublic fun setReconnect (Z)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/BotOfflineEvent$Force : net/mamoe/mirai/event/events/BotOfflineEvent, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/event/events/BotOfflineEvent$Force;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotOfflineEvent$Force;Lnet/mamoe/mirai/Bot;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotOfflineEvent$Force;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getMessage ()Ljava/lang/String;\n\tpublic fun getReconnect ()Z\n\tpublic final fun getTitle ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun setReconnect (Z)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/BotOnlineEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotActiveEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;)Lnet/mamoe/mirai/event/events/BotOnlineEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotOnlineEvent;Lnet/mamoe/mirai/Bot;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotOnlineEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/BotPassiveEvent : net/mamoe/mirai/event/events/BotEvent {\n}\n\npublic final class net/mamoe/mirai/event/events/BotReloginEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotActiveEvent, net/mamoe/mirai/event/events/BotEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun component2 ()Ljava/lang/Throwable;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;)Lnet/mamoe/mirai/event/events/BotReloginEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotReloginEvent;Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotReloginEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getCause ()Ljava/lang/Throwable;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/BotUnmuteEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/event/events/GroupEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/BotUnmuteEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotUnmuteEvent;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotUnmuteEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun getOperator ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/EventCancelledException : java/lang/RuntimeException {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun <init> (Ljava/lang/Throwable;)V\n}\n\npublic final class net/mamoe/mirai/event/events/FriendAddEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/FriendEvent, net/mamoe/mirai/event/events/FriendInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Friend;)Lnet/mamoe/mirai/event/events/FriendAddEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/FriendAddEvent;Lnet/mamoe/mirai/contact/Friend;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/FriendAddEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/FriendAvatarChangedEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/FriendEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Friend;)Lnet/mamoe/mirai/event/events/FriendAvatarChangedEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/FriendAvatarChangedEvent;Lnet/mamoe/mirai/contact/Friend;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/FriendAvatarChangedEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/FriendDeleteEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/FriendEvent, net/mamoe/mirai/event/events/FriendInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Friend;)Lnet/mamoe/mirai/event/events/FriendDeleteEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/FriendDeleteEvent;Lnet/mamoe/mirai/contact/Friend;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/FriendDeleteEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/FriendEvent : net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/event/events/UserEvent {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic fun getUser ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic synthetic fun getUser ()Lnet/mamoe/mirai/contact/User;\n}\n\npublic final class net/mamoe/mirai/event/events/FriendInputStatusChangedEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/FriendEvent, net/mamoe/mirai/internal/event/VerboseEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun component2 ()Z\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Friend;Z)Lnet/mamoe/mirai/event/events/FriendInputStatusChangedEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/FriendInputStatusChangedEvent;Lnet/mamoe/mirai/contact/Friend;ZILjava/lang/Object;)Lnet/mamoe/mirai/event/events/FriendInputStatusChangedEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun getInputting ()Z\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/FriendMessageEvent : net/mamoe/mirai/event/events/AbstractMessageEvent, net/mamoe/mirai/event/events/FriendEvent, net/mamoe/mirai/event/events/UserMessageEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Friend;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSender ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic synthetic fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromFriend;\n\tpublic synthetic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getTime ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/FriendMessagePostSendEvent : net/mamoe/mirai/event/events/UserMessagePostSendEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun component3 ()Ljava/lang/Throwable;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Friend;Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/Throwable;Lnet/mamoe/mirai/message/MessageReceipt;)Lnet/mamoe/mirai/event/events/FriendMessagePostSendEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/FriendMessagePostSendEvent;Lnet/mamoe/mirai/contact/Friend;Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/Throwable;Lnet/mamoe/mirai/message/MessageReceipt;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/FriendMessagePostSendEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getException ()Ljava/lang/Throwable;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getReceipt ()Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/FriendMessagePreSendEvent : net/mamoe/mirai/event/events/UserMessagePreSendEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Friend;Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/event/events/FriendMessagePreSendEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/FriendMessagePreSendEvent;Lnet/mamoe/mirai/contact/Friend;Lnet/mamoe/mirai/message/data/Message;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/FriendMessagePreSendEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun hashCode ()I\n\tpublic fun setMessage (Lnet/mamoe/mirai/message/data/Message;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/FriendMessageSyncEvent : net/mamoe/mirai/event/events/AbstractMessageEvent, net/mamoe/mirai/event/events/FriendEvent, net/mamoe/mirai/event/events/MessageSyncEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Friend;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/OtherClient;Lnet/mamoe/mirai/contact/Friend;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getClient ()Lnet/mamoe/mirai/contact/OtherClient;\n\tpublic fun getFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSender ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic synthetic fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromFriend;\n\tpublic synthetic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic fun getTime ()I\n}\n\npublic final class net/mamoe/mirai/event/events/FriendNickChangedEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/FriendEvent, net/mamoe/mirai/event/events/FriendInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Friend;Ljava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/event/events/FriendNickChangedEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/FriendNickChangedEvent;Lnet/mamoe/mirai/contact/Friend;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/FriendNickChangedEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun getFrom ()Ljava/lang/String;\n\tpublic final fun getTo ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/FriendRemarkChangeEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/BroadcastControllable, net/mamoe/mirai/event/events/FriendEvent, net/mamoe/mirai/event/events/FriendInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Friend;Ljava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/event/events/FriendRemarkChangeEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/FriendRemarkChangeEvent;Lnet/mamoe/mirai/contact/Friend;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/FriendRemarkChangeEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun getNewRemark ()Ljava/lang/String;\n\tpublic final fun getOldRemark ()Ljava/lang/String;\n\tpublic fun getShouldBroadcast ()Z\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupAllowAnonymousChatEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/GroupOperableEvent, net/mamoe/mirai/event/events/GroupSettingChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Z\n\tpublic final fun component2 ()Z\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (ZZLnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/GroupAllowAnonymousChatEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupAllowAnonymousChatEvent;ZZLnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupAllowAnonymousChatEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getNew ()Ljava/lang/Boolean;\n\tpublic synthetic fun getNew ()Ljava/lang/Object;\n\tpublic synthetic fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getOperator ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun getOrigin ()Ljava/lang/Boolean;\n\tpublic synthetic fun getOrigin ()Ljava/lang/Object;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupAllowConfessTalkEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/GroupSettingChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Z\n\tpublic final fun component2 ()Z\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component4 ()Z\n\tpublic final fun copy (ZZLnet/mamoe/mirai/contact/Group;Z)Lnet/mamoe/mirai/event/events/GroupAllowConfessTalkEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupAllowConfessTalkEvent;ZZLnet/mamoe/mirai/contact/Group;ZILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupAllowConfessTalkEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getNew ()Ljava/lang/Boolean;\n\tpublic synthetic fun getNew ()Ljava/lang/Object;\n\tpublic fun getOrigin ()Ljava/lang/Boolean;\n\tpublic synthetic fun getOrigin ()Ljava/lang/Object;\n\tpublic fun hashCode ()I\n\tpublic final fun isByBot ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupAllowMemberInviteEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/GroupOperableEvent, net/mamoe/mirai/event/events/GroupSettingChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Z\n\tpublic final fun component2 ()Z\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (ZZLnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/GroupAllowMemberInviteEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupAllowMemberInviteEvent;ZZLnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupAllowMemberInviteEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getNew ()Ljava/lang/Boolean;\n\tpublic synthetic fun getNew ()Ljava/lang/Object;\n\tpublic synthetic fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getOperator ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun getOrigin ()Ljava/lang/Boolean;\n\tpublic synthetic fun getOrigin ()Ljava/lang/Object;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/GroupAwareMessageEvent : net/mamoe/mirai/event/events/MessageEvent {\n\tpublic abstract fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupEntranceAnnouncementChangeEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/GroupOperableEvent, net/mamoe/mirai/event/events/GroupSettingChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/GroupEntranceAnnouncementChangeEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupEntranceAnnouncementChangeEvent;Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupEntranceAnnouncementChangeEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic synthetic fun getNew ()Ljava/lang/Object;\n\tpublic fun getNew ()Ljava/lang/String;\n\tpublic synthetic fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getOperator ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getOrigin ()Ljava/lang/Object;\n\tpublic fun getOrigin ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/GroupEvent : net/mamoe/mirai/event/events/BotEvent {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/GroupMemberEvent : net/mamoe/mirai/event/events/GroupEvent, net/mamoe/mirai/event/events/UserEvent {\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic abstract fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getUser ()Lnet/mamoe/mirai/contact/Member;\n\tpublic synthetic fun getUser ()Lnet/mamoe/mirai/contact/User;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupMessageEvent : net/mamoe/mirai/event/events/AbstractMessageEvent, net/mamoe/mirai/event/events/GroupAwareMessageEvent, net/mamoe/mirai/event/events/GroupEvent, net/mamoe/mirai/event/events/MessageEvent {\n\tpublic fun <init> (Ljava/lang/String;Lnet/mamoe/mirai/contact/MemberPermission;Lnet/mamoe/mirai/contact/Member;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun getPermission ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic fun getSender ()Lnet/mamoe/mirai/contact/Member;\n\tpublic synthetic fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromGroup;\n\tpublic synthetic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getTime ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupMessagePostSendEvent : net/mamoe/mirai/event/events/MessagePostSendEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun component3 ()Ljava/lang/Throwable;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/Throwable;Lnet/mamoe/mirai/message/MessageReceipt;)Lnet/mamoe/mirai/event/events/GroupMessagePostSendEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupMessagePostSendEvent;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/Throwable;Lnet/mamoe/mirai/message/MessageReceipt;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupMessagePostSendEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getException ()Ljava/lang/Throwable;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getReceipt ()Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupMessagePreSendEvent : net/mamoe/mirai/event/events/MessagePreSendEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/event/events/GroupMessagePreSendEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupMessagePreSendEvent;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/message/data/Message;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupMessagePreSendEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun hashCode ()I\n\tpublic fun setMessage (Lnet/mamoe/mirai/message/data/Message;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupMessageSyncEvent : net/mamoe/mirai/event/events/AbstractMessageEvent, net/mamoe/mirai/event/events/GroupAwareMessageEvent, net/mamoe/mirai/event/events/MessageSyncEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/message/data/MessageChain;Lnet/mamoe/mirai/contact/Member;Ljava/lang/String;I)V\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/OtherClient;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/message/data/MessageChain;Lnet/mamoe/mirai/contact/Member;Ljava/lang/String;I)V\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getClient ()Lnet/mamoe/mirai/contact/OtherClient;\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSender ()Lnet/mamoe/mirai/contact/Member;\n\tpublic synthetic fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromGroup;\n\tpublic synthetic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getTime ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupMuteAllEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/GroupOperableEvent, net/mamoe/mirai/event/events/GroupSettingChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Z\n\tpublic final fun component2 ()Z\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (ZZLnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/GroupMuteAllEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupMuteAllEvent;ZZLnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupMuteAllEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getNew ()Ljava/lang/Boolean;\n\tpublic synthetic fun getNew ()Ljava/lang/Object;\n\tpublic synthetic fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getOperator ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun getOrigin ()Ljava/lang/Boolean;\n\tpublic synthetic fun getOrigin ()Ljava/lang/Object;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupNameChangeEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/GroupOperableEvent, net/mamoe/mirai/event/events/GroupSettingChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/GroupNameChangeEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupNameChangeEvent;Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupNameChangeEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic synthetic fun getNew ()Ljava/lang/Object;\n\tpublic fun getNew ()Ljava/lang/String;\n\tpublic synthetic fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getOperator ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getOrigin ()Ljava/lang/Object;\n\tpublic fun getOrigin ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/GroupOperableEvent : net/mamoe/mirai/event/events/GroupEvent {\n\tpublic abstract fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/GroupSettingChangeEvent : net/mamoe/mirai/event/BroadcastControllable, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/event/events/GroupEvent {\n\tpublic abstract fun getNew ()Ljava/lang/Object;\n\tpublic abstract fun getOrigin ()Ljava/lang/Object;\n\tpublic fun getShouldBroadcast ()Z\n}\n\npublic final class net/mamoe/mirai/event/events/GroupTalkativeChangeEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/event/events/GroupEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/NormalMember;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/GroupTalkativeChangeEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupTalkativeChangeEvent;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupTalkativeChangeEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun getNow ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getPrevious ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupTempMessageEvent : net/mamoe/mirai/event/events/TempMessageEvent, net/mamoe/mirai/event/events/GroupAwareMessageEvent, net/mamoe/mirai/event/events/UserMessageEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSender ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromTemp;\n\tpublic synthetic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getTime ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupTempMessagePostSendEvent : net/mamoe/mirai/event/events/TempMessagePostSendEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun component3 ()Ljava/lang/Throwable;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/Throwable;Lnet/mamoe/mirai/message/MessageReceipt;)Lnet/mamoe/mirai/event/events/GroupTempMessagePostSendEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupTempMessagePostSendEvent;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/Throwable;Lnet/mamoe/mirai/message/MessageReceipt;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupTempMessagePostSendEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getException ()Ljava/lang/Throwable;\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getReceipt ()Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupTempMessagePreSendEvent : net/mamoe/mirai/event/events/TempMessagePreSendEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/event/events/GroupTempMessagePreSendEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupTempMessagePreSendEvent;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/message/data/Message;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupTempMessagePreSendEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun hashCode ()I\n\tpublic fun setMessage (Lnet/mamoe/mirai/message/data/Message;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupTempMessageSyncEvent : net/mamoe/mirai/event/events/AbstractMessageEvent, net/mamoe/mirai/event/events/GroupAwareMessageEvent, net/mamoe/mirai/event/events/MessageSyncEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/OtherClient;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getClient ()Lnet/mamoe/mirai/contact/OtherClient;\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSender ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromTemp;\n\tpublic synthetic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun getTime ()I\n}\n\npublic abstract class net/mamoe/mirai/event/events/ImageUploadEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotActiveEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/event/VerboseEvent {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n}\n\npublic final class net/mamoe/mirai/event/events/ImageUploadEvent$Failed : net/mamoe/mirai/event/events/ImageUploadEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun component3 ()I\n\tpublic final fun component4 ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;ILjava/lang/String;)Lnet/mamoe/mirai/event/events/ImageUploadEvent$Failed;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/ImageUploadEvent$Failed;Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;ILjava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/ImageUploadEvent$Failed;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getErrno ()I\n\tpublic final fun getMessage ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/ImageUploadEvent$Succeed : net/mamoe/mirai/event/events/ImageUploadEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun component3 ()Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/message/data/Image;)Lnet/mamoe/mirai/event/events/ImageUploadEvent$Succeed;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/ImageUploadEvent$Succeed;Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/message/data/Image;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/ImageUploadEvent$Succeed;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getImage ()Lnet/mamoe/mirai/message/data/Image;\n\tpublic fun getSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberCardChangeEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/MemberCardChangeEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberCardChangeEvent;Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberCardChangeEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getNew ()Ljava/lang/String;\n\tpublic final fun getOrigin ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberHonorChangeEvent$Achieve : net/mamoe/mirai/event/events/MemberHonorChangeEvent {\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/contact/NormalMember;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun component2-AVr_HNQ ()I\n\tpublic final fun copy-aLnpm_Q (Lnet/mamoe/mirai/contact/NormalMember;I)Lnet/mamoe/mirai/event/events/MemberHonorChangeEvent$Achieve;\n\tpublic static synthetic fun copy-aLnpm_Q$default (Lnet/mamoe/mirai/event/events/MemberHonorChangeEvent$Achieve;Lnet/mamoe/mirai/contact/NormalMember;IILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberHonorChangeEvent$Achieve;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getHonorType ()I\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberHonorChangeEvent$Lose : net/mamoe/mirai/event/events/MemberHonorChangeEvent {\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/contact/NormalMember;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun component2-AVr_HNQ ()I\n\tpublic final fun copy-aLnpm_Q (Lnet/mamoe/mirai/contact/NormalMember;I)Lnet/mamoe/mirai/event/events/MemberHonorChangeEvent$Lose;\n\tpublic static synthetic fun copy-aLnpm_Q$default (Lnet/mamoe/mirai/event/events/MemberHonorChangeEvent$Lose;Lnet/mamoe/mirai/contact/NormalMember;IILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberHonorChangeEvent$Lose;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getHonorType ()I\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/event/events/MemberJoinEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/event/events/GroupMemberEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/contact/NormalMember;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberJoinEvent$Active : net/mamoe/mirai/event/events/MemberJoinEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/MemberJoinEvent$Active;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberJoinEvent$Active;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberJoinEvent$Active;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberJoinEvent$Invite : net/mamoe/mirai/event/events/MemberJoinEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/MemberJoinEvent$Invite;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberJoinEvent$Invite;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberJoinEvent$Invite;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getInvitor ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberJoinEvent$Retrieve : net/mamoe/mirai/event/events/MemberJoinEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/MemberJoinEvent$Retrieve;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberJoinEvent$Retrieve;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberJoinEvent$Retrieve;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberJoinRequestEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BaseGroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic static final field Companion Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent$Companion;\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/Bot;JLjava/lang/String;JJLjava/lang/String;Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/Bot;JLjava/lang/String;JJLjava/lang/String;Ljava/lang/String;Ljava/lang/Long;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun accept ()V\n\tpublic final fun accept (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun component2 ()J\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun component4 ()J\n\tpublic final fun component5 ()J\n\tpublic final fun component6 ()Ljava/lang/String;\n\tpublic final fun component7 ()Ljava/lang/String;\n\tpublic final fun component8 ()Ljava/lang/Long;\n\tpublic final synthetic fun copy (Lnet/mamoe/mirai/Bot;JLjava/lang/String;JJLjava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;JLjava/lang/String;JJLjava/lang/String;Ljava/lang/String;Ljava/lang/Long;)Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;\n\tpublic static final synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;Lnet/mamoe/mirai/Bot;JLjava/lang/String;JJLjava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;Lnet/mamoe/mirai/Bot;JLjava/lang/String;JJLjava/lang/String;Ljava/lang/String;Ljava/lang/Long;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getEventId ()J\n\tpublic final fun getFromId ()J\n\tpublic final fun getFromNick ()Ljava/lang/String;\n\tpublic final fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getGroupId ()J\n\tpublic final fun getGroupName ()Ljava/lang/String;\n\tpublic final fun getInvitor ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getInvitorId ()Ljava/lang/Long;\n\tpublic final fun getMessage ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic final fun ignore (Z)V\n\tpublic final fun ignore (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun ignore$default (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZILjava/lang/Object;)V\n\tpublic static synthetic fun ignore$default (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun reject ()V\n\tpublic final fun reject (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun reject (Z)V\n\tpublic final fun reject (ZLjava/lang/String;)V\n\tpublic final fun reject (ZLjava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun reject (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun reject$default (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZLjava/lang/String;ILjava/lang/Object;)V\n\tpublic static synthetic fun reject$default (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZLjava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/event/events/MemberLeaveEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent {\n}\n\npublic final class net/mamoe/mirai/event/events/MemberLeaveEvent$Kick : net/mamoe/mirai/event/events/MemberLeaveEvent, net/mamoe/mirai/event/events/GroupOperableEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/NormalMember;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/MemberLeaveEvent$Kick;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberLeaveEvent$Kick;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberLeaveEvent$Kick;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getOperator ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberLeaveEvent$Quit : net/mamoe/mirai/event/events/MemberLeaveEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/NormalMember;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/MemberLeaveEvent$Quit;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberLeaveEvent$Quit;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberLeaveEvent$Quit;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberMuteEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/GroupOperableEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Member;\n\tpublic final fun component2 ()I\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/Member;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Member;ILnet/mamoe/mirai/contact/Member;)Lnet/mamoe/mirai/event/events/MemberMuteEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberMuteEvent;Lnet/mamoe/mirai/contact/Member;ILnet/mamoe/mirai/contact/Member;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberMuteEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getDurationSeconds ()I\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberPermissionChangeEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/event/events/GroupMemberEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/MemberPermission;Lnet/mamoe/mirai/contact/MemberPermission;)Lnet/mamoe/mirai/event/events/MemberPermissionChangeEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberPermissionChangeEvent;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/MemberPermission;Lnet/mamoe/mirai/contact/MemberPermission;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberPermissionChangeEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getNew ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic final fun getOrigin ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberSpecialTitleChangeEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/GroupOperableEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/MemberSpecialTitleChangeEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberSpecialTitleChangeEvent;Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberSpecialTitleChangeEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getNew ()Ljava/lang/String;\n\tpublic synthetic fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getOperator ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getOrigin ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberUnmuteEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/GroupOperableEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Member;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/contact/Member;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Member;Lnet/mamoe/mirai/contact/Member;)Lnet/mamoe/mirai/event/events/MemberUnmuteEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberUnmuteEvent;Lnet/mamoe/mirai/contact/Member;Lnet/mamoe/mirai/contact/Member;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberUnmuteEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/MessageEvent : net/mamoe/mirai/event/Event, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic abstract fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic abstract fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic abstract fun getSenderName ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming;\n\tpublic abstract fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic abstract fun getTime ()I\n}\n\npublic abstract class net/mamoe/mirai/event/events/MessagePostSendEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotActiveEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/event/VerboseEvent {\n\tpublic final fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getException ()Ljava/lang/Throwable;\n\tpublic abstract fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic abstract fun getReceipt ()Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n}\n\npublic abstract class net/mamoe/mirai/event/events/MessagePreSendEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/CancellableEvent, net/mamoe/mirai/event/events/BotActiveEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/event/VerboseEvent {\n\tpublic final fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getMessage ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic abstract fun setMessage (Lnet/mamoe/mirai/message/data/Message;)V\n}\n\npublic abstract class net/mamoe/mirai/event/events/MessageRecallEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotEvent {\n\tpublic abstract fun getAuthor ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic abstract fun getAuthorId ()J\n\tpublic abstract fun getMessageIds ()[I\n\tpublic abstract fun getMessageInternalIds ()[I\n\tpublic abstract fun getMessageTime ()I\n}\n\npublic final class net/mamoe/mirai/event/events/MessageRecallEvent$FriendRecall : net/mamoe/mirai/event/events/MessageRecallEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun component2 ()[I\n\tpublic final fun component3 ()[I\n\tpublic final fun component4 ()I\n\tpublic final fun component5 ()J\n\tpublic final fun component6 ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;[I[IIJLnet/mamoe/mirai/contact/Friend;)Lnet/mamoe/mirai/event/events/MessageRecallEvent$FriendRecall;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MessageRecallEvent$FriendRecall;Lnet/mamoe/mirai/Bot;[I[IIJLnet/mamoe/mirai/contact/Friend;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MessageRecallEvent$FriendRecall;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getAuthor ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic synthetic fun getAuthor ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic fun getAuthorId ()J\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getMessageIds ()[I\n\tpublic fun getMessageInternalIds ()[I\n\tpublic fun getMessageTime ()I\n\tpublic final fun getOperator ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun getOperatorId ()J\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MessageRecallEvent$GroupRecall : net/mamoe/mirai/event/events/MessageRecallEvent, net/mamoe/mirai/event/events/GroupOperableEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun component2 ()J\n\tpublic final fun component3 ()[I\n\tpublic final fun component4 ()[I\n\tpublic final fun component5 ()I\n\tpublic final fun component6 ()Lnet/mamoe/mirai/contact/Member;\n\tpublic final fun component7 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component8 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;J[I[IILnet/mamoe/mirai/contact/Member;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/MessageRecallEvent$GroupRecall;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MessageRecallEvent$GroupRecall;Lnet/mamoe/mirai/Bot;J[I[IILnet/mamoe/mirai/contact/Member;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MessageRecallEvent$GroupRecall;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getAuthor ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getAuthor ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic fun getAuthorId ()J\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getMessageIds ()[I\n\tpublic fun getMessageInternalIds ()[I\n\tpublic fun getMessageTime ()I\n\tpublic fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/MessageSyncEvent : net/mamoe/mirai/event/events/MessageEvent, net/mamoe/mirai/event/events/OtherClientEvent {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getClient ()Lnet/mamoe/mirai/contact/OtherClient;\n}\n\npublic final class net/mamoe/mirai/event/events/NewFriendRequestEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/event/events/FriendInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun accept ()V\n\tpublic final fun accept (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun component2 ()J\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun component4 ()J\n\tpublic final fun component5 ()J\n\tpublic final fun component6 ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;JLjava/lang/String;JJLjava/lang/String;)Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;Lnet/mamoe/mirai/Bot;JLjava/lang/String;JJLjava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getEventId ()J\n\tpublic final fun getFromGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun getFromGroupId ()J\n\tpublic final fun getFromId ()J\n\tpublic final fun getFromNick ()Ljava/lang/String;\n\tpublic final fun getMessage ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic final fun reject (Z)V\n\tpublic final fun reject (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun reject$default (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;ZILjava/lang/Object;)V\n\tpublic static synthetic fun reject$default (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/NudgeEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun component4 ()Ljava/lang/String;\n\tpublic final fun component5 ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/UserOrBot;Lnet/mamoe/mirai/contact/UserOrBot;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/event/events/NudgeEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/NudgeEvent;Lnet/mamoe/mirai/contact/UserOrBot;Lnet/mamoe/mirai/contact/UserOrBot;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/NudgeEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getAction ()Ljava/lang/String;\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getFrom ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic final fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun getSuffix ()Ljava/lang/String;\n\tpublic final fun getTarget ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/OtherClientEvent : net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getClient ()Lnet/mamoe/mirai/contact/OtherClient;\n}\n\npublic final class net/mamoe/mirai/event/events/OtherClientMessageEvent : net/mamoe/mirai/event/events/AbstractMessageEvent, net/mamoe/mirai/event/events/MessageEvent, net/mamoe/mirai/event/events/OtherClientEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/OtherClient;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getClient ()Lnet/mamoe/mirai/contact/OtherClient;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromFriend;\n\tpublic synthetic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/OtherClient;\n\tpublic fun getTime ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/OtherClientOfflineEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/event/events/OtherClientEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/OtherClient;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/OtherClient;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/OtherClient;)Lnet/mamoe/mirai/event/events/OtherClientOfflineEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/OtherClientOfflineEvent;Lnet/mamoe/mirai/contact/OtherClient;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/OtherClientOfflineEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getClient ()Lnet/mamoe/mirai/contact/OtherClient;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/OtherClientOnlineEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/event/events/OtherClientEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/OtherClient;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/OtherClient;Lnet/mamoe/mirai/contact/ClientKind;)Lnet/mamoe/mirai/event/events/OtherClientOnlineEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/OtherClientOnlineEvent;Lnet/mamoe/mirai/contact/OtherClient;Lnet/mamoe/mirai/contact/ClientKind;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/OtherClientOnlineEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getClient ()Lnet/mamoe/mirai/contact/OtherClient;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/event/events/ShortVideoUploadEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotActiveEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/event/VerboseEvent {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic abstract fun getThumbnailSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic abstract fun getVideoSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n}\n\npublic final class net/mamoe/mirai/event/events/ShortVideoUploadEvent$Failed : net/mamoe/mirai/event/events/ShortVideoUploadEvent {\n\tpublic final fun getErrno ()I\n\tpublic final fun getMessage ()Ljava/lang/String;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getThumbnailSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic fun getVideoSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/ShortVideoUploadEvent$Succeed : net/mamoe/mirai/event/events/ShortVideoUploadEvent {\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getThumbnailSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun getVideo ()Lnet/mamoe/mirai/message/data/ShortVideo;\n\tpublic fun getVideoSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/SignEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getRank ()Ljava/lang/Integer;\n\tpublic final fun getSign ()Ljava/lang/String;\n\tpublic final fun getUser ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic final fun hasRank ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/StrangerAddEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/StrangerEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Stranger;)Lnet/mamoe/mirai/event/events/StrangerAddEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/StrangerAddEvent;Lnet/mamoe/mirai/contact/Stranger;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/StrangerAddEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getStranger ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/StrangerEvent : net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/event/events/UserEvent {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getStranger ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic fun getUser ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic synthetic fun getUser ()Lnet/mamoe/mirai/contact/User;\n}\n\npublic final class net/mamoe/mirai/event/events/StrangerMessageEvent : net/mamoe/mirai/event/events/AbstractMessageEvent, net/mamoe/mirai/event/events/StrangerEvent, net/mamoe/mirai/event/events/UserMessageEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Stranger;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSender ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic synthetic fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromStranger;\n\tpublic synthetic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming;\n\tpublic fun getStranger ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getTime ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/StrangerMessagePostSendEvent : net/mamoe/mirai/event/events/UserMessagePostSendEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun component3 ()Ljava/lang/Throwable;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Stranger;Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/Throwable;Lnet/mamoe/mirai/message/MessageReceipt;)Lnet/mamoe/mirai/event/events/StrangerMessagePostSendEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/StrangerMessagePostSendEvent;Lnet/mamoe/mirai/contact/Stranger;Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/Throwable;Lnet/mamoe/mirai/message/MessageReceipt;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/StrangerMessagePostSendEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getException ()Ljava/lang/Throwable;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getReceipt ()Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/StrangerMessagePreSendEvent : net/mamoe/mirai/event/events/UserMessagePreSendEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Stranger;Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/event/events/StrangerMessagePreSendEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/StrangerMessagePreSendEvent;Lnet/mamoe/mirai/contact/Stranger;Lnet/mamoe/mirai/message/data/Message;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/StrangerMessagePreSendEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun hashCode ()I\n\tpublic fun setMessage (Lnet/mamoe/mirai/message/data/Message;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/StrangerMessageSyncEvent : net/mamoe/mirai/event/events/AbstractMessageEvent, net/mamoe/mirai/event/events/MessageSyncEvent, net/mamoe/mirai/event/events/StrangerEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/OtherClient;Lnet/mamoe/mirai/contact/Stranger;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Stranger;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getClient ()Lnet/mamoe/mirai/contact/OtherClient;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSender ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic synthetic fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromStranger;\n\tpublic synthetic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming;\n\tpublic fun getStranger ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic fun getTime ()I\n}\n\npublic abstract class net/mamoe/mirai/event/events/StrangerRelationChangeEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/StrangerEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/contact/Stranger;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getStranger ()Lnet/mamoe/mirai/contact/Stranger;\n}\n\npublic final class net/mamoe/mirai/event/events/StrangerRelationChangeEvent$Deleted : net/mamoe/mirai/event/events/StrangerRelationChangeEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Stranger;)V\n}\n\npublic final class net/mamoe/mirai/event/events/StrangerRelationChangeEvent$Friended : net/mamoe/mirai/event/events/StrangerRelationChangeEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Stranger;Lnet/mamoe/mirai/contact/Friend;)V\n\tpublic final fun getFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic fun getStranger ()Lnet/mamoe/mirai/contact/Stranger;\n}\n\npublic abstract class net/mamoe/mirai/event/events/TempMessageEvent : net/mamoe/mirai/event/events/AbstractMessageEvent, net/mamoe/mirai/event/events/GroupAwareMessageEvent, net/mamoe/mirai/event/events/UserMessageEvent {\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/message/data/MessageChain;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSender ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getTime ()I\n}\n\npublic abstract class net/mamoe/mirai/event/events/TempMessagePostSendEvent : net/mamoe/mirai/event/events/UserMessagePostSendEvent {\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/contact/Member;Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/Throwable;Lnet/mamoe/mirai/message/MessageReceipt;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getException ()Ljava/lang/Throwable;\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getReceipt ()Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Member;\n}\n\npublic abstract class net/mamoe/mirai/event/events/TempMessagePreSendEvent : net/mamoe/mirai/event/events/UserMessagePreSendEvent {\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/contact/Member;Lnet/mamoe/mirai/message/data/Message;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Member;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun setMessage (Lnet/mamoe/mirai/message/data/Message;)V\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/UserEvent : net/mamoe/mirai/event/events/BotEvent {\n\tpublic abstract fun getUser ()Lnet/mamoe/mirai/contact/User;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/UserMessageEvent : net/mamoe/mirai/event/events/MessageEvent {\n\tpublic abstract fun getSubject ()Lnet/mamoe/mirai/contact/User;\n}\n\npublic abstract class net/mamoe/mirai/event/events/UserMessagePostSendEvent : net/mamoe/mirai/event/events/MessagePostSendEvent {\n}\n\npublic abstract class net/mamoe/mirai/event/events/UserMessagePreSendEvent : net/mamoe/mirai/event/events/MessagePreSendEvent {\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/User;\n}\n\npublic final class net/mamoe/mirai/message/MessageEventKt {\n\tpublic static final fun isContextIdenticalWith (Lnet/mamoe/mirai/event/events/MessageEvent;Lnet/mamoe/mirai/event/events/MessageEvent;)Z\n}\n\npublic class net/mamoe/mirai/message/MessageReceipt {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/MessageReceipt$Companion;\n\tpublic final fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Outgoing;\n\tpublic final fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun isToGroup ()Z\n\tpublic final fun quote ()Lnet/mamoe/mirai/message/data/QuoteReply;\n\tpublic fun quoteReply (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun quoteReply (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun quoteReply (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun quoteReply (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun recall ()V\n\tpublic final fun recall (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun recallIn (J)Lnet/mamoe/mirai/message/action/AsyncRecallResult;\n}\n\npublic final class net/mamoe/mirai/message/MessageReceipt$Companion {\n}\n\npublic final class net/mamoe/mirai/message/MessageReceiptKt {\n\tpublic static final fun getBot (Lnet/mamoe/mirai/message/MessageReceipt;)Lnet/mamoe/mirai/Bot;\n\tpublic static final fun getSourceIds (Lnet/mamoe/mirai/message/MessageReceipt;)[I\n\tpublic static final fun getSourceInternalIds (Lnet/mamoe/mirai/message/MessageReceipt;)[I\n\tpublic static final fun getSourceMessage (Lnet/mamoe/mirai/message/MessageReceipt;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final fun getSourceTime (Lnet/mamoe/mirai/message/MessageReceipt;)I\n}\n\npublic abstract interface class net/mamoe/mirai/message/MessageSerializers {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/MessageSerializers$INSTANCE;\n\tpublic abstract fun getSerializersModule ()Lkotlinx/serialization/modules/SerializersModule;\n}\n\npublic final class net/mamoe/mirai/message/MessageSerializers$INSTANCE : net/mamoe/mirai/message/MessageSerializers {\n\tpublic fun getSerializersModule ()Lkotlinx/serialization/modules/SerializersModule;\n}\n\npublic final class net/mamoe/mirai/message/action/AsyncRecallResult {\n\tpublic final fun awaitException ()Ljava/lang/Throwable;\n\tpublic final fun awaitException (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun awaitIsSuccess ()Z\n\tpublic final fun awaitIsSuccess (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun getException ()Lkotlinx/coroutines/Deferred;\n\tpublic final fun getExceptionFuture ()Ljava/util/concurrent/CompletableFuture;\n\tpublic final fun isSuccess ()Lkotlinx/coroutines/Deferred;\n\tpublic final fun isSuccessFuture ()Ljava/util/concurrent/CompletableFuture;\n}\n\npublic final class net/mamoe/mirai/message/action/BotNudge : net/mamoe/mirai/message/action/Nudge {\n\tpublic fun <init> (Lnet/mamoe/mirai/Bot;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;)Lnet/mamoe/mirai/message/action/BotNudge;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/action/BotNudge;Lnet/mamoe/mirai/Bot;ILjava/lang/Object;)Lnet/mamoe/mirai/message/action/BotNudge;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getTarget ()Lnet/mamoe/mirai/Bot;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/action/FriendNudge : net/mamoe/mirai/message/action/UserNudge {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Friend;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Friend;)Lnet/mamoe/mirai/message/action/FriendNudge;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/action/FriendNudge;Lnet/mamoe/mirai/contact/Friend;ILjava/lang/Object;)Lnet/mamoe/mirai/message/action/FriendNudge;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/action/MemberNudge : net/mamoe/mirai/message/action/UserNudge {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/NormalMember;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/message/action/MemberNudge;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/action/MemberNudge;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/message/action/MemberNudge;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/message/action/Nudge {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/action/Nudge$Companion;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic static final synthetic fun sendNudge (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/message/action/Nudge;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendTo (Lnet/mamoe/mirai/contact/Contact;)Z\n\tpublic final fun sendTo (Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/message/action/Nudge$Companion {\n\tpublic final synthetic fun sendNudge (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/message/action/Nudge;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/message/action/StrangerNudge : net/mamoe/mirai/message/action/UserNudge {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Stranger;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Stranger;)Lnet/mamoe/mirai/message/action/StrangerNudge;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/action/StrangerNudge;Lnet/mamoe/mirai/contact/Stranger;ILjava/lang/Object;)Lnet/mamoe/mirai/message/action/StrangerNudge;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/message/action/UserNudge : net/mamoe/mirai/message/action/Nudge {\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/UserOrBot;\n}\n\npublic abstract interface class net/mamoe/mirai/message/code/CodableMessage : net/mamoe/mirai/message/data/Message {\n\tpublic fun serializeToMiraiCode ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/code/MiraiCode {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/code/MiraiCode;\n\tpublic static final fun deserializeMiraiCode (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final fun deserializeMiraiCode (Ljava/lang/String;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static synthetic fun deserializeMiraiCode$default (Ljava/lang/String;Lnet/mamoe/mirai/contact/Contact;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final synthetic fun parseMiraiCode1 (Ljava/lang/String;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static synthetic fun parseMiraiCode1$default (Lnet/mamoe/mirai/message/code/MiraiCode;Ljava/lang/String;Lnet/mamoe/mirai/contact/Contact;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final fun serializeToMiraiCode (Ljava/lang/Iterable;)Ljava/lang/String;\n\tpublic static final fun serializeToMiraiCode (Ljava/util/Iterator;)Ljava/lang/String;\n\tpublic static final fun serializeToMiraiCode (Lkotlin/sequences/Sequence;)Ljava/lang/String;\n\tpublic static final fun serializeToMiraiCode (Lnet/mamoe/mirai/message/code/CodableMessage;)Ljava/lang/String;\n\tpublic static final fun serializeToMiraiCode ([Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/message/data/AbstractMessageKey : net/mamoe/mirai/message/data/MessageKey {\n\tpublic fun <init> (Lkotlin/jvm/functions/Function1;)V\n\tpublic fun getSafeCast ()Lkotlin/jvm/functions/Function1;\n}\n\npublic abstract class net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey : net/mamoe/mirai/message/data/AbstractMessageKey, net/mamoe/mirai/message/data/MessageKey {\n\tpublic fun <init> (Lnet/mamoe/mirai/message/data/MessageKey;Lkotlin/jvm/functions/Function1;)V\n}\n\npublic final class net/mamoe/mirai/message/data/AbstractServiceMessage$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/At : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/At$Companion;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (IJLkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> (J)V\n\tpublic final fun component1 ()J\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic final fun copy (J)Lnet/mamoe/mirai/message/data/At;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/At;JILjava/lang/Object;)Lnet/mamoe/mirai/message/data/At;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun followedBy (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun getDisplay (Lnet/mamoe/mirai/contact/Group;)Ljava/lang/String;\n\tpublic final fun getTarget ()J\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/At;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/At$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/At$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/At;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/At;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/At$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/AtAll : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/AtAll;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic static final field display Ljava/lang/String;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun followedBy (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun hashCode ()I\n\tpublic fun serializeToMiraiCode ()Ljava/lang/String;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/Audio : net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/Audio$Key;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic abstract fun getCodec ()Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic abstract fun getExtraData ()[B\n\tpublic abstract fun getFileMd5 ()[B\n\tpublic abstract fun getFileSize ()J\n\tpublic abstract fun getFilename ()Ljava/lang/String;\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic abstract fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/Audio$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic final class net/mamoe/mirai/message/data/AudioCodec : java/lang/Enum {\n\tpublic static final field AMR Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/AudioCodec$Companion;\n\tpublic static final field SILK Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic static final fun fromFormatName (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic static final fun fromFormatNameOrNull (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic static final fun fromId (I)Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic static final fun fromIdOrNull (I)Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic final fun getFormatName ()Ljava/lang/String;\n\tpublic final fun getId ()I\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic static fun values ()[Lnet/mamoe/mirai/message/data/AudioCodec;\n}\n\npublic final class net/mamoe/mirai/message/data/AudioCodec$Companion {\n\tpublic final fun fromFormatName (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic final fun fromFormatNameOrNull (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic final fun fromId (I)Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic final fun fromIdOrNull (I)Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/ConstrainSingle : net/mamoe/mirai/message/data/SingleMessage {\n\tpublic abstract fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n}\n\npublic final class net/mamoe/mirai/message/data/CustomMessage$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/CustomMessage$Companion$CustomMessageFullDataDeserializeInternalException : java/lang/RuntimeException {\n\tpublic fun <init> (Ljava/lang/Throwable;)V\n}\n\npublic final class net/mamoe/mirai/message/data/CustomMessage$Companion$CustomMessageFullDataDeserializeUserException : java/lang/RuntimeException {\n\tpublic fun <init> ([BLjava/lang/Throwable;)V\n\tpublic final fun getBody ()[B\n}\n\npublic abstract class net/mamoe/mirai/message/data/CustomMessage$JsonSerializerFactory : net/mamoe/mirai/message/data/CustomMessage$Factory {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun dump (Lnet/mamoe/mirai/message/data/CustomMessage;)[B\n\tpublic fun getJson ()Lkotlinx/serialization/json/Json;\n\tpublic fun load ([B)Lnet/mamoe/mirai/message/data/CustomMessage;\n\tpublic abstract fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract class net/mamoe/mirai/message/data/CustomMessage$ProtoBufSerializerFactory : net/mamoe/mirai/message/data/CustomMessage$Factory {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun dump (Lnet/mamoe/mirai/message/data/CustomMessage;)[B\n\tpublic fun load ([B)Lnet/mamoe/mirai/message/data/CustomMessage;\n\tpublic abstract fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/CustomMessageKt {\n}\n\npublic final class net/mamoe/mirai/message/data/CustomMessageMetadata$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/Dice : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/MarketFace {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/Dice$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic fun <init> (I)V\n\tpublic synthetic fun <init> (IILkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic final fun component1 ()I\n\tpublic final fun copy (I)Lnet/mamoe/mirai/message/data/Dice;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/Dice;IILjava/lang/Object;)Lnet/mamoe/mirai/message/data/Dice;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getId ()I\n\tpublic fun getName ()Ljava/lang/String;\n\tpublic final fun getValue ()I\n\tpublic fun hashCode ()I\n\tpublic static final fun random ()Lnet/mamoe/mirai/message/data/Dice;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/Dice;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/Dice$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/Dice$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/Dice;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/Dice;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/Dice$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic final fun random ()Lnet/mamoe/mirai/message/data/Dice;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/EmptyMessageChain : java/util/List, kotlin/jvm/internal/markers/KMappedMarker, net/mamoe/mirai/message/data/DirectSizeAccess, net/mamoe/mirai/message/data/DirectToStringAccess, net/mamoe/mirai/message/data/MessageChain {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/EmptyMessageChain;\n\tpublic fun contains (Lnet/mamoe/mirai/message/data/SingleMessage;)Z\n\tpublic fun containsAll (Ljava/util/Collection;)Z\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic synthetic fun get (I)Ljava/lang/Object;\n\tpublic fun get (I)Lnet/mamoe/mirai/message/data/SingleMessage;\n\tpublic fun getHasConstrainSingle ()Z\n\tpublic fun getSize ()I\n\tpublic fun indexOf (Lnet/mamoe/mirai/message/data/SingleMessage;)I\n\tpublic fun isEmpty ()Z\n\tpublic fun iterator ()Ljava/util/Iterator;\n\tpublic fun lastIndexOf (Lnet/mamoe/mirai/message/data/SingleMessage;)I\n\tpublic fun listIterator ()Ljava/util/ListIterator;\n\tpublic fun listIterator (I)Ljava/util/ListIterator;\n\tpublic fun serializeToMiraiCode ()Ljava/lang/String;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n\tpublic fun subList (II)Ljava/util/List;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/Face : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field AI_NI I\n\tpublic static final field AI_QING I\n\tpublic static final field AI_XIN I\n\tpublic static final field AN_ZHONG_GUAN_CHA I\n\tpublic static final field AO_MAN I\n\tpublic static final field BAI_TUO I\n\tpublic static final field BAI_XIE I\n\tpublic static final field BAI_YAN I\n\tpublic static final field BANG_BANG_TANG I\n\tpublic static final field BAN_ZHUAN_ZHONG I\n\tpublic static final field BAO_BAO I\n\tpublic static final field BAO_FU I\n\tpublic static final field BAO_JI I\n\tpublic static final field BAO_JIN I\n\tpublic static final field BAO_QUAN I\n\tpublic static final field BIAN_BIAN I\n\tpublic static final field BIAN_PAO I\n\tpublic static final field BIAN_XING I\n\tpublic static final field BIAO_LEI I\n\tpublic static final field BI_SHI I\n\tpublic static final field BI_XIN I\n\tpublic static final field BI_ZUI I\n\tpublic static final field BO_BO I\n\tpublic static final field BU I\n\tpublic static final field BU_KAI_XIN I\n\tpublic static final field CAI I\n\tpublic static final field CAI_DAO I\n\tpublic static final field CAI_GOU I\n\tpublic static final field CANG_SANG I\n\tpublic static final field CA_HAN I\n\tpublic static final field CENG_YI_CENG I\n\tpublic static final field CHA I\n\tpublic static final field CHAN_DOU I\n\tpublic static final field CHAO_FENG I\n\tpublic static final field CHAO_PIAO I\n\tpublic static final field CHA_JIN I\n\tpublic static final field CHE_YI_CHE I\n\tpublic static final field CHI I\n\tpublic static final field CHI_GUA I\n\tpublic static final field CHI_TANG I\n\tpublic static final field CHONG_BAI I\n\tpublic static final field CUO_HAO I\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/Face$Companion;\n\tpublic static final field DAN I\n\tpublic static final field DAN_GAO I\n\tpublic static final field DAO I\n\tpublic static final field DA_CALL I\n\tpublic static final field DA_KU I\n\tpublic static final field DA_LIAN I\n\tpublic static final field DA_XIAO I\n\tpublic static final field DA_YUAN_ZHONG I\n\tpublic static final field DA_ZHAN_HONG_TU I\n\tpublic static final field DA_ZHAO_HU I\n\tpublic static final field DENG_LONG I\n\tpublic static final field DE_YI I\n\tpublic static final field DIAN_ZAN I\n\tpublic static final field DIAO_XIE I\n\tpublic static final field DING_GUA_GUA I\n\tpublic static final field DUI_HAO I\n\tpublic static final field E I\n\tpublic static final field FAN I\n\tpublic static final field FA_DAI I\n\tpublic static final field FA_DOU I\n\tpublic static final field FA_NU I\n\tpublic static final field FEI_JI I\n\tpublic static final field FEI_WEN I\n\tpublic static final field FEN_DOU I\n\tpublic static final field FO_XI I\n\tpublic static final field FU_LUO_BO I\n\tpublic static final field GAN_BEI I\n\tpublic static final field GAN_GA I\n\tpublic static final field GONG_XI I\n\tpublic static final field GOU_YIN I\n\tpublic static final field GU_ZHANG I\n\tpublic static final field HAI_PA I\n\tpublic static final field HAI_XIU I\n\tpublic static final field HAN I\n\tpublic static final field HAN_XIAO I\n\tpublic static final field HAO I\n\tpublic static final field HAO_BANG I\n\tpublic static final field HAO_SHAN I\n\tpublic static final field HA_QIAN I\n\tpublic static final field HENG I\n\tpublic static final field HE_CAI I\n\tpublic static final field HE_HE_DA I\n\tpublic static final field HE_NAI I\n\tpublic static final field HE_XIE I\n\tpublic static final field HONG_BAO I\n\tpublic static final field HONG_BAO_BAO I\n\tpublic static final field HONG_BAO_DUO_DUO I\n\tpublic static final field HUAI_XIAO I\n\tpublic static final field HUA_CHI I\n\tpublic static final field HUA_DUO_LIAN I\n\tpublic static final field HUI_SHOU I\n\tpublic static final field HUI_TOU I\n\tpublic static final field HU_HU_SHENG_WEI I\n\tpublic static final field HU_LIAN I\n\tpublic static final field JIA_YI I\n\tpublic static final field JIA_YOU I\n\tpublic static final field JIA_YOU_BAO_BAO I\n\tpublic static final field JIA_YOU_BI_SHENG I\n\tpublic static final field JIE_WU I\n\tpublic static final field JING_DAI I\n\tpublic static final field JING_KONG I\n\tpublic static final field JING_LI I\n\tpublic static final field JING_XI I\n\tpublic static final field JING_XIA I\n\tpublic static final field JING_YA I\n\tpublic static final field JI_DONG I\n\tpublic static final field JI_E I\n\tpublic static final field JI_ZHANG I\n\tpublic static final field JU_HUA I\n\tpublic static final field JU_JUE I\n\tpublic static final field JU_PAI_PAI I\n\tpublic static final field KAI_QIANG I\n\tpublic static final field KA_FEI I\n\tpublic static final field KEN_TOU I\n\tpublic static final field KE_AI I\n\tpublic static final field KE_DAO_LE I\n\tpublic static final field KE_LIAN I\n\tpublic static final field KE_TOU I\n\tpublic static final field KOU_BI I\n\tpublic static final field KOU_ZHAO_HU_TI I\n\tpublic static final field KU I\n\tpublic static final field KUAI_KU_LE I\n\tpublic static final field KUANG_XIAO I\n\tpublic static final field KUN I\n\tpublic static final field KU_LOU I\n\tpublic static final field K_GE I\n\tpublic static final field K歌 I\n\tpublic static final field LAN_QIU I\n\tpublic static final field LAO_SE_PI I\n\tpublic static final field LA_JIAO_JIANG I\n\tpublic static final field LA_YAN_JING I\n\tpublic static final field LEI_BEN I\n\tpublic static final field LENG_HAN I\n\tpublic static final field LENG_MO I\n\tpublic static final field LIAO_YI_LIAO I\n\tpublic static final field LIU_HAN I\n\tpublic static final field LIU_LEI I\n\tpublic static final field LI_WU I\n\tpublic static final field MAI_MENG I\n\tpublic static final field MANG_DAO_FEI_QI I\n\tpublic static final field MEI_GUI I\n\tpublic static final field MIAN_WU_BIAO_QING I\n\tpublic static final field MIAO_MIAO I\n\tpublic static final field MING_BAI I\n\tpublic static final field MO_GUI_XIAO I\n\tpublic static final field MO_JIN_LI I\n\tpublic static final field MO_YU I\n\tpublic static final field NAN_GUO I\n\tpublic static final field NAO_KUO_TENG I\n\tpublic static final field NA_DAO_HONG_BAO I\n\tpublic static final field NIU_A I\n\tpublic static final field NIU_QI_CHONG_TIAN I\n\tpublic static final field NI_ZHEN_BANG_BANG I\n\tpublic static final field NO I\n\tpublic static final field O I\n\tpublic static final field OK I\n\tpublic static final field OU_HUO I\n\tpublic static final field O_YO I\n\tpublic static final field PAI_SHOU I\n\tpublic static final field PAI_TOU I\n\tpublic static final field PAI_ZHUO I\n\tpublic static final field PANG_SAN_JIN I\n\tpublic static final field PEN_LIAN I\n\tpublic static final field PEN_XIE I\n\tpublic static final field PIAO_CHONG I\n\tpublic static final field PIE_ZUI I\n\tpublic static final field PING_PANG I\n\tpublic static final field PI_JIU I\n\tpublic static final field QIAO_DA I\n\tpublic static final field QIAO_KAI_XIN I\n\tpublic static final field QIA_YI_QIA I\n\tpublic static final field QING I\n\tpublic static final field QING_ZHU I\n\tpublic static final field QIN_QIN I\n\tpublic static final field QIU_DA_LE I\n\tpublic static final field QIU_HONG_BAO I\n\tpublic static final field QI_DAI I\n\tpublic static final field QI_DAO I\n\tpublic static final field QUAN_TOU I\n\tpublic static final field RANG_WO_KANG_KANG I\n\tpublic static final field RENG_GOU I\n\tpublic static final field RE_HUA_LE I\n\tpublic static final field SAO_RAO I\n\tpublic static final field SE I\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic static final field SHAN_DIAN I\n\tpublic static final field SHAN_LIAN I\n\tpublic static final field SHENG_LI I\n\tpublic static final field SHENG_QI I\n\tpublic static final field SHENG_RI_KUAI_LE I\n\tpublic static final field SHI_AI I\n\tpublic static final field SHOU_QIANG I\n\tpublic static final field SHUAI I\n\tpublic static final field SHUAI_TOU I\n\tpublic static final field SHUANG_XI I\n\tpublic static final field SHUI I\n\tpublic static final field SONG_HUA I\n\tpublic static final field SUAN_Q I\n\tpublic static final field TAI_NAN_LE I\n\tpublic static final field TAI_YANG I\n\tpublic static final field TIAN_PING I\n\tpublic static final field TIAN_YI_TIAN I\n\tpublic static final field TIAO_PI I\n\tpublic static final field TIAO_SHENG I\n\tpublic static final field TIAO_TIAO I\n\tpublic static final field TOU_KAN I\n\tpublic static final field TOU_TU I\n\tpublic static final field TOU_XIAO I\n\tpublic static final field TOU_ZHUANG_JI I\n\tpublic static final field TU I\n\tpublic static final field TUO_LIAN I\n\tpublic static final field TUO_SAI I\n\tpublic static final field WANG_WANG I\n\tpublic static final field WAN_CHENG I\n\tpublic static final field WEI_QU I\n\tpublic static final field WEI_XIAO I\n\tpublic static final field WEN_HAO_LIAN I\n\tpublic static final field WO_BU_KAN I\n\tpublic static final field WO_FANG_LE I\n\tpublic static final field WO_MEI_SHI I\n\tpublic static final field WO_SHOU I\n\tpublic static final field WO_SUAN_LE I\n\tpublic static final field WO_XIANG_KAI_LE I\n\tpublic static final field WO_ZUI_MEI I\n\tpublic static final field WU_LIAN I\n\tpublic static final field WU_LIAO I\n\tpublic static final field WU_NAI I\n\tpublic static final field WU_YAN_XIAO I\n\tpublic static final field XIA I\n\tpublic static final field XIAN_QI I\n\tpublic static final field XIAN_WEN I\n\tpublic static final field XIAO_JIU_JIE I\n\tpublic static final field XIAO_KU I\n\tpublic static final field XIAO_YANG_ER I\n\tpublic static final field XIE_HONG_BAO I\n\tpublic static final field XIE_YAN_XIAO I\n\tpublic static final field XIN_NIAN_YAN_HUA I\n\tpublic static final field XIN_SUI I\n\tpublic static final field XI_GUA I\n\tpublic static final field XU I\n\tpublic static final field YANG_TUO I\n\tpublic static final field YAN_HUA I\n\tpublic static final field YAO I\n\tpublic static final field YIN_XIAN I\n\tpublic static final field YI_WEN I\n\tpublic static final field YONG_BAO I\n\tpublic static final field YOU_BAI_NIAN I\n\tpublic static final field YOU_HENG_HENG I\n\tpublic static final field YOU_LING I\n\tpublic static final field YOU_QIN_QIN I\n\tpublic static final field YOU_TAI_JI I\n\tpublic static final field YOU_XIAN I\n\tpublic static final field YUAN_BAO I\n\tpublic static final field YUAN_LIANG I\n\tpublic static final field YUE_LIANG I\n\tpublic static final field YUN I\n\tpublic static final field ZAI_JIAN I\n\tpublic static final field ZAN I\n\tpublic static final field ZHA_DAN I\n\tpublic static final field ZHA_YAN_JING I\n\tpublic static final field ZHENG_YAN I\n\tpublic static final field ZHEN_HAO I\n\tpublic static final field ZHEN_JING I\n\tpublic static final field ZHE_MO I\n\tpublic static final field ZHOU_MA I\n\tpublic static final field ZHUAI_ZHA_TIAN I\n\tpublic static final field ZHUAN_QUAN I\n\tpublic static final field ZHUA_KUANG I\n\tpublic static final field ZHU_TOU I\n\tpublic static final field ZI_XI_FEN_XI I\n\tpublic static final field ZI_YA I\n\tpublic static final field ZUO_BAI_NIAN I\n\tpublic static final field ZUO_HENG_HENG I\n\tpublic static final field ZUO_QIN_QIN I\n\tpublic static final field ZUO_TAI_JI I\n\tpublic static final field ZU_QIU I\n\tpublic static final field doge I\n\tpublic static final field emm I\n\tpublic static final field names [Ljava/lang/String;\n\tpublic static final field 不 I\n\tpublic static final field 不开心 I\n\tpublic static final field 举牌牌 I\n\tpublic static final field 乒乓 I\n\tpublic static final field 亲亲 I\n\tpublic static final field 仔细分析 I\n\tpublic static final field 佛系 I\n\tpublic static final field 你真棒棒 I\n\tpublic static final field 便便 I\n\tpublic static final field 偷看 I\n\tpublic static final field 偷笑 I\n\tpublic static final field 傲慢 I\n\tpublic static final field 元宝 I\n\tpublic static final field 再见 I\n\tpublic static final field 冷汗 I\n\tpublic static final field 冷漠 I\n\tpublic static final field 凋谢 I\n\tpublic static final field 击掌 I\n\tpublic static final field 刀 I\n\tpublic static final field 加一 I\n\tpublic static final field 加油 I\n\tpublic static final field 加油必胜 I\n\tpublic static final field 加油抱抱 I\n\tpublic static final field 勾引 I\n\tpublic static final field 卖萌 I\n\tpublic static final field 原谅 I\n\tpublic static final field 双喜 I\n\tpublic static final field 发呆 I\n\tpublic static final field 发怒 I\n\tpublic static final field 发抖 I\n\tpublic static final field 变形 I\n\tpublic static final field 口罩护体 I\n\tpublic static final field 可怜 I\n\tpublic static final field 可爱 I\n\tpublic static final field 右亲亲 I\n\tpublic static final field 右哼哼 I\n\tpublic static final field 右太极 I\n\tpublic static final field 右拜年 I\n\tpublic static final field 吃 I\n\tpublic static final field 吃瓜 I\n\tpublic static final field 吃糖 I\n\tpublic static final field 吐 I\n\tpublic static final field 吓 I\n\tpublic static final field 呃 I\n\tpublic static final field 呲牙 I\n\tpublic static final field 呵呵哒 I\n\tpublic static final field 咒骂 I\n\tpublic static final field 咖啡 I\n\tpublic static final field 哈欠 I\n\tpublic static final field 哦 I\n\tpublic static final field 哦哟 I\n\tpublic static final field 哼 I\n\tpublic static final field 啃头 I\n\tpublic static final field 啤酒 I\n\tpublic static final field 啵啵 I\n\tpublic static final field 喝奶 I\n\tpublic static final field 喝彩 I\n\tpublic static final field 喵喵 I\n\tpublic static final field 喷脸 I\n\tpublic static final field 喷血 I\n\tpublic static final field 嗑到了 I\n\tpublic static final field 嘘 I\n\tpublic static final field 嘲讽 I\n\tpublic static final field 回头 I\n\tpublic static final field 困 I\n\tpublic static final field 坏笑 I\n\tpublic static final field 大哭 I\n\tpublic static final field 大展宏兔 I\n\tpublic static final field 大怨种 I\n\tpublic static final field 大笑 I\n\tpublic static final field 太南了 I\n\tpublic static final field 太阳 I\n\tpublic static final field 头撞击 I\n\tpublic static final field 头秃 I\n\tpublic static final field 奋斗 I\n\tpublic static final field 好 I\n\tpublic static final field 好棒 I\n\tpublic static final field 好闪 I\n\tpublic static final field 委屈 I\n\tpublic static final field 嫌弃 I\n\tpublic static final field 完成 I\n\tpublic static final field 害怕 I\n\tpublic static final field 害羞 I\n\tpublic static final field 对号 I\n\tpublic static final field 小样儿 I\n\tpublic static final field 小纠结 I\n\tpublic static final field 尴尬 I\n\tpublic static final field 崇拜 I\n\tpublic static final field 左亲亲 I\n\tpublic static final field 左哼哼 I\n\tpublic static final field 左太极 I\n\tpublic static final field 左拜年 I\n\tpublic static final field 差劲 I\n\tpublic static final field 干杯 I\n\tpublic static final field 幽灵 I\n\tpublic static final field 庆祝 I\n\tpublic static final field 开枪 I\n\tpublic static final field 得意 I\n\tpublic static final field 微笑 I\n\tpublic static final field 心碎 I\n\tpublic static final field 忙到飞起 I\n\tpublic static final field 快哭了 I\n\tpublic static final field 怄火 I\n\tpublic static final field 恭喜 I\n\tpublic static final field 悠闲 I\n\tpublic static final field 惊吓 I\n\tpublic static final field 惊呆 I\n\tpublic static final field 惊喜 I\n\tpublic static final field 惊恐 I\n\tpublic static final field 惊讶 I\n\tpublic static final field 憨笑 I\n\tpublic static final field 我不看 I\n\tpublic static final field 我想开了 I\n\tpublic static final field 我方了 I\n\tpublic static final field 我最美 I\n\tpublic static final field 我没事 I\n\tpublic static final field 我酸了 I\n\tpublic static final field 扇脸 I\n\tpublic static final field 手枪 I\n\tpublic static final field 打call I\n\tpublic static final field 打招呼 I\n\tpublic static final field 打脸 I\n\tpublic static final field 扔狗 I\n\tpublic static final field 托脸 I\n\tpublic static final field 托腮 I\n\tpublic static final field 扯一扯 I\n\tpublic static final field 抓狂 I\n\tpublic static final field 折磨 I\n\tpublic static final field 抠鼻 I\n\tpublic static final field 抱抱 I\n\tpublic static final field 抱拳 I\n\tpublic static final field 拍头 I\n\tpublic static final field 拍手 I\n\tpublic static final field 拍桌 I\n\tpublic static final field 拒绝 I\n\tpublic static final field 拜托 I\n\tpublic static final field 拜谢 I\n\tpublic static final field 拥抱 I\n\tpublic static final field 拳头 I\n\tpublic static final field 拽炸天 I\n\tpublic static final field 拿到红包 I\n\tpublic static final field 挥手 I\n\tpublic static final field 捂脸 I\n\tpublic static final field 掐一掐 I\n\tpublic static final field 握手 I\n\tpublic static final field 搬砖中 I\n\tpublic static final field 摸锦鲤 I\n\tpublic static final field 摸鱼 I\n\tpublic static final field 撇嘴 I\n\tpublic static final field 撩一撩 I\n\tpublic static final field 擦汗 I\n\tpublic static final field 敬礼 I\n\tpublic static final field 敲开心 I\n\tpublic static final field 敲打 I\n\tpublic static final field 斜眼笑 I\n\tpublic static final field 新年烟花 I\n\tpublic static final field 无奈 I\n\tpublic static final field 无眼笑 I\n\tpublic static final field 无聊 I\n\tpublic static final field 明白 I\n\tpublic static final field 晕 I\n\tpublic static final field 暗中观察 I\n\tpublic static final field 暴击 I\n\tpublic static final field 月亮 I\n\tpublic static final field 期待 I\n\tpublic static final field 棒棒糖 I\n\tpublic static final field 比心 I\n\tpublic static final field 求红包 I\n\tpublic static final field 汗 I\n\tpublic static final field 汪汪 I\n\tpublic static final field 沧桑 I\n\tpublic static final field 河蟹 I\n\tpublic static final field 泪奔 I\n\tpublic static final field 流汗 I\n\tpublic static final field 流泪 I\n\tpublic static final field 激动 I\n\tpublic static final field 灯笼 I\n\tpublic static final field 炸弹 I\n\tpublic static final field 点赞 I\n\tpublic static final field 烟花 I\n\tpublic static final field 热化了 I\n\tpublic static final field 爆筋 I\n\tpublic static final field 爱你 I\n\tpublic static final field 爱心 I\n\tpublic static final field 爱情 I\n\tpublic static final field 牛啊 I\n\tpublic static final field 牛气冲天 I\n\tpublic static final field 狂笑 I\n\tpublic static final field 猪头 I\n\tpublic static final field 献吻 I\n\tpublic static final field 玫瑰 I\n\tpublic static final field 瓢虫 I\n\tpublic static final field 生日快乐 I\n\tpublic static final field 生气 I\n\tpublic static final field 甩头 I\n\tpublic static final field 疑问 I\n\tpublic static final field 白眼 I\n\tpublic static final field 真好 I\n\tpublic static final field 眨眼睛 I\n\tpublic static final field 睁眼 I\n\tpublic static final field 睡 I\n\tpublic static final field 磕头 I\n\tpublic static final field 示爱 I\n\tpublic static final field 礼物 I\n\tpublic static final field 祈祷 I\n\tpublic static final field 福萝卜 I\n\tpublic static final field 笑哭 I\n\tpublic static final field 篮球 I\n\tpublic static final field 糊脸 I\n\tpublic static final field 糗大了 I\n\tpublic static final field 红包 I\n\tpublic static final field 红包包 I\n\tpublic static final field 红包多多 I\n\tpublic static final field 羊驼 I\n\tpublic static final field 老色痞 I\n\tpublic static final field 胖三斤 I\n\tpublic static final field 胜利 I\n\tpublic static final field 脑阔疼 I\n\tpublic static final field 舔一舔 I\n\tpublic static final field 舔屏 I\n\tpublic static final field 色 I\n\tpublic static final field 花朵脸 I\n\tpublic static final field 花痴 I\n\tpublic static final field 茶 I\n\tpublic static final field 药 I\n\tpublic static final field 菊花 I\n\tpublic static final field 菜刀 I\n\tpublic static final field 菜狗 I\n\tpublic static final field 虎虎生威 I\n\tpublic static final field 蛋 I\n\tpublic static final field 蛋糕 I\n\tpublic static final field 街舞 I\n\tpublic static final field 衰 I\n\tpublic static final field 西瓜 I\n\tpublic static final field 让我康康 I\n\tpublic static final field 请 I\n\tpublic static final field 调皮 I\n\tpublic static final field 谢红包 I\n\tpublic static final field 豹富 I\n\tpublic static final field 赞 I\n\tpublic static final field 足球 I\n\tpublic static final field 跳绳 I\n\tpublic static final field 跳跳 I\n\tpublic static final field 踩 I\n\tpublic static final field 蹭一蹭 I\n\tpublic static final field 转圈 I\n\tpublic static final field 辣椒酱 I\n\tpublic static final field 辣眼睛 I\n\tpublic static final field 送花 I\n\tpublic static final field 鄙视 I\n\tpublic static final field 酷 I\n\tpublic static final field 酸Q I\n\tpublic static final field 钞票 I\n\tpublic static final field 错号 I\n\tpublic static final field 闪电 I\n\tpublic static final field 闭嘴 I\n\tpublic static final field 问号脸 I\n\tpublic static final field 阴险 I\n\tpublic static final field 难过 I\n\tpublic static final field 震惊 I\n\tpublic static final field 面无表情 I\n\tpublic static final field 鞭炮 I\n\tpublic static final field 顶呱呱 I\n\tpublic static final field 颤抖 I\n\tpublic static final field 飙泪 I\n\tpublic static final field 飞吻 I\n\tpublic static final field 飞机 I\n\tpublic static final field 饥饿 I\n\tpublic static final field 饭 I\n\tpublic static final field 骚扰 I\n\tpublic static final field 骷髅 I\n\tpublic static final field 魔鬼笑 I\n\tpublic static final field 鼓掌 I\n\tpublic fun <init> (I)V\n\tpublic synthetic fun <init> (IILkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic final fun component1 ()I\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic final fun copy (I)Lnet/mamoe/mirai/message/data/Face;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/Face;IILjava/lang/Object;)Lnet/mamoe/mirai/message/data/Face;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getId ()I\n\tpublic final fun getName ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/Face;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/Face$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/Face$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/Face;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/Face;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/Face$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/FileMessage : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/FileMessage$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic static fun create (Ljava/lang/String;ILjava/lang/String;J)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic abstract fun getId ()Ljava/lang/String;\n\tpublic abstract fun getInternalId ()I\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/FileMessage$Key;\n\tpublic synthetic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic abstract fun getName ()Ljava/lang/String;\n\tpublic abstract fun getSize ()J\n\tpublic fun toAbsoluteFile (Lnet/mamoe/mirai/contact/FileSupported;)Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic abstract fun toAbsoluteFile (Lnet/mamoe/mirai/contact/FileSupported;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun toRemoteFile (Lnet/mamoe/mirai/contact/FileSupported;)Lnet/mamoe/mirai/utils/RemoteFile;\n\tpublic fun toRemoteFile (Lnet/mamoe/mirai/contact/FileSupported;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun toRemoteFile$suspendImpl (Lnet/mamoe/mirai/message/data/FileMessage;Lnet/mamoe/mirai/contact/FileSupported;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/message/data/FileMessage$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic final fun create (Ljava/lang/String;ILjava/lang/String;J)Lnet/mamoe/mirai/message/data/FileMessage;\n}\n\npublic final class net/mamoe/mirai/message/data/FileMessage$Serializer : kotlinx/serialization/KSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/FileMessage$Serializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/FileMessage;)V\n}\n\npublic final class net/mamoe/mirai/message/data/FlashImage : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/HummerMessage, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/FlashImage$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (ILnet/mamoe/mirai/message/data/Image;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/message/data/Image;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/message/data/Image;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/message/data/Image;)Lnet/mamoe/mirai/message/data/FlashImage;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/FlashImage;Lnet/mamoe/mirai/message/data/Image;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/FlashImage;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic static final fun from (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/FlashImage;\n\tpublic static final fun from (Lnet/mamoe/mirai/message/data/Image;)Lnet/mamoe/mirai/message/data/FlashImage;\n\tpublic final fun getImage ()Lnet/mamoe/mirai/message/data/Image;\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic fun hashCode ()I\n\tpublic fun serializeToMiraiCode ()Ljava/lang/String;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/FlashImage;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/FlashImage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/FlashImage$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/FlashImage;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/FlashImage;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/FlashImage$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic final fun from (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/FlashImage;\n\tpublic final fun from (Lnet/mamoe/mirai/message/data/Image;)Lnet/mamoe/mirai/message/data/FlashImage;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/FlashImageKt {\n\tpublic static final synthetic fun FlashImage (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/FlashImage;\n\tpublic static final synthetic fun flash (Lnet/mamoe/mirai/message/data/Image;)Lnet/mamoe/mirai/message/data/FlashImage;\n}\n\npublic final class net/mamoe/mirai/message/data/ForwardMessage : net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/ForwardMessage$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (ILjava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V\n\tpublic final fun component1 ()Ljava/util/List;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun component4 ()Ljava/lang/String;\n\tpublic final fun component5 ()Ljava/lang/String;\n\tpublic final fun component6 ()Ljava/util/List;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic final fun copy (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/ForwardMessage;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBrief ()Ljava/lang/String;\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic final fun getNodeList ()Ljava/util/List;\n\tpublic final fun getPreview ()Ljava/util/List;\n\tpublic final fun getSource ()Ljava/lang/String;\n\tpublic final fun getSummary ()Ljava/lang/String;\n\tpublic final fun getTitle ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/ForwardMessage;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/ForwardMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/ForwardMessage$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/ForwardMessage;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy {\n\tpublic static final field Default Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy$Default;\n\tpublic fun generateBrief (Lnet/mamoe/mirai/message/data/RawForwardMessage;)Ljava/lang/String;\n\tpublic fun generatePreview (Lnet/mamoe/mirai/message/data/RawForwardMessage;)Ljava/util/List;\n\tpublic fun generateSource (Lnet/mamoe/mirai/message/data/RawForwardMessage;)Ljava/lang/String;\n\tpublic fun generateSummary (Lnet/mamoe/mirai/message/data/RawForwardMessage;)Ljava/lang/String;\n\tpublic fun generateTitle (Lnet/mamoe/mirai/message/data/RawForwardMessage;)Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy$Default : net/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy {\n}\n\npublic final class net/mamoe/mirai/message/data/ForwardMessage$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/ForwardMessage$Node : net/mamoe/mirai/message/data/ForwardMessage$INode {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/ForwardMessage$Node$Companion;\n\tpublic synthetic fun <init> (IJILjava/lang/String;Lnet/mamoe/mirai/message/data/MessageChain;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> (JILjava/lang/String;Lnet/mamoe/mirai/message/data/Message;)V\n\tpublic fun <init> (JILjava/lang/String;Lnet/mamoe/mirai/message/data/MessageChain;)V\n\tpublic final fun component1 ()J\n\tpublic final fun component2 ()I\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun copy (JILjava/lang/String;Lnet/mamoe/mirai/message/data/MessageChain;)Lnet/mamoe/mirai/message/data/ForwardMessage$Node;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/ForwardMessage$Node;JILjava/lang/String;Lnet/mamoe/mirai/message/data/MessageChain;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessage$Node;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getMessageChain ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSenderId ()J\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getTime ()I\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/ForwardMessage$Node;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/ForwardMessage$Node$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/ForwardMessage$Node$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/ForwardMessage$Node;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/ForwardMessage$Node;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/ForwardMessage$Node$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/ForwardMessageBuilder : java/util/List, kotlin/jvm/internal/markers/KMutableList {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Contact;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Contact;I)V\n\tpublic synthetic fun add (ILjava/lang/Object;)V\n\tpublic fun add (ILnet/mamoe/mirai/message/data/ForwardMessage$INode;)V\n\tpublic final fun add (JLjava/lang/String;ILkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun add (JLjava/lang/String;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun add (JLjava/lang/String;Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun add (JLjava/lang/String;Lnet/mamoe/mirai/message/data/Message;I)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic synthetic fun add (Ljava/lang/Object;)Z\n\tpublic final fun add (Lnet/mamoe/mirai/contact/User;Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun add (Lnet/mamoe/mirai/contact/User;Lnet/mamoe/mirai/message/data/Message;I)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun add (Lnet/mamoe/mirai/contact/UserOrBot;ILkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun add (Lnet/mamoe/mirai/contact/UserOrBot;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun add (Lnet/mamoe/mirai/contact/UserOrBot;Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun add (Lnet/mamoe/mirai/contact/UserOrBot;Lnet/mamoe/mirai/message/data/Message;I)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun add (Lnet/mamoe/mirai/event/events/MessageEvent;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic fun add (Lnet/mamoe/mirai/message/data/ForwardMessage$INode;)Z\n\tpublic static synthetic fun add$default (Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;JLjava/lang/String;ILkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic static synthetic fun add$default (Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;JLjava/lang/String;Lnet/mamoe/mirai/message/data/Message;IILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic static synthetic fun add$default (Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;Lnet/mamoe/mirai/contact/User;Lnet/mamoe/mirai/message/data/Message;IILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic static synthetic fun add$default (Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;Lnet/mamoe/mirai/contact/UserOrBot;ILkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic static synthetic fun add$default (Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;Lnet/mamoe/mirai/contact/UserOrBot;Lnet/mamoe/mirai/message/data/Message;IILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic fun addAll (ILjava/util/Collection;)Z\n\tpublic fun addAll (Ljava/util/Collection;)Z\n\tpublic final fun at (II)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun at (JI)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun at (Lnet/mamoe/mirai/contact/User;I)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun at (Lnet/mamoe/mirai/contact/UserOrBot;I)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun build ()Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic fun clear ()V\n\tpublic final fun contains (Ljava/lang/Object;)Z\n\tpublic fun contains (Lnet/mamoe/mirai/message/data/ForwardMessage$INode;)Z\n\tpublic fun containsAll (Ljava/util/Collection;)Z\n\tpublic synthetic fun get (I)Ljava/lang/Object;\n\tpublic fun get (I)Lnet/mamoe/mirai/message/data/ForwardMessage$INode;\n\tpublic final fun getContext ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun getCurrentTime ()I\n\tpublic final fun getDisplayStrategy ()Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;\n\tpublic fun getSize ()I\n\tpublic final fun indexOf (Ljava/lang/Object;)I\n\tpublic fun indexOf (Lnet/mamoe/mirai/message/data/ForwardMessage$INode;)I\n\tpublic fun isEmpty ()Z\n\tpublic fun iterator ()Ljava/util/Iterator;\n\tpublic final fun lastIndexOf (Ljava/lang/Object;)I\n\tpublic fun lastIndexOf (Lnet/mamoe/mirai/message/data/ForwardMessage$INode;)I\n\tpublic fun listIterator ()Ljava/util/ListIterator;\n\tpublic fun listIterator (I)Ljava/util/ListIterator;\n\tpublic final fun named (ILjava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun named (JLjava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun named (Lnet/mamoe/mirai/contact/User;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun named (Lnet/mamoe/mirai/contact/UserOrBot;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic synthetic fun remove (I)Ljava/lang/Object;\n\tpublic final fun remove (I)Lnet/mamoe/mirai/message/data/ForwardMessage$INode;\n\tpublic final fun remove (Ljava/lang/Object;)Z\n\tpublic fun remove (Lnet/mamoe/mirai/message/data/ForwardMessage$INode;)Z\n\tpublic fun removeAll (Ljava/util/Collection;)Z\n\tpublic fun removeAt (I)Lnet/mamoe/mirai/message/data/ForwardMessage$INode;\n\tpublic fun retainAll (Ljava/util/Collection;)Z\n\tpublic final fun says (ILjava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (ILkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (ILnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (JLjava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (JLkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (JLnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (Lnet/mamoe/mirai/Bot;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (Lnet/mamoe/mirai/Bot;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (Lnet/mamoe/mirai/contact/User;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (Lnet/mamoe/mirai/contact/User;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (Lnet/mamoe/mirai/contact/User;Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (Lnet/mamoe/mirai/contact/UserOrBot;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (Lnet/mamoe/mirai/contact/UserOrBot;Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic synthetic fun set (ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun set (ILnet/mamoe/mirai/message/data/ForwardMessage$INode;)Lnet/mamoe/mirai/message/data/ForwardMessage$INode;\n\tpublic final fun setCurrentTime (I)V\n\tpublic final fun setDisplayStrategy (Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;)V\n\tpublic final fun size ()I\n\tpublic fun subList (II)Ljava/util/List;\n\tpublic fun toArray ()[Ljava/lang/Object;\n\tpublic fun toArray ([Ljava/lang/Object;)[Ljava/lang/Object;\n\tpublic final fun toRawForwardMessage ()Lnet/mamoe/mirai/message/data/RawForwardMessage;\n}\n\npublic final class net/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode : net/mamoe/mirai/message/data/ForwardMessage$INode {\n\tpublic field messageChain Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun at (I)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic fun getMessageChain ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSenderId ()J\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getTime ()I\n\tpublic final fun message (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun message (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun named (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun says (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun sender (Lnet/mamoe/mirai/contact/User;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun sender (Lnet/mamoe/mirai/contact/UserOrBot;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun senderId (I)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun senderId (J)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun senderName (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic fun setMessageChain (Lnet/mamoe/mirai/message/data/MessageChain;)V\n\tpublic fun setSenderId (J)V\n\tpublic fun setSenderName (Ljava/lang/String;)V\n\tpublic fun setTime (I)V\n\tpublic final fun time (I)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface annotation class net/mamoe/mirai/message/data/ForwardMessageDsl : java/lang/annotation/Annotation {\n}\n\npublic final class net/mamoe/mirai/message/data/ForwardMessageKt {\n\tpublic static final synthetic fun buildForwardMessage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static final synthetic fun buildForwardMessage (Lnet/mamoe/mirai/event/events/MessageEvent;Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static synthetic fun buildForwardMessage$default (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static synthetic fun buildForwardMessage$default (Lnet/mamoe/mirai/event/events/MessageEvent;Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static final fun toForwardMessage (Ljava/lang/Iterable;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static final fun toForwardMessage (Ljava/lang/Iterable;Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static final fun toForwardMessage (Lnet/mamoe/mirai/message/data/Message;JLjava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static final fun toForwardMessage (Lnet/mamoe/mirai/message/data/Message;JLjava/lang/String;I)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static final fun toForwardMessage (Lnet/mamoe/mirai/message/data/Message;JLjava/lang/String;ILnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static final fun toForwardMessage (Lnet/mamoe/mirai/message/data/Message;Lnet/mamoe/mirai/contact/User;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static final fun toForwardMessage (Lnet/mamoe/mirai/message/data/Message;Lnet/mamoe/mirai/contact/User;I)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static final fun toForwardMessage (Lnet/mamoe/mirai/message/data/Message;Lnet/mamoe/mirai/contact/User;ILnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static synthetic fun toForwardMessage$default (Ljava/lang/Iterable;Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static synthetic fun toForwardMessage$default (Lnet/mamoe/mirai/message/data/Message;JLjava/lang/String;ILnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static synthetic fun toForwardMessage$default (Lnet/mamoe/mirai/message/data/Message;Lnet/mamoe/mirai/contact/User;ILnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n}\n\npublic final class net/mamoe/mirai/message/data/HummerMessage$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/Image : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/Message, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/Image$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic static fun fromId (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic abstract fun getHeight ()I\n\tpublic abstract fun getImageId ()Ljava/lang/String;\n\tpublic static fun getImageIdRegex ()Lkotlin/text/Regex;\n\tpublic static fun getImageResourceIdRegex1 ()Lkotlin/text/Regex;\n\tpublic static fun getImageResourceIdRegex2 ()Lkotlin/text/Regex;\n\tpublic abstract fun getImageType ()Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic fun getMd5 ()[B\n\tpublic abstract fun getSize ()J\n\tpublic abstract fun getWidth ()I\n\tpublic fun isEmoji ()Z\n\tpublic static fun isUploaded (Lnet/mamoe/mirai/Bot;[BJ)Z\n\tpublic static fun isUploaded (Lnet/mamoe/mirai/Bot;[BJLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun isUploaded (Lnet/mamoe/mirai/message/data/Image;Lnet/mamoe/mirai/Bot;)Z\n\tpublic static fun isUploaded (Lnet/mamoe/mirai/message/data/Image;Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun newBuilder (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image$Builder;\n\tpublic static fun queryUrl (Lnet/mamoe/mirai/message/data/Image;)Ljava/lang/String;\n\tpublic static fun queryUrl (Lnet/mamoe/mirai/message/data/Image;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/message/data/Image$AsStringSerializer : kotlinx/serialization/KSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/Image$AsStringSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/Image;)V\n}\n\npublic final class net/mamoe/mirai/message/data/Image$Builder {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/Image$Builder$Companion;\n\tpublic synthetic fun <init> (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun build ()Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun getHeight ()I\n\tpublic final fun getImageId ()Ljava/lang/String;\n\tpublic final fun getSize ()J\n\tpublic final fun getType ()Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic final fun getWidth ()I\n\tpublic final fun isEmoji ()Z\n\tpublic static final fun newBuilder (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image$Builder;\n\tpublic final fun setEmoji (Z)V\n\tpublic final fun setHeight (I)V\n\tpublic final fun setImageId (Ljava/lang/String;)V\n\tpublic final fun setSize (J)V\n\tpublic final fun setType (Lnet/mamoe/mirai/message/data/ImageType;)V\n\tpublic final fun setWidth (I)V\n}\n\npublic final class net/mamoe/mirai/message/data/Image$Builder$Companion {\n\tpublic final fun newBuilder (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image$Builder;\n}\n\npublic final class net/mamoe/mirai/message/data/Image$Key : net/mamoe/mirai/message/data/AbstractMessageKey {\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic final fun calculateImageMd5ByImageId (Ljava/lang/String;)[B\n\tpublic final fun fromId (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun getImageIdRegex ()Lkotlin/text/Regex;\n\tpublic final fun getImageResourceIdRegex1 ()Lkotlin/text/Regex;\n\tpublic final fun getImageResourceIdRegex2 ()Lkotlin/text/Regex;\n\tpublic final fun isUploaded (Lnet/mamoe/mirai/Bot;[BJ)Z\n\tpublic final fun isUploaded (Lnet/mamoe/mirai/Bot;[BJLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun isUploaded (Lnet/mamoe/mirai/message/data/Image;Lnet/mamoe/mirai/Bot;)Z\n\tpublic final fun isUploaded (Lnet/mamoe/mirai/message/data/Image;Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun newBuilder (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image$Builder;\n\tpublic final fun queryUrl (Lnet/mamoe/mirai/message/data/Image;)Ljava/lang/String;\n\tpublic final fun queryUrl (Lnet/mamoe/mirai/message/data/Image;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/message/data/Image$Serializer : kotlinx/serialization/KSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/Image$Serializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/Image;)V\n}\n\npublic final class net/mamoe/mirai/message/data/ImageType : java/lang/Enum {\n\tpublic static final field APNG Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic static final field BMP Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/ImageType$Companion;\n\tpublic static final field GIF Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic static final field JPG Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic static final field PNG Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic static final field UNKNOWN Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic final fun getFormatName ()Ljava/lang/String;\n\tpublic static final fun match (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic static final fun matchOrNull (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic static fun values ()[Lnet/mamoe/mirai/message/data/ImageType;\n}\n\npublic final class net/mamoe/mirai/message/data/ImageType$Companion {\n\tpublic final fun match (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic final fun matchOrNull (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/LightApp : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/RichMessage {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/LightApp$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (ILjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun copy (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/LightApp;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/LightApp;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/LightApp;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getContent ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/LightApp;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/LightApp$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/LightApp$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/LightApp;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/LightApp;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/LightApp$Key : net/mamoe/mirai/message/data/AbstractMessageKey {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/MarketFace : net/mamoe/mirai/message/data/HummerMessage {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/MarketFace$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic abstract fun getId ()I\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic abstract fun getName ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/MarketFace$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/Message {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/Message$Companion;\n\tpublic fun contentEquals (Ljava/lang/String;Z)Z\n\tpublic fun contentEquals (Lnet/mamoe/mirai/message/data/Message;Z)Z\n\tpublic fun contentEquals (Lnet/mamoe/mirai/message/data/Message;ZZ)Z\n\tpublic static synthetic fun contentEquals$default (Lnet/mamoe/mirai/message/data/Message;Ljava/lang/String;ZILjava/lang/Object;)Z\n\tpublic static synthetic fun contentEquals$default (Lnet/mamoe/mirai/message/data/Message;Lnet/mamoe/mirai/message/data/Message;ZILjava/lang/Object;)Z\n\tpublic static synthetic fun contentEquals$default (Lnet/mamoe/mirai/message/data/Message;Lnet/mamoe/mirai/message/data/Message;ZZILjava/lang/Object;)Z\n\tpublic abstract fun contentToString ()Ljava/lang/String;\n\tpublic synthetic fun followedBy (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun plus (Ljava/lang/CharSequence;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun plus (Ljava/lang/Iterable;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun plus (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun plus (Lkotlin/sequences/Sequence;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun plus (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun plus (Lnet/mamoe/mirai/message/data/MessageChain;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun plus (Lnet/mamoe/mirai/message/data/SingleMessage;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun plus ([Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun plusIterableString (Ljava/lang/Iterable;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic abstract fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/Message$Companion {\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/MessageChain : java/util/List, java/util/RandomAccess, kotlin/jvm/internal/markers/KMappedMarker, net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/Message {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/MessageChain$Companion;\n\tpublic fun contains (Lnet/mamoe/mirai/message/data/MessageKey;)Z\n\tpublic static fun deserializeFromJsonString (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static fun deserializeFromJsonString (Ljava/lang/String;Lkotlinx/serialization/json/Json;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static fun deserializeFromMiraiCode (Ljava/lang/String;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static fun deserializeFromMiraiCode (Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/String;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static synthetic fun deserializeJsonToMessageChain (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static synthetic fun deserializeJsonToMessageChain (Ljava/lang/String;Lkotlinx/serialization/json/Json;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun get (Lnet/mamoe/mirai/message/data/MessageKey;)Lnet/mamoe/mirai/message/data/SingleMessage;\n\tpublic static fun serializeToJsonString (Lnet/mamoe/mirai/message/data/MessageChain;)Ljava/lang/String;\n\tpublic static fun serializeToJsonString (Lnet/mamoe/mirai/message/data/MessageChain;Lkotlinx/serialization/json/Json;)Ljava/lang/String;\n\tpublic static fun serializeToString (Lnet/mamoe/mirai/message/data/MessageChain;Lkotlinx/serialization/StringFormat;)Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageChain$Companion {\n\tpublic final fun deserializeFromJsonString (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun deserializeFromJsonString (Ljava/lang/String;Lkotlinx/serialization/json/Json;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static synthetic fun deserializeFromJsonString$default (Lnet/mamoe/mirai/message/data/MessageChain$Companion;Ljava/lang/String;Lkotlinx/serialization/json/Json;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun deserializeFromMiraiCode (Ljava/lang/String;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun deserializeFromMiraiCode (Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/String;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static synthetic fun deserializeFromMiraiCode$default (Lnet/mamoe/mirai/message/data/MessageChain$Companion;Ljava/lang/String;Lnet/mamoe/mirai/contact/Contact;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static synthetic fun deserializeFromMiraiCode$default (Lnet/mamoe/mirai/message/data/MessageChain$Companion;Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/String;Lnet/mamoe/mirai/contact/Contact;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final synthetic fun deserializeJsonToMessageChain (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final synthetic fun deserializeJsonToMessageChain (Ljava/lang/String;Lkotlinx/serialization/json/Json;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun serializeToJsonString (Lnet/mamoe/mirai/message/data/MessageChain;)Ljava/lang/String;\n\tpublic final fun serializeToJsonString (Lnet/mamoe/mirai/message/data/MessageChain;Lkotlinx/serialization/json/Json;)Ljava/lang/String;\n\tpublic static synthetic fun serializeToJsonString$default (Lnet/mamoe/mirai/message/data/MessageChain$Companion;Lnet/mamoe/mirai/message/data/MessageChain;Lkotlinx/serialization/json/Json;ILjava/lang/Object;)Ljava/lang/String;\n\tpublic final fun serializeToString (Lnet/mamoe/mirai/message/data/MessageChain;Lkotlinx/serialization/StringFormat;)Ljava/lang/String;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageChain$Serializer : kotlinx/serialization/KSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/MessageChain$Serializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/MessageChain;)V\n}\n\npublic final class net/mamoe/mirai/message/data/MessageChainBuilder : java/lang/Appendable, java/util/List, kotlin/jvm/internal/markers/KMutableList {\n\tpublic fun <init> ()V\n\tpublic fun <init> (I)V\n\tpublic synthetic fun add (ILjava/lang/Object;)V\n\tpublic fun add (ILnet/mamoe/mirai/message/data/SingleMessage;)V\n\tpublic synthetic fun add (Ljava/lang/Object;)Z\n\tpublic final fun add (Ljava/lang/String;)V\n\tpublic final fun add (Lnet/mamoe/mirai/message/data/Message;)Z\n\tpublic fun add (Lnet/mamoe/mirai/message/data/SingleMessage;)Z\n\tpublic fun addAll (ILjava/util/Collection;)Z\n\tpublic final fun addAll (Ljava/lang/Iterable;)Z\n\tpublic fun addAll (Ljava/util/Collection;)Z\n\tpublic final fun addAllFlatten (Ljava/lang/Iterable;)Z\n\tpublic synthetic fun append (C)Ljava/lang/Appendable;\n\tpublic fun append (C)Lnet/mamoe/mirai/message/data/MessageChainBuilder;\n\tpublic synthetic fun append (Ljava/lang/CharSequence;)Ljava/lang/Appendable;\n\tpublic fun append (Ljava/lang/CharSequence;)Lnet/mamoe/mirai/message/data/MessageChainBuilder;\n\tpublic synthetic fun append (Ljava/lang/CharSequence;II)Ljava/lang/Appendable;\n\tpublic fun append (Ljava/lang/CharSequence;II)Lnet/mamoe/mirai/message/data/MessageChainBuilder;\n\tpublic final fun append (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/MessageChainBuilder;\n\tpublic final fun append (Lnet/mamoe/mirai/message/data/SingleMessage;)Lnet/mamoe/mirai/message/data/MessageChainBuilder;\n\tpublic final fun asMessageChain ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun build ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun clear ()V\n\tpublic final fun contains (Ljava/lang/Object;)Z\n\tpublic fun contains (Lnet/mamoe/mirai/message/data/SingleMessage;)Z\n\tpublic fun containsAll (Ljava/util/Collection;)Z\n\tpublic final fun copy ()Lnet/mamoe/mirai/message/data/MessageChainBuilder;\n\tpublic synthetic fun get (I)Ljava/lang/Object;\n\tpublic fun get (I)Lnet/mamoe/mirai/message/data/SingleMessage;\n\tpublic fun getSize ()I\n\tpublic final fun indexOf (Ljava/lang/Object;)I\n\tpublic fun indexOf (Lnet/mamoe/mirai/message/data/SingleMessage;)I\n\tpublic fun isEmpty ()Z\n\tpublic fun iterator ()Ljava/util/Iterator;\n\tpublic final fun lastIndexOf (Ljava/lang/Object;)I\n\tpublic fun lastIndexOf (Lnet/mamoe/mirai/message/data/SingleMessage;)I\n\tpublic fun listIterator ()Ljava/util/ListIterator;\n\tpublic fun listIterator (I)Ljava/util/ListIterator;\n\tpublic final synthetic fun plusAssign (Ljava/lang/CharSequence;)V\n\tpublic final synthetic fun plusAssign (Ljava/lang/String;)V\n\tpublic final synthetic fun plusAssign (Lnet/mamoe/mirai/message/data/Message;)V\n\tpublic final synthetic fun plusAssign (Lnet/mamoe/mirai/message/data/SingleMessage;)V\n\tpublic synthetic fun remove (I)Ljava/lang/Object;\n\tpublic final fun remove (I)Lnet/mamoe/mirai/message/data/SingleMessage;\n\tpublic final fun remove (Ljava/lang/Object;)Z\n\tpublic fun remove (Lnet/mamoe/mirai/message/data/SingleMessage;)Z\n\tpublic fun removeAll (Ljava/util/Collection;)Z\n\tpublic fun removeAt (I)Lnet/mamoe/mirai/message/data/SingleMessage;\n\tpublic fun retainAll (Ljava/util/Collection;)Z\n\tpublic synthetic fun set (ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun set (ILnet/mamoe/mirai/message/data/SingleMessage;)Lnet/mamoe/mirai/message/data/SingleMessage;\n\tpublic final fun size ()I\n\tpublic fun subList (II)Ljava/util/List;\n\tpublic fun toArray ()[Ljava/lang/Object;\n\tpublic fun toArray ([Ljava/lang/Object;)[Ljava/lang/Object;\n\tpublic final synthetic fun unaryPlus (Ljava/lang/String;)V\n\tpublic final synthetic fun unaryPlus (Lnet/mamoe/mirai/message/data/Message;)V\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/MessageContent : net/mamoe/mirai/message/data/SingleMessage {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/MessageContent$Key;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageContent$Key : net/mamoe/mirai/message/data/AbstractMessageKey {\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/MessageKey {\n\tpublic abstract fun getSafeCast ()Lkotlin/jvm/functions/Function1;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageKeyKt {\n\tpublic static final fun getTopmostKey (Lnet/mamoe/mirai/message/data/MessageKey;)Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic static final fun isInstance (Lnet/mamoe/mirai/message/data/MessageKey;Lnet/mamoe/mirai/message/data/SingleMessage;)Z\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/MessageMetadata : net/mamoe/mirai/message/data/SingleMessage {\n\tpublic fun contentToString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageOrigin$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/MessageOrigin$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/MessageOrigin;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/MessageOrigin;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageOrigin$Key : net/mamoe/mirai/message/data/AbstractMessageKey {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageOriginKind : java/lang/Enum {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/MessageOriginKind$Companion;\n\tpublic static final field FORWARD Lnet/mamoe/mirai/message/data/MessageOriginKind;\n\tpublic static final field LONG Lnet/mamoe/mirai/message/data/MessageOriginKind;\n\tpublic static final field MUSIC_SHARE Lnet/mamoe/mirai/message/data/MessageOriginKind;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MessageOriginKind;\n\tpublic static fun values ()[Lnet/mamoe/mirai/message/data/MessageOriginKind;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageOriginKind$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract class net/mamoe/mirai/message/data/MessageSource : net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/Message, net/mamoe/mirai/message/data/MessageMetadata {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/MessageSource$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic abstract fun getBotId ()J\n\tpublic abstract fun getFromId ()J\n\tpublic abstract fun getIds ()[I\n\tpublic abstract fun getInternalIds ()[I\n\tpublic final fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic abstract fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic abstract fun getOriginalMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic abstract fun getTargetId ()J\n\tpublic abstract fun getTime ()I\n\tpublic abstract fun isOriginalMessageInitialized ()Z\n\tpublic static final fun quote (Lnet/mamoe/mirai/message/data/MessageChain;)Lnet/mamoe/mirai/message/data/QuoteReply;\n\tpublic static final fun quote (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/message/data/QuoteReply;\n\tpublic static final fun recall (Lnet/mamoe/mirai/message/data/MessageChain;)V\n\tpublic static final fun recall (Lnet/mamoe/mirai/message/data/MessageChain;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final fun recall (Lnet/mamoe/mirai/message/data/MessageSource;)V\n\tpublic static final fun recall (Lnet/mamoe/mirai/message/data/MessageSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final fun recallIn (Lnet/mamoe/mirai/message/data/MessageChain;J)Lnet/mamoe/mirai/message/action/AsyncRecallResult;\n\tpublic static final fun recallIn (Lnet/mamoe/mirai/message/data/MessageSource;J)Lnet/mamoe/mirai/message/action/AsyncRecallResult;\n\tpublic abstract fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageSource$Key : net/mamoe/mirai/message/data/AbstractMessageKey {\n\tpublic final fun quote (Lnet/mamoe/mirai/message/data/MessageChain;)Lnet/mamoe/mirai/message/data/QuoteReply;\n\tpublic final fun quote (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/message/data/QuoteReply;\n\tpublic final fun recall (Lnet/mamoe/mirai/message/data/MessageChain;)V\n\tpublic final fun recall (Lnet/mamoe/mirai/message/data/MessageChain;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun recall (Lnet/mamoe/mirai/message/data/MessageSource;)V\n\tpublic final fun recall (Lnet/mamoe/mirai/message/data/MessageSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun recallIn (Lnet/mamoe/mirai/message/data/MessageChain;J)Lnet/mamoe/mirai/message/action/AsyncRecallResult;\n\tpublic final fun recallIn (Lnet/mamoe/mirai/message/data/MessageSource;J)Lnet/mamoe/mirai/message/action/AsyncRecallResult;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageSource$Serializer : kotlinx/serialization/KSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/MessageSource$Serializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/MessageSource;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/MessageSource;)V\n}\n\npublic final class net/mamoe/mirai/message/data/MessageSourceAmender : net/mamoe/mirai/message/data/MessageSourceBuilder {\n\tpublic fun <init> (Lnet/mamoe/mirai/message/data/MessageSource;)V\n\tpublic fun getFromId ()J\n\tpublic fun getIds ()[I\n\tpublic fun getInternalIds ()[I\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic final fun getOriginalMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getTargetId ()J\n\tpublic fun getTime ()I\n\tpublic fun setFromId (J)V\n\tpublic fun setIds ([I)V\n\tpublic fun setInternalIds ([I)V\n\tpublic final fun setKind (Lnet/mamoe/mirai/message/data/MessageSourceKind;)V\n\tpublic final fun setOriginalMessage (Lnet/mamoe/mirai/message/data/MessageChain;)V\n\tpublic fun setTargetId (J)V\n\tpublic fun setTime (I)V\n}\n\npublic class net/mamoe/mirai/message/data/MessageSourceBuilder {\n\tpublic fun <init> ()V\n\tpublic final fun allFrom (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun build (JLnet/mamoe/mirai/message/data/MessageSourceKind;)Lnet/mamoe/mirai/message/data/OfflineMessageSource;\n\tpublic final fun clearMessages ()Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic fun getFromId ()J\n\tpublic fun getIds ()[I\n\tpublic fun getInternalIds ()[I\n\tpublic fun getTargetId ()J\n\tpublic fun getTime ()I\n\tpublic final fun id (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun id ([I)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun internalId (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun internalId ([I)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun messages (Ljava/lang/Iterable;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final synthetic fun messages (Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun messages ([Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun messagesFrom (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun metadata (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun sender (J)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun sender (Lnet/mamoe/mirai/contact/ContactOrBot;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic fun setFromId (J)V\n\tpublic fun setIds ([I)V\n\tpublic fun setInternalIds ([I)V\n\tpublic final fun setSenderAndTarget (Lnet/mamoe/mirai/contact/ContactOrBot;Lnet/mamoe/mirai/contact/ContactOrBot;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic fun setTargetId (J)V\n\tpublic fun setTime (I)V\n\tpublic final fun target (J)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun target (Lnet/mamoe/mirai/contact/ContactOrBot;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun time (I)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun time (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageSourceKind : java/lang/Enum {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/MessageSourceKind$Companion;\n\tpublic static final field FRIEND Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic static final field GROUP Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic static final field STRANGER Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic static final field TEMP Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic static fun values ()[Lnet/mamoe/mirai/message/data/MessageSourceKind;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageSourceKind$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageUtils {\n\tpublic static final synthetic fun At (Lnet/mamoe/mirai/contact/UserOrBot;)Lnet/mamoe/mirai/message/data/At;\n\tpublic static final synthetic fun FileMessage (Ljava/lang/String;ILjava/lang/String;J)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static final synthetic fun Image (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static final synthetic fun Image (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static synthetic fun Image$default (Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static final synthetic fun OfflineAudio (Ljava/lang/String;[BJLnet/mamoe/mirai/message/data/AudioCodec;[B)Lnet/mamoe/mirai/message/data/OfflineAudio;\n\tpublic static final synthetic fun OfflineAudio (Lnet/mamoe/mirai/message/data/OnlineAudio;)Lnet/mamoe/mirai/message/data/OfflineAudio;\n\tpublic static final synthetic fun UnsupportedMessage ([B)Lnet/mamoe/mirai/message/data/UnsupportedMessage;\n\tpublic static final synthetic fun at (Lnet/mamoe/mirai/contact/Member;)Lnet/mamoe/mirai/message/data/At;\n\tpublic static final fun buildMessageChain (ILkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final fun buildMessageChain (Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final synthetic fun buildMessageSource (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/message/data/MessageSourceKind;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/OfflineMessageSource;\n\tpublic static final synthetic fun buildMessageSource (Lnet/mamoe/mirai/IMirai;JLnet/mamoe/mirai/message/data/MessageSourceKind;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/OfflineMessageSource;\n\tpublic static final synthetic fun calculateImageMd5 (Lnet/mamoe/mirai/message/data/Image;)[B\n\tpublic static final fun contentsList (Lnet/mamoe/mirai/message/data/MessageChain;)Ljava/util/List;\n\tpublic static final synthetic fun contentsSequence (Lnet/mamoe/mirai/message/data/MessageChain;)Lkotlin/sequences/Sequence;\n\tpublic static final fun copySource (Lnet/mamoe/mirai/message/data/MessageSource;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/OfflineMessageSource;\n\tpublic static final fun emptyMessageChain ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final synthetic fun getBot (Lnet/mamoe/mirai/message/data/MessageChain;)Lnet/mamoe/mirai/Bot;\n\tpublic static final fun getBot (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/Bot;\n\tpublic static final fun getBotOrNull (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/Bot;\n\tpublic static final synthetic fun getContent (Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/String;\n\tpublic static final synthetic fun getIds (Lnet/mamoe/mirai/message/data/MessageChain;)[I\n\tpublic static final synthetic fun getInternalId (Lnet/mamoe/mirai/message/data/MessageChain;)[I\n\tpublic static final synthetic fun getKind (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic static final synthetic fun getKind (Lnet/mamoe/mirai/message/data/OnlineMessageSource;)Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic static final synthetic fun getLengthDuration (Lnet/mamoe/mirai/message/data/OnlineAudio;)J\n\tpublic static final synthetic fun getOrFail (Lnet/mamoe/mirai/message/data/MessageChain;Lnet/mamoe/mirai/message/data/MessageKey;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/SingleMessage;\n\tpublic static synthetic fun getOrFail$default (Lnet/mamoe/mirai/message/data/MessageChain;Lnet/mamoe/mirai/message/data/MessageKey;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/SingleMessage;\n\tpublic static final synthetic fun getSource (Lnet/mamoe/mirai/message/data/MessageChain;)Lnet/mamoe/mirai/message/data/MessageSource;\n\tpublic static final synthetic fun getSourceOrNull (Lnet/mamoe/mirai/message/data/MessageChain;)Lnet/mamoe/mirai/message/data/MessageSource;\n\tpublic static final synthetic fun getTime (Lnet/mamoe/mirai/message/data/MessageChain;)I\n\tpublic static final fun isContentBlank (Lnet/mamoe/mirai/message/data/Message;)Z\n\tpublic static final fun isContentEmpty (Lnet/mamoe/mirai/message/data/Message;)Z\n\tpublic static final fun metadataList (Lnet/mamoe/mirai/message/data/MessageChain;)Ljava/util/List;\n\tpublic static final synthetic fun metadataSequence (Lnet/mamoe/mirai/message/data/MessageChain;)Lkotlin/sequences/Sequence;\n\tpublic static final fun newChain (Ljava/lang/Iterable;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final fun newChain (Ljava/util/Iterator;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final fun newChain (Ljava/util/stream/Stream;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final fun newChain (Lkotlin/sequences/Sequence;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final fun newChain (Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final fun newChain (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final fun newChain ([Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final synthetic fun plus (Lnet/mamoe/mirai/message/data/Message;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun recallSource (Lnet/mamoe/mirai/message/data/QuoteReply;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final fun repeat (Lnet/mamoe/mirai/message/data/Message;I)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final synthetic fun sendTo (Lnet/mamoe/mirai/message/data/Message;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun times (Lnet/mamoe/mirai/message/data/Message;I)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final synthetic fun toMessageChain ([Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final fun toOfflineMessageSource (Lnet/mamoe/mirai/message/data/OnlineMessageSource;)Lnet/mamoe/mirai/message/data/OfflineMessageSource;\n\tpublic static final synthetic fun toPlainText (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/PlainText;\n\tpublic static final synthetic fun toVoice (Lnet/mamoe/mirai/message/data/Audio;)Lnet/mamoe/mirai/message/data/Voice;\n}\n\npublic final class net/mamoe/mirai/message/data/MusicKind : java/lang/Enum {\n\tpublic static final field KugouMusic Lnet/mamoe/mirai/message/data/MusicKind;\n\tpublic static final field KuwoMusic Lnet/mamoe/mirai/message/data/MusicKind;\n\tpublic static final field MiguMusic Lnet/mamoe/mirai/message/data/MusicKind;\n\tpublic static final field NeteaseCloudMusic Lnet/mamoe/mirai/message/data/MusicKind;\n\tpublic static final field QQMusic Lnet/mamoe/mirai/message/data/MusicKind;\n\tpublic final fun getAppId ()J\n\tpublic final fun getPackageName ()Ljava/lang/String;\n\tpublic final fun getPlatform ()I\n\tpublic final fun getSdkVersion ()Ljava/lang/String;\n\tpublic final fun getSignature ()Ljava/lang/String;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MusicKind;\n\tpublic static fun values ()[Lnet/mamoe/mirai/message/data/MusicKind;\n}\n\npublic final class net/mamoe/mirai/message/data/MusicShare : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/MusicShare$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (ILnet/mamoe/mirai/message/data/MusicKind;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/message/data/MusicKind;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/message/data/MusicKind;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/message/data/MusicKind;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun component4 ()Ljava/lang/String;\n\tpublic final fun component5 ()Ljava/lang/String;\n\tpublic final fun component6 ()Ljava/lang/String;\n\tpublic final fun component7 ()Ljava/lang/String;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/message/data/MusicKind;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MusicShare;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/MusicShare;Lnet/mamoe/mirai/message/data/MusicKind;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/MusicShare;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBrief ()Ljava/lang/String;\n\tpublic final fun getJumpUrl ()Ljava/lang/String;\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/MusicKind;\n\tpublic final fun getMusicUrl ()Ljava/lang/String;\n\tpublic final fun getPictureUrl ()Ljava/lang/String;\n\tpublic final fun getSummary ()Ljava/lang/String;\n\tpublic final fun getTitle ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/MusicShare;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/MusicShare$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/MusicShare$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/MusicShare;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/MusicShare;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/MusicShare$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/OfflineAudio : net/mamoe/mirai/message/data/Audio {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OfflineAudio$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/OfflineAudio$Factory {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/OfflineAudio$Factory$INSTANCE;\n\tpublic abstract fun create (Ljava/lang/String;[BJLnet/mamoe/mirai/message/data/AudioCodec;[B)Lnet/mamoe/mirai/message/data/OfflineAudio;\n\tpublic fun from (Lnet/mamoe/mirai/message/data/OnlineAudio;)Lnet/mamoe/mirai/message/data/OfflineAudio;\n}\n\npublic final class net/mamoe/mirai/message/data/OfflineAudio$Factory$INSTANCE : net/mamoe/mirai/message/data/OfflineAudio$Factory {\n\tpublic fun create (Ljava/lang/String;[BJLnet/mamoe/mirai/message/data/AudioCodec;[B)Lnet/mamoe/mirai/message/data/OfflineAudio;\n\tpublic fun from (Lnet/mamoe/mirai/message/data/OnlineAudio;)Lnet/mamoe/mirai/message/data/OfflineAudio;\n}\n\npublic final class net/mamoe/mirai/message/data/OfflineAudio$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/message/data/OfflineMessageSource : net/mamoe/mirai/message/data/MessageSource {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OfflineMessageSource$Key;\n\tpublic fun <init> ()V\n\tpublic abstract fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic final fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OfflineMessageSource$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/OfflineShortVideo : net/mamoe/mirai/message/data/ShortVideo {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OfflineShortVideo$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OfflineShortVideo$Builder {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/OfflineShortVideo$Builder$Companion;\n\tpublic final fun build ()Lnet/mamoe/mirai/message/data/OfflineShortVideo;\n\tpublic final fun getFileFormat ()Ljava/lang/String;\n\tpublic final fun getFileMd5 ()[B\n\tpublic final fun getFileName ()Ljava/lang/String;\n\tpublic final fun getFileSize ()J\n\tpublic final fun getThumbnailMd5 ()[B\n\tpublic final fun getThumbnailSize ()J\n\tpublic final fun getVideoId ()Ljava/lang/String;\n\tpublic static final fun newBuilder (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[BJ)Lnet/mamoe/mirai/message/data/OfflineShortVideo$Builder;\n\tpublic final fun setFileFormat (Ljava/lang/String;)V\n\tpublic final fun setFileMd5 ([B)V\n\tpublic final fun setFileName (Ljava/lang/String;)V\n\tpublic final fun setFileSize (J)V\n\tpublic final fun setThumbnailMd5 ([B)V\n\tpublic final fun setThumbnailSize (J)V\n\tpublic final fun setVideoId (Ljava/lang/String;)V\n}\n\npublic final class net/mamoe/mirai/message/data/OfflineShortVideo$Builder$Companion {\n\tpublic final fun newBuilder (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[BJ)Lnet/mamoe/mirai/message/data/OfflineShortVideo$Builder;\n}\n\npublic final class net/mamoe/mirai/message/data/OfflineShortVideo$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/OnlineAudio : net/mamoe/mirai/message/data/Audio {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineAudio$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic abstract fun getLength ()J\n\tpublic abstract fun getUrlForDownload ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineAudio$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource : net/mamoe/mirai/message/data/MessageSource {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Key;\n\tpublic abstract fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getBotId ()J\n\tpublic abstract fun getSender ()Lnet/mamoe/mirai/contact/ContactOrBot;\n\tpublic abstract fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot;\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming : net/mamoe/mirai/message/data/OnlineMessageSource {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$Key;\n\tpublic fun getFromId ()J\n\tpublic abstract fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getTargetId ()J\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromFriend : net/mamoe/mirai/message/data/OnlineMessageSource$Incoming {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromFriend$Key;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic abstract fun getSender ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic abstract fun getSubject ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final synthetic fun getTarget ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot;\n\tpublic final fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromFriend$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromGroup : net/mamoe/mirai/message/data/OnlineMessageSource$Incoming {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromGroup$Key;\n\tpublic final fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic abstract fun getSender ()Lnet/mamoe/mirai/contact/Member;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/Group;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot;\n\tpublic final fun getTarget ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromGroup$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromStranger : net/mamoe/mirai/message/data/OnlineMessageSource$Incoming {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromStranger$Key;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic abstract fun getSender ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic abstract fun getSubject ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic final synthetic fun getTarget ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot;\n\tpublic final fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromStranger$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromTemp : net/mamoe/mirai/message/data/OnlineMessageSource$Incoming {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromTemp$Key;\n\tpublic final fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic abstract fun getSender ()Lnet/mamoe/mirai/contact/Member;\n\tpublic abstract fun getSubject ()Lnet/mamoe/mirai/contact/Member;\n\tpublic final synthetic fun getTarget ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot;\n\tpublic final fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromTemp$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Key : net/mamoe/mirai/message/data/AbstractMessageKey {\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing : net/mamoe/mirai/message/data/OnlineMessageSource {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$Key;\n\tpublic final fun getFromId ()J\n\tpublic abstract fun getSender ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun getTargetId ()J\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToFriend : net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToFriend$Key;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun getSubject ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToFriend$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToGroup : net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToGroup$Key;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun getSubject ()Lnet/mamoe/mirai/contact/Group;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToGroup$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToStranger : net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToStranger$Key;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun getSubject ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic final fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToStranger$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToTemp : net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToTemp$Key;\n\tpublic final fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun getSubject ()Lnet/mamoe/mirai/contact/Member;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/Member;\n\tpublic final fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToTemp$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/OnlineShortVideo : net/mamoe/mirai/message/data/ShortVideo {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineShortVideo$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic abstract fun getUrlForDownload ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineShortVideo$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OrNullDelegate {\n\tpublic static final synthetic fun box-impl (Ljava/lang/Object;)Lnet/mamoe/mirai/message/data/OrNullDelegate;\n\tpublic static fun constructor-impl (Ljava/lang/Object;)Ljava/lang/Object;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic static fun equals-impl (Ljava/lang/Object;Ljava/lang/Object;)Z\n\tpublic static final fun equals-impl0 (Ljava/lang/Object;Ljava/lang/Object;)Z\n\tpublic static final fun getValue-impl (Ljava/lang/Object;Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object;\n\tpublic fun hashCode ()I\n\tpublic static fun hashCode-impl (Ljava/lang/Object;)I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static fun toString-impl (Ljava/lang/Object;)Ljava/lang/String;\n\tpublic final synthetic fun unbox-impl ()Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/message/data/PlainText : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/PlainText$Companion;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (ILjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> (Ljava/lang/CharSequence;)V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic final fun copy (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/PlainText;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/PlainText;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/PlainText;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getContent ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/PlainText;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/PlainText$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/PlainText$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/PlainText;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/PlainText;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/PlainText$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/PokeMessage : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/HummerMessage {\n\tpublic static final field BaoBeiQiu Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field BiXin Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field ChuoYiChuo Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field DianZan Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field FangDaZhao Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field GouYin Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field JieYin Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/PokeMessage$Key;\n\tpublic static final field LiuLiuLiu Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field QiaoMen Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field RangNiPi Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field Rose Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic static final field ShouLei Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field SuiPing Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field XinSui Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field ZhaoHuanShu Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field ZhuaYiXia Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field values [Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic synthetic fun <init> (ILjava/lang/String;IILkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun component2 ()I\n\tpublic final fun component3 ()I\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic final fun copy (Ljava/lang/String;II)Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/PokeMessage;Ljava/lang/String;IIILjava/lang/Object;)Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getId ()I\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic final fun getName ()Ljava/lang/String;\n\tpublic final fun getPokeType ()I\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/PokeMessage;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/PokeMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/PokeMessage$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/PokeMessage;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/PokeMessage$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/PttMessage$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/QuoteReply : net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/Message, net/mamoe/mirai/message/data/MessageMetadata {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/QuoteReply$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (ILnet/mamoe/mirai/message/data/MessageSource;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/message/data/MessageChain;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/message/data/MessageSource;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/message/data/MessageSource;\n\tpublic final fun copy (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/message/data/QuoteReply;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/QuoteReply;Lnet/mamoe/mirai/message/data/MessageSource;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/QuoteReply;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic final fun getSource ()Lnet/mamoe/mirai/message/data/MessageSource;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/QuoteReply;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/QuoteReply$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/QuoteReply$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/QuoteReply;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/QuoteReply;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/QuoteReply$Key : net/mamoe/mirai/message/data/AbstractMessageKey {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/RawForwardMessage {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/RawForwardMessage$Companion;\n\tpublic synthetic fun <init> (ILjava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> (Ljava/util/List;)V\n\tpublic final fun component1 ()Ljava/util/List;\n\tpublic final fun copy (Ljava/util/List;)Lnet/mamoe/mirai/message/data/RawForwardMessage;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/RawForwardMessage;Ljava/util/List;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/RawForwardMessage;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getNodeList ()Ljava/util/List;\n\tpublic fun hashCode ()I\n\tpublic final fun render (Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/RawForwardMessage;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/RawForwardMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/RawForwardMessage$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/RawForwardMessage;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/RawForwardMessage;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/RawForwardMessage$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/RichMessage : net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/RichMessage$Key;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic abstract fun getContent ()Ljava/lang/String;\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n}\n\npublic final class net/mamoe/mirai/message/data/RichMessageKind : java/lang/Enum {\n\tpublic static final field FORWARD Lnet/mamoe/mirai/message/data/RichMessageKind;\n\tpublic static final field LONG Lnet/mamoe/mirai/message/data/RichMessageKind;\n\tpublic static final field MUSIC_SHARE Lnet/mamoe/mirai/message/data/RichMessageKind;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/RichMessageKind;\n\tpublic static fun values ()[Lnet/mamoe/mirai/message/data/RichMessageKind;\n}\n\npublic final class net/mamoe/mirai/message/data/RichMessageOrigin : net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageMetadata {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/RichMessageOrigin$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (ILnet/mamoe/mirai/message/data/RichMessage;Ljava/lang/String;Lnet/mamoe/mirai/message/data/RichMessageKind;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/message/data/RichMessage;Ljava/lang/String;Lnet/mamoe/mirai/message/data/RichMessageKind;)V\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/RichMessageOrigin$Key;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/RichMessageKind;\n\tpublic final fun getOrigin ()Lnet/mamoe/mirai/message/data/RichMessage;\n\tpublic final fun getResourceId ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/RichMessageOrigin;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/RichMessageOrigin$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/RichMessageOrigin$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/RichMessageOrigin;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/RichMessageOrigin;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/RichMessageOrigin$Key : net/mamoe/mirai/message/data/AbstractMessageKey {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/RockPaperScissors : java/lang/Enum, net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/MarketFace {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/RockPaperScissors$Key;\n\tpublic static final field PAPER Lnet/mamoe/mirai/message/data/RockPaperScissors;\n\tpublic static final field ROCK Lnet/mamoe/mirai/message/data/RockPaperScissors;\n\tpublic static final field SCISSORS Lnet/mamoe/mirai/message/data/RockPaperScissors;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic final fun eliminates (Lnet/mamoe/mirai/message/data/RockPaperScissors;)Ljava/lang/Boolean;\n\tpublic final fun getContent ()Ljava/lang/String;\n\tpublic fun getId ()I\n\tpublic final fun getInternalId ()B\n\tpublic synthetic fun getName ()Ljava/lang/String;\n\tpublic static final fun random ()Lnet/mamoe/mirai/message/data/RockPaperScissors;\n\tpublic static final fun random (Lkotlin/random/Random;)Lnet/mamoe/mirai/message/data/RockPaperScissors;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/RockPaperScissors;\n\tpublic static fun values ()[Lnet/mamoe/mirai/message/data/RockPaperScissors;\n}\n\npublic final class net/mamoe/mirai/message/data/RockPaperScissors$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic final fun random ()Lnet/mamoe/mirai/message/data/RockPaperScissors;\n\tpublic final fun random (Lkotlin/random/Random;)Lnet/mamoe/mirai/message/data/RockPaperScissors;\n\tpublic static synthetic fun random$default (Lnet/mamoe/mirai/message/data/RockPaperScissors$Key;Lkotlin/random/Random;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/RockPaperScissors;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/ServiceMessage : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/RichMessage {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/ServiceMessage$Key;\n\tpublic abstract fun getServiceId ()I\n}\n\npublic final class net/mamoe/mirai/message/data/ServiceMessage$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/ShortVideo : net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/ShortVideo$Key;\n\tpublic abstract fun getFileFormat ()Ljava/lang/String;\n\tpublic abstract fun getFileMd5 ()[B\n\tpublic abstract fun getFileSize ()J\n\tpublic abstract fun getFilename ()Ljava/lang/String;\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic abstract fun getVideoId ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/ShortVideo$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic final class net/mamoe/mirai/message/data/ShortVideoKt {\n\tpublic static final synthetic fun OfflineShortVideo (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[BJ[BJ)Lnet/mamoe/mirai/message/data/OfflineShortVideo;\n\tpublic static synthetic fun OfflineShortVideo$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[BJ[BJILjava/lang/Object;)Lnet/mamoe/mirai/message/data/OfflineShortVideo;\n}\n\npublic final class net/mamoe/mirai/message/data/ShowImageFlag : net/mamoe/mirai/message/data/AbstractMessageKey, net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageMetadata {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/ShowImageFlag;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/ShowImageFlag;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/SimpleServiceMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/SimpleServiceMessage$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/SimpleServiceMessage;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/SimpleServiceMessage;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/SimpleServiceMessage$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/SingleMessage : net/mamoe/mirai/message/data/Message {\n}\n\npublic final class net/mamoe/mirai/message/data/SingleMessage$Serializer : kotlinx/serialization/KSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/SingleMessage$Serializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/SingleMessage;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/SingleMessage;)V\n}\n\npublic final class net/mamoe/mirai/message/data/SuperFace : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/HummerMessage {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/SuperFace$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (IILjava/lang/String;ILkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic static final fun from (Lnet/mamoe/mirai/message/data/Face;)Lnet/mamoe/mirai/message/data/SuperFace;\n\tpublic static final fun fromOrNull (Lnet/mamoe/mirai/message/data/Face;)Lnet/mamoe/mirai/message/data/SuperFace;\n\tpublic final fun getFace ()I\n\tpublic final fun getId ()Ljava/lang/String;\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic final fun getName ()Ljava/lang/String;\n\tpublic final fun getType ()I\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/SuperFace;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/SuperFace$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/SuperFace$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/SuperFace;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/SuperFace;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/SuperFace$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic final fun from (Lnet/mamoe/mirai/message/data/Face;)Lnet/mamoe/mirai/message/data/SuperFace;\n\tpublic final fun fromOrNull (Lnet/mamoe/mirai/message/data/Face;)Lnet/mamoe/mirai/message/data/SuperFace;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/SuperFaceKt {\n\tpublic static final synthetic fun toFace (Lnet/mamoe/mirai/message/data/SuperFace;)Lnet/mamoe/mirai/message/data/Face;\n\tpublic static final synthetic fun toSuperFace (Lnet/mamoe/mirai/message/data/Face;)Lnet/mamoe/mirai/message/data/SuperFace;\n\tpublic static final synthetic fun toSuperFaceOrNull (Lnet/mamoe/mirai/message/data/Face;)Lnet/mamoe/mirai/message/data/SuperFace;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/UnsupportedMessage : net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/UnsupportedMessage$Companion;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic static fun create ([B)Lnet/mamoe/mirai/message/data/UnsupportedMessage;\n\tpublic abstract fun getStruct ()[B\n}\n\npublic final class net/mamoe/mirai/message/data/UnsupportedMessage$Companion {\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic final fun create ([B)Lnet/mamoe/mirai/message/data/UnsupportedMessage;\n}\n\npublic final class net/mamoe/mirai/message/data/UnsupportedMessage$Serializer : kotlinx/serialization/KSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/UnsupportedMessage$Serializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/UnsupportedMessage;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/UnsupportedMessage;)V\n}\n\npublic final class net/mamoe/mirai/message/data/VipFace : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/HummerMessage {\n\tpublic static final field AiXin Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field BianBian Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field ChaoPiao Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field DianZan Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field HaHa Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/VipFace$Key;\n\tpublic static final field LiuLian Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field LueLueLue Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field PingDiGuo Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field QinQin Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic static final field YaoWan Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field ZhaDan Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field ZhuTou Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field values [Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic synthetic fun <init> (ILnet/mamoe/mirai/message/data/VipFace$Kind;ILkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic final fun component2 ()I\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/message/data/VipFace$Kind;I)Lnet/mamoe/mirai/message/data/VipFace;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/VipFace;Lnet/mamoe/mirai/message/data/VipFace$Kind;IILjava/lang/Object;)Lnet/mamoe/mirai/message/data/VipFace;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getCount ()I\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/VipFace;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/VipFace$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/VipFace$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/VipFace;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/VipFace;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/VipFace$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/VipFace$Kind {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/VipFace$Kind$Companion;\n\tpublic synthetic fun <init> (IILjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> (ILjava/lang/String;)V\n\tpublic final fun component1 ()I\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun copy (ILjava/lang/String;)Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/VipFace$Kind;ILjava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getId ()I\n\tpublic final fun getName ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/VipFace$Kind;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/VipFace$Kind$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/VipFace$Kind$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/VipFace$Kind;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/VipFace$Kind$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic class net/mamoe/mirai/message/data/Voice : net/mamoe/mirai/message/data/PttMessage {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/Voice$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (ILjava/lang/String;[BJILjava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;[BJILjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic static final fun fromAudio (Lnet/mamoe/mirai/message/data/Audio;)Lnet/mamoe/mirai/message/data/Voice;\n\tpublic fun getFileName ()Ljava/lang/String;\n\tpublic fun getFileSize ()J\n\tpublic fun getMd5 ()[B\n\tpublic fun getUrl ()Ljava/lang/String;\n\tpublic final fun get_codec ()I\n\tpublic final fun toAudio ()Lnet/mamoe/mirai/message/data/Audio;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/Voice;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/Voice$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/Voice$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/Voice;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/Voice;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/Voice$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic final fun fromAudio (Lnet/mamoe/mirai/message/data/Audio;)Lnet/mamoe/mirai/message/data/Voice;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/XmlMessageBuilder$ItemBuilder {\n\tpublic fun <init> ()V\n\tpublic fun <init> (II)V\n\tpublic final fun getBg ()I\n\tpublic final fun getLayout ()I\n\tpublic final fun getText ()Ljava/lang/String;\n\tpublic final fun picture (Ljava/lang/String;)V\n\tpublic final fun setBg (I)V\n\tpublic final fun setLayout (I)V\n\tpublic final fun summary (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic static synthetic fun summary$default (Lnet/mamoe/mirai/message/data/XmlMessageBuilder$ItemBuilder;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)V\n\tpublic final fun title (Ljava/lang/String;ILjava/lang/String;)V\n\tpublic static synthetic fun title$default (Lnet/mamoe/mirai/message/data/XmlMessageBuilder$ItemBuilder;Ljava/lang/String;ILjava/lang/String;ILjava/lang/Object;)V\n}\n\npublic final class net/mamoe/mirai/message/data/visitor/MessageVisitorKt {\n}\n\npublic final class net/mamoe/mirai/network/BotAuthorizationException : net/mamoe/mirai/network/LoginFailedException {\n\tpublic final fun getAuthorization ()Lnet/mamoe/mirai/auth/BotAuthorization;\n}\n\npublic abstract class net/mamoe/mirai/network/CustomLoginFailedException : net/mamoe/mirai/network/LoginFailedException {\n\tpublic fun <init> (Z)V\n\tpublic fun <init> (ZLjava/lang/String;)V\n\tpublic fun <init> (ZLjava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun <init> (ZLjava/lang/Throwable;)V\n}\n\npublic final class net/mamoe/mirai/network/ForceOfflineException : java/util/concurrent/CancellationException {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getCause ()Ljava/lang/Throwable;\n\tpublic fun getMessage ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/network/InconsistentBotIdException : net/mamoe/mirai/network/LoginFailedException {\n\tpublic synthetic fun <init> (JJLjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun getActual ()J\n\tpublic final fun getExpected ()J\n}\n\npublic abstract class net/mamoe/mirai/network/LoginFailedException : java/lang/RuntimeException {\n\tpublic synthetic fun <init> (ZLjava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic synthetic fun <init> (ZLjava/lang/String;Ljava/lang/Throwable;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun getKillBot ()Z\n}\n\npublic final class net/mamoe/mirai/network/NoServerAvailableException : net/mamoe/mirai/network/LoginFailedException {\n\tpublic fun getCause ()Ljava/lang/Throwable;\n}\n\npublic final class net/mamoe/mirai/network/NoStandardInputForCaptchaException : net/mamoe/mirai/network/LoginFailedException {\n\tpublic synthetic fun <init> (Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getCause ()Ljava/lang/Throwable;\n}\n\npublic final class net/mamoe/mirai/network/RetryLaterException : net/mamoe/mirai/network/LoginFailedException {\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V\n}\n\npublic class net/mamoe/mirai/network/UnsupportedCaptchaMethodException : net/mamoe/mirai/network/LoginFailedException {\n\tpublic fun <init> (Z)V\n\tpublic fun <init> (ZLjava/lang/String;)V\n\tpublic fun <init> (ZLjava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun <init> (ZLjava/lang/Throwable;)V\n}\n\npublic final class net/mamoe/mirai/network/UnsupportedQRCodeCaptchaException : net/mamoe/mirai/network/UnsupportedCaptchaMethodException {\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic final class net/mamoe/mirai/network/UnsupportedSliderCaptchaException : net/mamoe/mirai/network/UnsupportedCaptchaMethodException {\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic final class net/mamoe/mirai/network/UnsupportedSmsLoginException : net/mamoe/mirai/network/UnsupportedCaptchaMethodException {\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic final class net/mamoe/mirai/network/WrongPasswordException : net/mamoe/mirai/network/LoginFailedException {\n}\n\npublic abstract interface class net/mamoe/mirai/spi/AudioToSilkService : net/mamoe/mirai/spi/BaseService {\n\tpublic static final field Companion Lnet/mamoe/mirai/spi/AudioToSilkService$Companion;\n\tpublic abstract fun convert (Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun getInstance ()Lnet/mamoe/mirai/spi/AudioToSilkService;\n}\n\npublic final class net/mamoe/mirai/spi/AudioToSilkService$Companion {\n\tpublic final fun getInstance ()Lnet/mamoe/mirai/spi/AudioToSilkService;\n}\n\npublic abstract interface class net/mamoe/mirai/spi/BaseService {\n\tpublic fun getPriority ()I\n}\n\npublic abstract class net/mamoe/mirai/utils/AbstractBotConfiguration {\n\tpublic fun <init> ()V\n\tpublic final fun fileBasedDeviceInfo ()V\n\tpublic final fun fileBasedDeviceInfo (Ljava/lang/String;)V\n\tpublic static synthetic fun fileBasedDeviceInfo$default (Lnet/mamoe/mirai/utils/AbstractBotConfiguration;Ljava/lang/String;ILjava/lang/Object;)V\n\tprotected abstract fun getBotLoggerSupplier ()Lkotlin/jvm/functions/Function1;\n\tpublic final fun getCacheDir ()Ljava/io/File;\n\tprotected abstract fun getDeviceInfo ()Lkotlin/jvm/functions/Function1;\n\tprotected abstract fun getNetworkLoggerSupplier ()Lkotlin/jvm/functions/Function1;\n\tpublic final fun getWorkingDir ()Ljava/io/File;\n\tpublic final fun redirectBotLogToDirectory ()V\n\tpublic final fun redirectBotLogToDirectory (Ljava/io/File;)V\n\tpublic final fun redirectBotLogToDirectory (Ljava/io/File;J)V\n\tpublic final fun redirectBotLogToDirectory (Ljava/io/File;JLkotlin/jvm/functions/Function1;)V\n\tpublic static synthetic fun redirectBotLogToDirectory$default (Lnet/mamoe/mirai/utils/AbstractBotConfiguration;Ljava/io/File;JLkotlin/jvm/functions/Function1;ILjava/lang/Object;)V\n\tpublic final fun redirectBotLogToFile ()V\n\tpublic final fun redirectBotLogToFile (Ljava/io/File;)V\n\tpublic final fun redirectBotLogToFile (Ljava/io/File;Lkotlin/jvm/functions/Function1;)V\n\tpublic static synthetic fun redirectBotLogToFile$default (Lnet/mamoe/mirai/utils/AbstractBotConfiguration;Ljava/io/File;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V\n\tpublic final fun redirectNetworkLogToDirectory ()V\n\tpublic final fun redirectNetworkLogToDirectory (Ljava/io/File;)V\n\tpublic final fun redirectNetworkLogToDirectory (Ljava/io/File;J)V\n\tpublic final fun redirectNetworkLogToDirectory (Ljava/io/File;JLkotlin/jvm/functions/Function1;)V\n\tpublic static synthetic fun redirectNetworkLogToDirectory$default (Lnet/mamoe/mirai/utils/AbstractBotConfiguration;Ljava/io/File;JLkotlin/jvm/functions/Function1;ILjava/lang/Object;)V\n\tpublic final fun redirectNetworkLogToFile ()V\n\tpublic final fun redirectNetworkLogToFile (Ljava/io/File;)V\n\tpublic final fun redirectNetworkLogToFile (Ljava/io/File;Lkotlin/jvm/functions/Function1;)V\n\tpublic static synthetic fun redirectNetworkLogToFile$default (Lnet/mamoe/mirai/utils/AbstractBotConfiguration;Ljava/io/File;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V\n\tprotected abstract fun setBotLoggerSupplier (Lkotlin/jvm/functions/Function1;)V\n\tpublic final fun setCacheDir (Ljava/io/File;)V\n\tprotected abstract fun setDeviceInfo (Lkotlin/jvm/functions/Function1;)V\n\tprotected abstract fun setNetworkLoggerSupplier (Lkotlin/jvm/functions/Function1;)V\n\tpublic final fun setWorkingDir (Ljava/io/File;)V\n}\n\npublic abstract class net/mamoe/mirai/utils/AbstractExternalResource : net/mamoe/mirai/utils/ExternalResource {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Lnet/mamoe/mirai/utils/AbstractExternalResource$ResourceCleanCallback;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Lnet/mamoe/mirai/utils/AbstractExternalResource$ResourceCleanCallback;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/utils/AbstractExternalResource$ResourceCleanCallback;)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/utils/AbstractExternalResource$ResourceCleanCallback;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun close ()V\n\tprotected final fun dontRegisterLeakObserver ()V\n\tpublic final fun getClosed ()Lkotlinx/coroutines/Deferred;\n\tpublic fun getFormatName ()Ljava/lang/String;\n\tpublic fun getMd5 ()[B\n\tpublic fun getSha1 ()[B\n\tpublic final fun inputStream ()Ljava/io/InputStream;\n\tprotected abstract fun inputStream0 ()Ljava/io/InputStream;\n\tprotected final fun registerToLeakObserver ()V\n\tprotected final fun setResourceCleanCallback (Lnet/mamoe/mirai/utils/AbstractExternalResource$ResourceCleanCallback;)V\n}\n\npublic abstract interface class net/mamoe/mirai/utils/AbstractExternalResource$ResourceCleanCallback {\n\tpublic abstract fun cleanup ()V\n}\n\npublic class net/mamoe/mirai/utils/BotConfiguration : net/mamoe/mirai/utils/AbstractBotConfiguration {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/BotConfiguration$Companion;\n\tpublic fun <init> ()V\n\tpublic final fun autoReconnectOnForceOffline ()V\n\tpublic final synthetic fun contactListCache (Lkotlin/jvm/functions/Function1;)V\n\tpublic final fun copy ()Lnet/mamoe/mirai/utils/BotConfiguration;\n\tpublic final fun disableAccountSecretes ()V\n\tpublic final fun disableContactCache ()V\n\tpublic final fun enableContactCache ()V\n\tpublic final fun getAutoReconnectOnForceOffline ()Z\n\tpublic final fun getBotLoggerSupplier ()Lkotlin/jvm/functions/Function1;\n\tpublic final fun getContactListCache ()Lnet/mamoe/mirai/utils/BotConfiguration$ContactListCache;\n\tpublic static final fun getDefault ()Lnet/mamoe/mirai/utils/BotConfiguration;\n\tpublic final fun getDeviceInfo ()Lkotlin/jvm/functions/Function1;\n\tpublic final synthetic fun getFirstReconnectDelayMillis ()J\n\tpublic final fun getHeartbeatPeriodMillis ()J\n\tpublic final fun getHeartbeatStrategy ()Lnet/mamoe/mirai/utils/BotConfiguration$HeartbeatStrategy;\n\tpublic final fun getHeartbeatTimeoutMillis ()J\n\tpublic final fun getHighwayUploadCoroutineCount ()I\n\tpublic final fun getLoginCacheEnabled ()Z\n\tpublic final fun getLoginSolver ()Lnet/mamoe/mirai/utils/LoginSolver;\n\tpublic final fun getNetworkLoggerSupplier ()Lkotlin/jvm/functions/Function1;\n\tpublic final fun getParentCoroutineContext ()Lkotlin/coroutines/CoroutineContext;\n\tpublic final fun getProtocol ()Lnet/mamoe/mirai/utils/BotConfiguration$MiraiProtocol;\n\tpublic final synthetic fun getReconnectPeriodMillis ()J\n\tpublic final fun getReconnectionRetryTimes ()I\n\tpublic final fun getStatHeartbeatPeriodMillis ()J\n\tpublic final synthetic fun inheritCoroutineContext (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun isConvertLineSeparator ()Z\n\tpublic final fun isShowingVerboseEventLog ()Z\n\tpublic final fun loadDeviceInfoJson (Ljava/lang/String;)V\n\tpublic final fun noBotLog ()V\n\tpublic final fun noNetworkLog ()V\n\tpublic final fun randomDeviceInfo ()V\n\tpublic final fun setAutoReconnectOnForceOffline (Z)V\n\tpublic final fun setBotLoggerSupplier (Lkotlin/jvm/functions/Function1;)V\n\tpublic final fun setContactListCache (Lnet/mamoe/mirai/utils/BotConfiguration$ContactListCache;)V\n\tpublic final fun setConvertLineSeparator (Z)V\n\tpublic final fun setDeviceInfo (Lkotlin/jvm/functions/Function1;)V\n\tpublic final synthetic fun setFirstReconnectDelayMillis (J)V\n\tpublic final fun setHeartbeatPeriodMillis (J)V\n\tpublic final fun setHeartbeatStrategy (Lnet/mamoe/mirai/utils/BotConfiguration$HeartbeatStrategy;)V\n\tpublic final fun setHeartbeatTimeoutMillis (J)V\n\tpublic final fun setHighwayUploadCoroutineCount (I)V\n\tpublic final fun setLoginCacheEnabled (Z)V\n\tpublic final fun setLoginSolver (Lnet/mamoe/mirai/utils/LoginSolver;)V\n\tpublic final fun setNetworkLoggerSupplier (Lkotlin/jvm/functions/Function1;)V\n\tpublic final fun setParentCoroutineContext (Lkotlin/coroutines/CoroutineContext;)V\n\tpublic final fun setProtocol (Lnet/mamoe/mirai/utils/BotConfiguration$MiraiProtocol;)V\n\tpublic final synthetic fun setReconnectPeriodMillis (J)V\n\tpublic final fun setReconnectionRetryTimes (I)V\n\tpublic final fun setShowingVerboseEventLog (Z)V\n\tpublic final fun setStatHeartbeatPeriodMillis (J)V\n}\n\npublic final class net/mamoe/mirai/utils/BotConfiguration$Companion {\n\tpublic final fun getDefault ()Lnet/mamoe/mirai/utils/BotConfiguration;\n}\n\npublic abstract interface annotation class net/mamoe/mirai/utils/BotConfiguration$ConfigurationDsl : java/lang/annotation/Annotation {\n}\n\npublic final class net/mamoe/mirai/utils/BotConfiguration$ContactListCache {\n\tpublic fun <init> ()V\n\tpublic final fun getFriendListCacheEnabled ()Z\n\tpublic final fun getGroupMemberListCacheEnabled ()Z\n\tpublic final synthetic fun getSaveInterval-UwyO8pc ()J\n\tpublic final fun getSaveIntervalMillis ()J\n\tpublic final fun setFriendListCacheEnabled (Z)V\n\tpublic final fun setGroupMemberListCacheEnabled (Z)V\n\tpublic final synthetic fun setSaveInterval-LRDsOJo (J)V\n\tpublic final fun setSaveIntervalMillis (J)V\n}\n\npublic final class net/mamoe/mirai/utils/BotConfiguration$HeartbeatStrategy : java/lang/Enum {\n\tpublic static final field NONE Lnet/mamoe/mirai/utils/BotConfiguration$HeartbeatStrategy;\n\tpublic static final field REGISTER Lnet/mamoe/mirai/utils/BotConfiguration$HeartbeatStrategy;\n\tpublic static final field STAT_HB Lnet/mamoe/mirai/utils/BotConfiguration$HeartbeatStrategy;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/utils/BotConfiguration$HeartbeatStrategy;\n\tpublic static fun values ()[Lnet/mamoe/mirai/utils/BotConfiguration$HeartbeatStrategy;\n}\n\npublic final class net/mamoe/mirai/utils/BotConfiguration$MiraiProtocol : java/lang/Enum {\n\tpublic static final field ANDROID_PAD Lnet/mamoe/mirai/utils/BotConfiguration$MiraiProtocol;\n\tpublic static final field ANDROID_PHONE Lnet/mamoe/mirai/utils/BotConfiguration$MiraiProtocol;\n\tpublic static final field ANDROID_WATCH Lnet/mamoe/mirai/utils/BotConfiguration$MiraiProtocol;\n\tpublic static final field IPAD Lnet/mamoe/mirai/utils/BotConfiguration$MiraiProtocol;\n\tpublic static final field MACOS Lnet/mamoe/mirai/utils/BotConfiguration$MiraiProtocol;\n\tpublic final fun isNudgeSupported ()Z\n\tpublic final fun isQRLoginSupported ()Z\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/utils/BotConfiguration$MiraiProtocol;\n\tpublic static fun values ()[Lnet/mamoe/mirai/utils/BotConfiguration$MiraiProtocol;\n}\n\npublic final class net/mamoe/mirai/utils/DeviceInfo {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/DeviceInfo$Companion;\n\tpublic fun <init> ([B[B[B[B[B[B[B[B[B[B[BLnet/mamoe/mirai/utils/DeviceInfo$Version;[B[B[B[B[B[BLjava/lang/String;[B)V\n\tpublic fun <init> ([B[B[B[B[B[B[B[B[B[B[BLnet/mamoe/mirai/utils/DeviceInfo$Version;[B[B[B[B[B[BLjava/lang/String;[B[B)V\n\tpublic static final fun deserializeFromString (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic static final fun from (Ljava/io/File;)Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic static final fun from (Ljava/io/File;Lkotlinx/serialization/json/Json;)Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic final fun getAndroidId ()[B\n\tpublic final fun getApn ()[B\n\tpublic final fun getBaseBand ()[B\n\tpublic final fun getBoard ()[B\n\tpublic final fun getBootId ()[B\n\tpublic final fun getBootloader ()[B\n\tpublic final fun getBrand ()[B\n\tpublic final fun getDevice ()[B\n\tpublic final fun getDisplay ()[B\n\tpublic final fun getFingerprint ()[B\n\tpublic final fun getGuid ()[B\n\tpublic final fun getImei ()Ljava/lang/String;\n\tpublic final fun getImsiMd5 ()[B\n\tpublic final fun getIpAddress ()[B\n\tpublic final fun getMacAddress ()[B\n\tpublic final fun getModel ()[B\n\tpublic final fun getOsType ()[B\n\tpublic final fun getProcVersion ()[B\n\tpublic final fun getProduct ()[B\n\tpublic final fun getSimInfo ()[B\n\tpublic final fun getVersion ()Lnet/mamoe/mirai/utils/DeviceInfo$Version;\n\tpublic final fun getWifiBSSID ()[B\n\tpublic final fun getWifiSSID ()[B\n\tpublic fun hashCode ()I\n\tpublic static final fun random ()Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic static final fun random (Lkotlin/random/Random;)Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic static final fun serializeToString (Lnet/mamoe/mirai/utils/DeviceInfo;)Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/utils/DeviceInfo$$serializer : kotlinx/serialization/KSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/utils/DeviceInfo$$serializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/utils/DeviceInfo;)V\n}\n\npublic final class net/mamoe/mirai/utils/DeviceInfo$Companion {\n\tpublic final fun deserializeFromString (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic final fun from (Ljava/io/File;)Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic final fun from (Ljava/io/File;Lkotlinx/serialization/json/Json;)Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic static synthetic fun from$default (Lnet/mamoe/mirai/utils/DeviceInfo$Companion;Ljava/io/File;Lkotlinx/serialization/json/Json;ILjava/lang/Object;)Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic final fun random ()Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic final fun random (Lkotlin/random/Random;)Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic final fun serializeToString (Lnet/mamoe/mirai/utils/DeviceInfo;)Ljava/lang/String;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/utils/DeviceInfo$Version {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/DeviceInfo$Version$Companion;\n\tpublic fun <init> ()V\n\tpublic synthetic fun <init> (I[B[B[BILkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> ([B[B[BI)V\n\tpublic synthetic fun <init> ([B[B[BIILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getCodename ()[B\n\tpublic final fun getIncremental ()[B\n\tpublic final fun getRelease ()[B\n\tpublic final fun getSdk ()I\n\tpublic fun hashCode ()I\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/utils/DeviceInfo$Version;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/utils/DeviceInfo$Version$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/utils/DeviceInfo$Version$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/utils/DeviceInfo$Version;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/utils/DeviceInfo$Version;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/utils/DeviceInfo$Version$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/utils/DeviceInfoBuilder {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/DeviceInfoBuilder$Companion;\n\tpublic fun <init> ()V\n\tpublic final fun androidId (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun androidId ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun apn (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun apn ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun baseBand (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun baseBand ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun board (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun board ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun bootId (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun bootId ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun bootloader (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun bootloader ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun brand (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun brand ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun build ()Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic final fun device (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun device ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun display (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun display ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun fingerprint (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun fingerprint ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic static final fun fromPrototype (Lnet/mamoe/mirai/utils/DeviceInfo;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic static final fun fromRandom ()Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic static final fun fromRandom (Lkotlin/random/Random;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun imei (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun imsiMd5 (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun imsiMd5 ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun macAddress (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun macAddress ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun model (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun model ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun osType (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun osType ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun procVersion (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun procVersion ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun product (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun product ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun simInfo (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun simInfo ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun version (Lnet/mamoe/mirai/utils/DeviceInfo$Version;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun wifiBSSID (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun wifiBSSID ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun wifiSSID (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun wifiSSID ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n}\n\npublic final class net/mamoe/mirai/utils/DeviceInfoBuilder$Companion {\n\tpublic final fun fromPrototype (Lnet/mamoe/mirai/utils/DeviceInfo;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun fromRandom ()Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun fromRandom (Lkotlin/random/Random;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic static synthetic fun fromRandom$default (Lnet/mamoe/mirai/utils/DeviceInfoBuilder$Companion;Lkotlin/random/Random;ILjava/lang/Object;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n}\n\npublic final class net/mamoe/mirai/utils/DeviceInfoKt {\n\tpublic static final fun generateDeviceInfoData (Lnet/mamoe/mirai/utils/DeviceInfo;)[B\n\tpublic static final synthetic fun serializeToString (Lnet/mamoe/mirai/utils/DeviceInfo;)Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/utils/DeviceVerificationRequests {\n\tpublic abstract fun getFallback ()Lnet/mamoe/mirai/utils/DeviceVerificationRequests$FallbackRequest;\n\tpublic abstract fun getPreferSms ()Z\n\tpublic abstract fun getSms ()Lnet/mamoe/mirai/utils/DeviceVerificationRequests$SmsRequest;\n}\n\npublic abstract interface class net/mamoe/mirai/utils/DeviceVerificationRequests$FallbackRequest {\n\tpublic abstract fun getUrl ()Ljava/lang/String;\n\tpublic abstract fun solved ()Lnet/mamoe/mirai/utils/DeviceVerificationResult;\n}\n\npublic abstract interface class net/mamoe/mirai/utils/DeviceVerificationRequests$SmsRequest {\n\tpublic abstract fun getCountryCode ()Ljava/lang/String;\n\tpublic abstract fun getPhoneNumber ()Ljava/lang/String;\n\tpublic abstract fun requestSms (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun solved (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceVerificationResult;\n}\n\npublic abstract interface class net/mamoe/mirai/utils/DeviceVerificationResult {\n}\n\npublic final class net/mamoe/mirai/utils/DirectoryLogger : net/mamoe/mirai/utils/SimpleLogger {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/io/File;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/io/File;J)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/io/File;JILkotlin/jvm/internal/DefaultConstructorMarker;)V\n}\n\npublic abstract interface class net/mamoe/mirai/utils/ExternalResource : java/io/Closeable {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/ExternalResource$Companion;\n\tpublic static final field DEFAULT_FORMAT_NAME Ljava/lang/String;\n\tpublic static fun create (Ljava/io/File;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static fun create (Ljava/io/File;Ljava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static fun create (Ljava/io/InputStream;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static fun create (Ljava/io/InputStream;Ljava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static fun create (Ljava/io/RandomAccessFile;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static fun create (Ljava/io/RandomAccessFile;Ljava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static fun create (Ljava/io/RandomAccessFile;Ljava/lang/String;Z)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static fun create ([B)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static fun create ([BLjava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static synthetic fun createAutoCloseable (Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic abstract fun getClosed ()Lkotlinx/coroutines/Deferred;\n\tpublic abstract fun getFormatName ()Ljava/lang/String;\n\tpublic abstract fun getMd5 ()[B\n\tpublic fun getOrigin ()Ljava/lang/Object;\n\tpublic fun getSha1 ()[B\n\tpublic abstract fun getSize ()J\n\tpublic abstract fun inputStream ()Ljava/io/InputStream;\n\tpublic fun isAutoClose ()Z\n\tpublic static fun sendAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendAsImage (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendAsImage (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun toAutoCloseable ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static synthetic fun uploadAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static synthetic fun uploadAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static synthetic fun uploadAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static fun uploadAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static fun uploadAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static fun uploadAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static fun uploadAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadAsImage (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static fun uploadAsImage (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadAsVoice (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/Voice;\n\tpublic static synthetic fun uploadAsVoice (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static synthetic fun uploadTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static synthetic fun uploadTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/utils/ExternalResource$Companion {\n\tpublic static final field DEFAULT_FORMAT_NAME Ljava/lang/String;\n\tpublic final fun create (Ljava/io/File;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun create (Ljava/io/File;Ljava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun create (Ljava/io/InputStream;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun create (Ljava/io/InputStream;Ljava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun create (Ljava/io/RandomAccessFile;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun create (Ljava/io/RandomAccessFile;Ljava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun create (Ljava/io/RandomAccessFile;Ljava/lang/String;Z)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun create ([B)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun create ([BLjava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static synthetic fun create$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/File;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static synthetic fun create$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/InputStream;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static synthetic fun create$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/RandomAccessFile;Ljava/lang/String;ZILjava/lang/Object;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static synthetic fun create$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;[BLjava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final synthetic fun createAutoCloseable (Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun sendAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun sendAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendAsFile$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendAsFile$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun sendAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun sendAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun sendAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun sendAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun sendAsImage (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendAsImage (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendAsImage$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendAsImage$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun sendAsImage$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendAsImage$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun sendTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun sendTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendTo$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendTo$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final synthetic fun uploadAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic final synthetic fun uploadAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final synthetic fun uploadAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic final synthetic fun uploadAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadAsFile$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static synthetic fun uploadAsFile$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun uploadAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun uploadAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun uploadAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun uploadAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun uploadAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadAsImage (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun uploadAsImage (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadAsImage$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static synthetic fun uploadAsImage$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadAsImage$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static synthetic fun uploadAsImage$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final synthetic fun uploadAsVoice (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/Voice;\n\tpublic final synthetic fun uploadAsVoice (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final synthetic fun uploadTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic final synthetic fun uploadTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final synthetic fun uploadTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic final synthetic fun uploadTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadTo$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static synthetic fun uploadTo$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/utils/ExternalResourceKt {\n\tpublic static final fun runAutoClose (Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static final fun useAutoClose (Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/utils/FileCacheStrategy {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/FileCacheStrategy$Companion;\n\tpublic static fun getPlatformDefault ()Lnet/mamoe/mirai/utils/FileCacheStrategy;\n\tpublic fun newCache (Ljava/io/InputStream;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic abstract fun newCache (Ljava/io/InputStream;Ljava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static synthetic fun newCache$default (Lnet/mamoe/mirai/utils/FileCacheStrategy;Ljava/io/InputStream;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/utils/ExternalResource;\n}\n\npublic final class net/mamoe/mirai/utils/FileCacheStrategy$Companion {\n\tpublic final fun getPlatformDefault ()Lnet/mamoe/mirai/utils/FileCacheStrategy;\n}\n\npublic final class net/mamoe/mirai/utils/FileCacheStrategy$MemoryCache : net/mamoe/mirai/utils/FileCacheStrategy {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/utils/FileCacheStrategy$MemoryCache;\n\tpublic fun newCache (Ljava/io/InputStream;Ljava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n}\n\npublic final class net/mamoe/mirai/utils/FileCacheStrategy$TempCache : net/mamoe/mirai/utils/FileCacheStrategy {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/io/File;)V\n\tpublic synthetic fun <init> (Ljava/io/File;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun getDirectory ()Ljava/io/File;\n\tpublic fun newCache (Ljava/io/InputStream;Ljava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n}\n\npublic abstract interface annotation class net/mamoe/mirai/utils/JavaFriendlyAPI : java/lang/annotation/Annotation {\n}\n\npublic final class net/mamoe/mirai/utils/LoggerAdapters {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/utils/LoggerAdapters;\n\tpublic static final fun asMiraiLogger (Ljava/util/logging/Logger;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic static final fun asMiraiLogger (Lorg/apache/logging/log4j/Logger;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic static final fun asMiraiLogger (Lorg/apache/logging/log4j/Logger;Lorg/apache/logging/log4j/Marker;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic static final fun asMiraiLogger (Lorg/slf4j/Logger;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic static final fun useLog4j2 ()V\n}\n\npublic abstract class net/mamoe/mirai/utils/LoginSolver {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/LoginSolver$Companion;\n\tpublic static final field Default Lnet/mamoe/mirai/utils/LoginSolver;\n\tpublic fun <init> ()V\n\tpublic fun createQRCodeLoginListener (Lnet/mamoe/mirai/Bot;)Lnet/mamoe/mirai/auth/QRCodeLoginListener;\n\tpublic fun isSliderCaptchaSupported ()Z\n\tpublic fun onSolveDeviceVerification (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/utils/DeviceVerificationRequests;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun onSolvePicCaptcha (Lnet/mamoe/mirai/Bot;[BLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun onSolveSliderCaptcha (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun onSolveUnsafeDeviceLoginVerify (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/utils/LoginSolver$Companion {\n\tpublic final synthetic fun getDefault ()Lnet/mamoe/mirai/utils/LoginSolver;\n}\n\npublic abstract interface annotation class net/mamoe/mirai/utils/MiraiExperimentalApi : java/lang/annotation/Annotation {\n\tpublic abstract fun message ()Ljava/lang/String;\n}\n\npublic abstract interface annotation class net/mamoe/mirai/utils/MiraiInternalApi : java/lang/annotation/Annotation {\n\tpublic abstract fun message ()Ljava/lang/String;\n}\n\npublic abstract interface annotation class net/mamoe/mirai/utils/MiraiInternalFile : java/lang/annotation/Annotation {\n}\n\npublic abstract interface class net/mamoe/mirai/utils/MiraiLogger {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/MiraiLogger$Companion;\n\tpublic fun call (Lnet/mamoe/mirai/utils/SimpleLogger$LogPriority;Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic static synthetic fun call$default (Lnet/mamoe/mirai/utils/MiraiLogger;Lnet/mamoe/mirai/utils/SimpleLogger$LogPriority;Ljava/lang/String;Ljava/lang/Throwable;ILjava/lang/Object;)V\n\tpublic static synthetic fun create (Ljava/lang/String;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic abstract fun debug (Ljava/lang/String;)V\n\tpublic abstract fun debug (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun debug (Ljava/lang/Throwable;)V\n\tpublic abstract fun error (Ljava/lang/String;)V\n\tpublic abstract fun error (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun error (Ljava/lang/Throwable;)V\n\tpublic synthetic fun getFollower ()Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic abstract fun getIdentity ()Ljava/lang/String;\n\tpublic abstract fun info (Ljava/lang/String;)V\n\tpublic abstract fun info (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun info (Ljava/lang/Throwable;)V\n\tpublic fun isDebugEnabled ()Z\n\tpublic abstract fun isEnabled ()Z\n\tpublic fun isErrorEnabled ()Z\n\tpublic fun isInfoEnabled ()Z\n\tpublic fun isVerboseEnabled ()Z\n\tpublic fun isWarningEnabled ()Z\n\tpublic synthetic fun plus (Lnet/mamoe/mirai/utils/MiraiLogger;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic static synthetic fun setDefaultLoggerCreator (Lkotlin/jvm/functions/Function1;)V\n\tpublic synthetic fun setFollower (Lnet/mamoe/mirai/utils/MiraiLogger;)V\n\tpublic abstract fun verbose (Ljava/lang/String;)V\n\tpublic abstract fun verbose (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun verbose (Ljava/lang/Throwable;)V\n\tpublic abstract fun warning (Ljava/lang/String;)V\n\tpublic abstract fun warning (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun warning (Ljava/lang/Throwable;)V\n}\n\npublic final class net/mamoe/mirai/utils/MiraiLogger$Companion {\n\tpublic final synthetic fun create (Ljava/lang/String;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic final synthetic fun getTopLevel ()Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic final synthetic fun setDefaultLoggerCreator (Lkotlin/jvm/functions/Function1;)V\n}\n\npublic abstract interface class net/mamoe/mirai/utils/MiraiLogger$Factory {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/utils/MiraiLogger$Factory$INSTANCE;\n\tpublic fun create (Ljava/lang/Class;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic abstract fun create (Ljava/lang/Class;Ljava/lang/String;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic fun create (Lkotlin/reflect/KClass;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic fun create (Lkotlin/reflect/KClass;Ljava/lang/String;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic static synthetic fun create$default (Lnet/mamoe/mirai/utils/MiraiLogger$Factory;Ljava/lang/Class;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic static synthetic fun create$default (Lnet/mamoe/mirai/utils/MiraiLogger$Factory;Lkotlin/reflect/KClass;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/utils/MiraiLogger;\n}\n\npublic final class net/mamoe/mirai/utils/MiraiLogger$Factory$INSTANCE : net/mamoe/mirai/utils/MiraiLogger$Factory {\n\tpublic fun create (Ljava/lang/Class;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic fun create (Ljava/lang/Class;Ljava/lang/String;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic fun create (Lkotlin/reflect/KClass;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic fun create (Lkotlin/reflect/KClass;Ljava/lang/String;)Lnet/mamoe/mirai/utils/MiraiLogger;\n}\n\npublic abstract class net/mamoe/mirai/utils/MiraiLoggerPlatformBase : net/mamoe/mirai/utils/MiraiLogger {\n\tpublic fun <init> ()V\n\tpublic final fun debug (Ljava/lang/String;)V\n\tpublic final fun debug (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tprotected fun debug0 (Ljava/lang/String;)V\n\tprotected abstract fun debug0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic final fun error (Ljava/lang/String;)V\n\tpublic final fun error (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tprotected fun error0 (Ljava/lang/String;)V\n\tprotected abstract fun error0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic final fun info (Ljava/lang/String;)V\n\tpublic final fun info (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tprotected fun info0 (Ljava/lang/String;)V\n\tprotected abstract fun info0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun isEnabled ()Z\n\tpublic final fun verbose (Ljava/lang/String;)V\n\tpublic final fun verbose (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tprotected fun verbose0 (Ljava/lang/String;)V\n\tprotected abstract fun verbose0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic final fun warning (Ljava/lang/String;)V\n\tpublic final fun warning (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tprotected fun warning0 (Ljava/lang/String;)V\n\tprotected abstract fun warning0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n}\n\npublic final class net/mamoe/mirai/utils/MiraiLoggerWithSwitch : net/mamoe/mirai/utils/MiraiLoggerPlatformBase {\n\tpublic fun debug0 (Ljava/lang/String;)V\n\tpublic fun debug0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic final fun disable ()V\n\tpublic final fun enable ()V\n\tpublic fun error0 (Ljava/lang/String;)V\n\tpublic fun error0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun getIdentity ()Ljava/lang/String;\n\tpublic fun info0 (Ljava/lang/String;)V\n\tpublic fun info0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun isEnabled ()Z\n\tpublic fun verbose0 (Ljava/lang/String;)V\n\tpublic fun verbose0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun warning0 (Ljava/lang/String;)V\n\tpublic fun warning0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n}\n\npublic abstract interface annotation class net/mamoe/mirai/utils/NotStableForInheritance : java/lang/annotation/Annotation {\n\tpublic abstract fun message ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/utils/OverFileSizeMaxException : java/lang/IllegalStateException {\n\tpublic fun <init> ()V\n}\n\npublic abstract interface class net/mamoe/mirai/utils/ProgressionCallback {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/ProgressionCallback$Companion;\n\tpublic static fun asProgressionCallback (Lkotlinx/coroutines/channels/SendChannel;Z)Lnet/mamoe/mirai/utils/ProgressionCallback;\n\tpublic fun onBegin (Ljava/lang/Object;Lnet/mamoe/mirai/utils/ExternalResource;)V\n\tpublic fun onFailure (Ljava/lang/Object;Lnet/mamoe/mirai/utils/ExternalResource;Ljava/lang/Throwable;)V\n\tpublic fun onFinished (Ljava/lang/Object;Lnet/mamoe/mirai/utils/ExternalResource;Ljava/lang/Object;)V\n\tpublic fun onProgression (Ljava/lang/Object;Lnet/mamoe/mirai/utils/ExternalResource;Ljava/lang/Object;)V\n\tpublic fun onSuccess (Ljava/lang/Object;Lnet/mamoe/mirai/utils/ExternalResource;Ljava/lang/Object;)V\n}\n\npublic final class net/mamoe/mirai/utils/ProgressionCallback$Companion {\n\tpublic final fun asProgressionCallback (Lkotlinx/coroutines/channels/SendChannel;Z)Lnet/mamoe/mirai/utils/ProgressionCallback;\n\tpublic static synthetic fun asProgressionCallback$default (Lnet/mamoe/mirai/utils/ProgressionCallback$Companion;Lkotlinx/coroutines/channels/SendChannel;ZILjava/lang/Object;)Lnet/mamoe/mirai/utils/ProgressionCallback;\n}\n\npublic abstract interface class net/mamoe/mirai/utils/RemoteFile {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/RemoteFile$Companion;\n\tpublic static final field ROOT_PATH Ljava/lang/String;\n\tpublic fun delete ()Z\n\tpublic abstract fun delete (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun exists ()Z\n\tpublic abstract fun exists (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun getContact ()Lnet/mamoe/mirai/contact/FileSupported;\n\tpublic fun getDownloadInfo ()Lnet/mamoe/mirai/utils/RemoteFile$DownloadInfo;\n\tpublic abstract fun getDownloadInfo (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun getId ()Ljava/lang/String;\n\tpublic fun getInfo ()Lnet/mamoe/mirai/utils/RemoteFile$FileInfo;\n\tpublic abstract fun getInfo (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun getName ()Ljava/lang/String;\n\tpublic abstract fun getParent ()Lnet/mamoe/mirai/utils/RemoteFile;\n\tpublic abstract fun getPath ()Ljava/lang/String;\n\tpublic fun isDirectory ()Z\n\tpublic fun isDirectory (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun isDirectory$suspendImpl (Lnet/mamoe/mirai/utils/RemoteFile;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun isFile ()Z\n\tpublic abstract fun isFile (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun length ()J\n\tpublic abstract fun length (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun listFiles ()Lkotlinx/coroutines/flow/Flow;\n\tpublic abstract fun listFiles (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun listFilesCollection ()Ljava/util/List;\n\tpublic fun listFilesCollection (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun listFilesCollection$suspendImpl (Lnet/mamoe/mirai/utils/RemoteFile;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun listFilesIterator (Z)Ljava/util/Iterator;\n\tpublic abstract fun listFilesIterator (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun mkdir ()Z\n\tpublic abstract fun mkdir (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun moveTo (Ljava/lang/String;)Z\n\tpublic fun moveTo (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun moveTo (Lnet/mamoe/mirai/utils/RemoteFile;)Z\n\tpublic abstract fun moveTo (Lnet/mamoe/mirai/utils/RemoteFile;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun moveTo$suspendImpl (Lnet/mamoe/mirai/utils/RemoteFile;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun renameTo (Ljava/lang/String;)Z\n\tpublic abstract fun renameTo (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun resolve (Ljava/lang/String;)Lnet/mamoe/mirai/utils/RemoteFile;\n\tpublic abstract fun resolve (Lnet/mamoe/mirai/utils/RemoteFile;)Lnet/mamoe/mirai/utils/RemoteFile;\n\tpublic fun resolveById (Ljava/lang/String;)Lnet/mamoe/mirai/utils/RemoteFile;\n\tpublic fun resolveById (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun resolveById (Ljava/lang/String;Z)Lnet/mamoe/mirai/utils/RemoteFile;\n\tpublic abstract fun resolveById (Ljava/lang/String;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun resolveById$default (Lnet/mamoe/mirai/utils/RemoteFile;Ljava/lang/String;ZILjava/lang/Object;)Lnet/mamoe/mirai/utils/RemoteFile;\n\tpublic static synthetic fun resolveById$default (Lnet/mamoe/mirai/utils/RemoteFile;Ljava/lang/String;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun resolveById$suspendImpl (Lnet/mamoe/mirai/utils/RemoteFile;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun resolveSibling (Ljava/lang/String;)Lnet/mamoe/mirai/utils/RemoteFile;\n\tpublic abstract fun resolveSibling (Lnet/mamoe/mirai/utils/RemoteFile;)Lnet/mamoe/mirai/utils/RemoteFile;\n\tpublic static synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun toMessage ()Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic abstract fun toMessage (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun toString ()Ljava/lang/String;\n\tpublic fun upload (Ljava/io/File;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic fun upload (Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun upload (Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic fun upload (Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun upload (Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic fun upload (Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun upload (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic abstract fun upload (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun upload$default (Lnet/mamoe/mirai/utils/RemoteFile;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static synthetic fun upload$default (Lnet/mamoe/mirai/utils/RemoteFile;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun upload$default (Lnet/mamoe/mirai/utils/RemoteFile;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static synthetic fun upload$default (Lnet/mamoe/mirai/utils/RemoteFile;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun upload$suspendImpl (Lnet/mamoe/mirai/utils/RemoteFile;Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun upload$suspendImpl (Lnet/mamoe/mirai/utils/RemoteFile;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun upload$suspendImpl (Lnet/mamoe/mirai/utils/RemoteFile;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/utils/RemoteFile$Companion {\n\tpublic static final field ROOT_PATH Ljava/lang/String;\n\tpublic final synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendFile$default (Lnet/mamoe/mirai/utils/RemoteFile$Companion;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendFile$default (Lnet/mamoe/mirai/utils/RemoteFile$Companion;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun sendFile$default (Lnet/mamoe/mirai/utils/RemoteFile$Companion;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendFile$default (Lnet/mamoe/mirai/utils/RemoteFile$Companion;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic final fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic final fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic final fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic final fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadFile$default (Lnet/mamoe/mirai/utils/RemoteFile$Companion;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static synthetic fun uploadFile$default (Lnet/mamoe/mirai/utils/RemoteFile$Companion;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadFile$default (Lnet/mamoe/mirai/utils/RemoteFile$Companion;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static synthetic fun uploadFile$default (Lnet/mamoe/mirai/utils/RemoteFile$Companion;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/utils/RemoteFile$DownloadInfo {\n\tpublic final fun getFilename ()Ljava/lang/String;\n\tpublic final fun getId ()Ljava/lang/String;\n\tpublic final fun getMd5 ()[B\n\tpublic final fun getPath ()Ljava/lang/String;\n\tpublic final fun getSha1 ()[B\n\tpublic final fun getUrl ()Ljava/lang/String;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/utils/RemoteFile$FileInfo {\n\tpublic final fun getDownloadTimes ()I\n\tpublic final fun getId ()Ljava/lang/String;\n\tpublic final fun getLastModifyTime ()J\n\tpublic final fun getLength ()J\n\tpublic final fun getMd5 ()[B\n\tpublic final fun getName ()Ljava/lang/String;\n\tpublic final fun getPath ()Ljava/lang/String;\n\tpublic final fun getSha1 ()[B\n\tpublic final fun getUploadTime ()J\n\tpublic final fun getUploaderId ()J\n\tpublic final fun resolveToFile (Lnet/mamoe/mirai/contact/FileSupported;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/utils/RemoteFile$ProgressionCallback {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback$Companion;\n\tpublic static fun asProgressionCallback (Lkotlinx/coroutines/channels/SendChannel;Z)Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;\n\tpublic fun onBegin (Lnet/mamoe/mirai/utils/RemoteFile;Lnet/mamoe/mirai/utils/ExternalResource;)V\n\tpublic fun onFailure (Lnet/mamoe/mirai/utils/RemoteFile;Lnet/mamoe/mirai/utils/ExternalResource;Ljava/lang/Throwable;)V\n\tpublic fun onProgression (Lnet/mamoe/mirai/utils/RemoteFile;Lnet/mamoe/mirai/utils/ExternalResource;J)V\n\tpublic fun onSuccess (Lnet/mamoe/mirai/utils/RemoteFile;Lnet/mamoe/mirai/utils/ExternalResource;)V\n}\n\npublic final class net/mamoe/mirai/utils/RemoteFile$ProgressionCallback$Companion {\n\tpublic final fun asProgressionCallback (Lkotlinx/coroutines/channels/SendChannel;Z)Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;\n\tpublic static synthetic fun asProgressionCallback$default (Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback$Companion;Lkotlinx/coroutines/channels/SendChannel;ZILjava/lang/Object;)Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;\n}\n\npublic final class net/mamoe/mirai/utils/SilentLogger : net/mamoe/mirai/utils/PlatformLogger {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/utils/SilentLogger;\n\tpublic fun debug0 (Ljava/lang/String;)V\n\tpublic fun debug0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun error0 (Ljava/lang/String;)V\n\tpublic fun error0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun getIdentity ()Ljava/lang/String;\n\tpublic fun info0 (Ljava/lang/String;)V\n\tpublic fun info0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun isDebugEnabled ()Z\n\tpublic fun isEnabled ()Z\n\tpublic fun isErrorEnabled ()Z\n\tpublic fun isInfoEnabled ()Z\n\tpublic fun isVerboseEnabled ()Z\n\tpublic fun isWarningEnabled ()Z\n\tpublic fun verbose0 (Ljava/lang/String;)V\n\tpublic fun verbose0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun warning0 (Ljava/lang/String;)V\n\tpublic fun warning0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n}\n\npublic class net/mamoe/mirai/utils/SimpleLogger : net/mamoe/mirai/utils/MiraiLoggerPlatformBase {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/SimpleLogger$Companion;\n\tpublic fun <init> (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)V\n\tpublic fun debug0 (Ljava/lang/String;)V\n\tpublic fun debug0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun error0 (Ljava/lang/String;)V\n\tpublic fun error0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic final fun getIdentity ()Ljava/lang/String;\n\tprotected fun getLogger ()Lkotlin/jvm/functions/Function3;\n\tpublic fun info0 (Ljava/lang/String;)V\n\tpublic fun info0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun verbose0 (Ljava/lang/String;)V\n\tpublic fun verbose0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun warning0 (Ljava/lang/String;)V\n\tpublic fun warning0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n}\n\npublic final class net/mamoe/mirai/utils/SimpleLogger$Companion {\n\tpublic final fun invoke (Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lnet/mamoe/mirai/utils/SimpleLogger;\n\tpublic final fun invoke (Lkotlin/jvm/functions/Function2;)Lnet/mamoe/mirai/utils/SimpleLogger;\n\tpublic final fun invoke (Lkotlin/jvm/functions/Function3;)Lnet/mamoe/mirai/utils/SimpleLogger;\n}\n\npublic final class net/mamoe/mirai/utils/SimpleLogger$LogPriority : java/lang/Enum {\n\tpublic static final field DEBUG Lnet/mamoe/mirai/utils/SimpleLogger$LogPriority;\n\tpublic static final field ERROR Lnet/mamoe/mirai/utils/SimpleLogger$LogPriority;\n\tpublic static final field INFO Lnet/mamoe/mirai/utils/SimpleLogger$LogPriority;\n\tpublic static final field VERBOSE Lnet/mamoe/mirai/utils/SimpleLogger$LogPriority;\n\tpublic static final field WARNING Lnet/mamoe/mirai/utils/SimpleLogger$LogPriority;\n\tpublic final fun getCorrespondingFunction ()Lkotlin/jvm/functions/Function3;\n\tpublic final fun getNameAligned ()Ljava/lang/String;\n\tpublic final fun getSimpleName ()Ljava/lang/String;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/utils/SimpleLogger$LogPriority;\n\tpublic static fun values ()[Lnet/mamoe/mirai/utils/SimpleLogger$LogPriority;\n}\n\npublic final class net/mamoe/mirai/utils/SingleFileLogger : net/mamoe/mirai/utils/MiraiLogger {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/io/File;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/io/File;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun call (Lnet/mamoe/mirai/utils/SimpleLogger$LogPriority;Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun debug (Ljava/lang/String;)V\n\tpublic fun debug (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun debug (Ljava/lang/Throwable;)V\n\tpublic fun error (Ljava/lang/String;)V\n\tpublic fun error (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun error (Ljava/lang/Throwable;)V\n\tpublic fun getFollower ()Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic fun getIdentity ()Ljava/lang/String;\n\tpublic fun info (Ljava/lang/String;)V\n\tpublic fun info (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun info (Ljava/lang/Throwable;)V\n\tpublic fun isDebugEnabled ()Z\n\tpublic fun isEnabled ()Z\n\tpublic fun isErrorEnabled ()Z\n\tpublic fun isInfoEnabled ()Z\n\tpublic fun isVerboseEnabled ()Z\n\tpublic fun isWarningEnabled ()Z\n\tpublic synthetic fun plus (Lnet/mamoe/mirai/utils/MiraiLogger;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic fun setFollower (Lnet/mamoe/mirai/utils/MiraiLogger;)V\n\tpublic fun verbose (Ljava/lang/String;)V\n\tpublic fun verbose (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun verbose (Ljava/lang/Throwable;)V\n\tpublic fun warning (Ljava/lang/String;)V\n\tpublic fun warning (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun warning (Ljava/lang/Throwable;)V\n}\n\npublic abstract interface class net/mamoe/mirai/utils/Streamable {\n\tpublic abstract fun asFlow ()Lkotlinx/coroutines/flow/Flow;\n\tpublic fun asStream ()Ljava/util/stream/Stream;\n\tpublic fun toList ()Ljava/util/List;\n\tpublic fun toList (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun toList$suspendImpl (Lnet/mamoe/mirai/utils/Streamable;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/utils/Utils {\n\tpublic static final synthetic fun BotConfiguration (Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/utils/BotConfiguration;\n\tpublic static final fun debug (Lnet/mamoe/mirai/utils/MiraiLogger;Lkotlin/jvm/functions/Function0;)V\n\tpublic static final fun debug (Lnet/mamoe/mirai/utils/MiraiLogger;Lkotlin/jvm/functions/Function0;Ljava/lang/Throwable;)V\n\tpublic static final fun error (Lnet/mamoe/mirai/utils/MiraiLogger;Lkotlin/jvm/functions/Function0;)V\n\tpublic static final fun error (Lnet/mamoe/mirai/utils/MiraiLogger;Lkotlin/jvm/functions/Function0;Ljava/lang/Throwable;)V\n\tpublic static final fun info (Lnet/mamoe/mirai/utils/MiraiLogger;Lkotlin/jvm/functions/Function0;)V\n\tpublic static final fun info (Lnet/mamoe/mirai/utils/MiraiLogger;Lkotlin/jvm/functions/Function0;Ljava/lang/Throwable;)V\n\tpublic static final fun verbose (Lnet/mamoe/mirai/utils/MiraiLogger;Lkotlin/jvm/functions/Function0;)V\n\tpublic static final fun verbose (Lnet/mamoe/mirai/utils/MiraiLogger;Lkotlin/jvm/functions/Function0;Ljava/lang/Throwable;)V\n\tpublic static final fun warning (Lnet/mamoe/mirai/utils/MiraiLogger;Lkotlin/jvm/functions/Function0;)V\n\tpublic static final fun warning (Lnet/mamoe/mirai/utils/MiraiLogger;Lkotlin/jvm/functions/Function0;Ljava/lang/Throwable;)V\n\tpublic static final fun withSwitch (Lnet/mamoe/mirai/utils/MiraiLogger;)Lnet/mamoe/mirai/utils/MiraiLoggerWithSwitch;\n\tpublic static final fun withSwitch (Lnet/mamoe/mirai/utils/MiraiLogger;Z)Lnet/mamoe/mirai/utils/MiraiLoggerWithSwitch;\n\tpublic static synthetic fun withSwitch$default (Lnet/mamoe/mirai/utils/MiraiLogger;ZILjava/lang/Object;)Lnet/mamoe/mirai/utils/MiraiLoggerWithSwitch;\n}\n\n"
  },
  {
    "path": "mirai-core-api/compatibility-validation/jvm/api/jvm.api",
    "content": "public abstract interface class net/mamoe/mirai/Bot : kotlinx/coroutines/CoroutineScope, net/mamoe/mirai/contact/ContactOrBot, net/mamoe/mirai/contact/UserOrBot {\n\tpublic static final field Companion Lnet/mamoe/mirai/Bot$Companion;\n\tpublic fun close ()V\n\tpublic abstract fun close (Ljava/lang/Throwable;)V\n\tpublic static synthetic fun close$default (Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;ILjava/lang/Object;)V\n\tpublic fun closeAndJoin (Ljava/lang/Throwable;)V\n\tpublic fun closeAndJoin (Ljava/lang/Throwable;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun closeAndJoin$default (Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;ILjava/lang/Object;)V\n\tpublic static synthetic fun closeAndJoin$default (Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun closeAndJoin$suspendImpl (Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun findInstance (J)Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getAsFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic abstract fun getAsStranger ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getConfiguration ()Lnet/mamoe/mirai/utils/BotConfiguration;\n\tpublic abstract fun getEventChannel ()Lnet/mamoe/mirai/event/EventChannel;\n\tpublic fun getFriend (J)Lnet/mamoe/mirai/contact/Friend;\n\tpublic abstract fun getFriendGroups ()Lnet/mamoe/mirai/contact/friendgroup/FriendGroups;\n\tpublic fun getFriendOrFail (J)Lnet/mamoe/mirai/contact/Friend;\n\tpublic abstract fun getFriends ()Lnet/mamoe/mirai/contact/ContactList;\n\tpublic fun getGroup (J)Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getGroupOrFail (J)Lnet/mamoe/mirai/contact/Group;\n\tpublic abstract fun getGroups ()Lnet/mamoe/mirai/contact/ContactList;\n\tpublic static fun getInstance (J)Lnet/mamoe/mirai/Bot;\n\tpublic static fun getInstanceOrNull (J)Lnet/mamoe/mirai/Bot;\n\tpublic static fun getInstances ()Ljava/util/List;\n\tpublic static fun getInstancesSequence ()Lkotlin/sequences/Sequence;\n\tpublic abstract fun getLogger ()Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic abstract fun getOtherClients ()Lnet/mamoe/mirai/contact/ContactList;\n\tpublic fun getStranger (J)Lnet/mamoe/mirai/contact/Stranger;\n\tpublic fun getStrangerOrFail (J)Lnet/mamoe/mirai/contact/Stranger;\n\tpublic abstract fun getStrangers ()Lnet/mamoe/mirai/contact/ContactList;\n\tpublic abstract fun isOnline ()Z\n\tpublic fun join ()V\n\tpublic fun join (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun join$suspendImpl (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun login ()V\n\tpublic abstract fun login (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun nudge ()Lnet/mamoe/mirai/message/action/BotNudge;\n\tpublic synthetic fun nudge ()Lnet/mamoe/mirai/message/action/Nudge;\n}\n\npublic final class net/mamoe/mirai/Bot$Companion {\n\tpublic final fun findInstance (J)Lnet/mamoe/mirai/Bot;\n\tpublic final fun getInstance (J)Lnet/mamoe/mirai/Bot;\n\tpublic final fun getInstanceOrNull (J)Lnet/mamoe/mirai/Bot;\n\tpublic final fun getInstances ()Ljava/util/List;\n\tpublic final fun getInstancesSequence ()Lkotlin/sequences/Sequence;\n}\n\npublic abstract interface class net/mamoe/mirai/BotFactory {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/BotFactory$INSTANCE;\n\tpublic fun newBot (JLjava/lang/String;)Lnet/mamoe/mirai/Bot;\n\tpublic fun newBot (JLjava/lang/String;Lnet/mamoe/mirai/BotFactory$BotConfigurationLambda;)Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun newBot (JLjava/lang/String;Lnet/mamoe/mirai/utils/BotConfiguration;)Lnet/mamoe/mirai/Bot;\n\tpublic fun newBot (JLnet/mamoe/mirai/auth/BotAuthorization;)Lnet/mamoe/mirai/Bot;\n\tpublic fun newBot (JLnet/mamoe/mirai/auth/BotAuthorization;Lnet/mamoe/mirai/BotFactory$BotConfigurationLambda;)Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun newBot (JLnet/mamoe/mirai/auth/BotAuthorization;Lnet/mamoe/mirai/utils/BotConfiguration;)Lnet/mamoe/mirai/Bot;\n\tpublic fun newBot (J[B)Lnet/mamoe/mirai/Bot;\n\tpublic fun newBot (J[BLnet/mamoe/mirai/BotFactory$BotConfigurationLambda;)Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun newBot (J[BLnet/mamoe/mirai/utils/BotConfiguration;)Lnet/mamoe/mirai/Bot;\n}\n\npublic abstract interface class net/mamoe/mirai/BotFactory$BotConfigurationLambda {\n\tpublic abstract fun invoke (Lnet/mamoe/mirai/utils/BotConfiguration;)V\n}\n\npublic final class net/mamoe/mirai/BotFactory$INSTANCE : net/mamoe/mirai/BotFactory {\n\tpublic final synthetic fun newBot (JLjava/lang/String;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/Bot;\n\tpublic fun newBot (JLjava/lang/String;Lnet/mamoe/mirai/utils/BotConfiguration;)Lnet/mamoe/mirai/Bot;\n\tpublic fun newBot (JLnet/mamoe/mirai/auth/BotAuthorization;Lnet/mamoe/mirai/utils/BotConfiguration;)Lnet/mamoe/mirai/Bot;\n\tpublic final synthetic fun newBot (J[BLkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/Bot;\n\tpublic fun newBot (J[BLnet/mamoe/mirai/utils/BotConfiguration;)Lnet/mamoe/mirai/Bot;\n}\n\npublic final class net/mamoe/mirai/BotKt {\n\tpublic static final synthetic fun alsoLogin (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun containsFriend (Lnet/mamoe/mirai/Bot;J)Z\n\tpublic static final synthetic fun containsGroup (Lnet/mamoe/mirai/Bot;J)Z\n\tpublic static final synthetic fun getSupervisorJob (Lnet/mamoe/mirai/Bot;)Lkotlinx/coroutines/CompletableJob;\n}\n\npublic abstract interface class net/mamoe/mirai/IMirai : net/mamoe/mirai/LowLevelApiAccessor {\n\tpublic fun acceptInvitedJoinGroupRequest (Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;)V\n\tpublic abstract fun acceptInvitedJoinGroupRequest (Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun acceptMemberJoinRequest (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;)V\n\tpublic abstract fun acceptMemberJoinRequest (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun acceptNewFriendRequest (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;)V\n\tpublic abstract fun acceptNewFriendRequest (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun broadcastEvent (Lnet/mamoe/mirai/event/Event;)V\n\tpublic abstract fun broadcastEvent (Lnet/mamoe/mirai/event/Event;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun calculateGroupCodeByGroupUin (J)J\n\tpublic fun calculateGroupUinByGroupCode (J)J\n\tpublic abstract fun constructMessageSource (JLnet/mamoe/mirai/message/data/MessageSourceKind;JJ[II[ILnet/mamoe/mirai/message/data/MessageChain;)Lnet/mamoe/mirai/message/data/OfflineMessageSource;\n\tpublic abstract fun createFileMessage (Ljava/lang/String;ILjava/lang/String;J)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic fun createImage (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic abstract fun createUnsupportedMessage ([B)Lnet/mamoe/mirai/message/data/UnsupportedMessage;\n\tpublic fun downloadForwardMessage (Lnet/mamoe/mirai/Bot;Ljava/lang/String;)Ljava/util/List;\n\tpublic abstract fun downloadForwardMessage (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun downloadLongMessage (Lnet/mamoe/mirai/Bot;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic abstract fun downloadLongMessage (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun getBotFactory ()Lnet/mamoe/mirai/BotFactory;\n\tpublic abstract fun getFileCacheStrategy ()Lnet/mamoe/mirai/utils/FileCacheStrategy;\n\tpublic fun getOnlineOtherClientsList (Lnet/mamoe/mirai/Bot;Z)Ljava/util/List;\n\tpublic abstract fun getOnlineOtherClientsList (Lnet/mamoe/mirai/Bot;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun getOnlineOtherClientsList$default (Lnet/mamoe/mirai/IMirai;Lnet/mamoe/mirai/Bot;ZILjava/lang/Object;)Ljava/util/List;\n\tpublic static synthetic fun getOnlineOtherClientsList$default (Lnet/mamoe/mirai/IMirai;Lnet/mamoe/mirai/Bot;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun getUin (Lnet/mamoe/mirai/contact/ContactOrBot;)J\n\tpublic fun ignoreInvitedJoinGroupRequest (Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;)V\n\tpublic abstract fun ignoreInvitedJoinGroupRequest (Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun ignoreMemberJoinRequest (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;Z)V\n\tpublic abstract fun ignoreMemberJoinRequest (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun ignoreMemberJoinRequest$default (Lnet/mamoe/mirai/IMirai;Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZILjava/lang/Object;)V\n\tpublic static synthetic fun ignoreMemberJoinRequest$default (Lnet/mamoe/mirai/IMirai;Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun queryImageUrl (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/message/data/Image;)Ljava/lang/String;\n\tpublic abstract fun queryImageUrl (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/message/data/Image;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun queryProfile (Lnet/mamoe/mirai/Bot;J)Lnet/mamoe/mirai/data/UserProfile;\n\tpublic abstract fun queryProfile (Lnet/mamoe/mirai/Bot;JLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun recallMessage (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/message/data/MessageSource;)V\n\tpublic abstract fun recallMessage (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/message/data/MessageSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun rejectMemberJoinRequest (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZLjava/lang/String;)V\n\tpublic abstract fun rejectMemberJoinRequest (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZLjava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun rejectMemberJoinRequest$default (Lnet/mamoe/mirai/IMirai;Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZLjava/lang/String;ILjava/lang/Object;)V\n\tpublic static synthetic fun rejectMemberJoinRequest$default (Lnet/mamoe/mirai/IMirai;Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZLjava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun rejectNewFriendRequest (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;Z)V\n\tpublic abstract fun rejectNewFriendRequest (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun rejectNewFriendRequest$default (Lnet/mamoe/mirai/IMirai;Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;ZILjava/lang/Object;)V\n\tpublic static synthetic fun rejectNewFriendRequest$default (Lnet/mamoe/mirai/IMirai;Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun sendNudge (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/message/action/Nudge;Lnet/mamoe/mirai/contact/Contact;)Z\n\tpublic abstract fun sendNudge (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/message/action/Nudge;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun setFileCacheStrategy (Lnet/mamoe/mirai/utils/FileCacheStrategy;)V\n}\n\npublic abstract interface annotation class net/mamoe/mirai/LowLevelApi : java/lang/annotation/Annotation {\n}\n\npublic abstract interface class net/mamoe/mirai/LowLevelApiAccessor {\n\tpublic fun getGroupVoiceDownloadUrl (Lnet/mamoe/mirai/Bot;[BJJ)Ljava/lang/String;\n\tpublic abstract fun getGroupVoiceDownloadUrl (Lnet/mamoe/mirai/Bot;[BJJLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun getRawGroupList (Lnet/mamoe/mirai/Bot;)Lkotlin/sequences/Sequence;\n\tpublic abstract fun getRawGroupList (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun getRawGroupMemberList (Lnet/mamoe/mirai/Bot;JJJ)Lkotlin/sequences/Sequence;\n\tpublic abstract fun getRawGroupMemberList (Lnet/mamoe/mirai/Bot;JJJLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun muteAnonymousMember (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Ljava/lang/String;JI)V\n\tpublic abstract fun muteAnonymousMember (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Ljava/lang/String;JILkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun newFriend (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/data/FriendInfo;)Lnet/mamoe/mirai/contact/Friend;\n\tpublic abstract fun newStranger (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/data/StrangerInfo;)Lnet/mamoe/mirai/contact/Stranger;\n\tpublic fun recallFriendMessageRaw (Lnet/mamoe/mirai/Bot;J[I[II)Z\n\tpublic abstract fun recallFriendMessageRaw (Lnet/mamoe/mirai/Bot;J[I[IILkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun recallGroupMessageRaw (Lnet/mamoe/mirai/Bot;J[I[I)Z\n\tpublic abstract fun recallGroupMessageRaw (Lnet/mamoe/mirai/Bot;J[I[ILkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun recallGroupTempMessageRaw (Lnet/mamoe/mirai/Bot;JJ[I[II)Z\n\tpublic abstract fun recallGroupTempMessageRaw (Lnet/mamoe/mirai/Bot;JJ[I[IILkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun solveBotInvitedJoinGroupRequestEvent (Lnet/mamoe/mirai/Bot;JJJZ)V\n\tpublic abstract fun solveBotInvitedJoinGroupRequestEvent (Lnet/mamoe/mirai/Bot;JJJZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun solveMemberJoinRequestEvent (Lnet/mamoe/mirai/Bot;JJLjava/lang/String;JLjava/lang/Boolean;ZLjava/lang/String;)V\n\tpublic abstract fun solveMemberJoinRequestEvent (Lnet/mamoe/mirai/Bot;JJLjava/lang/String;JLjava/lang/Boolean;ZLjava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun solveMemberJoinRequestEvent$default (Lnet/mamoe/mirai/LowLevelApiAccessor;Lnet/mamoe/mirai/Bot;JJLjava/lang/String;JLjava/lang/Boolean;ZLjava/lang/String;ILjava/lang/Object;)V\n\tpublic static synthetic fun solveMemberJoinRequestEvent$default (Lnet/mamoe/mirai/LowLevelApiAccessor;Lnet/mamoe/mirai/Bot;JJLjava/lang/String;JLjava/lang/Boolean;ZLjava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun solveNewFriendRequestEvent (Lnet/mamoe/mirai/Bot;JJLjava/lang/String;ZZ)V\n\tpublic abstract fun solveNewFriendRequestEvent (Lnet/mamoe/mirai/Bot;JJLjava/lang/String;ZZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/Mirai {\n\tpublic static final fun getInstance ()Lnet/mamoe/mirai/IMirai;\n\tpublic static final synthetic fun recallMessage (Lnet/mamoe/mirai/IMirai;Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/message/data/MessageChain;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/_MiraiInstance {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/_MiraiInstance;\n\tpublic static final fun get ()Lnet/mamoe/mirai/IMirai;\n\tpublic static final fun set (Lnet/mamoe/mirai/IMirai;)V\n}\n\npublic abstract class net/mamoe/mirai/auth/AuthReason {\n\tpublic abstract fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getMessage ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/auth/AuthReason$FastLoginError : net/mamoe/mirai/auth/AuthReason {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getMessage ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/auth/AuthReason$ForceOffline : net/mamoe/mirai/auth/AuthReason {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getMessage ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/auth/AuthReason$FreshLogin : net/mamoe/mirai/auth/AuthReason {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getMessage ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/auth/AuthReason$MsfOffline : net/mamoe/mirai/auth/AuthReason {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getMessage ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/auth/AuthReason$NetworkError : net/mamoe/mirai/auth/AuthReason {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getMessage ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/auth/AuthReason$Unknown : net/mamoe/mirai/auth/AuthReason {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getCause ()Ljava/lang/Throwable;\n\tpublic fun getMessage ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/auth/BotAuthInfo {\n\tpublic abstract fun getConfiguration ()Lnet/mamoe/mirai/utils/BotConfiguration;\n\tpublic abstract fun getDeviceInfo ()Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic abstract fun getId ()J\n\tpublic abstract fun getReason ()Lnet/mamoe/mirai/auth/AuthReason;\n\tpublic abstract fun isFirstLogin ()Z\n}\n\npublic abstract interface class net/mamoe/mirai/auth/BotAuthResult {\n}\n\npublic abstract interface class net/mamoe/mirai/auth/BotAuthSession {\n\tpublic abstract fun authByPassword (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun authByPassword ([BLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun authByQRCode (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/auth/BotAuthorization {\n\tpublic static final field Companion Lnet/mamoe/mirai/auth/BotAuthorization$Companion;\n\tpublic abstract fun authorize (Lnet/mamoe/mirai/auth/BotAuthSession;Lnet/mamoe/mirai/auth/BotAuthInfo;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun byPassword (Ljava/lang/String;)Lnet/mamoe/mirai/auth/BotAuthorization;\n\tpublic static fun byPassword ([B)Lnet/mamoe/mirai/auth/BotAuthorization;\n\tpublic static fun byQRCode ()Lnet/mamoe/mirai/auth/BotAuthorization;\n\tpublic fun calculateSecretsKey (Lnet/mamoe/mirai/auth/BotAuthInfo;)[B\n}\n\npublic final class net/mamoe/mirai/auth/BotAuthorization$Companion {\n\tpublic final fun byPassword (Ljava/lang/String;)Lnet/mamoe/mirai/auth/BotAuthorization;\n\tpublic final fun byPassword ([B)Lnet/mamoe/mirai/auth/BotAuthorization;\n\tpublic final fun byQRCode ()Lnet/mamoe/mirai/auth/BotAuthorization;\n\tpublic final fun invoke (Lkotlin/jvm/functions/Function3;)Lnet/mamoe/mirai/auth/BotAuthorization;\n}\n\npublic abstract interface class net/mamoe/mirai/auth/QRCodeLoginListener {\n\tpublic fun getQrCodeEcLevel ()I\n\tpublic fun getQrCodeMargin ()I\n\tpublic fun getQrCodeSize ()I\n\tpublic fun getQrCodeStateUpdateInterval ()J\n\tpublic fun onCompleted ()V\n\tpublic abstract fun onFetchQRCode (Lnet/mamoe/mirai/Bot;[B)V\n\tpublic fun onIntervalLoop ()V\n\tpublic abstract fun onStateChanged (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/auth/QRCodeLoginListener$State;)V\n}\n\npublic final class net/mamoe/mirai/auth/QRCodeLoginListener$State : java/lang/Enum {\n\tpublic static final field CANCELLED Lnet/mamoe/mirai/auth/QRCodeLoginListener$State;\n\tpublic static final field CONFIRMED Lnet/mamoe/mirai/auth/QRCodeLoginListener$State;\n\tpublic static final field DEFAULT Lnet/mamoe/mirai/auth/QRCodeLoginListener$State;\n\tpublic static final field TIMEOUT Lnet/mamoe/mirai/auth/QRCodeLoginListener$State;\n\tpublic static final field WAITING_FOR_CONFIRM Lnet/mamoe/mirai/auth/QRCodeLoginListener$State;\n\tpublic static final field WAITING_FOR_SCAN Lnet/mamoe/mirai/auth/QRCodeLoginListener$State;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/auth/QRCodeLoginListener$State;\n\tpublic static fun values ()[Lnet/mamoe/mirai/auth/QRCodeLoginListener$State;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/AnonymousMember : net/mamoe/mirai/contact/Member {\n\tpublic abstract fun getAnonymousId ()Ljava/lang/String;\n\tpublic fun nudge ()Lnet/mamoe/mirai/message/action/MemberNudge;\n\tpublic synthetic fun nudge ()Lnet/mamoe/mirai/message/action/Nudge;\n\tpublic synthetic fun nudge ()Lnet/mamoe/mirai/message/action/UserNudge;\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendMessage$suspendImpl (Lnet/mamoe/mirai/contact/AnonymousMember;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendMessage$suspendImpl (Lnet/mamoe/mirai/contact/AnonymousMember;Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun uploadImage (Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadImage$suspendImpl (Lnet/mamoe/mirai/contact/AnonymousMember;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/AudioSupported : net/mamoe/mirai/contact/Contact {\n\tpublic fun uploadAudio (Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/data/OfflineAudio;\n\tpublic abstract fun uploadAudio (Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/AvatarSpec : java/lang/Enum, java/lang/Comparable {\n\tpublic static final field LARGE Lnet/mamoe/mirai/contact/AvatarSpec;\n\tpublic static final field LARGEST Lnet/mamoe/mirai/contact/AvatarSpec;\n\tpublic static final field MEDIUM Lnet/mamoe/mirai/contact/AvatarSpec;\n\tpublic static final field ORIGINAL Lnet/mamoe/mirai/contact/AvatarSpec;\n\tpublic static final field SMALL Lnet/mamoe/mirai/contact/AvatarSpec;\n\tpublic static final field SMALLEST Lnet/mamoe/mirai/contact/AvatarSpec;\n\tpublic final fun getSize ()I\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/contact/AvatarSpec;\n\tpublic static fun values ()[Lnet/mamoe/mirai/contact/AvatarSpec;\n}\n\npublic final class net/mamoe/mirai/contact/BotIsBeingMutedException : net/mamoe/mirai/contact/SendMessageFailedException {\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/contact/Group;)V\n\tpublic fun getMessage ()Ljava/lang/String;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Group;\n}\n\npublic final class net/mamoe/mirai/contact/ClientKind : java/lang/Enum {\n\tpublic static final field ANDROID_PAD Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field AOL_CHAOJIHUIYUAN Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field AOL_HUIYUAN Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field AOL_SQQ Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field CAR Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/ClientKind$Companion;\n\tpublic static final field HRTX_IPHONE Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field HRTX_PC Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MC_3G Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MISRO_MSG Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_ANDROID Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_ANDROID_NEW Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_HD Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_HD_NEW Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_IPAD Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_IPAD_NEW Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_IPHONE Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_OTHER Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_PC_QQ Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_PC_TIM Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field MOBILE_WINPHONE_NEW Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field QQ_FORELDER Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field QQ_SERVICE Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field TV_QQ Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field WIN8 Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static final field WINPHONE Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic final fun getId ()I\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic static fun values ()[Lnet/mamoe/mirai/contact/ClientKind;\n}\n\npublic final class net/mamoe/mirai/contact/ClientKind$Companion {\n}\n\npublic abstract interface class net/mamoe/mirai/contact/Contact : kotlinx/coroutines/CoroutineScope, net/mamoe/mirai/contact/ContactOrBot {\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/Contact$Companion;\n\tpublic abstract fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getId ()J\n\tpublic static fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendImage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendImage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic abstract fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendMessage$suspendImpl (Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun uploadImage (Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic abstract fun uploadImage (Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun uploadShortVideo (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ExternalResource;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ShortVideo;\n\tpublic abstract fun uploadShortVideo (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ExternalResource;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadShortVideo$default (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ExternalResource;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ShortVideo;\n\tpublic static synthetic fun uploadShortVideo$default (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ExternalResource;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/Contact$Companion {\n\tpublic final fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun sendImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun sendImage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendImage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendImage$default (Lnet/mamoe/mirai/contact/Contact$Companion;Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendImage$default (Lnet/mamoe/mirai/contact/Contact$Companion;Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun sendImage$default (Lnet/mamoe/mirai/contact/Contact$Companion;Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendImage$default (Lnet/mamoe/mirai/contact/Contact$Companion;Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun uploadImage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadImage$default (Lnet/mamoe/mirai/contact/Contact$Companion;Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static synthetic fun uploadImage$default (Lnet/mamoe/mirai/contact/Contact$Companion;Lnet/mamoe/mirai/contact/Contact;Ljava/io/File;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadImage$default (Lnet/mamoe/mirai/contact/Contact$Companion;Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static synthetic fun uploadImage$default (Lnet/mamoe/mirai/contact/Contact$Companion;Lnet/mamoe/mirai/contact/Contact;Ljava/io/InputStream;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/ContactKt {\n\tpublic static final synthetic fun recallMessage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/message/data/MessageChain;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun recallMessage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/message/data/MessageSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/ContactList : java/util/Collection, kotlin/jvm/internal/markers/KMappedMarker {\n\tpublic final field delegate Ljava/util/Collection;\n\tpublic synthetic fun add (Ljava/lang/Object;)Z\n\tpublic fun add (Lnet/mamoe/mirai/contact/Contact;)Z\n\tpublic fun addAll (Ljava/util/Collection;)Z\n\tpublic fun clear ()V\n\tpublic final fun contains (J)Z\n\tpublic final fun contains (Ljava/lang/Object;)Z\n\tpublic fun contains (Lnet/mamoe/mirai/contact/Contact;)Z\n\tpublic fun containsAll (Ljava/util/Collection;)Z\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun get (J)Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun getOrFail (J)Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSize ()I\n\tpublic fun hashCode ()I\n\tpublic fun isEmpty ()Z\n\tpublic fun iterator ()Ljava/util/Iterator;\n\tpublic final fun remove (J)Z\n\tpublic fun remove (Ljava/lang/Object;)Z\n\tpublic fun removeAll (Ljava/util/Collection;)Z\n\tpublic fun removeIf (Ljava/util/function/Predicate;)Z\n\tpublic fun retainAll (Ljava/util/Collection;)Z\n\tpublic final fun size ()I\n\tpublic fun toArray ()[Ljava/lang/Object;\n\tpublic fun toArray ([Ljava/lang/Object;)[Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/ContactOrBot : kotlinx/coroutines/CoroutineScope {\n\tpublic fun getAvatarUrl ()Ljava/lang/String;\n\tpublic fun getAvatarUrl (Lnet/mamoe/mirai/contact/AvatarSpec;)Ljava/lang/String;\n\tpublic abstract fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getId ()J\n}\n\npublic final class net/mamoe/mirai/contact/ExceptionsKt {\n\tpublic static final fun getBotMuteRemaining (Lnet/mamoe/mirai/contact/BotIsBeingMutedException;)I\n}\n\npublic abstract interface class net/mamoe/mirai/contact/FileSupported : net/mamoe/mirai/contact/Contact {\n\tpublic abstract fun getFiles ()Lnet/mamoe/mirai/contact/file/RemoteFiles;\n\tpublic abstract fun getFilesRoot ()Lnet/mamoe/mirai/utils/RemoteFile;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/Friend : kotlinx/coroutines/CoroutineScope, net/mamoe/mirai/contact/AudioSupported, net/mamoe/mirai/contact/User, net/mamoe/mirai/contact/roaming/RoamingSupported {\n\tpublic fun delete ()V\n\tpublic abstract fun delete (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun getFriendGroup ()Lnet/mamoe/mirai/contact/friendgroup/FriendGroup;\n\tpublic abstract fun getRemark ()Ljava/lang/String;\n\tpublic fun nudge ()Lnet/mamoe/mirai/message/action/FriendNudge;\n\tpublic synthetic fun nudge ()Lnet/mamoe/mirai/message/action/Nudge;\n\tpublic synthetic fun nudge ()Lnet/mamoe/mirai/message/action/UserNudge;\n\tpublic fun sendMessage (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic abstract fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendMessage$suspendImpl (Lnet/mamoe/mirai/contact/Friend;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun setRemark (Ljava/lang/String;)V\n}\n\npublic abstract interface class net/mamoe/mirai/contact/Group : kotlinx/coroutines/CoroutineScope, net/mamoe/mirai/contact/AudioSupported, net/mamoe/mirai/contact/Contact, net/mamoe/mirai/contact/FileSupported, net/mamoe/mirai/contact/roaming/RoamingSupported {\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/Group$Companion;\n\tpublic fun avatarUrl (Lnet/mamoe/mirai/contact/AvatarSpec;)Ljava/lang/String;\n\tpublic abstract fun contains (J)Z\n\tpublic fun contains (Lnet/mamoe/mirai/contact/NormalMember;)Z\n\tpublic abstract fun get (J)Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic abstract fun getActive ()Lnet/mamoe/mirai/contact/active/GroupActive;\n\tpublic abstract fun getAnnouncements ()Lnet/mamoe/mirai/contact/announcement/Announcements;\n\tpublic fun getAvatarUrl ()Ljava/lang/String;\n\tpublic synthetic fun getAvatarUrl (Lnet/mamoe/mirai/contact/AvatarSpec;)Ljava/lang/String;\n\tpublic abstract fun getBotAsMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun getBotMuteRemaining ()I\n\tpublic fun getBotPermission ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic abstract fun getEssences ()Lnet/mamoe/mirai/contact/essence/Essences;\n\tpublic abstract fun getId ()J\n\tpublic abstract fun getMembers ()Lnet/mamoe/mirai/contact/ContactList;\n\tpublic abstract fun getName ()Ljava/lang/String;\n\tpublic fun getOrFail (J)Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic abstract fun getOwner ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic abstract fun getSettings ()Lnet/mamoe/mirai/contact/GroupSettings;\n\tpublic fun quit ()Z\n\tpublic abstract fun quit (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic abstract fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendMessage$suspendImpl (Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun setEssenceMessage (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/message/data/MessageChain;)Z\n\tpublic static fun setEssenceMessage (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/message/data/MessageChain;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun setEssenceMessage (Lnet/mamoe/mirai/message/data/MessageSource;)Z\n\tpublic abstract fun setEssenceMessage (Lnet/mamoe/mirai/message/data/MessageSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun setName (Ljava/lang/String;)V\n\tpublic synthetic fun uploadVoice (Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/data/Voice;\n\tpublic abstract synthetic fun uploadVoice (Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/Group$Companion {\n\tpublic final fun setEssenceMessage (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/message/data/MessageChain;)Z\n\tpublic final fun setEssenceMessage (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/message/data/MessageChain;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/GroupKt {\n\tpublic static final synthetic fun getMember (Lnet/mamoe/mirai/contact/Group;J)Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic static final synthetic fun getMemberOrFail (Lnet/mamoe/mirai/contact/Group;J)Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic static final fun isBotMuted (Lnet/mamoe/mirai/contact/Group;)Z\n}\n\npublic abstract interface class net/mamoe/mirai/contact/GroupSettings {\n\tpublic abstract synthetic fun getEntranceAnnouncement ()Ljava/lang/String;\n\tpublic abstract fun isAllowMemberInvite ()Z\n\tpublic abstract fun isAnonymousChatEnabled ()Z\n\tpublic abstract fun isAutoApproveEnabled ()Z\n\tpublic abstract fun isMuteAll ()Z\n\tpublic abstract fun setAllowMemberInvite (Z)V\n\tpublic abstract fun setAnonymousChatEnabled (Z)V\n\tpublic abstract synthetic fun setEntranceAnnouncement (Ljava/lang/String;)V\n\tpublic abstract fun setMuteAll (Z)V\n}\n\npublic abstract interface class net/mamoe/mirai/contact/Member : net/mamoe/mirai/contact/User {\n\tpublic abstract fun getActive ()Lnet/mamoe/mirai/contact/active/MemberActive;\n\tpublic abstract fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic abstract fun getNameCard ()Ljava/lang/String;\n\tpublic abstract fun getPermission ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic fun getRankTitle ()Ljava/lang/String;\n\tpublic abstract fun getSpecialTitle ()Ljava/lang/String;\n\tpublic fun getTemperatureTitle ()Ljava/lang/String;\n\tpublic fun mute (I)V\n\tpublic abstract fun mute (ILkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun nudge ()Lnet/mamoe/mirai/message/action/MemberNudge;\n\tpublic fun sendMessage (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic abstract fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic abstract fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/MemberKt {\n\tpublic static final fun asFriend (Lnet/mamoe/mirai/contact/Member;)Lnet/mamoe/mirai/contact/Friend;\n\tpublic static final fun asFriendOrNull (Lnet/mamoe/mirai/contact/Member;)Lnet/mamoe/mirai/contact/Friend;\n\tpublic static final fun asStranger (Lnet/mamoe/mirai/contact/Member;)Lnet/mamoe/mirai/contact/Stranger;\n\tpublic static final fun asStrangerOrNull (Lnet/mamoe/mirai/contact/Member;)Lnet/mamoe/mirai/contact/Stranger;\n\tpublic static final fun getNameCardOrNick (Lnet/mamoe/mirai/contact/Member;)Ljava/lang/String;\n\tpublic static final fun isFriend (Lnet/mamoe/mirai/contact/Member;)Z\n\tpublic static final fun isStranger (Lnet/mamoe/mirai/contact/Member;)Z\n}\n\npublic final class net/mamoe/mirai/contact/MemberPermission : java/lang/Enum, java/lang/Comparable {\n\tpublic static final field ADMINISTRATOR Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic static final field MEMBER Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic static final field OWNER Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic final fun getLevel ()I\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic static fun values ()[Lnet/mamoe/mirai/contact/MemberPermission;\n}\n\npublic final class net/mamoe/mirai/contact/MemberPermissionKt {\n\tpublic static final fun checkBotPermission (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/MemberPermission;Lkotlin/jvm/functions/Function0;)V\n\tpublic static synthetic fun checkBotPermission$default (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/MemberPermission;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)V\n\tpublic static final fun isAdministrator (Lnet/mamoe/mirai/contact/Member;)Z\n\tpublic static final fun isOperator (Lnet/mamoe/mirai/contact/Member;)Z\n\tpublic static final fun isOwner (Lnet/mamoe/mirai/contact/Member;)Z\n}\n\npublic final class net/mamoe/mirai/contact/MessageTooLargeException : net/mamoe/mirai/contact/SendMessageFailedException {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/message/data/Message;Lnet/mamoe/mirai/message/data/Message;Ljava/lang/String;)V\n\tpublic fun getMessage ()Ljava/lang/String;\n\tpublic final fun getMessageAfterEvent ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/NormalMember : net/mamoe/mirai/contact/Member {\n\tpublic abstract fun getJoinTimestamp ()I\n\tpublic abstract fun getLastSpeakTimestamp ()I\n\tpublic abstract fun getMuteTimeRemaining ()I\n\tpublic abstract fun getNameCard ()Ljava/lang/String;\n\tpublic abstract fun getSpecialTitle ()Ljava/lang/String;\n\tpublic fun isMuted ()Z\n\tpublic fun kick (Ljava/lang/String;)V\n\tpublic fun kick (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun kick (Ljava/lang/String;Z)V\n\tpublic abstract fun kick (Ljava/lang/String;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun kick$suspendImpl (Lnet/mamoe/mirai/contact/NormalMember;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun modifyAdmin (Z)V\n\tpublic abstract fun modifyAdmin (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun nudge ()Lnet/mamoe/mirai/message/action/MemberNudge;\n\tpublic synthetic fun nudge ()Lnet/mamoe/mirai/message/action/Nudge;\n\tpublic synthetic fun nudge ()Lnet/mamoe/mirai/message/action/UserNudge;\n\tpublic fun sendMessage (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic abstract fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendMessage$suspendImpl (Lnet/mamoe/mirai/contact/NormalMember;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun setNameCard (Ljava/lang/String;)V\n\tpublic abstract fun setSpecialTitle (Ljava/lang/String;)V\n\tpublic fun unmute ()V\n\tpublic abstract fun unmute (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/NormalMemberKt {\n\tpublic static final fun getNameCardOrNick (Lnet/mamoe/mirai/contact/User;)Ljava/lang/String;\n\tpublic static final fun getNameCardOrNick (Lnet/mamoe/mirai/contact/UserOrBot;)Ljava/lang/String;\n\tpublic static final fun isMuted (Lnet/mamoe/mirai/contact/NormalMember;)Z\n\tpublic static final fun mute-8Mi8wO0 (Lnet/mamoe/mirai/contact/NormalMember;JLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun mute-fcu0wV4 (Lnet/mamoe/mirai/contact/NormalMember;JLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/OtherClient : net/mamoe/mirai/contact/Contact {\n\tpublic abstract fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getId ()J\n\tpublic abstract fun getInfo ()Lnet/mamoe/mirai/contact/OtherClientInfo;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendMessage$suspendImpl (Lnet/mamoe/mirai/contact/OtherClient;Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun uploadImage (Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadImage$suspendImpl (Lnet/mamoe/mirai/contact/OtherClient;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/OtherClientInfo {\n\tpublic final fun component1 ()I\n\tpublic final fun component2 ()Lnet/mamoe/mirai/contact/Platform;\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun component4 ()Ljava/lang/String;\n\tpublic final fun copy (ILnet/mamoe/mirai/contact/Platform;Ljava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/contact/OtherClientInfo;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/contact/OtherClientInfo;ILnet/mamoe/mirai/contact/Platform;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/contact/OtherClientInfo;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getAppId ()I\n\tpublic final fun getDeviceKind ()Ljava/lang/String;\n\tpublic final fun getDeviceName ()Ljava/lang/String;\n\tpublic final fun getPlatform ()Lnet/mamoe/mirai/contact/Platform;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/contact/OtherClientKt {\n\tpublic static final fun getDeviceKind (Lnet/mamoe/mirai/contact/OtherClient;)Ljava/lang/String;\n\tpublic static final fun getDeviceName (Lnet/mamoe/mirai/contact/OtherClient;)Ljava/lang/String;\n\tpublic static final fun getPlatform (Lnet/mamoe/mirai/contact/OtherClient;)Lnet/mamoe/mirai/contact/Platform;\n}\n\npublic final class net/mamoe/mirai/contact/PermissionDeniedException : java/lang/IllegalStateException {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic final class net/mamoe/mirai/contact/Platform : java/lang/Enum {\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/Platform$Companion;\n\tpublic static final field IOS Lnet/mamoe/mirai/contact/Platform;\n\tpublic static final field MOBILE Lnet/mamoe/mirai/contact/Platform;\n\tpublic static final field WINDOWS Lnet/mamoe/mirai/contact/Platform;\n\tpublic final fun getPlatformId ()I\n\tpublic final fun getTerminalId ()I\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/contact/Platform;\n\tpublic static fun values ()[Lnet/mamoe/mirai/contact/Platform;\n}\n\npublic final class net/mamoe/mirai/contact/Platform$Companion {\n}\n\npublic class net/mamoe/mirai/contact/SendMessageFailedException : java/lang/RuntimeException {\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/contact/SendMessageFailedException$Reason;Lnet/mamoe/mirai/message/data/Message;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun getOriginalMessage ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic final fun getReason ()Lnet/mamoe/mirai/contact/SendMessageFailedException$Reason;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n}\n\npublic final class net/mamoe/mirai/contact/SendMessageFailedException$Reason : java/lang/Enum {\n\tpublic static final field AT_ALL_LIMITED Lnet/mamoe/mirai/contact/SendMessageFailedException$Reason;\n\tpublic static final field BOT_MUTED Lnet/mamoe/mirai/contact/SendMessageFailedException$Reason;\n\tpublic static final field GROUP_CHAT_LIMITED Lnet/mamoe/mirai/contact/SendMessageFailedException$Reason;\n\tpublic static final field LIMITED_MESSAGING Lnet/mamoe/mirai/contact/SendMessageFailedException$Reason;\n\tpublic static final field MESSAGE_TOO_LARGE Lnet/mamoe/mirai/contact/SendMessageFailedException$Reason;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/contact/SendMessageFailedException$Reason;\n\tpublic static fun values ()[Lnet/mamoe/mirai/contact/SendMessageFailedException$Reason;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/Stranger : kotlinx/coroutines/CoroutineScope, net/mamoe/mirai/contact/User {\n\tpublic fun delete ()V\n\tpublic abstract fun delete (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic synthetic fun nudge ()Lnet/mamoe/mirai/message/action/Nudge;\n\tpublic fun nudge ()Lnet/mamoe/mirai/message/action/StrangerNudge;\n\tpublic synthetic fun nudge ()Lnet/mamoe/mirai/message/action/UserNudge;\n\tpublic fun sendMessage (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic abstract fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendMessage$suspendImpl (Lnet/mamoe/mirai/contact/Stranger;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/StrangerKt {\n\tpublic static final fun asFriend (Lnet/mamoe/mirai/contact/Stranger;)Lnet/mamoe/mirai/contact/Friend;\n\tpublic static final fun asFriendOrNull (Lnet/mamoe/mirai/contact/Stranger;)Lnet/mamoe/mirai/contact/Friend;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/User : kotlinx/coroutines/CoroutineScope, net/mamoe/mirai/contact/Contact, net/mamoe/mirai/contact/UserOrBot {\n\tpublic abstract fun getId ()J\n\tpublic abstract fun getRemark ()Ljava/lang/String;\n\tpublic abstract fun nudge ()Lnet/mamoe/mirai/message/action/UserNudge;\n\tpublic fun queryProfile ()Lnet/mamoe/mirai/data/UserProfile;\n\tpublic fun queryProfile (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun queryProfile$suspendImpl (Lnet/mamoe/mirai/contact/User;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic fun sendMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendMessage (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic abstract fun sendMessage (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendMessage$suspendImpl (Lnet/mamoe/mirai/contact/User;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/UserKt {\n\tpublic static final fun getRemarkOrNameCard (Lnet/mamoe/mirai/contact/Member;)Ljava/lang/String;\n\tpublic static final fun getRemarkOrNameCardOrNick (Lnet/mamoe/mirai/contact/Member;)Ljava/lang/String;\n\tpublic static final fun getRemarkOrNick (Lnet/mamoe/mirai/contact/User;)Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/UserOrBot : net/mamoe/mirai/contact/ContactOrBot {\n\tpublic abstract fun getNick ()Ljava/lang/String;\n\tpublic abstract fun nudge ()Lnet/mamoe/mirai/message/action/Nudge;\n}\n\npublic final class net/mamoe/mirai/contact/active/ActiveChart {\n\tpublic final fun getActives ()Ljava/util/Map;\n\tpublic final fun getExit ()Ljava/util/Map;\n\tpublic final fun getJoin ()Ljava/util/Map;\n\tpublic final fun getMembers ()Ljava/util/Map;\n\tpublic final fun getSentences ()Ljava/util/Map;\n}\n\npublic final class net/mamoe/mirai/contact/active/ActiveHonorInfo {\n\tpublic final fun getAvatar ()Ljava/lang/String;\n\tpublic final fun getHistoryDays ()I\n\tpublic final fun getMaxTermDays ()I\n\tpublic final fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getMemberId ()J\n\tpublic final fun getMemberName ()Ljava/lang/String;\n\tpublic final fun getTermDays ()I\n}\n\npublic final class net/mamoe/mirai/contact/active/ActiveHonorList {\n\tpublic final fun getCurrent ()Lnet/mamoe/mirai/contact/active/ActiveHonorInfo;\n\tpublic final fun getRecords ()Ljava/util/List;\n\tpublic final fun getType ()I\n}\n\npublic final class net/mamoe/mirai/contact/active/ActiveRankRecord {\n\tpublic final fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getMemberId ()J\n\tpublic final fun getMemberName ()Ljava/lang/String;\n\tpublic final fun getScore ()I\n\tpublic final fun getTemperature ()I\n}\n\npublic final class net/mamoe/mirai/contact/active/ActiveRecord {\n\tpublic final fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getMemberId ()J\n\tpublic final fun getMemberName ()Ljava/lang/String;\n\tpublic final fun getMessagesCount ()I\n\tpublic final fun getPeriodDays ()I\n}\n\npublic abstract interface class net/mamoe/mirai/contact/active/GroupActive : net/mamoe/mirai/utils/Streamable {\n\tpublic abstract fun getRankTitles ()Ljava/util/Map;\n\tpublic abstract fun getTemperatureTitles ()Ljava/util/Map;\n\tpublic abstract fun isHonorVisible ()Z\n\tpublic abstract fun isTemperatureVisible ()Z\n\tpublic abstract fun isTitleVisible ()Z\n\tpublic fun queryActiveRank ()Ljava/util/List;\n\tpublic abstract fun queryActiveRank (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun queryChart ()Lnet/mamoe/mirai/contact/active/ActiveChart;\n\tpublic abstract fun queryChart (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun queryHonorHistory (ILkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun refresh ()V\n\tpublic abstract fun refresh (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun setHonorVisible (Z)V\n\tpublic abstract fun setHonorVisible (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun setRankTitles (Ljava/util/Map;)V\n\tpublic abstract fun setRankTitles (Ljava/util/Map;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun setTemperatureTitles (Ljava/util/Map;)V\n\tpublic abstract fun setTemperatureTitles (Ljava/util/Map;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun setTemperatureVisible (Z)V\n\tpublic abstract fun setTemperatureVisible (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun setTitleVisible (Z)V\n\tpublic abstract fun setTitleVisible (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/active/MemberActive {\n\tpublic abstract fun getHonors ()Ljava/util/Set;\n\tpublic abstract fun getPoint ()I\n\tpublic abstract fun getRank ()I\n\tpublic abstract fun getTemperature ()I\n\tpublic fun queryMedal ()Lnet/mamoe/mirai/contact/active/MemberMedalInfo;\n\tpublic abstract fun queryMedal (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/active/MemberMedalInfo {\n\tpublic final fun getColor ()Ljava/lang/String;\n\tpublic final fun getMedals ()Ljava/util/Set;\n\tpublic final fun getTitle ()Ljava/lang/String;\n\tpublic final fun getWearing ()Lnet/mamoe/mirai/contact/active/MemberMedalType;\n}\n\npublic final class net/mamoe/mirai/contact/active/MemberMedalType : java/lang/Enum {\n\tpublic static final field ACTIVE Lnet/mamoe/mirai/contact/active/MemberMedalType;\n\tpublic static final field ADMIN Lnet/mamoe/mirai/contact/active/MemberMedalType;\n\tpublic static final field OWNER Lnet/mamoe/mirai/contact/active/MemberMedalType;\n\tpublic static final field SPECIAL Lnet/mamoe/mirai/contact/active/MemberMedalType;\n\tpublic final fun getMask ()I\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/contact/active/MemberMedalType;\n\tpublic static fun values ()[Lnet/mamoe/mirai/contact/active/MemberMedalType;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/announcement/Announcement {\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/announcement/Announcement$Companion;\n\tpublic abstract fun getContent ()Ljava/lang/String;\n\tpublic abstract fun getParameters ()Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;\n\tpublic static fun publishAnnouncement (Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;)Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;\n\tpublic static fun publishAnnouncement (Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun publishAnnouncement (Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;)Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;\n\tpublic static fun publishAnnouncement (Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun publishTo (Lnet/mamoe/mirai/contact/Group;)Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;\n\tpublic fun publishTo (Lnet/mamoe/mirai/contact/Group;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun publishTo$suspendImpl (Lnet/mamoe/mirai/contact/announcement/Announcement;Lnet/mamoe/mirai/contact/Group;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/Announcement$Companion {\n\tpublic final fun publishAnnouncement (Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;)Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;\n\tpublic final fun publishAnnouncement (Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final synthetic fun publishAnnouncement (Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun publishAnnouncement (Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;)Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;\n\tpublic final fun publishAnnouncement (Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun publishAnnouncement$default (Lnet/mamoe/mirai/contact/announcement/Announcement$Companion;Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;ILjava/lang/Object;)Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;\n\tpublic static synthetic fun publishAnnouncement$default (Lnet/mamoe/mirai/contact/announcement/Announcement$Companion;Lnet/mamoe/mirai/contact/Group;Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/AnnouncementImage {\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/announcement/AnnouncementImage$Companion;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (ILjava/lang/String;IILkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;IILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic static final fun create (Ljava/lang/String;II)Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getHeight ()I\n\tpublic final fun getId ()Ljava/lang/String;\n\tpublic final fun getUrl ()Ljava/lang/String;\n\tpublic final fun getWidth ()I\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/contact/announcement/AnnouncementImage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/contact/announcement/AnnouncementImage$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/AnnouncementImage$Companion {\n\tpublic final fun create (Ljava/lang/String;II)Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/AnnouncementKt {\n\tpublic static final fun toOffline (Lnet/mamoe/mirai/contact/announcement/Announcement;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/AnnouncementParameters {\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters$Companion;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic fun <init> ()V\n\tpublic synthetic fun <init> (ILnet/mamoe/mirai/contact/announcement/AnnouncementImage;ZZZZZLkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic final fun builder ()Lnet/mamoe/mirai/contact/announcement/AnnouncementParametersBuilder;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic static final fun getDefault ()Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;\n\tpublic final fun getImage ()Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;\n\tpublic final fun getRequireConfirmation ()Z\n\tpublic final fun getSendToNewMember ()Z\n\tpublic final fun getShowEditCard ()Z\n\tpublic final fun getShowPopup ()Z\n\tpublic fun hashCode ()I\n\tpublic final fun isPinned ()Z\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/contact/announcement/AnnouncementParameters$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/AnnouncementParameters$Companion {\n\tpublic final fun getDefault ()Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/AnnouncementParametersBuilder {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun build ()Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;\n\tpublic final fun image ()Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;\n\tpublic final fun image (Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;)Lnet/mamoe/mirai/contact/announcement/AnnouncementParametersBuilder;\n\tpublic final fun isPinned ()Z\n\tpublic final fun isPinned (Z)Lnet/mamoe/mirai/contact/announcement/AnnouncementParametersBuilder;\n\tpublic final fun requireConfirmation ()Z\n\tpublic final fun requireConfirmation (Z)Lnet/mamoe/mirai/contact/announcement/AnnouncementParametersBuilder;\n\tpublic final fun sendToNewMember ()Z\n\tpublic final fun sendToNewMember (Z)Lnet/mamoe/mirai/contact/announcement/AnnouncementParametersBuilder;\n\tpublic final synthetic fun setImage (Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;)V\n\tpublic final synthetic fun setPinned (Z)V\n\tpublic final synthetic fun setRequireConfirmation (Z)V\n\tpublic final synthetic fun setSendToNewMember (Z)V\n\tpublic final synthetic fun setShowEditCard (Z)V\n\tpublic final synthetic fun setShowPopup (Z)V\n\tpublic final fun showEditCard ()Z\n\tpublic final fun showEditCard (Z)Lnet/mamoe/mirai/contact/announcement/AnnouncementParametersBuilder;\n\tpublic final fun showPopup ()Z\n\tpublic final fun showPopup (Z)Lnet/mamoe/mirai/contact/announcement/AnnouncementParametersBuilder;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/AnnouncementParametersBuilderKt {\n\tpublic static final fun buildAnnouncementParameters (Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/announcement/Announcements : net/mamoe/mirai/utils/Streamable {\n\tpublic synthetic fun asFlow (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun asFlow (Lnet/mamoe/mirai/contact/announcement/Announcements;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun delete (Ljava/lang/String;)Z\n\tpublic abstract fun delete (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun get (Ljava/lang/String;)Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;\n\tpublic abstract fun get (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun members (Ljava/lang/String;Z)Ljava/util/List;\n\tpublic abstract fun members (Ljava/lang/String;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun publish (Lnet/mamoe/mirai/contact/announcement/Announcement;)Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;\n\tpublic abstract fun publish (Lnet/mamoe/mirai/contact/announcement/Announcement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun remind (Ljava/lang/String;)V\n\tpublic abstract fun remind (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun uploadImage (Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;\n\tpublic abstract fun uploadImage (Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/announcement/OfflineAnnouncement : net/mamoe/mirai/contact/announcement/Announcement {\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement$Companion;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic static fun create (Ljava/lang/String;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n\tpublic static fun create (Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n\tpublic static fun from (Lnet/mamoe/mirai/contact/announcement/Announcement;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/OfflineAnnouncement$Companion {\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic final fun create (Ljava/lang/String;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n\tpublic final synthetic fun create (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n\tpublic final fun create (Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n\tpublic static synthetic fun create$default (Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement$Companion;Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;ILjava/lang/Object;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n\tpublic final fun from (Lnet/mamoe/mirai/contact/announcement/Announcement;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/OfflineAnnouncementKt {\n\tpublic static final fun OfflineAnnouncement (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n\tpublic static final fun OfflineAnnouncement (Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n\tpublic static final fun OfflineAnnouncement (Lnet/mamoe/mirai/contact/announcement/Announcement;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n\tpublic static synthetic fun OfflineAnnouncement$default (Ljava/lang/String;Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;ILjava/lang/Object;)Lnet/mamoe/mirai/contact/announcement/OfflineAnnouncement;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/announcement/OnlineAnnouncement : net/mamoe/mirai/contact/announcement/Announcement {\n\tpublic fun delete ()Z\n\tpublic fun delete (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun delete$suspendImpl (Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun getAllConfirmed ()Z\n\tpublic abstract fun getConfirmedMembersCount ()I\n\tpublic abstract fun getFid ()Ljava/lang/String;\n\tpublic abstract fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic abstract fun getPublicationTime ()J\n\tpublic abstract fun getSender ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic abstract fun getSenderId ()J\n\tpublic fun members (Z)Ljava/util/List;\n\tpublic fun members (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun members$suspendImpl (Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun remind ()V\n\tpublic fun remind (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun remind$suspendImpl (Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/announcement/OnlineAnnouncementKt {\n\tpublic static final fun getBot (Lnet/mamoe/mirai/contact/announcement/OnlineAnnouncement;)Lnet/mamoe/mirai/Bot;\n}\n\npublic final class net/mamoe/mirai/contact/essence/EssenceMessageRecord {\n\tpublic final fun getFullSource ()Lnet/mamoe/mirai/message/data/MessageSource;\n\tpublic final fun getFullSource (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun getOperator ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getOperatorId ()J\n\tpublic final fun getOperatorNick ()Ljava/lang/String;\n\tpublic final fun getOperatorTime ()I\n\tpublic final fun getSender ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getSenderId ()J\n\tpublic final fun getSenderNick ()Ljava/lang/String;\n\tpublic final fun getSenderTime ()I\n\tpublic final fun getSource ()Lnet/mamoe/mirai/message/data/MessageSource;\n\tpublic final fun getSource (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/essence/Essences : net/mamoe/mirai/utils/Streamable {\n\tpublic fun getPage (II)Ljava/util/List;\n\tpublic abstract fun getPage (IILkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun remove (Lnet/mamoe/mirai/message/data/MessageSource;)V\n\tpublic abstract fun remove (Lnet/mamoe/mirai/message/data/MessageSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun share (Lnet/mamoe/mirai/message/data/MessageSource;)Ljava/lang/String;\n\tpublic abstract fun share (Lnet/mamoe/mirai/message/data/MessageSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/file/AbsoluteFile : net/mamoe/mirai/contact/file/AbsoluteFileFolder {\n\tpublic abstract fun getExpiryTime ()J\n\tpublic abstract fun getMd5 ()[B\n\tpublic abstract fun getSha1 ()[B\n\tpublic abstract fun getSize ()J\n\tpublic fun getUrl ()Ljava/lang/String;\n\tpublic abstract fun getUrl (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun moveTo (Lnet/mamoe/mirai/contact/file/AbsoluteFolder;)Z\n\tpublic abstract fun moveTo (Lnet/mamoe/mirai/contact/file/AbsoluteFolder;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun refreshed ()Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic abstract fun refreshed (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun toMessage ()Lnet/mamoe/mirai/message/data/FileMessage;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/file/AbsoluteFileFolder {\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/file/AbsoluteFileFolder$Companion;\n\tpublic fun delete ()Z\n\tpublic abstract fun delete (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun exists ()Z\n\tpublic abstract fun exists (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun getAbsolutePath ()Ljava/lang/String;\n\tpublic abstract fun getContact ()Lnet/mamoe/mirai/contact/FileSupported;\n\tpublic static fun getExtension (Lnet/mamoe/mirai/contact/file/AbsoluteFileFolder;)Ljava/lang/String;\n\tpublic abstract fun getId ()Ljava/lang/String;\n\tpublic abstract fun getLastModifiedTime ()J\n\tpublic abstract fun getName ()Ljava/lang/String;\n\tpublic static fun getNameWithoutExtension (Lnet/mamoe/mirai/contact/file/AbsoluteFileFolder;)Ljava/lang/String;\n\tpublic abstract fun getParent ()Lnet/mamoe/mirai/contact/file/AbsoluteFolder;\n\tpublic abstract fun getUploadTime ()J\n\tpublic abstract fun getUploaderId ()J\n\tpublic abstract fun isFile ()Z\n\tpublic abstract fun isFolder ()Z\n\tpublic fun refresh ()Z\n\tpublic abstract fun refresh (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun refreshed ()Lnet/mamoe/mirai/contact/file/AbsoluteFileFolder;\n\tpublic abstract fun refreshed (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun renameTo (Ljava/lang/String;)Z\n\tpublic abstract fun renameTo (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/contact/file/AbsoluteFileFolder$Companion {\n\tpublic final fun getExtension (Lnet/mamoe/mirai/contact/file/AbsoluteFileFolder;)Ljava/lang/String;\n\tpublic final fun getNameWithoutExtension (Lnet/mamoe/mirai/contact/file/AbsoluteFileFolder;)Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/file/AbsoluteFolder : net/mamoe/mirai/contact/file/AbsoluteFileFolder {\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/file/AbsoluteFolder$Companion;\n\tpublic static final field ROOT_FOLDER_ID Ljava/lang/String;\n\tpublic fun children ()Lkotlinx/coroutines/flow/Flow;\n\tpublic abstract fun children (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun childrenStream ()Ljava/util/stream/Stream;\n\tpublic abstract fun childrenStream (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun createFolder (Ljava/lang/String;)Lnet/mamoe/mirai/contact/file/AbsoluteFolder;\n\tpublic abstract fun createFolder (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun files ()Lkotlinx/coroutines/flow/Flow;\n\tpublic abstract fun files (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun filesStream ()Ljava/util/stream/Stream;\n\tpublic abstract fun filesStream (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun folders ()Lkotlinx/coroutines/flow/Flow;\n\tpublic abstract fun folders (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun foldersStream ()Ljava/util/stream/Stream;\n\tpublic abstract fun foldersStream (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun getContentsCount ()I\n\tpublic fun isEmpty ()Z\n\tpublic fun refreshed ()Lnet/mamoe/mirai/contact/file/AbsoluteFolder;\n\tpublic abstract fun refreshed (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun resolveAll (Ljava/lang/String;)Lkotlinx/coroutines/flow/Flow;\n\tpublic abstract fun resolveAll (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun resolveAllStream (Ljava/lang/String;)Ljava/util/stream/Stream;\n\tpublic abstract fun resolveAllStream (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun resolveFileById (Ljava/lang/String;)Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic fun resolveFileById (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun resolveFileById (Ljava/lang/String;Z)Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic abstract fun resolveFileById (Ljava/lang/String;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun resolveFileById$default (Lnet/mamoe/mirai/contact/file/AbsoluteFolder;Ljava/lang/String;ZILjava/lang/Object;)Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic static synthetic fun resolveFileById$default (Lnet/mamoe/mirai/contact/file/AbsoluteFolder;Ljava/lang/String;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun resolveFiles (Ljava/lang/String;)Lkotlinx/coroutines/flow/Flow;\n\tpublic abstract fun resolveFiles (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun resolveFilesStream (Ljava/lang/String;)Ljava/util/stream/Stream;\n\tpublic abstract fun resolveFilesStream (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun resolveFolder (Ljava/lang/String;)Lnet/mamoe/mirai/contact/file/AbsoluteFolder;\n\tpublic abstract fun resolveFolder (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun resolveFolderById (Ljava/lang/String;)Lnet/mamoe/mirai/contact/file/AbsoluteFolder;\n\tpublic abstract fun resolveFolderById (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun uploadNewFile (Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic fun uploadNewFile (Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun uploadNewFile (Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ProgressionCallback;)Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic abstract fun uploadNewFile (Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadNewFile$default (Lnet/mamoe/mirai/contact/file/AbsoluteFolder;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic static synthetic fun uploadNewFile$default (Lnet/mamoe/mirai/contact/file/AbsoluteFolder;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/contact/file/AbsoluteFolder$Companion {\n\tpublic static final field ROOT_FOLDER_ID Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/file/RemoteFiles {\n\tpublic abstract fun getContact ()Lnet/mamoe/mirai/contact/FileSupported;\n\tpublic abstract fun getRoot ()Lnet/mamoe/mirai/contact/file/AbsoluteFolder;\n\tpublic fun uploadNewFile (Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic fun uploadNewFile (Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun uploadNewFile (Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ProgressionCallback;)Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic fun uploadNewFile (Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadNewFile$default (Lnet/mamoe/mirai/contact/file/RemoteFiles;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic static synthetic fun uploadNewFile$default (Lnet/mamoe/mirai/contact/file/RemoteFiles;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadNewFile$suspendImpl (Lnet/mamoe/mirai/contact/file/RemoteFiles;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/friendgroup/FriendGroup {\n\tpublic fun delete ()Z\n\tpublic abstract fun delete (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun getCount ()I\n\tpublic abstract fun getFriends ()Ljava/util/Collection;\n\tpublic abstract fun getId ()I\n\tpublic abstract fun getName ()Ljava/lang/String;\n\tpublic fun moveIn (Lnet/mamoe/mirai/contact/Friend;)Z\n\tpublic abstract fun moveIn (Lnet/mamoe/mirai/contact/Friend;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun renameTo (Ljava/lang/String;)Z\n\tpublic abstract fun renameTo (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/friendgroup/FriendGroups {\n\tpublic abstract fun asCollection ()Ljava/util/Collection;\n\tpublic fun create (Ljava/lang/String;)Lnet/mamoe/mirai/contact/friendgroup/FriendGroup;\n\tpublic abstract fun create (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun get (I)Lnet/mamoe/mirai/contact/friendgroup/FriendGroup;\n\tpublic fun getDefault ()Lnet/mamoe/mirai/contact/friendgroup/FriendGroup;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/roaming/RoamingMessage {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getContact ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic abstract fun getIds ()[I\n\tpublic abstract fun getInternalIds ()[I\n\tpublic abstract fun getSender ()J\n\tpublic abstract fun getTarget ()J\n\tpublic abstract fun getTime ()J\n}\n\npublic abstract interface class net/mamoe/mirai/contact/roaming/RoamingMessageFilter {\n\tpublic static final field ANY Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;\n\tpublic static final field Companion Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter$Companion;\n\tpublic static final field RECEIVED Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;\n\tpublic static final field SENT Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;\n\tpublic fun and (Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;)Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;\n\tpublic abstract fun invoke (Lnet/mamoe/mirai/contact/roaming/RoamingMessage;)Z\n\tpublic fun not ()Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;\n\tpublic fun or (Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;)Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;\n}\n\npublic final class net/mamoe/mirai/contact/roaming/RoamingMessageFilter$Companion {\n}\n\npublic abstract interface class net/mamoe/mirai/contact/roaming/RoamingMessages {\n\tpublic fun getAllMessages (Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;)Lkotlinx/coroutines/flow/Flow;\n\tpublic fun getAllMessages (Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun getAllMessages$default (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow;\n\tpublic static synthetic fun getAllMessages$default (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun getAllMessages$suspendImpl (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun getAllMessagesStream ()Ljava/util/stream/Stream;\n\tpublic fun getAllMessagesStream (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun getAllMessagesStream (Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;)Ljava/util/stream/Stream;\n\tpublic fun getAllMessagesStream (Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun getAllMessagesStream$default (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;ILjava/lang/Object;)Ljava/util/stream/Stream;\n\tpublic static synthetic fun getAllMessagesStream$default (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun getAllMessagesStream$suspendImpl (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;Lnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun getMessagesIn (JJLnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;)Lkotlinx/coroutines/flow/Flow;\n\tpublic abstract fun getMessagesIn (JJLnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun getMessagesIn$default (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;JJLnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow;\n\tpublic static synthetic fun getMessagesIn$default (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;JJLnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun getMessagesStream (JJ)Ljava/util/stream/Stream;\n\tpublic fun getMessagesStream (JJLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun getMessagesStream (JJLnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;)Ljava/util/stream/Stream;\n\tpublic fun getMessagesStream (JJLnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun getMessagesStream$default (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;JJLnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;ILjava/lang/Object;)Ljava/util/stream/Stream;\n\tpublic static synthetic fun getMessagesStream$default (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;JJLnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun getMessagesStream$suspendImpl (Lnet/mamoe/mirai/contact/roaming/RoamingMessages;JJLnet/mamoe/mirai/contact/roaming/RoamingMessageFilter;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/contact/roaming/RoamingSupported : net/mamoe/mirai/contact/Contact {\n\tpublic abstract fun getRoamingMessages ()Lnet/mamoe/mirai/contact/roaming/RoamingMessages;\n}\n\npublic abstract interface class net/mamoe/mirai/data/FriendInfo : net/mamoe/mirai/data/UserInfo {\n\tpublic abstract fun getFriendGroupId ()I\n\tpublic abstract fun getNick ()Ljava/lang/String;\n\tpublic abstract fun getRemark ()Ljava/lang/String;\n\tpublic abstract fun getUin ()J\n\tpublic abstract fun setRemark (Ljava/lang/String;)V\n}\n\npublic class net/mamoe/mirai/data/FriendInfoImpl : net/mamoe/mirai/data/FriendInfo {\n\tpublic fun <init> (JLjava/lang/String;Ljava/lang/String;)V\n\tpublic fun getFriendGroupId ()I\n\tpublic fun getNick ()Ljava/lang/String;\n\tpublic fun getRemark ()Ljava/lang/String;\n\tpublic fun getUin ()J\n\tpublic fun setFriendGroupId (I)V\n\tpublic fun setNick (Ljava/lang/String;)V\n\tpublic fun setRemark (Ljava/lang/String;)V\n}\n\npublic final class net/mamoe/mirai/data/GroupHonorType {\n\tpublic static final field BRONZE_ID I\n\tpublic static final field Companion Lnet/mamoe/mirai/data/GroupHonorType$Companion;\n\tpublic static final field EMOTION_ID I\n\tpublic static final field GOLDEN_ID I\n\tpublic static final field LEGEND_ID I\n\tpublic static final field PERFORMER_ID I\n\tpublic static final field RED_PACKET_ID I\n\tpublic static final field RICHER_ID I\n\tpublic static final field SILVER_ID I\n\tpublic static final field STRONG_NEWBIE_ID I\n\tpublic static final field TALKATIVE_ID I\n\tpublic static final field WHIRLWIND_ID I\n\tpublic static final synthetic fun box-impl (I)Lnet/mamoe/mirai/data/GroupHonorType;\n\tpublic static fun constructor-impl (I)I\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic static fun equals-impl (ILjava/lang/Object;)Z\n\tpublic static final fun equals-impl0 (II)Z\n\tpublic static final fun getBRONZE-AVr_HNQ ()I\n\tpublic static final fun getEMOTION-AVr_HNQ ()I\n\tpublic static final fun getGOLDEN-AVr_HNQ ()I\n\tpublic final fun getId ()I\n\tpublic static final fun getLEGEND-AVr_HNQ ()I\n\tpublic static final fun getPERFORMER-AVr_HNQ ()I\n\tpublic static final fun getRED_PACKET-AVr_HNQ ()I\n\tpublic static final fun getRICHER-AVr_HNQ ()I\n\tpublic static final fun getSILVER-AVr_HNQ ()I\n\tpublic static final fun getSTRONG_NEWBIE-AVr_HNQ ()I\n\tpublic static final fun getTALKATIVE-AVr_HNQ ()I\n\tpublic static final fun getWHIRLWIND-AVr_HNQ ()I\n\tpublic fun hashCode ()I\n\tpublic static fun hashCode-impl (I)I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static fun toString-impl (I)Ljava/lang/String;\n\tpublic final synthetic fun unbox-impl ()I\n}\n\npublic final class net/mamoe/mirai/data/GroupHonorType$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/data/GroupHonorType$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize-NYH6FXw (Lkotlinx/serialization/encoding/Decoder;)I\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize-aLnpm_Q (Lkotlinx/serialization/encoding/Encoder;I)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/data/GroupHonorType$Companion {\n\tpublic final fun getBRONZE-AVr_HNQ ()I\n\tpublic final fun getEMOTION-AVr_HNQ ()I\n\tpublic final fun getGOLDEN-AVr_HNQ ()I\n\tpublic final fun getLEGEND-AVr_HNQ ()I\n\tpublic final fun getPERFORMER-AVr_HNQ ()I\n\tpublic final fun getRED_PACKET-AVr_HNQ ()I\n\tpublic final fun getRICHER-AVr_HNQ ()I\n\tpublic final fun getSILVER-AVr_HNQ ()I\n\tpublic final fun getSTRONG_NEWBIE-AVr_HNQ ()I\n\tpublic final fun getTALKATIVE-AVr_HNQ ()I\n\tpublic final fun getWHIRLWIND-AVr_HNQ ()I\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract interface class net/mamoe/mirai/data/GroupInfo {\n\tpublic abstract fun getAllowAnonymousChat ()Z\n\tpublic abstract fun getAllowMemberInvite ()Z\n\tpublic abstract fun getAutoApprove ()Z\n\tpublic abstract fun getBotMuteTimestamp ()I\n\tpublic abstract fun getConfessTalk ()Z\n\tpublic abstract fun getGroupCode ()J\n\tpublic abstract fun getMemo ()Ljava/lang/String;\n\tpublic abstract fun getMuteAll ()Z\n\tpublic abstract fun getName ()Ljava/lang/String;\n\tpublic abstract fun getOwner ()J\n\tpublic abstract fun getRankTitles ()Ljava/util/Map;\n\tpublic abstract fun getTemperatureTitles ()Ljava/util/Map;\n\tpublic abstract fun getUin ()J\n\tpublic abstract fun isHonorVisible ()Z\n\tpublic abstract fun isTemperatureVisible ()Z\n\tpublic abstract fun isTitleVisible ()Z\n}\n\npublic abstract interface class net/mamoe/mirai/data/MemberInfo : net/mamoe/mirai/data/UserInfo {\n\tpublic fun getAnonymousId ()Ljava/lang/String;\n\tpublic abstract fun getHonors ()Ljava/util/Set;\n\tpublic abstract fun getJoinTimestamp ()I\n\tpublic abstract fun getLastSpeakTimestamp ()I\n\tpublic abstract fun getMuteTimestamp ()I\n\tpublic abstract fun getNameCard ()Ljava/lang/String;\n\tpublic abstract fun getPermission ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic abstract fun getPoint ()I\n\tpublic abstract fun getRank ()I\n\tpublic abstract fun getSpecialTitle ()Ljava/lang/String;\n\tpublic abstract fun getTemperature ()I\n\tpublic abstract fun isOfficialBot ()Z\n}\n\npublic final class net/mamoe/mirai/data/OnlineStatus : java/lang/Enum {\n\tpublic static final field AWAY Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic static final field BUSY Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic static final field Companion Lnet/mamoe/mirai/data/OnlineStatus$Companion;\n\tpublic static final field DND Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic static final field INVISIBLE Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic static final field OFFLINE Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic static final field ONLINE Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic static final field Q_ME Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic static final field RECEIVE_OFFLINE_MESSAGE Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic static final field UNKNOWN Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic final fun getId ()I\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic static fun values ()[Lnet/mamoe/mirai/data/OnlineStatus;\n}\n\npublic final class net/mamoe/mirai/data/OnlineStatus$Companion {\n\tpublic final fun ofId (I)Lnet/mamoe/mirai/data/OnlineStatus;\n\tpublic final fun ofIdOrNull (I)Lnet/mamoe/mirai/data/OnlineStatus;\n}\n\npublic abstract class net/mamoe/mirai/data/RequestEventData {\n\tpublic static final field Factory Lnet/mamoe/mirai/data/RequestEventData$Factory;\n\tpublic synthetic fun <init> (ILkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun accept (Lnet/mamoe/mirai/Bot;)V\n\tpublic abstract fun accept (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final fun from (Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest;\n\tpublic static final fun from (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;\n\tpublic static final fun from (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest;\n\tpublic abstract fun getEventId ()J\n\tpublic fun reject (Lnet/mamoe/mirai/Bot;)V\n\tpublic abstract fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/data/RequestEventData;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest : net/mamoe/mirai/data/RequestEventData {\n\tpublic static final field Companion Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest$Companion;\n\tpublic synthetic fun <init> (IJJLjava/lang/String;JLjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun accept (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun getEventId ()J\n\tpublic final fun getGroupId ()J\n\tpublic final fun getGroupName ()Ljava/lang/String;\n\tpublic final fun getInvitor ()J\n\tpublic final fun getInvitorNick ()Ljava/lang/String;\n\tpublic fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/data/RequestEventData$Factory {\n\tpublic final fun from (Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest;\n\tpublic final fun from (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;\n\tpublic final fun from (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/data/RequestEventData$MemberJoinRequest : net/mamoe/mirai/data/RequestEventData {\n\tpublic static final field Companion Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest$Companion;\n\tpublic synthetic fun <init> (IJJLjava/lang/String;JLjava/lang/String;JLjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic synthetic fun <init> (JJLjava/lang/String;JLjava/lang/String;JLjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun accept (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun getEventId ()J\n\tpublic final fun getGroupId ()J\n\tpublic final fun getGroupName ()Ljava/lang/String;\n\tpublic final fun getInvitor ()J\n\tpublic final fun getMessage ()Ljava/lang/String;\n\tpublic final fun getRequester ()J\n\tpublic final fun getRequesterNick ()Ljava/lang/String;\n\tpublic final fun reject (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun reject (Lnet/mamoe/mirai/Bot;ZLjava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun reject (Lnet/mamoe/mirai/Bot;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun reject$default (Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;Lnet/mamoe/mirai/Bot;ZLjava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/data/RequestEventData$MemberJoinRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/data/RequestEventData$MemberJoinRequest$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/data/RequestEventData$NewFriendRequest : net/mamoe/mirai/data/RequestEventData {\n\tpublic static final field Companion Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest$Companion;\n\tpublic synthetic fun <init> (IJJLjava/lang/String;JLjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun accept (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun getEventId ()J\n\tpublic final fun getFromGroupId ()J\n\tpublic final fun getMessage ()Ljava/lang/String;\n\tpublic final fun getRequester ()J\n\tpublic final fun getRequesterNick ()Ljava/lang/String;\n\tpublic fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun reject (Lnet/mamoe/mirai/Bot;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/data/RequestEventData$NewFriendRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/data/RequestEventData$NewFriendRequest$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract interface class net/mamoe/mirai/data/StrangerInfo : net/mamoe/mirai/data/UserInfo {\n\tpublic abstract fun getFromGroup ()J\n\tpublic abstract fun getNick ()Ljava/lang/String;\n\tpublic abstract fun getUin ()J\n}\n\npublic abstract interface class net/mamoe/mirai/data/UserInfo {\n\tpublic abstract fun getNick ()Ljava/lang/String;\n\tpublic abstract fun getRemark ()Ljava/lang/String;\n\tpublic abstract fun getUin ()J\n}\n\npublic abstract interface class net/mamoe/mirai/data/UserProfile {\n\tpublic abstract fun getAge ()I\n\tpublic abstract fun getEmail ()Ljava/lang/String;\n\tpublic abstract fun getFriendGroupId ()I\n\tpublic abstract fun getNickname ()Ljava/lang/String;\n\tpublic abstract fun getQLevel ()I\n\tpublic abstract fun getSex ()Lnet/mamoe/mirai/data/UserProfile$Sex;\n\tpublic abstract fun getSign ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/data/UserProfile$Sex : java/lang/Enum {\n\tpublic static final field FEMALE Lnet/mamoe/mirai/data/UserProfile$Sex;\n\tpublic static final field MALE Lnet/mamoe/mirai/data/UserProfile$Sex;\n\tpublic static final field UNKNOWN Lnet/mamoe/mirai/data/UserProfile$Sex;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/data/UserProfile$Sex;\n\tpublic static fun values ()[Lnet/mamoe/mirai/data/UserProfile$Sex;\n}\n\npublic abstract class net/mamoe/mirai/event/AbstractEvent : net/mamoe/mirai/event/Event {\n\tpublic field _intercepted Z\n\tpublic final field broadCastLock Lkotlinx/coroutines/sync/Mutex;\n\tpublic fun <init> ()V\n\tpublic final fun cancel ()V\n\tpublic fun intercept ()V\n\tpublic final fun isCancelled ()Z\n\tpublic fun isIntercepted ()Z\n}\n\npublic abstract interface class net/mamoe/mirai/event/BroadcastControllable : net/mamoe/mirai/event/Event {\n\tpublic fun getShouldBroadcast ()Z\n}\n\npublic abstract interface class net/mamoe/mirai/event/CancellableEvent : net/mamoe/mirai/event/Event {\n\tpublic abstract fun cancel ()V\n\tpublic abstract fun isCancelled ()Z\n}\n\npublic final class net/mamoe/mirai/event/ConcurrencyKind : java/lang/Enum {\n\tpublic static final field CONCURRENT Lnet/mamoe/mirai/event/ConcurrencyKind;\n\tpublic static final field LOCKED Lnet/mamoe/mirai/event/ConcurrencyKind;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/event/ConcurrencyKind;\n\tpublic static fun values ()[Lnet/mamoe/mirai/event/ConcurrencyKind;\n}\n\npublic abstract interface class net/mamoe/mirai/event/Event {\n\tpublic abstract fun intercept ()V\n\tpublic abstract fun isIntercepted ()Z\n}\n\npublic abstract class net/mamoe/mirai/event/EventChannel {\n\tpublic static synthetic fun asChannel$default (Lnet/mamoe/mirai/event/EventChannel;ILkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;ILjava/lang/Object;)Lkotlinx/coroutines/channels/Channel;\n\tpublic abstract fun asFlow ()Lkotlinx/coroutines/flow/Flow;\n\tpublic abstract fun context ([Lkotlin/coroutines/CoroutineContext;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic final fun exceptionHandler (Ljava/util/function/Consumer;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic final fun exceptionHandler (Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic final fun exceptionHandler (Lkotlinx/coroutines/CoroutineExceptionHandler;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic final fun filter (Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic final synthetic fun filter (Lkotlin/jvm/functions/Function2;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic final fun filterIsInstance (Ljava/lang/Class;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic final fun filterIsInstance (Lkotlin/reflect/KClass;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic final fun forwardToChannel (Lkotlinx/coroutines/channels/SendChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/EventPriority;)Lnet/mamoe/mirai/event/Listener;\n\tpublic static synthetic fun forwardToChannel$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlinx/coroutines/channels/SendChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/EventPriority;ILjava/lang/Object;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun getBaseEventClass ()Lkotlin/reflect/KClass;\n\tpublic final fun getDefaultCoroutineContext ()Lkotlin/coroutines/CoroutineContext;\n\tpublic final fun parentJob (Lkotlinx/coroutines/Job;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic final fun parentScope (Lkotlinx/coroutines/CoroutineScope;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic final fun registerListenerHost (Lnet/mamoe/mirai/event/ListenerHost;)V\n\tpublic final fun registerListenerHost (Lnet/mamoe/mirai/event/ListenerHost;Lkotlin/coroutines/CoroutineContext;)V\n\tpublic static synthetic fun registerListenerHost$default (Lnet/mamoe/mirai/event/EventChannel;Lnet/mamoe/mirai/event/ListenerHost;Lkotlin/coroutines/CoroutineContext;ILjava/lang/Object;)V\n\tpublic final fun subscribe (Ljava/lang/Class;Ljava/util/function/Function;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribe (Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Ljava/util/function/Function;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribe (Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Ljava/util/function/Function;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribe (Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Ljava/util/function/Function;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final synthetic fun subscribe (Lkotlin/reflect/KClass;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function3;)Lnet/mamoe/mirai/event/Listener;\n\tpublic static synthetic fun subscribe$default (Lnet/mamoe/mirai/event/EventChannel;Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Ljava/util/function/Function;ILjava/lang/Object;)Lnet/mamoe/mirai/event/Listener;\n\tpublic static synthetic fun subscribe$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/reflect/KClass;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribeAlways (Ljava/lang/Class;Ljava/util/function/Consumer;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribeAlways (Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Ljava/util/function/Consumer;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribeAlways (Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Ljava/util/function/Consumer;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribeAlways (Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Ljava/util/function/Consumer;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final synthetic fun subscribeAlways (Lkotlin/reflect/KClass;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function3;)Lnet/mamoe/mirai/event/Listener;\n\tpublic static synthetic fun subscribeAlways$default (Lnet/mamoe/mirai/event/EventChannel;Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Ljava/util/function/Consumer;ILjava/lang/Object;)Lnet/mamoe/mirai/event/Listener;\n\tpublic static synthetic fun subscribeAlways$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/reflect/KClass;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribeOnce (Ljava/lang/Class;Ljava/util/function/Consumer;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribeOnce (Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Ljava/util/function/Consumer;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribeOnce (Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Ljava/util/function/Consumer;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribeOnce (Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Ljava/util/function/Consumer;)Lnet/mamoe/mirai/event/Listener;\n\tpublic final fun subscribeOnce (Lkotlin/reflect/KClass;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function3;)Lnet/mamoe/mirai/event/Listener;\n\tpublic static synthetic fun subscribeOnce$default (Lnet/mamoe/mirai/event/EventChannel;Ljava/lang/Class;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Ljava/util/function/Consumer;ILjava/lang/Object;)Lnet/mamoe/mirai/event/Listener;\n\tpublic static synthetic fun subscribeOnce$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/reflect/KClass;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lnet/mamoe/mirai/event/Listener;\n}\n\npublic final class net/mamoe/mirai/event/EventChannelKt {\n\tpublic static final synthetic fun globalEventChannel (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic static synthetic fun globalEventChannel$default (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;ILjava/lang/Object;)Lnet/mamoe/mirai/event/EventChannel;\n}\n\npublic abstract interface annotation class net/mamoe/mirai/event/EventHandler : java/lang/annotation/Annotation {\n\tpublic abstract fun concurrency ()Lnet/mamoe/mirai/event/ConcurrencyKind;\n\tpublic abstract fun ignoreCancelled ()Z\n\tpublic abstract fun priority ()Lnet/mamoe/mirai/event/EventPriority;\n}\n\npublic final class net/mamoe/mirai/event/EventKt {\n\tpublic static final fun broadcast (Lnet/mamoe/mirai/event/Event;)Lnet/mamoe/mirai/event/Event;\n\tpublic static final fun broadcast (Lnet/mamoe/mirai/event/Event;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/event/EventPriority : java/lang/Enum {\n\tpublic static final field HIGH Lnet/mamoe/mirai/event/EventPriority;\n\tpublic static final field HIGHEST Lnet/mamoe/mirai/event/EventPriority;\n\tpublic static final field LOW Lnet/mamoe/mirai/event/EventPriority;\n\tpublic static final field LOWEST Lnet/mamoe/mirai/event/EventPriority;\n\tpublic static final field MONITOR Lnet/mamoe/mirai/event/EventPriority;\n\tpublic static final field NORMAL Lnet/mamoe/mirai/event/EventPriority;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/event/EventPriority;\n\tpublic static fun values ()[Lnet/mamoe/mirai/event/EventPriority;\n}\n\npublic final class net/mamoe/mirai/event/Events {\n\tpublic static final synthetic fun registerTo (Lkotlinx/coroutines/CoroutineScope;Lnet/mamoe/mirai/event/EventChannel;)V\n}\n\npublic final class net/mamoe/mirai/event/ExceptionInEventChannelFilterException : java/lang/IllegalStateException {\n\tpublic fun <init> (Lnet/mamoe/mirai/event/Event;Lnet/mamoe/mirai/event/EventChannel;Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/event/Event;Lnet/mamoe/mirai/event/EventChannel;Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getCause ()Ljava/lang/Throwable;\n\tpublic final fun getEvent ()Lnet/mamoe/mirai/event/Event;\n\tpublic final fun getEventChannel ()Lnet/mamoe/mirai/event/EventChannel;\n\tpublic fun getMessage ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/ExceptionInEventHandlerException : java/lang/IllegalStateException {\n\tpublic fun <init> (Lnet/mamoe/mirai/event/Event;Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/event/Event;Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getCause ()Ljava/lang/Throwable;\n\tpublic final fun getEvent ()Lnet/mamoe/mirai/event/Event;\n\tpublic fun getMessage ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/ExtensionsKt {\n\tpublic static final fun nextEventImpl (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/reflect/KClass;Lkotlinx/coroutines/CoroutineScope;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final fun syncFromEventImpl (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/reflect/KClass;Lkotlinx/coroutines/CoroutineScope;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/event/GlobalEventChannel : net/mamoe/mirai/event/EventChannel {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/event/GlobalEventChannel;\n\tpublic fun asFlow ()Lkotlinx/coroutines/flow/Flow;\n\tpublic fun context ([Lkotlin/coroutines/CoroutineContext;)Lnet/mamoe/mirai/event/EventChannel;\n}\n\npublic abstract interface class net/mamoe/mirai/event/Listener : kotlinx/coroutines/CompletableJob {\n\tpublic abstract fun getConcurrencyKind ()Lnet/mamoe/mirai/event/ConcurrencyKind;\n\tpublic fun getPriority ()Lnet/mamoe/mirai/event/EventPriority;\n\tpublic abstract fun onEvent (Lnet/mamoe/mirai/event/Event;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/event/Listener$DefaultImpls {\n\tpublic static synthetic fun cancel (Lnet/mamoe/mirai/event/Listener;)V\n\tpublic static fun fold (Lnet/mamoe/mirai/event/Listener;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;\n\tpublic static fun get (Lnet/mamoe/mirai/event/Listener;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element;\n\tpublic static fun minusKey (Lnet/mamoe/mirai/event/Listener;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext;\n\tpublic static fun plus (Lnet/mamoe/mirai/event/Listener;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext;\n\tpublic static fun plus (Lnet/mamoe/mirai/event/Listener;Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/Job;\n}\n\npublic abstract interface class net/mamoe/mirai/event/ListenerHost {\n}\n\npublic final class net/mamoe/mirai/event/ListeningStatus : java/lang/Enum {\n\tpublic static final field LISTENING Lnet/mamoe/mirai/event/ListeningStatus;\n\tpublic static final field STOPPED Lnet/mamoe/mirai/event/ListeningStatus;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/event/ListeningStatus;\n\tpublic static fun values ()[Lnet/mamoe/mirai/event/ListeningStatus;\n}\n\npublic abstract interface annotation class net/mamoe/mirai/event/MessageDsl : java/lang/annotation/Annotation {\n}\n\npublic abstract class net/mamoe/mirai/event/MessageSelectBuilder : net/mamoe/mirai/event/MessageSelectBuilderUnit {\n\tpublic fun <init> (Lnet/mamoe/mirai/event/events/MessageEvent;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V\n\tpublic synthetic fun always (Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic synthetic fun always (Lkotlin/jvm/functions/Function3;)Ljava/lang/Void;\n\tpublic synthetic fun containsReply (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;\n\tpublic synthetic fun containsReply (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Void;\n\tpublic synthetic fun containsReply (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic synthetic fun containsReply (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Ljava/lang/Void;\n\tpublic synthetic fun endsWithReply (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic synthetic fun endsWithReply (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Ljava/lang/Void;\n\tpublic synthetic fun findingReply (Lkotlin/text/Regex;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic synthetic fun findingReply (Lkotlin/text/Regex;Lkotlin/jvm/functions/Function3;)Ljava/lang/Void;\n\tpublic synthetic fun mapping (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic synthetic fun mapping (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;)Ljava/lang/Void;\n\tpublic synthetic fun matchingReply (Lkotlin/text/Regex;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic synthetic fun matchingReply (Lkotlin/text/Regex;Lkotlin/jvm/functions/Function3;)Ljava/lang/Void;\n\tpublic synthetic fun quoteReply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Ljava/lang/String;)Ljava/lang/Object;\n\tpublic synthetic fun quoteReply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Ljava/lang/String;)Ljava/lang/Void;\n\tpublic synthetic fun quoteReply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic synthetic fun quoteReply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lkotlin/jvm/functions/Function3;)Ljava/lang/Void;\n\tpublic synthetic fun quoteReply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/Object;\n\tpublic synthetic fun quoteReply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/Void;\n\tpublic synthetic fun quoteReply-8NSq9Eo (JLjava/lang/String;)Ljava/lang/Void;\n\tpublic synthetic fun quoteReply-8NSq9Eo (JLjava/lang/String;)V\n\tpublic synthetic fun quoteReply-8NSq9Eo (JLkotlin/jvm/functions/Function1;)Ljava/lang/Void;\n\tpublic synthetic fun quoteReply-8NSq9Eo (JLkotlin/jvm/functions/Function1;)V\n\tpublic synthetic fun quoteReply-8NSq9Eo (JLnet/mamoe/mirai/message/data/Message;)Ljava/lang/Void;\n\tpublic synthetic fun quoteReply-8NSq9Eo (JLnet/mamoe/mirai/message/data/Message;)V\n\tpublic synthetic fun reply (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;\n\tpublic synthetic fun reply (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Void;\n\tpublic synthetic fun reply (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic synthetic fun reply (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Ljava/lang/Void;\n\tpublic synthetic fun reply (Ljava/lang/String;Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/Object;\n\tpublic synthetic fun reply (Ljava/lang/String;Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/Void;\n\tpublic synthetic fun reply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Ljava/lang/String;)Ljava/lang/Object;\n\tpublic synthetic fun reply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Ljava/lang/String;)Ljava/lang/Void;\n\tpublic synthetic fun reply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic synthetic fun reply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lkotlin/jvm/functions/Function3;)Ljava/lang/Void;\n\tpublic synthetic fun reply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/Object;\n\tpublic synthetic fun reply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/Void;\n\tpublic synthetic fun reply-8NSq9Eo (JLjava/lang/String;)Ljava/lang/Void;\n\tpublic synthetic fun reply-8NSq9Eo (JLjava/lang/String;)V\n\tpublic synthetic fun reply-8NSq9Eo (JLkotlin/jvm/functions/Function1;)Ljava/lang/Void;\n\tpublic synthetic fun reply-8NSq9Eo (JLkotlin/jvm/functions/Function1;)V\n\tpublic synthetic fun reply-8NSq9Eo (JLnet/mamoe/mirai/message/data/Message;)Ljava/lang/Void;\n\tpublic synthetic fun reply-8NSq9Eo (JLnet/mamoe/mirai/message/data/Message;)V\n}\n\npublic abstract class net/mamoe/mirai/event/MessageSelectBuilderUnit : net/mamoe/mirai/event/CommonMessageSelectBuilderUnit {\n\tpublic fun <init> (Lnet/mamoe/mirai/event/events/MessageEvent;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V\n\tpublic final synthetic fun invoke-RNyhSv4 (JLkotlin/jvm/functions/Function1;)Ljava/lang/Void;\n\tpublic final synthetic fun invoke-RNyhSv4 (JLkotlin/jvm/functions/Function1;)V\n\tpublic final synthetic fun quoteReply-AVDwu3U (JLnet/mamoe/mirai/message/data/Message;)Ljava/lang/Void;\n\tpublic final synthetic fun quoteReply-AVDwu3U (JLnet/mamoe/mirai/message/data/Message;)V\n\tpublic final synthetic fun quoteReply-RNyhSv4 (JLkotlin/jvm/functions/Function1;)Ljava/lang/Void;\n\tpublic final synthetic fun quoteReply-RNyhSv4 (JLkotlin/jvm/functions/Function1;)V\n\tpublic final synthetic fun quoteReply-sCZ5gAI (JLjava/lang/String;)Ljava/lang/Void;\n\tpublic final synthetic fun quoteReply-sCZ5gAI (JLjava/lang/String;)V\n\tpublic final synthetic fun reply-AVDwu3U (JLnet/mamoe/mirai/message/data/Message;)Ljava/lang/Void;\n\tpublic final synthetic fun reply-AVDwu3U (JLnet/mamoe/mirai/message/data/Message;)V\n\tpublic final synthetic fun reply-RNyhSv4 (JLkotlin/jvm/functions/Function1;)Ljava/lang/Void;\n\tpublic final synthetic fun reply-RNyhSv4 (JLkotlin/jvm/functions/Function1;)V\n\tpublic final synthetic fun reply-sCZ5gAI (JLjava/lang/String;)Ljava/lang/Void;\n\tpublic final synthetic fun reply-sCZ5gAI (JLjava/lang/String;)V\n\tpublic final synthetic fun timeout-ncvN2qU (J)J\n}\n\npublic final class net/mamoe/mirai/event/MessageSelectionTimeoutChecker {\n\tpublic static final synthetic fun box-impl (J)Lnet/mamoe/mirai/event/MessageSelectionTimeoutChecker;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic static fun equals-impl (JLjava/lang/Object;)Z\n\tpublic static final fun equals-impl0 (JJ)Z\n\tpublic final fun getTimeoutMillis ()J\n\tpublic fun hashCode ()I\n\tpublic static fun hashCode-impl (J)I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static fun toString-impl (J)Ljava/lang/String;\n\tpublic final synthetic fun unbox-impl ()J\n}\n\npublic final class net/mamoe/mirai/event/MessageSelectionTimeoutException : java/lang/RuntimeException {\n\tpublic fun <init> ()V\n}\n\npublic class net/mamoe/mirai/event/MessageSubscribersBuilder {\n\tpublic fun always (Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final fun at (J)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun at (Lnet/mamoe/mirai/contact/User;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun atAll ()Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun atBot ()Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun atBot (Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final fun case (Ljava/lang/String;ZZ)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun case (Ljava/lang/String;ZZLkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic static synthetic fun case$default (Lnet/mamoe/mirai/event/MessageSubscribersBuilder;Ljava/lang/String;ZZILjava/lang/Object;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic static synthetic fun case$default (Lnet/mamoe/mirai/event/MessageSubscribersBuilder;Ljava/lang/String;ZZLkotlin/jvm/functions/Function3;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun contains (Ljava/lang/String;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun contains (Ljava/lang/String;Z)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun contains (Ljava/lang/String;ZZLkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic static synthetic fun contains$default (Lnet/mamoe/mirai/event/MessageSubscribersBuilder;Ljava/lang/String;ZILjava/lang/Object;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic static synthetic fun contains$default (Lnet/mamoe/mirai/event/MessageSubscribersBuilder;Ljava/lang/String;ZZLkotlin/jvm/functions/Function3;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun containsAll ([Ljava/lang/String;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun containsAll ([Ljava/lang/String;Z)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun containsAll ([Ljava/lang/String;ZZ)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic static synthetic fun containsAll$default (Lnet/mamoe/mirai/event/MessageSubscribersBuilder;[Ljava/lang/String;ZZILjava/lang/Object;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun containsAny ([Ljava/lang/String;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun containsAny ([Ljava/lang/String;Z)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun containsAny ([Ljava/lang/String;ZZ)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic static synthetic fun containsAny$default (Lnet/mamoe/mirai/event/MessageSubscribersBuilder;[Ljava/lang/String;ZZILjava/lang/Object;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic fun containsReply (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;\n\tpublic fun containsReply (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final fun content (Lkotlin/jvm/functions/Function2;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun endsWith (Ljava/lang/String;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun endsWith (Ljava/lang/String;Z)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun endsWith (Ljava/lang/String;ZZLkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic static synthetic fun endsWith$default (Lnet/mamoe/mirai/event/MessageSubscribersBuilder;Ljava/lang/String;ZILjava/lang/Object;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic static synthetic fun endsWith$default (Lnet/mamoe/mirai/event/MessageSubscribersBuilder;Ljava/lang/String;ZZLkotlin/jvm/functions/Function3;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun endsWithReply (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final fun finding (Lkotlin/text/Regex;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun finding (Lkotlin/text/Regex;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final synthetic fun findingExtension (Lkotlin/text/Regex;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic fun findingReply (Lkotlin/text/Regex;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final fun getSubscriber ()Lkotlin/jvm/functions/Function2;\n\tpublic final fun invoke (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic fun mapping (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final fun matching (Lkotlin/text/Regex;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun matching (Lkotlin/text/Regex;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final synthetic fun matchingExtension (Lkotlin/text/Regex;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic fun matchingReply (Lkotlin/text/Regex;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic fun newListeningFilter (Lkotlin/jvm/functions/Function2;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic fun quoteReply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Ljava/lang/String;)Ljava/lang/Object;\n\tpublic fun quoteReply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic fun quoteReply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/Object;\n\tpublic fun reply (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;\n\tpublic fun reply (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic fun reply (Ljava/lang/String;Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/Object;\n\tpublic fun reply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Ljava/lang/String;)Ljava/lang/Object;\n\tpublic fun reply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic fun reply (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/Object;\n\tpublic final fun sentBy (J)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentBy (JLkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final fun sentBy (Ljava/lang/String;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentBy (Lnet/mamoe/mirai/contact/User;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentByAdministrator ()Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentByFriend ()Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentByFriend (Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final fun sentByGroupTemp ()Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentByOperator ()Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentByOwner ()Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentByStranger ()Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentByStranger (Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final synthetic fun sentByTemp ()Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentFrom (J)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun sentFrom (Lnet/mamoe/mirai/contact/Group;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun startsWith (Ljava/lang/String;Z)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun startsWith (Ljava/lang/String;ZZLkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic static synthetic fun startsWith$default (Lnet/mamoe/mirai/event/MessageSubscribersBuilder;Ljava/lang/String;ZILjava/lang/Object;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic static synthetic fun startsWith$default (Lnet/mamoe/mirai/event/MessageSubscribersBuilder;Ljava/lang/String;ZZLkotlin/jvm/functions/Function3;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter {\n\tpublic final fun and (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun getFilter ()Lkotlin/jvm/functions/Function2;\n\tpublic final fun invoke (Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;\n\tpublic final fun nand (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun not ()Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun or (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n\tpublic final fun xor (Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;)Lnet/mamoe/mirai/event/MessageSubscribersBuilder$ListeningFilter;\n}\n\npublic final class net/mamoe/mirai/event/NextEventKt {\n\tpublic static final synthetic fun nextBotEventImpl (Lnet/mamoe/mirai/Bot;Lkotlin/reflect/KClass;Lkotlinx/coroutines/CoroutineScope;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun nextEventImpl (Lkotlin/reflect/KClass;Lkotlinx/coroutines/CoroutineScope;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final fun parentJob (Lnet/mamoe/mirai/event/EventChannel;Lkotlinx/coroutines/Job;)Lnet/mamoe/mirai/event/EventChannel;\n\tpublic static final synthetic fun withTimeoutOrCoroutineScope (JLkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun withTimeoutOrCoroutineScope (JLkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun withTimeoutOrCoroutineScope$default (JLkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/event/SelectKt {\n\tpublic static synthetic fun selectMessagesImpl$default (Lnet/mamoe/mirai/event/events/MessageEvent;JZZLnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static final synthetic fun withSilentTimeoutOrCoroutineScope (JLkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract class net/mamoe/mirai/event/SimpleListenerHost : kotlinx/coroutines/CoroutineScope, net/mamoe/mirai/event/ListenerHost {\n\tprotected static final field Companion Lnet/mamoe/mirai/event/SimpleListenerHost$Companion;\n\tpublic fun <init> ()V\n\tpublic fun <init> (Lkotlin/coroutines/CoroutineContext;)V\n\tpublic synthetic fun <init> (Lkotlin/coroutines/CoroutineContext;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun cancelAll ()V\n\tpublic final fun getCoroutineContext ()Lkotlin/coroutines/CoroutineContext;\n\tprotected static final fun getEvent (Ljava/lang/Throwable;)Lnet/mamoe/mirai/event/Event;\n\tprotected static final fun getRootCause (Ljava/lang/Throwable;)Ljava/lang/Throwable;\n\tpublic fun handleException (Lkotlin/coroutines/CoroutineContext;Ljava/lang/Throwable;)V\n}\n\nprotected final class net/mamoe/mirai/event/SimpleListenerHost$Companion {\n}\n\npublic final class net/mamoe/mirai/event/SubscribeMessagesKt {\n\tpublic static final fun subscribeFriendMessages (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static synthetic fun subscribeFriendMessages$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static final fun subscribeGroupMessages (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static synthetic fun subscribeGroupMessages$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static final fun subscribeGroupTempMessages (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static synthetic fun subscribeGroupTempMessages$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static final fun subscribeMessages (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static synthetic fun subscribeMessages$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static final fun subscribeOtherClientMessages (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static synthetic fun subscribeOtherClientMessages$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static final fun subscribeStrangerMessages (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static synthetic fun subscribeStrangerMessages$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static final synthetic fun subscribeTempMessages (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static synthetic fun subscribeTempMessages$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static final fun subscribeUserMessages (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static synthetic fun subscribeUserMessages$default (Lnet/mamoe/mirai/event/EventChannel;Lkotlin/coroutines/CoroutineContext;Lnet/mamoe/mirai/event/ConcurrencyKind;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/event/SyncFromEventKt {\n\tpublic static final synthetic fun syncFromEventImpl (Lkotlin/reflect/KClass;Lkotlinx/coroutines/CoroutineScope;Lnet/mamoe/mirai/event/EventPriority;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/event/events/BeforeImageUploadEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/CancellableEvent, net/mamoe/mirai/event/events/BotActiveEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/event/VerboseEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/event/events/BeforeImageUploadEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BeforeImageUploadEvent;Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BeforeImageUploadEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/BeforeShortVideoUploadEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/CancellableEvent, net/mamoe/mirai/event/events/BotActiveEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/event/VerboseEvent {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun getThumbnailSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun getVideoSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/BotActiveEvent : net/mamoe/mirai/event/events/BotEvent {\n}\n\npublic final class net/mamoe/mirai/event/events/BotAvatarChangedEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic fun <init> (Lnet/mamoe/mirai/Bot;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;)Lnet/mamoe/mirai/event/events/BotAvatarChangedEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotAvatarChangedEvent;Lnet/mamoe/mirai/Bot;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotAvatarChangedEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/BotEvent : net/mamoe/mirai/event/Event {\n\tpublic abstract fun getBot ()Lnet/mamoe/mirai/Bot;\n}\n\npublic final class net/mamoe/mirai/event/events/BotEventsKt {\n\tpublic static final synthetic fun getOperatorOrBot (Lnet/mamoe/mirai/event/events/GroupOperableEvent;)Lnet/mamoe/mirai/contact/Member;\n\tpublic static final fun getResult (Lnet/mamoe/mirai/event/events/MessagePostSendEvent;)Ljava/lang/Object;\n\tpublic static final synthetic fun getSource (Lnet/mamoe/mirai/event/events/MessagePostSendEvent;)Lnet/mamoe/mirai/message/data/MessageSource;\n\tpublic static final synthetic fun getSourceResult (Lnet/mamoe/mirai/event/events/MessagePostSendEvent;)Ljava/lang/Object;\n\tpublic static final synthetic fun isByBot (Lnet/mamoe/mirai/event/events/GroupOperableEvent;)Z\n\tpublic static final fun isByBot (Lnet/mamoe/mirai/event/events/MessageRecallEvent$FriendRecall;)Z\n\tpublic static final fun isByBot (Lnet/mamoe/mirai/event/events/MessageRecallEvent;)Z\n\tpublic static final synthetic fun isFailure (Lnet/mamoe/mirai/event/events/MessagePostSendEvent;)Z\n\tpublic static final synthetic fun isSuccess (Lnet/mamoe/mirai/event/events/MessagePostSendEvent;)Z\n}\n\npublic final class net/mamoe/mirai/event/events/BotGroupPermissionChangeEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/event/events/GroupEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/MemberPermission;Lnet/mamoe/mirai/contact/MemberPermission;)Lnet/mamoe/mirai/event/events/BotGroupPermissionChangeEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotGroupPermissionChangeEvent;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/MemberPermission;Lnet/mamoe/mirai/contact/MemberPermission;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotGroupPermissionChangeEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun getNew ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic final fun getOrigin ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BaseGroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun accept ()V\n\tpublic final fun accept (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun component2 ()J\n\tpublic final fun component3 ()J\n\tpublic final fun component4 ()J\n\tpublic final fun component5 ()Ljava/lang/String;\n\tpublic final fun component6 ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;JJJLjava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;Lnet/mamoe/mirai/Bot;JJJLjava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getEventId ()J\n\tpublic fun getGroupId ()J\n\tpublic final fun getGroupName ()Ljava/lang/String;\n\tpublic final fun getInvitor ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun getInvitorId ()J\n\tpublic final fun getInvitorNick ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic final fun ignore ()V\n\tpublic final fun ignore (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/event/events/BotJoinGroupEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/event/events/GroupEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic abstract fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n}\n\npublic abstract class net/mamoe/mirai/event/events/BotLeaveEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n}\n\npublic final class net/mamoe/mirai/event/events/BotMuteEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/event/events/GroupEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()I\n\tpublic final fun component2 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (ILnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/BotMuteEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotMuteEvent;ILnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotMuteEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getDurationSeconds ()I\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun getOperator ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/BotNickChangedEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic fun <init> (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Ljava/lang/String;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/event/events/BotNickChangedEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotNickChangedEvent;Lnet/mamoe/mirai/Bot;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotNickChangedEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getFrom ()Ljava/lang/String;\n\tpublic final fun getTo ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/event/events/BotOfflineEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotEvent {\n\tpublic fun getReconnect ()Z\n}\n\npublic final class net/mamoe/mirai/event/events/BotOfflineEvent$Active : net/mamoe/mirai/event/events/BotOfflineEvent, net/mamoe/mirai/event/events/BotActiveEvent, net/mamoe/mirai/event/events/BotOfflineEvent$CauseAware {\n\tpublic fun <init> (Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun component2 ()Ljava/lang/Throwable;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;)Lnet/mamoe/mirai/event/events/BotOfflineEvent$Active;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotOfflineEvent$Active;Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotOfflineEvent$Active;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getCause ()Ljava/lang/Throwable;\n\tpublic fun getReconnect ()Z\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/BotOfflineEvent$Dropped : net/mamoe/mirai/event/events/BotOfflineEvent, net/mamoe/mirai/event/events/BotOfflineEvent$CauseAware, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun component2 ()Ljava/lang/Throwable;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;)Lnet/mamoe/mirai/event/events/BotOfflineEvent$Dropped;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotOfflineEvent$Dropped;Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotOfflineEvent$Dropped;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getCause ()Ljava/lang/Throwable;\n\tpublic fun getReconnect ()Z\n\tpublic fun hashCode ()I\n\tpublic fun setReconnect (Z)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/BotOfflineEvent$Force : net/mamoe/mirai/event/events/BotOfflineEvent, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/event/events/BotOfflineEvent$Force;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotOfflineEvent$Force;Lnet/mamoe/mirai/Bot;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotOfflineEvent$Force;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getMessage ()Ljava/lang/String;\n\tpublic fun getReconnect ()Z\n\tpublic final fun getTitle ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun setReconnect (Z)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/BotOnlineEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotActiveEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;)Lnet/mamoe/mirai/event/events/BotOnlineEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotOnlineEvent;Lnet/mamoe/mirai/Bot;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotOnlineEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/BotPassiveEvent : net/mamoe/mirai/event/events/BotEvent {\n}\n\npublic final class net/mamoe/mirai/event/events/BotReloginEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotActiveEvent, net/mamoe/mirai/event/events/BotEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun component2 ()Ljava/lang/Throwable;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;)Lnet/mamoe/mirai/event/events/BotReloginEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotReloginEvent;Lnet/mamoe/mirai/Bot;Ljava/lang/Throwable;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotReloginEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getCause ()Ljava/lang/Throwable;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/BotUnmuteEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/event/events/GroupEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/BotUnmuteEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/BotUnmuteEvent;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/BotUnmuteEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun getOperator ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/EventCancelledException : java/lang/RuntimeException {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun <init> (Ljava/lang/Throwable;)V\n}\n\npublic final class net/mamoe/mirai/event/events/FriendAddEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/FriendEvent, net/mamoe/mirai/event/events/FriendInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Friend;)Lnet/mamoe/mirai/event/events/FriendAddEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/FriendAddEvent;Lnet/mamoe/mirai/contact/Friend;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/FriendAddEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/FriendAvatarChangedEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/FriendEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Friend;)Lnet/mamoe/mirai/event/events/FriendAvatarChangedEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/FriendAvatarChangedEvent;Lnet/mamoe/mirai/contact/Friend;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/FriendAvatarChangedEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/FriendDeleteEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/FriendEvent, net/mamoe/mirai/event/events/FriendInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Friend;)Lnet/mamoe/mirai/event/events/FriendDeleteEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/FriendDeleteEvent;Lnet/mamoe/mirai/contact/Friend;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/FriendDeleteEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/FriendEvent : net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/event/events/UserEvent {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic fun getUser ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic synthetic fun getUser ()Lnet/mamoe/mirai/contact/User;\n}\n\npublic final class net/mamoe/mirai/event/events/FriendInputStatusChangedEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/FriendEvent, net/mamoe/mirai/internal/event/VerboseEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun component2 ()Z\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Friend;Z)Lnet/mamoe/mirai/event/events/FriendInputStatusChangedEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/FriendInputStatusChangedEvent;Lnet/mamoe/mirai/contact/Friend;ZILjava/lang/Object;)Lnet/mamoe/mirai/event/events/FriendInputStatusChangedEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun getInputting ()Z\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/FriendMessageEvent : net/mamoe/mirai/event/events/AbstractMessageEvent, net/mamoe/mirai/event/events/FriendEvent, net/mamoe/mirai/event/events/UserMessageEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Friend;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSender ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic synthetic fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromFriend;\n\tpublic synthetic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getTime ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/FriendMessagePostSendEvent : net/mamoe/mirai/event/events/UserMessagePostSendEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun component3 ()Ljava/lang/Throwable;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Friend;Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/Throwable;Lnet/mamoe/mirai/message/MessageReceipt;)Lnet/mamoe/mirai/event/events/FriendMessagePostSendEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/FriendMessagePostSendEvent;Lnet/mamoe/mirai/contact/Friend;Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/Throwable;Lnet/mamoe/mirai/message/MessageReceipt;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/FriendMessagePostSendEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getException ()Ljava/lang/Throwable;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getReceipt ()Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/FriendMessagePreSendEvent : net/mamoe/mirai/event/events/UserMessagePreSendEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Friend;Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/event/events/FriendMessagePreSendEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/FriendMessagePreSendEvent;Lnet/mamoe/mirai/contact/Friend;Lnet/mamoe/mirai/message/data/Message;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/FriendMessagePreSendEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun hashCode ()I\n\tpublic fun setMessage (Lnet/mamoe/mirai/message/data/Message;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/FriendMessageSyncEvent : net/mamoe/mirai/event/events/AbstractMessageEvent, net/mamoe/mirai/event/events/FriendEvent, net/mamoe/mirai/event/events/MessageSyncEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Friend;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/OtherClient;Lnet/mamoe/mirai/contact/Friend;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getClient ()Lnet/mamoe/mirai/contact/OtherClient;\n\tpublic fun getFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSender ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic synthetic fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromFriend;\n\tpublic synthetic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic fun getTime ()I\n}\n\npublic final class net/mamoe/mirai/event/events/FriendNickChangedEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/FriendEvent, net/mamoe/mirai/event/events/FriendInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Friend;Ljava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/event/events/FriendNickChangedEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/FriendNickChangedEvent;Lnet/mamoe/mirai/contact/Friend;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/FriendNickChangedEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun getFrom ()Ljava/lang/String;\n\tpublic final fun getTo ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/FriendRemarkChangeEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/BroadcastControllable, net/mamoe/mirai/event/events/FriendEvent, net/mamoe/mirai/event/events/FriendInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Friend;Ljava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/event/events/FriendRemarkChangeEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/FriendRemarkChangeEvent;Lnet/mamoe/mirai/contact/Friend;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/FriendRemarkChangeEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun getNewRemark ()Ljava/lang/String;\n\tpublic final fun getOldRemark ()Ljava/lang/String;\n\tpublic fun getShouldBroadcast ()Z\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupAllowAnonymousChatEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/GroupOperableEvent, net/mamoe/mirai/event/events/GroupSettingChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Z\n\tpublic final fun component2 ()Z\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (ZZLnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/GroupAllowAnonymousChatEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupAllowAnonymousChatEvent;ZZLnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupAllowAnonymousChatEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getNew ()Ljava/lang/Boolean;\n\tpublic synthetic fun getNew ()Ljava/lang/Object;\n\tpublic synthetic fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getOperator ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun getOrigin ()Ljava/lang/Boolean;\n\tpublic synthetic fun getOrigin ()Ljava/lang/Object;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupAllowConfessTalkEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/GroupSettingChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Z\n\tpublic final fun component2 ()Z\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component4 ()Z\n\tpublic final fun copy (ZZLnet/mamoe/mirai/contact/Group;Z)Lnet/mamoe/mirai/event/events/GroupAllowConfessTalkEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupAllowConfessTalkEvent;ZZLnet/mamoe/mirai/contact/Group;ZILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupAllowConfessTalkEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getNew ()Ljava/lang/Boolean;\n\tpublic synthetic fun getNew ()Ljava/lang/Object;\n\tpublic fun getOrigin ()Ljava/lang/Boolean;\n\tpublic synthetic fun getOrigin ()Ljava/lang/Object;\n\tpublic fun hashCode ()I\n\tpublic final fun isByBot ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupAllowMemberInviteEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/GroupOperableEvent, net/mamoe/mirai/event/events/GroupSettingChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Z\n\tpublic final fun component2 ()Z\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (ZZLnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/GroupAllowMemberInviteEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupAllowMemberInviteEvent;ZZLnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupAllowMemberInviteEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getNew ()Ljava/lang/Boolean;\n\tpublic synthetic fun getNew ()Ljava/lang/Object;\n\tpublic synthetic fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getOperator ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun getOrigin ()Ljava/lang/Boolean;\n\tpublic synthetic fun getOrigin ()Ljava/lang/Object;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/GroupAwareMessageEvent : net/mamoe/mirai/event/events/MessageEvent {\n\tpublic abstract fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupEntranceAnnouncementChangeEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/GroupOperableEvent, net/mamoe/mirai/event/events/GroupSettingChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/GroupEntranceAnnouncementChangeEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupEntranceAnnouncementChangeEvent;Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupEntranceAnnouncementChangeEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic synthetic fun getNew ()Ljava/lang/Object;\n\tpublic fun getNew ()Ljava/lang/String;\n\tpublic synthetic fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getOperator ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getOrigin ()Ljava/lang/Object;\n\tpublic fun getOrigin ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/GroupEvent : net/mamoe/mirai/event/events/BotEvent {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/GroupMemberEvent : net/mamoe/mirai/event/events/GroupEvent, net/mamoe/mirai/event/events/UserEvent {\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic abstract fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getUser ()Lnet/mamoe/mirai/contact/Member;\n\tpublic synthetic fun getUser ()Lnet/mamoe/mirai/contact/User;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupMessageEvent : net/mamoe/mirai/event/events/AbstractMessageEvent, net/mamoe/mirai/event/events/GroupAwareMessageEvent, net/mamoe/mirai/event/events/GroupEvent, net/mamoe/mirai/event/events/MessageEvent {\n\tpublic fun <init> (Ljava/lang/String;Lnet/mamoe/mirai/contact/MemberPermission;Lnet/mamoe/mirai/contact/Member;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun getPermission ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic fun getSender ()Lnet/mamoe/mirai/contact/Member;\n\tpublic synthetic fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromGroup;\n\tpublic synthetic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getTime ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupMessagePostSendEvent : net/mamoe/mirai/event/events/MessagePostSendEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun component3 ()Ljava/lang/Throwable;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/Throwable;Lnet/mamoe/mirai/message/MessageReceipt;)Lnet/mamoe/mirai/event/events/GroupMessagePostSendEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupMessagePostSendEvent;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/Throwable;Lnet/mamoe/mirai/message/MessageReceipt;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupMessagePostSendEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getException ()Ljava/lang/Throwable;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getReceipt ()Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupMessagePreSendEvent : net/mamoe/mirai/event/events/MessagePreSendEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/event/events/GroupMessagePreSendEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupMessagePreSendEvent;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/message/data/Message;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupMessagePreSendEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun hashCode ()I\n\tpublic fun setMessage (Lnet/mamoe/mirai/message/data/Message;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupMessageSyncEvent : net/mamoe/mirai/event/events/AbstractMessageEvent, net/mamoe/mirai/event/events/GroupAwareMessageEvent, net/mamoe/mirai/event/events/MessageSyncEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/message/data/MessageChain;Lnet/mamoe/mirai/contact/Member;Ljava/lang/String;I)V\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/OtherClient;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/message/data/MessageChain;Lnet/mamoe/mirai/contact/Member;Ljava/lang/String;I)V\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getClient ()Lnet/mamoe/mirai/contact/OtherClient;\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSender ()Lnet/mamoe/mirai/contact/Member;\n\tpublic synthetic fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromGroup;\n\tpublic synthetic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getTime ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupMuteAllEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/GroupOperableEvent, net/mamoe/mirai/event/events/GroupSettingChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Z\n\tpublic final fun component2 ()Z\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (ZZLnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/GroupMuteAllEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupMuteAllEvent;ZZLnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupMuteAllEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getNew ()Ljava/lang/Boolean;\n\tpublic synthetic fun getNew ()Ljava/lang/Object;\n\tpublic synthetic fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getOperator ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun getOrigin ()Ljava/lang/Boolean;\n\tpublic synthetic fun getOrigin ()Ljava/lang/Object;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupNameChangeEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/GroupOperableEvent, net/mamoe/mirai/event/events/GroupSettingChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/GroupNameChangeEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupNameChangeEvent;Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupNameChangeEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic synthetic fun getNew ()Ljava/lang/Object;\n\tpublic fun getNew ()Ljava/lang/String;\n\tpublic synthetic fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getOperator ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getOrigin ()Ljava/lang/Object;\n\tpublic fun getOrigin ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/GroupOperableEvent : net/mamoe/mirai/event/events/GroupEvent {\n\tpublic abstract fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/GroupSettingChangeEvent : net/mamoe/mirai/event/BroadcastControllable, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/event/events/GroupEvent {\n\tpublic abstract fun getNew ()Ljava/lang/Object;\n\tpublic abstract fun getOrigin ()Ljava/lang/Object;\n\tpublic fun getShouldBroadcast ()Z\n}\n\npublic final class net/mamoe/mirai/event/events/GroupTalkativeChangeEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/event/events/GroupEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/NormalMember;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/GroupTalkativeChangeEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupTalkativeChangeEvent;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupTalkativeChangeEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun getNow ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getPrevious ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupTempMessageEvent : net/mamoe/mirai/event/events/TempMessageEvent, net/mamoe/mirai/event/events/GroupAwareMessageEvent, net/mamoe/mirai/event/events/UserMessageEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSender ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromTemp;\n\tpublic synthetic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getTime ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupTempMessagePostSendEvent : net/mamoe/mirai/event/events/TempMessagePostSendEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun component3 ()Ljava/lang/Throwable;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/Throwable;Lnet/mamoe/mirai/message/MessageReceipt;)Lnet/mamoe/mirai/event/events/GroupTempMessagePostSendEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupTempMessagePostSendEvent;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/Throwable;Lnet/mamoe/mirai/message/MessageReceipt;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupTempMessagePostSendEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getException ()Ljava/lang/Throwable;\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getReceipt ()Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupTempMessagePreSendEvent : net/mamoe/mirai/event/events/TempMessagePreSendEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/event/events/GroupTempMessagePreSendEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/GroupTempMessagePreSendEvent;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/message/data/Message;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/GroupTempMessagePreSendEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun hashCode ()I\n\tpublic fun setMessage (Lnet/mamoe/mirai/message/data/Message;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/GroupTempMessageSyncEvent : net/mamoe/mirai/event/events/AbstractMessageEvent, net/mamoe/mirai/event/events/GroupAwareMessageEvent, net/mamoe/mirai/event/events/MessageSyncEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/OtherClient;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getClient ()Lnet/mamoe/mirai/contact/OtherClient;\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSender ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromTemp;\n\tpublic synthetic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun getTime ()I\n}\n\npublic abstract class net/mamoe/mirai/event/events/ImageUploadEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotActiveEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/event/VerboseEvent {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n}\n\npublic final class net/mamoe/mirai/event/events/ImageUploadEvent$Failed : net/mamoe/mirai/event/events/ImageUploadEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun component3 ()I\n\tpublic final fun component4 ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;ILjava/lang/String;)Lnet/mamoe/mirai/event/events/ImageUploadEvent$Failed;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/ImageUploadEvent$Failed;Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;ILjava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/ImageUploadEvent$Failed;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getErrno ()I\n\tpublic final fun getMessage ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/ImageUploadEvent$Succeed : net/mamoe/mirai/event/events/ImageUploadEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun component3 ()Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/message/data/Image;)Lnet/mamoe/mirai/event/events/ImageUploadEvent$Succeed;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/ImageUploadEvent$Succeed;Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/message/data/Image;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/ImageUploadEvent$Succeed;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getImage ()Lnet/mamoe/mirai/message/data/Image;\n\tpublic fun getSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberCardChangeEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/MemberCardChangeEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberCardChangeEvent;Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberCardChangeEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getNew ()Ljava/lang/String;\n\tpublic final fun getOrigin ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberHonorChangeEvent$Achieve : net/mamoe/mirai/event/events/MemberHonorChangeEvent {\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/contact/NormalMember;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun component2-AVr_HNQ ()I\n\tpublic final fun copy-aLnpm_Q (Lnet/mamoe/mirai/contact/NormalMember;I)Lnet/mamoe/mirai/event/events/MemberHonorChangeEvent$Achieve;\n\tpublic static synthetic fun copy-aLnpm_Q$default (Lnet/mamoe/mirai/event/events/MemberHonorChangeEvent$Achieve;Lnet/mamoe/mirai/contact/NormalMember;IILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberHonorChangeEvent$Achieve;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getHonorType ()I\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberHonorChangeEvent$Lose : net/mamoe/mirai/event/events/MemberHonorChangeEvent {\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/contact/NormalMember;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun component2-AVr_HNQ ()I\n\tpublic final fun copy-aLnpm_Q (Lnet/mamoe/mirai/contact/NormalMember;I)Lnet/mamoe/mirai/event/events/MemberHonorChangeEvent$Lose;\n\tpublic static synthetic fun copy-aLnpm_Q$default (Lnet/mamoe/mirai/event/events/MemberHonorChangeEvent$Lose;Lnet/mamoe/mirai/contact/NormalMember;IILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberHonorChangeEvent$Lose;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getHonorType ()I\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/event/events/MemberJoinEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/event/events/GroupMemberEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/contact/NormalMember;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberJoinEvent$Active : net/mamoe/mirai/event/events/MemberJoinEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/MemberJoinEvent$Active;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberJoinEvent$Active;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberJoinEvent$Active;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberJoinEvent$Invite : net/mamoe/mirai/event/events/MemberJoinEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/MemberJoinEvent$Invite;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberJoinEvent$Invite;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberJoinEvent$Invite;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getInvitor ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberJoinEvent$Retrieve : net/mamoe/mirai/event/events/MemberJoinEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/MemberJoinEvent$Retrieve;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberJoinEvent$Retrieve;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberJoinEvent$Retrieve;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberJoinRequestEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BaseGroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic static final field Companion Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent$Companion;\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/Bot;JLjava/lang/String;JJLjava/lang/String;Ljava/lang/String;)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/Bot;JLjava/lang/String;JJLjava/lang/String;Ljava/lang/String;Ljava/lang/Long;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun accept ()V\n\tpublic final fun accept (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun component2 ()J\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun component4 ()J\n\tpublic final fun component5 ()J\n\tpublic final fun component6 ()Ljava/lang/String;\n\tpublic final fun component7 ()Ljava/lang/String;\n\tpublic final fun component8 ()Ljava/lang/Long;\n\tpublic final synthetic fun copy (Lnet/mamoe/mirai/Bot;JLjava/lang/String;JJLjava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;JLjava/lang/String;JJLjava/lang/String;Ljava/lang/String;Ljava/lang/Long;)Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;\n\tpublic static final synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;Lnet/mamoe/mirai/Bot;JLjava/lang/String;JJLjava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;Lnet/mamoe/mirai/Bot;JLjava/lang/String;JJLjava/lang/String;Ljava/lang/String;Ljava/lang/Long;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getEventId ()J\n\tpublic final fun getFromId ()J\n\tpublic final fun getFromNick ()Ljava/lang/String;\n\tpublic final fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getGroupId ()J\n\tpublic final fun getGroupName ()Ljava/lang/String;\n\tpublic final fun getInvitor ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getInvitorId ()Ljava/lang/Long;\n\tpublic final fun getMessage ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic final fun ignore (Z)V\n\tpublic final fun ignore (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun ignore$default (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZILjava/lang/Object;)V\n\tpublic static synthetic fun ignore$default (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun reject ()V\n\tpublic final fun reject (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun reject (Z)V\n\tpublic final fun reject (ZLjava/lang/String;)V\n\tpublic final fun reject (ZLjava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun reject (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun reject$default (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZLjava/lang/String;ILjava/lang/Object;)V\n\tpublic static synthetic fun reject$default (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;ZLjava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/event/events/MemberLeaveEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent {\n}\n\npublic final class net/mamoe/mirai/event/events/MemberLeaveEvent$Kick : net/mamoe/mirai/event/events/MemberLeaveEvent, net/mamoe/mirai/event/events/GroupOperableEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/NormalMember;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/MemberLeaveEvent$Kick;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberLeaveEvent$Kick;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberLeaveEvent$Kick;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getOperator ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberLeaveEvent$Quit : net/mamoe/mirai/event/events/MemberLeaveEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/NormalMember;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/MemberLeaveEvent$Quit;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberLeaveEvent$Quit;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberLeaveEvent$Quit;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberMuteEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/GroupOperableEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Member;\n\tpublic final fun component2 ()I\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/Member;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Member;ILnet/mamoe/mirai/contact/Member;)Lnet/mamoe/mirai/event/events/MemberMuteEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberMuteEvent;Lnet/mamoe/mirai/contact/Member;ILnet/mamoe/mirai/contact/Member;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberMuteEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getDurationSeconds ()I\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberPermissionChangeEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/event/events/GroupMemberEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/MemberPermission;Lnet/mamoe/mirai/contact/MemberPermission;)Lnet/mamoe/mirai/event/events/MemberPermissionChangeEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberPermissionChangeEvent;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/MemberPermission;Lnet/mamoe/mirai/contact/MemberPermission;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberPermissionChangeEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getNew ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic final fun getOrigin ()Lnet/mamoe/mirai/contact/MemberPermission;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberSpecialTitleChangeEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/GroupOperableEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/MemberSpecialTitleChangeEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberSpecialTitleChangeEvent;Ljava/lang/String;Ljava/lang/String;Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberSpecialTitleChangeEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getNew ()Ljava/lang/String;\n\tpublic synthetic fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getOperator ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun getOrigin ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MemberUnmuteEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/GroupMemberEvent, net/mamoe/mirai/event/events/GroupMemberInfoChangeEvent, net/mamoe/mirai/event/events/GroupOperableEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Member;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/contact/Member;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Member;Lnet/mamoe/mirai/contact/Member;)Lnet/mamoe/mirai/event/events/MemberUnmuteEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MemberUnmuteEvent;Lnet/mamoe/mirai/contact/Member;Lnet/mamoe/mirai/contact/Member;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MemberUnmuteEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getMember ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/MessageEvent : net/mamoe/mirai/event/Event, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic abstract fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic abstract fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic abstract fun getSenderName ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming;\n\tpublic abstract fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic abstract fun getTime ()I\n}\n\npublic abstract class net/mamoe/mirai/event/events/MessagePostSendEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotActiveEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/event/VerboseEvent {\n\tpublic final fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getException ()Ljava/lang/Throwable;\n\tpublic abstract fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic abstract fun getReceipt ()Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n}\n\npublic abstract class net/mamoe/mirai/event/events/MessagePreSendEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/CancellableEvent, net/mamoe/mirai/event/events/BotActiveEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/event/VerboseEvent {\n\tpublic final fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getMessage ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic abstract fun setMessage (Lnet/mamoe/mirai/message/data/Message;)V\n}\n\npublic abstract class net/mamoe/mirai/event/events/MessageRecallEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotEvent {\n\tpublic abstract fun getAuthor ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic abstract fun getAuthorId ()J\n\tpublic abstract fun getMessageIds ()[I\n\tpublic abstract fun getMessageInternalIds ()[I\n\tpublic abstract fun getMessageTime ()I\n}\n\npublic final class net/mamoe/mirai/event/events/MessageRecallEvent$FriendRecall : net/mamoe/mirai/event/events/MessageRecallEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun component2 ()[I\n\tpublic final fun component3 ()[I\n\tpublic final fun component4 ()I\n\tpublic final fun component5 ()J\n\tpublic final fun component6 ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;[I[IIJLnet/mamoe/mirai/contact/Friend;)Lnet/mamoe/mirai/event/events/MessageRecallEvent$FriendRecall;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MessageRecallEvent$FriendRecall;Lnet/mamoe/mirai/Bot;[I[IIJLnet/mamoe/mirai/contact/Friend;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MessageRecallEvent$FriendRecall;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getAuthor ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic synthetic fun getAuthor ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic fun getAuthorId ()J\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getMessageIds ()[I\n\tpublic fun getMessageInternalIds ()[I\n\tpublic fun getMessageTime ()I\n\tpublic final fun getOperator ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun getOperatorId ()J\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/MessageRecallEvent$GroupRecall : net/mamoe/mirai/event/events/MessageRecallEvent, net/mamoe/mirai/event/events/GroupOperableEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun component2 ()J\n\tpublic final fun component3 ()[I\n\tpublic final fun component4 ()[I\n\tpublic final fun component5 ()I\n\tpublic final fun component6 ()Lnet/mamoe/mirai/contact/Member;\n\tpublic final fun component7 ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun component8 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;J[I[IILnet/mamoe/mirai/contact/Member;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/event/events/MessageRecallEvent$GroupRecall;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/MessageRecallEvent$GroupRecall;Lnet/mamoe/mirai/Bot;J[I[IILnet/mamoe/mirai/contact/Member;Lnet/mamoe/mirai/contact/Group;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/MessageRecallEvent$GroupRecall;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getAuthor ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getAuthor ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic fun getAuthorId ()J\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getMessageIds ()[I\n\tpublic fun getMessageInternalIds ()[I\n\tpublic fun getMessageTime ()I\n\tpublic fun getOperator ()Lnet/mamoe/mirai/contact/Member;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/MessageSyncEvent : net/mamoe/mirai/event/events/MessageEvent, net/mamoe/mirai/event/events/OtherClientEvent {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getClient ()Lnet/mamoe/mirai/contact/OtherClient;\n}\n\npublic final class net/mamoe/mirai/event/events/NewFriendRequestEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/event/events/FriendInfoChangeEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun accept ()V\n\tpublic final fun accept (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun component2 ()J\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun component4 ()J\n\tpublic final fun component5 ()J\n\tpublic final fun component6 ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;JLjava/lang/String;JJLjava/lang/String;)Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;Lnet/mamoe/mirai/Bot;JLjava/lang/String;JJLjava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getEventId ()J\n\tpublic final fun getFromGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun getFromGroupId ()J\n\tpublic final fun getFromId ()J\n\tpublic final fun getFromNick ()Ljava/lang/String;\n\tpublic final fun getMessage ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic final fun reject (Z)V\n\tpublic final fun reject (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun reject$default (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;ZILjava/lang/Object;)V\n\tpublic static synthetic fun reject$default (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/NudgeEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic final fun component3 ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun component4 ()Ljava/lang/String;\n\tpublic final fun component5 ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/UserOrBot;Lnet/mamoe/mirai/contact/UserOrBot;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/event/events/NudgeEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/NudgeEvent;Lnet/mamoe/mirai/contact/UserOrBot;Lnet/mamoe/mirai/contact/UserOrBot;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/NudgeEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getAction ()Ljava/lang/String;\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getFrom ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic final fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun getSuffix ()Ljava/lang/String;\n\tpublic final fun getTarget ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/OtherClientEvent : net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getClient ()Lnet/mamoe/mirai/contact/OtherClient;\n}\n\npublic final class net/mamoe/mirai/event/events/OtherClientMessageEvent : net/mamoe/mirai/event/events/AbstractMessageEvent, net/mamoe/mirai/event/events/MessageEvent, net/mamoe/mirai/event/events/OtherClientEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/OtherClient;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getClient ()Lnet/mamoe/mirai/contact/OtherClient;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromFriend;\n\tpublic synthetic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/OtherClient;\n\tpublic fun getTime ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/OtherClientOfflineEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/event/events/OtherClientEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/OtherClient;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/OtherClient;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/OtherClient;)Lnet/mamoe/mirai/event/events/OtherClientOfflineEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/OtherClientOfflineEvent;Lnet/mamoe/mirai/contact/OtherClient;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/OtherClientOfflineEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getClient ()Lnet/mamoe/mirai/contact/OtherClient;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/OtherClientOnlineEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotPassiveEvent, net/mamoe/mirai/event/events/OtherClientEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/OtherClient;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/OtherClient;Lnet/mamoe/mirai/contact/ClientKind;)Lnet/mamoe/mirai/event/events/OtherClientOnlineEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/OtherClientOnlineEvent;Lnet/mamoe/mirai/contact/OtherClient;Lnet/mamoe/mirai/contact/ClientKind;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/OtherClientOnlineEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getClient ()Lnet/mamoe/mirai/contact/OtherClient;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/contact/ClientKind;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/event/events/ShortVideoUploadEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotActiveEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/event/VerboseEvent {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic abstract fun getThumbnailSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic abstract fun getVideoSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n}\n\npublic final class net/mamoe/mirai/event/events/ShortVideoUploadEvent$Failed : net/mamoe/mirai/event/events/ShortVideoUploadEvent {\n\tpublic final fun getErrno ()I\n\tpublic final fun getMessage ()Ljava/lang/String;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getThumbnailSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic fun getVideoSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/ShortVideoUploadEvent$Succeed : net/mamoe/mirai/event/events/ShortVideoUploadEvent {\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getThumbnailSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun getVideo ()Lnet/mamoe/mirai/message/data/ShortVideo;\n\tpublic fun getVideoSource ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/SignEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getRank ()Ljava/lang/Integer;\n\tpublic final fun getSign ()Ljava/lang/String;\n\tpublic final fun getUser ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic final fun hasRank ()Z\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/StrangerAddEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/StrangerEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Stranger;)Lnet/mamoe/mirai/event/events/StrangerAddEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/StrangerAddEvent;Lnet/mamoe/mirai/contact/Stranger;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/StrangerAddEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getStranger ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/StrangerEvent : net/mamoe/mirai/event/events/BotEvent, net/mamoe/mirai/event/events/UserEvent {\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getStranger ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic fun getUser ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic synthetic fun getUser ()Lnet/mamoe/mirai/contact/User;\n}\n\npublic final class net/mamoe/mirai/event/events/StrangerMessageEvent : net/mamoe/mirai/event/events/AbstractMessageEvent, net/mamoe/mirai/event/events/StrangerEvent, net/mamoe/mirai/event/events/UserMessageEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Stranger;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSender ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic synthetic fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromStranger;\n\tpublic synthetic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming;\n\tpublic fun getStranger ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getTime ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/StrangerMessagePostSendEvent : net/mamoe/mirai/event/events/UserMessagePostSendEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun component3 ()Ljava/lang/Throwable;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Stranger;Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/Throwable;Lnet/mamoe/mirai/message/MessageReceipt;)Lnet/mamoe/mirai/event/events/StrangerMessagePostSendEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/StrangerMessagePostSendEvent;Lnet/mamoe/mirai/contact/Stranger;Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/Throwable;Lnet/mamoe/mirai/message/MessageReceipt;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/StrangerMessagePostSendEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getException ()Ljava/lang/Throwable;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getReceipt ()Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/StrangerMessagePreSendEvent : net/mamoe/mirai/event/events/UserMessagePreSendEvent {\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic final fun component2 ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Stranger;Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/event/events/StrangerMessagePreSendEvent;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/event/events/StrangerMessagePreSendEvent;Lnet/mamoe/mirai/contact/Stranger;Lnet/mamoe/mirai/message/data/Message;ILjava/lang/Object;)Lnet/mamoe/mirai/event/events/StrangerMessagePreSendEvent;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun hashCode ()I\n\tpublic fun setMessage (Lnet/mamoe/mirai/message/data/Message;)V\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/event/events/StrangerMessageSyncEvent : net/mamoe/mirai/event/events/AbstractMessageEvent, net/mamoe/mirai/event/events/MessageSyncEvent, net/mamoe/mirai/event/events/StrangerEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/OtherClient;Lnet/mamoe/mirai/contact/Stranger;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Stranger;Lnet/mamoe/mirai/message/data/MessageChain;I)V\n\tpublic fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic fun getClient ()Lnet/mamoe/mirai/contact/OtherClient;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSender ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic synthetic fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromStranger;\n\tpublic synthetic fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming;\n\tpublic fun getStranger ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic fun getTime ()I\n}\n\npublic abstract class net/mamoe/mirai/event/events/StrangerRelationChangeEvent : net/mamoe/mirai/event/AbstractEvent, net/mamoe/mirai/event/events/StrangerEvent, net/mamoe/mirai/internal/network/Packet {\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/contact/Stranger;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getStranger ()Lnet/mamoe/mirai/contact/Stranger;\n}\n\npublic final class net/mamoe/mirai/event/events/StrangerRelationChangeEvent$Deleted : net/mamoe/mirai/event/events/StrangerRelationChangeEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Stranger;)V\n}\n\npublic final class net/mamoe/mirai/event/events/StrangerRelationChangeEvent$Friended : net/mamoe/mirai/event/events/StrangerRelationChangeEvent {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Stranger;Lnet/mamoe/mirai/contact/Friend;)V\n\tpublic final fun getFriend ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic fun getStranger ()Lnet/mamoe/mirai/contact/Stranger;\n}\n\npublic abstract class net/mamoe/mirai/event/events/TempMessageEvent : net/mamoe/mirai/event/events/AbstractMessageEvent, net/mamoe/mirai/event/events/GroupAwareMessageEvent, net/mamoe/mirai/event/events/UserMessageEvent {\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/contact/NormalMember;Lnet/mamoe/mirai/message/data/MessageChain;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSender ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getTime ()I\n}\n\npublic abstract class net/mamoe/mirai/event/events/TempMessagePostSendEvent : net/mamoe/mirai/event/events/UserMessagePostSendEvent {\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/contact/Member;Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/Throwable;Lnet/mamoe/mirai/message/MessageReceipt;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getException ()Ljava/lang/Throwable;\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getReceipt ()Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Member;\n}\n\npublic abstract class net/mamoe/mirai/event/events/TempMessagePreSendEvent : net/mamoe/mirai/event/events/UserMessagePreSendEvent {\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/contact/Member;Lnet/mamoe/mirai/message/data/Message;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic fun getMessage ()Lnet/mamoe/mirai/message/data/Message;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Member;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun setMessage (Lnet/mamoe/mirai/message/data/Message;)V\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/UserEvent : net/mamoe/mirai/event/events/BotEvent {\n\tpublic abstract fun getUser ()Lnet/mamoe/mirai/contact/User;\n}\n\npublic abstract interface class net/mamoe/mirai/event/events/UserMessageEvent : net/mamoe/mirai/event/events/MessageEvent {\n\tpublic abstract fun getSubject ()Lnet/mamoe/mirai/contact/User;\n}\n\npublic abstract class net/mamoe/mirai/event/events/UserMessagePostSendEvent : net/mamoe/mirai/event/events/MessagePostSendEvent {\n}\n\npublic abstract class net/mamoe/mirai/event/events/UserMessagePreSendEvent : net/mamoe/mirai/event/events/MessagePreSendEvent {\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/User;\n}\n\npublic final class net/mamoe/mirai/message/MessageEventKt {\n\tpublic static final fun isContextIdenticalWith (Lnet/mamoe/mirai/event/events/MessageEvent;Lnet/mamoe/mirai/event/events/MessageEvent;)Z\n}\n\npublic class net/mamoe/mirai/message/MessageReceipt {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/MessageReceipt$Companion;\n\tpublic final fun getSource ()Lnet/mamoe/mirai/message/data/OnlineMessageSource$Outgoing;\n\tpublic final fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun isToGroup ()Z\n\tpublic final fun quote ()Lnet/mamoe/mirai/message/data/QuoteReply;\n\tpublic fun quoteReply (Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun quoteReply (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun quoteReply (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun quoteReply (Lnet/mamoe/mirai/message/data/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun recall ()V\n\tpublic final fun recall (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun recallIn (J)Lnet/mamoe/mirai/message/action/AsyncRecallResult;\n}\n\npublic final class net/mamoe/mirai/message/MessageReceipt$Companion {\n}\n\npublic final class net/mamoe/mirai/message/MessageReceiptKt {\n\tpublic static final fun getBot (Lnet/mamoe/mirai/message/MessageReceipt;)Lnet/mamoe/mirai/Bot;\n\tpublic static final fun getSourceIds (Lnet/mamoe/mirai/message/MessageReceipt;)[I\n\tpublic static final fun getSourceInternalIds (Lnet/mamoe/mirai/message/MessageReceipt;)[I\n\tpublic static final fun getSourceMessage (Lnet/mamoe/mirai/message/MessageReceipt;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final fun getSourceTime (Lnet/mamoe/mirai/message/MessageReceipt;)I\n}\n\npublic abstract interface class net/mamoe/mirai/message/MessageSerializers {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/MessageSerializers$INSTANCE;\n\tpublic abstract fun getSerializersModule ()Lkotlinx/serialization/modules/SerializersModule;\n}\n\npublic final class net/mamoe/mirai/message/MessageSerializers$INSTANCE : net/mamoe/mirai/message/MessageSerializers {\n\tpublic fun getSerializersModule ()Lkotlinx/serialization/modules/SerializersModule;\n}\n\npublic final class net/mamoe/mirai/message/action/AsyncRecallResult {\n\tpublic final fun awaitException ()Ljava/lang/Throwable;\n\tpublic final fun awaitException (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun awaitIsSuccess ()Z\n\tpublic final fun awaitIsSuccess (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun getException ()Lkotlinx/coroutines/Deferred;\n\tpublic final fun getExceptionFuture ()Ljava/util/concurrent/CompletableFuture;\n\tpublic final fun isSuccess ()Lkotlinx/coroutines/Deferred;\n\tpublic final fun isSuccessFuture ()Ljava/util/concurrent/CompletableFuture;\n}\n\npublic final class net/mamoe/mirai/message/action/BotNudge : net/mamoe/mirai/message/action/Nudge {\n\tpublic fun <init> (Lnet/mamoe/mirai/Bot;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun copy (Lnet/mamoe/mirai/Bot;)Lnet/mamoe/mirai/message/action/BotNudge;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/action/BotNudge;Lnet/mamoe/mirai/Bot;ILjava/lang/Object;)Lnet/mamoe/mirai/message/action/BotNudge;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getTarget ()Lnet/mamoe/mirai/Bot;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/action/FriendNudge : net/mamoe/mirai/message/action/UserNudge {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Friend;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Friend;)Lnet/mamoe/mirai/message/action/FriendNudge;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/action/FriendNudge;Lnet/mamoe/mirai/contact/Friend;ILjava/lang/Object;)Lnet/mamoe/mirai/message/action/FriendNudge;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/action/MemberNudge : net/mamoe/mirai/message/action/UserNudge {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/NormalMember;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/NormalMember;)Lnet/mamoe/mirai/message/action/MemberNudge;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/action/MemberNudge;Lnet/mamoe/mirai/contact/NormalMember;ILjava/lang/Object;)Lnet/mamoe/mirai/message/action/MemberNudge;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/NormalMember;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/message/action/Nudge {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/action/Nudge$Companion;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic static final synthetic fun sendNudge (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/message/action/Nudge;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun sendTo (Lnet/mamoe/mirai/contact/Contact;)Z\n\tpublic final fun sendTo (Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/message/action/Nudge$Companion {\n\tpublic final synthetic fun sendNudge (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/message/action/Nudge;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/message/action/StrangerNudge : net/mamoe/mirai/message/action/UserNudge {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Stranger;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic final fun copy (Lnet/mamoe/mirai/contact/Stranger;)Lnet/mamoe/mirai/message/action/StrangerNudge;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/action/StrangerNudge;Lnet/mamoe/mirai/contact/Stranger;ILjava/lang/Object;)Lnet/mamoe/mirai/message/action/StrangerNudge;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getTarget ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/UserOrBot;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/message/action/UserNudge : net/mamoe/mirai/message/action/Nudge {\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/UserOrBot;\n}\n\npublic abstract interface class net/mamoe/mirai/message/code/CodableMessage : net/mamoe/mirai/message/data/Message {\n\tpublic fun serializeToMiraiCode ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/code/MiraiCode {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/code/MiraiCode;\n\tpublic static final fun deserializeMiraiCode (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final fun deserializeMiraiCode (Ljava/lang/String;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static synthetic fun deserializeMiraiCode$default (Ljava/lang/String;Lnet/mamoe/mirai/contact/Contact;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final synthetic fun parseMiraiCode1 (Ljava/lang/String;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static synthetic fun parseMiraiCode1$default (Lnet/mamoe/mirai/message/code/MiraiCode;Ljava/lang/String;Lnet/mamoe/mirai/contact/Contact;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final fun serializeToMiraiCode (Ljava/lang/Iterable;)Ljava/lang/String;\n\tpublic static final fun serializeToMiraiCode (Ljava/util/Iterator;)Ljava/lang/String;\n\tpublic static final fun serializeToMiraiCode (Lkotlin/sequences/Sequence;)Ljava/lang/String;\n\tpublic static final fun serializeToMiraiCode (Lnet/mamoe/mirai/message/code/CodableMessage;)Ljava/lang/String;\n\tpublic static final fun serializeToMiraiCode ([Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/message/data/AbstractMessageKey : net/mamoe/mirai/message/data/MessageKey {\n\tpublic fun <init> (Lkotlin/jvm/functions/Function1;)V\n\tpublic fun getSafeCast ()Lkotlin/jvm/functions/Function1;\n}\n\npublic abstract class net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey : net/mamoe/mirai/message/data/AbstractMessageKey, net/mamoe/mirai/message/data/MessageKey {\n\tpublic fun <init> (Lnet/mamoe/mirai/message/data/MessageKey;Lkotlin/jvm/functions/Function1;)V\n}\n\npublic final class net/mamoe/mirai/message/data/AbstractServiceMessage$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/At : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/At$Companion;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (IJLkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> (J)V\n\tpublic final fun component1 ()J\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic final fun copy (J)Lnet/mamoe/mirai/message/data/At;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/At;JILjava/lang/Object;)Lnet/mamoe/mirai/message/data/At;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun followedBy (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun getDisplay (Lnet/mamoe/mirai/contact/Group;)Ljava/lang/String;\n\tpublic final fun getTarget ()J\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/At;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/At$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/At$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/At;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/At;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/At$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/AtAll : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/AtAll;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic static final field display Ljava/lang/String;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun followedBy (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun hashCode ()I\n\tpublic fun serializeToMiraiCode ()Ljava/lang/String;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/Audio : net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/Audio$Key;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic abstract fun getCodec ()Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic abstract fun getExtraData ()[B\n\tpublic abstract fun getFileMd5 ()[B\n\tpublic abstract fun getFileSize ()J\n\tpublic abstract fun getFilename ()Ljava/lang/String;\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic abstract fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/Audio$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic final class net/mamoe/mirai/message/data/AudioCodec : java/lang/Enum {\n\tpublic static final field AMR Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/AudioCodec$Companion;\n\tpublic static final field SILK Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic static final fun fromFormatName (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic static final fun fromFormatNameOrNull (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic static final fun fromId (I)Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic static final fun fromIdOrNull (I)Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic final fun getFormatName ()Ljava/lang/String;\n\tpublic final fun getId ()I\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic static fun values ()[Lnet/mamoe/mirai/message/data/AudioCodec;\n}\n\npublic final class net/mamoe/mirai/message/data/AudioCodec$Companion {\n\tpublic final fun fromFormatName (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic final fun fromFormatNameOrNull (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic final fun fromId (I)Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic final fun fromIdOrNull (I)Lnet/mamoe/mirai/message/data/AudioCodec;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/ConstrainSingle : net/mamoe/mirai/message/data/SingleMessage {\n\tpublic abstract fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n}\n\npublic final class net/mamoe/mirai/message/data/CustomMessage$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/CustomMessage$Companion$CustomMessageFullDataDeserializeInternalException : java/lang/RuntimeException {\n\tpublic fun <init> (Ljava/lang/Throwable;)V\n}\n\npublic final class net/mamoe/mirai/message/data/CustomMessage$Companion$CustomMessageFullDataDeserializeUserException : java/lang/RuntimeException {\n\tpublic fun <init> ([BLjava/lang/Throwable;)V\n\tpublic final fun getBody ()[B\n}\n\npublic abstract class net/mamoe/mirai/message/data/CustomMessage$JsonSerializerFactory : net/mamoe/mirai/message/data/CustomMessage$Factory {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun dump (Lnet/mamoe/mirai/message/data/CustomMessage;)[B\n\tpublic fun getJson ()Lkotlinx/serialization/json/Json;\n\tpublic fun load ([B)Lnet/mamoe/mirai/message/data/CustomMessage;\n\tpublic abstract fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract class net/mamoe/mirai/message/data/CustomMessage$ProtoBufSerializerFactory : net/mamoe/mirai/message/data/CustomMessage$Factory {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun dump (Lnet/mamoe/mirai/message/data/CustomMessage;)[B\n\tpublic fun load ([B)Lnet/mamoe/mirai/message/data/CustomMessage;\n\tpublic abstract fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/CustomMessageKt {\n}\n\npublic final class net/mamoe/mirai/message/data/CustomMessageMetadata$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/Dice : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/MarketFace {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/Dice$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic fun <init> (I)V\n\tpublic synthetic fun <init> (IILkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic final fun component1 ()I\n\tpublic final fun copy (I)Lnet/mamoe/mirai/message/data/Dice;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/Dice;IILjava/lang/Object;)Lnet/mamoe/mirai/message/data/Dice;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getId ()I\n\tpublic fun getName ()Ljava/lang/String;\n\tpublic final fun getValue ()I\n\tpublic fun hashCode ()I\n\tpublic static final fun random ()Lnet/mamoe/mirai/message/data/Dice;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/Dice;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/Dice$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/Dice$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/Dice;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/Dice;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/Dice$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic final fun random ()Lnet/mamoe/mirai/message/data/Dice;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/EmptyMessageChain : java/util/List, kotlin/jvm/internal/markers/KMappedMarker, net/mamoe/mirai/message/data/DirectSizeAccess, net/mamoe/mirai/message/data/DirectToStringAccess, net/mamoe/mirai/message/data/MessageChain {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/EmptyMessageChain;\n\tpublic fun contains (Lnet/mamoe/mirai/message/data/SingleMessage;)Z\n\tpublic fun containsAll (Ljava/util/Collection;)Z\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic synthetic fun get (I)Ljava/lang/Object;\n\tpublic fun get (I)Lnet/mamoe/mirai/message/data/SingleMessage;\n\tpublic fun getHasConstrainSingle ()Z\n\tpublic fun getSize ()I\n\tpublic fun indexOf (Lnet/mamoe/mirai/message/data/SingleMessage;)I\n\tpublic fun isEmpty ()Z\n\tpublic fun iterator ()Ljava/util/Iterator;\n\tpublic fun lastIndexOf (Lnet/mamoe/mirai/message/data/SingleMessage;)I\n\tpublic fun listIterator ()Ljava/util/ListIterator;\n\tpublic fun listIterator (I)Ljava/util/ListIterator;\n\tpublic fun serializeToMiraiCode ()Ljava/lang/String;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n\tpublic fun subList (II)Ljava/util/List;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/Face : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field AI_NI I\n\tpublic static final field AI_QING I\n\tpublic static final field AI_XIN I\n\tpublic static final field AN_ZHONG_GUAN_CHA I\n\tpublic static final field AO_MAN I\n\tpublic static final field BAI_TUO I\n\tpublic static final field BAI_XIE I\n\tpublic static final field BAI_YAN I\n\tpublic static final field BANG_BANG_TANG I\n\tpublic static final field BAN_ZHUAN_ZHONG I\n\tpublic static final field BAO_BAO I\n\tpublic static final field BAO_FU I\n\tpublic static final field BAO_JI I\n\tpublic static final field BAO_JIN I\n\tpublic static final field BAO_QUAN I\n\tpublic static final field BIAN_BIAN I\n\tpublic static final field BIAN_PAO I\n\tpublic static final field BIAN_XING I\n\tpublic static final field BIAO_LEI I\n\tpublic static final field BI_SHI I\n\tpublic static final field BI_XIN I\n\tpublic static final field BI_ZUI I\n\tpublic static final field BO_BO I\n\tpublic static final field BU I\n\tpublic static final field BU_KAI_XIN I\n\tpublic static final field CAI I\n\tpublic static final field CAI_DAO I\n\tpublic static final field CAI_GOU I\n\tpublic static final field CANG_SANG I\n\tpublic static final field CA_HAN I\n\tpublic static final field CENG_YI_CENG I\n\tpublic static final field CHA I\n\tpublic static final field CHAN_DOU I\n\tpublic static final field CHAO_FENG I\n\tpublic static final field CHAO_PIAO I\n\tpublic static final field CHA_JIN I\n\tpublic static final field CHE_YI_CHE I\n\tpublic static final field CHI I\n\tpublic static final field CHI_GUA I\n\tpublic static final field CHI_TANG I\n\tpublic static final field CHONG_BAI I\n\tpublic static final field CUO_HAO I\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/Face$Companion;\n\tpublic static final field DAN I\n\tpublic static final field DAN_GAO I\n\tpublic static final field DAO I\n\tpublic static final field DA_CALL I\n\tpublic static final field DA_KU I\n\tpublic static final field DA_LIAN I\n\tpublic static final field DA_XIAO I\n\tpublic static final field DA_YUAN_ZHONG I\n\tpublic static final field DA_ZHAN_HONG_TU I\n\tpublic static final field DA_ZHAO_HU I\n\tpublic static final field DENG_LONG I\n\tpublic static final field DE_YI I\n\tpublic static final field DIAN_ZAN I\n\tpublic static final field DIAO_XIE I\n\tpublic static final field DING_GUA_GUA I\n\tpublic static final field DUI_HAO I\n\tpublic static final field E I\n\tpublic static final field FAN I\n\tpublic static final field FA_DAI I\n\tpublic static final field FA_DOU I\n\tpublic static final field FA_NU I\n\tpublic static final field FEI_JI I\n\tpublic static final field FEI_WEN I\n\tpublic static final field FEN_DOU I\n\tpublic static final field FO_XI I\n\tpublic static final field FU_LUO_BO I\n\tpublic static final field GAN_BEI I\n\tpublic static final field GAN_GA I\n\tpublic static final field GONG_XI I\n\tpublic static final field GOU_YIN I\n\tpublic static final field GU_ZHANG I\n\tpublic static final field HAI_PA I\n\tpublic static final field HAI_XIU I\n\tpublic static final field HAN I\n\tpublic static final field HAN_XIAO I\n\tpublic static final field HAO I\n\tpublic static final field HAO_BANG I\n\tpublic static final field HAO_SHAN I\n\tpublic static final field HA_QIAN I\n\tpublic static final field HENG I\n\tpublic static final field HE_CAI I\n\tpublic static final field HE_HE_DA I\n\tpublic static final field HE_NAI I\n\tpublic static final field HE_XIE I\n\tpublic static final field HONG_BAO I\n\tpublic static final field HONG_BAO_BAO I\n\tpublic static final field HONG_BAO_DUO_DUO I\n\tpublic static final field HUAI_XIAO I\n\tpublic static final field HUA_CHI I\n\tpublic static final field HUA_DUO_LIAN I\n\tpublic static final field HUI_SHOU I\n\tpublic static final field HUI_TOU I\n\tpublic static final field HU_HU_SHENG_WEI I\n\tpublic static final field HU_LIAN I\n\tpublic static final field JIA_YI I\n\tpublic static final field JIA_YOU I\n\tpublic static final field JIA_YOU_BAO_BAO I\n\tpublic static final field JIA_YOU_BI_SHENG I\n\tpublic static final field JIE_WU I\n\tpublic static final field JING_DAI I\n\tpublic static final field JING_KONG I\n\tpublic static final field JING_LI I\n\tpublic static final field JING_XI I\n\tpublic static final field JING_XIA I\n\tpublic static final field JING_YA I\n\tpublic static final field JI_DONG I\n\tpublic static final field JI_E I\n\tpublic static final field JI_ZHANG I\n\tpublic static final field JU_HUA I\n\tpublic static final field JU_JUE I\n\tpublic static final field JU_PAI_PAI I\n\tpublic static final field KAI_QIANG I\n\tpublic static final field KA_FEI I\n\tpublic static final field KEN_TOU I\n\tpublic static final field KE_AI I\n\tpublic static final field KE_DAO_LE I\n\tpublic static final field KE_LIAN I\n\tpublic static final field KE_TOU I\n\tpublic static final field KOU_BI I\n\tpublic static final field KOU_ZHAO_HU_TI I\n\tpublic static final field KU I\n\tpublic static final field KUAI_KU_LE I\n\tpublic static final field KUANG_XIAO I\n\tpublic static final field KUN I\n\tpublic static final field KU_LOU I\n\tpublic static final field K_GE I\n\tpublic static final field K歌 I\n\tpublic static final field LAN_QIU I\n\tpublic static final field LAO_SE_PI I\n\tpublic static final field LA_JIAO_JIANG I\n\tpublic static final field LA_YAN_JING I\n\tpublic static final field LEI_BEN I\n\tpublic static final field LENG_HAN I\n\tpublic static final field LENG_MO I\n\tpublic static final field LIAO_YI_LIAO I\n\tpublic static final field LIU_HAN I\n\tpublic static final field LIU_LEI I\n\tpublic static final field LI_WU I\n\tpublic static final field MAI_MENG I\n\tpublic static final field MANG_DAO_FEI_QI I\n\tpublic static final field MEI_GUI I\n\tpublic static final field MIAN_WU_BIAO_QING I\n\tpublic static final field MIAO_MIAO I\n\tpublic static final field MING_BAI I\n\tpublic static final field MO_GUI_XIAO I\n\tpublic static final field MO_JIN_LI I\n\tpublic static final field MO_YU I\n\tpublic static final field NAN_GUO I\n\tpublic static final field NAO_KUO_TENG I\n\tpublic static final field NA_DAO_HONG_BAO I\n\tpublic static final field NIU_A I\n\tpublic static final field NIU_QI_CHONG_TIAN I\n\tpublic static final field NI_ZHEN_BANG_BANG I\n\tpublic static final field NO I\n\tpublic static final field O I\n\tpublic static final field OK I\n\tpublic static final field OU_HUO I\n\tpublic static final field O_YO I\n\tpublic static final field PAI_SHOU I\n\tpublic static final field PAI_TOU I\n\tpublic static final field PAI_ZHUO I\n\tpublic static final field PANG_SAN_JIN I\n\tpublic static final field PEN_LIAN I\n\tpublic static final field PEN_XIE I\n\tpublic static final field PIAO_CHONG I\n\tpublic static final field PIE_ZUI I\n\tpublic static final field PING_PANG I\n\tpublic static final field PI_JIU I\n\tpublic static final field QIAO_DA I\n\tpublic static final field QIAO_KAI_XIN I\n\tpublic static final field QIA_YI_QIA I\n\tpublic static final field QING I\n\tpublic static final field QING_ZHU I\n\tpublic static final field QIN_QIN I\n\tpublic static final field QIU_DA_LE I\n\tpublic static final field QIU_HONG_BAO I\n\tpublic static final field QI_DAI I\n\tpublic static final field QI_DAO I\n\tpublic static final field QUAN_TOU I\n\tpublic static final field RANG_WO_KANG_KANG I\n\tpublic static final field RENG_GOU I\n\tpublic static final field RE_HUA_LE I\n\tpublic static final field SAO_RAO I\n\tpublic static final field SE I\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic static final field SHAN_DIAN I\n\tpublic static final field SHAN_LIAN I\n\tpublic static final field SHENG_LI I\n\tpublic static final field SHENG_QI I\n\tpublic static final field SHENG_RI_KUAI_LE I\n\tpublic static final field SHI_AI I\n\tpublic static final field SHOU_QIANG I\n\tpublic static final field SHUAI I\n\tpublic static final field SHUAI_TOU I\n\tpublic static final field SHUANG_XI I\n\tpublic static final field SHUI I\n\tpublic static final field SONG_HUA I\n\tpublic static final field SUAN_Q I\n\tpublic static final field TAI_NAN_LE I\n\tpublic static final field TAI_YANG I\n\tpublic static final field TIAN_PING I\n\tpublic static final field TIAN_YI_TIAN I\n\tpublic static final field TIAO_PI I\n\tpublic static final field TIAO_SHENG I\n\tpublic static final field TIAO_TIAO I\n\tpublic static final field TOU_KAN I\n\tpublic static final field TOU_TU I\n\tpublic static final field TOU_XIAO I\n\tpublic static final field TOU_ZHUANG_JI I\n\tpublic static final field TU I\n\tpublic static final field TUO_LIAN I\n\tpublic static final field TUO_SAI I\n\tpublic static final field WANG_WANG I\n\tpublic static final field WAN_CHENG I\n\tpublic static final field WEI_QU I\n\tpublic static final field WEI_XIAO I\n\tpublic static final field WEN_HAO_LIAN I\n\tpublic static final field WO_BU_KAN I\n\tpublic static final field WO_FANG_LE I\n\tpublic static final field WO_MEI_SHI I\n\tpublic static final field WO_SHOU I\n\tpublic static final field WO_SUAN_LE I\n\tpublic static final field WO_XIANG_KAI_LE I\n\tpublic static final field WO_ZUI_MEI I\n\tpublic static final field WU_LIAN I\n\tpublic static final field WU_LIAO I\n\tpublic static final field WU_NAI I\n\tpublic static final field WU_YAN_XIAO I\n\tpublic static final field XIA I\n\tpublic static final field XIAN_QI I\n\tpublic static final field XIAN_WEN I\n\tpublic static final field XIAO_JIU_JIE I\n\tpublic static final field XIAO_KU I\n\tpublic static final field XIAO_YANG_ER I\n\tpublic static final field XIE_HONG_BAO I\n\tpublic static final field XIE_YAN_XIAO I\n\tpublic static final field XIN_NIAN_YAN_HUA I\n\tpublic static final field XIN_SUI I\n\tpublic static final field XI_GUA I\n\tpublic static final field XU I\n\tpublic static final field YANG_TUO I\n\tpublic static final field YAN_HUA I\n\tpublic static final field YAO I\n\tpublic static final field YIN_XIAN I\n\tpublic static final field YI_WEN I\n\tpublic static final field YONG_BAO I\n\tpublic static final field YOU_BAI_NIAN I\n\tpublic static final field YOU_HENG_HENG I\n\tpublic static final field YOU_LING I\n\tpublic static final field YOU_QIN_QIN I\n\tpublic static final field YOU_TAI_JI I\n\tpublic static final field YOU_XIAN I\n\tpublic static final field YUAN_BAO I\n\tpublic static final field YUAN_LIANG I\n\tpublic static final field YUE_LIANG I\n\tpublic static final field YUN I\n\tpublic static final field ZAI_JIAN I\n\tpublic static final field ZAN I\n\tpublic static final field ZHA_DAN I\n\tpublic static final field ZHA_YAN_JING I\n\tpublic static final field ZHENG_YAN I\n\tpublic static final field ZHEN_HAO I\n\tpublic static final field ZHEN_JING I\n\tpublic static final field ZHE_MO I\n\tpublic static final field ZHOU_MA I\n\tpublic static final field ZHUAI_ZHA_TIAN I\n\tpublic static final field ZHUAN_QUAN I\n\tpublic static final field ZHUA_KUANG I\n\tpublic static final field ZHU_TOU I\n\tpublic static final field ZI_XI_FEN_XI I\n\tpublic static final field ZI_YA I\n\tpublic static final field ZUO_BAI_NIAN I\n\tpublic static final field ZUO_HENG_HENG I\n\tpublic static final field ZUO_QIN_QIN I\n\tpublic static final field ZUO_TAI_JI I\n\tpublic static final field ZU_QIU I\n\tpublic static final field doge I\n\tpublic static final field emm I\n\tpublic static final field names [Ljava/lang/String;\n\tpublic static final field 不 I\n\tpublic static final field 不开心 I\n\tpublic static final field 举牌牌 I\n\tpublic static final field 乒乓 I\n\tpublic static final field 亲亲 I\n\tpublic static final field 仔细分析 I\n\tpublic static final field 佛系 I\n\tpublic static final field 你真棒棒 I\n\tpublic static final field 便便 I\n\tpublic static final field 偷看 I\n\tpublic static final field 偷笑 I\n\tpublic static final field 傲慢 I\n\tpublic static final field 元宝 I\n\tpublic static final field 再见 I\n\tpublic static final field 冷汗 I\n\tpublic static final field 冷漠 I\n\tpublic static final field 凋谢 I\n\tpublic static final field 击掌 I\n\tpublic static final field 刀 I\n\tpublic static final field 加一 I\n\tpublic static final field 加油 I\n\tpublic static final field 加油必胜 I\n\tpublic static final field 加油抱抱 I\n\tpublic static final field 勾引 I\n\tpublic static final field 卖萌 I\n\tpublic static final field 原谅 I\n\tpublic static final field 双喜 I\n\tpublic static final field 发呆 I\n\tpublic static final field 发怒 I\n\tpublic static final field 发抖 I\n\tpublic static final field 变形 I\n\tpublic static final field 口罩护体 I\n\tpublic static final field 可怜 I\n\tpublic static final field 可爱 I\n\tpublic static final field 右亲亲 I\n\tpublic static final field 右哼哼 I\n\tpublic static final field 右太极 I\n\tpublic static final field 右拜年 I\n\tpublic static final field 吃 I\n\tpublic static final field 吃瓜 I\n\tpublic static final field 吃糖 I\n\tpublic static final field 吐 I\n\tpublic static final field 吓 I\n\tpublic static final field 呃 I\n\tpublic static final field 呲牙 I\n\tpublic static final field 呵呵哒 I\n\tpublic static final field 咒骂 I\n\tpublic static final field 咖啡 I\n\tpublic static final field 哈欠 I\n\tpublic static final field 哦 I\n\tpublic static final field 哦哟 I\n\tpublic static final field 哼 I\n\tpublic static final field 啃头 I\n\tpublic static final field 啤酒 I\n\tpublic static final field 啵啵 I\n\tpublic static final field 喝奶 I\n\tpublic static final field 喝彩 I\n\tpublic static final field 喵喵 I\n\tpublic static final field 喷脸 I\n\tpublic static final field 喷血 I\n\tpublic static final field 嗑到了 I\n\tpublic static final field 嘘 I\n\tpublic static final field 嘲讽 I\n\tpublic static final field 回头 I\n\tpublic static final field 困 I\n\tpublic static final field 坏笑 I\n\tpublic static final field 大哭 I\n\tpublic static final field 大展宏兔 I\n\tpublic static final field 大怨种 I\n\tpublic static final field 大笑 I\n\tpublic static final field 太南了 I\n\tpublic static final field 太阳 I\n\tpublic static final field 头撞击 I\n\tpublic static final field 头秃 I\n\tpublic static final field 奋斗 I\n\tpublic static final field 好 I\n\tpublic static final field 好棒 I\n\tpublic static final field 好闪 I\n\tpublic static final field 委屈 I\n\tpublic static final field 嫌弃 I\n\tpublic static final field 完成 I\n\tpublic static final field 害怕 I\n\tpublic static final field 害羞 I\n\tpublic static final field 对号 I\n\tpublic static final field 小样儿 I\n\tpublic static final field 小纠结 I\n\tpublic static final field 尴尬 I\n\tpublic static final field 崇拜 I\n\tpublic static final field 左亲亲 I\n\tpublic static final field 左哼哼 I\n\tpublic static final field 左太极 I\n\tpublic static final field 左拜年 I\n\tpublic static final field 差劲 I\n\tpublic static final field 干杯 I\n\tpublic static final field 幽灵 I\n\tpublic static final field 庆祝 I\n\tpublic static final field 开枪 I\n\tpublic static final field 得意 I\n\tpublic static final field 微笑 I\n\tpublic static final field 心碎 I\n\tpublic static final field 忙到飞起 I\n\tpublic static final field 快哭了 I\n\tpublic static final field 怄火 I\n\tpublic static final field 恭喜 I\n\tpublic static final field 悠闲 I\n\tpublic static final field 惊吓 I\n\tpublic static final field 惊呆 I\n\tpublic static final field 惊喜 I\n\tpublic static final field 惊恐 I\n\tpublic static final field 惊讶 I\n\tpublic static final field 憨笑 I\n\tpublic static final field 我不看 I\n\tpublic static final field 我想开了 I\n\tpublic static final field 我方了 I\n\tpublic static final field 我最美 I\n\tpublic static final field 我没事 I\n\tpublic static final field 我酸了 I\n\tpublic static final field 扇脸 I\n\tpublic static final field 手枪 I\n\tpublic static final field 打call I\n\tpublic static final field 打招呼 I\n\tpublic static final field 打脸 I\n\tpublic static final field 扔狗 I\n\tpublic static final field 托脸 I\n\tpublic static final field 托腮 I\n\tpublic static final field 扯一扯 I\n\tpublic static final field 抓狂 I\n\tpublic static final field 折磨 I\n\tpublic static final field 抠鼻 I\n\tpublic static final field 抱抱 I\n\tpublic static final field 抱拳 I\n\tpublic static final field 拍头 I\n\tpublic static final field 拍手 I\n\tpublic static final field 拍桌 I\n\tpublic static final field 拒绝 I\n\tpublic static final field 拜托 I\n\tpublic static final field 拜谢 I\n\tpublic static final field 拥抱 I\n\tpublic static final field 拳头 I\n\tpublic static final field 拽炸天 I\n\tpublic static final field 拿到红包 I\n\tpublic static final field 挥手 I\n\tpublic static final field 捂脸 I\n\tpublic static final field 掐一掐 I\n\tpublic static final field 握手 I\n\tpublic static final field 搬砖中 I\n\tpublic static final field 摸锦鲤 I\n\tpublic static final field 摸鱼 I\n\tpublic static final field 撇嘴 I\n\tpublic static final field 撩一撩 I\n\tpublic static final field 擦汗 I\n\tpublic static final field 敬礼 I\n\tpublic static final field 敲开心 I\n\tpublic static final field 敲打 I\n\tpublic static final field 斜眼笑 I\n\tpublic static final field 新年烟花 I\n\tpublic static final field 无奈 I\n\tpublic static final field 无眼笑 I\n\tpublic static final field 无聊 I\n\tpublic static final field 明白 I\n\tpublic static final field 晕 I\n\tpublic static final field 暗中观察 I\n\tpublic static final field 暴击 I\n\tpublic static final field 月亮 I\n\tpublic static final field 期待 I\n\tpublic static final field 棒棒糖 I\n\tpublic static final field 比心 I\n\tpublic static final field 求红包 I\n\tpublic static final field 汗 I\n\tpublic static final field 汪汪 I\n\tpublic static final field 沧桑 I\n\tpublic static final field 河蟹 I\n\tpublic static final field 泪奔 I\n\tpublic static final field 流汗 I\n\tpublic static final field 流泪 I\n\tpublic static final field 激动 I\n\tpublic static final field 灯笼 I\n\tpublic static final field 炸弹 I\n\tpublic static final field 点赞 I\n\tpublic static final field 烟花 I\n\tpublic static final field 热化了 I\n\tpublic static final field 爆筋 I\n\tpublic static final field 爱你 I\n\tpublic static final field 爱心 I\n\tpublic static final field 爱情 I\n\tpublic static final field 牛啊 I\n\tpublic static final field 牛气冲天 I\n\tpublic static final field 狂笑 I\n\tpublic static final field 猪头 I\n\tpublic static final field 献吻 I\n\tpublic static final field 玫瑰 I\n\tpublic static final field 瓢虫 I\n\tpublic static final field 生日快乐 I\n\tpublic static final field 生气 I\n\tpublic static final field 甩头 I\n\tpublic static final field 疑问 I\n\tpublic static final field 白眼 I\n\tpublic static final field 真好 I\n\tpublic static final field 眨眼睛 I\n\tpublic static final field 睁眼 I\n\tpublic static final field 睡 I\n\tpublic static final field 磕头 I\n\tpublic static final field 示爱 I\n\tpublic static final field 礼物 I\n\tpublic static final field 祈祷 I\n\tpublic static final field 福萝卜 I\n\tpublic static final field 笑哭 I\n\tpublic static final field 篮球 I\n\tpublic static final field 糊脸 I\n\tpublic static final field 糗大了 I\n\tpublic static final field 红包 I\n\tpublic static final field 红包包 I\n\tpublic static final field 红包多多 I\n\tpublic static final field 羊驼 I\n\tpublic static final field 老色痞 I\n\tpublic static final field 胖三斤 I\n\tpublic static final field 胜利 I\n\tpublic static final field 脑阔疼 I\n\tpublic static final field 舔一舔 I\n\tpublic static final field 舔屏 I\n\tpublic static final field 色 I\n\tpublic static final field 花朵脸 I\n\tpublic static final field 花痴 I\n\tpublic static final field 茶 I\n\tpublic static final field 药 I\n\tpublic static final field 菊花 I\n\tpublic static final field 菜刀 I\n\tpublic static final field 菜狗 I\n\tpublic static final field 虎虎生威 I\n\tpublic static final field 蛋 I\n\tpublic static final field 蛋糕 I\n\tpublic static final field 街舞 I\n\tpublic static final field 衰 I\n\tpublic static final field 西瓜 I\n\tpublic static final field 让我康康 I\n\tpublic static final field 请 I\n\tpublic static final field 调皮 I\n\tpublic static final field 谢红包 I\n\tpublic static final field 豹富 I\n\tpublic static final field 赞 I\n\tpublic static final field 足球 I\n\tpublic static final field 跳绳 I\n\tpublic static final field 跳跳 I\n\tpublic static final field 踩 I\n\tpublic static final field 蹭一蹭 I\n\tpublic static final field 转圈 I\n\tpublic static final field 辣椒酱 I\n\tpublic static final field 辣眼睛 I\n\tpublic static final field 送花 I\n\tpublic static final field 鄙视 I\n\tpublic static final field 酷 I\n\tpublic static final field 酸Q I\n\tpublic static final field 钞票 I\n\tpublic static final field 错号 I\n\tpublic static final field 闪电 I\n\tpublic static final field 闭嘴 I\n\tpublic static final field 问号脸 I\n\tpublic static final field 阴险 I\n\tpublic static final field 难过 I\n\tpublic static final field 震惊 I\n\tpublic static final field 面无表情 I\n\tpublic static final field 鞭炮 I\n\tpublic static final field 顶呱呱 I\n\tpublic static final field 颤抖 I\n\tpublic static final field 飙泪 I\n\tpublic static final field 飞吻 I\n\tpublic static final field 飞机 I\n\tpublic static final field 饥饿 I\n\tpublic static final field 饭 I\n\tpublic static final field 骚扰 I\n\tpublic static final field 骷髅 I\n\tpublic static final field 魔鬼笑 I\n\tpublic static final field 鼓掌 I\n\tpublic fun <init> (I)V\n\tpublic synthetic fun <init> (IILkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic final fun component1 ()I\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic final fun copy (I)Lnet/mamoe/mirai/message/data/Face;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/Face;IILjava/lang/Object;)Lnet/mamoe/mirai/message/data/Face;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getId ()I\n\tpublic final fun getName ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/Face;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/Face$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/Face$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/Face;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/Face;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/Face$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/FileMessage : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/FileMessage$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic static fun create (Ljava/lang/String;ILjava/lang/String;J)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic abstract fun getId ()Ljava/lang/String;\n\tpublic abstract fun getInternalId ()I\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/FileMessage$Key;\n\tpublic synthetic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic abstract fun getName ()Ljava/lang/String;\n\tpublic abstract fun getSize ()J\n\tpublic fun toAbsoluteFile (Lnet/mamoe/mirai/contact/FileSupported;)Lnet/mamoe/mirai/contact/file/AbsoluteFile;\n\tpublic abstract fun toAbsoluteFile (Lnet/mamoe/mirai/contact/FileSupported;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun toRemoteFile (Lnet/mamoe/mirai/contact/FileSupported;)Lnet/mamoe/mirai/utils/RemoteFile;\n\tpublic fun toRemoteFile (Lnet/mamoe/mirai/contact/FileSupported;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun toRemoteFile$suspendImpl (Lnet/mamoe/mirai/message/data/FileMessage;Lnet/mamoe/mirai/contact/FileSupported;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/message/data/FileMessage$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic final fun create (Ljava/lang/String;ILjava/lang/String;J)Lnet/mamoe/mirai/message/data/FileMessage;\n}\n\npublic final class net/mamoe/mirai/message/data/FileMessage$Serializer : kotlinx/serialization/KSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/FileMessage$Serializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/FileMessage;)V\n}\n\npublic final class net/mamoe/mirai/message/data/FlashImage : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/HummerMessage, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/FlashImage$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (ILnet/mamoe/mirai/message/data/Image;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/message/data/Image;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/message/data/Image;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/message/data/Image;)Lnet/mamoe/mirai/message/data/FlashImage;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/FlashImage;Lnet/mamoe/mirai/message/data/Image;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/FlashImage;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic static final fun from (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/FlashImage;\n\tpublic static final fun from (Lnet/mamoe/mirai/message/data/Image;)Lnet/mamoe/mirai/message/data/FlashImage;\n\tpublic final fun getImage ()Lnet/mamoe/mirai/message/data/Image;\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic fun hashCode ()I\n\tpublic fun serializeToMiraiCode ()Ljava/lang/String;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/FlashImage;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/FlashImage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/FlashImage$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/FlashImage;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/FlashImage;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/FlashImage$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic final fun from (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/FlashImage;\n\tpublic final fun from (Lnet/mamoe/mirai/message/data/Image;)Lnet/mamoe/mirai/message/data/FlashImage;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/FlashImageKt {\n\tpublic static final synthetic fun FlashImage (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/FlashImage;\n\tpublic static final synthetic fun flash (Lnet/mamoe/mirai/message/data/Image;)Lnet/mamoe/mirai/message/data/FlashImage;\n}\n\npublic final class net/mamoe/mirai/message/data/ForwardMessage : net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/ForwardMessage$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (ILjava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V\n\tpublic final fun component1 ()Ljava/util/List;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun component4 ()Ljava/lang/String;\n\tpublic final fun component5 ()Ljava/lang/String;\n\tpublic final fun component6 ()Ljava/util/List;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic final fun copy (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/ForwardMessage;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBrief ()Ljava/lang/String;\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic final fun getNodeList ()Ljava/util/List;\n\tpublic final fun getPreview ()Ljava/util/List;\n\tpublic final fun getSource ()Ljava/lang/String;\n\tpublic final fun getSummary ()Ljava/lang/String;\n\tpublic final fun getTitle ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/ForwardMessage;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/ForwardMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/ForwardMessage$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/ForwardMessage;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy {\n\tpublic static final field Default Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy$Default;\n\tpublic fun generateBrief (Lnet/mamoe/mirai/message/data/RawForwardMessage;)Ljava/lang/String;\n\tpublic fun generatePreview (Lnet/mamoe/mirai/message/data/RawForwardMessage;)Ljava/util/List;\n\tpublic fun generateSource (Lnet/mamoe/mirai/message/data/RawForwardMessage;)Ljava/lang/String;\n\tpublic fun generateSummary (Lnet/mamoe/mirai/message/data/RawForwardMessage;)Ljava/lang/String;\n\tpublic fun generateTitle (Lnet/mamoe/mirai/message/data/RawForwardMessage;)Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy$Default : net/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy {\n}\n\npublic final class net/mamoe/mirai/message/data/ForwardMessage$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/ForwardMessage$Node : net/mamoe/mirai/message/data/ForwardMessage$INode {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/ForwardMessage$Node$Companion;\n\tpublic synthetic fun <init> (IJILjava/lang/String;Lnet/mamoe/mirai/message/data/MessageChain;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> (JILjava/lang/String;Lnet/mamoe/mirai/message/data/Message;)V\n\tpublic fun <init> (JILjava/lang/String;Lnet/mamoe/mirai/message/data/MessageChain;)V\n\tpublic final fun component1 ()J\n\tpublic final fun component2 ()I\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun component4 ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun copy (JILjava/lang/String;Lnet/mamoe/mirai/message/data/MessageChain;)Lnet/mamoe/mirai/message/data/ForwardMessage$Node;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/ForwardMessage$Node;JILjava/lang/String;Lnet/mamoe/mirai/message/data/MessageChain;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessage$Node;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getMessageChain ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSenderId ()J\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getTime ()I\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/ForwardMessage$Node;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/ForwardMessage$Node$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/ForwardMessage$Node$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/ForwardMessage$Node;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/ForwardMessage$Node;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/ForwardMessage$Node$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/ForwardMessageBuilder : java/util/List, kotlin/jvm/internal/markers/KMutableList {\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Contact;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/contact/Contact;I)V\n\tpublic synthetic fun add (ILjava/lang/Object;)V\n\tpublic fun add (ILnet/mamoe/mirai/message/data/ForwardMessage$INode;)V\n\tpublic final fun add (JLjava/lang/String;ILkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun add (JLjava/lang/String;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun add (JLjava/lang/String;Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun add (JLjava/lang/String;Lnet/mamoe/mirai/message/data/Message;I)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic synthetic fun add (Ljava/lang/Object;)Z\n\tpublic final fun add (Lnet/mamoe/mirai/contact/User;Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun add (Lnet/mamoe/mirai/contact/User;Lnet/mamoe/mirai/message/data/Message;I)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun add (Lnet/mamoe/mirai/contact/UserOrBot;ILkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun add (Lnet/mamoe/mirai/contact/UserOrBot;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun add (Lnet/mamoe/mirai/contact/UserOrBot;Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun add (Lnet/mamoe/mirai/contact/UserOrBot;Lnet/mamoe/mirai/message/data/Message;I)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun add (Lnet/mamoe/mirai/event/events/MessageEvent;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic fun add (Lnet/mamoe/mirai/message/data/ForwardMessage$INode;)Z\n\tpublic static synthetic fun add$default (Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;JLjava/lang/String;ILkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic static synthetic fun add$default (Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;JLjava/lang/String;Lnet/mamoe/mirai/message/data/Message;IILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic static synthetic fun add$default (Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;Lnet/mamoe/mirai/contact/User;Lnet/mamoe/mirai/message/data/Message;IILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic static synthetic fun add$default (Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;Lnet/mamoe/mirai/contact/UserOrBot;ILkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic static synthetic fun add$default (Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;Lnet/mamoe/mirai/contact/UserOrBot;Lnet/mamoe/mirai/message/data/Message;IILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic fun addAll (ILjava/util/Collection;)Z\n\tpublic fun addAll (Ljava/util/Collection;)Z\n\tpublic final fun at (II)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun at (JI)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun at (Lnet/mamoe/mirai/contact/User;I)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun at (Lnet/mamoe/mirai/contact/UserOrBot;I)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun build ()Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic fun clear ()V\n\tpublic final fun contains (Ljava/lang/Object;)Z\n\tpublic fun contains (Lnet/mamoe/mirai/message/data/ForwardMessage$INode;)Z\n\tpublic fun containsAll (Ljava/util/Collection;)Z\n\tpublic synthetic fun get (I)Ljava/lang/Object;\n\tpublic fun get (I)Lnet/mamoe/mirai/message/data/ForwardMessage$INode;\n\tpublic final fun getContext ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun getCurrentTime ()I\n\tpublic final fun getDisplayStrategy ()Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;\n\tpublic fun getSize ()I\n\tpublic final fun indexOf (Ljava/lang/Object;)I\n\tpublic fun indexOf (Lnet/mamoe/mirai/message/data/ForwardMessage$INode;)I\n\tpublic fun isEmpty ()Z\n\tpublic fun iterator ()Ljava/util/Iterator;\n\tpublic final fun lastIndexOf (Ljava/lang/Object;)I\n\tpublic fun lastIndexOf (Lnet/mamoe/mirai/message/data/ForwardMessage$INode;)I\n\tpublic fun listIterator ()Ljava/util/ListIterator;\n\tpublic fun listIterator (I)Ljava/util/ListIterator;\n\tpublic final fun named (ILjava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun named (JLjava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun named (Lnet/mamoe/mirai/contact/User;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun named (Lnet/mamoe/mirai/contact/UserOrBot;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic synthetic fun remove (I)Ljava/lang/Object;\n\tpublic final fun remove (I)Lnet/mamoe/mirai/message/data/ForwardMessage$INode;\n\tpublic final fun remove (Ljava/lang/Object;)Z\n\tpublic fun remove (Lnet/mamoe/mirai/message/data/ForwardMessage$INode;)Z\n\tpublic fun removeAll (Ljava/util/Collection;)Z\n\tpublic fun removeAt (I)Lnet/mamoe/mirai/message/data/ForwardMessage$INode;\n\tpublic fun retainAll (Ljava/util/Collection;)Z\n\tpublic final fun says (ILjava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (ILkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (ILnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (JLjava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (JLkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (JLnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (Lnet/mamoe/mirai/Bot;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (Lnet/mamoe/mirai/Bot;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (Lnet/mamoe/mirai/contact/User;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (Lnet/mamoe/mirai/contact/User;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (Lnet/mamoe/mirai/contact/User;Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (Lnet/mamoe/mirai/contact/UserOrBot;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (Lnet/mamoe/mirai/contact/UserOrBot;Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic synthetic fun set (ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun set (ILnet/mamoe/mirai/message/data/ForwardMessage$INode;)Lnet/mamoe/mirai/message/data/ForwardMessage$INode;\n\tpublic final fun setCurrentTime (I)V\n\tpublic final fun setDisplayStrategy (Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;)V\n\tpublic final fun size ()I\n\tpublic fun subList (II)Ljava/util/List;\n\tpublic fun toArray ()[Ljava/lang/Object;\n\tpublic fun toArray ([Ljava/lang/Object;)[Ljava/lang/Object;\n\tpublic final fun toRawForwardMessage ()Lnet/mamoe/mirai/message/data/RawForwardMessage;\n}\n\npublic final class net/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode : net/mamoe/mirai/message/data/ForwardMessage$INode {\n\tpublic field messageChain Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun at (I)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic fun getMessageChain ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getSenderId ()J\n\tpublic fun getSenderName ()Ljava/lang/String;\n\tpublic fun getTime ()I\n\tpublic final fun message (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun message (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun named (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun says (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun says (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder;\n\tpublic final fun sender (Lnet/mamoe/mirai/contact/User;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun sender (Lnet/mamoe/mirai/contact/UserOrBot;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun senderId (I)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun senderId (J)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic final fun senderName (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic fun setMessageChain (Lnet/mamoe/mirai/message/data/MessageChain;)V\n\tpublic fun setSenderId (J)V\n\tpublic fun setSenderName (Ljava/lang/String;)V\n\tpublic fun setTime (I)V\n\tpublic final fun time (I)Lnet/mamoe/mirai/message/data/ForwardMessageBuilder$BuilderNode;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic abstract interface annotation class net/mamoe/mirai/message/data/ForwardMessageDsl : java/lang/annotation/Annotation {\n}\n\npublic final class net/mamoe/mirai/message/data/ForwardMessageKt {\n\tpublic static final synthetic fun buildForwardMessage (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static final synthetic fun buildForwardMessage (Lnet/mamoe/mirai/event/events/MessageEvent;Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static synthetic fun buildForwardMessage$default (Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static synthetic fun buildForwardMessage$default (Lnet/mamoe/mirai/event/events/MessageEvent;Lnet/mamoe/mirai/contact/Contact;Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static final fun toForwardMessage (Ljava/lang/Iterable;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static final fun toForwardMessage (Ljava/lang/Iterable;Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static final fun toForwardMessage (Lnet/mamoe/mirai/message/data/Message;JLjava/lang/String;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static final fun toForwardMessage (Lnet/mamoe/mirai/message/data/Message;JLjava/lang/String;I)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static final fun toForwardMessage (Lnet/mamoe/mirai/message/data/Message;JLjava/lang/String;ILnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static final fun toForwardMessage (Lnet/mamoe/mirai/message/data/Message;Lnet/mamoe/mirai/contact/User;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static final fun toForwardMessage (Lnet/mamoe/mirai/message/data/Message;Lnet/mamoe/mirai/contact/User;I)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static final fun toForwardMessage (Lnet/mamoe/mirai/message/data/Message;Lnet/mamoe/mirai/contact/User;ILnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static synthetic fun toForwardMessage$default (Ljava/lang/Iterable;Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static synthetic fun toForwardMessage$default (Lnet/mamoe/mirai/message/data/Message;JLjava/lang/String;ILnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic static synthetic fun toForwardMessage$default (Lnet/mamoe/mirai/message/data/Message;Lnet/mamoe/mirai/contact/User;ILnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n}\n\npublic final class net/mamoe/mirai/message/data/HummerMessage$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/Image : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/Message, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/Image$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic static fun fromId (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic abstract fun getHeight ()I\n\tpublic abstract fun getImageId ()Ljava/lang/String;\n\tpublic static fun getImageIdRegex ()Lkotlin/text/Regex;\n\tpublic static fun getImageResourceIdRegex1 ()Lkotlin/text/Regex;\n\tpublic static fun getImageResourceIdRegex2 ()Lkotlin/text/Regex;\n\tpublic abstract fun getImageType ()Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic fun getMd5 ()[B\n\tpublic abstract fun getSize ()J\n\tpublic abstract fun getWidth ()I\n\tpublic fun isEmoji ()Z\n\tpublic static fun isUploaded (Lnet/mamoe/mirai/Bot;[BJ)Z\n\tpublic static fun isUploaded (Lnet/mamoe/mirai/Bot;[BJLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun isUploaded (Lnet/mamoe/mirai/message/data/Image;Lnet/mamoe/mirai/Bot;)Z\n\tpublic static fun isUploaded (Lnet/mamoe/mirai/message/data/Image;Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun newBuilder (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image$Builder;\n\tpublic static fun queryUrl (Lnet/mamoe/mirai/message/data/Image;)Ljava/lang/String;\n\tpublic static fun queryUrl (Lnet/mamoe/mirai/message/data/Image;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/message/data/Image$AsStringSerializer : kotlinx/serialization/KSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/Image$AsStringSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/Image;)V\n}\n\npublic final class net/mamoe/mirai/message/data/Image$Builder {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/Image$Builder$Companion;\n\tpublic synthetic fun <init> (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun build ()Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun getHeight ()I\n\tpublic final fun getImageId ()Ljava/lang/String;\n\tpublic final fun getSize ()J\n\tpublic final fun getType ()Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic final fun getWidth ()I\n\tpublic final fun isEmoji ()Z\n\tpublic static final fun newBuilder (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image$Builder;\n\tpublic final fun setEmoji (Z)V\n\tpublic final fun setHeight (I)V\n\tpublic final fun setImageId (Ljava/lang/String;)V\n\tpublic final fun setSize (J)V\n\tpublic final fun setType (Lnet/mamoe/mirai/message/data/ImageType;)V\n\tpublic final fun setWidth (I)V\n}\n\npublic final class net/mamoe/mirai/message/data/Image$Builder$Companion {\n\tpublic final fun newBuilder (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image$Builder;\n}\n\npublic final class net/mamoe/mirai/message/data/Image$Key : net/mamoe/mirai/message/data/AbstractMessageKey {\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic final fun calculateImageMd5ByImageId (Ljava/lang/String;)[B\n\tpublic final fun fromId (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun getImageIdRegex ()Lkotlin/text/Regex;\n\tpublic final fun getImageResourceIdRegex1 ()Lkotlin/text/Regex;\n\tpublic final fun getImageResourceIdRegex2 ()Lkotlin/text/Regex;\n\tpublic final fun isUploaded (Lnet/mamoe/mirai/Bot;[BJ)Z\n\tpublic final fun isUploaded (Lnet/mamoe/mirai/Bot;[BJLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun isUploaded (Lnet/mamoe/mirai/message/data/Image;Lnet/mamoe/mirai/Bot;)Z\n\tpublic final fun isUploaded (Lnet/mamoe/mirai/message/data/Image;Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun newBuilder (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image$Builder;\n\tpublic final fun queryUrl (Lnet/mamoe/mirai/message/data/Image;)Ljava/lang/String;\n\tpublic final fun queryUrl (Lnet/mamoe/mirai/message/data/Image;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/message/data/Image$Serializer : kotlinx/serialization/KSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/Image$Serializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/Image;)V\n}\n\npublic final class net/mamoe/mirai/message/data/ImageType : java/lang/Enum {\n\tpublic static final field APNG Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic static final field BMP Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/ImageType$Companion;\n\tpublic static final field GIF Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic static final field JPG Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic static final field PNG Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic static final field UNKNOWN Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic final fun getFormatName ()Ljava/lang/String;\n\tpublic static final fun match (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic static final fun matchOrNull (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic static fun values ()[Lnet/mamoe/mirai/message/data/ImageType;\n}\n\npublic final class net/mamoe/mirai/message/data/ImageType$Companion {\n\tpublic final fun match (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic final fun matchOrNull (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/ImageType;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/LightApp : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/RichMessage {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/LightApp$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (ILjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun copy (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/LightApp;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/LightApp;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/LightApp;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getContent ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/LightApp;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/LightApp$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/LightApp$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/LightApp;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/LightApp;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/LightApp$Key : net/mamoe/mirai/message/data/AbstractMessageKey {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/MarketFace : net/mamoe/mirai/message/data/HummerMessage {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/MarketFace$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic abstract fun getId ()I\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic abstract fun getName ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/MarketFace$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/Message {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/Message$Companion;\n\tpublic fun contentEquals (Ljava/lang/String;Z)Z\n\tpublic fun contentEquals (Lnet/mamoe/mirai/message/data/Message;Z)Z\n\tpublic fun contentEquals (Lnet/mamoe/mirai/message/data/Message;ZZ)Z\n\tpublic static synthetic fun contentEquals$default (Lnet/mamoe/mirai/message/data/Message;Ljava/lang/String;ZILjava/lang/Object;)Z\n\tpublic static synthetic fun contentEquals$default (Lnet/mamoe/mirai/message/data/Message;Lnet/mamoe/mirai/message/data/Message;ZILjava/lang/Object;)Z\n\tpublic static synthetic fun contentEquals$default (Lnet/mamoe/mirai/message/data/Message;Lnet/mamoe/mirai/message/data/Message;ZZILjava/lang/Object;)Z\n\tpublic abstract fun contentToString ()Ljava/lang/String;\n\tpublic synthetic fun followedBy (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun plus (Ljava/lang/CharSequence;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun plus (Ljava/lang/Iterable;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun plus (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun plus (Lkotlin/sequences/Sequence;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun plus (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun plus (Lnet/mamoe/mirai/message/data/MessageChain;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun plus (Lnet/mamoe/mirai/message/data/SingleMessage;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun plus ([Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun plusIterableString (Ljava/lang/Iterable;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic abstract fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/Message$Companion {\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/MessageChain : java/util/List, java/util/RandomAccess, kotlin/jvm/internal/markers/KMappedMarker, net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/Message {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/MessageChain$Companion;\n\tpublic fun contains (Lnet/mamoe/mirai/message/data/MessageKey;)Z\n\tpublic static fun deserializeFromJsonString (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static fun deserializeFromJsonString (Ljava/lang/String;Lkotlinx/serialization/json/Json;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static fun deserializeFromMiraiCode (Ljava/lang/String;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static fun deserializeFromMiraiCode (Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/String;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static synthetic fun deserializeJsonToMessageChain (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static synthetic fun deserializeJsonToMessageChain (Ljava/lang/String;Lkotlinx/serialization/json/Json;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun get (Lnet/mamoe/mirai/message/data/MessageKey;)Lnet/mamoe/mirai/message/data/SingleMessage;\n\tpublic static fun serializeToJsonString (Lnet/mamoe/mirai/message/data/MessageChain;)Ljava/lang/String;\n\tpublic static fun serializeToJsonString (Lnet/mamoe/mirai/message/data/MessageChain;Lkotlinx/serialization/json/Json;)Ljava/lang/String;\n\tpublic static fun serializeToString (Lnet/mamoe/mirai/message/data/MessageChain;Lkotlinx/serialization/StringFormat;)Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageChain$Companion {\n\tpublic final fun deserializeFromJsonString (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun deserializeFromJsonString (Ljava/lang/String;Lkotlinx/serialization/json/Json;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static synthetic fun deserializeFromJsonString$default (Lnet/mamoe/mirai/message/data/MessageChain$Companion;Ljava/lang/String;Lkotlinx/serialization/json/Json;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun deserializeFromMiraiCode (Ljava/lang/String;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun deserializeFromMiraiCode (Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/String;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static synthetic fun deserializeFromMiraiCode$default (Lnet/mamoe/mirai/message/data/MessageChain$Companion;Ljava/lang/String;Lnet/mamoe/mirai/contact/Contact;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static synthetic fun deserializeFromMiraiCode$default (Lnet/mamoe/mirai/message/data/MessageChain$Companion;Lnet/mamoe/mirai/message/data/MessageChain;Ljava/lang/String;Lnet/mamoe/mirai/contact/Contact;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final synthetic fun deserializeJsonToMessageChain (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final synthetic fun deserializeJsonToMessageChain (Ljava/lang/String;Lkotlinx/serialization/json/Json;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun serializeToJsonString (Lnet/mamoe/mirai/message/data/MessageChain;)Ljava/lang/String;\n\tpublic final fun serializeToJsonString (Lnet/mamoe/mirai/message/data/MessageChain;Lkotlinx/serialization/json/Json;)Ljava/lang/String;\n\tpublic static synthetic fun serializeToJsonString$default (Lnet/mamoe/mirai/message/data/MessageChain$Companion;Lnet/mamoe/mirai/message/data/MessageChain;Lkotlinx/serialization/json/Json;ILjava/lang/Object;)Ljava/lang/String;\n\tpublic final fun serializeToString (Lnet/mamoe/mirai/message/data/MessageChain;Lkotlinx/serialization/StringFormat;)Ljava/lang/String;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageChain$Serializer : kotlinx/serialization/KSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/MessageChain$Serializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/MessageChain;)V\n}\n\npublic final class net/mamoe/mirai/message/data/MessageChainBuilder : java/lang/Appendable, java/util/List, kotlin/jvm/internal/markers/KMutableList {\n\tpublic fun <init> ()V\n\tpublic fun <init> (I)V\n\tpublic synthetic fun add (ILjava/lang/Object;)V\n\tpublic fun add (ILnet/mamoe/mirai/message/data/SingleMessage;)V\n\tpublic synthetic fun add (Ljava/lang/Object;)Z\n\tpublic final fun add (Ljava/lang/String;)V\n\tpublic final fun add (Lnet/mamoe/mirai/message/data/Message;)Z\n\tpublic fun add (Lnet/mamoe/mirai/message/data/SingleMessage;)Z\n\tpublic fun addAll (ILjava/util/Collection;)Z\n\tpublic final fun addAll (Ljava/lang/Iterable;)Z\n\tpublic fun addAll (Ljava/util/Collection;)Z\n\tpublic final fun addAllFlatten (Ljava/lang/Iterable;)Z\n\tpublic synthetic fun append (C)Ljava/lang/Appendable;\n\tpublic fun append (C)Lnet/mamoe/mirai/message/data/MessageChainBuilder;\n\tpublic synthetic fun append (Ljava/lang/CharSequence;)Ljava/lang/Appendable;\n\tpublic fun append (Ljava/lang/CharSequence;)Lnet/mamoe/mirai/message/data/MessageChainBuilder;\n\tpublic synthetic fun append (Ljava/lang/CharSequence;II)Ljava/lang/Appendable;\n\tpublic fun append (Ljava/lang/CharSequence;II)Lnet/mamoe/mirai/message/data/MessageChainBuilder;\n\tpublic final fun append (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/MessageChainBuilder;\n\tpublic final fun append (Lnet/mamoe/mirai/message/data/SingleMessage;)Lnet/mamoe/mirai/message/data/MessageChainBuilder;\n\tpublic final fun asMessageChain ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic final fun build ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun clear ()V\n\tpublic final fun contains (Ljava/lang/Object;)Z\n\tpublic fun contains (Lnet/mamoe/mirai/message/data/SingleMessage;)Z\n\tpublic fun containsAll (Ljava/util/Collection;)Z\n\tpublic final fun copy ()Lnet/mamoe/mirai/message/data/MessageChainBuilder;\n\tpublic synthetic fun get (I)Ljava/lang/Object;\n\tpublic fun get (I)Lnet/mamoe/mirai/message/data/SingleMessage;\n\tpublic fun getSize ()I\n\tpublic final fun indexOf (Ljava/lang/Object;)I\n\tpublic fun indexOf (Lnet/mamoe/mirai/message/data/SingleMessage;)I\n\tpublic fun isEmpty ()Z\n\tpublic fun iterator ()Ljava/util/Iterator;\n\tpublic final fun lastIndexOf (Ljava/lang/Object;)I\n\tpublic fun lastIndexOf (Lnet/mamoe/mirai/message/data/SingleMessage;)I\n\tpublic fun listIterator ()Ljava/util/ListIterator;\n\tpublic fun listIterator (I)Ljava/util/ListIterator;\n\tpublic final synthetic fun plusAssign (Ljava/lang/CharSequence;)V\n\tpublic final synthetic fun plusAssign (Ljava/lang/String;)V\n\tpublic final synthetic fun plusAssign (Lnet/mamoe/mirai/message/data/Message;)V\n\tpublic final synthetic fun plusAssign (Lnet/mamoe/mirai/message/data/SingleMessage;)V\n\tpublic synthetic fun remove (I)Ljava/lang/Object;\n\tpublic final fun remove (I)Lnet/mamoe/mirai/message/data/SingleMessage;\n\tpublic final fun remove (Ljava/lang/Object;)Z\n\tpublic fun remove (Lnet/mamoe/mirai/message/data/SingleMessage;)Z\n\tpublic fun removeAll (Ljava/util/Collection;)Z\n\tpublic fun removeAt (I)Lnet/mamoe/mirai/message/data/SingleMessage;\n\tpublic fun retainAll (Ljava/util/Collection;)Z\n\tpublic synthetic fun set (ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic fun set (ILnet/mamoe/mirai/message/data/SingleMessage;)Lnet/mamoe/mirai/message/data/SingleMessage;\n\tpublic final fun size ()I\n\tpublic fun subList (II)Ljava/util/List;\n\tpublic fun toArray ()[Ljava/lang/Object;\n\tpublic fun toArray ([Ljava/lang/Object;)[Ljava/lang/Object;\n\tpublic final synthetic fun unaryPlus (Ljava/lang/String;)V\n\tpublic final synthetic fun unaryPlus (Lnet/mamoe/mirai/message/data/Message;)V\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/MessageContent : net/mamoe/mirai/message/data/SingleMessage {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/MessageContent$Key;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageContent$Key : net/mamoe/mirai/message/data/AbstractMessageKey {\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/MessageKey {\n\tpublic abstract fun getSafeCast ()Lkotlin/jvm/functions/Function1;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageKeyKt {\n\tpublic static final fun getTopmostKey (Lnet/mamoe/mirai/message/data/MessageKey;)Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic static final fun isInstance (Lnet/mamoe/mirai/message/data/MessageKey;Lnet/mamoe/mirai/message/data/SingleMessage;)Z\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/MessageMetadata : net/mamoe/mirai/message/data/SingleMessage {\n\tpublic fun contentToString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageOrigin$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/MessageOrigin$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/MessageOrigin;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/MessageOrigin;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageOrigin$Key : net/mamoe/mirai/message/data/AbstractMessageKey {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageOriginKind : java/lang/Enum {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/MessageOriginKind$Companion;\n\tpublic static final field FORWARD Lnet/mamoe/mirai/message/data/MessageOriginKind;\n\tpublic static final field LONG Lnet/mamoe/mirai/message/data/MessageOriginKind;\n\tpublic static final field MUSIC_SHARE Lnet/mamoe/mirai/message/data/MessageOriginKind;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MessageOriginKind;\n\tpublic static fun values ()[Lnet/mamoe/mirai/message/data/MessageOriginKind;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageOriginKind$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract class net/mamoe/mirai/message/data/MessageSource : net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/Message, net/mamoe/mirai/message/data/MessageMetadata {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/MessageSource$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic abstract fun getBotId ()J\n\tpublic abstract fun getFromId ()J\n\tpublic abstract fun getIds ()[I\n\tpublic abstract fun getInternalIds ()[I\n\tpublic final fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic abstract fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic abstract fun getOriginalMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic abstract fun getTargetId ()J\n\tpublic abstract fun getTime ()I\n\tpublic abstract fun isOriginalMessageInitialized ()Z\n\tpublic static final fun quote (Lnet/mamoe/mirai/message/data/MessageChain;)Lnet/mamoe/mirai/message/data/QuoteReply;\n\tpublic static final fun quote (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/message/data/QuoteReply;\n\tpublic static final fun recall (Lnet/mamoe/mirai/message/data/MessageChain;)V\n\tpublic static final fun recall (Lnet/mamoe/mirai/message/data/MessageChain;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final fun recall (Lnet/mamoe/mirai/message/data/MessageSource;)V\n\tpublic static final fun recall (Lnet/mamoe/mirai/message/data/MessageSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final fun recallIn (Lnet/mamoe/mirai/message/data/MessageChain;J)Lnet/mamoe/mirai/message/action/AsyncRecallResult;\n\tpublic static final fun recallIn (Lnet/mamoe/mirai/message/data/MessageSource;J)Lnet/mamoe/mirai/message/action/AsyncRecallResult;\n\tpublic abstract fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageSource$Key : net/mamoe/mirai/message/data/AbstractMessageKey {\n\tpublic final fun quote (Lnet/mamoe/mirai/message/data/MessageChain;)Lnet/mamoe/mirai/message/data/QuoteReply;\n\tpublic final fun quote (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/message/data/QuoteReply;\n\tpublic final fun recall (Lnet/mamoe/mirai/message/data/MessageChain;)V\n\tpublic final fun recall (Lnet/mamoe/mirai/message/data/MessageChain;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun recall (Lnet/mamoe/mirai/message/data/MessageSource;)V\n\tpublic final fun recall (Lnet/mamoe/mirai/message/data/MessageSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun recallIn (Lnet/mamoe/mirai/message/data/MessageChain;J)Lnet/mamoe/mirai/message/action/AsyncRecallResult;\n\tpublic final fun recallIn (Lnet/mamoe/mirai/message/data/MessageSource;J)Lnet/mamoe/mirai/message/action/AsyncRecallResult;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageSource$Serializer : kotlinx/serialization/KSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/MessageSource$Serializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/MessageSource;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/MessageSource;)V\n}\n\npublic final class net/mamoe/mirai/message/data/MessageSourceAmender : net/mamoe/mirai/message/data/MessageSourceBuilder {\n\tpublic fun <init> (Lnet/mamoe/mirai/message/data/MessageSource;)V\n\tpublic fun getFromId ()J\n\tpublic fun getIds ()[I\n\tpublic fun getInternalIds ()[I\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic final fun getOriginalMessage ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic fun getTargetId ()J\n\tpublic fun getTime ()I\n\tpublic fun setFromId (J)V\n\tpublic fun setIds ([I)V\n\tpublic fun setInternalIds ([I)V\n\tpublic final fun setKind (Lnet/mamoe/mirai/message/data/MessageSourceKind;)V\n\tpublic final fun setOriginalMessage (Lnet/mamoe/mirai/message/data/MessageChain;)V\n\tpublic fun setTargetId (J)V\n\tpublic fun setTime (I)V\n}\n\npublic class net/mamoe/mirai/message/data/MessageSourceBuilder {\n\tpublic fun <init> ()V\n\tpublic final fun allFrom (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun build (JLnet/mamoe/mirai/message/data/MessageSourceKind;)Lnet/mamoe/mirai/message/data/OfflineMessageSource;\n\tpublic final fun clearMessages ()Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic fun getFromId ()J\n\tpublic fun getIds ()[I\n\tpublic fun getInternalIds ()[I\n\tpublic fun getTargetId ()J\n\tpublic fun getTime ()I\n\tpublic final fun id (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun id ([I)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun internalId (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun internalId ([I)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun messages (Ljava/lang/Iterable;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final synthetic fun messages (Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun messages ([Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun messagesFrom (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun metadata (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun sender (J)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun sender (Lnet/mamoe/mirai/contact/ContactOrBot;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic fun setFromId (J)V\n\tpublic fun setIds ([I)V\n\tpublic fun setInternalIds ([I)V\n\tpublic final fun setSenderAndTarget (Lnet/mamoe/mirai/contact/ContactOrBot;Lnet/mamoe/mirai/contact/ContactOrBot;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic fun setTargetId (J)V\n\tpublic fun setTime (I)V\n\tpublic final fun target (J)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun target (Lnet/mamoe/mirai/contact/ContactOrBot;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun time (I)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n\tpublic final fun time (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/message/data/MessageSourceBuilder;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageSourceKind : java/lang/Enum {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/MessageSourceKind$Companion;\n\tpublic static final field FRIEND Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic static final field GROUP Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic static final field STRANGER Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic static final field TEMP Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic static fun values ()[Lnet/mamoe/mirai/message/data/MessageSourceKind;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageSourceKind$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/MessageUtils {\n\tpublic static final synthetic fun At (Lnet/mamoe/mirai/contact/UserOrBot;)Lnet/mamoe/mirai/message/data/At;\n\tpublic static final synthetic fun FileMessage (Ljava/lang/String;ILjava/lang/String;J)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static final synthetic fun Image (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static final synthetic fun Image (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static synthetic fun Image$default (Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static final synthetic fun OfflineAudio (Ljava/lang/String;[BJLnet/mamoe/mirai/message/data/AudioCodec;[B)Lnet/mamoe/mirai/message/data/OfflineAudio;\n\tpublic static final synthetic fun OfflineAudio (Lnet/mamoe/mirai/message/data/OnlineAudio;)Lnet/mamoe/mirai/message/data/OfflineAudio;\n\tpublic static final synthetic fun UnsupportedMessage ([B)Lnet/mamoe/mirai/message/data/UnsupportedMessage;\n\tpublic static final synthetic fun at (Lnet/mamoe/mirai/contact/Member;)Lnet/mamoe/mirai/message/data/At;\n\tpublic static final fun buildMessageChain (ILkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final fun buildMessageChain (Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final synthetic fun buildMessageSource (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/message/data/MessageSourceKind;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/OfflineMessageSource;\n\tpublic static final synthetic fun buildMessageSource (Lnet/mamoe/mirai/IMirai;JLnet/mamoe/mirai/message/data/MessageSourceKind;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/OfflineMessageSource;\n\tpublic static final synthetic fun calculateImageMd5 (Lnet/mamoe/mirai/message/data/Image;)[B\n\tpublic static final fun contentsList (Lnet/mamoe/mirai/message/data/MessageChain;)Ljava/util/List;\n\tpublic static final synthetic fun contentsSequence (Lnet/mamoe/mirai/message/data/MessageChain;)Lkotlin/sequences/Sequence;\n\tpublic static final fun copySource (Lnet/mamoe/mirai/message/data/MessageSource;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/OfflineMessageSource;\n\tpublic static final fun emptyMessageChain ()Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final synthetic fun getBot (Lnet/mamoe/mirai/message/data/MessageChain;)Lnet/mamoe/mirai/Bot;\n\tpublic static final fun getBot (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/Bot;\n\tpublic static final fun getBotOrNull (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/Bot;\n\tpublic static final synthetic fun getContent (Lnet/mamoe/mirai/message/data/Message;)Ljava/lang/String;\n\tpublic static final synthetic fun getIds (Lnet/mamoe/mirai/message/data/MessageChain;)[I\n\tpublic static final synthetic fun getInternalId (Lnet/mamoe/mirai/message/data/MessageChain;)[I\n\tpublic static final synthetic fun getKind (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic static final synthetic fun getKind (Lnet/mamoe/mirai/message/data/OnlineMessageSource;)Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic static final synthetic fun getLengthDuration (Lnet/mamoe/mirai/message/data/OnlineAudio;)J\n\tpublic static final synthetic fun getOrFail (Lnet/mamoe/mirai/message/data/MessageChain;Lnet/mamoe/mirai/message/data/MessageKey;Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/message/data/SingleMessage;\n\tpublic static synthetic fun getOrFail$default (Lnet/mamoe/mirai/message/data/MessageChain;Lnet/mamoe/mirai/message/data/MessageKey;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/SingleMessage;\n\tpublic static final synthetic fun getSource (Lnet/mamoe/mirai/message/data/MessageChain;)Lnet/mamoe/mirai/message/data/MessageSource;\n\tpublic static final synthetic fun getSourceOrNull (Lnet/mamoe/mirai/message/data/MessageChain;)Lnet/mamoe/mirai/message/data/MessageSource;\n\tpublic static final synthetic fun getTime (Lnet/mamoe/mirai/message/data/MessageChain;)I\n\tpublic static final fun isContentBlank (Lnet/mamoe/mirai/message/data/Message;)Z\n\tpublic static final fun isContentEmpty (Lnet/mamoe/mirai/message/data/Message;)Z\n\tpublic static final fun metadataList (Lnet/mamoe/mirai/message/data/MessageChain;)Ljava/util/List;\n\tpublic static final synthetic fun metadataSequence (Lnet/mamoe/mirai/message/data/MessageChain;)Lkotlin/sequences/Sequence;\n\tpublic static final fun newChain (Ljava/lang/Iterable;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final fun newChain (Ljava/util/Iterator;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final fun newChain (Ljava/util/stream/Stream;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final fun newChain (Lkotlin/sequences/Sequence;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final fun newChain (Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final fun newChain (Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final fun newChain ([Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final synthetic fun plus (Lnet/mamoe/mirai/message/data/Message;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun recallSource (Lnet/mamoe/mirai/message/data/QuoteReply;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final fun repeat (Lnet/mamoe/mirai/message/data/Message;I)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final synthetic fun sendTo (Lnet/mamoe/mirai/message/data/Message;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static final synthetic fun times (Lnet/mamoe/mirai/message/data/Message;I)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final synthetic fun toMessageChain ([Lnet/mamoe/mirai/message/data/Message;)Lnet/mamoe/mirai/message/data/MessageChain;\n\tpublic static final fun toOfflineMessageSource (Lnet/mamoe/mirai/message/data/OnlineMessageSource;)Lnet/mamoe/mirai/message/data/OfflineMessageSource;\n\tpublic static final synthetic fun toPlainText (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/PlainText;\n\tpublic static final synthetic fun toVoice (Lnet/mamoe/mirai/message/data/Audio;)Lnet/mamoe/mirai/message/data/Voice;\n}\n\npublic final class net/mamoe/mirai/message/data/MusicKind : java/lang/Enum {\n\tpublic static final field KugouMusic Lnet/mamoe/mirai/message/data/MusicKind;\n\tpublic static final field KuwoMusic Lnet/mamoe/mirai/message/data/MusicKind;\n\tpublic static final field MiguMusic Lnet/mamoe/mirai/message/data/MusicKind;\n\tpublic static final field NeteaseCloudMusic Lnet/mamoe/mirai/message/data/MusicKind;\n\tpublic static final field QQMusic Lnet/mamoe/mirai/message/data/MusicKind;\n\tpublic final fun getAppId ()J\n\tpublic final fun getPackageName ()Ljava/lang/String;\n\tpublic final fun getPlatform ()I\n\tpublic final fun getSdkVersion ()Ljava/lang/String;\n\tpublic final fun getSignature ()Ljava/lang/String;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MusicKind;\n\tpublic static fun values ()[Lnet/mamoe/mirai/message/data/MusicKind;\n}\n\npublic final class net/mamoe/mirai/message/data/MusicShare : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/MusicShare$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (ILnet/mamoe/mirai/message/data/MusicKind;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/message/data/MusicKind;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/message/data/MusicKind;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/message/data/MusicKind;\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun component3 ()Ljava/lang/String;\n\tpublic final fun component4 ()Ljava/lang/String;\n\tpublic final fun component5 ()Ljava/lang/String;\n\tpublic final fun component6 ()Ljava/lang/String;\n\tpublic final fun component7 ()Ljava/lang/String;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/message/data/MusicKind;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MusicShare;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/MusicShare;Lnet/mamoe/mirai/message/data/MusicKind;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/MusicShare;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getBrief ()Ljava/lang/String;\n\tpublic final fun getJumpUrl ()Ljava/lang/String;\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/MusicKind;\n\tpublic final fun getMusicUrl ()Ljava/lang/String;\n\tpublic final fun getPictureUrl ()Ljava/lang/String;\n\tpublic final fun getSummary ()Ljava/lang/String;\n\tpublic final fun getTitle ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/MusicShare;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/MusicShare$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/MusicShare$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/MusicShare;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/MusicShare;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/MusicShare$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/OfflineAudio : net/mamoe/mirai/message/data/Audio {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OfflineAudio$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/OfflineAudio$Factory {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/OfflineAudio$Factory$INSTANCE;\n\tpublic abstract fun create (Ljava/lang/String;[BJLnet/mamoe/mirai/message/data/AudioCodec;[B)Lnet/mamoe/mirai/message/data/OfflineAudio;\n\tpublic fun from (Lnet/mamoe/mirai/message/data/OnlineAudio;)Lnet/mamoe/mirai/message/data/OfflineAudio;\n}\n\npublic final class net/mamoe/mirai/message/data/OfflineAudio$Factory$INSTANCE : net/mamoe/mirai/message/data/OfflineAudio$Factory {\n\tpublic fun create (Ljava/lang/String;[BJLnet/mamoe/mirai/message/data/AudioCodec;[B)Lnet/mamoe/mirai/message/data/OfflineAudio;\n\tpublic fun from (Lnet/mamoe/mirai/message/data/OnlineAudio;)Lnet/mamoe/mirai/message/data/OfflineAudio;\n}\n\npublic final class net/mamoe/mirai/message/data/OfflineAudio$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/message/data/OfflineMessageSource : net/mamoe/mirai/message/data/MessageSource {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OfflineMessageSource$Key;\n\tpublic fun <init> ()V\n\tpublic abstract fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic final fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OfflineMessageSource$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/OfflineShortVideo : net/mamoe/mirai/message/data/ShortVideo {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OfflineShortVideo$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OfflineShortVideo$Builder {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/OfflineShortVideo$Builder$Companion;\n\tpublic final fun build ()Lnet/mamoe/mirai/message/data/OfflineShortVideo;\n\tpublic final fun getFileFormat ()Ljava/lang/String;\n\tpublic final fun getFileMd5 ()[B\n\tpublic final fun getFileName ()Ljava/lang/String;\n\tpublic final fun getFileSize ()J\n\tpublic final fun getThumbnailMd5 ()[B\n\tpublic final fun getThumbnailSize ()J\n\tpublic final fun getVideoId ()Ljava/lang/String;\n\tpublic static final fun newBuilder (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[BJ)Lnet/mamoe/mirai/message/data/OfflineShortVideo$Builder;\n\tpublic final fun setFileFormat (Ljava/lang/String;)V\n\tpublic final fun setFileMd5 ([B)V\n\tpublic final fun setFileName (Ljava/lang/String;)V\n\tpublic final fun setFileSize (J)V\n\tpublic final fun setThumbnailMd5 ([B)V\n\tpublic final fun setThumbnailSize (J)V\n\tpublic final fun setVideoId (Ljava/lang/String;)V\n}\n\npublic final class net/mamoe/mirai/message/data/OfflineShortVideo$Builder$Companion {\n\tpublic final fun newBuilder (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[BJ)Lnet/mamoe/mirai/message/data/OfflineShortVideo$Builder;\n}\n\npublic final class net/mamoe/mirai/message/data/OfflineShortVideo$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/OnlineAudio : net/mamoe/mirai/message/data/Audio {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineAudio$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic abstract fun getLength ()J\n\tpublic abstract fun getUrlForDownload ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineAudio$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource : net/mamoe/mirai/message/data/MessageSource {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Key;\n\tpublic abstract fun getBot ()Lnet/mamoe/mirai/Bot;\n\tpublic final fun getBotId ()J\n\tpublic abstract fun getSender ()Lnet/mamoe/mirai/contact/ContactOrBot;\n\tpublic abstract fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot;\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming : net/mamoe/mirai/message/data/OnlineMessageSource {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$Key;\n\tpublic fun getFromId ()J\n\tpublic abstract fun getSender ()Lnet/mamoe/mirai/contact/User;\n\tpublic fun getTargetId ()J\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromFriend : net/mamoe/mirai/message/data/OnlineMessageSource$Incoming {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromFriend$Key;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic abstract fun getSender ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic abstract fun getSubject ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final synthetic fun getTarget ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot;\n\tpublic final fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromFriend$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromGroup : net/mamoe/mirai/message/data/OnlineMessageSource$Incoming {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromGroup$Key;\n\tpublic final fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic abstract fun getSender ()Lnet/mamoe/mirai/contact/Member;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic fun getSubject ()Lnet/mamoe/mirai/contact/Group;\n\tpublic synthetic fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot;\n\tpublic final fun getTarget ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromGroup$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromStranger : net/mamoe/mirai/message/data/OnlineMessageSource$Incoming {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromStranger$Key;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic abstract fun getSender ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic abstract fun getSubject ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic final synthetic fun getTarget ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot;\n\tpublic final fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromStranger$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromTemp : net/mamoe/mirai/message/data/OnlineMessageSource$Incoming {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromTemp$Key;\n\tpublic final fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic abstract fun getSender ()Lnet/mamoe/mirai/contact/Member;\n\tpublic abstract fun getSubject ()Lnet/mamoe/mirai/contact/Member;\n\tpublic final synthetic fun getTarget ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot;\n\tpublic final fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromTemp$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Key : net/mamoe/mirai/message/data/AbstractMessageKey {\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing : net/mamoe/mirai/message/data/OnlineMessageSource {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$Key;\n\tpublic final fun getFromId ()J\n\tpublic abstract fun getSender ()Lnet/mamoe/mirai/Bot;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun getTargetId ()J\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToFriend : net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToFriend$Key;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun getSubject ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/Friend;\n\tpublic final fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToFriend$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToGroup : net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToGroup$Key;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun getSubject ()Lnet/mamoe/mirai/contact/Group;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToGroup$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToStranger : net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToStranger$Key;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun getSubject ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/Stranger;\n\tpublic final fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToStranger$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToTemp : net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToTemp$Key;\n\tpublic final fun getGroup ()Lnet/mamoe/mirai/contact/Group;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/MessageSourceKind;\n\tpublic synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact;\n\tpublic final fun getSubject ()Lnet/mamoe/mirai/contact/Member;\n\tpublic abstract fun getTarget ()Lnet/mamoe/mirai/contact/Member;\n\tpublic final fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineMessageSource$Outgoing$ToTemp$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/OnlineShortVideo : net/mamoe/mirai/message/data/ShortVideo {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/OnlineShortVideo$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic abstract fun getUrlForDownload ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OnlineShortVideo$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/OrNullDelegate {\n\tpublic static final synthetic fun box-impl (Ljava/lang/Object;)Lnet/mamoe/mirai/message/data/OrNullDelegate;\n\tpublic static fun constructor-impl (Ljava/lang/Object;)Ljava/lang/Object;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic static fun equals-impl (Ljava/lang/Object;Ljava/lang/Object;)Z\n\tpublic static final fun equals-impl0 (Ljava/lang/Object;Ljava/lang/Object;)Z\n\tpublic static final fun getValue-impl (Ljava/lang/Object;Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object;\n\tpublic fun hashCode ()I\n\tpublic static fun hashCode-impl (Ljava/lang/Object;)I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static fun toString-impl (Ljava/lang/Object;)Ljava/lang/String;\n\tpublic final synthetic fun unbox-impl ()Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/message/data/PlainText : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/PlainText$Companion;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (ILjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> (Ljava/lang/CharSequence;)V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic final fun copy (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/PlainText;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/PlainText;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/PlainText;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getContent ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/PlainText;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/PlainText$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/PlainText$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/PlainText;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/PlainText;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/PlainText$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/PokeMessage : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/HummerMessage {\n\tpublic static final field BaoBeiQiu Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field BiXin Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field ChuoYiChuo Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field DianZan Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field FangDaZhao Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field GouYin Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field JieYin Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/PokeMessage$Key;\n\tpublic static final field LiuLiuLiu Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field QiaoMen Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field RangNiPi Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field Rose Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic static final field ShouLei Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field SuiPing Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field XinSui Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field ZhaoHuanShu Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field ZhuaYiXia Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static final field values [Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic synthetic fun <init> (ILjava/lang/String;IILkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic final fun component1 ()Ljava/lang/String;\n\tpublic final fun component2 ()I\n\tpublic final fun component3 ()I\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic final fun copy (Ljava/lang/String;II)Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/PokeMessage;Ljava/lang/String;IIILjava/lang/Object;)Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getId ()I\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic final fun getName ()Ljava/lang/String;\n\tpublic final fun getPokeType ()I\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/PokeMessage;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/PokeMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/PokeMessage$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/PokeMessage;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/PokeMessage;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/PokeMessage$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/PttMessage$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/QuoteReply : net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/Message, net/mamoe/mirai/message/data/MessageMetadata {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/QuoteReply$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (ILnet/mamoe/mirai/message/data/MessageSource;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/message/data/MessageChain;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/message/data/MessageSource;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/message/data/MessageSource;\n\tpublic final fun copy (Lnet/mamoe/mirai/message/data/MessageSource;)Lnet/mamoe/mirai/message/data/QuoteReply;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/QuoteReply;Lnet/mamoe/mirai/message/data/MessageSource;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/QuoteReply;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic final fun getSource ()Lnet/mamoe/mirai/message/data/MessageSource;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/QuoteReply;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/QuoteReply$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/QuoteReply$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/QuoteReply;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/QuoteReply;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/QuoteReply$Key : net/mamoe/mirai/message/data/AbstractMessageKey {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/RawForwardMessage {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/RawForwardMessage$Companion;\n\tpublic synthetic fun <init> (ILjava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> (Ljava/util/List;)V\n\tpublic final fun component1 ()Ljava/util/List;\n\tpublic final fun copy (Ljava/util/List;)Lnet/mamoe/mirai/message/data/RawForwardMessage;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/RawForwardMessage;Ljava/util/List;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/RawForwardMessage;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getNodeList ()Ljava/util/List;\n\tpublic fun hashCode ()I\n\tpublic final fun render (Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;)Lnet/mamoe/mirai/message/data/ForwardMessage;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/RawForwardMessage;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/RawForwardMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/RawForwardMessage$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/RawForwardMessage;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/RawForwardMessage;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/RawForwardMessage$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/RichMessage : net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/RichMessage$Key;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic abstract fun getContent ()Ljava/lang/String;\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n}\n\npublic final class net/mamoe/mirai/message/data/RichMessageKind : java/lang/Enum {\n\tpublic static final field FORWARD Lnet/mamoe/mirai/message/data/RichMessageKind;\n\tpublic static final field LONG Lnet/mamoe/mirai/message/data/RichMessageKind;\n\tpublic static final field MUSIC_SHARE Lnet/mamoe/mirai/message/data/RichMessageKind;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/RichMessageKind;\n\tpublic static fun values ()[Lnet/mamoe/mirai/message/data/RichMessageKind;\n}\n\npublic final class net/mamoe/mirai/message/data/RichMessageOrigin : net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageMetadata {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/RichMessageOrigin$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (ILnet/mamoe/mirai/message/data/RichMessage;Ljava/lang/String;Lnet/mamoe/mirai/message/data/RichMessageKind;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/message/data/RichMessage;Ljava/lang/String;Lnet/mamoe/mirai/message/data/RichMessageKind;)V\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic synthetic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/RichMessageOrigin$Key;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/RichMessageKind;\n\tpublic final fun getOrigin ()Lnet/mamoe/mirai/message/data/RichMessage;\n\tpublic final fun getResourceId ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/RichMessageOrigin;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/RichMessageOrigin$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/RichMessageOrigin$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/RichMessageOrigin;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/RichMessageOrigin;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/RichMessageOrigin$Key : net/mamoe/mirai/message/data/AbstractMessageKey {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/RockPaperScissors : java/lang/Enum, net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/MarketFace {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/RockPaperScissors$Key;\n\tpublic static final field PAPER Lnet/mamoe/mirai/message/data/RockPaperScissors;\n\tpublic static final field ROCK Lnet/mamoe/mirai/message/data/RockPaperScissors;\n\tpublic static final field SCISSORS Lnet/mamoe/mirai/message/data/RockPaperScissors;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic final fun eliminates (Lnet/mamoe/mirai/message/data/RockPaperScissors;)Ljava/lang/Boolean;\n\tpublic final fun getContent ()Ljava/lang/String;\n\tpublic fun getId ()I\n\tpublic final fun getInternalId ()B\n\tpublic synthetic fun getName ()Ljava/lang/String;\n\tpublic static final fun random ()Lnet/mamoe/mirai/message/data/RockPaperScissors;\n\tpublic static final fun random (Lkotlin/random/Random;)Lnet/mamoe/mirai/message/data/RockPaperScissors;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/RockPaperScissors;\n\tpublic static fun values ()[Lnet/mamoe/mirai/message/data/RockPaperScissors;\n}\n\npublic final class net/mamoe/mirai/message/data/RockPaperScissors$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic final fun random ()Lnet/mamoe/mirai/message/data/RockPaperScissors;\n\tpublic final fun random (Lkotlin/random/Random;)Lnet/mamoe/mirai/message/data/RockPaperScissors;\n\tpublic static synthetic fun random$default (Lnet/mamoe/mirai/message/data/RockPaperScissors$Key;Lkotlin/random/Random;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/RockPaperScissors;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/ServiceMessage : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/RichMessage {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/ServiceMessage$Key;\n\tpublic abstract fun getServiceId ()I\n}\n\npublic final class net/mamoe/mirai/message/data/ServiceMessage$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/ShortVideo : net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/ShortVideo$Key;\n\tpublic abstract fun getFileFormat ()Ljava/lang/String;\n\tpublic abstract fun getFileMd5 ()[B\n\tpublic abstract fun getFileSize ()J\n\tpublic abstract fun getFilename ()Ljava/lang/String;\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic abstract fun getVideoId ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/ShortVideo$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n}\n\npublic final class net/mamoe/mirai/message/data/ShortVideoKt {\n\tpublic static final synthetic fun OfflineShortVideo (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[BJ[BJ)Lnet/mamoe/mirai/message/data/OfflineShortVideo;\n\tpublic static synthetic fun OfflineShortVideo$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[BJ[BJILjava/lang/Object;)Lnet/mamoe/mirai/message/data/OfflineShortVideo;\n}\n\npublic final class net/mamoe/mirai/message/data/ShowImageFlag : net/mamoe/mirai/message/data/AbstractMessageKey, net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageMetadata {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/ShowImageFlag;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/ShowImageFlag;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/message/data/SimpleServiceMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/SimpleServiceMessage$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/SimpleServiceMessage;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/SimpleServiceMessage;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/SimpleServiceMessage$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/SingleMessage : net/mamoe/mirai/message/data/Message {\n}\n\npublic final class net/mamoe/mirai/message/data/SingleMessage$Serializer : kotlinx/serialization/KSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/SingleMessage$Serializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/SingleMessage;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/SingleMessage;)V\n}\n\npublic final class net/mamoe/mirai/message/data/SuperFace : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/HummerMessage {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/SuperFace$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (IILjava/lang/String;ILkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic static final fun from (Lnet/mamoe/mirai/message/data/Face;)Lnet/mamoe/mirai/message/data/SuperFace;\n\tpublic static final fun fromOrNull (Lnet/mamoe/mirai/message/data/Face;)Lnet/mamoe/mirai/message/data/SuperFace;\n\tpublic final fun getFace ()I\n\tpublic final fun getId ()Ljava/lang/String;\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic final fun getName ()Ljava/lang/String;\n\tpublic final fun getType ()I\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/SuperFace;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/SuperFace$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/SuperFace$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/SuperFace;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/SuperFace;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/SuperFace$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic final fun from (Lnet/mamoe/mirai/message/data/Face;)Lnet/mamoe/mirai/message/data/SuperFace;\n\tpublic final fun fromOrNull (Lnet/mamoe/mirai/message/data/Face;)Lnet/mamoe/mirai/message/data/SuperFace;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/SuperFaceKt {\n\tpublic static final synthetic fun toFace (Lnet/mamoe/mirai/message/data/SuperFace;)Lnet/mamoe/mirai/message/data/Face;\n\tpublic static final synthetic fun toSuperFace (Lnet/mamoe/mirai/message/data/Face;)Lnet/mamoe/mirai/message/data/SuperFace;\n\tpublic static final synthetic fun toSuperFaceOrNull (Lnet/mamoe/mirai/message/data/Face;)Lnet/mamoe/mirai/message/data/SuperFace;\n}\n\npublic abstract interface class net/mamoe/mirai/message/data/UnsupportedMessage : net/mamoe/mirai/message/data/MessageContent {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/UnsupportedMessage$Companion;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic static fun create ([B)Lnet/mamoe/mirai/message/data/UnsupportedMessage;\n\tpublic abstract fun getStruct ()[B\n}\n\npublic final class net/mamoe/mirai/message/data/UnsupportedMessage$Companion {\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic final fun create ([B)Lnet/mamoe/mirai/message/data/UnsupportedMessage;\n}\n\npublic final class net/mamoe/mirai/message/data/UnsupportedMessage$Serializer : kotlinx/serialization/KSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/UnsupportedMessage$Serializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/UnsupportedMessage;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/UnsupportedMessage;)V\n}\n\npublic final class net/mamoe/mirai/message/data/VipFace : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/HummerMessage {\n\tpublic static final field AiXin Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field BianBian Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field ChaoPiao Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field DianZan Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field HaHa Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/VipFace$Key;\n\tpublic static final field LiuLian Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field LueLueLue Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field PingDiGuo Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field QinQin Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic static final field YaoWan Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field ZhaDan Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field ZhuTou Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static final field values [Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic synthetic fun <init> (ILnet/mamoe/mirai/message/data/VipFace$Kind;ILkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic final fun component1 ()Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic final fun component2 ()I\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic final fun copy (Lnet/mamoe/mirai/message/data/VipFace$Kind;I)Lnet/mamoe/mirai/message/data/VipFace;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/VipFace;Lnet/mamoe/mirai/message/data/VipFace$Kind;IILjava/lang/Object;)Lnet/mamoe/mirai/message/data/VipFace;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getCount ()I\n\tpublic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;\n\tpublic final fun getKind ()Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/VipFace;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/VipFace$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/VipFace$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/VipFace;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/VipFace;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/VipFace$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/VipFace$Kind {\n\tpublic static final field Companion Lnet/mamoe/mirai/message/data/VipFace$Kind$Companion;\n\tpublic synthetic fun <init> (IILjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> (ILjava/lang/String;)V\n\tpublic final fun component1 ()I\n\tpublic final fun component2 ()Ljava/lang/String;\n\tpublic final fun copy (ILjava/lang/String;)Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/VipFace$Kind;ILjava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getId ()I\n\tpublic final fun getName ()Ljava/lang/String;\n\tpublic fun hashCode ()I\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/VipFace$Kind;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/VipFace$Kind$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/VipFace$Kind$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/VipFace$Kind;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/VipFace$Kind;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/VipFace$Kind$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic class net/mamoe/mirai/message/data/Voice : net/mamoe/mirai/message/data/PttMessage {\n\tpublic static final field Key Lnet/mamoe/mirai/message/data/Voice$Key;\n\tpublic static final field SERIAL_NAME Ljava/lang/String;\n\tpublic synthetic fun <init> (ILjava/lang/String;[BJILjava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;[BJILjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun contentToString ()Ljava/lang/String;\n\tpublic static final fun fromAudio (Lnet/mamoe/mirai/message/data/Audio;)Lnet/mamoe/mirai/message/data/Voice;\n\tpublic fun getFileName ()Ljava/lang/String;\n\tpublic fun getFileSize ()J\n\tpublic fun getMd5 ()[B\n\tpublic fun getUrl ()Ljava/lang/String;\n\tpublic final fun get_codec ()I\n\tpublic final fun toAudio ()Lnet/mamoe/mirai/message/data/Audio;\n\tpublic fun toString ()Ljava/lang/String;\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/message/data/Voice;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/message/data/Voice$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/message/data/Voice$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/Voice;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/Voice;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/Voice$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {\n\tpublic final fun fromAudio (Lnet/mamoe/mirai/message/data/Audio;)Lnet/mamoe/mirai/message/data/Voice;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/message/data/XmlMessageBuilder$ItemBuilder {\n\tpublic fun <init> ()V\n\tpublic fun <init> (II)V\n\tpublic final fun getBg ()I\n\tpublic final fun getLayout ()I\n\tpublic final fun getText ()Ljava/lang/String;\n\tpublic final fun picture (Ljava/lang/String;)V\n\tpublic final fun setBg (I)V\n\tpublic final fun setLayout (I)V\n\tpublic final fun summary (Ljava/lang/String;Ljava/lang/String;)V\n\tpublic static synthetic fun summary$default (Lnet/mamoe/mirai/message/data/XmlMessageBuilder$ItemBuilder;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)V\n\tpublic final fun title (Ljava/lang/String;ILjava/lang/String;)V\n\tpublic static synthetic fun title$default (Lnet/mamoe/mirai/message/data/XmlMessageBuilder$ItemBuilder;Ljava/lang/String;ILjava/lang/String;ILjava/lang/Object;)V\n}\n\npublic final class net/mamoe/mirai/message/data/visitor/MessageVisitorKt {\n}\n\npublic final class net/mamoe/mirai/network/BotAuthorizationException : net/mamoe/mirai/network/LoginFailedException {\n\tpublic final fun getAuthorization ()Lnet/mamoe/mirai/auth/BotAuthorization;\n}\n\npublic abstract class net/mamoe/mirai/network/CustomLoginFailedException : net/mamoe/mirai/network/LoginFailedException {\n\tpublic fun <init> (Z)V\n\tpublic fun <init> (ZLjava/lang/String;)V\n\tpublic fun <init> (ZLjava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun <init> (ZLjava/lang/Throwable;)V\n}\n\npublic final class net/mamoe/mirai/network/ForceOfflineException : java/util/concurrent/CancellationException {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getCause ()Ljava/lang/Throwable;\n\tpublic fun getMessage ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/network/InconsistentBotIdException : net/mamoe/mirai/network/LoginFailedException {\n\tpublic synthetic fun <init> (JJLjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun getActual ()J\n\tpublic final fun getExpected ()J\n}\n\npublic abstract class net/mamoe/mirai/network/LoginFailedException : java/lang/RuntimeException {\n\tpublic synthetic fun <init> (ZLjava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic synthetic fun <init> (ZLjava/lang/String;Ljava/lang/Throwable;Lkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun getKillBot ()Z\n}\n\npublic final class net/mamoe/mirai/network/NoServerAvailableException : net/mamoe/mirai/network/LoginFailedException {\n\tpublic fun getCause ()Ljava/lang/Throwable;\n}\n\npublic final class net/mamoe/mirai/network/NoStandardInputForCaptchaException : net/mamoe/mirai/network/LoginFailedException {\n\tpublic synthetic fun <init> (Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun getCause ()Ljava/lang/Throwable;\n}\n\npublic final class net/mamoe/mirai/network/RetryLaterException : net/mamoe/mirai/network/LoginFailedException {\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V\n}\n\npublic class net/mamoe/mirai/network/UnsupportedCaptchaMethodException : net/mamoe/mirai/network/LoginFailedException {\n\tpublic fun <init> (Z)V\n\tpublic fun <init> (ZLjava/lang/String;)V\n\tpublic fun <init> (ZLjava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun <init> (ZLjava/lang/Throwable;)V\n}\n\npublic final class net/mamoe/mirai/network/UnsupportedQRCodeCaptchaException : net/mamoe/mirai/network/UnsupportedCaptchaMethodException {\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic final class net/mamoe/mirai/network/UnsupportedSliderCaptchaException : net/mamoe/mirai/network/UnsupportedCaptchaMethodException {\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic final class net/mamoe/mirai/network/UnsupportedSmsLoginException : net/mamoe/mirai/network/UnsupportedCaptchaMethodException {\n\tpublic fun <init> (Ljava/lang/String;)V\n}\n\npublic final class net/mamoe/mirai/network/WrongPasswordException : net/mamoe/mirai/network/LoginFailedException {\n}\n\npublic abstract interface class net/mamoe/mirai/spi/AudioToSilkService : net/mamoe/mirai/spi/BaseService {\n\tpublic static final field Companion Lnet/mamoe/mirai/spi/AudioToSilkService$Companion;\n\tpublic abstract fun convert (Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun getInstance ()Lnet/mamoe/mirai/spi/AudioToSilkService;\n}\n\npublic final class net/mamoe/mirai/spi/AudioToSilkService$Companion {\n\tpublic final fun getInstance ()Lnet/mamoe/mirai/spi/AudioToSilkService;\n}\n\npublic abstract interface class net/mamoe/mirai/spi/BaseService {\n\tpublic fun getPriority ()I\n}\n\npublic abstract class net/mamoe/mirai/utils/AbstractBotConfiguration {\n\tpublic fun <init> ()V\n\tpublic final fun fileBasedDeviceInfo ()V\n\tpublic final fun fileBasedDeviceInfo (Ljava/lang/String;)V\n\tpublic static synthetic fun fileBasedDeviceInfo$default (Lnet/mamoe/mirai/utils/AbstractBotConfiguration;Ljava/lang/String;ILjava/lang/Object;)V\n\tprotected abstract fun getBotLoggerSupplier ()Lkotlin/jvm/functions/Function1;\n\tpublic final fun getCacheDir ()Ljava/io/File;\n\tprotected abstract fun getDeviceInfo ()Lkotlin/jvm/functions/Function1;\n\tprotected abstract fun getNetworkLoggerSupplier ()Lkotlin/jvm/functions/Function1;\n\tpublic final fun getWorkingDir ()Ljava/io/File;\n\tpublic final fun redirectBotLogToDirectory ()V\n\tpublic final fun redirectBotLogToDirectory (Ljava/io/File;)V\n\tpublic final fun redirectBotLogToDirectory (Ljava/io/File;J)V\n\tpublic final fun redirectBotLogToDirectory (Ljava/io/File;JLkotlin/jvm/functions/Function1;)V\n\tpublic static synthetic fun redirectBotLogToDirectory$default (Lnet/mamoe/mirai/utils/AbstractBotConfiguration;Ljava/io/File;JLkotlin/jvm/functions/Function1;ILjava/lang/Object;)V\n\tpublic final fun redirectBotLogToFile ()V\n\tpublic final fun redirectBotLogToFile (Ljava/io/File;)V\n\tpublic final fun redirectBotLogToFile (Ljava/io/File;Lkotlin/jvm/functions/Function1;)V\n\tpublic static synthetic fun redirectBotLogToFile$default (Lnet/mamoe/mirai/utils/AbstractBotConfiguration;Ljava/io/File;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V\n\tpublic final fun redirectNetworkLogToDirectory ()V\n\tpublic final fun redirectNetworkLogToDirectory (Ljava/io/File;)V\n\tpublic final fun redirectNetworkLogToDirectory (Ljava/io/File;J)V\n\tpublic final fun redirectNetworkLogToDirectory (Ljava/io/File;JLkotlin/jvm/functions/Function1;)V\n\tpublic static synthetic fun redirectNetworkLogToDirectory$default (Lnet/mamoe/mirai/utils/AbstractBotConfiguration;Ljava/io/File;JLkotlin/jvm/functions/Function1;ILjava/lang/Object;)V\n\tpublic final fun redirectNetworkLogToFile ()V\n\tpublic final fun redirectNetworkLogToFile (Ljava/io/File;)V\n\tpublic final fun redirectNetworkLogToFile (Ljava/io/File;Lkotlin/jvm/functions/Function1;)V\n\tpublic static synthetic fun redirectNetworkLogToFile$default (Lnet/mamoe/mirai/utils/AbstractBotConfiguration;Ljava/io/File;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V\n\tprotected abstract fun setBotLoggerSupplier (Lkotlin/jvm/functions/Function1;)V\n\tpublic final fun setCacheDir (Ljava/io/File;)V\n\tprotected abstract fun setDeviceInfo (Lkotlin/jvm/functions/Function1;)V\n\tprotected abstract fun setNetworkLoggerSupplier (Lkotlin/jvm/functions/Function1;)V\n\tpublic final fun setWorkingDir (Ljava/io/File;)V\n}\n\npublic abstract class net/mamoe/mirai/utils/AbstractExternalResource : net/mamoe/mirai/utils/ExternalResource {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Lnet/mamoe/mirai/utils/AbstractExternalResource$ResourceCleanCallback;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Lnet/mamoe/mirai/utils/AbstractExternalResource$ResourceCleanCallback;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun <init> (Lnet/mamoe/mirai/utils/AbstractExternalResource$ResourceCleanCallback;)V\n\tpublic synthetic fun <init> (Lnet/mamoe/mirai/utils/AbstractExternalResource$ResourceCleanCallback;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun close ()V\n\tprotected final fun dontRegisterLeakObserver ()V\n\tpublic final fun getClosed ()Lkotlinx/coroutines/Deferred;\n\tpublic fun getFormatName ()Ljava/lang/String;\n\tpublic fun getMd5 ()[B\n\tpublic fun getSha1 ()[B\n\tpublic final fun inputStream ()Ljava/io/InputStream;\n\tprotected abstract fun inputStream0 ()Ljava/io/InputStream;\n\tprotected final fun registerToLeakObserver ()V\n\tprotected final fun setResourceCleanCallback (Lnet/mamoe/mirai/utils/AbstractExternalResource$ResourceCleanCallback;)V\n}\n\npublic abstract interface class net/mamoe/mirai/utils/AbstractExternalResource$ResourceCleanCallback {\n\tpublic abstract fun cleanup ()V\n}\n\npublic class net/mamoe/mirai/utils/BotConfiguration : net/mamoe/mirai/utils/AbstractBotConfiguration {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/BotConfiguration$Companion;\n\tpublic fun <init> ()V\n\tpublic final fun autoReconnectOnForceOffline ()V\n\tpublic final synthetic fun contactListCache (Lkotlin/jvm/functions/Function1;)V\n\tpublic final fun copy ()Lnet/mamoe/mirai/utils/BotConfiguration;\n\tpublic final fun disableAccountSecretes ()V\n\tpublic final fun disableContactCache ()V\n\tpublic final fun enableContactCache ()V\n\tpublic final fun getAutoReconnectOnForceOffline ()Z\n\tpublic final fun getBotLoggerSupplier ()Lkotlin/jvm/functions/Function1;\n\tpublic final fun getContactListCache ()Lnet/mamoe/mirai/utils/BotConfiguration$ContactListCache;\n\tpublic static final fun getDefault ()Lnet/mamoe/mirai/utils/BotConfiguration;\n\tpublic final fun getDeviceInfo ()Lkotlin/jvm/functions/Function1;\n\tpublic final synthetic fun getFirstReconnectDelayMillis ()J\n\tpublic final fun getHeartbeatPeriodMillis ()J\n\tpublic final fun getHeartbeatStrategy ()Lnet/mamoe/mirai/utils/BotConfiguration$HeartbeatStrategy;\n\tpublic final fun getHeartbeatTimeoutMillis ()J\n\tpublic final fun getHighwayUploadCoroutineCount ()I\n\tpublic final fun getLoginCacheEnabled ()Z\n\tpublic final fun getLoginSolver ()Lnet/mamoe/mirai/utils/LoginSolver;\n\tpublic final fun getNetworkLoggerSupplier ()Lkotlin/jvm/functions/Function1;\n\tpublic final fun getParentCoroutineContext ()Lkotlin/coroutines/CoroutineContext;\n\tpublic final fun getProtocol ()Lnet/mamoe/mirai/utils/BotConfiguration$MiraiProtocol;\n\tpublic final synthetic fun getReconnectPeriodMillis ()J\n\tpublic final fun getReconnectionRetryTimes ()I\n\tpublic final fun getStatHeartbeatPeriodMillis ()J\n\tpublic final synthetic fun inheritCoroutineContext (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun isConvertLineSeparator ()Z\n\tpublic final fun isShowingVerboseEventLog ()Z\n\tpublic final fun loadDeviceInfoJson (Ljava/lang/String;)V\n\tpublic final fun noBotLog ()V\n\tpublic final fun noNetworkLog ()V\n\tpublic final fun randomDeviceInfo ()V\n\tpublic final fun setAutoReconnectOnForceOffline (Z)V\n\tpublic final fun setBotLoggerSupplier (Lkotlin/jvm/functions/Function1;)V\n\tpublic final fun setContactListCache (Lnet/mamoe/mirai/utils/BotConfiguration$ContactListCache;)V\n\tpublic final fun setConvertLineSeparator (Z)V\n\tpublic final fun setDeviceInfo (Lkotlin/jvm/functions/Function1;)V\n\tpublic final synthetic fun setFirstReconnectDelayMillis (J)V\n\tpublic final fun setHeartbeatPeriodMillis (J)V\n\tpublic final fun setHeartbeatStrategy (Lnet/mamoe/mirai/utils/BotConfiguration$HeartbeatStrategy;)V\n\tpublic final fun setHeartbeatTimeoutMillis (J)V\n\tpublic final fun setHighwayUploadCoroutineCount (I)V\n\tpublic final fun setLoginCacheEnabled (Z)V\n\tpublic final fun setLoginSolver (Lnet/mamoe/mirai/utils/LoginSolver;)V\n\tpublic final fun setNetworkLoggerSupplier (Lkotlin/jvm/functions/Function1;)V\n\tpublic final fun setParentCoroutineContext (Lkotlin/coroutines/CoroutineContext;)V\n\tpublic final fun setProtocol (Lnet/mamoe/mirai/utils/BotConfiguration$MiraiProtocol;)V\n\tpublic final synthetic fun setReconnectPeriodMillis (J)V\n\tpublic final fun setReconnectionRetryTimes (I)V\n\tpublic final fun setShowingVerboseEventLog (Z)V\n\tpublic final fun setStatHeartbeatPeriodMillis (J)V\n}\n\npublic final class net/mamoe/mirai/utils/BotConfiguration$Companion {\n\tpublic final fun getDefault ()Lnet/mamoe/mirai/utils/BotConfiguration;\n}\n\npublic abstract interface annotation class net/mamoe/mirai/utils/BotConfiguration$ConfigurationDsl : java/lang/annotation/Annotation {\n}\n\npublic final class net/mamoe/mirai/utils/BotConfiguration$ContactListCache {\n\tpublic fun <init> ()V\n\tpublic final fun getFriendListCacheEnabled ()Z\n\tpublic final fun getGroupMemberListCacheEnabled ()Z\n\tpublic final synthetic fun getSaveInterval-UwyO8pc ()J\n\tpublic final fun getSaveIntervalMillis ()J\n\tpublic final fun setFriendListCacheEnabled (Z)V\n\tpublic final fun setGroupMemberListCacheEnabled (Z)V\n\tpublic final synthetic fun setSaveInterval-LRDsOJo (J)V\n\tpublic final fun setSaveIntervalMillis (J)V\n}\n\npublic final class net/mamoe/mirai/utils/BotConfiguration$HeartbeatStrategy : java/lang/Enum {\n\tpublic static final field NONE Lnet/mamoe/mirai/utils/BotConfiguration$HeartbeatStrategy;\n\tpublic static final field REGISTER Lnet/mamoe/mirai/utils/BotConfiguration$HeartbeatStrategy;\n\tpublic static final field STAT_HB Lnet/mamoe/mirai/utils/BotConfiguration$HeartbeatStrategy;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/utils/BotConfiguration$HeartbeatStrategy;\n\tpublic static fun values ()[Lnet/mamoe/mirai/utils/BotConfiguration$HeartbeatStrategy;\n}\n\npublic final class net/mamoe/mirai/utils/BotConfiguration$MiraiProtocol : java/lang/Enum {\n\tpublic static final field ANDROID_PAD Lnet/mamoe/mirai/utils/BotConfiguration$MiraiProtocol;\n\tpublic static final field ANDROID_PHONE Lnet/mamoe/mirai/utils/BotConfiguration$MiraiProtocol;\n\tpublic static final field ANDROID_WATCH Lnet/mamoe/mirai/utils/BotConfiguration$MiraiProtocol;\n\tpublic static final field IPAD Lnet/mamoe/mirai/utils/BotConfiguration$MiraiProtocol;\n\tpublic static final field MACOS Lnet/mamoe/mirai/utils/BotConfiguration$MiraiProtocol;\n\tpublic final fun isNudgeSupported ()Z\n\tpublic final fun isQRLoginSupported ()Z\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/utils/BotConfiguration$MiraiProtocol;\n\tpublic static fun values ()[Lnet/mamoe/mirai/utils/BotConfiguration$MiraiProtocol;\n}\n\npublic final class net/mamoe/mirai/utils/DeviceInfo {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/DeviceInfo$Companion;\n\tpublic fun <init> ([B[B[B[B[B[B[B[B[B[B[BLnet/mamoe/mirai/utils/DeviceInfo$Version;[B[B[B[B[B[BLjava/lang/String;[B)V\n\tpublic fun <init> ([B[B[B[B[B[B[B[B[B[B[BLnet/mamoe/mirai/utils/DeviceInfo$Version;[B[B[B[B[B[BLjava/lang/String;[B[B)V\n\tpublic static final fun deserializeFromString (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic static final fun from (Ljava/io/File;)Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic static final fun from (Ljava/io/File;Lkotlinx/serialization/json/Json;)Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic final fun getAndroidId ()[B\n\tpublic final fun getApn ()[B\n\tpublic final fun getBaseBand ()[B\n\tpublic final fun getBoard ()[B\n\tpublic final fun getBootId ()[B\n\tpublic final fun getBootloader ()[B\n\tpublic final fun getBrand ()[B\n\tpublic final fun getDevice ()[B\n\tpublic final fun getDisplay ()[B\n\tpublic final fun getFingerprint ()[B\n\tpublic final fun getGuid ()[B\n\tpublic final fun getImei ()Ljava/lang/String;\n\tpublic final fun getImsiMd5 ()[B\n\tpublic final fun getIpAddress ()[B\n\tpublic final fun getMacAddress ()[B\n\tpublic final fun getModel ()[B\n\tpublic final fun getOsType ()[B\n\tpublic final fun getProcVersion ()[B\n\tpublic final fun getProduct ()[B\n\tpublic final fun getSimInfo ()[B\n\tpublic final fun getVersion ()Lnet/mamoe/mirai/utils/DeviceInfo$Version;\n\tpublic final fun getWifiBSSID ()[B\n\tpublic final fun getWifiSSID ()[B\n\tpublic fun hashCode ()I\n\tpublic static final fun random ()Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic static final fun random (Lkotlin/random/Random;)Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic static final fun serializeToString (Lnet/mamoe/mirai/utils/DeviceInfo;)Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/utils/DeviceInfo$$serializer : kotlinx/serialization/KSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/utils/DeviceInfo$$serializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/utils/DeviceInfo;)V\n}\n\npublic final class net/mamoe/mirai/utils/DeviceInfo$Companion {\n\tpublic final fun deserializeFromString (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic final fun from (Ljava/io/File;)Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic final fun from (Ljava/io/File;Lkotlinx/serialization/json/Json;)Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic static synthetic fun from$default (Lnet/mamoe/mirai/utils/DeviceInfo$Companion;Ljava/io/File;Lkotlinx/serialization/json/Json;ILjava/lang/Object;)Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic final fun random ()Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic final fun random (Lkotlin/random/Random;)Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic final fun serializeToString (Lnet/mamoe/mirai/utils/DeviceInfo;)Ljava/lang/String;\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/utils/DeviceInfo$Version {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/DeviceInfo$Version$Companion;\n\tpublic fun <init> ()V\n\tpublic synthetic fun <init> (I[B[B[BILkotlinx/serialization/internal/SerializationConstructorMarker;)V\n\tpublic fun <init> ([B[B[BI)V\n\tpublic synthetic fun <init> ([B[B[BIILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun equals (Ljava/lang/Object;)Z\n\tpublic final fun getCodename ()[B\n\tpublic final fun getIncremental ()[B\n\tpublic final fun getRelease ()[B\n\tpublic final fun getSdk ()I\n\tpublic fun hashCode ()I\n\tpublic static final fun write$Self (Lnet/mamoe/mirai/utils/DeviceInfo$Version;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V\n}\n\npublic final class net/mamoe/mirai/utils/DeviceInfo$Version$$serializer : kotlinx/serialization/internal/GeneratedSerializer {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/utils/DeviceInfo$Version$$serializer;\n\tpublic fun childSerializers ()[Lkotlinx/serialization/KSerializer;\n\tpublic synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;\n\tpublic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/utils/DeviceInfo$Version;\n\tpublic fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;\n\tpublic synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V\n\tpublic fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/utils/DeviceInfo$Version;)V\n\tpublic fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/utils/DeviceInfo$Version$Companion {\n\tpublic final fun serializer ()Lkotlinx/serialization/KSerializer;\n}\n\npublic final class net/mamoe/mirai/utils/DeviceInfoBuilder {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/DeviceInfoBuilder$Companion;\n\tpublic fun <init> ()V\n\tpublic final fun androidId (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun androidId ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun apn (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun apn ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun baseBand (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun baseBand ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun board (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun board ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun bootId (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun bootId ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun bootloader (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun bootloader ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun brand (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun brand ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun build ()Lnet/mamoe/mirai/utils/DeviceInfo;\n\tpublic final fun device (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun device ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun display (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun display ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun fingerprint (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun fingerprint ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic static final fun fromPrototype (Lnet/mamoe/mirai/utils/DeviceInfo;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic static final fun fromRandom ()Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic static final fun fromRandom (Lkotlin/random/Random;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun imei (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun imsiMd5 (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun imsiMd5 ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun macAddress (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun macAddress ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun model (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun model ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun osType (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun osType ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun procVersion (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun procVersion ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun product (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun product ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun simInfo (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun simInfo ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun version (Lnet/mamoe/mirai/utils/DeviceInfo$Version;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun wifiBSSID (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun wifiBSSID ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun wifiSSID (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun wifiSSID ([B)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n}\n\npublic final class net/mamoe/mirai/utils/DeviceInfoBuilder$Companion {\n\tpublic final fun fromPrototype (Lnet/mamoe/mirai/utils/DeviceInfo;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun fromRandom ()Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic final fun fromRandom (Lkotlin/random/Random;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n\tpublic static synthetic fun fromRandom$default (Lnet/mamoe/mirai/utils/DeviceInfoBuilder$Companion;Lkotlin/random/Random;ILjava/lang/Object;)Lnet/mamoe/mirai/utils/DeviceInfoBuilder;\n}\n\npublic final class net/mamoe/mirai/utils/DeviceInfoKt {\n\tpublic static final fun generateDeviceInfoData (Lnet/mamoe/mirai/utils/DeviceInfo;)[B\n\tpublic static final synthetic fun serializeToString (Lnet/mamoe/mirai/utils/DeviceInfo;)Ljava/lang/String;\n}\n\npublic abstract interface class net/mamoe/mirai/utils/DeviceVerificationRequests {\n\tpublic abstract fun getFallback ()Lnet/mamoe/mirai/utils/DeviceVerificationRequests$FallbackRequest;\n\tpublic abstract fun getPreferSms ()Z\n\tpublic abstract fun getSms ()Lnet/mamoe/mirai/utils/DeviceVerificationRequests$SmsRequest;\n}\n\npublic abstract interface class net/mamoe/mirai/utils/DeviceVerificationRequests$FallbackRequest {\n\tpublic abstract fun getUrl ()Ljava/lang/String;\n\tpublic abstract fun solved ()Lnet/mamoe/mirai/utils/DeviceVerificationResult;\n}\n\npublic abstract interface class net/mamoe/mirai/utils/DeviceVerificationRequests$SmsRequest {\n\tpublic abstract fun getCountryCode ()Ljava/lang/String;\n\tpublic abstract fun getPhoneNumber ()Ljava/lang/String;\n\tpublic abstract fun requestSms (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun solved (Ljava/lang/String;)Lnet/mamoe/mirai/utils/DeviceVerificationResult;\n}\n\npublic abstract interface class net/mamoe/mirai/utils/DeviceVerificationResult {\n}\n\npublic final class net/mamoe/mirai/utils/DirectoryLogger : net/mamoe/mirai/utils/SimpleLogger {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/io/File;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/io/File;J)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/io/File;JILkotlin/jvm/internal/DefaultConstructorMarker;)V\n}\n\npublic abstract interface class net/mamoe/mirai/utils/ExternalResource : java/io/Closeable {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/ExternalResource$Companion;\n\tpublic static final field DEFAULT_FORMAT_NAME Ljava/lang/String;\n\tpublic static fun create (Ljava/io/File;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static fun create (Ljava/io/File;Ljava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static fun create (Ljava/io/InputStream;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static fun create (Ljava/io/InputStream;Ljava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static fun create (Ljava/io/RandomAccessFile;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static fun create (Ljava/io/RandomAccessFile;Ljava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static fun create (Ljava/io/RandomAccessFile;Ljava/lang/String;Z)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static fun create ([B)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static fun create ([BLjava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static synthetic fun createAutoCloseable (Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic abstract fun getClosed ()Lkotlinx/coroutines/Deferred;\n\tpublic abstract fun getFormatName ()Ljava/lang/String;\n\tpublic abstract fun getMd5 ()[B\n\tpublic fun getOrigin ()Ljava/lang/Object;\n\tpublic fun getSha1 ()[B\n\tpublic abstract fun getSize ()J\n\tpublic abstract fun inputStream ()Ljava/io/InputStream;\n\tpublic fun isAutoClose ()Z\n\tpublic static fun sendAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendAsImage (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendAsImage (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun sendTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static fun sendTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun toAutoCloseable ()Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static synthetic fun uploadAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static synthetic fun uploadAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static synthetic fun uploadAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static fun uploadAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static fun uploadAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static fun uploadAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static fun uploadAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadAsImage (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static fun uploadAsImage (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadAsVoice (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/Voice;\n\tpublic static synthetic fun uploadAsVoice (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static synthetic fun uploadTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static synthetic fun uploadTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/utils/ExternalResource$Companion {\n\tpublic static final field DEFAULT_FORMAT_NAME Ljava/lang/String;\n\tpublic final fun create (Ljava/io/File;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun create (Ljava/io/File;Ljava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun create (Ljava/io/InputStream;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun create (Ljava/io/InputStream;Ljava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun create (Ljava/io/RandomAccessFile;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun create (Ljava/io/RandomAccessFile;Ljava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun create (Ljava/io/RandomAccessFile;Ljava/lang/String;Z)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun create ([B)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun create ([BLjava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static synthetic fun create$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/File;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static synthetic fun create$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/InputStream;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static synthetic fun create$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/RandomAccessFile;Ljava/lang/String;ZILjava/lang/Object;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static synthetic fun create$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;[BLjava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final synthetic fun createAutoCloseable (Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic final fun sendAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun sendAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendAsFile$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendAsFile$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun sendAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun sendAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun sendAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun sendAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun sendAsImage (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendAsImage (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendAsImage$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendAsImage$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun sendAsImage$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendAsImage$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun sendTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun sendTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final fun sendTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendTo$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendTo$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final synthetic fun uploadAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic final synthetic fun uploadAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final synthetic fun uploadAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic final synthetic fun uploadAsFile (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadAsFile$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static synthetic fun uploadAsFile$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun uploadAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun uploadAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun uploadAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadAsImage (Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun uploadAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun uploadAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadAsImage (Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadAsImage (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic final fun uploadAsImage (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadAsImage$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static synthetic fun uploadAsImage$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/File;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadAsImage$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/Image;\n\tpublic static synthetic fun uploadAsImage$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/InputStream;Lnet/mamoe/mirai/contact/Contact;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final synthetic fun uploadAsVoice (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;)Lnet/mamoe/mirai/message/data/Voice;\n\tpublic final synthetic fun uploadAsVoice (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/contact/Contact;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final synthetic fun uploadTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic final synthetic fun uploadTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final synthetic fun uploadTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic final synthetic fun uploadTo (Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadTo$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static synthetic fun uploadTo$default (Lnet/mamoe/mirai/utils/ExternalResource$Companion;Ljava/io/File;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/utils/ExternalResourceKt {\n\tpublic static final fun runAutoClose (Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n\tpublic static final fun useAutoClose (Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/utils/FileCacheStrategy {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/FileCacheStrategy$Companion;\n\tpublic static fun getPlatformDefault ()Lnet/mamoe/mirai/utils/FileCacheStrategy;\n\tpublic fun newCache (Ljava/io/InputStream;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic abstract fun newCache (Ljava/io/InputStream;Ljava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n\tpublic static synthetic fun newCache$default (Lnet/mamoe/mirai/utils/FileCacheStrategy;Ljava/io/InputStream;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/utils/ExternalResource;\n}\n\npublic final class net/mamoe/mirai/utils/FileCacheStrategy$Companion {\n\tpublic final fun getPlatformDefault ()Lnet/mamoe/mirai/utils/FileCacheStrategy;\n}\n\npublic final class net/mamoe/mirai/utils/FileCacheStrategy$MemoryCache : net/mamoe/mirai/utils/FileCacheStrategy {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/utils/FileCacheStrategy$MemoryCache;\n\tpublic fun newCache (Ljava/io/InputStream;Ljava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n}\n\npublic final class net/mamoe/mirai/utils/FileCacheStrategy$TempCache : net/mamoe/mirai/utils/FileCacheStrategy {\n\tpublic fun <init> ()V\n\tpublic fun <init> (Ljava/io/File;)V\n\tpublic synthetic fun <init> (Ljava/io/File;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic final fun getDirectory ()Ljava/io/File;\n\tpublic fun newCache (Ljava/io/InputStream;Ljava/lang/String;)Lnet/mamoe/mirai/utils/ExternalResource;\n}\n\npublic abstract interface annotation class net/mamoe/mirai/utils/JavaFriendlyAPI : java/lang/annotation/Annotation {\n}\n\npublic final class net/mamoe/mirai/utils/LoggerAdapters {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/utils/LoggerAdapters;\n\tpublic static final fun asMiraiLogger (Ljava/util/logging/Logger;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic static final fun asMiraiLogger (Lorg/apache/logging/log4j/Logger;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic static final fun asMiraiLogger (Lorg/apache/logging/log4j/Logger;Lorg/apache/logging/log4j/Marker;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic static final fun asMiraiLogger (Lorg/slf4j/Logger;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic static final fun useLog4j2 ()V\n}\n\npublic abstract class net/mamoe/mirai/utils/LoginSolver {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/LoginSolver$Companion;\n\tpublic static final field Default Lnet/mamoe/mirai/utils/LoginSolver;\n\tpublic fun <init> ()V\n\tpublic fun createQRCodeLoginListener (Lnet/mamoe/mirai/Bot;)Lnet/mamoe/mirai/auth/QRCodeLoginListener;\n\tpublic fun isSliderCaptchaSupported ()Z\n\tpublic fun onSolveDeviceVerification (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/utils/DeviceVerificationRequests;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun onSolvePicCaptcha (Lnet/mamoe/mirai/Bot;[BLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun onSolveSliderCaptcha (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun onSolveUnsafeDeviceLoginVerify (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/utils/LoginSolver$Companion {\n\tpublic final synthetic fun getDefault ()Lnet/mamoe/mirai/utils/LoginSolver;\n}\n\npublic abstract interface annotation class net/mamoe/mirai/utils/MiraiExperimentalApi : java/lang/annotation/Annotation {\n\tpublic abstract fun message ()Ljava/lang/String;\n}\n\npublic abstract interface annotation class net/mamoe/mirai/utils/MiraiInternalApi : java/lang/annotation/Annotation {\n\tpublic abstract fun message ()Ljava/lang/String;\n}\n\npublic abstract interface annotation class net/mamoe/mirai/utils/MiraiInternalFile : java/lang/annotation/Annotation {\n}\n\npublic abstract interface class net/mamoe/mirai/utils/MiraiLogger {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/MiraiLogger$Companion;\n\tpublic fun call (Lnet/mamoe/mirai/utils/SimpleLogger$LogPriority;Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic static synthetic fun call$default (Lnet/mamoe/mirai/utils/MiraiLogger;Lnet/mamoe/mirai/utils/SimpleLogger$LogPriority;Ljava/lang/String;Ljava/lang/Throwable;ILjava/lang/Object;)V\n\tpublic static synthetic fun create (Ljava/lang/String;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic abstract fun debug (Ljava/lang/String;)V\n\tpublic abstract fun debug (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun debug (Ljava/lang/Throwable;)V\n\tpublic abstract fun error (Ljava/lang/String;)V\n\tpublic abstract fun error (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun error (Ljava/lang/Throwable;)V\n\tpublic synthetic fun getFollower ()Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic abstract fun getIdentity ()Ljava/lang/String;\n\tpublic abstract fun info (Ljava/lang/String;)V\n\tpublic abstract fun info (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun info (Ljava/lang/Throwable;)V\n\tpublic fun isDebugEnabled ()Z\n\tpublic abstract fun isEnabled ()Z\n\tpublic fun isErrorEnabled ()Z\n\tpublic fun isInfoEnabled ()Z\n\tpublic fun isVerboseEnabled ()Z\n\tpublic fun isWarningEnabled ()Z\n\tpublic synthetic fun plus (Lnet/mamoe/mirai/utils/MiraiLogger;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic static synthetic fun setDefaultLoggerCreator (Lkotlin/jvm/functions/Function1;)V\n\tpublic synthetic fun setFollower (Lnet/mamoe/mirai/utils/MiraiLogger;)V\n\tpublic abstract fun verbose (Ljava/lang/String;)V\n\tpublic abstract fun verbose (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun verbose (Ljava/lang/Throwable;)V\n\tpublic abstract fun warning (Ljava/lang/String;)V\n\tpublic abstract fun warning (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun warning (Ljava/lang/Throwable;)V\n}\n\npublic final class net/mamoe/mirai/utils/MiraiLogger$Companion {\n\tpublic final synthetic fun create (Ljava/lang/String;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic final synthetic fun getTopLevel ()Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic final synthetic fun setDefaultLoggerCreator (Lkotlin/jvm/functions/Function1;)V\n}\n\npublic abstract interface class net/mamoe/mirai/utils/MiraiLogger$Factory {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/utils/MiraiLogger$Factory$INSTANCE;\n\tpublic fun create (Ljava/lang/Class;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic abstract fun create (Ljava/lang/Class;Ljava/lang/String;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic fun create (Lkotlin/reflect/KClass;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic fun create (Lkotlin/reflect/KClass;Ljava/lang/String;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic static synthetic fun create$default (Lnet/mamoe/mirai/utils/MiraiLogger$Factory;Ljava/lang/Class;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic static synthetic fun create$default (Lnet/mamoe/mirai/utils/MiraiLogger$Factory;Lkotlin/reflect/KClass;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/utils/MiraiLogger;\n}\n\npublic final class net/mamoe/mirai/utils/MiraiLogger$Factory$INSTANCE : net/mamoe/mirai/utils/MiraiLogger$Factory {\n\tpublic fun create (Ljava/lang/Class;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic fun create (Ljava/lang/Class;Ljava/lang/String;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic fun create (Lkotlin/reflect/KClass;)Lnet/mamoe/mirai/utils/MiraiLogger;\n\tpublic fun create (Lkotlin/reflect/KClass;Ljava/lang/String;)Lnet/mamoe/mirai/utils/MiraiLogger;\n}\n\npublic abstract class net/mamoe/mirai/utils/MiraiLoggerPlatformBase : net/mamoe/mirai/utils/MiraiLogger {\n\tpublic fun <init> ()V\n\tpublic final fun debug (Ljava/lang/String;)V\n\tpublic final fun debug (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tprotected fun debug0 (Ljava/lang/String;)V\n\tprotected abstract fun debug0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic final fun error (Ljava/lang/String;)V\n\tpublic final fun error (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tprotected fun error0 (Ljava/lang/String;)V\n\tprotected abstract fun error0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic final fun info (Ljava/lang/String;)V\n\tpublic final fun info (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tprotected fun info0 (Ljava/lang/String;)V\n\tprotected abstract fun info0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun isEnabled ()Z\n\tpublic final fun verbose (Ljava/lang/String;)V\n\tpublic final fun verbose (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tprotected fun verbose0 (Ljava/lang/String;)V\n\tprotected abstract fun verbose0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic final fun warning (Ljava/lang/String;)V\n\tpublic final fun warning (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tprotected fun warning0 (Ljava/lang/String;)V\n\tprotected abstract fun warning0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n}\n\npublic final class net/mamoe/mirai/utils/MiraiLoggerWithSwitch : net/mamoe/mirai/utils/MiraiLoggerPlatformBase {\n\tpublic fun debug0 (Ljava/lang/String;)V\n\tpublic fun debug0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic final fun disable ()V\n\tpublic final fun enable ()V\n\tpublic fun error0 (Ljava/lang/String;)V\n\tpublic fun error0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun getIdentity ()Ljava/lang/String;\n\tpublic fun info0 (Ljava/lang/String;)V\n\tpublic fun info0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun isEnabled ()Z\n\tpublic fun verbose0 (Ljava/lang/String;)V\n\tpublic fun verbose0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun warning0 (Ljava/lang/String;)V\n\tpublic fun warning0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n}\n\npublic abstract interface annotation class net/mamoe/mirai/utils/NotStableForInheritance : java/lang/annotation/Annotation {\n\tpublic abstract fun message ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/utils/OverFileSizeMaxException : java/lang/IllegalStateException {\n\tpublic fun <init> ()V\n}\n\npublic abstract interface class net/mamoe/mirai/utils/ProgressionCallback {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/ProgressionCallback$Companion;\n\tpublic static fun asProgressionCallback (Lkotlinx/coroutines/channels/SendChannel;Z)Lnet/mamoe/mirai/utils/ProgressionCallback;\n\tpublic fun onBegin (Ljava/lang/Object;Lnet/mamoe/mirai/utils/ExternalResource;)V\n\tpublic fun onFailure (Ljava/lang/Object;Lnet/mamoe/mirai/utils/ExternalResource;Ljava/lang/Throwable;)V\n\tpublic fun onFinished (Ljava/lang/Object;Lnet/mamoe/mirai/utils/ExternalResource;Ljava/lang/Object;)V\n\tpublic fun onProgression (Ljava/lang/Object;Lnet/mamoe/mirai/utils/ExternalResource;Ljava/lang/Object;)V\n\tpublic fun onSuccess (Ljava/lang/Object;Lnet/mamoe/mirai/utils/ExternalResource;Ljava/lang/Object;)V\n}\n\npublic final class net/mamoe/mirai/utils/ProgressionCallback$Companion {\n\tpublic final fun asProgressionCallback (Lkotlinx/coroutines/channels/SendChannel;Z)Lnet/mamoe/mirai/utils/ProgressionCallback;\n\tpublic static synthetic fun asProgressionCallback$default (Lnet/mamoe/mirai/utils/ProgressionCallback$Companion;Lkotlinx/coroutines/channels/SendChannel;ZILjava/lang/Object;)Lnet/mamoe/mirai/utils/ProgressionCallback;\n}\n\npublic abstract interface class net/mamoe/mirai/utils/RemoteFile {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/RemoteFile$Companion;\n\tpublic static final field ROOT_PATH Ljava/lang/String;\n\tpublic fun delete ()Z\n\tpublic abstract fun delete (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun exists ()Z\n\tpublic abstract fun exists (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun getContact ()Lnet/mamoe/mirai/contact/FileSupported;\n\tpublic fun getDownloadInfo ()Lnet/mamoe/mirai/utils/RemoteFile$DownloadInfo;\n\tpublic abstract fun getDownloadInfo (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun getId ()Ljava/lang/String;\n\tpublic fun getInfo ()Lnet/mamoe/mirai/utils/RemoteFile$FileInfo;\n\tpublic abstract fun getInfo (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun getName ()Ljava/lang/String;\n\tpublic abstract fun getParent ()Lnet/mamoe/mirai/utils/RemoteFile;\n\tpublic abstract fun getPath ()Ljava/lang/String;\n\tpublic fun isDirectory ()Z\n\tpublic fun isDirectory (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun isDirectory$suspendImpl (Lnet/mamoe/mirai/utils/RemoteFile;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun isFile ()Z\n\tpublic abstract fun isFile (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun length ()J\n\tpublic abstract fun length (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun listFiles ()Lkotlinx/coroutines/flow/Flow;\n\tpublic abstract fun listFiles (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun listFilesCollection ()Ljava/util/List;\n\tpublic fun listFilesCollection (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun listFilesCollection$suspendImpl (Lnet/mamoe/mirai/utils/RemoteFile;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun listFilesIterator (Z)Ljava/util/Iterator;\n\tpublic abstract fun listFilesIterator (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun mkdir ()Z\n\tpublic abstract fun mkdir (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun moveTo (Ljava/lang/String;)Z\n\tpublic fun moveTo (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun moveTo (Lnet/mamoe/mirai/utils/RemoteFile;)Z\n\tpublic abstract fun moveTo (Lnet/mamoe/mirai/utils/RemoteFile;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun moveTo$suspendImpl (Lnet/mamoe/mirai/utils/RemoteFile;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun renameTo (Ljava/lang/String;)Z\n\tpublic abstract fun renameTo (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun resolve (Ljava/lang/String;)Lnet/mamoe/mirai/utils/RemoteFile;\n\tpublic abstract fun resolve (Lnet/mamoe/mirai/utils/RemoteFile;)Lnet/mamoe/mirai/utils/RemoteFile;\n\tpublic fun resolveById (Ljava/lang/String;)Lnet/mamoe/mirai/utils/RemoteFile;\n\tpublic fun resolveById (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun resolveById (Ljava/lang/String;Z)Lnet/mamoe/mirai/utils/RemoteFile;\n\tpublic abstract fun resolveById (Ljava/lang/String;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun resolveById$default (Lnet/mamoe/mirai/utils/RemoteFile;Ljava/lang/String;ZILjava/lang/Object;)Lnet/mamoe/mirai/utils/RemoteFile;\n\tpublic static synthetic fun resolveById$default (Lnet/mamoe/mirai/utils/RemoteFile;Ljava/lang/String;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun resolveById$suspendImpl (Lnet/mamoe/mirai/utils/RemoteFile;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun resolveSibling (Ljava/lang/String;)Lnet/mamoe/mirai/utils/RemoteFile;\n\tpublic abstract fun resolveSibling (Lnet/mamoe/mirai/utils/RemoteFile;)Lnet/mamoe/mirai/utils/RemoteFile;\n\tpublic static synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun toMessage ()Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic abstract fun toMessage (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic abstract fun toString ()Ljava/lang/String;\n\tpublic fun upload (Ljava/io/File;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic fun upload (Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun upload (Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic fun upload (Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun upload (Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic fun upload (Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun upload (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic abstract fun upload (Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun upload$default (Lnet/mamoe/mirai/utils/RemoteFile;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static synthetic fun upload$default (Lnet/mamoe/mirai/utils/RemoteFile;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun upload$default (Lnet/mamoe/mirai/utils/RemoteFile;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static synthetic fun upload$default (Lnet/mamoe/mirai/utils/RemoteFile;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun upload$suspendImpl (Lnet/mamoe/mirai/utils/RemoteFile;Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun upload$suspendImpl (Lnet/mamoe/mirai/utils/RemoteFile;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun upload$suspendImpl (Lnet/mamoe/mirai/utils/RemoteFile;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/utils/RemoteFile$Companion {\n\tpublic static final field ROOT_PATH Ljava/lang/String;\n\tpublic final synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic final synthetic fun sendFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun sendFile$default (Lnet/mamoe/mirai/utils/RemoteFile$Companion;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendFile$default (Lnet/mamoe/mirai/utils/RemoteFile$Companion;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun sendFile$default (Lnet/mamoe/mirai/utils/RemoteFile$Companion;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/message/MessageReceipt;\n\tpublic static synthetic fun sendFile$default (Lnet/mamoe/mirai/utils/RemoteFile$Companion;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic final fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic final fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic final fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic final fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic final fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic final fun uploadFile (Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadFile$default (Lnet/mamoe/mirai/utils/RemoteFile$Companion;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static synthetic fun uploadFile$default (Lnet/mamoe/mirai/utils/RemoteFile$Companion;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Ljava/io/File;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n\tpublic static synthetic fun uploadFile$default (Lnet/mamoe/mirai/utils/RemoteFile$Companion;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/FileMessage;\n\tpublic static synthetic fun uploadFile$default (Lnet/mamoe/mirai/utils/RemoteFile$Companion;Lnet/mamoe/mirai/contact/FileSupported;Ljava/lang/String;Lnet/mamoe/mirai/utils/ExternalResource;Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/utils/RemoteFile$DownloadInfo {\n\tpublic final fun getFilename ()Ljava/lang/String;\n\tpublic final fun getId ()Ljava/lang/String;\n\tpublic final fun getMd5 ()[B\n\tpublic final fun getPath ()Ljava/lang/String;\n\tpublic final fun getSha1 ()[B\n\tpublic final fun getUrl ()Ljava/lang/String;\n\tpublic fun toString ()Ljava/lang/String;\n}\n\npublic final class net/mamoe/mirai/utils/RemoteFile$FileInfo {\n\tpublic final fun getDownloadTimes ()I\n\tpublic final fun getId ()Ljava/lang/String;\n\tpublic final fun getLastModifyTime ()J\n\tpublic final fun getLength ()J\n\tpublic final fun getMd5 ()[B\n\tpublic final fun getName ()Ljava/lang/String;\n\tpublic final fun getPath ()Ljava/lang/String;\n\tpublic final fun getSha1 ()[B\n\tpublic final fun getUploadTime ()J\n\tpublic final fun getUploaderId ()J\n\tpublic final fun resolveToFile (Lnet/mamoe/mirai/contact/FileSupported;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic abstract interface class net/mamoe/mirai/utils/RemoteFile$ProgressionCallback {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback$Companion;\n\tpublic static fun asProgressionCallback (Lkotlinx/coroutines/channels/SendChannel;Z)Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;\n\tpublic fun onBegin (Lnet/mamoe/mirai/utils/RemoteFile;Lnet/mamoe/mirai/utils/ExternalResource;)V\n\tpublic fun onFailure (Lnet/mamoe/mirai/utils/RemoteFile;Lnet/mamoe/mirai/utils/ExternalResource;Ljava/lang/Throwable;)V\n\tpublic fun onProgression (Lnet/mamoe/mirai/utils/RemoteFile;Lnet/mamoe/mirai/utils/ExternalResource;J)V\n\tpublic fun onSuccess (Lnet/mamoe/mirai/utils/RemoteFile;Lnet/mamoe/mirai/utils/ExternalResource;)V\n}\n\npublic final class net/mamoe/mirai/utils/RemoteFile$ProgressionCallback$Companion {\n\tpublic final fun asProgressionCallback (Lkotlinx/coroutines/channels/SendChannel;Z)Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;\n\tpublic static synthetic fun asProgressionCallback$default (Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback$Companion;Lkotlinx/coroutines/channels/SendChannel;ZILjava/lang/Object;)Lnet/mamoe/mirai/utils/RemoteFile$ProgressionCallback;\n}\n\npublic final class net/mamoe/mirai/utils/SilentLogger : net/mamoe/mirai/utils/PlatformLogger {\n\tpublic static final field INSTANCE Lnet/mamoe/mirai/utils/SilentLogger;\n\tpublic fun debug0 (Ljava/lang/String;)V\n\tpublic fun debug0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun error0 (Ljava/lang/String;)V\n\tpublic fun error0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun getIdentity ()Ljava/lang/String;\n\tpublic fun info0 (Ljava/lang/String;)V\n\tpublic fun info0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun isDebugEnabled ()Z\n\tpublic fun isEnabled ()Z\n\tpublic fun isErrorEnabled ()Z\n\tpublic fun isInfoEnabled ()Z\n\tpublic fun isVerboseEnabled ()Z\n\tpublic fun isWarningEnabled ()Z\n\tpublic fun verbose0 (Ljava/lang/String;)V\n\tpublic fun verbose0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun warning0 (Ljava/lang/String;)V\n\tpublic fun warning0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n}\n\npublic class net/mamoe/mirai/utils/SimpleLogger : net/mamoe/mirai/utils/MiraiLoggerPlatformBase {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/SimpleLogger$Companion;\n\tpublic fun <init> (Ljava/lang/String;Lkotlin/jvm/functions/Function3;)V\n\tpublic fun debug0 (Ljava/lang/String;)V\n\tpublic fun debug0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun error0 (Ljava/lang/String;)V\n\tpublic fun error0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic final fun getIdentity ()Ljava/lang/String;\n\tprotected fun getLogger ()Lkotlin/jvm/functions/Function3;\n\tpublic fun info0 (Ljava/lang/String;)V\n\tpublic fun info0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun verbose0 (Ljava/lang/String;)V\n\tpublic fun verbose0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n\tpublic fun warning0 (Ljava/lang/String;)V\n\tpublic fun warning0 (Ljava/lang/String;Ljava/lang/Throwable;)V\n}\n\npublic final class net/mamoe/mirai/utils/SimpleLogger$Companion {\n\tpublic final fun invoke (Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lnet/mamoe/mirai/utils/SimpleLogger;\n\tpublic final fun invoke (Lkotlin/jvm/functions/Function2;)Lnet/mamoe/mirai/utils/SimpleLogger;\n\tpublic final fun invoke (Lkotlin/jvm/functions/Function3;)Lnet/mamoe/mirai/utils/SimpleLogger;\n}\n\npublic final class net/mamoe/mirai/utils/SimpleLogger$LogPriority : java/lang/Enum {\n\tpublic static final field DEBUG Lnet/mamoe/mirai/utils/SimpleLogger$LogPriority;\n\tpublic static final field ERROR Lnet/mamoe/mirai/utils/SimpleLogger$LogPriority;\n\tpublic static final field INFO Lnet/mamoe/mirai/utils/SimpleLogger$LogPriority;\n\tpublic static final field VERBOSE Lnet/mamoe/mirai/utils/SimpleLogger$LogPriority;\n\tpublic static final field WARNING Lnet/mamoe/mirai/utils/SimpleLogger$LogPriority;\n\tpublic final fun getCorrespondingFunction ()Lkotlin/jvm/functions/Function3;\n\tpublic final fun getNameAligned ()Ljava/lang/String;\n\tpublic final fun getSimpleName ()Ljava/lang/String;\n\tpublic static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/utils/SimpleLogger$LogPriority;\n\tpublic static fun values ()[Lnet/mamoe/mirai/utils/SimpleLogger$LogPriority;\n}\n\npublic final class net/mamoe/mirai/utils/SingleFileLogger : net/mamoe/mirai/utils/PlatformLogger, net/mamoe/mirai/utils/MiraiLogger {\n\tpublic fun <init> (Ljava/lang/String;)V\n\tpublic fun <init> (Ljava/lang/String;Ljava/io/File;)V\n\tpublic synthetic fun <init> (Ljava/lang/String;Ljava/io/File;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n}\n\npublic final class net/mamoe/mirai/utils/StandardCharImageLoginSolver : net/mamoe/mirai/utils/LoginSolver {\n\tpublic static final field Companion Lnet/mamoe/mirai/utils/StandardCharImageLoginSolver$Companion;\n\tpublic fun <init> ()V\n\tpublic fun <init> (Lkotlin/jvm/functions/Function1;)V\n\tpublic fun <init> (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V\n\tpublic synthetic fun <init> (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic fun <init> (Lkotlin/jvm/functions/Function1;Lnet/mamoe/mirai/utils/MiraiLogger;)V\n\tpublic synthetic fun <init> (Lkotlin/jvm/functions/Function1;Lnet/mamoe/mirai/utils/MiraiLogger;ILkotlin/jvm/internal/DefaultConstructorMarker;)V\n\tpublic static final fun createBlocking (Lkotlin/jvm/functions/Function0;)Lnet/mamoe/mirai/utils/StandardCharImageLoginSolver;\n\tpublic static final fun createBlocking (Lkotlin/jvm/functions/Function0;Lnet/mamoe/mirai/utils/MiraiLogger;)Lnet/mamoe/mirai/utils/StandardCharImageLoginSolver;\n\tpublic fun createQRCodeLoginListener (Lnet/mamoe/mirai/Bot;)Lnet/mamoe/mirai/auth/QRCodeLoginListener;\n\tpublic fun isSliderCaptchaSupported ()Z\n\tpublic fun onSolveDeviceVerification (Lnet/mamoe/mirai/Bot;Lnet/mamoe/mirai/utils/DeviceVerificationRequests;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun onSolvePicCaptcha (Lnet/mamoe/mirai/Bot;[BLkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun onSolveSliderCaptcha (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic fun onSolveUnsafeDeviceLoginVerify (Lnet/mamoe/mirai/Bot;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/utils/StandardCharImageLoginSolver$Companion {\n\tpublic final fun createBlocking (Lkotlin/jvm/functions/Function0;)Lnet/mamoe/mirai/utils/StandardCharImageLoginSolver;\n\tpublic final fun createBlocking (Lkotlin/jvm/functions/Function0;Lnet/mamoe/mirai/utils/MiraiLogger;)Lnet/mamoe/mirai/utils/StandardCharImageLoginSolver;\n}\n\npublic abstract interface class net/mamoe/mirai/utils/Streamable {\n\tpublic abstract fun asFlow ()Lkotlinx/coroutines/flow/Flow;\n\tpublic fun asStream ()Ljava/util/stream/Stream;\n\tpublic fun toList ()Ljava/util/List;\n\tpublic fun toList (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n\tpublic static synthetic fun toList$suspendImpl (Lnet/mamoe/mirai/utils/Streamable;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\n}\n\npublic final class net/mamoe/mirai/utils/Utils {\n\tpublic static final synthetic fun BotConfiguration (Lkotlin/jvm/functions/Function1;)Lnet/mamoe/mirai/utils/BotConfiguration;\n\tpublic static final fun debug (Lnet/mamoe/mirai/utils/MiraiLogger;Lkotlin/jvm/functions/Function0;)V\n\tpublic static final fun debug (Lnet/mamoe/mirai/utils/MiraiLogger;Lkotlin/jvm/functions/Function0;Ljava/lang/Throwable;)V\n\tpublic static final fun error (Lnet/mamoe/mirai/utils/MiraiLogger;Lkotlin/jvm/functions/Function0;)V\n\tpublic static final fun error (Lnet/mamoe/mirai/utils/MiraiLogger;Lkotlin/jvm/functions/Function0;Ljava/lang/Throwable;)V\n\tpublic static final fun info (Lnet/mamoe/mirai/utils/MiraiLogger;Lkotlin/jvm/functions/Function0;)V\n\tpublic static final fun info (Lnet/mamoe/mirai/utils/MiraiLogger;Lkotlin/jvm/functions/Function0;Ljava/lang/Throwable;)V\n\tpublic static final fun verbose (Lnet/mamoe/mirai/utils/MiraiLogger;Lkotlin/jvm/functions/Function0;)V\n\tpublic static final fun verbose (Lnet/mamoe/mirai/utils/MiraiLogger;Lkotlin/jvm/functions/Function0;Ljava/lang/Throwable;)V\n\tpublic static final fun warning (Lnet/mamoe/mirai/utils/MiraiLogger;Lkotlin/jvm/functions/Function0;)V\n\tpublic static final fun warning (Lnet/mamoe/mirai/utils/MiraiLogger;Lkotlin/jvm/functions/Function0;Ljava/lang/Throwable;)V\n\tpublic static final fun withSwitch (Lnet/mamoe/mirai/utils/MiraiLogger;)Lnet/mamoe/mirai/utils/MiraiLoggerWithSwitch;\n\tpublic static final fun withSwitch (Lnet/mamoe/mirai/utils/MiraiLogger;Z)Lnet/mamoe/mirai/utils/MiraiLoggerWithSwitch;\n\tpublic static synthetic fun withSwitch$default (Lnet/mamoe/mirai/utils/MiraiLogger;ZILjava/lang/Object;)Lnet/mamoe/mirai/utils/MiraiLoggerWithSwitch;\n}\n\n"
  },
  {
    "path": "mirai-core-api/src/androidMain/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019-2023 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<manifest package=\"net.mamoe.mirai\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n</manifest>"
  },
  {
    "path": "mirai-core-api/src/androidMain/kotlin/package.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai"
  },
  {
    "path": "mirai-core-api/src/androidMain/kotlin/utils/LoginSolver.android.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.utils\n\ninternal actual object PlatformLoginSolverImplementations {\n    actual val isSliderCaptchaSupported: Boolean by lazy { System.getProperty(\"mirai.slider.captcha.supported\") != null }\n    actual val default: LoginSolver? get() = null\n}\n"
  },
  {
    "path": "mirai-core-api/src/androidMain/kotlin/utils/PlatformLogger.android.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport android.util.Log\n\n/**\n * [Log] 日志实现\n *\n * @see MiraiLogger.create\n * @see SingleFileLogger 使用单一文件记录日志\n * @see DirectoryLogger 在一个目录中按日期存放文件记录日志, 自动清理过期日志\n */\n@MiraiInternalApi\npublic actual open class PlatformLogger actual constructor(\n    public override val identity: String?,\n) : MiraiLoggerPlatformBase() {\n\n    public override fun verbose0(message: String?) {\n        Log.v(identity, message.toString())\n    }\n\n    public override fun verbose0(message: String?, e: Throwable?) {\n        Log.v(identity, message, e)\n    }\n\n\n    public override fun info0(message: String?) {\n        Log.i(identity, message.toString())\n    }\n\n    public override fun info0(message: String?, e: Throwable?) {\n        Log.i(identity, message, e)\n    }\n\n\n    public override fun warning0(message: String?) {\n        Log.w(identity, message.toString())\n    }\n\n    public override fun warning0(message: String?, e: Throwable?) {\n        Log.w(identity, message, e)\n    }\n\n\n    public override fun error0(message: String?) {\n        Log.e(identity, message.toString())\n    }\n\n    public override fun error0(message: String?, e: Throwable?) {\n        Log.e(identity, message, e)\n    }\n\n\n    public override fun debug0(message: String?) {\n        Log.d(identity, message.toString())\n    }\n\n    public override fun debug0(message: String?, e: Throwable?) {\n        Log.d(identity, message, e)\n    }\n\n}"
  },
  {
    "path": "mirai-core-api/src/androidMain/kotlin/utils/SingleFileLogger.android.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n\npackage net.mamoe.mirai.utils\n\nimport net.mamoe.mirai.internal.utils.StdoutLogger\nimport java.io.File\n\n\n/**\n * 将日志写入('append')到特定文件.\n *\n * @see PlatformLogger 查看格式信息\n */\npublic actual class SingleFileLogger actual constructor(\n    identity: String,\n    file: File\n) : MiraiLogger by StdoutLogger(identity, { file.appendText(it + \"\\n\") }) {\n    public actual constructor(identity: String) : this(identity, File(\"$identity-${getCurrentDate()}.log\"))\n\n    init {\n        file.createNewFile()\n        require(file.isFile) { \"Log file must be a file: $file\" }\n        require(file.canWrite()) { \"Log file must be write: $file\" }\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/Bot.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\")\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai\n\nimport kotlinx.coroutines.*\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.contact.friendgroup.FriendGroups\nimport net.mamoe.mirai.event.EventChannel\nimport net.mamoe.mirai.event.events.BotEvent\nimport net.mamoe.mirai.message.action.BotNudge\nimport net.mamoe.mirai.message.action.MemberNudge\nimport net.mamoe.mirai.network.LoginFailedException\nimport net.mamoe.mirai.utils.BotConfiguration\nimport net.mamoe.mirai.utils.ConcurrentHashMap\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport kotlin.jvm.JvmStatic\nimport kotlin.jvm.JvmSynthetic\n\n/**\n * 登录, 返回 [this]\n */\n@JvmSynthetic\npublic suspend inline fun <B : Bot> B.alsoLogin(): B = also { login() }\n\n/**\n * 机器人对象. 一个机器人实例登录一个 QQ 账号.\n * Mirai 为多账号设计, 可同时维护多个机器人.\n *\n * 有关 [Bot] 生命管理, 请查看 [BotConfiguration.inheritCoroutineContext]\n *\n * @see Contact 联系人\n * @see isActive 判断 [Bot] 是否正常运行中. (协程正常运行) (但不能判断是否在线, 需使用 [isOnline])\n *\n * @see BotFactory 构造 [Bot] 的工厂, [Bot] 唯一的构造方式.\n */\n@NotStableForInheritance\npublic interface Bot : CoroutineScope, ContactOrBot, UserOrBot {\n    /**\n     * Bot 配置\n     */\n    public val configuration: BotConfiguration\n\n    /**\n     * 返回 `this`\n     */\n    public override val bot: Bot get() = this\n\n    /**\n     * 日志记录器\n     */\n    public val logger: MiraiLogger\n\n    /**\n     * 当 Bot 在线 (可正常收发消息) 时返回 `true`.\n     */\n    public val isOnline: Boolean\n\n    /**\n     * 来自这个 [Bot] 的 [BotEvent] 的事件通道.\n     * @see EventChannel\n     */\n    public val eventChannel: EventChannel<BotEvent>\n\n    // region contacts\n\n    /**\n     * 其他设备列表\n     */\n    public val otherClients: ContactList<OtherClient>\n\n\n    /**\n     * [User.id] 与 [Bot.id] 相同的 [Friend] 实例\n     */\n    public val asFriend: Friend\n\n    /**\n     * [User.id] 与 [Bot.id] 相同的 [Stranger] 实例\n     */\n    public val asStranger: Stranger\n\n\n    /**\n     * 陌生人列表. 与服务器同步更新.\n     */\n    public val strangers: ContactList<Stranger>\n\n    /**\n     * 以 [对方 QQ 号码][id] 获取一个陌生人对象, 在获取失败时返回 `null`.\n     */\n    public fun getStranger(id: Long): Stranger? =\n        strangers.firstOrNull { it.id == id }\n\n    /**\n     * 以 [对方 QQ 号码][id] 获取一个陌生人对象, 在获取失败时抛出 [NoSuchElementException].\n     */\n    public fun getStrangerOrFail(id: Long): Stranger = getStranger(id) ?: throw NoSuchElementException(\"stranger $id\")\n\n    /**\n     * 好友列表. 与服务器同步更新.\n     */\n    public val friends: ContactList<Friend>\n\n    /**\n     * 全部的好友分组\n     *\n     * @since 2.13\n     */\n    public val friendGroups: FriendGroups\n\n\n    /**\n     * 以 [对方 QQ 号码][id] 获取一个好友对象, 在获取失败时返回 `null`.\n     * 在 [id] 与 [Bot.id] 相同时返回 [Bot.asFriend].\n     */\n    public fun getFriend(id: Long): Friend? =\n        friends.firstOrNull { it.id == id } ?: if (id == this.id) asFriend else null\n\n    /**\n     * 以 [对方 QQ 号码][id] 获取一个好友对象, 在获取失败时抛出 [NoSuchElementException].\n     * 在 [id] 与 [Bot.id] 相同时返回 [Bot.asFriend].\n     */\n    public fun getFriendOrFail(id: Long): Friend = getFriend(id) ?: throw NoSuchElementException(\"friend $id\")\n\n    /**\n     * 加入的群列表. 与服务器同步更新.\n     */\n    public val groups: ContactList<Group>\n\n    /**\n     * 以 [群号码][id] 获取一个群对象, 在获取失败时返回 `null`.\n     */\n    public fun getGroup(id: Long): Group? =\n        groups.firstOrNull { it.id == id }\n\n    /**\n     * 以 [群号码][id] 获取一个群对象, 在获取失败时抛出 [NoSuchElementException].\n     */\n    public fun getGroupOrFail(id: Long): Group = getGroup(id) ?: throw NoSuchElementException(\"group $id\")\n\n    // endregion\n\n    /**\n     * 登录, 或重新登录.\n     * 这个函数总是关闭一切现有网路任务 (但不会关闭其他任务), 然后重新登录并重新缓存好友列表和群列表.\n     *\n     * 一般情况下不需要重新登录. Mirai 能够自动处理掉线情况.\n     *\n     * @throws LoginFailedException 正常登录失败时抛出\n     * @see alsoLogin `.apply { login() }` 捷径\n     */\n    public suspend fun login()\n\n    /**\n     * 创建一个 \"戳一戳\" 消息\n     *\n     * @see MemberNudge.sendTo 发送这个戳一戳消息\n     */\n    public override fun nudge(): BotNudge = BotNudge(this)\n\n\n    /**\n     * 关闭这个 [Bot], 立即取消 [Bot] 的 [SupervisorJob], 取消与这个 [Bot] 相关的所有有协程联系的任务.\n     *\n     * **注意:** 不可重新登录. 必须重新实例化一个 [Bot].\n     *\n     * @param cause 原因. 为 null 时视为正常关闭, 非 null 时视为异常关闭. 在关闭 [Bot] 作用域下的协程时将会传递这个原因.\n     *\n     * @see closeAndJoin 取消并 [Bot.join], 以确保 [Bot] 相关的活动被完全关闭\n     */\n    public fun close(cause: Throwable? = null)\n\n    /**\n     * 关闭这个 [Bot]. 查看 [close] 获取更多信息.\n     */\n    public fun close(): Unit = close(null)\n\n\n    public companion object {\n        @Suppress(\"ObjectPropertyName\")\n        internal val _instances: MutableMap<Long, Bot> = ConcurrentHashMap()\n\n        /**\n         * 复制一份此时的 [Bot] 实例列表.\n         */\n        @JvmStatic\n        public val instances: List<Bot>\n            get() = _instances.values.toList()\n\n        /**\n         * 复制一份此时的 [Bot] 实例列表.\n         */\n        @JvmStatic\n        public val instancesSequence: Sequence<Bot>\n            get() = _instances.values.asSequence().filterNotNull()\n\n        /**\n         * 获取一个 [Bot] 实例, 无对应实例时抛出 [NoSuchElementException]\n         */\n        @JvmStatic\n        @Throws(NoSuchElementException::class)\n        public fun getInstance(qq: Long): Bot =\n            findInstance(qq) ?: throw NoSuchElementException(qq.toString())\n\n        /**\n         * 获取一个 [Bot] 实例, 无对应实例时返回 `null`\n         */\n        @JvmStatic\n        public inline fun getInstanceOrNull(qq: Long): Bot? = findInstance(qq)\n\n        /**\n         * 获取一个 [Bot] 实例, 无对应实例时返回 `null`\n         */\n        @JvmStatic\n        public fun findInstance(qq: Long): Bot? = _instances[qq]\n    }\n\n    /**\n     * 挂起协程直到 [Bot] 协程被关闭 ([Bot.close]).\n     * 即使 [Bot] 离线, 也会等待直到协程关闭.\n     */\n    public suspend fun join(): Unit = supervisorJob.join()\n\n\n    /**\n     * 关闭这个 [Bot], 停止一切相关活动. 所有引用都会被释放.\n     *\n     * 注: 不可重新登录. 必须重新实例化一个 [Bot].\n     *\n     * @param cause 原因. 为 null 时视为正常关闭, 非 null 时视为异常关闭\n     */\n    public suspend fun closeAndJoin(cause: Throwable? = null) {\n        close(cause)\n        join()\n    }\n}\n\n/**\n * 获取 [Job] 的协程 [Job]. 此 [Job] 为一个 [SupervisorJob]\n */\n@get:JvmSynthetic\npublic inline val Bot.supervisorJob: CompletableJob\n    get() = this.coroutineContext[Job] as CompletableJob\n\n/**\n * 当 [Bot] 拥有 [Friend.id] 为 [id] 的好友时返回 `true`.\n */\n@JvmSynthetic\npublic inline fun Bot.containsFriend(id: Long): Boolean = this.friends.contains(id)\n\n/**\n * 当 [Bot] 拥有 [Group.id] 为 [id] 的群时返回 `true`.\n */\n@JvmSynthetic\npublic inline fun Bot.containsGroup(id: Long): Boolean = this.groups.contains(id)"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/BotFactory.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"NOTHING_TO_INLINE\")\n\npackage net.mamoe.mirai\n\nimport net.mamoe.mirai.auth.BotAuthorization\nimport net.mamoe.mirai.utils.BotConfiguration\nimport kotlin.jvm.JvmSynthetic\n\n/**\n * 构造 [Bot] 的工厂. 这是 [Bot] 唯一的构造方式.\n *\n * @see IMirai.BotFactory\n */\npublic interface BotFactory {\n    /**\n     * 相当于 Kotlin lambda `BotConfiguration.() -> Unit` 和 Java `Consumer<BotConfiguration>`\n     *\n     * @see newBot\n     */\n    public fun interface BotConfigurationLambda {\n        public operator fun BotConfiguration.invoke()\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Plain Password\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 使用指定的 [配置][configuration] 构造 [Bot] 实例\n     */\n    public fun newBot(qq: Long, password: String, configuration: BotConfiguration): Bot\n\n    /**\n     * 使用指定的 [配置][configuration] 构造 [Bot] 实例\n     *\n     * Kotlin:\n     * ```\n     * newBot(123, \"\") {\n     *     // this: BotConfiguration\n     *     fileBasedDeviceInfo()\n     * }\n     * ```\n     *\n     * Java:\n     * ```java\n     * newBot(123, \"\", configuration -> {\n     *     configuration.fileBasedDeviceInfo()\n     * })\n     * ```\n     */\n    public fun newBot(\n        qq: Long,\n        password: String,\n        configuration: BotConfigurationLambda /* = BotConfiguration.() -> Unit */\n    ): Bot = newBot(qq, password, configuration.run { BotConfiguration().apply { invoke() } })\n\n    /**\n     * 使用 [默认配置][BotConfiguration.Default] 构造 [Bot] 实例\n     */\n    public fun newBot(qq: Long, password: String): Bot = newBot(qq, password, BotConfiguration.Default)\n\n    ///////////////////////////////////////////////////////////////////////////\n    // MD5 Password\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 使用指定的 [配置][configuration] 构造 [Bot] 实例\n     *\n     * @param passwordMd5 16 bytes\n     */\n    public fun newBot(qq: Long, passwordMd5: ByteArray, configuration: BotConfiguration): Bot\n\n    /**\n     * 使用指定的 [配置][configuration] 构造 [Bot] 实例\n     *\n     * Kotlin:\n     * ```\n     * newBot(123, password) {\n     *     // this: BotConfiguration\n     *     fileBasedDeviceInfo()\n     * }\n     * ```\n     *\n     * Java:\n     * ```java\n     * newBot(123, password, configuration -> {\n     *     configuration.fileBasedDeviceInfo()\n     * })\n     * ```\n     *\n     * @param passwordMd5 16 bytes\n     */\n    public fun newBot(\n        qq: Long,\n        passwordMd5: ByteArray,\n        configuration: BotConfigurationLambda /* = BotConfiguration.() -> Unit */\n    ): Bot = newBot(qq, passwordMd5, configuration.run { BotConfiguration().apply { invoke() } })\n\n    /**\n     * 使用 [默认配置][BotConfiguration.Default] 构造 [Bot] 实例\n     *\n     * @param passwordMd5 16 bytes\n     */\n    public fun newBot(qq: Long, passwordMd5: ByteArray): Bot = newBot(qq, passwordMd5, BotConfiguration.Default)\n\n    ///////////////////////////////////////////////////////////////////////////\n    // BotAuthorization\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 使用 [默认配置][BotConfiguration.Default] 构造 [Bot] 实例\n     *\n     * @since 2.15\n     */\n    public fun newBot(qq: Long, authorization: BotAuthorization): Bot =\n        newBot(qq, authorization, BotConfiguration.Default)\n\n    /**\n     * 使用指定的 [配置][configuration] 构造 [Bot] 实例\n     *\n     * @since 2.15\n     */\n    public fun newBot(qq: Long, authorization: BotAuthorization, configuration: BotConfiguration): Bot\n\n\n    /**\n     * 使用指定的 [配置][configuration] 构造 [Bot] 实例\n     *\n     * Kotlin:\n     * ```\n     * newBot(123, password) {\n     *     // this: BotConfiguration\n     *     fileBasedDeviceInfo()\n     * }\n     * ```\n     *\n     * Java:\n     * ```java\n     * newBot(123, password, configuration -> {\n     *     configuration.fileBasedDeviceInfo()\n     * })\n     * ```\n     *\n     * @since 2.15\n     */\n    public fun newBot(\n        qq: Long,\n        authorization: BotAuthorization,\n        configuration: BotConfigurationLambda /* = BotConfiguration.() -> Unit */\n    ): Bot = newBot(qq, authorization, configuration.run { BotConfiguration().apply { invoke() } })\n\n\n    public companion object INSTANCE : BotFactory {\n        override fun newBot(qq: Long, password: String, configuration: BotConfiguration): Bot {\n            return Mirai.BotFactory.newBot(qq, password, configuration)\n        }\n\n        override fun newBot(qq: Long, passwordMd5: ByteArray, configuration: BotConfiguration): Bot {\n            return Mirai.BotFactory.newBot(qq, passwordMd5, configuration)\n        }\n\n        /**\n         * 使用指定的 [配置][configuration] 构造 [Bot] 实例\n         *\n         * ```\n         * newBot(123, \"\") {\n         *     // this: BotConfiguration\n         *     fileBasedDeviceInfo()\n         * }\n         * ```\n         *\n         * @since 2.7\n         */\n        @JvmSynthetic\n        public inline fun newBot(\n            qq: Long,\n            password: String,\n            configuration: BotConfiguration.() -> Unit /* = BotConfiguration.() -> Unit */\n        ): Bot = newBot(qq, password, BotConfiguration().apply(configuration))\n\n        // implementation notes: this is inline for `inheritCoroutineContext()`\n        // see https://github.com/mamoe/mirai/commit/0dbb448cad1ed4773d48ccb8c0b497841bc9fa4c#r50249446\n\n        /**\n         * 使用指定的 [配置][configuration] 构造 [Bot] 实例\n         *\n         * ```\n         * newBot(123, password) {\n         *     // this: BotConfiguration\n         *     fileBasedDeviceInfo()\n         * }\n         * ```\n         *\n         * @since 2.7\n         */\n        @JvmSynthetic\n        public inline fun newBot(\n            qq: Long,\n            passwordMd5: ByteArray,\n            configuration: BotConfiguration.() -> Unit /* = BotConfiguration.() -> Unit */\n        ): Bot = newBot(qq, passwordMd5, BotConfiguration().apply(configuration))\n\n        override fun newBot(qq: Long, authorization: BotAuthorization, configuration: BotConfiguration): Bot {\n            return Mirai.BotFactory.newBot(qq, authorization, configuration)\n        }\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/IMirai.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INTERFACE_NOT_SUPPORTED\", \"PropertyName\")\n@file:JvmName(\"Mirai\")\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.data.UserProfile\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.BotInvitedJoinGroupRequestEvent\nimport net.mamoe.mirai.event.events.MemberJoinRequestEvent\nimport net.mamoe.mirai.event.events.NewFriendRequestEvent\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.action.Nudge\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.message.data.Image.Key.queryUrl\nimport net.mamoe.mirai.message.data.MessageSource.Key.recall\nimport net.mamoe.mirai.utils.*\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmStatic\nimport kotlin.jvm.JvmSynthetic\n\n/**\n * [IMirai] 实例.\n */\n@get:JvmName(\"getInstance\") // Java 调用: Mirai.getInstance()\npublic val Mirai: IMirai\n    get() = _MiraiInstance.get()\n\n/**\n * Mirai API 接口. 是 Mirai API 与 Mirai 协议实现对接的接口.\n *\n * ## 获取实例\n *\n * 通常在引用 `net.mamoe:mirai-core` 模块后就可以通过 [Mirai] 获取到 [IMirai] 实例.\n * 在 Kotlin 调用顶层定义 `Mirai`, 在 Java 调用 `Mirai.getInstance()`.\n *\n * ### 使用 [IMirai] 的接口\n *\n * [IMirai] 中的接口通常是稳定\n *\n * ### 手动提供实例\n *\n * 默认通过 [_MiraiInstance.get] 使用 [java.util.ServiceLoader] 寻找实例. 若某些环境下 [java.util.ServiceLoader] 不可用, 可在 Kotlin 手动设置实例:\n * ```\n * @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\") // 必要\n * net.mamoe.mirai._MiraiInstance.set(net.mamoe.mirai.internal.MiraiImpl())\n * ```\n *\n * 但通常都可用自动获取而不需要手动设置.\n *\n * ## 稳定性\n *\n * ### 使用稳定\n *\n * 所有接口默认是可以稳定使用的. 但 [LowLevelApiAccessor] 中的方法默认是非常不稳定的.\n *\n * ### 继承不稳定\n *\n * **[IMirai] 可能会增加新的抽象属性或函数. 因此不适合被继承或实现.**\n *\n * @see Mirai 获取实例\n */\n@OptIn(LowLevelApi::class, MiraiExperimentalApi::class)\n@NotStableForInheritance\npublic interface IMirai : LowLevelApiAccessor {\n    /**\n     * 请优先使用 [BotFactory.INSTANCE]\n     *\n     * @see BotFactory.INSTANCE\n     */\n    public val BotFactory: BotFactory\n\n    /**\n     * Mirai 全局使用的 [FileCacheStrategy].\n     *\n     * 覆盖后将会立即应用到全局.\n     *\n     * @see FileCacheStrategy\n     */\n    public var FileCacheStrategy: FileCacheStrategy\n\n    /**\n     * 获取 uin.\n     *\n     * - 用户的 uin 就是用户的 ID (QQ 号码, [User.id]).\n     * - 部分旧群的 uin 需要通过算法计算 [calculateGroupUinByGroupCode]. 新群的 uin 与在客户端能看到的群号码 ([Group.id]) 相同.\n     *\n     * 除了一些偏底层的 API 如 [MessageSourceBuilder.id] 外, mirai 的所有其他 API 都使用在客户端能看到的用户 QQ 号码和群号码 ([Contact.id]). 并会在需要的时候进行合适转换.\n     * 若需要使用 uin, 在特定方法的文档中会标出.\n     */\n    public fun getUin(contactOrBot: ContactOrBot): Long {\n        return if (contactOrBot is Group)\n            @Suppress(\"DEPRECATION\")\n            calculateGroupUinByGroupCode(contactOrBot.id)\n        else contactOrBot.id\n    }\n\n    /**\n     * 使用 groupCode 计算 groupUin. 这两个值仅在 mirai 内部协议区分, 一般人使用时无需在意.\n     * @see getUin\n     */\n    @Deprecated(\n        \"The result might be wrong. Consider using getUin\",\n        level = DeprecationLevel.WARNING\n    ) // deprecated since 2.8.0-RC, see #1479\n    public fun calculateGroupUinByGroupCode(groupCode: Long): Long {\n        var left: Long = groupCode / 1000000L\n        when (left) {\n            in 0..10 -> left += 202\n            in 11..19 -> left += 480 - 11\n            in 20..66 -> left += 2100 - 20\n            in 67..156 -> left += 2010 - 67\n            in 157..209 -> left += 2147 - 157\n            in 210..309 -> left += 4100 - 210\n            in 310..499 -> left += 3800 - 310\n        }\n        return left * 1000000L + groupCode % 1000000L\n    }\n\n    /**\n     * 使用 groupUin 计算 groupCode. 这两个值仅在 mirai 内部协议区分, 一般人使用时无需在意.\n     * @see getUin\n     */\n    public fun calculateGroupCodeByGroupUin(groupUin: Long): Long {\n        var left: Long = groupUin / 1000000L\n        when (left) {\n            in 0 + 202..10 + 202 -> left -= 202\n            in 11 + 480 - 11..19 + 480 - 11 -> left -= 480 - 11\n            in 20 + 2100 - 20..66 + 2100 - 20 -> left -= 2100 - 20\n            in 67 + 2010 - 67..156 + 2010 - 67 -> left -= 2010 - 67\n            in 157 + 2147 - 157..209 + 2147 - 157 -> left -= 2147 - 157\n            in 210 + 4100 - 210..309 + 4100 - 210 -> left -= 4100 - 210\n            in 310 + 3800 - 310..499 + 3800 - 310 -> left -= 3800 - 310\n        }\n        return left * 1000000L + groupUin % 1000000L\n    }\n\n    /**\n     * 撤回这条消息. 可撤回自己 2 分钟内发出的消息, 和任意时间的群成员的消息.\n     *\n     * [Bot] 撤回自己的消息不需要权限.\n     * [Bot] 撤回群员的消息需要管理员权限.\n     *\n     * @param source 消息源. 可从 [MessageReceipt.source] 获得, 或从消息事件中的 [MessageChain] 获得, 或通过 [buildMessageSource] 构建.\n     *\n     * @throws PermissionDeniedException 当 [Bot] 无权限操作时抛出\n     * @throws IllegalStateException 当这条消息已经被撤回时抛出 (仅同步主动操作)\n     *\n     * @see IMirai.recallMessage (扩展函数) 接受参数 [MessageChain]\n     * @see MessageSource.recall 撤回消息扩展\n     */\n    public suspend fun recallMessage(bot: Bot, source: MessageSource)\n\n    /**\n     * 发送戳一戳消息\n     */\n    public suspend fun sendNudge(bot: Bot, nudge: Nudge, receiver: Contact): Boolean\n\n    /**\n     * 构造 [Image]. 请优先使用 [Image.Factory.create].\n     *\n     * @see Image\n     * @see Image.fromId\n     * @see Image.Factory.create\n     */\n    public fun createImage(imageId: String): Image = Image.Builder.newBuilder(imageId).build()\n\n    /**\n     * 创建一个 [FileMessage]. [name] 与 [size] 只供本地使用, 发送消息时只会使用 [id] 和 [internalId].\n     * @since 2.5\n     */\n    public fun createFileMessage(id: String, internalId: Int, name: String, size: Long): FileMessage\n\n    /**\n     * 创建 [UnsupportedMessage]\n     * @since 2.6\n     */\n    public fun createUnsupportedMessage(struct: ByteArray): UnsupportedMessage\n\n    /**\n     * 获取图片下载链接\n     *\n     * @see Image.queryUrl [Image] 的扩展函数\n     */\n    public suspend fun queryImageUrl(bot: Bot, image: Image): String\n\n    /**\n     * 查询某个用户的信息\n     *\n     * 此函数不会缓存信息. 每次调用此函数都会向服务器查询新信息.\n     *\n     * @since 2.1\n     */\n    public suspend fun queryProfile(bot: Bot, targetId: Long): UserProfile\n\n    /**\n     * 构造一个 [OfflineMessageSource].\n     *\n     * 更推荐使用 [MessageSourceBuilder] 和 [MessageSource.copyAmend] 创建 [OfflineMessageSource].\n     *\n     * @param ids 即 [MessageSource.ids]\n     * @param internalIds 即 [MessageSource.internalIds]\n     */\n    public fun constructMessageSource(\n        botId: Long,\n        kind: MessageSourceKind,\n        fromId: Long, targetId: Long,\n        ids: IntArray, time: Int, internalIds: IntArray,\n        originalMessage: MessageChain\n    ): OfflineMessageSource\n\n    /**\n     * @since 2.3\n     */\n    public suspend fun downloadLongMessage(\n        bot: Bot,\n        resourceId: String,\n    ): MessageChain\n\n    /**\n     * @since 2.3\n     */\n    public suspend fun downloadForwardMessage(\n        bot: Bot,\n        resourceId: String,\n    ): List<ForwardMessage.Node>\n\n    /**\n     * 通过好友验证\n     *\n     * @param event 好友验证的事件对象\n     */\n    public suspend fun acceptNewFriendRequest(event: NewFriendRequestEvent)\n\n    /**\n     * 拒绝好友验证\n     *\n     * @param event 好友验证的事件对象\n     * @param blackList 拒绝后是否拉入黑名单\n     */\n    public suspend fun rejectNewFriendRequest(event: NewFriendRequestEvent, blackList: Boolean = false)\n\n    /**\n     * 通过加群验证（需管理员权限）\n     *\n     * @param event 加群验证的事件对象\n     */\n    public suspend fun acceptMemberJoinRequest(event: MemberJoinRequestEvent)\n\n    /**\n     * 拒绝加群验证（需管理员权限）\n     *\n     * @param event 加群验证的事件对象\n     * @param blackList 拒绝后是否拉入黑名单\n     */\n    public suspend fun rejectMemberJoinRequest(\n        event: MemberJoinRequestEvent,\n        blackList: Boolean = false,\n        message: String = \"\"\n    )\n\n    /**\n     * 获取在线的 [OtherClient] 列表\n     * @param mayIncludeSelf 服务器返回的列表可能包含 [Bot] 自己. [mayIncludeSelf] 为 `false` 会排除自己\n     */\n    public suspend fun getOnlineOtherClientsList(\n        bot: Bot,\n        mayIncludeSelf: Boolean = false\n    ): List<OtherClientInfo>\n\n    /**\n     * 忽略加群验证（需管理员权限）\n     *\n     * @param event 加群验证的事件对象\n     * @param blackList 忽略后是否拉入黑名单\n     */\n    public suspend fun ignoreMemberJoinRequest(event: MemberJoinRequestEvent, blackList: Boolean = false)\n\n    /**\n     * 接收邀请入群（需管理员权限）\n     *\n     * @param event 邀请入群的事件对象\n     */\n    public suspend fun acceptInvitedJoinGroupRequest(event: BotInvitedJoinGroupRequestEvent)\n\n    /**\n     * 忽略邀请入群（需管理员权限）\n     *\n     * @param event 邀请入群的事件对象\n     */\n    public suspend fun ignoreInvitedJoinGroupRequest(event: BotInvitedJoinGroupRequestEvent)\n\n    /**\n     * 广播一个事件. 由 [Event.broadcast] 调用.\n     */\n    public suspend fun broadcastEvent(event: Event)\n}\n\n/**\n * 撤回这条消息.\n *\n * [Bot] 撤回自己的消息不需要权限, 但需要在发出后 2 分钟内撤回.\n * [Bot] 撤回群员的消息需要管理员权限, 可在任意时间撤回.\n *\n * @throws PermissionDeniedException 当 [Bot] 无权限操作时\n * @see IMirai.recallMessage\n */\n@JvmSynthetic\npublic suspend inline fun IMirai.recallMessage(bot: Bot, message: MessageChain): Unit =\n    this.recallMessage(bot, message.source)\n\n/**\n * @since 2.6-RC\n */\n@PublishedApi // for tests and potential public uses.\n@Suppress(\"ClassName\")\ninternal object _MiraiInstance {\n\n    @JvmStatic\n    fun set(instance: IMirai) {\n        miraiInstance = instance\n    }\n\n    /**\n     * 获取通过 [set] 设置的实例, 或使用 [findMiraiInstance] 寻找一个实例.\n     */\n    @JvmStatic\n    fun get(): IMirai {\n        return miraiInstance ?: findMiraiInstance().also { miraiInstance = it }\n    }\n}\n\n// to overcome native gc issue\nprivate var miraiInstance: IMirai? = null\n\n@JvmSynthetic\ninternal fun findMiraiInstance(): IMirai {\n    return loadService(IMirai::class, \"net.mamoe.mirai.internal.MiraiImpl\")\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/LowLevelApiAccessor.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai\n\nimport kotlinx.coroutines.Job\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.data.FriendInfo\nimport net.mamoe.mirai.data.MemberInfo\nimport net.mamoe.mirai.data.StrangerInfo\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport kotlin.annotation.AnnotationTarget.*\n\n/**\n * 标示这个 API 是低级的 API.\n *\n * 低级的 API 可能在任意时刻被改动.\n * 使用低级的 API 无法带来任何安全和便捷保障.\n * 仅在某些使用结构化 API 可能影响性能的情况下使用这些低级 API.\n */\n@LowLevelApi\n@RequiresOptIn\n@Retention(AnnotationRetention.BINARY)\n@Target(CLASS, FUNCTION, PROPERTY, CONSTRUCTOR)\npublic annotation class LowLevelApi\n\n/**\n * [IMirai] 协议层低级 API.\n *\n * **警告**: 所有的低级 API 都可能在任意时刻不经过任何警告和迭代就被修改. 因此非常不建议在任何情况下使用这些 API.\n */\n@LowLevelApi\n@NotStableForInheritance\npublic interface LowLevelApiAccessor {\n    /**\n     * 主动刷新 keys, 如 SKey, PSKey 等.\n     *\n     * 通常 mirai 会自动刷新, 不需要手动刷新.\n     *\n     * @since 2.2\n     */\n    @MiraiExperimentalApi\n    public suspend fun refreshKeys(bot: Bot)\n\n    /**\n     * 构造一个 [Friend] 对象.\n     *\n     * [Bot] 无法管理这个对象, 但这个对象会以 [Bot] 的 [Job] 作为父 Job.\n     * 因此, 当 [Bot] 被关闭后, 这个对象也会被关闭.\n     */\n    @LowLevelApi\n    public fun newFriend(bot: Bot, friendInfo: FriendInfo): Friend\n\n    /**\n     * 构造一个 [Stranger] 对象.\n     *\n     * [Bot] 无法管理这个对象, 但这个对象会以 [Bot] 的 [Job] 作为父 Job.\n     * 因此, 当 [Bot] 被关闭后, 这个对象也会被关闭.\n     */\n    @LowLevelApi\n    public fun newStranger(bot: Bot, strangerInfo: StrangerInfo): Stranger\n\n    /**\n     * 撤回这条消息. 不会广播事件, 不会有安全性检查.\n     * @see recallMessage\n     */\n    @LowLevelApi\n    public suspend fun recallGroupMessageRaw(\n        bot: Bot,\n        groupCode: Long,\n        messageIds: IntArray,\n        messageInternalIds: IntArray,\n    ): Boolean\n\n    /**\n     * 撤回这条消息. 不会广播事件, 不会有安全性检查.\n     * @see recallMessage\n     */\n    @LowLevelApi\n    public suspend fun recallFriendMessageRaw(\n        bot: Bot,\n        targetId: Long,\n        messageIds: IntArray,\n        messageInternalIds: IntArray,\n        time: Int,\n    ): Boolean\n\n    /**\n     * 撤回这条消息. 不会广播事件, 不会有安全性检查.\n     * @see recallMessage\n     */\n    @LowLevelApi\n    public suspend fun recallGroupTempMessageRaw(\n        bot: Bot,\n        groupUin: Long,\n        targetId: Long,\n        messageIds: IntArray,\n        messageInternalIds: IntArray,\n        time: Int,\n    ): Boolean\n\n    /**\n     * 向服务器查询群列表. 返回值高 32 bits 为 uin, 低 32 bits 为 groupCode\n     */\n    @LowLevelApi\n    public suspend fun getRawGroupList(bot: Bot): Sequence<Long>\n\n    /**\n     * 向服务器查询群成员列表.\n     * 请优先使用 [Bot.getGroup], [Group.members] 查看群成员.\n     *\n     * 这个函数很慢. 请不要频繁使用.\n     *\n     * @see IMirai.calculateGroupUinByGroupCode 使用 groupCode 计算 groupUin\n     */\n    @LowLevelApi\n    public suspend fun getRawGroupMemberList(\n        bot: Bot,\n        groupUin: Long,\n        groupCode: Long,\n        ownerId: Long\n    ): Sequence<MemberInfo>\n\n\n    /**\n     * 处理一个账号请求添加机器人为好友的事件\n     */\n    @LowLevelApi\n    public suspend fun solveNewFriendRequestEvent(\n        bot: Bot,\n        eventId: Long,\n        fromId: Long,\n        fromNick: String,\n        accept: Boolean,\n        blackList: Boolean\n    )\n\n    /**\n     * 处理被邀请加入一个群请求事件\n     */\n    @LowLevelApi\n    public suspend fun solveBotInvitedJoinGroupRequestEvent(\n        bot: Bot,\n        eventId: Long,\n        invitorId: Long,\n        groupId: Long,\n        accept: Boolean\n    )\n\n    /**\n     * 处理账号请求加入群事件\n     */\n    @LowLevelApi\n    public suspend fun solveMemberJoinRequestEvent(\n        bot: Bot,\n        eventId: Long,\n        fromId: Long,\n        fromNick: String,\n        groupId: Long,\n        accept: Boolean?,\n        blackList: Boolean,\n        message: String = \"\"\n    )\n\n    /**\n     * 查询语音的下载连接\n     */\n    @LowLevelApi\n    public suspend fun getGroupVoiceDownloadUrl(\n        bot: Bot,\n        md5: ByteArray,\n        groupId: Long,\n        dstUin: Long\n    ): String\n\n    /**\n     * 禁言一个匿名用户\n     *\n     * @param anonymousId [AnonymousMember.anonymousId]\n     */\n    @LowLevelApi\n    public suspend fun muteAnonymousMember(\n        bot: Bot,\n        anonymousId: String,\n        anonymousNick: String,\n        groupId: Long,\n        seconds: Int,\n    )\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/auth/BotAuthorization.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.auth\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.BotFactory\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.event.events.BotOfflineEvent\nimport net.mamoe.mirai.network.LoginFailedException\nimport net.mamoe.mirai.network.RetryLaterException\nimport net.mamoe.mirai.utils.*\nimport kotlin.jvm.JvmStatic\n\n/**\n * Bot 的登录鉴权方式\n *\n * @see BotFactory.newBot\n *\n * @since 2.15\n */\npublic interface BotAuthorization {\n    /**\n     * 此方法控制 Bot 如何进行登录.\n     *\n     * Bot 只能使用一种登录方式, 但是可以在一种登录方式失败的时候尝试其他登录方式\n     *\n     * ## 异常类型\n     *\n     * 抛出一个 [LoginFailedException] 以正常地终止登录, 并可建议系统进行重连或停止 bot (通过 [LoginFailedException.killBot]).\n     * 例如抛出 [RetryLaterException] 可让 bot 重新进行一次登录.\n     *\n     * 抛出任意其他 [Throwable] 将视为鉴权选择器的自身错误.\n     *\n     * ## 示例代码\n     * ```kotlin\n     * override suspend fun authorize(\n     *      authComponent: BotAuthSession,\n     *      bot: BotAuthInfo,\n     * ) {\n     *      return kotlin.runCatching {\n     *          authComponent.authByQRCode()\n     *      }.recover {\n     *          authComponent.authByPassword(\"...\")\n     *      }.getOrThrow()\n     * }\n     * ```\n     */\n    public suspend fun authorize(\n        session: BotAuthSession,\n        info: BotAuthInfo,\n    ): BotAuthResult\n\n\n    /**\n     * 计算 `cache/account.secrets` 的加密秘钥\n     */\n    @OptIn(MiraiInternalApi::class)\n    public fun calculateSecretsKey(\n        bot: BotAuthInfo,\n    ): ByteArray = bot.deviceInfo.guid + bot.id.toByteArray()\n\n    public companion object {\n        @JvmStatic\n        public fun byPassword(password: String): BotAuthorization = byPassword(password.md5())\n\n        @JvmStatic\n        public fun byPassword(passwordMd5: ByteArray): BotAuthorization = factory.byPassword(passwordMd5)\n\n        @JvmStatic\n        public fun byQRCode(): BotAuthorization = factory.byQRCode()\n\n        public operator fun invoke(\n            block: suspend (BotAuthSession, BotAuthInfo) -> BotAuthResult\n        ): BotAuthorization {\n            return object : BotAuthorization {\n                override suspend fun authorize(\n                    session: BotAuthSession,\n                    info: BotAuthInfo\n                ): BotAuthResult {\n                    return block(session, info)\n                }\n            }\n        }\n\n        private val factory: DefaultBotAuthorizationFactory by lazy {\n            Mirai // Ensure services loaded\n            loadService()\n        }\n    }\n}\n\n@NotStableForInheritance\npublic interface BotAuthResult\n\n@NotStableForInheritance\npublic interface BotAuthInfo {\n    public val id: Long\n    public val deviceInfo: DeviceInfo\n    public val configuration: BotConfiguration\n\n    /**\n     * 是否是首次登录\n     *\n     * 首次登录指的是首次调用 [Bot.login] 进行登录，直到登录成功的过程。\n     *\n     * 若在首次登录过程中多次进入[认证流程][BotAuthorization.authorize]，则这流程些均被视为首次登录。\n     *\n     * @see Bot.login\n     * @see BotAuthorization.authorize\n     */\n    public val isFirstLogin: Boolean\n\n    /**\n     * 导致进入[认证流程][BotAuthorization.authorize]的原因。\n     */\n    public val reason: AuthReason\n}\n\n/**\n * 导致进行[认证流程][BotAuthorization.authorize]的原因\n */\npublic sealed class AuthReason {\n    public abstract val bot: Bot\n    public abstract val message: String?\n\n    /**\n     * Bot 全新[登录][Bot.login]\n     *\n     * 全新登录指登录前本地没有任何当前 Bot 的登录缓存信息而进行的登录。\n     *\n     * 全新登录时将会进入[认证流程][BotAuthorization.authorize]。\n     *\n     * @see Bot.login\n     * @see FastLoginError\n     */\n    public class FreshLogin @MiraiInternalApi constructor(\n        override val bot: Bot,\n        override val message: String?\n    ) : AuthReason()\n\n    /**\n     * Bot 被挤下线\n     *\n     * 当 Bot 账号在其他客户端使用相同（或相似）协议登录时，Bot 会下线，\n     * 被挤下线后当前的登录会话将失效。\n     *\n     * 当 [BotConfiguration.autoReconnectOnForceOffline] 为 `true` 时，\n     * Bot 会尝试重新登录，并会以此原因进入[认证流程][BotAuthorization.authorize]。\n     *\n     * @see BotConfiguration.autoReconnectOnForceOffline\n     * @see BotOfflineEvent.Force\n     */\n    public class ForceOffline @MiraiInternalApi constructor(\n        override val bot: Bot,\n        override val message: String?\n    ) : AuthReason()\n\n    /**\n     * Bot 被服务器断开\n     *\n     * 因其他原因导致 Bot 被服务器断开。这些原因包括账号被封禁、被其他客户端手动下线等，\n     * 被服务器断开下线后当前的登录会话将失效。\n     *\n     * Bot 会尝试重新登录，并会以此原因进入[认证流程][BotAuthorization.authorize]。\n     *\n     * @see BotOfflineEvent.MsfOffline\n     */\n    public class MsfOffline @MiraiInternalApi constructor(\n        override val bot: Bot,\n        override val message: String?\n    ) : AuthReason()\n\n    /**\n     * 由网络原因引起的掉线\n     *\n     * 一般情况下，Bot 被服务器断开后会尝试重新登录。\n     *\n     * 由网络问题引起的掉线不一定会使当前的登录会话失效，\n     * 仅登录会话失效时 Bot 会以此原因进入[认证流程][BotAuthorization.authorize]。\n     */\n    public class NetworkError @MiraiInternalApi constructor(\n        override val bot: Bot,\n        override val message: String?\n    ) : AuthReason()\n\n    /**\n     * 快速登录失败\n     *\n     * Bot 账号首次 [登录][Bot.login] 成功后，会保存登录缓存信息用于下次登录。\n     *\n     * 下次登录时，Bot 会首先使用登录缓存信息尝试快速登录，\n     * 若快速登录失败，则会以此原因进入[认证流程][BotAuthorization.authorize]。\n     *\n     * @see BotAuthorization.authorize\n     * @see Bot.login\n     */\n    public class FastLoginError @MiraiInternalApi constructor(\n        override val bot: Bot,\n        override val message: String?\n    ) : AuthReason()\n\n    public class Unknown @MiraiInternalApi constructor(\n        override val bot: Bot,\n        public val cause: Throwable?\n    ) : AuthReason() {\n        override val message: String? = cause?.message\n    }\n}\n\n@NotStableForInheritance\npublic interface BotAuthSession {\n    /**\n     * @throws LoginFailedException\n     */\n    public suspend fun authByPassword(password: String): BotAuthResult\n\n    /**\n     * @throws LoginFailedException\n     */\n    public suspend fun authByPassword(passwordMd5: ByteArray): BotAuthResult\n\n    /**\n     * @throws LoginFailedException\n     */\n    public suspend fun authByQRCode(): BotAuthResult\n}\n\n\ninternal interface DefaultBotAuthorizationFactory {\n    fun byPassword(passwordMd5: ByteArray): BotAuthorization\n    fun byQRCode(): BotAuthorization\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/auth/QRCodeLoginListener.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.auth\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.network.LoginFailedException\n\n/**\n * 二维码扫描登录监听器\n *\n * @since 2.15\n */\npublic interface QRCodeLoginListener {\n\n    /**\n     * 使用二维码登录时获取的二维码图片大小字节数.\n     */\n    public val qrCodeSize: Int get() = 3\n\n    /**\n     * 使用二维码登录时获取的二维码边框宽度像素.\n     */\n    public val qrCodeMargin: Int get() = 4\n\n    /**\n     * 使用二维码登录时获取的二维码校正等级，必须为 1-3 之间.\n     */\n    public val qrCodeEcLevel: Int get() = 2\n\n    /**\n     * 每隔 [qrCodeStateUpdateInterval] 毫秒更新一次[二维码状态][State]\n     */\n    public val qrCodeStateUpdateInterval: Long get() = 5000\n\n    /**\n     * 从服务器获取二维码时调用，在下级显示二维码并扫描.\n     *\n     * @param data 二维码图像数据 (文件)\n     */\n    public fun onFetchQRCode(bot: Bot, data: ByteArray)\n\n    /**\n     * 当二维码状态变化时调用.\n     * @see State\n     */\n    public fun onStateChanged(bot: Bot, state: State)\n\n    /**\n     * 每隔一段时间会调用一次此函数\n     *\n     * 在此函数抛出 [LoginFailedException] 以中断登录\n     */\n    public fun onIntervalLoop() {\n    }\n\n    /**\n     * 当二维码登录扫描完毕时执行, 在此执行资源释放\n     */\n    public fun onCompleted() {\n    }\n\n    public enum class State {\n        /**\n         * 等待扫描中，请在此阶段请扫描二维码.\n         * @see QRCodeLoginListener.onFetchQRCode\n         */\n        WAITING_FOR_SCAN,\n\n        /**\n         * 二维码已扫描，等待扫描端确认登录.\n         */\n        WAITING_FOR_CONFIRM,\n\n        /**\n         * 扫描后取消了确认.\n         */\n        CANCELLED,\n\n        /**\n         * 二维码超时，必须重新获取二维码.\n         */\n        TIMEOUT,\n\n        /**\n         * 二维码已确认，将会继续登录.\n         */\n        CONFIRMED,\n\n        /**\n         * 默认状态，在登录前通常为此状态.\n         */\n        DEFAULT,\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/AnonymousMember.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"DeprecatedCallableAddReplaceWith\")\n\npackage net.mamoe.mirai.contact\n\nimport net.mamoe.mirai.message.action.MemberNudge\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.NotStableForInheritance\n\n/**\n * 代表匿名群成员.\n *\n * 可通过 [anonymousId] 获取其识别属性. [AnonymousMember.id] 的值由服务器提供因此不可靠.\n *\n * 匿名群成员不支持发送私聊消息, 戳一戳, 上传图片.\n *\n * @see NormalMember\n */\n@NotStableForInheritance\npublic interface AnonymousMember : Member {\n    /** 该匿名群成员 ID */\n    public val anonymousId: String\n\n    @Deprecated(level = DeprecationLevel.ERROR, message = \"无法发送信息至 AnonymousMember\") // diagnostic deprecation\n    public override suspend fun sendMessage(message: Message): Nothing =\n        throw UnsupportedOperationException(\"Cannot send message to AnonymousMember\")\n\n    @Deprecated(level = DeprecationLevel.ERROR, message = \"无法发送信息至 AnonymousMember\") // diagnostic deprecation\n    public override suspend fun sendMessage(message: String): Nothing =\n        throw UnsupportedOperationException(\"Cannot send message to AnonymousMember\")\n\n    override fun nudge(): MemberNudge = throw UnsupportedOperationException(\"Cannot nudge AnonymousMember\")\n    override suspend fun uploadImage(resource: ExternalResource): Image =\n        throw UnsupportedOperationException(\"Cannot upload image to AnonymousMember\")\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/AudioSupported.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai.contact\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.message.data.Audio\nimport net.mamoe.mirai.message.data.OfflineAudio\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport net.mamoe.mirai.utils.OverFileSizeMaxException\n\n/**\n * 支持发送语音的 [Contact]\n *\n * @since 2.7\n */\n@NotStableForInheritance\npublic interface AudioSupported : Contact {\n    /**\n     * 上传一个语音文件以备发送. [resource] 需要调用方[关闭][ExternalResource.close].\n     *\n     * 多次调用 [uploadAudio] 使用同一个 [resource] 时, 将会发生多次上传, 且有可能产生不同的 [OfflineAudio] 对象, 因为服务器不会提供有关文件是否已经存在于服务器的信息.\n     *\n     * 返回的 [OfflineAudio] 支持序列化, 可以保存后在将来使用, 而不需要立即[发送][Contact.sendMessage]. 但不建议保存太久, 无法确定服务器保留一个文件的时间.\n     *\n     * 建议使用同一个 [Contact] 进行 [uploadAudio] 和 [sendMessage]. 目标对象不同时的行为是不确定的.\n     *\n     * 要获取更多语音相关的信息, 参阅 [Audio].\n     *\n     * @param resource 支持 AMR 和 SILK 格式. 若要支持 MP3 格式, 请参考 [mirai-silk-converter](https://github.com/project-mirai/mirai-silk-converter)\n     *\n     * @throws OverFileSizeMaxException 当语音文件过大而被服务器拒绝上传时. (最大大小约为 1 MB)\n     * **注意**: 由于服务器不一定会检查大小, 该异常就不一定会因大小超过 1MB 而抛出.\n     *\n     * @since 2.7\n     */\n    public suspend fun uploadAudio(resource: ExternalResource): OfflineAudio\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/AvatarSpec.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.contact\n\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n/**\n * 头像的规格, [size] 单位为 px.\n * @since 2.11\n */\npublic enum class AvatarSpec(@MiraiInternalApi public val size: Int) : Comparable<AvatarSpec> {\n    /**\n     * 最高压缩等级\n     */\n    SMALLEST(40),\n\n    /**\n     * 群员列表中的显示大小, 实际上是 40 px, 但会比 [SMALLEST] 好一些\n     */\n    SMALL(41),\n\n    /**\n     * 联系人列表中的显示大小\n     */\n    MEDIUM(100),\n\n    /**\n     * 消息列表中的显示大小\n     */\n    LARGE(140),\n\n    /**\n     * 联系人详情页面中的显示大小\n     */\n    LARGEST(640),\n\n    /**\n     * 原图\n     */\n    ORIGINAL(0);\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/Contact.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"EXPERIMENTAL_API_USAGE\", \"EXPERIMENTAL_OVERRIDE\")\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai.contact\n\nimport kotlinx.coroutines.CoroutineScope\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.IMirai\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.recallMessage\nimport net.mamoe.mirai.utils.*\nimport net.mamoe.mirai.utils.ExternalResource.Companion.sendAsImageTo\nimport net.mamoe.mirai.utils.ExternalResource.Companion.uploadAsImage\nimport java.io.File\nimport java.io.InputStream\n\n/**\n * 联系对象, 即可以与 [Bot] 互动的对象. 包含 [用户][User], 和 [群][Group].\n */\n@NotStableForInheritance\npublic interface Contact : ContactOrBot, CoroutineScope {\n    /**\n     * 这个联系对象所属 [Bot].\n     */\n    public override val bot: Bot\n\n    /**\n     * 可以是 QQ 号码或者群号码.\n     *\n     * @see User.id\n     * @see Group.id\n     */\n    public override val id: Long\n\n    /**\n     * 向这个对象发送消息.\n     *\n     * 单条消息最大可发送 4500 字符或 50 张图片.\n     *\n     * @see MessagePreSendEvent 发送消息前事件\n     * @see MessagePostSendEvent 发送消息后事件\n     *\n     * @throws EventCancelledException 当发送消息事件被取消时抛出\n     * @throws BotIsBeingMutedException 发送群消息时若 [Bot] 被禁言抛出\n     * @throws MessageTooLargeException 当消息过长时抛出\n     * @throws IllegalArgumentException 当消息内容为空时抛出 (详见 [Message.isContentEmpty])\n     *\n     * @return 消息回执. 可 [引用][MessageReceipt.quote] 或 [撤回][MessageReceipt.recall] 这条消息.\n     */\n    public suspend fun sendMessage(message: Message): MessageReceipt<Contact>\n\n    /**\n     * 发送纯文本消息\n     * @see sendMessage\n     */\n    public suspend fun sendMessage(message: String): MessageReceipt<Contact> =\n        this.sendMessage(message.toPlainText())\n\n    /**\n     * 上传一个 [资源][ExternalResource] 作为图片以备发送.\n     *\n     * 也可以使用其他扩展: [ExternalResource.uploadAsImage] 使用 [File], [InputStream] 等上传.\n     *\n     * @see Image 查看有关图片的更多信息, 如上传图片\n     *\n     * @see BeforeImageUploadEvent 图片发送前事件, 可拦截.\n     * @see ImageUploadEvent 图片发送完成事件, 不可拦截.\n     *\n     * @see ExternalResource\n     *\n     * @throws EventCancelledException 当发送消息事件被取消时抛出\n     * @throws OverFileSizeMaxException 当图片文件过大而被服务器拒绝上传时抛出. (最大大小约为 20 MB, 但 mirai 限制的大小为 30 MB)\n     */\n    public suspend fun uploadImage(resource: ExternalResource): Image\n\n    /**\n     * 上传 [资源][ExternalResource] 作为短视频发送.\n     * 同时需要上传缩略图作为视频消息显示的封面.\n     *\n     * @see ShortVideo 查看有关短视频的更多信息\n     *\n     * @see BeforeShortVideoUploadEvent 短视频发送前事件，可通过中断来拦截视频上传.\n     * @see ShortVideoUploadEvent 短视频上传完成事件，不可拦截.\n     *\n     * @param thumbnail 短视频封面图，为图片资源.\n     * @param video 视频资源，目前仅支持上传 mp4 格式的视频.\n     * @param fileName 文件名，若为 `null` 则根据 [video] 自动生成.\n     *\n     * @since 2.16\n     */\n    public suspend fun uploadShortVideo(\n        thumbnail: ExternalResource,\n        video: ExternalResource,\n        fileName: String? = null\n    ): ShortVideo\n\n    @JvmBlockingBridge\n    public companion object {\n        /**\n         * 读取 [InputStream] 到临时文件并将其作为图片发送到指定联系人\n         *\n         * 注意：此函数不会关闭 [imageStream]\n         *\n         * @param formatName 查看 [ExternalResource.formatName]\n         * @throws OverFileSizeMaxException\n         * @see FileCacheStrategy\n         */\n        @JvmStatic\n        @JvmOverloads\n        public suspend fun <C : Contact> C.sendImage(\n            imageStream: InputStream,\n            formatName: String? = null\n        ): MessageReceipt<C> = imageStream.sendAsImageTo(this, formatName)\n\n        /**\n         * 将文件作为图片发送到指定联系人\n         * @param formatName 查看 [ExternalResource.formatName]\n         * @throws OverFileSizeMaxException\n         * @see FileCacheStrategy\n         */\n        @JvmStatic\n        @JvmOverloads\n        public suspend fun <C : Contact> C.sendImage(\n            file: File,\n            formatName: String? = null\n        ): MessageReceipt<C> = file.sendAsImageTo(this, formatName)\n\n        /**\n         * 将资源作为单独的图片消息发送给 [this]\n         *\n         * @see Contact.sendMessage 最终调用, 发送消息.\n         */\n        @JvmStatic\n        public suspend fun <C : Contact> C.sendImage(resource: ExternalResource): MessageReceipt<C> =\n            resource.sendAsImageTo(this)\n\n\n        /**\n         * 读取 [InputStream] 到临时文件并将其作为图片上传, 但不发送\n         *\n         * 注意：本函数不会关闭流\n         *\n         * @param formatName 查看 [ExternalResource.formatName]\n         * @throws OverFileSizeMaxException\n         */\n        @JvmStatic\n        @JvmOverloads\n        public suspend fun Contact.uploadImage(\n            imageStream: InputStream,\n            formatName: String? = null\n        ): Image = imageStream.uploadAsImage(this@uploadImage, formatName)\n\n        /**\n         * 将文件作为图片上传, 但不发送\n         * @param formatName 查看 [ExternalResource.formatName]\n         * @throws OverFileSizeMaxException\n         */\n        @JvmStatic\n        @JvmOverloads\n        public suspend fun Contact.uploadImage(\n            file: File,\n            formatName: String? = null\n        ): Image = file.uploadAsImage(this, formatName)\n\n        /**\n         * 将文件作为图片上传, 但不发送\n         * @throws OverFileSizeMaxException\n         */\n        @Throws(OverFileSizeMaxException::class)\n        @JvmStatic\n        @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"EXTENSION_SHADOWED_BY_MEMBER\")\n        @kotlin.internal.LowPriorityInOverloadResolution // for better Java API\n        public suspend fun Contact.uploadImage(resource: ExternalResource): Image = this.uploadImage(resource)\n    }\n}\n\n/**\n * @see IMirai.recallMessage\n */\n@JvmSynthetic\npublic suspend inline fun Contact.recallMessage(source: MessageChain): Unit = Mirai.recallMessage(bot, source)\n\n/**\n * @see IMirai.recallMessage\n */\n@JvmSynthetic\npublic suspend inline fun Contact.recallMessage(source: MessageSource): Unit = Mirai.recallMessage(bot, source)"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/ContactList.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"EXPERIMENTAL_API_USAGE\", \"unused\")\n\npackage net.mamoe.mirai.contact\n\nimport net.mamoe.mirai.utils.ConcurrentLinkedDeque\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport kotlin.jvm.JvmField\n\n\n/**\n * 只读联系人列表. 元素列表仍可能会被 mirai 内部修改.\n *\n * @see ContactList.asSequence\n */\n@Suppress(\"unused\")\npublic class ContactList<out C : Contact>\n@MiraiInternalApi public constructor(@JvmField @MiraiInternalApi public val delegate: MutableCollection<@UnsafeVariance C>) :\n    Collection<C> by delegate {\n\n    @MiraiInternalApi\n    public constructor() : this(ConcurrentLinkedDeque())\n\n    /**\n     * 获取一个 [Contact.id] 为 [id] 的元素. 在不存在时返回 `null`.\n     */\n    public operator fun get(id: Long): C? {\n        @OptIn(MiraiInternalApi::class)\n        return delegate.firstOrNull { it.id == id }\n    }\n\n    /**\n     * 获取一个 [Contact.id] 为 [id] 的元素. 在不存在时抛出 [NoSuchElementException].\n     */\n    public fun getOrFail(id: Long): C = get(id) ?: throw NoSuchElementException(\"Contact $id not found.\")\n\n    /**\n     * 删除 [Contact.id] 为 [id] 的元素.\n     */\n    public fun remove(id: Long): Boolean {\n        @OptIn(MiraiInternalApi::class)\n        return delegate.removeAll { it.id == id }\n    }\n\n    /**\n     * 当存在 [Contact.id] 为 [id] 的元素时返回 `true`.\n     */\n    public operator fun contains(id: Long): Boolean = get(id) != null\n\n    override fun toString(): String {\n        @OptIn(MiraiInternalApi::class)\n        return delegate.joinToString(separator = \", \", prefix = \"ContactList(\", postfix = \")\")\n    }\n\n    override fun equals(other: Any?): Boolean {\n        @OptIn(MiraiInternalApi::class)\n        return other is ContactList<*> && delegate == other.delegate\n    }\n\n    override fun hashCode(): Int {\n        @OptIn(MiraiInternalApi::class)\n        return delegate.hashCode()\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/ContactOrBot.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.contact\n\nimport kotlinx.coroutines.CoroutineScope\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport kotlin.jvm.JvmName\n\n/**\n * 拥有 [id] 的对象.\n * 此为 [Contact] 与 [Bot] 的唯一公共接口.\n *\n * @see UserOrBot\n *\n * @see Contact\n * @see Bot\n */\n@NotStableForInheritance\npublic interface ContactOrBot : CoroutineScope {\n    /**\n     * QQ 号或群号.\n     */\n    public val id: Long\n\n    /**\n     * 相关 [Bot]\n     */\n    public val bot: Bot\n\n    /**\n     * 头像下载链接, 规格默认为 [AvatarSpec.LARGEST]\n     * @see avatarUrl\n     */\n    public val avatarUrl: String\n        get() = avatarUrl(spec = AvatarSpec.LARGEST)\n\n    /**\n     * 头像下载链接.\n     * @param spec 头像的规格.\n     * @since 2.11\n     */\n    @Suppress(\"INAPPLICABLE_JVM_NAME\")\n    @JvmName(\"getAvatarUrl\")\n    public fun avatarUrl(spec: AvatarSpec): String {\n        @OptIn(MiraiInternalApi::class)\n        return \"http://q.qlogo.cn/g?b=qq&nk=${id}&s=${spec.size}\"\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/Exceptions.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.contact\n\nimport net.mamoe.mirai.message.data.AtAll\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.data.messageChainOf\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.millisToHumanReadableString\n\n/**\n * 发送消息时消息过长抛出的异常.\n *\n * @see Contact.sendMessage\n */\n@OptIn(MiraiInternalApi::class)\npublic class MessageTooLargeException(\n    public override val target: Contact,\n    /**\n     * 原发送消息\n     */\n    originalMessage: Message,\n    /**\n     * 经过事件拦截处理后的消息\n     */\n    public val messageAfterEvent: Message,\n    exceptionMessage: String\n) : SendMessageFailedException(target, Reason.MESSAGE_TOO_LARGE, originalMessage) {\n    override val message: String = exceptionMessage\n}\n\n/**\n * 发送消息时 bot 正处于被禁言状态时抛出的异常.\n *\n * @see Group.sendMessage\n */\n@OptIn(MiraiInternalApi::class)\npublic class BotIsBeingMutedException @MiraiInternalApi constructor(\n    // this constructor is since 2.9.0-RC\n    public override val target: Group,\n    originalMessage: Message,\n) : SendMessageFailedException(target, Reason.BOT_MUTED, originalMessage) {\n    @DeprecatedSinceMirai(warningSince = \"2.9\", errorSince = \"2.11\", hiddenSince = \"2.12\")\n    @Deprecated(\n        \"Deprecated without replacement. Please consider copy this exception to your code.\",\n        level = DeprecationLevel.HIDDEN\n    )\n    // this constructor is since 2.0\n    public constructor(\n        target: Group,\n    ) : this(target, messageChainOf())\n\n    override val message: String = \"bot is being muted, remaining ${\n        target.botMuteRemaining.times(1000).millisToHumanReadableString()\n    } seconds\"\n}\n\npublic inline val BotIsBeingMutedException.botMuteRemaining: Int get() = target.botMuteRemaining\n\n/**\n * 发送消息失败时抛出的异常\n *\n * @since 2.9.0\n */\npublic open class SendMessageFailedException @MiraiInternalApi constructor(\n    public open val target: Contact,\n    public val reason: Reason,\n    public val originalMessage: Message,\n    /**\n     * @since 2.14\n     */\n    tips: String? = null,\n) : RuntimeException(\n    \"Failed sending message to $target, reason=$reason. Tips: $tips\"\n) {\n    public enum class Reason {\n        /**\n         * 消息过长\n         */\n        MESSAGE_TOO_LARGE,\n\n        /**\n         * 机器人被禁言\n         */\n        BOT_MUTED,\n\n        /**\n         * 达到群每分钟发言次数限制\n         */\n        GROUP_CHAT_LIMITED,\n\n        /**\n         * 达到每日发送 [AtAll] 的次数限制\n         * @since 2.11\n         */\n        AT_ALL_LIMITED,\n\n        /**\n         * 被服务器限制发送消息, 可能是由冻结引起.\n         * @since 2.14\n         */\n        LIMITED_MESSAGING,\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/FileSupported.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.contact\n\nimport net.mamoe.mirai.contact.file.RemoteFiles\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport net.mamoe.mirai.utils.NotStableForInheritance\n\n/**\n * 支持文件操作的 [Contact]. 目前仅 [Group].\n *\n * 获取文件操作相关示例: [RemoteFiles]\n *\n * @since 2.5\n *\n * @see RemoteFiles\n */\n@NotStableForInheritance\npublic interface FileSupported : Contact {\n    /**\n     * 文件根目录. 可通过 [net.mamoe.mirai.utils.RemoteFile.listFiles] 获取目录下文件列表.\n     *\n     * **注意:** 已弃用, 请使用 [files].\n     *\n     * @since 2.5\n     */\n    @Suppress(\"DEPRECATION_ERROR\")\n    @Deprecated(\n        \"Please use files instead.\",\n        replaceWith = ReplaceWith(\"files.root\"),\n        level = DeprecationLevel.ERROR\n    ) // deprecated since 2.8.0-RC\n    @DeprecatedSinceMirai(warningSince = \"2.8\", errorSince = \"2.14\")\n    public val filesRoot: net.mamoe.mirai.utils.RemoteFile\n\n    /**\n     * 获取远程文件列表 (管理器).\n     *\n     * @since 2.8\n     */\n    public val files: RemoteFiles\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/Friend.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"EXPERIMENTAL_API_USAGE\", \"unused\", \"UnusedImport\")\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai.contact\n\nimport kotlinx.coroutines.CoroutineScope\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.friendgroup.FriendGroup\nimport net.mamoe.mirai.contact.roaming.RoamingSupported\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.action.FriendNudge\nimport net.mamoe.mirai.message.action.Nudge\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.data.isContentEmpty\nimport net.mamoe.mirai.message.data.toPlainText\nimport net.mamoe.mirai.utils.NotStableForInheritance\n\n/**\n * 代表一位好友.\n *\n * 一个 [Friend] 实例并不是独立的, 它属于一个 [Bot].\n * 对于同一个 [Bot], 任何一个人的 [Friend] 实例都是单一的.\n * [Friend] 无法通过任何方式直接构造. 任何时候都应从 [Bot.getFriend] 或事件中获取.\n *\n * @see FriendMessageEvent\n */\n@Suppress(\"RedundantSetter\")\n@NotStableForInheritance\npublic interface Friend : User, CoroutineScope, AudioSupported, RoamingSupported {\n\n    /**\n     * 该好友所在的好友分组\n     *\n     * @since 2.13\n     */\n    public val friendGroup: FriendGroup\n\n\n    /**\n     * 备注信息\n     *\n     * 更改备注后会广播 [FriendRemarkChangeEvent]\n     *\n     * @see User.remarkOrNick\n     * @see FriendRemarkChangeEvent\n     */\n    override var remark: String\n        /**\n         * @since 2.13\n         */\n        set\n\n    /**\n     * 向这个对象发送消息.\n     *\n     * 单条消息最大可发送 4500 字符或 50 张图片.\n     *\n     * @see FriendMessagePreSendEvent 发送消息前事件\n     * @see FriendMessagePostSendEvent 发送消息后事件\n     *\n     * @throws EventCancelledException 当发送消息事件被取消时抛出\n     * @throws BotIsBeingMutedException 发送群消息时若 [Bot] 被禁言抛出\n     * @throws MessageTooLargeException 当消息过长时抛出\n     * @throws IllegalArgumentException 当消息内容为空时抛出 (详见 [Message.isContentEmpty])\n     *\n     * @return 消息回执. 可 [引用][MessageReceipt.quote] 或 [撤回][MessageReceipt.recall] 这条消息.\n     */\n    public override suspend fun sendMessage(message: Message): MessageReceipt<Friend>\n\n    /**\n     * 删除并屏蔽该好友, 屏蔽后对方将无法发送临时会话消息\n     *\n     * @see FriendDeleteEvent 好友删除事件\n     */\n    public suspend fun delete()\n\n    /**\n     * 发送纯文本消息\n     * @see sendMessage\n     */\n    public override suspend fun sendMessage(message: String): MessageReceipt<Friend> =\n        this.sendMessage(message.toPlainText())\n\n    /**\n     * 创建一个 \"戳一戳\" 消息\n     *\n     * @see Nudge.sendTo 发送这个戳一戳消息\n     */\n    public override fun nudge(): FriendNudge = FriendNudge(this)\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/Group.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"EXPERIMENTAL_API_USAGE\", \"unused\", \"UnusedImport\")\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai.contact\n\nimport kotlinx.coroutines.CoroutineScope\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.active.GroupActive\nimport net.mamoe.mirai.contact.announcement.Announcements\nimport net.mamoe.mirai.contact.essence.Essences\nimport net.mamoe.mirai.contact.file.RemoteFiles\nimport net.mamoe.mirai.contact.roaming.RoamingSupported\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.*\nimport kotlin.jvm.JvmStatic\nimport kotlin.jvm.JvmSynthetic\n\n/**\n * 群.\n *\n * ## 群员操作\n *\n * ### 获取群成员\n *\n * 使用 [Group.members] 可获取除 [Bot] 自身外的所有群成员 (包括管理员和群主) 列表. [Bot] 自身在群内的对象可通过 [botAsMember] 获取.\n *\n * [get] 可以按 QQ 号码获取一个群成员对象, 在不存在时返回 `null`. [getOrFail] 则在不存在时抛出 [NoSuchElementException].\n *\n * ### 判断管理员权限\n *\n * 首先获取到目标群成员对象, 然后使用 [NormalMember.permission] 获取其权限.\n *\n * [Bot] 在群内的权限可通过 [Group.botPermission] 或其 [Member 对象][botAsMember] 的 [NormalMember.permission] 获取.\n *\n * ### 其他动作\n *\n * - 设置管理员权限: [NormalMember.modifyAdmin]\n * - 禁言: [NormalMember.mute]\n * - 戳一戳: [NormalMember.nudge]\n *\n * ## 群公告\n *\n * 可通过 [Group.announcements] 获取公告支持. 可在 [Announcements] 查看详细文档.\n *\n * ## 群文件\n *\n * 使用 [Group.files] 获取群文件管理器后操作. 详见 [RemoteFiles].\n */\n@NotStableForInheritance\npublic interface Group : Contact, CoroutineScope, FileSupported, AudioSupported, RoamingSupported {\n    /**\n     * 群名称.\n     *\n     * 在修改时将会异步上传至服务器, 也会广播事件 [GroupNameChangeEvent].\n     * 频繁修改可能会被服务器拒绝.\n     *\n     * @see GroupNameChangeEvent 群名片修改事件\n     * @throws PermissionDeniedException 无权限修改时将会抛出异常\n     */\n    public var name: String\n\n    /**\n     * 群设置\n     */\n    public val settings: GroupSettings\n\n    /**\n     * 同为 groupCode, 用户看到的群号码.\n     */\n    public override val id: Long\n\n    /**\n     * 群主.\n     *\n     * @return 若机器人是群主, 返回 [botAsMember]. 否则返回相应的成员\n     */\n    public val owner: NormalMember\n\n    /**\n     * [Bot] 在群内的 [Member] 实例\n     */\n    public val botAsMember: NormalMember\n\n    /**\n     * 机器人被禁言还剩余多少秒\n     *\n     * @see BotMuteEvent 机器人被禁言事件\n     * @see isBotMuted 判断机器人是否正在被禁言\n     */\n    public val botMuteRemaining: Int get() = botAsMember.muteTimeRemaining\n\n    /**\n     * 机器人在这个群里的权限\n     *\n     * @see Group.checkBotPermission 检查 [Bot] 在这个群里的权限\n     *\n     * @see BotGroupPermissionChangeEvent 机器人群员修改\n     */\n    public val botPermission: MemberPermission get() = botAsMember.permission\n\n    /**\n     * 群头像下载链接, 规格默认为 [AvatarSpec.LARGEST]\n     * @see avatarUrl\n     */\n    public override val avatarUrl: String\n        get() = avatarUrl(spec = AvatarSpec.LARGEST)\n\n    /**\n     * 群头像下载链接.\n     * @param spec 头像的规格.\n     * @since 2.11\n     */\n    public override fun avatarUrl(spec: AvatarSpec): String {\n        @OptIn(MiraiInternalApi::class)\n        return \"http://p.qlogo.cn/gh/${id}/${id}/${spec.size}\"\n    }\n\n    /**\n     * 群成员列表, 不含机器人自己, 含群主.\n     *\n     * 在 [Group] 实例创建的时候查询一次. 并与事件同步事件更新.\n     */\n    public val members: ContactList<NormalMember>\n\n    /**\n     * 获取群公告相关功能接口\n     * @since 2.7\n     */\n    public val announcements: Announcements\n\n\n    /**\n     * 获取群荣誉相关功能接口\n     * @since 2.13\n     */\n    public val active: GroupActive\n\n    /**\n     * 获取群成员实例. 不存在时返回 `null`.\n     *\n     * 当 [id] 为 [Bot.id] 时返回 [botAsMember].\n     */\n    public operator fun get(id: Long): NormalMember?\n\n    /**\n     * 获取群成员实例. 不存在时抛出 [kotlin.NoSuchElementException].\n     *\n     * 当 [id] 为 [Bot.id] 时返回 [botAsMember].\n     */\n    public fun getOrFail(id: Long): NormalMember =\n        get(id) ?: throw NoSuchElementException(\"member $id not found in group ${this.id}\")\n\n\n    /**\n     * 当本群存在 [Member.id] 为 [id] 的群员时返回 `true`.\n     *\n     * 当 [id] 为 [Bot.id] 时返回 `true`\n     */\n    public operator fun contains(id: Long): Boolean\n\n    /**\n     * 当 [member] 是本群成员时返回 `true`. 将同时成员 [所属群][Member.group]. 同一个用户在不同群内的 [Member] 对象不相等.\n     */\n    public operator fun contains(member: NormalMember): Boolean = member in members\n\n\n    /**\n     * 让机器人退出这个群.\n     * @throws IllegalStateException 当机器人为群主时\n     * @return 退出成功时 true; 已经退出时 false\n     */\n    public suspend fun quit(): Boolean\n\n    /**\n     * 向这个对象发送消息.\n     *\n     * 单条消息最大可发送 4500 字符或 50 张图片.\n     *\n     * @see GroupMessagePreSendEvent 发送消息前事件\n     * @see GroupMessagePostSendEvent 发送消息后事件\n     *\n     * @throws EventCancelledException 当发送消息事件被取消时抛出\n     * @throws BotIsBeingMutedException 发送群消息时若 [Bot] 被禁言抛出\n     * @throws MessageTooLargeException 当消息过长时抛出\n     * @throws IllegalArgumentException 当消息内容为空时抛出 (详见 [Message.isContentEmpty])\n     *\n     * @return 消息回执. 可进行撤回 ([MessageReceipt.recall])\n     */\n    public override suspend fun sendMessage(message: Message): MessageReceipt<Group>\n\n    /**\n     * 发送纯文本消息\n     * @see sendMessage\n     */\n    public override suspend fun sendMessage(message: String): MessageReceipt<Group> =\n        this.sendMessage(message.toPlainText())\n\n\n    /**\n     * 上传一个语音消息以备发送. 该方法已弃用且将在未来版本删除, 请使用 [uploadAudio].\n     */\n    @Suppress(\"DEPRECATION_ERROR\")\n    @Deprecated(\n        \"use uploadAudio\",\n        replaceWith = ReplaceWith(\"uploadAudio(resource)\"),\n        level = DeprecationLevel.HIDDEN\n    ) // deprecated since 2.7\n    @DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.10\", hiddenSince = \"2.11\")\n    public suspend fun uploadVoice(resource: ExternalResource): net.mamoe.mirai.message.data.Voice\n\n    /**\n     * 将一条消息设置为群精华消息, 需要管理员或群主权限.\n     * 操作成功返回 `true`.\n     *\n     * @throws PermissionDeniedException 没有权限时抛出\n     *\n     * @since 2.2\n     */\n    public suspend fun setEssenceMessage(source: MessageSource): Boolean\n\n    /**\n     * 群精华消息相关功能接口\n     *\n     * @since 2.15\n     */\n    public val essences: Essences\n\n    public companion object {\n        /**\n         * 将一条消息设置为群精华消息, 需要管理员或群主权限.\n         * 操作成功返回 `true`.\n         *\n         * @throws PermissionDeniedException 没有权限时抛出\n         *\n         * @see Group.setEssenceMessage\n         * @since 2.2\n         */\n        @JvmBlockingBridge\n        @JvmStatic\n        public suspend fun Group.setEssenceMessage(chain: MessageChain): Boolean = setEssenceMessage(chain.source)\n    }\n}\n\n/**\n * 群设置\n *\n * @see Group.settings 获取群设置\n */\npublic interface GroupSettings {\n    /**\n     * 入群公告, 没有时为空字符串.\n     *\n     * 在修改时将会异步上传至服务器.\n     *\n     * @see GroupEntranceAnnouncementChangeEvent\n     * @throws PermissionDeniedException 无权限修改时将会抛出异常\n     * @see Announcements\n     * @see Group.announcements\n     */\n    @Deprecated(\n        level = DeprecationLevel.HIDDEN,\n        message = \"group.announcements.asFlow().filter { it.parameters.sendToNewMember }.firstOrNull()\",\n    ) // deprecated since 2.7\n    @DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.10\", hiddenSince = \"2.11\")\n    public var entranceAnnouncement: String\n\n    /**\n     * 全体禁言状态. `true` 为开启.\n     *\n     * 当前仅能修改状态.\n     *\n     * @see GroupMuteAllEvent\n     * @throws PermissionDeniedException 无权限修改时将会抛出异常\n     */\n    public var isMuteAll: Boolean\n\n    /**\n     * 允许群员邀请好友入群的状态. `true` 为允许\n     *\n     * 在修改时将会异步上传至服务器.\n     *\n     * @see GroupAllowMemberInviteEvent\n     * @throws PermissionDeniedException 无权限修改时将会抛出异常\n     */\n    public var isAllowMemberInvite: Boolean\n\n    /**\n     * 自动加群审批\n     */\n    @MiraiExperimentalApi\n    public val isAutoApproveEnabled: Boolean\n\n    /**\n     * 匿名聊天\n     */\n    public var isAnonymousChatEnabled: Boolean\n}\n\n/**\n * 同 [get]. 在一些不适合使用 [get] 的情境下使用 [getMember].\n */\n@JvmSynthetic\npublic fun Group.getMember(id: Long): NormalMember? = get(id)\n\n/**\n * 同 [getMemberOrFail]. 在一些不适合使用 [getOrFail] 的情境下使用 [getMemberOrFail].\n */\n@JvmSynthetic\npublic fun Group.getMemberOrFail(id: Long): NormalMember = getOrFail(id)\n\n\n/**\n * 返回机器人是否正在被禁言\n *\n * @see Group.botMuteRemaining 剩余禁言时间\n */\npublic val Group.isBotMuted: Boolean get() = this.botMuteRemaining != 0\n\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/Member.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"UnusedImport\")\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai.contact\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.active.MemberActive\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.action.MemberNudge\nimport net.mamoe.mirai.message.action.Nudge\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.data.isContentEmpty\nimport net.mamoe.mirai.utils.NotStableForInheritance\n\n/**\n * 代表一位群成员.\n *\n * 群成员分为 [普通成员][NormalMember] 和 [匿名成员][AnonymousMember]\n *\n * 一个群成员可能也是机器人的好友, 但他们在对象类型上不同 ([Member] != [Friend]). 可以通过 [Member.asFriend] 得到相关好友对象.\n *\n * ## 相关的操作\n * - [Member.isFriend] 判断此成员是否为好友\n * - [Member.isStranger] 判断此成员是否为好友\n * - [Member.asFriend] 转换为 [Friend]\n * - [Member.asStranger] 转换为 [Stranger]\n */\n@NotStableForInheritance\npublic interface Member : User {\n    /**\n     * 所在的群.\n     */\n    public val group: Group\n\n    /**\n     * 成员的权限, 将会随服务器通知动态更新.\n     *\n     * [Member] 可能是 [普通成员][NormalMember] 或 [匿名成员][AnonymousMember], 要修改群成员权限, 请检查类型为 [NormalMember] 然后使用 [NormalMember.modifyAdmin]\n     *\n     * @see MemberPermissionChangeEvent 权限变更事件. 由群主或机器人的操作触发.\n     */\n    public val permission: MemberPermission\n\n    /**\n     * 群名片. 可能为空.\n     */\n    public val nameCard: String\n\n    /**\n     * 群特殊头衔.\n     *\n     * 为 [AnonymousMember] 时一定是 `\"匿名\"`\n     *\n     * @see [NormalMember.specialTitle]\n     */\n    public val specialTitle: String\n\n    /**\n     * 群等级头衔 (PC 端显示)\n     * @see active\n     * @since 2.13\n     */\n    public val rankTitle: String get() = group.active.rankTitles[active.rank].orEmpty()\n\n    /**\n     * 群活跃头衔 (手机端显示)\n     * @see active\n     * @since 2.13\n     */\n    public val temperatureTitle: String\n        get() {\n            val level = when (active.temperature) {\n                in 1..10 -> 1\n                in 11..20 -> 2\n                in 21..40 -> 3\n                in 41..60 -> 4\n                in 61..80 -> 5\n                in 81..100 -> 6\n                else -> 0\n            }\n            return group.active.temperatureTitles[level].orEmpty()\n        }\n\n    /**\n     * 群活跃度相关属性.\n     * @see [rankTitle]\n     * @see [temperatureTitle]\n     * @since 2.13\n     */\n    public val active: MemberActive\n\n    /**\n     * 禁言这个群成员 [durationSeconds] 秒, 在机器人无权限操作时抛出 [PermissionDeniedException].\n     *\n     * QQ 中最小操作和显示的时间都是一分钟. 机器人可以实现精确到秒, 会被客户端显示为 1 分钟但不影响实际禁言时间.\n     *\n     * 管理员可禁言成员, 群主可禁言管理员和群员.\n     *\n     * @param durationSeconds 持续时间. 精确到秒. 最短 0 秒, 最长 30 天. 超过范围则会抛出异常 [IllegalStateException].\n     *\n     * @see NormalMember.isMuted 判断此成员是否正处于禁言状态中\n     * @see NormalMember.unmute 取消禁言此成员\n     *\n     * @see MemberMuteEvent 成员被禁言事件\n     * @see BotMuteEvent Bot 被禁言事件\n     *\n     * @see Member.mute 支持 Kotlin [kotlin.time.Duration] 的扩展\n     */\n    public suspend fun mute(durationSeconds: Int)\n\n    /**\n     * 向群成员发送消息.\n     * 若群成员同时是好友, 则会发送好友消息. 否则发送临时会话消息.\n     *\n     * 单条消息最大可发送 4500 字符或 50 张图片.\n     *\n     * 注意: 只可以向 [NormalMember] 发送消息. 向 [AnonymousMember] 发送时将会得到异常 [UnsupportedOperationException].\n     *\n     * @see FriendMessagePreSendEvent 当此成员是好友时发送消息前事件\n     * @see FriendMessagePostSendEvent 当此成员是好友时发送消息后事件\n     *\n     * @see GroupTempMessagePreSendEvent 当此成员不是好友时发送消息前事件\n     * @see GroupTempMessagePostSendEvent 当此成员不是好友时发送消息后事件\n     *\n     * @throws EventCancelledException 当发送消息事件被取消时抛出\n     * @throws BotIsBeingMutedException 发送群消息时若 [Bot] 被禁言抛出\n     * @throws MessageTooLargeException 当消息过长时抛出\n     * @throws IllegalArgumentException 当消息内容为空时抛出 (详见 [Message.isContentEmpty])\n     * @throws UnsupportedOperationException 当向 [AnonymousMember] 发送消息时抛出\n     *\n     * @return 消息回执. 可 [引用][MessageReceipt.quote] 或 [撤回][MessageReceipt.recall] 这条消息.\n     */\n    public override suspend fun sendMessage(message: Message): MessageReceipt<Member>\n\n    /**\n     * 发送纯文本消息\n     *\n     * @see sendMessage\n     */\n    public override suspend fun sendMessage(message: String): MessageReceipt<Member>\n\n    /**\n     * 创建一个 \"戳一戳\" 消息\n     *\n     * 注意: 只可以戳 [NormalMember]. 向 [AnonymousMember] 操作时将会得到异常.\n     *\n     * @see Nudge.sendTo 发送这个戳一戳消息\n     */\n    public override fun nudge(): MemberNudge\n}\n\n/**\n * 得到此成员作为好友的对象.\n *\n * @throws IllegalStateException 当此成员不是好友时抛出\n */\npublic fun Member.asFriend(): Friend = this.bot.getFriend(this.id) ?: error(\"$this is not a friend\")\n\n/**\n * 得到此成员作为好友的对象, 当此成员不是好友时返回 `null`\n */\npublic fun Member.asFriendOrNull(): Friend? = this.bot.getFriend(this.id)\n\n/**\n * 得到此成员作为陌生人的对象.\n *\n * @throws IllegalStateException 当此成员不是陌生人时抛出\n */\npublic fun Member.asStranger(): Stranger = this.bot.getStranger(this.id) ?: error(\"$this is not a stranger\")\n\n/**\n * 得到此成员作为陌生人的对象, 当此成员不是陌生人时返回 `null`\n */\npublic fun Member.asStrangerOrNull(): Stranger? = this.bot.getStranger(this.id)\n\n\n/**\n * 当此成员同时是 Bot 的好友时返回 `true`\n */\npublic inline val Member.isFriend: Boolean\n    get() = this.bot.friends.contains(this.id)\n\n/**\n * 当此成员同时是 Bot 的陌生人时返回 `true`\n */\npublic inline val Member.isStranger: Boolean\n    get() = this.bot.strangers.contains(this.id)\n\n/**\n * 获取非空群名片或昵称.\n *\n * 若 [群名片][Member.nameCard] 不为空则返回群名片, 为空则返回 [User.nick]\n */\npublic val Member.nameCardOrNick: String get() = this.nameCard.takeIf { it.isNotEmpty() } ?: this.nick"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/MemberPermission.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\", \"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n\npackage net.mamoe.mirai.contact\n\nimport net.mamoe.mirai.Bot\nimport kotlin.internal.InlineOnly\n\n/**\n * 群成员的权限.\n *\n * 可通过 [compareTo] 判断是否有更高的权限.\n *\n * 若要获得成员的权限, 使用 [Member.permission]. 若要获得 [Bot] 在某个群的权限, 使用 [Group.botPermission], 或 [Group.botAsMember] 再获取其 [Member.permission].\n *\n * @see isOwner 判断权限是否为群主\n * @see isOperator 判断权限是否为管理员或群主\n *\n * @see Member.isOwner 对 [Member] 的扩展函数, 判断此成员是否为群主\n * @see Member.isOperator 对 [Member] 的扩展函数, 判断此成员是否为管理员或群主\n * @see Member.isAdministrator 对 [Member] 的扩展函数, 判断此成员是否为管理员\n */\npublic enum class MemberPermission : Comparable<MemberPermission> {\n    /**\n     * 一般群成员\n     */\n    MEMBER, // ordinal = 0\n\n    /**\n     * 管理员\n     */\n    ADMINISTRATOR, // ordinal = 1\n\n    /**\n     * 群主\n     */\n    OWNER; // ordinal = 2\n\n    /**\n     * 权限等级. [OWNER] 为 2, [ADMINISTRATOR] 为 1, [MEMBER] 为 0\n     */\n    public val level: Int\n        get() = ordinal\n}\n\n/**\n * 判断权限是否为群主\n */\n@InlineOnly\npublic inline fun MemberPermission.isOwner(): Boolean = this == MemberPermission.OWNER\n\n/**\n * 判断权限是否为管理员\n */\n@InlineOnly\npublic inline fun MemberPermission.isAdministrator(): Boolean = this == MemberPermission.ADMINISTRATOR\n\n/**\n * 判断权限是否为管理员或群主\n */\n@InlineOnly\npublic inline fun MemberPermission.isOperator(): Boolean = isAdministrator() || isOwner()\n\n\n/**\n * 判断权限是否为群主\n */\npublic inline fun Member.isOwner(): Boolean = this.permission.isOwner()\n\n/**\n * 判断权限是否为管理员\n */\npublic inline fun Member.isAdministrator(): Boolean = this.permission.isAdministrator()\n\n/**\n * 判断权限是否为管理员或群主\n */\npublic inline fun Member.isOperator(): Boolean = this.permission.isOperator()\n\n\n/**\n * 权限不足\n */\n@Suppress(\"unused\")\npublic class PermissionDeniedException : IllegalStateException {\n    public constructor() : super(\"Permission denied\")\n    public constructor(message: String?) : super(message)\n}\n\n/**\n * 要求 [Bot] 在这个群里的权限至少为 [required], 否则抛出异常 [PermissionDeniedException]\n *\n * @throws PermissionDeniedException\n */\npublic inline fun Group.checkBotPermission(\n    required: MemberPermission,\n    crossinline lazyMessage: () -> String = {\n        \"Permission denied: required $required, got actual $botPermission for $bot in group $id\"\n    }\n) {\n    if (botPermission < required) {\n        throw PermissionDeniedException(lazyMessage())\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/NormalMember.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai.contact\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.action.MemberNudge\nimport net.mamoe.mirai.message.action.Nudge\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.data.isContentEmpty\nimport net.mamoe.mirai.message.data.toPlainText\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport kotlin.jvm.JvmName\nimport kotlin.time.Duration\nimport kotlin.time.DurationUnit\nimport kotlin.time.ExperimentalTime\n\n/**\n * 代表一位普通的群成员.\n *\n * 要查询更多用户信息, 使用 [NormalMember.queryProfile].\n *\n * @see AnonymousMember\n */\n@NotStableForInheritance\npublic interface NormalMember : Member {\n    /**\n     * 群名片. 可能为空.\n     *\n     * 管理员和群主都可修改任何人（包括群主）的群名片.\n     *\n     * 在修改时将会异步上传至服务器.\n     *\n     * @see [nameCardOrNick] 获取非空群名片或昵称\n     *\n     * @see MemberCardChangeEvent 群名片被管理员, 自己或 [Bot] 改动事件. 修改时也会触发此事件.\n     * @throws PermissionDeniedException 无权限修改时\n     */\n    public override var nameCard: String\n\n    /**\n     * 群特殊头衔.\n     *\n     * 仅群主可以修改群特殊头衔.\n     *\n     * 在修改时将会异步上传至服务器.\n     *\n     * @see MemberSpecialTitleChangeEvent  成员群特殊头衔改动事件.\n     * @throws PermissionDeniedException 无权限修改时\n     * @suppress 请勿试图修改其为空字符串来产生空头衔效果，这将使成员实际佩戴头衔退回为[活跃度相关头衔][Member.active]或管理员头衔.\n     */\n    public override var specialTitle: String\n\n    /**\n     * 被禁言剩余时长. 单位为秒.\n     *\n     * @see isMuted 判断改成员是否处于禁言状态\n     * @see mute 设置禁言\n     * @see unmute 取消禁言\n     */\n    public val muteTimeRemaining: Int\n\n    /**\n     * 当该群员处于禁言状态时返回 `true`.\n     * @since 2.6\n     */\n    public val isMuted: Boolean get() = muteTimeRemaining != 0\n\n    /**\n     * 入群时间. 单位为秒.\n     *\n     * @since 2.1\n     */\n    public val joinTimestamp: Int\n\n    /**\n     * 最后发言时间. 单位为秒.\n     *\n     * @since 2.1\n     */\n    public val lastSpeakTimestamp: Int\n\n    /**\n     * 解除禁言.\n     *\n     * 管理员可解除成员的禁言, 群主可解除管理员和群员的禁言.\n     *\n     * @see NormalMember.isMuted 判断此成员是否正处于禁言状态中\n     *\n     * @see MemberUnmuteEvent 成员被取消禁言事件\n     *\n     * @throws PermissionDeniedException 无权限修改时抛出\n     */\n    public suspend fun unmute()\n\n    /**\n     * 踢出该成员.\n     *\n     * 管理员可踢出成员, 群主可踢出管理员和群员.\n     *\n     * @param block 为 `true` 时拉黑成员\n     *\n     * @see MemberLeaveEvent.Kick 成员被踢出事件.\n     * @throws PermissionDeniedException 无权限修改时\n     *\n     */\n    public suspend fun kick(message: String, block: Boolean)\n\n    /**\n     * 踢出该成员, 默认不拉黑\n     *\n     * 管理员可踢出成员, 群主可踢出管理员和群员.\n     *\n     * @see MemberLeaveEvent.Kick 成员被踢出事件.\n     * @throws PermissionDeniedException 无权限修改时\n     *\n     */\n    public suspend fun kick(message: String): Unit = kick(message, false)\n\n\n    /**\n     * 给予或移除群成员的管理员权限。\n     *\n     * 此操作需要 Bot 为群主 [MemberPermission.OWNER]\n     *\n     * @param operation true 为给予\n     *\n     * @see MemberPermissionChangeEvent 群成员权限变更事件\n     * @throws PermissionDeniedException 无权限修改时抛出\n     *\n     * @since 2.7\n     */\n    public suspend fun modifyAdmin(operation: Boolean)\n\n    /**\n     * 向群成员发送消息.\n     * 若群成员同时是好友, 则会发送好友消息. 否则发送临时会话消息.\n     *\n     * 单条消息最大可发送 4500 字符或 50 张图片.\n     *\n     * @see FriendMessagePreSendEvent 当此成员是好友时发送消息前事件\n     * @see FriendMessagePostSendEvent 当此成员是好友时发送消息后事件\n     *\n     * @see GroupTempMessagePreSendEvent 当此成员不是好友时发送消息前事件\n     * @see GroupTempMessagePostSendEvent 当此成员不是好友时发送消息后事件\n     *\n     * @throws EventCancelledException 当发送消息事件被取消时抛出\n     * @throws BotIsBeingMutedException 发送群消息时若 [Bot] 被禁言抛出\n     * @throws MessageTooLargeException 当消息过长时抛出\n     * @throws IllegalArgumentException 当消息内容为空时抛出 (详见 [Message.isContentEmpty])\n     *\n     * @return 消息回执. 可进行撤回 ([MessageReceipt.recall])\n     */\n    public override suspend fun sendMessage(message: Message): MessageReceipt<NormalMember>\n\n    /**\n     * 发送纯文本消息\n     * @see sendMessage\n     */\n    public override suspend fun sendMessage(message: String): MessageReceipt<NormalMember> =\n        this.sendMessage(message.toPlainText())\n\n    /**\n     * 创建一个 \"戳一戳\" 消息\n     *\n     * @see Nudge.sendTo 发送这个戳一戳消息\n     */\n    public override fun nudge(): MemberNudge = MemberNudge(this)\n}\n\n\n/**\n * 获取非空群名片或昵称.\n * @return 当 [User] 为 [NormalMember] 时返回 [Member.nameCardOrNick], 否则返回 [Member.nick]\n */ // Java: NormalMemberKt.getNameCardOrNick(user)\npublic val User.nameCardOrNick: String\n    get() = when (this) {\n        is NormalMember -> this.nameCardOrNick\n        else -> this.nick\n    }\n\n/**\n * 获取非空群名片或昵称.\n * @return 当 [UserOrBot] 为 [NormalMember] 时返回 [Member.nameCardOrNick], 否则返回 [Member.nick]\n * @since 2.6\n */\npublic val UserOrBot.nameCardOrNick: String\n    get() = when (this) {\n        is NormalMember -> this.nameCardOrNick\n        else -> this.nick\n    }\n\n/**\n * @see Member.mute\n */\n@ExperimentalTime\npublic suspend inline fun NormalMember.mute(duration: Duration) {\n    require(duration.toDouble(DurationUnit.DAYS) <= 30) { \"duration must be at most 1 month\" }\n    require(duration.toDouble(DurationUnit.SECONDS) > 0) { \"duration must be greater than 0 second\" }\n    this.mute(duration.toDouble(DurationUnit.SECONDS).toInt())\n}\n\n@OptIn(ExperimentalTime::class)\n@Suppress(\"unused\")\n@JvmName(\"mute-fcu0wV4\")\n@Deprecated(\"For binary compatibility\", level = DeprecationLevel.HIDDEN)\npublic suspend inline fun NormalMember.mute00(duration: Duration) {\n    return mute(duration)\n}\n\n/**\n * 判断群成员是否处于禁言状态.\n * @suppress 在 2.6 移入了 [NormalMember] 成员函数. 保留二进制兼容.\n */\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"EXTENSION_SHADOWED_BY_MEMBER\")\n@kotlin.internal.LowPriorityInOverloadResolution\npublic val NormalMember.isMuted: Boolean\n    get() = muteTimeRemaining != 0 && muteTimeRemaining != 0xFFFFFFFF.toInt()\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/OtherClient.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.contact\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.event.events.OtherClientOnlineEvent\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.utils.BotConfiguration.MiraiProtocol.ANDROID_PAD\nimport net.mamoe.mirai.utils.BotConfiguration.MiraiProtocol.ANDROID_PHONE\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport net.mamoe.mirai.utils.toLongUnsigned\n\n/**\n * 其他设备. 如当 [Bot] 以 [ANDROID_PHONE] 登录时, 还可以有其他设备以 [ANDROID_PAD], iOS, PC 或其他设备登录.\n */\n@NotStableForInheritance\npublic interface OtherClient : Contact {\n    public val info: OtherClientInfo\n\n    /**\n     * 此设备属于的 [Bot]\n     */\n    public override val bot: Bot\n\n    /**\n     * 识别 id, 仅运行时使用.\n     *\n     * 此 id 由其他客户端控制, 重启可能会变化.\n     */\n    public override val id: Long\n        get() {\n            @OptIn(MiraiInternalApi::class)\n            return info.appId.toLongUnsigned()\n        }\n\n    override suspend fun sendMessage(message: Message): MessageReceipt<OtherClient> {\n        throw UnsupportedOperationException(\"OtherClientImpl.sendMessage is not yet supported.\")\n    }\n\n    override suspend fun uploadImage(resource: ExternalResource): Image {\n        throw UnsupportedOperationException(\"OtherClientImpl.uploadImage is not yet supported.\")\n    }\n}\n\npublic inline val OtherClient.platform: Platform? get() = info.platform\npublic inline val OtherClient.deviceName: String get() = info.deviceName\npublic inline val OtherClient.deviceKind: String get() = info.deviceKind\n\npublic data class OtherClientInfo @MiraiInternalApi constructor(\n\n    /**\n     * 仅运行时识别. 随着客户端更新此 ID 可能有变化.\n     *\n     * 不可能有 [appId] 相同的两个客户端同时在线.\n     */\n    @MiraiInternalApi\n    public val appId: Int,\n\n    /**\n     * 登录平台\n     */\n    public val platform: Platform?,\n\n    /**\n     * 示例：\n     * - Mi 10 Pro\n     * - 电脑\n     * - xxx 的 iPad\n     * - mirai\n     */\n    public val deviceName: String,\n\n    /**\n     * 示例：\n     * - Mi 10 Pro\n     * - DESKTOP-ABCDEFG\n     * - iPad\n     * - mirai\n     */\n    public val deviceKind: String,\n)\n\n/**\n * @see OtherClientInfo.platform\n */\npublic enum class Platform(\n    @MiraiInternalApi public val terminalId: Int,\n    @MiraiInternalApi public val platformId: Int,\n) {\n    IOS(3, 1),\n    MOBILE(2, 2), // android\n    WINDOWS(1, 3),\n    ;\n\n    public companion object {\n        @MiraiInternalApi\n        public fun getByTerminalId(terminalId: Int): Platform? = values().find { it.terminalId == terminalId }\n    }\n}\n\n/**\n * 详细设备类型. 在登录时查询到的设备列表中无此信息. 只在 [OtherClientOnlineEvent] 才有.\n */\npublic enum class ClientKind(\n    @MiraiInternalApi public val id: Int,\n) {\n\n    ANDROID_PAD(68104),\n    AOL_CHAOJIHUIYUAN(73730),\n    AOL_HUIYUAN(73474),\n    AOL_SQQ(69378),\n    CAR(65806),\n    HRTX_IPHONE(66566),\n    HRTX_PC(66561),\n    MC_3G(65795),\n    MISRO_MSG(69634),\n    MOBILE_ANDROID(65799),\n    MOBILE_ANDROID_NEW(72450),\n    MOBILE_HD(65805),\n    MOBILE_HD_NEW(71426),\n    MOBILE_IPAD(68361),\n    MOBILE_IPAD_NEW(72194),\n    MOBILE_IPHONE(67586),\n    MOBILE_OTHER(65794),\n    MOBILE_PC_QQ(65793),\n    MOBILE_PC_TIM(77313),\n    MOBILE_WINPHONE_NEW(72706),\n    QQ_FORELDER(70922),\n    QQ_SERVICE(71170),\n    TV_QQ(69130),\n    WIN8(69899),\n    WINPHONE(65804);\n\n    public companion object {\n        @MiraiInternalApi\n        public operator fun get(id: Int): ClientKind? = values().find { it.id == id }\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/Stranger.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"EXPERIMENTAL_API_USAGE\", \"unused\", \"UnusedImport\")\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai.contact\n\nimport kotlinx.coroutines.CoroutineScope\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.action.Nudge\nimport net.mamoe.mirai.message.action.StrangerNudge\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.data.isContentEmpty\nimport net.mamoe.mirai.message.data.toPlainText\nimport net.mamoe.mirai.utils.NotStableForInheritance\n\n/**\n * 代表一位陌生人.\n *\n * 一个 [Stranger] 实例并不是独立的, 它属于一个 [Bot].\n * 对于同一个 [Bot], 任何一个人的 [Stranger] 实例都是单一的.\n * [Stranger] 无法通过任何方式直接构造. 任何时候都应从 [Bot.getStranger] 或事件中获取.\n *\n * 陌生人的来源：当将添加好友设置为\n * ‘任何人可添加为好友’或‘需要回答对验证问题时’\n * 且被他人成功添加时此人会成为陌生人\n *\n * 陌生人需要主动添加好友才能构成好友关系\n * 但 Mirai 将不会提供此功能\n * 请手动在其他客户端添加好友\n *\n * @see StrangerMessageEvent\n */\n@NotStableForInheritance\npublic interface Stranger : User, CoroutineScope {\n    /**\n     * 向这个对象发送消息.\n     *\n     * 单条消息最大可发送 4500 字符或 50 张图片.\n     *\n     * @see FriendMessagePreSendEvent 发送消息前事件\n     * @see FriendMessagePostSendEvent 发送消息后事件\n     *\n     * @throws EventCancelledException 当发送消息事件被取消时抛出\n     * @throws BotIsBeingMutedException 发送群消息时若 [Bot] 被禁言抛出\n     * @throws MessageTooLargeException 当消息过长时抛出\n     * @throws IllegalArgumentException 当消息内容为空时抛出 (详见 [Message.isContentEmpty])\n     *\n     * @return 消息回执. 可进行撤回 ([MessageReceipt.recall])\n     */\n    public override suspend fun sendMessage(message: Message): MessageReceipt<Stranger>\n\n    /**\n     * 删除并屏蔽该陌生人, 屏蔽后对方将无法发送临时会话消息\n     *\n     * @see StrangerRelationChangeEvent.Deleted 陌生人删除事件\n     */\n    public suspend fun delete()\n\n    /**\n     * 发送纯文本消息\n     * @see sendMessage\n     */\n    public override suspend fun sendMessage(message: String): MessageReceipt<Stranger> =\n        this.sendMessage(message.toPlainText())\n\n    /**\n     * 创建一个 \"戳一戳\" 消息\n     *\n     * @see Nudge.sendTo 发送这个戳一戳消息\n     */\n    public override fun nudge(): StrangerNudge = StrangerNudge(this)\n}\n\n\n/**\n * 得到此陌生人作为好友的对象.\n *\n * @throws IllegalStateException 当此成员不是好友时抛出\n * @since 2.2\n */\npublic fun Stranger.asFriend(): Friend = this.bot.getFriend(this.id) ?: error(\"$this is not a friend\")\n\n/**\n * 得到此陌生人作为好友的对象, 当此成员不是好友时返回 `null`\n * @since 2.2\n */\npublic fun Stranger.asFriendOrNull(): Friend? = this.bot.getFriend(this.id)\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/TempUser.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.contact\n\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.NotStableForInheritance\n\n/**\n * 临时会话用户, 非群成员.\n *\n * [#429](https://github.com/mamoe/mirai/issues/429)\n */\n@MiraiInternalApi(\"其他渠道的临时会话暂未支持. \")\n@NotStableForInheritance\npublic interface TempUser : User"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/User.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"EXPERIMENTAL_API_USAGE\", \"unused\")\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai.contact\n\nimport kotlinx.coroutines.CoroutineScope\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.data.UserProfile\nimport net.mamoe.mirai.event.events.EventCancelledException\nimport net.mamoe.mirai.event.events.UserMessagePostSendEvent\nimport net.mamoe.mirai.event.events.UserMessagePreSendEvent\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.action.Nudge\nimport net.mamoe.mirai.message.action.UserNudge\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.data.isContentEmpty\nimport net.mamoe.mirai.message.data.toPlainText\nimport net.mamoe.mirai.utils.NotStableForInheritance\n\n/**\n * 代表一个 **用户**.\n *\n * 其子类有 [群成员][Member] 和 [好友][Friend].\n * 虽然群成员也可能是好友, 但他们仍是不同的两个类型.\n *\n * 注意: 一个 [User] 实例并不是独立的, 它属于一个 [Bot].\n *\n * 对于同一个 [Bot] 任何一个人的 [User] 实例都是单一的.\n */\n@NotStableForInheritance\npublic interface User : Contact, UserOrBot, CoroutineScope {\n    /**\n     * QQ 号码\n     */\n    public override val id: Long\n\n    /**\n     * 备注信息\n     *\n     * 仅 [Bot] 与 [User] 存在好友关系的时候才可能存在备注\n     *\n     * [Bot] 与 [User] 没有好友关系时永远为空[字符串][String] (\"\")\n     *\n     * @see [User.remarkOrNick]\n     */\n    public val remark: String\n\n    /**\n     * 向这个对象发送消息.\n     *\n     * 单条消息最大可发送 4500 字符或 50 张图片.\n     *\n     * @see UserMessagePreSendEvent 发送消息前事件\n     * @see UserMessagePostSendEvent 发送消息后事件\n     *\n     * @throws EventCancelledException 当发送消息事件被取消时抛出\n     * @throws MessageTooLargeException 当消息过长时抛出\n     * @throws IllegalArgumentException 当消息内容为空时抛出 (详见 [Message.isContentEmpty])\n     *\n     * @return 消息回执. 可 [引用][MessageReceipt.quote] 或 [撤回][MessageReceipt.recall] 这条消息.\n     */\n    public override suspend fun sendMessage(message: Message): MessageReceipt<User>\n\n    /**\n     * 发送纯文本消息\n     * @see sendMessage\n     */\n    public override suspend fun sendMessage(message: String): MessageReceipt<User> =\n        this.sendMessage(message.toPlainText())\n\n    /**\n     * 创建一个 \"戳一戳\" 消息\n     *\n     * @see Nudge.sendTo 发送这个戳一戳消息\n     */\n    public override fun nudge(): UserNudge\n\n    /**\n     * 查询用户信息.\n     *\n     * 此函数不会缓存信息. 每次调用此函数都会向服务器查询新信息.\n     *\n     * @since 2.1\n     */\n    public suspend fun queryProfile(): UserProfile = Mirai.queryProfile(bot, this.id)\n}\n\n/**\n * 获取非空备注或昵称.\n *\n * 若 [备注][User.remark] 不为空则返回备注, 为空则返回 [User.nick]\n */\npublic val User.remarkOrNick: String get() = this.remark.takeIf { it.isNotEmpty() } ?: this.nick\n\n/**\n * 获取非空备注或群名片.\n *\n * 若 [备注][User.remark] 不为空则返回备注, 为空则返回 [Member.nameCard]\n */\npublic val Member.remarkOrNameCard: String get() = this.remark.takeIf { it.isNotEmpty() } ?: this.nameCard\n\n/**\n * 获取非空备注或群名片或昵称.\n *\n * 若 [备注][User.remark] 不为空则返回备注, 为空则返回 [Member.nameCardOrNick]\n */\npublic val Member.remarkOrNameCardOrNick: String get() = this.remark.takeIf { it.isNotEmpty() } ?: this.nameCardOrNick\n\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/UserOrBot.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.contact\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.message.action.Nudge\nimport net.mamoe.mirai.utils.NotStableForInheritance\n\n/**\n * @see User\n * @see Bot\n *\n * @see ContactOrBot\n */\n@NotStableForInheritance\npublic interface UserOrBot : ContactOrBot {\n    /**\n     * 获取昵称\n     *\n     * ### Kotlin 实用扩展:\n     *\n     * - [nameCardOrNick]: 若该用户是 [群成员][Member], 则优先返回其非空群名片, 否则返回 [nick].\n     * - [remarkOrNameCardOrNick]: 若 [Bot] 对该用户有[备注][User.remark]则返回备注, 否则返回 [nameCardOrNick].\n     *\n     * @since 2.6\n     */\n    public val nick: String\n\n    /**\n     * 创建一个 \"戳一戳\" 消息\n     *\n     * @see Nudge.sendTo 发送这个戳一戳消息\n     */\n    public fun nudge(): Nudge\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/active/ActiveChart.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.contact.active\n\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n/**\n * 活跃度数据图表， 键是 `yyyy-MM` 格式的日期，值是数量\n * @property members 每日总人数\n * @property actives 每日活跃人数\n * @property sentences 每日申请人数\n * @property join 每日入群人数\n * @property exit 每日退群人数\n * @since 2.13\n */\npublic class ActiveChart @MiraiInternalApi public constructor(\n    public val actives: Map<String, Int>,\n    public val sentences: Map<String, Int>,\n    public val members: Map<String, Int>,\n    public val join: Map<String, Int>,\n    public val exit: Map<String, Int>\n)"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/active/ActiveHonorInfo.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.contact.active\n\nimport net.mamoe.mirai.contact.NormalMember\n\n/**\n * 群荣耀当前持有者\n * @property memberName 群员昵称\n * @property memberId 群员 ID\n * @property avatar 群员头像\n * @property member 群员实例\n * @property termDays 当前蝉联天数\n * @property historyDays 历史获得天数\n * @property maxTermDays 最大蝉联天数\n * @since 2.13\n */\npublic class ActiveHonorInfo internal constructor(\n    public val memberName: String,\n    public val memberId: Long,\n    public val avatar: String,\n    public val member: NormalMember?,\n    public val termDays: Int,\n    public val historyDays: Int,\n    public val maxTermDays: Int,\n)"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/active/ActiveHonorList.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.contact.active\n\nimport net.mamoe.mirai.data.GroupHonorType\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport kotlin.jvm.JvmName\n\n/**\n * 群荣耀历史数据\n * @property type 群荣誉类型\n * @property current 当前荣耀持有者 (龙王，壕礼皇冠, 善财福禄寿)\n * @property records 群荣耀历史记录\n * @since 2.13\n */\npublic class ActiveHonorList @MiraiInternalApi public constructor(\n    @get:JvmName(\"getType\")\n    public val type: GroupHonorType, // `public int getType()` for Java\n    public val current: ActiveHonorInfo?,\n    public val records: List<ActiveHonorInfo>\n)"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/active/ActiveRankRecord.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.contact.active\n\nimport net.mamoe.mirai.contact.NormalMember\n\n/**\n * 活跃排行榜记录\n * @property memberName 发言者名称\n * @property memberId 发言者 ID\n * @property member 发言者的群员实例\n * @property temperature 活跃度\n * @property score 活跃积分\n * @since 2.13\n */\npublic class ActiveRankRecord internal constructor(\n    public val memberName: String,\n    public val memberId: Long,\n    public val member: NormalMember?,\n    public val temperature: Int,\n    public val score: Int\n)"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/active/ActiveRecord.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.contact.active\n\nimport net.mamoe.mirai.contact.NormalMember\n\n/**\n * 活跃数据记录\n * @property memberName 发言者名称\n * @property memberId 发言者 ID\n * @property member 发言者的群员实例\n * @property periodDays 活跃连续天数\n * @property messagesCount 发言条数\n * @since 2.13\n */\npublic class ActiveRecord internal constructor(\n    public val memberName: String,\n    public val memberId: Long,\n    public val member: NormalMember?,\n    public val periodDays: Int,\n    public val messagesCount: Int\n)"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/active/GroupActive.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai.contact.active\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.Member\nimport net.mamoe.mirai.data.GroupHonorType\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport net.mamoe.mirai.utils.Streamable\nimport kotlin.jvm.JvmName\n\n/**\n * 表示一个群活跃度管理.\n *\n * ## 获取 [GroupActive] 实例\n *\n * 只可以通过 [Group.active] 获取一个群的活跃度管理, 即 [GroupActive] 实例.\n *\n * ### 头衔设置\n *\n * * 通过 [isHonorVisible] 可以获取和设置一个群的荣誉是否显示,\n * * 通过 [isTitleVisible] 可以获取和设置一个群的头衔是否显示,\n * * 通过 [isTemperatureVisible] 可以获取和设置一个群的活跃度是否显示,\n * * 通过 [rankTitles] 可以获取和设置一个群的等级头衔列表 (PC 端显示),\n * * 通过 [temperatureTitles] 可以获取和设置一个群的活跃度头衔列表 (手机端显示)\n *\n * ### 刷新群成员活跃数据\n *\n * 通过 [refresh] 可以刷新 [Member.active] 中的属性 (不包括 honors 和 temperature)\n *\n * ### 活跃度记录\n *\n * 通过 [asFlow] 可以获取群活跃度记录*惰性*流.\n *\n * 若要获取全部活跃度记录, 可使用 [toList].\n *\n * ### 活跃度图表\n *\n * 通过 [queryChart] 可以获取活跃度图表，\n * 包括\n * * 每日总人数 [ActiveChart.members]\n * * 每日活跃人数 [ActiveChart.actives]\n * * 每日申请人数 [ActiveChart.sentences]\n * * 每日入群人数 [ActiveChart.join]\n * * 每日退群人数 [ActiveChart.exit]\n *\n * 通过 [queryHonorHistory] 可以获取群荣耀历史数据，\n * 包括\n * * 当前荣耀持有者 (龙王，壕礼皇冠, 善财福禄寿) [ActiveHonorList.current]\n * * 群荣耀历史记录 [ActiveHonorList.records]\n *\n * @since 2.13\n */\n@NotStableForInheritance\npublic interface GroupActive : Streamable<ActiveRecord> {\n\n    /**\n     * 是否在群聊中显示荣誉\n     * @see MemberActive.honors\n     */\n    public val isHonorVisible: Boolean\n\n    /**\n     * 设置是否在群聊中显示荣誉\n     * @see MemberActive.honors\n     */\n    public suspend fun setHonorVisible(newValue: Boolean)\n\n    /**\n     * 是否在群聊中显示头衔\n     * @see Member.rankTitle\n     * @see Member.temperatureTitle\n     */\n    public val isTitleVisible: Boolean\n\n    /**\n     * 设置是否在群聊中显示头衔。操作成功时会同时刷新等级头衔信息。\n     * @see Member.rankTitle\n     * @see Member.temperatureTitle\n     */\n    public suspend fun setTitleVisible(newValue: Boolean)\n\n    /**\n     * 是否在群聊中显示活跃度\n     * @see MemberActive.temperature\n     */\n    public val isTemperatureVisible: Boolean\n\n    /**\n     * 设置是否在群聊中显示活跃度。操作成功时会同时刷新等级头衔信息。\n     * @see MemberActive.temperature\n     */\n    public suspend fun setTemperatureVisible(newValue: Boolean)\n\n    /**\n     * 等级头衔列表，键是等级，值是头衔\n     *\n     * @see Member.rankTitle\n     */\n    public val rankTitles: Map<Int, String>\n\n    /**\n     * 设置等级头衔列表，键是等级，值是头衔。操作成功时会同时刷新等级头衔信息。\n     * @see Member.rankTitle\n     */\n    public suspend fun setRankTitles(newValue: Map<Int, String>)\n\n    /**\n     * 活跃度头衔列表，键是等级，值是头衔。操作成功时会同时刷新活跃度头衔信息。\n     * @see Member.temperatureTitle\n     */\n    public val temperatureTitles: Map<Int, String>\n\n    /**\n     * 设置活跃度头衔列表，键是等级，值是头衔。操作成功时会同时刷新活跃度头衔信息。\n     * @see Member.temperatureTitle\n     */\n    public suspend fun setTemperatureTitles(newValue: Map<Int, String>)\n\n    /**\n     * 刷新 [Member.active] 中的属性 (不包括 [honors][MemberActive.honors] 和 [temperature][MemberActive.temperature])\n     * @see Member.active\n     */\n    public suspend fun refresh()\n\n    /**\n     * 获取活跃度图表数据\n     */\n    public suspend fun queryChart(): ActiveChart\n\n    /**\n     * 获取群荣耀历史数据, 刷新 [Member.active] 中的 [MemberActive.honors]\n     * @see Member.active\n     */\n    @Suppress(\"INAPPLICABLE_JVM_NAME\")\n    @JvmName(\"queryHonorHistory\")\n    public suspend fun queryHonorHistory(type: GroupHonorType): ActiveHonorList\n\n    /**\n     * 获取活跃度排行榜，通常是前五十名\n     */\n    public suspend fun queryActiveRank(): List<ActiveRankRecord>\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/active/MemberActive.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai.contact.active\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.data.GroupHonorType\nimport net.mamoe.mirai.utils.NotStableForInheritance\n\n/**\n * 群活跃度相关属性\n * @since 2.13\n */\n@NotStableForInheritance\npublic interface MemberActive {\n\n    /**\n     * 群活跃等级. 取值为 1~6 (包含)\n     *\n     * 这个等级是在 PC 端成员管理功能中显示的等级\n     *\n     * @see point\n     */\n    public val rank: Int\n\n    /**\n     * 群活跃积分.\n     *\n     * 这个积分是在 PC 端成员管理功能中显示的积分，和手机端显示的 群荣誉活跃积分 不同\n     *\n     * @see rank\n     */\n    public val point: Int\n\n    /**\n     * 群荣誉标识.\n     */\n    public val honors: Set<GroupHonorType>\n\n    /**\n     * 群荣誉等级. 取值为 1~100 (包含)\n     *\n     * 这个等级是在手机端群荣誉功能中显示的等级\n     */\n    public val temperature: Int\n\n    /**\n     * 查询头衔佩戴情况\n     */\n    public suspend fun queryMedal(): MemberMedalInfo\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/active/MemberMedalInfo.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.contact.active\n\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n\n/**\n * 群成员头衔详情\n * @property title 当前佩戴的头衔\n * @property color 当前佩戴的头衔的颜色\n * @property wearing 当前佩戴的头衔类型\n * @property medals 拥有的所有头衔\n * @since 2.13\n */\npublic class MemberMedalInfo @MiraiInternalApi public constructor(\n    public val title: String,\n    public val color: String,\n    public val wearing: MemberMedalType,\n    public val medals: Set<MemberMedalType>,\n)"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/active/MemberMedalType.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.contact.active\n\nimport net.mamoe.mirai.contact.active.MemberMedalType.*\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n\n/**\n * 群成员头衔详情Detail\n * @property OWNER 群主独有的头衔\n * @property ADMIN 管理员独有的头衔\n * @property SPECIAL 群主授予的头衔\n * @property ACTIVE 群主设定的头衔, 保持活跃即可获得\n * @since 2.13\n */\npublic enum class MemberMedalType(@MiraiInternalApi public val mask: Int) {\n    OWNER(300),\n    ADMIN(301),\n    SPECIAL(302),\n    ACTIVE(315);\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/announcement/Announcement.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INAPPLICABLE_JVM_NAME\", \"NOTHING_TO_INLINE\")\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai.contact.announcement\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.PermissionDeniedException\nimport net.mamoe.mirai.contact.announcement.Announcement.Companion.publishAnnouncement\nimport kotlin.jvm.JvmOverloads\nimport kotlin.jvm.JvmStatic\nimport kotlin.jvm.JvmSynthetic\n\n\n/**\n * 表示一个 (群) 公告.\n *\n * ## 公告类型\n *\n * [Announcement] 可以是 [OnlineAnnouncement] 或 [OfflineAnnouncement].\n *\n * - [OnlineAnnouncement] 表示从 [Announcements.get] 等途径在线获取的, 已经存在于服务器的公告.\n * - [OfflineAnnouncement] 表示在本地构建的 [Announcement].\n *\n * ## 发布公告\n *\n * ### 构造一条新公告并发布\n *\n * 构造 [OfflineAnnouncement] 然后调用其 [OfflineAnnouncement.publishTo] 或 [Announcements.publish].\n *\n * 在构造时可提供可选的 [AnnouncementParameters] 来设置一些附加属性.\n *\n * 也可以使用 [Announcement.publishAnnouncement] 扩展快捷创建并发布公告.\n *\n * ### 转发获取的公告到其他群\n *\n * 通过一个群的 [Announcements] 获取到 [OnlineAnnouncement], 然后调用 [OnlineAnnouncement.publishTo] 到另一个群即可.\n * 由于目前不支持获取公告的图片, 转发的公告也就不会带有原公告的图片.\n *\n * ## 序列化\n *\n * [OfflineAnnouncement] 支持 kotlinx-serialization 序列化, 可使用 serializer [OfflineAnnouncement.serializer].\n *\n * [OnlineAnnouncement] 无法序列化. 只能将其转为 [OfflineAnnouncement] 再序列化. 在 Kotlin 使用 [Announcement.toOffline], 在 Java 使用 [OfflineAnnouncement.from].\n *\n * @see Announcement\n *\n * @since 2.7\n */\npublic sealed interface Announcement {\n    /**\n     * 内容\n     */\n    public val content: String\n\n    /**\n     * 附加参数. 可以通过 [AnnouncementParametersBuilder] 构建获得.\n     * @see AnnouncementParameters\n     * @see AnnouncementParametersBuilder\n     */\n    public val parameters: AnnouncementParameters\n\n    /**\n     * 在该群发布群公告并获得 [OnlineAnnouncement], 需要管理员权限. 发布公告后群内将会出现 \"有新公告\" 系统提示.\n     * @throws PermissionDeniedException 当没有权限时抛出\n     * @throws IllegalStateException 当协议异常时抛出\n     * @see Announcements.publish\n     */\n    public suspend fun publishTo(group: Group): OnlineAnnouncement = group.announcements.publish(this)\n\n    public companion object {\n        /**\n         * 在该群发布群公告并获得 [OnlineAnnouncement], 需要管理员权限. 发布公告后群内将会出现 \"有新公告\" 系统提示.\n         *\n         * @param content 公告内容\n         * @param parameters 可选的附加参数\n         *\n         * @throws PermissionDeniedException 当没有权限时抛出\n         * @throws IllegalStateException 当协议异常时抛出\n         *\n         * @see OfflineAnnouncement\n         * @see Announcement.publishTo\n         * @see AnnouncementParametersBuilder\n         */\n        @JvmOverloads\n        @JvmStatic\n        public suspend fun Group.publishAnnouncement(\n            content: String,\n            parameters: AnnouncementParameters = AnnouncementParameters.DEFAULT\n        ): OnlineAnnouncement = this.announcements.publish(OfflineAnnouncement(content, parameters))\n\n        /**\n         * 在该群发布群公告并获得 [OnlineAnnouncement], 需要管理员权限. 发布公告后群内将会出现 \"有新公告\" 系统提示.\n         *\n         * @param content 公告内容\n         * @param parameters 可选的附加参数\n         *\n         * @throws PermissionDeniedException 当没有权限时抛出\n         * @throws IllegalStateException 当协议异常时抛出\n         *\n         * @see OfflineAnnouncement\n         * @see Announcement.publishTo\n         * @see AnnouncementParametersBuilder\n         */\n        @JvmSynthetic\n        public suspend inline fun Group.publishAnnouncement(\n            content: String,\n            parameters: AnnouncementParametersBuilder.() -> Unit\n        ): OnlineAnnouncement {\n            // contract { callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) }\n            // no contract and no inline: IDE fails to analyze this funciton\n            return this.announcements.publish(OfflineAnnouncement(content, parameters))\n        }\n    }\n}\n\n/**\n * 创建 [OfflineAnnouncement]. 若 [this] 类型为 [OfflineAnnouncement] 则直接返回 [this].\n * @since 2.7\n */\npublic inline fun Announcement.toOffline(): OfflineAnnouncement = OfflineAnnouncement.from(this)\n\n\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/announcement/AnnouncementImage.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.contact.announcement\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.utils.isSameClass\nimport kotlin.jvm.JvmStatic\n\n\n/**\n * 群公告图片. 可通过 [Announcements.uploadImage] 上传获得. 不确定服务器会保存多久.\n *\n * 要发布一条带有图片的公告, 请在构造 [AnnouncementParameters] 时提供 [AnnouncementParameters.image] 参数. 详见 [Announcement].\n *\n * @since 2.7\n */\n@SerialName(AnnouncementImage.SERIAL_NAME)\n@Serializable\npublic class AnnouncementImage private constructor(\n    public val id: String,\n    public val height: Int,\n    public val width: Int,\n) {\n    // For stability, do not make it `data class`.\n\n    /**\n     * @since 2.15\n     */\n    public val url: String get() = \"https://gdynamic.qpic.cn/gdynamic/$id/628\"\n\n    public companion object {\n        public const val SERIAL_NAME: String = \"AnnouncementImage\"\n\n        /**\n         * 创建 [AnnouncementImage] 实例.\n         */\n        @JvmStatic\n        public fun create(id: String, height: Int, width: Int): AnnouncementImage {\n            return AnnouncementImage(id, height, width)\n        }\n    }\n\n    override fun toString(): String {\n        return \"AnnouncementImage(id='$id', height=$height, width=$width)\"\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (other !is AnnouncementImage || !isSameClass(this, other)) return false\n\n        if (id != other.id) return false\n        if (height != other.height) return false\n        if (width != other.width) return false\n\n        return true\n    }\n\n    override fun hashCode(): Int {\n        var result = id.hashCode()\n        result = 31 * result + height.hashCode()\n        result = 31 * result + width.hashCode()\n        return result\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/announcement/AnnouncementParameters.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.contact.announcement\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.contact.announcement.AnnouncementParameters.Companion.DEFAULT\nimport net.mamoe.mirai.utils.isSameClass\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmStatic\n\n/**\n * 群公告的附加参数.\n *\n * 可通过 [AnnouncementParametersBuilder] 构建. 默认实例为 [DEFAULT].\n *\n * @since 2.7\n */\n@SerialName(AnnouncementParameters.SERIAL_NAME)\n@Serializable\npublic class AnnouncementParameters internal constructor(\n    /**\n     * 群公告的图片，目前仅支持发送图片，不支持获得图片. 可通过 [Announcements.uploadImage] 上传图片.\n     * @see AnnouncementImage\n     */\n    public val image: AnnouncementImage? = null,\n    /** 发送给新成员 */\n    public val sendToNewMember: Boolean = false,\n    /** 置顶. 可以有多个置顶公告 */\n    public val isPinned: Boolean = false,\n    /** 显示能够引导群成员修改昵称的窗口 */\n    public val showEditCard: Boolean = false,\n    /** 使用弹窗 */\n    public val showPopup: Boolean = false,\n    /** 需要群成员确认 */\n    public val requireConfirmation: Boolean = false,\n) {\n    /**\n     * 以该对象作为原型创建一个 [AnnouncementParametersBuilder].\n     */\n    public fun builder(): AnnouncementParametersBuilder = AnnouncementParametersBuilder().apply {\n        val outer = this@AnnouncementParameters\n        image(outer.image)\n        sendToNewMember(outer.sendToNewMember)\n        isPinned(outer.isPinned)\n        showEditCard(outer.showEditCard)\n        showPopup(outer.showPopup)\n        requireConfirmation(outer.requireConfirmation)\n    }\n\n    public companion object {\n        public const val SERIAL_NAME: String = \"AnnouncementParameters\"\n\n        /**\n         * 默认值的 [AnnouncementParameters] 实例\n         */\n        @JvmStatic\n        @get:JvmName(\"getDefault\")\n        public val DEFAULT: AnnouncementParameters = AnnouncementParameters()\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (other !is AnnouncementParameters || !isSameClass(this, other)) return false\n\n        if (image != other.image) return false\n        if (sendToNewMember != other.sendToNewMember) return false\n        if (isPinned != other.isPinned) return false\n        if (showEditCard != other.showEditCard) return false\n        if (showPopup != other.showPopup) return false\n        if (requireConfirmation != other.requireConfirmation) return false\n\n        return true\n    }\n\n    override fun hashCode(): Int {\n        var result = image?.hashCode() ?: 0\n        result = 31 * result + sendToNewMember.hashCode()\n        result = 31 * result + isPinned.hashCode()\n        result = 31 * result + showEditCard.hashCode()\n        result = 31 * result + showPopup.hashCode()\n        result = 31 * result + requireConfirmation.hashCode()\n        return result\n    }\n\n    override fun toString(): String {\n        return \"AnnouncementParameters(image=$image, sendToNewMember=$sendToNewMember, isPinned=$isPinned, showEditCard=$showEditCard, showPopup=$showPopup, requireConfirmation=$requireConfirmation)\"\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/announcement/AnnouncementParametersBuilder.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.contact.announcement\n\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmOverloads\nimport kotlin.jvm.JvmSynthetic\n\n\n/**\n * [AnnouncementParameters] 的构建器. 可以构建一个 [AnnouncementParameters] 实例.\n *\n * ## 获得实例\n *\n * 直接构造实例: `new AnnouncementParametersBuilder()` 或者从已有的公告中获取 [AnnouncementParameters.builder].\n *\n * ## 使用\n *\n * ### 在 Kotlin 使用\n *\n * ```\n * val parameters = buildAnnouncementParameters {\n *     sendToNewMember = true\n *     // ...\n * }\n * ```\n *\n * ### 在 Java 使用\n *\n * ```java\n * AnnouncementParameters parameters = new AnnouncementParametersBuilder()\n *         .sendToNewMember(true)\n *         .pinned(true)\n *         .build();\n * ```\n *\n * @see buildAnnouncementParameters\n *\n * @since 2.7\n */\npublic class AnnouncementParametersBuilder @JvmOverloads constructor(\n    prototype: AnnouncementParameters = AnnouncementParameters.DEFAULT\n) {\n    /**\n     * @see AnnouncementParameters.image\n     */\n    public var image: AnnouncementImage? = prototype.image\n        @JvmName(\"image\") get\n        @JvmSynthetic set\n\n    /**\n     * @see AnnouncementParameters.sendToNewMember\n     */\n    public var sendToNewMember: Boolean = prototype.sendToNewMember\n        @JvmName(\"sendToNewMember\") get\n        @JvmSynthetic set\n\n    /**\n     * @see AnnouncementParameters.isPinned\n     */\n    public var isPinned: Boolean = prototype.isPinned\n        @JvmName(\"isPinned\") get\n        @JvmSynthetic set\n\n    /**\n     * @see AnnouncementParameters.showEditCard\n     */\n    public var showEditCard: Boolean = prototype.showEditCard\n        @JvmName(\"showEditCard\") get\n        @JvmSynthetic set\n\n    /**\n     * @see AnnouncementParameters.showPopup\n     */\n    public var showPopup: Boolean = prototype.showPopup\n        @JvmName(\"showPopup\") get\n        @JvmSynthetic set\n\n    /**\n     * @see AnnouncementParameters.requireConfirmation\n     */\n    public var requireConfirmation: Boolean = prototype.requireConfirmation\n        @JvmName(\"requireConfirmation\") get\n        @JvmSynthetic set\n\n    /**\n     * @see AnnouncementParameters.image\n     */\n    public fun image(image: AnnouncementImage?): AnnouncementParametersBuilder {\n        this.image = image\n        return this\n    }\n\n    /**\n     * @see AnnouncementParameters.sendToNewMember\n     */\n    public fun sendToNewMember(sendToNewMember: Boolean): AnnouncementParametersBuilder {\n        this.sendToNewMember = sendToNewMember\n        return this\n    }\n\n    /**\n     * @see AnnouncementParameters.isPinned\n     */\n    public fun isPinned(isPinned: Boolean): AnnouncementParametersBuilder {\n        this.isPinned = isPinned\n        return this\n    }\n\n    /**\n     * @see AnnouncementParameters.showEditCard\n     */\n    public fun showEditCard(isShowEditCard: Boolean): AnnouncementParametersBuilder {\n        this.showEditCard = isShowEditCard\n        return this\n    }\n\n    /**\n     * @see AnnouncementParameters.showPopup\n     */\n    public fun showPopup(showPopup: Boolean): AnnouncementParametersBuilder {\n        this.showPopup = showPopup\n        return this\n    }\n\n    /**\n     * @see AnnouncementParameters.requireConfirmation\n     */\n    public fun requireConfirmation(requireConfirmation: Boolean): AnnouncementParametersBuilder {\n        this.requireConfirmation = requireConfirmation\n        return this\n    }\n\n    /**\n     * 使用当前参数构造 [AnnouncementParameters].\n     */\n    public fun build(): AnnouncementParameters =\n        AnnouncementParameters(image, sendToNewMember, isPinned, showEditCard, showPopup, requireConfirmation)\n}\n\n/**\n * 使用 [AnnouncementParametersBuilder] 构建 [AnnouncementParameters].\n * @see AnnouncementParametersBuilder\n *\n * @since 2.7\n */\npublic inline fun buildAnnouncementParameters(\n    builderAction: AnnouncementParametersBuilder.() -> Unit\n): AnnouncementParameters {\n    contract { callsInPlace(builderAction, InvocationKind.EXACTLY_ONCE) }\n    return AnnouncementParametersBuilder().apply(builderAction).build()\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/announcement/Announcements.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai.contact.announcement\n\nimport kotlinx.coroutines.flow.Flow\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.NormalMember\nimport net.mamoe.mirai.contact.PermissionDeniedException\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport net.mamoe.mirai.utils.Streamable\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmSynthetic\n\n\n/**\n * 表示一个群的公告列表 (管理器).\n *\n * ## 获取群公告\n *\n * ### 获取 [Announcements] 实例\n *\n * 只可以通过 [Group.announcements] 获取一个群的公告列表, 即 [Announcements] 实例.\n *\n * ### 获取公告列表\n *\n * 通过 [asFlow] 或 `asStream` 可以获取到*惰性*流, 在从流中收集数据时才会请求服务器获取数据. 通常建议在 Kotlin 使用协程的 [asFlow], 在 Java 使用 `asStream`.\n *\n * 若要获取全部公告列表, 可使用 [toList].\n *\n * ## 发布群公告\n *\n * 查看 [Announcement]\n *\n * @since 2.7\n */\n@NotStableForInheritance\npublic interface Announcements : Streamable<OnlineAnnouncement> {\n    /**\n     * 删除一条群公告. 需要管理员权限. 使用 [OnlineAnnouncement.delete] 与此方法效果相同.\n     *\n     * @param fid 公告的 [OnlineAnnouncement.fid]\n     * @return 成功返回 `true`, 群公告不存在时返回 `false`\n     *\n     * @throws PermissionDeniedException 当没有权限时抛出\n     * @throws IllegalStateException 当协议异常时抛出\n     *\n     * @see OnlineAnnouncement.delete\n     */\n    public suspend fun delete(fid: String): Boolean\n\n    /**\n     * 获取一条群公告.\n     * @param fid 公告的 [OnlineAnnouncement.fid]\n     * @return 返回 `null` 表示不存在该 [fid] 的群公告\n     * @throws IllegalStateException 当协议异常时抛出\n     */\n    public suspend fun get(fid: String): OnlineAnnouncement?\n\n    /**\n     * 在该群发布群公告并获得 [OnlineAnnouncement], 需要管理员权限. 发布公告后群内将会出现 \"有新公告\" 系统提示.\n     * @throws PermissionDeniedException 当没有权限时抛出\n     * @throws IllegalStateException 当协议异常时抛出\n     * @see Announcement.publishTo\n     */\n    public suspend fun publish(announcement: Announcement): OnlineAnnouncement\n\n    /**\n     * 上传资源作为群公告图片. 返回值可用于 [AnnouncementParameters.image].\n     *\n     * **注意**: 需要由调用方[关闭][ExternalResource.close] [resource].\n     * @throws IllegalStateException 当协议异常时抛出\n     */\n    public suspend fun uploadImage(resource: ExternalResource): AnnouncementImage\n\n    /**\n     * 获取 已确认/未确认 的群成员\n     *\n     * @param fid 公告的 [OnlineAnnouncement.fid]\n     * @param confirmed 是否确认\n     * @return 群成员列表\n     *\n     * @throws PermissionDeniedException 当没有权限时抛出\n     * @throws IllegalStateException 当协议异常时抛出\n     *\n     * @see OnlineAnnouncement.members\n     * @since 2.14\n     */\n    public suspend fun members(fid: String, confirmed: Boolean): List<NormalMember>\n\n    /**\n     * 提醒 未确认 的群成员\n     *\n     * @param fid 公告的 [OnlineAnnouncement.fid]\n     *\n     * @throws PermissionDeniedException 当没有权限时抛出\n     * @throws IllegalStateException 当协议异常时抛出\n     *\n     * @see OnlineAnnouncement.remind\n     */\n    public suspend fun remind(fid: String)\n\n    // no blocking bridge for this method\n    @Suppress(\"INAPPLICABLE_JVM_NAME\")\n    @JvmName(\"asFlow\")\n    @Deprecated(\n        \"Kept for binary compatibility. Use non-suspend overload instead.\",\n        level = DeprecationLevel.HIDDEN\n    )\n    @DeprecatedSinceMirai(hiddenSince = \"2.13\")\n    @JvmSynthetic // no blocking bridge\n    public suspend fun asFlow0(): Flow<OnlineAnnouncement> = asFlow()\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/announcement/OfflineAnnouncement.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage net.mamoe.mirai.contact.announcement\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.contact.announcement.OfflineAnnouncement.Companion.serializer\nimport net.mamoe.mirai.utils.cast\nimport net.mamoe.mirai.utils.map\nimport net.mamoe.mirai.utils.safeCast\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\n\n/**\n * 表示在本地构建的 [Announcement].\n *\n * 支持序列化, 使用 [serializer].\n *\n * 可以通过 [OfflineAnnouncement], [OfflineAnnouncement.create] 等方法构建, 然后使用 [OfflineAnnouncement.publishTo] 或 [Announcements.publish] 发布公告到群.\n *\n * 在 [Announcement] 获取更多信息.\n *\n * @see OnlineAnnouncement.publishTo\n *\n * @since 2.7\n */\n@Serializable(OfflineAnnouncement.Companion.Serializer::class)\n@SerialName(OfflineAnnouncement.SERIAL_NAME)\npublic sealed interface OfflineAnnouncement : Announcement {\n    public companion object {\n        public const val SERIAL_NAME: String = \"OfflineAnnouncement\"\n\n        /**\n         * 创建 [OfflineAnnouncement]. 若 [announcement] 类型为 [OfflineAnnouncement] 则直接返回 [announcement].\n         *\n         * 若要转发获取到的公告到一个群, 可直接调用 [Announcement.publishTo] 而不需要构造 [OfflineAnnouncement].\n         *\n         * @see OnlineAnnouncement.toOffline\n         */\n        @JvmStatic\n        public inline fun from(announcement: Announcement): OfflineAnnouncement =\n            announcement.safeCast() ?: announcement.run { create(content, parameters) }\n\n        /**\n         * 创建 [OfflineAnnouncement].\n         * @param content 公告内容\n         * @param parameters 可选的附加参数\n         */\n        @JvmOverloads\n        @JvmStatic\n        public fun create(\n            content: String,\n            parameters: AnnouncementParameters = AnnouncementParameters.DEFAULT\n        ): OfflineAnnouncement = OfflineAnnouncementImpl(content, parameters)\n\n        /**\n         * 创建 [AnnouncementParameters] 并创建 [OfflineAnnouncement].\n         * @param content 公告内容\n         * @param parameters 可选的附加参数\n         * @see AnnouncementParametersBuilder\n         */\n        @JvmSynthetic\n        public inline fun create(\n            content: String,\n            parameters: AnnouncementParametersBuilder.() -> Unit\n        ): OfflineAnnouncement {\n            contract { callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) }\n            return create(content, buildAnnouncementParameters(parameters))\n        }\n\n        internal object Serializer : KSerializer<OfflineAnnouncement> by OfflineAnnouncementImpl.serializer().map(\n            resultantDescriptor = OfflineAnnouncementImpl.serializer().descriptor,\n            deserialize = { it },\n            serialize = { it.safeCast<OfflineAnnouncementImpl>() ?: create(content, parameters).cast() }\n        )\n    }\n}\n\n/**\n * 依据 [from] 创建 [OfflineAnnouncement]. 若 [from] 类型为 [OfflineAnnouncement] 则直接返回 [from].\n * @since 2.7\n */\npublic inline fun OfflineAnnouncement(from: Announcement): OfflineAnnouncement =\n    OfflineAnnouncement.from(from)\n\n/**\n * 创建 [AnnouncementParameters] 并创建 [OfflineAnnouncement].\n * @param content 公告内容\n * @param parameters 可选的附加参数\n * @since 2.7\n */\npublic inline fun OfflineAnnouncement(\n    content: String,\n    parameters: AnnouncementParameters = AnnouncementParameters.DEFAULT\n): OfflineAnnouncement = OfflineAnnouncement.create(content, parameters)\n\n/**\n * 创建 [AnnouncementParameters] 并创建 [OfflineAnnouncement].\n * @param content 公告内容\n * @param parameters 可选的附加参数\n * @see AnnouncementParametersBuilder\n * @since 2.7\n */\npublic inline fun OfflineAnnouncement(\n    content: String,\n    parameters: AnnouncementParametersBuilder.() -> Unit\n): OfflineAnnouncement {\n    contract { callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) }\n    return OfflineAnnouncement.create(content, parameters)\n}\n\n@SerialName(OfflineAnnouncement.SERIAL_NAME)\n@Serializable\nprivate data class OfflineAnnouncementImpl(\n    override val content: String,\n    override val parameters: AnnouncementParameters\n) : OfflineAnnouncement {\n    override fun toString() = \"OfflineAnnouncement(body='$content', parameters=$parameters)\"\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/announcement/OnlineAnnouncement.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INAPPLICABLE_JVM_NAME\", \"NOTHING_TO_INLINE\")\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai.contact.announcement\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.NormalMember\nimport net.mamoe.mirai.contact.PermissionDeniedException\nimport net.mamoe.mirai.utils.NotStableForInheritance\n\n\n/**\n * 表示从 [Announcements.get] 等途径在线获取的, 已经存在于服务器的公告.\n *\n * [OnlineAnnouncement] 拥有唯一识别属性 [fid] 代表其存在于服务器中的 ID. 可进行 [删除][delete]\n *\n * 可在 [Announcement] 获取更多信息.\n *\n * @since 2.7\n */\n@NotStableForInheritance\npublic interface OnlineAnnouncement : Announcement {\n    /**\n     * 公告所属群\n     */\n    public val group: Group\n\n    /**\n     * 公告发送者 [NormalMember.id]\n     */\n    public val senderId: Long\n\n    /**\n     * 公告发送者. 当该成员已经离开群后为 `null`\n     */\n    public val sender: NormalMember?\n\n    /**\n     * 唯一识别属性\n     */\n    public val fid: String\n\n    /**\n     * 所有人都已阅读, 如果 [AnnouncementParameters.requireConfirmation] 为 `true` 则为所有人都已确认.\n     */\n    public val allConfirmed: Boolean\n\n    /**\n     * 已经阅读的成员数量，如果 [AnnouncementParameters.requireConfirmation] 为 `true` 则为已经确认的成员数量\n     */\n    public val confirmedMembersCount: Int\n\n    /**\n     * 公告发出的时间，为 EpochSecond (自 1970-01-01T00：00：00Z 的秒数)\n     *\n     * @see java.time.Instant.ofEpochSecond\n     */\n    public val publicationTime: Long\n\n    /**\n     * 删除这个公告. 需要管理员权限. 使用 [Announcements.delete] 与此方法效果相同.\n     *\n     * @return 成功返回 `true`, 群公告已被删除时返回 `false`\n     * @throws PermissionDeniedException 当没有权限时抛出\n     * @throws IllegalStateException 当协议异常时抛出\n     * @see Announcements.delete\n     */\n    public suspend fun delete(): Boolean = group.announcements.delete(fid)\n\n    /**\n     * 获取 已确认/未确认 的群成员\n     *\n     * @param confirmed 是否确认\n     * @return 群成员列表\n     *\n     * @throws PermissionDeniedException 当没有权限时抛出\n     * @throws IllegalStateException 当协议异常时抛出\n     *\n     * @see Announcements.members\n     */\n    public suspend fun members(confirmed: Boolean): List<NormalMember> = group.announcements.members(fid, confirmed)\n\n    /**\n     * 提醒 未确认 的群成员\n     *\n     * @throws PermissionDeniedException 当没有权限时抛出\n     * @throws IllegalStateException 当协议异常时抛出\n     *\n     * @see Announcements.remind\n     */\n    public suspend fun remind(): Unit = group.announcements.remind(fid)\n}\n\n/**\n * 公告所在群所属的 [Bot], 即 `group.bot`.\n * @since 2.7\n */\npublic inline val OnlineAnnouncement.bot: Bot get() = group.bot\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/essence/EssenceMessageRecord.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.contact.essence\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.NormalMember\nimport net.mamoe.mirai.message.data.MessageSource\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n/**\n * 精华消息记录\n * @since 2.15\n * @param group 记录的群聊\n * @param sender 消息的发送者\n * @param senderId 消息的发送者的ID\n * @param senderNick 消息的发送者的Nick\n * @param senderTime 消息的发送的时间 *\n * @param operator 设置精华的操作者\n * @param operatorId 设置精华的操作者的ID\n * @param operatorNick 设置精华的操作者的Nick\n * @param operatorTime 设置精华的时间\n */\npublic class EssenceMessageRecord @MiraiInternalApi constructor(\n    public val group: Group,\n    public val sender: NormalMember?,\n    public val senderId: Long,\n    public val senderNick: String,\n    public val senderTime: Int,\n    public val operator: NormalMember?,\n    public val operatorId: Long,\n    public val operatorNick: String,\n    public val operatorTime: Int,\n    private val loadMessageSource: suspend (parse: Boolean) -> MessageSource\n) {\n    override fun toString(): String {\n        return \"EssenceMessageRecord(group=${group}, sender=${senderNick}(${senderId}), senderTime=${senderTime}, operator=${operatorNick}(${operatorId}), operatorTime=${operatorTime})\"\n    }\n\n    /**\n     * 获取消息源\n     *\n     * 其中的 [MessageSource.originalMessage] 将会尝试以加载为原消息格式\n     *\n     * **注意** 当精华消息中包含 图片 时，会尝试将其下载然后重新上传, 以保证可用性\n     *\n     * @see getSource\n     */\n    @JvmBlockingBridge\n    public suspend fun getFullSource(): MessageSource {\n        return loadMessageSource(true)\n    }\n\n    /**\n     * 获取消息源\n     *\n     * @see getFullSource\n     */\n    @JvmBlockingBridge\n    public suspend fun getSource(): MessageSource {\n        return loadMessageSource(false)\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/essence/Essences.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.contact.essence\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.message.data.MessageSource\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport net.mamoe.mirai.utils.Streamable\n\n/**\n * 表示一个群精华消息管理.\n *\n * ## 获取 [Essences] 实例\n *\n * 只可以通过 [Group.essences] 获取一个群的精华消息管理, 即 [Essences] 实例.\n *\n * ### 获取精华消息列表\n *\n * 通过 [asFlow] 或 `asStream` 可以获取到*惰性*流, 在从流中收集数据时才会请求服务器获取数据. 通常建议在 Kotlin 使用协程的 [asFlow], 在 Java 使用 `asStream`.\n *\n * 若要获取全部精华消息列表, 可使用 [toList].\n *\n * ### 获取精华消息分享链接\n *\n * 通过 [share] 可以获得一个精华消息的分享链接\n *\n * ### 移除精华消息\n *\n * 通过 [remove] 可以从列表中移除指定精华消息 (WEB API)\n *\n * @since 2.15\n */\n@NotStableForInheritance\npublic interface Essences : Streamable<EssenceMessageRecord> {\n\n    /**\n     * 按页获取精华消息记录\n     * @param start 起始索引 从 0 开始\n     * @param limit 页大小 返回的记录最大数量，最大取 50\n     * @throws IllegalStateException [limit] 过大或其他参数错误时会触发异常\n     */\n    @JvmBlockingBridge\n    public suspend fun getPage(start: Int, limit: Int): List<EssenceMessageRecord>\n\n    /**\n     * 分享精华消息\n     * @param source 要分享的消息源\n     * @throws IllegalStateException [source] 不为精华消息时将会触发异常\n     * @return 分享 URL\n     */\n    @JvmBlockingBridge\n    public suspend fun share(source: MessageSource): String\n\n    /**\n     * 移除精华消息\n     * @throws IllegalStateException [source] 不为精华消息或权限不足时将会触发异常\n     * @param source 要移除的消息源\n     */\n    @JvmBlockingBridge\n    public suspend fun remove(source: MessageSource)\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/file/AbsoluteFile.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmBlockingBridge\n@file:Suppress(\"OVERLOADS_INTERFACE\")\n\npackage net.mamoe.mirai.contact.file\n\nimport io.ktor.utils.io.errors.*\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.PermissionDeniedException\nimport net.mamoe.mirai.message.data.FileMessage\nimport net.mamoe.mirai.utils.NotStableForInheritance\n\n/**\n * 绝对文件标识. 精确表示一个远程文件. 不会受同名文件或目录的影响.\n *\n * @since 2.8\n * @see RemoteFiles\n * @see AbsoluteFolder\n * @see AbsoluteFileFolder\n */\n@NotStableForInheritance\npublic interface AbsoluteFile : AbsoluteFileFolder {\n    /**\n     * 文件到期时间戳, 单位秒.\n     */\n    public val expiryTime: Long\n\n    /**\n     * 文件大小 (占用空间), 单位 byte.\n     */\n    public val size: Long\n\n    /**\n     * 文件内容 SHA-1.\n     */\n    public val sha1: ByteArray\n\n    /**\n     * 文件内容 MD5.\n     */\n    public val md5: ByteArray\n\n    /**\n     * 移动远程文件到 [folder] 目录下. 成功时返回 `true`, 当远程文件不存在时返回 `false`.\n     *\n     * 注意该操作有可能产生同名文件或目录 (当 [folder] 中已经存在一个名称为 [name] 的文件或目录时).\n     *\n     * @throws IOException 当发生网络错误时可能抛出\n     * @throws IllegalStateException 当发生已知的协议错误时抛出\n     * @throws PermissionDeniedException 当无管理员权限时抛出 (若群仅允许管理员上传)\n     */\n    public suspend fun moveTo(folder: AbsoluteFolder): Boolean\n\n    /**\n     * 获得下载链接 URL 字符串. 当远程文件不存在时返回 `null`.\n     */\n    public suspend fun getUrl(): String?\n\n    /**\n     * 得到 [AbsoluteFile] 所对应的 [FileMessage].\n     *\n     * 注: 在 [上传文件][RemoteFiles.uploadNewFile] 时就已经发送了文件消息, [FileMessage] 不可手动发送\n     */\n    public fun toMessage(): FileMessage\n\n    /**\n     * 返回更新了文件或目录信息 ([lastModifiedTime] 等) 的, 指向相同文件的 [AbsoluteFileFolder].\n     * 不会更新当前 [AbsoluteFileFolder] 对象.\n     *\n     * 当远程文件或目录不存在时返回 `null`.\n     *\n     * 该函数会遍历上级目录的所有文件并匹配当前文件, 因此可能会非常慢, 请不要频繁使用.\n     */\n    override suspend fun refreshed(): AbsoluteFile?\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/file/AbsoluteFileFolder.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmBlockingBridge\n@file:Suppress(\"OVERLOADS_INTERFACE\")\n\npackage net.mamoe.mirai.contact.file\n\nimport io.ktor.utils.io.errors.*\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.FileSupported\nimport net.mamoe.mirai.contact.PermissionDeniedException\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport kotlin.jvm.JvmStatic\n\n/**\n * 绝对文件或目录标识. 精确表示一个远程文件. 不会受同名文件或目录的影响.\n *\n * @since 2.8\n * @see RemoteFiles\n * @see AbsoluteFile\n * @see AbsoluteFolder\n */\n@NotStableForInheritance\npublic sealed interface AbsoluteFileFolder {\n    /**\n     * 该对象所属 [FileSupported]\n     */\n    public val contact: FileSupported\n\n    /**\n     * 上级 [AbsoluteFileFolder].\n     *\n     * - 当该 [AbsoluteFileFolder] 表示一个目录中的文件时返回文件所属目录的 [AbsoluteFolder].\n     * - 当该 [AbsoluteFileFolder] 表示子目录时返回父目录的 [AbsoluteFolder].\n     *\n     * 特别地,\n     * - 当该 [AbsoluteFileFolder] 表示根目录下的一个文件时返回根目录的 [AbsoluteFolder].\n     * - 当该 [AbsoluteFileFolder] 表示根目录时返回 `null` (表示无上级).\n     *\n     * 也就是说, 若 [AbsoluteFileFolder.parent] 为 `null`, 那么该 [AbsoluteFileFolder] 就表示根目录.\n     */\n    public val parent: AbsoluteFolder?\n\n    /**\n     * 文件或目录的 ID, 即 `fileId` 或 `folderId`. 该属性由服务器维护, 通常唯一且持久.\n     */\n    public val id: String\n\n    /**\n     * 文件名或目录名.\n     *\n     * 注意, 当远程文件或目录被 (其他人) 改名时, [name] 不会变动.\n     * 只有在调用 [renameTo] 和 [refresh] 时才会更新.\n     *\n     * 不会包含 `:*?\"<>|/\\` 任一字符.\n     */\n    public val name: String\n\n    /**\n     * 绝对路径, 如 `/foo/bar.txt`.\n     *\n     * 注意, 当远程文件或目录被 (其他人) 移动到其他位置或其父目录名称改名时, [absolutePath] 不会变动.\n     * 只有在调用 [renameTo] 和 [refresh] 等时才会更新.\n     */\n    public val absolutePath: String\n\n    /**\n     * 表示远程文件时返回 `true`.\n     */\n    public val isFile: Boolean\n\n    /**\n     * 表示远程目录时返回 `true`.\n     */\n    public val isFolder: Boolean\n\n    /**\n     * 远程文件或目录的创建时间, 时间戳秒.\n     */\n    public val uploadTime: Long\n\n    /**\n     * 远程文件或目录的最后修改时间戳, 单位秒.\n     *\n     * 注意, 当远程文件或目录被 (其他人) 改动时, [lastModifiedTime] 不会变动.\n     * 只有在调用 [renameTo] 和 [refresh] 等时才会更新.\n     */\n    public val lastModifiedTime: Long\n\n    /**\n     * 上传者 ID.\n     */\n    public val uploaderId: Long\n\n\n    /**\n     * 查询该远程文件或目录是否还存在于服务器.\n     *\n     * 只会精确地按 [id] 检查, 而不会考虑同名文件或目录. 当文件或目录存在时返回 `true`.\n     *\n     * 该操作不会更新 [absolutePath] 等属性.\n     */\n    public suspend fun exists(): Boolean\n\n    /**\n     * 重命名远程文件或目录, **并且**修改当前(`this`) [AbsoluteFileFolder] 的 [name].\n     * 成功时返回 `true`, 当远程文件或目录不存在时返回 `false`.\n     *\n     * 注意该操作有可能产生同名文件或目录 (当服务器已经存在一个名称为 [newName] 的文件或目录时).\n     *\n     * @throws IOException 当发生网络错误时可能抛出\n     * @throws IllegalStateException 当发生已知的协议错误时抛出\n     * @throws PermissionDeniedException 当无管理员权限时抛出 (若群仅允许管理员上传)\n     */\n    public suspend fun renameTo(newName: String): Boolean\n\n    /**\n     * 删除远程文件或目录. 只会根据 [id] 精确地删除一个文件或目录, 不会删除其他同名文件或目录.\n     * 成功时返回 `true`, 当远程文件或目录不存在时返回 `false`.\n     *\n     * 若目录非空, 则会删除目录中的所有文件. 操作目录或非 Bot 自己上传的文件时需要管理员权限, 无管理员权限时抛出异常.\n     *\n     * @throws IOException 当发生网络错误时可能抛出\n     * @throws IllegalStateException 当发生已知的协议错误时抛出\n     * @throws PermissionDeniedException 当无管理员权限时抛出\n     */\n    public suspend fun delete(): Boolean\n\n    /**\n     * 更新当前 [AbsoluteFileFolder] 对象的文件或目录信息 ([lastModifiedTime], [absolutePath] 等).\n     * 成功时返回 `true`, 当远程文件或目录不存在时返回 `false`.\n     */\n    public suspend fun refresh(): Boolean\n\n    /**\n     * 返回更新了文件或目录信息 ([lastModifiedTime] 等) 的, 指向相同文件的 [AbsoluteFileFolder].\n     * 不会更新当前 [AbsoluteFileFolder] 对象.\n     *\n     * 当远程文件或目录不存在时返回 `null`.\n     *\n     * 该函数会遍历上级目录的所有文件并匹配当前文件, 因此可能会非常慢, 请不要频繁使用.\n     */\n    public suspend fun refreshed(): AbsoluteFileFolder?\n\n    public override fun toString(): String\n\n    public companion object {\n        /**\n         * 返回去掉文件后缀的文件名. 如 `foo.txt` 返回 `foo`.\n         *\n         * 注意, 当远程文件或目录被 (其他人) 改名时, [nameWithoutExtension] 不会变动.\n         * 只有在调用 [renameTo] 和 [refresh] 时才会更新.\n         *\n         * 不会包含 `:*?\"<>|/\\` 任一字符.\n         *\n         * @see File.nameWithoutExtension\n         */\n        @get:JvmStatic\n        public val AbsoluteFileFolder.nameWithoutExtension: String\n            get() = name.substringBeforeLast('.')\n\n        /**\n         * 返回文件的后缀名. 如 `foo.txt` 返回 `txt`.\n         *\n         * 注意, 当远程文件或目录被 (其他人) 改名时, [extension] 不会变动.\n         * 只有在调用 [renameTo] 和 [refresh] 时才会更新.\n         *\n         * 不会包含 `:*?\"<>|/\\` 任一字符.\n         *\n         * @see java.io.File.extension\n         */\n        @get:JvmStatic\n        public val AbsoluteFileFolder.extension: String\n            get() = name.substringAfterLast('.', \"\")\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/file/AbsoluteFolder.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai.contact.file\n\nimport kotlinx.coroutines.flow.Flow\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.PermissionDeniedException\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.JavaFriendlyAPI\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport net.mamoe.mirai.utils.ProgressionCallback\nimport java.util.stream.Stream\n\n/**\n * 绝对目录标识. 精确表示一个远程目录. 不会受同名文件或目录的影响.\n *\n * @since 2.8\n * @see RemoteFiles\n * @see AbsoluteFile\n * @see AbsoluteFileFolder\n */\n@Suppress(\"SEALED_INHERITOR_IN_DIFFERENT_MODULE\")\n@NotStableForInheritance\npublic interface AbsoluteFolder : AbsoluteFileFolder {\n    /**\n     * 当前快照中文件数量, 当有文件更新时(上传/删除文件) 该属性不会更新.\n     *\n     * 只可能通过 [refresh] 手动刷新\n     *\n     * 特别的, 若该目录表示根目录, [contentsCount] 返回 `0`. (无法快速获取)\n     */\n    public val contentsCount: Int\n\n    /**\n     * 当该目录为空时返回 `true`.\n     */\n    public fun isEmpty(): Boolean = contentsCount == 0\n\n    /**\n     * 返回更新了文件或目录信息 ([lastModifiedTime] 等) 的, 指向相同文件的 [AbsoluteFileFolder].\n     * 不会更新当前 [AbsoluteFileFolder] 对象.\n     *\n     * 当远程文件或目录不存在时返回 `null`.\n     *\n     * 该函数会遍历上级目录的所有文件并匹配当前文件, 因此可能会非常慢, 请不要频繁使用.\n     */\n    override suspend fun refreshed(): AbsoluteFolder?\n\n    ///////////////////////////////////////////////////////////////////////////\n    // list children\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 获取该目录下所有子目录列表.\n     */\n    public suspend fun folders(): Flow<AbsoluteFolder>\n\n    /**\n     * 获取该目录下所有子目录列表.\n     *\n     * 实现细节: 为了适合 Java 调用, 实现类似为阻塞式的 [folders], 因此不建议在 Kotlin 使用. 在 Kotlin 请使用 [folders].\n     */\n    @JavaFriendlyAPI\n    public suspend fun foldersStream(): Stream<AbsoluteFolder>\n\n\n    /**\n     * 获取该目录下所有文件列表.\n     */\n    public suspend fun files(): Flow<AbsoluteFile>\n\n    /**\n     * 获取该目录下所有文件列表.\n     *\n     * 实现细节: 为了适合 Java 调用, 实现类似为阻塞式的 [files], 因此不建议在 Kotlin 使用. 在 Kotlin 请使用 [files].\n     */\n    @JavaFriendlyAPI\n    public suspend fun filesStream(): Stream<AbsoluteFile>\n\n\n    /**\n     * 获取该目录下所有文件和子目录列表.\n     */\n    public suspend fun children(): Flow<AbsoluteFileFolder>\n\n    /**\n     * 获取该目录下所有文件和子目录列表.\n     *\n     * 实现细节: 为了适合 Java 调用, 实现类似为阻塞式的 [children], 因此不建议在 Kotlin 使用. 在 Kotlin 请使用 [children].\n     */\n    @JavaFriendlyAPI\n    public suspend fun childrenStream(): Stream<AbsoluteFileFolder>\n\n    ///////////////////////////////////////////////////////////////////////////\n    // resolve and upload\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 创建一个名称为 [name] 的子目录. 返回成功创建的或已有的子目录. 当目标目录已经存在时则直接返回该目录.\n     *\n     * @throws IllegalArgumentException 当 [name] 为空或包含非法字符 (`:*?\"<>|`) 时抛出\n     * @throws PermissionDeniedException 当权限不足时抛出\n     */\n    public suspend fun createFolder(name: String): AbsoluteFolder\n\n    /**\n     * 获取一个已存在的名称为 [name] 的子目录. 当该名称的子目录不存在时返回 `null`.\n     *\n     * @throws IllegalArgumentException 当 [name] 为空或包含非法字符 (`:*?\"<>|`) 时抛出\n     */\n    public suspend fun resolveFolder(name: String): AbsoluteFolder?\n\n    /**\n     * 获取一个已存在的 [AbsoluteFileFolder.id] 为 [id] 的子目录. 当该名称的子目录不存在时返回 `null`.\n     *\n     * @throws IllegalArgumentException 当 [id] 为空或无效时抛出\n     *\n     * @since 2.9.0\n     */\n    public suspend fun resolveFolderById(id: String): AbsoluteFolder?\n\n    /**\n     * 精确获取 [AbsoluteFile.id] 为 [id] 的文件. 在目标文件不存在时返回 `null`. 当 [deep] 为 `true` 时还会深入子目录查找.\n     */\n    @Suppress(\"OVERLOADS_INTERFACE\", \"ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS\") // Keep JVM ABI\n    @JvmOverloads\n    public suspend fun resolveFileById(\n        id: String,\n        deep: Boolean = false\n    ): AbsoluteFile?\n\n    /**\n     * 根据路径获取指向的所有路径为 [path] 的文件列表. 同时支持相对路径和绝对路径. 支持获取子目录内的文件.\n     */\n    public suspend fun resolveFiles(\n        path: String\n    ): Flow<AbsoluteFile>\n\n    /**\n     * 根据路径获取指向的所有路径为 [path] 的文件列表. 同时支持相对路径和绝对路径. 支持获取子目录内的文件.\n     *\n     * 实现细节: 为了适合 Java 调用, 实现类似为阻塞式的 [resolveFiles], 因此不建议在 Kotlin 使用. 在 Kotlin 请使用 [resolveFiles].\n     */\n    @JavaFriendlyAPI\n    public suspend fun resolveFilesStream(\n        path: String\n    ): Stream<AbsoluteFile>\n\n    /**\n     * 根据路径获取指向的所有路径为 [path] 的文件和目录列表. 同时支持相对路径和绝对路径. 支持获取子目录内的文件和目录.\n     */\n    public suspend fun resolveAll(\n        path: String\n    ): Flow<AbsoluteFileFolder>\n\n    /**\n     * 根据路径获取指向的所有路径为 [path] 的文件和目录列表. 同时支持相对路径和绝对路径. 支持获取子目录内的文件和目录.\n     *\n     * 实现细节: 为了适合 Java 调用, 实现类似为阻塞式的 [resolveAll], 因此不建议在 Kotlin 使用. 在 Kotlin 请使用 [resolveAll].\n     */\n    @JavaFriendlyAPI\n    public suspend fun resolveAllStream(\n        path: String\n    ): Stream<AbsoluteFileFolder>\n\n    /**\n     * 上传一个文件到该目录, 返回上传成功的文件标识.\n     *\n     * 会在必要时尝试创建远程目录.\n     *\n     * ### [filepath]\n     *\n     * - 可以是 `foo.txt` 表示该目录下的文件 \"foo.txt\"\n     * - 也可以是 `sub/foo.txt` 表示该目录的子目录 \"sub\" 下的文件 \"foo.txt\".\n     * - 或是绝对路径 `/sub/foo.txt` 表示根目录的 \"sub\" 目录下的文件 \"foo.txt\"\n     *\n     * @param filepath 目标文件名, 即上传到远程后的远程路径, 不是本地文件路径\n     * @param content 文件内容\n     * @param callback 下载进度回调, 传递的 `progression` 是已下载字节数.\n     *\n     * @throws PermissionDeniedException 当无管理员权限时抛出 (若群仅允许管理员上传)\n     */\n    @Suppress(\"OVERLOADS_INTERFACE\", \"ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS\") // Keep JVM ABI\n    @JvmOverloads\n    public suspend fun uploadNewFile(\n        filepath: String,\n        content: ExternalResource,\n        callback: ProgressionCallback<AbsoluteFile, Long>? = null,\n    ): AbsoluteFile\n\n    public companion object {\n        /**\n         * 根目录 folder ID.\n         * @see id\n         */\n        public const val ROOT_FOLDER_ID: String = \"/\"\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/file/RemoteFiles.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmBlockingBridge\n@file:Suppress(\"OVERLOADS_INTERFACE\")\n\npackage net.mamoe.mirai.contact.file\n\nimport kotlinx.coroutines.flow.Flow\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.FileSupported\nimport net.mamoe.mirai.contact.PermissionDeniedException\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport net.mamoe.mirai.utils.ProgressionCallback\nimport kotlin.jvm.JvmOverloads\n\n/**\n * 表示远程文件列表 (管理器).\n *\n * [RemoteFiles] 包含一些协议接口,\n *\n * # 文件和目录操作\n *\n * 文件和目录的父类型是 [AbsoluteFileFolder].\n *\n * - [AbsoluteFile] 表示一个文件\n * - [AbsoluteFolder] 表示一个目录\n *\n * 每个文件或目录都拥有一个唯一 ID: [AbsoluteFileFolder.id]. 该 ID 由服务器提供, 在重命名或移动时不会变化.\n *\n * 文件名可以通过 [AbsoluteFileFolder.name] 获得, 但注意文件名和其他属性都会随重命名或移动等操作更新.\n *\n * 除根目录 [root] 外, 每个文件或目录都拥有父目录 [AbsoluteFileFolder.parent].\n *\n * # 根目录\n *\n * 除了 [RemoteFiles] 中定义的捷径外, 一切文件目录操作都以获取根目录开始. 可通过 [RemoteFiles.root] 获取表示根目录的 [AbsoluteFolder].\n *\n * # 绝对路径与相对路径\n *\n * mirai 文件系统的绝对路径与相对路径与 Java [java.io.File] 实现的相同.\n *\n * 以 `/` 起始的路径表示绝对路径, 基于根目录 [root] 处理. 其他路径均表示相对路径.\n *\n * 可由 [AbsoluteFileFolder.absolutePath] 获取其绝对路径. 值得注意的是, 所有文件与目录对象都表示绝对路径下的目标, 因此它们都总是精确地表示一个目标, 而不受环境影响.\n *\n * 除重命名外, 所有文件和目录操作都默认同时支持上述两种路径.\n *\n * # 操作 [AbsoluteFileFolder]\n *\n * ## 重命名, 移动\n *\n * [AbsoluteFileFolder.renameTo], [AbsoluteFile.moveTo] 提供重命名和移动功能. 注意目录不支持移动.\n *\n * ## 获取目录中的子目录和文件列表\n *\n * 一个目录 ([AbsoluteFolder]) 可以包含多个子文件, 根目录还可以包含多个子目录 (详见下文 '目录结构限制').\n *\n * 使用 [AbsoluteFolder.children] 可以获得其内子目录和文件列表 [Flow]. [AbsoluteFolder.childrenStream] 提供适合 Java 的 [java.util.stream.Stream] 实现.\n * 使用 [AbsoluteFolder.folders] 或 [AbsoluteFolder.files] 可以特定地只获取子目录或文件列表. 这些函数也有其 `*Stream` 实现.\n *\n * 若要根据确定的文件或目录名称获取其 [AbsoluteFileFolder] 实例, 可使用 [AbsoluteFolder.resolveFiles] 或 [AbsoluteFolder.resolveFiles].\n * 注意 [AbsoluteFolder.resolveFiles] 返回 [Flow] (其 Stream 版返回 [java.util.stream.Stream]), 因为服务器允许多个文件有相同名称. (详见下文 '允许重名').\n *\n * 若已知文件 [AbsoluteFile.id], 可通过 [AbsoluteFolder.resolveFileById] 获得该文件.\n *\n * ## 上传新文件\n * 可使用 [AbsoluteFolder.uploadNewFile] 上传新文件. 也可以通过 [RemoteFiles.uploadNewFile] 直接上传而跳过获取目录的步骤 (因为目录不允许同名).\n *\n * ## 覆盖一个旧文件\n * 服务器不允许覆盖文件. 只能通过 [AbsoluteFile.delete] 删除文件后再上传新文件. 注意新旧文件的 [AbsoluteFile.id] 会不同.\n *\n * # 操作权限\n * 操作一个目录时总是需要管理员权限. 若群设置 \"允许任何人上传文件\", 则上传文件和操作自己上传的文件时都不需要特殊权限. 注意, 操作他人的文件时总是需要管理员权限.\n *\n * # 服务器限制\n *\n * ## 目录结构限制\n *\n * 在 mirai 2.8.0 发布时, 服务器仅允许两层目录结构. 也就是说只允许根目录存在子目录, 子目录不能包含另一个子目录.\n *\n * 为了考虑将来服务器可能升级, mirai 没有做实现上的限制. mirai 所有操作都支持多层目录, 但进行这样的操作时将会得到服务器错误, 方法会抛出 [IllegalStateException].\n *\n * ## 允许重名\n *\n * 服务器允许同名目录和文件存在. 如下同名的三个文件与一个目录是允许的, 但它们的 [AbsoluteFileFolder.id] 都互不相同:\n * ```\n * foo\n *  |- test (目录)\n *  |- test (文件)\n *  |- test (文件)\n *  |- test (文件)\n * ```\n * 注意, 目录不允许同名.\n *\n * [AbsoluteFileFolder] 依据 [AbsoluteFileFolder.id] 定位文件, 而不是通过文件名. 因此 [AbsoluteFileFolder] 总是精确地代表一个文件或目录.\n *\n * @since 2.8\n * @see FileSupported\n */\n@NotStableForInheritance\npublic interface RemoteFiles {\n    /**\n     * 获取表示根目录的 [AbsoluteFolder]\n     */\n    public val root: AbsoluteFolder\n\n    /**\n     * 该对象所属 [FileSupported]\n     */\n    public val contact: FileSupported\n\n    /**\n     * 上传一个文件到指定精确路径. 返回指代该远程文件的 [AbsoluteFile].\n     *\n     * 会在必要时尝试创建远程目录.\n     *\n     * 也可以使用 [AbsoluteFolder.uploadNewFile].\n     *\n     * @param filepath 文件路径, **包含目标文件名**. 如 `/foo/bar.txt`. 若是相对目录则基于 [根目录][root] 处理.\n     * @param content 文件内容\n     * @param callback 下载进度回调, 传递的 `progression` 是已下载字节数.\n     *\n     * @throws PermissionDeniedException 当无管理员权限时抛出 (若群仅允许管理员上传)\n     */\n    @JvmOverloads\n    public suspend fun uploadNewFile(\n        filepath: String,\n        content: ExternalResource,\n        callback: ProgressionCallback<AbsoluteFile, Long>? = null,\n    ): AbsoluteFile = root.uploadNewFile(filepath, content, callback)\n}\n\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/friendgroup/FriendGroup.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.contact.friendgroup\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.Friend\nimport net.mamoe.mirai.utils.NotStableForInheritance\n\n/**\n * 一个好友分组.\n * 可能同时存在多个相同[名称][name]的分组, 但是每个分组的 [id] 都是唯一的.\n *\n *\n * 要获取一个分组, 可使用 [get] 根据 [ID][FriendGroup.id] 获取, 或者使用 [asCollection] 获取全部分组列表.\n * 也可以通过 [Friend.friendGroup] 获取一个好友所在的分组.\n *\n * 在每次登录会话中, [FriendGroup] 的实例是依据 [id] 唯一的. 存在于同一个分组中的多个好友的 [Friend.friendGroup] 会返回相同的 [FriendGroup] 实例.\n * 但当 bot 重新登录后, 实例可能变化.\n *\n * @see FriendGroups\n * @since 2.13\n */\n@JvmBlockingBridge\n@NotStableForInheritance\npublic interface FriendGroup {\n    /**\n     * 好友分组 ID\n     */\n    public val id: Int\n\n    /**\n     * 好友分组名\n     */\n    public val name: String\n\n    /**\n     * 好友分组内好友数量\n     */\n    public val count: Int\n\n    /**\n     * 属于本分组的好友集合\n     */\n    public val friends: Collection<Friend>\n\n    /**\n     * 更改好友分组名称.\n     *\n     * 允许存在同名分组.\n     * 当操作成时返回 `true`; 当分组不存在时返回 `false`; 如果因为其他原因造成的改名失败时会抛出 [IllegalStateException]\n     */\n    public suspend fun renameTo(newName: String): Boolean\n\n    /**\n     * 把一名好友移动至本分组内.\n     *\n     * 当远程分组不存在时会自动移动该好友到 ID 为 0 的默认好友分组.\n     * 当操作成功时返回 `true`; 当分组不存在 (如已经在远程被删除) 时返回 `false`; 因为其他原因移动不成功时抛出 [IllegalStateException].\n     */\n    public suspend fun moveIn(friend: Friend): Boolean\n\n    /**\n     * 删除本分组.\n     *\n     * 删除后组内全部好友移动至 ID 为 0 的默认好友分组, 本分组的好友列表会被清空.\n     * 当操作成功时返回 `true`; 当分组不存在或试图删除 ID 为 0 的默认好友分组时返回 `false`;\n     * 因为其他原因删除不成功时抛出 [IllegalStateException].\n     */\n    public suspend fun delete(): Boolean\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/friendgroup/FriendGroups.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.contact.friendgroup\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.utils.NotStableForInheritance\n\n/**\n * 好友分组列表 (管理器).\n * 允许存在重复名称的分组, 因此依赖于 name 判断不可靠, 需要依赖 ID 判断.\n *\n * @see FriendGroup\n * @since 2.13\n */\n@JvmBlockingBridge\n@NotStableForInheritance\npublic interface FriendGroups {\n    /**\n     * 获取 [ID][FriendGroup.id] 为 `0` 的默认分组 (\"我的好友\").\n     */\n    public val default: FriendGroup get() = get(0) ?: error(\"Internal error: could not find FriendGroup with id = 0.\")\n\n    /**\n     * 新建一个好友分组.\n     *\n     * 允许名称重复, 当新建一个已存在名称的分组时, 服务器会返回一个拥有重复名字的新分组;\n     * 当因为其他原因创建不成功时抛出 [IllegalStateException].\n     *\n     * 提示: 要删除一个好友分组, 使用 [FriendGroup.delete].\n     */\n    public suspend fun create(name: String): FriendGroup\n\n    /**\n     * 获取指定 ID 的好友分组, 不存在时返回 `null`\n     */\n    public operator fun get(id: Int): FriendGroup?\n\n    /**\n     * 获取包含全部 [FriendGroup] 的 [Collection]. 返回的 [Collection] 只可读取.\n     *\n     * 此方法快速返回, 不会在调用时实例化新的 [Collection] 对象.\n     * 返回的 [Collection] 是对缓存的引用, 会随着服务器通知和机器人操作 (如 [create]) 变化.\n     */\n    public fun asCollection(): Collection<FriendGroup>\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/roaming/RoamingMessageFilter.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.contact.roaming\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.message.data.MessageSource\nimport kotlin.jvm.JvmField\n\n/**\n * @since 2.8\n */\npublic fun interface RoamingMessageFilter {\n    public operator fun invoke(roamingMessage: RoamingMessage): Boolean\n\n\n    public infix fun and(other: RoamingMessageFilter): RoamingMessageFilter {\n        return RoamingMessageFilter { this.invoke(it) && other.invoke(it) }\n    }\n\n    public infix fun or(other: RoamingMessageFilter): RoamingMessageFilter {\n        return RoamingMessageFilter { this.invoke(it) || other.invoke(it) }\n    }\n\n    public fun not(): RoamingMessageFilter {\n        return RoamingMessageFilter { !this.invoke(it) }\n    }\n\n\n    public companion object {\n        /**\n         * 筛选任何消息 (相当于不筛选)\n         */\n        @JvmField\n        public val ANY: RoamingMessageFilter = RoamingMessageFilter { true }\n\n        /**\n         * 筛选 bot 接收的消息\n         */\n        @JvmField\n        public val RECEIVED: RoamingMessageFilter = RoamingMessageFilter { it.sender != it.bot.id }\n\n        /**\n         * 筛选 bot 发送的消息\n         */\n        @JvmField\n        public val SENT: RoamingMessageFilter = RoamingMessageFilter { it.sender == it.bot.id }\n    }\n}\n\n/**\n * 还未解析的漫游消息.\n *\n * @since 2.8\n */\npublic interface RoamingMessage {\n    public val contact: Contact\n    public val bot: Bot get() = contact.bot\n\n    /**\n     * 发送人 id\n     */\n    public val sender: Long\n\n    /**\n     * 收信人或群的 id\n     */\n    public val target: Long\n\n    /**\n     * 时间戳, 单位为秒, 服务器时间.\n     */\n    public val time: Long\n\n    /**\n     * @see MessageSource.ids\n     */\n    public val ids: IntArray\n\n    /**\n     * @see MessageSource.internalIds\n     */\n    public val internalIds: IntArray\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/roaming/RoamingMessages.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai.contact.roaming\n\nimport kotlinx.coroutines.flow.Flow\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.MessageSource\nimport net.mamoe.mirai.utils.JavaFriendlyAPI\nimport net.mamoe.mirai.utils.JdkStreamSupport.toStream\nimport java.util.stream.Stream\n\n/**\n * 漫游消息记录管理器. 可通过 [RoamingSupported.roamingMessages] 获得.\n *\n * @since 2.8\n * @see RoamingSupported\n */\npublic interface RoamingMessages {\n    ///////////////////////////////////////////////////////////////////////////\n    // Get list\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 查询指定时间段内的漫游消息记录. Java Stream 方法查看 [getMessagesStream].\n     *\n     * 返回查询到的漫游消息记录, 顺序为由新到旧. 这些 [MessageChain] 与从事件中收到的消息链相似, 属于在线消息.\n     * 可从 [MessageChain] 获取 [MessageSource] 来确定发送人等相关信息, 也可以进行引用回复或撤回.\n     *\n     * 注意, 返回的消息记录既包含机器人发送给目标用户的消息, 也包含目标用户发送给机器人的消息.\n     * 可通过 [MessageChain] 获取 [MessageSource] (用法为 `messageChain.source`), 判断 [MessageSource.fromId] (发送人).\n     * 消息的其他*元数据*信息也要通过 [MessageSource] 获取 (如 [MessageSource.time] 获取时间).\n     *\n     * 若只需要获取单向消息 (机器人发送给目标用户的消息或反之), 可使用 [RoamingMessageFilter.SENT] 或 [RoamingMessageFilter.RECEIVED] 作为 [filter] 参数传递.\n     *\n     * 性能提示: 请在 [filter] 执行筛选, 若 [filter] 返回 `false` 则不会解析消息链, 这对本函数的处理速度有决定性影响.\n     *\n     * @param timeStart 起始时间戳, 单位为秒. 可以为 `0`, 即表示从可以获取的最早的消息起. 负数将会被看是 `0`.\n     * @param timeEnd 结束时间戳, 单位为秒. 可以为 [Long.MAX_VALUE], 即表示到可以获取的最晚的消息为止. 低于 [timeStart] 的值将会被看作是 [timeStart] 的值.\n     * @param filter 过滤器.\n     */\n    @Suppress(\"ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS\") // Keep JVM ABI\n    public suspend fun getMessagesIn(\n        timeStart: Long,\n        timeEnd: Long,\n        filter: RoamingMessageFilter? = null\n    ): Flow<MessageChain>\n\n    /**\n     * 查询所有漫游消息记录. Java Stream 方法查看 [getAllMessagesStream].\n     *\n     * 返回查询到的漫游消息记录, 顺序为由新到旧. 这些 [MessageChain] 与从事件中收到的消息链相似, 属于在线消息.\n     * 可从 [MessageChain] 获取 [MessageSource] 来确定发送人等相关信息, 也可以进行引用回复或撤回.\n     *\n     * 注意, 返回的消息记录既包含机器人发送给目标用户的消息, 也包含目标用户发送给机器人的消息.\n     * 可通过 [MessageChain] 获取 [MessageSource] (用法为 `messageChain.source`), 判断 [MessageSource.fromId] (发送人).\n     * 消息的其他*元数据*信息也要通过 [MessageSource] 获取 (如 [MessageSource.time] 获取时间).\n     *\n     * 若只需要获取单向消息 (机器人发送给目标用户的消息或反之), 可使用 [RoamingMessageFilter.SENT] 或 [RoamingMessageFilter.RECEIVED] 作为 [filter] 参数传递.\n     *\n     * 性能提示: 请在 [filter] 执行筛选, 若 [filter] 返回 `false` 则不会解析消息链, 这对本函数的处理速度有决定性影响.\n     *\n     * @param filter 过滤器.\n     */\n    @Suppress(\"ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS\") // Keep JVM ABI\n    public suspend fun getAllMessages(\n        filter: RoamingMessageFilter? = null\n    ): Flow<MessageChain> = getMessagesIn(0, Long.MAX_VALUE, filter)\n\n    /**\n     * 查询指定时间段内的漫游消息记录. Kotlin Flow 版本查看 [getMessagesIn].\n     *\n     * 返回查询到的漫游消息记录, 顺序为由新到旧. 这些 [MessageChain] 与从事件中收到的消息链相似, 属于在线消息.\n     * 可从 [MessageChain] 获取 [MessageSource] 来确定发送人等相关信息, 也可以进行引用回复或撤回.\n     *\n     * 注意, 返回的消息记录既包含机器人发送给目标用户的消息, 也包含目标用户发送给机器人的消息.\n     * 可通过 [MessageChain] 获取 [MessageSource] (用法为 `messageChain.get(MessageSource.Key)`), 判断 [MessageSource.fromId] (发送人).\n     * 消息的其他*元数据*信息也要通过 [MessageSource] 获取 (如 [MessageSource.time] 获取时间).\n     *\n     * 若只需要获取单向消息 (机器人发送给目标用户的消息或反之), 可使用 [RoamingMessageFilter.SENT] 或 [RoamingMessageFilter.RECEIVED] 作为 [filter] 参数传递.\n     *\n     * 性能提示: 请在 [filter] 执行筛选, 若 [filter] 返回 `false` 则不会解析消息链, 这对本函数的处理速度有决定性影响.\n     *\n     * @param timeStart 起始时间戳, 单位为秒. 可以为 `0`, 即表示从可以获取的最早的消息起. 负数将会被看是 `0`.\n     * @param timeEnd 结束时间戳, 单位为秒. 可以为 [Long.MAX_VALUE], 即表示到可以获取的最晚的消息为止. 低于 [timeStart] 的值将会被看作是 [timeStart] 的值.\n     * @param filter 过滤器.\n     */\n    @Suppress(\"OVERLOADS_INTERFACE\")\n    @JvmOverloads\n    @JavaFriendlyAPI\n    public suspend fun getMessagesStream(\n        timeStart: Long,\n        timeEnd: Long,\n        filter: RoamingMessageFilter? = null\n    ): Stream<MessageChain> = getMessagesIn(timeStart, timeEnd, filter).toStream()\n\n    /**\n     * 查询所有漫游消息记录. Kotlin Flow 版本查看 [getAllMessages].\n     *\n     * 返回查询到的漫游消息记录, 顺序为由新到旧. 这些 [MessageChain] 与从事件中收到的消息链相似, 属于在线消息.\n     * 可从 [MessageChain] 获取 [MessageSource] 来确定发送人等相关信息, 也可以进行引用回复或撤回.\n     *\n     * 注意, 返回的消息记录既包含机器人发送给目标用户的消息, 也包含目标用户发送给机器人的消息.\n     * 可通过 [MessageChain] 获取 [MessageSource] (用法为 `messageChain.get(MessageSource.Key)`), 判断 [MessageSource.fromId] (发送人).\n     * 消息的其他*元数据*信息也要通过 [MessageSource] 获取 (如 [MessageSource.time] 获取时间).\n     *\n     * 若只需要获取单向消息 (机器人发送给目标用户的消息或反之), 可使用 [RoamingMessageFilter.SENT] 或 [RoamingMessageFilter.RECEIVED] 作为 [filter] 参数传递.\n     *\n     * 性能提示: 请在 [filter] 执行筛选, 若 [filter] 返回 `false` 则不会解析消息链, 这对本函数的处理速度有决定性影响.\n     *\n     * @param filter 过滤器.\n     */\n    @Suppress(\"OVERLOADS_INTERFACE\")\n    @JvmOverloads\n    @JavaFriendlyAPI\n    public suspend fun getAllMessagesStream(\n        filter: RoamingMessageFilter? = null\n    ): Stream<MessageChain> = getMessagesStream(0, Long.MAX_VALUE, filter)\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/contact/roaming/RoamingSupported.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai.contact.roaming\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.contact.Friend\n\n/**\n * 支持查询漫游消息记录的 [Contact]. 目前仅 [Friend] 实现 [RoamingSupported].\n * @since 2.8\n */\npublic interface RoamingSupported : Contact {\n    /**\n     * 获取漫游消息记录管理器.\n     */\n    public val roamingMessages: RoamingMessages\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/data/FriendInfo.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.data\n\nimport net.mamoe.mirai.LowLevelApi\n\n@LowLevelApi\npublic interface FriendInfo : UserInfo {\n    public override val uin: Long\n\n    public override val nick: String\n\n    public override var remark: String\n\n    public val friendGroupId: Int\n}\n\n\n@Deprecated(\n    \"Moved to net.mamoe.mirai.internal.contact.FriendInfoImpl. Kept for binary compatibility.\",\n    ReplaceWith(\"FriendInfoImpl\", \"net.mamoe.mirai.internal.contact.FriendInfoImpl\"),\n    level = DeprecationLevel.HIDDEN\n)\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n@LowLevelApi\npublic open class FriendInfoImpl(\n    override val uin: Long,\n    override var nick: String,\n    override var remark: String,\n) : FriendInfo {\n    override var friendGroupId: Int = 0\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/data/GroupHonorType.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"MemberVisibilityCanBePrivate\")\n\npackage net.mamoe.mirai.data\n\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.contact.active.GroupActive\nimport net.mamoe.mirai.contact.active.MemberActive\nimport net.mamoe.mirai.data.GroupHonorType.Companion.BRONZE\nimport net.mamoe.mirai.data.GroupHonorType.Companion.EMOTION\nimport net.mamoe.mirai.data.GroupHonorType.Companion.GOLDEN\nimport net.mamoe.mirai.data.GroupHonorType.Companion.LEGEND\nimport net.mamoe.mirai.data.GroupHonorType.Companion.PERFORMER\nimport net.mamoe.mirai.data.GroupHonorType.Companion.RED_PACKET\nimport net.mamoe.mirai.data.GroupHonorType.Companion.RICHER\nimport net.mamoe.mirai.data.GroupHonorType.Companion.SILVER\nimport net.mamoe.mirai.data.GroupHonorType.Companion.STRONG_NEWBIE\nimport net.mamoe.mirai.data.GroupHonorType.Companion.TALKATIVE\nimport net.mamoe.mirai.data.GroupHonorType.Companion.WHIRLWIND\nimport net.mamoe.mirai.event.events.MemberHonorChangeEvent\nimport kotlin.jvm.JvmInline\nimport kotlin.jvm.JvmStatic\n\n/**\n * 群荣誉信息\n * @property TALKATIVE 龙王\n * @property PERFORMER 群聊之火\n * @property LEGEND 群聊炽焰\n * @property STRONG_NEWBIE 冒尖小春笋\n * @property EMOTION 快乐源泉\n * @property BRONZE 学术新星\n * @property SILVER 顶尖学霸\n * @property GOLDEN 至尊学神\n * @property WHIRLWIND 一笔当先\n * @property RICHER 壕礼皇冠\n * @property RED_PACKET 善财福禄寿\n * @see GroupActive\n * @see MemberActive\n * @see MemberHonorChangeEvent\n */\n@JvmInline\n@Serializable\npublic value class GroupHonorType public constructor(public val id: Int) { // public for potential usages from Java. little compatibility burden.\n    public companion object {\n        // ID fields\n\n        /**\n         * 龙王\n         * @see TALKATIVE\n         */\n        public const val TALKATIVE_ID: Int = 1\n\n        /**\n         * 群聊之火\n         * @see PERFORMER\n         */\n        public const val PERFORMER_ID: Int = 2\n\n        /**\n         * 群聊炽焰\n         * @see LEGEND\n         */\n        public const val LEGEND_ID: Int = 3\n\n        /**\n         * 冒尖小春笋\n         * @see STRONG_NEWBIE\n         */\n        public const val STRONG_NEWBIE_ID: Int = 4\n\n        /**\n         * 快乐源泉\n         * @see EMOTION\n         */\n        public const val EMOTION_ID: Int = 5\n\n        /**\n         * 学术新星\n         * @see BRONZE\n         */\n        public const val BRONZE_ID: Int = 6\n\n        /**\n         * 顶尖学霸\n         * @see SILVER\n         */\n        public const val SILVER_ID: Int = 7\n\n        /**\n         * 至尊学神\n         * @see GOLDEN\n         */\n        public const val GOLDEN_ID: Int = 8\n\n        /**\n         * 一笔当先\n         * @see WHIRLWIND\n         */\n        public const val WHIRLWIND_ID: Int = 9\n\n        /**\n         * 壕礼皇冠\n         * @see RICHER\n         */\n        public const val RICHER_ID: Int = 10\n\n        /**\n         * 善财福禄寿\n         * @see RED_PACKET\n         */\n        public const val RED_PACKET_ID: Int = 11\n\n        // Inline class 'instance's, invisible from Java.\n\n        /**\n         * 龙王\n         */\n        @JvmStatic\n        public val TALKATIVE: GroupHonorType = GroupHonorType(TALKATIVE_ID)\n\n        /**\n         * 群聊之火\n         */\n        @JvmStatic\n        public val PERFORMER: GroupHonorType = GroupHonorType(PERFORMER_ID)\n\n        /**\n         * 群聊炽焰\n         */\n        @JvmStatic\n        public val LEGEND: GroupHonorType = GroupHonorType(LEGEND_ID)\n\n        /**\n         * 冒尖小春笋\n         */\n        @JvmStatic\n        public val STRONG_NEWBIE: GroupHonorType = GroupHonorType(STRONG_NEWBIE_ID)\n\n        /**\n         * 快乐源泉\n         */\n        @JvmStatic\n        public val EMOTION: GroupHonorType = GroupHonorType(EMOTION_ID)\n\n        /**\n         * 学术新星\n         */\n        @JvmStatic\n        public val BRONZE: GroupHonorType = GroupHonorType(BRONZE_ID)\n\n        /**\n         * 顶尖学霸\n         */\n        @JvmStatic\n        public val SILVER: GroupHonorType = GroupHonorType(SILVER_ID)\n\n        /**\n         * 至尊学神\n         */\n        @JvmStatic\n        public val GOLDEN: GroupHonorType = GroupHonorType(GOLDEN_ID)\n\n        /**\n         * 一笔当先\n         */\n        @JvmStatic\n        public val WHIRLWIND: GroupHonorType = GroupHonorType(WHIRLWIND_ID)\n\n        /**\n         * 壕礼皇冠\n         */\n        @JvmStatic\n        public val RICHER: GroupHonorType = GroupHonorType(RICHER_ID)\n\n        /**\n         * 善财福禄寿\n         */\n        @JvmStatic\n        public val RED_PACKET: GroupHonorType = GroupHonorType(RED_PACKET_ID)\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/data/GroupInfo.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.data\n\nimport net.mamoe.mirai.LowLevelApi\n\n/**\n * 群资料.\n */\n@LowLevelApi\npublic interface GroupInfo {\n    /**\n     * Uin\n     */\n    public val uin: Long\n\n    /**\n     * 群号码\n     */ // 由 uin 计算得到\n    public val groupCode: Long\n\n    /**\n     * 名称\n     */\n    public val name: String // 不一定能获取到\n\n    /**\n     * 群主\n     */\n    public val owner: Long // 不一定能获取到\n\n    /**\n     * 入群公告\n     */\n    public val memo: String // 不一定能获取到\n\n    /**\n     * 允许群员邀请其他人加入群\n     */\n    public val allowMemberInvite: Boolean\n\n    /**\n     * 允许匿名聊天\n     */\n    public val allowAnonymousChat: Boolean\n\n    /**\n     * 自动审批加群请求\n     */\n    public val autoApprove: Boolean\n\n    /**\n     * 坦白说开启状态\n     */\n    public val confessTalk: Boolean\n\n    /**\n     * 全员禁言\n     */\n    public val muteAll: Boolean\n\n    /**\n     * 机器人被禁言还剩时间, 秒.\n     */\n    public val botMuteTimestamp: Int\n\n    /**\n     * 荣誉是否显示\n     * @since 2.13\n     */\n    public val isHonorVisible: Boolean\n\n    /**\n     * 头衔是否显示\n     * @since 2.13\n     */\n    public val isTitleVisible: Boolean\n\n    /**\n     * 活跃度是否显示\n     * @since 2.13\n     */\n    public val isTemperatureVisible: Boolean\n\n    /**\n     * 等级头衔\n     * @since 2.13\n     */\n    public val rankTitles: Map<Int, String>\n\n    /**\n     * 活跃度头衔\n     * @since 2.13\n     */\n    public val temperatureTitles: Map<Int, String>\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/data/MemberInfo.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.data\n\nimport net.mamoe.mirai.LowLevelApi\nimport net.mamoe.mirai.contact.MemberPermission\n\n@LowLevelApi\npublic interface MemberInfo : UserInfo {\n    public val nameCard: String\n\n    public val permission: MemberPermission\n\n    public val specialTitle: String\n\n    public val muteTimestamp: Int\n\n    public val anonymousId: String? get() = null\n\n    /**\n     * 入群时间 秒\n     */\n    public val joinTimestamp: Int\n\n    /**\n     * 上次发言时间 秒\n     */\n    public val lastSpeakTimestamp: Int\n\n    /**\n     * 是否为官方机器人\n     */\n    public val isOfficialBot: Boolean\n\n    /**\n     * 活跃等级\n     * @see point\n     * @since 2.13\n     */\n    public val rank: Int\n\n    /**\n     * 活跃积分\n     * @see rank\n     * @since 2.13\n     */\n    public val point: Int\n\n    /**\n     * 群荣誉标志\n     * @since 2.13\n     */\n    public val honors: Set<GroupHonorType>\n\n    /**\n     * 活跃度\n     * @since 2.13\n     */\n    public val temperature: Int\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/data/OnlineStatus.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.data\n\n/**\n * 在线状态\n */\npublic enum class OnlineStatus(public val id: Int) {\n    /**\n     * 我在线上\n     */\n    ONLINE(11),\n\n    /**\n     * 离线\n     */\n    OFFLINE(21),\n\n    /**\n     * 离开\n     */\n    AWAY(31),\n\n    /**\n     * 隐身\n     */\n    INVISIBLE(41),\n\n    /**\n     * 忙碌\n     */\n    BUSY(50),\n\n    /**\n     * Q 我吧\n     */\n    Q_ME(60),\n\n    /**\n     * 请勿打扰\n     */\n    DND(70),\n\n    /**\n     * 离线但接收消息\n     */\n    RECEIVE_OFFLINE_MESSAGE(95),\n\n    /**\n     * 解析错误等\n     */\n    UNKNOWN(-1);\n\n    public companion object {\n        public fun ofId(id: Int): OnlineStatus = values().first { it.id == id }\n        public fun ofIdOrNull(id: Int): OnlineStatus? = values().firstOrNull { it.id == id }\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/data/Profile.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"EXPERIMENTAL_API_USAGE\")\n\npackage net.mamoe.mirai.data\n\n/*\n/**\n * 个人资料\n */\n@MiraiExperimentalAPI\n@Suppress(\"PropertyName\")\ndata class Profile(\n    val qq: Long,\n    val nickname: String,\n    val englishName: String?,\n    val chineseName: String?,\n    val qAge: Int?, // q 龄\n    val zipCode: String?,\n    val phone: String?,\n    val gender: Gender,\n    val birthday: GMTDate?,\n    val personalStatement: String?,// 个人说明\n    val school: String?,\n    val homepage: String?,\n    val email: String?,\n    val company: String?\n) {\n\n    override fun toString(): String = \"Profile(qq=$qq, \" +\n            \"nickname=$nickname, \" +\n            \"gender=$gender, \" +\n            (englishName?.let { \"englishName=$englishName, \" } ?: \"\") +\n            (chineseName?.let { \"chineseName=$chineseName, \" } ?: \"\") +\n            (qAge?.toString()?.let { \"qAge=$qAge, \" } ?: \"\") +\n            (zipCode?.let { \"zipCode=$zipCode, \" } ?: \"\") +\n            (phone?.let { \"phone=$phone, \" } ?: \"\") +\n            (birthday?.toString()?.let { \"birthday=$birthday, \" } ?: \"\") +\n            (personalStatement?.let { \"personalStatement=$personalStatement, \" } ?: \"\") +\n            (school?.let { \"school=$school, \" } ?: \"\") +\n            (homepage?.let { \"homepage=$homepage, \" } ?: \"\") +\n            (email?.let { \"email=$email, \" } ?: \"\") +\n            (company?.let { \"company=$company,\" } ?: \"\") +\n            \")\"// 最终会是 \", )\", 但这并不影响什么.\n}\n\n/**\n * 性别\n */\n@MiraiExperimentalAPI\nenum class Gender(val value: Byte) {\n    SECRET(0),\n    MALE(1),\n    FEMALE(2)\n}*/"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/data/RequestEventData.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.data\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.LowLevelApi\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.event.events.BotInvitedJoinGroupRequestEvent\nimport net.mamoe.mirai.event.events.MemberJoinRequestEvent\nimport net.mamoe.mirai.event.events.NewFriendRequestEvent\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmOverloads\nimport kotlin.jvm.JvmStatic\n\n@Serializable\n@SerialName(\"RequestEventData\")\npublic sealed class RequestEventData {\n    public abstract val eventId: Long\n\n    @JvmBlockingBridge\n    public abstract suspend fun accept(bot: Bot)\n\n    @JvmBlockingBridge\n    public abstract suspend fun reject(bot: Bot)\n\n    @Serializable\n    @SerialName(\"NewFriendRequest\")\n    public class NewFriendRequest\n    @MiraiExperimentalApi public constructor(\n        override val eventId: Long,\n\n        public val requester: Long,\n        public val requesterNick: String,\n\n        public val fromGroupId: Long,\n\n        public val message: String,\n    ) : RequestEventData() {\n        @OptIn(LowLevelApi::class)\n        override suspend fun accept(bot: Bot) {\n            Mirai.solveNewFriendRequestEvent(\n                bot,\n                eventId = eventId,\n                fromId = requester,\n                fromNick = requesterNick,\n                accept = true,\n                blackList = false,\n            )\n        }\n\n        override suspend fun reject(bot: Bot) {\n            reject(bot, false)\n        }\n\n        @JvmBlockingBridge\n        @OptIn(LowLevelApi::class)\n        public suspend fun reject(bot: Bot, blackList: Boolean) {\n            Mirai.solveNewFriendRequestEvent(\n                bot,\n                eventId = eventId,\n                fromId = requester,\n                fromNick = requesterNick,\n                accept = false,\n                blackList = blackList,\n            )\n        }\n\n        override fun toString(): String {\n            return \"NewFriendRequest(eventId=$eventId, fromGroupId=$fromGroupId, message=$message, requester=$requester, requesterNick=$requesterNick)\"\n        }\n    }\n\n    @Serializable\n    @SerialName(\"BotInvitedJoinGroupRequest\")\n    public class BotInvitedJoinGroupRequest\n    @MiraiExperimentalApi public constructor(\n        override val eventId: Long,\n\n        public val invitor: Long,\n        public val invitorNick: String,\n\n        public val groupId: Long,\n        public val groupName: String,\n    ) : RequestEventData() {\n        override suspend fun accept(bot: Bot) {\n            @OptIn(LowLevelApi::class)\n            Mirai.solveBotInvitedJoinGroupRequestEvent(\n                bot,\n                eventId = eventId,\n                invitorId = invitor,\n                groupId = groupId,\n                accept = true,\n            )\n        }\n\n        override suspend fun reject(bot: Bot) {\n            @OptIn(LowLevelApi::class)\n            Mirai.solveBotInvitedJoinGroupRequestEvent(\n                bot,\n                eventId = eventId,\n                invitorId = invitor,\n                groupId = groupId,\n                accept = false,\n            )\n        }\n\n        override fun toString(): String {\n            return \"BotInvitedJoinGroupRequest(eventId=$eventId, invitor=$invitor, invitorNick='$invitorNick', groupId=$groupId, groupName='$groupName')\"\n        }\n\n    }\n\n    @Serializable\n    @SerialName(\"MemberJoinRequest\")\n    public class MemberJoinRequest\n    @MiraiExperimentalApi public constructor(\n        override val eventId: Long,\n\n        public val requester: Long,\n        public val requesterNick: String,\n\n        public val groupId: Long,\n        public val groupName: String,\n        public val invitor: Long = 0L, // 如果不为 0 则为邀请入群\n\n        public val message: String,\n    ) : RequestEventData() {\n        override suspend fun accept(bot: Bot) {\n            @OptIn(LowLevelApi::class)\n            Mirai.solveMemberJoinRequestEvent(\n                bot,\n                eventId = eventId,\n                fromId = requester,\n                fromNick = requesterNick,\n                groupId = groupId,\n                accept = true,\n                blackList = false,\n                message = \"\",\n            )\n        }\n\n        override suspend fun reject(bot: Bot) {\n            reject(bot, false)\n        }\n\n        @JvmBlockingBridge\n        public suspend fun reject(bot: Bot, message: String) {\n            reject(bot, false, message)\n        }\n\n        @JvmBlockingBridge\n        @JvmOverloads\n        public suspend fun reject(bot: Bot, blackList: Boolean, message: String = \"\") {\n            @OptIn(LowLevelApi::class)\n            Mirai.solveMemberJoinRequestEvent(\n                bot,\n                eventId = eventId,\n                fromId = requester,\n                fromNick = requesterNick,\n                groupId = groupId,\n                accept = false,\n                blackList = blackList,\n                message = message,\n            )\n        }\n\n        override fun toString(): String {\n            return \"MemberJoinRequest(eventId=$eventId, groupId=$groupId, groupName=$groupName, invitor=$invitor, message=$message, requester=$requester, requesterNick=$requesterNick)\"\n        }\n\n    }\n\n\n    public companion object Factory {\n        @JvmStatic\n        @JvmName(\"from\")\n        public fun NewFriendRequestEvent.toRequestEventData(): NewFriendRequest {\n            @OptIn(MiraiExperimentalApi::class)\n            return NewFriendRequest(\n                eventId = eventId,\n                message = message,\n                requester = fromId,\n                requesterNick = fromNick,\n                fromGroupId = fromGroupId,\n            )\n        }\n\n        @JvmStatic\n        @JvmName(\"from\")\n        public fun BotInvitedJoinGroupRequestEvent.toRequestEventData(): BotInvitedJoinGroupRequest {\n            @OptIn(MiraiExperimentalApi::class)\n            return BotInvitedJoinGroupRequest(\n                eventId = eventId,\n                invitor = invitorId,\n                invitorNick = invitorNick,\n                groupId = groupId,\n                groupName = groupName,\n            )\n        }\n\n        @JvmStatic\n        @JvmName(\"from\")\n        public fun MemberJoinRequestEvent.toRequestEventData(): MemberJoinRequest {\n            @OptIn(MiraiExperimentalApi::class)\n            return MemberJoinRequest(\n                eventId = eventId,\n                requester = fromId,\n                requesterNick = fromNick,\n                groupId = groupId,\n                groupName = groupName,\n                invitor = invitorId ?: 0L,\n                message = message,\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/data/StrangerInfo.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.data\n\nimport net.mamoe.mirai.LowLevelApi\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\n\n@OptIn(MiraiExperimentalApi::class)\n@LowLevelApi\npublic interface StrangerInfo : UserInfo {\n    /**\n     * 陌生人的QQ号码\n     */\n    public override val uin: Long\n\n    /**\n     * 陌生人的昵称\n     *\n     */\n    public override val nick: String\n\n    /**\n     * 陌生人来源的群\n     *\n     * 当不是来源于群时为0\n     */\n    public val fromGroup: Long\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/data/UserInfo.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.data\n\nimport net.mamoe.mirai.LowLevelApi\n\n@LowLevelApi\npublic interface UserInfo {\n    public val uin: Long\n\n    public val nick: String\n\n    public val remark: String\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/data/UserProfile.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.data\n\nimport net.mamoe.mirai.contact.User\nimport net.mamoe.mirai.utils.NotStableForInheritance\n\n/**\n * 用户详细资料\n *\n * @see User.queryProfile\n * @suppress 使用这个接口是稳定的，但继承不稳定。将来可能会有新的属性添加。\n * @since 2.1\n */\n@NotStableForInheritance\npublic interface UserProfile {\n    public val nickname: String\n    public val email: String\n    public val age: Int\n    public val qLevel: Int\n    public val sex: Sex\n\n    /**\n     * 好友分组 ID, 在非好友情况下或者位于默认分组情况下为 `0`\n     *\n     * @since 2.13\n     */\n    public val friendGroupId: Int\n\n    /**\n     * 个性签名\n     */\n    public val sign: String\n\n    public enum class Sex {\n        MALE,\n        FEMALE,\n\n        /** 保密 */\n        UNKNOWN;\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/Event.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.event\n\nimport kotlinx.coroutines.sync.Mutex\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.IMirai\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport kotlin.jvm.JvmField\nimport kotlin.jvm.Volatile\n\n/**\n * 表示一个事件.\n *\n * 实现时应继承 [AbstractEvent] 而不要直接实现 [Event]. 否则将无法广播.\n *\n * ## 广播事件\n *\n * 使用 [Event.broadcast] 或 [IMirai.broadcastEvent].\n *\n * Kotlin:\n * ```\n * val event: Event = ...\n * event.broadcast()\n * ```\n *\n * Java:\n * ```\n * Event event = ...;\n * Mirai.getInstance().broadcastEvent(event);\n * ```\n *\n * ## 监听事件\n *\n * 参阅 [EventChannel].\n *\n * @see CancellableEvent 可被取消的事件\n */\npublic interface Event {\n    /**\n     * 事件是否已被拦截.\n     *\n     * 所有事件都可以被拦截, 拦截后低优先级的监听器将不会处理到这个事件.\n     *\n     * @see intercept 拦截事件\n     */\n    public val isIntercepted: Boolean\n\n    /**\n     * 拦截这个事件\n     *\n     * 当事件被 [拦截][Event.intercept] 后, 优先级较低 (靠右) 的监听器将不会被调用.\n     *\n     * 优先级为 [EventPriority.MONITOR] 的监听器不应该调用这个函数.\n     *\n     * @see EventPriority 查看优先级相关信息\n     */\n    public fun intercept()\n}\n\n/**\n * 所有实现了 [Event] 接口的类都应该继承的父类.\n *\n * 在使用事件时应使用类型 [Event]. 在实现自定义事件时应继承 [AbstractEvent].\n */\npublic abstract class AbstractEvent : Event {\n    /** 限制一个事件实例不能并行广播. (适用于 object 广播的情况) */\n    @JvmField\n    @MiraiInternalApi\n    public val broadCastLock: Mutex = Mutex()\n\n    @Suppress(\"PropertyName\")\n    @JvmField\n    @Volatile\n    @MiraiInternalApi\n    public var _intercepted: Boolean = false\n\n    @Volatile\n    private var _cancelled = false\n\n    // 实现 Event\n    /**\n     * @see Event.isIntercepted\n     */\n    public override val isIntercepted: Boolean\n        get() {\n            @OptIn(MiraiInternalApi::class)\n            return _intercepted\n        }\n\n    /**\n     * @see Event.intercept\n     */\n    public override fun intercept() {\n        @OptIn(MiraiInternalApi::class)\n        _intercepted = true\n    }\n\n    // 实现 CancellableEvent\n    /**\n     * @see CancellableEvent.isCancelled\n     */\n    public val isCancelled: Boolean get() = _cancelled\n\n    /**\n     * @see CancellableEvent.cancel\n     * @throws IllegalStateException 当事件未实现接口 [CancellableEvent] 时抛出\n     */\n    public fun cancel() {\n        check(this is CancellableEvent) {\n            \"Event $this is not cancellable\"\n        }\n        _cancelled = true\n    }\n}\n\n/**\n * 可被取消的事件\n */\npublic interface CancellableEvent : Event {\n    /**\n     * 事件是否已被取消.\n     *\n     * 事件需实现 [CancellableEvent] 接口才可以被取消,\n     * 否则此属性固定返回 false.\n     */\n    public val isCancelled: Boolean\n\n    /**\n     * 取消这个事件.\n     * 事件需实现 [CancellableEvent] 接口才可以被取消\n     */\n    public fun cancel()\n}\n\n/**\n * 广播一个事件的唯一途径.\n *\n * 当事件被实现为 Kotlin `object` 时, 同一时刻只能有一个 [广播][broadcast] 存在.\n * 较晚执行的 [广播][broadcast] 将会挂起协程并等待之前的广播任务结束.\n *\n * ## 异常处理\n *\n * 作为广播方, 本函数不会抛出监听方产生的异常.\n *\n * [EventChannel.filter] 和 [Listener.onEvent] 时产生的异常只会由监听方处理.\n */\n@JvmBlockingBridge\n@Suppress(\"TOP_LEVEL_FUNCTIONS_NOT_SUPPORTED\") // compiler bug\npublic suspend fun <E : Event> E.broadcast(): E {\n    Mirai.broadcastEvent(this)\n    return this\n}\n\n/**\n * 可控制是否需要广播这个事件\n */\npublic interface BroadcastControllable : Event {\n    /**\n     * 返回 `false` 时将不会广播这个事件.\n     */\n    public val shouldBroadcast: Boolean\n        get() = true\n}\n\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/EventChannel.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"EventChannelKt\")\n\npackage net.mamoe.mirai.event\n\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.channels.ClosedSendChannelException\nimport kotlinx.coroutines.channels.SendChannel\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.SharedFlow\nimport kotlinx.coroutines.flow.filter\nimport kotlinx.coroutines.sync.Mutex\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.IMirai\nimport net.mamoe.mirai.event.ConcurrencyKind.CONCURRENT\nimport net.mamoe.mirai.event.ConcurrencyKind.LOCKED\nimport net.mamoe.mirai.event.events.BotEvent\nimport net.mamoe.mirai.internal.event.JvmMethodListenersInternal\nimport net.mamoe.mirai.utils.*\nimport java.util.function.Consumer\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\nimport kotlin.reflect.KClass\n\n/**\n * 事件通道.\n *\n * 事件通道是监听事件的入口, 但不负责广播事件. 要广播事件, 使用 [Event.broadcast] 或 [IMirai.broadcastEvent].\n *\n * ## 获取事件通道\n *\n * [EventChannel] 不可自行构造, 只能通过 [GlobalEventChannel], [BotEvent], 或基于一个通道的过滤等操作获得.\n *\n * ### 全局事件通道\n *\n * [GlobalEventChannel] 是单例对象, 表示全局事件通道, 可以获取到在其中广播的所有事件.\n *\n * ### [BotEvent] 事件通道\n *\n * 若只需要监听某个 [Bot] 的事件, 可通过 [Bot.eventChannel] 获取到这样的 [EventChannel].\n *\n * ## 通道操作\n *\n * ### 对通道的操作\n * - 过滤通道: 通过 [EventChannel.filter]. 例如 `filter { it is BotEvent }` 得到一个只能监听到 [BotEvent] 的事件通道.\n * - 转换为 Kotlin 协程 [Channel]: [EventChannel.forwardToChannel]\n * - 添加 [CoroutineContext]: [context], [parentJob], [parentScope], [exceptionHandler]\n *\n * ### 创建事件监听\n * - [EventChannel.subscribe] 创建带条件的一个事件监听器.\n * - [EventChannel.subscribeAlways] 创建一个总是监听事件的事件监听器.\n * - [EventChannel.subscribeOnce] 创建一个只监听单次的事件监听器.\n *\n * ### 监听器生命周期\n *\n * 阅读 [EventChannel.subscribe] 以获取监听器生命周期相关信息.\n *\n * ## 与 kotlinx-coroutines 交互\n *\n * mirai [EventChannel] 设计比 kotlinx-coroutines 的 [Flow] 稳定版更早.\n * [EventChannel] 的功能与 [Flow] 类似, 不过 [EventChannel] 在 [subscribe] (类似 [Flow.collect]) 时有优先级判定, 也允许[拦截][Event.intercept].\n *\n * ### 通过 [Flow] 接收事件\n *\n * 使用 [EventChannel.asFlow] 获得 [Flow], 然后可使用 [Flow.collect] 等操作.\n *\n * ### 转发事件到 [SendChannel]\n *\n * 使用 [EventChannel.forwardToChannel] 可将事件转发到指定 [SendChannel].\n */\n@NotStableForInheritance // since 2.12, before it was `final class`.\npublic abstract class EventChannel<out BaseEvent : Event> @MiraiInternalApi public constructor(\n    public val baseEventClass: KClass<out BaseEvent>,\n    /**\n     * 此事件通道的默认 [CoroutineScope.coroutineContext]. 将会被添加给所有注册的事件监听器.\n     */\n    public val defaultCoroutineContext: CoroutineContext,\n) {\n    /**\n     * 创建事件监听并将监听结果转发到 [channel]. 当 [Channel.send] 抛出 [ClosedSendChannelException] 时停止 [Listener] 监听和转发.\n     *\n     * 返回创建的会转发监听到的所有事件到 [channel] 的[事件监听器][Listener]. [停止][Listener.complete] 该监听器会停止转发, 不会影响目标 [channel].\n     *\n     * 若 [Channel.send] 挂起, 则监听器也会挂起, 也就可能会导致事件广播过程挂起.\n     *\n     * 示例:\n     *\n     * ```\n     * val eventChannel: EventChannel<BotEvent> = ...\n     * val channel = Channel<BotEvent>() // kotlinx.coroutines.channels.Channel\n     * eventChannel.forwardToChannel(channel, priority = ...)\n     *\n     * // 其他地方\n     * val event: BotEvent = channel.receive() // 挂起并接收一个事件\n     * ```\n     *\n     * @see subscribeAlways\n     * @see Channel\n     * @since 2.10\n     */\n    public fun forwardToChannel(\n        channel: SendChannel<@UnsafeVariance BaseEvent>,\n        coroutineContext: CoroutineContext = EmptyCoroutineContext,\n        priority: EventPriority = EventPriority.MONITOR,\n    ): Listener<@UnsafeVariance BaseEvent> {\n        return subscribe(baseEventClass, coroutineContext, priority = priority) {\n            try {\n                channel.send(it)\n                ListeningStatus.LISTENING\n            } catch (_: ClosedSendChannelException) {\n                ListeningStatus.STOPPED\n            }\n        }\n    }\n\n    /**\n     * 通过 [Flow] 接收此通道内的所有事件.\n     *\n     * ```\n     * val eventChannel: EventChannel<BotEvent> = ...\n     * val flow: Flow<BotEvent> = eventChannel.asFlow()\n     *\n     * flow.collect { // it\n     *   //\n     * }\n     *\n     * flow.filterIsInstance<GroupMessageEvent>.collect { // it: GroupMessageEvent\n     *   // 处理事件 ...\n     * }\n     *\n     * flow.filterIsInstance<FriendMessageEvent>.collect { // it: FriendMessageEvent\n     *   // 处理事件 ...\n     * }\n     * ```\n     *\n     * 类似于 [SharedFlow], [EventChannel.asFlow] 返回的 [Flow] 永远都不会停止. 因此上述示例 [Flow.collect] 永远都不会正常 (以抛出异常之外的) 结束.\n     *\n     * 通过 [asFlow] 接收事件相当于通过 [subscribeAlways] 以 [EventPriority.MONITOR] 监听事件.\n     *\n     * **注意**: [context], [parentJob] 等控制 [EventChannel.defaultCoroutineContext] 的操作对 [asFlow] 无效. 因为 [asFlow] 并不创建协程.\n     *\n     * @see Flow\n     * @since 2.12\n     */\n    public abstract fun asFlow(): Flow<BaseEvent>\n\n    // region transforming operations\n\n    /**\n     * 添加一个过滤器. 过滤器将在收到任何事件之后, 传递给通过 [EventChannel.subscribe] 注册的监听器之前调用.\n     *\n     * 若 [filter] 返回 `true`, 该事件将会被传给监听器. 否则将会被忽略, **监听器继续监听**.\n     *\n     * ## 线性顺序\n     * 多个 [filter] 的处理是线性且有顺序的. 若一个 [filter] 已经返回了 `false` (代表忽略这个事件), 则会立即忽略, 而不会传递给后续过滤器.\n     *\n     * 示例:\n     * ```\n     * GlobalEventChannel // GlobalEventChannel 会收到全局所有事件, 事件类型是 Event\n     *     .filterIsInstance<BotEvent>() // 过滤, 只接受 BotEvent\n     *     .filter { event: BotEvent ->\n     *         // 此时的 event 一定是 BotEvent\n     *         event.bot.id == 123456 // 再过滤 event 的 bot.id\n     *     }\n     *     .subscribeAlways { event: BotEvent ->\n     *         // 现在 event 是 BotEvent, 且 bot.id == 123456\n     *     }\n     * ```\n     *\n     * ## 过滤器挂起\n     * [filter] 允许挂起协程. **过滤器的挂起将被认为是事件监听器的挂起**.\n     *\n     * 过滤器挂起是否会影响事件处理,\n     * 取决于 [subscribe] 时的 [ConcurrencyKind] 和 [EventPriority].\n     *\n     * ## 过滤器异常处理\n     * 若 [filter] 抛出异常, 将被包装为 [ExceptionInEventChannelFilterException] 并重新抛出.\n     *\n     * @see filterIsInstance 过滤指定类型的事件\n     */\n    @JvmSynthetic\n    public fun filter(filter: suspend (event: BaseEvent) -> Boolean): EventChannel<BaseEvent> {\n        return FilterEventChannel(this, filter)\n    }\n\n    /**\n     * [EventChannel.filter] 的 Java 版本.\n     *\n     * 添加一个过滤器. 过滤器将在收到任何事件之后, 传递给通过 [EventChannel.subscribe] 注册的监听器之前调用.\n     *\n     * 若 [filter] 返回 `true`, 该事件将会被传给监听器. 否则将会被忽略, **监听器继续监听**.\n     *\n     * ## 线性顺序\n     * 多个 [filter] 的处理是线性且有顺序的. 若一个 [filter] 已经返回了 `false` (代表忽略这个事件), 则会立即忽略, 而不会传递给后续过滤器.\n     *\n     * 示例:\n     * ```\n     * GlobalEventChannel // GlobalEventChannel 会收到全局所有事件, 事件类型是 Event\n     *     .filterIsInstance(BotEvent.class) // 过滤, 只接受 BotEvent\n     *     .filter(event ->\n     *         // 此时的 event 一定是 BotEvent\n     *         event.bot.id == 123456 // 再过滤 event 的 bot.id\n     *     )\n     *     .subscribeAlways(event -> {\n     *         // 现在 event 是 BotEvent, 且 bot.id == 123456\n     *     })\n     * ```\n     *\n     * ## 过滤器阻塞\n     * [filter] 允许阻塞线程. **过滤器的阻塞将被认为是事件监听器的阻塞**.\n     *\n     * 过滤器阻塞是否会影响事件处理,\n     * 取决于 [subscribe] 时的 [ConcurrencyKind] 和 [EventPriority].\n     *\n     * ## 过滤器异常处理\n     * 若 [filter] 抛出异常, 将被包装为 [ExceptionInEventChannelFilterException] 并重新抛出.\n     *\n     * @see filterIsInstance 过滤指定类型的事件\n     *\n     * @since 2.2\n     */\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n    @kotlin.internal.LowPriorityInOverloadResolution\n    public fun filter(filter: (event: BaseEvent) -> Boolean): EventChannel<BaseEvent> {\n        return filter { runBIO { filter(it) } }\n    }\n\n    /**\n     * 过滤事件的类型. 返回一个只包含 [E] 类型事件的 [EventChannel]\n     * @see filter 获取更多信息\n     */\n    @JvmSynthetic\n    public inline fun <reified E : Event> filterIsInstance(): EventChannel<E> =\n        filterIsInstance(E::class)\n\n    /**\n     * 过滤事件的类型. 返回一个只包含 [E] 类型事件的 [EventChannel]\n     * @see filter 获取更多信息\n     */\n    public fun <E : Event> filterIsInstance(kClass: KClass<out E>): EventChannel<E> {\n        return filter { kClass.isInstance(it) }.cast()\n    }\n\n    /**\n     * 过滤事件的类型. 返回一个只包含 [E] 类型事件的 [EventChannel]\n     * @see filter 获取更多信息\n     */\n    public fun <E : Event> filterIsInstance(clazz: Class<out E>): EventChannel<E> =\n        filterIsInstance(clazz.kotlin)\n\n\n    /**\n     * 创建一个新的 [EventChannel], 该 [EventChannel] 包含 [`this.coroutineContext`][defaultCoroutineContext] 和添加的 [coroutineContexts].\n     * [coroutineContexts] 会覆盖 [defaultCoroutineContext] 中的重复元素.\n     *\n     * 此操作不会修改 [`this.coroutineContext`][defaultCoroutineContext], 只会创建一个新的 [EventChannel].\n     */\n    public abstract fun context(vararg coroutineContexts: CoroutineContext): EventChannel<BaseEvent>\n\n    /**\n     * 创建一个新的 [EventChannel], 该 [EventChannel] 包含 [this.coroutineContext][defaultCoroutineContext] 和添加的 [coroutineExceptionHandler]\n     * @see context\n     */\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n    @kotlin.internal.LowPriorityInOverloadResolution\n    public fun exceptionHandler(coroutineExceptionHandler: CoroutineExceptionHandler): EventChannel<BaseEvent> {\n        return context(coroutineExceptionHandler)\n    }\n\n    /**\n     * 创建一个新的 [EventChannel], 该 [EventChannel] 包含 [`this.coroutineContext`][defaultCoroutineContext] 和添加的 [coroutineExceptionHandler]\n     * @see context\n     */\n    public fun exceptionHandler(coroutineExceptionHandler: (exception: Throwable) -> Unit): EventChannel<BaseEvent> {\n        return context(CoroutineExceptionHandler { _, throwable ->\n            coroutineExceptionHandler(throwable)\n        })\n    }\n\n    /**\n     * 创建一个新的 [EventChannel], 该 [EventChannel] 包含 [`this.coroutineContext`][defaultCoroutineContext] 和添加的 [coroutineExceptionHandler]\n     * @see context\n     * @since 2.12\n     */\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n    @kotlin.internal.LowPriorityInOverloadResolution\n    public fun exceptionHandler(coroutineExceptionHandler: Consumer<Throwable>): EventChannel<BaseEvent> {\n        return exceptionHandler { coroutineExceptionHandler.accept(it) }\n    }\n\n    /**\n     * 将 [coroutineScope] 作为这个 [EventChannel] 的父作用域.\n     *\n     * 实际作用为创建一个新的 [EventChannel],\n     * 该 [EventChannel] 包含 [`this.coroutineContext`][defaultCoroutineContext] 和添加的 [CoroutineScope.coroutineContext],\n     * 并以 [CoroutineScope] 中 [Job] (如果有) [作为父 Job][parentJob]\n     *\n     * @see parentJob\n     * @see context\n     *\n     * @see CoroutineScope.globalEventChannel `GlobalEventChannel.parentScope()` 的扩展\n     */\n    public fun parentScope(coroutineScope: CoroutineScope): EventChannel<BaseEvent> {\n        return context(coroutineScope.coroutineContext)\n    }\n\n    /**\n     * 指定协程父 [Job]. 之后在此 [EventChannel] 下创建的事件监听器都会成为 [job] 的子任务, 当 [job] 被取消时, 所有的事件监听器都会被取消.\n     *\n     * 注意: 监听器不会失败 ([Job.cancel]). 监听器处理过程的异常都会被捕获然后交由 [CoroutineExceptionHandler] 处理, 因此 [job] 不会因为子任务监听器的失败而被取消.\n     *\n     * @see parentScope\n     * @see context\n     */\n    public fun parentJob(job: Job): EventChannel<BaseEvent> {\n        return context(job)\n    }\n\n    // endregion\n\n    // region subscribe\n\n    /**\n     * 创建一个事件监听器, 监听事件通道中所有 [E] 及其子类事件.\n     *\n     * 每当 [事件广播][Event.broadcast] 时, [handler] 都会被执行.\n     *\n     *\n     * ## 创建监听\n     * 调用本函数:\n     * ```\n     * eventChannel.subscribe<E> { /* 会收到此通道中的所有是 E 的事件 */ }\n     * ```\n     *\n     * ## 生命周期\n     *\n     * ### 通过协程作用域管理监听器\n     * 本函数将会创建一个 [Job], 成为 [parentJob] 中的子任务. 可创建一个 [CoroutineScope] 来管理所有的监听器:\n     * ```\n     * val scope = CoroutineScope(SupervisorJob())\n     *\n     * val scopedChannel = eventChannel.parentScope(scope) // 将协程作用域 scope 附加到这个 EventChannel\n     *\n     * scopedChannel.subscribeAlways<MemberJoinEvent> { /* ... */ } // 启动监听, 监听器协程会作为 scope 的子任务\n     * scopedChannel.subscribeAlways<MemberMuteEvent> { /* ... */ } // 启动监听, 监听器协程会作为 scope 的子任务\n     *\n     * scope.cancel() // 停止了协程作用域, 也就取消了两个监听器\n     * ```\n     *\n     * 这个函数返回 [Listener], 它是一个 [CompletableJob]. 它会成为 [parentJob] 或 [parentScope] 的一个 [子任务][Job]\n     *\n     * ### 停止监听\n     * 如果 [handler] 返回 [ListeningStatus.STOPPED] 监听器将被停止.\n     *\n     * 也可以通过 [subscribe] 返回值 [Listener] 的 [Listener.complete]\n     *\n     * ## 监听器调度\n     * 监听器会被创建一个协程任务, 语义上在 [parentScope] 下运行.\n     * 通过 Kotlin [默认协程调度器][Dispatchers.Default] 在固定的全局共享线程池里执行, 除非有 [coroutineContext] 指定.\n     *\n     * 默认在 [handler] 中不能处理阻塞任务. 阻塞任务将会阻塞一个 Kotlin 全局协程调度线程并可能导致严重问题.\n     * 请通过 `withContext(Dispatchers.IO) { }` 等方法执行阻塞工作.\n     *\n     * ## 异常处理\n     *\n     * **监听过程抛出的异常是需要尽可能避免的, 因为这将产生不确定性.**\n     *\n     * 当参数 [handler] 处理事件抛出异常时, 只会从监听方协程上下文 ([CoroutineContext]) 寻找 [CoroutineExceptionHandler] 处理异常, 即如下顺序:\n     *   1. 本函数参数 [coroutineContext]\n     *   2. [EventChannel.defaultCoroutineContext]\n     *   3. 若以上步骤无法获取 [CoroutineExceptionHandler], 则只会在日志记录异常.\n     *   因此建议先指定 [CoroutineExceptionHandler] (可通过 [EventChannel.exceptionHandler]) 再监听事件, 或者在监听事件中捕获异常.\n     *\n     * 因此, 广播方 ([Event.broadcast]) 不会知晓监听方产生的异常, 其 [Event.broadcast] 过程也不会因监听方产生异常而提前结束.\n     *\n     * ***备注***: 在 2.11 以前, 发生上述异常时还会从广播方和有关 [Bot] 协程域获取 [CoroutineExceptionHandler]. 因此行为不稳定而在 2.11 变更为上述过程.\n     *\n     * 事件处理时抛出异常不会停止监听器.\n     *\n     * 建议在事件处理中 (即 [handler] 里) 处理异常,\n     * 或在参数 [coroutineContext] 中添加 [CoroutineExceptionHandler], 或通过 [EventChannel.exceptionHandler].\n     *\n     * ## 并发安全性\n     * 基于 [concurrency] 参数, 事件监听器可以被允许并行执行.\n     *\n     * - 若 [concurrency] 为 [ConcurrencyKind.CONCURRENT], [handler] 可能被并行调用, 需要保证并发安全.\n     * - 若 [concurrency] 为 [ConcurrencyKind.LOCKED], [handler] 会被 [Mutex] 限制, 串行异步执行.\n     *\n     * ## 衍生监听方法\n     *\n     * 这些方法仅 Kotlin 可用.\n     *\n     * - [syncFromEvent]: 挂起当前协程, 监听一个事件, 并尝试从这个事件中**获取**一个值\n     * - [nextEvent]: 挂起当前协程, 直到监听到特定类型事件的广播并通过过滤器, 返回这个事件实例.\n     *\n     * @param coroutineContext 在 [defaultCoroutineContext] 的基础上, 给事件监听协程的额外的 [CoroutineContext].\n     * @param concurrency 并发类型. 查看 [ConcurrencyKind]\n     * @param priority  监听优先级，优先级越高越先执行\n     * @param handler 事件处理器. 在接收到事件时会调用这个处理器. 其返回值意义参考 [ListeningStatus]. 其异常处理参考上文\n     *\n     * @return 监听器实例. 此监听器已经注册到指定事件上, 在事件广播时将会调用 [handler]\n     *\n     *\n     * @see selectMessages 以 `when` 的语法 '选择' 即将到来的一条消息.\n     * @see whileSelectMessages 以 `when` 的语法 '选择' 即将到来的所有消息, 直到不满足筛选结果.\n     *\n     * @see subscribeAlways 一直监听\n     * @see subscribeOnce   只监听一次\n     *\n     * @see subscribeMessages       监听消息 DSL\n     */\n    @JvmSynthetic\n    public inline fun <reified E : Event> subscribe(\n        coroutineContext: CoroutineContext = EmptyCoroutineContext,\n        concurrency: ConcurrencyKind = LOCKED,\n        priority: EventPriority = EventPriority.NORMAL,\n        noinline handler: suspend E.(E) -> ListeningStatus,\n    ): Listener<E> = subscribe(E::class, coroutineContext, concurrency, priority, handler)\n\n    /**\n     * 与 [subscribe] 的区别是接受 [eventClass] 参数, 而不使用 `reified` 泛型. 通常推荐使用具体化类型参数.\n     *\n     * @return 监听器实例. 此监听器已经注册到指定事件上, 在事件广播时将会调用 [handler]\n     * @see subscribe\n     */\n    @JvmSynthetic\n    public fun <E : Event> subscribe(\n        eventClass: KClass<out E>,\n        coroutineContext: CoroutineContext = EmptyCoroutineContext,\n        concurrency: ConcurrencyKind = LOCKED,\n        priority: EventPriority = EventPriority.NORMAL,\n        handler: suspend E.(E) -> ListeningStatus,\n    ): Listener<E> = subscribeInternal(\n        eventClass,\n        createListener0(coroutineContext, concurrency, priority) { it.handler(it); }\n    )\n\n    /**\n     * 创建一个事件监听器, 监听事件通道中所有 [E] 及其子类事件.\n     * 每当 [事件广播][Event.broadcast] 时, [handler] 都会被执行.\n     *\n     * 可在任意时候通过 [Listener.complete] 来主动停止监听.\n     *\n     * @param concurrency 并发类型默认为 [CONCURRENT]\n     * @param coroutineContext 在 [defaultCoroutineContext] 的基础上, 给事件监听协程的额外的 [CoroutineContext]\n     * @param priority 处理优先级, 优先级高的先执行\n     *\n     * @return 监听器实例. 此监听器已经注册到指定事件上, 在事件广播时将会调用 [handler]\n     *\n     * @see subscribe 获取更多说明\n     */\n    @JvmSynthetic\n    public inline fun <reified E : Event> subscribeAlways(\n        coroutineContext: CoroutineContext = EmptyCoroutineContext,\n        concurrency: ConcurrencyKind = CONCURRENT,\n        priority: EventPriority = EventPriority.NORMAL,\n        noinline handler: suspend E.(E) -> Unit,\n    ): Listener<E> = subscribeAlways(E::class, coroutineContext, concurrency, priority, handler)\n\n\n    /**\n     * @see subscribe\n     * @see subscribeAlways\n     */\n    @JvmSynthetic\n    public fun <E : Event> subscribeAlways(\n        eventClass: KClass<out E>,\n        coroutineContext: CoroutineContext = EmptyCoroutineContext,\n        concurrency: ConcurrencyKind = CONCURRENT,\n        priority: EventPriority = EventPriority.NORMAL,\n        handler: suspend E.(E) -> Unit,\n    ): Listener<E> = subscribeInternal(\n        eventClass,\n        createListener0(coroutineContext, concurrency, priority) { it.handler(it); ListeningStatus.LISTENING }\n    )\n\n    /**\n     * 创建一个事件监听器, 监听事件通道中所有 [E] 及其子类事件, 只监听一次.\n     * 当 [事件广播][Event.broadcast] 时, [handler] 会被执行.\n     *\n     * 可在任意时候通过 [Listener.complete] 来主动停止监听.\n     *\n     * @param coroutineContext 在 [defaultCoroutineContext] 的基础上, 给事件监听协程的额外的 [CoroutineContext]\n     * @param priority 处理优先级, 优先级高的先执行\n     *\n     * @see subscribe 获取更多说明\n     */\n    @JvmSynthetic\n    public inline fun <reified E : Event> subscribeOnce(\n        coroutineContext: CoroutineContext = EmptyCoroutineContext,\n        priority: EventPriority = EventPriority.NORMAL,\n        noinline handler: suspend E.(E) -> Unit,\n    ): Listener<E> = subscribeOnce(E::class, coroutineContext, priority, handler)\n\n    /**\n     * @see subscribeOnce\n     */\n    public fun <E : Event> subscribeOnce(\n        eventClass: KClass<out E>,\n        coroutineContext: CoroutineContext = EmptyCoroutineContext,\n        priority: EventPriority = EventPriority.NORMAL,\n        handler: suspend E.(E) -> Unit,\n    ): Listener<E> = subscribeInternal(\n        eventClass,\n        createListener0(coroutineContext, ConcurrencyKind.LOCKED, priority) { it.handler(it); ListeningStatus.STOPPED }\n    )\n\n    // endregion\n\n    /**\n     * 注册 [ListenerHost] 中的所有 [EventHandler] 标注的方法到这个 [EventChannel]. 查看 [EventHandler].\n     *\n     * @param coroutineContext 在 [defaultCoroutineContext] 的基础上, 给事件监听协程的额外的 [CoroutineContext]\n     *\n     * @see subscribe\n     * @see EventHandler\n     * @see ListenerHost\n     */\n    @JvmOverloads\n    public fun registerListenerHost(\n        host: ListenerHost,\n        coroutineContext: CoroutineContext = EmptyCoroutineContext,\n    ) {\n        val jobOfListenerHost: Job?\n        val coroutineContext0 = if (host is SimpleListenerHost) {\n            val listenerCoroutineContext = host.coroutineContext\n            val listenerJob = listenerCoroutineContext[Job]\n\n            val rsp = listenerCoroutineContext.minusKey(Job) +\n                    coroutineContext +\n                    (listenerCoroutineContext[CoroutineExceptionHandler] ?: EmptyCoroutineContext)\n\n            val registerCancelHook = when {\n                listenerJob === null -> false\n\n                // Registering cancellation hook is needless\n                // if [Job] of [EventChannel] is same as [Job] of [SimpleListenerHost]\n                (rsp[Job] ?: this.defaultCoroutineContext[Job]) === listenerJob -> false\n\n                else -> true\n            }\n\n            jobOfListenerHost = if (registerCancelHook) {\n                listenerCoroutineContext[Job]\n            } else {\n                null\n            }\n            rsp\n        } else {\n            jobOfListenerHost = null\n            coroutineContext\n        }\n        for (method in host.javaClass.declaredMethods) {\n            method.getAnnotation(EventHandler::class.java)?.let {\n                val listener =\n                    JvmMethodListenersInternal.registerEventHandler(method, host, this, it, coroutineContext0)\n                // For [SimpleListenerHost.cancelAll]\n                jobOfListenerHost?.invokeOnCompletion { exception ->\n                    listener.cancel(\n                        when (exception) {\n                            is CancellationException -> exception\n                            is Throwable -> CancellationException(null, exception)\n                            else -> null\n                        }\n                    )\n                }\n            }\n        }\n    }\n\n    // region Java API\n\n    /**\n     * Java API. 查看 [subscribeAlways] 获取更多信息.\n     *\n     * ```java\n     * eventChannel.subscribeAlways(GroupMessageEvent.class, (event) -> { });\n     * ```\n     *\n     * @see subscribe\n     * @see subscribeAlways\n     */\n    @JvmOverloads\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n    @kotlin.internal.LowPriorityInOverloadResolution\n    public fun <E : Event> subscribeAlways(\n        eventClass: Class<out E>,\n        coroutineContext: CoroutineContext = EmptyCoroutineContext,\n        concurrency: ConcurrencyKind = CONCURRENT,\n        priority: EventPriority = EventPriority.NORMAL,\n        handler: Consumer<E>,\n    ): Listener<E> = subscribeInternal(\n        eventClass.kotlin,\n        createListener0(coroutineContext, concurrency, priority) { event ->\n            runInterruptible(Dispatchers.IO) { handler.accept(event) }\n            ListeningStatus.LISTENING\n        }\n    )\n\n    /**\n     * Java API. 查看 [subscribe] 获取更多信息.\n     *\n     * ```java\n     * eventChannel.subscribe(GroupMessageEvent.class, (event) -> {\n     *     return ListeningStatus.LISTENING;\n     * });\n     * ```\n     *\n     * @see subscribe\n     */\n    @JvmOverloads\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n    @kotlin.internal.LowPriorityInOverloadResolution\n    public fun <E : Event> subscribe(\n        eventClass: Class<out E>,\n        coroutineContext: CoroutineContext = EmptyCoroutineContext,\n        concurrency: ConcurrencyKind = CONCURRENT,\n        priority: EventPriority = EventPriority.NORMAL,\n        handler: java.util.function.Function<E, ListeningStatus>,\n    ): Listener<E> = subscribeInternal(\n        eventClass.kotlin,\n        createListener0(coroutineContext, concurrency, priority) { event ->\n            runInterruptible(Dispatchers.IO) { handler.apply(event) }\n        }\n    )\n\n    /**\n     * Java API. 查看 [subscribeOnce] 获取更多信息.\n     *\n     * ```java\n     * eventChannel.subscribeOnce(GroupMessageEvent.class, (event) -> { });\n     * ```\n     *\n     * @see subscribe\n     * @see subscribeOnce\n     */\n    @JvmOverloads\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n    @kotlin.internal.LowPriorityInOverloadResolution\n    public fun <E : Event> subscribeOnce(\n        eventClass: Class<out E>,\n        coroutineContext: CoroutineContext = EmptyCoroutineContext,\n        concurrency: ConcurrencyKind = CONCURRENT,\n        priority: EventPriority = EventPriority.NORMAL,\n        handler: Consumer<E>,\n    ): Listener<E> = subscribeInternal(\n        eventClass.kotlin,\n        createListener0(coroutineContext, concurrency, priority) { event ->\n            runInterruptible(Dispatchers.IO) { handler.accept(event) }\n            ListeningStatus.STOPPED\n        }\n    )\n\n    // endregion\n\n    // region deprecated\n\n    /**\n     * 创建事件监听并将监听结果发送在 [Channel]. 将返回值 [Channel] [关闭][Channel.close] 时将会同时关闭事件监听.\n     *\n     * ## 已弃用\n     *\n     * 请使用 [forwardToChannel] 替代.\n     *\n     * @param capacity Channel 容量. 详见 [Channel] 构造.\n     *\n     * @see subscribeAlways\n     * @see Channel\n     */\n    @Deprecated(\n        \"Please use forwardToChannel instead.\",\n        replaceWith = ReplaceWith(\n            \"Channel<BaseEvent>(capacity).apply { forwardToChannel(this, coroutineContext, priority) }\",\n            \"kotlinx.coroutines.channels.Channel\"\n        ),\n        level = DeprecationLevel.ERROR,\n    )\n    @DeprecatedSinceMirai(warningSince = \"2.10\", errorSince = \"2.14\")\n    @MiraiExperimentalApi\n    public fun asChannel(\n        capacity: Int = Channel.RENDEZVOUS,\n        coroutineContext: CoroutineContext = EmptyCoroutineContext,\n        @Suppress(\"UNUSED_PARAMETER\") concurrency: ConcurrencyKind = CONCURRENT,\n        priority: EventPriority = EventPriority.NORMAL,\n    ): Channel<out BaseEvent> =\n        Channel<BaseEvent>(capacity).apply { forwardToChannel(this, coroutineContext, priority) }\n\n    // endregion\n\n    // region impl\n\n\n    // protected, to hide from users\n    @MiraiInternalApi\n    protected abstract fun <E : Event> registerListener(eventClass: KClass<out E>, listener: Listener<E>)\n\n    // to overcome visibility issue\n    @OptIn(MiraiInternalApi::class)\n    internal fun <E : Event> registerListener0(eventClass: KClass<out E>, listener: Listener<E>) {\n        return registerListener(eventClass, listener)\n    }\n\n    @OptIn(MiraiInternalApi::class)\n    private fun <L : Listener<E>, E : Event> subscribeInternal(eventClass: KClass<out E>, listener: L): L {\n        registerListener(eventClass, listener)\n        return listener\n    }\n\n    /**\n     * Creates [Listener] instance using the [listenerBlock] action.\n     */\n//    @Contract(\"_ -> new\") // always creates new instance\n    @MiraiInternalApi\n    protected abstract fun <E : Event> createListener(\n        coroutineContext: CoroutineContext,\n        concurrencyKind: ConcurrencyKind,\n        priority: EventPriority,\n        listenerBlock: suspend (E) -> ListeningStatus,\n    ): Listener<E>\n\n    // to overcome visibility issue\n    @OptIn(MiraiInternalApi::class)\n    internal fun <E : Event> createListener0(\n        coroutineContext: CoroutineContext,\n        concurrencyKind: ConcurrencyKind,\n        priority: EventPriority,\n        listenerBlock: suspend (E) -> ListeningStatus,\n    ): Listener<E> = createListener(coroutineContext, concurrencyKind, priority, listenerBlock)\n\n    // endregion\n}\n\n\n// used by mirai-core\n@OptIn(MiraiInternalApi::class)\ninternal open class FilterEventChannel<BaseEvent : Event>(\n    private val delegate: EventChannel<BaseEvent>,\n    private val filter: suspend (event: BaseEvent) -> Boolean,\n) : EventChannel<BaseEvent>(delegate.baseEventClass, delegate.defaultCoroutineContext) {\n    private fun <E : Event> intercept(block: suspend (E) -> ListeningStatus): suspend (E) -> ListeningStatus {\n        return { ev ->\n            val filterResult = try {\n                @Suppress(\"UNCHECKED_CAST\")\n                baseEventClass.isInstance(ev) && filter(ev as BaseEvent)\n            } catch (e: Throwable) {\n                if (e is ExceptionInEventChannelFilterException) throw e // wrapped by another filter\n                throw ExceptionInEventChannelFilterException(ev, this, cause = e)\n            }\n            if (filterResult) block.invoke(ev)\n            else ListeningStatus.LISTENING\n        }\n    }\n\n    override fun asFlow(): Flow<BaseEvent> = delegate.asFlow().filter(filter)\n\n    override fun <E : Event> registerListener(eventClass: KClass<out E>, listener: Listener<E>) {\n        delegate.registerListener0(eventClass, listener)\n    }\n\n    override fun <E : Event> createListener(\n        coroutineContext: CoroutineContext,\n        concurrencyKind: ConcurrencyKind,\n        priority: EventPriority,\n        listenerBlock: suspend (E) -> ListeningStatus\n    ): Listener<E> = delegate.createListener0(coroutineContext, concurrencyKind, priority, intercept(listenerBlock))\n\n    override fun context(vararg coroutineContexts: CoroutineContext): EventChannel<BaseEvent> {\n        return delegate.context(*coroutineContexts)\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/EventChannelKotlinExtensions.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n@file:JvmName(\"EventChannelKotlinExtensions\")\n\npackage net.mamoe.mirai.event\n\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmSynthetic\n\n\n/**\n * 支持 Kotlin 带接收者的挂起函数的函数引用的监听方式.\n *\n * ```\n * suspend fun GroupMessageEvent.onMessage(event: GroupMessageEvent): ListeningStatus {\n *     return ListeningStatus.LISTENING\n * }\n *\n * eventChannel.subscribe(GroupMessageEvent::onMessage)\n * ```\n * @see EventChannel.subscribe\n */\n@JvmSynthetic\npublic inline fun <BaseEvent : Event, reified E : Event> EventChannel<BaseEvent>.subscribe(\n    crossinline handler: suspend E.(E) -> ListeningStatus,\n    priority: EventPriority = EventPriority.NORMAL,\n    concurrency: ConcurrencyKind = ConcurrencyKind.CONCURRENT,\n    coroutineContext: CoroutineContext = EmptyCoroutineContext\n): Listener<E> = subscribe(E::class, coroutineContext, concurrency, priority) { handler(this) }\n\n/**\n * 支持 Kotlin 挂起函数的函数引用的监听方式.\n *\n * ```\n * suspend fun onMessage(event: GroupMessageEvent): ListeningStatus {\n *     return ListeningStatus.LISTENING\n * }\n *\n * eventChannel.subscribe(::onMessage)\n * ```\n * @see EventChannel.subscribe\n */\n@JvmSynthetic\n@JvmName(\"subscribe1\")\npublic inline fun <BaseEvent : Event, reified E : Event> EventChannel<BaseEvent>.subscribe(\n    crossinline handler: suspend (E) -> ListeningStatus,\n    priority: EventPriority = EventPriority.NORMAL,\n    concurrency: ConcurrencyKind = ConcurrencyKind.CONCURRENT,\n    coroutineContext: CoroutineContext = EmptyCoroutineContext\n): Listener<E> = subscribe(E::class, coroutineContext, concurrency, priority) { handler(this) }\n\n/**\n * 支持 Kotlin 带接收者的函数的函数引用的监听方式.\n *\n * ```\n * fun GroupMessageEvent.onMessage(event: GroupMessageEvent): ListeningStatus {\n *     return ListeningStatus.LISTENING\n * }\n *\n * eventChannel.subscribe(GroupMessageEvent::onMessage)\n * ```\n * @see EventChannel.subscribe\n */\n@JvmSynthetic\npublic inline fun <BaseEvent : Event, reified E : Event> EventChannel<BaseEvent>.subscribe(\n    crossinline handler: E.(E) -> ListeningStatus,\n    priority: EventPriority = EventPriority.NORMAL,\n    concurrency: ConcurrencyKind = ConcurrencyKind.CONCURRENT,\n    coroutineContext: CoroutineContext = EmptyCoroutineContext\n): Listener<E> = subscribe(E::class, coroutineContext, concurrency, priority) { handler(this) }\n\n/**\n * 支持 Kotlin 带接收者的挂起函数的函数引用的监听方式.\n *\n * ```\n * fun onMessage(event: GroupMessageEvent): ListeningStatus {\n *     return ListeningStatus.LISTENING\n * }\n *\n * eventChannel.subscribe(::onMessage)\n * ```\n * @see EventChannel.subscribe\n */\n@JvmSynthetic\npublic inline fun <BaseEvent : Event, reified E : Event> EventChannel<BaseEvent>.subscribe(\n    crossinline handler: (E) -> ListeningStatus,\n    priority: EventPriority = EventPriority.NORMAL,\n    concurrency: ConcurrencyKind = ConcurrencyKind.CONCURRENT,\n    coroutineContext: CoroutineContext = EmptyCoroutineContext\n): Listener<E> = subscribe(E::class, coroutineContext, concurrency, priority) { handler(this) }\n\n/**\n * 支持 Kotlin 挂起函数的函数引用的监听方式.\n * ```\n * suspend fun onMessage(event: GroupMessageEvent) {\n *\n * }\n * eventChannel.subscribeAlways(::onMessage)\n * ```\n * @see EventChannel.subscribeAlways\n */\n@JvmName(\"subscribeAlways1\")\n@JvmSynthetic\npublic inline fun <BaseEvent : Event, reified E : Event> EventChannel<BaseEvent>.subscribeAlways(\n    crossinline handler: suspend (E) -> Unit,\n    priority: EventPriority = EventPriority.NORMAL,\n    concurrency: ConcurrencyKind = ConcurrencyKind.CONCURRENT,\n    coroutineContext: CoroutineContext = EmptyCoroutineContext\n): Listener<E> = subscribeAlways(E::class, coroutineContext, concurrency, priority) { handler(this) }\n\n\n/**\n * 支持 Kotlin 带接收者的挂起函数的函数引用的监听方式.\n * ```\n * suspend fun GroupMessageEvent.onMessage(event: GroupMessageEvent) {\n *\n * }\n * eventChannel.subscribeAlways(GroupMessageEvent::onMessage)\n * ```\n * @see EventChannel.subscribeAlways\n */\n@JvmSynthetic\npublic inline fun <BaseEvent : Event, reified E : Event> EventChannel<BaseEvent>.subscribeAlways(\n    crossinline handler: suspend E.(E) -> Unit,\n    priority: EventPriority = EventPriority.NORMAL,\n    concurrency: ConcurrencyKind = ConcurrencyKind.CONCURRENT,\n    coroutineContext: CoroutineContext = EmptyCoroutineContext\n): Listener<E> = subscribeAlways(E::class, coroutineContext, concurrency, priority) { handler(this) }\n\n/**\n * 支持 Kotlin 带接收者的函数的函数引用的监听方式.\n * ```\n * fun GroupMessageEvent.onMessage(event: GroupMessageEvent) {\n *\n * }\n * eventChannel.subscribeAlways(GroupMessageEvent::onMessage)\n * ```\n * @see EventChannel.subscribeAlways\n */\n@JvmSynthetic\npublic inline fun <BaseEvent : Event, reified E : Event> EventChannel<BaseEvent>.subscribeAlways(\n    crossinline handler: E.(E) -> Unit,\n    priority: EventPriority = EventPriority.NORMAL,\n    concurrency: ConcurrencyKind = ConcurrencyKind.CONCURRENT,\n    coroutineContext: CoroutineContext = EmptyCoroutineContext\n): Listener<E> = subscribeAlways(E::class, coroutineContext, concurrency, priority) { handler(this) }\n\n/**\n * 支持 Kotlin 带接收者的挂起函数的函数引用的监听方式.\n * ```\n * fun onMessage(event: GroupMessageEvent) {\n *\n * }\n * eventChannel.subscribeAlways(::onMessage)\n * ```\n * @see EventChannel.subscribeAlways\n */\n@JvmSynthetic\npublic inline fun <BaseEvent : Event, reified E : Event> EventChannel<BaseEvent>.subscribeAlways(\n    crossinline handler: (E) -> Unit,\n    priority: EventPriority = EventPriority.NORMAL,\n    concurrency: ConcurrencyKind = ConcurrencyKind.CONCURRENT,\n    coroutineContext: CoroutineContext = EmptyCoroutineContext\n): Listener<E> = subscribeAlways(E::class, coroutineContext, concurrency, priority) { handler(this) }"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/ExceptionInEventChannelFilterException.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.event\n\n/**\n * 包装 [EventChannel.filter] 的 `filter` lambda 抛出的异常并重新抛出.\n *\n * @see EventChannel.filter\n */\npublic class ExceptionInEventChannelFilterException(\n    /**\n     * 当时正在处理的事件\n     */\n    public val event: Event,\n    public val eventChannel: EventChannel<*>,\n    override val message: String = \"Exception in EventHandler\",\n    /**\n     * 原异常\n     */\n    override val cause: Throwable\n) : IllegalStateException()"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/Extensions.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.event\n\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.filter\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.flow.firstOrNull\nimport kotlin.coroutines.resume\nimport kotlin.reflect.KClass\n\n/**\n * 挂起当前协程, 直到监听到事件 [E] 的广播并通过 [filter], 返回这个事件实例.\n *\n * 本函数是 [EventChannel.subscribe] 的衍生工具函数, 内部会调用 [EventChannel.subscribe].\n *\n * ## 挂起可取消\n *\n * 本函数的挂起过程可以被[取消][CancellableContinuation.cancel]. 这意味着若在 [CoroutineScope.launch] 中使用本函数, 则 [launch] 启动的 [Job] 可以通过 [Job.cancel] 取消 (停止), 届时本函数会抛出 [CancellationException].\n *\n * ## 异常处理\n *\n * [filter] 抛出的异常属于监听方异常, 将会由 [nextEvent] 原样重新抛出.\n *\n * ## 使用 [Flow] 的替代方法\n *\n * 在 Kotlin 可使用 [EventChannel.asFlow] 配合 [Flow.filter] 和 [Flow.first] 实现与 [nextEvent] 相似的功能 (注意, Flow 方法将会使用 [EventPriority.MONITOR] 优先级).\n *\n * 示例:\n *\n * ```\n * val event: GroupMessageEvent = GlobalEventChannel.asFlow().filterIsInstance<GroupMessageEvent>().filter { it.sender.id == 123456 }.first()\n * // 上下两行代码等价\n * val event: GroupMessageEvent = GlobalEventChannel.filterIsInstance<GroupMessageEvent>().nextEvent(EventPriority.MONITOR) { it.sender.id == 123456 }\n * ```\n *\n * 由于 [Flow] 拥有更多操作 (如 [Flow.firstOrNull]), 在不需要指定[事件优先级][EventPriority]时使用 [Flow] 拥有更高自由度.\n *\n * @param filter 过滤器. 返回 `true` 时表示得到了需要的实例. 返回 `false` 时表示继续监听\n *\n * @since 2.10\n */\npublic suspend inline fun <reified E : Event> EventChannel<*>.nextEvent(\n    priority: EventPriority = EventPriority.NORMAL,\n    noinline filter: suspend (E) -> Boolean = { true }\n): E = nextEvent(priority, false, filter)\n\n/**\n * 挂起当前协程, 直到监听到事件 [E] 的广播并通过 [filter], 返回这个事件实例.\n *\n * 本函数是 [EventChannel.subscribe] 的衍生工具函数, 内部会调用 [EventChannel.subscribe].\n *\n * ## 挂起可取消\n *\n * 本函数的挂起过程可以被[取消][CancellableContinuation.cancel]. 这意味着若在 [CoroutineScope.launch] 中使用本函数, 则 [launch] 启动的 [Job] 可以通过 [Job.cancel] 取消 (停止), 届时本函数会抛出 [CancellationException].\n *\n * ## 异常处理\n *\n * [filter] 抛出的异常属于监听方异常, 将会由 [nextEvent] 原样重新抛出.\n *\n * ## 使用 [Flow] 的替代方法\n *\n * 在 Kotlin 可使用 [EventChannel.asFlow] 配合 [Flow.filter] 和 [Flow.first] 实现与 [nextEvent] 相似的功能 (注意, Flow 方法将会使用 [EventPriority.MONITOR] 优先级).\n *\n * 示例:\n *\n * ```\n * val event: GroupMessageEvent = GlobalEventChannel.asFlow().filterIsInstance<GroupMessageEvent>().filter { it.sender.id == 123456 }.first()\n * // 上下两行代码等价\n * val event: GroupMessageEvent = GlobalEventChannel.filterIsInstance<GroupMessageEvent>().nextEvent(EventPriority.MONITOR) { it.sender.id == 123456 }\n * ```\n *\n * 由于 [Flow] 拥有更多操作 (如 [Flow.firstOrNull]), 在不需要指定[事件优先级][EventPriority]时使用 [Flow] 拥有更高自由度.\n *\n * @param intercept 是否拦截, 传入 `true` 时表示拦截此事件不让接下来的监听器处理, 传入 `false` 时表示让接下来的监听器处理\n * @param filter 过滤器. 返回 `true` 时表示得到了需要的实例. 返回 `false` 时表示继续监听\n *\n * @since 2.13\n */\npublic suspend inline fun <reified E : Event> EventChannel<*>.nextEvent(\n    priority: EventPriority = EventPriority.NORMAL,\n    intercept: Boolean = false,\n    noinline filter: suspend (E) -> Boolean = { true }\n): E = coroutineScope {\n    suspendCancellableCoroutine { cont ->\n        var listener: Listener<E>? = null\n        listener = this@nextEvent.parentScope(this@coroutineScope).subscribe(E::class, priority = priority) { event ->\n            val result = kotlin.runCatching {\n                if (!filter(event)) return@subscribe ListeningStatus.LISTENING\n                event\n            }\n\n            try {\n                cont.resumeWith(result.apply { onSuccess { if (intercept) intercept() } })\n            } finally {\n                listener?.complete() // ensure completed on exceptions\n            }\n            return@subscribe ListeningStatus.STOPPED\n        }\n\n        cont.invokeOnCancellation {\n            kotlin.runCatching { listener.cancel(\"nextEvent outer scope cancelled\", it) }\n        }\n    }\n}\n\n/**\n * 挂起当前协程, 监听事件 [E], 并尝试从这个事件中**获取**一个值, 在超时时抛出 [TimeoutCancellationException]\n *\n * 本函数是 [EventChannel.subscribe] 的衍生工具函数, 内部会调用 [EventChannel.subscribe].\n *\n * ## 挂起可取消\n *\n * 本函数的挂起过程可以被[取消][CancellableContinuation.cancel]. 这意味着若在 [CoroutineScope.launch] 中使用本函数, 则 [launch] 启动的 [Job] 可以通过 [Job.cancel] 取消 (停止), 届时本函数会抛出 [CancellationException].\n *\n * ## 异常处理\n *\n * [filter] 抛出的异常属于监听方异常, 将会由 [nextEvent] 原样重新抛出.\n *\n * ## 使用 [Flow] 的替代方法\n *\n * 在 Kotlin 可使用 [EventChannel.asFlow] 配合 [Flow.filter] 和 [Flow.first] 实现与 [nextEvent] 相似的功能 (注意, Flow 方法将会使用 [EventPriority.MONITOR] 优先级).\n *\n * 示例:\n *\n * ```\n * val senderId: Long = GlobalEventChannel.asFlow()\n *     .filterIsInstance<GroupMessageEvent>()\n *     .filter { it.sender.id == 123456L }\n *     .map { it.sender.id }.first()\n *\n * // 上下代码等价\n *\n * val senderId: Long = GlobalEventChannel\n *     .filterIsInstance<GroupMessageEvent>()\n *     .syncFromEvent(EventPriority.MONITOR) { if (it.sender.id = 123456) it.sender.name else null }\n * ```\n *\n * 由于 [Flow] 拥有更多操作且逻辑更清晰, 在不需要指定[事件优先级][EventPriority]时更推荐使用 [Flow].\n *\n * @param mapper 过滤转换器. 返回非 null 则代表得到了需要的值. [syncFromEvent] 会返回这个值\n *\n * @see EventChannel.subscribe 普通地监听一个事件\n * @see nextEvent 挂起当前协程, 并获取下一个事件实例\n *\n * @throws Throwable 当 [mapper] 抛出任何异常时, 本函数会抛出该异常\n *\n * @since 2.10\n */\npublic suspend inline fun <reified E : Event, R : Any> EventChannel<*>.syncFromEvent(\n    priority: EventPriority = EventPriority.NORMAL,\n    noinline mapper: suspend (E) -> R?\n): R = coroutineScope {\n    suspendCancellableCoroutine { cont ->\n        var listener: Listener<E>? = null\n        listener = this@syncFromEvent.parentScope(this).subscribe(E::class, priority = priority) { event ->\n            val result = kotlin.runCatching {\n                mapper(event) ?: return@subscribe ListeningStatus.LISTENING\n            }\n\n            try {\n                cont.resumeWith(result)\n            } finally {\n                listener?.complete() // ensure completed on exceptions\n            }\n            return@subscribe ListeningStatus.STOPPED\n        }\n\n        cont.invokeOnCancellation {\n            kotlin.runCatching { listener.cancel(\"syncFromEvent outer scope cancelled\", it) }\n        }\n    }\n}\n\n// Can't move to JVM, filename clashes\n\n/**\n * @since 2.10\n */\n@PublishedApi\n@Deprecated(\"For binary compatibility\")\ninternal suspend fun <E : Event> EventChannel<Event>.nextEventImpl(\n    eventClass: KClass<E>,\n    coroutineScope: CoroutineScope,\n    priority: EventPriority,\n    filter: suspend (E) -> Boolean\n): E = suspendCancellableCoroutine { cont ->\n    var listener: Listener<E>? = null\n    listener = parentScope(coroutineScope)\n        .subscribe(eventClass, priority = priority) { event ->\n            if (!filter(event)) return@subscribe ListeningStatus.LISTENING\n\n            try {\n                cont.resume(event)\n            } finally {\n                listener?.complete() // ensure completed on exceptions\n            }\n            return@subscribe ListeningStatus.STOPPED\n        }\n\n    cont.invokeOnCancellation {\n        runCatching { listener.cancel(\"nextEvent outer scope cancelled\", it) }\n    }\n}\n\n/**\n * @since 2.10\n */\n@PublishedApi\n@Deprecated(\"For binary compatibility\")\ninternal suspend fun <E : Event, R> EventChannel<*>.syncFromEventImpl(\n    eventClass: KClass<E>,\n    coroutineScope: CoroutineScope,\n    priority: EventPriority,\n    mapper: suspend (E) -> R?\n): R = suspendCancellableCoroutine { cont ->\n    parentScope(coroutineScope).subscribe(eventClass, priority = priority) { event ->\n        try {\n            cont.resumeWith(kotlin.runCatching {\n                mapper.invoke(event) ?: return@subscribe ListeningStatus.LISTENING\n            })\n        } catch (_: Exception) {\n        }\n        return@subscribe ListeningStatus.STOPPED\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/GlobalEventChannel.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"EventChannelKt\")\n\npackage net.mamoe.mirai.event\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.Flow\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.loadService\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmSynthetic\nimport kotlin.reflect.KClass\n\n/**\n * 全局事件通道. 此通道包含来自所有 [Bot] 的所有类型的事件. 可通过 [EventChannel.filter] 过滤得到范围更小的 [EventChannel].\n *\n * @see EventChannel\n */\n@OptIn(MiraiInternalApi::class)\npublic object GlobalEventChannel : EventChannel<Event>(Event::class, EmptyCoroutineContext) {\n    private val instance by lazy {\n        loadService(InternalGlobalEventChannelProvider::class).getInstance()\n    }\n\n    override fun asFlow(): Flow<Event> = instance.asFlow()\n    override fun <E : Event> registerListener(eventClass: KClass<out E>, listener: Listener<E>) {\n        return instance.registerListener0(eventClass, listener)\n    }\n\n    override fun <E : Event> createListener(\n        coroutineContext: CoroutineContext,\n        concurrencyKind: ConcurrencyKind,\n        priority: EventPriority,\n        listenerBlock: suspend (E) -> ListeningStatus\n    ): Listener<E> = instance.createListener0(coroutineContext, concurrencyKind, priority, listenerBlock)\n\n    override fun context(vararg coroutineContexts: CoroutineContext): EventChannel<Event> {\n        return instance.context(*coroutineContexts)\n    }\n}\n\n/**\n * 在此 [CoroutineScope] 下创建一个监听所有事件的 [EventChannel]. 相当于 `GlobalEventChannel.parentScope(this).context(coroutineContext)`.\n *\n * 在返回的 [EventChannel] 中的事件监听器都会以 [this] 作为父协程作用域. 即会 使用 [this]\n *\n * @param coroutineContext 额外的 [CoroutineContext]\n *\n * @throws IllegalStateException 当 [this] 和 [coroutineContext] 均不包含 [CoroutineContext]\n */\n@JvmSynthetic\npublic fun CoroutineScope.globalEventChannel(coroutineContext: CoroutineContext = EmptyCoroutineContext): EventChannel<Event> {\n    return if (coroutineContext === EmptyCoroutineContext) GlobalEventChannel.parentScope(this)\n    else GlobalEventChannel.parentScope(this).context(coroutineContext)\n}\n\n/**\n * @since 2.12\n */\n@MiraiInternalApi\npublic interface InternalGlobalEventChannelProvider {\n    public fun getInstance(): EventChannel<Event>\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/JvmMethodListeners.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"Events\")\n@file:Suppress(\"unused\", \"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"NOTHING_TO_INLINE\")\n\npackage net.mamoe.mirai.event\n\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.utils.castOrNull\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\n\n/**\n * 标注一个函数为事件监听器.\n *\n * ### Kotlin 函数\n * Kotlin 函数要求:\n * - 接收者和函数参数: 所标注的 Kotlin 函数必须至少拥有一个接收者或一个函数参数, 或二者都具有. 接收者和函数参数的类型必须相同 (如果二者都存在)\n *   接收者或函数参数的类型都必须为 [Event] 或其子类.\n * - 返回值: 为 [Unit] 或不指定返回值时将注册为 [EventChannel.subscribeAlways], 为 [ListeningStatus] 时将注册为 [EventChannel.subscribe].\n *   任何其他类型的返回值将会在注册时抛出异常.\n *\n * 所有 Kotlin 非 `suspend` 的函数都将会在 [Dispatchers.IO] 中调用\n *\n * 支持的函数类型:\n * ```\n * // 所有函数参数, 函数返回值都不允许标记为可空 (带有 '?' 符号)\n * // T 表示任何 Event 类型.\n * suspend fun T.onEvent(T)\n * suspend fun T.onEvent(T): ListeningStatus\n * suspend fun T.onEvent(T): Nothing\n * suspend fun onEvent(T)\n * suspend fun onEvent(T): ListeningStatus\n * suspend fun onEvent(T): Nothing\n * suspend fun T.onEvent()\n * suspend fun T.onEvent(): ListeningStatus\n * suspend fun T.onEvent(): Nothing\n * fun T.onEvent(T)\n * fun T.onEvent(T): ListeningStatus\n * fun T.onEvent(T): Nothing\n * fun onEvent(T)\n * fun onEvent(T): ListeningStatus\n * fun onEvent(T): Nothing\n * fun T.onEvent()\n * fun T.onEvent(): ListeningStatus\n * fun T.onEvent(): Nothing\n * ```\n *\n * Kotlin 使用示例:\n * - 独立 [CoroutineScope] 和 [ListenerHost]\n * ```\n * object MyEvents : ListenerHost {\n *     override val coroutineContext = SupervisorJob()\n *\n *\n *     // 可以抛出任何异常, 将在 this.coroutineContext 或 registerEvents 时提供的 CoroutineScope.coroutineContext 中的 CoroutineExceptionHandler 处理.\n *     @EventHandler\n *     suspend fun MessageEvent.onMessage() {\n *         reply(\"received\")\n *     }\n * }\n *\n * myCoroutineScope.registerEvents(MyEvents)\n * ```\n * `onMessage` 抛出的异常将会交给 `myCoroutineScope` 处理\n *\n *\n * - 合并 [CoroutineScope] 和 [ListenerHost]: 使用 [SimpleListenerHost]\n * ```\n * object MyEvents : SimpleListenerHost( /* override coroutineContext here */ ) {\n *     override fun handleException(context: CoroutineContext, exception: Throwable) {\n *         // 处理 onMessage 中未捕获的异常\n *     }\n *\n *     @EventHandler\n *     suspend fun MessageEvent.onMessage() { // 可以抛出任何异常, 将在 handleException 处理\n *         reply(\"received\")\n *         // 无返回值 (或者返回 Unit), 表示一直监听事件.\n *     }\n *\n *     @EventHandler\n *     suspend fun MessageEvent.onMessage(): ListeningStatus { // 可以抛出任何异常, 将在 handleException 处理\n *         reply(\"received\")\n *\n *         return ListeningStatus.LISTENING // 表示继续监听事件\n *         // return ListeningStatus.STOPPED // 表示停止监听事件\n *     }\n * }\n *\n * MyEvents.registerTo(eventChannel)\n * // 或 eventChannel.registerListenerHost(MyEvents)\n * ```\n *\n *\n * ### Java 方法\n * 所有 Java 方法都会在 [Dispatchers.IO] 中调用.\n *\n * 支持的方法类型\n * ```\n * // T 表示任何 Event 类型.\n * void onEvent(T)\n * Void onEvent(T)\n * @NotNull ListeningStatus onEvent(T) // 禁止返回 null\n * ```\n *\n *\n * Java 使用示例:\n * ```\n * public class MyEventHandlers extends SimpleListenerHost {\n *     @Override\n *     public void handleException(@NotNull CoroutineContext context, @NotNull Throwable exception){\n *         // 处理事件处理时抛出的异常\n *     }\n *\n *     @EventHandler\n *     public void onMessage(@NotNull MessageEvent event) throws Exception { // 可以抛出任何异常, 将在 handleException 处理\n *         event.subject.sendMessage(\"received\");\n *         // 无返回值, 表示一直监听事件.\n *     }\n *\n *     @NotNull\n *     @EventHandler\n *     public ListeningStatus onMessage(@NotNull MessageEvent event) throws Exception { // 可以抛出任何异常, 将在 handleException 处理\n *         event.subject.sendMessage(\"received\");\n *\n *         return ListeningStatus.LISTENING; // 表示继续监听事件\n *         // return ListeningStatus.STOPPED; // 表示停止监听事件\n *     }\n * }\n *\n * eventChannel.registerListenerHost(new MyEventHandlers())\n * ```\n *\n * //@sample net.mamoe.mirai.event.JvmMethodEventsTest\n */\n@Target(AnnotationTarget.FUNCTION)\n@Retention(AnnotationRetention.RUNTIME)\npublic annotation class EventHandler(\n    /**\n     * 监听器优先级\n     * @see EventPriority 查看优先级相关信息\n     * @see Event.intercept 拦截事件\n     */\n    public val priority: EventPriority = EventPriority.NORMAL,\n    /**\n     * 是否自动忽略被 [取消][CancellableEvent.isCancelled]\n     * @see CancellableEvent\n     */\n    public val ignoreCancelled: Boolean = true,\n    /**\n     * 并发类型\n     * @see ConcurrencyKind\n     */\n    public val concurrency: ConcurrencyKind = ConcurrencyKind.CONCURRENT\n)\n\n/**\n * 实现这个接口的对象可以通过 [EventHandler] 标注事件监听函数, 并通过 [registerTo] 注册.\n *\n * @see SimpleListenerHost 简单的实现\n * @see EventHandler 查看更多信息\n */\npublic interface ListenerHost\n\n/**\n * 携带一个异常处理器的 [ListenerHost].\n *\n * @see registerTo\n * @see ListenerHost 查看更多信息\n * @see EventHandler 查看更多信息\n */\npublic abstract class SimpleListenerHost\n@JvmOverloads constructor(coroutineContext: CoroutineContext = EmptyCoroutineContext) : ListenerHost, CoroutineScope {\n\n    public final override val coroutineContext: CoroutineContext =\n        CoroutineExceptionHandler(::handleException) + coroutineContext + SupervisorJob(coroutineContext[Job])\n\n    /**\n     * 处理事件处理中未捕获的异常. 在构造器中的 [coroutineContext] 未提供 [CoroutineExceptionHandler] 情况下必须继承此函数.\n     *\n     * [exception] 通常是 [ExceptionInEventHandlerException]. 可以获取事件: [ExceptionInEventHandlerException.event]\n     */\n    public open fun handleException(context: CoroutineContext, exception: Throwable) {\n        throw IllegalStateException(\n            \"\"\"\n            未找到异常处理器. 请继承 SimpleListenerHost 中的 handleException 方法, 或在构造 SimpleListenerHost 时提供 CoroutineExceptionHandler\n            ------------\n            Cannot find exception handler from coroutineContext. \n            Please extend SimpleListenerHost.handleException or provide a CoroutineExceptionHandler to the constructor of SimpleListenerHost\n        \"\"\".trimIndent(), exception\n        )\n    }\n\n    /**\n     * 停止所有事件监听\n     */\n    public fun cancelAll() {\n        this.cancel()\n    }\n\n    protected companion object {\n        /**\n         * 获取 [ExceptionInEventHandlerException.event]\n         */\n        @JvmStatic\n        protected val Throwable.event: Event?\n            get() = this.castOrNull<ExceptionInEventHandlerException>()?.event\n\n        /**\n         * 递归获取 [Throwable.cause], 无 `cause` 时返回 `this`\n         */\n        @JvmStatic\n        protected val Throwable.rootCause: Throwable\n            get() = generateSequence(this) { it.cause }.last()\n    }\n}\n\n/**\n * [EventHandler] 标记的函数在处理事件时产生异常时包装异常并重新抛出\n */\npublic class ExceptionInEventHandlerException(\n    /**\n     * 当时正在处理的事件\n     */\n    public val event: Event,\n    override val message: String = \"Exception in EventHandler\",\n    /**\n     * 原异常\n     */\n    override val cause: Throwable\n) : IllegalStateException()\n\n\n/**\n * 反射得到所有标注了 [EventHandler] 的函数 (Java 为方法), 并注册为事件监听器\n *\n * @see EventHandler 获取更多信息\n */\n@JvmSynthetic\n// T 通常可以是 SimpleListenerHost\npublic inline fun <T> T.registerTo(eventChannel: EventChannel<*>): Unit\n        where T : CoroutineScope, T : ListenerHost = eventChannel.parentScope(this).registerListenerHost(this)"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/Listener.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"DEPRECATION\", \"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n@file:JvmName(\"SubscriberKt\")\n@file:JvmMultifileClass\n\npackage net.mamoe.mirai.event\n\nimport kotlinx.coroutines.CompletableJob\nimport kotlinx.coroutines.sync.Mutex\nimport net.mamoe.mirai.event.EventPriority.*\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\n/**\n * 订阅者的状态\n */\npublic enum class ListeningStatus {\n    /**\n     * 表示继续监听\n     */\n    LISTENING,\n\n    /**\n     * 表示已停止.\n     *\n     * - 若监听器使用 [ConcurrencyKind.LOCKED],\n     * 在这之后监听器将会被从监听器列表中删除, 因此不再能接收到事件.\n     * - 若使用 [ConcurrencyKind.CONCURRENT],\n     * 在这之后无法保证立即停止监听.\n     */\n    STOPPED\n}\n\n/**\n * 事件监听器.\n * 由 [EventChannel.subscribe] 等方法返回.\n *\n * 取消监听: [complete]\n */\n@NotStableForInheritance\npublic interface Listener<in E : Event> : CompletableJob {\n\n    // Impl notes:\n    // Inheriting CompletableJob is a bad idea. See #1224.\n    // However, we cannot change it as it leads to binary changes.\n    // We can do it in 3.0 or when we found incompatibility with kotlinx.coroutines.\n\n    /**\n     * 并发类型\n     */\n    public val concurrencyKind: ConcurrencyKind\n\n\n    /**\n     * 事件优先级\n     * @see [EventPriority]\n     */\n    public val priority: EventPriority get() = NORMAL\n\n    /**\n     * 这个方法将会调用 [EventChannel.subscribe] 时提供的参数 `noinline handler: suspend E.(E) -> ListeningStatus`.\n     *\n     * 这个函数会传递捕获的异常到本 [Listener] 创建时提供的监听方 [CoroutineContext] (通常). 详细行为可见 [EventChannel.subscribe].\n     */\n    public suspend fun onEvent(event: E): ListeningStatus\n}\n\npublic enum class ConcurrencyKind {\n    /**\n     * 并发地同时处理多个事件, 但无法保证 [Listener.onEvent] 返回 [ListeningStatus.STOPPED] 后立即停止事件监听.\n     */\n    CONCURRENT,\n\n    /**\n     * 使用 [Mutex] 保证同一时刻只处理一个事件.\n     */\n    LOCKED\n}\n\n\n/**\n * 事件优先级.\n *\n * 在广播时, 事件监听器的调用顺序为 (从左到右):\n * [HIGHEST] -> [HIGH] -> [NORMAL] -> [LOW] -> [LOWEST] -> [MONITOR]\n *\n * - 使用 [MONITOR] 优先级的监听器将会被**并行**调用.\n * - 使用其他优先级的监听器都将会**按顺序**调用.\n *   因此一个监听器的挂起可以阻塞事件处理过程而导致低优先级的监听器较晚处理.\n *\n * 当事件被 [拦截][Event.intercept] 后, 优先级较低 (靠右) 的监听器将不会被调用.\n */\npublic enum class EventPriority {\n\n    HIGHEST, HIGH, NORMAL, LOW, LOWEST,\n\n    /**\n     * 最低的优先级.\n     *\n     * 使用此优先级的监听器应遵循约束:\n     * - 不 [拦截事件][Event.intercept]\n     */\n    MONITOR;\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/MessageSelectBuilderUnit.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.event\n\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.event.events.MessageEvent\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.data.MessageSource.Key.quote\nimport net.mamoe.mirai.message.data.PlainText\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n/**\n * [selectMessagesUnit] 或 [selectMessages] 时的 DSL 构建器.\n *\n * 它是特殊化的消息监听 ([EventChannel.subscribeMessages]) DSL\n *\n * @see MessageSubscribersBuilder 查看上层 API\n */\n@OptIn(MiraiInternalApi::class)\npublic abstract class MessageSelectBuilderUnit<M : MessageEvent, R> @PublishedApi internal constructor(\n    ownerMessagePacket: M,\n    stub: Any?,\n    subscriber: (M.(String) -> Boolean, MessageListener<M, Any?>) -> Unit\n) : CommonMessageSelectBuilderUnit<M, R>(ownerMessagePacket, stub, subscriber) {\n    @JvmName(\"timeout-ncvN2qU\")\n    @Deprecated(\"For binary compatibility\", level = DeprecationLevel.HIDDEN)\n    public fun timeout00(timeoutMillis: Long): MessageSelectionTimeoutChecker {\n        return timeout(timeoutMillis)\n    }\n\n    @Suppress(\"unused\")\n    @JvmName(\"invoke-RNyhSv4\")\n    @Deprecated(\"For binary compatibility\", level = DeprecationLevel.HIDDEN)\n    public fun MessageSelectionTimeoutChecker.invoke00(block: suspend () -> R) {\n        return invoke(block)\n    }\n\n    @Suppress(\"unused\")\n    @JvmName(\"invoke-RNyhSv4\")\n    @Deprecated(\"For binary compatibility\", level = DeprecationLevel.HIDDEN)\n    public fun MessageSelectionTimeoutChecker.invoke000(block: suspend () -> R): Nothing? {\n        invoke(block)\n        return null\n    }\n\n    @JvmName(\"reply-RNyhSv4\")\n    @Deprecated(\"For binary compatibility\", level = DeprecationLevel.HIDDEN)\n    public infix fun MessageSelectionTimeoutChecker.reply00(block: suspend () -> Any?) {\n        return reply(block)\n    }\n\n    @JvmName(\"reply-RNyhSv4\")\n    @Deprecated(\"For binary compatibility\", level = DeprecationLevel.HIDDEN)\n    public infix fun MessageSelectionTimeoutChecker.reply000(block: suspend () -> Any?): Nothing? {\n        reply(block)\n        return null\n    }\n\n    @JvmName(\"reply-sCZ5gAI\")\n    @Deprecated(\"For binary compatibility\", level = DeprecationLevel.HIDDEN)\n    public infix fun MessageSelectionTimeoutChecker.reply00(message: String) {\n        return reply(message)\n    }\n\n    @JvmName(\"reply-sCZ5gAI\")\n    @Deprecated(\"For binary compatibility\", level = DeprecationLevel.HIDDEN)\n    public infix fun MessageSelectionTimeoutChecker.reply000(message: String): Nothing? {\n        reply(message)\n        return null\n    }\n\n    @JvmName(\"reply-AVDwu3U\")\n    @Deprecated(\"For binary compatibility\", level = DeprecationLevel.HIDDEN)\n    public infix fun MessageSelectionTimeoutChecker.reply00(message: Message) {\n        return reply(message)\n    }\n\n    @JvmName(\"reply-AVDwu3U\")\n    @Deprecated(\"For binary compatibility\", level = DeprecationLevel.HIDDEN)\n    public infix fun MessageSelectionTimeoutChecker.reply000(message: Message): Nothing? {\n        reply(message)\n        return null\n    }\n\n\n    @JvmName(\"quoteReply-RNyhSv4\")\n    @Deprecated(\"For binary compatibility\", level = DeprecationLevel.HIDDEN)\n    public infix fun MessageSelectionTimeoutChecker.quoteReply00(block: suspend () -> Any?) {\n        return reply(block)\n    }\n\n    @JvmName(\"quoteReply-RNyhSv4\")\n    @Deprecated(\"For binary compatibility\", level = DeprecationLevel.HIDDEN)\n    public infix fun MessageSelectionTimeoutChecker.quoteReply000(block: suspend () -> Any?): Nothing? {\n        reply(block)\n        return null\n    }\n\n    @JvmName(\"quoteReply-sCZ5gAI\")\n    @Deprecated(\"For binary compatibility\", level = DeprecationLevel.HIDDEN)\n    public infix fun MessageSelectionTimeoutChecker.quoteReply00(message: String) {\n        return reply(message)\n    }\n\n    @JvmName(\"quoteReply-sCZ5gAI\")\n    @Deprecated(\"For binary compatibility\", level = DeprecationLevel.HIDDEN)\n    public infix fun MessageSelectionTimeoutChecker.quoteReply000(message: String): Nothing? {\n        reply(message)\n        return null\n    }\n\n    @JvmName(\"quoteReply-AVDwu3U\")\n    @Deprecated(\"For binary compatibility\", level = DeprecationLevel.HIDDEN)\n    public infix fun MessageSelectionTimeoutChecker.quoteReply00(message: Message) {\n        return reply(message)\n    }\n\n    @JvmName(\"quoteReply-AVDwu3U\")\n    @Deprecated(\"For binary compatibility\", level = DeprecationLevel.HIDDEN)\n    public infix fun MessageSelectionTimeoutChecker.quoteReply000(message: Message): Nothing? {\n        reply(message)\n        return null\n    }\n}\n\n/**\n * [MessageSelectBuilderUnit] 的跨平台实现\n */\n@MiraiInternalApi\npublic abstract class CommonMessageSelectBuilderUnit<M : MessageEvent, R> protected constructor(\n    private val ownerMessagePacket: M,\n    stub: Any?,\n    subscriber: (M.(String) -> Boolean, MessageListener<M, Any?>) -> Unit\n) : MessageSubscribersBuilder<M, Unit, R, Any?>(stub, subscriber) {\n    /**\n     * 当其他条件都不满足时的默认处理.\n     */\n    @MessageDsl\n    public abstract fun default(onEvent: MessageListener<M, R>) // 需要后置默认监听器\n\n    @Deprecated(\"Use `default` instead\", level = DeprecationLevel.HIDDEN)\n    override fun always(onEvent: MessageListener<M, Any?>): Nothing = error(\"prohibited\")\n\n    /**\n     * 限制本次 select 的最长等待时间, 当超时后抛出 [TimeoutCancellationException]\n     */\n    @MessageDsl\n    public fun timeoutException(\n        timeoutMillis: Long,\n        exception: () -> Throwable\n    ) {\n        require(timeoutMillis > 0) { \"timeoutMillis must be positive\" }\n        obtainCurrentCoroutineScope().launch {\n            delay(timeoutMillis)\n            val deferred = obtainCurrentDeferred() ?: return@launch\n            if (deferred.isActive && !deferred.isCompleted) {\n                deferred.completeExceptionally(exception())\n            }\n        }\n    }\n\n    /**\n     * 限制本次 select 的最长等待时间, 当超时后执行 [block] 以完成 select\n     */\n    @MessageDsl\n    public fun timeout(timeoutMillis: Long, block: suspend () -> R) {\n        require(timeoutMillis > 0) { \"timeoutMillis must be positive\" }\n        obtainCurrentCoroutineScope().launch {\n            delay(timeoutMillis)\n            val deferred = obtainCurrentDeferred() ?: return@launch\n            if (deferred.isActive && !deferred.isCompleted) {\n                deferred.complete(block())\n            }\n        }\n    }\n\n\n    /**\n     * 返回一个限制本次 select 的最长等待时间的 [Deferred]\n     *\n     * @see invoke\n     * @see reply\n     */\n    @MessageDsl\n    public fun timeout(timeoutMillis: Long): MessageSelectionTimeoutChecker {\n        require(timeoutMillis > 0) { \"timeoutMillis must be positive\" }\n        return MessageSelectionTimeoutChecker(timeoutMillis)\n    }\n\n    /**\n     * 返回一个限制本次 select 的最长等待时间的 [Deferred]\n     *\n     * @see Deferred<Unit>.invoke\n     */\n    @Suppress(\"unused\")\n    public fun MessageSelectionTimeoutChecker.invoke(block: suspend () -> R) {\n        return timeout(this.timeoutMillis, block)\n    }\n\n    /**\n     * 在超时后回复原消息\n     *\n     * 当 [block] 返回值为 [Unit] 时不回复, 为 [Message] 时回复 [Message], 其他将 [toString] 后回复为 [PlainText]\n     *\n     * @see timeout\n     * @see quoteReply\n     */\n    @Suppress(\"unused\", \"UNCHECKED_CAST\")\n    public open infix fun MessageSelectionTimeoutChecker.reply(block: suspend () -> Any?) {\n        return timeout(this.timeoutMillis) {\n            executeAndReply(block)\n            Unit as R\n        }\n    }\n\n    @Suppress(\"unused\", \"UNCHECKED_CAST\")\n    public open infix fun MessageSelectionTimeoutChecker.reply(message: Message) {\n        return timeout(this.timeoutMillis) {\n            ownerMessagePacket.subject.sendMessage(message)\n            Unit as R\n        }\n    }\n\n    @Suppress(\"unused\", \"UNCHECKED_CAST\")\n    public open infix fun MessageSelectionTimeoutChecker.reply(message: String) {\n        return timeout(this.timeoutMillis) {\n            ownerMessagePacket.subject.sendMessage(message)\n            Unit as R\n        }\n    }\n\n    /**\n     * 在超时后引用回复原消息\n     *\n     * 当 [block] 返回值为 [Unit] 时不回复, 为 [Message] 时回复 [Message], 其他将 [toString] 后回复为 [PlainText]\n     *\n     * @see timeout\n     * @see reply\n     */\n    @Suppress(\"unused\", \"UNCHECKED_CAST\")\n    public open infix fun MessageSelectionTimeoutChecker.quoteReply(block: suspend () -> Any?) {\n        return timeout(this.timeoutMillis) {\n            executeAndQuoteReply(block)\n            Unit as R\n        }\n    }\n\n    @Suppress(\"unused\", \"UNCHECKED_CAST\")\n    public open infix fun MessageSelectionTimeoutChecker.quoteReply(message: Message) {\n        return timeout(this.timeoutMillis) {\n            ownerMessagePacket.subject.sendMessage(ownerMessagePacket.message.quote() + message)\n            Unit as R\n        }\n    }\n\n    @Suppress(\"unused\", \"UNCHECKED_CAST\")\n    public open infix fun MessageSelectionTimeoutChecker.quoteReply(message: String) {\n        return timeout(this.timeoutMillis) {\n            ownerMessagePacket.subject.sendMessage(ownerMessagePacket.message.quote() + message)\n            Unit as R\n        }\n    }\n\n    /**\n     * 当其他条件都不满足时回复原消息.\n     *\n     * 当 [block] 返回值为 [Unit] 时不回复, 为 [Message] 时回复 [Message], 其他将 [toString] 后回复为 [PlainText]\n     */\n    @MessageDsl\n    public fun defaultReply(block: suspend () -> Any?): Unit = subscriber({ true }, {\n        this@CommonMessageSelectBuilderUnit.executeAndReply(block)\n    })\n\n\n    /**\n     * 当其他条件都不满足时引用回复原消息.\n     *\n     * 当 [block] 返回值为 [Unit] 时不回复, 为 [Message] 时回复 [Message], 其他将 [toString] 后回复为 [PlainText]\n     */\n    @MessageDsl\n    public fun defaultQuoteReply(block: suspend () -> Any?): Unit = subscriber({ true }, {\n        this@CommonMessageSelectBuilderUnit.executeAndQuoteReply(block)\n    })\n\n    private suspend inline fun executeAndReply(noinline block: suspend () -> Any?) {\n        when (val result = block()) {\n            Unit -> {\n\n            }\n\n            is Message -> ownerMessagePacket.subject.sendMessage(result)\n            else -> ownerMessagePacket.subject.sendMessage(result.toString())\n        }\n    }\n\n    private suspend inline fun executeAndQuoteReply(noinline block: suspend () -> Any?) {\n        when (val result = block()) {\n            Unit -> {\n\n            }\n\n            is Message -> ownerMessagePacket.subject.sendMessage(ownerMessagePacket.message.quote() + result)\n            else -> ownerMessagePacket.subject.sendMessage(ownerMessagePacket.message.quote() + result.toString())\n        }\n    }\n\n    protected abstract fun obtainCurrentCoroutineScope(): CoroutineScope\n    protected abstract fun obtainCurrentDeferred(): CompletableDeferred<R>?\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/MessageSubscribersBuilder.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\n    \"unused\", \"DSL_SCOPE_VIOLATION_WARNING\", \"INAPPLICABLE_JVM_NAME\", \"INVALID_CHARACTERS\",\n    \"NAME_CONTAINS_ILLEGAL_CHARS\", \"FunctionName\"\n)\n\npackage net.mamoe.mirai.event\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.internal.event.*\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.message.data.MessageSource.Key.quote\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport kotlin.annotation.AnnotationTarget.CONSTRUCTOR\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmOverloads\nimport kotlin.jvm.JvmSynthetic\n\n\n/**\n * 消息事件的处理器.\n *\n * 注:\n * 接受者 T 为 [MessageEvent]\n * 参数 String 为 转为字符串了的消息 ([Message.toString])\n */\npublic typealias MessageListener<T, R> = @MessageDsl suspend T.(String) -> R\n\n\n/**\n * 消息订阅构造器\n *\n * @param M 消息类型\n * @param R 消息监听器内部的返回值\n * @param Ret 每个 DSL 函数创建监听器之后的返回值\n *\n * @see EventChannel.subscribeMessages\n */\n@MessageDsl\npublic open class MessageSubscribersBuilder<M : MessageEvent, out Ret, R : RR, RR> internal constructor(\n    /**\n     * 用于 [MessageListener] 无返回值的替代.\n     */\n    @PublishedApi\n    internal val stub: RR,\n    /**\n     * invoke 这个 lambda 时, 它将会把 [消息事件的处理器][MessageListener] 注册给事件, 并返回注册完成返回的监听器.\n     */\n    public val subscriber: (M.(String) -> Boolean, MessageListener<M, RR>) -> Ret\n) {\n    @RequiresOptIn(level = RequiresOptIn.Level.ERROR)\n    @Target(CONSTRUCTOR)\n    private annotation class UseNewListenerFilterInstead\n\n    @OptIn(UseNewListenerFilterInstead::class)\n    public open fun newListeningFilter(filter: M.(String) -> Boolean): ListeningFilter = ListeningFilter(filter)\n\n    /**\n     * 由 [contains], [startsWith] 等 DSL 创建出的监听条件, 使用 [invoke] 将其注册给事件\n     */\n    public inner class ListeningFilter @UseNewListenerFilterInstead internal constructor(\n        public val filter: M.(String) -> Boolean\n    ) {\n        /** 进行逻辑 `or`. */\n        public infix fun or(another: ListeningFilter): ListeningFilter =\n            newListeningFilter { filter.invoke(this, it) || another.filter.invoke(this, it) }\n\n        /** 进行逻辑 `and`. */\n        public infix fun and(another: ListeningFilter): ListeningFilter =\n            newListeningFilter { filter.invoke(this, it) && another.filter.invoke(this, it) }\n\n        /** 进行逻辑 `xor`. */\n        public infix fun xor(another: ListeningFilter): ListeningFilter =\n            newListeningFilter { filter.invoke(this, it) xor another.filter.invoke(this, it) }\n\n        /** 进行逻辑 `nand`, 即 `not and`. */\n        public infix fun nand(another: ListeningFilter): ListeningFilter =\n            newListeningFilter { !filter.invoke(this, it) || !another.filter.invoke(this, it) }\n\n        /** 进行逻辑 `not` */\n        public fun not(): ListeningFilter = newListeningFilter { !filter.invoke(this, it) }\n\n        /** 启动事件监听. */\n        // do not inline due to kotlin (1.3.61) bug: java.lang.IllegalAccessError\n        public operator fun invoke(onEvent: MessageListener<M, R>): Ret = content(filter, onEvent)\n    }\n\n    /** 启动监听器, 在 [Bot] 未被禁言且消息满足条件 [this] 时回复原消息 */\n    @MessageDsl\n    public open infix fun ListeningFilter.reply(toReply: String): Ret =\n        content(filter) { if ((this as? GroupMessageEvent)?.group?.isBotMuted != true) subject.sendMessage(toReply);this@MessageSubscribersBuilder.stub }\n\n\n    /** 启动监听器, 在 [Bot] 未被禁言且消息满足条件 [this] 时回复原消息 */\n    @MessageDsl\n    public open infix fun ListeningFilter.reply(message: Message): Ret =\n        content(filter) { if ((this as? GroupMessageEvent)?.group?.isBotMuted != true) subject.sendMessage(message);this@MessageSubscribersBuilder.stub }\n\n    /**\n     * 启动监听器, 在 [Bot] 未被禁言且消息满足条件 [this] 时执行 [replier] 并以其返回值回复.\n     * 返回值 [Unit] 将被忽略, [Message] 将被直接回复, 其他内容将会 [Any.toString] 后发送.\n     */\n    @MessageDsl\n    public open infix fun ListeningFilter.reply(\n        replier: (@MessageDsl suspend M.(String) -> Any?)\n    ): Ret =\n        content(filter) {\n            if ((this as? GroupMessageEvent)?.group?.isBotMuted != true)\n                this@MessageSubscribersBuilder.executeAndReply(this, replier)\n            else this@MessageSubscribersBuilder.stub\n        }\n\n    /** 启动监听器, 在 [Bot] 未被禁言且消息满足条件 [this] 时引用回复原消息 */\n    @MessageDsl\n    public open infix fun ListeningFilter.quoteReply(toReply: String): Ret =\n        content(filter) { if ((this as? GroupMessageEvent)?.group?.isBotMuted != true) subject.sendMessage(message.quote() + toReply); this@MessageSubscribersBuilder.stub }\n\n    /** 启动监听器, 在 [Bot] 未被禁言且消息满足条件 [this] 时引用回复原消息 */\n    @MessageDsl\n    public open infix fun ListeningFilter.quoteReply(toReply: Message): Ret =\n        content(filter) { if ((this as? GroupMessageEvent)?.group?.isBotMuted != true) subject.sendMessage(message.quote() + toReply);this@MessageSubscribersBuilder.stub }\n\n    /**\n     * 启动监听器, 在 [Bot] 未被禁言且消息满足条件 [this] 时执行 [replier] 并以其返回值回复原消息\n     * 返回值 [Unit] 将被忽略, [Message] 将被直接回复, 其他内容将会 [Any.toString] 后发送\n     */\n    @MessageDsl\n    public open infix fun ListeningFilter.quoteReply(replier: (@MessageDsl suspend M.(String) -> Any?)): Ret =\n        content(filter) {\n            if ((this as? GroupMessageEvent)?.group?.isBotMuted != true)\n                this@MessageSubscribersBuilder.executeAndQuoteReply(this, replier)\n            else this@MessageSubscribersBuilder.stub\n        }\n\n    /** 无触发条件, 每次收到消息都执行 [onEvent] */\n    @MessageDsl\n    public open fun always(onEvent: MessageListener<M, RR>): Ret = subscriber({ true }, onEvent)\n\n    /** [消息内容][Message.contentToString] `==` [equals] */\n    @MessageDsl\n    public fun case(equals: String, ignoreCase: Boolean = false, trim: Boolean = true): ListeningFilter =\n        caseImpl(equals, ignoreCase, trim)\n\n    /** 如果[消息内容][Message.contentToString]  `==` [equals] */\n    @MessageDsl\n    public operator fun String.invoke(block: MessageListener<M, R>): Ret = case(this, onEvent = block)\n\n    /** 如果[消息内容][Message.contentToString]  [matches] */\n    @MessageDsl\n    @JvmSynthetic\n    @JvmName(\"matchingExtension\")\n    public infix fun Regex.matching(block: MessageListener<M, R>): Ret = content({ it matches this@matching }, block)\n\n    /** 如果[消息内容][Message.contentToString] [Regex.find] 不为空 */\n    @MessageDsl\n    @JvmSynthetic\n    @JvmName(\"findingExtension\")\n    public infix fun Regex.finding(block: @MessageDsl suspend M.(MatchResult) -> R): Ret =\n        always { content -> this@finding.find(content)?.let { block(this, it) } ?: this@MessageSubscribersBuilder.stub }\n\n    /**\n     * [消息内容][Message.contentToString] `==` [equals]\n     * @param trim `true` 则删除首尾空格后比较\n     * @param ignoreCase `true` 则不区分大小写\n     */\n    @MessageDsl\n    public fun case(\n        equals: String, ignoreCase: Boolean = false, trim: Boolean = true,\n        onEvent: MessageListener<M, R>\n    ): Ret = (if (trim) equals.trim() else equals).let { toCheck ->\n        content({ (if (trim) it.trim() else it).equals(toCheck, ignoreCase = ignoreCase) }) {\n            onEvent(this, this.message.contentToString())\n        }\n    }\n\n    /** [消息内容][Message.contentToString]包含 [sub] */\n    @MessageDsl\n    @JvmOverloads // bin comp\n    public fun contains(sub: String, ignoreCase: Boolean = false): ListeningFilter =\n        content { it.contains(sub, ignoreCase) }\n\n    /**\n     * [消息内容][Message.contentToString]包含 [sub] 中的任意一个元素\n     */\n    @MessageDsl\n    public fun contains(\n        sub: String, ignoreCase: Boolean = false, trim: Boolean = true,\n        onEvent: MessageListener<M, R>\n    ): Ret = containsImpl(sub, ignoreCase, trim, onEvent)\n\n    /** [消息内容][Message.contentToString]包含 [sub] */\n    @JvmOverloads\n    @MessageDsl\n    public fun containsAny(vararg sub: String, ignoreCase: Boolean = false, trim: Boolean = true): ListeningFilter =\n        containsAnyImpl(*sub, ignoreCase = ignoreCase, trim = trim)\n\n    /** [消息内容][Message.contentToString]包含 [sub] */\n    @JvmOverloads\n    @MessageDsl\n    public fun containsAll(vararg sub: String, ignoreCase: Boolean = false, trim: Boolean = true): ListeningFilter =\n        containsAllImpl(sub, ignoreCase = ignoreCase, trim = trim)\n\n\n    /** 如果消息的前缀是 [prefix] */\n    @MessageDsl\n    public fun startsWith(prefix: String, trim: Boolean = true): ListeningFilter {\n        val toCheck = if (trim) prefix.trimStart() else prefix\n        return content { (if (trim) it.trimStart() else it).startsWith(toCheck) }\n    }\n\n    /** 如果消息的前缀是 [prefix] */\n    @MessageDsl\n    public fun startsWith(\n        prefix: String, removePrefix: Boolean = true, trim: Boolean = true,\n        onEvent: @MessageDsl suspend M.(String) -> R\n    ): Ret = startsWithImpl(prefix, removePrefix, trim, onEvent)\n\n    /** 如果消息的结尾是 [suffix] */\n    @MessageDsl\n    @JvmOverloads // for binary compatibility\n    public fun endsWith(suffix: String, trim: Boolean = true): ListeningFilter {\n        val toCheck = if (trim) suffix.trimEnd() else suffix\n        return content { (if (trim) it.trimEnd() else it).endsWith(toCheck) }\n    }\n\n    /** 如果消息的结尾是 [suffix] */\n    @MessageDsl\n    public fun endsWith(\n        suffix: String, removeSuffix: Boolean = true, trim: Boolean = true,\n        onEvent: @MessageDsl suspend M.(String) -> R\n    ): Ret = endsWithImpl(suffix, removeSuffix, trim, onEvent)\n\n    /** 如果是这个人发的消息. 消息目前只会是群消息 */\n    @MessageDsl\n    public fun sentBy(name: String): ListeningFilter = content { this is GroupMessageEvent && this.senderName == name }\n\n    /** 如果是这个人发的消息. 消息可以是好友消息也可以是群消息 */\n    @MessageDsl\n    public fun sentBy(qq: Long): ListeningFilter = content { sender.id == qq }\n\n    /** 如果是这个人发的消息. 消息可以是好友消息也可以是群消息 */\n    @MessageDsl\n    public fun sentBy(friend: User): ListeningFilter = content { sender.id == friend.id }\n\n    /** 如果是这个人发的消息. 消息可以是好友消息也可以是群消息 */\n    @MessageDsl\n    public fun sentBy(qq: Long, onEvent: MessageListener<M, R>): Ret = content { this.sender.id == qq }.invoke(onEvent)\n\n    /** 如果是好友发来的消息 */\n    @MessageDsl\n    public fun sentByFriend(onEvent: MessageListener<FriendMessageEvent, R>): Ret =\n        content({ this is FriendMessageEvent }) { onEvent(this as FriendMessageEvent, it) }\n\n    /** 如果是好友发来的消息 */\n    @MessageDsl\n    public fun sentByFriend(): ListeningFilter = newListeningFilter { this is FriendMessageEvent }\n\n    /** 如果是陌生人发来的消息 */\n    @MessageDsl\n    public fun sentByStranger(onEvent: MessageListener<StrangerMessageEvent, R>): Ret =\n        content({ this is StrangerMessageEvent }) { onEvent(this as StrangerMessageEvent, it) }\n\n    /** 如果是陌生人发来的消息 */\n    @MessageDsl\n    public fun sentByStranger(): ListeningFilter = newListeningFilter { this is StrangerMessageEvent }\n\n    /** 如果是群临时会话消息 */\n    @MessageDsl\n    @Deprecated(\"use sentByGroupTemp()\", ReplaceWith(\"sentByGroupTemp()\"), DeprecationLevel.HIDDEN)\n    @DeprecatedSinceMirai(hiddenSince = \"2.0\") // maybe 2.0\n    public fun sentByTemp(): ListeningFilter = sentByGroupTemp()\n\n    /** 如果是群临时会话消息 */\n    @MessageDsl\n    public fun sentByGroupTemp(): ListeningFilter = newListeningFilter { this is GroupTempMessageEvent }\n\n    /** 如果是管理员或群主发的消息 */\n    @MessageDsl\n    public fun sentByOperator(): ListeningFilter =\n        content { this is GroupMessageEvent && sender.permission.isOperator() }\n\n    /** 如果是管理员发的消息 */\n    @MessageDsl\n    public fun sentByAdministrator(): ListeningFilter =\n        content { this is GroupMessageEvent && sender.permission.isAdministrator() }\n\n    /** 如果是群主发的消息 */\n    @MessageDsl\n    public fun sentByOwner(): ListeningFilter = content { this is GroupMessageEvent && sender.isOwner() }\n\n    /** 如果是来自这个群的消息 */\n    @MessageDsl\n    public fun sentFrom(groupId: Long): ListeningFilter = content { this is GroupMessageEvent && group.id == groupId }\n\n    /** 如果是来自这个群的消息 */\n    @MessageDsl\n    public fun sentFrom(group: Group): ListeningFilter = content { this is GroupMessageEvent && group.id == group.id }\n\n    /** [消息内容][Message.contentToString]包含目标为 [Bot] 的 [At] */\n    @MessageDsl\n    public fun atBot(): ListeningFilter = content { message.firstIsInstanceOrNull<At>()?.target == bot.id }\n\n    /** [消息内容][Message.contentToString]包含 [AtAll] */\n    @MessageDsl\n    public fun atAll(): ListeningFilter = content { message.firstIsInstanceOrNull<AtAll>() != null }\n\n    /** [消息内容][Message.contentToString]包含目标为 [target] 的 [At] */\n    @MessageDsl\n    public fun at(target: Long): ListeningFilter = content { message.firstIsInstanceOrNull<At>()?.target == target }\n\n    /** [消息内容][Message.contentToString]包含目标为 [target] 的 [At] */\n    @MessageDsl\n    public fun at(target: User): ListeningFilter = content { message.firstIsInstanceOrNull<At>()?.target == target.id }\n\n    /** [消息内容][Message.contentToString]包含目标为 [Bot] 的 [At], 就执行 [onEvent] */\n    @MessageDsl\n    public fun atBot(onEvent: @MessageDsl suspend M.(String) -> R): Ret =\n        content { message.firstIsInstanceOrNull<At>()?.target == bot.id }.invoke {\n            onEvent.invoke(this, message.contentToString())\n        }\n\n    @MessageDsl\n    public inline fun <reified N : SingleMessage> has(noinline onEvent: @MessageDsl suspend M.(N) -> R): Ret =\n        content { message.any { it is N } }.invoke { onEvent.invoke(this, message.firstIsInstance()) }\n\n    /** [消息内容][Message.contentToString]包含 [N] 类型的 [Message] */\n    @MessageDsl\n    public inline fun <reified N : SingleMessage> has(): ListeningFilter = content { message.any { it is N } }\n\n    /** 如果 [mapper] 返回值非空, 就执行 [onEvent] */\n    @MessageDsl\n    public open fun <N : Any> mapping(mapper: M.(String) -> N?, onEvent: @MessageDsl suspend M.(N) -> R): Ret =\n        always {\n            onEvent.invoke(\n                this,\n                mapper(this, message.contentToString()) ?: return@always this@MessageSubscribersBuilder.stub\n            )\n        }\n\n    /** 如果 [filter] 返回 `true` */\n    @MessageDsl\n    public fun content(filter: M.(String) -> Boolean): ListeningFilter = newListeningFilter(filter)\n\n    /** [消息内容][Message.contentToString]可由正则表达式匹配([Regex.matchEntire]) */\n    @MessageDsl\n    public fun matching(regex: Regex): ListeningFilter = content { regex.matchEntire(it) != null }\n\n\n    /** [消息内容][Message.contentToString]可由正则表达式匹配([Regex.matchEntire]), 就执行 `onEvent` */\n    @MessageDsl\n    public fun matching(regex: Regex, onEvent: @MessageDsl suspend M.(MatchResult) -> Unit): Ret =\n        always {\n            this@MessageSubscribersBuilder.executeAndReply(this) {\n                onEvent.invoke(\n                    this,\n                    regex.matchEntire(it) ?: return@always this@MessageSubscribersBuilder.stub\n                )\n            }\n        }\n\n    /** [消息内容][Message.contentToString]可由正则表达式查找([Regex.find]) */\n    @MessageDsl\n    public fun finding(regex: Regex): ListeningFilter = content { regex.find(it) != null }\n\n    /** [消息内容][Message.contentToString]可由正则表达式查找([Regex.find]), 就执行 `onEvent` */\n    @MessageDsl\n    public fun finding(regex: Regex, onEvent: @MessageDsl suspend M.(MatchResult) -> Unit): Ret =\n        always {\n            this@MessageSubscribersBuilder.executeAndReply(this) {\n                onEvent.invoke(\n                    this,\n                    regex.find(it) ?: return@always this@MessageSubscribersBuilder.stub\n                )\n            }\n        }\n\n\n    /** [消息内容][Message.contentToString]包含 [this] 则回复 [reply] */\n    @MessageDsl\n    public open infix fun String.containsReply(reply: String): Ret =\n        content({ this@containsReply in it }, { subject.sendMessage(reply); this@MessageSubscribersBuilder.stub })\n\n    /**\n     * [消息内容][Message.contentToString]包含 [this] 则执行 [replier] 并将其返回值回复给发信对象.\n     *\n     * [replier] 的 `it` 将会是消息内容 string.\n     *\n     * @param replier 若返回 [Message] 则直接发送; 若返回 [Unit] 则不回复; 其他情况则 [Any.toString] 后回复\n     */\n    @MessageDsl\n    public open infix fun String.containsReply(replier: @MessageDsl suspend M.(String) -> Any?): Ret =\n        content({ this@containsReply in it }, { this@MessageSubscribersBuilder.executeAndReply(this, replier) })\n\n    /**\n     * [消息内容][Message.contentToString]可由正则表达式匹配([Regex.matchEntire]), 则执行 [replier] 并将其返回值回复给发信对象.\n     *\n     * [replier] 的 `it` 将会是消息内容 string.\n     *\n     * @param replier 若返回 [Message] 则直接发送; 若返回 [Unit] 则不回复; 其他情况则 [Any.toString] 后回复\n     */\n    @MessageDsl\n    public open infix fun Regex.matchingReply(replier: @MessageDsl suspend M.(MatchResult) -> Any?): Ret =\n        always {\n            this@MessageSubscribersBuilder.executeAndReply(this) {\n                replier.invoke(\n                    this,\n                    matchEntire(it) ?: return@always this@MessageSubscribersBuilder.stub\n                )\n            }\n        }\n\n    /**\n     * [消息内容][Message.contentToString]可由正则表达式查找([Regex.find]), 则执行 [replier] 并将其返回值回复给发信对象.\n     *\n     * [replier] 的 `it` 将会是消息内容 string.\n     *\n     * @param replier 若返回 [Message] 则直接发送; 若返回 [Unit] 则不回复; 其他情况则 [Any.toString] 后回复\n     */\n    @MessageDsl\n    public open infix fun Regex.findingReply(replier: @MessageDsl suspend M.(MatchResult) -> Any?): Ret =\n        always {\n            this@MessageSubscribersBuilder.executeAndReply(this) {\n                replier.invoke(\n                    this,\n                    this@findingReply.find(it) ?: return@always this@MessageSubscribersBuilder.stub\n                )\n            }\n        }\n\n\n    /**\n     * 不考虑空格, [消息内容][Message.contentToString]以 [this] 结尾则执行 [replier] 并将其返回值回复给发信对象.\n     * @param replier 若返回 [Message] 则直接发送; 若返回 [Unit] 则不回复; 其他情况则 [Any.toString] 后回复\n     */\n    @MessageDsl\n    public open infix fun String.endsWithReply(replier: @MessageDsl suspend M.(String) -> Any?): Ret {\n        val toCheck = this.trimEnd()\n        return content({ it.trim().endsWith(toCheck) }, {\n            this@MessageSubscribersBuilder.executeAndReply(this) { replier(this, it.trim().removeSuffix(toCheck)) }\n        })\n    }\n\n    /** 当发送的消息内容为 [this] 就回复 [reply] */\n    @MessageDsl\n    public open infix fun String.reply(reply: String): Ret {\n        val toCheck = this.trim()\n        return content({ it.trim() == toCheck }, { subject.sendMessage(reply);this@MessageSubscribersBuilder.stub })\n    }\n\n    /** 当发送的消息内容为 [this] 就回复 [reply] */\n    @MessageDsl\n    public open infix fun String.reply(reply: Message): Ret {\n        val toCheck = this.trim()\n        return content({ it.trim() == toCheck }, { subject.sendMessage(reply);this@MessageSubscribersBuilder.stub })\n    }\n\n    /** 当发送的消息内容为 [this] 就执行并回复 [replier] 的返回值 */\n    @MessageDsl\n    public open infix fun String.reply(replier: @MessageDsl suspend M.(String) -> Any?): Ret {\n        val toCheck = this.trim()\n        return content({ it.trim() == toCheck }, {\n            @Suppress(\"DSL_SCOPE_VIOLATION_WARNING\")\n            this@MessageSubscribersBuilder.executeAndReply(this) { replier(this, it.trim()) }\n        })\n    }\n\n    /////////////////////////////////\n    //// DEPRECATED AND INTERNAL ////\n    /////////////////////////////////\n\n    @Suppress(\"REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE\", \"UNCHECKED_CAST\") // false positive\n    internal suspend inline fun executeAndReply(m: M, replier: suspend M.(String) -> Any?): RR {\n        when (val message = replier(m, m.message.contentToString())) {\n            is Message -> m.subject.sendMessage(message)\n            null,\n            is Unit -> Unit\n            else -> m.subject.sendMessage(message.toString())\n        }\n        return stub\n    }\n\n    @Suppress(\"REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE\", \"UNCHECKED_CAST\") // false positive\n    internal suspend inline fun executeAndQuoteReply(m: M, replier: suspend M.(String) -> Any?): RR {\n        when (val message = replier(m, m.message.contentToString())) {\n            is Message -> m.subject.sendMessage(m.message.quote() + message)\n            null,\n            is Unit -> Unit\n            else -> m.subject.sendMessage(m.message.quote() + message.toString())\n        }\n        return stub\n    }\n}\n\n/**\n * DSL 标记. 将能让 IDE 阻止一些错误的方法调用.\n */\n@Retention(AnnotationRetention.SOURCE)\n@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS, AnnotationTarget.TYPE)\n@DslMarker\npublic annotation class MessageDsl\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/deprecated.nextEvent.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n@file:JvmName(\"NextEventKt\")\n\npackage net.mamoe.mirai.event\n\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.event.events.BotEvent\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport kotlin.coroutines.resume\nimport kotlin.reflect.KClass\n\n\n/**\n * 挂起当前协程, 直到监听到事件 [E] 的广播并通过 [filter], 返回这个事件实例.\n *\n * ### 已弃用\n *\n * 该函数相当于 [GlobalEventChannel.nextEvent].\n * 不一定需要将所有被弃用的 [nextEvent] 都换成 `GlobalEventChannel.nextEvent`, 请根据情况选择合适的 [EventChannel].\n *\n * @param timeoutMillis 超时. 单位为毫秒. `-1` 为不限制.\n * @param filter 过滤器. 返回 `true` 时表示得到了需要的实例. 返回 `false` 时表示继续监听\n *\n * @see EventChannel.subscribe 普通地监听一个事件\n * @see syncFromEvent 挂起当前协程, 并尝试从事件中同步一个值\n *\n * @throws TimeoutCancellationException 在超时后抛出.\n */\n@JvmSynthetic\n@DeprecatedSinceMirai(warningSince = \"2.10\", errorSince = \"2.12\", hiddenSince = \"2.13\")\n@Deprecated(\n    \"Use GlobalEventChannel.nextEvent\",\n    ReplaceWith(\n        \"if (timeoutMillis == -1L) { GlobalEventChannel.nextEvent<E>(priority, filter) } else { withTimeout(timeoutMillis) { GlobalEventChannel.nextEvent<E>(priority, filter) } }\",\n        \"net.mamoe.mirai.event.GlobalEventChannel\",\n        \"kotlinx.coroutines.withTimeout\",\n    ),\n    level = DeprecationLevel.HIDDEN\n)\npublic suspend inline fun <reified E : Event> nextEvent(\n    timeoutMillis: Long = -1,\n    priority: EventPriority = EventPriority.MONITOR,\n    crossinline filter: (E) -> Boolean = { true }\n): E = if (timeoutMillis == -1L) {\n    GlobalEventChannel.nextEvent(priority) { filter(it) }\n} else {\n    withTimeout(timeoutMillis) { GlobalEventChannel.nextEvent(priority) { filter(it) } }\n}\n\n/**\n * 挂起当前协程, 直到监听到事件 [E] 的广播并通过 [filter], 返回这个事件实例.\n *\n * ### 已弃用\n *\n * 该函数相当于 [GlobalEventChannel.nextEvent].\n * 不一定需要将所有被弃用的 [nextEvent] 都换成 `GlobalEventChannel.nextEvent`, 请根据情况选择合适的 [EventChannel].\n *\n * @param timeoutMillis 超时. 单位为毫秒.\n * @param filter 过滤器. 返回 `true` 时表示得到了需要的实例. 返回 `false` 时表示继续监听\n *\n * @see EventChannel.subscribe 普通地监听一个事件\n * @see syncFromEvent 挂起当前协程, 并尝试从事件中同步一个值\n *\n * @return 事件实例, 在超时后返回 `null`\n */\n@JvmSynthetic\n@DeprecatedSinceMirai(warningSince = \"2.10\", errorSince = \"2.12\", hiddenSince = \"2.13\")\n@Deprecated(\n    \"Use GlobalEventChannel.nextEvent\",\n    ReplaceWith(\n        \"withTimeoutOrNull(timeoutMillis) { GlobalEventChannel.nextEvent<E>(priority, filter) }\",\n\n        \"kotlinx.coroutines.withTimeoutOrNull\",\n        \"net.mamoe.mirai.event.GlobalEventChannel\",\n        \"net.mamoe.mirai.event.nextEvent\"\n    ),\n    level = DeprecationLevel.HIDDEN\n)\npublic suspend inline fun <reified E : Event> nextEventOrNull(\n    timeoutMillis: Long,\n    priority: EventPriority = EventPriority.MONITOR,\n    crossinline filter: (E) -> Boolean = { true }\n): E? = withTimeoutOrNull(timeoutMillis) { GlobalEventChannel.nextEvent(priority) { filter(it) } }\n\n\n///////////////////////////////////////////////////////////////////////////\n// internals\n///////////////////////////////////////////////////////////////////////////\n\n\n/**\n * @since 2.0\n */\n@JvmSynthetic\n@PublishedApi\n@Deprecated(\"Kept for binary compatibility\", level = DeprecationLevel.HIDDEN)\n@DeprecatedSinceMirai(hiddenSince = \"2.10\")\ninternal suspend inline fun <E : Event> nextEventImpl(\n    eventClass: KClass<E>,\n    coroutineScope: CoroutineScope,\n    priority: EventPriority,\n    crossinline filter: (E) -> Boolean\n): E = suspendCancellableCoroutine { cont ->\n    val listener = coroutineScope.globalEventChannel()\n        .parentJob(coroutineScope.coroutineContext[Job])\n        .subscribe(eventClass, priority = priority) {\n            if (!filter(this)) return@subscribe ListeningStatus.LISTENING\n\n            try {\n                cont.resume(this)\n            } catch (_: Exception) {\n            }\n            return@subscribe ListeningStatus.STOPPED\n        }\n\n    cont.invokeOnCancellation {\n        runCatching { listener.cancel(\"nextEvent outer scope cancelled\", it) }\n    }\n}\n\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"NOTHING_TO_INLINE\")\n@kotlin.internal.HidesMembers\n@PublishedApi\ninternal inline fun <BaseEvent : Event> EventChannel<BaseEvent>.parentJob(job: Job?): EventChannel<BaseEvent> =\n    if (job != null) parentJob(job) else this\n\n@JvmSynthetic\n@PublishedApi\n@Deprecated(\"For binary compatibility\", level = DeprecationLevel.HIDDEN)\ninternal suspend inline fun <E : BotEvent> nextBotEventImpl(\n    bot: Bot,\n    eventClass: KClass<E>,\n    coroutineScope: CoroutineScope,\n    priority: EventPriority\n): E = suspendCancellableCoroutine { cont ->\n    val listener = coroutineScope.globalEventChannel()\n        .parentJob(coroutineScope.coroutineContext[Job])\n        .subscribe(eventClass, priority = priority) {\n            try {\n                if (this.bot == bot) cont.resume(this)\n            } catch (_: Exception) {\n            }\n            return@subscribe ListeningStatus.STOPPED\n        }\n\n    cont.invokeOnCancellation {\n        runCatching { listener.cancel(\"nextEvent outer scope cancelled\", it) }\n    }\n}\n\n@JvmSynthetic\n@PublishedApi\n@Deprecated(\"Kept for binary compatibility\", level = DeprecationLevel.HIDDEN)\n@DeprecatedSinceMirai(hiddenSince = \"2.10\")\ninternal suspend fun <R> withTimeoutOrCoroutineScope(\n    timeoutMillis: Long,\n    useCoroutineScope: CoroutineScope? = null,\n    block: suspend CoroutineScope.() -> R\n): R {\n    require(timeoutMillis == -1L || timeoutMillis > 0) { \"timeoutMillis must be -1 or > 0 \" }\n\n    return if (timeoutMillis == -1L) {\n        if (useCoroutineScope == null) coroutineScope(block)\n        else block(useCoroutineScope)\n    } else {\n        withTimeout(timeoutMillis, block)\n    }\n}\n\n@JvmSynthetic\n@PublishedApi\n@Deprecated(\"Kept for binary compatibility\", level = DeprecationLevel.HIDDEN)\n@DeprecatedSinceMirai(hiddenSince = \"2.10\")\ninternal suspend inline fun <R> withTimeoutOrCoroutineScope(\n    timeoutMillis: Long,\n    noinline block: suspend CoroutineScope.() -> R\n): R {\n    require(timeoutMillis == -1L || timeoutMillis > 0) { \"timeoutMillis must be -1 or > 0 \" }\n\n    return if (timeoutMillis == -1L) {\n        coroutineScope(block)\n    } else {\n        withTimeout(timeoutMillis, block)\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/deprecated.nextEventAsync.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n@file:JvmName(\"NextEventAsyncKt\")\n\npackage net.mamoe.mirai.event\n\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\n\n\n/**\n * 返回一个 [Deferred], 其值为下一个广播并通过 [filter] 的事件 [E] 示例.\n *\n * @param timeoutMillis 超时. 单位为毫秒. `-1` 为不限制.\n * @param filter 过滤器. 返回 `true` 时表示得到了需要的实例. 返回 `false` 时表示继续监听\n * @param coroutineContext 添加给启动的协程的 [CoroutineContext]\n *\n * @see nextEvent 同步版本\n * @see EventChannel.subscribe 普通地监听一个事件\n * @see syncFromEvent 挂起当前协程, 并尝试从事件中同步一个值\n *\n * @throws TimeoutCancellationException 在超时后抛出.\n * @since 2.2\n */\n@JvmSynthetic\n@Deprecated(\n    \"Please use `async` with `nextEvent` manually.\",\n    ReplaceWith(\n        \"\"\"async(coroutineContext) {\n        if (timeoutMillis == -1L) {\n            this.globalEventChannel(coroutineContext).nextEvent<E>(priority, filter)\n        } else {\n            withTimeout(timeoutMillis) {\n                GlobalEventChannel.nextEvent<E>(priority, filter)\n            }\n        }\n    }\"\"\",\n        \"kotlinx.coroutines.async\",\n        \"kotlinx.coroutines.withTimeout\",\n        \"net.mamoe.mirai.event.globalEventChannel\",\n        \"net.mamoe.mirai.event.GlobalEventChannel\",\n        \"net.mamoe.mirai.event.nextEvent\"\n    ),\n    level = DeprecationLevel.HIDDEN\n)\n@DeprecatedSinceMirai(warningSince = \"2.10\", errorSince = \"2.12\", hiddenSince = \"2.13\")\n@MiraiExperimentalApi\npublic inline fun <reified E : Event> CoroutineScope.nextEventAsync(\n    timeoutMillis: Long = -1,\n    priority: EventPriority = EventPriority.MONITOR,\n    coroutineContext: CoroutineContext = EmptyCoroutineContext,\n    crossinline filter: (E) -> Boolean = { true }\n): Deferred<E> =\n    async(coroutineContext) {\n        val block: suspend (E) -> Boolean = { filter(it) } // inline once.\n        if (timeoutMillis == -1L) {\n            this.globalEventChannel(coroutineContext).nextEvent(priority, block)\n        } else {\n            withTimeout(timeoutMillis) {\n                GlobalEventChannel.nextEvent(priority, block)\n            }\n        }\n    }\n\n/**\n * 返回一个 [Deferred], 其值为下一个广播并通过 [filter] 的事件 [E] 示例.\n *\n * @param timeoutMillis 超时. 单位为毫秒.\n * @param filter 过滤器. 返回 `true` 时表示得到了需要的实例. 返回 `false` 时表示继续监听\n * @param coroutineContext 添加给启动的协程的 [CoroutineContext]\n *\n * @see nextEvent 同步版本\n * @see EventChannel.subscribe 普通地监听一个事件\n * @see syncFromEvent 挂起当前协程, 并尝试从事件中同步一个值\n *\n * @return 事件实例, 在超时后返回 `null`\n * @since 2.2\n */\n@MiraiExperimentalApi\n@Deprecated(\n    \"Please use `async` with `nextEventOrNull` manually.\",\n    ReplaceWith(\n        \"\"\"async(coroutineContext) {\n        if (timeoutMillis == -1L) {\n            this.globalEventChannel(coroutineContext).nextEvent<E>(priority, filter)\n        } else {\n            withTimeoutOrNull(timeoutMillis) {\n                GlobalEventChannel.nextEvent<E>(priority, filter)\n            }\n        }\n    }\"\"\",\n        \"kotlinx.coroutines.async\",\n        \"kotlinx.coroutines.withTimeoutOrNull\",\n        \"net.mamoe.mirai.event.globalEventChannel\",\n        \"net.mamoe.mirai.event.GlobalEventChannel\",\n        \"net.mamoe.mirai.event.nextEvent\"\n    ),\n    level = DeprecationLevel.HIDDEN\n)\n@DeprecatedSinceMirai(warningSince = \"2.10\", errorSince = \"2.12\", hiddenSince = \"2.13\")\n@JvmSynthetic\npublic inline fun <reified E : Event> CoroutineScope.nextEventOrNullAsync(\n    timeoutMillis: Long,\n    priority: EventPriority = EventPriority.MONITOR,\n    coroutineContext: CoroutineContext = EmptyCoroutineContext,\n    crossinline filter: (E) -> Boolean = { true }\n): Deferred<E?> {\n    return async(coroutineContext) {\n        val block: suspend (E) -> Boolean = { filter(it) } // inline once.\n        if (timeoutMillis == -1L) {\n            this.globalEventChannel(coroutineContext).nextEvent(priority, block)\n        } else {\n            withTimeoutOrNull(timeoutMillis) {\n                GlobalEventChannel.nextEvent(priority, block)\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/deprecated.syncFromEvent.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n@file:JvmName(\"SyncFromEventKt\")\n\npackage net.mamoe.mirai.event\n\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\nimport kotlin.reflect.KClass\n\n/**\n * 挂起当前协程, 监听事件 [E], 并尝试从这个事件中**获取**一个值, 在超时时抛出 [TimeoutCancellationException]\n *\n * @param timeoutMillis 超时. 单位为毫秒.\n * @param mapper 过滤转换器. 返回非 null 则代表得到了需要的值. [syncFromEvent] 会返回这个值\n *\n * @see asyncFromEvent 本函数的异步版本\n * @see EventChannel.subscribe 普通地监听一个事件\n * @see nextEvent 挂起当前协程, 并获取下一个事件实例\n *\n * @see syncFromEventOrNull 本函数的在超时后返回 `null` 的版本\n *\n * @throws TimeoutCancellationException 在超时后抛出.\n * @throws Throwable 当 [mapper] 抛出任何异常时, 本函数会抛出该异常\n */\n@DeprecatedSinceMirai(warningSince = \"2.10\", errorSince = \"2.12\", hiddenSince = \"2.13\")\n@Deprecated(\n    \"Use GlobalEventChannel.syncFromEvent\",\n    ReplaceWith(\n        \"if (timeoutMillis == -1L) { GlobalEventChannel.syncFromEvent<E, R>(priority) { mapper.invoke(it, it) } } else { withTimeout(timeoutMillis) { GlobalEventChannel.syncFromEvent<E, R>(priority) { mapper.invoke(it, it) } } }\",\n        \"kotlinx.coroutines.withTimeout\",\n        \"net.mamoe.mirai.event.GlobalEventChannel\",\n        \"net.mamoe.mirai.event.syncFromEvent\"\n    ),\n    level = DeprecationLevel.HIDDEN\n)\n@JvmSynthetic\npublic suspend inline fun <reified E : Event, R : Any> syncFromEvent(\n    timeoutMillis: Long = -1,\n    priority: EventPriority = EventPriority.MONITOR,\n    crossinline mapper: suspend E.(E) -> R?\n): R {\n    require(timeoutMillis == -1L || timeoutMillis > 0) { \"timeoutMillis must be -1 or > 0\" }\n\n    @Suppress(\"DEPRECATION\")\n    return if (timeoutMillis == -1L) {\n        coroutineScope {\n            GlobalEventChannel.syncFromEventImpl(E::class, this, priority) { mapper.invoke(it, it) }\n        }\n    } else {\n        withTimeout(timeoutMillis) {\n            GlobalEventChannel.syncFromEventImpl(E::class, this, priority) { mapper.invoke(it, it) }\n        }\n    }\n}\n\n/**\n * 挂起当前协程, 监听这个事件, 并尝试从这个事件中获取一个值, 在超时时返回 `null`\n *\n * @param timeoutMillis 超时. 单位为毫秒. `-1` 为不限制\n * @param mapper 过滤转换器. 返回非 null 则代表得到了需要的值.\n *\n * @return 超时返回 `null`, 否则返回 [mapper] 返回的第一个非 `null` 值.\n *\n * @see asyncFromEvent 本函数的异步版本\n * @see EventChannel.subscribe 普通地监听一个事件\n * @see nextEvent 挂起当前协程, 并获取下一个事件实例\n *\n * @throws Throwable 当 [mapper] 抛出任何异常时, 本函数会抛出该异常\n */\n@JvmSynthetic\n@DeprecatedSinceMirai(warningSince = \"2.10\", errorSince = \"2.12\", hiddenSince = \"2.13\")\n@Deprecated(\n    \"Use GlobalEventChannel.syncFromEvent\",\n    ReplaceWith(\"withTimeoutOrNull(timeoutMillis) { GlobalEventChannel.syncFromEvent<E, R>(priority) { event -> with(event) { mapper(event) } }\"),\n    level = DeprecationLevel.HIDDEN\n)\npublic suspend inline fun <reified E : Event, R : Any> syncFromEventOrNull(\n    timeoutMillis: Long,\n    priority: EventPriority = EventPriority.MONITOR,\n    crossinline mapper: suspend E.(E) -> R?\n): R? {\n    require(timeoutMillis > 0) { \"timeoutMillis must be > 0\" }\n\n    return withTimeoutOrNull(timeoutMillis) {\n        @Suppress(\"DEPRECATION\")\n        GlobalEventChannel.syncFromEventImpl(E::class, this, priority) { mapper.invoke(it, it) }\n    }\n}\n\n/**\n * 异步监听这个事件, 并尝试从这个事件中获取一个值.\n *\n * 若 [mapper] 抛出的异常将会被传递给 [Deferred.await] 抛出.\n *\n * @param timeoutMillis 超时. 单位为毫秒. `-1` 为不限制\n * @param coroutineContext 额外的 [CoroutineContext]\n * @param mapper 过滤转换器. 返回非 `null` 则代表得到了需要的值. [syncFromEvent] 会返回这个值\n *\n * @see syncFromEvent\n * @see asyncFromEvent\n * @see EventChannel.subscribe 普通地监听一个事件\n * @see nextEvent 挂起当前协程, 并获取下一个事件实例\n */\n@Deprecated(\n    \"Please use `async` and `syncFromEvent` manually.\",\n    replaceWith = ReplaceWith(\n        \"\"\"async(coroutineContext) {\n        withTimeoutOrNull(timeoutMillis) {\n            GlobalEventChannel.syncFromEvent<E, R>(priority, filter)\n        }\n    }\"\"\",\n        \"kotlinx.coroutines.async\",\n        \"kotlinx.coroutines.withTimeoutOrNull\",\n        \"net.mamoe.mirai.event.globalEventChannel\",\n        \"net.mamoe.mirai.event.syncFromEvent\"\n    ),\n    level = DeprecationLevel.HIDDEN\n)\n@JvmSynthetic\n@DeprecatedSinceMirai(warningSince = \"2.10\", errorSince = \"2.12\", hiddenSince = \"2.13\")\n@Suppress(\"DeferredIsResult\")\npublic inline fun <reified E : Event, R : Any> CoroutineScope.asyncFromEventOrNull(\n    timeoutMillis: Long,\n    coroutineContext: CoroutineContext = EmptyCoroutineContext,\n    priority: EventPriority = EventPriority.MONITOR,\n    crossinline mapper: suspend E.(E) -> R?\n): Deferred<R?> {\n    require(timeoutMillis == -1L || timeoutMillis > 0) { \"timeoutMillis must be -1 or > 0\" }\n    return this.async(coroutineContext) {\n        withTimeoutOrNull(timeoutMillis) {\n            GlobalEventChannel.syncFromEvent<E, R>(priority) { event ->\n                mapper(event, event)\n            }\n        }\n    }\n}\n\n/**\n * 异步监听这个事件, 并尝试从这个事件中获取一个值.\n *\n * 若 [mapper] 抛出的异常将会被传递给 [Deferred.await] 抛出.\n *\n * @param timeoutMillis 超时. 单位为毫秒. `-1` 为不限制\n * @param coroutineContext 额外的 [CoroutineContext]\n * @param mapper 过滤转换器. 返回非 null 则代表得到了需要的值. [syncFromEvent] 会返回这个值\n *\n * @see syncFromEvent\n * @see asyncFromEventOrNull\n * @see EventChannel.subscribe 普通地监听一个事件\n * @see nextEvent 挂起当前协程, 并获取下一个事件实例\n */\n@Deprecated(\n    \"Please use `async` and `syncFromEvent` manually.\",\n    replaceWith = ReplaceWith(\n        \"\"\"async(coroutineContext) {\n        if (timeoutMillis == -1L) {\n            this.globalEventChannel(coroutineContext).syncFromEvent<E, R>(priority, filter)\n        } else {\n            withTimeout(timeoutMillis) {\n                GlobalEventChannel.syncFromEvent<E, R>(priority, filter)\n            }\n        }\n    }\"\"\",\n        \"kotlinx.coroutines.async\",\n        \"kotlinx.coroutines.withTimeout\",\n        \"net.mamoe.mirai.event.globalEventChannel\",\n        \"net.mamoe.mirai.event.syncFromEvent\"\n    ),\n    level = DeprecationLevel.HIDDEN\n)\n@DeprecatedSinceMirai(warningSince = \"2.10\", errorSince = \"2.12\", hiddenSince = \"2.13\")\n@JvmSynthetic\n@Suppress(\"DeferredIsResult\")\npublic inline fun <reified E : Event, R : Any> CoroutineScope.asyncFromEvent(\n    timeoutMillis: Long = -1,\n    coroutineContext: CoroutineContext = EmptyCoroutineContext,\n    priority: EventPriority = EventPriority.MONITOR,\n    crossinline mapper: suspend E.(E) -> R?\n): Deferred<R> {\n    require(timeoutMillis == -1L || timeoutMillis > 0) { \"timeoutMillis must be -1 or > 0\" }\n    return this.async(coroutineContext) {\n        if (timeoutMillis == -1L) {\n            GlobalEventChannel.syncFromEvent(priority) { it: E -> mapper.invoke(it, it) }\n        } else {\n            withTimeout(timeoutMillis) { GlobalEventChannel.syncFromEvent(priority) { it: E -> mapper.invoke(it, it) } }\n        }\n    }\n}\n\n\n//////////////\n//// internal\n//////////////\n\n@Deprecated(\"Deprecated since its usages are deprecated\", level = DeprecationLevel.HIDDEN)\n@DeprecatedSinceMirai(warningSince = \"2.10\", hiddenSince = \"2.14\")\n@JvmSynthetic\n@PublishedApi\ninternal suspend inline fun <E : Event, R> syncFromEventImpl(\n    eventClass: KClass<E>,\n    coroutineScope: CoroutineScope,\n    priority: EventPriority,\n    crossinline mapper: suspend E.(E) -> R?\n): R = suspendCancellableCoroutine { cont ->\n    coroutineScope.globalEventChannel().subscribe(eventClass, priority = priority) {\n        try {\n            cont.resumeWith(kotlin.runCatching {\n                mapper.invoke(this, it) ?: return@subscribe ListeningStatus.LISTENING\n            })\n        } catch (_: Exception) {\n        }\n        return@subscribe ListeningStatus.STOPPED\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/events/EventCancelledException.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.event.events\n\n@Suppress(\"unused\")\npublic class EventCancelledException : RuntimeException {\n    public constructor() : super()\n    public constructor(message: String?) : super(message)\n    public constructor(message: String?, cause: Throwable?) : super(message, cause)\n    public constructor(cause: Throwable?) : super(cause)\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/events/ImageUploadEvent.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"BotEventsKt\")\n\npackage net.mamoe.mirai.event.events\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.contact.Contact.Companion.uploadImage\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.event.CancellableEvent\nimport net.mamoe.mirai.event.events.ImageUploadEvent.Failed\nimport net.mamoe.mirai.event.events.ImageUploadEvent.Succeed\nimport net.mamoe.mirai.internal.event.VerboseEvent\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\n\n/**\n * 图片上传前. 可以阻止上传.\n *\n * 此事件总是在 [ImageUploadEvent] 之前广播.\n * 若此事件被取消, [ImageUploadEvent] 不会广播.\n *\n * @see Contact.uploadImage 上传图片. 为广播这个事件的唯一途径\n */\n@OptIn(MiraiInternalApi::class)\npublic data class BeforeImageUploadEvent @MiraiInternalApi constructor(\n    public val target: Contact,\n    public val source: ExternalResource\n) : BotEvent, BotActiveEvent, AbstractEvent(), CancellableEvent, VerboseEvent {\n    public override val bot: Bot\n        get() = target.bot\n}\n\n/**\n * 图片上传完成.\n *\n * 此事件总是在 [BeforeImageUploadEvent] 之后广播.\n * 若 [BeforeImageUploadEvent] 被取消, 此事件不会广播.\n *\n * @see Contact.uploadImage 上传图片. 为广播这个事件的唯一途径\n *\n * @see Succeed\n * @see Failed\n */\n@OptIn(MiraiInternalApi::class)\npublic sealed class ImageUploadEvent : BotEvent, BotActiveEvent, AbstractEvent(), VerboseEvent {\n    public abstract val target: Contact\n    public abstract val source: ExternalResource\n    public override val bot: Bot\n        get() = target.bot\n\n    public data class Succeed @MiraiInternalApi constructor(\n        override val target: Contact,\n        override val source: ExternalResource,\n        val image: Image\n    ) : ImageUploadEvent() {\n        override fun toString(): String {\n            return \"ImageUploadEvent.Succeed(target=$target, source=$source, image=$image)\"\n        }\n    }\n\n    public data class Failed @MiraiInternalApi constructor(\n        override val target: Contact,\n        override val source: ExternalResource,\n        val errno: Int,\n        val message: String\n    ) : ImageUploadEvent() {\n        override fun toString(): String {\n            return \"ImageUploadEvent.Failed(target=$target, source=$source, errno=$errno, message='$message')\"\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/events/MessageEvent.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"BotEventsKt\")\n\npackage net.mamoe.mirai.event.events\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.event.GlobalEventChannel\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.MessageSource\nimport net.mamoe.mirai.message.data.OnlineMessageSource\nimport net.mamoe.mirai.message.data.source\nimport net.mamoe.mirai.message.isContextIdenticalWith\nimport net.mamoe.mirai.message.nextMessage\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\n/**\n * 一个消息事件.\n *\n * ## 实用扩展\n *\n * 在处理事件时, 以下可能有用 (Kotlin).\n *\n * ### 挂起协程直到监听下一条事件\n *\n * 通过 [MessageEvent.nextMessage] 可在[全局事件通道][GlobalEventChannel]中监听并获取下一条符合条件的消息事件.\n * 这可能帮助实现向用户请求一条更详细的输入等功能.\n *\n * ### 判断语境相同\n *\n * 使用 [MessageEvent.isContextIdenticalWith] 可判断两个 [MessageEvent] 的语境是否相同. 有关\"语境\"的定义可查看 [MessageEvent.isContextIdenticalWith].\n */\n@OptIn(MiraiInternalApi::class)\npublic sealed interface MessageEvent : Event, Packet, BotPassiveEvent {\n    /**\n     * 与这个消息事件相关的 [Bot]\n     */\n    public override val bot: Bot\n\n    /**\n     * 消息事件主体.\n     *\n     * - 对于私聊会话, 这个属性与 [sender] 相同;\n     * - 对于群消息, 这个属性为 [Group] 的实例, 与 [GroupMessageEvent.group] 相同.\n     *\n     * 如果在 [GroupMessageEvent] 对 [sender] 发送消息, 将会通过私聊发送给群员, 而不会发送在群内.\n     * 使用 [subject] 作为消息目标则可以确保消息发送到用户所在的场景.\n     *\n     * 在回复消息时, 可通过 [subject] 作为回复对象.\n     */\n    public val subject: Contact\n\n    /**\n     * 发送人.\n     *\n     * 在私聊消息时为相关 [User] 的实例, 在群消息时为 [Member] 的实例, 在其他客户端消息时为 [Bot.asFriend]\n     */\n    public val sender: User\n\n    /**\n     * 发送人名称. 由群员发送时为群员名片, 由好友发送时为好友昵称. 使用 [User.nameCardOrNick] 也能得到相同的结果.\n     */\n    public val senderName: String\n\n    /**\n     * 消息内容.\n     *\n     * 返回的消息链中一定包含 [MessageSource], 存储此消息的发送人, 发送时间, 收信人, 消息 ids 等数据. 随后的元素为拥有顺序的真实消息内容.\n     *\n     * 详细查看 [MessageChain]\n     */\n    public val message: MessageChain\n\n    /** 消息发送时间戳, 单位为秒. 由服务器提供, 可能与本地有时差. */\n    public val time: Int\n\n    /**\n     * 消息源. 来自 [message]. 相当于对 [message] 以 [MessageSource] 参数调用 [MessageChain.get].\n     */\n    public val source: OnlineMessageSource.Incoming get() = message.source as OnlineMessageSource.Incoming\n}\n\n/**\n * 来自 [User] 的消息\n *\n * @see FriendMessageEvent\n * @see GroupTempMessageEvent\n */\npublic sealed interface UserMessageEvent : MessageEvent {\n    public override val subject: User\n}\n\n/**\n * 机器人收到的好友消息的事件\n *\n * @see MessageEvent\n */\n@OptIn(MiraiInternalApi::class)\npublic class FriendMessageEvent(\n    public override val sender: Friend,\n    public override val message: MessageChain,\n    public override val time: Int\n) : AbstractMessageEvent(), UserMessageEvent, FriendEvent {\n    init {\n        val source =\n            message[MessageSource] ?: throw IllegalArgumentException(\"Cannot find MessageSource from message\")\n        check(source is OnlineMessageSource.Incoming.FromFriend) { \"source provided to a FriendMessageEvent must be an instance of OnlineMessageSource.Incoming.FromFriend\" }\n    }\n\n    public override val friend: Friend get() = sender\n    public override val bot: Bot get() = super.bot\n    public override val subject: Friend get() = sender\n    public override val senderName: String get() = sender.nick\n    public override val source: OnlineMessageSource.Incoming.FromFriend get() = message.source as OnlineMessageSource.Incoming.FromFriend\n\n    public override fun toString(): String = \"FriendMessageEvent(sender=${sender.id}, message=$message)\"\n}\n\n/**\n * 机器人收到的其他客户端消息的事件\n *\n * @see MessageEvent\n */\n@OptIn(MiraiInternalApi::class)\npublic class OtherClientMessageEvent(\n    public override val client: OtherClient,\n    public override val message: MessageChain,\n    public override val time: Int\n) : AbstractMessageEvent(), MessageEvent, OtherClientEvent {\n    init {\n        val source =\n            message[MessageSource] ?: throw IllegalArgumentException(\"Cannot find MessageSource from message\")\n        check(source is OnlineMessageSource.Incoming.FromFriend) { \"source provided to a OtherClientMessageEvent must be an instance of OnlineMessageSource.Incoming.FromFriend\" }\n    }\n\n    public override val sender: User get() = client.bot.asFriend\n    public override val bot: Bot get() = super.bot\n    public override val subject: OtherClient get() = client\n    public override val senderName: String get() = sender.nick\n\n    /**\n     * 为简化处理, 其他客户端消息的 [MessageSource] 被作为 [OnlineMessageSource.Incoming.FromFriend].\n     */\n    public override val source: OnlineMessageSource.Incoming.FromFriend get() = message.source as OnlineMessageSource.Incoming.FromFriend\n\n    public override fun toString(): String = \"OtherClientMessageEvent(client=${client.platform}, message=$message)\"\n}\n\n/**\n * 来自一个可以知道其 [Group] 的用户消息\n *\n * @see FriendMessageEvent\n * @see GroupTempMessageEvent\n */\npublic sealed interface GroupAwareMessageEvent : MessageEvent {\n    public val group: Group\n}\n\n/**\n * 机器人收到的群消息的事件\n *\n * @see MessageEvent\n */\n@OptIn(MiraiInternalApi::class)\npublic class GroupMessageEvent(\n    public override val senderName: String,\n    /**\n     * 发送方权限.\n     */\n    public val permission: MemberPermission,\n    /**\n     * 发送人. 可能是 [NormalMember] 或 [AnonymousMember]\n     */\n    public override val sender: Member,\n    public override val message: MessageChain,\n    public override val time: Int\n) : AbstractMessageEvent(), GroupAwareMessageEvent, MessageEvent, GroupEvent {\n    init {\n        val source = message[MessageSource] ?: error(\"Cannot find MessageSource from message\")\n        check(source is OnlineMessageSource.Incoming.FromGroup) { \"source provided to a GroupMessageEvent must be an instance of OnlineMessageSource.Incoming.FromGroup\" }\n    }\n\n    public override val group: Group get() = sender.group\n    public override val bot: Bot get() = sender.bot\n    public override val subject: Group get() = group\n    public override val source: OnlineMessageSource.Incoming.FromGroup get() = message.source as OnlineMessageSource.Incoming.FromGroup\n\n    public override fun toString(): String =\n        \"GroupMessageEvent(group=${group.id}, senderName=$senderName, sender=${sender.id}, permission=${permission.name}, message=$message)\"\n}\n\n/**\n * 机器人收到的群临时会话消息的事件\n *\n * @see MessageEvent\n */\n@OptIn(MiraiInternalApi::class)\n@Deprecated(\n    \"mirai 正计划支持其他渠道发起的临时会话, 届时此事件会变动. 原 TempMessageEvent 已更改为 GroupTempMessageEvent\",\n    replaceWith = ReplaceWith(\"GroupTempMessageEvent\", \"net.mamoe.mirai.event.events.GroupTempMessageEvent\"),\n    DeprecationLevel.HIDDEN\n)\n@DeprecatedSinceMirai(hiddenSince = \"2.0\") // maybe 2.0\npublic sealed class TempMessageEvent(\n    public override val sender: NormalMember,\n    public override val message: MessageChain,\n    public override val time: Int\n) : AbstractMessageEvent(), GroupAwareMessageEvent, UserMessageEvent\n\n// support by mirai 2.1\n//\n//public class UserTempMessageEvent(\n//    sender: TempUser,\n//    message: MessageChain,\n//    time: Int\n//) : @Suppress(\"DEPRECATION_ERROR\") TempMessageEvent(sender, message, time), GroupAwareMessageEvent, UserMessageEvent {\n//}\n\n/**\n * 群临时会话消息\n */\npublic class GroupTempMessageEvent(\n    public override val sender: NormalMember,\n    public override val message: MessageChain,\n    public override val time: Int\n) : @Suppress(\"DEPRECATION_ERROR\") TempMessageEvent(sender, message, time), GroupAwareMessageEvent, UserMessageEvent {\n    init {\n        val source = message[MessageSource] ?: error(\"Cannot find MessageSource from message\")\n        check(source is OnlineMessageSource.Incoming.FromTemp) { \"source provided to a GroupTempMessageEvent must be an instance of OnlineMessageSource.Incoming.FromTemp\" }\n    }\n\n    public override val bot: Bot get() = sender.bot\n    public override val subject: NormalMember get() = sender\n    public override val group: Group get() = sender.group\n    public override val senderName: String get() = sender.nameCardOrNick\n    public override val source: OnlineMessageSource.Incoming.FromTemp get() = message.source as OnlineMessageSource.Incoming.FromTemp\n\n    public override fun toString(): String =\n        \"GroupTempMessageEvent(sender=${sender.id} from group(${sender.group.id}), message=$message)\"\n}\n\n/**\n * 机器人收到的陌生人消息的事件\n *\n * @see MessageEvent\n */\n@OptIn(MiraiInternalApi::class)\npublic class StrangerMessageEvent(\n    public override val sender: Stranger,\n    public override val message: MessageChain,\n    public override val time: Int\n) : AbstractMessageEvent(), UserMessageEvent, StrangerEvent {\n    init {\n        val source =\n            message[MessageSource] ?: throw IllegalArgumentException(\"Cannot find MessageSource from message\")\n        check(source is OnlineMessageSource.Incoming.FromStranger) { \"source provided to a StrangerMessageEvent must be an instance of OnlineMessageSource.Incoming.FromStranger\" }\n    }\n\n    public override val stranger: Stranger get() = sender\n    public override val bot: Bot get() = super.bot\n    public override val subject: Stranger get() = sender\n    public override val senderName: String get() = sender.nick\n    public override val source: OnlineMessageSource.Incoming.FromStranger get() = message.source as OnlineMessageSource.Incoming.FromStranger\n\n    public override fun toString(): String = \"StrangerMessageEvent(sender=${sender.id}, message=$message)\"\n}\n\n/**\n * 消息事件的公共抽象父类, 保留将来使用. 这是内部 API, 请不要使用.\n */\n@MiraiInternalApi\npublic abstract class AbstractMessageEvent : MessageEvent, AbstractEvent()\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/events/MessagePostSendEvent.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"BotEventsKt\")\n\npackage net.mamoe.mirai.event.events\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.event.CancellableEvent\nimport net.mamoe.mirai.internal.event.VerboseEvent\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.MessageSource\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmSynthetic\n\n\n/**\n * 在发送消息后广播的事件, 总是在 [MessagePreSendEvent] 之后广播.\n *\n * 只要 [MessagePreSendEvent] 未被 [取消][CancellableEvent.cancel], [MessagePostSendEvent] 就一定会被广播, 并携带 [发送时产生的异常][MessagePostSendEvent.exception] (如果有).\n *\n * 在此事件广播前, 消息一定已经发送成功, 或产生一个异常.\n *\n * @see Contact.sendMessage 发送消息. 为广播这个事件的唯一途径\n * @see MessagePreSendEvent\n */\n@OptIn(MiraiInternalApi::class)\npublic sealed class MessagePostSendEvent<C : Contact> : BotEvent, BotActiveEvent, AbstractEvent(), VerboseEvent {\n    /** 发信目标. */\n    public abstract val target: C\n    public final override val bot: Bot get() = target.bot\n\n    /** 待发送的消息. 此为 [MessagePreSendEvent.message] 的最终值. */\n    public abstract val message: MessageChain\n\n    /**\n     * 发送消息时抛出的异常. `null` 表示消息成功发送.\n     * @see result\n     */\n    public abstract val exception: Throwable?\n\n    /**\n     * 发送消息成功时的回执. `null` 表示消息发送失败.\n     * @see result\n     */\n    public abstract val receipt: MessageReceipt<C>?\n}\n\n/**\n * 获取指代这条已经发送的消息的 [MessageSource]. 若消息发送失败, 返回 `null`\n * @see MessagePostSendEvent.sourceResult\n */\n@get:JvmSynthetic\npublic inline val MessagePostSendEvent<*>.source: MessageSource?\n    get() = receipt?.source\n\n/**\n * 获取指代这条已经发送的消息的 [MessageSource], 并包装为 [kotlin.Result]\n * @see MessagePostSendEvent.result\n */\n@get:JvmSynthetic\n@Suppress(\"RESULT_CLASS_IN_RETURN_TYPE\")\npublic inline val MessagePostSendEvent<*>.sourceResult: Result<MessageSource>\n    get() = result.map { it.source }\n\n/**\n * 在此消息发送成功时返回 `true`.\n * @see MessagePostSendEvent.exception\n * @see MessagePostSendEvent.result\n */\n@get:JvmSynthetic\npublic inline val MessagePostSendEvent<*>.isSuccess: Boolean\n    get() = exception == null\n\n/**\n * 在此消息发送失败时返回 `true`.\n * @see MessagePostSendEvent.exception\n * @see MessagePostSendEvent.result\n */\n@get:JvmSynthetic\npublic inline val MessagePostSendEvent<*>.isFailure: Boolean\n    get() = exception != null\n\n/**\n * 将 [MessagePostSendEvent.exception] 与 [MessagePostSendEvent.receipt] 表示为 [Result]\n */\n@Suppress(\"RESULT_CLASS_IN_RETURN_TYPE\")\npublic inline val <C : Contact> MessagePostSendEvent<C>.result: Result<MessageReceipt<C>>\n    get() = exception.let { exception -> if (exception != null) Result.failure(exception) else Result.success(receipt!!) }\n\n/**\n * 在群消息发送后广播的事件.\n * @see MessagePostSendEvent\n */\npublic data class GroupMessagePostSendEvent @MiraiInternalApi constructor(\n    /** 发信目标. */\n    public override val target: Group,\n    /** 待发送的消息. 此为 [MessagePreSendEvent.message] 的最终值. */\n    public override val message: MessageChain,\n    /**\n     * 发送消息时抛出的异常. `null` 表示消息成功发送.\n     * @see result\n     */\n    public override val exception: Throwable?,\n    /**\n     * 发送消息成功时的回执. `null` 表示消息发送失败.\n     * @see result\n     */\n    public override val receipt: MessageReceipt<Group>?\n) : MessagePostSendEvent<Group>()\n\n/**\n * 在好友或群临时会话消息发送后广播的事件.\n * @see MessagePostSendEvent\n */\npublic sealed class UserMessagePostSendEvent<C : User> : MessagePostSendEvent<C>()\n\n/**\n * 在好友消息发送后广播的事件.\n * @see MessagePostSendEvent\n */\npublic data class FriendMessagePostSendEvent @MiraiInternalApi constructor(\n    /** 发信目标. */\n    public override val target: Friend,\n    /** 待发送的消息. 此为 [MessagePreSendEvent.message] 的最终值. */\n    public override val message: MessageChain,\n    /**\n     * 发送消息时抛出的异常. `null` 表示消息成功发送.\n     * @see result\n     */\n    public override val exception: Throwable?,\n    /**\n     * 发送消息成功时的回执. `null` 表示消息发送失败.\n     * @see result\n     */\n    public override val receipt: MessageReceipt<Friend>?\n) : UserMessagePostSendEvent<Friend>()\n\n/**\n * 在群临时会话消息发送后广播的事件.\n * @see MessagePostSendEvent\n */\n@Deprecated(\n    \"mirai 正计划支持其他渠道发起的临时会话, 届时此事件会变动. 原 TempMessagePostSendEvent 已更改为 GroupTempMessagePostSendEvent\",\n    replaceWith = ReplaceWith(\n        \"GroupTempMessagePostSendEvent\",\n        \"net.mamoe.mirai.event.events.GroupTempMessagePostSendEvent\"\n    ),\n    DeprecationLevel.HIDDEN\n)\n@DeprecatedSinceMirai(hiddenSince = \"2.0\") // maybe 2.0\npublic sealed class TempMessagePostSendEvent @MiraiInternalApi constructor(\n    /** 发信目标. */\n    public override val target: Member,\n    /** 待发送的消息. 此为 [MessagePreSendEvent.message] 的最终值. */\n    public override val message: MessageChain,\n    /**\n     * 发送消息时抛出的异常. `null` 表示消息成功发送.\n     * @see result\n     */\n    public override val exception: Throwable?,\n    /**\n     * 发送消息成功时的回执. `null` 表示消息发送失败.\n     * @see result\n     */\n    public override val receipt: MessageReceipt<Member>?\n) : UserMessagePostSendEvent<Member>() {\n    public open val group: Group get() = target.group\n}\n\n/**\n * 在群临时会话消息发送后广播的事件.\n * @see MessagePostSendEvent\n */\n@OptIn(MiraiInternalApi::class)\npublic data class GroupTempMessagePostSendEvent @MiraiInternalApi constructor(\n    /** 发信目标. */\n    public override val target: NormalMember,\n    /** 待发送的消息. 此为 [MessagePreSendEvent.message] 的最终值. */\n    public override val message: MessageChain,\n    /**\n     * 发送消息时抛出的异常. `null` 表示消息成功发送.\n     * @see result\n     */\n    public override val exception: Throwable?,\n    /**\n     * 发送消息成功时的回执. `null` 表示消息发送失败.\n     * @see result\n     */\n    public override val receipt: MessageReceipt<NormalMember>?\n) : @kotlin.Suppress(\"DEPRECATION_ERROR\") TempMessagePostSendEvent(target, message, exception, receipt) {\n    public override val group: Group get() = target.group\n}\n\n/**\n * 在陌生人消息发送后广播的事件.\n * @see MessagePostSendEvent\n */\npublic data class StrangerMessagePostSendEvent @MiraiInternalApi constructor(\n    /** 发信目标. */\n    public override val target: Stranger,\n    /** 待发送的消息. 此为 [MessagePreSendEvent.message] 的最终值. */\n    public override val message: MessageChain,\n    /**\n     * 发送消息时抛出的异常. `null` 表示消息成功发送.\n     * @see result\n     */\n    public override val exception: Throwable?,\n    /**\n     * 发送消息成功时的回执. `null` 表示消息发送失败.\n     * @see result\n     */\n    public override val receipt: MessageReceipt<Stranger>?\n) : UserMessagePostSendEvent<Stranger>()\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/events/MessagePreSendEvent.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"BotEventsKt\")\n\npackage net.mamoe.mirai.event.events\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.event.CancellableEvent\nimport net.mamoe.mirai.internal.event.VerboseEvent\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\n\n/**\n * 在发送消息前广播的事件. 可被 [取消][CancellableEvent.cancel].\n *\n * 此事件总是在 [MessagePostSendEvent] 之前广播.\n *\n * 当 [MessagePreSendEvent] 被 [取消][CancellableEvent.cancel] 后:\n * - [MessagePostSendEvent] 不会广播\n * - 消息不会发送.\n * - [Contact.sendMessage] 会抛出异常 [EventCancelledException]\n *\n * @see Contact.sendMessage 发送消息. 为广播这个事件的唯一途径\n */\n@OptIn(MiraiInternalApi::class)\npublic sealed class MessagePreSendEvent : BotEvent, BotActiveEvent, AbstractEvent(), CancellableEvent, VerboseEvent {\n    /** 发信目标. */\n    public abstract val target: Contact\n    public final override val bot: Bot get() = target.bot\n\n    /** 待发送的消息. 修改后将会同时应用于发送. */\n    public abstract var message: Message\n}\n\n/**\n * 在发送群消息前广播的事件.\n * @see MessagePreSendEvent\n */\npublic data class GroupMessagePreSendEvent @MiraiInternalApi constructor(\n    /** 发信目标. */\n    public override val target: Group,\n    /** 待发送的消息. 修改后将会同时应用于发送. */\n    public override var message: Message\n) : MessagePreSendEvent()\n\n/**\n * 在发送好友或群临时会话消息前广播的事件.\n * @see MessagePreSendEvent\n */\npublic sealed class UserMessagePreSendEvent : MessagePreSendEvent() {\n    /** 发信目标. */\n    public abstract override val target: User\n}\n\n/**\n * 在发送好友消息前广播的事件.\n * @see MessagePreSendEvent\n */\npublic data class FriendMessagePreSendEvent @MiraiInternalApi constructor(\n    /** 发信目标. */\n    public override val target: Friend,\n    /** 待发送的消息. 修改后将会同时应用于发送. */\n    public override var message: Message\n) : UserMessagePreSendEvent()\n\n/**\n * 在发送临时会话消息前广播的事件.\n * @see MessagePreSendEvent\n */\n@Deprecated(\n    \"mirai 正计划支持其他渠道发起的临时会话, 届时此事件会变动. 原 TempMessagePreSendEvent 已更改为 GroupTempMessagePreSendEvent\",\n    replaceWith = ReplaceWith(\n        \"GroupTempMessagePreSendEvent\",\n        \"net.mamoe.mirai.event.events.GroupTempMessagePreSendEvent\"\n    ),\n    DeprecationLevel.HIDDEN\n)\n@DeprecatedSinceMirai(hiddenSince = \"2.0\") // maybe 2.0\npublic sealed class TempMessagePreSendEvent @MiraiInternalApi constructor(\n    /** 发信目标. */\n    public override val target: Member,\n    /** 待发送的消息. 修改后将会同时应用于发送. */\n    public override var message: Message\n) : UserMessagePreSendEvent() {\n    public open val group: Group get() = target.group\n}\n\n/**\n * 在发送群临时会话消息前广播的事件.\n * @see MessagePreSendEvent\n */\n@OptIn(MiraiInternalApi::class)\npublic data class GroupTempMessagePreSendEvent @MiraiInternalApi constructor(\n    /** 发信目标. */\n    public override val target: NormalMember,\n    /** 待发送的消息. 修改后将会同时应用于发送. */\n    public override var message: Message\n) : @Suppress(\"DEPRECATION_ERROR\") TempMessagePreSendEvent(target, message) {\n    public override val group: Group get() = target.group\n}\n\n/**\n * 在发送陌生人消息前广播的事件.\n * @see MessagePreSendEvent\n */\npublic data class StrangerMessagePreSendEvent @MiraiInternalApi constructor(\n    /** 发信目标. */\n    public override val target: Stranger,\n    /** 待发送的消息. 修改后将会同时应用于发送. */\n    public override var message: Message\n) : UserMessagePreSendEvent()\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/events/MessageRecallEvent.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"BotEventsKt\")\n\npackage net.mamoe.mirai.event.events\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.message.data.MessageSource\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.isSameClass\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\n\n/**\n * 消息撤回事件. 可是任意消息被任意人撤回.\n *\n * @see Contact.recallMessage 撤回消息. 为广播这个事件的唯一途径\n */\npublic sealed class MessageRecallEvent : BotEvent, AbstractEvent() {\n    /**\n     * 消息原发送人\n     */\n    public abstract val authorId: Long\n\n    /**\n     * 消息原发送人.\n     */\n    public abstract val author: UserOrBot\n\n    /**\n     * 消息 ids.\n     * @see MessageSource.ids\n     */\n    public abstract val messageIds: IntArray\n\n    /**\n     * 消息内部 ids.\n     * @see MessageSource.ids\n     */\n    public abstract val messageInternalIds: IntArray\n\n    /**\n     * 原发送时间戳, 单位为秒.\n     */\n    public abstract val messageTime: Int // seconds\n\n    /**\n     * 好友消息撤回事件\n     */\n    @OptIn(MiraiInternalApi::class)\n    public data class FriendRecall @MiraiInternalApi public constructor(\n        public override val bot: Bot,\n        public override val messageIds: IntArray,\n        public override val messageInternalIds: IntArray,\n        public override val messageTime: Int,\n        /**\n         * 撤回操作人, 好友的 [User.id]\n         */\n        public val operatorId: Long,\n        public val operator: Friend,\n    ) : MessageRecallEvent(), Packet {\n        /**\n         * 消息原发送人, 等于 [operator]\n         */\n        override val author: Friend get() = operator\n\n        public override val authorId: Long\n            get() = operatorId\n\n        @Suppress(\"DuplicatedCode\")\n        override fun equals(other: Any?): Boolean {\n            if (this === other) return true\n            if (other !is FriendRecall || !isSameClass(this, other)) return false\n\n            if (bot != other.bot) return false\n            if (!messageIds.contentEquals(other.messageIds)) return false\n            if (!messageInternalIds.contentEquals(other.messageInternalIds)) return false\n            if (messageTime != other.messageTime) return false\n            if (operatorId != other.operatorId) return false\n            return operator == other.operator\n        }\n\n        override fun hashCode(): Int {\n            var result = bot.hashCode()\n            result = 31 * result + messageIds.contentHashCode()\n            result = 31 * result + messageInternalIds.contentHashCode()\n            result = 31 * result + messageTime\n            result = 31 * result + operatorId.hashCode()\n            result = 31 * result + operator.hashCode()\n            return result\n        }\n    }\n\n    /**\n     * 群消息撤回事件.\n     */\n    @OptIn(MiraiInternalApi::class)\n    public data class GroupRecall @MiraiInternalApi constructor(\n        public override val bot: Bot,\n        public override val authorId: Long,\n        public override val messageIds: IntArray,\n        public override val messageInternalIds: IntArray,\n        public override val messageTime: Int,\n        /**\n         * 操作人. 为 null 时则为 [Bot] 操作.\n         */\n        public override val operator: Member?,\n        public override val group: Group,\n        public override val author: NormalMember,\n    ) : MessageRecallEvent(), GroupOperableEvent, Packet {\n\n        @Suppress(\"DuplicatedCode\")\n        override fun equals(other: Any?): Boolean {\n            if (this === other) return true\n            if (other !is GroupRecall || !isSameClass(this, other)) return false\n\n            if (bot != other.bot) return false\n            if (authorId != other.authorId) return false\n            if (!messageIds.contentEquals(other.messageIds)) return false\n            if (!messageInternalIds.contentEquals(other.messageInternalIds)) return false\n            if (messageTime != other.messageTime) return false\n            if (operator != other.operator) return false\n            if (group != other.group) return false\n            return author == other.author\n        }\n\n        override fun hashCode(): Int {\n            var result = bot.hashCode()\n            result = 31 * result + authorId.hashCode()\n            result = 31 * result + messageIds.contentHashCode()\n            result = 31 * result + messageInternalIds.contentHashCode()\n            result = 31 * result + messageTime\n            result = 31 * result + (operator?.hashCode() ?: 0)\n            result = 31 * result + group.hashCode()\n            result = 31 * result + author.hashCode()\n            return result\n        }\n    }\n}\n\npublic val MessageRecallEvent.FriendRecall.isByBot: Boolean get() = this.operatorId == bot.id\n// val MessageRecallEvent.GroupRecall.isByBot: Boolean get() = (this as GroupOperableEvent).isByBot\n// no need\n\npublic val MessageRecallEvent.isByBot: Boolean\n    get() = when (this) {\n        is MessageRecallEvent.FriendRecall -> this.isByBot\n        is MessageRecallEvent.GroupRecall -> (this as GroupOperableEvent).isByBot\n    }\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/events/MessageSyncEvent.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"BotEventsKt\")\n\npackage net.mamoe.mirai.event.events\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.MessageSource\nimport net.mamoe.mirai.message.data.OnlineMessageSource\nimport net.mamoe.mirai.message.data.source\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\n\n/**\n * 机器人在其他客户端发送消息同步到这个客户端的事件.\n *\n * 本事件发生于**机器人账号**在另一个客户端向一个群或一个好友主动发送消息, 这条消息同步到机器人这个客户端上.\n *\n * @see MessageEvent\n */\npublic interface MessageSyncEvent : MessageEvent, OtherClientEvent {\n    public override val client: OtherClient\n    override val bot: Bot get() = sender.bot // don't rely on `client`, old version does not have client.\n}\n\n/**\n * 机器人在其他客户端发送群临时会话消息同步到这个客户端的事件\n *\n * @see MessageSyncEvent\n */\n@OptIn(MiraiInternalApi::class)\npublic class GroupTempMessageSyncEvent private constructor(\n    private val _client: OtherClient?,\n    public override val sender: NormalMember,\n    public override val message: MessageChain,\n    public override val time: Int,\n    @Suppress(\"UNUSED_PARAMETER\", \"LocalVariableName\") _primaryConstructorMark: Any?\n) : AbstractMessageEvent(), GroupAwareMessageEvent, MessageSyncEvent {\n    /**\n     * @since 2.13\n     */\n    public override val client: OtherClient\n        get() = _client ?: error(\"client is not set. Please use the new constructor.\")\n\n    /**\n     * @since 2.13\n     */\n    public constructor(\n        client: OtherClient,\n        sender: NormalMember,\n        message: MessageChain,\n        time: Int\n    ) : this(client, sender, message, time, null)\n\n    @Deprecated(\n        \"Please use the new constructor.\",\n        replaceWith = ReplaceWith(\"GroupTempMessageSyncEvent(client, sender, message, time)\"),\n        level = DeprecationLevel.WARNING\n    )\n    @DeprecatedSinceMirai(warningSince = \"2.13\")\n    public constructor(\n        sender: NormalMember,\n        message: MessageChain,\n        time: Int\n    ) : this(null, sender, message, time, null)\n\n\n    init {\n        val source = message[MessageSource] ?: error(\"Cannot find MessageSource from message\")\n        check(source is OnlineMessageSource.Incoming.FromTemp) { \"source provided to a GroupTempMessageSyncEvent must be an instance of OnlineMessageSource.Incoming.FromTemp\" }\n    }\n\n    public override val bot: Bot get() = sender.bot\n    public override val subject: NormalMember get() = sender\n    public override val group: Group get() = sender.group\n    public override val senderName: String get() = sender.nameCardOrNick\n    public override val source: OnlineMessageSource.Incoming.FromTemp get() = message.source as OnlineMessageSource.Incoming.FromTemp\n}\n\n/**\n * 机器人在其他客户端发送好友消息同步到这个客户端的事件\n *\n * @see MessageSyncEvent\n */\n@OptIn(MiraiInternalApi::class)\npublic class FriendMessageSyncEvent private constructor(\n    private val _client: OtherClient?,\n    public override val sender: Friend,\n    public override val message: MessageChain,\n    public override val time: Int,\n    @Suppress(\"UNUSED_PARAMETER\", \"LocalVariableName\") _primaryConstructorMark: Any?\n) : AbstractMessageEvent(), FriendEvent, MessageSyncEvent {\n    /**\n     * @since 2.13\n     */\n    public override val client: OtherClient\n        get() = _client ?: error(\"client is not set. Please use the new constructor.\")\n\n    /**\n     * @since 2.13\n     */\n    public constructor(\n        client: OtherClient,\n        sender: Friend,\n        message: MessageChain,\n        time: Int\n    ) : this(client, sender, message, time, null)\n\n    @Deprecated(\n        \"Please use the new constructor.\",\n        replaceWith = ReplaceWith(\"FriendMessageSyncEvent(client, sender, message, time)\"),\n        level = DeprecationLevel.WARNING\n    )\n    @DeprecatedSinceMirai(warningSince = \"2.13\")\n    public constructor(\n        sender: Friend,\n        message: MessageChain,\n        time: Int\n    ) : this(null, sender, message, time, null)\n\n\n    init {\n        val source =\n            message[MessageSource] ?: throw IllegalArgumentException(\"Cannot find MessageSource from message\")\n        check(source is OnlineMessageSource.Incoming.FromFriend) { \"source provided to a FriendMessageSyncEvent must be an instance of OnlineMessageSource.Incoming.FromFriend\" }\n    }\n\n    public override val friend: Friend get() = sender\n    public override val bot: Bot get() = sender.bot\n    public override val subject: Friend get() = sender\n    public override val senderName: String get() = sender.nick\n    public override val source: OnlineMessageSource.Incoming.FromFriend get() = message.source as OnlineMessageSource.Incoming.FromFriend\n}\n\n/**\n * 机器人在其他客户端发送陌生人消息同步到这个客户端的事件\n *\n * @see MessageSyncEvent\n */\n@OptIn(MiraiInternalApi::class)\npublic class StrangerMessageSyncEvent private constructor(\n    private val _client: OtherClient?,\n    public override val sender: Stranger,\n    public override val message: MessageChain,\n    public override val time: Int,\n    @Suppress(\"UNUSED_PARAMETER\", \"LocalVariableName\") _primaryConstructorMark: Any?,\n) : AbstractMessageEvent(), StrangerEvent, MessageSyncEvent {\n    /**\n     * @since 2.13\n     */\n    public override val client: OtherClient\n        get() = _client ?: error(\"client is not set. Please use the new constructor.\")\n\n    /**\n     * @since 2.13\n     */\n    public constructor(\n        client: OtherClient,\n        sender: Stranger,\n        message: MessageChain,\n        time: Int\n    ) : this(client, sender, message, time, null)\n\n    @Deprecated(\n        \"Please use the new constructor.\",\n        replaceWith = ReplaceWith(\"StrangerMessageSyncEvent(client, sender, message, time)\"),\n        level = DeprecationLevel.WARNING\n    )\n    @DeprecatedSinceMirai(warningSince = \"2.13\")\n    public constructor(\n        sender: Stranger,\n        message: MessageChain,\n        time: Int\n    ) : this(null, sender, message, time, null)\n\n\n    init {\n        val source =\n            message[MessageSource] ?: throw IllegalArgumentException(\"Cannot find MessageSource from message\")\n        check(source is OnlineMessageSource.Incoming.FromStranger) { \"source provided to a StrangerMessageSyncEvent must be an instance of OnlineMessageSource.Incoming.FromStranger\" }\n    }\n\n    public override val stranger: Stranger get() = sender\n    public override val bot: Bot get() = sender.bot\n    public override val subject: Stranger get() = sender\n    public override val senderName: String get() = sender.nick\n    public override val source: OnlineMessageSource.Incoming.FromStranger get() = message.source as OnlineMessageSource.Incoming.FromStranger\n}\n\n/**\n * 机器人在其他客户端发送群消息同步到这个客户端的事件\n *\n * @see MessageSyncEvent\n */\n@OptIn(MiraiInternalApi::class)\npublic class GroupMessageSyncEvent private constructor(\n    private val _client: OtherClient?,\n    public override val group: Group,\n    public override val message: MessageChain,\n    public override val sender: Member,\n    public override val senderName: String,\n    public override val time: Int,\n    @Suppress(\"UNUSED_PARAMETER\", \"LocalVariableName\") _primaryConstructorMark: Any?,\n) : AbstractMessageEvent(), GroupAwareMessageEvent, MessageSyncEvent {\n    /**\n     * @since 2.13\n     */\n    public override val client: OtherClient\n        get() = _client ?: error(\"client is not set. Please use the new constructor.\")\n\n    /**\n     * @since 2.13\n     */\n    public constructor(\n        client: OtherClient,\n        group: Group,\n        message: MessageChain,\n        sender: Member,\n        senderName: String,\n        time: Int\n    ) : this(client, group, message, sender, senderName, time, null)\n\n    @Deprecated(\n        \"Please use the new constructor.\",\n        replaceWith = ReplaceWith(\"GroupMessageSyncEvent(client, group, message, sender, senderName, time)\"),\n        level = DeprecationLevel.WARNING\n    )\n    @DeprecatedSinceMirai(warningSince = \"2.13\")\n    public constructor(\n        group: Group,\n        message: MessageChain,\n        sender: Member,\n        senderName: String,\n        time: Int\n    ) : this(null, group, message, sender, senderName, time, null)\n\n    init {\n        val source = message[MessageSource] ?: error(\"Cannot find MessageSource from message\")\n        check(source is OnlineMessageSource.Incoming.FromGroup) { \"source provided to a GroupMessageSyncEvent must be an instance of OnlineMessageSource.Incoming.FromGroup\" }\n    }\n\n    override val bot: Bot get() = sender.bot\n    override val subject: Group get() = group\n    override val source: OnlineMessageSource.Incoming.FromGroup get() = message.source as OnlineMessageSource.Incoming.FromGroup\n\n    public override fun toString(): String =\n        \"GroupMessageSyncEvent(group=${group.id}, senderName=$senderName, sender=${sender.id}, message=$message)\"\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/events/NudgeEvent.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"BotEventsKt\")\n@file:OptIn(MiraiInternalApi::class)\n\npackage net.mamoe.mirai.event.events\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\n\n/**\n * 戳一戳事件\n */\npublic data class NudgeEvent @MiraiInternalApi constructor(\n    /**\n     * 戳一戳发起人\n     */\n    public val from: UserOrBot,\n    /**\n     * 戳一戳目标, 可能与 [from] 相同.\n     */\n    public val target: UserOrBot,\n    /**\n     * 消息语境, 同 [MessageEvent.subject]. 可能为 [Group], [Stranger], [Friend], [Member].\n     */\n    public val subject: Contact,\n    public val action: String,\n    public val suffix: String,\n) : AbstractEvent(), BotEvent, Packet {\n    override val bot: Bot get() = from.bot\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/events/ShortVideoUploadEvent.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"BotEventsKt\")\n\npackage net.mamoe.mirai.event.events\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.event.CancellableEvent\nimport net.mamoe.mirai.event.events.ShortVideoUploadEvent.Failed\nimport net.mamoe.mirai.event.events.ShortVideoUploadEvent.Succeed\nimport net.mamoe.mirai.internal.event.VerboseEvent\nimport net.mamoe.mirai.message.data.ShortVideo\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n\n/**\n * 短视频上传前. 可以阻止上传.\n *\n * 此事件总是在 [ShortVideoUploadEvent] 之前广播.\n * 若此事件被取消, [ShortVideoUploadEvent] 不会广播.\n *\n * @see Contact.uploadShortVideo 上传短视频. 为广播这个事件的唯一途径\n * @since 2.16\n */\n@OptIn(MiraiInternalApi::class)\npublic class BeforeShortVideoUploadEvent @MiraiInternalApi constructor(\n    public val target: Contact,\n    public val thumbnailSource: ExternalResource,\n    public val videoSource: ExternalResource\n) : BotEvent, BotActiveEvent, AbstractEvent(), CancellableEvent, VerboseEvent {\n    public override val bot: Bot\n        get() = target.bot\n}\n\n/**\n * 短视频上传完成.\n *\n * 此事件总是在 [BeforeImageUploadEvent] 之后广播.\n * 若 [BeforeImageUploadEvent] 被取消, 此事件不会广播.\n *\n * @see Contact.uploadShortVideo 上传短视频. 为广播这个事件的唯一途径\n * @see Succeed\n * @see Failed\n * @since 2.16\n */\n@OptIn(MiraiInternalApi::class)\npublic sealed class ShortVideoUploadEvent : BotEvent, BotActiveEvent, AbstractEvent(), VerboseEvent {\n    public abstract val target: Contact\n    public abstract val thumbnailSource: ExternalResource\n    public abstract val videoSource: ExternalResource\n    public override val bot: Bot\n        get() = target.bot\n\n    public class Succeed @MiraiInternalApi constructor(\n        override val target: Contact,\n        override val thumbnailSource: ExternalResource,\n        override val videoSource: ExternalResource,\n        public val video: ShortVideo\n    ) : ShortVideoUploadEvent() {\n        override fun toString(): String {\n            return \"ShortVideoUploadEvent.Succeed(target=$target, \" +\n                    \"thumbnailSource=$thumbnailSource, \" +\n                    \"videoSource=$videoSource, \" +\n                    \"video=$video)\"\n        }\n    }\n\n    public class Failed @MiraiInternalApi constructor(\n        override val target: Contact,\n        override val thumbnailSource: ExternalResource,\n        override val videoSource: ExternalResource,\n        public val errno: Int,\n        public val message: String\n    ) : ShortVideoUploadEvent() {\n        override fun toString(): String {\n            return \"ShortVideoUploadEvent.Failed(target=$target, \" +\n                    \"thumbnailSource=$thumbnailSource, \" +\n                    \"videoSource=$videoSource, \" +\n                    \"errno=$errno, message='$message')\"\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/events/SignEvent.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"BotEventsKt\")\n@file:OptIn(MiraiInternalApi::class)\n\npackage net.mamoe.mirai.event.events\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.Friend\nimport net.mamoe.mirai.contact.Member\nimport net.mamoe.mirai.contact.UserOrBot\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\n\n/**\n * 打卡事件\n * @property user 打卡发起人\n * @property sign 打卡标记\n * @property hasRank 有排名的打卡，通常是前三名\n * @property rank 打卡排名，没有排名或识别失败时为 null\n * @since 2.14\n */\npublic class SignEvent @MiraiInternalApi constructor(\n    public val user: UserOrBot,\n    public val sign: String,\n    @get:JvmName(\"hasRank\")\n    public val hasRank: Boolean,\n    public val rank: Int?\n) : AbstractEvent(), BotEvent, Packet {\n    override val bot: Bot get() = user.bot\n\n    override fun toString(): String {\n        return when (user) {\n            is Bot -> \"SignEvent(bot=${user.id}, sign=${sign})\"\n            is Member -> \"SignEvent(bot=${user.bot.id}, group=${user.group.id}, member=${user.id}, sign=${sign})\"\n            is Friend -> \"SignEvent(bot=${user.bot.id}, friend=${user.id} sign=${sign})\"\n            else -> \"SignEvent(user=${user}, sign=${sign})\"\n        }\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/events/bot.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"FunctionName\")\n@file:JvmMultifileClass\n@file:JvmName(\"BotEventsKt\")\n@file:OptIn(MiraiInternalApi::class)\n\npackage net.mamoe.mirai.event.events\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\n// note: 若你使用 IntelliJ IDEA, 按 alt + 7 可打开结构\n\n\n/**\n * [Bot] 登录完成, 好友列表, 群组列表初始化完成\n */\npublic data class BotOnlineEvent @MiraiInternalApi public constructor(\n    public override val bot: Bot\n) : BotActiveEvent, AbstractEvent()\n\n/**\n * [Bot] 离线时广播的事件. Bot 离线不会 [关闭 Bot][Bot.close], 只会关闭 Bot 的网络层.\n */\npublic sealed class BotOfflineEvent : BotEvent, AbstractEvent() {\n    /**\n     * 为 `true` 时会尝试重连. 仅 [BotOfflineEvent.Force] 默认为 `false`, 其他默认为 `true`.\n     */\n    public open val reconnect: Boolean get() = true\n\n    /**\n     * 主动离线.\n     *\n     * 在调用 [Bot.close] 时, 如果 Bot 连接正常, 将会广播 [Active].\n     *\n     * 主动广播这个事件也可以让 [Bot] 离线, 但不建议这么做. 建议调用 [Bot.close].\n     */\n    @OptIn(MiraiExperimentalApi::class)\n    public data class Active(\n        public override val bot: Bot,\n        public override val cause: Throwable?\n    ) : BotOfflineEvent(), BotActiveEvent, CauseAware {\n        override val reconnect: Boolean get() = false\n\n        override fun toString(): String {\n            return \"BotOfflineEvent.Active(bot=$bot, cause=$cause, reconnect=$reconnect)\"\n        }\n    }\n\n    /**\n     * 被挤下线. 默认不会自动重连. 可将 [reconnect] 改为 `true` 以重连.\n     */\n    public data class Force @MiraiInternalApi public constructor(\n        public override val bot: Bot,\n        public val title: String,\n        public val message: String,\n    ) : BotOfflineEvent(), Packet, BotPassiveEvent {\n        override var reconnect: Boolean = bot.configuration.autoReconnectOnForceOffline\n\n        override fun toString(): String {\n            return \"BotOfflineEvent.Force(bot=$bot, title='$title', message='$message', reconnect=$reconnect)\"\n        }\n    }\n\n    /**\n     * 被服务器断开\n     */\n    @OptIn(MiraiExperimentalApi::class)\n    @MiraiInternalApi(\"This is very experimental and might be changed\")\n    public data class MsfOffline @MiraiInternalApi public constructor(\n        public override val bot: Bot,\n        public override val cause: Throwable?\n    ) : BotOfflineEvent(), Packet, BotPassiveEvent, CauseAware {\n        override var reconnect: Boolean = true\n\n        override fun toString(): String {\n            return \"BotOfflineEvent.MsfOffline(bot=$bot, cause=$cause, reconnect=$reconnect)\"\n        }\n    }\n\n    /**\n     * 因网络问题而掉线\n     */\n    @OptIn(MiraiExperimentalApi::class)\n    public data class Dropped\n    @MiraiInternalApi public constructor(\n        public override val bot: Bot,\n        public override val cause: Throwable?\n    ) : BotOfflineEvent(), Packet, BotPassiveEvent, CauseAware {\n        override var reconnect: Boolean = true\n\n        override fun toString(): String {\n            return \"BotOfflineEvent.Dropped(bot=$bot, cause=$cause, reconnect=$reconnect)\"\n        }\n    }\n\n    /**\n     * 服务器主动要求更换另一个服务器\n     */\n    @OptIn(MiraiExperimentalApi::class)\n    @MiraiInternalApi\n    public data class RequireReconnect @MiraiInternalApi public constructor(\n        public override val bot: Bot, override val cause: Throwable?,\n    ) : BotOfflineEvent(), Packet, BotPassiveEvent, CauseAware {\n        override var reconnect: Boolean = true\n\n        override fun toString(): String {\n            return \"BotOfflineEvent.RequireReconnect(bot=$bot, cause=$cause, reconnect=$reconnect)\"\n        }\n    }\n\n    @MiraiExperimentalApi\n    public interface CauseAware {\n        public val cause: Throwable?\n    }\n}\n\n/**\n * [Bot] 主动或被动重新登录. 在此事件广播前就已经登录完毕.\n */\npublic data class BotReloginEvent @MiraiInternalApi public constructor(\n    public override val bot: Bot,\n    public val cause: Throwable?\n) : BotEvent, BotActiveEvent, AbstractEvent()\n\n/**\n * [Bot] 头像被修改（通过其他客户端修改了头像）. 在此事件广播前就已经修改完毕.\n * @see FriendAvatarChangedEvent\n */\npublic data class BotAvatarChangedEvent(\n    public override val bot: Bot\n) : BotEvent, Packet, AbstractEvent()\n\n/**\n * [Bot] 的昵称被改变事件, 在此事件触发时 bot 已经完成改名\n * @see FriendNickChangedEvent\n */\npublic data class BotNickChangedEvent(\n    public override val bot: Bot,\n    public val from: String,\n    public val to: String\n) : BotEvent, Packet, AbstractEvent()"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/events/friend.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"BotEventsKt\")\n@file:Suppress(\"FunctionName\", \"unused\", \"DEPRECATION_ERROR\")\n@file:OptIn(MiraiInternalApi::class)\n\npackage net.mamoe.mirai.event.events\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.contact.Friend\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.User\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.event.BroadcastControllable\nimport net.mamoe.mirai.internal.event.VerboseEvent\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\n\n/**\n * 好友昵称改变事件. 目前仅支持解析 (来自 PC 端的修改).\n */\npublic data class FriendRemarkChangeEvent @MiraiInternalApi public constructor(\n    public override val friend: Friend,\n    public val oldRemark: String,\n    public val newRemark: String,\n) : FriendEvent, Packet, AbstractEvent(), FriendInfoChangeEvent, BroadcastControllable {\n    override val shouldBroadcast: Boolean\n        get() = oldRemark != newRemark\n}\n\n/**\n * 成功添加了一个新好友的事件\n */\npublic data class FriendAddEvent @MiraiInternalApi public constructor(\n    /**\n     * 新好友. 已经添加到 [Bot.friends]\n     */\n    public override val friend: Friend,\n) : FriendEvent, Packet, AbstractEvent(), FriendInfoChangeEvent\n\n/**\n * 好友已被删除或主动删除的事件.\n */\npublic data class FriendDeleteEvent @MiraiInternalApi public constructor(\n    public override val friend: Friend,\n) : FriendEvent, Packet, AbstractEvent(), FriendInfoChangeEvent\n\n/**\n * 一个账号请求添加机器人为好友的事件\n */\npublic data class NewFriendRequestEvent @MiraiInternalApi public constructor(\n    public override val bot: Bot,\n    /**\n     * 事件唯一识别号\n     */\n    public val eventId: Long,\n    /**\n     * 申请好友消息\n     */\n    public val message: String,\n    /**\n     * 请求人 [User.id]\n     */\n    public val fromId: Long,\n    /**\n     * 来自群 [Group.id], 其他途径时为 0\n     */\n    public val fromGroupId: Long,\n    /**\n     * 群名片或好友昵称\n     */\n    public val fromNick: String,\n) : BotEvent, Packet, AbstractEvent(), FriendInfoChangeEvent {\n    /**\n     * @return 申请人来自的群. 当申请人来自其他途径申请时为 `null`\n     */\n    public val fromGroup: Group? = if (fromGroupId == 0L) null else bot.getGroup(fromGroupId)\n\n    @JvmBlockingBridge\n    public suspend fun accept(): Unit = Mirai.acceptNewFriendRequest(this)\n\n    @JvmBlockingBridge\n    public suspend fun reject(blackList: Boolean = false): Unit = Mirai.rejectNewFriendRequest(this, blackList)\n}\n\n\n/**\n * [Friend] 头像被修改. 在此事件广播前就已经修改完毕.\n */\npublic data class FriendAvatarChangedEvent @MiraiInternalApi public constructor(\n    public override val friend: Friend,\n) : FriendEvent, Packet, AbstractEvent()\n\n/**\n * [Friend] 昵称改变事件, 在此事件广播时好友已经完成改名\n * @see BotNickChangedEvent\n */\npublic data class FriendNickChangedEvent @MiraiInternalApi public constructor(\n    public override val friend: Friend,\n    public val from: String,\n    public val to: String,\n) : FriendEvent, Packet, AbstractEvent(), FriendInfoChangeEvent\n\n/**\n * 好友输入状态改变的事件，当开始输入文字、退出聊天窗口或清空输入框时会触发此事件\n */\npublic data class FriendInputStatusChangedEvent @MiraiInternalApi public constructor(\n    public override val friend: Friend,\n    public val inputting: Boolean,\n\n    ) : FriendEvent, Packet, AbstractEvent(), VerboseEvent"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/events/group.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"BotEventsKt\")\n@file:Suppress(\n    \"FunctionName\", \"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\", \"DEPRECATION_ERROR\",\n    \"MemberVisibilityCanBePrivate\"\n)\n@file:OptIn(MiraiInternalApi::class)\n\npackage net.mamoe.mirai.event.events\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.contact.announcement.Announcements\nimport net.mamoe.mirai.data.GroupHonorType\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.event.BroadcastControllable\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmOverloads\nimport kotlin.jvm.JvmStatic\n\n/**\n * 机器人被踢出群或在其他客户端主动退出一个群. 在事件广播前 [Bot.groups] 就已删除这个群.\n */\npublic sealed class BotLeaveEvent : BotEvent, Packet, AbstractEvent(), GroupMemberInfoChangeEvent {\n    public abstract override val group: Group\n\n    /**\n     * 机器人主动退出一个群.\n     */\n    @MiraiExperimentalApi(\"目前此事件类型不一定正确. 部分被踢出情况也会广播此事件.\")\n    public data class Active @MiraiInternalApi constructor(\n        public override val group: Group\n    ) : BotLeaveEvent() {\n        public override fun toString(): String = \"BotLeaveEvent.Active(group=${group.id})\"\n    }\n\n    /**\n     * 机器人被管理员或群主踢出群.\n     */\n    @MiraiExperimentalApi(\"BotLeaveEvent 的子类可能在将来改动. 使用 BotLeaveEvent 以保证兼容性.\")\n    public data class Kick @MiraiInternalApi constructor(\n        public override val operator: NormalMember\n    ) : BotLeaveEvent(),\n        GroupOperableEvent {\n        public override val group: Group get() = operator.group\n        public override val bot: Bot get() = super<BotLeaveEvent>.bot\n        public override fun toString(): String = \"BotLeaveEvent.Kick(group=${group.id},operator=${operator.id})\"\n    }\n\n    /**\n     * 机器人因群主解散群而退出群. 操作人一定是群主\n     * @since 2.8\n     */\n    @MiraiExperimentalApi(\"BotLeaveEvent 的子类可能在将来改动. 使用 BotLeaveEvent 以保证兼容性.\")\n    public data class Disband @MiraiInternalApi constructor(\n        public override val group: Group\n    ) : BotLeaveEvent(), GroupOperableEvent {\n        public override val operator: NormalMember = group.owner\n        public override fun toString(): String = \"BotLeaveEvent.Disband(group=${group.id})\"\n    }\n\n    public override val bot: Bot get() = group.bot\n}\n\n/**\n * Bot 在群里的权限被改变. 操作人一定是群主\n */\npublic data class BotGroupPermissionChangeEvent @MiraiInternalApi constructor(\n    public override val group: Group,\n    public val origin: MemberPermission,\n    public val new: MemberPermission\n) : BotPassiveEvent, GroupEvent, Packet, AbstractEvent(), GroupMemberInfoChangeEvent\n\n/**\n * Bot 被禁言\n */\npublic data class BotMuteEvent @MiraiInternalApi constructor(\n    public val durationSeconds: Int,\n    /**\n     * 操作人.\n     */\n    public val operator: NormalMember\n) : GroupEvent, Packet, BotPassiveEvent, AbstractEvent(), GroupMemberInfoChangeEvent {\n    public override val group: Group\n        get() = operator.group\n}\n\n/**\n * Bot 被取消禁言\n */\npublic data class BotUnmuteEvent @MiraiInternalApi constructor(\n    /**\n     * 操作人.\n     */\n    public val operator: NormalMember\n) : GroupEvent, Packet, BotPassiveEvent, AbstractEvent(), GroupMemberInfoChangeEvent {\n    public override val group: Group\n        get() = operator.group\n}\n\n/**\n * Bot 成功加入了一个新群\n */\npublic sealed class BotJoinGroupEvent : GroupEvent, BotPassiveEvent, Packet, AbstractEvent(),\n    GroupMemberInfoChangeEvent {\n    public abstract override val group: Group\n\n    /**\n     * 不确定, 已知的来源:\n     * - Bot 在其他客户端创建群聊而同步到 Bot 客户端.\n     */\n    @MiraiExperimentalApi\n    public data class Active @MiraiInternalApi constructor(\n        public override val group: Group\n    ) : BotJoinGroupEvent() {\n        public override fun toString(): String = \"BotJoinGroupEvent.Active(group=$group)\"\n    }\n\n    /**\n     * Bot 被一个群内的成员直接邀请加入了群.\n     *\n     * 此时服务器基于 Bot 的 QQ 设置自动同意了请求.\n     */\n    @MiraiExperimentalApi\n    public data class Invite @MiraiInternalApi constructor(\n        /**\n         * 邀请人\n         */\n        public val invitor: NormalMember\n    ) : BotJoinGroupEvent() {\n        public override val group: Group get() = invitor.group\n\n        public override fun toString(): String {\n            return \"BotJoinGroupEvent.Invite(invitor=$invitor)\"\n        }\n    }\n\n    /**\n     * 原群主通过 https://huifu.qq.com/ 恢复原来群主身份并入群,\n     * [Bot] 是原群主\n     */\n    @MiraiExperimentalApi\n    public data class Retrieve @MiraiInternalApi constructor(\n        public override val group: Group\n    ) : BotJoinGroupEvent() {\n        override fun toString(): String = \"BotJoinGroupEvent.Retrieve(group=${group.id})\"\n    }\n}\n\n// region 群设置\n\n/**\n * 群设置改变. 此事件广播前修改就已经完成.\n */\npublic interface GroupSettingChangeEvent<T> : GroupEvent, BotPassiveEvent, BroadcastControllable {\n    public val origin: T\n    public val new: T\n\n    public override val shouldBroadcast: Boolean\n        get() = origin != new\n}\n\n/**\n * 群名改变. 此事件广播前修改就已经完成.\n */\npublic data class GroupNameChangeEvent @MiraiInternalApi constructor(\n    public override val origin: String,\n    public override val new: String,\n    public override val group: Group,\n    /**\n     * 操作人. 为 null 时则是机器人操作\n     */\n    public override val operator: NormalMember?\n) : GroupSettingChangeEvent<String>, Packet, GroupOperableEvent, AbstractEvent(), GroupMemberInfoChangeEvent\n\n/**\n * 入群公告改变. 此事件广播前修改就已经完成.\n *\n * ## 已弃用\n *\n * 本事件不会再被触发. 无替代方法获知入群公告改变事件. 可使用 [Announcements] 主动获取所有公告列表.\n */\n@DeprecatedSinceMirai(warningSince = \"2.12\", errorSince = \"2.14\")\n@Deprecated(\"This event is not being triggered anymore.\", level = DeprecationLevel.ERROR)\npublic data class GroupEntranceAnnouncementChangeEvent @MiraiInternalApi constructor(\n    public override val origin: String,\n    public override val new: String,\n    public override val group: Group,\n    /**\n     * 操作人. 为 null 时则是机器人操作\n     */\n    public override val operator: NormalMember?\n) : GroupSettingChangeEvent<String>, Packet, GroupOperableEvent, AbstractEvent(), GroupMemberInfoChangeEvent\n\n\n/**\n * 群 \"全员禁言\" 功能状态改变. 此事件广播前修改就已经完成.\n */\npublic data class GroupMuteAllEvent @MiraiInternalApi constructor(\n    public override val origin: Boolean,\n    public override val new: Boolean,\n    public override val group: Group,\n    /**\n     * 操作人. 为 null 时则是机器人操作\n     */\n    public override val operator: NormalMember?\n) : GroupSettingChangeEvent<Boolean>, Packet, GroupOperableEvent, AbstractEvent(), GroupMemberInfoChangeEvent\n\n\n/**\n * 群 \"匿名聊天\" 功能状态改变. 此事件广播前修改就已经完成.\n */\npublic data class GroupAllowAnonymousChatEvent @MiraiInternalApi constructor(\n    public override val origin: Boolean,\n    public override val new: Boolean,\n    public override val group: Group,\n    /**\n     * 操作人. 为 null 时则是机器人操作\n     */\n    public override val operator: NormalMember?\n) : GroupSettingChangeEvent<Boolean>, Packet, GroupOperableEvent, AbstractEvent(), GroupMemberInfoChangeEvent\n\n\n/**\n * 群 \"坦白说\" 功能状态改变. 此事件广播前修改就已经完成.\n */\npublic data class GroupAllowConfessTalkEvent @MiraiInternalApi constructor(\n    public override val origin: Boolean,\n    public override val new: Boolean,\n    public override val group: Group,\n    public val isByBot: Boolean // 无法获取操作人\n) : GroupSettingChangeEvent<Boolean>, Packet, AbstractEvent(), GroupMemberInfoChangeEvent\n\n/**\n * 群 \"允许群员邀请好友加群\" 功能状态改变. 此事件广播前修改就已经完成.\n */\npublic data class GroupAllowMemberInviteEvent @MiraiInternalApi constructor(\n    public override val origin: Boolean,\n    public override val new: Boolean,\n    public override val group: Group,\n    /**\n     * 操作人. 为 null 时则是机器人操作\n     */\n    public override val operator: NormalMember?\n) : GroupSettingChangeEvent<Boolean>, Packet, GroupOperableEvent, AbstractEvent(), GroupMemberInfoChangeEvent\n\n\n// endregion\n\n\n// region 群成员\n\n// region 成员变更\n\n/**\n * 成员已经加入群的事件\n */\npublic sealed class MemberJoinEvent(\n    public override val member: NormalMember\n) : GroupMemberEvent, BotPassiveEvent, Packet,\n    AbstractEvent(), GroupMemberInfoChangeEvent {\n    /**\n     * 被邀请加入群\n     */\n    public data class Invite @MiraiInternalApi constructor(\n        public override val member: NormalMember,\n        /**\n         * 邀请者\n         */\n        public val invitor: NormalMember\n    ) : MemberJoinEvent(member) {\n        public override fun toString(): String = \"MemberJoinEvent.Invite(member=${member.id}, invitor=${invitor.id})\"\n    }\n\n    /**\n     * 成员主动加入群\n     */\n    public data class Active @MiraiInternalApi constructor(\n        public override val member: NormalMember\n    ) : MemberJoinEvent(member) {\n        public override fun toString(): String = \"MemberJoinEvent.Active(member=${member.id})\"\n    }\n\n    /**\n     * 原群主通过 https://huifu.qq.com/ 恢复原来群主身份并入群,\n     * 此时 [member] 的 [Member.permission] 肯定是 [MemberPermission.OWNER]\n     */\n    public data class Retrieve @MiraiInternalApi constructor(\n        public override val member: NormalMember\n    ) : MemberJoinEvent(member) {\n        override fun toString(): String = \"MemberJoinEvent.Retrieve(member=${member.id})\"\n    }\n}\n\n/**\n * 成员已经离开群的事件. 在事件广播前成员就已经从 [Group.members] 中删除\n */\npublic sealed class MemberLeaveEvent : GroupMemberEvent, AbstractEvent(), GroupMemberInfoChangeEvent {\n    /**\n     * 成员被踢出群. 成员不可能是机器人自己.\n     */\n    public data class Kick(\n        public override val member: NormalMember,\n        /**\n         * 操作人. 为 null 则是机器人操作.\n         */\n        public override val operator: NormalMember?\n    ) : MemberLeaveEvent(), Packet, GroupOperableEvent {\n        public override fun toString(): String = \"MemberLeaveEvent.Kick(member=${member.id}, operator=${operator?.id})\"\n    }\n\n    /**\n     * 成员主动离开\n     */\n    public data class Quit(\n        public override val member: NormalMember\n    ) : MemberLeaveEvent(), Packet {\n        public override fun toString(): String = \"MemberLeaveEvent.Quit(member=${member.id})\"\n    }\n}\n\n/**\n * [Bot] 被邀请加入一个群.\n */\npublic data class BotInvitedJoinGroupRequestEvent @MiraiInternalApi constructor(\n    public override val bot: Bot,\n    /**\n     * 事件唯一识别号\n     */\n    public val eventId: Long,\n    /**\n     * 邀请入群的账号的 id\n     */\n    public val invitorId: Long,\n    public override val groupId: Long,\n    public val groupName: String,\n    /**\n     * 邀请人昵称\n     */\n    public val invitorNick: String\n) : BotEvent, Packet, AbstractEvent(), BaseGroupMemberInfoChangeEvent {\n    /**\n     * 邀请人. 若在事件发生后邀请人已经被删除好友, [invitor] 为 `null`.\n     */\n    public val invitor: Friend? get() = this.bot.getFriend(invitorId)\n\n    @JvmBlockingBridge\n    public suspend fun accept(): Unit = Mirai.acceptInvitedJoinGroupRequest(this)\n\n    @JvmBlockingBridge\n    public suspend fun ignore(): Unit = Mirai.ignoreInvitedJoinGroupRequest(this)\n}\n\n/**\n * 一个账号请求加入群事件, [Bot] 在此群中是管理员或群主.\n */\npublic data class MemberJoinRequestEvent @MiraiInternalApi constructor(\n    override val bot: Bot,\n    /**\n     * 事件唯一识别号\n     */\n    val eventId: Long,\n    /**\n     * 入群申请消息\n     */\n    val message: String,\n    /**\n     * 申请入群的账号的 id\n     */\n    val fromId: Long,\n    override val groupId: Long,\n    val groupName: String,\n    /**\n     * 申请人昵称\n     */\n    val fromNick: String,\n    /**\n     * 邀请人 id（如果是邀请入群）\n     */\n    val invitorId: Long? = null\n) : BotEvent, Packet, AbstractEvent(), BaseGroupMemberInfoChangeEvent {\n    /**\n     * 相关群. 若在事件发生后机器人退出这个群, [group] 为 `null`.\n     */\n    public val group: Group? get() = this.bot.getGroup(groupId)\n\n    /**\n     * 邀请入群的成员. 若在事件发生时机器人或该成员退群, [invitor] 为 `null`.\n     */\n    public val invitor: NormalMember? by lazy { invitorId?.let { group?.get(it) } }\n\n    /**\n     * 同意这个请求\n     */\n    @JvmBlockingBridge\n    public suspend fun accept(): Unit = Mirai.acceptMemberJoinRequest(this)\n\n    /**\n     * 拒绝这个请求\n     */\n    @JvmBlockingBridge\n    @JvmOverloads\n    public suspend fun reject(blackList: Boolean = false, message: String = \"\"): Unit =\n        Mirai.rejectMemberJoinRequest(this, blackList, message)\n\n    /**\n     * 忽略这个请求.\n     */\n    @JvmBlockingBridge\n    public suspend fun ignore(blackList: Boolean = false): Unit = Mirai.ignoreMemberJoinRequest(this, blackList)\n\n    @Deprecated(\"For binary compatibility\", level = DeprecationLevel.HIDDEN)\n    public constructor(\n        bot: Bot, eventId: Long, message: String,\n        fromId: Long, groupId: Long, groupName: String, fromNick: String\n    ) : this(bot, eventId, message, fromId, groupId, groupName, fromNick, null)\n\n    @Deprecated(\"For binary compatibility\", level = DeprecationLevel.HIDDEN)\n    public fun copy(\n        bot: Bot, eventId: Long, message: String,\n        fromId: Long, groupId: Long, groupName: String, fromNick: String\n    ): MemberJoinRequestEvent = copy(\n        bot = bot, eventId = eventId, message = message, fromId = fromId,\n        groupId = groupId, groupName = groupName, fromNick = fromNick, invitorId = null\n    )\n\n    internal companion object {\n        @Suppress(\"unused\")\n        @Deprecated(\"For binary compatibility\", level = DeprecationLevel.HIDDEN)\n        @JvmStatic\n        @JvmName(\"copy\\$default\") // avoid being mangled\n        fun copy_default(\n            var0: MemberJoinRequestEvent, var1: Bot, var2: Long, var4: String, var5: Long, var7: Long,\n            var9: String, var10: String, var11: Int, @Suppress(\"UNUSED_PARAMETER\") var12: Any\n        ): MemberJoinRequestEvent {\n            var bot = var1\n            var eventId = var2\n            var message = var4\n            var fromId = var5\n            var groupId = var7\n            var groupName = var9\n            var fromNick = var10\n            if (var11 and 1 != 0) bot = var0.bot\n            if (var11 and 2 != 0) eventId = var0.eventId\n            if (var11 and 4 != 0) message = var0.message\n            if (var11 and 8 != 0) fromId = var0.fromId\n            if (var11 and 16 != 0) groupId = var0.groupId\n            if (var11 and 32 != 0) groupName = var0.groupName\n            if (var11 and 64 != 0) fromNick = var0.fromNick\n            return var0.copy(\n                bot = bot, eventId = eventId, message = message,\n                fromId = fromId, groupId = groupId, groupName = groupName, fromNick = fromNick\n            )\n        }\n    }\n}\n\n// endregion\n\n// region 名片和头衔\n\n/**\n * 成员群名片改动. 此事件广播前修改就已经完成.\n *\n * 由于服务器并不会告知名片变动, 此事件只能由 mirai 在发现变动时才广播. 不要依赖于这个事件.\n */\npublic data class MemberCardChangeEvent @MiraiInternalApi constructor(\n    /**\n     * 修改前\n     */\n    public val origin: String,\n\n    /**\n     * 修改后\n     */\n    public val new: String,\n\n    public override val member: NormalMember\n) : GroupMemberEvent, Packet, AbstractEvent(), GroupMemberInfoChangeEvent\n\n/**\n * 成员群特殊头衔改动. 一定为群主操作\n *\n * 由于服务器并不会告知特殊头衔的重置, 因此此事件在特殊头衔重置后只能由 mirai 在发现变动时才广播\n */\npublic data class MemberSpecialTitleChangeEvent @MiraiInternalApi constructor(\n    /**\n     * 修改前\n     */\n    public val origin: String,\n\n    /**\n     * 修改后\n     */\n    public val new: String,\n\n    public override val member: NormalMember,\n\n    /**\n     * 操作人.\n     * 不为 null 时一定为群主. 可能与 [member] 引用相同, 此时为群员自己修改.\n     * 为 null 时则是机器人操作.\n     */\n    public override val operator: NormalMember?\n) : GroupMemberEvent, GroupOperableEvent, AbstractEvent(), Packet, GroupMemberInfoChangeEvent\n\n// endregion\n\n\n// region 成员权限\n\n/**\n * 成员权限改变的事件. 成员不可能是机器人自己.\n */\npublic data class MemberPermissionChangeEvent @MiraiInternalApi constructor(\n    public override val member: NormalMember,\n    public val origin: MemberPermission,\n    public val new: MemberPermission\n) : GroupMemberEvent, BotPassiveEvent, Packet, AbstractEvent(), GroupMemberInfoChangeEvent\n\n// endregion\n\n\n// region 禁言\n\n/**\n * 群成员被禁言事件. 被禁言的成员都不可能是机器人本人\n *\n * @see BotMuteEvent 机器人被禁言的事件\n */\npublic data class MemberMuteEvent @MiraiInternalApi constructor(\n    public override val member: Member,\n    public val durationSeconds: Int,\n    /**\n     * 操作人. 为 null 则为机器人操作\n     */\n    public override val operator: Member?\n) : GroupMemberEvent, Packet, GroupOperableEvent, AbstractEvent(), GroupMemberInfoChangeEvent\n\n/**\n * 群成员被取消禁言事件. 被禁言的成员都不可能是机器人本人\n *\n * @see BotUnmuteEvent 机器人被取消禁言的事件\n */\npublic data class MemberUnmuteEvent @MiraiInternalApi constructor(\n    public override val member: Member,\n    /**\n     * 操作人. 为 null 则为机器人操作\n     */\n    public override val operator: Member?\n) : GroupMemberEvent, Packet, GroupOperableEvent, AbstractEvent(), GroupMemberInfoChangeEvent\n\n// endregion\n\n// region 群荣誉\n/**\n * [Member] 荣誉改变时的事件, 目前只支持龙王\n */\n@MiraiExperimentalApi\npublic sealed class MemberHonorChangeEvent : GroupMemberEvent, BotPassiveEvent, Packet, AbstractEvent() {\n    /**\n     * 改变荣誉的群成员\n     */\n    public abstract override val member: NormalMember\n\n    /**\n     * 改变的荣誉类型\n     */\n    @Suppress(\"INAPPLICABLE_JVM_NAME\")\n    @get:JvmName(\"getHonorType\")\n    public abstract val honorType: GroupHonorType // `public int getHonorType()` on Java's point of view\n\n    /**\n     * 获得荣誉时的事件\n     */\n    public data class Achieve(\n        override val member: NormalMember,\n        @get:JvmName(\"getHonorType\")\n        override val honorType: GroupHonorType\n    ) : MemberHonorChangeEvent() {\n        override fun toString(): String {\n            return \"MemberHonorChangeEvent.Achieve(member=$member, honorType=$honorType)\"\n        }\n    }\n\n    /**\n     * 失去荣誉时的事件\n     */\n    public data class Lose(\n        override val member: NormalMember,\n        @get:JvmName(\"getHonorType\")\n        override val honorType: GroupHonorType\n    ) : MemberHonorChangeEvent() {\n        override fun toString(): String {\n            return \"MemberHonorChangeEvent.Lose(member=$member, honorType=$honorType)\"\n        }\n    }\n}\n\n/**\n * [Group] 龙王改变时的事件\n */\npublic data class GroupTalkativeChangeEvent(\n    /**\n     * 改变的群\n     */\n    override val group: Group,\n    /**\n     * 当前龙王\n     */\n    public val now: NormalMember,\n    /**\n     * 先前龙王\n     */\n    public val previous: NormalMember\n) : Packet, GroupEvent, BotPassiveEvent, AbstractEvent()\n\n// endregion\n\n// endregion\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/events/otherClient.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.event.events\n\nimport net.mamoe.mirai.contact.ClientKind\nimport net.mamoe.mirai.contact.OtherClient\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n/**\n * 其他设备上线\n */\npublic data class OtherClientOnlineEvent @MiraiInternalApi constructor(\n    override val client: OtherClient,\n    /**\n     * 详细设备类型，通常非 `null`.\n     */\n    val kind: ClientKind?\n) : OtherClientEvent, AbstractEvent(), BotPassiveEvent\n\n/**\n * 其他设备离线\n */\npublic data class OtherClientOfflineEvent(\n    override val client: OtherClient,\n) : OtherClientEvent, AbstractEvent(), BotPassiveEvent"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/events/stranger.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(MiraiInternalApi::class)\n\npackage net.mamoe.mirai.event.events\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.Friend\nimport net.mamoe.mirai.contact.Stranger\nimport net.mamoe.mirai.event.AbstractEvent\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n/**\n * 新增陌生人的事件\n *\n */\npublic data class StrangerAddEvent @MiraiInternalApi public constructor(\n    /**\n     * 新的陌生人. 已经添加到 [Bot.strangers]\n     */\n    public override val stranger: Stranger,\n) : StrangerEvent, Packet, AbstractEvent()\n\n\n/**\n * 陌生人关系改变事件\n *\n */\npublic sealed class StrangerRelationChangeEvent(\n    public override val stranger: Stranger,\n) : StrangerEvent, Packet, AbstractEvent() {\n    /**\n     * 主动删除陌生人或陌生人被删除的事件, 不一定能接收到被动删除的事件\n     */\n    public class Deleted(\n        /**\n         * 被删除的陌生人\n         */\n        stranger: Stranger,\n    ) : StrangerRelationChangeEvent(stranger)\n\n    /**\n     * 与陌生人成为好友\n     */\n    public class Friended(\n        /**\n         * 成为好友的陌生人\n         *\n         * 成为好友后该陌生人会从陌生人列表中删除\n         */\n        public override val stranger: Stranger,\n        /**\n         * 成为好友后的实例\n         *\n         * 已经添加到Bot的好友列表中\n         */\n        public val friend: Friend,\n    ) : StrangerRelationChangeEvent(stranger)\n\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/events/types.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"BotEventsKt\")\n\npackage net.mamoe.mirai.event.events\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.internal.network.Packet\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmSynthetic\n\n/**\n * 有关一个 [Bot] 的事件\n */\npublic interface BotEvent : Event {\n    public val bot: Bot\n}\n\n/**\n * [Bot] 被动接收的事件. 这些事件可能与机器人有关\n */\npublic interface BotPassiveEvent : BotEvent\n\n/**\n * 由 [Bot] 主动发起的动作的事件\n */\npublic interface BotActiveEvent : BotEvent\n\n\n/**\n * 有关群的事件\n */\npublic interface GroupEvent : BotEvent {\n    public val group: Group\n    override val bot: Bot\n        get() = group.bot\n}\n\n\n/**\n * 可由 [Member] 或 [Bot] 操作的事件\n * @see isByBot\n * @see operatorOrBot\n */\npublic interface GroupOperableEvent : GroupEvent {\n    /**\n     * 操作人, 为 `null` 时为 [Bot] 操作\n     */\n    public val operator: Member?\n}\n\n/**\n * 是否由 [Bot] 操作\n */\n@get:JvmSynthetic\n@Suppress(\"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\")\n@kotlin.internal.HidesMembers\npublic inline val GroupOperableEvent.isByBot: Boolean\n    get() = operator == null\n\n/**\n * 当操作人为 [Member] 时获取这个 [Member],\n * 当操作人为 [Bot] 时获取 [Group.botAsMember]\n */\n@get:JvmSynthetic\npublic inline val GroupOperableEvent.operatorOrBot: Member\n    get() = this.operator ?: this.group.botAsMember\n\n/**\n * 有关 [User] 的事件\n */\npublic interface UserEvent : BotEvent {\n    public val user: User\n}\n\n/**\n * 有关好友的事件\n */\npublic interface FriendEvent : BotEvent, UserEvent {\n    public val friend: Friend\n    override val bot: Bot get() = friend.bot\n    override val user: Friend get() = friend\n}\n\ninternal interface FriendInfoChangeEvent : BotEvent // for cache\n\n/**\n * 有关陌生人的事件\n */\npublic interface StrangerEvent : BotEvent, UserEvent {\n    public val stranger: Stranger\n    override val bot: Bot get() = stranger.bot\n    override val user: Stranger get() = stranger\n}\n\n/**\n * 有关群成员的事件\n */\npublic interface GroupMemberEvent : GroupEvent, UserEvent {\n    public val member: Member\n    override val group: Group get() = member.group\n    override val user: Member get() = member\n}\n\n/**\n * 用于更新缓存, 请勿使用.\n */\n@MiraiInternalApi\ninternal interface BaseGroupMemberInfoChangeEvent : BotEvent {\n    val groupId: Long\n} // for cache\n\n@MiraiInternalApi\ninternal interface GroupMemberInfoChangeEvent : BotEvent, GroupEvent, BaseGroupMemberInfoChangeEvent {\n    override val groupId: Long get() = group.id\n} // for cache\n\n@OptIn(MiraiInternalApi::class)\npublic interface OtherClientEvent : BotEvent, Packet {\n    public val client: OtherClient\n    override val bot: Bot get() = client.bot\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/select.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"DuplicatedCode\")\n\npackage net.mamoe.mirai.event\n\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.event.events.MessageEvent\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.isContextIdenticalWith\nimport net.mamoe.mirai.message.nextMessage\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport kotlin.jvm.JvmInline\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmSynthetic\n\n\n/**\n * 挂起当前协程, 等待任意一个事件监听器返回 `false` 后返回.\n *\n * 创建的所有事件监听器都会判断发送人信息 ([isContextIdenticalWith]), 监听之后的所有消息.\n *\n * [selectBuilder] DSL 类似于 [EventChannel.subscribeMessages] 的 DSL, 屏蔽了一些 `reply` DSL 以确保类型安全\n *\n * ```kotlin\n * reply(\"开启复读模式\")\n *\n * whileSelectMessages {\n *     \"stop\" {\n *         reply(\"已关闭复读\")\n *         false // 停止循环\n *     }\n *     // 也可以使用 startsWith(\"\") { true } 等 DSL\n *     default {\n *         reply(message)\n *         true // 继续循环\n *     }\n *     timeout(3000) {\n *         // on\n *         true\n *     }\n * } // 等待直到 `false`\n *\n * reply(\"复读模式结束\")\n * ```\n *\n * @param timeoutMillis 超时. 单位为毫秒. `-1` 为不限制\n *\n * @see EventChannel.subscribe\n * @see EventChannel.subscribeMessages\n * @see nextMessage 挂起协程并等待下一条消息\n */\n@Suppress(\"unused\")\n@BuilderInference\npublic suspend inline fun <reified T : MessageEvent> T.whileSelectMessages(\n    timeoutMillis: Long = -1,\n    filterContext: Boolean = true,\n    priority: EventPriority = EventPriority.MONITOR,\n    @BuilderInference crossinline selectBuilder: @MessageDsl MessageSelectBuilder<T, Boolean>.() -> Unit\n): Unit = whileSelectMessagesImpl(timeoutMillis, filterContext, priority, selectBuilder)\n\n/**\n * [selectMessages] 的 [Unit] 返回值捷径 (由于 Kotlin 无法推断 [Unit] 类型)\n */\n@MiraiExperimentalApi\n@JvmName(\"selectMessages1\")\n@BuilderInference\npublic suspend inline fun <reified T : MessageEvent> T.selectMessagesUnit(\n    timeoutMillis: Long = -1,\n    filterContext: Boolean = true,\n    priority: EventPriority = EventPriority.MONITOR,\n    @BuilderInference crossinline selectBuilder: @MessageDsl MessageSelectBuilderUnit<T, Unit>.() -> Unit\n): Unit = selectMessagesImpl(timeoutMillis, true, filterContext, priority, selectBuilder)\n\n\n/**\n * 挂起当前协程, 等待任意一个事件监听器触发后返回其返回值.\n *\n * 创建的所有事件监听器都会判断发送人信息 ([isContextIdenticalWith]), 监听之后的所有消息.\n *\n * [selectBuilder] DSL 类似于 [EventChannel.subscribeMessages] 的 DSL, 屏蔽了一些 `reply` DSL 以确保类型安全\n *\n * ```kotlin\n * val value: String = selectMessages {\n *   \"hello\" { \"111\" }\n *   \"hi\" { \"222\" }\n *   startsWith(\"/\") { it }\n *   default { \"default\" }\n * }\n * ```\n *\n * @param timeoutMillis 超时. 单位为毫秒. `-1` 为不限制\n *\n * @see nextMessage 挂起协程并等待下一条消息\n */\n@Suppress(\"unused\") // false positive\n@BuilderInference\npublic suspend inline fun <reified T : MessageEvent, R> T.selectMessages(\n    timeoutMillis: Long = -1,\n    filterContext: Boolean = true,\n    priority: EventPriority = EventPriority.MONITOR,\n    @BuilderInference\n    crossinline selectBuilder: @MessageDsl MessageSelectBuilder<T, R>.() -> Unit\n): R =\n    selectMessagesImpl(\n        timeoutMillis,\n        false,\n        filterContext,\n        priority\n    ) { selectBuilder.invoke(this as MessageSelectBuilder<T, R>) }\n\n/**\n * [selectMessages] 时的 DSL 构建器.\n *\n * 它是特殊化的消息监听 ([EventChannel.subscribeMessages]) DSL, 屏蔽了一些 `reply` DSL 以确保作用域安全性\n *\n * @see MessageSelectBuilderUnit 查看上层 API\n */\n@Suppress(\"PARAMETER_NAME_CHANGED_ON_OVERRIDE\")\npublic abstract class MessageSelectBuilder<M : MessageEvent, R> @PublishedApi internal constructor(\n    ownerMessagePacket: M,\n    stub: Any?,\n    subscriber: (M.(String) -> Boolean, MessageListener<M, Any?>) -> Unit\n) : MessageSelectBuilderUnit<M, R>(ownerMessagePacket, stub, subscriber) {\n\n    // 这些函数无法获取返回值. 必须屏蔽.\n\n    @Deprecated(\"Using `reply` DSL in message selection is prohibited\", level = DeprecationLevel.HIDDEN)\n    override fun <N : Any> mapping(\n        mapper: M.(String) -> N?,\n        onEvent: @MessageDsl suspend M.(N) -> R\n    ): Nothing = error(\"prohibited\")\n\n    @Deprecated(\"Use `default` instead\", level = DeprecationLevel.HIDDEN)\n    override fun always(onEvent: MessageListener<M, Any?>): Nothing = error(\"prohibited\")\n\n    @Deprecated(\"Using `reply` DSL in message selection is prohibited\", level = DeprecationLevel.HIDDEN)\n    override infix fun MessageSelectionTimeoutChecker.reply(block: suspend () -> Any?): Nothing = error(\"prohibited\")\n\n    @Deprecated(\"Using `reply` DSL in message selection is prohibited\", level = DeprecationLevel.HIDDEN)\n    override infix fun MessageSelectionTimeoutChecker.reply(message: String): Nothing = error(\"prohibited\")\n\n    @Deprecated(\"Using `reply` DSL in message selection is prohibited\", level = DeprecationLevel.HIDDEN)\n    override infix fun MessageSelectionTimeoutChecker.reply(message: Message): Nothing = error(\"prohibited\")\n\n    @Deprecated(\"Using `reply` DSL in message selection is prohibited\", level = DeprecationLevel.HIDDEN)\n    override infix fun MessageSelectionTimeoutChecker.quoteReply(block: suspend () -> Any?): Nothing =\n        error(\"prohibited\")\n\n    @Deprecated(\"Using `reply` DSL in message selection is prohibited\", level = DeprecationLevel.HIDDEN)\n    override infix fun MessageSelectionTimeoutChecker.quoteReply(message: String): Nothing = error(\"prohibited\")\n\n    @Deprecated(\"Using `reply` DSL in message selection is prohibited\", level = DeprecationLevel.HIDDEN)\n    override infix fun MessageSelectionTimeoutChecker.quoteReply(message: Message): Nothing = error(\"prohibited\")\n\n    @Deprecated(\"Using `reply` DSL in message selection is prohibited\", level = DeprecationLevel.HIDDEN)\n    override fun String.containsReply(reply: String): Nothing = error(\"prohibited\")\n\n    @Deprecated(\"Using `reply` DSL in message selection is prohibited\", level = DeprecationLevel.HIDDEN)\n    override fun String.containsReply(replier: suspend M.(String) -> Any?): Nothing = error(\"prohibited\")\n\n    @Deprecated(\"Using `reply` DSL in message selection is prohibited\", level = DeprecationLevel.HIDDEN)\n    override fun Regex.matchingReply(replier: suspend M.(MatchResult) -> Any?): Nothing = error(\"prohibited\")\n\n    @Deprecated(\"Using `reply` DSL in message selection is prohibited\", level = DeprecationLevel.HIDDEN)\n    override fun Regex.findingReply(replier: suspend M.(MatchResult) -> Any?): Nothing = error(\"prohibited\")\n\n    @Deprecated(\"Using `reply` DSL in message selection is prohibited\", level = DeprecationLevel.HIDDEN)\n    override fun String.endsWithReply(replier: suspend M.(String) -> Any?): Nothing = error(\"prohibited\")\n\n    @Deprecated(\"Using `reply` DSL in message selection is prohibited\", level = DeprecationLevel.HIDDEN)\n    override fun String.reply(reply: String): Nothing = error(\"prohibited\")\n\n    @Deprecated(\"Using `reply` DSL in message selection is prohibited\", level = DeprecationLevel.HIDDEN)\n    override fun String.reply(reply: Message): Nothing = error(\"prohibited\")\n\n    @Deprecated(\"Using `reply` DSL in message selection is prohibited\", level = DeprecationLevel.HIDDEN)\n    override fun String.reply(replier: suspend M.(String) -> Any?): Nothing = error(\"prohibited\")\n\n\n    @Deprecated(\"Using `reply` DSL in message selection is prohibited\", level = DeprecationLevel.HIDDEN)\n    override fun ListeningFilter.reply(toReply: String): Nothing = error(\"prohibited\")\n\n    @Deprecated(\"Using `reply` DSL in message selection is prohibited\", level = DeprecationLevel.HIDDEN)\n    override fun ListeningFilter.reply(message: Message): Nothing = error(\"prohibited\")\n\n    @Deprecated(\"Using `reply` DSL in message selection is prohibited\", level = DeprecationLevel.HIDDEN)\n    override fun ListeningFilter.reply(replier: suspend M.(String) -> Any?): Nothing =\n        error(\"prohibited\")\n\n    @Deprecated(\"Using `reply` DSL in message selection is prohibited\", level = DeprecationLevel.HIDDEN)\n    override fun ListeningFilter.quoteReply(toReply: String): Nothing = error(\"prohibited\")\n\n    @Deprecated(\"Using `reply` DSL in message selection is prohibited\", level = DeprecationLevel.HIDDEN)\n    override fun ListeningFilter.quoteReply(toReply: Message): Nothing = error(\"prohibited\")\n\n    @Deprecated(\"Using `reply` DSL in message selection is prohibited\", level = DeprecationLevel.HIDDEN)\n    override fun ListeningFilter.quoteReply(replier: suspend M.(String) -> Any?): Nothing = error(\"prohibited\")\n}\n\n@JvmInline\n@Suppress(\"NON_PUBLIC_PRIMARY_CONSTRUCTOR_OF_INLINE_CLASS\")\npublic value class MessageSelectionTimeoutChecker internal constructor(public val timeoutMillis: Long)\n\npublic class MessageSelectionTimeoutException : RuntimeException()\n\n\n/////////////////////////\n//// implementations ////\n/////////////////////////\n\n\n@JvmSynthetic\n@PublishedApi\ninternal suspend inline fun <R> withSilentTimeoutOrCoroutineScope(\n    timeoutMillis: Long,\n    noinline block: suspend CoroutineScope.() -> R\n): R {\n    require(timeoutMillis == -1L || timeoutMillis > 0) { \"timeoutMillis must be -1 or > 0 \" }\n\n    return withContext(ExceptionHandlerIgnoringCancellationException) {\n        if (timeoutMillis == -1L) {\n            coroutineScope(block)\n        } else {\n            withTimeout(timeoutMillis, block)\n        }\n    }\n}\n\n@PublishedApi\ninternal val SELECT_MESSAGE_STUB: Any = Any()\n\n@PublishedApi\ninternal val ExceptionHandlerIgnoringCancellationException: CoroutineExceptionHandler =\n    CoroutineExceptionHandler { _, throwable ->\n        if (throwable !is CancellationException) {\n            throw throwable\n        }\n    }\n\n@PublishedApi\n@BuilderInference\ninternal suspend inline fun <reified T : MessageEvent, R> T.selectMessagesImpl(\n    timeoutMillis: Long = -1,\n    isUnit: Boolean,\n    filterContext: Boolean = true,\n    priority: EventPriority,\n    @BuilderInference\n    crossinline selectBuilder: @MessageDsl MessageSelectBuilderUnit<T, R>.() -> Unit\n): R = withSilentTimeoutOrCoroutineScope(timeoutMillis) {\n    var deferred: CompletableDeferred<R>? = CompletableDeferred()\n    coroutineContext[Job]!!.invokeOnCompletion {\n        deferred?.cancel()\n    }\n\n    // ensure sequential invoking\n    val listeners: MutableList<Pair<T.(String) -> Boolean, MessageListener<T, Any?>>> = mutableListOf()\n    val defaultListeners: MutableList<MessageListener<T, Any?>> = mutableListOf()\n\n    if (isUnit) {\n        // https://youtrack.jetbrains.com/issue/KT-37716\n        val outside = { filter: T.(String) -> Boolean, listener: MessageListener<T, Any?> ->\n            listeners += filter to listener\n        }\n        object : MessageSelectBuilderUnit<T, R>(\n            this@selectMessagesImpl,\n            SELECT_MESSAGE_STUB,\n            outside\n        ) {\n            override fun obtainCurrentCoroutineScope(): CoroutineScope = this@withSilentTimeoutOrCoroutineScope\n            override fun obtainCurrentDeferred(): CompletableDeferred<R>? = deferred\n            override fun default(onEvent: MessageListener<T, R>) {\n                defaultListeners += onEvent\n            }\n        }\n    } else {\n        // https://youtrack.jetbrains.com/issue/KT-37716\n        val outside = { filter: T.(String) -> Boolean, listener: MessageListener<T, Any?> ->\n            listeners += filter to listener\n        }\n        object : MessageSelectBuilder<T, R>(\n            this@selectMessagesImpl,\n            SELECT_MESSAGE_STUB,\n            outside\n        ) {\n            override fun obtainCurrentCoroutineScope(): CoroutineScope = this@withSilentTimeoutOrCoroutineScope\n            override fun obtainCurrentDeferred(): CompletableDeferred<R>? = deferred\n            override fun default(onEvent: MessageListener<T, R>) {\n                defaultListeners += onEvent\n            }\n        }\n    }.apply(selectBuilder)\n\n    // we don't have any way to reduce duplication yet,\n    // until local functions are supported in inline functions\n    @Suppress(\"DuplicatedCode\") val subscribeAlways = globalEventChannel().subscribeAlways<T>(\n        concurrency = ConcurrencyKind.LOCKED,\n        priority = priority\n    ) { event ->\n        if (filterContext && !this.isContextIdenticalWith(this@selectMessagesImpl))\n            return@subscribeAlways\n\n        val toString = event.message.contentToString()\n        listeners.forEach { (filter, listener) ->\n            if (deferred?.isCompleted == true || !isActive)\n                return@subscribeAlways\n\n            if (filter.invoke(event, toString)) {\n                // same to the one below\n                val value = listener.invoke(event, toString)\n                if (value !== SELECT_MESSAGE_STUB) {\n                    @Suppress(\"UNCHECKED_CAST\")\n                    deferred?.complete(value as R)\n                    return@subscribeAlways\n                } else if (isUnit) { // value === stub\n                    // unit mode: we can directly complete this selection\n                    @Suppress(\"UNCHECKED_CAST\")\n                    deferred?.complete(Unit as R)\n                }\n            }\n        }\n        defaultListeners.forEach { listener ->\n            // same to the one above\n            val value = listener.invoke(event, toString)\n            if (value !== SELECT_MESSAGE_STUB) {\n                @Suppress(\"UNCHECKED_CAST\")\n                deferred?.complete(value as R)\n                return@subscribeAlways\n            } else if (isUnit) { // value === stub\n                // unit mode: we can directly complete this selection\n                @Suppress(\"UNCHECKED_CAST\")\n                deferred?.complete(Unit as R)\n            }\n        }\n    }\n\n    deferred!!.await().also {\n        subscribeAlways.complete()\n        deferred = null\n        coroutineContext.cancelChildren()\n    }\n}\n\n@Suppress(\"unused\")\n@PublishedApi\ninternal suspend inline fun <reified T : MessageEvent> T.whileSelectMessagesImpl(\n    timeoutMillis: Long,\n    filterContext: Boolean,\n    priority: EventPriority,\n    crossinline selectBuilder: @MessageDsl MessageSelectBuilder<T, Boolean>.() -> Unit\n): Unit = withSilentTimeoutOrCoroutineScope(timeoutMillis) {\n    var deferred: CompletableDeferred<Boolean>? = CompletableDeferred()\n    coroutineContext[Job]!!.invokeOnCompletion {\n        deferred?.cancel()\n    }\n\n    // ensure sequential invoking\n    val listeners: MutableList<Pair<T.(String) -> Boolean, MessageListener<T, Any?>>> = mutableListOf()\n    val defaultListeners: MutableList<MessageListener<T, Any?>> = mutableListOf()\n\n    // https://youtrack.jetbrains.com/issue/KT-37716\n    val outside = { filter: T.(String) -> Boolean, listener: MessageListener<T, Any?> ->\n        listeners += filter to listener\n    }\n    object : MessageSelectBuilder<T, Boolean>(\n        this@whileSelectMessagesImpl,\n        SELECT_MESSAGE_STUB,\n        outside\n    ) {\n        override fun obtainCurrentCoroutineScope(): CoroutineScope = this@withSilentTimeoutOrCoroutineScope\n        override fun obtainCurrentDeferred(): CompletableDeferred<Boolean>? = deferred\n        override fun default(onEvent: MessageListener<T, Boolean>) {\n            defaultListeners += onEvent\n        }\n    }.apply(selectBuilder)\n\n    // ensure atomic completing\n    val subscribeAlways = globalEventChannel().subscribeAlways<T>(\n        concurrency = ConcurrencyKind.LOCKED,\n        priority = priority\n    ) { event ->\n        if (filterContext && !this.isContextIdenticalWith(this@whileSelectMessagesImpl))\n            return@subscribeAlways\n\n        val toString = event.message.contentToString()\n        listeners.forEach { (filter, listener) ->\n            if (deferred?.isCompleted != false || !isActive)\n                return@subscribeAlways\n\n            if (filter.invoke(event, toString)) {\n                listener.invoke(event, toString).let { value ->\n                    if (value !== SELECT_MESSAGE_STUB) {\n                        deferred?.complete(value as Boolean)\n                        return@subscribeAlways // accept the first value only\n                    }\n                }\n            }\n        }\n        defaultListeners.forEach { listener ->\n            listener.invoke(event, toString).let { value ->\n                if (value !== SELECT_MESSAGE_STUB) {\n                    deferred?.complete(value as Boolean)\n                    return@subscribeAlways // accept the first value only\n                }\n            }\n        }\n    }\n\n    while (deferred?.await() == true) {\n        deferred = CompletableDeferred()\n    }\n    subscribeAlways.complete()\n    deferred = null\n    coroutineContext.cancelChildren()\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/event/subscribeMessages.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"SubscribeMessagesKt\")\n@file:Suppress(\"EXPERIMENTAL_API_USAGE\", \"MemberVisibilityCanBePrivate\", \"unused\")\n\npackage net.mamoe.mirai.event\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.OtherClient\nimport net.mamoe.mirai.contact.Stranger\nimport net.mamoe.mirai.contact.User\nimport net.mamoe.mirai.event.ConcurrencyKind.CONCURRENT\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.message.data.content\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\npublic typealias MessageEventSubscribersBuilder = MessageSubscribersBuilder<MessageEvent, Listener<MessageEvent>, Unit, Unit>\n\n/**\n * 通过 DSL 订阅来自所有 [Bot] 的所有联系人的消息事件.\n *\n * ```\n * eventChannel.subscribeMessages {\n *     \"test\" {\n *         // 当消息内容为 \"test\" 时执行\n *         // this: MessageEvent\n *         reply(\"test!\")\n *     }\n *\n *     \"Hello\" reply \"Hi\" // 当消息内容为 \"Hello\" 时回复 \"Hi\"\n *     \"quote me\" quoteReply \"ok\" // 当消息内容为 \"quote me\" 时引用该消息并回复 \"ok\"\n *     \"quote me2\" quoteReply {\n *         // lambda 也是允许的：\n *         // 返回值接受 Any?\n *         // 为 Unit 时不发送任何内容；\n *         // 为 Message 时直接发送；\n *         // 为 String 时发送为 PlainText；\n *         // 否则 toString 并发送为 PlainText\n *\n *         \"ok\"\n *     }\n *\n *     case(\"iGNorECase\", ignoreCase=true) reply \"OK\" // 忽略大小写\n *     startsWith(\"-\") reply { cmd ->\n *         // 当消息内容以 \"-\" 开头时执行\n *         // cmd 为消息去除开头 \"-\" 的内容\n *     }\n *\n *\n *     val listener: Listener<MessageEvent> = \"1\" reply \"2\"\n *     // 每个语句都会被注册为事件监听器，可以这样获取监听器\n *\n *     listener.complete() // 停止 \"1\" reply \"2\" 这个事件监听\n * }\n * ```\n *\n * @see EventChannel.subscribe 事件监听基础\n * @see EventChannel 事件通道\n *\n * @see subscribeFriendMessages\n * @see subscribeGroupMessages\n * @see subscribeGroupTempMessages\n * @see subscribeOtherClientMessages\n * @see subscribeStrangerMessages\n */\npublic fun <R> EventChannel<*>.subscribeMessages(\n    coroutineContext: CoroutineContext = EmptyCoroutineContext,\n    concurrencyKind: ConcurrencyKind = CONCURRENT,\n    priority: EventPriority = EventPriority.MONITOR,\n    listeners: MessageEventSubscribersBuilder.() -> R\n): R {\n    contract { callsInPlace(listeners, InvocationKind.EXACTLY_ONCE) }\n    return createBuilder(::MessageEventSubscribersBuilder, coroutineContext, concurrencyKind, priority).run(listeners)\n}\n\npublic typealias GroupMessageSubscribersBuilder = MessageSubscribersBuilder<GroupMessageEvent, Listener<GroupMessageEvent>, Unit, Unit>\n\n/**\n * 通过 DSL 订阅来自所有 [Bot] 的所有群会话消息事件. DSL 语法查看 [subscribeMessages].\n *\n * @see EventChannel.subscribe 事件监听基础\n * @see EventChannel 事件通道\n */\npublic fun <R> EventChannel<*>.subscribeGroupMessages(\n    coroutineContext: CoroutineContext = EmptyCoroutineContext,\n    concurrencyKind: ConcurrencyKind = CONCURRENT,\n    priority: EventPriority = EventPriority.MONITOR,\n    listeners: GroupMessageSubscribersBuilder.() -> R\n): R {\n    contract { callsInPlace(listeners, InvocationKind.EXACTLY_ONCE) }\n    return createBuilder(::GroupMessageSubscribersBuilder, coroutineContext, concurrencyKind, priority).run(listeners)\n}\n\npublic typealias FriendMessageSubscribersBuilder = MessageSubscribersBuilder<FriendMessageEvent, Listener<FriendMessageEvent>, Unit, Unit>\n\n/**\n * 通过 DSL 订阅来自所有 [Bot] 的所有好友消息事件. DSL 语法查看 [subscribeMessages].\n *\n * @see EventChannel.subscribe 事件监听基础\n * @see EventChannel 事件通道\n */\npublic fun <R> EventChannel<*>.subscribeFriendMessages(\n    coroutineContext: CoroutineContext = EmptyCoroutineContext,\n    concurrencyKind: ConcurrencyKind = CONCURRENT,\n    priority: EventPriority = EventPriority.MONITOR,\n    listeners: FriendMessageSubscribersBuilder.() -> R\n): R {\n    contract { callsInPlace(listeners, InvocationKind.EXACTLY_ONCE) }\n    return createBuilder(::FriendMessageSubscribersBuilder, coroutineContext, concurrencyKind, priority).run(listeners)\n}\n\n/**\n * @since 2.7\n */\npublic typealias UserMessageSubscribersBuilder = MessageSubscribersBuilder<UserMessageEvent, Listener<UserMessageEvent>, Unit, Unit>\n\n/**\n * 通过 DSL 订阅来自所有 [Bot] 的所 [User] 消息事件. DSL 语法查看 [subscribeMessages].\n *\n * @see EventChannel.subscribe 事件监听基础\n * @see EventChannel 事件通道\n *\n * @since 2.7\n */\npublic fun <R> EventChannel<*>.subscribeUserMessages(\n    coroutineContext: CoroutineContext = EmptyCoroutineContext,\n    concurrencyKind: ConcurrencyKind = CONCURRENT,\n    priority: EventPriority = EventPriority.MONITOR,\n    listeners: UserMessageSubscribersBuilder.() -> R\n): R {\n    contract { callsInPlace(listeners, InvocationKind.EXACTLY_ONCE) }\n    return createBuilder(::UserMessageSubscribersBuilder, coroutineContext, concurrencyKind, priority).run(listeners)\n}\n\n@Deprecated(\n    \"mirai 正计划支持其他渠道发起的临时会话, 届时此定义会变动. 请使用 GroupTempMessageSubscribersBuilder\",\n    ReplaceWith(\n        \"GroupTempMessageSubscribersBuilder\",\n        \"net.mamoe.mirai.event.GroupTempMessageSubscribersBuilder\"\n    ),\n    DeprecationLevel.HIDDEN\n)\n@DeprecatedSinceMirai(hiddenSince = \"2.0\") // maybe 2.0\npublic typealias TempMessageSubscribersBuilder = MessageSubscribersBuilder<GroupTempMessageEvent, Listener<GroupTempMessageEvent>, Unit, Unit>\n\n/**\n * 通过 DSL 订阅来自所有 [Bot] 的所有临时会话消息事件. DSL 语法查看 [subscribeMessages].\n *\n * @see EventChannel.subscribe 事件监听基础\n * @see EventChannel 事件通道\n */\n@Deprecated(\n    \"mirai 正计划支持其他渠道发起的临时会话, 届时此方法会变动. 请使用 subscribeGroupTempMessages\",\n    ReplaceWith(\n        \"subscribeGroupTempMessages(coroutineContext, concurrencyKind, priority, listeners)\",\n        \"net.mamoe.mirai.event.subscribeGroupTempMessages\"\n    ),\n    DeprecationLevel.HIDDEN\n)\n@DeprecatedSinceMirai(hiddenSince = \"2.0\") // maybe 2.0\npublic fun <R> EventChannel<*>.subscribeTempMessages(\n    coroutineContext: CoroutineContext = EmptyCoroutineContext,\n    concurrencyKind: ConcurrencyKind = CONCURRENT,\n    priority: EventPriority = EventPriority.MONITOR,\n    listeners: GroupTempMessageSubscribersBuilder.() -> R\n): R = subscribeGroupTempMessages(coroutineContext, concurrencyKind, priority, listeners)\n\npublic typealias GroupTempMessageSubscribersBuilder = MessageSubscribersBuilder<GroupTempMessageEvent, Listener<GroupTempMessageEvent>, Unit, Unit>\n\n/**\n * 通过 DSL 订阅来自所有 [Bot] 的所有 [GroupTempMessageEvent]. DSL 语法查看 [subscribeMessages].\n *\n * @see EventChannel.subscribe 事件监听基础\n * @see EventChannel 事件通道\n */\npublic fun <R> EventChannel<*>.subscribeGroupTempMessages(\n    coroutineContext: CoroutineContext = EmptyCoroutineContext,\n    concurrencyKind: ConcurrencyKind = CONCURRENT,\n    priority: EventPriority = EventPriority.MONITOR,\n    listeners: GroupTempMessageSubscribersBuilder.() -> R\n): R {\n    contract { callsInPlace(listeners, InvocationKind.EXACTLY_ONCE) }\n    return createBuilder(::GroupTempMessageSubscribersBuilder, coroutineContext, concurrencyKind, priority)\n        .run(listeners)\n}\n\n\npublic typealias StrangerMessageSubscribersBuilder = MessageSubscribersBuilder<StrangerMessageEvent, Listener<StrangerMessageEvent>, Unit, Unit>\n\n/**\n * 通过 DSL 订阅来自所有 [Bot] 的所有 [Stranger] 消息事件. DSL 语法查看 [subscribeMessages].\n *\n * @see EventChannel.subscribe 事件监听基础\n * @see EventChannel 事件通道\n */\npublic fun <R> EventChannel<*>.subscribeStrangerMessages(\n    coroutineContext: CoroutineContext = EmptyCoroutineContext,\n    concurrencyKind: ConcurrencyKind = CONCURRENT,\n    priority: EventPriority = EventPriority.MONITOR,\n    listeners: StrangerMessageSubscribersBuilder.() -> R\n): R {\n    contract { callsInPlace(listeners, InvocationKind.EXACTLY_ONCE) }\n    return createBuilder(::StrangerMessageSubscribersBuilder, coroutineContext, concurrencyKind, priority)\n        .run(listeners)\n}\n\n\npublic typealias OtherClientMessageSubscribersBuilder = MessageSubscribersBuilder<OtherClientMessageEvent, Listener<OtherClientMessageEvent>, Unit, Unit>\n\n/**\n * 通过 DSL 订阅来自所有 [Bot] 的所有 [OtherClient] 消息事件. DSL 语法查看 [subscribeMessages].\n *\n * @see EventChannel.subscribe 事件监听基础\n * @see EventChannel 事件通道\n */\npublic fun <R> EventChannel<*>.subscribeOtherClientMessages(\n    coroutineContext: CoroutineContext = EmptyCoroutineContext,\n    concurrencyKind: ConcurrencyKind = CONCURRENT,\n    priority: EventPriority = EventPriority.MONITOR,\n    listeners: OtherClientMessageSubscribersBuilder.() -> R\n): R {\n    contract { callsInPlace(listeners, InvocationKind.EXACTLY_ONCE) }\n    return createBuilder(::OtherClientMessageSubscribersBuilder, coroutineContext, concurrencyKind, priority)\n        .run(listeners)\n}\n\nprivate typealias MessageSubscriberBuilderConstructor<E> = (\n    Unit,\n    (E.(String) -> Boolean, MessageListener<E, Unit>) -> Listener<E>\n) -> MessageSubscribersBuilder<E, Listener<E>, Unit, Unit>\n\nprivate inline fun <reified E : MessageEvent> EventChannel<*>.createBuilder(\n    constructor: MessageSubscriberBuilderConstructor<E>,\n    coroutineContext: CoroutineContext,\n    concurrencyKind: ConcurrencyKind,\n    priority: EventPriority\n): MessageSubscribersBuilder<E, Listener<E>, Unit, Unit> = constructor(Unit) { filter, listener ->\n    subscribeAlways(coroutineContext, concurrencyKind, priority) {\n        val toString = this.message.content\n        if (filter(this, toString))\n            listener(this, toString)\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/internal/event/JvmMethodListenersInternal.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.event\n\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.withContext\nimport net.mamoe.mirai.event.*\nimport net.mamoe.mirai.utils.EventListenerLikeJava\nimport net.mamoe.mirai.utils.castOrNull\nimport java.lang.reflect.Method\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.reflect.KClass\nimport kotlin.reflect.full.IllegalCallableAccessException\nimport kotlin.reflect.full.callSuspend\nimport kotlin.reflect.full.isSubclassOf\nimport kotlin.reflect.jvm.isAccessible\nimport kotlin.reflect.jvm.kotlinFunction\n\ninternal object JvmMethodListenersInternal {\n\n    private fun isKotlinFunction(method: Method): Boolean {\n\n        if (method.getDeclaredAnnotation(EventListenerLikeJava::class.java) != null) return false\n        if (method.declaringClass.getDeclaredAnnotation(EventListenerLikeJava::class.java) != null) return false\n\n        @Suppress(\"RemoveRedundantQualifierName\") // for strict\n        return method.declaringClass.getDeclaredAnnotation(Metadata::class.java) != null\n    }\n\n    @Suppress(\"UNCHECKED_CAST\")\n    internal fun registerEventHandler(\n        method: Method,\n        owner: Any,\n        eventChannel: EventChannel<*>,\n        annotation: EventHandler,\n        coroutineContext: CoroutineContext,\n    ): Listener<Event> {\n        method.isAccessible = true\n        val kotlinFunction = kotlin.runCatching { method.kotlinFunction }.getOrNull()\n        return if (kotlinFunction != null && isKotlinFunction(method)) {\n            // kotlin functions\n\n            val param = kotlinFunction.parameters\n            when (param.size) {\n                3 -> { // ownerClass, receiver, event\n                    check(param[1].type == param[2].type) { \"Illegal kotlin function ${kotlinFunction.name}. Receiver and param must have same type\" }\n                    check((param[1].type.classifier as? KClass<*>)?.isSubclassOf(Event::class) == true) {\n                        \"Illegal kotlin function ${kotlinFunction.name}. First param or receiver must be subclass of Event, but found ${param[1].type.classifier}\"\n                    }\n                }\n\n                2 -> { // ownerClass, event\n                    check((param[1].type.classifier as? KClass<*>)?.isSubclassOf(Event::class) == true) {\n                        \"Illegal kotlin function ${kotlinFunction.name}. First param or receiver must be subclass of Event, but found ${param[1].type.classifier}\"\n                    }\n                }\n\n                else -> error(\"function ${kotlinFunction.name} must have one Event param\")\n            }\n            lateinit var listener: Listener<*>\n            kotlin.runCatching {\n                kotlinFunction.isAccessible = true\n            }\n            suspend fun callFunction(event: Event): Any? {\n                try {\n                    return when (param.size) {\n                        3 -> {\n                            if (kotlinFunction.isSuspend) {\n                                kotlinFunction.callSuspend(owner, event, event)\n                            } else withContext(Dispatchers.IO) { // for safety\n                                kotlinFunction.call(owner, event, event)\n                            }\n\n                        }\n\n                        2 -> {\n                            if (kotlinFunction.isSuspend) {\n                                kotlinFunction.callSuspend(owner, event)\n                            } else withContext(Dispatchers.IO) { // for safety\n                                kotlinFunction.call(owner, event)\n                            }\n                        }\n\n                        else -> error(\"stub\")\n                    }\n                } catch (e: IllegalCallableAccessException) {\n                    listener.completeExceptionally(e)\n                    return ListeningStatus.STOPPED\n                } catch (e: Throwable) {\n                    throw ExceptionInEventHandlerException(event, cause = e)\n                }\n            }\n            require(!kotlinFunction.returnType.isMarkedNullable) {\n                \"Kotlin event handlers cannot have nullable return type.\"\n            }\n            require(kotlinFunction.parameters.none { it.type.isMarkedNullable }) {\n                \"Kotlin event handlers cannot have nullable parameter type.\"\n            }\n            when (kotlinFunction.returnType.classifier) {\n                Unit::class, Nothing::class -> {\n                    eventChannel.subscribeAlways(\n                        param[1].type.classifier as KClass<out Event>,\n                        coroutineContext,\n                        annotation.concurrency,\n                        annotation.priority\n                    ) {\n                        if (annotation.ignoreCancelled) {\n                            if ((this as? CancellableEvent)?.isCancelled != true) {\n                                callFunction(this)\n                            }\n                        } else callFunction(this)\n                    }.also { listener = it }\n                }\n\n                ListeningStatus::class -> {\n                    eventChannel.subscribe(\n                        param[1].type.classifier as KClass<out Event>,\n                        coroutineContext,\n                        annotation.concurrency,\n                        annotation.priority\n                    ) {\n                        if (annotation.ignoreCancelled) {\n                            if ((this as? CancellableEvent)?.isCancelled != true) {\n                                callFunction(this) as ListeningStatus\n                            } else ListeningStatus.LISTENING\n                        } else callFunction(this) as ListeningStatus\n                    }.also { listener = it }\n                }\n\n                else -> error(\"Illegal method return type. Required Void, Nothing or ListeningStatus, found ${kotlinFunction.returnType.classifier}\")\n            }\n        } else {\n            // java methods\n\n            val paramType = method.parameterTypes[0]\n            check(method.parameterTypes.size == 1 && Event::class.java.isAssignableFrom(paramType)) {\n                \"Illegal method parameter. Required one exact Event subclass. found ${method.parameterTypes.contentToString()}\"\n            }\n            suspend fun callMethod(event: Event): Any? {\n                fun Method.invokeWithErrorReport(self: Any?, vararg args: Any?): Any? = try {\n                    invoke(self, *args)\n                } catch (exception: IllegalArgumentException) {\n                    throw IllegalArgumentException(\n                        \"Internal Error: $exception, method=${this}, this=$self, arguments=$args, please report to https://github.com/mamoe/mirai\",\n                        exception\n                    )\n                } catch (e: Throwable) {\n                    throw ExceptionInEventHandlerException(event, cause = e)\n                }\n\n\n                return if (annotation.ignoreCancelled) {\n                    if (event.castOrNull<CancellableEvent>()?.isCancelled != true) {\n                        withContext(Dispatchers.IO) {\n                            method.invokeWithErrorReport(owner, event)\n                        }\n                    } else ListeningStatus.LISTENING\n                } else withContext(Dispatchers.IO) {\n                    method.invokeWithErrorReport(owner, event)\n                }\n            }\n\n            when (method.returnType) {\n                Void::class.java, Void.TYPE, Nothing::class.java -> {\n                    eventChannel.subscribeAlways(\n                        paramType.kotlin as KClass<out Event>,\n                        coroutineContext,\n                        annotation.concurrency,\n                        annotation.priority\n                    ) {\n                        callMethod(this)\n                    }\n                }\n\n                ListeningStatus::class.java -> {\n                    eventChannel.subscribe(\n                        paramType.kotlin as KClass<out Event>,\n                        coroutineContext,\n                        annotation.concurrency,\n                        annotation.priority\n                    ) {\n                        callMethod(this) as ListeningStatus?\n                            ?: error(\"Java method EventHandler cannot return `null`: $this\")\n                    }\n                }\n\n                else -> error(\"Illegal method return type. Required Void or ListeningStatus, but found ${method.returnType.canonicalName}\")\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/internal/event/VerboseEvent.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.event\n\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n/**\n * 标记一个事件过于冗长, 默认不显示\n */\n@MiraiInternalApi\npublic interface VerboseEvent // May be public?\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/internal/event/messageSubscribersInternal.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.event\n\nimport net.mamoe.mirai.event.MessageDsl\nimport net.mamoe.mirai.event.MessageListener\nimport net.mamoe.mirai.event.MessageSubscribersBuilder\nimport net.mamoe.mirai.event.events.MessageEvent\n\n\n/*\n * 将 internal 移出 MessageSubscribersBuilder.kt 以减小其体积\n */\n\n@MessageDsl\ninternal fun <M : MessageEvent, Ret, R : RR, RR> MessageSubscribersBuilder<M, Ret, R, RR>.content(\n    filter: M.(String) -> Boolean,\n    onEvent: MessageListener<M, RR>\n): Ret =\n    subscriber(filter) { onEvent(this, it) }\n\ninternal fun <M : MessageEvent, Ret, R : RR, RR> MessageSubscribersBuilder<M, Ret, R, RR>.endsWithImpl(\n    suffix: String,\n    removeSuffix: Boolean = true,\n    trim: Boolean = true,\n    onEvent: @MessageDsl suspend M.(String) -> R\n): Ret {\n    return if (trim) {\n        val toCheck = suffix.trimEnd()\n        content({ it.trimEnd().endsWith(toCheck) }) {\n            if (removeSuffix) this.onEvent(this.message.contentToString().removeSuffix(toCheck).trim())\n            else onEvent(this, this.message.contentToString().trim())\n        }\n    } else {\n        content({ it.endsWith(suffix) }) {\n            if (removeSuffix) this.onEvent(this.message.contentToString().removeSuffix(suffix))\n            else onEvent(this, this.message.contentToString())\n        }\n    }\n}\n\ninternal fun <M : MessageEvent, Ret, R : RR, RR> MessageSubscribersBuilder<M, Ret, R, RR>.startsWithImpl(\n    prefix: String,\n    removePrefix: Boolean = true,\n    trim: Boolean = true,\n    onEvent: @MessageDsl suspend M.(String) -> R\n): Ret {\n    return if (trim) {\n        val toCheck = prefix.trimStart()\n        content({ it.trimStart().startsWith(toCheck) }) {\n            if (removePrefix) this.onEvent(this.message.contentToString().substringAfter(toCheck).trim())\n            else onEvent(this, this.message.contentToString().trim())\n        }\n    } else content({ it.startsWith(prefix) }) {\n        if (removePrefix) this.onEvent(this.message.contentToString().removePrefix(prefix))\n        else onEvent(this, this.message.contentToString())\n    }\n}\n\ninternal fun <M : MessageEvent, Ret, R : RR, RR> MessageSubscribersBuilder<M, Ret, R, RR>.containsAllImpl(\n    sub: Array<out String>,\n    ignoreCase: Boolean = false,\n    trim: Boolean = true\n): MessageSubscribersBuilder<M, Ret, R, RR>.ListeningFilter =\n    if (trim) {\n        val list = sub.map { it.trim() }\n        content { list.all { toCheck -> it.contains(toCheck, ignoreCase = ignoreCase) } }\n    } else {\n        content { sub.all { toCheck -> it.contains(toCheck, ignoreCase = ignoreCase) } }\n    }\n\ninternal fun <M : MessageEvent, Ret, R : RR, RR> MessageSubscribersBuilder<M, Ret, R, RR>.containsAnyImpl(\n    vararg sub: String,\n    ignoreCase: Boolean = false,\n    trim: Boolean = true\n): MessageSubscribersBuilder<M, Ret, R, RR>.ListeningFilter =\n    if (trim) {\n        val list = sub.map { it.trim() }\n        content { list.any { toCheck -> it.contains(toCheck, ignoreCase = ignoreCase) } }\n    } else content { sub.any { toCheck -> it.contains(toCheck, ignoreCase = ignoreCase) } }\n\ninternal fun <M : MessageEvent, Ret, R : RR, RR> MessageSubscribersBuilder<M, Ret, R, RR>.caseImpl(\n    equals: String,\n    ignoreCase: Boolean = false,\n    trim: Boolean = true\n): MessageSubscribersBuilder<M, Ret, R, RR>.ListeningFilter {\n    return if (trim) {\n        val toCheck = equals.trim()\n        content { it.trim().equals(toCheck, ignoreCase = ignoreCase) }\n    } else {\n        content { it.equals(equals, ignoreCase = ignoreCase) }\n    }\n}\n\ninternal fun <M : MessageEvent, Ret, R : RR, RR> MessageSubscribersBuilder<M, Ret, R, RR>.containsImpl(\n    sub: String,\n    ignoreCase: Boolean = false,\n    trim: Boolean = true,\n    onEvent: MessageListener<M, R>\n): Ret {\n    return if (trim) {\n        val toCheck = sub.trim()\n        content({ it.contains(toCheck, ignoreCase = ignoreCase) }) {\n            onEvent(this, this.message.contentToString().trim())\n        }\n    } else {\n        content({ it.contains(sub, ignoreCase = ignoreCase) }) {\n            onEvent(this, this.message.contentToString())\n        }\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/internal/message/AbstractPolymorphicSerializer.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ExperimentalSerializationApi::class)\n\npackage net.mamoe.mirai.internal.message\n\nimport kotlinx.serialization.*\nimport kotlinx.serialization.encoding.*\nimport net.mamoe.mirai.utils.cast\nimport kotlin.jvm.JvmName\nimport kotlin.reflect.KClass\n\ninternal abstract class AbstractPolymorphicSerializer<T : Any> internal constructor() : KSerializer<T> {\n\n    /**\n     * Base class for all classes that this polymorphic serializer can serialize or deserialize.\n     */\n    abstract val baseClass: KClass<T>\n\n    final override fun serialize(encoder: Encoder, value: T) {\n        val actualSerializer = findPolymorphicSerializer(encoder, value)\n        encoder.encodeStructure(descriptor) {\n            encodeStringElement(descriptor, 0, actualSerializer.descriptor.serialName)\n            encodeSerializableElement(descriptor, 1, actualSerializer.cast(), value)\n        }\n    }\n\n    final override fun deserialize(decoder: Decoder): T = decoder.decodeStructure(descriptor) {\n        var klassName: String? = null\n        var value: Any? = null\n        if (decodeSequentially()) {\n            return@decodeStructure decodeSequentially(this)\n        }\n\n        mainLoop@ while (true) {\n            when (val index = decodeElementIndex(descriptor)) {\n                CompositeDecoder.DECODE_DONE -> {\n                    break@mainLoop\n                }\n                0 -> {\n                    klassName = decodeStringElement(descriptor, index)\n                }\n                1 -> {\n                    klassName = requireNotNull(klassName) { \"Cannot read polymorphic value before its type token\" }\n                    val serializer = findPolymorphicSerializer(this, klassName)\n                    value = decodeSerializableElement(descriptor, index, serializer)\n                }\n                else -> throw SerializationException(\n                    \"Invalid index in polymorphic deserialization of \" +\n                            (klassName ?: \"unknown class\") +\n                            \"\\n Expected 0, 1 or DECODE_DONE(-1), but found $index\"\n                )\n            }\n        }\n        @Suppress(\"UNCHECKED_CAST\")\n        requireNotNull(value) { \"Polymorphic value has not been read for class $klassName\" } as T\n    }\n\n    private fun decodeSequentially(compositeDecoder: CompositeDecoder): T {\n        val klassName = compositeDecoder.decodeStringElement(descriptor, 0)\n        val serializer = findPolymorphicSerializer(compositeDecoder, klassName)\n        return compositeDecoder.decodeSerializableElement(descriptor, 1, serializer)\n    }\n\n    /**\n     * Lookups an actual serializer for given [klassName] withing the current [base class][baseClass].\n     * May use context from the [decoder].\n     */\n    open fun findPolymorphicSerializerOrNull(\n        decoder: CompositeDecoder,\n        klassName: String?\n    ): DeserializationStrategy<T>? = decoder.serializersModule.getPolymorphic(baseClass, klassName)\n\n\n    /**\n     * Lookups an actual serializer for given [value] within the current [base class][baseClass].\n     * May use context from the [encoder].\n     */\n    open fun findPolymorphicSerializerOrNull(\n        encoder: Encoder,\n        value: T\n    ): SerializationStrategy<T>? =\n        encoder.serializersModule.getPolymorphic(baseClass, value)\n}\n\n\ninternal fun <T : Any> AbstractPolymorphicSerializer<T>.findPolymorphicSerializer(\n    decoder: CompositeDecoder,\n    klassName: String?\n): DeserializationStrategy<T> =\n    findPolymorphicSerializerOrNull(decoder, klassName) ?: throwSubtypeNotRegistered(klassName, baseClass)\n\ninternal fun <T : Any> AbstractPolymorphicSerializer<T>.findPolymorphicSerializer(\n    encoder: Encoder,\n    value: T\n): SerializationStrategy<T> =\n    findPolymorphicSerializerOrNull(encoder, value) ?: throwSubtypeNotRegistered(value::class, baseClass)\n\n@JvmName(\"throwSubtypeNotRegistered\")\ninternal fun throwSubtypeNotRegistered(subClassName: String?, baseClass: KClass<*>): Nothing {\n    val scope = \"in the scope of '${baseClass.simpleName}'\"\n    throw SerializationException(\n        if (subClassName == null)\n            \"Class discriminator was missing and no default polymorphic serializers were registered $scope\"\n        else\n            \"Class '$subClassName' is not registered for polymorphic serialization $scope.\\n\" +\n                    \"Mark the base class as 'sealed' or register the serializer explicitly.\"\n    )\n}\n\n@JvmName(\"throwSubtypeNotRegistered\")\ninternal fun throwSubtypeNotRegistered(subClass: KClass<*>, baseClass: KClass<*>): Nothing =\n    throwSubtypeNotRegistered(subClass.simpleName ?: \"$subClass\", baseClass)\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/internal/message/MessageSerializersImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.message\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.descriptors.buildClassSerialDescriptor\nimport kotlinx.serialization.modules.SerializersModule\nimport kotlinx.serialization.modules.overwriteWith\nimport kotlinx.serialization.modules.polymorphic\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.message.MessageSerializers\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.MessageSource\nimport net.mamoe.mirai.message.data.MessageSourceKind\nimport net.mamoe.mirai.message.data.SingleMessage\nimport net.mamoe.mirai.utils.*\nimport kotlin.reflect.KClass\nimport kotlin.reflect.full.allSuperclasses\nimport kotlin.reflect.full.isSubclassOf\n\n@MiraiInternalApi\npublic open class MessageSourceSerializerImpl(serialName: String) :\n    KSerializer<MessageSource> by SerialData.serializer().map(\n        resultantDescriptor = buildClassSerialDescriptor(serialName) {\n            takeElementsFrom(SerialData.serializer().descriptor)\n        },\n        serialize = {\n            SerialData(kind, botId, ids, internalIds, time, fromId, targetId, originalMessage)\n        },\n        deserialize = {\n            Mirai.constructMessageSource(botId, kind, fromId, targetId, ids, time, internalIds, originalMessage)\n        }\n    ) {\n\n    @MiraiInternalApi\n    public companion object {\n        public fun serialDataSerializer(): KSerializer<*> = SerialData.serializer()\n    }\n\n    @SerialName(MessageSource.SERIAL_NAME)\n    @Serializable\n    internal class SerialData(\n        val kind: MessageSourceKind,\n        val botId: Long,\n        val ids: IntArray,\n        val internalIds: IntArray,\n        val time: Int,\n        val fromId: Long,\n        val targetId: Long,\n        val originalMessage: MessageChain,\n    )\n}\n\n\n// Tests:\n// net.mamoe.mirai.internal.message.data.MessageSerializationTest\n@OptIn(MiraiExperimentalApi::class)\ninternal object MessageSerializersImpl : MessageSerializers {\n    private var serializersModuleField: SerializersModule by lateinitMutableProperty {\n        SerializersModule { }\n    }\n\n    override val serializersModule: SerializersModule\n        get() {\n            Mirai // ensure registered, for tests\n            return serializersModuleField\n        }\n\n    @Synchronized\n    override fun <M : SingleMessage> registerSerializer(type: KClass<M>, serializer: KSerializer<M>) {\n        serializersModuleField = serializersModule.overwritePolymorphicWith(type, serializer)\n    }\n\n    @Synchronized\n    override fun registerSerializers(serializersModule: SerializersModule) {\n        serializersModuleField = this.serializersModule.overwriteWith(serializersModule)\n    }\n}\n\ninternal fun <M : Any> SerializersModule.overwritePolymorphicWith(\n    type: KClass<M>,\n    serializer: KSerializer<M>\n): SerializersModule {\n    return overwriteWith(SerializersModule {\n        // contextual(type, serializer)\n        for (superclass in type.allSuperclasses) {\n            if (superclass.isFinal) continue\n            if (!superclass.isSubclassOf(SingleMessage::class)) continue\n            @Suppress(\"UNCHECKED_CAST\")\n            polymorphic(superclass as KClass<Any>) {\n                subclass(type, serializer)\n            }\n        }\n    })\n}\n\n//private inline fun <reified M : SingleMessage> SerializersModuleBuilder.hierarchicallyPolymorphic(serializer: KSerializer<M>) =\n//    hierarchicallyPolymorphic(M::class, serializer)\n//\n//private fun <M : SingleMessage> SerializersModuleBuilder.hierarchicallyPolymorphic(\n//    type: KClass<M>,\n//    serializer: KSerializer<M>\n//) {\n//    // contextual(type, serializer)\n//    for (superclass in type.allSuperclasses) {\n//        if (superclass.isFinal) continue\n//        if (!superclass.isSubclassOf(SingleMessage::class)) continue\n//        @Suppress(\"UNCHECKED_CAST\")\n//        polymorphic(superclass as KClass<Any>) {\n//            subclass(type, serializer)\n//        }\n//    }\n//}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/internal/network/Packet.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.network\n\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n/**\n * 从服务器收到的包解析之后的结构化数据.\n * 它是一个数据包工厂的处理的返回值.\n *\n * **InternalAPI**: 这是内部 API, 它随时都有可能被修改\n */\n@MiraiInternalApi\npublic interface Packet {\n    /**\n     * 实现这个接口的包将不会被记录到日志中\n     */\n    @MiraiInternalApi\n    public interface NoLog\n\n    /**\n     * 实现这个接口的 [Event] 不会被作为事件记录到日志中\n     */\n    @MiraiInternalApi\n    public interface NoEventLog\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/internal/utils/ExternalResourceImpls.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport io.ktor.utils.io.core.Input\nimport io.ktor.utils.io.streams.*\nimport kotlinx.atomicfu.atomic\nimport kotlinx.coroutines.CompletableDeferred\nimport kotlinx.coroutines.Deferred\nimport net.mamoe.mirai.utils.*\nimport java.io.Closeable\nimport java.io.InputStream\nimport java.io.RandomAccessFile\nimport kotlin.io.use\n\n\ninternal fun InputStream.detectFileTypeAndClose(): String? {\n    val buffer = ByteArray(COUNT_BYTES_USED_FOR_DETECTING_FILE_TYPE)\n    return use {\n        kotlin.runCatching { it.read(buffer) }.onFailure { return null }\n        getFileType(buffer)\n    }\n}\n\ninternal class ExternalResourceImplByFileWithMd5(\n    private val file: RandomAccessFile,\n    override val md5: ByteArray,\n    formatName: String?\n) : ExternalResourceInternal {\n    internal class ResourceHolder(\n        @JvmField internal val file: RandomAccessFile,\n    ) : ExternalResourceHolder() {\n        override val closed: CompletableDeferred<Unit> = CompletableDeferred()\n        override fun closeImpl() {\n            file.close()\n        }\n    }\n\n    override var origin: Any? = null\n        internal set\n\n\n    override val holder: ResourceHolder = ResourceHolder(file)\n\n    override val sha1: ByteArray by lazy { inputStream().sha1() }\n    override val size: Long = file.length()\n    override val formatName: String by lazy {\n        formatName ?: inputStream().detectFileTypeAndClose() ?: ExternalResource.DEFAULT_FORMAT_NAME\n    }\n\n    override fun inputStream(): InputStream {\n        check(file.filePointer == 0L) { \"RandomAccessFile.inputStream cannot be opened simultaneously.\" }\n        return file.inputStream()\n    }\n\n    override val closed: CompletableDeferred<Unit> get() = holder.closed\n    override fun close() = holder.close()\n\n    init {\n        registerToLeakObserver(this)\n    }\n}\n\ninternal abstract class ExternalResourceHolder : Closeable {\n    /**\n     * Mirror of [ExternalResource.closed]\n     */\n    abstract val closed: Deferred<Unit>\n    val isClosed: Boolean get() = _closed.value\n    val createStackTrace: Array<StackTraceElement>? = if (isExternalResourceCreationStackEnabled) {\n        Thread.currentThread().stackTrace\n    } else null\n\n    private val _closed = atomic(false)\n    protected abstract fun closeImpl()\n    override fun close() {\n        if (!_closed.compareAndSet(false, true)) return\n        try {\n            closeImpl()\n        } finally {\n            kotlin.runCatching {\n                val closed = this.closed\n                if (closed is CompletableDeferred<Unit>) {\n                    closed.complete(Unit)\n                } else {\n                    closed.cancel()\n                }\n            }\n        }\n    }\n}\n\ninternal interface ExternalResourceInternal : ExternalResource {\n    val holder: ExternalResourceHolder\n\n    @MiraiInternalApi\n    override fun input(): Input = inputStream().asInput()\n}\n\ninternal class ExternalResourceImplByFile(\n    private val file: RandomAccessFile,\n    formatName: String?,\n    closeOriginalFileOnClose: Boolean = true,\n) : ExternalResourceInternal {\n    override var origin: Any? = null\n        internal set\n\n    internal class ResourceHolder(\n        @JvmField internal val closeOriginalFileOnClose: Boolean,\n        @JvmField internal val file: RandomAccessFile,\n    ) : ExternalResourceHolder() {\n        override val closed: CompletableDeferred<Unit> = CompletableDeferred()\n        override fun closeImpl() {\n            if (closeOriginalFileOnClose) file.close()\n        }\n    }\n\n    override val holder: ResourceHolder = ResourceHolder(\n        closeOriginalFileOnClose,\n        file,\n    )\n\n    override val size: Long = file.length()\n    override val md5: ByteArray by lazy { inputStream().md5() }\n    override val sha1: ByteArray by lazy { inputStream().sha1() }\n    override val formatName: String by lazy {\n        formatName ?: inputStream().detectFileTypeAndClose() ?: ExternalResource.DEFAULT_FORMAT_NAME\n    }\n\n    override fun inputStream(): InputStream {\n        check(file.filePointer == 0L) { \"RandomAccessFile.inputStream cannot be opened simultaneously.\" }\n        return file.inputStream()\n    }\n\n    override val closed: CompletableDeferred<Unit> get() = holder.closed\n    override fun close() = holder.close()\n\n    init {\n        registerToLeakObserver(this)\n    }\n}\n\ninternal class ExternalResourceImplByByteArray(\n    private val data: ByteArray,\n    formatName: String?\n) : ExternalResource {\n    override val size: Long = data.size.toLong()\n    override val md5: ByteArray by lazy { data.md5() }\n    override val sha1: ByteArray by lazy { data.sha1() }\n    override val formatName: String by lazy {\n        formatName ?: getFileType(data.copyOf(COUNT_BYTES_USED_FOR_DETECTING_FILE_TYPE))\n        ?: ExternalResource.DEFAULT_FORMAT_NAME\n    }\n    override val closed: CompletableDeferred<Unit> = CompletableDeferred()\n    override val origin: Any\n        get() = data//.clone()\n\n    override fun inputStream(): InputStream = data.inputStream()\n\n    @MiraiInternalApi\n    override fun input(): Input {\n        return data.inputStream().asInput()\n    }\n\n    override fun close() {\n        kotlin.runCatching { closed.complete(Unit) }\n    }\n}\n\nprivate fun RandomAccessFile.inputStream(): InputStream {\n    val file = this\n    return object : InputStream() {\n        override fun read(): Int = file.read()\n        override fun read(b: ByteArray, off: Int, len: Int): Int = file.read(b, off, len)\n        override fun close() {\n            file.seek(0)\n        }\n        // don't close file on stream.close. stream may be obtained at multiple times.\n    }.buffered()\n}\n\nprivate fun registerToLeakObserver(resource: ExternalResourceInternal) {\n    ExternalResourceLeakObserver.register(resource)\n}\n\ninternal const val isExternalResourceCreationStackEnabledName = \"mirai.resource.creation.stack.enabled\"\ninternal val isExternalResourceCreationStackEnabled by lazy {\n    systemProp(isExternalResourceCreationStackEnabledName, false)\n}\n\n/*\n * ImgType:\n *  JPG:    1000\n *  PNG:    1001\n *  WEBP:   1002\n *  BMP:    1005\n *  GIG:    2000 // gig? gif?\n *  APNG:   2001\n *  SHARPP: 1004\n */\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/internal/utils/ExternalResourceLeakObserver.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.error\nimport net.mamoe.mirai.utils.warning\nimport java.lang.ref.ReferenceQueue\nimport java.lang.ref.WeakReference\nimport java.util.concurrent.ConcurrentLinkedDeque\n\ninternal object ExternalResourceLeakObserver : Runnable {\n    private val queue = ReferenceQueue<Any>()\n    private val references = ConcurrentLinkedDeque<ERReference>()\n    private val logger by lazy {\n        MiraiLogger.Factory.create(ExternalResourceLeakObserver::class, \"ExternalResourceLeakObserver\")\n    }\n\n    internal class ERReference : WeakReference<Any> {\n        constructor(resource: ExternalResourceInternal) : super(resource, queue) {\n            this.holder = resource.holder\n        }\n\n        constructor(resource: ExternalResource, holder: ExternalResourceHolder) : super(resource, queue) {\n            this.holder = holder\n        }\n\n        @JvmField\n        internal val holder: ExternalResourceHolder\n    }\n\n    class ExternalResourceCreateStackTrace : Throwable() {\n        override fun fillInStackTrace(): Throwable {\n            return this\n        }\n    }\n\n\n    @JvmStatic\n    fun register(resource: ExternalResource) {\n        if (resource !is ExternalResourceInternal) return\n        references.add(ERReference(resource))\n    }\n\n    @JvmStatic\n    fun register(resource: ExternalResource, holder: ExternalResourceHolder) {\n        references.add(ERReference(resource, holder))\n    }\n\n    init {\n        val thread = Thread(this, \"Mirai ExternalResource Leak Observer Thread\")\n        thread.isDaemon = true\n        thread.start()\n    }\n\n    override fun run() {\n        while (true) {\n\n            try {\n                loop@\n                while (true) {\n                    val reference = queue.poll() ?: break@loop\n                    if (reference !is ERReference) {\n                        logger.warning { \"Unknown reference $reference (#${reference.javaClass}) was entered queue. Skipping\" }\n                        reference.clear()\n                        continue@loop\n                    }\n                    val holder = reference.holder\n                    reference.clear()\n                    references.remove(reference)\n                    if (holder.isClosed) {\n                        continue@loop\n                    }\n                    val stackException = holder.createStackTrace?.let { stack ->\n                        ExternalResourceCreateStackTrace().also { it.stackTrace = stack }\n                    }\n                    kotlin.runCatching { // Observer should avoid all possible errors\n                        logger.error(\n                            {\n                                \"A resource leak occurred, use ExternalResource.close to avoid it!! (holder=$holder)\" + if (isExternalResourceCreationStackEnabled) {\n                                    \"\"\n                                } else \". Add jvm option `-D$isExternalResourceCreationStackEnabledName=true` to show creation stack track\"\n                            },\n                            stackException\n                        )\n                    }\n                    try {\n                        holder.close()\n                    } catch (exceptionInClose: Throwable) {\n                        kotlin.runCatching { // Observer should avoid all possible errors\n                            logger.error(\n                                { \"Exception in closing a leaked resource (holder=$holder)\" },\n                                exceptionInClose.also {\n                                    if (stackException != null) {\n                                        it.addSuppressed(stackException)\n                                    }\n                                }\n                            )\n                        }\n                    }\n                }\n            } catch (throwable: Throwable) {\n                kotlin.runCatching { // Observer should avoid all possible errors\n                    logger.error(\n                        \"Exception in queue loop\",\n                        throwable\n                    )\n                }\n            }\n\n            Thread.sleep(60 * 1000L)\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/internal/utils/LoggerAdapterImpls.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport net.mamoe.mirai.utils.MiraiLoggerPlatformBase\nimport org.apache.logging.log4j.Marker\nimport org.apache.logging.log4j.MarkerManager\nimport org.apache.logging.log4j.message.Message\nimport org.apache.logging.log4j.message.ReusableMessageFactory\nimport org.apache.logging.log4j.message.ReusableSimpleMessage\nimport java.util.logging.Level as JulLevel\nimport java.util.logging.Logger as JulLogger\n\nprivate inline fun ReusableMessageFactory.takeMessage(message: String?, crossinline block: (message: Message) -> Unit) {\n    val msg = this.newMessage(message) as ReusableSimpleMessage\n    block(msg)\n    msg.clear()\n}\n\ninternal class Log4jLoggerAdapter(\n    private val logger: org.apache.logging.log4j.Logger,\n    override val marker: Marker?,\n) : MiraiLoggerPlatformBase(), MarkedMiraiLogger {\n    val factory: ReusableMessageFactory = ReusableMessageFactory.INSTANCE\n\n    override fun verbose0(message: String?, e: Throwable?) {\n        factory.takeMessage(message) {\n            logger.trace(marker, it, e)\n        }\n    }\n\n    override fun debug0(message: String?, e: Throwable?) {\n        factory.takeMessage(message) {\n            logger.debug(marker, it, e)\n        }\n    }\n\n    override fun info0(message: String?, e: Throwable?) {\n        factory.takeMessage(message) {\n            logger.info(marker, it, e)\n        }\n    }\n\n    override fun warning0(message: String?, e: Throwable?) {\n        factory.takeMessage(message) {\n            logger.warn(marker, it, e)\n        }\n    }\n\n    override fun error0(message: String?, e: Throwable?) {\n        factory.takeMessage(message) {\n            logger.error(marker, it, e)\n        }\n    }\n\n    override val isVerboseEnabled: Boolean get() = logger.isTraceEnabled\n    override val isDebugEnabled: Boolean get() = logger.isDebugEnabled\n    override val isInfoEnabled: Boolean get() = logger.isInfoEnabled\n    override val isWarningEnabled: Boolean get() = logger.isWarnEnabled\n    override val isErrorEnabled: Boolean get() = logger.isErrorEnabled\n\n    override val identity: String? get() = logger.name\n\n    override fun subLogger(name: String): MarkedMiraiLogger {\n        return Log4jLoggerAdapter(logger, Marker(name, marker))\n    }\n\n}\n\ninternal val MARKER_MIRAI by lazy { MarkerManager.getMarker(\"mirai\") }\n\ninternal class Slf4jLoggerAdapter(private val logger: org.slf4j.Logger, private val marker: org.slf4j.Marker?) :\n    MiraiLoggerPlatformBase() {\n    override fun verbose0(message: String?, e: Throwable?) {\n        if (marker == null) logger.trace(message, e)\n        else logger.trace(marker, message, e)\n    }\n\n    override fun debug0(message: String?, e: Throwable?) {\n        if (marker == null) logger.debug(message, e)\n        else logger.debug(marker, message, e)\n    }\n\n    override fun info0(message: String?, e: Throwable?) {\n        if (marker == null) logger.info(message, e)\n        else logger.info(marker, message, e)\n    }\n\n    override fun warning0(message: String?, e: Throwable?) {\n        if (marker == null) logger.warn(message, e)\n        else logger.warn(marker, message, e)\n    }\n\n    override fun error0(message: String?, e: Throwable?) {\n        if (marker == null) logger.error(message, e)\n        else logger.error(marker, message, e)\n    }\n\n    override val isVerboseEnabled: Boolean get() = logger.isTraceEnabled\n    override val isDebugEnabled: Boolean get() = logger.isDebugEnabled\n    override val isInfoEnabled: Boolean get() = logger.isInfoEnabled\n    override val isWarningEnabled: Boolean get() = logger.isWarnEnabled\n    override val isErrorEnabled: Boolean get() = logger.isErrorEnabled\n\n    override val identity: String?\n        get() = logger.name\n}\n\ninternal class JdkLoggerAdapter(private val logger: JulLogger) : MiraiLoggerPlatformBase() {\n    override fun verbose0(message: String?, e: Throwable?) {\n        logger.log(JulLevel.FINEST, message, e)\n    }\n\n    override fun debug0(message: String?, e: Throwable?) {\n        logger.log(JulLevel.FINER, message, e)\n\n    }\n\n    override fun info0(message: String?, e: Throwable?) {\n        logger.log(JulLevel.INFO, message, e)\n    }\n\n    override fun warning0(message: String?, e: Throwable?) {\n        logger.log(JulLevel.WARNING, message, e)\n    }\n\n    override fun error0(message: String?, e: Throwable?) {\n        logger.log(JulLevel.SEVERE, message, e)\n    }\n\n    override val isVerboseEnabled: Boolean get() = logger.isLoggable(JulLevel.FINE)\n    override val isDebugEnabled: Boolean get() = logger.isLoggable(JulLevel.FINEST)\n    override val isInfoEnabled: Boolean get() = logger.isLoggable(JulLevel.INFO)\n    override val isWarningEnabled: Boolean get() = logger.isLoggable(JulLevel.WARNING)\n    override val isErrorEnabled: Boolean get() = logger.isLoggable(JulLevel.SEVERE)\n\n    override val identity: String?\n        get() = logger.name\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/internal/utils/MarkedMiraiLogger.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport net.mamoe.mirai.utils.MiraiLogger\n\n/**\n * 内部添加 [Marker] 支持, 并兼容旧 [MiraiLogger] API.\n */\ninternal interface MarkedMiraiLogger : MiraiLogger {\n    val marker: Marker?\n\n    /**\n     * Create an implementation-specific [MarkedMiraiLogger].\n     *\n     * Do not call the extension `MiraiLogger.subLogger` inside the function body.\n     */\n    fun subLogger(name: String): MarkedMiraiLogger\n}\n\ninternal fun Marker(name: String, parents: Marker?): Marker {\n    return MarkerManager.getMarker(name).apply { if (parents != null) addParents(parents) }\n}\n\ninternal fun Marker(name: String, vararg parents: Marker?): Marker {\n    return MarkerManager.getMarker(name).apply {\n        parents.forEach { if (it != null) addParents(it) }\n    }\n}\n\ninternal val MiraiLogger.markerOrNull get() = (this as? MarkedMiraiLogger)?.marker\n\n// This clashes with the same declaration in mirai-core (same package), for native.\n//\n///**\n// * Create a marked logger whose marker is a child of this' marker.\n// *\n// * Calling [MarkedMiraiLogger.subLogger] if possible, and creating [MiraiLoggerMarkedWrapper] otherwise.\n// */\n//@JvmName(\"subLoggerImpl2\")\n//@CName(\"\", \"subLogger2\")\n//internal fun MiraiLogger.subLogger(name: String): MiraiLogger {\n//    return subLoggerImpl(this, name)\n//}\n\n// used by mirai-core\ninternal fun subLoggerImpl(origin: MiraiLogger, name: String): MiraiLogger {\n    return if (origin is MarkedMiraiLogger) {\n        // origin can be Log4JAdapter or MiraiLoggerMarkedWrapper which delegates a non-Log4JAdapter.\n        origin.subLogger(name) // Log4JAdapter natively supports Markers.\n    } else {\n        return origin\n        // origin will never use the MiraiLoggerMarkedWrapper.marker so wrapping it is meaningless.\n    }\n}\n\n/**\n * 仅当日志系统使用的不是 Log4J 时才会构造 [MiraiLoggerMarkedWrapper].\n */\nprivate class MiraiLoggerMarkedWrapper(\n    val origin: MiraiLogger,\n    override val marker: Marker\n) : MiraiLogger by origin, MarkedMiraiLogger {\n    override fun subLogger(name: String): MarkedMiraiLogger = MiraiLoggerMarkedWrapper(origin, Marker(name, marker))\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/internal/utils/Marker.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport org.apache.logging.log4j.MarkerManager\n\ninternal typealias Marker = org.apache.logging.log4j.Marker\n\ninternal object MarkerManager {\n    fun getMarker(name: String): Marker {\n        return MarkerManager.getMarker(name)\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/internal/utils/StdoutLogger.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.internal.utils\n\nimport net.mamoe.mirai.utils.*\n\n\n/**\n * JVM 控制台日志实现\n *\n *\n * 单条日志格式 (正则) 为:\n * ```regex\n * ^([\\w-]*\\s[\\w:]*)\\s(\\w)\\/(.*?):\\s(.+)$\n * ```\n * 其中 group 分别为: 日期与时间, 严重程度, [identity], 消息内容.\n *\n * 示例:\n * ```log\n * 2020-05-21 19:51:09 V/Bot 123456789: Send: OidbSvc.0x88d_7\n * ```\n *\n * 日期时间格式为 `yyyy-MM-dd HH:mm:ss`,\n *\n * 严重程度为 V, I, W, E. 分别对应 verbose, info, warning, error\n *\n * @param isColored 是否添加 ANSI 颜色\n *\n * @see MiraiLogger.create\n * @see SingleFileLogger 使用单一文件记录日志\n * @see DirectoryLogger 在一个目录中按日期存放文件记录日志, 自动清理过期日志\n */\n@OptIn(MiraiExperimentalApi::class)\ninternal open class StdoutLogger constructor(\n    override val identity: String? = \"Mirai\",\n    /**\n     * 日志输出. 不会自动添加换行\n     */\n    open val output: (String) -> Unit,\n    val isColored: Boolean = true\n) : MiraiLoggerPlatformBase() {\n    constructor(identity: String?) : this(identity, ::println)\n    constructor(identity: String?, output: (String) -> Unit) : this(identity, output, true)\n\n    /**\n     * 输出一条日志. [message] 末尾可能不带换行符.\n     */\n    protected open fun printLog(message: String?, priority: SimpleLogger.LogPriority) {\n        if (isColored) output(\"${priority.color}$currentTimeFormatted ${priority.simpleName}/$identity: $message${Color.RESET}\")\n        else output(\"$currentTimeFormatted ${priority.simpleName}/$identity: $message\")\n    }\n\n    /**\n     * 获取指定 [SimpleLogger.LogPriority] 的颜色\n     */\n    protected open val SimpleLogger.LogPriority.color: Color\n        get() = when (this) {\n            SimpleLogger.LogPriority.VERBOSE -> Color.RESET\n            SimpleLogger.LogPriority.INFO -> Color.LIGHT_GREEN\n            SimpleLogger.LogPriority.WARNING -> Color.LIGHT_YELLOW\n            SimpleLogger.LogPriority.ERROR -> Color.RED\n            SimpleLogger.LogPriority.DEBUG -> Color.LIGHT_CYAN\n        }\n\n    public override fun verbose0(message: String?): Unit = printLog(message, SimpleLogger.LogPriority.VERBOSE)\n\n    public override fun verbose0(message: String?, e: Throwable?) {\n        if (e != null) verbose((message ?: e.toString()) + \"\\n${e.stackTraceToString()}\")\n        else verbose(message.toString())\n    }\n\n    public override fun info0(message: String?): Unit = printLog(message, SimpleLogger.LogPriority.INFO)\n    public override fun info0(message: String?, e: Throwable?) {\n        if (e != null) info((message ?: e.toString()) + \"\\n${e.stackTraceToString()}\")\n        else info(message.toString())\n    }\n\n    public override fun warning0(message: String?): Unit = printLog(message, SimpleLogger.LogPriority.WARNING)\n    public override fun warning0(message: String?, e: Throwable?) {\n        if (e != null) warning((message ?: e.toString()) + \"\\n${e.stackTraceToString()}\")\n        else warning(message.toString())\n    }\n\n    public override fun error0(message: String?): Unit = printLog(message, SimpleLogger.LogPriority.ERROR)\n    public override fun error0(message: String?, e: Throwable?) {\n        if (e != null) error((message ?: e.toString()) + \"\\n${e.stackTraceToString()}\")\n        else error(message.toString())\n    }\n\n    public override fun debug0(message: String?): Unit = printLog(message, SimpleLogger.LogPriority.DEBUG)\n    public override fun debug0(message: String?, e: Throwable?) {\n        if (e != null) debug((message ?: e.toString()) + \"\\n${e.stackTraceToString()}\")\n        else debug(message.toString())\n    }\n\n\n    private val currentTimeFormatted get() = currentTimeFormatted(null)\n\n    @MiraiExperimentalApi(\"This is subject to change.\")\n    protected enum class Color(private val format: String) {\n        RESET(\"\\u001b[0m\"),\n\n        WHITE(\"\\u001b[30m\"),\n        RED(\"\\u001b[31m\"),\n        EMERALD_GREEN(\"\\u001b[32m\"),\n        GOLD(\"\\u001b[33m\"),\n        BLUE(\"\\u001b[34m\"),\n        PURPLE(\"\\u001b[35m\"),\n        GREEN(\"\\u001b[36m\"),\n\n        GRAY(\"\\u001b[90m\"),\n        LIGHT_RED(\"\\u001b[91m\"),\n        LIGHT_GREEN(\"\\u001b[92m\"),\n        LIGHT_YELLOW(\"\\u001b[93m\"),\n        LIGHT_BLUE(\"\\u001b[94m\"),\n        LIGHT_PURPLE(\"\\u001b[95m\"),\n        LIGHT_CYAN(\"\\u001b[96m\")\n        ;\n\n        override fun toString(): String = format\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/MessageReceipt.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\", \"FunctionName\", \"unused\")\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai.message\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.IMirai\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.message.action.AsyncRecallResult\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.message.data.MessageSource.Key.quote\nimport net.mamoe.mirai.message.data.MessageSource.Key.recallIn\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.NotStableForInheritance\n\n/**\n * 发送消息后得到的回执. 可用于撤回, 引用回复等.\n *\n * @param source 指代发送出去的消息\n * @param target 消息发送对象\n *\n * @see quote 引用这条消息. 即引用机器人自己发出去的消息\n * @see quoteReply 引用并回复这条消息.\n * @see recallMessage 撤回这条消息\n *\n * @see Group.sendMessage 发送群消息, 返回回执（此对象）\n * @see User.sendMessage 发送群消息, 返回回执（此对象）\n * @see Member.sendMessage 发送临时消息, 返回回执（此对象）\n *\n * @see MessageReceipt.sourceIds 源 ids\n * @see MessageReceipt.sourceTime 源时间\n */\n@NotStableForInheritance\npublic open class MessageReceipt<out C : Contact>\n@MiraiInternalApi\n@Deprecated(\"Do not call it directly\", level = DeprecationLevel.ERROR)\nconstructor(\n    /**\n     * 指代发送出去的消息.\n     */\n    public val source: OnlineMessageSource.Outgoing,\n    /**\n     * 发送目标, 为 [Group] 或 [Friend] 或 [Member]\n     */\n    public val target: C,\n) {\n    /**\n     * 是否为发送给群的消息的回执\n     */\n    public val isToGroup: Boolean get() = target is Group\n\n    /**\n     * 撤回这条消息.\n     *\n     * @see IMirai.recallMessage\n     */\n    public suspend inline fun recall() {\n        return Mirai.recallMessage(target.bot, source)\n    }\n\n    /**\n     * 在一段时间后撤回这条消息.\n     *\n     * @see IMirai.recallMessage\n     */\n    @Suppress(\"DeferredIsResult\")\n    public fun recallIn(millis: Long): AsyncRecallResult = this.source.recallIn(millis)\n\n    /**\n     * 引用这条消息.\n     * @see MessageSource.quote 引用一条消息\n     */\n    public fun quote(): QuoteReply = this.source.quote()\n\n    /**\n     * 引用这条消息并回复.\n     * @see MessageSource.quote 引用一条消息\n     */\n    public suspend inline fun quoteReply(message: Message): MessageReceipt<C> {\n        @Suppress(\"UNCHECKED_CAST\")\n        return target.sendMessage(this.quote() + message) as MessageReceipt<C>\n    }\n\n    /**\n     * 引用这条消息并回复.\n     * @see MessageSource.quote 引用一条消息\n     */\n    public suspend inline fun quoteReply(message: String): MessageReceipt<C> {\n        return this.quoteReply(PlainText(message))\n    }\n\n    public companion object\n}\n\n/**\n * 获取相关 [Bot]\n */\npublic inline val MessageReceipt<*>.bot: Bot\n    get() = target.bot\n\n/**\n * 获取源消息 [MessageSource.ids]\n */\npublic inline val MessageReceipt<*>.sourceIds: IntArray\n    get() = this.source.ids\n\n/**\n * 获取源消息 [MessageSource.internalIds]\n */\npublic inline val MessageReceipt<*>.sourceInternalIds: IntArray\n    get() = this.source.internalIds\n\n/**\n * 获取源消息 [MessageSource.time]\n */\npublic inline val MessageReceipt<*>.sourceTime: Int\n    get() = this.source.time\n\n/**\n * 获取源消息 [MessageSource.originalMessage]\n */\npublic inline val MessageReceipt<*>.sourceMessage: MessageChain\n    get() = this.source.originalMessage\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/MessageSerializers.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.message\n\nimport kotlinx.serialization.ContextualSerializer\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.PolymorphicSerializer\nimport kotlinx.serialization.json.Json\nimport kotlinx.serialization.modules.PolymorphicModuleBuilder\nimport kotlinx.serialization.modules.SerializersModule\nimport kotlinx.serialization.modules.subclass\nimport net.mamoe.mirai.internal.message.MessageSerializersImpl\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.MessageChain.Companion.serializeToJsonString\nimport net.mamoe.mirai.message.data.SingleMessage\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport kotlin.reflect.KClass\n\n/**\n * 消息序列化器.\n *\n * [MessageSerializers] 存放 [SerializersModule], 用于协助 [SingleMessage] [PolymorphicSerializer] 的多态序列化.\n *\n * 要序列化一个 [MessageChain], 请使用内建的 [MessageChain.serializeToJsonString]\n *\n * @see serializersModule\n *\n *\n * @see MessageChain.Serializer\n *\n * @see MessageSerializers.INSTANCE\n */\n@NotStableForInheritance\npublic interface MessageSerializers {\n    /**\n     * 包含 [SingleMessage] 多态序列化和 [Message] [ContextualSerializer] 信息的 [SerializersModule].\n     *\n     * 在序列化消息时都需要提供给相关 [Json] 配置的 [Json.serializersModule]. 如通过:\n     * ```\n     * val json = Json {\n     *     serializesModule = MessageSerializers.serializersModule\n     * }\n     * ```\n     */\n    public val serializersModule: SerializersModule\n\n    /**\n     * 注册 [serializer] 到 [type] 的所有为 [SingleMessage] 子类型的超类型的多态域 [PolymorphicModuleBuilder.subclass]\n     *\n     * 实现:\n     * ```\n     * for (superclass in type.allSuperclasses) {\n     *     if (superclass.isFinal) continue\n     *     if (superclass.isSubclassOf(SingleMessage::class)) continue\n     *     polymorphic(superclass) {\n     *         subclass(type, serializer)\n     *     }\n     * }\n     * ```\n     *\n     *\n     * 若要自己实现消息类型, 务必在这里注册对应序列化器, 否则在 [MessageChain.serializeToJsonString] 时将会出错.\n     *\n     * @since 2.0, revised 2.3\n     */\n    @MiraiExperimentalApi\n    public fun <M : SingleMessage> registerSerializer(\n        type: KClass<M>,\n        serializer: KSerializer<M>\n    ) // not supported on native.\n\n    /**\n     * 合并 [serializersModule] 到 [MessageSerializers.serializersModule] 并覆盖.\n     */\n    @MiraiExperimentalApi\n    public fun registerSerializers(serializersModule: SerializersModule) // supported on all platforms.\n\n    public companion object INSTANCE : MessageSerializers by MessageSerializersImpl\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/action/AsyncRecallResult.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai.message.action\n\nimport kotlinx.coroutines.CompletableDeferred\nimport kotlinx.coroutines.Deferred\nimport kotlinx.coroutines.future.asCompletableFuture\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.message.data.MessageSource\nimport net.mamoe.mirai.message.data.MessageSource.Key.recallIn\nimport java.util.concurrent.CompletableFuture\n\n/**\n * 异步撤回结果.\n *\n * 可由 [MessageSource.recallIn] 返回得到.\n *\n * ## Kotlin 用法示例\n *\n * ### 获取撤回失败时的异常\n *\n * ```\n * val exception = result.exception.await() // 挂起协程并等待撤回的结果.\n * if (exception == null) {\n *   // 撤回成功\n * } else {\n *   // 撤回失败\n * }\n * ```\n *\n * 若仅需要了解撤回是否成功而不需要获取详细异常实例, 可使用 [isSuccess]\n *\n * ## Java 用法示例\n *\n * ```java\n * Throwable exception = result.exceptionFuture.get(); // 阻塞线程并等待撤回的结果.\n * if (exception == null) {\n *   // 撤回成功\n * } else {\n *   // 撤回失败\n * }\n * ```\n *\n * @see MessageSource.recallIn\n */\npublic class AsyncRecallResult internal constructor(\n    /**\n     * 撤回时产生的异常, 当撤回成功时为 `null`. Kotlin [Deferred] API.\n     */\n    public val exception: Deferred<Throwable?>,\n) {\n    /**\n     * 撤回时产生的异常, 当撤回成功时为 `null`. Java [CompletableFuture] API.\n     */\n    public val exceptionFuture: CompletableFuture<Throwable?> by lazy { exception.asCompletableFuture() }\n\n    /**\n     * 撤回是否成功. Kotlin [Deferred] API.\n     */\n    public val isSuccess: Deferred<Boolean> by lazy {\n        CompletableDeferred<Boolean>().apply {\n            exception.invokeOnCompletion {\n                complete(it == null)\n            }\n        }\n    }\n\n    /**\n     * 撤回是否成功. Java [CompletableFuture] API.\n     */\n    public val isSuccessFuture: CompletableFuture<Boolean> by lazy { isSuccess.asCompletableFuture() }\n\n    /**\n     * 挂起协程 (在 Java 为阻塞线程) 直到撤回完成, 返回撤回时产生的异常. 当撤回成功时返回 `null`.\n     */\n    public suspend fun awaitException(): Throwable? {\n        return exception.await()\n    }\n\n    /**\n     * 挂起协程 (在 Java 为阻塞线程) 直到撤回完成, 返回撤回的结果.\n     */\n    public suspend fun awaitIsSuccess(): Boolean {\n        return isSuccess.await()\n    }\n}\n\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/action/Nudge.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\npackage net.mamoe.mirai.message.action\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.event.events.NudgeEvent\nimport net.mamoe.mirai.message.data.PokeMessage\nimport net.mamoe.mirai.utils.BotConfiguration\nimport net.mamoe.mirai.utils.BotConfiguration.MiraiProtocol\nimport kotlin.jvm.JvmStatic\nimport kotlin.jvm.JvmSynthetic\n\n/**\n * 一个 \"戳一戳\" 动作.\n *\n * 备注: 这类似微信拍一拍. 消息对话框中显示的 \"一个手指\" 的戳一戳是 [PokeMessage]\n *\n * 仅在手机 QQ 8.4.0 左右版本才受支持. 其他客户端会忽略这些消息.\n *\n * 示例，要机器人戳一个群员并发送到群里，使用 `member.nudge().sendTo(group)`.\n * 要机器人戳一个好友并发送给该好友，使用 `friend.nudge().sendTo(friend)`.\n *\n * @see UserOrBot.nudge 创建 [Nudge] 对象\n */\npublic sealed class Nudge {\n    /**\n     * 戳的对象. 即 \"A 戳了 B\" 中的 \"B\".\n     */\n    public abstract val target: UserOrBot\n\n    /**\n     * 发送戳一戳消息到 [receiver].\n     *\n     * 需要使用支持的[协议][BotConfiguration.protocol] [MiraiProtocol.ANDROID_PHONE], [ANDROID_PAD 协议][MiraiProtocol.ANDROID_PAD] 或 [MiraiProtocol.IPAD].\n     * + 自 2.10 起才支持使用 IPAD 协议发送.\n     * + 自 2.16.0-RC 起才支持使用 PAD 协议发送.\n     *\n     * @param receiver 这条 \"戳一戳\" 消息的接收对象. (不是 \"戳\" 动作的对象, 而是接收 \"A 戳了 B\" 这条消息的对象)\n     * @return 成功发送时为 `true`. 若对方禁用 \"戳一戳\" 功能, 返回 `false`.\n     * @throws UnsupportedOperationException 当未使用 [ANDROID_PHONE 协议][MiraiProtocol.ANDROID_PHONE], [ANDROID_PAD 协议][MiraiProtocol.ANDROID_PAD] 或 [IPAD 协议][MiraiProtocol.IPAD] 时抛出\n     *\n     * @see NudgeEvent 事件\n     * @see Contact.sendNudge\n     */\n    @JvmBlockingBridge\n    public suspend fun sendTo(receiver: Contact): Boolean {\n        @Suppress(\"DEPRECATION_ERROR\")\n        return Mirai.sendNudge(receiver.bot, this, receiver)\n    }\n\n    public companion object {\n        /**\n         * 发送戳一戳消息.\n         *\n         * 需要使用支持的[协议][BotConfiguration.protocol] [MiraiProtocol.ANDROID_PHONE], [ANDROID_PAD 协议][MiraiProtocol.ANDROID_PAD] 或 [MiraiProtocol.IPAD].\n         * + 自 2.10 起才支持使用 IPAD 协议发送.\n         * + 自 2.16.0-RC 起才支持使用 PAD 协议发送.\n         *\n         * @return 成功发送时为 `true`. 若对方禁用 \"戳一戳\" 功能或今日 \"戳一戳\" 次数已达到上限, 返回 `false`.\n         *\n         * @throws UnsupportedOperationException 当未使用 [ANDROID_PHONE 协议][MiraiProtocol.ANDROID_PHONE], [ANDROID_PAD 协议][MiraiProtocol.ANDROID_PAD] 或 [IPAD 协议][MiraiProtocol.IPAD] 时抛出\n         *\n         * @see NudgeEvent 事件\n         */\n        @JvmSynthetic\n        @JvmStatic\n        public suspend fun Contact.sendNudge(nudge: Nudge): Boolean = nudge.sendTo(this)\n    }\n}\n\n/**\n * @see Bot.nudge\n * @see Nudge\n */\npublic data class BotNudge(\n    public override val target: Bot\n) : Nudge()\n\n/**\n * @see User.nudge\n * @see Nudge\n */\npublic sealed class UserNudge : Nudge() {\n    public abstract override val target: UserOrBot\n}\n\n/**\n * @see Member.nudge\n * @see Nudge\n */\npublic data class MemberNudge(\n    public override val target: NormalMember\n) : UserNudge()\n\n/**\n * @see Friend.nudge\n * @see Nudge\n */\npublic data class FriendNudge(\n    public override val target: Friend\n) : UserNudge()\n\n/**\n * @see Stranger.nudge\n * @see Nudge\n */\npublic data class StrangerNudge(\n    public override val target: Stranger\n) : UserNudge()\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/code/CodableMessage.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.message.code\n\nimport net.mamoe.mirai.message.code.MiraiCode.deserializeMiraiCode\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.NotStableForInheritance\n\n\n/**\n * 可以使用 mirai 码表示的 [Message] 类型.\n *\n * 从字符串解析 mirai 码：[MiraiCode.deserializeMiraiCode]\n *\n * ### 不适合第三方实现\n * 即使自定义消息类型实现了接口 [CodableMessage], 在 [MiraiCode.deserializeMiraiCode] 时也无法解析消息类型. 因此实现没有意义.\n *\n * @see MiraiCode\n */\n@NotStableForInheritance\npublic interface CodableMessage : Message {\n    /**\n     * 转换为 mirai 码.\n     */\n    public fun serializeToMiraiCode(): String = buildString {\n        @OptIn(MiraiExperimentalApi::class)\n        appendMiraiCodeTo(this)\n    }\n\n    // Using StringBuilder faster than direct plus objects\n    @MiraiExperimentalApi\n    public fun appendMiraiCodeTo(builder: StringBuilder)\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/code/MiraiCode.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.message.code\n\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.message.code.internal.parseMiraiCodeImpl\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.MessageChain.Companion.deserializeFromMiraiCode\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.safeCast\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmOverloads\nimport kotlin.jvm.JvmStatic\nimport kotlin.jvm.JvmSynthetic\n\n/**\n * Mirai 码相关操作.\n *\n * 可在 GitHub 查看 [详细文档](https://github.com/mamoe/mirai/blob/dev/docs/Messages.md#mirai-%E7%A0%81).\n */\npublic object MiraiCode {\n    /**\n     * 解析形如 \"[mirai:]\" 的 mirai 码, 即 [CodableMessage.serializeToMiraiCode] 返回的内容.\n     * @see MessageChain.deserializeFromMiraiCode\n     */\n    @JvmName(\"parseMiraiCode1\")\n    @JvmSynthetic\n    public fun String.deserializeMiraiCode(contact: Contact? = null): MessageChain =\n        deserializeMiraiCode(this, contact)\n\n    /**\n     * 解析形如 \"[mirai:]\" 的 mirai 码, 即 [CodableMessage.serializeToMiraiCode] 返回的内容.\n     * @see MessageChain.deserializeFromMiraiCode\n     */\n    @JvmOverloads\n    @JvmStatic\n    public fun deserializeMiraiCode(code: String, contact: Contact? = null): MessageChain =\n        code.parseMiraiCodeImpl(contact)\n\n    /**\n     * 转换得到 mirai 码.\n     */\n    @JvmStatic\n    public fun Iterable<Message>.serializeToMiraiCode(): String = iterator().serializeToMiraiCode()\n\n    /**\n     * 转换得到 mirai 码.\n     */\n    @JvmStatic\n    public fun Sequence<Message>.serializeToMiraiCode(): String = iterator().serializeToMiraiCode()\n\n    /**\n     * 转换得到 mirai 码.\n     */\n    @JvmStatic\n    public fun Array<out Message>.serializeToMiraiCode(): String = iterator().serializeToMiraiCode()\n\n    /**\n     * 转换得到 mirai 码.\n     */\n    @JvmStatic\n    public fun Iterator<Message>.serializeToMiraiCode(): String = buildString {\n        @OptIn(MiraiExperimentalApi::class)\n        this@serializeToMiraiCode.forEach {\n            it.safeCast<CodableMessage>()?.appendMiraiCodeTo(this)\n        }\n    }\n\n    /**\n     * 转换得到 mirai 码.\n     * @see CodableMessage.serializeToMiraiCode\n     */\n    @Suppress(\"EXTENSION_SHADOWED_BY_MEMBER\")// for better Java API.\n    @JvmStatic\n    public fun CodableMessage.serializeToMiraiCode(): String = this.serializeToMiraiCode() // member function\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/code/internal/impl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\")\n\npackage net.mamoe.mirai.message.code.internal\n\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n\ninternal fun String.parseMiraiCodeImpl(contact: Contact?): MessageChain = buildMessageChain {\n    forEachMiraiCode { origin, name, args ->\n        if (name == null) {\n            add(PlainText(origin.decodeMiraiCode()))\n            return@forEachMiraiCode\n        }\n        val parser = MiraiCodeParsers[name] ?: kotlin.run {\n            add(PlainText(origin.decodeMiraiCode()))\n            return@forEachMiraiCode\n        }\n        parser.parse(contact, args)\n            ?.let(::add)\n            ?: add(PlainText(origin.decodeMiraiCode()))\n    }\n}\n\nprivate fun String.forEachMiraiCode(block: (origin: String, name: String?, args: String) -> Unit) {\n    var pos = 0\n    var lastPos = 0\n    val len = length - 7 // [mirai:\n    fun findEnding(start: Int): Int {\n        var pos0 = start\n        while (pos0 < length) {\n            when (get(pos0)) {\n                '\\\\' -> pos0 += 2\n                ']' -> return pos0\n                else -> pos0++\n            }\n        }\n        return -1\n    }\n    while (pos < len) {\n        when (get(pos)) {\n            '\\\\' -> {\n                pos += 2\n            }\n            '[' -> {\n                if (get(pos + 1) == 'm' && get(pos + 2) == 'i' &&\n                    get(pos + 3) == 'r' && get(pos + 4) == 'a' &&\n                    get(pos + 5) == 'i' && get(pos + 6) == ':'\n                ) {\n                    val begin = pos\n                    pos += 7\n                    val ending = findEnding(pos)\n                    if (ending == -1) {\n                        block(substring(lastPos), null, \"\")\n                        return\n                    } else {\n                        if (lastPos < begin) {\n                            block(substring(lastPos, begin), null, \"\")\n                        }\n                        val v = substring(begin, ending + 1)\n                        val splitter = v.indexOf(':', 7)\n                        block(\n                            v, if (splitter == -1)\n                                v.substring(7, v.length - 1)\n                            else v.substring(7, splitter),\n                            if (splitter == -1) {\n                                \"\"\n                            } else v.substring(splitter + 1, v.length - 1)\n                        )\n                        lastPos = ending + 1\n                        pos = lastPos\n                    }\n                } else pos++\n            }\n            else -> {\n                pos++\n            }\n        }\n    }\n    if (lastPos < length) {\n        block(substring(lastPos), null, \"\")\n    }\n}\n\n@OptIn(MiraiInternalApi::class, MiraiExperimentalApi::class)\n@Suppress(\"DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE\")\nprivate object MiraiCodeParsers : AbstractMap<String, MiraiCodeParser>(), Map<String, MiraiCodeParser> by mapOf(\n    \"at\" to MiraiCodeParser(Regex(\"\"\"(\\d*)\"\"\")) { (target) ->\n        At(target.toLong())\n    },\n    \"atall\" to MiraiCodeParser(Regex(\"\")) {\n        AtAll\n    },\n    \"poke\" to MiraiCodeParser(Regex(\"(.*)?,(\\\\d*),(-?\\\\d*)\")) { (name, type, id) ->\n        PokeMessage(name, type.toInt(), id.toInt())\n    },\n    \"vipface\" to MiraiCodeParser(Regex(\"\"\"(\\d*),(.*),(\\d*)\"\"\")) { (id, name, count) ->\n        VipFace(VipFace.Kind(id.toInt(), name), count.toInt())\n    },\n    \"face\" to MiraiCodeParser(Regex(\"\"\"(\\d*)\"\"\")) { (id) ->\n        Face(id.toInt())\n    },\n    \"superface\" to MiraiCodeParser(Regex(\"\"\"(\\d*),(.*),(\\d*)\"\"\")) { (face, id, type) ->\n        SuperFace(face.toInt(), id, type.toInt())\n    },\n    \"image\" to MiraiCodeParser(Regex(\"\"\"(.*)\"\"\")) { (id) ->\n        Image(id)\n    },\n    \"flash\" to MiraiCodeParser(Regex(\"\"\"(.*)\"\"\")) { (id) ->\n        Image(id).flash()\n    },\n    \"service\" to MiraiCodeParser(Regex(\"\"\"(\\d*),(.*)\"\"\")) { (id, content) ->\n        SimpleServiceMessage(id.toInt(), content.decodeMiraiCode())\n    },\n    \"app\" to MiraiCodeParser(Regex(\"\"\"(.*)\"\"\")) { (content) ->\n        LightApp(content.decodeMiraiCode())\n    },\n    \"dice\" to MiraiCodeParser(Regex(\"\"\"([1-6])\"\"\")) { (value) ->\n        Dice(value.toInt())\n    },\n    \"rps\" to MiraiCodeParser(Regex(\"\"\"(\\w+)\"\"\")) { (value) ->\n        RockPaperScissors.valueOf(value.uppercase())\n    },\n    \"musicshare\" to MiraiCodeParser.DynamicParser(7) { args ->\n        val (kind, title, summary, jumpUrl, pictureUrl) = args\n        val musicUrl = args[5]\n        val brief = args[6]\n\n        MusicShare(MusicKind.valueOf(kind), title, summary, jumpUrl, pictureUrl, musicUrl, brief)\n    },\n    \"file\" to MiraiCodeParser(Regex(\"\"\"(.*?),(.*?),(.*?),(.*?)\"\"\")) { (id, internalId, name, size) ->\n        FileMessage(id, internalId.toInt(), name, size.toLong())\n    },\n)\n\n\n// Visitable for test\ninternal sealed class MiraiCodeParser {\n    abstract fun parse(contact: Contact?, args: String): Message?\n    class RegexParser(\n        private val argsRegex: Regex,\n        private val mapper: Contact?.(MatchResult.Destructured) -> Message?\n    ) : MiraiCodeParser() {\n        override fun parse(contact: Contact?, args: String): Message? =\n            argsRegex.matchEntire(args)\n                ?.destructured\n                ?.let {\n                    runCatching {\n                        contact.mapper(it)\n                    }.getOrNull()\n                }\n    }\n\n    class DynamicParser(\n        private val minArgs: Int,\n        private val maxArgs: Int = minArgs,\n        private val parser: (Contact?.(args: Array<String>) -> Message?),\n    ) : MiraiCodeParser() {\n        override fun parse(contact: Contact?, args: String): Message? {\n            val ranges = mutableListOf<IntRange>()\n            if (args.isNotEmpty()) {\n                var begin = 0\n                var pos = 0\n                val len = args.length\n                while (pos < len) {\n                    when (args[pos]) {\n                        '\\\\' -> pos += 2\n                        ',' -> {\n                            ranges.add(begin..pos)\n                            pos++\n                            begin = pos\n                        }\n                        else -> pos++\n                    }\n                }\n                ranges.add(begin..len)\n            }\n            if (ranges.size < minArgs) return null\n            if (ranges.size > maxArgs) return null\n            @Suppress(\"RemoveExplicitTypeArguments\")\n            val args0 = Array<String>(ranges.size) { index ->\n                val range = ranges[index]\n                args.substring(range.first, range.last).decodeMiraiCode()\n            }\n            runCatching {\n                return parser(contact, args0)\n            }\n            return null\n        }\n    }\n}\n\nprivate fun MiraiCodeParser(\n    argsRegex: Regex,\n    mapper: Contact?.(MatchResult.Destructured) -> Message?\n): MiraiCodeParser = MiraiCodeParser.RegexParser(argsRegex, mapper)\n\ninternal fun StringBuilder.appendStringAsMiraiCode(value: String): StringBuilder = apply {\n    value.forEach { char ->\n        when (char) {\n            '[', ']',\n            ':', ',',\n            '\\\\',\n            -> append(\"\\\\\").append(char)\n            '\\n' -> append(\"\\\\n\")\n            '\\r' -> append(\"\\\\r\")\n            else -> append(char)\n        }\n    }\n}\n\nprivate val DECODE_MIRAI_CODE_REGEX = \"\"\"\\\\.\"\"\".toRegex()\nprivate val DECODE_MIRAI_CODE_TRANSLATOR: (MatchResult) -> String = {\n    when (it.value[1]) {\n        'n' -> \"\\n\"\n        'r' -> \"\\r\"\n        '\\n' -> \"\"\n        else -> it.value.substring(1)\n    }\n}\n\nprivate fun String.decodeMiraiCode() = replace(DECODE_MIRAI_CODE_REGEX, DECODE_MIRAI_CODE_TRANSLATOR)\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/At.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n\n@file:Suppress(\"EXPERIMENTAL_API_USAGE\", \"NOTHING_TO_INLINE\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.Member\nimport net.mamoe.mirai.contact.UserOrBot\nimport net.mamoe.mirai.contact.nameCardOrNick\nimport net.mamoe.mirai.message.code.CodableMessage\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n\n/**\n * At 一个群成员. 只能发送给一个群.\n *\n * 使用时直接构造 At 实例即可.\n *\n * ## mirai 码支持\n * 格式: &#91;mirai:at:*[target]*&#93;\n *\n * @see AtAll 全体成员\n */\n@SerialName(At.SERIAL_NAME)\n@Serializable\npublic data class At(\n    public val target: Long,\n) : MessageContent, CodableMessage {\n    public override fun toString(): String = \"[mirai:at:$target]\"\n    public override fun contentToString(): String = \"@$target\"\n\n    /**\n     * 获取 [At] 发送于指定 [Group] 时会显示的内容.\n     *\n     * 若 [group] 非 `null` 且包含成员 [target], 返回 `\"@成员名片或昵称\"`. 否则返回 `\"@123456\"` 其中 123456 表示 [target]\n     */\n    public fun getDisplay(group: Group?): String {\n        val member = group?.get(this.target) ?: return \"@$target\"\n        return \"@${member.nameCardOrNick}\"\n    }\n\n    @MiraiExperimentalApi\n    override fun appendMiraiCodeTo(builder: StringBuilder) {\n        builder.append(\"[mirai:at:\").append(target).append(']')\n    }\n\n    public companion object {\n        public const val SERIAL_NAME: String = \"At\"\n    }\n\n    // 自动为消息补充 \" \"\n    public override fun followedBy(tail: Message): MessageChain {\n        if (tail is PlainText && tail.content.startsWith(' ')) {\n            return super<MessageContent>.followedBy(tail)\n        }\n        return super<MessageContent>.followedBy(PlainText(\" \")) + tail\n    }\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitAt(this, data)\n    }\n}\n\n/**\n * 构造 [At]\n *\n * @see At\n * @see Member.at\n */\n@JvmSynthetic\npublic inline fun At(user: UserOrBot): At = At(user.id)\n\n/**\n * At 这个成员\n */\n@JvmSynthetic\npublic inline fun Member.at(): At = At(this)"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/AtAll.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n@file:Suppress(\"MemberVisibilityCanBePrivate\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.message.code.CodableMessage\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmSynthetic\n\n/**\n * \"@全体成员\".\n *\n * 非会员每天只能发送 10 次 [AtAll]. 超出部分会被以普通文字看待.\n *\n * ## 使用 [AtAll]\n *\n * [AtAll] 是单例, 将 [AtAll] 实例[添加][Message.plus]到消息链中即可.\n * ```\n * // Kotlin\n * contact.sendMessage(AtAll + \"test\")\n *\n * // Java\n * contact.sendMessage(MessageUtils.newChain(AtAll.INSTANCE, new PlainText(\"test\")));\n * ```\n *\n * ## mirai 码支持\n * 格式: &#91;mirai:atall&#93;\n *\n * @see At at 单个群成员\n */\n@SerialName(AtAll.SERIAL_NAME)\n@Serializable\npublic object AtAll :\n    MessageContent, CodableMessage {\n    public const val display: String = \"@全体成员\"\n    public const val SERIAL_NAME: String = \"AtAll\"\n\n    @Suppress(\"SpellCheckingInspection\")\n    override fun contentToString(): String = display\n    override fun toString(): String = \"[mirai:atall]\"\n    override fun serializeToMiraiCode(): String = toString()\n\n    override fun hashCode(): Int = display.hashCode()\n    override fun equals(other: Any?): Boolean = other === this\n\n    @MiraiExperimentalApi\n    override fun appendMiraiCodeTo(builder: StringBuilder) {\n        builder.append(toString())\n    }\n\n\n    // 自动为消息补充 \" \"\n    @JvmSynthetic\n    public override fun followedBy(tail: Message): MessageChain {\n        if (tail is PlainText && tail.content.startsWith(' ')) {\n            return super<MessageContent>.followedBy(tail)\n        }\n        return super<MessageContent>.followedBy(PlainText(\" \")) + tail\n    }\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitAtAll(this, data)\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/Audio.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\", \"unused\")\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.builtins.serializer\nimport net.mamoe.mirai.contact.AudioSupported\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.message.MessageSerializers\nimport net.mamoe.mirai.message.data.MessageChain.Companion.serializeToJsonString\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.*\nimport kotlin.time.Duration\nimport kotlin.time.Duration.Companion.seconds\n\n/**\n * 语音消息.\n *\n * [Audio] 分为 [OnlineAudio] 与 [OfflineAudio]. 在本地上传的, 或手动构造的语音为 [OfflineAudio]. 从服务器接收的语音为 [OnlineAudio].\n *\n * ## 上传和发送语音\n *\n * 使用 [AudioSupported.uploadAudio] 上传语音到服务器并取得 [Audio] 消息实例, 然后通过 [Contact.sendMessage] 发送.\n *\n * Java 示例:\n * ```\n * Audio audio;\n * try {\n *     audio = group.uploadAudio(resource); // 上传文件得到语音实例\n * } finally {\n *     resource.close(); // 保证资源正常关闭\n * }\n * group.sendMessage(audio); // 发送语音消息\n * ```\n *\n * ## 下载语音\n *\n * 使用 [OnlineAudio.urlForDownload] 获取文件下载链接.\n *\n * ## [Audio] 与 [Voice] 的转换\n *\n * 原 [Voice] 已弃用故不推荐进行兼容转换. [Audio] 将有稳定性保证, 请尽量使用新的 [Audio].\n *\n * 将 [Audio] 转为 [Voice]: [Voice.fromAudio]\n * 将 [Voice] 转为 [Audio]: [Voice.toAudio]\n *\n * @since 2.7\n */\npublic sealed interface Audio : MessageContent, ConstrainSingle {\n    public companion object Key :\n        AbstractPolymorphicMessageKey<MessageContent, Audio>(MessageContent, { it.safeCast() })\n\n    /**\n     * 文件名称. 通常为 `XXX.amr`. 服务器要求文件名后缀必须为 \".amr\", 但其[编码方式][codec]也有可能是非 [AudioCodec.AMR].\n     */\n    public val filename: String\n\n    /**\n     * 文件 MD5. 16 bytes.\n     */\n    public val fileMd5: ByteArray\n\n    /**\n     * 文件大小 bytes. 官方客户端支持最大文件大小约为 1MB, 过大的文件**可能**可以正常上传, 但在官方客户端无法收听 (显示文件损坏).\n     */\n    public val fileSize: Long\n\n    /**\n     * 编码方式.\n     *\n     * - 若语音文件真实编码方式为 [AudioCodec.SILK], 而该属性为 [AudioCodec.AMR], 语音文件将会被服务器压缩为低音质 [AudioCodec.AMR] 格式.\n     * - 若语音文件真实编码方式为 [AudioCodec.AMR], 而该属性为 [AudioCodec.SILK], 语音也可以正常发送并在客户端收听, 音质随文件真实格式而决定.\n     *\n     * 因此在发送时 [codec] 通常可以总是使用 [AudioCodec.SILK] (这也是 [AudioSupported.uploadAudio] 的默认行为).\n     */\n    public val codec: AudioCodec\n\n    /**\n     * 文件的额外数据. 该数据由服务器提供, 可能会影响语音音质等属性.\n     * [extraData] 为 `null` 时也可以发送语音, 但不确定发送和客户端收听是否会正常.\n     *\n     * [extraData] 可能随服务器更新而更新, 因此请不要尝试解析该数据.\n     *\n     * [extraData] 向下兼容, 即旧版本的 [extraData] 可以在新版本构造 [OfflineAudio] ([OfflineAudio.Factory.create]).\n     */\n    public val extraData: ByteArray?\n\n    /**\n     * @return `\"[mirai:audio:${filename}]\"`\n     */\n    public override fun toString(): String\n    public override fun contentToString(): String = \"[语音消息]\"\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitAudio(this, data)\n    }\n\n    override val key: MessageKey<*> get() = Key\n}\n\n\n/**\n * 在线语音消息, 即从消息事件中接收到的语音消息.\n *\n * [OnlineAudio] 可以获取[语音长度][length]以及[下载链接][urlForDownload].\n *\n * [OnlineAudio] 仅可以从事件中的[消息链][MessageChain]接收, 不可手动构造. 若需要手动构造, 请使用 [OfflineAudio.Factory.create] 构造 [离线语音][OfflineAudio].\n *\n * ### 序列化支持\n *\n * [OnlineAudio] 支持序列化. 可使用 [MessageChain.serializeToJsonString] 以及 [MessageChain.deserializeFromJsonString].\n * 也可以在 [MessageSerializers.serializersModule] 获取到 [OnlineAudio] 的 [KSerializer].\n *\n * 要获取更多有关序列化的信息, 参阅 [MessageSerializers].\n *\n * ### 不建议自行实现该接口\n *\n * [OnlineAudio] 不稳定, 将来可能会增加新的抽象属性或方法而导致不兼容. 仅可以使用该接口而不能继承或实现它.\n *\n * @since 2.7\n * @see OfflineAudio\n */\n@NotStableForInheritance\npublic interface OnlineAudio : Audio { // 协议实现\n    /**\n     * 下载链接 HTTP URL.\n     * @return `\"http://xxx\"`\n     */\n    public val urlForDownload: String\n\n    /**\n     * 语音长度秒数\n     */\n    public val length: Long\n\n    public companion object Key :\n        AbstractPolymorphicMessageKey<Audio, OnlineAudio>(Audio, { it.safeCast() }) {\n\n        public const val SERIAL_NAME: String = \"OnlineAudio\"\n    }\n}\n\n/**\n * 获取语音长度秒数, 作为 [Duration].\n * @since 2.11\n */\n@get:JvmSynthetic\npublic inline val OnlineAudio.lengthDuration: Duration\n    get() = length.seconds\n\n/**\n * 离线语音消息.\n *\n * [OfflineAudio] 仅拥有协议上必要的五个属性:\n * - 文件名 [filename]\n * - 文件 MD5 [fileMd5]\n * - 文件大小 [fileSize]\n * - 编码方式 [codec]\n * - 额外数据 [extraData]\n *\n * [OfflineAudio] 可由本地 [ExternalResource] 经过 [AudioSupported.uploadAudio] 上传到服务器得到, 故无[下载链接][OnlineAudio.urlForDownload].\n *\n * [OfflineAudio] 同时还可以用做自定义构造 [Audio] 实例, 使用 [OfflineAudio.Factory.create] 可通过上述五个必要参数获得 [OfflineAudio] 实例.\n *\n * ### 序列化支持\n *\n * [OfflineAudio] 支持序列化. 可使用 [MessageChain.serializeToJsonString] 以及 [MessageChain.deserializeFromJsonString].\n * 也可以在 [MessageSerializers.serializersModule] 获取到 [OfflineAudio] 的 [KSerializer].\n *\n * 要获取更多有关序列化的信息, 参阅 [MessageSerializers].\n *\n * ### 不建议自行实现该接口\n *\n * [OfflineAudio] 不稳定, 将来可能会增加新的抽象属性或方法而导致不兼容. 仅可以使用该接口而不能继承或实现它.\n *\n * @since 2.7\n */\n@NotStableForInheritance\npublic interface OfflineAudio : Audio {\n\n    public companion object Key :\n        AbstractPolymorphicMessageKey<Audio, OfflineAudio>(Audio, { it.safeCast() }) {\n        public const val SERIAL_NAME: String = \"OfflineAudio\"\n    }\n\n    public interface Factory {\n        /**\n         * 构造 [OfflineAudio]. 有关参数的含义, 参考 [Audio].\n         *\n         * 在 Kotlin 可以使用类构造器的函数 [OfflineAudio]: `OfflineAudio(...)`\n         */\n        public fun create(\n            filename: String,\n            fileMd5: ByteArray,\n            fileSize: Long,\n            codec: AudioCodec,\n            extraData: ByteArray?,\n        ): OfflineAudio\n\n        /**\n         * 使用 [OnlineAudio] 的信息构造 [OfflineAudio].\n         *\n         * 在 Kotlin 可以使用类构造器的函数 [OfflineAudio]: `OfflineAudio(...)`\n         */\n        public fun from(onlineAudio: OnlineAudio): OfflineAudio = onlineAudio.run {\n            create(filename, fileMd5, fileSize, codec, extraData)\n        }\n\n        public companion object INSTANCE :\n            Factory by loadService(\"net.mamoe.mirai.internal.message.data.OfflineAudioFactoryImpl\")\n    }\n}\n\n/**\n * 构造 [OfflineAudio]. 有关参数的含义, 参考 [Audio].\n * @since 2.7\n */\n@JvmSynthetic\npublic inline fun OfflineAudio(\n    filename: String,\n    fileMd5: ByteArray,\n    fileSize: Long,\n    codec: AudioCodec,\n    extraData: ByteArray?,\n): OfflineAudio = OfflineAudio.Factory.create(filename, fileMd5, fileSize, codec, extraData)\n\n/**\n * 使用 [OnlineAudio] 的信息构造 [OfflineAudio].\n * @since 2.7\n */\n@JvmSynthetic\npublic inline fun OfflineAudio(\n    onlineAudio: OnlineAudio\n): OfflineAudio = OfflineAudio.Factory.from(onlineAudio)\n\n\n/**\n * 语音编码方式.\n *\n * @since 2.7\n */\n@Serializable(AudioCodec.AsIntSerializer::class)\npublic enum class AudioCodec(\n    public val id: Int,\n    public val formatName: String,\n) {\n    /**\n     * 低音质编码格式\n     */\n    AMR(0, \"amr\"),\n\n    /**\n     * 高音质编码格式\n     */\n    SILK(1, \"silk\");\n\n    public companion object {\n        private val VALUES = values()\n\n        @JvmStatic\n        public fun fromId(id: Int): AudioCodec = VALUES.first { it.id == id }\n\n        @JvmStatic\n        public fun fromFormatName(formatName: String): AudioCodec = VALUES.first { it.formatName == formatName }\n\n        @JvmStatic\n        public fun fromIdOrNull(id: Int): AudioCodec? = VALUES.find { it.id == id }\n\n        @JvmStatic\n        public fun fromFormatNameOrNull(formatName: String): AudioCodec? =\n            VALUES.find { it.formatName == formatName }\n    }\n\n    internal object AsIntSerializer : KSerializer<AudioCodec> by Int.serializer().map(\n        Int.serializer().descriptor,\n        deserialize = { fromId(it) },\n        serialize = { id }\n    )\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/CombinedMessage.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.message.data\n\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.message.data.visitor.RecursiveMessageVisitor\nimport net.mamoe.mirai.message.data.visitor.accept\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n/**\n * 树状消息链的一个节点. [element] 为当前元素, [tail] 为下一个元素.\n *\n * **注意:** 这是内部 API. 不要在任何情况下使用它.\n * [Message.plus] 等连接消息链的 API 已经有性能优化, 会在合适的时机创建 [CombinedMessage], 不需要自行考虑创建 [CombinedMessage].\n *\n * @since 2.12\n */\n@MiraiInternalApi\n@Suppress(\"EXPOSED_SUPER_CLASS\")\npublic class CombinedMessage @MessageChainConstructor constructor(\n    @MiraiInternalApi public val element: Message, // element 和 tail 必须提前处理 constrain single. 见 Message.followedBy\n    @MiraiInternalApi public val tail: Message,\n    @MiraiInternalApi public override val hasConstrainSingle: Boolean\n) : AbstractMessageChain(), List<SingleMessage> {\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitCombinedMessage(this, data)\n    }\n\n    override fun <D> acceptChildren(visitor: MessageVisitor<D, *>, data: D) {\n        element.accept(visitor, data)\n        tail.accept(visitor, data)\n    }\n\n    override val size: Int by lazy {\n        if (slowList.isInitialized()) return@lazy slowList.value.size\n        var size = 0\n        val visitor = object : RecursiveMessageVisitor<Unit>() {\n            override fun visitMessageChain(messageChain: MessageChain, data: Unit) {\n                if (messageChain is DirectSizeAccess) {\n                    size += messageChain.size\n                    return\n                }\n                return super.visitMessageChain(messageChain, data)\n            }\n\n            override fun visitSingleMessage(message: SingleMessage, data: Unit) {\n                size++\n            }\n        }\n        element.accept(visitor)\n        tail.accept(visitor)\n        size\n    }\n\n    override fun isEmpty(): Boolean {\n        if (slowList.isInitialized()) return slowList.value.isEmpty()\n        return element is MessageChain && element.isEmpty() && tail is MessageChain && tail.isEmpty()\n    }\n\n    override fun contains(element: SingleMessage): Boolean {\n        if (slowList.isInitialized()) return slowList.value.contains(element)\n        if (this.element == element) return true\n        if (this.tail == element) return true\n        if (this.element is MessageChain && this.element.contains(element)) return true\n        if (this.tail is MessageChain && this.tail.contains(element)) return true\n        return false\n    }\n\n\n    private val toStringTemp: String by lazy {\n        if (slowList.isInitialized()) return@lazy slowList.value.toString()\n        buildString {\n            accept(object : RecursiveMessageVisitor<Unit>() {\n                override fun visitSingleMessage(message: SingleMessage, data: Unit) {\n                    append(message.toString())\n                }\n\n                override fun visitMessageChain(messageChain: MessageChain, data: Unit) {\n                    if (messageChain is DirectToStringAccess) {\n                        append(messageChain.toString())\n                    } else {\n                        super.visitMessageChain(messageChain, data)\n                    }\n                }\n            })\n        }\n    }\n\n    private val contentToStingTemp: String by lazy {\n        if (slowList.isInitialized()) return@lazy slowList.value.contentToString()\n        buildString {\n            accept(object : RecursiveMessageVisitor<Unit>() {\n                override fun visitSingleMessage(message: SingleMessage, data: Unit) {\n                    append(message.contentToString())\n                }\n\n                override fun visitMessageChain(messageChain: MessageChain, data: Unit) {\n                    if (messageChain is DirectToStringAccess) {\n                        append(messageChain.contentToString())\n                    } else {\n                        super.visitMessageChain(messageChain, data)\n                    }\n                }\n            })\n        }\n    }\n\n    override fun toString(): String = toStringTemp\n    override fun contentToString(): String = contentToStingTemp\n\n    override fun containsAll(elements: Collection<SingleMessage>): Boolean {\n        if (slowList.isInitialized()) return slowList.value.containsAll(elements)\n        if (elements.isEmpty()) return true\n        if (this.isEmpty()) return false\n        val remaining = elements.toMutableList()\n        accept(object : RecursiveMessageVisitor<Unit>() {\n            override fun isFinished(): Boolean = remaining.isEmpty()\n            override fun visitSingleMessage(message: SingleMessage, data: Unit) {\n                remaining.remove(message)\n            }\n        })\n        return remaining.isEmpty()\n    }\n\n    override fun iterator(): Iterator<SingleMessage> {\n        if (slowList.isInitialized()) return slowList.value.iterator()\n        suspend fun SequenceScope<SingleMessage>.yieldMessage(element: Message) {\n            when (element) {\n                is SingleMessage -> {\n                    yield(element)\n                }\n                is MessageChain -> {\n                    yieldAll(element.iterator())\n                }\n            }\n        }\n\n        return iterator {\n            yieldMessage(element)\n            yieldMessage(tail)\n        }\n    }\n\n    override fun subList(fromIndex: Int, toIndex: Int): List<SingleMessage> {\n        if (slowList.isInitialized()) return slowList.value.subList(fromIndex, toIndex)\n        if (fromIndex < 0 || fromIndex > toIndex) throw IndexOutOfBoundsException(\"fromIndex: $fromIndex, toIndex: $toIndex\")\n\n        return buildList {\n            accept(object : RecursiveMessageVisitor<Unit>() {\n                private var currentIndex = 0\n                override fun isFinished(): Boolean = currentIndex >= toIndex\n\n                override fun visitSingleMessage(message: SingleMessage, data: Unit) {\n                    if (isFinished()) return\n                    if (currentIndex >= fromIndex) {\n                        add(message)\n                    }\n                    currentIndex++\n                }\n            })\n        }\n    }\n\n\n    ///////////////////////////////////////////////////////////////////////////\n    // slow operations\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 仅在必要时初始化来优化性能. 基于 [ConstrainSingle] 的情况, 它可能会有立方级别的时间复杂度.\n     */\n    internal val slowList: Lazy<MessageChain> = lazy {\n        sequenceOf(element, tail).toMessageChain()\n    }\n\n    // [MessageChain] implements [RandomAccess] so we should ensure that property here.\n    override fun get(index: Int): SingleMessage = slowList.value[index]\n    override fun indexOf(element: SingleMessage): Int = slowList.value.indexOf(element)\n    override fun lastIndexOf(element: SingleMessage): Int = slowList.value.lastIndexOf(element)\n    override fun listIterator(): ListIterator<SingleMessage> = slowList.value.listIterator()\n    override fun listIterator(index: Int): ListIterator<SingleMessage> = slowList.value.listIterator(index)\n\n\n}\n\ninternal interface DirectSizeAccess : MessageChain\ninternal interface DirectToStringAccess : MessageChain"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/ConstrainSingle.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\n/**\n * 约束一个 [MessageChain] 中只存在这一种类型的元素. 新元素将会替换旧元素, 保持原顺序.\n *\n * 实现此接口的元素将会在连接时自动处理替换.\n *\n * - 要获取有关键的信息, 查看 [MessageKey].\n * - 要获取有关约束的处理方式, 查看 [AbstractPolymorphicMessageKey].\n */\npublic interface ConstrainSingle : SingleMessage {\n    /**\n     * 用于判断是否为同一种元素的 [MessageKey]. 使用多态类型 [MessageKey] 最上层的 [MessageKey].\n     * @see MessageKey 查看更多信息\n     */\n    public val key: MessageKey<*>\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/CustomMessage.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.message.data\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.Json\nimport kotlinx.serialization.protobuf.ProtoBuf\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport net.mamoe.mirai.message.MessageSerializers\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.ConcurrentLinkedDeque\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n/**\n * 自定义消息\n *\n * 它不会显示在消息文本中, 也不会被其他客户端识别.\n * 只有 mirai 才能识别这些消息.\n *\n * 目前在回复时无法通过 [MessageSource.originalMessage] 获取自定义类型消息\n *\n * ## 序列化\n * 若要支持序列化, 需 [MessageSerializers.registerSerializer]\n *\n * @sample samples.CustomMessageIdentifier 实现示例\n *\n * @see CustomMessageMetadata 自定义消息元数据\n * @see MessageSerializers\n */\n@Serializable\n@MiraiExperimentalApi\npublic sealed class CustomMessage : SingleMessage {\n    /**\n     * 获取这个消息的工厂\n     */\n    public abstract fun getFactory(): Factory<out CustomMessage>\n\n    /**\n     * 序列化和反序列化此消息的工厂, 将会自动注册.\n     * 应实现为 `object`.\n     *\n     * @see JsonSerializerFactory 使用 [Json] 作为序列模式的 [Factory]\n     * @see ProtoBufSerializerFactory 使用 [ProtoBuf] 作为序列模式的 [Factory]\n     */\n    @MiraiExperimentalApi\n    public abstract class Factory<M : CustomMessage>(\n        /**\n         * 此类型消息的名称.\n         * 在发往服务器时使用此名称.\n         * 应确保唯一且不变.\n         */\n        public val typeName: String\n    ) {\n\n        init {\n            @Suppress(\"LeakingThis\")\n            register(this)\n        }\n\n        /**\n         * 序列化此消息.\n         */\n        @Throws(Exception::class)\n        public abstract fun dump(message: @UnsafeVariance M): ByteArray\n\n        /**\n         * 从 [input] 读取此消息.\n         */\n        @Throws(Exception::class)\n        public abstract fun load(input: ByteArray): @UnsafeVariance M\n    }\n\n    /**\n     * 使用 [ProtoBuf] 作为序列模式的 [Factory].\n     * 推荐使用此工厂\n     */\n    public abstract class ProtoBufSerializerFactory<M : CustomMessage>(typeName: String) :\n        Factory<M>(typeName) {\n\n        /**\n         * 得到 [M] 的 [KSerializer].\n         */\n        public abstract fun serializer(): KSerializer<M>\n\n        @OptIn(ExperimentalSerializationApi::class)\n        public override fun dump(message: M): ByteArray = ProtoBuf.encodeToByteArray(serializer(), message)\n\n        @OptIn(ExperimentalSerializationApi::class)\n        public override fun load(input: ByteArray): M = ProtoBuf.decodeFromByteArray(serializer(), input)\n    }\n\n    /**\n     * 使用 [Json] 作为序列模式的 [Factory]\n     * 推荐在调试时使用此工厂\n     */\n    public abstract class JsonSerializerFactory<M : CustomMessage>(typeName: String) :\n        Factory<M>(typeName) {\n\n        /**\n         * 得到 [M] 的 [KSerializer].\n         */\n        public abstract fun serializer(): KSerializer<M>\n\n        public open val json: Json = Json.Default\n\n        public override fun dump(message: M): ByteArray = json.encodeToString(serializer(), message).toByteArray()\n        public override fun load(input: ByteArray): M = json.decodeFromString(serializer(), String(input))\n    }\n\n    public companion object {\n        private val factories: MutableCollection<Factory<*>> = ConcurrentLinkedDeque()\n\n        internal fun register(factory: Factory<out CustomMessage>) {\n            factories.removeAll { it::class == factory::class }\n            val exist = factories.firstOrNull { it.typeName == factory.typeName }\n            if (exist != null) {\n                error(\"CustomMessage.Factory typeName ${factory.typeName} is already registered by ${exist::class.qualifiedName}\")\n            }\n            factories.add(factory)\n        }\n\n        @Serializable\n        private class CustomMessageFullData @OptIn(ExperimentalSerializationApi::class) constructor(\n            @ProtoNumber(1) val miraiVersionFlag: Int,\n            @ProtoNumber(2) val typeName: String,\n            @ProtoNumber(3) val data: ByteArray\n        )\n\n        public class CustomMessageFullDataDeserializeInternalException(cause: Throwable?) : RuntimeException(cause)\n        public class CustomMessageFullDataDeserializeUserException(public val body: ByteArray, cause: Throwable?) :\n            RuntimeException(cause)\n\n        @OptIn(ExperimentalSerializationApi::class)\n        @MiraiInternalApi\n        public fun load(fullData: ByteReadPacket): CustomMessage? {\n            val msg = kotlin.runCatching {\n                val length = fullData.readInt()\n                if (fullData.remaining != length.toLong()) {\n                    return null\n                }\n                ProtoBuf.decodeFromByteArray(CustomMessageFullData.serializer(), fullData.readBytes(length))\n            }.getOrElse {\n                throw CustomMessageFullDataDeserializeInternalException(it)\n            }\n            return kotlin.runCatching {\n                when (msg.miraiVersionFlag) {\n                    1 -> factories.firstOrNull { it.typeName == msg.typeName }?.load(msg.data)\n                    else -> null\n                }\n            }.getOrElse {\n                throw CustomMessageFullDataDeserializeUserException(msg.data, it)\n            }\n        }\n\n        @OptIn(ExperimentalSerializationApi::class)\n        @MiraiInternalApi\n        public fun <M : CustomMessage> dump(factory: Factory<M>, message: M): ByteArray = buildPacket {\n            ProtoBuf.encodeToByteArray(\n                CustomMessageFullData.serializer(), CustomMessageFullData(\n                    miraiVersionFlag = 1,\n                    typeName = factory.typeName,\n                    data = factory.dump(message)\n                )\n            ).let { data ->\n                writeInt(data.size)\n                writeFully(data)\n            }\n        }.readBytes()\n    }\n}\n\n/**\n * 序列化这个消息\n */\n@MiraiExperimentalApi\npublic fun <T : CustomMessage> T.toByteArray(): ByteArray {\n    @Suppress(\"UNCHECKED_CAST\")\n    return (this.getFactory() as CustomMessage.Factory<T>).dump(this)\n}\n\n/**\n * 自定义消息元数据.\n *\n * **实现方法**:\n * 1. 实现一个类继承 [CustomMessageMetadata], 添加 `@Serializable` (来自 `kotlinx.serialization`)\n * 2. 添加伴生对象, 继承 [CustomMessage.ProtoBufSerializerFactory] 或 [CustomMessage.JsonSerializerFactory], 或 [CustomMessage.Factory]\n * 3. 在需要解析消息前调用一次伴生对象以注册\n *\n * 注意: 这是实验性 API. 可能会在未来发生变动.\n *\n * @see CustomMessage 查看更多信息\n * @see ConstrainSingle 可实现此接口以保证消息链中只存在一个元素\n */\n@Serializable\n@MiraiExperimentalApi\npublic abstract class CustomMessageMetadata : CustomMessage(), MessageMetadata {\n    public open fun customToString(): ByteArray = customToStringImpl(this.getFactory())\n\n    final override fun toString(): String =\n        \"[mirai:custom:${getFactory().typeName}:${String(customToString())}]\"\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitCustomMessageMetadata(this, data)\n    }\n\n    public companion object\n}\n\n\n@OptIn(MiraiExperimentalApi::class)\ninternal fun <T : CustomMessageMetadata> T.customToStringImpl(factory: CustomMessage.Factory<*>): ByteArray {\n    @Suppress(\"UNCHECKED_CAST\")\n    return (factory as CustomMessage.Factory<T>).dump(this)\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/Deprecated.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.Polymorphic\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.IMirai\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport net.mamoe.mirai.utils.isSameClass\nimport net.mamoe.mirai.utils.safeCast\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\n\n/**\n * 兼容 2.6 以下的 [MessageOrigin]. 请使用 [MessageOrigin]\n * @since 2.3\n * @suppress Deprecated since 2.6\n */\n@Suppress(\"DEPRECATION_ERROR\")\n@Serializable\n@SerialName(RichMessageOrigin.SERIAL_NAME)\n@Deprecated(\n    \"Use MessageOrigin instead.\",\n    replaceWith = ReplaceWith(\n        \"MessageOrigin\",\n        \"net.mamoe.mirai.message.data.MessageOrigin\",\n    ),\n    level = DeprecationLevel.HIDDEN\n)\n@DeprecatedSinceMirai(errorSince = \"2.6\", hiddenSince = \"2.8\")\npublic class RichMessageOrigin\n@Deprecated(\n    \"Use MessageOrigin instead.\",\n    replaceWith = ReplaceWith(\n        \"MessageOrigin(origin, resourceId, kind)\",\n        \"net.mamoe.mirai.message.data.MessageOrigin\",\n    ),\n    level = DeprecationLevel.HIDDEN\n)\n@DeprecatedSinceMirai(errorSince = \"2.6\", hiddenSince = \"2.8\")\nconstructor(\n    /**\n     * 原 [RichMessage].\n     */\n    public val origin: @Polymorphic RichMessage,\n    /**\n     * 如果来自长消息或转发消息, 则会有 [resourceId], 否则为 `null`.\n     *\n     * - 下载长消息 [IMirai.downloadLongMessage]\n     * - 下载合并转发消息 [IMirai.downloadForwardMessage]\n     */\n    public val resourceId: String?,\n    /**\n     * 来源类型\n     */\n    @Suppress(\"DEPRECATION_ERROR\")\n    public val kind: RichMessageKind,\n) : MessageMetadata, ConstrainSingle {\n    @Suppress(\"DEPRECATION_ERROR\")\n    override val key: Key\n        get() = Key\n\n    override fun toString(): String {\n        val resourceId = resourceId\n        return if (resourceId == null) \"[mirai:origin:$kind]\"\n        else \"[mirai:origin:$kind,$resourceId]\"\n    }\n\n    override fun contentToString(): String = \"\"\n\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (other !is RichMessageOrigin || !isSameClass(this, other)) return false\n\n        if (origin != other.origin) return false\n        if (resourceId != other.resourceId) return false\n        if (kind != other.kind) return false\n\n        return true\n    }\n\n    override fun hashCode(): Int {\n        var result = origin.hashCode()\n        result = 31 * result + (resourceId?.hashCode() ?: 0)\n        result = 31 * result + kind.hashCode()\n        return result\n    }\n\n\n    @Deprecated(\n        \"Use MessageOrigin instead.\",\n        replaceWith = ReplaceWith(\n            \"MessageOrigin\",\n            \"net.mamoe.mirai.message.data.MessageOrigin\",\n        ),\n        level = DeprecationLevel.HIDDEN\n    )\n    @DeprecatedSinceMirai(errorSince = \"2.6\", hiddenSince = \"2.8\")\n    @Suppress(\"DEPRECATION_ERROR\")\n    public companion object Key : AbstractMessageKey<RichMessageOrigin>({ it.safeCast() }) {\n        public const val SERIAL_NAME: String = \"RichMessageOrigin\"\n    }\n}\n\n/**\n * 消息来源\n * @since 2.3\n * @suppress Deprecated since 2.6\n */\n@Deprecated(\n    \"Use MessageOriginKind\",\n    ReplaceWith(\"MessageOriginKind\", \"net.mamoe.mirai.message.data.MessageOriginKind\"),\n    level = DeprecationLevel.HIDDEN\n)\n@DeprecatedSinceMirai(errorSince = \"2.6\", hiddenSince = \"2.8\")\npublic enum class RichMessageKind {\n    /**\n     * 长消息\n     */\n    LONG,\n\n    /**\n     * 合并转发\n     * @see ForwardMessage\n     */\n    FORWARD,\n\n    /**\n     * 音乐分享\n     * @see MusicShare\n     * @since 2.4\n     */\n    MUSIC_SHARE,\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/Dice.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\")\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.message.code.CodableMessage\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.annotations.Range\nimport net.mamoe.mirai.utils.safeCast\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmStatic\nimport kotlin.random.Random\nimport kotlin.random.nextInt\n\n/**\n * 骰子.\n *\n * 构造 [Dice] 实例即可使用. 也可以通过 [Dice.random] 获得一个随机点数的实例.\n *\n * @since 2.5\n */\n@Serializable\n@SerialName(Dice.SERIAL_NAME)\npublic data class Dice(\n    /**\n     * 骰子的点数. 范围为 1..6\n     */\n    public val value: @Range(from = 1, to = 6) Int\n) : MarketFace, CodableMessage {\n    init {\n        require(value in 1..6) { \"Dice.value must be in 1 and 6 inclusive.\" }\n    }\n\n    override val name: String\n        get() = \"[骰子:$value]\" // 官方名称应该是 \"[随机骰子]\"\n\n    @MiraiExperimentalApi\n    override val id: Int\n        get() = 11464\n\n    @MiraiExperimentalApi\n    override fun appendMiraiCodeTo(builder: StringBuilder) {\n        builder.append(\"[mirai:dice:\").append(value).append(']')\n    }\n\n    override fun toString(): String = \"[mirai:dice:$value]\"\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitDice(this, data)\n    }\n\n    public companion object Key :\n        AbstractPolymorphicMessageKey<MarketFace, Dice>(MarketFace, { it.safeCast() }) {\n        public const val SERIAL_NAME: String = \"Dice\"\n\n        /**\n         * 创建随机点数的 [骰子][Dice]\n         */\n        @JvmStatic\n        public fun random(): Dice = Dice(Random.nextInt(1..6))\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/Face.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n@file:Suppress(\"MemberVisibilityCanBePrivate\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.message.code.CodableMessage\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport kotlin.jvm.JvmField\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\n/**\n * QQ 自带表情\n *\n * 使用时通过 [Face.JING_YA] 等静态字段得到 ID 然后构造 [Face] 实例.\n *\n * ## mirai 码支持\n * 格式: &#91;mirai:face:*[id]*&#93;\n */\n@Serializable\n@SerialName(Face.SERIAL_NAME)\npublic data class Face(public val id: Int) : // used in delegation\n    MessageContent, CodableMessage {\n\n    public val name: String get() = contentToString().let { it.substring(1, it.length - 1) }\n\n    override fun toString(): String = contentToString()\n    override fun contentToString(): String = names.getOrElse(id) { \"[表情]\" }\n\n    @MiraiExperimentalApi\n    override fun appendMiraiCodeTo(builder: StringBuilder) {\n        builder.append(\"[mirai:face:\").append(id).append(']')\n    }\n\n    override fun equals(other: Any?): Boolean = other is Face && other.id == this.id\n    override fun hashCode(): Int = id\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitFace(this, data)\n    }\n\n    //Auto generated\n    @Suppress(\"NonAsciiCharacters\", \"unused\", \"SpellCheckingInspection\", \"all\", \"ObjectPropertyName\")\n    public companion object {\n        public const val SERIAL_NAME: String = \"Face\"\n\n\n        public const val JING_YA: Int = 0\n        public const val 惊讶: Int = JING_YA\n        public const val PIE_ZUI: Int = 1\n        public const val 撇嘴: Int = PIE_ZUI\n        public const val SE: Int = 2\n        public const val 色: Int = SE\n        public const val FA_DAI: Int = 3\n        public const val 发呆: Int = FA_DAI\n        public const val DE_YI: Int = 4\n        public const val 得意: Int = DE_YI\n        public const val LIU_LEI: Int = 5\n        public const val 流泪: Int = LIU_LEI\n        public const val HAI_XIU: Int = 6\n        public const val 害羞: Int = HAI_XIU\n        public const val BI_ZUI: Int = 7\n        public const val 闭嘴: Int = BI_ZUI\n        public const val SHUI: Int = 8\n        public const val 睡: Int = SHUI\n        public const val DA_KU: Int = 9\n        public const val 大哭: Int = DA_KU\n        public const val GAN_GA: Int = 10\n        public const val 尴尬: Int = GAN_GA\n        public const val FA_NU: Int = 11\n        public const val 发怒: Int = FA_NU\n        public const val TIAO_PI: Int = 12\n        public const val 调皮: Int = TIAO_PI\n        public const val ZI_YA: Int = 13\n        public const val 呲牙: Int = ZI_YA\n        public const val WEI_XIAO: Int = 14\n        public const val 微笑: Int = WEI_XIAO\n        public const val NAN_GUO: Int = 15\n        public const val 难过: Int = NAN_GUO\n        public const val KU: Int = 16\n        public const val 酷: Int = KU\n        public const val ZHUA_KUANG: Int = 18\n        public const val 抓狂: Int = ZHUA_KUANG\n        public const val TU: Int = 19\n        public const val 吐: Int = TU\n        public const val TOU_XIAO: Int = 20\n        public const val 偷笑: Int = TOU_XIAO\n        public const val KE_AI: Int = 21\n        public const val 可爱: Int = KE_AI\n        public const val BAI_YAN: Int = 22\n        public const val 白眼: Int = BAI_YAN\n        public const val AO_MAN: Int = 23\n        public const val 傲慢: Int = AO_MAN\n        public const val JI_E: Int = 24\n        public const val 饥饿: Int = JI_E\n        public const val KUN: Int = 25\n        public const val 困: Int = KUN\n        public const val JING_KONG: Int = 26\n        public const val 惊恐: Int = JING_KONG\n        public const val LIU_HAN: Int = 27\n        public const val 流汗: Int = LIU_HAN\n        public const val HAN_XIAO: Int = 28\n        public const val 憨笑: Int = HAN_XIAO\n        public const val YOU_XIAN: Int = 29\n        public const val 悠闲: Int = YOU_XIAN\n        public const val FEN_DOU: Int = 30\n        public const val 奋斗: Int = FEN_DOU\n        public const val ZHOU_MA: Int = 31\n        public const val 咒骂: Int = ZHOU_MA\n        public const val YI_WEN: Int = 32\n        public const val 疑问: Int = YI_WEN\n        public const val XU: Int = 33\n        public const val 嘘: Int = XU\n        public const val YUN: Int = 34\n        public const val 晕: Int = YUN\n        public const val ZHE_MO: Int = 35\n        public const val 折磨: Int = ZHE_MO\n        public const val SHUAI: Int = 36\n        public const val 衰: Int = SHUAI\n        public const val KU_LOU: Int = 37\n        public const val 骷髅: Int = KU_LOU\n        public const val QIAO_DA: Int = 38\n        public const val 敲打: Int = QIAO_DA\n        public const val ZAI_JIAN: Int = 39\n        public const val 再见: Int = ZAI_JIAN\n        public const val FA_DOU: Int = 41\n        public const val 发抖: Int = FA_DOU\n        public const val AI_QING: Int = 42\n        public const val 爱情: Int = AI_QING\n        public const val TIAO_TIAO: Int = 43\n        public const val 跳跳: Int = TIAO_TIAO\n        public const val ZHU_TOU: Int = 46\n        public const val 猪头: Int = ZHU_TOU\n        public const val YONG_BAO: Int = 49\n        public const val 拥抱: Int = YONG_BAO\n        public const val DAN_GAO: Int = 53\n        public const val 蛋糕: Int = DAN_GAO\n        public const val SHAN_DIAN: Int = 54\n        public const val 闪电: Int = SHAN_DIAN\n        public const val ZHA_DAN: Int = 55\n        public const val 炸弹: Int = ZHA_DAN\n        public const val DAO: Int = 56\n        public const val 刀: Int = DAO\n        public const val ZU_QIU: Int = 57\n        public const val 足球: Int = ZU_QIU\n        public const val BIAN_BIAN: Int = 59\n        public const val 便便: Int = BIAN_BIAN\n        public const val KA_FEI: Int = 60\n        public const val 咖啡: Int = KA_FEI\n        public const val FAN: Int = 61\n        public const val 饭: Int = FAN\n        public const val MEI_GUI: Int = 63\n        public const val 玫瑰: Int = MEI_GUI\n        public const val DIAO_XIE: Int = 64\n        public const val 凋谢: Int = DIAO_XIE\n        public const val AI_XIN: Int = 66\n        public const val 爱心: Int = AI_XIN\n        public const val XIN_SUI: Int = 67\n        public const val 心碎: Int = XIN_SUI\n        public const val LI_WU: Int = 69\n        public const val 礼物: Int = LI_WU\n        public const val TAI_YANG: Int = 74\n        public const val 太阳: Int = TAI_YANG\n        public const val YUE_LIANG: Int = 75\n        public const val 月亮: Int = YUE_LIANG\n        public const val ZAN: Int = 76\n        public const val 赞: Int = ZAN\n        public const val CAI: Int = 77\n        public const val 踩: Int = CAI\n        public const val WO_SHOU: Int = 78\n        public const val 握手: Int = WO_SHOU\n        public const val SHENG_LI: Int = 79\n        public const val 胜利: Int = SHENG_LI\n        public const val FEI_WEN: Int = 85\n        public const val 飞吻: Int = FEI_WEN\n        public const val OU_HUO: Int = 86\n        public const val 怄火: Int = OU_HUO\n        public const val XI_GUA: Int = 89\n        public const val 西瓜: Int = XI_GUA\n        public const val LENG_HAN: Int = 96\n        public const val 冷汗: Int = LENG_HAN\n        public const val CA_HAN: Int = 97\n        public const val 擦汗: Int = CA_HAN\n        public const val KOU_BI: Int = 98\n        public const val 抠鼻: Int = KOU_BI\n        public const val GU_ZHANG: Int = 99\n        public const val 鼓掌: Int = GU_ZHANG\n        public const val QIU_DA_LE: Int = 100\n        public const val 糗大了: Int = QIU_DA_LE\n        public const val HUAI_XIAO: Int = 101\n        public const val 坏笑: Int = HUAI_XIAO\n        public const val ZUO_HENG_HENG: Int = 102\n        public const val 左哼哼: Int = ZUO_HENG_HENG\n        public const val YOU_HENG_HENG: Int = 103\n        public const val 右哼哼: Int = YOU_HENG_HENG\n        public const val HA_QIAN: Int = 104\n        public const val 哈欠: Int = HA_QIAN\n        public const val BI_SHI: Int = 105\n        public const val 鄙视: Int = BI_SHI\n        public const val WEI_QU: Int = 106\n        public const val 委屈: Int = WEI_QU\n        public const val KUAI_KU_LE: Int = 107\n        public const val 快哭了: Int = KUAI_KU_LE\n        public const val YIN_XIAN: Int = 108\n        public const val 阴险: Int = YIN_XIAN\n        public const val QIN_QIN: Int = 109\n        public const val 亲亲: Int = QIN_QIN\n        public const val ZUO_QIN_QIN: Int = QIN_QIN\n        public const val 左亲亲: Int = QIN_QIN\n        public const val XIA: Int = 110\n        public const val 吓: Int = XIA\n        public const val KE_LIAN: Int = 111\n        public const val 可怜: Int = KE_LIAN\n        public const val CAI_DAO: Int = 112\n        public const val 菜刀: Int = CAI_DAO\n        public const val PI_JIU: Int = 113\n        public const val 啤酒: Int = PI_JIU\n        public const val LAN_QIU: Int = 114\n        public const val 篮球: Int = LAN_QIU\n        public const val PING_PANG: Int = 115\n        public const val 乒乓: Int = PING_PANG\n        public const val SHI_AI: Int = 116\n        public const val 示爱: Int = SHI_AI\n        public const val PIAO_CHONG: Int = 117\n        public const val 瓢虫: Int = PIAO_CHONG\n        public const val BAO_QUAN: Int = 118\n        public const val 抱拳: Int = BAO_QUAN\n        public const val GOU_YIN: Int = 119\n        public const val 勾引: Int = GOU_YIN\n        public const val QUAN_TOU: Int = 120\n        public const val 拳头: Int = QUAN_TOU\n        public const val CHA_JIN: Int = 121\n        public const val 差劲: Int = CHA_JIN\n        public const val AI_NI: Int = 122\n        public const val 爱你: Int = AI_NI\n        public const val NO: Int = 123\n        public const val 不: Int = NO\n        public const val BU: Int = NO\n        public const val OK: Int = 124\n        public const val 好: Int = OK\n        public const val HAO: Int = OK\n        public const val ZHUAN_QUAN: Int = 125\n        public const val 转圈: Int = ZHUAN_QUAN\n        public const val KE_TOU: Int = 126\n        public const val 磕头: Int = KE_TOU\n        public const val HUI_TOU: Int = 127\n        public const val 回头: Int = HUI_TOU\n        public const val TIAO_SHENG: Int = 128\n        public const val 跳绳: Int = TIAO_SHENG\n        public const val HUI_SHOU: Int = 129\n        public const val 挥手: Int = HUI_SHOU\n        public const val JI_DONG: Int = 130\n        public const val 激动: Int = JI_DONG\n        public const val JIE_WU: Int = 131\n        public const val 街舞: Int = JIE_WU\n        public const val XIAN_WEN: Int = 132\n        public const val 献吻: Int = XIAN_WEN\n        public const val ZUO_TAI_JI: Int = 133\n        public const val 左太极: Int = ZUO_TAI_JI\n        public const val YOU_TAI_JI: Int = 134\n        public const val 右太极: Int = YOU_TAI_JI\n        public const val SHUANG_XI: Int = 136\n        public const val 双喜: Int = SHUANG_XI\n        public const val BIAN_PAO: Int = 137\n        public const val 鞭炮: Int = BIAN_PAO\n        public const val DENG_LONG: Int = 138\n        public const val 灯笼: Int = DENG_LONG\n        public const val K_GE: Int = 140\n        public const val K歌: Int = K_GE\n        public const val HE_CAI: Int = 144\n        public const val 喝彩: Int = HE_CAI\n        public const val QI_DAO: Int = 145\n        public const val 祈祷: Int = QI_DAO\n        public const val BAO_JIN: Int = 146\n        public const val 爆筋: Int = BAO_JIN\n        public const val BANG_BANG_TANG: Int = 147\n        public const val 棒棒糖: Int = BANG_BANG_TANG\n        public const val HE_NAI: Int = 148\n        public const val 喝奶: Int = HE_NAI\n        public const val FEI_JI: Int = 151\n        public const val 飞机: Int = FEI_JI\n        public const val CHAO_PIAO: Int = 158\n        public const val 钞票: Int = CHAO_PIAO\n        public const val YAO: Int = 168\n        public const val 药: Int = YAO\n        public const val SHOU_QIANG: Int = 169\n        public const val 手枪: Int = SHOU_QIANG\n        public const val CHA: Int = 171\n        public const val 茶: Int = CHA\n        public const val ZHA_YAN_JING: Int = 172\n        public const val 眨眼睛: Int = ZHA_YAN_JING\n        public const val LEI_BEN: Int = 173\n        public const val 泪奔: Int = LEI_BEN\n        public const val WU_NAI: Int = 174\n        public const val 无奈: Int = WU_NAI\n        public const val MAI_MENG: Int = 175\n        public const val 卖萌: Int = MAI_MENG\n        public const val XIAO_JIU_JIE: Int = 176\n        public const val 小纠结: Int = XIAO_JIU_JIE\n        public const val PEN_XIE: Int = 177\n        public const val 喷血: Int = PEN_XIE\n        public const val XIE_YAN_XIAO: Int = 178\n        public const val 斜眼笑: Int = XIE_YAN_XIAO\n        public const val doge: Int = 179\n        public const val JING_XI: Int = 180\n        public const val 惊喜: Int = JING_XI\n        public const val SAO_RAO: Int = 181\n        public const val 骚扰: Int = SAO_RAO\n        public const val XIAO_KU: Int = 182\n        public const val 笑哭: Int = XIAO_KU\n        public const val WO_ZUI_MEI: Int = 183\n        public const val 我最美: Int = WO_ZUI_MEI\n        public const val HE_XIE: Int = 184\n        public const val 河蟹: Int = HE_XIE\n        public const val YANG_TUO: Int = 185\n        public const val 羊驼: Int = YANG_TUO\n        public const val YOU_LING: Int = 187\n        public const val 幽灵: Int = YOU_LING\n        public const val DAN: Int = 188\n        public const val 蛋: Int = DAN\n        public const val JU_HUA: Int = 190\n        public const val 菊花: Int = JU_HUA\n        public const val HONG_BAO: Int = 192\n        public const val 红包: Int = HONG_BAO\n        public const val DA_XIAO: Int = 193\n        public const val 大笑: Int = DA_XIAO\n        public const val BU_KAI_XIN: Int = 194\n        public const val 不开心: Int = BU_KAI_XIN\n        public const val LENG_MO: Int = 197\n        public const val 冷漠: Int = LENG_MO\n        public const val E: Int = 198\n        public const val 呃: Int = E\n        public const val HAO_BANG: Int = 199\n        public const val 好棒: Int = HAO_BANG\n        public const val BAI_TUO: Int = 200\n        public const val 拜托: Int = BAI_TUO\n        public const val DIAN_ZAN: Int = 201\n        public const val 点赞: Int = DIAN_ZAN\n        public const val WU_LIAO: Int = 202\n        public const val 无聊: Int = WU_LIAO\n        public const val TUO_LIAN: Int = 203\n        public const val 托脸: Int = TUO_LIAN\n        public const val CHI: Int = 204\n        public const val 吃: Int = CHI\n        public const val SONG_HUA: Int = 205\n        public const val 送花: Int = SONG_HUA\n        public const val HAI_PA: Int = 206\n        public const val 害怕: Int = HAI_PA\n        public const val HUA_CHI: Int = 207\n        public const val 花痴: Int = HUA_CHI\n        public const val XIAO_YANG_ER: Int = 208\n        public const val 小样儿: Int = XIAO_YANG_ER\n        public const val BIAO_LEI: Int = 210\n        public const val 飙泪: Int = BIAO_LEI\n        public const val WO_BU_KAN: Int = 211\n        public const val 我不看: Int = WO_BU_KAN\n        public const val TUO_SAI: Int = 212\n        public const val 托腮: Int = TUO_SAI\n        public const val BO_BO: Int = 214\n        public const val 啵啵: Int = BO_BO\n        public const val HU_LIAN: Int = 215\n        public const val 糊脸: Int = HU_LIAN\n        public const val PAI_TOU: Int = 216\n        public const val 拍头: Int = PAI_TOU\n        public const val CHE_YI_CHE: Int = 217\n        public const val 扯一扯: Int = CHE_YI_CHE\n        public const val TIAN_YI_TIAN: Int = 218\n        public const val 舔一舔: Int = TIAN_YI_TIAN\n        public const val CENG_YI_CENG: Int = 219\n        public const val 蹭一蹭: Int = CENG_YI_CENG\n        public const val ZHUAI_ZHA_TIAN: Int = 220\n        public const val 拽炸天: Int = ZHUAI_ZHA_TIAN\n        public const val DING_GUA_GUA: Int = 221\n        public const val 顶呱呱: Int = DING_GUA_GUA\n        public const val BAO_BAO: Int = 222\n        public const val 抱抱: Int = BAO_BAO\n        public const val BAO_JI: Int = 223\n        public const val 暴击: Int = BAO_JI\n        public const val KAI_QIANG: Int = 224\n        public const val 开枪: Int = KAI_QIANG\n        public const val LIAO_YI_LIAO: Int = 225\n        public const val 撩一撩: Int = LIAO_YI_LIAO\n        public const val PAI_ZHUO: Int = 226\n        public const val 拍桌: Int = PAI_ZHUO\n        public const val PAI_SHOU: Int = 227\n        public const val 拍手: Int = PAI_SHOU\n        public const val GONG_XI: Int = 228\n        public const val 恭喜: Int = GONG_XI\n        public const val GAN_BEI: Int = 229\n        public const val 干杯: Int = GAN_BEI\n        public const val CHAO_FENG: Int = 230\n        public const val 嘲讽: Int = CHAO_FENG\n        public const val HENG: Int = 231\n        public const val 哼: Int = HENG\n        public const val FO_XI: Int = 232\n        public const val 佛系: Int = FO_XI\n        public const val QIA_YI_QIA: Int = 233\n        public const val 掐一掐: Int = QIA_YI_QIA\n        public const val JING_DAI: Int = 234\n        public const val 惊呆: Int = JING_DAI\n        public const val CHAN_DOU: Int = 235\n        public const val 颤抖: Int = CHAN_DOU\n        public const val KEN_TOU: Int = 236\n        public const val 啃头: Int = KEN_TOU\n        public const val TOU_KAN: Int = 237\n        public const val 偷看: Int = TOU_KAN\n        public const val SHAN_LIAN: Int = 238\n        public const val 扇脸: Int = SHAN_LIAN\n        public const val YUAN_LIANG: Int = 239\n        public const val 原谅: Int = YUAN_LIANG\n        public const val PEN_LIAN: Int = 240\n        public const val 喷脸: Int = PEN_LIAN\n        public const val SHENG_RI_KUAI_LE: Int = 241\n        public const val 生日快乐: Int = SHENG_RI_KUAI_LE\n        public const val TOU_ZHUANG_JI: Int = 242\n        public const val 头撞击: Int = TOU_ZHUANG_JI\n        public const val SHUAI_TOU: Int = 243\n        public const val 甩头: Int = SHUAI_TOU\n        public const val RENG_GOU: Int = 244\n        public const val 扔狗: Int = RENG_GOU\n        public const val JIA_YOU_BI_SHENG: Int = 245\n        public const val 加油必胜: Int = JIA_YOU_BI_SHENG\n        public const val JIA_YOU_BAO_BAO: Int = 246\n        public const val 加油抱抱: Int = JIA_YOU_BAO_BAO\n        public const val KOU_ZHAO_HU_TI: Int = 247\n        public const val 口罩护体: Int = KOU_ZHAO_HU_TI\n        public const val BAN_ZHUAN_ZHONG: Int = 260\n        public const val 搬砖中: Int = BAN_ZHUAN_ZHONG\n        public const val MANG_DAO_FEI_QI: Int = 261\n        public const val 忙到飞起: Int = MANG_DAO_FEI_QI\n        public const val NAO_KUO_TENG: Int = 262\n        public const val 脑阔疼: Int = NAO_KUO_TENG\n        public const val CANG_SANG: Int = 263\n        public const val 沧桑: Int = CANG_SANG\n        public const val WU_LIAN: Int = 264\n        public const val 捂脸: Int = WU_LIAN\n        public const val LA_YAN_JING: Int = 265\n        public const val 辣眼睛: Int = LA_YAN_JING\n        public const val O_YO: Int = 266\n        public const val 哦哟: Int = O_YO\n        public const val TOU_TU: Int = 267\n        public const val 头秃: Int = TOU_TU\n        public const val WEN_HAO_LIAN: Int = 268\n        public const val 问号脸: Int = WEN_HAO_LIAN\n        public const val AN_ZHONG_GUAN_CHA: Int = 269\n        public const val 暗中观察: Int = AN_ZHONG_GUAN_CHA\n        public const val emm: Int = 270\n        public const val CHI_GUA: Int = 271\n        public const val 吃瓜: Int = CHI_GUA\n        public const val HE_HE_DA: Int = 272\n        public const val 呵呵哒: Int = HE_HE_DA\n        public const val WO_SUAN_LE: Int = 273\n        public const val 我酸了: Int = WO_SUAN_LE\n        public const val TAI_NAN_LE: Int = 274\n        public const val 太南了: Int = TAI_NAN_LE\n        public const val LA_JIAO_JIANG: Int = 276\n        public const val 辣椒酱: Int = LA_JIAO_JIANG\n        public const val WANG_WANG: Int = 277\n        public const val 汪汪: Int = WANG_WANG\n        public const val HAN: Int = 278\n        public const val 汗: Int = HAN\n        public const val DA_LIAN: Int = 279\n        public const val 打脸: Int = DA_LIAN\n        public const val JI_ZHANG: Int = 280\n        public const val 击掌: Int = JI_ZHANG\n        public const val WU_YAN_XIAO: Int = 281\n        public const val 无眼笑: Int = WU_YAN_XIAO\n        public const val JING_LI: Int = 282\n        public const val 敬礼: Int = JING_LI\n        public const val KUANG_XIAO: Int = 283\n        public const val 狂笑: Int = KUANG_XIAO\n        public const val MIAN_WU_BIAO_QING: Int = 284\n        public const val 面无表情: Int = MIAN_WU_BIAO_QING\n        public const val MO_YU: Int = 285\n        public const val 摸鱼: Int = MO_YU\n        public const val MO_GUI_XIAO: Int = 286\n        public const val 魔鬼笑: Int = MO_GUI_XIAO\n        public const val O: Int = 287\n        public const val 哦: Int = O\n        public const val QING: Int = 288\n        public const val 请: Int = QING\n        public const val ZHENG_YAN: Int = 289\n        public const val 睁眼: Int = ZHENG_YAN\n        public const val QIAO_KAI_XIN: Int = 290\n        public const val 敲开心: Int = QIAO_KAI_XIN\n        public const val ZHEN_JING: Int = 291\n        public const val 震惊: Int = ZHEN_JING\n        public const val RANG_WO_KANG_KANG: Int = 292\n        public const val 让我康康: Int = RANG_WO_KANG_KANG\n        public const val MO_JIN_LI: Int = 293\n        public const val 摸锦鲤: Int = MO_JIN_LI\n        public const val QI_DAI: Int = 294\n        public const val 期待: Int = QI_DAI\n        public const val NA_DAO_HONG_BAO: Int = 295\n        public const val 拿到红包: Int = NA_DAO_HONG_BAO\n        public const val ZHEN_HAO: Int = 296\n        public const val 真好: Int = ZHEN_HAO\n        public const val BAI_XIE: Int = 297\n        public const val 拜谢: Int = BAI_XIE\n        public const val YUAN_BAO: Int = 298\n        public const val 元宝: Int = YUAN_BAO\n        public const val NIU_A: Int = 299\n        public const val 牛啊: Int = NIU_A\n        public const val PANG_SAN_JIN: Int = 300\n        public const val 胖三斤: Int = PANG_SAN_JIN\n        public const val HAO_SHAN: Int = 301\n        public const val 好闪: Int = HAO_SHAN\n        public const val ZUO_BAI_NIAN: Int = 302\n        public const val 左拜年: Int = ZUO_BAI_NIAN\n        public const val YOU_BAI_NIAN: Int = 303\n        public const val 右拜年: Int = YOU_BAI_NIAN\n        public const val HONG_BAO_BAO: Int = 304\n        public const val 红包包: Int = HONG_BAO_BAO\n        public const val YOU_QIN_QIN: Int = 305\n        public const val 右亲亲: Int = YOU_QIN_QIN\n        public const val NIU_QI_CHONG_TIAN: Int = 306\n        public const val 牛气冲天: Int = NIU_QI_CHONG_TIAN\n        public const val MIAO_MIAO: Int = 307\n        public const val 喵喵: Int = MIAO_MIAO\n        public const val QIU_HONG_BAO: Int = 308\n        public const val 求红包: Int = QIU_HONG_BAO\n        public const val XIE_HONG_BAO: Int = 309\n        public const val 谢红包: Int = XIE_HONG_BAO\n        public const val XIN_NIAN_YAN_HUA: Int = 310\n        public const val 新年烟花: Int = XIN_NIAN_YAN_HUA\n        public const val DA_CALL: Int = 311\n        public const val 打call: Int = DA_CALL\n        public const val BIAN_XING: Int = 312\n        public const val 变形: Int = BIAN_XING\n        public const val KE_DAO_LE: Int = 313\n        public const val 嗑到了: Int = KE_DAO_LE\n        public const val ZI_XI_FEN_XI: Int = 314\n        public const val 仔细分析: Int = ZI_XI_FEN_XI\n        public const val JIA_YOU: Int = 315\n        public const val 加油: Int = JIA_YOU\n        public const val WO_MEI_SHI: Int = 316\n        public const val 我没事: Int = WO_MEI_SHI\n        public const val CAI_GOU: Int = 317\n        public const val 菜狗: Int = CAI_GOU\n        public const val CHONG_BAI: Int = 318\n        public const val 崇拜: Int = CHONG_BAI\n        public const val BI_XIN: Int = 319\n        public const val 比心: Int = BI_XIN\n        public const val QING_ZHU: Int = 320\n        public const val 庆祝: Int = QING_ZHU\n        public const val LAO_SE_PI: Int = 321\n        public const val 老色痞: Int = LAO_SE_PI\n        public const val JU_JUE: Int = 322\n        public const val 拒绝: Int = JU_JUE\n        public const val XIAN_QI: Int = 323\n        public const val 嫌弃: Int = XIAN_QI\n        public const val CHI_TANG: Int = 324\n        public const val 吃糖: Int = CHI_TANG\n        public const val JING_XIA: Int = 325\n        public const val 惊吓: Int = JING_XIA\n        public const val SHENG_QI: Int = 326\n        public const val 生气: Int = SHENG_QI\n        public const val JIA_YI: Int = 327\n        public const val 加一: Int = JIA_YI\n        public const val CUO_HAO: Int = 328\n        public const val 错号: Int = CUO_HAO\n        public const val DUI_HAO: Int = 329\n        public const val 对号: Int = DUI_HAO\n        public const val WAN_CHENG: Int = 330\n        public const val 完成: Int = WAN_CHENG\n        public const val MING_BAI: Int = 331\n        public const val 明白: Int = MING_BAI\n        public const val JU_PAI_PAI: Int = 332\n        public const val 举牌牌: Int = JU_PAI_PAI\n        public const val YAN_HUA: Int = 333\n        public const val 烟花: Int = YAN_HUA\n        public const val HU_HU_SHENG_WEI: Int = 334\n        public const val 虎虎生威: Int = HU_HU_SHENG_WEI\n        public const val BAO_FU: Int = 336\n        public const val 豹富: Int = BAO_FU\n        public const val HUA_DUO_LIAN : Int = 337\n        public const val 花朵脸: Int = HUA_DUO_LIAN\n        public const val WO_XIANG_KAI_LE: Int = 338\n        public const val 我想开了: Int = WO_XIANG_KAI_LE\n        public const val TIAN_PING : Int = 339\n        public const val 舔屏: Int = TIAN_PING\n        public const val RE_HUA_LE: Int = 340\n        public const val 热化了: Int = RE_HUA_LE\n        public const val DA_ZHAO_HU : Int = 341\n        public const val 打招呼: Int = DA_ZHAO_HU\n        public const val SUAN_Q: Int = 342\n        public const val 酸Q: Int = SUAN_Q\n        public const val WO_FANG_LE : Int = 343\n        public const val 我方了: Int = WO_FANG_LE\n        public const val DA_YUAN_ZHONG: Int = 344\n        public const val 大怨种: Int = DA_YUAN_ZHONG\n        public const val HONG_BAO_DUO_DUO: Int = 345\n        public const val 红包多多: Int = HONG_BAO_DUO_DUO\n        public const val NI_ZHEN_BANG_BANG: Int = 346\n        public const val 你真棒棒: Int = NI_ZHEN_BANG_BANG\n        public const val DA_ZHAN_HONG_TU: Int = 347\n        public const val 大展宏兔: Int = DA_ZHAN_HONG_TU\n        public const val FU_LUO_BO: Int = 348\n        public const val 福萝卜: Int = 348\n\n        @JvmField\n        public val names: Array<String> = Array(349) { \"[表情]\" }\n\n        init {\n            names[JING_YA] = \"[惊讶]\"\n            names[PIE_ZUI] = \"[撇嘴]\"\n            names[SE] = \"[色]\"\n            names[FA_DAI] = \"[发呆]\"\n            names[DE_YI] = \"[得意]\"\n            names[LIU_LEI] = \"[流泪]\"\n            names[HAI_XIU] = \"[害羞]\"\n            names[BI_ZUI] = \"[闭嘴]\"\n            names[SHUI] = \"[睡]\"\n            names[DA_KU] = \"[大哭]\"\n            names[GAN_GA] = \"[尴尬]\"\n            names[FA_NU] = \"[发怒]\"\n            names[TIAO_PI] = \"[调皮]\"\n            names[ZI_YA] = \"[呲牙]\"\n            names[WEI_XIAO] = \"[微笑]\"\n            names[NAN_GUO] = \"[难过]\"\n            names[KU] = \"[酷]\"\n            names[ZHUA_KUANG] = \"[抓狂]\"\n            names[TU] = \"[吐]\"\n            names[TOU_XIAO] = \"[偷笑]\"\n            names[KE_AI] = \"[可爱]\"\n            names[BAI_YAN] = \"[白眼]\"\n            names[AO_MAN] = \"[傲慢]\"\n            names[JI_E] = \"[饥饿]\"\n            names[KUN] = \"[困]\"\n            names[JING_KONG] = \"[惊恐]\"\n            names[LIU_HAN] = \"[流汗]\"\n            names[HAN_XIAO] = \"[憨笑]\"\n            names[YOU_XIAN] = \"[悠闲]\"\n            names[FEN_DOU] = \"[奋斗]\"\n            names[ZHOU_MA] = \"[咒骂]\"\n            names[YI_WEN] = \"[疑问]\"\n            names[XU] = \"[嘘]\"\n            names[YUN] = \"[晕]\"\n            names[ZHE_MO] = \"[折磨]\"\n            names[SHUAI] = \"[衰]\"\n            names[KU_LOU] = \"[骷髅]\"\n            names[QIAO_DA] = \"[敲打]\"\n            names[ZAI_JIAN] = \"[再见]\"\n            names[FA_DOU] = \"[发抖]\"\n            names[AI_QING] = \"[爱情]\"\n            names[TIAO_TIAO] = \"[跳跳]\"\n            names[ZHU_TOU] = \"[猪头]\"\n            names[YONG_BAO] = \"[拥抱]\"\n            names[DAN_GAO] = \"[蛋糕]\"\n            names[SHAN_DIAN] = \"[闪电]\"\n            names[ZHA_DAN] = \"[炸弹]\"\n            names[DAO] = \"[刀]\"\n            names[ZU_QIU] = \"[足球]\"\n            names[BIAN_BIAN] = \"[便便]\"\n            names[KA_FEI] = \"[咖啡]\"\n            names[FAN] = \"[饭]\"\n            names[MEI_GUI] = \"[玫瑰]\"\n            names[DIAO_XIE] = \"[凋谢]\"\n            names[AI_XIN] = \"[爱心]\"\n            names[XIN_SUI] = \"[心碎]\"\n            names[LI_WU] = \"[礼物]\"\n            names[TAI_YANG] = \"[太阳]\"\n            names[YUE_LIANG] = \"[月亮]\"\n            names[ZAN] = \"[赞]\"\n            names[CAI] = \"[踩]\"\n            names[WO_SHOU] = \"[握手]\"\n            names[SHENG_LI] = \"[胜利]\"\n            names[FEI_WEN] = \"[飞吻]\"\n            names[OU_HUO] = \"[怄火]\"\n            names[XI_GUA] = \"[西瓜]\"\n            names[LENG_HAN] = \"[冷汗]\"\n            names[CA_HAN] = \"[擦汗]\"\n            names[KOU_BI] = \"[抠鼻]\"\n            names[GU_ZHANG] = \"[鼓掌]\"\n            names[QIU_DA_LE] = \"[糗大了]\"\n            names[HUAI_XIAO] = \"[坏笑]\"\n            names[ZUO_HENG_HENG] = \"[左哼哼]\"\n            names[YOU_HENG_HENG] = \"[右哼哼]\"\n            names[HA_QIAN] = \"[哈欠]\"\n            names[BI_SHI] = \"[鄙视]\"\n            names[WEI_QU] = \"[委屈]\"\n            names[KUAI_KU_LE] = \"[快哭了]\"\n            names[YIN_XIAN] = \"[阴险]\"\n            names[ZUO_QIN_QIN] = \"[左亲亲]\"\n            names[XIA] = \"[吓]\"\n            names[KE_LIAN] = \"[可怜]\"\n            names[CAI_DAO] = \"[菜刀]\"\n            names[PI_JIU] = \"[啤酒]\"\n            names[LAN_QIU] = \"[篮球]\"\n            names[PING_PANG] = \"[乒乓]\"\n            names[SHI_AI] = \"[示爱]\"\n            names[PIAO_CHONG] = \"[瓢虫]\"\n            names[BAO_QUAN] = \"[抱拳]\"\n            names[GOU_YIN] = \"[勾引]\"\n            names[QUAN_TOU] = \"[拳头]\"\n            names[CHA_JIN] = \"[差劲]\"\n            names[AI_NI] = \"[爱你]\"\n            names[NO] = \"[NO]\"\n            names[OK] = \"[OK]\"\n            names[ZHUAN_QUAN] = \"[转圈]\"\n            names[KE_TOU] = \"[磕头]\"\n            names[HUI_TOU] = \"[回头]\"\n            names[TIAO_SHENG] = \"[跳绳]\"\n            names[HUI_SHOU] = \"[挥手]\"\n            names[JI_DONG] = \"[激动]\"\n            names[JIE_WU] = \"[街舞]\"\n            names[XIAN_WEN] = \"[献吻]\"\n            names[ZUO_TAI_JI] = \"[左太极]\"\n            names[YOU_TAI_JI] = \"[右太极]\"\n            names[SHUANG_XI] = \"[双喜]\"\n            names[BIAN_PAO] = \"[鞭炮]\"\n            names[DENG_LONG] = \"[灯笼]\"\n            names[K_GE] = \"[K歌]\"\n            names[HE_CAI] = \"[喝彩]\"\n            names[QI_DAO] = \"[祈祷]\"\n            names[BAO_JIN] = \"[爆筋]\"\n            names[BANG_BANG_TANG] = \"[棒棒糖]\"\n            names[HE_NAI] = \"[喝奶]\"\n            names[FEI_JI] = \"[飞机]\"\n            names[CHAO_PIAO] = \"[钞票]\"\n            names[YAO] = \"[药]\"\n            names[SHOU_QIANG] = \"[手枪]\"\n            names[CHA] = \"[茶]\"\n            names[ZHA_YAN_JING] = \"[眨眼睛]\"\n            names[LEI_BEN] = \"[泪奔]\"\n            names[WU_NAI] = \"[无奈]\"\n            names[MAI_MENG] = \"[卖萌]\"\n            names[XIAO_JIU_JIE] = \"[小纠结]\"\n            names[PEN_XIE] = \"[喷血]\"\n            names[XIE_YAN_XIAO] = \"[斜眼笑]\"\n            names[doge] = \"[doge]\"\n            names[JING_XI] = \"[惊喜]\"\n            names[SAO_RAO] = \"[骚扰]\"\n            names[XIAO_KU] = \"[笑哭]\"\n            names[WO_ZUI_MEI] = \"[我最美]\"\n            names[HE_XIE] = \"[河蟹]\"\n            names[YANG_TUO] = \"[羊驼]\"\n            names[YOU_LING] = \"[幽灵]\"\n            names[DAN] = \"[蛋]\"\n            names[JU_HUA] = \"[菊花]\"\n            names[HONG_BAO] = \"[红包]\"\n            names[DA_XIAO] = \"[大笑]\"\n            names[BU_KAI_XIN] = \"[不开心]\"\n            names[LENG_MO] = \"[冷漠]\"\n            names[E] = \"[呃]\"\n            names[HAO_BANG] = \"[好棒]\"\n            names[BAI_TUO] = \"[拜托]\"\n            names[DIAN_ZAN] = \"[点赞]\"\n            names[WU_LIAO] = \"[无聊]\"\n            names[TUO_LIAN] = \"[托脸]\"\n            names[CHI] = \"[吃]\"\n            names[SONG_HUA] = \"[送花]\"\n            names[HAI_PA] = \"[害怕]\"\n            names[HUA_CHI] = \"[花痴]\"\n            names[XIAO_YANG_ER] = \"[小样儿]\"\n            names[BIAO_LEI] = \"[飙泪]\"\n            names[WO_BU_KAN] = \"[我不看]\"\n            names[TUO_SAI] = \"[托腮]\"\n            names[BO_BO] = \"[啵啵]\"\n            names[HU_LIAN] = \"[糊脸]\"\n            names[PAI_TOU] = \"[拍头]\"\n            names[CHE_YI_CHE] = \"[扯一扯]\"\n            names[TIAN_YI_TIAN] = \"[舔一舔]\"\n            names[CENG_YI_CENG] = \"[蹭一蹭]\"\n            names[ZHUAI_ZHA_TIAN] = \"[拽炸天]\"\n            names[DING_GUA_GUA] = \"[顶呱呱]\"\n            names[BAO_BAO] = \"[抱抱]\"\n            names[BAO_JI] = \"[暴击]\"\n            names[KAI_QIANG] = \"[开枪]\"\n            names[LIAO_YI_LIAO] = \"[撩一撩]\"\n            names[PAI_ZHUO] = \"[拍桌]\"\n            names[PAI_SHOU] = \"[拍手]\"\n            names[GONG_XI] = \"[恭喜]\"\n            names[GAN_BEI] = \"[干杯]\"\n            names[CHAO_FENG] = \"[嘲讽]\"\n            names[HENG] = \"[哼]\"\n            names[FO_XI] = \"[佛系]\"\n            names[QIA_YI_QIA] = \"[掐一掐]\"\n            names[JING_DAI] = \"[惊呆]\"\n            names[CHAN_DOU] = \"[颤抖]\"\n            names[KEN_TOU] = \"[啃头]\"\n            names[TOU_KAN] = \"[偷看]\"\n            names[SHAN_LIAN] = \"[扇脸]\"\n            names[YUAN_LIANG] = \"[原谅]\"\n            names[PEN_LIAN] = \"[喷脸]\"\n            names[SHENG_RI_KUAI_LE] = \"[生日快乐]\"\n            names[TOU_ZHUANG_JI] = \"[头撞击]\"\n            names[SHUAI_TOU] = \"[甩头]\"\n            names[RENG_GOU] = \"[扔狗]\"\n            names[JIA_YOU_BI_SHENG] = \"[加油必胜]\"\n            names[JIA_YOU_BAO_BAO] = \"[加油抱抱]\"\n            names[KOU_ZHAO_HU_TI] = \"[口罩护体]\"\n            names[BAN_ZHUAN_ZHONG] = \"[搬砖中]\"\n            names[MANG_DAO_FEI_QI] = \"[忙到飞起]\"\n            names[NAO_KUO_TENG] = \"[脑阔疼]\"\n            names[CANG_SANG] = \"[沧桑]\"\n            names[WU_LIAN] = \"[捂脸]\"\n            names[LA_YAN_JING] = \"[辣眼睛]\"\n            names[O_YO] = \"[哦哟]\"\n            names[TOU_TU] = \"[头秃]\"\n            names[WEN_HAO_LIAN] = \"[问号脸]\"\n            names[AN_ZHONG_GUAN_CHA] = \"[暗中观察]\"\n            names[emm] = \"[emm]\"\n            names[CHI_GUA] = \"[吃瓜]\"\n            names[HE_HE_DA] = \"[呵呵哒]\"\n            names[WO_SUAN_LE] = \"[我酸了]\"\n            names[TAI_NAN_LE] = \"[太南了]\"\n            names[LA_JIAO_JIANG] = \"[辣椒酱]\"\n            names[WANG_WANG] = \"[汪汪]\"\n            names[HAN] = \"[汗]\"\n            names[DA_LIAN] = \"[打脸]\"\n            names[JI_ZHANG] = \"[击掌]\"\n            names[WU_YAN_XIAO] = \"[无眼笑]\"\n            names[JING_LI] = \"[敬礼]\"\n            names[KUANG_XIAO] = \"[狂笑]\"\n            names[MIAN_WU_BIAO_QING] = \"[面无表情]\"\n            names[MO_YU] = \"[摸鱼]\"\n            names[MO_GUI_XIAO] = \"[魔鬼笑]\"\n            names[O] = \"[哦]\"\n            names[QING] = \"[请]\"\n            names[ZHENG_YAN] = \"[睁眼]\"\n            names[QIAO_KAI_XIN] = \"[敲开心]\"\n            names[ZHEN_JING] = \"[震惊]\"\n            names[RANG_WO_KANG_KANG] = \"[让我康康]\"\n            names[MO_JIN_LI] = \"[摸锦鲤]\"\n            names[QI_DAI] = \"[期待]\"\n            names[NA_DAO_HONG_BAO] = \"[拿到红包]\"\n            names[ZHEN_HAO] = \"[真好]\"\n            names[BAI_XIE] = \"[拜谢]\"\n            names[YUAN_BAO] = \"[元宝]\"\n            names[NIU_A] = \"[牛啊]\"\n            names[PANG_SAN_JIN] = \"[胖三斤]\"\n            names[HAO_SHAN] = \"[好闪]\"\n            names[ZUO_BAI_NIAN] = \"[左拜年]\"\n            names[YOU_BAI_NIAN] = \"[右拜年]\"\n            names[HONG_BAO_BAO] = \"[红包包]\"\n            names[YOU_QIN_QIN] = \"[右亲亲]\"\n            names[NIU_QI_CHONG_TIAN] = \"[牛气冲天]\"\n            names[MIAO_MIAO] = \"[喵喵]\"\n            names[QIU_HONG_BAO] = \"[求红包]\"\n            names[XIE_HONG_BAO] = \"[谢红包]\"\n            names[XIN_NIAN_YAN_HUA] = \"[新年烟花]\"\n            names[DA_CALL] = \"[打call]\"\n            names[BIAN_XING] = \"[变形]\"\n            names[KE_DAO_LE] = \"[嗑到了]\"\n            names[ZI_XI_FEN_XI] = \"[仔细分析]\"\n            names[JIA_YOU] = \"[加油]\"\n            names[WO_MEI_SHI] = \"[我没事]\"\n            names[CAI_GOU] = \"[菜狗]\"\n            names[CHONG_BAI] = \"[崇拜]\"\n            names[BI_XIN] = \"[比心]\"\n            names[QING_ZHU] = \"[庆祝]\"\n            names[LAO_SE_PI] = \"[老色痞]\"\n            names[JU_JUE] = \"[拒绝]\"\n            names[XIAN_QI] = \"[嫌弃]\"\n            names[CHI_TANG] = \"[吃糖]\"\n            names[JING_XIA] = \"[惊吓]\"\n            names[SHENG_QI] = \"[生气]\"\n            names[JIA_YI] = \"[加一]\"\n            names[CUO_HAO] = \"[错号]\"\n            names[DUI_HAO] = \"[对号]\"\n            names[WAN_CHENG] = \"[完成]\"\n            names[MING_BAI] = \"[明白]\"\n            names[JU_PAI_PAI] = \"[举牌牌]\"\n            names[YAN_HUA] = \"[烟花]\"\n            names[YAN_HUA] = \"[烟花]\"\n            names[HU_HU_SHENG_WEI] = \"[虎虎生威]\"\n            names[BAO_FU] = \"[豹富]\"\n            names[HUA_DUO_LIAN] = \"[花朵脸]\"\n            names[WO_XIANG_KAI_LE] = \"[我想开了]\"\n            names[TIAN_PING] = \"[舔屏]\"\n            names[RE_HUA_LE] = \"[热化了]\"\n            names[DA_ZHAO_HU] = \"[打招呼]\"\n            names[SUAN_Q] = \"[酸Q]\"\n            names[WO_FANG_LE] = \"[我方了]\"\n            names[DA_YUAN_ZHONG] = \"[大怨种]\"\n            names[HONG_BAO_DUO_DUO] = \"[红包多多]\"\n            names[NI_ZHEN_BANG_BANG] = \"[你真棒棒]\"\n            names[DA_ZHAN_HONG_TU] = \"[大展宏兔]\"\n            names[FU_LUO_BO] = \"[福萝卜]\"\n        }\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/FileMessage.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.contact.FileSupported\nimport net.mamoe.mirai.contact.file.AbsoluteFile\nimport net.mamoe.mirai.event.events.MessageEvent\nimport net.mamoe.mirai.message.code.CodableMessage\nimport net.mamoe.mirai.message.code.internal.appendStringAsMiraiCode\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.*\n\n/**\n * 文件消息.\n *\n * [name] 与 [size] 只供本地使用, 发送消息时只会使用 [id] 和 [internalId].\n *\n * 注: [FileMessage] 不可二次发送\n *\n * ### 文件操作\n * 要下载这个文件, 可通过 [toAbsoluteFile] 获取到 [AbsoluteFile] 然后操作.\n *\n * 要获取到 [FileMessage], 可以通过 [MessageEvent.message] 获取, 或通过 [AbsoluteFile.toMessage] 得到.\n *\n * @since 2.5\n * @suppress [FileMessage] 的使用是稳定的, 但自行实现不稳定.\n */\n@Serializable(FileMessage.Serializer::class)\n@SerialName(FileMessage.SERIAL_NAME)\n@NotStableForInheritance\n@JvmBlockingBridge\npublic interface FileMessage : MessageContent, ConstrainSingle, CodableMessage {\n    /**\n     * 服务器需要的某种 ID.\n     */\n    public val id: String\n\n    /**\n     * 服务器需要的某种 ID.\n     */\n    public val internalId: Int\n\n    /**\n     * 文件名\n     */\n    public val name: String\n\n    /**\n     * 文件大小 bytes\n     */\n    public val size: Long\n\n    override fun contentToString(): String = \"[文件]$name\" // orthodox\n\n    @MiraiExperimentalApi\n    override fun appendMiraiCodeTo(builder: StringBuilder) {\n        builder.append(\"[mirai:file:\")\n        builder.appendStringAsMiraiCode(id).append(\",\")\n        builder.append(internalId).append(\",\")\n        builder.appendStringAsMiraiCode(name).append(\",\")\n        builder.append(size).append(\"]\")\n    }\n\n    /**\n     * 获取一个对应的 [RemoteFile]. 当目标群或好友不存在这个文件时返回 `null`.\n     */\n    @Suppress(\"DEPRECATION_ERROR\")\n    @Deprecated(\n        \"Please use toAbsoluteFile\",\n        ReplaceWith(\"this.toAbsoluteFile(contact)\"),\n        level = DeprecationLevel.ERROR\n    ) // deprecated since 2.8.0-RC\n    @DeprecatedSinceMirai(warningSince = \"2.8\", errorSince = \"2.14\")\n    public suspend fun toRemoteFile(contact: FileSupported): RemoteFile? {\n        return contact.filesRoot.resolveById(id)\n    }\n\n    /**\n     * 获取一个对应的 [AbsoluteFile]. 当目标群或好友不存在这个文件时返回 `null`.\n     *\n     * @since 2.8\n     */\n    public suspend fun toAbsoluteFile(contact: FileSupported): AbsoluteFile?\n\n    override val key: Key get() = Key\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitFileMessage(this, data)\n    }\n\n    /**\n     * 注意, baseKey [MessageContent] 不稳定. 未来可能会有变更.\n     */\n    public companion object Key :\n        AbstractPolymorphicMessageKey<MessageContent, FileMessage>(\n            MessageContent, { it.safeCast() }) {\n\n        public const val SERIAL_NAME: String = \"FileMessage\"\n\n        /**\n         * 构造 [FileMessage]\n         * @since 2.5\n         */\n        @JvmStatic\n        public fun create(id: String, internalId: Int, name: String, size: Long): FileMessage =\n            Mirai.createFileMessage(id, internalId, name, size)\n    }\n\n\n    public object Serializer :\n        KSerializer<FileMessage> by @OptIn(MiraiInternalApi::class) FallbackFileMessageSerializer()\n}\n\n@MiraiInternalApi\ninternal open class FallbackFileMessageSerializer :\n    KSerializer<FileMessage> by Delegate.serializer().map(\n        Delegate.serializer().descriptor,\n        serialize = { Delegate(id, internalId, name, size) },\n        deserialize = { Mirai.createFileMessage(id, internalId, name, size) },\n    ) {\n    @Suppress(\"ANNOTATION_ARGUMENT_MUST_BE_CONST\")\n    @SerialName(FileMessage.SERIAL_NAME)\n    @Serializable\n    data class Delegate(\n        val id: String,\n        val internalId: Int,\n        val name: String,\n        val size: Long,\n    )\n}\n\n/**\n * 构造 [FileMessage]\n * @since 2.5\n */\n@JvmSynthetic\npublic fun FileMessage(id: String, internalId: Int, name: String, size: Long): FileMessage =\n    FileMessage.create(id, internalId, name, size)"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/FlashImage.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.message.code.CodableMessage\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.safeCast\n\n/**\n * 闪照. 闪照的内容取决于 [image] 代表的图片.\n *\n * ## 构造闪照\n *\n * 需要首先获得普通图片才能构造闪照. 详见 [Image].\n *\n * - 使用 [FlashImage.from] 将普通图片转换为闪照.\n * - 在 Kotlin 使用类构造器顶层函数 `FlashImage(image)`.\n * - 在 Kotlin 使用扩展 [Image.flash].\n *\n * ## 获得闪照代表的原图片\n *\n * 访问属性 [FlashImage.image]\n *\n * ## mirai 码支持\n * 格式: &#91;mirai:flash:*[Image.imageId]*&#93;\n *\n * @see Image 查看图片相关信息\n */\n@OptIn(MiraiExperimentalApi::class)\n@Serializable\n@SerialName(FlashImage.SERIAL_NAME)\npublic data class FlashImage(\n    /**\n     * 闪照的内容图片, 即一个普通图片.\n     */\n    @SerialName(\"imageId\")\n    @Serializable(Image.AsStringSerializer::class)\n    public val image: Image\n) : MessageContent, HummerMessage, CodableMessage, ConstrainSingle {\n    override val key: MessageKey<FlashImage> get() = Key\n\n    private val stringValue: String by lazy(LazyThreadSafetyMode.NONE) { \"[mirai:flash:${image.imageId}]\" }\n\n    @MiraiExperimentalApi\n    override fun appendMiraiCodeTo(builder: StringBuilder) {\n        builder.append(stringValue)\n    }\n\n    override fun serializeToMiraiCode(): String = stringValue\n    override fun toString(): String = stringValue\n    override fun contentToString(): String = \"[闪照]\"\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitFlashImage(this, data)\n    }\n\n    public companion object Key :\n        AbstractPolymorphicMessageKey<HummerMessage, FlashImage>(HummerMessage, { it.safeCast() }) {\n        public const val SERIAL_NAME: String = \"FlashImage\"\n\n        /**\n         * 将普通图片转换为闪照.\n         *\n         * @param imageId 图片 id, 详见 [Image.imageId]\n         */\n        @JvmStatic\n        public fun from(imageId: String): FlashImage = FlashImage(Image(imageId))\n\n        /**\n         * 将普通图片转换为闪照.\n         *\n         * @see Image.flash\n         */\n        @JvmStatic\n        public inline fun from(image: Image): FlashImage = FlashImage(image)\n    }\n}\n\n/**\n * 将普通图片转换为闪照.\n */\n@JvmSynthetic\npublic inline fun FlashImage(imageId: String): FlashImage = FlashImage.from(imageId)\n\n/**\n * 将普通图片转换为闪照.\n */\n@JvmSynthetic\npublic inline fun Image.flash(): FlashImage = FlashImage(this)"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/ForwardMessage.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"MemberVisibilityCanBePrivate\", \"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\", \"unused\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.event.events.MessageEvent\nimport net.mamoe.mirai.message.data.ForwardMessage.DisplayStrategy\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.*\nimport kotlin.jvm.JvmOverloads\nimport kotlin.jvm.JvmSynthetic\n\n/**\n * 未通过 [DisplayStrategy] 渲染的合并转发消息. [RawForwardMessage] 仅作为一个中间件, 用于 [ForwardMessageBuilder].\n *\n * [RawForwardMessage] 可以序列化保存, 也可以被多次[渲染][RawForwardMessage.render]产生不同格式的 [ForwardMessage].\n */\n@Serializable\npublic data class RawForwardMessage(\n    /**\n     * 消息列表\n     */\n    val nodeList: List<ForwardMessage.Node>\n) {\n    /**\n     * 渲染这个 [RawForwardMessage] 并产生可以发送的 [ForwardMessage]\n     */\n    public fun render(displayStrategy: DisplayStrategy): ForwardMessage = ForwardMessage(\n        preview = displayStrategy.generatePreview(this),\n        title = displayStrategy.generateTitle(this),\n        brief = displayStrategy.generateBrief(this),\n        source = displayStrategy.generateSource(this),\n        summary = displayStrategy.generateSummary(this),\n        nodeList = nodeList,\n    )\n}\n\n/**\n * 合并转发消息\n *\n *\n *\n * ## 显示方案\n *\n * ### 移动端\n * 在移动客户端将会显示为卡片\n *\n * - `<title>`: [DisplayStrategy.generateTitle]\n * - `<preview>`: [DisplayStrategy.generatePreview]\n * - `<summary>`: [DisplayStrategy.generateSummary]\n *\n * ```\n * |-------------------------|\n * | <title>                 |\n * | <preview>               |\n * |-------------------------|\n * | <summary>               |\n * |-------------------------|\n * ```\n *\n * 默认显示方案:\n * ```\n * |-------------------------|\n * | 群聊的聊天记录             |\n * | <消息 1>                 |\n * | <消息 2>                 |\n * | <消息 3>                 |\n * |-------------------------|\n * | 查看3条转发消息          |\n * |-------------------------|\n * ```\n *\n * ### PC 端\n * 在部分 PC 端显示为类似移动端的卡片, 在其他 PC 端显示为以下格式\n * ```\n * 鸽子 A 2020/04/23 11:27:54\n * 咕\n * 鸽子 B 2020/04/23 11:27:55\n * 咕\n * 鸽子 C 1970/01/01 08:00:00\n * 咕咕咕\n * ```\n *\n *\n * ## 构造\n * - 使用构建器 [ForwardMessageBuilder]\n * - 使用 [DSL][buildForwardMessage]\n * - 通过 [MessageEvent] 集合转换: [toForwardMessage]\n *\n * @see buildForwardMessage\n */\n@SerialName(ForwardMessage.SERIAL_NAME)\n@Serializable\npublic data class ForwardMessage(\n    val preview: List<String>,\n    val title: String,\n    val brief: String,\n    val source: String,\n    val summary: String,\n    val nodeList: List<Node>,\n) : MessageContent, ConstrainSingle {\n    override val key: MessageKey<ForwardMessage> get() = Key\n\n    override fun contentToString(): String = \"[转发消息]\"\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitForwardMessage(this, data)\n    }\n\n    // use data-class generated toString()\n\n\n    /**\n     * 合并转发卡片展示策略. 用于 [RawForwardMessage] 的 [渲染][RawForwardMessage.render].\n     *\n     * @see ForwardMessage\n     */\n    public interface DisplayStrategy {\n        /**\n         * 修改后卡片标题会变为 \"转发的聊天记录\", 而此函数的返回值会显示在 preview 前\n         */\n        public fun generateTitle(forward: RawForwardMessage): String = \"群聊的聊天记录\"\n\n        /**\n         * 显示在消息列表中的预览.\n         */\n        public fun generateBrief(forward: RawForwardMessage): String = \"[聊天记录]\"\n\n        /**\n         * 目前未发现在哪能显示\n         */\n        public fun generateSource(forward: RawForwardMessage): String = \"聊天记录\"\n\n        /**\n         * 显示在卡片 body 中, 只会显示 sequence 前四个元素.\n         */\n        public fun generatePreview(forward: RawForwardMessage): List<String> =\n            forward.nodeList.map { it.senderName + \": \" + it.messageChain.contentToString() }\n\n        /**\n         * 显示在卡片底部\n         */\n        public fun generateSummary(forward: RawForwardMessage): String = \"查看${forward.nodeList.size}条转发消息\"\n\n        /**\n         * 默认的, 与官方客户端相似的展示方案.\n         */\n        public companion object Default : DisplayStrategy\n    }\n\n\n    /**\n     * 消息节点\n     */\n    @OptIn(MiraiExperimentalApi::class)\n    @Serializable\n    public data class Node(\n        /**\n         * 发送人 [User.id]\n         */\n        override val senderId: Long,\n        /**\n         * 时间戳 秒\n         */\n        override val time: Int,\n        /**\n         * 发送人昵称\n         */\n        override val senderName: String,\n        /**\n         * 消息内容\n         */\n        override val messageChain: MessageChain\n    ) : INode {\n        public constructor(\n            senderId: Long,\n            time: Int,\n            senderName: String,\n            message: Message\n        ) : this(senderId, time, senderName, message.toMessageChain())\n    }\n\n    /**\n     * 请构造 [Node]\n     */\n    @MiraiExperimentalApi\n    public interface INode {\n        /**\n         * 发送人 [User.id]\n         */\n        public val senderId: Long\n\n        /**\n         * 时间戳秒\n         */\n        public val time: Int\n\n        /**\n         * 发送人名称\n         */\n        public val senderName: String\n\n        /**\n         * 消息内容\n         */\n        public val messageChain: MessageChain\n    }\n\n    public companion object Key :\n        AbstractPolymorphicMessageKey<MessageContent, ForwardMessage>(MessageContent, { it.safeCast() }) {\n        public const val SERIAL_NAME: String = \"ForwardMessage\"\n    }\n}\n\n\n/**\n * 转换为 [ForwardMessage]\n */\n@JvmOverloads\npublic fun Iterable<MessageEvent>.toForwardMessage(displayStrategy: DisplayStrategy = DisplayStrategy): ForwardMessage {\n    val iterator = this.iterator()\n    if (!iterator.hasNext()) return RawForwardMessage(emptyList()).render(displayStrategy)\n    return RawForwardMessage(\n        this.map { ForwardMessage.Node(it.sender.id, it.time, it.senderName, it.message) }\n    ).render(displayStrategy)\n}\n\n/**\n * 转换为 [ForwardMessage]\n */\n@JvmOverloads\npublic fun Message.toForwardMessage(\n    sender: User,\n    time: Int = currentTimeSeconds().toInt(),\n    displayStrategy: DisplayStrategy = DisplayStrategy\n): ForwardMessage = this.toForwardMessage(sender.id, sender.nameCardOrNick, time, displayStrategy)\n\n/**\n * 转换为 [ForwardMessage]\n */\n@JvmOverloads\npublic fun Message.toForwardMessage(\n    senderId: Long,\n    senderName: String,\n    time: Int = currentTimeSeconds().toInt(),\n    displayStrategy: DisplayStrategy = DisplayStrategy\n): ForwardMessage =\n    RawForwardMessage(listOf(ForwardMessage.Node(senderId, time, senderName, this))).render(displayStrategy)\n\n/**\n * 构造一条 [ForwardMessage]\n *\n * @see ForwardMessageBuilder 查看 DSL 帮助\n * @see ForwardMessage 查看转发消息说明\n */\n@JvmSynthetic\npublic inline fun buildForwardMessage(\n    context: Contact,\n    displayStrategy: DisplayStrategy = DisplayStrategy,\n    block: ForwardMessageBuilder.() -> Unit\n): ForwardMessage = ForwardMessageBuilder(context).apply { this.displayStrategy = displayStrategy }.apply(block).build()\n\n/**\n * 使用 DSL 构建一个 [ForwardMessage].\n *\n * @see ForwardMessageBuilder 查看 DSL 帮助\n * @see ForwardMessage 查看转发消息说明\n */\n@JvmSynthetic\npublic inline fun MessageEvent.buildForwardMessage(\n    context: Contact = this.subject,\n    displayStrategy: DisplayStrategy = DisplayStrategy,\n    block: ForwardMessageBuilder.() -> Unit\n): ForwardMessage = ForwardMessageBuilder(context).apply {\n    this.displayStrategy = displayStrategy\n}.apply(block).build()\n\n/**\n * 标记转发消息 DSL\n */\n@Target(AnnotationTarget.FUNCTION, AnnotationTarget.TYPE)\n@DslMarker\npublic annotation class ForwardMessageDsl\n\n/**\n * 转发消息 DSL 构建器.\n *\n * # 总览\n *\n *\n * 在 Java 使用一般方法添加消息构建转发:\n * ```\n * ForwardMessageBuilder builder = new ForwardMessageBuilder(group);\n *\n * builder.add(123456L, \"群员A\", new PlainText(\"消息\"))\n * builder.add(user, new PlainText(\"msg\"));\n * builder.add(user, (chain) -> {\n *     chain.add(new At(user));\n *     chain.add(new PlainText(\"Hello\"))\n * }); // 使用 Java 8 lambda 语法, MessageChainBuilder 快速构建消息链\n * builder.add(event); // 可添加 MessageEvent\n *\n * builder.setDisplayStrategy(new ForwardMessage.DisplayStrategy() {\n * }); // 可选, 修改显示策略\n *\n * ForwardMessage forward = builder.build();\n * group.sendMessage(forward);\n * ```\n *\n * 在 Kotlin 使用一般方法添加消息构建转发:\n * ```\n * val forward: ForwardMessage = buildForwardMessage {\n *     add(123456L, \"群员A\", PlainText(\"消息\"))\n *     add(user, PlainText(\"msg\"))\n *     add(user) {\n *         // this: MessageChainBuilder\n *         add(At(user))\n *         add(PlainText(\"msg\"))\n *     };\n *     add(event) // 可添加 MessageEvent\n * }\n *\n * group.sendMessage(forward);\n * friend.sendMessage(forward);\n * ```\n *\n * 在 Kotlin 也可以使用 DSL 构建一个转发:\n * ```\n * buildForwardMessage {\n *     123456789 named \"鸽子 A\" says \"咕\" // 意为 名为 \"鸽子 A\" 的用户 123456789 发送了一条内容为 \"咕\" 的消息\n *     100200300 named \"鸽子 C\" at 1582315452 says \"咕咕咕\" // at 设置时间 (在 PC 端显示, 在手机端不影响顺序)\n *     987654321 named \"鸽子 B\" says \"咕\" // 未指定时间, 则自动顺序安排时间\n *     myFriend says \"咕\" // User.says\n *     bot says { // 构造消息链, 同 `buildMessageChain`\n *         add(\"发个图片试试\")\n *         add(Image(\"{90CCED1C-2D64-313B-5D66-46625CAB31D7}.jpg\"))\n *     }\n *     val member: Member = ...\n *     member says \"我是幸运群员\" // 使用 `User says` 则会同时设置发送人名称\n * }\n * ```\n * DSL 语法在下文详细解释.\n *\n * 上述示例效果一样, 根据个人偏好选择.\n *\n * # Kotlin DSL 语法\n *\n * 下文中 `S` 代表消息发送人. 可接受: 发送人账号 id([Long] 或 [Int]) 或 [User]\n *\n * 下文中 `M` 代表消息内容. 可接受: [String], [Message], 或 [构造消息链][MessageChainBuilder] 的 DSL 代码块\n *\n * ## 陈述一条消息\n * 使用 [`infix fun S.says(M)`][ForwardMessageBuilder.says]\n *\n * 语句 `123456789 named \"鸽子 A\" says \"咕\"` 创建并添加了一条名为 \"鸽子 A\" 的用户 123456789 发送的内容为 \"咕\" 的消息\n *\n *\n * ### 陈述\n * 一条 '陈述' 必须包含以下属性:\n * - 发送人. 只可以作为 infix 函数的接收者 (receiver) 设置, 如 `sender says M`, `sender named \"xxx\"`, `sender at 123`\n * - 消息内容. 只可以通过 `says` 函数的参数设置, 即 `says M`.\n *\n * ### 组合陈述\n * 现支持的可选属性为 `named`, `at`\n *\n *\n * 最基础的陈述为 `S says M`. 可在 `says` 前按任意顺序添加组合属性:\n *\n * `S named \"xxx\" says M`;\n *\n * `S at 123456 says M`; 其中 `123456` 为发信时间\n *\n *\n * 属性的顺序并不重要. 如下两句陈述效果相同.\n *\n * `S named \"xxx\" at 123456 says M`;\n *\n * `S at 123456 named \"xxx\" says M`;\n *\n * ### 重复属性\n * 若属性有重复, **新属性会替换旧属性**.\n *\n * `S named \"name1\" named \"name2\" says M` 最终的发送人名称为 `\"name2\"`\n */\n@OptIn(MiraiExperimentalApi::class)\npublic class ForwardMessageBuilder private constructor(\n    /**\n     * 消息语境. 可为 [Group] 或 [User]. 用来确定某 ID 的用户的昵称.\n     */\n    public val context: Contact,\n    private val container: MutableList<ForwardMessage.INode>\n) : MutableList<ForwardMessage.INode> by container {\n    /**\n     * @see RawForwardMessage.render\n     */\n    public var displayStrategy: DisplayStrategy = DisplayStrategy\n\n    private var built: Boolean = false\n    private fun checkBuilt() {\n        check(!built) { \"ForwardMessageBuilder is already built therefore can't be modified\" }\n    }\n\n    public constructor(context: Contact) : this(context, mutableListOf())\n    public constructor(context: Contact, initialSize: Int) : this(context, ArrayList<ForwardMessage.INode>(initialSize))\n\n    /**\n     * 当前时间.\n     * 在使用 [says] 时若不指定时间, 则会使用 [currentTime] 自增 1 的时间.\n     */\n    public var currentTime: Int = currentTimeSeconds().toInt()\n\n    public inner class BuilderNode internal constructor() : ForwardMessage.INode {\n\n        /**\n         * 发送人 [User.id]\n         */\n        public override var senderId: Long = 0\n\n        /**\n         * 时间戳秒\n         */\n        public override var time: Int = currentTime++\n\n        /**\n         * 发送人名称\n         */\n        public override var senderName: String = \"\"\n\n        /**\n         * 消息内容\n         */\n        public override lateinit var messageChain: MessageChain\n\n\n        /**\n         * 指定发送人 id 和名称.\n         */\n        @ForwardMessageDsl\n        public infix fun sender(user: User): BuilderNode =\n            apply { this.senderId(user.id); this.named(user.nameCardOrNick) }\n\n        /**\n         * 指定发送人 id 和名称.\n         * @since 2.6\n         */\n        @ForwardMessageDsl\n        public infix fun sender(user: UserOrBot): BuilderNode =\n            apply { this.senderId(user.id); this.named(user.nameCardOrNick) }\n\n        /**\n         * 指定发送人 id.\n         */\n        @ForwardMessageDsl\n        public infix fun senderId(id: Int): BuilderNode = apply { this.senderId = id.toLongUnsigned() }\n\n        /**\n         * 指定发送人 id.\n         */\n        @ForwardMessageDsl\n        public infix fun senderId(id: Long): BuilderNode = apply { this.senderId = id }\n\n        /**\n         * 指定发送人名称.\n         */\n        @ForwardMessageDsl\n        public infix fun named(name: String): BuilderNode = apply { this.senderName = name }\n\n        /**\n         * 指定发送人名称.\n         */\n        @ForwardMessageDsl\n        public infix fun senderName(name: String): BuilderNode = apply { this.senderName = name }\n\n        /**\n         * 指定时间.\n         * @time 时间戳, 单位为秒\n         */\n        @ForwardMessageDsl\n        public infix fun at(time: Int): BuilderNode = this.apply { this.time = time }\n\n        /**\n         * 指定时间.\n         * @time 时间戳, 单位为秒\n         */\n        @ForwardMessageDsl\n        public infix fun time(time: Int): BuilderNode = this.apply { this.time = time }\n\n        /**\n         * 指定消息内容\n         */\n        @ForwardMessageDsl\n        public infix fun message(message: Message): BuilderNode =\n            this.apply { this.messageChain = message.toMessageChain() }\n\n        /**\n         * 指定消息内容\n         */\n        @ForwardMessageDsl\n        public infix fun message(message: String): BuilderNode =\n            this.apply { this.messageChain = PlainText(message).toMessageChain() }\n\n        /** 添加一条消息  */\n        @ForwardMessageDsl\n        public infix fun says(message: Message): ForwardMessageBuilder = this@ForwardMessageBuilder.apply {\n            checkBuilt()\n            this@BuilderNode.messageChain = message.toMessageChain()\n            add(this@BuilderNode)\n        }\n\n        /** 添加一条消息  */\n        @ForwardMessageDsl\n        public infix fun says(message: String): ForwardMessageBuilder = this.says(PlainText(message))\n\n        /** 构造并添加一个 [MessageChain] */\n        @ForwardMessageDsl\n        public inline infix fun says(chain: @ForwardMessageDsl MessageChainBuilder.() -> Unit): ForwardMessageBuilder =\n            says(MessageChainBuilder().apply(chain).asMessageChain())\n\n        override fun toString(): String {\n            return \"BuilderNode(senderId=$senderId, time=$time, senderName='$senderName', messageChain=$messageChain)\"\n        }\n    }\n\n    // region general `says`\n\n    /** 添加一条消息, 自动按顺序调整时间  */\n    @ForwardMessageDsl\n    public infix fun Long.says(message: String): ForwardMessageBuilder = says(PlainText(message))\n\n    /** 添加一条消息, 自动按顺序调整时间  */\n    @ForwardMessageDsl\n    public infix fun Int.says(message: String): ForwardMessageBuilder =\n        this.toLong().and(0xFFFF_FFFF).says(PlainText(message))\n\n    /** 添加一条消息, 自动按顺序调整时间 */\n    @ForwardMessageDsl\n    public infix fun Long.says(message: Message): ForwardMessageBuilder =\n        this@ForwardMessageBuilder.apply {\n            checkBuilt()\n            add(BuilderNode().apply {\n                senderId = this@says\n                this.messageChain = message.toMessageChain()\n            })\n        }\n\n    /** 添加一条消息, 自动按顺序调整时间  */\n    @ForwardMessageDsl\n    public infix fun Int.says(message: Message): ForwardMessageBuilder = this.toLong().and(0xFFFF_FFFF).says(message)\n\n    /** 构造并添加一个 [MessageChain], 自动按顺序调整时间 */\n    @ForwardMessageDsl\n    public inline infix fun Long.says(chain: @ForwardMessageDsl MessageChainBuilder.() -> Unit): ForwardMessageBuilder =\n        says(MessageChainBuilder().apply(chain).asMessageChain())\n\n    /** 添加一条消息, 自动按顺序调整时间  */\n    @ForwardMessageDsl\n    public inline infix fun Int.says(chain: @ForwardMessageDsl MessageChainBuilder.() -> Unit): ForwardMessageBuilder =\n        this.toLong().and(0xFFFF_FFFF).says(chain)\n\n\n    /** 添加一条消息, 自动按顺序调整时间 */\n    @ForwardMessageDsl\n    public infix fun Bot.says(message: String): ForwardMessageBuilder = this.id named this.smartName() says message\n\n    /** 添加一条消息, 自动按顺序调整时间 */\n    @ForwardMessageDsl\n    public infix fun User.says(message: String): ForwardMessageBuilder = this.id named this.nameCardOrNick says message\n\n    /** 添加一条消息, 自动按顺序调整时间 */\n    @ForwardMessageDsl\n    public infix fun User.says(message: Message): ForwardMessageBuilder = this.id named this.nameCardOrNick says message\n\n    /**\n     * 添加一条消息, 自动按顺序调整时间\n     * @since 2.6\n     */\n    @ForwardMessageDsl\n    public infix fun UserOrBot.says(message: Message): ForwardMessageBuilder =\n        this.id named this.nameCardOrNick says message\n\n    /** 添加一条消息, 自动按顺序调整时间 */\n    @ForwardMessageDsl\n    public infix fun Bot.says(message: Message): ForwardMessageBuilder = this.id named this.smartName() says message\n\n    /** 构造并添加一个 [MessageChain], 自动按顺序调整时间 */\n    @ForwardMessageDsl\n    public inline infix fun User.says(chain: @ForwardMessageDsl MessageChainBuilder.() -> Unit): ForwardMessageBuilder =\n        this says (MessageChainBuilder().apply(chain).asMessageChain())\n\n    /**\n     * 构造并添加一个 [MessageChain], 自动按顺序调整时间\n     * @since 2.6\n     */\n    @ForwardMessageDsl\n    public inline infix fun UserOrBot.says(chain: @ForwardMessageDsl MessageChainBuilder.() -> Unit): ForwardMessageBuilder =\n        this says (MessageChainBuilder().apply(chain).asMessageChain())\n\n    /** 构造并添加一个 [MessageChain], 自动按顺序调整时间 */\n    @ForwardMessageDsl\n    public inline infix fun Bot.says(chain: @ForwardMessageDsl MessageChainBuilder.() -> Unit): ForwardMessageBuilder =\n        this says (MessageChainBuilder().apply(chain).asMessageChain())\n\n    // endregion\n\n\n    // region timed\n\n    /**\n     * 为一条消息指定时间.\n     * @time 时间戳, 单位为秒\n     */\n    @ForwardMessageDsl\n    public infix fun Int.at(time: Int): BuilderNode = this.toLongUnsigned() at time\n\n    /**\n     * 为一条消息指定时间.\n     * @time 时间戳, 单位为秒\n     */\n    @ForwardMessageDsl\n    public infix fun Long.at(time: Int): BuilderNode = BuilderNode().apply { senderId = this@at;this.time = time }\n\n    /**\n     * 为一条消息指定时间和发送人名称.\n     * @time 时间戳, 单位为秒\n     */\n    @ForwardMessageDsl\n    public infix fun User.at(time: Int): BuilderNode = this.id named this.nameCardOrNick at time\n\n    /**\n     * 为一条消息指定时间和发送人名称.\n     * @time 时间戳, 单位为秒\n     * @since 2.6\n     */\n    @ForwardMessageDsl\n    public infix fun UserOrBot.at(time: Int): BuilderNode = this.id named this.nameCardOrNick at time\n\n    // endregion\n\n\n    // region named\n\n    /** 为一条消息指定发送人名称. */\n    @ForwardMessageDsl\n    public infix fun Int.named(name: String): BuilderNode = this.toLongUnsigned().named(name)\n\n    /** 为一条消息指定发送人名称. */\n    @ForwardMessageDsl\n    public infix fun Long.named(name: String): BuilderNode =\n        BuilderNode().apply { senderId = this@named;this.senderName = name }\n\n    /** 为一条消息指定发送人名称. */\n    @ForwardMessageDsl\n    public infix fun User.named(name: String): BuilderNode = this.id.named(name)\n\n    /**\n     * 为一条消息指定发送人名称.\n     * @since 2.6\n     */\n    @ForwardMessageDsl\n    public infix fun UserOrBot.named(name: String): BuilderNode = this.id.named(name)\n\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n    @kotlin.internal.LowPriorityInOverloadResolution // due to inference problem, `add(MessageEvent)` results in resolution ambiguity\n    override fun add(element: ForwardMessage.INode): Boolean = container.add(element)\n\n    /**\n     * 从消息事件添加一个消息\n     *\n     * `event.sender named event.senderName at event.time says event.message`\n     *\n     * @since 2.1\n     */\n    public fun add(event: MessageEvent): ForwardMessageBuilder {\n        return event.sender named event.senderName at event.time says event.message\n    }\n\n    // endregion\n\n    // region common\n\n    /**\n     * 添加一个消息. 若不指定 [time], 将会使用 [currentTime] 自增 1 的时间.\n     * @since 2.6\n     */\n    @JvmOverloads\n    public fun add(sender: User, message: Message, time: Int = -1): ForwardMessageBuilder {\n        return if (time == -1) sender says message\n        else sender at time says message\n    }\n\n    /**\n     * 添加一个消息. 若不指定 [time], 将会使用 [currentTime] 自增 1 的时间.\n     * @since 2.6\n     */\n    @JvmOverloads\n    public fun add(sender: UserOrBot, message: Message, time: Int = -1): ForwardMessageBuilder {\n        return if (time == -1) sender says message\n        else sender at time says message\n    }\n\n    /**\n     * 添加一个消息. 若不指定 [time], 将会使用 [currentTime] 自增 1 的时间.\n     * @since 2.6\n     */\n    @JvmOverloads\n    public fun add(senderId: Long, senderName: String, message: Message, time: Int = -1): ForwardMessageBuilder {\n        return if (time == -1) senderId named senderName says message\n        else senderId named senderName at time says message\n    }\n\n    /**\n     * 构建并添加一个消息. 若不指定 [time], 将会使用 [currentTime] 自增 1 的时间.\n     * @since 2.6\n     * @see buildMessageChain\n     */\n    @JvmOverloads\n    public inline fun add(\n        senderId: Long,\n        senderName: String,\n        time: Int = -1,\n        builderAction: MessageChainBuilder.() -> Unit\n    ): ForwardMessageBuilder {\n        return add(senderId, senderName, time = time, message = buildMessageChain(builderAction))\n    }\n\n    /**\n     * 构建并添加一个消息. 若不指定 [time], 将会使用 [currentTime] 自增 1 的时间.\n     * @since 2.6\n     * @see buildMessageChain\n     */\n    @JvmOverloads\n    public inline fun add(\n        sender: UserOrBot,\n        time: Int = -1,\n        builderAction: MessageChainBuilder.() -> Unit\n    ): ForwardMessageBuilder {\n        return add(sender, time = time, message = buildMessageChain(builderAction))\n    }\n\n    // endregion\n\n    /**\n     * 构造 [RawForwardMessage]. [RawForwardMessage] 可以被多个 [DisplayStrategy] [渲染][RawForwardMessage.render].\n     * @since 2.6\n     */\n    public fun toRawForwardMessage(): RawForwardMessage = RawForwardMessage(container.map {\n        ForwardMessage.Node(it.senderId, it.time, it.senderName, it.messageChain)\n    })\n\n    /**\n     * 使用 [displayStrategy] 渲染并构造可以发送的 [ForwardMessage].\n     */\n    public fun build(): ForwardMessage = toRawForwardMessage().render(this.displayStrategy)\n\n    internal fun Bot.smartName(): String = when (val c = this@ForwardMessageBuilder.context) {\n        is Group -> c.botAsMember.nameCardOrNick\n        else -> nick\n    }\n}\n\n@OptIn(MiraiExperimentalApi::class)\nprivate fun ForwardMessage.INode.toNode(): ForwardMessage.Node {\n    return ForwardMessage.Node(senderId, time, senderName, messageChain)\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/HummerMessage.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"NOTHING_TO_INLINE\")\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\") // since 0.39.1\n\npackage net.mamoe.mirai.message.data\n\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport net.mamoe.mirai.utils.castOrNull\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\n/**\n * 一些特殊的消息\n *\n * 注意, [HummerMessage] 类型不稳定, 但它的子类如 [PokeMessage] 是稳定的.\n *\n * @see PokeMessage 戳一戳\n * @see FlashImage 闪照\n * @see MarketFace 商城表情\n * @see VipFace VIP 表情\n */\n@MiraiExperimentalApi\n@NotStableForInheritance\npublic interface HummerMessage : MessageContent, ConstrainSingle {\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitHummerMessage(this, data)\n    }\n\n    public companion object Key :\n        AbstractPolymorphicMessageKey<MessageContent, HummerMessage>(MessageContent, { it.castOrNull() })\n    // has service type etc.\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/Image.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n\n@file:Suppress(\n    \"EXPERIMENTAL_API_USAGE\",\n    \"unused\",\n    \"UnusedImport\",\n    \"DEPRECATION_ERROR\", \"MemberVisibilityCanBePrivate\"\n)\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.builtins.serializer\nimport kotlinx.serialization.descriptors.SerialDescriptor\nimport kotlinx.serialization.descriptors.buildClassSerialDescriptor\nimport kotlinx.serialization.encoding.CompositeDecoder\nimport kotlinx.serialization.encoding.Decoder\nimport kotlinx.serialization.encoding.Encoder\nimport kotlinx.serialization.encoding.decodeStructure\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.IMirai\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.contact.Contact.Companion.uploadImage\nimport net.mamoe.mirai.event.events.MessageEvent\nimport net.mamoe.mirai.message.code.CodableMessage\nimport net.mamoe.mirai.message.data.Image.Builder\nimport net.mamoe.mirai.message.data.Image.Key.IMAGE_ID_REGEX\nimport net.mamoe.mirai.message.data.Image.Key.IMAGE_RESOURCE_ID_REGEX_1\nimport net.mamoe.mirai.message.data.Image.Key.IMAGE_RESOURCE_ID_REGEX_2\nimport net.mamoe.mirai.message.data.Image.Key.isUploaded\nimport net.mamoe.mirai.message.data.Image.Key.queryUrl\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.*\nimport net.mamoe.mirai.utils.ExternalResource.Companion.uploadAsImage\n\n/**\n * 自定义表情 (收藏的表情) 和普通图片.\n *\n *\n * 最推荐的存储方式是存储图片原文件, 每次发送图片时都使用文件上传.\n * 在上传时服务器会根据其缓存情况回复已有的图片 ID 或要求客户端上传.\n *\n * # 获取 [Image] 实例\n *\n * ## 根据 ID 构造图片\n *\n * ID 格式查看 [Image.imageId]. 通过 ID 构造的图片若未存在于服务器中, 发送后在客户端将不能正常显示. 可通过 [Image.isUploaded] 检查图片是否存在于服务器.\n * [Image.isUploaded] 需要除了 ID 以外其他参数, 如 [width], [size] 等, 因此不建议通过 ID 构造图片, 而是使用 [Builder] 构建, 以提供详细参数.\n *\n * 使用 [Image.fromId]. 在 Kotlin, 也可以使用顶层函数 `val image = Image(\"id\")`.\n *\n * ### 在 Kotlin 通过 ID 构造图片\n * ```\n * // 根据喜好选择\n * val image = Image.fromId(\"id\")\n * val image2 = Image(\"id\")\n * ```\n *\n * ### 在 Java 通过 ID 构造图片\n * ```java\n * Image image = Image.fromId(\"id\")\n * ```\n *\n * ## 使用 [Builder] 构建图片\n *\n * [Image] 提供 [Builder] 构建方式, 可以指定 [width], [height] 等额外参数. 请尽可能提供这些参数以提升图片发送的成功率和 [Image.isUploaded] 的准确性.\n *\n * ## 上传图片资源获得 [Image]\n *\n * 使用 [Contact.uploadImage], 将 [ExternalResource] 上传得到 [Image].\n *\n * 也可以使用 [ExternalResource.uploadAsImage] 扩展.\n *\n * # 发送图片消息\n *\n * 在获取实例后, 将图片元素连接到[消息链][MessageChain]即可发送. 图片可以与[纯文本][PlainText]等其他 [MessageContent] 混合使用 (在同一[消息链][MessageChain]中).\n *\n * # 下载图片\n *\n * 通过[事件][MessageEvent]等方式获取到 [Image] 实例后, 使用 [Image.queryUrl] 查询得到图片的下载地址, 自行使用 HTTP 客户端下载.\n *\n * # 其他查询\n *\n * ## 查询图片是否已存在于服务器\n *\n * 使用 [Image.isUploaded]. 当图片在服务器上存在时返回 `true`, 这意味着图片可以直接发送.\n *\n * 服务器通过 [Image.md5] 鉴别图片. 当图片已经存在于服务器时, [Contact.uploadImage] 会更快返回 (仍然需要进行网络请求), 不会上传图片数据.\n *\n * ## 检测图片 ID 合法性\n *\n * 使用 [Image.IMAGE_ID_REGEX].\n *\n * ## mirai 码支持\n * 格式: &#91;mirai:image:*[Image.imageId]*&#93;\n *\n * @see FlashImage 闪照\n * @see Image.flash 转换普通图片为闪照\n */\n@Suppress(\"DEPRECATION\", \"DEPRECATION_ERROR\")\n@Serializable(Image.Serializer::class)\n@NotStableForInheritance\npublic interface Image : Message, MessageContent, CodableMessage {\n    /**\n     * 图片的 id.\n     *\n     * 图片 id 不一定会长时间保存, 也可能在将来改变格式, 因此不建议使用 id 发送图片.\n     *\n     * ### 格式\n     * 所有图片的 id 都满足正则表达式 [IMAGE_ID_REGEX]. 示例: `{01E9451B-70ED-EAE3-B37C-101F1EEBF5B5}.ext` (ext 为文件后缀, 如 png)\n     *\n     * @see Image 使用 id 构造图片\n     */\n    public val imageId: String\n\n    /**\n     * 图片的宽度 (px), 当无法获取时为 0\n     *\n     * @since 2.8.0\n     */\n    public val width: Int\n\n    /**\n     * 图片的高度 (px), 当无法获取时为 0\n     *\n     * @since 2.8.0\n     */\n    public val height: Int\n\n    /**\n     * 图片的大小（字节）, 当无法获取时为 0. 可用于 [isUploaded].\n     *\n     * @since 2.8.0\n     */\n    public val size: Long\n\n    /**\n     * 图片的类型, 当无法获取时为未知 [ImageType.UNKNOWN]\n     *\n     * @since 2.8.0\n     *\n     * @see ImageType\n     */\n    public val imageType: ImageType\n\n    /**\n     * 判断该图片是否为 `动画表情`\n     *\n     * @since 2.8.0\n     */\n    public val isEmoji: Boolean get() = false\n\n    /**\n     * 图片文件 MD5. 可用于 [isUploaded].\n     *\n     * @return 16 bytes\n     * @see isUploaded\n     * @since 2.9.0\n     */ // was an extension on Image before 2.9.0-M1.\n    public val md5: ByteArray get() = calculateImageMd5ByImageId(imageId)\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitImage(this, data)\n    }\n\n    public object AsStringSerializer : KSerializer<Image> by String.serializer().mapPrimitive(\n        SERIAL_NAME,\n        serialize = { imageId },\n        deserialize = { Image(it) },\n    )\n\n    @OptIn(MiraiInternalApi::class)\n    @Deprecated(\n        message = \"For internal use only. Deprecated for removal. Please retrieve serializer from MessageSerializers.serializersModule.\",\n        level = DeprecationLevel.WARNING\n    )\n    @DeprecatedSinceMirai(warningSince = \"2.13\") // error since 2.15, hidden since 2.16\n    public object Serializer : KSerializer<Image> by FallbackSerializer(SERIAL_NAME)\n\n    // move to mirai-core in 2.16. Delegate Serializer to the implementation from MessageSerializers.\n    @MiraiInternalApi\n    public open class FallbackSerializer(serialName: String) : KSerializer<Image> {\n        override val descriptor: SerialDescriptor = buildClassSerialDescriptor(serialName) {\n            element(\"imageId\", String.serializer().descriptor)\n            element(\"size\", Long.serializer().descriptor)\n            element(\"imageType\", ImageType.serializer().descriptor)\n            element(\"width\", Int.serializer().descriptor)\n            element(\"height\", Int.serializer().descriptor)\n            element(\"isEmoji\", Boolean.serializer().descriptor)\n        }\n\n        // Note: Manually written to overcome discriminator issues.\n        // Without this implementation you will need `ignoreUnknownKeys` on deserialization.\n        override fun deserialize(decoder: Decoder): Image {\n            return decoder.decodeStructure(descriptor) {\n                @OptIn(ExperimentalSerializationApi::class)\n                if (runCatching { this.decodeSequentially() }.getOrElse { false }) {\n                    val imageId = this.decodeStringElement(descriptor, 0)\n                    val size = this.decodeLongElement(descriptor, 1)\n                    val type = this.decodeSerializableElement(descriptor, 2, ImageType.serializer())\n                    val width = this.decodeIntElement(descriptor, 3)\n                    val height = this.decodeIntElement(descriptor, 4)\n                    val isEmoji = this.decodeBooleanElement(descriptor, 5)\n                    return@decodeStructure Image(imageId) {\n                        this.size = size\n                        this.type = type\n                        this.width = width\n                        this.height = height\n                        this.isEmoji = isEmoji\n                    }\n                } else {\n                    return@decodeStructure Image(\"\") {\n                        while (true) {\n                            when (val index = this@decodeStructure.decodeElementIndex(descriptor)) {\n                                0 -> imageId = this@decodeStructure.decodeStringElement(descriptor, index)\n                                1 -> size = this@decodeStructure.decodeLongElement(descriptor, index)\n                                2 -> type = this@decodeStructure.decodeSerializableElement(\n                                    descriptor,\n                                    index,\n                                    ImageType.serializer()\n                                )\n\n                                3 -> width = this@decodeStructure.decodeIntElement(descriptor, index)\n                                4 -> height = this@decodeStructure.decodeIntElement(descriptor, index)\n                                5 -> isEmoji = this@decodeStructure.decodeBooleanElement(descriptor, index)\n                                CompositeDecoder.DECODE_DONE -> break\n                            }\n                        }\n                        check(imageId.isNotEmpty()) { \"imageId must not empty\" }\n                    }\n                }\n            }\n        }\n\n        override fun serialize(encoder: Encoder, value: Image) {\n            Delegate.serializer().serialize(\n                encoder, Delegate(\n                    value.imageId,\n                    value.size,\n                    value.imageType,\n                    value.width,\n                    value.height,\n                    value.isEmoji\n                )\n            )\n        }\n\n        @SerialName(SERIAL_NAME)\n        @Serializable\n        private data class Delegate(\n            val imageId: String,\n            val size: Long,\n            val imageType: ImageType,\n            val width: Int,\n            val height: Int,\n            val isEmoji: Boolean\n        )\n    }\n\n\n    /**\n     * [Image] 构建器.\n     *\n     * 示例:\n     *\n     * ```java\n     * Builder builder = Image.Builder.newBuilder(\"{01E9451B-70ED-EAE3-B37C-101F1EEBF5B5}.jpg\")\n     * builder.setSize(123);\n     * builder.setType(ImageType.PNG);\n     *\n     * Image image = builder.build();\n     * ```\n     *\n     * @since 2.9.0\n     */\n    public class Builder private constructor(\n        /**\n         * @see Image.imageId\n         */\n        public var imageId: String,\n    ) {\n        /**\n         * 图片大小字节数. 如果不提供该属性, 将无法 [Image.Key.isUploaded]\n         *\n         * @see Image.size\n         */\n        public var size: Long = 0\n\n        /**\n         * @see Image.imageType\n         */\n        public var type: ImageType = ImageType.UNKNOWN\n        /**\n         * @see Image.width\n         */\n        public var width: Int = 0\n\n        /**\n         * @see Image.height\n         */\n        public var height: Int = 0\n\n        /**\n         * @see Image.isEmoji\n         */\n        public var isEmoji: Boolean = false\n\n\n        public fun build(): Image {\n            if (type == ImageType.UNKNOWN) {\n                type = ImageType.match(imageId.split(\".\").last())\n            }\n            @OptIn(MiraiInternalApi::class)\n            return InternalImageProtocol.instance.createImage(\n                imageId = imageId,\n                size = size,\n                type = type,\n                width = width,\n                height = height,\n                isEmoji = isEmoji,\n            )\n        }\n\n        public companion object {\n            /**\n             * 创建一个 [Builder]\n             */\n            @JvmStatic\n            public fun newBuilder(imageId: String): Builder = Builder(imageId)\n        }\n    }\n\n    @JvmBlockingBridge\n    public companion object Key : AbstractMessageKey<Image>({ it.safeCast() }) {\n        public const val SERIAL_NAME: String = \"Image\"\n\n        /**\n         * 通过 [Image.imageId] 构造一个 [Image] 以便发送.\n         *\n         * 图片 ID 不一定会长时间保存, 因此不建议使用 ID 发送图片. 建议使用 [Builder], 可以指定更多参数 (以及用于查询图片是否存在于服务器的必要参数 size).\n         *\n         * @see Image 获取更多说明\n         * @see Image.imageId 获取更多说明\n         * @see Builder\n         */\n        @JvmStatic\n        public fun fromId(imageId: String): Image = Mirai.createImage(imageId)\n\n        /**\n         * 构造一个 [Image.Builder] 实例.\n         *\n         * @since 2.9.0\n         */\n        @JvmStatic\n        public fun newBuilder(imageId: String): Builder = Builder.newBuilder(imageId)\n\n        /**\n         * 查询原图下载链接.\n         *\n         * - 当图片为从服务器接收的消息中的图片时, 可以直接获取下载链接, 本函数不会挂起协程.\n         * - 其他情况下协程可能会挂起并向服务器查询下载链接, 或不挂起并拼接一个链接.\n         *\n         * @return 原图 HTTP 下载链接\n         * @throws IllegalStateException 当无任何 [Bot] 在线时抛出 (因为无法获取相关协议)\n         */\n        @JvmStatic\n        public suspend fun Image.queryUrl(): String {\n            val bot = Bot.instancesSequence.firstOrNull() ?: error(\"No Bot available to query image url\")\n            return Mirai.queryImageUrl(bot, this)\n        }\n\n        /**\n         * 当图片在服务器上存在时返回 `true`, 这意味着图片可以直接发送给 [contact].\n         *\n         * 若返回 `false`, 则图片需要用 [ExternalResource] 重新上传 ([Contact.uploadImage]).\n         *\n         * @since 2.9.0\n         */\n        @JvmStatic\n        public suspend fun Image.isUploaded(bot: Bot): Boolean {\n            @OptIn(MiraiInternalApi::class)\n            return InternalImageProtocol.instance.isUploaded(bot, md5, size, null, imageType, width, height)\n        }\n\n        /**\n         * 当图片在服务器上存在时返回 `true`, 这意味着图片可以直接发送给 [contact].\n         *\n         * 若返回 `false`, 则图片需要用 [ExternalResource] 重新上传 ([Contact.uploadImage]).\n         *\n         * @param md5 图片文件 MD5. 可通过 [Image.md5] 获得.\n         * @param size 图片文件大小.\n         *\n         * @since 2.9.0\n         */\n        @JvmStatic\n        public suspend fun isUploaded(\n            bot: Bot,\n            md5: ByteArray,\n            size: Long,\n        ): Boolean {\n            @OptIn(MiraiInternalApi::class)\n            return InternalImageProtocol.instance.isUploaded(bot, md5, size, null)\n        }\n\n        /**\n         * 由 [Image.imageId] 计算 [Image.md5].\n         *\n         * @since 2.9.0\n         */\n        public fun calculateImageMd5ByImageId(imageId: String): ByteArray {\n            @OptIn(MiraiInternalApi::class)\n            return when {\n                imageId matches IMAGE_ID_REGEX -> imageId.imageIdToMd5(1)\n                imageId matches IMAGE_RESOURCE_ID_REGEX_2 -> imageId.imageIdToMd5(imageId.skipToSecondHyphen() + 1)\n                imageId matches IMAGE_RESOURCE_ID_REGEX_1 -> imageId.imageIdToMd5(1)\n\n                else -> throw IllegalArgumentException(\n                    \"Illegal imageId: '$imageId'. $ILLEGAL_IMAGE_ID_EXCEPTION_MESSAGE\"\n                )\n            }\n        }\n\n        /**\n         * 统一 ID 正则表达式\n         *\n         * `{01E9451B-70ED-EAE3-B37C-101F1EEBF5B5}.ext`\n         */\n        @Suppress(\"RegExpRedundantEscape\") // This is required on Android\n        @JvmStatic\n        @get:JvmName(\"getImageIdRegex\")\n        public val IMAGE_ID_REGEX: Regex =\n            Regex(\"\"\"\\{[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}\\}\\..{3,5}\"\"\")\n\n        /**\n         * 图片资源 ID 正则表达式 1. mirai 内部使用.\n         *\n         * `/f8f1ab55-bf8e-4236-b55e-955848d7069f`\n         * @see IMAGE_RESOURCE_ID_REGEX_2\n         */\n        @JvmStatic\n        @MiraiInternalApi\n        @get:JvmName(\"getImageResourceIdRegex1\")\n        public val IMAGE_RESOURCE_ID_REGEX_1: Regex =\n            Regex(\"\"\"/[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}\"\"\")\n\n        /**\n         * 图片资源 ID 正则表达式 2. mirai 内部使用.\n         *\n         * `/000000000-3814297509-BFB7027B9354B8F899A062061D74E206`\n         * @see IMAGE_RESOURCE_ID_REGEX_1\n         */\n        @JvmStatic\n        @MiraiInternalApi\n        @get:JvmName(\"getImageResourceIdRegex2\")\n        public val IMAGE_RESOURCE_ID_REGEX_2: Regex =\n            Regex(\"\"\"/[0-9]*-[0-9]*-[0-9a-fA-F]{32}\"\"\")\n    }\n}\n\n/**\n * 通过 [Image.imageId] 构造一个 [Image] 以便发送.\n *\n * 图片 ID 不一定会长时间保存, 因此不建议使用 ID 发送图片. 建议使用 [Image.Builder], 可以指定更多参数 (以及用于查询图片是否存在于服务器的必要参数 size).\n *\n * @see Image 获取更多关于 [Image] 的说明\n * @see Image.Builder 获取更多关于构造 [Image] 的方法\n *\n * @see IMirai.createImage\n */\n@JvmSynthetic\npublic fun Image(imageId: String): Image = Builder.newBuilder(imageId).build()\n\n/**\n * 使用 [Image.Builder] 构建一个 [Image].\n *\n * @see Image.Builder\n * @since 2.9.0\n */\n@JvmSynthetic\npublic inline fun Image(imageId: String, builderAction: Builder.() -> Unit = {}): Image =\n    Builder.newBuilder(imageId).apply(builderAction).build()\n\n@Serializable\npublic enum class ImageType(\n    /**\n     * @since 2.9.0\n     */\n    @MiraiInternalApi public val formatName: String,\n) {\n    PNG(\"png\"),\n    BMP(\"bmp\"),\n    JPG(\"jpg\"),\n    GIF(\"gif\"),\n\n    //WEBP, //Unsupported by pc client\n    APNG(\"png\"),\n    UNKNOWN(\"gif\"); // bad design, should use `null` to represent unknown, but we cannot change it anymore.\n\n    public companion object {\n        private val IMAGE_TYPE_ENUM_LIST = values()\n\n        @JvmStatic\n        public fun match(str: String): ImageType {\n            return matchOrNull(str) ?: UNKNOWN\n        }\n\n        @JvmStatic\n        public fun matchOrNull(str: String): ImageType? {\n            val input = str.uppercase()\n            return IMAGE_TYPE_ENUM_LIST.firstOrNull { it.name == input }\n        }\n    }\n}\n\n///////////////////////////////////////////////////////////////////////////\n// Internals\n///////////////////////////////////////////////////////////////////////////\n\n@Deprecated(\"Use member function\", level = DeprecationLevel.HIDDEN) // safe since it was internal\n@Suppress(\"EXTENSION_SHADOWED_BY_MEMBER\")\n@MiraiInternalApi\n@get:JvmName(\"calculateImageMd5\")\n@DeprecatedSinceMirai(hiddenSince = \"2.9\")\npublic val Image.md5: ByteArray\n    get() = Image.calculateImageMd5ByImageId(imageId)\n\n\n/**\n * 内部图片协议实现\n * @since 2.9.0-M1\n */\n@MiraiInternalApi\npublic interface InternalImageProtocol { // naming it Internal* to assign it a lower priority when resolving Image*\n    public fun createImage(\n        imageId: String,\n        size: Long,\n        type: ImageType = ImageType.UNKNOWN,\n        width: Int = 0,\n        height: Int = 0,\n        isEmoji: Boolean = false\n    ): Image\n\n    /**\n     * @param context 用于检查的 [Contact]. 群图片与好友图片是两个通道, 建议使用欲发送到的 [Contact] 对象作为 [contact] 参数, 但目前不提供此参数时也可以检查.\n     */\n    public suspend fun isUploaded(\n        bot: Bot,\n        md5: ByteArray,\n        size: Long,\n        context: Contact? = null,\n        type: ImageType = ImageType.UNKNOWN,\n        width: Int = 0,\n        height: Int = 0\n    ): Boolean\n\n    @MiraiInternalApi\n    public companion object {\n        public val instance: InternalImageProtocol by lazy {\n            Mirai // initialize MiraiImpl first\n            loadService(\n                InternalImageProtocol::class,\n                \"net.mamoe.mirai.internal.message.InternalImageProtocolImpl\"\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/MarketFace.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.message.data\n\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport net.mamoe.mirai.utils.safeCast\n\n/**\n * 商城表情\n *\n * 除 [Dice] 可以发送外, 目前不支持直接构造和发送，可保存接收到的来自官方客户端的商城表情然后转发.\n *\n * @see Dice\n */\n@OptIn(MiraiExperimentalApi::class)\n@NotStableForInheritance\npublic interface MarketFace : HummerMessage {\n    /**\n     * 如 `[开心]`\n     */\n    public val name: String\n\n    /**\n     * 内部 id.\n     */\n    @MiraiExperimentalApi\n    public val id: Int\n\n    override val key: MessageKey<MarketFace> get() = Key\n\n    override fun contentToString(): String = name.ifEmpty { \"[商城表情]\" }\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitMarketFace(this, data)\n    }\n\n    @OptIn(MiraiExperimentalApi::class)\n    public companion object Key :\n        AbstractPolymorphicMessageKey<HummerMessage, MarketFace>(HummerMessage, { it.safeCast() }) {\n        // Notice that for MarketFaceImpl, its serial name is 'MarketFace';\n        // while for Dice, that is 'Dice' instead of 'MarketFace' again. (Dice extends MarketFace)\n        public const val SERIAL_NAME: String = \"MarketFace\"\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/Message.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.fold\nimport kotlinx.serialization.*\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.code.MiraiCode\nimport net.mamoe.mirai.message.code.MiraiCode.serializeToMiraiCode\nimport net.mamoe.mirai.message.data.Message.Companion.toString\nimport net.mamoe.mirai.message.data.MessageChain.Companion.serializeToJsonString\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmSynthetic\n\n/**\n * 可发送的或从服务器接收的消息.\n *\n * [Message] 派生为 [SingleMessage] 和 [MessageChain].\n *\n * [SingleMessage] 分为:\n *   - [MessageMetadata] 消息元数据, 即消息的属性. 包括: [消息来源][MessageSource], [引用回复][QuoteReply] 等.\n *   - [MessageContent] 含内容的消息, 包括: [纯文本][PlainText], [@群员][At], [@全体成员][AtAll] 等.\n *\n * [MessageChain] 是链表形式链接的多个 [SingleMessage] 实例, 类似 [List].\n *\n * ## [Message] 是不可变的\n *\n * 所有类型的 [Message] 都是不可变的 (immutable), 它们被构造后其所有属性的值就已经固定了. 因此在多线程环境使用是安全的.\n * 因此 [contentToString], [serializeToJsonString], [MiraiCode.serializeToMiraiCode] 的返回都是不变的.\n *\n * [MessageChain] 的 [contentToString] 会被缓存, 只会在第一次调用时计算.\n *\n * ## 获得 [Message]\n *\n * 查看 [Message] 子类. 或在 GitHub 查看 [表格](https://github.com/mamoe/mirai/blob/dev/docs/Messages.md#%E6%B6%88%E6%81%AF%E5%85%83%E7%B4%A0).\n *\n * ## 使用 [Message]\n *\n * ### 转换为 [MessageChain]\n *\n * [MessageChain] 为多个 [SingleMessage] 的集合. [Message] 可能表示 single 也可能表示 chain. 可以通过 [toMessageChain] 将 [Message] 转换为 [MessageChain] 统一处理.\n *\n * ### 连接两个或多个 [Message]\n *\n * 在 Kotlin, 使用操作符 [Message.plus]:\n * ```\n * val text = PlainText(\"Hello \") + PlainText(\"world\") + \"!\"\n * friend.sendMessage(text) // \"Hello world!\"\n * ```\n *\n * 在 Java, 使用 [plus]:\n * ```\n * MessageChain text = new PlainText(\"Hello \")\n *     .plus(new PlainText(\"world\"))\n *     .plus(\"!\");\n * friend.sendMessage(text); // \"Hello world!\"\n * ```\n *\n * 注: 若需要拼接较多 [Message], 推荐使用 [MessageChainBuilder] 加快拼接效率\n *\n * ### 使用 [MessageChainBuilder] 来构建消息\n *\n * 查看 [MessageChainBuilder].\n *\n * ### 发送消息\n *\n * - [Contact.sendMessage] 接收 [Message] 参数\n * - [Message.sendTo] 是发送的扩展\n *\n * ### 处理消息\n *\n * 除了直接访问 [Message] 子类的对象外, 有时候可能需要将 [Message] 作为字符串处理,\n * 通常可以使用 [contentToString] 方法或 [content] 扩展得到与官方客户端显示格式相同的内容字符串.\n *\n * #### 文字处理示例\n *\n * 本示例实现处理以 `#` 开头的消息:\n *\n * Kotlin:\n * ```\n * val msg = event.message\n * val content = msg.content.trim()\n * if (content.startsWith(\"#\")) {\n *     val name = content.substringAfter(\"#\", \"\")\n *     when(name) {\n *         \"mute\" -> event.sender.mute(60000) // 发 #mute 就把自己禁言 1 分钟\n *     }\n * }\n * ```\n *\n * Java:\n * ```\n * MessageChain msg = event.message;\n * String content = msg.contentToString();\n * if (!content.equals(\"#\") && content.startsWith(\"#\")) {\n *     String name = content.substring(content.indexOf('#') + 1); // `#` 之后的内容\n *     switch(name) {\n *         case \"mute\": event.sender.mute(60000) // 发 #mute 就把自己禁言 1 分钟\n *     }\n * }\n * ```\n *\n * 若使用 Java 对象的 [toString], 会得到包含更多信息. 因此 [toString] 结果可能会随着 mirai 更新变化. [toString] 不适合用来处理消息. 只适合用来调试输出.\n *\n * [Message] 还提供了 [Mirai 码][MiraiCode] 和 [JSON][MessageChain.serializeToJsonString] 序列化方式. 可在 [MessageChain] 文档详细了解它们.\n *\n * ### 发送消息\n * - 通过 [Contact] 中的成员函数: [Contact.sendMessage]\n * - 通过 [Message] 的扩展函数: [Message.sendTo]\n *\n * @see MessageChain 消息链(即 `List<Message>`)\n * @see buildMessageChain 构造一个 [MessageChain]\n *\n * @see Contact.sendMessage 发送消息\n *\n * @suppress **注意:** [Message] 类型大多有隐藏的协议实现, 不能被第三方应用继承.\n */\npublic interface Message {\n\n    /**\n     * 得到包含 mirai 消息元素代码的, 易读的字符串. 如 `At(member) + \"test\"` 将转为 `\"[mirai:at:qqId]test\"`.\n     *\n     * 在使用消息相关 DSL 和扩展时, 一些内容比较的实现均使用的是 [contentToString] 而不是 [toString].\n     *\n     * **注意: ** 即使 [toString] 输出的格式看起来像 [MiraiCode] 的表示, 但它们实际上是不同的.\n     * [toString] 会返回更随意的和更适合开发者阅读的信息, 通常不能被 [MiraiCode] 解析.\n     *\n     * 各个消息类型的转换示例:\n     * - [PlainText] : `\"Hello\"`\n     * - [Image] : `\"[mirai:image:{01E9451B-70ED-EAE3-B37C-101F1EEBF5B5}.mirai]\"`\n     * - [PokeMessage] : `\"[mirai:poke:1,-1]\"`\n     * - [MessageChain] : 无间隔地连接所有元素 (`joinToString(\"\")`)\n     * - ...\n     *\n     * @see contentToString 转为最接近官方格式的字符串\n     */\n    public override fun toString(): String\n\n    /**\n     * 转为接近官方格式的字符串, 即 \"内容\". 如 `At(member) + \"test\"` 将转为 `\"@QQ test\"`.\n     *\n     * (对于 [At]，应使用 [At.getDisplay] 将其转为最接近官方格式的字符串 `\"@群名片\"`)\n     *\n     * 在使用消息相关 DSL 和扩展时, 一些内容比较的实现均使用 [contentToString] 而不是 [toString].\n     *\n     * 由于消息元素都是不可变的, [contentToString] 的返回也是不变的.\n     * [MessageChain] 的 [contentToString] 会被缓存, 只会在第一次调用时计算.\n     *\n     * 各个消息类型的转换示例:\n     * - [PlainText] : `\"Hello\"`\n     * - [Image] : `\"[图片]\"`\n     * - [PokeMessage] : `\"[戳一戳]\"`\n     * - [MessageChain] : 无间隔地连接所有元素 (`joinToString(\"\", transformer=Message::contentToString)`)\n     * - ...\n     *\n     * **注意: ** 即使 [toString] 输出的格式看起来像 [MiraiCode] 的表示, 但它们实际上是不同的.\n     * [toString] 会返回更随意的和更适合开发者阅读的信息, 通常不能被 [MiraiCode] 解析.\n     *\n     * @see toString 得到包含 mirai 消息元素代码的, 易读的字符串\n     * @see contentEquals\n     * @see Message.content Kotlin 扩展\n     */\n    public fun contentToString(): String\n\n\n    /**\n     * 判断内容是否与 [another] 相等即 `this` 与 [another] 的 [contentToString] 相等.\n     *\n     * @param ignoreCase 为 `true` 时忽略大小写\n     * @param strict 为 `true` 时表示执行严格匹配, 即会额外判断每个消息元素的类型, 顺序和属性. 如 [Image] 会判断 [Image.imageId].\n     * 每个 [Image] 的[内容][contentToString]都是 `\"[图片]\"`,\n     * 进行非严格匹配时 [contentEquals] 会返回 `true`.\n     * 而为进行严格匹配时会额外比较 [Image.imageId], 两张不同的图片的 [contentEquals] 会返回 `false`.\n     */\n    public fun contentEquals(another: Message, ignoreCase: Boolean = false, strict: Boolean = false): Boolean {\n        return if (strict) this.contentEqualsStrictImpl(another, ignoreCase)\n        else this.contentToString().equals(another.contentToString(), ignoreCase = ignoreCase)\n    }\n\n    /**\n     * 判断内容是否与 [another] 相等即 `this` 与 [another] 的 [contentToString] 相等.\n     *\n     * 单个消息的顺序和内容不会被检查, 即只要比较两个 [Image], 总是会得到 `true`, 因为 [Image] 的 [contentToString] 都是 `\"[图片]\"`.\n     *\n     *\n     * 相当于\n     * ```\n     * this.contentToString().equals(another.contentToString(), ignoreCase = ignoreCase)\n     * ```\n     *\n     * @param ignoreCase 为 `true` 时忽略大小写\n     */\n    @kotlin.internal.LowPriorityInOverloadResolution\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n    public fun contentEquals(another: Message, ignoreCase: Boolean = false): Boolean =\n        contentEquals(another, ignoreCase, false)\n\n\n    /**\n     * 判断内容是否与 [another] 相等.\n     *\n     *\n     * 相当于\n     * ```\n     * this.contentToString().equals(another, ignoreCase = ignoreCase)\n     * ```\n     *\n     *\n     * 若本函数返回 `true`, 则表明:\n     * - `this` 与 [another] 的 [contentToString] 相等\n     */\n    public fun contentEquals(another: String, ignoreCase: Boolean = false): Boolean {\n        return this.contentToString().equals(another, ignoreCase = ignoreCase)\n    }\n\n    /**\n     * 将 `this` 和 [tail] 连接.\n     *\n     * 连接后可以保证 [ConstrainSingle] 的元素单独存在.\n     *\n     * 例:\n     * ```\n     * val a = PlainText(\"Hello \")\n     * val b = PlainText(\"world!\")\n     * val c: MessageChain = a + b\n     * println(c) // \"Hello world!\"\n     * ```\n     *\n     * 在 Java 使用 [plus]\n     *\n     * @see plus `+` 操作符重载\n     */\n    @JvmSynthetic // in Java they should use `plus` instead\n    public fun followedBy(tail: Message): MessageChain {\n        var constrainSingleCount = 0\n        if (this.hasConstrainSingle) constrainSingleCount++\n        if (tail.hasConstrainSingle) constrainSingleCount++\n        return if (constrainSingleCount == 0) {\n            // Future optimize:\n            // When constrainSingleCount == 1, see if we can connect by CombinedMessage,\n            // this need some kind of replacement of `hasConstrainSingle` with more information about MessageKeys.\n            @OptIn(MessageChainConstructor::class, MiraiInternalApi::class)\n            CombinedMessage(this, tail, false)\n        } else {\n            LinearMessageChainImpl.combineCreate(this, tail)\n        }\n    }\n\n    /**\n     * 创建一个[消息链][MessageChain], 将 [another] 连接到这个消息的尾部.\n     * 这不会改变本 [Message], 而是会创建新的 [MessageChain] 实例.\n     * 返回的 [MessageChain] 实例的第一个元素为本 [Message], 随后为按顺序的 [another] 中的元素.\n     */\n    public operator fun plus(another: MessageChain): MessageChain = this + another as Message\n\n    /**\n     * 创建一个[消息链][MessageChain], 将 [another] 连接到这个消息的尾部.\n     * 这不会改变本 [Message], 而是会创建新的 [MessageChain] 实例.\n     * 返回的 [MessageChain] 实例的第一个元素为本 [Message], 随后为按顺序的 [another] 中的元素.\n     */\n    public operator fun plus(another: Message): MessageChain = this.followedBy(another)\n\n    /**\n     * 创建一个[消息链][MessageChain], 将 [another] 连接到这个消息的尾部.\n     * 这不会改变本 [Message], 而是会创建新的 [MessageChain] 实例.\n     * 返回的 [MessageChain] 实例的第一个元素为本 [Message], 随后为按顺序的 [another] 中的元素.\n     */\n    public operator fun plus(another: SingleMessage): MessageChain = this.followedBy(another)\n\n    /**\n     * 创建一个[消息链][MessageChain], 将 [another] 连接到这个消息的尾部.\n     * 这不会改变本 [Message], 而是会创建新的 [MessageChain] 实例.\n     * 返回的 [MessageChain] 实例的第一个元素为本 [Message], 随后为按顺序的 [another] 中的元素.\n     */\n    public operator fun plus(another: String): MessageChain = this.followedBy(PlainText(another))\n\n    /**\n     * 创建一个[消息链][MessageChain], 将 [another] 连接到这个消息的尾部.\n     * 这不会改变本 [Message], 而是会创建新的 [MessageChain] 实例.\n     * 返回的 [MessageChain] 实例的第一个元素为本 [Message], 随后为按顺序的 [another] 中的元素.\n     */\n    public operator fun plus(another: CharSequence): MessageChain =\n        this.followedBy(PlainText(another.toString()))\n\n    /**\n     * 创建一个[消息链][MessageChain], 将 [another] 连接到这个消息的尾部.\n     * 这不会改变本 [Message], 而是会创建新的 [MessageChain] 实例.\n     * 返回的 [MessageChain] 实例的第一个元素为本 [Message], 随后为按顺序的 [another] 中的元素.\n     */\n    public operator fun plus(another: Iterable<Message>): MessageChain =\n        another.fold(this, Message::plus).toMessageChain()\n\n    /**\n     * 创建一个[消息链][MessageChain], 将 [another] 连接到这个消息的尾部.\n     * 这不会改变本 [Message], 而是会创建新的 [MessageChain] 实例.\n     * 返回的 [MessageChain] 实例的第一个元素为本 [Message], 随后为按顺序的 [another] 中的元素.\n     */\n    public operator fun plus(another: Array<out Message>): MessageChain =\n        another.fold(this, Message::plus).toMessageChain()\n\n    /**\n     * 创建一个[消息链][MessageChain], 将 [another] 连接到这个消息的尾部.\n     * 这不会改变本 [Message], 而是会创建新的 [MessageChain] 实例.\n     * 返回的 [MessageChain] 实例的第一个元素为本 [Message], 随后为按顺序的 [another] 中的元素.\n     */\n    @JvmName(\"plusIterableString\")\n    @Suppress(\"INAPPLICABLE_JVM_NAME\")\n    public operator fun plus(another: Iterable<String>): MessageChain =\n        another.fold(this, Message::plus).toMessageChain()\n\n    /**\n     * 创建一个[消息链][MessageChain], 将 [another] 连接到这个消息的尾部.\n     * 这不会改变本 [Message], 而是会创建新的 [MessageChain] 实例.\n     * 返回的 [MessageChain] 实例的第一个元素为本 [Message], 随后为按顺序的 [another] 中的元素.\n     */\n    public operator fun plus(another: Sequence<Message>): MessageChain =\n        another.fold(this, Message::plus).toMessageChain()\n\n    /**\n     * @suppress 这是内部 API, 不要在任何情况下调用\n     * @since 2.12\n     */\n    @MiraiInternalApi\n    public fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R = visitor.visitMessage(this, data)\n\n    /**\n     * @suppress 这是内部 API, 不要在任何情况下调用\n     * @since 2.12\n     */\n    @MiraiInternalApi\n    public fun <D> acceptChildren(visitor: MessageVisitor<D, *>, data: D) {\n    }\n\n    public companion object // 用于\"注册\"扩展\n}\n\n/** 将 [another] 按顺序连接到这个消息的尾部. */\n@JvmSynthetic\npublic suspend operator fun Message.plus(another: Flow<Message>): MessageChain =\n    another.fold(this) { acc, it -> acc + it }.toMessageChain()\n\n\n/**\n * [Message.contentToString] 的捷径\n */\n@get:JvmSynthetic\npublic val Message.content: String\n    get() = contentToString()\n\n/**\n * 将 [this] 发送给指定联系人\n */\n@JvmSynthetic\n@Suppress(\"UNCHECKED_CAST\")\npublic suspend inline fun <C : Contact> Message.sendTo(contact: C): MessageReceipt<C> =\n    contact.sendMessage(this) as MessageReceipt<C>\n\n\n/**\n * 当消息内容为空时返回 `true`.\n * @see String.isEmpty\n */\npublic fun Message.isContentEmpty(): Boolean {\n    return when (this) {\n        is MessageChain -> this.all { it.isContentEmpty() }\n        else -> this.content.isEmpty()\n    }\n}\n\n/**\n * 当消息内容为空白时返回 `true`.\n * @see String.isBlank\n */\npublic fun Message.isContentBlank(): Boolean {\n    return when (this) {\n        is MessageChain -> this.all { it.isContentBlank() }\n        else -> this.content.isBlank()\n    }\n}\n\n/**\n * 将此消息元素按顺序重复 [count] 次.\n */\npublic fun Message.repeat(count: Int): MessageChain {\n    if (this is ConstrainSingle) {\n        // fast-path\n        return this.toMessageChain()\n    }\n    return buildMessageChain(count) {\n        repeat(count) l@{\n            add(this@repeat)\n        }\n    }\n}\n\n/**\n * 将此消息元素按顺序重复 [count] 次.\n */\n@JvmSynthetic\npublic operator fun Message.times(count: Int): MessageChain = this.repeat(count)\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/MessageChain.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n@file:Suppress(\"unused\", \"NOTHING_TO_INLINE\", \"INAPPLICABLE_JVM_NAME\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.serialization.*\nimport kotlinx.serialization.builtins.ListSerializer\nimport kotlinx.serialization.descriptors.SerialDescriptor\nimport kotlinx.serialization.encoding.Decoder\nimport kotlinx.serialization.encoding.Encoder\nimport kotlinx.serialization.json.Json\nimport net.mamoe.mirai.console.compiler.common.ResolveContext\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.event.events.MessageEvent\nimport net.mamoe.mirai.message.MessageSerializers\nimport net.mamoe.mirai.message.code.CodableMessage\nimport net.mamoe.mirai.message.code.MiraiCode\nimport net.mamoe.mirai.message.code.MiraiCode.deserializeMiraiCode\nimport net.mamoe.mirai.message.data.MessageChain.Companion.deserializeFromMiraiCode\nimport net.mamoe.mirai.message.data.MessageChain.Companion.serializeToJsonString\nimport net.mamoe.mirai.message.data.MessageSource.Key.quote\nimport net.mamoe.mirai.message.data.MessageSource.Key.recall\nimport net.mamoe.mirai.message.data.MessageSource.Key.recallIn\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.*\nimport java.util.stream.Stream\nimport kotlin.reflect.KProperty\nimport kotlin.streams.asSequence\nimport net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.RESTRICTED_ABSTRACT_MESSAGE_KEYS as RAMK\n\n/**\n * 消息链, `List<SingleMessage>`, 即 [单个消息元素][SingleMessage] 的有序集合.\n *\n * [MessageChain] 代表一条完整的聊天中的消息, 可包含 [带内容的消息 `MessageContent`][MessageContent]\n * 和 [不带内容的元数据 `MessageMetadata`][MessageMetadata].\n *\n * # 元素类型\n *\n * [MessageContent] 如 [纯文字][PlainText], [图片][Image], [语音][Voice], 是能被用户看到的内容.\n *\n *\n * [MessageMetadata] 是用来形容这条消息的状态的数据, 因此称为 *元数据 (metadata)*.\n * 元数据目前只分为 [消息来源 `MessageSource`][MessageSource] 和 [引用回复 `QuoteReply`][QuoteReply].\n *\n * [MessageSource] 存储这条消息的发送人, 接收人, 识别 ID (服务器提供), 发送时间等信息.\n * **[MessageSource] 是精确的**. 凭 [MessageSource] 就可以在服务器上定位一条消息, 因此可以用来 [撤回消息][MessageSource.recall].\n *\n * [QuoteReply] 是一个标记, 表示这条消息引用了另一条消息 (在官方客户端中可通过 \"回复\" 功能发起引用). [QuoteReply.source] 则指代那条被引用的消息.\n * 由于 [MessageSource] 是精确的, 如果对 [QuoteReply.source] 使用 [MessageSource.recall], 则可以撤回那条被引用的消息.\n *\n *\n * # 获得消息链\n *\n * 在消息事件中可以获得消息内容作为 [MessageChain]: [MessageEvent.message]\n *\n * 在主动发送消息时, 可使用如下方案.\n *\n * ## 在 Kotlin 构造消息链\n * - 获取不包含任何元素的消息链: [EmptyMessageChain]\n * - [messageChainOf][messageChainOf]: 类似 [listOf], 将多个 [Message] 构造为 [MessageChain]:\n *   ```\n *   val chain = messageChainOf(PlainText(\"...\"), Image(\"...\"), ...)\n *   ```\n * - [buildMessageChain][buildMessageChain]: 使用 DSL 构建器.\n *   ```\n *   val chain = buildMessageChain {\n *      +\"你想要的图片是:\"\n *      +Image(\"...\")\n *   }\n *   ```\n * - [Message.plus][Message.plus]: 将两个消息相连成为一个消息链:\n *   ```\n *   val chain = PlainText(\"Hello \") + PlainText(\"Mirai!\") // chain: MessageChain\n *   ```\n * - [toMessageChain][toMessageChain] 将 [Iterable], [Array], [Sequence], [Iterator], [Flow], [Stream] 转换为 [MessageChain].\n *   相关定义为:\n *   ```\n *   public fun Sequence<Message>.toMessageChain(): MessageChain\n *   public fun Iterable<Message>.toMessageChain(): MessageChain\n *   public fun Iterator<Message>.toMessageChain(): MessageChain\n *   public fun Stream<Message>.toMessageChain(): MessageChain\n *   public fun Flow<Message>.toMessageChain(): MessageChain\n *   public fun Array<Message>.toMessageChain(): MessageChain\n *   ```\n * - [Message.toMessageChain][Message.toMessageChain] 将单个 [Message] 包装成一个单元素的 [MessageChain]\n *\n * ## 在 Java 构造消息链\n * - `MessageUtils.newChain`: 有多个重载, 相关定义如下:\n *   ```java\n *   public static MessageChain newChain(Message messages...)\n *   public static MessageChain newChain(Iterable<Message> iterable)\n *   public static MessageChain newChain(Iterator<Message> iterator)\n *   public static MessageChain newChain(Stream<Message> stream)\n *   public static MessageChain newChain(Message[] array)\n *   ```\n * - [Message.plus][Message.plus]: 将两个消息相连成为一个消息链:\n *   ```java\n *   MessageChain chain = new PlainText(\"Hello \").plus(new PlainText(\"Mirai!\"))\n *   ```\n * - [MessageChainBuilder][MessageChainBuilder]:\n *   ```java\n *   MessageChainBuilder builder = MessageChainBuilder.create();\n *   builder.append(new PlainText(\"Hello \"));\n *   builder.append(new PlainText(\" Mirai!\"));\n *   MessageChain chain = builder.build();\n *   ```\n *\n * # 元素唯一性\n *\n * 部分消息类型如 [语音][Voice], [小程序][LightApp] 在官方客户端限制中只允许单独存在于一条消息. 在创建 [MessageChain] 时这种限制会被体现.\n *\n * 当添加只允许单独存在的消息元素到一个消息链时, 已有的元素可能会被删除或替换. 详见 [AbstractPolymorphicMessageKey] 和 [ConstrainSingle].\n *\n * # 操作消息链\n *\n * [MessageChain] 继承 `List<SingleMessage>`. 可以以 [List] 的方式处理 [MessageChain].\n *\n * 额外地, 若要获取一个 [ConstrainSingle] 的元素, 可以通过 [ConstrainSingle.key]:\n * ```\n * val quote = chain[QuoteReply] // Kotlin\n *\n * QuoteReply quote = chain.get(QuoteReply.Key) // Java\n * ```\n *\n * 相关地还可以使用 [MessageChain.contains] 和 [MessageChain.getOrFail]\n *\n * ## 直接索引访问\n *\n * [MessageChain] 实现接口 [List], 可以通过索引 `get(index)` 来访问. 由于 [MessageChain] 是稳定的, 这种访问操作也是稳定的.\n *\n * 但在处理来自服务器的 [MessageChain] 时, 请尽量避免这种直接索引访问. 来自服务器的消息的组成有可能会变化, 可能会有新的 [MessageMetadata] 加入.\n * 例如用户发送了两条内容相同的消息, 但其中一条带有引用回复而另一条没有, 则两条消息的索引可能有变化 (当然内容顺序不会改变, 只是 [QuoteReply] 的位置有可能会变化).\n * 因此在使用直接索引访问时要格外注意兼容性, 故不推荐这种访问方案.\n *\n * ### 避免索引访问以提高性能\n *\n * 自 2.12 起, [MessageChain] 内部结构有性能优化. 该优化大幅降低元素数量多的 [MessageChain] 的连接的时间复杂度.\n * 性能优化默认生效, 但若使用 [get], [subList] 等 [List] 于 [Collection] 之外的方法时则会让该优化失效 (相比 2.12 以前不会丢失性能, 只是没有优化).\n *\n * ## 撤回和引用\n *\n * 要撤回消息, 查看 [MessageSource]\n *\n * - [MessageSource.quote]\n * - [MessageSource.recall]\n * - [MessageSource.recallIn]\n * - `MessageChain.quote`\n * - `MessageChain.recall`\n * - `MessageChain.recallIn`\n *\n * ## Kotlin 扩展\n *\n * ### 属性委托\n * ```\n * val at: At? by chain.orNull()\n * val at: At by chain.orElse { /* 返回一个 At */ }\n * val at: At by chain\n * ```\n *\n * ### 筛选得到 [Sequence] 与 [List]\n * - [MessageChain.contentsSequence]\n * - [MessageChain.metadataSequence]\n * - [MessageChain.contentsList]\n * - [MessageChain.metadataList]\n *\n * # 序列化\n *\n * ## kotlinx-serialization 序列化\n *\n * - 使用 [MessageChain.serializeToJsonString] 将 [MessageChain] 序列化为 JSON [String].\n * - 使用 [MessageChain.deserializeFromJsonString] 将 JSON [String] 反序列化为 [MessageChain].\n *\n * ## Mirai Code 序列化\n *\n * 详见 [MiraiCode]\n *\n * - 使用 [MessageChain.serializeToMiraiCode] 将 [MessageChain] 序列化为 Mirai Code [String].\n * - 使用 [MessageChain.deserializeFromMiraiCode] 将 Mirai Code [String] 反序列化为 [MessageChain].\n *\n */\n@Serializable(MessageChain.Serializer::class)\n@NotStableForInheritance\npublic sealed interface MessageChain :\n    Message, List<SingleMessage>, RandomAccess, CodableMessage {\n\n    // 写给 mirai 内部实现者: 优先考虑使用 visitor API 而不是 List 的 API. 这将会提升性能, 对于巨大的通过 `plus` 方式连接的消息链有重大区别.\n    // 即使 [MessageChain] 实现 [RandomAccess], 使用基于 index 的 API 也可能会产生重大性能下降. (不过这本来就是没法避免的, 避免使用 index 属于一种性能优化).\n    // 若你感兴趣原理, 阅读 [Message.followedBy] 和 [CombinedMessage]\n\n    /**\n     * 获取第一个类型为 [key] 的 [Message] 实例. 若不存在此实例, 返回 `null`.\n     *\n     * 此方法目前仅适用于 [ConstrainSingle] 的消息类型, 如 [MessageSource].\n     *\n     * ### Kotlin 使用方法\n     * ```\n     * val chain: MessageChain = ...\n     *\n     * val source = chain[MessageSource] // MessageSource 为伴生对象\n     * ```\n     *\n     * ### Java 使用方法\n     * ```java\n     * MessageChain chain = ...\n     * chain.get(MessageSource.Key)\n     * ```\n     *\n     * @param key 由各个类型消息的伴生对象持有. 如 [MessageSource.Key]\n     *\n     * @see MessageChain.getOrFail 在找不到此类型的元素时抛出 [NoSuchElementException]\n     */\n    public operator fun <M : SingleMessage> get(@ResolveContext(RAMK) key: MessageKey<M>): M? {\n        @Suppress(\"UNCHECKED_CAST\")\n        return firstOrNull { key.safeCast.invoke(it) != null } as M?\n    }\n\n    /**\n     * 当存在 [ConstrainSingle.key] 为 [key] 的 [SingleMessage] 实例时返回 `true`.\n     *\n     * 此方法目前仅适用于 [ConstrainSingle] 的消息类型, 如 [MessageSource].\n     *\n     * ### Kotlin 使用方法\n     * ```\n     * val chain: MessageChain = ...\n     *\n     * if (chain.contains(QuoteReply)) {\n     *     // 包含引用回复\n     * }\n     * ```\n     *\n     * ### Java 使用方法\n     * ```java\n     * MessageChain chain = ...\n     * if (chain.contains(QuoteReply.Key)) {\n     *     // 包含引用回复\n     * }\n     * ```\n     *\n     * @param key 由各个类型消息的伴生对象持有. 如 [MessageSource.Key]\n     *\n     * @see MessageChain.getOrFail 在找不到此类型的元素时抛出 [NoSuchElementException]\n     */\n    public operator fun <M : SingleMessage> contains(@ResolveContext(RAMK) key: MessageKey<M>): Boolean =\n        any { key.safeCast.invoke(it) != null }\n\n    @MiraiExperimentalApi\n    override fun appendMiraiCodeTo(builder: StringBuilder) {\n        forEach { it.safeCast<CodableMessage>()?.appendMiraiCodeTo(builder) }\n    }\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R = visitor.visitMessageChain(this, data)\n\n    /**\n     * 将 [MessageChain] 作为 `List<SingleMessage>` 序列化. 使用 [多态序列化][Polymorphic].\n     *\n     * 在实践时请提供 [MessageSerializers.serializersModule] 到指定 [SerialFormat].\n     *\n     * @see ListSerializer\n     * @see MessageSerializers\n     */\n    public object Serializer : KSerializer<MessageChain> {\n        @Suppress(\"DEPRECATION_ERROR\")\n        private val delegate = ListSerializer(PolymorphicSerializer(SingleMessage::class))\n        override val descriptor: SerialDescriptor = delegate.descriptor\n        override fun deserialize(decoder: Decoder): MessageChain = delegate.deserialize(decoder).toMessageChain()\n        override fun serialize(encoder: Encoder, value: MessageChain): Unit = delegate.serialize(encoder, value)\n    }\n\n    public companion object {\n        private fun getDefaultJson() = Json {\n            serializersModule =\n                MessageSerializers.serializersModule // don't convert to property, serializersModule is volatile.\n            ignoreUnknownKeys = true\n        }\n\n        /**\n         * 从 JSON 字符串解析 [MessageChain]\n         * @param json 需要包含 [MessageSerializers.serializersModule]\n         * @see serializeToJsonString\n         */\n        @JvmOverloads\n        @JvmStatic\n        public fun deserializeFromJsonString(\n            string: String,\n            json: Json = getDefaultJson()\n        ): MessageChain {\n            return json.decodeFromString(Serializer, string)\n        }\n\n        /**\n         * 从 JSON 字符串解析 [MessageChain]\n         * @param json 需要包含 [MessageSerializers.serializersModule]\n         * @see deserializeFromJsonString\n         * @see serializeToJsonString\n         */\n        @JvmSynthetic\n        @JvmStatic\n        public inline fun String.deserializeJsonToMessageChain(json: Json): MessageChain =\n            deserializeFromJsonString(this, json)\n\n        /**\n         * 从 JSON 字符串解析 [MessageChain]\n         * @see serializeToJsonString\n         * @see deserializeFromJsonString\n         */\n        @JvmSynthetic\n        @JvmStatic\n        public inline fun String.deserializeJsonToMessageChain(): MessageChain = deserializeFromJsonString(this)\n\n        /**\n         * 将 [MessageChain] 序列化为 JSON 字符串.\n         * @see deserializeFromJsonString\n         */\n        @JvmOverloads\n        @JvmStatic\n        public fun MessageChain.serializeToJsonString(\n            json: Json = getDefaultJson()\n        ): String = json.encodeToString(Serializer, this)\n\n        /**\n         * 将 [MessageChain] 序列化为指定格式的字符串.\n         *\n         * @see serializeToJsonString\n         * @see StringFormat.encodeToString\n         */\n        @ExperimentalSerializationApi\n        @JvmStatic\n        public fun MessageChain.serializeToString(format: StringFormat): String =\n            format.encodeToString(Serializer, this)\n\n        /**\n         * 解析形如 \"[mirai:]\" 的 mirai 码, 即 [CodableMessage.serializeToMiraiCode] 返回的内容.\n         * @param contact 解析语境\n         * @see MiraiCode.deserializeMiraiCode\n         * @since 2.13\n         */\n        @JvmStatic\n        public fun deserializeFromMiraiCode(miraiCode: String, contact: Contact? = null): MessageChain =\n            miraiCode.deserializeMiraiCode(contact)\n\n\n        /**\n         * 解析形如 \"[mirai:]\" 的 mirai 码, 即 [CodableMessage.serializeToMiraiCode] 返回的内容.\n         * @see MiraiCode.deserializeMiraiCode\n         */\n        @Deprecated(\n            \"Parameter MessageChain is redundant, use the overload instead.\",\n            ReplaceWith(\n                \"MessageChain.deserializeFromMiraiCode(miraiCode, contact)\",\n                \"net.mamoe.mirai.message.data.MessageChain\"\n            )\n        )\n        @Suppress(\"UnusedReceiverParameter\")\n        @JvmStatic\n        public fun MessageChain.deserializeFromMiraiCode(miraiCode: String, contact: Contact? = null): MessageChain =\n            MessageChain.deserializeFromMiraiCode(miraiCode, contact)\n    }\n}\n\n/**\n * 返回一个不含任何元素的 [MessageChain].\n *\n * @since 2.12\n */\n// Java: MessageUtils.emptyMessageChain()\n@Suppress(\"DEPRECATION\", \"DEPRECATION_ERROR\")\npublic fun emptyMessageChain(): MessageChain = EmptyMessageChain\n\n/**\n * 不含任何元素的 [MessageChain]. 已弃用, 请使用 [emptyMessageChain].\n */\n//@Serializable(MessageChain.Serializer::class)\n@Deprecated(\n    \"Please use emptyMessageChain()\",\n    replaceWith = ReplaceWith(\"emptyMessageChain()\", \"net.mamoe.mirai.message.data.emptyMessageChain\"),\n    level = DeprecationLevel.ERROR\n)\n@DeprecatedSinceMirai(\n    warningSince = \"2.12\",\n    errorSince = \"2.14\"\n) // make internal after deprecation cycle, but keep as @PublishedApi!\n@Suppress(\"EXPOSED_SUPER_CLASS\")\npublic object EmptyMessageChain : MessageChain, List<SingleMessage> by emptyList(),\n    AbstractMessageChain(), DirectSizeAccess, DirectToStringAccess {\n\n    override val size: Int get() = 0\n\n    override fun toString(): String = \"\"\n    override fun contentToString(): String = \"\"\n    override fun serializeToMiraiCode(): String = \"\"\n\n    @MiraiInternalApi\n    override val hasConstrainSingle: Boolean\n        get() = false\n\n    @MiraiExperimentalApi\n    override fun appendMiraiCodeTo(builder: StringBuilder) {\n    }\n\n    override fun iterator(): Iterator<SingleMessage> = EmptyMessageChainIterator\n\n    @Suppress(\"DeprecatedCallableAddReplaceWith\")\n    @Deprecated(\n        \"Serializers for EmptyMessageChain is not provided any more. \" +\n                \"Please specify your serial property as MessageChain and use contextual and polymorphic serializers from MessageSerializers.serializersModule.\",\n        level = DeprecationLevel.WARNING\n    ) // deprecated since 2.8-M1\n    @DeprecatedSinceMirai(warningSince = \"2.8\")\n    public fun serializer(): KSerializer<MessageChain> = MessageChain.Serializer\n\n    private object EmptyMessageChainIterator : Iterator<SingleMessage> {\n        override fun hasNext(): Boolean = false\n        override fun next(): Nothing = throw NoSuchElementException(\"EmptyMessageChain is empty.\")\n    }\n}\n\n// region accessors\n\n/**\n * 获取第一个类型为 [key] 的 [Message] 实例, 在找不到此类型的元素时抛出 [NoSuchElementException]\n *\n * @param key 由各个类型消息的伴生对象持有. 如 [MessageSource.Key]\n */\n@JvmSynthetic\npublic inline fun <M : SingleMessage> MessageChain.getOrFail(\n    @ResolveContext(RAMK) key: MessageKey<M>,\n    crossinline lazyMessage: (key: MessageKey<M>) -> String = { key.toString() }\n): M = get(key) ?: throw NoSuchElementException(lazyMessage(key))\n\n/**\n * 获取 `Sequence<MessageContent>`\n * 相当于 `this.asSequence().filterIsInstance<MessageContent>()`\n */\n@JvmSynthetic\npublic fun MessageChain.contentsSequence(): Sequence<MessageContent> =\n    this.asSequence().filterIsInstance<MessageContent>()\n\n/**\n * 获取 `Sequence<MessageMetadata>`\n * 相当于 `this.asSequence().filterIsInstance<MessageMetadata>()`\n */\n@JvmSynthetic\npublic fun MessageChain.metadataSequence(): Sequence<MessageMetadata> =\n    this.asSequence().filterIsInstance<MessageMetadata>()\n\n/**\n * 筛选 [MessageMetadata]\n */\npublic fun MessageChain.metadataList(): List<MessageMetadata> = this.filterIsInstance<MessageMetadata>()\n\n/**\n * 筛选 [MessageContent]\n */\npublic fun MessageChain.contentsList(): List<MessageContent> = this.filterIsInstance<MessageContent>()\n\n\n/**\n * 获取第一个 [M] 实例. 在不存在时返回 `null`.\n */\n@JvmSynthetic\npublic inline fun <reified M : SingleMessage?> MessageChain.findIsInstance(): M? =\n    this.find { it is M } as M?\n\n/**\n * 获取第一个 [M] 实例. 在不存在时返回 `null`.\n * @see findIsInstance\n */\n@JvmSynthetic\npublic inline fun <reified M : SingleMessage?> MessageChain.firstIsInstanceOrNull(): M? =\n    this.find { it is M } as M?\n\n/**\n * 获取第一个 [M] 实例. 在不存在时抛出 [NoSuchElementException].\n * @see findIsInstance\n */\n@JvmSynthetic\npublic inline fun <reified M : SingleMessage> MessageChain.firstIsInstance(): M = this.first { it is M } as M\n\n/**\n * 当 [this] 中存在 [M] 的实例时返回 `true`.\n */\n@JvmSynthetic\npublic inline fun <reified M : SingleMessage> MessageChain.anyIsInstance(): Boolean = this.any { it is M }\n\n// endregion accessors\n\n\n// region toMessageChain\n\n/**\n * 返回一个包含 [messages] 所有元素的消息链, 保留顺序.\n *\n * ```\n * val chain = messageChainOf(messageChainOf(AtAll, new PlainText(\"\")), messageChainOf(Image(\"\"), QuoteReply()))\n * ```\n * 将会得到 `chain` 为 `[AtAll, PlainText, Image, QuoteReply]`\n *\n * @see buildMessageChain\n */\n@JvmName(\"newChain\")\npublic inline fun messageChainOf(vararg messages: Message): MessageChain = messages.toMessageChain()\n\n/**\n * 扁平化 [this] 并创建一个 [MessageChain].\n */\n@JvmName(\"newChain\")\npublic fun Sequence<Message>.toMessageChain(): MessageChain =\n    LinearMessageChainImpl.create(ConstrainSingleHelper.constrainSingleMessages(this))\n\n/**\n * 扁平化 [this] 并创建一个 [MessageChain].\n */\n@JvmName(\"newChain\")\npublic suspend fun Flow<Message>.toMessageChain(): MessageChain =\n    buildMessageChain { collect { add(it) } }\n\n/**\n * 扁平化 [this] 并创建一个 [MessageChain].\n */\n@JvmName(\"newChain\")\npublic inline fun Iterable<Message>.toMessageChain(): MessageChain = this.asSequence().toMessageChain()\n\n/**\n * 扁平化 [this] 并创建一个 [MessageChain].\n */\n@JvmName(\"newChain\")\npublic inline fun Iterator<Message>.toMessageChain(): MessageChain = this.asSequence().toMessageChain()\n\n/**\n * 扁平化 [this] 并创建一个 [MessageChain].\n */\n@JvmSynthetic\n// no JvmName because 'fun messageChainOf(vararg messages: Message)'\npublic inline fun Array<out Message>.toMessageChain(): MessageChain = this.asSequence().toMessageChain()\n\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"UNCHECKED_CAST\")\n@kotlin.internal.LowPriorityInOverloadResolution // prefer Iterable<Message>.toMessageChain() for MessageChain\n@JvmName(\"newChain\")\npublic fun Message.toMessageChain(): MessageChain = when (this) {\n    is MessageChain -> (this as List<SingleMessage>).toMessageChain()\n    is SingleMessage -> LinearMessageChainImpl.create(listOf(this), this is ConstrainSingle)\n    else -> error(\"Message is either MessageChain nor SingleMessage: $this\")\n}\n\n/**\n * 扁平化 [this] 并创建一个 [MessageChain].\n */\n@JvmName(\"newChain\")\npublic fun Stream<Message>.toMessageChain(): MessageChain = this.asSequence().toMessageChain()\n\n// region delegate\n\n/**\n * 提供一个类型的值的委托. 若不存在则会抛出异常 [NoSuchElementException]\n *\n * 用法:\n * ```\n * val message: MessageChain\n *\n * val at: At by message\n * val image: Image by message\n * ```\n */\n@JvmSynthetic\npublic inline operator fun <reified T : SingleMessage> MessageChain.getValue(thisRef: Any?, property: KProperty<*>): T =\n    this.firstIsInstance()\n\n/**\n * 可空的委托\n * @see orNull\n */\n@JvmInline\n@Suppress(\"NON_PUBLIC_PRIMARY_CONSTRUCTOR_OF_INLINE_CLASS\")\npublic value class OrNullDelegate<out R> @PublishedApi internal constructor(@JvmField @PublishedApi internal val value: Any?) {\n    @Suppress(\"UNCHECKED_CAST\") // don't inline, IC error\n    public operator fun getValue(thisRef: Any?, property: KProperty<*>): R = value as R\n}\n\n/**\n * 提供一个类型的 [Message] 的委托, 若不存在这个类型的 [Message] 则委托会提供 `null`\n *\n * 用法:\n * ```\n * val message: MessageChain\n *\n * val at: At? by message.orNull()\n * ```\n * @see orNull 提供一个不存在则 null 的委托\n * @see orElse 提供一个不存在则使用默认值的委托\n */\n@JvmSynthetic\npublic inline fun <reified T : SingleMessage> MessageChain.orNull(): OrNullDelegate<T?> =\n    OrNullDelegate(this.firstIsInstanceOrNull<T>())\n\n/**\n * 提供一个类型的 [Message] 的委托, 若不存在这个类型的 [Message] 则委托会提供 `null`\n *\n * 用法:\n * ```\n * val message: MessageChain\n *\n * val at: At by message.orElse { /* 返回一个 At */  }\n * val atNullable: At? by message.orElse { /* 返回一个 At? */  }\n * ```\n * @see orNull 提供一个不存在则 null 的委托\n */\n@Suppress(\"RemoveExplicitTypeArguments\")\n@JvmSynthetic\npublic inline fun <reified T : R, R : SingleMessage?> MessageChain.orElse(\n    lazyDefault: () -> R\n): OrNullDelegate<R> = OrNullDelegate<R>(this.firstIsInstanceOrNull<T>() ?: lazyDefault())\n\n// endregion delegate"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/MessageChainBuilder.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlin.contracts.InvocationKind.EXACTLY_ONCE\nimport kotlin.contracts.contract\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmSynthetic\n\n/**\n * 构建一个 [MessageChain]. 用法查看 [MessageChainBuilder].\n *\n * @see MessageChainBuilder\n */\npublic inline fun buildMessageChain(block: MessageChainBuilder.() -> Unit): MessageChain {\n    contract { callsInPlace(block, EXACTLY_ONCE) }\n    return MessageChainBuilder().apply(block).asMessageChain()\n}\n\n/**\n * 使用特定的容器大小构建一个 [MessageChain]. 用法查看 [MessageChainBuilder].\n *\n * @see MessageChainBuilder\n */\npublic inline fun buildMessageChain(initialSize: Int, block: MessageChainBuilder.() -> Unit): MessageChain {\n    contract { callsInPlace(block, EXACTLY_ONCE) }\n    return MessageChainBuilder(initialSize).apply(block).asMessageChain()\n}\n\n/**\n * [MessageChain] 构建器.\n *\n * **注意:** 无并发安全性.\n *\n * ### 连续 String 优化\n *\n * 多个连续的 [String] 会被连接为单个 [PlainText] 以优化性能。\n *\n * ```java\n * MessageChain chain = new MessageChainBuilder()\n *     .append(\"Hello \")\n *     .append(\"mirai!\")\n *     .build();\n *\n * // chain 将会只包含一个 [PlainText], 其内容为 \"Hello mirai!\".\n * ```\n *\n * ## Kotlin 示例\n *\n * ```\n * val chain = buildMessageChain {\n *     +PlainText(\"a\")\n *     +AtAll\n *     +Image(\"/f8f1ab55-bf8e-4236-b55e-955848d7069f\")\n *     add(At(123456))\n * }\n * ```\n *\n * 该示例中 `+` 是 [MessageChainBuilder.unaryPlus]. 使用 `+` 和使用 `add` 是相等的.\n *\n * ## Java 示例\n * ```java\n * MessageChain chain = new MessageChainBuilder()\n *     .append(new PlainText(\"string\"))\n *     .append(\"string\") // 会被构造成 PlainText 再添加, 相当于上一行\n *     .append(AtAll.INSTANCE)\n *     .append(Image.fromId(\"{f8f1ab55-bf8e-4236-b55e-955848d7069f}.png\"))\n *     .build();\n * ```\n *\n * @see buildMessageChain 推荐使用\n * @see asMessageChain 完成构建\n */\npublic class MessageChainBuilder private constructor(\n    private val container: MutableList<SingleMessage>\n) : MutableList<SingleMessage> by container, Appendable {\n    public constructor() : this(mutableListOf())\n    public constructor(initialSize: Int) : this(ArrayList<SingleMessage>(initialSize))\n\n    public override fun add(element: SingleMessage): Boolean {\n        flushCache()\n        return container.add(element)\n    }\n\n    public fun add(element: Message): Boolean {\n        flushCache()\n        @Suppress(\"UNCHECKED_CAST\")\n        return when (element) {\n            // is ConstrainSingle -> container.add(element)\n            is SingleMessage -> container.add(element) // no need to constrain\n            is MessageChain -> addAll(element)\n            is Iterable<*> -> this.addAll(element.toMessageChain())\n            else -> error(\"stub\")\n        }\n    }\n\n    public override fun addAll(elements: Collection<SingleMessage>): Boolean {\n        flushCache()\n        return addAll(elements.asIterable())\n    }\n\n    public fun addAll(elements: Iterable<SingleMessage>): Boolean {\n        flushCache()\n        var result = false\n        for (item in elements) {\n            if (add(item)) result = true\n        }\n        return result\n    }\n\n    @JvmName(\"addAllFlatten\") // erased generic type cause declaration clash\n    public fun addAll(elements: Iterable<Message>): Boolean {\n        flushCache()\n        var result = false\n        for (item in elements) {\n            if (add(item)) result = true\n        }\n        return result\n    }\n\n    @JvmSynthetic\n    public operator fun Message.unaryPlus() {\n        flushCache()\n        add(this)\n    }\n\n\n    @JvmSynthetic\n    public operator fun String.unaryPlus() {\n        add(this)\n    }\n\n    @JvmSynthetic // they should use add\n    public operator fun plusAssign(plain: String) {\n        withCache { append(plain) }\n    }\n\n    @JvmSynthetic // they should use add\n    public operator fun plusAssign(message: Message) {\n        flushCache()\n        this.add(message)\n    }\n\n    @JvmSynthetic // they should use add\n    public operator fun plusAssign(message: SingleMessage) { // avoid resolution ambiguity\n        flushCache()\n        this.add(message)\n    }\n\n    public fun add(plain: String) {\n        withCache { append(plain) }\n    }\n\n    @JvmSynthetic // they should use add\n    public operator fun plusAssign(charSequence: CharSequence) {\n        withCache { append(charSequence) }\n    }\n\n    public override fun append(value: Char): MessageChainBuilder = withCache { append(value) }\n    public override fun append(value: CharSequence?): MessageChainBuilder = withCache { append(value) }\n    public override fun append(value: CharSequence?, startIndex: Int, endIndex: Int): MessageChainBuilder =\n        withCache { append(value, startIndex, endIndex) }\n\n    public fun append(message: Message): MessageChainBuilder = apply { add(message) }\n    public fun append(message: SingleMessage): MessageChainBuilder = apply { add(message) }\n\n    // avoid resolution to extensions\n    public fun asMessageChain(): MessageChain {\n        this.flushCache()\n        return this.toMessageChain()\n    }\n\n    /** 同 [asMessageChain] */\n    public fun build(): MessageChain = asMessageChain()\n\n    /**\n     * 将所有已有元素引用复制到一个新的 [MessageChainBuilder]\n     */\n    public fun copy(): MessageChainBuilder {\n        return MessageChainBuilder(container.toMutableList()).also {\n            it.cache.append(this.cache)\n        }\n    }\n\n    public override fun remove(element: SingleMessage): Boolean {\n        return container.remove(element)\n    }\n\n    public override fun removeAll(elements: Collection<SingleMessage>): Boolean {\n        return container.removeAll(elements)\n    }\n\n    public override fun removeAt(index: Int): SingleMessage {\n        return container.removeAt(index)\n    }\n\n    public override fun clear() {\n        cache.setLength(0)\n        return container.clear()\n    }\n\n    public override fun set(index: Int, element: SingleMessage): SingleMessage {\n        return container.set(index, element)\n    }\n\n\n    /**\n     * 缓存通过 `add(String)` 添加的字符串, 将连续的字符串连接为一个 [PlainText]\n     */\n    private val cache: StringBuilder = StringBuilder()\n    private fun flushCache() {\n        if (cache.isNotEmpty()) {\n            container.add(PlainText(cache.toString()))\n            cache.setLength(0)\n        }\n    }\n\n    private inline fun withCache(block: StringBuilder.() -> Unit): MessageChainBuilder {\n        contract { callsInPlace(block, EXACTLY_ONCE) }\n\n        cache.apply(block)\n        return this\n    }\n\n    private var firstConstrainSingleIndex = -1\n\n    private fun addAndCheckConstrainSingle(element: SingleMessage): Boolean {\n        return container.add(element)\n        /*\n        if (element is ConstrainSingle) {\n            if (firstConstrainSingleIndex == -1) {\n                firstConstrainSingleIndex = container.size\n                return container.add(element)\n            }\n            val key = element.key\n\n            val index = container.indexOfFirst(firstConstrainSingleIndex) { it is ConstrainSingle && it.key.isSubKeyOf(key) }\n            if (index != -1) {\n                container[index] = element\n            } else {\n                container.add(element)\n            }\n\n            return true\n        } else {\n            return container.add(element)\n        }*/\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/MessageKey.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.message.data\n\nimport kotlin.jvm.JvmField\n\n/**\n * 类型 Key. 由伴生对象实现, 表示一个 [Message] 对象的类型.\n *\n * 每个 [ConstrainSingle] 类型都拥有一个伴生对象来持有 [MessageKey] 以允许 `val source = chain[MessageSource]` 的用法.\n *\n * #### 用例\n * [MessageChain.get][MessageChain.get]: 允许使用数组访问操作符获取指定类型的消息元素\n * ```\n * val source: MessageSource = chain[MessageSource]\n * ```\n *\n * @param M 指代持有这个 Key 的消息类型\n */\npublic interface MessageKey<out M : SingleMessage> {\n    /**\n     * 将一个 [SingleMessage] 强转为 [M] 类型. 在类型不符合时返回 `null`\n     */\n    public val safeCast: (SingleMessage) -> M?\n}\n\n\n/**\n * 独立的 [MessageKey] 的实现. '独立' 即 `final`, 不支持多态类型. 适用于作为最顶层的 [MessageKey], 如 [MessageSource].\n *\n * @see AbstractPolymorphicMessageKey\n */\npublic abstract class AbstractMessageKey<out M : SingleMessage>(\n    override val safeCast: (SingleMessage) -> M?,\n) : MessageKey<M>\n\n\n/**\n * 多态 [MessageKey].\n *\n * 示例: [HummerMessage]\n * ```\n *               MessageContent\n *                     ↑\n *               HummerMessage\n *                     ↑\n *        +------------+-------------+------------+\n *        |            |             |            |\n *  PokeMessage     VipFace      FlashImage      ...\n *\n * ```\n *\n * 当 [连接][Message.plus] 一个 [VipFace] 到一个 [MessageChain] 时,\n * 由于 [VipFace] 最上层为 [MessageContent], 消息链中第一个 [MessageContent] 会被 (保留顺序地) 替换为 [VipFace], 其他所有 [MessageContent] 都会被删除.\n *\n * 如:\n * ```\n * val source: MessageSource = ...\n *\n * val result = messageChainOf(PlainText(\"a\"), PlainText(\"b\"), source, AtAll) + VipFace.LiuLian\n * // result 为 [VipFace.LiuLian, source]\n *\n * val result = source1 + source2\n * // result 为 [source2], 总是右侧替换左侧\n * ```\n */\npublic abstract class AbstractPolymorphicMessageKey<out B : SingleMessage, out M : B>(\n    baseKey: MessageKey<B>,\n    safeCast: (SingleMessage) -> M?,\n) : MessageKey<M>, AbstractMessageKey<M>(safeCast) {\n    @JvmField\n    internal val topmostKey: MessageKey<*> =\n        if (baseKey is AbstractPolymorphicMessageKey<*, *>) baseKey.topmostKey else baseKey\n}\n\n/**\n * 尝试 [MessageKey.safeCast], 成功时返回 `true`\n */\npublic fun MessageKey<*>.isInstance(message: SingleMessage): Boolean = this.safeCast(message) != null\n\n/**\n * 获取最上层 [MessageKey].\n * @see AbstractPolymorphicMessageKey\n */\npublic val <A : SingleMessage> MessageKey<A>.topmostKey: MessageKey<*>\n    get() = when (this) {\n        is AbstractPolymorphicMessageKey<*, *> -> this.topmostKey\n        else -> this\n    }"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/MessageOrigin.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:Suppress(\"MemberVisibilityCanBePrivate\", \"unused\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.Polymorphic\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.IMirai\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.isSameClass\nimport net.mamoe.mirai.utils.safeCast\n\n/**\n * 标识来源 [RichMessage], 存在于接收的 [MessageChain] 中. 在发送消息时会被忽略.\n *\n * 一些 [RichMessage] 会被 mirai 解析成特定的更易使用的类型, 如:\n * - 长消息会被协议内部转化为 [ServiceMessage] `serviceId=35` 通过独立通道上传和下载并获得一个 [resourceId]. mirai 会自动下载长消息并把他们解析为 [MessageChain].\n * - 合并转发也使用长消息通道传输, 拥有 [resourceId], mirai 解析为 [ForwardMessage]\n * - [MusicShare] 也有特殊通道上传, 但会作为 [LightApp] 接收.\n *\n * 这些经过转换的类型的来源 [RichMessage] 会被包装为 [MessageOrigin] 并加入消息链中.\n *\n * 如一条被 mirai 解析的长消息的消息链组成为, 第一个元素为 [MessageSource], 第二个元素为 [MessageOrigin], 随后为长消息内容.\n *\n * 又如一条被 mirai 解析的 [MusicShare] 的消息链组成为, 第一个元素为 [MessageSource], 第二个元素为 [MessageOrigin], 第三个元素为 [MusicShare].\n *\n * @suppress **注意**: 这是实验性 API: 可能会在未来任意时刻变更.\n *\n * @since 2.6\n */\n@Serializable\n@SerialName(MessageOrigin.SERIAL_NAME)\n@MiraiExperimentalApi\npublic class MessageOrigin(\n    // [2.3, 2.6-M1) 类名为 RichMessageOrigin\n    /**\n     * 原 [SingleMessage].\n     */\n    public val origin: @Polymorphic SingleMessage,\n    /**\n     * 如果来自长消息或转发消息, 则会有 [resourceId], 否则为 `null`.\n     *\n     * - 下载长消息 [IMirai.downloadLongMessage]\n     * - 下载合并转发消息 [IMirai.downloadForwardMessage]\n     */\n    public val resourceId: String?,\n    /**\n     * 来源类型\n     */\n    public val kind: MessageOriginKind,\n) : MessageMetadata, ConstrainSingle {\n    override val key: Key get() = Key\n\n    override fun toString(): String {\n        val resourceId = resourceId\n        return if (resourceId == null) \"[mirai:origin:$kind]\"\n        else \"[mirai:origin:$kind,$resourceId]\"\n    }\n\n    override fun contentToString(): String = \"\"\n\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (other !is MessageOrigin || !isSameClass(this, other)) return false\n\n        if (origin != other.origin) return false\n        if (resourceId != other.resourceId) return false\n        if (kind != other.kind) return false\n\n        return true\n    }\n\n    override fun hashCode(): Int {\n        var result = origin.hashCode()\n        result = 31 * result + (resourceId?.hashCode() ?: 0)\n        result = 31 * result + kind.hashCode()\n        return result\n    }\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R = visitor.visitMessageOrigin(this, data)\n\n    public companion object Key : AbstractMessageKey<MessageOrigin>({ it.safeCast() }) {\n        public const val SERIAL_NAME: String = \"MessageOrigin\"\n    }\n}\n\n/**\n * [MessageOrigin] 来源\n * @see MessageOrigin.kind\n * @since 2.6\n */\n@Serializable\npublic enum class MessageOriginKind { // [2.3, 2.6-M1) 类名为 RichMessageKind\n    /**\n     * 长消息\n     */\n    LONG,\n\n    /**\n     * 合并转发\n     * @see ForwardMessage\n     */\n    FORWARD,\n\n    /**\n     * 音乐分享\n     * @see MusicShare\n     */\n    MUSIC_SHARE,\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/MessageSource.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n@file:Suppress(\"unused\", \"INAPPLICABLE_JVM_NAME\", \"DEPRECATION_ERROR\", \"UnUsedImport\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.delay\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.JsonConfiguration\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.IMirai\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.PermissionDeniedException\nimport net.mamoe.mirai.contact.User\nimport net.mamoe.mirai.event.events.MessageEvent\nimport net.mamoe.mirai.internal.message.MessageSourceSerializerImpl\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.MessageSerializers\nimport net.mamoe.mirai.message.action.AsyncRecallResult\nimport net.mamoe.mirai.message.data.MessageSource.Key.quote\nimport net.mamoe.mirai.message.data.MessageSource.Key.recall\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.safeCast\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmStatic\nimport kotlin.jvm.JvmSynthetic\n\n/**\n * 表示聊天中的一条消息的定位信息, 即消息源.\n *\n * 一个[消息源][MessageSource]可用于定位一条存在于服务器中的消息, 因此可用来[撤回][recall]或[引用][quote]该消息\n *\n * 消息源可存在于 [MessageChain] 中, 用于表示这个消息的来源, 也可以用来分辨 [MessageChain].\n *\n * 消息源分为在线消息源 [OnlineMessageSource] 和离线消息源 [OfflineMessageSource].\n *\n * ## 属性组成\n * [MessageSource] 由以下属性组成:\n * - 三个*定位属性* [ids], [internalId], [time]\n * - 发送人 ID [fromId]\n * - 收信人 ID [targetId]\n * - 原消息内容 [originalMessage]\n *\n * 官方客户端通过这三个*定位属性*来准确定位消息, 撤回和引用回复都是如此 (有这三个属性才可以精确撤回和引用某个消息).\n *\n * 即使三个*定位属性*就可以知道原消息是哪一条, 但服务器和官方客户端都实现为读取 [originalMessage] 的内容.\n * 也就是说, 如果[引用][quote]一个 [MessageSource], *定位属性*只会被用来支持跳转到原消息, 引用中显示的被引用消息内容只取决于 [originalMessage].\n * 可以通过修改 [originalMessage] 来达到显示的内容与跳转内容不符合的效果. 但一般没有必要这么做.\n *\n * ## 获取消息源实例\n * - 来自 [MessageEvent.message] 的 [MessageChain] 总是包含在线消息源 [OnlineMessageSource]. 可通过 [MessageChain.get] 获取 [MessageSource]:\n *    ```kotlin\n *    // Kotlin\n *    val source: MessageSource? = chain[MessageSource]\n *    val notNull: MessageSource = chain.source // 可能抛出 NoSuchElementException\n *    ```\n *    ```java\n *    // Java\n *    MessageSource source = chain.get(MessageSource.Key);\n *    ```\n * - 构造离线消息源: [IMirai.constructMessageSource]\n * - 使用构建器构造: [MessageSourceBuilder]\n *\n * 参阅 [OnlineMessageSource] 或 [OfflineMessageSource] 可获得更详细的获取实例的方式.\n *\n * ### \"修改\" 一个 [MessageSource]\n * [MessageSource] 是不可变的. 因此不能修改其中属性, 但可以通过 [MessageSource.copyAmend] 或者 [MessageSourceBuilder.allFrom] 来复制一个.\n * ```java\n * MessageSource newSource = new MessageSourceBuilder()\n *     .allFrom(source) // 从 source 继承所有数据\n *     .message(new PlainText(\"aaa\")) // 覆盖消息\n *     .build();\n * ```\n *\n * ## 使用\n *\n * 消息源可用于 [引用回复][MessageSource.quote] 或 [撤回][MessageSource.recall].\n *\n * 对于来自 [MessageEvent.message] 的 [MessageChain], 总是包含 [MessageSource].\n * 因此也可以对这样的 [MessageChain] 进行 [引用回复][MessageChain.quote] 或 [撤回][MessageChain.recall].\n *\n * ### 获取有关 [Bot] 实例\n *\n * 调用 [MessageSource.bot] 或 [MessageSource.botOrNull] 来获取有关 [Bot] 实例.\n *\n * ### Kotlin 示例\n * ```kotlin\n * val source: MessageSource = ...\n * source.recall() // 通过 MessageSource 撤回\n *\n * val event: MessageEvent = ...\n * event.message.recall() // 也可以通过来自服务器的 [MessageChain] 撤回, 因为这些 chain 包含 [MessageSource]\n * ```\n *\n * ### Java 示例\n * ```java\n * MessageSource source = ...\n * MessageSource.recall(source); // 通过 MessageSource 撤回\n *\n * MessageEvent event = ...\n * MessageSource.recall(event.message); // 也可以通过来自服务器的 [MessageChain] 撤回, 因为这些 chain 包含 [MessageSource]\n * ```\n *\n *\n * @see MessageSource.quote 引用这条消息, 创建 [MessageChain]\n *\n * @see OnlineMessageSource 在线消息的 [MessageSource]\n * @see OfflineMessageSource 离线消息的 [MessageSource]\n *\n * @see buildMessageSource 构建一个 [OfflineMessageSource]\n */\n@Suppress(\"DEPRECATION\")\n@Serializable(MessageSource.Serializer::class)\npublic sealed class MessageSource : Message, MessageMetadata, ConstrainSingle {\n    public final override val key: MessageKey<MessageSource>\n        get() = Key\n\n    /**\n     * 所属 [Bot.id]\n     */\n    public abstract val botId: Long\n\n    /**\n     * 消息 ids (序列号). 在获取失败时 (概率很低) 为空数组.\n     *\n     * ### 顺序\n     * 群消息的 id 由服务器维护. 好友消息的 id 由 mirai 维护.\n     * 此 id 不一定从 0 开始.\n     *\n     * - 在同一个群的消息中此值随每条消息递增 1, 但此行为由服务器决定, mirai 不保证自增顺序.\n     * - 在好友消息中无法保证每次都递增 1. 也可能会产生大幅跳过的情况.\n     *\n     * ### 多 ID 情况\n     * 对于单条消息, [ids] 为单元素数组. 对于分片 (一种长消息处理机制) 消息, [ids] 将包含多元素.\n     *\n     * [internalIds] 与 [ids] 以数组下标对应.\n     */\n    public abstract val ids: IntArray\n\n    /**\n     * 内部 ids. **仅用于协议模块使用**\n     *\n     * 值没有顺序, 也可能为 0, 取决于服务器是否提供.\n     *\n     * 在事件中和在引用中无法保证同一条消息的 [internalIds] 相同.\n     *\n     * [internalIds] 与 [ids] 以数组下标对应.\n     *\n     * @see ids\n     */\n    public abstract val internalIds: IntArray\n\n    /**\n     * 发送时间时间戳, 单位为秒.\n     *\n     * 自 2.8.0 起, 时间戳为服务器时区 (UTC+8).\n     * 在 2.8.0 以前, 时间戳可能来自服务器 (UTC+8), 也可能来自 mirai (本地), 且无法保证两者时间同步.\n     */\n    public abstract val time: Int\n\n    /**\n     * 发送人用户 ID.\n     *\n     * - 当 [OnlineMessageSource.Outgoing] 时为 [机器人][Bot.id]\n     * - 当 [OnlineMessageSource.Incoming] 时为发信 [来源用户][User.id] 或 [群][Group.id]\n     * - 当 [OfflineMessageSource] 时取决于 [OfflineMessageSource.kind]\n     */\n    public abstract val fromId: Long\n\n    /**\n     * 消息发送目标用户或群号码.\n     *\n     * - 当 [OnlineMessageSource.Outgoing] 时为发信 [目标用户][User.id] 或 [群][Group.id]\n     * - 当 [OnlineMessageSource.Incoming] 时为 [机器人][Bot.id]\n     * - 当 [OfflineMessageSource] 时取决于 [OfflineMessageSource.kind]\n     */\n    public abstract val targetId: Long // groupCode / friendUin / memberUin\n\n    /**\n     * 该消息源指向的原消息的内容.\n     *\n     * ## 内容不一定完整\n     * 如果消息源是来自一条引用回复, 即 [QuoteReply.source], 那么原消息内容不一定完整.\n     *\n     * 此属性是惰性初始化的: 它只会在第一次调用时初始化, 因为需要反序列化服务器发来的整个包, 相当于接收了一条新消息.\n     */\n    public abstract val originalMessage: MessageChain // see OutgoingMessageSourceInternal.originalMessage\n\n    /**\n     * 当 [originalMessage] 已被初始化后返回 `true`.\n     *\n     * @since 2.12\n     */\n    public abstract val isOriginalMessageInitialized: Boolean\n\n    /**\n     * 消息种类\n     *\n     * @since 2.15\n     */\n    public abstract val kind: MessageSourceKind\n\n    public abstract override fun toString(): String\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitMessageSource(this, data)\n    }\n\n    @OptIn(MiraiInternalApi::class)\n    @Deprecated(\"Do not use this serializer. Retrieve from `MessageSerializers.serializersModule`.\")\n    @DeprecatedSinceMirai(warningSince = \"2.13\")\n    public object Serializer : KSerializer<MessageSource> by MessageSourceSerializerImpl(\"MessageSource\")\n\n    public companion object Key : AbstractMessageKey<MessageSource>({ it.safeCast() }) {\n        /**\n         * 从 [MessageSerializers] 获取到的对应[序列化器][KSerializer]在参与多态序列化时的[类型标识符][JsonConfiguration.classDiscriminator]的值.\n         *\n         * [OnlineMessageSource] 的部分属性无法通过序列化保存. 所有 [MessageSource] 子类型在序列化时都会序列化为 [OfflineMessageSource]. 反序列化时会得到 [OfflineMessageSource] 而不是原类型.\n         */\n        public const val SERIAL_NAME: String = \"MessageSource\"\n\n        /**\n         * 以 [Bot] 身份撤回该[消息源][this]指向的存在于服务器上的消息. 可撤回自己 2 分钟内发出的消息, 和任意时间的群成员的消息.\n         *\n         * *提示: 若要撤回一条机器人自己发出的消息, 使用 [Contact.sendMessage] 返回的 [MessageReceipt] 中的 [MessageReceipt.recall]*\n         *\n         * ## 需求的权限\n         *\n         * - [Bot] 撤回自己的消息不需要权限.\n         * - [Bot] 撤回群员的消息需要管理员权限.\n         *\n         * @throws PermissionDeniedException 当 [Bot] 无权限操作时\n         * @throws IllegalStateException 当这条消息已经被撤回时抛出\n         *\n         * @see IMirai.recallMessage\n         */\n        @JvmStatic\n        @JvmBlockingBridge\n        public suspend fun MessageSource.recall() {\n            // don't inline, compilation error\n            Mirai.recallMessage(bot, this)\n        }\n\n        /**\n         * 以 [Bot] 身份撤回[该消息][this]. 可撤回自己 2 分钟内发出的消息, 和任意时间的群成员的消息.\n         *\n         * **注意:** 仅从服务器接收的消息 (即来自 [MessageEvent.message]), 或手动添加了 [MessageSource] 元素的 [MessageChain] 才可以撤回.\n         *\n         * *提示: 若要撤回一条机器人自己发出的消息, 使用 [Contact.sendMessage] 返回的 [MessageReceipt] 中的 [MessageReceipt.recall]*\n         *\n         * ## 需求的权限\n         *\n         * - [Bot] 撤回自己的消息不需要权限.\n         * - [Bot] 撤回群员的消息需要管理员权限.\n         *\n         * @throws PermissionDeniedException 当 [Bot] 无权限操作时\n         * @throws IllegalStateException 当这条消息已经被撤回时抛出\n         *\n         * @see IMirai.recallMessage\n         */\n        @JvmStatic\n        @JvmBlockingBridge\n        public suspend fun MessageChain.recall() {\n            this[MessageSource]?.let {\n                it.recall()\n                return\n            }\n            throw NoSuchElementException(tipsForNoMessageSource)\n        }\n\n        private const val tipsForNoMessageSource = \"No MessageSource found from input MessageChain. Tips: \" +\n                \"You can't recall a MessageChain which is built by you, \" +\n                \"as it lacks ids of the message on the server. \" +\n                \"If you want to recall a message after sending it, \" +\n                \"you can call `recallIn` method on the `MessageReceipt` returned by `sendMessage`.\"\n\n        /**\n         * 在一段时间后撤回这条消息.\n         *\n         * **注意:** 仅从服务器接收的消息 (即来自 [MessageEvent.message]), 或手动添加了 [MessageSource] 元素的 [MessageChain] 才可以撤回.\n         *\n         * *提示: 若要撤回一条机器人自己发出的消息, 使用 [Contact.sendMessage] 返回的 [MessageReceipt] 中的 [MessageReceipt.recall]*\n         *\n         * ## 需求的权限\n         *\n         * - [Bot] 撤回自己的消息不需要权限.\n         * - [Bot] 撤回群员的消息需要管理员权限.\n         *\n         * @return 返回撤回的异步结果. 参考 [AsyncRecallResult].\n         * @see MessageChain.recall\n         */\n        @JvmStatic\n        public fun MessageChain.recallIn(millis: Long): AsyncRecallResult {\n            this[MessageSource]?.let {\n                return it.recallIn(millis)\n            }\n            throw NoSuchElementException(tipsForNoMessageSource)\n        }\n\n        /**\n         * 在一段时间后撤回这条消息.\n         *\n         * **注意:** 仅从服务器接收的消息 (即来自 [MessageEvent.message]), 或手动添加了 [MessageSource] 元素的 [MessageChain] 才可以撤回.\n         *\n         * *提示: 若要撤回一条机器人自己发出的消息, 使用 [Contact.sendMessage] 返回的 [MessageReceipt] 中的 [MessageReceipt.recall]*\n         *\n         * ## 需求的权限\n         *\n         * - [Bot] 撤回自己的消息不需要权限.\n         * - [Bot] 撤回群员的消息需要管理员权限.\n         *\n         * @return 返回撤回的异步结果. 参考 [AsyncRecallResult].\n         *\n         * @see MessageSource.recall\n         */\n        @JvmStatic\n        public fun MessageSource.recallIn(millis: Long): AsyncRecallResult {\n            return AsyncRecallResult(bot.async {\n                try {\n                    delay(millis)\n                    Mirai.recallMessage(bot, this@recallIn)\n                    null\n                } catch (e: Throwable) {\n                    e\n                }\n            })\n        }\n\n        /**\n         * 引用这条消息.\n         * @see QuoteReply\n         */\n        @JvmStatic\n        public fun MessageSource.quote(): QuoteReply = QuoteReply(this)\n\n        /**\n         * 引用这条消息. 仅从服务器接收的消息 (即来自 [MessageEvent]) 才可以通过这个方式被引用.\n         * @see QuoteReply\n         */\n        @JvmStatic\n        public fun MessageChain.quote(): QuoteReply = QuoteReply(this.source)\n    }\n}\n\n\n/**\n * 消息来源类型\n */\n@Serializable\npublic enum class MessageSourceKind {\n    /**\n     * 群消息\n     */\n    GROUP,\n\n    /**\n     * 好友消息\n     */\n    FRIEND,\n\n    /**\n     * 来自群成员的临时会话消息\n     */\n    TEMP,\n\n    /**\n     * 来自陌生人的消息\n     */\n    STRANGER\n}\n\n/*\n  public static final net.mamoe.mirai.message.data.MessageSourceKind getKind(net.mamoe.mirai.message.data.MessageSource);\n  public static final net.mamoe.mirai.message.data.MessageSourceKind getKind(net.mamoe.mirai.message.data.OnlineMessageSource);\n */\n@JvmName(\"getKind\")\n@Deprecated(\"For ABI compatibility\", level = DeprecationLevel.HIDDEN)\npublic fun getKindLegacy(source: MessageSource): MessageSourceKind = source.kind\n\n@JvmName(\"getKind\")\n@Deprecated(\"For ABI compatibility\", level = DeprecationLevel.HIDDEN)\npublic fun getKindLegacy(source: OnlineMessageSource): MessageSourceKind = source.kind\n\n\n// For MessageChain, no need to expose to Java.\n\n/**\n * 消息 ids.\n *\n * 仅从服务器接收的消息 (即来自 [MessageEvent.message]), 或手动添加了 [MessageSource] 元素的 [MessageChain] 才可以获取消息源.\n *\n * @see MessageSource.ids\n */\n@get:JvmSynthetic\npublic inline val MessageChain.ids: IntArray\n    get() = this.source.ids\n\n/**\n * 消息内部 ids.\n *\n * 仅从服务器接收的消息 (即来自 [MessageEvent.message]), 或手动添加了 [MessageSource] 元素的 [MessageChain] 才可以获取消息源.\n *\n * @see MessageSource.ids\n */\n@get:JvmSynthetic\npublic inline val MessageChain.internalId: IntArray\n    get() = this.source.internalIds\n\n/**\n * 消息时间.\n *\n * 仅从服务器接收的消息 (即来自 [MessageEvent.message]), 或手动添加了 [MessageSource] 元素的 [MessageChain] 才可以获取消息源.\n *\n * @see MessageSource.ids\n */\n@get:JvmSynthetic\npublic inline val MessageChain.time: Int\n    get() = this.source.time\n\n/**\n * 消息内部 ids.\n *\n * 仅从服务器接收的消息 (即来自 [MessageEvent.message]), 或手动添加了 [MessageSource] 元素的 [MessageChain] 才可以获取. 否则将抛出异常 [NoSuchElementException]\n *\n * @see MessageSource.ids\n */\n@get:JvmSynthetic\npublic inline val MessageChain.bot: Bot\n    get() = this.source.bot\n\n/**\n * 获取这条消息的 [消息源][MessageSource].\n *\n * 仅从服务器接收的消息 (即来自 [MessageEvent.message]), 或手动添加了 [MessageSource] 元素的 [MessageChain] 才可以获取消息源, 否则将抛出异常 [NoSuchElementException]\n *\n * @see sourceOrNull\n */\n@get:JvmSynthetic\npublic inline val MessageChain.source: MessageSource\n    get() = this.getOrFail(MessageSource)\n\n/**\n * 获取这条消息的 [消息源][MessageSource].\n *\n * 仅从服务器接收的消息 (即来自 [MessageEvent.message]), 或手动添加了 [MessageSource] 元素的 [MessageChain] 才可以获取消息源, 否则返回 `null`\n *\n * @see source\n */\n@get:JvmSynthetic\npublic inline val MessageChain.sourceOrNull: MessageSource?\n    get() = this[MessageSource]\n\n/**\n * 获取此消息源的相关 [Bot].\n *\n * 对于 [OnlineMessageSource], 此操作总是会成功.\n * 但对于 [OfflineMessageSource], 若此时该 [ID][Bot.id] 的 [Bot] 不存在, 则会抛出 [NoSuchElementException].\n *\n * @throws NoSuchElementException 当目标 [Bot] 不存在时抛出\n */\npublic inline val MessageSource.bot: Bot\n    get() = when (this) {\n        is OnlineMessageSource -> bot\n        is OfflineMessageSource -> Bot.getInstance(botId)\n    }\n\n/**\n * 获取此消息源的相关 [Bot].\n *\n * 对于 [OnlineMessageSource], 此操作总是返回非 `null`.\n * 但对于 [OfflineMessageSource], 若此时该 [ID][Bot.id] 的 [Bot] 不存在, 则会返回 `null`.\n */\npublic inline val MessageSource.botOrNull: Bot?\n    get() = when (this) {\n        is OnlineMessageSource -> bot\n        is OfflineMessageSource -> Bot.getInstanceOrNull(botId)\n    }\n\n\n\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/MessageSourceBuilder.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n@file:Suppress(\"NOTHING_TO_INLINE\", \"unused\", \"INAPPLICABLE_JVM_NAME\", \"INVISIBLE_MEMBER\")\n\npackage net.mamoe.mirai.message.data\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.IMirai\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.contact.ContactOrBot\nimport net.mamoe.mirai.message.data.MessageSource.Key.quote\nimport net.mamoe.mirai.message.data.MessageSource.Key.recall\nimport net.mamoe.mirai.utils.currentTimeSeconds\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmSynthetic\n\n/**\n * 将在线消息源转换为离线消息源.\n */\n@JvmName(\"toOfflineMessageSource\")\npublic fun OnlineMessageSource.toOffline(): OfflineMessageSource =\n    Mirai.constructMessageSource(botId, kind, fromId, targetId, ids, time, internalIds, originalMessage)\n\n///////////////\n//// AMEND ////\n///////////////\n\n\n/**\n * 复制这个消息源, 并以 [block] 修改\n *\n * @see buildMessageSource 查看更多说明\n */\n@JvmName(\"copySource\")\npublic fun MessageSource.copyAmend(\n    block: MessageSourceAmender.() -> Unit\n): OfflineMessageSource = MessageSourceAmender(this).apply(block).run {\n    Mirai.constructMessageSource(botId, kind, fromId, targetId, ids, time, internalIds, originalMessage)\n}\n\n/**\n * [MessageSource] 复制修改器. 不会修改原 [MessageSource], 而是会创建一个新的 [MessageSource].\n *\n * @see copyAmend Kotlin DSL\n * @see MessageSourceBuilder\n */\npublic class MessageSourceAmender public constructor(\n    origin: MessageSource,\n) : MessageSourceBuilder() {\n    public var kind: MessageSourceKind = origin.kind\n    public var originalMessage: MessageChain = origin.originalMessage\n\n    public override var fromId: Long = origin.fromId\n    public override var targetId: Long = origin.targetId\n    public override var ids: IntArray = origin.ids\n    public override var time: Int = origin.time\n    public override var internalIds: IntArray = origin.internalIds\n}\n\n\n///////////////\n//// BUILD ////\n///////////////\n\n\n/**\n * 使用 DSL 构建一个 [OfflineMessageSource]. 用法参考 [MessageSourceBuilder].\n *\n * @see copyAmend\n */\n@JvmSynthetic\npublic inline fun IMirai.buildMessageSource(\n    botId: Long,\n    kind: MessageSourceKind,\n    block: MessageSourceBuilder.() -> Unit\n): OfflineMessageSource = MessageSourceBuilder().apply(block).build(botId, kind)\n\n/**\n * 使用 DSL 构建一个 [OfflineMessageSource]. 用法参考 [MessageSourceBuilder].\n *\n * @see buildMessageSource\n */\n@JvmSynthetic\npublic inline fun Bot.buildMessageSource(\n    kind: MessageSourceKind,\n    block: MessageSourceBuilder.() -> Unit\n): OfflineMessageSource = Mirai.buildMessageSource(this.id, kind, block)\n\n\n/**\n * 离线消息源构建器.\n *\n * ### 参数\n * 一个 [OfflineMessageSource] 需要以下参数:\n * - 发送人和发送目标: 通过 [MessageSourceBuilder.sender], [MessageSourceBuilder.target] 设置\n * - 消息元数据 (即 [MessageSource.ids], [MessageSource.internalIds], [MessageSource.time])\n *   元数据用于 [撤回][MessageSource.recall], [引用回复][MessageSource.quote], 和官方客户端定位原消息.\n *   可通过 [MessageSourceBuilder.ids], [MessageSourceBuilder.time], [MessageSourceBuilder.internalIds] 设置\n *   可通过 [MessageSourceBuilder.metadata] 从另一个 [MessageSource] 复制\n * - 消息内容: 通过 [MessageSourceBuilder.messages] 设置\n *\n * ### 性质\n * - 当两个消息的元数据相同时, 它们在群中会是同一条消息. 可通过此特性决定官方客户端 \"定位原消息\" 的目标\n * - 发送人的信息和消息内容会在官方客户端显示在引用回复中.\n *\n * ### 实例\n * Kotlin:\n * ```\n * bot.buildMessageSource(MessageSourceKind.GROUP) {\n *     from(bot)\n *     target(target)\n *     metadata(source) // 从另一个消息源复制 ids, internalIds, time\n *\n *     time(System.currentTimeMillis())\n *     // 也可以不设置 time, 则会使用当前系统时间\n *\n *     messages { // 指定消息内容\n *         +\"hi\"\n *     }\n *\n *     messages(messageChain) // 也可以赋值一个 MessageChain\n * }\n * ```\n *\n * Kotlin 也可以使用\n *\n * Java:\n * ```java\n * new MessageSourceBuilder()\n *     .from(bot)\n *     .target(target)\n *     .metadata(source) // 从另一个消息源复制 ids, internalIds, time\n *     .time(System.currentTimeMillis()) // 也可以不设置, 则会使用当前系统时间\n *     .messages(new PlainText(\"hi\"))\n *     .build(botId, MessageSourceKind.FRIEND);\n * ```\n *\n * @see buildMessageSource\n */\npublic open class MessageSourceBuilder public constructor() {\n    public open var fromId: Long = 0\n    public open var targetId: Long = 0\n\n    public open var ids: IntArray = intArrayOf()\n\n    /**\n     * seconds\n     * @see MessageSource.time\n     */\n    public open var time: Int = currentTimeSeconds().toInt()\n    public open var internalIds: IntArray = intArrayOf()\n\n    @PublishedApi\n    internal val originalMessages: MessageChainBuilder = MessageChainBuilder()\n\n    public fun time(from: MessageSource): MessageSourceBuilder = apply { this.time = from.time }\n    public fun time(value: Int): MessageSourceBuilder = apply { this.time = value }\n\n    public fun internalId(from: MessageSource): MessageSourceBuilder = apply { this.internalIds = from.internalIds }\n    public fun internalId(vararg value: Int): MessageSourceBuilder = apply { this.internalIds = value }\n\n    public fun id(from: MessageSource): MessageSourceBuilder = apply { this.ids = from.ids }\n    public fun id(vararg value: Int): MessageSourceBuilder = apply { this.ids = value }\n\n\n    /**\n     * 从另一个 [MessageSource] 复制 [ids], [time], [internalIds].\n     * 这三个数据决定官方客户端能 \"定位\" 到的原消息\n     */\n    public fun metadata(from: MessageSource): MessageSourceBuilder = apply {\n        id(from)\n        internalId(from)\n        time(from)\n    }\n\n    /**\n     * 从另一个 [MessageSource] 复制所有信息, 包括消息内容. 不会清空已有消息.\n     */\n    public fun allFrom(source: MessageSource): MessageSourceBuilder {\n        this.ids = source.ids\n        this.time = source.time\n        this.fromId = source.fromId\n        this.targetId = source.targetId\n        this.internalIds = source.internalIds\n        this.originalMessages.addAll(source.originalMessage)\n        return this\n    }\n\n\n    /**\n     * 从另一个 [MessageSource] 复制 [消息内容][MessageSource.originalMessage]. 不会清空已有消息.\n     */\n    public fun messagesFrom(source: MessageSource): MessageSourceBuilder = apply {\n        this.originalMessages.addAll(source.originalMessage)\n    }\n\n    /**\n     * 添加消息. 不会清空已有消息.\n     */\n    public fun messages(messages: Iterable<Message>): MessageSourceBuilder = apply {\n        this.originalMessages.addAll(messages)\n    }\n\n\n    /**\n     * 添加消息. 不会清空已有消息.\n     */\n    public fun messages(vararg message: Message): MessageSourceBuilder = apply {\n        for (it in message) {\n            this.originalMessages.add(it)\n        }\n    }\n\n    @JvmSynthetic\n    public inline fun messages(block: MessageChainBuilder.() -> Unit): MessageSourceBuilder = apply {\n        this.originalMessages.apply(block)\n    }\n\n    public fun clearMessages(): MessageSourceBuilder = apply { this.originalMessages.clear() }\n\n    /**\n     * 设置发信人.\n     */\n    public fun sender(sender: ContactOrBot): MessageSourceBuilder = apply {\n        this.fromId = sender.id\n    }\n\n    /**\n     * 设置发信人. 需使用 uin.\n     * @see IMirai.getUin\n     */\n    public fun sender(uin: Long): MessageSourceBuilder = apply {\n        this.fromId = uin\n    }\n\n    /**\n     * 设置发信目标\n     */\n    public fun target(target: ContactOrBot): MessageSourceBuilder = apply {\n        this.targetId = target.id\n    }\n\n    /**\n     * 设置发信目标. 需使用 uin.\n     * @see IMirai.getUin\n     */\n    public fun target(uin: Long): MessageSourceBuilder = apply {\n        this.targetId = uin\n    }\n\n    /**\n     * 同时设置 [sender] 和 [target]\n     */\n    public fun setSenderAndTarget(sender: ContactOrBot, target: ContactOrBot): MessageSourceBuilder =\n        sender(sender).target(target)\n\n    /**\n     * 构建生成 [OfflineMessageSource]\n     */\n    public fun build(botId: Long, kind: MessageSourceKind): OfflineMessageSource {\n        return Mirai.constructMessageSource(\n            botId,\n            kind,\n            fromId,\n            targetId,\n            ids,\n            time,\n            internalIds,\n            originalMessages.build()\n        )\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/MusicShare.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.message.code.CodableMessage\nimport net.mamoe.mirai.message.code.internal.appendStringAsMiraiCode\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.safeCast\n\n/**\n * QQ 互联通道音乐分享.\n *\n * 构造实例即可使用.\n *\n * @since 2.1\n */\n@Serializable\n@SerialName(MusicShare.SERIAL_NAME)\npublic data class MusicShare(\n    /**\n     * 音乐应用类型\n     */\n    public val kind: MusicKind, // 'type' is reserved by serialization\n    /**\n     * 消息卡片标题. 例如 `\"ファッション\"`\n     */\n    public val title: String,\n    /**\n     * 消息卡片内容. 例如 `\"rinahamu/Yunomi\"`\n     */\n    public val summary: String,\n    /**\n     * 点击卡片跳转网页 URL. 例如 `\"http://music.163.com/song/1338728297/?userid=324076307\"`\n     */\n    public val jumpUrl: String,\n    /**\n     * 消息卡片图片 URL. 例如 `\"http://p2.music.126.net/y19E5SadGUmSR8SZxkrNtw==/109951163785855539.jpg\"`\n     */\n    public val pictureUrl: String,\n    /**\n     * 音乐文件 URL. 例如 `\"http://music.163.com/song/media/outer/url?id=1338728297&userid=324076307\"`\n     */\n    public val musicUrl: String,\n    /**\n     * 在消息列表显示. 例如 `\"[分享]ファッション\"`\n     */\n    public val brief: String,\n) : MessageContent, ConstrainSingle, CodableMessage {\n\n    /*\n     * 想试试? 可以构造:\n\n       // Kotlin\n       MusicShare(\n           kind = NeteaseCloudMusic,\n           title = \"ジェリーフィッシュ\",\n           summary = \"Yunomi/ローラーガール\",\n           jumpUrl = \"https://y.music.163.com/m/song?id=562591636&uct=QK0IOc%2FSCIO8gBNG%2Bwcbsg%3D%3D&app_version=8.7.46\",\n           pictureUrl = \"http://p1.music.126.net/KaYSb9oYQzhl2XBeJcj8Rg==/109951165125601702.jpg\",\n           musicUrl = \"http://music.163.com/song/media/outer/url?id=562591636&&sc=wmv&tn=\",\n           brief = \"[分享]ジェリーフィッシュ\",\n       )\n\n       // Java\n       new MusicShare(\n           NeteaseCloudMusic,\n           \"ジェリーフィッシュ\",\n           \"Yunomi/ローラーガール\",\n           \"https://y.music.163.com/m/song?id=562591636&uct=QK0IOc%2FSCIO8gBNG%2Bwcbsg%3D%3D&app_version=8.7.46\",\n           \"http://p1.music.126.net/KaYSb9oYQzhl2XBeJcj8Rg==/109951165125601702.jpg\",\n           \"http://music.163.com/song/media/outer/url?id=562591636&&sc=wmv&tn=\",\n           \"[分享]ジェリーフィッシュ\",\n       );\n     */\n\n    public constructor(\n        /**\n         * 音乐应用类型\n         */\n        kind: MusicKind,\n        /**\n         * 消息卡片标题\n         */\n        title: String,\n        /**\n         * 消息卡片内容\n         */\n        summary: String,\n        /**\n         * 点击卡片跳转网页 URL\n         */\n        jumpUrl: String,\n        /**\n         * 消息卡片图片 URL\n         */\n        pictureUrl: String,\n        /**\n         * 音乐文件 URL\n         */\n        musicUrl: String,\n    ) : this(kind, title, summary, jumpUrl, pictureUrl, musicUrl, \"[分享]$title\")\n    // kotlinx serialization doesn't support default arguments.\n\n    override val key: MessageKey<*> get() = Key\n\n    override fun contentToString(): String =\n        brief.takeIf { it.isNotBlank() } ?: \"[分享]$title\" // empty content is not accepted by `sendMessage`\n\n    @MiraiExperimentalApi\n    override fun appendMiraiCodeTo(builder: StringBuilder) {\n        builder.append(\"[mirai:musicshare:\")\n            .append(kind.name)\n            .append(',').appendStringAsMiraiCode(title)\n            .append(',').appendStringAsMiraiCode(summary)\n            .append(',').appendStringAsMiraiCode(jumpUrl)\n            .append(',').appendStringAsMiraiCode(pictureUrl)\n            .append(',').appendStringAsMiraiCode(musicUrl)\n            .append(',').appendStringAsMiraiCode(brief)\n            .append(']')\n    }\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitMusicShare(this, data)\n    }\n\n    /**\n     * 注意, baseKey [MessageContent] 不稳定. 未来可能会有变更.\n     */\n    public companion object Key :\n        AbstractPolymorphicMessageKey<MessageContent, MusicShare>\n            (MessageContent, { it.safeCast() }) {\n\n        /**\n         * @since 2.3\n         */\n        public const val SERIAL_NAME: String = \"MusicShare\"\n    }\n}\n\n/**\n * @see MusicShare.kind\n * @since 2.1\n */\npublic enum class MusicKind constructor(\n    @MiraiInternalApi public val appId: Long,\n    @MiraiInternalApi public val platform: Int,\n    @MiraiInternalApi public val sdkVersion: String,\n    @MiraiInternalApi public val packageName: String,\n    @MiraiInternalApi public val signature: String\n) {\n    NeteaseCloudMusic(\n        100495085,\n        1,\n        \"0.0.0\",\n        \"com.netease.cloudmusic\",\n        \"da6b069da1e2982db3e386233f68d76d\"\n    ),\n    QQMusic(\n        100497308,\n        1,\n        \"0.0.0\",\n        \"com.tencent.qqmusic\",\n        \"cbd27cd7c861227d013a25b2d10f0799\"\n    ),\n    MiguMusic(\n        1101053067,\n        1,\n        \"0.0.0\",\n        \"cmccwm.mobilemusic\",\n        \"6cdc72a439cef99a3418d2a78aa28c73\"\n    ),\n\n    /**\n     * @since 2.7\n     */\n    KugouMusic(\n        205141,\n        1,\n        \"0.0.0\",\n        \"com.kugou.android\",\n        \"fe4a24d80fcf253a00676a808f62c2c6\"\n    ),\n\n    /**\n     * @since 2.7\n     */\n    KuwoMusic(\n        100243533,\n        1,\n        \"0.0.0\",\n        \"cn.kuwo.player\",\n        \"bf9ff4ffb4c558a34ee3fd52c223ebf5\"\n    )\n\n    // add more?  https://github.com/mamoe/mirai/issues/new/choose\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/OfflineMessageSource.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.message.data\n\nimport net.mamoe.mirai.contact.ContactOrBot\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport net.mamoe.mirai.utils.safeCast\n\n/**\n * 一条在本地构建的, 或其他不保证指向一条服务器上存在的消息的消息源.\n *\n * ## 来源\n *\n * 离线消息源可从[引用回复][QuoteReply]中获得, 因为协议上引用回复中的被引用的消息是由客户端自己提供的.\n * 离线消息源也可通过 [MessageSourceBuilder], [MessageSource.copyAmend] 等方法构建得到.\n *\n * 离线消息源可能来自一条与机器人无关的消息, 因此缺少相关发送环境信息, 无法提供 `sender` 或 `target` 的 [ContactOrBot] 对象的获取.\n *\n * ## 构建\n *\n * - 使用 [MessageSourceBuilder] 可使用相关属性构建实例.\n * - 使用 [MessageSource.copyAmend] 复制另外一个 [MessageSource] 得到.\n * - 使用 [OnlineMessageSource.toOffline] 可将 [OfflineMessageSource] 转换得到 [OfflineMessageSource]. 但这一般没有意义.\n */\n@NotStableForInheritance\npublic abstract class OfflineMessageSource : MessageSource() {\n    public companion object Key :\n        AbstractPolymorphicMessageKey<MessageSource, OfflineMessageSource>(MessageSource, { it.safeCast() })\n\n    /**\n     * 消息种类\n     */\n    public abstract override val kind: MessageSourceKind\n\n    final override fun toString(): String {\n        return \"[mirai:source:ids=${ids.contentToString()}, internalIds=${internalIds.contentToString()}, from $fromId to $targetId at $time]\"\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/OnlineMessageSource.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n@file:Suppress(\"unused\", \"INAPPLICABLE_JVM_NAME\", \"DEPRECATION_ERROR\", \"UnUsedImport\")\n\npackage net.mamoe.mirai.message.data\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.event.events.MessageEvent\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.MessageSource.Key.recall\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport net.mamoe.mirai.utils.safeCast\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\n/**\n * 从服务器接收的在线消息的 [MessageSource].\n *\n * 对比 [OfflineMessageSource], [OnlineMessageSource] 拥有完整的信息:\n * - 可获取 [sender] 和 [target] 的 [ContactOrBot] 对象\n * - 可获取有关 [bot] 对象.\n *\n * 此消息源一定 \"指向\" 一条存在于服务器上的消息, 但由于服务器消息可能已经被撤回, 对此消息源执行[撤回][MessageSource.recall] 仍然可能会失败.\n *\n * ### 来源\n * - 当 bot 主动发送消息时, 产生 (由协议模块主动构造) [OnlineMessageSource.Outgoing]\n * - 当 bot 接收消息时, 产生 (由协议模块根据服务器的提供的信息构造) [OnlineMessageSource.Incoming]\n *\n * #### 机器人主动发送消息\n * 当机器人 [主动发出消息][Member.sendMessage], 将会得到一个 [消息回执][MessageReceipt].\n * 此回执的 [消息源][MessageReceipt.source] 即为一个 [外向消息源][OnlineMessageSource.Outgoing], 代表着刚刚发出的那条消息的来源.\n *\n * #### 机器人接受消息\n * 当机器人接收一条消息 [MessageEvent], 这条消息包含一个 [内向消息源][OnlineMessageSource.Incoming], 代表着接收到的这条消息的来源.\n *\n *\n * ### 实现\n * 此类的所有子类都有协议模块实现. 不要自行实现它们, 否则将无法发送\n *\n * @see OnlineMessageSource.toOffline 转为 [OfflineMessageSource]\n */\npublic sealed class OnlineMessageSource : MessageSource() {\n    public companion object Key : AbstractMessageKey<OnlineMessageSource>({ it.safeCast() })\n\n    /**\n     * @see botId\n     */\n    public abstract val bot: Bot\n    final override val botId: Long get() = bot.id\n\n    /**\n     * 消息发送人. 可能为 [机器人][Bot] 或 [好友][Friend] 或 [群员][Member].\n     * 即类型必定为 [Bot], [Friend] 或 [Member]\n     */\n    public abstract val sender: ContactOrBot\n\n    /**\n     * 消息发送目标. 可能为 [机器人][Bot] 或 [好友][Friend] 或 [群][Group].\n     * 即类型必定为 [Bot], [Friend] 或 [Group]\n     */\n    public abstract val target: ContactOrBot\n\n    /**\n     * 消息主体. 群消息时为 [Group]. 好友消息时为 [Friend], 临时消息为 [Member]\n     * 不论是机器人接收的消息还是发送的消息, 此属性都指向机器人能进行回复的目标.\n     */\n    public abstract val subject: Contact\n\n    /*\n     * 以下子类型仅是覆盖了 [target], [subject], [sender] 等的类型\n     */\n\n    /**\n     * 由 [机器人主动发送消息][Contact.sendMessage] 产生的 [MessageSource], 可通过 [MessageReceipt] 获得.\n     */\n    public sealed class Outgoing : OnlineMessageSource() {\n        public companion object Key :\n            AbstractPolymorphicMessageKey<OnlineMessageSource, Outgoing>(OnlineMessageSource, { it.safeCast() })\n\n        public abstract override val sender: Bot\n        public abstract override val target: Contact\n\n        public final override val fromId: Long get() = sender.id\n        public final override val targetId: Long get() = target.id\n\n        @NotStableForInheritance\n        public abstract class ToFriend @MiraiInternalApi constructor() : Outgoing() {\n            public companion object Key : AbstractPolymorphicMessageKey<Outgoing, ToFriend>(Outgoing, { it.safeCast() })\n\n            public abstract override val target: Friend\n            public final override val subject: Friend get() = target\n\n            final override val kind: MessageSourceKind get() = MessageSourceKind.FRIEND\n\n            final override fun toString(): String {\n                return \"[mirai:source:ids=${ids.contentToString()}, internalIds=${internalIds.contentToString()}, from $fromId to friend $targetId at $time]\"\n            }\n        }\n\n        @NotStableForInheritance\n        public abstract class ToStranger @MiraiInternalApi constructor() : Outgoing() {\n            public companion object Key :\n                AbstractPolymorphicMessageKey<Outgoing, ToStranger>(Outgoing, { it.safeCast() })\n\n            public abstract override val target: Stranger\n            public final override val subject: Stranger get() = target\n\n            final override val kind: MessageSourceKind get() = MessageSourceKind.STRANGER\n\n            final override fun toString(): String {\n                return \"[mirai:source:ids=${ids.contentToString()}, internalIds=${internalIds.contentToString()}, from $fromId to stranger $targetId at $time]\"\n            }\n        }\n\n        @NotStableForInheritance\n        public abstract class ToTemp @MiraiInternalApi constructor() : Outgoing() {\n            public companion object Key : AbstractPolymorphicMessageKey<Outgoing, ToTemp>(Outgoing, { it.safeCast() })\n\n            public abstract override val target: Member\n            public val group: Group get() = target.group\n            public final override val subject: Member get() = target\n\n            final override val kind: MessageSourceKind get() = MessageSourceKind.TEMP\n\n            final override fun toString(): String {\n                return \"[mirai:source:ids=${ids.contentToString()}, internalIds=${internalIds.contentToString()}, from $fromId to group temp $targetId at $time]\"\n            }\n        }\n\n        @NotStableForInheritance\n        public abstract class ToGroup @MiraiInternalApi constructor() : Outgoing() {\n            public companion object Key : AbstractPolymorphicMessageKey<Outgoing, ToGroup>(Outgoing, { it.safeCast() })\n\n            public abstract override val target: Group\n            public final override val subject: Group get() = target\n\n            final override val kind: MessageSourceKind get() = MessageSourceKind.GROUP\n\n            final override fun toString(): String {\n                return \"[mirai:source:ids=${ids.contentToString()}, internalIds=${internalIds.contentToString()}, from $fromId to group $targetId at $time]\"\n            }\n        }\n    }\n\n    /**\n     * 接收到的一条消息的 [MessageSource]\n     */\n    public sealed class Incoming : OnlineMessageSource() {\n        /**\n         * 当 [sender] 为 [bot] 自身时为 bot 的对应表示 (如: [Bot.asFriend], [Bot.asStranger], [Group.botAsMember])\n         */\n        public abstract override val sender: User\n\n        /// NOTE: DONT use final to avoid contact not available\n        public override val fromId: Long get() = sender.id\n        public override val targetId: Long get() = target.id\n\n        @NotStableForInheritance\n        public abstract class FromFriend @MiraiInternalApi constructor() : Incoming() {\n            public companion object Key :\n                AbstractPolymorphicMessageKey<Incoming, FromFriend>(Incoming, { it.safeCast() })\n\n            public abstract override val subject: Friend\n\n            /**\n             * 当 [sender] 为 [bot] 自身时为 [Bot.asFriend]\n             */\n            public abstract override val sender: Friend\n            public abstract override val target: ContactOrBot\n\n            @JvmName(\"getTarget\")\n            @Deprecated(\"For ABI compatibility\", level = DeprecationLevel.HIDDEN)\n            public fun getTargetLegacy(): Bot {\n                if (targetId == bot.id) return subject.bot\n\n                error(\"Message target isn't bot; $this\")\n            }\n\n            final override val kind: MessageSourceKind get() = MessageSourceKind.FRIEND\n\n            final override fun toString(): String {\n                return \"[mirai:source:ids=${ids.contentToString()}, internalIds=${internalIds.contentToString()}, from friend $fromId to $targetId at $time]\"\n            }\n        }\n\n        @NotStableForInheritance\n        public abstract class FromTemp @MiraiInternalApi constructor() : Incoming() {\n            public companion object Key :\n                AbstractPolymorphicMessageKey<Incoming, FromTemp>(Incoming, { it.safeCast() })\n\n            /**\n             * 当 [sender] 为 [bot] 自身时为 [Group.botAsMember]\n             */\n            public abstract override val sender: Member\n            public abstract override val subject: Member\n            public abstract override val target: ContactOrBot\n\n            public inline val group: Group get() = subject.group\n\n            @JvmName(\"getTarget\")\n            @Deprecated(\"For ABI compatibility\", level = DeprecationLevel.HIDDEN)\n            public fun getTargetLegacy(): Bot {\n                if (targetId == bot.id) return subject.bot\n\n                error(\"Message target isn't bot; $this\")\n            }\n\n            final override val kind: MessageSourceKind get() = MessageSourceKind.TEMP\n\n            final override fun toString(): String {\n                return \"[mirai:source:ids=${ids.contentToString()}, internalIds=${internalIds.contentToString()}, from group temp $fromId to $targetId at $time]\"\n            }\n        }\n\n        @NotStableForInheritance\n        public abstract class FromStranger @MiraiInternalApi constructor() : Incoming() {\n            public companion object Key :\n                AbstractPolymorphicMessageKey<Incoming, FromStranger>(Incoming, { it.safeCast() })\n\n            /**\n             * 当 [sender] 为 [bot] 自身时为 [Bot.asStranger]\n             */\n            public abstract override val sender: Stranger\n\n            public abstract override val subject: Stranger\n            public abstract override val target: ContactOrBot\n\n            @JvmName(\"getTarget\")\n            @Deprecated(\"For ABI compatibility\", level = DeprecationLevel.HIDDEN)\n            public fun getTargetLegacy(): Bot {\n                if (targetId == bot.id) return subject.bot\n\n                error(\"Message target isn't bot; $this\")\n            }\n\n            final override val kind: MessageSourceKind get() = MessageSourceKind.STRANGER\n\n            final override fun toString(): String {\n                return \"[mirai:source:ids=${ids.contentToString()}, internalIds=${internalIds.contentToString()}, from stranger $fromId to $targetId at $time]\"\n            }\n        }\n\n        @NotStableForInheritance\n        public abstract class FromGroup @MiraiInternalApi constructor() : Incoming() {\n            public companion object Key :\n                AbstractPolymorphicMessageKey<Incoming, FromGroup>(Incoming, { it.safeCast() })\n\n            /**\n             * 当 [sender] 为 [bot] 自身时为 [Group.botAsMember]\n             */\n            public abstract override val sender: Member\n            public override val subject: Group get() = sender.group\n            public final override val target: Group get() = subject\n            public inline val group: Group get() = subject\n\n            final override val kind: MessageSourceKind get() = MessageSourceKind.GROUP\n\n            final override fun toString(): String {\n                return \"[mirai:source:ids=${ids.contentToString()}, internalIds=${internalIds.contentToString()}, from group $fromId to $targetId at $time]\"\n            }\n        }\n\n        public companion object Key :\n            AbstractPolymorphicMessageKey<OnlineMessageSource, FromTemp>(OnlineMessageSource, { it.safeCast() })\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/PlainText.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.message.code.CodableMessage\nimport net.mamoe.mirai.message.code.internal.appendStringAsMiraiCode\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmSynthetic\n\n/**\n * 纯文本.\n *\n * 使用时直接构造即可. [Message] 也可以直接与 [String] 相加, 详见 [Message.plus].\n *\n * ## mirai 码支持\n * 将 [content] 转义. 而没有 `[mirai:`.\n *\n * @see String.toPlainText\n */\n@Serializable\n@SerialName(PlainText.SERIAL_NAME)\npublic data class PlainText(\n    /**\n     * 消息内容\n     */\n    public val content: String\n) : MessageContent, CodableMessage {\n    @Suppress(\"unused\")\n    public constructor(charSequence: CharSequence) : this(charSequence.toString())\n\n    public override fun toString(): String = content\n    public override fun contentToString(): String = content\n\n    @MiraiExperimentalApi\n    override fun appendMiraiCodeTo(builder: StringBuilder) {\n        builder.appendStringAsMiraiCode(content)\n    }\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitPlainText(this, data)\n    }\n\n    public companion object {\n        public const val SERIAL_NAME: String = \"PlainText\"\n    }\n}\n\n/**\n * 构造 [PlainText]\n */\n@JvmSynthetic\n@Suppress(\"NOTHING_TO_INLINE\")\npublic inline fun String.toPlainText(): PlainText = PlainText(this)"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/PokeMessage.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.message.action.Nudge\nimport net.mamoe.mirai.message.code.CodableMessage\nimport net.mamoe.mirai.message.code.internal.appendStringAsMiraiCode\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.castOrNull\nimport kotlin.jvm.JvmField\n\n/**\n * 戳一戳. 可以发送给好友或群.\n *\n * 备注: 这是消息对话框中显示的 \"一个手指\" 的戳一戳. 类似微信拍一拍的是 [Nudge].\n *\n * 使用 [PokeMessage] 的静态字段, 而不要手动构造 [PokeMessage] 实例.\n *\n * ## mirai 码支持\n * 格式: &#91;mirai:poke:*[name]*,*[pokeType]*,*[id]*&#93;\n *\n * @see PokeMessage.Companion 使用伴生对象中的常量\n */\n@OptIn(MiraiExperimentalApi::class)\n@SerialName(PokeMessage.SERIAL_NAME)\n@Serializable\npublic data class PokeMessage @MiraiInternalApi constructor(\n    /**\n     * 仅 mirai, 显示的名称\n     */\n    public val name: String,\n\n    public val pokeType: Int, // 'type' is used by serialization\n    public val id: Int\n) : HummerMessage, CodableMessage {\n    override val key: MessageKey<HummerMessage> get() = Key\n\n    @MiraiExperimentalApi\n    override fun appendMiraiCodeTo(builder: StringBuilder) {\n        builder.append(\"[mirai:poke:\").appendStringAsMiraiCode(name)\n            .append(',').append(pokeType).append(',').append(id)\n            .append(']')\n    }\n\n    override fun toString(): String = \"[mirai:poke:$name,$pokeType,$id]\"\n    override fun contentToString(): String = \"[戳一戳]\"\n    //businessType=0x00000001(1)\n    //pbElem=08 01 18 00 20 FF FF FF FF 0F 2A 00 32 00 38 00 50 00\n    //serviceType=0x00000002(2)\n\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitPokeMessage(this, data)\n    }\n\n    @OptIn(MiraiExperimentalApi::class, MiraiInternalApi::class)\n    public companion object Key :\n        AbstractPolymorphicMessageKey<HummerMessage, PokeMessage>(HummerMessage, { it.castOrNull() }) {\n\n        public const val SERIAL_NAME: String = \"PokeMessage\"\n\n        /** 戳一戳 */\n        @JvmField\n        public val ChuoYiChuo: PokeMessage = PokeMessage(\"戳一戳\", 1, -1)\n\n        /** 比心 */\n        @JvmField\n        public val BiXin: PokeMessage = PokeMessage(\"比心\", 2, -1)\n\n        /** 点赞  */\n        @JvmField\n        public val DianZan: PokeMessage = PokeMessage(\"点赞\", 3, -1)\n\n        /** 心碎 */\n        @JvmField\n        public val XinSui: PokeMessage = PokeMessage(\"心碎\", 4, -1)\n\n        /** 666 */\n        @JvmField\n        public val LiuLiuLiu: PokeMessage = PokeMessage(\"666\", 5, -1)\n\n        /** 放大招 */\n        @JvmField\n        public val FangDaZhao: PokeMessage = PokeMessage(\"放大招\", 6, -1)\n\n        /** 宝贝球 (SVIP) */\n        @JvmField\n        public val BaoBeiQiu: PokeMessage = PokeMessage(\"宝贝球\", 126, 2011)\n\n        /** 玫瑰花 (SVIP) */\n        @JvmField\n        public val Rose: PokeMessage = PokeMessage(\"玫瑰花\", 126, 2007)\n\n        /** 召唤术 (SVIP) */\n        @JvmField\n        public val ZhaoHuanShu: PokeMessage = PokeMessage(\"召唤术\", 126, 2006)\n\n        /** 让你皮 (SVIP) */\n        @JvmField\n        public val RangNiPi: PokeMessage = PokeMessage(\"让你皮\", 126, 2009)\n\n        /** 结印 (SVIP) */\n        @JvmField\n        public val JieYin: PokeMessage = PokeMessage(\"结印\", 126, 2005)\n\n        /** 手雷 (SVIP) */\n        @JvmField\n        public val ShouLei: PokeMessage = PokeMessage(\"手雷\", 126, 2004)\n\n        /** 勾引 */\n        @JvmField\n        public val GouYin: PokeMessage = PokeMessage(\"勾引\", 126, 2003)\n\n        /** 抓一下 (SVIP) */\n        @JvmField\n        public val ZhuaYiXia: PokeMessage = PokeMessage(\"抓一下\", 126, 2001)\n\n        /** 碎屏 (SVIP) */\n        @JvmField\n        public val SuiPing: PokeMessage = PokeMessage(\"碎屏\", 126, 2002)\n\n        /** 敲门 (SVIP) */\n        @JvmField\n        public val QiaoMen: PokeMessage = PokeMessage(\"敲门\", 126, 2000)\n\n\n        /**\n         * 所有类型数组\n         */\n        @JvmField\n        public val values: Array<PokeMessage> = arrayOf(\n            ChuoYiChuo, BiXin, DianZan, XinSui, LiuLiuLiu,\n            FangDaZhao, BaoBeiQiu, Rose, ZhaoHuanShu, RangNiPi,\n            JieYin, ShouLei, GouYin, ZhuaYiXia, SuiPing,\n            QiaoMen\n        )\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/QuoteReply.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n@file:Suppress(\"NOTHING_TO_INLINE\", \"unused\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.Polymorphic\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.message.data.MessageSource.Key.quote\nimport net.mamoe.mirai.message.data.MessageSource.Key.recall\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.safeCast\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmSynthetic\n\n\n/**\n * 引用回复. [QuoteReply] 被作为 [MessageMetadata], 因为它不包含实际的消息内容.\n *\n * 支持引用任何一条消息发送给任何人.\n *\n * 引用回复的原消息内容完全由 [source] 中 [MessageSource.originalMessage] 控制, 客户端不会自行寻找原消息.\n * 可通过 [MessageSource.copyAmend] 修改引用的消息内容.\n *\n * 客户端通过 [MessageSource.ids] 等数据定位源消息, 在修改时使用 [MessageSourceBuilder.metadata] 可以修改定位结果.\n *\n * ## 创建引用回复\n * - 直接构造 [QuoteReply]: `new QuoteReply(source)`\n * - 在 Kotlin 使用扩展 [MessageSource.quote]\n *\n * @see MessageSource 获取有关消息源的更多信息\n */\n@Serializable\n@SerialName(QuoteReply.SERIAL_NAME)\npublic data class QuoteReply(\n    /**\n     * 指代被引用的消息. 其中 [MessageSource.originalMessage] 可以控制客户端显示的消息内容.\n     */\n    public val source: @Polymorphic MessageSource\n) : Message, MessageMetadata, ConstrainSingle {\n    /**\n     * 从消息链中获取 [MessageSource] 并构造.\n     */\n    public constructor(sourceMessage: MessageChain) : this(sourceMessage.getOrFail(MessageSource))\n\n    public override val key: MessageKey<QuoteReply> get() = Key\n\n    public override fun toString(): String =\n        \"[mirai:quote:$source, content=${if (source.isOriginalMessageInitialized) source.originalMessage.toString() else \"<not yet initialized>\"}]\"\n\n    public override fun equals(other: Any?): Boolean = other is QuoteReply && other.source == this.source\n    public override fun hashCode(): Int = source.hashCode()\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitQuoteReply(this, data)\n    }\n\n    public companion object Key : AbstractMessageKey<QuoteReply>({ it.safeCast() }) {\n        public const val SERIAL_NAME: String = \"QuoteReply\"\n    }\n}\n\n/**\n * 撤回引用的源消息\n */\n@JvmSynthetic\npublic suspend inline fun QuoteReply.recallSource(): Unit = this.source.recall()"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/README.md",
    "content": "# mirai Message\n消息对象. 查看 [Message] 源码内注释\n\n[Message]: Message.kt#L35\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/RichMessage.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmName(\"MessageUtils\")\n@file:JvmMultifileClass\n@file:Suppress(\"MemberVisibilityCanBePrivate\", \"unused\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.message.code.CodableMessage\nimport net.mamoe.mirai.message.code.internal.appendStringAsMiraiCode\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport net.mamoe.mirai.utils.safeCast\nimport kotlin.annotation.AnnotationTarget.*\nimport kotlin.jvm.*\n\n/**\n * XML, JSON 消息等富文本消息.\n *\n * 通常构造 [LightApp] 和 [ServiceMessage]\n *\n * **注意**: 富文本消息的 [RichMessage.contentEquals] 和 [RichMessage.toString] 都不稳定. 将来可能在没有任何警告的情况下改变格式.\n *\n * @see ServiceMessage 服务消息 (XML, JSON)\n * @see LightApp 小程序 (JSON)\n */\n// not using sealed class for customized implementations\n// using polymorphic serializer from Message.Serializer\n@NotStableForInheritance\npublic interface RichMessage : MessageContent, ConstrainSingle {\n    @OptIn(MiraiExperimentalApi::class)\n    override val key: MessageKey<RichMessage> get() = Key\n\n    /**\n     * **注意**: 富文本消息的 [RichMessage.contentEquals] 和 [RichMessage.toString] 都不稳定. 将来可能在没有任何警告的情况下改变格式.\n     */\n    public override fun contentToString(): String = this.content\n\n    /**\n     * 消息内容. 可为 JSON 文本或 XML 文本\n     */\n    public val content: String\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitRichMessage(this, data)\n    }\n\n    /**\n     * 一些模板\n     * @suppress 此 API 不稳定, 可能在任意时刻被删除\n     */\n    @MiraiExperimentalApi\n    public companion object Key :\n        AbstractPolymorphicMessageKey<MessageContent, RichMessage>(MessageContent, { it.safeCast() }) {\n\n        /**\n         * @suppress 此 API 不稳定, 可能在任意时刻被删除\n         */\n        @MiraiExperimentalApi\n        @JvmStatic\n        public fun share(\n            url: String,\n            title: String? = null,\n            content: String? = null,\n            coverUrl: String? = null\n        ): ServiceMessage =\n            buildXmlMessage(60) {\n                templateId = 12345\n                serviceId = 1\n                action = \"web\"\n                brief = \"[分享] \" + (title.orEmpty())\n                this.url = url\n                item {\n                    layout = 2\n                    if (coverUrl != null) {\n                        picture(coverUrl)\n                    }\n                    if (title != null) {\n                        title(title)\n                    }\n                    if (content != null) {\n                        summary(content)\n                    }\n                }\n            }\n    }\n}\n\n/**\n * 小程序.\n *\n * 大部分 JSON 消息为此类型, 另外一部分为 [ServiceMessage]\n *\n * @param content 一般是 json\n *\n * @see ServiceMessage 服务消息\n */\n@Serializable\n@SerialName(LightApp.SERIAL_NAME)\npublic data class LightApp(override val content: String) : RichMessage, CodableMessage {\n    // implementation notes: LightApp is always decoded as LightAppInternal\n    // which are transformed as RefinableMessage to LightApp\n\n    public companion object Key : AbstractMessageKey<LightApp>({ it.safeCast() }) {\n        public const val SERIAL_NAME: String = \"LightApp\"\n    }\n\n    public override fun toString(): String = \"[mirai:app:$content]\"\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitLightApp(this, data)\n    }\n\n    @MiraiExperimentalApi\n    override fun appendMiraiCodeTo(builder: StringBuilder) {\n        builder.append(\"[mirai:app:\").appendStringAsMiraiCode(content).append(']')\n    }\n}\n\n/**\n * 服务消息, 可以是 JSON 消息或 XML 消息.\n *\n * JSON 消息更多情况下通过 [LightApp] 发送.\n *\n * @param serviceId 目前未知, XML 一般为 60, JSON 一般为 1\n * @param content 消息内容. 可为 JSON 文本或 XML 文本\n *\n * @see LightApp 小程序类型消息\n */\n@MiraiExperimentalApi\n@Serializable\n@SerialName(SimpleServiceMessage.SERIAL_NAME)\npublic class SimpleServiceMessage(\n    public override val serviceId: Int,\n    public override val content: String\n) : ServiceMessage {\n    public override fun toString(): String = \"[mirai:service:$serviceId,$content]\"\n\n    public override fun equals(other: Any?): Boolean {\n        if (other == null) return false\n        if (other::class != this::class) return false\n        other as ServiceMessage\n        return other.serviceId == this.serviceId && other.content == this.content\n    }\n\n    public override fun hashCode(): Int {\n        var result = serviceId\n        result = 31 * result + content.hashCode()\n        return result\n    }\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitSimpleServiceMessage(this, data)\n    }\n\n    public companion object {\n        public const val SERIAL_NAME: String = \"SimpleServiceMessage\"\n    }\n}\n\n\n/**\n * 服务消息, 可以是 JSON 消息或 XML 消息.\n *\n * XML 消息有时候是 [SimpleServiceMessage], 有时候是 [LightApp].\n * JSON 消息更多情况下通过 [LightApp] 发送.\n *\n * 建议使用官方客户端发送来确定具体是哪种类型.\n *\n * @see LightApp 小程序类型消息\n * @see SimpleServiceMessage\n */\n@NotStableForInheritance\npublic interface ServiceMessage : RichMessage, CodableMessage {\n    @OptIn(MiraiExperimentalApi::class)\n    public companion object Key :\n        AbstractPolymorphicMessageKey<RichMessage, ServiceMessage>(RichMessage, { it.safeCast() })\n\n    /**\n     * 目前未知, XML 一般为 60, JSON 一般为 1\n     */\n    public val serviceId: Int\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitServiceMessage(this, data)\n    }\n\n    @MiraiExperimentalApi\n    override fun appendMiraiCodeTo(builder: StringBuilder) {\n        builder.append(\"[mirai:service:\").append(serviceId).append(',').appendStringAsMiraiCode(content).append(']')\n    }\n}\n\n@MiraiExperimentalApi\n@Serializable\npublic abstract class AbstractServiceMessage : ServiceMessage {\n    public override fun toString(): String = \"[mirai:service:$serviceId,$content]\"\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitAbstractServiceMessage(this, data)\n    }\n}\n\n\n/*\ncommonElem=CommonElem#750141174 {\n        businessType=0x00000001(1)\n        pbElem=08 01 18 00 20 FF FF FF FF 0F 2A 00 32 00 38 00 50 00\n        serviceType=0x00000002(2)\n}\n */\n\n/**\n * 构造一条 XML 消息\n * @suppress 此 API 不稳定\n */\n@Suppress(\"DEPRECATION_ERROR\")\n@JvmSynthetic\n@MiraiExperimentalApi\npublic inline fun buildXmlMessage(serviceId: Int, block: @XmlMessageDsl XmlMessageBuilder.() -> Unit): ServiceMessage =\n    SimpleServiceMessage(serviceId, XmlMessageBuilder().apply(block).text)\n\n@MiraiExperimentalApi\n@Target(CLASS, FUNCTION, TYPE)\n@DslMarker\npublic annotation class XmlMessageDsl\n\n/**\n * @suppress 此 API 不稳定\n */\n@MiraiExperimentalApi\n@XmlMessageDsl\npublic class XmlMessageBuilder(\n    public var templateId: Int = 1,\n    public var serviceId: Int = 1,\n    public var action: String = \"plugin\",\n    /**\n     * 一般为点击这条消息后跳转的链接\n     */\n    public var actionData: String = \"\",\n    /**\n     * 摘要, 在官方客户端内消息列表中显示\n     */\n    public var brief: String = \"\",\n    public var flag: Int = 3,\n    public var url: String = \"\",\n    public var sourceName: String = \"\",\n    public var sourceIconURL: String = \"\"\n) {\n    @PublishedApi\n    internal val builder: StringBuilder = StringBuilder()\n\n    public val text: String\n        get() = \"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\" +\n                \"<msg templateID='$templateId' serviceID='$serviceId' action='$action' actionData='$actionData' brief='$brief' flag='$flag' url='$url'>\" +\n                builder.toString() +\n                \"<source name='$sourceName' icon='$sourceIconURL'/>\" +\n                \"</msg>\"\n\n    @JvmOverloads\n    @XmlMessageDsl\n    public inline fun item(bg: Int = 0, layout: Int = 4, block: @XmlMessageDsl ItemBuilder.() -> Unit) {\n        builder.append(ItemBuilder(bg, layout).apply(block).text)\n    }\n\n    public fun source(name: String, iconURL: String = \"\") {\n        sourceName = name\n        sourceIconURL = iconURL\n    }\n\n    @XmlMessageDsl\n    public class ItemBuilder @PublishedApi internal constructor(\n        public var bg: Int = 0,\n        public var layout: Int = 4\n    ) {\n        @PublishedApi\n        internal val builder: StringBuilder = StringBuilder()\n        public val text: String get() = \"<item bg='$bg' layout='$layout'>$builder</item>\"\n\n        public fun summary(text: String, color: String = \"#000000\") {\n            this.builder.append(\"<summary color='$color'>$text</summary>\")\n        }\n\n        public fun title(text: String, size: Int = 25, color: String = \"#000000\") {\n            this.builder.append(\"<title size='$size' color='$color'>$text</title>\")\n        }\n\n        public fun picture(coverUrl: String) {\n            this.builder.append(\"<picture cover='$coverUrl'/>\")\n        }\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/RockPaperScissors.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.message.code.CodableMessage\nimport net.mamoe.mirai.message.data.RockPaperScissors.*\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.*\nimport kotlin.jvm.*\nimport kotlin.random.Random\n\n/**\n * 石头剪刀布.\n *\n * 可以通过 [RockPaperScissors.random] 获得一个随机手势的实例.\n *\n * @property ROCK 石头 `[mirai:rps:rock]`\n * @property SCISSORS 剪刀 `[mirai:rps:scissors]`\n * @property PAPER 布（纸）`[mirai:rps:paper]`\n *\n * @since 2.14\n */\n@kotlin.Suppress(\"RemoveRedundantQualifierName\")\n@Serializable(RockPaperScissors.Serializer::class)\n@SerialName(RockPaperScissors.SERIAL_NAME)\npublic enum class RockPaperScissors(\n    public val content: String,\n\n    internalId: Int,\n) : MarketFace, CodableMessage {\n    ROCK(\"[石头]\", 48),\n    SCISSORS(\"[剪刀]\", 49),\n    PAPER(\"[布]\", 50)\n    ;\n\n    @MiraiExperimentalApi\n    override val id: Int\n        get() = 11415\n\n    @MiraiInternalApi\n    @JvmSynthetic\n    public val internalId: Byte = internalId.toByte()\n\n    @MiraiExperimentalApi\n    override fun appendMiraiCodeTo(builder: StringBuilder) {\n        builder.append(\"[mirai:rps:\").append(name.lowercase()).append(']')\n    }\n\n    override fun toString(): String = serializeToMiraiCode()\n\n\n    override fun contentToString(): String = content\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitRockPaperScissors(this, data)\n    }\n\n    /**\n     * 判断 当前手势 (`this`) 能否淘汰对手 ([other])\n     *\n     * @return 赢返回 `true`，输返回 `false`，平局时返回 `null`\n     */\n    public infix fun eliminates(other: RockPaperScissors): Boolean? {\n        return when {\n            this == other -> null\n            this == ROCK && other == SCISSORS -> true\n            this == SCISSORS && other == PAPER -> true\n            this == PAPER && other == ROCK -> true\n            else -> false\n        }\n    }\n\n    public companion object Key :\n        AbstractPolymorphicMessageKey<MarketFace, RockPaperScissors>(MarketFace, { it.safeCast() }) {\n        public const val SERIAL_NAME: String = \"RockPaperScissors\"\n\n        private val values = values()\n\n        /**\n         * 获取随机手势的 [石头剪刀布][RockPaperScissors]\n         *\n         * Java 可通过 `kotlin.random.PlatformRandomKt.asKotlinRandom()` 来传入一个 random\n         */\n        @JvmStatic\n        @JvmOverloads\n        public fun random(random: Random = Random): RockPaperScissors = RockPaperScissors.values.random(random)\n\n    }\n\n    internal object Serializer : KSerializer<RockPaperScissors> by Surrogate.serializer().map(\n        resultantDescriptor = Surrogate.serializer().descriptor,\n        deserialize = { valueOf(it.name) },\n        serialize = { Surrogate(name) },\n    ) {\n\n        @Serializable\n        @SerialName(RockPaperScissors.SERIAL_NAME)\n        private class Surrogate(\n            val name: String,\n        )\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/ShortVideo.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.KSerializer\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.contact.AudioSupported\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.message.MessageSerializers\nimport net.mamoe.mirai.message.data.MessageChain.Companion.serializeToJsonString\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.*\n\n/**\n * 短视频消息, 指的是可在聊天界面在线播放的视频消息, 而非在群文件上传的视频文件.\n *\n * 短视频消息分为 [OnlineShortVideo] 与 [OfflineShortVideo]. 在本地上传的短视频为 [OfflineShortVideo]. 从服务器接收的短视频为 [OnlineShortVideo].\n *\n * 最推荐存储的方式是下载视频文件, 每次都通过上传该文件获取视频消息.\n * 在上传视频时服务器会根据缓存情况选择回复已有视频 ID 或要求客户端上传.\n *\n * # 获取短视频消息示例\n *\n * ## 上传短视频\n * 使用 [Contact.uploadShortVideo], 将视频缩略图和视频[资源][ExternalResource] 上传以得到 [OfflineShortVideo].\n *\n * ## 使用 [OfflineShortVideo.Builder] 构建短视频\n * [OfflineShortVideo] 提供 [Builder][OfflineShortVideo.Builder] 构建方式, 必须指定 [videoId], [filename], [fileMd5], [fileSize] 和 [fileFormat] 参数.\n * 可选指定 [thumbnailMd5][OfflineShortVideo.Builder.thumbnailMd5] 和 [thumbnailSize][OfflineShortVideo.Builder.thumbnailSize]. 若不提供, 可能会影响服务器判断缓存.\n *\n * ## 从服务器接收\n * 通过监听消息接收的短视频消息可直接转换为 [OnlineShortVideo].\n *\n * kotlin 示例:\n * ```kotlin\n * val video: OnlineShortVideo = event.message[OnlineShortVideo]\n * ```\n *\n * # 下载视频\n * 通过 [OnlineShortVideo.urlForDownload] 获取下载链接.\n * 该下载链接不包含短视频的文件信息, 可以使用 [videoId] 或 [filename] 作为文件名, [fileFormat] 作为文件拓展名.\n *\n * @since 2.16\n */\n@NotStableForInheritance\npublic interface ShortVideo : MessageContent, ConstrainSingle {\n    /**\n     * 视频 ID.\n     */\n    public val videoId: String\n\n    /**\n     * 视频文件 MD5. 16 bytes.\n     */\n    public val fileMd5: ByteArray\n\n    /**\n     * 视频大小\n     */\n    public val fileSize: Long\n\n    /**\n     * 视频文件类型（拓展名）\n     */\n    public val fileFormat: String\n\n    /**\n     * 视频文件名, 不包括拓展名\n     */\n    public val filename: String\n\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitShortVideo(this, data)\n    }\n\n    override val key: MessageKey<*>\n        get() = Key\n\n\n    public companion object Key :\n        AbstractPolymorphicMessageKey<MessageContent, ShortVideo>(MessageContent, { it.safeCast() }) {\n\n    }\n}\n\n/**\n * 在线短视频消息, 即从消息事件中接收到的视频消息.\n *\n * [OnlineShortVideo] 仅可以从事件中的[消息链][MessageChain]接收, 不可手动构造.\n *\n * ### 序列化支持\n *\n * [OnlineShortVideo] 支持序列化. 可使用 [MessageChain.serializeToJsonString] 以及 [MessageChain.deserializeFromJsonString].\n * 也可以在 [MessageSerializers.serializersModule] 获取到 [OnlineShortVideo] 的 [KSerializer].\n *\n * 要获取更多有关序列化的信息, 参阅 [MessageSerializers].\n *\n * @since 2.16\n */\n@NotStableForInheritance\npublic interface OnlineShortVideo : ShortVideo {\n    /**\n     * 下载链接\n     */\n    public val urlForDownload: String\n\n    public companion object Key :\n        AbstractPolymorphicMessageKey<ShortVideo, OnlineShortVideo>(ShortVideo, { it.safeCast() }) {\n        public const val SERIAL_NAME: String = \"OnlineShortVideo\"\n    }\n}\n\n/**\n * 离线短视频消息.\n *\n * [OfflineShortVideo] 拥有协议上必要的五个属性:\n * - 视频 ID [videoId]\n * - 视频文件名 [filename]\n * - 视频 MD5 [fileMd5]\n * - 视频大小 [fileSize]\n * - 视频格式 [fileFormat]\n *\n * 和非必要属性：\n * - 缩略图 MD5 `thumbnailMd5`\n * - 缩略图大小 `thumbnailSize`\n *\n * [OfflineShortVideo] 可由本地 [ExternalResource] 经过 [AudioSupported.uploadShortVideo] 上传到服务器得到, 故无[下载链接][OnlineShortVideo.urlForDownload].\n *\n * [OfflineShortVideo] 支持使用 [OfflineShortVideo.Builder] 可通过上述七个必要参数和两个非必要参数构造 [OfflineShortVideo] 实例.\n *\n * ### 序列化支持\n *\n * [OfflineShortVideo] 支持序列化. 可使用 [MessageChain.serializeToJsonString] 以及 [MessageChain.deserializeFromJsonString].\n * 也可以在 [MessageSerializers.serializersModule] 获取到 [OfflineShortVideo] 的 [KSerializer].\n *\n * 要获取更多有关序列化的信息, 参阅 [MessageSerializers].\n * @since 2.16\n */\n@NotStableForInheritance\npublic interface OfflineShortVideo : ShortVideo {\n\n    public companion object Key :\n        AbstractPolymorphicMessageKey<ShortVideo, OfflineShortVideo>(ShortVideo, { it.safeCast() }) {\n        public const val SERIAL_NAME: String = \"OfflineShortVideo\"\n    }\n\n    public class Builder internal constructor(\n        public var videoId: String,\n        public var fileMd5: ByteArray,\n        public var fileSize: Long,\n        public var fileFormat: String,\n        public var fileName: String\n    ) {\n        /**\n         * 缩略图文件 MD5\n         *\n         * 传入此处的缩略图 MD5 应该仅有以下来源：\n         * * *已通过 [Contact.uploadShortVideo] 上传完成的*缩略图[资源][ExternalResource], 可由 [ExternalResource.md5] 获得.\n         */\n        public var thumbnailMd5: ByteArray = EMPTY_BYTE_ARRAY\n\n        /**\n         * 缩略图文件大小\n         *\n         * 传入此处的缩略图文件大小应该仅有以下来源：\n         * * *已通过 [Contact.uploadShortVideo] 上传完成的*缩略图[资源][ExternalResource], 可由 [ExternalResource.size] 获得.\n         */\n        public var thumbnailSize: Long = 0\n\n        public fun build(): OfflineShortVideo {\n\n            @OptIn(MiraiInternalApi::class)\n            return InternalShortVideoProtocol.instance.createOfflineShortVideo(\n                videoId, fileMd5, fileSize, fileFormat, fileName, thumbnailMd5, thumbnailSize\n            )\n        }\n\n        public companion object {\n            /**\n             * 创建一个 [OfflineShortVideo.Builder]\n             *\n             * 在 Kotlin 可以使用类构造器的函数 [OfflineShortVideo]: `OfflineShortVideo(...)`\n             */\n            @JvmStatic\n            public fun newBuilder(\n                videoId: String,\n                fileName: String,\n                fileFormat: String,\n                fileMd5: ByteArray,\n                fileSize: Long\n            ): Builder = Builder(videoId, fileMd5, fileSize, fileFormat, fileName)\n        }\n    }\n}\n\n/**\n * 构造 [OfflineShortVideo]. 有关参数的含义, 参考 [ShortVideo].\n * @since 2.16\n */\n@Suppress(\"NOTHING_TO_INLINE\")\n@JvmSynthetic\npublic inline fun OfflineShortVideo(\n    videoId: String,\n    fileName: String,\n    fileFormat: String,\n    fileMd5: ByteArray,\n    fileSize: Long,\n    thumbnailMd5: ByteArray = byteArrayOf(),\n    thumbnailSize: Long = 0,\n): OfflineShortVideo = OfflineShortVideo.Builder.newBuilder(videoId, fileName, fileFormat, fileMd5, fileSize).apply {\n    this@apply.thumbnailMd5 = thumbnailMd5\n    this@apply.thumbnailSize = thumbnailSize\n}.build()\n\n/**\n * 内部短视频协议实现, 请不要使用此接口\n * @since 2.16.0\n */\n@MiraiInternalApi\npublic interface InternalShortVideoProtocol {\n    public fun createOfflineShortVideo(\n        videoId: String,\n        fileMd5: ByteArray,\n        fileSize: Long,\n        fileFormat: String,\n        fileName: String,\n        thumbnailMd5: ByteArray,\n        thumbnailSize: Long\n    ): OfflineShortVideo\n\n    @MiraiInternalApi\n    public companion object {\n        public val instance: InternalShortVideoProtocol by lazy {\n            Mirai // initialize MiraiImpl first\n            loadService(\n                InternalShortVideoProtocol::class,\n                \"net.mamoe.mirai.internal.message.InternalShortVideoProtocolImpl\"\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/ShowImageFlag.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.descriptors.SerialDescriptor\nimport kotlinx.serialization.descriptors.buildClassSerialDescriptor\nimport kotlinx.serialization.encoding.Decoder\nimport kotlinx.serialization.encoding.Encoder\nimport kotlinx.serialization.encoding.decodeStructure\nimport kotlinx.serialization.encoding.encodeStructure\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.safeCast\n\n/**\n * [MessageChain] 中包含秀图时的标记.\n *\n * 秀图已被 QQ 弃用, 仅作识别处理\n *\n *\n * ```\n * MessageEvent event;\n *\n * if (event.message.contains(ShowImageFlag.INSTANCE)) {\n *     // event.message 包含的图片是作为 '秀图' 发送\n * }\n * ```\n *\n * 发送 [ShowImageFlag] 不会有任何效果.\n *\n * @since 2.2\n */\n@SerialName(ShowImageFlag.SERIAL_NAME)\n@Serializable(ShowImageFlag.Serializer::class)\npublic object ShowImageFlag : MessageMetadata, ConstrainSingle, AbstractMessageKey<ShowImageFlag>({ it.safeCast() }) {\n    override val key: ShowImageFlag get() = this\n\n    override fun toString(): String = \"ShowImageFlag\"\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitShowImageFlag(this, data)\n    }\n\n    /**\n     * @since 2.4\n     */\n    public const val SERIAL_NAME: String = \"ShowImageFlag\"\n\n    /**\n     * @since 2.4\n     */\n    internal object Serializer : KSerializer<ShowImageFlag> {\n        override val descriptor: SerialDescriptor = buildClassSerialDescriptor(SERIAL_NAME)\n\n        override fun deserialize(decoder: Decoder): ShowImageFlag {\n            decoder.decodeStructure(descriptor) {}\n            return ShowImageFlag\n        }\n\n\n        override fun serialize(encoder: Encoder, value: ShowImageFlag) {\n            encoder.encodeStructure(descriptor) {}\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/SingleMessage.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.PolymorphicSerializer\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.safeCast\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\n/**\n * 单个消息元素. 与之相对的是 [MessageChain], 是多个 [SingleMessage] 的集合.\n */\n// @Serializable(SingleMessage.Serializer::class)\npublic interface SingleMessage : Message {\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R = visitor.visitSingleMessage(this, data)\n\n    /**\n     * @suppress deprecated since 2.4.0\n     */\n    @Deprecated(\n        \"Please create PolymorphicSerializer(SingleMessage::class) on your own.\",\n        ReplaceWith(\n            \"PolymorphicSerializer(SingleMessage::class)\",\n            \"kotlinx.serialization.PolymorphicSerializer\",\n            \"net.mamoe.mirai.message.data.SingleMessage\",\n        ),\n        level = DeprecationLevel.HIDDEN // ERROR since 2.8\n    ) // error since 2.8\n    @DeprecatedSinceMirai(warningSince = \"2.4\", errorSince = \"2.8\", hiddenSince = \"2.10\")\n    public object Serializer : KSerializer<SingleMessage> by PolymorphicSerializer(SingleMessage::class)\n}\n\n\n/**\n * 消息元数据, 即不含内容的元素.\n *\n * 这种类型的 [Message] 只表示一条消息的属性. 其子类如 [MessageSource], [QuoteReply], [MessageOrigin] 和 [CustomMessageMetadata]\n *\n * 所有子类的 [contentToString] 都应该返回空字符串.\n *\n * 要获取详细信息, 查看 [MessageChain].\n *\n * @see MessageSource 消息源\n * @see QuoteReply 引用回复\n * @see CustomMessageMetadata 自定义元数据\n * @see ShowImageFlag 秀图标识\n *\n * @see ConstrainSingle 约束一个 [MessageChain] 中只存在这一种类型的元素\n */\npublic interface MessageMetadata : SingleMessage {\n    /**\n     * 返回空字符串\n     */\n    override fun contentToString(): String = \"\"\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitMessageMetadata(this, data)\n    }\n}\n\n/**\n * 带内容的消息.\n *\n * @see PlainText 纯文本\n * @see At At 一个群成员.\n * @see AtAll At 全体成员\n * @see HummerMessage 一些特殊消息: [戳一戳][PokeMessage], [闪照][FlashImage]\n * @see Image 图片\n * @see RichMessage 富文本\n * @see ServiceMessage 服务消息, 如 JSON/XML\n * @see Face 原生表情\n * @see SuperFace 超级表情\n * @see ForwardMessage 合并转发\n * @see Voice 语音\n * @see MarketFace 商城表情\n * @see MusicShare 音乐分享\n */\npublic interface MessageContent : SingleMessage {\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitMessageContent(this, data)\n    }\n\n    public companion object Key : AbstractMessageKey<MessageContent>({ it.safeCast() })\n}\n\n\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/SuperFace.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.message.code.CodableMessage\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.NotStableForInheritance\nimport net.mamoe.mirai.utils.safeCast\n\n/**\n * 表示一个超级表情.\n *\n * 超级表情由[普通表情][Face]转换而来. 不是所有的普通表情都有对应的超级表情.\n *\n * 要构造超级表情, 使用 [SuperFace.from] 或 [SuperFace.fromOrNull].\n * 在 Kotlin 还可以使用对应扩展函数: [Face.toSuperFace] 或 [Face.toSuperFaceOrNull].\n *\n * @see Face\n * @since 2.16\n */\n@OptIn(MiraiExperimentalApi::class)\n@Serializable\n@SerialName(SuperFace.SERIAL_NAME)\n@NotStableForInheritance\npublic class SuperFace @MiraiInternalApi constructor(\n    public val face: Int,\n    public val id: String,\n    @SerialName(\"sticker_type\")\n    public val type: Int\n) : HummerMessage, CodableMessage {\n\n    public companion object Key :\n        AbstractPolymorphicMessageKey<MessageContent, SuperFace>(\n            MessageContent,\n            { it.safeCast() }) {\n\n        public const val SERIAL_NAME: String = \"SuperFace\"\n\n        /**\n         * 将普通表情转换为超级表情.\n         *\n         * @throws IllegalArgumentException 无法转换时抛出\n         **/\n        @JvmStatic\n        public fun from(face: Face): SuperFace {\n            return fromOrNull(face = face)\n                ?: throw IllegalArgumentException(\"No SuperFace mapping from Face(id=${face.id}, name='${face.name}')\")\n        }\n\n        /**\n         * 将普通表情转换为超级表情.\n         *\n         * @return 无法转换时返回 null\n         **/\n        @JvmStatic\n        @OptIn(MiraiInternalApi::class)\n        public fun fromOrNull(face: Face): SuperFace? {\n            val stickerId = when (face.id) {\n                Face.DA_CALL -> \"1\"\n                Face.BIAN_XING -> \"2\"\n                Face.KE_DAO_LE -> \"3\"\n                Face.ZI_XI_FEN_XI -> \"4\"\n                Face.JIA_YOU -> \"5\"\n                Face.WO_MEI_SHI -> \"6\"\n                Face.CAI_GOU -> \"7\"\n                Face.CHONG_BAI -> \"8\"\n                Face.BI_XIN -> \"9\"\n                Face.QING_ZHU -> \"10\"\n                Face.LAO_SE_PI -> \"11\"\n                Face.CHI_TANG -> \"12\"\n                Face.LAN_QIU -> \"13\"\n                Face.JING_XIA -> \"14\"\n                Face.SHENG_QI -> \"15\"\n                Face.LIU_LEI -> \"16\"\n                Face.DAN_GAO -> \"17\"\n                Face.BIAN_PAO -> \"18\"\n                Face.YAN_HUA -> \"19\"\n                Face.WO_XIANG_KAI_LE -> \"20\"\n                Face.TIAN_PING -> \"21\"\n                Face.HUA_DUO_LIAN -> \"22\"\n                Face.RE_HUA_LE -> \"23\"\n                Face.DA_ZHAO_HU -> \"24\"\n                Face.NI_ZHEN_BANG_BANG -> \"25\"\n                Face.SUAN_Q -> \"26\"\n                Face.WO_FANG_LE -> \"27\"\n                Face.DA_YUAN_ZHONG -> \"28\"\n                Face.HONG_BAO_DUO_DUO -> \"29\"\n                else -> return null\n            }\n            val stickerType = when (face.id) {\n                Face.LAN_QIU -> 2\n                else -> 1\n            }\n\n            return SuperFace(face = face.id, id = stickerId, type = stickerType)\n        }\n    }\n\n    override val key: MessageKey<SuperFace> get() = Key\n\n    public val name: String get() = contentToString().let { it.substring(1, it.length - 1) }\n\n    override fun toString(): String = \"[mirai:superface:$face,$id,$type]\"\n\n    override fun contentToString(): String = Face.names.getOrElse(face) { \"[超级表情]\" }\n\n    @MiraiExperimentalApi\n    override fun appendMiraiCodeTo(builder: StringBuilder) {\n        builder.append(\"[mirai:superface:\").append(face).append(',').append(id).append(',').append(type).append(']')\n    }\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitSuperFace(this, data)\n    }\n\n    override fun hashCode(): Int {\n        var result = face.hashCode()\n        result = 31 * result + id.hashCode()\n        result = 31 * result + type.hashCode()\n        return result\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (other !is SuperFace) return false\n        return face == other.face && id == other.id && type == other.type\n    }\n}\n\n/**\n * 将超级表情转换为普通表情\n *\n * @since 2.16\n */\n@JvmSynthetic\npublic fun SuperFace.toFace(): Face = Face(id = face)\n\n/**\n * 将普通表情转换为超级表情\n *\n * @since 2.16\n * @throws IllegalArgumentException 无法转换时抛出\n */\n@JvmSynthetic\npublic fun Face.toSuperFace(): SuperFace = SuperFace.from(this)\n\n/**\n * 将普通表情转换为超级表情, 在无法转换时返回 `null`\n *\n * @since 2.16\n */\n@JvmSynthetic\npublic fun Face.toSuperFaceOrNull(): SuperFace? = SuperFace.fromOrNull(this)"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/UnsupportedMessage.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\n@file:Suppress(\"NOTHING_TO_INLINE\")\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.IMirai\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.*\n\n/**\n * mirai 尚未支持的消息类型.\n *\n * [UnsupportedMessage] 可以发送, 接收, 或序列化保存\n * @since 2.6\n */\n@SerialName(UnsupportedMessage.SERIAL_NAME)\n@Serializable(UnsupportedMessage.Serializer::class)\n@NotStableForInheritance\npublic interface UnsupportedMessage : MessageContent {\n    override fun contentToString(): String =\n        \"[不支持的消息#${struct.contentHashCode()}]\" // to produce 'stable' and reliable text\n\n    /**\n     * 原生消息数据\n     */\n    public val struct: ByteArray\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitUnsupportedMessage(this, data)\n    }\n\n    public companion object {\n        public const val SERIAL_NAME: String = \"UnsupportedMessage\"\n\n        /**\n         * 创建 [UnsupportedMessage]\n         * @see IMirai.createUnsupportedMessage\n         */\n        @JvmStatic\n        public fun create(struct: ByteArray): UnsupportedMessage = Mirai.createUnsupportedMessage(struct)\n    }\n\n    public object Serializer : KSerializer<UnsupportedMessage> by Surrogate.serializer().map(\n        resultantDescriptor = Surrogate.serializer().descriptor,\n        deserialize = { Mirai.createUnsupportedMessage(struct.hexToBytes()) },\n        serialize = { Surrogate(struct.toUHexString(\"\")) }\n    ) {\n        @Suppress(\"RemoveRedundantQualifierName\")\n        @Serializable\n        @SerialName(UnsupportedMessage.SERIAL_NAME)\n        private class Surrogate(\n            val struct: String // hex\n        )\n    }\n}\n\n/**\n * 创建 [UnsupportedMessage]\n * @since 2.6\n * @see UnsupportedMessage.create\n */\n@JvmSynthetic\npublic inline fun UnsupportedMessage(struct: ByteArray): UnsupportedMessage = UnsupportedMessage.create(struct)"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/VipFace.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.message.code.CodableMessage\nimport net.mamoe.mirai.message.data.VipFace.Kind\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.safeCast\nimport kotlin.jvm.JvmField\n\n/**\n * VIP 表情.\n *\n * 不支持发送, 在发送时会变为纯文本.\n *\n * ## mirai 码支持\n * 格式: &#91;mirai:vipface:*[Kind.id]*,*[Kind.name]*,*[count]*&#93;\n *\n * @see VipFace.Key 使用伴生对象中的常量\n */\n@OptIn(MiraiExperimentalApi::class)\n@Serializable\n@SerialName(VipFace.SERIAL_NAME)\npublic data class VipFace @MiraiInternalApi constructor(\n    /**\n     * 使用 [Companion] 中常量.\n     */\n    public val kind: Kind,\n    public val count: Int\n) : HummerMessage, CodableMessage {\n    override val key: MessageKey<VipFace> get() = Key\n\n    @MiraiExperimentalApi\n    override fun appendMiraiCodeTo(builder: StringBuilder) {\n        builder.append(\"[mirai:vipface:\").append(kind).append(',').append(count).append(']')\n    }\n\n    override fun toString(): String = \"[mirai:vipface:$kind,$count]\"\n    override fun contentToString(): String = \"[${kind.name}]x$count\"\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitVipFace(this, data)\n    }\n\n    @Serializable\n    public data class Kind(\n        val id: Int,\n        val name: String\n    ) {\n        public override fun toString(): String {\n            return \"$id,$name\"\n        }\n    }\n\n    public companion object Key :\n        AbstractPolymorphicMessageKey<HummerMessage, VipFace>(HummerMessage, { it.safeCast() }) {\n\n        public const val SERIAL_NAME: String = \"VipFace\"\n\n        @JvmField\n        public val LiuLian: Kind = 9 to \"榴莲\"\n\n        @JvmField\n        public val PingDiGuo: Kind = 1 to \"平底锅\"\n\n        @JvmField\n        public val ChaoPiao: Kind = 12 to \"钞票\"\n\n        @JvmField\n        public val LueLueLue: Kind = 10 to \"略略略\"\n\n        @JvmField\n        public val ZhuTou: Kind = 4 to \"猪头\"\n\n        @JvmField\n        public val BianBian: Kind = 6 to \"便便\"\n\n        @JvmField\n        public val ZhaDan: Kind = 5 to \"炸弹\"\n\n        @JvmField\n        public val AiXin: Kind = 2 to \"爱心\"\n\n        @JvmField\n        public val HaHa: Kind = 3 to \"哈哈\"\n\n        @JvmField\n        public val DianZan: Kind = 1 to \"点赞\"\n\n        @JvmField\n        public val QinQin: Kind = 7 to \"亲亲\"\n\n        @JvmField\n        public val YaoWan: Kind = 8 to \"药丸\"\n\n        @JvmField\n        public val values: Array<Kind> = arrayOf(\n            LiuLian, PingDiGuo, ChaoPiao, LueLueLue, ZhuTou,\n            BianBian, ZhaDan, AiXin, HaHa, DianZan, QinQin, YaoWan\n        )\n\n        private infix fun Int.to(name: String): Kind = Kind(this, name)\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/Voice.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.Transient\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.utils.*\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmStatic\nimport kotlin.jvm.JvmSynthetic\n\n\n/**\n * 需要通过上传到服务器的消息，如语音、文件.\n *\n * @suppress 不要使用这个接口. 目前只应该使用 [Voice].\n */\n@Serializable\n@MiraiExperimentalApi\n@NotStableForInheritance\npublic abstract class PttMessage : MessageContent {\n\n    public companion object Key :\n        AbstractPolymorphicMessageKey<MessageContent, PttMessage>(MessageContent, { it.safeCast() })\n\n    @MiraiExperimentalApi\n    public abstract val fileName: String\n\n    @MiraiExperimentalApi\n    public abstract val md5: ByteArray\n\n    @MiraiExperimentalApi\n    public abstract val fileSize: Long\n\n    /*\n     * **internal impl note**\n     * 用于中转 ImMsgBody.Ptt, 在接受到其他用户发送的语音时能按照原样发回,\n     * 并且便于未来修改 (对 api 修改最小化)\n     */\n    @MiraiInternalApi\n    @Transient\n    public var pttInternalInstance: Any? = null\n}\n\n/**\n * 已弃用的旧版本语音消息.\n *\n * [Voice] 由于有设计缺陷已弃用且可能会在将来版本删除, 请使用 [Audio].\n *\n * ## 迁移指南\n *\n * - 将使用的 [Voice] 类型替换为 [Audio] 类型\n * - 将 [Group.uploadVoice] 替换为 [Group.uploadAudio]\n * - 如果有必须使用旧 [Voice] 类型的情况, 请使用 [Audio.toVoice]\n */\n@OptIn(MiraiExperimentalApi::class)\n@Suppress(\"DuplicatedCode\", \"DEPRECATION_ERROR\", \"PropertyName\", \"HttpUrlsUsage\")\n@Serializable\n@SerialName(Voice.SERIAL_NAME)\n@Deprecated(\n    \"Please use Audio instead.\",\n    replaceWith = ReplaceWith(\"Audio\", \"net.mamoe.mirai.message.data.Audio\"),\n    level = DeprecationLevel.HIDDEN\n) // deprecated since 2.7\n@DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.10\", hiddenSince = \"2.11\")\npublic open class Voice @MiraiInternalApi constructor(\n    @MiraiExperimentalApi public override val fileName: String,\n    @MiraiExperimentalApi public override val md5: ByteArray,\n    @MiraiExperimentalApi public override val fileSize: Long,\n\n    @SerialName(\"codec\") @MiraiInternalApi public val _codec: Int = 0,\n    private val _url: String\n) : PttMessage() {\n\n    @Deprecated(\n        \"Please use Audio instead.\",\n        replaceWith = ReplaceWith(\"Audio.Key\", \"net.mamoe.mirai.message.data.Audio.Key\"),\n        level = DeprecationLevel.HIDDEN\n    ) // deprecated since 2.7\n    @DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.10\", hiddenSince = \"2.11\")\n    public companion object Key : AbstractPolymorphicMessageKey<PttMessage, Voice>(PttMessage, { it.safeCast() }) {\n        public const val SERIAL_NAME: String = \"Voice\"\n\n        /**\n         * 将 2.7 新增的 [Audio] 转为旧版本的 [Voice], 以兼容某些情况.\n         *\n         * @see Audio.toVoice\n         * @since 2.7\n         */\n        @OptIn(MiraiInternalApi::class)\n        @Deprecated(\n            \"Please consider migrating to Audio\",\n            level = DeprecationLevel.ERROR\n        ) // deprecated since 2.7\n        @DeprecatedSinceMirai(\n            warningSince = \"2.7\",\n            errorSince = \"2.10\"\n        )  // if HIDDEN, it cannot be resolved by Audio.toVoice\n        @JvmStatic\n        public fun fromAudio(audio: Audio): Voice {\n            audio.run {\n                return Voice(\n                    filename,\n                    fileMd5,\n                    fileSize,\n                    codec.id,\n                    if (this is OnlineAudio) kotlin.runCatching { urlForDownload }.getOrElse { \"\" } else \"\"\n                )\n            }\n        }\n    }\n\n    /**\n     * 下载链接 HTTP URL.\n     */\n    public open val url: String?\n        get() = when {\n            _url.isBlank() -> null\n            _url.startsWith(\"http\") -> _url\n            else -> \"http://grouptalk.c2c.qq.com$_url\"\n        }\n\n    private var _stringValue: String? = null\n        get() = field ?: kotlin.run {\n            field = \"[mirai:voice:$fileName]\"\n            field\n        }\n\n    public override fun toString(): String = _stringValue!!\n\n    public override fun contentToString(): String = \"[语音消息]\"\n\n    /**\n     * 转换为 2.7 新增的 [Audio], 以兼容某些无法迁移的情况.\n     *\n     * @since 2.7\n     */\n    @OptIn(MiraiExperimentalApi::class, MiraiInternalApi::class)\n    public fun toAudio(): Audio {\n        val voice = this\n        return OfflineAudio(\n            voice.fileName,\n            voice.md5,\n            voice.fileSize,\n            AudioCodec.fromIdOrNull(voice._codec) ?: AudioCodec.SILK,\n            byteArrayOf()\n        )\n    }\n\n    @OptIn(MiraiInternalApi::class)\n    @MiraiExperimentalApi\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (other !is Voice) return false\n\n        if (fileName != other.fileName) return false\n        if (!md5.contentEquals(other.md5)) return false\n        if (fileSize != other.fileSize) return false\n        if (_codec != other._codec) return false\n        return _url == other._url\n    }\n\n    @OptIn(MiraiInternalApi::class)\n    @MiraiExperimentalApi\n    override fun hashCode(): Int {\n        var result = fileName.hashCode()\n        result = 12 * result + md5.contentHashCode()\n        result = 54 * result + fileSize.hashCode()\n        result = 33 * result + _codec\n        result = 15 * result + _url.hashCode()\n        return result\n    }\n\n    @MiraiInternalApi\n    override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R {\n        return visitor.visitVoice(this, data)\n    }\n}\n\n/**\n * 将 2.7 新增的 [Audio] 转为旧版本的 [Voice], 以兼容某些情况.\n *\n * @since 2.7\n */\n@Suppress(\"DeprecatedCallableAddReplaceWith\", \"DEPRECATION_ERROR\")\n@Deprecated(\n    \"Please migrate to Audio\",\n    level = DeprecationLevel.ERROR\n) // deprecated since 2.7\n@JvmSynthetic\n@DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.10\", hiddenSince = \"2.11\")\npublic fun Audio.toVoice(): Voice = Voice.fromAudio(this)"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/impl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"EXPERIMENTAL_API_USAGE\")\n@file:JvmMultifileClass\n@file:JvmName(\"MessageUtils\")\n@file:OptIn(MiraiInternalApi::class)\n\npackage net.mamoe.mirai.message.data\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.message.data.Image.Key.IMAGE_ID_REGEX\nimport net.mamoe.mirai.message.data.Image.Key.IMAGE_RESOURCE_ID_REGEX_1\nimport net.mamoe.mirai.message.data.Image.Key.IMAGE_RESOURCE_ID_REGEX_2\nimport net.mamoe.mirai.message.data.visitor.MessageVisitor\nimport net.mamoe.mirai.message.data.visitor.RecursiveMessageVisitor\nimport net.mamoe.mirai.message.data.visitor.acceptChildren\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.asImmutable\nimport net.mamoe.mirai.utils.castOrNull\nimport net.mamoe.mirai.utils.replaceAllKotlin\nimport kotlin.jvm.JvmField\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmSynthetic\n\n// region image\n\n/////////////////////////\n//// IMPLEMENTATIONS ////\n/////////////////////////\n\n@JvmSynthetic\ninternal fun Message.contentEqualsStrictImpl(another: Message, ignoreCase: Boolean): Boolean {\n    if (!this.contentToString().equals(another.contentToString(), ignoreCase = ignoreCase)) return false\n    return when {\n        this is SingleMessage && another is SingleMessage -> true\n        this is SingleMessage && another is MessageChain -> another.all { it is MessageMetadata || it is PlainText }\n        this is MessageChain && another is SingleMessage -> this.all { it is MessageMetadata || it is PlainText }\n        this is MessageChain && another is MessageChain -> {\n            val anotherIterator = another.iterator()\n\n            /**\n             * 逐个判断非 [PlainText] 的 [Message] 是否 [equals]\n             */\n            this.contentsSequence().forEach { thisElement ->\n                if (thisElement is PlainText) return@forEach\n                for (it in anotherIterator) {\n                    if (it is PlainText || it !is MessageContent) continue\n                    if (thisElement != it) return false\n                }\n            }\n            return true\n        }\n        else -> error(\"shouldn't be reached\")\n    }\n}\n\n\ninternal sealed class AbstractMessageChain : MessageChain {\n    /**\n     * 去重算法 v1 - 2.12:\n     * 在连接时若只有 0-1 方包含 [ConstrainSingle], 则使用 [CombinedMessage] 优化性能. 否则使用旧版复杂去重算法构造 [LinearMessageChainImpl].\n     */\n    @MiraiInternalApi\n    abstract val hasConstrainSingle: Boolean\n\n    @OptIn(MiraiInternalApi::class)\n    override fun hashCode(): Int {\n        var result = 1\n        acceptChildren(object : RecursiveMessageVisitor<Unit>() {\n//            override fun visitMessageChain(messageChain: MessageChain, data: Unit) {\n//                result = 31 * result + messageChain.hashCode()\n//                // do not call children\n//            }\n\n            // ensure `messageChainOf(messageChainOf(AtAll))` and `messageChainOf(AtAll)` get same hash code.\n            override fun visitSingleMessage(message: SingleMessage, data: Unit) {\n                result = 31 * result + message.hashCode()\n                super.visitSingleMessage(message, data)\n            }\n        })\n\n        return result\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (other === null) return false\n        if (other !is MessageChain) return false\n        return chainEquals(this, other)\n    }\n\n    private companion object {\n        private fun chainEquals(a: MessageChain, b: MessageChain): Boolean {\n            if (a.size != b.size) return false // Averagely faster even if we may end up counting size.\n\n            val itr1 = a.iterator()\n            val itr2 = b.iterator()\n            for (singleMessage in itr1) {\n                if (!itr2.hasNext()) return false\n                val n = itr2.next()\n                if (singleMessage != n) return false\n            }\n            return true\n        }\n    }\n}\n\n@OptIn(MiraiInternalApi::class)\ninternal val Message.hasConstrainSingle: Boolean\n    get() {\n        if (this is SingleMessage) return this is ConstrainSingle\n        // now `this` is MessageChain\n        return this.castOrNull<AbstractMessageChain>()?.hasConstrainSingle ?: true // for external type, assume they do\n    }\n\n/**\n * @see ConstrainSingleHelper.constrainSingleMessages\n */\ninternal data class ConstrainSingleData(\n    val value: List<SingleMessage>,\n    val hasConstrainSingle: Boolean,\n)\n\ninternal object ConstrainSingleHelper {\n    @JvmName(\"constrainSingleMessages_Sequence\")\n    internal fun constrainSingleMessages(sequence: Sequence<Message>): ConstrainSingleData =\n        constrainSingleMessages(sequence.flatMap { it.toMessageChain() })\n\n    internal fun constrainSingleMessages(sequence: Sequence<SingleMessage>): ConstrainSingleData =\n        constrainSingleMessagesImpl(sequence)\n\n    /**\n     * - [Sequence.toMutableList]\n     * - Replace in-place with marker null\n     */\n    private fun constrainSingleMessagesImpl(sequence: Sequence<SingleMessage>): ConstrainSingleData {\n        val list: MutableList<SingleMessage?> = sequence.toMutableList()\n\n        var hasConstrainSingle = false\n        for (singleMessage in list.asReversed()) {\n            if (singleMessage is ConstrainSingle) {\n                hasConstrainSingle = true\n                val key = singleMessage.key.topmostKey\n                val firstOccurrence = list.first { it != null && key.isInstance(it) } // may be singleMessage itself\n                list.replaceAllKotlin {\n                    when {\n                        it == null -> null\n                        it === firstOccurrence -> singleMessage\n                        key.isInstance(it) -> null // remove duplicates\n                        else -> it\n                    }\n                }\n            }\n        }\n\n        return ConstrainSingleData(list.filterNotNull(), hasConstrainSingle)\n    }\n\n}\n\n/**\n * 要求 opt-in, 避免意外调用构造器.\n */\n@RequiresOptIn\ninternal annotation class MessageChainConstructor\n\n\n/**\n * 使用 [Collection] 作为委托的 [MessageChain]\n */\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(MessageChain.Serializer::class)\ninternal class LinearMessageChainImpl @MessageChainConstructor private constructor(\n    /**\n     * Must be guaranteed to be immutable\n     */\n    @JvmField\n    internal val delegate: List<SingleMessage>,\n    override val hasConstrainSingle: Boolean\n) : Message, MessageChain, List<SingleMessage> by delegate, AbstractMessageChain(),\n    DirectSizeAccess, DirectToStringAccess {\n    override val size: Int get() = delegate.size\n    override fun iterator(): Iterator<SingleMessage> = delegate.iterator()\n\n    private val toStringTemp: String by lazy { this.delegate.joinToString(\"\") { it.toString() } }\n    override fun toString(): String = toStringTemp\n\n    private val contentToStringTemp: String by lazy { this.delegate.joinToString(\"\") { it.contentToString() } }\n    override fun contentToString(): String = contentToStringTemp\n\n    override fun <D> acceptChildren(visitor: MessageVisitor<D, *>, data: D) {\n        for (singleMessage in delegate) {\n            singleMessage.accept(visitor, data)\n        }\n    }\n\n    companion object {\n        fun combineCreate(message: Message, tail: Message): MessageChain {\n            return create(\n                ConstrainSingleHelper.constrainSingleMessages(\n                    message.toMessageChain().asSequence() + tail.toMessageChain().asSequence()\n                )\n            )\n            /*\n            when {\n                this is SingleMessage && tail is SingleMessage -> {\n                    if (this is ConstrainSingle && tail is ConstrainSingle) {\n                        if (this.key == tail.key)\n                            return SingleMessageChainImpl(tail)\n                    }\n                    return CombinedMessage(this, tail)\n                }\n\n                this is SingleMessage -> { // tail is not\n                    tail as MessageChain\n\n                    if (this is ConstrainSingle) {\n                        val key = this.key\n                        if (tail.any { (it as? ConstrainSingle)?.key == key }) {\n                            return tail\n                        }\n                    }\n                    return CombinedMessage(this, tail)\n                }\n\n                tail is SingleMessage -> {\n                    this as MessageChain\n\n                    if (tail is ConstrainSingle && this.hasDuplicationOfConstrain(tail.key)) {\n                        return MessageChainImplByCollection(constrainSingleMessagesImpl(this.asSequence() + tail))\n                    }\n\n                    return CombinedMessage(this, tail)\n                }\n\n                else -> { // both chain\n                    this as MessageChain\n                    tail as MessageChain\n\n                    return MessageChainImplByCollection(\n                        constrainSingleMessagesImpl(this.asSequence() + tail)\n                    )\n                }\n            }*/\n        }\n\n        /**\n         * @param delegate must be immutable\n         */\n        @OptIn(MessageChainConstructor::class)\n        fun create(delegate: List<SingleMessage>, hasConstrainSingle: Boolean): MessageChain {\n            return if (delegate.isEmpty()) {\n                emptyMessageChain()\n            } else {\n                LinearMessageChainImpl(delegate.asImmutable(), hasConstrainSingle)\n            }\n        }\n\n        fun create(data: ConstrainSingleData): MessageChain {\n            return create(data.value, data.hasConstrainSingle)\n        }\n    }\n}\n\n\n//////////////////////\n// region Image impl\n//////////////////////\n\n\n@get:JvmSynthetic\ninternal val EMPTY_BYTE_ARRAY = ByteArray(0)\n\n\n@JvmSynthetic\n@Suppress(\"NOTHING_TO_INLINE\") // no stack waste\ninternal inline fun Char.hexDigitToByte(): Int {\n    return when (this) {\n        in '0'..'9' -> this - '0'\n        in 'A'..'F' -> 10 + (this - 'A')\n        in 'a'..'f' -> 10 + (this - 'a')\n        else -> throw IllegalArgumentException(\"Illegal hex digit: $this\")\n    }\n}\n\n@JvmSynthetic\ninternal fun String.skipToSecondHyphen(): Int {\n    var count = 0\n    this.forEachIndexed { index, c ->\n        if (c == '-' && ++count == 2) return index\n    }\n    error(\"Internal error: failed skipToSecondHyphen, cannot find two hyphens. Input=$this\")\n}\n\n@JvmSynthetic\ninternal fun String.imageIdToMd5(offset: Int): ByteArray {\n    val result = ByteArray(16)\n    var cur = 0\n    var hasCurrent = false\n    var lastChar: Char = 0.toChar()\n    for (index in offset..this.lastIndex) {\n        val char = this[index]\n        if (char == '-') continue\n        if (hasCurrent) {\n            result[cur++] = (lastChar.hexDigitToByte().shl(4) or char.hexDigitToByte()).toByte()\n            if (cur == 16) return result\n            hasCurrent = false\n        } else {\n            lastChar = char\n            hasCurrent = true\n        }\n    }\n    error(\"Internal error: failed imageIdToMd5, no enough chars. Input=$this, offset=$offset\")\n}\n\ninternal val ILLEGAL_IMAGE_ID_EXCEPTION_MESSAGE: String =\n    \"ImageId must match Regex `${IMAGE_RESOURCE_ID_REGEX_1.pattern}`, \" +\n            \"`${IMAGE_RESOURCE_ID_REGEX_2.pattern}` or \" +\n            \"`${IMAGE_ID_REGEX.pattern}`\"\n\n// endregion"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/data/visitor/MessageVisitor.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.message.data.visitor\n\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.NotStableForInheritance\n\n/**\n * 消息的访问器.\n * 优先考虑使用此 visitor API 而不是 [MessageChain] 的 [List] API, 例如 [MessageChain.iterator]. 使用 [MessageVisitor] 将会提升性能, 对于巨大的通过 `plus` 方式连接的消息链有重大区别.\n *\n * @suppress 这是内部 API, 请不要调用\n * @since 2.12\n */\n@OptIn(MiraiExperimentalApi::class)\n@MiraiInternalApi\n@NotStableForInheritance\npublic interface MessageVisitor<in D, out R> {\n    public fun visitMessage(message: Message, data: D): R\n\n    // region SingleMessage\n    public fun visitSingleMessage(message: SingleMessage, data: D): R\n\n    // region MessageContent\n    public fun visitMessageContent(message: MessageContent, data: D): R\n\n    public fun visitPlainText(message: PlainText, data: D): R\n    public fun visitAt(message: At, data: D): R\n    public fun visitAtAll(message: AtAll, data: D): R\n\n    @Suppress(\"DEPRECATION_ERROR\")\n    public fun visitVoice(message: net.mamoe.mirai.message.data.Voice, data: D): R\n    public fun visitAudio(message: Audio, data: D): R\n\n    public fun visitShortVideo(message: ShortVideo, data: D): R\n\n    // region HummerMessage\n    public fun visitHummerMessage(message: HummerMessage, data: D): R\n    public fun visitFlashImage(message: FlashImage, data: D): R\n    public fun visitPokeMessage(message: PokeMessage, data: D): R\n    public fun visitVipFace(message: VipFace, data: D): R\n    public fun visitSuperFace(message: SuperFace, data: D): R\n\n    // region MarketFace\n    public fun visitMarketFace(message: MarketFace, data: D): R\n    public fun visitDice(message: Dice, data: D): R\n    public fun visitRockPaperScissors(message: RockPaperScissors, data: D): R\n\n    // endregion\n    // endregion\n\n    public fun visitFace(message: Face, data: D): R\n    public fun visitFileMessage(message: FileMessage, data: D): R\n    public fun visitImage(message: Image, data: D): R\n    public fun visitForwardMessage(message: ForwardMessage, data: D): R\n    public fun visitMusicShare(message: MusicShare, data: D): R\n\n    // region RichMessage\n    public fun visitRichMessage(message: RichMessage, data: D): R\n    public fun visitServiceMessage(message: ServiceMessage, data: D): R\n    public fun visitSimpleServiceMessage(message: SimpleServiceMessage, data: D): R\n    public fun visitLightApp(message: LightApp, data: D): R\n    public fun visitAbstractServiceMessage(message: AbstractServiceMessage, data: D): R\n\n    // endregion\n\n    public fun visitUnsupportedMessage(message: UnsupportedMessage, data: D): R\n    // endregion\n\n    // region MessageMetadata\n    public fun visitMessageMetadata(message: MessageMetadata, data: D): R\n\n    public fun visitMessageOrigin(message: MessageOrigin, data: D): R\n    public fun visitMessageSource(message: MessageSource, data: D): R\n    public fun visitQuoteReply(message: QuoteReply, data: D): R\n    public fun visitCustomMessageMetadata(message: CustomMessageMetadata, data: D): R\n    public fun visitShowImageFlag(message: ShowImageFlag, data: D): R\n\n    // endregion\n\n    // endregion\n\n    // region MessageChain\n    public fun visitMessageChain(messageChain: MessageChain, data: D): R\n    public fun visitCombinedMessage(message: CombinedMessage, data: D): R\n\n    // endregion\n}\n\n/**\n * @suppress 这是内部 API, 请不要调用\n * @since 2.12\n */\n@OptIn(MiraiExperimentalApi::class)\n@MiraiInternalApi\npublic abstract class AbstractMessageVisitor<in D, out R> : MessageVisitor<D, R> {\n    public override fun visitSingleMessage(message: SingleMessage, data: D): R {\n        return visitMessage(message, data)\n    }\n\n    public override fun visitMessageChain(messageChain: MessageChain, data: D): R {\n        return visitMessage(messageChain, data)\n    }\n\n    public override fun visitCombinedMessage(message: CombinedMessage, data: D): R {\n        return visitMessageChain(message, data)\n    }\n\n\n    public override fun visitMessageContent(message: MessageContent, data: D): R {\n        return visitSingleMessage(message, data)\n    }\n\n    public override fun visitMessageMetadata(message: MessageMetadata, data: D): R {\n        return visitSingleMessage(message, data)\n    }\n\n\n    public override fun visitMessageOrigin(message: MessageOrigin, data: D): R {\n        return visitMessageMetadata(message, data)\n    }\n\n    public override fun visitMessageSource(message: MessageSource, data: D): R {\n        return visitMessageMetadata(message, data)\n    }\n\n    public override fun visitQuoteReply(message: QuoteReply, data: D): R {\n        return visitMessageMetadata(message, data)\n    }\n\n    public override fun visitCustomMessageMetadata(message: CustomMessageMetadata, data: D): R {\n        return visitMessageMetadata(message, data)\n    }\n\n    public override fun visitShowImageFlag(message: ShowImageFlag, data: D): R {\n        return visitMessageMetadata(message, data)\n    }\n\n\n    public override fun visitPlainText(message: PlainText, data: D): R {\n        return visitMessageContent(message, data)\n    }\n\n    public override fun visitAt(message: At, data: D): R {\n        return visitMessageContent(message, data)\n    }\n\n    public override fun visitAtAll(message: AtAll, data: D): R {\n        return visitMessageContent(message, data)\n    }\n\n    @Suppress(\"DEPRECATION_ERROR\")\n    public override fun visitVoice(message: net.mamoe.mirai.message.data.Voice, data: D): R {\n        return visitMessageContent(message, data)\n    }\n\n    public override fun visitAudio(message: Audio, data: D): R {\n        return visitMessageContent(message, data)\n    }\n\n    override fun visitShortVideo(message: ShortVideo, data: D): R {\n        return visitMessageContent(message, data)\n    }\n\n    public override fun visitHummerMessage(message: HummerMessage, data: D): R {\n        return visitMessageContent(message, data)\n    }\n\n    public override fun visitFlashImage(message: FlashImage, data: D): R {\n        return visitHummerMessage(message, data)\n    }\n\n    public override fun visitPokeMessage(message: PokeMessage, data: D): R {\n        return visitHummerMessage(message, data)\n    }\n\n    public override fun visitVipFace(message: VipFace, data: D): R {\n        return visitHummerMessage(message, data)\n    }\n\n    override fun visitSuperFace(message: SuperFace, data: D): R {\n        return visitHummerMessage(message, data)\n    }\n\n    public override fun visitMarketFace(message: MarketFace, data: D): R {\n        return visitHummerMessage(message, data)\n    }\n\n    public override fun visitDice(message: Dice, data: D): R {\n        return visitMarketFace(message, data)\n    }\n\n    public override fun visitRockPaperScissors(message: RockPaperScissors, data: D): R {\n        return visitMarketFace(message, data)\n    }\n\n    public override fun visitFace(message: Face, data: D): R {\n        return visitMessageContent(message, data)\n    }\n\n    public override fun visitFileMessage(message: FileMessage, data: D): R {\n        return visitMessageContent(message, data)\n    }\n\n    public override fun visitImage(message: Image, data: D): R {\n        return visitMessageContent(message, data)\n    }\n\n    public override fun visitForwardMessage(message: ForwardMessage, data: D): R {\n        return visitMessageContent(message, data)\n    }\n\n    public override fun visitMusicShare(message: MusicShare, data: D): R {\n        return visitMessageContent(message, data)\n    }\n\n    public override fun visitUnsupportedMessage(message: UnsupportedMessage, data: D): R {\n        return visitMessageContent(message, data)\n    }\n\n\n    public override fun visitRichMessage(message: RichMessage, data: D): R {\n        return visitMessageContent(message, data)\n    }\n\n    public override fun visitServiceMessage(message: ServiceMessage, data: D): R {\n        return visitRichMessage(message, data)\n    }\n\n    public override fun visitSimpleServiceMessage(message: SimpleServiceMessage, data: D): R {\n        return visitServiceMessage(message, data)\n    }\n\n    public override fun visitLightApp(message: LightApp, data: D): R {\n        return visitRichMessage(message, data)\n    }\n\n    public override fun visitAbstractServiceMessage(message: AbstractServiceMessage, data: D): R {\n        return visitServiceMessage(message, data)\n    }\n}\n\n/**\n * @suppress 这是内部 API, 请不要调用\n * @since 2.12\n */\n@MiraiInternalApi\npublic abstract class RecursiveMessageVisitor<D> : MessageVisitorUnit() {\n    protected open fun isFinished(): Boolean = false\n\n    override fun visitMessage(message: Message, data: Unit) {\n        if (isFinished()) return\n        message.acceptChildren(this, data)\n    }\n}\n\n/**\n * @suppress 这是内部 API, 请不要调用\n * @since 2.12\n */\n@MiraiInternalApi\npublic abstract class MessageVisitorUnit : AbstractMessageVisitor<Unit, Unit>() {\n    override fun visitMessage(message: Message, data: Unit): Unit = Unit\n}\n\n/**\n * @suppress 这是内部 API, 请不要调用\n * @since 2.12\n */\n@MiraiInternalApi\npublic fun <R> Message.accept(visitor: MessageVisitor<Unit, R>): R = this.accept(visitor, Unit)\n\n/**\n * @suppress 这是内部 API, 请不要调用\n * @since 2.12\n */\n@MiraiInternalApi\npublic fun Message.acceptChildren(visitor: MessageVisitor<Unit, *>): Unit = this.acceptChildren(visitor, Unit)"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/message/utils.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MessageEventKt\")\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.message\n\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.event.*\nimport net.mamoe.mirai.event.events.MessageEvent\nimport net.mamoe.mirai.message.data.MessageChain\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmSynthetic\n\n\n/**\n * 判断两个 [MessageEvent] 的语境, 即 [MessageEvent.sender] 和 [MessageEvent.subject] 是否相同\n */\npublic fun MessageEvent.isContextIdenticalWith(another: MessageEvent): Boolean {\n    return this.sender == another.sender && this.subject == another.subject\n}\n\n\n/**\n * 挂起当前协程, 等待下一条语境与 [this] 相同且通过 [筛选][filter] 的 [MessageEvent].\n * 有关语境的定义可查看 [isContextIdenticalWith].\n *\n * 若 [filter] 抛出了一个异常, 本函数会立即抛出这个异常.\n *\n * @param timeoutMillis 超时. 单位为毫秒. `-1` 为不限制\n * @param filter 过滤器. 过滤器函数返回 `true` 表示拦截并返回此 [MessageEvent]. 返回 `false` 表示忽略该事件并继续监听下一个事件.\n\n * @see syncFromEvent 实现原理\n */\n@JvmSynthetic\npublic suspend inline fun <reified P : MessageEvent> P.nextMessage(\n    timeoutMillis: Long = -1,\n    priority: EventPriority = EventPriority.MONITOR,\n    noinline filter: suspend P.(P) -> Boolean = { true }\n): MessageChain = nextMessage(timeoutMillis, priority, false, filter)\n\n/**\n * 挂起当前协程, 等待下一条语境与 [this] 相同且通过 [筛选][filter] 的 [MessageEvent], 并且[拦截][Event.intercept]该事件.\n * 有关语境的定义可查看 [isContextIdenticalWith].\n * 有关拦截的说明可查看 [Event.intercept].\n *\n * 若 [filter] 抛出了一个异常, 本函数会立即抛出这个异常.\n *\n * @param timeoutMillis 超时. 单位为毫秒. `-1` 为不限制\n * @param priority 事件优先级. 查看 [EventChannel.subscribe] 以获得更多帮助.\n * @param intercept 是否拦截, 传入 `true` 时表示拦截此事件不让接下来的监听器处理, 传入 `false` 时表示让接下来的监听器处理\n * @param filter 过滤器. 过滤器函数返回 `true` 表示拦截并返回此 [MessageEvent]. 返回 `false` 表示忽略该事件并继续监听下一个事件.\n *\n * @see syncFromEvent 实现原理\n * @see MessageEvent.intercept 拦截事件\n *\n * @since 2.13\n */\n@JvmSynthetic\npublic suspend inline fun <reified P : MessageEvent> P.nextMessage(\n    timeoutMillis: Long = -1,\n    priority: EventPriority = EventPriority.HIGH,\n    intercept: Boolean = false,\n    noinline filter: suspend P.(P) -> Boolean = { true }\n): MessageChain {\n    val mapper: suspend (P) -> P? = createMapper(filter)\n\n    return (if (timeoutMillis == -1L) {\n        GlobalEventChannel.syncFromEvent(priority, mapper)\n    } else {\n        withTimeout(timeoutMillis) {\n            GlobalEventChannel.syncFromEvent(priority, mapper)\n        }\n    }).apply { if (intercept) intercept() }.message\n}\n\n/**\n * 挂起当前协程, 等待下一条 [MessageEvent.sender] 和 [MessageEvent.subject] 与 [this] 相同且通过 [筛选][filter] 的 [MessageEvent]\n *\n * 若 [filter] 抛出了一个异常, 本函数会立即抛出这个异常.\n *\n * @param timeoutMillis 超时. 单位为毫秒.\n * @param filter 过滤器. 过滤器函数返回 `true` 表示拦截并返回此 [MessageEvent]. 返回 `false` 表示忽略该事件并继续监听下一个事件.\n * @return 消息链. 超时时返回 `null`\n *\n * @see syncFromEvent\n */\n@JvmSynthetic\npublic suspend inline fun <reified P : MessageEvent> P.nextMessageOrNull(\n    timeoutMillis: Long,\n    priority: EventPriority = EventPriority.MONITOR,\n    noinline filter: suspend P.(P) -> Boolean = { true }\n): MessageChain? {\n    require(timeoutMillis > 0) { \"timeoutMillis must be > 0\" }\n\n    val mapper: suspend (P) -> P? = createMapper(filter)\n\n    return (if (timeoutMillis == -1L) {\n        GlobalEventChannel.syncFromEvent(priority, mapper)\n    } else {\n        withTimeoutOrNull(timeoutMillis) {\n            GlobalEventChannel.syncFromEvent(priority, mapper)\n        }\n    })?.message\n}\n\n/**\n * [nextMessage] 的异步版本.\n *\n * 此方法总是会在 [bot] 的[协程作用域][CoroutineScope]之下[创建任务][CoroutineScope.async],\n * 不利于管理异常, 也不利于结构化并发, 建议使用自行创建协程并调用 [nextMessageOrNull].\n *\n * @see nextMessage\n */\n@JvmSynthetic\npublic inline fun <reified P : MessageEvent> P.nextMessageAsync(\n    timeoutMillis: Long = -1,\n    coroutineContext: CoroutineContext = EmptyCoroutineContext,\n    priority: EventPriority = EventPriority.MONITOR,\n    noinline filter: suspend P.(P) -> Boolean = { true }\n): Deferred<MessageChain> {\n    return this.bot.async(coroutineContext) {\n        nextMessage(timeoutMillis, priority, filter)\n    }\n}\n\n/**\n * [nextMessageOrNull] 的异步版本.\n *\n * 此方法总是会在 [bot] 的[协程作用域][CoroutineScope]之下[创建任务][CoroutineScope.async],\n * 不利于管理异常, 也不利于结构化并发, 建议使用自行创建协程并调用 [nextMessageOrNull].\n *\n * @see nextMessageOrNull\n */\n@JvmSynthetic\npublic inline fun <reified P : MessageEvent> P.nextMessageOrNullAsync(\n    timeoutMillis: Long,\n    coroutineContext: CoroutineContext = EmptyCoroutineContext,\n    priority: EventPriority = EventPriority.MONITOR,\n    noinline filter: suspend P.(P) -> Boolean = { true }\n): Deferred<MessageChain?> {\n    require(timeoutMillis > 0) { \"timeoutMillis must be > 0\" }\n    return this.bot.async(coroutineContext) {\n        nextMessageOrNull(timeoutMillis, priority, filter)\n    }\n}\n\n\n/// internals\n\n/**\n * @since 2.10\n */\n@PublishedApi // inline, safe to remove in the future\ninternal inline fun <reified P : MessageEvent> P.createMapper(crossinline filter: suspend P.(P) -> Boolean): suspend (P) -> P? =\n    mapper@{ event ->\n        if (!event.isContextIdenticalWith(this)) return@mapper null\n        if (!filter(event, event)) return@mapper null\n        event\n    }\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/network/ForceOfflineException.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.network\n\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.Job\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.utils.DeprecatedSinceMirai\nimport kotlin.jvm.JvmOverloads\n\n/**\n * 当 [Bot] 被迫下线时抛出, 作为 [Job.cancel] 的 `cause`\n */\n@Deprecated(\"Not used anymore since 2.7\", level = DeprecationLevel.HIDDEN) // deprecated since 2.7, error since 2.8\n@DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.8\", hiddenSince = \"2.10\")\npublic class ForceOfflineException\n@JvmOverloads constructor(\n    public override val message: String? = null,\n    public override val cause: Throwable? = null\n) : CancellationException(message)"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/network/LoginFailedException.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.network\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.auth.BotAuthorization\nimport net.mamoe.mirai.utils.LoginSolver\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n\n/**\n * 在 [登录][Bot.login] 失败时抛出, 可正常地中断登录过程.\n */\npublic sealed class LoginFailedException(\n    /**\n     * 是否可因此登录失败而关闭 [Bot]. 一般是密码错误, 被冻结等异常时.\n     */\n    public val killBot: Boolean = false,\n    message: String? = null,\n    cause: Throwable? = null\n) : RuntimeException(message, cause)\n// 实现提示 (仅供网络层实现者参考): `LoginFailedException` 会被包装为 `NetworkException` (`LoginFailedExceptionAsNetworkException`),\n// 并在 `bot.login` 时 unwrap.\n\n/**\n * 密码输入错误 (有时候也会是其他错误, 如 `\"当前上网环境异常，请更换网络环境或在常用设备上登录或稍后再试。\"`)\n */\npublic class WrongPasswordException @MiraiInternalApi constructor(\n    message: String?\n) : LoginFailedException(true, message)\n\n/**\n * 二维码扫码账号与 BOT 账号不一致。\n *\n * @since 2.15\n */\npublic class InconsistentBotIdException @MiraiInternalApi constructor(\n    public val expected: Long,\n    public val actual: Long,\n    message: String? = null\n) : LoginFailedException(\n    true,\n    message\n        ?: \"trying to logging in a bot whose id is different from the one provided to BotFactory.newBot, expected=$expected, actual=$actual.\"\n)\n\n/**\n * 无可用服务器\n */\npublic class NoServerAvailableException @MiraiInternalApi constructor(\n    public override val cause: Throwable?\n) : LoginFailedException(false, \"no server available\")\n\n/**\n * 服务器要求稍后重试\n */\npublic class RetryLaterException @MiraiInternalApi constructor(\n    message: String?,\n    cause: Throwable? = null,\n    killBot: Boolean = false\n) : LoginFailedException(killBot, message, cause)\n\n/**\n * 无标准输入或 Kotlin 不支持此输入.\n */\npublic class NoStandardInputForCaptchaException @MiraiInternalApi constructor(\n    public override val cause: Throwable? = null\n) : LoginFailedException(true, \"no standard input for captcha\")\n\n/**\n * 表示在登录过程中, [BotAuthorization] 抛出的异常.\n * @since 2.15\n */\npublic class BotAuthorizationException @MiraiInternalApi constructor(\n    public val authorization: BotAuthorization,\n    cause: Throwable?,\n) : LoginFailedException(\n    killBot = true,\n    \"BotAuthorization(${authorization}) threw an exception during authorization process. See cause below.\",\n    cause\n)\n\n/**\n * 当前 [LoginSolver] 不支持此验证方式\n *\n * @since 2.15\n */\npublic open class UnsupportedCaptchaMethodException : LoginFailedException {\n    public constructor(killBot: Boolean) : super(killBot)\n    public constructor(killBot: Boolean, message: String?) : super(killBot, message)\n    public constructor(killBot: Boolean, message: String?, cause: Throwable?) : super(killBot, message, cause)\n    public constructor(killBot: Boolean, cause: Throwable?) : super(killBot, cause = cause)\n}\n\n/**\n * 需要强制短信验证, 且当前 [LoginSolver] 不支持时抛出.\n * @since 2.13\n */\npublic class UnsupportedSmsLoginException(message: String?) : UnsupportedCaptchaMethodException(true, message)\n\n/**\n * 无法完成滑块验证\n */\npublic class UnsupportedSliderCaptchaException(message: String?) : UnsupportedCaptchaMethodException(true, message)\n\n/**\n * 需要二维码登录, 且当前 [LoginSolver] 不支持时抛出\n *\n * @since 2.15\n */\npublic class UnsupportedQRCodeCaptchaException(message: String?) : UnsupportedCaptchaMethodException(true, message)\n\n/**\n * 非 mirai 实现的异常\n */\npublic abstract class CustomLoginFailedException : LoginFailedException {\n    public constructor(killBot: Boolean) : super(killBot)\n    public constructor(killBot: Boolean, message: String?) : super(killBot, message)\n    public constructor(killBot: Boolean, message: String?, cause: Throwable?) : super(killBot, message, cause)\n    public constructor(killBot: Boolean, cause: Throwable?) : super(killBot, cause = cause)\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/spi/AudioToSilkService.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.spi\n\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.runAutoClose\nimport net.mamoe.mirai.utils.useAutoClose\nimport net.mamoe.mirai.utils.withAutoClose\nimport kotlin.jvm.JvmStatic\n\n/**\n * 将源音频文件转换为 silk v3 with tencent 格式\n *\n * @since 2.8.0\n */ // stable since 2.15\npublic interface AudioToSilkService : BaseService {\n    /**\n     * implementation note:\n     *\n     * 如果返回值为转换后的资源文件:\n     *\n     * 如果 [ExternalResource.isAutoClose], 需要关闭 [source],\n     * 返回的 [ExternalResource] 的 [ExternalResource.isAutoClose] 必须为 `true`\n     *\n     * 特别的, 如果该方法体抛出了一个错误, 如果 [ExternalResource.isAutoClose], 需要关闭 [source]\n     *\n     * @see [withAutoClose]\n     * @see [runAutoClose]\n     * @see [useAutoClose]\n     */\n    public suspend fun convert(source: ExternalResource): ExternalResource\n\n    public companion object {\n        private val loader = SpiServiceLoader(AudioToSilkService::class) {\n            object : AudioToSilkService {\n                override suspend fun convert(source: ExternalResource): ExternalResource = source\n            }\n        }\n\n        /**\n         * 获取当前实例\n         */\n        @JvmStatic\n        public val instance: AudioToSilkService get() = loader.service\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/spi/SPIServiceLoader.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.spi\n\nimport kotlinx.atomicfu.locks.SynchronizedObject\nimport kotlinx.atomicfu.locks.synchronized\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.lateinitMutableProperty\nimport net.mamoe.mirai.utils.loadServices\nimport kotlin.reflect.KClass\n\n/**\n * 基本 SPI 接口\n * @since 2.8.0\n */ // stable since 2.15\npublic interface BaseService {\n    /** 使用优先级, 值越小越先使用 */\n    public val priority: Int get() = 0\n}\n\ninternal fun <T : BaseService> SpiServiceLoader(\n    serviceType: KClass<T>,\n    defaultImplementation: () -> T\n): SpiServiceLoader<T> {\n    return SpiServiceLoaderImpl(serviceType, defaultImplementation)\n}\n\n\ninternal fun <T : BaseService> SpiServiceLoader(\n    serviceType: KClass<T>\n): SpiServiceLoader<T?> {\n    return SpiServiceLoaderImpl(serviceType, null)\n}\n\ninternal interface SpiServiceLoader<T : BaseService?> {\n    val service: T\n    val allServices: List<T & Any>\n}\n\ninternal class SpiServiceLoaderImpl<T : BaseService?>(\n    private val serviceType: KClass<T & Any>,\n    defaultService: (() -> T)?\n) : SpiServiceLoader<T> {\n    private val defaultInstance: T? by lazy {\n        defaultService?.invoke()\n    }\n    private val lock = SynchronizedObject()\n\n    override val service: T get() = _service.bestService\n    override val allServices: List<T & Any> get() = _service.allServices\n\n    private class Loaded<T>(\n        val bestService: T,\n        val allServices: List<T & Any>,\n    )\n\n    private var _service: Loaded<T> by lateinitMutableProperty {\n        synchronized(lock) {\n            reloadAndSelect()\n        }\n    }\n\n    fun reload() {\n        synchronized(lock) {\n            _service = reloadAndSelect()\n        }\n    }\n\n    private fun reloadAndSelect(): Loaded<T> {\n        val allServices = loadServices(serviceType).toList()\n\n        @Suppress(\"UNCHECKED_CAST\")\n        val bestService = (allServices.minByOrNull { it.priority } ?: defaultInstance) as T\n        return Loaded(bestService, allServices)\n    }\n\n    companion object {\n        val SPI_SERVICE_LOADER_LOGGER: MiraiLogger by lazy {\n            MiraiLogger.Factory.create(SpiServiceLoader::class, \"spi-service-loader\")\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/utils/AbstractBotConfiguration.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.utils.DeviceInfo.Companion.loadAsDeviceInfo\nimport java.io.File\nimport java.io.InputStream\n\n\n/**\n * [BotConfiguration] 的 JVM 平台特别配置\n * @since 2.15\n */\n@NotStableForInheritance\npublic abstract class AbstractBotConfiguration { // open for Java\n    protected abstract var deviceInfo: ((Bot) -> DeviceInfo)?\n    protected abstract var networkLoggerSupplier: ((Bot) -> MiraiLogger)\n    protected abstract var botLoggerSupplier: ((Bot) -> MiraiLogger)\n\n\n    /**\n     * 工作目录. 默认为 \".\"\n     */\n    public var workingDir: File = File(\".\")\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Device\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 使用文件存储设备信息.\n     *\n     * 此函数只在 JVM 和 Android 有效. 在其他平台将会抛出异常.\n     * @param filepath 文件路径. 默认是相对于 [workingDir] 的文件 \"device.json\".\n     * @see deviceInfo\n     */\n    @JvmOverloads\n    @BotConfiguration.ConfigurationDsl\n    public fun fileBasedDeviceInfo(filepath: String = \"device.json\") {\n        deviceInfo = {\n            workingDir.resolve(filepath).loadAsDeviceInfo(BotConfiguration.json)\n        }\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Logging\n    ///////////////////////////////////////////////////////////////////////////\n\n\n    /**\n     * 重定向 [网络日志][networkLoggerSupplier] 到指定目录. 若目录不存在将会自动创建 ([File.mkdirs])\n     * 默认目录路径为 \"$workingDir/logs/\".\n     * @see DirectoryLogger\n     * @see redirectNetworkLogToDirectory\n     */\n    @JvmOverloads\n    @BotConfiguration.ConfigurationDsl\n    public fun redirectNetworkLogToDirectory(\n        dir: File = File(\"logs\"),\n        retain: Long = 1.weeksToMillis,\n        identity: (bot: Bot) -> String = { \"Net ${it.id}\" }\n    ) {\n        require(!dir.isFile) { \"dir must not be a file\" }\n        networkLoggerSupplier = { DirectoryLogger(identity(it), workingDir.resolve(dir), retain) }\n    }\n\n    /**\n     * 重定向 [网络日志][networkLoggerSupplier] 到指定文件. 默认文件路径为 \"$workingDir/mirai.log\".\n     * 日志将会逐行追加到此文件. 若文件不存在将会自动创建 ([File.createNewFile])\n     * @see SingleFileLogger\n     * @see redirectNetworkLogToDirectory\n     */\n    @JvmOverloads\n    @BotConfiguration.ConfigurationDsl\n    public fun redirectNetworkLogToFile(\n        file: File = File(\"mirai.log\"),\n        identity: (bot: Bot) -> String = { \"Net ${it.id}\" }\n    ) {\n        require(!file.isDirectory) { \"file must not be a dir\" }\n        networkLoggerSupplier = { SingleFileLogger(identity(it), workingDir.resolve(file)) }\n    }\n\n    /**\n     * 重定向 [Bot 日志][botLoggerSupplier] 到指定文件.\n     * 日志将会逐行追加到此文件. 若文件不存在将会自动创建 ([File.createNewFile])\n     * @see SingleFileLogger\n     * @see redirectBotLogToDirectory\n     */\n    @JvmOverloads\n    @BotConfiguration.ConfigurationDsl\n    public fun redirectBotLogToFile(\n        file: File = File(\"mirai.log\"),\n        identity: (bot: Bot) -> String = { \"Bot ${it.id}\" }\n    ) {\n        require(!file.isDirectory) { \"file must not be a dir\" }\n        botLoggerSupplier = { SingleFileLogger(identity(it), workingDir.resolve(file)) }\n    }\n\n\n    /**\n     * 重定向 [Bot 日志][botLoggerSupplier] 到指定目录. 若目录不存在将会自动创建 ([File.mkdirs])\n     * @see DirectoryLogger\n     * @see redirectBotLogToFile\n     */\n    @JvmOverloads\n    @BotConfiguration.ConfigurationDsl\n    public fun redirectBotLogToDirectory(\n        dir: File = File(\"logs\"),\n        retain: Long = 1.weeksToMillis,\n        identity: (bot: Bot) -> String = { \"Bot ${it.id}\" }\n    ) {\n        require(!dir.isFile) { \"dir must not be a file\" }\n        botLoggerSupplier = { DirectoryLogger(identity(it), workingDir.resolve(dir), retain) }\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Cache\n    //////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 缓存数据目录, 相对于 [workingDir].\n     *\n     * 缓存目录保存的内容均属于不稳定的 Mirai 内部数据, 请不要手动修改它们. 清空缓存不会影响功能. 只会导致一些操作如读取全部群列表要重新进行.\n     * 默认启用的缓存可以加快登录过程.\n     *\n     * 注意: 这个目录只存储能在 [BotConfiguration] 配置的内容, 即包含:\n     * - 联系人列表\n     * - 登录服务器列表\n     * - 资源服务秘钥\n     *\n     * 其他内容如通过 [InputStream] 发送图片时的缓存使用 [FileCacheStrategy], 默认使用系统临时文件且会在关闭时删除文件.\n     *\n     * @since 2.4\n     */\n    public var cacheDir: File = File(\"cache\")\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Misc\n    ///////////////////////////////////////////////////////////////////////////\n\n    internal fun applyMppCopy(new: BotConfiguration) {\n        new.workingDir = workingDir\n        new.cacheDir = cacheDir\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/utils/AbstractExternalResource.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport io.ktor.utils.io.core.*\nimport io.ktor.utils.io.errors.*\nimport io.ktor.utils.io.streams.*\nimport kotlinx.atomicfu.atomic\nimport kotlinx.coroutines.CompletableDeferred\nimport kotlinx.coroutines.Deferred\nimport net.mamoe.mirai.internal.utils.ExternalResourceHolder\nimport net.mamoe.mirai.internal.utils.ExternalResourceLeakObserver\nimport net.mamoe.mirai.internal.utils.detectFileTypeAndClose\nimport net.mamoe.mirai.utils.AbstractExternalResource.ResourceCleanCallback\nimport java.io.InputStream\n\n/**\n * 一个实现了基本方法的外部资源\n *\n * ## 实现\n *\n * [AbstractExternalResource] 实现了大部分必要的方法,\n * 只有 [ExternalResource.inputStream], [ExternalResource.size] 还未实现\n *\n * 其中 [ExternalResource.inputStream] 要求每次读取的内容都是一致的\n *\n * Example:\n * ```\n * class MyCustomExternalResource: AbstractExternalResource() {\n *      override fun inputStream0(): InputStream = FileInputStream(\"/test.txt\")\n *      override val size: Long get() = File(\"/test.txt\").length()\n * }\n * ```\n *\n * ## 资源释放\n *\n * 如同 mirai 内置的 [ExternalResource] 实现一样,\n * [AbstractExternalResource] 也会被注册进入资源泄露监视器\n * (即意味着 [AbstractExternalResource] 也要求手动关闭)\n *\n * 为了确保逻辑正确性, [AbstractExternalResource] 不允许覆盖其 [close] 方法,\n * 必须在构造 [AbstractExternalResource] 的时候给定一个 [ResourceCleanCallback] 以进行资源释放\n *\n * 对于 [ResourceCleanCallback], 有以下要求\n *\n * - 没有对 [AbstractExternalResource] 的访问 (即没有 [AbstractExternalResource] 的任何引用)\n *\n * Example:\n * ```\n * class MyRes(\n *      cleanup: ResourceCleanCallback,\n *      val delegate: Closable,\n * ): AbstractExternalResource(cleanup) {\n * }\n *\n * // 错误, 该写法会导致 Resource 永远也不会被自动释放\n * lateinit var myRes: MyRes\n * val cleanup = ResourceCleanCallback {\n *      myRes.delegate.close()\n * }\n * myRes = MyRes(cleanup, fetchDelegate())\n *\n * // 正确\n * val delegate: Closable\n * val cleanup = ResourceCleanCallback {\n *      delegate.close()\n * }\n * val myRes = MyRes(cleanup, delegate)\n * ```\n *\n * @since 2.9\n *\n * @see ExternalResource\n * @see AbstractExternalResource.setResourceCleanCallback\n * @see AbstractExternalResource.registerToLeakObserver\n */\n@Suppress(\"MemberVisibilityCanBePrivate\")\npublic abstract class AbstractExternalResource\n@JvmOverloads\npublic constructor(\n    displayName: String? = null,\n    cleanup: ResourceCleanCallback? = null,\n) : ExternalResource {\n\n    public constructor(\n        cleanup: ResourceCleanCallback? = null,\n    ) : this(null, cleanup)\n\n    public fun interface ResourceCleanCallback {\n        @Throws(IOException::class)\n        public fun cleanup()\n    }\n\n    override val md5: ByteArray by lazy { inputStream().md5() }\n    override val sha1: ByteArray by lazy { inputStream().sha1() }\n    override val formatName: String by lazy {\n        inputStream().detectFileTypeAndClose() ?: ExternalResource.DEFAULT_FORMAT_NAME\n    }\n\n    private val leakObserverRegistered = atomic(false)\n\n    /**\n     * 注册 [ExternalResource] 资源泄露监视器\n     *\n     * 受限于类继承构造器调用顺序, [AbstractExternalResource] 无法做到在完成初始化后马上注册监视器\n     *\n     * 该方法以允许 实现类 在完成初始化后直接注册资源监视器以避免意外的资源泄露\n     *\n     * 在不调用本方法的前提下, 如果没有相关的资源访问操作, `this` 可能会被意外泄露\n     *\n     * 正确示例:\n     * ```\n     * // Kotlin\n     * public class MyResource: AbstractExternalResource() {\n     *      init {\n     *          val res: SomeResource\n     *          // 一些资源初始化\n     *          registerToLeakObserver()\n     *          setResourceCleanCallback(Releaser(res))\n     *      }\n     *\n     *      private class Releaser(\n     *          private val res: SomeResource,\n     *      ) : AbstractExternalResource.ResourceCleanCallback {\n     *          override fun cleanup() = res.close()\n     *      }\n     * }\n     *\n     * // Java\n     * public class MyResource extends AbstractExternalResource {\n     *      public MyResource() throws IOException {\n     *          SomeResource res;\n     *          // 一些资源初始化\n     *          registerToLeakObserver();\n     *          setResourceCleanCallback(new Releaser(res));\n     *      }\n     *\n     *      private static class Releaser implements ResourceCleanCallback {\n     *          private final SomeResource res;\n     *          Releaser(SomeResource res) { this.res = res; }\n     *\n     *          public void cleanup() throws IOException { res.close(); }\n     *      }\n     * }\n     * ```\n     *\n     * @see setResourceCleanCallback\n     */\n    protected fun registerToLeakObserver() {\n        // 用户自定义 AbstractExternalResource 也许会在 <init> 的时候失败\n        // 于是在第一次使用 ExternalResource 相关的函数的时候注册 LeakObserver\n        if (leakObserverRegistered.compareAndSet(expect = false, update = true)) {\n            ExternalResourceLeakObserver.register(this, holder)\n        }\n    }\n\n    /**\n     * 该方法用于告知 [AbstractExternalResource] 不需要注册资源泄露监视器。\n     * **仅在我知道我在干什么的前提下调用此方法**\n     *\n     * 不建议取消注册监视器, 这可能带来意外的错误\n     *\n     * @see registerToLeakObserver\n     */\n    protected fun dontRegisterLeakObserver() {\n        leakObserverRegistered.value = true\n    }\n\n    final override fun inputStream(): InputStream {\n        registerToLeakObserver()\n        return inputStream0()\n    }\n\n    protected abstract fun inputStream0(): InputStream\n\n    /**\n     * 修改 `this` 的资源释放回调。\n     * **仅在我知道我在干什么的前提下调用此方法**\n     *\n     * ```\n     * class MyRes {\n     * // region kotlin\n     *\n     *      private inner class Releaser : ResourceCleanCallback\n     *\n     *      private class NotInnerReleaser : ResourceCleanCallback\n     *\n     *      init {\n     *          // 错误, 内部类, Releaser 存在对 MyRes 的引用\n     *          setResourceCleanCallback(Releaser())\n     *          // 错误, 匿名对象, 可能存在对 MyRes 的引用, 取决于编译器\n     *          setResourceCleanCallback(object : ResourceCleanCallback {})\n     *          // 正确, 无 inner 修饰, 等同于 java 的 private static class\n     *          setResourceCleanCallback(NotInnerReleaser(directResource))\n     *      }\n     *\n     * // endregion kotlin\n     *\n     * // region java\n     *\n     *      private class Releaser implements ResourceCleanCallback {}\n     *      private static class StaticReleaser implements ResourceCleanCallback {}\n     *\n     *      MyRes() {\n     *          // 错误, 内部类, 存在对 MyRes 的引用\n     *          setResourceCleanCallback(new Releaser());\n     *          // 错误, 匿名对象, 可能存在对 MyRes 的引用, 取决于 javac\n     *          setResourceCleanCallback(new ResourceCleanCallback() {});\n     *          // 正确\n     *          setResourceCleanCallback(new StaticReleaser(directResource));\n     *      }\n     *\n     * // endregion java\n     * }\n     * ```\n     *\n     * @see registerToLeakObserver\n     */\n    protected fun setResourceCleanCallback(cleanup: ResourceCleanCallback?) {\n        holder.cleanup = cleanup\n    }\n\n    private class UsrCustomResHolder(\n        @JvmField var cleanup: ResourceCleanCallback?,\n        private val resourceName: String,\n    ) : ExternalResourceHolder() {\n\n        override val closed: Deferred<Unit> = CompletableDeferred()\n\n        override fun closeImpl() {\n            cleanup?.cleanup()\n        }\n\n        // display on logger of ExternalResourceLeakObserver\n        override fun toString(): String = resourceName\n    }\n\n    private val holder = UsrCustomResHolder(cleanup, displayName ?: buildString {\n        append(\"ExternalResourceHolder<\")\n        append(this@AbstractExternalResource.javaClass.name)\n        append('@')\n        append(System.identityHashCode(this@AbstractExternalResource))\n        append('>')\n    })\n\n    final override val closed: Deferred<Unit> get() = holder.closed.also { registerToLeakObserver() }\n\n    @Throws(IOException::class)\n    final override fun close() {\n        holder.close()\n    }\n\n    @OptIn(MiraiInternalApi::class)\n    @MiraiExperimentalApi\n    override fun input(): Input {\n        return inputStream().asInput()\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/utils/Annotations.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.annotation.AnnotationTarget.*\n\n/**\n * 标记为一个仅供 Mirai 内部使用的 API.\n *\n * 这些 API 可能会在任意时刻更改, 且不会发布任何预警.\n * 非常不建议在发行版本中使用这些 API.\n */\n@Retention(AnnotationRetention.BINARY)\n@RequiresOptIn(level = RequiresOptIn.Level.ERROR)\n@Target(\n    CLASS, TYPEALIAS, FUNCTION, PROPERTY, FIELD, CONSTRUCTOR,\n    CLASS, FUNCTION, PROPERTY\n)\n@MustBeDocumented\npublic annotation class MiraiInternalApi(\n    public val message: String = \"\"\n)\n\n/**\n * 标记为一个仅供 Mirai 内部使用的 API.\n *\n * 这些 API 可能会在任意时刻更改, 且不会发布任何预警.\n * 非常不建议在发行版本中使用这些 API.\n */\n@Retention(AnnotationRetention.BINARY)\n@Target(FILE)\npublic annotation class MiraiInternalFile\n\n/**\n * 标记这个类, 类型, 函数, 属性, 字段, 或构造器为实验性的 API.\n *\n * 这些 API 不具有稳定性, 且可能会在任意时刻更改.\n * 不建议在发行版本中使用这些 API.\n */\n@Retention(AnnotationRetention.BINARY)\n@RequiresOptIn(level = RequiresOptIn.Level.WARNING)\n@Target(CLASS, TYPEALIAS, FUNCTION, PROPERTY, FIELD, CONSTRUCTOR)\n@MustBeDocumented\npublic annotation class MiraiExperimentalApi(\n    public val message: String = \"\"\n)\n\n/**\n * 标记一个定义在使用上是稳定的 (如果没有特殊说明), 但只应该由 mirai 内部实现.\n *\n * 用户自行实现将可能造成对未来版本的不兼容, 因为新的抽象函数或属性会在未经警告的前提下添加. 自行实现还可能因 mirai 内部实现有部分硬编码成分而不兼容.\n *\n * @since 2.7\n */\n@Retention(AnnotationRetention.BINARY)\n@Target(CLASS, PROPERTY, FUNCTION)\n@MustBeDocumented\npublic annotation class NotStableForInheritance(\n    public val message: String = \"This declaration is not stable for inheritance.\"\n)\n\n/**\n * 标记一个正计划在 [version] 版本时删除 (对外隐藏) 的 API.\n */\n@Target(CLASS, PROPERTY, FIELD, CONSTRUCTOR, FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER, TYPEALIAS)\n@Retention(AnnotationRetention.SOURCE)\n@MustBeDocumented\ninternal annotation class PlannedRemoval(val version: String)\n\n\n/**\n * 该注解仅用于测试 EventHandler\n *\n * 标注了此注解的意为像处理 java 方法那样处理 kotlin 方法\n */\n@Retention(AnnotationRetention.RUNTIME)\ninternal annotation class EventListenerLikeJava\n\n\n/**\n * 表明这个 API 是为了让 Java 使用者调用更方便.\n *\n * 一般有一定的性能损失, 且不能在 JVM/Android 以外平台使用. 不要在 Kotlin 调用它.\n */\n@RequiresOptIn(level = RequiresOptIn.Level.ERROR)\n@Target(PROPERTY, FUNCTION, CLASS)\npublic annotation class JavaFriendlyAPI // made public since 2.8.0-RC"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/utils/BotConfiguration.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"DEPRECATION_ERROR\", \"EXPOSED_SUPER_CLASS\", \"MemberVisibilityCanBePrivate\")\n\n@file:JvmMultifileClass\n@file:JvmName(\"Utils\")\n\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.serialization.json.Json\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.BotFactory\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.auth.BotAuthorization\nimport net.mamoe.mirai.event.events.BotOfflineEvent\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\nimport kotlin.coroutines.coroutineContext\nimport kotlin.time.Duration\nimport kotlin.time.Duration.Companion.milliseconds\n\n/**\n * [Bot] 配置. 用于 [BotFactory.newBot].\n *\n * 部分平台相关配置位于 [AbstractBotConfiguration], 例如 `fileBasedDeviceInfo`.\n *\n * Kotlin 使用方法:\n * ```\n * val bot = BotFactory.newBot(...) {\n *    // 在这里配置 Bot\n *\n *    bogLoggerSupplier = { bot -> ... }\n *    fileBasedDeviceInfo()\n *    inheritCoroutineContext() // 使用 `coroutineScope` 的 Job 作为父 Job\n * }\n * ```\n *\n * Java 使用方法:\n * ```java\n * Bot bot = BotFactory.newBot(..., new BotConfiguration() {{\n *     setBogLoggerSupplier((Bot bot) -> { ... })\n *     fileBasedDeviceInfo()\n *     ...\n * }})\n * ```\n */\n@OptIn(MiraiInternalApi::class)\npublic open class BotConfiguration : AbstractBotConfiguration() { // open for Java\n    ///////////////////////////////////////////////////////////////////////////\n    // Coroutines\n    ///////////////////////////////////////////////////////////////////////////\n\n    /** 父 [CoroutineContext]. [Bot] 创建后会使用 [SupervisorJob] 覆盖其 [Job], 但会将这个 [Job] 作为父 [Job] */\n    public var parentCoroutineContext: CoroutineContext = EmptyCoroutineContext\n\n    /**\n     * 使用当前协程的 [coroutineContext] 作为 [parentCoroutineContext].\n     *\n     * Bot 将会使用一个 [SupervisorJob] 覆盖 [coroutineContext] 当前协程的 [Job], 并使用当前协程的 [Job] 作为父 [Job]\n     *\n     * 用例:\n     * ```\n     * coroutineScope {\n     *   val bot = Bot(...) {\n     *     inheritCoroutineContext()\n     *   }\n     *   bot.login()\n     * } // coroutineScope 会等待 Bot 退出\n     * ```\n     *\n     *\n     * **注意**: `bot.cancel` 时将会让父 [Job] 也被 cancel.\n     * ```\n     * coroutineScope { // this: CoroutineScope\n     *   launch {\n     *     while(isActive) {\n     *       delay(500)\n     *       println(\"I'm alive\")\n     *     }\n     *   }\n     *\n     *   val bot = Bot(...) {\n     *      inheritCoroutineContext() // 使用 `coroutineScope` 的 Job 作为父 Job\n     *   }\n     *   bot.login()\n     *   bot.cancel() // 取消了整个 `coroutineScope`, 因此上文不断打印 `\"I'm alive\"` 的协程也会被取消.\n     * }\n     * ```\n     *\n     * 因此, 此函数尤为适合在 `suspend fun main()` 中使用, 它能阻止主线程退出:\n     * ```\n     * suspend fun main() {\n     *   val bot = Bot() {\n     *     inheritCoroutineContext()\n     *   }\n     *   bot.eventChannel.subscribe { ... }\n     *\n     *   // 主线程不会退出, 直到 Bot 离线.\n     * }\n     * ```\n     *\n     * 简言之,\n     * - 若想让 [Bot] 作为 '守护进程' 运行, 则无需调用 [inheritCoroutineContext].\n     * - 若想让 [Bot] 依赖于当前协程, 让当前协程等待 [Bot] 运行, 则使用 [inheritCoroutineContext]\n     *\n     * @see parentCoroutineContext\n     */\n    @JvmSynthetic\n    @ConfigurationDsl\n    public suspend inline fun inheritCoroutineContext() {\n        parentCoroutineContext = coroutineContext\n    }\n\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Connection\n    ///////////////////////////////////////////////////////////////////////////\n\n    /** 连接心跳包周期. 过长会导致被服务器断开连接. */\n    public var heartbeatPeriodMillis: Long = 60.secondsToMillis\n\n    /**\n     * 状态心跳包周期. 过长会导致掉线.\n     * 该值会在登录时根据服务器下发的配置自动进行更新.\n     * @since 2.6\n     * @see heartbeatStrategy\n     */\n    public var statHeartbeatPeriodMillis: Long = 300.secondsToMillis\n\n    /**\n     * 心跳策略.\n     * @since 2.6.3\n     */\n    public var heartbeatStrategy: HeartbeatStrategy = HeartbeatStrategy.STAT_HB\n\n    /**\n     * 心跳策略.\n     * @since 2.6.3\n     */\n    public enum class HeartbeatStrategy { // IN ACTUAL DECLARATION DO NOT ADD EXTRA ELEMENTS.\n        /**\n         * 使用 2.6.0 增加的*状态心跳* (Stat Heartbeat). 通常推荐这个模式.\n         *\n         * 该模式大多数情况下更稳定. 但有些账号使用这个模式时会遇到一段时间后发送消息成功但客户端不可见的问题.\n         */\n        STAT_HB,\n\n        /**\n         * 不发送状态心跳, 而是发送*切换在线状态* (可能会导致频繁的好友或客户端上线提示, 也可能产生短暂 (几秒) 发送消息不可见的问题).\n         *\n         * 建议在 [STAT_HB] 不可用时使用 [REGISTER].\n         */\n        REGISTER,\n\n        /**\n         * 不主动维护会话. 多数账号会每 16 分钟掉线然后重连. 则会有短暂的不可用时间.\n         *\n         * 仅当 [STAT_HB] 和 [REGISTER] 都造成无法接收等问题时使用.\n         * 同时请在 [https://github.com/mamoe/mirai/issues/1209] 提交问题.\n         */\n        NONE;\n    }\n\n    /**\n     * 每次心跳时等待结果的时间.\n     * 一旦心跳超时, 整个网络服务将会重启 (将消耗约 1s). 除正在进行的任务 (如图片上传) 会被中断外, 事件和插件均不受影响.\n     */\n    public var heartbeatTimeoutMillis: Long = 5.secondsToMillis\n\n    /** 心跳失败后的第一次重连前的等待时间. */\n    @Deprecated(\n        \"Useless since new network. Please just remove this.\",\n        level = DeprecationLevel.HIDDEN\n    ) // deprecated since 2.7, error since 2.8\n    @DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.8\", hiddenSince = \"2.10\")\n    public var firstReconnectDelayMillis: Long = 5.secondsToMillis\n\n    /** 重连失败后, 继续尝试的每次等待时间 */\n    @Deprecated(\n        \"Useless since new network. Please just remove this.\",\n        level = DeprecationLevel.HIDDEN\n    ) // deprecated since 2.7, error since 2.8\n    @DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.8\", hiddenSince = \"2.10\")\n    public var reconnectPeriodMillis: Long = 5.secondsToMillis\n\n    /** 最多尝试多少次重连 */\n    public var reconnectionRetryTimes: Int = Int.MAX_VALUE\n\n    /**\n     * 在被挤下线时 ([BotOfflineEvent.Force]) 自动重连. 默认为 `false`.\n     *\n     * 其他情况掉线都默认会自动重连, 详见 [BotOfflineEvent.reconnect]\n     *\n     * @since 2.1\n     */\n    public var autoReconnectOnForceOffline: Boolean = false\n\n    /**\n     * 验证码处理器\n     *\n     * - 在 Android 需要手动提供 [LoginSolver]\n     * - 在 JVM, Mirai 会根据环境支持情况选择 Swing/CLI 实现\n     *\n     * 详见 [LoginSolver.Default]\n     *\n     * @see LoginSolver\n     */\n    public var loginSolver: LoginSolver? = LoginSolver.Default\n\n    /** 使用协议类型 */\n    public var protocol: MiraiProtocol = MiraiProtocol.ANDROID_PHONE\n\n    public enum class MiraiProtocol {\n        /**\n         * Android 手机. 所有功能都支持.\n         */\n        ANDROID_PHONE,\n\n        /**\n         * Android 平板.\n         */\n        ANDROID_PAD,\n\n        /**\n         * Android 手表.\n         *\n         * 注意:\n         * - 不支持戳一戳事件解析\n         * - 由于该协议的省电特性, 当群被设置为不提醒的的时候, 服务器不会推送消息.\n         */\n        ANDROID_WATCH,\n\n        /**\n         * iPad - 来自MiraiGo\n         *\n         * @since 2.8\n         */\n        IPAD,\n\n        /**\n         * MacOS - 来自MiraiGo\n         *\n         * @since 2.8\n         */\n        MACOS,\n        ;\n\n        /**\n         * 当前协议是否支持[二维码登录][BotAuthorization.byQRCode]\n         *\n         * @since 2.15.0\n         */\n        public val isQRLoginSupported: Boolean get() = data.isQRLoginSupported\n\n        /**\n         * 当前协议是否支持[戳一戳][Bot.nudge]\n         *\n         * @since 2.16.0\n         */\n        public val isNudgeSupported: Boolean get() = data.isNudgeSupported\n\n        private inline val data: InternalProtocolDataExchange.InternalProtocolData\n            get() = InternalProtocolDataExchange.instance.of(\n                this\n            )\n    }\n\n    /**\n     * Highway 通道上传图片, 语音, 文件等资源时的协程数量.\n     *\n     * 每个协程的速度约为 200KB/s. 协程数量越多越快, 同时也更要求性能.\n     * 默认为 CPU 核心数.\n     *\n     * @since 2.2\n     */\n    public var highwayUploadCoroutineCount: Int = availableProcessors()\n\n    /**\n     * 设置 [autoReconnectOnForceOffline] 为 `true`, 即在被挤下线时自动重连.\n     * @since 2.1\n     */\n    @ConfigurationDsl\n    public fun autoReconnectOnForceOffline() {\n        autoReconnectOnForceOffline = true\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Device\n    ///////////////////////////////////////////////////////////////////////////\n\n    @JvmField\n    internal var accountSecrets: Boolean = true\n\n    /**\n     * 禁止保存 `account.secrets`.\n     *\n     * `account.secrets` 保存账号的会话信息。\n     * 它可加速登录过程，也可能可以减少出现验证码的次数。如果遇到一段时间后无法接收消息通知等同步问题时可尝试禁用。\n     *\n     * @since 2.11\n     */\n    public fun disableAccountSecretes() {\n        accountSecrets = false\n    }\n\n    /**\n     * 设备信息覆盖. 在没有手动指定时将会通过日志警告, 并使用随机设备信息.\n     * @see fileBasedDeviceInfo 使用指定文件存储设备信息\n     * @see randomDeviceInfo 使用随机设备信息\n     */\n    public final override var deviceInfo: ((Bot) -> DeviceInfo)? = deviceInfoStub // allows user to set `null` manually.\n\n    /**\n     * 使用随机设备信息.\n     *\n     * @see deviceInfo\n     */\n    @ConfigurationDsl\n    public fun randomDeviceInfo() {\n        deviceInfo = null\n    }\n\n    /**\n     * 使用特定由 [DeviceInfo] 序列化产生的 JSON 的设备信息\n     *\n     * @see deviceInfo\n     */\n    @ConfigurationDsl\n    public fun loadDeviceInfoJson(json: String) {\n        deviceInfo = {\n            DeviceInfoManager.deserialize(json, Companion.json)\n        }\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Logging\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 日志记录器\n     *\n     * - 默认打印到标准输出, 通过 [MiraiLogger.Factory.create]\n     * - 忽略所有日志: [noBotLog]\n     * - 重定向到一个目录: `botLoggerSupplier = { DirectoryLogger(\"Bot ${it.id}\") }`\n     * - 重定向到一个文件: `botLoggerSupplier = { SingleFileLogger(\"Bot ${it.id}\") }`\n     *\n     * @see MiraiLogger\n     */\n    public final override var botLoggerSupplier: ((Bot) -> MiraiLogger) = {\n        MiraiLogger.Factory.create(Bot::class, \"Bot ${it.id}\")\n    }\n\n    /**\n     * 网络层日志构造器\n     *\n     * - 默认打印到标准输出, 通过 [MiraiLogger.Factory.create]\n     * - 忽略所有日志: [noNetworkLog]\n     * - 重定向到一个目录: `networkLoggerSupplier = { DirectoryLogger(\"Net ${it.id}\") }`\n     * - 重定向到一个文件: `networkLoggerSupplier = { SingleFileLogger(\"Net ${it.id}\") }`\n     *\n     * @see MiraiLogger\n     */\n    public final override var networkLoggerSupplier: ((Bot) -> MiraiLogger) = {\n        MiraiLogger.Factory.create(Bot::class, \"Net ${it.id}\")\n    }\n\n    /**\n     * 不显示网络日志. 不推荐.\n     * @see networkLoggerSupplier 更多日志处理方式\n     */\n    @ConfigurationDsl\n    public fun noNetworkLog() {\n        networkLoggerSupplier = { _ -> SilentLogger }\n    }\n\n\n    /**\n     * 不显示 [Bot] 日志. 不推荐.\n     * @see botLoggerSupplier 更多日志处理方式\n     */\n    @ConfigurationDsl\n    public fun noBotLog() {\n        botLoggerSupplier = { _ -> SilentLogger }\n    }\n\n\n    /**\n     * 是否显示过于冗长的事件日志\n     *\n     * 默认为 `false`\n     *\n     * @since 2.8\n     */\n    public var isShowingVerboseEventLog: Boolean = false\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Cache\n    //////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 联系人信息缓存配置. 将会保存在 `cacheDir` 中 `contacts` 目录\n     * @since 2.4\n     */\n    public var contactListCache: ContactListCache = ContactListCache()\n\n    /**\n     * 联系人信息缓存配置\n     * @see contactListCache\n     * @see enableContactCache\n     * @see disableContactCache\n     * @since 2.4\n     */\n    public class ContactListCache {\n        /**\n         * 在有修改时自动保存间隔. 默认 60 秒. 在每次登录完成后有修改时都会立即保存一次.\n         */\n        public var saveIntervalMillis: Long = 60_000\n\n        /**\n         * 在有修改时自动保存间隔. 默认 60 秒. 在每次登录完成后有修改时都会立即保存一次.\n         */ // was @ExperimentalTime before 2.9\n        public inline var saveInterval: Duration\n            @JvmSynthetic inline get() = saveIntervalMillis.milliseconds\n            @JvmSynthetic inline set(v) {\n                saveIntervalMillis = v.inWholeMilliseconds\n            }\n\n        /**\n         * 开启好友列表缓存.\n         */\n        public var friendListCacheEnabled: Boolean = false\n\n        /**\n         * 开启群成员列表缓存.\n         */\n        public var groupMemberListCacheEnabled: Boolean = false\n    }\n\n\n    /**\n     * 配置 [ContactListCache]\n     * ```\n     * contactListCache {\n     *     saveIntervalMillis = 30_000\n     *     friendListCacheEnabled = true\n     * }\n     * ```\n     * @since 2.4\n     */\n    @JvmSynthetic\n    public inline fun contactListCache(action: ContactListCache.() -> Unit) {\n        action.invoke(this.contactListCache)\n    }\n\n    /**\n     * 禁用好友列表和群成员列表的缓存.\n     * @since 2.4\n     */\n    @ConfigurationDsl\n    public fun disableContactCache() {\n        contactListCache.friendListCacheEnabled = false\n        contactListCache.groupMemberListCacheEnabled = false\n    }\n\n\n    /**\n     * 启用好友列表和群成员列表的缓存.\n     * @since 2.4\n     */\n    @ConfigurationDsl\n    public fun enableContactCache() {\n        contactListCache.friendListCacheEnabled = true\n        contactListCache.groupMemberListCacheEnabled = true\n    }\n\n\n    /**\n     * 登录缓存.\n     *\n     * 开始后在密码登录成功时会保存秘钥等信息, 在下次启动时通过这些信息登录, 而不提交密码.\n     * 可以减少验证码出现的频率.\n     *\n     * 秘钥信息会由密码加密保存. 如果秘钥过期, 则会进行普通密码登录.\n     *\n     * 默认 `true` (开启).\n     *\n     * @since 2.6\n     */\n    public var loginCacheEnabled: Boolean = true\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Misc\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Suppress(\"DuplicatedCode\")\n    public fun copy(): BotConfiguration {\n        return BotConfiguration().also { new ->\n            // To structural order\n            new.parentCoroutineContext = parentCoroutineContext\n            new.heartbeatPeriodMillis = heartbeatPeriodMillis\n            new.heartbeatTimeoutMillis = heartbeatTimeoutMillis\n            new.statHeartbeatPeriodMillis = statHeartbeatPeriodMillis\n            new.heartbeatStrategy = heartbeatStrategy\n            new.reconnectionRetryTimes = reconnectionRetryTimes\n            new.autoReconnectOnForceOffline = autoReconnectOnForceOffline\n            new.loginSolver = loginSolver\n            new.protocol = protocol\n            new.highwayUploadCoroutineCount = highwayUploadCoroutineCount\n            new.accountSecrets = accountSecrets\n            new.deviceInfo = deviceInfo\n            new.botLoggerSupplier = botLoggerSupplier\n            new.networkLoggerSupplier = networkLoggerSupplier\n            new.contactListCache = contactListCache\n            new.convertLineSeparator = convertLineSeparator\n            new.isShowingVerboseEventLog = isShowingVerboseEventLog\n\n            applyMppCopy(new)\n        }\n    }\n\n    /**\n     * 是否处理接受到的特殊换行符, 默认为 `true`\n     *\n     * - 若为 `true`, 会将收到的 `CRLF(\\r\\n)` 和 `CR(\\r)` 替换为 `LF(\\n)`\n     * - 若为 `false`, 则不做处理\n     *\n     * @since 2.4\n     */\n    @get:JvmName(\"isConvertLineSeparator\")\n    public var convertLineSeparator: Boolean = true\n\n    /** 标注一个配置 DSL 函数 */\n    @Target(AnnotationTarget.FUNCTION)\n    @DslMarker\n    public annotation class ConfigurationDsl\n\n    public companion object {\n        /** 默认的配置实例. 可以进行修改 */\n        @JvmStatic\n        public val Default: BotConfiguration = BotConfiguration()\n\n        /**\n         * Json 序列化器, 使用 'kotlinx.serialization'\n         */\n        internal val json: Json = kotlin.runCatching {\n            Json {\n                isLenient = true\n                ignoreUnknownKeys = true\n                prettyPrint = true\n            }\n        }.getOrElse {\n            @Suppress(\"JSON_FORMAT_REDUNDANT_DEFAULT\") // compatible for older versions\n            (Json {})\n        }\n    }\n}\n\n/**\n * 构建一个 [BotConfiguration].\n *\n * @see BotConfiguration\n * @since 2.3\n */\n@JvmSynthetic\npublic inline fun BotConfiguration(block: BotConfiguration.() -> Unit): BotConfiguration {\n    return BotConfiguration().apply(block)\n}\n\ninternal val deviceInfoStub: (Bot) -> DeviceInfo = {\n    logger.warning(\"未指定设备信息, 已使用随机设备信息. 请查看 BotConfiguration.deviceInfo 以获取更多信息.\")\n    logger.warning(\"Device info isn't specified. Please refer to BotConfiguration.deviceInfo for more information\")\n    DeviceInfo.random()\n}\n\nprivate val logger by lazy {\n    MiraiLogger.Factory.create(BotConfiguration::class)\n}\n\n/** @since 2.15.0 */\n@MiraiInternalApi\npublic interface InternalProtocolDataExchange {\n    @MiraiInternalApi\n    public interface InternalProtocolData {\n        public val isQRLoginSupported: Boolean\n        public val isNudgeSupported: Boolean\n        public val mainVersion: String\n        public val buildVersion: String\n        public val sdkVersion: String\n    }\n\n    @MiraiInternalApi\n    public fun of(protocol: BotConfiguration.MiraiProtocol): InternalProtocolData\n\n    @MiraiInternalApi\n    public companion object {\n        internal val instance by lazy {\n            Mirai // ensure service loaded\n\n            loadService(\n                InternalProtocolDataExchange::class,\n                \"net.mamoe.mirai.internal.utils.MiraiProtocolInternal\\$Exchange\"\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/utils/DeviceInfo.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"MemberVisibilityCanBePrivate\")\n\npackage net.mamoe.mirai.utils\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.Transient\nimport kotlinx.serialization.json.Json\nimport kotlinx.serialization.protobuf.ProtoBuf\nimport kotlinx.serialization.protobuf.ProtoNumber\nimport java.io.File\nimport kotlin.random.Random\n\ninternal const val DeviceInfoConstructorDeprecationMessage =\n    \"DeviceInfo 构造器将会在未来删除. \" +\n            \"这是因为构造器导致维护变得十分困难. \" +\n            \"若要构造 DeviceInfo 实例, 请使用 DeviceInfoBuilder.\" +\n            \"若要序列化, 请使用 DeviceInfo.serializeToString 和 DeviceInfo.deserializeFromString.\"\n\ninternal const val DeviceInfoConstructorReplaceWith = \"DeviceInfoBuilder.create()\" +\n        \".display(display)\" +\n        \".product(product)\" +\n        \".device(device)\" +\n        \".board(board)\" +\n        \".brand(brand)\" +\n        \".model(model)\" +\n        \".bootloader(bootloader)\" +\n        \".fingerprint(fingerprint)\" +\n        \".bootId(bootId)\" +\n        \".procVersion(procVersion)\" +\n        \".baseBand(baseBand)\" +\n        \".version(version)\" +\n        \".simInfo(simInfo)\" +\n        \".osType(osType)\" +\n        \".macAddress(macAddress)\" +\n        \".wifiBSSID(wifiBSSID)\" +\n        \".wifiSSID(wifiSSID)\" +\n        \".imsiMd5(imsiMd5)\" +\n        \".imei(imei)\" +\n        \".apn(apn)\" +\n        \".androidId(androidId)\" +\n        \".build()\"\n\n/**\n * 表示设备信息\n * @see DeviceInfoBuilder\n */\n@Serializable(DeviceInfoV1LegacySerializer::class)\npublic class DeviceInfo\n@Deprecated(\n    DeviceInfoConstructorDeprecationMessage,\n    level = DeprecationLevel.WARNING,\n    replaceWith = ReplaceWith(\n        DeviceInfoConstructorReplaceWith,\n        \"net.mamoe.mirai.utils.DeviceInfoBuilder\"\n    )\n)\n@DeprecatedSinceMirai(warningSince = \"2.15\") // planned internal\npublic constructor(\n    public val display: ByteArray,\n    public val product: ByteArray,\n    public val device: ByteArray,\n    public val board: ByteArray,\n    public val brand: ByteArray,\n    public val model: ByteArray,\n    public val bootloader: ByteArray,\n    public val fingerprint: ByteArray,\n    public val bootId: ByteArray,\n    public val procVersion: ByteArray,\n    public val baseBand: ByteArray,\n    public val version: Version,\n    public val simInfo: ByteArray,\n    public val osType: ByteArray,\n    public val macAddress: ByteArray,\n    public val wifiBSSID: ByteArray,\n    public val wifiSSID: ByteArray,\n    public val imsiMd5: ByteArray,\n    public val imei: String,\n    public val apn: ByteArray,\n    public val androidId: ByteArray,\n) {\n    @Deprecated(\n        DeviceInfoConstructorDeprecationMessage,\n        replaceWith = ReplaceWith(\n            \"net.mamoe.mirai.utils.DeviceInfo(display, product, device, board, brand, model, \" +\n                    \"bootloader, fingerprint, bootId, procVersion, baseBand, version, simInfo, osType, \" +\n                    \"macAddress, wifiBSSID, wifiSSID, imsiMd5, imei, apn, androidId)\"\n        ),\n        level = DeprecationLevel.WARNING\n    )\n    @DeprecatedSinceMirai(warningSince = \"2.15\")\n    @Suppress(\"DEPRECATION\", \"DEPRECATION_ERROR\")\n    public constructor(\n        display: ByteArray,\n        product: ByteArray,\n        device: ByteArray,\n        board: ByteArray,\n        brand: ByteArray,\n        model: ByteArray,\n        bootloader: ByteArray,\n        fingerprint: ByteArray,\n        bootId: ByteArray,\n        procVersion: ByteArray,\n        baseBand: ByteArray,\n        version: Version,\n        simInfo: ByteArray,\n        osType: ByteArray,\n        macAddress: ByteArray,\n        wifiBSSID: ByteArray,\n        wifiSSID: ByteArray,\n        imsiMd5: ByteArray,\n        imei: String,\n        apn: ByteArray\n    ) : this(\n        display, product, device, board, brand, model, bootloader,\n        fingerprint, bootId, procVersion, baseBand, version, simInfo,\n        osType, macAddress, wifiBSSID, wifiSSID, imsiMd5, imei, apn,\n        androidId = display\n    )\n\n    public val ipAddress: ByteArray get() = byteArrayOf(192.toByte(), 168.toByte(), 1, 123)\n\n    init {\n        require(imsiMd5.size == 16) { \"Bad `imsiMd5.size`. Required 16, given ${imsiMd5.size}.\" }\n    }\n\n    @Transient\n    @MiraiInternalApi\n    public val guid: ByteArray = generateGuid(androidId, macAddress)\n\n    @Serializable\n    public class Version(\n        public val incremental: ByteArray = \"5891938\".toByteArray(),\n        public val release: ByteArray = \"10\".toByteArray(),\n        public val codename: ByteArray = \"REL\".toByteArray(),\n        public val sdk: Int = 29\n    ) {\n        /**\n         * @since 2.9\n         */\n        override fun equals(other: Any?): Boolean {\n            if (this === other) return true\n            if (other !is Version) return false\n\n            if (!incremental.contentEquals(other.incremental)) return false\n            if (!release.contentEquals(other.release)) return false\n            if (!codename.contentEquals(other.codename)) return false\n            return sdk == other.sdk\n        }\n\n        /**\n         * @since 2.9\n         */\n        override fun hashCode(): Int {\n            var result = incremental.contentHashCode()\n            result = 31 * result + release.contentHashCode()\n            result = 31 * result + codename.contentHashCode()\n            result = 31 * result + sdk\n            return result\n        }\n    }\n\n    public companion object {\n        internal val logger = MiraiLogger.Factory.create(DeviceInfo::class, \"DeviceInfo\")\n\n        /**\n         * 加载一个设备信息. 若文件不存在或为空则随机并创建一个设备信息保存.\n         */\n        @JvmOverloads\n        @JvmStatic\n        @JvmName(\"from\")\n        public fun File.loadAsDeviceInfo(\n            json: Json = DeviceInfoManager.format\n        ): DeviceInfo {\n            if (!this.exists() || this.length() == 0L) {\n                return random().also {\n                    this.writeText(DeviceInfoManager.serialize(it, json))\n                }\n            }\n            return DeviceInfoManager.deserialize(this.readText(), json) upg@{ upg ->\n                if (!this.canWrite()) {\n                    logger.warning(\"Device info file $this is not writable, failed to upgrade legacy device info.\")\n                    return@upg\n                }\n                try {\n                    this.writeText(DeviceInfoManager.serialize(upg, json))\n                } catch (ex: SecurityException) {\n                    logger.warning(\"Device info file $this is not writable, failed to upgrade legacy device info.\", ex)\n                }\n            }\n        }\n\n        /**\n         * 生成随机 [DeviceInfo]\n         *\n         * @see DeviceInfoBuilder\n         * @since 2.0\n         */\n        @JvmStatic\n        public fun random(): DeviceInfo = random(Random.Default)\n\n        /**\n         * 使用特定随机数生成器生成 [DeviceInfo]\n         *\n         * @see DeviceInfoBuilder\n         * @since 2.9\n         */\n        @JvmStatic\n        public fun random(random: Random): DeviceInfo {\n            return DeviceInfoCommonImpl.randomDeviceInfo(random)\n        }\n\n        /**\n         * 将此 [DeviceInfo] 序列化为字符串. 序列化的字符串可以在以后通过 [DeviceInfo.deserializeFromString] 反序列化为 [DeviceInfo].\n         *\n         * 序列化的字符串有兼容性保证, 在旧版 mirai 序列化的字符串, 可以在新版 mirai 使用. 但新版 mirai 序列化的字符串不一定能在旧版使用.\n         *\n         * @since 2.15\n         */\n        @JvmStatic\n        public fun serializeToString(deviceInfo: DeviceInfo): String = DeviceInfoManager.serialize(deviceInfo)\n\n        /**\n         * 将通过 [serializeToString] 序列化得到的字符串反序列化为 [DeviceInfo].\n         * 此函数兼容旧版 mirai 序列化的字符串.\n         * @since 2.15\n         */\n        @JvmStatic\n        public fun deserializeFromString(string: String): DeviceInfo = DeviceInfoManager.deserialize(string)\n    }\n\n    /**\n     * @since 2.9\n     */\n    @Suppress(\"DuplicatedCode\")\n    override fun equals(other: Any?): Boolean {\n        return DeviceInfoCommonImpl.equalsImpl(this, other)\n    }\n\n\n    /**\n     * @since 2.9\n     */\n    override fun hashCode(): Int {\n        return DeviceInfoCommonImpl.hashCodeImpl(this)\n    }\n\n    @Suppress(\"ClassName\")\n    @Deprecated(\"For binary compatibility\", level = DeprecationLevel.HIDDEN)\n    public object `$serializer` : KSerializer<DeviceInfo> by DeviceInfoV1LegacySerializer\n}\n\n/**\n * 将此 [DeviceInfo] 序列化为字符串. 序列化的字符串可以在以后通过 [DeviceInfo.deserializeFromString] 反序列化为 [DeviceInfo].\n *\n * 序列化的字符串有兼容性保证, 在旧版 mirai 序列化的字符串, 可以在新版 mirai 使用. 但新版 mirai 序列化的字符串不一定能在旧版使用.\n *\n * @since 2.15\n */\n@JvmSynthetic\npublic fun DeviceInfo.serializeToString(): String = DeviceInfo.serializeToString(this)\n\n@Serializable\nprivate class DevInfo @OptIn(ExperimentalSerializationApi::class) constructor(\n    @ProtoNumber(1) val bootloader: ByteArray,\n    @ProtoNumber(2) val procVersion: ByteArray,\n    @ProtoNumber(3) val codename: ByteArray,\n    @ProtoNumber(4) val incremental: ByteArray,\n    @ProtoNumber(5) val fingerprint: ByteArray,\n    @ProtoNumber(6) val bootId: ByteArray,\n    @ProtoNumber(7) val androidId: ByteArray,\n    @ProtoNumber(8) val baseBand: ByteArray,\n    @ProtoNumber(9) val innerVersion: ByteArray\n)\n\n/**\n * 不要使用这个 API, 此 API 在未来可能会被删除\n */\n@OptIn(ExperimentalSerializationApi::class)\npublic fun DeviceInfo.generateDeviceInfoData(): ByteArray { // ?? why is this public?\n\n    return ProtoBuf.encodeToByteArray(\n        DevInfo.serializer(), DevInfo(\n            bootloader,\n            procVersion,\n            version.codename,\n            version.incremental,\n            fingerprint,\n            bootId,\n            androidId,\n            baseBand,\n            version.incremental\n        )\n    )\n}\n\n/**\n * Defaults \"%4;7t>;28<fc.5*6\".toByteArray()\n */\ninternal fun generateGuid(androidId: ByteArray, macAddress: ByteArray): ByteArray =\n    (androidId + macAddress).md5()\n\n\n/*\nfun DeviceInfo.toOidb0x769DeviceInfo() : Oidb0x769.DeviceInfo = Oidb0x769.DeviceInfo(\n    brand = brand.encodeToString(),\n    model = model.encodeToString(),\n    os = Oidb0x769.OS(\n        version = version.release.encodeToString(),\n        sdk = version.sdk.toString(),\n        kernel = version.kernel\n    )\n)\n*/\n\n/**\n * @see DeviceInfoManager\n */\ninternal object DeviceInfoCommonImpl {\n    @Suppress(\"DEPRECATION\")\n    fun randomDeviceInfo(random: Random) = DeviceInfo(\n        display = \"MIRAI.${getRandomString(6, '0'..'9', random)}.001\".toByteArray(),\n        product = \"mirai\".toByteArray(),\n        device = \"mirai\".toByteArray(),\n        board = \"mirai\".toByteArray(),\n        brand = \"mamoe\".toByteArray(),\n        model = \"mirai\".toByteArray(),\n        bootloader = \"unknown\".toByteArray(),\n        fingerprint = \"mamoe/mirai/mirai:10/MIRAI.200122.001/${\n            getRandomIntString(7, random)\n        }:user/release-keys\".toByteArray(),\n        bootId = generateUUID(getRandomByteArray(16, random).md5()).toByteArray(),\n        procVersion = \"Linux version 3.0.31-${\n            getRandomString(8, random)\n        } (android-build@xxx.xxx.xxx.xxx.com)\".toByteArray(),\n        baseBand = byteArrayOf(),\n        version = DeviceInfo.Version(),\n        simInfo = \"T-Mobile\".toByteArray(),\n        osType = \"android\".toByteArray(),\n        macAddress = \"02:00:00:00:00:00\".toByteArray(),\n        wifiBSSID = \"02:00:00:00:00:00\".toByteArray(),\n        wifiSSID = \"<unknown ssid>\".toByteArray(),\n        imsiMd5 = getRandomByteArray(16, random).md5(),\n        imei = \"86${getRandomIntString(12, random)}\".let { it + luhn(it) },\n        apn = \"wifi\".toByteArray(),\n        androidId = getRandomByteArray(8, random).toUHexString(\"\").lowercase().encodeToByteArray()\n    )\n\n    /**\n     * 计算 imei 校验位\n     */\n    private fun luhn(imei: String): Int {\n        var odd = false\n        val zero = '0'\n        val sum = imei.sumOf { char ->\n            odd = !odd\n            if (odd) {\n                char.code - zero.code\n            } else {\n                val s = (char.code - zero.code) * 2\n                s % 10 + s / 10\n            }\n        }\n        return (10 - sum % 10) % 10\n    }\n\n\n    @OptIn(MiraiInternalApi::class)\n    @Suppress(\"DuplicatedCode\")\n    fun equalsImpl(deviceInfo: DeviceInfo, other: Any?): Boolean = deviceInfo.run {\n        if (deviceInfo === other) return true\n        if (!isSameType(this, other)) return false\n\n        // also remember to add equal compare to JvmDeviceInfoTest.`can read legacy v1`\n        // when adding new field compare here.\n        if (!display.contentEquals(other.display)) return false\n        if (!product.contentEquals(other.product)) return false\n        if (!device.contentEquals(other.device)) return false\n        if (!board.contentEquals(other.board)) return false\n        if (!brand.contentEquals(other.brand)) return false\n        if (!model.contentEquals(other.model)) return false\n        if (!bootloader.contentEquals(other.bootloader)) return false\n        if (!fingerprint.contentEquals(other.fingerprint)) return false\n        if (!bootId.contentEquals(other.bootId)) return false\n        if (!procVersion.contentEquals(other.procVersion)) return false\n        if (!baseBand.contentEquals(other.baseBand)) return false\n        if (version != other.version) return false\n        if (!simInfo.contentEquals(other.simInfo)) return false\n        if (!osType.contentEquals(other.osType)) return false\n        if (!macAddress.contentEquals(other.macAddress)) return false\n        if (!wifiBSSID.contentEquals(other.wifiBSSID)) return false\n        if (!wifiSSID.contentEquals(other.wifiSSID)) return false\n        if (!imsiMd5.contentEquals(other.imsiMd5)) return false\n        if (imei != other.imei) return false\n        if (!apn.contentEquals(other.apn)) return false\n        if (!guid.contentEquals(other.guid)) return false\n        return androidId.contentEquals(other.androidId)\n    }\n\n    @OptIn(MiraiInternalApi::class)\n    @Suppress(\"DuplicatedCode\")\n    fun hashCodeImpl(deviceInfo: DeviceInfo): Int = deviceInfo.run {\n        var result = display.contentHashCode()\n        result = 31 * result + product.contentHashCode()\n        result = 31 * result + device.contentHashCode()\n        result = 31 * result + board.contentHashCode()\n        result = 31 * result + brand.contentHashCode()\n        result = 31 * result + model.contentHashCode()\n        result = 31 * result + bootloader.contentHashCode()\n        result = 31 * result + fingerprint.contentHashCode()\n        result = 31 * result + bootId.contentHashCode()\n        result = 31 * result + procVersion.contentHashCode()\n        result = 31 * result + baseBand.contentHashCode()\n        result = 31 * result + version.hashCode()\n        result = 31 * result + simInfo.contentHashCode()\n        result = 31 * result + osType.contentHashCode()\n        result = 31 * result + macAddress.contentHashCode()\n        result = 31 * result + wifiBSSID.contentHashCode()\n        result = 31 * result + wifiSSID.contentHashCode()\n        result = 31 * result + imsiMd5.contentHashCode()\n        result = 31 * result + imei.hashCode()\n        result = 31 * result + apn.contentHashCode()\n        result = 31 * result + guid.contentHashCode()\n        result = 31 * result + androidId.contentHashCode()\n        return result\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/utils/DeviceInfoBuilder.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport net.mamoe.mirai.utils.DeviceInfoBuilder.Companion.fromPrototype\nimport net.mamoe.mirai.utils.DeviceInfoBuilder.Companion.fromRandom\nimport kotlin.jvm.JvmOverloads\nimport kotlin.jvm.JvmStatic\nimport kotlin.random.Random\n\n/**\n * [DeviceInfo] 的构建器.\n *\n * 通过 [fromPrototype] 或 [fromRandom] 可以构造一个构建器, 调用其各属性方法后使用 [build] 即可构建实例.\n *\n * @see build\n *\n * @since 2.15\n */\npublic class DeviceInfoBuilder internal constructor(\n    private val prototype: DeviceInfo = DeviceInfo.random()\n) {\n    private var display: ByteArray? = null\n    public fun display(value: ByteArray): DeviceInfoBuilder = apply {\n        this.display = value\n    }\n\n    public fun display(value: String): DeviceInfoBuilder = apply {\n        this.display = value.encodeToByteArray()\n    }\n\n    private var product: ByteArray? = prototype.product\n    public fun product(value: ByteArray): DeviceInfoBuilder = apply {\n        this.product = value\n    }\n\n    public fun product(value: String): DeviceInfoBuilder = apply {\n        this.product = value.encodeToByteArray()\n    }\n\n    private var device: ByteArray? = null\n    public fun device(value: ByteArray): DeviceInfoBuilder = apply {\n        this.device = value\n    }\n\n    public fun device(value: String): DeviceInfoBuilder = apply {\n        this.device = value.encodeToByteArray()\n    }\n\n    private var board: ByteArray? = null\n    public fun board(value: ByteArray): DeviceInfoBuilder = apply {\n        this.board = value\n    }\n\n    public fun board(value: String): DeviceInfoBuilder = apply {\n        this.board = value.encodeToByteArray()\n    }\n\n    private var brand: ByteArray? = null\n    public fun brand(value: ByteArray): DeviceInfoBuilder = apply {\n        this.brand = value\n    }\n\n    public fun brand(value: String): DeviceInfoBuilder = apply {\n        this.brand = value.encodeToByteArray()\n    }\n\n    private var model: ByteArray? = null\n    public fun model(value: ByteArray): DeviceInfoBuilder = apply {\n        this.model = value\n    }\n\n    public fun model(value: String): DeviceInfoBuilder = apply {\n        this.model = value.encodeToByteArray()\n    }\n\n    private var bootloader: ByteArray? = null\n    public fun bootloader(value: ByteArray): DeviceInfoBuilder = apply {\n        this.bootloader = value\n    }\n\n    public fun bootloader(value: String): DeviceInfoBuilder = apply {\n        this.bootloader = value.encodeToByteArray()\n    }\n\n    private var fingerprint: ByteArray? = null\n    public fun fingerprint(value: ByteArray): DeviceInfoBuilder = apply {\n        this.fingerprint = value\n    }\n\n    public fun fingerprint(value: String): DeviceInfoBuilder = apply {\n        this.fingerprint = value.encodeToByteArray()\n    }\n\n    private var bootId: ByteArray? = null\n    public fun bootId(value: ByteArray): DeviceInfoBuilder = apply {\n        this.bootId = value\n    }\n\n    public fun bootId(value: String): DeviceInfoBuilder = apply {\n        this.bootId = value.encodeToByteArray()\n    }\n\n    private var procVersion: ByteArray? = null\n    public fun procVersion(value: ByteArray): DeviceInfoBuilder = apply {\n        this.procVersion = value\n    }\n\n    public fun procVersion(value: String): DeviceInfoBuilder = apply {\n        this.procVersion = value.encodeToByteArray()\n    }\n\n    private var baseBand: ByteArray? = null\n    public fun baseBand(value: ByteArray): DeviceInfoBuilder = apply {\n        this.baseBand = value\n    }\n\n    public fun baseBand(value: String): DeviceInfoBuilder = apply {\n        this.baseBand = value.encodeToByteArray()\n    }\n\n    private var version: DeviceInfo.Version? = null\n    public fun version(value: DeviceInfo.Version): DeviceInfoBuilder = apply {\n        this.version = value\n    }\n\n    private var simInfo: ByteArray? = null\n    public fun simInfo(value: ByteArray): DeviceInfoBuilder = apply {\n        this.simInfo = value\n    }\n\n    public fun simInfo(value: String): DeviceInfoBuilder = apply {\n        this.simInfo = value.encodeToByteArray()\n    }\n\n    private var osType: ByteArray? = null\n    public fun osType(value: ByteArray): DeviceInfoBuilder = apply {\n        this.osType = value\n    }\n\n    public fun osType(value: String): DeviceInfoBuilder = apply {\n        this.osType = value.encodeToByteArray()\n    }\n\n    private var macAddress: ByteArray? = null\n    public fun macAddress(value: ByteArray): DeviceInfoBuilder = apply {\n        this.macAddress = value\n    }\n\n    public fun macAddress(value: String): DeviceInfoBuilder = apply {\n        this.macAddress = value.encodeToByteArray()\n    }\n\n    private var wifiBSSID: ByteArray? = null\n    public fun wifiBSSID(value: ByteArray): DeviceInfoBuilder = apply {\n        this.wifiBSSID = value\n    }\n\n    public fun wifiBSSID(value: String): DeviceInfoBuilder = apply {\n        this.wifiBSSID = value.encodeToByteArray()\n    }\n\n    private var wifiSSID: ByteArray? = null\n    public fun wifiSSID(value: ByteArray): DeviceInfoBuilder = apply {\n        this.wifiSSID = value\n    }\n\n    public fun wifiSSID(value: String): DeviceInfoBuilder = apply {\n        this.wifiSSID = value.encodeToByteArray()\n    }\n\n    private var imsiMd5: ByteArray? = null\n    public fun imsiMd5(value: ByteArray): DeviceInfoBuilder = apply {\n        this.imsiMd5 = value\n    }\n\n    public fun imsiMd5(value: String): DeviceInfoBuilder = apply {\n        this.imsiMd5 = value.encodeToByteArray()\n    }\n\n    private var imei: String? = null\n    public fun imei(value: String): DeviceInfoBuilder = apply {\n        this.imei = value\n    }\n\n\n    private var apn: ByteArray? = null\n    public fun apn(value: ByteArray): DeviceInfoBuilder = apply {\n        this.apn = value\n    }\n\n    public fun apn(value: String): DeviceInfoBuilder = apply {\n        this.apn = value.encodeToByteArray()\n    }\n\n    private var androidId: ByteArray? = null\n    public fun androidId(value: ByteArray): DeviceInfoBuilder = apply {\n        this.androidId = value\n    }\n\n    public fun androidId(value: String): DeviceInfoBuilder = apply {\n        this.androidId = value.encodeToByteArray()\n    }\n\n\n    public fun build(): DeviceInfo {\n        @Suppress(\"DEPRECATION\")\n        return DeviceInfo(\n            display = display ?: prototype.display.copyOf(),\n            product = product ?: prototype.product.copyOf(),\n            device = device ?: prototype.device.copyOf(),\n            board = board ?: prototype.board.copyOf(),\n            brand = brand ?: prototype.brand.copyOf(),\n            model = model ?: prototype.model.copyOf(),\n            bootloader = bootloader ?: prototype.bootloader.copyOf(),\n            fingerprint = fingerprint ?: prototype.fingerprint.copyOf(),\n            bootId = bootId ?: prototype.bootId.copyOf(),\n            procVersion = procVersion ?: prototype.procVersion.copyOf(),\n            baseBand = baseBand ?: prototype.baseBand.copyOf(),\n            version = version ?: prototype.version,\n            simInfo = simInfo ?: prototype.simInfo.copyOf(),\n            osType = osType ?: prototype.osType.copyOf(),\n            macAddress = macAddress ?: prototype.macAddress.copyOf(),\n            wifiBSSID = wifiBSSID ?: prototype.wifiBSSID.copyOf(),\n            wifiSSID = wifiSSID ?: prototype.wifiSSID.copyOf(),\n            imsiMd5 = imsiMd5 ?: prototype.imsiMd5.copyOf(),\n            imei = imei ?: prototype.imei,\n            apn = apn ?: prototype.apn.copyOf(),\n            androidId = androidId ?: prototype.androidId.copyOf(),\n        )\n    }\n\n    public companion object {\n        /**\n         * 构造一个以随机属性填充的 [DeviceInfoBuilder].\n         */\n        @JvmStatic\n        @JvmOverloads\n        public fun fromRandom(random: Random = Random.Default): DeviceInfoBuilder =\n            DeviceInfoBuilder(DeviceInfo.random(random))\n\n        /**\n         * 构造一个复制 [prototype] 属性的 [DeviceInfoBuilder].\n         */\n        @JvmStatic\n        public fun fromPrototype(prototype: DeviceInfo): DeviceInfoBuilder = DeviceInfoBuilder(prototype)\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/utils/DeviceInfoManager.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.builtins.serializer\nimport kotlinx.serialization.json.Json\nimport kotlinx.serialization.json.JsonElement\nimport kotlinx.serialization.json.jsonObject\nimport kotlinx.serialization.json.jsonPrimitive\nimport net.mamoe.mirai.utils.DeviceInfoManager.Version.Companion.trans\nimport kotlin.jvm.JvmInline\nimport kotlin.jvm.JvmName\n\ninternal object DeviceInfoManager {\n    sealed interface Info {\n        fun toDeviceInfo(): DeviceInfo\n    }\n\n    @Serializable(HexStringSerializer::class)\n    @JvmInline\n    value class HexString(\n        val data: ByteArray\n    )\n\n    object HexStringSerializer : KSerializer<HexString> by String.serializer().map(\n        String.serializer().descriptor.copy(\"HexString\"),\n        deserialize = {\n            HexString(it.hexToBytes())\n        },\n        serialize = { it.data.toUHexString(\"\").lowercase() }\n    )\n\n    // Note: property names must be kept intact during obfuscation process if applied.\n    @Serializable\n    class Wrapper<T : Info>(\n        @Suppress(\"unused\") val deviceInfoVersion: Int, // used by plain jsonObject\n        val data: T\n    )\n\n    internal object DeviceInfoVersionSerializer : KSerializer<DeviceInfo.Version> by SerialData.serializer().map(\n        resultantDescriptor = SerialData.serializer().descriptor,\n        deserialize = {\n            DeviceInfo.Version(incremental, release, codename, sdk)\n        },\n        serialize = {\n            SerialData(incremental, release, codename, sdk)\n        }\n    ) {\n        @SerialName(\"Version\")\n        @Serializable\n        private class SerialData(\n            val incremental: ByteArray = \"5891938\".toByteArray(),\n            val release: ByteArray = \"10\".toByteArray(),\n            val codename: ByteArray = \"REL\".toByteArray(),\n            val sdk: Int = 29\n        )\n    }\n\n    @Serializable\n    class V1(\n        val display: ByteArray,\n        val product: ByteArray,\n        val device: ByteArray,\n        val board: ByteArray,\n        val brand: ByteArray,\n        val model: ByteArray,\n        val bootloader: ByteArray,\n        val fingerprint: ByteArray,\n        val bootId: ByteArray,\n        val procVersion: ByteArray,\n        val baseBand: ByteArray,\n        val version: @Serializable(DeviceInfoVersionSerializer::class) DeviceInfo.Version,\n        val simInfo: ByteArray,\n        val osType: ByteArray,\n        val macAddress: ByteArray,\n        val wifiBSSID: ByteArray,\n        val wifiSSID: ByteArray,\n        val imsiMd5: ByteArray,\n        val imei: String,\n        val apn: ByteArray\n    ) : Info {\n        override fun toDeviceInfo(): DeviceInfo {\n            @Suppress(\"DEPRECATION\", \"DEPRECATION_ERROR\")\n            return DeviceInfo(\n                display = display,\n                product = product,\n                device = device,\n                board = board,\n                brand = brand,\n                model = model,\n                bootloader = bootloader,\n                fingerprint = fingerprint,\n                bootId = bootId,\n                procVersion = procVersion,\n                baseBand = baseBand,\n                version = version,\n                simInfo = simInfo,\n                osType = osType,\n                macAddress = macAddress,\n                wifiBSSID = wifiBSSID,\n                wifiSSID = wifiSSID,\n                imsiMd5 = imsiMd5,\n                imei = imei,\n                apn = apn,\n                androidId = getRandomByteArray(8).toUHexString(\"\").lowercase().encodeToByteArray()\n            )\n        }\n    }\n\n    @Serializable\n    class V2(\n        val display: String,\n        val product: String,\n        val device: String,\n        val board: String,\n        val brand: String,\n        val model: String,\n        val bootloader: String,\n        val fingerprint: String,\n        val bootId: String,\n        val procVersion: String,\n        val baseBand: HexString,\n        val version: Version,\n        val simInfo: String,\n        val osType: String,\n        val macAddress: String,\n        val wifiBSSID: String,\n        val wifiSSID: String,\n        val imsiMd5: HexString,\n        val imei: String,\n        val apn: String\n    ) : Info {\n        @Suppress(\"DEPRECATION\", \"DEPRECATION_ERROR\")\n        override fun toDeviceInfo(): DeviceInfo = DeviceInfo(\n            this.display.toByteArray(),\n            this.product.toByteArray(),\n            this.device.toByteArray(),\n            this.board.toByteArray(),\n            this.brand.toByteArray(),\n            this.model.toByteArray(),\n            this.bootloader.toByteArray(),\n            this.fingerprint.toByteArray(),\n            this.bootId.toByteArray(),\n            this.procVersion.toByteArray(),\n            this.baseBand.data,\n            this.version.trans(),\n            this.simInfo.toByteArray(),\n            this.osType.toByteArray(),\n            this.macAddress.toByteArray(),\n            this.wifiBSSID.toByteArray(),\n            this.wifiSSID.toByteArray(),\n            this.imsiMd5.data,\n            this.imei,\n            this.apn.toByteArray(),\n            androidId = getRandomByteArray(8).toUHexString(\"\").lowercase().encodeToByteArray()\n        )\n    }\n\n\n    @Serializable\n    class V3(\n        val display: String,\n        val product: String,\n        val device: String,\n        val board: String,\n        val brand: String,\n        val model: String,\n        val bootloader: String,\n        val fingerprint: String,\n        val bootId: String,\n        val procVersion: String,\n        val baseBand: HexString,\n        val version: Version,\n        val simInfo: String,\n        val osType: String,\n        val macAddress: String,\n        val wifiBSSID: String,\n        val wifiSSID: String,\n        val imsiMd5: HexString,\n        val imei: String,\n        val apn: String,\n        val androidId: String,\n    ) : Info {\n        @Suppress(\"DEPRECATION\", \"DEPRECATION_ERROR\")\n        override fun toDeviceInfo(): DeviceInfo = DeviceInfo(\n            this.display.toByteArray(),\n            this.product.toByteArray(),\n            this.device.toByteArray(),\n            this.board.toByteArray(),\n            this.brand.toByteArray(),\n            this.model.toByteArray(),\n            this.bootloader.toByteArray(),\n            this.fingerprint.toByteArray(),\n            this.bootId.toByteArray(),\n            this.procVersion.toByteArray(),\n            this.baseBand.data,\n            this.version.trans(),\n            this.simInfo.toByteArray(),\n            this.osType.toByteArray(),\n            this.macAddress.toByteArray(),\n            this.wifiBSSID.toByteArray(),\n            this.wifiSSID.toByteArray(),\n            this.imsiMd5.data,\n            this.imei,\n            this.apn.toByteArray(),\n            this.androidId.toByteArray()\n        )\n    }\n\n    @Serializable\n    class Version(\n        val incremental: String,\n        val release: String,\n        val codename: String,\n        val sdk: Int = 29\n    ) {\n        companion object {\n            fun DeviceInfo.Version.trans(): Version {\n                return Version(incremental.decodeToString(), release.decodeToString(), codename.decodeToString(), sdk)\n            }\n\n            fun Version.trans(): DeviceInfo.Version {\n                return DeviceInfo.Version(incremental.toByteArray(), release.toByteArray(), codename.toByteArray(), sdk)\n            }\n        }\n    }\n\n    fun DeviceInfo.toCurrentInfo(): V3 = V3(\n        display.decodeToString(),\n        product.decodeToString(),\n        device.decodeToString(),\n        board.decodeToString(),\n        brand.decodeToString(),\n        model.decodeToString(),\n        bootloader.decodeToString(),\n        fingerprint.decodeToString(),\n        bootId.decodeToString(),\n        procVersion.decodeToString(),\n        HexString(baseBand),\n        version.trans(),\n        simInfo.decodeToString(),\n        osType.decodeToString(),\n        macAddress.decodeToString(),\n        wifiBSSID.decodeToString(),\n        wifiSSID.decodeToString(),\n        HexString(imsiMd5),\n        imei,\n        apn.decodeToString(),\n        androidId.decodeToString(),\n    )\n\n    internal val format = Json {\n        ignoreUnknownKeys = true\n        isLenient = true\n    }\n\n    @Suppress(\"unused\")\n    @Deprecated(\"ABI compatibility for device generator\", level = DeprecationLevel.HIDDEN)\n    @JvmName(\"deserialize\")\n    fun deserializeDeprecated(\n        string: String,\n        format: Json = this.format,\n    ): DeviceInfo = deserialize(string, format)\n\n    @Throws(IllegalArgumentException::class, NumberFormatException::class) // in case malformed\n    fun deserialize(\n        string: String,\n        format: Json = this.format,\n        onUpgradeVersion: (DeviceInfo) -> Unit = { }\n    ): DeviceInfo {\n        val element = format.parseToJsonElement(string)\n        val version = element.jsonObject[\"deviceInfoVersion\"]?.jsonPrimitive?.content?.toInt() ?: 1\n\n        val deviceInfo = when (version) {\n            /**\n             * @since 2.0\n             */\n            1 -> format.decodeFromJsonElement(V1.serializer(), element)\n            /**\n             * @since 2.9\n             */\n            2 -> format.decodeFromJsonElement(Wrapper.serializer(V2.serializer()), element).data\n            /**\n             * @since 2.15\n             */\n            3 -> format.decodeFromJsonElement(Wrapper.serializer(V3.serializer()), element).data\n            else -> throw IllegalArgumentException(\"Unsupported deviceInfoVersion: $version\")\n        }.toDeviceInfo()\n\n        if (version < 3) onUpgradeVersion(deviceInfo)\n\n        return deviceInfo\n    }\n\n    fun serialize(info: DeviceInfo, format: Json = this.format): String {\n        return format.encodeToString(\n            Wrapper.serializer(V3.serializer()),\n            Wrapper(3, info.toCurrentInfo())\n        )\n    }\n\n    fun toJsonElement(info: DeviceInfo, format: Json = this.format): JsonElement {\n        return format.encodeToJsonElement(\n            Wrapper.serializer(V3.serializer()),\n            Wrapper(3, info.toCurrentInfo())\n        )\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/utils/DeviceInfoV1LegacySerializer.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.Serializable\n\n\n@Serializable\ninternal class DeviceInfoV1Legacy(\n    val product: ByteArray,\n    val display: ByteArray,\n    val device: ByteArray,\n    val board: ByteArray,\n    val brand: ByteArray,\n    val model: ByteArray,\n    val bootloader: ByteArray,\n    val fingerprint: ByteArray,\n    val bootId: ByteArray,\n    val procVersion: ByteArray,\n    val baseBand: ByteArray,\n    val version: DeviceInfoV1LegacyVersion,\n    val simInfo: ByteArray,\n    val osType: ByteArray,\n    val macAddress: ByteArray,\n    val wifiBSSID: ByteArray,\n    val wifiSSID: ByteArray,\n    val imsiMd5: ByteArray,\n    val imei: String,\n    val apn: ByteArray,\n    val androidId: ByteArray? = null\n)\n\n@Serializable\ninternal class DeviceInfoV1LegacyVersion(\n    val incremental: ByteArray = \"5891938\".toByteArray(),\n    val release: ByteArray = \"10\".toByteArray(),\n    val codename: ByteArray = \"REL\".toByteArray(),\n    val sdk: Int = 29\n)\n\ninternal object DeviceInfoV1LegacySerializer : KSerializer<DeviceInfo> by DeviceInfoV1Legacy.serializer().map(\n    DeviceInfoV1Legacy.serializer().descriptor.copy(\"DeviceInfo\"),\n    deserialize = {\n        @Suppress(\"DEPRECATION\")\n        DeviceInfo(\n            display,\n            product,\n            device,\n            board,\n            brand,\n            model,\n            bootloader,\n            fingerprint,\n            bootId,\n            procVersion,\n            baseBand,\n            DeviceInfo.Version(version.incremental, version.release, version.codename, version.sdk),\n            simInfo,\n            osType,\n            macAddress,\n            wifiBSSID,\n            wifiSSID,\n            imsiMd5,\n            imei,\n            apn,\n            androidId = display\n        )\n    },\n    serialize = {\n        DeviceInfoV1Legacy(\n            display,\n            product,\n            device,\n            board,\n            brand,\n            model,\n            bootloader,\n            fingerprint,\n            bootId,\n            procVersion,\n            baseBand,\n            DeviceInfoV1LegacyVersion(version.incremental, version.release, version.codename, version.sdk),\n            simInfo,\n            osType,\n            macAddress,\n            wifiBSSID,\n            wifiSSID,\n            imsiMd5,\n            imei,\n            apn\n        )\n    }\n)"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/utils/ExternalResource.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"EXPERIMENTAL_API_USAGE\", \"unused\")\n\npackage net.mamoe.mirai.utils\n\nimport io.ktor.utils.io.core.*\nimport kotlinx.coroutines.CompletableDeferred\nimport kotlinx.coroutines.Deferred\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.contact.Contact.Companion.sendImage\nimport net.mamoe.mirai.contact.Contact.Companion.uploadImage\nimport net.mamoe.mirai.contact.FileSupported\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.internal.utils.*\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.FileMessage\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.message.data.sendTo\nimport net.mamoe.mirai.message.data.toVoice\nimport net.mamoe.mirai.utils.ExternalResource.Companion.sendAsImageTo\nimport net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource\nimport net.mamoe.mirai.utils.ExternalResource.Companion.uploadAsImage\nimport java.io.File\nimport java.io.IOException\nimport java.io.InputStream\nimport java.io.RandomAccessFile\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\n\n\n/**\n * 一个*不可变的*外部资源. 仅包含资源内容, 大小, 文件类型, 校验值而不包含文件名, 文件位置等. 外部资源有可能是一个文件, 也有可能只存在于内存, 或者以任意其他方式实现.\n *\n * [ExternalResource] 在创建之后就应该保持其属性的不变, 即任何时候获取其属性都应该得到相同结果, 任何时候打开流都得到的一样的数据.\n *\n * # 创建\n * - [File.toExternalResource]\n * - [RandomAccessFile.toExternalResource]\n * - [ByteArray.toExternalResource]\n * - [InputStream.toExternalResource]\n *\n * ## 在 Kotlin 获得和使用 [ExternalResource] 实例\n *\n * ```\n * file.toExternalResource().use { resource -> // 安全地使用资源\n *     contact.uploadImage(resource) // 用来上传图片\n *     contact.files.uploadNewFile(\"/foo/test.txt\", resource) // 或者用来上传文件\n * }\n * ```\n *\n * 注意, 若使用 [InputStream], 必须手动关闭 [InputStream]. 一种使用情况示例:\n *\n * ```\n * inputStream.use { input -> // 安全地使用 InputStream\n *     input.toExternalResource().use { resource -> // 安全地使用资源\n *         contact.uploadImage(resource) // 用来上传图片\n *         contact.files.uploadNewFile(\"/foo/test.txt\", resource) // 或者用来上传文件\n *     }\n * }\n * ```\n *\n * ## 在 Java 获得和使用 [ExternalResource] 实例\n *\n * ```\n * try (ExternalResource resource = ExternalResource.create(file)) { // 使用文件 file\n *     contact.uploadImage(resource); // 用来上传图片\n *     contact.files.uploadNewFile(\"/foo/test.txt\", resource); // 或者用来上传文件\n * }\n * ```\n *\n * 注意, 若使用 [InputStream], 必须手动关闭 [InputStream]. 一种使用情况示例:\n *\n * ```java\n * try (InputStream stream = ...) { // 安全地使用 InputStream\n *     try (ExternalResource resource = ExternalResource.create(stream)) { // 安全地使用资源\n *         contact.uploadImage(resource); // 用来上传图片\n *         contact.files.uploadNewFile(\"/foo/test.txt\", resource); // 或者用来上传文件\n *     }\n * }\n * ```\n *\n * # 释放\n *\n * 当 [ExternalResource] 创建时就可能会打开一个文件 (如使用 [File.toExternalResource]).\n * 类似于 [InputStream], [ExternalResource] 需要被 [关闭][close].\n *\n * ## 未释放资源的补救策略\n *\n * 自 2.7 起, 每个 mirai 内置的 [ExternalResource] 实现都有引用跟踪, 当 [ExternalResource] 被 GC 后会执行被动释放.\n * 这依赖于 JVM 垃圾收集策略, 因此不可靠, 资源仍然需要手动 close.\n *\n * ## 使用单次自动释放\n *\n * 若创建的资源仅需要*很快地*使用一次, 可使用 [toAutoCloseable] 获得在使用一次后就会自动关闭的资源.\n *\n * 示例:\n * ```java\n * contact.uploadImage(ExternalResource.create(file).toAutoCloseable()); // 创建并立即使用单次自动释放的资源\n * ```\n *\n * **注意**: 如果仅使用 [toAutoCloseable] 而不通过 [Contact.uploadImage] 等 mirai 内置方法使用资源, 资源仍然会处于打开状态且不会被自动关闭.\n * 最终资源会由上述*未释放资源的补救策略*关闭, 但这依赖于 JVM 垃圾收集策略而不可靠.\n * 因此建议在创建单次自动释放的资源后就尽快使用它, 否则仍然需要考虑在正确的时间及时关闭资源.\n *\n * # 实现 [ExternalResource]\n *\n * 可以自行实现 [ExternalResource]. 但通常上述创建方法已足够使用.\n *\n * 建议继承 [AbstractExternalResource], 这将支持上文提到的资源自动释放功能.\n *\n * 实现时需保持 [ExternalResource] 在构造后就不可变, 并且所有属性都总是返回一个固定值.\n *\n * @see ExternalResource.uploadAsImage 将资源作为图片上传, 得到 [Image]\n * @see ExternalResource.sendAsImageTo 将资源作为图片发送\n * @see Contact.uploadImage 上传一个资源作为图片, 得到 [Image]\n * @see Contact.sendImage 发送一个资源作为图片\n *\n * @see FileCacheStrategy\n */\npublic interface ExternalResource : java.io.Closeable {\n\n    /**\n     * 是否在 _使用一次_ 后自动 [close].\n     *\n     * 该属性仅供调用方参考. 如 [Contact.uploadImage] 会在方法结束时关闭 [isAutoClose] 为 `true` 的 [ExternalResource], 无论上传图片是否成功.\n     *\n     * 所有 mirai 内置的上传图片, 上传语音等方法都支持该行为.\n     *\n     * @since 2.8\n     */\n    public val isAutoClose: Boolean\n        get() = false\n\n    /**\n     * 文件内容 MD5. 16 bytes\n     */\n    public val md5: ByteArray\n\n    /**\n     * 文件内容 SHA1. 16 bytes\n     * @since 2.5\n     */\n    public val sha1: ByteArray\n        get() =\n            throw UnsupportedOperationException(\"ExternalResource.sha1 is not implemented by ${this::class.simpleName}\")\n    // 如果你要实现 [ExternalResource], 你也应该实现 [sha1].\n    // 这里默认抛出 [UnsupportedOperationException] 是为了 (姑且) 兼容 2.5 以前的版本的实现.\n\n\n    /**\n     * 文件格式，如 \"png\", \"amr\". 当无法自动识别格式时为 [DEFAULT_FORMAT_NAME].\n     *\n     * 默认会从文件头识别, 支持的文件类型:\n     * * 图片类型: png, jpg, gif, tif, bmp\n     * * 语音类型: amr, silk\n     * * 视频类类型: mp4, mkv\n     *\n     * @see net.mamoe.mirai.utils.getFileType\n     * @see net.mamoe.mirai.utils.FILE_TYPES\n     * @see DEFAULT_FORMAT_NAME\n     */\n    public val formatName: String\n\n    /**\n     * 文件大小 bytes\n     */\n    public val size: Long\n\n    /**\n     * 当 [close] 时会 [CompletableDeferred.complete] 的 [Deferred].\n     */\n    public val closed: Deferred<Unit>\n\n    /**\n     * 打开 [InputStream]. 在返回的 [InputStream] 被 [关闭][InputStream.close] 前无法再次打开流.\n     *\n     * 关闭此流不会关闭 [ExternalResource].\n     * @throws IllegalStateException 当上一个流未关闭又尝试打开新的流时抛出\n     */\n    public fun inputStream(): InputStream\n\n    /**\n     * 打开 [Input]. 在返回的 [Input] 被 [关闭][Input.close] 前无法再次打开流.\n     * 注意: 此 API 不稳定, 请使用 [inputStream] 代替.\n     *\n     * 关闭此流不会关闭 [ExternalResource].\n     * @throws IllegalStateException 当上一个流未关闭又尝试打开新的流时抛出\n     *\n     * @since 2.13\n     */\n    @MiraiInternalApi\n    public fun input(): Input\n\n    @MiraiInternalApi\n    public fun calculateResourceId(): String {\n        return generateImageId(md5, formatName.ifEmpty { DEFAULT_FORMAT_NAME })\n    }\n\n    /**\n     * 该 [ExternalResource] 的数据来源, 可能有以下的返回\n     *\n     * - [File] 本地文件\n     * - [java.nio.file.Path] 某个具体文件路径\n     * - [java.nio.ByteBuffer] RAM\n     * - [java.net.URI] uri\n     * - [ByteArray] RAM\n     * - Or more...\n     *\n     * implementation note:\n     *\n     * - 对于无法二次读取的数据来源 (如 [InputStream]), 返回 `null`\n     * - 对于一个来自网络的资源, 请返回 [java.net.URI] (not URL, 或者其他库的 URI/URL 类型)\n     * - 不要返回 [String], 没有约定 [String] 代表什么\n     * - 数据源外漏会严重影响 [inputStream] 等的执行的可以返回 `null` (如 [RandomAccessFile])\n     *\n     * @since 2.8.0\n     */\n    public val origin: Any? get() = null\n\n    /**\n     * 创建一个在 _使用一次_ 后就会自动 [close] 的 [ExternalResource].\n     *\n     * @since 2.8.0\n     */\n    public fun toAutoCloseable(): ExternalResource {\n        return if (isAutoClose) this else {\n            val delegate = this\n            object : ExternalResource by delegate {\n                override val isAutoClose: Boolean get() = true\n                override fun toString(): String = \"ExternalResourceWithAutoClose(delegate=$delegate)\"\n                override fun toAutoCloseable(): ExternalResource {\n                    return this\n                }\n            }\n        }\n    }\n\n\n    public companion object {\n        /**\n         * 在无法识别文件格式时使用的默认格式名. \"mirai\".\n         *\n         * @see ExternalResource.formatName\n         */\n        public const val DEFAULT_FORMAT_NAME: String = \"mirai\"\n\n        ///////////////////////////////////////////////////////////////////////////\n        // region toExternalResource\n        ///////////////////////////////////////////////////////////////////////////\n\n        /**\n         * **打开文件**并创建 [ExternalResource].\n         * 注意, 返回的 [ExternalResource] 需要在使用完毕后调用 [ExternalResource.close] 关闭.\n         *\n         * 将以只读模式打开这个文件 (因此文件会处于被占用状态), 直到 [ExternalResource.close].\n         *\n         * @param formatName 查看 [ExternalResource.formatName]\n         */\n        @JvmStatic\n        @JvmOverloads\n        @JvmName(\"create\")\n        public fun File.toExternalResource(formatName: String? = null): ExternalResource =\n            // although RandomAccessFile constructor throws IOException, performance influence is minor so not propagating IOException\n            RandomAccessFile(this, \"r\").toExternalResource(formatName).also {\n                it.cast<ExternalResourceImplByFile>().origin = this@toExternalResource\n            }\n\n        /**\n         * 创建 [ExternalResource].\n         * 注意, 返回的 [ExternalResource] 需要在使用完毕后调用 [ExternalResource.close] 关闭, 届时将会关闭 [RandomAccessFile].\n         *\n         * **注意**：若关闭 [RandomAccessFile], 也会间接关闭 [ExternalResource].\n         *\n         * @see closeOriginalFileOnClose 若为 `true`, 在 [ExternalResource.close] 时将会同步关闭 [RandomAccessFile]. 否则不会.\n         *\n         * @param formatName 查看 [ExternalResource.formatName]\n         */\n        @JvmStatic\n        @JvmOverloads\n        @JvmName(\"create\")\n        public fun RandomAccessFile.toExternalResource(\n            formatName: String? = null,\n            closeOriginalFileOnClose: Boolean = true,\n        ): ExternalResource =\n            ExternalResourceImplByFile(this, formatName, closeOriginalFileOnClose)\n\n        /**\n         * 创建 [ExternalResource]. 注意, 返回的 [ExternalResource] 需要在使用完毕后调用 [ExternalResource.close] 关闭.\n         *\n         * @param formatName 查看 [ExternalResource.formatName]\n         */\n        @JvmStatic\n        @JvmOverloads\n        @JvmName(\"create\")\n        public fun ByteArray.toExternalResource(formatName: String? = null): ExternalResource =\n            ExternalResourceImplByByteArray(this, formatName)\n\n\n        /**\n         * 立即使用 [FileCacheStrategy] 缓存 [InputStream] 并创建 [ExternalResource].\n         * 返回的 [ExternalResource] 需要在使用完毕后调用 [ExternalResource.close] 关闭.\n         *\n         * **注意**：本函数不会关闭流.\n         *\n         * ### 在 Java 获得和使用 [ExternalResource] 实例\n         *\n         * ```\n         * try(ExternalResource resource = ExternalResource.create(file)) { // 使用文件 file\n         *     contact.uploadImage(resource); // 用来上传图片\n         *     contact.files.uploadNewFile(\"/foo/test.txt\", file); // 或者用来上传文件\n         * }\n         * ```\n         *\n         * 注意, 若使用 [InputStream], 必须手动关闭 [InputStream]. 一种使用情况示例:\n         *\n         * ```\n         * try(InputStream stream = ...) {\n         *     try(ExternalResource resource = ExternalResource.create(stream)) {\n         *         contact.uploadImage(resource); // 用来上传图片\n         *         contact.files.uploadNewFile(\"/foo/test.txt\", file); // 或者用来上传文件\n         *     }\n         * }\n         * ```\n         *\n         *\n         * @param formatName 查看 [ExternalResource.formatName]\n         * @see ExternalResource\n         */\n        @JvmStatic\n        @JvmOverloads\n        @JvmName(\"create\")\n        @Throws(IOException::class) // not in BIO context so propagate IOException\n        public fun InputStream.toExternalResource(formatName: String? = null): ExternalResource =\n            Mirai.FileCacheStrategy.newCache(this, formatName)\n\n        // endregion\n\n\n        /* note:\n        于 2.8.0-M1 添加 (#1392)\n\n        于 2.8.0-RC 移动至 `toExternalResource`(#1588)\n         */\n        @JvmName(\"createAutoCloseable\")\n        @JvmStatic\n        @Deprecated(\n            level = DeprecationLevel.HIDDEN,\n            message = \"Moved to `toExternalResource()`\",\n            replaceWith = ReplaceWith(\"resource.toAutoCloseable()\"),\n        )\n        @DeprecatedSinceMirai(errorSince = \"2.8\", hiddenSince = \"2.10\")\n        public fun createAutoCloseable(resource: ExternalResource): ExternalResource {\n            return resource.toAutoCloseable()\n        }\n\n        ///////////////////////////////////////////////////////////////////////////\n        // region sendAsImageTo\n        ///////////////////////////////////////////////////////////////////////////\n\n        /**\n         * 将图片作为单独的消息发送给指定联系人.\n         *\n         * **注意**：本函数不会关闭 [ExternalResource].\n         *\n         * @see Contact.uploadImage 上传图片\n         * @see Contact.sendMessage 最终调用, 发送消息.\n         *\n         * @throws OverFileSizeMaxException\n         */\n        @JvmBlockingBridge\n        @JvmStatic\n        @JvmName(\"sendAsImage\")\n        public suspend fun <C : Contact> ExternalResource.sendAsImageTo(contact: C): MessageReceipt<C> =\n            contact.uploadImage(this).sendTo(contact)\n\n        /**\n         * 读取 [InputStream] 到临时文件并将其作为图片发送到指定联系人.\n         *\n         * 注意：本函数不会关闭流.\n         *\n         * @param formatName 查看 [ExternalResource.formatName]\n         * @throws OverFileSizeMaxException\n         */\n        @JvmStatic\n        @JvmBlockingBridge\n        @JvmName(\"sendAsImage\")\n        @JvmOverloads\n        public suspend fun <C : Contact> InputStream.sendAsImageTo(\n            contact: C,\n            formatName: String? = null,\n        ): MessageReceipt<C> =\n            runBIO {\n                // toExternalResource throws IOException however we're in BIO context so not propagating IOException to sendAsImageTo\n                toExternalResource(formatName)\n            }.withUse { sendAsImageTo(contact) }\n\n        /**\n         * 将文件作为图片发送到指定联系人.\n         * @param formatName 查看 [ExternalResource.formatName]\n         * @throws OverFileSizeMaxException\n         */\n        @JvmStatic\n        @JvmBlockingBridge\n        @JvmName(\"sendAsImage\")\n        @JvmOverloads\n        public suspend fun <C : Contact> File.sendAsImageTo(contact: C, formatName: String? = null): MessageReceipt<C> {\n            require(this.exists() && this.canRead())\n            return toExternalResource(formatName).withUse { sendAsImageTo(contact) }\n        }\n\n        // endregion\n\n        ///////////////////////////////////////////////////////////////////////////\n        // region uploadAsImage\n        ///////////////////////////////////////////////////////////////////////////\n\n        /**\n         * 上传图片并构造 [Image]. 这个函数可能需消耗一段时间.\n         *\n         * **注意**：本函数不会关闭 [ExternalResource].\n         *\n         * @param contact 图片上传对象. 由于好友图片与群图片不通用, 上传时必须提供目标联系人.\n         *\n         * @see Contact.uploadImage 最终调用, 上传图片.\n         */\n        @JvmStatic\n        @JvmBlockingBridge\n        public suspend fun ExternalResource.uploadAsImage(contact: Contact): Image = contact.uploadImage(this)\n\n        /**\n         * 读取 [InputStream] 到临时文件并将其作为图片上传后构造 [Image].\n         *\n         * 注意：本函数不会关闭流.\n         *\n         * @param formatName 查看 [ExternalResource.formatName]\n         * @throws OverFileSizeMaxException\n         */\n        @JvmStatic\n        @JvmBlockingBridge\n        @JvmOverloads\n        public suspend fun InputStream.uploadAsImage(contact: Contact, formatName: String? = null): Image =\n            // toExternalResource throws IOException however we're in BIO context so not propagating IOException to sendAsImageTo\n            runBIO { toExternalResource(formatName) }.withUse { uploadAsImage(contact) }\n\n        // endregion\n\n        ///////////////////////////////////////////////////////////////////////////\n        // region uploadAsFile\n        ///////////////////////////////////////////////////////////////////////////\n\n        /**\n         * 将文件作为图片上传后构造 [Image].\n         *\n         * @param formatName 查看 [ExternalResource.formatName]\n         * @throws OverFileSizeMaxException\n         */\n        @JvmStatic\n        @JvmBlockingBridge\n        @JvmOverloads\n        public suspend fun File.uploadAsImage(contact: Contact, formatName: String? = null): Image =\n            toExternalResource(formatName).withUse { uploadAsImage(contact) }\n\n        /**\n         * 上传文件并获取文件消息.\n         *\n         * 如果要上传的文件格式是图片或者语音, 也会将它们作为文件上传而不会调整消息类型.\n         *\n         * 需要调用方手动[关闭资源][ExternalResource.close].\n         *\n         * ## 已弃用\n         * 查看 [RemoteFile.upload] 获取更多信息.\n         *\n         * @param path 远程路径. 起始字符为 '/'. 如 '/foo/bar.txt'\n         * @since 2.5\n         * @see RemoteFile.path\n         * @see RemoteFile.upload\n         */\n        @Suppress(\"DEPRECATION_ERROR\")\n        @JvmStatic\n        @JvmBlockingBridge\n        @JvmOverloads\n        @Deprecated(\n            \"Use sendTo instead.\",\n            ReplaceWith(\n                \"this.sendTo(contact, path, callback)\",\n                \"net.mamoe.mirai.utils.ExternalResource.Companion.sendTo\"\n            ),\n            level = DeprecationLevel.HIDDEN\n        ) // deprecated since 2.7-M1\n        @DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.10\", hiddenSince = \"2.11\")\n        public suspend fun File.uploadTo(\n            contact: FileSupported,\n            path: String,\n            callback: RemoteFile.ProgressionCallback? = null,\n        ): FileMessage = toExternalResource().use {\n            contact.filesRoot.resolve(path).upload(it, callback)\n        }\n\n        /**\n         * 上传文件并获取文件消息.\n         *\n         * 如果要上传的文件格式是图片或者语音, 也会将它们作为文件上传而不会调整消息类型.\n         *\n         * 需要调用方手动[关闭资源][ExternalResource.close].\n         *\n         * ## 已弃用\n         * 查看 [RemoteFile.upload] 获取更多信息.\n         *\n         * @param path 远程路径. 起始字符为 '/'. 如 '/foo/bar.txt'\n         * @since 2.5\n         * @see RemoteFile.path\n         * @see RemoteFile.upload\n         */\n        @Suppress(\"DEPRECATION_ERROR\")\n        @JvmStatic\n        @JvmBlockingBridge\n        @JvmName(\"uploadAsFile\")\n        @JvmOverloads\n        @Deprecated(\n            \"Use sendAsFileTo instead.\",\n            ReplaceWith(\n                \"this.sendAsFileTo(contact, path, callback)\",\n                \"net.mamoe.mirai.utils.ExternalResource.Companion.sendAsFileTo\"\n            ),\n            level = DeprecationLevel.HIDDEN\n        ) // deprecated since 2.7-M1\n        @DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.10\", hiddenSince = \"2.11\")\n        public suspend fun ExternalResource.uploadAsFile(\n            contact: FileSupported,\n            path: String,\n            callback: RemoteFile.ProgressionCallback? = null,\n        ): FileMessage {\n            return contact.filesRoot.resolve(path).upload(this, callback)\n        }\n\n        // endregion\n\n        ///////////////////////////////////////////////////////////////////////////\n        // region sendAsFileTo\n        ///////////////////////////////////////////////////////////////////////////\n\n        /**\n         * 上传文件并发送文件消息.\n         *\n         * 如果要上传的文件格式是图片或者语音, 也会将它们作为文件上传而不会调整消息类型.\n         *\n         * @param path 远程路径. 起始字符为 '/'. 如 '/foo/bar.txt'\n         * @since 2.5\n         * @see RemoteFile.path\n         * @see RemoteFile.uploadAndSend\n         */\n        @Suppress(\"DEPRECATION_ERROR\")\n        @Deprecated(\n            \"Deprecated. Please use AbsoluteFolder.uploadNewFile\",\n            ReplaceWith(\"contact.files.uploadNewFile(path, this, callback)\"),\n            level = DeprecationLevel.ERROR,\n        ) // deprecated since 2.8.0-RC\n        @JvmStatic\n        @JvmBlockingBridge\n        @JvmOverloads\n        @DeprecatedSinceMirai(warningSince = \"2.8\", errorSince = \"2.14\")\n        public suspend fun <C : FileSupported> File.sendTo(\n            contact: C,\n            path: String,\n            callback: RemoteFile.ProgressionCallback? = null,\n        ): MessageReceipt<C> = toExternalResource().use {\n            contact.filesRoot.resolve(path).upload(it, callback).sendTo(contact)\n        }\n\n        /**\n         * 上传文件并发送件消息.  如果要上传的文件格式是图片或者语音, 也会将它们作为文件上传而不会调整消息类型.\n         *\n         * 需要调用方手动[关闭资源][ExternalResource.close].\n         *\n         * @param path 远程路径. 起始字符为 '/'. 如 '/foo/bar.txt'\n         * @since 2.5\n         * @see RemoteFile.path\n         * @see RemoteFile.uploadAndSend\n         */\n        @Suppress(\"DEPRECATION_ERROR\")\n        @Deprecated(\n            \"Deprecated. Please use AbsoluteFolder.uploadNewFile\",\n            ReplaceWith(\"contact.files.uploadNewFile(path, this, callback)\"),\n            level = DeprecationLevel.ERROR\n        ) // deprecated since 2.8.0-RC\n        @JvmStatic\n        @JvmBlockingBridge\n        @JvmName(\"sendAsFile\")\n        @JvmOverloads\n        @DeprecatedSinceMirai(warningSince = \"2.8\", errorSince = \"2.14\")\n        public suspend fun <C : FileSupported> ExternalResource.sendAsFileTo(\n            contact: C,\n            path: String,\n            callback: RemoteFile.ProgressionCallback? = null,\n        ): MessageReceipt<C> {\n            return contact.filesRoot.resolve(path).upload(this, callback).sendTo(contact)\n        }\n\n        // endregion\n\n        ///////////////////////////////////////////////////////////////////////////\n        // region uploadAsVoice\n        ///////////////////////////////////////////////////////////////////////////\n\n        @Suppress(\"DEPRECATION_ERROR\")\n        @JvmBlockingBridge\n        @JvmStatic\n        @Deprecated(\n            \"Use `contact.uploadAudio(resource)` instead\",\n            level = DeprecationLevel.HIDDEN\n        ) // deprecated since 2.7\n        @DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.10\", hiddenSince = \"2.11\")\n        public suspend fun ExternalResource.uploadAsVoice(contact: Contact): net.mamoe.mirai.message.data.Voice {\n            @Suppress(\"DEPRECATION_ERROR\")\n            if (contact is Group) return contact.uploadAudio(this).toVoice()\n            else throw UnsupportedOperationException(\"Contact `$contact` is not supported uploading voice\")\n        }\n        // endregion\n    }\n}\n\n/**\n * 执行 [action], 如果 [ExternalResource.isAutoClose], 在执行完成后调用 [ExternalResource.close].\n *\n * @since 2.8\n */\n@MiraiExperimentalApi\n// Continuing mark it as experimental until Kotlin's contextual receivers design is published.\n// We might be able to make `action` a type `context(ExternalResource) () -> R`.\npublic inline fun <T : ExternalResource, R> T.withAutoClose(action: () -> R): R {\n    contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }\n    trySafely(\n        block = { return action() },\n        finally = { if (isAutoClose) close() }\n    )\n}\n\n/**\n * 执行 [action], 如果 [ExternalResource.isAutoClose], 在执行完成后调用 [ExternalResource.close].\n *\n * @since 2.8\n */\npublic inline fun <T : ExternalResource, R> T.runAutoClose(action: T.() -> R): R {\n    contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }\n    @OptIn(MiraiExperimentalApi::class)\n    return withAutoClose { action() }\n}\n\n/**\n * 执行 [action], 如果 [ExternalResource.isAutoClose], 在执行完成后调用 [ExternalResource.close].\n *\n * @since 2.8\n */\npublic inline fun <T : ExternalResource, R> T.useAutoClose(action: (resource: T) -> R): R {\n    contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }\n    return runAutoClose(action)\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/utils/FileCacheStrategy.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"MemberVisibilityCanBePrivate\")\n\npackage net.mamoe.mirai.utils\n\nimport io.ktor.utils.io.errors.*\nimport kotlinx.coroutines.Dispatchers\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.IMirai\nimport net.mamoe.mirai.utils.ExternalResource.Companion.sendAsImageTo\nimport net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource\nimport net.mamoe.mirai.utils.ExternalResource.Companion.uploadAsImage\nimport net.mamoe.mirai.utils.FileCacheStrategy.MemoryCache\nimport net.mamoe.mirai.utils.FileCacheStrategy.TempCache\nimport java.io.File\nimport java.io.InputStream\n\n/**\n * 资源缓存策略.\n *\n * 由于上传资源时服务器要求提前给出 MD5 和文件大小等数据, 一些资源如 [InputStream] 需要首先缓存才能使用.\n *\n * 资源的缓存都是将 [InputStream] 缓存未 [ExternalResource]. 根据 [FileCacheStrategy] 实现不同, 可以以临时文件存储, 也可以在数据库或是内存按需存储.\n * Mirai 内置的实现有 [内存存储][MemoryCache] 和 [临时文件存储][TempCache].\n * 操作 [ExternalResource.toExternalResource] 时将会使用 [IMirai.FileCacheStrategy]. 可以覆盖, 示例:\n * ```\n * // Kotlin\n * Mirai.FileCacheStrategy = FileCacheStrategy.TempCache() // 使用系统默认缓存路径, 也是默认的行为\n * Mirai.FileCacheStrategy = FileCacheStrategy.TempCache(File(\"C:/cache\")) // 使用自定义缓存路径\n *\n * // Java\n * Mirai.getInstance().setFileCacheStrategy(new FileCacheStrategy.TempCache()); // 使用系统默认缓存路径, 也是默认的行为\n * Mirai.getInstance().setFileCacheStrategy(new FileCacheStrategy.TempCache(new File(\"C:/cache\"))); // 使用自定义的缓存路径\n * ```\n *\n * 此接口的实现和使用都是稳定的. 自行实现的 [FileCacheStrategy] 也可以被 Mirai 使用.\n *\n * 注意, 此接口目前仅缓存 [InputStream] 等一次性数据. 好友列表等数据由每个 [Bot] 的 [BotConfiguration.cacheDir] 缓存.\n *\n * ### 使用 [FileCacheStrategy] 的操作\n * - [ExternalResource.toExternalResource]\n * - [ExternalResource.uploadAsImage]\n * - [ExternalResource.sendAsImageTo]\n *\n * @see ExternalResource\n */\npublic interface FileCacheStrategy {\n    /**\n     * 立即读取 [input] 所有内容并缓存为 [ExternalResource].\n     *\n     * 注意:\n     * - 此函数不会关闭输入\n     * - 此函数可能会阻塞线程读取 [input] 内容, 若在 Kotlin 协程使用请确保在允许阻塞的环境 ([Dispatchers.IO]).\n     *\n     * @param formatName 文件类型. 此参数通常只会影响官方客户端接收到的文件的文件后缀. 若为 `null` 则会自动根据文件头识别. 识别失败时将使用 \"mirai\"\n     */\n    @Throws(IOException::class)\n    public fun newCache(input: InputStream, formatName: String? = null): ExternalResource\n\n    /**\n     * 立即读取 [input] 所有内容并缓存为 [ExternalResource]. 自动根据文件头识别文件类型. 识别失败时将使用 \"mirai\".\n     *\n     * 注意:\n     * - 此函数不会关闭输入\n     * - 此函数可能会阻塞线程读取 [input] 内容, 若在 Kotlin 协程使用请确保在允许阻塞的环境 ([Dispatchers.IO]).\n     */\n    @Throws(IOException::class)\n    public fun newCache(input: InputStream): ExternalResource = newCache(input, null)\n\n    /**\n     * 使用内存直接存储所有图片文件. 由 JVM 执行 GC.\n     */\n    public object MemoryCache : FileCacheStrategy {\n        @Throws(IOException::class)\n        override fun newCache(input: InputStream, formatName: String?): ExternalResource {\n            return input.readBytes().toExternalResource(formatName)\n        }\n    }\n\n    /**\n     * 使用系统临时文件夹缓存图片文件. 在图片使用完毕后或 JVM 正常结束时删除临时文件.\n     */\n    public class TempCache @JvmOverloads public constructor(\n        /**\n         * 缓存图片存放位置. 为 `null` 时使用主机系统的临时文件夹: `File.createTempFile(\"tmp\", null, directory)`\n         */\n        public val directory: File? = null,\n    ) : FileCacheStrategy {\n        private fun createTempFile(): File {\n            return File.createTempFile(\"tmp\", null, directory)\n        }\n\n        @Throws(IOException::class)\n        override fun newCache(input: InputStream, formatName: String?): ExternalResource {\n            val file = createTempFile()\n            return file.apply {\n                deleteOnExit()\n                outputStream().use { out -> input.copyTo(out) }\n            }.toExternalResource(formatName).apply {\n                closed.invokeOnCompletion {\n                    kotlin.runCatching { file.delete() }\n                }\n            }\n        }\n    }\n\n    public companion object {\n        /**\n         * 当前平台下默认的缓存策略. 注意, 这可能不是 Mirai 全局默认使用的, Mirai 从 [IMirai.FileCacheStrategy] 获取.\n         *\n         * @see IMirai.FileCacheStrategy\n         */\n        @MiraiExperimentalApi\n        @JvmStatic\n        public val PlatformDefault: FileCacheStrategy = TempCache(null)\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/utils/FileLogger.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport java.io.File\nimport java.text.SimpleDateFormat\nimport java.util.*\n\ninternal fun getCurrentDay() = Calendar.getInstance()[Calendar.DAY_OF_MONTH]\ninternal fun getCurrentDate() = SimpleDateFormat(\"yyyy-MM-dd\").format(Date())\n\nprivate val STUB: (priority: SimpleLogger.LogPriority, message: String?, e: Throwable?) -> Unit =\n    { _: SimpleLogger.LogPriority, _: String?, _: Throwable? -> error(\"stub\") }\n\n/**\n * 将日志写入('append')到特定文件夹中的文件. 每日日志独立保存.\n *\n * @see PlatformLogger 查看格式信息\n */\npublic class DirectoryLogger @JvmOverloads constructor(\n    identity: String,\n    private val directory: File = File(identity),\n    /**\n     * 保留日志文件多长时间. 毫秒数\n     */\n    private val retain: Long = 1.weeksToMillis\n) : SimpleLogger(\"\", STUB) {\n    init {\n        directory.mkdirs()\n    }\n\n    private fun checkOutdated() {\n        val current = currentTimeMillis()\n        directory.walk().filter(File::isFile).filter { current - it.lastModified() > retain }.forEach {\n            it.delete()\n        }\n    }\n\n    private var day = getCurrentDay()\n\n    private var delegate: SingleFileLogger = SingleFileLogger(identity, File(directory, \"${getCurrentDate()}.log\"))\n        get() {\n            val currentDay = getCurrentDay()\n            if (day != currentDay) {\n                day = currentDay\n                checkOutdated()\n                field = SingleFileLogger(identity!!, File(directory, \"${getCurrentDate()}.log\"))\n            }\n            return field\n        }\n\n    override val logger: (priority: LogPriority, message: String?, e: Throwable?) -> Unit =\n        { priority: LogPriority, message: String?, e: Throwable? ->\n            delegate.call(priority, message, e)\n        }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/utils/LoggerAdapters.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.utils\n\nimport net.mamoe.mirai.internal.utils.JdkLoggerAdapter\nimport net.mamoe.mirai.internal.utils.Log4jLoggerAdapter\nimport net.mamoe.mirai.internal.utils.MARKER_MIRAI\nimport net.mamoe.mirai.internal.utils.Slf4jLoggerAdapter\nimport org.apache.logging.log4j.LogManager\nimport org.apache.logging.log4j.Marker\nimport org.apache.logging.log4j.MarkerManager\n\n/**\n * [SLF4J][org.slf4j.Logger], [LOG4J][org.apache.logging.log4j.Logger] 或 [JUL][java.util.logging.Logger] 到 [MiraiLogger] 的转换器.\n */\npublic object LoggerAdapters {\n    /**\n     * 使用 [LOG4J2][org.apache.logging.log4j.Logger] 接管全局 Mirai 日志系统. 请在调用 Mirai API 任何其他 API 前调用该方法.\n     *\n     * 注意, 若已经通过 service 方式提供 [MiraiLogger.Factory] 来接管日志系统, 则本方法无效.\n     *\n     * @since 2.7\n     */\n    @JvmStatic\n    public fun useLog4j2() {\n        MiraiLoggerFactoryImplementationBridge.wrapCurrent {\n            object : MiraiLogger.Factory {\n                override fun create(requester: Class<*>, identity: String?): MiraiLogger {\n                    val logger = LogManager.getLogger(requester)\n                    return Log4jLoggerAdapter(\n                        logger,\n                        MarkerManager.getMarker(identity ?: logger.name).addParents(MARKER_MIRAI)\n                    )\n                }\n            }\n        }\n    }\n\n\n    /**\n     * 将 [java.util.logging.Logger] 转换作为 [MiraiLogger] 使用.\n     */\n    @JvmStatic\n    public fun java.util.logging.Logger.asMiraiLogger(): MiraiLogger {\n        return JdkLoggerAdapter(this)\n    }\n\n    /**\n     * 将 [org.apache.logging.log4j.Logger] 转换作为 [MiraiLogger] 使用.\n     */\n    @JvmStatic\n    public fun org.apache.logging.log4j.Logger.asMiraiLogger(): MiraiLogger {\n        return Log4jLoggerAdapter(this, null)\n    }\n\n    /**\n     * 将 [org.slf4j.Logger] 转换作为 [MiraiLogger] 使用.\n     */\n    @JvmStatic\n    public fun org.slf4j.Logger.asMiraiLogger(): MiraiLogger {\n        return Slf4jLoggerAdapter(this, null)\n    }\n\n    /**\n     * 将 [org.apache.logging.log4j.Logger] 转换作为 [MiraiLogger] 使用.\n     *\n     * @since 2.7\n     */\n    @JvmStatic\n    public fun org.apache.logging.log4j.Logger.asMiraiLogger(marker: Marker): MiraiLogger {\n        return Log4jLoggerAdapter(this, marker)\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/utils/LoginSolver.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmName(\"LoginSolver_common\")\n\npackage net.mamoe.mirai.utils\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.auth.BotAuthSession\nimport net.mamoe.mirai.auth.BotAuthorization\nimport net.mamoe.mirai.auth.QRCodeLoginListener\nimport net.mamoe.mirai.network.LoginFailedException\nimport net.mamoe.mirai.network.RetryLaterException\nimport net.mamoe.mirai.network.UnsupportedQRCodeCaptchaException\nimport net.mamoe.mirai.network.UnsupportedSmsLoginException\nimport net.mamoe.mirai.utils.LoginSolver.Companion.Default\nimport kotlin.jvm.JvmField\nimport kotlin.jvm.JvmName\n\n/**\n * 验证码, 设备锁解决器\n *\n * @see Default\n * @see BotConfiguration.loginSolver\n */\npublic abstract class LoginSolver {\n    /**\n     * 处理图片验证码, 返回图片验证码内容.\n     *\n     * 返回 `null` 以表示无法处理验证码, 将会刷新验证码或重试登录.\n     *\n     * ## 异常类型\n     *\n     * 抛出一个 [LoginFailedException] 以正常地终止登录, 并可建议系统进行重连或停止 bot (通过 [LoginFailedException.killBot]).\n     * 例如抛出 [RetryLaterException] 可让 bot 重新进行一次登录.\n     *\n     * 抛出任意其他 [Throwable] 将视为验证码解决器的自身错误.\n     *\n     * @throws LoginFailedException\n     */\n    public abstract suspend fun onSolvePicCaptcha(bot: Bot, data: ByteArray): String?\n\n    /**\n     * 为 `true` 表示支持滑动验证码, 遇到滑动验证码时 mirai 会请求 [onSolveSliderCaptcha].\n     * 否则会跳过滑动验证码并告诉服务器此客户端不支持, 有可能导致登录失败\n     */\n    public open val isSliderCaptchaSupported: Boolean get() = PlatformLoginSolverImplementations.isSliderCaptchaSupported\n\n    /**\n     * 当使用二维码登录时会通过此方法创建二维码登录监听器\n     *\n     * @see QRCodeLoginListener\n     * @see BotAuthorization\n     * @see BotAuthSession.authByQRCode\n     *\n     * @since 2.15\n     */\n    public open fun createQRCodeLoginListener(bot: Bot): QRCodeLoginListener {\n        throw UnsupportedQRCodeCaptchaException(\"This login session requires QRCode login, but current LoginSolver($this) does not support it. Please override `LoginSolver.createQRCodeLoginListener`.\")\n    }\n\n    /**\n     * 处理滑动验证码.\n     *\n     * 返回 `null` 以表示无法处理验证码, 将会刷新验证码或重试登录.\n     *\n     * ## 异常类型\n     *\n     * 抛出一个 [LoginFailedException] 以正常地终止登录, 并可建议系统进行重连或停止 bot (通过 [LoginFailedException.killBot]).\n     * 例如抛出 [RetryLaterException] 可让 bot 重新进行一次登录.\n     *\n     * 抛出任意其他 [Throwable] 将视为验证码解决器的自身错误.\n     *\n     * @throws LoginFailedException\n     * @return 验证码解决成功后获得的 ticket.\n     */\n    public abstract suspend fun onSolveSliderCaptcha(bot: Bot, url: String): String?\n\n    /**\n     * 处理设备验证. 通常需要覆盖此函数. 此函数为 `open` 是为了兼容旧代码 (2.13 以前).\n     *\n     * 设备验证的类型可在 [DeviceVerificationRequests] 查看.\n     *\n     * ## 异常类型\n     *\n     * 抛出一个 [LoginFailedException] 以正常地终止登录, 并可建议系统进行重连或停止 bot (通过 [LoginFailedException.killBot]).\n     * 例如抛出 [RetryLaterException] 可让 bot 重新进行一次登录.\n     *\n     * 抛出任意其他 [Throwable] 将视为验证码解决器的自身错误.\n     *\n     * @return 验证结果, 可通过解决 [DeviceVerificationRequests] 获得.\n     * @throws LoginFailedException\n     * @since 2.13\n     */\n    public open suspend fun onSolveDeviceVerification(\n        bot: Bot,\n        requests: DeviceVerificationRequests,\n    ): DeviceVerificationResult {\n        requests.fallback?.let { fallback ->\n            @Suppress(\"DEPRECATION\")\n            (onSolveUnsafeDeviceLoginVerify(bot, fallback.url))\n            return fallback.solved()\n        }\n        throw UnsupportedSmsLoginException(\"This login session requires SMS verification, but current LoginSolver($this) does not support it. Please override `LoginSolver.onSolveDeviceVerification`.\")\n    }\n\n    /**\n     * 处理不安全设备验证. 此函数已弃用, 请实现 [onSolveDeviceVerification].\n     *\n     * 返回值保留给将来使用. 目前在处理完成后返回任意内容 (包含 `null`) 均视为处理成功.\n     *\n     * ## 异常类型\n     *\n     * 抛出一个 [LoginFailedException] 以正常地终止登录, 并可建议系统进行重连或停止 bot (通过 [LoginFailedException.killBot]).\n     * 例如抛出 [RetryLaterException] 可让 bot 重新进行一次登录.\n     *\n     * 抛出任意其他 [Throwable] 将视为验证码解决器的自身错误.\n     *\n     * @return 任意内容. 返回值保留以供未来更新.\n     * @throws LoginFailedException\n     */\n    @Deprecated(\n        \"Please use onSolveDeviceVerification instead\",\n        level = DeprecationLevel.WARNING,\n    ) // softly\n    @DeprecatedSinceMirai(warningSince = \"2.13\") // for hidden\n    public open suspend fun onSolveUnsafeDeviceLoginVerify(bot: Bot, url: String): String? {\n        // This function was abstract, open since 2.13.0\n        throw UnsupportedSmsLoginException(\"This login session requires device verification, but current LoginSolver($this) does not support it. Please override `LoginSolver.onSolveDeviceVerification`.\")\n    }\n\n    public companion object {\n        /**\n         * 当前平台默认的 [LoginSolver]。\n         *\n         * 在 Android 环境时, 此函数返回 `null`.\n         * 在其他 JVM 环境时, 此函数返回一个默认实现, 它通常会是 [StandardCharImageLoginSolver][net.mamoe.mirai.utils.StandardCharImageLoginSolver], 但调用方不应该依赖该属性.\n         */\n        @JvmField\n        public val Default: LoginSolver? = PlatformLoginSolverImplementations.default\n\n        @Suppress(\"unused\")\n        @Deprecated(\"Binary compatibility\", level = DeprecationLevel.HIDDEN)\n        public fun getDefault(): LoginSolver = Default\n            ?: error(\"LoginSolver is not provided by default on your platform. Please specify by BotConfiguration.loginSolver\")\n    }\n}\n\ninternal expect object PlatformLoginSolverImplementations {\n    val isSliderCaptchaSupported: Boolean\n    val default: LoginSolver?\n}\n\n/**\n * 属性 [sms] 为短信验证码验证方式, [fallback] 为其他验证方式.\n * 两个属性至少有一个不为 `null`, 在不为 `null` 时表示支持该验证方式. 可任意选用偏好的验证方式.\n *\n * 在使用时应该考虑未来有更新的情况. 未来服务器可能会增加一种新验证方式, 也有可能强制使用该验证方式,\n * 那么 [LoginSolver.onSolveDeviceVerification] 就应该抛出 [UnsupportedOperationException] 提示不支持该验证操作.\n *\n * @since 2.13\n */\n@NotStableForInheritance\npublic interface DeviceVerificationRequests {\n    /**\n     * 短信验证码方式. 在不为 `null` 时表示支持该验证方式.\n     */\n    public val sms: SmsRequest?\n\n    /**\n     * 其他验证方式. 在不为 `null` 时表示支持该验证方式.\n     */\n    public val fallback: FallbackRequest?\n\n    /**\n     * 服务器要求使用短信验证码. 此时可能仍可以尝试 [fallback].\n     */\n    public val preferSms: Boolean\n\n\n    /**\n     * 服务器要求短信验证时提供的账号绑定的手机信息. 使用 [requestSms] 来请求发送验证码.\n     *\n     * @since 2.13\n     * @see LoginSolver.onSolveDeviceVerification\n     */\n    @NotStableForInheritance\n    public interface SmsRequest {\n        /**\n         * 手机号归属国家代码, 如中国为 86.\n         * 在获取失败时会返回 `null`，但通常会获取到\n         */\n        public val countryCode: String?\n\n        /**\n         * 手机号码, 部分数字会被隐藏, 示例: `123*******1`.\n         * 在获取失败时会返回 `null`, 但通常会获取到\n         */\n        public val phoneNumber: String?\n\n        /**\n         * 请求服务器发送短信到验证手机号\n         *\n         * @throws RetryLaterException 当请求过于频繁, 服务器拒绝请求时抛出\n         */\n        @JvmBlockingBridge\n        public suspend fun requestSms()\n\n        /**\n         * 通知此请求已被解决. 获取 [DeviceVerificationResult] 用于返回 [LoginSolver.onSolveDeviceVerification].\n         */\n        public fun solved(code: String): DeviceVerificationResult\n    }\n\n    /**\n     * 其他验证方式.\n     *\n     * @since 2.13\n     * @see LoginSolver.onSolveDeviceVerification\n     */\n    @NotStableForInheritance\n    public interface FallbackRequest {\n        /**\n         * HTTP URL. 可能需要在 QQ 浏览器中打开并人工操作.\n         */\n        public val url: String\n\n        /**\n         * 通知此请求已被解决. 获取 [DeviceVerificationResult] 用于返回 [LoginSolver.onSolveDeviceVerification].\n         */\n        public fun solved(): DeviceVerificationResult\n    }\n}\n\n/**\n * 设备验证的验证结果. 请不要自行实现此接口, 而是通过解决 [DeviceVerificationRequests] 中的其中一种验证获得.\n *\n * @since 2.13\n * @see LoginSolver.onSolveDeviceVerification\n */\n@NotStableForInheritance\npublic interface DeviceVerificationResult\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/utils/MiraiLogger.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"Utils\")\n\npackage net.mamoe.mirai.utils\n\nimport me.him188.kotlin.dynamic.delegation.dynamicDelegation\nimport java.util.*\nimport kotlin.reflect.KClass\n\n/**\n * 给这个 logger 添加一个开关, 用于控制是否记录 log\n */\n@JvmOverloads\npublic fun MiraiLogger.withSwitch(default: Boolean = true): MiraiLoggerWithSwitch = MiraiLoggerWithSwitch(this, default)\n\n\n/**\n * 日志记录器.\n *\n * ## Mirai 日志系统\n *\n * Mirai 内建简单的日志系统, 即 [MiraiLogger]. [MiraiLogger] 的实现有 [SimpleLogger], [PlatformLogger], [SilentLogger].\n *\n * [MiraiLogger] 仅能处理简单的日志任务, 通常推荐使用 [SLF4J][org.slf4j.Logger], [LOG4J][org.apache.logging.log4j.Logger] 等日志库.\n *\n * ## 使用第三方日志库接管 Mirai 日志系统\n *\n * 使用 [LoggerAdapters], 将第三方日志 `Logger` 转为 [MiraiLogger]. 然后通过 [MiraiLogger.Factory] 提供实现.\n *\n * ## 实现或使用 [MiraiLogger]\n *\n * 不建议实现或使用 [MiraiLogger]. 请优先考虑使用上述第三方框架. [MiraiLogger] 仅应用于兼容旧版本代码.\n *\n * @see SimpleLogger 简易 logger, 它将所有的日志记录操作都转移给 lambda `(String?, Throwable?) -> Unit`\n * @see PlatformLogger 各个平台下的默认日志记录实现.\n * @see SilentLogger 忽略任何日志记录操作的 logger 实例.\n * @see LoggerAdapters\n *\n * @see MiraiLoggerPlatformBase 平台通用基础实现. 若 Mirai 自带的日志系统无法满足需求, 请继承这个类并实现其抽象函数.\n */\npublic interface MiraiLogger {\n\n    /**\n     * 可以 service 实现的方式覆盖.\n     *\n     * @since 2.7\n     */\n    public interface Factory {\n        /**\n         * 创建 [MiraiLogger] 实例.\n         *\n         * @param requester 请求创建 [MiraiLogger] 的对象的 class\n         * @param identity 对象标记 (备注)\n         */\n        public fun create(requester: KClass<*>, identity: String? = null): MiraiLogger =\n            this.create(requester.java, identity)\n\n        /**\n         * 创建 [MiraiLogger] 实例.\n         *\n         * @param requester 请求创建 [MiraiLogger] 的对象的 class\n         * @param identity 对象标记 (备注)\n         */\n        public fun create(requester: Class<*>, identity: String? = null): MiraiLogger\n\n        /**\n         * 创建 [MiraiLogger] 实例.\n         *\n         * @param requester 请求创建 [MiraiLogger] 的对象\n         */\n        public fun create(requester: KClass<*>): MiraiLogger = create(requester, null)\n\n        /**\n         * 创建 [MiraiLogger] 实例.\n         *\n         * @param requester 请求创建 [MiraiLogger] 的对象\n         */\n        public fun create(requester: Class<*>): MiraiLogger = create(requester, null)\n\n        public companion object INSTANCE :\n            Factory by dynamicDelegation({ MiraiLoggerFactoryImplementationBridge })\n    }\n\n    public companion object {\n        /**\n         * 顶层日志, 仅供 Mirai 内部使用.\n         */\n        @MiraiInternalApi\n        @MiraiExperimentalApi\n        @Deprecated(\"Deprecated.\", level = DeprecationLevel.HIDDEN) // deprecated since 2.7\n        @DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.10\", hiddenSince = \"2.11\")\n        public val TopLevel: MiraiLogger by lazy { Factory.create(MiraiLogger::class, \"Mirai\") }\n\n        /**\n         * 已弃用, 请实现 service [net.mamoe.mirai.utils.MiraiLogger.Factory] 并以 [ServiceLoader] 支持的方式提供.\n         */\n        @Deprecated(\n            \"Please set factory by providing an service of type net.mamoe.mirai.utils.MiraiLogger.Factory\",\n            level = DeprecationLevel.HIDDEN\n        ) // deprecated since 2.7\n        @JvmStatic\n        @DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.10\", hiddenSince = \"2.13\")\n        public fun setDefaultLoggerCreator(@Suppress(\"UNUSED_PARAMETER\") creator: (identity: String?) -> MiraiLogger) {\n            // nop\n\n\n//            DefaultFactoryOverrides.override { _, identity -> creator(identity) }\n        }\n\n        /**\n         * 旧版本用于创建 [MiraiLogger]. 已弃用. 请使用 [MiraiLogger.Factory.INSTANCE.create].\n         */\n        @Deprecated(\n            \"Please use MiraiLogger.Factory.create\", ReplaceWith(\n                \"MiraiLogger.Factory.create(YourClass::class, identity)\",\n                \"net.mamoe.mirai.utils.MiraiLogger\"\n            ), level = DeprecationLevel.HIDDEN\n        ) // deprecated since 2.7\n        @JvmStatic\n        @DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.10\", hiddenSince = \"2.11\")\n        public fun create(identity: String?): MiraiLogger = Factory.create(MiraiLogger::class, identity)\n    }\n\n    /**\n     * 日志的标记. 在 Mirai 中, identity 可为\n     * - \"Bot\"\n     * - \"BotNetworkHandler\"\n     * 等.\n     *\n     * 它只用于帮助调试或统计. 十分建议清晰定义 identity\n     */\n    public val identity: String?\n\n    /**\n     * 获取 [MiraiLogger] 是否已开启\n     *\n     * 除 [MiraiLoggerWithSwitch] 可控制开关外, 其他的所有 [MiraiLogger] 均一直开启.\n     */\n    public val isEnabled: Boolean\n\n    /**\n     * 当 VERBOSE 级别的日志启用时返回 `true`.\n     *\n     * 若 [isEnabled] 为 `false`, 返回 `false`.\n     * 在使用 [SLF4J][org.slf4j.Logger], [LOG4J][org.apache.logging.log4j.Logger] 或 [JUL][java.util.logging.Logger] 时返回真实配置值.\n     * 其他情况下返回 [isEnabled] 的值.\n     *\n     * @since 2.7\n     */\n    public val isVerboseEnabled: Boolean get() = isEnabled\n\n    /**\n     * 当 DEBUG 级别的日志启用时返回 `true`\n     *\n     * 若 [isEnabled] 为 `false`, 返回 `false`.\n     * 在使用 [SLF4J][org.slf4j.Logger], [LOG4J][org.apache.logging.log4j.Logger] 或 [JUL][java.util.logging.Logger] 时返回真实配置值.\n     * 其他情况下返回 [isEnabled] 的值.\n     *\n     * @since 2.7\n     */\n    public val isDebugEnabled: Boolean get() = isEnabled\n\n    /**\n     * 当 INFO 级别的日志启用时返回 `true`\n     *\n     * 若 [isEnabled] 为 `false`, 返回 `false`.\n     * 在使用 [SLF4J][org.slf4j.Logger], [LOG4J][org.apache.logging.log4j.Logger] 或 [JUL][java.util.logging.Logger] 时返回真实配置值.\n     * 其他情况下返回 [isEnabled] 的值.\n     *\n     * @since 2.7\n     */\n    public val isInfoEnabled: Boolean get() = isEnabled\n\n    /**\n     * 当 WARNING 级别的日志启用时返回 `true`\n     *\n     * 若 [isEnabled] 为 `false`, 返回 `false`.\n     * 在使用 [SLF4J][org.slf4j.Logger], [LOG4J][org.apache.logging.log4j.Logger] 或 [JUL][java.util.logging.Logger] 时返回真实配置值.\n     * 其他情况下返回 [isEnabled] 的值.\n     *\n     * @since 2.7\n     */\n    public val isWarningEnabled: Boolean get() = isEnabled\n\n    /**\n     * 当 ERROR 级别的日志启用时返回 `true`\n     *\n     * 若 [isEnabled] 为 `false`, 返回 `false`.\n     * 在使用 [SLF4J][org.slf4j.Logger], [LOG4J][org.apache.logging.log4j.Logger] 或 [JUL][java.util.logging.Logger] 时返回真实配置值.\n     * 其他情况下返回 [isEnabled] 的值.\n     *\n     * @since 2.7\n     */\n    public val isErrorEnabled: Boolean get() = isEnabled\n\n    @Suppress(\"UNUSED_PARAMETER\")\n    @Deprecated(\"follower 设计不佳, 请避免使用\", level = DeprecationLevel.HIDDEN) // deprecated since 2.7\n    @DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.10\", hiddenSince = \"2.11\")\n    public var follower: MiraiLogger?\n        get() = null\n        set(value) {}\n\n    /**\n     * 记录一个 `verbose` 级别的日志.\n     * 无关紧要的, 经常大量输出的日志应使用它.\n     */\n    public fun verbose(message: String?)\n\n    public fun verbose(e: Throwable?): Unit = verbose(null, e)\n    public fun verbose(message: String?, e: Throwable?)\n\n    /**\n     * 记录一个 _调试_ 级别的日志.\n     */\n    public fun debug(message: String?)\n\n    public fun debug(e: Throwable?): Unit = debug(null, e)\n    public fun debug(message: String?, e: Throwable?)\n\n\n    /**\n     * 记录一个 _信息_ 级别的日志.\n     */\n    public fun info(message: String?)\n\n    public fun info(e: Throwable?): Unit = info(null, e)\n    public fun info(message: String?, e: Throwable?)\n\n\n    /**\n     * 记录一个 _警告_ 级别的日志.\n     */\n    public fun warning(message: String?)\n\n    public fun warning(e: Throwable?): Unit = warning(null, e)\n    public fun warning(message: String?, e: Throwable?)\n\n\n    /**\n     * 记录一个 _错误_ 级别的日志.\n     */\n    public fun error(message: String?)\n\n    public fun error(e: Throwable?): Unit = error(null, e)\n    public fun error(message: String?, e: Throwable?)\n\n    /** 根据优先级调用对应函数 */\n\n    public fun call(priority: SimpleLogger.LogPriority, message: String? = null, e: Throwable? = null): Unit =\n        @OptIn(MiraiExperimentalApi::class) priority.correspondingFunction(this, message, e)\n\n    @Deprecated(\"plus 设计不佳, 请避免使用.\", level = DeprecationLevel.HIDDEN) // deprecated since 2.7\n    @DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.10\", hiddenSince = \"2.11\")\n    public operator fun <T : MiraiLogger> plus(follower: T): T = follower\n}\n\npublic inline fun MiraiLogger.verbose(message: () -> String) {\n    if (isVerboseEnabled) verbose(message())\n}\n\npublic inline fun MiraiLogger.verbose(message: () -> String, e: Throwable?) {\n    if (isVerboseEnabled) verbose(message(), e)\n}\n\npublic inline fun MiraiLogger.debug(message: () -> String?) {\n    if (isDebugEnabled) debug(message())\n}\n\npublic inline fun MiraiLogger.debug(message: () -> String?, e: Throwable?) {\n    if (isDebugEnabled) debug(message(), e)\n}\n\npublic inline fun MiraiLogger.info(message: () -> String?) {\n    if (isInfoEnabled) info(message())\n}\n\npublic inline fun MiraiLogger.info(message: () -> String?, e: Throwable?) {\n    if (isInfoEnabled) info(message(), e)\n}\n\npublic inline fun MiraiLogger.warning(message: () -> String?) {\n    if (isWarningEnabled) warning(message())\n}\n\npublic inline fun MiraiLogger.warning(message: () -> String?, e: Throwable?) {\n    if (isWarningEnabled) warning(message(), e)\n}\n\npublic inline fun MiraiLogger.error(message: () -> String?) {\n    if (isErrorEnabled) error(message())\n}\n\npublic inline fun MiraiLogger.error(message: () -> String?, e: Throwable?) {\n    if (isErrorEnabled) error(message(), e)\n}\n\n/**\n * 当前平台的默认的日志记录器.\n * - 在 _JVM 控制台_ 端的实现为 [println]\n * - 在 _Android_ 端的实现为 `android.util.Log`\n *\n *\n * 单条日志格式 (正则) 为:\n * ```regex\n * ^([\\w-]*\\s[\\w:]*)\\s(\\w)\\/(.*?):\\s(.+)$\n * ```\n * 其中 group 分别为: 日期与时间, 严重程度, [identity], 消息内容.\n *\n * 示例:\n * ```log\n * 2020-05-21 19:51:09 V/Bot 123456789: Send: OidbSvc.0x88d_7\n * ```\n *\n * 日期时间格式为 `yyyy-MM-dd HH:mm:ss`,\n *\n * 严重程度为 V, I, W, E. 分别对应 verbose, info, warning, error\n *\n * @see MiraiLogger.Factory.create\n */\n@MiraiInternalApi\npublic expect open class PlatformLogger @JvmOverloads constructor(\n    identity: String? = \"Mirai\",\n) : MiraiLoggerPlatformBase\n\n/**\n * 不做任何事情的 logger, keep silent.\n */\n@OptIn(MiraiInternalApi::class)\n@Suppress(\"unused\")\npublic object SilentLogger : PlatformLogger() {\n    public override val identity: String? = null\n\n    override val isEnabled: Boolean\n        get() = false\n    override val isVerboseEnabled: Boolean\n        get() = false\n    override val isDebugEnabled: Boolean\n        get() = false\n    override val isInfoEnabled: Boolean\n        get() = false\n    override val isWarningEnabled: Boolean\n        get() = false\n    override val isErrorEnabled: Boolean\n        get() = false\n\n    public override fun error0(message: String?): Unit = Unit\n    public override fun debug0(message: String?): Unit = Unit\n    public override fun warning0(message: String?): Unit = Unit\n    public override fun verbose0(message: String?): Unit = Unit\n    public override fun info0(message: String?): Unit = Unit\n\n    public override fun verbose0(message: String?, e: Throwable?): Unit = Unit\n    public override fun debug0(message: String?, e: Throwable?): Unit = Unit\n    public override fun info0(message: String?, e: Throwable?): Unit = Unit\n    public override fun warning0(message: String?, e: Throwable?): Unit = Unit\n    public override fun error0(message: String?, e: Throwable?): Unit = Unit\n}\n\n/**\n * 简易日志记录, 所有类型日志都会被重定向 [logger]\n */\npublic open class SimpleLogger(\n    public final override val identity: String?,\n    protected open val logger: (priority: LogPriority, message: String?, e: Throwable?) -> Unit\n) : MiraiLoggerPlatformBase() {\n\n    public enum class LogPriority(\n        @MiraiExperimentalApi public val nameAligned: String,\n        public val simpleName: String,\n        @MiraiExperimentalApi public val correspondingFunction: MiraiLogger.(message: String?, e: Throwable?) -> Unit\n    ) {\n        VERBOSE(\"VERBOSE\", \"V\", MiraiLogger::verbose),\n        DEBUG(\" DEBUG \", \"D\", MiraiLogger::debug),\n        INFO(\"  INFO \", \"I\", MiraiLogger::info),\n        WARNING(\"WARNING\", \"W\", MiraiLogger::warning),\n        ERROR(\" ERROR \", \"E\", MiraiLogger::error)\n    }\n\n    public companion object {\n        public inline operator fun invoke(crossinline logger: (message: String?, e: Throwable?) -> Unit): SimpleLogger =\n            SimpleLogger(null, logger)\n\n        public inline operator fun invoke(\n            identity: String?,\n            crossinline logger: (message: String?, e: Throwable?) -> Unit\n        ): SimpleLogger =\n            SimpleLogger(identity) { _, message, e ->\n                logger(message, e)\n            }\n\n        public operator fun invoke(logger: (priority: LogPriority, message: String?, e: Throwable?) -> Unit): SimpleLogger =\n            SimpleLogger(null, logger)\n    }\n\n    public override fun verbose0(message: String?): Unit = logger(LogPriority.VERBOSE, message, null)\n    public override fun verbose0(message: String?, e: Throwable?): Unit = logger(LogPriority.VERBOSE, message, e)\n    public override fun debug0(message: String?): Unit = logger(LogPriority.DEBUG, message, null)\n    public override fun debug0(message: String?, e: Throwable?): Unit = logger(LogPriority.DEBUG, message, e)\n    public override fun info0(message: String?): Unit = logger(LogPriority.INFO, message, null)\n    public override fun info0(message: String?, e: Throwable?): Unit = logger(LogPriority.INFO, message, e)\n    public override fun warning0(message: String?): Unit = logger(LogPriority.WARNING, message, null)\n    public override fun warning0(message: String?, e: Throwable?): Unit = logger(LogPriority.WARNING, message, e)\n    public override fun error0(message: String?): Unit = logger(LogPriority.ERROR, message, null)\n    public override fun error0(message: String?, e: Throwable?): Unit = logger(LogPriority.ERROR, message, e)\n}\n\n/**\n * 带有开关的 Logger. 仅能通过 [MiraiLogger.withSwitch] 构造\n *\n * @see enable 开启\n * @see disable 关闭\n */\n@Suppress(\"MemberVisibilityCanBePrivate\")\npublic class MiraiLoggerWithSwitch internal constructor(private val delegate: MiraiLogger, default: Boolean) :\n    MiraiLoggerPlatformBase() {\n    public override val identity: String? get() = delegate.identity\n\n    /**\n     * true 为开启.\n     */\n    @PublishedApi\n    internal var switch: Boolean = default\n\n    public override val isEnabled: Boolean get() = switch\n\n    public fun enable() {\n        switch = true\n    }\n\n    public fun disable() {\n        switch = false\n    }\n\n    public override fun verbose0(message: String?): Unit = delegate.verbose(message)\n    public override fun verbose0(message: String?, e: Throwable?): Unit = delegate.verbose(message, e)\n    public override fun debug0(message: String?): Unit = delegate.debug(message)\n    public override fun debug0(message: String?, e: Throwable?): Unit = delegate.debug(message, e)\n    public override fun info0(message: String?): Unit = delegate.info(message)\n    public override fun info0(message: String?, e: Throwable?): Unit = delegate.info(message, e)\n    public override fun warning0(message: String?): Unit = delegate.warning(message)\n    public override fun warning0(message: String?, e: Throwable?): Unit = delegate.warning(message, e)\n    public override fun error0(message: String?): Unit = delegate.error(message)\n    public override fun error0(message: String?, e: Throwable?): Unit = delegate.error(message, e)\n}\n\n/**\n * 日志基类.\n * 若 Mirai 自带的日志系统无法满足需求, 请继承这个类或 [PlatformLogger] 并实现其抽象函数.\n *\n * 这个类不应该被用作变量的类型定义. 只应被作为继承对象.\n * 在定义 logger 变量时, 请一直使用 [MiraiLogger] 或者 [MiraiLoggerWithSwitch].\n *\n * @see PlatformLogger\n * @see SimpleLogger\n */\n@Suppress(\"DEPRECATION_ERROR\")\npublic abstract class MiraiLoggerPlatformBase : MiraiLogger {\n    public override val isEnabled: Boolean get() = true\n\n    public final override fun verbose(message: String?) {\n        if (!isEnabled) return\n        verbose0(message)\n    }\n\n    public final override fun verbose(message: String?, e: Throwable?) {\n        if (!isEnabled) return\n        verbose0(message, e)\n    }\n\n    public final override fun debug(message: String?) {\n        if (!isEnabled) return\n        debug0(message)\n    }\n\n    public final override fun debug(message: String?, e: Throwable?) {\n        if (!isEnabled) return\n        debug0(message, e)\n    }\n\n    public final override fun info(message: String?) {\n        if (!isEnabled) return\n        info0(message)\n    }\n\n    public final override fun info(message: String?, e: Throwable?) {\n        if (!isEnabled) return\n        info0(message, e)\n    }\n\n    public final override fun warning(message: String?) {\n        if (!isEnabled) return\n        warning0(message)\n    }\n\n    public final override fun warning(message: String?, e: Throwable?) {\n        if (!isEnabled) return\n        warning0(message, e)\n    }\n\n    public final override fun error(message: String?) {\n        if (!isEnabled) return\n        error0(message)\n    }\n\n    public final override fun error(message: String?, e: Throwable?) {\n        if (!isEnabled) return\n        error0(message, e)\n    }\n\n    protected open fun verbose0(message: String?): Unit = verbose0(message, null)\n    protected abstract fun verbose0(message: String?, e: Throwable?)\n    protected open fun debug0(message: String?): Unit = debug0(message, null)\n    protected abstract fun debug0(message: String?, e: Throwable?)\n    protected open fun info0(message: String?): Unit = info0(message, null)\n    protected abstract fun info0(message: String?, e: Throwable?)\n    protected open fun warning0(message: String?): Unit = warning0(message, null)\n    protected abstract fun warning0(message: String?, e: Throwable?)\n    protected open fun error0(message: String?): Unit = error0(message, null)\n    protected abstract fun error0(message: String?, e: Throwable?)\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/utils/MiraiLoggerFactoryImplementationBridge.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.atomicfu.atomic\nimport kotlinx.atomicfu.loop\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.reflect.KClass\n\n/**\n * @since 2.13\n */\ninternal object MiraiLoggerFactoryImplementationBridge : MiraiLogger.Factory {\n    private var _instance by lateinitMutableProperty {\n        createPlatformInstance()\n    }\n\n    internal val instance get() = _instance\n\n    // It is required for MiraiConsole because default implementation\n    // queries stdout on every message printing\n    // It creates an infinite loop (StackOverflowError)\n    internal var defaultLoggerFactory: (() -> MiraiLogger.Factory) = ::DefaultFactory\n\n    fun createPlatformInstance() = loadService(MiraiLogger.Factory::class, defaultLoggerFactory)\n\n    private val frozen = atomic(false)\n\n    fun freeze(): Boolean {\n        return frozen.compareAndSet(expect = false, update = true)\n    }\n\n    @TestOnly\n    fun reinit() {\n        defaultLoggerFactory = ::DefaultFactory\n        frozen.loop { value ->\n            _instance = createPlatformInstance()\n            if (frozen.compareAndSet(value, false)) return\n        }\n    }\n\n    fun setInstance(instance: MiraiLogger.Factory) {\n        if (frozen.value) {\n            error(\n                \"LoggerFactory instance had been frozen, so it's impossible to override it.\" +\n                        \"If you are using Mirai Console and you want to override platform logging implementation, \" +\n                        \"please do so before initialization of MiraiConsole, that is, before `MiraiConsoleImplementation.start()`. \" +\n                        \"Plugins are not allowed to override logging implementation, and this is done in the very fundamental implementation of Mirai Console so there is no way to escape that.\" +\n                        \"Normally it is only sensible for Mirai Console frontend implementor to do that.\" +\n                        \"If you are just using mirai-core, this error should not happen. There should be no limitation in overriding logging implementation with mirai-core. \" +\n                        \"Check if you actually did use mirai-console somewhere, or please file an issue on https://github.com/mamoe/mirai/issues/new/choose\"\n            )\n        }\n        this._instance = instance\n    }\n\n    inline fun wrapCurrent(mapper: (current: MiraiLogger.Factory) -> MiraiLogger.Factory) {\n        contract { callsInPlace(mapper, InvocationKind.EXACTLY_ONCE) }\n        setInstance(this.instance.let(mapper))\n    }\n\n    override fun create(requester: KClass<*>, identity: String?): MiraiLogger {\n        return instance.create(requester, identity)\n    }\n\n    override fun create(requester: Class<*>, identity: String?): MiraiLogger {\n        return instance.create(requester, identity)\n    }\n\n    override fun create(requester: KClass<*>): MiraiLogger {\n        return instance.create(requester)\n    }\n\n    override fun create(requester: Class<*>): MiraiLogger {\n        return instance.create(requester)\n    }\n}\n\n\n// used by Mirai Console\nprivate class DefaultFactory : MiraiLogger.Factory {\n    @OptIn(MiraiInternalApi::class)\n    override fun create(requester: Class<*>, identity: String?): MiraiLogger {\n        return PlatformLogger(identity ?: requester.kotlin.simpleName ?: requester.simpleName)\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/utils/MiraiUtilsLogger.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\ninternal fun MiraiLogger.asUtilsLogger(): UtilsLogger = MiraiUtilsLogger(this)\n\ninternal class MiraiUtilsLogger(\n    private val miraiLogger: MiraiLogger,\n) : UtilsLogger {\n    override val isVerboseEnabled: Boolean\n        get() = miraiLogger.isVerboseEnabled\n    override val isDebugEnabled: Boolean\n        get() = miraiLogger.isDebugEnabled\n    override val isInfoEnabled: Boolean\n        get() = miraiLogger.isInfoEnabled\n    override val isWarningEnabled: Boolean\n        get() = miraiLogger.isWarningEnabled\n    override val isErrorEnabled: Boolean\n        get() = miraiLogger.isErrorEnabled\n\n    override fun verbose(message: String?, e: Throwable?) {\n        miraiLogger.verbose(message, e)\n    }\n\n    override fun debug(message: String?, e: Throwable?) {\n        miraiLogger.debug(message, e)\n    }\n\n    override fun info(message: String?, e: Throwable?) {\n        miraiLogger.info(message, e)\n    }\n\n    override fun warning(message: String?, e: Throwable?) {\n        miraiLogger.warning(message, e)\n    }\n\n    override fun error(message: String?, e: Throwable?) {\n        miraiLogger.error(message, e)\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/utils/OverFileSizeMaxException.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"Utils\")\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\n/**\n * 图片文件过大\n */ // 不要删除多平台结构, 这是 kotlin 的 bug\npublic class OverFileSizeMaxException : IllegalStateException()"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/utils/ProgressionCallback.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.coroutines.channels.SendChannel\nimport net.mamoe.mirai.contact.file.AbsoluteFile\nimport net.mamoe.mirai.utils.ProgressionCallback.Companion.asProgressionCallback\nimport kotlin.jvm.JvmStatic\n\n\n/**\n * 操作进度回调, 可供前端使用, 以提供进度显示.\n *\n * @param S subject, 操作对象, 如 [AbsoluteFile]\n * @param P progression, 用于提示进度. 如当下载文件时为已下载文件大小字节数 [Long].\n *\n * @see asProgressionCallback\n *\n * @since 2.8\n */\npublic interface ProgressionCallback<in S, in P> {\n    /**\n     * 当操作开始时调用\n     */\n    public fun onBegin(subject: S, resource: ExternalResource) {}\n\n    /**\n     * 每当有进度更新时调用. 此方法可能会同时被多个线程调用.\n     */\n    public fun onProgression(subject: S, resource: ExternalResource, progression: P) {}\n\n    /**\n     * 当操作成功时调用.\n     *\n     * 在默认实现下只会由 [onFinished] 调用\n     */\n    public fun onSuccess(subject: S, resource: ExternalResource, progression: P) {}\n\n    /**\n     * 当操作以异常失败时调用.\n     *\n     * 在默认实现下只会由 [onFinished] 调用\n     */\n    public fun onFailure(subject: S, resource: ExternalResource, exception: Throwable) {}\n\n    /**\n     * 当操作完成时调用.\n     */\n    public fun onFinished(subject: S, resource: ExternalResource, result: Result<P>) {\n        result.fold(\n            onSuccess = { onSuccess(subject, resource, it) },\n            onFailure = { onFailure(subject, resource, it) },\n        )\n    }\n\n    public companion object {\n        /**\n         * 将一个 [SendChannel] 作为 [ProgressionCallback] 使用.\n         *\n         * ## 下载文件的使用示例\n         *\n         * 每当有进度更新, 已下载的字节数都会被[发送][SendChannel.offer]到 [SendChannel] 中.\n         * 进度的发送会通过 [offer][SendChannel.offer], 而不是通过 [send][SendChannel.send]. 意味着 [SendChannel] 通常要实现缓存.\n         *\n         * 若 [closeOnFinish] 为 `true`, 当下载完成 (无论是失败还是成功) 时会 [关闭][SendChannel.close] [SendChannel].\n         *\n         * 使用示例:\n         * ```\n         * val progress = Channel<Long>(Channel.BUFFERED)\n         *\n         * launch {\n         *   // 每 3 秒发送一次操作进度百分比\n         *   progress.receiveAsFlow().sample(Duration.seconds(3)).collect { bytes ->\n         *     group.sendMessage(\"File upload: ${(bytes.toDouble() / resource.size * 100).toInt() / 100}%.\") // 保留 2 位小数\n         *   }\n         * }\n         *\n         * group.files.uploadNewFile(\"/foo.txt\", resource, callback = progress.asProgressionCallback(true))\n         * group.sendMessage(\"File uploaded successfully.\")\n         * ```\n         *\n         * 直接使用 [ProgressionCallback] 也可以实现示例这样的功能, [asProgressionCallback] 是为了简化操作.\n         */\n        @JvmStatic\n        public fun <S, P> SendChannel<P>.asProgressionCallback(closeOnFinish: Boolean = true): ProgressionCallback<S, P> {\n            return object : ProgressionCallback<S, P> {\n                override fun onProgression(subject: S, resource: ExternalResource, progression: P) {\n                    trySend(progression)\n                }\n\n                override fun onFinished(subject: S, resource: ExternalResource, result: Result<P>) {\n                    if (closeOnFinish) this@asProgressionCallback.close(result.exceptionOrNull())\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/utils/RemoteFile.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"unused\", \"DEPRECATION\", \"DEPRECATION_ERROR\")\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.coroutines.channels.SendChannel\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.emptyFlow\nimport kotlinx.coroutines.flow.toList\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.contact.FileSupported\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.file.AbsoluteFile\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.FileMessage\nimport net.mamoe.mirai.message.data.sendTo\nimport net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource\nimport net.mamoe.mirai.utils.RemoteFile.Companion.uploadFile\nimport net.mamoe.mirai.utils.RemoteFile.ProgressionCallback.Companion.asProgressionCallback\nimport java.io.File\n\n/**\n * 表示一个远程文件或目录.\n *\n * # 注意: 此 API 已弃用, 请使用 [AbsoluteFile] 代替.\n *\n * [RemoteFile] 仅保存 [id], [name], [path], [parent], [contact] 这五个属性, 除获取这些属性外的所有的操作都是在*远程*完成的.\n * 意味着操作的结果会因文件或目录在服务器中的状态变化而变化.\n *\n * 与 [File] 类似, [RemoteFile] 是不可变的. [renameTo] 和 [copyTo] 会操作远程文件, 但不会修改当前 [RemoteFile.path] 等属性.\n *\n * ## 文件操作\n *\n * 所有文件操作都在 [RemoteFile] 对象中完成. 可通过 [FileSupported.filesRoot] 获取到表示根目录路径的 [RemoteFile], 并通过 [resolve] 获取到其内文件.\n *\n * 示例:\n * ```\n * val file1: RemoteFile = group.filesRoot.resolve(\"/foo.txt\") // 获取表示群文件 \"foo.txt\" 的 RemoteFile 实例\n * val file2: RemoteFile = group.filesRoot.resolve(\"/dir/foo.txt\") // 获取表示群文件目录 \"dir\" 中的 \"foo.txt\" 的 RemoteFile 实例\n *\n *\n * val downloadInfo = file1.getDownloadInfo() // 获取该文件的下载方式, 可以自行下载\n *\n *\n * val message: FileMessage = file2.upload(resource) // 向路径 \"/dir/foo.txt\" 上传一个文件, 返回可以发送到群内的文件消息.\n * group.sendMessage(message) // 发送文件消息到群, 用户才会收到机器人上传文件的提醒. 可以多次发送.\n *\n * file2.uploadAndSend(resource) // 上传文件并发送文件消息. 是上面两行的简单版本.\n *\n *\n * // 要直接上传文件, 也可以简单地使用任一:\n * group.uploadFile(\"/foo.txt\", resource) // Kotlin\n * resource.uploadAsFileTo(group, \"/foo.txt\") // Kotlin\n * FileSupported.uploadFile(group, \"/foo.txt\", resource\"); // Java\n * ExternalResource.uploadAsFile(resource, group, \"/foo.txt\") // Java\n * ```\n *\n * ## 目录操作\n * [RemoteFile] 类似于 [java.io.File], 也可以表示一个目录.\n * ```\n * val dir: RemoteFile = group.filesRoot.resolve(\"/foo\") // 获取表示目录 \"foo\" 的 RemoteFile 实例\n *\n * if (dir.exists()) { // 判断目录是否存在\n *   // ...\n * }\n *\n * dir.listFiles() // Kotlin 使用, 获取该目录中的文件列表.\n * dir.listFilesIterator() // Java 使用, 获取该目录中的文件列表.\n * ```\n *\n * 注意, 服务器目前只支持一层目录. 即只能存在 \"/foo.txt\" 和 \"/xxx/foo.txt\", 而 \"/xxx/xxx/foo.txt\" 不受支持.\n *\n * ## 文件名和目录名可重复\n *\n * 服务器允许相同名称的文件或目录存在, 这就导致 \"/foo\" 可能表示多个重名文件中的一个, 也可能表示一个目录. 依靠路径的判断因此不可靠.\n *\n * 这个特性带来的行为有:\n * - [`FileSupported.uploadFile`][uploadFile] 总是往一个路径上传文件, 如果有同名文件存在, 不会覆盖, 而是再创建一个同名文件.\n * - [delete] 可能会删除重名文件中的任何一个, 也可能会删除一个目录, 操作顺序取决于服务器.\n *\n * 为了解决这个问题, [RemoteFile] 可以拥有一个由服务器分配的固定的唯一识别号 [RemoteFile.id].\n *\n * 通过 [listFiles] 获取到的 [RemoteFile] 都拥有非 `null` 的 [id].\n * 服务器可以通过 [id] 准确定位重名文件中的某一个.\n * 对这样的文件进行 [upload] 时将会覆盖目标文件 (如果存在), 进行 [delete] 时也只会准确操作目标文件.\n *\n * 只要文件内容无变化, 文件的 [id] 就不会变更. 可以保存 [RemoteFile.id] 并在以后通过 [RemoteFile.resolveById] 准确获取一个目标文件.\n *\n * @suppress 使用 [RemoteFile] 是稳定的, 但不应该自行实现这个接口.\n * @see FileSupported\n * @since 2.5\n */\n@Deprecated(\n    \"Please use RemoteFiles and AbsoluteFileFolder form fileSupported.files\",\n    level = DeprecationLevel.ERROR\n) // deprecated since 2.8.0-RC\n@DeprecatedSinceMirai(warningSince = \"2.8\", errorSince = \"2.14\")\n@NotStableForInheritance\npublic interface RemoteFile {\n    /**\n     * 文件名或目录名.\n     */\n    public val name: String\n\n    /**\n     * 文件的 ID. 群文件允许重名, ID 非空时用来区分重名.\n     */\n    public val id: String?\n\n    /**\n     * 标准的绝对路径, 起始字符为 '/'. 如 `/foo/bar.txt`.\n     *\n     * 根目录路径为 [ROOT_PATH]\n     */\n    public val path: String\n\n    /**\n     * 获取父目录, 当 [RemoteFile] 表示根目录时返回 `null`\n     */\n    public val parent: RemoteFile?\n\n    /**\n     * 此文件所属的群或好友\n     */\n    public val contact: FileSupported\n\n    /**\n     * 当 [RemoteFile] 表示一个文件时返回 `true`.\n     */\n    public suspend fun isFile(): Boolean\n\n    /**\n     * 当 [RemoteFile] 表示一个目录时返回 `true`.\n     */\n    public suspend fun isDirectory(): Boolean = !isFile()\n\n    /**\n     * 获取文件长度. 当 [RemoteFile] 表示一个目录时行为不确定.\n     */\n    public suspend fun length(): Long\n\n    @Deprecated(\"RemoteFile is deprecated. Use RemoteFiles instead.\", level = DeprecationLevel.ERROR)\n    @DeprecatedSinceMirai(errorSince = \"2.14\") // 在弃用 RemoteFile 的时候忘了弃用这个类, 所以它没有 warningSince\n    public class FileInfo @MiraiInternalApi constructor(\n        /**\n         * 文件或目录名.\n         */\n        public val name: String,\n        /**\n         * 唯一识别标识.\n         */\n        public val id: String,\n        /**\n         * 标准绝对路径.\n         */\n        public val path: String,\n        /**\n         * 文件长度 (大小) bytes, 目录的 [length] 为 0.\n         */\n        public val length: Long,\n        /**\n         * 下载次数. 目录没有下载次数, 此属性总是 `0`.\n         */\n        public val downloadTimes: Int,\n        /**\n         * 上传者 ID. 目录没有上传者, 此属性总是 `0`.\n         */\n        public val uploaderId: Long,\n        /**\n         * 上传的时间. 目录没有上传时间, 此属性总是 `0`.\n         */\n        public val uploadTime: Long,\n        /**\n         * 上次修改时间. 时间戳秒.\n         */\n        public val lastModifyTime: Long,\n        public val sha1: ByteArray,\n        public val md5: ByteArray,\n    ) {\n        /**\n         * 根据 [FileInfo.id] 或 [FileInfo.path] 获取到对应的 [RemoteFile].\n         */\n        public suspend fun resolveToFile(contact: FileSupported): RemoteFile =\n            contact.filesRoot.resolveById(id) ?: contact.filesRoot.resolve(path)\n    }\n\n    /**\n     * 获取这个文件或目录**此时**的详细信息. 当文件或目录不存在时返回 `null`.\n     */\n    public suspend fun getInfo(): FileInfo?\n\n    /**\n     * 当文件或目录存在时返回 `true`.\n     */\n    public suspend fun exists(): Boolean\n\n    /**\n     * @return [path]\n     */\n    public override fun toString(): String\n\n    ///////////////////////////////////////////////////////////////////////////\n    // resolve\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 获取该目录的子文件. 不会检查 [RemoteFile] 是否表示一个目录.\n     *\n     * @param relative  相对路径. 当初始字符为 '/' 时将作为绝对路径解析\n     * @see File.resolve stdlib 内的类似函数\n     */\n    public fun resolve(relative: String): RemoteFile\n\n    /**\n     * 获取该目录的子文件. 不会检查 [RemoteFile] 是否表示一个目录. 返回的 [RemoteFile.id] 将会与 `relative.id` 相同.\n     *\n     * @param relative 相对路径. 当 [RemoteFile.path] 初始字符为 '/' 时将作为绝对路径解析\n     * @see File.resolve stdlib 内的类似函数\n     */\n    public fun resolve(relative: RemoteFile): RemoteFile\n\n    /**\n     * 获取该目录下的 ID 为 [id] 的文件, 当 [deep] 为 `true` 时还会进入子目录继续寻找这样的文件. 在不存在时返回 `null`.\n     * @see resolve\n     */\n    @Suppress(\"_FUNCTION_WITH_DEFAULT_ARGUMENTS\") // JVM ABI\n    public suspend fun resolveById(id: String, deep: Boolean = true): RemoteFile?\n\n    /**\n     * 获取该目录或子目录下的 ID 为 [id] 的文件, 在不存在时返回 `null`\n     * @see resolve\n     */\n    public suspend fun resolveById(id: String): RemoteFile? = resolveById(id, deep = true)\n\n    /**\n     * 获取父目录的子文件. 如 `RemoteFile(\"/foo/bar\").resolveSibling(\"gav\")` 为 `RemoteFile(\"/foo/gav\")`.\n     * 不会检查 [RemoteFile] 是否表示一个目录.\n     *\n     * @param relative 当初始字符为 '/' 时将作为绝对路径解析\n     * @see File.resolveSibling stdlib 内的类似函数\n     */\n    public fun resolveSibling(relative: String): RemoteFile\n\n    /**\n     * 获取父目录的子文件. 如 `RemoteFile(\"/foo/bar\").resolveSibling(\"gav\")` 为 `RemoteFile(\"/foo/gav\")`.\n     * 不会检查 [RemoteFile] 是否表示一个目录. 返回的 [RemoteFile.id] 将会与 `relative.id` 相同.\n     *\n     * @param relative 当 [RemoteFile.path] 初始字符为 '/' 时将作为绝对路径解析\n     * @see File.resolveSibling stdlib 内的类似函数\n     */\n    public fun resolveSibling(relative: RemoteFile): RemoteFile\n\n    ///////////////////////////////////////////////////////////////////////////\n    // operations\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 删除这个文件或目录. 若目录非空, 则会删除目录中的所有文件. 操作目录或非 Bot 自己上传的文件时需要管理员权限, 无管理员权限时返回 `false`.\n     */\n    public suspend fun delete(): Boolean\n\n    /**\n     * 重命名这个文件或目录, 将会更改 [RemoteFile.name] 属性值.\n     * 操作非 Bot 自己上传的文件时需要管理员权限.\n     *\n     * [renameTo] 只会操作远程文件, 而不会修改当前 [RemoteFile.path].\n     */\n    public suspend fun renameTo(name: String): Boolean\n\n    /**\n     * 将这个目录或文件移动到 [target] 位置. 操作目录或非 Bot 自己上传的文件时需要管理员权限, 无管理员权限时返回 `false`.\n     *\n     * [moveTo] 只会操作远程文件, 而不会修改当前 [RemoteFile.path].\n     *\n     * **注意**: 与 [java.io.File] 类似, 这是将当前 [RemoteFile] 移动到作为 [target], 而不是移动成为 [target] 的子文件或目录. 例如:\n     * ```\n     * val root = group.filesRoot\n     * root.resolve(\"test.txt\").moveTo(root) // 错误! 这是在将该文件的路径 \"test.txt\" 修改为 “/” , 而不是修改为 \"/test.txt\"\n     * root.resolve(\"test.txt\").moveTo(root.resolve(\"/\")) // 错误! 与上一行相同.\n\n     * root.resolve(\"/test.txt\").moveTo(root.resolve(\"/test2.txt\")) // 正确. 将该文件的路径 \"/test.txt\" 修改为 “/test2.txt”，相当于重命名文件\n     * ```\n     *\n     * @param target 目标文件位置.\n     */\n    public suspend fun moveTo(target: RemoteFile): Boolean\n\n    /**\n     * 将这个目录或文件移动到另一个位置. 操作目录或非 Bot 自己上传的文件时需要管理员权限, 无管理员权限时返回 `false`.\n     *\n     * [moveTo] 只会操作远程文件, 而不会修改当前 [RemoteFile.path].\n     *\n     * **已弃用:** 当 [path] 是绝对路径时, 这个函数运行正常;\n     * 当它是相对路径时, 将会尝试把当前文件移动到 [RemoteFile.path] 下的子路径 [path], 因此总是失败.\n     *\n     * 使用参数为 [RemoteFile] 的 [moveTo] 代替.\n     *\n     * @suppress 在 2.6 弃用. 请使用 [moveTo]\n     */\n    @Deprecated(\n        \"Use moveTo(RemoteFile) instead.\",\n        replaceWith = ReplaceWith(\"this.moveTo(this.resolveSibling(path))\"),\n        level = DeprecationLevel.ERROR\n    ) // deprecated since 2.7\n    @DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.10\")\n    public suspend fun moveTo(path: String): Boolean {\n        // Impl notes:\n        // if `path` is absolute, this works as intended.\n        // if not, `resolve(path)` will be a child path from this dir and fails always.\n        return moveTo(resolve(path))\n    }\n\n    /**\n     * 创建目录. 目录已经存在或无管理员权限时返回 `false`.\n     *\n     * 创建后 [isDirectory] 也不一定会返回 `true`.\n     * 当 [id] 未指定时, [RemoteFile] 总是表示一个路径而无法确定目标是文件还是目录, [isFile] 或 [isDirectory] 结果取决于服务器.\n     */\n    public suspend fun mkdir(): Boolean\n\n    /**\n     * 获取该目录下所有文件, 返回的 [RemoteFile] 都拥有 [RemoteFile.id] 用于区分重名文件或目录. 当 [RemoteFile] 表示一个文件时返回 [emptyFlow].\n     *\n     * 返回的 [Flow] 是*冷*的, 只会在被需要的时候向服务器查询.\n     */\n    public suspend fun listFiles(): Flow<RemoteFile>\n\n    /**\n     * 获取该目录下所有文件, 返回的 [RemoteFile] 都拥有 [RemoteFile.id] 用于区分重名文件或目录. 当 [RemoteFile] 表示一个文件时返回空迭代器.\n     * @param lazy 为 `true` 时惰性获取, 为 `false` 时立即获取全部文件列表.\n     */\n    @JavaFriendlyAPI\n    public suspend fun listFilesIterator(lazy: Boolean): Iterator<RemoteFile>\n\n    /**\n     * 获取该目录下所有文件, 返回的 [RemoteFile] 都拥有 [RemoteFile.id] 用于区分重名文件或目录. 当 [RemoteFile] 表示一个文件时返回 [emptyList].\n     */\n    public suspend fun listFilesCollection(): List<RemoteFile> = listFiles().toList()\n\n    /**\n     * 得到相应文件消息. 当 [RemoteFile] 表示一个目录或文件不存在时返回 `null`.\n     */\n    public suspend fun toMessage(): FileMessage?\n\n    ///////////////////////////////////////////////////////////////////////////\n    // upload & download\n    ///////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 上传进度回调, 可供前端使用, 以提供进度显示.\n     * @see asProgressionCallback\n     */\n    @Deprecated(\n        \"Deprecated without replacement. Please use AbsoluteFolder.uploadNewFile\",\n        ReplaceWith(\"contact.files.uploadNewFile(path, this, callback)\"),\n        level = DeprecationLevel.ERROR\n    ) // deprecated since 2.8.0-RC\n    @DeprecatedSinceMirai(warningSince = \"2.8\", errorSince = \"2.14\")\n    public interface ProgressionCallback {\n        /**\n         * 当上传开始时调用\n         */\n        public fun onBegin(file: RemoteFile, resource: ExternalResource) {}\n\n        /**\n         * 每当有进度更新时调用. 此方法可能会同时被多个线程调用.\n         *\n         * 提示: 可通过 [ExternalResource.size] 获取文件总大小.\n         */\n        public fun onProgression(file: RemoteFile, resource: ExternalResource, downloadedSize: Long) {}\n\n        /**\n         * 当上传成功时调用\n         */\n        public fun onSuccess(file: RemoteFile, resource: ExternalResource) {}\n\n        /**\n         * 当上传以异常失败时调用\n         */\n        public fun onFailure(file: RemoteFile, resource: ExternalResource, exception: Throwable) {}\n\n        @Deprecated(\"RemoteFile is deprecated. Use RemoteFiles instead.\", level = DeprecationLevel.ERROR)\n        @DeprecatedSinceMirai(errorSince = \"2.14\") // 在弃用 RemoteFile 的时候忘了弃用这个类, 所以它没有 warningSince\n        public companion object {\n            /**\n             * 将一个 [SendChannel] 作为 [ProgressionCallback] 使用.\n             *\n             * 每当有进度更新, 已下载的字节数都会被[发送][SendChannel.offer]到 [SendChannel] 中.\n             * 进度的发送会通过 [offer][SendChannel.offer], 而不是通过 [send][SendChannel.send]. 意味着 [SendChannel] 通常要实现缓存.\n             *\n             * 若 [closeOnFinish] 为 `true`, 当下载完成 (无论是失败还是成功) 时会 [关闭][SendChannel.close] [SendChannel].\n             *\n             * 使用示例:\n             * ```\n             * val progress = Channel<Long>(Channel.BUFFERED)\n             *\n             * launch {\n             *   // 每 3 秒发送一次上传进度百分比\n             *   progress.receiveAsFlow().sample(3.seconds).collect { bytes ->\n             *     group.sendMessage(\"File upload: ${(bytes.toDouble() / resource.size * 100).toInt() / 100}%.\") // 保留 2 位小数\n             *   }\n             * }\n             *\n             * group.filesRoot.resolve(\"/foo.txt\").upload(resource, progress.asProgressionCallback(true))\n             * group.sendMessage(\"File uploaded successfully.\")\n             * ```\n             *\n             * 直接使用 [ProgressionCallback] 也可以实现示例这样的功能, [asProgressionCallback] 是为了简化操作.\n             */\n            @JvmStatic\n            public fun SendChannel<Long>.asProgressionCallback(closeOnFinish: Boolean = false): ProgressionCallback {\n                return object : ProgressionCallback {\n                    override fun onProgression(file: RemoteFile, resource: ExternalResource, downloadedSize: Long) {\n                        trySend(downloadedSize)\n                    }\n\n                    override fun onSuccess(file: RemoteFile, resource: ExternalResource) {\n                        if (closeOnFinish) this@asProgressionCallback.close()\n                    }\n\n                    override fun onFailure(file: RemoteFile, resource: ExternalResource, exception: Throwable) {\n                        if (closeOnFinish) this@asProgressionCallback.close(exception)\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * 上传文件到 [RemoteFile] 表示的路径, 上传过程中调用 [callback] 传递进度.\n     *\n     * 上传后不会发送文件消息, 即官方客户端只能在 \"群文件\" 中查看文件.\n     * 可通过 [toMessage] 获取到文件消息并通过 [Group.sendMessage] 发送, 或使用 [uploadAndSend].\n     *\n     * ## 已弃用\n     *\n     * 使用 [sendFile] 代替. 本函数会上传文件但不会发送文件消息.\n     * 不发送文件消息就导致其他操作都几乎不能完成, 而且经反馈, 用户通常会忘记后续的 [RemoteFile.toMessage] 操作.\n     * 本函数造成了很大的不必要的迷惑, 故以既上传又发送消息的, 与官方客户端行为相同的 [sendFile] 代替.\n     *\n     * 相关问题: [#1250: 群文件在上传后 toRemoteFile 返回 null](https://github.com/mamoe/mirai/issues/1250)\n     *\n     *\n     * **注意**: [resource] 仅表示资源数据, 而不带有文件名属性.\n     * 与 [java.io.File] 类似, [upload] 是将 [resource] 上传成为 [this][RemoteFile], 而不是上传成为 [this][RemoteFile] 的子文件. 示例:\n     * ```\n     * group.filesRoot.upload(resource) // 错误! 这是在把资源上传成为根目录.\n     * group.filesRoot.resolve(\"/\").upload(resource) // 错误! 与上一句相同, 这是在把资源上传成为根目录.\n     *\n     * val root = group.filesRoot\n     * root.resolve(\"test.txt\").upload(resource) // 正确. 把资源上传成为根目录下的 \"test.txt\".\n     * root.resolve(\"/test.txt\").upload(resource) // 正确. 与上一句相同, 把资源上传成为根目录下的 \"test.txt\".\n     * ```\n     *\n     * @param resource 需要上传的文件资源. 无论上传是否成功, 本函数都不会关闭 [resource].\n     * @param callback 进度回调\n     * @throws IllegalStateException 该文件上传失败或权限不足时抛出\n     */\n    @Deprecated(\n        \"Use uploadAndSend instead.\", ReplaceWith(\"this.uploadAndSend(resource, callback)\"), DeprecationLevel.ERROR\n    ) // deprecated since 2.7-M1\n    @DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.10\") // left ERROR intentionally\n    @Suppress(\"_FUNCTION_WITH_DEFAULT_ARGUMENTS\")\n    public suspend fun upload(\n        resource: ExternalResource,\n        callback: ProgressionCallback? = null,\n    ): FileMessage\n\n    /**\n     * 上传文件到 [RemoteFile.path] 表示的路径.\n     * ## 已弃用\n     * 阅读 [upload] 获取更多信息\n     * @see upload\n     */\n    @Suppress(\"DEPRECATION_ERROR\")\n    @Deprecated(\n        \"Use uploadAndSend instead.\", ReplaceWith(\"this.uploadAndSend(resource)\"), DeprecationLevel.ERROR\n    )  // deprecated since 2.7-M1\n    @DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.10\") // left ERROR intentionally\n    public suspend fun upload(resource: ExternalResource): FileMessage = upload(resource, null)\n\n    /**\n     * 上传文件.\n     * ## 已弃用\n     * 阅读 [upload] 获取更多信息\n     * @see upload\n     */\n    @Suppress(\"DEPRECATION_ERROR\")\n    @Deprecated(\n        \"Use uploadAndSend instead.\", ReplaceWith(\"this.uploadAndSend(file, callback)\"), DeprecationLevel.ERROR\n    ) // deprecated since 2.7-M1\n    @DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.10\") // left ERROR intentionally\n    public suspend fun upload(\n        file: File,\n        callback: ProgressionCallback? = null,\n    ): FileMessage = file.toExternalResource().use { upload(it, callback) }\n\n    /**\n     * 上传文件.\n     * ## 已弃用\n     * 阅读 [upload] 获取更多信息\n     * @see upload\n     */\n    @Suppress(\"DEPRECATION_ERROR\")\n    @Deprecated(\n        \"Use sendFile instead.\", ReplaceWith(\"this.uploadAndSend(file)\"), DeprecationLevel.ERROR\n    ) // deprecated since 2.7-M1\n    @DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.10\") // left ERROR intentionally\n    public suspend fun upload(file: File): FileMessage = file.toExternalResource().use { upload(it) }\n\n    /**\n     * 上传文件并发送文件消息.\n     *\n     * 若 [RemoteFile.id] 存在且旧文件存在, 将会覆盖旧文件.\n     * 即使用 [resolve] 或 [resolveSibling] 获取到的 [RemoteFile] 的 [upload] 总是上传一个新文件,\n     * 而使用 [resolveById] 或 [listFiles] 获取到的总是覆盖旧文件, 当旧文件已在远程删除时上传一个新文件.\n     *\n     * @param resource 需要上传的文件资源. 无论上传是否成功, 本函数都不会关闭 [resource].\n     * @see upload\n     */\n    @MiraiExperimentalApi\n    public suspend fun uploadAndSend(resource: ExternalResource): MessageReceipt<Contact>\n\n    /**\n     * 上传文件并发送文件消息.\n     * @see uploadAndSend\n     */\n    @MiraiExperimentalApi\n    public suspend fun uploadAndSend(file: File): MessageReceipt<Contact> =\n        file.toExternalResource().use { uploadAndSend(it) }\n\n    /**\n     * 获取文件下载链接, 当文件不存在或 [RemoteFile] 表示一个目录时返回 `null`\n     */\n    public suspend fun getDownloadInfo(): DownloadInfo?\n\n    @Deprecated(\"RemoteFile is deprecated. Use RemoteFiles instead.\", level = DeprecationLevel.ERROR)\n    @DeprecatedSinceMirai(errorSince = \"2.14\") // 在弃用 RemoteFile 的时候忘了弃用这个类, 所以它没有 warningSince\n    public class DownloadInfo @MiraiInternalApi constructor(\n        /**\n         * @see RemoteFile.name\n         */\n        public val filename: String,\n        /**\n         * @see RemoteFile.id\n         */\n        public val id: String,\n        /**\n         * 标准绝对路径\n         * @see RemoteFile.path\n         */\n        public val path: String,\n        /**\n         * HTTP or HTTPS URL\n         */\n        public val url: String,\n        public val sha1: ByteArray,\n        public val md5: ByteArray,\n    ) {\n        override fun toString(): String {\n            return \"DownloadInfo(filename='$filename', path='$path', url='$url', sha1=${sha1.toUHexString(\"\")}, \" +\n                    \"md5=${md5.toUHexString(\"\")})\"\n        }\n    }\n\n    @Deprecated(\"RemoteFile is deprecated. Use RemoteFiles instead.\", level = DeprecationLevel.ERROR)\n    @DeprecatedSinceMirai(errorSince = \"2.14\") // 在弃用 RemoteFile 的时候忘了弃用这个类, 所以它没有 warningSince\n    public companion object {\n        /**\n         * 根目录路径\n         * @see RemoteFile.path\n         */\n        public const val ROOT_PATH: String = \"/\"\n\n        /**\n         * 上传文件并获取文件消息, 但不发送.\n         *\n         * ## 已弃用\n         * 在 [upload] 获取更多信息\n         *\n         * @param path 远程路径. 起始字符为 '/'. 如 '/foo/bar.txt'\n         * @param resource 需要上传的文件资源. 无论上传是否成功, 本函数都不会关闭 [resource].\n         * @see RemoteFile.upload\n         */\n        @JvmStatic\n        @JvmOverloads\n        @Deprecated(\n            \"Use sendFile instead.\",\n            ReplaceWith(\n                \"this.sendFile(path, resource, callback)\",\n                \"net.mamoe.mirai.utils.RemoteFile.Companion.sendFile\"\n            ),\n            level = DeprecationLevel.ERROR\n        ) // deprecated since 2.7-M1\n        @DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.10\")\n        @Suppress(\"_FUNCTION_WITH_DEFAULT_ARGUMENTS\")\n        public suspend fun FileSupported.uploadFile(\n            path: String,\n            resource: ExternalResource,\n            callback: ProgressionCallback? = null,\n        ): FileMessage =\n            @Suppress(\"DEPRECATION\", \"DEPRECATION_ERROR\") this.filesRoot.resolve(path).upload(resource, callback)\n\n        /**\n         * 上传文件并获取文件消息, 但不发送.\n         * ## 已弃用\n         * 阅读 [uploadFile] 获取更多信息.\n         *\n         * @param path 远程路径. 起始字符为 '/'. 如 '/foo/bar.txt'\n         * @see RemoteFile.upload\n         */\n        @JvmStatic\n        @JvmOverloads\n        @Deprecated(\n            \"Use sendFile instead.\",\n            ReplaceWith(\n                \"this.sendFile(path, file, callback)\",\n                \"net.mamoe.mirai.utils.RemoteFile.Companion.sendFile\"\n            ),\n            level = DeprecationLevel.ERROR\n        ) // deprecated since 2.7-M1\n        @DeprecatedSinceMirai(warningSince = \"2.7\", errorSince = \"2.10\") // left ERROR intentionally\n        public suspend fun FileSupported.uploadFile(\n            path: String,\n            file: File,\n            callback: ProgressionCallback? = null,\n        ): FileMessage =\n            @Suppress(\"DEPRECATION\", \"DEPRECATION_ERROR\") this.filesRoot.resolve(path).upload(file, callback)\n\n        /**\n         * 上传文件并发送文件消息到相关 [FileSupported].\n         * @param resource 需要上传的文件资源. 无论上传是否成功, 本函数都不会关闭 [resource].\n         * @see RemoteFile.uploadAndSend\n         */\n        @JvmStatic\n        @JvmOverloads\n        @Deprecated(\n            \"Deprecated. Please use AbsoluteFolder.uploadNewFile or RemoteFiles.uploadNewFile\",\n            ReplaceWith(\"this.files.uploadNewFile(path, resource, callback)\"),\n            level = DeprecationLevel.HIDDEN\n        ) // deprecated since 2.8.0-RC\n        @DeprecatedSinceMirai(warningSince = \"2.8\", errorSince = \"2.12\", hiddenSince = \"2.13\")\n        @Suppress(\"_FUNCTION_WITH_DEFAULT_ARGUMENTS\")\n        public suspend fun <C : FileSupported> C.sendFile(\n            path: String,\n            resource: ExternalResource,\n            callback: ProgressionCallback? = null,\n        ): MessageReceipt<C> =\n            @Suppress(\"DEPRECATION\", \"DEPRECATION_ERROR\")\n            this.filesRoot.resolve(path).upload(resource, callback).sendTo(this)\n\n        /**\n         * 上传文件并发送文件消息到相关 [FileSupported].\n         * @see RemoteFile.uploadAndSend\n         */\n        @JvmStatic\n        @JvmOverloads\n        @Deprecated(\n            \"Deprecated. Please use AbsoluteFolder.uploadNewFile or RemoteFiles.uploadNewFile\",\n            ReplaceWith(\"file.toExternalResource().use { this.files.uploadNewFile(path, it, callback) }\"),\n            level = DeprecationLevel.HIDDEN\n        ) // deprecated since 2.8.0-RC\n        @DeprecatedSinceMirai(warningSince = \"2.8\", errorSince = \"2.12\", hiddenSince = \"2.13\")\n        public suspend fun <C : FileSupported> C.sendFile(\n            path: String,\n            file: File,\n            callback: ProgressionCallback? = null,\n        ): MessageReceipt<C> =\n            @Suppress(\"DEPRECATION\", \"DEPRECATION_ERROR\")\n            this.filesRoot.resolve(path).upload(file, callback).sendTo(this)\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/utils/SingleFileLogger.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport java.io.File\n\n/**\n * 将日志写入('append')到特定文件.\n *\n * @see PlatformLogger 查看格式信息\n */\npublic expect class SingleFileLogger : MiraiLogger {\n    public constructor(identity: String)\n    public constructor(identity: String, file: File = File(\"$identity-${getCurrentDate()}.log\"))\n\n    // Implementation notes v2.5.0:\n    // default argument `file` to produce synthetic constructor with `DefaultConstructorMarker` for binary compatibility\n    // dedicated constructor with single parameter `identity` for the same reason.\n}"
  },
  {
    "path": "mirai-core-api/src/commonMain/kotlin/utils/Streamable.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmBlockingBridge\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.toList\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.announcement.Announcement\nimport net.mamoe.mirai.contact.announcement.Announcements\nimport net.mamoe.mirai.utils.JdkStreamSupport.toStream\nimport java.util.stream.Stream\nimport kotlin.coroutines.EmptyCoroutineContext\n\n/**\n * 表示一个可以创建数据流 [Flow] 和 [Stream] 的对象.\n *\n * 实现这个接口的对象可以看做为元素 [T] 的集合.\n * 例如 [Announcements] 可以看作是 [Announcement] 的集合,\n * 使用 [Announcements.asFlow] 可以获取到包含所有 [Announcement] 列表的 [Flow],\n * 使用 [Announcements.asStream] 可以获取到包含所有 [Announcement] 列表的 [Stream].\n *\n * @since 2.13\n */\npublic interface Streamable<T> {\n    /**\n     * 创建一个能获取 [T] 的 [Flow].\n     */\n    public fun asFlow(): Flow<T>\n\n    /**\n     * 创建一个能获取该群内所有 [T] 的 [Stream].\n     *\n     * 实现细节: 为了适合 Java 调用, 实现类似为阻塞式的 [asFlow], 因此不建议在 Kotlin 使用. 在 Kotlin 请使用 [asFlow].\n     *\n     * 注: 为了资源的正确释放, 使用 [Stream] 时需要使用 `try-with-resource`. 如\n     *\n     * ```java\n     * Streamable<String> tmp;\n     * try (var stream = tmp.asStream()) {\n     *     System.out.println(stream.findFirst());\n     * }\n     * ```\n     */\n    public fun asStream(): Stream<T> = asFlow().toStream(\n        context = if (this is CoroutineScope) this.coroutineContext else EmptyCoroutineContext,\n    )\n\n    /**\n     * 获取所有 [T] 列表, 将全部 [T] 都加载后再返回.\n     *\n     * @return 此时刻的 [T] 只读列表.\n     */\n    public suspend fun toList(): List<T> = asFlow().toList()\n}"
  },
  {
    "path": "mirai-core-api/src/commonTest/kotlin/logging/AbstractLoggingTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.logging\n\nimport net.mamoe.mirai.utils.MiraiLoggerFactoryImplementationBridge\nimport org.junit.jupiter.api.AfterEach\n\ninternal abstract class AbstractLoggingTest {\n    @AfterEach\n    fun cleanup() {\n        MiraiLoggerFactoryImplementationBridge.run { setInstance(createPlatformInstance()) }\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonTest/kotlin/logging/Log4j2LoggingTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.logging\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.internal.utils.*\nimport net.mamoe.mirai.utils.LoggerAdapters.asMiraiLogger\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.MiraiLoggerFactoryImplementationBridge\nimport org.apache.logging.log4j.LogManager\nimport kotlin.test.*\n\ninternal class Log4j2LoggingTest : AbstractLoggingTest() {\n    @BeforeTest\n    fun init() {\n        MiraiLoggerFactoryImplementationBridge.wrapCurrent {\n            object : MiraiLogger.Factory {\n                override fun create(requester: Class<*>, identity: String?): MiraiLogger {\n                    return LogManager.getLogger(requester)\n                        .asMiraiLogger(Marker(identity ?: requester.simpleName, MARKER_MIRAI))\n                }\n            }\n        }\n    }\n\n    private fun MiraiLogger.cast(): Log4jLoggerAdapter = this as Log4jLoggerAdapter\n\n    @Test\n    fun `created is Log4jLoggerAdapter`() {\n        val logger = MiraiLogger.Factory.create(Log4j2LoggingTest::class, \"test1\")\n        assertIs<Log4jLoggerAdapter>(logger)\n    }\n\n    @Test\n    fun `identity is considered as marker`() {\n        val logger = MiraiLogger.Factory.create(Log4j2LoggingTest::class, \"test1\")\n        assertEquals(\"test1\", logger.cast().marker!!.name)\n    }\n\n\n    @Test\n    fun `test subLogger Marker`() {\n        val parent = MiraiLogger.Factory.create(Log4j2LoggingTest::class, \"test1\")\n        val parentMarker = parent.cast().marker!!\n\n        val child = subLoggerImpl(parent, \"sub\")\n        val childMarker = child.markerOrNull!!\n\n        assertEquals(\"test1\", parentMarker.name)\n        assertEquals(\"sub\", childMarker.name)\n\n        assertSame(parentMarker, childMarker.parents.single())\n        assertSame(\"test1\", childMarker.parents.single().name)\n    }\n\n    @Test\n    fun `test subLogger Marker 2`() {\n        val parent = MiraiLogger.Factory.create(Log4j2LoggingTest::class, \"test1\")\n        val parentMarker = parent.cast().marker!!\n\n        val child = parent.subLogger(\"sub\").subLogger(\"sub2\")\n        val childMarker = child.markerOrNull!!\n\n        assertEquals(\"test1\", parentMarker.name)\n        assertEquals(\"sub2\", childMarker.name)\n\n        assertSame(\"sub\", childMarker.parents.single().name)\n        assertSame(parentMarker, childMarker.parents.single().parents.single())\n    }\n\n    @Test\n    fun `logging output test`() {\n        val logger = LogManager.getLogger(Bot::class.java)\n        logger.info(\"Test\")\n        MiraiLogger.Factory.create(Bot::class).run {\n            info(\"InfoFF\")\n        }\n    }\n}\n\ninternal fun MiraiLogger.subLogger(s: String): MiraiLogger {\n    return subLoggerImpl(this, s)\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonTest/kotlin/logging/LoggingCompatibilityTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.logging\n\nimport net.mamoe.mirai.utils.MiraiLogger\nimport net.mamoe.mirai.utils.MiraiLoggerFactoryImplementationBridge\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertIs\n\ninternal class LoggingCompatibilityTest : AbstractLoggingTest() {\n\n    @Suppress(\"DEPRECATION_ERROR\")\n    @Test\n    fun `legacy overrides are still working if no services are found`() {\n        val messages = StringBuilder()\n\n        MiraiLoggerFactoryImplementationBridge.wrapCurrent {\n            object : MiraiLogger.Factory {\n                override fun create(requester: Class<*>, identity: String?): MiraiLogger {\n                    return net.mamoe.mirai.utils.SimpleLogger(\"my logger\") { message: String?, _: Throwable? ->\n                        messages.append(message)\n                    }\n\n                }\n            }\n        }\n\n        val created = MiraiLogger.Factory.create(this::class)\n        assertIs<MiraiLogger>(created)\n        created.info(\"test\")\n\n        assertEquals(\"test\", messages.toString().trim())\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonTest/kotlin/message.data/CombinedMessageTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\npackage net.mamoe.mirai.message.data\n\nimport net.mamoe.mirai.message.data.visitor.MessageVisitorUnit\nimport net.mamoe.mirai.message.data.visitor.RecursiveMessageVisitor\nimport net.mamoe.mirai.message.data.visitor.accept\nimport net.mamoe.mirai.message.data.visitor.acceptChildren\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFalse\nimport kotlin.test.assertIs\n\n\n@OptIn(MessageChainConstructor::class)\ninternal class CombinedMessageTest {\n    private fun linearMessageChainOf(vararg values: SingleMessage) =\n        LinearMessageChainImpl.create(values.toList(), values.any { it.hasConstrainSingle })\n\n    @Test\n    fun singlePlusSingleCreatesCombinedMessage() {\n        kotlin.run {\n            val chain = PlainText(\"fo\").plus(PlainText(\"o\"))\n            assertIs<CombinedMessage>(chain)\n            assertEquals(PlainText(\"fo\"), chain.element)\n            assertEquals(PlainText(\"o\"), chain.tail)\n            assertEquals(false, chain.hasConstrainSingle)\n        }\n        kotlin.run {\n            val chain = PlainText(\"fo\").plus(LightApp(\"c\"))\n            assertIs<LinearMessageChainImpl>(chain)\n            assertEquals(LightApp(\"c\"), chain.single())\n            assertEquals(true, chain.hasConstrainSingle)\n        }\n    }\n\n    @Test\n    fun singlePlusChainCreatesCombinedMessage() {\n        val chain = PlainText(\"fo\").plus(linearMessageChainOf(PlainText(\"o\")))\n        assertIs<CombinedMessage>(chain)\n        assertEquals(PlainText(\"fo\"), chain.element)\n        assertEquals(linearMessageChainOf(PlainText(\"o\")), chain.tail)\n        assertEquals(false, chain.hasConstrainSingle)\n    }\n\n    @Test\n    fun chainPlusSingleCreatesCombinedMessage() {\n        val chain = linearMessageChainOf(PlainText(\"o\")).plus(PlainText(\"fo\"))\n        assertIs<CombinedMessage>(chain)\n        assertEquals(linearMessageChainOf(PlainText(\"o\")), chain.element)\n        assertEquals(PlainText(\"fo\"), chain.tail)\n        assertEquals(false, chain.hasConstrainSingle)\n    }\n\n    private fun createTestInstance(): CombinedMessage {\n        return CombinedMessage(\n            buildMessageChain {\n                +PlainText(\"bar\")\n                +emptyMessageChain()\n                +buildMessageChain {\n                    +AtAll\n                    +PlainText(\"zoo\")\n                }\n            },\n            buildMessageChain {\n                +buildMessageChain {\n                    +At(2)\n                }\n                +At(1)\n            },\n            false\n        )\n    }\n\n    private fun createComplexCombined() = CombinedMessage(\n        PlainText(\"foo\"),\n        createTestInstance(),\n        false\n    )\n\n    private val complexCombined = createComplexCombined()\n    ///////////////////////////////////////////////////////////////////////////\n    // properties\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Test\n    fun sizeTest() {\n        assertEquals(0, CombinedMessage(messageChainOf(), messageChainOf(), false).size)\n        assertEquals(\n            0,\n            CombinedMessage(messageChainOf(), CombinedMessage(messageChainOf(), messageChainOf(), false), false).size\n        )\n\n        createTestInstance().run {\n            assertEquals(5, size)\n            assertFalse { slowList.isInitialized() }\n        }\n    }\n\n    @Test\n    fun slowListTest() {\n        assertEquals(messageChainOf(), CombinedMessage(messageChainOf(), messageChainOf(), false).slowList.value)\n        assertEquals(\n            listOf(\n                PlainText(\"foo\"),\n                PlainText(\"bar\"),\n                AtAll,\n                PlainText(\"zoo\"),\n                At(2),\n                At(1),\n            ),\n            complexCombined.slowList.value.toList()\n        )\n    }\n\n    @Test\n    fun consistencyTest() {\n        val first = createTestInstance()\n        val second = createTestInstance()\n        assertEquals(first, second)\n        assertEquals(first.hashCode(), second.hashCode())\n        assertEquals(first.toString(), second.toString())\n        assertEquals(first.contentToString(), second.contentToString())\n        assertEquals(first.size, second.size)\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // functions\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Test\n    fun subList() {\n        assertEquals(\n            createComplexCombined().slowList.value.subList(2, 4),\n            complexCombined.subList(2, 4)\n        )\n        assertFalse {\n            complexCombined.slowList.isInitialized()\n        }\n        complexCombined.slowList.value // initialize\n        assertEquals(\n            createComplexCombined().slowList.value.subList(2, 4),\n            complexCombined.subList(2, 4)\n        )\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // visiting\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Test\n    fun acceptChildrenTest() {\n        val list = buildList {\n            complexCombined.acceptChildren(object : MessageVisitorUnit() {\n                override fun visitMessage(message: Message, data: Unit) {\n                    add(message)\n                    super.visitMessage(message, data)\n                }\n            })\n        }\n        assertEquals(\n            listOf(\n                PlainText(\"foo\"),\n                createTestInstance()\n            ),\n            list\n        )\n    }\n\n    @OptIn(MessageChainConstructor::class)\n    @Test\n    fun acceptChildrenRecursiveTest() {\n        val list = buildList {\n            complexCombined.accept(object : RecursiveMessageVisitor<Unit>() {\n                override fun visitMessage(message: Message, data: Unit) {\n                    println(\"visitMessage: (${message::class.simpleName}) $message\")\n                    super.visitMessage(message, data)\n                }\n\n                override fun visitSingleMessage(message: SingleMessage, data: Unit) {\n                    add(message)\n                    super.visitSingleMessage(message, data)\n                }\n            })\n        }\n        assertEquals(\n            listOf(\n                PlainText(\"foo\"),\n                PlainText(\"bar\"),\n                AtAll,\n                PlainText(\"zoo\"),\n                At(2),\n                At(1),\n            ),\n            list\n        )\n    }\n\n    @Test\n    fun hierarchicalIterator() {\n        assertEquals(\n            listOf(\n                PlainText(\"foo\"),\n                PlainText(\"bar\"),\n                AtAll,\n                PlainText(\"zoo\"),\n                At(2),\n                At(1),\n            ),\n            complexCombined.iterator().asSequence().toList()\n        )\n        assertFalse { complexCombined.slowList.isInitialized() }\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonTest/kotlin/message.data/ConstrainSingleHelperTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.message.data\n\nimport net.mamoe.mirai.utils.safeCast\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFalse\nimport kotlin.test.assertTrue\n\ninternal class ConstrainSingleHelperTest {\n\n    @Test\n    fun linearPlains() {\n        val list = listOf(PlainText(\"1\"), PlainText(\"2\"))\n        ConstrainSingleHelper.constrainSingleMessages(list.asSequence()).run {\n            assertEquals(list, value)\n            assertFalse { hasConstrainSingle }\n        }\n    }\n\n    @Test\n    fun linearNonConstrains() {\n        val list = listOf(PlainText(\"1\"), At(2))\n        ConstrainSingleHelper.constrainSingleMessages(list.asSequence()).run {\n            assertEquals(list, value)\n            assertFalse { hasConstrainSingle }\n        }\n    }\n\n    @Test\n    fun hierarchicalNonConstrains() {\n        val list = listOf(PlainText(\"1\"), (PlainText(\"1\") + At(2)))\n        ConstrainSingleHelper.constrainSingleMessages(list.asSequence()).run {\n            assertEquals(listOf(PlainText(\"1\"), PlainText(\"1\"), At(2)), value)\n            assertFalse { hasConstrainSingle }\n        }\n    }\n\n    @Test\n    fun singleConstrain() {\n        val list = listOf(Dice(2))\n        ConstrainSingleHelper.constrainSingleMessages(list.asSequence()).run {\n            assertEquals(list, value)\n            assertTrue { hasConstrainSingle }\n        }\n    }\n\n    @Test\n    fun linearDuplicatedConstrains() {\n        val list = listOf(Dice(2), Dice(3))\n        ConstrainSingleHelper.constrainSingleMessages(list.asSequence()).run {\n            assertEquals(1, value.size)\n            assertEquals(Dice(3), value.first())\n            assertTrue { hasConstrainSingle }\n        }\n    }\n\n    @Test\n    fun linearMultipleDuplicatedConstrains() {\n        val list = listOf(PlainText(\"a\"), LightApp(\"aa\"), Dice(2), Dice(3), LightApp(\"bb\"), PlainText(\"c\"))\n        ConstrainSingleHelper.constrainSingleMessages(list.asSequence()).run {\n            assertEquals(1, value.size)\n            assertEquals(listOf(LightApp(\"bb\")), value)\n            assertTrue { hasConstrainSingle }\n        }\n    }\n\n    @Test\n    fun hierarchicalDuplicatedConstrains() {\n        val list = listOf(\n            MySingle(1), // before first MessageContent that can be replaced by the last ConstrainSingle\n            PlainText(\"a\"),\n            LightApp(\"aa\"),\n            LinearMessageChainImpl.create( // without processing ConstrainSingle\n                listOf(\n                    PlainText(\"ab\"),\n                    LightApp(\"aab\"),\n                    Dice(5),\n                    Dice(3),\n                    LightApp(\"bbb\"),\n                    PlainText(\"cb\")\n                ), true\n            ),\n            Dice(3),\n            LightApp(\"bb\"), // last ConstrainSingle\n            PlainText(\"c\")\n        )\n        ConstrainSingleHelper.constrainSingleMessages(list.asSequence()).run {\n            assertEquals(2, value.size)\n            assertEquals(listOf(MySingle(1), LightApp(\"bb\")), value)\n            assertTrue { hasConstrainSingle }\n        }\n    }\n\n    @Test\n    fun hierarchicalDuplicatedConstrains3() {\n        val list = listOf(\n            PlainText(\"a\"),\n            LightApp(\"aa\"),\n            LinearMessageChainImpl.create( // without processing ConstrainSingle\n                listOf(\n                    PlainText(\"ab\"),\n                    LightApp(\"aab\"),\n                    Dice(5),\n                    Dice(3),\n                    LightApp(\"bbb\"),\n                    PlainText(\"cb\")\n                ), true\n            ),\n            Dice(3),\n            MySingle(1), // after first MessageContent that can be replaced by the last ConstrainSingle\n            LightApp(\"bb\"), // last ConstrainSingle\n            PlainText(\"c\")\n        )\n        ConstrainSingleHelper.constrainSingleMessages(list.asSequence()).run {\n            assertEquals(2, value.size)\n            assertEquals(listOf(LightApp(\"bb\"), MySingle(1)), value)\n            assertTrue { hasConstrainSingle }\n        }\n    }\n\n    @Test\n    fun hierarchicalDuplicatedConstrains2() {\n        val list = listOf(\n            PlainText(\"a\"),\n            LightApp(\"aa\"),\n            Dice(3),\n            LightApp(\"bb\"),\n            PlainText(\"c\"),\n            LinearMessageChainImpl.create( // without processing ConstrainSingle\n                listOf(\n                    PlainText(\"a\"),\n                    LightApp(\"aa\"),\n                    Dice(2),\n                    MySingle(1), // after first MessageContent that can be replaced by the last ConstrainSingle\n                    Dice(3),\n                    LightApp(\"foo\"), // last ConstrainSingle\n                    PlainText(\"c\")\n                ), true\n            ),\n        )\n        ConstrainSingleHelper.constrainSingleMessages(list.asSequence()).run {\n            assertEquals(2, value.size)\n            assertEquals(listOf(LightApp(\"foo\"), MySingle(1)), value)\n            assertTrue { hasConstrainSingle }\n        }\n    }\n}\n\nprivate class MySingle(\n    val value: Int\n) : MessageMetadata, ConstrainSingle {\n    override val key: MessageKey<MySingle>\n        get() = Key\n\n    override fun toString(): String {\n        return \"MySingle@${this.hashCode()}\"\n    }\n\n    override fun equals(other: Any?): Boolean {\n        return other is MySingle && other.value == this.value\n    }\n\n    override fun hashCode(): Int {\n        return value\n    }\n\n    private object Key : AbstractMessageKey<MySingle>({ it.safeCast() })\n}"
  },
  {
    "path": "mirai-core-api/src/commonTest/kotlin/message.data/ConstrainSingleTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\npackage  net.mamoe.mirai.message.data\n\nimport net.mamoe.mirai.utils.safeCast\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertSame\nimport kotlin.test.assertTrue\n\n\ninternal class TestConstrainSingleMessage : ConstrainSingle, Any() {\n    companion object Key : AbstractMessageKey<TestConstrainSingleMessage>({ it.safeCast() })\n\n    override fun toString(): String = \"<TestConstrainSingleMessage#${super.hashCode()}>\"\n    override fun contentToString(): String = \"\"\n\n    override val key: MessageKey<TestConstrainSingleMessage>\n        get() = Key\n}\n\n\ninternal class ConstrainSingleTest {\n\n\n    @Test\n    fun testSinglePlusChain() {\n        val result = PlainText(\"te\") + buildMessageChain {\n            add(TestConstrainSingleMessage())\n            add(\"st\")\n        }\n        assertEquals(3, result.size)\n        assertEquals(result.contentToString(), \"test\")\n    }\n\n    @Test\n    fun testSinglePlusChainConstrain() {\n        val chain = buildMessageChain {\n            add(TestConstrainSingleMessage())\n            add(\"st\")\n        }\n        val result = TestConstrainSingleMessage() + chain\n        assertEquals(chain, result)\n        assertEquals(2, result.size)\n        assertEquals(result.contentToString(), \"st\")\n        assertTrue { result.first() is TestConstrainSingleMessage }\n    }\n\n    @Test\n    fun testChainPlusSingle() {\n        val new = TestConstrainSingleMessage()\n\n        val result = buildMessageChain {\n            add(\" \")\n            add(Face(Face.OK))\n            add(TestConstrainSingleMessage())\n            add(\n                PlainText(\"ss\")\n                        + \" \"\n            )\n        } + buildMessageChain {\n            add(PlainText(\"p \"))\n            add(new)\n            add(PlainText(\"test\"))\n        }\n\n        assertEquals(7, result.size)\n        assertEquals(\" [OK]ss p test\", result.contentToString())\n        result as LinearMessageChainImpl\n        assertSame(new, result.delegate.toTypedArray()[2])\n    }\n\n    @Test // net.mamoe.mirai/message/data/MessageChain.kt:441\n    fun testConstrainSingleInSequence() {\n        val last = TestConstrainSingleMessage()\n        val sequence: Sequence<SingleMessage> = sequenceOf(\n            TestConstrainSingleMessage(),\n            TestConstrainSingleMessage(),\n            last\n        )\n\n        val (result, has) = ConstrainSingleHelper.constrainSingleMessages(sequence)\n        assertTrue { has }\n        assertEquals(result.count(), 1)\n        assertSame(result.single(), last)\n    }\n\n    @Test // net.mamoe.mirai/message/data/MessageChain.kt:441\n    fun testConstrainSingleOrderInSequence() {\n        val last = TestConstrainSingleMessage()\n        val sequence: Sequence<SingleMessage> = sequenceOf(\n            TestConstrainSingleMessage(), // last should replace here\n            PlainText(\"test\"),\n            TestConstrainSingleMessage(),\n            last\n        )\n\n        val (result, has) = ConstrainSingleHelper.constrainSingleMessages(sequence)\n        assertTrue { has }\n        assertEquals(result.count(), 2)\n        assertSame(result.first(), last)\n    }\n\n\n    @Test\n    fun testConversions() {\n        val lastSingle = TestConstrainSingleMessage()\n        val list: List<SingleMessage> = listOf(\n            PlainText(\"test\"),\n            TestConstrainSingleMessage(),\n            TestConstrainSingleMessage(),\n            PlainText(\"foo\"),\n            TestConstrainSingleMessage(),\n            lastSingle\n        )\n\n        // Collection<SingleMessage>.asMessageChain()\n        assertEquals(\"test${lastSingle}foo\", list.toMessageChain().toString())\n\n        // Collection<Message>.asMessageChain()\n        @Suppress(\"USELESS_CAST\")\n        assertEquals(\n            \"test${lastSingle}foo\",\n            list.map { it as Message }.toMessageChain().toString()\n        )\n\n        // Iterable<SingleMessage>.asMessageChain()\n        assertEquals(\"test${lastSingle}foo\", list.asIterable().toMessageChain().toString())\n\n        // Iterable<Message>.asMessageChain()\n        @Suppress(\"USELESS_CAST\")\n        assertEquals(\n            \"test${lastSingle}foo\",\n            list.map { it as Message }.asIterable().toMessageChain().toString()\n        )\n\n        // Sequence<SingleMessage>.asMessageChain()\n        assertEquals(\"test${lastSingle}foo\", list.asSequence().toMessageChain().toString())\n\n        // Sequence<Message>.asMessageChain()\n        @Suppress(\"USELESS_CAST\")\n        assertEquals(\n            \"test${lastSingle}foo\",\n            list.map { it as Message }.asSequence().toMessageChain().toString()\n        )\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonTest/kotlin/message.data/ImageTest.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n@file:Suppress(\"EXPERIMENTAL_API_USAGE\")\n\npackage  net.mamoe.mirai.message.data\n\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFailsWith\n\ninternal fun String.autoHexToBytes(): ByteArray =\n    this.replace(\"\\n\", \"\").replace(\" \", \"\").asSequence().chunked(2).map {\n        (it[0].toString() + it[1]).toUByte(16).toByte()\n    }.toList().toByteArray()\n\ninternal class ImageTest {\n\n    @Test\n    fun testHexDigitToByte() {\n        assertEquals(0xf, 'f'.hexDigitToByte())\n        assertEquals(0x1, '1'.hexDigitToByte())\n        assertEquals(0x0, '0'.hexDigitToByte())\n        assertFailsWith<IllegalArgumentException> {\n            'g'.hexDigitToByte()\n        }\n    }\n\n    @Test\n    fun testCalculateImageMd5ByImageId() {\n        assertEquals(\n            \"01E9451B-70ED-EAE3-B37C-101F1EEBF5B5\".filterNot { it == '-' }.autoHexToBytes().contentToString(),\n            Image.calculateImageMd5ByImageId(\"{01E9451B-70ED-EAE3-B37C-101F1EEBF5B5}.mirai\").contentToString()\n        )\n\n        assertEquals(\n            \"f8f1ab55-bf8e-4236-b55e-955848d7069f\".filterNot { it == '-' }.autoHexToBytes().contentToString(),\n            Image.calculateImageMd5ByImageId(\"/f8f1ab55-bf8e-4236-b55e-955848d7069f\").contentToString()\n        )\n\n        assertEquals(\n            \"BFB7027B9354B8F899A062061D74E206\".filterNot { it == '-' }.autoHexToBytes().contentToString(),\n            Image.calculateImageMd5ByImageId(\"/000000000-3814297509-BFB7027B9354B8F899A062061D74E206\").contentToString()\n        )\n\n    }\n\n    //  `/f8f1ab55-bf8e-4236-b55e-955848d7069f` 或 `/000000000-3814297509-BFB7027B9354B8F899A062061D74E206`\n}"
  },
  {
    "path": "mirai-core-api/src/commonTest/kotlin/message.data/LinearMessageChainImplTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.message.data\n\nimport net.mamoe.mirai.message.data.visitor.MessageVisitorUnit\nimport net.mamoe.mirai.message.data.visitor.acceptChildren\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertIs\n\ninternal class LinearMessageChainImplTest {\n\n    private val complexLinearChain = buildMessageChain {\n        +PlainText(\"foo\")\n        +buildMessageChain {\n            +PlainText(\"bar\")\n            +emptyMessageChain()\n            +buildMessageChain {\n                +AtAll\n                +PlainText(\"zoo\")\n            }\n        }\n        +buildMessageChain {\n            +buildMessageChain {\n                +At(2)\n            }\n            +At(1)\n        }\n    }\n\n    @Test\n    fun buildMessageChainCreatesLinearMessageChainImpl() {\n        assertIs<LinearMessageChainImpl>(complexLinearChain)\n    }\n\n    @Test\n    fun hierarchicalIterator() {\n        assertEquals(\n            listOf(\n                PlainText(\"foo\"),\n                PlainText(\"bar\"),\n                AtAll,\n                PlainText(\"zoo\"),\n                At(2),\n                At(1),\n            ),\n            complexLinearChain.iterator().asSequence().toList()\n        )\n    }\n\n    @Test\n    fun sizeTest() {\n        assertEquals(0, messageChainOf().size)\n        assertEquals(6, complexLinearChain.size)\n        assertEquals(6, complexLinearChain.count())\n    }\n\n    @Test\n    fun acceptChildrenTest() {\n        val list = buildList {\n            complexLinearChain.acceptChildren(object : MessageVisitorUnit() {\n                override fun visitMessage(message: Message, data: Unit) {\n                    add(message)\n                    super.visitMessage(message, data)\n                }\n            })\n        }\n        assertEquals(\n            listOf(\n                PlainText(\"foo\"),\n                PlainText(\"bar\"),\n                AtAll,\n                PlainText(\"zoo\"),\n                At(2),\n                At(1),\n            ),\n            list\n        )\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonTest/kotlin/message.data/MessageChainBuilderTest.kt",
    "content": "/*\n * Copyright 2019-2020 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\npackage  net.mamoe.mirai.message.data\n\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class MessageChainBuilderTest {\n    @Test\n    fun testConcat() {\n        val chain = buildMessageChain {\n            +\"test\"\n            +\" \"\n            +PlainText(\"foo\")\n            +\" \"\n            +(PlainText(\"bar\") + \" goo \")\n            buildMessageChain {\n                +\"1\"\n                +\"2\"\n                +\"3\"\n            }.joinTo(this)\n        }\n\n        assertEquals(\"test foo bar goo 123\", chain.toString())\n    }\n\n    @Test\n    fun testConstrain() {\n        val lastSingle = TestConstrainSingleMessage()\n\n        val chain = buildMessageChain {\n            +\"test\"\n            +TestConstrainSingleMessage()\n            +TestConstrainSingleMessage()\n            +PlainText(\"foo\")\n            +TestConstrainSingleMessage()\n            +lastSingle\n        }\n\n        assertEquals(chain.size, 3)\n        assertEquals(\"test${lastSingle}foo\", chain.toString())\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonTest/kotlin/message.data/MessageChainImmutableTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"PLATFORM_CLASS_MAPPED_TO_KOTLIN\", \"UNCHECKED_CAST\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlin.test.Test\nimport kotlin.test.assertFails\n\ninternal open class MessageChainImmutableTest {\n\n    @Test\n    fun `LinearMessageChainImpl is immutable`() {\n        runCheck(\n            messageChainOf(\n                AtAll, PlainText(\"Hello!\"), At(114514),\n            ) as java.util.List<SingleMessage>\n        )\n    }\n\n    @Test\n    fun `CombinedMessage is immutable`() {\n        runCheck(\n            (AtAll + PlainText(\"Hello!\")) as java.util.List<SingleMessage>,\n        )\n    }\n\n    private fun runCheck(chain: java.util.List<SingleMessage>) {\n        assertFails { chain.set(0, AtAll) }\n        assertFails { chain.remove(0) }\n        assertFails { chain.clear() }\n        assertFails { chain.add(PlainText(\"Hey Hey!\")) }\n        assertFails { chain.iterator().remove() }\n        assertFails { chain.iterator().also { it.next() }.remove() }\n        assertFails { chain.listIterator().remove() }\n        assertFails { chain.listIterator().also { it.next() }.remove() }\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/commonTest/kotlin/message.data/MessageChainImplTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.message.data\n\nimport kotlin.test.Test\nimport kotlin.test.assertIs\n\ninternal class MessageChainImplTest {\n    @OptIn(MessageChainConstructor::class)\n    @Test\n    fun allInternalImplementationsOfMessageChainAreMessageChainImpl() {\n        assertIs<AbstractMessageChain>(CombinedMessage(AtAll, AtAll, false))\n        assertIs<AbstractMessageChain>(emptyMessageChain())\n        val linear = LinearMessageChainImpl.create(listOf(AtAll), true)\n        assertIs<LinearMessageChainImpl>(linear)\n        assertIs<AbstractMessageChain>(linear)\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonTest/kotlin/message.data/MessageKeyTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.message.data\n\nimport net.mamoe.mirai.utils.safeCast\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertSame\n\n\nprivate open class TestStandaloneConstrainSingleMessage : ConstrainSingle, MessageContent {\n    companion object Key : AbstractMessageKey<TestStandaloneConstrainSingleMessage>({ it.safeCast() })\n\n    override fun toString(): String = \"<TestStandaloneConstrainSingleMessage#${super.hashCode()}>\"\n    override fun contentToString(): String = \"\"\n\n    override val key: MessageKey<TestStandaloneConstrainSingleMessage> get() = Key\n}\n\nprivate class TestPolymorphicConstrainSingleMessage : ConstrainSingle, TestStandaloneConstrainSingleMessage(),\n    MessageContent {\n    companion object Key :\n        AbstractPolymorphicMessageKey<TestStandaloneConstrainSingleMessage, TestPolymorphicConstrainSingleMessage>(\n            TestStandaloneConstrainSingleMessage, { it.safeCast() }\n        )\n\n    override fun toString(): String = \"<TestPolymorphicConstrainSingleMessage#${super.hashCode()}>\"\n    override fun contentToString(): String = \"\"\n\n    override val key: MessageKey<TestPolymorphicConstrainSingleMessage> get() = Key\n}\n\nprivate class TestPolymorphicConstrainSingleMessageOverridingMessageContent : ConstrainSingle, MessageContent,\n    TestStandaloneConstrainSingleMessage() {\n    companion object Key :\n        AbstractPolymorphicMessageKey<MessageContent, TestPolymorphicConstrainSingleMessageOverridingMessageContent>(\n            MessageContent, { it.safeCast() }\n        )\n\n    override fun toString(): String =\n        \"<TestPolymorphicConstrainSingleMessageOverridingMessageContent#${super.hashCode()}>\"\n\n    override fun contentToString(): String = \"\"\n\n    override val key: MessageKey<TestPolymorphicConstrainSingleMessageOverridingMessageContent> get() = Key\n}\n\n\ninternal class MessageKeyTest {\n    @Test\n    fun `test polymorphism get`() {\n        val constrainSingle: TestStandaloneConstrainSingleMessage\n        val chain = buildMessageChain {\n            +TestStandaloneConstrainSingleMessage()\n            +PlainText(\"test\")\n            +TestStandaloneConstrainSingleMessage()\n            +PlainText(\"test\")\n            +TestStandaloneConstrainSingleMessage().also { constrainSingle = it }\n        }\n\n        assertEquals(constrainSingle, chain[MessageContent])\n        assertEquals(constrainSingle, chain[TestStandaloneConstrainSingleMessage])\n    }\n\n    @Test\n    fun `test polymorphism override base`() {\n        val constrainSingle: TestPolymorphicConstrainSingleMessage\n        val chain = buildMessageChain {\n            +TestStandaloneConstrainSingleMessage()\n            +PlainText(\"test\")\n            +TestStandaloneConstrainSingleMessage()\n            +PlainText(\"test\")\n            +TestPolymorphicConstrainSingleMessage().also { constrainSingle = it }\n        }\n\n        assertEquals(constrainSingle, chain[MessageContent])\n        assertEquals(constrainSingle, chain[TestPolymorphicConstrainSingleMessage])\n    }\n\n    @Test\n    fun `test polymorphism override message content`() {\n        val constrainSingle: TestPolymorphicConstrainSingleMessageOverridingMessageContent\n        val chain = buildMessageChain {\n            +TestStandaloneConstrainSingleMessage()\n            +PlainText(\"test\")\n            +TestStandaloneConstrainSingleMessage()\n            +PlainText(\"test\")\n            +TestPolymorphicConstrainSingleMessageOverridingMessageContent().also { constrainSingle = it }\n        }\n\n        assertEquals(constrainSingle, chain[MessageContent])\n        assertEquals<Any?>(constrainSingle, chain[TestStandaloneConstrainSingleMessage])\n        assertEquals(1, chain.size)\n    }\n\n    @Test\n    fun `can get from MessageChain`() {\n        val cons = TestStandaloneConstrainSingleMessage()\n        assertSame(cons, messageChainOf(cons)[TestStandaloneConstrainSingleMessage])\n    }\n\n    @Test\n    fun `can get from MessageChain2`() {\n        val cons = TestStandaloneConstrainSingleMessage()\n        assertSame(cons, messageChainOf(PlainText(\"test\"), AtAll, cons)[TestStandaloneConstrainSingleMessage])\n    }\n\n    @Test\n    fun `get can be null`() {\n        assertEquals(null, messageChainOf()[TestStandaloneConstrainSingleMessage])\n    }\n\n    @Test\n    fun `get can be null2`() {\n        assertEquals(null, messageChainOf(PlainText(\"test\"), AtAll)[TestStandaloneConstrainSingleMessage])\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonTest/kotlin/message.data/MessageUtilsTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\npackage  net.mamoe.mirai.message.data\n\nimport kotlinx.coroutines.flow.flowOf\nimport kotlinx.coroutines.test.runTest\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertTrue\n\n\ninternal class MessageUtilsTest {\n    @Test\n    fun testIsContentEmpty() {\n        assertTrue { emptyMessageChain().isContentEmpty() }\n        assertTrue { buildMessageChain { }.isContentEmpty() }\n        assertTrue { PlainText(\"\").isContentEmpty() }\n        assertTrue { (PlainText(\"\") + PlainText(\"\")).isContentEmpty() }\n        assertTrue { buildMessageChain { append(PlainText(\"\")); append(PlainText(\"\")) }.isContentEmpty() }\n    }\n\n    @Test\n    fun `flow toMessageChain`() = runTest {\n        assertEquals(messageChainOf(PlainText(\"1\")), flowOf(PlainText(\"1\")).toMessageChain())\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonTest/kotlin/message.data/MessageVisitorTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.message.data\n\nimport net.mamoe.mirai.contact.FileSupported\nimport net.mamoe.mirai.message.data.visitor.AbstractMessageVisitor\nimport net.mamoe.mirai.message.data.visitor.accept\nimport net.mamoe.mirai.utils.MiraiExperimentalApi\nimport kotlin.test.Test\nimport kotlin.test.assertContentEquals\n\ninternal class MessageVisitorTest {\n    object GetCalledMethodNames : AbstractMessageVisitor<Unit, Array<String>>() {\n        override fun visitMessage(message: Message, data: Unit): Array<String> {\n            return arrayOf(\"visitMessage\")\n        }\n\n        override fun visitSingleMessage(message: SingleMessage, data: Unit): Array<String> {\n            return arrayOf(\"visitSingleMessage\") + super.visitSingleMessage(message, data)\n        }\n\n        override fun visitMessageChain(messageChain: MessageChain, data: Unit): Array<String> {\n            return arrayOf(\"visitMessageChain\") + super.visitMessageChain(messageChain, data)\n        }\n\n        override fun visitCombinedMessage(message: CombinedMessage, data: Unit): Array<String> {\n            return arrayOf(\"visitCombinedMessage\") + super.visitCombinedMessage(message, data)\n        }\n\n        override fun visitMessageContent(message: MessageContent, data: Unit): Array<String> {\n            return arrayOf(\"visitMessageContent\") + super.visitMessageContent(message, data)\n        }\n\n        override fun visitMessageMetadata(message: MessageMetadata, data: Unit): Array<String> {\n            return arrayOf(\"visitMessageMetadata\") + super.visitMessageMetadata(message, data)\n        }\n\n        override fun visitMessageOrigin(message: MessageOrigin, data: Unit): Array<String> {\n            return arrayOf(\"visitMessageOrigin\") + super.visitMessageOrigin(message, data)\n        }\n\n        override fun visitMessageSource(message: MessageSource, data: Unit): Array<String> {\n            return arrayOf(\"visitMessageSource\") + super.visitMessageSource(message, data)\n        }\n\n        override fun visitQuoteReply(message: QuoteReply, data: Unit): Array<String> {\n            return arrayOf(\"visitQuoteReply\") + super.visitQuoteReply(message, data)\n        }\n\n        override fun visitCustomMessageMetadata(message: CustomMessageMetadata, data: Unit): Array<String> {\n            return arrayOf(\"visitCustomMessageMetadata\") + super.visitCustomMessageMetadata(message, data)\n        }\n\n        override fun visitShowImageFlag(message: ShowImageFlag, data: Unit): Array<String> {\n            return arrayOf(\"visitShowImageFlag\") + super.visitShowImageFlag(message, data)\n        }\n\n        override fun visitPlainText(message: PlainText, data: Unit): Array<String> {\n            return arrayOf(\"visitPlainText\") + super.visitPlainText(message, data)\n        }\n\n        override fun visitAt(message: At, data: Unit): Array<String> {\n            return arrayOf(\"visitAt\") + super.visitAt(message, data)\n        }\n\n        override fun visitAtAll(message: AtAll, data: Unit): Array<String> {\n            return arrayOf(\"visitAtAll\") + super.visitAtAll(message, data)\n        }\n\n        @Suppress(\"DEPRECATION_ERROR\")\n        override fun visitVoice(message: Voice, data: Unit): Array<String> {\n            return arrayOf(\"visitVoice\") + super.visitVoice(message, data)\n        }\n\n        override fun visitAudio(message: Audio, data: Unit): Array<String> {\n            return arrayOf(\"visitAudio\") + super.visitAudio(message, data)\n        }\n\n        override fun visitHummerMessage(message: HummerMessage, data: Unit): Array<String> {\n            return arrayOf(\"visitHummerMessage\") + super.visitHummerMessage(message, data)\n        }\n\n        override fun visitFlashImage(message: FlashImage, data: Unit): Array<String> {\n            return arrayOf(\"visitFlashImage\") + super.visitFlashImage(message, data)\n        }\n\n        override fun visitPokeMessage(message: PokeMessage, data: Unit): Array<String> {\n            return arrayOf(\"visitPokeMessage\") + super.visitPokeMessage(message, data)\n        }\n\n        override fun visitVipFace(message: VipFace, data: Unit): Array<String> {\n            return arrayOf(\"visitVipFace\") + super.visitVipFace(message, data)\n        }\n\n        override fun visitMarketFace(message: MarketFace, data: Unit): Array<String> {\n            return arrayOf(\"visitMarketFace\") + super.visitMarketFace(message, data)\n        }\n\n        override fun visitDice(message: Dice, data: Unit): Array<String> {\n            return arrayOf(\"visitDice\") + super.visitDice(message, data)\n        }\n\n        override fun visitRockPaperScissors(message: RockPaperScissors, data: Unit): Array<String> {\n            return arrayOf(\"visitRockPaperScissors\") + super.visitRockPaperScissors(message, data)\n        }\n\n        override fun visitFace(message: Face, data: Unit): Array<String> {\n            return arrayOf(\"visitFace\") + super.visitFace(message, data)\n        }\n\n        override fun visitSuperFace(message: SuperFace, data: Unit): Array<String> {\n            return arrayOf(\"visitSuperFace\") + super.visitSuperFace(message, data)\n        }\n\n        override fun visitFileMessage(message: FileMessage, data: Unit): Array<String> {\n            return arrayOf(\"visitFileMessage\") + super.visitFileMessage(message, data)\n        }\n\n        override fun visitImage(message: Image, data: Unit): Array<String> {\n            return arrayOf(\"visitImage\") + super.visitImage(message, data)\n        }\n\n        override fun visitForwardMessage(message: ForwardMessage, data: Unit): Array<String> {\n            return arrayOf(\"visitForwardMessage\") + super.visitForwardMessage(message, data)\n        }\n\n        override fun visitMusicShare(message: MusicShare, data: Unit): Array<String> {\n            return arrayOf(\"visitMusicShare\") + super.visitMusicShare(message, data)\n        }\n\n        override fun visitUnsupportedMessage(message: UnsupportedMessage, data: Unit): Array<String> {\n            return arrayOf(\"visitUnsupportedMessage\") + super.visitUnsupportedMessage(message, data)\n        }\n\n        override fun visitRichMessage(message: RichMessage, data: Unit): Array<String> {\n            return arrayOf(\"visitRichMessage\") + super.visitRichMessage(message, data)\n        }\n\n        override fun visitServiceMessage(message: ServiceMessage, data: Unit): Array<String> {\n            return arrayOf(\"visitServiceMessage\") + super.visitServiceMessage(message, data)\n        }\n\n        override fun visitSimpleServiceMessage(message: SimpleServiceMessage, data: Unit): Array<String> {\n            return arrayOf(\"visitSimpleServiceMessage\") + super.visitSimpleServiceMessage(message, data)\n        }\n\n        override fun visitLightApp(message: LightApp, data: Unit): Array<String> {\n            return arrayOf(\"visitLightApp\") + super.visitLightApp(message, data)\n        }\n\n        override fun visitAbstractServiceMessage(message: AbstractServiceMessage, data: Unit): Array<String> {\n            return arrayOf(\"visitAbstractServiceMessage\") + super.visitAbstractServiceMessage(message, data)\n        }\n    }\n\n    @OptIn(MessageChainConstructor::class)\n    @Test\n    fun visitMessageChain() {\n        assertContentEquals(\n            arrayOf(\n                \"visitMessageChain\",\n                \"visitMessage\",\n            ),\n            messageChainOf(PlainText(\"1\")).accept(GetCalledMethodNames)\n        )\n        assertContentEquals(\n            arrayOf(\n                \"visitMessageChain\",\n                \"visitMessage\",\n            ),\n            emptyMessageChain().accept(GetCalledMethodNames)\n        )\n        assertContentEquals(\n            arrayOf(\n                \"visitCombinedMessage\",\n                \"visitMessageChain\",\n                \"visitMessage\",\n            ),\n            CombinedMessage(AtAll, AtAll, false).accept(GetCalledMethodNames)\n        )\n    }\n\n    @Test\n    fun visitSingleMessageContent() {\n        assertContentEquals(\n            arrayOf(\n                \"visitMessage\",\n            ),\n            object : Message {\n                @Suppress(\"RedundantOverride\") // false positive\n                override fun toString(): String = super.toString()\n                override fun contentToString(): String = super.toString()\n            }.accept(GetCalledMethodNames)\n        )\n\n        assertContentEquals(\n            arrayOf(\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            object : SingleMessage {\n                @Suppress(\"RedundantOverride\") // false positive\n                override fun toString(): String = super.toString()\n                override fun contentToString(): String = super.toString()\n            }.accept(GetCalledMethodNames)\n        )\n\n        assertContentEquals(\n            arrayOf(\n                \"visitMessageContent\",\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            object : MessageContent {\n                @Suppress(\"RedundantOverride\") // false positive\n                override fun toString(): String = super.toString()\n                override fun contentToString(): String = super.toString()\n            }.accept(GetCalledMethodNames)\n        )\n\n        assertContentEquals(\n            arrayOf(\n                \"visitPlainText\",\n                \"visitMessageContent\",\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            PlainText(\"1\").accept(GetCalledMethodNames)\n        )\n\n        assertContentEquals(\n            arrayOf(\n                \"visitAt\",\n                \"visitMessageContent\",\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            At(1).accept(GetCalledMethodNames)\n        )\n\n        assertContentEquals(\n            arrayOf(\n                \"visitAtAll\",\n                \"visitMessageContent\",\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            AtAll.accept(GetCalledMethodNames)\n        )\n\n        assertContentEquals(\n            arrayOf(\n                \"visitVoice\",\n                \"visitMessageContent\",\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            @Suppress(\"DEPRECATION_ERROR\")\n            Voice(\"\", byteArrayOf(), 1, 1, \"\").accept(GetCalledMethodNames)\n        )\n\n        assertContentEquals(\n            arrayOf(\n                \"visitAudio\",\n                \"visitMessageContent\",\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            object : OfflineAudio {\n                override val filename: String get() = \"\"\n                override val fileMd5: ByteArray get() = byteArrayOf()\n                override val fileSize: Long get() = 1\n                override val codec: AudioCodec get() = AudioCodec.AMR\n                override val extraData: ByteArray? get() = null\n                override fun toString(): String = \"test\"\n            }.accept(GetCalledMethodNames)\n        )\n\n        assertContentEquals(\n            arrayOf(\n                \"visitFlashImage\",\n                \"visitHummerMessage\",\n                \"visitMessageContent\",\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            FlashImage(createImage()).accept(GetCalledMethodNames)\n        )\n\n        assertContentEquals(\n            arrayOf(\n                \"visitSuperFace\",\n                \"visitHummerMessage\",\n                \"visitMessageContent\",\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            SuperFace.from(Face(Face.DA_CALL)).accept(GetCalledMethodNames)\n        )\n\n        assertContentEquals(\n            arrayOf(\n                \"visitPokeMessage\",\n                \"visitHummerMessage\",\n                \"visitMessageContent\",\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            PokeMessage.BiXin.accept(GetCalledMethodNames)\n        )\n\n        assertContentEquals(\n            arrayOf(\n                \"visitVipFace\",\n                \"visitHummerMessage\",\n                \"visitMessageContent\",\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            VipFace(VipFace.AiXin, 1).accept(GetCalledMethodNames)\n        )\n\n        assertContentEquals(\n            arrayOf(\n                \"visitMarketFace\",\n                \"visitHummerMessage\",\n                \"visitMessageContent\",\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            object : MarketFace {\n                override val name: String get() = \"f\"\n                override val id: Int get() = 1\n                override fun toString(): String = \"ok\"\n            }.accept(GetCalledMethodNames)\n        )\n\n        assertContentEquals(\n            arrayOf(\n                \"visitDice\",\n                \"visitMarketFace\",\n                \"visitHummerMessage\",\n                \"visitMessageContent\",\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            Dice(1).accept(GetCalledMethodNames)\n        )\n\n        assertContentEquals(\n            arrayOf(\n                \"visitRockPaperScissors\",\n                \"visitMarketFace\",\n                \"visitHummerMessage\",\n                \"visitMessageContent\",\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            RockPaperScissors.PAPER.accept(GetCalledMethodNames)\n        )\n\n\n        assertContentEquals(\n            arrayOf(\n                \"visitFace\",\n                \"visitMessageContent\",\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            Face(Face.AI_NI).accept(GetCalledMethodNames)\n        )\n\n        assertContentEquals(\n            arrayOf(\n                \"visitFileMessage\",\n                \"visitMessageContent\",\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            object : FileMessage {\n                override val id: String get() = \"\"\n                override val internalId: Int get() = 1\n                override val name: String get() = \"\"\n                override val size: Long get() = 1\n\n                override suspend fun toAbsoluteFile(contact: FileSupported): Nothing =\n                    throw UnsupportedOperationException()\n\n                override fun toString(): String = \"\"\n            }.accept(GetCalledMethodNames)\n        )\n\n        assertContentEquals(\n            arrayOf(\n                \"visitImage\",\n                \"visitMessageContent\",\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            createImage().accept(GetCalledMethodNames)\n        )\n\n        assertContentEquals(\n            arrayOf(\n                \"visitForwardMessage\",\n                \"visitMessageContent\",\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            ForwardMessage(listOf(), \"\", \"\", \"\", \"\", listOf()).accept(GetCalledMethodNames)\n        )\n\n        assertContentEquals(\n            arrayOf(\n                \"visitMusicShare\",\n                \"visitMessageContent\",\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            MusicShare(\n                kind = MusicKind.NeteaseCloudMusic,\n                title = \"ファッション\",\n                summary = \"rinahamu/Yunomi\",\n                brief = \"\",\n                jumpUrl = \"https://music.163.com/song/1338728297/?userid=324076307\",\n                pictureUrl = \"https://p2.music.126.net/y19E5SadGUmSR8SZxkrNtw==/109951163785855539.jpg\",\n                musicUrl = \"https://music.163.com/song/media/outer/url?id=1338728297&userid=324076307\"\n            ).accept(GetCalledMethodNames)\n        )\n\n        assertContentEquals(\n            arrayOf(\n                \"visitUnsupportedMessage\",\n                \"visitMessageContent\",\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            object : UnsupportedMessage {\n                override val struct: ByteArray get() = byteArrayOf()\n                override fun toString(): String = \"test\"\n            }.accept(GetCalledMethodNames)\n        )\n\n        assertContentEquals(\n            arrayOf(\n                \"visitSimpleServiceMessage\",\n                \"visitServiceMessage\",\n                \"visitRichMessage\",\n                \"visitMessageContent\",\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            SimpleServiceMessage(1, \"str\").accept(GetCalledMethodNames)\n        )\n\n        assertContentEquals(\n            arrayOf(\n                \"visitLightApp\",\n                \"visitRichMessage\",\n                \"visitMessageContent\",\n                \"visitSingleMessage\",\n                \"visitMessage\",\n            ),\n            LightApp(\"str\").accept(GetCalledMethodNames)\n        )\n    }\n}\n\nprivate fun createImage(): Image {\n    return object : Image {\n        override val imageId: String get() = \"{88914B32-B758-74ED-B00D-CAA6D2A5D7F6}.jpg\"\n        override val width: Int get() = 1\n        override val height: Int get() = 1\n        override val size: Long get() = 1\n        override val imageType: ImageType get() = ImageType.APNG\n\n        override fun toString(): String = \"test\"\n        override fun contentToString(): String = \"test\"\n\n        @MiraiExperimentalApi\n        override fun appendMiraiCodeTo(builder: StringBuilder) {\n        }\n\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonTest/kotlin/message.data/TestMessageChainDelegate.kt",
    "content": "/*\n * Copyright 2019-2020 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\npackage net.mamoe.mirai.message.data\n\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class TestMessageChainDelegate {\n    private val message = messageChainOf(AtAll, PlainText(\"test\"))\n\n    @Test\n    fun testGetValue() {\n        @Suppress(\"UNUSED_VARIABLE\")\n        val atAll: AtAll by message\n        val plain: PlainText by message\n        assertEquals(plain.content, \"test\")\n    }\n\n    @Test\n    fun testOrNull() {\n        @Suppress(\"UNUSED_VARIABLE\")\n        val atAll: AtAll? by message.orNull()\n        val plain: PlainText? by message.orNull()\n        assertEquals(plain!!.content, \"test\")\n    }\n\n    @Test\n    fun testOrElse() {\n        val message = messageChainOf()\n\n        @Suppress(\"UNUSED_VARIABLE\")\n        val plain: PlainText? by message.orElse { PlainText(\"test\") }\n        assertEquals(plain!!.content, \"test\")\n    }\n\n}"
  },
  {
    "path": "mirai-core-api/src/commonTest/kotlin/package.kt",
    "content": "/*\n * Copyright 2019-2020 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\npackage net.mamoe.mirai"
  },
  {
    "path": "mirai-core-api/src/commonTest/kotlin/test/TestDSL.kt",
    "content": "/*\n * Copyright 2019-2020 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage net.mamoe.mirai.test\n\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFalse\nimport kotlin.test.assertNotEquals\nimport kotlin.test.assertTrue\n\n@DslMarker\ninternal annotation class TestDSL\n\n@TestDSL\nfun Boolean.shouldBeTrue() = assertTrue { this }\n\n@TestDSL\nfun Boolean.shouldBeFalse() = assertFalse { this }\n\n@TestDSL\ninfix fun <E> E.shouldBeEqualTo(another: E) = assertEquals(another, this)\n\n@TestDSL\ninfix fun <E> E.shouldNotBeEqualTo(another: E) = assertNotEquals(another, this)"
  },
  {
    "path": "mirai-core-api/src/commonTest/kotlin/utils/DeviceInfoTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.serialization.json.Json\nimport kotlinx.serialization.json.jsonObject\nimport kotlinx.serialization.json.jsonPrimitive\nimport kotlin.random.Random\nimport kotlin.test.Test\nimport kotlin.test.assertContentEquals\nimport kotlin.test.assertEquals\nimport kotlin.test.assertTrue\n\nclass CommonDeviceInfoTest {\n    @Test\n    fun `DeviceInfo_random with custom Random is stable`() {\n        val time = currentTimeMillis()\n        assertEquals(DeviceInfo.random(Random(time)), DeviceInfo.random(Random(time)))\n    }\n\n\n    class HexStringTest {\n        @Test\n        fun `can serialize as String`() {\n            val hexString = DeviceInfoManager.HexString(byteArrayOf(1, 2))\n            val string = Json.encodeToString(DeviceInfoManager.HexString.serializer(), hexString)\n            assertEquals(\"\\\"0102\\\"\", string)\n        }\n\n        @Test\n        fun `can deserialize from String`() {\n            val hex = Json.decodeFromString(DeviceInfoManager.HexString.serializer(), \"\\\"0102\\\"\")\n            assertContentEquals(byteArrayOf(1, 2), hex.data)\n        }\n    }\n\n    @Test\n    fun `can serialize and deserialize v3`() {\n        val device = DeviceInfo.random()\n        assertEquals(device, DeviceInfoManager.deserialize(DeviceInfoManager.serialize(device)))\n    }\n\n    @Test\n    fun `current version pretty print preview`() {\n        val device = DeviceInfo.random()\n\n        val text = DeviceInfoManager.serialize(device, Json {\n            prettyPrint = true\n        })\n        println(text)\n        /*\n{\n    \"deviceInfoVersion\": 2,\n    \"data\": {\n        \"display\": \"MIRAI.868912.001\",\n        \"product\": \"mirai\",\n        \"device\": \"mirai\",\n        \"board\": \"mirai\",\n        \"brand\": \"mamoe\",\n        \"model\": \"mirai\",\n        \"bootloader\": \"unknown\",\n        \"fingerprint\": \"mamoe/mirai/mirai:10/MIRAI.200122.001/6174518:user/release-keys\",\n        \"bootId\": \"500E9D6F-1A76-4ED0-20F3-66A5B20C7049\",\n        \"procVersion\": \"Linux version 3.0.31-r35YRB94 (android-build@xxx.xxx.xxx.xxx.com)\",\n        \"baseBand\": \"\",\n        \"version\": {\n            \"incremental\": \"5891938\",\n            \"release\": \"10\",\n            \"codename\": \"REL\"\n        },\n        \"simInfo\": \"T-Mobile\",\n        \"osType\": \"android\",\n        \"macAddress\": \"02:00:00:00:00:00\",\n        \"wifiBSSID\": \"02:00:00:00:00:00\",\n        \"wifiSSID\": \"<unknown ssid>\",\n        \"imsiMd5\": \"d1ead821747a3ad3f8f3784fafa3b954\",\n        \"imei\": \"155970036849035\",\n        \"apn\": \"wifi\"\n    }\n}\n         */\n\n        val element = DeviceInfoManager.toJsonElement(device)\n        assertEquals(3, element.jsonObject[\"deviceInfoVersion\"]!!.jsonPrimitive.content.toInt())\n\n        val imsiMd5 = element.jsonObject[\"data\"]!!.jsonObject[\"imsiMd5\"]!!.jsonPrimitive.content\n        assertEquals(\n            device.imsiMd5.toUHexString(\"\").lowercase(),\n            imsiMd5\n        )\n        assertTrue { imsiMd5 matches Regex(\"\"\"[a-z0-9]+\"\"\") }\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonTest/kotlin/utils/JvmDeviceInfoTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.serialization.json.Json\nimport net.mamoe.mirai.utils.DeviceInfo.Companion.loadAsDeviceInfo\nimport net.mamoe.mirai.utils.DeviceInfoManager.Version.Companion.trans\nimport org.junit.jupiter.api.io.TempDir\nimport java.io.File\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertTrue\n\nclass JvmDeviceInfoTest {\n\n    @TempDir\n    lateinit var dir: File\n\n    @Test\n    fun `can write and read`() {\n        val device = DeviceInfo.random()\n        val file = dir.resolve(\"device.json\")\n\n        file.writeText(DeviceInfoManager.serialize(device))\n        assertEquals(device, file.loadAsDeviceInfo())\n    }\n\n    @Test\n    fun `can write read legacy v1`() {\n        val device = DeviceInfo.random()\n        val file = dir.resolve(\"device.json\")\n\n        val encoded = Json.encodeToString(\n            DeviceInfoManager.V1.serializer(), DeviceInfoManager.V1(\n                display = device.display,\n                product = device.product,\n                device = device.device,\n                board = device.board,\n                brand = device.brand,\n                model = device.model,\n                bootloader = device.bootloader,\n                fingerprint = device.fingerprint,\n                bootId = device.bootId,\n                procVersion = device.procVersion,\n                baseBand = device.baseBand,\n                version = device.version,\n                simInfo = device.simInfo,\n                osType = device.osType,\n                macAddress = device.macAddress,\n                wifiBSSID = device.wifiBSSID,\n                wifiSSID = device.wifiSSID,\n                imsiMd5 = device.imsiMd5,\n                imei = device.imei,\n                apn = device.apn,\n            )\n        )\n\n        file.writeText(encoded)\n        val fileDeviceInfo = file.loadAsDeviceInfo()\n\n        assertTrue { isSameType(device, fileDeviceInfo) }\n\n        assertTrue { device.display.contentEquals(fileDeviceInfo.display) }\n        assertTrue { device.product.contentEquals(fileDeviceInfo.product) }\n        assertTrue { device.device.contentEquals(fileDeviceInfo.device) }\n        assertTrue { device.board.contentEquals(fileDeviceInfo.board) }\n        assertTrue { device.brand.contentEquals(fileDeviceInfo.brand) }\n        assertTrue { device.model.contentEquals(fileDeviceInfo.model) }\n        assertTrue { device.bootloader.contentEquals(fileDeviceInfo.bootloader) }\n        assertTrue { device.fingerprint.contentEquals(fileDeviceInfo.fingerprint) }\n        assertTrue { device.bootId.contentEquals(fileDeviceInfo.bootId) }\n        assertTrue { device.procVersion.contentEquals(fileDeviceInfo.procVersion) }\n        assertTrue { device.baseBand.contentEquals(fileDeviceInfo.baseBand) }\n        assertEquals(device.version, fileDeviceInfo.version)\n        assertTrue { device.simInfo.contentEquals(fileDeviceInfo.simInfo) }\n        assertTrue { device.osType.contentEquals(fileDeviceInfo.osType) }\n        assertTrue { device.macAddress.contentEquals(fileDeviceInfo.macAddress) }\n        assertTrue { device.wifiBSSID.contentEquals(fileDeviceInfo.wifiBSSID) }\n        assertTrue { device.wifiSSID.contentEquals(fileDeviceInfo.wifiSSID) }\n        assertTrue { device.imsiMd5.contentEquals(fileDeviceInfo.imsiMd5) }\n        assertEquals(device.imei, fileDeviceInfo.imei)\n        assertTrue { device.apn.contentEquals(fileDeviceInfo.apn) }\n        assertTrue { device.androidId.size == fileDeviceInfo.androidId.size }\n    }\n\n    @Test\n    fun `can write and read legacy v2`() {\n        val device = DeviceInfo.random()\n        val file = dir.resolve(\"device.json\")\n\n        val encoded = Json.encodeToString(\n            DeviceInfoManager.Wrapper.serializer(DeviceInfoManager.V2.serializer()),\n            DeviceInfoManager.Wrapper(\n                2, DeviceInfoManager.V2(\n                    display = device.display.decodeToString(),\n                    product = device.product.decodeToString(),\n                    device = device.device.decodeToString(),\n                    board = device.board.decodeToString(),\n                    brand = device.brand.decodeToString(),\n                    model = device.model.decodeToString(),\n                    bootloader = device.bootloader.decodeToString(),\n                    fingerprint = device.fingerprint.decodeToString(),\n                    bootId = device.bootId.decodeToString(),\n                    procVersion = device.procVersion.decodeToString(),\n                    baseBand = DeviceInfoManager.HexString(device.baseBand),\n                    version = device.version.trans(),\n                    simInfo = device.simInfo.decodeToString(),\n                    osType = device.osType.decodeToString(),\n                    macAddress = device.macAddress.decodeToString(),\n                    wifiBSSID = device.wifiBSSID.decodeToString(),\n                    wifiSSID = device.wifiSSID.decodeToString(),\n                    imsiMd5 = DeviceInfoManager.HexString(device.imsiMd5),\n                    imei = device.imei,\n                    apn = device.apn.decodeToString(),\n                )\n            )\n        )\n\n        file.writeText(encoded)\n        val fileDeviceInfo = file.loadAsDeviceInfo()\n\n        assertTrue { isSameType(device, fileDeviceInfo) }\n\n        assertTrue { device.display.contentEquals(fileDeviceInfo.display) }\n        assertTrue { device.product.contentEquals(fileDeviceInfo.product) }\n        assertTrue { device.device.contentEquals(fileDeviceInfo.device) }\n        assertTrue { device.board.contentEquals(fileDeviceInfo.board) }\n        assertTrue { device.brand.contentEquals(fileDeviceInfo.brand) }\n        assertTrue { device.model.contentEquals(fileDeviceInfo.model) }\n        assertTrue { device.bootloader.contentEquals(fileDeviceInfo.bootloader) }\n        assertTrue { device.fingerprint.contentEquals(fileDeviceInfo.fingerprint) }\n        assertTrue { device.bootId.contentEquals(fileDeviceInfo.bootId) }\n        assertTrue { device.procVersion.contentEquals(fileDeviceInfo.procVersion) }\n        assertTrue { device.baseBand.contentEquals(fileDeviceInfo.baseBand) }\n        assertEquals(device.version, fileDeviceInfo.version)\n        assertTrue { device.simInfo.contentEquals(fileDeviceInfo.simInfo) }\n        assertTrue { device.osType.contentEquals(fileDeviceInfo.osType) }\n        assertTrue { device.macAddress.contentEquals(fileDeviceInfo.macAddress) }\n        assertTrue { device.wifiBSSID.contentEquals(fileDeviceInfo.wifiBSSID) }\n        assertTrue { device.wifiSSID.contentEquals(fileDeviceInfo.wifiSSID) }\n        assertTrue { device.imsiMd5.contentEquals(fileDeviceInfo.imsiMd5) }\n        assertEquals(device.imei, fileDeviceInfo.imei)\n        assertTrue { device.apn.contentEquals(fileDeviceInfo.apn) }\n        assertTrue { device.androidId.size == fileDeviceInfo.androidId.size }\n    }\n\n    @Test\n    fun `can write and read v3`() {\n        val device = DeviceInfo.random()\n        val file = dir.resolve(\"device.json\")\n\n        val encoded = Json.encodeToString(\n            DeviceInfoManager.Wrapper.serializer(DeviceInfoManager.V3.serializer()),\n            DeviceInfoManager.Wrapper(\n                3, DeviceInfoManager.V3(\n                    display = device.display.decodeToString(),\n                    product = device.product.decodeToString(),\n                    device = device.device.decodeToString(),\n                    board = device.board.decodeToString(),\n                    brand = device.brand.decodeToString(),\n                    model = device.model.decodeToString(),\n                    bootloader = device.bootloader.decodeToString(),\n                    fingerprint = device.fingerprint.decodeToString(),\n                    bootId = device.bootId.decodeToString(),\n                    procVersion = device.procVersion.decodeToString(),\n                    baseBand = DeviceInfoManager.HexString(device.baseBand),\n                    version = device.version.trans(),\n                    simInfo = device.simInfo.decodeToString(),\n                    osType = device.osType.decodeToString(),\n                    macAddress = device.macAddress.decodeToString(),\n                    wifiBSSID = device.wifiBSSID.decodeToString(),\n                    wifiSSID = device.wifiSSID.decodeToString(),\n                    imsiMd5 = DeviceInfoManager.HexString(device.imsiMd5),\n                    imei = device.imei,\n                    apn = device.apn.decodeToString(),\n                    androidId = device.androidId.decodeToString()\n                )\n            )\n        )\n\n        file.writeText(encoded)\n        val fileDeviceInfo = file.loadAsDeviceInfo()\n\n        assertEquals(device, fileDeviceInfo)\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonTest/kotlin/utils/TimeTest.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\npackage net.mamoe.mirai.utils\n\nimport kotlin.test.Test\nimport kotlin.test.assertTrue\nimport kotlin.time.DurationUnit\nimport kotlin.time.ExperimentalTime\nimport kotlin.time.toDuration\n\ninternal class TimeTest {\n    // since 2.7\n    @OptIn(ExperimentalTime::class)\n    @Test\n    fun testTimeHumanReadable2() {\n        val time0 = (1.toDuration(DurationUnit.DAYS) +\n                20.toDuration(DurationUnit.HOURS) +\n                15.toDuration(DurationUnit.MINUTES) +\n                2057.toDuration(DurationUnit.MILLISECONDS)).inWholeMilliseconds\n\n        println(time0.millisToHumanReadableString())\n        assertTrue { time0.millisToHumanReadableString() == \"1d 20h 15min 2.057s\" }\n        val time1 = (1.toDuration(DurationUnit.DAYS) + 59.toDuration(DurationUnit.MINUTES)).inWholeMilliseconds\n        println(time1.millisToHumanReadableString())\n        assertTrue { time1.millisToHumanReadableString() == \"1d 59min 0.0s\" }\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/commonTest/resources/log4j.properties",
    "content": "#\n# Copyright 2019-2021 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\nlog4j.rootLogger=INFO,stdout\nlog4j.logger.mirai=INFO\nlog4j.appender.stdout=org.apache.log4j.ConsoleAppender\nlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout\nlog4j.appender.stdout.layout.ConversionPattern=%p\\t%d{ISO8601}\\t%r\\t%c\\t%m%n"
  },
  {
    "path": "mirai-core-api/src/jvmMain/kotlin/package.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai"
  },
  {
    "path": "mirai-core-api/src/jvmMain/kotlin/utils/LoginSolver.TxCaptchaHelper.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.coroutines.*\nimport java.io.IOException\nimport java.net.HttpURLConnection\nimport java.net.URL\n\ninternal abstract class TxCaptchaHelper {\n    private val newClient: Boolean = true\n    private lateinit var queue: Job\n\n    private var latestDisplay = \"Sending request...\"\n\n    abstract fun onComplete(ticket: String)\n    abstract fun updateDisplay(msg: String)\n\n    fun start(scope: CoroutineScope, url: String) {\n        val url0 = url.replace(\"ssl.captcha.qq.com\", \"txhelper.glitch.me\")\n        val queue = scope.launch {\n            updateDisplay(latestDisplay)\n            while (isActive) {\n                try {\n                    val response: String = runInterruptible(Dispatchers.IO) { httpGet(url0) }\n                    if (response.startsWith(\"请在\")) {\n                        if (response != latestDisplay) {\n                            latestDisplay = response\n                            updateDisplay(response)\n                        }\n                    } else {\n                        onComplete(response)\n                        return@launch\n                    }\n                } catch (e: Throwable) {\n                    updateDisplay(e.toString().also { latestDisplay = it })\n                }\n                delay(1000)\n            }\n        }\n        if (newClient) {\n            queue.invokeOnCompletion { }\n        }\n        this.queue = queue\n    }\n\n    fun dispose() {\n        queue.cancel()\n    }\n\n    @Throws(IOException::class)\n    private fun httpGet(url: String): String {\n        val connection = URL(url).openConnection() as? HttpURLConnection\n            ?: throw UnsupportedOperationException(\"Could not create HttpURLConnection\")\n        connection.requestMethod = \"GET\"\n        connection.connectTimeout = 5000\n        connection.readTimeout = 5000\n        connection.instanceFollowRedirects = true\n        connection.doInput = true\n\n        val result = connection.inputStream.use { it.readBytes() }.decodeToString()\n        connection.disconnect()\n        return result\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/jvmMain/kotlin/utils/LoginSolver.jvm.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.coroutineScope\nimport kotlinx.coroutines.runInterruptible\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport kotlinx.coroutines.withContext\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.auth.QRCodeLoginListener\nimport net.mamoe.mirai.network.NoStandardInputForCaptchaException\nimport net.mamoe.mirai.utils.StandardCharImageLoginSolver.Companion.createBlocking\nimport java.awt.Image\nimport java.awt.image.BufferedImage\nimport java.io.File\nimport javax.imageio.ImageIO\nimport kotlin.coroutines.resume\nimport kotlin.coroutines.suspendCoroutine\n\ninternal actual object PlatformLoginSolverImplementations {\n    actual val isSliderCaptchaSupported: Boolean get() = default!!.isSliderCaptchaSupported\n    actual val default: LoginSolver? by lazy {\n        StandardCharImageLoginSolver()\n    }\n}\n\n/**\n * CLI 环境 [LoginSolver]. 将验证码图片转为字符画并通过 `output` 输出, [input] 获取用户输入.\n *\n * 使用字符图片展示验证码, 使用 [input] 获取输入, 使用 [loggerSupplier] 输出\n *\n * @see createBlocking\n */\npublic class StandardCharImageLoginSolver\n@JvmOverloads constructor(\n    input: suspend () -> String = {\n        readlnOrNull() ?: @OptIn(MiraiInternalApi::class) throw NoStandardInputForCaptchaException()\n    },\n    /**\n     * 为 `null` 时使用 [Bot.logger]\n     */\n    private val loggerSupplier: (bot: Bot) -> MiraiLogger = { it.logger }\n) : LoginSolver() {\n    public constructor(\n        input: suspend () -> String = {\n            readlnOrNull() ?: @OptIn(MiraiInternalApi::class) throw NoStandardInputForCaptchaException()\n        },\n        overrideLogger: MiraiLogger?\n    ) : this(input, { overrideLogger ?: it.logger })\n\n    private val input: suspend () -> String = suspend {\n        withContext(Dispatchers.IO) { input() }\n    }\n\n    override val isSliderCaptchaSupported: Boolean get() = true\n    override fun createQRCodeLoginListener(bot: Bot): QRCodeLoginListener {\n        return object : QRCodeLoginListener {\n            private var tmpFile: File? = null\n\n            override val qrCodeMargin: Int get() = 1\n            override val qrCodeSize: Int get() = 1\n\n            override fun onFetchQRCode(bot: Bot, data: ByteArray) {\n                val logger = loggerSupplier(bot)\n\n                logger.info { \"[QRCodeLogin] 已获取登录二维码，请在手机 QQ 使用账号 ${bot.id} 扫码\" }\n                logger.info { \"[QRCodeLogin] Fetched login qrcode, please scan via qq android with account ${bot.id}.\" }\n\n                try {\n                    val tempFile: File\n                    if (tmpFile == null) {\n                        tempFile = File.createTempFile(\n                            \"mirai-qrcode-${bot.id}-${currentTimeSeconds()}\",\n                            \".png\"\n                        ).apply { deleteOnExit() }\n\n                        tempFile.createNewFile()\n\n                        tmpFile = tempFile\n                    } else {\n                        tempFile = tmpFile!!\n                    }\n\n                    tempFile.writeBytes(data)\n                    logger.info { \"[QRCodeLogin] 将会显示二维码图片，若看不清图片，请查看文件 ${tempFile.toPath().toUri()}\" }\n                    logger.info { \"[QRCodeLogin] Displaying qrcode image. If not clear, view file ${tempFile.toPath().toUri()}.\" }\n                } catch (e: Exception) {\n                    logger.warning(\"[QRCodeLogin] 无法写出二维码图片. 请尽量关闭终端个性化样式后扫描二维码字符图片\", e)\n                    logger.warning(\n                        \"[QRCodeLogin] Failed to export qrcode image. Please try to scan the char-image after disabling custom terminal style.\",\n                        e\n                    )\n                }\n\n                data.inputStream().use { stream ->\n                    try {\n                        val isCacheEnabled = ImageIO.getUseCache()\n\n                        try {\n                            ImageIO.setUseCache(false)\n                            val img = ImageIO.read(stream)\n                            if (img == null) {\n                                logger.warning { \"[QRCodeLogin] 无法创建字符图片. 请查看文件\" }\n                                logger.warning { \"[QRCodeLogin] Failed to create char-image. Please see the file.\" }\n                            } else {\n                                logger.info { \"[QRCodeLogin] \\n\" + img.renderQRCode() }\n                            }\n                        } finally {\n                            ImageIO.setUseCache(isCacheEnabled)\n                        }\n\n                    } catch (throwable: Throwable) {\n                        logger.warning(\"[QRCodeLogin] 创建字符图片时出错. 请查看文件.\", throwable)\n                        logger.warning(\"[QRCodeLogin] Failed to create char-image. Please see the file.\", throwable)\n                    }\n                }\n            }\n\n            override fun onStateChanged(bot: Bot, state: QRCodeLoginListener.State) {\n                val logger = loggerSupplier(bot)\n                logger.info {\n                    buildString {\n                        append(\"[QRCodeLogin] \")\n                        when (state) {\n                            QRCodeLoginListener.State.WAITING_FOR_SCAN -> append(\"等待扫描二维码中\")\n                            QRCodeLoginListener.State.WAITING_FOR_CONFIRM -> append(\"扫描完成，请在手机 QQ 确认登录\")\n                            QRCodeLoginListener.State.CANCELLED -> append(\"已取消登录，将会重新获取二维码\")\n                            QRCodeLoginListener.State.TIMEOUT -> append(\"扫描超时，将会重新获取二维码\")\n                            QRCodeLoginListener.State.CONFIRMED -> append(\"已确认登录\")\n                            else -> append(\"default state\")\n                        }\n                    }\n                }\n                logger.info {\n                    buildString {\n                        append(\"[QRCodeLogin] \")\n                        when (state) {\n                            QRCodeLoginListener.State.WAITING_FOR_SCAN -> append(\"Waiting for scanning qrcode.\")\n                            QRCodeLoginListener.State.WAITING_FOR_CONFIRM -> append(\"Scan complete. Please confirm login.\")\n                            QRCodeLoginListener.State.CANCELLED -> append(\"Login cancelled, we will try to fetch qrcode again.\")\n                            QRCodeLoginListener.State.TIMEOUT -> append(\"Timeout scanning, we will try to fetch qrcode again.\")\n                            QRCodeLoginListener.State.CONFIRMED -> append(\"Login confirmed.\")\n                            else -> append(\"default state\")\n                        }\n                    }\n                }\n\n                if (state == QRCodeLoginListener.State.CONFIRMED) {\n                    kotlin.runCatching { tmpFile?.delete() }.onFailure { logger.warning(it) }\n                }\n            }\n\n        }\n    }\n\n    override suspend fun onSolvePicCaptcha(bot: Bot, data: ByteArray): String? = loginSolverLock.withLock {\n        val logger = loggerSupplier(bot)\n        runInterruptible(Dispatchers.IO) {\n            val tempFile: File = File.createTempFile(\"tmp\", \".png\").apply { deleteOnExit() }\n            tempFile.createNewFile()\n            logger.info { \"[PicCaptcha] 需要图片验证码登录, 验证码为 4 字母\" }\n            logger.info { \"[PicCaptcha] Picture captcha required. Captcha consists of 4 letters.\" }\n            try {\n                tempFile.writeBytes(data)\n                logger.info { \"[PicCaptcha] 将会显示字符图片. 若看不清字符图片, 请查看文件 file://${tempFile.absolutePath}\" }\n                logger.info { \"[PicCaptcha] Displaying char-image. If not clear, view file file://${tempFile.absolutePath}.\" }\n            } catch (e: Exception) {\n                logger.warning(\"[PicCaptcha] 无法写出验证码文件, 请尝试查看以上字符图片\", e)\n                logger.warning(\"[PicCaptcha] Failed to export captcha image. Please see the char-image.\", e)\n            }\n\n            tempFile.inputStream().use { stream ->\n                try {\n                    val img = ImageIO.read(stream)\n                    if (img == null) {\n                        logger.warning { \"[PicCaptcha] 无法创建字符图片. 请查看文件\" }\n                        logger.warning { \"[PicCaptcha] Failed to create char-image. Please see the file.\" }\n                    } else {\n                        logger.info { \"[PicCaptcha] \\n\" + img.createCharImg() }\n                    }\n                } catch (throwable: Throwable) {\n                    logger.warning(\"[PicCaptcha] 创建字符图片时出错. 请查看文件.\", throwable)\n                    logger.warning(\"[PicCaptcha] Failed to create char-image. Please see the file.\", throwable)\n                }\n            }\n        }\n        logger.info { \"[PicCaptcha] 请输入 4 位字母验证码. 若要更换验证码, 请直接回车\" }\n        logger.info { \"[PicCaptcha] Please type 4-letter captcha. Press Enter directly to refresh.\" }\n        return input().takeUnless { it.isEmpty() || it.length != 4 }.also {\n            logger.info { \"[PicCaptcha] 正在提交 $it...\" }\n            logger.info { \"[PicCaptcha] Submitting $it...\" }\n        }\n    }\n\n    override suspend fun onSolveSliderCaptcha(bot: Bot, url: String): String = loginSolverLock.withLock {\n        val logger = loggerSupplier(bot)\n        logger.info { \"[SliderCaptcha] 需要滑动验证码, 请按照以下链接的步骤完成滑动验证码, 然后输入获取到的 ticket\" }\n        logger.info { \"[SliderCaptcha] Slider captcha required. Please solve the captcha with following link. Type ticket here after completion.\" }\n        logger.info { \"[SliderCaptcha] @see https://github.com/project-mirai/mirai-login-solver-selenium\" }\n        logger.info { \"[SliderCaptcha] @see https://docs.mirai.mamoe.net/mirai-login-solver-selenium/\" }\n        logger.info { \"[SliderCaptcha] 或者输入 helper 来使用 TxCaptchaHelper 完成滑动验证码\" }\n        logger.info { \"[SliderCaptcha] Or type helper to resolve slider captcha with TxCaptchaHelper.apk\" }\n        logger.warning { \"[SliderCaptcha] TxCaptchaHelper 的在线服务疑似被屏蔽，可能无法使用。TxCaptchaHelper 现已无法满足登录QQ机器人，请在以下链接下载全新的验证器\" }\n        logger.warning { \"[SliderCaptcha] The service of TxCaptchaHelper might be blocked. We recommend you to download the new login solver plugin in below link.\" }\n        logger.warning { \"[SliderCaptcha] @see https://github.com/KasukuSakura/mirai-login-solver-sakura\" }\n        logger.info { \"[SliderCaptcha] Captcha link: $url\" }\n\n        suspend fun runTxCaptchaHelper(): String {\n            logger.info { \"[SliderCaptcha] @see https://github.com/mzdluo123/TxCaptchaHelper\" }\n            return coroutineScope {\n                suspendCoroutine { coroutine ->\n                    val helper = object : TxCaptchaHelper() {\n                        override fun onComplete(ticket: String) {\n                            coroutine.resume(ticket)\n                        }\n\n                        override fun updateDisplay(msg: String) {\n                            logger.info(msg)\n                        }\n                    }\n                    helper.start(this, url)\n                }\n            }\n        }\n\n        return input().also {\n            if (it == \"TxCaptchaHelper\" || it == \"`TxCaptchaHelper`\" || it == \"helper\" || it == \"`helper`\") {\n                return runTxCaptchaHelper()\n            }\n            logger.info { \"[SliderCaptcha] 正在提交中...\" }\n            logger.info { \"[SliderCaptcha] Submitting...\" }\n        }\n    }\n\n    @Suppress(\"DuplicatedCode\")\n    override suspend fun onSolveDeviceVerification(\n        bot: Bot, requests: DeviceVerificationRequests\n    ): DeviceVerificationResult {\n        val logger = loggerSupplier(bot)\n        requests.sms?.let { req ->\n            solveSms(logger, req)?.let { return it }\n        }\n        requests.fallback?.let { fallback ->\n            solveFallback(logger, fallback.url)\n            return fallback.solved()\n        }\n        error(\"User rejected SMS login while fallback login method not available.\")\n    }\n\n    private suspend fun solveSms(\n        logger: MiraiLogger, request: DeviceVerificationRequests.SmsRequest\n    ): DeviceVerificationResult? = loginSolverLock.withLock {\n        val countryCode = request.countryCode\n        val phoneNumber = request.phoneNumber\n        if (countryCode != null && phoneNumber != null) {\n            logger.info(\"一条短信验证码将发送到你的手机 (+$countryCode) $phoneNumber. 运营商可能会收取正常短信费用, 是否继续? 输入 yes 继续, 输入其他终止并尝试其他验证方式.\")\n            logger.info(\n                \"A verification code will be send to your phone (+$countryCode) $phoneNumber, which may be charged normally, do you wish to continue? Type yes to continue, type others to cancel and try other methods.\"\n            )\n        } else {\n            logger.info(\"一条短信验证码将发送到你的手机 (无法获取到手机号码). 运营商可能会收取正常短信费用, 是否继续? 输入 yes 继续, 输入其他终止并尝试其他验证方式.\")\n            logger.info(\n                \"A verification code will be send to your phone (failed to get phone number), \" + \"which may be charged normally by your carrier, \" + \"do you wish to continue? Type yes to continue, type others to cancel and try other methods.\"\n            )\n        }\n        val answer = input().trim()\n        return if (answer.equals(\"yes\", ignoreCase = true)) {\n            logger.info(\"Attempting SMS verification.\")\n            request.requestSms()\n            logger.info(\"Please enter code: \")\n            val code = input().trim()\n            logger.info(\"Continuing with code '$code'.\")\n            request.solved(code)\n        } else {\n            logger.info(\"Cancelled.\")\n            null\n        }\n    }\n\n    @Deprecated(\n        \"Please use onSolveDeviceVerification instead\",\n        replaceWith = ReplaceWith(\"onSolveDeviceVerification(bot, url, null)\"),\n        level = DeprecationLevel.WARNING\n    )\n    override suspend fun onSolveUnsafeDeviceLoginVerify(bot: Bot, url: String): String =\n        solveFallback(loggerSupplier(bot), url)\n\n    private suspend fun solveFallback(\n        logger: MiraiLogger, url: String\n    ): String {\n        return loginSolverLock.withLock {\n            logger.info { \"[UnsafeLogin] 当前登录环境不安全，服务器要求账户认证。请在 QQ 浏览器打开 $url 并完成验证后输入任意字符。\" }\n            logger.info { \"[UnsafeLogin] Account verification required by the server. Please open $url in QQ browser and complete challenge, then type anything here to submit.\" }\n            input().also {\n                logger.info { \"[UnsafeLogin] 正在提交中...\" }\n                logger.info { \"[UnsafeLogin] Submitting...\" }\n            }\n        }\n    }\n\n    public companion object {\n        /**\n         * 创建 Java 阻塞版 [input] 的 [StandardCharImageLoginSolver]\n         *\n         * @param input 将在协程 IO 池执行, 可以有阻塞调用\n         */\n        @JvmStatic\n        public fun createBlocking(input: () -> String, output: MiraiLogger?): StandardCharImageLoginSolver {\n            return StandardCharImageLoginSolver({ withContext(Dispatchers.IO) { input() } }, output)\n        }\n\n        /**\n         * 创建 Java 阻塞版 [input] 的 [StandardCharImageLoginSolver]\n         *\n         * @param input 将在协程 IO 池执行, 可以有阻塞调用\n         */\n        @JvmStatic\n        public fun createBlocking(input: () -> String): StandardCharImageLoginSolver {\n            return StandardCharImageLoginSolver({ withContext(Dispatchers.IO) { input() } })\n        }\n    }\n}\n\nprivate val loginSolverLock = Mutex()\n\n/**\n * @author NaturalHG\n */\nprivate fun BufferedImage.createCharImg(outputWidth: Int = 100, ignoreRate: Double = 0.95): String {\n    val newHeight = (this.height * (outputWidth.toDouble() / this.width)).toInt()\n    val tmp = this.getScaledInstance(outputWidth, newHeight, Image.SCALE_SMOOTH)\n    val image = BufferedImage(outputWidth, newHeight, BufferedImage.TYPE_INT_ARGB)\n    val g2d = image.createGraphics()\n    g2d.drawImage(tmp, 0, 0, null)\n    fun gray(rgb: Int): Int {\n        val r = rgb and 0xff0000 shr 16\n        val g = rgb and 0x00ff00 shr 8\n        val b = rgb and 0x0000ff\n        return (r * 30 + g * 59 + b * 11 + 50) / 100\n    }\n\n    fun grayCompare(g1: Int, g2: Int): Boolean =\n        kotlin.math.min(g1, g2).toDouble() / kotlin.math.max(g1, g2) >= ignoreRate\n\n    val background = gray(image.getRGB(0, 0))\n\n    return buildString(capacity = height) {\n\n        val lines = mutableListOf<StringBuilder>()\n\n        var minXPos = outputWidth\n        var maxXPos = 0\n\n        for (y in 0 until image.height) {\n            val builderLine = StringBuilder()\n            for (x in 0 until image.width) {\n                val gray = gray(image.getRGB(x, y))\n                if (grayCompare(gray, background)) {\n                    builderLine.append(\" \")\n                } else {\n                    builderLine.append(\"#\")\n                    if (x < minXPos) {\n                        minXPos = x\n                    }\n                    if (x > maxXPos) {\n                        maxXPos = x\n                    }\n                }\n            }\n            if (builderLine.toString().isBlank()) {\n                continue\n            }\n            lines.add(builderLine)\n        }\n        for (line in lines) {\n            append(line.substring(minXPos, maxXPos)).append(\"\\n\")\n        }\n    }\n}\n\n@Suppress(\"LocalVariableName\", \"SpellCheckingInspection\")\nprivate fun BufferedImage.renderQRCode(\n    blackPlaceholder: String = \"   \",\n    whitePlaceholder: String = \"   \",\n    doColorSwitch: Boolean = true,\n): String {\n    var lastStatus: Boolean? = null\n\n    fun isBlackBlock(rgb: Int): Boolean {\n        val r = rgb and 0xff0000 shr 16\n        val g = rgb and 0x00ff00 shr 8\n        val b = rgb and 0x0000ff\n\n        return r < 10 && g < 10 && b < 10\n    }\n\n    val sb = StringBuilder()\n    sb.append(\"\\n\")\n\n    val BLACK = \"\\u001b[30;40m\"\n    val WHITE = \"\\u001b[97;107m\"\n    val RESET = \"\\u001b[0m\"\n\n    for (y in 0 until height) {\n        for (x in 0 until width) {\n            val rgbcolor = getRGB(x, y)\n            val crtStatus = isBlackBlock(rgbcolor)\n\n            if (doColorSwitch && crtStatus != lastStatus) {\n                lastStatus = crtStatus\n                sb.append(\n                    if (crtStatus) BLACK else WHITE\n                )\n            }\n\n            sb.append(\n                if (crtStatus) blackPlaceholder else whitePlaceholder\n            )\n        }\n\n        if (doColorSwitch) {\n            sb.append(RESET)\n        }\n\n        sb.append(\"\\n\")\n        lastStatus = null\n    }\n\n    if (doColorSwitch) {\n        sb.append(RESET)\n    }\n\n    return sb.toString()\n}\n"
  },
  {
    "path": "mirai-core-api/src/jvmMain/kotlin/utils/PlatformLogger.jvm.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"MemberVisibilityCanBePrivate\")\n\npackage net.mamoe.mirai.utils\n\nimport java.text.DateFormat\nimport java.text.SimpleDateFormat\nimport java.time.LocalDateTime\nimport java.time.format.DateTimeFormatter\nimport java.util.*\n\n/**\n * JVM 控制台日志实现\n *\n *\n * 单条日志格式 (正则) 为:\n * ```regex\n * ^([\\w-]*\\s[\\w:]*)\\s(\\w)\\/(.*?):\\s(.+)$\n * ```\n * 其中 group 分别为: 日期与时间, 严重程度, [identity], 消息内容.\n *\n * 示例:\n * ```log\n * 2020-05-21 19:51:09 V/Bot 123456789: Send: OidbSvc.0x88d_7\n * ```\n *\n * 日期时间格式为 `yyyy-MM-dd HH:mm:ss`,\n *\n * 严重程度为 V, I, W, E. 分别对应 verbose, info, warning, error\n *\n * @param isColored 是否添加 ANSI 颜色\n *\n * @see MiraiLogger.create\n * @see SingleFileLogger 使用单一文件记录日志\n * @see DirectoryLogger 在一个目录中按日期存放文件记录日志, 自动清理过期日志\n */\n@MiraiInternalApi\npublic actual open class PlatformLogger constructor(  // same as StdoutLogger but doesn't matter\n    public override val identity: String? = \"Mirai\",\n    /**\n     * 日志输出. 不会自动添加换行\n     */\n    public open val output: (String) -> Unit,\n    public val isColored: Boolean = true\n) : MiraiLoggerPlatformBase() {\n\n    // PlatformLogger(\"\") resolves to this one.\n    public actual constructor(identity: String?) : this(identity, ::println)\n\n    public constructor(identity: String?, output: (String) -> Unit = ::println) : this(identity, output, true)\n\n    /**\n     * 输出一条日志. [message] 末尾可能不带换行符.\n     */\n    protected open fun printLog(message: String?, priority: SimpleLogger.LogPriority) {\n        @OptIn(MiraiExperimentalApi::class)\n        if (isColored) output(\"${priority.color}$currentTimeFormatted ${priority.simpleName}/$identity: $message${Color.RESET}\")\n        else output(\"$currentTimeFormatted ${priority.simpleName}/$identity: $message\")\n    }\n\n    /**\n     * 获取指定 [SimpleLogger.LogPriority] 的颜色\n     */\n    @MiraiExperimentalApi\n    protected open val SimpleLogger.LogPriority.color: Color\n        get() = when (this) {\n            SimpleLogger.LogPriority.VERBOSE -> Color.RESET\n            SimpleLogger.LogPriority.INFO -> Color.LIGHT_GREEN\n            SimpleLogger.LogPriority.WARNING -> Color.LIGHT_YELLOW\n            SimpleLogger.LogPriority.ERROR -> Color.LIGHT_RED\n            SimpleLogger.LogPriority.DEBUG -> Color.LIGHT_CYAN\n        }\n\n    public override fun verbose0(message: String?): Unit = printLog(message, SimpleLogger.LogPriority.VERBOSE)\n\n    public override fun verbose0(message: String?, e: Throwable?) {\n        if (e != null) verbose((message ?: e.toString()) + \"\\n${e.stackTraceToString()}\")\n        else verbose(message.toString())\n    }\n\n    public override fun info0(message: String?): Unit = printLog(message, SimpleLogger.LogPriority.INFO)\n    public override fun info0(message: String?, e: Throwable?) {\n        if (e != null) info((message ?: e.toString()) + \"\\n${e.stackTraceToString()}\")\n        else info(message.toString())\n    }\n\n    public override fun warning0(message: String?): Unit = printLog(message, SimpleLogger.LogPriority.WARNING)\n    public override fun warning0(message: String?, e: Throwable?) {\n        if (e != null) warning((message ?: e.toString()) + \"\\n${e.stackTraceToString()}\")\n        else warning(message.toString())\n    }\n\n    public override fun error0(message: String?): Unit = printLog(message, SimpleLogger.LogPriority.ERROR)\n    public override fun error0(message: String?, e: Throwable?) {\n        if (e != null) error((message ?: e.toString()) + \"\\n${e.stackTraceToString()}\")\n        else error(message.toString())\n    }\n\n    public override fun debug0(message: String?): Unit = printLog(message, SimpleLogger.LogPriority.DEBUG)\n    public override fun debug0(message: String?, e: Throwable?) {\n        if (e != null) debug((message ?: e.toString()) + \"\\n${e.stackTraceToString()}\")\n        else debug(message.toString())\n    }\n\n    @Deprecated(\"Use formatter instead.\", level = DeprecationLevel.HIDDEN)\n    protected open val timeFormat: DateFormat = SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\", Locale.SIMPLIFIED_CHINESE)\n\n    @Suppress(\"NewApi\")\n    protected open val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\")\n\n    private val currentTimeFormatted\n        @Suppress(\"NewApi\") // we are in JVM module\n        get() = formatter.format(LocalDateTime.now())\n\n    @MiraiExperimentalApi(\"This is subject to change.\")\n    protected enum class Color(private val format: String) {\n        RESET(\"\\u001b[0m\"),\n\n        WHITE(\"\\u001b[30m\"),\n        RED(\"\\u001b[31m\"),\n        EMERALD_GREEN(\"\\u001b[32m\"),\n        GOLD(\"\\u001b[33m\"),\n        BLUE(\"\\u001b[34m\"),\n        PURPLE(\"\\u001b[35m\"),\n        GREEN(\"\\u001b[36m\"),\n\n        GRAY(\"\\u001b[90m\"),\n        LIGHT_RED(\"\\u001b[91m\"),\n        LIGHT_GREEN(\"\\u001b[92m\"),\n        LIGHT_YELLOW(\"\\u001b[93m\"),\n        LIGHT_BLUE(\"\\u001b[94m\"),\n        LIGHT_PURPLE(\"\\u001b[95m\"),\n        LIGHT_CYAN(\"\\u001b[96m\")\n        ;\n\n        override fun toString(): String = format\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/jvmMain/kotlin/utils/SingleFileLogger.jvm.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\n@file:Suppress(\"unused\")\n\npackage net.mamoe.mirai.utils\n\nimport java.io.File\n\n\n/**\n * 将日志写入('append')到特定文件.\n *\n * @see PlatformLogger 查看格式信息\n */\n@OptIn(MiraiInternalApi::class)\npublic actual class SingleFileLogger actual constructor(\n    identity: String,\n    file: File\n) : MiraiLogger, PlatformLogger(identity, { file.appendText(it + \"\\n\") }) {\n    // Implementation notes v2.5.0:\n    // Extending `PlatformLogger` for binary compatibility for JVM target only.\n    // See actual declaration in androidMain for a better impl (implements `MiraiLogger` only)\n\n    public actual constructor(identity: String) : this(identity, File(\"$identity-${getCurrentDate()}.log\"))\n\n    init {\n        file.createNewFile()\n        require(file.isFile) { \"Log file must be a file: $file\" }\n        require(file.canWrite()) { \"Log file must be write: $file\" }\n    }\n}\n"
  },
  {
    "path": "mirai-core-api/src/jvmTest/kotlin/message/data/MessageChainImmutableTestJdk8.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"PLATFORM_CLASS_MAPPED_TO_KOTLIN\", \"UNCHECKED_CAST\")\n\npackage net.mamoe.mirai.message.data\n\nimport kotlin.test.Test\nimport kotlin.test.assertFails\n\ninternal class MessageChainImmutableTestJdk8 : MessageChainImmutableTest() {\n    @Test\n    fun `access with JDK8 lambda`() {\n        val chain = messageChainOf(AtAll, PlainText(\"Hello!\"), At(114514)) as java.util.List<SingleMessage>\n        assertFails { chain.removeIf { true } }\n        assertFails { chain.replaceAll { AtAll } }\n        assertFails { chain.sort { o1, o2 -> o1.javaClass.name.compareTo(o2.javaClass.name) } }\n        assertFails { chain.clear() }\n    }\n}"
  },
  {
    "path": "mirai-core-api/src/jvmTest/kotlin/package.kt",
    "content": "/*\n * Copyright 2019-2020 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai"
  },
  {
    "path": "mirai-core-mock/README.md",
    "content": "# mirai-core-mock\n\nmirai 模拟环境测试框架\n\n> 模拟环境目前仅支持 JVM\n\n--------------\n\n# src 架构\n\n- `contact` - 与 `mirai-core-api` 架构一致\n- `database` - 数据库, 用于存储一些临时的零碎数据\n- `resserver` - 资源服务\n- `userprofile` - 与 `UserProfile` 相关的一些服务\n- `utils` - 工具类\n\n# test 架构\n\n- `<toplevel>` 与 mirai-core-api 关系不大或者一些独立的组件的测试\n- `.mock` 模拟的各个部分的测试, 每个测试都继承 `MockBotTestBase`\n\n"
  },
  {
    "path": "mirai-core-mock/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\nplugins {\n    kotlin(\"jvm\")\n    kotlin(\"plugin.serialization\")\n    `maven-publish`\n    id(\"me.him188.kotlin-jvm-blocking-bridge\")\n}\n\nversion = Versions.project\ndescription = \"Mirai core mock testing framework\"\n\nkotlin {\n    explicitApiWarning()\n    optInForAllSourceSets(\"net.mamoe.mirai.LowLevelApi\")\n    optInForAllSourceSets(\"net.mamoe.mirai.utils.MiraiInternalApi\")\n    optInForAllSourceSets(\"net.mamoe.mirai.utils.MiraiExperimentalApi\")\n}\n\ndependencies {\n    api(project(\":mirai-core-api\"))\n    implementation(project(\":mirai-core-utils\"))\n    implementation(project(\":mirai-core\"))\n\n    implementation(`ktor-server-core`)\n    implementation(`ktor-server-netty`)\n    implementation(`java-in-memory-file-system`)\n    implementation(`kotlin-jvm-blocking-bridge`)\n}\n\ntasks.register(\"buildRuntimeClasspath\") { // this task is used for mirai-mock-framework (external)\n    dependsOn(\"assemble\")\n    doLast {\n        val out = temporaryDir.also { it.mkdirs() }.resolve(\"classpath.txt\")\n        out.bufferedWriter().use { writer ->\n            configurations[\"runtimeClasspath\"].files.forEach { f ->\n                writer.write(f.absolutePath)\n                writer.write(\"\\n\")\n            }\n        }\n    }\n}\n\nconfigurePublishing(\"mirai-core-mock\")\ntasks.named(\"shadowJar\") { enabled = false }\n"
  },
  {
    "path": "mirai-core-mock/src/MockActions.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.mock.contact.MockFriend\nimport net.mamoe.mirai.mock.contact.MockNormalMember\nimport net.mamoe.mirai.mock.contact.MockStranger\nimport net.mamoe.mirai.mock.contact.MockUserOrBot\nimport net.mamoe.mirai.mock.database.removeMessageInfo\nimport net.mamoe.mirai.mock.utils.NudgeDsl\nimport net.mamoe.mirai.mock.utils.mock\nimport net.mamoe.mirai.mock.utils.nudged0\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.cast\n\n@JvmBlockingBridge\npublic object MockActions {\n\n    /**\n     * 修改 [MockUserOrBot.nick] 并广播相关事件 (如 [FriendNickChangedEvent])\n     */\n    @OptIn(MiraiInternalApi::class)\n    @JvmStatic\n    public suspend fun fireNickChanged(target: MockUserOrBot, value: String) {\n        when (target) {\n            is MockFriend -> {\n                val ov = target.nick\n                target.mockApi.nick = value\n                FriendNickChangedEvent(target, ov, target.nick).broadcast()\n            }\n\n            is MockStranger -> {\n                target.mockApi.nick = value\n                // TODO: StrangerNickChangedEvent\n            }\n\n            is MockNormalMember -> {\n                val friend0 = target.bot.getFriend(target.id)\n                if (friend0 != null) {\n                    return fireNickChanged(friend0, value)\n                }\n                target.mockApi.nick = value\n            }\n\n            is MockBot -> {\n                target.nick = value\n            }\n        }\n    }\n\n    /**\n     * 修改 [MockNormalMember.nameCard] 并广播 [MemberCardChangeEvent]\n     */\n    @OptIn(MiraiInternalApi::class)\n    @JvmStatic\n    public suspend fun fireNameCardChanged(member: MockNormalMember, value: String) {\n        val ov = member.nameCard\n        member.mockApi.nameCard = value\n        MemberCardChangeEvent(ov, value, member).broadcast()\n    }\n\n    /**\n     * 修改 [MockNormalMember.specialTitle] 并广播 [MemberSpecialTitleChangeEvent]\n     */\n    @OptIn(MiraiInternalApi::class)\n    @JvmStatic\n    public suspend fun fireSpecialTitleChanged(member: MockNormalMember, value: String) {\n        val ov = member.specialTitle\n        member.mockApi.specialTitle = value\n        MemberSpecialTitleChangeEvent(\n            ov,\n            value,\n            member,\n            operator = member.group.owner.takeIf { it.id != member.bot.id },\n        ).broadcast()\n    }\n\n    /**\n     * 修改一名成员的权限并广播 [MemberPermissionChangeEvent]\n     */\n    @OptIn(MiraiInternalApi::class)\n    @JvmStatic\n    public suspend fun firePermissionChanged(member: MockNormalMember, perm: MemberPermission) {\n        if (perm == MemberPermission.OWNER || member == member.group.owner) {\n            error(\"Use group.changeOwner to modify group owner\")\n        }\n        val ov = member.permission\n        member.mockApi.permission = perm\n        if (member.id == member.bot.id) {\n            BotGroupPermissionChangeEvent(member.group, ov, perm)\n        } else {\n            MemberPermissionChangeEvent(member, ov, perm)\n        }.broadcast()\n    }\n\n    /**\n     * 令 [operator] 撤回一条消息\n     *\n     * @param operator 当 [operator] 为 null 时代表是发送者自己撤回\n     */\n    @JvmStatic\n    public suspend fun fireMessageRecalled(chain: MessageChain, operator: User? = null) {\n        return fireMessageRecalled(chain.source, operator)\n    }\n\n    /**\n     * 令 [operator] 撤回一条消息\n     *\n     * @param operator 当 [operator] 为 null 时代表是发送者自己撤回\n     */\n    @OptIn(MiraiInternalApi::class)\n    @JvmStatic\n    public suspend fun fireMessageRecalled(source: MessageSource, operator: User? = null) {\n        fun notSupported(): Nothing = error(\"Unsupported message source kind: ${source.kind}: ${source.javaClass}\")\n\n        val bot: MockBot = when {\n            source is OnlineMessageSource -> source.bot.mock()\n            operator != null -> operator.bot.mock()\n            else -> source.botOrNull?.mock() ?: error(\"Cannot find bot from source or operator\")\n        }\n\n        val sourceKind = source.kind\n\n        fun target(): ContactOrBot = when {\n            source is OnlineMessageSource -> source.target\n            source.targetId == bot.id -> bot\n\n            sourceKind == MessageSourceKind.FRIEND -> bot.getFriendOrFail(source.targetId)\n            sourceKind == MessageSourceKind.STRANGER -> bot.getStrangerOrFail(source.targetId)\n            sourceKind == MessageSourceKind.TEMP -> error(\"Cannot detect message target from TEMP source kind\")\n            sourceKind == MessageSourceKind.GROUP -> bot.getGroupOrFail(source.targetId)\n\n            else -> notSupported()\n        }\n\n        fun sender(): ContactOrBot = when {\n            source is OnlineMessageSource -> source.sender\n            source.fromId == bot.id -> bot\n\n\n            sourceKind == MessageSourceKind.FRIEND -> bot.getFriendOrFail(source.fromId)\n            sourceKind == MessageSourceKind.STRANGER -> bot.getStrangerOrFail(source.fromId)\n            sourceKind == MessageSourceKind.TEMP -> error(\"Cannot detect message sender from TEMP source kind\")\n            sourceKind == MessageSourceKind.GROUP -> throw AssertionError(\"Message from group\")\n\n            else -> notSupported()\n        }\n\n        fun subject(): Contact = when {\n            source is OnlineMessageSource -> source.subject\n\n            source.fromId == bot.id -> target() as Contact\n            sourceKind == MessageSourceKind.GROUP -> target() as Contact\n\n            else -> sender() as Contact\n        }\n\n\n        when (sourceKind) {\n            MessageSourceKind.GROUP -> {\n                val sender = sender()\n                val group = subject() as Group\n\n                val operator0 = when {\n                    operator === bot -> null\n                    operator === group.botAsMember -> null\n\n                    operator == null -> sender.cast()\n                    operator is Member -> operator\n\n                    else -> error(\"Provided operator $operator(${operator.javaClass}) not a member\")\n                }\n\n                bot.msgDatabase.removeMessageInfo(source)\n                MessageRecallEvent.GroupRecall(\n                    bot, sender.id, source.ids, source.internalIds, source.time,\n                    operator0,\n                    group,\n                    when (sender) {\n                        is Bot -> group.botAsMember\n                        else -> sender.cast()\n                    }\n                ).broadcast()\n            }\n            MessageSourceKind.FRIEND -> {\n                val subject = subject() as Friend\n\n                bot.msgDatabase.removeMessageInfo(source)\n                if (source.fromId == bot.id) {\n                    return // no event\n                }\n\n                MessageRecallEvent.FriendRecall(bot, source.ids, source.internalIds, source.time, subject.id, subject)\n                    .broadcast()\n            }\n            MessageSourceKind.TEMP -> {\n                bot.mock().msgDatabase.removeMessageInfo(source)\n                // TODO: event not available\n            }\n            MessageSourceKind.STRANGER -> {\n                bot.mock().msgDatabase.removeMessageInfo(source)\n                // TODO: event not available\n            }\n\n            else -> notSupported()\n        }\n    }\n\n    /**\n     * 令 [operator] 撤回一条消息\n     *\n     * @param operator 当 [operator] 为 null 时代表是发送者自己撤回\n     */\n    @JvmStatic\n    public suspend fun mockFireRecalled(receipt: MessageReceipt<*>, operator: User? = null) {\n        return fireMessageRecalled(receipt.source, operator)\n    }\n\n    /**\n     * 令 [actor] 戳一下 [actee]\n     *\n     * @param actor 发起戳一戳的人\n     * @param actee 被戳的人\n     */\n    @JvmStatic\n    public suspend fun fireNudge(actor: MockUserOrBot, actee: MockUserOrBot, dsl: NudgeDsl) {\n        actor.nudged0(actee, dsl)\n    }\n\n}"
  },
  {
    "path": "mirai-core-mock/src/MockBot.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n\npackage net.mamoe.mirai.mock\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.ContactList\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.BotAvatarChangedEvent\nimport net.mamoe.mirai.event.events.BotOfflineEvent\nimport net.mamoe.mirai.event.events.NewFriendRequestEvent\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.message.data.OnlineAudio\nimport net.mamoe.mirai.mock.contact.*\nimport net.mamoe.mirai.mock.database.MessageDatabase\nimport net.mamoe.mirai.mock.resserver.TmpResourceServer\nimport net.mamoe.mirai.mock.userprofile.UserProfileService\nimport net.mamoe.mirai.mock.utils.AvatarGenerator\nimport net.mamoe.mirai.mock.utils.NameGenerator\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.cast\nimport kotlin.random.Random\n\n/**\n * 一个虚拟的机器人对象. 继承于 [Bot]\n *\n * @see MockBotFactory 构造 [MockBot] 的工厂, [MockBot] 的唯一构造方式\n */\n@Suppress(\"unused\")\n@JvmBlockingBridge\npublic interface MockBot : Bot, MockContactOrBot, MockUserOrBot {\n    override val bot: MockBot get() = this\n\n    /**\n     * bot 昵称, 访问此字段时与 [nick] 一致\n     * 修改此字段时不会广播事件\n     */\n    @MockBotDSL\n    public var nickNoEvent: String\n\n    /**\n     * bot 昵称\n     *\n     * 修改此字段时会广播事件\n     */\n    override var nick: String\n\n    /**\n     * Bot 头像, 可自定义, 修改时会广播 [BotAvatarChangedEvent]\n     */\n    @set:MockBotDSL\n    override var avatarUrl: String\n\n    /// Contact API override\n    override fun getFriend(id: Long): MockFriend? = super.getFriend(id)?.cast()\n\n    override fun getFriendOrFail(id: Long): MockFriend = super.getFriendOrFail(id).cast()\n\n    override fun getGroup(id: Long): MockGroup? = super.getGroup(id)?.cast()\n\n    override fun getGroupOrFail(id: Long): MockGroup = super.getGroupOrFail(id).cast()\n\n    override fun getStranger(id: Long): MockStranger? = super.getStranger(id)?.cast()\n\n    override fun getStrangerOrFail(id: Long): MockStranger = super.getStrangerOrFail(id).cast()\n\n    override val groups: ContactList<MockGroup>\n    override val friends: ContactList<MockFriend>\n    override val strangers: ContactList<MockStranger>\n    override val otherClients: ContactList<MockOtherClient>\n    override val asFriend: MockFriend\n    override val asStranger: MockStranger\n\n    /// All mock api will not broadcast event\n\n    public val nameGenerator: NameGenerator\n    public val tmpResourceServer: TmpResourceServer\n    public val msgDatabase: MessageDatabase\n    public val userProfileService: UserProfileService\n\n    /** @since 2.14.0 */\n    public val avatarGenerator: AvatarGenerator\n\n    /// Mock Contact API\n\n    @MockBotDSL\n    public fun addGroup(id: Long, name: String): MockGroup\n\n    @MockBotDSL\n    public fun addGroup(id: Long, uin: Long, name: String): MockGroup\n\n    @MockBotDSL\n    public fun addFriend(id: Long, name: String): MockFriend\n\n    @MockBotDSL\n    public fun addStranger(id: Long, name: String): MockStranger\n\n    /**\n     * 将 [resource] 上传到 [临时资源服务器][tmpResourceServer],\n     * 并返回一个 [OnlineAudio] 对象, 可用于测试语音接收\n     *\n     * @see MockUser.says\n     */\n    @MockBotDSL\n    public suspend fun uploadOnlineAudio(resource: ExternalResource): OnlineAudio\n\n    /**\n     * 将 [resource] 上传到 [临时资源服务器][tmpResourceServer]\n     * 并返回一个 [Image] 对象, 可用于测试图片接收\n     *\n     * @see MockUser.says\n     */\n    @MockBotDSL\n    public suspend fun uploadMockImage(resource: ExternalResource): Image\n\n    /**\n     * 广播 [Bot] 掉线事件\n     */\n    @MockBotDSL\n    public suspend fun broadcastOfflineEvent() {\n        BotOfflineEvent.Dropped(this, java.net.SocketException(\"socket closed\")).broadcast()\n    }\n\n    /**\n     * 广播 [Bot] 头像更新事件\n     */\n    @MockBotDSL\n    public suspend fun broadcastAvatarChangeEvent() {\n        BotAvatarChangedEvent(this).broadcast()\n    }\n\n    /**\n     * 广播新好友添加事件\n     *\n     * @see NewFriendRequestEvent\n     */\n    @MockBotDSL\n    public suspend fun broadcastNewFriendRequestEvent(\n        requester: Long,\n        requesterNick: String,\n        fromGroup: Long,\n        message: String\n    ): NewFriendRequestEvent {\n        return NewFriendRequestEvent(\n            this,\n            eventId = Random.nextLong(),\n            fromId = requester,\n            fromGroupId = fromGroup,\n            message = message,\n            fromNick = requesterNick\n        ).broadcast()\n    }\n}\n"
  },
  {
    "path": "mirai-core-mock/src/MockBotDSL.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock\n\n@DslMarker\npublic annotation class MockBotDSL\n"
  },
  {
    "path": "mirai-core-mock/src/MockBotFactory.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock\n\nimport net.mamoe.mirai.BotFactory\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.mock.database.MessageDatabase\nimport net.mamoe.mirai.mock.internal.MockBotFactoryImpl\nimport net.mamoe.mirai.mock.internal.MockMiraiImpl\nimport net.mamoe.mirai.mock.resserver.TmpResourceServer\nimport net.mamoe.mirai.mock.userprofile.UserProfileService\nimport net.mamoe.mirai.mock.utils.AvatarGenerator\nimport net.mamoe.mirai.mock.utils.NameGenerator\nimport net.mamoe.mirai.utils.BotConfiguration\n\npublic interface MockBotFactory : BotFactory {\n\n    public interface BotBuilder {\n        public fun id(value: Long): BotBuilder\n\n        public fun nick(value: String): BotBuilder\n\n        public fun configuration(value: BotConfiguration): BotBuilder\n\n        public fun nameGenerator(value: NameGenerator): BotBuilder\n\n        public fun tmpResourceServer(server: TmpResourceServer): BotBuilder\n\n        public fun msgDatabase(db: MessageDatabase): BotBuilder\n\n        public fun userProfileService(service: UserProfileService): BotBuilder\n\n        public fun avatarGenerator(avatarGenerator: AvatarGenerator): BotBuilder\n\n        public fun create(): MockBot\n\n        public fun createNoInstanceRegister(): MockBot\n    }\n\n    public fun newMockBotBuilder(): BotBuilder\n\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n    public companion object : MockBotFactory by MockBotFactoryImpl() {\n        init {\n            Mirai\n            net.mamoe.mirai._MiraiInstance.set(MockMiraiImpl())\n        }\n\n        @JvmStatic\n        public fun initialize() {\n            // noop\n        }\n    }\n}\n\npublic inline fun MockBotFactory.BotBuilder.configuration(\n    block: BotConfiguration.() -> Unit\n): MockBotFactory.BotBuilder = configuration(BotConfiguration(block))\n"
  },
  {
    "path": "mirai-core-mock/src/contact/MockAnonymousMember.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.contact\n\nimport net.mamoe.mirai.contact.AnonymousMember\n\npublic interface MockAnonymousMember : AnonymousMember, MockMember\n"
  },
  {
    "path": "mirai-core-mock/src/contact/MockContact.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.contact\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.mock.MockBotDSL\n\n@JvmBlockingBridge\npublic interface MockContact : Contact, MockContactOrBot {\n    public interface MockApi {\n        public var avatarUrl: String\n    }\n\n    /**\n     * 获取直接修改字段内容的 API, 通过该 API 修改的值都不会触发广播\n     */\n    @MockBotDSL\n    public val mockApi: MockApi\n\n    /**\n     * 修改 [avatarUrl] 的地址, 同时会广播相关事件 (如果有)\n     */\n    @MockBotDSL\n    public fun changeAvatarUrl(newAvatar: String)\n}\n"
  },
  {
    "path": "mirai-core-mock/src/contact/MockContactOrBot.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.contact\n\nimport net.mamoe.mirai.contact.ContactOrBot\nimport net.mamoe.mirai.mock.MockBot\n\npublic interface MockContactOrBot : ContactOrBot {\n    override val bot: MockBot\n}"
  },
  {
    "path": "mirai-core-mock/src/contact/MockFriend.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.contact\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.Friend\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.BotInvitedJoinGroupRequestEvent\nimport net.mamoe.mirai.event.events.FriendAddEvent\nimport net.mamoe.mirai.event.events.FriendInputStatusChangedEvent\nimport net.mamoe.mirai.mock.MockBotDSL\nimport kotlin.random.Random\n\n@JvmBlockingBridge\npublic interface MockFriend : Friend, MockContact, MockUser, MockMsgSyncSupport {\n    public interface MockApi : MockContact.MockApi {\n        public val contact: MockFriend\n        public var nick: String\n        public var remark: String\n        public var friendGroupId: Int\n        public override var avatarUrl: String\n    }\n\n    /**\n     * 获取直接修改字段内容的 API, 通过该 API 修改的值都不会触发广播\n     */\n    @MockBotDSL\n    public override val mockApi: MockApi\n\n    /**\n     * 修改 nick 同时广播相关事件\n     */\n    override var nick: String\n\n    /**\n     * 修改 remark 同时广播相关事件\n     */\n    override var remark: String\n\n    /**\n     * 广播好友添加事件\n     */\n    @MockBotDSL\n    public suspend fun broadcastFriendAddEvent(): FriendAddEvent {\n        return FriendAddEvent(this).broadcast()\n    }\n\n    /**\n     * 广播好友邀请 [bot] 加入一个群聊的事件\n     */\n    @MockBotDSL\n    public suspend fun broadcastInviteBotJoinGroupRequestEvent(\n        groupId: Long, groupName: String,\n    ): BotInvitedJoinGroupRequestEvent {\n        return BotInvitedJoinGroupRequestEvent(\n            bot,\n            Random.nextLong(),\n            id,\n            groupId,\n            groupName,\n            nick\n        ).broadcast()\n    }\n\n    /**\n     * 广播好友主动删除 [bot] 好友的事件\n     *\n     * 即使该函数体实现为 [delete], 也请使用该方法广播 **bot 被好友删除**，\n     * 以确保不会受到未来的事件架构变更带来的影响\n     */\n    @MockBotDSL\n    public suspend fun broadcastFriendDelete() {\n        delete()\n    }\n\n    /**\n     * 广播好友输入状态改变事件\n     */\n    @MockBotDSL\n    public suspend fun broadcastFriendInputStateChange(inputting: Boolean) {\n        FriendInputStatusChangedEvent(this, inputting).broadcast()\n    }\n}"
  },
  {
    "path": "mirai-core-mock/src/contact/MockGroup.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\npackage net.mamoe.mirai.mock.contact\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.ContactList\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.NormalMember\nimport net.mamoe.mirai.data.GroupHonorType\nimport net.mamoe.mirai.data.MemberInfo\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.MemberJoinRequestEvent\nimport net.mamoe.mirai.mock.MockBot\nimport net.mamoe.mirai.mock.MockBotDSL\nimport net.mamoe.mirai.mock.contact.active.MockGroupActive\nimport net.mamoe.mirai.mock.contact.announcement.MockAnnouncements\nimport net.mamoe.mirai.mock.userprofile.MockMemberInfoBuilder\nimport net.mamoe.mirai.utils.cast\nimport kotlin.random.Random\n\n@JvmBlockingBridge\npublic interface MockGroup : Group, MockContact, MockMsgSyncSupport {\n    /** @see net.mamoe.mirai.IMirai.getUin */\n    public val uin: Long\n    override val bot: MockBot\n    override val members: ContactList<MockNormalMember>\n    override val owner: MockNormalMember\n    override val botAsMember: MockNormalMember\n    override val avatarUrl: String\n    override val announcements: MockAnnouncements\n    override val active: MockGroupActive\n\n    public interface MockApi : MockContact.MockApi {\n        override var avatarUrl: String\n    }\n\n    override val mockApi: MockApi\n\n    /**\n     * 群荣耀, 可直接修改此属性, 修改此属性不会广播相关事件\n     *\n     * @see changeHonorMember\n     */\n    @MockBotDSL\n    @Deprecated(\n        \"use active.changeHonorMember\",\n        ReplaceWith(\".active.changeHonorMember(member, honorType)\"),\n        level = DeprecationLevel.ERROR\n    )\n    public val honorMembers: MutableMap<GroupHonorType, MockNormalMember>\n\n    /**\n     * 更改拥有群荣耀的群成员.\n     *\n     * 会自动广播 [MemberHonorChangeEvent.Achieve] 和 [MemberHonorChangeEvent.Lose] 等相关事件.\n     *\n     * 此外如果 [honorType] 是 [GroupHonorType.TALKATIVE],\n     * 会额外广播 [net.mamoe.mirai.event.events.GroupTalkativeChangeEvent].\n     *\n     * 如果不需要广播事件, 可直接使用 [MockGroupActive.mockSetHonorHistory]\n     */\n    public fun changeHonorMember(member: MockNormalMember, honorType: GroupHonorType) {\n        active.changeHonorMember(member, honorType)\n    }\n\n    /**\n     * 获取群控制面板\n     *\n     * 注, 通过本属性获取的控制面板为原始数据存储面板, 修改并不会广播相关事件, 如果需要广播事件,\n     * 请使用 [MockGroupControlPane.withActor]\n     */\n    @MockBotDSL\n    public val controlPane: MockGroupControlPane\n\n    /** 添加一位成员, 该操作不会广播任何事件\n     * @see MockMemberInfoBuilder\n     */\n    @MockBotDSL\n    public fun appendMember(mockMember: MemberInfo): MockGroup //  chain call\n\n    /**\n     * 添加一位成员, 该操作不会广播任何事件\n     * @see MockMemberInfoBuilder\n     */\n    @MockBotDSL\n    public fun addMember(mockMember: MemberInfo): MockNormalMember\n\n    /** 添加一位成员, 该操作不会广播任何事件\n     */\n    @MockBotDSL\n    public fun appendMember(uin: Long, nick: String): MockGroup =\n        appendMember(MockMemberInfoBuilder.create { uin(uin).nick(nick) })\n\n    /** 添加一位成员, 该操作不会广播任何事件\n     * @see MockMemberInfoBuilder\n     */\n    @MockBotDSL\n    public fun addMember(uin: Long, nick: String): MockNormalMember =\n        addMember(MockMemberInfoBuilder.create { uin(uin).nick(nick) })\n\n\n    /**\n     * 修改群主, 该操作会广播群转让的相关事件\n     */\n    @MockBotDSL\n    public suspend fun changeOwner(member: NormalMember)\n\n    /**\n     * 修改群主, 该操作不会广播任何事件\n     */\n    @MockBotDSL\n    public fun changeOwnerNoEventBroadcast(member: NormalMember)\n\n    /**\n     * 创建新的匿名群成员.\n     *\n     * @param id 该匿名群成员的 id, 可自定义, 建议使用 ASCII 纯文本\n     */\n    @MockBotDSL\n    public fun newAnonymous(nick: String, id: String): MockAnonymousMember\n\n    override fun get(id: Long): MockNormalMember?\n    override fun getOrFail(id: Long): MockNormalMember = super.getOrFail(id).cast()\n\n    /**\n     * 主动广播有新成员申请加入的事件\n     */\n    @MockBotDSL\n    public suspend fun broadcastNewMemberJoinRequestEvent(\n        requester: Long,\n        requesterName: String,\n        message: String,\n        invitor: Long = 0L,\n    ): MemberJoinRequestEvent {\n        return MemberJoinRequestEvent(\n            bot, Random.nextLong(),\n            message,\n            requester,\n            this.id,\n            this.name,\n            requesterName,\n            invitor.takeIf { it != 0L },\n        ).broadcast()\n    }\n}\n\n"
  },
  {
    "path": "mirai-core-mock/src/contact/MockGroupControlPane.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.contact\n\n/**\n * 群设置面板, 如果是由 [withActor] 得到的面板在操作的同时会进行事件广播\n *\n * 与 [MockGroup.settings] 不同的是, 该控制面板不会进行权限校检\n */\npublic interface MockGroupControlPane {\n    public val group: MockGroup\n\n    /**\n     * 如果为 [MockGroup.controlPane] 获得的原始控制面板, 此属性为 [MockGroup.botAsMember]\n     *\n     * @see withActor\n     */\n    public val currentActor: MockNormalMember\n\n    public var isAllowMemberInvite: Boolean\n\n    public var isMuteAll: Boolean\n\n    public var isAllowMemberFileUploading: Boolean\n\n    public var isAnonymousChatAllowed: Boolean\n\n    public var isAllowConfessTalk: Boolean\n\n    public var groupName: String\n\n    /**\n     * 通过 [withActor] 得到的 [MockGroupControlPane] 在修改属性的同时会广播相关事件\n     */\n    public fun withActor(actor: MockNormalMember): MockGroupControlPane\n}"
  },
  {
    "path": "mirai-core-mock/src/contact/MockMember.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.contact\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.Member\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.mock.MockBotDSL\nimport net.mamoe.mirai.mock.contact.active.MockMemberActive\n\n@JvmBlockingBridge\npublic interface MockMember : Member, MockContact, MockUser {\n    public interface MockApi : MockContact.MockApi {\n        public val member: MockMember\n        public var nick: String\n        public var remark: String\n        public var permission: MemberPermission\n    }\n\n    override val group: MockGroup\n\n    /**\n     * 获取直接修改字段内容的 API, 通过该 API 修改的值都不会触发广播\n     */\n    @MockBotDSL\n    public override val mockApi: MockApi\n\n    override val active: MockMemberActive\n}"
  },
  {
    "path": "mirai-core-mock/src/contact/MockMsgSyncSupport.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.contact\n\nimport net.mamoe.mirai.contact.OtherClient\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.mock.MockBotDSL\n\npublic interface MockMsgSyncSupport : MockContact {\n    /**\n     * 广播消息同步事件\n     */\n    @MockBotDSL\n    public suspend fun broadcastMsgSyncEvent(client: OtherClient, message: MessageChain, time: Int)\n}"
  },
  {
    "path": "mirai-core-mock/src/contact/MockNormalMember.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.contact\n\nimport kotlinx.coroutines.cancel\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.NormalMember\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.BotLeaveEvent\nimport net.mamoe.mirai.event.events.MemberJoinEvent\nimport net.mamoe.mirai.event.events.MemberLeaveEvent\nimport net.mamoe.mirai.mock.MockBotDSL\nimport net.mamoe.mirai.mock.utils.broadcastBlocking\nimport java.util.concurrent.CancellationException\n\n@JvmBlockingBridge\npublic interface MockNormalMember : NormalMember, MockMember {\n    public interface MockApi : MockMember.MockApi {\n        override val member: MockNormalMember\n        public var lastSpeakTimestamp: Int\n        public var joinTimestamp: Int\n        public var nameCard: String\n        public var specialTitle: String\n\n        /**\n         * 单位 秒\n         */\n        public var muteTimeEndTimestamp: Long\n    }\n\n    /**\n     * 获取直接修改字段内容的 API, 通过该 API 修改的值都不会触发广播\n     */\n    @MockBotDSL\n    override val mockApi: MockApi\n\n    /**\n     * 广播该成员加入了群\n     */\n    @MockBotDSL\n    public suspend fun broadcastMemberJoinEvent() {\n        broadcastMemberJoinEvent(null)\n    }\n\n    /**\n     * 广播该成员加入了群\n     *\n     * @param invitor 邀请者, 当邀请者不为 `null` 时广播 [MemberJoinEvent.Invite]\n     */\n    @MockBotDSL\n    public suspend fun broadcastMemberJoinEvent(invitor: NormalMember?) {\n        if (invitor == null) {\n            MemberJoinEvent.Active(this)\n        } else {\n            MemberJoinEvent.Invite(this, invitor)\n        }.broadcast()\n    }\n\n    /**\n     * 广播该群员主动离开了群, 此方法同时会在 [group] 中移除此成员\n     */\n    @MockBotDSL\n    public suspend fun broadcastMemberLeave() {\n        if (group.members.delegate.remove(this)) {\n            MemberLeaveEvent.Quit(this).broadcast()\n            cancel(CancellationException(\"Member $id left\"))\n        }\n    }\n\n    /**\n     * 广播该群员将 [bot] 踢出了群聊, 并同时在 [bot] 的群聊列表里删除该群\n     */\n    @MockBotDSL\n    public suspend fun broadcastKickBot() {\n        if (bot.groups.delegate.remove(group)) {\n            BotLeaveEvent.Kick(this).broadcast()\n            cancel(CancellationException(\"Bot was kicked\"))\n        }\n    }\n\n    /**\n     * 广播 该群成员被 [actor] 踢出, 此方法同时会在 [group] 中移除此成员\n     */\n    @MockBotDSL\n    public suspend fun broadcastKickedBy(actor: MockNormalMember) {\n        if (group.members.delegate.remove(this)) {\n            MemberLeaveEvent.Kick(this, actor).broadcastBlocking()\n            cancel(CancellationException(\"Member $id kicked\"))\n        }\n    }\n\n    /**\n     * 广播该群员 禁言了 [target], 此方法没有权限校检\n     *\n     * @param durationSeconds 0 为取消禁言\n     * @param target 被禁言群成员\n     */\n    @MockBotDSL\n    public suspend fun broadcastMute(target: MockNormalMember, durationSeconds: Int)\n}"
  },
  {
    "path": "mirai-core-mock/src/contact/MockOtherClient.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.contact\n\nimport net.mamoe.mirai.contact.OtherClient\n\npublic interface MockOtherClient : OtherClient, MockContact\n"
  },
  {
    "path": "mirai-core-mock/src/contact/MockStranger.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.contact\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.Stranger\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.StrangerAddEvent\nimport net.mamoe.mirai.event.events.StrangerRelationChangeEvent\nimport net.mamoe.mirai.mock.MockBotDSL\n\n@JvmBlockingBridge\npublic interface MockStranger : Stranger, MockContact, MockUser {\n    public interface MockApi : MockContact.MockApi {\n        public val contact: MockStranger\n        public var nick: String\n        public var remark: String\n    }\n\n    /**\n     * 广播陌生人加入\n     */\n    @MockBotDSL\n    public suspend fun broadcastStrangerAddEvent(): StrangerAddEvent {\n        return StrangerAddEvent(this).broadcast()\n    }\n\n    /**\n     * 添加为好友\n     */\n    @MockBotDSL\n    public suspend fun addAsFriend() {\n        this.bot.addFriend(this.id, this.nick)\n        bot.strangers.delegate.remove(this)\n        StrangerRelationChangeEvent.Friended(this, bot.getFriend(this.id)!!).broadcast()\n    }\n\n    /**\n     * 获取直接修改字段内容的 API, 通过该 API 修改的值都不会触发广播\n     */\n    @MockBotDSL\n    public override val mockApi: MockApi\n\n    /**\n     * 广播陌生人主动解除与 [bot] 的关系的事件\n     *\n     * @suppress\n     * 即使该函数体实现为 [delete], 也请使用该方法广播 **bot 被陌生人删除**，\n     * 以确保不会受到未来的事件架构变更带来的影响\n     */\n    @MockBotDSL\n    public suspend fun broadcastStrangerDeleteEvent() {\n        delete()\n    }\n}\n"
  },
  {
    "path": "mirai-core-mock/src/contact/MockUser.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n\npackage net.mamoe.mirai.mock.contact\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.User\nimport net.mamoe.mirai.event.events.GroupMessageEvent\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.mock.MockActions\nimport net.mamoe.mirai.mock.MockActions.mockFireRecalled\nimport net.mamoe.mirai.mock.MockBotDSL\nimport net.mamoe.mirai.mock.utils.broadcastMockEvents\nimport net.mamoe.mirai.utils.JavaFriendlyAPI\nimport java.util.function.Consumer\nimport java.util.function.Supplier\nimport kotlin.internal.LowPriorityInOverloadResolution\n\n@JvmBlockingBridge\npublic interface MockUser : MockContact, MockUserOrBot, User {\n    /**\n     * 令 [MockUserOrBot] 撤回一条消息\n     *\n     * @see [mockFireRecalled]\n     */\n    @MockBotDSL\n    public suspend fun recallMessage(message: MessageChain) {\n        broadcastMockEvents {\n            message.recalledBy(this@MockUser)\n        }\n    }\n\n    /**\n     * 令 [MockUserOrBot] 撤回一条消息\n     *\n     * @see [mockFireRecalled]\n     */\n    @MockBotDSL\n    public suspend fun recallMessage(message: MessageSource) {\n        broadcastMockEvents {\n            message.recalledBy(this@MockUser)\n        }\n    }\n\n    /**\n     * 令 [MockUserOrBot] 撤回一条消息\n     *\n     * @see [mockFireRecalled]\n     */\n    @MockBotDSL\n    public suspend fun recallMessage(message: MessageReceipt<*>) {\n        mockFireRecalled(message, this)\n    }\n\n\n    /**\n     * 令 [MockContact] 发出一条信息, 并广播相关的消息事件 (如 [GroupMessageEvent])\n     *\n     * @return 返回 [MockContact] 发出的消息 (包含 [MessageSource]),\n     *         可用于测试消息发出后马上撤回 `says().recall()`\n     *\n     * @see [MockActions.mockFireRecalled]\n     * @see [MockUser.recallMessage]\n     */\n    @MockBotDSL\n    public suspend fun says(message: MessageChain): MessageChain\n\n\n    @MockBotDSL\n    public suspend fun says(message: Message): MessageChain {\n        return says(message.toMessageChain())\n    }\n\n    @MockBotDSL\n    public suspend fun says(message: String): MessageChain {\n        return says(PlainText(message))\n    }\n\n    @JavaFriendlyAPI\n    @LowPriorityInOverloadResolution\n    public suspend fun says(message: Consumer<MessageChainBuilder>): MessageChain {\n        return says(buildMessageChain { message.accept(this) })\n    }\n\n\n    @JavaFriendlyAPI\n    @LowPriorityInOverloadResolution\n    public suspend fun says(message: Supplier<Message>): MessageChain {\n        return says(message.get())\n    }\n\n    public suspend fun says(message: suspend MessageChainBuilder.() -> Unit): MessageChain {\n        return says(buildMessageChain { message(this) })\n    }\n}"
  },
  {
    "path": "mirai-core-mock/src/contact/MockUserOrBot.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n\npackage net.mamoe.mirai.mock.contact\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.contact.UserOrBot\n\n@JvmBlockingBridge\npublic interface MockUserOrBot : MockContactOrBot, UserOrBot"
  },
  {
    "path": "mirai-core-mock/src/contact/active/MockGroupActive.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.contact.active\n\nimport net.mamoe.mirai.contact.active.*\nimport net.mamoe.mirai.data.GroupHonorType\nimport net.mamoe.mirai.event.events.MemberHonorChangeEvent\nimport net.mamoe.mirai.mock.MockBotDSL\nimport net.mamoe.mirai.mock.contact.MockNormalMember\n\npublic interface MockGroupActive : GroupActive {\n    /**\n     * 设置该群内所有群活跃度记录\n     * @see asFlow\n     * @see asStream\n     */\n    public fun mockSetActiveRecords(records: Collection<ActiveRecord>)\n\n    /**\n     * 设置活跃度图表数据\n     * @see queryChart\n     */\n    public fun mockSetChart(chart: ActiveChart)\n\n    /**\n     * 设置群荣耀历史数据\n     * @see queryHonorHistory\n     */\n    @Suppress(\"INAPPLICABLE_JVM_NAME\")\n    @JvmName(\"mockSetHonorHistory\")\n    public fun mockSetHonorHistory(type: GroupHonorType, activeHonorList: ActiveHonorList?)\n\n    /**\n     * 设置活跃度排行榜\n     * @see queryActiveRank\n     */\n    public fun mockSetRankRecords(list: List<ActiveRankRecord>)\n\n    /**\n     * 更改拥有群荣耀的群成员.\n     *\n     * 会自动广播 [MemberHonorChangeEvent.Achieve] 和 [MemberHonorChangeEvent.Lose] 等相关事件.\n     *\n     * 此外如果 [honorType] 是 [GroupHonorType.TALKATIVE],\n     * 会额外广播 [net.mamoe.mirai.event.events.GroupTalkativeChangeEvent].\n     *\n     * 如果不需要广播事件, 可直接使用 [mockSetHonorHistory]\n     */\n    @MockBotDSL\n    public fun changeHonorMember(member: MockNormalMember, honorType: GroupHonorType)\n}"
  },
  {
    "path": "mirai-core-mock/src/contact/active/MockMemberActive.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.contact.active\n\nimport net.mamoe.mirai.contact.active.MemberActive\nimport net.mamoe.mirai.contact.active.MemberMedalInfo\nimport net.mamoe.mirai.data.GroupHonorType\n\npublic interface MockMemberActive : MemberActive {\n    /**\n     * @see rank\n     */\n    public fun mockSetRank(value: Int)\n\n    /**\n     * @see point\n     */\n    public fun mockSetPoint(value: Int)\n\n    /**\n     * @see honors\n     */\n    public fun mockSetHonors(value: Set<GroupHonorType>)\n\n    /**\n     * @see temperature\n     */\n    public fun mockSetTemperature(value: Int)\n\n    /**\n     * @see queryMedal\n     */\n    public fun mockSetMedal(info: MemberMedalInfo)\n}\n"
  },
  {
    "path": "mirai-core-mock/src/contact/announcement/MockAnnouncements.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.contact.announcement\n\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.NormalMember\nimport net.mamoe.mirai.contact.announcement.*\nimport net.mamoe.mirai.mock.MockBotDSL\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\npublic interface MockAnnouncements : Announcements {\n    /**\n     * 直接以 [actor] 的身份推送一则公告\n     *\n     * @param events 当为 `true` 时会广播相关事件\n     * @param announcement 见 [OfflineAnnouncement], [OfflineAnnouncement.create]\n     */\n    @MockBotDSL\n    public fun mockPublish(\n        announcement: Announcement,\n        actor: NormalMember,\n        events: Boolean\n    ): OnlineAnnouncement\n\n    @MockBotDSL\n    public fun mockPublish(\n        announcement: Announcement,\n        actor: NormalMember,\n    ): OnlineAnnouncement = mockPublish(announcement, actor, false)\n}\n\npublic class MockOnlineAnnouncement @MiraiInternalApi public constructor(\n    override val content: String,\n    override val parameters: AnnouncementParameters,\n    override val senderId: Long,\n    override val fid: String = \"\",\n    override val allConfirmed: Boolean,\n    override val confirmedMembersCount: Int,\n    override val publicationTime: Long\n) : OnlineAnnouncement {\n\n    override lateinit var group: Group\n    override val sender: NormalMember? get() = group[senderId]\n}\n\ninternal fun MockOnlineAnnouncement.copy(\n    content: String = this.content,\n    parameters: AnnouncementParameters = this.parameters,\n    senderId: Long = this.senderId,\n    fid: String = this.fid,\n    allConfirmed: Boolean = this.allConfirmed,\n    confirmedMembersCount: Int = this.confirmedMembersCount,\n    publicationTime: Long = this.publicationTime,\n): MockOnlineAnnouncement = MockOnlineAnnouncement(\n    content = content,\n    parameters = parameters,\n    senderId = senderId,\n    fid = fid,\n    allConfirmed = allConfirmed,\n    confirmedMembersCount = confirmedMembersCount,\n    publicationTime = publicationTime,\n)\n"
  },
  {
    "path": "mirai-core-mock/src/contact/essence/MockEssences.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.contact.essence\n\nimport net.mamoe.mirai.contact.NormalMember\nimport net.mamoe.mirai.contact.essence.Essences\nimport net.mamoe.mirai.message.data.MessageSource\nimport net.mamoe.mirai.mock.MockBotDSL\n\npublic interface MockEssences : Essences {\n\n    /**\n     * 直接以 [actor] 的身份设置一条精华消息\n     */\n    @MockBotDSL\n    public fun mockSetEssences(source: MessageSource, actor: NormalMember)\n}"
  },
  {
    "path": "mirai-core-mock/src/database/MessageDatabase.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.database\n\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.contact.roaming.RoamingMessageFilter\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.mock.MockBot\nimport net.mamoe.mirai.mock.internal.db.MsgDatabaseImpl\nimport net.mamoe.mirai.utils.concatAsLong\n\n/**\n * 一个消息数据库\n *\n * 该数据库用于存储发送者, 发送目标, 发送类型 等数据,\n * 用于支持 撤回/消息获取 等相关的功能的实现\n *\n * 一般在测试结束后销毁整个数据库\n */\npublic interface MessageDatabase {\n    /**\n     * implementation note: 该方法可能同时被多个线程同时调用\n     *\n     * @param time 单位秒\n     */\n    public fun newMessageInfo(\n        sender: Long, subject: Long, kind: MessageSourceKind,\n        time: Long,\n        message: MessageChain,\n    ): MessageInfo\n\n    public fun queryMessageInfo(msgId: Long): MessageInfo?\n\n    public fun queryMessageInfosBy(\n        subject: Long, kind: MessageSourceKind,\n        contact: Contact,\n        timeStart: Long,\n        timeEnd: Long,\n        filter: RoamingMessageFilter\n    ): Sequence<MessageInfo>\n\n    /**\n     * implementation note: 该方法可能同时被多个线程同时调用\n     */\n    public fun removeMessageInfo(msgId: Long)\n\n    /**\n     * 断开与数据库的连接, 在 [MockBot.close] 时会自动调用\n     */\n    public fun disconnect()\n\n    /**\n     * 建立与数据库的连接, 在 [MockBot] 构造后马上调用,\n     * 抛出任何错误都会中断 [MockBot] 的初始化\n     */\n    public fun connect()\n\n    public companion object {\n        @JvmStatic\n        public fun newDefaultDatabase(): MessageDatabase {\n            return MsgDatabaseImpl()\n        }\n    }\n}\n\npublic data class MessageInfo(\n    public val mixinedMsgId: Long,\n    public val sender: Long,\n    public val subject: Long,\n    public val kind: MessageSourceKind,\n    public val time: Long, // seconds\n    public val message: MessageChain,\n) {\n    public fun buildSource(bot: MockBot): MessageSource {\n        return bot.buildMessageSource(kind = kind) {\n            val info = this@MessageInfo\n            sender(info.sender)\n            time(info.time.toInt())\n\n            if (kind == MessageSourceKind.GROUP) {\n                target(subject)\n            } else {\n                if (info.sender == info.subject) {\n                    target(bot.id)\n                } else {\n                    target(info.subject)\n                }\n            }\n\n            ids = intArrayOf(info.id)\n            internalIds = intArrayOf(info.internal)\n\n            messages(info.message as Iterable<Message>)\n        }\n    }\n\n    // ids\n    public val id: Int get() = (mixinedMsgId shr 32).toInt()\n\n    // internalIds\n    public val internal: Int get() = mixinedMsgId.toInt()\n}\n\npublic fun mockMsgDatabaseId(id: Int, internalId: Int): Long {\n    return id.concatAsLong(internalId)\n}\n\npublic fun MessageDatabase.removeMessageInfo(id: Int, internalId: Int) {\n    removeMessageInfo(mockMsgDatabaseId(id, internalId))\n}\n\npublic fun MessageDatabase.queryMessageInfo(ids: IntArray, internalIds: IntArray): MessageInfo? {\n    return queryMessageInfo(mockMsgDatabaseId(ids[0], internalIds[0]))\n}\n\npublic fun MessageDatabase.removeMessageInfo(source: MessageSource) {\n    removeMessageInfo(source.ids[0], source.internalIds[0])\n}\n"
  },
  {
    "path": "mirai-core-mock/src/internal/MockBotFactoryImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.internal\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.auth.BotAuthorization\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.mock.MockBot\nimport net.mamoe.mirai.mock.MockBotFactory\nimport net.mamoe.mirai.mock.database.MessageDatabase\nimport net.mamoe.mirai.mock.resserver.TmpResourceServer\nimport net.mamoe.mirai.mock.userprofile.UserProfileService\nimport net.mamoe.mirai.mock.utils.AvatarGenerator\nimport net.mamoe.mirai.mock.utils.NameGenerator\nimport net.mamoe.mirai.mock.utils.randomImageContent\nimport net.mamoe.mirai.utils.BotConfiguration\nimport net.mamoe.mirai.utils.lateinitMutableProperty\nimport kotlin.math.absoluteValue\nimport kotlin.random.Random\n\ninternal class MockBotFactoryImpl : MockBotFactory {\n    override fun newMockBotBuilder(): MockBotFactory.BotBuilder {\n        return object : MockBotFactory.BotBuilder {\n            var id: Long = Random.nextLong().absoluteValue\n            var nick_: String by lateinitMutableProperty {\n                \"Mock Bot $id\"\n            }\n            var configuration_: BotConfiguration by lateinitMutableProperty { BotConfiguration { } }\n            var nameGenerator: NameGenerator = NameGenerator.getDefault()\n            var tmpResourceServer_: TmpResourceServer by lateinitMutableProperty {\n                TmpResourceServer.newInMemoryTmpResourceServer()\n            }\n            var msgDb: MessageDatabase by lateinitMutableProperty {\n                MessageDatabase.newDefaultDatabase()\n            }\n            var userProfileService: UserProfileService by lateinitMutableProperty {\n                UserProfileService.getInstance()\n            }\n            var avatarGenerator: AvatarGenerator by lateinitMutableProperty {\n                object : AvatarGenerator {\n                    override fun generateRandomAvatar(): ByteArray = Image.randomImageContent()\n                }\n            }\n\n            override fun id(value: Long): MockBotFactory.BotBuilder = apply {\n                this.id = value\n            }\n\n            override fun nick(value: String): MockBotFactory.BotBuilder = apply {\n                this.nick_ = value\n            }\n\n            override fun configuration(value: BotConfiguration): MockBotFactory.BotBuilder = apply {\n                this.configuration_ = value\n            }\n\n            override fun nameGenerator(value: NameGenerator): MockBotFactory.BotBuilder = apply {\n                this.nameGenerator = value\n            }\n\n            override fun tmpResourceServer(server: TmpResourceServer): MockBotFactory.BotBuilder = apply {\n                tmpResourceServer_ = server\n            }\n\n            override fun msgDatabase(db: MessageDatabase): MockBotFactory.BotBuilder = apply {\n                msgDb = db\n            }\n\n            override fun userProfileService(service: UserProfileService): MockBotFactory.BotBuilder = apply {\n                userProfileService = service\n            }\n\n            override fun avatarGenerator(avatarGenerator: AvatarGenerator): MockBotFactory.BotBuilder = apply {\n                this.avatarGenerator = avatarGenerator\n            }\n\n            override fun createNoInstanceRegister(): MockBot {\n                return MockBotImpl(\n                    configuration_,\n                    id,\n                    nick_,\n                    nameGenerator,\n                    tmpResourceServer_,\n                    msgDb,\n                    userProfileService,\n                    avatarGenerator,\n                )\n            }\n\n            @Suppress(\"INVISIBLE_MEMBER\")\n            override fun create(): MockBot {\n                return createNoInstanceRegister().also {\n                    Bot._instances[id] = it\n                }\n            }\n        }\n    }\n\n    override fun newBot(qq: Long, password: String, configuration: BotConfiguration): Bot {\n        return newMockBotBuilder()\n            .id(qq)\n            .configuration(configuration)\n            .create()\n    }\n\n    override fun newBot(qq: Long, passwordMd5: ByteArray, configuration: BotConfiguration): Bot {\n        return newMockBotBuilder()\n            .id(qq)\n            .configuration(configuration)\n            .create()\n    }\n\n    override fun newBot(qq: Long, authorization: BotAuthorization, configuration: BotConfiguration): Bot {\n        return newMockBotBuilder()\n            .id(qq)\n            .configuration(configuration)\n            .create()\n    }\n}"
  },
  {
    "path": "mirai-core-mock/src/internal/MockBotImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"CANNOT_OVERRIDE_INVISIBLE_MEMBER\")\n\npackage net.mamoe.mirai.mock.internal\n\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.isActive\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.contact.AvatarSpec\nimport net.mamoe.mirai.contact.ContactList\nimport net.mamoe.mirai.contact.ContactOrBot\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.contact.friendgroup.FriendGroups\nimport net.mamoe.mirai.event.EventChannel\nimport net.mamoe.mirai.event.GlobalEventChannel\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.BotEvent\nimport net.mamoe.mirai.event.events.BotOnlineEvent\nimport net.mamoe.mirai.event.events.BotReloginEvent\nimport net.mamoe.mirai.internal.network.component.ComponentStorage\nimport net.mamoe.mirai.internal.network.component.ConcurrentComponentStorage\nimport net.mamoe.mirai.internal.network.components.EventDispatcher\nimport net.mamoe.mirai.message.data.OnlineAudio\nimport net.mamoe.mirai.mock.MockBot\nimport net.mamoe.mirai.mock.contact.MockFriend\nimport net.mamoe.mirai.mock.contact.MockGroup\nimport net.mamoe.mirai.mock.contact.MockOtherClient\nimport net.mamoe.mirai.mock.contact.MockStranger\nimport net.mamoe.mirai.mock.database.MessageDatabase\nimport net.mamoe.mirai.mock.internal.components.MockEventDispatcherImpl\nimport net.mamoe.mirai.mock.internal.contact.*\nimport net.mamoe.mirai.mock.internal.contact.friendfroup.MockFriendGroups\nimport net.mamoe.mirai.mock.internal.contactbase.ContactDatabase\nimport net.mamoe.mirai.mock.internal.serverfs.TmpResourceServerImpl\nimport net.mamoe.mirai.mock.resserver.TmpResourceServer\nimport net.mamoe.mirai.mock.userprofile.UserProfileService\nimport net.mamoe.mirai.mock.utils.AvatarGenerator\nimport net.mamoe.mirai.mock.utils.NameGenerator\nimport net.mamoe.mirai.mock.utils.simpleMemberInfo\nimport net.mamoe.mirai.utils.*\nimport java.util.concurrent.CancellationException\nimport java.util.concurrent.atomic.AtomicBoolean\nimport kotlin.contracts.contract\nimport kotlin.coroutines.CoroutineContext\nimport net.mamoe.mirai.internal.utils.subLoggerImpl as subLog\n\ninternal class MockBotImpl(\n    override val configuration: BotConfiguration,\n    override val id: Long,\n    nick: String,\n    override val nameGenerator: NameGenerator,\n    override val tmpResourceServer: TmpResourceServer,\n    override val msgDatabase: MessageDatabase,\n    override val userProfileService: UserProfileService,\n    override val avatarGenerator: AvatarGenerator,\n) : MockBot, Bot, ContactOrBot {\n    @JvmField\n    internal val contactDatabase = ContactDatabase(this)\n    private val botccinfo = contactDatabase.acquireCI(id, nick)\n\n    private val loginBefore = AtomicBoolean(false)\n    override var nickNoEvent: String by botccinfo::nick\n    override var nick: String\n        get() = botccinfo.nick\n        set(value) {\n            botccinfo.changeNick(value)\n        }\n\n    override var avatarUrl: String\n        get() = asFriend.avatarUrl\n        set(value) {\n            asFriend.changeAvatarUrl(value)\n        }\n\n    override fun avatarUrl(spec: AvatarSpec): String {\n        return avatarUrl\n    }\n\n    override val logger: MiraiLogger by lazy {\n        configuration.botLoggerSupplier(this)\n    }\n\n    init {\n        if (tmpResourceServer is TmpResourceServerImpl) {\n            // Not using logger.subLogger caused by kotlin compile error\n            tmpResourceServer.logger =\n                subLog(this.logger, \"TmpFsServer\").takeUnless { it == this.logger } ?: kotlin.run {\n                    MiraiLogger.Factory.create(TmpResourceServerImpl::class.java, \"TFS $id\")\n                }\n        }\n        tmpResourceServer.startupServer()\n        msgDatabase.connect()\n    }\n\n    val components: ComponentStorage by lazy {\n        ConcurrentComponentStorage {\n            set(EventDispatcher, MockEventDispatcherImpl(coroutineContext, logger))\n        }\n    }\n\n    @TestOnly\n    internal suspend fun joinEventBroadcast() {\n        components[EventDispatcher].joinBroadcast()\n    }\n\n    override suspend fun login() {\n        BotOnlineEvent(this).broadcast()\n        if (!loginBefore.compareAndSet(false, true)) {\n            BotReloginEvent(this, null).broadcast()\n        }\n    }\n\n\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n    override fun close(cause: Throwable?) {\n        tmpResourceServer.close()\n        Bot._instances.remove(id, this)\n        cancel(when (cause) {\n            null -> CancellationException(\"Bot cancelled\")\n            else -> CancellationException(cause.message).also { it.initCause(cause) }\n        })\n    }\n\n    override val groups: ContactList<MockGroup> = ContactList()\n    override val friends: ContactList<MockFriend> = ContactList()\n    override val strangers: ContactList<MockStranger> = ContactList()\n    override val otherClients: ContactList<MockOtherClient> = ContactList()\n    override val friendGroups: FriendGroups = MockFriendGroups(this)\n\n    @Suppress(\"DEPRECATION\")\n    override fun addGroup(id: Long, name: String): MockGroup =\n        addGroup(id, Mirai.calculateGroupUinByGroupCode(id), name)\n\n    override fun addGroup(id: Long, uin: Long, name: String): MockGroup {\n        val group = MockGroupImpl(coroutineContext, this, id, uin, name)\n        groups.delegate.add(group)\n        group.appendMember(simpleMemberInfo(this.id, this.nick, permission = MemberPermission.OWNER))\n        return group\n    }\n\n    override fun addFriend(id: Long, name: String): MockFriend {\n        val friend = MockFriendImpl(coroutineContext, this, id, name, \"\")\n        friends.delegate.add(friend)\n        return friend\n    }\n\n    override fun addStranger(id: Long, name: String): MockStranger {\n        val stranger = MockStrangerImpl(coroutineContext, this, id, \"\", name)\n        strangers.delegate.add(stranger)\n        return stranger\n    }\n\n    override val isOnline: Boolean get() = isActive\n    override val eventChannel: EventChannel<BotEvent> =\n        GlobalEventChannel.filterIsInstance<BotEvent>().filter { it.bot === this@MockBotImpl }\n\n    override val asFriend: MockFriend by lazy {\n        MockFriendImpl(coroutineContext, this, id, nick, \"\").also { basm ->\n            @Suppress(\"QUALIFIED_SUPERTYPE_EXTENDED_BY_OTHER_SUPERTYPE\", \"RemoveExplicitSuperQualifier\")\n            basm.initAvatarUrl(super<ContactOrBot>.avatarUrl(spec = AvatarSpec.LARGEST))\n        }\n    }\n    override val asStranger: MockStranger by lazy {\n        MockStrangerImpl(coroutineContext, this, id, \"\", nick)\n    }\n\n    override val coroutineContext: CoroutineContext by lazy {\n        configuration.parentCoroutineContext.childScopeContext()\n    }\n\n    override suspend fun uploadOnlineAudio(resource: ExternalResource): OnlineAudio {\n        return resource.mockImplUploadAudioAsOnline(this)\n    }\n\n    override suspend fun uploadMockImage(resource: ExternalResource): MockImage {\n        val md5 = resource.md5\n        val format = resource.formatName\n\n        // todo width, height ?\n        return MockImage(\n            imageId = generateImageId(md5, format),\n            urlPath = bot.tmpResourceServer.uploadResourceAsImage(resource).toString(),\n            size = resource.size\n        )\n    }\n\n    override fun toString(): String {\n        return \"MockBot($id)\"\n    }\n}\n\ninternal fun MockBot.impl(): MockBotImpl {\n    contract { returns() implies (this@impl is MockBotImpl) }\n    return cast()\n}\n"
  },
  {
    "path": "mirai-core-mock/src/internal/MockMiraiImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"CANNOT_OVERRIDE_INVISIBLE_MEMBER\")\n\npackage net.mamoe.mirai.mock.internal\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.BotFactory\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.data.FriendInfo\nimport net.mamoe.mirai.data.StrangerInfo\nimport net.mamoe.mirai.data.UserProfile\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.internal.MiraiImpl\nimport net.mamoe.mirai.internal.network.components.EventDispatcher\nimport net.mamoe.mirai.internal.utils.MiraiProtocolInternal\nimport net.mamoe.mirai.message.action.Nudge\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.mock.MockActions\nimport net.mamoe.mirai.mock.MockBotFactory\nimport net.mamoe.mirai.mock.contact.MockGroup\nimport net.mamoe.mirai.mock.database.queryMessageInfo\nimport net.mamoe.mirai.mock.database.removeMessageInfo\nimport net.mamoe.mirai.mock.internal.contact.*\nimport net.mamoe.mirai.mock.internal.msgsrc.registerMockMsgSerializers\nimport net.mamoe.mirai.mock.utils.mock\nimport net.mamoe.mirai.mock.utils.simpleMemberInfo\nimport net.mamoe.mirai.utils.currentTimeSeconds\n\ninternal class MockMiraiImpl : MiraiImpl() {\n    companion object {\n        init {\n            registerMockMsgSerializers()\n            registerMockServices()\n        }\n    }\n\n    override suspend fun solveBotInvitedJoinGroupRequestEvent(\n        bot: Bot,\n        eventId: Long,\n        invitorId: Long,\n        groupId: Long,\n        accept: Boolean\n    ) {\n        bot.mock()\n        if (accept) {\n            val group = bot.addGroup(groupId, bot.nameGenerator.nextGroupName())\n            group.appendMember(\n                simpleMemberInfo(\n                    uin = 111111111,\n                    permission = MemberPermission.OWNER,\n                    name = \"MockMember - Owner\",\n                    nameCard = \"Custom NameCard\",\n                )\n            ).appendMember(\n                simpleMemberInfo(\n                    uin = 222222222,\n                    permission = MemberPermission.ADMINISTRATOR,\n                    name = \"MockMember - Administrator\",\n                    nameCard = \"root\",\n                )\n            )\n\n            group.appendMember(\n                simpleMemberInfo(\n                    uin = bot.id,\n                    permission = MemberPermission.MEMBER,\n                    name = bot.nick,\n                )\n            )\n\n\n            if (invitorId != 0L) {\n                val invitor = group[invitorId] ?: kotlin.run {\n                    group.addMember(\n                        simpleMemberInfo(\n                            uin = invitorId,\n                            permission = MemberPermission.ADMINISTRATOR,\n                            name = bot.getFriend(invitorId)?.nick ?: \"A random invitor\",\n                            nameCard = \"invitor\",\n                        )\n                    )\n                }\n                BotJoinGroupEvent.Invite(invitor)\n            } else {\n                BotJoinGroupEvent.Active(group)\n            }.broadcast()\n        }\n    }\n\n    override suspend fun solveMemberJoinRequestEvent(\n        bot: Bot,\n        eventId: Long,\n        fromId: Long,\n        fromNick: String,\n        groupId: Long,\n        accept: Boolean?,\n        blackList: Boolean,\n        message: String\n    ) {\n        if (accept == null || !accept) return // ignore\n\n        val member = bot.getGroupOrFail(groupId).mock().addMember(\n            simpleMemberInfo(\n                uin = fromId,\n                name = fromNick,\n                permission = MemberPermission.MEMBER\n            )\n        )\n        MemberJoinEvent.Active(member).broadcast()\n    }\n\n    override suspend fun solveNewFriendRequestEvent(\n        bot: Bot,\n        eventId: Long,\n        fromId: Long,\n        fromNick: String,\n        accept: Boolean,\n        blackList: Boolean\n    ) {\n        if (!accept) return\n\n        // No event broadcast in mirai-core\n        bot.mock().addFriend(fromId, fromNick)\n    }\n\n    override fun getUin(contactOrBot: ContactOrBot): Long {\n        if (contactOrBot is MockGroup) return contactOrBot.uin\n\n        return super.getUin(contactOrBot)\n    }\n\n    override suspend fun muteAnonymousMember(\n        bot: Bot,\n        anonymousId: String,\n        anonymousNick: String,\n        groupId: Long,\n        seconds: Int\n    ) {\n        // noop\n    }\n\n    override suspend fun recallFriendMessageRaw(\n        bot: Bot,\n        targetId: Long,\n        messageIds: IntArray,\n        messageInternalIds: IntArray,\n        time: Int\n    ): Boolean {\n        val info = bot.mock().msgDatabase.queryMessageInfo(messageIds, messageInternalIds) ?: return false\n        if (info.kind != MessageSourceKind.FRIEND) return false\n        if (info.sender != bot.id) return false\n        if (currentTimeSeconds() - info.time > 120) return false\n        bot.msgDatabase.removeMessageInfo(info.mixinedMsgId)\n\n        // MessageRecallEvent.FriendRecall() // TODO: Unknown Logic\n\n        return true\n    }\n\n    override suspend fun recallGroupMessageRaw(\n        bot: Bot,\n        groupCode: Long,\n        messageIds: IntArray,\n        messageInternalIds: IntArray\n    ): Boolean {\n        val info = bot.mock().msgDatabase.queryMessageInfo(messageIds, messageInternalIds) ?: return false\n        if (info.kind != MessageSourceKind.GROUP) return false\n        val group = bot.getGroup(info.subject) ?: return false\n        val canDelete = when (group.botPermission) {\n            MemberPermission.OWNER -> true\n            MemberPermission.ADMINISTRATOR -> kotlin.run w@{\n                if (info.sender == bot.id) return@w true\n\n                val member = group.getMember(info.sender) ?: return@w true\n                member.permission == MemberPermission.MEMBER\n            }\n            else -> kotlin.run w@{\n                if (info.sender != bot.id) return@w false\n                currentTimeSeconds() - info.time <= 120\n            }\n        }\n        if (!canDelete) return false\n        bot.msgDatabase.removeMessageInfo(info.mixinedMsgId)\n\n        MessageRecallEvent.GroupRecall(\n            bot,\n            info.sender,\n            messageIds,\n            messageInternalIds,\n            info.time.toInt(),\n            null,\n            group,\n            group[info.sender] ?: return true\n        ).broadcast()\n\n        return true\n    }\n\n    override suspend fun recallGroupTempMessageRaw(\n        bot: Bot,\n        groupUin: Long,\n        targetId: Long,\n        messageIds: IntArray,\n        messageInternalIds: IntArray,\n        time: Int\n    ): Boolean = false // TODO: No recall event\n\n    override suspend fun recallMessage(bot: Bot, source: MessageSource) {\n        fun doFailed() {\n            error(\"Failed to recall message #${source.ids.contentToString()}: $AQQ_RECALL_FAILED_MESSAGE\")\n        }\n        if (source is OnlineMessageSource) {\n            when (source) {\n                is OnlineMessageSource.Incoming.FromFriend,\n                is OnlineMessageSource.Outgoing.ToFriend,\n                -> {\n                    val resp = recallFriendMessageRaw(\n                        bot,\n                        source.subject.id,\n                        source.ids,\n                        source.internalIds,\n                        source.time\n                    )\n                    if (!resp) doFailed()\n                }\n                is OnlineMessageSource.Incoming.FromGroup,\n                is OnlineMessageSource.Outgoing.ToGroup,\n                -> {\n                    val resp = recallGroupMessageRaw(\n                        bot,\n                        source.subject.id,\n                        source.ids,\n                        source.internalIds\n                    )\n                    if (!resp) doFailed()\n                }\n\n                is OnlineMessageSource.Incoming.FromStranger -> doFailed()\n                is OnlineMessageSource.Incoming.FromTemp -> doFailed()\n\n\n                is OnlineMessageSource.Outgoing.ToStranger -> {\n                    bot.mock().msgDatabase.removeMessageInfo(source)\n                    // TODO: No Event\n                }\n                is OnlineMessageSource.Outgoing.ToTemp -> {\n                    bot.mock().msgDatabase.removeMessageInfo(source)\n                    // TODO: No Event\n                }\n\n                else -> doFailed()\n            }\n        } else {\n            source as OfflineMessageSource\n            when (source.kind) {\n                MessageSourceKind.GROUP -> {\n                    val resp = recallGroupMessageRaw(\n                        bot,\n                        source.targetId,\n                        source.ids,\n                        source.internalIds\n                    )\n                    if (!resp) doFailed()\n                }\n                MessageSourceKind.FRIEND -> {\n                    val resp = recallFriendMessageRaw(\n                        bot,\n                        source.targetId,\n                        source.ids,\n                        source.internalIds,\n                        source.time\n                    )\n                    if (!resp) doFailed()\n                }\n                MessageSourceKind.TEMP, MessageSourceKind.STRANGER -> {\n                    if (source.fromId != bot.id) {\n                        doFailed()\n                    }\n\n                    MockActions.fireMessageRecalled(source, bot.asFriend)\n                }\n\n                else -> doFailed()\n            }\n        }\n    }\n\n    override suspend fun sendNudge(bot: Bot, nudge: Nudge, receiver: Contact): Boolean {\n        if (!bot.configuration.protocol.isNudgeSupported) {\n            throw UnsupportedOperationException(\"nudge is supported only with protocol ${\n                MiraiProtocolInternal.protocols.filter { it.value.supportsNudge }.map { it.key }\n            }\")\n        }\n        NudgeEvent(\n            from = bot,\n            target = nudge.target,\n            subject = receiver,\n            action = \"戳了戳\",\n            suffix = \"\"\n        ).broadcast()\n        return true\n    }\n\n    override suspend fun queryProfile(bot: Bot, targetId: Long): UserProfile {\n        return bot.mock().userProfileService.doQueryUserProfile(targetId)\n    }\n\n    override val BotFactory: BotFactory get() = MockBotFactory\n\n    /*override suspend fun getGroupVoiceDownloadUrl(bot: Bot, md5: ByteArray, groupId: Long, dstUin: Long): String {\n        return super.getGroupVoiceDownloadUrl(bot, md5, groupId, dstUin)\n    }*/\n\n    @Suppress(\"RETURN_TYPE_MISMATCH_ON_OVERRIDE\")\n    override fun newFriend(bot: Bot, friendInfo: FriendInfo): Friend {\n        bot.mock()\n        return MockFriendImpl(\n            bot.coroutineContext,\n            bot,\n            friendInfo.uin,\n            friendInfo.nick,\n            friendInfo.remark,\n        )\n    }\n\n    @Suppress(\"RETURN_TYPE_MISMATCH_ON_OVERRIDE\")\n    override fun newStranger(bot: Bot, strangerInfo: StrangerInfo): Stranger {\n        bot.mock()\n        return MockStrangerImpl(\n            bot.coroutineContext,\n            bot,\n            strangerInfo.uin,\n            strangerInfo.remark,\n            strangerInfo.nick,\n        )\n    }\n\n    override fun createImage(imageId: String): Image {\n        if (imageId matches Image.IMAGE_ID_REGEX) {\n            return MockImage(imageId, \"images/\" + imageId.substring(1..36))\n        }\n        //imageId.substring(1..36)\n        return super.createImage(imageId)\n    }\n\n    override suspend fun broadcastEvent(event: Event) {\n        if (event is BotEvent) {\n            val bot = event.bot\n            if (bot is MockBotImpl) {\n                bot.components[EventDispatcher].broadcast(event)\n                return\n            }\n        }\n        super.broadcastEvent(event)\n    }\n\n    override suspend fun refreshKeys(bot: Bot) {\n    }\n}\n"
  },
  {
    "path": "mirai-core-mock/src/internal/components/MockEventDispatcherImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"CANNOT_OVERRIDE_INVISIBLE_MEMBER\")\n\npackage net.mamoe.mirai.mock.internal.components\n\nimport kotlinx.coroutines.CoroutineStart\nimport kotlinx.coroutines.job\nimport kotlinx.coroutines.launch\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.internal.network.components.EventDispatcherImpl\nimport net.mamoe.mirai.utils.MiraiLogger\nimport kotlin.coroutines.CoroutineContext\n\n/*\n\nCopied from:\n\nmirai-core/src/commonTest/kotlin/network/framework/components/EventDispatcherImpl.kt\n\n */\ninternal open class MockEventDispatcherImpl(\n    lifecycleContext: CoroutineContext,\n    logger: MiraiLogger,\n) : EventDispatcherImpl(lifecycleContext, logger) {\n    override suspend fun broadcast(event: Event) {\n        if (isActive) {\n            // This requires the scope to be active, while the original one doesn't.\n\n            // so that [joinBroadcast] works.\n            launch(\n                start = CoroutineStart.UNDISPATCHED\n            ) {\n                super.broadcast(event)\n            }.join()\n        } else {\n            // Scope closed, typically when broadcasting `BotOfflineEvent` by StateObserver from `bot.close`\n            super.broadcast(event)\n        }\n    }\n\n    override suspend fun joinBroadcast() {\n        for (child in coroutineContext.job.children) {\n            child.join()\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core-mock/src/internal/contact/AbstractMockContact.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"CANNOT_OVERRIDE_INVISIBLE_MEMBER\")\n\npackage net.mamoe.mirai.mock.internal.contact\n\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.event.events.MessagePreSendEvent\nimport net.mamoe.mirai.internal.contact.broadcastMessagePreSendEvent\nimport net.mamoe.mirai.internal.contact.replaceMagicCodes\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.mock.MockBot\nimport net.mamoe.mirai.mock.contact.MockContact\nimport net.mamoe.mirai.utils.*\nimport kotlin.coroutines.CoroutineContext\n\ninternal abstract class AbstractMockContact(\n    parentCoroutineContext: CoroutineContext,\n    override val bot: MockBot,\n    override val id: Long\n) : MockContact {\n\n    override val coroutineContext: CoroutineContext = parentCoroutineContext.childScopeContext()\n\n    /**\n     * @return isCancelled\n     */\n    protected abstract fun newMessagePreSend(message: Message): MessagePreSendEvent\n    protected abstract suspend fun postMessagePreSend(message: MessageChain, receipt: MessageReceipt<*>)\n\n    protected abstract fun newMessageSource(message: MessageChain): OnlineMessageSource.Outgoing\n\n    override suspend fun sendMessage(message: Message): MessageReceipt<Contact> {\n        val msg = broadcastMessagePreSendEvent(message, false) { _, _ -> newMessagePreSend(message) }\n\n        val source = newMessageSource(msg)\n        val response = source.withMessage(msg)\n\n        bot.logger.verbose(\"$this <- $msg\".replaceMagicCodes())\n\n\n        @Suppress(\"DEPRECATION_ERROR\")\n        return MessageReceipt(source, this).also {\n            postMessagePreSend(response, it)\n        }\n    }\n\n\n    override suspend fun uploadImage(resource: ExternalResource): Image {\n        return bot.uploadMockImage(resource)\n    }\n\n    override suspend fun uploadShortVideo(\n        thumbnail: ExternalResource,\n        video: ExternalResource,\n        fileName: String?\n    ): ShortVideo {\n        TODO(\"mock upload short video\")\n    }\n\n    override fun toString(): String {\n        return \"$id\"\n    }\n}\n\ninternal suspend inline fun <T : ExternalResource, R> T.inResource(action: () -> R): R {\n    return useAutoClose {\n        runBIO {\n            inputStream().dropContent(close = true)\n        }\n        action()\n    }\n}\n"
  },
  {
    "path": "mirai-core-mock/src/internal/contact/MockAnnouncementsImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.internal.contact\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.asFlow\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.NormalMember\nimport net.mamoe.mirai.contact.PermissionDeniedException\nimport net.mamoe.mirai.contact.announcement.Announcement\nimport net.mamoe.mirai.contact.announcement.AnnouncementImage\nimport net.mamoe.mirai.contact.announcement.OnlineAnnouncement\nimport net.mamoe.mirai.contact.isOperator\nimport net.mamoe.mirai.mock.contact.announcement.MockAnnouncements\nimport net.mamoe.mirai.mock.contact.announcement.MockOnlineAnnouncement\nimport net.mamoe.mirai.mock.contact.announcement.copy\nimport net.mamoe.mirai.mock.utils.mock\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.currentTimeSeconds\nimport net.mamoe.mirai.utils.withAutoClose\nimport java.util.*\nimport java.util.concurrent.ConcurrentHashMap\nimport java.util.stream.Stream\n\ninternal class MockAnnouncementsImpl(\n    val group: Group,\n) : MockAnnouncements {\n    val announcements = ConcurrentHashMap<String, OnlineAnnouncement>()\n\n    override fun asFlow(): Flow<OnlineAnnouncement> = announcements.values.asFlow()\n\n    override fun asStream(): Stream<OnlineAnnouncement> = announcements.values.toList().stream()\n\n    override suspend fun delete(fid: String): Boolean = announcements.remove(fid) != null\n\n    override suspend fun get(fid: String): OnlineAnnouncement? = announcements[fid]\n\n    @Suppress(\"MemberVisibilityCanBePrivate\")\n    internal fun putDirect(announcement: MockOnlineAnnouncement) {\n        val ann = if (announcement.fid.isEmpty()) {\n            announcement.copy(fid = UUID.randomUUID().toString())\n        } else announcement\n        if (ann.parameters.sendToNewMember) {\n            announcements.entries.removeIf { (_, v) -> v.parameters.sendToNewMember }\n        }\n        announcements[ann.fid] = ann\n        ann.group = group\n    }\n\n    override fun mockPublish(announcement: Announcement, actor: NormalMember, events: Boolean): OnlineAnnouncement {\n        if (announcement.parameters.sendToNewMember) {\n            announcements.elements().toList().firstOrNull { oa -> oa.parameters.sendToNewMember }\n        }\n\n        val ann = MockOnlineAnnouncement(\n            content = announcement.content,\n            parameters = announcement.parameters,\n            senderId = actor.id,\n            fid = UUID.randomUUID().toString(),\n            allConfirmed = false,\n            confirmedMembersCount = 0,\n            publicationTime = currentTimeSeconds()\n        )\n        putDirect(ann)\n        if (!events) return ann\n\n        // TODO: mirai-core no other events about announcements\n        return ann\n    }\n\n    override suspend fun publish(announcement: Announcement): OnlineAnnouncement {\n        if (!group.botPermission.isOperator()) {\n            throw PermissionDeniedException(\"Failed to publish a new announcement because bot don't have admin permission to perform it.\")\n        }\n        return mockPublish(announcement, this.group.botAsMember, true)\n    }\n\n    override suspend fun uploadImage(resource: ExternalResource): AnnouncementImage = resource.withAutoClose {\n        AnnouncementImage.create(group.bot.mock().uploadMockImage(resource).imageId, 500, 500)\n    }\n\n    override suspend fun members(fid: String, confirmed: Boolean): List<NormalMember> {\n        if (!group.botPermission.isOperator()) {\n            throw PermissionDeniedException(\"Only administrator have permission see announcement confirmed detail\")\n        }\n        // TODO: 设置用户可读状态，而不返回全部\n        return group.members.toList()\n    }\n\n    override suspend fun remind(fid: String) {\n        if (!group.botPermission.isOperator()) {\n            throw PermissionDeniedException(\"Only administrator have permission send announcement remind\")\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core-mock/src/internal/contact/MockAnonymousMemberImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.internal.contact\n\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.mirai.contact.AvatarSpec\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.contact.nameCardOrNick\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.GroupMessageEvent\nimport net.mamoe.mirai.event.events.MessagePreSendEvent\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.OnlineMessageSource\nimport net.mamoe.mirai.mock.MockBot\nimport net.mamoe.mirai.mock.contact.MockAnonymousMember\nimport net.mamoe.mirai.mock.contact.MockGroup\nimport net.mamoe.mirai.mock.contact.MockMember\nimport net.mamoe.mirai.mock.contact.active.MockMemberActive\nimport net.mamoe.mirai.mock.internal.contact.active.MockMemberActiveImpl\nimport net.mamoe.mirai.mock.internal.msgsrc.OnlineMsgSrcFromGroup\nimport net.mamoe.mirai.mock.internal.msgsrc.newMsgSrc\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.lateinitMutableProperty\nimport kotlin.coroutines.CoroutineContext\n\ninternal class MockAnonymousMemberImpl(\n    parentCoroutineContext: CoroutineContext,\n    bot: MockBot, id: Long,\n\n    override val anonymousId: String,\n    override val group: MockGroup,\n    nameCard: String\n) : AbstractMockContact(parentCoroutineContext, bot, id), MockAnonymousMember {\n    override fun newMessagePreSend(message: Message): MessagePreSendEvent {\n        throw AssertionError()\n    }\n\n    override fun avatarUrl(spec: AvatarSpec): String {\n        return avatarUrl\n    }\n\n    override suspend fun postMessagePreSend(message: MessageChain, receipt: MessageReceipt<*>) {\n        throw AssertionError()\n    }\n\n    override fun newMessageSource(message: MessageChain): OnlineMessageSource.Outgoing {\n        throw AssertionError()\n    }\n\n    @Suppress(\"DEPRECATION_ERROR\")\n    override suspend fun sendMessage(message: Message): Nothing = super<MockAnonymousMember>.sendMessage(message)\n    override suspend fun uploadImage(resource: ExternalResource): Image =\n        super<AbstractMockContact>.uploadImage(resource)\n\n    @Suppress(\"UNUSED_PARAMETER\")\n    override var permission: MemberPermission\n        get() = MemberPermission.MEMBER\n        set(value) {\n            error(\"Modifying permission of AnonymousMember\")\n        }\n    override val specialTitle: String\n        get() = \"匿名\"\n    override val active: MockMemberActive by lazy { MockMemberActiveImpl() }\n\n    override suspend fun mute(durationSeconds: Int) {\n    }\n\n    override var remark: String\n        get() = \"\"\n        set(_) {}\n    override var nick: String\n        get() = nameCard\n        set(_) {}\n\n    override val nameCard: String\n        get() = mockApi.nick\n\n    override val mockApi: MockMember.MockApi = object : MockMember.MockApi {\n        override val member: MockMember\n            get() = this@MockAnonymousMemberImpl\n\n        override var nick: String = nameCard\n\n        override var remark: String\n            get() = \"\"\n            set(_) {}\n\n        override var permission: MemberPermission\n            get() = MemberPermission.MEMBER\n            set(_) {}\n        override var avatarUrl: String by lateinitMutableProperty { runBlocking { MockImage.random(bot).getUrl(bot) } }\n    }\n\n    // TODO\n    override val avatarUrl: String by mockApi::avatarUrl\n    override fun changeAvatarUrl(newAvatar: String) {\n        mockApi.avatarUrl = newAvatar\n    }\n\n\n    override suspend fun says(message: MessageChain): MessageChain {\n        val src = newMsgSrc(true, message) { ids, internalIds, time ->\n            OnlineMsgSrcFromGroup(ids, internalIds, time, message, bot, this)\n        }\n        val msg = src.withMessage(message)\n        GroupMessageEvent(nameCardOrNick, permission, this, msg, src.time).broadcast()\n        return msg\n    }\n\n    override fun toString(): String {\n        return \"AnonymousMember($nameCard, $anonymousId)\"\n    }\n}"
  },
  {
    "path": "mirai-core-mock/src/internal/contact/MockFriendImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"CANNOT_OVERRIDE_INVISIBLE_MEMBER\")\n\npackage net.mamoe.mirai.mock.internal.contact\n\nimport kotlinx.coroutines.cancel\nimport net.mamoe.mirai.contact.AvatarSpec\nimport net.mamoe.mirai.contact.Friend\nimport net.mamoe.mirai.contact.OtherClient\nimport net.mamoe.mirai.contact.friendgroup.FriendGroup\nimport net.mamoe.mirai.contact.roaming.RoamingMessages\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.OfflineAudio\nimport net.mamoe.mirai.message.data.OnlineMessageSource\nimport net.mamoe.mirai.mock.MockBot\nimport net.mamoe.mirai.mock.contact.MockFriend\nimport net.mamoe.mirai.mock.internal.contact.friendfroup.MockFriendGroups\nimport net.mamoe.mirai.mock.internal.contact.roaming.MockRoamingMessages\nimport net.mamoe.mirai.mock.internal.impl\nimport net.mamoe.mirai.mock.internal.msgsrc.OnlineMsgSrcFromFriend\nimport net.mamoe.mirai.mock.internal.msgsrc.OnlineMsgSrcToFriend\nimport net.mamoe.mirai.mock.internal.msgsrc.newMsgSrc\nimport net.mamoe.mirai.mock.utils.broadcastBlocking\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.cast\nimport java.util.concurrent.CancellationException\nimport kotlin.coroutines.CoroutineContext\n\ninternal class MockFriendImpl(\n    parentCoroutineContext: CoroutineContext,\n    bot: MockBot,\n    id: Long,\n    nick: String,\n    remark: String\n) : AbstractMockContact(\n    parentCoroutineContext,\n    bot, id\n), MockFriend {\n    private val ccinfo = bot.impl().contactDatabase.acquireCI(id, nick)\n\n    override val mockApi: MockFriend.MockApi = object : MockFriend.MockApi {\n        override val contact: MockFriend get() = this@MockFriendImpl\n\n        override var remark: String = remark\n\n        override var nick: String by ccinfo::nick\n        override var avatarUrl: String by ccinfo::avatarUrl\n\n        override var friendGroupId: Int = 0\n    }\n\n    override val friendGroup: FriendGroup\n        get() = bot.friendGroups.cast<MockFriendGroups>().findOrDefault(mockApi.friendGroupId)\n\n    override val avatarUrl: String get() = ccinfo.avatarUrl\n    internal fun initAvatarUrl(v: String) {\n        ccinfo.avatarUrl = v\n    }\n\n    override fun changeAvatarUrl(newAvatar: String) {\n        ccinfo.changeAvatarUrl(newAvatar)\n    }\n\n    override fun avatarUrl(spec: AvatarSpec): String {\n        return avatarUrl\n    }\n\n    override var nick: String\n        get() = ccinfo.nick\n        set(value) {\n            ccinfo.changeNick(value)\n        }\n\n    override var remark: String\n        get() = mockApi.remark\n        set(value) {\n            val ov = mockApi.remark\n            if (ov == value) return\n            mockApi.remark = value\n            FriendRemarkChangeEvent(this, ov, value).broadcastBlocking()\n        }\n\n    override fun newMessagePreSend(message: Message): MessagePreSendEvent {\n        return FriendMessagePreSendEvent(this, message)\n    }\n\n    override suspend fun postMessagePreSend(message: MessageChain, receipt: MessageReceipt<*>) {\n        FriendMessagePostSendEvent(this, message, null, receipt.cast()).broadcast()\n    }\n\n    override fun newMessageSource(message: MessageChain): OnlineMessageSource.Outgoing {\n        return newMsgSrc(false, message) { ids, internalIds, time ->\n            OnlineMsgSrcToFriend(ids, internalIds, time, message, bot, bot, this)\n        }\n    }\n\n    override suspend fun sendMessage(message: Message): MessageReceipt<Friend> {\n        return super<AbstractMockContact>.sendMessage(message).cast()\n    }\n\n    override suspend fun delete() {\n        if (bot.friends.delegate.remove(this)) {\n            FriendDeleteEvent(this).broadcast()\n            cancel(CancellationException(\"Friend deleted\"))\n        }\n    }\n\n    override suspend fun uploadAudio(resource: ExternalResource): OfflineAudio =\n        resource.mockUploadAudio(bot)\n\n    override val roamingMessages: RoamingMessages = MockRoamingMessages(this)\n\n    override suspend fun says(message: MessageChain): MessageChain {\n        val src = newMsgSrc(true, message) { ids, internalIds, time ->\n            OnlineMsgSrcFromFriend(ids, internalIds, time, message, bot, this, bot)\n        }\n        val msg = src.withMessage(message)\n        FriendMessageEvent(this, msg, src.time).broadcast()\n        return msg\n    }\n\n    override suspend fun broadcastMsgSyncEvent(client: OtherClient, message: MessageChain, time: Int) {\n        val src = newMsgSrc(true, message, time.toLong()) { ids, internalIds, time0 ->\n            OnlineMsgSrcToFriend(ids, internalIds, time0, message, bot, bot, this)\n        }\n        val msg = src.withMessage(message)\n        FriendMessageSyncEvent(client, this, msg, time).broadcast()\n    }\n\n    override fun toString(): String {\n        return \"Friend($id)\"\n    }\n}"
  },
  {
    "path": "mirai-core-mock/src/internal/contact/MockGroupImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"CANNOT_OVERRIDE_INVISIBLE_MEMBER\")\n\npackage net.mamoe.mirai.mock.internal.contact\n\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.contact.announcement.OfflineAnnouncement\nimport net.mamoe.mirai.contact.announcement.buildAnnouncementParameters\nimport net.mamoe.mirai.contact.file.RemoteFiles\nimport net.mamoe.mirai.contact.roaming.RoamingMessages\nimport net.mamoe.mirai.data.GroupHonorType\nimport net.mamoe.mirai.data.MemberInfo\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.internal.contact.uin\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.mock.MockBot\nimport net.mamoe.mirai.mock.contact.MockAnonymousMember\nimport net.mamoe.mirai.mock.contact.MockGroup\nimport net.mamoe.mirai.mock.contact.MockGroupControlPane\nimport net.mamoe.mirai.mock.contact.MockNormalMember\nimport net.mamoe.mirai.mock.contact.active.MockGroupActive\nimport net.mamoe.mirai.mock.contact.essence.MockEssences\nimport net.mamoe.mirai.mock.internal.contact.active.MockGroupActiveImpl\nimport net.mamoe.mirai.mock.internal.contact.essence.MockEssencesImpl\nimport net.mamoe.mirai.mock.internal.contact.roaming.MockRoamingMessages\nimport net.mamoe.mirai.mock.internal.msgsrc.OnlineMsgSrcToGroup\nimport net.mamoe.mirai.mock.internal.msgsrc.newMsgSrc\nimport net.mamoe.mirai.mock.utils.broadcastBlocking\nimport net.mamoe.mirai.mock.utils.mock\nimport net.mamoe.mirai.utils.*\nimport java.util.concurrent.CancellationException\nimport kotlin.coroutines.CoroutineContext\n\ninternal class MockGroupImpl(\n    parentCoroutineContext: CoroutineContext,\n    bot: MockBot,\n    id: Long,\n    override val uin: Long,\n    name: String,\n) : AbstractMockContact(\n    parentCoroutineContext, bot, id\n), MockGroup {\n    @Deprecated(\n        \"use active.changeHonorMember\",\n        replaceWith = ReplaceWith(\".active.changeHonorMember(member, honorType)\"),\n        level = DeprecationLevel.ERROR\n    )\n    override val honorMembers: MutableMap<GroupHonorType, MockNormalMember> = ConcurrentHashMap()\n    private val txFileSystem by lazy { bot.mock().tmpResourceServer.mockServerFileDisk.newFsSystem() }\n\n    override fun avatarUrl(spec: AvatarSpec): String {\n        return avatarUrl\n    }\n\n    override val active: MockGroupActive by lazy { MockGroupActiveImpl(this) }\n\n    override fun appendMember(mockMember: MemberInfo): MockGroup {\n        addMember(mockMember)\n        return this\n    }\n\n    override fun addMember(mockMember: MemberInfo): MockNormalMember {\n        val nMember = MockNormalMemberImpl(\n            this.coroutineContext,\n            bot,\n            mockMember.uin,\n            this,\n            mockMember.permission,\n            mockMember.remark,\n            mockMember.nick,\n            mockMember.muteTimestamp,\n            mockMember.joinTimestamp,\n            mockMember.lastSpeakTimestamp,\n            mockMember.specialTitle,\n            mockMember.nameCard\n        )\n\n        if (nMember.id == bot.id) {\n            botAsMember = nMember\n        } else {\n            members.delegate.removeAll { it.uin == nMember.id }\n            members.delegate.add(nMember)\n        }\n\n        if (nMember.permission == MemberPermission.OWNER) {\n            if (::owner.isInitialized) {\n                owner.mock().mockApi.permission = MemberPermission.MEMBER\n            }\n            owner = nMember\n        }\n        return nMember\n    }\n\n    override suspend fun changeOwner(member: NormalMember) {\n        if (member === owner) return\n        val oldOwner = owner\n        val oldPerm = member.permission\n        oldOwner.mock().mockApi.permission = MemberPermission.MEMBER\n        member.mock().mockApi.permission = MemberPermission.OWNER\n        owner = member\n\n        if (member === botAsMember) {\n            BotGroupPermissionChangeEvent(this, oldPerm, MemberPermission.OWNER)\n        } else {\n            MemberPermissionChangeEvent(member, oldPerm, MemberPermission.OWNER)\n        }.broadcast()\n\n        if (oldOwner === botAsMember) {\n            BotGroupPermissionChangeEvent(this, MemberPermission.OWNER, MemberPermission.MEMBER)\n        } else {\n            MemberPermissionChangeEvent(oldOwner, MemberPermission.OWNER, MemberPermission.MEMBER)\n        }.broadcast()\n    }\n\n    override fun changeOwnerNoEventBroadcast(member: NormalMember) {\n        val oldOwner = owner\n        member.mock().mockApi.permission = MemberPermission.OWNER\n        oldOwner.mockApi.permission = MemberPermission.MEMBER\n        owner = member\n    }\n\n    override fun newAnonymous(nick: String, id: String): MockAnonymousMember {\n        return MockAnonymousMemberImpl(\n            coroutineContext, bot, 80000000, id, this, nick\n        )\n    }\n\n\n    private val rawGroupControlPane = object : MockGroupControlPane {\n        override val group: MockGroup get() = this@MockGroupImpl\n        override val currentActor: MockNormalMember get() = group.botAsMember\n        override var isAllowMemberInvite: Boolean = false\n        override var isMuteAll: Boolean = false\n        override var isAllowMemberFileUploading: Boolean = false\n        override var isAnonymousChatAllowed: Boolean = false\n        override var isAllowConfessTalk: Boolean = false\n        override var groupName: String = name\n\n        override fun withActor(actor: MockNormalMember): MockGroupControlPane {\n            return GroupControlPaneImpl(actor)\n        }\n    }\n\n    internal inner class GroupControlPaneImpl(\n        override val currentActor: MockNormalMember\n    ) : MockGroupControlPane {\n        override val group: MockGroup get() = this@MockGroupImpl\n        private val actorNullIfBot: MockNormalMember?\n            get() = currentActor.takeIf { it.id != bot.id }\n\n        override var groupName: String\n            get() = rawGroupControlPane.groupName\n            set(value) {\n                val ov = rawGroupControlPane.groupName\n                if (ov == value) return\n                rawGroupControlPane.groupName = value\n                GroupNameChangeEvent(ov, value, group, actorNullIfBot).broadcastBlocking()\n            }\n\n        override var isMuteAll: Boolean\n            get() = rawGroupControlPane.isMuteAll\n            set(value) {\n                val ov = rawGroupControlPane.isMuteAll\n                if (ov == value) return\n                rawGroupControlPane.isMuteAll = value\n                GroupMuteAllEvent(ov, value, group, actorNullIfBot).broadcastBlocking()\n            }\n\n        override var isAllowMemberFileUploading: Boolean\n            get() = rawGroupControlPane.isAllowMemberFileUploading\n            set(value) {\n                // TODO: core-api no event\n                rawGroupControlPane.isAllowMemberFileUploading = value\n            }\n\n        override var isAllowMemberInvite: Boolean\n            get() = rawGroupControlPane.isAllowMemberInvite\n            set(value) {\n                val ov = rawGroupControlPane.isAllowMemberInvite\n                if (ov == value) return\n                rawGroupControlPane.isAllowMemberInvite = value\n                GroupAllowMemberInviteEvent(ov, value, group, actorNullIfBot).broadcastBlocking()\n            }\n\n        override var isAnonymousChatAllowed: Boolean\n            get() = rawGroupControlPane.isAnonymousChatAllowed\n            set(value) {\n                val ov = rawGroupControlPane.isAnonymousChatAllowed\n                if (ov == value) return\n                rawGroupControlPane.isAnonymousChatAllowed = value\n                GroupAllowAnonymousChatEvent(ov, value, group, actorNullIfBot).broadcastBlocking()\n            }\n\n        override var isAllowConfessTalk: Boolean\n            get() = rawGroupControlPane.isAllowConfessTalk\n            set(value) {\n                val ov = rawGroupControlPane.isAllowConfessTalk\n                if (ov == value) return\n                rawGroupControlPane.isAllowConfessTalk = value\n                GroupAllowConfessTalkEvent(ov, value, group, currentActor.id == bot.id).broadcastBlocking()\n            }\n\n        override fun withActor(actor: MockNormalMember): MockGroupControlPane {\n            return GroupControlPaneImpl(actor)\n        }\n    }\n\n    override val controlPane: MockGroupControlPane get() = rawGroupControlPane\n\n    override var name: String\n        get() = controlPane.groupName\n        set(value) {\n            checkBotPermission(MemberPermission.ADMINISTRATOR)\n            controlPane.withActor(botAsMember).groupName = value\n        }\n\n    override val mockApi: MockGroup.MockApi = object : MockGroup.MockApi {\n        override var avatarUrl: String by lateinitMutableProperty {\n            runBlocking { MockImage.randomForGroup(bot, id).getUrl(bot) }\n        }\n    }\n\n    override fun changeAvatarUrl(newAvatar: String) {\n        mockApi.avatarUrl = newAvatar\n    }\n\n    override val avatarUrl: String by mockApi::avatarUrl\n\n    override lateinit var owner: MockNormalMember\n    override lateinit var botAsMember: MockNormalMember\n    override val members: ContactList<MockNormalMember> = ContactList()\n    override fun get(id: Long): MockNormalMember? {\n        if (id == bot.id) return botAsMember\n        return members[id]\n    }\n\n    override fun contains(id: Long): Boolean = members.any { it.id == id }\n\n\n    override suspend fun quit(): Boolean {\n        return if (bot.groups.delegate.remove(this)) {\n            BotLeaveEvent.Active(this).broadcast()\n            cancel(CancellationException(\"Bot quited group $id\"))\n            true\n        } else {\n            false\n        }\n    }\n\n    override val announcements = MockAnnouncementsImpl(this)\n\n    @Suppress(\"OverridingDeprecatedMember\", \"OVERRIDE_DEPRECATION\")\n    override val settings: GroupSettings = object : GroupSettings {\n        override var entranceAnnouncement: String\n            get() = announcements.announcements.values.asSequence()\n                .filter { it.parameters.sendToNewMember }\n                .firstOrNull()?.content ?: \"\"\n            set(value) {\n                checkBotPermission(MemberPermission.ADMINISTRATOR)\n                announcements.mockPublish(OfflineAnnouncement.create(value, buildAnnouncementParameters {\n                    sendToNewMember = true\n                }), this@MockGroupImpl.botAsMember)\n            }\n\n        override var isMuteAll: Boolean\n            get() = rawGroupControlPane.isMuteAll\n            set(value) {\n                checkBotPermission(MemberPermission.ADMINISTRATOR)\n                rawGroupControlPane.withActor(botAsMember).isMuteAll = value\n            }\n\n        override var isAllowMemberInvite: Boolean\n            get() = rawGroupControlPane.isAllowMemberInvite\n            set(value) {\n                checkBotPermission(MemberPermission.ADMINISTRATOR)\n                rawGroupControlPane.withActor(botAsMember).isAllowMemberInvite = value\n            }\n\n        @MiraiExperimentalApi\n        override val isAutoApproveEnabled: Boolean\n            get() = false // TODO\n\n        override var isAnonymousChatEnabled: Boolean\n            get() = rawGroupControlPane.isAnonymousChatAllowed\n            set(value) {\n                checkBotPermission(MemberPermission.ADMINISTRATOR)\n                rawGroupControlPane.withActor(botAsMember).isAnonymousChatAllowed = value\n            }\n    }\n\n\n    override fun newMessagePreSend(message: Message): MessagePreSendEvent =\n        GroupMessagePreSendEvent(this, message)\n\n\n    override suspend fun postMessagePreSend(message: MessageChain, receipt: MessageReceipt<*>) {\n        GroupMessagePostSendEvent(this, message, null, receipt = receipt.cast())\n            .broadcast()\n    }\n\n    override fun newMessageSource(message: MessageChain): OnlineMessageSource.Outgoing {\n        return newMsgSrc(false, message) { ids, internalIds, time ->\n            OnlineMsgSrcToGroup(ids, internalIds, time, message, bot, bot, this)\n        }\n    }\n\n    override suspend fun broadcastMsgSyncEvent(client: OtherClient, message: MessageChain, time: Int) {\n        val src = newMsgSrc(true, message, time.toLong()) { ids, internalIds, time0 ->\n            OnlineMsgSrcToGroup(ids, internalIds, time0, message, bot, bot, this)\n        }\n        val msg = src.withMessage(message)\n        GroupMessageSyncEvent(client, this, msg, botAsMember, bot.nick, time).broadcast()\n    }\n\n    override suspend fun sendMessage(message: Message): MessageReceipt<Group> {\n        return super<AbstractMockContact>.sendMessage(message).cast()\n    }\n\n    @Suppress(\"OverridingDeprecatedMember\", \"DEPRECATION_ERROR\", \"OVERRIDE_DEPRECATION\")\n    override suspend fun uploadVoice(resource: ExternalResource): net.mamoe.mirai.message.data.Voice =\n        resource.mockUploadVoice(bot)\n\n    override suspend fun setEssenceMessage(source: MessageSource): Boolean {\n        checkBotPermission(MemberPermission.ADMINISTRATOR)\n        essences.mockSetEssences(source, this.botAsMember)\n        return true\n    }\n\n    override val essences: MockEssences = MockEssencesImpl(this)\n\n    @Deprecated(\"Please use files instead.\", replaceWith = ReplaceWith(\"files.root\"))\n    @Suppress(\"OverridingDeprecatedMember\", \"DEPRECATION\", \"DEPRECATION_ERROR\")\n    override val filesRoot: RemoteFile by lazy {\n        net.mamoe.mirai.mock.internal.remotefile.remotefile.RootRemoteFile(txFileSystem, this)\n    }\n\n    override val files: RemoteFiles by lazy {\n        net.mamoe.mirai.mock.internal.remotefile.absolutefile.MockRemoteFiles(this, txFileSystem)\n    }\n\n    override suspend fun uploadAudio(resource: ExternalResource): OfflineAudio =\n        resource.mockUploadAudio(bot)\n\n    override fun toString(): String {\n        return \"Group($id)\"\n    }\n\n    override val roamingMessages: RoamingMessages = MockRoamingMessages(this)\n}"
  },
  {
    "path": "mirai-core-mock/src/internal/contact/MockNormalMemberImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.internal.contact\n\nimport kotlinx.coroutines.cancel\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.OnlineMessageSource\nimport net.mamoe.mirai.mock.MockBot\nimport net.mamoe.mirai.mock.contact.MockFriend\nimport net.mamoe.mirai.mock.contact.MockGroup\nimport net.mamoe.mirai.mock.contact.MockNormalMember\nimport net.mamoe.mirai.mock.contact.active.MockMemberActive\nimport net.mamoe.mirai.mock.internal.contact.active.MockMemberActiveImpl\nimport net.mamoe.mirai.mock.internal.impl\nimport net.mamoe.mirai.mock.internal.msgsrc.OnlineMsgSrcFromGroup\nimport net.mamoe.mirai.mock.internal.msgsrc.OnlineMsgSrcToTemp\nimport net.mamoe.mirai.mock.internal.msgsrc.newMsgSrc\nimport net.mamoe.mirai.mock.utils.broadcastBlocking\nimport net.mamoe.mirai.utils.cast\nimport net.mamoe.mirai.utils.currentTimeSeconds\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.cancellation.CancellationException\nimport kotlin.math.max\n\ninternal class MockNormalMemberImpl(\n    parentCoroutineContext: CoroutineContext,\n    bot: MockBot,\n    id: Long,\n    override val group: MockGroup,\n    permission: MemberPermission,\n    remark: String,\n    nick: String,\n    muteTimeRemaining: Int,\n    joinTimestamp: Int,\n    lastSpeakTimestamp: Int,\n    specialTitle: String,\n    nameCard: String,\n) : AbstractMockContact(\n    parentCoroutineContext, bot,\n    id\n), MockNormalMember {\n    private val ccinfo = bot.impl().contactDatabase.let {\n        if (nick.isEmpty()) it.acquireCI(id)\n        else it.acquireCI(id, nick)\n    }\n\n    override val avatarUrl: String get() = ccinfo.avatarUrl\n\n    override fun avatarUrl(spec: AvatarSpec): String {\n        return avatarUrl\n    }\n\n    override fun changeAvatarUrl(newAvatar: String) {\n        ccinfo.changeAvatarUrl(newAvatar)\n    }\n\n    private inline fun <T> crossFriendAccess(\n        ifExists: (MockFriend) -> T,\n        ifNotExists: () -> T,\n    ): T {\n        val f = bot.getFriend(id) ?: return ifNotExists()\n        return ifExists(f)\n    }\n\n    override val mockApi: MockNormalMember.MockApi = object : MockNormalMember.MockApi {\n        override val member: MockNormalMember get() = this@MockNormalMemberImpl\n        override var lastSpeakTimestamp: Int = lastSpeakTimestamp\n        override var joinTimestamp: Int = joinTimestamp\n        override var muteTimeEndTimestamp: Long = currentTimeSeconds() + muteTimeRemaining\n\n        override var nick: String by ccinfo::nick\n\n        override var remark: String = remark\n            get() = crossFriendAccess(ifExists = { it.remark }, ifNotExists = { field })\n            set(value) {\n                crossFriendAccess(ifExists = { it.mockApi.remark = value }, ifNotExists = { field = value })\n            }\n\n        override var permission: MemberPermission = permission\n        override var nameCard: String = nameCard\n        override var specialTitle: String = specialTitle\n        override var avatarUrl: String by ccinfo::avatarUrl\n    }\n\n    override val permission: MemberPermission\n        get() = mockApi.permission\n    override val active: MockMemberActive by lazy { MockMemberActiveImpl() }\n    override val joinTimestamp: Int\n        get() = mockApi.joinTimestamp\n\n    override val lastSpeakTimestamp: Int\n        get() = mockApi.lastSpeakTimestamp\n\n    override val muteTimeRemaining: Int\n        get() = max((mockApi.muteTimeEndTimestamp - currentTimeSeconds()).toInt(), 0)\n\n    override val remark: String\n        get() = mockApi.remark\n\n    override var nameCard: String\n        get() = mockApi.nameCard\n        set(value) {\n            if (!group.botPermission.isOperator()) {\n                throw PermissionDeniedException(\"Bot don't have permission to change the namecard of $this\")\n            }\n            MemberCardChangeEvent(mockApi.nameCard, value, this).broadcastBlocking()\n            mockApi.nameCard = value\n        }\n\n    override var specialTitle: String\n        get() = mockApi.specialTitle\n        set(value) {\n            if (group.botPermission != MemberPermission.OWNER) {\n                throw PermissionDeniedException(\"Bot is not the owner of $group so bot cannot change the specialTitle of $this\")\n            }\n            MemberSpecialTitleChangeEvent(mockApi.specialTitle, value, this, group.botAsMember).broadcastBlocking()\n            mockApi.specialTitle = value\n        }\n\n    override val nick: String\n        get() = mockApi.nick\n\n    override suspend fun unmute() {\n        requireBotPermissionHigherThanThis(\"unmute\")\n        mockApi.muteTimeEndTimestamp = 0\n        MemberUnmuteEvent(this, null)\n    }\n\n    override suspend fun kick(message: String, block: Boolean) {\n        kick(message)\n    }\n\n    override suspend fun kick(message: String) {\n        requireBotPermissionHigherThanThis(\"kick\")\n        if (group.members.delegate.remove(this)) {\n            MemberLeaveEvent.Kick(this, group.botAsMember).broadcastBlocking()\n            cancel(CancellationException(\"Member kicked: $message\"))\n        }\n    }\n\n    override suspend fun modifyAdmin(operation: Boolean) {\n        if (group.botPermission != MemberPermission.OWNER) {\n            throw PermissionDeniedException(\"Bot is not the owner of group ${group.id}, can't modify the permission of $id($permission\")\n        }\n        if (operation && permission > MemberPermission.MEMBER) return\n\n        if (permission == MemberPermission.OWNER) {\n            throw IllegalArgumentException(\"Not allowed modify permission of owner ($id, $permission)\")\n        }\n        val newPerm = if (operation) MemberPermission.ADMINISTRATOR else MemberPermission.MEMBER\n        if (newPerm != permission) {\n            val oldPerm = permission\n            mockApi.permission = newPerm\n            MemberPermissionChangeEvent(this, oldPerm, newPerm).broadcast()\n        }\n    }\n\n    override suspend fun sendMessage(message: Message): MessageReceipt<NormalMember> {\n        return super<AbstractMockContact>.sendMessage(message).cast()\n    }\n\n    override suspend fun mute(durationSeconds: Int) {\n        requireBotPermissionHigherThanThis(\"mute\")\n        require(durationSeconds > 0) {\n            \"$durationSeconds < 0\"\n        }\n        mockApi.muteTimeEndTimestamp = currentTimeSeconds() + durationSeconds\n        MemberMuteEvent(this, durationSeconds, null)\n    }\n\n    override suspend fun broadcastMute(target: MockNormalMember, durationSeconds: Int) {\n        target.mockApi.muteTimeEndTimestamp = currentTimeSeconds() + durationSeconds\n        if (target.id == bot.id) {\n            if (durationSeconds == 0) {\n                BotUnmuteEvent(this)\n            } else {\n                BotMuteEvent(durationSeconds, this)\n            }\n        } else {\n            if (durationSeconds == 0) {\n                MemberUnmuteEvent(target, this)\n            } else {\n                MemberMuteEvent(target, durationSeconds, this)\n            }\n        }.broadcast()\n    }\n\n    override suspend fun says(message: MessageChain): MessageChain {\n        val src = newMsgSrc(true, message) { ids, internalIds, time ->\n            mockApi.lastSpeakTimestamp = time\n            OnlineMsgSrcFromGroup(ids, internalIds, time, message, bot, this)\n        }\n        val msg = src.withMessage(message)\n        GroupMessageEvent(nameCardOrNick, permission, this, msg, src.time).broadcast()\n        return msg\n    }\n\n    override fun newMessagePreSend(message: Message): MessagePreSendEvent {\n        return GroupTempMessagePreSendEvent(this, message)\n    }\n\n    override suspend fun postMessagePreSend(message: MessageChain, receipt: MessageReceipt<*>) {\n        GroupTempMessagePostSendEvent(this, message, null, receipt.cast()).broadcast()\n    }\n\n    override fun newMessageSource(message: MessageChain): OnlineMessageSource.Outgoing {\n        return newMsgSrc(false, message) { ids, internalIds, time ->\n            OnlineMsgSrcToTemp(ids, internalIds, time, message, bot, bot, this)\n        }\n    }\n\n    override fun toString(): String {\n        return \"NormalMember($id)\"\n    }\n}"
  },
  {
    "path": "mirai-core-mock/src/internal/contact/MockStrangerImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.internal.contact\n\nimport kotlinx.coroutines.cancel\nimport net.mamoe.mirai.contact.AvatarSpec\nimport net.mamoe.mirai.contact.Stranger\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.Message\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.OnlineMessageSource\nimport net.mamoe.mirai.mock.MockBot\nimport net.mamoe.mirai.mock.contact.MockStranger\nimport net.mamoe.mirai.mock.internal.impl\nimport net.mamoe.mirai.mock.internal.msgsrc.OnlineMsgSrcFromStranger\nimport net.mamoe.mirai.mock.internal.msgsrc.OnlineMsgSrcToStranger\nimport net.mamoe.mirai.mock.internal.msgsrc.newMsgSrc\nimport net.mamoe.mirai.utils.cast\nimport java.util.concurrent.CancellationException\nimport kotlin.coroutines.CoroutineContext\n\ninternal class MockStrangerImpl(\n    parentCoroutineContext: CoroutineContext,\n    bot: MockBot,\n    id: Long,\n\n    remark: String,\n    nick: String\n) : AbstractMockContact(parentCoroutineContext, bot, id), MockStranger {\n    private val ccinfo = bot.impl().contactDatabase.acquireCI(id, nick)\n\n    override val mockApi: MockStranger.MockApi = object : MockStranger.MockApi {\n        override val contact: MockStranger get() = this@MockStrangerImpl\n        override var nick: String by ccinfo::nick\n        override var remark: String = remark\n        override var avatarUrl: String by ccinfo::avatarUrl\n    }\n\n    override val avatarUrl: String get() = ccinfo.avatarUrl\n\n    override fun avatarUrl(spec: AvatarSpec): String {\n        return avatarUrl\n    }\n\n    override fun changeAvatarUrl(newAvatar: String) {\n        ccinfo.changeAvatarUrl(newAvatar)\n    }\n\n    override val nick: String\n        get() = mockApi.nick\n    override val remark: String\n        get() = mockApi.remark\n\n    override fun newMessagePreSend(message: Message): MessagePreSendEvent {\n        return StrangerMessagePreSendEvent(this, message)\n    }\n\n    override suspend fun postMessagePreSend(message: MessageChain, receipt: MessageReceipt<*>) {\n        StrangerMessagePostSendEvent(this, message, null, receipt.cast()).broadcast()\n    }\n\n    override fun newMessageSource(message: MessageChain): OnlineMessageSource.Outgoing {\n        return newMsgSrc(false, message) { ids, internalIds, time ->\n            OnlineMsgSrcToStranger(ids, internalIds, time, message, bot, bot, this)\n        }\n    }\n\n    override suspend fun sendMessage(message: Message): MessageReceipt<Stranger> {\n        return super<AbstractMockContact>.sendMessage(message).cast()\n    }\n\n    override suspend fun delete() {\n        if (bot.strangers.delegate.remove(this)) {\n            StrangerRelationChangeEvent.Deleted(this).broadcast()\n            cancel(CancellationException(\"Stranger deleted\"))\n        }\n    }\n\n    override suspend fun says(message: MessageChain): MessageChain {\n        val src = newMsgSrc(true, message) { ids, internalIds, time ->\n            OnlineMsgSrcFromStranger(ids, internalIds, time, message, bot, this, bot)\n        }\n        val msg = src.withMessage(message)\n        StrangerMessageEvent(this, msg, src.time).broadcast()\n        return msg\n    }\n}"
  },
  {
    "path": "mirai-core-mock/src/internal/contact/active/MockGroupActive.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.internal.contact.active\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.asFlow\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.contact.active.*\nimport net.mamoe.mirai.contact.checkBotPermission\nimport net.mamoe.mirai.data.GroupHonorType\nimport net.mamoe.mirai.event.events.GroupTalkativeChangeEvent\nimport net.mamoe.mirai.event.events.MemberHonorChangeEvent\nimport net.mamoe.mirai.mock.contact.MockNormalMember\nimport net.mamoe.mirai.mock.contact.active.MockGroupActive\nimport net.mamoe.mirai.mock.internal.contact.MockGroupImpl\nimport net.mamoe.mirai.mock.utils.broadcastBlocking\nimport net.mamoe.mirai.utils.ConcurrentHashMap\nimport net.mamoe.mirai.utils.JavaFriendlyAPI\nimport net.mamoe.mirai.utils.asImmutable\nimport java.util.stream.Stream\nimport kotlin.collections.set\n\ninternal class MockGroupActiveImpl(\n    private val group: MockGroupImpl\n) : MockGroupActive {\n    @Volatile\n    override var isHonorVisible: Boolean = false\n    override suspend fun setHonorVisible(newValue: Boolean) {\n        group.checkBotPermission(MemberPermission.ADMINISTRATOR)\n        isHonorVisible = newValue\n    }\n\n    @Volatile\n    override var isTitleVisible: Boolean = false\n    override suspend fun setTitleVisible(newValue: Boolean) {\n        group.checkBotPermission(MemberPermission.ADMINISTRATOR)\n        isTitleVisible = newValue\n    }\n\n    @Volatile\n    override var isTemperatureVisible: Boolean = false\n    override suspend fun setTemperatureVisible(newValue: Boolean) {\n        group.checkBotPermission(MemberPermission.ADMINISTRATOR)\n        isTemperatureVisible = newValue\n    }\n\n    @Volatile\n    override var rankTitles: Map<Int, String> = ConcurrentHashMap()\n    override suspend fun setRankTitles(newValue: Map<Int, String>) {\n        group.checkBotPermission(MemberPermission.ADMINISTRATOR)\n        rankTitles = newValue\n    }\n\n    @Volatile\n    override var temperatureTitles: Map<Int, String> = ConcurrentHashMap()\n    override suspend fun setTemperatureTitles(newValue: Map<Int, String>) {\n        group.checkBotPermission(MemberPermission.ADMINISTRATOR)\n        temperatureTitles = newValue\n    }\n\n    override suspend fun refresh() {\n    }\n\n    @Volatile\n    private var records: Collection<ActiveRecord> = listOf()\n\n    override fun asFlow(): Flow<ActiveRecord> = records.asFlow()\n\n    @JavaFriendlyAPI\n    override fun asStream(): Stream<ActiveRecord> = records.stream()\n\n    @Volatile\n    private var activeChart: ActiveChart = ActiveChart(mapOf(), mapOf(), mapOf(), mapOf(), mapOf())\n\n    override suspend fun queryChart(): ActiveChart = activeChart\n\n    private var honorHistories: MutableMap<GroupHonorType, ActiveHonorList> = ConcurrentHashMap()\n\n    @Suppress(\"INVISIBLE_MEMBER\") // for ActiveHonorInfo\n    override fun changeHonorMember(member: MockNormalMember, honorType: GroupHonorType) {\n        val old = honorHistories[honorType]\n\n        val info = ActiveHonorInfo(member.nameCard, member.id, member.avatarUrl, member, 0, 0, 0)\n        if (old == null) {\n            // if not history record found, add a new one with current honor member\n            honorHistories[honorType] = ActiveHonorList(honorType, info, emptyList())\n        } else if (old.current?.memberId != info.memberId) {\n            honorHistories[honorType] =\n                ActiveHonorList(honorType, info, old.current?.let {\n                    old.records.plus(it)\n                } ?: old.records)\n            if (old.current != null) {\n                if (honorType == GroupHonorType.TALKATIVE) {\n                    GroupTalkativeChangeEvent(\n                        this.group,\n                        member,\n                        old.current!!.member!!\n                    ).broadcastBlocking()\n                }\n                MemberHonorChangeEvent.Lose(old.current!!.member!!, honorType).broadcastBlocking()\n            }\n        }\n        MemberHonorChangeEvent.Achieve(member, honorType).broadcastBlocking()\n    }\n\n    override suspend fun queryHonorHistory(type: GroupHonorType): ActiveHonorList {\n        return honorHistories.getOrElse(type) { ActiveHonorList(type, null, listOf()) }\n    }\n\n    @Volatile\n    private var ranks: List<ActiveRankRecord> = listOf()\n\n    override suspend fun queryActiveRank(): List<ActiveRankRecord> = ranks.asImmutable()\n\n\n    ///////////////////////////////////////////////////////////////////////////\n    // mock API\n    ///////////////////////////////////////////////////////////////////////////\n\n    override fun mockSetActiveRecords(records: Collection<ActiveRecord>) {\n        this.records = records\n    }\n\n    override fun mockSetChart(chart: ActiveChart) {\n        activeChart = chart\n    }\n\n    override fun mockSetHonorHistory(type: GroupHonorType, activeHonorList: ActiveHonorList?) {\n        if (activeHonorList != null) {\n            honorHistories[type] = activeHonorList\n        } else {\n            honorHistories.remove(type)\n        }\n    }\n\n    override fun mockSetRankRecords(list: List<ActiveRankRecord>) {\n        this.ranks = list\n    }\n}"
  },
  {
    "path": "mirai-core-mock/src/internal/contact/active/MockMemberActiveImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.internal.contact.active\n\nimport net.mamoe.mirai.contact.active.MemberMedalInfo\nimport net.mamoe.mirai.contact.active.MemberMedalType\nimport net.mamoe.mirai.data.GroupHonorType\nimport net.mamoe.mirai.mock.contact.active.MockMemberActive\n\ninternal class MockMemberActiveImpl : MockMemberActive {\n    override fun mockSetRank(value: Int) {\n        rank = value\n    }\n\n    override fun mockSetPoint(value: Int) {\n        point = value\n    }\n\n    override fun mockSetHonors(value: Set<GroupHonorType>) {\n        honors = value\n    }\n\n    override fun mockSetTemperature(value: Int) {\n        temperature = value\n    }\n\n    override fun mockSetMedal(info: MemberMedalInfo) {\n        medal = info\n    }\n\n    override var rank: Int = 0\n    override var point: Int = 0\n    override var honors: Set<GroupHonorType> = setOf()\n    override var temperature: Int = 0\n\n    @Volatile\n    var medal: MemberMedalInfo = MemberMedalInfo(\"\", \"\", MemberMedalType.ACTIVE, setOf())\n\n    override suspend fun queryMedal(): MemberMedalInfo = medal\n}"
  },
  {
    "path": "mirai-core-mock/src/internal/contact/essence/MockEssences.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.internal.contact.essence\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.asFlow\nimport net.mamoe.mirai.contact.NormalMember\nimport net.mamoe.mirai.contact.essence.EssenceMessageRecord\nimport net.mamoe.mirai.message.data.MessageSource\nimport net.mamoe.mirai.mock.contact.essence.MockEssences\nimport net.mamoe.mirai.mock.internal.contact.MockGroupImpl\nimport net.mamoe.mirai.utils.ConcurrentHashMap\nimport net.mamoe.mirai.utils.currentTimeSeconds\n\ninternal class MockEssencesImpl(\n    private val group: MockGroupImpl\n) : MockEssences {\n\n    private val cache: MutableMap<MessageSource, EssenceMessageRecord> = ConcurrentHashMap()\n\n    override fun mockSetEssences(source: MessageSource, actor: NormalMember) {\n        val record = EssenceMessageRecord(\n            group = group,\n            sender = group[source.fromId],\n            senderId = source.fromId,\n            senderNick = group[source.fromId]?.nick.orEmpty(),\n            senderTime = source.time,\n            operator = actor,\n            operatorId = actor.id,\n            operatorNick = actor.nick,\n            operatorTime = currentTimeSeconds().toInt(),\n            loadMessageSource = { source }\n        )\n        cache[source] = record\n    }\n\n    override suspend fun getPage(start: Int, limit: Int): List<EssenceMessageRecord> {\n        return cache.values.toList().subList(start, start + limit)\n    }\n\n    override suspend fun share(source: MessageSource): String {\n        return \"https://qun.qq.com/essence/share?_wv=3&_wwv=128&_wvx=2&sharekey=...\"\n    }\n\n    override suspend fun remove(source: MessageSource) {\n        cache.remove(source)\n    }\n\n    override fun asFlow(): Flow<EssenceMessageRecord> {\n        return cache.values.asFlow()\n    }\n}"
  },
  {
    "path": "mirai-core-mock/src/internal/contact/friendfroup/MockFriendGroup.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.internal.contact.friendfroup\n\nimport net.mamoe.mirai.contact.Friend\nimport net.mamoe.mirai.contact.friendgroup.FriendGroup\nimport net.mamoe.mirai.mock.MockBot\nimport net.mamoe.mirai.mock.contact.MockFriend\nimport net.mamoe.mirai.mock.utils.mock\nimport net.mamoe.mirai.utils.cast\n\ninternal class MockFriendGroup(\n    private val bot: MockBot,\n    override val id: Int,\n    override var name: String,\n) : FriendGroup {\n    override val friends: Collection<Friend> = object : AbstractCollection<Friend>() {\n\n        private val seq = sequence<Friend> {\n            bot.friends.forEach { mf ->\n                if (mf.mockApi.friendGroupId == id) {\n                    yield(mf)\n                }\n            }\n        }\n\n        override fun isEmpty(): Boolean {\n            return bot.friends.none { it.mockApi.friendGroupId == id }\n        }\n\n        override fun contains(element: Friend): Boolean {\n            if (element !is MockFriend) return false\n            if (element.bot !== bot) return false\n            return element.mockApi.friendGroupId == id\n        }\n\n        override val size: Int\n            get() = bot.friends.count { it.mockApi.friendGroupId == id }\n\n        override fun iterator(): Iterator<Friend> {\n            return seq.iterator()\n        }\n\n    }\n\n    override suspend fun renameTo(newName: String): Boolean {\n        name = newName\n        return true\n    }\n\n    override suspend fun moveIn(friend: Friend): Boolean {\n        val api = friend.mock().mockApi\n        if (api.friendGroupId == id) return false\n\n        api.friendGroupId = id\n        return true\n    }\n\n    override suspend fun delete(): Boolean {\n        if (id == 0) return false\n        if (bot.friendGroups.cast<MockFriendGroups>().groups.remove(this)) {\n            friends.forEach { it.mock().mockApi.friendGroupId = 0 }\n            return true\n        }\n        return false\n    }\n\n    override val count: Int get() = friends.size\n}"
  },
  {
    "path": "mirai-core-mock/src/internal/contact/friendfroup/MockFriendGroups.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.internal.contact.friendfroup\n\nimport net.mamoe.mirai.contact.friendgroup.FriendGroup\nimport net.mamoe.mirai.contact.friendgroup.FriendGroups\nimport net.mamoe.mirai.mock.MockBot\nimport net.mamoe.mirai.utils.ConcurrentLinkedDeque\nimport net.mamoe.mirai.utils.asImmutable\nimport kotlin.math.absoluteValue\nimport kotlin.random.Random\n\ninternal class MockFriendGroups(\n    private val bot: MockBot,\n) : FriendGroups {\n    internal val groups = ConcurrentLinkedDeque<MockFriendGroup>()\n    private val defaultX = MockFriendGroup(bot, 0, \"默认分组\")\n\n    override val default: FriendGroup get() = defaultX\n\n    init {\n        groups.addLast(defaultX)\n    }\n\n    override suspend fun create(name: String): FriendGroup {\n        var newId: Int\n        do {\n            newId = Random.nextInt().absoluteValue\n        } while (groups.any { it.id == newId })\n\n        val newG = MockFriendGroup(bot, newId, name)\n        groups.addLast(newG)\n        return newG\n    }\n\n    override fun get(id: Int): FriendGroup? {\n        if (id == 0) return defaultX\n        return groups.find { it.id == id }\n    }\n\n    override fun asCollection(): Collection<FriendGroup> {\n        return groups.asImmutable()\n    }\n\n    fun findOrDefault(friendGroupId: Int): FriendGroup {\n        return get(friendGroupId) ?: defaultX\n    }\n}"
  },
  {
    "path": "mirai-core-mock/src/internal/contact/roaming/MockRoamingMessages.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.internal.contact.roaming\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.asFlow\nimport net.mamoe.mirai.contact.Friend\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.Stranger\nimport net.mamoe.mirai.contact.roaming.RoamingMessageFilter\nimport net.mamoe.mirai.contact.roaming.RoamingMessages\nimport net.mamoe.mirai.contact.roaming.RoamingSupported\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.MessageSourceKind\nimport net.mamoe.mirai.mock.internal.MockBotImpl\nimport net.mamoe.mirai.mock.utils.mock\nimport net.mamoe.mirai.utils.JavaFriendlyAPI\nimport net.mamoe.mirai.utils.cast\nimport java.util.stream.Stream\nimport kotlin.streams.asStream\n\ninternal class MockRoamingMessages(\n    internal val contact: RoamingSupported,\n) : RoamingMessages {\n    override suspend fun getMessagesIn(\n        timeStart: Long,\n        timeEnd: Long,\n        filter: RoamingMessageFilter?\n    ): Flow<MessageChain> {\n        return getMsg(timeStart, timeEnd, filter).asFlow()\n    }\n\n    private fun getMsg(\n        timeStart: Long,\n        timeEnd: Long,\n        filter: RoamingMessageFilter?\n    ): Sequence<MessageChain> {\n        val msgDb = contact.bot.cast<MockBotImpl>().msgDatabase\n        return msgDb.queryMessageInfosBy(\n            contact.id,\n            when (contact) {\n                is Friend -> MessageSourceKind.FRIEND\n                is Group -> MessageSourceKind.GROUP\n                is Stranger -> MessageSourceKind.STRANGER\n                else -> error(contact.javaClass.toString())\n            },\n            contact,\n            timeStart,\n            timeEnd,\n            filter ?: RoamingMessageFilter.ANY\n        ).map { it.buildSource(contact.bot.mock()) + it.message }\n    }\n\n    @JavaFriendlyAPI\n    override suspend fun getMessagesStream(\n        timeStart: Long,\n        timeEnd: Long,\n        filter: RoamingMessageFilter?\n    ): Stream<MessageChain> {\n        return getMsg(timeStart, timeEnd, filter).asStream()\n    }\n}\n"
  },
  {
    "path": "mirai-core-mock/src/internal/contact/util.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"CANNOT_OVERRIDE_INVISIBLE_MEMBER\")\n\npackage net.mamoe.mirai.mock.internal.contact\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.contact.Group\nimport net.mamoe.mirai.contact.Member\nimport net.mamoe.mirai.contact.PermissionDeniedException\nimport net.mamoe.mirai.internal.contact.uin\nimport net.mamoe.mirai.internal.message.data.OnlineAudioImpl\nimport net.mamoe.mirai.internal.message.image.DeferredOriginUrlAware\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.mock.MockBot\nimport net.mamoe.mirai.mock.contact.MockGroup\nimport net.mamoe.mirai.mock.utils.mock\nimport net.mamoe.mirai.mock.utils.plusHttpSubpath\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource\nimport net.mamoe.mirai.utils.Services\nimport net.mamoe.mirai.utils.cast\nimport net.mamoe.mirai.utils.toUHexString\n\n\ninternal fun Member.requireBotPermissionHigherThanThis(msg: String) {\n    if (this.permission < this.group.botPermission) return\n\n    throw PermissionDeniedException(\"bot current permission ${group.botPermission} can't modify $id($permission), $msg\")\n}\n\ninternal fun MessageSource.withMessage(msg: Message): MessageChain = buildMessageChain {\n    add(this@withMessage)\n    if (msg is MessageChain) {\n        msg.forEach { sub ->\n            if (sub !is MessageSource) {\n                add(sub)\n            }\n        }\n    } else if (msg !is MessageSource) {\n        add(msg)\n    }\n}\n\n@Suppress(\"UNUSED_PARAMETER\")\ninternal suspend fun ExternalResource.mockUploadAudio(bot: MockBot): OfflineAudio {\n    val md5 = md5 // calculate before using resource\n    return inResource {\n        OfflineAudio(\n            filename = md5.toUHexString() + \".amr\",\n            fileMd5 = md5,\n            fileSize = size,\n            codec = AudioCodec.SILK,\n            extraData = null,\n        )\n    }\n}\n\ninternal suspend fun ExternalResource.mockUploadVoice(bot: MockBot) = kotlin.run {\n    val md5 = this.md5\n    val size = this.size\n    @Suppress(\"DEPRECATION_ERROR\")\n    net.mamoe.mirai.message.data.Voice(\n        fileName = md5.toUHexString() + \".amr\",\n        md5 = md5,\n        fileSize = size,\n        _url = bot.tmpResourceServer.uploadResourceAndGetUrl(this)\n    )\n}\n\ninternal const val AQQ_RECALL_FAILED_MESSAGE: String = \"No message meets the requirements\"\n\ninternal val Group.mockUin: Long\n    get() = when (this) {\n        is MockGroup -> this.uin\n        else -> this.uin\n    }\n\n\ninternal suspend fun ExternalResource.mockImplUploadAudioAsOnline(bot: MockBot): OnlineAudio {\n    val md5 = this.md5\n    val size = this.size\n    return OnlineAudioImpl(\n        filename = md5.toUHexString() + \".amr\",\n        fileMd5 = md5,\n        fileSize = size,\n        codec = AudioCodec.SILK,\n        url = bot.tmpResourceServer.uploadResourceAndGetUrl(this),\n        length = size,\n        originalPtt = null,\n    )\n}\n\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(MockImage.Serializer::class)\ninternal class MockImage(\n    override val imageId: String,\n    private val urlPath: String,\n    override val width: Int = 0,\n    override val height: Int = 0,\n    override val size: Long = 0,\n    override val imageType: ImageType = ImageType.UNKNOWN,\n) : DeferredOriginUrlAware, Image {\n\n    companion object {\n        // create a mockImage with random content\n        internal suspend fun random(bot: MockBot): MockImage {\n            val text = bot.avatarGenerator.generateRandomAvatar()\n            return bot.uploadMockImage(text.toExternalResource().toAutoCloseable()).cast()\n        }\n\n        internal suspend fun randomForPerson(bot: MockBot, id: Long): MockImage {\n            val text = bot.avatarGenerator.generateAvatarForPerson(id)\n            return bot.uploadMockImage(text.toExternalResource().toAutoCloseable()).cast()\n        }\n\n        internal suspend fun randomForGroup(bot: MockBot, id: Long): MockImage {\n            val text = bot.avatarGenerator.generateAvatarForGroup(id)\n            return bot.uploadMockImage(text.toExternalResource().toAutoCloseable()).cast()\n        }\n    }\n\n    object Serializer : Image.FallbackSerializer(\"MockImage\")\n\n    private val _stringValue: String? by lazy(LazyThreadSafetyMode.NONE) { \"[mirai:image:$imageId]\" }\n\n    override fun getUrl(bot: Bot): String {\n        if (urlPath.startsWith(\"http\"))\n            return urlPath\n        return bot.mock().tmpResourceServer.storageRoot.toString().plusHttpSubpath(urlPath)\n    }\n\n    override fun toString(): String = _stringValue!!\n    override fun contentToString(): String = if (isEmoji) {\n        \"[动画表情]\"\n    } else {\n        \"[图片]\"\n    }\n\n    override fun appendMiraiCodeTo(builder: StringBuilder) {\n        builder.append(\"[mirai:image:\").append(imageId).append(\"]\")\n    }\n\n    override fun hashCode(): Int = imageId.hashCode()\n    override fun equals(other: Any?): Boolean {\n        if (other === this) return true\n        if (other !is Image) return false\n        return this.imageId == other.imageId\n    }\n}\n\ninternal object MockInternalImageProtocolImpl : InternalImageProtocol {\n\n    override fun createImage(\n        imageId: String,\n        size: Long,\n        type: ImageType,\n        width: Int,\n        height: Int,\n        isEmoji: Boolean\n    ): Image = MockImage(imageId, \"images/\" + imageId.substring(1..36), width, height, size, type)\n\n    override suspend fun isUploaded(\n        bot: Bot,\n        md5: ByteArray,\n        size: Long,\n        context: Contact?,\n        type: ImageType,\n        width: Int,\n        height: Int\n    ): Boolean = bot.cast<MockBot>().tmpResourceServer.isImageUploaded(md5, size)\n\n}\n\ninternal fun registerMockServices() {\n    Services.registerAsOverride(\n        Services.qualifiedNameOrFail(InternalImageProtocol::class),\n        \"net.mamoe.mirai.mock.internal.contact.MockInternalImageProtocolImpl\"\n    ) {\n        MockInternalImageProtocolImpl\n    }\n}\n"
  },
  {
    "path": "mirai-core-mock/src/internal/contactbase/ContactDatabase.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.internal.contactbase\n\nimport net.mamoe.mirai.mock.internal.MockBotImpl\nimport net.mamoe.mirai.utils.ConcurrentHashMap\n\ninternal class ContactDatabase(\n    private val bot: MockBotImpl,\n) {\n    val contacts = ConcurrentHashMap<Long, ContactInfo>()\n\n    fun acquireCI(id: Long): ContactInfo {\n        return contacts.computeIfAbsent(id) {\n            ContactInfo(bot, id, bot.nameGenerator.nextFriendName())\n        }\n    }\n\n    fun acquireCI(id: Long, name: String): ContactInfo {\n        return contacts.computeIfAbsent(id) {\n            ContactInfo(bot, id, name)\n        }.also { rsp ->\n            if (rsp.nick != name) rsp.changeNick(name)\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core-mock/src/internal/contactbase/ContactInfo.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.internal.contactbase\n\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.mirai.event.events.BotAvatarChangedEvent\nimport net.mamoe.mirai.event.events.BotNickChangedEvent\nimport net.mamoe.mirai.event.events.FriendAvatarChangedEvent\nimport net.mamoe.mirai.event.events.FriendNickChangedEvent\nimport net.mamoe.mirai.mock.internal.MockBotImpl\nimport net.mamoe.mirai.mock.internal.contact.MockImage\nimport net.mamoe.mirai.mock.utils.broadcastBlocking\nimport net.mamoe.mirai.utils.lateinitMutableProperty\n\ninternal class ContactInfo(\n    private val declaredBot: MockBotImpl,\n    @JvmField val id: Long,\n    @JvmField var nick: String,\n) {\n    var avatarUrl: String by lateinitMutableProperty {\n        runBlocking { MockImage.randomForPerson(declaredBot, id).getUrl(declaredBot) }\n    }\n\n    fun changeAvatarUrl(newAvatar: String) {\n        avatarUrl = newAvatar\n        if (declaredBot.id == id) {\n            BotAvatarChangedEvent(declaredBot).broadcastBlocking()\n            return\n        }\n        declaredBot.getFriend(id)?.let {\n            FriendAvatarChangedEvent(it).broadcastBlocking()\n        }\n    }\n\n    fun changeNick(newNick: String) {\n        if (id == declaredBot.id) {\n            val o = nick\n            nick = newNick\n            BotNickChangedEvent(declaredBot, o, newNick).broadcastBlocking()\n            return\n        }\n        val friend = declaredBot.getFriend(id)\n        if (friend == null) {\n            nick = newNick\n            return\n        }\n        val o = nick\n        nick = newNick\n        FriendNickChangedEvent(friend, o, newNick).broadcastBlocking()\n    }\n}\n"
  },
  {
    "path": "mirai-core-mock/src/internal/db/MsgDatabaseImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.internal.db\n\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.contact.roaming.RoamingMessage\nimport net.mamoe.mirai.contact.roaming.RoamingMessageFilter\nimport net.mamoe.mirai.message.data.MessageChain\nimport net.mamoe.mirai.message.data.MessageSourceKind\nimport net.mamoe.mirai.mock.database.MessageDatabase\nimport net.mamoe.mirai.mock.database.MessageInfo\nimport net.mamoe.mirai.mock.database.mockMsgDatabaseId\nimport java.util.concurrent.ConcurrentLinkedDeque\nimport java.util.concurrent.atomic.AtomicInteger\nimport kotlin.random.Random\n\ninternal class MsgDatabaseImpl : MessageDatabase {\n    override fun disconnect() {}\n    override fun connect() {}\n\n    val db = ConcurrentLinkedDeque<MessageInfo>()\n    val idCounter1 = AtomicInteger(Random.nextInt())\n    val idCounter2 = AtomicInteger(Random.nextInt())\n\n    override fun newMessageInfo(\n        sender: Long, subject: Long,\n        kind: MessageSourceKind,\n        time: Long,\n        message: MessageChain,\n    ): MessageInfo {\n        val dbid = mockMsgDatabaseId(idCounter1.getAndIncrement(), idCounter2.getAndDecrement())\n        val info = MessageInfo(\n            mixinedMsgId = dbid,\n            sender = sender,\n            subject = subject,\n            kind = kind,\n            time = time,\n            message = message,\n        )\n        db.add(info)\n        return info\n    }\n\n    override fun queryMessageInfo(msgId: Long): MessageInfo? {\n        return db.firstOrNull { it.mixinedMsgId == msgId }\n    }\n\n    override fun removeMessageInfo(msgId: Long) {\n        db.removeIf { it.mixinedMsgId == msgId }\n    }\n\n    override fun queryMessageInfosBy(\n        subject: Long, kind: MessageSourceKind,\n        contact: Contact,\n        timeStart: Long,\n        timeEnd: Long,\n        filter: RoamingMessageFilter\n    ): Sequence<MessageInfo> {\n        if (timeEnd < timeStart) return emptySequence()\n        return sequence<MessageInfo> {\n            val rm = object : RoamingMessage {\n                override val contact: Contact get() = contact\n                override var sender: Long = -1\n                override var target: Long = -1\n                override var time: Long = -1\n                override val ids: IntArray = intArrayOf(-1)\n                override val internalIds: IntArray = intArrayOf(-1)\n            }\n            for (msgInfo in db) {\n                if (msgInfo.kind != kind) continue\n                if (msgInfo.time < timeStart) continue\n                if (msgInfo.time > timeEnd) continue\n                if (msgInfo.subject != subject) continue\n\n                rm.sender = msgInfo.sender\n                if (kind != MessageSourceKind.GROUP) {\n                    if (msgInfo.sender == contact.id) {\n                        rm.target = contact.bot.id\n                    } else {\n                        rm.target = msgInfo.subject\n                    }\n                } else {\n                    rm.target = msgInfo.subject\n                }\n                rm.time = msgInfo.time\n                rm.ids[0] = msgInfo.id\n                rm.internalIds[0] = msgInfo.internal\n\n                if (filter.invoke(rm)) {\n                    yield(msgInfo)\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core-mock/src/internal/msgsrc/OnlineMsgSrc.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_REFERENCE\", \"INVISIBLE_MEMBER\")\n@file:OptIn(MiraiInternalApi::class)\n\npackage net.mamoe.mirai.mock.internal.msgsrc\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.internal.message.MessageSourceSerializerImpl\nimport net.mamoe.mirai.internal.message.protocol.MessageProtocolFacadeImpl\nimport net.mamoe.mirai.internal.message.protocol.StubMessageProtocol\nimport net.mamoe.mirai.internal.message.protocol.serialization.MessageSerializer\nimport net.mamoe.mirai.message.MessageSerializers\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.mock.internal.contact.AbstractMockContact\nimport net.mamoe.mirai.mock.internal.contact.MockImage\nimport net.mamoe.mirai.utils.MiraiInternalApi\nimport net.mamoe.mirai.utils.cast\nimport net.mamoe.mirai.utils.currentTimeSeconds\n\ninternal fun registerMockMsgSerializers() {\n    val serializers = mutableListOf<MessageSerializer<*>>()\n\n    MessageSerializer.superclassesScope(Image::class, MessageContent::class, SingleMessage::class) {\n        serializers.add(\n            MessageSerializer(\n                MockImage::class,\n                MockImage.serializer()\n            )\n        )\n    }\n\n    MessageSerializer.superclassesScope(MessageSource::class, MessageMetadata::class, SingleMessage::class) {\n\n        serializers.add(\n            MessageSerializer(\n                OnlineMsgSrcToGroup::class,\n                OnlineMsgSrcToGroup.serializer()\n            )\n        )\n        serializers.add(\n            MessageSerializer(\n                OnlineMsgSrcToFriend::class,\n                OnlineMsgSrcToFriend.serializer()\n            )\n        )\n        serializers.add(\n            MessageSerializer(\n                OnlineMsgSrcToStranger::class,\n                OnlineMsgSrcToStranger.serializer()\n            )\n        )\n        serializers.add(\n            MessageSerializer(\n                OnlineMsgSrcToTemp::class,\n                OnlineMsgSrcToTemp.serializer()\n            )\n        )\n\n\n        serializers.add(\n            MessageSerializer(\n                OnlineMsgSrcFromGroup::class,\n                OnlineMsgSrcFromGroup.serializer()\n            )\n        )\n        serializers.add(\n            MessageSerializer(\n                OnlineMsgSrcFromFriend::class,\n                OnlineMsgSrcFromFriend.serializer()\n            )\n        )\n        serializers.add(\n            MessageSerializer(\n                OnlineMsgSrcFromStranger::class,\n                OnlineMsgSrcFromStranger.serializer()\n            )\n        )\n        serializers.add(\n            MessageSerializer(\n                OnlineMsgSrcFromTemp::class,\n                OnlineMsgSrcFromTemp.serializer()\n            )\n        )\n    }\n\n    val module = MessageProtocolFacadeImpl(listOf(StubMessageProtocol), \"\").also {\n        it.serializers.addAll(serializers)\n    }.createSerializersModule()\n\n    MessageSerializers.registerSerializers(module)\n}\n\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(OnlineMsgSrcToGroup.Serializer::class)\ninternal class OnlineMsgSrcToGroup(\n    override val ids: IntArray,\n    override val internalIds: IntArray,\n    override val time: Int,\n    override val originalMessage: MessageChain,\n    override val bot: Bot,\n    override val sender: Bot,\n    override val target: Group\n) : OnlineMessageSource.Outgoing.ToGroup() {\n    override val isOriginalMessageInitialized: Boolean get() = true\n\n    object Serializer : KSerializer<MessageSource> by MessageSourceSerializerImpl(\"Mock_OnlineMessageSourceToGroup\")\n\n}\n\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(OnlineMsgSrcToFriend.Serializer::class)\ninternal class OnlineMsgSrcToFriend(\n    override val ids: IntArray,\n    override val internalIds: IntArray,\n    override val time: Int,\n    override val originalMessage: MessageChain,\n    override val bot: Bot,\n    override val sender: Bot,\n    override val target: Friend\n) : OnlineMessageSource.Outgoing.ToFriend() {\n    override val isOriginalMessageInitialized: Boolean get() = true\n\n    object Serializer : KSerializer<MessageSource> by MessageSourceSerializerImpl(\"Mock_OnlineMessageSourceToFriend\")\n\n}\n\n\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(OnlineMsgSrcToStranger.Serializer::class)\ninternal class OnlineMsgSrcToStranger(\n    override val ids: IntArray,\n    override val internalIds: IntArray,\n    override val time: Int,\n    override val originalMessage: MessageChain,\n    override val bot: Bot,\n    override val sender: Bot,\n    override val target: Stranger\n) : OnlineMessageSource.Outgoing.ToStranger() {\n    override val isOriginalMessageInitialized: Boolean get() = true\n\n    object Serializer : KSerializer<MessageSource> by MessageSourceSerializerImpl(\"Mock_OnlineMessageSourceToStranger\")\n}\n\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(OnlineMsgSrcToTemp.Serializer::class)\ninternal class OnlineMsgSrcToTemp(\n    override val ids: IntArray,\n    override val internalIds: IntArray,\n    override val time: Int,\n    override val originalMessage: MessageChain,\n    override val bot: Bot,\n    override val sender: Bot,\n    override val target: Member\n) : OnlineMessageSource.Outgoing.ToTemp() {\n    override val isOriginalMessageInitialized: Boolean get() = true\n\n    object Serializer : KSerializer<MessageSource> by MessageSourceSerializerImpl(\"Mock_OnlineMessageSourceToTemp\")\n}\n\n\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(OnlineMsgSrcFromFriend.Serializer::class)\ninternal class OnlineMsgSrcFromFriend(\n    override val ids: IntArray,\n    override val internalIds: IntArray,\n    override val time: Int,\n    override val originalMessage: MessageChain,\n    override val bot: Bot,\n    override val sender: Friend,\n    override val target: ContactOrBot,\n) : OnlineMessageSource.Incoming.FromFriend() {\n    override val isOriginalMessageInitialized: Boolean get() = true\n\n    override val subject: Friend\n        get() {\n            if (target is Bot) return sender\n            return target.cast()\n        }\n\n    object Serializer : KSerializer<MessageSource> by MessageSourceSerializerImpl(\"Mock_OnlineMessageSourceFromFriend\")\n}\n\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(OnlineMsgSrcFromStranger.Serializer::class)\ninternal class OnlineMsgSrcFromStranger(\n    override val ids: IntArray,\n    override val internalIds: IntArray,\n    override val time: Int,\n    override val originalMessage: MessageChain,\n    override val bot: Bot,\n    override val sender: Stranger,\n    override val target: ContactOrBot,\n) : OnlineMessageSource.Incoming.FromStranger() {\n    override val isOriginalMessageInitialized: Boolean get() = true\n\n    override val subject: Stranger\n        get() {\n            if (target is Bot) return sender\n            return target.cast()\n        }\n\n    object Serializer : KSerializer<MessageSource> by MessageSourceSerializerImpl(\n        \"Mock_OnlineMessageSourceFromStranger\"\n    )\n}\n\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(OnlineMsgSrcFromTemp.Serializer::class)\ninternal class OnlineMsgSrcFromTemp(\n    override val ids: IntArray,\n    override val internalIds: IntArray,\n    override val time: Int,\n    override val originalMessage: MessageChain,\n    override val bot: Bot,\n    override val sender: Member,\n    override val target: ContactOrBot,\n) : OnlineMessageSource.Incoming.FromTemp() {\n    override val isOriginalMessageInitialized: Boolean get() = true\n    override val subject: Member\n        get() {\n            if (target is Bot) return sender\n            return target.cast()\n        }\n\n    object Serializer : KSerializer<MessageSource> by MessageSourceSerializerImpl(\"Mock_OnlineMessageSourceFromTemp\")\n\n}\n\n@Suppress(\"SERIALIZER_TYPE_INCOMPATIBLE\")\n@Serializable(OnlineMsgSrcFromGroup.Serializer::class)\ninternal class OnlineMsgSrcFromGroup(\n    override val ids: IntArray,\n    override val internalIds: IntArray,\n    override val time: Int,\n    override val originalMessage: MessageChain,\n    override val bot: Bot,\n    override val sender: Member\n) : OnlineMessageSource.Incoming.FromGroup() {\n    override val isOriginalMessageInitialized: Boolean get() = true\n\n    object Serializer : KSerializer<MessageSource> by MessageSourceSerializerImpl(\"Mock_OnlineMessageSourceFromGroup\")\n\n}\n\ninternal typealias MsgSrcConstructor<R> = (\n    ids: IntArray,\n    internalIds: IntArray,\n    time: Int,\n) -> R\n\ninternal inline fun <R> AbstractMockContact.newMsgSrc(\n    isSaying: Boolean,\n    messageChain: MessageChain,\n    time: Long = currentTimeSeconds(),\n    constructor: MsgSrcConstructor<R>,\n): R {\n    val db = bot.msgDatabase\n    val info = if (isSaying) {\n        db.newMessageInfo(\n            sender = id,\n            subject = when (this) {\n                is Member -> group.id\n                is Stranger,\n                is Friend,\n                -> this.id\n\n                else -> error(\"Invalid contact: $this\")\n            },\n            kind = when (this) {\n                is Member -> MessageSourceKind.GROUP\n                is Stranger -> MessageSourceKind.STRANGER\n                is Friend -> MessageSourceKind.FRIEND\n                else -> error(\"Invalid contact: $this\")\n            },\n            message = messageChain,\n            time = time,\n        )\n    } else {\n        db.newMessageInfo(\n            sender = bot.id,\n            subject = this.id,\n            kind = when (this) {\n                is NormalMember -> MessageSourceKind.TEMP\n                is Stranger -> MessageSourceKind.STRANGER\n                is Friend -> MessageSourceKind.FRIEND\n                is Group -> MessageSourceKind.GROUP\n                else -> error(\"Invalid contact: $this\")\n            },\n            message = messageChain,\n            time = time,\n        )\n    }\n    return constructor(\n        intArrayOf(info.id),\n        intArrayOf(info.internal),\n        info.time.toInt(),\n    )\n}\n\n"
  },
  {
    "path": "mirai-core-mock/src/internal/remotefile/absolutefile/MockAbsoluteFile.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n@file:Suppress(\"invisible_member\", \"INVISIBLE_REFERENCE\")\n\npackage net.mamoe.mirai.mock.internal.remotefile.absolutefile\n\nimport kotlinx.coroutines.flow.filter\nimport kotlinx.coroutines.flow.firstOrNull\nimport net.mamoe.mirai.contact.FileSupported\nimport net.mamoe.mirai.contact.file.AbsoluteFile\nimport net.mamoe.mirai.contact.file.AbsoluteFolder\nimport net.mamoe.mirai.internal.message.data.FileMessageImpl\nimport net.mamoe.mirai.message.data.FileMessage\nimport net.mamoe.mirai.mock.internal.remotefile.remotefile.MockRemoteFile\nimport net.mamoe.mirai.mock.resserver.MockServerRemoteFile\nimport net.mamoe.mirai.mock.utils.mock\n\ninternal class MockAbsoluteFile(\n    override val sha1: ByteArray,\n    override val md5: ByteArray,\n    private val files: MockRemoteFiles,\n    override var parent: AbsoluteFolder?,\n    override val id: String,\n    override var name: String,\n    override var absolutePath: String,\n    override val contact: FileSupported = files.contact,\n    override var expiryTime: Long = 0L,\n    override val size: Long = 0,\n    override val isFile: Boolean = true,\n    override val isFolder: Boolean = false,\n    override val uploadTime: Long = 0,\n    override var lastModifiedTime: Long = 0,\n    override val uploaderId: Long = 0\n) : AbsoluteFile {\n    @Volatile\n    private var _exists = true\n    override suspend fun moveTo(folder: AbsoluteFolder): Boolean {\n        if (!exists()) return false\n        files.fileSystem.resolveById(id)!!.moveTo(files.fileSystem.resolveById(folder.id)!!)\n        this.parent = folder\n        refresh()\n        return true\n    }\n\n    override suspend fun getUrl(): String =\n        files.contact.bot.mock().tmpResourceServer.resolveHttpUrlByPath(\n            files.fileSystem.resolveById(id)!!.resolveNativePath()\n        ).toString()\n\n    override fun toMessage(): FileMessage {\n        //todo busId\n        return FileMessageImpl(id, 0, name, size)\n    }\n\n    override suspend fun refreshed(): AbsoluteFile? =\n        parent!!.files().filter { it.id == id }.firstOrNull()\n\n\n    private fun canModify(resolved: MockServerRemoteFile): Boolean {\n        return MockRemoteFile.canModify(resolved, contact)\n    }\n\n    override suspend fun exists(): Boolean = _exists\n\n    override suspend fun renameTo(newName: String): Boolean {\n        if (!exists()) return false\n        val resolved = files.fileSystem.resolveById(id) ?: return false\n        if (!canModify(resolved)) return false\n        if (resolved.rename(newName)) {\n            refresh()\n            return true\n        }\n        return false\n    }\n\n    override suspend fun delete(): Boolean {\n        if (!exists()) return false\n        val resolved = files.fileSystem.resolveById(id) ?: return false\n        if (!canModify(resolved)) return false\n        if (resolved.delete()) {\n            _exists = false\n            return true\n        }\n        return false\n    }\n\n    override suspend fun refresh(): Boolean {\n        val new = refreshed()\n        if (new == null) {\n            _exists = false\n            return false\n        }\n        _exists = true\n        this.parent = new.parent\n        this.expiryTime = new.expiryTime\n        this.name = new.name\n        this.lastModifiedTime = new.lastModifiedTime\n        this.absolutePath = new.absolutePath\n        return true\n    }\n\n    override fun toString(): String = \"MockAbsoluteFile(id=$id,absolutePath=$absolutePath,name=$name)\"\n    override fun equals(other: Any?): Boolean =\n        other != null && other is AbsoluteFile && other.id == id\n\n    override fun hashCode(): Int {\n        // from absoluteFileImpl\n        var result = super.hashCode()\n        result = 31 * result + expiryTime.hashCode()\n        result = 31 * result + size.hashCode()\n        result = 31 * result + sha1.contentHashCode()\n        result = 31 * result + md5.contentHashCode()\n        return result\n    }\n}"
  },
  {
    "path": "mirai-core-mock/src/internal/remotefile/absolutefile/MockAbsoluteFolder.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n@file: Suppress(\"invisible_member\", \"invisible_reference\")\n\npackage net.mamoe.mirai.mock.internal.remotefile.absolutefile\n\nimport kotlinx.coroutines.flow.*\nimport net.mamoe.mirai.contact.FileSupported\nimport net.mamoe.mirai.contact.PermissionDeniedException\nimport net.mamoe.mirai.contact.file.AbsoluteFile\nimport net.mamoe.mirai.contact.file.AbsoluteFileFolder\nimport net.mamoe.mirai.contact.file.AbsoluteFolder\nimport net.mamoe.mirai.contact.isOperator\nimport net.mamoe.mirai.internal.utils.FileSystem\nimport net.mamoe.mirai.mock.contact.MockGroup\nimport net.mamoe.mirai.mock.internal.remotefile.remotefile.MockRemoteFile\nimport net.mamoe.mirai.mock.resserver.MockServerRemoteFile\nimport net.mamoe.mirai.utils.ExternalResource\nimport net.mamoe.mirai.utils.JavaFriendlyAPI\nimport net.mamoe.mirai.utils.ProgressionCallback\nimport net.mamoe.mirai.utils.safeCast\nimport java.util.stream.Stream\nimport kotlin.streams.asStream\n\nprivate fun MockServerRemoteFile.toMockAbsFolder(files: MockRemoteFiles): AbsoluteFolder {\n    if (this == files.fileSystem.root) return files.root\n    val parent = this.parent.toMockAbsFolder(files)\n    return MockAbsoluteFolder(\n        files,\n        parent,\n        this.id,\n        this.name,\n        parent.absolutePath.removeSuffix(\"/\") + \"/\" + this.name,\n        contentsCount = this.listFiles()?.count() ?: 0\n    )\n}\n\nprivate fun MockServerRemoteFile.toMockAbsFile(\n    files: MockRemoteFiles,\n    md5: ByteArray = byteArrayOf(),\n    sha1: ByteArray = byteArrayOf()\n): AbsoluteFile {\n    val parent = this.parent.toMockAbsFolder(files)\n    return if (md5.isEmpty() || sha1.isEmpty()) {\n        asExternalResource().use { res ->\n            MockAbsoluteFile(\n                if (sha1.isEmpty()) res.sha1 else sha1,\n                if (md5.isEmpty()) res.md5 else md5,\n                files,\n                parent,\n                this.id,\n                this.name,\n                parent.absolutePath.removeSuffix(\"/\") + \"/\" + this.name\n            )\n        }\n    } else {\n        MockAbsoluteFile(\n            sha1,\n            md5,\n            files,\n            parent,\n            this.id,\n            this.name,\n            parent.absolutePath.removeSuffix(\"/\") + \"/\" + this.name\n        )\n    }\n}\n\ninternal open class MockAbsoluteFolder(\n    internal val files: MockRemoteFiles,\n    override val parent: AbsoluteFolder? = null,\n    override val id: String = \"/\",\n    override var name: String = \"/\",\n    override var absolutePath: String = \"/\",\n    override val contact: FileSupported = files.contact,\n    override val isFile: Boolean = false,\n    override val isFolder: Boolean = true,\n    override val uploadTime: Long = 0L,\n    override var lastModifiedTime: Long = 0L,\n    override val uploaderId: Long = 0L,\n    override var contentsCount: Int = 0\n) : AbsoluteFolder {\n    private var _exists = true\n    override suspend fun refreshed(): AbsoluteFolder? = parent!!.resolveFolderById(id)\n\n    private fun currentTxRF() = files.fileSystem.resolveById(id)!!\n\n    override suspend fun folders(): Flow<AbsoluteFolder> =\n        currentTxRF().listFiles()?.filter { it.isDirectory }?.map { it.toMockAbsFolder(files) }?.asFlow() ?: emptyFlow()\n\n\n    @JavaFriendlyAPI\n    override suspend fun foldersStream(): Stream<AbsoluteFolder> =\n        currentTxRF().listFiles()?.filter { it.isDirectory }?.map { it.toMockAbsFolder(files) }?.asStream()\n            ?: Stream.empty()\n\n    override suspend fun files(): Flow<AbsoluteFile> =\n        currentTxRF().listFiles()?.filter { it.isFile }?.map { it.toMockAbsFile(files) }?.asFlow() ?: emptyFlow()\n\n    @JavaFriendlyAPI\n    override suspend fun filesStream(): Stream<AbsoluteFile> =\n        currentTxRF().listFiles()?.filter { it.isFile }?.map { it.toMockAbsFile(files) }?.asStream() ?: Stream.empty()\n\n    override suspend fun children(): Flow<AbsoluteFileFolder> =\n        files.fileSystem.resolveById(id)!!.listFiles()?.map {\n            if (it.isFile) it.toMockAbsFile(files)\n            else it.toMockAbsFolder(files)\n        }?.asFlow() ?: emptyFlow()\n\n    @JavaFriendlyAPI\n    override suspend fun childrenStream(): Stream<AbsoluteFileFolder> =\n        files.fileSystem.resolveById(id)!!.listFiles()?.map {\n            if (it.isFile) it.toMockAbsFile(files)\n            else it.toMockAbsFolder(files)\n        }?.asStream() ?: Stream.empty()\n\n    override suspend fun createFolder(name: String): AbsoluteFolder {\n        if (name.isBlank()) throw IllegalArgumentException(\"folder name cannot be blank.\")\n\n        contact.safeCast<MockGroup>()?.let check@{ group ->\n            if (group.botPermission.isOperator()) return@check\n            throw IllegalStateException(\"Requires admin permission to create folder `$name`\")\n        }\n\n        FileSystem.checkLegitimacy(name)\n        currentTxRF().mksubdir(name, 0L)\n        return resolveFolder(name)!!\n    }\n\n    override suspend fun resolveFolder(name: String): AbsoluteFolder? {\n        FileSystem.checkLegitimacy(name)\n        if (name.isBlank()) throw IllegalArgumentException(\"folder path cannot be blank\")\n        val n = name.removePrefix(\"/\").removeSuffix(\"/\")\n        val a = absolutePath.removeSuffix(\"/\")\n        val f = files.fileSystem.findByPath(\"$a/$n\").firstOrNull() ?: return null\n        return f.toMockAbsFolder(files)\n    }\n\n    override suspend fun resolveFolderById(id: String): AbsoluteFolder? {\n        if (name.isBlank()) throw IllegalArgumentException(\"folder id cannot be blank.\")\n        if (!FileSystem.isLegal(id)) return null\n        if (id == files.root.id) return files.root\n        if (this.id != files.root.id) return null // tx服务器只支持一层文件夹\n        val f = files.fileSystem.resolveById(id) ?: return null\n        if (!f.exists || !f.isDirectory) return null\n        return f.toMockAbsFolder(files)\n    }\n\n    override suspend fun resolveFileById(id: String, deep: Boolean): AbsoluteFile? {\n        if (id == \"/\" || id.isEmpty()) throw IllegalArgumentException(\"Illegal file id: $id\")\n        files().firstOrNull { it.id == id }?.let { return it }\n        if (!deep) return null\n        return folders().map { it.resolveFileById(id, deep) }.firstOrNull { it != null }\n    }\n\n    override suspend fun resolveFiles(path: String): Flow<AbsoluteFile> {\n        if (path.isBlank()) throw IllegalArgumentException(\"path cannot be blank.\")\n        if (!FileSystem.isLegal(path)) return emptyFlow()\n        if (path[0] == '/') return files.root.resolveFiles(path.removePrefix(\"/\"))\n        return files.fileSystem.findByPath(absolutePath.removeSuffix(\"/\") + \"/\" + path.removePrefix(\"/\"))\n            .filter { it.isFile }\n            .map {\n                it.toMockAbsFile(files)\n            }.asFlow()\n    }\n\n    @JavaFriendlyAPI\n    override suspend fun resolveFilesStream(path: String): Stream<AbsoluteFile> {\n        if (path.isBlank()) throw IllegalArgumentException(\"path cannot be blank.\")\n        if (!FileSystem.isLegal(path)) return Stream.empty()\n        if (path[0] == '/') return files.root.resolveFilesStream(path.removePrefix(\"/\"))\n        if (path.contains(\"/\")) return resolveFolder(path.substringBefore(\"/\"))?.resolveFilesStream(\n            path.substringAfter(\n                \"/\"\n            )\n        ) ?: Stream.empty()\n        return files.fileSystem.findByPath(absolutePath).map {\n            it.toMockAbsFile(files)\n        }.asStream()\n    }\n\n    override suspend fun resolveAll(path: String): Flow<AbsoluteFileFolder> {\n        if (path.isBlank()) throw IllegalArgumentException(\"path cannot be blank.\")\n        FileSystem.checkLegitimacy(path)\n        val p = if (path.startsWith(\"/\")) path\n        else \"${absolutePath.removeSuffix(\"/\")}/$path\"\n        return files.fileSystem.findByPath(p).map {\n            if (it.isDirectory) it.toMockAbsFolder(files)\n            else it.toMockAbsFile(files)\n        }.asFlow()\n    }\n\n    @JavaFriendlyAPI\n    override suspend fun resolveAllStream(path: String): Stream<AbsoluteFileFolder> {\n        if (path.isBlank()) throw IllegalArgumentException(\"path cannot be blank.\")\n        FileSystem.checkLegitimacy(path)\n        val p = if (path.startsWith(\"/\")) path\n        else \"${absolutePath.removeSuffix(\"/\")}/$path\"\n        return files.fileSystem.findByPath(p).map {\n            if (it.isDirectory) it.toMockAbsFolder(files)\n            else it.toMockAbsFile(files)\n        }.asStream()\n    }\n\n    override suspend fun uploadNewFile(\n        filepath: String, content: ExternalResource, callback: ProgressionCallback<AbsoluteFile, Long>?\n    ): AbsoluteFile {\n        contact.safeCast<MockGroup>()?.let check@{ group ->\n            if (group.controlPane.isAllowMemberFileUploading) return@check\n            if (group.botPermission.isOperator()) return@check\n            throw PermissionDeniedException(\"Group $group not allowed members to uploading new files.\")\n        }\n\n        FileSystem.checkLegitimacy(filepath)\n        val folderName = filepath.removePrefix(\"/\").substringBeforeLast(\"/\")\n        val folder =\n            if (folderName == \"\") files.root\n            else if (filepath.removePrefix(\"/\").contains(\"/\")) resolveFolder(folderName) ?: createFolder(folderName)\n            else this\n        val f = files.fileSystem.resolveById(folder.id)!!\n            .uploadFile(filepath.substringAfterLast(\"/\"), content, 0L)\n        return f.toMockAbsFile(files, content.md5, content.sha1)\n\n    }\n\n    override suspend fun exists(): Boolean = _exists\n\n    private fun canModify(resolved: MockServerRemoteFile): Boolean {\n        return MockRemoteFile.canModify(resolved, contact)\n    }\n\n    override suspend fun renameTo(newName: String): Boolean {\n        val resolved = files.fileSystem.resolveById(id) ?: return false\n        if (!canModify(resolved)) return false\n        if (resolved.rename(newName)) {\n            refresh()\n            return true\n        }\n        return false\n    }\n\n    override suspend fun delete(): Boolean {\n        if (!_exists) return false\n        val resolved = files.fileSystem.resolveById(id) ?: return false\n        if (!canModify(resolved)) return false\n        if (resolved.delete()) {\n            _exists = false\n            return true\n        }\n        return false\n    }\n\n    override suspend fun refresh(): Boolean {\n        val new = refreshed() ?: let {\n            _exists = false\n            return false\n        }\n        this.name = new.name\n        this.lastModifiedTime = new.lastModifiedTime\n        this.contentsCount = new.contentsCount\n        this.absolutePath = new.absolutePath\n        return false\n    }\n\n    override fun toString(): String = \"MockAbsoluteFolder(id=$id,absolutePath=$absolutePath,name=$name\"\n    override fun equals(other: Any?): Boolean =\n        other != null && other is AbsoluteFolder && other.id == id\n\n    override fun hashCode(): Int {\n        // from AbsoluteFolderImpl\n        var result = super.hashCode()\n        result = 31 * result + contentsCount.hashCode()\n        return result\n    }\n}"
  },
  {
    "path": "mirai-core-mock/src/internal/remotefile/absolutefile/MockRemoteFiles.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"ClassName\")\n\npackage net.mamoe.mirai.mock.internal.remotefile.absolutefile\n\nimport net.mamoe.mirai.contact.FileSupported\nimport net.mamoe.mirai.contact.file.AbsoluteFolder\nimport net.mamoe.mirai.contact.file.RemoteFiles\nimport net.mamoe.mirai.mock.resserver.MockServerFileSystem\n\ninternal class MockRemoteFiles(\n    override val contact: FileSupported,\n    val fileSystem: MockServerFileSystem,\n) : RemoteFiles {\n    override val root: AbsoluteFolder = MRF_AbsoluteFolderRoot(this)\n}\n\ninternal class MRF_AbsoluteFolderRoot(files: MockRemoteFiles) : MockAbsoluteFolder(files) {\n    override var contentsCount: Int\n        get() = 0\n        set(_) {}\n\n    override suspend fun refreshed(): AbsoluteFolder = MRF_AbsoluteFolderRoot(files)\n    override val parent: AbsoluteFolder? get() = null\n    override val id: String get() = \"/\"\n    override var name: String\n        get() = \"/\"\n        set(_) {}\n    override var absolutePath: String\n        get() = \"/\"\n        set(_) {}\n    override val isFile: Boolean get() = false\n    override val isFolder: Boolean get() = true\n    override val uploadTime: Long get() = 0\n    override var lastModifiedTime: Long\n        get() = 0\n        set(_) {}\n    override val uploaderId: Long get() = 0\n    override suspend fun exists(): Boolean = true\n    override suspend fun renameTo(newName: String): Boolean = false\n    override suspend fun delete(): Boolean = false\n    override suspend fun refresh(): Boolean = true\n}\n"
  },
  {
    "path": "mirai-core-mock/src/internal/remotefile/remotefile/MockRemoteFile.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"DEPRECATION\", \"DEPRECATION_ERROR\", \"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n\npackage net.mamoe.mirai.mock.internal.remotefile.remotefile\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.asFlow\nimport net.mamoe.mirai.contact.Contact\nimport net.mamoe.mirai.contact.FileSupported\nimport net.mamoe.mirai.contact.PermissionDeniedException\nimport net.mamoe.mirai.contact.isOperator\nimport net.mamoe.mirai.internal.message.data.FileMessageImpl\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.FileMessage\nimport net.mamoe.mirai.mock.contact.MockGroup\nimport net.mamoe.mirai.mock.resserver.MockServerFileSystem\nimport net.mamoe.mirai.mock.resserver.MockServerRemoteFile\nimport net.mamoe.mirai.mock.utils.mock\nimport net.mamoe.mirai.utils.*\nimport kotlin.io.path.inputStream\n\ninternal class RootRemoteFile(\n    val fileSystem: MockServerFileSystem,\n    override val contact: FileSupported,\n) : RemoteFile {\n    override val name: String get() = \"\"\n    override val id: String get() = \"/\"\n    override val path: String get() = \"/\"\n    override val parent: RemoteFile get() = this\n\n    override suspend fun isFile(): Boolean = false\n    override suspend fun length(): Long = 0\n    override suspend fun getInfo(): RemoteFile.FileInfo = fileSystem.root.fileInfo.let { inf ->\n        RemoteFile.FileInfo(\n            name = \"/\",\n            path = \"/\",\n            id = \"/\",\n            length = 0,\n            downloadTimes = 0,\n            uploaderId = inf.creator,\n            uploadTime = inf.createTime,\n            lastModifyTime = inf.lastUpdateTime,\n            sha1 = byteArrayOf(),\n            md5 = byteArrayOf(),\n        )\n    }\n\n    override suspend fun exists(): Boolean = true\n    override fun toString(): String = \"MockRemoteFile[ROOT, contact=$contact]\"\n\n    override fun resolve(relative: String): RemoteFile {\n        if (relative.isEmpty()) return this\n\n        val fixedPath = when {\n            relative[0] == '/' -> relative\n            else -> \"/$relative\"\n        }.let { ist ->\n            var end = ist.length\n            while (end > 1 && ist[end - 1] == '/') {\n                end--\n            }\n            ist.substring(0, end)\n        }\n\n        if (fixedPath == \"/\" || fixedPath == \".\") return this\n\n        val fixedName = fixedPath.substringAfterLast('/')\n\n        return MockRemoteFile(\n            root = this,\n            parent = resolve(fixedPath.substring(0, fixedPath.lastIndexOf('/'))),\n            path = fixedPath,\n            fileId = null,\n            name = fixedName,\n        )\n    }\n\n    override fun resolve(relative: RemoteFile): RemoteFile = resolve(relative.path)\n\n    override suspend fun resolveById(id: String, deep: Boolean): RemoteFile? {\n        if (id == \"/\") return this\n        val resolved = fileSystem.resolveById(id) ?: return null\n        return convert(resolved)\n    }\n\n    internal fun convert(src: MockServerRemoteFile): RemoteFile {\n        if (src == fileSystem.root) return this\n        return MockRemoteFile(\n            name = src.name,\n            root = this,\n            path = src.path,\n            fileId = src.id,\n            parent = convert(src.parent)\n        )\n    }\n\n    override fun resolveSibling(relative: String): RemoteFile = resolve(relative)\n    override fun resolveSibling(relative: RemoteFile): RemoteFile = resolveSibling(relative.path)\n\n    override suspend fun delete(): Boolean = false\n    override suspend fun renameTo(name: String): Boolean = false\n    override suspend fun moveTo(target: RemoteFile): Boolean = false\n    override suspend fun mkdir(): Boolean = true\n\n    private fun listFilesSeq(): Sequence<RemoteFile> {\n        return fileSystem.root.listFiles()!!.map { convert(it) }\n    }\n\n    override suspend fun listFiles(): Flow<RemoteFile> = listFilesSeq().asFlow()\n\n    @JavaFriendlyAPI\n    override suspend fun listFilesIterator(lazy: Boolean): Iterator<RemoteFile> {\n        return listFilesSeq().iterator()\n    }\n\n    override suspend fun toMessage(): FileMessage? = null\n\n    @Deprecated(\n        \"Use uploadAndSend instead.\",\n        replaceWith = ReplaceWith(\"this.uploadAndSend(resource, callback)\"),\n        level = DeprecationLevel.ERROR\n    )\n    override suspend fun upload(resource: ExternalResource, callback: RemoteFile.ProgressionCallback?): FileMessage {\n        error(\"Uploading as root directory\")\n    }\n\n    @MiraiExperimentalApi\n    override suspend fun uploadAndSend(resource: ExternalResource): MessageReceipt<Contact> {\n        error(\"Uploading as root directory\")\n    }\n\n    override suspend fun getDownloadInfo(): RemoteFile.DownloadInfo? = null\n\n    fun resolveTx(f: RemoteFile?): MockServerRemoteFile? {\n        if (f === this) return fileSystem.root\n        return f.cast<MockRemoteFile>().resolveFile()\n    }\n}\n\n@Suppress(\"DuplicatedCode\")\ninternal class MockRemoteFile(\n    val root: RootRemoteFile,\n    override val parent: RemoteFile,\n    override val path: String,\n    val fileId: String?,\n    override val name: String,\n) : RemoteFile {\n    override val id: String? get() = fileId\n    override val contact: FileSupported get() = root.contact\n    private val fileSystem get() = root.fileSystem\n    internal fun resolveFile(): MockServerRemoteFile? {\n        fileId?.let { fid ->\n            fileSystem.resolveById(fid)?.let { return it }\n        }\n        return fileSystem.findByPath(path).firstOrNull()\n    }\n\n    private fun convert(src: MockServerRemoteFile): RemoteFile = root.convert(src)\n\n    override suspend fun isFile(): Boolean {\n        return resolveFile()?.isFile ?: false\n    }\n\n    override suspend fun length(): Long {\n        val file = resolveFile() ?: return 0\n        return file.size\n    }\n\n    override suspend fun getInfo(): RemoteFile.FileInfo? {\n        val resolved = resolveFile() ?: return null\n        val fileInf = resolved.fileInfo\n        return RemoteFile.FileInfo(\n            name = resolved.name,\n            id = resolved.id,\n            path = resolved.path,\n            length = resolved.size,\n            downloadTimes = if (resolved.isFile) 1 else 0,\n            uploaderId = fileInf.creator,\n            uploadTime = fileInf.createTime,\n            lastModifyTime = fileInf.lastUpdateTime,\n            sha1 = if (resolved.isDirectory) {\n                byteArrayOf()\n            } else {\n                resolved.resolveNativePath().inputStream().use { it.sha1() }\n            },\n            md5 = if (resolved.isDirectory) {\n                byteArrayOf()\n            } else {\n                resolved.resolveNativePath().inputStream().use { it.md5() }\n            },\n        )\n    }\n\n    override suspend fun exists(): Boolean = resolveFile() != null\n\n    override fun toString(): String {\n        val resolved = resolveFile()\n        return \"MockFile[c=$contact, resolved=$resolved]\"\n    }\n\n    override fun resolve(relative: String): RemoteFile {\n        if (relative == \"/\" || relative == \"\" || relative[0] == '/') {\n            return root.resolve(relative)\n        }\n        return root.resolve(\"$path/$relative\")\n    }\n\n    override fun resolve(relative: RemoteFile): RemoteFile = resolve(relative.path)\n\n    override suspend fun resolveById(id: String, deep: Boolean): RemoteFile? {\n        val resolved = fileSystem.resolveById(id) ?: return null\n        if (deep) return convert(resolved)\n        val thiz = resolveFile()\n        if (resolved.parent == thiz) return convert(resolved)\n        return null\n    }\n\n    override fun resolveSibling(relative: String): RemoteFile {\n        return parent.resolve(relative)\n    }\n\n    override fun resolveSibling(relative: RemoteFile): RemoteFile {\n        return parent.resolve(relative)\n    }\n\n    override suspend fun delete(): Boolean {\n        val resolved = resolveFile() ?: return false\n        if (!canModify(resolved, contact)) return false\n        return resolved.delete()\n    }\n\n    override suspend fun renameTo(name: String): Boolean {\n        val resolved = resolveFile() ?: return false\n\n        if (!canModify(resolved, contact)) return false\n\n        return resolved.rename(name)\n    }\n\n    override suspend fun moveTo(target: RemoteFile): Boolean {\n        val resolved = resolveFile() ?: return false\n\n        if (!canModify(resolved, contact)) return false\n\n        val targetF = root.resolveTx(target.parent) ?: return false\n        resolved.moveTo(targetF)\n        resolved.rename(target.name)\n        return true\n    }\n\n    override suspend fun mkdir(): Boolean {\n        contact.safeCast<MockGroup>()?.let check@{ group ->\n            if (group.botPermission.isOperator()) return@check\n            return false\n        }\n        if (resolveFile() != null) return false\n        val dirx = root.resolveTx(parent) ?: return false\n        return kotlin.runCatching {\n            dirx.mksubdir(name, contact.bot.id)\n        }.isSuccess\n    }\n\n    private fun listFilesSeq(): Sequence<RemoteFile> {\n        val resolved = resolveFile()?.listFiles() ?: return emptySequence()\n        return resolved.map { convert(it) }\n    }\n\n    override suspend fun listFiles(): Flow<RemoteFile> {\n        return listFilesSeq().asFlow()\n    }\n\n    @JavaFriendlyAPI\n    override suspend fun listFilesIterator(lazy: Boolean): Iterator<RemoteFile> {\n        return listFilesSeq().iterator()\n    }\n\n    override suspend fun toMessage(): FileMessage? {\n        val resolved = resolveFile() ?: return null\n        return FileMessageImpl(\n            name = resolved.name,\n            id = resolved.id,\n            size = resolved.size,\n            busId = 1544241\n        )\n    }\n\n    @Suppress(\"DEPRECATION\", \"DEPRECATION_ERROR\", \"OVERRIDE_DEPRECATION\", \"OverridingDeprecatedMember\")\n    override suspend fun upload(resource: ExternalResource, callback: RemoteFile.ProgressionCallback?): FileMessage {\n        callback?.onBegin(this, resource)\n        try {\n            contact.safeCast<MockGroup>()?.let check@{ group ->\n                if (group.botPermission.isOperator()) return@check\n                if (group.controlPane.isAllowMemberFileUploading) return@check\n                throw PermissionDeniedException(\"Group $group disabled member file uploading...\")\n            }\n\n\n            val parent = root.resolveTx(this.parent) ?: throw IllegalStateException(\"Parent ${this.parent} not found.\")\n            val rsSize = resource.size\n            val rsp = parent.uploadFile(this.name, resource, contact.bot.id)\n            callback?.onProgression(this, resource, rsSize)\n            callback?.onSuccess(this, resource)\n            return FileMessageImpl(\n                name = rsp.name,\n                id = rsp.id,\n                size = rsp.size,\n                busId = 1544241\n            )\n        } catch (errx: Throwable) {\n            callback?.onFailure(this, resource, errx)\n            throw errx\n        }\n    }\n\n    @MiraiExperimentalApi\n    @Suppress(\"DEPRECATION_ERROR\", \"OverridingDeprecatedMember\")\n    override suspend fun uploadAndSend(resource: ExternalResource): MessageReceipt<Contact> {\n        return contact.sendMessage(upload(resource))\n    }\n\n    override suspend fun getDownloadInfo(): RemoteFile.DownloadInfo? {\n        val resolved = resolveFile() ?: return null\n        if (!resolved.isFile) return null\n        val ntp = resolved.resolveNativePath()\n        return RemoteFile.DownloadInfo(\n            filename = resolved.name,\n            id = resolved.id,\n            path = resolved.path,\n            sha1 = ntp.inputStream().use { it.sha1() },\n            md5 = ntp.inputStream().use { it.md5() },\n            url = contact.bot.mock().tmpResourceServer.resolveHttpUrlByPath(ntp).toString()\n        )\n    }\n\n    companion object {\n        internal fun canModify(resolved: MockServerRemoteFile, contact: FileSupported): Boolean {\n            contact.safeCast<MockGroup>()?.let check@{ group ->\n                if (group.botPermission.isOperator()) return true\n                if (resolved.isDirectory) return false\n\n                val finf = resolved.fileInfo\n                if (finf.creator == group.bot.id) return true\n\n                return false\n            }\n\n            return true\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core-mock/src/internal/serverfs/MockServerFileDiskImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n\npackage net.mamoe.mirai.mock.internal.serverfs\n\nimport net.mamoe.mirai.mock.resserver.MockServerFileDisk\nimport net.mamoe.mirai.mock.resserver.MockServerFileSystem\nimport net.mamoe.mirai.mock.resserver.MockServerRemoteFile\nimport net.mamoe.mirai.mock.resserver.TxRemoteFileInfo\nimport net.mamoe.mirai.utils.*\nimport java.io.InputStream\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport java.nio.file.attribute.FileTime\nimport java.util.*\nimport java.util.concurrent.ConcurrentLinkedDeque\nimport kotlin.io.path.*\nimport net.mamoe.mirai.internal.utils.FileSystem as MiraiFileSystem\n\nprivate fun allocateNewPath(base: Path): Path {\n    while (true) {\n        val p = base.resolve(UUID.randomUUID().toString())\n        if (!p.exists()) return p\n    }\n}\n\nprivate fun checkFileName(name: String) {\n    MiraiFileSystem.checkLegitimacy(name)\n    if (name.contains('/')) error(\"$name contains '/'\")\n    if (name.isEmpty()) error(\"Empty name\")\n}\n\ninternal class MockServerFileDiskImpl(\n    internal val storage: Path\n) : MockServerFileDisk {\n    internal val fs: MutableCollection<MockServerFileSystem> = ConcurrentLinkedDeque()\n\n    override val availableSystems: Sequence<MockServerFileSystem> = Sequence { fs.iterator() }\n\n    override fun newFsSystem(): MockServerFileSystem = MockServerFileSystemImpl(this)\n}\n\ninternal class MockServerFileSystemImpl(\n    override val disk: MockServerFileDiskImpl,\n) : MockServerFileSystem {\n    internal val storage: Path = allocateNewPath(disk.storage)\n\n    internal fun resolvePath(id: String): Path = when {\n        id.isEmpty() || id == \"/\" -> storage.resolve(\"root\")\n        id[0] == '/' -> storage.resolve(id.substring(1))\n        else -> error(\"file not exists: $id\")\n    }\n\n    internal fun fileDetails(id: String): Path? = when {\n        id.isEmpty() || id == \"/\" -> storage.resolve(\"details/root\")\n        id[0] == '/' -> {\n            storage\n                .resolve(\"details\")\n                .resolve(id.substring(1))\n        }\n\n        else -> null\n    }\n\n    internal fun resolveName(id: String): String = when {\n        id.isEmpty() || id == \"/\" -> \"\"\n        id[0] == '/' -> {\n            val nameMapping = fileDetails(id)?.resolve(\"name\")\n            if (nameMapping == null) null\n            else if (nameMapping.isFile) {\n                nameMapping.readText()\n            } else null\n        }\n\n        else -> null\n    } ?: id.substringAfterLast('/')\n\n    fun resolveParent(id: String): MockServerFileImpl {\n        val details = fileDetails(id) ?: return root\n        val parent = details.resolve(\"parent\")\n        if (parent.isFile) {\n            return resolveById(parent.readText()) ?: root\n        }\n        return root\n    }\n\n    init {\n        storage.mkdirs()\n        storage.resolve(\"details/root\").mkdirs()\n        storage.resolve(\"root\").mkdirs()\n        overrideDetails(fileDetails(\"/\")!!, name = \"\", creator = 0, createTime = 0)\n        disk.fs.add(this)\n    }\n\n    override val root = MockServerFileImpl(this, \"/\")\n\n    override fun resolveById(id: String): MockServerFileImpl? {\n        if (id == \"/\" || id.isEmpty()) return root\n        if (id[0] != '/') return null\n        if (MiraiFileSystem.isLegal(id) && id.count { it == '/' } == 1) {\n            return MockServerFileImpl(this, id).takeIf { it.toPath.exists() }\n        }\n        return null\n    }\n\n    override fun findByPath(path: String): Sequence<MockServerRemoteFile> {\n        return root.findByPath(\n            MiraiFileSystem.normalize(path)\n                .removePrefix(\"/\")\n                .split('/')\n                .toMutableList()\n        )\n    }\n\n    fun findDirByName(base: MockServerFileImpl, name: String): MockServerFileImpl? {\n        return (base.listFiles() ?: return null)\n            .filter { it.isDirectory }\n            .filter { it.name == name }\n            .firstOrNull()?.cast()\n    }\n\n    fun uploadFile(\n        name: String,\n        content: ExternalResource,\n        uploader: Long,\n        id: String,\n        toPath: Path\n    ): MockServerFileImpl {\n        val path = allocateNewPath(storage)\n        val fid = '/' + path.name\n\n        path.outputStream().buffered().use { output ->\n            content.inputStream().use { resource -> resource.copyTo(output) }\n        }\n\n        toPath.resolve(path.name).createFile()\n\n        val details = fileDetails(fid)!!\n        details.mkdirs()\n        overrideDetails(details, id, name, uploader, currentTimeMillis())\n\n        return MockServerFileImpl(this, fid)\n    }\n\n    fun overrideDetails(\n        details: Path,\n        parent: String? = null,\n        name: String? = null,\n        creator: Long = -1L,\n        createTime: Long = -1L,\n    ) {\n        if (parent != null) {\n            details.resolve(\"parent\").writeText(parent)\n        }\n        if (name != null) {\n            details.resolve(\"name\").writeText(name)\n        }\n        if (creator != -1L) {\n            details.resolve(\"creator\").writeBytes(creator.toByteArray())\n        }\n        if (createTime != -1L) {\n            details.resolve(\"createTime\").writeBytes(createTime.toByteArray())\n        }\n    }\n\n    fun mkdir(id: String, name: String, creator: Long, toPath: Path): MockServerFileImpl {\n        if (id != \"/\") error(\"Creating 2nd directories, MockServerFileSystem current not support\")\n\n        // Find existing subdir\n        Files.newDirectoryStream(toPath).use { ptdirstream ->\n            val exists = ptdirstream.firstOrNull { subfile ->\n                if (storage.resolve(subfile).isFile) return@firstOrNull false\n                val nameFile = storage.resolve(\"details\").resolve(subfile.fileName).resolve(\"name\")\n                return@firstOrNull nameFile.readText() == name\n            }\n            if (exists != null) {\n                return MockServerFileImpl(this, \"/\" + exists.fileName)\n            }\n        }\n\n        val path = allocateNewPath(storage)\n        val fid = '/' + path.name\n        path.mkdir()\n\n        toPath.resolve(path.name).createFile()\n        val details = fileDetails(fid)!!\n        details.mkdirs()\n        overrideDetails(details, id, name, creator, currentTimeMillis())\n\n        return MockServerFileImpl(this, fid)\n    }\n\n    fun resolveAbsPath(id: String): String {\n        if (id == \"/\") return \"/\"\n\n        val details = fileDetails(id) ?: return \"<not exists>\"\n        val fileNamePath = details.resolve(\"name\")\n        val fileName = fileNamePath.takeIf { it.isFile }?.readText() ?: \"<not exists>\"\n        val parentPath = details.resolve(\"parent\")\n        if (!parentPath.isFile) {\n            return fileName\n        }\n        val pid = parentPath.readText()\n        val pabs = resolveAbsPath(pid)\n        if (pabs.endsWith(\"/\")) return \"$pabs$fileName\"\n        return \"$pabs/$fileName\"\n    }\n}\n\ninternal class MockServerFileImpl(\n    override val system: MockServerFileSystemImpl,\n    override val id: String,\n) : MockServerRemoteFile {\n    internal val toPath: Path get() = system.resolvePath(id)\n    override val exists: Boolean get() = toPath.exists()\n    override val isFile: Boolean get() = toPath.isFile\n    override val isDirectory: Boolean get() = toPath.isDirectory()\n    override val name: String get() = system.resolveName(id)\n    override val path: String get() = system.resolveAbsPath(id)\n    override val parent: MockServerFileImpl get() = system.resolveParent(id)\n    override val size: Long\n        get() {\n            val pt = toPath\n            if (pt.isFile) return pt.fileSize()\n            return 0\n        }\n\n    override fun listFiles(): Sequence<MockServerRemoteFile>? {\n        val pt = toPath\n        if (!pt.isDirectory()) {\n            return null\n        }\n        return pt.listDirectoryEntries().asSequence().filter {\n            it.exists()\n        }.map { MockServerFileImpl(system, '/' + it.name) }\n    }\n\n    override fun delete(): Boolean {\n        if (!toPath.deleteIfExists()) return false\n        val details = system.fileDetails(id) ?: return false\n        system.resolvePath(details.resolve(\"parent\").readText())\n            .resolve(id.substring(1))\n            .deleteIfExists()\n        details.deleteRecursivelyMirai()\n        return true\n    }\n\n    override fun rename(name: String): Boolean {\n        checkFileName(name)\n        if (id.isEmpty() || id == \"/\") return false\n        val details = system.fileDetails(id) ?: return false\n        details.resolve(\"name\").writeText(name)\n        return true\n    }\n\n    override fun moveTo(path: MockServerRemoteFile) {\n        path.cast<MockServerFileImpl>()\n        if (path.system !== this.system) error(\"Cross file system moving\")\n\n        if (!path.isDirectory) error(\"Remote file $path not exists\")\n        if (id == \"/\") error(\"Moving root\")\n\n        // TODO: 移动到自己的子目录\n\n        val details = system.fileDetails(id) ?: error(\"Moving ghost file: $id\")\n\n        val currentParent = parent\n        currentParent.toPath.resolve(id.substring(1)).deleteIfExists()\n\n        details.resolve(\"parent\").writeText(path.id)\n        path.toPath.resolve(id.substring(1)).createFile()\n    }\n\n    override fun resolveNativePath(): Path {\n        val pt = toPath\n        if (!pt.isFile) error(\"file not exists: $this <$pt>\")\n        return pt\n    }\n\n    override fun asExternalResource(): ExternalResource {\n        val pt = toPath\n        if (!pt.isFile) error(\"file not exists: $pt\")\n        return object : AbstractExternalResource() {\n            override fun inputStream0(): InputStream {\n                return toPath.inputStream()\n            }\n\n            override val size: Long\n                get() = toPath.fileSize()\n        }\n    }\n\n    override fun uploadFile(name: String, content: ExternalResource, uploader: Long): MockServerFileImpl {\n        content.withAutoClose {\n            checkFileName(name)\n            val storage = toPath\n            if (storage.isFile) error(\"Uploading file to a file\")\n            if (!storage.isDirectory()) error(\"$this not exists\")\n\n            return system.uploadFile(name, content, uploader, id, toPath)\n        }\n    }\n\n    override fun mksubdir(name: String, creator: Long): MockServerRemoteFile {\n        checkFileName(name)\n        return system.mkdir(id, name, creator, toPath)\n    }\n\n    override var fileInfo: TxRemoteFileInfo\n        get() {\n            val details = system.fileDetails(id) ?: error(\"File not exists\")\n            if (!details.isDirectory()) {\n                error(\"File not exists\")\n            }\n            // parent, name, creator, createTime\n            return TxRemoteFileInfo(\n                creator = details.resolve(\"creator\").readBytes().toLong(),\n                createTime = details.resolve(\"createTime\").readBytes().toLong(),\n                lastUpdateTime = toPath.getLastModifiedTime().toMillis(),\n            )\n        }\n        set(value) {\n            val details = system.fileDetails(id) ?: error(\"File not exists\")\n            if (!details.isDirectory()) {\n                error(\"File not exists\")\n            }\n            details.resolve(\"creator\").writeBytes(value.creator.toByteArray())\n            details.resolve(\"createTime\").writeBytes(value.createTime.toByteArray())\n            toPath.setLastModifiedTime(FileTime.fromMillis(value.lastUpdateTime))\n        }\n\n    override fun toString(): String = \"$path := $id\"\n\n    override fun equals(other: Any?): Boolean {\n        if (other !is MockServerFileImpl) return false\n        if (other.system !== system) return false\n        return other.id == this.id\n    }\n\n    override fun hashCode(): Int {\n        return id.hashCode() + system.hashCode()\n    }\n\n    fun findByPath(path: MutableList<String>): Sequence<MockServerRemoteFile> {\n        if (path.isEmpty()) error(\"Empty path\")\n        val nxt = path.removeAt(0)\n        if (nxt.isEmpty()) error(\"Empty subpath\")\n        if (path.isEmpty()) return listFiles()?.filter { it.name == nxt } ?: emptySequence()\n\n        return system.findDirByName(this, nxt)?.findByPath(path) ?: emptySequence()\n    }\n}\n"
  },
  {
    "path": "mirai-core-mock/src/internal/serverfs/TmpResourceServerImpl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.internal.serverfs\n\nimport io.ktor.server.application.*\nimport io.ktor.server.engine.*\nimport io.ktor.server.netty.*\nimport io.ktor.server.plugins.*\nimport io.ktor.server.response.*\nimport net.mamoe.mirai.mock.resserver.MockServerFileDisk\nimport net.mamoe.mirai.mock.resserver.TmpResourceServer\nimport net.mamoe.mirai.utils.*\nimport java.net.ServerSocket\nimport java.net.URI\nimport java.net.URLDecoder\nimport java.net.URLEncoder\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport kotlin.io.path.*\n\ninternal class TmpResourceServerImpl(\n    override val storageRoot: Path,\n    private val serverPort: Int,\n    private val closeSystemOnShutdown: Boolean,\n) : TmpResourceServer {\n    var logger by lateinitMutableProperty {\n        MiraiLogger.Factory.create(TmpResourceServerImpl::class.java, \"TmpFsServer-${hashCode()}\")\n    }\n    lateinit var server: NettyApplicationEngine\n\n    private var _serverUri: URI by lateinitMutableProperty {\n        URI.create(\"http://localhost:$serverPort\")\n    }\n    override val serverUri: URI get() = _serverUri\n\n    override val mockServerFileDisk: MockServerFileDisk by lazy {\n        MockServerFileDiskImpl(storageRoot.resolve(\"tx-fs-disk\"))\n    }\n\n    private var _isActive: Boolean = false\n    override val isActive: Boolean get() = _isActive\n\n    private val storage: Path = storageRoot.resolve(\"storage\").mkdirsIfMissing()\n    private val images: Path = storageRoot.resolve(\"images\").mkdirsIfMissing()\n\n    override suspend fun uploadResource(resource: ExternalResource): String {\n        fun ByteArray.hex() = toUHexString(separator = \"\")\n\n        resource.useAutoClose {\n            val resourceId = \"${resource.size}-${resource.sha1.hex()}-${resource.md5.hex()}\"\n            val locPath = storage.resolve(resourceId)\n            if (locPath.isFile) return resourceId\n            runBIO {\n                locPath.outputStream().use { output ->\n                    resource.inputStream().use { it.copyTo(output) }\n                }\n            }\n            return resourceId\n        }\n    }\n\n    override fun isImageUploaded(md5: ByteArray, size: Long): Boolean {\n        val img = images.resolve(generateUUID(md5))\n        if (img.exists()) {\n            return Files.size(img) == size\n        }\n        return false\n    }\n\n\n    override suspend fun uploadResourceAsImage(resource: ExternalResource): URI {\n        val imgId = generateUUID(resource.md5)\n        val resId = uploadResource(resource)\n\n        val imgPath = images.resolve(imgId)\n        val storagePath = storage.resolve(resId).toAbsolutePath()\n\n        if (imgPath.exists()) {\n            return resolveImageUrl(imgId)\n        }\n\n        kotlin.runCatching {\n            imgPath.createLinkPointingTo(storagePath)\n        }.recoverCatchingSuppressed {\n            imgPath.createSymbolicLinkPointingTo(storagePath)\n        }.getOrThrow()\n\n        return resolveImageUrl(imgId)\n    }\n\n    override fun resolveHttpUrl(resourceId: String): URI {\n        return serverUri.resolve(\"storage/$resourceId\")\n    }\n\n    override fun resolveImageUrl(imgId: String): URI {\n        return serverUri.resolve(\"images/$imgId\")\n    }\n\n    override suspend fun invalidateResource(resourceId: String) {\n        storage.resolve(resourceId).deleteIfExists()\n    }\n\n    override fun resolveHttpUrlByPath(path: Path): URI {\n        if (path.fileSystem !== storageRoot.fileSystem)\n            throw UnsupportedOperationException(\"Cross file system linking is not supported now\")\n        val pt = path.toAbsolutePath().toString().replace('\\\\', '/')\n        return serverUri.resolve(\n            \"abs/\" + URLEncoder.encode(pt, \"UTF-8\")\n        )\n    }\n\n    override fun startupServer() {\n        val port = if (serverPort == 0) {\n            ServerSocket(0).use { it.localPort }\n        } else serverPort\n        _serverUri = URI.create(\"http://127.0.0.1:$port/\")\n        logger.info { \"Tmp Fs Server started: $serverUri\" }\n\n        val server = embeddedServer(Netty, environment = applicationEngineEnvironment {\n            connector {\n                this.host = \"127.0.0.1\"\n                this.port = port\n            }\n            module {\n                @Suppress(\"BlockingMethodInNonBlockingContext\")\n                intercept(ApplicationCallPipeline.Call) {\n                    val req = URI.create(call.request.origin.uri).path.removePrefix(\"/\")\n                    val targetPath = if (req.startsWith(\"abs/\")) {\n                        storageRoot.fileSystem.getPath(URLDecoder.decode(req.substring(4), \"UTF-8\"))\n                    } else {\n                        storageRoot.resolve(req)\n                    }\n                    if (targetPath.exists()) {\n                        call.respondOutputStream {\n                            net.mamoe.mirai.utils.runBIO {\n                                targetPath.inputStream().buffered().use { it.copyTo(this@respondOutputStream) }\n                            }\n                        }\n                        return@intercept\n                    }\n                    if (req.startsWith(\"images/\")) {\n                        call.respondRedirect(\n                            \"http://gchat.qpic.cn/gchatpic_new/1145141919/0-0-${\n                                req.substring(7)\n                            }/0?term=2\", false\n                        )\n                        return@intercept\n                    }\n                }\n            }\n        })\n        this.server = server\n        server.start(wait = false)\n    }\n\n    override fun close() {\n        if (this::server.isInitialized) {\n            server.stop(0, 0)\n        }\n        if (closeSystemOnShutdown) {\n            storageRoot.fileSystem.close()\n        }\n    }\n}\n\nprivate fun Path.mkdirsIfMissing(): Path {\n    if (!exists()) createDirectories()\n    return this\n}"
  },
  {
    "path": "mirai-core-mock/src/package.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock\n\n"
  },
  {
    "path": "mirai-core-mock/src/resserver/MockServerFileDisk.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.resserver\n\nimport net.mamoe.mirai.mock.internal.serverfs.MockServerFileDiskImpl\nimport java.nio.file.Path\n\npublic interface MockServerFileDisk {\n    public val availableSystems: Sequence<MockServerFileSystem>\n    public fun newFsSystem(): MockServerFileSystem\n\n    public companion object {\n        @JvmStatic\n        public fun newFileDisk(storage: Path): MockServerFileDisk {\n            return MockServerFileDiskImpl(storage)\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core-mock/src/resserver/MockServerFileSystem.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.resserver\n\npublic interface MockServerFileSystem {\n    public val disk: MockServerFileDisk\n    public val root: MockServerRemoteFile\n    public fun resolveById(id: String): MockServerRemoteFile?\n    public fun findByPath(path: String): Sequence<MockServerRemoteFile>\n}\n"
  },
  {
    "path": "mirai-core-mock/src/resserver/MockServerRemoteFile.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.resserver\n\nimport net.mamoe.mirai.utils.ExternalResource\nimport java.nio.file.Path\n\npublic interface MockServerRemoteFile {\n    public val system: MockServerFileSystem\n\n    public val isFile: Boolean\n    public val isDirectory: Boolean\n    public val name: String\n    public val path: String\n    public val id: String\n    public val exists: Boolean\n    public val parent: MockServerRemoteFile\n    public val size: Long\n\n    public fun listFiles(): Sequence<MockServerRemoteFile>?\n    public fun delete(): Boolean\n    public fun rename(name: String): Boolean\n\n    /**\n     * 移动文件\n     * @param path 目标目录\n     */\n    public fun moveTo(path: MockServerRemoteFile)\n\n    public fun asExternalResource(): ExternalResource\n    public fun resolveNativePath(): Path\n\n    public fun uploadFile(name: String, content: ExternalResource, uploader: Long): MockServerRemoteFile\n\n    public fun mksubdir(name: String, creator: Long): MockServerRemoteFile\n\n    public var fileInfo: TxRemoteFileInfo\n}\n\npublic data class TxRemoteFileInfo(\n    @JvmField var creator: Long,\n    @JvmField var createTime: Long,\n    @JvmField var lastUpdateTime: Long,\n)\n"
  },
  {
    "path": "mirai-core-mock/src/resserver/TmpResourceServer.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.resserver\n\nimport com.google.common.jimfs.Configuration\nimport com.google.common.jimfs.Jimfs\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.mock.MockBot\nimport net.mamoe.mirai.mock.internal.serverfs.TmpResourceServerImpl\nimport net.mamoe.mirai.utils.ExternalResource\nimport java.io.Closeable\nimport java.net.URI\nimport java.nio.file.Path\n\n/**\n * 临时资源中转服务器\n *\n * 此服务器用于中转测试中涉及到的各种临时数据, 如 图片、语音、群文件 等\n *\n * 如果 [TmpResourceServer] 被用于 [MockBot], 在 [MockBot] 关闭时也会同步关闭 [TmpResourceServer]\n *\n */\n@JvmBlockingBridge\npublic interface TmpResourceServer : Closeable {\n    public val serverUri: URI\n    public val storageRoot: Path\n    public val mockServerFileDisk: MockServerFileDisk\n    public val isActive: Boolean\n\n    /**\n     * 上传一个资源\n     *\n     * @return 资源 ID, 可通过 [resolveHttpUrl] 获得 http 链接\n     */\n    public suspend fun uploadResource(resource: ExternalResource): String\n\n    /**\n     * 上传图片\n     *\n     * @return 图片的 http 链接\n     */\n    public suspend fun uploadResourceAsImage(resource: ExternalResource): URI\n\n    /**\n     * 通过图片 md5 和 size 判断图片是否已经上传\n     */\n    public fun isImageUploaded(md5: ByteArray, size: Long): Boolean\n    public suspend fun uploadResourceAndGetUrl(resource: ExternalResource): String {\n        return resolveHttpUrl(uploadResource(resource)).toString()\n    }\n\n    public fun resolveHttpUrl(resourceId: String): URI\n    public fun resolveImageUrl(imgId: String): URI\n\n    /**\n     * 立即释放目标资源, 此后再次访问该资源 ([resourceId]) 时会得到 404 Not Found\n     */\n    public suspend fun invalidateResource(resourceId: String)\n\n    /**\n     * 获取一个对应 [path] 的 http 链接\n     */\n    public fun resolveHttpUrlByPath(path: Path): URI\n\n    /**\n     * 启动 Http Server.\n     *\n     * 如果 [TmpResourceServer] 被用于 [MockBot], [MockBot] 会自动启动服务器, 请不要自行启动\n     */\n    public fun startupServer()\n\n    public companion object {\n        @JvmStatic\n        public fun of(\n            path: Path,\n            port: Int = 0,\n            closeFileSystemWhenClose: Boolean = false,\n        ): TmpResourceServer {\n            return TmpResourceServerImpl(path, port, closeFileSystemWhenClose)\n        }\n\n        @JvmStatic\n        public fun newInMemoryTmpResourceServer(port: Int = 0): TmpResourceServer {\n            val fs = Jimfs.newFileSystem(\n                Configuration.unix()\n                    .toBuilder()\n                    .setWorkingDirectory(\"/\")\n                    .build()\n            )\n            return of(fs.getPath(\"/\"), port, true)\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core-mock/src/userprofile/UserProfileService.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.userprofile\n\nimport me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge\nimport net.mamoe.mirai.IMirai\nimport net.mamoe.mirai.data.UserProfile\nimport net.mamoe.mirai.mock.MockBot\nimport net.mamoe.mirai.mock.userprofile.MockUserProfileBuilder.Companion.invoke\nimport net.mamoe.mirai.utils.runBIO\nimport java.util.concurrent.ConcurrentHashMap\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\n\n/**\n * 用户资料服务, 用于 [IMirai.queryProfile] 查询用户资料\n *\n * implementation note: Java 请实现 [JUserProfileService]\n *\n * @see MockBot.userProfileService\n * @see MockUserProfileBuilder\n */\n@JvmBlockingBridge\npublic interface UserProfileService {\n    public suspend fun doQueryUserProfile(id: Long): UserProfile\n\n    /**\n     * 将 [id] 的用户资料指定为 [profile]\n     *\n     * implementation note:\n     *\n     * 框架内部并不会使用此接口, 该接口是设计于测试单元动态注册 [UserProfile],\n     * 如无调用此接口的需求可以实现为 `throw new UnsupportedOperationException()`\n     */\n    public suspend fun putUserProfile(id: Long, profile: UserProfile)\n\n    public companion object {\n        @JvmStatic\n        public fun getInstance(): UserProfileService {\n            return UserProfileServiceImpl()\n        }\n    }\n}\n\n/**\n * 用于资料服务, 用于 [IMirai.queryProfile] 查询用户资料\n *\n * 该接口是为了方便 Java 实现 [UserProfileService],\n * kotlin 请实现 [UserProfileService]\n */\n@Suppress(\"ILLEGAL_JVM_NAME\", \"INAPPLICABLE_JVM_NAME\")\npublic interface JUserProfileService : UserProfileService {\n    override suspend fun doQueryUserProfile(id: Long): UserProfile {\n        return runBIO {\n            doQueryUserProfileJ(id) ?: buildUserProfile { }\n        }\n    }\n\n    override suspend fun putUserProfile(id: Long, profile: UserProfile) {\n        runBIO {\n            putUserProfileJ(id, profile)\n        }\n    }\n\n    // override UserProfileService @JvmBlockingBridge\n    @JvmName(\"doQueryUserProfile\")\n    public fun doQueryUserProfileJ(id: Long): UserProfile?\n\n    @JvmName(\"putUserProfile\")\n    public fun putUserProfileJ(id: Long, profile: UserProfile)\n}\n\n/**\n * [UserProfile] 的构造器\n *\n * @see [invoke]\n * @see [buildUserProfile]\n */\npublic interface MockUserProfileBuilder {\n    public fun build(): UserProfile\n\n    public fun nickname(value: String): MockUserProfileBuilder\n    public fun email(value: String): MockUserProfileBuilder\n    public fun age(value: Int): MockUserProfileBuilder\n    public fun qLevel(value: Int): MockUserProfileBuilder\n    public fun sex(value: UserProfile.Sex): MockUserProfileBuilder\n    public fun sign(value: String): MockUserProfileBuilder\n    public fun friendGroupId(value: Int): MockUserProfileBuilder\n\n    public companion object {\n        @JvmStatic\n        @JvmName(\"newBuilder\")\n        public operator fun invoke(): MockUserProfileBuilder = MockUPBuilderImpl()\n    }\n}\n\n/**\n * 构造一个 [UserProfile]\n *\n * @see MockUserProfileBuilder\n */\npublic inline fun buildUserProfile(block: MockUserProfileBuilder.() -> Unit): UserProfile {\n    contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }\n    return MockUserProfileBuilder().apply(block).build()\n}\n\ninternal class MockUPBuilderImpl : MockUserProfileBuilder, UserProfile {\n    override var nickname: String = \"\"\n    override var email: String = \"\"\n    override var age: Int = -1\n    override var qLevel: Int = -1\n    override var sex: UserProfile.Sex = UserProfile.Sex.UNKNOWN\n    override var sign: String = \"\"\n    override var friendGroupId: Int = 0\n\n    // unmodifiable\n    override fun build(): UserProfile {\n        return object : UserProfile by this {}\n    }\n\n    override fun nickname(value: String): MockUserProfileBuilder = apply {\n        nickname = value\n    }\n\n    override fun email(value: String): MockUserProfileBuilder = apply {\n        email = value\n    }\n\n    override fun age(value: Int): MockUserProfileBuilder = apply {\n        age = value\n    }\n\n    override fun qLevel(value: Int): MockUserProfileBuilder = apply {\n        qLevel = value\n    }\n\n    override fun sex(value: UserProfile.Sex): MockUserProfileBuilder = apply {\n        sex = value\n    }\n\n    override fun sign(value: String): MockUserProfileBuilder = apply {\n        sign = value\n    }\n\n    override fun friendGroupId(value: Int): MockUserProfileBuilder = apply {\n        friendGroupId = value\n    }\n\n}\n\ninternal class UserProfileServiceImpl : UserProfileService {\n    val db = ConcurrentHashMap<Long, UserProfile>()\n    val def = buildUserProfile {\n    }\n\n    override suspend fun doQueryUserProfile(id: Long): UserProfile {\n        return db[id] ?: def\n    }\n\n    override suspend fun putUserProfile(id: Long, profile: UserProfile) {\n        db[id] = profile\n    }\n\n}\n"
  },
  {
    "path": "mirai-core-mock/src/userprofile/contactinfos.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.userprofile\n\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.data.*\nimport net.mamoe.mirai.utils.currentTimeSeconds\n\npublic interface MockUserInfoBuilder {\n    public fun uin(value: Long): MockUserInfoBuilder\n\n    public fun nick(value: String): MockUserInfoBuilder\n\n    public fun remark(value: String): MockUserInfoBuilder\n\n    public fun build(): UserInfo\n\n    public companion object {\n        @JvmStatic\n        @JvmName(\"builder\")\n        public operator fun invoke(): MockUserInfoBuilder = ThreeInOneInfoBuilder()\n\n        @JvmSynthetic\n        public inline fun create(action: MockUserInfoBuilder.() -> Unit): UserInfo = invoke().apply(action).build()\n    }\n}\n\npublic interface MockFriendInfoBuilder : MockUserInfoBuilder {\n    public override fun build(): FriendInfo\n\n    override fun uin(value: Long): MockFriendInfoBuilder\n\n    override fun nick(value: String): MockFriendInfoBuilder\n\n    override fun remark(value: String): MockFriendInfoBuilder\n\n    public fun friendGroupId(value: Int): MockFriendInfoBuilder\n\n    public companion object {\n        @JvmStatic\n        @JvmName(\"builder\")\n        public operator fun invoke(): MockFriendInfoBuilder = ThreeInOneInfoBuilder()\n\n        @JvmSynthetic\n        public inline fun create(action: MockFriendInfoBuilder.() -> Unit): FriendInfo = invoke().apply(action).build()\n    }\n}\n\npublic interface MockMemberInfoBuilder : MockUserInfoBuilder {\n    override fun build(): MemberInfo\n\n    public fun nameCard(value: String): MockMemberInfoBuilder\n\n    public fun specialTitle(value: String): MockMemberInfoBuilder\n\n    public fun anonymousId(value: String?): MockMemberInfoBuilder\n\n    public fun joinTimestamp(value: Int): MockMemberInfoBuilder\n\n    public fun lastSpeakTimestamp(value: Int): MockMemberInfoBuilder\n\n    public fun isOfficialBot(value: Boolean): MockMemberInfoBuilder\n\n    public fun rank(value: Int): MockMemberInfoBuilder\n\n    public fun temperature(value: Int): MockMemberInfoBuilder\n\n    public fun honors(value: Set<GroupHonorType>): MockMemberInfoBuilder\n\n    public fun point(value: Int): MockMemberInfoBuilder\n    public fun permission(value: MemberPermission): MockMemberInfoBuilder\n\n    override fun uin(value: Long): MockMemberInfoBuilder\n\n    override fun nick(value: String): MockMemberInfoBuilder\n\n    override fun remark(value: String): MockMemberInfoBuilder\n\n    public companion object {\n        @JvmStatic\n        @JvmName(\"builder\")\n        public operator fun invoke(): MockMemberInfoBuilder = ThreeInOneInfoBuilder()\n\n        @JvmSynthetic\n        public inline fun create(action: MockMemberInfoBuilder.() -> Unit): MemberInfo = invoke().apply(action).build()\n    }\n}\n\npublic interface MockStrangerInfoBuilder : MockUserInfoBuilder {\n    public fun fromGroup(value: Long): MockUserInfoBuilder\n\n    override fun uin(value: Long): MockUserInfoBuilder\n\n    override fun nick(value: String): MockUserInfoBuilder\n\n    override fun remark(value: String): MockUserInfoBuilder\n\n    override fun build(): StrangerInfo\n\n    public companion object {\n        @JvmStatic\n        @JvmName(\"builder\")\n        public operator fun invoke(): MockStrangerInfoBuilder = ThreeInOneInfoBuilder()\n\n\n        @JvmSynthetic\n        public inline fun create(action: MockStrangerInfoBuilder.() -> Unit): StrangerInfo =\n            invoke().apply(action).build()\n    }\n}\n\nprivate class ThreeInOneInfoBuilder :\n    MockUserInfoBuilder,\n    MockFriendInfoBuilder,\n    MockMemberInfoBuilder,\n    MockStrangerInfoBuilder,\n\n    UserInfo,\n    FriendInfo,\n    MemberInfo,\n    StrangerInfo {\n\n    override var nameCard: String = \"\"\n    override var permission: MemberPermission = MemberPermission.MEMBER\n    override var specialTitle: String = \"\"\n    override var muteTimestamp: Int = 0\n    override var joinTimestamp: Int = currentTimeSeconds().toInt()\n    override var lastSpeakTimestamp: Int = 0\n    override var isOfficialBot: Boolean = false\n    override var rank: Int = 0\n    override var point: Int = 0\n    override var honors: Set<GroupHonorType> = setOf()\n    override var temperature: Int = 0\n    override var fromGroup: Long = 0L\n    override var remark: String = \"\"\n    override var uin: Long = 0\n    override var nick: String = \"\"\n    override var anonymousId: String? = null\n    override var friendGroupId: Int = 0\n\n    override fun build(): ThreeInOneInfoBuilder = this\n\n    override fun nameCard(value: String): ThreeInOneInfoBuilder = apply { this.nameCard = value }\n    override fun specialTitle(value: String): ThreeInOneInfoBuilder = apply { this.specialTitle = value }\n    override fun anonymousId(value: String?): ThreeInOneInfoBuilder = apply { this.anonymousId = value }\n    override fun joinTimestamp(value: Int): ThreeInOneInfoBuilder = apply { this.joinTimestamp = value }\n    override fun lastSpeakTimestamp(value: Int): ThreeInOneInfoBuilder = apply { this.lastSpeakTimestamp = value }\n    override fun isOfficialBot(value: Boolean): ThreeInOneInfoBuilder = apply { this.isOfficialBot = value }\n    override fun fromGroup(value: Long): ThreeInOneInfoBuilder = apply { this.fromGroup = value }\n    override fun uin(value: Long): ThreeInOneInfoBuilder = apply { this.uin = value }\n    override fun nick(value: String): ThreeInOneInfoBuilder = apply { this.nick = value }\n    override fun remark(value: String): ThreeInOneInfoBuilder = apply { this.remark = value }\n    override fun rank(value: Int): MockMemberInfoBuilder = apply { this.rank = value }\n    override fun point(value: Int): MockMemberInfoBuilder = apply { this.point = value }\n    override fun temperature(value: Int): MockMemberInfoBuilder = apply { this.temperature = value }\n    override fun honors(value: Set<GroupHonorType>): MockMemberInfoBuilder = apply { this.honors = value }\n    override fun permission(value: MemberPermission): ThreeInOneInfoBuilder = apply { this.permission = value }\n    override fun friendGroupId(value: Int): ThreeInOneInfoBuilder = apply { this.friendGroupId = value }\n}\n"
  },
  {
    "path": "mirai-core-mock/src/utils/AvatarGenerator.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.utils\n\n/**\n * 头像生成器\n *\n * @since 2.14.0\n */\npublic interface AvatarGenerator {\n    public fun generateAvatarForPerson(id: Long): ByteArray = generateRandomAvatar()\n    public fun generateAvatarForGroup(id: Long): ByteArray = generateRandomAvatar()\n\n    public fun generateRandomAvatar(): ByteArray\n}\n"
  },
  {
    "path": "mirai-core-mock/src/utils/MemberInfo.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.utils\n\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.data.GroupHonorType\nimport net.mamoe.mirai.data.MemberInfo\n\npublic fun simpleMemberInfo(\n    uin: Long,\n    name: String,\n    nick: String = name,\n    nameCard: String = \"\",\n    remark: String = \"\",\n    permission: MemberPermission,\n    specialTitle: String = \"\",\n): MemberInfo {\n    return object : MemberInfo {\n        override val nameCard: String get() = nameCard\n        override val permission: MemberPermission get() = permission\n        override val specialTitle: String get() = specialTitle\n        override val muteTimestamp: Int get() = 0\n        override val joinTimestamp: Int get() = 0\n        override val lastSpeakTimestamp: Int get() = 0\n        override val isOfficialBot: Boolean get() = false\n        override val rank: Int\n            get() = 0\n        override val point: Int\n            get() = 0\n        override val honors: Set<GroupHonorType>\n            get() = setOf()\n        override val temperature: Int\n            get() = 0\n        override val uin: Long get() = uin\n        override val nick: String get() = nick\n        override val remark: String get() = remark\n    }\n}\n"
  },
  {
    "path": "mirai-core-mock/src/utils/MockActionsScope.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.utils\n\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.contact.User\nimport net.mamoe.mirai.event.events.MemberPermissionChangeEvent\nimport net.mamoe.mirai.event.events.MemberSpecialTitleChangeEvent\nimport net.mamoe.mirai.message.MessageReceipt\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.mock.MockActions\nimport net.mamoe.mirai.mock.contact.MockNormalMember\nimport net.mamoe.mirai.mock.contact.MockUser\nimport net.mamoe.mirai.mock.contact.MockUserOrBot\n\n/**\n * 广播一些模拟事件\n */\npublic inline fun broadcastMockEvents(action: MockActionsScope.() -> Unit) {\n    return MockActionsScopeInstance.action()\n}\n\n@PublishedApi\ninternal val MockActionsScopeInstance: MockActionsScope = object : MockActionsScope {}\n\n\npublic interface MockActionsScope { // use context receivers in the future\n    /**\n     * 修改 [MockUserOrBot.nick] 并广播相关事件 (如 [FriendNickChangedEvent])\n     */\n    @MockActionsDsl\n    public suspend infix fun MockUserOrBot.nickChangesTo(value: String) {\n        return MockActions.fireNickChanged(this, value)\n    }\n\n    /**\n     * 修改 [MockNormalMember.nameCard] 并广播 [MemberCardChangeEvent]\n     */\n    @MockActionsDsl\n    public suspend infix fun MockNormalMember.nameCardChangesTo(value: String) {\n        return MockActions.fireNameCardChanged(this, value)\n    }\n\n    /**\n     * 修改 [MockNormalMember.specialTitle] 并广播 [MemberSpecialTitleChangeEvent]\n     */\n    @MockActionsDsl\n    public suspend infix fun MockNormalMember.specialTitleChangesTo(value: String) {\n        return MockActions.fireSpecialTitleChanged(this, value)\n    }\n\n    /**\n     * 修改一名成员的权限并广播 [MemberPermissionChangeEvent]\n     */\n    @MockActionsDsl\n    public suspend infix fun MockNormalMember.permissionChangesTo(perm: MemberPermission) {\n        return MockActions.firePermissionChanged(this, perm)\n    }\n\n    /**\n     * 广播 [this] 被 [actor] 戳了的事件([NudgeEvent])\n     *\n     * - [actor] 戳了戳 [this] 的 XXXX\n     */\n    @MockActionsDsl\n    public suspend fun MockUserOrBot.nudgedBy(actor: MockUserOrBot, block: NudgeDsl.() -> Unit = {}) {\n        actor.nudged0(this, NudgeDsl().also(block))\n    }\n\n    /**\n     * 广播 [target] 被 [this] 戳了的事件([NudgeEvent])\n     *\n     * - [this] 戳了戳 [target] 的 XXXX\n     */\n    @MockActionsDsl\n    public suspend fun MockUserOrBot.nudges(target: MockUserOrBot, block: NudgeDsl.() -> Unit = {}) {\n        nudged0(target, NudgeDsl().also(block))\n    }\n\n    /**\n     * @see [MockUser.says]\n     */\n    @MockActionsDsl\n    public suspend infix fun MockUser.says(block: MessageChainBuilder.() -> Unit): MessageChain {\n        return says(buildMessageChain(block))\n    }\n\n    /**\n     * @see [MockUser.says]\n     */\n    @MockActionsDsl\n    public suspend infix fun MockUser.saysMessage(block: () -> Message): MessageChain {\n        // no contract because compiler error\n//        contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }\n        return says(block())\n    }\n\n    /**\n     * 令消息原作者撤回一条消息\n     */\n    @MockActionsDsl\n    public suspend fun MessageChain.recalledBySender() {\n        return MockActions.fireMessageRecalled(this, null)\n    }\n\n    /**\n     * 令消息原作者撤回一条消息\n     */\n    @MockActionsDsl\n    public suspend fun MessageSource.recalledBySender() {\n        return MockActions.fireMessageRecalled(this, null)\n    }\n\n    /**\n     * 令消息原作者撤回一条消息\n     */\n    @MockActionsDsl\n    public suspend fun MessageReceipt<*>.recalledBySender() {\n        this.source.recalledBy(null)\n    }\n\n    /**\n     * 令 [operator] 撤回一条消息\n     *\n     * @param operator 当 [operator] 为 null 时代表是发送者自己撤回\n     */\n    @MockActionsDsl\n    public suspend infix fun MessageChain.recalledBy(operator: User?) {\n        return MockActions.fireMessageRecalled(this, operator)\n    }\n\n    /**\n     * 令 [operator] 撤回一条消息\n     *\n     * @param operator 当 [operator] 为 null 时代表是发送者自己撤回\n     */\n    @MockActionsDsl\n    public suspend infix fun MessageSource.recalledBy(operator: User?) {\n        return MockActions.fireMessageRecalled(this, operator)\n    }\n\n    /**\n     * 令 [operator] 撤回一条消息\n     *\n     * @param operator 当 [operator] 为 null 时代表是发送者自己撤回\n     */\n    @MockActionsDsl\n    public suspend infix fun MessageReceipt<*>.recalledBy(operator: User?) {\n        this.source.recalledBy(operator)\n    }\n}"
  },
  {
    "path": "mirai-core-mock/src/utils/MockConversions.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmName(\"MockConversions\")\n\npackage net.mamoe.mirai.mock.utils\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.message.data.OnlineAudio\nimport net.mamoe.mirai.mock.MockBot\nimport net.mamoe.mirai.mock.MockBotDSL\nimport net.mamoe.mirai.mock.contact.*\nimport net.mamoe.mirai.utils.ExternalResource\nimport kotlin.contracts.contract\n\n\npublic fun Bot.mock(): MockBot {\n    contract { returns() implies (this@mock is MockBot) }\n    return this as MockBot\n}\n\npublic fun Group.mock(): MockGroup {\n    contract { returns() implies (this@mock is MockGroup) }\n    return this as MockGroup\n}\n\npublic fun NormalMember.mock(): MockNormalMember {\n    contract { returns() implies (this@mock is MockNormalMember) }\n    return this as MockNormalMember\n}\n\npublic fun Contact.mock(): MockContact {\n    contract { returns() implies (this@mock is MockContact) }\n    return this as MockContact\n}\n\npublic fun AnonymousMember.mock(): MockAnonymousMember {\n    contract { returns() implies (this@mock is MockAnonymousMember) }\n    return this as MockAnonymousMember\n}\n\npublic fun Friend.mock(): MockFriend {\n    contract { returns() implies (this@mock is MockFriend) }\n    return this as MockFriend\n}\n\npublic fun Member.mock(): MockMember {\n    contract { returns() implies (this@mock is MockMember) }\n    return this as MockMember\n}\n\npublic fun OtherClient.mock(): MockOtherClient {\n    contract { returns() implies (this@mock is MockOtherClient) }\n    return this as MockOtherClient\n}\n\npublic fun Stranger.mock(): MockStranger {\n    contract { returns() implies (this@mock is MockStranger) }\n    return this as MockStranger\n}\n\n/**\n * @see MockBot.uploadOnlineAudio\n */\n@MockBotDSL\npublic suspend fun ExternalResource.mockUploadAsOnlineAudio(bot: MockBot): OnlineAudio {\n    return bot.uploadOnlineAudio(this)\n}\n\n"
  },
  {
    "path": "mirai-core-mock/src/utils/NameGenerator.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.utils\n\nimport java.util.concurrent.atomic.AtomicInteger\n\n/**\n * 名称生成器\n *\n * 部分事件没有 `nick`, `name` 等相关的字段以确定名字,\n * [NameGenerator] 的作用就是在无法确定一个准确的名字的时候生成一个默认的名字\n */\npublic interface NameGenerator {\n    public fun nextGroupName(): String\n    public fun nextFriendName(): String\n\n    public companion object {\n        private val DEFAULT: NameGenerator = SimpleNameGenerator()\n\n        @JvmStatic\n        public fun getDefault(): NameGenerator = DEFAULT\n    }\n}\n\npublic open class SimpleNameGenerator : NameGenerator {\n    private val groupCounter = AtomicInteger(0)\n    private val friendCounter = AtomicInteger(0)\n\n    override fun nextGroupName(): String = \"Testing Group #\" + groupCounter.getAndIncrement()\n    override fun nextFriendName(): String = \"Testing Friend #\" + friendCounter.getAndIncrement()\n}\n"
  },
  {
    "path": "mirai-core-mock/src/utils/NudgeDsl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.utils\n\nimport net.mamoe.mirai.Bot\nimport net.mamoe.mirai.contact.*\nimport net.mamoe.mirai.event.broadcast\nimport net.mamoe.mirai.event.events.NudgeEvent\nimport net.mamoe.mirai.mock.contact.MockUserOrBot\nimport net.mamoe.mirai.utils.MiraiInternalApi\n\n/**\n * 构造 Nudge 的 DSL\n *\n * @see MockActionsScope.nudgedBy\n */\npublic class NudgeDsl {\n    @set:JvmSynthetic\n    public var action: String = \"戳了戳\"\n\n    @set:JvmSynthetic\n    public var suffix: String = \"\"\n\n    @MockActionsDsl\n    public fun action(value: String): NudgeDsl = apply { action = value }\n\n    @MockActionsDsl\n    public fun suffix(value: String): NudgeDsl = apply { suffix = value }\n}\n\n@OptIn(MiraiInternalApi::class)\n@PublishedApi\ninternal suspend fun MockUserOrBot.nudged0(target: MockUserOrBot, dsl: NudgeDsl) {\n\n    when {\n        this is Member && target is Member -> {\n            if (this.group != target.group)\n                error(\"Cross group nudging\")\n        }\n\n        this is AnonymousMember -> error(\"anonymous member can't starting a nudge action\")\n        target is AnonymousMember -> error(\"anonymous member is not nudgeable\")\n\n        this is Bot && target is Bot -> error(\"Not yet support bot nudging bot\")\n    }\n\n    val subject: Contact = when {\n        this is Member -> this.group\n        target is Member -> target.group\n\n        this is Friend -> this\n        target is Friend -> target\n\n        this is Stranger -> this\n        target is Stranger -> target\n\n        else -> error(\"Not yet support $target nudging $this\")\n    }\n\n    NudgeEvent(\n        from = this,\n        target = target,\n        subject = subject,\n        action = dsl.action,\n        suffix = dsl.suffix,\n    ).broadcast()\n\n}\n"
  },
  {
    "path": "mirai-core-mock/src/utils/event.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.utils\n\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.event.broadcast\n\n\npublic fun <T : Event> T.broadcastBlocking(): T = apply {\n    runBlocking { broadcast() }\n}\n"
  },
  {
    "path": "mirai-core-mock/src/utils/http.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MiraiUtils\")\n@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage net.mamoe.mirai.mock.utils\n\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\npublic fun String.plusHttpSubpath(subpath: String): String {\n\n    if (this[this.lastIndex] == '/') return this + subpath\n\n    return \"$this/$subpath\"\n}\n\n"
  },
  {
    "path": "mirai-core-mock/src/utils/image.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.utils\n\nimport net.mamoe.mirai.message.data.Image\n\nimport java.awt.Color\nimport java.awt.image.BufferedImage\nimport java.io.ByteArrayOutputStream\nimport javax.imageio.ImageIO\n\ninternal fun randomImage(): BufferedImage {\n    val width = (500..800).random()\n    val height = (500..800).random()\n    val image = BufferedImage(width, height, BufferedImage.TYPE_INT_RGB)\n    val graphics = image.createGraphics()\n    for (x in 0 until width) {\n        for (y in 0 until height) {\n            graphics.color = Color(\n                (0..0xFFFFFF).random()\n            )\n            graphics.drawRect(x, y, 1, 1)\n        }\n    }\n    graphics.dispose()\n    return image\n}\n\ninternal fun BufferedImage.saveToBytes(): ByteArray = ByteArrayOutputStream().apply {\n    ImageIO.write(this@saveToBytes, \"png\", this)\n}.toByteArray()\n\n\npublic fun Image.Key.randomImageContent(): ByteArray = randomImage().saveToBytes()\n"
  },
  {
    "path": "mirai-core-mock/src/utils/mockdsl.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n\npackage net.mamoe.mirai.mock.utils\n\n@DslMarker\npublic annotation class MockActionsDsl\n"
  },
  {
    "path": "mirai-core-mock/test/AbsoluteFileTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.test\n\nimport com.google.common.jimfs.Configuration\nimport com.google.common.jimfs.Jimfs\nimport kotlinx.coroutines.flow.count\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.flow.firstOrNull\nimport kotlinx.coroutines.flow.toList\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.event.events.GroupMessageEvent\nimport net.mamoe.mirai.message.data.FileMessage\nimport net.mamoe.mirai.mock.internal.contact.mockUploadAudio\nimport net.mamoe.mirai.mock.internal.remotefile.absolutefile.MockRemoteFiles\nimport net.mamoe.mirai.mock.internal.serverfs.MockServerFileSystemImpl\nimport net.mamoe.mirai.mock.utils.simpleMemberInfo\nimport net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource\nimport net.mamoe.mirai.utils.cast\nimport net.mamoe.mirai.utils.md5\nimport net.mamoe.mirai.utils.runBIO\nimport org.junit.jupiter.api.AfterEach\nimport org.junit.jupiter.api.Test\nimport java.nio.file.FileSystem\nimport kotlin.test.assertContentEquals\nimport kotlin.test.assertEquals\nimport kotlin.test.assertNotEquals\n\ninternal class AbsoluteFileTest : MockBotTestBase() {\n    private val tmpfs: FileSystem = Jimfs.newFileSystem(Configuration.unix())\n    private val disk = bot.tmpResourceServer.mockServerFileDisk\n    private val group = bot.addGroup(11L, \"a\").also { println(it.owner) }\n    private val fsys = MockServerFileSystemImpl(disk.cast())\n    private val files = MockRemoteFiles(group, fsys)\n\n    @AfterEach\n    internal fun release() {\n        tmpfs.close()\n    }\n\n    @Test\n    internal fun listFileAndFolder() = runTest {\n        val folder = files.root.createFolder(\"test1\")\n        files.root.createFolder(\"test2\")\n        val file = folder.uploadNewFile(\"test.txt\", \"cc\".toByteArray().toExternalResource().toAutoCloseable())\n        folder.uploadNewFile(\"test.txt\", \"cac\".toByteArray().toExternalResource().toAutoCloseable())\n        println(files.root.folders().toList())\n        println(files.root.resolveFolder(\"test1\")!!.files().toList())\n        assertEquals(2, files.root.folders().toList().size)\n        assertEquals(2, files.root.resolveFolder(\"test1\")!!.files().toList().size)\n        assertEquals(\"test.txt\", files.root.resolveFolder(\"test1\")!!.files().toList()[0].name)\n        assertEquals(\"test1\", files.root.resolveFolderById(folder.id)!!.name)\n        assertEquals(\"test.txt\", files.root.resolveFileById(file.id, true)!!.name)\n    }\n\n    @Test\n    internal fun testDeleteAndMoveTo() = runTest {\n        val f = files.root.createFolder(\"test\")\n        val ff = f.uploadNewFile(\"test.txt\", \"ccc\".toByteArray().toExternalResource())\n        val fff = files.root.resolveFileById(ff.id, true)!!\n        assertEquals(fff, ff)\n        f.renameTo(\"test2\")\n        assertEquals(\"test2\", files.root.folders().first().name)\n        fff.refresh()\n        assertEquals(f.absolutePath + \"/\" + fff.name, fff.absolutePath)\n        fff.moveTo(files.root)\n        assertEquals(\"/${fff.name}\", fff.absolutePath)\n        assertEquals(files.root, fff.parent)\n        fff.delete()\n        assertEquals(false, fff.exists())\n        assertEquals(null, files.root.resolveFileById(fff.id))\n    }\n\n    @Test\n    internal fun testSendAndDownload() = runTest {\n        val f = files.root.uploadNewFile(\"test.txt\", \"c\".toByteArray().toExternalResource())\n        println(files.fileSystem.findByPath(\"/test.txt\").first().path)\n        runAndReceiveEventBroadcast {\n            group.addMember(simpleMemberInfo(222, \"bb\", permission = MemberPermission.MEMBER))\n                .saysMessage { f.toMessage() }\n        }.let { events ->\n            assertEquals(1, events.size)\n            assertEquals(true, events[0].cast<GroupMessageEvent>().message.contains(FileMessage))\n        }\n        assertEquals(\"c\", f.getUrl()!!.toUrl().readText())\n    }\n\n    @Test\n    fun testRename() = runTest {\n        val folder = files.root.createFolder(\"test1\")\n        val file = folder.uploadNewFile(\"test.txt\", \"content\".toByteArray().toExternalResource().toAutoCloseable())\n        assertEquals(file.id, folder.resolveFiles(\"test.txt\").first().id)\n        folder.renameTo(\"test2\")\n        file.refresh()\n        assertEquals(true, file.exists())\n        assertNotEquals(null, folder.resolveFiles(\"test.txt\").firstOrNull())\n    }\n\n    @Test\n    fun testMD5() = runTest {\n        val bytes = \"test\".toByteArray()\n        val file = bytes.toExternalResource().use { res ->\n            files.root.uploadNewFile(\"/test.txt\", res)\n        }\n        assertContentEquals(bytes.md5(), file.md5)\n    }\n\n    @Test\n    fun testMD5WithResolve() = runTest {\n        val bytes = \"test\".toByteArray()\n        bytes.toExternalResource().use { res ->\n            files.root.uploadNewFile(\"/test.txt\", res)\n        }\n        val file = files.root.resolveFiles(\"/test.txt\").toList()\n        assertEquals(1, file.size)\n        assertContentEquals(bytes.md5(), file[0].md5)\n    }\n\n    @Test\n    fun testMD5WithIDResolve() = runTest {\n        val bytes = \"test\".toByteArray()\n        val absFile = bytes.toExternalResource().use { res ->\n            files.root.uploadNewFile(\"/test.txt\", res)\n        }\n        val file = files.root.resolveFileById(absFile.id, true)!!\n        assertContentEquals(bytes.md5(), file.md5)\n    }\n\n    @Test\n    fun testResolveFiles() = runTest {\n        val file = runBIO {\n            kotlin.io.path.createTempFile(\"test\", \".txt\").toFile().apply {\n                writeText(\"test\")\n                deleteOnExit()\n            }\n        }\n        file.toExternalResource().use {\n            group.files.root.uploadNewFile(\"/a/test.txt\", it)\n        }\n        assertEquals(0, group.files.root.resolveFiles(\"/a\").count())\n    }\n\n    @Test\n    @Suppress(\"INVISIBLE_REFERENCE\")\n    fun testMockUploadAudio() = runTest {\n        val file = runBIO {\n            kotlin.io.path.createTempFile(\"test\", \".txt\").toFile().apply {\n                writeText(\"test\")\n                deleteOnExit()\n            }\n        }\n\n        file.toExternalResource().use {\n            assertIsInstance<net.mamoe.mirai.internal.utils.ExternalResourceImplByFile>(it)\n            it.mockUploadAudio(bot)\n        }\n    }\n}"
  },
  {
    "path": "mirai-core-mock/test/DslTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.test\n\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.mock.MockActions\nimport net.mamoe.mirai.mock.MockBotFactory\nimport net.mamoe.mirai.mock.userprofile.MockMemberInfoBuilder\nimport net.mamoe.mirai.mock.utils.NudgeDsl\nimport net.mamoe.mirai.mock.utils.broadcastMockEvents\nimport net.mamoe.mirai.mock.utils.mockUploadAsOnlineAudio\nimport net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource\nimport java.io.File\n\n\n/*\n * This file only for showing MockDSL and how to use mock bot.\n * Not included in testing running\n */\n\n@Suppress(\"unused\")\ninternal suspend fun dslTest() {\n    val bot = MockBotFactory.newMockBotBuilder().create()\n\n    bot.addFriend(5, \"OhMyFriend\")\n\n    bot.addGroup(1, \"\").apply {\n        addMember(\n            MockMemberInfoBuilder.create {\n                uin(541)\n                nameCard(\"Dmo\")\n                permission(MemberPermission.OWNER)\n            }\n        )\n    }\n    bot.addGroup(7, \"\")\n        .appendMember(MockMemberInfoBuilder.create {  // Kotlin\n            uin(571)\n            nameCard(\"Hi\")\n            permission(MemberPermission.ADMINISTRATOR)\n        })\n        .appendMember(\n            MockMemberInfoBuilder.invoke() // Java, MockMemberInfoBuilder.builder() in java\n                .uin(1654441)\n                .nameCard(\"60\")\n                .permission(MemberPermission.MEMBER)\n                .specialTitle(\"ST\")\n                .build()\n        )\n\n\n    // 群成员 70 说了一句话\n    bot.getGroupOrFail(50).getOrFail(70).says(\"0\")\n\n    // 群成员 1 发了一条语音\n    bot.getGroupOrFail(1).getOrFail(1).says { // Kotlin\n        +File(\"helloworld.amr\").toExternalResource().toAutoCloseable().mockUploadAsOnlineAudio(bot)\n    }\n    /*\n    Java:\n    bot.getGroupOrFail(1).getOrFail(1).says(() -> {\n        return bot.uploadOnlineAudio(\n            ExternalResource.toExternalResource(new File(\"\")).toAutoCloseable()\n        );\n    });\n    */\n\n\n\n    broadcastMockEvents { // Required for kotlin\n\n        // 50 拍了拍 bot 的 sys32\n        bot.getGroupOrFail(5).getOrFail(50).nudges(bot) {\n            action(\"拍了拍\")\n            suffix(\"sys32\")\n        }\n        MockActions.fireNudge( // Java\n            bot.getGroupOrFail(5).getOrFail(50),\n            bot,\n            /*new*/ NudgeDsl().action(\"拍了拍\").suffix(\"sys32\")\n        )\n\n        // 1 拍了拍 bot 的 sys32\n        bot.nudgedBy(bot.getGroupOrFail(1).getOrFail(1)) {\n            action(\"拍了拍\")\n            suffix(\"sys32\")\n        }\n\n\n        // 群成员 2 修改了群名片\n        bot.getGroupOrFail(1).getOrFail(2) nameCardChangesTo \"Test\"\n        MockActions.fireNameCardChanged( // Java\n            bot.getGroupOrFail(1).getOrFail(2), \"Test\"\n        )\n\n        // 群成员 2 被群主修改了头衔\n        bot.getGroupOrFail(1).getOrFail(2) specialTitleChangesTo \"管埋员\"\n        MockActions.fireSpecialTitleChanged( // Java\n            bot.getGroupOrFail(1).getOrFail(2), \"管埋员\"\n        )\n\n        // 群主修改了群成员 2 的权限为 Administrator\n        bot.getGroupOrFail(1).getOrFail(2) permissionChangesTo MemberPermission.ADMINISTRATOR\n        MockActions.firePermissionChanged( // Java\n            bot.getGroupOrFail(1).getOrFail(2),\n            MemberPermission.ADMINISTRATOR\n        )\n\n        // 群主撤回了一条群员消息\n        bot.getGroupOrFail(1).owner.recallMessage( // Kotlin & Java\n            bot.getGroupOrFail(1).getOrFail(1) says { append(\"SB\") }\n        )\n    }\n\n    // 新的入群申请\n    bot.getGroupOrFail(50).broadcastNewMemberJoinRequestEvent(\n        requester = 3,\n        requesterName = \"Him188moe\",\n        message = \"Hi!\",\n    ).reject(message = \"Hello!\")\n\n    // 新的好友申请\n    bot.broadcastNewFriendRequestEvent(\n        requester = 1,\n        requesterNick = \"Karlatemp\",\n        fromGroup = 0,\n        message = \"さくらが落ちる\",\n    ).accept()\n\n    bot.broadcastNewFriendRequestEvent(9, \"\", 0, \"\").reject()\n}\n"
  },
  {
    "path": "mirai-core-mock/test/FsServerTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"DEPRECATION\", \"DEPRECATION_ERROR\")\n\npackage net.mamoe.mirai.mock.test\n\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.mirai.mock.resserver.TmpResourceServer\nimport net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource\nimport net.mamoe.mirai.utils.mkParentDirs\nimport org.junit.jupiter.api.Test\nimport kotlin.io.path.writeText\nimport kotlin.test.assertEquals\n\n@Suppress(\"RemoveExplicitTypeArguments\")\ninternal class FsServerTest {\n    @Test\n    fun testFsServer() = runBlocking<Unit> {\n        val fsServer = TmpResourceServer.newInMemoryTmpResourceServer()\n        fsServer.startupServer()\n        val testFile = \"Test\".toByteArray().toExternalResource()\n        val resourceId = fsServer.uploadResource(testFile)\n        val response = fsServer.resolveHttpUrl(resourceId).toURL().readText()\n        assertEquals(\"Test\", response)\n\n        val pt0 = fsServer.storageRoot.resolve(\"/rand/etc/randrand/somedata\")\n        pt0.mkParentDirs()\n        pt0.writeText(\"Test\")\n\n        assertEquals(\"Test\", fsServer.resolveHttpUrlByPath(pt0).toURL().readText())\n\n        fsServer.close()\n    }\n}\n"
  },
  {
    "path": "mirai-core-mock/test/ImageUploadTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.test\n\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.mirai.message.data.Image\nimport net.mamoe.mirai.message.data.Image.Key.isUploaded\nimport net.mamoe.mirai.message.data.Image.Key.queryUrl\nimport net.mamoe.mirai.mock.MockBotFactory\nimport net.mamoe.mirai.mock.utils.randomImageContent\nimport net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource\nimport net.mamoe.mirai.utils.getRandomByteArray\nimport org.junit.jupiter.api.AfterEach\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.TestInstance\nimport java.net.URL\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFalse\nimport kotlin.test.assertNotEquals\nimport kotlin.test.assertTrue\n\n@TestInstance(TestInstance.Lifecycle.PER_METHOD)\ninternal class ImageUploadTest {\n    internal val bot = MockBotFactory.newMockBotBuilder()\n        .id(1234567890)\n        .nick(\"Sakura\")\n        .create()\n\n    @AfterEach\n    internal fun botDestroy() {\n        bot.close()\n    }\n\n    @Test\n    fun testImageUpload() = runBlocking<Unit> {\n        val data = Image.randomImageContent()\n        val img = bot.asFriend.uploadImage(\n            data.toExternalResource().toAutoCloseable()\n        )\n        println(img.imageId)\n        assertTrue {\n            data.contentEquals(URL(img.queryUrl()).readBytes())\n        }\n        assertNotEquals(0, img.size)\n    }\n\n    @Test\n    fun testSameImageMultiUpload() = runBlocking<Unit> {\n        Image.randomImageContent().toExternalResource().use { imgData ->\n            val img1 = bot.asFriend.uploadImage(imgData)\n            val img2 = bot.asFriend.uploadImage(imgData)\n            assertEquals(img1, img2)\n        }\n    }\n\n    @Test\n    fun testImageIsUploaded(): Unit = runBlocking {\n        val img = Image.randomImageContent().toExternalResource().use { imgData ->\n            bot.asFriend.uploadImage(imgData)\n        }\n        assertTrue { img.isUploaded(bot) }\n    }\n\n    @Test\n    @Suppress(\"RemoveRedundantQualifierName\")\n    fun testImageIsUploadedNotTrue(): Unit = runBlocking {\n        assertFalse { Image.isUploaded(bot, getRandomByteArray(16), 10) }\n        val img = Image.randomImageContent().toExternalResource().use { imgData ->\n            bot.asFriend.uploadImage(imgData)\n        }\n        assertFalse { Image.isUploaded(bot, img.md5, img.size + 5) }\n    }\n}\n"
  },
  {
    "path": "mirai-core-mock/test/MockBotTestBase.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.test\n\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.event.GlobalEventChannel\nimport net.mamoe.mirai.message.data.MessageSource\nimport net.mamoe.mirai.mock.MockBotFactory\nimport net.mamoe.mirai.mock.database.queryMessageInfo\nimport net.mamoe.mirai.mock.internal.MockBotImpl\nimport net.mamoe.mirai.mock.utils.MockActionsScope\nimport net.mamoe.mirai.mock.utils.broadcastMockEvents\nimport org.junit.jupiter.api.AfterEach\nimport org.junit.jupiter.api.TestInstance\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.test.fail\n\n@TestInstance(TestInstance.Lifecycle.PER_METHOD)\ninternal open class MockBotTestBase : TestBase() {\n    internal val bot = MockBotFactory.newMockBotBuilder()\n        .id((100000000L..321111111L).random())\n        .nick(\"Kafusumi\")\n        .create()\n\n    @AfterEach\n    internal fun `$$bot dispose`() {\n        bot.close()\n    }\n\n    internal suspend fun runAndReceiveEventBroadcast(\n        action: suspend MockActionsScope.() -> Unit\n    ): List<Event> {\n\n        contract {\n            callsInPlace(action, InvocationKind.EXACTLY_ONCE)\n        }\n\n        val result = mutableListOf<Event>()\n        val listener = GlobalEventChannel.subscribeAlways<Event> {\n            result.add(this)\n        }\n\n        broadcastMockEvents {\n            action()\n        }\n\n        (bot as MockBotImpl).joinEventBroadcast()\n\n        listener.cancel()\n        return result\n    }\n\n\n    internal fun assertMessageNotAvailable(source: MessageSource) {\n        if (bot.msgDatabase.queryMessageInfo(source.ids, source.internalIds) != null) {\n            fail(\"Require message $source no longer available.\")\n        }\n    }\n\n    internal fun assertMessageAvailable(source: MessageSource) {\n        if (bot.msgDatabase.queryMessageInfo(source.ids, source.internalIds) == null) {\n            fail(\"Require message $source available.\")\n        }\n    }\n\n}"
  },
  {
    "path": "mirai-core-mock/test/MsgDbTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.test\n\nimport net.mamoe.mirai.message.data.MessageSourceKind\nimport net.mamoe.mirai.message.data.messageChainOf\nimport net.mamoe.mirai.mock.database.MessageDatabase\nimport net.mamoe.mirai.mock.database.MessageInfo\nimport net.mamoe.mirai.mock.database.mockMsgDatabaseId\nimport org.junit.jupiter.api.Test\nimport kotlin.random.Random\nimport kotlin.test.assertEquals\n\ninternal class MsgDbTest {\n    @Test\n    fun testIdConversion() {\n        repeat(50) {\n            val id1 = Random.nextInt()\n            val id2 = Random.nextInt()\n            val msgInfo = MessageInfo(\n                mixinedMsgId = mockMsgDatabaseId(id1, id2),\n                sender = 0, subject = 0, kind = MessageSourceKind.FRIEND, time = 0,\n                messageChainOf()\n            )\n            assertEquals(id1, msgInfo.id)\n            assertEquals(id2, msgInfo.internal)\n        }\n    }\n\n    @Test\n    fun testDatabase() {\n        val db = MessageDatabase.newDefaultDatabase()\n        db.connect()\n\n        repeat(90) {\n            val info = db.newMessageInfo(Random.nextLong(), Random.nextLong(), MessageSourceKind.FRIEND, 0, messageChainOf())\n            assertEquals(info, db.queryMessageInfo(info.mixinedMsgId))\n        }\n\n        db.disconnect()\n    }\n}\n"
  },
  {
    "path": "mirai-core-mock/test/TestBase.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.test\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.runBlocking\nimport net.mamoe.mirai.event.Event\nimport net.mamoe.mirai.event.events.MessageEvent\nimport net.mamoe.mirai.event.events.MessagePostSendEvent\nimport net.mamoe.mirai.event.events.MessagePreSendEvent\nimport org.junit.jupiter.api.DynamicContainer\nimport org.junit.jupiter.api.DynamicNode\nimport org.junit.jupiter.api.DynamicTest\nimport org.junit.jupiter.api.fail\nimport java.net.URL\nimport kotlin.reflect.jvm.jvmName\nimport kotlin.test.assertFails\n\ninternal open class TestBase {\n\n    internal inline fun <reified T> assertIsInstance(value: Any?, block: T.() -> Unit = {}) {\n        if (value !is T) {\n            fail { \"Actual value $value (${value?.javaClass}) is not instanceof ${T::class.jvmName}\" }\n        }\n        block(value)\n    }\n\n    internal fun runTest(action: suspend CoroutineScope.() -> Unit) {\n        runBlocking(block = action)\n    }\n\n    internal fun List<Event>.dropMessagePrePost() = filterNot {\n        it is MessagePreSendEvent || it is MessagePostSendEvent<*>\n    }\n\n    internal fun List<Event>.dropMsgChat() = filterNot {\n        it is MessageEvent || it is MessagePreSendEvent || it is MessagePostSendEvent<*>\n    }\n\n    internal fun String.toUrl(): URL = URL(this)\n\n    internal inline fun <T> T.runAndAssertFails(block: T.() -> Unit) {\n        assertFails { block() }\n    }\n\n    internal fun dynamicTest(displayName: String, action: suspend CoroutineScope.() -> Unit): DynamicTest {\n        return DynamicTest.dynamicTest(displayName) { runBlocking(block = action) }\n    }\n\n    internal fun dynamicContainer(\n        displayName: String,\n        action: suspend CoroutineScope.() -> Iterable<DynamicNode>\n    ): DynamicContainer {\n        return DynamicContainer.dynamicContainer(displayName, runBlocking(block = action))\n    }\n\n}"
  },
  {
    "path": "mirai-core-mock/test/TxFsDiskTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.test\n\nimport com.google.common.jimfs.Configuration\nimport com.google.common.jimfs.Jimfs\nimport net.mamoe.mirai.mock.resserver.MockServerFileDisk\nimport net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource\nimport org.junit.jupiter.api.AfterEach\nimport org.junit.jupiter.api.Test\nimport java.nio.file.Files\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFails\nimport kotlin.test.assertFalse\nimport kotlin.test.assertTrue\n\ninternal class TxFsDiskTest {\n    val tmpfs = Jimfs.newFileSystem(Configuration.unix())\n    val disk = MockServerFileDisk.newFileDisk(tmpfs.getPath(\"/disk\"))\n    private fun splitLine() = println(\"==================================================================\")\n\n    @AfterEach\n    fun release() {\n        println(\"===================[ FILE SYSTEM STRUCT DUMP ]========================\")\n        Files.walk(tmpfs.getPath(\"/\")).use { s ->\n            s.forEach { pt ->\n                println(pt)\n            }\n        }\n        println(\"===================[                         ]========================\")\n        tmpfs.close()\n    }\n\n    @Test\n    fun testDisk() {\n        val system = disk.newFsSystem()\n        val root = system.root\n        println(root)\n        println(root.fileInfo)\n\n        splitLine()\n\n        kotlin.run {\n            val subdir = root.mksubdir(\"a-dir\", 0)\n            println(subdir)\n            println(subdir.fileInfo)\n            assertEquals(\"/a-dir\", subdir.path)\n\n            assertFails { root.moveTo(subdir) }\n\n            val children = root.listFiles()!!.onEach { println(it) }.toList()\n            assertEquals(1, children.size)\n            assertEquals(subdir, children[0])\n            assertEquals(root, subdir.parent)\n\n            subdir.delete()\n            println(subdir)\n            assertFalse { subdir.exists }\n            assertFalse { subdir.isFile }\n            assertFalse { subdir.isDirectory }\n            assertTrue { subdir.toString().startsWith(\"<not exists>\") }\n            assertFails { subdir.fileInfo }\n        }\n\n        splitLine()\n\n        kotlin.run {\n            val newFile = root.uploadFile(\n                \"test.txt\",\n                \"\"\"A\"\"\".toByteArray().toExternalResource().toAutoCloseable(),\n                5\n            )\n            val newFileInfo = newFile.fileInfo\n            assertEquals(5, newFileInfo.creator)\n            assertEquals(root, newFile.parent)\n            assertEquals(\"test.txt\", newFile.name)\n            assertEquals(\"/test.txt\", newFile.path)\n\n            newFile.rename(\"hello world.bin\")\n            assertEquals(\"hello world.bin\", newFile.name)\n\n\n            val children = root.listFiles()!!.onEach { println(it) }.toList()\n            assertEquals(1, children.size)\n            assertEquals(children[0], newFile)\n\n            val subdir = root.mksubdir(\"1\", 3)\n            newFile.moveTo(subdir)\n            assertEquals(\"/1/hello world.bin\", newFile.path)\n\n            assertEquals(subdir, newFile.parent)\n\n            val children1 = subdir.listFiles()!!.toList()\n            assertEquals(1, children1.size)\n            assertEquals(newFile, children1[0])\n\n            val children2 = root.listFiles()!!.toList()\n            assertEquals(1, children2.size)\n            assertEquals(subdir, children2[0])\n\n\n            assertEquals(newFile, system.findByPath(\"/1/hello world.bin\").firstOrNull())\n\n            println(\"TEST SUB DIR: $subdir\")\n\n            // TODO: Download content\n        }\n\n    }\n\n}"
  },
  {
    "path": "mirai-core-mock/test/mock/MessageSerializationTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.test.mock\n\nimport kotlinx.serialization.*\nimport kotlinx.serialization.json.Json\nimport kotlinx.serialization.modules.EmptySerializersModule\nimport kotlinx.serialization.modules.plus\nimport net.mamoe.mirai.message.MessageSerializers\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.mock.test.MockBotTestBase\nimport net.mamoe.mirai.mock.utils.randomImageContent\nimport net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFalse\n\ninternal class MessageSerializationTest : MockBotTestBase() {\n    @Suppress(\"DEPRECATION_ERROR\")\n    private val module\n        get() = MessageSerializers.serializersModule\n    private val format\n        get() = Json {\n            serializersModule = module\n            useArrayPolymorphism = false\n            ignoreUnknownKeys = false\n        }\n\n    private inline fun <reified T : Any> T.serialize(serializer: KSerializer<T> = module.serializer()): String {\n        return format.encodeToString(serializer, this)\n    }\n\n    private inline fun <reified T : Any> String.deserialize(serializer: KSerializer<T> = module.serializer()): T {\n        return format.decodeFromString(serializer, this)\n    }\n\n    private inline fun <reified T : Any> testSerialization(t: T, serializer: KSerializer<T> = module.serializer()) {\n        val deserialized = kotlin.runCatching {\n            println(\"Testing ${t::class.simpleName} with serializer $serializer\")\n            val serialized = t.serialize(serializer)\n            println(\"Result: ${serializer.descriptor.serialName}  $serialized\")\n            serialized.deserialize(serializer)\n        }.getOrElse {\n            throw IllegalStateException(\"Failed to serialize $t\", it)\n        }\n\n        val msg = \"serialized string:   ${t.serialize(serializer)}\\ndeserialized string: ${\n            deserialized.serialize(\n                serializer\n            )\n        }\\n\"\n\n\n\n        assert1(\n            t,\n            deserialized,\n            msg\n        )\n\n        if (t is SingleMessage) {\n            PolymorphicWrapperContent(t)\n                .serialize(PolymorphicWrapperContent.serializer())\n                .deserialize(PolymorphicWrapperContent.serializer())\n                .let { assert1(t, it.message, msg) }\n        }\n    }\n\n    private fun assert1(t: Any, deserialized: Any, msg: String) {\n        if (deserialized is MessageSource && t is MessageSource) {\n            assertSource(t, deserialized, msg)\n            return\n        }\n\n        if (t is MessageChain && deserialized is MessageChain) {\n            assertEquals(t.size, deserialized.size)\n            val iter1 = t.iterator()\n            val iter2 = deserialized.iterator()\n\n            repeat(t.size) {\n                assert1(iter1.next(), iter2.next(), msg)\n            }\n            assertFalse(iter1.hasNext(), msg)\n            assertFalse(iter2.hasNext(), msg)\n            return\n        }\n\n        assertEquals(t, deserialized, msg)\n    }\n\n    private fun assertSource(t: MessageSource, deserialized: MessageSource, msg: String) {\n        assertEquals(t.kind, deserialized.kind, msg)\n        assertEquals(t.botId, deserialized.botId, msg)\n        assertEquals(t.fromId, deserialized.fromId, msg)\n        assertEquals(t.targetId, deserialized.targetId, msg)\n        assertEquals(t.time, deserialized.time, msg)\n        Assertions.assertArrayEquals(t.ids, deserialized.ids, msg)\n        Assertions.assertArrayEquals(t.internalIds, deserialized.internalIds, msg)\n        assertEquals(t.originalMessage, deserialized.originalMessage, msg)\n    }\n\n    @Test\n    fun testSerializersModulePlus() {\n        MessageSerializers.serializersModule + EmptySerializersModule()\n    }\n\n    @Test\n    fun testMockMessageSources() = runTest {\n        testSerialization(bot.addFriend(1, \"\").says(\"\"))\n        testSerialization(bot.addStranger(2, \"\").says(\"\"))\n        bot.addGroup(3, \"\").let { group ->\n            group.sendMessage(\"AWA\").source.let { testSerialization(messageChainOf(it)) }\n            group.addMember(6, \"\").says(\"A\").let { testSerialization(it) }\n        }\n    }\n\n    @Test\n    fun testMockResources() = runTest {\n        testSerialization(bot.uploadMockImage(Image.randomImageContent().toExternalResource().toAutoCloseable()))\n\n        \"1\".toByteArray().toExternalResource().use { data0 ->\n            testSerialization(bot.uploadOnlineAudio(data0))\n            testSerialization(bot.asFriend.uploadAudio(data0))\n        }\n    }\n\n    @Serializable\n    data class PolymorphicWrapperImage(\n        val message: @Polymorphic Image\n    )\n\n    @Serializable\n    data class PolymorphicWrapperContent(\n        val message: @Polymorphic SingleMessage\n    )\n\n    @Test\n    @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"UNRESOLVED_REFERENCE\")\n    fun `test serialization for MockImage`() = runTest {\n        val img = this@MessageSerializationTest.bot.uploadMockImage(\n            Image.randomImageContent().toExternalResource().toAutoCloseable()\n        )\n        PolymorphicWrapperImage(img)\n            .serialize(PolymorphicWrapperImage.serializer())\n            .also { println(it) }\n            .deserialize(PolymorphicWrapperImage.serializer())\n    }\n\n    // https://github.com/mamoe/mirai/pull/2414#issuecomment-1386253123\n    @Test\n    fun `test 2414-1386253123`() = runTest {\n        // event\n        val img = this@MessageSerializationTest.bot.uploadMockImage(\n            Image.randomImageContent().toExternalResource().toAutoCloseable()\n        )\n        val msg = buildMessageChain {\n            add(\"imgUploaded\")\n            add(img)\n        }\n\n        val s = format.encodeToString(msg)\n        println(s)\n        println(format.decodeFromString<MessageChain>(s))\n        testSerialization(msg)\n\n    }\n}\n"
  },
  {
    "path": "mirai-core-mock/test/mock/MessagingTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.test.mock\n\nimport kotlinx.coroutines.flow.toList\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.message.data.*\nimport net.mamoe.mirai.message.data.MessageSource.Key.recall\nimport net.mamoe.mirai.mock.MockActions.mockFireRecalled\nimport net.mamoe.mirai.mock.test.MockBotTestBase\nimport net.mamoe.mirai.mock.userprofile.MockMemberInfoBuilder\nimport net.mamoe.mirai.mock.utils.broadcastMockEvents\nimport net.mamoe.mirai.mock.utils.simpleMemberInfo\nimport org.junit.jupiter.api.DynamicNode\nimport org.junit.jupiter.api.Nested\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.TestFactory\nimport kotlin.test.*\n\ninternal class MessagingTest : MockBotTestBase() {\n\n    @Test\n    internal fun testMessageEventBroadcast() = runTest {\n        runAndReceiveEventBroadcast {\n            bot.addGroup(5597122, \"testing!\")\n                .addMember(simpleMemberInfo(5971, \"test\", permission = MemberPermission.OWNER))\n                .says(\"Hello World\")\n\n            bot.addFriend(9815, \"tester\").says(\"Msg By TestFriend\")\n\n            bot.addStranger(987166, \"sudo\").says(\"How are you\")\n\n            bot.getGroupOrFail(5597122).sendMessage(\"Testing message\")\n            bot.getFriendOrFail(9815).sendMessage(\"Hi my friend\")\n            bot.getStrangerOrFail(987166).sendMessage(\"How are you\")\n        }.let { events ->\n            assertEquals(9, events.size)\n\n            assertIsInstance<GroupMessageEvent>(events[0]) {\n                assertEquals(\"Hello World\", message.contentToString())\n                assertEquals(\"test\", senderName)\n                assertEquals(5971, sender.id)\n                assertEquals(5597122, group.id)\n                assertIsInstance<OnlineMessageSource.Incoming.FromGroup>(message.source)\n            }\n            assertIsInstance<FriendMessageEvent>(events[1]) {\n                assertEquals(\"Msg By TestFriend\", message.contentToString())\n                assertEquals(\"tester\", senderName)\n                assertEquals(9815, sender.id)\n                assertIsInstance<OnlineMessageSource.Incoming.FromFriend>(message.source)\n\n            }\n            assertIsInstance<StrangerMessageEvent>(events[2]) {\n                assertEquals(\"How are you\", message.contentToString())\n                assertEquals(\"sudo\", senderName)\n                assertEquals(987166, sender.id)\n                assertIsInstance<OnlineMessageSource.Incoming.FromStranger>(message.source)\n            }\n\n            assertIsInstance<GroupMessagePreSendEvent>(events[3])\n            assertIsInstance<GroupMessagePostSendEvent>(events[4]) {\n                assertIsInstance<OnlineMessageSource.Outgoing.ToGroup>(receipt!!.source)\n            }\n            assertIsInstance<FriendMessagePreSendEvent>(events[5])\n            assertIsInstance<FriendMessagePostSendEvent>(events[6]) {\n                assertIsInstance<OnlineMessageSource.Outgoing.ToFriend>(receipt!!.source)\n            }\n            assertIsInstance<StrangerMessagePreSendEvent>(events[7])\n            assertIsInstance<StrangerMessagePostSendEvent>(events[8]) {\n                assertIsInstance<OnlineMessageSource.Outgoing.ToStranger>(receipt!!.source)\n            }\n        }\n    }\n\n    @Test\n    internal fun testNudge() = runTest {\n        val group = bot.addGroup(1, \"1\")\n        val nudgeSender = group.addMember(simpleMemberInfo(3, \"3\", permission = MemberPermission.MEMBER))\n        val nudged = group.addMember(simpleMemberInfo(4, \"4\", permission = MemberPermission.MEMBER))\n\n        val myFriend = bot.addFriend(1, \"514\")\n        val myStranger = bot.addStranger(2, \"awef\")\n\n        runAndReceiveEventBroadcast {\n            nudged.nudgedBy(nudgeSender)\n            nudged.nudge().sendTo(group)\n            myFriend.nudges(bot)\n            myStranger.nudges(bot)\n            myFriend.nudgedBy(bot)\n            myStranger.nudgedBy(bot)\n        }.let { events ->\n            assertEquals(6, events.size)\n            assertIsInstance<NudgeEvent>(events[0]) {\n                assertSame(nudgeSender, this.from)\n                assertSame(nudged, this.target)\n                assertSame(group, this.subject)\n            }\n            assertIsInstance<NudgeEvent>(events[1]) {\n                assertSame(bot, this.from)\n                assertSame(nudged, this.target)\n                assertSame(group, this.subject)\n            }\n            assertIsInstance<NudgeEvent>(events[2]) {\n                assertSame(myFriend, this.from)\n                assertSame(bot, this.target)\n                assertSame(myFriend, this.subject)\n            }\n            assertIsInstance<NudgeEvent>(events[3]) {\n                assertSame(myStranger, this.from)\n                assertSame(bot, this.target)\n                assertSame(myStranger, this.subject)\n            }\n            assertIsInstance<NudgeEvent>(events[4]) {\n                assertSame(bot, this.from)\n                assertSame(myFriend, this.target)\n                assertSame(myFriend, this.subject)\n            }\n            assertIsInstance<NudgeEvent>(events[5]) {\n                assertSame(bot, this.from)\n                assertSame(myStranger, this.target)\n                assertSame(myStranger, this.subject)\n            }\n        }\n    }\n\n    @Test\n    internal fun testRoamingMessages() = runTest {\n        val mockFriend = bot.addFriend(1, \"1\")\n\n        val allSent = mutableListOf<MessageSource>()\n        fun MutableList<MessageSource>.add(msg: MessageChain) {\n            add(msg.source)\n        }\n\n        fun MutableList<MessageSource>.convertToOffline() {\n            replaceAll { src ->\n                bot.buildMessageSource(src.kind) { allFrom(src) }\n            }\n        }\n\n        broadcastMockEvents {\n            allSent.add(mockFriend says { append(\"Testing!\") })\n            allSent.add(mockFriend says { append(\"Test2!\") })\n        }\n        allSent.add(mockFriend.sendMessage(\"Pong!\").source)\n        allSent.convertToOffline()\n\n        mockFriend.roamingMessages.getAllMessages().toList().let { messages ->\n            assertEquals(3, messages.size)\n            assertEquals(messageChainOf(allSent[0] + PlainText(\"Testing!\")), messages[0])\n            assertEquals(messageChainOf(allSent[1] + PlainText(\"Test2!\")), messages[1])\n            assertEquals(messageChainOf(allSent[2] + PlainText(\"Pong!\")), messages[2])\n        }\n\n        allSent.clear()\n\n        val mockGroup = bot.addGroup(2, \"2\")\n        val mockGroupMember1 = mockGroup.addMember(123, \"123\")\n        val mockGroupMember2 = mockGroup.addMember(124, \"124\")\n        val mockGroupMember3 = mockGroup.addMember(125, \"125\")\n\n        broadcastMockEvents {\n            allSent.add(mockGroupMember1 says { append(\"msg1\") })\n            allSent.add(mockGroupMember2 says { append(\"msg2\") })\n            allSent.add(mockGroupMember3 says { append(\"msg3\") })\n        }\n        allSent.convertToOffline()\n\n        with(mockGroup.roamingMessages.getAllMessages().toList()) {\n            assertEquals(3, size)\n            assertEquals(messageChainOf(allSent[0] + PlainText(\"msg1\")), get(0))\n            assertEquals(messageChainOf(allSent[1] + PlainText(\"msg2\")), get(1))\n            assertEquals(messageChainOf(allSent[2] + PlainText(\"msg3\")), get(2))\n        }\n    }\n\n    @Test\n    internal fun testMessageRecallEventBroadcast() = runTest {\n        val group = bot.addGroup(8484846, \"g\")\n        val admin = group.addMember(simpleMemberInfo(945474, \"admin\", permission = MemberPermission.ADMINISTRATOR))\n        val sender = group.addMember(simpleMemberInfo(178711, \"usr\", permission = MemberPermission.MEMBER))\n\n        runAndReceiveEventBroadcast {\n            sender.says(\"Test\").recalledBySender()\n            sender.says(\"Admin recall\").recalledBy(admin)\n            mockFireRecalled(group.sendMessage(\"Hello world\"), admin)\n            sender.says(\"Hi\").recall()\n            admin.says(\"I'm admin\").let { resp ->\n                resp.recall()\n                assertFails { resp.recall() }.let(::println)\n            }\n        }.dropMsgChat().let { events ->\n            assertEquals(5, events.size)\n            assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {\n                assertSame(sender, operator)\n                assertSame(sender, author)\n            }\n            assertIsInstance<MessageRecallEvent.GroupRecall>(events[1]) {\n                assertSame(admin, operator)\n                assertSame(sender, author)\n            }\n            assertIsInstance<MessageRecallEvent.GroupRecall>(events[2]) {\n                assertSame(admin, operator)\n                assertSame(group.botAsMember, author)\n            }\n            assertIsInstance<MessageRecallEvent.GroupRecall>(events[3]) {\n                assertSame(null, operator)\n                assertSame(sender, author)\n            }\n            assertIsInstance<MessageRecallEvent.GroupRecall>(events[4]) {\n                assertSame(null, operator)\n                assertSame(admin, author)\n            }\n        }\n\n        val root = group.addMember(simpleMemberInfo(54986565, \"root\", permission = MemberPermission.OWNER))\n\n        runAndReceiveEventBroadcast {\n            sender.says(\"0\").runAndAssertFails { recall() }\n            admin.says(\"0\").runAndAssertFails { recall() }\n            root.says(\"0\").runAndAssertFails { recall() }\n            group.sendMessage(\"Hi\").recall()\n        }.dropMsgChat().let { events ->\n            assertEquals(1, events.size)\n            assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {\n                assertEquals(group.botAsMember, author)\n                assertEquals(null, operator)\n            }\n        }\n    }\n\n\n    @Suppress(\"ComplexRedundantLet\")\n    @Nested\n    internal inner class MessageRecalling {\n        @TestFactory\n        fun `friend messaging`(): Iterable<DynamicNode> {\n            val myFriend = bot.addFriend(1, \"f\")\n\n            return listOf<DynamicNode>(\n                dynamicTest(\"bot recalling\") {\n                    val msgBot = myFriend.sendMessage(\"2\")\n                    runAndReceiveEventBroadcast {\n                        msgBot.recall()\n                    }.let { events ->\n                        assertEquals(0, events.size)\n                    }\n                    assertMessageNotAvailable(msgBot.source)\n                },\n                dynamicTest(\"friend recalling\") {\n                    val msgFriend = myFriend.says(\"1\")\n                    runAndReceiveEventBroadcast {\n                        msgFriend.recalledBySender()\n                    }.let { events ->\n                        assertEquals(1, events.size)\n                        assertIsInstance<MessageRecallEvent.FriendRecall>(events[0]) {\n                            assertEquals(myFriend, this.operator)\n                            assertContentEquals(msgFriend.source.ids, this.messageIds)\n                            assertContentEquals(msgFriend.source.internalIds, this.messageInternalIds)\n                        }\n                        assertMessageNotAvailable(msgFriend.source)\n                    }\n                },\n                dynamicTest(\"bot recall friend msg failed\") {\n                    val msg = myFriend.says(\"1\")\n                    assertFails { msg.recall() }\n                    assertMessageAvailable(msg.source)\n                },\n            )\n        }\n\n        @TestFactory\n        fun `stranger messaging`(): Iterable<DynamicNode> {\n            val myStranger = bot.addStranger(2, \"s\")\n            return listOf<DynamicNode>(\n                dynamicTest(\"stranger recalling\") {\n                    val msg = myStranger.says(\"1\")\n                    runAndReceiveEventBroadcast {\n                        msg.recalledBySender()\n                    }.let { events ->\n                        assertEquals(0, events.size)\n                    }\n                    assertMessageNotAvailable(msg.source)\n                },\n                dynamicTest(\"bot recalling\") {\n                    val msg = myStranger.sendMessage(\"1\")\n                    runAndReceiveEventBroadcast {\n                        msg.recall()\n                    }.let { events ->\n                        assertEquals(0, events.size)\n                    }\n                    assertMessageNotAvailable(msg.source)\n                },\n                dynamicTest(\"bot recall stranger failed\") {\n                    val msg = myStranger.says(\"1\")\n                    assertFails { msg.recall() }\n                    assertMessageAvailable(msg.source)\n                },\n            )\n        }\n\n        @TestFactory\n        fun `group messaging`(): Iterable<DynamicNode> = listOf(\n            dynamicContainer(\"Normal messaging test\") {\n\n                val group = bot.addGroup(18451444229, \"owner group\")\n                group.addMember(MockMemberInfoBuilder.create {\n                    uin(184554).permission(MemberPermission.OWNER)\n                })\n                val administrator = group.addMember(MockMemberInfoBuilder.create {\n                    uin(184).permission(MemberPermission.ADMINISTRATOR)\n                })\n                val member = group.addMember(7777, \"wapeog\")\n\n                group.botAsMember.mockApi.permission = MemberPermission.MEMBER\n\n\n                return@dynamicContainer listOf<DynamicNode>(\n                    dynamicTest(\"member self recalling\") {\n                        val msg = member.says(\"1\")\n                        runAndReceiveEventBroadcast { msg.recalledBySender() }.let { events ->\n                            assertEquals(1, events.size)\n                            assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {\n                                assertSame(member, this.author)\n                                assertSame(member, operator)\n                                assertContentEquals(msg.source.ids, this.messageIds)\n                                assertContentEquals(msg.source.internalIds, this.messageInternalIds)\n                            }\n                        }\n                        assertMessageNotAvailable(msg.source)\n                    },\n\n                    dynamicTest(\"member msg recalled by others\") {\n                        val msg = member.says(\"1\")\n                        runAndReceiveEventBroadcast { msg.recalledBy(administrator) }.let { events ->\n                            assertEquals(1, events.size)\n                            assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {\n                                assertSame(member, this.author)\n                                assertSame(administrator, operator)\n                                assertContentEquals(msg.source.ids, this.messageIds)\n                                assertContentEquals(msg.source.internalIds, this.messageInternalIds)\n                            }\n                        }\n                        assertMessageNotAvailable(msg.source)\n                    },\n\n                    dynamicTest(\"member msg forced recalled by bot\") {\n                        val msg = member.says(\"1\")\n                        runAndReceiveEventBroadcast { msg.recalledBy(group.botAsMember) }.let { events ->\n                            assertEquals(1, events.size)\n                            assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {\n                                assertSame(member, this.author)\n                                assertSame(null, operator)\n                                assertContentEquals(msg.source.ids, this.messageIds)\n                                assertContentEquals(msg.source.internalIds, this.messageInternalIds)\n                            }\n                        }\n                        assertMessageNotAvailable(msg.source)\n                    },\n                )\n            },\n\n            dynamicContainer(\"bot is owner\") {\n                val group = bot.addGroup(8412, \"owner group\")\n                val administrator = group.addMember(MockMemberInfoBuilder.create {\n                    uin(184).permission(MemberPermission.ADMINISTRATOR)\n                })\n                val member = group.addMember(7777, \"wapeog\")\n\n                assertEquals(group.botPermission, MemberPermission.OWNER)\n\n\n                return@dynamicContainer listOf<DynamicNode>(\n                    dynamicTest(\"Bot can recall itself message\") {\n                        val msg = group.sendMessage(\"1\")\n                        runAndReceiveEventBroadcast { msg.recall() }.let { events ->\n                            assertEquals(1, events.size)\n                            assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {\n                                assertSame(group.botAsMember, this.author)\n                                assertSame(null, operator)\n                                assertContentEquals(msg.source.ids, this.messageIds)\n                                assertContentEquals(msg.source.internalIds, this.messageInternalIds)\n                            }\n                        }\n                        assertMessageNotAvailable(msg.source)\n                    },\n                    dynamicTest(\"Bot can recall administrator message\") {\n                        val msg = administrator.says(\"1\")\n                        runAndReceiveEventBroadcast { msg.recall() }.let { events ->\n                            assertEquals(1, events.size)\n                            assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {\n                                assertSame(administrator, this.author)\n                                assertSame(null, operator)\n                                assertContentEquals(msg.source.ids, this.messageIds)\n                                assertContentEquals(msg.source.internalIds, this.messageInternalIds)\n                            }\n                        }\n                        assertMessageNotAvailable(msg.source)\n                    },\n                    dynamicTest(\"Bot can recall member message\") {\n                        val msg = member.says(\"1\")\n                        runAndReceiveEventBroadcast { msg.recall() }.let { events ->\n                            assertEquals(1, events.size)\n                            assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {\n                                assertSame(member, this.author)\n                                assertSame(null, operator)\n                                assertContentEquals(msg.source.ids, this.messageIds)\n                                assertContentEquals(msg.source.internalIds, this.messageInternalIds)\n                            }\n                        }\n                        assertMessageNotAvailable(msg.source)\n                    },\n                )\n            },\n            dynamicContainer(\"bot is administrator\") {\n\n                val group = bot.addGroup(7517, \"owner group\")\n                val owner = group.addMember(MockMemberInfoBuilder.create {\n                    uin(96451).permission(MemberPermission.OWNER)\n                })\n                val administrator = group.addMember(MockMemberInfoBuilder.create {\n                    uin(184).permission(MemberPermission.ADMINISTRATOR)\n                })\n                val member = group.addMember(7777, \"wapeog\")\n\n                group.botAsMember.mockApi.permission = MemberPermission.ADMINISTRATOR\n\n\n\n                return@dynamicContainer listOf<DynamicNode>(\n                    dynamicTest(\"Bot can recall itself message\") {\n                        val msg = group.sendMessage(\"1\")\n                        runAndReceiveEventBroadcast { msg.recall() }.let { events ->\n                            assertEquals(1, events.size)\n                            assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {\n                                assertSame(group.botAsMember, this.author)\n                                assertSame(null, operator)\n                                assertContentEquals(msg.source.ids, this.messageIds)\n                                assertContentEquals(msg.source.internalIds, this.messageInternalIds)\n                            }\n                        }\n                        assertMessageNotAvailable(msg.source)\n                    },\n                    dynamicTest(\"Bot cannot recall owner message\") {\n                        val msg = owner.says(\"1\")\n                        assertFails { msg.recall() }\n                        assertMessageAvailable(msg.source)\n                    },\n                    dynamicTest(\"Bot cannot recall administrator message\") {\n                        val msg = administrator.says(\"1\")\n                        assertFails { msg.recall() }\n                        assertMessageAvailable(msg.source)\n                    },\n                    dynamicTest(\"Bot can recall member message\") {\n                        val msg = member.says(\"1\")\n                        runAndReceiveEventBroadcast { msg.recall() }.let { events ->\n                            assertEquals(1, events.size)\n                            assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {\n                                assertSame(member, this.author)\n                                assertSame(null, operator)\n                                assertContentEquals(msg.source.ids, this.messageIds)\n                                assertContentEquals(msg.source.internalIds, this.messageInternalIds)\n                            }\n                        }\n                        assertMessageNotAvailable(msg.source)\n                    },\n                )\n            },\n            dynamicContainer(\"bot is member\") {\n\n                val group = bot.addGroup(8441117, \"owner group\")\n                val owner = group.addMember(MockMemberInfoBuilder.create {\n                    uin(98171).permission(MemberPermission.OWNER)\n                })\n                val administrator = group.addMember(MockMemberInfoBuilder.create {\n                    uin(184).permission(MemberPermission.ADMINISTRATOR)\n                })\n                val member = group.addMember(7777, \"wapeog\")\n\n                group.botAsMember.mockApi.permission = MemberPermission.MEMBER\n\n\n                return@dynamicContainer listOf<DynamicNode>(\n                    dynamicTest(\"Bot can recall itself message\") {\n                        val msg = group.sendMessage(\"1\")\n                        runAndReceiveEventBroadcast { msg.recall() }.let { events ->\n                            assertEquals(1, events.size)\n                            assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {\n                                assertSame(group.botAsMember, this.author)\n                                assertSame(null, operator)\n                                assertContentEquals(msg.source.ids, this.messageIds)\n                                assertContentEquals(msg.source.internalIds, this.messageInternalIds)\n                            }\n                        }\n                        assertMessageNotAvailable(msg.source)\n                    },\n                    dynamicTest(\"Bot cannot recall owner message\") {\n                        val msg = owner.says(\"1\")\n                        assertFails { msg.recall() }\n                        assertMessageAvailable(msg.source)\n                    },\n                    dynamicTest(\"Bot cannot recall administrator message\") {\n                        val msg = administrator.says(\"1\")\n                        assertFails { msg.recall() }\n                        assertMessageAvailable(msg.source)\n                    },\n                    dynamicTest(\"Bot cannot recall member message\") {\n                        val msg = member.says(\"1\")\n                        assertFails { msg.recall() }\n                        assertMessageAvailable(msg.source)\n                    },\n                )\n            },\n        )\n\n    }\n}"
  },
  {
    "path": "mirai-core-mock/test/mock/MockBotBaseTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.test.mock\n\nimport net.mamoe.mirai.Mirai\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.event.events.MemberPermissionChangeEvent\nimport net.mamoe.mirai.mock.contact.MockNormalMember\nimport net.mamoe.mirai.mock.test.MockBotTestBase\nimport net.mamoe.mirai.mock.userprofile.buildUserProfile\nimport net.mamoe.mirai.mock.utils.simpleMemberInfo\nimport org.junit.jupiter.api.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertSame\nimport kotlin.test.assertTrue\n\ninternal class MockBotBaseTest : MockBotTestBase() {\n\n    @Test\n    internal fun testMockBotMocking() = runTest {\n        repeat(50) { i ->\n            bot.addFriend(20000L + i, \"usr$i\")\n            bot.addStranger(10000L + i, \"stranger$i\")\n            bot.addGroup(798100000L + i, \"group$i\")\n        }\n        assertEquals(50, bot.friends.size)\n        assertEquals(50, bot.strangers.size)\n        assertEquals(50, bot.groups.size)\n\n        repeat(50) { i ->\n            assertEquals(\"usr$i\", bot.getFriendOrFail(20000L + i).nick)\n            assertEquals(\"stranger$i\", bot.getStrangerOrFail(10000L + i).nick)\n\n            val group = bot.getGroupOrFail(798100000L + i)\n            assertEquals(\"group$i\", group.name)\n            assertSame(group.botAsMember, group.owner)\n            assertSame(MemberPermission.OWNER, group.botPermission)\n            assertEquals(0, group.members.size)\n        }\n\n        val mockGroup = bot.getGroupOrFail(798100000L)\n        repeat(50) { i ->\n            mockGroup.appendMember(simpleMemberInfo(3700000L + i, \"member$i\", permission = MemberPermission.MEMBER))\n        }\n        repeat(50) { i ->\n            val member = mockGroup.getOrFail(3700000L + i)\n            assertEquals(MemberPermission.MEMBER, member.permission)\n            assertEquals(\"member$i\", member.nick)\n            assertTrue(member.nameCard.isEmpty())\n            assertEquals(MemberPermission.OWNER, mockGroup.botPermission)\n        }\n\n        val newOwner: MockNormalMember\n        runAndReceiveEventBroadcast {\n            newOwner = mockGroup.addMember(simpleMemberInfo(84485417, \"root\", permission = MemberPermission.OWNER))\n        }.let { events ->\n            assertEquals(0, events.size)\n        }\n        assertEquals(MemberPermission.OWNER, newOwner.permission)\n        assertEquals(MemberPermission.MEMBER, mockGroup.botPermission)\n        assertSame(newOwner, mockGroup.owner)\n\n        val newNewOwner = mockGroup.getOrFail(3700000L)\n        runAndReceiveEventBroadcast {\n            mockGroup.changeOwner(newNewOwner)\n        }.let { events ->\n            assertEquals(2, events.size)\n            assertIsInstance<MemberPermissionChangeEvent>(events[0]) {\n                assertSame(newNewOwner, member)\n                assertSame(MemberPermission.OWNER, new)\n                assertSame(MemberPermission.MEMBER, origin)\n            }\n            assertIsInstance<MemberPermissionChangeEvent>(events[1]) {\n                assertSame(newOwner, member)\n                assertSame(MemberPermission.OWNER, origin)\n                assertSame(MemberPermission.MEMBER, new)\n            }\n        }\n        assertEquals(MemberPermission.OWNER, newNewOwner.permission)\n        assertEquals(MemberPermission.MEMBER, newOwner.permission)\n        assertEquals(MemberPermission.MEMBER, mockGroup.botPermission)\n        assertSame(newNewOwner, mockGroup.owner)\n    }\n\n    @Test\n    internal fun testQueryProfile() = runTest {\n        val service = bot.userProfileService\n        val profile = buildUserProfile {\n            nickname(\"Test0\")\n        }\n        service.putUserProfile(1, profile)\n        assertSame(profile, Mirai.queryProfile(bot, 1))\n    }\n\n}"
  },
  {
    "path": "mirai-core-mock/test/mock/MockBotEventTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.test.mock\n\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.mock.test.MockBotTestBase\nimport org.junit.jupiter.api.Test\nimport kotlin.test.assertEquals\n\ninternal class MockBotEventTest : MockBotTestBase() {\n    @Test\n    fun testBotOnlineEvent() = runTest {\n        runAndReceiveEventBroadcast {\n            bot.login()\n        }.let { events ->\n            assertEquals(1, events.size)\n            assertIsInstance<BotOnlineEvent>(events[0])\n        }\n    }\n\n    @Test\n    fun testBotOfflineEvent() = runTest {\n        runAndReceiveEventBroadcast {\n            bot.broadcastOfflineEvent()\n        }.let { events ->\n            assertEquals(1, events.size)\n            assertIsInstance<BotOfflineEvent>(events[0])\n        }\n    }\n\n    @Test\n    fun testBotRelogin() = runTest {\n        bot.login()\n        runAndReceiveEventBroadcast {\n            bot.login()\n        }.let { events ->\n            assertEquals(2, events.size)\n            assertIsInstance<BotOnlineEvent>(events[0])\n            assertIsInstance<BotReloginEvent>(events[1])\n        }\n    }\n\n    @Test\n    fun testMockAvatarChange() = runTest {\n        assertEquals(\"http://q.qlogo.cn/g?b=qq&nk=${bot.id}&s=640\", bot.avatarUrl)\n        runAndReceiveEventBroadcast {\n            bot.avatarUrl = \"http://localhost/test.png\"\n            assertEquals(\"http://localhost/test.png\", bot.avatarUrl)\n        }.let { events ->\n            assertEquals(1, events.size)\n            assertIsInstance<BotAvatarChangedEvent>(events[0])\n        }\n    }\n\n    @Test\n    fun testBotNickChangedEvent() = runTest {\n        runAndReceiveEventBroadcast {\n            bot.nickNoEvent = \"HiHi\"\n            bot.nick = \"AAAA\"\n            bot nickChangesTo \"BBBB\"\n        }.let { events ->\n            assertEquals(2, events.size)\n            assertIsInstance<BotNickChangedEvent>(events[0]) {\n                assertEquals(\"HiHi\", from)\n                assertEquals(\"AAAA\", to)\n            }\n            assertIsInstance<BotNickChangedEvent>(events[1]) {\n                assertEquals(\"AAAA\", from)\n                assertEquals(\"BBBB\", to)\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core-mock/test/mock/MockFriendGroupsTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.test.mock\n\nimport net.mamoe.mirai.mock.test.MockBotTestBase\nimport org.junit.jupiter.api.Test\nimport kotlin.test.assertEquals\n\ninternal class MockFriendGroupsTest : MockBotTestBase() {\n    @Test\n    internal fun testFriendGroupsDefaultEmpty() = runTest {\n        assertEquals(1, bot.friendGroups.asCollection().size)\n        assertEquals(bot.friendGroups.default, bot.friendGroups[0])\n        assertEquals(bot.friendGroups.default, bot.friendGroups.asCollection().iterator().next())\n    }\n\n    @Test\n    internal fun testFriendGroupCreating() = runTest {\n        val group = bot.friendGroups.create(\"Test\")\n        println(group.id)\n        assertEquals(2, bot.friendGroups.asCollection().size)\n        assertEquals(group, bot.friendGroups[group.id])\n    }\n\n    @Test\n    internal fun testFriendGroupReferences() = runTest {\n        val group = bot.friendGroups.create(\"Test\")\n\n        val friend = bot.addFriend(5, \"Test\")\n        assertEquals(bot.friendGroups.default, friend.friendGroup)\n        assertEquals(0, friend.mockApi.friendGroupId)\n\n        group.moveIn(friend)\n        assertEquals(group, friend.friendGroup)\n        assertEquals(group.id, friend.mockApi.friendGroupId)\n\n        group.delete()\n        assertEquals(bot.friendGroups.default, friend.friendGroup)\n\n        assertEquals(0, friend.mockApi.friendGroupId)\n    }\n}"
  },
  {
    "path": "mirai-core-mock/test/mock/MockFriendTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.test.mock\n\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.mock.internal.contact.MockImage\nimport net.mamoe.mirai.mock.test.MockBotTestBase\nimport net.mamoe.mirai.utils.cast\nimport org.junit.jupiter.api.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertNotEquals\nimport kotlin.test.assertSame\nimport kotlin.test.assertTrue\n\ninternal class MockFriendTest : MockBotTestBase() {\n\n    @Test\n    internal fun testNewFriendRequest() = runTest {\n        runAndReceiveEventBroadcast {\n            bot.broadcastNewFriendRequestEvent(\n                1, \"Hi\", 0, \"Hello!\"\n            ).reject()\n        }.let { events ->\n            assertEquals(1, events.size)\n            assertIsInstance<NewFriendRequestEvent>(events[0]) {\n                assertEquals(1, fromId)\n                assertEquals(\"Hi\", fromNick)\n                assertEquals(0, fromGroupId)\n                assertEquals(\"Hello!\", message)\n            }\n            assertEquals(bot.friends.size, 0)\n        }\n\n        runAndReceiveEventBroadcast {\n            bot.broadcastNewFriendRequestEvent(\n                1, \"Hi\", 0, \"Hello!\"\n            ).accept()\n        }.let { events ->\n            assertEquals(2, events.size, events.toString())\n            assertIsInstance<NewFriendRequestEvent>(events[0]) {\n                assertEquals(1, fromId)\n                assertEquals(\"Hi\", fromNick)\n                assertEquals(0, fromGroupId)\n                assertEquals(\"Hello!\", message)\n            }\n\n            assertIsInstance<FriendAddEvent>(events[1]) {\n                assertEquals(1, friend.id)\n                assertEquals(\"Hi\", friend.nick)\n                assertSame(friend, bot.getFriend(friend.id))\n            }\n\n            assertEquals(1, bot.friends.size)\n        }\n\n    }\n\n    @Test\n    fun testFriendAvatarChangedEvent() = runTest {\n        runAndReceiveEventBroadcast {\n            bot.addFriend(111, \"a\").changeAvatarUrl(MockImage.random(bot).getUrl(bot))\n            bot.addFriend(222, \"b\")\n        }.let { events ->\n            assertIsInstance<FriendAvatarChangedEvent>(events[0])\n            assertEquals(111, events[0].cast<FriendAvatarChangedEvent>().friend.id)\n            assertNotEquals(\"\", bot.getFriend(111)!!.avatarUrl)\n            assertNotEquals(\"\", bot.getFriend(222)!!.avatarUrl)\n            assertNotEquals(\"\", bot.getFriend(222)!!.avatarUrl.toUrl().readText())\n        }\n    }\n\n    @Test\n    fun testFriendRemarkChangeEvent() = runTest {\n        runAndReceiveEventBroadcast {\n            bot.addFriend(1, \"\").remark = \"Test\"\n        }.let { events ->\n            assertEquals(1, events.size)\n            assertIsInstance<FriendRemarkChangeEvent>(events[0]) {\n                assertEquals(1, this.friend.id)\n                assertEquals(\"\", oldRemark)\n                assertEquals(\"Test\", newRemark)\n            }\n        }\n    }\n\n    @Test\n    fun testFriendRequestAndAddEvent() = runTest {\n        runAndReceiveEventBroadcast {\n            bot.broadcastNewFriendRequestEvent(\n                1, \"Test\", 0, \"Hi\"\n            ).accept()\n            bot.broadcastNewFriendRequestEvent(\n                2, \"Hi\", 1, \"0\"\n            ).reject()\n        }.let { events ->\n            assertEquals(3, events.size)\n            assertIsInstance<NewFriendRequestEvent>(events[0]) {\n                assertEquals(1, fromId)\n                assertEquals(\"Test\", fromNick)\n                assertEquals(0, fromGroupId)\n                assertEquals(\"Hi\", message)\n            }\n            assertIsInstance<FriendAddEvent>(events[1]) {\n                assertEquals(1, friend.id)\n                assertEquals(\"Test\", friend.nick)\n            }\n            assertIsInstance<NewFriendRequestEvent>(events[2]) {\n                assertEquals(2, fromId)\n                assertEquals(\"Hi\", fromNick)\n                assertEquals(1, fromGroupId)\n                assertEquals(\"0\", message)\n            }\n        }\n    }\n\n    @Test\n    fun testFriendNickChangedEvent() = runTest {\n        runAndReceiveEventBroadcast {\n            bot.addFriend(0, \"Old\").nick = \"Test\"\n        }.let { events ->\n            assertEquals(1, events.size)\n            assertIsInstance<FriendNickChangedEvent>(events[0]) {\n                assertEquals(\"Old\", from)\n                assertEquals(\"Test\", to)\n            }\n        }\n    }\n\n    @Test\n    fun testFriendInputStatusChangedEvent() = runTest {\n        runAndReceiveEventBroadcast {\n            bot.addFriend(1, \"a\").broadcastFriendInputStateChange(true)\n        }.let { events ->\n            assertEquals(1, events.size)\n            assertIsInstance<FriendInputStatusChangedEvent>(events[0]) {\n                assertTrue(inputting)\n                assertSame(bot.getFriend(1), friend)\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "mirai-core-mock/test/mock/MockGroupTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.test.mock\n\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.toList\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.contact.announcement.AnnouncementParametersBuilder\nimport net.mamoe.mirai.contact.isBotMuted\nimport net.mamoe.mirai.data.GroupHonorType\nimport net.mamoe.mirai.event.events.*\nimport net.mamoe.mirai.message.data.FileMessage\nimport net.mamoe.mirai.mock.contact.announcement.MockOnlineAnnouncement\nimport net.mamoe.mirai.mock.test.MockBotTestBase\nimport net.mamoe.mirai.mock.userprofile.MockMemberInfoBuilder\nimport net.mamoe.mirai.mock.utils.simpleMemberInfo\nimport net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource\nimport net.mamoe.mirai.utils.cast\nimport org.junit.jupiter.api.Test\nimport kotlin.test.*\n\ninternal class MockGroupTest : MockBotTestBase() {\n    @Test\n    internal fun testMockGroupJoinRequest() = runTest {\n        val group = bot.addGroup(9875555515, \"test\")\n\n        runAndReceiveEventBroadcast {\n            group.broadcastNewMemberJoinRequestEvent(\n                100000000, \"demo\", \"msg\"\n            ).accept()\n        }.let { events ->\n            assertEquals(2, events.size)\n            assertIsInstance<MemberJoinRequestEvent>(events[0]) {\n                assertEquals(100000000, fromId)\n                assertEquals(\"demo\", fromNick)\n                assertEquals(\"msg\", message)\n            }\n            assertIsInstance<MemberJoinEvent>(events[1]) {\n                assertEquals(100000000, member.id)\n                assertEquals(\"demo\", member.nick)\n            }\n        }\n\n        val member = group.getOrFail(100000000)\n        assertEquals(MemberPermission.MEMBER, member.permission)\n    }\n\n    @Test\n    internal fun testMockBotJoinGroupRequest() = runTest {\n        val invitor = bot.addFriend(5710, \"demo\")\n        runAndReceiveEventBroadcast {\n            invitor.broadcastInviteBotJoinGroupRequestEvent(999999999, \"test\")\n                .accept()\n        }.let { events ->\n            assertEquals(2, events.size)\n            assertIsInstance<BotInvitedJoinGroupRequestEvent>(events[0]) {\n                assertEquals(5710, invitorId)\n                assertEquals(\"demo\", invitorNick)\n                assertEquals(999999999, groupId)\n                assertEquals(\"test\", groupName)\n            }\n            assertIsInstance<BotJoinGroupEvent>(events[1]) {\n                assertNotSame(group.botAsMember, group.owner)\n                assertEquals(MemberPermission.MEMBER, group.botPermission)\n                assertEquals(999999999, group.id)\n                assertEquals(MemberPermission.OWNER, group.owner.permission)\n            }\n        }\n    }\n\n    @Test\n    internal fun testGroupAnnouncements() = runTest {\n        val group = bot.addGroup(8484541, \"87\")\n        runAndReceiveEventBroadcast {\n            group.announcements.publish(\n                MockOnlineAnnouncement(\n                    content = \"dlroW olleH\",\n                    parameters = AnnouncementParametersBuilder().apply { this.sendToNewMember = true }.build(),\n                    senderId = 9711221,\n                    allConfirmed = false,\n                    confirmedMembersCount = 0,\n                    publicationTime = 0\n                )\n            )\n            group.announcements.publish(\n                MockOnlineAnnouncement(\n                    content = \"Hello World\",\n                    parameters = AnnouncementParametersBuilder().apply { this.sendToNewMember = true }.build(),\n                    senderId = 971121,\n                    allConfirmed = false,\n                    confirmedMembersCount = 0,\n                    publicationTime = 0\n                )\n            )\n        }.let { events ->\n            assertEquals(0, events.size)\n        }\n        val anc = group.announcements.asFlow().toList()\n        assertEquals(1, anc.size)\n        assertEquals(\"Hello World\", anc[0].content)\n        assertFalse(anc[0].fid.isEmpty())\n        assertEquals(anc[0], group.announcements.get(anc[0].fid))\n    }\n\n    @Test\n    internal fun testLeave() = runTest {\n        runAndReceiveEventBroadcast {\n            bot.addGroup(1, \"1\").quit()\n            bot.addFriend(2, \"2\").delete()\n            bot.addStranger(3, \"3\").delete()\n            bot.addGroup(4, \"4\")\n                .addMember(simpleMemberInfo(5, \"5\", permission = MemberPermission.MEMBER))\n                .broadcastMemberLeave()\n            bot.addGroup(6, \"6\")\n                .addMember(simpleMemberInfo(7, \"7\", permission = MemberPermission.OWNER))\n                .broadcastKickBot()\n        }.let { events ->\n            assertEquals(5, events.size)\n            assertIsInstance<BotLeaveEvent.Active>(events[0]) {\n                assertEquals(1, group.id)\n            }\n            assertIsInstance<FriendDeleteEvent>(events[1]) {\n                assertEquals(2, friend.id)\n            }\n            assertIsInstance<StrangerRelationChangeEvent.Deleted>(events[2]) {\n                assertEquals(3, stranger.id)\n            }\n            assertIsInstance<MemberLeaveEvent>(events[3]) {\n                assertEquals(4, group.id)\n                assertEquals(5, member.id)\n            }\n            assertIsInstance<BotLeaveEvent.Kick>(events[4]) {\n                assertEquals(6, group.id)\n                assertEquals(7, operator.id)\n            }\n        }\n    }\n\n    @Suppress(\"DEPRECATION\", \"DEPRECATION_ERROR\")\n    @Test\n    internal fun testGroupFileV1() = runTest {\n        val fsroot = bot.addGroup(5417, \"58aw\").filesRoot\n        fsroot.resolve(\"helloworld.txt\").uploadAndSend(\n            \"HelloWorld\".toByteArray().toExternalResource().toAutoCloseable()\n        )\n        assertEquals(1, fsroot.listFilesCollection().size)\n        assertEquals(\n            \"HelloWorld\",\n            fsroot.resolve(\"helloworld.txt\")\n                .getDownloadInfo()!!\n                .url.toUrl()\n                .also { println(\"Mock file url: $it\") }\n                .readText()\n        )\n        fsroot.resolve(\"helloworld.txt\").delete()\n        assertEquals(0, fsroot.listFilesCollection().size)\n    }\n\n    @Test\n    internal fun testGroupFileUpload() = runTest {\n        val files = bot.addGroup(111, \"aaa\").files\n        val file = files.uploadNewFile(\"aaa\", \"ccc\".toByteArray().toExternalResource().toAutoCloseable())\n        assertEquals(\"ccc\", file.getUrl()!!.toUrl().readText())\n        runAndReceiveEventBroadcast {\n            bot.getGroup(111)!!.addMember(simpleMemberInfo(222, \"bbb\", permission = MemberPermission.ADMINISTRATOR))\n                .says(file.toMessage())\n        }.let { events ->\n            assertTrue(events[0].cast<GroupMessageEvent>().message.contains(FileMessage))\n        }\n    }\n\n    @Test\n    internal fun testAvatar() = runTest {\n        assertNotEquals(\"\", bot.addGroup(111, \"aaa\").avatarUrl.toUrl().readText())\n    }\n\n    @Test\n    internal fun testBotLeaveGroup() = runTest {\n        runAndReceiveEventBroadcast {\n            bot.addGroup(1, \"A\").quit()\n            bot.addGroup(2, \"B\")\n                .addMember(MockMemberInfoBuilder.create {\n                    uin(3).nick(\"W\")\n                    permission(MemberPermission.ADMINISTRATOR)\n                }).broadcastKickBot()\n            // TODO: BotLeaveEvent.Disband\n        }.let { events ->\n            assertEquals(2, events.size)\n            assertIsInstance<BotLeaveEvent.Active>(events[0]) {\n                assertEquals(1, group.id)\n                assertEquals(\"A\", group.name)\n            }\n            assertIsInstance<BotLeaveEvent.Kick>(events[1]) {\n                assertEquals(2, group.id)\n                assertEquals(\"B\", group.name)\n                assertEquals(3, operator.id)\n                assertEquals(\"W\", operator.nick)\n            }\n            assertNull(bot.getGroup(1))\n            assertNull(bot.getGroup(2))\n        }\n    }\n\n    @Test\n    fun testBotGroupPermissionChangeEvent() = runTest {\n        runAndReceiveEventBroadcast {\n            bot.addGroup(1, \"\")\n                .appendMember(MockMemberInfoBuilder.create {\n                    uin(1).nick(\"o\")\n                    permission(MemberPermission.OWNER)\n                })\n                .botAsMember permissionChangesTo MemberPermission.ADMINISTRATOR\n\n            bot.addGroup(2, \"\")\n                .appendMember(MockMemberInfoBuilder.create {\n                    uin(1).nick(\"o\")\n                    permission(MemberPermission.OWNER)\n                })\n                .let {\n                    it.changeOwner(it.botAsMember)\n                }\n        }.let { events ->\n            assertEquals(3, events.size)\n            assertIsInstance<BotGroupPermissionChangeEvent>(events[0]) {\n                assertEquals(MemberPermission.ADMINISTRATOR, new)\n                assertEquals(MemberPermission.MEMBER, origin)\n            }\n            assertIsInstance<BotGroupPermissionChangeEvent>(events[1]) {\n                assertEquals(MemberPermission.OWNER, new)\n                assertEquals(MemberPermission.MEMBER, origin)\n            }\n            assertIsInstance<MemberPermissionChangeEvent>(events[2]) {\n                assertEquals(1, member.id)\n                assertEquals(\"o\", member.nick)\n                assertEquals(MemberPermission.MEMBER, new)\n                assertEquals(MemberPermission.OWNER, origin)\n            }\n        }\n    }\n\n    @Test\n    fun testMuteEvent() = runTest {\n        runAndReceiveEventBroadcast {\n            val group = bot.addGroup(1, \"\")\n                .appendMember(2, \"\")\n\n            group.botAsMember.let {\n                it.broadcastMute(it, 2)\n                assertTrue { it.isMuted }\n                it.broadcastMute(it, 0)\n                assertFalse { it.isMuted }\n                it.broadcastMute(it, 5)\n                assertTrue { group.isBotMuted }\n                assertTrue { it.isMuted }\n            }\n\n            group.getOrFail(2).let {\n                it.broadcastMute(it, 2)\n                assertTrue { it.isMuted }\n                it.broadcastMute(it, 0)\n                assertFalse { it.isMuted }\n                it.broadcastMute(it, 5)\n                assertTrue { it.isMuted }\n            }\n        }.let { events ->\n            assertEquals(6, events.size)\n            assertIsInstance<BotMuteEvent>(events[0])\n            assertIsInstance<BotUnmuteEvent>(events[1])\n            assertIsInstance<BotMuteEvent>(events[2])\n\n            assertIsInstance<MemberMuteEvent>(events[3])\n            assertIsInstance<MemberUnmuteEvent>(events[4])\n            assertIsInstance<MemberMuteEvent>(events[5])\n\n            delay(6000L)\n            assertFalse { bot.getGroupOrFail(1).isBotMuted }\n            assertFalse { bot.getGroupOrFail(1).getOrFail(2).isMuted }\n        }\n    }\n\n    @Test\n    fun testGroupNameChangeEvent() = runTest {\n        runAndReceiveEventBroadcast {\n            val g = bot.addGroup(1, \"\").appendMember(7, \"A\")\n            g.controlPane.groupName = \"OOOOO\"\n            g.name = \"Test\"\n            g.controlPane.withActor(g.getOrFail(7)).groupName = \"Hi\"\n        }.let { events ->\n            assertEquals(2, events.size)\n            assertIsInstance<GroupNameChangeEvent>(events[0]) {\n                assertEquals(\"OOOOO\", origin)\n                assertEquals(\"Test\", new)\n                assertEquals(1, group.id)\n                assertNull(operator)\n            }\n            assertIsInstance<GroupNameChangeEvent>(events[1]) {\n                assertEquals(\"Test\", origin)\n                assertEquals(\"Hi\", new)\n                assertEquals(1, group.id)\n                assertEquals(7, operator!!.id)\n            }\n        }\n    }\n\n    @Test\n    fun testGroupMuteAllEvent() = runTest {\n        runAndReceiveEventBroadcast {\n            val g = bot.addGroup(1, \"\").appendMember(7, \"A\")\n            g.controlPane.isMuteAll = true\n            g.settings.isMuteAll = false\n            g.controlPane.withActor(g.getOrFail(7)).isMuteAll = true\n        }.let { events ->\n            assertEquals(2, events.size)\n            assertIsInstance<GroupMuteAllEvent>(events[0]) {\n                assertEquals(true, origin)\n                assertEquals(false, new)\n                assertEquals(1, group.id)\n                assertNull(operator)\n            }\n            assertIsInstance<GroupMuteAllEvent>(events[1]) {\n                assertEquals(false, origin)\n                assertEquals(true, new)\n                assertEquals(1, group.id)\n                assertEquals(7, operator!!.id)\n            }\n        }\n    }\n\n    @Test\n    fun testGroupAllowAnonymousChatEvent() = runTest {\n        runAndReceiveEventBroadcast {\n            val g = bot.addGroup(1, \"\").appendMember(7, \"A\")\n            g.controlPane.isAnonymousChatAllowed = true\n            g.settings.isAnonymousChatEnabled = false\n            g.controlPane.withActor(g.getOrFail(7)).isAnonymousChatAllowed = true\n        }.let { events ->\n            assertEquals(2, events.size)\n            assertIsInstance<GroupAllowAnonymousChatEvent>(events[0]) {\n                assertEquals(true, origin)\n                assertEquals(false, new)\n                assertEquals(1, group.id)\n                assertNull(operator)\n            }\n            assertIsInstance<GroupAllowAnonymousChatEvent>(events[1]) {\n                assertEquals(false, origin)\n                assertEquals(true, new)\n                assertEquals(1, group.id)\n                assertEquals(7, operator!!.id)\n            }\n        }\n    }\n\n    @Test\n    fun testGroupAllowConfessTalkEvent() = runTest {\n        runAndReceiveEventBroadcast {\n            val g = bot.addGroup(1, \"\").appendMember(7, \"A\")\n            g.controlPane.isAllowConfessTalk = true\n            g.controlPane.withActor(g.botAsMember).isAllowConfessTalk = false\n            g.controlPane.withActor(g.getOrFail(7)).isAllowConfessTalk = true\n        }.let { events ->\n            assertEquals(2, events.size)\n            assertIsInstance<GroupAllowConfessTalkEvent>(events[0]) {\n                assertEquals(true, origin)\n                assertEquals(false, new)\n                assertEquals(1, group.id)\n                assertTrue(isByBot)\n            }\n            assertIsInstance<GroupAllowConfessTalkEvent>(events[1]) {\n                assertEquals(false, origin)\n                assertEquals(true, new)\n                assertEquals(1, group.id)\n                assertFalse(isByBot)\n            }\n        }\n    }\n\n    @Test\n    fun testGroupAllowMemberInviteEvent() = runTest {\n        runAndReceiveEventBroadcast {\n            val g = bot.addGroup(1, \"\").appendMember(7, \"A\")\n            g.controlPane.isAllowMemberInvite = true\n            g.settings.isAllowMemberInvite = false\n            g.controlPane.withActor(g.getOrFail(7)).isAllowMemberInvite = true\n        }.let { events ->\n            assertEquals(2, events.size)\n            assertIsInstance<GroupAllowMemberInviteEvent>(events[0]) {\n                assertEquals(true, origin)\n                assertEquals(false, new)\n                assertEquals(1, group.id)\n                assertNull(operator)\n            }\n            assertIsInstance<GroupAllowMemberInviteEvent>(events[1]) {\n                assertEquals(false, origin)\n                assertEquals(true, new)\n                assertEquals(1, group.id)\n                assertEquals(7, operator!!.id)\n            }\n        }\n    }\n\n    @Test\n    fun testMemberCardChangeEvent() = runTest {\n        runAndReceiveEventBroadcast {\n            bot.addGroup(1, \"\")\n                .addMember(MockMemberInfoBuilder.create {\n                    uin(2)\n                    nameCard(\"Hi\")\n                }).nameCardChangesTo(\"Hello\")\n        }.let { events ->\n            assertEquals(1, events.size)\n            assertIsInstance<MemberCardChangeEvent>(events[0]) {\n                assertEquals(\"Hi\", origin)\n                assertEquals(\"Hello\", new)\n                assertEquals(2, member.id)\n                assertEquals(1, member.group.id)\n            }\n        }\n    }\n\n    @Test\n    fun testMemberSpecialTitleChangeEvent() = runTest {\n        runAndReceiveEventBroadcast {\n            bot.addGroup(1, \"\").addMember(2, \"\") specialTitleChangesTo \"Hello\"\n        }.let { events ->\n            assertEquals(1, events.size)\n            assertIsInstance<MemberSpecialTitleChangeEvent>(events[0]) {\n                assertEquals(\"\", origin)\n                assertEquals(\"Hello\", new)\n                assertEquals(2, member.id)\n                assertEquals(1, member.group.id)\n            }\n        }\n    }\n\n    @Test\n    fun testHonorMember() = runTest {\n        val group = bot.addGroup(1, \"\")\n        val member1 = group.addMember(2, \"\")\n        val member2 = group.addMember(3, \"\")\n        assertEquals(emptyList(), group.active.queryHonorHistory(GroupHonorType.TALKATIVE).records)\n\n        runAndReceiveEventBroadcast {\n            group.active.changeHonorMember(member1, GroupHonorType.TALKATIVE)\n        }.let { events ->\n            assertEquals(1, events.size)\n            assertIsInstance<MemberHonorChangeEvent.Achieve>(events[0]) {\n                assertEquals(GroupHonorType.TALKATIVE, this.honorType)\n                assertEquals(member1, this.member)\n                assertEquals(group, this.group)\n            }\n        }\n        assertEquals(member1, group.active.queryHonorHistory(GroupHonorType.TALKATIVE).current!!.member!!)\n        assertEquals(emptyList(), group.active.queryHonorHistory(GroupHonorType.TALKATIVE).records)\n\n        runAndReceiveEventBroadcast {\n            group.active.changeHonorMember(member2, GroupHonorType.TALKATIVE)\n        }.let { events ->\n            assertEquals(3, events.size)\n            assertIsInstance<GroupTalkativeChangeEvent>(events[0]) {\n                assertEquals(member2, this.now)\n                assertEquals(member1, this.previous)\n                assertEquals(group, this.group)\n            }\n            assertIsInstance<MemberHonorChangeEvent.Lose>(events[1]) {\n                assertEquals(GroupHonorType.TALKATIVE, this.honorType)\n                assertEquals(member1, this.member)\n                assertEquals(group, this.group)\n            }\n            assertIsInstance<MemberHonorChangeEvent.Achieve>(events[2]) {\n                assertEquals(GroupHonorType.TALKATIVE, this.honorType)\n                assertEquals(member2, this.member)\n                assertEquals(group, this.group)\n            }\n        }\n\n        assertEquals(member2, group.active.queryHonorHistory(GroupHonorType.TALKATIVE).current!!.member!!)\n        // it.member must exist\n        assertEquals(\n            listOf(member1),\n            group.active.queryHonorHistory(GroupHonorType.TALKATIVE).records.map { it.member!! })\n\n        runAndReceiveEventBroadcast {\n            group.active.changeHonorMember(member1, GroupHonorType.TALKATIVE)\n        }.let { events ->\n            assertEquals(3, events.size)\n            assertIsInstance<GroupTalkativeChangeEvent>(events[0]) {\n                assertEquals(member1, this.now)\n                assertEquals(member2, this.previous)\n                assertEquals(group, this.group)\n            }\n            assertIsInstance<MemberHonorChangeEvent.Lose>(events[1]) {\n                assertEquals(GroupHonorType.TALKATIVE, this.honorType)\n                assertEquals(member2, this.member)\n                assertEquals(group, this.group)\n            }\n            assertIsInstance<MemberHonorChangeEvent.Achieve>(events[2]) {\n                assertEquals(GroupHonorType.TALKATIVE, this.honorType)\n                assertEquals(member1, this.member)\n                assertEquals(group, this.group)\n            }\n        }\n        assertEquals(member1, group.active.queryHonorHistory(GroupHonorType.TALKATIVE).current!!.member!!)\n        assertEquals(\n            listOf(member1, member2),\n            group.active.queryHonorHistory(GroupHonorType.TALKATIVE).records.map { it.member!! })\n\n        runAndReceiveEventBroadcast {\n            group.active.changeHonorMember(member1, GroupHonorType.BRONZE)\n        }.let { events ->\n            assertEquals(1, events.size)\n            assertIsInstance<MemberHonorChangeEvent.Achieve>(events[0]) {\n                assertEquals(GroupHonorType.BRONZE, this.honorType)\n                assertEquals(member1, this.member)\n                assertEquals(group, this.group)\n            }\n        }\n        assertEquals(member1, group.active.queryHonorHistory(GroupHonorType.BRONZE).current!!.member!!)\n        assertEquals(emptyList(), group.active.queryHonorHistory(GroupHonorType.BRONZE).records)\n\n        runAndReceiveEventBroadcast {\n            group.active.changeHonorMember(member2, GroupHonorType.BRONZE)\n        }.let { events ->\n            assertEquals(2, events.size)\n            assertIsInstance<MemberHonorChangeEvent.Lose>(events[0]) {\n                assertEquals(GroupHonorType.BRONZE, this.honorType)\n                assertEquals(member1, this.member)\n                assertEquals(group, this.group)\n            }\n            assertIsInstance<MemberHonorChangeEvent.Achieve>(events[1]) {\n                assertEquals(GroupHonorType.BRONZE, this.honorType)\n                assertEquals(member2, this.member)\n                assertEquals(group, this.group)\n            }\n        }\n        assertEquals(member2, group.active.queryHonorHistory(GroupHonorType.BRONZE).current!!.member!!)\n        assertEquals(listOf(member1), group.active.queryHonorHistory(GroupHonorType.BRONZE).records.map { it.member!! })\n    }\n}"
  },
  {
    "path": "mirai-core-mock/test/mock/MockMemberTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.test.mock\n\nimport net.mamoe.mirai.contact.MemberPermission\nimport net.mamoe.mirai.event.events.BotGroupPermissionChangeEvent\nimport net.mamoe.mirai.event.events.MemberPermissionChangeEvent\nimport net.mamoe.mirai.mock.test.MockBotTestBase\nimport net.mamoe.mirai.mock.utils.simpleMemberInfo\nimport org.junit.jupiter.api.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertNotEquals\nimport kotlin.test.assertSame\n\ninternal class MockMemberTest : MockBotTestBase() {\n    @Test\n    internal fun testAvatar() = runTest {\n        val m = bot.addGroup(111, \"aaa\").addMember(simpleMemberInfo(222, \"bbb\", permission = MemberPermission.MEMBER))\n        assertNotEquals(\"\", m.avatarUrl)\n    }\n\n    @Test\n    internal fun changeOwner() = runTest {\n        val group = bot.addGroup(111, \"aaa\")\n        val member = group.addMember(simpleMemberInfo(222, \"bbb\", permission = MemberPermission.MEMBER))\n        val events = runAndReceiveEventBroadcast {\n            group.changeOwner(member)\n            assertSame(member, group.owner)\n            assertSame(MemberPermission.OWNER, member.permission)\n        }\n        assertEquals(2, events.size)\n        assertIsInstance<MemberPermissionChangeEvent>(events[0]) {\n            assertSame(member, this.member)\n            assertSame(MemberPermission.OWNER, new)\n            assertSame(MemberPermission.MEMBER, origin)\n            assertSame(group, this.group)\n        }\n        assertIsInstance<BotGroupPermissionChangeEvent>(events[1]) {\n            assertSame(MemberPermission.MEMBER, new)\n            assertSame(MemberPermission.OWNER, origin)\n            assertSame(group, this.group)\n        }\n    }\n\n    @Test\n    internal fun modifyAdmin() = runTest {\n        val group = bot.addGroup(111, \"aaa\")\n        group.changeOwner(group.botAsMember)\n        val m = group.addMember(simpleMemberInfo(222, \"bbb\", permission = MemberPermission.MEMBER))\n        val events = runAndReceiveEventBroadcast {\n            m.modifyAdmin(true)\n            assertEquals(MemberPermission.ADMINISTRATOR, m.permission)\n            m.modifyAdmin(false)\n            assertEquals(MemberPermission.MEMBER, m.permission)\n        }\n        assertEquals(2, events.size)\n        assertIsInstance<MemberPermissionChangeEvent>(events[0]) {\n            assertSame(m, member)\n            assertSame(MemberPermission.MEMBER, origin)\n            assertSame(MemberPermission.ADMINISTRATOR, new)\n            assertSame(group, this.group)\n        }\n        assertIsInstance<MemberPermissionChangeEvent>(events[1]) {\n            assertSame(m, member)\n            assertSame(MemberPermission.ADMINISTRATOR, origin)\n            assertSame(MemberPermission.MEMBER, new)\n            assertSame(group, this.group)\n        }\n    }\n}"
  },
  {
    "path": "mirai-core-mock/test/mock/MockStrangerTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.test.mock\n\nimport net.mamoe.mirai.event.events.StrangerRelationChangeEvent\nimport net.mamoe.mirai.mock.test.MockBotTestBase\nimport net.mamoe.mirai.utils.cast\nimport org.junit.jupiter.api.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertNotEquals\n\ninternal class MockStrangerTest : MockBotTestBase() {\n    @Test\n    internal fun testStrangerRelationChangeEvent() = runTest {\n        runAndReceiveEventBroadcast {\n            bot.addStranger(111, \"aa\").addAsFriend()\n            bot.addStranger(222, \"bb\").delete()\n        }.let { events ->\n            assertEquals(2, events.size)\n            assertIsInstance<StrangerRelationChangeEvent.Friended>(events[0])\n            assertEquals(111, events[0].cast<StrangerRelationChangeEvent.Friended>().friend.id)\n            assertIsInstance<StrangerRelationChangeEvent.Deleted>(events[1])\n            assertEquals(222, events[1].cast<StrangerRelationChangeEvent.Deleted>().stranger.id)\n            assertNotEquals(\"\", bot.getFriend(111)!!.avatarUrl)\n        }\n    }\n}"
  },
  {
    "path": "mirai-core-mock/test/package.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.mock.test\n"
  },
  {
    "path": "mirai-core-utils/README.md",
    "content": "# mirai-core-utils\n\n内部工具类模块。提供二进制兼容而不提供源码兼容，但也不保证破坏性变更不会发生，因此若要使用该工具模块，请自行承担兼容后果。"
  },
  {
    "path": "mirai-core-utils/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"UNUSED_VARIABLE\")\n\nimport shadow.relocateImplementation\n\nplugins {\n    kotlin(\"multiplatform\")\n    kotlin(\"plugin.serialization\")\n\n    id(\"kotlinx-atomicfu\")\n    id(\"me.him188.kotlin-jvm-blocking-bridge\")\n//    id(\"me.him188.maven-central-publish\")\n    `maven-publish`\n}\n\ndescription = \"mirai-core utilities\"\n\nkotlin {\n    explicitApi()\n    apply(plugin = \"explicit-api\")\n\n    configureJvmTargetsHierarchical(\"net.mamoe.mirai.utils\")\n\n    sourceSets {\n        val commonMain by getting {\n            dependencies {\n                api(kotlin(\"reflect\"))\n                api(`kotlinx-serialization-core`)\n                api(`kotlinx-serialization-json`)\n                api(`kotlinx-coroutines-core`)\n\n                implementation(`kotlinx-serialization-protobuf`)\n                relocateImplementation(`ktor-io_relocated`)\n            }\n        }\n\n        val commonTest by getting {\n            dependencies {\n                api(yamlkt)\n                implementation(`kotlinx-coroutines-test`)\n                api(`junit-jupiter-api`)\n            }\n        }\n\n        findByName(\"jvmBaseMain\")?.apply {\n            dependencies {\n                implementation(`jetbrains-annotations`)\n            }\n        }\n\n        findByName(\"androidMain\")?.apply {\n            dependencies {\n                implementation(`androidx-annotation`)\n            }\n        }\n\n        findByName(\"jvmMain\")?.apply {\n\n        }\n\n        findByName(\"jvmTest\")?.apply {\n            dependencies {\n                implementation(`kotlinx-coroutines-debug`)\n                runtimeOnly(files(\"build/classes/kotlin/jvm/test\")) // classpath is not properly set by IDE\n            }\n        }\n    }\n}\n\nif (tasks.findByName(\"androidMainClasses\") != null) {\n    tasks.register(\"checkAndroidApiLevel\") {\n        doFirst {\n            analyzes.AndroidApiLevelCheck.check(\n                buildDir.resolve(\"classes/kotlin/android/main\"),\n                project.property(\"mirai.android.target.api.level\")!!.toString().toInt(),\n                project\n            )\n        }\n        group = \"verification\"\n        this.mustRunAfter(\"androidMainClasses\")\n    }\n    tasks.findByName(\"androidTest\")?.dependsOn(\"checkAndroidApiLevel\")\n}\n\nconfigureMppPublishing()\n\n//mavenCentralPublish {\n//    artifactId = \"mirai-core-utils\"\n//    githubProject(\"mamoe\", \"mirai\")\n//    developer(\"Mamoe Technologies\", email = \"support@mamoe.net\", url = \"https://github.com/mamoe\")\n//    licenseFromGitHubProject(\"AGPLv3\", \"dev\")\n//    publishPlatformArtifactsInRootModule = \"jvm\"\n//}"
  },
  {
    "path": "mirai-core-utils/src/androidInstrumentedTest/kotlin/AndroidUnwrapTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.test.Test\nimport kotlin.test.assertIs\n\nclass AndroidUnwrapTest {\n    @Test\n    fun test() {\n        val e =\n            IllegalStateException(\n                OutOfMemoryError().initCause(VerifyError()).apply { addSuppressed(UnsatisfiedLinkError()) }\n            )\n\n        val unwrapped = e.unwrap<IllegalStateException>()\n\n        unwrapped.printStackTrace()\n\n        assertIs<OutOfMemoryError>(unwrapped)\n        assertIs<VerifyError>(unwrapped.cause)\n        assertIs<UnsatisfiedLinkError>(unwrapped.suppressed.first())\n        assertIs<StacktraceException>(unwrapped.suppressed[1])\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/androidMain/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019-2023 Mamoe Technologies and contributors.\n  ~\n  ~ 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n  ~ Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n  ~\n  ~ https://github.com/mamoe/mirai/blob/dev/LICENSE\n  -->\n\n<manifest package=\"net.mamoe.mirai\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n</manifest>"
  },
  {
    "path": "mirai-core-utils/src/androidMain/kotlin/Actuals.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n\npackage net.mamoe.mirai.utils\n\nimport android.os.Build\nimport android.util.Base64\nimport androidx.annotation.RequiresApi\n\n\npublic actual fun ByteArray.encodeBase64(): String {\n    return Base64.encodeToString(this, Base64.NO_WRAP)\n}\n\npublic actual fun String.decodeBase64(): ByteArray {\n    return Base64.decode(this, Base64.NO_WRAP)\n}\n\n@RequiresApi(Build.VERSION_CODES.N)\n@PublishedApi\ninternal class StacktraceException(override val message: String?, private val stacktrace: Array<StackTraceElement>) :\n    Exception(message, null, true, false) {\n    override fun fillInStackTrace(): Throwable = this\n    override fun getStackTrace(): Array<StackTraceElement> = stacktrace\n}\n\n@PublishedApi\ninternal class StacktraceExceptionBeforeN(\n    override val message: String?,\n    private val stacktrace: Array<StackTraceElement>\n) : Exception(message, null) {\n    override fun fillInStackTrace(): Throwable = this\n    override fun getStackTrace(): Array<StackTraceElement> = stacktrace\n}\n\npublic actual inline fun <reified E> Throwable.unwrap(addSuppressed: Boolean): Throwable {\n    if (this !is E) return this\n    return if (addSuppressed) {\n        val e = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {\n            StacktraceException(\"Unwrapped exception: $this\", this.stackTrace)\n        } else {\n            StacktraceExceptionBeforeN(\"Unwrapped exception: $this\", this.stackTrace)\n        }\n        for (throwable in this.suppressed) {\n            e.addSuppressed(throwable)\n        }\n        this.findCause { it !is E }\n            ?.also { it.addSuppressed(e) }\n            ?: this\n    } else {\n        this.findCause { it !is E }\n            ?: this\n    }\n}\n"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/Annotations.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.RequiresOptIn.Level.ERROR\nimport kotlin.annotation.AnnotationTarget.*\n\n\n@RequiresOptIn(\"This can only be used in tests.\", level = ERROR)\n@Target(CLASS, FUNCTION, PROPERTY, CLASS, CONSTRUCTOR, FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER)\npublic annotation class TestOnly\n\n/**\n * 标注 API 弃用记录, 用于在将来提升弃用等级.\n *\n * 注意, 在使用时必须使用 named arguments, 如:\n * ```\n * @DeprecatedSinceMirai(warningSince = \"2.9\")\n * ```\n *\n * @since 2.9.0-RC\n */ // https://github.com/mamoe/mirai/issues/1669\n@Target(\n    CLASS,\n    PROPERTY,\n    CONSTRUCTOR,\n    FUNCTION,\n    TYPEALIAS\n)\npublic annotation class DeprecatedSinceMirai(\n    val warningSince: String = \"\",\n    val errorSince: String = \"\",\n    val hiddenSince: String = \"\",\n    val internalSince: String = \"\",\n)"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/Arrays.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MiraiUtils\")\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\npublic inline fun <A, reified B> Array<A>.mapToArray(block: (element: A) -> B): Array<B> {\n    val result = arrayOfNulls<B>(size)\n    this.forEachIndexed { index, element ->\n        result[index] = block(element)\n    }\n    return result.cast()\n}\n\npublic inline fun <A, reified B> Collection<A>.mapToArray(block: (element: A) -> B): Array<B> {\n    val result = arrayOfNulls<B>(size)\n    this.forEachIndexed { index, element ->\n        result[index] = block(element)\n    }\n    return result.cast()\n}\n\npublic inline fun <A> Collection<A>.mapToIntArray(block: (element: A) -> Int): IntArray {\n    val result = IntArray(size)\n    this.forEachIndexed { index, element ->\n        result[index] = block(element)\n    }\n    return result\n}\n\npublic inline fun <A> Collection<A>.mapToByteArray(block: (element: A) -> Byte): ByteArray {\n    val result = ByteArray(size)\n    this.forEachIndexed { index, element ->\n        result[index] = block(element)\n    }\n    return result\n}"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/AtomicInteger.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.atomicfu.atomic\n\n/**\n * Wraps a [atomic] to allow more complicated usages.\n */\n@TestOnly\npublic class AtomicInteger(\n    value: Int\n) {\n    private val delegate = atomic(value)\n\n    public var value: Int\n        get() = delegate.value\n        set(value) {\n            delegate.value = value\n        }\n\n    public fun compareAndSet(expect: Int, update: Int): Boolean = delegate.compareAndSet(expect, update)\n    public fun getAndIncrement(): Int = delegate.getAndIncrement()\n    public fun incrementAndGet(): Int = delegate.incrementAndGet()\n}\n\n/**\n * Wraps a [atomic] to allow more complicated usages.\n */\n@TestOnly\npublic class AtomicBoolean(\n    value: Boolean\n) {\n    private val delegate = atomic(value)\n\n    public var value: Boolean\n        get() = delegate.value\n        set(value) {\n            delegate.value = value\n        }\n\n    public fun compareAndSet(expect: Boolean, update: Boolean): Boolean = delegate.compareAndSet(expect, update)\n}"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/Base64.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\npublic expect fun ByteArray.encodeBase64(): String\npublic expect fun String.decodeBase64(): ByteArray\n"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/ByteArrayOp.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmName(\"ByteArrayOpKt_common\")\n\npackage net.mamoe.mirai.utils\n\nimport io.ktor.utils.io.core.*\nimport kotlin.jvm.JvmName\n\npublic expect val DEFAULT_BUFFER_SIZE: Int\n\npublic fun String.md5(): ByteArray = toByteArray().md5()\n\npublic expect fun ByteArray.md5(offset: Int = 0, length: Int = size - offset): ByteArray\n\npublic fun String.sha1(): ByteArray = toByteArray().sha1()\n\npublic expect fun ByteArray.sha1(offset: Int = 0, length: Int = size - offset): ByteArray\n\npublic fun String.sha256(): ByteArray = toByteArray().sha256()\n\npublic expect fun ByteArray.sha256(offset: Int = 0, length: Int = size - offset): ByteArray\n\n///////////////////////////////////////////////////////////////////////////\n// How to choose 'inflate', 'inflateAllAvailable', 'InflateInput'?\n//\n// On JVM, performance 'inflateAllAvailable' > 'InflateInput' > 'inflate'\n// On Native, performance 'inflateAllAvailable' = 'InflateInput' > 'inflate'\n//\n// So you should use `inflateAllAvailable` if you need have an Input and you need a ByteArray.\n// If you have a ByteArray and you need an InputStream, use 'InflateInput'.\n// Use 'inflate' only if the input and desired output type are both ByteArray.\n//\n// Specially if you are using `.decodeToString()` after reading a ByteArray, then you'd prefer 'InflateInput' with 'readText()'.\n///////////////////////////////////////////////////////////////////////////\n\n\n///////////////////////////////////////////////////////////////////////////\n// Processing ByteArray\n///////////////////////////////////////////////////////////////////////////\n\npublic expect fun ByteArray.gzip(offset: Int = 0, length: Int = size - offset): ByteArray\npublic expect fun ByteArray.ungzip(offset: Int = 0, length: Int = size - offset): ByteArray\n\npublic expect fun ByteArray.inflate(offset: Int = 0, length: Int = size - offset): ByteArray\npublic expect fun ByteArray.deflate(offset: Int = 0, length: Int = size - offset): ByteArray\n\n\n///////////////////////////////////////////////////////////////////////////\n// Consuming input\n///////////////////////////////////////////////////////////////////////////\n\n/**\n * Input will be closed.\n */\npublic expect fun Input.gzipAllAvailable(): ByteArray\n\n/**\n * Input will be closed.\n */\npublic expect fun Input.ungzipAllAvailable(): ByteArray\n\n/**\n * Input will be closed.\n */\npublic expect fun Input.inflateAllAvailable(): ByteArray\n\n/**\n * Input will be closed.\n */\npublic expect fun Input.deflateAllAvailable(): ByteArray\n\n///////////////////////////////////////////////////////////////////////////\n// Input adapters.\n///////////////////////////////////////////////////////////////////////////\n\n//@Suppress(\"FunctionName\")\n//public expect fun GzipCompressionInput(source: Input): Input // No GzipInputStream for decompression on JVM\n\n/**\n * [source] will be closed on returned [Input.close]\n */\n@Suppress(\"FunctionName\")\npublic expect fun GzipDecompressionInput(source: Input): Input\n\n/**\n * @see GzipDecompressionInput\n */\npublic fun Input.gzipDecompressionInput(): Input = GzipDecompressionInput(this)\n\n/**\n * [source] will be closed on returned [Input.close]\n */\n@Suppress(\"FunctionName\")\npublic expect fun InflateInput(source: Input): Input\n\n/**\n * @see InflateInput\n */\npublic fun Input.inflateInput(): Input = InflateInput(this)\n\n/**\n * [source] will be closed on returned [Input.close]\n */\n@Suppress(\"FunctionName\")\npublic expect fun DeflateInput(source: Input): Input\n\n/**\n * @see DeflateInput\n */\npublic fun Input.deflateInput(): Input = DeflateInput(this)"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/ByteArrayPool.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport io.ktor.utils.io.pool.*\n\n/**\n * 缓存 [ByteArray] 实例的 [ObjectPool]\n */\npublic object ByteArrayPool : DefaultPool<ByteArray>(128) {\n    /**\n     * 每一个 [ByteArray] 的大小\n     */\n    public const val BUFFER_SIZE: Int = 4096\n\n    override fun produceInstance(): ByteArray = ByteArray(BUFFER_SIZE)\n\n    override fun clearInstance(instance: ByteArray): ByteArray = instance\n\n    public fun checkBufferSize(size: Int) {\n        require(size <= BUFFER_SIZE) { \"sizePerPacket is too large. Maximum buffer size=$BUFFER_SIZE\" }\n    }\n\n    public fun checkBufferSize(size: Long) {\n        require(size <= BUFFER_SIZE) { \"sizePerPacket is too large. Maximum buffer size=$BUFFER_SIZE\" }\n    }\n\n    /**\n     * 请求一个大小至少为 [requestedSize] 的 [ByteArray] 实例.\n     */ // 不要写为扩展函数. 它需要优先于 kotlinx.io 的扩展函数 resolve\n    public inline fun <R> useInstance(requestedSize: Int = 0, block: (ByteArray) -> R): R {\n        if (requestedSize > BUFFER_SIZE) {\n            return ByteArray(requestedSize).run(block)\n        }\n        val instance = borrow()\n        try {\n            return block(instance)\n        } finally {\n            recycle(instance)\n        }\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/Bytes.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MiraiUtils\")\n\npackage net.mamoe.mirai.utils\n\nimport io.ktor.utils.io.core.*\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmOverloads\nimport kotlin.jvm.JvmSynthetic\n\n\n@JvmOverloads\npublic fun generateImageId(md5: ByteArray, format: String? = null): String {\n    return \"\"\"{${generateUUID(md5)}}.${format ?: \"mirai\"}\"\"\"\n}\n\n@JvmOverloads\npublic fun generateImageIdFromResourceId(resourceId: String, format: String = \"mirai\"): String? {\n    //  friend image id:  /f8f1ab55-bf8e-4236-b55e-955848d7069f\n    //  friend image id:  /                      f8f1ab55-bf8e-4236-b55e-955848d7069f\n\n    //  friend image id:  /0000000000-3666252994-EFF4427CE3D27DB6B1D9A8AB72E7A29C\n    //  friend image id:  /0000000000-3666252994-EFF4427C E3D2 7DB6 B1D9 A8AB72E7A29C\n    //   group image id:                        {EF42A82D-8DB6-5D0F-4F11-68961D8DA5CB}.png\n\n    if (resourceId.isNotEmpty()) {\n        if (resourceId[0] == '{') {\n            // {EF42A82D-8DB6-5D0F-4F11-68961D8DA5CB\n            if (resourceId.substringBefore('}', \"\").length == 37) {\n                return resourceId\n            }\n        }\n    }\n\n    val md5String = resourceId.substringAfterLast(\"-\").substringAfter(\"/\").takeIf { it.length == 32 }\n        ?: resourceId.replace(\"-\", \"\").substringAfter('/').takeIf { it.length == 32 }\n        ?: return null\n    return \"{${generateUUID(md5String)}}.$format\"\n}\n\npublic fun generateUUID(md5: ByteArray): String {\n    return \"${md5[0, 3]}-${md5[4, 5]}-${md5[6, 7]}-${md5[8, 9]}-${md5[10, 15]}\"\n}\n\npublic fun generateUUID(md5String: String): String {\n    with(md5String) {\n        check(length == 32) { \"it should md5String.length == 32\" }\n        return \"${substring(0, 8)}-${substring(8, 12)}-${substring(12, 16)}-${substring(16, 20)}-${substring(20, 32)}\"\n    }\n}\n\n@JvmSynthetic\npublic operator fun ByteArray.get(rangeStart: Int, rangeEnd: Int): String = buildString {\n    for (it in rangeStart..rangeEnd) {\n        append(this@get[it].fixToString())\n    }\n}\n\nprivate fun Byte.fixToString(): String {\n    return when (val b = this.toInt() and 0xff) {\n        in 0..15 -> \"0${this.toString(16).uppercase()}\"\n        else -> b.toString(16).uppercase()\n    }\n}\n\npublic fun ByteArray.toUHexString(\n    separator: String = \" \",\n    offset: Int = 0,\n    length: Int = this.size - offset\n): String {\n    this.checkOffsetAndLength(offset, length)\n    if (length == 0) {\n        return \"\"\n    }\n    val lastIndex = offset + length\n    return buildString(length * 2) {\n        this@toUHexString.forEachIndexed { index, it ->\n            if (index in offset until lastIndex) {\n                val ret = it.toUByte().toString(16).uppercase()\n                if (ret.length == 1) append('0')\n                append(ret)\n                if (index < lastIndex - 1) append(separator)\n            }\n        }\n    }\n}\n\npublic fun ByteArray.checkOffsetAndLength(offset: Int, length: Int) {\n    require(offset >= 0) { \"offset shouldn't be negative: $offset\" }\n    require(length >= 0) { \"length shouldn't be negative: $length\" }\n    require(offset + length <= this.size) { \"offset ($offset) + length ($length) > array.size (${this.size})\" }\n}\n\n@OptIn(ExperimentalUnsignedTypes::class)\npublic fun UByteArray.toUHexString(separator: String = \" \", offset: Int = 0, length: Int = this.size - offset): String {\n    if (length == 0) {\n        return \"\"\n    }\n    val lastIndex = offset + length\n    return buildString(length * 2) {\n        this@toUHexString.forEachIndexed { index, it ->\n            if (index in offset until lastIndex) {\n                val ret = it.toByte().toUByte().toString(16).uppercase()\n                if (ret.length == 1) append('0')\n                append(ret)\n                if (index < lastIndex - 1) append(separator)\n            }\n        }\n    }\n}\n\npublic fun ByteArray.toReadPacket(\n    offset: Int = 0,\n    length: Int = this.size - offset,\n    release: (ByteArray) -> Unit = {}\n): ByteReadPacket =\n    ByteReadPacket(this, offset = offset, length = length, block = release)\n\npublic inline fun <R> ByteArray.read(t: ByteReadPacket.() -> R): R {\n    contract {\n        callsInPlace(t, InvocationKind.EXACTLY_ONCE)\n    }\n    return this.toReadPacket().use(t)\n}"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/CheckableResult.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.serialization.Serializable\nimport net.mamoe.mirai.utils.Either.Companion.fold\nimport kotlin.jvm.JvmName\nimport kotlin.reflect.KType\n\n@Suppress(\"PropertyName\")\npublic interface CheckableResponse {\n    public val _errorCode: Int\n    public val _errorMessage: String?\n}\n\n@Serializable\npublic abstract class CheckableResponseA : CheckableResponse {\n    public abstract val errorCode: Int\n    public abstract val errorMessage: String?\n\n    final override val _errorCode: Int get() = errorCode\n    final override val _errorMessage: String? get() = errorMessage\n}\n\n@Serializable\npublic abstract class CheckableResponseB : CheckableResponse {\n    public abstract val result: Int\n\n    @Suppress(\"SpellCheckingInspection\")\n    public abstract val errmsg: String\n\n    final override val _errorCode: Int get() = result\n    final override val _errorMessage: String get() = errmsg\n}\n\npublic class DeserializationFailure(\n    structType: KType,\n    public val json: String,\n    public val exception: Throwable\n) : CheckableResponseA() {\n    override val errorCode: Int get() = -1\n    override val errorMessage: String = \"Failed to deserialize '$json' into $structType\"\n    public fun createException(): Exception {\n        return IllegalStateException(\"Error code: $_errorCode, Error message: $_errorMessage\", exception)\n    }\n}\n\n/*\n * `check`: throws exception, or returns succeed value.\n * `checked`: do `check` and wrap result into an `Either`.\n */\n\npublic fun <T : CheckableResponse> T.check(): T {\n    check(_errorCode == 0) { \"Error code: $_errorCode, Error message: $_errorMessage\" }\n    return this\n}\n\npublic open class FailureResponse(\n    public val errorCode: Int,\n    public val errorMessage: String,\n) {\n    public fun createException(): Exception {\n        return IllegalStateException(\"Error code: $errorCode, Error message: $errorMessage\")\n    }\n}\n\npublic inline fun <reified T : CheckableResponse> T.checked(): Either<FailureResponse, T> {\n    if (_errorCode == 0) return Either<FailureResponse, T>(this)\n    return Either(FailureResponse(_errorCode, _errorMessage.toString()))\n}\n\npublic fun DeserializationFailure.check(): Nothing = throw this.createException()\npublic fun FailureResponse.check(): Nothing = throw this.createException()\n\npublic inline fun <reified T : CheckableResponse> Either<DeserializationFailure, T>.check(): T {\n    return this.fold(onLeft = { it.check() }, onRight = { it.check() })\n}\n\npublic inline fun <reified T> Either<DeserializationFailure, T>.check(): T {\n    return this.fold(onLeft = { it.check() }, onRight = { it })\n}\n\n@JvmName(\"checkedFailureResponseT\")\npublic inline fun <reified T> Either<FailureResponse, T>.check(): T {\n    return this.fold(onLeft = { it.check() }, onRight = { it })\n}"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/Clock.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmName(\"ClockKt_common\")\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.jvm.JvmName\n\npublic interface Clock {\n    public fun currentTimeMillis(): Long\n    public fun currentTimeSeconds(): Long = currentTimeMillis() / 1000\n\n    public object SystemDefault : Clock {\n        override fun currentTimeMillis(): Long = net.mamoe.mirai.utils.currentTimeMillis()\n        override fun currentTimeSeconds(): Long = net.mamoe.mirai.utils.currentTimeSeconds()\n    }\n}\n\npublic fun Clock.adjusted(diffMillis: Long): Clock = AdjustedClock(this, diffMillis)\n\npublic class AdjustedClock(\n    private val clock: Clock,\n    private val diffMillis: Long,\n) : Clock {\n    override fun currentTimeMillis(): Long = clock.currentTimeMillis() + diffMillis\n    override fun currentTimeSeconds(): Long = (clock.currentTimeMillis() + diffMillis) / 1000\n}\n\npublic expect inline fun measureTimeMillis(block: () -> Unit): Long"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/Closeable.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmName(\"CloseableKt_common\")\n\npackage net.mamoe.mirai.utils\n\nimport io.ktor.utils.io.core.*\nimport io.ktor.utils.io.errors.*\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.jvm.JvmName\n\npublic expect interface Closeable {\n    @Throws(IOException::class)\n    public fun close()\n}\n\n\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n@kotlin.internal.LowPriorityInOverloadResolution\npublic expect inline fun <C : Closeable, R> C.use(block: (C) -> R): R\n\n// overcome overload resolution ambiguity\npublic inline fun <C : Input, R> C.use(block: (C) -> R): R {\n    contract {\n        callsInPlace(block, InvocationKind.EXACTLY_ONCE)\n    }\n    return this.asMiraiCloseable().use { block(this) }\n}\n\n// overcome overload resolution ambiguity\npublic inline fun <C : Output, R> C.use(block: (C) -> R): R {\n    contract {\n        callsInPlace(block, InvocationKind.EXACTLY_ONCE)\n    }\n    return this.asMiraiCloseable().use { block(this) }\n}\n\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n@kotlin.internal.LowPriorityInOverloadResolution\npublic inline fun <C : Closeable, R> C.withUse(block: C.() -> R): R {\n    contract {\n        callsInPlace(block, InvocationKind.EXACTLY_ONCE)\n    }\n    return use(block)\n}\n\n// `Input` does not implement `Closeable` in common\npublic inline fun <C : Input, R> C.withUse(block: C.() -> R): R {\n    contract {\n        callsInPlace(block, InvocationKind.EXACTLY_ONCE)\n    }\n    return use(block)\n}\n\n// `Output` does not implement `Closeable` in common\npublic inline fun <C : Output, R> C.withUse(block: C.() -> R): R {\n    contract {\n        callsInPlace(block, InvocationKind.EXACTLY_ONCE)\n    }\n    return use(block)\n}\n\npublic inline fun <I : Closeable, O : Closeable, R> I.withOut(output: O, block: I.(output: O) -> R): R {\n    contract {\n        callsInPlace(block, InvocationKind.EXACTLY_ONCE)\n    }\n    return use { output.use { block(this, output) } }\n}\n\n\npublic expect fun Closeable.asKtorCloseable(): io.ktor.utils.io.core.Closeable\npublic expect fun io.ktor.utils.io.core.Closeable.asMiraiCloseable(): Closeable"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/CollectionDiff.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\npublic class CollectionDiff<E> {\n    private var save: Collection<E> = listOf()\n\n    public fun save(collection: Collection<E>) {\n        save = collection.toList()\n    }\n\n    public fun subtract(collection: Collection<E>): Collection<E> = collection subtract save\n\n    public fun subtractAndSave(collection: Collection<E>): Collection<E> {\n        return subtract(collection).also { save(collection) }\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/Collections.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmName(\"CollectionsKt_common\")\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.jvm.JvmName\nimport kotlin.reflect.KClass\n\n@Suppress(\"FunctionName\")\npublic expect fun <K : Any, V> ConcurrentHashMap(): MutableMap<K, V>\n\n@Suppress(\"FunctionName\")\npublic expect fun <E> ConcurrentLinkedDeque(): MutableDeque<E>\n\n@Suppress(\"FunctionName\")\npublic fun <E> ConcurrentLinkedQueue(): MutableQueue<E> = ConcurrentLinkedDeque()\n\npublic expect class LinkedList<E> constructor() : MutableList<E> {\n    public fun addLast(element: E)\n}\n\npublic expect interface MutableQueue<E> : MutableCollection<E> {\n    /**\n     * Adds the specified element to the collection.\n     *\n     * @return `true` if the element has been added, `false` if the collection does not support duplicates\n     * and the element is already contained in the collection.\n     * @throws IllegalStateException if the queue is full.\n     */\n    public override fun add(element: E): Boolean\n\n    /**\n     * Removes and returns the head of the queue, `null` otherwise.\n     */\n    public fun poll(): E?\n\n\n    /**\n     * Adds an element into the queue.\n     * @return `true` if the element has been added, `false` if queue is full.\n     */\n    public fun offer(element: E): Boolean\n}\n\npublic expect interface MutableDeque<E> : MutableQueue<E> {\n    public fun addFirst(element: E)\n}\n\n@Suppress(\"FunctionName\")\npublic expect fun <K : Enum<K>, V> EnumMap(clazz: KClass<K>): MutableMap<K, V>\n\n@Suppress(\"FunctionName\")\npublic expect fun <E> ConcurrentSet(): MutableSet<E>\n\n@Deprecated(\"\", ReplaceWith(\"getOrElse(key) { default }\"))\npublic fun <K, V : R, R> Map<K, V>.getOrDefault(key: K, default: R): R = getOrElse(key) { default }\n\n@Suppress(\"EXTENSION_SHADOWED_BY_MEMBER\") // JDK 1.8\n@Deprecated(\"\", ReplaceWith(\"getOrPut(key) { value }\"))\npublic fun <K, V> MutableMap<K, V>.putIfAbsent(key: K, value: V): V = getOrPut(key) { value }\n\n/**\n * Returns a [List] that cannot be cast to [MutableList] to modify it.\n */\npublic expect fun <T> List<T>.asImmutable(): List<T>\n\n/**\n * Returns a [Collection] that cannot be cast to [MutableCollection] to modify it.\n */\npublic expect fun <T> Collection<T>.asImmutable(): Collection<T>\n\npublic expect fun <T> Set<T>.asImmutable(): Set<T>"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/Conversions.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"EXPERIMENTAL_UNSIGNED_LITERALS\", \"EXPERIMENTAL_API_USAGE\", \"unused\")\n\n@file:JvmMultifileClass\n@file:JvmName(\"MiraiUtils\")\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\n/*\n * 类型转换 Utils.\n * 这些函数为内部函数, 可能会改变\n */\n\n/**\n * Converts a Short to its hex representation in network order (big-endian).\n */\npublic fun Short.toByteArray(): ByteArray = with(toInt()) {\n    byteArrayOf(\n        (shr(8) and 0xFF).toByte(),\n        (shr(0) and 0xFF).toByte()\n    )\n}\n\n/**\n * Converts an Int to its hex representation in network order (big-endian).\n */\npublic fun Int.toByteArray(): ByteArray = byteArrayOf(\n    ushr(24).toByte(),\n    ushr(16).toByte(),\n    ushr(8).toByte(),\n    ushr(0).toByte()\n)\n\n/**\n * Converts a Long to its hex representation in network order (big-endian).\n */\npublic fun Long.toByteArray(): ByteArray = byteArrayOf(\n    (ushr(56) and 0xFF).toByte(),\n    (ushr(48) and 0xFF).toByte(),\n    (ushr(40) and 0xFF).toByte(),\n    (ushr(32) and 0xFF).toByte(),\n    (ushr(24) and 0xFF).toByte(),\n    (ushr(16) and 0xFF).toByte(),\n    (ushr(8) and 0xFF).toByte(),\n    (ushr(0) and 0xFF).toByte()\n)\n\n/**\n * Converts an Int to its hex representation in network order (big-endian).\n */\npublic fun Int.toUHexString(separator: String = \" \"): String = this.toByteArray().toUHexString(separator)\n\n/**\n * Converts an UShort to its hex representation in network order (big-endian).\n */\npublic fun UShort.toByteArray(): ByteArray = with(toUInt()) {\n    byteArrayOf(\n        (shr(8) and 255u).toByte(),\n        (shr(0) and 255u).toByte()\n    )\n}\n\n/**\n * Converts a Short to its hex representation in network order (big-endian).\n */\npublic fun Short.toUHexString(separator: String = \" \"): String = this.toUShort().toUHexString(separator)\n\n/**\n * Converts an UShort to its hex representation in network order (big-endian).\n */\npublic fun UShort.toUHexString(separator: String = \" \"): String =\n    this.toInt().shr(8).toUShort().toUByte().toUHexString() + separator + this.toUByte().toUHexString()\n\n/**\n * Converts an ULong to its hex representation in network order (big-endian).\n */\npublic fun ULong.toUHexString(separator: String = \" \"): String =\n    this.toLong().toUHexString(separator)\n\n/**\n * Converts a Long to its hex representation in network order (big-endian).\n */\npublic fun Long.toUHexString(separator: String = \" \"): String =\n    this.ushr(32).toUInt().toUHexString(separator) + separator + this.toUInt().toUHexString(separator)\n\n\n/**\n * Converts an UByte to its hex representation.\n */\npublic fun UByte.toUHexString(): String = this.toByte().toUHexString()\n\n/**\n * 255u -> 00 00 00 FF\n */\npublic fun UInt.toByteArray(): ByteArray = byteArrayOf(\n    (shr(24) and 255u).toByte(),\n    (shr(16) and 255u).toByte(),\n    (shr(8) and 255u).toByte(),\n    (shr(0) and 255u).toByte()\n)\n\n/**\n * Converts an UInt to its hex representation in network order (big-endian).\n */\npublic fun UInt.toUHexString(separator: String = \" \"): String = this.toByteArray().toUHexString(separator)\n\n/**\n * 转无符号十六进制表示, 并补充首位 `0`.\n * 转换结果示例: `FF`, `0E`\n */\npublic fun Byte.toUHexString(): String = this.toUByte().fixToUHex()\n\n/**\n * 转无符号十六进制表示, 并补充首位 `0`.\n */\npublic fun Byte.fixToUHex(): String = this.toUByte().fixToUHex()\n\n/**\n * 转无符号十六进制表示, 并补充首位 `0`.\n */\npublic fun UByte.fixToUHex(): String =\n    if (this.toInt() in 0..15) \"0${this.toString(16).uppercase()}\" else this.toString(16).uppercase()\n\n/**\n * Converts 4 bytes to an UInt in network order (big-endian).\n */\npublic fun ByteArray.toUInt(): UInt =\n    (this[0].toUInt().and(255u) shl 24)\n        .plus(this[1].toUInt().and(255u) shl 16)\n        .plus(this[2].toUInt().and(255u) shl 8)\n        .plus(this[3].toUInt().and(255u) shl 0)\n\n/**\n * Converts 2 bytes to an UShort in network order (big-endian).\n */\npublic fun ByteArray.toUShort(): UShort =\n    ((this[0].toUInt().and(255u) shl 8) + (this[1].toUInt().and(255u) shl 0)).toUShort()\n\n/**\n * Converts 4 bytes to an Int in network order (big-endian).\n */\npublic fun ByteArray.toInt(offset: Int = 0): Int =\n    this[offset + 0].toInt().and(255).shl(24)\n        .plus(this[offset + 1].toInt().and(255).shl(16))\n        .plus(this[offset + 2].toInt().and(255).shl(8))\n        .plus(this[offset + 3].toInt().and(255).shl(0))\n\n/**\n * Converts 8 bytes to an Long in network order (big-endian).\n */\npublic fun ByteArray.toLong(): Long {\n    var rsp: Long = 0\n    rsp += this[0].toLong().and(255).shl(56)\n    rsp += this[1].toLong().and(255).shl(48)\n    rsp += this[2].toLong().and(255).shl(40)\n    rsp += this[3].toLong().and(255).shl(32)\n    rsp += this[4].toLong().and(255).shl(24)\n    rsp += this[5].toLong().and(255).shl(16)\n    rsp += this[6].toLong().and(255).shl(8)\n    rsp += this[7].toLong().and(255).shl(0)\n    return rsp\n}\n\n\n///////////////////////////////////////////////////////////////////////////\n// hexToBytes\n///////////////////////////////////////////////////////////////////////////\n\n\nprivate val byteStringCandidates = arrayOf('a'..'f', 'A'..'F', '0'..'9', ' '..' ')\nprivate const val CHUNK_SPACE = -1\n\npublic fun String.hexToBytes(): ByteArray {\n    val array = ByteArray(countHexBytes())\n    forEachHexChunkIndexed { index, char1, char2 ->\n        array[index] = Byte.parseFromHexChunk(char1, char2)\n    }\n    return array\n}\n\n@OptIn(ExperimentalUnsignedTypes::class)\npublic fun String.hexToUBytes(): UByteArray {\n    val array = UByteArray(countHexBytes())\n    forEachHexChunkIndexed { index, char1, char2 ->\n        array[index] = Byte.parseFromHexChunk(char1, char2).toUByte()\n    }\n    return array\n}\n\npublic fun Byte.Companion.parseFromHexChunk(char1: Char, char2: Char): Byte {\n    return (char1.digitToInt(16).shl(SIZE_BITS / 2) or char2.digitToInt(16)).toByte()\n}\n\nprivate inline fun String.forEachHexChunkIndexed(block: (index: Int, char1: Char, char2: Char) -> Unit) {\n    var index = 0\n    forEachHexChunk { char1: Char, char2: Char ->\n        block(index++, char1, char2)\n    }\n}\n\nprivate inline fun String.forEachHexChunk(block: (char1: Char, char2: Char) -> Unit) {\n    var chunkSize = 0\n    var char1: Char = 0.toChar()\n    for ((index, c) in this.withIndex()) { // compiler optimization\n        if (c == ' ') {\n            if (chunkSize != 0) {\n                throw IllegalArgumentException(\"Invalid size of chunk at index ${index.minus(1)}\")\n            }\n            continue\n        }\n        if (c in 'a'..'f' || c in 'A'..'F' || c in '0'..'9') { // compiler optimization\n            when (chunkSize) {\n                0 -> {\n                    chunkSize = 1\n                    char1 = c\n                }\n                1 -> {\n                    block(char1, c)\n                    chunkSize = 0\n                }\n            }\n        } else {\n            throw IllegalArgumentException(\"Invalid char '$c' at index $index\")\n        }\n    }\n    if (chunkSize != 0) {\n        throw IllegalArgumentException(\"Invalid size of chunk at end of string\")\n    }\n}\n\npublic fun String.countHexBytes(): Int {\n    var chunkSize = 0\n    var count = 0\n    for ((index, c) in this.withIndex()) {\n        if (c == ' ') {\n            if (chunkSize != 0) {\n                throw IllegalArgumentException(\"Invalid size of chunk at index ${index.minus(1)}\")\n            }\n            continue\n        }\n        if (c in 'a'..'f' || c in 'A'..'F' || c in '0'..'9') {\n            when (chunkSize) {\n                0 -> {\n                    chunkSize = 1\n                }\n                1 -> {\n                    count++\n                    chunkSize = 0\n                }\n            }\n        } else {\n            throw IllegalArgumentException(\"Invalid char '$c' at index $index\")\n        }\n    }\n    if (chunkSize != 0) {\n        throw IllegalArgumentException(\"Invalid size of chunk at end of string\")\n    }\n    return count\n}\n"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/CoroutineUtils.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\n@file:JvmName(\"CoroutineUtilsKt_common\")\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.sync.Semaphore\nimport kotlinx.coroutines.sync.withPermit\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\nimport kotlin.jvm.JvmName\n\npublic expect suspend inline fun <R> runBIO(\n    noinline block: () -> R,\n): R\n\npublic expect suspend inline fun <T, R> T.runBIO(\n    crossinline block: T.() -> R,\n): R\n\npublic inline fun CoroutineScope.launchWithPermit(\n    semaphore: Semaphore,\n    coroutineContext: CoroutineContext = EmptyCoroutineContext,\n    crossinline block: suspend () -> Unit,\n): Job {\n    return launch(coroutineContext) {\n        semaphore.withPermit { block() }\n    }\n}\n\n/**\n * Creates a child scope of the receiver scope.\n */\npublic fun CoroutineScope.childScope(\n    coroutineContext: CoroutineContext = EmptyCoroutineContext,\n): CoroutineScope = this.coroutineContext.childScope(coroutineContext)\n\n/**\n * Creates a child scope of the receiver context scope.\n */\npublic fun CoroutineContext.childScope(\n    coroutineContext: CoroutineContext = EmptyCoroutineContext,\n): CoroutineScope = CoroutineScope(this.childScopeContext(coroutineContext))\n\n/**\n * Creates a child scope of the receiver context scope.\n */\npublic fun CoroutineContext.childScopeContext(\n    coroutineContext: CoroutineContext = EmptyCoroutineContext,\n): CoroutineContext {\n    val ctx = this + coroutineContext\n    val job = ctx[Job] ?: return ctx + SupervisorJob()\n    return ctx + SupervisorJob(job)\n}\n\npublic inline fun <E : U, U : CoroutineContext.Element> CoroutineContext.getOrElse(\n    key: CoroutineContext.Key<E>,\n    default: () -> U,\n): U = this[key] ?: default()\n\npublic inline fun <E : CoroutineContext.Element> CoroutineContext.addIfAbsent(\n    key: CoroutineContext.Key<E>,\n    default: () -> CoroutineContext.Element,\n): CoroutineContext = if (this[key] == null) this + default() else this\n\npublic inline fun CoroutineContext.addNameIfAbsent(\n    name: () -> String,\n): CoroutineContext = addIfAbsent(CoroutineName) { CoroutineName(name()) }\n\npublic fun CoroutineContext.addNameHierarchically(\n    name: String,\n): CoroutineContext = this + CoroutineName(this[CoroutineName]?.name?.plus('.')?.plus(name) ?: name)\n\npublic fun CoroutineContext.hierarchicalName(\n    name: String,\n): CoroutineName = CoroutineName(this[CoroutineName]?.name?.plus('.')?.plus(name) ?: name)\n\npublic fun CoroutineScope.hierarchicalName(\n    name: String,\n): CoroutineName = this.coroutineContext.hierarchicalName(name)\n\npublic fun CoroutineContext.newCoroutineContextWithSupervisorJob(name: String? = null): CoroutineContext =\n    this + CoroutineName(name ?: \"<unnamed>\") + SupervisorJob(this[Job])\n\npublic fun CoroutineScope.childScope(\n    name: String? = null,\n    context: CoroutineContext = EmptyCoroutineContext\n): CoroutineScope =\n    CoroutineScope(this.childScopeContext(name, context))\n\npublic fun CoroutineContext.childScope(\n    name: String? = null,\n    context: CoroutineContext = EmptyCoroutineContext\n): CoroutineScope =\n    CoroutineScope(this.childScopeContext(name, context))\n\npublic fun CoroutineScope.childScopeContext(\n    name: String? = null,\n    context: CoroutineContext = EmptyCoroutineContext\n): CoroutineContext =\n    this.coroutineContext.childScopeContext(name, context)\n\npublic fun CoroutineContext.childScopeContext(\n    name: String? = null,\n    context: CoroutineContext = EmptyCoroutineContext\n): CoroutineContext =\n    this.newCoroutineContextWithSupervisorJob(name) + context.let {\n        if (name != null) it + CoroutineName(name)\n        else it\n    }\n\npublic fun Throwable.unwrapCancellationException(addSuppressed: Boolean = true): Throwable =\n    unwrap<CancellationException>(addSuppressed)\n\n/**\n * For code\n * ```\n * try {\n *   job(new)\n * } catch (e: Throwable) {\n *   throw IllegalStateException(\"Exception in attached Job '$name'\", e.unwrapCancellationException())\n * }\n * ```\n *\n * Original stacktrace, you mainly see `StateSwitchingException` which is useless to locate the code where real cause `ForceOfflineException` is thrown.\n * ```\n * Exception in thread \"DefaultDispatcher-worker-1 @BotInitProcessor.init#7\" java.lang.IllegalStateException: Exception in attached Job 'BotInitProcessor.init'\n *   at net.mamoe.mirai.internal.network.handler.state.JobAttachStateObserver$stateChanged0$1.invokeSuspend(JobAttachStateObserver.kt:40)\n *   at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)\n *   at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)\n *   at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)\n *   at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)\n *   at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)\n *   at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)\n * Caused by: StateSwitchingException(old=StateLoading, new=StateClosed, cause=net.mamoe.mirai.internal.network.impl.netty.ForceOfflineException: Closed by MessageSvc.PushForceOffline: net.mamoe.mirai.internal.network.protocol.data.jce.RequestPushForceOffline@4abf6d30)\n *   at net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport.setStateImpl$mirai_core(NetworkHandlerSupport.kt:258)\n *   at net.mamoe.mirai.internal.network.impl.netty.NettyNetworkHandler.close(NettyNetworkHandler.kt:404)\n * ```\n *\n * Real stacktrace (with [unwrapCancellationException]), you directly have `ForceOfflineException`, also you wont lose information of `StateSwitchingException`\n * ```\n * Exception in thread \"DefaultDispatcher-worker-2 @BotInitProcessor.init#7\" java.lang.IllegalStateException: Exception in attached Job 'BotInitProcessor.init'\n *   at net.mamoe.mirai.internal.network.handler.state.JobAttachStateObserver$stateChanged0$1.invokeSuspend(JobAttachStateObserver.kt:40)\n *   at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)\n *   at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)\n *   at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)\n *   at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)\n *   at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)\n *   at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)\n * Caused by: net.mamoe.mirai.internal.network.impl.netty.ForceOfflineException: Closed by MessageSvc.PushForceOffline: net.mamoe.mirai.internal.network.protocol.data.jce.RequestPushForceOffline@62f65f94\n *   at net.mamoe.mirai.utils.MiraiUtils__CoroutineUtilsKt.unwrapCancellationException(CoroutineUtils.kt:141)\n *   at net.mamoe.mirai.utils.MiraiUtils.unwrapCancellationException(Unknown Source)\n *   ... 7 more\n *   Suppressed: StateSwitchingException(old=StateLoading, new=StateClosed, cause=net.mamoe.mirai.internal.network.impl.netty.ForceOfflineException: Closed by MessageSvc.PushForceOffline: net.mamoe.mirai.internal.network.protocol.data.jce.RequestPushForceOffline@62f65f94)\n *     at net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport.setStateImpl$mirai_core(NetworkHandlerSupport.kt:258)\n *     at net.mamoe.mirai.internal.network.impl.netty.NettyNetworkHandler.close(NettyNetworkHandler.kt:404)\n * ```\n */\n@Suppress(\"unused\")\npublic expect inline fun <reified E> Throwable.unwrap(addSuppressed: Boolean = true): Throwable\n\npublic val CoroutineContext.coroutineName: String get() = this[CoroutineName]?.name ?: \"unnamed\""
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/Either.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\", \"unused\")\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.jvm.JvmField\nimport kotlin.jvm.JvmInline\nimport kotlin.jvm.JvmName\n\n/**\n * Safe union of two types.\n */\n@JvmInline\npublic value class Either<out L : Any, out R : Any?> private constructor(\n    @PublishedApi\n    @JvmField\n    internal val value: Any?,\n) {\n    override fun toString(): String = value.toString()\n\n    public companion object {\n        ///////////////////////////////////////////////////////////////////////////\n        // constructors\n        ///////////////////////////////////////////////////////////////////////////\n\n        @PublishedApi\n        internal object CheckedTypes\n\n        @PublishedApi\n        internal fun <L : Any, R> CheckedTypes.new(value: Any?): Either<L, R> = Either(value)\n\n        @PublishedApi\n        internal inline fun <reified L, reified R> checkTypes(value: Any?): CheckedTypes {\n            if (!(value is R).xor(value is L)) {\n                throw IllegalArgumentException(\"value(${getTypeHint(value)}) must be either L(${getTypeHint<L>()}) or R(${getTypeHint<R>()}), and must not be both of them.\")\n            }\n            return CheckedTypes\n        }\n\n        /**\n         * Create a [Either] whose value is [left].\n         * @throws IllegalArgumentException if [left] satisfies both types [L] and [R].\n         */\n        @JvmName(\"left1\")\n        @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n        @kotlin.internal.LowPriorityInOverloadResolution\n        public inline operator fun <reified L : Any, reified R> invoke(left: L): Either<L, R> =\n            checkTypes<L, R>(left).new(left)\n\n        /**\n         * Create a [Either] whose value is [right].\n         * @throws IllegalArgumentException if [right] satisfies both types [L] and [R].\n         */\n        @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n        @kotlin.internal.LowPriorityInOverloadResolution\n        @JvmName(\"right1\")\n        public inline operator fun <reified L : Any, reified R> invoke(right: R): Either<L, R> =\n            checkTypes<L, R>(right).new(right)\n\n        /**\n         * Create a [Either] whose value is [left].\n         * @throws IllegalArgumentException if [left] satisfies both types [L] and [R].\n         */\n        @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n        public inline fun <reified L : Any, reified R> left(left: L): Either<L, R> =\n            checkTypes<L, R>(left).new(left)\n\n        /**\n         * Create a [Either] whose value is [right].\n         * @throws IllegalArgumentException if [right] satisfies both types [L] and [R].\n         */\n        @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n        public inline fun <reified L : Any, reified R> right(right: R): Either<L, R> =\n            checkTypes<L, R>(right).new(right)\n\n\n        ///////////////////////////////////////////////////////////////////////////\n        // functions\n        ///////////////////////////////////////////////////////////////////////////\n\n\n        public inline val <L : Any, reified R> Either<L, R>.rightOrNull: R? get() = value.safeCast()\n        public inline val <L : Any, reified R> Either<L, R>.right: R get() = value.cast()\n\n        public inline val <reified L : Any, R> Either<L, R>.leftOrNull: L? get() = value.safeCast()\n        public inline val <reified L : Any, R> Either<L, R>.left: L get() = value.cast()\n\n        public inline val <reified L : Any, R> Either<L, R>.isLeft: Boolean get() = value is L\n        public inline val <L : Any, reified R> Either<L, R>.isRight: Boolean get() = value is R\n\n\n        public inline fun <reified L : Any, reified R, T> Either<L, R>.ifLeft(block: (L) -> T): T? =\n            this.leftOrNull?.let(block)\n\n        public inline fun <L : Any, reified R, T> Either<L, R>.ifRight(block: (R) -> T): T? =\n            this.rightOrNull?.let(block)\n\n\n        public inline fun <reified L : Any, reified R> Either<L, R>.onLeft(block: (L) -> Unit): Either<L, R> {\n            this.leftOrNull?.let(block)\n            return this\n        }\n\n        public inline fun <L : Any, reified R> Either<L, R>.onRight(block: (R) -> Unit): Either<L, R> {\n            this.rightOrNull?.let(block)\n            return this\n        }\n\n\n        public inline fun <reified L : Any, reified R, reified T : Any> Either<L, R>.mapLeft(block: (L) -> T): Either<T, R> {\n            @Suppress(\"RemoveExplicitTypeArguments\")\n            return this.fold(\n                onLeft = { invoke<T, R>(block(it)) },\n                onRight = { invoke<T, R>(it) }\n            )\n        }\n\n        public inline fun <reified L : Any, reified R, reified T : Any> Either<L, R>.mapRight(block: (R) -> T): Either<L, T> {\n            @Suppress(\"RemoveExplicitTypeArguments\")\n            return this.fold(\n                onLeft = { invoke<L, T>(it) },\n                onRight = { invoke<L, T>(it.let(block)) }\n            )\n        }\n\n\n        public inline fun <reified L : Any, reified R, T> Either<L, R>.fold(\n            onLeft: (L) -> T,\n            onRight: (R) -> T,\n        ): T = leftOrNull?.let { onLeft(it) } ?: value.cast<R>().let(onRight)\n\n        public inline fun <reified T> Either<Throwable, T>.toResult(): Result<T> = this.fold(\n            onLeft = { Result.failure(it) },\n            onRight = { Result.success(it) }\n        )\n\n        /**\n         * Invoke and return [block] if the backing value of this [Either] is null. Returns `this` otherwise.\n         */\n        public inline fun <reified L : SuperL, reified R : SuperR, SuperL : Any, SuperR> Either<L, R?>.flatMapNull(\n            block: () -> Either<SuperL, SuperR?>\n        ): Either<SuperL, SuperR?> {\n            if (this.leftOrNull == null && this.rightOrNull == null) {\n                return block()\n            }\n            return this\n        }\n\n        @PublishedApi\n        internal fun getTypeHint(value: Any?): String {\n            return if (value == null) \"null\"\n            else value::class.run { simpleName ?: toString() }\n        }\n\n        @PublishedApi\n        internal inline fun <reified T> getTypeHint(): String {\n            return T::class.run { simpleName ?: toString() }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/ExceptionCollector.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmName(\"ExceptionCollectorKt_common\")\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.Synchronized\nimport kotlin.jvm.Volatile\n\npublic open class ExceptionCollector {\n\n    public constructor()\n    public constructor(initial: Throwable?) {\n        collect(initial)\n    }\n\n    public constructor(vararg initials: Throwable?) {\n        for (initial in initials) {\n            collect(initial)\n        }\n    }\n\n    protected open fun beforeCollect(throwable: Throwable) {\n    }\n\n    @Volatile\n    private var last: Throwable? = null\n    private val hashCodes = mutableSetOf<Long>()\n    private val suppressedList = mutableListOf<Throwable>()\n\n    /**\n     * @return `true` if [e] is new.\n     */\n    @Synchronized\n    public fun collect(e: Throwable?): Boolean {\n        if (e == null) return false\n        if (!hashCodes.add(hash(e))) return false // filter out duplications\n        // we can also check suppressed exceptions of [e] but actual influence would be slight.\n        beforeCollect(e)\n        this.last?.let { addSuppressed(e, it) }\n        this.last = e\n        return true\n    }\n\n    protected open fun addSuppressed(receiver: Throwable, e: Throwable) {\n        suppressedList.add(e)\n//        receiver.addSuppressed(e)\n    }\n\n    public fun collectGet(e: Throwable?): Throwable {\n        this.collect(e)\n        return getLast()!!\n    }\n\n    /**\n     * Alias to [collect] to be used inside [withExceptionCollector]\n     * @return `true` if [e] is new.\n     */\n    public fun collectException(e: Throwable?): Boolean = collect(e)\n\n    /**\n     * Adds [suppressedList] to suppressed exceptions of [last]\n     */\n    @Synchronized\n    private fun bake() {\n        last?.let { last ->\n            for (suppressed in suppressedList.asReversed()) {\n                last.addSuppressed(suppressed)\n            }\n        }\n        suppressedList.clear()\n    }\n\n    public fun getLast(): Throwable? {\n        bake()\n        return last\n    }\n\n    @TerminalOperation // to give it a color for a clearer control flow\n    public fun collectThrow(exception: Throwable): Nothing {\n        collect(exception)\n        throw getLast()!!\n    }\n\n    @TerminalOperation\n    public fun throwLast(): Nothing {\n        throw getLast() ?: error(\"Internal error: expected at least one exception collected.\")\n    }\n\n    @DslMarker\n    private annotation class TerminalOperation\n\n    @TestOnly // very slow\n    public fun asSequence(): Sequence<Throwable> {\n        fun Throwable.itr(): Iterator<Throwable> {\n            return (sequenceOf(this) + this.suppressedExceptions.asSequence()\n                .flatMap { it.itr().asSequence() }).iterator()\n        }\n\n        val last = getLast() ?: return emptySequence()\n        return Sequence { last.itr() }\n    }\n\n    @Synchronized\n    public fun dispose() { // help gc\n        this.last = null\n        this.hashCodes.clear()\n        this.suppressedList.clear()\n    }\n\n    public companion object {\n        public fun compressExceptions(exceptions: Array<Throwable>): Throwable? {\n            return ExceptionCollector(*exceptions).getLast()\n        }\n\n        public fun compressExceptions(exception: Throwable, vararg exceptions: Throwable): Throwable {\n            return ExceptionCollector(exception, *exceptions).getLast()!!\n        }\n    }\n}\n\n/**\n * Run with a coverage of `throw`. All thrown exceptions will be caught and rethrown with [ExceptionCollector.collectThrow]\n */\npublic inline fun <R> withExceptionCollector(action: ExceptionCollector.() -> R): R {\n    contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }\n    return ExceptionCollector().run {\n        withExceptionCollector(action).also { dispose() }\n    }\n}\n\n/**\n * Run with a coverage of `throw`. All thrown exceptions will be caught and rethrown with [ExceptionCollector.collectThrow]\n */\npublic inline fun <R> ExceptionCollector.withExceptionCollector(action: ExceptionCollector.() -> R): R {\n    contract { callsInPlace(action, InvocationKind.EXACTLY_ONCE) }\n    this.run {\n        try {\n            return action()\n        } catch (e: Throwable) {\n            collectThrow(e)\n        } finally {\n            dispose()\n        }\n    }\n}\n\ninternal expect fun hash(e: Throwable): Long"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/File.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport io.ktor.utils.io.core.*\n\n/**\n * Multiplatform implementation of file operations.\n */\npublic expect interface MiraiFile {\n    /**\n     * Name of this file or directory. Can be '.' and '..' if created by\n     */\n    public val name: String\n\n    /**\n     * Parent of this file or directory.\n     */\n    public val parent: MiraiFile?\n\n    /**\n     * Input path from [create].\n     */\n    public val path: String\n\n    /**\n     * Normalized absolute [path].\n     */\n    public val absolutePath: String\n\n    public val length: Long\n\n    public val isFile: Boolean\n    public val isDirectory: Boolean\n\n    public fun exists(): Boolean\n\n    /**\n     * Resolves a [MiraiFile] representing the [path] based on this [MiraiFile]. Result path is not guaranteed to be normalized.\n     */\n    public fun resolve(path: String): MiraiFile\n    public fun resolve(file: MiraiFile): MiraiFile\n\n    public fun createNewFile(): Boolean\n    public fun delete(): Boolean\n\n    public fun mkdir(): Boolean\n    public fun mkdirs(): Boolean\n\n    public fun input(): Input\n    public fun output(): Output\n\n    public companion object {\n        public fun create(path: String): MiraiFile\n\n        public fun getWorkingDir(): MiraiFile\n    }\n\n}\n\npublic expect fun MiraiFile.deleteRecursively(): Boolean\n\npublic fun MiraiFile.writeBytes(data: ByteArray) {\n    return output().use { it.writeFully(data) }\n}\n\npublic fun MiraiFile.writeText(text: String) {\n    return output().use { it.writeText(text) }\n}\n\npublic fun MiraiFile.readText(): String {\n    return input().use { it.readAllText() }\n}\n\npublic fun MiraiFile.readBytes(): ByteArray {\n    return input().use { it.readBytes() }\n}\n\n\npublic fun MiraiFile.createFileIfNotExists() {\n    if (!this.exists()) {\n        this.parent?.mkdirs()\n        this.createNewFile()\n    }\n}\n\npublic fun MiraiFile.resolveCreateFile(relative: String): MiraiFile =\n    this.resolve(relative).apply { createFileIfNotExists() }\n\npublic fun MiraiFile.resolveCreateFile(relative: MiraiFile): MiraiFile =\n    this.resolve(relative).apply { createFileIfNotExists() }\n\npublic fun MiraiFile.resolveMkdir(relative: String): MiraiFile = this.resolve(relative).apply { mkdirs() }\npublic fun MiraiFile.resolveMkdir(relative: MiraiFile): MiraiFile = this.resolve(relative).apply { mkdirs() }\n\npublic fun MiraiFile.touch(): MiraiFile = apply {\n    parent?.mkdirs()\n    createNewFile()\n}\n"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/Files.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MiraiUtils\")\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\nprivate class FileType(\n    signature: String,\n    val requiredHeaderSize: Int,\n    val formatName: String\n) {\n    val signatureRegex = Regex(signature, RegexOption.IGNORE_CASE)\n}\n\n/**\n * 文件头和文件类型列表\n */\nprivate val FILE_TYPES: List<FileType> = listOf(\n    FileType(\"^FFD8FF\", 3, \"jpg\"),\n    FileType(\"^89504E47\", 4, \"png\"),\n    FileType(\"^47494638\", 4, \"gif\"),\n    FileType(\"^424D\", 3, \"bmp\"),\n    FileType(\"^2321414D52\", 5, \"amr\"),\n    FileType(\"^02232153494C4B5F5633\", 10, \"silk\"),\n    FileType(\"^([a-zA-Z0-9]{8})66747970\", 8, \"mp4\"),\n\n    //\"49492A00\" to \"tif\", // client doesn't support\n    //\"52494646\" to \"webp\", // pc client doesn't support\n    // \"57415645\" to \"wav\", // server doesn't support\n)\n\n/**\n * 在 [getFileType] 需要的 [ByteArray] 长度\n */\npublic val COUNT_BYTES_USED_FOR_DETECTING_FILE_TYPE: Int by lazy { FILE_TYPES.maxOf { it.requiredHeaderSize } }\n\n/*\n\n        startsWith(\"FFD8\") -> \"jpg\"\n        startsWith(\"89504E47\") -> \"png\"\n        startsWith(\"47494638\") -> \"gif\"\n        startsWith(\"424D\") -> \"bmp\"\n */\n\n/**\n * 根据文件头获取文件类型\n */\npublic fun getFileType(fileHeader: ByteArray): String? {\n    val hex = fileHeader.toUHexString(\n        \"\",\n        length = COUNT_BYTES_USED_FOR_DETECTING_FILE_TYPE.coerceAtMost(fileHeader.size)\n    )\n    FILE_TYPES.forEach { t ->\n        if (hex.contains(t.signatureRegex)) {\n            return t.formatName\n        }\n    }\n    return null\n}"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/HtmlEntity.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\n@Suppress(\"RegExpRedundantEscape\")\nprivate val STR_TO_CHAR_PATTERN = \"\"\"\\&(\\#?[A-Za-z0-9]+?)\\;\"\"\".toRegex()\n\npublic fun String.decodeHtmlEscape(): String = replace(STR_TO_CHAR_PATTERN) { match ->\n    STR_TO_CHAR_MAPPINGS[match.value]?.let { return@replace it }\n    val match1 = match.groups[1]!!.value\n    if (match1.length > 1 && match1[0] == '#') {\n        if (match1.length > 2) {\n            if (match1[1] == 'x') { // hex\n                match1.substring(2).toIntOrNull(16)?.let {\n                    return@replace it.toChar().toString()\n                }\n            }\n        }\n        match1.substring(1).toIntOrNull()?.let {\n            return@replace it.toChar().toString()\n        }\n    }\n\n    match.value\n}\n\npublic fun String.encodeHtmlEscape(): String = buildString(length) {\n    this@encodeHtmlEscape.forEach { c ->\n        if (needDoHtmlEscape(c)) {\n            append(\"&#\").append(c.code).append(';')\n        } else {\n            append(c)\n        }\n    }\n}\n\nprivate fun needDoHtmlEscape(c: Char): Boolean {\n    if (c.code < 32) return true // Ascii control codes\n\n    if (c in \"#@!~$%^&*()<>/\\\\\\\"'\") return true\n    return false\n}\n\n\nprivate val STR_TO_CHAR_MAPPINGS: Map<String, String> by lazy {\n//<editor-fold defaultstate=\"collapsed\" desc=\"Generated Code\">\n    val result = HashMap<String, String>(223)\n    result[\"&amp;\"] = \"\\u0026\"\n    result[\"&lt;\"] = \"\\u003c\"\n    result[\"&gt;\"] = \"\\u003e\"\n    result[\"&nbsp;\"] = \"\\u00a0\"\n    result[\"&iexcl;\"] = \"\\u00a1\"\n    result[\"&cent;\"] = \"\\u00a2\"\n    result[\"&pound;\"] = \"\\u00a3\"\n    result[\"&curren;\"] = \"\\u00a4\"\n    result[\"&yen;\"] = \"\\u00a5\"\n    result[\"&brvbar;\"] = \"\\u00a6\"\n    result[\"&sect;\"] = \"\\u00a7\"\n    result[\"&uml;\"] = \"\\u00a8\"\n    result[\"&copy;\"] = \"\\u00a9\"\n    result[\"&ordf;\"] = \"\\u00aa\"\n    result[\"&laquo;\"] = \"\\u00ab\"\n    result[\"&not;\"] = \"\\u00ac\"\n    result[\"&shy;\"] = \"\\u00ad\"\n    result[\"&reg;\"] = \"\\u00ae\"\n    result[\"&macr;\"] = \"\\u00af\"\n    result[\"&deg;\"] = \"\\u00b0\"\n    result[\"&plusmn;\"] = \"\\u00b1\"\n    result[\"&sup2;\"] = \"\\u00b2\"\n    result[\"&sup3;\"] = \"\\u00b3\"\n    result[\"&acute;\"] = \"\\u00b4\"\n    result[\"&micro;\"] = \"\\u00b5\"\n    result[\"&para;\"] = \"\\u00b6\"\n    result[\"&middot;\"] = \"\\u00b7\"\n    result[\"&cedil;\"] = \"\\u00b8\"\n    result[\"&sup1;\"] = \"\\u00b9\"\n    result[\"&ordm;\"] = \"\\u00ba\"\n    result[\"&raquo;\"] = \"\\u00bb\"\n    result[\"&frac14;\"] = \"\\u00bc\"\n    result[\"&frac12;\"] = \"\\u00bd\"\n    result[\"&frac34;\"] = \"\\u00be\"\n    result[\"&iquest;\"] = \"\\u00bf\"\n    result[\"&Agrave;\"] = \"\\u00c0\"\n    result[\"&Aacute;\"] = \"\\u00c1\"\n    result[\"&Acirc;\"] = \"\\u00c2\"\n    result[\"&Atilde;\"] = \"\\u00c3\"\n    result[\"&Auml;\"] = \"\\u00c4\"\n    result[\"&Aring;\"] = \"\\u00c5\"\n    result[\"&AElig;\"] = \"\\u00c6\"\n    result[\"&Ccedil;\"] = \"\\u00c7\"\n    result[\"&Egrave;\"] = \"\\u00c8\"\n    result[\"&Eacute;\"] = \"\\u00c9\"\n    result[\"&Ecirc;\"] = \"\\u00ca\"\n    result[\"&Euml;\"] = \"\\u00cb\"\n    result[\"&Igrave;\"] = \"\\u00cc\"\n    result[\"&Iacute;\"] = \"\\u00cd\"\n    result[\"&Icirc;\"] = \"\\u00ce\"\n    result[\"&Iuml;\"] = \"\\u00cf\"\n    result[\"&ETH;\"] = \"\\u00d0\"\n    result[\"&Ntilde;\"] = \"\\u00d1\"\n    result[\"&Ograve;\"] = \"\\u00d2\"\n    result[\"&Oacute;\"] = \"\\u00d3\"\n    result[\"&Ocirc;\"] = \"\\u00d4\"\n    result[\"&Otilde;\"] = \"\\u00d5\"\n    result[\"&Ouml;\"] = \"\\u00d6\"\n    result[\"&times;\"] = \"\\u00d7\"\n    result[\"&Oslash;\"] = \"\\u00d8\"\n    result[\"&Ugrave;\"] = \"\\u00d9\"\n    result[\"&Uacute;\"] = \"\\u00da\"\n    result[\"&Ucirc;\"] = \"\\u00db\"\n    result[\"&Uuml;\"] = \"\\u00dc\"\n    result[\"&Yacute;\"] = \"\\u00dd\"\n    result[\"&THORN;\"] = \"\\u00de\"\n    result[\"&szlig;\"] = \"\\u00df\"\n    result[\"&agrave;\"] = \"\\u00e0\"\n    result[\"&aacute;\"] = \"\\u00e1\"\n    result[\"&acirc;\"] = \"\\u00e2\"\n    result[\"&atilde;\"] = \"\\u00e3\"\n    result[\"&auml;\"] = \"\\u00e4\"\n    result[\"&aring;\"] = \"\\u00e5\"\n    result[\"&aelig;\"] = \"\\u00e6\"\n    result[\"&ccedil;\"] = \"\\u00e7\"\n    result[\"&egrave;\"] = \"\\u00e8\"\n    result[\"&eacute;\"] = \"\\u00e9\"\n    result[\"&ecirc;\"] = \"\\u00ea\"\n    result[\"&euml;\"] = \"\\u00eb\"\n    result[\"&igrave;\"] = \"\\u00ec\"\n    result[\"&iacute;\"] = \"\\u00ed\"\n    result[\"&icirc;\"] = \"\\u00ee\"\n    result[\"&iuml;\"] = \"\\u00ef\"\n    result[\"&eth;\"] = \"\\u00f0\"\n    result[\"&ntilde;\"] = \"\\u00f1\"\n    result[\"&ograve;\"] = \"\\u00f2\"\n    result[\"&oacute;\"] = \"\\u00f3\"\n    result[\"&ocirc;\"] = \"\\u00f4\"\n    result[\"&otilde;\"] = \"\\u00f5\"\n    result[\"&ouml;\"] = \"\\u00f6\"\n    result[\"&divide;\"] = \"\\u00f7\"\n    result[\"&oslash;\"] = \"\\u00f8\"\n    result[\"&ugrave;\"] = \"\\u00f9\"\n    result[\"&uacute;\"] = \"\\u00fa\"\n    result[\"&ucirc;\"] = \"\\u00fb\"\n    result[\"&uuml;\"] = \"\\u00fc\"\n    result[\"&yacute;\"] = \"\\u00fd\"\n    result[\"&thorn;\"] = \"\\u00fe\"\n    result[\"&yuml;\"] = \"\\u00ff\"\n    result[\"&fnof;\"] = \"\\u0192\"\n    result[\"&Alpha;\"] = \"\\u0391\"\n    result[\"&Beta;\"] = \"\\u0392\"\n    result[\"&Gamma;\"] = \"\\u0393\"\n    result[\"&Delta;\"] = \"\\u0394\"\n    result[\"&Epsilon;\"] = \"\\u0395\"\n    result[\"&Zeta;\"] = \"\\u0396\"\n    result[\"&Eta;\"] = \"\\u0397\"\n    result[\"&Theta;\"] = \"\\u0398\"\n    result[\"&Iota;\"] = \"\\u0399\"\n    result[\"&Kappa;\"] = \"\\u039a\"\n    result[\"&Lambda;\"] = \"\\u039b\"\n    result[\"&Mu;\"] = \"\\u039c\"\n    result[\"&Nu;\"] = \"\\u039d\"\n    result[\"&Xi;\"] = \"\\u039e\"\n    result[\"&Omicron;\"] = \"\\u039f\"\n    result[\"&Pi;\"] = \"\\u03a0\"\n    result[\"&Rho;\"] = \"\\u03a1\"\n    result[\"&Sigma;\"] = \"\\u03a3\"\n    result[\"&Tau;\"] = \"\\u03a4\"\n    result[\"&Upsilon;\"] = \"\\u03a5\"\n    result[\"&Phi;\"] = \"\\u03a6\"\n    result[\"&Chi;\"] = \"\\u03a7\"\n    result[\"&Psi;\"] = \"\\u03a8\"\n    result[\"&Omega;\"] = \"\\u03a9\"\n    result[\"&alpha;\"] = \"\\u03b1\"\n    result[\"&beta;\"] = \"\\u03b2\"\n    result[\"&gamma;\"] = \"\\u03b3\"\n    result[\"&delta;\"] = \"\\u03b4\"\n    result[\"&epsilon;\"] = \"\\u03b5\"\n    result[\"&zeta;\"] = \"\\u03b6\"\n    result[\"&eta;\"] = \"\\u03b7\"\n    result[\"&theta;\"] = \"\\u03b8\"\n    result[\"&iota;\"] = \"\\u03b9\"\n    result[\"&kappa;\"] = \"\\u03ba\"\n    result[\"&lambda;\"] = \"\\u03bb\"\n    result[\"&mu;\"] = \"\\u03bc\"\n    result[\"&nu;\"] = \"\\u03bd\"\n    result[\"&xi;\"] = \"\\u03be\"\n    result[\"&omicron;\"] = \"\\u03bf\"\n    result[\"&pi;\"] = \"\\u03c0\"\n    result[\"&rho;\"] = \"\\u03c1\"\n    result[\"&sigmaf;\"] = \"\\u03c2\"\n    result[\"&sigma;\"] = \"\\u03c3\"\n    result[\"&tau;\"] = \"\\u03c4\"\n    result[\"&upsilon;\"] = \"\\u03c5\"\n    result[\"&phi;\"] = \"\\u03c6\"\n    result[\"&chi;\"] = \"\\u03c7\"\n    result[\"&psi;\"] = \"\\u03c8\"\n    result[\"&omega;\"] = \"\\u03c9\"\n    result[\"&thetasym;\"] = \"\\u03d1\"\n    result[\"&upsih;\"] = \"\\u03d2\"\n    result[\"&piv;\"] = \"\\u03d6\"\n    result[\"&bull;\"] = \"\\u2022\"\n    result[\"&hellip;\"] = \"\\u2026\"\n    result[\"&prime;\"] = \"\\u2032\"\n    result[\"&Prime;\"] = \"\\u2033\"\n    result[\"&oline;\"] = \"\\u203e\"\n    result[\"&frasl;\"] = \"\\u2044\"\n    result[\"&weierp;\"] = \"\\u2118\"\n    result[\"&image;\"] = \"\\u2111\"\n    result[\"&real;\"] = \"\\u211c\"\n    result[\"&trade;\"] = \"\\u2122\"\n    result[\"&alefsym;\"] = \"\\u2135\"\n    result[\"&larr;\"] = \"\\u2190\"\n    result[\"&uarr;\"] = \"\\u2191\"\n    result[\"&rarr;\"] = \"\\u2192\"\n    result[\"&darr;\"] = \"\\u2193\"\n    result[\"&harr;\"] = \"\\u2194\"\n    result[\"&crarr;\"] = \"\\u21b5\"\n    result[\"&lArr;\"] = \"\\u21d0\"\n    result[\"&uArr;\"] = \"\\u21d1\"\n    result[\"&rArr;\"] = \"\\u21d2\"\n    result[\"&dArr;\"] = \"\\u21d3\"\n    result[\"&hArr;\"] = \"\\u21d4\"\n    result[\"&forall;\"] = \"\\u2200\"\n    result[\"&part;\"] = \"\\u2202\"\n    result[\"&exist;\"] = \"\\u2203\"\n    result[\"&empty;\"] = \"\\u2205\"\n    result[\"&nabla;\"] = \"\\u2207\"\n    result[\"&isin;\"] = \"\\u2208\"\n    result[\"&notin;\"] = \"\\u2209\"\n    result[\"&ni;\"] = \"\\u220b\"\n    result[\"&prod;\"] = \"\\u220f\"\n    result[\"&sum;\"] = \"\\u2211\"\n    result[\"&minus;\"] = \"\\u2212\"\n    result[\"&lowast;\"] = \"\\u2217\"\n    result[\"&radic;\"] = \"\\u221a\"\n    result[\"&prop;\"] = \"\\u221d\"\n    result[\"&infin;\"] = \"\\u221e\"\n    result[\"&ang;\"] = \"\\u2220\"\n    result[\"&and;\"] = \"\\u2227\"\n    result[\"&or;\"] = \"\\u2228\"\n    result[\"&cap;\"] = \"\\u2229\"\n    result[\"&cup;\"] = \"\\u222a\"\n    result[\"&int;\"] = \"\\u222b\"\n    result[\"&there4;\"] = \"\\u2234\"\n    result[\"&sim;\"] = \"\\u223c\"\n    result[\"&cong;\"] = \"\\u2245\"\n    result[\"&asymp;\"] = \"\\u2248\"\n    result[\"&ne;\"] = \"\\u2260\"\n    result[\"&equiv;\"] = \"\\u2261\"\n    result[\"&le;\"] = \"\\u2264\"\n    result[\"&ge;\"] = \"\\u2265\"\n    result[\"&sub;\"] = \"\\u2282\"\n    result[\"&sup;\"] = \"\\u2283\"\n    result[\"&nsub;\"] = \"\\u2284\"\n    result[\"&sube;\"] = \"\\u2286\"\n    result[\"&supe;\"] = \"\\u2287\"\n    result[\"&oplus;\"] = \"\\u2295\"\n    result[\"&otimes;\"] = \"\\u2297\"\n    result[\"&perp;\"] = \"\\u22a5\"\n    result[\"&sdot;\"] = \"\\u22c5\"\n    result[\"&lceil;\"] = \"\\u2308\"\n    result[\"&rceil;\"] = \"\\u2309\"\n    result[\"&lfloor;\"] = \"\\u230a\"\n    result[\"&rfloor;\"] = \"\\u230b\"\n    result[\"&lang;\"] = \"\\u2329\"\n    result[\"&rang;\"] = \"\\u232a\"\n    result[\"&loz;\"] = \"\\u25ca\"\n    result[\"&spades;\"] = \"\\u2660\"\n    result[\"&clubs;\"] = \"\\u2663\"\n    result[\"&hearts;\"] = \"\\u2665\"\n    result[\"&diams;\"] = \"\\u2666\"\n//</editor-fold>\n    result\n}\n\n"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/IO.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MiraiUtils\")\n\npackage net.mamoe.mirai.utils\n\nimport io.ktor.utils.io.*\nimport io.ktor.utils.io.charsets.*\nimport io.ktor.utils.io.core.*\nimport io.ktor.utils.io.core.internal.*\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmSynthetic\n\npublic val EMPTY_BYTE_ARRAY: ByteArray = ByteArray(0)\n\npublic val DECRYPTER_16_ZERO: ByteArray = ByteArray(16)\npublic val KEY_16_ZEROS: ByteArray = ByteArray(16)\n\n/**\n * It's caller's responsibility to close the input\n */\npublic inline fun <R> ByteReadPacket.useBytes(\n    n: Int = remaining.toIntOrFail(),\n    block: (data: ByteArray, length: Int) -> R\n): R = ByteArrayPool.useInstance(n) {\n    this.readFully(it, 0, n)\n    block(it, n)\n}\n\n\n/**\n * It's caller's responsibility to close the input\n */\npublic inline fun <R> Input.useBytes(\n    n: Int? = null,\n    block: (data: ByteArray, length: Int) -> R\n): R {\n    return when {\n        n != null -> {\n            this.readBytes(n).let { block(it, it.size) }\n        }\n\n        this is ByteReadPacket -> {\n            val count = this.remaining.toIntOrFail()\n            ByteArrayPool.useInstance(count) {\n                this.readFully(it, 0, count)\n                block(it, count)\n            }\n        }\n\n        else -> {\n            this.readBytes().let { block(it, it.size) }\n        }\n    }\n}\n\npublic fun Long.toIntOrFail(): Int {\n    if (this >= Int.MAX_VALUE || this <= Int.MIN_VALUE) {\n        throw IllegalArgumentException(\"$this does not fit in Int range\")\n    }\n    return this.toInt()\n}\n\npublic fun ByteReadPacket.readPacketExact(\n    n: Int = remaining.toIntOrFail()\n): ByteReadPacket = this.readBytes(n).toReadPacket()\n\n\npublic fun Input.readAllText(): String = Charsets.UTF_8.newDecoder().decode(this)\n\npublic fun Input.readString(length: Int, charset: Charset = Charsets.UTF_8): String =\n    String(this.readBytes(length), charset = charset) // stdlib\n\npublic fun Input.readString(length: Long, charset: Charset = Charsets.UTF_8): String =\n    String(this.readBytes(length.toInt()), charset = charset)\n\npublic fun Input.readString(length: Short, charset: Charset = Charsets.UTF_8): String =\n    String(this.readBytes(length.toInt()), charset = charset)\n\n@JvmSynthetic\npublic fun Input.readString(length: UShort, charset: Charset = Charsets.UTF_8): String =\n    String(this.readBytes(length.toInt()), charset = charset)\n\npublic fun Input.readString(length: Byte, charset: Charset = Charsets.UTF_8): String =\n    String(this.readBytes(length.toInt()), charset = charset)\n\npublic fun Input.readUShortLVString(): String = String(this.readUShortLVByteArray())\npublic fun Input.readUShortLVByteArray(): ByteArray = this.readBytes(this.readShort().toUShort().toInt())\n\npublic suspend fun Input.copyTo(output: ByteWriteChannel): Long {\n    val buffer = ChunkBuffer.Pool.borrow()\n    var copied = 0L\n\n    try {\n        do {\n            buffer.resetForWrite()\n            val rc = readAvailable(buffer)\n            if (rc == -1) break\n            copied += rc\n            output.writeFully(buffer)\n        } while (true)\n\n        return copied\n    } finally {\n        buffer.release(ChunkBuffer.Pool)\n    }\n}\n"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/JsonStruct.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.serialization.DeserializationStrategy\nimport kotlinx.serialization.SerializationStrategy\nimport kotlinx.serialization.json.Json\nimport kotlin.reflect.typeOf\n\npublic interface JsonStruct\n\n@PublishedApi\ninternal val defaultJson: Json = Json {\n    isLenient = true\n    ignoreUnknownKeys = true\n}\n\npublic fun <T : JsonStruct> String.loadAs(deserializer: DeserializationStrategy<T>, json: Json = defaultJson): T {\n    return json.decodeFromString(deserializer, this)\n}\n\n@OptIn(ExperimentalStdlibApi::class)\npublic inline fun <reified T> String.loadSafelyAs(\n    deserializer: DeserializationStrategy<T>,\n    json: Json = defaultJson\n): Either<DeserializationFailure, T> where T : JsonStruct {\n    return try {\n        Either<DeserializationFailure, T>(json.decodeFromString(deserializer, this))\n    } catch (e: Throwable) {\n        // typeOf is used in ktor and coroutines so Kotlin will absolutely provide ABI guarantee for it.\n        Either(DeserializationFailure(typeOf<T>(), this, e))\n    }\n}\n\npublic fun <T : JsonStruct> T.toJsonString(serializer: SerializationStrategy<T>, json: Json = defaultJson): String =\n    json.encodeToString(serializer, this)"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/LateinitMutableProperty.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.atomicfu.atomic\nimport kotlinx.atomicfu.locks.SynchronizedObject\nimport kotlinx.atomicfu.locks.synchronized\nimport kotlin.properties.ReadWriteProperty\nimport kotlin.reflect.KProperty\n\nprivate val UNINITIALIZED: Any? = Symbol(\"UNINITIALIZED\")\n\n/**\n * Creates a lazily initialized, atomic, mutable property.\n *\n * [initializer] will be called at most once for most of the time, but not always.\n * Multiple invocations may happen if property getter is called by multiple coroutines in single thread (implementation use reentrant lock).\n * Hence, you must not trust [initializer] to be called only once.\n *\n * If property setter is executed before any execution of getter, [initializer] will not be called.\n * While [initializer] is running, i.e. still calculating the value to set to the property,\n * calling property setter will *outdo* the initializer. That is, the setter always prevails on competition with [initializer].\n */\npublic fun <T> lateinitMutableProperty(initializer: () -> T): ReadWriteProperty<Any?, T> =\n    LateinitMutableProperty(initializer)\n\nprivate class LateinitMutableProperty<T>(\n    initializer: () -> T\n) : ReadWriteProperty<Any?, T>, SynchronizedObject() {\n    private val value = atomic(UNINITIALIZED)\n\n    private var initializer: (() -> T)? = initializer\n\n    @Suppress(\"UNCHECKED_CAST\")\n    override fun getValue(thisRef: Any?, property: KProperty<*>): T {\n        return when (val v = this.value.value) {\n            UNINITIALIZED -> synchronized(this) {\n                val initializer = initializer\n                if (initializer != null && this.value.value === UNINITIALIZED) {\n                    val value = initializer()\n                    this.initializer = null // not used anymore, help gc\n                    this.value.compareAndSet(UNINITIALIZED, value) // setValue prevails\n                    this.value.value.let {\n                        check(it !== UNINITIALIZED)\n                        return it as T\n                    }\n                } else this.value.value as T\n            }\n\n            else -> v as T\n        }\n    }\n\n    override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {\n        this.value.value = value\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/Numbers.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MiraiUtils\")\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\npublic fun Int.toLongUnsigned(): Long = this.toLong().and(0xFFFF_FFFF)\npublic fun Long.toLongUnsigned(): Long = this // for native unstable types\npublic fun Short.toIntUnsigned(): Int = this.toUShort().toInt()\npublic fun Byte.toIntUnsigned(): Int = toInt() and 0xFF\npublic fun Int.concatAsLong(i2: Int): Long = this.toLongUnsigned().shl(Int.SIZE_BITS) or i2.toLongUnsigned()\n"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/RandomUtils.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MiraiUtils\")\n\n\npackage net.mamoe.mirai.utils\n\n\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\nimport kotlin.math.absoluteValue\nimport kotlin.random.Random\nimport kotlin.random.nextInt\n\n\n/**\n * 生成长度为 [length], 元素为随机 `0..255` 的 [ByteArray]\n */\npublic fun getRandomByteArray(length: Int, random: Random = Random): ByteArray =\n    ByteArray(length) { random.nextInt(0..255).toByte() }\n\n/**\n * 随机生成一个正整数\n */\npublic fun getRandomUnsignedInt(): Int = Random.nextInt().absoluteValue\n\n/**\n * 随机生成长度为 [length] 的 [String].\n */\npublic fun getRandomString(length: Int, random: Random = Random): String =\n    getRandomString(length, *defaultRanges, random = random)\n\nprivate val defaultRanges: Array<CharRange> = arrayOf('a'..'z', 'A'..'Z', '0'..'9')\nprivate val intCharRanges: Array<CharRange> = arrayOf('0'..'9')\n\n/**\n * 根据所给 [charRange] 随机生成长度为 [length] 的 [String].\n */\npublic fun getRandomString(length: Int, charRange: CharRange, random: Random = Random): String =\n    CharArray(length) { charRange.random(random) }.concatToString()\n\n/**\n * 根据所给 [charRanges] 随机生成长度为 [length] 的 [String].\n */\npublic fun getRandomString(length: Int, vararg charRanges: CharRange, random: Random = Random): String =\n    CharArray(length) { charRanges[random.nextInt(0..charRanges.lastIndex)].random(random) }.concatToString()\n\n\npublic fun getRandomIntString(length: Int, random: Random = Random): String =\n    getRandomString(length, charRanges = intCharRanges, random = random)"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/Resources.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.atomicfu.atomic\n\npublic class ResourceAccessLock {\n    public companion object {\n        public const val LOCKED: Int = -2\n        public const val UNINITIALIZED: Int = -1\n        public const val INITIALIZED: Int = 0\n    }\n\n    /*\n     * status > 0  ->  Number of holders using resource\n     */\n    private val status = atomic(-1)\n\n    /**\n     * ```\n     * if (res.lock.tryToDispose()) {\n     *  res.internal.close()\n     * }\n     * ```\n     */\n    public fun tryDispose(): Boolean {\n        return status.compareAndSet(0, -1)\n    }\n\n    /**\n     * ```\n     * if (res.lock.tryInitialize()) {\n     *  res.internalRes = download()\n     * }\n     * ```\n     */\n    public fun tryInitialize(): Boolean {\n        return status.compareAndSet(-1, 0)\n    }\n\n    public fun tryUse(): Boolean {\n        val c = status\n        while (true) {\n            val v = c.value\n            if (v < 0) return false\n            if (c.compareAndSet(v, v + 1)) return true\n        }\n    }\n\n    public fun lockIfNotUsing(): Boolean {\n        val count = this.status\n        while (true) {\n            val value = count.value\n            if (value != 0) return false\n            if (count.compareAndSet(0, -2)) return true\n        }\n    }\n\n    public fun release() {\n        val count = this.status\n        while (true) {\n            val value = count.value\n            if (value < 1) throw IllegalStateException(\"Current resource not in using\")\n\n            if (count.compareAndSet(value, value - 1)) return\n        }\n    }\n\n    public fun unlock() {\n        status.compareAndSet(LOCKED, INITIALIZED)\n    }\n\n    public fun setInitialized() {\n        status.value = INITIALIZED\n    }\n\n    public fun setLocked() {\n        status.value = LOCKED\n    }\n\n    public fun setDisposed() {\n        setUninitialized()\n    }\n\n    public fun setUninitialized() {\n        status.value = UNINITIALIZED\n    }\n\n    public fun currentStatus(): Int = status.value\n\n    override fun toString(): String {\n        return when (val status = status.value) {\n            0 -> \"ResourceAccessLock(INITIALIZED)\"\n            -1 -> \"ResourceAccessLock(UNINITIALIZED)\"\n            -2 -> \"ResourceAccessLock(LOCKED)\"\n            else -> \"ResourceAccessLock($status)\"\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/ResultExtensions.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\n@file:JvmMultifileClass\n@file:JvmName(\"MiraiUtils\")\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\nimport kotlin.reflect.KClass\n\n\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"RESULT_CLASS_IN_RETURN_TYPE\")\n@kotlin.internal.InlineOnly\n@kotlin.internal.LowPriorityInOverloadResolution\npublic inline fun <R, T : R> Result<T>.recoverCatchingSuppressed(transform: (exception: Throwable) -> R): Result<R> {\n    return when (val exception = exceptionOrNull()) {\n        null -> this\n        else -> {\n            try {\n                Result.success(transform(exception))\n            } catch (e: Throwable) {\n                e.addSuppressed(exception)\n                Result.failure(e)\n            }\n        }\n    }\n}\n\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"RESULT_CLASS_IN_RETURN_TYPE\")\n@kotlin.internal.InlineOnly\n@kotlin.internal.LowPriorityInOverloadResolution\npublic inline fun <R> retryCatching(\n    n: Int,\n    except: KClass<out Throwable>? = null,\n    block: (count: Int, lastException: Throwable?) -> R,\n): Result<R> {\n    require(n >= 0) {\n        \"param n for retryCatching must not be negative\"\n    }\n    var exception: Throwable? = null\n    repeat(n) {\n        try {\n            return Result.success(block(it, exception))\n        } catch (e: Throwable) {\n            if (except?.isInstance(e) == true) {\n                return Result.failure(e)\n            }\n            exception?.addSuppressed(e)\n            exception = e\n        }\n    }\n    return Result.failure(exception!!)\n}\n\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"RESULT_CLASS_IN_RETURN_TYPE\")\n@kotlin.internal.InlineOnly\n@kotlin.internal.LowPriorityInOverloadResolution\npublic inline fun <R> retryCatchingExceptions(\n    n: Int,\n    except: KClass<out Exception>? = null,\n    block: (count: Int, lastException: Throwable?) -> R,\n): Result<R> {\n    require(n >= 0) {\n        \"param n for retryCatching must not be negative\"\n    }\n    var exception: Throwable? = null\n    repeat(n) {\n        try {\n            return Result.success(block(it, exception))\n        } catch (e: Exception) {\n            if (except?.isInstance(e) == true) {\n                return Result.failure(e)\n            }\n            exception?.addSuppressed(e)\n            exception = e\n        }\n    }\n    return Result.failure(exception!!)\n}\n\n\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"RESULT_CLASS_IN_RETURN_TYPE\")\n@kotlin.internal.InlineOnly\npublic inline fun <R> retryCatching(\n    n: Int,\n    except: KClass<out Throwable>? = null,\n    block: () -> R,\n): Result<R> {\n    require(n >= 0) {\n        \"param n for retryCatching must not be negative\"\n    }\n    var exception: Throwable? = null\n    repeat(n) {\n        try {\n            return Result.success(block())\n        } catch (e: Throwable) {\n            if (except?.isInstance(e) == true) {\n                return Result.failure(e)\n            }\n            exception?.addSuppressed(e)\n            exception = e\n        }\n    }\n    return Result.failure(exception!!)\n}\n\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"RESULT_CLASS_IN_RETURN_TYPE\")\n@kotlin.internal.InlineOnly\npublic inline fun <R> retryCatchingExceptions(\n    n: Int,\n    except: KClass<out Exception>? = null,\n    block: () -> R,\n): Result<R> {\n    require(n >= 0) {\n        \"param n for retryCatching must not be negative\"\n    }\n    var exception: Throwable? = null\n    repeat(n) {\n        try {\n            return Result.success(block())\n        } catch (e: Exception) {\n            if (except?.isInstance(e) == true) {\n                return Result.failure(e)\n            }\n            exception?.addSuppressed(e)\n            exception = e\n        }\n    }\n    return Result.failure(exception!!)\n}\n\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"RESULT_CLASS_IN_RETURN_TYPE\")\n@kotlin.internal.InlineOnly\npublic inline fun <R> runCatchingExceptions(block: () -> R): Result<R> {\n    return try {\n        Result.success(block())\n    } catch (e: Exception) {\n        Result.failure(e)\n    }\n}\n\npublic inline fun <R> Result<R>.mapFailure(\n    block: (Throwable) -> Throwable,\n): Result<R> = onFailure {\n    return Result.failure(block(it))\n}\n\npublic inline fun <R> Result<R>.onSuccessCatching(block: () -> Unit): Result<R> {\n    if (isSuccess) {\n        runCatching(block).onFailure {\n            return@onSuccessCatching Result.failure(it)\n        }\n    }\n    return this\n}\n"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/SecretsProtection.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.Serializable\nimport kotlin.jvm.JvmInline\nimport kotlin.jvm.JvmStatic\n\n/**\n * 核心数据保护器\n *\n * ### Why\n *\n * 有时候可能会发生 `OutOfMemoryError`, 如果存在 `-XX:+HeapDumpOnOutOfMemoryError`, 则 JVM 会生成一份系统内存打印以供 debug.\n * 该报告包含全部内存信息, 包括各种数据, 核心数据以及, 机密数据 (如密码)\n *\n * 该内存报告唯一没有包含的数据就是 Native层数据, 包括且不限于\n *\n * - `sun.misc.Unsafe.allocate()`\n * - `java.nio.ByteBuffer.allocateDirect()` (Named `DirectByteBuffer`)\n * - C/C++ (或其他语言) 的数据\n *\n * *试验数据来源 `openjdk version \"17\" 2021-09-14, 64-Bit Server VM (build 17+35-2724, mixed mode, sharing)`*\n *\n * ### How it works\n *\n * 因为 Heap Dump 不存在 `DirectByteBuffer` 的实际数据, 所以可以通过该类隐藏关键数据. 等需要的时候在读取出来.\n * 因为数据并没有直接存在于某个类字段中, 缺少数据关联, 也很难分析相关数据是什么数据\n */\n@Suppress(\"NOTHING_TO_INLINE\", \"UsePropertyAccessSyntax\")\n//@MiraiExperimentalApi\npublic object SecretsProtection {\n\n    @JvmInline\n    @Serializable(EscapedStringSerializer::class)\n    public value class EscapedString(\n        public val data: Any,\n    ) {\n        public val asString: String\n            get() = SecretsProtectionPlatform.impl_asString(data)\n\n        public constructor(data: ByteArray) : this(escape(data))\n        public constructor(data: String) : this(escape(data.encodeToByteArray()))\n    }\n\n    @JvmInline\n    @Serializable(EscapedByteBufferSerializer::class)\n    public value class EscapedByteBuffer(\n        public val data: Any,\n    ) {\n        public val size: Int get() = SecretsProtectionPlatform.impl_getSize(data)\n\n        public val asByteArray: ByteArray\n            get() = SecretsProtectionPlatform.impl_asByteArray(data)\n\n        public constructor(data: ByteArray) : this(escape(data))\n    }\n\n    @JvmStatic\n    public fun escape(data: ByteArray): Any {\n        return SecretsProtectionPlatform.escape(data)\n    }\n\n\n    public object EscapedStringSerializer :\n        KSerializer<EscapedString> by SecretsProtectionPlatform.EscapedStringSerializer\n\n    public object EscapedByteBufferSerializer :\n        KSerializer<EscapedByteBuffer> by SecretsProtectionPlatform.EscapedByteBufferSerializer\n}\n\n\ninternal expect object SecretsProtectionPlatform {\n    fun impl_asString(data: Any): String\n    fun impl_asByteArray(data: Any): ByteArray\n    fun impl_getSize(data: Any): Int\n\n    fun escape(data: ByteArray): Any\n\n    object EscapedStringSerializer : KSerializer<SecretsProtection.EscapedString>\n\n    object EscapedByteBufferSerializer : KSerializer<SecretsProtection.EscapedByteBuffer>\n}"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/Serialization.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:JvmName(\"SerializationKt_common\")\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.serialization.*\nimport kotlinx.serialization.descriptors.*\nimport kotlinx.serialization.encoding.Decoder\nimport kotlinx.serialization.encoding.Encoder\nimport kotlin.jvm.JvmName\n\npublic fun SerialDescriptor.copy(newName: String): SerialDescriptor =\n    buildClassSerialDescriptor(newName) { takeElementsFrom(this@copy) }\n\n@OptIn(ExperimentalSerializationApi::class) // bad but there is no other solution\npublic fun ClassSerialDescriptorBuilder.takeElementsFrom(descriptor: SerialDescriptor) {\n    with(descriptor) {\n        repeat(descriptor.elementsCount) { index ->\n            element(\n                elementName = getElementName(index),\n                descriptor = getElementDescriptor(index),\n                annotations = getElementAnnotations(index),\n                isOptional = isElementOptional(index),\n            )\n        }\n    }\n}\n\npublic inline fun <T, R> KSerializer<T>.map(\n    resultantDescriptor: SerialDescriptor,\n    crossinline deserialize: T.(T) -> R,\n    crossinline serialize: R.(R) -> T,\n): KSerializer<R> {\n    return object : KSerializer<R> {\n        override val descriptor: SerialDescriptor get() = resultantDescriptor\n        override fun deserialize(decoder: Decoder): R = this@map.deserialize(decoder).let { deserialize(it, it) }\n        override fun serialize(encoder: Encoder, value: R) = serialize(encoder, value.let { serialize(it, it) })\n    }\n}\n\n@OptIn(ExperimentalSerializationApi::class)\npublic inline fun <T, R> KSerializer<T>.mapPrimitive(\n    serialName: String,\n    crossinline deserialize: (T) -> R,\n    crossinline serialize: R.(R) -> T,\n): KSerializer<R> {\n    val kind = this@mapPrimitive.descriptor.kind\n    check(kind is PrimitiveKind) { \"kind must be PrimitiveKind but found $kind\" }\n    return object : KSerializer<R> {\n        override fun deserialize(decoder: Decoder): R =\n            this@mapPrimitive.deserialize(decoder).let(deserialize)\n\n        override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor(serialName, kind)\n        override fun serialize(encoder: Encoder, value: R) =\n            this@mapPrimitive.serialize(encoder, value.let { serialize(it, it) })\n    }\n}\n\n\npublic fun <T> MiraiFile.loadNotBlankAs(\n    serializer: DeserializationStrategy<T>,\n    stringFormat: StringFormat,\n): T? {\n    if (!this.exists() || this.length == 0L) {\n        return null\n    }\n    return try {\n        stringFormat.decodeFromString(serializer, this.readText())\n    } catch (e: Throwable) { //broken file\n        e.printStackTrace()\n        null\n    }\n}\n\npublic fun <T> MiraiFile.loadNotBlankAs(\n    serializer: DeserializationStrategy<T>,\n    binaryFormat: BinaryFormat,\n): T? {\n    if (!this.exists() || this.length == 0L) {\n        return null\n    }\n    return try {\n        binaryFormat.decodeFromByteArray(serializer, this.readBytes())\n    } catch (e: Throwable) { //broken file\n        e.printStackTrace()\n        null\n    }\n}\n"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/Services.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmName(\"ServicesKt_common\")\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.atomicfu.locks.reentrantLock\nimport kotlinx.atomicfu.locks.withLock\nimport kotlin.jvm.JvmName\nimport kotlin.reflect.KClass\n\npublic object Services {\n    private val lock = reentrantLock()\n    public fun <T : Any> qualifiedNameOrFail(clazz: KClass<out T>): String =\n        clazz.qualifiedName ?: error(\"Could not find qualifiedName for $clazz\")\n\n    internal class Implementation(\n        val implementationClass: String,\n        val instance: Lazy<Any>\n    )\n\n    private val registered: MutableMap<String, MutableList<Implementation>> = mutableMapOf()\n    private val overrided: MutableMap<String, Implementation> = mutableMapOf()\n\n    @Suppress(\"UNCHECKED_CAST\")\n    public fun <T : Any> getOverrideOrNull(clazz: KClass<out T>): T? {\n        lock.withLock {\n            return overrided[qualifiedNameOrFail(clazz)]?.instance?.value as T?\n        }\n    }\n\n    public fun registerAsOverride(baseClass: String, implementationClass: String, implementation: () -> Any) {\n        lock.withLock {\n            overrided[baseClass] = Implementation(implementationClass, lazy(implementation))\n        }\n    }\n\n    public fun register(baseClass: String, implementationClass: String, implementation: () -> Any) {\n        lock.withLock {\n            registered.getOrPut(baseClass, ::mutableListOf)\n                .add(Implementation(implementationClass, lazy(implementation)))\n        }\n    }\n\n    public fun firstImplementationOrNull(baseClass: String): Any? {\n        lock.withLock {\n            overrided[baseClass]?.let { return it.instance.value }\n            return registered[baseClass]?.firstOrNull()?.instance?.value\n        }\n    }\n\n    public fun implementations(baseClass: String): Sequence<Lazy<Any>>? {\n        lock.withLock {\n            val implementations = registered[baseClass]\n            val forced = overrided[baseClass]\n            if (forced == null && implementations == null) return null\n\n            val implementationsSnapshot = implementations?.toList().orEmpty()\n\n            return sequence {\n                if (forced != null) yield(forced.instance)\n\n                implementationsSnapshot.forEach { yield(it.instance) }\n            }\n        }\n    }\n\n    internal fun implementationsDirectly(baseClass: String) =\n        lock.withLock { registered[baseClass]?.toList().orEmpty() }\n\n    public fun print(): String {\n        lock.withLock {\n            return registered.entries.joinToString { \"${it.key}:${it.value}\" }\n        }\n    }\n}\n\npublic expect fun <T : Any> loadServiceOrNull(clazz: KClass<out T>, fallbackImplementation: String? = null): T?\npublic expect fun <T : Any> loadService(clazz: KClass<out T>, fallbackImplementation: String? = null): T\npublic expect fun <T : Any> loadServices(clazz: KClass<out T>): Sequence<T>\n\npublic inline fun <reified T : Any> loadService(fallbackImplementation: String? = null): T =\n    loadService(T::class, fallbackImplementation)\n\n// do not inline: T will be inferred to returning type of `fallbackImplementation`\npublic fun <T : Any> loadService(clazz: KClass<out T>, fallbackImplementation: () -> T): T =\n    loadServiceOrNull(clazz) ?: fallbackImplementation()"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/SizedCache.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.atomicfu.locks.ReentrantLock\nimport kotlinx.atomicfu.locks.reentrantLock\nimport kotlinx.atomicfu.locks.withLock\n\n@Suppress(\"unused\", \"UNCHECKED_CAST\")\npublic class SizedCache<T>(size: Int) : Iterable<T> {\n    public val lock: ReentrantLock = reentrantLock()\n    public val data: Array<Any?> = arrayOfNulls(size)\n\n    public var filled: Boolean = false\n    public var idx: Int = 0\n\n    public fun emit(v: T) {\n        lock.withLock {\n            data[idx] = v\n            idx++\n            if (idx == data.size) {\n                filled = true\n                idx = 0\n            }\n        }\n    }\n\n    override fun iterator(): Iterator<T> {\n        if (filled) {\n            return object : Iterator<T> {\n                private var idx0: Int = idx\n                private var floopend = false\n                override fun hasNext(): Boolean = !floopend || idx0 != idx\n                override fun next(): T {\n                    val rsp = data[idx0] as T\n                    idx0++\n                    if (idx0 == data.size) {\n                        idx0 = 0\n                        floopend = true\n                    }\n                    return rsp\n                }\n            }\n        }\n\n        return object : Iterator<T> {\n            private var idx0: Int = 0\n            override fun hasNext(): Boolean = idx0 < idx\n            override fun next(): T = data[idx0].also { idx0++ } as T\n        }\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/StandardUtils.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\n@file:JvmName(\"StandardUtilsKt_common\")\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.jvm.JvmName\n\npublic inline fun <reified T> Any?.cast(): T {\n    contract { returns() implies (this@cast is T) }\n    return this as T\n}\n\n/**\n * Casts T to U where U : T. Safer than [cast] -- [castUp] only allow casting to upper types.\n */\npublic inline fun <reified U : T, T> T.castUp(): U {\n    contract { returns() implies (this@castUp is U) }\n    return this as U\n}\n\npublic inline fun <reified T> Any?.safeCast(): T? {\n    contract { returnsNotNull() implies (this@safeCast is T) }\n    return this as? T\n}\n\npublic inline fun <reified T> Any?.castOrNull(): T? {\n    contract { returnsNotNull() implies (this@castOrNull is T) }\n    return this as? T\n}\n\n@Suppress(\"NOTHING_TO_INLINE\", \"UNCHECKED_CAST\")\npublic inline fun <T> Any?.uncheckedCast(): T = this as T\n\n\npublic inline fun <reified R> Iterable<*>.firstIsInstanceOrNull(): R? {\n    for (it in this) {\n        if (it is R) return it\n    }\n    return null\n}\n\n\npublic inline fun <E> MutableList<E>.replaceAllKotlin(operator: (E) -> E) {\n    val li: MutableListIterator<E> = this.listIterator()\n    while (li.hasNext()) {\n        li.set(operator(li.next()))\n    }\n}\n\npublic fun Throwable.getRootCause(maxDepth: Int = 20): Throwable {\n    var depth = 0\n    var rootCause: Throwable? = this\n    while (rootCause?.cause != null) {\n        rootCause = rootCause.cause\n        if (depth++ >= maxDepth) break\n    }\n    return rootCause ?: this\n}\n\n/**\n * Use [findCause] instead for better performance.\n */\n@TestOnly\npublic fun Throwable.causes(maxDepth: Int = 20): Sequence<Throwable> = sequence {\n    var depth = 0\n    var rootCause: Throwable? = this@causes\n    while (rootCause?.cause != null) {\n        yield(rootCause.cause!!)\n        rootCause = rootCause.cause\n        if (depth++ >= maxDepth) break\n    }\n}\n\npublic inline fun Throwable.findCause(maxDepth: Int = 20, filter: (Throwable) -> Boolean): Throwable? {\n    var depth = 0\n    var curr: Throwable? = this\n    while (true) {\n        if (curr == null) return null\n        val cause = curr.cause ?: return null\n        if (filter(cause)) return cause\n\n        if (curr.cause === curr) return null // circular reference\n        curr = curr.cause\n\n        if (depth++ >= maxDepth) return null\n    }\n}\n\n/**\n * Run [block] and do [finally], catching exception thrown in [finally] and add it to the exception from [block].\n */\npublic inline fun <R> trySafely(\n    block: () -> R,\n    finally: () -> Unit,\n): R {\n//    contract {\n//        callsInPlace(block, InvocationKind.EXACTLY_ONCE)\n//        callsInPlace(finally, InvocationKind.EXACTLY_ONCE)\n//    }\n    var eInBlock: Throwable? = null\n    try {\n        return block()\n    } catch (e: Throwable) {\n        eInBlock = e\n    } finally {\n        try {\n            finally()\n        } catch (eInFinally: Throwable) {\n            if (eInBlock != null) {\n                eInBlock.addSuppressed(eInFinally)\n                throw eInBlock\n            } else throw eInFinally\n        }\n        if (eInBlock != null) throw eInBlock\n    }\n    throw AssertionError()\n}\n\npublic inline fun Throwable.findCauseOrSelf(maxDepth: Int = 20, filter: (Throwable) -> Boolean): Throwable =\n    findCause(maxDepth, filter) ?: this\n\npublic fun String.capitalize(): String {\n    return replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() }\n}\n\npublic fun String.truncated(length: Int, truncated: String = \"...\"): String {\n    return if (this.length > length) {\n        this.take(10) + truncated\n    } else this\n}\n\n/**\n * Similar to [run] bot with [Unit] return type.\n *\n * You should not reference to [T] directly in the [block].\n */\n// can convert to contextual receiver in the future, or there might be a stdlib function which we can delegate to.\npublic inline fun <T> T.context(block: T.() -> Unit) {\n    contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }\n    return block()\n}\n\npublic fun assertUnreachable(hint: String? = null): Nothing =\n    error(\"This clause should not be reached. \" + hint.orEmpty())\n\npublic fun isSameClass(object1: Any?, object2: Any?): Boolean {\n    if (object1 == null || object2 == null) {\n        return object1 == null && object2 == null\n    }\n    return isSameClassPlatform(object1, object2)\n}\n\ninternal expect fun isSameClassPlatform(object1: Any, object2: Any): Boolean\n\npublic inline fun <reified T> isSameType(thisObject: T, other: Any?): Boolean {\n    contract {\n        returns(true) implies (other is T)\n    }\n    if (other == null) return false\n    if (other !is T) return false\n    return isSameClass(thisObject, other)\n}\n\npublic expect fun availableProcessors(): Int\n\n\n/**\n * Localhost 解析\n */\npublic expect fun localIpAddress(): String\n"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/Strings.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MiraiUtils\")\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\n// region Emoji pattern. <Licenced under the MIT LICENSE>\n//\n// https://github.com/mathiasbynens/emoji-test-regex-pattern\n// https://github.com/mathiasbynens/emoji-test-regex-pattern/blob/main/dist/latest/java.txt\n//\n\n@Suppress(\"RegExpSingleCharAlternation\", \"RegExpRedundantEscape\")\nprivate val EMOJI_PATTERN: Regex? = runCatching {\n    \"\"\"\\x{1F3F4}\\x{E0067}\\x{E0062}(?:\\x{E0077}\\x{E006C}\\x{E0073}|\\x{E0073}\\x{E0063}\\x{E0074}|\\x{E0065}\\x{E006E}\\x{E0067})\\x{E007F}|(?:\\x{1F9D1}\\x{1F3FF}\\x{200D}\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D})?|\\x{200D}(?:\\x{1F48B}\\x{200D})?)\\x{1F9D1}|\\x{1F469}\\x{1F3FF}\\x{200D}\\x{1F91D}\\x{200D}[\\x{1F468}\\x{1F469}]|\\x{1FAF1}\\x{1F3FF}\\x{200D}\\x{1FAF2})[\\x{1F3FB}-\\x{1F3FE}]|(?:\\x{1F9D1}\\x{1F3FE}\\x{200D}\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D})?|\\x{200D}(?:\\x{1F48B}\\x{200D})?)\\x{1F9D1}|\\x{1F469}\\x{1F3FE}\\x{200D}\\x{1F91D}\\x{200D}[\\x{1F468}\\x{1F469}]|\\x{1FAF1}\\x{1F3FE}\\x{200D}\\x{1FAF2})[\\x{1F3FB}-\\x{1F3FD}\\x{1F3FF}]|(?:\\x{1F9D1}\\x{1F3FD}\\x{200D}\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D})?|\\x{200D}(?:\\x{1F48B}\\x{200D})?)\\x{1F9D1}|\\x{1F469}\\x{1F3FD}\\x{200D}\\x{1F91D}\\x{200D}[\\x{1F468}\\x{1F469}]|\\x{1FAF1}\\x{1F3FD}\\x{200D}\\x{1FAF2})[\\x{1F3FB}\\x{1F3FC}\\x{1F3FE}\\x{1F3FF}]|(?:\\x{1F9D1}\\x{1F3FC}\\x{200D}\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D})?|\\x{200D}(?:\\x{1F48B}\\x{200D})?)\\x{1F9D1}|\\x{1F469}\\x{1F3FC}\\x{200D}\\x{1F91D}\\x{200D}[\\x{1F468}\\x{1F469}]|\\x{1FAF1}\\x{1F3FC}\\x{200D}\\x{1FAF2})[\\x{1F3FB}\\x{1F3FD}-\\x{1F3FF}]|(?:\\x{1F9D1}\\x{1F3FB}\\x{200D}\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D})?|\\x{200D}(?:\\x{1F48B}\\x{200D})?)\\x{1F9D1}|\\x{1F469}\\x{1F3FB}\\x{200D}\\x{1F91D}\\x{200D}[\\x{1F468}\\x{1F469}]|\\x{1FAF1}\\x{1F3FB}\\x{200D}\\x{1FAF2})[\\x{1F3FC}-\\x{1F3FF}]|\\x{1F468}(?:\\x{1F3FB}(?:\\x{200D}(?:\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D}\\x{1F468}[\\x{1F3FB}-\\x{1F3FF}]|\\x{1F468}[\\x{1F3FB}-\\x{1F3FF}])|\\x{200D}(?:\\x{1F48B}\\x{200D}\\x{1F468}[\\x{1F3FB}-\\x{1F3FF}]|\\x{1F468}[\\x{1F3FB}-\\x{1F3FF}]))|\\x{1F91D}\\x{200D}\\x{1F468}[\\x{1F3FC}-\\x{1F3FF}]|[\\x{2695}\\x{2696}\\x{2708}]\\x{FE0F}|[\\x{2695}\\x{2696}\\x{2708}]|[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}]))?|[\\x{1F3FC}-\\x{1F3FF}]\\x{200D}\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D}\\x{1F468}[\\x{1F3FB}-\\x{1F3FF}]|\\x{1F468}[\\x{1F3FB}-\\x{1F3FF}])|\\x{200D}(?:\\x{1F48B}\\x{200D}\\x{1F468}[\\x{1F3FB}-\\x{1F3FF}]|\\x{1F468}[\\x{1F3FB}-\\x{1F3FF}]))|\\x{200D}(?:\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D})?|\\x{200D}(?:\\x{1F48B}\\x{200D})?)\\x{1F468}|[\\x{1F468}\\x{1F469}]\\x{200D}(?:\\x{1F466}\\x{200D}\\x{1F466}|\\x{1F467}\\x{200D}[\\x{1F466}\\x{1F467}])|\\x{1F466}\\x{200D}\\x{1F466}|\\x{1F467}\\x{200D}[\\x{1F466}\\x{1F467}]|[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}])|\\x{1F3FF}\\x{200D}(?:\\x{1F91D}\\x{200D}\\x{1F468}[\\x{1F3FB}-\\x{1F3FE}]|[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}])|\\x{1F3FE}\\x{200D}(?:\\x{1F91D}\\x{200D}\\x{1F468}[\\x{1F3FB}-\\x{1F3FD}\\x{1F3FF}]|[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}])|\\x{1F3FD}\\x{200D}(?:\\x{1F91D}\\x{200D}\\x{1F468}[\\x{1F3FB}\\x{1F3FC}\\x{1F3FE}\\x{1F3FF}]|[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}])|\\x{1F3FC}\\x{200D}(?:\\x{1F91D}\\x{200D}\\x{1F468}[\\x{1F3FB}\\x{1F3FD}-\\x{1F3FF}]|[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}])|(?:\\x{1F3FF}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FE}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FD}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FC}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{200D}[\\x{2695}\\x{2696}\\x{2708}])\\x{FE0F}|\\x{200D}(?:[\\x{1F468}\\x{1F469}]\\x{200D}[\\x{1F466}\\x{1F467}]|[\\x{1F466}\\x{1F467}])|\\x{1F3FF}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FE}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FD}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FC}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FF}|\\x{1F3FE}|\\x{1F3FD}|\\x{1F3FC}|\\x{200D}[\\x{2695}\\x{2696}\\x{2708}])?|(?:\\x{1F469}(?:\\x{1F3FB}\\x{200D}\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D}[\\x{1F468}\\x{1F469}]|[\\x{1F468}\\x{1F469}])|\\x{200D}(?:\\x{1F48B}\\x{200D}[\\x{1F468}\\x{1F469}]|[\\x{1F468}\\x{1F469}]))|[\\x{1F3FC}-\\x{1F3FF}]\\x{200D}\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D}[\\x{1F468}\\x{1F469}]|[\\x{1F468}\\x{1F469}])|\\x{200D}(?:\\x{1F48B}\\x{200D}[\\x{1F468}\\x{1F469}]|[\\x{1F468}\\x{1F469}])))|\\x{1F9D1}[\\x{1F3FB}-\\x{1F3FF}]\\x{200D}\\x{1F91D}\\x{200D}\\x{1F9D1})[\\x{1F3FB}-\\x{1F3FF}]|\\x{1F469}\\x{200D}\\x{1F469}\\x{200D}(?:\\x{1F466}\\x{200D}\\x{1F466}|\\x{1F467}\\x{200D}[\\x{1F466}\\x{1F467}])|\\x{1F469}(?:\\x{200D}(?:\\x{2764}(?:\\x{FE0F}\\x{200D}(?:\\x{1F48B}\\x{200D}[\\x{1F468}\\x{1F469}]|[\\x{1F468}\\x{1F469}])|\\x{200D}(?:\\x{1F48B}\\x{200D}[\\x{1F468}\\x{1F469}]|[\\x{1F468}\\x{1F469}]))|[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}])|\\x{1F3FF}\\x{200D}[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}]|\\x{1F3FE}\\x{200D}[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}]|\\x{1F3FD}\\x{200D}[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}]|\\x{1F3FC}\\x{200D}[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}]|\\x{1F3FB}\\x{200D}[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}])|\\x{1F9D1}(?:\\x{200D}(?:\\x{1F91D}\\x{200D}\\x{1F9D1}|[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F384}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}])|\\x{1F3FF}\\x{200D}[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F384}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}]|\\x{1F3FE}\\x{200D}[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F384}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}]|\\x{1F3FD}\\x{200D}[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F384}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}]|\\x{1F3FC}\\x{200D}[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F384}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}]|\\x{1F3FB}\\x{200D}[\\x{1F33E}\\x{1F373}\\x{1F37C}\\x{1F384}\\x{1F393}\\x{1F3A4}\\x{1F3A8}\\x{1F3EB}\\x{1F3ED}\\x{1F4BB}\\x{1F4BC}\\x{1F527}\\x{1F52C}\\x{1F680}\\x{1F692}\\x{1F9AF}-\\x{1F9B3}\\x{1F9BC}\\x{1F9BD}])|\\x{1F469}\\x{200D}\\x{1F466}\\x{200D}\\x{1F466}|\\x{1F469}\\x{200D}\\x{1F469}\\x{200D}[\\x{1F466}\\x{1F467}]|\\x{1F469}\\x{200D}\\x{1F467}\\x{200D}[\\x{1F466}\\x{1F467}]|(?:\\x{1F441}\\x{FE0F}?\\x{200D}\\x{1F5E8}|\\x{1F9D1}(?:\\x{1F3FF}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FE}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FD}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FC}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FB}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{200D}[\\x{2695}\\x{2696}\\x{2708}])|\\x{1F469}(?:\\x{1F3FF}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FE}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FD}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FC}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FB}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{200D}[\\x{2695}\\x{2696}\\x{2708}])|\\x{1F636}\\x{200D}\\x{1F32B}|\\x{1F3F3}\\x{FE0F}?\\x{200D}\\x{26A7}|\\x{1F43B}\\x{200D}\\x{2744}|(?:[\\x{1F3C3}\\x{1F3C4}\\x{1F3CA}\\x{1F46E}\\x{1F470}\\x{1F471}\\x{1F473}\\x{1F477}\\x{1F481}\\x{1F482}\\x{1F486}\\x{1F487}\\x{1F645}-\\x{1F647}\\x{1F64B}\\x{1F64D}\\x{1F64E}\\x{1F6A3}\\x{1F6B4}-\\x{1F6B6}\\x{1F926}\\x{1F935}\\x{1F937}-\\x{1F939}\\x{1F93D}\\x{1F93E}\\x{1F9B8}\\x{1F9B9}\\x{1F9CD}-\\x{1F9CF}\\x{1F9D4}\\x{1F9D6}-\\x{1F9DD}][\\x{1F3FB}-\\x{1F3FF}]|[\\x{1F46F}\\x{1F9DE}\\x{1F9DF}])\\x{200D}[\\x{2640}\\x{2642}]|[\\x{26F9}\\x{1F3CB}\\x{1F3CC}\\x{1F575}](?:[\\x{FE0F}\\x{1F3FB}-\\x{1F3FF}]\\x{200D}[\\x{2640}\\x{2642}]|\\x{200D}[\\x{2640}\\x{2642}])|\\x{1F3F4}\\x{200D}\\x{2620}|[\\x{1F3C3}\\x{1F3C4}\\x{1F3CA}\\x{1F46E}\\x{1F470}\\x{1F471}\\x{1F473}\\x{1F477}\\x{1F481}\\x{1F482}\\x{1F486}\\x{1F487}\\x{1F645}-\\x{1F647}\\x{1F64B}\\x{1F64D}\\x{1F64E}\\x{1F6A3}\\x{1F6B4}-\\x{1F6B6}\\x{1F926}\\x{1F935}\\x{1F937}-\\x{1F939}\\x{1F93C}-\\x{1F93E}\\x{1F9B8}\\x{1F9B9}\\x{1F9CD}-\\x{1F9CF}\\x{1F9D4}\\x{1F9D6}-\\x{1F9DD}]\\x{200D}[\\x{2640}\\x{2642}]|[\\xA9\\xAE\\x{203C}\\x{2049}\\x{2122}\\x{2139}\\x{2194}-\\x{2199}\\x{21A9}\\x{21AA}\\x{231A}\\x{231B}\\x{2328}\\x{23CF}\\x{23ED}-\\x{23EF}\\x{23F1}\\x{23F2}\\x{23F8}-\\x{23FA}\\x{24C2}\\x{25AA}\\x{25AB}\\x{25B6}\\x{25C0}\\x{25FB}\\x{25FC}\\x{25FE}\\x{2600}-\\x{2604}\\x{260E}\\x{2611}\\x{2614}\\x{2615}\\x{2618}\\x{2620}\\x{2622}\\x{2623}\\x{2626}\\x{262A}\\x{262E}\\x{262F}\\x{2638}-\\x{263A}\\x{2640}\\x{2642}\\x{2648}-\\x{2653}\\x{265F}\\x{2660}\\x{2663}\\x{2665}\\x{2666}\\x{2668}\\x{267B}\\x{267E}\\x{267F}\\x{2692}\\x{2694}-\\x{2697}\\x{2699}\\x{269B}\\x{269C}\\x{26A0}\\x{26A7}\\x{26AA}\\x{26B0}\\x{26B1}\\x{26BD}\\x{26BE}\\x{26C4}\\x{26C8}\\x{26CF}\\x{26D1}\\x{26D3}\\x{26E9}\\x{26F0}-\\x{26F5}\\x{26F7}\\x{26F8}\\x{26FA}\\x{2702}\\x{2708}\\x{2709}\\x{270F}\\x{2712}\\x{2714}\\x{2716}\\x{271D}\\x{2721}\\x{2733}\\x{2734}\\x{2744}\\x{2747}\\x{2757}\\x{2763}\\x{27A1}\\x{2934}\\x{2935}\\x{2B05}-\\x{2B07}\\x{2B1B}\\x{2B1C}\\x{2B55}\\x{3030}\\x{303D}\\x{3297}\\x{3299}\\x{1F004}\\x{1F170}\\x{1F171}\\x{1F17E}\\x{1F17F}\\x{1F202}\\x{1F237}\\x{1F321}\\x{1F324}-\\x{1F32C}\\x{1F336}\\x{1F37D}\\x{1F396}\\x{1F397}\\x{1F399}-\\x{1F39B}\\x{1F39E}\\x{1F39F}\\x{1F3CD}\\x{1F3CE}\\x{1F3D4}-\\x{1F3DF}\\x{1F3F5}\\x{1F3F7}\\x{1F43F}\\x{1F4FD}\\x{1F549}\\x{1F54A}\\x{1F56F}\\x{1F570}\\x{1F573}\\x{1F576}-\\x{1F579}\\x{1F587}\\x{1F58A}-\\x{1F58D}\\x{1F5A5}\\x{1F5A8}\\x{1F5B1}\\x{1F5B2}\\x{1F5BC}\\x{1F5C2}-\\x{1F5C4}\\x{1F5D1}-\\x{1F5D3}\\x{1F5DC}-\\x{1F5DE}\\x{1F5E1}\\x{1F5E3}\\x{1F5E8}\\x{1F5EF}\\x{1F5F3}\\x{1F5FA}\\x{1F6CB}\\x{1F6CD}-\\x{1F6CF}\\x{1F6E0}-\\x{1F6E5}\\x{1F6E9}\\x{1F6F0}\\x{1F6F3}])\\x{FE0F}|\\x{1F441}\\x{FE0F}?\\x{200D}\\x{1F5E8}|\\x{1F9D1}(?:\\x{1F3FF}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FE}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FD}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FC}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FB}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{200D}[\\x{2695}\\x{2696}\\x{2708}])|\\x{1F469}(?:\\x{1F3FF}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FE}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FD}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FC}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{1F3FB}\\x{200D}[\\x{2695}\\x{2696}\\x{2708}]|\\x{200D}[\\x{2695}\\x{2696}\\x{2708}])|\\x{1F3F3}\\x{FE0F}?\\x{200D}\\x{1F308}|\\x{1F469}\\x{200D}\\x{1F467}|\\x{1F469}\\x{200D}\\x{1F466}|\\x{1F636}\\x{200D}\\x{1F32B}|\\x{1F3F3}\\x{FE0F}?\\x{200D}\\x{26A7}|\\x{1F635}\\x{200D}\\x{1F4AB}|\\x{1F62E}\\x{200D}\\x{1F4A8}|\\x{1F415}\\x{200D}\\x{1F9BA}|\\x{1FAF1}(?:\\x{1F3FF}|\\x{1F3FE}|\\x{1F3FD}|\\x{1F3FC}|\\x{1F3FB})?|\\x{1F9D1}(?:\\x{1F3FF}|\\x{1F3FE}|\\x{1F3FD}|\\x{1F3FC}|\\x{1F3FB})?|\\x{1F469}(?:\\x{1F3FF}|\\x{1F3FE}|\\x{1F3FD}|\\x{1F3FC}|\\x{1F3FB})?|\\x{1F43B}\\x{200D}\\x{2744}|(?:[\\x{1F3C3}\\x{1F3C4}\\x{1F3CA}\\x{1F46E}\\x{1F470}\\x{1F471}\\x{1F473}\\x{1F477}\\x{1F481}\\x{1F482}\\x{1F486}\\x{1F487}\\x{1F645}-\\x{1F647}\\x{1F64B}\\x{1F64D}\\x{1F64E}\\x{1F6A3}\\x{1F6B4}-\\x{1F6B6}\\x{1F926}\\x{1F935}\\x{1F937}-\\x{1F939}\\x{1F93D}\\x{1F93E}\\x{1F9B8}\\x{1F9B9}\\x{1F9CD}-\\x{1F9CF}\\x{1F9D4}\\x{1F9D6}-\\x{1F9DD}][\\x{1F3FB}-\\x{1F3FF}]|[\\x{1F46F}\\x{1F9DE}\\x{1F9DF}])\\x{200D}[\\x{2640}\\x{2642}]|[\\x{26F9}\\x{1F3CB}\\x{1F3CC}\\x{1F575}](?:[\\x{FE0F}\\x{1F3FB}-\\x{1F3FF}]\\x{200D}[\\x{2640}\\x{2642}]|\\x{200D}[\\x{2640}\\x{2642}])|\\x{1F3F4}\\x{200D}\\x{2620}|\\x{1F1FD}\\x{1F1F0}|\\x{1F1F6}\\x{1F1E6}|\\x{1F1F4}\\x{1F1F2}|\\x{1F408}\\x{200D}\\x{2B1B}|\\x{2764}(?:\\x{FE0F}\\x{200D}[\\x{1F525}\\x{1FA79}]|\\x{200D}[\\x{1F525}\\x{1FA79}])|\\x{1F441}\\x{FE0F}?|\\x{1F3F3}\\x{FE0F}?|[\\x{1F3C3}\\x{1F3C4}\\x{1F3CA}\\x{1F46E}\\x{1F470}\\x{1F471}\\x{1F473}\\x{1F477}\\x{1F481}\\x{1F482}\\x{1F486}\\x{1F487}\\x{1F645}-\\x{1F647}\\x{1F64B}\\x{1F64D}\\x{1F64E}\\x{1F6A3}\\x{1F6B4}-\\x{1F6B6}\\x{1F926}\\x{1F935}\\x{1F937}-\\x{1F939}\\x{1F93C}-\\x{1F93E}\\x{1F9B8}\\x{1F9B9}\\x{1F9CD}-\\x{1F9CF}\\x{1F9D4}\\x{1F9D6}-\\x{1F9DD}]\\x{200D}[\\x{2640}\\x{2642}]|\\x{1F1FF}[\\x{1F1E6}\\x{1F1F2}\\x{1F1FC}]|\\x{1F1FE}[\\x{1F1EA}\\x{1F1F9}]|\\x{1F1FC}[\\x{1F1EB}\\x{1F1F8}]|\\x{1F1FB}[\\x{1F1E6}\\x{1F1E8}\\x{1F1EA}\\x{1F1EC}\\x{1F1EE}\\x{1F1F3}\\x{1F1FA}]|\\x{1F1FA}[\\x{1F1E6}\\x{1F1EC}\\x{1F1F2}\\x{1F1F3}\\x{1F1F8}\\x{1F1FE}\\x{1F1FF}]|\\x{1F1F9}[\\x{1F1E6}\\x{1F1E8}\\x{1F1E9}\\x{1F1EB}-\\x{1F1ED}\\x{1F1EF}-\\x{1F1F4}\\x{1F1F7}\\x{1F1F9}\\x{1F1FB}\\x{1F1FC}\\x{1F1FF}]|\\x{1F1F8}[\\x{1F1E6}-\\x{1F1EA}\\x{1F1EC}-\\x{1F1F4}\\x{1F1F7}-\\x{1F1F9}\\x{1F1FB}\\x{1F1FD}-\\x{1F1FF}]|\\x{1F1F7}[\\x{1F1EA}\\x{1F1F4}\\x{1F1F8}\\x{1F1FA}\\x{1F1FC}]|\\x{1F1F5}[\\x{1F1E6}\\x{1F1EA}-\\x{1F1ED}\\x{1F1F0}-\\x{1F1F3}\\x{1F1F7}-\\x{1F1F9}\\x{1F1FC}\\x{1F1FE}]|\\x{1F1F3}[\\x{1F1E6}\\x{1F1E8}\\x{1F1EA}-\\x{1F1EC}\\x{1F1EE}\\x{1F1F1}\\x{1F1F4}\\x{1F1F5}\\x{1F1F7}\\x{1F1FA}\\x{1F1FF}]|\\x{1F1F2}[\\x{1F1E6}\\x{1F1E8}-\\x{1F1ED}\\x{1F1F0}-\\x{1F1FF}]|\\x{1F1F1}[\\x{1F1E6}-\\x{1F1E8}\\x{1F1EE}\\x{1F1F0}\\x{1F1F7}-\\x{1F1FB}\\x{1F1FE}]|\\x{1F1F0}[\\x{1F1EA}\\x{1F1EC}-\\x{1F1EE}\\x{1F1F2}\\x{1F1F3}\\x{1F1F5}\\x{1F1F7}\\x{1F1FC}\\x{1F1FE}\\x{1F1FF}]|\\x{1F1EF}[\\x{1F1EA}\\x{1F1F2}\\x{1F1F4}\\x{1F1F5}]|\\x{1F1EE}[\\x{1F1E8}-\\x{1F1EA}\\x{1F1F1}-\\x{1F1F4}\\x{1F1F6}-\\x{1F1F9}]|\\x{1F1ED}[\\x{1F1F0}\\x{1F1F2}\\x{1F1F3}\\x{1F1F7}\\x{1F1F9}\\x{1F1FA}]|\\x{1F1EC}[\\x{1F1E6}\\x{1F1E7}\\x{1F1E9}-\\x{1F1EE}\\x{1F1F1}-\\x{1F1F3}\\x{1F1F5}-\\x{1F1FA}\\x{1F1FC}\\x{1F1FE}]|\\x{1F1EB}[\\x{1F1EE}-\\x{1F1F0}\\x{1F1F2}\\x{1F1F4}\\x{1F1F7}]|\\x{1F1EA}[\\x{1F1E6}\\x{1F1E8}\\x{1F1EA}\\x{1F1EC}\\x{1F1ED}\\x{1F1F7}-\\x{1F1FA}]|\\x{1F1E9}[\\x{1F1EA}\\x{1F1EC}\\x{1F1EF}\\x{1F1F0}\\x{1F1F2}\\x{1F1F4}\\x{1F1FF}]|\\x{1F1E8}[\\x{1F1E6}\\x{1F1E8}\\x{1F1E9}\\x{1F1EB}-\\x{1F1EE}\\x{1F1F0}-\\x{1F1F5}\\x{1F1F7}\\x{1F1FA}-\\x{1F1FF}]|\\x{1F1E7}[\\x{1F1E6}\\x{1F1E7}\\x{1F1E9}-\\x{1F1EF}\\x{1F1F1}-\\x{1F1F4}\\x{1F1F6}-\\x{1F1F9}\\x{1F1FB}\\x{1F1FC}\\x{1F1FE}\\x{1F1FF}]|\\x{1F1E6}[\\x{1F1E8}-\\x{1F1EC}\\x{1F1EE}\\x{1F1F1}\\x{1F1F2}\\x{1F1F4}\\x{1F1F6}-\\x{1F1FA}\\x{1F1FC}\\x{1F1FD}\\x{1F1FF}]|[#\\*0-9]\\x{FE0F}?\\x{20E3}|\\x{1F93C}[\\x{1F3FB}-\\x{1F3FF}]|\\x{2764}\\x{FE0F}?|[\\x{1F3C3}\\x{1F3C4}\\x{1F3CA}\\x{1F46E}\\x{1F470}\\x{1F471}\\x{1F473}\\x{1F477}\\x{1F481}\\x{1F482}\\x{1F486}\\x{1F487}\\x{1F645}-\\x{1F647}\\x{1F64B}\\x{1F64D}\\x{1F64E}\\x{1F6A3}\\x{1F6B4}-\\x{1F6B6}\\x{1F926}\\x{1F935}\\x{1F937}-\\x{1F939}\\x{1F93D}\\x{1F93E}\\x{1F9B8}\\x{1F9B9}\\x{1F9CD}-\\x{1F9CF}\\x{1F9D4}\\x{1F9D6}-\\x{1F9DD}][\\x{1F3FB}-\\x{1F3FF}]|[\\x{26F9}\\x{1F3CB}\\x{1F3CC}\\x{1F575}][\\x{FE0F}\\x{1F3FB}-\\x{1F3FF}]?|\\x{1F3F4}|[\\x{270A}\\x{270B}\\x{1F385}\\x{1F3C2}\\x{1F3C7}\\x{1F442}\\x{1F443}\\x{1F446}-\\x{1F450}\\x{1F466}\\x{1F467}\\x{1F46B}-\\x{1F46D}\\x{1F472}\\x{1F474}-\\x{1F476}\\x{1F478}\\x{1F47C}\\x{1F483}\\x{1F485}\\x{1F48F}\\x{1F491}\\x{1F4AA}\\x{1F57A}\\x{1F595}\\x{1F596}\\x{1F64C}\\x{1F64F}\\x{1F6C0}\\x{1F6CC}\\x{1F90C}\\x{1F90F}\\x{1F918}-\\x{1F91F}\\x{1F930}-\\x{1F934}\\x{1F936}\\x{1F977}\\x{1F9B5}\\x{1F9B6}\\x{1F9BB}\\x{1F9D2}\\x{1F9D3}\\x{1F9D5}\\x{1FAC3}-\\x{1FAC5}\\x{1FAF0}\\x{1FAF2}-\\x{1FAF6}][\\x{1F3FB}-\\x{1F3FF}]|[\\x{261D}\\x{270C}\\x{270D}\\x{1F574}\\x{1F590}][\\x{FE0F}\\x{1F3FB}-\\x{1F3FF}]|[\\x{261D}\\x{270A}-\\x{270D}\\x{1F385}\\x{1F3C2}\\x{1F3C7}\\x{1F408}\\x{1F415}\\x{1F43B}\\x{1F442}\\x{1F443}\\x{1F446}-\\x{1F450}\\x{1F466}\\x{1F467}\\x{1F46B}-\\x{1F46D}\\x{1F472}\\x{1F474}-\\x{1F476}\\x{1F478}\\x{1F47C}\\x{1F483}\\x{1F485}\\x{1F48F}\\x{1F491}\\x{1F4AA}\\x{1F574}\\x{1F57A}\\x{1F590}\\x{1F595}\\x{1F596}\\x{1F62E}\\x{1F635}\\x{1F636}\\x{1F64C}\\x{1F64F}\\x{1F6C0}\\x{1F6CC}\\x{1F90C}\\x{1F90F}\\x{1F918}-\\x{1F91F}\\x{1F930}-\\x{1F934}\\x{1F936}\\x{1F93C}\\x{1F977}\\x{1F9B5}\\x{1F9B6}\\x{1F9BB}\\x{1F9D2}\\x{1F9D3}\\x{1F9D5}\\x{1FAC3}-\\x{1FAC5}\\x{1FAF0}\\x{1FAF2}-\\x{1FAF6}]|[\\x{1F3C3}\\x{1F3C4}\\x{1F3CA}\\x{1F46E}\\x{1F470}\\x{1F471}\\x{1F473}\\x{1F477}\\x{1F481}\\x{1F482}\\x{1F486}\\x{1F487}\\x{1F645}-\\x{1F647}\\x{1F64B}\\x{1F64D}\\x{1F64E}\\x{1F6A3}\\x{1F6B4}-\\x{1F6B6}\\x{1F926}\\x{1F935}\\x{1F937}-\\x{1F939}\\x{1F93D}\\x{1F93E}\\x{1F9B8}\\x{1F9B9}\\x{1F9CD}-\\x{1F9CF}\\x{1F9D4}\\x{1F9D6}-\\x{1F9DD}]|[\\x{1F46F}\\x{1F9DE}\\x{1F9DF}]|[\\xA9\\xAE\\x{203C}\\x{2049}\\x{2122}\\x{2139}\\x{2194}-\\x{2199}\\x{21A9}\\x{21AA}\\x{231A}\\x{231B}\\x{2328}\\x{23CF}\\x{23ED}-\\x{23EF}\\x{23F1}\\x{23F2}\\x{23F8}-\\x{23FA}\\x{24C2}\\x{25AA}\\x{25AB}\\x{25B6}\\x{25C0}\\x{25FB}\\x{25FC}\\x{25FE}\\x{2600}-\\x{2604}\\x{260E}\\x{2611}\\x{2614}\\x{2615}\\x{2618}\\x{2620}\\x{2622}\\x{2623}\\x{2626}\\x{262A}\\x{262E}\\x{262F}\\x{2638}-\\x{263A}\\x{2640}\\x{2642}\\x{2648}-\\x{2653}\\x{265F}\\x{2660}\\x{2663}\\x{2665}\\x{2666}\\x{2668}\\x{267B}\\x{267E}\\x{267F}\\x{2692}\\x{2694}-\\x{2697}\\x{2699}\\x{269B}\\x{269C}\\x{26A0}\\x{26A7}\\x{26AA}\\x{26B0}\\x{26B1}\\x{26BD}\\x{26BE}\\x{26C4}\\x{26C8}\\x{26CF}\\x{26D1}\\x{26D3}\\x{26E9}\\x{26F0}-\\x{26F5}\\x{26F7}\\x{26F8}\\x{26FA}\\x{2702}\\x{2708}\\x{2709}\\x{270F}\\x{2712}\\x{2714}\\x{2716}\\x{271D}\\x{2721}\\x{2733}\\x{2734}\\x{2744}\\x{2747}\\x{2757}\\x{2763}\\x{27A1}\\x{2934}\\x{2935}\\x{2B05}-\\x{2B07}\\x{2B1B}\\x{2B1C}\\x{2B55}\\x{3030}\\x{303D}\\x{3297}\\x{3299}\\x{1F004}\\x{1F170}\\x{1F171}\\x{1F17E}\\x{1F17F}\\x{1F202}\\x{1F237}\\x{1F321}\\x{1F324}-\\x{1F32C}\\x{1F336}\\x{1F37D}\\x{1F396}\\x{1F397}\\x{1F399}-\\x{1F39B}\\x{1F39E}\\x{1F39F}\\x{1F3CD}\\x{1F3CE}\\x{1F3D4}-\\x{1F3DF}\\x{1F3F5}\\x{1F3F7}\\x{1F43F}\\x{1F4FD}\\x{1F549}\\x{1F54A}\\x{1F56F}\\x{1F570}\\x{1F573}\\x{1F576}-\\x{1F579}\\x{1F587}\\x{1F58A}-\\x{1F58D}\\x{1F5A5}\\x{1F5A8}\\x{1F5B1}\\x{1F5B2}\\x{1F5BC}\\x{1F5C2}-\\x{1F5C4}\\x{1F5D1}-\\x{1F5D3}\\x{1F5DC}-\\x{1F5DE}\\x{1F5E1}\\x{1F5E3}\\x{1F5E8}\\x{1F5EF}\\x{1F5F3}\\x{1F5FA}\\x{1F6CB}\\x{1F6CD}-\\x{1F6CF}\\x{1F6E0}-\\x{1F6E5}\\x{1F6E9}\\x{1F6F0}\\x{1F6F3}]|[\\x{23E9}-\\x{23EC}\\x{23F0}\\x{23F3}\\x{25FD}\\x{2693}\\x{26A1}\\x{26AB}\\x{26C5}\\x{26CE}\\x{26D4}\\x{26EA}\\x{26FD}\\x{2705}\\x{2728}\\x{274C}\\x{274E}\\x{2753}-\\x{2755}\\x{2795}-\\x{2797}\\x{27B0}\\x{27BF}\\x{2B50}\\x{1F0CF}\\x{1F18E}\\x{1F191}-\\x{1F19A}\\x{1F201}\\x{1F21A}\\x{1F22F}\\x{1F232}-\\x{1F236}\\x{1F238}-\\x{1F23A}\\x{1F250}\\x{1F251}\\x{1F300}-\\x{1F320}\\x{1F32D}-\\x{1F335}\\x{1F337}-\\x{1F37C}\\x{1F37E}-\\x{1F384}\\x{1F386}-\\x{1F393}\\x{1F3A0}-\\x{1F3C1}\\x{1F3C5}\\x{1F3C6}\\x{1F3C8}\\x{1F3C9}\\x{1F3CF}-\\x{1F3D3}\\x{1F3E0}-\\x{1F3F0}\\x{1F3F8}-\\x{1F407}\\x{1F409}-\\x{1F414}\\x{1F416}-\\x{1F43A}\\x{1F43C}-\\x{1F43E}\\x{1F440}\\x{1F444}\\x{1F445}\\x{1F451}-\\x{1F465}\\x{1F46A}\\x{1F479}-\\x{1F47B}\\x{1F47D}-\\x{1F480}\\x{1F484}\\x{1F488}-\\x{1F48E}\\x{1F490}\\x{1F492}-\\x{1F4A9}\\x{1F4AB}-\\x{1F4FC}\\x{1F4FF}-\\x{1F53D}\\x{1F54B}-\\x{1F54E}\\x{1F550}-\\x{1F567}\\x{1F5A4}\\x{1F5FB}-\\x{1F62D}\\x{1F62F}-\\x{1F634}\\x{1F637}-\\x{1F644}\\x{1F648}-\\x{1F64A}\\x{1F680}-\\x{1F6A2}\\x{1F6A4}-\\x{1F6B3}\\x{1F6B7}-\\x{1F6BF}\\x{1F6C1}-\\x{1F6C5}\\x{1F6D0}-\\x{1F6D2}\\x{1F6D5}-\\x{1F6D7}\\x{1F6DD}-\\x{1F6DF}\\x{1F6EB}\\x{1F6EC}\\x{1F6F4}-\\x{1F6FC}\\x{1F7E0}-\\x{1F7EB}\\x{1F7F0}\\x{1F90D}\\x{1F90E}\\x{1F910}-\\x{1F917}\\x{1F920}-\\x{1F925}\\x{1F927}-\\x{1F92F}\\x{1F93A}\\x{1F93F}-\\x{1F945}\\x{1F947}-\\x{1F976}\\x{1F978}-\\x{1F9B4}\\x{1F9B7}\\x{1F9BA}\\x{1F9BC}-\\x{1F9CC}\\x{1F9D0}\\x{1F9E0}-\\x{1F9FF}\\x{1FA70}-\\x{1FA74}\\x{1FA78}-\\x{1FA7C}\\x{1FA80}-\\x{1FA86}\\x{1FA90}-\\x{1FAAC}\\x{1FAB0}-\\x{1FABA}\\x{1FAC0}-\\x{1FAC2}\\x{1FAD0}-\\x{1FAD9}\\x{1FAE0}-\\x{1FAE7}]\"\"\".toRegex()\n}.getOrNull() // May some java runtime unsupported\n\npublic fun String.dropEmoji(): String {\n    EMOJI_PATTERN?.let { regex -> return replace(regex, \"\") }\n    return this\n}\n\n// endregion\n\n\npublic fun CharSequence.chineseLength(upTo: Int = Int.MAX_VALUE): Int {\n    return this.sumUpTo(upTo) { it.chineseLength }\n}\n\npublic val Char.chineseLength: Int\n    get() {\n        return when (this) {\n            in '\\u0000'..'\\u007F' -> 1\n            in '\\u0080'..'\\u07FF' -> 2\n            in '\\u0800'..'\\uFFFF' -> 3\n            else -> 4\n        }\n    }\n\npublic inline fun CharSequence.sumUpTo(upTo: Int, selector: (Char) -> Int): Int {\n    var sum = 0\n    for (element in this) {\n        sum += selector(element)\n        if (sum >= upTo) {\n            return sum\n        }\n    }\n    return sum\n}\n"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/StructureToStringTransformer.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmName(\"StructureToStringTransformerKt_common\")\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.jvm.JvmName\n\npublic interface StructureToStringTransformer {\n    public fun transform(any: Any?): String\n\n    public fun transformAndDesensitize(any: Any?): String\n\n    public companion object {\n        private class ObjectToStringStructureToStringTransformer : StructureToStringTransformer {\n            override fun transform(any: Any?): String = any.toString()\n            override fun transformAndDesensitize(any: Any?): String = any.toString()\n        }\n\n        public val instance: StructureToStringTransformer by lazy {\n            loadService(StructureToStringTransformer::class) {\n                getPlatformDefaultStructureToStringTransformer()\n                    ?: ObjectToStringStructureToStringTransformer()\n            }\n        }\n\n        public val available: Boolean = instance !is ObjectToStringStructureToStringTransformer\n    }\n}\n\n\ninternal expect fun getPlatformDefaultStructureToStringTransformer(): StructureToStringTransformer?\n\n/**\n * Do not call this inside [Any.toString]. `StackOverflowError` may happen.\n */\npublic fun Any?.structureToString(): String = StructureToStringTransformer.instance.transform(this)\npublic fun Any?.structureToStringIfAvailable(): String? {\n    return if (StructureToStringTransformer.available) {\n        StructureToStringTransformer.instance.transform(this)\n    } else null\n}\n\n\npublic fun Any?.structureToStringAndDesensitize(): String =\n    StructureToStringTransformer.instance.transformAndDesensitize(this)\n\npublic fun Any?.structureToStringAndDesensitizeIfAvailable(): String? {\n    return if (StructureToStringTransformer.available) {\n        StructureToStringTransformer.instance.transformAndDesensitize(this)\n    } else null\n}"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/Symbol.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.jvm.JvmName\n\n/**\n * An object with name for debugging purposes. Handy for states.\n */\npublic class Symbol private constructor(name: String) {\n    private val str = \"Symbol($name)\"\n    override fun toString(): String = str\n\n    public companion object {\n        @Suppress(\"RedundantNullableReturnType\")\n        @JvmName(\"create\")\n        public operator fun invoke(name: String): Any? = Symbol(name) // calls constructor\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/TimeUtils.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmName(\"TimeUtilsKt_common\")\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.jvm.JvmName\nimport kotlin.jvm.JvmSynthetic\nimport kotlin.math.floor\nimport kotlin.time.Duration\nimport kotlin.time.DurationUnit\nimport kotlin.time.ExperimentalTime\n\npublic expect fun currentTimeMillis(): Long\n\n/**\n * 时间戳到秒\n */\npublic fun currentTimeSeconds(): Long = currentTimeMillis() / 1000\n\npublic fun currentTimeFormatted(format: String? = null): String {\n    return formatTime(currentTimeMillis(), format)\n}\n\npublic expect fun formatTime(epochTimeMillis: Long, format: String?): String\n\n\n// 临时使用, 待 Kotlin Duration 稳定后使用 Duration.\n// 内联属性, 则将来删除这些 API 将不会导致二进制不兼容.\n\n@get:JvmSynthetic\npublic inline val Int.secondsToMillis: Long\n    get() = this * 1000L\n\n@get:JvmSynthetic\npublic inline val Int.minutesToMillis: Long\n    get() = this * 60.secondsToMillis\n\n@get:JvmSynthetic\npublic inline val Int.hoursToMillis: Long\n    get() = this * 60.minutesToMillis\n\n@get:JvmSynthetic\npublic inline val Int.daysToMillis: Long\n    get() = this * 24.hoursToMillis\n\n@get:JvmSynthetic\npublic inline val Int.weeksToMillis: Long\n    get() = this * 7.daysToMillis\n\n@get:JvmSynthetic\npublic inline val Int.monthsToMillis: Long\n    get() = this * 30.daysToMillis\n\n\n@get:JvmSynthetic\npublic inline val Int.millisToSeconds: Long\n    get() = (this / 1000).toLong()\n\n@get:JvmSynthetic\npublic inline val Int.minutesToSeconds: Long\n    get() = (this * 60).toLong()\n\n@get:JvmSynthetic\npublic inline val Int.hoursToSeconds: Long\n    get() = this * 60.minutesToSeconds\n\n@get:JvmSynthetic\npublic inline val Int.daysToSeconds: Long\n    get() = this * 24.hoursToSeconds\n\n@get:JvmSynthetic\npublic inline val Int.weeksToSeconds: Long\n    get() = this * 7.daysToSeconds\n\n@get:JvmSynthetic\npublic inline val Int.monthsToSeconds: Long\n    get() = this * 30.daysToSeconds\n\n// @MiraiExperimentalApi\n@Deprecated(\"Do not use unstable API\", level = DeprecationLevel.HIDDEN)\n@ExperimentalTime\n@DeprecatedSinceMirai(errorSince = \"2.7\", hiddenSince = \"2.10\") // maybe 2.7\npublic fun Duration.toHumanReadableString(): String {\n    val days = toInt(DurationUnit.DAYS)\n    val hours = toInt(DurationUnit.HOURS) % 24\n    val minutes = toInt(DurationUnit.MINUTES) % 60\n    val s = floor(toDouble(DurationUnit.SECONDS) % 60 * 1000) / 1000\n    return buildString {\n        if (days != 0) append(\"${days}d \")\n        if (hours != 0) append(\"${hours}h \")\n        if (minutes != 0) append(\"${minutes}min \")\n        append(\"${s}s\")\n    }\n}\n\n// since 2.7\n\npublic fun Int.millisToHumanReadableString(): String = toLongUnsigned().millisToHumanReadableString()\n\npublic fun Long.millisToHumanReadableString(): String {\n    val days = this / 1000 / 3600 / 24\n    val hours = this / 1000 / 3600 % 24\n    val minutes = this / 1000 / 60 % 60\n    val s = floor(this.toDouble() / 1000 % 60 * 1000) / 1000\n    return buildString {\n        if (days != 0L) append(\"${days}d \")\n        if (hours != 0L) append(\"${hours}h \")\n        if (minutes != 0L) append(\"${minutes}min \")\n        append(\"${s}s\")\n    }\n}\n"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/TlvMap.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport io.ktor.utils.io.core.*\nimport kotlin.jvm.JvmField\n\npublic typealias TlvMap = MutableMap<Int, ByteArray>\n\npublic fun TlvMap(): TlvMap = linkedMapOf()\n\n@Suppress(\"FunctionName\")\npublic fun Output._writeTlvMap(\n    tagSize: Int,\n    includeCount: Boolean = true,\n    map: TlvMap,\n) {\n    if (includeCount) {\n        when (tagSize) {\n            1 -> writeByte(map.size.toByte())\n            2 -> writeShort(map.size.toShort())\n            4 -> writeInt(map.size)\n            else -> error(\"Unsupported tag size: $tagSize\")\n        }\n    }\n\n    map.forEach { (key, value) ->\n        when (tagSize) {\n            1 -> writeByte(key.toByte())\n            2 -> writeShort(key.toShort())\n            4 -> writeInt(key)\n            else -> error(\"Unsupported tag size: $tagSize\")\n        }\n\n        writeShort(value.size.toShort())\n        writeFully(value)\n    }\n}\n\n@Suppress(\"MemberVisibilityCanBePrivate\")\npublic class TlvMapWriter\ninternal constructor(\n    private val tagSize: Int,\n) {\n    @JvmField\n    internal val buffer = BytePacketBuilder()\n\n    @JvmField\n    internal var counter: Int = 0\n\n    @PublishedApi\n    @JvmField\n    internal var isWriting: Boolean = false\n\n    private fun writeKey(key: Int) {\n        when (tagSize) {\n            1 -> buffer.writeByte(key.toByte())\n            2 -> buffer.writeShort(key.toShort())\n            4 -> buffer.writeInt(key)\n            else -> error(\"Unsupported tag size: $tagSize\")\n        }\n        counter++\n    }\n\n    @PublishedApi\n    internal fun ensureNotWriting() {\n        if (isWriting) error(\"Cannot write a new Tlv when writing Tlv\")\n    }\n\n    public fun tlv(key: Int, data: ByteArray) {\n        ensureNotWriting()\n        tlv0(key, data)\n    }\n\n\n    private fun tlv0(key: Int, data: ByteArray) {\n        writeKey(key)\n        buffer.writeShort(data.size.toShort())\n        buffer.writeFully(data)\n//        println(\"Writing [${key.toUHexString()}](${data.size}) => \" + data.toUHexString())\n    }\n\n    public fun tlv(key: Int, data: ByteReadPacket) {\n        ensureNotWriting()\n        tlv0(key, data)\n    }\n\n\n    @PublishedApi\n    internal fun tlv0(key: Int, data: ByteReadPacket) {\n        writeKey(key)\n        buffer.writeShort(data.remaining.toShort())\n\n//        println(\"Writing [${key.toUHexString()}](${data.remaining}) => \" + data.copy()\n//            .use { d1 -> d1.readBytes().toUHexString() })\n\n        buffer.writePacket(data)\n    }\n\n\n    public inline fun tlv(\n        key: Int,\n        crossinline builder: BytePacketBuilder.() -> Unit,\n    ) {\n        ensureNotWriting()\n        try {\n            isWriting = true\n            buildPacket(builder).use { tlv0(key, it) }\n        } finally {\n            isWriting = false\n        }\n    }\n\n}\n\npublic fun Output._writeTlvMap(\n    tagSize: Int = 2,\n    includeCount: Boolean = true,\n    block: TlvMapWriter.() -> Unit\n) {\n    val writer = TlvMapWriter(tagSize)\n    try {\n        block(writer)\n        if (includeCount) {\n            when (tagSize) {\n                1 -> writeByte(writer.counter.toByte())\n                2 -> writeShort(writer.counter.toShort())\n                4 -> writeInt(writer.counter)\n                else -> error(\"Unsupported tag size: $tagSize\")\n            }\n        }\n        writer.buffer.build().use {\n//            println(it.copy().use { it.readBytes().toUHexString() })\n\n            writePacket(it)\n        }\n    } finally {\n        writer.buffer.release()\n    }\n}\n\npublic fun TlvMap.getOrFail(tag: Int): ByteArray {\n    return this[tag] ?: error(\"cannot find tlv 0x${tag.toUHexString(\"\")}($tag)\")\n}\n\npublic fun TlvMap.getOrFail(tag: Int, lazyMessage: (tag: Int) -> String): ByteArray {\n    return this[tag] ?: error(lazyMessage(tag))\n}\n\n@Suppress(\"FunctionName\")\npublic fun Input._readTLVMap(tagSize: Int = 2, suppressDuplication: Boolean = true): TlvMap =\n    _readTLVMap(true, tagSize, suppressDuplication)\n\n@Suppress(\"DuplicatedCode\", \"FunctionName\")\npublic fun Input._readTLVMap(\n    expectingEOF: Boolean = true,\n    tagSize: Int,\n    suppressDuplication: Boolean = true\n): TlvMap {\n    val map = linkedMapOf<Int, ByteArray>()\n    var key = 0\n\n    while (kotlin.run {\n            try {\n                key = when (tagSize) {\n                    1 -> readByte().toUByte().toInt()\n                    2 -> readShort().toUShort().toInt()\n                    4 -> readInt()\n                    else -> error(\"Unsupported tag size: $tagSize\")\n                }\n            } catch (e: Exception) { // java.nio.BufferUnderflowException is not a EOFException...\n                if (expectingEOF) {\n                    return map\n                }\n                throw e\n            }\n            key\n        }.toUByte() != UByte.MAX_VALUE) {\n\n        if (map.containsKey(key)) {\n//            println(\"reading ${key.toUHexString()}\")\n\n            if (!suppressDuplication) {\n                /*\n                @Suppress(\"DEPRECATION\")\n                MiraiLogger.error(\n                    @Suppress(\"IMPLICIT_CAST_TO_ANY\")\n                    \"\"\"\n                Error readTLVMap:\n                duplicated key ${when (tagSize) {\n                        1 -> key.toByte()\n                        2 -> key.toShort()\n                        4 -> key\n                        else -> error(\"unreachable\")\n                    }.contentToString()}\n                map=${map.contentToString()}\n                duplicating value=${this.readUShortLVByteArray().toUHexString()}\n                \"\"\".trimIndent()\n                )*/\n            } else {\n                this.discardExact(this.readShort().toInt() and 0xffff)\n            }\n        } else {\n            try {\n                val len = readShort().toUShort().toInt()\n                val data = this.readBytes(len)\n//                println(\"Writing [${key.toUHexString()}]($len) => ${data.toUHexString()}\")\n                map[key] = data\n            } catch (e: Exception) { // BufferUnderflowException, java.io.EOFException\n                // if (expectingEOF) {\n                //     return map\n                // }\n                throw e\n            }\n        }\n    }\n    return map\n}\n"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/TypeSafeMap.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.serialization.Serializable\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.jvm.JvmInline\nimport kotlin.properties.ReadOnlyProperty\nimport kotlin.properties.ReadWriteProperty\nimport kotlin.reflect.KProperty\n\n/**\n * 携带值类型信息的键.\n * @see TypeSafeMap\n */\n@Serializable\n@JvmInline\npublic value class TypeKey<T>(public val name: String) {\n    override fun toString(): String = \"Key($name)\"\n\n    public inline infix fun to(value: T): TypeSafeMap = buildTypeSafeMap { set(this@TypeKey, value) }\n}\n\n/**\n * 类型安全的表. [TypeSafeMap] 使用带有值类型信息的 [TypeKey] 作为键, 可放入不同类型的值, 并且在取出时能获得期望的安全类型.\n *\n * **注意: 类型仅在编译期检查. 进行未受检类型转换将可能导致运行时问题.**\n *\n * 与 [Map] 类似, [TypeSafeMap] 是只读的实现.\n * 使用 [buildTypeSafeMap] 以构建一个表.\n *\n * @see buildTypeSafeMap\n * @see MutableTypeSafeMap\n */\npublic sealed interface TypeSafeMap {\n    public val size: Int\n\n    /**\n     * @throws NoSuchElementException\n     */\n    public operator fun <T> get(key: TypeKey<T>): T\n    public operator fun <T : S, S> get(key: TypeKey<T>, defaultValue: S): S\n    public operator fun <T> contains(key: TypeKey<T>): Boolean = get(key) != null\n\n    /**\n     * 创建键为包装类型 [TypeKey] 的 [Map]. 此方法将会包装全部键因而性能低下, 尽可能使用 [toMap] 替代.\n     */\n    public fun toMapBoxed(): Map<TypeKey<*>, Any>\n\n    /**\n     * 得到实际数据表.\n     */\n    public fun toMap(): Map<String, Any>\n\n    public operator fun <T> provideDelegate(thisRef: Any?, property: KProperty<*>): ReadOnlyProperty<Any?, T> {\n        val typeKey = TypeKey<T>(property.name)\n        return ReadOnlyProperty { _, _ -> get(typeKey) }\n    }\n\n    public companion object {\n        public val EMPTY: TypeSafeMap = TypeSafeMapImpl(emptyMap())\n    }\n}\n\npublic fun <T> TypeSafeMap.property(name: String): ReadOnlyProperty<Any?, T> {\n    return property(TypeKey(name))\n}\n\npublic fun <T> TypeSafeMap.property(typeKey: TypeKey<T>): ReadOnlyProperty<Any?, T> {\n    return ReadOnlyProperty { _, _ -> get(typeKey) }\n}\n\npublic operator fun TypeSafeMap.plus(other: TypeSafeMap): TypeSafeMap {\n    return when {\n        other.size == 0 -> this\n        this.size == 0 -> other\n        else -> buildTypeSafeMap {\n            setAll(this@plus)\n            setAll(other)\n        }\n    }\n}\n\npublic sealed interface MutableTypeSafeMap : TypeSafeMap {\n    public operator fun <T> set(key: TypeKey<T>, value: T)\n    public fun <T> remove(key: TypeKey<T>): T?\n    public fun setAll(other: TypeSafeMap)\n\n\n    public override operator fun <T> provideDelegate(\n        thisRef: Any?,\n        property: KProperty<*>\n    ): ReadWriteProperty<Any?, T> {\n        val typeKey = TypeKey<T>(property.name)\n        return object : ReadWriteProperty<Any?, T> {\n            override fun getValue(thisRef: Any?, property: KProperty<*>): T {\n                return get(typeKey)\n            }\n\n            override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {\n                set(typeKey, value)\n            }\n        }\n    }\n\n}\n\nprivate val NULL: Any = Symbol(\"NULL\")!!\n\n@PublishedApi\ninternal open class TypeSafeMapImpl(\n    @PublishedApi internal open val map: Map<String, Any> = ConcurrentHashMap()\n) : TypeSafeMap {\n    override val size: Int get() = map.size\n\n    override fun equals(other: Any?): Boolean {\n        return other is TypeSafeMapImpl && other.map == this.map\n    }\n\n    override fun hashCode(): Int {\n        return map.hashCode()\n    }\n\n    override fun toString(): String {\n        return \"TypeSafeMapImpl(map=$map)\"\n    }\n\n    override operator fun <T> get(key: TypeKey<T>): T {\n        val value = map[key.name]\n        if (value === NULL) {\n            return null.uncheckedCast()\n        }\n        return value?.uncheckedCast() ?: throw NoSuchElementException(key.toString())\n    }\n\n    override operator fun <T : S, S> get(key: TypeKey<T>, defaultValue: S): S {\n        val value = map[key.name]\n        if (value === NULL) return defaultValue\n        return value?.uncheckedCast() ?: defaultValue\n    }\n\n    override operator fun <T> contains(key: TypeKey<T>): Boolean = map.containsKey(key.name)\n\n    override fun toMapBoxed(): Map<TypeKey<*>, Any> = map.mapKeys { TypeKey<Any?>(it.key) }\n    override fun toMap(): Map<String, Any> = map\n}\n\n@PublishedApi\ninternal class MutableTypeSafeMapImpl(\n    @PublishedApi override val map: MutableMap<String, Any> = ConcurrentHashMap()\n) : TypeSafeMap, MutableTypeSafeMap, TypeSafeMapImpl(map) {\n    override fun equals(other: Any?): Boolean {\n        return other is MutableTypeSafeMapImpl && other.map == this.map\n    }\n\n    override fun hashCode(): Int {\n        return map.hashCode()\n    }\n\n    override fun toString(): String {\n        return \"MutableTypeSafeMapImpl(map=$map)\"\n    }\n\n    override operator fun <T> set(key: TypeKey<T>, value: T) {\n        if (value == null) {\n            map[key.name] = NULL\n        } else {\n            map[key.name] = value\n        }\n    }\n\n    override fun setAll(other: TypeSafeMap) {\n        if (other is TypeSafeMapImpl) {\n            map.putAll(other.map)\n        } else {\n            map.putAll(other.toMap())\n        }\n    }\n\n    override fun <T> remove(key: TypeKey<T>): T? {\n        val value = map.remove(key.name)\n        return if (value == NULL) {\n            null\n        } else {\n            value?.uncheckedCast()\n        }\n    }\n}\n\npublic fun TypeSafeMap.toMutableTypeSafeMap(): MutableTypeSafeMap = createMutableTypeSafeMap(this.toMap())\n\npublic inline fun createMutableTypeSafeMap(): MutableTypeSafeMap = MutableTypeSafeMapImpl()\npublic inline fun createMutableTypeSafeMap(map: Map<String, Any>): MutableTypeSafeMap =\n    MutableTypeSafeMapImpl().also { it.map.putAll(map) }\n\npublic inline fun createTypeSafeMap(): TypeSafeMap = TypeSafeMap.EMPTY\n\npublic inline fun buildTypeSafeMap(block: MutableTypeSafeMap.() -> Unit): MutableTypeSafeMap {\n    contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }\n    return MutableTypeSafeMapImpl().apply(block)\n}\n"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/UnsafeMutableNonNullProperty.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.jvm.JvmField\n\npublic fun <T : Any> unsafeMutableNonNullPropertyOf(\n    name: String = \"<unknown>\"\n): UnsafeMutableNonNullProperty<T> {\n    return UnsafeMutableNonNullProperty(name)\n}\n\n@Suppress(\"NOTHING_TO_INLINE\")\npublic class UnsafeMutableNonNullProperty<T : Any>(\n    private val propertyName: String = \"<unknown>\"\n) {\n    @JvmField\n    public var value0: T? = null\n\n    public val isInitialized: Boolean get() = value0 !== null\n    public var value: T\n        get() = value0 ?: throw IllegalStateException(\"Property `$propertyName` not initialized\")\n        set(value) {\n            value0 = value\n        }\n\n    public fun clear() {\n        value0 = null\n    }\n\n    public inline operator fun getValue(thiz: Any?, property: Any?): T = value\n    public inline operator fun setValue(thiz: Any?, property: Any?, value: T) {\n        value0 = value\n    }\n\n    override fun toString(): String {\n        return value0?.toString() ?: \"<uninitialized>\"\n    }\n}\n"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/UtilsLogger.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\n/**\n * Mirror of `MiraiLogger`, to be used in utils module.\n */\npublic interface UtilsLogger {\n    /**\n     * 当 VERBOSE 级别的日志启用时返回 `true`.\n     */\n    public val isVerboseEnabled: Boolean\n\n    /**\n     * 当 DEBUG 级别的日志启用时返回 `true`\n     */\n    public val isDebugEnabled: Boolean\n\n    /**\n     * 当 INFO 级别的日志启用时返回 `true`\n     */\n    public val isInfoEnabled: Boolean\n\n    /**\n     * 当 WARNING 级别的日志启用时返回 `true`\n     */\n    public val isWarningEnabled: Boolean\n\n    /**\n     * 当 ERROR 级别的日志启用时返回 `true`\n     */\n    public val isErrorEnabled: Boolean\n\n\n    /**\n     * 记录一个 `verbose` 级别的日志.\n     * 无关紧要的, 经常大量输出的日志应使用它.\n     */\n    public fun verbose(message: String?, e: Throwable? = null)\n\n    /**\n     * 记录一个 _调试_ 级别的日志.\n     */\n    public fun debug(message: String?, e: Throwable? = null)\n\n    /**\n     * 记录一个 _信息_ 级别的日志.\n     */\n    public fun info(message: String?, e: Throwable? = null)\n\n    /**\n     * 记录一个 _警告_ 级别的日志.\n     */\n    public fun warning(message: String?, e: Throwable? = null)\n\n    /**\n     * 记录一个 _错误_ 级别的日志.\n     */\n    public fun error(message: String?, e: Throwable? = null)\n\n    public companion object {\n        @OptIn(TestOnly::class)\n        private val noop: UtilsLogger by lazy {\n            SimpleUtilsLogger().apply {\n                isDebugEnabled = false\n                isErrorEnabled = false\n                isInfoEnabled = false\n                isWarningEnabled = false\n                isVerboseEnabled = false\n            }\n        }\n\n        public fun noop(): UtilsLogger = noop\n    }\n}\n\npublic fun UtilsLogger.info(e: Throwable?) {\n    info(null, e)\n}\n\npublic fun UtilsLogger.error(e: Throwable?) {\n    error(null, e)\n}\n\npublic fun UtilsLogger.warning(e: Throwable?) {\n    warning(null, e)\n}\n\npublic fun UtilsLogger.debug(e: Throwable?) {\n    debug(null, e)\n}\n\npublic fun UtilsLogger.verbose(e: Throwable?) {\n    verbose(null, e)\n}\n\n\npublic inline fun UtilsLogger.verbose(message: () -> String) {\n    if (isVerboseEnabled) verbose(message())\n}\n\npublic inline fun UtilsLogger.verbose(message: () -> String, e: Throwable?) {\n    if (isVerboseEnabled) verbose(message(), e)\n}\n\npublic inline fun UtilsLogger.debug(message: () -> String?) {\n    if (isDebugEnabled) debug(message())\n}\n\npublic inline fun UtilsLogger.debug(message: () -> String?, e: Throwable?) {\n    if (isDebugEnabled) debug(message(), e)\n}\n\npublic inline fun UtilsLogger.info(message: () -> String?) {\n    if (isInfoEnabled) info(message())\n}\n\npublic inline fun UtilsLogger.info(message: () -> String?, e: Throwable?) {\n    if (isInfoEnabled) info(message(), e)\n}\n\npublic inline fun UtilsLogger.warning(message: () -> String?) {\n    if (isWarningEnabled) warning(message())\n}\n\npublic inline fun UtilsLogger.warning(message: () -> String?, e: Throwable?) {\n    if (isWarningEnabled) warning(message(), e)\n}\n\npublic inline fun UtilsLogger.error(message: () -> String?) {\n    if (isErrorEnabled) error(message())\n}\n\npublic inline fun UtilsLogger.error(message: () -> String?, e: Throwable?) {\n    if (isErrorEnabled) error(message(), e)\n}\n\n@TestOnly\npublic open class SimpleUtilsLogger\n@TestOnly\npublic constructor() : UtilsLogger {\n    override var isVerboseEnabled: Boolean = true\n    override var isDebugEnabled: Boolean = true\n    override var isInfoEnabled: Boolean = true\n    override var isWarningEnabled: Boolean = true\n    override var isErrorEnabled: Boolean = true\n\n    override fun verbose(message: String?, e: Throwable?) {\n        if (!isVerboseEnabled) return\n        println(\"[V] $message\")\n        e?.printStackTrace()\n    }\n\n    override fun debug(message: String?, e: Throwable?) {\n        if (!isDebugEnabled) return\n        println(\"[D] $message\")\n        e?.printStackTrace()\n    }\n\n    override fun info(message: String?, e: Throwable?) {\n        if (!isInfoEnabled) return\n        println(\"[I] $message\")\n        e?.printStackTrace()\n    }\n\n    override fun warning(message: String?, e: Throwable?) {\n        if (!isWarningEnabled) return\n        println(\"[W] $message\")\n        e?.printStackTrace()\n    }\n\n    override fun error(message: String?, e: Throwable?) {\n        if (!isErrorEnabled) return\n        println(\"[E] $message\")\n        e?.printStackTrace()\n    }\n}\n"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/annotations/Range.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils.annotations\n\n@OptIn(ExperimentalMultiplatform::class)\n@Target(AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.PROPERTY, AnnotationTarget.TYPE)\n@Retention(AnnotationRetention.BINARY)\n@OptionalExpectation\npublic expect annotation class Range(val from: Long, val to: Long)"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/channels/ChannelState.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils.channels\n\nimport kotlinx.coroutines.CompletableDeferred\nimport kotlinx.coroutines.Deferred\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.Job\nimport kotlin.coroutines.CoroutineContext\n\n/**\n * Producer states.\n */\ninternal sealed interface ChannelState<T, V> {\n    /*\n     * 可变更状态的函数: [emit], [receiveOrNull], [expectMore], [finish], [finishExceptionally]\n     * \n     * [emit] 和 [receiveOrNull] 为 suspend 函数, 在图中 \"(suspend)\" 表示挂起它们的协程, \"(resume)\" 表示恢复它们的协程.\n     * \n     * \"A ~~~~~~> B\" 表示在切换为状态 A 后, 会挂起或恢复协程 B.\n     * \n     * \n     * \n     *\n     *                                  JustInitialized \n     *                                         |\n     *                                         | 调用 [expectMore]\n     *                                         |\n     *                                         V                                                      \n     *                                   ProducerReady (从此用户协程作为 producer 在后台运行)             \n     *                                         |                                                      \n     *                                         |                                                      \n     *                                         |  <--------------------------------------------------\n     *                                         |                                                     \\\n     *                                         V                                                      |\n     *                                     Producing   ([expectMore] 结束)                             |\n     *                                     |       \\                                                  |\n     *                        调用          |       \\                                                  |\n     *                    [receiveOrNull]  |        \\ 调用 [emit]                                      |\n     *                                     /         \\                                                |\n     *                                    /           \\                                               |\n     *                                   /             \\                                              |\n     *                                   |               \\                                            |\n     *                                   |                \\                                           |\n     *                                   |                 |-------------                             |\n     *                                   |                 |             \\                            |\n     *                                   |                 |              |                           |\n     *                                   |                  \\             |                           |\n     *                                   |                   \\            |                           |\n     *                                   |                    \\           |                           | \n     *                                   |                     |          |                           |\n     *                                   V       (resume)      V          |                           |            \n     *              ([receiveOrNull] suspend) <~~~~~~~~~~~~ Consuming     |                           |                  \n     *                                   |                     /          |                           |\n     *                                   |                    /           |                           |\n     *                                   |   /---------------/            |                           |\n     *                                   |  / 调用 [receiveOrNull]         |                           |\n     *                                   | /                              |                           |\n     *                                   |/                               |                           |\n     *                                   |                                |                           |\n     *                                   |                                |                           |\n     *                                   V                                |                           |  \n     *         ([receiveOrNull] 结束)  Consumed                            |                           |\n     *                                   |                                |                           |\n     *                                   | 调用 [expectMore]               |                           |\n     *                                   |                                |                           |\n     *                                   V            (resume)            V                           |\n     *                             ProducerReady ~~~~~~~~~~~~~~~~> ([emit] suspend)                   |\n     *                                   |                                |                           |\n     *                                   |                                |                           |\n     *                                   |                                V                           |\n     *                                   |                           ([emit] 结束)                     |\n     *                                   |                                                            |\n     *                                   |------------------------------------------------------------+\n     *                                                             (返回顶部 Producing)\n     * \n     * \n     * \n     * 在任意状态调用 [finish] 以及 [finishExceptionally], 可将状态转移到最终状态 [Finished].\n     * \n     * 在一个状态中调用图中未说明的函数会抛出 [IllegalProducerStateException].\n     */\n\n    /**\n     * Override this function to produce good debug information\n     */\n    abstract override fun toString(): String\n\n    class JustInitialized<T, V> : ChannelState<T, V> {\n        override fun toString(): String = \"JustInitialized\"\n    }\n\n    sealed interface HasProducer<T, V> : ChannelState<T, V> {\n        val producer: OnDemandSendChannel<T, V>\n    }\n\n    // Producer is not running until `expectMore`. `emit` and `receiveOrNull` not allowed.\n    class ProducerReady<T, V>(\n        launchProducer: () -> OnDemandSendChannel<T, V>,\n    ) : HasProducer<T, V> {\n        // Lazily start the producer job since it's on-demand\n        override val producer: OnDemandSendChannel<T, V> by lazy(launchProducer) // `lazy` is synchronized\n\n        override fun toString(): String = \"ProducerReady\"\n    }\n\n    // Producer is running. `emit` and `receiveOrNull` both allowed.\n    class Producing<T, V>(\n        override val producer: OnDemandSendChannel<T, V>,\n        parentJob: Job,\n    ) : HasProducer<T, V> {\n        val deferred: CompletableDeferred<V> by lazy { CompletableDeferred<V>(parentJob) }\n\n        override fun toString(): String = \"Producing(deferred.completed=${deferred.isCompleted})\"\n    }\n\n    // Producer is suspended because it called `emit`. Expecting `receiveOrNull`.\n    class Consuming<T, V>(\n        override val producer: OnDemandSendChannel<T, V>,\n        val value: Deferred<V>,\n        parentCoroutineContext: CoroutineContext,\n    ) : HasProducer<T, V> {\n        val producerLatch: CompletableDeferred<T> = CompletableDeferred(parentCoroutineContext[Job])\n\n        override fun toString(): String {\n            @OptIn(ExperimentalCoroutinesApi::class)\n            val completed =\n                value.runCatching { getCompleted().toString() }.getOrNull() // getCompleted() is experimental\n            return \"Consuming(value=$completed)\"\n        }\n    }\n\n    // Producer is suspended. `expectMore` will resume producer with a ticket.\n    class Consumed<T, V>(\n        override val producer: OnDemandSendChannel<T, V>,\n        val producerLatch: CompletableDeferred<T>\n    ) : HasProducer<T, V> {\n        override fun toString(): String = \"Consumed($producerLatch)\"\n    }\n\n    class Finished<T, V>(\n        private val previousState: ChannelState<T, V>,\n        val exception: Throwable?,\n    ) : ChannelState<T, V> {\n        val isSuccess: Boolean get() = exception == null\n\n        fun createAlreadyFinishedException(cause: Throwable?): IllegalChannelStateException {\n            val exception = exception\n            val causeMessage = if (cause == null) {\n                \"\"\n            } else {\n                \", but attempting to finish with the cause $cause\"\n            }\n            return if (exception == null) {\n                IllegalChannelStateException(\n                    this,\n                    \"Producer has already finished normally$causeMessage. Previous state was: $previousState\",\n                    cause = cause\n                )\n            } else {\n                IllegalChannelStateException(\n                    this,\n                    \"Producer has already finished with the suppressed exception$causeMessage. Previous state was: $previousState\",\n                    cause = cause\n                ).apply {\n                    addSuppressed(exception)\n                }\n            }\n        }\n\n        override fun toString(): String = \"Finished($previousState, $exception)\"\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/channels/IllegalChannelStateException.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils.channels\n\n// An internal error exception\npublic class IllegalChannelStateException internal constructor(\n    private val state: ChannelState<*, *>,\n    message: String? = state.toString(),\n    cause: Throwable? = null,\n) : IllegalStateException(message, cause) {\n    public val lastStateWasSucceed: Boolean get() = (state is ChannelState.Finished) && state.isSuccess\n}"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/channels/OnDemandChannelImpl.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils.channels\n\nimport kotlinx.atomicfu.AtomicRef\nimport kotlinx.atomicfu.atomic\nimport kotlinx.atomicfu.loop\nimport kotlinx.coroutines.*\nimport net.mamoe.mirai.utils.TestOnly\nimport net.mamoe.mirai.utils.UtilsLogger\nimport net.mamoe.mirai.utils.childScope\nimport net.mamoe.mirai.utils.debug\nimport kotlin.coroutines.CoroutineContext\n\n\ninternal class CoroutineOnDemandReceiveChannel<T, V>(\n    parentCoroutineContext: CoroutineContext,\n    private val logger: UtilsLogger,\n    private val producerCoroutine: suspend OnDemandSendChannel<T, V>.(initialTicket: T) -> Unit,\n) : OnDemandReceiveChannel<T, V> {\n    private val coroutineScope = parentCoroutineContext.childScope(\"CoroutineOnDemandReceiveChannel\")\n\n    @TestOnly\n    internal fun getScope() = coroutineScope\n\n    private val state: AtomicRef<ChannelState<T, V>> = atomic(ChannelState.JustInitialized())\n\n    @TestOnly\n    internal fun getState() = state.value\n\n\n    inner class Producer(\n        private val initialTicket: T,\n    ) : OnDemandSendChannel<T, V> {\n        init {\n            // `UNDISPATCHED` with `yield()`: start the coroutine immediately in current thread,\n            // attaching Job to the coroutineScope, then `yield` the thread back, to complete `launch`.\n            coroutineScope.launch(start = CoroutineStart.UNDISPATCHED) {\n                yield()\n\n                try {\n                    producerCoroutine(initialTicket)\n                } catch (e: Throwable) {\n                    // close exceptionally\n                    val r = emitImpl(Result.failure(e))\n                    check(r == null) // assertion\n                    return@launch\n                }\n\n                close()\n            }\n        }\n\n        override suspend fun emit(value: V): T = emitImpl(Result.success(value))!!\n\n        private suspend inline fun emitImpl(value: Result<V>): T? {\n            state.loop { state ->\n                when (state) {\n                    is ChannelState.Finished -> {\n                        if (value.isFailure) {\n                            return null\n                        } else {\n                            throw state.createAlreadyFinishedException(null)\n                        }\n                    }\n\n                    is ChannelState.Producing -> {\n                        val deferred = state.deferred\n                        val consumingState = ChannelState.Consuming(\n                            state.producer,\n                            state.deferred,\n                            coroutineScope.coroutineContext\n                        )\n                        if (compareAndSetState(state, consumingState)) {\n                            deferred.completeWith(value) // produce a value\n                            return consumingState.producerLatch.await() // wait for producer to consume the previous value.\n                        }\n                        // failed race, try again\n                    }\n\n                    is ChannelState.ProducerReady -> {\n                        // This implies another coroutine is running `expectMore`,\n                        // and we are a bit faster than it!\n                        setStateProducing(state)\n                    }\n\n                    else -> throw IllegalChannelStateException(\n                        state,\n                        if (value.isFailure)\n                            \"Producer threw an exception (see cause), so completing with the exception, but current state is not Producing\"\n                        else \"Producer is emitting an value, but current state is not Producing\",\n                        value.exceptionOrNull()\n                    )\n\n                }\n            }\n        }\n    }\n\n    private fun setStateProducing(state: ChannelState.ProducerReady<T, V>): Boolean {\n        return compareAndSetState(state, ChannelState.Producing(state.producer, coroutineScope.coroutineContext.job))\n    }\n\n    private fun setStateFinished(\n        currState: ChannelState<T, V>,\n        message: String,\n        exception: ProducerFailureException?\n    ): Boolean {\n        if (compareAndSetState(currState, ChannelState.Finished(currState, exception))) {\n            val cancellationException = CancellationException(message, exception)\n            coroutineScope.cancel(cancellationException)\n            return true\n        }\n        return false\n    }\n\n    private fun compareAndSetState(state: ChannelState<T, V>, newState: ChannelState<T, V>): Boolean {\n        return this.state.compareAndSet(state, newState).also {\n            logger.debug { \"CAS: $state -> $newState: $it\" }\n        }\n    }\n\n    override val isClosed: Boolean\n        get() = state.value is ChannelState.Finished\n\n    override suspend fun receiveOrNull(): V? {\n        // don't use atomicfu `.loop`:\n        // java.lang.VerifyError: Bad type on operand stack\t\n        //     net/mamoe/mirai/utils/channels/CoroutineOnDemandReceiveChannel.receiveOrNull(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; @103: getfield\t\n\n        while (true) {\n            when (val state = state.value) {\n                is ChannelState.Consuming -> {\n                    // value is ready, now we try to consume the value\n\n                    if (compareAndSetState(state, ChannelState.Consumed(state.producer, state.producerLatch))) {\n                        // value is now reserved for us, no contention is possible, safe to retrieve\n\n                        // This actually won't suspend (there are tests ensuring this point), \n                        // since the value is already completed.\n                        // Just to be error-tolerating and re-throwing exceptions. \n                        // (Also because `Deferred.getCompleted()` is not stable yet (coroutines 1.6))\n                        return awaitValueSafe(state.value)\n                    }\n                }\n\n                // note: actually, this case should be the first case (for code consistency) in `when`, \n                // but atomicfu 1.8.10 fails on this.\n                is ChannelState.Producing<T, V> -> {\n                    // still producing value\n\n                    // Wait for value and throw exception caused by the producer if there is one.\n                    awaitValueSafe(state.deferred) // this may or may not suspend.\n\n                    // Now deferred is complete, and we will be in the Consuming state, but we can't use the value here.\n                    // We must ensure only one thread gets the value, and state should then be Consumed\n\n                    // So we loop again and do this in the Consuming state.\n                }\n\n                is ChannelState.Finished -> {\n                    // see public API docs for behavior\n                    return null\n                }\n\n                else ->\n                    // internal error \n                    throw IllegalChannelStateException(state)\n            }\n        }\n    }\n\n    private suspend inline fun awaitValueSafe(deferred: Deferred<V>) = try {\n        deferred.await()\n    } catch (e: Throwable) {\n        // Producer failed to produce the previous value with exception\n        val producerFailureException = ProducerFailureException(cause = e)\n        setStateFinished(\n            this.state.value,\n            \"OnDemandChannel is closed because producer failed to produce value, see cause\",\n            producerFailureException\n        )\n        throw producerFailureException\n    }\n\n    override fun expectMore(ticket: T): Boolean {\n        state.loop { state ->\n            when (state) {\n                is ChannelState.JustInitialized -> {\n                    // start producer atomically\n                    val ready = ChannelState.ProducerReady { Producer(ticket) }\n                    compareAndSetState(state, ready)\n                    // loop again\n                }\n\n                is ChannelState.ProducerReady -> {\n                    if (setStateProducing(state)) {\n                        return true\n                    }\n                    // lost race, try again\n                }\n\n                is ChannelState.Producing,\n                is ChannelState.Consuming -> throw IllegalChannelStateException(state) // a value is already ready\n\n                is ChannelState.Consumed -> {\n                    if (compareAndSetState(state, ChannelState.ProducerReady { state.producer })) {\n                        // wake up producer async.\n                        state.producerLatch.complete(ticket)\n                        // loop again to switch state atomically to Producing. \n                        // Do not do switch state directly here — async producer may race with you! \n                    }\n                }\n\n                is ChannelState.Finished -> return false\n            }\n        }\n    }\n\n    override fun close() {\n        state.loop { state ->\n            when (state) {\n                is ChannelState.Finished -> return\n                else -> if (setStateFinished(state, \"OnDemandChannel is closed normally\", null)) return\n            }\n        }\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/channels/OnDemandSendChannel.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils.channels\n\nimport kotlinx.coroutines.Deferred\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.channels.ReceiveChannel\nimport kotlinx.coroutines.channels.SendChannel\nimport net.mamoe.mirai.utils.UtilsLogger\nimport kotlin.coroutines.Continuation\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\nimport kotlin.coroutines.cancellation.CancellationException\n\n/**\n * 按需供给的 [SendChannel].\n *\n * @param T 令牌类型.\n * @param V 值类型.\n */\npublic interface OnDemandSendChannel<T, V> {\n    /**\n     * 挂起协程, 直到 [OnDemandReceiveChannel] [期望接收][OnDemandReceiveChannel.receiveOrNull]一个 [V],\n     * 届时将 [value] 传递给 [OnDemandReceiveChannel.receiveOrNull], 成为其返回值.\n     *\n     * 若在调用 [emit] 时已经有 [OnDemandReceiveChannel.receiveOrNull] 正在等待, 则该协程会立即[恢复][Continuation.resumeWith], [emit] 不会挂起.\n     *\n     * 若 [OnDemandReceiveChannel] 已经[完结][OnDemandReceiveChannel.close], [OnDemandSendChannel.emit] 会抛出 [IllegalChannelStateException].\n     *\n     * @see OnDemandReceiveChannel.receiveOrNull\n     *\n     * @param value 需要传递给 [OnDemandReceiveChannel.receiveOrNull] 的值\n     * @return 下一个 ticket [T].\n     *\n     * @throws CancellationException 当此协程被取消时抛出\n     */\n    public suspend fun emit(value: V): T\n}\n\n\n/**\n * 线程安全的按需接收通道.\n *\n * 与 [ReceiveChannel] 不同, [OnDemandReceiveChannel] 只有在调用 [expectMore] 后才会让[生产者][OnDemandSendChannel] 开始生产下一个 [V].\n */\npublic interface OnDemandReceiveChannel<T, V> {\n    /**\n     * 当此 [OnDemandReceiveChannel] 已经关闭, 即不再期望更多值时返回 `true`,\n     * 无论是调用了 [close] (主动关闭) 还是 [OnDemandSendChannel] 没有更多值了 (被动关闭).\n     */\n    public val isClosed: Boolean\n\n    /**\n     * 尝试从 [OnDemandSendChannel] [接收][OnDemandSendChannel.emit]一个 [V].\n     * 当且仅当在 [OnDemandSendChannel] 已经正常结束时返回 `null`.\n     *\n     * 若目前已有 [V], 此函数立即返回该 [V], 不会挂起.\n     * 否则, 此函数将会挂起直到 [OnDemandSendChannel.emit].\n     *\n     * 当此函数被多个协程 (线程) 同时调用时, 只有一个协程会获得 [V], 其他协程将会挂起.\n     *\n     * 若在等待过程中 [OnDemandSendChannel] 异常结束,\n     * 本函数会立即恢复并抛出 [ProducerFailureException], 其 `cause` 为令 [OnDemandSendChannel] 的异常.\n     *\n     * 此挂起函数可被取消.\n     * 如果在此函数挂起时当前协程的 [Job] 被取消或完结, 此函数会立即恢复并抛出 [CancellationException]. 此行为与 [Deferred.await] 相同.\n     *\n     * @throws ProducerFailureException 当 [OnDemandSendChannel] 产生了一个异常时抛出.\n     * @throws CancellationException 当协程被取消时抛出\n     * @throws IllegalChannelStateException 当状态异常, 如未调用 [expectMore] 时抛出\n     */\n    @Throws(ProducerFailureException::class, CancellationException::class)\n    public suspend fun receiveOrNull(): V?\n\n    /**\n     * 期待 [OnDemandSendChannel] 再生产一个 [V].\n     * 期望生产后必须在之后调用 [receiveOrNull] 或 [close] 来消耗生产的 [V].\n     * 不可连续重复调用 [expectMore].\n     *\n     * 在成功发起期待后返回 `true`; 在 [OnDemandSendChannel] 已经[完结][OnDemandSendChannel.finish] 时返回 `false`.\n     *\n     * @throws IllegalChannelStateException 当 [expectMore] 被调用后, 没有调用 [receiveOrNull] 就又调用了 [expectMore] 时抛出\n     */\n    public fun expectMore(ticket: T): Boolean\n\n    /**\n     * 标记此 [OnDemandSendChannel] 已经不再需要更多的值.\n     *\n     * 如果 [OnDemandSendChannel] 仍在运行 (无论是挂起中还是正在计算下一个值), 都会正常地[取消][Job.cancel] [OnDemandSendChannel].\n     *\n     * 若此 [OnDemandSendChannel] 已经被关闭, 则此函数不会进行任何操作.\n     *\n     * 在 [close] 之后若尝试调用 [OnDemandSendChannel.emit], [OnDemandReceiveChannel.receiveOrNull] 或 [OnDemandReceiveChannel.expectMore] 都会导致 [IllegalStateException].\n     */\n    public fun close()\n}\n\n@Suppress(\"FunctionName\")\npublic fun <T, V> OnDemandChannel(\n    parentCoroutineContext: CoroutineContext = EmptyCoroutineContext,\n    logger: UtilsLogger = UtilsLogger.noop(),\n    producerCoroutine: suspend OnDemandSendChannel<T, V>.(initialTicket: T) -> Unit,\n): OnDemandReceiveChannel<T, V> = CoroutineOnDemandReceiveChannel(parentCoroutineContext, logger, producerCoroutine)\n\n"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/channels/ProducerFailureException.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils.channels\n\npublic class ProducerFailureException(\n    override val message: String? = \"Producer failed to produce a value, see cause\",\n    override var cause: Throwable?\n) : Exception() {\n    private val unwrapped: Throwable by lazy {\n        val cause = cause ?: return@lazy this\n        this.cause = null\n        cause.also { addSuppressed(this) }\n    }\n\n    public fun unwrap(): Throwable = unwrapped\n}"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/package.kt",
    "content": "/*\n * Copyright 2020 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.utils"
  },
  {
    "path": "mirai-core-utils/src/commonMain/kotlin/systemProp.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\n@file:JvmMultifileClass\n@file:JvmName(\"MiraiUtils\")\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.jvm.JvmMultifileClass\nimport kotlin.jvm.JvmName\n\ninternal expect fun getProperty(name: String, default: String): String?\n\ninternal expect fun setProperty(name: String, value: String)\n\npublic fun setSystemProp(name: String, value: String): Unit = setProperty(name, value)\n\npublic fun systemProp(name: String, default: String): String =\n    getProperty(name, default) ?: default\n\npublic fun systemProp(name: String, default: Boolean): Boolean =\n    getProperty(name, default.toString())?.toBoolean() ?: default\n\n\npublic fun systemProp(name: String, default: Long): Long =\n    getProperty(name, default.toString())?.toLongOrNull() ?: default\n\n\nprivate val debugProps = ConcurrentHashMap<String, Boolean>()\npublic fun Any?.toDebugString(prop: String, default: Boolean = false): String {\n    if (this == null) return \"null\"\n    val debug = debugProps.getOrPut(prop) { systemProp(prop, default) }\n    return if (debug) {\n        \"${this::class.simpleName}($this)\"\n    } else {\n        \"${this::class.simpleName}\"\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/commonTest/kotlin/net/mamoe/mirai/utils/CommonByteArrayOpTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(TestOnly::class)\n\npackage net.mamoe.mirai.utils\n\nimport io.ktor.utils.io.core.*\nimport kotlin.random.Random\nimport kotlin.test.Test\nimport kotlin.test.assertContentEquals\nimport kotlin.test.assertEquals\nimport kotlin.test.assertTrue\n\ninternal expect class ByteArrayOpTest() :\n    CommonByteArrayOpTest // will run all tests in CommonByteArrayOpTest again but fine\n\ninternal open class CommonByteArrayOpTest {\n    protected val sampleLongText = // 574 chars\n        \"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.\"\n\n    @Test\n    fun testAvailableProcessors() {\n        val processors = availableProcessors()\n        assertTrue(processors.toString()) { processors > 0 }\n    }\n\n    @Test\n    fun testMd5() {\n        val str = getRandomString(10, Random(1))\n        println(str)\n        val hash = str.md5()\n        assertContentEquals(\n            \"30 3B 36 B3 42 00 39 E2 EC 18 22 79 10 32 05 48\".hexToBytes(),\n            hash,\n            message = hash.toUHexString()\n        )\n    }\n\n    @Test\n    fun testMd5WithOffset() {\n        val str = getRandomString(10, Random(1))\n        println(str)\n        val hash = (byteArrayOf(1) + str.toByteArray()).md5(1)\n        assertContentEquals(\n            \"30 3B 36 B3 42 00 39 E2 EC 18 22 79 10 32 05 48\".hexToBytes(),\n            hash,\n            message = hash.toUHexString()\n        )\n    }\n\n    @Test\n    fun testSha1() {\n        val str = getRandomString(10, Random(1))\n        println(str)\n        val hash = str.sha1()\n        assertContentEquals(\n            \"54 98 CD 62 6C DE E3 9B 96 D4 34 5E 13 51 48 BB FC 32 1C 48\".hexToBytes(),\n            hash,\n            message = hash.toUHexString()\n        )\n    }\n\n    @Test\n    fun testDeflate() {\n        val str = \"qGnJ1RrFC9\"\n        println(str)\n        val hash = str.toByteArray().deflate()\n        assertContentEquals( // if we change\n            \"78 9C 2B 74 CF F3 32 0C 2A 72 73 B6 04 00 12 82 03 28\".hexToBytes(),\n            hash,\n            message = hash.toUHexString()\n        )\n\n        assertEquals(str, str.toByteArray().deflate().inflate().decodeToString())\n    }\n\n    @Test\n    fun testInflate() {\n        val result =\n            \"78 9C 2B 74 CF F3 32 0C 2A 72 73 B6 04 00 12 82 03 28\".hexToBytes()\n                .inflate().decodeToString()\n        assertEquals(\n            \"qGnJ1RrFC9\",\n            result,\n            message = result\n        )\n    }\n\n    @Test\n    fun testInflateRealLongData() {\n        val result =\n            \"78 DA ED D9 6D 50 DB E6 1D 00 70 49 E6 45 D6 B5 19 73 9B 8E B0 2F 9A 3E AC 59 EF 8A 1F C9 06 D9 5E DC DD B1 DB 5D BB 6B EF F6 65 B7 DE F6 21 A3 AE 21 4E 8C 63 C0 64 D9 3E 51 F2 E6 40 78 33 64 25 6F 84 92 00 CE 08 85 00 0D 0A 25 90 B6 59 E9 BA 8C D2 A4 D7 5E 9B A4 C9 06 B6 43 5E 69 93 90 34 69 93 3D B2 1C 59 C6 12 71 81 72 C7 45 3E CE 77 92 2D F1 7F FE CF EF F9 DF 5F 7E 70 44 87 64 50 69 DE E3 57 EA 53 D2 EB 1B 0E B7 13 64 5F EB 58 39 B1 BC A2 F9 DE 69 F4 E5 F2 3B 1F 06 B4 7F 5E EA 46 48 F4 99 F2 35 F8 7D F8 FA 51 5A 5F EB BE 1B 58 3A 4A ED 46 89 E5 78 F8 20 ED EC 57 BE BE D4 F4 33 C9 24 B2 BC A5 0C 05 9F 1E 1A A9 4F 31 9D D9 E4 DD 50 0A 5F 18 87 22 3A 1C 47 D2 90 74 84 44 32 F2 08 44 F7 4A A6 F7 14 FB 63 E4 4F 7F FC 4D 46 06 7E AB 96 4C FB 84 BF 22 BD BB 31 38 A1 81 F7 40 C0 77 0D 9B 9B 52 F0 F0 FB 33 18 8E 00 C4 84 FC 76 19 8E EB 96 06 76 35 8D 73 FD C1 DD 5B 27 EA 77 04 BC ED 81 8E D7 C7 4A CB 38 CC 7F B7 E5 14 86 A7 92 E1 70 FC D8 ED 5A 92 DA 85 12 4F C7 87 37 F0 2C D8 D1 9D 78 74 CB F0 EF 60 74 F5 FC 15 E9 65 9F 85 56 85 83 1B BB F3 CD E7 04 1E 7E 17 83 CB C0 93 75 4F 05 BA 0E 05 1B 3A 2F 0C EE 1B 3F E2 0D B5 34 86 DA 1A 26 F7 36 54 71 D8 9D F3 5D 5D DA 68 74 F7 60 74 F2 C9 AB BF AD 01 57 0F 7F 9F E4 95 F9 C8 B4 CB FC 15 E9 97 A7 DA CE A4 CE 2A 79 BB BA 6A 7A 93 A2 E1 C1 5B 52 77 92 E5 C2 3B 7C 40 03 6E F4 09 E1 9D A8 90 09 EF BD 64 18 DF 60 32 1F E0 93 58 1F FE A4 70 CB 55 4F 9C 44 1B 93 F1 C7 D2 5A F0 F4 54 70 05 B7 3C 4E 68 5D 0E DB 9A 95 C5 9E 22 5A 87 48 0F 19 78 F8 14 81 97 38 5C C2 87 04 63 00 26 33 60 0C 46 56 72 9E 81 E7 19 36 0B B0 0C 0B 80 65 09 A1 F5 FC D5 6D 17 3E 40 81 E5 17 04 51 5C 92 97 E7 58 CF 9F D1 FD 34 B4 73 E3 44 47 7D B0 67 FB 44 C3 5B 81 EA 86 A0 B7 66 BC 7F 73 68 5B 7B C0 DF 60 79 9E 58 92 6B F3 38 D6 BA 56 3A 0A F2 57 96 14 39 75 D9 AB 3C 1E B7 45 AF F7 38 72 5D 85 25 B9 AE CC 7C 0F FC 28 D3 E6 D2 BB 4A 5E CD B7 DB F3 F2 EC 36 8F DE E1 B1 17 E8 59 BD CD E9 B0 BB 3C 99 F9 8E 3C CB 52 02 CF 75 7A 84 A0 B5 41 6F 0F FC 1F F0 DD F2 07 22 75 B5 5B 38 FB 22 7F E7 62 78 EB BF BD 92 B9 CE E1 CE 2C 2C CC B4 AD 2D D0 AF 63 F4 EE DC 7C 7B B1 70 FF 97 72 9D CE 5F AD FC CB 3A 2B F3 F3 DC 02 F7 2F 85 E0 5E 78 D5 0A C2 87 C2 7F 87 87 6C CE 07 D8 0A 18 99 9B CC 75 3A F2 5D 56 CA 06 E3 B0 17 51 CF 91 F0 B5 A2 B0 90 84 89 B2 52 D1 DC 51 A4 6D AD D3 4A D1 14 E9 2A B0 52 14 A9 17 BE 08 47 46 16 17 D9 AC D4 EC 06 4D 91 AB DD C2 B5 F3 35 2C 0A 8E C7 63 A5 C4 FC 51 7C A0 D1 F1 88 73 3E 7D 3C 1E 18 07 A0 22 A3 72 AD 2D 22 3D EB E1 6D 66 98 79 FE BB 2B F4 7C 06 9F FB 5D 55 E3 F1 6F 34 1C 76 7F 70 E3 AF FD 58 25 C4 7F 4D 16 FF D4 B7 18 B8 15 C1 7F 4C 0E 3F C7 E3 EF 89 E0 3F 28 C5 EF 13 F1 5F 9E 2D FE A5 12 FC 5A 13 9B 6D 30 18 0D 66 43 9C 7D 7D 8C FD 9F C1 0C 5C D8 C0 4D 6C F0 07 AA 6B 03 5B FA E1 F0 27 7C CD C1 3D 43 F0 7C 60 5F D7 C4 DE 1E CB 4F 08 22 B2 02 F8 0B B4 C1 8A 4A 3E F3 15 95 96 17 E3 96 86 65 66 25 C2 B7 05 25 B4 DE BE DE 5D 64 2F 2E 86 67 32 57 BB F3 E1 42 13 D7 81 75 2E 60 E8 9C 63 0A F0 13 53 9F 28 F9 99 06 33 77 F6 B4 10 8B 08 55 CC 7A 98 E5 83 81 88 B3 AC A8 3D 86 FA CC 13 2D 05 FF D5 40 F3 B5 54 0E 3B 3D D4 5E A7 F1 63 55 50 FC B0 AC F8 52 9F 06 DC 8D 88 9F 2C 97 11 5F C3 8B AF 88 88 DF 28 15 7F 31 69 76 E2 E9 6C 96 35 31 06 1A D0 D3 CA 7D 74 25 4C 27 9F 11 43 FE 31 7E C4 5D D5 A1 AD BB E0 5F 9C EE CA 6A 3E CF 95 D5 73 D3 6D FE A1 74 9B 73 0E 3E 4C 77 34 41 F3 A4 DB 3C EF BA CD D3 75 3F C8 7A 8C 6E E5 65 2A CF 5B 9C 54 A9 E4 A6 1B 3B 26 61 E9 AE EA DD 73 1D F5 63 D5 50 F2 78 B2 5C D7 77 9E 00 F7 22 90 0F CA 95 EE 37 79 C8 07 22 90 9B A5 90 BD 73 2F DD 31 90 25 C0 1F DE B7 04 FD 6F 04 1A 2B AE 0D 6C 0B 36 77 06 FA 5B 43 DE CD A1 32 0E E6 72 F1 55 ED B7 1F 99 AA AD BC 40 E5 5D 2B CD B1 94 F9 7F 83 F7 CB 92 38 AC EE 64 B8 60 F3 CC AF CA 32 1F 7D 02 6C E2 D4 0E 45 ED 50 16 7B 87 12 FA DF 7F CA 60 87 52 F7 E5 B1 2E AD 00 FE AE 6C 87 72 EA 04 0A BC 11 F1 A3 72 E2 8F F3 E2 87 22 E2 39 F5 81 54 7D 20 5D 04 0F A4 53 DF DE 3D 90 02 FB 73 DF D4 17 B0 AB A9 51 D4 1F 68 45 41 68 DF E8 82 EA 07 66 63 16 63 62 61 61 57 F5 7F 5F FD 62 EE 54 FD 33 E8 6F DB 7F E2 24 AC FD 17 CF 36 37 63 7E EC 9F 8A BF C7 34 0D A3 E0 62 44 FF 42 75 3B 51 FD 6A B7 93 70 B7 33 13 7B B5 DB 81 E2 CF FA 03 95 50 7C 7F C7 BF 8F E2 7E EC 7D C5 F6 FE 74 12 F0 1D 5E 58 F0 70 79 67 65 D1 2C C3 A8 E0 13 07 2F 26 4D 05 2F 0F BE AF FB DC 30 CA 61 7D 53 6D 47 53 FC D8 07 8A 25 7E E8 35 0D F8 E8 CA C2 8A 37 D1 34 63 64 0D 46 A0 8A 4F 5C BC 98 34 55 BC BC F8 DE ED 6F F7 26 71 D8 9E E1 E1 F3 B0 A5 FF 48 51 FC CD 33 18 38 AD 8A 57 C5 2F 7A F1 83 DB C6 7C 1A 0E 1B FD BA 76 E4 71 3F 36 0A C5 77 C8 36 35 FF F8 3D 38 D2 F6 69 18 FC 80 DC 1E D3 AD 24 08 FE EB 24 01 FC 1A 29 F8 8F 67 B9 C7 C4 18 69 B3 81 31 01 26 3B F6 19 D6 90 6D C8 CE 02 0C 30 31 71 E2 97 C4 88 47 E2 40 8B 0F 98 73 02 0D 7E 28 D0 20 A7 E9 A1 A0 C5 A4 CC 13 68 30 EF A0 C1 74 D0 D2 C7 52 71 20 D1 59 4C 40 B4 14 EC CD CB 2D 4E 0E 2B BF 79 96 EF 49 B6 D4 91 D4 29 D9 0A 7D EE B6 46 04 EB 95 AB D0 BB F9 0A FD 7A A4 42 D7 48 C1 4E CD 12 AC 04 66 EC 8F 2E 51 C8 D3 C1 92 31 60 75 FC 0A DD DF CB 6F 32 54 6D 85 39 BB 36 F0 DA E2 AB C9 DD 0F 23 AC 3C F3 8B AC 26 2B AF 45 85 AD D1 D8 A9 95 A2 FE 7B E9 C8 78 32 87 DD 38 32 D2 AE 15 54 77 CA AA EE E8 44 C1 97 11 D5 C7 E4 CA F0 6D BE 0C 5F 8F 94 61 A7 54 F5 C9 D9 6E F5 9B 58 93 89 36 19 4C B4 5A 86 A3 BB 87 62 52 1E D5 32 1C 1A 69 DD 92 CA 61 23 E5 93 6F 44 EA F0 9B B2 7D C3 78 1A 08 2D 2C 58 06 C0 C7 7A 90 C5 64 99 55 B0 92 5F F7 1E 24 E5 51 05 7B E9 52 DD 18 DF E8 1E EF D9 AF F1 63 5E 01 AC 4C 89 DD 54 8E 81 EB 0B DC E9 AA 62 55 B1 F1 62 3B BA 4B 21 D8 F7 EB FE F5 0E EC 09 B6 2A F6 04 9F F8 35 60 CF BB 0B 5B 62 59 9A 36 02 C6 90 C5 AA 60 25 BF 27 3F 48 CA A3 0A 76 43 E8 EA 25 D8 C5 4E DE 7F A7 19 F6 04 E5 75 4A 1B E2 C3 53 51 B1 0B B4 21 AE F8 6C 16 95 3C 5D EC D3 31 62 97 F1 BF AA 6C E4 2E 74 C2 1E 7E 67 D0 5B 1B F2 1E 1A 3F DA 34 B9 D7 B7 DD F2 42 9C 58 36 F1 9D 61 DA A8 B8 1F 3E DE DF 0D 67 07 BE 5B 5E 8E 2A 7E 69 2E F3 6F 88 DD 38 A6 8D 09 6D 88 CF F8 C0 36 CB 0D F1 98 61 CF 1D 76 DC C0 22 5B E2 62 0A A7 6D 89 2B 2E 55 C5 2D 71 F9 B9 97 EA 1F 6A DF 79 11 E5 B0 73 B5 1F 0E 0A FA 01 6A 42 73 90 E7 91 FF 03 32 BC E8 A3\"\n                .hexToBytes().inflate().toUHexString()\n\n        println(result)\n    }\n\n    @Test\n    fun testGzip() {\n        val str = sampleLongText\n//        val hash = str.toByteArray().gzip()\n//        assertContentEquals(\n//            \"1F 8B 08 00 00 00 00 00 00 13 2B 74 CF F3 32 0C 1F 8B 08 00 00 00 00 00 00 13 2B 74 CF F3\".hexToBytes(),\n//            hash,\n//            message = hash.toUHexString()\n//        )\n\n        assertEquals(str, str.toByteArray().gzip().ungzip().decodeToString())\n    }\n\n    @Test\n    fun testUnGzip() {\n        val result =\n            \"1F 8B 08 00 00 00 00 00 00 FF 2B 74 CF F3 32 0C 2A 72 73 B6 04 00 A8 35 6D D9 0A 00 00 00\".hexToBytes()\n                .ungzip().decodeToString()\n        assertEquals(\n            \"qGnJ1RrFC9\",\n            result,\n            message = result\n        )\n    }\n\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Input consume all\n    ///////////////////////////////////////////////////////////////////////////\n\n\n    @Test\n    fun testInputAllUnGzip() {\n        var released = false\n        val result =\n            \"1F 8B 08 00 00 00 00 00 00 FF 2B 74 CF F3 32 0C 2A 72 73 B6 04 00 A8 35 6D D9 0A 00 00 00\".hexToBytes()\n                .toReadPacket(release = { released = true }).let { input ->\n                    input.ungzipAllAvailable().decodeToString().also {\n                        assertEquals(true, input.endOfInput)\n                        assertEquals(true, released)\n                    }\n                }\n\n        assertEquals(\n            \"qGnJ1RrFC9\",\n            result,\n            message = result\n        )\n    }\n\n    @Test\n    fun testInputAllGzip() {\n        var released = false\n        val result =\n            sampleLongText.toByteArray()\n                .toReadPacket(release = { released = true }).let { input ->\n                    input.gzipAllAvailable().also {\n                        assertEquals(true, input.endOfInput)\n                        assertEquals(true, released)\n                    }\n                }\n        println(result.toUHexString())\n        assertEquals(sampleLongText, result.ungzip().decodeToString())\n    }\n\n    @Test\n    fun testInputAllDeflate() {\n        var released = false\n\n        val str = \"qGnJ1RrFC9\"\n        println(str)\n        val hash = str.toByteArray().toReadPacket(release = { released = true }).let { input ->\n            input.deflateAllAvailable().also {\n                assertEquals(true, input.endOfInput)\n                assertEquals(true, released)\n            }\n        }\n\n        assertContentEquals( // if we change\n            \"78 9C 2B 74 CF F3 32 0C 2A 72 73 B6 04 00 12 82 03 28\".hexToBytes(),\n            hash,\n            message = hash.toUHexString()\n        )\n\n        assertEquals(str, hash.inflate().decodeToString())\n    }\n\n    @Test\n    fun testInputAllInflate() {\n        var released = false\n\n        val result =\n            \"78 9C 2B 74 CF F3 32 0C 2A 72 73 B6 04 00 12 82 03 28\".hexToBytes()\n                .toReadPacket(release = { released = true }).let { input ->\n                    input.inflateAllAvailable().also {\n                        assertEquals(true, input.endOfInput)\n                        assertEquals(true, released)\n                    }\n                }.decodeToString()\n\n        assertEquals(\n            \"qGnJ1RrFC9\",\n            result,\n            message = result\n        )\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Input\n    ///////////////////////////////////////////////////////////////////////////\n\n\n    @Test\n    fun testInputUnGzip() {\n        var released = false\n        val result =\n            \"1F 8B 08 00 00 00 00 00 00 FF 2B 74 CF F3 32 0C 2A 72 73 B6 04 00 A8 35 6D D9 0A 00 00 00\".hexToBytes()\n                .toReadPacket(release = { released = true }).let { input ->\n                    GzipDecompressionInput(input).readAllText().also {\n                        assertEquals(true, input.endOfInput)\n                        assertEquals(true, released)\n                    }\n                }\n\n        assertEquals(\n            \"qGnJ1RrFC9\",\n            result,\n            message = result\n        )\n    }\n\n    // not supported on JVM\n//    @Test\n//    fun testInputGzip() {\n//        var released = false\n//        val result =\n//            sampleLongText.toByteArray()\n//                .toReadPacket(release = { released = true }).let { input ->\n//                    GzipCompressionInput(input).readBytes().also {\n//                        assertEquals(true, input.endOfInput)\n//                        assertEquals(true, released)\n//                    }\n//                }\n//        println(result.toUHexString())\n//        assertEquals(sampleLongText, result.ungzip().decodeToString())\n//    }\n\n    @Test\n    fun testInputDeflate() {\n        var released = false\n\n        val str = \"qGnJ1RrFC9\"\n        println(str)\n        val hash = str.toByteArray().toReadPacket(release = { released = true }).let { input ->\n            DeflateInput(input).readBytes().also {\n                assertEquals(true, input.endOfInput)\n                assertEquals(true, released)\n            }\n        }\n\n        assertContentEquals( // if we change\n            \"78 9C 2B 74 CF F3 32 0C 2A 72 73 B6 04 00 12 82 03 28\".hexToBytes(),\n            hash,\n            message = hash.toUHexString()\n        )\n\n        assertEquals(str, hash.inflate().decodeToString())\n    }\n\n    @Test\n    fun testInputInflate() {\n        var released = false\n\n        val result =\n            \"78 9C 2B 74 CF F3 32 0C 2A 72 73 B6 04 00 12 82 03 28\".hexToBytes()\n                .toReadPacket(release = { released = true }).let { input ->\n                    InflateInput(input).readAllText().also {\n                        assertEquals(true, input.endOfInput)\n                        assertEquals(true, released)\n                    }\n                }\n\n        assertEquals(\n            \"qGnJ1RrFC9\",\n            result,\n            message = result\n        )\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/commonTest/kotlin/net/mamoe/mirai/utils/EitherTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:OptIn(ExperimentalStdlibApi::class)\n\npackage net.mamoe.mirai.utils\n\nimport net.mamoe.mirai.utils.Either.Companion.flatMapNull\nimport net.mamoe.mirai.utils.Either.Companion.fold\nimport net.mamoe.mirai.utils.Either.Companion.ifLeft\nimport net.mamoe.mirai.utils.Either.Companion.ifRight\nimport net.mamoe.mirai.utils.Either.Companion.left\nimport net.mamoe.mirai.utils.Either.Companion.leftOrNull\nimport net.mamoe.mirai.utils.Either.Companion.mapLeft\nimport net.mamoe.mirai.utils.Either.Companion.mapRight\nimport net.mamoe.mirai.utils.Either.Companion.onLeft\nimport net.mamoe.mirai.utils.Either.Companion.onRight\nimport net.mamoe.mirai.utils.Either.Companion.right\nimport net.mamoe.mirai.utils.Either.Companion.rightOrNull\nimport kotlin.reflect.KType\nimport kotlin.reflect.typeOf\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFailsWith\nimport kotlin.test.assertIs\n\ninternal class EitherTest {\n\n    @Test\n    fun `type check`() {\n        Either<CharSequence, Int>(\"\")\n        Either<CharSequence, Int>(1)\n\n        assertFailsWith<IllegalArgumentException> { Either.invoke<CharSequence, String>(\"\") }\n        assertFailsWith<IllegalArgumentException> { Either.invoke<String, CharSequence>(\"\") }\n    }\n\n    @Test\n    fun `type variance`() {\n        val p: Either<CharSequence, Int> = Either(\"\") // type is <String, Int>\n        assertIs<String>(p.left)\n    }\n\n    @Test\n    fun `get left`() {\n        assertEquals(\"\", Either<CharSequence, Int>(\"\").leftOrNull)\n        assertEquals(null, Either<CharSequence, Int>(1).leftOrNull)\n\n        assertFailsWith<ClassCastException> { Either<CharSequence, Int>(1).left }\n    }\n\n    @Test\n    fun `get right`() {\n        assertEquals(null, Either<CharSequence, Int>(\"\").rightOrNull)\n        assertEquals(1, Either<CharSequence, Int>(1).rightOrNull)\n\n        assertFailsWith<ClassCastException> { Either<CharSequence, Int>(\"\").right }\n    }\n\n    @Test\n    fun `can fold`() {\n        assertEquals(\n            true,\n            Either<CharSequence, Int>(\"\").fold(\n                onLeft = { true },\n                onRight = { false }\n            )\n        )\n        assertEquals(\n            false,\n            Either<CharSequence, Int>(1).fold(\n                onLeft = { true },\n                onRight = { false }\n            )\n        )\n    }\n\n    @Test\n    fun `can map left`() {\n        assertTypeIs(typeOf<Either<Boolean, Int>>(), Either<CharSequence, Int>(\"\").mapLeft { true })\n\n        // left is not null, so block will be called\n        assertEquals(true, Either<CharSequence, Int>(\"\").mapLeft { true }.leftOrNull)\n        assertEquals(null, Either<CharSequence, Int>(\"\").mapLeft { true }.rightOrNull)\n\n        // right is null, so map will also be null\n        assertEquals(\n            null,\n            Either<CharSequence, Int>(1)\n                .mapLeft<CharSequence, Int, Boolean> {\n                    throw AssertionError(\"should not be called\")\n                }.leftOrNull\n        )\n        assertEquals(\n            1,\n            Either<CharSequence, Int>(1)\n                .mapLeft<CharSequence, Int, Boolean> {\n                    throw AssertionError(\"should not be called\")\n                }.rightOrNull\n        )\n    }\n\n    @Test\n    fun `can map right`() {\n        assertTypeIs(typeOf<Either<CharSequence, Boolean>>(), Either<CharSequence, Int>(1).mapRight { true })\n\n        // right is not null, so block will be called\n        assertEquals(null, Either<CharSequence, Int>(1).mapRight { true }.leftOrNull)\n        assertEquals(true, Either<CharSequence, Int>(1).mapRight { true }.rightOrNull)\n\n        // right is null, so map will also be null\n        assertEquals(\n            null,\n            Either<CharSequence, Int>(\"\")\n                .mapRight<CharSequence, Int, Boolean> {\n                    throw AssertionError(\"should not be called\")\n                }.rightOrNull\n        )\n        assertEquals(\n            \"\",\n            Either<CharSequence, Int>(\"\")\n                .mapRight<CharSequence, Int, Boolean> {\n                    throw AssertionError(\"should not be called\")\n                }.leftOrNull\n        )\n    }\n\n    @Test\n    fun `can flatMapNull`() {\n        assertTypeIs(typeOf<Either<CharSequence, Int>>(), Either<CharSequence, Int>(1))\n\n        // not null types\n        Either<CharSequence, Int>(\"left\").run {\n            val result = flatMapNull { throw AssertionError(\"Fail\") }\n            assertEquals(this, result) // don't assertSame: arguments boxed separately\n        }\n\n        Either<CharSequence, Int>(1).run {\n            val result = flatMapNull { throw AssertionError(\"Fail\") }\n            assertEquals(this, result) // don't assertSame: arguments boxed separately\n        }\n\n        // nullable types\n        Either<CharSequence, Int?>(\"left\").run {\n            val result = flatMapNull { throw AssertionError(\"Fail\") }\n            assertEquals(this, result) // don't assertSame: arguments boxed separately\n        }\n\n        Either<CharSequence, Int?>(1).run {\n            val result = flatMapNull { throw AssertionError(\"Fail\") }\n            assertEquals(this, result) // don't assertSame: arguments boxed separately\n        }\n\n        // normal case\n        Either<CharSequence, Int?>(null).run {\n            val result = flatMapNull { right(true) } // can interlace type\n            assertEquals(true, result.right)\n        }\n    }\n\n    @Test\n    fun `can call onRight`() {\n        var called = false\n        Either<CharSequence, Int>(1).onRight { called = true }\n        assertEquals(true, called)\n\n        Either<CharSequence, Int>(\"\").onRight {\n            throw AssertionError(\"should not be called\")\n        }\n    }\n\n    @Test\n    fun `can call onLeft`() {\n        var called = false\n        Either<CharSequence, Int>(\"\").onLeft { called = true }\n        assertEquals(true, called)\n\n        Either<CharSequence, Int>(1).onLeft {\n            throw AssertionError(\"should not be called\")\n        }\n    }\n\n    @Test\n    fun `can call ifRight`() {\n        assertEquals(true, Either<CharSequence, Int>(1).ifRight { true })\n        @Suppress(\"IMPLICIT_NOTHING_TYPE_ARGUMENT_IN_RETURN_POSITION\")\n        Either<CharSequence, Int>(\"\").ifRight { throw AssertionError(\"should not be called\") }\n    }\n\n    @Test\n    fun `can call ifLeft`() {\n        assertEquals(true, Either<CharSequence, Int>(\"\").ifLeft { true })\n        @Suppress(\"IMPLICIT_NOTHING_TYPE_ARGUMENT_IN_RETURN_POSITION\")\n        Either<CharSequence, Int>(1).ifLeft { throw AssertionError(\"should not be called\") }\n    }\n\n    private inline fun <reified V> assertTypeIs(expected: KType, @Suppress(\"UNUSED_PARAMETER\") value: V) {\n        assertEquals(expected, typeOf<V>())\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/commonTest/kotlin/net/mamoe/mirai/utils/ExceptionCollectorTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.test.*\n\n@OptIn(TestOnly::class)\ninternal class ExceptionCollectorTest {\n\n    @Test\n    fun `can collect`() {\n        val collector = ExceptionCollector()\n\n        collector.collect(IllegalArgumentException())\n\n        assertTrue { collector.getLast() is IllegalArgumentException }\n        assertEquals(1, collector.asSequence().count())\n    }\n\n    @Test\n    fun `can collect suppressed`() {\n        val collector = ExceptionCollector()\n\n        collector.collect(IllegalArgumentException())\n        collector.collect(IllegalStateException())\n\n        assertIs<IllegalStateException>(collector.getLast())\n        assertTrue { collector.getLast()!!.suppressedExceptions[0] is IllegalArgumentException }\n        assertEquals(2, collector.asSequence().count())\n    }\n\n    @Test\n    fun `can collect suppressed nested`() {\n        val collector = ExceptionCollector()\n\n        collector.collect(IndexOutOfBoundsException())\n        collector.collect(IllegalArgumentException())\n        collector.collect(IllegalStateException())\n\n        assertIs<IllegalStateException>(collector.getLast())\n        assertTrue { collector.getLast()!!.suppressedExceptions[0] is IllegalArgumentException }\n        assertTrue { collector.getLast()!!.suppressedExceptions[1] is IndexOutOfBoundsException }\n        assertEquals(3, collector.asSequence().count())\n    }\n\n    @Test\n    fun `ignore same exception`() {\n        val collector = ExceptionCollector()\n\n        val exception = Exception()\n\n        collector.collect(exception)\n        collector.collect(exception)\n        collector.collect(exception)\n\n        assertSame(exception, collector.asSequence().last())\n        assertEquals(0, collector.getLast()!!.suppressedExceptions.size)\n        assertEquals(1, collector.asSequence().count())\n    }\n\n    @Test\n    fun `ignore exception with same stacktrace and preserve first occurrence`() {\n        val exceptions = mutableListOf<Exception>()\n\n        repeat(5) { id ->\n            exceptions.add(Exception(\"#$id\"))\n        }\n\n\n        val collector = ExceptionCollector()\n        exceptions.forEach { exception ->\n            collector.collect(exception)\n        }\n\n        assertEquals(0, collector.getLast()!!.suppressedExceptions.size)\n        assertEquals(1, collector.asSequence().count())\n        assertSame(exceptions.first(), collector.getLast())\n        assertEquals(\"#0\", collector.getLast()!!.message)\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/commonTest/kotlin/net/mamoe/mirai/utils/ExternalImageTest.kt",
    "content": "/*\n * Copyright 2019-2020 Mamoe Technologies and contributors.\n *\n *  此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n *  Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n *  https://github.com/mamoe/mirai/blob/master/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class ExternalImageTest {\n\n    @Test\n    fun testByteArrayGet() {\n        assertEquals(\"0F\", byteArrayOf(0x0f)[0, 0])\n        assertEquals(\"10\", byteArrayOf(0x10)[0, 0])\n        assertEquals(\"0FFE\", byteArrayOf(0x0F, 0xFE.toByte())[0, 1])\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/commonTest/kotlin/net/mamoe/mirai/utils/HexToBytesTest.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.test.Test\nimport kotlin.test.assertContentEquals\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFailsWith\n\nclass HexToBytesTest {\n    private fun Byte.Companion.parseFromHexChunk(char1: String): Byte = parseFromHexChunk(char1[0], char1[1])\n\n    @Test\n    fun `Byte parseFromHexChunk`() {\n        assertEquals(0xff.toByte(), Byte.parseFromHexChunk(\"FF\"))\n        assertEquals(0xff.toByte(), Byte.parseFromHexChunk(\"ff\"))\n        assertEquals(0xff.toByte(), Byte.parseFromHexChunk(\"fF\"))\n        assertEquals(0xff.toByte(), Byte.parseFromHexChunk(\"Ff\"))\n\n        assertEquals(0x00.toByte(), Byte.parseFromHexChunk(\"00\"))\n        assertEquals(0x0f.toByte(), Byte.parseFromHexChunk(\"0f\"))\n        assertEquals(0x34.toByte(), Byte.parseFromHexChunk(\"34\"))\n        assertEquals(0x7f.toByte(), Byte.parseFromHexChunk(\"7f\"))\n    }\n\n    @Test\n    fun `test countHexBytes`() {\n        assertEquals(0, \"\".countHexBytes())\n\n        assertEquals(1, \"01\".countHexBytes())\n        assertEquals(1, \"FF\".countHexBytes())\n        assertEquals(1, \"ff\".countHexBytes())\n        assertEquals(1, \"Ff\".countHexBytes())\n        assertEquals(1, \"fF\".countHexBytes())\n        assertEquals(1, \"0F\".countHexBytes())\n        assertEquals(1, \"F0\".countHexBytes())\n        assertEquals(1, \"0f\".countHexBytes())\n        assertEquals(1, \"f0\".countHexBytes())\n\n        assertEquals(1, \"01 \".countHexBytes())\n        assertEquals(1, \"FF \".countHexBytes())\n        assertEquals(1, \"ff \".countHexBytes())\n        assertEquals(1, \"Ff \".countHexBytes())\n        assertEquals(1, \"fF \".countHexBytes())\n        assertEquals(1, \"0F \".countHexBytes())\n        assertEquals(1, \"F0 \".countHexBytes())\n        assertEquals(1, \"0f \".countHexBytes())\n        assertEquals(1, \"f0 \".countHexBytes())\n\n        assertEquals(1, \" 01 \".countHexBytes())\n        assertEquals(1, \" FF \".countHexBytes())\n        assertEquals(1, \" ff \".countHexBytes())\n        assertEquals(1, \" Ff \".countHexBytes())\n        assertEquals(1, \" fF \".countHexBytes())\n        assertEquals(1, \" 0F \".countHexBytes())\n        assertEquals(1, \" F0 \".countHexBytes())\n        assertEquals(1, \" 0f \".countHexBytes())\n        assertEquals(1, \" f0 \".countHexBytes())\n\n        assertEquals(1, \" 01    \".countHexBytes())\n        assertEquals(1, \" FF    \".countHexBytes())\n        assertEquals(1, \" ff    \".countHexBytes())\n        assertEquals(1, \" Ff    \".countHexBytes())\n        assertEquals(1, \" fF    \".countHexBytes())\n        assertEquals(1, \" 0F    \".countHexBytes())\n        assertEquals(1, \" F0    \".countHexBytes())\n        assertEquals(1, \" 0f    \".countHexBytes())\n        assertEquals(1, \" f0    \".countHexBytes())\n\n        assertEquals(2, \" 01   01   \".countHexBytes())\n        assertEquals(2, \" FF   FF   \".countHexBytes())\n        assertEquals(2, \" ff   ff   \".countHexBytes())\n        assertEquals(2, \" Ff   Ff   \".countHexBytes())\n        assertEquals(2, \" fF   fF   \".countHexBytes())\n        assertEquals(2, \" 0F   0F   \".countHexBytes())\n        assertEquals(2, \" F0   F0   \".countHexBytes())\n        assertEquals(2, \" 0f   0f   \".countHexBytes())\n        assertEquals(2, \" f0   f0   \".countHexBytes())\n\n        assertEquals(2, \" 0101   \".countHexBytes())\n        assertEquals(2, \" FFFF   \".countHexBytes())\n        assertEquals(2, \" ffff   \".countHexBytes())\n        assertEquals(2, \" FfFf   \".countHexBytes())\n        assertEquals(2, \" fFfF   \".countHexBytes())\n        assertEquals(2, \" 0F0F   \".countHexBytes())\n        assertEquals(2, \" F0F0   \".countHexBytes())\n        assertEquals(2, \" 0f0f   \".countHexBytes())\n        assertEquals(2, \" f0f0   \".countHexBytes())\n\n        assertFailsWith<IllegalArgumentException> { \"1\".countHexBytes() }\n        assertFailsWith<IllegalArgumentException> { \"0_1\".countHexBytes() }\n        assertFailsWith<IllegalArgumentException> { \"0 1\".countHexBytes() }\n        assertFailsWith<IllegalArgumentException> { \"g\".countHexBytes() }\n        assertFailsWith<IllegalArgumentException> { \"_\".countHexBytes() }\n        assertFailsWith<IllegalArgumentException> { \"123\".countHexBytes() }\n        assertFailsWith<IllegalArgumentException> { \"0x12\".countHexBytes() }\n        assertFailsWith<IllegalArgumentException> { \"12 3\".countHexBytes() }\n    }\n\n    @Test\n    fun `test hexToBytes`() {\n        assertContentEquals(byteArrayOf(0xff.toByte()), \"FF\".hexToBytes())\n        assertContentEquals(byteArrayOf(0xff.toByte()), \"ff\".hexToBytes())\n        assertContentEquals(byteArrayOf(0xff.toByte()), \"fF\".hexToBytes())\n        assertContentEquals(byteArrayOf(0xff.toByte()), \"Ff\".hexToBytes())\n\n        assertContentEquals(byteArrayOf(0x00.toByte()), \"00\".hexToBytes())\n        assertContentEquals(byteArrayOf(0x0f.toByte()), \"0f\".hexToBytes())\n        assertContentEquals(byteArrayOf(0x34.toByte()), \"34\".hexToBytes())\n        assertContentEquals(byteArrayOf(0x7f.toByte()), \"7f\".hexToBytes())\n\n        assertContentEquals(byteArrayOf(0xff.toByte(), 0xff.toByte()), \"     FF   FF  \".hexToBytes())\n        assertContentEquals(byteArrayOf(0xff.toByte(), 0xff.toByte()), \"     ff   ff  \".hexToBytes())\n        assertContentEquals(byteArrayOf(0xff.toByte(), 0xff.toByte()), \"     fF   fF  \".hexToBytes())\n        assertContentEquals(byteArrayOf(0xff.toByte(), 0xff.toByte()), \"     Ff   Ff  \".hexToBytes())\n\n        assertContentEquals(byteArrayOf(0x00.toByte(), 0x00.toByte()), \"     00   00  \".hexToBytes())\n        assertContentEquals(byteArrayOf(0x0f.toByte(), 0x0f.toByte()), \"     0f   0f  \".hexToBytes())\n        assertContentEquals(byteArrayOf(0x34.toByte(), 0x34.toByte()), \"     34   34  \".hexToBytes())\n        assertContentEquals(byteArrayOf(0x7f.toByte(), 0x7f.toByte()), \"     7f   7f  \".hexToBytes())\n    }\n\n    @Test\n    fun `test hexToUBytes`() {\n        // implementations of hexToBytes and hexToUBytes are very similar.\n\n        assertContentEquals(ubyteArrayOf(0x7f.toUByte(), 0x7f.toUByte()), \"     7f   7f  \".hexToUBytes())\n    }\n}\n\n"
  },
  {
    "path": "mirai-core-utils/src/commonTest/kotlin/net/mamoe/mirai/utils/HtmlEscapeTest.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class HtmlEscapeTest {\n    @Test\n    fun testDecode() {\n        val ALL = \"&#xCF;&#xBD;&#8719;&#xAB;&uuml;&#8901;&Phi;&#8707;&#8804;&ccedil;&#x203E;&#x2209;&Eta;&#246;&#234;&#222;&#210;&Ocirc;&#xAA;&rceil;&icirc;&nsub;&#xCE;&#xBC;&#8805;&szlig;&and;&iacute;&#x3E;&macr;&#235;&#223;&#211;&#xBB;&#x3BA;&#247;&clubs;&#xDF;&zeta;&#xCD;&#8709;&#9002;&eta;&Prime;&infin;&#92;&Ograve;&ecirc;&Oslash;&#x2308;&#220;&Iuml;&#244;&#x3BB;&spades;&#232;&phi;&#xCC;&deg;&#xBA;&#xDE;&#9001;&ograve;&Otilde;&prod;&#x3C;&trade;&#x2190;&perp;&#x391;&#x2309;&#245;&#233;&#221;&#x3BC;&#xDD;&#8482;&#xCB;&ordm;&ang;&#xEF;&empty;&#242;&#230;&#919;&#169;&Upsilon;&#254;&#x2665;&#xEE;&Epsilon;&#8592;&#xDC;&#x2229;&#xCA;&#x2217;&#x2205;&cup;&hArr;&ntilde;&eth;&Delta;&#8472;&#8593;&#231;&#8230;&Acirc;&#8242;&#8254;&#918;&#255;&#x2666;&#243;&Eacute;&#xFF;&#xED;&#xDB;&acirc;&or;&uArr;&curren;&divide;&para;&thorn;&epsilon;&#60;&#8594;&hearts;&otimes;&#x192;&#252;&lowast;&#240;&#8243;&#929;&#179;&#917;&#167;&#xFE;&#x2207;&#xEC;&#xDA;&plusmn;&Tau;&egrave;&yen;&#8595;&#253;&tau;&#241;&asymp;&#168;&#928;&#916;&#x2208;&#x2329;&#xFD;&#xEB;&uarr;&otilde;&reg;&#219;&#207;&#982;&#xE1;&Oacute;&#8747;&#62;&Ecirc;&#8711;&#xF3;&Iota;&psi;&int;&#206;&#x396;&#208;&upsilon;&middot;&ge;&sim;&#xF2;&#xE0;&#x221D;&#8736;&#x220B;&#8712;&ucirc;&#8869;&piv;&ETH;&sube;&Lambda;&oslash;&#x397;&#9824;&#x2282;&uml;&#229;&eacute;&Psi;&#8713;&#x221E;&#8834;&#xF1;&pound;&alefsym;&Ccedil;&lang;&frac34;&cent;&Iacute;&#9827;&ouml;&#228;&Nu;&#216;&Alpha;&#x398;&#204;&#x2295;&#x2283;&#218;&#8835;&#xF0;&#x230A;&sub;&#8629;&#8968;&laquo;&sigmaf;&part;&Xi;&#x399;&#x25CA;&#217;&nu;&#205;&copy;&darr;&#xAF;&beta;&cap;&igrave;&#8800;&#8969;&#x2191;&#8715;&#8836;&omicron;&#8727;&frac12;&#x392;&#x223C;&#x222A;&Rho;&xi;&#202;&#x3BD;&#9829;&#238;&#226;&#214;&Mu;&#xAE;&#x3BF;&#8801;&#x211C;&#x2192;&AElig;&#8704;&Atilde;&#x393;&#x222B;&kappa;&#x3BE;&delta;&#239;&#227;&supe;&#215;&#203;&fnof;&mu;&#xBF;&#xAD;&#x2193;&rho;&sdot;&Omicron;&#8838;&aelig;&frac14;&#x394;&#x221A;&#224;&#212;&#200;&aring;&frasl;&#248;&lt;&#236;&Auml;&#xBE;&#xAC;&#x2194;&Gamma;&Omega;&#8706;&#8839;&nbsp;&#x232A;&#213;&euml;&ordf;&#201;&#8260;&#249;&#237;&#x395;&#225;&#954;&#x2022;&Aacute;&#x2264;&atilde;&#xA1;&brvbar;&#x3C2;&#xE9;&#193;&#xD7;&#181;&#xC5;&#xB3;&#x21D3;&rArr;&#967;&#955;&#965;&Zeta;&#953;&yacute;&#x2265;&#x3C3;&#xB2;&#xA0;&#x3B1;&lambda;&#194;&#182;&#xE8;&#170;&Igrave;&#xD6;&#xC4;&#x21D4;&#10;&diams;&sum;&sigma;&#978;&#966;&#964;&#9830;&#x39A;&#952;&#x3D6;&#x3B2;&rarr;&#x3C4;&#8656;&#xC3;&#xB1;&#x3A0;&Theta;&#xF9;&#xE7;&#8970;&#191;&#xD5;&#8764;&#8776;&amp;&upsih;&#977;&gamma;&dArr;&image;&#963;&#x2122;&#x39B;&#951;&#x3C5;&#x3A1;&#8657;&#x3B3;&#xD4;&#xC2;&#xB0;&#192;&#xF8;&#180;&#xE6;&#8971;&ugrave;&#x2135;&#x2026;&#x2284;&prime;&#x2260;&#962;&#950;&#8658;&#x230B;&lceil;&#xE5;&#xD3;&#xC1;&Ugrave;&#xF7;&#8730;&exist;&equiv;&sup;&loz;&#x2261;&#961;&not;&#x2297;&Ucirc;&#8659;&#8744;&#8756;&#190;&#xF6;&#xE4;&sect;&#xD2;&#x220F;&#xC0;&#x3D1;&oacute;&#38;&#x21D0;&#8501;&#8743;&real;&#x2032;&#209;&#x2044;&yuml;&#960;&#x2286;&lArr;&#8733;&#8745;&#x3D2;&#xF5;&#xE3;&#xD1;&#x3C0;&#x21D1;&#8853;&#402;&#x2033;&oline;&#x2287;&#xD0;&#8746;&Uuml;&#8722;&aacute;&#8734;&#8855;&#x3C1;&#xF4;&#xE2;&weierp;&#8721;&iota;&larr;&#x21D2;&lfloor;&nabla;&#x2200;&#x2660;&auml;&#9674;&theta;&#8596;&iquest;&#165;&#xA9;&#x3B8;&#250;&#x3A6;&#xEA;&gt;&#189;&#927;&#177;&#915;&forall;&iexcl;&#xFC;&crarr;&Uacute;&cong;&isin;&#x3A7;&#xA8;&#x3B9;&#251;&#8476;&Ouml;&#xFB;&#178;&#x2202;&#166;&#926;&thetasym;&#914;&acute;&times;&harr;&cedil;&Pi;&shy;&bull;&#187;&#175;&#xB9;&#x3A8;&#163;&#xA7;&#8465;&#xFA;&#x2118;&#x2203;&minus;&#x2663;&#949;&#199;&#937;&#925;&#913;&#x2227;&Icirc;&raquo;&omega;&Agrave;&#x22A5;&Chi;&Beta;&ne;&pi;&agrave;&#x3A9;&#8660;&#176;&#164;&THORN;&#xB8;&#xA6;&#188;&#948;&chi;&#936;&#924;&#x2228;&#x39C;&#x2111;&#x2220;&#x3B4;&#x3C6;&oplus;&Yacute;&#161;&#xA5;&uacute;&#197;&#185;&#xC9;&#173;&#xB7;&alpha;&#959;&#x2245;&#947;&rfloor;&Euml;&#935;&notin;&#923;&Aring;&ocirc;&#921;&#x39D;&Kappa;&#x3A3;&#x3B5;&#xB6;&#xA4;&sup3;&#8226;&#198;&Ntilde;&#186;&#174;&#x3C7;&#162;&#xC8;&Sigma;&#x2234;&iuml;&#958;&#946;&micro;&#934;&#922;&#x26;&#932;&#920;&hellip;&Egrave;&#x3A4;&#x21B5;&#x39E;&#183;&#xC7;&#171;&#xB5;&#xA3;&sup2;&#x3B6;&#195;&#xD9;&#x3C8;&#969;&#957;&#945;&#933;&#931;&rang;&#x2211;&prop;&ni;&radic;&#x22C5;&le;&#x39F;&#172;&#xD8;&#160;&sup1;&#xC6;&#xB4;&#xA2;&#x3C9;&#196;&#x3A5;&#8773;&#184;&#x3B7;&#x2248;&there4;&#x2212;&#968;&#956;\"\n        val RESP = \"\\u00cf\\u00bd\\u220f\\u00ab\\u00fc\\u22c5\\u03a6\\u2203\\u2264\\u00e7\\u203e\\u2209\\u0397\\u00f6\\u00ea\\u00de\\u00d2\\u00d4\\u00aa\\u2309\\u00ee\\u2284\\u00ce\\u00bc\\u2265\\u00df\\u2227\\u00ed\\u003e\\u00af\\u00eb\\u00df\\u00d3\\u00bb\\u03ba\\u00f7\\u2663\\u00df\\u03b6\\u00cd\\u2205\\u232a\\u03b7\\u2033\\u221e\\u005c\\u00d2\\u00ea\\u00d8\\u2308\\u00dc\\u00cf\\u00f4\\u03bb\\u2660\\u00e8\\u03c6\\u00cc\\u00b0\\u00ba\\u00de\\u2329\\u00f2\\u00d5\\u220f\\u003c\\u2122\\u2190\\u22a5\\u0391\\u2309\\u00f5\\u00e9\\u00dd\\u03bc\\u00dd\\u2122\\u00cb\\u00ba\\u2220\\u00ef\\u2205\\u00f2\\u00e6\\u0397\\u00a9\\u03a5\\u00fe\\u2665\\u00ee\\u0395\\u2190\\u00dc\\u2229\\u00ca\\u2217\\u2205\\u222a\\u21d4\\u00f1\\u00f0\\u0394\\u2118\\u2191\\u00e7\\u2026\\u00c2\\u2032\\u203e\\u0396\\u00ff\\u2666\\u00f3\\u00c9\\u00ff\\u00ed\\u00db\\u00e2\\u2228\\u21d1\\u00a4\\u00f7\\u00b6\\u00fe\\u03b5\\u003c\\u2192\\u2665\\u2297\\u0192\\u00fc\\u2217\\u00f0\\u2033\\u03a1\\u00b3\\u0395\\u00a7\\u00fe\\u2207\\u00ec\\u00da\\u00b1\\u03a4\\u00e8\\u00a5\\u2193\\u00fd\\u03c4\\u00f1\\u2248\\u00a8\\u03a0\\u0394\\u2208\\u2329\\u00fd\\u00eb\\u2191\\u00f5\\u00ae\\u00db\\u00cf\\u03d6\\u00e1\\u00d3\\u222b\\u003e\\u00ca\\u2207\\u00f3\\u0399\\u03c8\\u222b\\u00ce\\u0396\\u00d0\\u03c5\\u00b7\\u2265\\u223c\\u00f2\\u00e0\\u221d\\u2220\\u220b\\u2208\\u00fb\\u22a5\\u03d6\\u00d0\\u2286\\u039b\\u00f8\\u0397\\u2660\\u2282\\u00a8\\u00e5\\u00e9\\u03a8\\u2209\\u221e\\u2282\\u00f1\\u00a3\\u2135\\u00c7\\u2329\\u00be\\u00a2\\u00cd\\u2663\\u00f6\\u00e4\\u039d\\u00d8\\u0391\\u0398\\u00cc\\u2295\\u2283\\u00da\\u2283\\u00f0\\u230a\\u2282\\u21b5\\u2308\\u00ab\\u03c2\\u2202\\u039e\\u0399\\u25ca\\u00d9\\u03bd\\u00cd\\u00a9\\u2193\\u00af\\u03b2\\u2229\\u00ec\\u2260\\u2309\\u2191\\u220b\\u2284\\u03bf\\u2217\\u00bd\\u0392\\u223c\\u222a\\u03a1\\u03be\\u00ca\\u03bd\\u2665\\u00ee\\u00e2\\u00d6\\u039c\\u00ae\\u03bf\\u2261\\u211c\\u2192\\u00c6\\u2200\\u00c3\\u0393\\u222b\\u03ba\\u03be\\u03b4\\u00ef\\u00e3\\u2287\\u00d7\\u00cb\\u0192\\u03bc\\u00bf\\u00ad\\u2193\\u03c1\\u22c5\\u039f\\u2286\\u00e6\\u00bc\\u0394\\u221a\\u00e0\\u00d4\\u00c8\\u00e5\\u2044\\u00f8\\u003c\\u00ec\\u00c4\\u00be\\u00ac\\u2194\\u0393\\u03a9\\u2202\\u2287\\u00a0\\u232a\\u00d5\\u00eb\\u00aa\\u00c9\\u2044\\u00f9\\u00ed\\u0395\\u00e1\\u03ba\\u2022\\u00c1\\u2264\\u00e3\\u00a1\\u00a6\\u03c2\\u00e9\\u00c1\\u00d7\\u00b5\\u00c5\\u00b3\\u21d3\\u21d2\\u03c7\\u03bb\\u03c5\\u0396\\u03b9\\u00fd\\u2265\\u03c3\\u00b2\\u00a0\\u03b1\\u03bb\\u00c2\\u00b6\\u00e8\\u00aa\\u00cc\\u00d6\\u00c4\\u21d4\\u000a\\u2666\\u2211\\u03c3\\u03d2\\u03c6\\u03c4\\u2666\\u039a\\u03b8\\u03d6\\u03b2\\u2192\\u03c4\\u21d0\\u00c3\\u00b1\\u03a0\\u0398\\u00f9\\u00e7\\u230a\\u00bf\\u00d5\\u223c\\u2248\\u0026\\u03d2\\u03d1\\u03b3\\u21d3\\u2111\\u03c3\\u2122\\u039b\\u03b7\\u03c5\\u03a1\\u21d1\\u03b3\\u00d4\\u00c2\\u00b0\\u00c0\\u00f8\\u00b4\\u00e6\\u230b\\u00f9\\u2135\\u2026\\u2284\\u2032\\u2260\\u03c2\\u03b6\\u21d2\\u230b\\u2308\\u00e5\\u00d3\\u00c1\\u00d9\\u00f7\\u221a\\u2203\\u2261\\u2283\\u25ca\\u2261\\u03c1\\u00ac\\u2297\\u00db\\u21d3\\u2228\\u2234\\u00be\\u00f6\\u00e4\\u00a7\\u00d2\\u220f\\u00c0\\u03d1\\u00f3\\u0026\\u21d0\\u2135\\u2227\\u211c\\u2032\\u00d1\\u2044\\u00ff\\u03c0\\u2286\\u21d0\\u221d\\u2229\\u03d2\\u00f5\\u00e3\\u00d1\\u03c0\\u21d1\\u2295\\u0192\\u2033\\u203e\\u2287\\u00d0\\u222a\\u00dc\\u2212\\u00e1\\u221e\\u2297\\u03c1\\u00f4\\u00e2\\u2118\\u2211\\u03b9\\u2190\\u21d2\\u230a\\u2207\\u2200\\u2660\\u00e4\\u25ca\\u03b8\\u2194\\u00bf\\u00a5\\u00a9\\u03b8\\u00fa\\u03a6\\u00ea\\u003e\\u00bd\\u039f\\u00b1\\u0393\\u2200\\u00a1\\u00fc\\u21b5\\u00da\\u2245\\u2208\\u03a7\\u00a8\\u03b9\\u00fb\\u211c\\u00d6\\u00fb\\u00b2\\u2202\\u00a6\\u039e\\u03d1\\u0392\\u00b4\\u00d7\\u2194\\u00b8\\u03a0\\u00ad\\u2022\\u00bb\\u00af\\u00b9\\u03a8\\u00a3\\u00a7\\u2111\\u00fa\\u2118\\u2203\\u2212\\u2663\\u03b5\\u00c7\\u03a9\\u039d\\u0391\\u2227\\u00ce\\u00bb\\u03c9\\u00c0\\u22a5\\u03a7\\u0392\\u2260\\u03c0\\u00e0\\u03a9\\u21d4\\u00b0\\u00a4\\u00de\\u00b8\\u00a6\\u00bc\\u03b4\\u03c7\\u03a8\\u039c\\u2228\\u039c\\u2111\\u2220\\u03b4\\u03c6\\u2295\\u00dd\\u00a1\\u00a5\\u00fa\\u00c5\\u00b9\\u00c9\\u00ad\\u00b7\\u03b1\\u03bf\\u2245\\u03b3\\u230b\\u00cb\\u03a7\\u2209\\u039b\\u00c5\\u00f4\\u0399\\u039d\\u039a\\u03a3\\u03b5\\u00b6\\u00a4\\u00b3\\u2022\\u00c6\\u00d1\\u00ba\\u00ae\\u03c7\\u00a2\\u00c8\\u03a3\\u2234\\u00ef\\u03be\\u03b2\\u00b5\\u03a6\\u039a\\u0026\\u03a4\\u0398\\u2026\\u00c8\\u03a4\\u21b5\\u039e\\u00b7\\u00c7\\u00ab\\u00b5\\u00a3\\u00b2\\u03b6\\u00c3\\u00d9\\u03c8\\u03c9\\u03bd\\u03b1\\u03a5\\u03a3\\u232a\\u2211\\u221d\\u220b\\u221a\\u22c5\\u2264\\u039f\\u00ac\\u00d8\\u00a0\\u00b9\\u00c6\\u00b4\\u00a2\\u03c9\\u00c4\\u03a5\\u2245\\u00b8\\u03b7\\u2248\\u2234\\u2212\\u03c8\\u03bc\"\n        assertEquals(\n            RESP,\n            ALL.decodeHtmlEscape()\n        )\n    }\n\n    @Test\n    fun testEncode() {\n        val str = buildString {\n            for (i in 1 until 2048) {\n                append(i.toChar())\n            }\n        }\n        val escaped = str.encodeHtmlEscape()\n        // println(escaped)\n        assertEquals(escaped.decodeHtmlEscape(), str)\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/commonTest/kotlin/net/mamoe/mirai/utils/ImageIdConversionTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class ImageIdConversionTest {\n    @Test\n    fun testConversions() {\n        assertEquals(\n            \"{f8f1ab55-bf8e-4236-b55e-955848d7069f}.mirai\",\n            generateImageIdFromResourceId(\"/f8f1ab55-bf8e-4236-b55e-955848d7069f\"),\n        )\n        assertEquals(\n            \"{EFF4427C-E3D2-7DB6-B1D9-A8AB72E7A29C}.mirai\",\n            generateImageIdFromResourceId(\"/000000000-3666252994-EFF4427CE3D27DB6B1D9A8AB72E7A29C\"),\n        )\n        assertEquals(\n            \"{EF42A82D-8DB6-5D0F-4F11-68961D8DA5CB}.png\",\n            generateImageIdFromResourceId(\"{EF42A82D-8DB6-5D0F-4F11-68961D8DA5CB}.png\"),\n        )\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/commonTest/kotlin/net/mamoe/mirai/utils/LateinitMutablePropertyTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.coroutines.CompletableDeferred\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.runBlocking\nimport kotlinx.coroutines.test.runTest\nimport kotlinx.coroutines.yield\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertSame\n\ninternal class LateinitMutablePropertyTest {\n    @Test\n    fun canInitialize() {\n        val value = Symbol(\"expected\")\n        val prop by lateinitMutableProperty { value }\n        assertSame(value, prop)\n    }\n\n    @Test\n    fun canOverride() {\n        val value = Symbol(\"expected\")\n        val overrode = Symbol(\"override\")\n\n        var prop by lateinitMutableProperty { value }\n        prop = overrode\n        assertSame(overrode, prop)\n    }\n\n    @Test\n    fun initializerCalledOnce() {\n        val value = Symbol(\"expected\")\n        var counter = 0\n\n        val prop by lateinitMutableProperty {\n            counter++\n            value\n        }\n        assertSame(value, prop)\n        assertSame(value, prop)\n        assertEquals(1, counter)\n    }\n\n    @Test\n    fun setValuePrevailsOnCompetitionWithInitializer() = runTest {\n        val verySlowInitializer = CompletableDeferred<Unit>()\n        val override = Symbol(\"override\")\n        val initializer = Symbol(\"initializer\")\n\n        var prop by lateinitMutableProperty {\n            runBlocking { yield(); verySlowInitializer.await() }\n            initializer\n        }\n\n        launch { println(prop) }\n        prop = override\n        verySlowInitializer.complete(Unit)\n\n        assertSame(override, prop)\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/commonTest/kotlin/net/mamoe/mirai/utils/ResourceAccessLockTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.test.*\n\ninternal class ResourceAccessLockTest {\n    @Test\n    fun testInitializedLockCannotReInit() {\n        val lock = ResourceAccessLock()\n        lock.setInitialized()\n        assertFalse { lock.tryInitialize() }\n    }\n\n    @Test\n    fun testUseFailedIfLockUninitializedOrLocked() {\n        val lock = ResourceAccessLock()\n        lock.setUninitialized()\n        assertFalse { lock.tryUse() }\n        lock.setLocked()\n        assertFalse { lock.tryUse() }\n    }\n\n    @Test\n    fun testLockFailedIfUninitialized() {\n        val lock = ResourceAccessLock()\n        lock.setUninitialized()\n        assertFalse { lock.lockIfNotUsing() }\n    }\n\n    @Test\n    fun testLockFailedIfUsing() {\n        val lock = ResourceAccessLock()\n        lock.setInitialized()\n        assertTrue { lock.tryUse() }\n        assertFalse { lock.lockIfNotUsing() }\n    }\n\n    @Test\n    fun testLockUsedIfInitialized() {\n        val lock = ResourceAccessLock()\n        lock.setInitialized()\n        assertTrue { lock.tryUse() }\n    }\n\n    @Test\n    fun testRelease() {\n        val lock = ResourceAccessLock()\n        lock.setInitialized()\n        assertFails { lock.release() }\n        assertEquals(ResourceAccessLock.INITIALIZED, lock.currentStatus())\n        assertTrue { lock.tryUse() }\n        lock.release()\n    }\n}\n"
  },
  {
    "path": "mirai-core-utils/src/commonTest/kotlin/net/mamoe/mirai/utils/SizedCacheTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class SizedCacheTest {\n    @Test\n    fun validIfCacheNotFilled() {\n        val cache = SizedCache<String>(20)\n        val list = mutableListOf<String>()\n        repeat(10) {\n            cache.emit(\"-$it\")\n            list.add(\"-$it\")\n        }\n        assertEquals(list, cache.toList())\n    }\n\n    @Test\n    fun validIfNotUsed() {\n        val cache = SizedCache<String>(20)\n        assertEquals(emptyList(), cache.toList())\n    }\n\n    @Test\n    fun validIfFilled() {\n        val cache = SizedCache<String>(20)\n        val list = mutableListOf<String>()\n        repeat(20) {\n            cache.emit(\"-$it\")\n            list.add(\"-$it\")\n        }\n        assertEquals(list, cache.toList())\n    }\n\n    @Test\n    fun chaosTest() {\n        repeat(1000) {\n            val size = (5..200).random()\n            val list = mutableListOf<Int>()\n            val cache = SizedCache<Int>(size)\n            repeat((100..5000).random().coerceAtLeast(size)) {\n                cache.emit(it)\n                list.add(it)\n            }\n            assertEquals(\n                list.subList(list.size - size, list.size).toMutableList(),\n                cache.toMutableList(),\n            )\n        }\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/commonTest/kotlin/net/mamoe/mirai/utils/TlvMapTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport io.ktor.utils.io.core.*\nimport kotlin.random.Random\nimport kotlin.test.Test\nimport kotlin.test.assertContentEquals\nimport kotlin.test.assertEquals\nimport kotlin.test.assertTrue\n\ninternal class TlvMapTest {\n    private fun dumpTlvMap(map: TlvMap) = buildString {\n        append(\"tlvMap {\\n\")\n        map.forEach { (k, v) ->\n            append(\"  \").append(k.toUHexString()).append(\" = \").append(v.toUHexString()).append(\"\\n\")\n        }\n        append(\"}\")\n    }\n\n    private fun assertTlvMapEquals(\n        expected: TlvMap, actual: TlvMap,\n    ) {\n        assertEquals(expected.size, actual.size, \"map size not match\")\n\n        expected.keys.forEach { key ->\n            assertTrue(\"Missing key[$key] in actual\") { actual.containsKey(key) }\n        }\n        actual.keys.forEach { key ->\n            assertTrue(\"Missing key[$key] in expected\") { expected.containsKey(key) }\n        }\n\n        expected.forEach { (key, value) ->\n            assertContentEquals(value, actual[key])\n        }\n    }\n\n    @Test\n    fun testTlvWriterNoLength() {\n        testTlvWriter(true)\n    }\n\n    @Test\n    fun testTlvWriterWithCount() {\n        testTlvWriter(false)\n    }\n\n    private fun testTlvWriter(withCount: Boolean) {\n        repeat(500) {\n            val tlvMap = TlvMap()\n            val rand = buildPacket {\n                _writeTlvMap(Short.SIZE_BYTES, includeCount = withCount) {\n\n                    repeat(Random.nextInt().and(0xFF).coerceAtLeast(20)) {\n                        val nextKey = Random.nextInt().and(0xFF0)\n                        if (!tlvMap.containsKey(nextKey)) {\n                            val randData = ByteArray(Random.nextInt().and(0xFFF))\n                            Random.nextBytes(randData)\n\n                            tlvMap[nextKey] = randData\n\n                            tlv(nextKey, randData)\n                        }\n                    }\n\n                }\n            }.also { pkg ->\n                if (withCount) pkg.discardExact(2)\n            }._readTLVMap()\n\n            try {\n                assertTlvMapEquals(tlvMap, rand)\n            } catch (e: Throwable) {\n\n                println(\"gen:  \" + dumpTlvMap(tlvMap))\n                println(\"read: \" + dumpTlvMap(rand))\n\n                throw e\n            }\n\n        }\n    }\n\n    @Test\n    fun testTlvWriterWithCounter() {\n        val expected = buildPacket {\n            writeShort(4) // count of TLVs\n\n            writeShort(0x01)\n            writeHexWithLength(\"66ccff\")\n\n            writeShort(0x04)\n            writeHexWithLength(\"114514\")\n\n            writeShort(0x19)\n            writeHexWithLength(\"198100\")\n\n            writeShort(0x233)\n            writeHexWithLength(\"666666\")\n        }.readBytes()\n\n        val actual = buildPacket {\n            _writeTlvMap {\n                tlv(0x001) { writeHex(\"66ccff\") }\n                tlv(0x004) { writeHex(\"114514\") }\n                tlv(0x019) { writeHex(\"198100\") }\n                tlv(0x233) { writeHex(\"666666\") }\n\n                println(\"counter = $counter\")\n            }\n        }.readBytes()\n\n        println(expected.toUHexString())\n        println(actual.toUHexString())\n\n        assertContentEquals(expected, actual)\n    }\n\n    private fun Output.writeHex(data: String) {\n        writeFully(data.hexToBytes())\n    }\n\n    private fun Output.writeHexWithLength(data: String) {\n        val hxd = data.hexToBytes()\n        writeShort(hxd.size.toShort())\n        writeFully(hxd)\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/commonTest/kotlin/net/mamoe/mirai/utils/TrySafelyTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport io.ktor.utils.io.errors.*\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFailsWith\nimport kotlin.test.assertIs\n\ninternal class TrySafelyTest {\n    @Test\n    fun `can run block`() {\n        assertEquals(\n            1,\n            trySafely(\n                block = { 1 },\n                finally = { }\n            )\n        )\n    }\n\n    @Test\n    fun `can run finally when no exception in block`() {\n        var x = 0\n        trySafely(\n            block = { },\n            finally = { x = 1 }\n        )\n        assertEquals(1, x)\n    }\n\n    @Test\n    fun `can run finally when exception in block`() {\n        var x = 0\n        assertFailsWith<Exception> {\n            trySafely(\n                block = { throw Exception() },\n                finally = { x = 1 }\n            )\n        }\n        assertEquals(1, x)\n    }\n\n    @Test\n    fun `can run finally catching`() {\n        assertFailsWith<NoSuchElementException> {\n            trySafely(\n                block = { throw NoSuchElementException() },\n                finally = { throw IOException(\"\") }\n            )\n        }.let { e ->\n            assertIs<IOException>(e.suppressedExceptions.single())\n        }\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/commonTest/kotlin/net/mamoe/mirai/utils/TypeSafeMapTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport net.mamoe.yamlkt.Yaml\nimport net.mamoe.yamlkt.YamlBuilder\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\n\ninternal class TypeSafeMapTest {\n\n    private val myKey = TypeKey<String>(\"test\")\n    private val myNullableKey = TypeKey<String?>(\"testNullable\")\n    private val myNullableKey2 = TypeKey<String?>(\"testNullable2\")\n    private val myKey2 = TypeKey<CharSequence>(\"test2\")\n\n    @Test\n    fun `can set get`() {\n        val map = createMutableTypeSafeMap()\n        map[myKey] = \"str\"\n        map[myKey2] = \"str2\"\n        assertEquals(2, map.size)\n        assertEquals(\"str\", map[myKey])\n        assertEquals(\"str2\", map[myKey2])\n\n    }\n\n    @Test\n    fun `test nulls`() {\n        val map = createMutableTypeSafeMap()\n        map[myNullableKey] = null\n        map[myNullableKey2] = \"str2\"\n        assertEquals(2, map.size)\n        assertEquals(null, map[myNullableKey])\n        assertEquals(\"str2\", map[myNullableKey2])\n    }\n\n    @Test\n    fun `key is inlined`() {\n        val map = createMutableTypeSafeMap()\n        map[TypeKey<String>(\"test\")] = \"str\"\n        map[TypeKey<String>(\"test\")] = \"str2\"\n        assertEquals(1, map.size)\n        assertEquals(\"str2\", map[TypeKey(\"test\")])\n    }\n\n    @Test\n    fun `can toMap`() {\n        val map = createMutableTypeSafeMap()\n        map[myKey] = \"str\"\n        map[myKey2] = \"str2\"\n        assertEquals(2, map.size)\n\n        val map1 = map.toMapBoxed()\n\n        assertEquals(2, map1.size)\n        assertEquals(\"str\", map1[myKey])\n        assertEquals(\"str2\", map1[myKey2])\n    }\n\n    @Test\n    fun `test serialization`() {\n        val map = createMutableTypeSafeMap()\n        map[myKey] = \"str\"\n        map[myKey2] = \"str2\"\n        assertEquals(2, map.size)\n\n        val map1 = map.toMap()\n\n        // Json does not support reflective serialization, so we use Yaml in JSON format\n        val yaml = Yaml {\n            classSerialization = YamlBuilder.MapSerialization.FLOW_MAP\n            mapSerialization = YamlBuilder.MapSerialization.FLOW_MAP\n            listSerialization = YamlBuilder.ListSerialization.FLOW_SEQUENCE\n            stringSerialization = YamlBuilder.StringSerialization.DOUBLE_QUOTATION\n            encodeDefaultValues = true\n        }\n\n        val string = yaml.encodeToString(map1)\n        println(string) // { \"test2\": \"str2\" ,\"test\": \"str\" }\n\n        val result = createMutableTypeSafeMap(Yaml.decodeMapFromString(string).cast())\n        assertEquals(map, result)\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/commonTest/kotlin/net/mamoe/mirai/utils/channels/OnDemandChannelTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils.channels\n\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.test.runTest\nimport net.mamoe.mirai.utils.AtomicBoolean\nimport net.mamoe.mirai.utils.testFramework.assertCoroutineSuspends\nimport net.mamoe.mirai.utils.testFramework.assertNoCoroutineSuspension\nimport kotlin.test.*\n\n\nclass OnDemandChannelTest {\n    ///////////////////////////////////////////////////////////////////////////\n    // CoroutineScope lifecycle\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Test\n    fun attachScopeJob() {\n        val job = SupervisorJob()\n        val channel = OnDemandChannel<Int, Int>(job) {\n            fail()\n        }\n        assertEquals(1, job.children.toList().size)\n        channel.close()\n    }\n\n    @Test\n    fun finishAfterInstantiation() {\n        val supervisor = SupervisorJob()\n        val channel = OnDemandChannel<Int, Int>(supervisor) {\n            fail(\"ran\")\n        }\n        assertEquals(1, supervisor.children.toList().size)\n        val job = supervisor.children.single()\n        assertEquals(true, job.isActive)\n\n        channel.close()\n\n        assertEquals(0, supervisor.children.toList().size)\n        assertEquals(false, job.isActive)\n    }\n\n    @Test\n    fun `cancel producer job on finish`() = runTest {\n        // Actually, this case won't happen, because producer coroutine will be cancelled on [finish]\n\n        lateinit var job: Job\n        val channel = OnDemandChannel<Int, Int>(currentCoroutineContext()) {\n            job = currentCoroutineContext()[Job]!!\n            emit(1)\n            emit(1)\n            emit(1)\n            emit(1)\n            fail()\n        }\n\n        channel.expectMore(1)\n        channel.receiveOrNull()\n        assertTrue { job.isActive }\n        channel.close()\n        assertFalse { job.isActive }\n        yield()\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Producer Coroutine — Tickets\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Test\n    fun `producer receives initial ticket`() = runTest {\n        val channel = OnDemandChannel(currentCoroutineContext()) { initialTicket ->\n            assertEquals(1, initialTicket)\n            emit(2)\n        }\n\n        channel.expectMore(1)\n        channel.receiveOrNull()\n\n        channel.close()\n    }\n\n    @Test\n    fun `producer receives second ticket`() = runTest {\n        val channel = OnDemandChannel(currentCoroutineContext()) { initialTicket ->\n            assertEquals(1, initialTicket)\n            assertEquals(2, emit(3))\n        }\n\n        channel.expectMore(1)\n        channel.receiveOrNull()\n        channel.expectMore(2)\n\n        channel.close()\n    }\n\n    @Test\n    fun `producer receives third ticket`() = runTest {\n        val channel = OnDemandChannel(currentCoroutineContext()) { initialTicket ->\n            assertEquals(1, initialTicket)\n            assertEquals(2, emit(4))\n            assertEquals(3, emit(5))\n        }\n\n        channel.expectMore(1)\n        channel.receiveOrNull()\n        channel.expectMore(2)\n        channel.receiveOrNull()\n        channel.expectMore(3)\n\n        channel.close()\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Consumer — Receive Correct Values\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Test\n    fun `receives correct first value`() = runTest {\n        val channel = OnDemandChannel<Int, Int>(currentCoroutineContext()) {\n            emit(3)\n        }\n\n        channel.expectMore(1)\n        assertEquals(3, channel.receiveOrNull())\n        channel.close()\n    }\n\n    @Test\n    fun `receives correct second value`() = runTest {\n        val channel = OnDemandChannel<Int, Int>(currentCoroutineContext()) {\n            emit(3)\n            emit(4)\n        }\n\n        channel.expectMore(1)\n        assertEquals(3, channel.receiveOrNull())\n        channel.expectMore(2)\n        assertEquals(4, channel.receiveOrNull())\n        channel.close()\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // expectMore/emit/receiveOrNull\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Test\n    fun `producer coroutine won't start until expectMore`() {\n        val channel = OnDemandChannel<Int, Int> {\n            fail()\n        }\n        channel.close()\n    }\n\n    @Test\n    fun `producer coroutine starts iff expectMore`() = runTest {\n        var started = false\n        val channel = OnDemandChannel<Int, Int>(currentCoroutineContext()) {\n            // (1)\n            assertEquals(false, started)\n            started = true\n            yield() // goto (2)\n            fail()\n        }\n        assertFalse { started }\n        assertTrue { channel.expectMore(1) } // launches the job, but it won't execute due to single parallelism\n        yield() // goto (1)\n        // (2)\n        assertTrue { started }\n        channel.close()\n    }\n\n    @Test\n    fun `receiveOrNull does not suspend if value is ready`() = runTest {\n        val channel = OnDemandChannel<Int, Int>(currentCoroutineContext()) {\n            emit(1)\n        }\n\n        assertTrue { channel.expectMore(1) }\n        yield() // run `emit`\n        // now value is ready\n        assertNoCoroutineSuspension { channel.receiveOrNull() }\n        channel.close()\n    }\n\n    @Test\n    fun `receiveOrNull does suspend if value is not ready`() = runTest {\n        val channel = OnDemandChannel<Int, Int>(currentCoroutineContext()) {\n            yield()\n            emit(1)\n        }\n\n        assertTrue { channel.expectMore(1) }\n        assertCoroutineSuspends { channel.receiveOrNull() }\n        channel.close()\n    }\n\n    @Test\n    fun `emit won't resume unless another expectMore`() = runTest {\n        val canResume = AtomicBoolean(false)\n        val channel = OnDemandChannel<Int, Int>(currentCoroutineContext()) {\n            emit(1)\n\n            if (!canResume.value) fail(\"Emit should not resume\")\n\n            canResume.value = false\n        }\n\n        channel.expectMore(1)\n        channel.receiveOrNull()\n        canResume.value = true\n        channel.expectMore(2)\n        yield() // run producer\n        assertEquals(false, canResume.value)\n        channel.close()\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Operation while already finished\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Test\n    fun `expectMore and receiveOrNull while already finished just after instantiation`() = runTest {\n        val channel = OnDemandChannel<Int, Int>(currentCoroutineContext()) {\n            fail(\"Producer should not run\")\n        }\n        channel.close()\n\n        assertFalse { channel.expectMore(1) }\n        assertNull(channel.receiveOrNull())\n        assertFalse { channel.expectMore(1) }\n        assertFalse { channel.expectMore(1) }\n        assertNull(channel.receiveOrNull())\n        assertNull(channel.receiveOrNull())\n    }\n\n    @Test\n    fun `expectMore and receiveOrNull while already finished`() = runTest {\n        val channel = OnDemandChannel<Int, Int>(currentCoroutineContext()) {\n            emit(1)\n        }\n\n        assertTrue { channel.expectMore(1) }\n        assertNotNull(channel.receiveOrNull())\n        assertFalse { channel.isClosed }\n\n        assertTrue { channel.expectMore(1) } // `expectMore` don't know if more values are available\n        yield() // go to producer\n        // now we must know producer has no more value\n        assertTrue { channel.isClosed }\n        assertNull(channel.receiveOrNull())\n        assertFalse { channel.expectMore(1) }\n        assertNull(channel.receiveOrNull())\n        assertFalse { (channel as CoroutineOnDemandReceiveChannel).getScope().isActive }\n    }\n\n    @Test\n    fun `emit while already finished`() {\n        // Actually, this case won't happen, because producer coroutine will be cancelled on [finish]\n\n        `cancel producer job on finish`()\n    }\n\n\n    @Test\n    fun `producer exception closes channel then receiveOrNull throws`() = runTest {\n        val channel = OnDemandChannel<Int, Int>(currentCoroutineContext()) {\n            throw NoSuchElementException(\"Oops\")\n        }\n\n        assertTrue { channel.expectMore(1) }\n        assertFalse { channel.isClosed }\n        assertIs<ChannelState.Producing<*, *>>(channel.state)\n        assertFailsWith<ProducerFailureException> {\n            println(channel.receiveOrNull())\n        }.also {\n            assertIs<NoSuchElementException>(it.cause)\n        }\n        assertTrue { channel.isClosed }\n\n        // The exception looks like this. \n        // The first cause is stacktrace-recovered by coroutines, and the second is the original one. \n\n        //net.mamoe.mirai.utils.channels.ProducerFailureException: Producer failed to produce a value, see cause\n        //\tat net.mamoe.mirai.utils.channels.CoroutineOnDemandReceiveChannel.receiveOrNull(OnDemandChannelImpl.kt:164)\n        //\tat net.mamoe.mirai.utils.channels.CoroutineOnDemandReceiveChannel$receiveOrNull$1.invokeSuspend(OnDemandChannelImpl.kt)\n        //\tat kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)\n        //\tat kotlinx.coroutines.test.TestBuildersKt.runTest$default(Unknown Source)\n        //\tat net.mamoe.mirai.utils.channels.OnDemandChannelTest.producer exception(OnDemandChannelTest.kt:273)\n        //\tat worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)\n        //Caused by: java.util.NoSuchElementException: Oops\n        //\tat net.mamoe.mirai.utils.channels.OnDemandChannelTest$producer exception$1$channel$1.invokeSuspend(OnDemandChannelTest.kt:275)\n        //\tat net.mamoe.mirai.utils.channels.OnDemandChannelTest$producer exception$1$channel$1.invoke(OnDemandChannelTest.kt)\n        //\tat net.mamoe.mirai.utils.channels.OnDemandChannelTest$producer exception$1$channel$1.invoke(OnDemandChannelTest.kt)\n        //\tat net.mamoe.mirai.utils.channels.CoroutineOnDemandReceiveChannel$Producer$1.invokeSuspend(OnDemandChannelImpl.kt:46)\n        //\t(Coroutine boundary)\n        //\tat net.mamoe.mirai.utils.channels.CoroutineOnDemandReceiveChannel.receiveOrNull(OnDemandChannelImpl.kt:162)\n        //\tat net.mamoe.mirai.utils.channels.OnDemandChannelTest$producer exception$1.invokeSuspend(OnDemandChannelTest.kt:280)\n        //\tat kotlinx.coroutines.test.TestBuildersKt__TestBuildersKt$runTestCoroutine$2.invokeSuspend(TestBuilders.kt:212)\n        //Caused by: java.util.NoSuchElementException: Oops\n        //  ...\n    }\n\n\n    @Test\n    fun `producer exception closes channel then receiveOrNull throws in Producing state`() = runTest {\n        val channel = OnDemandChannel<Int, Int>(currentCoroutineContext()) {\n            throw NoSuchElementException(\"Oops\")\n        }\n\n        assertTrue { channel.expectMore(1) }\n        yield() // fail the channel first\n        assertIs<ChannelState.Consuming<*, *>>(channel.state)\n        assertFalse { channel.isClosed } // channel won't close until receiveOrNull\n\n        assertFailsWith<ProducerFailureException> {\n            println(channel.receiveOrNull())\n        }.also {\n            assertIs<NoSuchElementException>(it.cause)\n        }\n        assertTrue { channel.isClosed }\n    }\n}\n\n\nprivate val <T, V> OnDemandReceiveChannel<T, V>.state\n    get() = (this as CoroutineOnDemandReceiveChannel<T, V>).getState() "
  },
  {
    "path": "mirai-core-utils/src/commonTest/kotlin/net/mamoe/mirai/utils/testFramework/AssertNoCoroutineSuspension.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils.testFramework\n\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.test.runTest\nimport kotlin.contracts.InvocationKind\nimport kotlin.contracts.contract\nimport kotlin.coroutines.resume\nimport kotlin.test.Test\nimport kotlin.test.assertEquals\nimport kotlin.test.assertFails\nimport kotlin.test.fail\n\nsuspend inline fun <R> assertNoCoroutineSuspension(\n    crossinline block: suspend () -> R,\n): R {\n    contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }\n    return withContext(Dispatchers.Default.limitedParallelism(1)) {\n        val job = launch(start = CoroutineStart.UNDISPATCHED) {\n            yield()\n            fail(\"Expected no coroutine suspension\")\n        }\n        val ret = block()\n        job.cancel()\n        ret\n    }\n}\n\n/**\n * Executes [block], and asserts there happens at least one coroutine suspension in [block].\n *\n * When the first coroutine suspension happens, [onSuspend] will be called.\n */\n@OptIn(ExperimentalStdlibApi::class)\nsuspend inline fun <R> assertCoroutineSuspends(\n    noinline onSuspend: (suspend () -> Unit)? = null,\n    crossinline block: suspend () -> R,\n): R {\n    contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }\n\n    val dispatcher = currentCoroutineContext()[CoroutineDispatcher] ?: Dispatchers.Main.limitedParallelism(1)\n    return withContext(dispatcher.limitedParallelism(1)) {\n        val job = launch(start = CoroutineStart.UNDISPATCHED) {\n            yield() // goto block\n            onSuspend?.invoke()\n        }\n        val ret = block()\n        kotlin.test.assertTrue(\"Expected coroutine suspension\") { job.isCompleted }\n        job.cancel()\n        ret\n    }\n}\n\nclass AssertCoroutineSuspensionTest {\n    @Test\n    fun `assertNoCoroutineSuspension no suspension`() = runTest {\n        assertNoCoroutineSuspension {}\n    }\n\n    @Test\n    fun `assertNoCoroutineSuspension suspend cancellable`() = runTest {\n        assertFails {\n            assertNoCoroutineSuspension {\n                suspendCancellableCoroutine<Unit> { }\n            }\n        }.run {\n            assertEquals(\"Expected no coroutine suspension\", message)\n        }\n    }\n\n    @Test\n    fun `assertCoroutineSuspends suspend`() = runTest {\n        assertCoroutineSuspends {\n            suspendCancellableCoroutine {\n                // resume after suspendCancellableCoroutine returns to create a suspension\n                launch(start = CoroutineStart.UNDISPATCHED) {\n                    yield()\n                    it.resume(Unit)\n                }\n            }\n        }\n    }\n\n    @Test\n    fun `assertCoroutineSuspends no suspension`() = runTest {\n        assertFails {\n            assertCoroutineSuspends {}\n        }.run {\n            assertEquals(\"Expected coroutine suspension\", message)\n        }\n    }\n\n}"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/ByteArrayOp.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MiraiUtils\")\n\npackage net.mamoe.mirai.utils\n\nimport io.ktor.utils.io.core.*\nimport io.ktor.utils.io.streams.*\nimport java.io.ByteArrayInputStream\nimport java.io.ByteArrayOutputStream\nimport java.io.InputStream\nimport java.io.OutputStream\nimport java.security.MessageDigest\nimport java.util.zip.*\n\npublic actual val DEFAULT_BUFFER_SIZE: Int get() = kotlin.io.DEFAULT_BUFFER_SIZE\n\npublic fun InputStream.md5(): ByteArray {\n    return digest(\"md5\")\n}\n\npublic fun InputStream.digest(algorithm: String): ByteArray {\n    val digest = MessageDigest.getInstance(algorithm)\n    digest.reset()\n    use { input ->\n        object : OutputStream() {\n            override fun write(b: Int) {\n                digest.update(b.toByte())\n            }\n\n            override fun write(b: ByteArray, off: Int, len: Int) {\n                digest.update(b, off, len)\n            }\n        }.use { output ->\n            input.copyTo(output)\n        }\n    }\n    return digest.digest()\n}\n\npublic fun InputStream.sha1(): ByteArray {\n    return digest(\"SHA-1\")\n}\n\npublic fun InputStream.sha256(): ByteArray {\n    return digest(\"SHA-256\")\n}\n\npublic actual fun ByteArray.md5(offset: Int, length: Int): ByteArray {\n    checkOffsetAndLength(offset, length)\n    return MessageDigest.getInstance(\"MD5\").apply { update(this@md5, offset, length) }.digest()\n}\n\n\n@JvmOverloads\npublic actual fun ByteArray.sha1(offset: Int, length: Int): ByteArray {\n    checkOffsetAndLength(offset, length)\n    return MessageDigest.getInstance(\"SHA-1\").apply { update(this@sha1, offset, length) }.digest()\n}\n\n@JvmOverloads\npublic actual fun ByteArray.sha256(offset: Int, length: Int): ByteArray {\n    checkOffsetAndLength(offset, length)\n    return MessageDigest.getInstance(\"SHA-256\").apply { update(this@sha256, offset, length) }.digest()\n}\n\n@JvmOverloads\npublic actual fun ByteArray.gzip(offset: Int, length: Int): ByteArray {\n    ByteArrayOutputStream().use { buf ->\n        GZIPOutputStream(buf).use { gzip ->\n            inputStream(offset, length).use { t -> t.copyTo(gzip) }\n        }\n        buf.flush()\n        return buf.toByteArray()\n    }\n}\n\n@JvmOverloads\npublic actual fun ByteArray.ungzip(offset: Int, length: Int): ByteArray {\n    return GZIPInputStream(inputStream(offset, length)).use { it.readBytes() }\n}\n\npublic actual fun ByteArray.inflate(offset: Int, length: Int): ByteArray {\n    checkOffsetAndLength(offset, length)\n    if (length == 0) return ByteArray(0)\n\n    val inflater = Inflater()\n    inflater.reset()\n    return InflaterInputStream(ByteArrayInputStream(this, offset, length), inflater).readBytes()\n//    ByteArrayOutputStream().use { output ->\n//        inflater.setInput(this, offset, length)\n//        ByteArray(DEFAULT_BUFFER_SIZE).let {\n//            while (!inflater.finished()) {\n//                output.write(it, 0, inflater.inflate(it))\n//            }\n//        }\n//\n//        inflater.end()\n//        return output.toByteArray()\n//    }\n}\n\n@JvmOverloads\npublic actual fun ByteArray.deflate(offset: Int, length: Int): ByteArray {\n    checkOffsetAndLength(offset, length)\n    if (length == 0) return ByteArray(0)\n\n    val deflater = Deflater()\n    deflater.setInput(this, offset, length)\n    deflater.finish()\n\n    ByteArray(DEFAULT_BUFFER_SIZE).let {\n        return it.take(deflater.deflate(it)).toByteArray().also { deflater.end() }\n    }\n}\n\n\n/**\n * Input will be closed.\n */\npublic actual fun Input.gzipAllAvailable(): ByteArray {\n    return this.readBytes().gzip()\n\n    // The following doesn't work, input's release won't becalled. Possibly Ktor bug.\n//    return this.use {\n//        ByteArrayOutputStream().use { buf ->\n//            GZIPOutputStream(buf).use { gzip ->\n//                copyTo(gzip.asOutput())\n//            }\n//            buf.flush()\n//            buf.toByteArray()\n//        }\n//    }\n}\n\n/**\n * Input will be closed.\n */\npublic actual fun Input.ungzipAllAvailable(): ByteArray {\n    return GZIPInputStream(this.asStream()).use { it.readBytes() }\n}\n\n/**\n * Input will be closed.\n */\npublic actual fun Input.inflateAllAvailable(): ByteArray {\n    return this.inflateInput().use { it.readBytes() }\n}\n\n/**\n * Input will be closed.\n */\npublic actual fun Input.deflateAllAvailable(): ByteArray {\n    return this.deflateInput().use { it.readBytes() }\n}\n\n\nprivate fun Input.asStream(): InputStream = object : InputStream() {\n\n    override fun read(): Int {\n        if (endOfInput) return -1\n        return readByte().toIntUnsigned()\n    }\n\n    override fun read(buffer: ByteArray, offset: Int, length: Int): Int {\n        if (this@asStream.endOfInput) return -1\n        return readAvailable(buffer, offset, length)\n    }\n\n    override fun skip(count: Long): Long = discard(count)\n\n    override fun close() {\n        this@asStream.close()\n    }\n}\n\n/**\n * [source] will be closed on returned [Input.close]\n */\n@Suppress(\"FunctionName\")\npublic actual fun GzipDecompressionInput(source: Input): Input {\n    return GZIPInputStream(source.asStream()).asInput()\n}\n\n\n/**\n * [source] will be closed on returned [Input.close]\n */\n@Suppress(\"FunctionName\")\npublic actual fun InflateInput(source: Input): Input {\n    val inflater = Inflater()\n    inflater.reset()\n    return InflaterInputStream(source.asStream(), inflater).asInput()\n}\n\n/**\n * [source] will be closed on returned [Input.close]\n */\n@Suppress(\"FunctionName\")\npublic actual fun DeflateInput(source: Input): Input {\n    val deflater = Deflater()\n    deflater.reset()\n    return DeflaterInputStream(source.asStream(), deflater).asInput()\n}\n"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/Clock.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\npublic actual inline fun measureTimeMillis(block: () -> Unit): Long = kotlin.system.measureTimeMillis(block)"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/Closeable.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport io.ktor.utils.io.core.use as ktorUse\n\npublic actual typealias Closeable = java.io.Closeable\n\n@Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\")\n@kotlin.internal.LowPriorityInOverloadResolution\npublic actual inline fun <C : Closeable, R> C.use(block: (C) -> R): R = ktorUse(block)\n\npublic actual fun Closeable.asKtorCloseable(): io.ktor.utils.io.core.Closeable = this\npublic actual fun io.ktor.utils.io.core.Closeable.asMiraiCloseable(): Closeable = this"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/Collections.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport java.util.*\nimport java.util.concurrent.CopyOnWriteArraySet\nimport kotlin.reflect.KClass\n\n\npublic actual fun <T> Collection<T>.asImmutable(): Collection<T> {\n    return Collections.unmodifiableCollection(this)\n}\n\n@Suppress(\"NOTHING_TO_INLINE\")\npublic actual inline fun <T> List<T>.asImmutable(): List<T> {\n    return Collections.unmodifiableList(this)\n}\n\n@Suppress(\"NOTHING_TO_INLINE\")\npublic actual inline fun <T> Set<T>.asImmutable(): Set<T> {\n    return Collections.unmodifiableSet(this)\n}\n\n@Suppress(\"NOTHING_TO_INLINE\")\npublic inline fun <K, V> Map<K, V>.asImmutable(): Map<K, V> {\n    return Collections.unmodifiableMap(this)\n}\n\n@Suppress(\"FunctionName\")\npublic actual fun <K : Any, V> ConcurrentHashMap(): MutableMap<K, V> {\n    return java.util.concurrent.ConcurrentHashMap()\n}\n\npublic actual typealias LinkedList<E> = java.util.LinkedList<E>\n\n\npublic actual typealias MutableDeque<E> = java.util.Deque<E>\n\npublic actual typealias MutableQueue<E> = java.util.Queue<E>\n\n\n@Suppress(\"FunctionName\")\npublic actual fun <K : Enum<K>, V> EnumMap(clazz: KClass<K>): MutableMap<K, V> {\n    return EnumMap(clazz.java)\n}\n\n@Suppress(\"FunctionName\")\npublic actual fun <E> ConcurrentSet(): MutableSet<E> {\n    return CopyOnWriteArraySet()\n}\n\n/**\n * Same as [MutableCollection.addAll].\n *\n * Adds all the elements of the specified enumeration to this collection.\n * @return true if any of the specified elements was added to the collection, false if the collection was not modified.\n */\npublic fun <T> MutableCollection<T>.addAll(enumeration: Enumeration<T>): Boolean {\n    var addResult = false\n    while (enumeration.hasMoreElements()) {\n        addResult = this.add(enumeration.nextElement())\n    }\n    return addResult\n}"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/ConcurrentLinkedQueue.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\n\n@Suppress(\"FunctionName\")\npublic actual fun <E> ConcurrentLinkedDeque(): MutableDeque<E> {\n    return java.util.concurrent.ConcurrentLinkedDeque()\n}"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/CoroutineUtils.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.runInterruptible\n\npublic actual suspend inline fun <R> runBIO(\n    noinline block: () -> R,\n): R = runInterruptible(context = Dispatchers.IO, block = block)\n\npublic actual suspend inline fun <T, R> T.runBIO(\n    crossinline block: T.() -> R,\n): R = runInterruptible(context = Dispatchers.IO, block = { block() })\n"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/ExceptionCollector.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\ninternal actual fun hash(e: Throwable): Long {\n    return e.stackTrace.fold(0L) { acc, stackTraceElement ->\n        acc * 31 + hash(stackTraceElement).toLongUnsigned()\n    }\n}\n\nprivate fun hash(element: StackTraceElement): Int {\n    return element.lineNumber.hashCode() xor element.className.hashCode() xor element.methodName.hashCode()\n}\n"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/Files.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport java.io.File\n\n\npublic fun File.createFileIfNotExists() {\n    if (!this.exists()) {\n        this.parentFile?.mkdirs()\n        this.createNewFile()\n    }\n}\n\npublic fun File.resolveCreateFile(relative: String): File = this.resolve(relative).apply { createFileIfNotExists() }\npublic fun File.resolveCreateFile(relative: File): File = this.resolve(relative).apply { createFileIfNotExists() }\n\npublic fun File.resolveMkdir(relative: String): File = this.resolve(relative).apply { mkdirs() }\npublic fun File.resolveMkdir(relative: File): File = this.resolve(relative).apply { mkdirs() }\n\npublic fun File.touch(): File = apply {\n    parentFile?.mkdirs()\n    createNewFile()\n}\n"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/IO.jvm.shared.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MiraiUtils\")\n@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage net.mamoe.mirai.utils\n\nimport java.io.InputStream\n\nprivate fun dropContent0(stream: InputStream, buffer: ByteArray) {\n    while (true) {\n        val len = stream.read(buffer)\n        if (len == -1) break\n    }\n}\n\npublic fun InputStream.dropContent(\n    buffer: Int = 2048,\n    close: Boolean = false,\n) {\n    if (close) {\n        dropContent0(this, ByteArray(buffer))\n    } else {\n        this.use { dropContent0(it, ByteArray(buffer)) }\n    }\n}\n"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/JvmNioBuffer.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MiraiUtils\")\n\n@file:Suppress(\"NOTHING_TO_INLINE\", \"UsePropertyAccessSyntax\")\n\npackage net.mamoe.mirai.utils\n\nimport java.nio.Buffer\nimport java.nio.ByteBuffer\nimport java.nio.CharBuffer\nimport java.nio.charset.Charset\n\npublic inline var Buffer.pos: Int\n    get() = position()\n    set(value) {\n        position(value)\n    }\npublic inline val Buffer.remaining: Int\n    get() = remaining()\npublic inline var Buffer.limit: Int\n    get() = limit()\n    set(value) {\n        limit(value)\n    }\n\npublic inline fun Buffer.hasRemaining(size: Int): Boolean = remaining >= size\n\npublic inline fun ByteBuffer.read(): Byte = get()\npublic inline fun ByteBuffer.readInt(): Int = getInt()\npublic inline fun ByteBuffer.readDouble(): Double = getDouble()\npublic inline fun ByteBuffer.readShort(): Short = getShort()\npublic inline fun ByteBuffer.readLong(): Long = getLong()\npublic inline fun ByteBuffer.readChar(): Char = getChar()\npublic inline fun ByteBuffer.readFloat(): Float = getFloat()\n\npublic inline fun ByteBuffer.readBytes(dst: ByteArray) {\n    get(dst)\n}\n\npublic fun ByteBuffer.readBytes(): ByteArray {\n    val rsp = ByteArray(remaining)\n    readBytes(rsp)\n    return rsp\n}\n\npublic fun ByteBuffer.readToChars(charset: Charset = Charsets.UTF_8): CharBuffer {\n    return charset.decode(this)\n}\n\npublic fun ByteBuffer.readString(charset: Charset = Charsets.UTF_8): String {\n    return readToChars(charset).toString()\n}\n"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/MiraiFile.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport io.ktor.utils.io.core.*\nimport io.ktor.utils.io.streams.*\nimport java.io.File\n\npublic actual interface MiraiFile {\n    /**\n     * Name of this file or directory. Can be '.' and '..' if created by\n     */\n    public actual val name: String\n\n    /**\n     * Parent of this file or directory.\n     */\n    public actual val parent: MiraiFile?\n\n    /**\n     * Input path from [create].\n     */\n    public actual val path: String\n\n    /**\n     * Normalized absolute [path].\n     */\n    public actual val absolutePath: String\n\n    public actual val length: Long\n\n    public actual val isFile: Boolean\n    public actual val isDirectory: Boolean\n\n    public actual fun exists(): Boolean\n\n    /**\n     * Resolves a [MiraiFile] representing the [path] based on this [MiraiFile]. Result path is not guaranteed to be normalized.\n     */\n    public actual fun resolve(path: String): MiraiFile\n    public actual fun resolve(file: MiraiFile): MiraiFile\n\n    public actual fun createNewFile(): Boolean\n    public actual fun delete(): Boolean\n\n    public actual fun mkdir(): Boolean\n    public actual fun mkdirs(): Boolean\n\n    public actual fun input(): Input\n    public actual fun output(): Output\n\n    public actual companion object {\n        public actual fun create(path: String): MiraiFile {\n            return File(path).asMiraiFile()\n        }\n\n        public actual fun getWorkingDir(): MiraiFile {\n            return create(\n                System.getProperty(\"user.dir\")\n                    ?: throw IllegalStateException(\"System property 'user.dir' is not available\")\n            )\n        }\n    }\n}\n\npublic actual fun MiraiFile.deleteRecursively(): Boolean {\n    return this.toJvmFile().deleteRecursively()\n}\n\npublic fun File.asMiraiFile(): MiraiFile {\n    return JvmFileAsMiraiFile(this)\n}\n\npublic fun MiraiFile.toJvmFile(): File {\n    if (this is JvmFileAsMiraiFile) {\n        return jvmFile\n    }\n    return File(absolutePath)\n}\n\ninternal class JvmFileAsMiraiFile(\n    internal val jvmFile: File\n) : MiraiFile {\n    override val name: String get() = jvmFile.name\n    override val parent: MiraiFile? get() = jvmFile.parentFile?.asMiraiFile()\n    override val path: String get() = jvmFile.path\n    override val absolutePath: String get() = jvmFile.absolutePath\n    override val length: Long get() = jvmFile.length()\n    override val isFile: Boolean get() = jvmFile.isFile\n    override val isDirectory: Boolean get() = jvmFile.isDirectory\n    override fun exists(): Boolean = jvmFile.exists()\n    override fun resolve(path: String): MiraiFile = jvmFile.resolve(path).asMiraiFile()\n    override fun resolve(file: MiraiFile): MiraiFile = jvmFile.resolve(file.absolutePath).asMiraiFile()\n    override fun createNewFile(): Boolean = jvmFile.createNewFile()\n    override fun delete(): Boolean = jvmFile.delete()\n    override fun mkdir(): Boolean = jvmFile.mkdir()\n    override fun mkdirs(): Boolean = jvmFile.mkdirs()\n    override fun input(): Input = jvmFile.inputStream().asInput()\n    override fun output(): Output = jvmFile.outputStream().asOutput()\n}\n"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/Reflections.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.reflect.KClass\nimport kotlin.reflect.KParameter\n\npublic fun <T : Any> KClass<T>.createInstanceOrNull(): T? {\n    objectInstance?.let { return it }\n    val noArgsConstructor = constructors.singleOrNull { it.parameters.all(KParameter::isOptional) }\n        ?: return null\n\n    return noArgsConstructor.callBy(emptyMap())\n}\n"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/Resources.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\n\n@TestOnly\npublic fun readResource(url: String): String =\n    Thread.currentThread().contextClassLoader?.getResourceAsStream(url)?.readBytes()?.decodeToString()\n        ?: error(\"Could not find resource '$url'\")\n"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/SecretsProtection.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.builtins.ByteArraySerializer\nimport kotlinx.serialization.builtins.serializer\nimport java.nio.ByteBuffer\nimport java.util.concurrent.atomic.AtomicIntegerFieldUpdater\nimport java.util.concurrent.locks.Lock\nimport java.util.concurrent.locks.ReentrantLock\n\ninternal actual object SecretsProtectionPlatform {\n\n    private class NativeBufferWithLock(\n        @JvmField val buffer: ByteBuffer,\n        val lock: Lock = ReentrantLock(),\n        @JvmField @field:Volatile var lowRemainingHit: Int = 0,\n        @JvmField @field:Volatile var unusedHit: Int = 0,\n    ) {\n        companion object {\n            internal val lowRemainingHitUpdater = AtomicIntegerFieldUpdater.newUpdater(\n                NativeBufferWithLock::class.java, \"lowRemainingHit\"\n            )\n\n            internal val unusedHitUpdater = AtomicIntegerFieldUpdater.newUpdater(\n                NativeBufferWithLock::class.java, \"unusedHit\"\n            )\n        }\n    }\n\n    private val bufferSize = systemProp(\n        \"mirai.secrets.protection.buffer.size\", 0\n    ).toInt().coerceAtLeast(2048)\n\n    private val lowRemainingThreshold = bufferSize / 128\n\n    private val lowRemainingHitThreshold = systemProp(\n        \"mirai.secrets.protection.threshold.low.remaining.hit\", 10\n    ).toInt().coerceAtLeast(1)\n\n    private val pool = ConcurrentLinkedDeque<NativeBufferWithLock>()\n\n    init {\n        val tmbuffer = ByteBuffer.allocateDirect(bufferSize)\n        if (!systemProp(\"mirai.secrets.protection.ignore.warning\", false)) {\n            if (tmbuffer.javaClass === ByteBuffer.allocate(1).javaClass) {\n                val ps = System.err\n                synchronized(ps) {\n                    ps.println(\"========================================================================================\")\n                    ps.println(\"Mirai SecretsProtection WARNING:\")\n                    ps.println()\n                    ps.println(\"当前 JRE 实现没有为 `ByteBuffer.allocateDirect` 直接分配本地内存, 请更换其他 JRE.\")\n                    ps.println(\"这很有可能导致您的密码等敏感信息被带入内存报告中\")\n                    ps.println(\"可添加 JVM 参数 -Dmirai.secrets.protection.ignore.warning=true 来忽略此警告\")\n                    ps.println()\n                    ps.println(\"Current JRE Implementation not using native memory for `ByteBuffer.allocateDirect`.\")\n                    ps.println(\"Please use another JRE.\")\n                    ps.println(\"It may cause your passwords to be dumped by other processes.\")\n                    ps.println(\"Suppress this warning by adding jvm option -Dmirai.secrets.protection.ignore.warning=true\")\n                    ps.println()\n                    ps.println(\"========================================================================================\")\n                }\n            }\n        }\n        pool.add(NativeBufferWithLock(tmbuffer))\n    }\n\n    /*\n    Implementation note:\n\n    1. 如果数据超过单个缓冲区大小，直接分配系统内存并返回\n    2. 查找首个可以放下数据的缓冲区，放入缓冲区并返回对应镜像\n    3. 如果没有可用缓冲区，分配新缓冲区并加入缓冲区池内\n\n     */\n    @JvmStatic\n    fun allocate(size: Int): ByteBuffer {\n        if (size >= bufferSize) {\n            return ByteBuffer.allocateDirect(size)\n        }\n\n        fun putInto(buffer: NativeBufferWithLock): ByteBuffer {\n            // @context: buffer.locked = true\n            // @context: buffer.remaining >= buffer.size\n\n            // 返回存储 data 的数据的 DirectByteBuffer\n            //   ByteBuffer.slice(): DirectByteBuffer[start=pos, end=limit]\n            val mirror = buffer.buffer.let { buffer0 ->\n                buffer0.limit = buffer0.pos + size\n                buffer0.slice()\n            }\n            // 原始缓冲区复位\n            buffer.buffer.let { buf -> buf.limit = buf.capacity() }\n            buffer.buffer.pos += size\n\n            // 此缓冲区已无可用空间\n            if (!buffer.buffer.hasRemaining()) {\n                pool.remove(buffer)\n            }\n\n            return mirror\n        }\n\n        pool.forEach bufferLoop@{ buffer ->\n\n            val bufferRemaining = buffer.buffer.remaining\n            if (bufferRemaining >= size) {\n                if (buffer.lock.tryLock()) {\n                    try {\n                        if (buffer.buffer.hasRemaining(size)) {\n                            NativeBufferWithLock.unusedHitUpdater.getAndIncrement(buffer)\n                            return putInto(buffer)\n                        }\n                    } finally {\n                        buffer.lock.unlock()\n                    }\n                }\n            }\n            NativeBufferWithLock.unusedHitUpdater.getAndDecrement(buffer)\n\n            // OOM Avoid\n            if (bufferRemaining <= lowRemainingThreshold) {\n                NativeBufferWithLock.lowRemainingHitUpdater.getAndDecrement(buffer)\n                if (buffer.lowRemainingHit >= lowRemainingHitThreshold) {\n                    pool.remove(buffer)\n                }\n            }\n            if (buffer.unusedHit >= 20) {\n                pool.remove(buffer)\n            }\n\n        }\n        val newBuffer = NativeBufferWithLock(ByteBuffer.allocateDirect(bufferSize))\n        val rsp = putInto(newBuffer)\n        if (newBuffer.buffer.hasRemaining()) {\n            pool.add(newBuffer)\n        }\n        return rsp\n    }\n\n    @JvmStatic\n    actual fun escape(data: ByteArray): Any {\n        return allocate(data.size).also {\n            it.put(data)\n            it.pos = 0\n        }\n    }\n\n    actual fun impl_asString(data: Any): String {\n        data as ByteBuffer\n\n        return data.duplicate().readString()\n    }\n\n    actual fun impl_asByteArray(data: Any): ByteArray {\n        data as ByteBuffer\n        return data.duplicate().readBytes()\n    }\n\n    actual fun impl_getSize(data: Any): Int {\n        return (data as ByteBuffer).remaining\n    }\n\n    actual object EscapedStringSerializer : KSerializer<SecretsProtection.EscapedString> by String.serializer().map(\n        String.serializer().descriptor.copy(\"EscapedString\"),\n        deserialize = { SecretsProtection.EscapedString(escape(it.toByteArray())) },\n        serialize = { it.data.cast<ByteBuffer>().duplicate().readString() }\n    )\n\n    actual object EscapedByteBufferSerializer :\n        KSerializer<SecretsProtection.EscapedByteBuffer> by ByteArraySerializer().map(\n            ByteArraySerializer().descriptor.copy(\"EscapedByteBuffer\"),\n            deserialize = { SecretsProtection.EscapedByteBuffer(escape(it)) },\n            serialize = { it.data.cast<ByteBuffer>().duplicate().readBytes() }\n        )\n\n\n}"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/Serialization.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.serialization.BinaryFormat\nimport kotlinx.serialization.DeserializationStrategy\nimport kotlinx.serialization.StringFormat\nimport java.io.File\n\n"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/Services.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport java.util.*\nimport kotlin.reflect.KClass\nimport kotlin.reflect.full.createInstance\n\nprivate enum class LoaderType {\n    JDK,\n    BOTH,\n    FALLBACK,\n}\n\nprivate val loaderType = when (systemProp(\"mirai.service.loader\", \"both\")) {\n    \"jdk\" -> LoaderType.JDK\n    \"both\" -> LoaderType.BOTH\n    \"fallback\" -> LoaderType.FALLBACK\n    else -> throw IllegalStateException(\"cannot find a service loader, mirai.service.loader must be both, jdk or fallback (default by both)\")\n}\n\n@Suppress(\"UNCHECKED_CAST\")\npublic actual fun <T : Any> loadService(clazz: KClass<out T>, fallbackImplementation: String?): T {\n    val fallbackService by lazy {\n        Services.firstImplementationOrNull(Services.qualifiedNameOrFail(clazz)) as T?\n    }\n\n    val jdkService by lazy {\n        ServiceLoader.load(clazz.java).firstOrNull()?.let { return@lazy it }\n\n        ServiceLoader.load(clazz.java, clazz.java.classLoader).firstOrNull()\n    }\n\n    var suppressed: Throwable? = null\n\n    val services by lazy {\n        when (loaderType) {\n            LoaderType.JDK -> jdkService\n            LoaderType.BOTH -> jdkService ?: fallbackService\n            LoaderType.FALLBACK -> fallbackService\n        }?.let { return@lazy it }\n\n        if (fallbackImplementation != null) {\n            runCatching {\n                findCreateInstance<T>(fallbackImplementation)\n            }.onFailure { suppressed = it }.getOrNull()\n        } else null\n    }\n\n    return Services.getOverrideOrNull(clazz) ?: services\n    ?: throw NoSuchElementException(\"Could not find an implementation for service class ${clazz.qualifiedName}\").apply {\n        if (suppressed != null) addSuppressed(suppressed!!)\n    }\n}\n\nprivate fun <T : Any> findCreateInstance(fallbackImplementation: String): T {\n    return Class.forName(fallbackImplementation).cast<Class<out T>>().kotlin.run { objectInstance ?: createInstance() }\n}\n\npublic actual fun <T : Any> loadServiceOrNull(clazz: KClass<out T>, fallbackImplementation: String?): T? {\n    return runCatching { loadService(clazz, fallbackImplementation) }.getOrNull()\n}\n\n@Suppress(\"UNCHECKED_CAST\")\npublic actual fun <T : Any> loadServices(clazz: KClass<out T>): Sequence<T> {\n    fun fallBackServicesSeq(): Sequence<T> {\n        return Services.implementations(Services.qualifiedNameOrFail(clazz)).orEmpty()\n            .map { it.value as T }\n    }\n\n    fun jdkServices(): Sequence<T> = sequence {\n        val current = ServiceLoader.load(clazz.java).iterator()\n        if (current.hasNext()) {\n            yieldAll(current)\n        } else {\n            yieldAll(ServiceLoader.load(clazz.java, clazz.java.classLoader))\n        }\n    }\n\n    fun bothServices(): Sequence<T> = sequence {\n        Services.getOverrideOrNull(clazz)?.let { yield(it) }\n\n        var jdkServices = ServiceLoader.load(clazz.java).toList()\n        if (jdkServices.isEmpty()) {\n            jdkServices = ServiceLoader.load(clazz.java, clazz.java.classLoader).toList()\n        }\n        yieldAll(jdkServices)\n\n        Services.implementationsDirectly(Services.qualifiedNameOrFail(clazz)).asSequence()\n            .filter { impl ->\n                // Drop duplicated\n                jdkServices.none { it.javaClass.name == impl.implementationClass }\n            }\n            .forEach { yield(it.instance.value as T) }\n    }\n\n\n\n\n    return when (loaderType) {\n        LoaderType.JDK -> jdkServices()\n        LoaderType.BOTH -> bothServices()\n        LoaderType.FALLBACK -> fallBackServicesSeq()\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/StandardUtils.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport java.net.Inet4Address\n\ninternal actual fun isSameClassPlatform(object1: Any, object2: Any): Boolean {\n    return object1.javaClass == object2.javaClass\n}\n\npublic actual fun localIpAddress(): String = runCatching {\n    Inet4Address.getLocalHost().hostAddress\n}.getOrElse { \"192.168.1.123\" }\n\npublic actual fun availableProcessors(): Int = Runtime.getRuntime().availableProcessors()"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/Streams.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MiraiUtils\")\n@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.coroutines.CancellableContinuation\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.suspendCancellableCoroutine\nimport java.util.*\nimport java.util.Spliterators.AbstractSpliterator\nimport java.util.concurrent.ArrayBlockingQueue\nimport java.util.function.Consumer\nimport java.util.stream.Stream\nimport java.util.stream.StreamSupport\nimport kotlin.coroutines.*\nimport kotlin.streams.asStream\n\n@JvmSynthetic\npublic inline fun <T> stream(@BuilderInference noinline block: suspend SequenceScope<T>.() -> Unit): Stream<T> =\n    sequence(block).asStream()\n\n@Suppress(\"RemoveExplicitTypeArguments\")\npublic object JdkStreamSupport {\n    private class CompleteToken(val error: Throwable?) {\n        override fun toString(): String {\n            return \"CompleteToken[$error]\"\n        }\n    }\n\n    private val NULL_PLACEHOLDER = Symbol(\"null\")!!\n\n    /*\n    Implementation:\n\n    Spliterator.tryAdvance():\n        - Resume coroutine\n        (*Wait for collector.emit*)\n        - Re-Suspend flow\n        - Put response to queue\n\n        - Fire response to jdk consumer\n\n    Completion & Exception caught:\n        (* Spliterator.tryAdvance(): Resume coroutine *)\n        (* No more values or exception thrown. *)\n        (* completion called *)\n        - Put the exception or the completion token to queue\n\n        - Throw exception in Spliterator.tryAdvance() if possible\n        - Return false in Spliterator.tryAdvance()\n\n     */\n    public fun <T> Flow<T>.toStream(\n        context: CoroutineContext = EmptyCoroutineContext,\n    ): Stream<T> {\n        val spliterator = FlowSpliterator(\n            flow = this,\n            coroutineContext = context,\n        )\n\n        return StreamSupport.stream(spliterator, false).onClose {\n            spliterator.cancelled = true\n            spliterator.nextStep?.let { nextStep ->\n                if (nextStep is CancellableContinuation<*>) {\n                    nextStep.cancel()\n                } else {\n                    nextStep.resumeWithException(CancellationException())\n                }\n            }\n            spliterator.nextStep = null\n        }\n    }\n\n    private class FlowSpliterator<T>(\n        private val flow: Flow<T>,\n        private val coroutineContext: CoroutineContext,\n    ) : AbstractSpliterator<T>(\n        Long.MAX_VALUE, Spliterator.ORDERED or Spliterator.IMMUTABLE\n    ) {\n\n        private val queue = ArrayBlockingQueue<Any?>(1)\n        private var completed = false\n\n        @JvmField\n        var cancelled = false\n\n        @JvmField\n        var nextStep: Continuation<Unit>? = run {\n            val completion = object : Continuation<Unit> {\n                override val context: CoroutineContext get() = coroutineContext\n\n                override fun resumeWith(result: Result<Unit>) {\n                    nextStep = null\n                    completed = true\n                    queue.put(CompleteToken(result.exceptionOrNull()))\n                }\n\n            }\n            return@run (suspend {\n                flow.collect { item ->\n                    suspendCancellableCoroutine<Unit> { cont ->\n                        nextStep = cont\n                        queue.put(boxValue(item))\n                    }\n                }\n            }).createCoroutine(completion)\n        }\n\n        private inline fun boxValue(value: Any?): Any {\n            return value ?: NULL_PLACEHOLDER\n        }\n\n        private fun unboxResponse(value: Any?, action: Consumer<in T>): Boolean {\n            if (value is CompleteToken) { // completion & exception caught\n                value.error?.let { throw boxError(it) }\n                completed = true\n                return false // no more value available\n            }\n\n            if (value === NULL_PLACEHOLDER) { // null\n                @Suppress(\"UNCHECKED_CAST\")\n                action.accept(null as T)\n            } else {\n                @Suppress(\"UNCHECKED_CAST\")\n                action.accept(value as T)\n            }\n            return true\n        }\n\n        override fun tryAdvance(action: Consumer<in T>): Boolean {\n            if (completed) return false\n\n            if (queue.isNotEmpty()) {\n                return unboxResponse(queue.take(), action)\n            }\n            if (cancelled) return false\n\n            val step = nextStep!!\n            nextStep = null\n            step.resume(Unit)\n\n            return unboxResponse(queue.take(), action)\n        }\n\n    }\n\n    private fun boxError(error: Throwable): Throwable {\n        return ExceptionInFlowException(error)\n    }\n\n    // @PublishedApi\n    public open class ExceptionInFlowException : RuntimeException {\n        public constructor() : super()\n        public constructor(msg: String?) : super(msg)\n        public constructor(cause: Throwable?) : super(cause)\n        public constructor(msg: String?, cause: Throwable?) : super(msg, cause)\n    }\n}\n\n"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/StructureToStringTransformer.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\ninternal actual fun getPlatformDefaultStructureToStringTransformer(): StructureToStringTransformer? {\n    return StructureToStringTransformerLegacy()\n}"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/StructureToStringTransformerLegacy.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.serialization.Transient\nimport java.lang.reflect.Modifier\nimport kotlin.reflect.KClass\nimport kotlin.reflect.KProperty\nimport kotlin.reflect.KProperty1\nimport kotlin.reflect.full.hasAnnotation\nimport kotlin.reflect.jvm.javaField\n\n\npublic class StructureToStringTransformerLegacy : StructureToStringTransformer {\n    override fun transform(any: Any?): String = any._miraiContentToString()\n    override fun transformAndDesensitize(any: Any?): String = transform(any) // desensitization not supported\n\n    private val indent: String = \" \".repeat(4)\n\n    /**\n     * 将所有元素加入转换为多行的字符串表示.\n     */\n    private fun <T> Sequence<T>.joinToStringPrefixed(prefix: String, transform: (T) -> CharSequence): String {\n        return this.joinToString(prefix = \"$prefix$indent\", separator = \"\\n$prefix$indent\", transform = transform)\n    }\n\n    /**\n     * 将内容格式化为较可读的字符串输出.\n     *\n     * 各数字类型及其无符号类型: 十六进制表示 + 十进制表示. e.g. `0x1000(4096)`\n     * [ByteArray]: 十六进制表示, 通过 [ByteArray.toUHexString]\n     * [Iterable], [Iterator], [Sequence]: 调用各自的 joinToString.\n     * [Map]: 多行输出. 每行显示一个值. 递归调用 [_miraiContentToString]. 嵌套结构将会以缩进表示\n     * `data class`: 调用其 [toString]\n     * 其他类型: 反射获取它和它的所有来自 Mirai 的 super 类型的所有自有属性并递归调用 [_miraiContentToString]. 嵌套结构将会以缩进表示\n     */\n    @Suppress(\"FunctionName\") // 这样就不容易被 IDE 提示\n    private fun Any?._miraiContentToString(prefix: String = \"\"): String = when (this) {\n        is Unit -> \"Unit\"\n        is UInt -> \"0x\" + this.toUHexString(\"\") + \"($this)\"\n        is UByte -> \"0x\" + this.toUHexString() + \"($this)\"\n        is UShort -> \"0x\" + this.toUHexString(\"\") + \"($this)\"\n        is ULong -> \"0x\" + this.toUHexString(\"\") + \"($this)\"\n        is Int -> \"0x\" + this.toUHexString(\"\") + \"($this)\"\n        is Byte -> \"0x\" + this.toUHexString() + \"($this)\"\n        is Short -> \"0x\" + this.toUHexString(\"\") + \"($this)\"\n        is Long -> \"0x\" + this.toUHexString(\"\") + \"($this)\"\n\n        is Boolean -> if (this) \"true\" else \"false\"\n\n        is ByteArray -> {\n            if (this.size == 0) \"<Empty ByteArray>\"\n            else this.toUHexString()\n        }\n        is ShortArray -> {\n            if (this.size == 0) \"<Empty ShortArray>\"\n            else this.iterator()._miraiContentToString()\n        }\n        is IntArray -> {\n            if (this.size == 0) \"<Empty IntArray>\"\n            else this.iterator()._miraiContentToString()\n        }\n        is LongArray -> {\n            if (this.size == 0) \"<Empty LongArray>\"\n            else this.iterator()._miraiContentToString()\n        }\n        is FloatArray -> {\n            if (this.size == 0) \"<Empty FloatArray>\"\n            else this.iterator()._miraiContentToString()\n        }\n        is DoubleArray -> {\n            if (this.size == 0) \"<Empty DoubleArray>\"\n            else this.iterator()._miraiContentToString()\n        }\n        is Array<*> -> {\n            if (this.size == 0) \"<Empty Array>\"\n            else this.iterator()._miraiContentToString()\n        }\n        is BooleanArray -> {\n            if (this.size == 0) \"<Empty BooleanArray>\"\n            else this.iterator()._miraiContentToString()\n        }\n\n        is Iterable<*> -> this.joinToString(prefix = \"[\", postfix = \"]\") { it._miraiContentToString(prefix) }\n        is Iterator<*> -> this.asSequence()\n            .joinToString(prefix = \"[\", postfix = \"]\") { it._miraiContentToString(prefix) }\n        is Sequence<*> -> this.joinToString(prefix = \"[\", postfix = \"]\") { it._miraiContentToString(prefix) }\n        is Map<*, *> -> this.entries.joinToString(\n            prefix = \"{\",\n            postfix = \"}\"\n        ) { it.key._miraiContentToString(prefix) + \"=\" + it.value._miraiContentToString(prefix) }\n        else -> {\n            if (this == null) \"null\"\n            else if (this::class.isData) this.toString()\n            else {\n                if (this::class.qualifiedName?.startsWith(\"net.mamoe.mirai.\") == true) {\n                    this.contentToStringReflectively(prefix + indent)\n                } else this.toString()\n                /*\n                (this::class.simpleName ?: \"<UnnamedClass>\") + \"#\" + this::class.hashCode() + \"{\\n\" +\n                        this::class.members.asSequence().filterIsInstance<KProperty<*>>().filter { !it.isSuspend && it.visibility == KVisibility.PUBLIC }\n                            .joinToStringPrefixed(\n                                prefix = indent\n                            ) { it.name + \"=\" + kotlin.runCatching { it.call(it).contentToString(indent) }.getOrElse { \"<!>\" } }\n                 */\n            }\n        }\n    }\n\n    private fun KProperty1<*, *>.getValueAgainstPermission(receiver: Any): Any? {\n        return this.javaField?.apply { isAccessible = true }?.get(receiver)\n    }\n\n    private fun Any.canBeIgnored(): Boolean {\n        return when (this) {\n            is String -> this.isEmpty()\n            is ByteArray -> this.isEmpty()\n            is Array<*> -> this.isEmpty()\n            is Int -> this == 0\n            is Float -> this == 0f\n            is Double -> this == 0.0\n            is Byte -> this == 0.toByte()\n            is Short -> this == 0.toShort()\n            is Long -> this == 0.toLong()\n            else -> false\n        }\n    }\n\n    private fun Any.contentToStringReflectively(\n        prefix: String,\n        filter: ((name: String, value: Any?) -> Boolean)? = null,\n    ): String {\n        val newPrefix = \"$prefix    \"\n        return (this::class.simpleName ?: \"<UnnamedClass>\") + \"#\" + this::class.hashCode() + \" {\\n\" +\n                this.allMembersFromSuperClassesMatching { it.qualifiedName?.startsWith(\"net.mamoe.mirai\") == true }\n                    .distinctBy { it.name }\n                    .filterNot { it.name.contains(\"$\") || it.name == \"Companion\" || it.isConst || it.name == \"serialVersionUID\" }\n                    .mapNotNull {\n                        val value = it.getValueAgainstPermission(this) ?: return@mapNotNull null\n                        if (filter != null) {\n                            if (!filter(it.name, value))\n                                return@mapNotNull it.name to value\n                            else {\n                                return@mapNotNull null\n                            }\n                        }\n                        it.name to value\n                    }\n                    .joinToStringPrefixed(\n                        prefix = newPrefix\n                    ) { (name: String, value: Any?) ->\n                        if (value.canBeIgnored()) \"\"\n                        else {\n                            \"$name=\" + kotlin.runCatching {\n                                if (value == this) \"<this>\"\n                                else value._miraiContentToString(newPrefix)\n                            }.getOrElse { \"<!>\" }\n                        }\n                    }.lines().filterNot { it.isBlank() }.joinToString(\"\\n\") + \"\\n$prefix}\"\n    }\n\n    private fun KClass<out Any>.thisClassAndSuperclassSequence(): Sequence<KClass<out Any>> {\n        return sequenceOf(this) +\n                this.supertypes.asSequence()\n                    .mapNotNull { type ->\n                        type.classifier?.takeIf { it is KClass<*> }?.takeIf { it != Any::class } as? KClass<out Any>\n                    }.flatMap { it.thisClassAndSuperclassSequence() }\n    }\n\n    @Suppress(\"UNCHECKED_CAST\")\n    private fun Any.allMembersFromSuperClassesMatching(classFilter: (KClass<out Any>) -> Boolean): Sequence<KProperty1<Any, *>> {\n        return this::class.thisClassAndSuperclassSequence()\n            .filter { classFilter(it) }\n            .map { it.members }\n            .flatMap { it.asSequence() }\n            .filterIsInstance<KProperty1<*, *>>()\n            .filterNot { it.hasAnnotation<Transient>() }\n            .filterNot { it.isTransient() }\n            .map { it as KProperty1<Any, *> }\n    }\n\n    private fun KProperty<*>.isTransient(): Boolean =\n        javaField?.modifiers?.and(Modifier.TRANSIENT) != 0\n\n\n}"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/ThreadLocal.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.reflect.KProperty\n\n\npublic fun <T : Any?> threadLocal(newInstance: () -> T): ThreadLocal<T> {\n    return object : ThreadLocal<T>() {\n        override fun initialValue(): T = newInstance()\n    }\n}\n\npublic operator fun <T> ThreadLocal<T>.getValue(t: Any?, property: KProperty<Any?>): T =\n    this.get() as T // `get()` is from Java and has type of `T!`\n"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/TimeUtils.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport java.text.SimpleDateFormat\nimport java.util.*\n\npublic actual fun currentTimeMillis(): Long = System.currentTimeMillis()\n\n\nprivate val timeFormat: SimpleDateFormat by threadLocal {\n    SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\", Locale.getDefault())\n}\n\npublic actual fun formatTime(epochTimeMillis: Long, format: String?): String {\n    return if (format == null) {\n        timeFormat.format(Date(epochTimeMillis))\n    } else {\n        SimpleDateFormat(format, Locale.getDefault()).format(Date(epochTimeMillis))\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/WeakRef.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MiraiUtils\")\n\n\n@file:Suppress(\"unused\", \"NOTHING_TO_INLINE\")\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.reflect.KProperty\n\n/**\n * WeakRef that `getValue` for delegation throws an [IllegalStateException] if the referent is released by GC. Therefore it returns notnull value only\n */\npublic class UnsafeWeakRef<T>(private val weakRef: WeakRef<T>) {\n    public fun get(): T = weakRef.get() ?: error(\"WeakRef is released\")\n    public fun clear(): Unit = weakRef.clear()\n}\n\n/**\n * Provides delegate value.\n *\n * ```kotlin\n * val bot: Bot by param.unsafeWeakRef()\n * ```\n */\n@JvmSynthetic\npublic inline operator fun <T> UnsafeWeakRef<T>.getValue(thisRef: Any?, property: KProperty<*>): T = get()\n\n/**\n * Weak Reference.\n * On JVM, it is implemented as a typealias referring to `WeakReference` from JDK.\n *\n * Details:\n * On JVM, instances of objects are stored in the JVM Heap and are accessed via references.\n * GC(garbage collection) can automatically collect and release the memory used by objects that are not directly referred by any other.\n * [WeakRef] is not a direct reference, therefore it doesn't hinder GC.\n *\n * @see weakRef provides a WeakRef\n * @see unsafeWeakRef provides a UnsafeWeakRef\n */\npublic typealias WeakRef<T> = java.lang.ref.WeakReference<T>\n\n/**\n * Indicates that the property is delegated by a [WeakRef]\n *\n * @see weakRef\n */\n@Target(AnnotationTarget.PROPERTY)\n@Retention(AnnotationRetention.SOURCE)\npublic annotation class WeakRefProperty\n\n/**\n * Provides a weak reference to [this]\n * The `getValue` for delegation returns [this] when [this] is not released by GC\n */\n@JvmSynthetic\npublic inline fun <T> T.weakRef(): WeakRef<T> = WeakRef(this)\n\n/**\n * Constructs an unsafe inline delegate for [this]\n */\n@JvmSynthetic\npublic inline fun <T> WeakRef<T>.unsafe(): UnsafeWeakRef<T> = UnsafeWeakRef(this)\n\n/**\n * Provides a weak reference to [this].\n * The `getValue` for delegation throws an [IllegalStateException] if the referent is released by GC. Therefore it returns notnull value only\n *\n * **UNSTABLE API**: It is strongly suggested not to use this api\n */\n@JvmSynthetic\npublic inline fun <T> T.unsafeWeakRef(): UnsafeWeakRef<T> = UnsafeWeakRef(this.weakRef())\n\n/**\n * Provides delegate value.\n *\n * ```kotlin\n * val bot: Bot? by param.weakRef()\n * ```\n */\n@JvmSynthetic\npublic inline operator fun <T> WeakRef<T>.getValue(thisRef: Any?, property: KProperty<*>): T? = this.get()\n\n/**\n * Call the block if the referent is absent\n */\n@JvmSynthetic\npublic inline fun <T, R> WeakRef<T>.ifAbsent(block: (T) -> R): R? = this.get()?.let(block)"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/annotations/Range.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils.annotations\n\n\npublic actual typealias Range = org.jetbrains.annotations.Range"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/package.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\npackage net.mamoe.mirai.utils\n"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseMain/kotlin/systemProp.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\ninternal actual fun getProperty(name: String, default: String): String? = System.getProperty(name, default)\n\ninternal actual fun setProperty(name: String, value: String) {\n    System.setProperty(name, value)\n}\n\n"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseTest/kotlin/ByteArrayOpTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\ninternal actual class ByteArrayOpTest : CommonByteArrayOpTest()"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseTest/kotlin/KotlinFlowToJdkStreamTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.flow.channelFlow\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.test.runTest\nimport net.mamoe.mirai.utils.JdkStreamSupport.toStream\nimport org.junit.jupiter.api.Test\nimport java.util.*\nimport java.util.stream.Collectors\nimport java.util.stream.Stream\nimport kotlin.coroutines.EmptyCoroutineContext\nimport kotlin.test.*\n\ninternal class KotlinFlowToJdkStreamTest {\n    private fun <T> Stream<T>.collectList(): List<T> = use { collect(Collectors.toList()) }\n\n    @Test\n    internal fun testFlowFinally() = runTest {\n        var finallyCalled = false\n\n        flow<Any?> {\n            try {\n                while (true) {\n                    emit(\"\")\n                }\n            } finally {\n                finallyCalled = true\n            }\n        }.toStream().use { it.findFirst() }\n\n        assertTrue { finallyCalled }\n    }\n\n    @Test\n    internal fun testNormally() = runTest {\n        flow<Any?> {\n            emit(\"1\")\n            emit(\"5\")\n            emit(\"2\")\n            emit(\"3\")\n        }.toStream().collectList().let {\n            assertEquals(listOf(\"1\", \"5\", \"2\", \"3\"), it)\n        }\n    }\n\n    @Test\n    internal fun testSuspendInFlow() = runTest {\n        flow<Any?> {\n            emit(\"1\")\n            yield() // Suspended\n            emit(\"2\")\n        }.toStream(context = Dispatchers.IO).collectList().let {\n            assertEquals(listOf(\"1\", \"2\"), it)\n        }\n    }\n\n    @Test\n    internal fun testCounter() = runTest {\n        var counter = 0\n        flow<Any?> {\n            while (true) {\n                counter++\n                emit(counter)\n            }\n        }.toStream().use { stream ->\n            stream.limit(5).forEach { }\n        }\n        assertEquals(5, counter)\n    }\n\n    @Test\n    internal fun testChannelFlow() = runTest {\n        channelFlow<Any?> {\n            send(514)\n            launch { send(94481) }\n            launch { send(94481) }\n            launch { send(94481) }\n            launch { send(94481) }\n        }.toStream().collectList().let {\n            assertEquals(listOf(514, 94481, 94481, 94481, 94481), it)\n        }\n    }\n\n    @Test\n    internal fun testExceptionCaught() = runTest {\n        val msg = UUID.randomUUID().toString()\n        flow<Any> { error(msg) }.toStream().use { s ->\n            assertFails(msg) { s.findFirst() }.printStackTrace(System.out)\n        }\n    }\n\n    @Test\n    internal fun testErrorInLaunchedContext() = runTest {\n        lateinit var myError: Throwable\n        val msg = UUID.randomUUID().toString()\n\n        flow<Any> {\n            myError = Throwable(msg)\n            throw myError\n        }.toStream(\n            context = Dispatchers.IO,\n        ).use { stream ->\n            assertFailsWith<RuntimeException>(msg) { stream.findFirst() }.let { err ->\n                assertSame(myError, err.cause)\n                assertTrue {\n                    err.stackTrace.any { it.className == \"net.mamoe.mirai.utils.JdkStreamSupport\\$FlowSpliterator\" && it.methodName == \"tryAdvance\" }\n                }\n\n                err.printStackTrace(System.out)\n            }\n        }\n    }\n\n    @Test\n    internal fun errorWillNotCancelJob() = runTest {\n        val scope = CoroutineScope(EmptyCoroutineContext)\n        val errmsg = UUID.randomUUID().toString()\n\n        flow<Any> { error(errmsg) }.toStream(\n            context = scope.coroutineContext\n        ).use { assertFails(errmsg) { it.findFirst() } }\n\n        val job = scope.coroutineContext.job\n        assertTrue { job.isActive }\n        assertFalse { job.isCancelled }\n        assertFalse { job.isCompleted }\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseTest/kotlin/LateinitMutablePropertyTestJvm.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.coroutines.CompletableDeferred\nimport kotlinx.coroutines.runBlocking\nimport kotlinx.coroutines.test.runTest\nimport kotlinx.coroutines.yield\nimport org.junit.jupiter.api.Test\nimport java.util.concurrent.CompletableFuture\nimport kotlin.concurrent.thread\nimport kotlin.test.assertEquals\nimport kotlin.test.assertSame\n\ninternal class LateinitMutablePropertyTestJvm {\n    @Test\n    fun `initializer called once if requested by multiple threads`() = runTest {\n        val value = Symbol(\"expected\")\n        var counter = 0\n\n        val verySlowInitializer = CompletableDeferred<Unit>()\n\n\n        val prop by lateinitMutableProperty {\n            counter++\n            runBlocking { yield(); verySlowInitializer.await() }\n            value\n        }\n\n\n        // requested by 10 threads\n        val lock = CompletableFuture<Unit>()\n        repeat(10) {\n            thread {\n                lock.join()\n                @Suppress(\"UNUSED_EXPRESSION\")\n                prop\n            }\n        }\n        lock.complete(Unit) // resume callers\n\n\n        verySlowInitializer.complete(Unit)\n\n        assertSame(value, prop)\n        assertEquals(1, counter)\n    }\n\n}"
  },
  {
    "path": "mirai-core-utils/src/jvmBaseTest/kotlin/package.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils"
  },
  {
    "path": "mirai-core-utils/src/jvmMain/kotlin/Actuals.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage net.mamoe.mirai.utils\n\nimport java.util.*\n\n\npublic actual fun ByteArray.encodeBase64(): String {\n    return Base64.getEncoder().encodeToString(this)\n}\n\npublic actual fun String.decodeBase64(): ByteArray {\n    return Base64.getDecoder().decode(this)\n}\n\npublic actual inline fun <reified E> Throwable.unwrap(addSuppressed: Boolean): Throwable {\n    if (this !is E) return this\n    return this.findCause { it !is E }\n        ?.also { if (addSuppressed) it.addSuppressed(this) }\n        ?: this\n}"
  },
  {
    "path": "mirai-core-utils/src/jvmMain/kotlin/IO.jvm.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:JvmMultifileClass\n@file:JvmName(\"MiraiUtils\")\n\n@file:Suppress(\"NOTHING_TO_INLINE\")\n\npackage net.mamoe.mirai.utils\n\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport kotlin.io.path.deleteIfExists\nimport kotlin.io.path.exists\nimport kotlin.io.path.isDirectory\nimport kotlin.io.path.listDirectoryEntries\n\npublic val Path.isFile: Boolean get() = Files.exists(this) && !Files.isDirectory(this)\n\npublic inline fun Path.mkdir() {\n    Files.createDirectory(this)\n}\n\npublic inline fun Path.mkdirs() {\n    Files.createDirectories(this)\n}\n\npublic fun Path.mkParentDirs() {\n    val current = parent ?: return\n    if (current == this) return\n    if (current.exists()) return\n    current.mkParentDirs()\n    current.mkdir()\n}\n\npublic fun Path.deleteRecursivelyMirai(): Boolean { // Kotlin added `Path.deleteRecursively()` in 1.8.0 but was experimental\n    if (isFile) return deleteIfExists()\n    if (isDirectory()) {\n        listDirectoryEntries().forEach { it.deleteRecursivelyMirai() }\n        return deleteIfExists()\n    }\n    return false\n}\n"
  },
  {
    "path": "mirai-core-utils/src/jvmTest/kotlin/AndroidUnwrapTest.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlin.test.Test\nimport kotlin.test.assertIs\n\nclass JvmUnwrapTest {\n    @Test\n    fun test() {\n        val e =\n            IllegalStateException(\n                OutOfMemoryError().initCause(VerifyError()).apply { addSuppressed(UnsatisfiedLinkError()) }\n            )\n\n        val unwrapped = e.unwrap<IllegalStateException>()\n\n        unwrapped.printStackTrace()\n\n        assertIs<OutOfMemoryError>(unwrapped)\n        assertIs<VerifyError>(unwrapped.cause)\n        assertIs<UnsatisfiedLinkError>(unwrapped.suppressed.first())\n        assertIs<IllegalStateException>(unwrapped.suppressed[1])\n    }\n}"
  },
  {
    "path": "mirai-core-utils/src/jvmTest/kotlin/SecretsProtectionTest.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.utils\n\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.runBlocking\nimport java.nio.ByteBuffer\nimport kotlin.test.Test\nimport kotlin.test.assertContentEquals\n\ninternal class SecretsProtectionTest {\n    @Test\n    fun chaosTest() = runBlocking<Unit> {\n        repeat(500) {\n            launch {\n                val data = ByteArray((1..255).random()) { (0..255).random().toByte() }\n                val buffer = SecretsProtection.escape(data) as ByteBuffer\n                assertContentEquals(\n                    data, buffer.duplicate().readBytes()\n                )\n                delay(100)\n                assertContentEquals(\n                    data, buffer.duplicate().readBytes()\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mirai-deps-test/.gitignore",
    "content": "test/BuildConfig.kt"
  },
  {
    "path": "mirai-deps-test/README.md",
    "content": "# native-deps-test\n\n测试 shadow relocation"
  },
  {
    "path": "mirai-deps-test/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n@file:Suppress(\"UnusedImport\")\n\nplugins {\n    kotlin(\"jvm\")\n    id(\"java-gradle-plugin\")\n}\n\ndependencies {\n    implementation(gradleApi())\n    implementation(gradleKotlinDsl())\n    implementation(`kotlin-reflect`)\n    implementation(kotlin(\"gradle-plugin-api\"))\n    implementation(kotlin(\"gradle-plugin\"))\n    implementation(kotlin(\"stdlib\"))\n\n    api(\"com.github.jengelman.gradle.plugins:shadow:6.0.0\")\n    api(`jetbrains-annotations`)\n\n    testImplementation(kotlin(\"test-junit5\"))\n    testImplementation(`junit-jupiter-api`)\n    testImplementation(`junit-jupiter-params`)\n    testRuntimeOnly(`junit-jupiter-engine`)\n}\n\ntasks.getByName(\"test\", Test::class) {\n    environment(\"mirai.root.project.dir\", rootProject.projectDir.absolutePath)\n    systemProperty(\"mirai.deps.test.must.run\", System.getProperty(\"mirai.deps.test.must.run\"))\n}\n\nval publishMiraiArtifactsToMavenLocal by tasks.registering {\n    group = \"mirai\"\n    description = \"Publish all mirai artifacts to MavenLocal\"\n    val publishTasks = rootProject.allprojects.mapNotNull { proj ->\n        proj.tasks.findByName(\"publishToMavenLocal\")\n    }\n    dependsOn(publishTasks)\n\n    doFirst {\n        // Always print this very important message\n        logger.warn(\"[publishMiraiArtifactsToMavenLocal] Project version is '${project.version}'.\")\n    }\n}\n\ntasks.getByName(\"test\") {\n    mustRunAfter(publishMiraiArtifactsToMavenLocal)\n}\n\n\ntasks.register(\"updateProjectVersionForLocalDepsTest\") {\n    doLast {\n        setProjectVersionForFutureBuilds(DEPS_TEST_VERSION)\n    }\n}\n\ntasks.register(\"generateBuildConfig\") {\n    group = \"mirai\"\n\n    doLast {\n        generateBuildConfig()\n    }\n    tasks.getByName(\"testClasses\").dependsOn(this)\n    tasks.getByName(\"compileTestKotlin\").dependsOn(this)\n}\n\ngenerateBuildConfig() // somehow \"generateBuildConfig\" won't execute\n\nfun generateBuildConfig() {\n    val text = \"\"\"\n            package net.mamoe.mirai.deps.test\n            \n            /**\n             * This file was generated by Gradle task `generateBuildConfig`.\n             */\n            object BuildConfig {\n                /**\n                 * Kotlin version used to compile mirai-core\n                 */\n                const val kotlinVersion = \"${Versions.kotlinCompiler}\"\n            }\n        \"\"\".trimIndent() + \"\\n\"\n    val file = project.projectDir.resolve(\"test/BuildConfig.kt\")\n    if (!file.exists() || file.readText() != text) {\n        file.writeText(text)\n    }\n}\n\n/**\n * Kind note: To run this task you probably need a lot of host memory and luck.\n *\n * **If you see errors, don't panic, that's most probably not your fault.**\n *\n * Try:\n *\n * ```shell\n * ./gradlew :mirai-deps-test:updateProjectVersionForLocalDepsTest\n * ./gradlew clean :mirai-deps-test:publishMiraiArtifactsToMavenLocal \"-Porg.gradle.parallel=false\"\n * ```\n * Note this will change your project version in `buildSrc/src/main/kotlin/Versions.kt`. Be careful to change it back before committing!\n * Note also this is **extremely slow**. If your computer isn't good enough it may take hours.\n */\nval publishMiraiLocalArtifacts = tasks.register(\"publishMiraiLocalArtifacts\", Exec::class) {\n    group = \"mirai\"\n    description = \"Starts a child process to publish v$DEPS_TEST_VERSION artifacts to MavenLocal\"\n\n    workingDir(rootProject.projectDir)\n    environment(\"mirai.build.project.version\", DEPS_TEST_VERSION)\n    commandLine(\n        \"./gradlew\",\n        \"clean\",\n        publishMiraiArtifactsToMavenLocal.name,\n        \"--no-daemon\",\n        \"--stacktrace\",\n        \"--scan\",\n        \"-Pkotlin.compiler.execution.strategy=in-process\"\n    )\n\n    standardOutput = System.out\n    errorOutput = System.err\n}\n\n\nversion = Versions.core\n"
  },
  {
    "path": "mirai-deps-test/gradle.properties",
    "content": "#\n# Copyright 2019-2022 Mamoe Technologies and contributors.\n#\n# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n#\n# https://github.com/mamoe/mirai/blob/dev/LICENSE\n#\n\n"
  },
  {
    "path": "mirai-deps-test/test/AbstractTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.deps.test\n\nimport org.gradle.api.internal.artifacts.mvnsettings.DefaultMavenFileLocations\nimport org.gradle.testkit.runner.GradleRunner\nimport org.gradle.testkit.runner.internal.DefaultGradleRunner\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.extension.AfterEachCallback\nimport org.junit.jupiter.api.extension.RegisterExtension\nimport org.junit.jupiter.api.io.TempDir\nimport java.io.File\n\n// Copied from mirai-console-gradle\nabstract class AbstractTest {\n    companion object {\n        const val miraiLocalVersion = \"2.99.0-deps-test\" // do Search Everywhere before changing this\n        const val REASON_LOCAL_ARTIFACT_NOT_AVAILABLE = \"local artifacts not available\"\n        private const val MIRAI_DEPS_TEST_MUST_RUN = \"mirai.deps.test.must.run\" // used by GitHub Actions scripts\n\n        val mavenLocalDir: File by lazy {\n            org.gradle.api.internal.artifacts.mvnsettings.DefaultLocalMavenRepositoryLocator(\n                org.gradle.api.internal.artifacts.mvnsettings.DefaultMavenSettingsProvider(DefaultMavenFileLocations())\n            ).localMavenRepository\n        }\n\n        @JvmStatic\n        fun isMiraiLocalAvailable(): Boolean {\n            val commandLine =\n                \"\"\"./gradlew publishMiraiArtifactsToMavenLocal -Dmirai.build.project.version=$miraiLocalVersion\"\"\"\n\n            return if (mavenLocalDir.resolve(\"net/mamoe/mirai-core/$miraiLocalVersion\").exists()) {\n                println(\n                    \"\"\"\n                [mirai-deps-test] Found local artifacts `$miraiLocalVersion`! \n                Please note that you may need to manually update local artifacts if you have:\n                - added/removed a dependency for mirai-core series modules\n                - changed version of any of the dependencies for mirai-core series modules\n                \n                You can update by running the following command: \n                $commandLine\n            \"\"\".trimIndent()\n                )\n                true\n            } else {\n                val message = \"\"\"\n                [mirai-deps-test] ERROR: Test is not run, because there are no local artifacts available for dependencies testing. \n                Please build and publish local artifacts with version `$miraiLocalVersion` before running this test(:mirai-deps-test:test).\n                This could have be automated but it will take a huge amount of time for your routine testing.\n                 \n                You can run this test manually if you have:\n                - added/removed a dependency for mirai-core series modules\n                - changed version of any of the dependencies for mirai-core series modules\n                \n                Note that you can ignore this test if you did not change project (dependency) structure.\n                And you don't need to worry if you does not run this test — this test is always executed on the CI when you make a PR.\n\n                You can run the following command to publish local artifacts:\n                $commandLine\n                \n                Then you can run this test again. (By your original way or ./gradlew :mirai-deps-test:test)\n                \"\"\".trimIndent()\n                System.err.println(\n                    message\n                )\n\n                if (System.getProperty(MIRAI_DEPS_TEST_MUST_RUN, \"false\").toBoolean()) {\n                    throw AssertionError(\"System property `mirai.deps.test.must.run` is `true`, which requires the deps test to be run. \\n\\n$message\")\n                } else {\n                    false\n                }\n            }\n        }\n    }\n\n    @JvmField\n    @TempDir\n    var tempDirField: File? = null\n\n    val tempDir: File get() = tempDirField!!\n\n    val kotlinVersion = BuildConfig.kotlinVersion\n\n    lateinit var mainSrcDir: File\n    lateinit var commonMainSrcDir: File\n    lateinit var testDir: File\n    lateinit var buildFile: File\n    lateinit var settingsFile: File\n    lateinit var propertiesFile: File\n\n    private inline fun <reified T> Any?.cast(): T = this as T\n\n    @OptIn(ExperimentalStdlibApi::class)\n    fun runGradle(vararg arguments: String) {\n        System.gc()\n        GradleRunner.create()\n            .withProjectDir(tempDir)\n            .withPluginClasspath()\n            .withGradleVersion(\"7.2\")\n            .forwardOutput()\n            .withEnvironment(System.getenv())\n            .cast<DefaultGradleRunner>().withJvmArguments(buildList {\n                add(\"-Xmx512m\") // Kotlin MPP may need memory to build\n                add(\"-Dfile.encoding=UTF-8\")\n            })\n            .withArguments(buildList {\n                addAll(arguments)\n                add(\"-P\")\n                add(\"kotlin.compiler.execution.strategy=in-process\")\n                add(\"-D\")\n                add(\"org.gradle.jvmargs=-Xmx512m\")\n                add(\"-D\")\n                add(\"file.encoding=UTF-8\")\n//                add(\"--stacktrace\")\n                add(\"--info\")\n            })\n            .build()\n    }\n\n    @BeforeEach\n    fun setup() {\n        println(\"Temp path is \" + tempDir.absolutePath)\n\n        settingsFile = File(tempDir, \"settings.gradle\")\n        settingsFile.delete()\n        settingsFile.writeText(\n            \"\"\"\n            pluginManagement {\n                repositories {\n                    gradlePluginPortal()\n                    mavenCentral()\n                    mavenLocal()\n                }\n            }\n        \"\"\"\n        )\n\n        File(tempDir, \"gradle.properties\").apply {\n            delete()\n            writeText(\n                \"\"\"\n                org.gradle.daemon=false\n                org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8\n            \"\"\".trimIndent()\n            )\n        }\n        mainSrcDir = tempDir.resolve(\"src/main/kotlin\").apply { mkdirs() }\n        commonMainSrcDir = tempDir.resolve(\"src/commonMain/kotlin\").apply { mkdirs() }\n        testDir = tempDir.resolve(\"src/test/kotlin\").apply { mkdirs() }\n\n        buildFile = tempDir.resolve(\"build.gradle.kts\")\n        buildFile.writeText(\n            \"\"\"\n            import org.jetbrains.kotlin.gradle.tasks.KotlinCompile\n            plugins {\n                kotlin(\"jvm\") version \"1.7.0\"\n            }\n            group = \"org.example\"\n            version = \"1.0-SNAPSHOT\"\n            repositories {\n                mavenCentral()\n                mavenLocal()\n            }\n            dependencies {\n                testImplementation(kotlin(\"test\"))\n                implementation(kotlin(\"reflect\"))\n                testImplementation(kotlin(\"test-junit5\"))\n                testImplementation(\"org.junit.jupiter:junit-jupiter-api:5.7.2\")\n                testRuntimeOnly(\"org.junit.jupiter:junit-jupiter-engine:5.7.2\")\n            }\n            tasks.test {\n                useJUnitPlatform()\n            }\n            tasks.withType<KotlinCompile> {\n                kotlinOptions.jvmTarget = \"1.8\"\n            }\n        \"\"\".trimIndent() + \"\\n\\n\"\n        )\n    }\n\n    @JvmField\n    @RegisterExtension\n    internal val after: AfterEachCallback = AfterEachCallback { context ->\n        if (context.executionException.isPresent) {\n            val inst = context.requiredTestInstance as AbstractTest\n            println(\"====================== build.gradle ===========================\")\n            println(inst.tempDir.resolveFirstExisting(\"build.gradle\", \"build.gradle.kts\").readTextIfFound())\n            println(\"==================== settings.gradle ==========================\")\n            println(inst.tempDir.resolveFirstExisting(\"settings.gradle\", \"settings.gradle.kts\").readTextIfFound())\n        }\n    }\n\n    private fun File.resolveFirstExisting(vararg files: String): File? {\n        return files.asSequence().map { resolve(it) }.firstOrNull { it.exists() }\n    }\n\n    private fun File?.readTextIfFound(): String =\n        when {\n            this == null -> \"(not found)\"\n            exists() -> readText()\n            else -> \"($name not found)\"\n        }\n}"
  },
  {
    "path": "mirai-deps-test/test/CoreDependencyResolutionTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.deps.test\n\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.condition.EnabledIf\n\nclass CoreDependencyResolutionTest : AbstractTest() {\n    private val testCode = \"\"\"\n                package test\n                @Suppress(\"INVISIBLE_MEMBER\", \"INVISIBLE_REFERENCE\", \"EXPERIMENTAL_API_USAGE\")\n                fun main () {\n                    println(net.mamoe.mirai.BotFactory)\n                    println(net.mamoe.mirai.Mirai)\n                    println(net.mamoe.mirai.internal.testHttpClient())\n                }\n            \"\"\".trimIndent()\n\n    @Test\n    @EnabledIf(\"isMiraiLocalAvailable\", disabledReason = REASON_LOCAL_ARTIFACT_NOT_AVAILABLE)\n    fun `test resolve JVM root from Kotlin JVM`() {\n        mainSrcDir.resolve(\"main.kt\").writeText(testCode)\n        buildFile.writeText(\n            \"\"\"\n            plugins {\n                id(\"org.jetbrains.kotlin.jvm\") version \"$kotlinVersion\"\n            }\n            repositories {\n                mavenCentral()\n                mavenLocal()\n            }\n            dependencies {\n                implementation(\"net.mamoe:mirai-core:$miraiLocalVersion\")\n            }\n            kotlin.sourceSets.all {\n                languageSettings.optIn(\"net.mamoe.mirai.utils.TestOnly\")\n            }\n        \"\"\".trimIndent()\n        )\n        runGradle(\"build\")\n    }\n\n    @Test\n    @EnabledIf(\"isMiraiLocalAvailable\", disabledReason = REASON_LOCAL_ARTIFACT_NOT_AVAILABLE)\n    fun `test resolve JVM from Kotlin JVM`() {\n        mainSrcDir.resolve(\"main.kt\").writeText(testCode)\n        buildFile.writeText(\n            \"\"\"\n            plugins {\n                id(\"org.jetbrains.kotlin.jvm\") version \"$kotlinVersion\"\n            }\n            repositories {\n                mavenCentral()\n                mavenLocal()\n            }\n            dependencies {\n                implementation(\"net.mamoe:mirai-core-jvm:$miraiLocalVersion\")\n            }\n            kotlin.sourceSets.all {\n                languageSettings.optIn(\"net.mamoe.mirai.utils.TestOnly\")\n            }\n        \"\"\".trimIndent()\n        )\n        runGradle(\"build\")\n    }\n\n    @Test\n    @EnabledIf(\"isMiraiLocalAvailable\", disabledReason = REASON_LOCAL_ARTIFACT_NOT_AVAILABLE)\n    fun `test resolve JVM and Native from common`() {\n        commonMainSrcDir.resolve(\"main.kt\").writeText(testCode)\n        buildFile.writeText(\n            \"\"\"\n            |import org.apache.tools.ant.taskdefs.condition.Os\n            |import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet\n            |\n            |plugins {\n            |    id(\"org.jetbrains.kotlin.multiplatform\") version \"$kotlinVersion\"\n            |}\n            |repositories {\n            |    mavenCentral()\n            |    mavenLocal()\n            |}\n            |kotlin {\n            |    targets {\n            |        jvm()\n            |    }\n            |    sourceSets {\n            |        val commonMain by getting {\n            |            dependencies {\n            |               api(\"net.mamoe:mirai-core:$miraiLocalVersion\")\n            |            }\n            |        }\n            |    }\n            |}\n            |kotlin.sourceSets.all {\n            |    languageSettings.optIn(\"net.mamoe.mirai.utils.TestOnly\")\n            |}\n        \"\"\".trimMargin()\n        )\n\n        runGradle(\"build\")\n    }\n}"
  },
  {
    "path": "mirai-deps-test/test/CoreShadowRelocationTest.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.deps.test\n\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.condition.EnabledIf\nimport kotlin.test.assertTrue\n\n/**\n * 为每个模块测试 relocated 的依赖是否存在于运行时\n */\nclass CoreShadowRelocationTest : AbstractTest() {\n    companion object {\n        private const val ByteBufferChannel = \"io.ktor.utils.io.ByteBufferChannel\"\n        private const val HttpClient = \"io.ktor.client.HttpClient\"\n        private const val KtorOkHttp = \"io.ktor.client.engine.okhttp.OkHttp\"\n        private const val OkHttp = \"okhttp3.OkHttp\"\n        private const val OkIO = \"okio.ByteString\"\n        private const val BigInteger = \"com.ionspin.kotlin.bignum.integer.BigInteger\"\n\n        fun relocated(string: String): String {\n            return \"net.mamoe.mirai.internal.deps.$string\"\n        }\n    }\n\n    @Test\n    @EnabledIf(\"isMiraiLocalAvailable\", disabledReason = REASON_LOCAL_ARTIFACT_NOT_AVAILABLE)\n    fun `test mirai-core-utils`() {\n        val fragment = buildTestCases {\n            +relocated(`ktor-io`)\n            -both(`ktor-client-core`)\n            -both(`ktor-client-okhttp`)\n            -both(`okhttp3-okhttp`)\n            -both(okio)\n            -both(`kt-bignum`)\n        }\n        applyCodeFragment(fragment)\n        buildFile.appendText(\n            \"\"\"\n            dependencies {\n                implementation(\"net.mamoe:mirai-core-utils:$miraiLocalVersion\")\n            }\n        \"\"\".trimIndent()\n        )\n        runGradle(\"check\")\n    }\n\n    @Test\n    @EnabledIf(\"isMiraiLocalAvailable\", disabledReason = REASON_LOCAL_ARTIFACT_NOT_AVAILABLE)\n    fun `test mirai-core-api with transitive mirai-core-utils`() {\n        val fragment = buildTestCases {\n            +relocated(`ktor-io`)\n            -both(`ktor-client-core`)\n            -both(`ktor-client-okhttp`)\n            -both(`okhttp3-okhttp`)\n            -both(okio)\n            -both(`kt-bignum`)\n            +relocated(`ExternalResource-input`)\n        }\n        applyCodeFragment(fragment)\n        buildFile.appendText(\n            \"\"\"\n            dependencies {\n                implementation(\"net.mamoe:mirai-core-api:$miraiLocalVersion\")\n            }\n        \"\"\".trimIndent()\n        )\n        runGradle(\"check\")\n    }\n\n    @Test\n    @EnabledIf(\"isMiraiLocalAvailable\", disabledReason = REASON_LOCAL_ARTIFACT_NOT_AVAILABLE)\n    fun `test mirai-core with transitive mirai-core-api and mirai-core-utils`() {\n        val fragment = buildTestCases {\n            +relocated(`ktor-io`)\n            +relocated(`ktor-client-core`)\n            +relocated(`ktor-client-okhttp`)\n            +relocated(`okhttp3-okhttp`)\n            +relocated(okio)\n            +relocated(`ExternalResource-input`)\n            +relocated(`kt-bignum`)\n        }\n        applyCodeFragment(fragment)\n        buildFile.appendText(\n            \"\"\"\n            dependencies {\n                implementation(\"net.mamoe:mirai-core:$miraiLocalVersion\")\n            }\n        \"\"\".trimIndent()\n        )\n        runGradle(\"check\")\n    }\n\n    // ktor-io is shadowed into runtime in mirai-core-utils. So without mirai-core-utils,\n    // we should expect no relocated ktor-io found, otherwise there will be duplicated classes on Android.\n    // https://github.com/mamoe/mirai/issues/2291\n    @Test\n    @EnabledIf(\"isMiraiLocalAvailable\", disabledReason = REASON_LOCAL_ARTIFACT_NOT_AVAILABLE)\n    fun `test mirai-core without transitive mirai-core-api and mirai-core-utils`() {\n        val fragment = buildTestCases {\n            -both(`ktor-io`)\n            +relocated(`ktor-client-core`)\n            +relocated(`ktor-client-okhttp`)\n            +relocated(`okhttp3-okhttp`)\n            +relocated(okio)\n            +relocated(`kt-bignum`)\n        }\n        applyCodeFragment(fragment)\n        buildFile.appendText(\n            \"\"\"\n            dependencies {\n                implementation(\"net.mamoe:mirai-core:$miraiLocalVersion\") {\n                    exclude(\"net.mamoe\", \"mirai-core-api-jvm\")\n                    exclude(\"net.mamoe\", \"mirai-core-utils-jvm\")\n                }\n            }\n        \"\"\".trimIndent()\n        )\n        runGradle(\"check\")\n    }\n\n    @Test\n    @EnabledIf(\"isMiraiLocalAvailable\", disabledReason = REASON_LOCAL_ARTIFACT_NOT_AVAILABLE)\n    fun `test mirai-core-api without transitive mirai-core-utils`() {\n        val fragment = buildTestCases {\n            -`mirai-core-utils`\n            -both(`ktor-io`)\n            -both(`ktor-client-core`)\n            -both(`ktor-client-okhttp`)\n            -both(`okhttp3-okhttp`)\n            -both(okio)\n            -both(`kt-bignum`)\n//            +relocated(`ExternalResource-input`) // Will fail with no class def found error because there is no runtime ktor-io\n        }\n        applyCodeFragment(fragment)\n        buildFile.appendText(\n            \"\"\"\n            dependencies {\n                implementation(\"net.mamoe:mirai-core-api:$miraiLocalVersion\") {\n                    exclude(\"net.mamoe\", \"mirai-core-utils-jvm\")\n                }\n            }\n        \"\"\".trimIndent()\n        )\n        runGradle(\"check\")\n    }\n\n    @Test\n    @EnabledIf(\"isMiraiLocalAvailable\", disabledReason = REASON_LOCAL_ARTIFACT_NOT_AVAILABLE)\n    fun `test mirai-core-all`() {\n        val fragment = buildTestCases {\n            +relocated(`ktor-io`)\n            +relocated(`ktor-client-core`)\n            +relocated(`ktor-client-okhttp`)\n            +relocated(`okhttp3-okhttp`)\n            +relocated(okio)\n            +relocated(`ExternalResource-input`)\n            +relocated(`kt-bignum`)\n        }\n        applyCodeFragment(fragment)\n\n        // mirai-core-all-2.99.0-deps-test-all.jar\n        val miraiCoreAllJar =\n            mavenLocalDir.resolve(\"net/mamoe/mirai-core-all/$miraiLocalVersion/mirai-core-all-$miraiLocalVersion-all.jar\")\n        val path = miraiCoreAllJar.absolutePath.replace(\"\\\\\", \"/\") // overcome string escape in source files.\n        assertTrue(\"'$path' does not exist\") { miraiCoreAllJar.exists() }\n\n        buildFile.appendText(\n            \"\"\"\n            dependencies {\n                implementation(fileTree(\"$path\"))\n            }\n        \"\"\".trimIndent()\n        )\n        runGradle(\"check\")\n    }\n\n\n    @Suppress(\"PropertyName\")\n    private class TestBuilder {\n        private val result = StringBuilder(\n            \"\"\"\n            package test\n            import org.junit.jupiter.api.*\n            import java.lang.reflect.Method\n            import kotlin.reflect.jvm.kotlinFunction\n            import kotlin.test.assertTrue\n            import kotlin.test.assertFalse\n            \n            private val Method.signature: String\n                get() = buildString {\n                    append(kotlinFunction?.toString())\n                    return@buildString\n                    append(kotlinFunction?.visibility?.name?.lowercase())\n                    append(kotlinFunction?.visibility?.name?.lowercase())\n                    append(' ')\n                    append(returnType.canonicalName)\n                    append(' ')\n                    append(name)\n                    append('(')\n                    for (parameter in parameters) {\n                        append(parameter.type.canonicalName)\n                        append(' ')\n                        append(parameter.name)\n                        append(\", \")\n                    }\n                    if (parameterCount != 0) {\n                        deleteAt(lastIndex)\n                        deleteAt(lastIndex)\n                    }\n                    append(')')\n                }\n\n            class MyTest {\n        \"\"\".trimIndent()\n        ).append(\"\\n\").append(\"\\n\")\n\n        class ClassTestCase(\n            val name: String,\n            val qualifiedClassName: String,\n        )\n\n        class FunctionTestCase(\n            val name: String,\n            val qualifiedClassName: String,\n            val signature: String,\n            val relocated: (FunctionTestCase.() -> FunctionTestCase)? = null,\n        )\n\n        val `mirai-core-utils` = ClassTestCase(\"mirai-core-utils Symbol\", \"net.mamoe.mirai.utils.Symbol\")\n        val `ktor-io` = ClassTestCase(\"ktor-io ByteBufferChannel\", ByteBufferChannel)\n        val `ktor-client-core` = ClassTestCase(\"ktor-client-core HttpClient\", HttpClient)\n        val `ktor-client-okhttp` = ClassTestCase(\"ktor-client-core OkHttp\", KtorOkHttp)\n        val `okhttp3-okhttp` = ClassTestCase(\"okhttp3 OkHttp\", OkHttp)\n        val okio = ClassTestCase(\"okio ByteString\", OkIO)\n        val `kt-bignum` = ClassTestCase(\"kt-bignum BigInteger\", BigInteger)\n        val `ExternalResource-input` =\n            FunctionTestCase(\n                \"ExternalResource_input\",\n                \"net.mamoe.mirai.utils.ExternalResource\",\n                \"fun net.mamoe.mirai.utils.ExternalResource.input(): io.ktor.utils.io.core.Input\"\n            ) original@{\n                FunctionTestCase(\n                    \"relocated ExternalResource_input\",\n                    \"net.mamoe.mirai.utils.ExternalResource\",\n                    \"fun net.mamoe.mirai.utils.ExternalResource.input(): ${relocated(\"io.ktor.utils.io.core.Input\")}\"\n                ) {\n                    this@original\n                }\n            }\n\n        class RelocatedClassTestCase(\n            val testCase: ClassTestCase\n        )\n\n        class BothClassTestCase(\n            val testCase: ClassTestCase\n        )\n\n\n        private fun appendHasClass(name: String, qualifiedClassName: String) {\n            result.append(\n                \"\"\"\n                      @Test\n                      fun `has ${name}`() {\n                        Class.forName(\"$qualifiedClassName\")\n                      }\n                    \"\"\".trimIndent()\n            ).append(\"\\n\")\n        }\n\n        fun appendClassHasMethod(name: String, qualifiedClassName: String, methodSignature: String) {\n            result.append(\n                \"\"\"\n                      @Test\n                      fun `has ${name}`() {\n                        val signatures = Class.forName(\"$qualifiedClassName\").declaredMethods.map { it.signature }\n                        assertTrue(\"All signatures: \" + signatures.joinToString(\"\\n\")) { signatures.any { it == \"$methodSignature\" } }\n                      }\n                    \"\"\".trimIndent()\n            ).append(\"\\n\")\n        }\n\n        fun appendClassMethodNotFound(name: String, qualifiedClassName: String, methodSignature: String) {\n            result.append(\n                \"\"\"\n                      @Test\n                      fun `has ${name}`() {\n                        val signatures = Class.forName(\"$qualifiedClassName\").declaredMethods.map { it.signature }\n                        assertFalse(\"All signatures: \" + signatures.joinToString(\"\\n\")) { signatures.any { it == \"$methodSignature\" } }\n                      }\n                    \"\"\".trimIndent()\n            ).append(\"\\n\")\n        }\n\n        private fun appendNotFound(name: String, qualifiedClassName: String) {\n            result.append(\n                \"\"\"\n                      @Test\n                      fun `no ${name}`() {\n                        assertThrows<ClassNotFoundException> { Class.forName(\"$qualifiedClassName\") }\n                      }\n                    \"\"\".trimIndent()\n            ).append(\"\\n\")\n        }\n\n\n        /**\n         * Asserts a class exists. Also asserts its relocated class does not exist.\n         */\n        operator fun FunctionTestCase.unaryPlus() {\n            appendClassHasMethod(name, qualifiedClassName, signature)\n            relocated?.invoke(this)?.let { inverted ->\n                appendClassMethodNotFound(inverted.name, inverted.qualifiedClassName, inverted.signature)\n            }\n        }\n\n        /**\n         * Asserts a class exists. Also asserts its relocated class does not exist.\n         */\n        operator fun ClassTestCase.unaryPlus() {\n            appendHasClass(name, qualifiedClassName)\n            appendNotFound(\"relocated $name\", Companion.relocated(qualifiedClassName))\n        }\n\n        /**\n         * Asserts a class does not exist.\n         */\n        operator fun ClassTestCase.unaryMinus() {\n            appendNotFound(name, qualifiedClassName)\n        }\n\n\n        /**\n         * Asserts a relocated class exists. Also asserts the original class does not exist.\n         */\n        operator fun RelocatedClassTestCase.unaryPlus() {\n            this.testCase.run {\n                appendHasClass(\"relocated $name\", Companion.relocated(qualifiedClassName))\n                appendNotFound(name, qualifiedClassName)\n            }\n        }\n\n        /**\n         * Asserts a relocated class does not exist.\n         */\n        operator fun RelocatedClassTestCase.unaryMinus() {\n            this.testCase.run {\n                appendNotFound(\"relocated $name\", Companion.relocated(qualifiedClassName))\n            }\n        }\n\n        /**\n         * Asserts both the class and its relocated one do not exist.\n         */\n        operator fun BothClassTestCase.unaryMinus() {\n            -this.testCase\n            -relocated(this.testCase)\n        }\n\n        fun relocated(testCase: ClassTestCase): RelocatedClassTestCase = RelocatedClassTestCase(testCase)\n        fun relocated(testCase: FunctionTestCase): FunctionTestCase = testCase.relocated!!(testCase)\n        fun both(testCase: ClassTestCase) = BothClassTestCase(testCase)\n\n        fun build(): String = result.append(\"\\n}\\n\").toString()\n    }\n\n    private inline fun buildTestCases(action: TestBuilder.() -> Unit): String {\n        return TestBuilder().apply(action).build()\n    }\n\n\n    private fun applyCodeFragment(fragment: String) {\n        println(\"Applying code fragment: \\n\\n$fragment\\n\\n\\n===========End of Fragment===========\")\n        testDir.resolve(\"test.kt\").writeText(fragment)\n    }\n}"
  },
  {
    "path": "mirai-deps-test/test/package.kt",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.deps.test"
  },
  {
    "path": "mirai-dokka/.gitignore",
    "content": "/pages\n"
  },
  {
    "path": "mirai-dokka/README.md",
    "content": "# mirai-dokka\n\n生成的文档会部署到 [project-mirai/mirai-doc](https://github.com/project-mirai/mirai-doc), 网页部署在 https://kdoc.mirai.mamoe.net/\n"
  },
  {
    "path": "mirai-dokka/build.gradle.kts",
    "content": "/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nplugins {\n    kotlin(\"jvm\")\n    kotlin(\"plugin.serialization\")\n    id(\"java\")\n    `maven-publish`\n}\n\ndependencies {\n    implementation(`kotlinx-serialization-core`)\n    implementation(`kotlinx-serialization-json`)\n}\n\nfun Project.newExec(name: String, type: String, conf: JavaExec.() -> Unit) {\n    tasks.create(name, JavaExec::class.java) {\n        this.classpath = sourceSets[\"main\"].runtimeClasspath\n        this.mainClass.set(\"net.mamoe.mirai.dokka.${type}Kt\")\n        this.workingDir(rootProject.projectDir)\n        this.environment(\"mirai_ver\", rootProject.version.toString())\n        conf()\n    }\n}\n\nnewExec(\"prepare\", \"Prepare\") {\n}\n\nnewExec(\"deployPages\", \"DeployToGitHub\") {\n}\n\nnewExec(\"update-vers\", \"BuildVersionList\") {\n}\n\n\n"
  },
  {
    "path": "mirai-dokka/frontend/ext.js",
    "content": "// noinspection ES6ConvertVarToLetConst,JSUnresolvedVariable\n\n/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\n\n\n(function () {\n    fetch(window.pathToRoot + \"../versions.json\").then(function (it) {\n        return it.json()\n    }).then(function (rsp) {\n        console.log(rsp);\n        var dir = document.getElementById(\"searchBar\").parentElement;\n        var select = document.createElement(\"select\");\n        dir.insertBefore(select, dir.firstElementChild);\n        select.appendChild(document.createElement(\"option\")).textContent = \"other version\";\n        var toLatest = select.appendChild(document.createElement(\"option\"));\n        toLatest.textContent = \"latest\";\n        toLatest.value = \"\";\n        for (var v of rsp) {\n            var c = select.appendChild(document.createElement(\"option\"));\n            c.textContent = v;\n            c.value = v;\n        }\n        select.addEventListener(\"change\", function (event) {\n            location.href = window.pathToRoot + \"../\" + c.value\n        })\n    }).catch(function (error) {\n        console.log(error);\n    })\n})()\n"
  },
  {
    "path": "mirai-dokka/src/BuildVersionList.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.dokka\n\nimport kotlinx.serialization.builtins.ListSerializer\nimport kotlinx.serialization.builtins.serializer\n\n\nfun main() {\n    val currentVersion = System.getenv(\"mirai_ver\") ?: error(\"version not found\")\n\n    val versions = pages.resolve(\"versions.json\")\n\n    json.decodeFromString(ListSerializer(String.serializer()), versions.readText()).toMutableList().let { list ->\n        if (currentVersion in list) return@let\n        list.add(currentVersion)\n        versions.writeText(json.encodeToString(ListSerializer(String.serializer()), list))\n    }\n\n    pages.resolve(\"snapshot\").renameTo(pages.resolve(currentVersion))\n}\n"
  },
  {
    "path": "mirai-dokka/src/DeployToGitHub.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.dokka\n\nfun main() {\n    val token = System.getenv(\"gh_token\") ?: error(\"Token not found\")\n    val currentVersion = System.getenv(\"mirai_ver\") ?: error(\"version not found\")\n\n    repoexec(\"git\", \"config\", \"--local\", \"http.https://github.com/.extraheader\", \"\")\n    runCatching {\n        repoexec(\"git\", \"remote\", \"remove\", \"token\")\n    }\n    repoexec(\n        \"git\", \"remote\", \"add\", \"token\",\n        \"https://x-access-token:$token@github.com/project-mirai/mirai-doc.git\"\n    )\n\n    repoexec(\"git\", \"config\", \"--local\", \"user.email\", \"mamoebot@users.noreply.github.com\")\n    repoexec(\"git\", \"config\", \"--local\", \"user.name\", \"mamoebot\")\n    repoexec(\"git\", \"add\", \"-A\")\n    repoexec(\n        \"git\", \"commit\", \"-m\", currentVersion,\n        nooutput = true,\n    )\n    repoexec(\"git\", \"push\", \"token\", \"HEAD:master\")\n}\n"
  },
  {
    "path": "mirai-dokka/src/Prepare.kt",
    "content": "/*\n * Copyright 2019-2021 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.dokka\n\nfun main() {\n    if (pages.resolve(\".git\").isDirectory) {\n        return\n    }\n    exec(\"git\", \"clone\", \"https://github.com/project-mirai/mirai-doc.git\", pages.absolutePath)\n}\n"
  },
  {
    "path": "mirai-dokka/src/system.kt",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npackage net.mamoe.mirai.dokka\n\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.json.Json\nimport java.io.File\n\nval pages = File(\"mirai-dokka/pages\")\n\n@OptIn(ExperimentalSerializationApi::class)\nval json = Json {\n    prettyPrint = true\n    prettyPrintIndent = \"  \"\n}\n\nprivate val FileDevNull = File(\n    if (System.getProperty(\"os.name\")\n            .startsWith(\"Windows\")\n    ) \"NUL\" else \"/dev/null\"\n)\n\nfun system(cmd: String) {\n    val rsp = ProcessBuilder(cmd).inheritIO().start().waitFor()\n    if (rsp != 0) error(\"Exec return $rsp, $cmd\")\n}\n\nfun exec(vararg cmd: String) {\n    val rsp = ProcessBuilder(*cmd).inheritIO().start().waitFor()\n    if (rsp != 0) error(\"Exec return $rsp, ${cmd.joinToString(\" \")}\")\n}\n\nfun repoexec(\n    vararg cmd: String,\n    nooutput: Boolean = false,\n) {\n    val rsp = ProcessBuilder(*cmd)\n        .inheritIO()\n        .directory(pages)\n        .also { builder ->\n            if (nooutput) {\n                builder.redirectOutput(ProcessBuilder.Redirect.to(FileDevNull))\n            }\n        }\n        .start()\n        .waitFor()\n    if (rsp != 0) error(\"Exec return $rsp, ${cmd.joinToString(\" \")}\")\n}\n"
  },
  {
    "path": "settings.gradle.kts",
    "content": "/*\n * Copyright 2019-2023 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\nimport java.util.*\n\n/*\n * Copyright 2019-2022 Mamoe Technologies and contributors.\n *\n * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.\n * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.\n *\n * https://github.com/mamoe/mirai/blob/dev/LICENSE\n */\n\npluginManagement {\n    repositories {\n        if (System.getProperty(\"use.maven.local\") == \"true\") { // you can enable by adding `systemProp.use.maven.local=true` in 'gradle.properties'.\n            mavenLocal()\n        }\n        gradlePluginPortal()\n        mavenCentral()\n        google()\n    }\n}\n\nplugins {\n    id(\"org.gradle.toolchains.foojay-resolver-convention\") version \"0.4.0\"\n}\n\nrootProject.name = \"mirai\"\n\nrunCatching { rootProject.projectDir.resolve(\"local.properties\").let { if (!it.exists()) it.createNewFile() } }\n\nval localProperties = Properties().apply {\n    rootProject.projectDir.resolve(\"local.properties\").takeIf { it.exists() }?.bufferedReader()?.use {\n        load(it)\n    }\n}\n\n\n/**\n * Projects included so far\n */\nval allProjects = mutableListOf<ProjectDescriptor>()\n\nfun includeProject(projectPath: String, dir: String? = null) {\n    if (!getLocalProperty(\"projects.\" + projectPath.removePrefix(\":\") + \".enabled\", true)) return\n    include(projectPath)\n    if (dir != null) project(projectPath).projectDir = file(dir)\n    allProjects.add(project(projectPath))\n}\n\nfun includeConsoleProject(projectPath: String, dir: String? = null) =\n    includeProject(projectPath, \"mirai-console/$dir\")\n\n\nincludeProject(\":mirai-core-utils\")\nincludeProject(\":mirai-core-api\")\nincludeProject(\":mirai-core\")\nincludeProject(\":mirai-core-mock\")\n\nincludeProject(\":mirai-core-all\")\nincludeProject(\":mirai-bom\")\nincludeProject(\":mirai-dokka\")\nincludeProject(\":mirai-deps-test\")\n\nif (getLocalProperty(\"projects.mirai-logging.enabled\", true)) {\n    includeProject(\":mirai-logging-log4j2\", \"logging/mirai-logging-log4j2\")\n    includeProject(\":mirai-logging-slf4j\", \"logging/mirai-logging-slf4j\")\n    includeProject(\":mirai-logging-slf4j-simple\", \"logging/mirai-logging-slf4j-simple\")\n    includeProject(\":mirai-logging-slf4j-logback\", \"logging/mirai-logging-slf4j-logback\")\n}\n\n// mirai-core-api depends on this\nincludeConsoleProject(\":mirai-console-compiler-annotations\", \"tools/compiler-annotations\")\n\nif (getLocalProperty(\"projects.mirai-console.enabled\", true)) {\n    includeConsoleProject(\":mirai-console\", \"backend/mirai-console\")\n    includeConsoleProject(\":mirai-console.codegen\", \"backend/codegen\")\n    includeConsoleProject(\":mirai-console-frontend-base\", \"frontend/mirai-console-frontend-base\")\n    includeConsoleProject(\":mirai-console-terminal\", \"frontend/mirai-console-terminal\")\n    includeConsoleIntegrationTestProjects()\n\n    includeConsoleProject(\":mirai-console-compiler-common\", \"tools/compiler-common\")\n    includeConsoleProject(\":mirai-console-intellij\", \"tools/intellij-plugin\")\n    includeConsoleProject(\":mirai-console-gradle\", \"tools/gradle-plugin\")\n} else {\n    // if mirai-console is disabled, disable all relevant projects\n}\n\n\n//includeConsoleFrontendGraphical()\n\nincludeProject(\":ci-release-helper\")\n\nincludeBinaryCompatibilityValidatorProjects()\n\n/**\n * Configures a project `:validator:path-to-project:target-name` for binary compatibility validation.\n *\n * To enable validation for a project,\n * create a subdirectory with name of the target under \"compatibility-validation\",\n * then sync **twice**. See `:mirai-core-api` for an example.\n *\n * **Note**: This function depends on [allProjects], and should be used at the end.\n */\nfun includeBinaryCompatibilityValidatorProjects() {\n    val result = mutableListOf<ProjectDescriptor>()\n    for (project in allProjects) {\n        val validationDir = project.projectDir.resolve(\"compatibility-validation\")\n        if (!validationDir.exists()) continue\n        validationDir.listFiles().orEmpty<File>().forEach { dir ->\n            if (dir.resolve(\"build.gradle.kts\").isFile) {\n                // Also change: BinaryCompatibilityConfigurator.getValidatorDir\n                val path = \":validator\" + project.path + \"-validator:${dir.name}\"\n                include(path)\n                project(path).projectDir = dir\n//            project(path).name = \"${project.name}-validator-${dir.name}\"\n                result.add(project(path))\n            }\n        }\n    }\n}\n\nfun includeConsoleLegacyFrontendProjects() {\n    println(\"JDK version: ${JavaVersion.current()}\")\n\n    if (JavaVersion.current() >= JavaVersion.VERSION_1_9) {\n        includeConsoleProject(\":mirai-console-graphical\", \"frontend/mirai-console-graphical\")\n    } else {\n        println(\"当前使用的 JDK 版本为 ${System.getProperty(\"java.version\")},  请使用 JDK 9 以上版本引入模块 `:mirai-console-graphical`\\n\")\n    }\n}\n\nfun includeConsoleIntegrationTestProjects() {\n    includeConsoleProject(\":mirai-console.integration-test\", \"backend/integration-test\")\n\n    val consoleIntegrationTestSubPluginBuildGradleKtsTemplate by lazy {\n        rootProject.projectDir\n            .resolve(\"mirai-console/backend/integration-test/testers\")\n            .resolve(\"tester.template.gradle.kts\")\n            .readText()\n    }\n\n    @Suppress(\"SimpleRedundantLet\")\n    fun includeConsoleITPlugin(prefix: String, path: File) {\n        path.resolve(\"build.gradle.kts\").takeIf { !it.isFile }?.let { initScript ->\n            initScript.writeText(consoleIntegrationTestSubPluginBuildGradleKtsTemplate)\n        }\n\n        val projectPath = \"$prefix${path.name}\"\n        include(projectPath)\n        project(projectPath).projectDir = path\n        path.listFiles()?.asSequence().orEmpty()\n            .filter { it.isDirectory }\n            .filter { it.resolve(\".nested-module.txt\").exists() }\n            .forEach { includeConsoleITPlugin(\"${projectPath}:\", it) }\n    }\n\n    rootProject.projectDir\n        .resolve(\"mirai-console/backend/integration-test/testers\")\n        .listFiles()?.asSequence().orEmpty()\n        .filter { it.isDirectory }\n        .forEach { includeConsoleITPlugin(\":mirai-console.integration-test:\", it) }\n}\n\n\nfun getLocalProperty(name: String): String? {\n    return localProperties.getProperty(name)\n}\n\nfun getLocalProperty(name: String, default: String): String {\n    return localProperties.getProperty(name) ?: default\n}\n\nfun getLocalProperty(name: String, default: Int): Int {\n    return localProperties.getProperty(name)?.toInt() ?: default\n}\n\nfun getLocalProperty(name: String, default: Boolean): Boolean {\n    return localProperties.getProperty(name)?.toBoolean() ?: default\n}"
  }
]